ZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL0NPTU1JTkYuSCBiL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL0NPTU1JTkYuSApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGI3NTQwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvQ09NTUlORi5ICkBAIC0wLDAgKzEsNjQxIEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpZm5kZWYgQ09NTUlORl9ICisjZGVmaW5lIENPTU1JTkZfSAorCisjaW5jbHVkZSAiU1dGVU5DLkgiCisKKyNpZiBkZWZpbmVkKExpbnV4QVApCisjZW5kaWYKKyNpZmRlZiBTTFRfVUJPT1QKKyNlbmRpZgorI2lmZGVmIFNMVF9ET1MKKyAgI2luY2x1ZGUgPHN0ZGlvLmg+CisgICNpbmNsdWRlIDx0aW1lLmg+CisgICNpbmNsdWRlIDxkb3MuaD4gICAgLy8gRm9yIGRlbGF5KCkKKyNlbmRpZgorCisjaW5jbHVkZSAiVFlQRURFRi5IIgorI2luY2x1ZGUgIkxJQi5IIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHJpbnQgTWVzc2FnZSAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmb3IgZnVuY3Rpb24KKyNkZWZpbmUgRlBfTE9HICAgIDAKKyNkZWZpbmUgRlBfSU8gICAgIDEgICAgCisjZGVmaW5lIFNURF9PVVQgICAyICAgIAorICAgIAorI2lmZGVmIFNMVF9VQk9PVAorICAgICNkZWZpbmUgUFJJTlQgICAgIHByaW50ZgorICAgICNkZWZpbmUgT1VUX09CSiAgIAorICAgICNkZWZpbmUgRklMRV9WQVIgIAorCisgICAgI2RlZmluZSBHRVRfT0JKKCBpICkgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCBpICE9IFNURF9PVVQgKSBcCisgICAgICAgICAgICByZXR1cm47ICAgICAgICAgXAorICAgIH0gd2hpbGUgKCAwICk7CisgICAgICAgICAgICAKKyNlbHNlCisgICAgI2RlZmluZSBQUklOVCAgICAgZnByaW50ZgorICAgICNkZWZpbmUgT1VUX09CSiAgIGZwLCAgICAKKyAgICAjZGVmaW5lIEZJTEVfVkFSICBGSUxFICpmcDsKKyAgICAKKyAgICAjZGVmaW5lIEdFVF9PQkooIGkgKSAgICAgXAorICAgICAgICBzd2l0Y2goIGkgKSB7ICAgICAgICBcCisgICAgICAgICAgICBjYXNlIEZQX0xPRzogICAgIFwKKyAgICAgICAgICAgICAgICBmcCA9IGZwX2xvZzsgXAorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICBcCisgICAgICAgICAgICBjYXNlIEZQX0lPOiAgICAgIFwKKyAgICAgICAgICAgICAgICBmcCA9IGZwX2lvOyAgXAorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICBcCisgICAgICAgICAgICBjYXNlIFNURF9PVVQ6ICAgIFwKKyAgICAgICAgICAgICAgICBmcCA9IHN0ZG91dDsgXAorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICBcCisgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7IFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb24KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgU0xUX1VCT09UCisgICAgI2RlZmluZSBERUxBWSggeCApICB1ZGVsYXkoIHggKiAxMDAwICkgLy8gRm9yIFVib290LCB0aGUgdW5pdCBvZiB1ZGVsYXkoKSBpcyB1cy4KKyAgICAjZGVmaW5lIEdFVF9DQUhSICAgIGdldGMKKyNlbmRpZgorI2lmZGVmIFNMVF9ET1MKKyAgICAjZGVmaW5lIERFTEFZKCB4ICkgIGRlbGF5KCB4ICkgICAgICAgICAvLyBGb3IgRE9TLCB0aGUgdW5pdCBvZiBkZWxheSgpIGlzIG1zLgorICAgICNkZWZpbmUgR0VUX0NBSFIgICAgZ2V0Y2hhcgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWZhdWx0IGFyZ3VtZW50CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSAgREVGX1VTRVJfREVGX1BBQ0tFVF9WQUwgICAgICAweDY2NjY2NjY2ICAgICAvLzB4ZmYwMGZmMDAsIDB4ZjBmMGYwZjAsIDB4Y2NjY2NjY2MsIDB4NTVhYTU1YWEsIDB4NWE1YTVhNWEsIDB4NjY2NjY2NjYKKyNkZWZpbmUgIERFRl9JT1RJTUlOR0JVTkQgICAgICAgICAgICAgNSAgICAgICAgICAgICAgLy8wLzEvMy81LzcKKyNkZWZpbmUgIERFRl9QSFlfQURSICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSAgREVGX1RFU1RNT0RFICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAvL1swXTA6IG5vIGJ1cnN0IG1vZGUsIDE6IDB4ZmYsIDI6IDB4NTUsIDM6IHJhbmRvbSwgNDogQVJQLCA1OiBBUlAsIDY6IElPIHRpbWluZywgNzogSU8gdGltaW5nK0lPIFN0cmVuZ3RoCisjZGVmaW5lICBERUZfTE9PUF9NQVggICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgIERFRl9NQUNfTE9PUF9CQUNLICAgICAgICAgICAgMCAgICAgICAgICAgICAgLy9HQ3RybCBiaXQ2CisjZGVmaW5lICBERUZfU0tJUF9DSEVDS19QSFkgICAgICAgICAgIDAgICAgICAgICAgICAgIC8vR0N0cmwgYml0NAorI2RlZmluZSAgREVGX0lOSVRfUEhZICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAvL0dDdHJsIGJpdDMKKworI2RlZmluZSAgU0VUXzFHQlBTICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAvLyAxRyBicHMKKyNkZWZpbmUgIFNFVF8xMDBNQlBTICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgLy8gMTAwTSBicHMKKyNkZWZpbmUgIFNFVF8xME1CUFMgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgLy8gMTBNIGJwcworI2RlZmluZSAgU0VUXzFHXzEwME1fMTBNQlBTICAgICAgICAgICAzICAgICAgICAgICAgICAvLyAxRyBhbmQgMTAwTSBhbmQgMTBNIGJwcworI2RlZmluZSAgREVGX1NQRUVEICAgICAgICAgICAgICAgICAgICBTRVRfMUdfMTAwTV8xME1CUFMgCisjZGVmaW5lICBERUZfQVJQTlVNQ05UICAgICAgICAgICAgICAgIDAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1BQyBpbmZvcm1hdGlvbgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiAoIEFTVDEwMTBfSU9NQVAgPT0gMSApCisgIC8vIEFTVDEwMTAgb25seSBoYXMgYSBNQUMKKyAgI2RlZmluZSBNQUNfQkFTRTEgICAgICAgICAgICAgICBBU1RfTUFDMV9CQVNFCisgICNkZWZpbmUgTUFDX0JBU0UyICAgICAgICAgICAgICAgQVNUX01BQzFfQkFTRQorICAjZGVmaW5lIE1BQ19CQVNFMyAgICAgICAgICAgICAgIEFTVF9NQUMxX0JBU0UKKyAgI2RlZmluZSBNQUNfQkFTRTQgICAgICAgICAgICAgICBBU1RfTUFDMV9CQVNFCisjZW5kaWYKKworI2lmICggQVNUMTAxMF9JT01BUCA9PSAyICkKKyAgLy8gQVNUMTAxMCBvbmx5IGhhcyBhIE1BQworICAjZGVmaW5lIE1BQ19CQVNFMSAgICAgICAgICAgICAgIDB4MDgzMDAwMAorICAjZGVmaW5lIE1BQ19CQVNFMiAgICAgICAgICAgICAgIDB4MDgzMDAwMAorICAjZGVmaW5lIE1BQ19CQVNFMyAgICAgICAgICAgICAgIDB4MDgzMDAwMAorICAjZGVmaW5lIE1BQ19CQVNFNCAgICAgICAgICAgICAgIDB4MDgzMDAwMAorI2VuZGlmCisKKyNpZm5kZWYgQVNUMTAxMF9JT01BUAorICAjZGVmaW5lIE1BQ19CQVNFMSAgICAgICAgICAgICAgIDB4MWU2NjAwMDAKKyAgI2RlZmluZSBNQUNfQkFTRTIgICAgICAgICAgICAgICAweDFlNjgwMDAwCisgICNkZWZpbmUgTUFDX0JBU0UzICAgICAgICAgICAgICAgMHgxZTY3MDAwMAorICAjZGVmaW5lIE1BQ19CQVNFNCAgICAgICAgICAgICAgIDB4MWU2OTAwMDAKKyNlbmRpZgorCisjZGVmaW5lIE1EQ19UaHJlcyAgICAgICAgICAgICAgICAgMHgzZgorI2RlZmluZSBNQUNfUEhZV3IgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgTUFDX1BIWVJkICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCisKKyNkZWZpbmUgTUFDX1BIWVdyX05ldyAgICAgICAgICAgICAweDAwMDA5NDAwCisjZGVmaW5lIE1BQ19QSFlSZF9OZXcgICAgICAgICAgICAgMHgwMDAwOTgwMAorI2RlZmluZSBNQUNfUEhZQnVzeV9OZXcgICAgICAgICAgIDB4MDAwMDgwMDAKKworLy8jZGVmaW5lIE1BQ18zMGggICAgICAgICAgICAgICAgICAgMHgwMDAwMTAxMAorLy8jZGVmaW5lIE1BQ18zNGggICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorLy8jZGVmaW5lIE1BQ18zOGggICAgICAgICAgICAgICAgICAgMHgwMGQyMmYwMCAvL2RlZmF1bHQgMHgyMmYwMAorLy8jZGVmaW5lIE1BQ18zOGggICAgICAgICAgICAgICAgICAgMHgwMDAyMmYwMCAvL2RlZmF1bHQgMHgyMmYwMAorCisjZGVmaW5lIE1BQ180MGggICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorCisjaWZkZWYgRW5hYmxlX0J1Zk1lcmdlCisgICAgI2RlZmluZSBNQUNfNDhoICAgICAgICAgICAgICAgMHgwMDc3MDJGMSAvL2RlZmF1bHQgMHhmMQorI2Vsc2UKKyAgI2lmZGVmIEFTVDEwMTBfSU9NQVAKKyAgICAjZGVmaW5lIE1BQ180OGggICAgICAgICAgICAgICAweDAwMDAwMkYxIC8vZGVmYXVsdCAweGYxCisgICNlbHNlCisgICAgI2RlZmluZSBNQUNfNDhoICAgICAgICAgICAgICAgMHgwMDAwMDFGMSAvL2RlZmF1bHQgMHhmMQorICAjZW5kaWYKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGF0YSBpbmZvcm1hdGlvbgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBTZWxlY3RTaW1wbGVCb3VuZGFyeQorICAjZGVmaW5lIFplcm9Db3B5X09GRlNFVCAgICAgICAwCisjZWxzZQorICAjZGVmaW5lIFplcm9Db3B5X09GRlNFVCAgICAgICAoIChCdXJzdEVuYWJsZSkgPyAwIDogMiApCisjZW5kaWYKKworLy8gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRFJBTV9NYXBBZHIgICAgICAgICAgICA9IFRERVNfQkFTRTEKKy8vICAgICAgICAgICAgICB8IFRYIGRlc2NyaXB0b3IgcmluZyAjMSB8CisvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEUkFNX01hcEFkciArIDB4MDQwMDAwID0gUkRFU19CQVNFMQorLy8gICAgICAgICAgICAgIHwgUlggZGVzY3JpcHRvciByaW5nICMxIHwKKy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERSQU1fTWFwQWRyICsgMHgwODAwMDAgPSBUREVTX0JBU0UyCisvLyAgICAgICAgICAgICAgfCBUWCBkZXNjcmlwdG9yIHJpbmcgIzIgfAorLy8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRFJBTV9NYXBBZHIgKyAweDBDMDAwMCA9IFJERVNfQkFTRTIKKy8vICAgICAgICAgICAgICB8IFJYIGRlc2NyaXB0b3IgcmluZyAjMiB8CisvLyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEUkFNX01hcEFkciArIDB4MTAwMDAwID0gRE1BX0JBU0UgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgIHwgICAjMSAgICAgICAgICAgICAgICAgIHwgIFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICMxICAgICBUeCAgICAgICAgIHwKKy8vICBETUEgYnVmZmVyICB8ICAgICAgICAgICAgICAgICAgICAgICB8ICAgRE1BX0J1ZlNpemUgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgTE9PUCA9IDAgICAgICAgICB8CisvLyAoIFR4L1J4ICkgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICB8ICAgIzIgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAjMiAgICAgUnggICAgICAgICB8ICAjMiAgICAgVHggICAgICAgICAgICAgfAorLy8gICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICBMT09QID0gMCAgICAgICAgIHwgICBMT09QID0gMSAgICAgICAgICAgICB8CisvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICB8ICAgIzMgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAjMyAgICAgUnggICAgICAgICAgICAgfAorLy8gICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBMT09QID0gMSAgICAgICAgICAgICB8CisvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgIHwgICAjNCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uLi4uLi4uLgorLy8gICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICAgICAgICAgfCAgICM1ICAgICAgICAgICAgICAgICAgfCAKKy8vICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8IAorLy8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisvLyAgICAgICAgICAgICAgfCAgICM2ICAgICAgICAgICAgICAgICAgfAorLy8gICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgIAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAKKy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICAgICAgICAgfCAgICNuLCBuID0gRE1BX0J1Zk51bSAgfAorLy8gICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCisjaWYgKCBBU1QxMDEwX0lPTUFQID09IDEgKQorICAgICNkZWZpbmUgRFJBTV9NYXBBZHIgICAgICAgICAgICAgICAgICggQ09ORklHX0RSQU1fU1dBUF9CQVNFICsgMHgwMDIwMDAwMCApIC8vIFdlIHVzZSAweEEwMDAwMCB0byAweEVGRkZGRgorICAgICNkZWZpbmUgQ1BVX0JVU19BRERSX1NEUkFNX09GRlNFVCAgIDB4MDEwMDAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIFJlTWFwcGluZyBmdW5jdGlvbiwgTUFDIGVuZ2luZSBuZWVkIEJ1cyBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnV0IENvbGRmaXJlIG5lZWQgQ1BVIGFkZHJlc3MsIHNvIG5lZWQgdG8gZG8gb2Zmc2V0CisjZW5kaWYKKworI2lmICggQVNUMTAxMF9JT01BUCA9PSAyICkKKyAgICAjZGVmaW5lIERSQU1fTWFwQWRyICAgICAgICAgICAgICAgICAweDBBMDAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSB1c2UgMHhBMDAwMDAgdG8gMHhFRkZGRkYKKyAgICAjZGVmaW5lIENQVV9CVVNfQUREUl9TRFJBTV9PRkZTRVQgICAwCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNpZm5kZWYgQVNUMTAxMF9JT01BUAorICAjaWZkZWYgQVNUMzIwMF9JT01BUAorICAgICNkZWZpbmUgRFJBTV9NYXBBZHIgICAgICAgICAgIDB4ODAwMDAwMDAKKyAgI2Vsc2UKKyAgICAjZGVmaW5lIERSQU1fTWFwQWRyICAgICAgICAgICAweDQ0MDAwMDAwICAgCisgICNlbmRpZgorICAKKyAgI2RlZmluZSAgIENQVV9CVVNfQUREUl9TRFJBTV9PRkZTRVQgICAwCisjZW5kaWYgIAorCisgICNkZWZpbmUgVERFU19CQVNFMSAgICAgICAgICAgICAgKCAweDAwMDAwMDAwICsgRFJBTV9NYXBBZHIgICApCisgICNkZWZpbmUgUkRFU19CQVNFMSAgICAgICAgICAgICAgKCAweDAwMDQwMDAwICsgRFJBTV9NYXBBZHIgICApCisgICNkZWZpbmUgVERFU19CQVNFMiAgICAgICAgICAgICAgKCAweDAwMDgwMDAwICsgRFJBTV9NYXBBZHIgICApCisgICNkZWZpbmUgUkRFU19CQVNFMiAgICAgICAgICAgICAgKCAweDAwMEMwMDAwICsgRFJBTV9NYXBBZHIgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAjZGVmaW5lIFRERVNfSW5pVmFsICAgICAgICAgICAgICggMHhiMDAwMDAwMCArIEZSQU1FX0xFTl9DdXIgKQorICAjZGVmaW5lIFJERVNfSW5pVmFsICAgICAgICAgICAgICggMHgwMDAwMGZmZiApCisgICNkZWZpbmUgRU9SX0luaVZhbCAgICAgICAgICAgICAgKCAweDQwMDA4MDAwICkKKyAgI2RlZmluZSBIV093blR4KGRhdCkgICAgICAgICAgICAoICAgKGRhdCkgJiAweDgwMDAwMDAwICApCisgICNkZWZpbmUgSFdPd25SeChkYXQpICAgICAgICAgICAgKCAhKChkYXQpICYgMHg4MDAwMDAwMCkgKQorICAjZGVmaW5lIEhXRU9SKGRhdCkgICAgICAgICAgICAgICggICAgZGF0ICAmIDB4NDAwMDAwMDAgICkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVycm9yIEZsYWcgQml0cworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRXJyX01BQ01vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAxIDw8ICAwICkgICAvLyBNQUMgaW50ZXJmYWNlIG1vZGUgbWlzbWF0Y2gKKyNkZWZpbmUgRXJyX1BIWV9UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAxIDw8ICAxICkgICAvLyBVbmlkZW50aWZpYWJsZSBQSFkKKyNkZWZpbmUgRXJyX01BTExPQ19Gcm1TaXplICAgICAgICAgICAgICAgICAgICAgKCAxIDw8ICAyICkgICAvLyBNYWxsb2MgZmFpbCBhdCBmcmFtZSBzaXplIGJ1ZmZlcgorI2RlZmluZSBFcnJfTUFMTE9DX0xhc3RXUCAgICAgICAgICAgICAgICAgICAgICAoIDEgPDwgIDMgKSAgIC8vIE1hbGxvYyBmYWlsIGF0IGxhc3QgV1AgYnVmZmVyCisjZGVmaW5lIEVycl9DaGVja19CdWZfRGF0YSAgICAgICAgICAgICAgICAgICAgICggMSA8PCAgNCApICAgLy8gUmVjZWl2ZWQgZGF0YSBtaXNtYXRjaAorI2RlZmluZSBFcnJfQ2hlY2tfRGVzICAgICAgICAgICAgICAgICAgICAgICAgICAoIDEgPDwgIDUgKSAgIC8vIERlc2NyaXB0b3IgZXJyb3IKKyNkZWZpbmUgRXJyX05DU0lfTGlua0ZhaWwgICAgICAgICAgICAgICAgICAgICAgKCAxIDw8ICA2ICkgICAvLyBOQ1NJIHBhY2tldCByZXRyeSBudW1iZXIgb3ZlciBmbG93cworI2RlZmluZSBFcnJfTkNTSV9DaGVja19UeE93blRpbWVPdXQgICAgICAgICAgICAoIDEgPDwgIDcgKSAgIC8vIFRpbWUgb3V0IG9mIGNoZWNraW5nIFR4IG93bmVyIGJpdCBpbiBOQ1NJIHBhY2tldAorI2RlZmluZSBFcnJfTkNTSV9DaGVja19SeE93blRpbWVPdXQgICAgICAgICAgICAoIDEgPDwgIDggKSAgIC8vIFRpbWUgb3V0IG9mIGNoZWNraW5nIFJ4IG93bmVyIGJpdCBpbiBOQ1NJIHBhY2tldAorI2RlZmluZSBFcnJfTkNTSV9DaGVja19BUlBPd25UaW1lT3V0ICAgICAgICAgICAoIDEgPDwgIDkgKSAgIC8vIFRpbWUgb3V0IG9mIGNoZWNraW5nIEFSUCBvd25lciBiaXQgaW4gTkNTSSBwYWNrZXQKKyNkZWZpbmUgRXJyX05DU0lfTm9fUEhZICAgICAgICAgICAgICAgICAgICAgICAgKCAxIDw8IDEwICkgICAvLyBDYW4gbm90IGZpbmQgTkNTSSBQSFkKKyNkZWZpbmUgRXJyX05DU0lfQ2hhbm5lbF9OdW0gICAgICAgICAgICAgICAgICAgKCAxIDw8IDExICkgICAvLyBOQ1NJIENoYW5uZWwgTnVtYmVyIE1pc21hdGNoCisjZGVmaW5lIEVycl9OQ1NJX1BhY2thZ2VfTnVtICAgICAgICAgICAgICAgICAgICggMSA8PCAxMiApICAgLy8gTkNTSSBQYWNrYWdlIE51bWJlciBNaXNtYXRjaAorI2RlZmluZSBFcnJfUEhZX1RpbWVPdXQgICAgICAgICAgICAgICAgICAgICAgICAoIDEgPDwgMTMgKSAgIC8vIFRpbWUgb3V0IG9mIHJlYWQvd3JpdGUvcmVzZXQgUEhZIHJlZ2lzdGVyCisjZGVmaW5lIEVycl9SWEJVRl9VTkFWQSAgICAgICAgICAgICAgICAgICAgICAgICggMSA8PCAxNCApICAgLy8gTUFDMDBoWzJdOlJlY2VpdmluZyBidWZmZXIgdW5hdmFpbGFibGUKKyNkZWZpbmUgRXJyX1JQS1RfTE9TVCAgICAgICAgICAgICAgICAgICAgICAgICAgKCAxIDw8IDE1ICkgICAvLyBNQUMwMGhbM106UmVjZWl2ZWQgcGFja2V0IGxvc3QgZHVlIHRvIFJYIEZJRk8gZnVsbAorI2RlZmluZSBFcnJfTlBUWEJVRl9VTkFWQSAgICAgICAgICAgICAgICAgICAgICAoIDEgPDwgMTYgKSAgIC8vIE1BQzAwaFs2XTpOb3JtYWwgcHJpb3JpdHkgdHJhbnNtaXQgYnVmZmVyIHVuYXZhaWxhYmxlCisjZGVmaW5lIEVycl9UUEtUX0xPU1QgICAgICAgICAgICAgICAgICAgICAgICAgICggMSA8PCAxNyApICAgLy8gTUFDMDBoWzddOlBhY2tldHMgdHJhbnNtaXR0ZWQgdG8gRXRoZXJuZXQgbG9zdAorI2RlZmluZSBFcnJfRE1BQnVmTnVtICAgICAgICAgICAgICAgICAgICAgICAgICAoIDEgPDwgMTggKSAgIC8vIERNQSBCdWZmZXIgaXMgbm90IGVub3VnaAorI2RlZmluZSBFcnJfSU9NYXJnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAoIDEgPDwgMTkgKSAgIC8vIElPIHRpbWluZyBtYXJnaW4gaXMgbm90IGVub3VnaAorI2RlZmluZSBFcnJfSU9NYXJnaW5PVUYgICAgICAgICAgICAgICAgICAgICAgICAoIDEgPDwgMjAgKSAgIC8vIElPIHRpbWluZyB0ZXN0aW5nIG91dCBvZiBib3VuZGFyeQorI2RlZmluZSBFcnJfTUhDTEtfUmF0aW8gICAgICAgICAgICAgICAgICAgICAgICAoIDEgPDwgMjEgKSAgIC8vIEVycm9yIHNldHRpbmcgb2YgTUFDIEFIQiBidXMgY2xvY2sgKFNDVTA4WzE4OjE2XSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgQ2hlY2tfRGVzX1R4T3duVGltZU91dCAgICAgICAgICAgICAgICAgKCAxIDw8ICAwICkgICAvLyBUaW1lIG91dCBvZiBjaGVja2luZyBUeCBvd25lciBiaXQKKyNkZWZpbmUgQ2hlY2tfRGVzX1J4T3duVGltZU91dCAgICAgICAgICAgICAgICAgKCAxIDw8ICAxICkgICAvLyBUaW1lIG91dCBvZiBjaGVja2luZyBSeCBvd25lciBiaXQKKyNkZWZpbmUgQ2hlY2tfRGVzX1J4RXJyICAgICAgICAgICAgICAgICAgICAgICAgKCAxIDw8ICAyICkgICAvLyBJbnB1dCBzaWduYWwgUnhFcnIKKyNkZWZpbmUgQ2hlY2tfRGVzX09kZE5pYmJsZSAgICAgICAgICAgICAgICAgICAgKCAxIDw8ICAzICkgICAvLyBOaWJibGUgYml0IGhhcHBlbgorI2RlZmluZSBDaGVja19EZXNfQ1JDICAgICAgICAgICAgICAgICAgICAgICAgICAoIDEgPDwgIDQgKSAgIC8vIENSQyBlcnJvciBvZiBmcmFtZQorI2RlZmluZSBDaGVja19EZXNfUnhGSUZPRnVsbCAgICAgICAgICAgICAgICAgICAoIDEgPDwgIDUgKSAgIC8vIFJ4IEZJRk8gZnVsbAorI2RlZmluZSBDaGVja19EZXNfRnJhbWVMZW4gICAgICAgICAgICAgICAgICAgICAoIDEgPDwgIDYgKSAgIC8vIEZyYW1lIGxlbmd0aCBtaXNtYXRjaAorCisjZGVmaW5lIE5DU0lfTGlua0ZhaWxfR2V0X1ZlcnNpb25fSUQgICAgICAgICAgICggMSA8PCAgMCApICAgLy8gVGltZSBvdXQgd2hlbiBHZXQgVmVyc2lvbiBJRAorI2RlZmluZSBOQ1NJX0xpbmtGYWlsX0dldF9DYXBhYmlsaXRpZXMgICAgICAgICAoIDEgPDwgIDEgKSAgIC8vIFRpbWUgb3V0IHdoZW4gR2V0IENhcGFiaWxpdGllcworI2RlZmluZSBOQ1NJX0xpbmtGYWlsX1NlbGVjdF9BY3RpdmVfUGFja2FnZSAgICAoIDEgPDwgIDIgKSAgIC8vIFRpbWUgb3V0IHdoZW4gU2VsZWN0IEFjdGl2ZSBQYWNrYWdlCisjZGVmaW5lIE5DU0lfTGlua0ZhaWxfRW5hYmxlX1NldF9NQUNfQWRkcmVzcyAgICggMSA8PCAgMyApICAgLy8gVGltZSBvdXQgd2hlbiBFbmFibGUgU2V0IE1BQyBBZGRyZXNzCisjZGVmaW5lIE5DU0lfTGlua0ZhaWxfRW5hYmxlX0Jyb2FkY2FzdF9GaWx0ZXIgICggMSA8PCAgNCApICAgLy8gVGltZSBvdXQgd2hlbiBFbmFibGUgQnJvYWRjYXN0IEZpbHRlcgorI2RlZmluZSBOQ1NJX0xpbmtGYWlsX0VuYWJsZV9OZXR3b3JrX1RYICAgICAgICAoIDEgPDwgIDUgKSAgIC8vIFRpbWUgb3V0IHdoZW4gRW5hYmxlIE5ldHdvcmsgVFgKKyNkZWZpbmUgTkNTSV9MaW5rRmFpbF9FbmFibGVfQ2hhbm5lbCAgICAgICAgICAgKCAxIDw8ICA2ICkgICAvLyBUaW1lIG91dCB3aGVuIEVuYWJsZSBDaGFubmVsCisjZGVmaW5lIE5DU0lfTGlua0ZhaWxfRGlzYWJsZV9OZXR3b3JrX1RYICAgICAgICggMSA8PCAgNyApICAgLy8gVGltZSBvdXQgd2hlbiBEaXNhYmxlIE5ldHdvcmsgVFgKKyNkZWZpbmUgTkNTSV9MaW5rRmFpbF9EaXNhYmxlX0NoYW5uZWwgICAgICAgICAgKCAxIDw8ICA4ICkgICAvLyBUaW1lIG91dCB3aGVuIERpc2FibGUgQ2hhbm5lbAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU0NVIGluZm9ybWF0aW9uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmICggQVNUMTAxMF9JT01BUCA9PSAxICkKKyAgICAjZGVmaW5lIFNDVV9CQVNFICAgICAgICAgICAgICBBU1RfU0NVX0JBU0UKKyNlbmRpZgorI2lmICggQVNUMTAxMF9JT01BUCA9PSAyICkKKyAgICAjZGVmaW5lIFNDVV9CQVNFICAgICAgICAgICAgICAweDA4NDEwMDAKKyNlbmRpZgorCisjaWZuZGVmIEFTVDEwMTBfSU9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICNkZWZpbmUgU0NVX0JBU0UgICAgICAgICAgICAgICAgMHgxZTZlMjAwMAorI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisjZGVmaW5lIFNDVV80OGhfQVNUMTAxMCAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBTQ1VfNDhoX0FTVDIzMDAgICAgICAgICAgIDB4MDAyMjIyNTUKKworLy8jaWZkZWYgU0xUX0RPUworLy8gICNkZWZpbmUgU0NVXzgwaCAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKy8vICAjZGVmaW5lIFNDVV84OGggICAgICAgICAgICAgICAweDAwMDAwMDAwCisvLyAgI2RlZmluZSBTQ1VfOTBoICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorLy8gICNkZWZpbmUgU0NVXzc0aCAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKy8vI2Vsc2UKKy8vICAjZGVmaW5lIFNDVV84MGggICAgICAgICAgICAgICAweDAwMDAwMDBmICAgICAvL0FTVDIzMDBbMzowXU1BQzF+NCBQSFlMSU5LCisvLyAgI2RlZmluZSBTQ1VfODhoICAgICAgICAgICAgICAgMHhjMDAwMDAwMCAgICAgLy9BU1QyMzAwWzMxXU1BQzEgTURJTywgWzMwXU1BQzEgTURDCisvLyAgI2RlZmluZSBTQ1VfOTBoICAgICAgICAgICAgICAgMHgwMDAwMDAwNCAgICAgLy9BU1QyMzAwWzIgXU1BQzIgTURDL01ESU8KKy8vICAjZGVmaW5lIFNDVV83NGggICAgICAgICAgICAgICAweDA2MzAwMDAwICAgICAvL0FTVDMwMDBbMjBdTUFDMiBNREMvTURJTywgWzIxXU1BQzIgTUlJLCBbMjVdTUFDMSBQSFlMSU5LLCBbMjZdTUFDMiBQSFlMSU5LCisvLyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRE1BIEJ1ZmZlciBpbmZvcm1hdGlvbgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBGUEdBCisgICAgICAgICNkZWZpbmUgRFJBTV9LQnl0ZVNpemUgICAgKCA1NiAqIDEwMjQgKQorI2Vsc2UKKyAgI2lmZGVmIEFTVDEwMTBfSU9NQVAKKyAgICAgICAgI2RlZmluZSBEUkFNX0tCeXRlU2l6ZSAgICAoIDMgKiAxMDI0ICkgICAgICAvLyBEQVRBIGJ1ZmZlciBvbmx5IHVzZSAweEIwMDAwMCB0byAweEUwMDAwMAorICAjZWxzZQorICAgICAgI2RlZmluZSBEUkFNX0tCeXRlU2l6ZSAgICAgICggMTggKiAxMDI0ICkKKyAgI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBETUFfQkFTRSAgICAgICAgICAgICAgICAoIDB4MDAxMDAwMDAgKyBEUkFNX01hcEFkciApCisKKyNpZmRlZiBFbmFibGVfSnVtYm8KKyAgI2RlZmluZSBETUFfUGFrU2l6ZSAgICAgICAgICAgKCAxMCAqIDEwMjQgKQorI2Vsc2UKKyAgI2RlZmluZSBETUFfUGFrU2l6ZSAgICAgICAgICAgKCAyICogMTAyNCApIC8vIFRoZSBzaXplIG9mIG9uZSBMQU4gcGFja2V0CisjZW5kaWYKKworI2lmZGVmIFNlbGVjdFNpbXBsZUJvdW5kYXJ5CisgICNkZWZpbmUgRE1BX0J1ZlNpemUgICAgICAgICAgICggICAgKCAoICggKCBERVNfTlVNQkVSICsgMTUgKSAqIERNQV9QYWtTaXplICkgPj4gMiApIDw8IDIgKSApIC8vdmFyeSBieSBERVNfTlVNQkVSCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgI2RlZmluZSBETUFfQnVmU2l6ZSAgICAgICAgICAgKDQgKyAoICggKCAoIERFU19OVU1CRVIgKyAxNSApICogRE1BX1Bha1NpemUgKSA+PiAyICkgPDwgMiApICkgLy92YXJ5IGJ5IERFU19OVU1CRVIKKyNlbmRpZgorCisjZGVmaW5lIERNQV9CdWZOdW0gICAgICAgICAgICAgICggKCBEUkFNX0tCeXRlU2l6ZSAqIDEwMjQgKSAvICggRE1BX0J1ZlNpemUgKSApICAgICAgICAgICAgICAgIC8vdmFyeSBieSBERVNfTlVNQkVSCisjZGVmaW5lIEdFVF9ETUFfQkFTRV9TRVRVUCAgICAgICggRE1BX0JBU0UgKQorI2RlZmluZSBHRVRfRE1BX0JBU0UoeCkgICAgICAgICAoIERNQV9CQVNFICsgKCAoICggKCB4ICkgJSBETUFfQnVmTnVtICkgKyAxICkgKiBETUFfQnVmU2l6ZSApICkvL3ZhcnkgYnkgREVTX05VTUJFUgorCisjZGVmaW5lIFNFRURfU1RBUlQgICAgICAgICAgICAgIDgKKyNkZWZpbmUgREFUQV9TRUVEKHNlZWQpICAgICAgICAgKCAoIHNlZWQgKSB8ICgoIHNlZWQgKyAxICkgPDwgMTYgKSApCisjZGVmaW5lIERBVEFfSW5jVmFsICAgICAgICAgICAgIDB4MDAwMjAwMDEKKy8vI2RlZmluZSBEQVRBX0luY1ZhbCAgICAgICAgICAgICAweDAxMDAwMDAxICAgICAvL2ZhaWwKKy8vI2RlZmluZSBEQVRBX0luY1ZhbCAgICAgICAgICAgICAweDEwMDAwMDAxICAgICAvL2ZhaWwKKy8vI2RlZmluZSBEQVRBX0luY1ZhbCAgICAgICAgICAgICAweDEwMDAwMDAwICAgICAvL2ZhaWwKKy8vI2RlZmluZSBEQVRBX0luY1ZhbCAgICAgICAgICAgICAweDgwMDAwMDAwICAgICAvL2ZhaWwKKy8vI2RlZmluZSBEQVRBX0luY1ZhbCAgICAgICAgICAgICAweDAwMDAwMDAxICAgICAvL29rCisvLyNkZWZpbmUgREFUQV9JbmNWYWwgICAgICAgICAgICAgMHgwMTAwMDEwMCAgICAgLy9vaworLy8jZGVmaW5lIERBVEFfSW5jVmFsICAgICAgICAgICAgIDB4MDEwMTAwMDAgICAgIC8vb2sKKy8vI2RlZmluZSBEQVRBX0luY1ZhbCAgICAgICAgICAgICAweDAxMDEwMTAxICAgICAvL29rCisvLyNkZWZpbmUgREFUQV9JbmNWYWwgICAgICAgICAgICAgMHgwMDAwMDEwMSAgICAgLy9vaworLy8jZGVmaW5lIERBVEFfSW5jVmFsICAgICAgICAgICAgIDB4MDAwMDExMTEgICAgIC8vZmFpbAorLy8jZGVmaW5lIERBVEFfSW5jVmFsICAgICAgICAgICAgIDB4MDAwMDAwMTEgICAgIC8vZmFpbAorLy8jZGVmaW5lIERBVEFfSW5jVmFsICAgICAgICAgICAgIDB4MTAxMDAxMDEgICAgIC8vZmFpbAorLy8jZGVmaW5lIERBVEFfSW5jVmFsICAgICAgICAgICAgIDB4ZmVmZjAyMDEKKy8vI2RlZmluZSBEQVRBX0luY1ZhbCAgICAgICAgICAgICAweDAwMDEwMDAxCisjZGVmaW5lIFBrdEJ5dGVTaXplICAgICAgICAgICAgICAoICggKCAoIFplcm9Db3B5X09GRlNFVCArIEZSQU1FX0xFTl9DdXIgLSAxICkgPj4gMiApICsgMSkgPDwgMiApCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWxheSAobXMpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8jZGVmaW5lIERlbGF5X0Rlc0dhcCAgICAgICAgICAgICAgMTAwMCAgICAgICAgLy9vZmYKKy8vI2RlZmluZSBEZWxheV9EZXNHYXAgICAgICAgICAgICAgIDcwMCAgICAgICAgIC8vb2ZmCisKKy8vI2RlZmluZSBEZWxheV9DaGtSeE93biAgICAgICAgICAgIDEwCisvLyNkZWZpbmUgRGVsYXlfQ2hrVHhPd24gICAgICAgICAgICAxMAorI2RlZmluZSBEZWxheV9DbnRNYXggICAgICAgICAgICAgIDEwMDAwMDAwMAorLy8jZGVmaW5lIERlbGF5X0NudE1heCAgICAgICAgICAgICAgMTAwMAorLy8jZGVmaW5lIERlbGF5X0NudE1heCAgICAgICAgICAgICAgODQ2NQorLy8jZGVmaW5lIERlbGF5X0NudE1heEluY1ZhbCAgICAgICAgNTAwMDAKKyNkZWZpbmUgRGVsYXlfQ250TWF4SW5jVmFsICAgICAgICA0NzUwMAorCisjZGVmaW5lIERlbGF5X1BIWVJzdCAgICAgICAgICAgICAgMTAwCisjZGVmaW5lIERlbGF5X1BIWVJkICAgICAgICAgICAgICAgNQorCisjZGVmaW5lIERlbGF5X1NDVSAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgRGVsYXlfTUFDUnN0ICAgICAgICAgICAgICAxCisjZGVmaW5lIERlbGF5X01BQ0R1bXAgICAgICAgICAgICAgMTAwCisKKy8vI2RlZmluZSBEZWxheV9ERVMgICAgICAgICAgICAgICAgIDEKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRpbWUgT3V0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBUSU1FX09VVF9EZXMgICAgICAgICAgICAgIDEwMDAwCisjZGVmaW5lIFRJTUVfT1VUX1BIWV9SVyAgICAgICAgICAgMTAwMDAKKyNkZWZpbmUgVElNRV9PVVRfUEhZX1JzdCAgICAgICAgICAxMDAwMAorCisvLyNkZWZpbmUgVElNRV9PVVRfTkNTSSAgICAgICAgICAgICAzMDAwMDAKKyNkZWZpbmUgVElNRV9PVVRfTkNTSSAgICAgICAgICAgICAzMDAwMAorCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENoaXAgbWVtb3J5IE1BUAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgTElUVExFX0VORElBTl9BRERSRVNTICAgMAorI2RlZmluZSBCSUdfRU5ESUFOX0FERFJFU1MgICAgICAxCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVTE9ORyBTdGFydEFkZHI7CisgICAgVUxPTkcgRW5kQWRkcjsKK30gIExpdHRsZUVuZGlhbl9BcmVhOworCisjaWYgKCBBU1QxMDEwX0lPTUFQID09IDEgKQorICBzdGF0aWMgY29uc3QgTGl0dGxlRW5kaWFuX0FyZWEgTGl0dGxlRW5kaWFuQXJlYVtdID0geyAKKyAgICAgICAgICAgIHsgQVNUX0lPX0JBU0UsIChBU1RfSU9fQkFTRSArIDB4MDAwRkZGRkYpIH0sCisgICAgICAgICAgICB7IDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYgfSAgLy8gRW5kCisgICAgICAgICAgICB9OworI2Vsc2UKKyAgc3RhdGljIGNvbnN0IExpdHRsZUVuZGlhbl9BcmVhIExpdHRsZUVuZGlhbkFyZWFbXSA9IHsgCisgICAgICAgICAgICB7IDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYgfSAgLy8gRW5kCisgICAgICAgICAgICB9OyAgICAgICAgICAgIAorI2VuZGlmCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBGb3IgbmNzaS5jIAorCisjZGVmaW5lIERFRl9QQUNLQUdFMk5VTSAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgLy8gRGVmYXVsdCB2YWx1ZQorI2RlZmluZSBERUZfQ0hBTk5FTDJOVU0gICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgIC8vIERlZmF1bHQgdmFsdWUKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGNoYXIgUGFja2FnZV9JRDsKKyAgICB1bnNpZ25lZCBjaGFyIENoYW5uZWxfSUQ7CisgICAgdW5zaWduZWQgbG9uZyBDYXBhYmlsaXRpZXNfRmxhZ3M7CisgICAgdW5zaWduZWQgbG9uZyBCcm9hZGNhc3RfUGFja2V0X0ZpbHRlcl9DYXBhYmlsaXRpZXM7CisgICAgdW5zaWduZWQgbG9uZyBNdWx0aWNhc3RfUGFja2V0X0ZpbHRlcl9DYXBhYmlsaXRpZXM7CisgICAgdW5zaWduZWQgbG9uZyBCdWZmZXJpbmdfQ2FwYWJpbGl0aWVzOworICAgIHVuc2lnbmVkIGxvbmcgQUVOX0NvbnRyb2xfU3VwcG9ydDsKKyAgICB1bnNpZ25lZCBsb25nIFBDSV9ESURfVklEOworICAgIHVuc2lnbmVkIGxvbmcgTWFudWZhY3R1cmVySUQ7Cit9IE5DU0lfQ2FwYWJpbGl0eTsKKworI3VuZGVmIEdMT0JBTAorI2lmZGVmIE5DU0lfQworI2RlZmluZSBHTE9CQUwKKyNlbHNlCisjZGVmaW5lIEdMT0JBTCAgICBleHRlcm4KKyNlbmRpZgorCitHTE9CQUwgIE5DU0lfQ2FwYWJpbGl0eSAgICAgTkNTSV9DYXBfU0xUOworR0xPQkFMICBCWVRFICAgICAgICAgICAgICAgIG51bWJlcl9jaGw7CisKK0dMT0JBTCAgY2hhciBwaHlfbmNzaSAodm9pZCk7CisgICAgICAgICAgIAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZvciBtYWN0ZXN0IAorCisjdW5kZWYgR0xPQkFMCisjaWZkZWYgTUFDVEVTVF9DCisjZGVmaW5lIEdMT0JBTAorI2Vsc2UKKyNkZWZpbmUgR0xPQkFMICAgIGV4dGVybgorI2VuZGlmCisKK0dMT0JBTCAgVUxPTkcgICAgTkNTSV9EaVNDaGFubmVsOworCisvLyAKKyNpZmRlZiBTTFRfVUJPT1QKKyNlbHNlIAorLy8gU0xUX0RPUworR0xPQkFMICBGSUxFICAgICAgICAqZnBfbG9nOworR0xPQkFMICBGSUxFICAgICAgICAqZnBfaW87CisjZW5kaWYKKworR0xPQkFMICBDSEFSICAgICAgICBkbHltYXBbMTZdWzE2XTsKK0dMT0JBTCAgQ0hBUiAgICAgICAgUHJpbnROQ1NJRW47CitHTE9CQUwgIFVMT05HICAgICAgIEFSUE51bUNudDsKK0dMT0JBTCAgQ0hBUiAgICAgICAgRmlsZU5hbWVNYWluWzI1Nl07CitHTE9CQUwgIENIQVIgICAgICAgIEZpbGVOYW1lWzI1Nl07CitHTE9CQUwgIENIQVIgICAgICAgIEFTVENoaXBOYW1lWzI1Nl07CitHTE9CQUwgIENIQVIgICAgICAgIExPT1BfU3RyWzI1Nl07CitHTE9CQUwgIEJZVEUgICAgICAgIElPVGltaW5nQnVuZDsKK0dMT0JBTCAgQllURSAgICAgICAgQ2hhbm5lbFRvbE51bTsKK0dMT0JBTCAgQllURSAgICAgICAgUGFja2FnZVRvbE51bTsKK0dMT0JBTCAgVUxPTkcgICAgICAgSU9kbHlfb3V0X3JlZzsKK0dMT0JBTCAgQllURSAgICAgICAgSU9kbHlfb3V0X3JlZ19pZHg7CitHTE9CQUwgIFVMT05HICAgICAgIERhdF9VTE9ORzsKK0dMT0JBTCAgVUxPTkcgICAgICAgSU9kbHlfaW5jdmFsOworR0xPQkFMICBVTE9ORyAgICAgICBJT2RseV9pbl9yZWc7CitHTE9CQUwgIEJZVEUgICAgICAgIElPZGx5X2luX3JlZ19pZHg7CitHTE9CQUwgIFVMT05HICAgICAgICp3cF9sc3Q7CitHTE9CQUwgIFVMT05HICAgICAgICpGUkFNRV9MRU47CitHTE9CQUwgIFVMT05HICAgICAgIERFU19OVU1CRVI7CitHTE9CQUwgIFVMT05HICAgICAgIERFU19OVU1CRVJfT3JnOworR0xPQkFMICBpbnQgICAgICAgICBMT09QX01BWDsKK0dMT0JBTCAgVUxPTkcgICAgICAgTE9PUF9DaGVja051bTsKK0dMT0JBTCAgaW50ICAgICAgICAgTG9vcDsKK0dMT0JBTCAgVUxPTkcgICAgICAgQ2hlY2tCdWZfTUJTaXplOworR0xPQkFMICBVTE9ORyAgICAgICBFcnJfRmxhZzsKK0dMT0JBTCAgVUxPTkcgICAgICAgU0NVX2YwaF9vbGQ7CisjaWZkZWYgQVNUMTAxMF9JT01BUAorICBHTE9CQUwgIFVMT05HICAgICAgIFNDVV8xMUNoX29sZDsKKyNlbmRpZgorR0xPQkFMICBVTE9ORyAgICAgICBTQ1VfMDRoOworR0xPQkFMICBVTE9ORyAgICAgICBTQ1VfOTBoX29sZDsKK0dMT0JBTCAgVUxPTkcgICAgICAgU0NVXzdjaF9vbGQ7CitHTE9CQUwgIFVMT05HICAgICAgIE1BQ181MGg7CitHTE9CQUwgIFVMT05HICAgICAgIFNDVV9hY2hfb2xkOworR0xPQkFMICBVTE9ORyAgICAgICBTQ1VfNzBoX29sZDsKK0dMT0JBTCAgVUxPTkcgICAgICAgTUFDXzUwaF9TcGVlZDsKK0dMT0JBTCAgVUxPTkcgICAgICAgU0NVXzQ4aF9vbGQ7CitHTE9CQUwgIFVMT05HICAgICAgIFNDVV80OGhfbWl4OworR0xPQkFMICBVTE9ORyAgICAgICBNQUNfMDhoX29sZDsKK0dMT0JBTCAgVUxPTkcgICAgICAgTUFDXzBjaF9vbGQ7CitHTE9CQUwgIFVMT05HICAgICAgIE1BQ180MGhfb2xkOworR0xPQkFMICBVTE9ORyAgICAgICBTQ1VfMDhoX29sZDsKK0dMT0JBTCAgVUxPTkcgICAgICAgTUFDX1BIWUJBU0U7CitHTE9CQUwgIFVMT05HICAgICAgIExPT1BfTUFYX2FyZzsKK0dMT0JBTCAgQllURSAgICAgICAgR1J1bl9Nb2RlOworR0xPQkFMICBVTE9ORyAgICAgICBHU3BlZWRfaWR4OworR0xPQkFMICBDSEFSICAgICAgICBHU3BlZWRfc2VsWzNdOworR0xPQkFMICBDSEFSICAgICAgICBQSFlfQURSOworR0xPQkFMICBDSEFSICAgICAgICBQSFlfQURSX2FyZzsKK0dMT0JBTCAgQ0hBUiAgICAgICAgUEhZTmFtZVsyNTZdOworR0xPQkFMICBVTE9ORyAgICAgICBQSFlfSUQzOworR0xPQkFMICBVTE9ORyAgICAgICBQSFlfSUQyOworR0xPQkFMICBCWVRFICAgICAgICBudW1iZXJfcGFrOworR0xPQkFMICBCWVRFICAgICAgICBUZXN0TW9kZTsKK0dMT0JBTCAgVUxPTkcgICAgICAgSU9TdHJfaTsKK0dMT0JBTCAgQllURSAgICAgICAgSU9UaW1pbmdCdW5kX2FyZzsKK0dMT0JBTCAgQllURSAgICAgICAgR1NwZWVkOworR0xPQkFMICBCWVRFICAgICAgICBHQ3RybDsKK0dMT0JBTCAgVUxPTkcgICAgICAgVXNlckRWYWw7CitHTE9CQUwgIFVMT05HICAgICAgIEhfTUFDX0JBU0U7CitHTE9CQUwgIFVMT05HICAgICAgIEhfVERFU19CQVNFOworR0xPQkFMICBVTE9ORyAgICAgICBIX1JERVNfQkFTRTsKK0dMT0JBTCAgQ0hBUiAgICAgICAgIExvb3BfcmxbM107CitHTE9CQUwgIENIQVIgICAgICAgIElPVGltaW5nOworR0xPQkFMICBDSEFSICAgICAgICBMT09QX0lORklOSTsKK0dMT0JBTCAgQ0hBUiAgICAgICAgU2VsZWN0TUFDOworR0xPQkFMICBDSEFSICAgICAgICBFbmFibGVfU2tpcENoa1BIWTsKK0dMT0JBTCAgQ0hBUiAgICAgICAgRW5hYmxlX01BQzM0OworR0xPQkFMICBDSEFSICAgICAgICBJT1N0cmVuZ3RoOworR0xPQkFMICBDSEFSICAgICAgICBEYXRhRGVsYXk7CitHTE9CQUwgIENIQVIgICAgICAgIFNBWzZdOworR0xPQkFMICBDSEFSICAgICAgICBSeERhdGFFbmFibGU7CitHTE9CQUwgIENIQVIgICAgICAgIElFRUVUZXN0aW5nOworR0xPQkFMICBDSEFSICAgICAgICBCdXJzdEVuYWJsZTsKK0dMT0JBTCAgQ0hBUiAgICAgICAgTUFDX01vZGU7CitHTE9CQUwgIENIQVIgICAgICAgIEVuYWJsZV9NQUNMb29wYmFjazsKK0dMT0JBTCAgQ0hBUiAgICAgICAgRW5hYmxlX0luaXRQSFk7CitHTE9CQUwgIENIQVIgICAgICAgIE1BQzFfMUdFbjsKK0dMT0JBTCAgQ0hBUiAgICAgICAgTUFDMl9STUlJOworR0xPQkFMICBDSEFSICAgICAgICBFbmFibGVfUk1JSTsKK0dMT0JBTCAgQ0hBUiAgICAgICAgTUFDMl8xR0VuOworR0xPQkFMICBDSEFSICAgICAgICBUeERhdGFFbmFibGU7CitHTE9CQUwgIENIQVIgICAgICAgIEFTVDIzMDBfTmV3TURJTzsKK0dMT0JBTCAgQ0hBUiAgICAgICAgQVNUQ2hpcFR5cGU7CitHTE9CQUwgIENIQVIgICAgICAgIEVycl9GbGFnX1ByaW50RW47CitHTE9CQUwgIENIQVIgICAgICAgIEFTVDI0MDA7CitHTE9CQUwgIENIQVIgICAgICAgIEFTVDIzMDA7CitHTE9CQUwgIENIQVIgICAgICAgIEFTVDExMDA7Ly9EaWZmZXJlbnQgaW4gcGh5ICYgZHJhbSBpbml0aWF0aW9uICYgZHJhbSBzaXplICYgUk1JSQorR0xPQkFMICBDSEFSICAgICAgICBBU1QzMjAwOworR0xPQkFMICBDSEFSICAgICAgICBBU1QxMDEwOworR0xPQkFMICBTQ0hBUiAgICAgICBJT2RseV9pX21pbjsKK0dMT0JBTCAgU0NIQVIgICAgICAgSU9kbHlfal9taW47CitHTE9CQUwgIFNDSEFSICAgICAgIElPZGx5X2lfbWF4OworR0xPQkFMICBTQ0hBUiAgICAgICBJT2RseV9qX21heDsKK0dMT0JBTCAgQllURSAgICAgICAgSU9kbHlfaTsKK0dMT0JBTCAgQllURSAgICAgICAgSU9kbHlfajsKK0dMT0JBTCAgQllURSAgICAgICAgSU9kbHlfaW47CitHTE9CQUwgIEJZVEUgICAgICAgIElPZGx5X291dDsKK0dMT0JBTCAgU0NIQVIgICAgICAgSU9kbHlfaW5fc3RyOworR0xPQkFMICBCWVRFICAgICAgICBJT2RseV9pbl9lbmQ7CitHTE9CQUwgIEJZVEUgICAgICAgIElPZGx5X291dF9lbmQ7CitHTE9CQUwgIEJZVEUgICAgICAgIElPZGx5X291dF9zaGY7CitHTE9CQUwgIEJZVEUgICAgICAgIElPZGx5X2luX3NoZjsKK0dMT0JBTCAgU0NIQVIgICAgICAgSU9kbHlfb3V0X3N0cjsKK0dMT0JBTCAgQllURSAgICAgICAgdmFsYXJ5WzE2XTsKKworI2RlZmluZSBNT0RFX0RFRElDQVRFRCAgICAgIDB4MDEKKyNkZWZpbmUgTU9ERV9OU0NJICAgICAgICAgICAweDAyCitHTE9CQUwgIENIQVIgICAgICAgIE1vZGVTd2l0Y2g7CisKKyNpZmRlZiBTTFRfVUJPT1QKKyNlbHNlCisgICAgR0xPQkFMICB0aW1lX3QgICAgICB0aW1lc3RhcnQ7CisjZW5kaWYKKworI2lmZGVmIFNQSV9CVVMKKyAgICBHTE9CQUwgVUxPTkcgICBtbWlvYmFzZTsKKyNlbHNlICAgIAorICAgIC8vICggVVNFX1AyQSB8IFVTRV9MUEMgKQorICAgIEdMT0JBTCAgVUNIQVIgICAgICAgKm1taW9iYXNlOworICAgIEdMT0JBTCAgVUxPTkcgICAgICAgdWxQQ0lCYXNlQWRkcmVzczsKKyAgICBHTE9CQUwgIFVMT05HICAgICAgIHVsTU1JT0Jhc2VBZGRyZXNzOworI2VuZGlmCisKKyAgIAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEZvciBtYWMuYyAKKyN1bmRlZiBHTE9CQUwKKyNpZmRlZiBNQUNfQworI2RlZmluZSBHTE9CQUwKKyNlbHNlCisjZGVmaW5lIEdMT0JBTCAgICBleHRlcm4KKyNlbmRpZgorICAgIAorR0xPQkFMICBVTE9ORyAgIEFSUF9kYXRhWzE2XTsKK0dMT0JBTCAgVUxPTkcgICBOQ1NJX0xpbmtGYWlsX1ZhbDsKK3N0YXRpYyAgY29uc3QgIGNoYXIgdmVyc2lvbl9uYW1lW10gPSBWRVJfTkFNRTsKKworR0xPQkFMIHZvaWQgICAgRGVidWdfZGVsYXkgKHZvaWQpOworR0xPQkFMIHZvaWQgICAgcmVhZF9zY3UgKHZvaWQpOworR0xPQkFMIHZvaWQgICAgU2V0dGluZ19zY3UgKHZvaWQpOworR0xPQkFMIHZvaWQgICAgUHJpbnRNb2RlICh2b2lkKTsKK0dMT0JBTCB2b2lkICAgIFByaW50UGFrTlVtICh2b2lkKTsKK0dMT0JBTCB2b2lkICAgIFByaW50Q2hsTlVtICh2b2lkKTsKK0dMT0JBTCB2b2lkICAgIFByaW50VGVzdCAodm9pZCk7CitHTE9CQUwgdm9pZCAgICBQcmludElPVGltaW5nQnVuZCAodm9pZCk7CitHTE9CQUwgdm9pZCAgICBQcmludFNwZWVkICh2b2lkKTsKK0dMT0JBTCB2b2lkICAgIFByaW50Q3RybCAodm9pZCk7CitHTE9CQUwgdm9pZCAgICBQcmludExvb3AgKHZvaWQpOworR0xPQkFMIHZvaWQgICAgUHJpbnRQSFlBZHIgKHZvaWQpOworR0xPQkFMIHZvaWQgICAgRmluaXNoX0Nsb3NlICh2b2lkKTsKK0dMT0JBTCB2b2lkICAgIENhbGN1bGF0ZV9MT09QX0NoZWNrTnVtICh2b2lkKTsKK0dMT0JBTCBjaGFyICAgIEZpbmlzaF9DaGVjayAoaW50IHZhbHVlKTsKK0dMT0JBTCB2b2lkICAgIGluaXRfc2N1MSAodm9pZCk7CitHTE9CQUwgdm9pZCAgICBpbml0X3NjdV9tYWNyc3QgKHZvaWQpOworR0xPQkFMIHZvaWQgICAgc2V0dXBfYXJwICh2b2lkKTsKK0dMT0JBTCB2b2lkICAgIFRlc3RpbmdTZXR1cCAodm9pZCk7CitHTE9CQUwgdm9pZCAgICBpbml0X3NjdTIgKHZvaWQpOworR0xPQkFMIHZvaWQgICAgaW5pdF9zY3UzICh2b2lkKTsKK0dMT0JBTCB2b2lkICAgIGluaXRfbWFjIChVTE9ORyBiYXNlLCBVTE9ORyB0ZGV4YmFzZSwgVUxPTkcgcmRleGJhc2UpOworR0xPQkFMIGNoYXIgICAgVGVzdGluZ0xvb3AgKFVMT05HIGxvb3BfY2hlY2tudW0pOworR0xPQkFMIHZvaWQgICAgUHJpbnRJT19MaW5lX0xPRyAodm9pZCk7CitHTE9CQUwgdm9pZCAgICBpbml0X3BoeSAoaW50IGxvb3BfcGh5KTsKK0dMT0JBTCB2b2lkICAgIHJlY292X3BoeSAoaW50IGxvb3BfcGh5KTsKK0dMT0JBTCBpbnQgICAgIEZpbmRFcnIgKGludCB2YWx1ZSk7CitHTE9CQUwgaW50ICAgICBGaW5kRXJyX0RlcyAoaW50IHZhbHVlKTsKK0dMT0JBTCB2b2lkICAgIFByaW50SU9fSGVhZGVyIChCWVRFIG9wdGlvbik7CitHTE9CQUwgdm9pZCAgICBQcmludF9IZWFkZXIgKEJZVEUgb3B0aW9uKTsKK0dMT0JBTCB2b2lkICAgIFByaW50SU9fTGluZVMgKEJZVEUgb3B0aW9uKTsKK0dMT0JBTCB2b2lkICAgIFByaW50SU9fTGluZSAoQllURSBvcHRpb24pOworR0xPQkFMIHZvaWQgICAgRlByaV9FcnJGbGFnIChCWVRFIG9wdGlvbik7CisKKyNpZmRlZiBTVVBQT1JUX1BIWV9MQU45MzAzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gRm9yIExBTjkzMDMuYyAKKyN1bmRlZiBHTE9CQUwKKyNpZmRlZiBMQU45MzAzX0MKKyNkZWZpbmUgR0xPQkFMCisjZWxzZQorI2RlZmluZSBHTE9CQUwgICAgZXh0ZXJuCisjZW5kaWYKKworR0xPQkFMIHZvaWQgTEFOOTMwMyhpbnQgbnVtLCBpbnQgcGh5X2FkciwgaW50IHNwZWVkLCBpbnQgaW50X2xvb3BiYWNrKTsKKyNlbmRpZiAvLyBTVVBQT1JUX1BIWV9MQU45MzAzCisjZW5kaWYgLy8gRW5kIENPTU1JTkZfSAorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9ERUZfU1BJLkggYi9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9ERUZfU1BJLkgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIzNTNlNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL0RFRl9TUEkuSApAQCAtMCwwICsxLDM1IEBACisvKg0KKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KKyAqDQorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0ENCisgKi8NCisjaWZuZGVmIERFRl9TUElfSA0KKyNkZWZpbmUgREVGX1NQSV9IDQorDQorI2luY2x1ZGUgIlRZUEVERUYuSCINCisjaW5jbHVkZSAiU1dGVU5DLkgiDQorDQordHlwZWRlZiBzdHJ1Y3QgX0RFVklDRV9QQ0lfSU5GTw0KK3sNCisgICAgVVNIT1JUICAgIHVzVmVuZG9ySUQ7DQorICAgIFVTSE9SVCAgICB1c0RldmljZUlEOw0KKyAgICBVTE9ORyAgICAgdWxQQ0lDb25maWd1cmF0aW9uQmFzZUFkZHJlc3M7DQorICAgIFVMT05HICAgICB1bFBoeXNpY2FsQmFzZUFkZHJlc3M7DQorICAgIFVMT05HICAgICB1bE1NSU9CYXNlQWRkcmVzczsNCisgICAgVVNIT1JUICAgIHVzUmVsb2NhdGVJTzsNCit9IERFVklDRV9QQ0lfSU5GTzsNCisNCisvL1ZJREVPIEVuZ2luZSBJbmZvDQordHlwZWRlZiBzdHJ1Y3QgX1ZJREVPX0VOR0lORV9JTkZPIHsNCisgICAgVVNIT1JUICAgICAgICAgICAgIGlFbmdWZXJzaW9uOw0KKyAgICBERVZJQ0VfUENJX0lORk8gICAgVkdBUENJSW5mbzsNCit9IFZJREVPX0VOR0lORV9JTkZPOw0KKw0KK0JPT0xFQU4gIEdldERldmljZVBDSUluZm8gKFZJREVPX0VOR0lORV9JTkZPICpWaWRlb0VuZ2luZUluZm8pOw0KKw0KKyNlbmRpZiAvLyBERUZfU1BJX0gNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9EUkFNX1NQSS5jIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvRFJBTV9TUEkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTJiNWNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvRFJBTV9TUEkuYwpAQCAtMCwwICsxLDc4IEBACisvKg0KKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KKyAqDQorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0ENCisgKi8NCisjZGVmaW5lIERSQU1fU1BJX0MNCitzdGF0aWMgY29uc3QgY2hhciBUaGlzRmlsZVtdID0gIkRSQU1fU1BJLmMiOw0KKw0KKyNpbmNsdWRlICJTV0ZVTkMuSCINCisNCisjaWZkZWYgU1BJX0JVUw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlICJERUZfU1BJLkgiDQorI2luY2x1ZGUgIkxJQl9TUEkuSCINCisNCitWT0lEIFNldF9NTUlPX0Jhc2UoVUxPTkcgUENJX0JBU0UsIFVMT05HIGFkZHIpDQorew0KKyAgc3RhdGljIFVMT05HIE1NSU9fQkFTRSA9IC0xOw0KKw0KKyAgaWYoTU1JT19CQVNFICE9IChhZGRyICYgMHhmZmZmMDAwMCkpew0KKyAgICBpZihNTUlPX0JBU0UgPT0gLTEpew0KKyAgICAgICooVUxPTkcgKikoUENJX0JBU0UgKyAweEYwMDApID0gMTsNCisgICAgfQ0KKyAgICAqKFVMT05HICopKFBDSV9CQVNFICsgMHhGMDA0KSA9IGFkZHI7DQorICAgIE1NSU9fQkFTRSA9IGFkZHIgJiAweGZmZmYwMDAwOw0KKyAgfQ0KK30NCisNCitWT0lEICBNT3V0Ym0oVUxPTkcgUENJX0JBU0UsIFVMT05HIE9mZnNldCwgQllURSBEYXRhKQ0KK3sNCisgIFNldF9NTUlPX0Jhc2UoUENJX0JBU0UsIE9mZnNldCk7DQorICAqKEJZVEUgKikoUENJX0JBU0UgKyAweDEwMDAwICsgKE9mZnNldCAmIDB4ZmZmZikpID0gRGF0YTsNCit9DQorDQorVk9JRCAgTU91dHdtKFVMT05HIFBDSV9CQVNFLCBVTE9ORyBPZmZzZXQsIFVTSE9SVCBEYXRhKQ0KK3sNCisgIFNldF9NTUlPX0Jhc2UoUENJX0JBU0UsIE9mZnNldCk7DQorICAqKFVTSE9SVCAqKShQQ0lfQkFTRSArIDB4MTAwMDAgKyAoT2Zmc2V0ICYgMHhmZmZmKSkgPSBEYXRhOw0KK30NCisNCitWT0lEICBNT3V0ZHdtKFVMT05HIFBDSV9CQVNFLCBVTE9ORyBPZmZzZXQsIFVMT05HIERhdGEpDQorew0KKyAgU2V0X01NSU9fQmFzZShQQ0lfQkFTRSwgT2Zmc2V0KTsNCisgICooVUxPTkcgKikoUENJX0JBU0UgKyAweDEwMDAwICsgKE9mZnNldCAmIDB4ZmZmZikpID0gRGF0YTsNCit9DQorDQorQllURSAgTUluYm0oVUxPTkcgUENJX0JBU0UsIFVMT05HIE9mZnNldCkNCit7DQorICBCWVRFIGpEYXRhOw0KKw0KKyAgU2V0X01NSU9fQmFzZShQQ0lfQkFTRSwgT2Zmc2V0KTsNCisgIGpEYXRhID0gKihCWVRFICopKFBDSV9CQVNFICsgMHgxMDAwMCArIChPZmZzZXQgJiAweGZmZmYpKTsNCisgIHJldHVybihqRGF0YSk7DQorfQ0KKw0KK1VTSE9SVCAgTUlud20oVUxPTkcgUENJX0JBU0UsIFVMT05HIE9mZnNldCkNCit7DQorICBVU0hPUlQgdXNEYXRhOw0KKw0KKyAgU2V0X01NSU9fQmFzZShQQ0lfQkFTRSwgT2Zmc2V0KTsNCisgIHVzRGF0YSA9ICooVVNIT1JUICopKFBDSV9CQVNFICsgMHgxMDAwMCArIChPZmZzZXQgJiAweGZmZmYpKTsNCisgIHJldHVybih1c0RhdGEpOw0KK30NCisNCitVTE9ORyAgTUluZHdtKFVMT05HIFBDSV9CQVNFLCBVTE9ORyBPZmZzZXQpDQorew0KKyAgVUxPTkcgdWxEYXRhOw0KKw0KKyAgU2V0X01NSU9fQmFzZShQQ0lfQkFTRSwgT2Zmc2V0KTsNCisgIHVsRGF0YSA9ICooVUxPTkcgKikoUENJX0JBU0UgKyAweDEwMDAwICsgKE9mZnNldCAmIDB4ZmZmZikpOw0KKyAgcmV0dXJuKHVsRGF0YSk7DQorfQ0KKyNlbmRpZiAvLyBFbmQgU1BJX0JVUw0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL0lPLkggYi9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9JTy5ICm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZTAzZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9JTy5ICkBAIC0wLDAgKzEsMzYgQEAKKy8qDQorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorICoNCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQ0KKyAqLw0KKyNpZm5kZWYgSU9fSA0KKyNkZWZpbmUgSU9fSA0KKw0KKyNpbmNsdWRlICJTV0ZVTkMuSCINCisNCisvLw0KKy8vIE1hY3JvDQorLy8NCisjaWYgCWRlZmluZWQoTGludXhBUCkNCisgICAgI2RlZmluZSBkZWxheSh2YWwpCXVzbGVlcCh2YWwqMTAwMCkNCisgICAgI2RlZmluZSBvYihwLGQpIG91dGIoZCxwKQ0KKyAgICAjZGVmaW5lIGliKHApIGluYihwKQ0KKyNlbHNlDQorICAgICNkZWZpbmUgb2IocCxkKQlvdXRwKHAsZCkNCisgICAgI2RlZmluZSBpYihwKSBpbnAocCkNCisjZW5kaWYNCisNCisjaWZkZWYgVVNFX0xQQw0KK3ZvaWQgb3Blbl9hc3BlZWRfc2lvX3Bhc3N3b3JkKHZvaWQpOw0KK3ZvaWQgZW5hYmxlX2FzcGVlZF9MRFUoQllURSBqbGR1X251bWJlcik7DQoraW50IGZpbmRscGNwb3J0KEJZVEUgamxkdV9udW1iZXIpOw0KKyNlbmRpZg0KKw0KK3ZvaWQgV3JpdGVTT0NfREQoVUxPTkcgYWRkciwgVUxPTkcgZGF0YSk7DQorVUxPTkcgUmVhZFNPQ19ERChVTE9ORyBhZGRyKTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9JTy5jIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvSU8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmU5OTE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvSU8uYwpAQCAtMCwwICsxLDM1NiBAQAorLyoNCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisgKg0KKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBDQorICovDQorI2RlZmluZSBJT19DDQorc3RhdGljIGNvbnN0IGNoYXIgVGhpc0ZpbGVbXSA9ICJJTy5jIjsNCisNCisjaW5jbHVkZSAiU1dGVU5DLkgiDQorDQorI2lmIGRlZmluZWQoTGludXhBUCkNCisgICNpbmNsdWRlIDxzdGRpby5oPg0KKyAgI2luY2x1ZGUgPHN0cmluZy5oPg0KKyAgI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKyAgI2luY2x1ZGUgPHN0ZGFyZy5oPg0KKyAgI2luY2x1ZGUgPHVuaXN0ZC5oPg0KKyAgI2luY2x1ZGUgPHN0cmluZy5oPg0KKyAgI2luY2x1ZGUgPGZjbnRsLmg+DQorICAjaW5jbHVkZSA8cHRocmVhZC5oPg0KKyAgI2luY2x1ZGUgPHN5cy9tbWFuLmg+DQorICAjaW5jbHVkZSA8c3lzL2lvLmg+DQorI2VuZGlmDQorI2lmZGVmIFNMVF9VQk9PVA0KKyAgI2luY2x1ZGUgPGNvbW1vbi5oPg0KKyAgI2luY2x1ZGUgPGNvbW1hbmQuaD4NCisgICNpbmNsdWRlIDxwb3N0Lmg+DQorICAjaW5jbHVkZSA8bWFsbG9jLmg+DQorICAjaW5jbHVkZSA8bmV0Lmg+DQorICAjaW5jbHVkZSA8Q09NTUlORi5IPg0KKyNlbmRpZg0KKyNpZmRlZiBTTFRfRE9TDQorICAjaW5jbHVkZSA8c3RkbGliLmg+DQorICAjaW5jbHVkZSA8c3RkaW8uaD4NCisgICNpbmNsdWRlIDx0aW1lLmg+DQorICAjaW5jbHVkZSA8Y29uaW8uaD4NCisgICNpbmNsdWRlIDxkb3MuaD4NCisgICNpbmNsdWRlIDxtZW0uaD4NCisgICNpbmNsdWRlICJUWVBFREVGLkgiDQorICAjaW5jbHVkZSAiTElCLkgiDQorICAjaW5jbHVkZSAiQ09NTUlORi5IIg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlICJUWVBFREVGLkgiDQorI2luY2x1ZGUgIklPLkgiDQorI2luY2x1ZGUgIkxJQl9TUEkuSCINCisNCisjaWZkZWYgU1BJX0JVUw0KKyNlbmRpZg0KKyNpZmRlZiBVU0VfTFBDDQorICAgIFVTSE9SVAl1c0xQQ1BvcnQ7DQorI2VuZGlmDQorI2lmZGVmIFVTRV9QMkENCisjZW5kaWYNCisNCisjaWZkZWYgVVNFX0xQQw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLy8gTFBDIGFjY2Vzcw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBvcGVuX2FzcGVlZF9zaW9fcGFzc3dvcmQodm9pZCkNCit7DQorICAgIG9iICh1c0xQQ1BvcnQsIDB4YWEpOw0KKw0KKyAgICBvYiAodXNMUENQb3J0LCAweGE1KTsNCisgICAgb2IgKHVzTFBDUG9ydCwgMHhhNSk7DQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBjbG9zZV9hc3BlZWRfc2lvX3Bhc3N3b3JkKHZvaWQpDQorew0KKyAgICBvYiAodXNMUENQb3J0LCAweGFhKTsNCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIGVuYWJsZV9hc3BlZWRfTERVKEJZVEUgamxkdV9udW1iZXIpDQorew0KKyAgICBvYiAodXNMUENQb3J0LCAweDA3KTsNCisgICAgb2IgKCh1c0xQQ1BvcnQgKyAxKSwgamxkdV9udW1iZXIpOw0KKyAgICBvYiAodXNMUENQb3J0LCAweDMwKTsNCisgICAgb2IgKCh1c0xQQ1BvcnQgKyAxKSwgMHgwMSk7DQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBkaXNhYmxlX2FzcGVlZF9MRFUoQllURSBqbGR1X251bWJlcikNCit7DQorICAgIG9iICh1c0xQQ1BvcnQsIDB4MDcpOw0KKyAgICBvYiAoKHVzTFBDUG9ydCArIDEpLCBqbGR1X251bWJlcik7DQorICAgIG9iICh1c0xQQ1BvcnQsIDB4MzApOw0KKyAgICBvYiAoKHVzTFBDUG9ydCArIDEpLCAweDAwKTsNCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisvKg0KK3VsQWRkcmVzcyA9IEFIQiBhZGRyZXNzDQoram1vZGUgPSAwOiBieXRlIG1vZGUNCisgICAgICAgIDE6IHdvcmQgbW9kZQ0KKyAgICAgICAgMjogZHdvcmQgbW9kZQ0KKyovDQorc3RhdGljIFVMT05HIGxwY19yZWFkIChVTE9ORyB1bEFkZHJlc3MsIEJZVEUgam1vZGUpDQorew0KKyAgICBVTE9ORyAgICB1bGRhdGEgPSAwOw0KKyAgICBVTE9ORyAgICB1bHRlbXAgPSAwOw0KKyAgICBCWVRFICAgICBqdGVtcDsNCisNCisgICAgLy9Xcml0ZSBBZGRyZXNzDQorICAgIG9iICggIHVzTFBDUG9ydCwgICAgICAgIDB4ZjApOw0KKyAgICBvYiAoICh1c0xQQ1BvcnQgKyAxICApLCAoKHVsQWRkcmVzcyAmIDB4ZmYwMDAwMDApID4+IDI0KSk7DQorICAgIG9iICggIHVzTFBDUG9ydCwgICAgICAgIDB4ZjEpOw0KKyAgICBvYiAoICh1c0xQQ1BvcnQgKyAxKSAgLCAoKHVsQWRkcmVzcyAmIDB4MDBmZjAwMDApID4+IDE2KSk7DQorICAgIG9iICggIHVzTFBDUG9ydCwgICAgICAgIDB4ZjIpOw0KKyAgICBvYiAoICh1c0xQQ1BvcnQgKyAxKSwgICAoKHVsQWRkcmVzcyAmIDB4MDAwMGZmMDApID4+IDgpKTsNCisgICAgb2IgKCAgdXNMUENQb3J0LCAgICAgICAgMHhmMyk7DQorICAgIG9iICggKHVzTFBDUG9ydCArIDEpLCAgIHVsQWRkcmVzcyAmIDB4ZmYpOw0KKyAgICANCisgICAgLy9Xcml0ZSBNb2RlDQorICAgIG9iICh1c0xQQ1BvcnQsIDB4ZjgpOw0KKyAgICBqdGVtcCA9IGliICgodXNMUENQb3J0ICsgMSkpOw0KKyAgICBvYiAoKHVzTFBDUG9ydCArIDEpLCAoKGp0ZW1wICYgMHhmYykgfCBqbW9kZSkpOw0KKyAgICANCisgICAgLy9GaXJlDQorICAgIG9iICh1c0xQQ1BvcnQsIDB4ZmUpOw0KKyAgICBqdGVtcCA9IGliICgodXNMUENQb3J0ICsgMSkpOw0KKyAgICANCisgICAgLy9HZXQgRGF0YQ0KKyAgICBzd2l0Y2ggKCBqbW9kZSApDQorICAgIHsNCisgICAgICAgIGNhc2UgMDoNCisgICAgICAgICAgICBvYiAodXNMUENQb3J0LCAweGY3KTsNCisgICAgICAgICAgICB1bHRlbXAgID0gaWIgKCh1c0xQQ1BvcnQgKyAxKSk7DQorICAgICAgICAgICAgdWxkYXRhIHw9ICh1bHRlbXApOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgDQorICAgICAgICBjYXNlIDE6DQorICAgICAgICAgICAgb2IgKHVzTFBDUG9ydCwgMHhmNik7DQorICAgICAgICAgICAgdWx0ZW1wICA9IGliICgodXNMUENQb3J0ICsgMSkpOw0KKyAgICAgICAgICAgIHVsZGF0YSB8PSAodWx0ZW1wIDw8IDgpOw0KKyAgICAgICAgICAgIG9iICh1c0xQQ1BvcnQsIDB4ZjcpOw0KKyAgICAgICAgICAgIHVsdGVtcCAgPSBpYiAoKHVzTFBDUG9ydCArIDEpKTsNCisgICAgICAgICAgICB1bGRhdGEgfD0gKHVsdGVtcCA8PCAwKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIA0KKyAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICAgIG9iICh1c0xQQ1BvcnQsIDB4ZjQpOw0KKyAgICAgICAgICAgIHVsdGVtcCAgPSBpYiAoKHVzTFBDUG9ydCArIDEpKTsNCisgICAgICAgICAgICB1bGRhdGEgfD0gKHVsdGVtcCA8PCAyNCk7DQorICAgICAgICAgICAgb2IgKHVzTFBDUG9ydCwgMHhmNSk7DQorICAgICAgICAgICAgdWx0ZW1wICA9IGliICgodXNMUENQb3J0ICsgMSkpOw0KKyAgICAgICAgICAgIHVsZGF0YSB8PSAodWx0ZW1wIDw8IDE2KTsNCisgICAgICAgICAgICBvYiAodXNMUENQb3J0LCAweGY2KTsNCisgICAgICAgICAgICB1bHRlbXAgID0gaWIgKCh1c0xQQ1BvcnQgKyAxKSk7DQorICAgICAgICAgICAgdWxkYXRhIHw9ICh1bHRlbXAgPDwgOCk7DQorICAgICAgICAgICAgb2IgKHVzTFBDUG9ydCwgMHhmNyk7DQorICAgICAgICAgICAgdWx0ZW1wICA9IGliICgodXNMUENQb3J0ICsgMSkpOw0KKyAgICAgICAgICAgIHVsZGF0YSB8PSB1bHRlbXA7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0gLy8gRW5kIHN3aXRjaCAoIGptb2RlICkNCisNCisgICAgcmV0dXJuIHVsZGF0YTsNCit9IC8vIEVuZCBzdGF0aWMgVUxPTkcgbHBjX3JlYWQgKFVMT05HIHVsQWRkcmVzcywgQllURSBqbW9kZSkNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3N0YXRpYyB2b2lkIGxwY193cml0ZSAoVUxPTkcgdWxBZGRyZXNzLCBVTE9ORyB1bGRhdGEsIEJZVEUgam1vZGUpDQorew0KKyAgICBCWVRFICAgICBqdGVtcDsNCisNCisgICAgLy9Xcml0ZSBBZGRyZXNzDQorICAgIG9iICggdXNMUENQb3J0LCAgICAgIDB4ZjApOw0KKyAgICBvYiAoKHVzTFBDUG9ydCArIDEpLCAoKHVsQWRkcmVzcyAmIDB4ZmYwMDAwMDApID4+IDI0KSk7DQorICAgIG9iICggdXNMUENQb3J0LCAgICAgIDB4ZjEpOw0KKyAgICBvYiAoKHVzTFBDUG9ydCArIDEpLCAoKHVsQWRkcmVzcyAmIDB4MDBmZjAwMDApID4+IDE2KSk7DQorICAgIG9iICggdXNMUENQb3J0LCAgICAgIDB4ZjIpOw0KKyAgICBvYiAoKHVzTFBDUG9ydCArIDEpLCAoKHVsQWRkcmVzcyAmIDB4MDAwMGZmMDApID4+IDgpKTsNCisgICAgb2IgKCB1c0xQQ1BvcnQsICAgICAgMHhmMyk7DQorICAgIG9iICgodXNMUENQb3J0ICsgMSksIHVsQWRkcmVzcyAmIDB4ZmYpOw0KKyAgICANCisgICAgLy9Xcml0ZSBEYXRhDQorICAgIHN3aXRjaCAoIGptb2RlICkNCisgICAgew0KKyAgICAgICAgY2FzZSAwOg0KKyAgICAgICAgICAgIG9iICggdXNMUENQb3J0LCAgICAgIDB4ZjcpOw0KKyAgICAgICAgICAgIG9iICgodXNMUENQb3J0ICsgMSksICh1bGRhdGEgJiAweGZmKSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDE6DQorICAgICAgICAgICAgb2IgKCB1c0xQQ1BvcnQsICAgICAgMHhmNik7DQorICAgICAgICAgICAgb2IgKCh1c0xQQ1BvcnQgKyAxKSwgKCh1bGRhdGEgJiAweGZmMDApID4+IDgpKTsNCisgICAgICAgICAgICBvYiAoIHVzTFBDUG9ydCwgICAgICAweGY3KTsNCisgICAgICAgICAgICBvYiAoKHVzTFBDUG9ydCArIDEpLCAodWxkYXRhICYgMHgwMGZmKSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDI6DQorICAgICAgICAgICAgb2IgKCB1c0xQQ1BvcnQsICAgICAgMHhmNCk7DQorICAgICAgICAgICAgb2IgKCh1c0xQQ1BvcnQgKyAxKSwgKCh1bGRhdGEgJiAweGZmMDAwMDAwKSA+PiAyNCkpOw0KKyAgICAgICAgICAgIG9iICggdXNMUENQb3J0LCAgICAgIDB4ZjUpOw0KKyAgICAgICAgICAgIG9iICgodXNMUENQb3J0ICsgMSksICgodWxkYXRhICYgMHgwMGZmMDAwMCkgPj4gMTYpKTsNCisgICAgICAgICAgICBvYiAoIHVzTFBDUG9ydCwgICAgICAweGY2KTsNCisgICAgICAgICAgICBvYiAoKHVzTFBDUG9ydCArIDEpLCAoKHVsZGF0YSAmIDB4MDAwMGZmMDApID4+IDgpKTsNCisgICAgICAgICAgICBvYiAoIHVzTFBDUG9ydCwgICAgICAweGY3KTsNCisgICAgICAgICAgICBvYiAoKHVzTFBDUG9ydCArIDEpLCB1bGRhdGEgJiAweGZmKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgfSAvLyBFbmQgc3dpdGNoICggam1vZGUgKQ0KKyAgICANCisgICAgLy9Xcml0ZSBNb2RlDQorICAgIG9iICh1c0xQQ1BvcnQsIDB4ZjgpOw0KKyAgICBqdGVtcCA9IGliICgodXNMUENQb3J0ICsgMSkpOw0KKyAgICBvYiAoKHVzTFBDUG9ydCArIDEpLCAoKGp0ZW1wICYgMHhmYykgfCBqbW9kZSkpOw0KKw0KKyAgICAvL0ZpcmUNCisgICAgb2IgKHVzTFBDUG9ydCwgMHhmZSk7DQorICAgIG9iICgodXNMUENQb3J0ICsgMSksIDB4Y2YpOw0KKyAgICANCit9IC8vIEVuZCBzdGF0aWMgdm9pZCBscGNfd3JpdGUgKFVMT05HIHVsQWRkcmVzcywgVUxPTkcgdWxkYXRhLCBCWVRFIGptb2RlKQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorc3RhdGljIFVTSE9SVCB1c0xQQ1BvcnRMaXN0W10gPSB7MHgyZSwgMHg0ZSwgMHhmZn07DQoraW50IGZpbmRscGNwb3J0KEJZVEUgamxkdV9udW1iZXIpDQorew0KKyAgICBVU0hPUlQgICpqTFBDUG9ydFB0cjsNCisgICAgVUxPTkcgICB1bERhdGE7DQorDQorICAgIGpMUENQb3J0UHRyID0gdXNMUENQb3J0TGlzdDsNCisgICAgd2hpbGUgKCooVVNIT1JUICopKGpMUENQb3J0UHRyKSAhPSAweGZmICkNCisgICAgew0KKyAgICAgICAgdXNMUENQb3J0ID0gKihVU0hPUlQgKikoakxQQ1BvcnRQdHIrKyk7DQorDQorICAgICAgICBvcGVuX2FzcGVlZF9zaW9fcGFzc3dvcmQoKTsNCisgICAgICAgIGVuYWJsZV9hc3BlZWRfTERVKDB4MGQpOw0KKw0KKyAgICAgICAgdWxEYXRhICA9IGxwY19yZWFkKDB4MWU2ZTIwN2MsIDIpOw0KKyAgICAgICAgDQorICAgICAgICBpZiAoICh1bERhdGEgIT0gMHgwMDAwMDAwMCkJJiYNCisgICAgICAgICAgICAgKHVsRGF0YSAhPSAweEZGRkZGRkZGKSAgICkNCisgICAgICAgIHsNCisgICAgICAgICAgICBwcmludGYoIkZpbmQgTFBDIElPIHBvcnQgYXQgMHglMnggXG4iLCB1c0xQQ1BvcnQpOw0KKyAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgZGlzYWJsZV9hc3BlZWRfTERVKDB4MGQpOw0KKyAgICAgICAgY2xvc2VfYXNwZWVkX3Npb19wYXNzd29yZCgpOw0KKyAgICB9DQorDQorICAgIC8vcHJpbnRmKCJbRXJyb3JdIEZhaWwgdG8gZmluZCBwcm9wZXIgTFBDIElPIFBvcnQgXG4iKTsNCisgICAgcmV0dXJuIDA7DQorfQ0KKyNlbmRpZiAvLyBFbmQgaWZkZWYgVVNFX0xQQw0KKw0KKyNpZmRlZiBVU0VfUDJBDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisvLyBBMlAgQWNjZXNzDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIG1tX3dyaXRlIChVTE9ORyBhZGRyLCBVTE9ORyBkYXRhLCBCWVRFIGptb2RlKQ0KK3sNCisgICAgKihVTE9ORyAqKSAobW1pb2Jhc2UgKyAweEYwMDQpID0gKFVMT05HKSAoKGFkZHIpICYgMHhGRkZGMDAwMCk7DQorICAgICooVUxPTkcgKikgKG1taW9iYXNlICsgMHhGMDAwKSA9IChVTE9ORykgMHgwMDAwMDAwMTsNCisgICAgDQorICAgIHN3aXRjaCAoIGptb2RlICkNCisgICAgew0KKyAgICAgICAgY2FzZSAwOg0KKyAgICAgICAgICAgICooQllURSAqKSAobW1pb2Jhc2UgKyAweDEwMDAwICsgKChhZGRyKSAmIDB4MDAwMEZGRkYpKSA9IChCWVRFKSBkYXRhOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgICooVVNIT1JUICopIChtbWlvYmFzZSArIDB4MTAwMDAgKyAoKGFkZHIpICYgMHgwMDAwRkZGRikpID0gKFVTSE9SVCkgZGF0YTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMjoNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgKihVTE9ORyAqKSAobW1pb2Jhc2UgKyAweDEwMDAwICsgKChhZGRyKSAmIDB4MDAwMEZGRkYpKSA9IGRhdGE7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgIH0gLy9zd2l0Y2gNCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitVTE9ORyBtbV9yZWFkIChVTE9ORyBhZGRyLCBCWVRFIGptb2RlKQ0KK3sNCisgICAgKihVTE9ORyAqKSAobW1pb2Jhc2UgKyAweEYwMDQpID0gKFVMT05HKSAoKGFkZHIpICYgMHhGRkZGMDAwMCk7DQorICAgICooVUxPTkcgKikgKG1taW9iYXNlICsgMHhGMDAwKSA9IChVTE9ORykgMHgwMDAwMDAwMTsNCisgICAgc3dpdGNoIChqbW9kZSkNCisgICAgew0KKyAgICBjYXNlIDA6DQorICAgICAgICByZXR1cm4gKCAqKEJZVEUgKikgKG1taW9iYXNlICsgMHgxMDAwMCArICgoYWRkcikgJiAweDAwMDBGRkZGKSkgKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDE6DQorICAgICAgICByZXR1cm4gKCAqKFVTSE9SVCAqKSAobW1pb2Jhc2UgKyAweDEwMDAwICsgKChhZGRyKSAmIDB4MDAwMEZGRkYpKSApOw0KKyAgICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgIGNhc2UgMjoNCisgICAgICAgIHJldHVybiAoICooVUxPTkcgKikgKG1taW9iYXNlICsgMHgxMDAwMCArICgoYWRkcikgJiAweDAwMDBGRkZGKSkgKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICB9IC8vc3dpdGNoDQorDQorICAgIHJldHVybiAwOw0KK30NCisjZW5kaWYgLy8gRW5kIGlmZGVmIFVTRV9QMkENCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8vIEdlbmVyYWwgQWNjZXNzIEFQSQ0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorI2lmZGVmIFNMVF9VQk9PVA0KK0JZVEUgQ2hlY2tfQkVvckxOICggVUxPTkcgY2hrYWRkciApDQorew0KKyAgICBCWVRFIHJldCA9IEJJR19FTkRJQU5fQUREUkVTUzsNCisgICAgQllURSBpICAgPSAwOw0KKyAgICANCisgICAgZG8gew0KKyAgICAgICAgaWYgKCBMaXR0bGVFbmRpYW5BcmVhW2ldLlN0YXJ0QWRkciA9PSBMaXR0bGVFbmRpYW5BcmVhW2ldLkVuZEFkZHIgKQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgDQorICAgICAgICBpZiAoICggTGl0dGxlRW5kaWFuQXJlYVtpXS5TdGFydEFkZHIgPD0gY2hrYWRkciApICYmDQorICAgICAgICAgICAgICggTGl0dGxlRW5kaWFuQXJlYVtpXS5FbmRBZGRyICAgPj0gY2hrYWRkciApICAgICkgew0KKyAgICAgICAgICAgIHJldCA9IExJVFRMRV9FTkRJQU5fQUREUkVTUzsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGkrKzsNCisgICAgfSB3aGlsZSAoIDEgKTsNCisgICAgDQorICAgIHJldHVybiByZXQ7DQorfQ0KKyNlbmRpZg0KKw0KK3ZvaWQgV3JpdGVTT0NfREQoVUxPTkcgYWRkciwgVUxPTkcgZGF0YSkNCit7DQorI2lmZGVmIFNMVF9VQk9PVA0KKyAgICBpZiAoIENoZWNrX0JFb3JMTiggYWRkciApID09IEJJR19FTkRJQU5fQUREUkVTUyApDQorICAgICAgICAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoYWRkcikgPSBjcHVfdG9fbGUzMihkYXRhKTsNCisgICAgZWxzZQ0KKyAgICAgICAgKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKGFkZHIpID0gZGF0YTsNCisjZWxzZQ0KKyAgICAjaWZkZWYgVVNFX0xQQw0KKyAgICAgICAgbHBjX3dyaXRlKGFkZHIsIGRhdGEsIDIpOw0KKyAgICAjZW5kaWYNCisgICAgI2lmZGVmIFVTRV9QMkENCisgICAgICAgIG1tX3dyaXRlKGFkZHIsIGRhdGEsIDIpOw0KKyAgICAjZW5kaWYNCisjZW5kaWYNCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitVTE9ORyBSZWFkU09DX0REKFVMT05HIGFkZHIpDQorew0KKyNpZmRlZiBTTFRfVUJPT1QNCisgICAgaWYgKCBDaGVja19CRW9yTE4oIGFkZHIgKSA9PSBCSUdfRU5ESUFOX0FERFJFU1MgKQ0KKyAgICAgICAgcmV0dXJuIGxlMzJfdG9fY3B1KCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoYWRkcikpOw0KKyAgICBlbHNlDQorICAgICAgICByZXR1cm4gKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoYWRkcikpOw0KKyNlbHNlDQorICAgICNpZmRlZiBVU0VfTFBDDQorICAgICAgICByZXR1cm4gKGxwY19yZWFkKGFkZHIsIDIpKTsNCisgICAgI2VuZGlmDQorICAgICNpZmRlZiBVU0VfUDJBDQorICAgICAgICByZXR1cm4gKG1tX3JlYWQoYWRkciwgMikpOw0KKyAgICAjZW5kaWYNCisjZW5kaWYNCisgICAgcmV0dXJuIDA7DQorfQ0KKw0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL0xBTjkzMDMuYyBiL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL0xBTjkzMDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OThkNGZkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvTEFOOTMwMy5jCkBAIC0wLDAgKzEsNTI1IEBACisvKg0KKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KKyAqDQorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0ENCisgKi8NCisjZGVmaW5lIExBTjkzMDNfQw0KK3N0YXRpYyBjb25zdCBjaGFyIFRoaXNGaWxlW10gPSAiTEFOOTMwMy5jIjsNCisNCisjaW5jbHVkZSAiU1dGVU5DLkgiCisjaWZkZWYgU0xUX1VCT09UDQorICAjaW5jbHVkZSA8Q09NTUlORi5IPg0KKyAgI2luY2x1ZGUgPE1BQy5IPg0KKyAgI2luY2x1ZGUgPElPLkg+DQorI2VuZGlmDQorDQorI2lmZGVmIFNMVF9ET1MNCisgICNpbmNsdWRlICJDT01NSU5GLkgiDQorICAjaW5jbHVkZSA8c3RkbGliLmg+CisgICNpbmNsdWRlICJJTy5IIgorI2VuZGlmDQorDQorI2lmZGVmIFNVUFBPUlRfUEhZX0xBTjkzMDMKKy8vI2RlZmluZSBMQU45MzAzTQ0KKyNkZWZpbmUgSTJDX0RlYnVnICAgICAgICAgICAwDQorI2RlZmluZSBQcmludF9EV1JXICAgICAgICAgIDANCisjZGVmaW5lIFByaW50X1BIWVJXICAgICAgICAgMA0KKyNkZWZpbmUgSTJDX1RJTUVPVVQgICAgICAgICAxMDAwMDAwMA0KKw0KK1VMT05HICAgZGV2YmFzZTsNCitVTE9ORyAgIGJ1c251bTsNCitVTE9ORyAgIGJ5dGU7DQorVUxPTkcgICBkYXRhX3JkOw0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLy8gQmFzaWMNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgYWN0aW1lKFVMT05HIGFjMSwgVUxPTkcgYWMyLCBVTE9ORyAqZmFjdCwgVUxPTkcgKmNraCwgVUxPTkcgKmNrbCkNCit7DQorICAgICAgICBzdGF0aWMgaW50ICAgICAgZGl2Y250Ow0KKw0KKyAgICAgICAgYWMxID0gYWMxICogNTAgKyAxOw0KKyAgICAgICAgYWMyID0gYWMyICogNTAgKyAxOw0KKw0KKyAgICAgICAgZGl2Y250ID0gMDsNCisgICAgICAgIHdoaWxlIChhYzEgPiA4IHx8IGFjMiA+IDgpIHsNCisgICAgICAgICAgICAgICAgZGl2Y250Kys7DQorICAgICAgICAgICAgICAgIGFjMSA+Pj0gMTsNCisgICAgICAgICAgICAgICAgYWMyID4+PSAxOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKGFjMSA8IDIgICkgYWMxICA9IDI7DQorICAgICAgICBpZiAoYWMyIDwgMiAgKSBhYzIgID0gMjsNCisgICAgICAgIGlmIChhYzEgPiBhYzIpIGFjMiAgPSAxOw0KKyAgICAgICAgZWxzZSAgICAgICAgICAgYWMxICs9IDE7DQorDQorI2lmZGVmIFBSSU5UX01TRw0KKyAgICAgICAgcHJpbnRmKCJEaXZjbnQgPSAlZCwgY2tkaXYgPSAlZCwgY2toID0gJWQsIGNrbCA9ICVkXG4iLCgxPDxkaXZjbnQpKihhYzErYWMyKSxkaXZjbnQsYWMxLTEsYWMyLTEpOw0KKyAgICAgICAgcHJpbnRmKCJDS0ggPSAlZCB1cywgQ0tMID0gJWQgdXNcbiIsKDE8PGRpdmNudCkqYWMxLzUwLCgxPDxkaXZjbnQpKmFjMi81MCk7DQorI2VuZGlmDQorDQorICAgICAgICAqZmFjdCA9IGRpdmNudDsNCisgICAgICAgICpja2ggID0gYWMxIC0gMTsNCisgICAgICAgICpja2wgID0gYWMyIC0gMTsNCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitVTE9ORyBQb2xsU3RhdHVzKCkNCit7DQorICAgICAgICBzdGF0aWMgVUxPTkcgICAgc3RhdHVzOw0KKyAgICAgICAgc3RhdGljIFVMT05HICAgIGNudCA9IDA7DQorDQorICAgICAgICBkbyB7DQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IFJlYWRTT0NfREQoIGRldmJhc2UgKyAweDE0ICkgJiAweGZmOw0KKw0KKyAgICAgICAgICAgICAgICBpZiAoICsrY250ID4gSTJDX1RJTUVPVVQgKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbldhaXQxIFRpbWVvdXQgYXQgYnVzICVkIVxuIiwgYnVzbnVtKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlN0YXR1cyAxNCA9ICUwOHhcbiIsIFJlYWRTT0NfREQoZGV2YmFzZSArIDB4MTQpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDApOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICB9IHdoaWxlIChzdGF0dXMgIT0gMCk7DQorICAgICAgICANCisgICAgICAgIGNudCA9IDA7DQorICAgICAgICBkbyB7DQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IFJlYWRTT0NfREQoIGRldmJhc2UgKyAweDEwICk7DQorICAgICAgICAgICAgICAgIGlmICggKytjbnQgPiBJMkNfVElNRU9VVCApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuV2FpdDIgVGltZW91dCBhdCBidXMgJWQhXG4iLCBidXNudW0pOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiU3RhdHVzIDE0ID0gJTA4eFxuIiwgUmVhZFNPQ19ERChkZXZiYXNlICsgMHgxNCkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgIH0gd2hpbGUgKHN0YXR1cyA9PSAwKTsNCisNCisgICAgICAgIFdyaXRlU09DX0REKCBkZXZiYXNlICsgMHgxMCwgc3RhdHVzICk7DQorDQorICAgICAgICByZXR1cm4oc3RhdHVzKTsNCit9DQorDQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitVTE9ORyB3cml0ZWIoVUxPTkcgc3RhcnQsIFVMT05HIGRhdGEsIFVMT05HIHN0b3ApDQorew0KKyAgICAgICAgV3JpdGVTT0NfREQoIGRldmJhc2UgKyAweDIwLCBkYXRhKTsNCisgICAgICAgIFdyaXRlU09DX0REKCBkZXZiYXNlICsgMHgxNCwgMHgwMiB8IHN0YXJ0IHwgKHN0b3AgPDwgNSkgKTsNCisgICAgICAgIHJldHVybihQb2xsU3RhdHVzKCkpOw0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK1VMT05HIHJlYWRiKFVMT05HIGxhc3QsIFVMT05HIHN0b3ApDQorew0KKyAgICAgICAgc3RhdGljIFVMT05HICAgIGRhdGE7DQorDQorICAgICAgICBXcml0ZVNPQ19ERCggZGV2YmFzZSArIDB4MTQsIDB4MDggfCAobGFzdCA8PCA0KSB8IChzdG9wIDw8IDUpICk7DQorICAgICAgICBkYXRhID0gUG9sbFN0YXR1cygpOw0KKyAgICAgICAgDQorICAgICAgICBpZiAoZGF0YSAmIDB4NCkgew0KKyAgICAgICAgICAgICAgICBkYXRhID0gUmVhZFNPQ19ERCggZGV2YmFzZSArIDB4MjAgKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuKGRhdGEgPj4gOCk7DQorICAgICAgICB9IA0KKyAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgIHJldHVybigtMSk7DQorICAgICAgICB9DQorfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIEluaXRpYWwoVUxPTkcgYmFzZSwgVUxPTkcgY2toLCBVTE9ORyBja2wpDQorew0KKyAgICAgICAgc3RhdGljIFVMT05HICAgIGFja2g7DQorICAgICAgICBzdGF0aWMgVUxPTkcgICAgYWNrbDsNCisgICAgICAgIHN0YXRpYyBVTE9ORyAgICBkaXZ4Ow0KKw0KKyAgICAgICAgYWN0aW1lKGNraCwgY2tsLCAmZGl2eCwgJmFja2gsICZhY2tsKTsNCisgICAgICAgIFdyaXRlU09DX0REKGJhc2UgKyAweDAwLCAweDEpOw0KKyAgICAgICAgaWYgKFJlYWRTT0NfREQoYmFzZSArIDB4MDApICE9IDB4MSkgew0KKyAgICAgICAgICAgICAgICBwcmludGYoIkNvbnRyb2xsZXIgaW5pdGlhbCBmYWlsIDogJXhcbiIsYmFzZSk7DQorICAgICAgICAgICAgICAgIGV4aXQoMCk7DQorICAgICAgICB9DQorICAgICAgICBXcml0ZVNPQ19ERChiYXNlICsgMHgwNCwgMHg3NzcwMDM2MCB8IChhY2toIDw8IDE2KSB8IChhY2tsIDw8IDEyKSB8IGRpdngpOw0KKyAgICAgICAgV3JpdGVTT0NfREQoYmFzZSArIDB4MDgsIDB4MCk7DQorICAgICAgICBXcml0ZVNPQ19ERChiYXNlICsgMHgwYywgMHgwKTsNCisgICAgICAgIFdyaXRlU09DX0REKGJhc2UgKyAweDEwLCAweGZmZmZmZmZmKTsNCisgICAgICAgIFdyaXRlU09DX0REKGJhc2UgKyAweDE0LCAweDAwKTsNCisgICAgICAgIFdyaXRlU09DX0REKGJhc2UgKyAweDFDLCAweGZmMDAwMCk7DQorICAgICAgICBXcml0ZVNPQ19ERChiYXNlICsgMHgyMCwgMHgwMCk7DQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBwcmludF9zdGF0dXMoVUxPTkcgc3RhdHVzKQ0KK3sNCisgICAgICAgIGlmICggc3RhdHVzICYgMHgwMiApIHByaW50ZiggIkRldmljZSBOQUtcbiIgICAgICAgKTsNCisgICAgICAgIGlmICggc3RhdHVzICYgMHgwOCApIHByaW50ZiggIkFyYml0cmF0aW9uIExvc3NcbiIgKTsNCisgICAgICAgIGlmICggc3RhdHVzICYgMHgxMCApIHByaW50ZiggIlNUT1BcbiIgICAgICAgICAgICAgKTsNCisgICAgICAgIGlmICggc3RhdHVzICYgMHgyMCApIHByaW50ZiggIkFibm9ybWFsIFNUT1BcbiIgICAgKTsNCisgICAgICAgIGlmICggc3RhdHVzICYgMHg0MCApIHByaW50ZiggIlNDTCBMb3cgdGltZW91dFxuIiAgKTsNCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIHJlYWRtZSgpDQorew0KKyAgICAgICAgcHJpbnRmKCJcblZlcnNpb246JXNcbiIsIHZlcnNpb25fbmFtZSk7DQorI2lmZGVmIExBTjkzMDNNDQorICAgICAgICBwcmludGYoIkxBTjkzMDNNIFtidXNdIFt2aXJfUEhZX2Fkcl0gW3NwZWVkXSBbZnVuY11cbiIpOw0KKyNlbHNlDQorICAgICAgICBwcmludGYoIkxBTjkzMDMgW2J1c10gW3Zpcl9QSFlfYWRyXSBbc3BlZWRdIFtmdW5jXVxuIiApOw0KKyNlbmRpZg0KKyAgICAgICAgcHJpbnRmKCJbYnVzXSAgICAgICAgIHwgMX4xNDogSTJDIGJ1cyBudW1iZXJcbiIgICAgICAgKTsNCisgICAgICAgIHByaW50ZigiW3Zpcl9QSFlfYWRyXSB8IDB+MTogdmlydHVhbCBQSFkgYWRkcmVzc1xuIiAgICk7DQorICAgICAgICBwcmludGYoIltzcGVlZF0gICAgICAgfCAxOiAxMDBNXG4iICAgICAgICAgICAgICAgICAgICApOw0KKyAgICAgICAgcHJpbnRmKCIgICAgICAgICAgICAgIHwgMjogMTAgTVxuIiAgICAgICAgICAgICAgICAgICAgKTsNCisgICAgICAgIHByaW50ZigiW2Z1bmNdICAgICAgICB8IDA6IGV4dGVybmFsIGxvb3BiYWNrXG4iICAgICAgICk7DQorICAgICAgICBwcmludGYoIiAgICAgICAgICAgICAgfCAxOiBpbnRlcm5hbCBsb29wYmFja1xuIiAgICAgICApOw0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgcXVpdCgpDQorew0KKyAgICAgICAgV3JpdGVTT0NfREQoIGRldmJhc2UgKyAweDE0LCAweDIwICk7DQorICAgICAgICBQb2xsU3RhdHVzKCk7DQorICAgICAgICByZWFkbWUoKTsNCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisvLyBEb3VibGUtV29yZCBSZWFkL1dyaXRlDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitVTE9ORyBJMkNfRFdSZWFkKFVMT05HIGFkcikNCit7DQorICAgICAgICBzdGF0aWMgVUxPTkcgICAgc3RhdHVzOw0KKyAgICAgICAgaW50ICAgICAgICAgICAgIGk7DQorDQorICAgICAgICBJbml0aWFsKGRldmJhc2UsIDEwLCAxMCk7DQorICAgICAgICANCisgICAgICAgIGlmICggUHJpbnRfRFdSVyApIA0KKyAgICAgICAgICAgIHByaW50ZigiUkFkciAlMDJ4OiAiLCBhZHIpOw0KKw0KKyAgICAgICAgc3RhdHVzID0gd3JpdGViKCAxLCBMQU45MzAzX0kyQ19BRFIsIDAgKTsKKyAgICAgICAgaWYgKCBJMkNfRGVidWcgKSANCisgICAgICAgICAgICBwcmludGYoIlIxV1slMDJ4XSUwMnggIiwgc3RhdHVzLCBMQU45MzAzX0kyQ19BRFIpOworICAgICAgICAgICAgDQorICAgICAgICBpZiAoIHN0YXR1cyAhPSAweDEgKSB7DQorICAgICAgICAgICAgICAgIHByaW50X3N0YXR1cyhzdGF0dXMpOw0KKyAgICAgICAgICAgICAgICBxdWl0KCk7DQorICAgICAgICAgICAgICAgIGV4aXQoMCk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHN0YXR1cyA9IHdyaXRlYigwLCBhZHIsIDApOw0KKyAgICAgICAgaWYgKCBJMkNfRGVidWcgKSANCisgICAgICAgICAgICBwcmludGYoIlIyV1slMDJ4XSUwMnggIiwgc3RhdHVzLCBhZHIpOw0KKyAgICAgICAgaWYgKCAhKHN0YXR1cyAmIDB4MSkgKSB7DQorICAgICAgICAgICAgICAgIHByaW50X3N0YXR1cyhzdGF0dXMpOw0KKyAgICAgICAgICAgICAgICBxdWl0KCk7DQorICAgICAgICAgICAgICAgIGV4aXQoMCk7DQorICAgICAgICB9DQorDQorICAgICAgICBzdGF0dXMgPSB3cml0ZWIoMSwgTEFOOTMwM19JMkNfQURSIHwgMHgxLCAwKTsKKyAgICAgICAgaWYgKCBJMkNfRGVidWcgKSANCisgICAgICAgICAgICBwcmludGYoIlIzV1slMDJ4XSUwMnggIiwgc3RhdHVzLCBMQU45MzAzX0kyQ19BRFIgfCAweDEpOworICAgICAgICBpZiAoIHN0YXR1cyAhPSAweDEgKSB7DQorICAgICAgICAgICAgICAgIHByaW50X3N0YXR1cyhzdGF0dXMpOw0KKyAgICAgICAgICAgICAgICBxdWl0KCk7DQorICAgICAgICAgICAgICAgIGV4aXQoMCk7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoIEkyQ19EZWJ1ZyApIA0KKyAgICAgICAgICAgIHByaW50ZigiUjQiKTsNCisgICAgICAgICAgICANCisgICAgICAgIGRhdGFfcmQgPSAwOw0KKyAgICAgICAgZm9yIChpID0gMjQ7IGkgPj0gMDsgaS09OCkgew0KKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSBieXRlID0gcmVhZGIoMSwgMSk7DQorICAgICAgICAgICAgICAgIGVsc2UgICAgICAgIGJ5dGUgPSByZWFkYigwLCAwKTsNCisgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICBpZiAoIEkyQ19EZWJ1ZyApIA0KKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIsIGJ5dGUpOw0KKyAgICAgICAgICAgICAgICBkYXRhX3JkID0gZGF0YV9yZCB8IChieXRlIDw8IGkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKCBQcmludF9EV1JXICkgDQorICAgICAgICAgICAgcHJpbnRmKCIlMDh4XG4iLCBkYXRhX3JkKTsNCisNCisgICAgICAgIHJldHVybiAoZGF0YV9yZCk7DQorfSAvLyBFbmQgVUxPTkcgSTJDX0RXUmVhZChVTE9ORyBhZHIpDQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIEkyQ19EV1dyaXRlKFVMT05HIGFkciwgVUxPTkcgZHdkYXRhKQ0KK3sNCisgICAgICAgIHN0YXRpYyBVTE9ORyAgICBzdGF0dXM7DQorICAgICAgICBpbnQgICAgICAgICAgICAgaTsNCisgICAgICAgIFVMT05HICAgICAgICAgICBlbmR4Ow0KKw0KKyAgICAgICAgSW5pdGlhbChkZXZiYXNlLCAxMCwgMTApOw0KKyAgICAgICAgaWYgKFByaW50X0RXUlcpIA0KKyAgICAgICAgICAgIHByaW50ZigiV0FkciAlMDJ4OiAiLCBhZHIpOw0KKw0KKyAgICAgICAgc3RhdHVzID0gd3JpdGViKDEsIExBTjkzMDNfSTJDX0FEUiwgMCk7CisgICAgICAgIGlmICggSTJDX0RlYnVnICkgDQorICAgICAgICAgICAgcHJpbnRmKCJXMVslMDJ4XSUwMnggIiwgc3RhdHVzLCBMQU45MzAzX0kyQ19BRFIpOworICAgICAgICBpZiAoIHN0YXR1cyAhPSAweDEgKSB7DQorICAgICAgICAgICAgICAgIHByaW50X3N0YXR1cyhzdGF0dXMpOw0KKyAgICAgICAgICAgICAgICBxdWl0KCk7DQorICAgICAgICAgICAgICAgIGV4aXQoMCk7DQorICAgICAgICB9DQorICAgICAgICBzdGF0dXMgPSB3cml0ZWIoMCwgYWRyLCAwKTsNCisgICAgICAgIGlmICggSTJDX0RlYnVnICkgDQorICAgICAgICAgICAgcHJpbnRmKCJXMlslMDJ4XSUwMnggIiwgc3RhdHVzLCBhZHIpOw0KKyAgICAgICAgaWYgKCAhKHN0YXR1cyAmIDB4MSkgKSB7DQorICAgICAgICAgICAgICAgIHByaW50X3N0YXR1cyhzdGF0dXMpOw0KKyAgICAgICAgICAgICAgICBxdWl0KCk7DQorICAgICAgICAgICAgICAgIGV4aXQoMCk7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoSTJDX0RlYnVnKSANCisgICAgICAgICAgICBwcmludGYoIlczIik7DQorICAgICAgICBlbmR4ID0gMDsNCisgICAgICAgIGZvciAoaSA9IDI0OyBpID49IDA7IGktPTgpIHsNCisgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgDQorICAgICAgICAgICAgICAgICAgICBlbmR4ID0gMTsNCisgICAgICAgICAgICAgICAgYnl0ZSAgID0gKGR3ZGF0YSA+PiBpKSAmIDB4ZmY7DQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IHdyaXRlYigwLCBieXRlLCBlbmR4KTsNCisgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgaWYgKEkyQ19EZWJ1ZykgDQorICAgICAgICAgICAgICAgIHByaW50ZigiWyUwMnhdJTAyeCAiLCBzdGF0dXMsIGJ5dGUpOw0KKyAgICAgICAgICAgICAgICBpZiAoIShzdGF0dXMgJiAweDEpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfc3RhdHVzKHN0YXR1cyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcXVpdCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChQcmludF9EV1JXKSBwcmludGYoIiUwOHhcbiIsIGR3ZGF0YSk7DQorfSAvLyBFbmQgdm9pZCBJMkNfRFdXcml0ZShVTE9ORyBhZHIsIFVMT05HIGR3ZGF0YSkNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8vIFBIWSBSZWFkL1dyaXRlDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitVTE9ORyBMQU45MzAzX1BIWV9SZWFkKFVMT05HIHBoeV9hZHIsIFVMT05HIHJlZ19hZHIpDQorew0KKyAgICAgICAgc3RhdGljIFVMT05HICAgIGRhdGFfcmQ7DQorDQorICAgICAgICBJMkNfRFdXcml0ZSgweDJhLCAoKHBoeV9hZHIgJiAweDFmKSA8PCAxMSkgfCAoKHJlZ19hZHIgJiAweDFmKSA8PCA2KSk7Ly9bMEE4aF1QTUlfQUNDRVNTDQorICAgICAgICBkbyB7DQorICAgICAgICAgICAgZGF0YV9yZCA9IEkyQ19EV1JlYWQgKDB4MmEpOw0KKyAgICAgICAgfSB3aGlsZShkYXRhX3JkICYgMHgwMDAwMDAwMSk7Ly9bMEE4aF1QTUlfQUNDRVNTDQorDQorICAgICAgICBkYXRhX3JkID0gSTJDX0RXUmVhZCAoMHgyOSk7Ly9bMEE0aF1QTUlfREFUQQ0KKyAgICAgICAgaWYgKFByaW50X1BIWVJXKSANCisgICAgICAgICAgICBwcmludGYoIlBIWTolMmQsIFJlZzolMmQsIERhdGE6JTA4eFxuIiwgcGh5X2FkciwgcmVnX2FkciwgZGF0YV9yZCk7DQorICAgICAgICAgICAgDQorICAgICAgICByZXR1cm4oZGF0YV9yZCk7DQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBMQU45MzAzX1BIWV9Xcml0ZShVTE9ORyBwaHlfYWRyLCBVTE9ORyByZWdfYWRyLCBVTE9ORyBkYXRhX3dyKQ0KK3sNCisgICAgICAgIHN0YXRpYyBVTE9ORyAgICBkYXRhX3JkOw0KKw0KKyAgICAgICAgSTJDX0RXV3JpdGUoMHgyOSwgZGF0YV93cik7Ly9bMEE0aF1QTUlfREFUQQ0KKw0KKyAgICAgICAgSTJDX0RXV3JpdGUoMHgyYSwgKChwaHlfYWRyICYgMHgxZikgPDwgMTEpIHwgKChyZWdfYWRyICYgMHgxZikgPDwgNikgfCAweDIpOy8vWzBBOGhdUE1JX0FDQ0VTUw0KKyAgICAgICAgZG8gew0KKyAgICAgICAgICAgIGRhdGFfcmQgPSBJMkNfRFdSZWFkICgweDJhKTsNCisgICAgICAgIH0gd2hpbGUoZGF0YV9yZCAmIDB4MDAwMDAwMDEpOy8vWzBBOGhdUE1JX0FDQ0VTUw0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK1VMT05HIExBTjkzMDNfUEhZX1JlYWRfV0QoVUxPTkcgZGF0YV9jdGwpDQorew0KKyAgICAgICAgc3RhdGljIFVMT05HICAgIGRhdGFfcmQ7DQorDQorICAgICAgICBJMkNfRFdXcml0ZSgweDJhLCBkYXRhX2N0bCk7Ly9bMEE4aF1QTUlfQUNDRVNTDQorICAgICAgICBkbyB7DQorICAgICAgICAgICAgZGF0YV9yZCA9IEkyQ19EV1JlYWQgKDB4MmEpOw0KKyAgICAgICAgfSB3aGlsZShkYXRhX3JkICYgMHgwMDAwMDAwMSk7Ly9bMEE4aF1QTUlfQUNDRVNTDQorDQorICAgICAgICBkYXRhX3JkID0gSTJDX0RXUmVhZCAoMHgyOSk7Ly9bMEE0aF1QTUlfREFUQQ0KKyAgICAgICAgaWYgKFByaW50X1BIWVJXKSANCisgICAgICAgICAgICBwcmludGYoIldEIERhdGE6JTA4eFxuIiwgZGF0YV9jdGwpOw0KKyAgICAgICAgICAgIA0KKyAgICAgICAgcmV0dXJuKGRhdGFfcmQpOw0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgTEFOOTMwM19QSFlfV3JpdGVfV0QoVUxPTkcgZGF0YV9jdGwsIFVMT05HIGRhdGFfd3IpDQorew0KKyAgICAgICAgc3RhdGljIFVMT05HICAgIGRhdGFfcmQ7DQorDQorICAgICAgICBJMkNfRFdXcml0ZSggMHgyOSwgZGF0YV93ciAgKTsgLy9bMEE0aF1QTUlfREFUQQ0KKyAgICAgICAgSTJDX0RXV3JpdGUoIDB4MmEsIGRhdGFfY3RsICk7IC8vWzBBOGhdUE1JX0FDQ0VTUw0KKyAgICAgICAgZG8gew0KKyAgICAgICAgICAgIGRhdGFfcmQgPSBJMkNfRFdSZWFkICgweDJhKTsNCisgICAgICAgIH0gd2hpbGUoZGF0YV9yZCAmIDB4MDAwMDAwMDEpOyAvL1swQThoXVBNSV9BQ0NFU1MNCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisvLyBWaXJ0dWFsIFBIWSBSZWFkL1dyaXRlDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitVTE9ORyBMQU45MzAzX1ZpclBIWV9SZWFkKFVMT05HIHJlZ19hZHIpDQorew0KKyAgICAgICAgc3RhdGljIFVMT05HICAgIGRhdGFfcmQ7DQorDQorICAgICAgICBkYXRhX3JkID0gSTJDX0RXUmVhZCAoMHg3MCtyZWdfYWRyKTsvL1sxQzBoXQ0KKyAgICAgICAgaWYgKCBQcmludF9QSFlSVyApIA0KKyAgICAgICAgICAgIHByaW50ZigiVmlyUEhZIFJlZzolMmQsIERhdGE6JTA4eFxuIiwgcmVnX2FkciwgZGF0YV9yZCk7DQorICAgICAgICAgICAgDQorICAgICAgICByZXR1cm4oZGF0YV9yZCk7DQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBMQU45MzAzX1ZpclBIWV9Xcml0ZShVTE9ORyByZWdfYWRyLCBVTE9ORyBkYXRhX3dyKQ0KK3sNCisgICAgICAgIEkyQ19EV1dyaXRlKDB4NzArcmVnX2FkciwgZGF0YV93cik7Ly9bMUMwaF0NCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIExBTjkzMDNfVmlyUEhZX1JXKFVMT05HIHJlZ19hZHIsIFVMT05HIGRhdGFfY2xyLCBVTE9ORyBkYXRhX3NldCkNCit7DQorICAgICAgICBJMkNfRFdXcml0ZSgweDcwK3JlZ19hZHIsIChMQU45MzAzX1ZpclBIWV9SZWFkKHJlZ19hZHIpICYgKH5kYXRhX2NscikpIHwgZGF0YV9zZXQpOy8vWzFDMGhdDQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLy8gUEhZIFJlYWQvV3JpdGUNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK1VMT05HIExBTjkzMDNfUmVhZChVTE9ORyBhZHIpDQorew0KKyAgICAgICAgc3RhdGljIFVMT05HICAgIGRhdGFfcmQ7DQorDQorICAgICAgICBJMkNfRFdXcml0ZSgweDZjLCAweGMwMGYwMDAwIHwgYWRyICYgMHhmZmZmKTsvL1sxQjBoXVNXSVRDSF9DU1JfQ01EDQorICAgICAgICBkbyB7DQorICAgICAgICAgICAgZGF0YV9yZCA9IEkyQ19EV1JlYWQgKDB4NmMpOw0KKyAgICAgICAgfSB3aGlsZShkYXRhX3JkICYgMHg4MDAwMDAwMCk7Ly9bMUIwaF1TV0lUQ0hfQ1NSX0NNRA0KKw0KKyAgICAgICAgcmV0dXJuKEkyQ19EV1JlYWQgKDB4NmIpKTsvL1sxQUNoXVNXSVRDSF9DU1JfREFUQQ0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgTEFOOTMwM19Xcml0ZShVTE9ORyBhZHIsIFVMT05HIGRhdGEpDQorew0KKyAgICAgICAgc3RhdGljIFVMT05HICAgIGRhdGFfcmQ7DQorDQorICAgICAgICBJMkNfRFdXcml0ZSgweDZiLCBkYXRhKTsvL1sxQUNoXVNXSVRDSF9DU1JfREFUQQ0KKyAgICAgICAgSTJDX0RXV3JpdGUoMHg2YywgMHg4MDBmMDAwMCB8IGFkciAmIDB4ZmZmZik7Ly9bMUIwaF1TV0lUQ0hfQ1NSX0NNRA0KKw0KKyAgICAgICAgZG8gew0KKyAgICAgICAgICAgIGRhdGFfcmQgPSBJMkNfRFdSZWFkICgweDZjKTsNCisgICAgICAgIH0gd2hpbGUoZGF0YV9yZCAmIDB4ODAwMDAwMDApOy8vWzFCMGhdU1dJVENIX0NTUl9DTUQNCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIExBTjkzMDMoaW50IG51bSwgaW50IHBoeV9hZHIsIGludCBzcGVlZCwgaW50IGludF9sb29wYmFjaykNCit7DQorICAgICAgICBzdGF0aWMgVUxPTkcgICAgZGF0YV9yZDsNCisNCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisgICAgLy8gSTJDIEluaXRpYWwNCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisgICAgICAgIGJ1c251bSA9IG51bTsNCisgICAgICAgIGlmIChidXNudW0gPD0gNykgZGV2YmFzZSA9IDB4MUU3OEEwMDAgKyAoIGJ1c251bSAgICAqIDB4NDApOw0KKyAgICAgICAgZWxzZSAgICAgICAgICAgICBkZXZiYXNlID0gMHgxRTc4QTMwMCArICgoYnVzbnVtLTgpICogMHg0MCk7DQorICAgICAgICBJbml0aWFsKGRldmJhc2UsIDEwLCAxMCk7DQorDQorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorICAgIC8vIExBTjkzMDMgUmVnaXN0ZXIgU2V0dGluZw0KKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyAgICBwcmludGYoIi0tLS0+IFN0YXJ0XG4iKTsNCisgICAgICAgIGlmIChpbnRfbG9vcGJhY2sgPT0gMCkgeyANCisgICAgICAgICAgICAvL0ZvcmNlIFNwZWVkICYgZXh0ZXJuYWwgbG9vcGJhY2sNCisgICAgICAgICAgICAgICAgaWYgKHNwZWVkID09IDEpIHsgLy8xMDBNDQorICAgICAgICAgICAgICAgICAgICAgICAgTEFOOTMwM19WaXJQSFlfUlcoICAwLCAweGZmZmYsIDB4MjMwMCApOyAgICAgIC8vYWRyIGNsciBzZXQgLy9WUEhZX0JBU0lDX0NUUkwNCisgICAgICAgICAgICAgICAgICAgICAgICBMQU45MzAzX1ZpclBIWV9SVyggMTEsIDB4ZmZmZiwgMHgyMzAwICk7ICAgICAgLy9hZHIgY2xyIHNldCAvL1AxX01JSV9CQVNJQ19DT05UUk9MDQorICAgICAgICAgICAgICAgICAgICAgICAgTEFOOTMwM19QSFlfV3JpdGUoIHBoeV9hZHIgKyAxLCAwLCAweDIzMDAgKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBMQU45MzAzX1BIWV9Xcml0ZSggcGh5X2FkciArIDIsIDAsIDB4MjMwMCApOw0KKyAgICAgICAgICAgICAgICB9IA0KKyAgICAgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBMQU45MzAzX1ZpclBIWV9SVyggIDAsIDB4ZmZmZiwgMHgwMTAwICk7ICAgICAgLy9hZHIgY2xyIHNldCAvL1ZQSFlfQkFTSUNfQ1RSTA0KKyAgICAgICAgICAgICAgICAgICAgICAgIExBTjkzMDNfVmlyUEhZX1JXKCAxMSwgMHhmZmZmLCAweDAxMDAgKTsgICAgICAvL2FkciBjbHIgc2V0IC8vUDFfTUlJX0JBU0lDX0NPTlRST0wNCisgICAgICAgICAgICAgICAgICAgICAgICBMQU45MzAzX1BIWV9Xcml0ZSggcGh5X2FkciArIDEsIDAsIDB4MDEwMCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgTEFOOTMwM19QSFlfV3JpdGUoIHBoeV9hZHIgKyAyLCAwLCAweDAxMDApOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIExBTjkzMDNfV3JpdGUoIDB4MTgwYywgMHgwMDAwMDAwMSApOyAvLyBTV0VfVkxBTl9XUl9EQVRBDQorICAgICAgICAgICAgICAgIExBTjkzMDNfV3JpdGUoIDB4MTgwYiwgMHgwMDAwMDAxMCApOyAvLyBTV0VfVkxBTl9DTUQNCisgICAgICAgICAgICAgICAgZG8ge2RhdGFfcmQgPSBMQU45MzAzX1JlYWQgKDB4MTgxMCk7fSB3aGlsZShkYXRhX3JkICYgMHgxKTsNCisNCisgICAgICAgICAgICAgICAgTEFOOTMwM19Xcml0ZSggMHgxODBjLCAweDAwMDAwMDAyICk7IC8vIFNXRV9WTEFOX1dSX0RBVEENCisgICAgICAgICAgICAgICAgTEFOOTMwM19Xcml0ZSggMHgxODBiLCAweDAwMDAwMDExICk7IC8vIFNXRV9WTEFOX0NNRA0KKyAgICAgICAgICAgICAgICBkbyB7ZGF0YV9yZCA9IExBTjkzMDNfUmVhZCAoMHgxODEwKTt9IHdoaWxlKGRhdGFfcmQgJiAweDEpOw0KKw0KKyAgICAgICAgICAgICAgICBMQU45MzAzX1dyaXRlKCAweDE4MGMsIDB4MDAwMDAwMDMgKTsgLy8gU1dFX1ZMQU5fV1JfREFUQQ0KKyAgICAgICAgICAgICAgICBMQU45MzAzX1dyaXRlKCAweDE4MGIsIDB4MDAwMDAwMTIgKTsgLy8gU1dFX1ZMQU5fQ01EDQorICAgICAgICAgICAgICAgIGRvIHtkYXRhX3JkID0gTEFOOTMwM19SZWFkICgweDE4MTApO30gd2hpbGUoZGF0YV9yZCAmIDB4MSk7DQorDQorI2lmZGVmIExBTjkzMDNNDQorICAgICAgICAgICAgICAgIExBTjkzMDNfV3JpdGUoIDB4MTgwYywgMHgwMDAyMjAwMSApOyAvLyBTV0VfVkxBTl9XUl9EQVRBDQorICAgICAgICAgICAgICAgIExBTjkzMDNfV3JpdGUoIDB4MTgwYiwgMHgwMDAwMDAwMCApOyAvLyBTV0VfVkxBTl9DTUQNCisgICAgICAgICAgICAgICAgZG8ge2RhdGFfcmQgPSBMQU45MzAzX1JlYWQgKDB4MTgxMCk7fSB3aGlsZShkYXRhX3JkICYgMHgxKTsNCisNCisgICAgICAgICAgICAgICAgTEFOOTMwM19Xcml0ZSggMHgxODBjLCAweDAwMDI0MDAyICk7IC8vIFNXRV9WTEFOX1dSX0RBVEENCisgICAgICAgICAgICAgICAgTEFOOTMwM19Xcml0ZSggMHgxODBiLCAweDAwMDAwMDAxICk7IC8vIFNXRV9WTEFOX0NNRA0KKyAgICAgICAgICAgICAgICBkbyB7ZGF0YV9yZCA9IExBTjkzMDNfUmVhZCAoMHgxODEwKTt9IHdoaWxlKGRhdGFfcmQgJiAweDEpOw0KKw0KKyAgICAgICAgICAgICAgICBMQU45MzAzX1dyaXRlKCAweDE4MGMsIDB4MDAwMmEwMDMgKTsgLy8gU1dFX1ZMQU5fV1JfREFUQQ0KKyAgICAgICAgICAgICAgICBMQU45MzAzX1dyaXRlKCAweDE4MGIsIDB4MDAwMDAwMDIgKTsgLy8gU1dFX1ZMQU5fQ01EDQorICAgICAgICAgICAgICAgIGRvIHtkYXRhX3JkID0gTEFOOTMwM19SZWFkICgweDE4MTApO30gd2hpbGUoZGF0YV9yZCAmIDB4MSk7DQorI2Vsc2UNCisgICAgICAgICAgICAgICAgTEFOOTMwM19Xcml0ZSggMHgxODBjLCAweDAwMDJhMDAxICk7IC8vIFNXRV9WTEFOX1dSX0RBVEENCisgICAgICAgICAgICAgICAgTEFOOTMwM19Xcml0ZSggMHgxODBiLCAweDAwMDAwMDAwICk7IC8vIFNXRV9WTEFOX0NNRA0KKyAgICAgICAgICAgICAgICBkbyB7ZGF0YV9yZCA9IExBTjkzMDNfUmVhZCAoMHgxODEwKTt9IHdoaWxlKGRhdGFfcmQgJiAweDEpOw0KKw0KKyAgICAgICAgICAgICAgICBMQU45MzAzX1dyaXRlKCAweDE4MGMsIDB4MDAwMGEwMDIgKTsgLy8gU1dFX1ZMQU5fV1JfREFUQQ0KKyAgICAgICAgICAgICAgICBMQU45MzAzX1dyaXRlKCAweDE4MGIsIDB4MDAwMDAwMDEgKTsgLy8gU1dFX1ZMQU5fQ01EDQorICAgICAgICAgICAgICAgIGRvIHtkYXRhX3JkID0gTEFOOTMwM19SZWFkICgweDE4MTApO30gd2hpbGUoZGF0YV9yZCAmIDB4MSk7DQorDQorICAgICAgICAgICAgICAgIExBTjkzMDNfV3JpdGUoIDB4MTgwYywgMHgwMDAyMjAwMyApOyAvLyBTV0VfVkxBTl9XUl9EQVRBDQorICAgICAgICAgICAgICAgIExBTjkzMDNfV3JpdGUoIDB4MTgwYiwgMHgwMDAwMDAwMiApOyAvLyBTV0VfVkxBTl9DTUQNCisgICAgICAgICAgICAgICAgZG8ge2RhdGFfcmQgPSBMQU45MzAzX1JlYWQgKDB4MTgxMCk7fSB3aGlsZShkYXRhX3JkICYgMHgxKTsNCisjZW5kaWYNCisgICAgICAgICAgICAgICAgTEFOOTMwM19Xcml0ZSggMHgxODQwLCAweDAwMDAwMDA3KTsNCisgICAgICAgIH0gDQorICAgICAgICBlbHNlIGlmICggaW50X2xvb3BiYWNrID09IDEgKSB7IA0KKyAgICAgICAgICAgIC8vRm9yY2UgU3BlZWQgJiBpbnRlcm5hbCBsb29wYmFjaw0KKyAgICAgICAgICAgICAgICBpZiAoIHNwZWVkID09IDEgKSB7IA0KKyAgICAgICAgICAgICAgICAgICAgLy8xMDBNDQorICAgICAgICAgICAgICAgICAgICAgICAgTEFOOTMwM19WaXJQSFlfUlcoICAwLCAweGZmZmYsIDB4NjMwMCApOyAvLyBhZHIgY2xyIHNldCAvL1ZQSFlfQkFTSUNfQ1RSTA0KKyAgICAgICAgICAgICAgICAgICAgICAgIExBTjkzMDNfVmlyUEhZX1JXKCAxMSwgMHhmZmZmLCAweDYzMDAgKTsgLy8gYWRyIGNsciBzZXQgLy9QMV9NSUlfQkFTSUNfQ09OVFJPTA0KKyAgICAgICAgICAgICAgICAgICAgICAgIExBTjkzMDNfUEhZX1dyaXRlKCBwaHlfYWRyICsgMSwgMCwgMHg2MzAwICk7DQorICAgICAgICAgICAgICAgICAgICAgICAgTEFOOTMwM19QSFlfV3JpdGUoIHBoeV9hZHIgKyAyLCAwLCAweDYzMDAgKTsNCisgICAgICAgICAgICAgICAgfSANCisgICAgICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgTEFOOTMwM19WaXJQSFlfUlcoICAwLCAweGZmZmYsIDB4NDEwMCApOyAvLyBhZHIgY2xyIHNldCAvL1ZQSFlfQkFTSUNfQ1RSTA0KKyAgICAgICAgICAgICAgICAgICAgICAgIExBTjkzMDNfVmlyUEhZX1JXKCAxMSwgMHhmZmZmLCAweDQxMDAgKTsgLy8gYWRyIGNsciBzZXQgLy9QMV9NSUlfQkFTSUNfQ09OVFJPTA0KKyAgICAgICAgICAgICAgICAgICAgICAgIExBTjkzMDNfUEhZX1dyaXRlKCBwaHlfYWRyICsgMSwgMCwgMHg0MTAwICk7DQorICAgICAgICAgICAgICAgICAgICAgICAgTEFOOTMwM19QSFlfV3JpdGUoIHBoeV9hZHIgKyAyLCAwLCAweDQxMDAgKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgfSANCisgICAgICAgIGVsc2UgeyANCisgICAgICAgICAgICAvL0ZvcmNlIFNwZWVkDQorICAgICAgICAgICAgICAgIGlmIChzcGVlZCA9PSAxKSB7IA0KKyAgICAgICAgICAgICAgICAgICAgLy8xMDBNDQorICAgICAgICAgICAgICAgICAgICAgICAgTEFOOTMwM19WaXJQSFlfUlcoICAwLCAweGZmZmYsIDB4MjMwMCApOyAvLyBhZHIgY2xyIHNldCAvL1ZQSFlfQkFTSUNfQ1RSTA0KKyAgICAgICAgICAgICAgICAgICAgICAgIExBTjkzMDNfVmlyUEhZX1JXKCAxMSwgMHhmZmZmLCAweDIzMDAgKTsgLy8gYWRyIGNsciBzZXQgLy9QMV9NSUlfQkFTSUNfQ09OVFJPTA0KKyAgICAgICAgICAgICAgICAgICAgICAgIExBTjkzMDNfUEhZX1dyaXRlKCBwaHlfYWRyICsgMSwgMCwgMHgyMzAwICk7DQorICAgICAgICAgICAgICAgICAgICAgICAgTEFOOTMwM19QSFlfV3JpdGUoIHBoeV9hZHIgKyAyLCAwLCAweDIzMDAgKTsNCisgICAgICAgICAgICAgICAgfSANCisgICAgICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgTEFOOTMwM19WaXJQSFlfUlcoICAwLCAweGZmZmYsIDB4MDEwMCApOyAvLyBhZHIgY2xyIHNldCAvL1ZQSFlfQkFTSUNfQ1RSTA0KKyAgICAgICAgICAgICAgICAgICAgICAgIExBTjkzMDNfVmlyUEhZX1JXKCAxMSwgMHhmZmZmLCAweDAxMDAgKTsgLy8gYWRyIGNsciBzZXQgLy9QMV9NSUlfQkFTSUNfQ09OVFJPTA0KKyAgICAgICAgICAgICAgICAgICAgICAgIExBTjkzMDNfUEhZX1dyaXRlKCBwaHlfYWRyICsgMSwgMCwgMHgwMTAwICk7DQorICAgICAgICAgICAgICAgICAgICAgICAgTEFOOTMwM19QSFlfV3JpdGUoIHBoeV9hZHIgKyAyLCAwLCAweDAxMDAgKTsNCisgICAgICAgICAgICAgICAgfQ0KKyNpZmRlZiBMQU45MzAzTQ0KKyNlbHNlDQorICAgICAgICAgICAgICAgIGlmIChpbnRfbG9vcGJhY2sgPT0gMykgeyANCisgICAgICAgICAgICAgICAgICAgIC8vW0xBTjkzMDNdSUVFRSBtZWFzdXJlbWVudA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfcmQgPSBMQU45MzAzX1BIWV9SZWFkKHBoeV9hZHIrMSwgMjcpOy8vUEhZX1NQRUNJQUxfQ09OVFJPTF9TVEFUX0lORF94DQorICAgICAgICAgICAgICAgICAgICAgICAgTEFOOTMwM19QSFlfV3JpdGUocGh5X2FkcisxLCAyNywgKGRhdGFfcmQgJiAweDlmZmYpIHwgMHg4MDAwKTsvL1BIWV9TUEVDSUFMX0NPTlRST0xfU1RBVF9JTkRfeA0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfcmQgPSBMQU45MzAzX1BIWV9SZWFkKHBoeV9hZHIrMiwgMjcpOy8vUEhZX1NQRUNJQUxfQ09OVFJPTF9TVEFUX0lORF94DQorICAgICAgICAgICAgICAgICAgICAgICAgTEFOOTMwM19QSFlfV3JpdGUocGh5X2FkcisyLCAyNywgKGRhdGFfcmQgJiAweDlmZmYpIHwgMHg4MDAwKTsvL1BIWV9TUEVDSUFMX0NPTlRST0xfU1RBVF9JTkRfeA0KKyAgICAgICAgICAgICAgICB9DQorI2VuZGlmDQorICAgICAgICB9IC8vIEVuZCBpZiAoaW50X2xvb3BiYWNrID09IDApDQorfSAvLyBFbmQgdm9pZCBMQU45MzAzKGludCBudW0sIGludCBwaHlfYWRyLCBpbnQgc3BlZWQsIGludCBpbnRfbG9vcGJhY2spDQorI2VuZGlmIC8vIFNVUFBPUlRfUEhZX0xBTjkzMDMKKw0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL0xJQi5IIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvTElCLkgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjNjFkZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL0xJQi5ICkBAIC0wLDAgKzEsMzcgQEAKKy8qDQorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorICoNCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQ0KKyAqLw0KKyNpZm5kZWYgTElCX0gNCisjZGVmaW5lIExJQl9IDQorDQorI2luY2x1ZGUgIlRZUEVERUYuSCINCisNCisvLw0KKy8vIE1hY3JvDQorLy8NCisjZGVmaW5lICAgSU5URlVOQyAgICAgICAgICAgICAgaW50Mzg2DQorDQorI2RlZmluZSAgIE9VVERXUE9SVCAgICAgICAgIAlvdXRwZA0KKyNkZWZpbmUgICBJTkRXUE9SVCAgICAgICAgICAJaW5wZA0KKyNkZWZpbmUgICBPVVRQVVQgICAgICAgICAgICAJb3V0cA0KKyNkZWZpbmUgICBJTlBVVCAgICAgICAgICAgICAJaW5wDQorDQorLy8NCisvLyBQQ0kNCisvLw0KK1VMT05HIFJlYWRQQ0lSZWcgKFVMT05HIHVsUENJQ29uZmlnQWRkcmVzcywgQllURSBqT2ZmZXN0LCBVTE9ORyB1bE1hc2spOw0KK1VMT05HIEZpbmRQQ0lEZXZpY2UgKFVTSE9SVCB1c1ZlbmRvcklELCBVU0hPUlQgdXNEZXZpY2VJRCwgVVNIT1JUIHVzQnVzVHlwZSk7DQorVk9JRCAgV3JpdGVQQ0lSZWcgKFVMT05HIHVsUENJQ29uZmlnQWRkcmVzcywgQllURSBqT2ZmZXN0LCBVTE9ORyB1bE1hc2ssIFVMT05HIHVsRGF0YSk7DQorDQorLy8NCisvLyBNYXAgUmVzb3VyY2UNCisvLw0KK1VMT05HICAgIE1hcFBoeXNpY2FsVG9MaW5lYXIgKFVMT05HIHVsQmFzZUFkZHJlc3MsIFVMT05HIHVsU2l6ZSk7DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvTElCLmMgYi9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9MSUIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmEwYzU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvTElCLmMKQEAgLTAsMCArMSwxODQgQEAKKy8qDQorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorICoNCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQ0KKyAqLw0KKyNkZWZpbmUgTElCX0MNCitzdGF0aWMgY29uc3QgY2hhciBUaGlzRmlsZVtdID0gIkxJQi5jIjsNCisNCisjaW5jbHVkZSAiU1dGVU5DLkgiDQorDQorI2lmZGVmIFNMVF9VQk9PVA0KKyAgI2luY2x1ZGUgPGNvbW1vbi5oPg0KKyAgI2luY2x1ZGUgPGNvbW1hbmQuaD4NCisjZW5kaWYNCisjaWZkZWYgU0xUX0RPUw0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSA8dGltZS5oPg0KKyNpbmNsdWRlIDxjb25pby5oPg0KKyNpbmNsdWRlIDxkb3MuaD4NCisjaW5jbHVkZSA8bWVtLmg+DQorI2VuZGlmDQorDQorI2luY2x1ZGUgIkxJQi5IIg0KKyNpbmNsdWRlICJUWVBFREVGLkgiDQorDQorI2lmZGVmIFVTRV9QMkENCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8vIFBDSQ0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorVUxPTkcgUmVhZFBDSVJlZyAoVUxPTkcgdWxQQ0lDb25maWdBZGRyZXNzLCBCWVRFIGpPZmZlc3QsIFVMT05HIHVsTWFzaykNCit7DQorI2lmbmRlZiBXaW5kb3dzDQorICAgIE9VVERXUE9SVCgweGNmOCwgdWxQQ0lDb25maWdBZGRyZXNzICsgak9mZmVzdCk7DQorDQorICAgIHJldHVybiAoKChVTE9ORylJTkRXUE9SVCgweGNmYykpICYgdWxNYXNrKTsNCisjZWxzZQ0KKyAgICBXUklURV9QT1JUX1VMT05HKChQVUxPTkcpMHhjZjgsIHVsUENJQ29uZmlnQWRkcmVzcyArIGpPZmZlc3QpOw0KKyAgICANCisgICAgcmV0dXJuIChSRUFEX1BPUlRfVUxPTkcoKFBVTE9ORykweGNmYykgJiB1bE1hc2spOw0KKyNlbmRpZg0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK1ZPSUQgV3JpdGVQQ0lSZWcgKFVMT05HIHVsUENJQ29uZmlnQWRkcmVzcywgQllURSBqT2ZmZXN0LCBVTE9ORyB1bE1hc2ssIFVMT05HIHVsRGF0YSkNCit7DQorI2lmbmRlZiBXaW5kb3dzDQorICAgIE9VVERXUE9SVCgweGNmOCwgdWxQQ0lDb25maWdBZGRyZXNzICsgak9mZmVzdCk7DQorICAgIE9VVERXUE9SVCgweGNmYywgKElORFdQT1JUKDB4Y2ZjKSAmIHVsTWFzayB8IHVsRGF0YSkpOw0KKyNlbHNlDQorICAgIFdSSVRFX1BPUlRfVUxPTkcoKFBVTE9ORykweGNmOCwgdWxQQ0lDb25maWdBZGRyZXNzICsgak9mZmVzdCk7DQorICAgIFdSSVRFX1BPUlRfVUxPTkcoKFBVTE9ORykweGNmYywgKFJFQURfUE9SVF9VTE9ORygoUFVMT05HKTB4Y2ZjKSAmIHVsTWFzayB8IHVsRGF0YSkpOw0KKyNlbmRpZg0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK1VMT05HIEZpbmRQQ0lEZXZpY2UgKFVTSE9SVCB1c1ZlbmRvcklELCBVU0hPUlQgdXNEZXZpY2VJRCwgVVNIT1JUIHVzQnVzVHlwZSkNCit7DQorLy9SZXR1cm46IHVsUENJQ29uZmlnQWRkcmVzcw0KKy8vdXNCdXNUeXBlOiBBQ1RJVkUvUENJL0FHUC9QQ0ktRQ0KKw0KKyAgICBVTE9ORyAgIEJhc2VbMjU2XTsNCisgICAgVUxPTkcgICBlYng7DQorICAgIFVTSE9SVCAgaTsNCisgICAgVVNIT1JUICBqOw0KKyAgICANCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7DQorICAgICAgICBCYXNlW2ldID0gMHg4MDAwMDAwMCArIDB4MTAwMDAgKiBpOw0KKyAgICB9DQorICAgIA0KKyAgICBpZiAodXNCdXNUeXBlID09IFBDSSkNCisgICAgew0KKyAgICAgIGVieCA9IDB4ODAwMDAwMDA7DQorICAgIH0NCisgICAgZWxzZSBpZiAodXNCdXNUeXBlID09IFBDSUUpDQorICAgIHsNCisgICAgICBlYnggPSAweDgwMDIwMDAwOw0KKyAgICB9DQorICAgIGVsc2UgICAgIC8vIEFHUCBhbmQgQUNUSVZFDQorICAgIHsNCisgICAgICBlYnggPSAweDgwMDEwMDAwOw0KKyAgICB9DQorICAgIA0KKyAgICBpZiAoIHVzQnVzVHlwZSAhPSBBQ1RJVkUgKSAgICAvL0FHUCwgUENJLCBQQ0lFDQorICAgIHsNCisgICAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykNCisgICAgICB7DQorICAgICAgICBlYnggPSBlYnggKyAoMHg4MDApOw0KKyAgICAgICAgaWYgKCgoVVNIT1JUKVJlYWRQQ0lSZWcoZWJ4LCAwLCAweGZmZmYpID09IHVzVmVuZG9ySUQpICYmICgoVVNIT1JUKShSZWFkUENJUmVnKGVieCwgMCwgMHhmZmZmMDAwMCkgPj4gMTYpID09IHVzRGV2aWNlSUQpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICByZXR1cm4gZWJ4Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBlbHNlICAgICAvL0FDVElWRQ0KKyAgICB7DQorICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKQ0KKyAgICAgIHsNCisgICAgICAgIGVieCA9IEJhc2Vbal07DQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykNCisgICAgICAgIHsNCisgICAgICAgICAgZWJ4ID0gZWJ4ICsgKDB4ODAwKTsNCisgICAgICAgICAgaWYgKCgoVVNIT1JUKVJlYWRQQ0lSZWcoZWJ4LCAwLCAweGZmZmYpID09IHVzVmVuZG9ySUQpICYmICgoVVNIT1JUKShSZWFkUENJUmVnKGVieCwgMCwgMHhmZmZmMDAwMCkgPj4gMTYpID09IHVzRGV2aWNlSUQpKQ0KKyAgICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIGVieDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICByZXR1cm4gMDsNCisgICAgfQ0KK30gLy8gRW5kIFVMT05HIEZpbmRQQ0lEZXZpY2UgKFVTSE9SVCB1c1ZlbmRvcklELCBVU0hPUlQgdXNEZXZpY2VJRCwgVVNIT1JUIHVzQnVzVHlwZSkNCisjZW5kaWYNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8vIEFsbG9jYXRlIFJlc291cmNlDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjaWZkZWYgU0xUX0RPUw0KK1VMT05HIEluaXRET1MzMigpDQorew0KKyAgdW5pb24gUkVHUyByZWdzIDsNCisNCisgIHJlZ3Mudy5heCA9IDB4ZWUwMDsNCisgIElOVEZVTkMoMHgzMSwgJnJlZ3MsICZyZWdzKSA7DQorDQorICBpZihyZWdzLncuYXggPj0gMHgzMDEpICAgIC8vIERPUzMyIHZlcnNpb24gPj0gMy4wMSA/DQorICAgIHJldHVybiAxOw0KKyAgZWxzZQ0KKyAgICByZXR1cm4gMDsNCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitVU0hPUlQgQ2hlY2tET1MoKQ0KK3sNCisgICAgdW5pb24gUkVHUyAgcmVnczsNCisNCisgICAgcmVncy53LmF4ID0gMHhlZWZmOw0KKyAgICBpbnQzODYoMHgzMSwgJnJlZ3MsICZyZWdzKTsNCisgICAgaWYgKHJlZ3MueC5lYXggPT0gMHg1MDRkNDQ1NykNCisgICAgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0gZWxzZSB7DQorICAgICAgICBwcmludGYoIlBNT0RFVyBJbml0LiBmYWlsXG4iKTsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICB9DQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorVUxPTkcgTWFwUGh5c2ljYWxUb0xpbmVhciAoVUxPTkcgdWxCYXNlQWRkcmVzcywgVUxPTkcgdWxTaXplKQ0KK3sNCisgIHVuaW9uIFJFR1MgcmVnczsNCisNCisgIHJlZ3Mudy5heCA9IDB4MDgwMDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXAgcGh5c2NpYWwgbWVtb3J5DQorICByZWdzLncuYnggPSB1bEJhc2VBZGRyZXNzID4+IDE2OyAgICAgICAgICAgLy8gYng6Y3ggPSBwaHlzaWNhbCBhZGRyZXNzDQorICByZWdzLncuY3ggPSB1bEJhc2VBZGRyZXNzOw0KKyAgcmVncy53LnNpID0gdWxTaXplID4+IDE2OyAgICAgICAgICAgICAgICAgIC8vIHNpOmRpID0gbWFwcGVkIG1lbW9yeSBibG9jayBzaXplDQorICByZWdzLncuZGkgPSB1bFNpemU7DQorICBJTlRGVU5DKDB4MzEsICZyZWdzLCAmcmVncyk7ICAgICAgICAgICAgICAgLy8gaW50Mzg2KDB4MzEsICZyZWdzLCAmcmVncyk7DQorICBpZiAocmVncy53LmNmbGFnID09IDApDQorICAgIHJldHVybiAoVUxPTkcpIChyZWdzLncuYnggPDwgMTYgKyByZWdzLncuY3gpOyAgLy8gTGluZWFyIEFkZHIgPSBieDpjeA0KKyAgZWxzZQ0KKyAgICByZXR1cm4gMDsNCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitVU0hPUlQgRnJlZVBoeXNpY2FsTWFwcGluZyhVTE9ORyB1ZHdMaW5BZGRyZXNzKQ0KK3sNCisgICAgdW5pb24gUkVHUyByZWdzOw0KKw0KKyAgICByZWdzLncuYXggPSAweDA4MDE7DQorICAgIHJlZ3Mudy5ieCA9IHVkd0xpbkFkZHJlc3MgPj4gMTY7DQorICAgIHJlZ3Mudy5jeCA9IHVkd0xpbkFkZHJlc3MgJiAweEZGRkY7DQorICAgIGludDM4NigweDMxLCAmcmVncywgJnJlZ3MpOw0KKw0KKyAgICBpZiAocmVncy54LmNmbGFnKQ0KKyAgICAgICAgcmV0dXJuICgoVVNIT1JUKSAwKTsNCisgICAgZWxzZSByZXR1cm4gKChVU0hPUlQpIDEpOw0KK30NCisjZW5kaWYNCisNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9MSUJfU1BJLkggYi9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9MSUJfU1BJLkgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhjOGYxZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL0xJQl9TUEkuSApAQCAtMCwwICsxLDIzIEBACisvKg0KKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KKyAqDQorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0ENCisgKi8NCisjaWZuZGVmIExJQl9TUElfSA0KKyNkZWZpbmUgTElCX1NQSV9IDQorDQorI2lmZGVmIFNQSV9CVVMNCisgICAgLy8gTU1JTyBGdW5jdGlvbnMNCisgICAgVk9JRCAgICAgICBNT3V0d20gKFVMT05HLCBVTE9ORywgVVNIT1JUKTsNCisgICAgVk9JRCAgICAgICBNT3V0ZHdtIChVTE9ORywgVUxPTkcsIFVMT05HKTsNCisgICAgVUxPTkcgICAgICBNSW5kd20gKFVMT05HLCBVTE9ORyk7DQorICAgIA0KKyAgICB2b2lkIHNwaW1faW5pdChpbnQgY3MpOw0KKyNlbmRpZg0KKw0KKyNlbmRpZiAvLyBMSUJfU1BJX0gNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9NQUMuSCBiL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL01BQy5ICm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MzIxMTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9NQUMuSApAQCAtMCwwICsxLDE1NyBAQAorLyoNCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisgKg0KKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBDQorICovDQorI2lmbmRlZiBNQUNfSA0KKyNkZWZpbmUgTUFDX0gNCisNCisjaWZkZWYgU1BJX0JVUw0KKyAgI2luY2x1ZGUgPHN0ZGlvLmg+DQorICAjaW5jbHVkZSA8c3RkbGliLmg+DQorICAjaW5jbHVkZSA8dGltZS5oPg0KKyAgI2RlZmluZSBTUElfQ1MgICAgICAgICAgICAxDQorI2VuZGlmDQorLy8gKCBVU0VfUDJBIHwgVVNFX0xQQyApDQorDQorI2lmIGRlZmluZWQoTGludXhBUCkNCisgICNpbmNsdWRlIDxzdGRpby5oPg0KKyAgI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKyAgI2luY2x1ZGUgPHN0cmluZy5oPg0KKyAgI2luY2x1ZGUgPHN0ZGFyZy5oPg0KKyAgI2luY2x1ZGUgPHVuaXN0ZC5oPg0KKyAgI2luY2x1ZGUgPHN0cmluZy5oPg0KKyAgI2luY2x1ZGUgPGZjbnRsLmg+DQorICAjaW5jbHVkZSA8cHRocmVhZC5oPg0KKyAgI2luY2x1ZGUgPHN5cy9tbWFuLmg+DQorICAjaW5jbHVkZSA8c3lzL2lvLmg+DQorI2VuZGlmDQorI2lmZGVmIFNMVF9VQk9PVA0KKyAgI2luY2x1ZGUgPGNvbW1vbi5oPg0KKyAgI2luY2x1ZGUgPGNvbW1hbmQuaD4NCisjZW5kaWYNCisjaWZkZWYgU0xUX0RPUw0KKyAgI2luY2x1ZGUgPHN0ZGlvLmg+DQorICAjaW5jbHVkZSA8c3RkbGliLmg+DQorICAjaW5jbHVkZSA8dGltZS5oPg0KKyAgI2luY2x1ZGUgPGNvbmlvLmg+DQorICAjaW5jbHVkZSA8ZG9zLmg+DQorICAjaW5jbHVkZSA8bWVtLmg+DQorI2VuZGlmDQorDQorI2luY2x1ZGUgIk5DU0kuSCINCisjaW5jbHVkZSAiSU8uSCINCisNCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8vIERlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisvLyNkZWZpbmUgRm9yY2VfRW5hYmxlX01BQzM0ICAgICAgICAgICAgIC8vW09OXVtTTFQ6b2ZmXSAoRm9yY2UgZW5hYmxlIG1hYzM0KQ0KKy8vI2RlZmluZSBGb3JjZV9FbmFibGVfTmV3TURJTyAgICAgICAgICAgLy9bb2ZmXVtTTFQ6b2ZmXSAoRm9yY2UgZW5hYmxlIG5ldyBNREMvTURJTykNCisvLyNkZWZpbmUgRW5hYmxlX0Zhc3RfU0NVICAgICAgICAgICAgICAgIC8vW29mZl0NCisvLyNkZWZpbmUgRW5hYmxlX09sZF9TdHlsZSAgICAgICAgICAgICAgIC8vW29mZl0NCisjZGVmaW5lIEVOQUJMRV9EQVNBICAgICAgICAgICAgICAgICAgICAvL1tPTl0NCisvLyNkZWZpbmUgRW5hYmxlX0FTVDIzMDBfSW50MTI1TUh6ICAgICAgIC8vW29mZl0NCisvLyNkZWZpbmUgRU5BQkxFX0FSUF8yX1dPTCAgICAgICAgICAgICAgIC8vW29mZl0NCisvLyNkZWZpbmUgRW5hYmxlX01BQ19TV1JzdCAgICAgICAgICAgICAgIC8vW29mZl0NCisNCisjZGVmaW5lIEVuYWJsZV9SdW50DQorLy8jZGVmaW5lIEVuYWJsZV9KdW1ibw0KKy8vI2RlZmluZSBFbmFibGVfQnVmTWVyZ2UNCisvLyNkZWZpbmUgRGlzYWJsZV9WR0ENCisNCisvLyNkZWZpbmUgU2VsZWN0U2ltcGxlQm91bmRhcnkgICAgICAgICAgICAgICAgICAgICAgICAvL1tvZmZdIFVzaW5nIGluIGRlYnVnDQorLy8jZGVmaW5lIFNlbGVjdFNpbXBsZURhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9bb2ZmXSBVc2luZyBpbiBkZWJ1Zw0KKy8vI2RlZmluZSBTZWxlY3RTaW1wbGVMZW5ndGggICAgICAgICAxNTEyICAgICAgICAgICAgIC8vW29mZl0gNjAoMHgzYykgfiAxNTE0KDB4NWVhKTsgMTUxMigweDVlOCkNCisvLyNkZWZpbmUgU2VsZWN0RGVzTnVtYmVyICAgICAgICAgICAgOCAgICAgICAgICAgICAgICAvL1tvZmZdIDEgfg0KKy8vI2RlZmluZSBTZWxlY3RTaW1wbGVEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vW29mZl0gVXNpbmcgaW4gZGVidWcNCisvLyNkZWZpbmUgU2VsZWN0U2ltcGxlRGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1tvZmZdDQorLy8jZGVmaW5lIFNlbGVjdExlbmd0aEluYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9bb2ZmXSBVc2luZyBpbiBkZWJ1Zw0KKw0KKyNkZWZpbmUgICBTaW1wbGVEYXRhX0ZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vW09OXSBVc2luZyBpbiBkZWJ1Zw0KKyNkZWZpbmUgICBTaW1wbGVEYXRhX0ZpeE51bSAgICAgICAgICAxMg0KKyNkZWZpbmUgICBTaW1wbGVEYXRhX0ZpeFZhbDAwICAgICAgICAweDAwMDAwMDAwICAgICAvL1swXW5vIFNlbGVjdFNpbXBsZURBOiAoNjA6IDA0MTIgODkwOCkoMTUxMjogZTIwZCBlOWRhKQ0KKyNkZWZpbmUgICBTaW1wbGVEYXRhX0ZpeFZhbDAxICAgICAgICAweGZmZmZmZmZmICAgICAvL1swXW5vIFNlbGVjdFNpbXBsZURBOiAoNjA6IGY0OGMgZjE0ZCkoMTUxMjogYWYwNSAyNjBjKQ0KKyNkZWZpbmUgICBTaW1wbGVEYXRhX0ZpeFZhbDAyICAgICAgICAweDU1NTU1NTU1ICAgICAvL1swXW5vIFNlbGVjdFNpbXBsZURBOiAoNjA6IDU0NjcgNWVjYikoMTUxMjogZDkwYSA1MzY4KQ0KKyNkZWZpbmUgICBTaW1wbGVEYXRhX0ZpeFZhbDAzICAgICAgICAweGFhYWFhYWFhICAgICAvL1swXW5vIFNlbGVjdFNpbXBsZURBOiAoNjA6IGE0ZjkgMjY4ZSkoMTUxMjogOTQwMiA5Y2JlKQ0KKyNkZWZpbmUgICBTaW1wbGVEYXRhX0ZpeFZhbDA0ICAgICAgICAweDVhNWE1YTVhICAgICAvL1sxXW5vIFNlbGVjdFNpbXBsZURBOiAoNjA6IDdmMDEgZTIyZCkoMTUxMjogNGZkMyA4MDEyKQ0KKyNkZWZpbmUgICBTaW1wbGVEYXRhX0ZpeFZhbDA1ICAgICAgICAweGMzYzNjM2MzICAgICAvL1sxXW5vIFNlbGVjdFNpbXBsZURBOiAoNjA6IDU5MTYgMDJkNSkoMTUxMjogOTlmMSA2MTI3KQ0KKyNkZWZpbmUgICBTaW1wbGVEYXRhX0ZpeFZhbDA2ICAgICAgICAweDk2OTY5Njk2ICAgICAvL1sxXW5vIFNlbGVjdFNpbXBsZURBOiAoNjA6IDA5NjMgZDUxNikoMTUxMjogYTJmNiBkYjk1KQ0KKyNkZWZpbmUgICBTaW1wbGVEYXRhX0ZpeFZhbDA3ICAgICAgICAweGYwZjBmMGYwICAgICAvL1sxXW5vIFNlbGVjdFNpbXBsZURBOiAoNjA6IGRmZWEgNGRhYikoMTUxMjogMzlkYyBmNTc2KQ0KKyNkZWZpbmUgICBTaW1wbGVEYXRhX0ZpeFZhbDA4ICAgICAgICAweDU1NTVhYWFhICAgICAvL1syXW5vIFNlbGVjdFNpbXBsZURBOiAoNjA6IGI2MWIgNTc3NykoMTUxMjogNDY1MiBkZGIwKQ0KKyNkZWZpbmUgICBTaW1wbGVEYXRhX0ZpeFZhbDA5ICAgICAgICAweGZmZmYwMDAwICAgICAvL1syXW5vIFNlbGVjdFNpbXBsZURBOiAoNjA6IDE2ZjAgZjhmMSkoMTUxMjogMzA1ZCBhOGQ0KQ0KKyNkZWZpbmUgICBTaW1wbGVEYXRhX0ZpeFZhbDEwICAgICAgICAweDVhNWFhNWE1ICAgICAvL1syXW5vIFNlbGVjdFNpbXBsZURBOiAoNjA6IDlkN2QgZWI5MSkoMTUxMjogZDA4YiAwZWNhKQ0KKyNkZWZpbmUgICBTaW1wbGVEYXRhX0ZpeFZhbDExICAgICAgICAweGMzYzMzYzNjICAgICAvL1syXW5vIFNlbGVjdFNpbXBsZURBOiAoNjA6IGJiNmEgMGI2OSkoMTUxMjogMDZhOSBlZmZmKQ0KKw0KKyNkZWZpbmUgICBTZWxlY3RTaW1wbGVEQV9EYXQwICAgICAgICAweDY3MDUyMzAxDQorI2RlZmluZSAgIFNlbGVjdFNpbXBsZURBX0RhdDEgICAgICAgIDB4ZTBjZGEwODkNCisjZGVmaW5lICAgU2VsZWN0U2ltcGxlREFfRGF0MiAgICAgICAgMHg5OGJhZGNmZQ0KKw0KKyNkZWZpbmUgICBTZWxlY3RXT0xEQV9EYXRIICAgICAgICAgICAweDIwNmENCisjZGVmaW5lICAgU2VsZWN0V09MREFfRGF0TCAgICAgICAgICAgMHg4YTM3NGQ5Yg0KKw0KKyNkZWZpbmUgICBNT1ZFX0RBVEFfTUJfU0VDICAgICAgICAgICA4MDAgICAgICAgICAgICAvLyBNQnl0ZSBwZXIgc2Vjb25kIHRvIG1vdmUgZGF0YQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLy8gRnJhbWUgc2l6ZQ0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorI2RlZmluZSAgRU5BQkxFX1JBTkRfU0laRSAgICAgICAgICAgICAwDQorI2RlZmluZSAgUmFuZF9TZWQgICAgICAgICAgICAgICAgICAgICAweGZmY2NkDQorI2RlZmluZSAgRlJBTUVfUmFuZF9TaW1wbGUgICAgICAgICAgICAwDQorI2RlZmluZSAgTUlOX0ZSQU1FX1JBTkRfU0laRSAgICAgICAgICAgICAgIDYwDQorI2RlZmluZSAgTUFYX0ZSQU1FX1JBTkRfU0laRSAgICAgICAgICAgICAgIDE1MTQNCisNCisjZGVmaW5lIEZSQU1FX1NFTEhfUEVSRCAgICAgICAgICAgICAgIDcNCisjaWZkZWYgRW5hYmxlX0p1bWJvDQorLy8gICAgI2RlZmluZSBGUkFNRV9MRU5IICAgICAgICAgICAgICAgIDkyMTIgICAgICAgICAgIC8vbWF4OjkyMTINCisvLyAgICAjZGVmaW5lIEZSQU1FX0xFTkwgICAgICAgICAgICAgICAgOTIxMSAgICAgICAgICAgLy9tYXg6OTIxMg0KKyAgICAjZGVmaW5lIEZSQU1FX0xFTkggICAgICAgICAgICAgICAgOTIxMiAgICAgICAgICAgLy9tYXg6OTIxMg0KKyAgICAjZGVmaW5lIEZSQU1FX0xFTkwgICAgICAgICAgICAgICAgOTIxMiAgICAgICAgICAgLy9tYXg6OTIxMg0KKy8vICAgICNkZWZpbmUgRlJBTUVfTEVOSCAgICAgICAgICAgICAgICA4MTIwDQorLy8gICAgI2RlZmluZSBGUkFNRV9MRU5MICAgICAgICAgICAgICAgIDgxMTkNCisvLyAgICAjZGVmaW5lIEZSQU1FX0xFTkggICAgICAgICAgICAgICAgNzAwMA0KKy8vICAgICNkZWZpbmUgRlJBTUVfTEVOTCAgICAgICAgICAgICAgICA2OTk5DQorLy8gICAgI2RlZmluZSBGUkFNRV9MRU5IICAgICAgICAgICAgICAgIDQwOTUNCisvLyAgICAjZGVmaW5lIEZSQU1FX0xFTkwgICAgICAgICAgICAgICAgNDA5NA0KKy8vICAgICNkZWZpbmUgRlJBTUVfTEVOSCAgICAgICAgICAgICAgICAyMDQwDQorLy8gICAgI2RlZmluZSBGUkFNRV9MRU5MICAgICAgICAgICAgICAgIDIwMzkNCisjZWxzZQ0KKyAgI2lmZGVmIFNlbGVjdFNpbXBsZUxlbmd0aA0KKy8vICAgICNkZWZpbmUgRlJBTUVfTEVOSCAgICAgICAgICAgICAgICAgICggU2VsZWN0U2ltcGxlTGVuZ3RoICsgMSApDQorLy8gICAgI2RlZmluZSBGUkFNRV9MRU5MICAgICAgICAgICAgICAgICAgKCBTZWxlY3RTaW1wbGVMZW5ndGggICAgICkNCisgICAgI2RlZmluZSBGUkFNRV9MRU5IICAgICAgICAgICAgICAgICAgU2VsZWN0U2ltcGxlTGVuZ3RoDQorICAgICNkZWZpbmUgRlJBTUVfTEVOTCAgICAgICAgICAgICAgICAgIFNlbGVjdFNpbXBsZUxlbmd0aA0KKyAgI2Vsc2UNCisvLyAgICAjZGVmaW5lIEZSQU1FX0xFTkggICAgICAgICAgICAgICAgICAxNTE0ICAgICAgICAgICAvL21heDoxNTE0DQorLy8gICAgI2RlZmluZSBGUkFNRV9MRU5MICAgICAgICAgICAgICAgICAgMTUxMyAgICAgICAgICAgLy9tYXg6MTUxNA0KKyAgICAjZGVmaW5lIEZSQU1FX0xFTkggICAgICAgICAgICAgICAgICAxNTE0ICAgICAgICAgICAvL21heDoxNTE0DQorICAgICNkZWZpbmUgRlJBTUVfTEVOTCAgICAgICAgICAgICAgICAgIDE1MTQgICAgICAgICAgIC8vbWF4OjE1MTQNCisgICNlbmRpZg0KKyNlbmRpZg0KKw0KK2NvbnN0ICBVTE9ORyAgIEFSUF9vcmdfZGF0YVsxNl0gPSB7DQorICAgICAgICAweGZmZmZmZmZmLA0KKyAgICAgICAgMHgwMDAwZmZmZiwgLy8gU0E6MDAgMDANCisgICAgICAgIDB4MTIzNDU2NzgsIC8vIFNBOjEyIDM0IDU2IDc4DQorICAgICAgICAweDAxMDAwNjA4LCAvLyBBUlAoMHgwODA2KQ0KKyAgICAgICAgMHgwNDA2MDAwOCwgICAgDQorICAgICAgICAweDAwMDAwMTAwLCAvLyBzZW5kZXIgTUFDIEFkZHJlc3M6IDAwIDAwDQorICAgICAgICAweDEyMzQ1Njc4LCAvLyBzZW5kZXIgTUFDIEFkZHJlc3M6IDEyIDM0IDU2IDc4DQorICAgICAgICAweGViMDBhOGMwLCAvLyBzZW5kZXIgSVAgQWRkcmVzczogIDE5Mi4xNjguMC4yMzUNCisgICAgICAgIDB4MDAwMDAwMDAsIC8vIHRhcmdldCBNQUMgQWRkcmVzczogMDAgMDAgMDAgMDANCisgICAgICAgIDB4YThjMDAwMDAsIC8vIHRhcmdldCBNQUMgQWRkcmVzczogMDAgMDAsIHNlbmRlciBJUCBBZGRyZXNzOjE5Mi4xNjgNCisgICAgICAgIDB4MDAwMDAxMDAsIC8vIHNlbmRlciBJUCBBZGRyZXNzOiAgMC4xDQorLy8gICAgICAweDAwMDBkZTAwLCAvLyBzZW5kZXIgSVAgQWRkcmVzczogIDAuMjIyDQorICAgICAgICAweDAwMDAwMDAwLA0KKyAgICAgICAgMHgwMDAwMDAwMCwNCisgICAgICAgIDB4MDAwMDAwMDAsDQorICAgICAgICAweDAwMDAwMDAwLA0KKyAgICAgICAgMHhjNjhlMmJkNQ0KK307DQorDQorI2VuZGlmIC8vIE1BQ19IDQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvTUFDLmMgYi9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9NQUMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjlkYTkyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvTUFDLmMKQEAgLTAsMCArMSwyMDg1IEBACisvKg0KKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KKyAqDQorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0ENCisgKi8NCisjZGVmaW5lIE1BQ19DDQorc3RhdGljIGNvbnN0IGNoYXIgVGhpc0ZpbGVbXSA9ICJNQUMuYyI7DQorDQorI2luY2x1ZGUgIlNXRlVOQy5IIg0KKw0KKyNpZmRlZiBTTFRfVUJPT1QNCisgICNpbmNsdWRlIDxjb21tb24uaD4NCisgICNpbmNsdWRlIDxjb21tYW5kLmg+DQorICAjaW5jbHVkZSA8Q09NTUlORi5IPg0KKyAgI2luY2x1ZGUgIlNURFVCT09ULkgiDQorI2VuZGlmDQorI2lmZGVmIFNMVF9ET1MNCisgICNpbmNsdWRlIDxzdGRpby5oPg0KKyAgI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKyAgI2luY2x1ZGUgPGNvbmlvLmg+DQorICAjaW5jbHVkZSA8c3RyaW5nLmg+DQorICAjaW5jbHVkZSAiQ09NTUlORi5IIg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlICJNQUMuSCINCisNCitkb3VibGUJQXZnX2ZyYW1lX2xlbjsNCitVTE9ORwlDaGVja19EZXNfVmFsOw0KK1VMT05HCXdwX2ZpcjsNCitVTE9ORwl3cDsNCitVTE9ORwlGUkFNRV9MRU5fQ3VyOw0KK1VMT05HCWdkYXRhOw0KK1VMT05HCUNoZWNrRGVzRmFpbF9EZXNOdW07DQorVUxPTkcJVkdBTW9kZTsNCitVTE9ORwlTQ1VfMWNoX29sZDsNCitVTE9ORwlTQ1VfMGNoX29sZDsNCitVTE9ORwlTQ1VfNDhoX2RlZmF1bHQ7DQorVUxPTkcJU0NVXzJjaF9vbGQ7DQorVUxPTkcJU0NVXzgwaF9vbGQ7DQorVUxPTkcJU0NVXzc0aF9vbGQ7DQorVUxPTkcJU0NVX2E0aF9vbGQ7DQorVUxPTkcJU0NVXzg4aF9vbGQ7DQorVUxPTkcJV0RUXzBjaF9vbGQ7DQorVUxPTkcJU0NVXzA0aF9taXg7DQorVUxPTkcJU0NVXzA0aF9vbGQ7DQorVUxPTkcJV0RUXzJjaF9vbGQ7DQorY2hhcglTQ1Vfb2xkdmxkID0gMDsNCisNCisjaWZkZWYgU0xUX1VCT09UDQorI2Vsc2UNCisgICAgc3RhdGljICBkb3VibGUgICAgICB0aW1ldXNlZDsNCisjZW5kaWYNCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQordm9pZCBEZWJ1Z19kZWxheSAodm9pZCkgew0KKyAgICAjaWZkZWYgRGJnUHJuX0VuYWJsZV9EZWJ1Z19kZWxheQ0KKyAgICBHRVRfQ0FIUigpOw0KKyAgICAjZW5kaWYNCit9DQorICAgIA0KKw0KKw0KKw0KK3ZvaWQgZHVtcF9tYWNfUk9yZWcgKHZvaWQpIHsNCisJREVMQVkoRGVsYXlfTUFDRHVtcCk7DQorCXByaW50ZigiXG4iKTsNCisJcHJpbnRmKCJbTUFDLUhdIFJPUmVnIEEwaH5BQ2g6ICUwOGx4ICUwOGx4ICUwOGx4ICUwOGx4XG4iLCBSZWFkU09DX0REKEhfTUFDX0JBU0UrMHhBMCksIFJlYWRTT0NfREQoSF9NQUNfQkFTRSsweEE0KSwgUmVhZFNPQ19ERChIX01BQ19CQVNFKzB4QTgpLCBSZWFkU09DX0REKEhfTUFDX0JBU0UrMHhBQykpOw0KKwlwcmludGYoIltNQUMtSF0gUk9SZWcgQjBofkJDaDogJTA4bHggJTA4bHggJTA4bHggJTA4bHhcbiIsIFJlYWRTT0NfREQoSF9NQUNfQkFTRSsweEIwKSwgUmVhZFNPQ19ERChIX01BQ19CQVNFKzB4QjQpLCBSZWFkU09DX0REKEhfTUFDX0JBU0UrMHhCOCksIFJlYWRTT0NfREQoSF9NQUNfQkFTRSsweEJDKSk7DQorCXByaW50ZigiW01BQy1IXSBST1JlZyBDMGh+QzhoOiAlMDhseCAlMDhseCAlMDhseCAgICAgIFxuIiwgUmVhZFNPQ19ERChIX01BQ19CQVNFKzB4QzApLCBSZWFkU09DX0REKEhfTUFDX0JBU0UrMHhDNCksIFJlYWRTT0NfREQoSF9NQUNfQkFTRSsweEM4KSk7DQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLy8gU0NVDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIHJlY292X3NjdSAodm9pZCkgew0KKyAgICAjaWZkZWYgIERiZ1Bybl9GdW5jSGVhZGVyDQorCSAgICBwcmludGYgKCJyZWNvdl9zY3VcbiIpOyANCisJICAgIERlYnVnX2RlbGF5KCk7DQorICAgICNlbmRpZg0KKw0KKwkvL01BQw0KKwlXcml0ZVNPQ19ERCggSF9NQUNfQkFTRSArIDB4MDgsIE1BQ18wOGhfb2xkICk7DQorCVdyaXRlU09DX0REKCBIX01BQ19CQVNFICsgMHgwYywgTUFDXzBjaF9vbGQgKTsNCisJV3JpdGVTT0NfREQoIEhfTUFDX0JBU0UgKyAweDQwLCBNQUNfNDBoX29sZCApOw0KKw0KKwkvL1NDVQ0KKwlXcml0ZVNPQ19ERCggU0NVX0JBU0UgKyAweDA0LCBTQ1VfMDRoX29sZCApOw0KKwlXcml0ZVNPQ19ERCggU0NVX0JBU0UgKyAweDA4LCBTQ1VfMDhoX29sZCApOw0KKwlXcml0ZVNPQ19ERCggU0NVX0JBU0UgKyAweDBjLCBTQ1VfMGNoX29sZCApOw0KKwlXcml0ZVNPQ19ERCggU0NVX0JBU0UgKyAweDFjLCBTQ1VfMWNoX29sZCApOw0KKwlXcml0ZVNPQ19ERCggU0NVX0JBU0UgKyAweDJjLCBTQ1VfMmNoX29sZCApOw0KKwlXcml0ZVNPQ19ERCggU0NVX0JBU0UgKyAweDQ4LCBTQ1VfNDhoX29sZCApOw0KKy8vCVdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4NzAsIFNDVV83MGhfb2xkICk7DQorCVdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4NzQsIFNDVV83NGhfb2xkICk7DQorCVdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4N2MsIFNDVV83Y2hfb2xkICk7DQorCVdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4ODAsIFNDVV84MGhfb2xkICk7DQorCVdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4ODgsIFNDVV84OGhfb2xkICk7DQorCVdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4OTAsIFNDVV85MGhfb2xkICk7DQorCVdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4YTQsIFNDVV9hNGhfb2xkICk7DQorCVdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4YWMsIFNDVV9hY2hfb2xkICk7DQorICAgICNpZmRlZiBBU1QxMDEwX0lPTUFQDQorICAgICAgV3JpdGVTT0NfREQoIFNDVV9CQVNFICsgMHgxMUMsIFNDVV8xMUNoX29sZCApOw0KKyAgICAjZW5kaWYNCisNCisJLy9XRFQNCisgICAgI2lmZGVmIEFTVDEwMTBfSU9NQVANCisgICAgI2Vsc2UNCisgICAgLy8gICAgV3JpdGVTT0NfREQoMHgxZTc4NTAwYywgV0RUXzBjaF9vbGQpOw0KKyAgICAvLyAgICBXcml0ZVNPQ19ERCgweDFlNzg1MDJjLCBXRFRfMmNoX29sZCk7DQorICAgICNlbmRpZg0KKw0KKwlpZiAoIEFTVENoaXBUeXBlID09IDMgKSB7DQorCQlpZiAoIFNDVV9mMGhfb2xkICYgMHgwMSApIFdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4ZjAsIDB4QUVFRDAwMDEgKTsgLy9FbmFibGUgTUFDMzQNCisJCWlmICggU0NVX2YwaF9vbGQgJiAweDAyICkgV3JpdGVTT0NfREQoIFNDVV9CQVNFICsgMHhmMCwgMHgyMDAwREVFQSApOyAvL0VuYWJsZSBEZWNvZGUNCisJCWlmICggU0NVX2YwaF9vbGQgJiAweDA0ICkgV3JpdGVTT0NfREQoIFNDVV9CQVNFICsgMHhmMCwgMHhBMEUwRTBEMyApOyAvL0VuYWJsZSBJMlMNCisJCWlmICggU0NVX2YwaF9vbGQgJiAweDA4ICkgV3JpdGVTT0NfREQoIFNDVV9CQVNFICsgMHhmMCwgMHg0RDBFMEUwQSApOyAvL0VuYWJsZSBQQ0kgSG9zdA0KKwkJaWYgKCBTQ1VfZjBoX29sZCAmIDB4MTAgKSBXcml0ZVNPQ19ERCggU0NVX0JBU0UgKyAweGYwLCAweDEwQURERUVEICk7IC8vRW5hYmxlIElSDQorCQlpZiAoIFNDVV9mMGhfb2xkICYgMHgyMCApIFdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4ZjAsIDB4NjY1NTk5NTkgKTsgLy9FbmFiZWwgQnVmZmVyIE1lcmdlDQorCQlpZiAoIFNDVV9mMGhfb2xkICYgMHg0MCApIFdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4ZjAsIDB4Njg5NjFBMzMgKTsgLy9FbmFibGUgUFMyIElPDQorCQlpZiAoIFNDVV9mMGhfb2xkICYgMHg4MCApIFdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4ZjAsIDB4Njg5NzFBMzMgKTsgLy9FbmFibGUgUFMyIElPDQorCX0NCit9IC8vIEVuZCB2b2lkIHJlY292X3NjdSAodm9pZCkNCisNCit2b2lkIHJlYWRfc2N1ICh2b2lkKSB7DQorCSNpZmRlZiAgRGJnUHJuX0Z1bmNIZWFkZXINCisJICAgIHByaW50ZiAoInJlYWRfc2N1XG4iKTsgDQorCSAgICBEZWJ1Z19kZWxheSgpOw0KKyAgI2VuZGlmICAgICAgDQorDQorCWlmICghU0NVX29sZHZsZCkgew0KKwkJLy9TQ1UNCisJCVNDVV8wNGhfb2xkID0gUmVhZFNPQ19ERCggU0NVX0JBU0UgKyAweDA0ICk7DQorCQlTQ1VfMDhoX29sZCA9IFJlYWRTT0NfREQoIFNDVV9CQVNFICsgMHgwOCApOw0KKwkJU0NVXzBjaF9vbGQgPSBSZWFkU09DX0REKCBTQ1VfQkFTRSArIDB4MGMgKTsNCisJCVNDVV8xY2hfb2xkID0gUmVhZFNPQ19ERCggU0NVX0JBU0UgKyAweDFjICk7DQorCQlTQ1VfMmNoX29sZCA9IFJlYWRTT0NfREQoIFNDVV9CQVNFICsgMHgyYyApOw0KKwkJU0NVXzQ4aF9vbGQgPSBSZWFkU09DX0REKCBTQ1VfQkFTRSArIDB4NDggKTsNCisJCVNDVV83MGhfb2xkID0gUmVhZFNPQ19ERCggU0NVX0JBU0UgKyAweDcwICk7DQorCQlTQ1VfNzRoX29sZCA9IFJlYWRTT0NfREQoIFNDVV9CQVNFICsgMHg3NCApOw0KKwkJU0NVXzdjaF9vbGQgPSBSZWFkU09DX0REKCBTQ1VfQkFTRSArIDB4N2MgKTsNCisJCVNDVV84MGhfb2xkID0gUmVhZFNPQ19ERCggU0NVX0JBU0UgKyAweDgwICk7DQorCQlTQ1VfODhoX29sZCA9IFJlYWRTT0NfREQoIFNDVV9CQVNFICsgMHg4OCApOw0KKwkJU0NVXzkwaF9vbGQgPSBSZWFkU09DX0REKCBTQ1VfQkFTRSArIDB4OTAgKTsNCisJCVNDVV9hNGhfb2xkID0gUmVhZFNPQ19ERCggU0NVX0JBU0UgKyAweGE0ICk7DQorCQlTQ1VfYWNoX29sZCA9IFJlYWRTT0NfREQoIFNDVV9CQVNFICsgMHhhYyApOw0KKwkJU0NVX2YwaF9vbGQgPSBSZWFkU09DX0REKCBTQ1VfQkFTRSArIDB4ZjAgKTsNCisgICAgICAgICNpZmRlZiBBU1QxMDEwX0lPTUFQDQorICAgICAgICAgIFNDVV8xMUNoX29sZCA9IFJlYWRTT0NfREQoIFNDVV9CQVNFICsgMHgxMUMgKTsNCisJCSNlbmRpZg0KKw0KKwkJLy9XRFQNCisgICAgICAgICNpZmRlZiBBU1QxMDEwX0lPTUFQDQorICAgICAgICAjZWxzZQ0KKwkJICBXRFRfMGNoX29sZCA9IFJlYWRTT0NfREQoIDB4MWU3ODUwMGMgKTsNCisJCSAgV0RUXzJjaF9vbGQgPSBSZWFkU09DX0REKCAweDFlNzg1MDJjICk7DQorICAgICAgICAjZW5kaWYNCisNCisJCVNDVV9vbGR2bGQgPSAxOw0KKwl9IC8vIEVuZCBpZiAoIVNDVV9vbGR2bGQpIA0KK30gLy8gRW5kIHJlYWRfc2N1KCkNCisNCit2b2lkICAgIFNldHRpbmdfc2N1ICh2b2lkKQ0KK3sNCisgICAgLy9TQ1UNCisgICAgaWYgKEFTVDEwMTApIHsNCisgICAgICAgIGRvIHsNCisgICAgICAgICAgICBXcml0ZVNPQ19ERCggU0NVX0JBU0UgKyAweDAwICwgMHgxNjg4YThhOCk7DQorICAgICAgICAgICAgI2lmbmRlZiBTTFRfVUJPT1QgICAgICAgICAgICANCisgICAgICAgICAgICBXcml0ZVNPQ19ERCggU0NVX0JBU0UgKyAweDcwICwgU0NVXzcwaF9vbGQgJiAweGZmZmZmZmZlKTsgIC8vIERpc2FibGUgQ1BVDQorICAgICAgICAgICAgI2VuZGlmDQorICAgICAgICB9IHdoaWxlICggUmVhZFNPQ19ERCggU0NVX0JBU0UgKyAweDAwICkgIT0gMHgxICk7IA0KKw0KKyAgICAgICAgI2lmKCBBU1QxMDEwX0lPTUFQID09IDEpDQorICAJCVdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4MTFDLCAweDAwMDAwMDAwKTsgLy8gRGlzYWJsZSBDYWNoZSBmdW5jdGlvbm4NCisgICAgICAgICNlbmRpZg0KKyAgICB9IA0KKyAgICBlbHNlIHsNCisgICAgICAgIGRvIHsNCisgICAgICAgICAgICBXcml0ZVNPQ19ERCggU0NVX0JBU0UgKyAweDAwLCAweDE2ODhhOGE4KTsNCisgICAgICAgICAgICAjaWZuZGVmIFNMVF9VQk9PVA0KKyAgICAgICAgICAgIFdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4NzAsIFNDVV83MGhfb2xkIHwgMHgzICk7IC8vIERpc2FibGUgQ1BVDQorICAgICAgICAgICAgI2VuZGlmDQorICAgICAgICB9IHdoaWxlICggUmVhZFNPQ19ERCggU0NVX0JBU0UgKyAweDAwICkgIT0gMHgxICk7DQorICAgIH0gLy8gRW5kIGlmIChBU1QxMDEwKQ0KKw0KKyAgICAvL1dEVA0KKyAgICAjaWZkZWYgQVNUMTAxMF9JT01BUA0KKyAgICAjZWxzZQ0KKyAgICAgICAgV3JpdGVTT0NfREQoIDB4MWU3ODUwMGMsIFdEVF8wY2hfb2xkICYgMHhmZmZmZmZmYyApOw0KKyAgICAgICAgV3JpdGVTT0NfREQoIDB4MWU3ODUwMmMsIFdEVF8yY2hfb2xkICYgMHhmZmZmZmZmYyApOw0KKyAgICAjZW5kaWYgICAgICANCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIGluaXRfc2N1MSAodm9pZCkgew0KKwkjaWZkZWYgIERiZ1Bybl9GdW5jSGVhZGVyDQorCSAgICBwcmludGYgKCJpbml0X3NjdTFcbiIpOyANCisJICAgIERlYnVnX2RlbGF5KCk7DQorICAjZW5kaWYNCisNCisJaWYgKEFTVDMyMDApIHsNCisJCVdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4MGMsIChTQ1VfMGNoX29sZCAmIDB4ZmZlZmZmZmYpICk7Ly9DbG9jayBTdG9wIENvbnRyb2wNCisJfSANCisJZWxzZSBpZiAoQVNUMTAxMCkgew0KKwkJV3JpdGVTT0NfREQoIFNDVV9CQVNFICsgMHgwYywgKCBTQ1VfMGNoX29sZCAmIDB4ZmZmZmZmYmYgKSApOy8vQ2xvY2sgU3RvcCBDb250cm9sDQorCQlXcml0ZVNPQ19ERCggU0NVX0JBU0UgKyAweDg4LCAoKFNDVV84OGhfb2xkICYgMHgwMDNmZmZmZiApIHwgMHhmZmMwMDAwMCkgKTsvL011bHRpLWZ1bmN0aW9uIFBpbiBDb250cm9sDQorCX0gDQorCWVsc2UgaWYgKEFTVDIzMDApIHsNCisjaWZkZWYgRW5hYmxlX0J1Zk1lcmdlDQorCQlXcml0ZVNPQ19ERCggU0NVX0JBU0UgKyAweGYwLCAweDY2NTU5OTU5ICk7Ly9NQUMgYnVmZmVyIG1lcmdlDQorI2VuZGlmDQorDQorI2lmZGVmIEVuYWJsZV9BU1QyMzAwX0ludDEyNU1Ieg0KKwkJU0NVXzQ4aF9taXggPSAoU0NVXzQ4aF9vbGQgJiAweGYwMDAwMDAwKSB8IDB4ODAwMDAwMDA7DQorLy8JCVdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4ZjAsIDB4YTBlMGUwZDMgKTsvL0VuYWJsZSBJMlMNCisvLwkJV3JpdGVTT0NfREQoIFNDVV9CQVNFICsgMHgwNCwgU0NVXzA0aF9vbGQgJiAweGZmZmRmZmZmICk7Ly9Sc3QoRW5hYmxlIEkyUykNCisvLw0KKy8vLy8JCVdyaXRlU09DX0REKCAweDFlNmU1MDIwLCBSZWFkU09DX0REKDB4MWU2ZTUwMjApIHwgMHgwMDAxMDAwMCApOy8vUF9JMlNQTExBZGpFbmFibGUNCisvLwkJV3JpdGVTT0NfREQoIDB4MWU2ZTUwMjAsIFJlYWRTT0NfREQoMHgxZTZlNTAyMCkgfCAweDAwMDAwMDAwICk7Ly9QX0kyU1BMTEFkakVuYWJsZQ0KKy8vCQlXcml0ZVNPQ19ERCggMHgxZTZlNTAyNCwgMHgwMDAwMDE3NSApOy8vUF9JMlNQTExBZGpDbnQNCisNCisvLwkJV3JpdGVTT0NfREQoIFNDVV9CQVNFICsgMHgxYywgMHgwMDAwYTUxYSApOy8vMTI0ODAwMDAwKDI0TUh6KQ0KKy8vCQlXcml0ZVNPQ19ERCggU0NVX0JBU0UgKyAweDFjLCAweDAwMDBhOTJmICk7Ly8xMjUzMzMzMzMoMjRNSHopDQorLy8JCVdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4MWMsIDB4MDAwMDU4N2QgKTsvLzEyNTAwMDAwMCgyNE1IeikNCisJCVdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4MWMsIDB4MDAwMDZjN2QgKTsvLzEyNTAwMDAwMCgyNE1IeikNCisJCVdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4MmMsIDB4MDAzMDAwMDAgfCAoU0NVXzJjaF9vbGQgJiAweGZmY2ZmZmVmKSApOy8vRC1QTEwgYXNzaWduZWQgdG8gVkdBLCBEMi1QTEwgYXNzaWduZWQgdG8gSTJTLg0KKwkJV3JpdGVTT0NfREQoIFNDVV9CQVNFICsgMHg0OCwgMHg4MDAwMDAwMCB8IFNDVV80OGhfb2xkICk7Ly8xMjVNSHogY29tZSBmcm9tIEkyU1BMTA0KKyNlbHNlDQorCQlTQ1VfNDhoX21peCA9IChTQ1VfNDhoX29sZCAmIDB4ZjAwMDAwMDApOw0KKyNlbmRpZg0KKwkJc3dpdGNoIChTZWxlY3RNQUMpIHsNCisJCQljYXNlIDAgIDoNCisJCQkJV3JpdGVTT0NfREQoIFNDVV9CQVNFICsgMHg4OCwgKFNDVV84OGhfb2xkICYgMHgzZmZmZmZmZikgfCAweGMwMDAwMDAwICk7Ly9bMzFdTUFDMSBNRElPLCBbMzBdTUFDMSBNREMNCisJCQkJYnJlYWs7DQorCQkJY2FzZSAxICA6DQorCQkJCVdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4OTAsIChTQ1VfOTBoX29sZCAmIDB4ZmZmZmZmZmIpIHwgMHgwMDAwMDAwNCApOy8vWzIgXU1BQzIgTURDL01ESU8NCisJCQkJYnJlYWs7DQorCQkJY2FzZSAyICA6DQorCQkJY2FzZSAzICA6DQorCQkJZGVmYXVsdCA6IGJyZWFrOw0KKwkJfQ0KKw0KKwkJV3JpdGVTT0NfREQoU0NVX0JBU0UrMHgwYywgKFNDVV8wY2hfb2xkICYgMHhmZjBmZmZmZikgICAgICAgICAgICAgKTsvL0Nsb2NrIFN0b3AgQ29udHJvbA0KKy8vCQlXcml0ZVNPQ19ERChTQ1VfQkFTRSsweDgwLCAoU0NVXzgwaF9vbGQgJiAweGZmZmZmZmYwKSB8IDB4MDAwMDAwMGYpOy8vTUFDMUxJTksvTUFDMkxJTksNCisJfSANCisJZWxzZSB7DQorCQlzd2l0Y2ggKFNlbGVjdE1BQykgew0KKwkJCWNhc2UgMCAgOg0KKy8vCQkJCVdyaXRlU09DX0REKFNDVV9CQVNFKzB4NzQsIChTQ1VfNzRoX29sZCAmIDB4ZmRmZmZmZmYpIHwgMHgwMjAwMDAwMCk7Ly9bMjVdTUFDMSBQSFlMSU5LDQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgMSAgOg0KKwkJCQlpZiAoTUFDMl9STUlJKSB7DQorLy8JCQkJCVdyaXRlU09DX0REKFNDVV9CQVNFKzB4NzQsIChTQ1VfNzRoX29sZCAmIDB4ZmJlZmZmZmYpIHwgMHgwNDEwMDAwMCk7Ly9bMjZdTUFDMiBQSFlMSU5LLCBbMjFdTUFDMiBNSUksIFsyMF1NQUMyIE1EQy9NRElPDQorCQkJCQlXcml0ZVNPQ19ERChTQ1VfQkFTRSsweDc0LCAoU0NVXzc0aF9vbGQgJiAweGZmZWZmZmZmKSB8IDB4MDAxMDAwMDApOy8vWzI2XU1BQzIgUEhZTElOSywgWzIxXU1BQzIgTUlJLCBbMjBdTUFDMiBNREMvTURJTw0KKwkJCQl9IGVsc2Ugew0KKy8vCQkJCQlXcml0ZVNPQ19ERChTQ1VfQkFTRSsweDc0LCAoU0NVXzc0aF9vbGQgJiAweGZiY2ZmZmZmKSB8IDB4MDQzMDAwMDApOy8vWzI2XU1BQzIgUEhZTElOSywgWzIxXU1BQzIgTUlJLCBbMjBdTUFDMiBNREMvTURJTw0KKwkJCQkJV3JpdGVTT0NfREQoU0NVX0JBU0UrMHg3NCwgKFNDVV83NGhfb2xkICYgMHhmZmNmZmZmZikgfCAweDAwMzAwMDAwKTsvL1syNl1NQUMyIFBIWUxJTkssIFsyMV1NQUMyIE1JSSwgWzIwXU1BQzIgTURDL01ESU8NCisJCQkJfQ0KKwkJCQlicmVhazsNCisJCQlkZWZhdWx0IDogYnJlYWs7DQorCQl9IC8vIEVuZCBzd2l0Y2ggKFNlbGVjdE1BQykNCisJfSAvLyBFbmQgaWYgKEFTVDMyMDApDQorfSAvLyBFbmQgdm9pZCBpbml0X3NjdTEgKHZvaWQpDQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIGluaXRfc2N1X21hY3JzdCAodm9pZCkgew0KKyAgICANCisjaWZkZWYgRW5hYmxlX0FTVDIzMDBfSW50MTI1TUh6DQorCWlmIChBU1RDaGlwVHlwZSA9PSAzKSB7DQorCQlTQ1VfMDRoX21peCA9IFNDVV8wNGhfb2xkICYgMHhmZmZkZmZmZjsNCisJfSBlbHNlIHsNCisJCVNDVV8wNGhfbWl4ID0gU0NVXzA0aF9vbGQ7DQorCX0NCisjZWxzZQ0KKwlTQ1VfMDRoX21peCA9IFNDVV8wNGhfb2xkOyANCisjZW5kaWYNCisNCisJV3JpdGVTT0NfREQgKCBTQ1VfQkFTRSArIDB4MDQsIChTQ1VfMDRoX21peCAmIH5TQ1VfMDRoKSB8IFNDVV8wNGgpOy8vUnN0DQorCURFTEFZKERlbGF5X1NDVSk7DQorCVdyaXRlU09DX0REICggU0NVX0JBU0UgKyAweDA0LCAoU0NVXzA0aF9taXggJiB+U0NVXzA0aCkgICAgICAgICAgKTsvL0VuYWJsZSBFbmdpbmUNCisvLwlERUxBWShEZWxheV9TQ1UpOw0KK30gLy8gRW5kIHZvaWQgaW5pdF9zY3VfbWFjcnN0ICh2b2lkKQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBpbml0X3NjdTIgKHZvaWQpIHsNCisgICAgDQorI2lmZGVmIFNDVV83NGgNCisJI2lmZGVmICBEYmdQcm5fRnVuY0hlYWRlcg0KKwkgICAgcHJpbnRmICgiaW5pdF9zY3UyXG4iKTsgDQorCSAgICBEZWJ1Z19kZWxheSgpOw0KKyAgI2VuZGlmDQorDQorCVdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4NzQsIFNDVV83NGhfb2xkIHwgU0NVXzc0aCApOy8vUGluTXV4DQorCWRlbGF5KERlbGF5X1NDVSk7DQorI2VuZGlmDQorDQorfSAvLyBFbmQgdm9pZCBpbml0X3NjdTIgKHZvaWQpDQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIGluaXRfc2N1MyAodm9pZCkgew0KKyAgICANCisjaWZkZWYgU0NVXzc0aA0KKwkjaWZkZWYgIERiZ1Bybl9GdW5jSGVhZGVyDQorCSAgICBwcmludGYgKCJpbml0X3NjdTNcbiIpOyANCisJICAgIERlYnVnX2RlbGF5KCk7DQorICAjZW5kaWYNCisNCisJV3JpdGVTT0NfREQoIFNDVV9CQVNFICsgMHg3NCwgU0NVXzc0aF9vbGQgfCAoU0NVXzc0aCAmIDB4ZmZlZmZmZmYpICk7Ly9QaW5NdXgNCisJZGVsYXkoRGVsYXlfU0NVKTsNCisjZW5kaWYNCisNCit9IC8vIEVuZCB2b2lkIGluaXRfc2N1MyAodm9pZCkNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8vIE1BQw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBpbml0X21hYyAoVUxPTkcgYmFzZSwgVUxPTkcgdGRleGJhc2UsIFVMT05HIHJkZXhiYXNlKSB7DQorCSNpZmRlZiAgRGJnUHJuX0Z1bmNIZWFkZXINCisJICAgIHByaW50ZiAoImluaXRfbWFjXG4iKTsgDQorCSAgICBEZWJ1Z19kZWxheSgpOw0KKyAgI2VuZGlmDQorDQorI2lmZGVmIEVuYWJsZV9NQUNfU1dSc3QNCisJV3JpdGVTT0NfREQoIGJhc2UgKyAweDUwLCAweDgwMDAwMDAwIHwgTUFDXzUwaCB8IE1BQ181MGhfU3BlZWQpOw0KKy8vCVdyaXRlU09DX0REKCBiYXNlICsgMHg1MCwgMHg4MDAwMDAwMCk7DQorDQorCXdoaWxlICgweDgwMDAwMDAwICYgUmVhZFNPQ19ERChiYXNlKzB4NTApKSB7DQorLy9wcmludGYoIi4iKTsNCisJCURFTEFZKERlbGF5X01BQ1JzdCk7DQorCX0NCisJREVMQVkoRGVsYXlfTUFDUnN0KTsNCisjZW5kaWYNCisNCisJV3JpdGVTT0NfREQoIGJhc2UgKyAweDIwLCAodGRleGJhc2UgKyBDUFVfQlVTX0FERFJfU0RSQU1fT0ZGU0VUKSApOyAvLyAyMDEzMDczMA0KKwlXcml0ZVNPQ19ERCggYmFzZSArIDB4MjQsIChyZGV4YmFzZSArIENQVV9CVVNfQUREUl9TRFJBTV9PRkZTRVQpICk7IC8vIDIwMTMwNzMwDQorCQ0KKyNpZmRlZiBNQUNfMzBoICAgICAgICAgIA0KKwlXcml0ZVNPQ19ERCggYmFzZSArIDB4MzAsIE1BQ18zMGgpOy8vSW50IFRoci9DbnQNCisjZW5kaWYNCisgICAgICAgICAgICAgICAgICANCisjaWZkZWYgTUFDXzM0aCAgICAgICAgICANCisJV3JpdGVTT0NfREQoIGJhc2UgKyAweDM0LCBNQUNfMzRoKTsvL1BvbGwgQ250DQorI2VuZGlmDQorDQorI2lmZGVmIE1BQ18zOGggICAgICAgICAgDQorCVdyaXRlU09DX0REKCBiYXNlICsgMHgzOCwgTUFDXzM4aCk7DQorI2VuZGlmDQorDQorI2lmZGVmIE1BQ180MGgNCisJaWYgKEVuYWJsZV9NQUNMb29wYmFjaykgew0KKwkJaWYgKEFTVDIzMDBfTmV3TURJTykgV3JpdGVTT0NfREQoIGJhc2UgKyAweDQwLCBNQUNfNDBoIHwgMHg4MDAwMDAwMCk7DQorCQllbHNlICAgICAgICAgICAgICAgICBXcml0ZVNPQ19ERCggYmFzZSArIDB4NDAsIE1BQ180MGgpOw0KKwl9DQorI2VuZGlmDQorDQorI2lmZGVmIE1BQ180OGgNCisJV3JpdGVTT0NfREQoIGJhc2UgKyAweDQ4LCBNQUNfNDhoKTsNCisjZW5kaWYNCisNCisJaWYgKCBNb2RlU3dpdGNoID09IE1PREVfTlNDSSApDQorCQlXcml0ZVNPQ19ERCggYmFzZSArIDB4NGMsIE5DU0lfUnhETUFfUGFrU2l6ZSk7ICAgDQorCWVsc2UNCisJCVdyaXRlU09DX0REKCBiYXNlICsgMHg0YywgRE1BX1Bha1NpemUpOw0KKwkNCisJV3JpdGVTT0NfREQoIGJhc2UgKyAweDUwLCBNQUNfNTBoIHwgTUFDXzUwaF9TcGVlZCB8IDB4Zik7DQorCURFTEFZKERlbGF5X01BQ1JzdCk7DQorfSAvLyBFbmQgdm9pZCBpbml0X21hYyAoVUxPTkcgYmFzZSwgVUxPTkcgdGRleGJhc2UsIFVMT05HIHJkZXhiYXNlKQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLy8gQmFzaWMNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgRlByaV9SZWdWYWx1ZSAoQllURSBvcHRpb24pIHsNCisgICAgDQorI2lmZGVmIFNMVF9VQk9PVA0KKyNlbHNlDQorICAgIHRpbWVfdAl0aW1lY3VyOw0KKyNlbmRpZg0KKw0KKyAgICBGSUxFX1ZBUg0KKyAgICANCisgICAgR0VUX09CSiggb3B0aW9uICkNCisNCisJUFJJTlQoT1VUX09CSiAiW1NDVV0gMDQ6JTA4bHggMDg6JTA4bHggMGM6JTA4bHggNDg6JTA4bHhcbiIsIFNDVV8wNGhfb2xkLCBTQ1VfMDhoX29sZCwgU0NVXzBjaF9vbGQsIFNDVV80OGhfb2xkKTsNCisJUFJJTlQoT1VUX09CSiAiW1NDVV0gNzA6JTA4bHggNzQ6JTA4bHggN2M6JTA4bHhcbiIsICAgICAgICAgU0NVXzcwaF9vbGQsIFNDVV83NGhfb2xkLCBTQ1VfN2NoX29sZCk7DQorCVBSSU5UKE9VVF9PQkogIltTQ1VdIDgwOiUwOGx4IDg4OiUwOGx4IDkwOiUwOGx4IGYwOiUwOGx4XG4iLCBTQ1VfODBoX29sZCwgU0NVXzg4aF9vbGQsIFNDVV85MGhfb2xkLCBTQ1VfZjBoX29sZCk7DQorCVBSSU5UKE9VVF9PQkogIltTQ1VdIGE0OiUwOGx4IGFjOiUwOGx4XG4iLCBTQ1VfYTRoX29sZCwgU0NVX2FjaF9vbGQpOw0KKwlQUklOVChPVVRfT0JKICJbV0RUXSAwYzolMDhseCAyYzolMDhseFxuIiwgV0RUXzBjaF9vbGQsIFdEVF8yY2hfb2xkKTsNCisJUFJJTlQoT1VUX09CSiAiW01BQ10gMDg6JTA4bHggMGM6JTA4bHhcbiIsIE1BQ18wOGhfb2xkLCBNQUNfMGNoX29sZCk7DQorICAgICAgICAgICAgUFJJTlQoT1VUX09CSiAiW01BQ10gQTB8JTA4bHggJTA4bHggJTA4bHggJTA4bHhcbiIsIFJlYWRTT0NfREQoIE1BQ19QSFlCQVNFICsgMHhhMCksIFJlYWRTT0NfREQoIE1BQ19QSFlCQVNFICsgMHhhNCApLCBSZWFkU09DX0REKCBNQUNfUEhZQkFTRSArIDB4YTggKSwgUmVhZFNPQ19ERChNQUNfUEhZQkFTRSArIDB4YWMgKSApOw0KKwlQUklOVChPVVRfT0JKICJbTUFDXSBCMHwlMDhseCAlMDhseCAlMDhseCAlMDhseFxuIiwgUmVhZFNPQ19ERCggTUFDX1BIWUJBU0UgKyAweGIwKSwgUmVhZFNPQ19ERCggTUFDX1BIWUJBU0UgKyAweGI0ICksIFJlYWRTT0NfREQoIE1BQ19QSFlCQVNFICsgMHhiOCApLCBSZWFkU09DX0REKE1BQ19QSFlCQVNFICsgMHhiYyApICk7DQorCVBSSU5UKE9VVF9PQkogIltNQUNdIEMwfCUwOGx4ICUwOGx4ICUwOGx4XG4iLCAgICAgIFJlYWRTT0NfREQoIE1BQ19QSFlCQVNFICsgMHhjMCksIFJlYWRTT0NfREQoIE1BQ19QSFlCQVNFICsgMHhjNCApLCBSZWFkU09DX0REKCBNQUNfUEhZQkFTRSArIDB4YzggKSk7DQorDQorI2lmZGVmIFNMVF9VQk9PVA0KKyNlbHNlDQorCWZwcmludGYoZnAsICJUaW1lOiAlcyIsIGN0aW1lKCZ0aW1lc3RhcnQpKTsNCisJdGltZSgmdGltZWN1cik7DQorCWZwcmludGYoZnAsICItLS0tPiAlcyIsIGN0aW1lKCZ0aW1lY3VyKSk7DQorI2VuZGlmDQorfSAvLyBFbmQgdm9pZCBGUHJpX1JlZ1ZhbHVlIChCWVRFICpmcCkNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgRlByaV9FbmQgKEJZVEUgb3B0aW9uKSB7DQorICAgIA0KKyAgICBGSUxFX1ZBUg0KKyAgICANCisgICAgR0VUX09CSiggb3B0aW9uICkNCisgICAgDQorCWlmICggIVJ4RGF0YUVuYWJsZSApIHsNCisJfSANCisJZWxzZSBpZiAoIEVycl9GbGFnICkgew0KKwkJUFJJTlQoT1VUX09CSiAiICAgICAgICAgICAgICAgICAgICBcbi0tLS0+IGZhaWwgISEhXG4iKTsNCisJfSBlbHNlIHsNCisJCVBSSU5UKE9VVF9PQkogIiAgICAgICAgICAgICAgICAgICAgXG4tLS0tPiBBbGwgUGFzcyAhISFcbiIpOw0KKwl9DQorDQorCWlmICggTW9kZVN3aXRjaCA9PSBNT0RFX0RFRElDQVRFRCApIHsNCisJCWlmIChQSFlfQURSX2FyZyAhPSBQSFlfQURSKSANCisJCSAgICBQUklOVChPVVRfT0JKICJcbltXYXJuaW5nXSBQSFkgQWRkcmVzcyBjaGFuZ2UgZnJvbSAlZCB0byAlZCAhISFcbiIsIFBIWV9BRFJfYXJnLCBQSFlfQURSKTsNCisgICAgfQ0KKwkNCisJaWYgKCBBU1QxMDEwICkgew0KKwkJRGF0X1VMT05HID0gKFNDVV9hY2hfb2xkID4+IDEyKSAmIDB4ZjsNCisJCWlmIChEYXRfVUxPTkcpIHsNCisJCQlQUklOVChPVVRfT0JKICJcbltXYXJuaW5nXSBTQ1VBQ1sxNToxMl0gPT0gMHglMDJseCBpcyBub3QgdGhlIHN1Z2dlc3Rpb24gdmFsdWUgMC5cbiIsIERhdF9VTE9ORyk7DQorCQkJUFJJTlQoT1VUX09CSiAiICAgICAgICAgIFRoaXMgY2hhbmdlIGF0IHRoaXMgcGxhdGZvcm0gbXVzdCBiZWVuIHByb3ZlbiBhZ2FpbiBieSB0aGUgQVNQRUVELlxuIik7DQorCQl9DQorDQorCQlTQ1VfNDhoX2RlZmF1bHQgPSBTQ1VfNDhoX0FTVDEwMTAgJiAweDAxMDAwZjAwOw0KKwkJaWYgKChTQ1VfNDhoX29sZCAhPSBTQ1VfNDhoX2RlZmF1bHQpKSB7DQorCQkJUFJJTlQoT1VUX09CSiAiXG5bV2FybmluZ10gU0NVNDggPT0gMHglMDhseCBpcyBub3QgdGhlIHN1Z2dlc3Rpb24gdmFsdWUgMHglMDhseC5cbiIsIFNDVV80OGhfb2xkLCBTQ1VfNDhoX2RlZmF1bHQpOw0KKwkJCVBSSU5UKE9VVF9PQkogIiAgICAgICAgICBUaGlzIGNoYW5nZSBhdCB0aGlzIHBsYXRmb3JtIG11c3QgYmVlbiBwcm92ZW4gYWdhaW4gYnkgdGhlIEFTUEVFRC5cbiIpOw0KKwkJfQ0KKwl9IA0KKwllbHNlIGlmICggQVNUMjMwMCApIHsNCisJCWlmICggQVNUMjQwMCApIHsNCisJCQlEYXRfVUxPTkcgPSAoU0NVXzkwaF9vbGQgPj4gOCkgJiAweGY7DQorCQkJaWYgKERhdF9VTE9ORykgew0KKwkJCQlQUklOVChPVVRfT0JKICJcbltXYXJuaW5nXSBTQ1U5MFsxMTogOF0gPT0gMHglMDJseCBpcyBub3QgdGhlIHN1Z2dlc3Rpb24gdmFsdWUgMC5cbiIsIERhdF9VTE9ORyk7DQorCQkJCVBSSU5UKE9VVF9PQkogIiAgICAgICAgICBUaGlzIGNoYW5nZSBhdCB0aGlzIHBsYXRmb3JtIG11c3QgYmVlbiBwcm92ZW4gYWdhaW4gYnkgdGhlIEFTUEVFRC5cbiIpOw0KKwkJCX0NCisJCX0gDQorCQllbHNlIHsNCisJCQlEYXRfVUxPTkcgPSAoU0NVXzkwaF9vbGQgPj4gOCkgJiAweGZmOw0KKwkJCWlmIChEYXRfVUxPTkcpIHsNCisJCQkJUFJJTlQoT1VUX09CSiAiXG5bV2FybmluZ10gU0NVOTBbMTU6IDhdID09IDB4JTAybHggaXMgbm90IHRoZSBzdWdnZXN0aW9uIHZhbHVlIDAuXG4iLCBEYXRfVUxPTkcpOw0KKwkJCQlQUklOVChPVVRfT0JKICIgICAgICAgICAgVGhpcyBjaGFuZ2UgYXQgdGhpcyBwbGF0Zm9ybSBtdXN0IGJlZW4gcHJvdmVuIGFnYWluIGJ5IHRoZSBBU1BFRUQuXG4iKTsNCisJCQl9DQorCQl9DQorDQorCQlpZiAoRW5hYmxlX01BQzM0KSBTQ1VfNDhoX2RlZmF1bHQgPSBTQ1VfNDhoX0FTVDIzMDA7DQorCQllbHNlICAgICAgICAgICAgICBTQ1VfNDhoX2RlZmF1bHQgPSBTQ1VfNDhoX0FTVDIzMDAgJiAweDAzMDBmZmZmOw0KKwkJICAgIA0KKwkJaWYgKChTQ1VfNDhoX29sZCAhPSBTQ1VfNDhoX2RlZmF1bHQpKSB7DQorCQkJUFJJTlQoT1VUX09CSiAiXG5bV2FybmluZ10gU0NVNDggPT0gMHglMDhseCBpcyBub3QgdGhlIHN1Z2dlc3Rpb24gdmFsdWUgMHglMDhseC5cbiIsIFNDVV80OGhfb2xkLCBTQ1VfNDhoX2RlZmF1bHQpOw0KKwkJCVBSSU5UKE9VVF9PQkogIiAgICAgICAgICBUaGlzIGNoYW5nZSBhdCB0aGlzIHBsYXRmb3JtIG11c3QgYmVlbiBwcm92ZW4gYWdhaW4gYnkgdGhlIEFTUEVFRC5cbiIpOw0KKwkJfQ0KKwl9IC8vIEVuZCBpZiAoIEFTVDEwMTAgKQ0KKw0KKwlpZiAoIE1vZGVTd2l0Y2ggPT0gTU9ERV9OU0NJICkgew0KKwkJUFJJTlQoT1VUX09CSiAiXG5bQXJnXSAlZCAlZCAlZCAlZCAlZCAlbGQgKCVzKVxuIiwgR1J1bl9Nb2RlLCBQYWNrYWdlVG9sTnVtLCBDaGFubmVsVG9sTnVtLCBUZXN0TW9kZSwgSU9UaW1pbmdCdW5kLCAoQVJQTnVtQ250fCAoVUxPTkcpUHJpbnROQ1NJRW4pLCBBU1RDaGlwTmFtZSk7DQorDQorCQlzd2l0Y2ggKE5DU0lfQ2FwX1NMVC5QQ0lfRElEX1ZJRCkgew0KKwkJCWNhc2UgUENJX0RJRF9WSURfSW50ZWxfODI1NzRMCQkgOiBQUklOVCggT1VUX09CSiAiW05DXSUwOGx4ICUwOGx4OiBJbnRlbCA4MjU3NEwgICAgICAgXG4iLCBOQ1NJX0NhcF9TTFQuTWFudWZhY3R1cmVySUQsIE5DU0lfQ2FwX1NMVC5QQ0lfRElEX1ZJRCApOyBicmVhazsNCisJCQljYXNlIFBDSV9ESURfVklEX0ludGVsXzgyNTc1XzEwZDYJIDogUFJJTlQoIE9VVF9PQkogIltOQ10lMDhseCAlMDhseDogSW50ZWwgODI1NzUgICAgICAgIFxuIiwgTkNTSV9DYXBfU0xULk1hbnVmYWN0dXJlcklELCBOQ1NJX0NhcF9TTFQuUENJX0RJRF9WSUQgKTsgYnJlYWs7DQorCQkJY2FzZSBQQ0lfRElEX1ZJRF9JbnRlbF84MjU3NV8xMGE3CSA6IFBSSU5UKCBPVVRfT0JKICJbTkNdJTA4bHggJTA4bHg6IEludGVsIDgyNTc1ICAgICAgICBcbiIsIE5DU0lfQ2FwX1NMVC5NYW51ZmFjdHVyZXJJRCwgTkNTSV9DYXBfU0xULlBDSV9ESURfVklEICk7IGJyZWFrOw0KKwkJCWNhc2UgUENJX0RJRF9WSURfSW50ZWxfODI1NzVfMTBhOQkgOiBQUklOVCggT1VUX09CSiAiW05DXSUwOGx4ICUwOGx4OiBJbnRlbCA4MjU3NSAgICAgICAgXG4iLCBOQ1NJX0NhcF9TTFQuTWFudWZhY3R1cmVySUQsIE5DU0lfQ2FwX1NMVC5QQ0lfRElEX1ZJRCApOyBicmVhazsNCisJCQljYXNlIFBDSV9ESURfVklEX0ludGVsXzgyNTc2XzEwYzkJIDogUFJJTlQoIE9VVF9PQkogIltOQ10lMDhseCAlMDhseDogSW50ZWwgODI1NzYgICAgICAgIFxuIiwgTkNTSV9DYXBfU0xULk1hbnVmYWN0dXJlcklELCBOQ1NJX0NhcF9TTFQuUENJX0RJRF9WSUQgKTsgYnJlYWs7DQorCQkJY2FzZSBQQ0lfRElEX1ZJRF9JbnRlbF84MjU3Nl8xMGU2CSA6IFBSSU5UKCBPVVRfT0JKICJbTkNdJTA4bHggJTA4bHg6IEludGVsIDgyNTc2ICAgICAgICBcbiIsIE5DU0lfQ2FwX1NMVC5NYW51ZmFjdHVyZXJJRCwgTkNTSV9DYXBfU0xULlBDSV9ESURfVklEICk7IGJyZWFrOw0KKwkJCWNhc2UgUENJX0RJRF9WSURfSW50ZWxfODI1NzZfMTBlNwkgOiBQUklOVCggT1VUX09CSiAiW05DXSUwOGx4ICUwOGx4OiBJbnRlbCA4MjU3NiAgICAgICAgXG4iLCBOQ1NJX0NhcF9TTFQuTWFudWZhY3R1cmVySUQsIE5DU0lfQ2FwX1NMVC5QQ0lfRElEX1ZJRCApOyBicmVhazsNCisJCQljYXNlIFBDSV9ESURfVklEX0ludGVsXzgyNTc2XzEwZTgJIDogUFJJTlQoIE9VVF9PQkogIltOQ10lMDhseCAlMDhseDogSW50ZWwgODI1NzYgICAgICAgIFxuIiwgTkNTSV9DYXBfU0xULk1hbnVmYWN0dXJlcklELCBOQ1NJX0NhcF9TTFQuUENJX0RJRF9WSUQgKTsgYnJlYWs7DQorCQkJY2FzZSBQQ0lfRElEX1ZJRF9JbnRlbF84MjU3Nl8xNTE4CSA6IFBSSU5UKCBPVVRfT0JKICJbTkNdJTA4bHggJTA4bHg6IEludGVsIDgyNTc2ICAgICAgICBcbiIsIE5DU0lfQ2FwX1NMVC5NYW51ZmFjdHVyZXJJRCwgTkNTSV9DYXBfU0xULlBDSV9ESURfVklEICk7IGJyZWFrOw0KKwkJCWNhc2UgUENJX0RJRF9WSURfSW50ZWxfODI1NzZfMTUyNgkgOiBQUklOVCggT1VUX09CSiAiW05DXSUwOGx4ICUwOGx4OiBJbnRlbCA4MjU3NiAgICAgICAgXG4iLCBOQ1NJX0NhcF9TTFQuTWFudWZhY3R1cmVySUQsIE5DU0lfQ2FwX1NMVC5QQ0lfRElEX1ZJRCApOyBicmVhazsNCisJCQljYXNlIFBDSV9ESURfVklEX0ludGVsXzgyNTc2XzE1MGEJIDogUFJJTlQoIE9VVF9PQkogIltOQ10lMDhseCAlMDhseDogSW50ZWwgODI1NzYgICAgICAgIFxuIiwgTkNTSV9DYXBfU0xULk1hbnVmYWN0dXJlcklELCBOQ1NJX0NhcF9TTFQuUENJX0RJRF9WSUQgKTsgYnJlYWs7DQorCQkJY2FzZSBQQ0lfRElEX1ZJRF9JbnRlbF84MjU3Nl8xNTBkCSA6IFBSSU5UKCBPVVRfT0JKICJbTkNdJTA4bHggJTA4bHg6IEludGVsIDgyNTc2ICAgICAgICBcbiIsIE5DU0lfQ2FwX1NMVC5NYW51ZmFjdHVyZXJJRCwgTkNTSV9DYXBfU0xULlBDSV9ESURfVklEICk7IGJyZWFrOw0KKwkJCWNhc2UgUENJX0RJRF9WSURfSW50ZWxfODI1OTlfMTBmYgkgOiBQUklOVCggT1VUX09CSiAiW05DXSUwOGx4ICUwOGx4OiBJbnRlbCA4MjU5OSAgICAgICAgXG4iLCBOQ1NJX0NhcF9TTFQuTWFudWZhY3R1cmVySUQsIE5DU0lfQ2FwX1NMVC5QQ0lfRElEX1ZJRCApOyBicmVhazsNCisJCQljYXNlIFBDSV9ESURfVklEX0ludGVsXzgyNTk5XzE1NTcJIDogUFJJTlQoIE9VVF9PQkogIltOQ10lMDhseCAlMDhseDogSW50ZWwgODI1OTkgICAgICAgIFxuIiwgTkNTSV9DYXBfU0xULk1hbnVmYWN0dXJlcklELCBOQ1NJX0NhcF9TTFQuUENJX0RJRF9WSUQgKTsgYnJlYWs7DQorCQkJY2FzZSBQQ0lfRElEX1ZJRF9JbnRlbF9JMzUwXzE1MjEJIDogUFJJTlQoIE9VVF9PQkogIltOQ10lMDhseCAlMDhseDogSW50ZWwgSTM1MCAgICAgICAgIFxuIiwgTkNTSV9DYXBfU0xULk1hbnVmYWN0dXJlcklELCBOQ1NJX0NhcF9TTFQuUENJX0RJRF9WSUQgKTsgYnJlYWs7DQorCQkJY2FzZSBQQ0lfRElEX1ZJRF9JbnRlbF9JMzUwXzE1MjMJIDogUFJJTlQoIE9VVF9PQkogIltOQ10lMDhseCAlMDhseDogSW50ZWwgSTM1MCAgICAgICAgIFxuIiwgTkNTSV9DYXBfU0xULk1hbnVmYWN0dXJlcklELCBOQ1NJX0NhcF9TTFQuUENJX0RJRF9WSUQgKTsgYnJlYWs7DQorCQkJY2FzZSBQQ0lfRElEX1ZJRF9JbnRlbF9JMjEwICAgICAJIDogUFJJTlQoIE9VVF9PQkogIltOQ10lMDhseCAlMDhseDogSW50ZWwgSTIxMCAgICAgICAgIFxuIiwgTkNTSV9DYXBfU0xULk1hbnVmYWN0dXJlcklELCBOQ1NJX0NhcF9TTFQuUENJX0RJRF9WSUQgKTsgYnJlYWs7DQorCQkJY2FzZSBQQ0lfRElEX1ZJRF9JbnRlbF9YNTQwCSAgICAgICAgIDogUFJJTlQoIE9VVF9PQkogIltOQ10lMDhseCAlMDhseDogSW50ZWwgWDU0MCAgICAgICAgIFxuIiwgTkNTSV9DYXBfU0xULk1hbnVmYWN0dXJlcklELCBOQ1NJX0NhcF9TTFQuUENJX0RJRF9WSUQgKTsgYnJlYWs7DQorCQkJY2FzZSBQQ0lfRElEX1ZJRF9Ccm9hZGNvbV9CQ001NzE4CSA6IFBSSU5UKCBPVVRfT0JKICJbTkNdJTA4bHggJTA4bHg6IEJyb2FkY29tIEJDTTU3MTggICBcbiIsIE5DU0lfQ2FwX1NMVC5NYW51ZmFjdHVyZXJJRCwgTkNTSV9DYXBfU0xULlBDSV9ESURfVklEICk7IGJyZWFrOw0KKwkJCWNhc2UgUENJX0RJRF9WSURfQnJvYWRjb21fQkNNNTcyMAkgOiBQUklOVCggT1VUX09CSiAiW05DXSUwOGx4ICUwOGx4OiBCcm9hZGNvbSBCQ001NzIwICAgXG4iLCBOQ1NJX0NhcF9TTFQuTWFudWZhY3R1cmVySUQsIE5DU0lfQ2FwX1NMVC5QQ0lfRElEX1ZJRCApOyBicmVhazsNCisJCQljYXNlIFBDSV9ESURfVklEX0Jyb2FkY29tX0JDTTU3MjUJIDogUFJJTlQoIE9VVF9PQkogIltOQ10lMDhseCAlMDhseDogQnJvYWRjb20gQkNNNTcyNSAgIFxuIiwgTkNTSV9DYXBfU0xULk1hbnVmYWN0dXJlcklELCBOQ1NJX0NhcF9TTFQuUENJX0RJRF9WSUQgKTsgYnJlYWs7DQorLy8JCQljYXNlIFBDSV9ESURfVklEX0Jyb2FkY29tX0JDTTU3ODEwCSA6IFBSSU5UKCBPVVRfT0JKICJbTkNdJTA4eCAlMDh4OiBCcm9hZGNvbSBCQ001NzgxMCAgXG4iLCBOQ1NJX0NhcF9TTFQuTWFudWZhY3R1cmVySUQsIE5DU0lfQ2FwX1NMVC5QQ0lfRElEX1ZJRCApOyBicmVhazsNCisJCQljYXNlIFBDSV9ESURfVklEX01lbGxhbm94X0Nvbm5lY3RYXzMgOiBQUklOVCggT1VUX09CSiAiW05DXSUwOGx4ICUwOGx4OiBNZWxsYW5veCBDb25uZWN0WC0zXG4iLCBOQ1NJX0NhcF9TTFQuTWFudWZhY3R1cmVySUQsIE5DU0lfQ2FwX1NMVC5QQ0lfRElEX1ZJRCApOyBicmVhazsNCisJCQlkZWZhdWx0CQkJCQk6DQorCQkJCXN3aXRjaCAoTkNTSV9DYXBfU0xULk1hbnVmYWN0dXJlcklEKSB7DQorCQkJCQljYXNlIE1hbnVmYWN0dXJlcklEX0ludGVsICAgIDogUFJJTlQoIE9VVF9PQkogIltOQ10lMDhseCAlMDhseDogSW50ZWwgICBcbiIsIE5DU0lfQ2FwX1NMVC5NYW51ZmFjdHVyZXJJRCwgTkNTSV9DYXBfU0xULlBDSV9ESURfVklEICk7IGJyZWFrOw0KKwkJCQkJY2FzZSBNYW51ZmFjdHVyZXJJRF9Ccm9hZGNvbSA6IFBSSU5UKCBPVVRfT0JKICJbTkNdJTA4bHggJTA4bHg6IEJyb2FkY29tXG4iLCBOQ1NJX0NhcF9TTFQuTWFudWZhY3R1cmVySUQsIE5DU0lfQ2FwX1NMVC5QQ0lfRElEX1ZJRCApOyBicmVhazsNCisJCQkJCWNhc2UgTWFudWZhY3R1cmVySURfTWVsbGFub3ggOiBQUklOVCggT1VUX09CSiAiW05DXSUwOGx4ICUwOGx4OiBNZWxsYW5veFxuIiwgTkNTSV9DYXBfU0xULk1hbnVmYWN0dXJlcklELCBOQ1NJX0NhcF9TTFQuUENJX0RJRF9WSUQgKTsgYnJlYWs7DQorCQkJCQlkZWZhdWx0CQkJCTogUFJJTlQoT1VUX09CSiAiW05DXSUwOGx4ICUwOGx4ICAgICAgICAgIFxuIiwgTkNTSV9DYXBfU0xULk1hbnVmYWN0dXJlcklELCBOQ1NJX0NhcF9TTFQuUENJX0RJRF9WSUQpOyBicmVhazsNCisJCQkJfSAvLyBFbmQgc3dpdGNoIChOQ1NJX0NhcF9TTFQuTWFudWZhY3R1cmVySUQpDQorCQl9IC8vIEVuZCBzd2l0Y2ggKE5DU0lfQ2FwX1NMVC5QQ0lfRElEX1ZJRCkNCisJfQ0KKwllbHNlIHsNCisJCWlmIChMT09QX0lORklOSSkgUFJJTlQoT1VUX09CSiAiXG5bQXJnXSAlZCAlZCAlZCAjICVkICVkICVkICVseCAoJXMpWyVkICVkICVkXVxuIiAsIEdSdW5fTW9kZSwgR1NwZWVkLCBHQ3RybCwgICAgICAgICAgICAgICBUZXN0TW9kZSwgUEhZX0FEUl9hcmcsIElPVGltaW5nQnVuZCwgVXNlckRWYWwsIEFTVENoaXBOYW1lLCBMb29wX3JsWzBdLCBMb29wX3JsWzFdLCBMb29wX3JsWzJdKTsNCisJCWVsc2UgICAgICAgICAgICAgUFJJTlQoT1VUX09CSiAiXG5bQXJnXSAlZCAlZCAlZCAlbGQgJWQgJWQgJWQgJWx4ICglcylbJWQgJWQgJWRdXG4iLCBHUnVuX01vZGUsIEdTcGVlZCwgR0N0cmwsIExPT1BfTUFYX2FyZywgVGVzdE1vZGUsIFBIWV9BRFJfYXJnLCBJT1RpbWluZ0J1bmQsIFVzZXJEVmFsLCBBU1RDaGlwTmFtZSwgTG9vcF9ybFswXSwgTG9vcF9ybFsxXSwgTG9vcF9ybFsyXSk7DQorCQkgICAgDQorCQlQUklOVChPVVRfT0JKICJbUEhZXSBBZHI6JWQgSUQyOiUwNGx4IElEMzolMDRseCAoJXMpXG4iLCBQSFlfQURSLCBQSFlfSUQyLCBQSFlfSUQzLCBQSFlOYW1lKTsNCisJfSAvLyBFbmQgaWYgKCBNb2RlU3dpdGNoID09IE1PREVfTlNDSSApIA0KKwkNCisjaWZkZWYgU1VQUE9SVF9QSFlfTEFOOTMwMw0KKwlQUklOVChPVVRfT0JKICJbVmVyIElJXSAlcyAoZm9yIExBTjkzMDMgd2l0aCBJMkMlZClcbiIsIHZlcnNpb25fbmFtZSwgTEFOOTMwM19JMkNfQlVTTlVNKTsNCisjZWxzZQ0KKwlQUklOVChPVVRfT0JKICJbVmVyIElJXSAlc1xuIiwgdmVyc2lvbl9uYW1lKTsNCisjZW5kaWYNCit9IC8vIEVuZCB2b2lkIEZQcmlfRW5kIChCWVRFIG9wdGlvbikNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgRlByaV9FcnJGbGFnIChCWVRFIG9wdGlvbikgew0KKyAgICANCisgICAgRklMRV9WQVINCisgICAgDQorICAgIEdFVF9PQkooIG9wdGlvbiApDQorICAgIA0KKwlpZiAoRXJyX0ZsYWcgJiYgRXJyX0ZsYWdfUHJpbnRFbikgew0KKwkJUFJJTlQoT1VUX09CSiAiXG5cbiIpOw0KKy8vZnByaW50ZihmcCwgIkVycl9GbGFnOiAleFxuXG4iLCBFcnJfRmxhZyk7DQorDQorCQlpZiAoIEVycl9GbGFnICYgRXJyX1BIWV9UeXBlICAgICAgICAgICAgICAgICkgUFJJTlQoIE9VVF9PQkogIltFcnJdIFVuaWRlbnRpZmlhYmxlIFBIWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgKTsNCisJCWlmICggRXJyX0ZsYWcgJiBFcnJfTUFMTE9DX0ZybVNpemUgICAgICAgICAgKSBQUklOVCggT1VUX09CSiAiW0Vycl0gTWFsbG9jIGZhaWwgYXQgZnJhbWUgc2l6ZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgIFxuIiApOw0KKwkJaWYgKCBFcnJfRmxhZyAmIEVycl9NQUxMT0NfTGFzdFdQICAgICAgICAgICApIFBSSU5UKCBPVVRfT0JKICJbRXJyXSBNYWxsb2MgZmFpbCBhdCBsYXN0IFdQIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iICk7DQorCQlpZiAoIEVycl9GbGFnICYgRXJyX0NoZWNrX0J1Zl9EYXRhICAgICAgICAgICkgUFJJTlQoIE9VVF9PQkogIltFcnJdIFJlY2VpdmVkIGRhdGEgbWlzbWF0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgKTsNCisJCWlmICggRXJyX0ZsYWcgJiBFcnJfTkNTSV9DaGVja19UeE93blRpbWVPdXQgKSBQUklOVCggT1VUX09CSiAiW0Vycl0gVGltZSBvdXQgb2YgY2hlY2tpbmcgVHggb3duZXIgYml0IGluIE5DU0kgcGFja2V0ICAgICAgIFxuIiApOw0KKwkJaWYgKCBFcnJfRmxhZyAmIEVycl9OQ1NJX0NoZWNrX1J4T3duVGltZU91dCApIFBSSU5UKCBPVVRfT0JKICJbRXJyXSBUaW1lIG91dCBvZiBjaGVja2luZyBSeCBvd25lciBiaXQgaW4gTkNTSSBwYWNrZXQgICAgICAgXG4iICk7DQorCQlpZiAoIEVycl9GbGFnICYgRXJyX05DU0lfQ2hlY2tfQVJQT3duVGltZU91dCkgUFJJTlQoIE9VVF9PQkogIltFcnJdIFRpbWUgb3V0IG9mIGNoZWNraW5nIEFSUCBvd25lciBiaXQgaW4gTkNTSSBwYWNrZXQgICAgICBcbiIgKTsNCisJCWlmICggRXJyX0ZsYWcgJiBFcnJfTkNTSV9Ob19QSFkgICAgICAgICAgICAgKSBQUklOVCggT1VUX09CSiAiW0Vycl0gQ2FuIG5vdCBmaW5kIE5DU0kgUEhZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiApOw0KKwkJaWYgKCBFcnJfRmxhZyAmIEVycl9OQ1NJX0NoYW5uZWxfTnVtICAgICAgICApIFBSSU5UKCBPVVRfT0JKICJbRXJyXSBOQ1NJIENoYW5uZWwgTnVtYmVyIE1pc21hdGNoICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iICk7DQorCQlpZiAoIEVycl9GbGFnICYgRXJyX05DU0lfUGFja2FnZV9OdW0gICAgICAgICkgUFJJTlQoIE9VVF9PQkogIltFcnJdIE5DU0kgUGFja2FnZSBOdW1iZXIgTWlzbWF0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgKTsNCisJCWlmICggRXJyX0ZsYWcgJiBFcnJfUEhZX1RpbWVPdXQgICAgICAgICAgICAgKSBQUklOVCggT1VUX09CSiAiW0Vycl0gVGltZSBvdXQgb2YgcmVhZC93cml0ZS9yZXNldCBQSFkgcmVnaXN0ZXIgICAgICAgICAgICAgIFxuIiApOw0KKwkJaWYgKCBFcnJfRmxhZyAmIEVycl9SWEJVRl9VTkFWQSAgICAgICAgICAgICApIFBSSU5UKCBPVVRfT0JKICJbRXJyXSBNQUMwMGhbMl06UmVjZWl2aW5nIGJ1ZmZlciB1bmF2YWlsYWJsZSAgICAgICAgICAgICAgICAgXG4iICk7DQorCQlpZiAoIEVycl9GbGFnICYgRXJyX1JQS1RfTE9TVCAgICAgICAgICAgICAgICkgUFJJTlQoIE9VVF9PQkogIltFcnJdIE1BQzAwaFszXTpSZWNlaXZlZCBwYWNrZXQgbG9zdCBkdWUgdG8gUlggRklGTyBmdWxsICAgICBcbiIgKTsNCisJCWlmICggRXJyX0ZsYWcgJiBFcnJfTlBUWEJVRl9VTkFWQSAgICAgICAgICAgKSBQUklOVCggT1VUX09CSiAiW0Vycl0gTUFDMDBoWzZdOk5vcm1hbCBwcmlvcml0eSB0cmFuc21pdCBidWZmZXIgdW5hdmFpbGFibGUgIFxuIiApOw0KKwkJaWYgKCBFcnJfRmxhZyAmIEVycl9UUEtUX0xPU1QgICAgICAgICAgICAgICApIFBSSU5UKCBPVVRfT0JKICJbRXJyXSBNQUMwMGhbN106UGFja2V0cyB0cmFuc21pdHRlZCB0byBFdGhlcm5ldCBsb3N0ICAgICAgICAgXG4iICk7DQorCQlpZiAoIEVycl9GbGFnICYgRXJyX0RNQUJ1Zk51bSAgICAgICAgICAgICAgICkgUFJJTlQoIE9VVF9PQkogIltFcnJdIERNQSBCdWZmZXIgaXMgbm90IGVub3VnaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgKTsNCisJCWlmICggRXJyX0ZsYWcgJiBFcnJfSU9NYXJnaW4gICAgICAgICAgICAgICAgKSBQUklOVCggT1VUX09CSiAiW0Vycl0gSU8gdGltaW5nIG1hcmdpbiBpcyBub3QgZW5vdWdoICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiApOw0KKwkJICAgIA0KKwkJaWYgKCBFcnJfRmxhZyAmIEVycl9NSENMS19SYXRpbyAgICAgICAgICAgICApIHsNCisJCQlpZiAoIEFTVDEwMTAgKSB7DQorCQkJCVBSSU5UKE9VVF9PQkogIltFcnJdIEVycm9yIHNldHRpbmcgb2YgTUFDIEFIQiBidXMgY2xvY2sgKFNDVTA4WzEzOjEyXSkgICAgICBcbiIpOw0KKwkJCQlEYXRfVUxPTkcgPSAoU0NVXzA4aF9vbGQgPj4gMTIpICYgMHgzOw0KKwkJCQlQUklOVChPVVRfT0JKICIgICAgICBTQ1UwOFsxMzoxMl0gPT0gMHglMDFseCBpcyBub3QgdGhlIHN1Z2dlc3Rpb24gdmFsdWUgMC5cbiIsIERhdF9VTE9ORyk7DQorCQkJfSANCisJCQllbHNlIHsNCisJCQkJUFJJTlQoT1VUX09CSiAiW0Vycl0gRXJyb3Igc2V0dGluZyBvZiBNQUMgQUhCIGJ1cyBjbG9jayAoU0NVMDhbMTg6MTZdKSAgICAgIFxuIik7DQorCQkJCURhdF9VTE9ORyA9IChTQ1VfMDhoX29sZCA+PiAxNikgJiAweDc7DQorCQkJCQ0KKwkJCQlpZiAoTUFDMV8xR0VuIHwgTUFDMl8xR0VuKSB7DQorCQkJCQlQUklOVChPVVRfT0JKICIgICAgICBTQ1UwOFsxODoxNl0gPT0gMHglMDFseCBpcyBub3QgdGhlIHN1Z2dlc3Rpb24gdmFsdWUgMi5cbiIsIERhdF9VTE9ORyk7DQorCQkJCX0gDQorCQkJCWVsc2Ugew0KKwkJCQkJUFJJTlQoT1VUX09CSiAiICAgICAgU0NVMDhbMTg6MTZdID09IDB4JTAxbHggaXMgbm90IHRoZSBzdWdnZXN0aW9uIHZhbHVlIDQuXG4iLCBEYXRfVUxPTkcpOw0KKwkJCQl9DQorCQkJfSAvLyBlbmQgaWYgKCBBU1QxMDEwICkNCisJCX0gLy8gRW5kIGlmICggRXJyX0ZsYWcgJiBFcnJfTUhDTEtfUmF0aW8gICAgICAgICAgICAgKQ0KKw0KKwkJaWYgKEVycl9GbGFnICYgRXJyX0lPTWFyZ2luT1VGICAgICAgICAgICAgICkgew0KKwkJCVBSSU5UKE9VVF9PQkogIltFcnJdIElPIHRpbWluZyB0ZXN0aW5nIHJhbmdlIG91dCBvZiBib3VuZGFyeVxuIik7DQorCQkJaWYgKEVuYWJsZV9STUlJKSB7DQorI2lmZGVmIEVuYWJsZV9PbGRfU3R5bGUNCisJCQkJUFJJTlQoT1VUX09CSiAiICAgICAgKCVkLCVkKTogMXglZCBbJWRdeFslZDolZF1cbiIsICAgICAgICBJT2RseV9vdXRfcmVnX2lkeCwgSU9kbHlfaW5fcmVnX2lkeCwgSU9UaW1pbmdCdW5kLCBJT2RseV9vdXRfcmVnX2lkeCwgSU9kbHlfaW5fcmVnX2lkeCAtIChJT1RpbWluZ0J1bmQ+PjEpLCBJT2RseV9pbl9yZWdfaWR4ICsgKElPVGltaW5nQnVuZD4+MSkpOw0KKyNlbHNlDQorCQkJCVBSSU5UKE9VVF9PQkogIiAgICAgICglZCwlZCk6ICVkeDEgWyVkOiVkXXhbJWRdXG4iLCAgICAgICAgSU9kbHlfaW5fcmVnX2lkeCwgSU9kbHlfb3V0X3JlZ19pZHgsIElPVGltaW5nQnVuZCwgSU9kbHlfaW5fcmVnX2lkeCAtIChJT1RpbWluZ0J1bmQ+PjEpLCBJT2RseV9pbl9yZWdfaWR4ICsgKElPVGltaW5nQnVuZD4+MSksIElPZGx5X291dF9yZWdfaWR4KTsNCisjZW5kaWYNCisJCQl9IGVsc2Ugew0KKyNpZmRlZiBFbmFibGVfT2xkX1N0eWxlDQorCQkJCVBSSU5UKE9VVF9PQkogIiAgICAgICglZCwlZCk6ICVkeCVkIFslZDolZF14WyVkOiVkXVxuIiwgSU9kbHlfb3V0X3JlZ19pZHgsIElPZGx5X2luX3JlZ19pZHgsIElPVGltaW5nQnVuZCwgSU9UaW1pbmdCdW5kLCBJT2RseV9vdXRfcmVnX2lkeCAtIChJT1RpbWluZ0J1bmQ+PjEpLCBJT2RseV9vdXRfcmVnX2lkeCArIChJT1RpbWluZ0J1bmQ+PjEpLCBJT2RseV9pbl9yZWdfaWR4IC0gKElPVGltaW5nQnVuZD4+MSksIElPZGx5X2luX3JlZ19pZHggKyAoSU9UaW1pbmdCdW5kPj4xKSk7DQorI2Vsc2UNCisJCQkJUFJJTlQoT1VUX09CSiAiICAgICAgKCVkLCVkKTogJWR4JWQgWyVkOiVkXXhbJWQ6JWRdXG4iLCBJT2RseV9pbl9yZWdfaWR4LCBJT2RseV9vdXRfcmVnX2lkeCwgSU9UaW1pbmdCdW5kLCBJT1RpbWluZ0J1bmQsIElPZGx5X2luX3JlZ19pZHggLSAoSU9UaW1pbmdCdW5kPj4xKSwgSU9kbHlfaW5fcmVnX2lkeCArIChJT1RpbWluZ0J1bmQ+PjEpLCBJT2RseV9vdXRfcmVnX2lkeCAtIChJT1RpbWluZ0J1bmQ+PjEpLCBJT2RseV9vdXRfcmVnX2lkeCArIChJT1RpbWluZ0J1bmQ+PjEpKTsNCisjZW5kaWYNCisJCQl9DQorCQl9IC8vIEVuZCBpZiAoRXJyX0ZsYWcgJiBFcnJfSU9NYXJnaW5PVUYgICAgICAgICAgICAgKQ0KKwkJDQorCQlpZiAoRXJyX0ZsYWcgJiBFcnJfQ2hlY2tfRGVzICAgICAgICAgICAgICAgKSB7DQorCQkJUFJJTlQoT1VUX09CSiAiW0Vycl0gRGVzY3JpcHRvciBlcnJvclxuIik7DQorCQkJaWYgKCBDaGVja19EZXNfVmFsICYgQ2hlY2tfRGVzX1R4T3duVGltZU91dCApIFBSSU5UKCBPVVRfT0JKICJbRGVzXSBUaW1lIG91dCBvZiBjaGVja2luZyBUeCBvd25lciBiaXRcbiIgKTsNCisJCQlpZiAoIENoZWNrX0Rlc19WYWwgJiBDaGVja19EZXNfUnhPd25UaW1lT3V0ICkgUFJJTlQoIE9VVF9PQkogIltEZXNdIFRpbWUgb3V0IG9mIGNoZWNraW5nIFJ4IG93bmVyIGJpdFxuIiApOw0KKwkJCWlmICggQ2hlY2tfRGVzX1ZhbCAmIENoZWNrX0Rlc19SeEVyciAgICAgICAgKSBQUklOVCggT1VUX09CSiAiW0Rlc10gSW5wdXQgc2lnbmFsIFJ4RXJyICAgICAgICAgICAgICAgXG4iICk7DQorCQkJaWYgKCBDaGVja19EZXNfVmFsICYgQ2hlY2tfRGVzX09kZE5pYmJsZSAgICApIFBSSU5UKCBPVVRfT0JKICJbRGVzXSBOaWJibGUgYml0IGhhcHBlbiAgICAgICAgICAgICAgICBcbiIgKTsNCisJCQlpZiAoIENoZWNrX0Rlc19WYWwgJiBDaGVja19EZXNfQ1JDICAgICAgICAgICkgUFJJTlQoIE9VVF9PQkogIltEZXNdIENSQyBlcnJvciBvZiBmcmFtZSAgICAgICAgICAgICAgIFxuIiApOw0KKwkJCWlmICggQ2hlY2tfRGVzX1ZhbCAmIENoZWNrX0Rlc19SeEZJRk9GdWxsICAgKSBQUklOVCggT1VUX09CSiAiW0Rlc10gUnggRklGTyBmdWxsICAgICAgICAgICAgICAgICAgICAgXG4iICk7DQorCQkJaWYgKCBDaGVja19EZXNfVmFsICYgQ2hlY2tfRGVzX0ZyYW1lTGVuICAgICApIFBSSU5UKCBPVVRfT0JKICJbRGVzXSBGcmFtZSBsZW5ndGggbWlzbWF0Y2ggICAgICAgICAgICBcbiIgKTsNCisJCX0gLy8gRW5kIGlmIChFcnJfRmxhZyAmIEVycl9DaGVja19EZXMgICAgICAgICAgICAgICApDQorCQkNCisJCWlmIChFcnJfRmxhZyAmIEVycl9NQUNNb2RlICAgICAgICAgICAgICAgICkgew0KKwkJCVBSSU5UKE9VVF9PQkogIltFcnJdIE1BQyBpbnRlcmZhY2UgbW9kZSBtaXNtYXRjaFxuIik7DQorCQkJaWYgKCBBU1QxMDEwICkgew0KKwkJCX0gDQorCQkJZWxzZSBpZiAoQVNUMjMwMCkgew0KKwkJCQlzd2l0Y2ggKE1BQ19Nb2RlKSB7DQorCQkJCQljYXNlIDAgOiBQUklOVCggT1VUX09CSiAiICAgICAgU0NVNzBoWzc6Nl0gPT0gMDogW01BQyMxXSBSTUlJICAgW01BQyMyXSBSTUlJIFxuIiApOyBicmVhazsNCisJCQkJCWNhc2UgMSA6IFBSSU5UKCBPVVRfT0JKICIgICAgICBTQ1U3MGhbNzo2XSA9PSAxOiBbTUFDIzFdIFJHTUlJICBbTUFDIzJdIFJNSUkgXG4iICk7IGJyZWFrOw0KKwkJCQkJY2FzZSAyIDogUFJJTlQoIE9VVF9PQkogIiAgICAgIFNDVTcwaFs3OjZdID09IDI6IFtNQUMjMV0gUk1JSSAgIFtNQUMjMl0gUkdNSUlcbiIgKTsgYnJlYWs7DQorCQkJCQljYXNlIDMgOiBQUklOVCggT1VUX09CSiAiICAgICAgU0NVNzBoWzc6Nl0gPT0gMzogW01BQyMxXSBSR01JSSAgW01BQyMyXSBSR01JSVxuIiApOyBicmVhazsNCisJCQkJfQ0KKwkJCX0gDQorCQkJZWxzZSB7DQorICAgICAgICAgICAgICAgIHN3aXRjaCAoTUFDX01vZGUpIHsNCisgICAgICAgICAgICAgICAgCWNhc2UgMCA6IFBSSU5UKCBPVVRfT0JKICIgICAgICBTQ1U3MGhbODo2XSA9PSAwMDA6IFtNQUMjMV0gR01JSSAgICAgICAgICAgICAgIFxuIiApOyBicmVhazsNCisgICAgICAgICAgICAgICAgCWNhc2UgMSA6IFBSSU5UKCBPVVRfT0JKICIgICAgICBTQ1U3MGhbODo2XSA9PSAwMDE6IFtNQUMjMV0gTUlJICAgIFtNQUMjMl0gTUlJIFxuIiApOyBicmVhazsNCisgICAgICAgICAgICAgICAgCWNhc2UgMiA6IFBSSU5UKCBPVVRfT0JKICIgICAgICBTQ1U3MGhbODo2XSA9PSAwMTA6IFtNQUMjMV0gUk1JSSAgIFtNQUMjMl0gTUlJIFxuIiApOyBicmVhazsNCisgICAgICAgICAgICAgICAgCWNhc2UgMyA6IFBSSU5UKCBPVVRfT0JKICIgICAgICBTQ1U3MGhbODo2XSA9PSAwMTE6IFtNQUMjMV0gTUlJICAgICAgICAgICAgICAgIFxuIiApOyBicmVhazsNCisgICAgICAgICAgICAgICAgCWNhc2UgNCA6IFBSSU5UKCBPVVRfT0JKICIgICAgICBTQ1U3MGhbODo2XSA9PSAxMDA6IFtNQUMjMV0gUk1JSSAgICAgICAgICAgICAgIFxuIiApOyBicmVhazsNCisgICAgICAgICAgICAgICAgCWNhc2UgNSA6IFBSSU5UKCBPVVRfT0JKICIgICAgICBTQ1U3MGhbODo2XSA9PSAxMDE6IFJlc2VydmVkICAgICAgICAgICAgICAgICAgIFxuIiApOyBicmVhazsNCisgICAgICAgICAgICAgICAgCWNhc2UgNiA6IFBSSU5UKCBPVVRfT0JKICIgICAgICBTQ1U3MGhbODo2XSA9PSAxMTA6IFtNQUMjMV0gUk1JSSAgIFtNQUMjMl0gUk1JSVxuIiApOyBicmVhazsNCisgICAgICAgICAgICAgICAgCWNhc2UgNyA6IFBSSU5UKCBPVVRfT0JKICIgICAgICBTQ1U3MGhbODo2XSA9PSAxMTE6IERpc2FibGUgTUFDICAgICAgICAgICAgICAgIFxuIiApOyBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKwkJCX0gLy8gRW5kIGlmICggQVNUMTAxMCApDQorCQl9IC8vIEVuZCBpZiAoRXJyX0ZsYWcgJiBFcnJfTUFDTW9kZSAgICAgICAgICAgICAgICApDQorDQorCQlpZiAoIE1vZGVTd2l0Y2ggPT0gTU9ERV9OU0NJICkgew0KKwkJCWlmIChFcnJfRmxhZyAmIEVycl9OQ1NJX0xpbmtGYWlsICAgICAgICAgICApIHsNCisJCQkJUFJJTlQoT1VUX09CSiAiW0Vycl0gTkNTSSBwYWNrZXQgcmV0cnkgbnVtYmVyIG92ZXIgZmxvd3Mgd2hlbiBmaW5kIGNoYW5uZWxcbiIpOw0KKwkJCQkNCisJCQkJaWYgKE5DU0lfTGlua0ZhaWxfVmFsICYgTkNTSV9MaW5rRmFpbF9HZXRfVmVyc2lvbl9JRCAgICAgICAgICkgUFJJTlQoT1VUX09CSiAiW05DU0ldIFRpbWUgb3V0IHdoZW4gR2V0IFZlcnNpb24gSUQgICAgICAgICBcbiIpOw0KKwkJCQlpZiAoTkNTSV9MaW5rRmFpbF9WYWwgJiBOQ1NJX0xpbmtGYWlsX0dldF9DYXBhYmlsaXRpZXMgICAgICAgKSBQUklOVChPVVRfT0JKICJbTkNTSV0gVGltZSBvdXQgd2hlbiBHZXQgQ2FwYWJpbGl0aWVzICAgICAgIFxuIik7DQorCQkJCWlmIChOQ1NJX0xpbmtGYWlsX1ZhbCAmIE5DU0lfTGlua0ZhaWxfU2VsZWN0X0FjdGl2ZV9QYWNrYWdlICApIFBSSU5UKE9VVF9PQkogIltOQ1NJXSBUaW1lIG91dCB3aGVuIFNlbGVjdCBBY3RpdmUgUGFja2FnZSAgXG4iKTsNCisJCQkJaWYgKE5DU0lfTGlua0ZhaWxfVmFsICYgTkNTSV9MaW5rRmFpbF9FbmFibGVfU2V0X01BQ19BZGRyZXNzICkgUFJJTlQoT1VUX09CSiAiW05DU0ldIFRpbWUgb3V0IHdoZW4gRW5hYmxlIFNldCBNQUMgQWRkcmVzcyBcbiIpOw0KKwkJCQlpZiAoTkNTSV9MaW5rRmFpbF9WYWwgJiBOQ1NJX0xpbmtGYWlsX0VuYWJsZV9Ccm9hZGNhc3RfRmlsdGVyKSBQUklOVChPVVRfT0JKICJbTkNTSV0gVGltZSBvdXQgd2hlbiBFbmFibGUgQnJvYWRjYXN0IEZpbHRlclxuIik7DQorCQkJCWlmIChOQ1NJX0xpbmtGYWlsX1ZhbCAmIE5DU0lfTGlua0ZhaWxfRW5hYmxlX05ldHdvcmtfVFggICAgICApIFBSSU5UKE9VVF9PQkogIltOQ1NJXSBUaW1lIG91dCB3aGVuIEVuYWJsZSBOZXR3b3JrIFRYICAgICAgXG4iKTsNCisJCQkJaWYgKE5DU0lfTGlua0ZhaWxfVmFsICYgTkNTSV9MaW5rRmFpbF9FbmFibGVfQ2hhbm5lbCAgICAgICAgICkgUFJJTlQoT1VUX09CSiAiW05DU0ldIFRpbWUgb3V0IHdoZW4gRW5hYmxlIENoYW5uZWwgICAgICAgICBcbiIpOw0KKwkJCQlpZiAoTkNTSV9MaW5rRmFpbF9WYWwgJiBOQ1NJX0xpbmtGYWlsX0Rpc2FibGVfTmV0d29ya19UWCAgICAgKSBQUklOVChPVVRfT0JKICJbTkNTSV0gVGltZSBvdXQgd2hlbiBEaXNhYmxlIE5ldHdvcmsgVFggICAgIFxuIik7DQorCQkJCWlmIChOQ1NJX0xpbmtGYWlsX1ZhbCAmIE5DU0lfTGlua0ZhaWxfRGlzYWJsZV9DaGFubmVsICAgICAgICApIFBSSU5UKE9VVF9PQkogIltOQ1NJXSBUaW1lIG91dCB3aGVuIERpc2FibGUgQ2hhbm5lbCAgICAgICAgXG4iKTsNCisJCQl9DQorCQkJDQorCQkJaWYgKEVycl9GbGFnICYgRXJyX05DU0lfQ2hhbm5lbF9OdW0gICAgICAgKSBQUklOVChPVVRfT0JKICJbTkNTSV0gQ2hhbm5lbCBudW1iZXIgZXhwZWN0ZWQ6ICVkLCByZWFsOiAlZFxuIiwgQ2hhbm5lbFRvbE51bSwgbnVtYmVyX2NobCk7DQorCQkJaWYgKEVycl9GbGFnICYgRXJyX05DU0lfUGFja2FnZV9OdW0gICAgICAgKSBQUklOVChPVVRfT0JKICJbTkNTSV0gUGVja2FnZSBudW1iZXIgZXhwZWN0ZWQ6ICVkLCByZWFsOiAlZFxuIiwgUGFja2FnZVRvbE51bSwgbnVtYmVyX3Bhayk7DQorCQl9IC8vIEVuZCBpZiAoIE1vZGVTd2l0Y2ggPT0gTU9ERV9OU0NJICkNCisJfSAvLyBFbmQgaWYgKEVycl9GbGFnICYmIEVycl9GbGFnX1ByaW50RW4pDQorfSAvLyBFbmQgdm9pZCBGUHJpX0VyckZsYWcgKEJZVEUgb3B0aW9uKQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBGaW5pc2hfQ2xvc2UgKHZvaWQpIHsNCisNCisJaWYgKFNDVV9vbGR2bGQpIA0KKwkgICAgcmVjb3Zfc2N1KCk7DQorDQorI2lmZGVmIFNMVF9ET1MNCisJaWYgKGZwX2lvICYmIElPVGltaW5nKSANCisJICAgIGZjbG9zZShmcF9pbyk7DQorCSAgICANCisJaWYgKGZwX2xvZykgDQorCSAgICBmY2xvc2UoZnBfbG9nKTsNCisjZW5kaWYgICAgDQorfSAvLyBFbmQgdm9pZCBGaW5pc2hfQ2xvc2UgKHZvaWQpDQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitjaGFyIEZpbmlzaF9DaGVjayAoaW50IHZhbHVlKSB7DQorICAgIFVMT05HIHRlbXA7DQorICAgIENIQVIgIGkgPSAwOw0KKyAgICANCisjaWZkZWYgRGlzYWJsZV9WR0ENCisJaWYgKFZHQU1vZGVWbGQpIHsNCisJCW91dHAoMHgzZDQsIDB4MTcpOw0KKwkJb3V0cCgweDNkNSwgVkdBTW9kZSk7DQorCX0NCisjZW5kaWYNCisJI2lmZGVmICBEYmdQcm5fRnVuY0hlYWRlcg0KKwkgICAgcHJpbnRmICgiRmluaXNoX0NoZWNrXG4iKTsgDQorCSAgICBEZWJ1Z19kZWxheSgpOw0KKyAgICAjZW5kaWYNCisNCisJaWYgKCBGUkFNRV9MRU4gKSANCisJICAgIGZyZWUoRlJBTUVfTEVOKTsNCisJICAgIA0KKwlpZiAoIHdwX2xzdCAgICkgDQorCSAgICBmcmVlKHdwX2xzdCAgICk7DQorDQorCUVycl9GbGFnID0gRXJyX0ZsYWcgfCB2YWx1ZTsNCisJDQorCWlmICggRGJnUHJuX0VyckZsZyApIA0KKwkgICAgcHJpbnRmICgiXG5FcnJfRmxhZzogWyUwOGx4XVxuIiwgRXJyX0ZsYWcpOw0KKw0KKwlpZiAoICFCdXJzdEVuYWJsZSApIA0KKwkgICAgRlByaV9FcnJGbGFnKCBGUF9MT0cgKTsNCisJICAgIA0KKwlpZiAoIElPVGltaW5nICAgICkgDQorCSAgICBGUHJpX0VyckZsYWcoIEZQX0lPICk7DQorCSAgICANCisJRlByaV9FcnJGbGFnKCBTVERfT1VUICk7DQorDQorCWlmICggIUJ1cnN0RW5hYmxlICkgDQorCSAgICBGUHJpX0VuZCggRlBfTE9HICk7DQorCSAgICANCisJaWYgKCBJT1RpbWluZyAgICkgDQorCSAgICBGUHJpX0VuZCggRlBfSU8gKTsNCisJICAgIA0KKwlGUHJpX0VuZCggU1REX09VVCApOw0KKwkNCisNCisJaWYgKCAhQnVyc3RFbmFibGUgKSBGUHJpX1JlZ1ZhbHVlKCBGUF9MT0cgKTsNCisJaWYgKCBJT1RpbWluZyAgICAgKSBGUHJpX1JlZ1ZhbHVlKCBGUF9JTyAgKTsNCisNCisJRmluaXNoX0Nsb3NlKCk7DQorDQorICAgIC8vIDIwMTQwMzI1DQorICAgIHRlbXAgPSBSZWFkU09DX0REKCAweDFlNmUyMDQwICk7DQorICAgIGlmICggTW9kZVN3aXRjaCA9PSBNT0RFX05TQ0kgKSANCisgICAgew0KKyAgICAgICAgaWYgKCBTZWxlY3RNQUMgPT0gMCApDQorICAgICAgICAgICAgaSA9IDE3Ow0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIGkgPSAxNjsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIGlmICggU2VsZWN0TUFDID09IDAgKQ0KKyAgICAgICAgICAgIGkgPSAxOTsNCisgICAgICAgIGVsc2UNCisgICAgICAgICAgICBpID0gMTg7DQorICAgIH0NCisgICAgV3JpdGVTT0NfREQoIDB4MWU2ZTIwNDAsICh0ZW1wIHwgKDEgPDwgaSkpICk7DQorICAgIA0KKyAgICANCisJaWYgKCBFcnJfRmxhZyApIA0KKyAgICB7DQorICAgICAgICAvLyBGYWlsDQorCSAgICByZXR1cm4oIDEgKTsNCisgICAgfQ0KKwllbHNlDQorICAgIHsNCisgICAgICAgIC8vIFBhc3MNCisJICAgIHJldHVybiggMCApOw0KKyAgICB9DQorfSAvLyBFbmQgY2hhciBGaW5pc2hfQ2hlY2sgKGludCB2YWx1ZSkNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK2ludCBGaW5kRXJyIChpbnQgdmFsdWUpIHsNCisJRXJyX0ZsYWcgPSBFcnJfRmxhZyB8IHZhbHVlOw0KKwkNCisJaWYgKCBEYmdQcm5fRXJyRmxnICkgDQorCSAgICBwcmludGYgKCJcbkVycl9GbGFnOiBbJTA4bHhdXG4iLCBFcnJfRmxhZyk7DQorDQorCXJldHVybigxKTsNCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitpbnQgRmluZEVycl9EZXMgKGludCB2YWx1ZSkgew0KKwlDaGVja19EZXNfVmFsID0gQ2hlY2tfRGVzX1ZhbCB8IHZhbHVlOw0KKwlFcnJfRmxhZyAgICAgID0gRXJyX0ZsYWcgfCBFcnJfQ2hlY2tfRGVzOw0KKwlpZiAoIERiZ1Bybl9FcnJGbGcgKSANCisJICAgIHByaW50ZiAoIlxuRXJyX0ZsYWc6IFslMDhseF0gQ2hlY2tfRGVzX1ZhbDogWyUwOGx4XVxuIiwgRXJyX0ZsYWcsIENoZWNrX0Rlc19WYWwpOw0KKw0KKwlyZXR1cm4oMSk7DQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLy8gR2V0IGFuZCBDaGVjayBzdGF0dXMgb2YgSW50ZXJydXB0DQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitpbnQgY2hlY2tfaW50ICggY2hhciAqdHlwZSApIHsNCisJI2lmZGVmICBEYmdQcm5fRnVuY0hlYWRlcg0KKwkgICAgcHJpbnRmICgiY2hlY2tfaW50ICA6ICVkXG4iLCBMb29wKTsgDQorCSAgICBEZWJ1Z19kZWxheSgpOw0KKyAgICAjZW5kaWYNCisNCisJRGF0X1VMT05HID0gUmVhZFNPQ19ERCggSF9NQUNfQkFTRSArIDB4MDAgKTsvL0ludGVycnVwdCBTdGF0dXMNCisjaWZkZWYgU0xUX0RPUwkNCisjaWZkZWYgQ2hlY2tSeGJ1ZlVOQVZBDQorCWlmICggRGF0X1VMT05HICYgMHgwMDAwMDAwNCApIHsNCisJCWZwcmludGYoZnBfbG9nLCAiWyVzSW50U3RhdHVzXSBSZWNlaXZpbmcgYnVmZmVyIHVuYXZhaWxhYmxlICAgICAgICAgICAgICAgOiAlMDhseCBbbG9vcDolZF1cbiIsIHR5cGUsIERhdF9VTE9ORywgTG9vcCk7DQorCQlGaW5kRXJyKCBFcnJfUlhCVUZfVU5BVkEgKTsNCisJfQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBDaGVja1JQa3RMb3N0DQorCWlmICggRGF0X1VMT05HICYgMHgwMDAwMDAwOCApIHsNCisJCWZwcmludGYoZnBfbG9nLCAiWyVzSW50U3RhdHVzXSBSZWNlaXZlZCBwYWNrZXQgbG9zdCBkdWUgdG8gUlggRklGTyBmdWxsICAgOiAlMDhseCBbbG9vcDolZF1cbiIsIHR5cGUsIERhdF9VTE9ORywgTG9vcCk7DQorCQlGaW5kRXJyKCBFcnJfUlBLVF9MT1NUICk7DQorCX0NCisjZW5kaWYNCisNCisjaWZkZWYgQ2hlY2tOUFR4YnVmVU5BVkENCisJaWYgKCBEYXRfVUxPTkcgJiAweDAwMDAwMDQwICkgew0KKwkJZnByaW50ZihmcF9sb2csICJbJXNJbnRTdGF0dXNdIE5vcm1hbCBwcmlvcml0eSB0cmFuc21pdCBidWZmZXIgdW5hdmFpbGFibGU6ICUwOGx4IFtsb29wOiVkXVxuIiwgdHlwZSwgRGF0X1VMT05HLCBMb29wKTsNCisJCUZpbmRFcnIoIEVycl9OUFRYQlVGX1VOQVZBICk7DQorCX0NCisjZW5kaWYNCisNCisjaWZkZWYgQ2hlY2tUUGt0TG9zdA0KKwlpZiAoIERhdF9VTE9ORyAmIDB4MDAwMDAwODAgKSB7DQorCQlmcHJpbnRmKGZwX2xvZywgIlslc0ludFN0YXR1c10gUGFja2V0cyB0cmFuc21pdHRlZCB0byBFdGhlcm5ldCBsb3N0ICAgICAgIDogJTA4bHggW2xvb3A6JWRdXG4iLCB0eXBlLCBEYXRfVUxPTkcsIExvb3ApOw0KKwkJRmluZEVyciggRXJyX1RQS1RfTE9TVCApOw0KKwl9DQorI2VuZGlmDQorI2VuZGlmDQorCWlmIChFcnJfRmxhZykgDQorCSAgICByZXR1cm4oMSk7DQorCWVsc2UgICAgICAgICAgDQorCSAgICByZXR1cm4oMCk7DQorfSAvLyBFbmQgaW50IGNoZWNrX2ludCAoY2hhciAqdHlwZSkNCisNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8vIEJ1ZmZlcg0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBzZXR1cF9mcmFtZXNpemUgKHZvaWQpIHsNCisgICAgaW50CWk7DQorICAgIA0KKwkjaWZkZWYgIERiZ1Bybl9GdW5jSGVhZGVyDQorCSAgICBwcmludGYgKCJzZXR1cF9mcmFtZXNpemVcbiIpOyANCisJICAgIERlYnVnX2RlbGF5KCk7DQorICAgICNlbmRpZg0KKwkgICAgDQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorCS8vIEZpbGwgRnJhbWUgU2l6ZSBvdXQgZGVzY3JpcHRvciBhcmVhDQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorICAgICNpZmRlZiBTTFRfVUJPT1QNCisJaWYgKDApDQorICAgICNlbHNlDQorCWlmICggRU5BQkxFX1JBTkRfU0laRSApDQorICAgICNlbmRpZg0KKyAgICB7DQorCQlmb3IgKGkgPSAwOyBpIDwgREVTX05VTUJFUjsgaSsrKSB7DQorCQkJaWYgKCBGUkFNRV9SYW5kX1NpbXBsZSApIHsNCisJCQkJc3dpdGNoKHJhbmQoKSAlIDUpIHsNCisJCQkJCWNhc2UgMCA6IEZSQU1FX0xFTltpXSA9IDB4NGUgOyBicmVhazsNCisJCQkJCWNhc2UgMSA6IEZSQU1FX0xFTltpXSA9IDB4NGJhOyBicmVhazsNCisJCQkJCWRlZmF1bHQ6IEZSQU1FX0xFTltpXSA9IDB4NWVhOyBicmVhazsNCisJCQkJfQ0KKwkJCX0gDQorCQkJZWxzZSB7DQorCQkJCUZSQU1FX0xFTl9DdXIgPSByYW5kKCkgJSAoTUFYX0ZSQU1FX1JBTkRfU0laRSArIDEpOw0KKwkJCQ0KKwkJCQlpZiAoRlJBTUVfTEVOX0N1ciA8IE1JTl9GUkFNRV9SQU5EX1NJWkUpIA0KKwkJCQkgICAgRlJBTUVfTEVOX0N1ciA9IE1JTl9GUkFNRV9SQU5EX1NJWkU7DQorDQorCQkJCUZSQU1FX0xFTltpXSA9IEZSQU1FX0xFTl9DdXI7DQorCQkJfQ0KKyNpZmRlZiBTTFRfRE9TCQkJDQorCQkJaWYgKERiZ1Bybl9GUkFNRV9MRU4pIA0KKwkJCSAgICBmcHJpbnRmKGZwX2xvZywgIltzZXR1cF9mcmFtZXNpemVdIEZSQU1FX0xFTl9DdXI6JTA4bHhbRGVzOiVkXVtsb29wOiVkXVxuIiwgRlJBTUVfTEVOW2ldLCBpLCBMb29wKTsNCisjZW5kaWYNCisJCX0NCisJfSANCisJZWxzZSB7DQorCQlmb3IgKGkgPSAwOyBpIDwgREVTX05VTUJFUjsgaSsrKSB7DQorICAgICAgICAgICAgI2lmZGVmIFNlbGVjdFNpbXBsZUxlbmd0aA0KKwkJCWlmIChpICUgRlJBTUVfU0VMSF9QRVJEKSANCisJCQkgICAgRlJBTUVfTEVOW2ldID0gRlJBTUVfTEVOSDsNCisJCQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCQkgICAgRlJBTUVfTEVOW2ldID0gRlJBTUVfTEVOTDsNCisgICAgICAgICAgICAjZWxzZQ0KKwkJCWlmICggQnVyc3RFbmFibGUgKSB7DQorCQkJCWlmIChJRUVFVGVzdGluZykgew0KKwkJCQkJRlJBTUVfTEVOW2ldID0gMTUxNDsNCisJCQkJfSANCisJCQkJZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAjaWZkZWYgRU5BQkxFX0FSUF8yX1dPTA0KKwkJCQkJRlJBTUVfTEVOW2ldID0gMTY0Ow0KKyAgICAgICAgICAgICAgICAgICAgI2Vsc2UNCisJCQkJCUZSQU1FX0xFTltpXSA9IDYwOw0KKyAgICAgICAgICAgICAgICAgICAgI2VuZGlmDQorCQkJCX0NCisJCQl9IA0KKwkJCWVsc2Ugew0KKyAgICAgICAgICAgICAgICAjaWZkZWYgU2VsZWN0TGVuZ3RoSW5jDQorLy8JCQkJRlJBTUVfTEVOW2ldID0gKGklMTQ1NSkrNjA7DQorCQkJCUZSQU1FX0xFTltpXSA9IDE1MTQtKCBpICUgMTQ1NSApOw0KKyAgICAgICAgICAgICAgICAjZWxzZQ0KKwkJCQlpZiAoaSAlIEZSQU1FX1NFTEhfUEVSRCkgDQorCQkJCSAgICBGUkFNRV9MRU5baV0gPSBGUkFNRV9MRU5IOw0KKwkJCQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCQkJICAgIEZSQU1FX0xFTltpXSA9IEZSQU1FX0xFTkw7DQorICAgICAgICAgICAgICAgICNlbmRpZg0KKwkJCX0gLy8gRW5kIGlmIChCdXJzdEVuYWJsZSkNCisgICAgICAgICAgICAjZW5kaWYNCisvKg0KKwkJCXN3aXRjaChpICUgMjApIHsNCisJCQkJY2FzZSAwIDogRlJBTUVfTEVOW2ldID0gRlJBTUVfTEVOSDsgYnJlYWs7DQorCQkJCWNhc2UgMSA6IEZSQU1FX0xFTltpXSA9IEZSQU1FX0xFTkg7IGJyZWFrOw0KKwkJCQljYXNlIDIgOiBGUkFNRV9MRU5baV0gPSBGUkFNRV9MRU5IOyBicmVhazsNCisJCQkJZGVmYXVsdDogRlJBTUVfTEVOW2ldID0gRlJBTUVfTEVOTDsgYnJlYWs7DQorCQkJfQ0KKyovDQorI2lmZGVmIFNMVF9ET1MNCisJCQlpZiAoRGJnUHJuX0ZSQU1FX0xFTikgDQorCQkJICAgIGZwcmludGYoZnBfbG9nLCAiW3NldHVwX2ZyYW1lc2l6ZV0gRlJBTUVfTEVOX0N1cjolMDhseFtEZXM6JWRdW2xvb3A6JWRdXG4iLCBGUkFNRV9MRU5baV0sIGksIExvb3ApOw0KKyNlbmRpZg0KKwkJfSAvLyBFbmQgZm9yIChpID0gMDsgaSA8IERFU19OVU1CRVI7IGkrKykNCisJfSAvLyBFbmQgaWYgKCBFTkFCTEVfUkFORF9TSVpFICkNCisNCisgICAgLy8gQ2FsY3VsYXRlIGF2ZXJhZ2Ugb2YgZnJhbWUgc2l6ZQ0KKwlBdmdfZnJhbWVfbGVuID0gMDsNCisJDQorCWZvciAoIGkgPSAwOyBpIDwgREVTX05VTUJFUjsgaSsrICkgew0KKwkJQXZnX2ZyYW1lX2xlbiArPSBGUkFNRV9MRU5baV07DQorCX0NCisJDQorCUF2Z19mcmFtZV9sZW4gPSBBdmdfZnJhbWVfbGVuIC8gKGRvdWJsZSlERVNfTlVNQkVSOw0KKw0KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKwkvLyBXcml0ZSBQbGFuZQ0KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKwlzd2l0Y2goIFplcm9Db3B5X09GRlNFVCAmIDB4MyApIHsNCisJCWNhc2UgMDogd3BfZmlyID0gMHhmZmZmZmZmZjsgYnJlYWs7DQorCQljYXNlIDE6IHdwX2ZpciA9IDB4ZmZmZmZmMDA7IGJyZWFrOw0KKwkJY2FzZSAyOiB3cF9maXIgPSAweGZmZmYwMDAwOyBicmVhazsNCisJCWNhc2UgMzogd3BfZmlyID0gMHhmZjAwMDAwMDsgYnJlYWs7DQorCX0NCisJDQorCWZvciAoIGkgPSAwOyBpIDwgREVTX05VTUJFUjsgaSsrICkgew0KKwkJc3dpdGNoKCAoIFplcm9Db3B5X09GRlNFVCArIEZSQU1FX0xFTltpXSAtIDEgKSAmIDB4MyApIHsNCisJCQljYXNlIDA6IHdwX2xzdFtpXSA9IDB4MDAwMDAwZmY7IGJyZWFrOw0KKwkJCWNhc2UgMTogd3BfbHN0W2ldID0gMHgwMDAwZmZmZjsgYnJlYWs7DQorCQkJY2FzZSAyOiB3cF9sc3RbaV0gPSAweDAwZmZmZmZmOyBicmVhazsNCisJCQljYXNlIDM6IHdwX2xzdFtpXSA9IDB4ZmZmZmZmZmY7IGJyZWFrOw0KKwkJfQ0KKwl9IC8vIEVuZCBmb3IgKCBpID0gMDsgaSA8IERFU19OVU1CRVI7IGkrKyApDQorfSAvLyBFbmQgdm9pZCBzZXR1cF9mcmFtZXNpemUgKHZvaWQpDQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIHNldHVwX2FycCAodm9pZCkgew0KKyAgICBpbnQgaTsNCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKysgKQ0KKyAgICAgICAgQVJQX2RhdGFbaV0gPSBBUlBfb3JnX2RhdGFbaV07DQorICAgIA0KKwlBUlBfZGF0YVsxXSA9IDB4MDAwMGZmZmYgfCAoIFNBWzBdIDw8IDE2ICkNCisJICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCBTQVsxXSA8PCAyNCApOw0KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlBUlBfZGF0YVsyXSA9ICAgICAgICAgICAgICAoIFNBWzJdICAgICAgICkNCisJICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCBTQVszXSA8PCAgOCApDQorCSAgICAgICAgICAgICAgICAgICAgICAgICB8ICggU0FbNF0gPDwgMTYgKQ0KKwkgICAgICAgICAgICAgICAgICAgICAgICAgfCAoIFNBWzVdIDw8IDI0ICk7DQorCSAgICAgICAgICAgIA0KKwlBUlBfZGF0YVs1XSA9IDB4MDAwMDAxMDAgfCAoIFNBWzBdIDw8IDE2ICkNCisJICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCBTQVsxXSA8PCAyNCApOw0KKwkgICAgICAgICAgICANCisJQVJQX2RhdGFbNl0gPSAgICAgICAgICAgICAgKCBTQVsyXSAgICAgICApDQorCSAgICAgICAgICAgICAgICAgICAgICAgICB8ICggU0FbM10gPDwgIDggKQ0KKwkgICAgICAgICAgICAgICAgICAgICAgICAgfCAoIFNBWzRdIDw8IDE2ICkNCisJICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCBTQVs1XSA8PCAyNCApOw0KK30gLy8gRW5kIHZvaWQgc2V0dXBfYXJwICh2b2lkKQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBzZXR1cF9idWYgKHZvaWQpIHsNCisgICAgaW50ICAgICBpOw0KKyAgICBpbnQJICAgIGo7DQorICAgIFVMT05HCWFkcjsNCisgICAgVUxPTkcJYWRyX3NydDsNCisgICAgVUxPTkcJYWRyX2VuZDsNCisgICAgVUxPTkcJbGVuOw0KKyAgICAjaWZkZWYgU2VsZWN0U2ltcGxlREENCisgICAgICAgIGludCAgICAgY250Ow0KKyAgICAgICAgVUxPTkcgICBDdXJyZW50X2ZyYW1lbGVuOw0KKyAgICAjZW5kaWYNCisgICAgDQorICAgICNpZmRlZiBFTkFCTEVfQVJQXzJfV09MDQorICAgIGludAkgICAgREFbM107DQorDQorCURBWzBdID0gICggKCBTZWxlY3RXT0xEQV9EYXRIID4+ICA4ICkgJiAweDAwZmYgKSB8DQorCSAgICAgICAgICggKCBTZWxlY3RXT0xEQV9EYXRIIDw8ICA4ICkgJiAweGZmMDAgKTsNCisJICAgICAgICAgDQorCURBWzFdID0gICggKCBTZWxlY3RXT0xEQV9EYXRMID4+IDI0ICkgJiAweDAwZmYgKSB8DQorCSAgICAgICAgICggKCBTZWxlY3RXT0xEQV9EYXRMID4+ICA4ICkgJiAweGZmMDAgKTsNCisJICAgICAgICAgDQorCURBWzJdID0gICggKCBTZWxlY3RXT0xEQV9EYXRMID4+ICA4ICkgJiAweDAwZmYgKSB8DQorCSAgICAgICAgICggKCBTZWxlY3RXT0xEQV9EYXRMIDw8ICA4ICkgJiAweGZmMDAgKTsNCisgICAgI2VuZGlmDQorICAgIA0KKwkjaWZkZWYgIERiZ1Bybl9GdW5jSGVhZGVyDQorCSAgICBwcmludGYgKCJzZXR1cF9idWYgIDogJWRcbiIsIExvb3ApOyANCisJICAgIERlYnVnX2RlbGF5KCk7DQorICAgICNlbmRpZg0KKw0KKyAgICAvLyBJdCBuZWVkIGJlIG11bHRpcGxlIG9mIDQNCisJYWRyX3NydCA9IEdFVF9ETUFfQkFTRV9TRVRVUCAmIDB4ZmZmZmZmZmM7DQorCQ0KKwlmb3IgKGogPSAwOyBqIDwgREVTX05VTUJFUjsgaisrKSB7DQorCQlpZiAoIERiZ1Bybl9CdWZBZHIgKSANCisJCSAgICBwcmludGYoIltsb29wOiU0ZF1bZGVzOiU0ZF1bc2V0dXBfYnVmICBdICUwOGx4XG4iLCBMb29wLCBqLCBhZHJfc3J0KTsNCisJCSAgICANCisJCWlmICggQnVyc3RFbmFibGUgKSB7DQorCQkJaWYgKCBJRUVFVGVzdGluZyApIHsNCisgICAgICAgICAgICAgICAgI2lmZGVmIEVOQUJMRV9EQVNBDQorCQkJCVdyaXRlU09DX0REKCBhZHJfc3J0ICAgICwgMHhmZmZmZmZmZiAgKTsNCisJCQkJV3JpdGVTT0NfREQoIGFkcl9zcnQgKyA0LCBBUlBfZGF0YVsxXSApOw0KKwkJCQlXcml0ZVNPQ19ERCggYWRyX3NydCArIDgsIEFSUF9kYXRhWzJdICk7DQorCQkJCQ0KKwkJCQlmb3IgKGFkciA9IChhZHJfc3J0ICsgMTIpOyBhZHIgPCAoYWRyX3NydCArIERNQV9QYWtTaXplKTsgYWRyICs9IDQgKQ0KKyAgICAgICAgICAgICAgICAjZWxzZQ0KKwkJCQlmb3IgKGFkciA9IGFkcl9zcnQ7IGFkciA8IChhZHJfc3J0ICsgRE1BX1Bha1NpemUpOyBhZHIgKz0gNCApDQorICAgICAgICAgICAgICAgICNlbmRpZg0KKyAgICAgICAgICAgICAgICB7DQorCQkJCQlzd2l0Y2goIFRlc3RNb2RlICkgew0KKwkJCQkJCWNhc2UgMTogZ2RhdGEgPSAweGZmZmZmZmZmOyAgICAgICAgICAgICAgYnJlYWs7DQorCQkJCQkJY2FzZSAyOiBnZGF0YSA9IDB4NTU1NTU1NTU7ICAgICAgICAgICAgICBicmVhazsNCisJCQkJCQljYXNlIDM6IGdkYXRhID0gcmFuZCgpIHwgKHJhbmQoKSA8PCAxNik7IGJyZWFrOw0KKwkJCQkJCWNhc2UgNTogZ2RhdGEgPSBVc2VyRFZhbDsgICAgICAgICAgICAgICAgYnJlYWs7DQorCQkJCQl9DQorCQkJCQlXcml0ZVNPQ19ERChhZHIsIGdkYXRhKTsNCisJCQkJfSAvLyBFbmQgZm9yKCkNCisJCQl9IA0KKwkJCWVsc2Ugew0KKwkJCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgew0KKwkJCQkJV3JpdGVTT0NfREQoIGFkcl9zcnQgKyAoIGkgPDwgMiApLCBBUlBfZGF0YVtpXSApOw0KKwkJCQl9ICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgI2lmZGVmIEVOQUJMRV9BUlBfMl9XT0wgICAgICAgICAgDQorCQkJCWZvciAoaSA9IDE2OyBpIDwgNDA7IGkgKz0gMykgew0KKwkJCQkJV3JpdGVTT0NfREQoIGFkcl9zcnQgKyAoIGkgPDwgMiApLCAgICAgKCBEQVsxXSA8PCAxNiApIHwgIERBWzBdICk7DQorCQkJCQlXcml0ZVNPQ19ERCggYWRyX3NydCArICggaSA8PCAyICkgKyA0LCAoIERBWzBdIDw8IDE2ICkgfCAgREFbMl0gKTsNCisJCQkJCVdyaXRlU09DX0REKCBhZHJfc3J0ICsgKCBpIDw8IDIgKSArIDgsICggREFbMl0gPDwgMTYgKSB8ICBEQVsxXSApOw0KKwkJCQl9DQorICAgICAgICAgICAgICAgICNlbmRpZg0KKwkJCX0gLy8gRW5kIGlmICggSUVFRVRlc3RpbmcgKSANCisJCX0gDQorCQllbHNlIHsNCisJCSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyAgICAgICAgICAgICNpZmRlZiBTZWxlY3RTaW1wbGVEYXRhDQorICAgICAgICAgICAgICAgICNpZmRlZiBTaW1wbGVEYXRhX0ZpeA0KKwkJCSAgICBzd2l0Y2goIGogJSBTaW1wbGVEYXRhX0ZpeE51bSApIHsNCisJCQkgICAgCWNhc2UgIDAgOiBnZGF0YSA9IFNpbXBsZURhdGFfRml4VmFsMDA7IGJyZWFrOw0KKwkJCSAgICAJY2FzZSAgMSA6IGdkYXRhID0gU2ltcGxlRGF0YV9GaXhWYWwwMTsgYnJlYWs7DQorCQkJICAgIAljYXNlICAyIDogZ2RhdGEgPSBTaW1wbGVEYXRhX0ZpeFZhbDAyOyBicmVhazsNCisJCQkgICAgCWNhc2UgIDMgOiBnZGF0YSA9IFNpbXBsZURhdGFfRml4VmFsMDM7IGJyZWFrOw0KKwkJCSAgICAJY2FzZSAgNCA6IGdkYXRhID0gU2ltcGxlRGF0YV9GaXhWYWwwNDsgYnJlYWs7DQorCQkJICAgIAljYXNlICA1IDogZ2RhdGEgPSBTaW1wbGVEYXRhX0ZpeFZhbDA1OyBicmVhazsNCisJCQkgICAgCWNhc2UgIDYgOiBnZGF0YSA9IFNpbXBsZURhdGFfRml4VmFsMDY7IGJyZWFrOw0KKwkJCSAgICAJY2FzZSAgNyA6IGdkYXRhID0gU2ltcGxlRGF0YV9GaXhWYWwwNzsgYnJlYWs7DQorCQkJICAgIAljYXNlICA4IDogZ2RhdGEgPSBTaW1wbGVEYXRhX0ZpeFZhbDA4OyBicmVhazsNCisJCQkgICAgCWNhc2UgIDkgOiBnZGF0YSA9IFNpbXBsZURhdGFfRml4VmFsMDk7IGJyZWFrOw0KKwkJCSAgICAJY2FzZSAxMCA6IGdkYXRhID0gU2ltcGxlRGF0YV9GaXhWYWwxMDsgYnJlYWs7DQorCQkJICAgIAlkZWZhdWx0IDogZ2RhdGEgPSBTaW1wbGVEYXRhX0ZpeFZhbDExOyBicmVhazsNCisJCQkgICAgfQ0KKyAgICAgICAgICAgICAgICAjZWxzZQ0KKwkJCSAgICBnZGF0YSAgID0gMHgxMTExMTExMSAqICgoaiArIFNFRURfU1RBUlQpICUgMjU2KTsNCisgICAgICAgICAgICAgICAgI2VuZGlmDQorIAkJCQ0KKyAJCQlhZHJfZW5kID0gYWRyX3NydCArIERNQV9QYWtTaXplOw0KKwkJCWZvciAoIGFkciA9IGFkcl9zcnQ7IGFkciA8IGFkcl9lbmQ7IGFkciArPSA0ICkgew0KKwkJCQlXcml0ZVNPQ19ERCggYWRyLCBnZGF0YSApOw0KKwkJCX0JCSAgDQorICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JCQkNCisJCQkjZWxpZiBTZWxlY3RTaW1wbGVEQQ0KKw0KKwkJCWdkYXRhICAgPSBEQVRBX1NFRUQoaiArIFNFRURfU1RBUlQpOw0KKwkJCUN1cnJlbnRfZnJhbWVsZW4gPSBGUkFNRV9MRU5bal07DQorCQkJDQorCQkJaWYgKCBEYmdQcm5fRlJBTUVfTEVOICkgDQorCQkJICAgIGZwcmludGYoZnBfbG9nLCAiW3NldHVwX2J1ZiAgICAgIF0gQ3VycmVudF9mcmFtZWxlbjolMDhseFtEZXM6JWRdW2xvb3A6JWRdXG4iLCBDdXJyZW50X2ZyYW1lbGVuLCBqLCBMb29wKTsNCisJCQkNCisJCQljbnQgICAgID0gMDsNCisgCQkJbGVuICAgICA9ICggKCAoIEN1cnJlbnRfZnJhbWVsZW4gLSAxNCApICYgMHhmZiApIDw8IDgpIHwgDQorIAkJCSAgICAgICAgICAgICggKCBDdXJyZW50X2ZyYW1lbGVuIC0gMTQgKSA+PiA4ICk7DQorDQorIAkJCWFkcl9lbmQgPSBhZHJfc3J0ICsgRE1BX1Bha1NpemU7DQorCQkJZm9yICggYWRyID0gYWRyX3NydDsgYWRyIDwgYWRyX2VuZDsgYWRyICs9IDQgKSB7DQorCQkJCWNudCsrOw0KKwkJCQlpZiAgICAgIChjbnQgPT0gMSApIFdyaXRlU09DX0REKCBhZHIsIFNlbGVjdFNpbXBsZURBX0RhdDAgKTsNCisJCQkJZWxzZSBpZiAoY250ID09IDIgKSBXcml0ZVNPQ19ERCggYWRyLCBTZWxlY3RTaW1wbGVEQV9EYXQxICk7DQorCQkJCWVsc2UgaWYgKGNudCA9PSAzICkgV3JpdGVTT0NfREQoIGFkciwgU2VsZWN0U2ltcGxlREFfRGF0MiApOw0KKwkJCQllbHNlIGlmIChjbnQgPT0gNCApIFdyaXRlU09DX0REKCBhZHIsIGxlbiB8IChsZW4gPDwgMTYpICAgKTsNCisJCQkJZWxzZQkJCQkNCisJCQkJICAgIFdyaXRlU09DX0REKCBhZHIsIGdkYXRhICk7ICAgICAgDQorCQkJCSAgICAgICAgICAgICAgDQorCQkJCWdkYXRhICs9IERBVEFfSW5jVmFsOw0KKwkJCX0JCQkNCisgICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkJCQ0KKwkJCSNlbHNlDQorDQorCQkJZ2RhdGEgICA9IERBVEFfU0VFRChqICsgU0VFRF9TVEFSVCk7DQorIAkJCWFkcl9lbmQgPSBhZHJfc3J0ICsgRE1BX1Bha1NpemU7DQorCQkJZm9yICggYWRyID0gYWRyX3NydDsgYWRyIDwgYWRyX2VuZDsgYWRyICs9IDQgKSB7CQkJDQorCQkJCVdyaXRlU09DX0REKCBhZHIsIGdkYXRhICk7DQorICAgICAgICAgICAgICAgIA0KKwkJCQlnZGF0YSArPSBEQVRBX0luY1ZhbDsNCisJCQl9DQorDQorCQkJI2VuZGlmDQorCQkJDQorCQl9IC8vIEVuZCBpZiAoIEJ1cnN0RW5hYmxlICkNCisNCisJCWFkcl9zcnQgKz0gRE1BX1Bha1NpemU7DQorCX0gLy8gRW5kIGZvciAoaiA9IDA7IGogPCBERVNfTlVNQkVSOyBqKyspDQorfSAvLyBFbmQgdm9pZCBzZXR1cF9idWYgKHZvaWQpDQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisvLyBDaGVjayBkYXRhIG9mIG9uZSBwYWNrZXQNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK2NoYXIgY2hlY2tfRGF0YSAoVUxPTkcgZGVzYWRyLCBMT05HIG51bWJlcikgew0KKwlpbnQJICAgIGluZGV4Ow0KKwlpbnQgICAgIGNudDsNCisgICAgVUxPTkcJcmRhdGE7ICANCisgICAgVUxPTkcJd3BfbHN0X2N1cjsgIA0KKyAgICBVTE9ORwlhZHJfbGFzOw0KKyAgICBVTE9ORwlhZHI7DQorICAgIFVMT05HCWFkcl9zcnQ7DQorICAgIFVMT05HCWFkcl9lbmQ7DQorICAgIFVMT05HCWxlbjsNCisgICAgI2lmZGVmIFNlbGVjdFNpbXBsZURBDQorICAgICAgICBVTE9ORyAgIGdkYXRhX2JhazsNCisgICAgI2VuZGlmDQorICAgIA0KKwkjaWZkZWYgIERiZ1Bybl9GdW5jSGVhZGVyDQorCSAgICBwcmludGYgKCJjaGVja19EYXRhIDogJWRcbiIsIExvb3ApOyANCisJICAgIERlYnVnX2RlbGF5KCk7DQorICAgICNlbmRpZg0KKyAgICAvL3ByaW50ZigiW0RlczolZF1bbG9vcDolZF1EZXNhZHI6JTA4eFxuIiwgbnVtYmVyLCBMb29wLCBkZXNhZHIpOw0KKw0KKwl3cF9sc3RfY3VyICAgID0gd3BfbHN0W251bWJlcl07DQorCUZSQU1FX0xFTl9DdXIgPSBGUkFNRV9MRU5bbnVtYmVyXTsNCisjaWZkZWYgU0xUX0RPUwkNCisJaWYgKCBEYmdQcm5fRlJBTUVfTEVOICkgDQorCSAgICBmcHJpbnRmKGZwX2xvZywgIltjaGVja19EYXRhICAgICBdIEZSQU1FX0xFTl9DdXI6JTA4bHhbRGVzOiVkXVtsb29wOiVkXVxuIiwgRlJBTUVfTEVOX0N1ciwgbnVtYmVyLCBMb29wKTsNCisjZW5kaWYJICAgIA0KKwlhZHJfc3J0ID0gUmVhZFNPQ19ERChkZXNhZHIpICYgMHhmZmZmZmZmYzsNCisJYWRyX2VuZCA9IGFkcl9zcnQgKyBQa3RCeXRlU2l6ZTsNCisJDQorICAgICNpZmRlZiBTZWxlY3RTaW1wbGVEYXRhDQorICAgICAgICAjaWZkZWYgU2ltcGxlRGF0YV9GaXgNCisJc3dpdGNoKCBudW1iZXIgJSBTaW1wbGVEYXRhX0ZpeE51bSApIHsNCisJCWNhc2UgIDAgOiBnZGF0YSA9IFNpbXBsZURhdGFfRml4VmFsMDA7IGJyZWFrOw0KKwkJY2FzZSAgMSA6IGdkYXRhID0gU2ltcGxlRGF0YV9GaXhWYWwwMTsgYnJlYWs7DQorCQljYXNlICAyIDogZ2RhdGEgPSBTaW1wbGVEYXRhX0ZpeFZhbDAyOyBicmVhazsNCisJCWNhc2UgIDMgOiBnZGF0YSA9IFNpbXBsZURhdGFfRml4VmFsMDM7IGJyZWFrOw0KKwkJY2FzZSAgNCA6IGdkYXRhID0gU2ltcGxlRGF0YV9GaXhWYWwwNDsgYnJlYWs7DQorCQljYXNlICA1IDogZ2RhdGEgPSBTaW1wbGVEYXRhX0ZpeFZhbDA1OyBicmVhazsNCisJCWNhc2UgIDYgOiBnZGF0YSA9IFNpbXBsZURhdGFfRml4VmFsMDY7IGJyZWFrOw0KKwkJY2FzZSAgNyA6IGdkYXRhID0gU2ltcGxlRGF0YV9GaXhWYWwwNzsgYnJlYWs7DQorCQljYXNlICA4IDogZ2RhdGEgPSBTaW1wbGVEYXRhX0ZpeFZhbDA4OyBicmVhazsNCisJCWNhc2UgIDkgOiBnZGF0YSA9IFNpbXBsZURhdGFfRml4VmFsMDk7IGJyZWFrOw0KKwkJY2FzZSAxMCA6IGdkYXRhID0gU2ltcGxlRGF0YV9GaXhWYWwxMDsgYnJlYWs7DQorCQlkZWZhdWx0IDogZ2RhdGEgPSBTaW1wbGVEYXRhX0ZpeFZhbDExOyBicmVhazsNCisJfQ0KKyAgICAgICAgI2Vsc2UNCisJZ2RhdGEgICA9IDB4MTExMTExMTEgKiAoKG51bWJlciArIFNFRURfU1RBUlQpICUgMjU2KTsNCisgICAgICAgICNlbmRpZg0KKyAgICAjZWxzZQ0KKwlnZGF0YSAgID0gREFUQV9TRUVEKG51bWJlciArIFNFRURfU1RBUlQpOw0KKyAgICAjZW5kaWYNCisNCisJd3AgICAgICA9IHdwX2ZpcjsNCisJYWRyX2xhcyA9IGFkcl9lbmQgLSA0Ow0KKw0KKwljbnQgICAgID0gMDsNCisJbGVuICAgICA9ICgoKEZSQU1FX0xFTl9DdXItMTQpICYgMHhmZikgPDwgOCkgfCAoKEZSQU1FX0xFTl9DdXItMTQpID4+IDgpOw0KKyNpZmRlZiBTTFRfRE9TDQorCWlmIChEYmdQcm5fQnVmZGF0KSANCisJICAgIGZwcmludGYoZnBfbG9nLCAiIEluZjolMDhseCB+ICUwOGx4KCUwOGx4KSAlMDhseCBbRGVzOiVkXVtsb29wOiVkXVxuIiwgYWRyX3NydCwgYWRyX2VuZCwgYWRyX2xhcywgZ2RhdGEsIG51bWJlciwgTG9vcCk7DQorI2VuZGlmCSAgICANCisJZm9yIChhZHIgPSBhZHJfc3J0OyBhZHIgPCBhZHJfZW5kOyBhZHIrPTQpIHsNCisNCisgICAgICAgICNpZmRlZiBTZWxlY3RTaW1wbGVEQQ0KKwkJY250Kys7DQorCQlpZiAgICAgICggY250ID09IDEgKSB7IGdkYXRhX2JhayA9IGdkYXRhOyBnZGF0YSA9IFNlbGVjdFNpbXBsZURBX0RhdDA7IH0NCisJCWVsc2UgaWYgKCBjbnQgPT0gMiApIHsgZ2RhdGFfYmFrID0gZ2RhdGE7IGdkYXRhID0gU2VsZWN0U2ltcGxlREFfRGF0MTsgfQ0KKwkJZWxzZSBpZiAoIGNudCA9PSAzICkgeyBnZGF0YV9iYWsgPSBnZGF0YTsgZ2RhdGEgPSBTZWxlY3RTaW1wbGVEQV9EYXQyOyB9DQorCQllbHNlIGlmICggY250ID09IDQgKSB7IGdkYXRhX2JhayA9IGdkYXRhOyBnZGF0YSA9IGxlbiB8IChsZW4gPDwgMTYpOyAgIH0NCisgICAgICAgICNlbmRpZg0KKwkJcmRhdGEgPSBSZWFkU09DX0REKGFkcik7DQorCQlpZiAoYWRyID09IGFkcl9sYXMpIA0KKwkJICAgIHdwID0gd3AgJiB3cF9sc3RfY3VyOw0KKwkJICAgIA0KKwkJaWYgKCAocmRhdGEgJiB3cCkgIT0gKGdkYXRhICYgd3ApICkgew0KKyNpZmRlZiBTTFRfRE9TDQorICAgICAgICAgICAgZnByaW50ZihmcF9sb2csICJcbkVycm9yOiBBZHI6JTA4bHhbJTNkXSAoJTA4bHgpICglMDhseDolMDhseCkgW0RlczolZF1bbG9vcDolZF1cbiIsIGFkciwgKGFkciAtIGFkcl9zcnQpIC8gNCwgcmRhdGEsIGdkYXRhLCB3cCwgbnVtYmVyLCBMb29wKTsNCisjZW5kaWYNCisJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA2OyBpbmRleCsrKSB7DQorCQkJCXJkYXRhID0gUmVhZFNPQ19ERChhZHIpOw0KKyNpZmRlZiBTTFRfRE9TICAgICAgICAgICAgICAgIA0KKwkJCQlmcHJpbnRmKGZwX2xvZywgIlJlcCAgOiBBZHI6JTA4bHggICAgICAoJTA4bHgpICglMDhseDolMDhseCkgW0RlczolZF1bbG9vcDolZF1cbiIsIGFkciwgcmRhdGEsIGdkYXRhLCB3cCwgbnVtYmVyLCBMb29wKTsNCisjZW5kaWYgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgfQ0KKw0KKwkJCWlmICggRGJnUHJuX0R1bXBNQUNDbnQgKSANCisJCQkgICAgZHVtcF9tYWNfUk9yZWcoKTsNCisJCQkgICAgDQorCQkJcmV0dXJuKCBGaW5kRXJyKCBFcnJfQ2hlY2tfQnVmX0RhdGEgKSApOw0KKwkJfSAvLyBFbmQgaWYgKCAocmRhdGEgJiB3cCkgIT0gKGdkYXRhICYgd3ApICkNCisjaWZkZWYgU0xUX0RPUwkJDQorCQlpZiAoIERiZ1Bybl9CdWZkYXREZXRhaWwgKSANCisJCSAgICBmcHJpbnRmKGZwX2xvZywgIiBBZHI6JTA4bHhbJTNkXSAoJTA4bHgpICglMDhseDolMDhseCkgW0RlczolZF1bbG9vcDolZF1cbiIsIGFkciwgKGFkciAtIGFkcl9zcnQpIC8gNCwgcmRhdGEsIGdkYXRhLCB3cCwgbnVtYmVyLCBMb29wKTsNCisjZW5kaWYJCSAgICANCisgICAgICAgICNpZmRlZiBTZWxlY3RTaW1wbGVEQQ0KKwkJaWYgKCBjbnQgPD0gNCApIA0KKwkJICAgIGdkYXRhID0gZ2RhdGFfYmFrOw0KKyAgICAgICAgI2VuZGlmDQorDQorICAgICAgICAjaWZkZWYgU2VsZWN0U2ltcGxlRGF0YQ0KKyAgICAgICAgI2Vsc2UNCisJCWdkYXRhICs9IERBVEFfSW5jVmFsOw0KKyAgICAgICAgI2VuZGlmDQorCQkNCisJCXdwICAgICA9IDB4ZmZmZmZmZmY7DQorCX0NCisJcmV0dXJuKDApOw0KK30gLy8gRW5kIGNoYXIgY2hlY2tfRGF0YSAoVUxPTkcgZGVzYWRyLCBMT05HIG51bWJlcikNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK2NoYXIgY2hlY2tfYnVmIChpbnQgbG9vcGNudCkgew0KKyAgICBpbnQJICAgIGNvdW50Ow0KKyAgICBVTE9ORwlkZXNhZHI7DQorICAgIA0KKwkjaWZkZWYgIERiZ1Bybl9GdW5jSGVhZGVyDQorCSAgICBwcmludGYgKCJjaGVja19idWYgIDogJWRcbiIsIExvb3ApOyANCisJICAgIERlYnVnX2RlbGF5KCk7DQorICAgICNlbmRpZg0KKw0KKwlmb3IgKCBjb3VudCA9IERFU19OVU1CRVIgLSAxOyBjb3VudCA+PSAwOyBjb3VudC0tICkgew0KKwkJZGVzYWRyID0gSF9SREVTX0JBU0UgKyAoIDE2ICogY291bnQgKSArIDEyOw0KKyAgICAgICAgLy9wcmludGYoIiVkOiUwOHhcbiIsIGNvdW50LCBkZXNhZHIpOw0KKwkJaWYgKGNoZWNrX0RhdGEoZGVzYWRyLCBjb3VudCkpIHsNCisJCQljaGVja19pbnQgKCIiKTsNCisJCQkNCisJCQlyZXR1cm4oMSk7DQorCQl9DQorCX0NCisJaWYgKCBjaGVja19pbnQgKCIiKSApDQorCSAgICByZXR1cm4oMSk7DQorDQorCXJldHVybigwKTsNCit9IC8vIEVuZCBjaGFyIGNoZWNrX2J1ZiAoaW50IGxvb3BjbnQpDQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisvLyBEZXNjcmlwdG9yDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIHNldHVwX3R4ZGVzIChVTE9ORyBkZXNhZHIsIFVMT05HIGJ1ZmJhc2UpIHsNCisgICAgVUxPTkcJYnVmYWRyOw0KKyAgICBVTE9ORwlkZXN2YWw7DQorICAgIGludCAgICAgY291bnQ7DQorICAgIA0KKwkjaWZkZWYgIERiZ1Bybl9GdW5jSGVhZGVyDQorCSAgICBwcmludGYgKCJzZXR1cF90eGRlczogJWRcbiIsIExvb3ApOyANCisJICAgIERlYnVnX2RlbGF5KCk7DQorICAgICNlbmRpZg0KKw0KKwlidWZhZHIgICAgPSBidWZiYXNlICsgWmVyb0NvcHlfT0ZGU0VUOw0KKwkNCisJaWYgKFR4RGF0YUVuYWJsZSkgew0KKwkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgREVTX05VTUJFUjsgY291bnQrKykgew0KKwkJCUZSQU1FX0xFTl9DdXIgPSBGUkFNRV9MRU5bY291bnRdOw0KKwkJCWRlc3ZhbCAgICAgICAgPSBUREVTX0luaVZhbDsNCisgICAgICAgICAgICAjaWZkZWYgU0xUX0RPUwkNCisJCQlpZiAoRGJnUHJuX0ZSQU1FX0xFTikgDQorCQkJICAgIGZwcmludGYoZnBfbG9nLCAiW3NldHVwX3R4ZGVzICAgIF0gRlJBTUVfTEVOX0N1cjolMDhseFtEZXM6JWRdW2xvb3A6JWRdXG4iLCBGUkFNRV9MRU5fQ3VyLCBjb3VudCwgTG9vcCk7DQorICAgICAgICAgICAgI2VuZGlmDQorCQkJaWYgKERiZ1Bybl9CdWZBZHIpIA0KKwkJCSAgICBwcmludGYoIltsb29wOiU0ZF1bZGVzOiU0ZF1bc2V0dXBfdHhkZXNdICUwOGx4XG4iLCBMb29wLCBjb3VudCwgYnVmYWRyKTsNCisJCQkgICAgDQorCQkJV3JpdGVTT0NfREQoIGRlc2FkciArIDB4MDQsIDAgICAgICApOw0KKwkJCVdyaXRlU09DX0REKCBkZXNhZHIgKyAweDA4LCAwICAgICAgKTsNCisJCQlXcml0ZVNPQ19ERCggZGVzYWRyICsgMHgwQywgKGJ1ZmFkciArIENQVV9CVVNfQUREUl9TRFJBTV9PRkZTRVQpICk7IC8vIDIwMTMwNzMwDQorCQkJaWYgKCBjb3VudCA9PSAoIERFU19OVU1CRVIgLSAxICkgKQ0KKwkJCSAgICBXcml0ZVNPQ19ERCggZGVzYWRyICAgICAgICwgZGVzdmFsIHwgRU9SX0luaVZhbCk7DQorCQkJZWxzZQ0KKwkJCSAgICBXcml0ZVNPQ19ERCggZGVzYWRyICAgICAgICwgZGVzdmFsICk7DQorDQorCQkJYnVmYWRyICs9IERNQV9QYWtTaXplOw0KKwkJCWRlc2FkciArPSAxNjsNCisJCX0NCisJfSANCisJZWxzZSB7DQorCQlXcml0ZVNPQ19ERCggZGVzYWRyICAgICAsIDApOw0KKwl9DQorfSAvLyBFbmQgdm9pZCBzZXR1cF90eGRlcyAoVUxPTkcgZGVzYWRyLCBVTE9ORyBidWZiYXNlKQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBzZXR1cF9yeGRlcyAoVUxPTkcgZGVzYWRyLCBVTE9ORyBidWZiYXNlKSB7DQorICAgIFVMT05HCWJ1ZmFkcjsNCisgICAgVUxPTkcJZGVzdmFsOyAgICANCisgICAgaW50ICAgICBjb3VudDsNCisgICAgDQorCSNpZmRlZiAgRGJnUHJuX0Z1bmNIZWFkZXINCisJICAgIHByaW50ZiAoInNldHVwX3J4ZGVzOiAlZFxuIiwgTG9vcCk7IA0KKwkgICAgRGVidWdfZGVsYXkoKTsNCisgICAgI2VuZGlmDQorDQorCWJ1ZmFkciA9IGJ1ZmJhc2UrWmVyb0NvcHlfT0ZGU0VUOw0KKwlkZXN2YWwgPSBSREVTX0luaVZhbDsNCisJDQorCWlmICggUnhEYXRhRW5hYmxlICkgew0KKwkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgREVTX05VTUJFUjsgY291bnQrKykgew0KKwkJCWlmIChEYmdQcm5fQnVmQWRyKSANCisJCQkgICAgcHJpbnRmKCJbbG9vcDolNGRdW2RlczolNGRdW3NldHVwX3J4ZGVzXSAlMDhseFxuIiwgTG9vcCwgY291bnQsIGJ1ZmFkcik7DQorCQkJV3JpdGVTT0NfREQoIGRlc2FkciArIDB4MDQsIDAgICAgICApOw0KKwkJCVdyaXRlU09DX0REKCBkZXNhZHIgKyAweDA4LCAwICAgICAgKTsNCisJCQlXcml0ZVNPQ19ERCggZGVzYWRyICsgMHgwQywgKCBidWZhZHIgKyBDUFVfQlVTX0FERFJfU0RSQU1fT0ZGU0VUKSApOyAvLyAyMDEzMDczMA0KKyAgICAgICAgICAgIGlmICggY291bnQgPT0gKCBERVNfTlVNQkVSIC0gMSApICkNCisgICAgICAgICAgICAgICAgV3JpdGVTT0NfREQoIGRlc2FkciAgICAgICAsIGRlc3ZhbCB8IEVPUl9JbmlWYWwgICApOw0KKyAgICAgICAgICAgIGVsc2UNCisJCQkgICAgV3JpdGVTT0NfREQoIGRlc2FkciAgICAgICAsIGRlc3ZhbCApOw0KKw0KKwkJCWRlc2FkciArPSAxNjsNCisJCQlidWZhZHIgKz0gRE1BX1Bha1NpemU7DQorCQl9DQorCX0gDQorCWVsc2Ugew0KKwkJV3JpdGVTT0NfREQoIGRlc2FkciAgICAgLCAweDgwMDAwMDAwICAgKTsNCisJfSAvLyBFbmQgaWYgKCBSeERhdGFFbmFibGUgKQ0KK30gLy8gRW5kIHZvaWQgc2V0dXBfcnhkZXMgKFVMT05HIGRlc2FkciwgVUxPTkcgYnVmYmFzZSkNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8vIEZpcnN0IHNldHRpbmcgVFggYW5kIFJYIGluZm9ybWF0aW9uDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIHNldHVwX2RlcyAoVUxPTkcgYnVmbnVtKSB7DQorDQorCWlmICggRGJnUHJuX0J1ZkFkciApIHsNCisJICAgIHByaW50ZiAoInNldHVwX3J4ZGVzOiAlbGRcbiIsIGJ1Zm51bSk7IA0KKwkgICAgRGVidWdfZGVsYXkoKTsNCisJfQ0KKw0KKyAgICBzZXR1cF90eGRlcyggSF9UREVTX0JBU0UsIEdFVF9ETUFfQkFTRV9TRVRVUCAgICAgICApOw0KKyAgICBzZXR1cF9yeGRlcyggSF9SREVTX0JBU0UsIEdFVF9ETUFfQkFTRSgwKSAgICAgICAgICApOw0KKyAgICANCit9IC8vIEVuZCB2b2lkIHNldHVwX2RlcyAoVUxPTkcgYnVmbnVtKQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLy8gTW92ZSBidWZmZXIgcG9pbnQgb2YgVFggYW5kIFJYIGRlc2NyaXB0b3IgdG8gbmV4dCBETUEgYnVmZmVyDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIHNldHVwX2Rlc19sb29wIChVTE9ORyBidWZudW0pIHsNCisgICAgaW50CSAgICBjb3VudDsNCisgICAgVUxPTkcJSF9yeF9kZXNhZHI7DQorICAgIFVMT05HCUhfdHhfZGVzYWRyOw0KKyAgICBVTE9ORwlIX3R4X2J1ZmFkcjsNCisgICAgVUxPTkcJSF9yeF9idWZhZHI7DQorDQorCWlmICggRGJnUHJuX0J1ZkFkciApIHsNCisJICAgIHByaW50ZiAoInNldHVwX3J4ZGVzX2xvb3A6ICVsZFxuIiwgYnVmbnVtKTsgDQorCSAgICBEZWJ1Z19kZWxheSgpOw0KKwl9DQorCQ0KKwlpZiAoUnhEYXRhRW5hYmxlKSB7DQorCQlIX3J4X2J1ZmFkciA9IEdFVF9ETUFfQkFTRSggYnVmbnVtICsgMSApICsgWmVyb0NvcHlfT0ZGU0VUOw0KKwkJSF9yeF9kZXNhZHIgPSBIX1JERVNfQkFTRTsNCisvL3ByaW50ZiAoIiA9PT09PT5zZXR1cF9yeGRlc19sb29wOiAlbGQgWyVsWF1cbiIsIGJ1Zm51bSwgSF9yeF9idWZhZHIpOw0KKwkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgREVTX05VTUJFUjsgY291bnQrKykgew0KKwkJCVdyaXRlU09DX0REKEhfcnhfZGVzYWRyICsgMHgwQywgIChIX3J4X2J1ZmFkciArIENQVV9CVVNfQUREUl9TRFJBTV9PRkZTRVQpICk7IC8vIDIwMTMwNzMwDQorCQkJDQorCQkJaWYgKGNvdW50ID09IChERVNfTlVNQkVSIC0gMSkpIHsNCisJCQkJV3JpdGVTT0NfREQoIEhfcnhfZGVzYWRyLCBSREVTX0luaVZhbCB8IEVPUl9JbmlWYWwgKTsNCisJCQl9ICAgICAgICAgICAgICAgIA0KKwkJCWVsc2UgeyAgICAgICAgICAgDQorCQkJCVdyaXRlU09DX0REKCBIX3J4X2Rlc2FkciwgUkRFU19JbmlWYWwgKTsNCisJCQl9DQorCQkJSF9yeF9idWZhZHIgKz0gRE1BX1Bha1NpemU7DQorCQkJSF9yeF9kZXNhZHIgKz0gMTY7DQorCQl9DQorCX0NCisJDQorCWlmIChUeERhdGFFbmFibGUpIHsNCisJCWlmIChSeERhdGFFbmFibGUpIHsNCisJCQlIX3R4X2J1ZmFkciA9IEdFVF9ETUFfQkFTRSggYnVmbnVtICkgKyBaZXJvQ29weV9PRkZTRVQ7DQorCQl9IA0KKwkJZWxzZSB7DQorCQkJSF90eF9idWZhZHIgPSBHRVRfRE1BX0JBU0UoIDAgICAgICApICsgWmVyb0NvcHlfT0ZGU0VUOw0KKwkJfQ0KKwkJSF90eF9kZXNhZHIgPSBIX1RERVNfQkFTRTsNCisvL3ByaW50ZiAoIiA9PT09PT5zZXR1cF9UeGRlc19sb29wOiAlbGQgWyVsWF1cbiIsIGJ1Zm51bSwgSF90eF9idWZhZHIpOyAJCQ0KKwkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgREVTX05VTUJFUjsgY291bnQrKykgew0KKwkJCUZSQU1FX0xFTl9DdXIgPSBGUkFNRV9MRU5bY291bnRdOw0KKwkJCVdyaXRlU09DX0REKCBIX3R4X2Rlc2FkciArIDB4MEMsICggSF90eF9idWZhZHIgKyBDUFVfQlVTX0FERFJfU0RSQU1fT0ZGU0VUKSApOyAvLyAyMDEzMDczMA0KKwkJCWlmIChjb3VudCA9PSAoREVTX05VTUJFUiAtIDEpKSB7DQorCQkJCVdyaXRlU09DX0REKCBIX3R4X2Rlc2FkciwgVERFU19JbmlWYWwgfCBFT1JfSW5pVmFsICk7DQorCQkJfSANCisJCQllbHNlIHsNCisJCQkJV3JpdGVTT0NfREQoIEhfdHhfZGVzYWRyLCBUREVTX0luaVZhbCApOw0KKwkJCX0NCisJCQlIX3R4X2J1ZmFkciArPSBETUFfUGFrU2l6ZTsNCisJCQlIX3R4X2Rlc2FkciArPSAxNjsNCisJCX0NCisJfQ0KKw0KKwlXcml0ZVNPQ19ERCggSF9NQUNfQkFTRSArIDB4MTgsIDB4MDAwMDAwMDAgKTsgLy8gVHggUG9sbA0KKwlXcml0ZVNPQ19ERCggSF9NQUNfQkFTRSArIDB4MWMsIDB4MDAwMDAwMDAgKTsgLy8gUnggUG9sbA0KK30gLy8gRW5kIHZvaWQgc2V0dXBfZGVzX2xvb3AgKFVMT05HIGJ1Zm51bSkNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK2NoYXIgY2hlY2tfZGVzX2hlYWRlcl9UeCAoY2hhciAqdHlwZSwgVUxPTkcgYWRyLCBMT05HIGRlc251bSkgew0KKwlpbnQgICAgdGltZW91dCA9IDA7DQorCVVMT05HICBkYXQ7DQorCQ0KKwlkYXQgPSBSZWFkU09DX0REKGFkcik7DQorCQ0KKwl3aGlsZSAoIEhXT3duVHgoZGF0KSApIHsNCisJICAgIC8vIHdlIHdpbGwgcnVuIGFnYWluLCBpZiB0cmFuc2ZlciBoYXMgbm90IGJlZW4gY29tcGxldGVkLg0KKwkJaWYgKCBSeERhdGFFbmFibGUgJiYgKCsrdGltZW91dCA+IFRJTUVfT1VUX0RlcykgKSB7DQorICAgICAgICAgICAgI2lmZGVmIFNMVF9ET1MNCisgICAgICAgICAgICBmcHJpbnRmKGZwX2xvZywgIlslc1R4RGVzT3duXSBBZGRyZXNzICUwOGx4ID0gJTA4bHggW0RlczolZF1bbG9vcDolZF1cbiIsIHR5cGUsIGFkciwgZGF0LCBkZXNudW0sIExvb3ApOw0KKyAgICAgICAgICAgICNlbmRpZgkJCQ0KKwkJCXJldHVybihGaW5kRXJyX0RlcyhDaGVja19EZXNfVHhPd25UaW1lT3V0KSk7DQorCQl9DQorCQlXcml0ZVNPQ19ERChIX01BQ19CQVNFICsgMHgxOCwgMHgwMDAwMDAwMCk7Ly9UeCBQb2xsDQorCQlXcml0ZVNPQ19ERChIX01BQ19CQVNFICsgMHgxYywgMHgwMDAwMDAwMCk7Ly9SeCBQb2xsDQorICAgICAgICANCisgICAgICAgICNpZmRlZiBEZWxheV9DaGtUeE93bg0KKwkJZGVsYXkoRGVsYXlfQ2hrVHhPd24pOw0KKyAgICAgICAgI2VuZGlmDQorCQlkYXQgPSBSZWFkU09DX0REKGFkcik7DQorCX0NCisNCisJcmV0dXJuKDApOw0KK30gLy8gRW5kIGNoYXIgY2hlY2tfZGVzX2hlYWRlcl9UeCAoY2hhciAqdHlwZSwgVUxPTkcgYWRyLCBMT05HIGRlc251bSkNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK2NoYXIgY2hlY2tfZGVzX2hlYWRlcl9SeCAoY2hhciAqdHlwZSwgVUxPTkcgYWRyLCBMT05HIGRlc251bSkgew0KKyAgICAjaWZkZWYgQ2hlY2tSeE93bg0KKwlpbnQgICAgdGltZW91dCA9IDA7DQorCVVMT05HICBkYXQ7DQorCQ0KKwlkYXQgPSBSZWFkU09DX0REKGFkcik7DQorCQ0KKwl3aGlsZSAoIEhXT3duUngoIGRhdCApICkgew0KKwkgICAgLy8gd2Ugd2lsbCBydW4gYWdhaW4sIGlmIHRyYW5zZmVyIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQuDQorCQlpZiAoVHhEYXRhRW5hYmxlICYmICgrK3RpbWVvdXQgPiBUSU1FX09VVF9EZXMpKSB7DQorICAgICAgICAgICAgI2lmZGVmIFNMVF9ET1MNCisgICAgICAgICAgICBmcHJpbnRmKGZwX2xvZywgIlslc1J4RGVzT3duXSBBZGRyZXNzICUwOGx4ID0gJTA4bHggW0RlczolZF1bbG9vcDolZF1cbiIsIHR5cGUsIGFkciwgZGF0LCBkZXNudW0sIExvb3ApOw0KKyAgICAgICAgICAgICNlbmRpZg0KKwkJCXJldHVybihGaW5kRXJyX0RlcyhDaGVja19EZXNfUnhPd25UaW1lT3V0KSk7DQorCQl9DQorDQorCQlXcml0ZVNPQ19ERChIX01BQ19CQVNFICsgMHgxOCwgMHgwMDAwMDAwMCk7Ly9UeCBQb2xsDQorCQlXcml0ZVNPQ19ERChIX01BQ19CQVNFICsgMHgxYywgMHgwMDAwMDAwMCk7Ly9SeCBQb2xsDQorICAgICAgICANCisgICAgICAgICNpZmRlZiBEZWxheV9DaGtSeE93bg0KKwkJZGVsYXkoRGVsYXlfQ2hrUnhPd24pOw0KKyAgICAgICAgI2VuZGlmDQorCQlkYXQgPSBSZWFkU09DX0REKGFkcik7DQorCX07DQorDQorCURhdF9VTE9ORyA9IFJlYWRTT0NfREQoIGFkciArIDEyICk7DQorDQorICAgICNpZmRlZiBDaGVja1J4TGVuDQorICAgICNpZmRlZiBTTFRfRE9TDQorICAgIGlmICggRGJnUHJuX0ZSQU1FX0xFTiApIA0KKwkgICAgZnByaW50ZihmcF9sb2csICJbJXNSeERlcyAgICAgICAgICBdIEZSQU1FX0xFTl9DdXI6JTA4bHhbRGVzOiVkXVtsb29wOiVkXVxuIiwgdHlwZSwgKEZSQU1FX0xFTl9DdXIgKyA0KSwgZGVzbnVtLCBMb29wKTsNCisgICAgI2VuZGlmCSAgDQorICAgICAgICANCisJaWYgKChkYXQgJiAweDNmZmYpICE9IChGUkFNRV9MRU5fQ3VyICsgNCkpIHsNCisgICAgICAgICNpZmRlZiBTTFRfRE9TDQorCQlmcHJpbnRmKGZwX2xvZywgIlslc1J4RGVzXSBFcnJvciBGcmFtZSBMZW5ndGggJTA4bHg6JTA4bHggJTA4bHgoJTRkLyU0ZCkgW0RlczolZF1bbG9vcDolZF1cbiIsICAgdHlwZSwgYWRyLCBkYXQsIERhdF9VTE9ORywgKGRhdCAmIDB4M2ZmZiksIChGUkFNRV9MRU5fQ3VyICsgNCksIGRlc251bSwgTG9vcCk7DQorICAgICAgICAjZW5kaWYNCisJCUZpbmRFcnJfRGVzKENoZWNrX0Rlc19GcmFtZUxlbik7DQorCX0NCisgICAgI2VuZGlmIC8vIEVuZCBDaGVja1J4TGVuDQorDQorICAgICNpZmRlZiBDaGVja1J4RXJyDQorCWlmIChkYXQgJiAweDAwMDQwMDAwKSB7DQorICAgICAgICAjaWZkZWYgU0xUX0RPUw0KKwkJZnByaW50ZihmcF9sb2csICJbJXNSeERlc10gRXJyb3IgUnhFcnIgICAgICAgICUwOGx4OiUwOGx4ICUwOGx4ICAgICAgICAgICAgW0RlczolZF1bbG9vcDolZF1cbiIsIHR5cGUsIGFkciwgZGF0LCBEYXRfVUxPTkcsIGRlc251bSwgTG9vcCk7DQorICAgICAgICAjZW5kaWYNCisgICAgICAgIEZpbmRFcnJfRGVzKENoZWNrX0Rlc19SeEVycik7DQorCX0NCisgICAgI2VuZGlmIC8vIEVuZCBDaGVja1J4RXJyDQorDQorICAgICNpZmRlZiBDaGVja09kZE5pYmJsZQ0KKwlpZiAoZGF0ICYgMHgwMDQwMDAwMCkgew0KKyAgICAgICAgI2lmZGVmIFNMVF9ET1MNCisJCWZwcmludGYoZnBfbG9nLCAiWyVzUnhEZXNdIE9kZCBOaWJibGUgICAgICAgICAlMDhseDolMDhseCAlMDhseCAgICAgICAgICAgIFtEZXM6JWRdW2xvb3A6JWRdXG4iLCB0eXBlLCBhZHIsIGRhdCwgRGF0X1VMT05HLCBkZXNudW0sIExvb3ApOw0KKyAgICAgICAgI2VuZGlmDQorCQlGaW5kRXJyX0RlcyhDaGVja19EZXNfT2RkTmliYmxlKTsNCisJfQ0KKyAgICAjZW5kaWYgLy8gRW5kIENoZWNrT2RkTmliYmxlDQorDQorICAgICNpZmRlZiBDaGVja0NSQw0KKwlpZiAoZGF0ICYgMHgwMDA4MDAwMCkgew0KKyAgICAgICAgI2lmZGVmIFNMVF9ET1MNCisJCWZwcmludGYoZnBfbG9nLCAiWyVzUnhEZXNdIEVycm9yIENSQyAgICAgICAgICAlMDhseDolMDhseCAlMDhseCAgICAgICAgICAgIFtEZXM6JWRdW2xvb3A6JWRdXG4iLCB0eXBlLCBhZHIsIGRhdCwgRGF0X1VMT05HLCBkZXNudW0sIExvb3ApOw0KKyAgICAgICAgI2VuZGlmDQorCQlGaW5kRXJyX0RlcyhDaGVja19EZXNfQ1JDKTsNCisJfQ0KKyAgICAjZW5kaWYgLy8gRW5kIENoZWNrQ1JDDQorDQorICAgICNpZmRlZiBDaGVja1J4RklGT0Z1bGwNCisJaWYgKGRhdCAmIDB4MDA4MDAwMDApIHsNCisJCSNpZmRlZiBTTFRfRE9TDQorICAgICAgICBmcHJpbnRmKGZwX2xvZywgIlslc1J4RGVzXSBFcnJvciBSeCBGSUZPIEZ1bGwgJTA4bHg6JTA4bHggJTA4bHggICAgICAgICAgICBbRGVzOiVkXVtsb29wOiVkXVxuIiwgdHlwZSwgYWRyLCBkYXQsIERhdF9VTE9ORywgZGVzbnVtLCBMb29wKTsNCisgICAgICAgICNlbmRpZg0KKwkJRmluZEVycl9EZXMoQ2hlY2tfRGVzX1J4RklGT0Z1bGwpOw0KKwl9DQorICAgICNlbmRpZiAvLyBFbmQgQ2hlY2tSeEZJRk9GdWxsDQorICAgIA0KKyAgICAvLwlpZiAoY2hlY2tfaW50ICgiIikpIHtyZXR1cm4oMSk7fQ0KKyAgICAjZW5kaWYgLy8gRW5kIENoZWNrUnhPd24NCisNCisJaWYgKEVycl9GbGFnKSANCisJICAgIHJldHVybigxKTsNCisJZWxzZSAgICAgICAgICANCisJICAgIHJldHVybigwKTsNCit9IC8vIEVuZCBjaGFyIGNoZWNrX2Rlc19oZWFkZXJfUnggKGNoYXIgKnR5cGUsIFVMT05HIGFkciwgTE9ORyBkZXNudW0pDQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitjaGFyIGNoZWNrX2RlcyAoVUxPTkcgYnVmbnVtLCBpbnQgY2hlY2twb2ludCkgew0KKyAgICBpbnQgICAgIGRlc251bTsgICAgDQorICAgIFVMT05HCUhfcnhfZGVzYWRyOw0KKyAgICBVTE9ORwlIX3R4X2Rlc2FkcjsNCisgICAgVUxPTkcJSF90eF9idWZhZHI7DQorICAgIFVMT05HCUhfcnhfYnVmYWRyOw0KKyAgICANCisgICAgI2lmZGVmIERlbGF5X0Rlc0dhcA0KKyAgICBVTE9ORwlkbHlfY250ID0gMDsNCisgICAgVUxPTkcJZGx5X21heCA9IERlbGF5X0NudE1heEluY1ZhbDsNCisgICAgI2VuZGlmDQorICAgIA0KKwkjaWZkZWYgIERiZ1Bybl9GdW5jSGVhZGVyDQorCSAgICBwcmludGYgKCJjaGVja19kZXMgIDogJWQoJWQpXG4iLCBMb29wLCBjaGVja3BvaW50KTsgDQorCSAgICBEZWJ1Z19kZWxheSgpOw0KKyAgICAjZW5kaWYNCisgICAgDQorCS8vIEZpcmUgdGhlIGVuZ2luZSB0byBzZW5kIGFuZCByZWN2aWNlDQorCVdyaXRlU09DX0REKCBIX01BQ19CQVNFICsgMHgxOCwgMHgwMDAwMDAwMCApOy8vVHggUG9sbA0KKwlXcml0ZVNPQ19ERCggSF9NQUNfQkFTRSArIDB4MWMsIDB4MDAwMDAwMDAgKTsvL1J4IFBvbGwNCisJDQorICAgICNpZmRlZiBTZWxlY3RTaW1wbGVEZXMNCisgICAgI2Vsc2UNCisgICAgaWYgKCBJRUVFVGVzdGluZyA9PSAxICkgew0KKyAgICAgICAgLy8gSUVFRSB0ZXN0IG1vZGUsIHRoZXJlIGlzIHRoZSBzYW1lIGRhdGEgaW4gZXZlcnkgbGFuIHBhY2tldA0KKyAgICAgICAgSF90eF9idWZhZHIgPSBHRVRfRE1BX0JBU0VfU0VUVVA7DQorICAgICAgICBIX3J4X2J1ZmFkciA9IEdFVF9ETUFfQkFTRSgwKTsNCisgICAgfQ0KKyAgICBlbHNlIHsNCisJICAgIEhfcnhfYnVmYWRyID0gR0VUX0RNQV9CQVNFKCBidWZudW0gKyAxICkgKyBaZXJvQ29weV9PRkZTRVQ7DQorCSAgICANCisJICAgIGlmIChSeERhdGFFbmFibGUpIHsNCisJICAgIAlIX3R4X2J1ZmFkciA9IEdFVF9ETUFfQkFTRShidWZudW0gICkgKyBaZXJvQ29weV9PRkZTRVQ7DQorCSAgICB9IA0KKwkgICAgZWxzZSB7DQorCSAgICAJSF90eF9idWZhZHIgPSBHRVRfRE1BX0JBU0UoIDAgICAgICApICsgWmVyb0NvcHlfT0ZGU0VUOw0KKwkgICAgfQ0KKwl9DQorICAgICNlbmRpZg0KKw0KKwlIX3J4X2Rlc2FkciA9IEhfUkRFU19CQVNFOw0KKwlIX3R4X2Rlc2FkciA9IEhfVERFU19CQVNFOw0KKw0KKyAgICAjaWZkZWYgRGVsYXlfREVTDQorCWRlbGF5KERlbGF5X0RFUyk7DQorICAgICNlbmRpZg0KKwkNCisJZm9yIChkZXNudW0gPSAwOyBkZXNudW0gPCBERVNfTlVNQkVSOyBkZXNudW0rKykgew0KKwkJaWYgKCBEYmdQcm5fQnVmQWRyICkgDQorCQkgICAgcHJpbnRmKCAiW2xvb3A6JTRkXVtkZXM6JTRkXVtjaGVja19kZXMgIF0gJTA4bHggJTA4bHggWyUwOGx4XSBbJTA4bHhdXG4iLCBMb29wLCBkZXNudW0sICggSF90eF9kZXNhZHIgKSwgKCBIX3J4X2Rlc2FkciApLCBSZWFkU09DX0REKCBIX3R4X2Rlc2FkciArIDEyICksIFJlYWRTT0NfREQoIEhfcnhfZGVzYWRyICsgMTIgKSApOw0KKw0KKwkJLy9bRGVsYXldLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisgICAgICAgICNpZmRlZiBEZWxheV9EZXNHYXANCisJCWlmICggZGx5X2NudCsrID4gMyApIHsNCisJCQlzd2l0Y2ggKCByYW5kKCkgJSAxMiApIHsNCisJCQkJY2FzZSAxIDogZGx5X21heCA9IDAwMDAwOyBicmVhazsNCisJCQkJY2FzZSAzIDogZGx5X21heCA9IDIwMDAwOyBicmVhazsNCisJCQkJY2FzZSA1IDogZGx5X21heCA9IDQwMDAwOyBicmVhazsNCisJCQkJY2FzZSA3IDogZGx5X21heCA9IDYwMDAwOyBicmVhazsNCisJCQkJZGVmYXVsZTogZGx5X21heCA9IDcwMDAwOyBicmVhazsNCisJCQl9DQorCQkJDQorCQkJZGx5X21heCArPSAoIHJhbmQoKSAlIDQgKSAqIDE0MzIxOw0KKw0KKwkJCXdoaWxlIChkbHlfY250IDwgZGx5X21heCkgew0KKwkJCSAgICBkbHlfY250Kys7DQorCQkJfQ0KKwkJCQ0KKwkJCWRseV9jbnQgPSAwOw0KKwkJfSANCisJCWVsc2Ugew0KKy8vCQkJdGltZW91dCA9IDA7DQorLy8JCQl3aGlsZSAodGltZW91dCA8IDUwMDAwKSB7dGltZW91dCsrO307DQorCQl9DQorICAgICAgICAjZW5kaWYgLy8gRW5kIERlbGF5X0Rlc0dhcA0KKyAgICAgICAgDQorCQkvL1tDaGVjayBPd25lciBCaXRdLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisJCUZSQU1FX0xFTl9DdXIgPSBGUkFNRV9MRU5bZGVzbnVtXTsNCisjaWZkZWYgU0xUX0RPUwkJDQorCQlpZiAoIERiZ1Bybl9GUkFNRV9MRU4gKSANCisJCSAgICBmcHJpbnRmKGZwX2xvZywgIltjaGVja19kZXMgICAgICBdIEZSQU1FX0xFTl9DdXI6JTA4bHhbRGVzOiVkXVtsb29wOiVkXSVkXG4iLCBGUkFNRV9MRU5fQ3VyLCBkZXNudW0sIExvb3AsIGNoZWNrcG9pbnQpOw0KKyNlbmRpZgkJICAgIA0KKy8vCQlpZiAoQnVyc3RFbmFibGUpIHsNCisvLwkJCWlmIChjaGVja19kZXNfaGVhZGVyX1R4KCIiLCBIX3R4X2Rlc2FkciwgZGVzbnVtKSkge0NoZWNrRGVzRmFpbF9EZXNOdW0gPSBkZXNudW07IHJldHVybigxKTt9DQorLy8JCX0gZWxzZSB7DQorLy8JCQlpZiAoY2hlY2tfZGVzX2hlYWRlcl9SeCgiIiwgSF9yeF9kZXNhZHIsIGRlc251bSkpIHtDaGVja0Rlc0ZhaWxfRGVzTnVtID0gZGVzbnVtOyByZXR1cm4oMSk7fQ0KKy8vCQkJaWYgKGNoZWNrX2Rlc19oZWFkZXJfVHgoIiIsIEhfdHhfZGVzYWRyLCBkZXNudW0pKSB7Q2hlY2tEZXNGYWlsX0Rlc051bSA9IGRlc251bTsgcmV0dXJuKDEpO30NCisvLwkJfQ0KKyAgICAgICAgDQorICAgICAgICAvLyBDaGVjayB0aGUgZGVzY3JpcHRpb24gb2YgVHggYW5kIFJ4DQorCQlpZiAoIFJ4RGF0YUVuYWJsZSAmJiBjaGVja19kZXNfaGVhZGVyX1J4KCIiLCBIX3J4X2Rlc2FkciwgZGVzbnVtKSApIHsNCisJCSAgICBDaGVja0Rlc0ZhaWxfRGVzTnVtID0gZGVzbnVtOyANCisNCisJCSAgICByZXR1cm4oMSk7DQorCQl9DQorCQlpZiAoIFR4RGF0YUVuYWJsZSAmJiBjaGVja19kZXNfaGVhZGVyX1R4KCIiLCBIX3R4X2Rlc2FkciwgZGVzbnVtKSApIHsNCisJCSAgICBDaGVja0Rlc0ZhaWxfRGVzTnVtID0gZGVzbnVtOyANCisNCisJCSAgICByZXR1cm4oMSk7DQorCQl9DQorLy8JCWVsc2Ugew0KKy8vCQkJcHJpbnRmKCIgJWQgICAgICAgICAgICAgICAgICAgICAgICBcciIsIGRlc251bSk7DQorLy8JCX0NCisNCisgICAgICAgICNpZmRlZiBTZWxlY3RTaW1wbGVEZXMNCisgICAgICAgICNlbHNlDQorCQlpZiAoICFjaGVja3BvaW50ICkgew0KKwkJICAgIC8vIFNldHRpbmcgYnVmZmVyIGFkZHJlc3MgdG8gZGVzY3JpcHRpb24gb2YgVHggYW5kIFJ4IG9uIG5leHQgc3RhZ2UNCisJCSAgICANCisvLwkJCWlmICghQnVyc3RFbmFibGUpIHsNCisvLwkJCQlXcml0ZVNPQ19ERCggSF9yeF9kZXNhZHIgKyAweDBDLCAoSF9yeF9idWZhZHIgKyBDUFVfQlVTX0FERFJfU0RSQU1fT0ZGU0VUKSApOw0KKy8vCQkJCVdyaXRlU09DX0REKCBIX3R4X2Rlc2FkciArIDB4MEMsIChIX3R4X2J1ZmFkciArIENQVV9CVVNfQUREUl9TRFJBTV9PRkZTRVQpICk7DQorLy8JCQl9DQorLy8NCisvLwkJCWlmICggZGVzbnVtID09IChERVNfTlVNQkVSIC0gMSkgKSB7DQorLy8JCQkJV3JpdGVTT0NfREQoIEhfcnhfZGVzYWRyLCBSREVTX0luaVZhbCB8IEVPUl9JbmlWYWwgKTsNCisvLwkJCQlXcml0ZVNPQ19ERCggSF90eF9kZXNhZHIsIFRERVNfSW5pVmFsIHwgRU9SX0luaVZhbCApOw0KKy8vCQkJfSANCisvLyAgICAgICAgICBlbHNlIHsgICAgICAgICANCisvLwkJCQlXcml0ZVNPQ19ERCggSF9yeF9kZXNhZHIsIFJERVNfSW5pVmFsICk7DQorLy8JCQkJV3JpdGVTT0NfREQoIEhfdHhfZGVzYWRyLCBUREVTX0luaVZhbCApOw0KKy8vCQkJfQ0KKy8vCQkJV3JpdGVTT0NfREQoIEhfTUFDX0JBU0UrMHgxOCwgMHgwMDAwMDAwMCApOyAvL1R4IFBvbGwNCisvLwkJCVdyaXRlU09DX0REKCBIX01BQ19CQVNFKzB4MWMsIDB4MDAwMDAwMDAgKTsgLy9SeCBQb2xsDQorDQorCQkJaWYgKCBSeERhdGFFbmFibGUgKSB7DQorCQkJCVdyaXRlU09DX0REKCBIX3J4X2Rlc2FkciArIDB4MEMsIChIX3J4X2J1ZmFkciArIENQVV9CVVNfQUREUl9TRFJBTV9PRkZTRVQpICk7IC8vIDIwMTMwNzMwDQorCQkJCQ0KKwkJCQlpZiAoIGRlc251bSA9PSAoREVTX05VTUJFUiAtIDEpICkgew0KKwkJCQkJV3JpdGVTT0NfREQoIEhfcnhfZGVzYWRyLCBSREVTX0luaVZhbCB8IEVPUl9JbmlWYWwgKTsNCisJCQkJfSBlbHNlIHsgICAgICAgICANCisJCQkJCVdyaXRlU09DX0REKCBIX3J4X2Rlc2FkciwgUkRFU19JbmlWYWwgKTsNCisJCQkJfQ0KKwkJCX0NCisJCQlpZiAoIFR4RGF0YUVuYWJsZSApIHsNCisJCQkJV3JpdGVTT0NfREQoIEhfdHhfZGVzYWRyICsgMHgwQywgKEhfdHhfYnVmYWRyICsgQ1BVX0JVU19BRERSX1NEUkFNX09GRlNFVCkgKTsgLy8gMjAxMzA3MzANCisJCQkJaWYgKCBkZXNudW0gPT0gKERFU19OVU1CRVIgLSAxKSApIHsNCisJCQkJCVdyaXRlU09DX0REKCBIX3R4X2Rlc2FkciwgVERFU19JbmlWYWwgfCBFT1JfSW5pVmFsICk7DQorCQkJCX0gICAgICAgICAgICAgICAgDQorCQkJCWVsc2UgeyAgICAgICAgICAgDQorCQkJCQlXcml0ZVNPQ19ERCggSF90eF9kZXNhZHIsIFRERVNfSW5pVmFsICk7DQorCQkJCX0NCisJCQl9DQorCQkJV3JpdGVTT0NfREQoIEhfTUFDX0JBU0UgKyAweDE4LCAweDAwMDAwMDAwICk7IC8vVHggUG9sbA0KKwkJCVdyaXRlU09DX0REKCBIX01BQ19CQVNFICsgMHgxYywgMHgwMDAwMDAwMCApOyAvL1J4IFBvbGwNCisJCX0NCisJCUhfcnhfYnVmYWRyICs9IERNQV9QYWtTaXplOw0KKwkJSF90eF9idWZhZHIgKz0gRE1BX1Bha1NpemU7DQorICAgICAgICAjZW5kaWYgLy8gRW5kIFNlbGVjdFNpbXBsZURlcw0KKwkJDQorCQlIX3J4X2Rlc2FkciArPSAxNjsNCisJCUhfdHhfZGVzYWRyICs9IDE2Ow0KKwl9IC8vIEVuZCBmb3IgKGRlc251bSA9IDA7IGRlc251bSA8IERFU19OVU1CRVI7IGRlc251bSsrKQ0KKwkNCisJcmV0dXJuKDApOw0KK30gLy8gRW5kIGNoYXIgY2hlY2tfZGVzIChVTE9ORyBidWZudW0sIGludCBjaGVja3BvaW50KQ0KKy8vI2VuZGlmDQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisvLyBQcmludA0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBQcmludE1vZGUgKHZvaWQpIHsNCisJaWYgKEVuYWJsZV9NQUMzNCkgcHJpbnRmICgicnVuX21vZGVbZGVjXSAgICB8IDAtPk1BQzEgMS0+TUFDMiAyLT5NQUMzIDMtPk1BQzRcbiIpOw0KKwllbHNlICAgICAgICAgICAgICBwcmludGYgKCJydW5fbW9kZVtkZWNdICAgIHwgMC0+TUFDMSAxLT5NQUMyXG4iKTsNCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIFByaW50U3BlZWQgKHZvaWQpIHsNCisJcHJpbnRmICgic3BlZWRbZGVjXSAgICAgICB8IDAtPjFHICAgMS0+MTAwTSAyLT4xME0gIDMtPmFsbCBzcGVlZCAoZGVmYXVsdDolM2QpXG4iLCBERUZfU1BFRUQpOw0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgUHJpbnRDdHJsICh2b2lkKSB7DQorCSAgICBwcmludGYgKCJjdHJsW2RlY10gICAgICAgIHwgYml0MH4yOiBSZXNlcnZlZFxuIik7DQorCSAgICBwcmludGYgKCIoZGVmYXVsdDolM2QpICAgIHwgYml0MyAgOiAxLT5FbmFibGUgUEhZIGluaXQgICAgIDAtPkRpc2FibGUgUEhZIGluaXRcbiIsIEdDdHJsKTsNCisJICAgIHByaW50ZiAoIiAgICAgICAgICAgICAgICAgfCBiaXQ0ICA6IDEtPkVuYWJsZSBQSFkgaW50LWxvb3AgMC0+RGlzYWJsZSBQSFkgaW50LWxvb3BcbiIpOw0KKwkgICAgcHJpbnRmICgiICAgICAgICAgICAgICAgICB8IGJpdDUgIDogMS0+SWdub3JlIFBIWSBJRCAgICAgICAwLT5DaGVjayBQSFkgSURcbiIpOw0KKwlpZiAoQVNUMjQwMCkgew0KKwkJcHJpbnRmICgiICAgICAgICAgICAgICAgICB8IGJpdDYgIDogMS0+RW5hYmxlIE1BQyBpbnQtbG9vcCAwLT5EaXNhYmxlIE1BQyBpbnQtbG9vcFxuIik7DQorCX0NCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIFByaW50TG9vcCAodm9pZCkgew0KKwlwcmludGYgKCJsb29wX21heFtkZWNdICAgIHwgMUcgIDogMjAgd2lsbCBydW4gMSBzZWMgKGRlZmF1bHQ6JTNkKVxuIiwgREVGX0xPT1BfTUFYICogMjApOw0KKwlwcmludGYgKCIgICAgICAgICAgICAgICAgIHwgMTAwTTogIDIgd2lsbCBydW4gMSBzZWMgKGRlZmF1bHQ6JTNkKVxuIiwgREVGX0xPT1BfTUFYICogMik7DQorCXByaW50ZiAoIiAgICAgICAgICAgICAgICAgfCAxME0gOiAgMSB3aWxsIHJ1biAxIHNlYyAoZGVmYXVsdDolM2QpXG4iLCBERUZfTE9PUF9NQVgpOw0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgUHJpbnRUZXN0ICh2b2lkKSB7DQorCWlmICggTW9kZVN3aXRjaCA9PSBNT0RFX05TQ0kgKSB7DQorCQlwcmludGYgKCJ0ZXN0X21vZGVbZGVjXSAgIHwgMDogTkNTSSBjb25maWd1cmF0aW9uIHdpdGggICAgRGlzYWJsZV9DaGFubmVsIHJlcXVlc3RcbiIpOw0KKwkJcHJpbnRmICgiKGRlZmF1bHQ6JTNkKSAgICB8IDE6IE5DU0kgY29uZmlndXJhdGlvbiB3aXRob3V0IERpc2FibGVfQ2hhbm5lbCByZXF1ZXN0XG4iLCBERUZfVEVTVE1PREUpOw0KKwl9DQorCWVsc2Ugew0KKwkJcHJpbnRmICgidGVzdF9tb2RlW2RlY10gICB8IDA6IFR4L1J4IGZyYW1lIGNoZWNraW5nXG4iKTsNCisJCXByaW50ZiAoIihkZWZhdWx0OiUzZCkgICAgfCAxOiBUeCBvdXRwdXQgMHhmZiBmcmFtZVxuIiwgREVGX1RFU1RNT0RFKTsNCisJCXByaW50ZiAoIiAgICAgICAgICAgICAgICAgfCAyOiBUeCBvdXRwdXQgMHg1NSBmcmFtZVxuIik7DQorCQlwcmludGYgKCIgICAgICAgICAgICAgICAgIHwgMzogVHggb3V0cHV0IHJhbmRvbSBmcmFtZVxuIik7DQorCQlwcmludGYgKCIgICAgICAgICAgICAgICAgIHwgNDogVHggb3V0cHV0IEFSUCBmcmFtZVxuIik7DQorCQlwcmludGYgKCIgICAgICAgICAgICAgICAgIHwgNTogVHggb3V0cHV0IHVzZXIgZGVmaW5lZCB2YWx1ZSBmcmFtZSAoZGVmYXVsdDoweCU4eClcbiIsIERFRl9VU0VSX0RFRl9QQUNLRVRfVkFMKTsNCisJfSAvLyBFbmQgaWYgKCBNb2RlU3dpdGNoID09IE1PREVfTlNDSSApDQorCQ0KKwlpZiAoQVNUMjMwMCkgew0KKwkJcHJpbnRmICgiICAgICAgICAgICAgICAgICB8IDY6IElPIHRpbWluZyB0ZXN0aW5nXG4iKTsNCisJCXByaW50ZiAoIiAgICAgICAgICAgICAgICAgfCA3OiBJTyB0aW1pbmcvc3RyZW5ndGggdGVzdGluZ1xuIik7DQorCX0NCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIFByaW50UEhZQWRyICh2b2lkKSB7DQorCXByaW50ZiAoInBoeV9hZHJbZGVjXSAgICAgfCAwfjMxOiBQSFkgQWRkcmVzcyAoZGVmYXVsdDolZClcbiIsIERFRl9QSFlfQURSKTsNCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIFByaW50SU9UaW1pbmdCdW5kICh2b2lkKSB7DQorCXByaW50ZiAoIklPIG1hcmdpbltkZWNdICAgfCAwLzEvMy81IChkZWZhdWx0OiVkKVxuIiwgREVGX0lPVElNSU5HQlVORCk7DQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBQcmludFBha05VbSAodm9pZCkgew0KKwlwcmludGYgKCJwYWNrYWdlX251bVtkZWNdIHwgMX4gODogVG90YWwgTnVtYmVyIG9mIE5DU0kgUGFja2FnZSAoZGVmYXVsdDolZClcbiIsIERFRl9QQUNLQUdFMk5VTSk7DQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBQcmludENobE5VbSAodm9pZCkgew0KKwlwcmludGYgKCJjaGFubmVsX251bVtkZWNdIHwgMX4zMjogVG90YWwgTnVtYmVyIG9mIE5DU0kgQ2hhbm5lbCAoZGVmYXVsdDolZClcbiIsIERFRl9DSEFOTkVMMk5VTSk7DQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQordm9pZCBQcmludF9IZWFkZXIgKEJZVEUgb3B0aW9uKSB7DQorICAgIA0KKyAgICBGSUxFX1ZBUg0KKyAgICANCisgICAgR0VUX09CSiggb3B0aW9uICkNCisgICAgDQorCWlmICAgICAgKEdTcGVlZF9zZWxbMF0pIFBSSU5UKE9VVF9PQkogIiAxRyAgICIpOw0KKwllbHNlIGlmIChHU3BlZWRfc2VsWzFdKSBQUklOVChPVVRfT0JKICIgMTAwTSAiKTsNCisJZWxzZSAgICAgICAgICAgICAgICAgICAgUFJJTlQoT1VUX09CSiAiIDEwTSAgIik7DQorCSAgICANCisJc3dpdGNoIChUZXN0TW9kZSkgew0KKwkJY2FzZSAwIDogUFJJTlQoT1VUX09CSiAiVHgvUnggZnJhbWUgY2hlY2tpbmcgICAgICAgXG4iICAgICAgICAgICk7IGJyZWFrOw0KKwkJY2FzZSAxIDogUFJJTlQoT1VUX09CSiAiVHggb3V0cHV0IDB4ZmYgZnJhbWUgICAgICAgXG4iICAgICAgICAgICk7IGJyZWFrOw0KKwkJY2FzZSAyIDogUFJJTlQoT1VUX09CSiAiVHggb3V0cHV0IDB4NTUgZnJhbWUgICAgICAgXG4iICAgICAgICAgICk7IGJyZWFrOw0KKwkJY2FzZSAzIDogUFJJTlQoT1VUX09CSiAiVHggb3V0cHV0IHJhbmRvbSBmcmFtZSAgICAgXG4iICAgICAgICAgICk7IGJyZWFrOw0KKwkJY2FzZSA0IDogUFJJTlQoT1VUX09CSiAiVHggb3V0cHV0IEFSUCBmcmFtZSAgICAgICAgXG4iICAgICAgICAgICk7IGJyZWFrOw0KKwkJY2FzZSA1IDogUFJJTlQoT1VUX09CSiAiVHggb3V0cHV0IDB4JTA4bHggZnJhbWUgICAgIFxuIiwgVXNlckRWYWwpOyBicmVhazsNCisJCWNhc2UgNiA6IFBSSU5UKE9VVF9PQkogIklPIGRlbGF5IHRlc3RpbmcgICAgICAgICAgIFxuIiAgICAgICAgICApOyBicmVhazsNCisJCWNhc2UgNyA6IFBSSU5UKE9VVF9PQkogIklPIGRlbGF5IHRlc3RpbmcoU3RyZW5ndGgpIFxuIiAgICAgICAgICApOyBicmVhazsNCisJCWNhc2UgOCA6IFBSSU5UKE9VVF9PQkogIlR4IGZyYW1lICAgICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICApOyBicmVhazsNCisJCWNhc2UgOSA6IFBSSU5UKE9VVF9PQkogIlJ4IGZyYW1lIGNoZWNraW5nICAgICAgICAgIFxuIiAgICAgICAgICApOyBicmVhazsNCisJfQ0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgUHJpbnRJT19IZWFkZXIgKEJZVEUgb3B0aW9uKSB7DQorICAgICAgICANCisgICAgRklMRV9WQVINCisgICAgDQorICAgIEdFVF9PQkooIG9wdGlvbiApDQorICAgIA0KKwlpZiAoIElPU3RyZW5ndGggKSB7DQorCQlpZiAgICAgIChHU3BlZWRfc2VsWzBdKSBQUklOVChPVVRfT0JKICJbU3RyZW5ndGggJWxkXVsxRyAgXT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIsIElPU3RyX2kpOw0KKwkJZWxzZSBpZiAoR1NwZWVkX3NlbFsxXSkgUFJJTlQoT1VUX09CSiAiW1N0cmVuZ3RoICVsZF1bMTAwTV09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iLCBJT1N0cl9pKTsNCisJCWVsc2UgICAgICAgICAgICAgICAgICAgIFBSSU5UKE9VVF9PQkogIltTdHJlbmd0aCAlbGRdWzEwTSBdPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIiwgSU9TdHJfaSk7DQorCX0gZWxzZSB7DQorCQlpZiAgICAgIChHU3BlZWRfc2VsWzBdKSBQUklOVChPVVRfT0JKICJbMUcgIF09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsNCisJCWVsc2UgaWYgKEdTcGVlZF9zZWxbMV0pIFBSSU5UKE9VVF9PQkogIlsxMDBNXT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOw0KKwkJZWxzZSAgICAgICAgICAgICAgICAgICAgUFJJTlQoT1VUX09CSiAiWzEwTSBdPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7DQorCX0NCisNCisjaWZkZWYgRW5hYmxlX09sZF9TdHlsZQ0KKwlpZiAoRW5hYmxlX1JNSUkpIFBSSU5UKE9VVF9PQkogIlR4OlNDVTQ4WyAgICUyZF09ICAgIiwgSU9kbHlfb3V0X3NoZik7DQorCWVsc2UgICAgICAgICAgICAgUFJJTlQoT1VUX09CSiAiVHg6U0NVNDhbJTJkOiUyZF09ICAgIiwgSU9kbHlfb3V0X3NoZiszLCBJT2RseV9vdXRfc2hmKTsNCisJICAgIA0KKwlmb3IgKElPZGx5X2ogPSBJT2RseV9vdXRfc3RyOyBJT2RseV9qIDw9IElPZGx5X291dF9lbmQ7IElPZGx5X2orPUlPZGx5X2luY3ZhbCkgew0KKwkJSU9kbHlfb3V0ID0gdmFsYXJ5W0lPZGx5X2pdOw0KKwkJUFJJTlQoT1VUX09CSiAiJTJ4IiwgSU9kbHlfb3V0KTsNCisJfQ0KKw0KKwlQUklOVChPVVRfT0JKICJcbiAgICAgICAgICAgICAgICAgICAiKTsNCisJZm9yIChJT2RseV9qID0gSU9kbHlfb3V0X3N0cjsgSU9kbHlfaiA8PSBJT2RseV9vdXRfZW5kOyBJT2RseV9qKz1JT2RseV9pbmN2YWwpIHsNCisJCWlmIChJT2RseV9vdXRfcmVnX2lkeCA9PSBJT2RseV9qKSBQUklOVChPVVRfT0JKICIgfCIpOw0KKwkJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5UKE9VVF9PQkogIiAgIik7DQorCX0NCisjZWxzZQ0KKwlQUklOVChPVVRfT0JKICJSeDpTQ1U0OFslMmQ6JTJkXT0gICAiLCBJT2RseV9pbl9zaGYrMywgSU9kbHlfaW5fc2hmKTsNCisJDQorCWZvciAoSU9kbHlfaSA9IElPZGx5X2luX3N0cjsgSU9kbHlfaSA8PSBJT2RseV9pbl9lbmQ7IElPZGx5X2krPUlPZGx5X2luY3ZhbCkgew0KKwkJSU9kbHlfaW4gPSB2YWxhcnlbSU9kbHlfaV07DQorCQlQUklOVChPVVRfT0JKICIlMngiLCBJT2RseV9pbik7DQorCX0NCisNCisJUFJJTlQoT1VUX09CSiAiXG4gICAgICAgICAgICAgICAgICAgIik7DQorCWZvciAoSU9kbHlfaSA9IElPZGx5X2luX3N0cjsgSU9kbHlfaSA8PSBJT2RseV9pbl9lbmQ7IElPZGx5X2krPUlPZGx5X2luY3ZhbCkgew0KKwkJaWYgKElPZGx5X2luX3JlZ19pZHggPT0gSU9kbHlfaSkgUFJJTlQoT1VUX09CSiAiIHwiKTsNCisJCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5UKE9VVF9PQkogIiAgIik7DQorCX0NCisjZW5kaWYNCisNCisJUFJJTlQoT1VUX09CSiAiXG4iKTsNCit9IC8vIEVuZCB2b2lkIFByaW50SU9fSGVhZGVyIChCWVRFIG9wdGlvbikNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgUHJpbnRJT19MaW5lUyAoQllURSBvcHRpb24pIHsNCisgICAgICAgICAgICANCisgICAgRklMRV9WQVINCisgICAgDQorICAgIEdFVF9PQkooIG9wdGlvbiApDQorICAgIA0KKyAgICANCisjaWZkZWYgRW5hYmxlX09sZF9TdHlsZQ0KKwlpZiAoSU9kbHlfaW5fcmVnID09IElPZGx5X2luKSB7DQorCQlQUklOVChPVVRfT0JKICJSeDpTQ1U0OFslMmQ6JTJkXT0lMDF4Oi0iLCBJT2RseV9pbl9zaGYrMywgSU9kbHlfaW5fc2hmLCBJT2RseV9pbik7DQorCX0gDQorCWVsc2Ugew0KKwkJUFJJTlQoT1VUX09CSiAiUng6U0NVNDhbJTJkOiUyZF09JTAxeDogIiwgSU9kbHlfaW5fc2hmKzMsIElPZGx5X2luX3NoZiwgSU9kbHlfaW4pOw0KKwl9DQorI2Vsc2UNCisJaWYgKEVuYWJsZV9STUlJKSB7DQorCQlpZiAoSU9kbHlfb3V0X3JlZyA9PSBJT2RseV9vdXQpIHsNCisJCQlQUklOVChPVVRfT0JKICJUeDpTQ1U0OFsgICAlMmRdPSUwMXg6LSIsIElPZGx5X291dF9zaGYsIElPZGx5X291dCk7DQorCQl9IA0KKwkJZWxzZSB7DQorCQkJUFJJTlQoT1VUX09CSiAiVHg6U0NVNDhbICAgJTJkXT0lMDF4OiAiLCBJT2RseV9vdXRfc2hmLCBJT2RseV9vdXQpOw0KKwkJfQ0KKwl9IGVsc2Ugew0KKwkJaWYgKElPZGx5X291dF9yZWcgPT0gSU9kbHlfb3V0KSB7DQorCQkJUFJJTlQoT1VUX09CSiAiVHg6U0NVNDhbJTJkOiUyZF09JTAxeDotIiwgSU9kbHlfb3V0X3NoZiszLCBJT2RseV9vdXRfc2hmLCBJT2RseV9vdXQpOw0KKwkJfSANCisJCWVsc2Ugew0KKwkJCVBSSU5UKE9VVF9PQkogIlR4OlNDVTQ4WyUyZDolMmRdPSUwMXg6ICIsIElPZGx5X291dF9zaGYrMywgSU9kbHlfb3V0X3NoZiwgSU9kbHlfb3V0KTsNCisJCX0NCisJfQ0KKyNlbmRpZg0KK30gLy8gdm9pZCBQcmludElPX0xpbmVTIChCWVRFIG9wdGlvbikNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgUHJpbnRJT19MaW5lIChCWVRFIG9wdGlvbikgew0KKyAgICAgICAgICAgIA0KKyAgICBGSUxFX1ZBUg0KKyAgICANCisgICAgR0VUX09CSiggb3B0aW9uICkNCisgICAgDQorCWlmICggKCBJT2RseV9pbl9yZWcgPT0gSU9kbHlfaW4gKSAmJiAoIElPZGx5X291dF9yZWcgPT0gSU9kbHlfb3V0ICkgKSB7DQorCQlpZiAoZGx5bWFwW0lPZGx5X2ldW0lPZGx5X2pdKSBQUklOVChPVVRfT0JKICIgWCIpOw0KKwkJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlQoT1VUX09CSiAiIE8iKTsNCisJfSANCisJZWxzZSB7DQorCQlpZiAoZGx5bWFwW0lPZGx5X2ldW0lPZGx5X2pdKSBQUklOVChPVVRfT0JKICIgeCIpOw0KKwkJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlQoT1VUX09CSiAiIG8iKTsNCisJfQ0KK30gLy8gRW5kIHZvaWQgUHJpbnRJT19MaW5lIChCWVRFIG9wdGlvbikNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgUHJpbnRJT19MaW5lX0xPRyAodm9pZCkgew0KKyNpZm5kZWYgU0xUX1VCT09UICAgICAgDQorI2lmZGVmIEVuYWJsZV9PbGRfU3R5bGUNCisJaWYgKEVuYWJsZV9STUlJKSBmcHJpbnRmKGZwX2xvZywgIlxuVHg6U0NVNDhbICAgJTJkXT0lMngsICIsIElPZGx5X291dF9zaGYsIElPZGx5X291dCk7DQorCWVsc2UgICAgICAgICAgICAgZnByaW50ZihmcF9sb2csICJcblR4OlNDVTQ4WyUyZDolMmRdPSUyeCwgIiwgSU9kbHlfb3V0X3NoZiszLCBJT2RseV9vdXRfc2hmLCBJT2RseV9vdXQpOw0KKw0KKwlmcHJpbnRmKGZwX2xvZywgIlJ4OlNDVTQ4WyUyZDolMmRdPSUwMXg6ICIsIElPZGx5X2luX3NoZiszLCBJT2RseV9pbl9zaGYsIElPZGx5X2luKTsNCisNCisJaWYgKGRseW1hcFtJT2RseV9pXVtJT2RseV9qXSkgZnByaW50ZihmcF9sb2csICIgWFxuIik7DQorCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnBfbG9nLCAiIE9cbiIpOw0KKyNlbHNlDQorCWZwcmludGYoZnBfbG9nLCAiXG5SeDpTQ1U0OFslMmQ6JTJkXT0lMngsICIsIElPZGx5X2luX3NoZiszLCBJT2RseV9pbl9zaGYsIElPZGx5X2luKTsNCisNCisJaWYgKEVuYWJsZV9STUlJKSBmcHJpbnRmKGZwX2xvZywgIlR4OlNDVTQ4WyAgICUyZF09JTAxeDogIiwgSU9kbHlfb3V0X3NoZiwgSU9kbHlfb3V0KTsNCisJZWxzZSAgICAgICAgICAgICBmcHJpbnRmKGZwX2xvZywgIlR4OlNDVTQ4WyUyZDolMmRdPSUwMXg6ICIsIElPZGx5X291dF9zaGYrMywgSU9kbHlfb3V0X3NoZiwgSU9kbHlfb3V0KTsNCisNCisJaWYgKGRseW1hcFtJT2RseV9pXVtJT2RseV9qXSkgZnByaW50ZihmcF9sb2csICIgWFxuIik7DQorCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnBfbG9nLCAiIE9cbiIpOw0KKyNlbmRpZg0KKyNlbmRpZiAgICANCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisvLyBtYWluDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIENhbGN1bGF0ZV9MT09QX0NoZWNrTnVtICh2b2lkKSB7DQorICAgIA0KKyNkZWZpbmUgT05FX01CWVRFICAgIDEwNDg1NzYNCisNCisgICNpZmRlZiBDaGVja0RhdGFFdmVyeVRpbWUNCisJTE9PUF9DaGVja051bSAgID0gMTsNCisgICNlbHNlDQorCWlmIChJT1RpbWluZyB8fCBJT1RpbWluZ0J1bmQgfHwgKEdTcGVlZCA9PSBTRVRfMUdfMTAwTV8xME1CUFMpKSB7DQorCQlMT09QX0NoZWNrTnVtID0gTE9PUF9NQVg7DQorCX0gDQorCWVsc2Ugew0KKwkJc3dpdGNoICggR1NwZWVkICkgew0KKwkJCWNhc2UgU0VUXzFHQlBTICAgIDogQ2hlY2tCdWZfTUJTaXplID0gIE1PVkVfREFUQV9NQl9TRUMgICAgICA7IGJyZWFrOyAvLyAxRw0KKwkJCWNhc2UgU0VUXzEwME1CUFMgIDogQ2hlY2tCdWZfTUJTaXplID0gKE1PVkVfREFUQV9NQl9TRUMgPj4gMyk7IGJyZWFrOyAvLyAxMDBNIH4gMUcgLyA4DQorCQkJY2FzZSBTRVRfMTBNQlBTICAgOiBDaGVja0J1Zl9NQlNpemUgPSAoTU9WRV9EQVRBX01CX1NFQyA+PiA2KTsgYnJlYWs7IC8vIDEwTSAgfiAxRyAvIDY0DQorCQl9DQorCQlMT09QX0NoZWNrTnVtID0gKCBDaGVja0J1Zl9NQlNpemUgLyAoICgoREVTX05VTUJFUiAqIERNQV9QYWtTaXplKSAvIE9ORV9NQllURSApICsgMSkgKTsNCisJfQ0KKyAgI2VuZGlmDQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBUZXN0aW5nU2V0dXAgKHZvaWQpIHsNCisJI2lmZGVmICBEYmdQcm5fRnVuY0hlYWRlcg0KKwkgICAgcHJpbnRmICgiVGVzdGluZ1NldHVwXG4iKTsgDQorCSAgICBEZWJ1Z19kZWxheSgpOw0KKyAgICAjZW5kaWYNCisNCisgICNpZmRlZiBTTFRfVUJPT1QNCisgICNlbHNlDQorICAgICNpZmRlZiBSYW5kX1NlZA0KKwlzcmFuZCgodW5zaWduZWQpIFJhbmRfU2VkKTsNCisgICAgI2Vsc2UNCisJc3JhbmQoKHVuc2lnbmVkKSB0aW1lc3RhcnQpOw0KKyAgICAjZW5kaWYNCisgICNlbmRpZiAgICAgICAgICAgICAgDQorICANCisgICAgLy9bRGlzYWJsZSBWR0FdLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisgICAgI2lmZGVmIERpc2FibGVfVkdBDQorCWlmICggTE9PUF9JTkZJTkkgJiB+KEJ1cnN0RW5hYmxlIHx8IElPVGltaW5nKSApIHsNCisJCVZHQU1vZGVWbGQgPSAxOw0KKwkJb3V0cCgweDNkNCwgMHgxNyk7DQorCQlWR0FNb2RlID0gaW5wKDB4M2Q1KTsNCisJCW91dHAoMHgzZDQsIDB4MTcpOw0KKwkJb3V0cCgweDNkNSwgMCk7DQorICAgIH0NCisgICAgI2VuZGlmDQorICAgIA0KKyAgICAvL1tTZXR1cF0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKwlzZXR1cF9mcmFtZXNpemUoKTsNCisJc2V0dXBfYnVmKCk7DQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLy8gUmV0dXJuIDEgPT0+IGZhaWwNCisvLyBSZXR1cm4gMCA9PT4gUEFTUw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorY2hhciBUZXN0aW5nTG9vcCAoVUxPTkcgbG9vcF9jaGVja251bSkgew0KKyAgICBjaGFyCWNoZWNrcHJkOw0KKyAgICBjaGFyCWxvb3BsYXN0Ow0KKyAgICBjaGFyCWNoZWNrZW47DQorICAgIA0KKyAgICAjaWZkZWYgU0xUX1VCT09UDQorICAgICNlbHNlDQorICAgICAgICBjbG9ja190CXRpbWVvbGQ7DQorICAgICNlbmRpZg0KKw0KKwkjaWZkZWYgIERiZ1Bybl9GdW5jSGVhZGVyDQorCSAgICBwcmludGYgKCJUZXN0aW5nTG9vcDogJWRcbiIsIExvb3ApOyANCisJICAgIERlYnVnX2RlbGF5KCk7DQorICAgICNlbmRpZg0KKwkNCisJaWYgKCBEYmdQcm5fRHVtcE1BQ0NudCApIA0KKwkgICAgZHVtcF9tYWNfUk9yZWcoKTsNCisNCisJLy9bU2V0dXBdLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisJTG9vcCAgICAgPSAwOw0KKwljaGVja3ByZCA9IDA7DQorCWNoZWNrZW4gID0gMDsNCisJbG9vcGxhc3QgPSAwOw0KKw0KKwlzZXR1cF9kZXMoIDAgKTsNCisNCisgICAgI2lmZGVmIFNMVF9VQk9PVA0KKyAgICAjZWxzZQ0KKwl0aW1lb2xkID0gY2xvY2soKTsNCisgICAgI2VuZGlmDQorDQorCXdoaWxlICggKExvb3AgPCBMT09QX01BWCkgfHwgTE9PUF9JTkZJTkkgKSB7DQorCQlsb29wbGFzdCA9ICFMT09QX0lORklOSSAmJiAoTG9vcCA9PSBMT09QX01BWCAtIDEpOw0KKyAgICAgICAgDQorICAgICAgICAjaWZkZWYgQ2hlY2tSeEJ1Zg0KKwkJaWYgKCFCdXJzdEVuYWJsZSkgew0KKwkJCWNoZWNrcHJkID0gKChMb29wICUgbG9vcF9jaGVja251bSkgPT0gKGxvb3BfY2hlY2tudW0gLSAxKSk7DQorCQl9DQorCQljaGVja2VuID0gbG9vcGxhc3QgfCBjaGVja3ByZDsNCisgICAgICAgICNlbmRpZg0KKyAgICANCisJCWlmICggRGF0YURlbGF5ICYgKCBMb29wID09IDAgKSApIHsNCisJCQlwcmludGYgKCJQcmVzcyBhbnkga2V5IHRvIHN0YXJ0Li4uXG4iKTsNCisJCQlHRVRfQ0FIUigpOw0KKwkJfQ0KKwkJDQorI2lmZGVmICBEYmdQcm5fRnVuY0hlYWRlcg0KKyAgICAgICAgaWYgKCBEYmdQcm5fQnVmQWRyICkgew0KKyAgICAgICAgICAgIHByaW50ZiAoImZvciBzdGFydCA9PT09PT0+ICVkLyVkKCVkKSBsb29wbGFzdDolZCBjaGVja3ByZDolZCBjaGVja2VuOiVkXG4iLCBMb29wLCBMT09QX01BWCwgTE9PUF9JTkZJTkksIGxvb3BsYXN0LCBjaGVja3ByZCwgY2hlY2tlbik7IA0KKyAgICAgICAgICAgIERlYnVnX2RlbGF5KCk7DQorICAgICAgICB9DQorI2VuZGlmDQorICAgICAgICANCisJCS8vW0NoZWNrIERFU10tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKwkJaWYgKCBjaGVja19kZXMoTG9vcCwgY2hlY2tlbikgKSB7DQorCQkgICAgLy9kZXNjcmlwdG9yIGVycm9yDQorICAgICAgICAgICAgI2lmZGVmIENoZWNrUnhCdWYNCisJCQlERVNfTlVNQkVSID0gQ2hlY2tEZXNGYWlsX0Rlc051bSArIDE7DQorCQkJaWYgKCBjaGVja3ByZCApIHsNCisJCQkJY2hlY2tfYnVmKGxvb3BfY2hlY2tudW0pOw0KKwkJCX0gDQorCQkJZWxzZSB7DQorCQkJCWNoZWNrX2J1ZigoTE9PUF9NQVggJSBsb29wX2NoZWNrbnVtKSk7DQorCQkJfQ0KKwkJCURFU19OVU1CRVIgPSBERVNfTlVNQkVSX09yZzsNCisgICAgICAgICAgICAjZW5kaWYNCisNCisJCQlpZiAoRGJnUHJuX0R1bXBNQUNDbnQpIA0KKwkJCSAgICBkdW1wX21hY19ST3JlZygpOw0KKwkJCSAgICANCisJCQlyZXR1cm4oMSk7DQorCQl9DQorDQorCQkvL1tDaGVjayBCdWZdLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisJCWlmICggUnhEYXRhRW5hYmxlICYmIGNoZWNrZW4gKSB7DQorICAgICAgICAgICAgI2lmZGVmIFNMVF9VQk9PVA0KKyAgICAgICAgICAgICNlbHNlDQorICAgICAgICAgICAgdGltZXVzZWQgPSAoY2xvY2soKSAtIHRpbWVvbGQpIC8gKGRvdWJsZSkgQ0xLX1RDSzsNCisgICAgICAgICAgICAjZW5kaWYNCisJCQkNCisJCQlpZiAoIGNoZWNrcHJkICkgew0KKyAgICAgICAgICAgICAgICAjaWZkZWYgU0xUX0RPUw0KKyAgICAgICAgICAgICAgICAjZWxzZQ0KKyAgICAgICAgICAgICAgICAgICNpZmRlZiBTTFRfVUJPT1QNCisgICAgICAgICAgICAgICAgICAjZWxzZQ0KKyAgICAgICAgICAgICAgICBwcmludGYoIltydW4gbG9vcDolM2RdIEJhbmRXaWR0aDogJTcuMmYgTWJwcywgJTYuMmYgc2VjXG4iLCBsb29wX2NoZWNrbnVtLCAoKGRvdWJsZSlsb29wX2NoZWNrbnVtICogKGRvdWJsZSlERVNfTlVNQkVSICogQXZnX2ZyYW1lX2xlbiAqIDguMCkgLyAoKGRvdWJsZSl0aW1ldXNlZCAqIDEwMDAwMDAuMCksIHRpbWV1c2VkKTsNCisgICAgICAgICAgICAgICAgZnByaW50ZihmcF9sb2csICJbcnVuIGxvb3A6JTNkXSBCYW5kV2lkdGg6ICU3LjJmIE1icHMsICU2LjJmIHNlY1xuIiwgbG9vcF9jaGVja251bSwgKChkb3VibGUpbG9vcF9jaGVja251bSAqIChkb3VibGUpREVTX05VTUJFUiAqIEF2Z19mcmFtZV9sZW4gKiA4LjApIC8gKChkb3VibGUpdGltZXVzZWQgKiAxMDAwMDAwLjApLCB0aW1ldXNlZCk7DQorICAgICAgICAgICAgICAgICAgI2VuZGlmDQorICAgICAgICAgICAgICAgICNlbmRpZg0KKyAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgI2lmZGVmIENoZWNrUnhCdWYNCisgICAgICAgICAgICAgICAgaWYgKCBjaGVja19idWYoIGxvb3BfY2hlY2tudW0gKSApIA0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDEpOw0KKyAgICAgICAgICAgICAgICAjZW5kaWYNCisJCQl9IA0KKwkJCWVsc2Ugew0KKyAgICAgICAgICAgICAgICAjaWZkZWYgU0xUX0RPUw0KKyAgICAgICAgICAgICAgICAjZWxzZQ0KKyAgICAgICAgICAgICAgICAgICNpZmRlZiBTTFRfVUJPT1QNCisgICAgICAgICAgICAgICAgICAjZWxzZQ0KKyAgICAgICAgICAgICAgICBwcmludGYoIltydW4gbG9vcDolM2RdIEJhbmRXaWR0aDogJTcuMmYgTWJwcywgJTYuMmYgc2VjXG4iLCAoTE9PUF9NQVggJSBsb29wX2NoZWNrbnVtKSwgKChkb3VibGUpKExPT1BfTUFYICUgbG9vcF9jaGVja251bSkgKiAoZG91YmxlKURFU19OVU1CRVIgKiBBdmdfZnJhbWVfbGVuICogOC4wKSAvICgoZG91YmxlKXRpbWV1c2VkICogMTAwMDAwMC4wKSwgdGltZXVzZWQpOw0KKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZwX2xvZywgIltydW4gbG9vcDolM2RdIEJhbmRXaWR0aDogJTcuMmYgTWJwcywgJTYuMmYgc2VjXG4iLCAoTE9PUF9NQVggJSBsb29wX2NoZWNrbnVtKSwgKChkb3VibGUpKExPT1BfTUFYICUgbG9vcF9jaGVja251bSkgKiAoZG91YmxlKURFU19OVU1CRVIgKiBBdmdfZnJhbWVfbGVuICogOC4wKSAvICgoZG91YmxlKXRpbWV1c2VkICogMTAwMDAwMC4wKSwgdGltZXVzZWQpOw0KKyAgICAgICAgICAgICAgICAgICNlbmRpZg0KKyAgICAgICAgICAgICAgICAjZW5kaWYNCisgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICNpZmRlZiBDaGVja1J4QnVmDQorICAgICAgICAgICAgICAgIGlmICggY2hlY2tfYnVmKCAoIExPT1BfTUFYICUgbG9vcF9jaGVja251bSApICkgKSANCisgICAgICAgICAgICAgICAgICAgIHJldHVybigxKTsgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICNlbmRpZg0KKwkJCX0gLy8gRW5kIGlmICggY2hlY2twcmQgKQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgICNpZmRlZiBTZWxlY3RTaW1wbGVEZXMNCisgICAgICAgICAgICAjZWxzZQ0KKyAgICAgICAgICAgIGlmICggIWxvb3BsYXN0ICkgDQorICAgICAgICAgICAgICAgIHNldHVwX2Rlc19sb29wKCBMb29wICk7DQorICAgICAgICAgICAgI2VuZGlmDQorDQorICAgICAgICAgICAgI2lmZGVmIFNMVF9ET1MNCisgICAgICAgICAgICAjZWxzZQ0KKyAgICAgICAgICAgICAgI2lmZGVmIFNMVF9VQk9PVA0KKyAgICAgICAgICAgICAgI2Vsc2UNCisgICAgICAgIAl0aW1lb2xkID0gY2xvY2soKTsNCisgICAgICAgICAgICAgICNlbmRpZg0KKyAgICAgICAgICAgICNlbmRpZg0KKw0KKwkJfSAvLyBFbmQgaWYgKCBSeERhdGFFbmFibGUgJiYgY2hlY2tlbiApDQorCQkNCisgICAgICAgICNpZmRlZiBTZWxlY3RTaW1wbGVEZXMNCisJCWlmICggIWxvb3BsYXN0ICkgDQorCQkgICAgc2V0dXBfZGVzX2xvb3AoIExvb3AgKTsNCisgICAgICAgICNlbmRpZg0KKyAgICAgICAgDQorCQlpZiAoIExPT1BfSU5GSU5JICkgew0KKwkJCSAgICBwcmludGYoIj09PT09PT09PT09PT09PT4gTG9vcDogJWQgIFxyIiwgTG9vcCk7DQorCQl9IA0KKwkJZWxzZSBpZiAoVGVzdE1vZGUgPT0gMCkgew0KKwkJCWlmICghKERiZ1Bybl9CdWZBZHIgfHwgSU9UaW1pbmdCdW5kKSkgDQorCQkJICAgIHByaW50ZigiICVkICAgICAgICAgICAgICAgICAgICAgICAgXHIiLCBMb29wKTsNCisvLwkJCXN3aXRjaCAoTG9vcCAlIDQpIHsNCisvLwkJCQljYXNlIDB4MDA6IHByaW50ZigifCAlZCAgICAgICAgICAgICAgICAgICAgICAgIFxyIiwgTG9vcCk7IGJyZWFrOw0KKy8vCQkJCWNhc2UgMHgwMTogcHJpbnRmKCIvICVkICAgICAgICAgICAgICAgICAgICAgICAgXHIiLCBMb29wKTsgYnJlYWs7DQorLy8JCQkJY2FzZSAweDAyOiBwcmludGYoIi0gJWQgICAgICAgICAgICAgICAgICAgICAgICBcciIsIExvb3ApOyBicmVhazsNCisvLwkJCQlkZWZhdWx0ICA6IHByaW50ZigiXCAlZCAgICAgICAgICAgICAgICAgICAgICAgIFxyIiwgTG9vcCk7IGJyZWFrOw0KKy8vCQkJfQ0KKwkJfQ0KKw0KKyAgICAgICAgaWYgKCBEYmdQcm5fQnVmQWRyICkgew0KKyAgICAgICAgICAgIHByaW50ZiAoImZvciBlbmQgICA9PT09PT0+ICVkLyVkKCVkKVxuIiwgTG9vcCwgTE9PUF9NQVgsIExPT1BfSU5GSU5JKTsgDQorICAgICAgICAgICAgRGVidWdfZGVsYXkoKTsNCisgICAgICAgIH0NCisNCisJCUxvb3ArKzsNCisJfSAgLy8gRW5kIHdoaWxlICgoTG9vcCA8IExPT1BfTUFYKSB8fCBMT09QX0lORklOSSkNCisJDQorCUxvb3BfcmxbR1NwZWVkX2lkeF0gPSBMb29wOw0KKwkNCisJcmV0dXJuKDApOw0KK30gLy8gRW5kIGNoYXIgVGVzdGluZ0xvb3AgKFVMT05HIGxvb3BfY2hlY2tudW0pDQorDQorDQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvTWFrZWZpbGUgYi9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzg3NDVlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvTWFrZWZpbGUKQEAgLTAsMCArMSw1MyBAQAorIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChTT0MpLmEKKworQ09CSlMJPSB0aW1lci5vCitDT0JKUwkrPSByZXNldC5vCitDT0JKUwkrPSBtYWN0ZXN0Lm8KK0NPQkpTCSs9IERSQU1fU1BJLm8KK0NPQkpTCSs9IElPLm8KK0NPQkpTCSs9IExJQi5vCitDT0JKUwkrPSBNQUMubworQ09CSlMJKz0gTkNTSS5vCitDT0JKUwkrPSBQQ0lfU1BJLm8KK0NPQkpTCSs9IFBIWS5vCitDT0JKUwkrPSBTUElNLm8KK0NPQkpTCSs9IFNURFVCT09ULm8KK0NPQkpTCSs9IFBMTFRFU1RVLm8KK0NPQkpTCSs9IFRSQVBURVNULm8KK0NPQkpTCSs9IFNUUkVTUy5vCisKK1NSQ1MJOj0gJChTVEFSVDoubz0uUykgJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpICQoU09CSlMpKQorU1RBUlQJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU1RBUlQpKQorCithbGw6CSQob2JqKS5kZXBlbmQgJChMSUIpCisKKyQoTElCKToJJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvTkNTSS5IIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvTkNTSS5ICm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZTQ0OGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9OQ1NJLkgKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2lmbmRlZiBOQ1NJX0gKKyNkZWZpbmUgTkNTSV9ICisKKyNpbmNsdWRlICJUWVBFREVGLkgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWZpbmUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIE1BWF9QQUNLQUdFX05VTSAgICAgICAgICAgICAgICAgICAgICAgICA4ICAgICAgLy8gMSB+IDgKKyNkZWZpbmUgTUFYX0NIQU5ORUxfTlVNICAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgICAvLyAxIH4gMzIKKy8vI2RlZmluZSBFbmFibGVfTkNTSV9MT09QX0lORklOSSAgICAgICAgICAgICAvL1tvZmZdCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGdW5jdGlvbgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgU0VOVF9SRVRSWV9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE5DU0lfUnhERVNOdW0gICAgICAgICAgICAgICAgICAgICAgICAgNTAKKworLy8jZGVmaW5lIE5DU0lfU2tpcF9QaGFzZTFfRGVTZWxlY3RQYWNrYWdlCisvLyNkZWZpbmUgTkNTSV9Ta2lwX0RlU2VsZWN0UGFja2FnZQorLy8jZGVmaW5lIE5DU0lfU2tpcF9EaVNDaGFubmVsCisvLyNkZWZpbmUgTkNTSV9FbmFibGVEZWxheV9EZVNlbGVjdFBhY2thZ2UKKy8vI2RlZmluZSBOQ1NJX0VuYWJsZURlbGF5X0dldExpbmtTdGF0dXMKKy8vI2RlZmluZSBOQ1NJX0VuYWJsZURlbGF5X0VhY2hQYWNrYWdlCisvLyNkZWZpbmUgUHJpbnRfVmVyc2lvbl9JRAorLy8jZGVmaW5lIFByaW50X1BhY2thZ2VOYW1lCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQQ0kgRElEL1ZJRCAmIE1hbnVmYWN0dXJlciBJRAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgTWFudWZhY3R1cmVySURfSW50ZWwgICAgICAgICAgICAgICAgICAweDAwMDAwMTU3ICAgICAvLzM0MworI2RlZmluZSBNYW51ZmFjdHVyZXJJRF9Ccm9hZGNvbSAgICAgICAgICAgICAgIDB4MDAwMDExM2QgICAgIC8vNDQxMworI2RlZmluZSBNYW51ZmFjdHVyZXJJRF9NZWxsYW5veCAgICAgICAgICAgICAgIDB4MDAwMDAyYzkgICAgIC8vNzEzCisKKy8vUENJIFZJRDogWzE2M2NdaW50ZWwKKy8vUENJIFZJRDogWzgwODZdSW50ZWwgQ29ycG9yYXRpb24KKy8vUENJIFZJRDogWzgwODddSW50ZWwKKy8vUENJIFZJRDogWzE0ZTRdQnJvYWRjb20gQ29ycG9yYXRpb24KKy8vUENJIFZJRDogWzE1YjNdTWVsbGFub3gKKyNkZWZpbmUgUENJX0RJRF9WSURfSW50ZWxfODI1NzRMICAgICAgICAgICAgICAweDEwZDM4MDg2ICAgICAvLyBJbnRlbFIgODI1NzRMIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlcgorI2RlZmluZSBQQ0lfRElEX1ZJRF9JbnRlbF84MjU3NV8xMGQ2ICAgICAgICAgIDB4MTBkNjgwODYgICAgIC8vIDgyNTY2IERNLTItZ2lnYWJ5dGUKKyNkZWZpbmUgUENJX0RJRF9WSURfSW50ZWxfODI1NzVfMTBhNyAgICAgICAgICAweDEwYTc4MDg2ICAgICAvLyA4MjU3NUVCIEdpZ2FiaXQgTmV0d29yayBDb25uZWN0aW9uCisjZGVmaW5lIFBDSV9ESURfVklEX0ludGVsXzgyNTc1XzEwYTkgICAgICAgICAgMHgxMGE5ODA4NiAgICAgLy8gODI1NzVFQiBHaWdhYml0IE5ldHdvcmsgQ29ubmVjdGlvbgorI2RlZmluZSBQQ0lfRElEX1ZJRF9JbnRlbF84MjU3Nl8xMGM5ICAgICAgICAgIDB4MTBjOTgwODYgICAgIC8vKjgyNTc2IEdpZ2FiaXQgRVQgRHVhbCBQb3J0IFNlcnZlciBBZGFwdGVyCisjZGVmaW5lIFBDSV9ESURfVklEX0ludGVsXzgyNTc2XzEwZTYgICAgICAgICAgMHgxMGU2ODA4NiAgICAgLy8gODI1NzYgR2lnYWJpdCBOZXR3b3JrIENvbm5lY3Rpb24KKyNkZWZpbmUgUENJX0RJRF9WSURfSW50ZWxfODI1NzZfMTBlNyAgICAgICAgICAweDEwZTc4MDg2ICAgICAvLyA4MjU3NiBHaWdhYml0IE5ldHdvcmsgQ29ubmVjdGlvbgorI2RlZmluZSBQQ0lfRElEX1ZJRF9JbnRlbF84MjU3Nl8xMGU4ICAgICAgICAgIDB4MTBlODgwODYgICAgIC8vIEU2NDc1MC14eHggSW50ZWwgR2lnYWJpdCBFVCBRdWFkIFBvcnQgU2VydmVyIEFkYXB0ZXIKKyNkZWZpbmUgUENJX0RJRF9WSURfSW50ZWxfODI1NzZfMTUxOCAgICAgICAgICAweDE1MTg4MDg2ICAgICAvLyA4MjU3Nk5TIFNlckRlcyBHaWdhYml0IE5ldHdvcmsgQ29ubmVjdGlvCisjZGVmaW5lIFBDSV9ESURfVklEX0ludGVsXzgyNTc2XzE1MjYgICAgICAgICAgMHgxNTI2ODA4NiAgICAgLy8gSW50ZWwgR2lnYWJpdCBFVDIgUXVhZCBQb3J0IFNlcnZlciBBZGFwdGVyCisjZGVmaW5lIFBDSV9ESURfVklEX0ludGVsXzgyNTc2XzE1MGEgICAgICAgICAgMHgxNTBhODA4NiAgICAgLy8gODI1NzZOUyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIKKyNkZWZpbmUgUENJX0RJRF9WSURfSW50ZWxfODI1NzZfMTUwZCAgICAgICAgICAweDE1MGQ4MDg2ICAgICAvLyA4MjU3NiBHaWdhYml0IEJhY2twbGFuZSBDb25uZWN0aW9uCisjZGVmaW5lIFBDSV9ESURfVklEX0ludGVsXzgyNTk5XzEwZmIgICAgICAgICAgMHgxMGZiODA4NiAgICAgLy8gMTAgR2IgRXRoZXJuZXQgY29udHJvbGxlcgorI2RlZmluZSBQQ0lfRElEX1ZJRF9JbnRlbF84MjU5OV8xNTU3ICAgICAgICAgIDB4MTU1NzgwODYgICAgIC8vCisjZGVmaW5lIFBDSV9ESURfVklEX0ludGVsX0kzNTBfMTUyMSAgICAgICAgICAgMHgxNTIxODA4NiAgICAgLy8KKyNkZWZpbmUgUENJX0RJRF9WSURfSW50ZWxfSTM1MF8xNTIzICAgICAgICAgICAweDE1MjM4MDg2ICAgICAvLworI2RlZmluZSBQQ0lfRElEX1ZJRF9JbnRlbF9JMjEwICAgICAgICAgICAgICAgIDB4MTUzMzgwODYgICAgIC8vCisjZGVmaW5lIFBDSV9ESURfVklEX0ludGVsX1g1NDAgICAgICAgICAgICAgICAgMHgxNTI4ODA4NiAgICAgLy8KKyNkZWZpbmUgUENJX0RJRF9WSURfQnJvYWRjb21fQkNNNTcxOCAgICAgICAgICAweDE2NTYxNGU0ICAgICAvLworI2RlZmluZSBQQ0lfRElEX1ZJRF9Ccm9hZGNvbV9CQ001NzIwICAgICAgICAgIDB4MTY1ZjE0ZTQgICAgIC8vCisjZGVmaW5lIFBDSV9ESURfVklEX0Jyb2FkY29tX0JDTTU3MjUgICAgICAgICAgMHgxNjQzMTRlNCAgICAgLy8KKyNkZWZpbmUgUENJX0RJRF9WSURfTWVsbGFub3hfQ29ubmVjdFhfMyAgICAgICAweDEwMDMxNWIzICAgICAvLyoKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlbGF5IChtcykKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIERlbGF5X0VhY2hQYWNrYWdlICAgICAgICAgICAgICAgICAgICAgMTAwMAorI2RlZmluZSBEZWxheV9EZVNlbGVjdFBhY2thZ2UgICAgICAgICAgICAgICAgIDUwCisjZGVmaW5lIERlbGF5X0dldExpbmtTdGF0dXMgICAgICAgICAgICAgICAgICAgNTAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5DU0kgUGFyYW1ldGVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy9Db21tYW5kIGFuZCBSZXNwb25zZSBUeXBlCisjZGVmaW5lIENMRUFSX0lOSVRJQUxfU1RBVEUgICAgICAgICAgICAgICAgICAgMHgwMCAgICAgICAgICAgLy9NCisjZGVmaW5lIFNFTEVDVF9QQUNLQUdFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSAgICAgICAgICAgLy9NCisjZGVmaW5lIERFU0VMRUNUX1BBQ0tBR0UgICAgICAgICAgICAgICAgICAgICAgMHgwMiAgICAgICAgICAgLy9NCisjZGVmaW5lIEVOQUJMRV9DSEFOTkVMICAgICAgICAgICAgICAgICAgICAgICAgMHgwMyAgICAgICAgICAgLy9NCisjZGVmaW5lIERJU0FCTEVfQ0hBTk5FTCAgICAgICAgICAgICAgICAgICAgICAgMHgwNCAgICAgICAgICAgLy9NCisjZGVmaW5lIFJFU0VUX0NIQU5ORUwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNSAgICAgICAgICAgLy9NCisjZGVmaW5lIEVOQUJMRV9DSEFOTkVMX05FVFdPUktfVFggICAgICAgICAgICAgMHgwNiAgICAgICAgICAgLy9NCisjZGVmaW5lIERJU0FCTEVfQ0hBTk5FTF9ORVRXT1JLX1RYICAgICAgICAgICAgMHgwNyAgICAgICAgICAgLy9NCisjZGVmaW5lIEFFTl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBTRVRfTElOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkgICAgICAgICAgIC8vTQorI2RlZmluZSBHRVRfTElOS19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgIDB4MEEgICAgICAgICAgIC8vTQorI2RlZmluZSBTRVRfVkxBTl9GSUxURVIgICAgICAgICAgICAgICAgICAgICAgIDB4MEIgICAgICAgICAgIC8vTQorI2RlZmluZSBFTkFCTEVfVkxBTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEMgICAgICAgICAgIC8vTQorI2RlZmluZSBESVNBQkxFX1ZMQU4gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQgICAgICAgICAgIC8vTQorI2RlZmluZSBTRVRfTUFDX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgIDB4MEUgICAgICAgICAgIC8vTQorI2RlZmluZSBFTkFCTEVfQlJPQURDQVNUX0ZJTFRFUklORyAgICAgICAgICAgIDB4MTAgICAgICAgICAgIC8vTQorI2RlZmluZSBESVNBQkxFX0JST0FEQ0FTVF9GSUxURVJJTkcgICAgICAgICAgIDB4MTEgICAgICAgICAgIC8vTQorI2RlZmluZSBFTkFCTEVfR0xPQkFMX01VTFRJQ0FTVF9GSUxURVJJTkcgICAgIDB4MTIKKyNkZWZpbmUgRElTQUJMRV9HTE9CQUxfTVVMVElDQVNUX0ZJTFRFUklORyAgICAweDEzCisjZGVmaW5lIFNFVF9OQ1NJX0ZMT1dfQ09OVFJPTCAgICAgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBHRVRfVkVSU0lPTl9JRCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUgICAgICAgICAgIC8vTQorI2RlZmluZSBHRVRfQ0FQQUJJTElUSUVTICAgICAgICAgICAgICAgICAgICAgIDB4MTYgICAgICAgICAgIC8vTQorI2RlZmluZSBHRVRfUEFSQU1FVEVSUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MTcgICAgICAgICAgIC8vTQorI2RlZmluZSBHRVRfQ09OVFJPTExFUl9QQUNLRVRfU1RBVElTVElDUyAgICAgIDB4MTgKKyNkZWZpbmUgR0VUX05DU0lfU1RBVElTVElDUyAgICAgICAgICAgICAgICAgICAweDE5CisjZGVmaW5lIEdFVF9OQ1NJX1BBU1NfVEhST1VHSF9TVEFUSVNUSUNTICAgICAgMHgxQQorCisvL1N0YW5kYXJkIFJlc3BvbnNlIENvZGUKKyNkZWZpbmUgQ09NTUFORF9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIENPTU1BTkRfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBDT01NQU5EX1VOQVZBSUxBQkxFICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQ09NTUFORF9VTlNVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAweDAzCisKKy8vU3RhbmRhcmQgUmVhc29uIENvZGUKKyNkZWZpbmUgTk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgSU5URVJGQUNFX0lOSVRJQUxJWkFUSU9OX1JFUVVJUkVEICAgICAweDAwMDEKKyNkZWZpbmUgUEFSQU1FVEVSX0lTX0lOVkFMSUQgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgQ0hBTk5FTF9OT1RfUkVBRFkgICAgICAgICAgICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgUEFDS0FHRV9OT1RfUkVBRFkgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgSU5WQUxJRF9QQVlMT0FEX0xFTkdUSCAgICAgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgVU5LTk9XTl9DT01NQU5EX1RZUEUgICAgICAgICAgICAgICAgICAweDdGRkYKKworLy9TRVRfTUFDX0FERFJFU1MKKyNkZWZpbmUgVU5JQ0FTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIDB4MDAgPDwgNSApCisjZGVmaW5lIE1VTFRJQ0FTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAweDAxIDw8IDUgKQorI2RlZmluZSBESVNBQkxFX01BQ19BRERSRVNTX0ZJTFRFUiAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgRU5BQkxFX01BQ19BRERSRVNTX0ZJTFRFUiAgICAgICAgICAgICAweDAxCisKKy8vR0VUX0xJTktfU1RBVFVTCisjZGVmaW5lIExJTktfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBMSU5LX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBOQ1NJX1J4RE1BX1Bha1NpemUgICAgICAgICAgICAgICAgICAgIDIwNDgKKyNkZWZpbmUgTkNTSV9SeERNQV9CQVNFICAgICAgICAgICAgICAgICAgICAgICAoRE1BX0JBU0UrMHgwMDEwMDAwMCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZhcmlhYmxlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy9OQy1TSSBDb21tYW5kIFBhY2tldAordHlwZWRlZiBzdHJ1Y3QgeworLy9FdGhlcm5ldCBIZWFkZXIKKyAgICB1bnNpZ25lZCBjaGFyICBEQVs2XTsgICAgICAgICAgICAgICAgICAgIC8vIERlc3RpbmF0aW9uIEFkZHJlc3MKKyAgICB1bnNpZ25lZCBjaGFyICBTQVs2XTsgICAgICAgICAgICAgICAgICAgIC8vIFNvdXJjZSBBZGRyZXNzCisgICAgdW5zaWduZWQgc2hvcnQgRXRoZXJUeXBlOyAgICAgICAgICAgICAgICAvLyBETVRGIE5DLVNJLCBpdCBzaG91bGQgYmUgMHg4OEY4CisvL05DLVNJIENvbnRyb2wgUGFja2V0CisgICAgdW5zaWduZWQgY2hhciAgTUNfSUQ7ICAgICAgICAgICAgICAgICAgICAvLyBNYW5hZ2VtZW50IENvbnRyb2xsZXIgc2hvdWxkIHNldCB0aGlzIGZpZWxkIHRvIDB4MDAKKyAgICB1bnNpZ25lZCBjaGFyICBIZWFkZXJfUmV2aXNpb247ICAgICAgICAgIC8vIEZvciBOQy1TSSAxLjAgc3BlYywgdGhpcyBmaWVsZCBoYXMgdG8gc2V0IDB4MDEKKyAgICB1bnNpZ25lZCBjaGFyICBSZXNlcnZlZF8xOyAgICAgICAgICAgICAgIC8vIFJlc2VydmVkIGhhcyB0byBzZXQgdG8gMHgwMAorICAgIHVuc2lnbmVkIGNoYXIgIElJRDsgICAgICAgICAgICAgICAgICAgICAgLy8gSW5zdGFuY2UgSUQKKyAgICB1bnNpZ25lZCBjaGFyICBDb21tYW5kOworICAgIHVuc2lnbmVkIGNoYXIgIENoYW5uZWxfSUQ7CisgICAgdW5zaWduZWQgc2hvcnQgUGF5bG9hZF9MZW5ndGg7ICAgICAgICAgICAvLyBQYXlsb2FkIExlbmd0aCA9IDEyIGJpdHMsIDQgYml0cyBhcmUgcmVzZXJ2ZWQKKyAgICB1bnNpZ25lZCBsb25nICBSZXNlcnZlZF8yOworICAgIHVuc2lnbmVkIGxvbmcgIFJlc2VydmVkXzM7CisKKyAgICB1bnNpZ25lZCBzaG9ydCAgUmVzZXJ2ZWRfNDsKKyAgICB1bnNpZ25lZCBzaG9ydCAgUmVzZXJ2ZWRfNTsKKyAgICB1bnNpZ25lZCBzaG9ydCAgUmVzcG9uc2VfQ29kZTsKKyAgICB1bnNpZ25lZCBzaG9ydCAgUmVhc29uX0NvZGU7CisgICAgdW5zaWduZWQgY2hhciAgIFBheWxvYWRfRGF0YVs2NF07Cit9ICBOQ1NJX0NvbW1hbmRfUGFja2V0OworCisvL05DLVNJIFJlc3BvbnNlIFBhY2tldAordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGNoYXIgIERBWzZdOworICAgIHVuc2lnbmVkIGNoYXIgIFNBWzZdOworICAgIHVuc2lnbmVkIHNob3J0IEV0aGVyVHlwZTsgICAgICAgICAgICAgICAgLy9ETVRGIE5DLVNJCisvL05DLVNJIENvbnRyb2wgUGFja2V0CisgICAgdW5zaWduZWQgY2hhciAgTUNfSUQ7ICAgICAgICAgICAgICAgICAgICAvL01hbmFnZW1lbnQgQ29udHJvbGxlciBzaG91bGQgc2V0IHRoaXMgZmllbGQgdG8gMHgwMAorICAgIHVuc2lnbmVkIGNoYXIgIEhlYWRlcl9SZXZpc2lvbjsgICAgICAgICAgLy9Gb3IgTkMtU0kgMS4wIHNwZWMsIHRoaXMgZmllbGQgaGFzIHRvIHNldCAweDAxCisgICAgdW5zaWduZWQgY2hhciAgUmVzZXJ2ZWRfMTsgICAgICAgICAgICAgICAvL1Jlc2VydmVkIGhhcyB0byBzZXQgdG8gMHgwMAorICAgIHVuc2lnbmVkIGNoYXIgIElJRDsgICAgICAgICAgICAgICAgICAgICAgLy9JbnN0YW5jZSBJRAorICAgIHVuc2lnbmVkIGNoYXIgIENvbW1hbmQ7CisgICAgdW5zaWduZWQgY2hhciAgQ2hhbm5lbF9JRDsKKyAgICB1bnNpZ25lZCBzaG9ydCBQYXlsb2FkX0xlbmd0aDsgICAgICAgICAgIC8vUGF5bG9hZCBMZW5ndGggPSAxMiBiaXRzLCA0IGJpdHMgYXJlIHJlc2VydmVkCisgICAgdW5zaWduZWQgc2hvcnQgIFJlc2VydmVkXzI7CisgICAgdW5zaWduZWQgc2hvcnQgIFJlc2VydmVkXzM7CisgICAgdW5zaWduZWQgc2hvcnQgIFJlc2VydmVkXzQ7CisgICAgdW5zaWduZWQgc2hvcnQgIFJlc2VydmVkXzU7CisKKyAgICB1bnNpZ25lZCBzaG9ydCAgUmVzcG9uc2VfQ29kZTsKKyAgICB1bnNpZ25lZCBzaG9ydCAgUmVhc29uX0NvZGU7CisgICAgdW5zaWduZWQgY2hhciAgIFBheWxvYWRfRGF0YVs2NF07Cit9ICBOQ1NJX1Jlc3BvbnNlX1BhY2tldDsKKworI2VuZGlmIC8vIE5DU0lfSApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvTkNTSS5jIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvTkNTSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZTA2YzMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9OQ1NJLmMKQEAgLTAsMCArMSw5MzQgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2RlZmluZSBOQ1NJX0MKK3N0YXRpYyBjb25zdCBjaGFyIFRoaXNGaWxlW10gPSAiTkNTSS5jIjsKKworI2luY2x1ZGUgIlNXRlVOQy5IIgorCisjaWZkZWYgU0xUX1VCT09UCisgICNpbmNsdWRlIDxjb21tb24uaD4KKyAgI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyAgI2luY2x1ZGUgPENPTU1JTkYuSD4KKyAgI2luY2x1ZGUgPE5DU0kuSD4KKyAgI2luY2x1ZGUgPElPLkg+CisjZW5kaWYKKyNpZmRlZiBTTFRfRE9TCisgICNpbmNsdWRlIDxzdGRpby5oPgorICAjaW5jbHVkZSA8c3RkbGliLmg+CisgICNpbmNsdWRlIDxjb25pby5oPgorICAjaW5jbHVkZSA8c3RyaW5nLmg+CisgICNpbmNsdWRlICJDT01NSU5GLkgiCisgICNpbmNsdWRlICJOQ1NJLkgiCisgICNpbmNsdWRlICJJTy5IIgorI2VuZGlmCisKK05DU0lfQ29tbWFuZF9QYWNrZXQgICAgIE5DU0lfUmVxdWVzdF9TTFQ7CitOQ1NJX1Jlc3BvbnNlX1BhY2tldCAgICBOQ1NJX1Jlc3BvbmRfU0xUOworaW50ICAgICAgICAgICAgIEluc3RhbmNlSUQ7CitpbnQgICAgICAgICAgICAgTkNTSV9SeFRpbWVPdXRTY2FsZTsKK1VMT05HICAgICAgICAgICBOQ1NJX1J4RGVzQmFzZTsKK1VMT05HICAgICAgICAgICBOQ1NJX1R4RFdCVUZbNTEyXTsKK1VMT05HICAgICAgICAgICBOQ1NJX1J4RFdCVUZbNTEyXTsKK2NoYXIgICAgICAgICAgICBOQ1NJX0NvbW1hbmRTdHJbNTEyXTsKK3Vuc2lnbmVkIGNoYXIgICAqTkNTSV9UeEJ5dGVCVUY7Cit1bnNpZ25lZCBjaGFyICAgKk5DU0lfUnhCeXRlQlVGOwordW5zaWduZWQgY2hhciAgIE5DU0lfUGF5bG9hZF9EYXRhWzE2XTsKK3Vuc2lnbmVkIGxvbmcgICBQYXlsb2FkX0NoZWNrc3VtX05DU0kgPSAweDAwMDAwMDAwOworVUxPTkcgICAgICAgICAgIHNlbGVjdF9mbGFnW01BWF9QQUNLQUdFX05VTV07CisKK1VMT05HIERXU3dhcF9TTFQgKFVMT05HIGluKSB7CisJcmV0dXJuKCAoKGluICYgMHhmZjAwMDAwMCkgPj4gMjQpCisJICAgICAgfCAoKGluICYgMHgwMGZmMDAwMCkgPj4gIDgpCisJICAgICAgfCAoKGluICYgMHgwMDAwZmYwMCkgPDwgIDgpCisJICAgICAgfCAoKGluICYgMHgwMDAwMDBmZikgPDwgMjQpCisJICAgICAgKTsKK30KK1VTSE9SVCBXRFN3YXBfU0xUIChVU0hPUlQgaW4pIHsKKwlyZXR1cm4oICgoaW4gJiAweGZmMDApID4+ICA4KQorCSAgICAgIHwgKChpbiAmIDB4MDBmZikgPDwgIDgpCisJICAgICAgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBGaW5kRXJyX05DU0kgKGludCB2YWx1ZSkgeworCU5DU0lfTGlua0ZhaWxfVmFsID0gTkNTSV9MaW5rRmFpbF9WYWwgfCB2YWx1ZTsKKwlFcnJfRmxhZyAgICAgICAgICA9IEVycl9GbGFnIHwgRXJyX05DU0lfTGlua0ZhaWw7CisJaWYgKCBEYmdQcm5fRXJyRmxnICkgCisJICAgIHByaW50ZiAoIlxuRXJyX0ZsYWc6IFslMDhseF0gTkNTSV9MaW5rRmFpbF9WYWw6IFslMDhseF1cbiIsIEVycl9GbGFnLCBOQ1NJX0xpbmtGYWlsX1ZhbCk7CisKKwlyZXR1cm4oMSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQSFkgSUMoTkMtU0kpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBuY3NpX3Jlc3BkdW1wICggTkNTSV9SZXNwb25zZV9QYWNrZXQgKmluICkgeworICAgIHByaW50ZiAoIkRBICAgICAgICAgICAgIDogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIGluLT5EQVs1XSwgaW4tPkRBWzRdLCBpbi0+REFbM10sIGluLT5EQVsyXSwgaW4tPkRBWzFdLCBpbi0+REFbMF0pOworICAgIHByaW50ZiAoIlNBICAgICAgICAgICAgIDogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIGluLT5TQVs1XSwgaW4tPlNBWzRdLCBpbi0+U0FbM10sIGluLT5TQVsyXSwgaW4tPlNBWzFdLCBpbi0+U0FbMF0pOworICAgIHByaW50ZiAoIkV0aGVyVHlwZSAgICAgIDogJTA0eFxuIiwgaW4tPkV0aGVyVHlwZSAgICAgICApOy8vRE1URiBOQy1TSQorICAgIHByaW50ZiAoIk1DX0lEICAgICAgICAgIDogJTAyeFxuIiwgaW4tPk1DX0lEICAgICAgICAgICApOy8vTWFuYWdlbWVudCBDb250cm9sbGVyIHNob3VsZCBzZXQgdGhpcyBmaWVsZCB0byAweDAwCisgICAgcHJpbnRmICgiSGVhZGVyX1JldmlzaW9uOiAlMDJ4XG4iLCBpbi0+SGVhZGVyX1JldmlzaW9uICk7Ly9Gb3IgTkMtU0kgMS4wIHNwZWMsIHRoaXMgZmllbGQgaGFzIHRvIHNldCAweDAxCisvLyAgcHJpbnRmICgiUmVzZXJ2ZWRfMSAgICAgOiAlMDJ4XG4iLCBpbi0+UmVzZXJ2ZWRfMSAgICAgICk7IC8vUmVzZXJ2ZWQgaGFzIHRvIHNldCB0byAweDAwCisgICAgcHJpbnRmICgiSUlEICAgICAgICAgICAgOiAlMDJ4XG4iLCBpbi0+SUlEICAgICAgICAgICAgICk7Ly9JbnN0YW5jZSBJRAorICAgIHByaW50ZiAoIkNvbW1hbmQgICAgICAgIDogJTAyeFxuIiwgaW4tPkNvbW1hbmQgICAgICAgICApOworICAgIHByaW50ZiAoIkNoYW5uZWxfSUQgICAgIDogJTAyeFxuIiwgaW4tPkNoYW5uZWxfSUQgICAgICApOworICAgIHByaW50ZiAoIlBheWxvYWRfTGVuZ3RoIDogJTA0eFxuIiwgaW4tPlBheWxvYWRfTGVuZ3RoICApOy8vUGF5bG9hZCBMZW5ndGggPSAxMiBiaXRzLCA0IGJpdHMgYXJlIHJlc2VydmVkCisvLyAgcHJpbnRmICgiUmVzZXJ2ZWRfMiAgICAgOiAlMDR4XG4iLCBpbi0+UmVzZXJ2ZWRfMiAgICAgICk7CisvLyAgcHJpbnRmICgiUmVzZXJ2ZWRfMyAgICAgOiAlMDR4XG4iLCBpbi0+UmVzZXJ2ZWRfMyAgICAgICk7CisvLyAgcHJpbnRmICgiUmVzZXJ2ZWRfNCAgICAgOiAlMDR4XG4iLCBpbi0+UmVzZXJ2ZWRfNCAgICAgICk7CisvLyAgcHJpbnRmICgiUmVzZXJ2ZWRfNSAgICAgOiAlMDR4XG4iLCBpbi0+UmVzZXJ2ZWRfNSAgICAgICk7CisgICAgcHJpbnRmICgiUmVzcG9uc2VfQ29kZSAgOiAlMDR4XG4iLCBpbi0+UmVzcG9uc2VfQ29kZSAgICk7CisgICAgcHJpbnRmICgiUmVhc29uX0NvZGUgICAgOiAlMDR4XG4iLCBpbi0+UmVhc29uX0NvZGUgICAgICk7CisgICAgcHJpbnRmICgiUGF5bG9hZF9EYXRhICAgOiAlMDJ4JTAyeCUwMnglMDJ4XG4iLCBpbi0+UGF5bG9hZF9EYXRhWyAzXSwgaW4tPlBheWxvYWRfRGF0YVsgMl0sIGluLT5QYXlsb2FkX0RhdGFbIDFdLCBpbi0+UGF5bG9hZF9EYXRhWyAwXSk7CisvLyAgcHJpbnRmICgiUGF5bG9hZF9EYXRhICAgOiAlMDJ4JTAyeCUwMnglMDJ4XG4iLCBpbi0+UGF5bG9hZF9EYXRhWyA3XSwgaW4tPlBheWxvYWRfRGF0YVsgNl0sIGluLT5QYXlsb2FkX0RhdGFbIDVdLCBpbi0+UGF5bG9hZF9EYXRhWyA0XSk7CisvLyAgcHJpbnRmICgiUGF5bG9hZF9EYXRhICAgOiAlMDJ4JTAyeCUwMnglMDJ4XG4iLCBpbi0+UGF5bG9hZF9EYXRhWzExXSwgaW4tPlBheWxvYWRfRGF0YVsxMF0sIGluLT5QYXlsb2FkX0RhdGFbIDldLCBpbi0+UGF5bG9hZF9EYXRhWyA4XSk7CisvLyAgcHJpbnRmICgiUGF5bG9hZF9EYXRhICAgOiAlMDJ4JTAyeCUwMnglMDJ4XG4iLCBpbi0+UGF5bG9hZF9EYXRhWzE1XSwgaW4tPlBheWxvYWRfRGF0YVsxNF0sIGluLT5QYXlsb2FkX0RhdGFbMTNdLCBpbi0+UGF5bG9hZF9EYXRhWzEyXSk7CisvLyAgcHJpbnRmICgiUGF5bG9hZF9EYXRhICAgOiAlMDJ4JTAyeCUwMnglMDJ4XG4iLCBpbi0+UGF5bG9hZF9EYXRhWzE5XSwgaW4tPlBheWxvYWRfRGF0YVsxOF0sIGluLT5QYXlsb2FkX0RhdGFbMTddLCBpbi0+UGF5bG9hZF9EYXRhWzE2XSk7CisvLyAgcHJpbnRmICgiUGF5bG9hZF9EYXRhICAgOiAlMDJ4JTAyeCUwMnglMDJ4XG4iLCBpbi0+UGF5bG9hZF9EYXRhWzIzXSwgaW4tPlBheWxvYWRfRGF0YVsyMl0sIGluLT5QYXlsb2FkX0RhdGFbMjFdLCBpbi0+UGF5bG9hZF9EYXRhWzIwXSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIE5DU0lfU3RydWN0X0luaXRpYWxpemVfU0xUICh2b2lkKSB7CisgICAgaW50IGk7CisKKyAgICBVTE9ORyAgICBOQ1NJX1J4RGF0QmFzZTsKKworICAgIEluc3RhbmNlSUQgPSAwOworICAgIE5DU0lfUnhUaW1lT3V0U2NhbGUgPSAxOworCisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICBOQ1NJX1JlcXVlc3RfU0xULkRBW2ldID0gMHhGRjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisvLyAgICAgIE5DU0lfUmVxdWVzdC5TQVtpXSA9IGk8PDI7CisgICAgICAgIE5DU0lfUmVxdWVzdF9TTFQuU0FbaV0gPSBTQVtpXTsKKyAgICB9CisKKyAgICBOQ1NJX1JlcXVlc3RfU0xULkV0aGVyVHlwZSAgICAgICA9IFdEU3dhcF9TTFQoMHg4OEY4KTsgLy8gRXRoZXJUeXBlID0gMHg4OEY4IChETVRGIE5DLVNJKSBwYWdlIDUwLCB0YWJsZSA4LCBOQy1TSSBzcGVjLiB2ZXJzaW9uIDEuMC4wCisgICAgTkNTSV9SZXF1ZXN0X1NMVC5NQ19JRCAgICAgICAgICAgPSAwOworICAgIE5DU0lfUmVxdWVzdF9TTFQuSGVhZGVyX1JldmlzaW9uID0gMHgwMTsKKyAgICBOQ1NJX1JlcXVlc3RfU0xULlJlc2VydmVkXzEgICAgICA9IDA7CisgICAgTkNTSV9SZXF1ZXN0X1NMVC5SZXNlcnZlZF8yICAgICAgPSAwOworICAgIE5DU0lfUmVxdWVzdF9TTFQuUmVzZXJ2ZWRfMyAgICAgID0gMDsKKworICAgIE5DU0lfVHhCeXRlQlVGID0gKHVuc2lnbmVkIGNoYXIgKikgJk5DU0lfVHhEV0JVRlswXTsKKyAgICBOQ1NJX1J4Qnl0ZUJVRiA9ICh1bnNpZ25lZCBjaGFyICopICZOQ1NJX1J4RFdCVUZbMF07CisKKyAgICBOQ1NJX1J4RGVzQmFzZSA9IEhfUkRFU19CQVNFOworICAgIE5DU0lfUnhEYXRCYXNlID0gTkNTSV9SeERNQV9CQVNFOworICAgIAorICAgIGZvciAoaSA9IDA7IGkgPCBOQ1NJX1J4REVTTnVtIC0gMTsgaSsrKSB7CisgICAgICAgIFdyaXRlU09DX0REKCAoIE5DU0lfUnhEZXNCYXNlICsgIDAgKSwgMHgwMDAwMDAwMCAgICAgKTsKKyAgICAgICAgV3JpdGVTT0NfREQoICggTkNTSV9SeERlc0Jhc2UgKyAgNCApLCAweDAwMDAwMDAwICAgICApOworICAgICAgICBXcml0ZVNPQ19ERCggKCBOQ1NJX1J4RGVzQmFzZSArICA4ICksIDB4MDAwMDAwMDAgICAgICk7CisgICAgICAgIFdyaXRlU09DX0REKCAoIE5DU0lfUnhEZXNCYXNlICsgMHgwQyApLCAoTkNTSV9SeERhdEJhc2UgKyBDUFVfQlVTX0FERFJfU0RSQU1fT0ZGU0VUKSApOyAvLyAyMDEzMDczMAorICAgICAgICBOQ1NJX1J4RGVzQmFzZSArPSAxNjsKKyAgICAgICAgTkNTSV9SeERhdEJhc2UgKz0gTkNTSV9SeERNQV9QYWtTaXplOworICAgIH0KKyAgICBXcml0ZVNPQ19ERCggKCBOQ1NJX1J4RGVzQmFzZSArICAwICksIEVPUl9JbmlWYWwgICAgICk7CisgICAgV3JpdGVTT0NfREQoICggTkNTSV9SeERlc0Jhc2UgKyAgNCApLCAweDAwMDAwMDAwICAgICApOworICAgIFdyaXRlU09DX0REKCAoIE5DU0lfUnhEZXNCYXNlICsgIDggKSwgMHgwMDAwMDAwMCAgICAgKTsKKyAgICBXcml0ZVNPQ19ERCggKCBOQ1NJX1J4RGVzQmFzZSArIDB4MEMgKSwgKE5DU0lfUnhEYXRCYXNlICsgQ1BVX0JVU19BRERSX1NEUkFNX09GRlNFVCkgKTsgLy8gMjAxMzA3MzAKKworICAgIE5DU0lfUnhEZXNCYXNlID0gSF9SREVTX0JBU0U7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIENhbGN1bGF0ZV9DaGVja3N1bV9OQ1NJICh1bnNpZ25lZCBjaGFyICpidWZmZXJfYmFzZSwgaW50IExlbmd0aCkgeworICAgIFVMT05HCUNoZWNrU3VtID0gMDsgICAKKyAgICBVTE9ORwlEYXRhOworICAgIFVMT05HCURhdGExOworICAgIGludCAgICAgaTsKKyAgICAKKyAgICAvLyBDYWxjdWxhdGUgY2hlY2tzdW0gaXMgZnJvbSBieXRlIDE0IG9mIGV0aGVybmV0IEhhZWRlciBhbmQgQ29udHJvbCBwYWNrZXQgaGVhZGVyCisgICAgLy8gUGFnZSA1MCwgTkMtU0kgc3BlYy4gdmVyLiAxLjAuMCBmb3JtIERNVEYKKyAgICBmb3IgKGkgPSAxNDsgaSA8IExlbmd0aDsgaSArPSAyICkgeworICAgICAgICBEYXRhICAgICAgPSBidWZmZXJfYmFzZVtpXTsKKyAgICAgICAgRGF0YTEgICAgID0gYnVmZmVyX2Jhc2VbaSArIDFdOworICAgICAgICBDaGVja1N1bSArPSAoKERhdGEgPDwgOCkgKyBEYXRhMSk7CisgICAgfQorICAgIFBheWxvYWRfQ2hlY2tzdW1fTkNTSSA9IERXU3dhcF9TTFQofihDaGVja1N1bSkgKyAxKTsgLy8yJ3MgY29tcGxlbWVudAorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcmV0dXJuIDA6IGl0IGlzIFBBU1MKKy8vIHJldHVybiAxOiBpdCBpcyBGQUlMCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2hhciBOQ1NJX1J4X1NMVCAodW5zaWduZWQgY2hhciBjb21tYW5kKSB7CisgICAgCisjZGVmaW5lIE5DU0lfUlhfUkVUUllfVElNRSAgMiAgICAKKyAgICBpbnQgICAgIHRpbWVvdXQgPSAwOworICAgIGludAkgICAgYnl0ZXNpemU7CisgICAgaW50CSAgICBkd3NpemU7CisgICAgaW50ICAgICBpOworICAgIGludCAgICAgcmV0cnkgICA9IDA7CisgICAgY2hhciAgICByZXQgICAgID0gMTsKKworICAgIFVMT05HICAgTkNTSV9SeERhdEJhc2U7CisgICAgVUxPTkcgICBOQ1NJX1J4RGVzRGF0OworICAgIFVMT05HICAgTkNTSV9SeERhdGE7CisKKyAgICAKKyAgICBkbyB7CisgICAgICAgIFdyaXRlU09DX0REKCAoIEhfTUFDX0JBU0UgKyAweDFDICksIDB4MDAwMDAwMDAgKTsvL1J4IFBvbGwKKyAgICAgICAgCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIE5DU0lfUnhEZXNEYXQgPSBSZWFkU09DX0REKE5DU0lfUnhEZXNCYXNlKTsKKyAgICAgICAgICAgIGlmICggKyt0aW1lb3V0ID4gVElNRV9PVVRfTkNTSSAqIE5DU0lfUnhUaW1lT3V0U2NhbGUgKSB7CisgICAgICAgICAgICAgICAgI2lmZGVmIFNMVF9ET1MKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZwX2xvZywgIltDbWQ6JTAyWF1bTkNTSS1SeERlc093bl0gJTA4bFggXG4iLCBjb21tYW5kLCBOQ1NJX1J4RGVzRGF0ICk7CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgcmV0dXJuKCBGaW5kRXJyKEVycl9OQ1NJX0NoZWNrX1J4T3duVGltZU91dCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSggSFdPd25SeChOQ1NJX1J4RGVzRGF0KSApOworICAgICAgICAKKyAgICAgICAgI2lmZGVmIENoZWNrUnhFcnIKKyAgICAgICAgaWYgKE5DU0lfUnhEZXNEYXQgJiAweDAwMDQwMDAwKSB7CisgICAgICAgICAgICAjaWZkZWYgU0xUX0RPUworICAgICAgICAgICAgZnByaW50ZihmcF9sb2csICJbUnhEZXNdIEVycm9yIFJ4RXJyICAgICAgICAlMDhseFxuIiwgTkNTSV9SeERlc0RhdCk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIEZpbmRFcnJfRGVzKENoZWNrX0Rlc19SeEVycik7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgICAgIAorICAgICAgICAjaWZkZWYgQ2hlY2tPZGROaWJibGUKKyAgICAgICAgaWYgKE5DU0lfUnhEZXNEYXQgJiAweDAwNDAwMDAwKSB7CisgICAgICAgICAgICAjaWZkZWYgU0xUX0RPUworICAgICAgICAgICAgZnByaW50ZihmcF9sb2csICJbUnhEZXNdIE9kZCBOaWJibGUgICAgICAgICAlMDhseFxuIiwgTkNTSV9SeERlc0RhdCk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIEZpbmRFcnJfRGVzKENoZWNrX0Rlc19PZGROaWJibGUpOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICAgICAKKyAgICAgICAgI2lmZGVmIENoZWNrQ1JDCisgICAgICAgIGlmIChOQ1NJX1J4RGVzRGF0ICYgMHgwMDA4MDAwMCkgeworICAgICAgICAgICAgI2lmZGVmIFNMVF9ET1MKKyAgICAgICAgICAgIGZwcmludGYoZnBfbG9nLCAiW1J4RGVzXSBFcnJvciBDUkMgICAgICAgICAgJTA4bHhcbiIsIE5DU0lfUnhEZXNEYXQpOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICBGaW5kRXJyX0RlcyhDaGVja19EZXNfQ1JDKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKyAgICAgICAgCisgICAgICAgICNpZmRlZiBDaGVja1J4RklGT0Z1bGwKKyAgICAgICAgaWYgKE5DU0lfUnhEZXNEYXQgJiAweDAwODAwMDAwKSB7CisgICAgICAgICAgICAjaWZkZWYgU0xUX0RPUworICAgICAgICAgICAgZnByaW50ZihmcF9sb2csICJbUnhEZXNdIEVycm9yIFJ4IEZJRk8gRnVsbCAlMDhseFxuIiwgTkNTSV9SeERlc0RhdCk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIEZpbmRFcnJfRGVzKENoZWNrX0Rlc19SeEZJRk9GdWxsKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKyAgICAgICAgCisgICAgICAgIC8vIEdldCBwb2ludCBvZiBSWCBETUEgYnVmZmVyCisgICAgICAgIE5DU0lfUnhEYXRCYXNlID0gUmVhZFNPQ19ERCggTkNTSV9SeERlc0Jhc2UgKyAweDBDICk7CisgICAgICAgIE5DU0lfUnhEYXRhICAgID0gUmVhZFNPQ19ERCggTkNTSV9SeERhdEJhc2UgKyAweDBDICk7CisgICAgICAgIAorICAgICAgICBpZiAoIEhXRU9SKCBOQ1NJX1J4RGVzRGF0ICkgKSB7CisgICAgICAgICAgICAvLyBpdCBpcyBsYXN0IHRoZSBkZXNjcmlwdG9yIGluIHRoZSByZWNlaXZlIFJpbmcKKyAgICAgICAgICAgIFdyaXRlU09DX0REKCBOQ1NJX1J4RGVzQmFzZSAgICAgLCBFT1JfSW5pVmFsICAgICk7CisgICAgICAgICAgICBOQ1NJX1J4RGVzQmFzZSAgPSBIX1JERVNfQkFTRTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBXcml0ZVNPQ19ERCggTkNTSV9SeERlc0Jhc2UgICAgICwgMHgwMDAwMDAwMCAgICApOworICAgICAgICAgICAgTkNTSV9SeERlc0Jhc2UgKz0gMTY7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEdldCBSWCB2YWxpZCBkYXRhIGluIG9mZnNldCAwMGggb2YgUlhEUyMwCisgICAgICAgIGJ5dGVzaXplICA9IChOQ1NJX1J4RGVzRGF0ICYgMHgzZmZmKTsKKyAgICAgICAgCisgICAgICAgIC8vIEZpbGwgdXAgdG8gbXVsdGlwbGUgb2YgNAorICAgICAgICBpZiAoICggYnl0ZXNpemUgJSA0ICkgIT0gMCApCisgICAgICAgICAgICBkd3NpemUgPSAoIGJ5dGVzaXplID4+IDIgKSArIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGR3c2l6ZSA9IGJ5dGVzaXplID4+IDI7CisgICAgICAgIAorICAgICAgICAjaWZkZWYgU0xUX0RPUworICAgICAgICBpZiAoIFByaW50TkNTSUVuICkgCisgICAgICAgICAgICBmcHJpbnRmKGZwX2xvZyAsIltSeF0gJWQgYnl0ZXMoJXhoKVxuIiwgYnl0ZXNpemUsIGJ5dGVzaXplKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHdzaXplOyBpKyspIHsKKyAgICAgICAgICAgIE5DU0lfUnhEV0JVRltpXSA9IFJlYWRTT0NfREQoTkNTSV9SeERhdEJhc2UgKyAoIGkgPDwgMiApKTsKKyAgICAgICAgICAgIGlmICggUHJpbnROQ1NJRW4gKSB7CisgICAgICAgICAgICAgICAgaWYgKCBpID09ICggZHdzaXplIC0gMSApICkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGJ5dGVzaXplICUgNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwICA6IE5DU0lfUnhEV0JVRltpXSA9IE5DU0lfUnhEV0JVRltpXSAmIDB4ZmZmZmZmZmY7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzICA6IE5DU0lfUnhEV0JVRltpXSA9IE5DU0lfUnhEV0JVRltpXSAmIDB4ZmZmZmZmICA7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyICA6IE5DU0lfUnhEV0JVRltpXSA9IE5DU0lfUnhEV0JVRltpXSAmIDB4ZmZmZiAgICA7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxICA6IE5DU0lfUnhEV0JVRltpXSA9IE5DU0lfUnhEV0JVRltpXSAmIDB4ZmYgICAgICA7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICNpZmRlZiBTTFRfRE9TCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYnl0ZXNpemUgJSA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDAgIDogZnByaW50ZihmcF9sb2cgLCJbUnglMDJkXSUwOGx4ICUwOGx4XG4iLCAgICAgICAgICAgICBpLCBOQ1NJX1J4RFdCVUZbaV0sIERXU3dhcF9TTFQoTkNTSV9SeERXQlVGW2ldKSAgICAgICApOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMyAgOiBmcHJpbnRmKGZwX2xvZyAsIltSeCUwMmRdLS0lMDZseCAlMDZseC0tXG4iLCAgICAgICAgIGksIE5DU0lfUnhEV0JVRltpXSwgRFdTd2FwX1NMVChOQ1NJX1J4RFdCVUZbaV0pID4+ICA4ICk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyICA6IGZwcmludGYoZnBfbG9nICwiW1J4JTAyZF0tLS0tJTA0bHggJTA0bHgtLS0tXG4iLCAgICAgaSwgTkNTSV9SeERXQlVGW2ldLCBEV1N3YXBfU0xUKE5DU0lfUnhEV0JVRltpXSkgPj4gMTYgKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgIDogZnByaW50ZihmcF9sb2cgLCJbUnglMDJkXS0tLS0tLSUwMmx4ICUwMmx4LS0tLS0tXG4iLCBpLCBOQ1NJX1J4RFdCVUZbaV0sIERXU3dhcF9TTFQoTkNTSV9SeERXQlVGW2ldKSA+PiAyNCApOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOiBmcHJpbnRmKGZwX2xvZyAsIltSeCUwMmRdZXJyb3IiLCBpKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFNMVF9ET1MKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcF9sb2cgLCJbUnglMDJkXSUwOGx4ICUwOGx4XG4iLCBpLCBOQ1NJX1J4RFdCVUZbaV0sIERXU3dhcF9TTFQoTkNTSV9SeERXQlVGW2ldKSk7CisgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvLyBFbmQgZm9yIChpID0gMDsgaSA8IGR3c2l6ZTsgaSsrKQorICAgICAgICAKKyAgICAgICAgLy8gRXRoZXJUeXBlIGZpZWxkIG9mIHRoZSByZXNwb25zZSBwYWNrZXQgc2hvdWxkIGJlIDB4ODhGOCAKKyAgICAgICAgaWYgKChOQ1NJX1J4RGF0YSAmIDB4ZmZmZikgPT0gMHhmODg4KSB7CisgICAgICAgICAgICBtZW1jcHkgKCZOQ1NJX1Jlc3BvbmRfU0xULCBOQ1NJX1J4Qnl0ZUJVRiwgYnl0ZXNpemUpOworICAgICAgICAgICAgCisgICAgICAgICAgICAjaWZkZWYgU0xUX0RPUworICAgICAgICAgICAgaWYgKCBQcmludE5DU0lFbiApIAorICAgICAgICAgICAgICAgIGZwcmludGYoZnBfbG9nICwiW1J4IElJRDolMmRdXG4iLCBOQ1NJX1Jlc3BvbmRfU0xULklJRCk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIAorICAgICAgICAgICAgTkNTSV9SZXNwb25kX1NMVC5FdGhlclR5cGUgICAgICA9IFdEU3dhcF9TTFQoIE5DU0lfUmVzcG9uZF9TTFQuRXRoZXJUeXBlICAgICAgKTsKKyAgICAgICAgICAgIE5DU0lfUmVzcG9uZF9TTFQuUGF5bG9hZF9MZW5ndGggPSBXRFN3YXBfU0xUKCBOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfTGVuZ3RoICk7CisgICAgICAgICAgICBOQ1NJX1Jlc3BvbmRfU0xULlJlc3BvbnNlX0NvZGUgID0gV0RTd2FwX1NMVCggTkNTSV9SZXNwb25kX1NMVC5SZXNwb25zZV9Db2RlICApOworICAgICAgICAgICAgTkNTSV9SZXNwb25kX1NMVC5SZWFzb25fQ29kZSAgICA9IFdEU3dhcF9TTFQoIE5DU0lfUmVzcG9uZF9TTFQuUmVhc29uX0NvZGUgICAgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IAorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICNpZmRlZiBTTFRfRE9TCisgICAgICAgICAgICBpZiAoIFByaW50TkNTSUVuICkgCisgICAgICAgICAgICAgICAgZnByaW50ZihmcF9sb2csICJbU2tpcF0gTm90IE5DU0kgUmVzcG9uc2U6ICUwOGx4XG4iLCBOQ1NJX1J4RGF0YSk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHJ5Kys7CisgICAgICAgIH0KKyAgICB9IHdoaWxlICggcmV0cnkgPCBOQ1NJX1JYX1JFVFJZX1RJTUUgKTsKKworICAgIHJldHVybiggcmV0ICk7Cit9IC8vIEVuZCBjaGFyIE5DU0lfUnhfU0xUICh2b2lkKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2hhciBOQ1NJX1R4ICh2b2lkKSB7CisgICAgaW50CSAgIGJ5dGVzaXplOworICAgIGludAkgICBkd3NpemU7CisgICAgaW50ICAgIGk7CisgICAgaW50ICAgIHRpbWVvdXQgPSAwOworICAgIFVMT05HICBOQ1NJX1R4RGVzRGF0OworICAgIAorICAgIC8vIEhlYWRlciBvZiBOQy1TSSBjb21tYW5kIGZvcm1hdCBpcyAzNCBieXRlcy4gcGFnZSA1OCwgTkMtU0kgc3BlYy4gdmVyIDEuMC4wIGZyb20gRE1URgorICAgIC8vIFRoZSBtaW5pbXVtIHNpemUgb2YgYSBOQy1TSSBwYWNrYWdlIGlzIDY0IGJ5dGVzLgorICAgIGJ5dGVzaXplID0gMzQgKyBXRFN3YXBfU0xUKE5DU0lfUmVxdWVzdF9TTFQuUGF5bG9hZF9MZW5ndGgpOworICAgIGlmICggYnl0ZXNpemUgPCA2NCApIHsKKyAgICAgICAgbWVtc2V0IChOQ1NJX1R4Qnl0ZUJVRiArIGJ5dGVzaXplLCAwLCA2MCAtIGJ5dGVzaXplKTsKKyAgICAgICAgYnl0ZXNpemUgPSA2NDsKKyAgICB9CisgICAgCisgICAgLy8gRmlsbCB1cCB0byBtdWx0aXBsZSBvZiA0CisvLyAgICBkd3NpemUgPSAoYnl0ZXNpemUgKyAzKSA+PiAyOworICAgIGlmICggKCBieXRlc2l6ZSAlIDQgKSAhPSAwICkKKyAgICAgICAgZHdzaXplID0gKCBieXRlc2l6ZSA+PiAyICkgKyAxOworICAgIGVsc2UKKyAgICAgICAgZHdzaXplID0gYnl0ZXNpemUgPj4gMjsKKyAgICAKKyAgICAjaWZkZWYgU0xUX0RPUworICAgIGlmICggUHJpbnROQ1NJRW4gKSAKKyAgICAgICAgZnByaW50ZihmcF9sb2cgLCJbVHggSUlEOiUyZF0gJWQgYnl0ZXMoJXhoKVxuIiwgTkNTSV9SZXF1ZXN0X1NMVC5JSUQsIGJ5dGVzaXplLCBieXRlc2l6ZSk7CisgICAgI2VuZGlmCisgICAgCisgICAgLy8gQ29weSBkYXRhIHRvIERNQSBidWZmZXIKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHdzaXplOyBpKyspIHsKKyAgICAgICAgV3JpdGVTT0NfREQoIERNQV9CQVNFICsgKGkgPDwgMiksIE5DU0lfVHhEV0JVRltpXSApOworICAgICAgICBpZiAoIFByaW50TkNTSUVuICkgeworICAgICAgICAgICAgaWYgKGkgPT0gKGR3c2l6ZSAtIDEpKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChieXRlc2l6ZSAlIDQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwICA6IE5DU0lfVHhEV0JVRltpXSA9IE5DU0lfVHhEV0JVRltpXSAmIDB4ZmZmZmZmZmY7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDMgIDogTkNTSV9UeERXQlVGW2ldID0gTkNTSV9UeERXQlVGW2ldICYgMHgwMGZmZmZmZjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMiAgOiBOQ1NJX1R4RFdCVUZbaV0gPSBOQ1NJX1R4RFdCVUZbaV0gJiAweDAwMDBmZmZmOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxICA6IE5DU0lfVHhEV0JVRltpXSA9IE5DU0lfVHhEV0JVRltpXSAmIDB4MDAwMDAwZmY7IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjaWZkZWYgU0xUX0RPUworICAgICAgICAgICAgICAgIHN3aXRjaCAoYnl0ZXNpemUgJSA0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMCAgOiBmcHJpbnRmKGZwX2xvZyAsIltUeCUwMmRdJTA4eCAlMDh4XG4iLCAgICAgICAgICAgICBpLCBOQ1NJX1R4RFdCVUZbaV0sIERXU3dhcF9TTFQoIE5DU0lfVHhEV0JVRltpXSkgICAgICAgKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMyAgOiBmcHJpbnRmKGZwX2xvZyAsIltUeCUwMmRdLS0lMDZ4ICUwNngtLVxuIiwgICAgICAgICBpLCBOQ1NJX1R4RFdCVUZbaV0sIERXU3dhcF9TTFQoIE5DU0lfVHhEV0JVRltpXSkgPj4gIDggKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMiAgOiBmcHJpbnRmKGZwX2xvZyAsIltUeCUwMmRdLS0tLSUwNHggJTA0eC0tLS1cbiIsICAgICBpLCBOQ1NJX1R4RFdCVUZbaV0sIERXU3dhcF9TTFQoIE5DU0lfVHhEV0JVRltpXSkgPj4gMTYgKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMSAgOiBmcHJpbnRmKGZwX2xvZyAsIltUeCUwMmRdLS0tLS0tJTAyeCAlMDJ4LS0tLS0tXG4iLCBpLCBOQ1NJX1R4RFdCVUZbaV0sIERXU3dhcF9TTFQoIE5DU0lfVHhEV0JVRltpXSkgPj4gMjQgKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOiBmcHJpbnRmKGZwX2xvZyAsIltUeCUwMmRdZXJyb3IiLCBpKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICNpZmRlZiBTTFRfRE9TCisgICAgICAgICAgICAgICAgZnByaW50ZiggZnBfbG9nICwgIltUeCUwMmRdJTA4eCAlMDh4XG4iLCBpLCBOQ1NJX1R4RFdCVUZbaV0sIERXU3dhcF9TTFQoTkNTSV9UeERXQlVGW2ldKSApOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAvLyBFbmQgZm9yIChpID0gMDsgaSA8IGR3c2l6ZTsgaSsrKQorICAgIAorICAgIC8vIFNldHRpbmcgb25lIFRYIGRlc2NyaXB0b3IKKyAgICBXcml0ZVNPQ19ERCggSF9UREVTX0JBU0UgKyAweDA0LCAwICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICBXcml0ZVNPQ19ERCggSF9UREVTX0JBU0UgKyAweDA4LCAwICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICBXcml0ZVNPQ19ERCggSF9UREVTX0JBU0UgKyAweDBDLCAoRE1BX0JBU0UgKyBDUFVfQlVTX0FERFJfU0RSQU1fT0ZGU0VUKSAgKTsgLy8gMjAxMzA3MzAKKyAgICBXcml0ZVNPQ19ERCggSF9UREVTX0JBU0UgICAgICAgLCAweGYwMDA4MDAwICsgYnl0ZXNpemUgKTsKKyAgICAvLyBGaXJlICAgICAgICAgICAgIAorICAgIFdyaXRlU09DX0REKCBIX01BQ19CQVNFICArIDB4MTgsIDB4MDAwMDAwMDAgICAgICAgICAgICApOy8vVHggUG9sbAorCisgICAgZG8geworICAgICAgICBOQ1NJX1R4RGVzRGF0ID0gUmVhZFNPQ19ERChIX1RERVNfQkFTRSk7CisgICAgICAgIGlmICggKyt0aW1lb3V0ID4gVElNRV9PVVRfTkNTSSApIHsKKyAgICAgICAgICAgICNpZmRlZiBTTFRfRE9TCisgICAgICAgICAgICBmcHJpbnRmKGZwX2xvZywgIltOQ1NJLVR4RGVzT3duXSAlMDhseFxuIiwgTkNTSV9UeERlc0RhdCk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuKEZpbmRFcnIoRXJyX05DU0lfQ2hlY2tfVHhPd25UaW1lT3V0KSk7CisgICAgICAgIH0KKyAgICB9IHdoaWxlICggSFdPd25UeChOQ1NJX1R4RGVzRGF0KSApOworICAgIAorICAgIHJldHVybigwKTsKK30gLy8gRW5kIGNoYXIgTkNTSV9UeCAodm9pZCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2NoYXIgTkNTSV9BUlAgKHZvaWQpIHsKKyAgICBpbnQgICAgaTsKKyAgICBpbnQgICAgdGltZW91dCA9IDA7CisgICAgVUxPTkcgIE5DU0lfVHhEZXNEYXQ7CisgICAgCisgICAgaWYgKCBBUlBOdW1DbnQgKSB7CisgICAgICAgICNpZmRlZiBTTFRfRE9TCisgICAgICAgIGlmICggUHJpbnROQ1NJRW4gKSAKKyAgICAgICAgICAgIGZwcmludGYoZnBfbG9nICwiW0FSUF0gNjAgYnl0ZXMgeCVkXG4iLCBBUlBOdW1DbnQpOworICAgICAgICAjZW5kaWYKKyAgICAgICAgCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKSB7CisgICAgICAgICAgICAjaWZkZWYgU0xUX0RPUworICAgICAgICAgICAgaWYgKCBQcmludE5DU0lFbiApIAorICAgICAgICAgICAgICAgIGZwcmludGYoZnBfbG9nICwiW1R4JTAyZF0gJTA4eCAlMDh4XG4iLCBpLCBBUlBfZGF0YVtpXSwgRFdTd2FwX1NMVChBUlBfZGF0YVtpXSkpOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICBXcml0ZVNPQ19ERCggRE1BX0JBU0UgKyAoIGkgPDwgMiApLCBBUlBfZGF0YVtpXSApOworICAgICAgICB9CisgICAgICAgIFdyaXRlU09DX0REKCBIX1RERVNfQkFTRSArIDB4MDQsIDAgICAgICAgICAgICAgICApOworICAgICAgICBXcml0ZVNPQ19ERCggSF9UREVTX0JBU0UgKyAweDA4LCAwICAgICAgICAgICAgICAgKTsKKyAgICAgICAgV3JpdGVTT0NfREQoIEhfVERFU19CQVNFICsgMHgwQywgKERNQV9CQVNFICsgQ1BVX0JVU19BRERSX1NEUkFNX09GRlNFVCkgICk7IC8vIDIwMTMwNzMwCisgICAgICAgIFdyaXRlU09DX0REKCBIX1RERVNfQkFTRSAgICAgICAsIDB4ZjAwMDgwMDAgKyA2MCApOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBUlBOdW1DbnQ7IGkrKykgeworICAgICAgICAgICAgV3JpdGVTT0NfREQoIEhfVERFU19CQVNFICAgICAgLCAweGYwMDA4MDAwICsgNjApOworCisgICAgICAgICAgICBXcml0ZVNPQ19ERCggSF9NQUNfQkFTRSArIDB4MTgsIDB4MDAwMDAwMDAgICAgICApOy8vVHggUG9sbAorCisgICAgICAgICAgICB0aW1lb3V0ID0gMDsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBOQ1NJX1R4RGVzRGF0ID0gUmVhZFNPQ19ERChIX1RERVNfQkFTRSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCsrdGltZW91dCA+IFRJTUVfT1VUX05DU0kpIHsKKyAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFNMVF9ET1MKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcF9sb2csICJbQVJQLVR4RGVzT3duXSAlMDhseFxuIiwgTkNTSV9UeERlc0RhdCk7CisgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEZpbmRFcnIoRXJyX05DU0lfQ2hlY2tfQVJQT3duVGltZU91dCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKEhXT3duVHgoTkNTSV9UeERlc0RhdCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybigwKTsKK30gLy8gRW5kIGNoYXIgTkNTSV9BUlAgKHZvaWQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIFdyUmVxdWVzdCAodW5zaWduZWQgY2hhciBjb21tYW5kLCB1bnNpZ25lZCBjaGFyIGlkLCB1bnNpZ25lZCBzaG9ydCBsZW5ndGgpIHsKKworICAgIE5DU0lfUmVxdWVzdF9TTFQuSUlEICAgICAgICAgICAgPSBJbnN0YW5jZUlEOworICAgIE5DU0lfUmVxdWVzdF9TTFQuQ29tbWFuZCAgICAgICAgPSBjb21tYW5kOworICAgIE5DU0lfUmVxdWVzdF9TTFQuQ2hhbm5lbF9JRCAgICAgPSBpZDsKKyAgICBOQ1NJX1JlcXVlc3RfU0xULlBheWxvYWRfTGVuZ3RoID0gV0RTd2FwX1NMVChsZW5ndGgpOworCisgICAgbWVtY3B5ICggTkNTSV9UeEJ5dGVCVUYgICAgICAgICAgICAgICAsICZOQ1NJX1JlcXVlc3RfU0xUICAgICwgMzAgICAgKTsKKyAgICBtZW1jcHkgKChOQ1NJX1R4Qnl0ZUJVRiArIDMwICAgICAgICAgKSwgJk5DU0lfUGF5bG9hZF9EYXRhICAgICwgbGVuZ3RoKTsKKyAgICBDYWxjdWxhdGVfQ2hlY2tzdW1fTkNTSShOQ1NJX1R4Qnl0ZUJVRiwgMzAgKyBsZW5ndGgpOworICAgIG1lbWNweSAoKE5DU0lfVHhCeXRlQlVGICsgMzAgKyBsZW5ndGgpLCAmUGF5bG9hZF9DaGVja3N1bV9OQ1NJLCA0ICAgICApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBOQ1NJX1ByaW50Q29tbWFuZFN0ciAodW5zaWduZWQgY2hhciBjb21tYW5kLCB1bnNpZ25lZCBpaWQpIHsKKyAgICBzd2l0Y2ggKGNvbW1hbmQgJiAweDgwKSB7CisgICAgICAgIGNhc2UgMHg4MCAgIDogc3ByaW50ZihOQ1NJX0NvbW1hbmRTdHIsICJJSUQ6JTNkIFslMDJ4XVtSZXNwb25kXSIsIGlpZCwgY29tbWFuZCk7IGJyZWFrOworICAgICAgICBkZWZhdWx0ICAgICA6IHNwcmludGYoTkNTSV9Db21tYW5kU3RyLCAiSUlEOiUzZCBbJTAyeF1bUmVxdWVzdF0iLCBpaWQsIGNvbW1hbmQpOyBicmVhazsKKyAgICB9CisgICAgc3dpdGNoIChjb21tYW5kICYgMHg3ZikgeworICAgICAgICBjYXNlIDB4MDAgICA6IHNwcmludGYoTkNTSV9Db21tYW5kU3RyLCAiJXNbQ0xFQVJfSU5JVElBTF9TVEFURSAgICAgICAgICAgICAgICBdIiwgTkNTSV9Db21tYW5kU3RyKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwMSAgIDogc3ByaW50ZihOQ1NJX0NvbW1hbmRTdHIsICIlc1tTRUxFQ1RfUEFDS0FHRSAgICAgICAgICAgICAgICAgICAgIF0iLCBOQ1NJX0NvbW1hbmRTdHIpOyBicmVhazsKKyAgICAgICAgY2FzZSAweDAyICAgOiBzcHJpbnRmKE5DU0lfQ29tbWFuZFN0ciwgIiVzW0RFU0VMRUNUX1BBQ0tBR0UgICAgICAgICAgICAgICAgICAgXSIsIE5DU0lfQ29tbWFuZFN0cik7IGJyZWFrOworICAgICAgICBjYXNlIDB4MDMgICA6IHNwcmludGYoTkNTSV9Db21tYW5kU3RyLCAiJXNbRU5BQkxFX0NIQU5ORUwgICAgICAgICAgICAgICAgICAgICBdIiwgTkNTSV9Db21tYW5kU3RyKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNCAgIDogc3ByaW50ZihOQ1NJX0NvbW1hbmRTdHIsICIlc1tESVNBQkxFX0NIQU5ORUwgICAgICAgICAgICAgICAgICAgIF0iLCBOQ1NJX0NvbW1hbmRTdHIpOyBicmVhazsKKyAgICAgICAgY2FzZSAweDA1ICAgOiBzcHJpbnRmKE5DU0lfQ29tbWFuZFN0ciwgIiVzW1JFU0VUX0NIQU5ORUwgICAgICAgICAgICAgICAgICAgICAgXSIsIE5DU0lfQ29tbWFuZFN0cik7IGJyZWFrOworICAgICAgICBjYXNlIDB4MDYgICA6IHNwcmludGYoTkNTSV9Db21tYW5kU3RyLCAiJXNbRU5BQkxFX0NIQU5ORUxfTkVUV09SS19UWCAgICAgICAgICBdIiwgTkNTSV9Db21tYW5kU3RyKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNyAgIDogc3ByaW50ZihOQ1NJX0NvbW1hbmRTdHIsICIlc1tESVNBQkxFX0NIQU5ORUxfTkVUV09SS19UWCAgICAgICAgIF0iLCBOQ1NJX0NvbW1hbmRTdHIpOyBicmVhazsKKyAgICAgICAgY2FzZSAweDA4ICAgOiBzcHJpbnRmKE5DU0lfQ29tbWFuZFN0ciwgIiVzW0FFTl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgXSIsIE5DU0lfQ29tbWFuZFN0cik7IGJyZWFrOworICAgICAgICBjYXNlIDB4MDkgICA6IHNwcmludGYoTkNTSV9Db21tYW5kU3RyLCAiJXNbU0VUX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgICBdIiwgTkNTSV9Db21tYW5kU3RyKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwQSAgIDogc3ByaW50ZihOQ1NJX0NvbW1hbmRTdHIsICIlc1tHRVRfTElOS19TVEFUVVMgICAgICAgICAgICAgICAgICAgIF0iLCBOQ1NJX0NvbW1hbmRTdHIpOyBicmVhazsKKyAgICAgICAgY2FzZSAweDBCICAgOiBzcHJpbnRmKE5DU0lfQ29tbWFuZFN0ciwgIiVzW1NFVF9WTEFOX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgXSIsIE5DU0lfQ29tbWFuZFN0cik7IGJyZWFrOworICAgICAgICBjYXNlIDB4MEMgICA6IHNwcmludGYoTkNTSV9Db21tYW5kU3RyLCAiJXNbRU5BQkxFX1ZMQU4gICAgICAgICAgICAgICAgICAgICAgICBdIiwgTkNTSV9Db21tYW5kU3RyKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwRCAgIDogc3ByaW50ZihOQ1NJX0NvbW1hbmRTdHIsICIlc1tESVNBQkxFX1ZMQU4gICAgICAgICAgICAgICAgICAgICAgIF0iLCBOQ1NJX0NvbW1hbmRTdHIpOyBicmVhazsKKyAgICAgICAgY2FzZSAweDBFICAgOiBzcHJpbnRmKE5DU0lfQ29tbWFuZFN0ciwgIiVzW1NFVF9NQUNfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgXSIsIE5DU0lfQ29tbWFuZFN0cik7IGJyZWFrOworICAgICAgICBjYXNlIDB4MTAgICA6IHNwcmludGYoTkNTSV9Db21tYW5kU3RyLCAiJXNbRU5BQkxFX0JST0FEQ0FTVF9GSUxURVJJTkcgICAgICAgICBdIiwgTkNTSV9Db21tYW5kU3RyKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMHgxMSAgIDogc3ByaW50ZihOQ1NJX0NvbW1hbmRTdHIsICIlc1tESVNBQkxFX0JST0FEQ0FTVF9GSUxURVJJTkcgICAgICAgIF0iLCBOQ1NJX0NvbW1hbmRTdHIpOyBicmVhazsKKyAgICAgICAgY2FzZSAweDEyICAgOiBzcHJpbnRmKE5DU0lfQ29tbWFuZFN0ciwgIiVzW0VOQUJMRV9HTE9CQUxfTVVMVElDQVNUX0ZJTFRFUklORyAgXSIsIE5DU0lfQ29tbWFuZFN0cik7IGJyZWFrOworICAgICAgICBjYXNlIDB4MTMgICA6IHNwcmludGYoTkNTSV9Db21tYW5kU3RyLCAiJXNbRElTQUJMRV9HTE9CQUxfTVVMVElDQVNUX0ZJTFRFUklORyBdIiwgTkNTSV9Db21tYW5kU3RyKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMHgxNCAgIDogc3ByaW50ZihOQ1NJX0NvbW1hbmRTdHIsICIlc1tTRVRfTkNTSV9GTE9XX0NPTlRST0wgICAgICAgICAgICAgIF0iLCBOQ1NJX0NvbW1hbmRTdHIpOyBicmVhazsKKyAgICAgICAgY2FzZSAweDE1ICAgOiBzcHJpbnRmKE5DU0lfQ29tbWFuZFN0ciwgIiVzW0dFVF9WRVJTSU9OX0lEICAgICAgICAgICAgICAgICAgICAgXSIsIE5DU0lfQ29tbWFuZFN0cik7IGJyZWFrOworICAgICAgICBjYXNlIDB4MTYgICA6IHNwcmludGYoTkNTSV9Db21tYW5kU3RyLCAiJXNbR0VUX0NBUEFCSUxJVElFUyAgICAgICAgICAgICAgICAgICBdIiwgTkNTSV9Db21tYW5kU3RyKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMHgxNyAgIDogc3ByaW50ZihOQ1NJX0NvbW1hbmRTdHIsICIlc1tHRVRfUEFSQU1FVEVSUyAgICAgICAgICAgICAgICAgICAgIF0iLCBOQ1NJX0NvbW1hbmRTdHIpOyBicmVhazsKKyAgICAgICAgY2FzZSAweDE4ICAgOiBzcHJpbnRmKE5DU0lfQ29tbWFuZFN0ciwgIiVzW0dFVF9DT05UUk9MTEVSX1BBQ0tFVF9TVEFUSVNUSUNTICAgXSIsIE5DU0lfQ29tbWFuZFN0cik7IGJyZWFrOworICAgICAgICBjYXNlIDB4MTkgICA6IHNwcmludGYoTkNTSV9Db21tYW5kU3RyLCAiJXNbR0VUX05DU0lfU1RBVElTVElDUyAgICAgICAgICAgICAgICBdIiwgTkNTSV9Db21tYW5kU3RyKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMHgxQSAgIDogc3ByaW50ZihOQ1NJX0NvbW1hbmRTdHIsICIlc1tHRVRfTkNTSV9QQVNTX1RIUk9VR0hfU1RBVElTVElDUyAgIF0iLCBOQ1NJX0NvbW1hbmRTdHIpOyBicmVhazsKKyAgICAgICAgY2FzZSAweDUwICAgOiBzcHJpbnRmKE5DU0lfQ29tbWFuZFN0ciwgIiVzW09FTV9DT01NQU5EICAgICAgICAgICAgICAgICAgICAgICAgXSIsIE5DU0lfQ29tbWFuZFN0cik7IGJyZWFrOworICAgICAgICBkZWZhdWx0ICAgICA6IHNwcmludGYoTkNTSV9Db21tYW5kU3RyLCAiJXMgTm90IFN1cHBvcnQgQ29tbWFuZCIsIE5DU0lfQ29tbWFuZFN0cik7IGJyZWFrIDsKKyAgICB9Cit9IC8vIEVuZCB2b2lkIE5DU0lfUHJpbnRDb21tYW5kU3RyICh1bnNpZ25lZCBjaGFyIGNvbW1hbmQsIHVuc2lnbmVkIGlpZCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgTkNTSV9QcmludENvbW1hbmRUeXBlICh1bnNpZ25lZCBjaGFyIGNvbW1hbmQsIHVuc2lnbmVkIGlpZCkgeworICAgIE5DU0lfUHJpbnRDb21tYW5kU3RyKGNvbW1hbmQsIGlpZCk7CisgICAgcHJpbnRmICgiJXNcbiIsIE5DU0lfQ29tbWFuZFN0cik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIE5DU0lfUHJpbnRDb21tYW5kVHlwZTJGaWxlICh1bnNpZ25lZCBjaGFyIGNvbW1hbmQsIHVuc2lnbmVkIGlpZCkgeworICAgIE5DU0lfUHJpbnRDb21tYW5kU3RyKGNvbW1hbmQsIGlpZCk7CisgICAgI2lmZGVmIFNMVF9ET1MKKyAgICBmcHJpbnRmKGZwX2xvZywgIiVzXG4iLCBOQ1NJX0NvbW1hbmRTdHIpOworICAgICNlbmRpZgorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2hhciBOQ1NJX1NlbnRXYWl0UGFja2V0ICh1bnNpZ25lZCBjaGFyIGNvbW1hbmQsIHVuc2lnbmVkIGNoYXIgaWQsIHVuc2lnbmVkIHNob3J0IGxlbmd0aCkgeworICAgIGludCAgICAgUmV0cnkgPSAwOworICAgIGNoYXIgICAgcmV0OworICAgIAorICAgIGRvIHsKKyAgICAgICAgSW5zdGFuY2VJRCsrOworICAgICAgICBXclJlcXVlc3QoY29tbWFuZCwgaWQsIGxlbmd0aCk7CisKKyAgICAgICAgcmV0ID0gTkNTSV9UeCgpOw0gICAgICAgIGlmICggcmV0ICE9IDAgKSAKKyAgICAgICAgeworICAgICAgICAgICAgLy8gcHJpbnRmKCI9PT09PT0+IE5DU0lfVHggcmV0dXJuIGNvZGUgPSAlWFxuIiwgcmV0ICk7ICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgIH0NICAgICAgICAgICAgCisjaWZkZWYgUHJpbnRfUGFja2FnZU5hbWUKKyAgICAgICAgTkNTSV9QcmludENvbW1hbmRUeXBlKGNvbW1hbmQsIEluc3RhbmNlSUQpOworI2VuZGlmCisKKyNpZmRlZiBOQ1NJX0VuYWJsZURlbGF5X0VhY2hQYWNrYWdlCisgICAgICAgIGRlbGF5KERlbGF5X0VhY2hQYWNrYWdlKTsKKyNlbmRpZgorICAgICAgICBpZiAoIE5DU0lfUnhfU0xUKCBjb21tYW5kICkgKSAKKyAgICAgICAgICAgIHJldHVybigyKTsKKyAgICAgICAgCisgICAgICAgICNpZmRlZiBTTFRfRE9TCisgICAgICAgIGlmICggUHJpbnROQ1NJRW4gKSAKKyAgICAgICAgICAgIGZwcmludGYoZnBfbG9nLCAiW1JlcXVlc3RdIEVUeXA6JTA0eCBNQ19JRDolMDJ4IEhlYWRWZXI6JTAyeCBJSUQ6JTAyeCBDb21tOiUwMnggQ2hsSUQ6JTAyeCBQYXlMZW46JTA0eFxuIiwgV0RTd2FwX1NMVChOQ1NJX1JlcXVlc3RfU0xULkV0aGVyVHlwZSksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQ1NJX1JlcXVlc3RfU0xULk1DX0lELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkNTSV9SZXF1ZXN0X1NMVC5IZWFkZXJfUmV2aXNpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQ1NJX1JlcXVlc3RfU0xULklJRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DU0lfUmVxdWVzdF9TTFQuQ29tbWFuZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DU0lfUmVxdWVzdF9TTFQuQ2hhbm5lbF9JRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdEU3dhcF9TTFQoTkNTSV9SZXF1ZXN0X1NMVC5QYXlsb2FkX0xlbmd0aCkgKTsKKyAgICAgICAgaWYgKCBQcmludE5DU0lFbiApIAorICAgICAgICAgICAgZnByaW50ZihmcF9sb2csICJbUmVzcG9uZF0gRVR5cDolMDR4IE1DX0lEOiUwMnggSGVhZFZlcjolMDJ4IElJRDolMDJ4IENvbW06JTAyeCBDaGxJRDolMDJ4IFBheUxlbjolMDR4IFJlc0NkOiUwMnggUmVhQ2Q6JTAyeFxuIiwgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQ1NJX1Jlc3BvbmRfU0xULkV0aGVyVHlwZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DU0lfUmVzcG9uZF9TTFQuTUNfSUQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQ1NJX1Jlc3BvbmRfU0xULkhlYWRlcl9SZXZpc2lvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DU0lfUmVzcG9uZF9TTFQuSUlELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkNTSV9SZXNwb25kX1NMVC5Db21tYW5kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkNTSV9SZXNwb25kX1NMVC5DaGFubmVsX0lELCAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DU0lfUmVzcG9uZF9TTFQuUGF5bG9hZF9MZW5ndGgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQ1NJX1Jlc3BvbmRfU0xULlJlc3BvbnNlX0NvZGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQ1NJX1Jlc3BvbmRfU0xULlJlYXNvbl9Db2RlKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIAorICAgICAgICBpZiAoIChOQ1NJX1Jlc3BvbmRfU0xULklJRCAgICAgICAgICAgIT0gSW5zdGFuY2VJRCkgICAgICAgfHwgCisgICAgICAgICAgICAgKE5DU0lfUmVzcG9uZF9TTFQuQ29tbWFuZCAgICAgICAhPSAoY29tbWFuZCB8IDB4ODApKSB8fCAKKyAgICAgICAgICAgICAoTkNTSV9SZXNwb25kX1NMVC5SZXNwb25zZV9Db2RlICE9IENPTU1BTkRfQ09NUExFVEVEKSAgKSB7CisgICAgICAgICAgICAjaWZkZWYgU0xUX0RPUworICAgICAgICAgICAgaWYgKCBQcmludE5DU0lFbiApIAorICAgICAgICAgICAgICAgIGZwcmludGYoZnBfbG9nLCAiUmV0cnk6IENvbW1hbmQgPSAleCwgUmVzcG9uc2VfQ29kZSA9ICV4XG4iLCBOQ1NJX1JlcXVlc3RfU0xULkNvbW1hbmQsIE5DU0lfUmVzcG9uZF9TTFQuUmVzcG9uc2VfQ29kZSk7CisKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgUmV0cnkrKzsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoIFByaW50TkNTSUVuICkgCisgICAgICAgICAgICAgICAgTkNTSV9QcmludENvbW1hbmRUeXBlMkZpbGUoY29tbWFuZCwgSW5zdGFuY2VJRCk7CisKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKFJldHJ5IDw9IFNFTlRfUkVUUllfQ09VTlQpOworCisgICAgcmV0dXJuKCAzICk7Cit9IC8vIEVuZCBjaGFyIE5DU0lfU2VudFdhaXRQYWNrZXQgKHVuc2lnbmVkIGNoYXIgY29tbWFuZCwgdW5zaWduZWQgY2hhciBpZCwgdW5zaWduZWQgc2hvcnQgbGVuZ3RoKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2hhciBDbGVhcl9Jbml0aWFsX1N0YXRlX1NMVCAoaW50IENoYW5uZWxfSUQpIHsvL0NvbW1hbmQ6MHgwMAorICAgIHJldHVybihOQ1NJX1NlbnRXYWl0UGFja2V0KENMRUFSX0lOSVRJQUxfU1RBVEUsIChOQ1NJX0NhcF9TTFQuUGFja2FnZV9JRCA8PCA1KSArIENoYW5uZWxfSUQsIDApKTsvL0ludGVybmFsIENoYW5uZWwgSUQgPSAwCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjaGFyIFNlbGVjdF9QYWNrYWdlX1NMVCAoaW50IFBhY2thZ2VfSUQpIHsvL0NvbW1hbmQ6MHgwMQorICAgIG1lbXNldCAoKHZvaWQgKilOQ1NJX1BheWxvYWRfRGF0YSwgMCwgNCk7CisgICAgTkNTSV9QYXlsb2FkX0RhdGFbM10gPSAxOyAvL0FyYml0cmF0aW9uIERpc2FibGUKKworICAgIHJldHVybihOQ1NJX1NlbnRXYWl0UGFja2V0KFNFTEVDVF9QQUNLQUdFLCAoUGFja2FnZV9JRCA8PCA1KSArIDB4MUYsIDQpKTsvL0ludGVybmFsIENoYW5uZWwgSUQgPSAweDFGLCAweDFGIG1lYW5zIGFsbCBjaGFubmVsCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIFNlbGVjdF9BY3RpdmVfUGFja2FnZV9TTFQgKHZvaWQpIHsvL0NvbW1hbmQ6MHgwMQorICAgIG1lbXNldCAoKHZvaWQgKilOQ1NJX1BheWxvYWRfRGF0YSwgMCwgNCk7CisgICAgTkNTSV9QYXlsb2FkX0RhdGFbM10gPSAxOyAvL0FyYml0cmF0aW9uIERpc2FibGUKKworICAgIGlmIChOQ1NJX1NlbnRXYWl0UGFja2V0KFNFTEVDVF9QQUNLQUdFLCAoTkNTSV9DYXBfU0xULlBhY2thZ2VfSUQgPDwgNSkgKyAweDFGLCA0KSkgey8vSW50ZXJuYWwgQ2hhbm5lbCBJRCA9IDB4MUYKKyAgICAgICAgRmluZEVycl9OQ1NJKE5DU0lfTGlua0ZhaWxfU2VsZWN0X0FjdGl2ZV9QYWNrYWdlKTsKKyAgICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIERlU2VsZWN0X1BhY2thZ2VfU0xUIChpbnQgUGFja2FnZV9JRCkgey8vQ29tbWFuZDoweDAyCisgICAgTkNTSV9TZW50V2FpdFBhY2tldChERVNFTEVDVF9QQUNLQUdFLCAoUGFja2FnZV9JRCA8PCA1KSArIDB4MUYsIDApOy8vSW50ZXJuYWwgQ2hhbm5lbCBJRCA9IDB4MUYsIDB4MUYgbWVhbnMgYWxsIGNoYW5uZWwKKworI2lmZGVmIE5DU0lfRW5hYmxlRGVsYXlfRGVTZWxlY3RQYWNrYWdlCisgICAgZGVsYXkoRGVsYXlfRGVTZWxlY3RQYWNrYWdlKTsKKyNlbmRpZgorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBFbmFibGVfQ2hhbm5lbF9TTFQgKHZvaWQpIHsvL0NvbW1hbmQ6MHgwMworICAgIGlmICggTkNTSV9TZW50V2FpdFBhY2tldChFTkFCTEVfQ0hBTk5FTCwgKE5DU0lfQ2FwX1NMVC5QYWNrYWdlX0lEIDw8IDUpICsgTkNTSV9DYXBfU0xULkNoYW5uZWxfSUQsIDApICkgeworICAgICAgICBGaW5kRXJyX05DU0koTkNTSV9MaW5rRmFpbF9FbmFibGVfQ2hhbm5lbCk7CisgICAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBEaXNhYmxlX0NoYW5uZWxfU0xUICh2b2lkKSB7Ly9Db21tYW5kOjB4MDQKKyAgICBtZW1zZXQgKCh2b2lkICopTkNTSV9QYXlsb2FkX0RhdGEsIDAsIDQpOworICAgIE5DU0lfUGF5bG9hZF9EYXRhWzNdID0gMHgxOyAvL0FMRAorCisgICAgaWYgKE5DU0lfU2VudFdhaXRQYWNrZXQoRElTQUJMRV9DSEFOTkVMLCAoTkNTSV9DYXBfU0xULlBhY2thZ2VfSUQgPDwgNSkgKyBOQ1NJX0NhcF9TTFQuQ2hhbm5lbF9JRCwgNCkpIHsKKyAgICAgICAgRmluZEVycl9OQ1NJKE5DU0lfTGlua0ZhaWxfRGlzYWJsZV9DaGFubmVsKTsKKyAgICB9Cit9Cit2b2lkIEVuYWJsZV9OZXR3b3JrX1RYX1NMVCAodm9pZCkgey8vQ29tbWFuZDoweDA2CisgICAgaWYgKCBOQ1NJX1NlbnRXYWl0UGFja2V0KEVOQUJMRV9DSEFOTkVMX05FVFdPUktfVFgsIChOQ1NJX0NhcF9TTFQuUGFja2FnZV9JRCA8PCA1KSArIE5DU0lfQ2FwX1NMVC5DaGFubmVsX0lELCAwKSApIHsKKyAgICAgICAgRmluZEVycl9OQ1NJKE5DU0lfTGlua0ZhaWxfRW5hYmxlX05ldHdvcmtfVFgpOworICAgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgRGlzYWJsZV9OZXR3b3JrX1RYX1NMVCAodm9pZCkgey8vQ29tbWFuZDoweDA3CisgICAgaWYgKCBOQ1NJX1NlbnRXYWl0UGFja2V0KERJU0FCTEVfQ0hBTk5FTF9ORVRXT1JLX1RYLCAoTkNTSV9DYXBfU0xULlBhY2thZ2VfSUQgPDwgNSkgKyBOQ1NJX0NhcF9TTFQuQ2hhbm5lbF9JRCwgMCkgKSB7CisgICAgICAgIEZpbmRFcnJfTkNTSShOQ1NJX0xpbmtGYWlsX0Rpc2FibGVfTmV0d29ya19UWCk7CisgICAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBTZXRfTGlua19TTFQgKHZvaWQpIHsvL0NvbW1hbmQ6MHgwOQorICAgIG1lbXNldCAoKHZvaWQgKilOQ1NJX1BheWxvYWRfRGF0YSwgMCwgOCk7CisgICAgTkNTSV9QYXlsb2FkX0RhdGFbMl0gPSAweDAyOyAvL2Z1bGwgZHVwbGV4CisvLyAgTkNTSV9QYXlsb2FkX0RhdGFbM10gPSAweDA0OyAvLzEwME0sIGF1dG8tZGlzYWJsZQorICAgIE5DU0lfUGF5bG9hZF9EYXRhWzNdID0gMHgwNTsgLy8xMDBNLCBhdXRvLWVuYWJsZQorCisgICAgTkNTSV9TZW50V2FpdFBhY2tldChTRVRfTElOSywgKE5DU0lfQ2FwX1NMVC5QYWNrYWdlX0lEIDw8IDUpICsgTkNTSV9DYXBfU0xULkNoYW5uZWxfSUQsIDgpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2hhciBHZXRfTGlua19TdGF0dXNfU0xUICh2b2lkKSB7Ly9Db21tYW5kOjB4MGEKKyAgICAKKyAgICBpZiAoTkNTSV9TZW50V2FpdFBhY2tldChHRVRfTElOS19TVEFUVVMsIChOQ1NJX0NhcF9TTFQuUGFja2FnZV9JRCA8PCA1KSArIE5DU0lfQ2FwX1NMVC5DaGFubmVsX0lELCAwKSkgeworICAgICAgICByZXR1cm4oMCk7CisgICAgfSAKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKE5DU0lfUmVzcG9uZF9TTFQuUGF5bG9hZF9EYXRhWzNdICYgMHgyMCkgeworICAgICAgICAgICAgaWYgKE5DU0lfUmVzcG9uZF9TTFQuUGF5bG9hZF9EYXRhWzNdICYgMHg0MCkgeworICAgICAgICAgICAgICAgIGlmIChOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfRGF0YVszXSAmIDB4MDEpIAorICAgICAgICAgICAgICAgICAgICByZXR1cm4oMSk7IC8vTGluayBVcCBvciBOb3QKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7IC8vQXV0byBOZWdvdGlhdGUgZGlkIG5vdCBmaW5pc2gKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfRGF0YVszXSAmIDB4MDEpIAorICAgICAgICAgICAgICAgIHJldHVybigxKTsgLy9MaW5rIFVwIG9yIE5vdAorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgIH0KKyAgICB9Cit9IC8vIEVuZCBjaGFyIEdldF9MaW5rX1N0YXR1c19TTFQgKHZvaWQpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIEVuYWJsZV9TZXRfTUFDX0FkZHJlc3NfU0xUICh2b2lkKSB7Ly9Db21tYW5kOjB4MGUKKyAgICBpbnQgaTsKKyAgICAKKyAgICBmb3IgKCBpID0gMDsgaSA8IDY7IGkrKyApIHsKKyAgICAgICAgTkNTSV9QYXlsb2FkX0RhdGFbaV0gPSBOQ1NJX1JlcXVlc3RfU0xULlNBW2ldOworICAgIH0KKyAgICBOQ1NJX1BheWxvYWRfRGF0YVs2XSA9IDE7IC8vTUFDIEFkZHJlc3MgTnVtID0gMSAtLT4gYWRkcmVzcyBmaWx0ZXIgMSwgZml4ZWQgaW4gc2FtcGxlIGNvZGUKKyAgICBOQ1NJX1BheWxvYWRfRGF0YVs3XSA9IFVOSUNBU1QgKyAwICsgRU5BQkxFX01BQ19BRERSRVNTX0ZJTFRFUjsgLy9BVCArIFJlc2VydmVkICsgRQorCisgICAgaWYgKCBOQ1NJX1NlbnRXYWl0UGFja2V0KFNFVF9NQUNfQUREUkVTUywgKE5DU0lfQ2FwX1NMVC5QYWNrYWdlX0lEIDw8IDUpICsgTkNTSV9DYXBfU0xULkNoYW5uZWxfSUQsIDgpICkgeworICAgICAgICBGaW5kRXJyX05DU0koTkNTSV9MaW5rRmFpbF9FbmFibGVfU2V0X01BQ19BZGRyZXNzKTsKKyAgICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIEVuYWJsZV9Ccm9hZGNhc3RfRmlsdGVyX1NMVCAodm9pZCkgey8vQ29tbWFuZDoweDEwCisgICAgbWVtc2V0ICgodm9pZCAqKU5DU0lfUGF5bG9hZF9EYXRhLCAwLCA0KTsKKyAgICBOQ1NJX1BheWxvYWRfRGF0YVszXSA9IDB4RjsgLy9BUlAsIERIQ1AsIE5ldEJJT1MKKworICAgIGlmIChOQ1NJX1NlbnRXYWl0UGFja2V0KEVOQUJMRV9CUk9BRENBU1RfRklMVEVSSU5HLCAoTkNTSV9DYXBfU0xULlBhY2thZ2VfSUQgPDwgNSkgKyBOQ1NJX0NhcF9TTFQuQ2hhbm5lbF9JRCwgNCkgKSB7CisgICAgICAgIEZpbmRFcnJfTkNTSShOQ1NJX0xpbmtGYWlsX0VuYWJsZV9Ccm9hZGNhc3RfRmlsdGVyKTsKKyAgICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIEdldF9WZXJzaW9uX0lEX1NMVCAodm9pZCkgey8vQ29tbWFuZDoweDE1CisgICAgCisgICAgaWYgKE5DU0lfU2VudFdhaXRQYWNrZXQoR0VUX1ZFUlNJT05fSUQsIChOQ1NJX0NhcF9TTFQuUGFja2FnZV9JRCA8PCA1KSArIE5DU0lfQ2FwX1NMVC5DaGFubmVsX0lELCAwKSApIHsKKyAgICAgICAgRmluZEVycl9OQ1NJKE5DU0lfTGlua0ZhaWxfR2V0X1ZlcnNpb25fSUQpOworICAgIH0gCisgICAgZWxzZSB7CisjaWZkZWYgUHJpbnRfVmVyc2lvbl9JRAorICAgICAgICBwcmludGYgKCJOQ1NJIFZlcnNpb24gICAgICAgIDogJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwgTkNTSV9SZXNwb25kX1NMVC5QYXlsb2FkX0RhdGFbIDBdLCBOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfRGF0YVsgMV0sIE5DU0lfUmVzcG9uZF9TTFQuUGF5bG9hZF9EYXRhWyAyXSwgTkNTSV9SZXNwb25kX1NMVC5QYXlsb2FkX0RhdGFbIDNdKTsKKyAgICAgICAgcHJpbnRmICgiTkNTSSBWZXJzaW9uICAgICAgICA6ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIE5DU0lfUmVzcG9uZF9TTFQuUGF5bG9hZF9EYXRhWyA0XSwgTkNTSV9SZXNwb25kX1NMVC5QYXlsb2FkX0RhdGFbIDVdLCBOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfRGF0YVsgNl0sIE5DU0lfUmVzcG9uZF9TTFQuUGF5bG9hZF9EYXRhWyA3XSk7CisgICAgICAgIHByaW50ZiAoIkZpcm13YXJlIE5hbWUgU3RyaW5nOiAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLCBOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfRGF0YVsgOF0sIE5DU0lfUmVzcG9uZF9TTFQuUGF5bG9hZF9EYXRhWyA5XSwgTkNTSV9SZXNwb25kX1NMVC5QYXlsb2FkX0RhdGFbMTBdLCBOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfRGF0YVsxMV0pOworICAgICAgICBwcmludGYgKCJGaXJtd2FyZSBOYW1lIFN0cmluZzogJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwgTkNTSV9SZXNwb25kX1NMVC5QYXlsb2FkX0RhdGFbMTJdLCBOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfRGF0YVsxM10sIE5DU0lfUmVzcG9uZF9TTFQuUGF5bG9hZF9EYXRhWzE0XSwgTkNTSV9SZXNwb25kX1NMVC5QYXlsb2FkX0RhdGFbMTVdKTsKKyAgICAgICAgcHJpbnRmICgiRmlybXdhcmUgTmFtZSBTdHJpbmc6ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIE5DU0lfUmVzcG9uZF9TTFQuUGF5bG9hZF9EYXRhWzE2XSwgTkNTSV9SZXNwb25kX1NMVC5QYXlsb2FkX0RhdGFbMTddLCBOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfRGF0YVsxOF0sIE5DU0lfUmVzcG9uZF9TTFQuUGF5bG9hZF9EYXRhWzE5XSk7CisgICAgICAgIHByaW50ZiAoIkZpcm13YXJlIFZlcnNpb24gICAgOiAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLCBOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfRGF0YVsyMF0sIE5DU0lfUmVzcG9uZF9TTFQuUGF5bG9hZF9EYXRhWzIxXSwgTkNTSV9SZXNwb25kX1NMVC5QYXlsb2FkX0RhdGFbMjJdLCBOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfRGF0YVsyM10pOworICAgICAgICBwcmludGYgKCJQQ0kgRElEL1ZJRCAgICAgICAgIDogJTAyeCAlMDJ4LyUwMnggJTAyeFxuIiwgTkNTSV9SZXNwb25kX1NMVC5QYXlsb2FkX0RhdGFbMjRdLCBOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfRGF0YVsyNV0sIE5DU0lfUmVzcG9uZF9TTFQuUGF5bG9hZF9EYXRhWzI2XSwgTkNTSV9SZXNwb25kX1NMVC5QYXlsb2FkX0RhdGFbMjddKTsKKyAgICAgICAgcHJpbnRmICgiUENJIFNTSUQvU1ZJRCAgICAgICA6ICUwMnggJTAyeC8lMDJ4ICUwMnhcbiIsIE5DU0lfUmVzcG9uZF9TTFQuUGF5bG9hZF9EYXRhWzI4XSwgTkNTSV9SZXNwb25kX1NMVC5QYXlsb2FkX0RhdGFbMjldLCBOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfRGF0YVszMF0sIE5DU0lfUmVzcG9uZF9TTFQuUGF5bG9hZF9EYXRhWzMxXSk7CisgICAgICAgIHByaW50ZiAoIk1hbnVmYWN0dXJlciBJRCAgICAgOiAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLCBOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfRGF0YVszMl0sIE5DU0lfUmVzcG9uZF9TTFQuUGF5bG9hZF9EYXRhWzMzXSwgTkNTSV9SZXNwb25kX1NMVC5QYXlsb2FkX0RhdGFbMzRdLCBOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfRGF0YVszNV0pOworICAgICAgICBwcmludGYgKCJDaGVja3N1bSAgICAgICAgICAgIDogJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwgTkNTSV9SZXNwb25kX1NMVC5QYXlsb2FkX0RhdGFbMzZdLCBOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfRGF0YVszN10sIE5DU0lfUmVzcG9uZF9TTFQuUGF5bG9hZF9EYXRhWzM4XSwgTkNTSV9SZXNwb25kX1NMVC5QYXlsb2FkX0RhdGFbMzldKTsKKyNlbmRpZgorICAgICAgICBOQ1NJX0NhcF9TTFQuUENJX0RJRF9WSUQgICAgPSAoTkNTSV9SZXNwb25kX1NMVC5QYXlsb2FkX0RhdGFbMjRdPDwyNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoTkNTSV9SZXNwb25kX1NMVC5QYXlsb2FkX0RhdGFbMjVdPDwxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoTkNTSV9SZXNwb25kX1NMVC5QYXlsb2FkX0RhdGFbMjZdPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoTkNTSV9SZXNwb25kX1NMVC5QYXlsb2FkX0RhdGFbMjddICAgICk7CisgICAgICAgIE5DU0lfQ2FwX1NMVC5NYW51ZmFjdHVyZXJJRCA9IChOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfRGF0YVszMl08PDI0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfRGF0YVszM108PDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfRGF0YVszNF08PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfRGF0YVszNV0gICAgKTsKKyAgICB9Cit9IC8vIEVuZCB2b2lkIEdldF9WZXJzaW9uX0lEX1NMVCAodm9pZCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgR2V0X0NhcGFiaWxpdGllc19TTFQgKHZvaWQpIHsvL0NvbW1hbmQ6MHgxNgorICAgIAorICAgIGlmIChOQ1NJX1NlbnRXYWl0UGFja2V0KEdFVF9DQVBBQklMSVRJRVMsIChOQ1NJX0NhcF9TTFQuUGFja2FnZV9JRCA8PCA1KSArIE5DU0lfQ2FwX1NMVC5DaGFubmVsX0lELCAwKSkgeworICAgICAgICBGaW5kRXJyX05DU0koTkNTSV9MaW5rRmFpbF9HZXRfQ2FwYWJpbGl0aWVzKTsKKyAgICB9IAorICAgIGVsc2UgeworICAgICAgICBOQ1NJX0NhcF9TTFQuQ2FwYWJpbGl0aWVzX0ZsYWdzICAgICAgICAgICAgICAgICAgID0gTkNTSV9SZXNwb25kX1NMVC5QYXlsb2FkX0RhdGFbMF07CisgICAgICAgIE5DU0lfQ2FwX1NMVC5Ccm9hZGNhc3RfUGFja2V0X0ZpbHRlcl9DYXBhYmlsaXRpZXMgPSBOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfRGF0YVsxXTsKKyAgICAgICAgTkNTSV9DYXBfU0xULk11bHRpY2FzdF9QYWNrZXRfRmlsdGVyX0NhcGFiaWxpdGllcyA9IE5DU0lfUmVzcG9uZF9TTFQuUGF5bG9hZF9EYXRhWzJdOworICAgICAgICBOQ1NJX0NhcF9TTFQuQnVmZmVyaW5nX0NhcGFiaWxpdGllcyAgICAgICAgICAgICAgID0gTkNTSV9SZXNwb25kX1NMVC5QYXlsb2FkX0RhdGFbM107CisgICAgICAgIE5DU0lfQ2FwX1NMVC5BRU5fQ29udHJvbF9TdXBwb3J0ICAgICAgICAgICAgICAgICAgPSBOQ1NJX1Jlc3BvbmRfU0xULlBheWxvYWRfRGF0YVs0XTsKKyAgICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIEdldF9Db250cm9sbGVyX1BhY2tldF9TdGF0aXN0aWNzICh2b2lkKSB7Ly9Db21tYW5kOjB4MTgKKworICAgIE5DU0lfU2VudFdhaXRQYWNrZXQoR0VUX0NPTlRST0xMRVJfUEFDS0VUX1NUQVRJU1RJQ1MsIChOQ1NJX0NhcF9TTFQuUGFja2FnZV9JRCA8PCA1KSArIE5DU0lfQ2FwX1NMVC5DaGFubmVsX0lELCAwKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2NoYXIgcGh5X25jc2kgKHZvaWQpIHsKKyAgICBVTE9ORyAgIENoYW5uZWxfRm91bmQgPSAwOworICAgIFVMT05HICAgUGFja2FnZV9Gb3VuZCA9IDA7CisgICAgVUxPTkcgICBSZV9TZW5kOworICAgIFVMT05HICAgRXJyX0ZsYWdfYmFrOworICAgIFVMT05HICAgcGtnX2lkeDsKKyAgICBVTE9ORyAgIGNobF9pZHg7CisgICAgVUxPTkcgICBMaW5rX1N0YXR1czsKKyAgICBVTE9ORyAgIE5DU0lfTGlua0ZhaWxfVmFsX2JhazsKKworICAgIG51bWJlcl9jaGwgICAgPSAwOworICAgIG51bWJlcl9wYWsgICAgPSAwOworICAgIAorICAgIE5DU0lfTGlua0ZhaWxfVmFsID0gMDsKKw0gICAgI2lmZGVmIFNMVF9ET1MKKwkJZnByaW50ZihmcF9sb2csICJcblxuPT09PT09PiBTdGFydDpcbiIgKTsKKyAgICAjZW5kaWYNCisgICAgTkNTSV9TdHJ1Y3RfSW5pdGlhbGl6ZV9TTFQoKTsKKworICAgICNpZmRlZiBOQ1NJX1NraXBfUGhhc2UxX0RlU2VsZWN0UGFja2FnZQorICAgICNlbHNlCisgICAgCisgICAgLy9OQ1NJIFN0YXJ0CisgICAgLy9EaXNhYmxlIENoYW5uZWwgdGhlbiBEZVNlbGVjdCBQYWNrYWdlCisgICAgZm9yIChwa2dfaWR4ID0gMDsgcGtnX2lkeCA8IE1BWF9QQUNLQUdFX05VTTsgcGtnX2lkeCsrKSB7CisgICAgICAgIC8vIElnbm9yZSBlcnJvciBmbGFnIGluIHRoZSBOQ1NJIGNvbW1hbmQKKyAgICAgICAgRXJyX0ZsYWdfYmFrICAgICAgICAgID0gRXJyX0ZsYWc7CisgICAgICAgIE5DU0lfTGlua0ZhaWxfVmFsX2JhayA9IE5DU0lfTGlua0ZhaWxfVmFsOworICAgICAgICBzZWxlY3RfZmxhZ1twa2dfaWR4XSAgPSBTZWxlY3RfUGFja2FnZV9TTFQgKHBrZ19pZHgpOyAvLyBDb21tYW5kOjB4MDEKKyAgICAgICAgRXJyX0ZsYWcgICAgICAgICAgICAgID0gRXJyX0ZsYWdfYmFrOworICAgICAgICBOQ1NJX0xpbmtGYWlsX1ZhbCAgICAgPSBOQ1NJX0xpbmtGYWlsX1ZhbF9iYWs7CisgICAgICAgIAorICAgICAgICBpZiAoIHNlbGVjdF9mbGFnW3BrZ19pZHhdID09IDAgKSB7CisgICAgICAgICAgICBOQ1NJX0NhcF9TTFQuUGFja2FnZV9JRCA9IHBrZ19pZHg7CisKKyAgICAgICAgICAgIGZvciAoIGNobF9pZHggPSAwOyBjaGxfaWR4IDwgTUFYX0NIQU5ORUxfTlVNOyBjaGxfaWR4KysgKSB7CisgICAgICAgICAgICAgICAgTkNTSV9DYXBfU0xULkNoYW5uZWxfSUQgPSBjaGxfaWR4OworICAgICAgICAgICAgICAgIC8vIElnbm9yZSBlcnJvciBmbGFnIGluIHRoZSBOQ1NJIGNvbW1hbmQKKyAgICAgICAgICAgICAgICBFcnJfRmxhZ19iYWsgICAgICAgICAgPSBFcnJfRmxhZzsKKyAgICAgICAgICAgICAgICBOQ1NJX0xpbmtGYWlsX1ZhbF9iYWsgPSBOQ1NJX0xpbmtGYWlsX1ZhbDsKKyAgICAgICAgICAgICAgICBEaXNhYmxlX0NoYW5uZWxfU0xUKCk7ICAgIC8vIENvbW1hbmQ6IDB4MDQKKyAgICAgICAgICAgICAgICBFcnJfRmxhZyAgICAgICAgICAgICAgPSBFcnJfRmxhZ19iYWs7CisgICAgICAgICAgICAgICAgTkNTSV9MaW5rRmFpbF9WYWwgICAgID0gTkNTSV9MaW5rRmFpbF9WYWxfYmFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2lmZGVmIE5DU0lfU2tpcF9EZVNlbGVjdFBhY2thZ2UKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICBEZVNlbGVjdF9QYWNrYWdlX1NMVCAocGtnX2lkeCk7IC8vIENvbW1hbmQ6MHgwMgorICAgICAgICAgICAgI2VuZGlmCisgICAgICAgIH0gLy8gRW5kIGlmICggc2VsZWN0X2ZsYWdbcGtnX2lkeF0gPT0gMCApCisgICAgfSAvLyBFbmQgZm9yIChwa2dfaWR4ID0gMDsgcGtnX2lkeCA8IE1BWF9QQUNLQUdFX05VTTsgcGtnX2lkeCsrKQorICAgICNlbmRpZgorCisgICAgLy9TZWxlY3QgUGFja2FnZQorICAgIGZvciAocGtnX2lkeCA9IDA7IHBrZ19pZHggPCBNQVhfUEFDS0FHRV9OVU07IHBrZ19pZHgrKykgeworICAgICAgICAjaWZkZWYgTkNTSV9Ta2lwX1BoYXNlMV9EZVNlbGVjdFBhY2thZ2UKKyAgICAgICAgLy8gSWdub3JlIGVycm9yIGZsYWcgaW4gdGhlIE5DU0kgY29tbWFuZAorICAgICAgICBFcnJfRmxhZ19iYWsgICAgICAgICAgPSBFcnJfRmxhZzsKKyAgICAgICAgTkNTSV9MaW5rRmFpbF9WYWxfYmFrID0gTkNTSV9MaW5rRmFpbF9WYWw7CisgICAgICAgIHNlbGVjdF9mbGFnW3BrZ19pZHhdICA9IFNlbGVjdF9QYWNrYWdlX1NMVCAocGtnX2lkeCk7Ly9Db21tYW5kOjB4MDEKKyAgICAgICAgRXJyX0ZsYWcgICAgICAgICAgICAgID0gRXJyX0ZsYWdfYmFrOworICAgICAgICBOQ1NJX0xpbmtGYWlsX1ZhbCAgICAgPSBOQ1NJX0xpbmtGYWlsX1ZhbF9iYWs7CisgICAgICAgICNlbmRpZgorCisgICAgICAgIGlmIChzZWxlY3RfZmxhZ1twa2dfaWR4XSA9PSAwKSB7CisgICAgICAgICAgICAvL05DU0lfUnhUaW1lT3V0U2NhbGUgPSAxMDAwOworICAgICAgICAgICAgTkNTSV9SeFRpbWVPdXRTY2FsZSA9IDEwOworICAgICAgICAgICAgbnVtYmVyX3BhaysrOworICAgICAgICAgICAgUGFja2FnZV9Gb3VuZCAgICAgICA9IDE7CisgICAgICAgICAgICBOQ1NJX0NhcF9TTFQuUGFja2FnZV9JRCA9IHBrZ19pZHg7CisKKyAgICAgICAgICAgIGlmICggIShJT1RpbWluZ3x8SU9UaW1pbmdCdW5kKSApIAorICAgICAgICAgICAgICAgIHByaW50ZiAoIj09PT1GaW5kIFBhY2thZ2UgSUQ6ICVkXG4iLCBOQ1NJX0NhcF9TTFQuUGFja2FnZV9JRCk7CisgICAgICAgICAgICAjaWZkZWYgU0xUX0RPUworICAgICAgICAgICAgZnByaW50ZihmcF9sb2csICI9PT09RmluZCBQYWNrYWdlIElEOiAlZFxuIiwgTkNTSV9DYXBfU0xULlBhY2thZ2VfSUQpOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAKKyAgICAgICAgICAgICNpZmRlZiBOQ1NJX1NraXBfUGhhc2UxX0RlU2VsZWN0UGFja2FnZQorICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIFNlbGVjdF9QYWNrYWdlX1NMVCAocGtnX2lkeCk7Ly9Db21tYW5kOjB4MDEKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBTY2FuIGFsbCBjaGFubmVsIGluIHRoZSBwYWNrYWdlCisgICAgICAgICAgICBmb3IgKCBjaGxfaWR4ID0gMDsgY2hsX2lkeCA8IE1BWF9DSEFOTkVMX05VTTsgY2hsX2lkeCsrICkgeworICAgICAgICAgICAgICAgIC8vIGJhY2t1cCBlcnJvciBmbGFnCisgICAgICAgICAgICAgICAgRXJyX0ZsYWdfYmFrICAgICAgICAgID0gRXJyX0ZsYWc7CisgICAgICAgICAgICAgICAgTkNTSV9MaW5rRmFpbF9WYWxfYmFrID0gTkNTSV9MaW5rRmFpbF9WYWw7CisgICAgICAgICAgICAgICAgaWYgKENsZWFyX0luaXRpYWxfU3RhdGVfU0xUKGNobF9pZHgpID09IDApIHsgLy9Db21tYW5kOjB4MDAKKyAgICAgICAgICAgICAgICAgICAgbnVtYmVyX2NobCsrOworICAgICAgICAgICAgICAgICAgICBDaGFubmVsX0ZvdW5kICAgICAgID0gMTsKKyAgICAgICAgICAgICAgICAgICAgTkNTSV9DYXBfU0xULkNoYW5uZWxfSUQgPSBjaGxfaWR4OworCisgICAgICAgICAgICAgICAgICAgIGlmICggIShJT1RpbWluZyB8fCBJT1RpbWluZ0J1bmQpICkgCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYgKCItLS0tLS0tLUZpbmQgQ2hhbm5lbCBJRDogJWRcbiIsIE5DU0lfQ2FwX1NMVC5DaGFubmVsX0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAjaWZkZWYgU0xUX0RPUworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwX2xvZywgIi0tLS0tLS0tRmluZCBDaGFubmVsIElEOiAlZFxuIiwgTkNTSV9DYXBfU0xULkNoYW5uZWxfSUQpOworICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgLy8gR2V0IFZlcnNpb24gYW5kIENhcGFiaWxpdGllcworICAgICAgICAgICAgICAgICAgICBHZXRfVmVyc2lvbl9JRF9TTFQoKTsgICAgICAgICAgLy9Db21tYW5kOjB4MTUKKyAgICAgICAgICAgICAgICAgICAgR2V0X0NhcGFiaWxpdGllc19TTFQoKTsgICAgICAgIC8vQ29tbWFuZDoweDE2CisgICAgICAgICAgICAgICAgICAgIFNlbGVjdF9BY3RpdmVfUGFja2FnZV9TTFQoKTsgICAvL0NvbW1hbmQ6MHgwMQorICAgICAgICAgICAgICAgICAgICBFbmFibGVfU2V0X01BQ19BZGRyZXNzX1NMVCgpOyAgLy9Db21tYW5kOjB4MGUKKyAgICAgICAgICAgICAgICAgICAgRW5hYmxlX0Jyb2FkY2FzdF9GaWx0ZXJfU0xUKCk7IC8vQ29tbWFuZDoweDEwCisKKyAgICAgICAgICAgICAgICAgICAgLy8gRW5hYmxlIFRYCisgICAgICAgICAgICAgICAgICAgIEVuYWJsZV9OZXR3b3JrX1RYX1NMVCgpOyAgICAgICAvL0NvbW1hbmQ6MHgwNgorCisgICAgICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBDaGFubmVsCisgICAgICAgICAgICAgICAgICAgIEVuYWJsZV9DaGFubmVsX1NMVCgpOyAgICAgICAgICAvL0NvbW1hbmQ6MHgwMworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLy8gR2V0IExpbmsgU3RhdHVzCisgICAgICAgICAgICAgICAgICAgIFJlX1NlbmQgPSAwOworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAjaWZkZWYgTkNTSV9FbmFibGVEZWxheV9HZXRMaW5rU3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIFJlX1NlbmQgPj0gMiApIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5KERlbGF5X0dldExpbmtTdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIExpbmtfU3RhdHVzID0gR2V0X0xpbmtfU3RhdHVzX1NMVCgpOy8vQ29tbWFuZDoweDBhCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggTGlua19TdGF0dXMgPT0gTElOS19VUCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShJT1RpbWluZ3x8SU9UaW1pbmdCdW5kKSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoIiAgICAgICAgVGhpcyBDaGFubmVsIGlzIExJTktfVVBcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBTTFRfRE9TCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcF9sb2csICIgICAgICAgIFRoaXMgQ2hhbm5lbCBpcyBMSU5LX1VQXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQ1NJX0FSUCAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggTGlua19TdGF0dXMgPT0gTElOS19ET1dOICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggUmVfU2VuZCA+PSAyICkgeyAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEoSU9UaW1pbmcgfHwgSU9UaW1pbmdCdW5kKSApIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiICAgICAgICBUaGlzIENoYW5uZWwgaXMgTElOS19ET1dOXG4iKTsKKwkgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBTTFRfRE9TCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnBfbG9nLCAiICAgICAgICBUaGlzIENoYW5uZWwgaXMgTElOS19ET1dOXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCSAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKwkgICAgICAgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIEVuZCBpZiAoIExpbmtfU3RhdHVzID09IExJTktfVVAgKQorICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICggUmVfU2VuZCsrIDw9IDIgKTsKKworICAgICAgICAgICAgICAgICAgICAjaWZkZWYgTkNTSV9Ta2lwX0RpU0NoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBOQ1NJX0RpU0NoYW5uZWwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIFRYCisgICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlX05ldHdvcmtfVFhfU0xUKCk7IC8vQ29tbWFuZDoweDA3CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIENoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgIERpc2FibGVfQ2hhbm5lbF9TTFQoKTsgICAgLy9Db21tYW5kOjB4MDQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBFcnJfRmxhZyAgICAgICAgICA9IEVycl9GbGFnX2JhazsKKyAgICAgICAgICAgICAgICAgICAgTkNTSV9MaW5rRmFpbF9WYWwgPSBOQ1NJX0xpbmtGYWlsX1ZhbF9iYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvLyBFbmQgZm9yICggY2hsX2lkeCA9IDA7IGNobF9pZHggPCBNQVhfQ0hBTk5FTF9OVU07IGNobF9pZHgrKyApCisgICAgICAgICAgICAKKyAgICAgICAgICAgICNpZmRlZiBOQ1NJX1NraXBfRGVTZWxlY3RQYWNrYWdlCisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgRGVTZWxlY3RfUGFja2FnZV9TTFQgKHBrZ19pZHgpOy8vQ29tbWFuZDoweDAyCisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIE5DU0lfUnhUaW1lT3V0U2NhbGUgPSAxOworICAgICAgICB9IAorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICghKElPVGltaW5nfHxJT1RpbWluZ0J1bmQpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmICgiPT09PUFic2VuY2Ugb2YgUGFja2FnZSBJRDogJWxkXG4iLCBwa2dfaWR4KTsKKyAgICAgICAgICAgICAgICAjaWZkZWYgU0xUX0RPUworICAgICAgICAgICAgICAgIGZwcmludGYoZnBfbG9nLCAiPT09PUFic2VuY2Ugb2YgUGFja2FnZSBJRDogJWxkXG4iLCBwa2dfaWR4KTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvLyBFbmQgaWYgKHNlbGVjdF9mbGFnW3BrZ19pZHhdID09IDApCisgICAgfSAvLyBFbmQgZm9yIChwa2dfaWR4ID0gMDsgcGtnX2lkeCA8IE1BWF9QQUNLQUdFX05VTTsgcGtnX2lkeCsrKQorCisgICAgaWYgKCAhUGFja2FnZV9Gb3VuZCAgICAgICAgICAgICAgKSBGaW5kRXJyKCBFcnJfTkNTSV9Ob19QSFkgICAgICApOworICAgIGlmICggQ2hhbm5lbFRvbE51bSAhPSBudW1iZXJfY2hsICkgRmluZEVyciggRXJyX05DU0lfQ2hhbm5lbF9OdW0gKTsKKyAgICBpZiAoIFBhY2thZ2VUb2xOdW0gIT0gbnVtYmVyX3BhayApIEZpbmRFcnIoIEVycl9OQ1NJX1BhY2thZ2VfTnVtICk7CisvLyAgaWYgKCAhQ2hhbm5lbF9Gb3VuZCkgRmluZEVycigpOworCisgICAgaWYgKCBFcnJfRmxhZyApIAorICAgICAgICByZXR1cm4oMSk7CisgICAgZWxzZSAgICAgICAgICAKKyAgICAgICAgcmV0dXJuKDApOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9QQ0lfU1BJLmMgYi9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9QQ0lfU1BJLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdhYWM0NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL1BDSV9TUEkuYwpAQCAtMCwwICsxLDgzIEBACisvKg0KKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KKyAqDQorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0ENCisgKi8NCisjZGVmaW5lIFBDSV9TUElfQw0KK3N0YXRpYyBjb25zdCBjaGFyIFRoaXNGaWxlW10gPSAiUENJX1NQSS5jIjsNCisNCisjaW5jbHVkZSAiU1dGVU5DLkgiDQorDQorI2lmZGVmIFNMVF9VQk9PVA0KKyAgI2luY2x1ZGUgPGNvbW1vbi5oPg0KKyAgI2luY2x1ZGUgPGNvbW1hbmQuaD4NCisjZW5kaWYNCisjaWZkZWYgU0xUX0RPUw0KKyAgI2luY2x1ZGUgPHN0ZGlvLmg+DQorICAjaW5jbHVkZSA8c3RkbGliLmg+DQorICAjaW5jbHVkZSA8Y29uaW8uaD4NCisgICNpbmNsdWRlIDxzdHJpbmcuaD4NCisgICNpbmNsdWRlIDxkb3MuaD4NCisjZW5kaWYNCisNCisjaW5jbHVkZSAiREVGX1NQSS5IIg0KKyNpbmNsdWRlICJMSUIuSCINCisjaW5jbHVkZSAiVFlQRURFRi5IIg0KKw0KKyNpZmRlZiBTUElfQlVTDQorVUxPTkcgIEdldFBDSUluZm8gKERFVklDRV9QQ0lfSU5GTyAgKlZHQVBDSUluZm8pDQorew0KKyAgICBVTE9ORyB1bFBDSUJhc2VBZGRyZXNzLCBNTUlPQmFzZUFkZHJlc3MsIExpbmVhckFkZHJlc3NCYXNlLCBidXNudW0sIGRhdGE7DQorDQorICAgIHVsUENJQmFzZUFkZHJlc3MgPSBGaW5kUENJRGV2aWNlICgweDFBMDMsIDB4MjAwMCwgQUNUSVZFKTsNCisgICAgYnVzbnVtID0gMDsNCisgICAgd2hpbGUgKHVsUENJQmFzZUFkZHJlc3MgPT0gMCAmJiBidXNudW0gPCAyNTYpIHsNCisgICAgICAgIHVsUENJQmFzZUFkZHJlc3MgPSBGaW5kUENJRGV2aWNlICgweDFBMDMsIDB4MjAwMCwgYnVzbnVtKTsNCisgICAgICAgIGlmICh1bFBDSUJhc2VBZGRyZXNzID09IDApIHsNCisgICAgICAgICAgICB1bFBDSUJhc2VBZGRyZXNzID0gRmluZFBDSURldmljZSAoMHgxNjg4LCAweDIwMDAsIGJ1c251bSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAodWxQQ0lCYXNlQWRkcmVzcyA9PSAwKSB7DQorICAgICAgICAgICAgdWxQQ0lCYXNlQWRkcmVzcyA9IEZpbmRQQ0lEZXZpY2UgKDB4MUEwMywgMHgxMTYwLCBidXNudW0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHVsUENJQmFzZUFkZHJlc3MgPT0gMCkgew0KKyAgICAgICAgICAgIHVsUENJQmFzZUFkZHJlc3MgPSBGaW5kUENJRGV2aWNlICgweDFBMDMsIDB4MTE4MCwgYnVzbnVtKTsNCisgICAgICAgIH0NCisgICAgICAgIGJ1c251bSsrOw0KKyAgICB9DQorICAgIHByaW50ZiAoInVsUENJQmFzZUFkZHJlc3MgPSAlbHhcbiIsIHVsUENJQmFzZUFkZHJlc3MpOw0KKyAgICBpZiAodWxQQ0lCYXNlQWRkcmVzcyAhPSAwKSB7DQorICAgICAgICBWR0FQQ0lJbmZvLT51bFBDSUNvbmZpZ3VyYXRpb25CYXNlQWRkcmVzcyA9IHVsUENJQmFzZUFkZHJlc3M7DQorICAgICAgICBWR0FQQ0lJbmZvLT51c1ZlbmRvcklEID0gUmVhZFBDSVJlZyh1bFBDSUJhc2VBZGRyZXNzLCAwLCAweEZGRkYpOw0KKyAgICAgICAgVkdBUENJSW5mby0+dXNEZXZpY2VJRCA9IFJlYWRQQ0lSZWcodWxQQ0lCYXNlQWRkcmVzcywgMCwgMHhGRkZGMDAwMCkgPj4gMTY7DQorICAgICAgICBMaW5lYXJBZGRyZXNzQmFzZSA9IFJlYWRQQ0lSZWcgKHVsUENJQmFzZUFkZHJlc3MsIDB4MTAsIDB4RkZGRkZGRjApOw0KKyAgICAgICAgVkdBUENJSW5mby0+dWxQaHlzaWNhbEJhc2VBZGRyZXNzID0gTWFwUGh5c2ljYWxUb0xpbmVhciAoTGluZWFyQWRkcmVzc0Jhc2UsIDY0ICogMTAyNCAqIDEwMjQgKyAweDIwMDAwMCk7DQorICAgICAgICBNTUlPQmFzZUFkZHJlc3MgPSBSZWFkUENJUmVnICh1bFBDSUJhc2VBZGRyZXNzLCAweDE0LCAweEZGRkYwMDAwKTsNCisgICAgICAgIFZHQVBDSUluZm8tPnVsTU1JT0Jhc2VBZGRyZXNzID0gTWFwUGh5c2ljYWxUb0xpbmVhciAoTU1JT0Jhc2VBZGRyZXNzLCA2NCAqIDEwMjQgKiAxMDI0KTsNCisgICAgICAgIFZHQVBDSUluZm8tPnVzUmVsb2NhdGVJTyA9IFJlYWRQQ0lSZWcgKHVsUENJQmFzZUFkZHJlc3MsIDB4MTgsIDB4MDAwMEZGODApOw0KKyAgICAgICAgT1VURFdQT1JUKDB4Y2Y4LCB1bFBDSUJhc2VBZGRyZXNzICsgMHg0KTsNCisgICAgICAgIGRhdGEgPSBJTkRXUE9SVCgweGNmYyk7DQorICAgICAgICBPVVREV1BPUlQoMHhjZmMsIGRhdGEgfCAweDMpOw0KKyAgICAgICAgcmV0dXJuICAgIFRSVUU7DQorICAgIH0NCisgICAgZWxzZSB7DQorICAgICAgICByZXR1cm4gICAgRkFMU0U7DQorICAgIH0NCit9IC8vIEVuZCBVTE9ORyAgR2V0UENJSW5mbyAoREVWSUNFX1BDSV9JTkZPICAqVkdBUENJSW5mbykNCisNCitCT09MRUFOICBHZXREZXZpY2VQQ0lJbmZvIChWSURFT19FTkdJTkVfSU5GTyAqVmlkZW9FbmdpbmVJbmZvKQ0KK3sNCisgICAgaWYgKEdldFBDSUluZm8gKCZWaWRlb0VuZ2luZUluZm8tPlZHQVBDSUluZm8pID09IFRSVUUpIHsNCisgICAgICAgIHJldHVybiAgICBUUlVFOw0KKyAgICB9DQorICAgIGVsc2Ugew0KKyAgICAgICAgcHJpbnRmKCJDYW4gbm90IGZpbmQgUENJIGRldmljZSFcbiIpOw0KKyAgICAgICAgZXhpdCgwKTsNCisgICAgICAgIHJldHVybiAgICBGQUxTRTsNCisgICAgfQ0KK30gLy8gRW5kDQorI2VuZGlmIC8vIEVuZCBpZmRlZiBTUElfQlVTDQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvUEhZLkggYi9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9QSFkuSApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWQ5NDcwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvUEhZLkgKQEAgLTAsMCArMSw1NiBAQAorLyoNCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisgKg0KKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBDQorICovDQorI2lmbmRlZiBQSFlfSA0KKyNkZWZpbmUgUEhZX0gNCisNCisvLw0KKy8vIERlZmluZQ0KKy8vDQorI2RlZmluZSBFbmFibGVfU2VhcmNoUEhZSUQgICAgICAgICAgICAgLy9bT05dIChTZWFyY2ggdmxpZCBQSFkgSUQpDQorI2RlZmluZSBFbmFibGVfQ2hlY2taZXJvUEhZSUQgICAgICAgICAgLy9bT05dIChDaGVjayBQSFkgSUQgd2l0aCB2YWx1ZSAwKQ0KKw0KKyNpZmRlZiBFbmFibGVfQ2hlY2taZXJvUEhZSUQNCisgICNkZWZpbmUgUEhZX0lTX1ZBTElEKCBkYXQgKSAgICAgICggKCAoZGF0ICYgMHhmZmZmKSAhPSAweGZmZmYgKSAmJiAoICggZGF0ICYgMHhmZmZmICkgIT0gMHgwICkgKQ0KKyNlbHNlDQorICAjZGVmaW5lIFBIWV9JU19WQUxJRCggZGF0ICkgICAgICAoICggZGF0ICYgMHhmZmZmKSAhPSAweGZmZmYgKQ0KKyNlbmRpZg0KKw0KKy8vIERlZmluZSBQSFkgYmFzaWMgcmVnaXN0ZXINCisjZGVmaW5lIFBIWV9SRUdfQk1DUiAgICAweDAwIC8vIEJhc2ljIE1vZGUgQ29udHJvbCBSZWdpc3Rlcg0KKyNkZWZpbmUgUEhZX1JFR19CTVNSICAgIDB4MDEgLy8gQmFzaWMgTW9kZSBTdGF0dXMgUmVnaXN0ZXINCisjZGVmaW5lIFBIWV9SRUdfSURfMSAgICAweDAyDQorI2RlZmluZSBQSFlfUkVHX0lEXzIgICAgMHgwMw0KKyNkZWZpbmUgUEhZX0FORVIgICAgICAgIDB4MDYgLy8gQXV0by1uZWdvdGlhdGlvbiBFeHBhbnNpb24gUmVnaXN0ZXINCisjZGVmaW5lIFBIWV9HQkNSICAgICAgICAweDA5IC8vIDEwMDBCYXNlLVQgQ29udHJvbCBSZWdpc3Rlcg0KKyNkZWZpbmUgUEhZX1NSICAgICAgICAgIDB4MTEgLy8gUEhZIFNwZWNpZmljIFN0YXR1cyBSZWdpc3Rlcg0KKyNkZWZpbmUgUEhZX0lORVIgICAgICAgIDB4MTIgLy8gSW50ZXJydXB0IEVuYWJsZSBSZWdpc3Rlcg0KKw0KKyNkZWZpbmUgVElNRV9PVVRfUEhZX1JXICAgICAgICAgICAxMDAwMA0KKyNkZWZpbmUgVElNRV9PVVRfUEhZX1JzdCAgICAgICAgICAxMDAwMA0KKw0KKyNkZWZpbmUgUEhZSUQzX01hc2sgICAgICAgICAgICAgICAgMHhmYzAwICAgICAgICAgLy8weGZmYzANCisNCisvKiAtLS0gTm90ZSBmb3IgU2V0dGluZ1BIWSBjaGlwIC0tLQ0KK3ZvaWQgcGh5X3h4eHggKGludCBsb29wX3BoeSkgew0KKw0KKwlpZiAoIEJ1cnN0RW5hYmxlICkgew0KKyAgICAgICAgLy8gSUVFRSB0ZXN0DQorCX0gDQorCWVsc2UgaWYgKGxvb3BfcGh5KSB7DQorICAgICAgICAvLyBJbnRlcm5hbCBsb29wIGJhY2sNCisJfSANCisJZWxzZSB7DQorICAgICAgICAvLyBleHRlcm5hbCBsb29wIGJhY2sNCisJfQ0KK30NCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KKw0KKyNlbmRpZiAvLyBQSFlfSA0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL1BIWS5jIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvUEhZLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmZWQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL1BIWS5jCkBAIC0wLDAgKzEsMTU0MSBAQAorLyoNCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisgKg0KKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBDQorICovDQorI2RlZmluZSBQSFlfQw0KK3N0YXRpYyBjb25zdCBjaGFyIFRoaXNGaWxlW10gPSAiUEhZLmMiOw0KKw0KKyNpbmNsdWRlICJTV0ZVTkMuSCINCisNCisjaWZkZWYgU0xUX1VCT09UDQorICAjaW5jbHVkZSA8Y29tbW9uLmg+DQorICAjaW5jbHVkZSA8Y29tbWFuZC5oPg0KKyAgI2luY2x1ZGUgPENPTU1JTkYuSD4NCisgICNpbmNsdWRlICJTVERVQk9PVC5IIg0KKyNlbmRpZg0KKyNpZmRlZiBTTFRfRE9TDQorICAjaW5jbHVkZSA8c3RkaW8uaD4NCisgICNpbmNsdWRlIDxzdGRsaWIuaD4NCisgICNpbmNsdWRlIDxjb25pby5oPg0KKyAgI2luY2x1ZGUgPHN0cmluZy5oPg0KKyAgI2luY2x1ZGUgIkNPTU1JTkYuSCINCisjZW5kaWYNCisgIA0KKyNpbmNsdWRlICJQSFkuSCIgICAgICAgICAgICAgICAgICAgIA0KKyNpbmNsdWRlICJUWVBFREVGLkgiDQorI2luY2x1ZGUgIklPLkgiDQorDQorVUxPTkcJUEhZXzA5aDsNCitVTE9ORwlQSFlfMThoOw0KK1VMT05HCVBIWV8xZmg7DQorVUxPTkcJUEhZXzA2aEFbN107DQorVUxPTkcJUEhZXzExaDsNCitVTE9ORwlQSFlfMTJoOw0KK1VMT05HCVBIWV8xNWg7DQorVUxPTkcJUEhZXzA2aDsNCitjaGFyCVBIWUlEWzI1Nl07DQorVUxPTkcJUEhZXzAwaDsNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8vIFBIWSBSL1cgYmFzaWMNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgcGh5X3dyaXRlIChpbnQgYWRyLCBVTE9ORyBkYXRhKSB7DQorICAgIGludCB0aW1lb3V0ID0gMDsNCisgICAgDQorCWlmIChBU1QyMzAwX05ld01ESU8pIHsNCisJCVdyaXRlU09DX0REKCBNQUNfUEhZQkFTRSArIDB4NjAsICggZGF0YSA8PCAxNiApIHwgTUFDX1BIWVdyX05ldyB8IChQSFlfQURSPDw1KSB8IChhZHIgJiAweDFmKSk7DQorDQorCQl3aGlsZSAoIFJlYWRTT0NfREQoIE1BQ19QSFlCQVNFICsgMHg2MCApICYgTUFDX1BIWUJ1c3lfTmV3ICkgew0KKwkJCWlmICggKyt0aW1lb3V0ID4gVElNRV9PVVRfUEhZX1JXICkgew0KKwkJCQlpZiAoIUJ1cnN0RW5hYmxlKSANCisjaWZkZWYgU0xUX0RPUw0KKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcF9sb2csICJbUEhZLVdyaXRlXSBUaW1lIG91dDogJTA4bHhcbiIsIFJlYWRTT0NfREQoIE1BQ19QSFlCQVNFICsgMHg2MCApICk7DQorI2VuZGlmDQorICAgICAgICAgICAgICAgICAgICBGaW5kRXJyKCBFcnJfUEhZX1RpbWVPdXQgKTsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9IA0KKwllbHNlIHsNCisJCVdyaXRlU09DX0REKCBNQUNfUEhZQkFTRSArIDB4NjQsIGRhdGEgKTsNCisNCisJCVdyaXRlU09DX0REKCBNQUNfUEhZQkFTRSArIDB4NjAsIE1EQ19UaHJlcyB8IE1BQ19QSFlXciB8IChQSFlfQURSPDwxNikgfCAoKGFkciAmIDB4MWYpIDw8IDIxKSk7DQorDQorCQl3aGlsZSAoIFJlYWRTT0NfREQoIE1BQ19QSFlCQVNFICsgMHg2MCApICYgTUFDX1BIWVdyICkgew0KKwkJCWlmICggKyt0aW1lb3V0ID4gVElNRV9PVVRfUEhZX1JXICkgew0KKyNpZmRlZiBTTFRfRE9TDQorICAgICAgICAgICAgICAgIGlmICghQnVyc3RFbmFibGUpIA0KKwkJCQkgICAgZnByaW50ZihmcF9sb2csICJbUEhZLVdyaXRlXSBUaW1lIG91dDogJTA4bHhcbiIsIFJlYWRTT0NfREQoIE1BQ19QSFlCQVNFICsgMHg2MCApICk7DQorI2VuZGlmDQorICAgICAgICAgICAgICAgIEZpbmRFcnIoIEVycl9QSFlfVGltZU91dCApOw0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCX0gLy8gRW5kIGlmIChBU1QyMzAwX05ld01ESU8pDQorDQorCWlmICggRGJnUHJuX1BIWVJXICkgDQorCSAgICBwcmludGYgKCJbV3IgXSUwMmQ6ICUwNGx4XG4iLCBhZHIsIGRhdGEpOw0KK30gLy8gRW5kIHZvaWQgcGh5X3dyaXRlIChpbnQgYWRyLCBVTE9ORyBkYXRhKQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorVUxPTkcgcGh5X3JlYWQgKGludCBhZHIpIHsNCisgICAgaW50IHRpbWVvdXQgPSAwOw0KKyAgICANCisJaWYgKCBBU1QyMzAwX05ld01ESU8gKSB7DQorCQlXcml0ZVNPQ19ERCggTUFDX1BIWUJBU0UgKyAweDYwLCBNQUNfUEhZUmRfTmV3IHwgKFBIWV9BRFIgPDwgNSkgfCAoIGFkciAmIDB4MWYgKSApOw0KKw0KKwkJd2hpbGUgKCBSZWFkU09DX0REKCBNQUNfUEhZQkFTRSArIDB4NjAgKSAmIE1BQ19QSFlCdXN5X05ldyApIHsNCisJCQlpZiAoICsrdGltZW91dCA+IFRJTUVfT1VUX1BIWV9SVyApIHsNCisJCQkJaWYgKCAhQnVyc3RFbmFibGUgKSANCisjaWZkZWYgU0xUX0RPUw0KKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcF9sb2csICJbUEhZLVJlYWRdIFRpbWUgb3V0OiAlMDhseFxuIiwgUmVhZFNPQ19ERCggTUFDX1BIWUJBU0UgKyAweDYwICkpOw0KKyNlbmRpZg0KKyAgICAgICAgICAgICAgICAgICAgRmluZEVyciggRXJyX1BIWV9UaW1lT3V0ICk7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisNCisJCURFTEFZKERlbGF5X1BIWVJkKTsNCisJCURhdF9VTE9ORyA9IFJlYWRTT0NfREQoIE1BQ19QSFlCQVNFICsgMHg2NCApICYgMHhmZmZmOw0KKwl9IA0KKwllbHNlIHsNCisJCVdyaXRlU09DX0REKCBNQUNfUEhZQkFTRSArIDB4NjAsIE1EQ19UaHJlcyB8IE1BQ19QSFlSZCB8IChQSFlfQURSIDw8IDE2KSB8ICgoYWRyICYgMHgxZikgPDwgMjEpICk7DQorDQorCQl3aGlsZSAoIFJlYWRTT0NfREQoIE1BQ19QSFlCQVNFICsgMHg2MCApICYgTUFDX1BIWVJkICkgew0KKwkJCWlmICggKyt0aW1lb3V0ID4gVElNRV9PVVRfUEhZX1JXICkgew0KKyNpZmRlZiBTTFRfRE9TDQorICAgICAgICAgICAgICAgIGlmICggIUJ1cnN0RW5hYmxlICkgDQorCQkJCSAgICBmcHJpbnRmKCBmcF9sb2csICJbUEhZLVJlYWRdIFRpbWUgb3V0OiAlMDhseFxuIiwgUmVhZFNPQ19ERCggTUFDX1BIWUJBU0UgKyAweDYwICkgKTsNCisjZW5kaWYNCisgICAgICAgICAgICAgICAgRmluZEVyciggRXJyX1BIWV9UaW1lT3V0ICk7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisNCisJCURFTEFZKCBEZWxheV9QSFlSZCApOw0KKwkJRGF0X1VMT05HID0gUmVhZFNPQ19ERCggTUFDX1BIWUJBU0UgKyAweDY0ICkgPj4gMTY7DQorCX0NCisNCisJaWYgKCBEYmdQcm5fUEhZUlcgKSANCisJICAgIHByaW50ZiAoIltSZCBdJTAyZDogJTA0bHhcbiIsIGFkciwgRGF0X1VMT05HICk7DQorCSAgICANCisJcmV0dXJuKCBEYXRfVUxPTkcgKTsNCit9IC8vIEVuZCBVTE9ORyBwaHlfcmVhZCAoaW50IGFkcikNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgcGh5X1JlYWRfV3JpdGUgKGludCBhZHIsIFVMT05HIGNscl9tYXNrLCBVTE9ORyBzZXRfbWFzaykgew0KKwlpZiAoIERiZ1Bybl9QSFlSVyApIA0KKwkgICAgcHJpbnRmICgiW1JXIF0lMDJkOiBjbHI6JTA0bHg6IHNldDolMDRseFxuIiwgYWRyLCBjbHJfbWFzaywgc2V0X21hc2spOw0KKwlwaHlfd3JpdGUoYWRyLCAoKHBoeV9yZWFkKGFkcikgJiAofmNscl9tYXNrKSkgfCBzZXRfbWFzaykpOw0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgcGh5X291dCAoIGludCBhZHIgKSB7DQorCXByaW50ZiAoIiUwMmQ6ICUwNGx4XG4iLCBhZHIsIHBoeV9yZWFkKGFkcikpOw0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8vdm9pZCBwaHlfb3V0Y2hnICggaW50IGFkciApIHsNCisvLyAgICBVTE9ORwlQSFlfdmFsb2xkID0gMDsNCisvLyAgICBVTE9ORwlQSFlfdmFsOw0KKy8vDQorLy8Jd2hpbGUgKDEpIHsNCisvLwkJUEhZX3ZhbCA9IHBoeV9yZWFkKGFkcik7DQorLy8JCWlmIChQSFlfdmFsb2xkICE9IFBIWV92YWwpIHsNCisvLwkJCXByaW50ZiAoIiUwMmQ6ICUwNGx4XG4iLCBhZHIsIFBIWV92YWwpOw0KKy8vCQkJUEhZX3ZhbG9sZCA9IFBIWV92YWw7DQorLy8JCX0NCisvLwl9DQorLy99DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIHBoeV9kdW1wIChjaGFyICpuYW1lKSB7DQorCWludAlpbmRleDsNCisNCisJcHJpbnRmICgiWyVzXVslZF0tLS0tLS0tLS0tLS0tLS0tXG4iLCBuYW1lLCBQSFlfQURSKTsNCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgMzI7IGluZGV4KyspIHsNCisJCXByaW50ZiAoIiUwMmQ6ICUwNGx4ICIsIGluZGV4LCBwaHlfcmVhZChpbmRleCkpOw0KKwkJDQorCQlpZiAoKGluZGV4ICUgOCkgPT0gNykgDQorCQkgICAgcHJpbnRmICgiXG4iKTsNCisJfQ0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgcGh5X2lkIChCWVRFIG9wdGlvbikgew0KKyAgICANCisgICAgVUxPTkcJcmVnX2FkcjsNCisgICAgQ0hBUiAgICBQSFlfQURSX29yZzsNCisgICAgRklMRV9WQVINCisgICAgDQorICAgIEdFVF9PQkooIG9wdGlvbiApDQorDQorICAgIFBIWV9BRFJfb3JnID0gUEhZX0FEUjsNCisJZm9yIChQSFlfQURSID0gMDsgUEhZX0FEUiA8IDMyOyBQSFlfQURSKyspIHsNCisNCisJCVBSSU5UKE9VVF9PQkogIlslMDJkXSAiLCBQSFlfQURSKTsNCisNCisgICAgICAgIGZvciAocmVnX2FkciA9IDI7IHJlZ19hZHIgPD0gMzsgcmVnX2FkcisrKQ0KKwkJCVBSSU5UKE9VVF9PQkogIiVsZDolMDRseCAiLCByZWdfYWRyLCBwaHlfcmVhZChyZWdfYWRyKSk7DQorDQorCQlpZiAoKFBIWV9BRFIgJSA0KSA9PSAzKSANCisJCSAgICBQUklOVChPVVRfT0JKICJcbiIpOw0KKwl9DQorCVBIWV9BRFIgPSBQSFlfQURSX29yZzsNCit9DQorDQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIHBoeV9kZWxheSAoaW50IGR0KSB7DQorICAgIERFTEFZKCBkdCApOw0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8vIFBIWSBJQw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBwaHlfYmFzaWNfc2V0dGluZyAoaW50IGxvb3BfcGh5KSB7DQorCXBoeV9SZWFkX1dyaXRlKDAsICAweDcxNDAsIFBIWV8wMGgpOyAvL2NsciBzZXQNCisJaWYgKCBEYmdQcm5fUEhZUlcgKSANCisJICAgIHByaW50ZiAoIltTZXRdMDA6ICUwNGx4XG4iLCBwaHlfcmVhZCggUEhZX1JFR19CTUNSICkpOw0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgcGh5X1dhaXRfUmVzZXRfRG9uZSAodm9pZCkgew0KKwlpbnQgdGltZW91dCA9IDA7DQorCQ0KKwl3aGlsZSAoICBwaHlfcmVhZCggUEhZX1JFR19CTUNSICkgJiAweDgwMDAgKSB7DQorCQlpZiAoRGJnUHJuX1BIWVJXKSANCisJCSAgICBwcmludGYgKCIwMDogJTA0bHhcbiIsIHBoeV9yZWFkKCBQSFlfUkVHX0JNQ1IgKSk7DQorCQkgICAgDQorCQlpZiAoKyt0aW1lb3V0ID4gVElNRV9PVVRfUEhZX1JzdCkgew0KKyNpZmRlZiBTTFRfRE9TDQorICAgICAgICAgICAgaWYgKCFCdXJzdEVuYWJsZSkgZnByaW50ZihmcF9sb2csICJbUEhZLVJlc2V0XSBUaW1lIG91dDogJTA4bHhcbiIsIFJlYWRTT0NfREQoTUFDX1BIWUJBU0UrMHg2MCkpOw0KKyNlbmRpZg0KKyAgICAgICAgICAgIEZpbmRFcnIoRXJyX1BIWV9UaW1lT3V0KTsNCisJCQlicmVhazsNCisJCX0NCisJfS8vd2FpdCBSc3QgRG9uZQ0KKw0KKwlpZiAoRGJnUHJuX1BIWVJXKSBwcmludGYgKCJbQ2xyXTAwOiAlMDRseFxuIiwgcGh5X3JlYWQoIFBIWV9SRUdfQk1DUiApKTsNCisJREVMQVkoRGVsYXlfUEhZUnN0KTsNCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIHBoeV9SZXNldCAoaW50IGxvb3BfcGh5KSB7DQorCXBoeV9iYXNpY19zZXR0aW5nKGxvb3BfcGh5KTsNCisNCisJcGh5X1JlYWRfV3JpdGUoMCwgIDB4MDAwMCwgMHg4MDAwIHwgUEhZXzAwaCk7Ly9jbHIgc2V0Ly9Sc3QgUEhZDQorCXBoeV9XYWl0X1Jlc2V0X0RvbmUoKTsNCisNCisJcGh5X2Jhc2ljX3NldHRpbmcobG9vcF9waHkpOw0KKwlERUxBWShEZWxheV9QSFlSc3QpOw0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgcmVjb3ZfcGh5X21hcnZlbGwgKGludCBsb29wX3BoeSkgey8vODhFMTExMQ0KKwlpZiAoIEJ1cnN0RW5hYmxlICkgew0KKwl9IA0KKwllbHNlIGlmICggbG9vcF9waHkgKSB7DQorCX0gDQorCWVsc2Ugew0KKwkJaWYgKEdTcGVlZF9zZWxbMF0pIHsNCisJCQlwaHlfd3JpdGUoOSwgUEhZXzA5aCk7DQorDQorCQkJcGh5X1Jlc2V0KGxvb3BfcGh5KTsNCisNCisJCQlwaHlfd3JpdGUoMjksIDB4MDAwNyk7DQorCQkJcGh5X1JlYWRfV3JpdGUoMzAsIDB4MDAwOCwgMHgwMDAwKTsvL2NsciBzZXQNCisJCQlwaHlfd3JpdGUoMjksIDB4MDAxMCk7DQorCQkJcGh5X1JlYWRfV3JpdGUoMzAsIDB4MDAwMiwgMHgwMDAwKTsvL2NsciBzZXQNCisJCQlwaHlfd3JpdGUoMjksIDB4MDAxMik7DQorCQkJcGh5X1JlYWRfV3JpdGUoMzAsIDB4MDAwMSwgMHgwMDAwKTsvL2NsciBzZXQNCisNCisJCQlwaHlfd3JpdGUoMTgsIFBIWV8xMmgpOw0KKwkJfQ0KKwl9DQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBwaHlfbWFydmVsbCAoaW50IGxvb3BfcGh5KSB7Ly84OEUxMTExDQorICAgIGludAlSZXRyeTsNCisNCisJaWYgKCBEYmdQcm5fUEhZTmFtZSApIA0KKwkgICAgcHJpbnRmICgiLS0tPiglMDRseCAlMDRseClbTWFydmVsbF0gJXNcbiIsIFBIWV9JRDIsIFBIWV9JRDMsIFBIWU5hbWUpOw0KKw0KKwlpZiAoIEJ1cnN0RW5hYmxlICkgew0KKwkJcGh5X1Jlc2V0KGxvb3BfcGh5KTsNCisJfSANCisJZWxzZSBpZiAoIGxvb3BfcGh5ICkgew0KKwkJcGh5X1Jlc2V0KGxvb3BfcGh5KTsNCisJfSANCisJZWxzZSB7DQorCQlpZiAoIEdTcGVlZF9zZWxbMF0gKSB7DQorCQkJUEhZXzA5aCA9IHBoeV9yZWFkKCBQSFlfR0JDUiApOw0KKwkJCVBIWV8xMmggPSBwaHlfcmVhZCggUEhZX0lORVIgKTsNCisJCQlwaHlfd3JpdGUgKCAxOCwgMHgwMDAwICAgICAgICAgKTsNCisJCQlwaHlfUmVhZF9Xcml0ZSggIDksIDB4MDAwMCwgMHgxODAwICk7Ly9jbHIgc2V0DQorCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQlwaHlfUmVzZXQobG9vcF9waHkpOyAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQlpZiAoR1NwZWVkX3NlbFswXSkgeyAgICAgICAgICAgDQorCQkJcGh5X3dyaXRlICggMjksIDB4MDAwNyAgICAgICAgICk7DQorCQkJcGh5X1JlYWRfV3JpdGUoIDMwLCAweDAwMDAsIDB4MDAwOCApOy8vY2xyIHNldA0KKwkJCXBoeV93cml0ZSAoIDI5LCAweDAwMTAgICAgICAgICApOw0KKwkJCXBoeV9SZWFkX1dyaXRlKCAzMCwgMHgwMDAwLCAweDAwMDIgKTsvL2NsciBzZXQNCisJCQlwaHlfd3JpdGUgKCAyOSwgMHgwMDEyICAgICAgICAgKTsNCisJCQlwaHlfUmVhZF9Xcml0ZSggMzAsIDB4MDAwMCwgMHgwMDAxICk7Ly9jbHIgc2V0DQorCQl9DQorCX0NCisNCisJUmV0cnkgPSAwOw0KKwlkbyB7DQorCQlQSFlfMTFoID0gcGh5X3JlYWQoIFBIWV9TUiApOw0KKwl9IHdoaWxlICggISggKCBQSFlfMTFoICYgMHgwNDAwICkgfCBsb29wX3BoeSB8ICggUmV0cnkrKyA+IDIwICkgKSApOw0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgcmVjb3ZfcGh5X21hcnZlbGwwIChpbnQgbG9vcF9waHkpIHsvLzg4RTEzMTANCisJaWYgKEJ1cnN0RW5hYmxlKSB7DQorCX0gZWxzZSBpZiAobG9vcF9waHkpIHsNCisJfSBlbHNlIHsNCisJCWlmIChHU3BlZWRfc2VsWzBdKSB7DQorCQkJcGh5X3dyaXRlKDIyLCAweDAwMDYpOw0KKwkJCXBoeV9SZWFkX1dyaXRlKDE2LCAweDAwMjAsIDB4MDAwMCk7Ly9jbHIgc2V0DQorCQkJcGh5X3dyaXRlKDIyLCAweDAwMDApOw0KKwkJfQ0KKwl9DQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBwaHlfbWFydmVsbDAgKGludCBsb29wX3BoeSkgey8vODhFMTMxMA0KKyAgICBpbnQJUmV0cnk7DQorICAgIA0KKwlpZiAoRGJnUHJuX1BIWU5hbWUpIA0KKwkgICAgcHJpbnRmICgiLS0tPiglMDRseCAlMDRseClbTWFydmVsbF0gJXNcbiIsIFBIWV9JRDIsIFBIWV9JRDMsIFBIWU5hbWUpOw0KKw0KKwlwaHlfd3JpdGUoIDIyLCAweDAwMDIgKTsNCisNCisgICAgUEhZXzE1aCA9IHBoeV9yZWFkKDIxKTsNCisJaWYgKFBIWV8xNWggJiAweDAwMzApIHsNCisJCXByaW50ZiAoIlxuXG5bV2FybmluZ10gUGFnZTIsIFJlZ2lzdGVyIDIxLCBiaXQgNH41IG11c3QgYmUgMCBbUmVnMTVfMjolMDRseF1cblxuIiwgUEhZXzE1aCk7DQorI2lmZGVmIFNMVF9ET1MNCisgICAgICAgIGlmICggSU9UaW1pbmcgICAgKSANCisJCSAgICBmcHJpbnRmIChmcF9pbywgIlxuXG5bV2FybmluZ10gUGFnZTIsIFJlZ2lzdGVyIDIxLCBiaXQgNH41IG11c3QgYmUgMCBbUmVnMTVfMjolMDRseF1cblxuIiwgUEhZXzE1aCk7DQorCQlpZiAoICFCdXJzdEVuYWJsZSkgDQorCQkgICAgZnByaW50ZiAoZnBfbG9nLCAiXG5cbltXYXJuaW5nXSBQYWdlMiwgUmVnaXN0ZXIgMjEsIGJpdCA0fjUgbXVzdCBiZSAwIFtSZWcxNV8yOiUwNGx4XVxuXG4iLCBQSFlfMTVoKTsNCisjZW5kaWYJCSAgICANCisvLwkJcGh5X1JlYWRfV3JpdGUoMjEsIDB4MDAzMCwgMHgwMDAwKTsvL2NsciBzZXQvL1s1XVJ4IERseSwgWzRdVHggRGx5DQorICAgICAgICBwaHlfd3JpdGUoMjEsIFBIWV8xNWggJiAweGZmY2YpOyAvLyBTZXQgWzVdUnggRGx5LCBbNF1UeCBEbHkgdG8gMA0KKwl9DQorCXBoeV93cml0ZSgyMiwgMHgwMDAwKTsNCisNCisJaWYgKCBCdXJzdEVuYWJsZSApIHsNCisJCXBoeV9SZXNldChsb29wX3BoeSk7DQorCX0gDQorCWVsc2UgaWYgKCBsb29wX3BoeSApIHsNCisJCXBoeV93cml0ZSggMjIsIDB4MDAwMiApOw0KKwkJDQorCQlpZiAoIEdTcGVlZF9zZWxbMF0gKSB7DQorCQkJcGh5X1JlYWRfV3JpdGUoIDIxLCAweDYwNDAsIDB4MDA0MCApOy8vY2xyIHNldA0KKwkJfSANCisJCWVsc2UgaWYgKCBHU3BlZWRfc2VsWzFdICkgew0KKwkJCXBoeV9SZWFkX1dyaXRlKCAyMSwgMHg2MDQwLCAweDIwMDAgKTsvL2NsciBzZXQNCisJCX0gDQorCQllbHNlIHsNCisJCQlwaHlfUmVhZF9Xcml0ZSggMjEsIDB4NjA0MCwgMHgwMDAwICk7Ly9jbHIgc2V0DQorCQl9DQorCQlwaHlfd3JpdGUoIDIyLCAweDAwMDAgKTsNCisJCXBoeV9SZXNldCggbG9vcF9waHkgKTsNCisJfSANCisJZWxzZSB7DQorCQlpZiAoIEdTcGVlZF9zZWxbMF0gKSB7DQorCQkJcGh5X3dyaXRlKCAgMjIsIDB4MDAwNiAgICAgICAgICk7DQorCQkJcGh5X1JlYWRfV3JpdGUoIDE2LCAweDAwMDAsIDB4MDAyMCApOy8vY2xyIHNldA0KKwkJCXBoeV93cml0ZSggIDIyLCAweDAwMDAgICAgICAgICApOw0KKwkJfQ0KKw0KKwkJcGh5X1Jlc2V0KGxvb3BfcGh5KTsNCisJfQ0KKw0KKwlSZXRyeSA9IDA7DQorCWRvIHsNCisJCVBIWV8xMWggPSBwaHlfcmVhZCggUEhZX1NSICk7DQorCX0gd2hpbGUgKCEoKFBIWV8xMWggJiAweDA0MDApIHwgbG9vcF9waHkgfCAoUmV0cnkrKyA+IDIwKSkpOw0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgcmVjb3ZfcGh5X21hcnZlbGwxIChpbnQgbG9vcF9waHkpIHsvLzg4RTYxNzYNCisgICAgQ0hBUiAgICBQSFlfQURSX29yZzsNCisgICAgDQorCVBIWV9BRFJfb3JnID0gUEhZX0FEUjsNCisJZm9yICggUEhZX0FEUiA9IDE2OyBQSFlfQURSIDw9IDIyOyBQSFlfQURSKysgKSB7DQorCQlpZiAoIEJ1cnN0RW5hYmxlICkgew0KKwkJfSANCisJCWVsc2Ugew0KKwkJCXBoeV93cml0ZSg2LCBQSFlfMDZoQVtQSFlfQURSLTE2XSk7Ly8wNmhbNV1QNSBsb29wYmFjaywgMDZoWzZdUDYgbG9vcGJhY2sNCisJCX0NCisJfQ0KKwlmb3IgKCBQSFlfQURSID0gMjE7IFBIWV9BRFIgPD0gMjI7IFBIWV9BRFIrKyApIHsNCisJCXBoeV93cml0ZSgxLCAweDMpOyAvLzAxaFsxOjBdMDAgPSAxMCBNYnBzLCAwMSA9IDEwMCBNYnBzLCAxMCA9IDEwMDAgTWJwcywgMTEgPSBTcGVlZCBpcyBub3QgZm9yY2VkLg0KKwl9DQorCVBIWV9BRFIgPSBQSFlfQURSX29yZzsNCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIHBoeV9tYXJ2ZWxsMSAoaW50IGxvb3BfcGh5KSB7Ly84OEU2MTc2DQorLy8gICAgVUxPTkcJUEhZXzAxaDsNCisgICAgQ0hBUiAgICBQSFlfQURSX29yZzsNCisgICAgDQorCWlmIChEYmdQcm5fUEhZTmFtZSkgDQorCSAgICBwcmludGYgKCItLS0+KCUwNGx4ICUwNGx4KVtNYXJ2ZWxsXSAlc1xuIiwgUEhZX0lEMiwgUEhZX0lEMywgUEhZTmFtZSk7DQorDQorCS8vVGhlIDg4RTYxNzYgaXMgc3dpdGNoIHdpdGggNyBQb3J0KFAwflA2KSBhbmQgdGhlIFBIWUFkciB3aWxsIGJlIGZpeGVkIGF0IDB4MTB+MHgxNiwgYW5kIG9ubHkgUDUvUDYgY2FuIGJlIGNvbm5lY3RlZCB0byB0aGUgTUFDLg0KKwkvL1RoZXJlZm9yLCB0aGUgODhFNjE3NiBvbmx5IGNhbiBydW4gdGhlIGludGVybmFsIGxvb3BiYWNrLg0KKwlQSFlfQURSX29yZyA9IFBIWV9BRFI7DQorCWZvciAoIFBIWV9BRFIgPSAxNjsgUEhZX0FEUiA8PSAyMDsgUEhZX0FEUisrICkgew0KKwkJaWYgKCBCdXJzdEVuYWJsZSApIHsNCisJCX0gDQorCQllbHNlIHsNCisJCQlQSFlfMDZoQVtQSFlfQURSLTE2XSA9IHBoeV9yZWFkKCBQSFlfQU5FUiApOw0KKwkJCXBoeV93cml0ZSg2LCAweDAwKTsvLzA2aFs1XVA1IGxvb3BiYWNrLCAwNmhbNl1QNiBsb29wYmFjaw0KKwkJfQ0KKwl9DQorCQ0KKwlmb3IgKCBQSFlfQURSID0gMjE7IFBIWV9BRFIgPD0gMjI7IFBIWV9BRFIrKyApIHsNCisvLwkJUEhZXzAxaCA9IHBoeV9yZWFkKCBQSFlfUkVHX0JNU1IgKTsNCisvLwkJaWYgICAgICAoR1NwZWVkX3NlbFswXSkgcGh5X3dyaXRlKDEsIChQSFlfMDFoICYgMHhmZmZjKSB8IDB4Mik7Ly9bMTowXTAwID0gMTAgTWJwcywgMDEgPSAxMDAgTWJwcywgMTAgPSAxMDAwIE1icHMsIDExID0gU3BlZWQgaXMgbm90IGZvcmNlZC4NCisvLwkJZWxzZSBpZiAoR1NwZWVkX3NlbFsxXSkgcGh5X3dyaXRlKDEsIChQSFlfMDFoICYgMHhmZmZjKSB8IDB4MSk7Ly9bMTowXTAwID0gMTAgTWJwcywgMDEgPSAxMDAgTWJwcywgMTAgPSAxMDAwIE1icHMsIDExID0gU3BlZWQgaXMgbm90IGZvcmNlZC4NCisvLwkJZWxzZSAgICAgICAgICAgICAgICAgICAgcGh5X3dyaXRlKDEsIChQSFlfMDFoICYgMHhmZmZjKSAgICAgICk7Ly9bMTowXTAwID0gMTAgTWJwcywgMDEgPSAxMDAgTWJwcywgMTAgPSAxMDAwIE1icHMsIDExID0gU3BlZWQgaXMgbm90IGZvcmNlZC4NCisJCWlmICAgICAgKEdTcGVlZF9zZWxbMF0pIHBoeV93cml0ZSgxLCAweDIpOy8vMDFoWzE6MF0wMCA9IDEwIE1icHMsIDAxID0gMTAwIE1icHMsIDEwID0gMTAwMCBNYnBzLCAxMSA9IFNwZWVkIGlzIG5vdCBmb3JjZWQuDQorCQllbHNlIGlmIChHU3BlZWRfc2VsWzFdKSBwaHlfd3JpdGUoMSwgMHgxKTsvLzAxaFsxOjBdMDAgPSAxMCBNYnBzLCAwMSA9IDEwMCBNYnBzLCAxMCA9IDEwMDAgTWJwcywgMTEgPSBTcGVlZCBpcyBub3QgZm9yY2VkLg0KKwkJZWxzZSAgICAgICAgICAgICAgICAgICAgcGh5X3dyaXRlKDEsIDB4MCk7Ly8wMWhbMTowXTAwID0gMTAgTWJwcywgMDEgPSAxMDAgTWJwcywgMTAgPSAxMDAwIE1icHMsIDExID0gU3BlZWQgaXMgbm90IGZvcmNlZC4NCisNCisJCWlmIChCdXJzdEVuYWJsZSkgew0KKwkJfSANCisJCWVsc2Ugew0KKwkJCVBIWV8wNmhBW1BIWV9BRFItMTZdID0gcGh5X3JlYWQoIFBIWV9BTkVSICk7DQorCQkJaWYgKFBIWV9BRFIgPT0gMjEpIHBoeV93cml0ZSg2LCAweDIwKTsvLzA2aFs1XVA1IGxvb3BiYWNrLCAwNmhbNl1QNiBsb29wYmFjaw0KKwkJCWVsc2UgICAgICAgICAgICAgICBwaHlfd3JpdGUoNiwgMHg0MCk7Ly8wNmhbNV1QNSBsb29wYmFjaywgMDZoWzZdUDYgbG9vcGJhY2sNCisJCX0NCisJfQ0KKwlQSFlfQURSID0gUEhZX0FEUl9vcmc7DQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCByZWNvdl9waHlfbWFydmVsbDIgKGludCBsb29wX3BoeSkgey8vODhFMTUxMg0KKwlpZiAoQnVyc3RFbmFibGUpIHsNCisJfSANCisJZWxzZSBpZiAobG9vcF9waHkpIHsNCisJfSANCisJZWxzZSB7DQorCQlpZiAoR1NwZWVkX3NlbFswXSkgew0KKwkJCXBoeV93cml0ZSgyMiwgMHgwMDA2KTsNCisJCQlwaHlfUmVhZF9Xcml0ZSgxOCwgMHgwMDA4LCAweDAwMDApOy8vY2xyIHNldA0KKwkJCXBoeV93cml0ZSgyMiwgMHgwMDAwKTsNCisJCX0NCisJfQ0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgcGh5X21hcnZlbGwyIChpbnQgbG9vcF9waHkpIHsvLzg4RTE1MTINCisgICAgaW50CSAgICBSZXRyeSA9IDA7DQorICAgIFVMT05HICAgdGVtcF9yZWc7DQorDQorCWlmICggRGJnUHJuX1BIWU5hbWUgKSANCisJICAgIHByaW50ZiAoIi0tLT4oJTA0bHggJTA0bHgpW01hcnZlbGxdICVzXG4iLCBQSFlfSUQyLCBQSFlfSUQzLCBQSFlOYW1lKTsNCisNCisJcGh5X3dyaXRlKDIyLCAweDAwMDIpOw0KKwlQSFlfMTVoID0gcGh5X3JlYWQoMjEpOw0KKwkNCisJaWYgKCBQSFlfMTVoICYgMHgwMDMwICkgew0KKwkJcHJpbnRmICgiXG5cbltXYXJuaW5nXSBQYWdlMiwgUmVnaXN0ZXIgMjEsIGJpdCA0fjUgbXVzdCBiZSAwIFtSZWcxNWhfMjolMDRseF1cblxuIiwgUEhZXzE1aCk7DQorI2lmZGVmIFNMVF9ET1MNCisgICAgICAgIGlmIChJT1RpbWluZyAgICApIGZwcmludGYgKGZwX2lvLCAiXG5cbltXYXJuaW5nXSBQYWdlMiwgUmVnaXN0ZXIgMjEsIGJpdCA0fjUgbXVzdCBiZSAwIFtSZWcxNWhfMjolMDRseF1cblxuIiwgUEhZXzE1aCk7DQorCQlpZiAoIUJ1cnN0RW5hYmxlKSBmcHJpbnRmIChmcF9sb2csICJcblxuW1dhcm5pbmddIFBhZ2UyLCBSZWdpc3RlciAyMSwgYml0IDR+NSBtdXN0IGJlIDAgW1JlZzE1aF8yOiUwNGx4XVxuXG4iLCBQSFlfMTVoKTsNCisjZW5kaWYNCisgICAgICAgIC8vCQlwaHlfUmVhZF9Xcml0ZSgyMSwgMHgwMDMwLCAweDAwMDApOy8vY2xyIHNldC8vWzVdUnggRGx5LCBbNF1UeCBEbHkNCisvLwkJcGh5X3dyaXRlKDIxLCBQSFlfMTVoICYgMHhmZmNmKTsNCisJfQ0KKwlwaHlfd3JpdGUoMjIsIDB4MDAwMCk7DQorDQorCWlmICggQnVyc3RFbmFibGUgKSB7DQorCQlwaHlfUmVzZXQobG9vcF9waHkpOw0KKwl9IA0KKwllbHNlIGlmIChsb29wX3BoeSkgew0KKwkgICAgLy8gSW50ZXJuYWwgbG9vcGJhY2sgZnVuY2l0b24gb25seSBzdXBwb3J0IGluIGNvcHBlciBtb2RlDQorCSAgICAvLyBzd2l0Y2ggcGFnZSAxOA0KKwkgICAgcGh5X3dyaXRlKDIyLCAweDAwMTIpOw0KKwkgICAgLy8gQ2hhbmdlIG1vZGUgdG8gQ29wcGVyIG1vZGUNCisJICAgIHBoeV93cml0ZSgyMCwgMHg4MjEwKTsNCisJICAgIC8vIGRvIHNvZnR3YXJlIHJlc2V0DQorCSAgICBkbyB7DQorCSAgICAgICAgdGVtcF9yZWcgPSBwaHlfcmVhZCggMjAgKTsNCisJICAgIH0gd2hpbGUgKCAoICh0ZW1wX3JlZyAmIDB4ODAwMCkgPT0gMHg4MDAwICkgJiAoUmV0cnkrKyA8IDIwKSApOw0KKwkgICAgDQorCSAgICAvLyBzd2l0Y2ggcGFnZSAyDQorCQlwaHlfd3JpdGUoMjIsIDB4MDAwMik7DQorCQlpZiAoR1NwZWVkX3NlbFswXSkgew0KKwkJCXBoeV9SZWFkX1dyaXRlKDIxLCAweDIwNDAsIDB4MDA0MCk7Ly9jbHIgc2V0DQorCQl9IA0KKwkJZWxzZSBpZiAoR1NwZWVkX3NlbFsxXSkgew0KKwkJCXBoeV9SZWFkX1dyaXRlKDIxLCAweDIwNDAsIDB4MjAwMCk7Ly9jbHIgc2V0DQorCQl9IA0KKwkJZWxzZSB7DQorCQkJcGh5X1JlYWRfV3JpdGUoMjEsIDB4MjA0MCwgMHgwMDAwKTsvL2NsciBzZXQNCisJCX0NCisJCXBoeV93cml0ZSgyMiwgMHgwMDAwKTsNCisNCisJCXBoeV9SZXNldChsb29wX3BoeSk7DQorCX0gDQorCWVsc2Ugew0KKwkJaWYgKEdTcGVlZF9zZWxbMF0pIHsNCisJCQlwaHlfd3JpdGUoMjIsIDB4MDAwNik7DQorCQkJcGh5X1JlYWRfV3JpdGUoMTgsIDB4MDAwMCwgMHgwMDA4KTsvL2NsciBzZXQNCisJCQlwaHlfd3JpdGUoMjIsIDB4MDAwMCk7DQorCQl9DQorDQorCQlwaHlfUmVzZXQobG9vcF9waHkpOw0KKwl9DQorDQorCVJldHJ5ID0gMDsNCisJZG8gew0KKwkJUEhZXzExaCA9IHBoeV9yZWFkKCBQSFlfU1IgKTsNCisJfSB3aGlsZSAoISgoUEhZXzExaCAmIDB4MDQwMCkgfCBsb29wX3BoeSB8IChSZXRyeSsrID4gMjApKSk7DQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBwaHlfYnJvYWRjb20gKGludCBsb29wX3BoeSkgey8vQkNNNTIyMQ0KKwlpZiAoRGJnUHJuX1BIWU5hbWUpIA0KKwkgICAgcHJpbnRmICgiLS0tPiglMDRseCAlMDRseClbQnJvYWRjb21dICVzXG4iLCBQSFlfSUQyLCBQSFlfSUQzLCBQSFlOYW1lKTsNCisNCisJcGh5X1Jlc2V0KGxvb3BfcGh5KTsNCisNCisJaWYgKElFRUVUZXN0aW5nKSB7DQorCQlpZiAoSU9UaW1pbmdCdW5kX2FyZyA9PSAwKSB7DQorCQkJcGh5X3dyaXRlKDI1LCAweDFmMDEpOy8vRm9yY2UgTURJICAvL01lYXN1cmluZyBmcm9tIGNoYW5uZWwgQQ0KKwkJfSANCisJCWVsc2Ugew0KKwkJCXBoeV9SZWFkX1dyaXRlKDI0LCAweDAwMDAsIDB4NDAwMCk7Ly9jbHIgc2V0Ly9Gb3JjZSBMaW5rDQorLy8JCQlwaHlfd3JpdGUoIDAsIFBIWV8wMGgpOw0KKy8vCQkJcGh5X3dyaXRlKDMwLCAweDEwMDApOw0KKwkJfQ0KKwl9DQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCByZWNvdl9waHlfYnJvYWRjb20wIChpbnQgbG9vcF9waHkpIHsvL0JDTTU0NjEyDQorDQorICAgIC8vIE5lZWQgdG8gZG8gaXQgZm9yIEFTVDI0MDANCisgICAgcGh5X3dyaXRlKDB4MUMsIDB4OEMwMCk7IC8vIERpc2FibGUgR1RYQ0xLIENsb2NrIERlbGF5IEVuYWJsZQ0KKyAgICBwaHlfd3JpdGUoMHgxOCwgMHhGMEU3KTsgLy8gRGlzYWJsZSBSR01JSSBSWEQgdG8gUlhDIFNrZXcgICAgICAgICAgICANCisNCisgICAgaWYgKEJ1cnN0RW5hYmxlKSB7DQorCX0gDQorCWVsc2UgaWYgKGxvb3BfcGh5KSB7DQorCQlwaHlfd3JpdGUoIDAsIFBIWV8wMGgpOw0KKwl9IA0KKwllbHNlIHsNCisJCXBoeV93cml0ZSgweDAwLCBQSFlfMDBoKTsNCisJCXBoeV93cml0ZSgweDA5LCBQSFlfMDloKTsNCisJCXBoeV93cml0ZSgweDE4LCBQSFlfMThoKTsNCisJfQ0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgcGh5X2Jyb2FkY29tMCAoaW50IGxvb3BfcGh5KSB7Ly9CQ001NDYxMg0KKwlpZiAoIERiZ1Bybl9QSFlOYW1lICkgDQorCSAgICBwcmludGYgKCItLS0+KCUwNGx4ICUwNGx4KVtCcm9hZGNvbV0gJXNcbiIsIFBIWV9JRDIsIFBIWV9JRDMsIFBIWU5hbWUpOw0KKw0KKyAgICAvLyBOZWVkIHRvIGRvIGl0IGZvciBBU1QyNDAwDQorICAgIHBoeV93cml0ZSgweDFDLCAweDhDMDApOyAvLyBEaXNhYmxlIEdUWENMSyBDbG9jayBEZWxheSBFbmFibGUNCisgICAgcGh5X3dyaXRlKDB4MTgsIDB4RjBFNyk7IC8vIERpc2FibGUgUkdNSUkgUlhEIHRvIFJYQyBTa2V3ICAgICAgICAgICAgDQorICAgICAgICANCisgICAgLy8gQmFja3VwIG9yZyB2YWx1ZQ0KKyAgICAvLyByZWFkIHJlZyAxOEgsIFBhZ2UgMTAzLCBCQ001NDYxMkVCMUtNTEdfU3BlYy5wZGYNCisgICAgcGh5X3dyaXRlKDB4MTgsIDB4NzAwNyk7DQorICAgIFBIWV8xOGggPSBwaHlfcmVhZCgweDE4KTsNCisgICAgICAgDQorICAgIFBIWV8wMGggPSBwaHlfcmVhZCggUEhZX1JFR19CTUNSICk7DQorICAgIFBIWV8wOWggPSBwaHlfcmVhZCggUEhZX0dCQ1IgKTsgICANCisgICAgDQorCWlmICggQnVyc3RFbmFibGUgKSB7DQorCQlwaHlfYmFzaWNfc2V0dGluZyhsb29wX3BoeSk7DQorCX0gDQorCWVsc2UgaWYgKGxvb3BfcGh5KSB7DQorCQlwaHlfYmFzaWNfc2V0dGluZyhsb29wX3BoeSk7DQorICAgDQorICAgIC8vIEVuYWJsZSBJbnRlcm5hbCBMb29wYmFjayBtb2RlDQorICAgIC8vIFBhZ2UgNTgsIEJDTTU0NjEyRUIxS01MR19TcGVjLnBkZg0KKyAgICBwaHlfd3JpdGUoMHgwLCAweDUxNDApOw0KKwkJREVMQVkoRGVsYXlfUEhZUnN0KTsNCisgICAgLyogT25seSAxRyBUZXN0IGlzIFBBU1MsIDEwME0gYW5kIDEwTSBpcyBmYWxzZSBAMjAxMzA2MTkgKi8gICAgIA0KKw0KKy8vIFdhaXRpbmcgZm9yIEJDTSBGQUUncyByZXNwb25zZQ0KKy8vICAgICAgICBpZiAoR1NwZWVkX3NlbFswXSkgew0KKy8vICAgICAgICAgICAgLy8gU3BlZWQgMUcNCisvLyAgICAgICAgICAgIC8vIEVuYWJsZSBJbnRlcm5hbCBMb29wYmFjayBtb2RlDQorLy8gICAgICAgICAgICAvLyBQYWdlIDU4LCBCQ001NDYxMkVCMUtNTEdfU3BlYy5wZGYNCisvLyAgICAgICAgICAgIHBoeV93cml0ZSgweDAsIDB4NTE0MCk7DQorLy8gICAgICAgIH0gDQorLy8gICAgICAgIGVsc2UgaWYgKEdTcGVlZF9zZWxbMV0pIHsNCisvLyAgICAgICAgICAgIC8vIFNwZWVkIDEwME0NCisvLyAgICAgICAgICAgIC8vIEVuYWJsZSBJbnRlcm5hbCBMb29wYmFjayBtb2RlDQorLy8gICAgICAgICAgICAvLyBQYWdlIDU4LCBCQ001NDYxMkVCMUtNTEdfU3BlYy5wZGYNCisvLyAgICAgICAgICAgIHBoeV93cml0ZSgweDAsIDB4NzEwMCk7DQorLy8gICAgICAgICAgICBwaHlfd3JpdGUoMHgxRSwgMHgxMDAwKTsNCisvLyAgICAgICAgfSANCisvLyAgICAgICAgZWxzZSBpZiAoR1NwZWVkX3NlbFsyXSkgew0KKy8vICAgICAgICAgICAgLy8gU3BlZWQgMTBNDQorLy8gICAgICAgICAgICAvLyBFbmFibGUgSW50ZXJuYWwgTG9vcGJhY2sgbW9kZQ0KKy8vICAgICAgICAgICAgLy8gUGFnZSA1OCwgQkNNNTQ2MTJFQjFLTUxHX1NwZWMucGRmDQorLy8gICAgICAgICAgICBwaHlfd3JpdGUoMHgwLCAweDUxMDApOw0KKy8vICAgICAgICAgICAgcGh5X3dyaXRlKDB4MUUsIDB4MTAwMCk7DQorLy8gICAgICAgIH0NCisvLyAgICAgICAgICAgIA0KKy8vCQlERUxBWShEZWxheV9QSFlSc3QpOw0KKyAgICB9IA0KKwllbHNlIHsNCisgICAgICANCisJCWlmIChHU3BlZWRfc2VsWzBdKSB7DQorICAgICAgICAgICAgLy8gUGFnZSA2MCwgQkNNNTQ2MTJFQjFLTUxHX1NwZWMucGRmDQorICAgICAgICAgICAgLy8gbmVlZCB0byBpbnNlcnQgbG9vcGJhY2sgcGx1Zw0KKwkJCXBoeV93cml0ZSggOSwgMHgxODAwKTsNCisJCQlwaHlfd3JpdGUoIDAsIDB4MDE0MCk7DQorICAgICAgICAgICAgcGh5X3dyaXRlKCAweDE4LCAweDg0MDApOyAvLyBFbmFibGUgVHJhbnNtaXQgdGVzdCBtb2RlDQorCQl9IGVsc2UgaWYgKEdTcGVlZF9zZWxbMV0pIHsNCisgICAgICAgICAgICAvLyBQYWdlIDYwLCBCQ001NDYxMkVCMUtNTEdfU3BlYy5wZGYNCisgICAgICAgICAgICAvLyBuZWVkIHRvIGluc2VydCBsb29wYmFjayBwbHVnDQorCQkJcGh5X3dyaXRlKCAwLCAweDIxMDApOw0KKyAgICAgICAgICAgIHBoeV93cml0ZSggMHgxOCwgMHg4NDAwKTsgLy8gRW5hYmxlIFRyYW5zbWl0IHRlc3QgbW9kZSAgICAgICAgICAgIA0KKwkJfSBlbHNlIHsNCisgICAgICAgICAgICAvLyBQYWdlIDYwLCBCQ001NDYxMkVCMUtNTEdfU3BlYy5wZGYNCisgICAgICAgICAgICAvLyBuZWVkIHRvIGluc2VydCBsb29wYmFjayBwbHVnDQorCQkJcGh5X3dyaXRlKCAwLCAweDAxMDApOw0KKyAgICAgICAgICAgIHBoeV93cml0ZSggMHgxOCwgMHg4NDAwKTsgLy8gRW5hYmxlIFRyYW5zbWl0IHRlc3QgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCX0NCisJfQ0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgcGh5X3JlYWx0ZWsgKGludCBsb29wX3BoeSkgey8vUlRMODIwMU4NCisJaWYgKCBEYmdQcm5fUEhZTmFtZSApIA0KKwkgICAgcHJpbnRmICgiLS0tPiglMDRseCAlMDRseClbUmVhbHRla10gJXNcbiIsIFBIWV9JRDIsIFBIWV9JRDMsIFBIWU5hbWUpOw0KKw0KKwlwaHlfUmVzZXQobG9vcF9waHkpOw0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8vaW50ZXJuYWwgbG9vcCAxMDBNOiBEb24ndCBzdXBwb3J0DQorLy9pbnRlcm5hbCBsb29wIDEwTSA6IG5vICBsb29wYmFjayBzdHViDQordm9pZCBwaHlfcmVhbHRlazAgKGludCBsb29wX3BoeSkgey8vUlRMODIwMUUNCisJaWYgKCBEYmdQcm5fUEhZTmFtZSApIA0KKwkgICAgcHJpbnRmICgiLS0tPiglMDRseCAlMDRseClbUmVhbHRla10gJXNcbiIsIFBIWV9JRDIsIFBIWV9JRDMsIFBIWU5hbWUpOw0KKw0KKwlwaHlfUmVzZXQobG9vcF9waHkpOw0KKw0KKy8vCXBoeV9SZWFkX1dyaXRlKDI1LCAweDI4MDAsIDB4MDAwMCk7Ly9jbHIgc2V0DQorLy8JcHJpbnRmKCJFbmFibGUgcGh5IG91dHB1dCBSTUlJIGNsb2NrXG4iKTsNCisJaWYgKElFRUVUZXN0aW5nKSB7DQorCQlwaHlfd3JpdGUoMzEsIDB4MDAwMSk7DQorCQlpZiAoSU9UaW1pbmdCdW5kX2FyZyA9PSAwKSB7DQorCQkJcGh5X3dyaXRlKDI1LCAweDFmMDEpOy8vRm9yY2UgTURJICAvL01lYXN1cmluZyBmcm9tIGNoYW5uZWwgQQ0KKwkJfSANCisJCWVsc2Ugew0KKwkJCXBoeV93cml0ZSgyNSwgMHgxZjAwKTsvL0ZvcmNlIE1ESVggLy9NZWFzdXJpbmcgZnJvbSBjaGFubmVsIEINCisJCX0NCisJCXBoeV93cml0ZSgzMSwgMHgwMDAwKTsNCisJfQ0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgcmVjb3ZfcGh5X3JlYWx0ZWsxIChpbnQgbG9vcF9waHkpIHsvL1JUTDgyMTFEDQorCWlmICggQnVyc3RFbmFibGUgKSB7DQorCQlpZiAoIElFRUVUZXN0aW5nICkgew0KKwkJCWlmICggR1NwZWVkX3NlbFswXSApIHsNCisJCQkJaWYgKElPVGltaW5nQnVuZF9hcmcgPT0gMCkgew0KKwkJCQkJLy9UZXN0IE1vZGUgMQ0KKwkJCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDAyICk7DQorCQkJCQlwaHlfd3JpdGUoICAyLCAweGMyMDMgKTsNCisJCQkJCXBoeV93cml0ZSggMzEsIDB4MDAwMCApOw0KKwkJCQkJcGh5X3dyaXRlKCAgOSwgMHgwMDAwICk7DQorCQkJCX0gDQorCQkJCWVsc2Ugew0KKwkJCQkJLy9UZXN0IE1vZGUgNA0KKwkJCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDAwICk7DQorCQkJCQlwaHlfd3JpdGUoICA5LCAweDAwMDAgKTsNCisJCQkJfQ0KKw0KKwkJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDAgKTsNCisJCQl9IA0KKwkJCWVsc2UgaWYgKCBHU3BlZWRfc2VsWzFdICkgew0KKwkJCQlwaHlfd3JpdGUoIDIzLCAweDIxMDAgKTsNCisJCQkJcGh5X3dyaXRlKCAxNiwgMHgwMTZlICk7DQorCQkJfSANCisJCQllbHNlIHsNCisvLwkJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDYgKTsNCisvLwkJCQlwaHlfd3JpdGUoICAwLCAweDVhMDAgKTsNCisvLwkJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDAgKTsNCisJCQl9DQorCQl9IC8vIEVuZCBpZiAoIElFRUVUZXN0aW5nICkNCisJfSANCisJZWxzZSBpZiAobG9vcF9waHkpIHsNCisJCWlmICggR1NwZWVkX3NlbFswXSApIHsNCisJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDAgKTsgLy8gbmV3IGluIFJldi4gMS42DQorCQkJcGh5X3dyaXRlKCAgMCwgMHgxMTQwICk7IC8vIG5ldyBpbiBSZXYuIDEuNg0KKwkJCXBoeV93cml0ZSggMjAsIDB4ODA0MCApOyAvLyBuZXcgaW4gUmV2LiAxLjYNCisJCX0NCisJfSANCisJZWxzZSB7DQorCQlpZiAoIEdTcGVlZF9zZWxbMF0gKSB7DQorCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDAxICk7DQorCQkJcGh5X3dyaXRlKCAgMywgMHhkZjQxICk7DQorCQkJcGh5X3dyaXRlKCAgMiwgMHhkZjIwICk7DQorCQkJcGh5X3dyaXRlKCAgMSwgMHgwMTQwICk7DQorCQkJcGh5X3dyaXRlKCAgMCwgMHgwMGJiICk7DQorCQkJcGh5X3dyaXRlKCAgNCwgMHhiODAwICk7DQorCQkJcGh5X3dyaXRlKCAgNCwgMHhiMDAwICk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDAwICk7DQorLy8JCQlwaHlfd3JpdGUoIDI2LCAweDAwMjAgKTsgLy8gUmV2LiAxLjINCisJCQlwaHlfd3JpdGUoIDI2LCAweDAwNDAgKTsgLy8gbmV3IGluIFJldi4gMS42DQorCQkJcGh5X3dyaXRlKCAgMCwgMHgxMTQwICk7ICAgIA0KKy8vCQkJcGh5X3dyaXRlKCAyMSwgMHgwMDA2ICk7IC8vIFJldi4gMS4yDQorCQkJcGh5X3dyaXRlKCAyMSwgMHgxMDA2ICk7IC8vIG5ldyBpbiBSZXYuIDEuNg0KKwkJCXBoeV93cml0ZSggMjMsIDB4MjEwMCApOyANCisvLwkJfSBlbHNlIGlmICggR1NwZWVkX3NlbFsxXSApIHsvL29wdGlvbg0KKy8vCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDAwICk7DQorLy8JCQlwaHlfd3JpdGUoICA5LCAweDAyMDAgKTsNCisvLwkJCXBoeV93cml0ZSggIDAsIDB4MTIwMCApOw0KKy8vCQl9IGVsc2UgaWYgKCBHU3BlZWRfc2VsWzJdICkgey8vb3B0aW9uDQorLy8JCQlwaHlfd3JpdGUoIDMxLCAweDAwMDAgKTsNCisvLwkJCXBoeV93cml0ZSggIDksIDB4MDIwMCApOw0KKy8vCQkJcGh5X3dyaXRlKCAgNCwgMHgwNWUxICk7DQorLy8JCQlwaHlfd3JpdGUoICAwLCAweDEyMDAgKTsNCisJCX0NCisJfSAvLyBFbmQgaWYgKCBCdXJzdEVuYWJsZSApDQorfSAvLyBFbmQgdm9pZCByZWNvdl9waHlfcmVhbHRlazEgKGludCBsb29wX3BoeSkNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8vaW50ZXJuYWwgbG9vcCAxRyAgOiBubyAgbG9vcGJhY2sgc3R1Yg0KKy8vaW50ZXJuYWwgbG9vcCAxMDBNOiBubyAgbG9vcGJhY2sgc3R1Yg0KKy8vaW50ZXJuYWwgbG9vcCAxME0gOiBubyAgbG9vcGJhY2sgc3R1Yg0KK3ZvaWQgcGh5X3JlYWx0ZWsxIChpbnQgbG9vcF9waHkpIHsvL1JUTDgyMTFEDQorCWlmICggRGJnUHJuX1BIWU5hbWUgKSANCisJICAgIHByaW50ZiAoIi0tLT4oJTA0bHggJTA0bHgpW1JlYWx0ZWtdICVzXG4iLCBQSFlfSUQyLCBQSFlfSUQzLCBQSFlOYW1lKTsNCisgICAgICAgICANCisJaWYgKCBCdXJzdEVuYWJsZSApIHsNCisJCWlmICggSUVFRVRlc3RpbmcgKSB7DQorCQkJaWYgKCBHU3BlZWRfc2VsWzBdICkgew0KKwkJCQlpZiAoSU9UaW1pbmdCdW5kX2FyZyA9PSAwKSB7DQorCQkJCQkvL1Rlc3QgTW9kZSAxDQorCQkJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDIgKTsNCisJCQkJCXBoeV93cml0ZSggIDIsIDB4YzIyYiApOw0KKwkJCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDAwICk7DQorCQkJCQlwaHlfd3JpdGUoICA5LCAweDIwMDAgKTsNCisJCQkJfSANCisJCQkJZWxzZSB7DQorCQkJCQkvL1Rlc3QgTW9kZSA0DQorCQkJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDAgKTsNCisJCQkJCXBoeV93cml0ZSggIDksIDB4ODAwMCApOw0KKwkJCQl9DQorCQkJCXBoeV93cml0ZSggMzEsIDB4MDAwMCApOw0KKwkJCX0gDQorCQkJZWxzZSBpZiAoIEdTcGVlZF9zZWxbMV0gKSB7DQorCQkJCWlmICggSU9UaW1pbmdCdW5kX2FyZyA9PSAwICkgew0KKwkJCQkJLy9Gcm9tIENoYW5uZWwgQQ0KKwkJCQkJcGh5X3dyaXRlKCAyMywgMHhhMTAyICk7DQorCQkJCQlwaHlfd3JpdGUoIDE2LCAweDAxYWUgKTsvL01ESQ0KKwkJCQl9IA0KKwkJCQllbHNlIHsNCisJCQkJCS8vRnJvbSBDaGFubmVsIEINCisJCQkJCXBoeV9SZWFkX1dyaXRlKCAxNywgMHgwMDA4LCAweDAwMDAgKTsgLy8gY2xyIHNldA0KKwkJCQkJcGh5X3dyaXRlKCAgMjMsIDB4YTEwMiApOyAgICAgICAgIC8vIE1ESQ0KKwkJCQkJcGh5X3dyaXRlKCAgMTYsIDB4MDEwZSApOw0KKwkJCQl9DQorCQkJfSBlbHNlIHsNCisvLwkJCQlpZiAoIElPVGltaW5nQnVuZF9hcmcgPT0gMCApIHsvL1BzZXVkby1yYW5kb20gcGF0dGVybg0KKy8vCQkJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDYgKTsNCisvLwkJCQkJcGh5X3dyaXRlKCAgMCwgMHg1YTIxICk7DQorLy8JCQkJCXBoeV93cml0ZSggMzEsIDB4MDAwMCApOw0KKy8vCQkJCX0gDQorLy8gICAgICAgICAgICAgIGVsc2UgaWYgKCBJT1RpbWluZ0J1bmRfYXJnID09IDEgKSB7Ly+hp0ZGoaggcGF0dGVybg0KKy8vCQkJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDYgKTsNCisvLwkJCQkJcGh5X3dyaXRlKCAgMiwgMHgwNWVlICk7DQorLy8JCQkJCXBoeV93cml0ZSggIDAsIDB4ZmYyMSApOw0KKy8vCQkJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDAgKTsNCisvLwkJCQl9IGVsc2Ugey8voacwMKGoIHBhdHRlcm4NCisvLwkJCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDA2ICk7DQorLy8JCQkJCXBoeV93cml0ZSggIDIsIDB4MDVlZSApOw0KKy8vCQkJCQlwaHlfd3JpdGUoICAwLCAweDAwMjEgKTsNCisvLwkJCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDAwICk7DQorLy8JCQkJfQ0KKwkJCX0NCisJCX0gDQorCQllbHNlIHsNCisJCQlwaHlfUmVzZXQobG9vcF9waHkpOw0KKwkJfQ0KKwl9IA0KKwllbHNlIGlmICggbG9vcF9waHkgKSB7DQorCQlwaHlfUmVzZXQobG9vcF9waHkpOw0KKwkJDQorCQlpZiAoIEdTcGVlZF9zZWxbMF0gKSB7DQorCQkJcGh5X3dyaXRlKDIwLCAweDAwNDIpOy8vbmV3IGluIFJldi4gMS42DQorCQl9DQorCX0gDQorCWVsc2Ugew0KKwkJaWYgKCBHU3BlZWRfc2VsWzBdICkgew0KKwkJCXBoeV93cml0ZSggMzEsIDB4MDAwMSApOw0KKwkJCXBoeV93cml0ZSggIDMsIDB4ZmY0MSApOw0KKwkJCXBoeV93cml0ZSggIDIsIDB4ZDcyMCApOw0KKwkJCXBoeV93cml0ZSggIDEsIDB4MDE0MCApOw0KKwkJCXBoeV93cml0ZSggIDAsIDB4MDBiYiApOw0KKwkJCXBoeV93cml0ZSggIDQsIDB4YjgwMCApOw0KKwkJCXBoeV93cml0ZSggIDQsIDB4YjAwMCApOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCXBoeV93cml0ZSggMzEsIDB4MDAwNyApOw0KKwkJCXBoeV93cml0ZSggMzAsIDB4MDA0MCApOw0KKwkJCXBoeV93cml0ZSggMjQsIDB4MDAwOCApOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCXBoeV93cml0ZSggMzEsIDB4MDAwMCApOw0KKwkJCXBoeV93cml0ZSggIDksIDB4MDMwMCApOw0KKwkJCXBoeV93cml0ZSggMjYsIDB4MDAyMCApOw0KKwkJCXBoeV93cml0ZSggIDAsIDB4MDE0MCApOw0KKwkJCXBoeV93cml0ZSggMjMsIDB4YTEwMSApOw0KKwkJCXBoeV93cml0ZSggMjEsIDB4MDIwMCApOw0KKwkJCXBoeV93cml0ZSggMjMsIDB4YTEyMSApOw0KKwkJCXBoeV93cml0ZSggMjMsIDB4YTE2MSApOw0KKwkJCXBoeV93cml0ZSggIDAsIDB4ODAwMCApOw0KKwkJCXBoeV9XYWl0X1Jlc2V0X0RvbmUoKTsNCisJCQlwaHlfZGVsYXkoMjAwKTsgLy8gbmV3IGluIFJldi4gMS42DQorLy8JCX0gDQorLy8gICAgICBlbHNlIGlmICggR1NwZWVkX3NlbFsxXSApIHsvL29wdGlvbg0KKy8vCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDAwICk7DQorLy8JCQlwaHlfd3JpdGUoICA5LCAweDAwMDAgKTsNCisvLwkJCXBoeV93cml0ZSggIDQsIDB4MDA2MSApOw0KKy8vCQkJcGh5X3dyaXRlKCAgMCwgMHgxMjAwICk7DQorLy8JCQlwaHlfZGVsYXkoNTAwMCk7DQorLy8JCX0gDQorLy8gICAgICBlbHNlIGlmIChHU3BlZWRfc2VsWzJdKSB7Ly9vcHRpb24NCisvLwkJCXBoeV93cml0ZSggMzEsIDB4MDAwMCApOw0KKy8vCQkJcGh5X3dyaXRlKCAgOSwgMHgwMDAwICk7DQorLy8JCQlwaHlfd3JpdGUoICA0LCAweDA1ZTEgKTsNCisvLwkJCXBoeV93cml0ZSggIDAsIDB4MTIwMCApOw0KKy8vCQkJcGh5X2RlbGF5KDUwMDApOw0KKwkJfSANCisJCWVsc2Ugew0KKwkJCXBoeV9SZXNldChsb29wX3BoeSk7DQorCQl9DQorCX0NCit9IC8vIEVuZCB2b2lkIHBoeV9yZWFsdGVrMSAoaW50IGxvb3BfcGh5KQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCByZWNvdl9waHlfcmVhbHRlazIgKGludCBsb29wX3BoeSkgey8vUlRMODIxMUUNCisJaWYgKCBCdXJzdEVuYWJsZSApIHsNCisJCWlmICggSUVFRVRlc3RpbmcgKSB7DQorCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDA1ICk7DQorCQkJcGh5X3dyaXRlKCAgNSwgMHg4Yjg2ICk7DQorCQkJcGh5X3dyaXRlKCAgNiwgMHhlMjAxICk7DQorCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDA3ICk7DQorCQkJcGh5X3dyaXRlKCAzMCwgMHgwMDIwICk7DQorCQkJcGh5X3dyaXRlKCAyMSwgMHgxMTA4ICk7DQorCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDAwICk7DQorDQorCQkJaWYgKCBHU3BlZWRfc2VsWzBdICkgew0KKwkJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDAgKTsNCisJCQkJcGh5X3dyaXRlKCAgOSwgMHgwMDAwICk7DQorCQkJfSANCisJCQllbHNlIGlmICggR1NwZWVkX3NlbFsxXSApIHsNCisJCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDA3ICk7DQorCQkJCXBoeV93cml0ZSggMzAsIDB4MDAyZiApOw0KKwkJCQlwaHlfd3JpdGUoIDIzLCAweGQ4OGYgKTsNCisJCQkJcGh5X3dyaXRlKCAzMCwgMHgwMDJkICk7DQorCQkJCXBoeV93cml0ZSggMjQsIDB4ZjA1MCApOw0KKwkJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDAgKTsNCisJCQkJcGh5X3dyaXRlKCAxNiwgMHgwMDZlICk7DQorCQkJfSANCisJCQllbHNlIHsNCisJCQl9DQorCQl9IA0KKwkJZWxzZSB7DQorCQl9DQorCX0gDQorCWVsc2UgaWYgKGxvb3BfcGh5KSB7DQorCX0gDQorCWVsc2Ugew0KKwkJaWYgKEdTcGVlZF9zZWxbMF0pIHsNCisJCQkvL1JldiAxLjUgIC8vbm90IHN0YWJsZQ0KKy8vCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDAwICk7DQorLy8JCQlwaHlfd3JpdGUoICAwLCAweDgwMDAgKTsNCisvLwkJCXBoeV9XYWl0X1Jlc2V0X0RvbmUoKTsNCisvLwkJCXBoeV9kZWxheSgzMCk7DQorLy8JCQlwaHlfd3JpdGUoIDIzLCAweDIxNjAgKTsNCisvLwkJCXBoeV93cml0ZSggMzEsIDB4MDAwNyApOw0KKy8vCQkJcGh5X3dyaXRlKCAzMCwgMHgwMDQwICk7DQorLy8JCQlwaHlfd3JpdGUoIDI0LCAweDAwMDQgKTsNCisvLwkJCXBoeV93cml0ZSggMjQsIDB4MWEyNCApOw0KKy8vCQkJcGh5X3dyaXRlKCAyNSwgMHhmZDAwICk7DQorLy8JCQlwaHlfd3JpdGUoIDI0LCAweDAwMDAgKTsNCisvLwkJCXBoeV93cml0ZSggMzEsIDB4MDAwMCApOw0KKy8vCQkJcGh5X3dyaXRlKCAgMCwgMHgxMTQwICk7DQorLy8JCQlwaHlfd3JpdGUoIDI2LCAweDAwNDAgKTsNCisvLwkJCXBoeV93cml0ZSggMzEsIDB4MDAwNyApOw0KKy8vCQkJcGh5X3dyaXRlKCAzMCwgMHgwMDJmICk7DQorLy8JCQlwaHlfd3JpdGUoIDIzLCAweGQ4OGYgKTsNCisvLwkJCXBoeV93cml0ZSggMzAsIDB4MDAyMyApOw0KKy8vCQkJcGh5X3dyaXRlKCAyMiwgMHgwMzAwICk7DQorLy8JCQlwaHlfd3JpdGUoIDMxLCAweDAwMDAgKTsNCisvLwkJCXBoeV93cml0ZSggMjEsIDB4MTAwNiApOw0KKy8vCQkJcGh5X3dyaXRlKCAyMywgMHgyMTAwICk7DQorLyoqLw0KKwkJCS8vUmV2IDEuNg0KKwkJCXBoeV93cml0ZSggMzEsIDB4MDAwMCApOw0KKwkJCXBoeV93cml0ZSggIDAsIDB4ODAwMCApOw0KKwkJCXBoeV9XYWl0X1Jlc2V0X0RvbmUoKTsNCisJCQlwaHlfZGVsYXkoMzApOw0KKwkJCXBoeV93cml0ZSggMzEsIDB4MDAwNyApOw0KKwkJCXBoeV93cml0ZSggMzAsIDB4MDA0MiApOw0KKwkJCXBoeV93cml0ZSggMjEsIDB4MDUwMCApOw0KKwkJCXBoeV93cml0ZSggMzEsIDB4MDAwMCApOw0KKwkJCXBoeV93cml0ZSggIDAsIDB4MTE0MCApOw0KKwkJCXBoeV93cml0ZSggMjYsIDB4MDA0MCApOw0KKwkJCXBoeV93cml0ZSggMzEsIDB4MDAwNyApOw0KKwkJCXBoeV93cml0ZSggMzAsIDB4MDAyZiApOw0KKwkJCXBoeV93cml0ZSggMjMsIDB4ZDg4ZiApOw0KKwkJCXBoeV93cml0ZSggMzAsIDB4MDAyMyApOw0KKwkJCXBoeV93cml0ZSggMjIsIDB4MDMwMCApOw0KKwkJCXBoeV93cml0ZSggMzEsIDB4MDAwMCApOw0KKwkJCXBoeV93cml0ZSggMjEsIDB4MTAwNiApOw0KKwkJCXBoeV93cml0ZSggMjMsIDB4MjEwMCApOw0KKy8qKi8NCisvLwkJfSBlbHNlIGlmIChHU3BlZWRfc2VsWzFdKSB7Ly9vcHRpb24NCisvLwkJCXBoeV93cml0ZSggMzEsIDB4MDAwMCApOw0KKy8vCQkJcGh5X3dyaXRlKCAgOSwgMHgwMjAwICk7DQorLy8JCQlwaHlfd3JpdGUoICAwLCAweDEyMDAgKTsNCisvLwkJfSBlbHNlIGlmIChHU3BlZWRfc2VsWzJdKSB7Ly9vcHRpb24NCisvLwkJCXBoeV93cml0ZSggMzEsIDB4MDAwMCApOw0KKy8vCQkJcGh5X3dyaXRlKCAgOSwgMHgwMjAwICk7DQorLy8JCQlwaHlfd3JpdGUoICA0LCAweDA1ZTEgKTsNCisvLwkJCXBoeV93cml0ZSggIDAsIDB4MTIwMCApOw0KKwkJfQ0KKwl9DQorfSAvLyBFbmQgdm9pZCByZWNvdl9waHlfcmVhbHRlazIgKGludCBsb29wX3BoeSkNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8vaW50ZXJuYWwgbG9vcCAxRyAgOiBubyAgbG9vcGJhY2sgc3R1Yg0KKy8vaW50ZXJuYWwgbG9vcCAxMDBNOiBubyAgbG9vcGJhY2sgc3R1Yg0KKy8vaW50ZXJuYWwgbG9vcCAxME0gOiBubyAgbG9vcGJhY2sgc3R1Yg0KK3ZvaWQgcGh5X3JlYWx0ZWsyIChpbnQgbG9vcF9waHkpIHsvL1JUTDgyMTFFDQorDQorCWlmICggRGJnUHJuX1BIWU5hbWUgKSANCisJICAgIHByaW50ZiAoIi0tLT4oJTA0bHggJTA0bHgpW1JlYWx0ZWtdICVzXG4iLCBQSFlfSUQyLCBQSFlfSUQzLCBQSFlOYW1lKTsNCisNCisJcGh5X1JlYWRfV3JpdGUoIDAsICAweDAwMDAsIDB4ODAwMCB8IFBIWV8wMGggKTsgLy8gY2xyIHNldCAvLyBSc3QgUEhZDQorCXBoeV9XYWl0X1Jlc2V0X0RvbmUoKTsNCisJcGh5X2RlbGF5KDMwKTsNCisNCisJaWYgKCBCdXJzdEVuYWJsZSApIHsNCisJCWlmICggSUVFRVRlc3RpbmcgKSB7DQorCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDA1ICk7DQorCQkJcGh5X3dyaXRlKCAgNSwgMHg4Yjg2ICk7DQorCQkJcGh5X3dyaXRlKCAgNiwgMHhlMjAwICk7DQorCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDA3ICk7DQorCQkJcGh5X3dyaXRlKCAzMCwgMHgwMDIwICk7DQorCQkJcGh5X3dyaXRlKCAyMSwgMHgwMTA4ICk7DQorCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDAwICk7DQorDQorCQkJaWYgKCBHU3BlZWRfc2VsWzBdICkgew0KKwkJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDAgKTsNCisJCQkJDQorCQkJCWlmICggSU9UaW1pbmdCdW5kX2FyZyA9PSAwICkgew0KKwkJCQkJcGh5X3dyaXRlKCA5LCAweDIwMDApOy8vVGVzdCBNb2RlIDENCisJCQkJfSANCisJCQkJZWxzZSB7DQorCQkJCQlwaHlfd3JpdGUoIDksIDB4ODAwMCk7Ly9UZXN0IE1vZGUgNA0KKwkJCQl9DQorCQkJfSANCisJCQllbHNlIGlmICggR1NwZWVkX3NlbFsxXSApIHsNCisJCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDA3ICk7DQorCQkJCXBoeV93cml0ZSggMzAsIDB4MDAyZiApOw0KKwkJCQlwaHlfd3JpdGUoIDIzLCAweGQ4MTggKTsNCisJCQkJcGh5X3dyaXRlKCAzMCwgMHgwMDJkICk7DQorCQkJCXBoeV93cml0ZSggMjQsIDB4ZjA2MCApOw0KKwkJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDAgKTsNCisJCQkJDQorCQkJCWlmICggSU9UaW1pbmdCdW5kX2FyZyA9PSAwICkgew0KKwkJCQkJcGh5X3dyaXRlKDE2LCAweDAwYWUpOy8vRnJvbSBDaGFubmVsIEENCisJCQkJfSANCisJCQkJZWxzZSB7DQorCQkJCQlwaHlfd3JpdGUoMTYsIDB4MDA4ZSk7Ly9Gcm9tIENoYW5uZWwgQg0KKwkJCQl9DQorCQkJfSANCisJCQllbHNlIHsNCisJCQl9DQorCQl9IA0KKwkJZWxzZSB7DQorCQkJcGh5X2Jhc2ljX3NldHRpbmcobG9vcF9waHkpOw0KKwkJCXBoeV9kZWxheSgzMCk7DQorCQl9DQorCX0gDQorCWVsc2UgaWYgKGxvb3BfcGh5KSB7DQorCQlwaHlfYmFzaWNfc2V0dGluZyhsb29wX3BoeSk7DQorDQorCQlwaHlfUmVhZF9Xcml0ZSgwLCAgMHgwMDAwLCAweDgwMDAgfCBQSFlfMDBoKTsvL2NsciBzZXQvL1JzdCBQSFkNCisJCXBoeV9XYWl0X1Jlc2V0X0RvbmUoKTsNCisJCXBoeV9kZWxheSgzMCk7DQorDQorCQlwaHlfYmFzaWNfc2V0dGluZyhsb29wX3BoeSk7DQorCQlwaHlfZGVsYXkoMzApOw0KKwl9IA0KKwllbHNlIHsNCisJCWlmICggR1NwZWVkX3NlbFswXSApIHsNCisJCQkvL1JldiAxLjUgIC8vbm90IHN0YWJsZQ0KKy8vCQkJcGh5X3dyaXRlKCAyMywgMHgyMTYwICk7DQorLy8JCQlwaHlfd3JpdGUoIDMxLCAweDAwMDcgKTsNCisvLwkJCXBoeV93cml0ZSggMzAsIDB4MDA0MCApOw0KKy8vCQkJcGh5X3dyaXRlKCAyNCwgMHgwMDA0ICk7DQorLy8JCQlwaHlfd3JpdGUoIDI0LCAweDFhMjQgKTsNCisvLwkJCXBoeV93cml0ZSggMjUsIDB4N2QwMCApOw0KKy8vCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDAwICk7DQorLy8JCQlwaHlfd3JpdGUoIDIzLCAweDIxMDAgKTsNCisvLwkJCXBoeV93cml0ZSggMzEsIDB4MDAwNyApOw0KKy8vCQkJcGh5X3dyaXRlKCAzMCwgMHgwMDQwICk7DQorLy8JCQlwaHlfd3JpdGUoIDI0LCAweDAwMDAgKTsNCisvLwkJCXBoeV93cml0ZSggMzAsIDB4MDAyMyApOw0KKy8vCQkJcGh5X3dyaXRlKCAyMiwgMHgwMDA2ICk7DQorLy8JCQlwaHlfd3JpdGUoIDMxLCAweDAwMDAgKTsNCisvLwkJCXBoeV93cml0ZSggIDAsIDB4MDE0MCApOw0KKy8vCQkJcGh5X3dyaXRlKCAyNiwgMHgwMDYwICk7DQorLy8JCQlwaHlfd3JpdGUoIDMxLCAweDAwMDcgKTsNCisvLwkJCXBoeV93cml0ZSggMzAsIDB4MDAyZiApOw0KKy8vCQkJcGh5X3dyaXRlKCAyMywgMHhkODIwICk7DQorLy8JCQlwaHlfd3JpdGUoIDMxLCAweDAwMDAgKTsNCisvLwkJCXBoeV93cml0ZSggMjEsIDB4MDIwNiApOw0KKy8vCQkJcGh5X3dyaXRlKCAyMywgMHgyMTIwICk7DQorLy8JCQlwaHlfd3JpdGUoIDIzLCAweDIxNjAgKTsNCisvKiovICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAvL1JldiAxLjYgICAgICAgICAgICAgICAgICAgICANCisJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDcgKTsNCisJCQlwaHlfd3JpdGUoIDMwLCAweDAwNDIgKTsNCisJCQlwaHlfd3JpdGUoIDIxLCAweDI1MDAgKTsNCisJCQlwaHlfd3JpdGUoIDMwLCAweDAwMjMgKTsNCisJCQlwaHlfd3JpdGUoIDIyLCAweDAwMDYgKTsNCisJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDAgKTsNCisJCQlwaHlfd3JpdGUoICAwLCAweDAxNDAgKTsNCisJCQlwaHlfd3JpdGUoIDI2LCAweDAwNjAgKTsNCisJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDcgKTsNCisJCQlwaHlfd3JpdGUoIDMwLCAweDAwMmYgKTsNCisJCQlwaHlfd3JpdGUoIDIzLCAweGQ4MjAgKTsNCisJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDAgKTsNCisJCQlwaHlfd3JpdGUoIDIxLCAweDAyMDYgKTsNCisJCQlwaHlfd3JpdGUoIDIzLCAweDIxMjAgKTsNCisJCQlwaHlfd3JpdGUoIDIzLCAweDIxNjAgKTsNCisJCQlwaHlfZGVsYXkoMzAwKTsNCisvKiovDQorLy8JCX0gDQorLy8gICAgICBlbHNlIGlmICggR1NwZWVkX3NlbFsxXSApIHsvL29wdGlvbg0KKy8vCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDAwICk7DQorLy8JCQlwaHlfd3JpdGUoICA5LCAweDAwMDAgKTsNCisvLwkJCXBoeV93cml0ZSggIDQsIDB4MDA2MSApOw0KKy8vCQkJcGh5X3dyaXRlKCAgMCwgMHgxMjAwICk7DQorLy8JCQlwaHlfZGVsYXkoNTAwMCk7DQorLy8JCX0gDQorLy8gICAgICBlbHNlIGlmICggR1NwZWVkX3NlbFsyXSApIHsvL29wdGlvbg0KKy8vCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDAwICk7DQorLy8JCQlwaHlfd3JpdGUoICA5LCAweDAwMDAgKTsNCisvLwkJCXBoeV93cml0ZSggIDQsIDB4MDVlMSApOw0KKy8vCQkJcGh5X3dyaXRlKCAgMCwgMHgxMjAwICk7DQorLy8JCQlwaHlfZGVsYXkoNTAwMCk7DQorCQl9IA0KKwkJZWxzZSB7DQorCQkJcGh5X2Jhc2ljX3NldHRpbmcobG9vcF9waHkpOw0KKwkJCXBoeV9kZWxheSgxNTApOw0KKwkJfQ0KKwl9DQorfSAvLyBFbmQgdm9pZCBwaHlfcmVhbHRlazIgKGludCBsb29wX3BoeSkNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgcmVjb3ZfcGh5X3JlYWx0ZWszIChpbnQgbG9vcF9waHkpIHsvL1JUTDgyMTFDDQorCWlmICggQnVyc3RFbmFibGUgKSB7DQorCQlpZiAoIElFRUVUZXN0aW5nICkgew0KKwkJCWlmICggR1NwZWVkX3NlbFswXSApIHsNCisJCQkJcGh5X3dyaXRlKCAgOSwgMHgwMDAwICk7DQorCQkJfSANCisJCQllbHNlIGlmICggR1NwZWVkX3NlbFsxXSApIHsNCisJCQkJcGh5X3dyaXRlKCAxNywgUEhZXzExaCApOw0KKwkJCQlwaHlfd3JpdGUoIDE0LCAweDAwMDAgICk7DQorCQkJCXBoeV93cml0ZSggMTYsIDB4MDBhMCAgKTsNCisJCQl9IA0KKwkJCWVsc2Ugew0KKy8vCQkJCXBoeV93cml0ZSggMzEsIDB4MDAwNiApOw0KKy8vCQkJCXBoeV93cml0ZSggIDAsIDB4NWEwMCApOw0KKy8vCQkJCXBoeV93cml0ZSggMzEsIDB4MDAwMCApOw0KKwkJCX0NCisJCX0gDQorCQllbHNlIHsNCisJCX0NCisJfSANCisJZWxzZSBpZiAobG9vcF9waHkpIHsNCisJCWlmICggR1NwZWVkX3NlbFswXSApIHsNCisJCQlwaHlfd3JpdGUoIDExLCAweDAwMDAgKTsNCisJCX0NCisJCXBoeV93cml0ZSggMTIsIDB4MTAwNiApOw0KKwl9IA0KKwllbHNlIHsNCisJCWlmICggR1NwZWVkX3NlbFswXSApIHsNCisJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDEgKTsNCisJCQlwaHlfd3JpdGUoICA0LCAweGIwMDAgKTsNCisJCQlwaHlfd3JpdGUoICAzLCAweGZmNDEgKTsNCisJCQlwaHlfd3JpdGUoICAyLCAweGRmMjAgKTsNCisJCQlwaHlfd3JpdGUoICAxLCAweDAxNDAgKTsNCisJCQlwaHlfd3JpdGUoICAwLCAweDAwYmIgKTsNCisJCQlwaHlfd3JpdGUoICA0LCAweGI4MDAgKTsNCisJCQlwaHlfd3JpdGUoICA0LCAweGIwMDAgKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDAgKTsNCisJCQlwaHlfd3JpdGUoIDI1LCAweDhjMDAgKTsNCisJCQlwaHlfd3JpdGUoIDI2LCAweDAwNDAgKTsNCisJCQlwaHlfd3JpdGUoICAwLCAweDExNDAgKTsNCisJCQlwaHlfd3JpdGUoIDE0LCAweDAwMDAgKTsNCisJCQlwaHlfd3JpdGUoIDEyLCAweDEwMDYgKTsNCisJCQlwaHlfd3JpdGUoIDIzLCAweDIxMDkgKTsNCisJCX0NCisJfQ0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgcGh5X3JlYWx0ZWszIChpbnQgbG9vcF9waHkpIHsvL1JUTDgyMTFDDQorCWlmICggRGJnUHJuX1BIWU5hbWUgKSANCisJICAgIHByaW50ZiAoIi0tLT4oJTA0bHggJTA0bHgpW1JlYWx0ZWtdICVzXG4iLCBQSFlfSUQyLCBQSFlfSUQzLCBQSFlOYW1lKTsNCisNCisJaWYgKCBCdXJzdEVuYWJsZSApIHsNCisJCWlmICggSUVFRVRlc3RpbmcgKSB7DQorCQkJaWYgKCBHU3BlZWRfc2VsWzBdICkgew0KKwkJCQlpZiAoIElPVGltaW5nQnVuZF9hcmcgPT0gMCApIHsgICAvL1Rlc3QgTW9kZSAxDQorCQkJCQlwaHlfd3JpdGUoIDksIDB4MjAwMCk7DQorCQkJCX0gDQorCQkJCWVsc2UgaWYgKElPVGltaW5nQnVuZF9hcmcgPT0gMSkgey8vVGVzdCBNb2RlIDINCisJCQkJCXBoeV93cml0ZSggOSwgMHg0MDAwKTsNCisJCQkJfSANCisJCQkJZWxzZSBpZiAoSU9UaW1pbmdCdW5kX2FyZyA9PSAyKSB7Ly9UZXN0IE1vZGUgMw0KKwkJCQkJcGh5X3dyaXRlKCA5LCAweDYwMDApOw0KKwkJCQl9IA0KKwkJCQllbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Rlc3QgTW9kZSA0DQorCQkJCQlwaHlfd3JpdGUoIDksIDB4ODAwMCk7DQorCQkJCX0NCisJCQl9IA0KKwkJCWVsc2UgaWYgKCBHU3BlZWRfc2VsWzFdICkgew0KKwkJCQlQSFlfMTFoID0gcGh5X3JlYWQoIFBIWV9TUiApOw0KKwkJCQlwaHlfd3JpdGUoIDE3LCBQSFlfMTFoICYgMHhmZmY3ICk7DQorCQkJCXBoeV93cml0ZSggMTQsIDB4MDY2MCApOw0KKwkJCQkNCisJCQkJaWYgKCBJT1RpbWluZ0J1bmRfYXJnID09IDAgKSB7DQorCQkJCQlwaHlfd3JpdGUoIDE2LCAweDAwYTAgKTsvL01ESSAgLy9Gcm9tIENoYW5uZWwgQQ0KKwkJCQl9IA0KKwkJCQllbHNlIHsNCisJCQkJCXBoeV93cml0ZSggMTYsIDB4MDA4MCApOy8vTURJWCAvL0Zyb20gQ2hhbm5lbCBCDQorCQkJCX0NCisJCQl9IA0KKwkJCWVsc2Ugew0KKy8vCQkJCWlmIChJT1RpbWluZ0J1bmRfYXJnID09IDApIHsvL1BzZXVkby1yYW5kb20gcGF0dGVybg0KKy8vCQkJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDYgKTsNCisvLwkJCQkJcGh5X3dyaXRlKCAgMCwgMHg1YTIxICk7DQorLy8JCQkJCXBoeV93cml0ZSggMzEsIDB4MDAwMCApOw0KKy8vCQkJCX0gDQorLy8gICAgICAgICAgICAgIGVsc2UgaWYgKElPVGltaW5nQnVuZF9hcmcgPT0gMSkgey8voadGRqGoIHBhdHRlcm4NCisvLwkJCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDA2ICk7DQorLy8JCQkJCXBoeV93cml0ZSggIDIsIDB4MDVlZSApOw0KKy8vCQkJCQlwaHlfd3JpdGUoICAwLCAweGZmMjEgKTsNCisvLwkJCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDAwICk7DQorLy8JCQkJfSANCisvLyAgICAgICAgICAgICAgZWxzZSB7Ly+hpzAwoaggcGF0dGVybg0KKy8vCQkJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDYgKTsNCisvLwkJCQkJcGh5X3dyaXRlKCAgMiwgMHgwNWVlICk7DQorLy8JCQkJCXBoeV93cml0ZSggIDAsIDB4MDAyMSApOw0KKy8vCQkJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDAgKTsNCisvLwkJCQl9DQorCQkJfQ0KKwkJfSANCisJCWVsc2Ugew0KKwkJCXBoeV9SZXNldChsb29wX3BoeSk7DQorCQl9DQorCX0gDQorCWVsc2UgaWYgKGxvb3BfcGh5KSB7DQorCQlwaHlfd3JpdGUoIDAsIDB4OTIwMCk7DQorCQlwaHlfV2FpdF9SZXNldF9Eb25lKCk7DQorCQlwaHlfZGVsYXkoMzApOw0KKw0KKwkJcGh5X3dyaXRlKCAxNywgMHg0MDFjICk7DQorCQlwaHlfd3JpdGUoIDEyLCAweDAwMDYgKTsNCisJCQ0KKwkJaWYgKCBHU3BlZWRfc2VsWzBdICkgew0KKwkJCXBoeV93cml0ZSgxMSwgMHgwMDAyKTsNCisJCX0gDQorCQllbHNlIHsNCisJCQlwaHlfYmFzaWNfc2V0dGluZyhsb29wX3BoeSk7DQorCQl9DQorCX0gDQorCWVsc2Ugew0KKwkJaWYgKEdTcGVlZF9zZWxbMF0pIHsNCisJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDEgKTsNCisJCQlwaHlfd3JpdGUoICA0LCAweGIwMDAgKTsNCisJCQlwaHlfd3JpdGUoICAzLCAweGZmNDEgKTsNCisJCQlwaHlfd3JpdGUoICAyLCAweGQ3MjAgKTsNCisJCQlwaHlfd3JpdGUoICAxLCAweDAxNDAgKTsNCisJCQlwaHlfd3JpdGUoICAwLCAweDAwYmIgKTsNCisJCQlwaHlfd3JpdGUoICA0LCAweGI4MDAgKTsNCisJCQlwaHlfd3JpdGUoICA0LCAweGIwMDAgKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCQlwaHlfd3JpdGUoIDMxLCAweDAwMDAgKTsNCisJCQlwaHlfd3JpdGUoIDI1LCAweDg0MDAgKTsNCisJCQlwaHlfd3JpdGUoIDI2LCAweDAwMjAgKTsNCisJCQlwaHlfd3JpdGUoICAwLCAweDAxNDAgKTsNCisJCQlwaHlfd3JpdGUoIDE0LCAweDAyMTAgKTsNCisJCQlwaHlfd3JpdGUoIDEyLCAweDAyMDAgKTsNCisJCQlwaHlfd3JpdGUoIDIzLCAweDIxMDkgKTsNCisJCQlwaHlfd3JpdGUoIDIzLCAweDIxMzkgKTsNCisJCX0gDQorCQllbHNlIHsNCisJCQlwaHlfUmVzZXQobG9vcF9waHkpOw0KKwkJfQ0KKwl9DQorfSAvLyBFbmQgdm9pZCBwaHlfcmVhbHRlazMgKGludCBsb29wX3BoeSkNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgcGh5X3JlYWx0ZWs0IChpbnQgbG9vcF9waHkpIHsvL1JUTDgyMDFGDQorCWlmICggRGJnUHJuX1BIWU5hbWUgKSANCisJICAgIHByaW50ZiAoIi0tLT4oJTA0bHggJTA0bHgpW1JlYWx0ZWtdICVzXG4iLCBQSFlfSUQyLCBQSFlfSUQzLCBQSFlOYW1lKTsNCisNCisJaWYgKCBCdXJzdEVuYWJsZSApIHsNCisJCWlmICggSUVFRVRlc3RpbmcgKSB7DQorCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDA0ICk7DQorCQkJcGh5X3dyaXRlKCAxNiwgMHg0MDc3ICk7DQorCQkJcGh5X3dyaXRlKCAyMSwgMHhjNWEwICk7DQorCQkJcGh5X3dyaXRlKCAzMSwgMHgwMDAwICk7DQorDQorCQkJaWYgKCBHU3BlZWRfc2VsWzFdICkgew0KKwkJCQlwaHlfd3JpdGUoICAwLCAweDgwMDAgKTsgLy8gUmVzZXQgUEhZDQorCQkJCXBoeV93cml0ZSggMjQsIDB4MDMxMCApOyAvLyBEaXNhYmxlIEFMRFBTDQorCQkJCQ0KKwkJCQlpZiAoIElPVGltaW5nQnVuZF9hcmcgPT0gMCApIHsNCisJCQkJCXBoeV93cml0ZSggMjgsIDB4NDBjMiApOyAvL0ZvcmNlIE1ESSAvL0Zyb20gQ2hhbm5lbCBBIChSSjQ1IHBhaXIgMSwgMikNCisJCQkJfSAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCQllbHNlIHsgICAgICAgICAgICAgICAgICAgDQorCQkJCQlwaHlfd3JpdGUoIDI4LCAweDQwYzAgKTsgLy9Gb3JjZSBNRElYLy9Gcm9tIENoYW5uZWwgQiAoUko0NSBwYWlyIDMsIDYpDQorCQkJCX0NCisJCQkJcGh5X3dyaXRlKCAwLCAweDIxMDApOyAgICAgICAvL0ZvcmNlIDEwME0vRnVsbCBEdXBsZXgpDQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlwaHlfUmVzZXQobG9vcF9waHkpOw0KKwkJfQ0KKwl9IA0KKwllbHNlIHsNCisJCXBoeV9SZXNldChsb29wX3BoeSk7DQorCX0NCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIHBoeV9zbXNjIChpbnQgbG9vcF9waHkpIHsvL0xBTjg3MDANCisJaWYgKCBEYmdQcm5fUEhZTmFtZSApIA0KKwkgICAgcHJpbnRmICgiLS0tPiglMDRseCAlMDRseClbU01TQ10gJXNcbiIsIFBIWV9JRDIsIFBIWV9JRDMsIFBIWU5hbWUpOw0KKw0KKwlwaHlfUmVzZXQobG9vcF9waHkpOw0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgcGh5X21pY3JlbCAoaW50IGxvb3BfcGh5KSB7Ly9LU1o4MDQxDQorCWlmICggRGJnUHJuX1BIWU5hbWUgKSANCisJICAgIHByaW50ZiAoIi0tLT4oJTA0bHggJTA0bHgpW01pY3JlbF0gJXNcbiIsIFBIWV9JRDIsIFBIWV9JRDMsIFBIWU5hbWUpOw0KKw0KKwlwaHlfUmVzZXQobG9vcF9waHkpOw0KKw0KKy8vCXBoeV93cml0ZSgyNCwgIDB4MDYwMCk7DQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBwaHlfbWljcmVsMCAoaW50IGxvb3BfcGh5KSB7Ly9LU1o4MDMxL0tTWjgwNTENCisJaWYgKCBEYmdQcm5fUEhZTmFtZSApIHByaW50ZiAoIi0tLT4oJTA0bHggJTA0bHgpW01pY3JlbF0gJXNcbiIsIFBIWV9JRDIsIFBIWV9JRDMsIFBIWU5hbWUpOw0KKw0KKwkvL0ZvciBLU1o4MDUxUk5MIG9ubHkNCisJLy9SZWcxRmhbN10gPSAwKGRlZmF1bHQpOiAyNU1IeiBNb2RlLCBYSSwgWE8ocGluIDksIDgpIGlzIDI1TUh6KGNyeXN0YWwvb3NjaWxhdG9yKS4NCisJLy9SZWcxRmhbN10gPSAxICAgICAgICAgOiA1ME1IeiBNb2RlLCBYSShwaW4gOSkgaXMgNTBNSHoob3NjaWxhdG9yKS4NCisJUEhZXzFmaCA9IHBoeV9yZWFkKDMxKTsNCisJaWYgKFBIWV8xZmggJiAweDAwODApIHNwcmludGYoUEhZTmFtZSwgIiVzLTUwTUh6IE1vZGUiLCBQSFlOYW1lKTsNCisJZWxzZSAgICAgICAgICAgICAgICAgIHNwcmludGYoUEhZTmFtZSwgIiVzLTI1TUh6IE1vZGUiLCBQSFlOYW1lKTsNCisNCisJaWYgKElFRUVUZXN0aW5nKSB7DQorCQlwaHlfUmVhZF9Xcml0ZSggMCwgIDB4MDAwMCwgMHg4MDAwIHwgUEhZXzAwaCApOy8vY2xyIHNldC8vUnN0IFBIWQ0KKwkJcGh5X1dhaXRfUmVzZXRfRG9uZSgpOw0KKw0KKwkJcGh5X1JlYWRfV3JpdGUoIDMxLCAweDAwMDAsIDB4MjAwMCApOy8vY2xyIHNldC8vMUZoWzEzXSA9IDE6IERpc2FibGUgYXV0byBNREkvTURJLVgNCisJCXBoeV9iYXNpY19zZXR0aW5nKGxvb3BfcGh5KTsNCisJCXBoeV9SZWFkX1dyaXRlKCAzMSwgMHgwMDAwLCAweDA4MDAgKTsvL2NsciBzZXQvLzFGaFsxMV0gPSAxOiBGb3JjZSBsaW5rIHBhc3MNCisNCisvLwkJcGh5X2RlbGF5KDI1MDApOy8vMi41IHNlYw0KKwl9IA0KKwllbHNlIHsNCisJCXBoeV9SZXNldChsb29wX3BoeSk7DQorDQorCQkvL1JlZzE2aFs2XSA9IDEgICAgICAgICA6IFJNSUkgQi10by1CIG92ZXJyaWRlDQorCQkvL1JlZzE2aFsxXSA9IDEoZGVmYXVsdCk6IFJNSUkgb3ZlcnJpZGUNCisJCXBoeV9SZWFkX1dyaXRlKCAyMiwgMHgwMDAwLCAweDAwNDIgKTsvL2NsciBzZXQNCisJfQ0KKw0KKwlpZiAoIFBIWV8xZmggJiAweDAwODAgKSANCisJICAgIHBoeV9SZWFkX1dyaXRlKCAzMSwgMHgwMDAwLCAweDAwODAgKTsvL2NsciBzZXQvL1Jlc2V0IFBIWSB3aWxsIGNsZWFyIFJlZzFGaFs3XQ0KK30NCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK3ZvaWQgcmVjb3ZfcGh5X3ZpdGVzc2UgKGludCBsb29wX3BoeSkgey8vVlNDODYwMQ0KKwlpZiAoIEJ1cnN0RW5hYmxlICkgew0KKy8vCQlpZiAoSUVFRVRlc3RpbmcpIHsNCisvLwkJfSBlbHNlIHsNCisvLwkJfQ0KKwl9IA0KKwllbHNlIGlmICggbG9vcF9waHkgKSB7DQorCX0gDQorCWVsc2Ugew0KKwkJaWYgKCBHU3BlZWRfc2VsWzBdICkgew0KKwkJCXBoeV93cml0ZSggMjQsIFBIWV8xOGggKTsNCisJCQlwaHlfd3JpdGUoIDE4LCBQSFlfMTJoICk7DQorCQl9DQorCX0NCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIHBoeV92aXRlc3NlIChpbnQgbG9vcF9waHkpIHsvL1ZTQzg2MDENCisJaWYgKCBEYmdQcm5fUEhZTmFtZSApIA0KKwkgICAgcHJpbnRmICgiLS0tPiglMDRseCAlMDRseClbVklURVNTRV0gJXNcbiIsIFBIWV9JRDIsIFBIWV9JRDMsIFBIWU5hbWUpOw0KKw0KKwlpZiAoIEJ1cnN0RW5hYmxlICkgew0KKwkJaWYgKCBJRUVFVGVzdGluZyApIHsNCisJCQlwaHlfUmVzZXQobG9vcF9waHkpOw0KKwkJfSANCisJCWVsc2Ugew0KKwkJCXBoeV9SZXNldChsb29wX3BoeSk7DQorCQl9DQorCX0gDQorCWVsc2UgaWYgKCBsb29wX3BoeSApIHsNCisJCXBoeV9SZXNldChsb29wX3BoeSk7DQorCX0gDQorCWVsc2Ugew0KKwkJaWYgKCBHU3BlZWRfc2VsWzBdICkgew0KKwkJCVBIWV8xOGggPSBwaHlfcmVhZCggMjQgKTsNCisJCQlQSFlfMTJoID0gcGh5X3JlYWQoIFBIWV9JTkVSICk7DQorDQorCQkJcGh5X1Jlc2V0KGxvb3BfcGh5KTsNCisNCisJCQlwaHlfd3JpdGUoIDI0LCBQSFlfMThoIHwgMHgwMDAxICk7DQorCQkJcGh5X3dyaXRlKCAxOCwgUEhZXzEyaCB8IDB4MDAyMCApOw0KKwkJfSANCisJCWVsc2Ugew0KKwkJCXBoeV9SZXNldChsb29wX3BoeSk7DQorCQl9DQorCX0NCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIHBoeV9kZWZhdWx0IChpbnQgbG9vcF9waHkpIHsNCisJaWYgKCBEYmdQcm5fUEhZTmFtZSApIA0KKwkgICAgcHJpbnRmICgiLS0tPiglMDRseCAlMDRseCklc1xuIiwgUEhZX0lEMiwgUEhZX0lEMywgUEhZTmFtZSk7DQorDQorCXBoeV9SZXNldChsb29wX3BoeSk7DQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorLy8gUEhZIEluaXQNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK0JPT0xFQU4gZmluZF9waHlhZHIgKHZvaWQpIHsNCisgICAgVUxPTkcgICAgICAgUEhZX3ZhbDsNCisgICAgQk9PTEVBTiAgICAgcmV0ID0gRkFMU0U7DQorICAgIA0KKwkjaWZkZWYgIERiZ1Bybl9GdW5jSGVhZGVyDQorCSAgICBwcmludGYgKCJmaW5kX3BoeWFkclxuIik7IA0KKwkgICAgRGVidWdfZGVsYXkoKTsNCisgICAgI2VuZGlmDQorDQorCWRvIHsNCisJICAgIC8vIENoZWNrIGN1cnJlbnQgUEhZIGFkZHJlc3MgYnkgdXNlciBzZXR0aW5nDQorCSAgICBQSFlfdmFsID0gcGh5X3JlYWQoIFBIWV9SRUdfSURfMSApOw0KKyAgICAJaWYgKCBQSFlfSVNfVkFMSUQoUEhZX3ZhbCkgKSB7DQorICAgIAkJcmV0ID0gVFJVRTsNCisgICAgCQlicmVhazsNCisgICAgCX0NCisgICAgCSANCisgICAgCWlmICggRW5hYmxlX1NraXBDaGtQSFkgKSB7DQorICAgIAkJUEhZX3ZhbCA9IHBoeV9yZWFkKCBQSFlfUkVHX0JNQ1IgKTsNCisgICAgCQkNCisgICAgCQlpZiAoKFBIWV92YWwgJiAweDgwMDApICYgRW5hYmxlX0luaXRQSFkpIHsNCisgICAgCQkgICAgLy8gUEhZIGlzIHJlc2V0aW5nIGFuZCBuZWVkIHRvIGluaXRhbCBQSFkNCisgICAgICAgICAgICAgICAgI2lmbmRlZiBFbmFibGVfU2VhcmNoUEhZSUQNCisgICAgCQkJYnJlYWs7DQorICAgICAgICAgICAgICAgICNlbmRpZg0KKyAgICAJCX0gDQorICAgIAkJZWxzZSB7DQorICAgIAkJCXJldCA9IFRSVUU7DQorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAJCQkNCisgICAgCQl9DQorICAgIAl9IA0KKyAgICAJDQorICAgIAkjaWZkZWYgRW5hYmxlX1NlYXJjaFBIWUlEDQorICAgIAkvLyBTY2FuIFBIWSBhZGRyZXNzIGZyb20gMCB0byAzMQ0KKyAgICAgICAgcHJpbnRmKCJTZWFyY2ggUEhZIGFkZHJlc3NcbiIpOw0KKyAgICAgICAgZm9yICggUEhZX0FEUiA9IDA7IFBIWV9BRFIgPCAzMjsgUEhZX0FEUisrICkgew0KKyAgICAgICAgCVBIWV92YWwgPSBwaHlfcmVhZCggUEhZX1JFR19JRF8xICk7DQorICAgICAgICAJaWYgKCBQSFlfSVNfVkFMSUQoUEhZX3ZhbCkgKSB7DQorICAgICAgICAJCXJldCA9IFRSVUU7DQorICAgICAgICAJCWJyZWFrOw0KKyAgICAgICAgCX0NCisgICAgICAgIH0NCisgICAgICAgIC8vIERvbid0IGZpbmQgUEhZIGFkZHJlc3MNCisgICAgICAgIFBIWV9BRFIgPSBQSFlfQURSX2FyZzsNCisgICAgICAgICNlbmRpZg0KKyAgICB9IHdoaWxlICggMCApOw0KKw0KKwlpZiAoIHJldCA9PSBUUlVFICkgew0KKwkJaWYgKCBQSFlfQURSX2FyZyAhPSBQSFlfQURSICkgew0KKw0KKyAgICAgICAgICAgIGlmICggIUJ1cnN0RW5hYmxlICkgDQorCQkJICAgIHBoeV9pZCggRlBfTE9HICk7DQorDQorICAgICAgICAgICAgcGh5X2lkKCBTVERfT1VUICk7DQorCQl9DQorCX0gDQorCWVsc2Ugew0KKw0KKwkJaWYgKCAhQnVyc3RFbmFibGUgKSANCisJCSAgICBwaHlfaWQoIEZQX0xPRyApOw0KKw0KKyAgICAgICAgcGh5X2lkKCBTVERfT1VUICk7DQorCQlGaW5kRXJyKCBFcnJfUEhZX1R5cGUgKTsNCisJfQ0KKwkNCisJcmV0dXJuIHJldDsNCit9IC8vIEVuZCBCT09MRUFOIGZpbmRfcGh5YWRyICh2b2lkKQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorY2hhciBwaHlfY2hrIChVTE9ORyBpZDIsIFVMT05HIGlkMywgVUxPTkcgaWQzX21hc2spIHsNCisJaWYgKChQSFlfSUQyID09IGlkMikgJiYgKChQSFlfSUQzICYgaWQzX21hc2spID09IChpZDMgJiBpZDNfbWFzaykpKSANCisJICAgIHJldHVybigxKTsNCisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJICAgIHJldHVybigwKTsNCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIHBoeV9zZXQwMGggKGludCBsb29wX3BoeSkgew0KKwkjaWZkZWYgIERiZ1Bybl9GdW5jSGVhZGVyDQorCSAgICBwcmludGYgKCJwaHlfc2V0MDBoXG4iKTsgDQorCSAgICBEZWJ1Z19kZWxheSgpOw0KKyAgICAjZW5kaWYNCisNCisJaWYgKEJ1cnN0RW5hYmxlKSB7DQorCQlpZiAoSUVFRVRlc3RpbmcpIHsNCisJCQlpZiAgICAgIChHU3BlZWRfc2VsWzBdKSBQSFlfMDBoID0gMHgwMTQwOw0KKwkJCWVsc2UgaWYgKEdTcGVlZF9zZWxbMV0pIFBIWV8wMGggPSAweDIxMDA7DQorCQkJZWxzZSAgICAgICAgICAgICAgICAgICAgUEhZXzAwaCA9IDB4MDEwMDsNCisJCX0gDQorCQllbHNlIHsNCisJCQlpZiAgICAgIChHU3BlZWRfc2VsWzBdKSBQSFlfMDBoID0gMHgxMTQwOw0KKwkJCWVsc2UgaWYgKEdTcGVlZF9zZWxbMV0pIFBIWV8wMGggPSAweDMxMDA7DQorCQkJZWxzZSAgICAgICAgICAgICAgICAgICAgUEhZXzAwaCA9IDB4MTEwMDsNCisJCX0NCisJfSANCisJZWxzZSBpZiAobG9vcF9waHkpIHsNCisJCWlmICAgICAgKEdTcGVlZF9zZWxbMF0pIFBIWV8wMGggPSAweDQxNDA7DQorCQllbHNlIGlmIChHU3BlZWRfc2VsWzFdKSBQSFlfMDBoID0gMHg2MTAwOw0KKwkJZWxzZSAgICAgICAgICAgICAgICAgICAgUEhZXzAwaCA9IDB4NDEwMDsNCisJfSANCisJZWxzZSB7DQorCQlpZiAgICAgIChHU3BlZWRfc2VsWzBdKSBQSFlfMDBoID0gMHgwMTQwOw0KKwkJZWxzZSBpZiAoR1NwZWVkX3NlbFsxXSkgUEhZXzAwaCA9IDB4MjEwMDsNCisJCWVsc2UgICAgICAgICAgICAgICAgICAgIFBIWV8wMGggPSAweDAxMDA7DQorCX0NCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIHBoeV9zZWwgKGludCBsb29wX3BoeSkgew0KKwkjaWZkZWYgIERiZ1Bybl9GdW5jSGVhZGVyDQorCSAgICBwcmludGYgKCJwaHlfc2VsXG4iKTsgDQorCSAgICBEZWJ1Z19kZWxheSgpOw0KKyAgICAjZW5kaWYNCisNCisJUEhZX0lEMiA9IHBoeV9yZWFkKCBQSFlfUkVHX0lEXzEgKTsNCisJUEhZX0lEMyA9IHBoeV9yZWFkKCBQSFlfUkVHX0lEXzIgKTsNCisJcGh5X3NldDAwaChsb29wX3BoeSk7DQorDQorCWlmICAgICAgKChQSFlfSUQyID09IDB4ZmZmZikgJiYgKFBIWV9JRDMgPT0gMHhmZmZmKSAmJiAhRW5hYmxlX1NraXBDaGtQSFkpIHsNCisJICAgIHNwcmludGYoUEhZTmFtZSwgIi0tIik7IA0KKwkgICAgRmluZEVycihFcnJfUEhZX1R5cGUpOw0KKwl9DQorI2lmZGVmIEVuYWJsZV9DaGVja1plcm9QSFlJRA0KKwllbHNlIGlmICgoUEhZX0lEMiA9PSAweDAwMDApICYmIChQSFlfSUQzID09IDB4MDAwMCkgJiYgIUVuYWJsZV9Ta2lwQ2hrUEhZKSB7DQorCSAgICBzcHJpbnRmKFBIWU5hbWUsICItLSIpOyBGaW5kRXJyKEVycl9QSFlfVHlwZSk7DQorCX0NCisjZW5kaWYNCisNCisJaWYgICAgICAocGh5X2NoaygweDAzNjIsIDB4NWU2YSwgMHhmZmYwICAgICApKSB7c3ByaW50ZihQSFlOYW1lLCAiQkNNNTQ2MTIiICAgICAgICApOyBpZiAoRW5hYmxlX0luaXRQSFkpIHBoeV9icm9hZGNvbTAobG9vcF9waHkpO30vL0JDTTU0NjEyICAgICAgICAgMUcvMTAwLzEwTSAgUkdNSUkNCisJZWxzZSBpZiAocGh5X2NoaygweDAzNjIsIDB4NWQxMCwgMHhmZmYwICAgICApKSB7c3ByaW50ZihQSFlOYW1lLCAiQkNNNTQ2MTZTIiAgICAgICApOyBpZiAoRW5hYmxlX0luaXRQSFkpIHBoeV9icm9hZGNvbTAobG9vcF9waHkpO30vL0JDTTU0NjE2QSAgICAgICAgMUcvMTAwLzEwTSAgUkdNSUkJICAgIA0KKwllbHNlIGlmIChwaHlfY2hrKDB4MDA0MCwgMHg2MWUwLCBQSFlJRDNfTWFzaykpIHtzcHJpbnRmKFBIWU5hbWUsICJCQ001MjIxIiAgICAgICAgICk7IGlmIChFbmFibGVfSW5pdFBIWSkgcGh5X2Jyb2FkY29tIChsb29wX3BoeSk7fS8vQkNNNTIyMSAgICAgICAgICAgICAxMDAvMTBNICBNSUksIFJNSUkNCisJZWxzZSBpZiAocGh5X2NoaygweDAxNDEsIDB4MGRkMCwgMHhmZmYwICAgICApKSB7c3ByaW50ZihQSFlOYW1lLCAiODhFMTUxMiIgICAgICAgICApOyBpZiAoRW5hYmxlX0luaXRQSFkpIHBoeV9tYXJ2ZWxsMiAobG9vcF9waHkpO30vLzg4RTE1MTIgICAgICAgICAgMUcvMTAwLzEwTSAgUkdNSUkNCisJZWxzZSBpZiAocGh5X2NoaygweGZmMDAsIDB4MTc2MSwgMHhmZmZmICAgICApKSB7c3ByaW50ZihQSFlOYW1lLCAiODhFNjE3NihJbnRMb29wKSIpOyBpZiAoRW5hYmxlX0luaXRQSFkpIHBoeV9tYXJ2ZWxsMSAobG9vcF9waHkpO30vLzg4RTYxNzYgICAgICAgICAgMUcvMTAwLzEwTSAgMiBSR01JSSBTd2l0Y2gNCisJZWxzZSBpZiAocGh5X2NoaygweDAxNDEsIDB4MGU5MCwgMHhmZmYwICAgICApKSB7c3ByaW50ZihQSFlOYW1lLCAiODhFMTMxMCIgICAgICAgICApOyBpZiAoRW5hYmxlX0luaXRQSFkpIHBoeV9tYXJ2ZWxsMCAobG9vcF9waHkpO30vLzg4RTEzMTAgICAgICAgICAgMUcvMTAwLzEwTSAgUkdNSUkNCisJZWxzZSBpZiAocGh5X2NoaygweDAxNDEsIDB4MGNjMCwgUEhZSUQzX01hc2spKSB7c3ByaW50ZihQSFlOYW1lLCAiODhFMTExMSIgICAgICAgICApOyBpZiAoRW5hYmxlX0luaXRQSFkpIHBoeV9tYXJ2ZWxsICAobG9vcF9waHkpO30vLzg4RTExMTEgICAgICAgICAgMUcvMTAwLzEwTSAgR01JSSwgTUlJLCBSR01JSQ0KKwllbHNlIGlmIChwaHlfY2hrKDB4MDAxYywgMHhjODE2LCAweGZmZmYgICAgICkpIHtzcHJpbnRmKFBIWU5hbWUsICJSVEw4MjAxRiIgICAgICAgICk7IGlmIChFbmFibGVfSW5pdFBIWSkgcGh5X3JlYWx0ZWs0IChsb29wX3BoeSk7fS8vUlRMODIwMUYgICAgICAgICAgICAxMDAvMTBNICBNSUksIFJNSUkNCisJZWxzZSBpZiAocGh5X2NoaygweDAwMWMsIDB4YzgxNSwgMHhmZmYwICAgICApKSB7c3ByaW50ZihQSFlOYW1lLCAiUlRMODIwMUUiICAgICAgICApOyBpZiAoRW5hYmxlX0luaXRQSFkpIHBoeV9yZWFsdGVrMCAobG9vcF9waHkpO30vL1JUTDgyMDFFICAgICAgICAgICAgMTAwLzEwTSAgTUlJLCBSTUlJKFJUTDgyMDFFKEwpLVZDIG9ubHkpDQorCWVsc2UgaWYgKHBoeV9jaGsoMHgwMDFjLCAweGM5MTIsIDB4ZmZmZiAgICAgKSkge3NwcmludGYoUEhZTmFtZSwgIlJUTDgyMTFDIiAgICAgICAgKTsgaWYgKEVuYWJsZV9Jbml0UEhZKSBwaHlfcmVhbHRlazMgKGxvb3BfcGh5KTt9Ly9SVEw4MjExQyAgICAgICAgIDFHLzEwMC8xME0gIFJHTUlJDQorCWVsc2UgaWYgKHBoeV9jaGsoMHgwMDFjLCAweGM5MTQsIDB4ZmZmZiAgICAgKSkge3NwcmludGYoUEhZTmFtZSwgIlJUTDgyMTFEIiAgICAgICAgKTsgaWYgKEVuYWJsZV9Jbml0UEhZKSBwaHlfcmVhbHRlazEgKGxvb3BfcGh5KTt9Ly9SVEw4MjExRCAgICAgICAgIDFHLzEwMC8xME0gIEdNSUkoUlRMODIxMUROL1JUTDgyMTFERyBvbmx5KSwgTUlJKFJUTDgyMTFETi9SVEw4MjExREcgb25seSksIFJHTUlJDQorCWVsc2UgaWYgKHBoeV9jaGsoMHgwMDFjLCAweGM5MTUsIDB4ZmZmZiAgICAgKSkge3NwcmludGYoUEhZTmFtZSwgIlJUTDgyMTFFIiAgICAgICAgKTsgaWYgKEVuYWJsZV9Jbml0UEhZKSBwaHlfcmVhbHRlazIgKGxvb3BfcGh5KTt9Ly9SVEw4MjExRSAgICAgICAgIDFHLzEwMC8xME0gIEdNSUkoUlRMODIxMUVHIG9ubHkpLCBSR01JSQ0KKwllbHNlIGlmIChwaHlfY2hrKDB4MDAwMCwgMHg4MjAxLCBQSFlJRDNfTWFzaykpIHtzcHJpbnRmKFBIWU5hbWUsICJSVEw4MjAxTiIgICAgICAgICk7IGlmIChFbmFibGVfSW5pdFBIWSkgcGh5X3JlYWx0ZWsgIChsb29wX3BoeSk7fS8vUlRMODIwMU4gICAgICAgICAgICAxMDAvMTBNICBNSUksIFJNSUkNCisJZWxzZSBpZiAocGh5X2NoaygweDAwMDcsIDB4YzBjNCwgUEhZSUQzX01hc2spKSB7c3ByaW50ZihQSFlOYW1lLCAiTEFOODcwMCIgICAgICAgICApOyBpZiAoRW5hYmxlX0luaXRQSFkpIHBoeV9zbXNjICAgICAobG9vcF9waHkpO30vL0xBTjg3MDAgICAgICAgICAgICAgMTAwLzEwTSAgTUlJLCBSTUlJDQorCWVsc2UgaWYgKHBoeV9jaGsoMHgwMDIyLCAweDE1NTUsIDB4ZmZmMCAgICAgKSkge3NwcmludGYoUEhZTmFtZSwgIktTWjgwMzEvS1NaODA1MSIgKTsgaWYgKEVuYWJsZV9Jbml0UEhZKSBwaHlfbWljcmVsMCAgKGxvb3BfcGh5KTt9Ly9LU1o4MDUxL0tTWjgwMzEgICAgIDEwMC8xME0gIFJNSUkNCisJZWxzZSBpZiAocGh5X2NoaygweDAwMjIsIDB4MTU2MCwgMHhmZmYwICAgICApKSB7c3ByaW50ZihQSFlOYW1lLCAiS1NaODA4MSIgICAgICAgICApOyBpZiAoRW5hYmxlX0luaXRQSFkpIHBoeV9taWNyZWwwICAobG9vcF9waHkpO30vL0tTWjgwODEgICAgICAgICAgICAgMTAwLzEwTSAgUk1JSQ0KKwllbHNlIGlmIChwaHlfY2hrKDB4MDAyMiwgMHgxNTEyLCAweGZmZjAgICAgICkpIHtzcHJpbnRmKFBIWU5hbWUsICJLU1o4MDQxIiAgICAgICAgICk7IGlmIChFbmFibGVfSW5pdFBIWSkgcGh5X21pY3JlbCAgIChsb29wX3BoeSk7fS8vS1NaODA0MSAgICAgICAgICAgICAxMDAvMTBNICBSTUlJDQorCWVsc2UgaWYgKHBoeV9jaGsoMHgwMDA3LCAweDA0MjEsIDB4ZmZmMCAgICAgKSkge3NwcmludGYoUEhZTmFtZSwgIlZTQzg2MDEiICAgICAgICAgKTsgaWYgKEVuYWJsZV9Jbml0UEhZKSBwaHlfdml0ZXNzZSAgKGxvb3BfcGh5KTt9Ly9WU0M4NjAxICAgICAgICAgIDFHLzEwMC8xME0gIFJHTUlJDQorCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NwcmludGYoUEhZTmFtZSwgImRlZmF1bHQiICAgICAgICAgKTsgaWYgKEVuYWJsZV9Jbml0UEhZKSBwaHlfZGVmYXVsdCAgKGxvb3BfcGh5KTt9Ly8NCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIHJlY292X3BoeSAoaW50IGxvb3BfcGh5KSB7DQorCSNpZmRlZiAgRGJnUHJuX0Z1bmNIZWFkZXINCisJICAgIHByaW50ZiAoInJlY292X3BoeVxuIik7IA0KKwkgICAgRGVidWdfZGVsYXkoKTsNCisgICAgI2VuZGlmDQorDQorCWlmICAgICAgKHBoeV9jaGsoMHgwMzYyLCAweDVlNmEsIDB4ZmZmMCAgICAgKSkgcmVjb3ZfcGh5X2Jyb2FkY29tMChsb29wX3BoeSk7Ly9CQ001NDYxMiAgMUcvMTAwLzEwTSAgUkdNSUkNCisJZWxzZSBpZiAocGh5X2NoaygweDAzNjIsIDB4NWQxMCwgMHhmZmYwICAgICApKSByZWNvdl9waHlfYnJvYWRjb20wKGxvb3BfcGh5KTsvL0JDTTU0NjE2QSAxRy8xMDAvMTBNICBSR01JSQ0KKwllbHNlIGlmIChwaHlfY2hrKDB4MDE0MSwgMHgwZGQwLCAweGZmZjAgICAgICkpIHJlY292X3BoeV9tYXJ2ZWxsMiAobG9vcF9waHkpOy8vODhFMTUxMiAgIDFHLzEwMC8xME0gIFJHTUlJDQorCWVsc2UgaWYgKHBoeV9jaGsoMHhmZjAwLCAweDE3NjEsIDB4ZmZmZiAgICAgKSkgcmVjb3ZfcGh5X21hcnZlbGwxIChsb29wX3BoeSk7Ly84OEU2MTc2ICAgMUcvMTAwLzEwTSAgMiBSR01JSSBTd2l0Y2gNCisJZWxzZSBpZiAocGh5X2NoaygweDAxNDEsIDB4MGU5MCwgMHhmZmYwICAgICApKSByZWNvdl9waHlfbWFydmVsbDAgKGxvb3BfcGh5KTsvLzg4RTEzMTAgICAxRy8xMDAvMTBNICBSR01JSQ0KKwllbHNlIGlmIChwaHlfY2hrKDB4MDE0MSwgMHgwY2MwLCBQSFlJRDNfTWFzaykpIHJlY292X3BoeV9tYXJ2ZWxsICAobG9vcF9waHkpOy8vODhFMTExMSAgIDFHLzEwMC8xME0gIEdNSUksIE1JSSwgUkdNSUkNCisJZWxzZSBpZiAocGh5X2NoaygweDAwMWMsIDB4YzkxNCwgMHhmZmZmICAgICApKSByZWNvdl9waHlfcmVhbHRlazEgKGxvb3BfcGh5KTsvL1JUTDgyMTFEICAxRy8xMDAvMTBNICBHTUlJKFJUTDgyMTFETi9SVEw4MjExREcgb25seSksIE1JSShSVEw4MjExRE4vUlRMODIxMURHIG9ubHkpLCBSR01JSQ0KKwllbHNlIGlmIChwaHlfY2hrKDB4MDAxYywgMHhjOTE1LCAweGZmZmYgICAgICkpIHJlY292X3BoeV9yZWFsdGVrMiAobG9vcF9waHkpOy8vUlRMODIxMUUgIDFHLzEwMC8xME0gIEdNSUkoUlRMODIxMUVHIG9ubHkpLCBSR01JSQ0KKwllbHNlIGlmIChwaHlfY2hrKDB4MDAxYywgMHhjOTEyLCAweGZmZmYgICAgICkpIHJlY292X3BoeV9yZWFsdGVrMyAobG9vcF9waHkpOy8vUlRMODIxMUMgIDFHLzEwMC8xME0gIFJHTUlJDQorCWVsc2UgaWYgKHBoeV9jaGsoMHgwMDA3LCAweDA0MjEsIDB4ZmZmMCAgICAgKSkgcmVjb3ZfcGh5X3ZpdGVzc2UgIChsb29wX3BoeSk7Ly9WU0M4NjAxICAgMUcvMTAwLzEwTSAgUkdNSUkNCit9DQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCit2b2lkIGluaXRfcGh5IChpbnQgbG9vcF9waHkpIHsNCisJI2lmZGVmICBEYmdQcm5fRnVuY0hlYWRlcg0KKwkgICAgcHJpbnRmICgiaW5pdF9waHlcbiIpOyANCisJICAgIERlYnVnX2RlbGF5KCk7DQorICAgICNlbmRpZg0KKwkNCisJc3ByaW50ZiggUEhZSUQsICJQSFklZCIsIFNlbGVjdE1BQyArIDEgKTsNCisNCisJaWYgKCBEYmdQcm5fUEhZSW5pdCApIA0KKwkgICAgcGh5X2R1bXAoIFBIWUlEICk7DQorDQorCWlmICggZmluZF9waHlhZHIoKSA9PSBUUlVFICkgDQorCSAgICBwaHlfc2VsKCBsb29wX3BoeSApOw0KKw0KKwlpZiAoIERiZ1Bybl9QSFlJbml0ICkNCisJICAgIHBoeV9kdW1wKCBQSFlJRCApOw0KK30NCisNCisNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9QTExURVNUVS5IIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvUExMVEVTVFUuSApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmE5NmU2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvUExMVEVTVFUuSApAQCAtMCwwICsxLDUwIEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpZm5kZWYgUExMVEVTVFVfSAorI2RlZmluZSBQTExURVNUVV9ICisKKy8vUExMIE1vZGUgRGVmaW5pdGlvbgorI2RlZmluZQlOQU5EX1BMTE1PREUJCSAgICAweDAwCisjZGVmaW5lCURFTEFZX1BMTE1PREUJCSAgICAweDA0CisjZGVmaW5lCVBDSV9QTExNT0RFCSAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUJRFBMTF9QTExNT0RFCQkgICAgMHgyYworI2RlZmluZQlNUExMX1BMTE1PREUJCSAgICAweDEwCisjZGVmaW5lCUhQTExfUExMTU9ERQkJICAgIDB4MTQKKyNkZWZpbmUJTFBDX1BMTE1PREUJICAgICAgICAgICAgMHgxOAorI2RlZmluZQlWSURFT0FfUExMTU9ERQkJICAgIDB4MWMKKyNkZWZpbmUJRDJQTExfUExMTU9ERQkJICAgIDB4MGMKKyNkZWZpbmUJVklERU9CX1BMTE1PREUJCSAgICAweDNjCisKKyNkZWZpbmUJUENJX1BMTE1PREVfQVNUMTE2MCAgICAgMHgxMAorI2RlZmluZQlNUExMX1BMTE1PREVfQVNUMTE2MAkweDE0CisjZGVmaW5lCUhQTExfUExMTU9ERV9BU1QxMTYwCTB4MTQKKyNkZWZpbmUJRFBMTF9QTExNT0RFX0FTVDExNjAJMHgxYworCisjZGVmaW5lCVBDSV9QTExNT0RFX0FTVDIzMDAgICAgIDB4MmMKKyNkZWZpbmUJTVBMTF9QTExNT0RFX0FTVDIzMDAJMHgxMAorI2RlZmluZQlIUExMX1BMTE1PREVfQVNUMjMwMAkweDMwCisjZGVmaW5lCURQTExfUExMTU9ERV9BU1QyMzAwCTB4MDgKKyNkZWZpbmUJREVMMF9QTExNT0RFX0FTVDIzMDAJMHgwMAorCisjZGVmaW5lIEVSUl9GQVRBTAkJMHgwMDAwMDAwMQorCit0eXBlZGVmIHN0cnVjdCBfVkdBSU5GTyB7CisgICAgVVNIT1JUIHVzRGV2aWNlSUQ7CisgICAgVUNIQVIgIGpSZXZpc2lvbjsgICAgICAgICAgIAorICAgIAorICAgIFVMT05HICB1bE1DTEs7CisgICAgVUxPTkcgIHVsRFJBTUJ1c1dpZHRoOyAgICAKKyAgICAKKyAgICBVTE9ORyAgdWxDUFVDTEs7CisgICAgVUxPTkcgIHVsQUhCQ0xLOyAgICAKK30gX1ZHQUluZm87CisKKyNlbmRpZiAvLyBFbmQgUExMVEVTVFVfSApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvUExMVEVTVFUuYyBiL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL1BMTFRFU1RVLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5NThiMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL1BMTFRFU1RVLmMKQEAgLTAsMCArMSw0MTEgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2RlZmluZSBQTExURVNUX0MKK3N0YXRpYyBjb25zdCBjaGFyIFRoaXNGaWxlW10gPSAiUExMVEVTVC5jIjsKKworI2luY2x1ZGUgIlNXRlVOQy5IIgorCisjaW5jbHVkZSA8Q09NTUlORi5IPgorI2luY2x1ZGUgPFNURFVCT09ULkg+CisjaW5jbHVkZSA8VFlQRURFRi5IPgorI2luY2x1ZGUgPElPLkg+CisjaW5jbHVkZSA8UExMVEVTVFUuSD4KKworLyoKKyAqIHN0YXRpYworICovCitzdGF0aWMgVUNIQVIgalZlcnNpb25bXSA9ICJ2LjAuNTcuMDAiOworICAgICAgICAgICAgIAordm9pZCBwcmludF91c2FnZSggdm9pZCApCit7CisgICAgcHJpbnRmKCIgUExMVGVzdCBbcGxsIG1vZGVdIFtlcnIgcmF0ZV1cbiIpOworICAgIHByaW50ZigiICAgICAgW3BsbCBtb2RlXSBoLXBsbDogQVJNIENQVSBDbG9jayBQTExcbiIpOworICAgIHByaW50ZigiICAgICAgICAgICAgICAgICBtLXBsbDogTWVtb3J5IENsb2NrIFBMTFxuIik7CisgICAgcHJpbnRmKCIgICAgICBbZXJyIHJhdGVdIEVycm9yIFJhdGU6IHVuaXQgJVxuIik7CisgICAgcHJpbnRmKCIgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgMSVcbiIpOworfSAgICAgICAgICAgICAKKyAgICAgICAgICAgICAKK0JPT0wgQ29tcGFyZVRvUmluZyhfVkdBSW5mbyAqVkdBSW5mbywgVUxPTkcgdWxQTExNb2RlLCBVTE9ORyB1bERDTEssIFVMT05HIHVsRXJyUmF0ZSkKK3sKKyAgICBVTE9ORyB1bENvdW50ZXIsIHVsTG93TGltaXQsIHVsSGlnaExpbWl0OworICAgIFVMT05HIHVsRGF0YSwgdWxWYWx1ZSwgdWxEaXY7CisgICAgVUxPTkcgdWxTQ1VCYXNlOworICAgIGRvdWJsZSBkZWwwOworICAgIFVMT05HIHVsZGVsMDsKKyAgICAKKyAgICBpZiAoKFZHQUluZm8tPnVzRGV2aWNlSUQgPT0gMHgxMTYwKSB8fCAoVkdBSW5mby0+dXNEZXZpY2VJRCA9PSAweDExODApKQorICAgICAgICB1bFNDVUJhc2UgPSAweDgwZmM4MjAwOyAgICAKKyAgICBlbHNlCisgICAgICAgIHVsU0NVQmFzZSA9IDB4MWU2ZTIwMDA7CisKKyAgICAvL0ZpeGVkIEFTVDIzMDAgSC1QTEwgY2FuJ3QgR2V0IENvcnJlY3QgVmFsdWUgaW4gVkdBIG9ubHkgbW9kZSwgeWNjaGVuQDA4MTcxMQorICAgIGlmICggKFZHQUluZm8tPmpSZXZpc2lvbiA+PSAweDIwKSAmJiAodWxQTExNb2RlID09IEhQTExfUExMTU9ERV9BU1QyMzAwKSApCisgICAgeworICAgICAgICBXcml0ZVNPQ19ERCh1bFNDVUJhc2UsIDB4MTY4OGE4YTgpOwkgICAgCisgICAgICAgIHVsRGF0YSA9IFJlYWRTT0NfREQodWxTQ1VCYXNlICsgMHgwOCk7ICAgICAgICAgICAgCisgICAgICAgIFdyaXRlU09DX0REKHVsU0NVQmFzZSArIDB4MDgsIHVsRGF0YSAmIDB4RkZGRkZGMDApOwkgICAgCisgICAgfQorCSAgICAJICAgIAorICAgIHVsQ291bnRlciA9ICh1bERDTEsvMTAwMCkgKiA1MTIgLyAyNDAwMCAtIDE7CisgICAgdWxMb3dMaW1pdCA9IHVsQ291bnRlciAqICgxMDAgLSB1bEVyclJhdGUpIC8gMTAwOworICAgIHVsSGlnaExpbWl0ID0gdWxDb3VudGVyICogKDEwMCArIHVsRXJyUmF0ZSkgLyAxMDA7CisKKyAgICBERUxBWSgxMCk7CisgICAgV3JpdGVTT0NfREQodWxTQ1VCYXNlLCAweDE2ODhhOGE4KTsKKyAgICBXcml0ZVNPQ19ERCh1bFNDVUJhc2UgKyAweDI4LCAodWxIaWdoTGltaXQgPDwgMTYpIHwgdWxMb3dMaW1pdCk7CisgICAgV3JpdGVTT0NfREQodWxTQ1VCYXNlICsgMHgxMCwgdWxQTExNb2RlKTsKKyAgICBXcml0ZVNPQ19ERCh1bFNDVUJhc2UgKyAweDEwLCB1bFBMTE1vZGUgfCAweDAzKTsKKyAgICBERUxBWSgxKTsKKyAgICBkbyB7CisgICAgICAgIHVsRGF0YSA9IFJlYWRTT0NfREQodWxTQ1VCYXNlICsgMHgxMCk7ICAgICAgICAgICAgCisgICAgfSB3aGlsZSAoISh1bERhdGEgJiAweDQwKSk7CQorICAgIHVsVmFsdWUgPSBSZWFkU09DX0REKHVsU0NVQmFzZSArIDB4MTQpOyAgICAgICAgICAgIAorICAgIAorICAgIC8vUGF0Y2ggZm9yIEFTVDExNjAvMTE4MCBEQ0xLIGNhbGN1bGF0ZQorICAgIGlmICggKChWR0FJbmZvLT51c0RldmljZUlEID09IDB4MTE2MCkgfHwgKFZHQUluZm8tPnVzRGV2aWNlSUQgPT0gMHgxMTgwKSkgJiYgKHVsUExMTW9kZSA9PSBEUExMX1BMTE1PREVfQVNUMTE2MCkgKQorICAgIHsKKyAgICAgICAgdWxEYXRhID0gUmVhZFNPQ19ERCgweDgwZmM5MDZjKTsgICAgICAgICAgICAKKyAgICAJdWxEaXYgICA9IHVsRGF0YSAmIDB4MDAwYzAwMDA7CisgICAgCXVsRGl2ID4+PSAxODsKKyAgICAJdWxEaXYrKzsKKyAgICAJdWxWYWx1ZSAvPSB1bERpdjsKKyAgICB9CisgICAgCisgICAgaWYgKCAoVkdBSW5mby0+alJldmlzaW9uID49IDB4MjApICYmICh1bFBMTE1vZGUgPT0gREVMMF9QTExNT0RFX0FTVDIzMDApICkKKyAgICB7CisgICAgICBkZWwwID0gKGRvdWJsZSkoMjQuMCAqICh1bFZhbHVlICsgMSkgLyA1MTIuMCk7CisgICAgICBkZWwwID0gMTAwMC9kZWwwLzE2Lzg7CisgICAgICB1bGRlbDAgPSAoVUxPTkcpIChkZWwwICogMTAwMDAwMCk7CisgICAgICBpZiAodWxkZWwwIDwgdWxEQ0xLKQorICAgICAgeworICAgICAgICAgIHByaW50ZiggIltQQVNTXVtERUwwXSBBY3R1YWwgREVMMDolZiBucywgTWF4LiBERUwwOiVmIG5zIFxuIiwgZGVsMCwgKGRvdWJsZSl1bERDTEsvMTAwMDAwMCk7ICAgIAkJICAgICAgCisgICAgICAgICAgdWxEYXRhIHw9IDB4ODA7CisgICAgICB9ICAgIAorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgIHByaW50ZiggIltFUlJPUl1bREVMMF0gQWN0dWFsIERFTDA6JWYgbnMsIE1heC4gREVMMDolZiBucyBcbiIsIGRlbDAsIChkb3VibGUpdWxEQ0xLLzEwMDAwMDApOyAgICAJCSAgICAgIAkgICAgICAKKyAgICAgICAgICB1bERhdGEgPT0gMHgwMDsgICAgCisgICAgICB9ICAgIAorICAgIH0JCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiW0lORk9dIFBMTCBQcmVkaWN0IENvdW50ID0gJXgsIEFjdHVhbCBDb3VudCA9ICV4IFxuIiwgdWxDb3VudGVyLCB1bFZhbHVlKTsJCisgICAgfQorICAgIAorICAgIFdyaXRlU09DX0REKHVsU0NVQmFzZSArIDB4MTAsIDB4MkMpOwkvL2Rpc2FibGUgcmluZworICAgICAgICAKKyAgICBpZiAodWxEYXRhICYgMHg4MCkKKyAgICAgICAgcmV0dXJuIChUUlVFKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybihGQUxTRSk7ICAgIAkKK30gLyogQ29tcGFyZVRvUmluZyAqLwkKKworVk9JRCBHZXREUkFNSW5mbyhfVkdBSW5mbyAqVkdBSW5mbykKK3sKKyAgICBVTE9ORyB1bERhdGEsIHVsRGF0YTI7CisgICAgVUxPTkcgdWxSZWZQTEwsIHVsRGVOdW1lcmF0b3IsIHVsTnVtZXJhdG9yLCB1bERpdmlkZXIsIHVsT0Q7CisKKyAgICBpZiAoVkdBSW5mby0+alJldmlzaW9uID49IDB4MTApCisgICAgeworICAgICAgICBXcml0ZVNPQ19ERCgweDFlNmUyMDAwLCAweDE2ODhBOEE4KTsKKwkgICAgCisgICAgICAgIC8vR2V0IERSQU0gQnVzIFdpZHRoCisgICAgICAgIHVsRGF0YSAgPSBSZWFkU09DX0REKDB4MWU2ZTAwMDQpOyAgICAgICAgCisgICAgICAgIGlmICh1bERhdGEgJiAweDQwKQorICAgICAgICAgICBWR0FJbmZvLT51bERSQU1CdXNXaWR0aCA9IDE2OworICAgICAgICBlbHNlICAgIAorICAgICAgICAgICBWR0FJbmZvLT51bERSQU1CdXNXaWR0aCA9IDMyOyAgICAKKyAgCisgICAgICAgIHVsUmVmUExMID0gMjQwMDA7CSAgICAgICAgICAgIAorICAgICAgICBpZiAoVkdBSW5mby0+alJldmlzaW9uID49IDB4MzApCS8vQVNUMjQwMAorICAgICAgICB7CisgICAgICAgICAgICB1bERhdGEgPSBSZWFkU09DX0REKDB4MWU2ZTIwNzApOworICAgICAgICAgICAgaWYgKHVsRGF0YSAmIDB4MDA4MDAwMDApCS8vRFsyM10gPSAxCisgICAgICAgICAgICAgICAgdWxSZWZQTEwgPSAyNTAwMDsJICAgICAgICAgICAgCisgICAgICAgIH0gICAgICAgICAKKworICAgICAgICB1bERhdGEgID0gUmVhZFNPQ19ERCgweDFlNmUyMDIwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB1bERlTnVtZXJhdG9yID0gdWxEYXRhICYgMHgwRjsKKyAgICAgICAgdWxOdW1lcmF0b3IgPSAodWxEYXRhICYgMHgwN0UwKSA+PiA1OworICAgICAgICB1bE9EID0gKHVsRGF0YSAmIDB4MTApID8gMToyOworICAgICAgICAgICAgCisgICAgICAgIHVsRGF0YSA9ICh1bERhdGEgJiAweDcwMDApID4+IDEyOyAgICAgICAgCisgICAgICAgIHN3aXRjaCAodWxEYXRhKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDB4MDc6CisgICAgICAgICAgICAgICAgdWxEaXZpZGVyID0gMTY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MDY6CisgICAgICAgICAgICAgICAgdWxEaXZpZGVyID0gODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgwNToKKyAgICAgICAgICAgICAgICB1bERpdmlkZXIgPSA0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDA0OgorICAgICAgICAgICAgICAgIHVsRGl2aWRlciA9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdWxEaXZpZGVyID0gMHgwMTsgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0gICAgCisgICAgCisgICAgICAgIFZHQUluZm8tPnVsTUNMSyA9IHVsUmVmUExMICogdWxPRCAqICh1bE51bWVyYXRvciArIDIpIC8gKCh1bERlTnVtZXJhdG9yICsgMSkgKiB1bERpdmlkZXIgKiAxMDAwKTsgICAgICAgICAgICAgICAgICAJICAgICAgICAKKyAgICB9ICAgIAorfSAvLyBHZXREUkFNSW5mbworCitWT0lEIEdldENMS0luZm8oIF9WR0FJbmZvICpWR0FJbmZvKQoreworICAgIFVMT05HIHVsRGF0YSwgdWxDUFVUcmFwLCB1bEFIQlRyYXA7CisgICAgVUxPTkcgdWxSZWZQTEwsIHVsRGVOdW1lcmF0b3IsIHVsTnVtZXJhdG9yLCB1bERpdmlkZXIsIHVsT0Q7CisKKyAgICBpZiAoVkdBSW5mby0+alJldmlzaW9uID49IDB4MzApCisgICAgeworICAgICAgICBXcml0ZVNPQ19ERCgweDFlNmUyMDAwLCAweDE2ODhhOGE4KTsKKyAgICAgICAgdWxEYXRhID0gUmVhZFNPQ19ERCgweDFlNmUyMDI0KTsgICAgICAgICAgICAKKyAgICAgICAgaWYgKHVsRGF0YSAmIDB4NDAwMDApCQkvL2Zyb20gSC1QTEwJCQorICAgICAgICB7CisgICAgICAgICAgICB1bFJlZlBMTCA9IDI0MDAwOwkgICAgICAgICAgICAKKyAgICAgICAgICAgIHVsRGF0YSA9IFJlYWRTT0NfREQoMHgxZTZlMjA3MCk7CisgICAgICAgICAgICBpZiAodWxEYXRhICYgMHgwMDgwMDAwMCkJLy9EWzIzXSA9IDEKKyAgICAgICAgICAgICAgICB1bFJlZlBMTCA9IDI1MDAwOwkgICAgICAgICAgICAKKwkgICAgICAgIAorICAgICAgICAgICAgdWxEYXRhID0gUmVhZFNPQ19ERCgweDFlNmUyMDI0KTsgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHVsRGVOdW1lcmF0b3IgPSB1bERhdGEgJiAweDBGOworICAgICAgICAgICAgdWxOdW1lcmF0b3IgPSAodWxEYXRhICYgMHgwN0UwKSA+PiA1OworICAgICAgICAgICAgdWxPRCA9ICh1bERhdGEgJiAweDEwKSA/IDE6MjsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICBWR0FJbmZvLT51bENQVUNMSyA9IHVsUmVmUExMICogdWxPRCAqICh1bE51bWVyYXRvciArIDIpIC8gKCh1bERlTnVtZXJhdG9yICsgMSkgKiAxMDAwKTsgICAgICAgICAgCisgICAgICAgIAkKKyAgICAgICAgfQorICAgICAgICBlbHNlCQkJCS8vZnJvbSB0cmFwcGluZworICAgICAgICB7ICAgICAgICAKKyAgICAgICAgICAgICB1bFJlZlBMTCA9IDI0OwkgICAgICAgICAgICAKKyAgICAgICAgICAgICB1bERhdGEgPSBSZWFkU09DX0REKDB4MWU2ZTIwNzApOworICAgICAgICAgICAgIGlmICh1bERhdGEgJiAweDAwODAwMDAwKQkvL0RbMjNdID0gMQorICAgICAgICAgICAgICAgIHVsUmVmUExMID0gMjU7IAorICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgIHVsQ1BVVHJhcCA9IHVsRGF0YSAmIDB4MDMwMDsKKyAgICAgICAgICAgICB1bENQVVRyYXAgPj49IDg7CisgICAgICAgICAKKyAgICAgICAgICAgICBzd2l0Y2ggKHVsQ1BVVHJhcCkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAweDAwOgorICAgICAgICAgICAgICAgICAgICBWR0FJbmZvLT51bENQVUNMSyA9IHVsUmVmUExMICogMTY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHgwMToKKyAgICAgICAgICAgICAgICAgICAgVkdBSW5mby0+dWxDUFVDTEsgPSB1bFJlZlBMTCAqIDE1OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDI6CisgICAgICAgICAgICAgICAgICAgIFZHQUluZm8tPnVsQ1BVQ0xLID0gdWxSZWZQTEwgKiAxNDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDAzOgorICAgICAgICAgICAgICAgICAgICBWR0FJbmZvLT51bENQVUNMSyA9IHVsUmVmUExMICogMTc7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIH0JCisgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdWxEYXRhID0gUmVhZFNPQ19ERCgweDFlNmUyMDcwKTsgICAgICAgICAgICAKKyAgICAgICAgdWxBSEJUcmFwID0gdWxEYXRhICYgMHgwYzAwOworICAgICAgICB1bEFIQlRyYXAgPj49IDEwOyAgICAgICAgCisgICAgICAgIHN3aXRjaCAodWxBSEJUcmFwKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDB4MDA6CisgICAgICAgICAgICAgICAgVkdBSW5mby0+dWxBSEJDTEsgPSBWR0FJbmZvLT51bENQVUNMSzsKKyAgICAgICAgICAgICAgICBicmVhazsJCisgICAgICAgICAgICBjYXNlIDB4MDE6CisgICAgICAgICAgICAgICAgVkdBSW5mby0+dWxBSEJDTEsgPSBWR0FJbmZvLT51bENQVUNMSyAvIDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CSAgICAgICAgCisgICAgICAgICAgICBjYXNlIDB4MDI6CisgICAgICAgICAgICAgICAgVkdBSW5mby0+dWxBSEJDTEsgPSBWR0FJbmZvLT51bENQVUNMSyAvIDQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CSAgICAgICAgCisgICAgICAgICAgICBjYXNlIDB4MDM6CisgICAgICAgICAgICAgICAgVkdBSW5mby0+dWxBSEJDTEsgPSBWR0FJbmZvLT51bENQVUNMSyAvIDM7CisgICAgICAgICAgICBicmVhazsJCisgICAgICAgIH0JCisJICAgICAgICAKKyAgICB9IC8vQVNUMjQwMAkgICAgCisgICAgZWxzZSBpZiAoVkdBSW5mby0+alJldmlzaW9uID49IDB4MjApCisgICAgeworICAgICAgICBXcml0ZVNPQ19ERCgweDFlNmUyMDAwLCAweDE2ODhhOGE4KTsKKyAgICAgICAgdWxEYXRhID0gUmVhZFNPQ19ERCgweDFlNmUyMDI0KTsgICAgICAgICAgICAKKyAgICAgICAgaWYgKHVsRGF0YSAmIDB4NDAwMDApCQkvL2Zyb20gSC1QTEwJCQorICAgICAgICB7CisgICAgICAgICAgICB1bFJlZlBMTCA9IDI0MDAwOworICAgICAgICAgICAgCisgICAgICAgICAgICB1bERhdGEgPSBSZWFkU09DX0REKDB4MWU2ZTIwMjQpOyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgdWxEZU51bWVyYXRvciA9IHVsRGF0YSAmIDB4MEY7CisgICAgICAgICAgICB1bE51bWVyYXRvciA9ICh1bERhdGEgJiAweDA3RTApID4+IDU7CisgICAgICAgICAgICB1bE9EID0gKHVsRGF0YSAmIDB4MTApID8gMToyOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIFZHQUluZm8tPnVsQ1BVQ0xLID0gdWxSZWZQTEwgKiB1bE9EICogKHVsTnVtZXJhdG9yICsgMikgLyAoKHVsRGVOdW1lcmF0b3IgKyAxKSAqIDEwMDApOyAgICAgICAgICAKKyAgICAgICAgCQorICAgICAgICB9CisgICAgICAgIGVsc2UJCQkJLy9mcm9tIHRyYXBwaW5nCisgICAgICAgIHsgICAgICAgIAorICAgICAgICAgICAgIHVsRGF0YSA9IFJlYWRTT0NfREQoMHgxZTZlMjA3MCk7ICAgICAgICAgICAgCisgICAgICAgICAgICAgdWxDUFVUcmFwID0gdWxEYXRhICYgMHgwMzAwOworICAgICAgICAgICAgIHVsQ1BVVHJhcCA+Pj0gODsKKyAgICAgICAgIAorICAgICAgICAgICAgIHN3aXRjaCAodWxDUFVUcmFwKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDA6CisgICAgICAgICAgICAgICAgICAgIFZHQUluZm8tPnVsQ1BVQ0xLID0gMzg0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDE6CisgICAgICAgICAgICAgICAgICAgIFZHQUluZm8tPnVsQ1BVQ0xLID0gMzYwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDI6CisgICAgICAgICAgICAgICAgICAgIFZHQUluZm8tPnVsQ1BVQ0xLID0gMzM2OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDM6CisgICAgICAgICAgICAgICAgICAgIFZHQUluZm8tPnVsQ1BVQ0xLID0gNDA4OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICB9CQorICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHVsRGF0YSA9IFJlYWRTT0NfREQoMHgxZTZlMjA3MCk7ICAgICAgICAgICAgCisgICAgICAgIHVsQUhCVHJhcCA9IHVsRGF0YSAmIDB4MGMwMDsKKyAgICAgICAgdWxBSEJUcmFwID4+PSAxMDsgICAgICAgIAorICAgICAgICBzd2l0Y2ggKHVsQUhCVHJhcCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAweDAwOgorICAgICAgICAgICAgICAgIFZHQUluZm8tPnVsQUhCQ0xLID0gVkdBSW5mby0+dWxDUFVDTEs7CisgICAgICAgICAgICAgICAgYnJlYWs7CQorICAgICAgICAgICAgY2FzZSAweDAxOgorICAgICAgICAgICAgICAgIFZHQUluZm8tPnVsQUhCQ0xLID0gVkdBSW5mby0+dWxDUFVDTEsgLyAyOworICAgICAgICAgICAgICAgIGJyZWFrOwkgICAgICAgIAorICAgICAgICAgICAgY2FzZSAweDAyOgorICAgICAgICAgICAgICAgIFZHQUluZm8tPnVsQUhCQ0xLID0gVkdBSW5mby0+dWxDUFVDTEsgLyA0OworICAgICAgICAgICAgICAgIGJyZWFrOwkgICAgICAgIAorICAgICAgICAgICAgY2FzZSAweDAzOgorICAgICAgICAgICAgICAgIFZHQUluZm8tPnVsQUhCQ0xLID0gVkdBSW5mby0+dWxDUFVDTEsgLyAzOworICAgICAgICAgICAgYnJlYWs7CQorICAgICAgICB9CQorCSAgICAgICAgCisgICAgfSAvL0FTVDIzMDAgICAgCit9IC8vIEdldENMS0luZm8KKworaW50IHBsbF9mdW5jdGlvbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIF9WR0FJbmZvICpwVkdBSW5mbzsKKyAgICBVTE9ORyAgICB1bEVyclJhdGUgPSAxOworICAgIFVMT05HICAgIFBMTE1vZGU7CisgICAgVUxPTkcgICAgUmVmQ2xrOworICAgIENIQVIgICAgICpzdG9wX2F0OworICAgIENIQVIgICAgIGk7CisgICAgCisgICAgcHJpbnRmKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFxuIik7ICAgICAgIAorICAgIHByaW50ZigiKioqIEFTUEVFRCBHcmFwaGljcyBQTEwgVGVzdCAlcyBMb2cgICAgICAgKioqIFxuIiwgalZlcnNpb24pOworICAgIHByaW50ZigiKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdS1ib290ICoqKiBcbiIpOworICAgIHByaW50ZigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBcbiIpOyAKKyAgICBwcmludGYoIlxuIik7IAorICAgIAorICAgIC8vIENoZWNrIGNoaXAgdHlwZQorICAgIHN3aXRjaCAoIFJlYWRTT0NfREQoIDB4MWU2ZTIwMDAgKyAweDdjICkgKSB7ICAgCisgICAgICAgIGNhc2UgMHgwMjAxMDMwMyA6CisgICAgICAgIGNhc2UgMHgwMjAwMDMwMyA6IAorICAgICAgICAgICAgcHJpbnRmKCJUaGUgY2hpcCBpcyBBU1QyNDAwXG4iICk7IAorICAgICAgICAgICAgcFZHQUluZm8tPnVzRGV2aWNlSUQgPSAweDI0MDA7IAorICAgICAgICAgICAgcFZHQUluZm8tPmpSZXZpc2lvbiAgPSAweDMwOyAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSAweDAyMDEwMTAzIDoKKyAgICAgICAgY2FzZSAweDAyMDAwMDAzIDogCisgICAgICAgICAgICBwcmludGYoIlRoZSBjaGlwIGlzIEFTVDE0MDBcbiIgKTsgCisgICAgICAgICAgICBwVkdBSW5mby0+dXNEZXZpY2VJRCA9IDB4MTQwMDsgCisgICAgICAgICAgICBwVkdBSW5mby0+alJldmlzaW9uICA9IDB4MzA7ICAgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIDB4MDEwMTAzMDMgOgorICAgICAgICBjYXNlIDB4MDEwMDAwMDMgOiAKKyAgICAgICAgICAgIHByaW50ZigiVGhlIGNoaXAgaXMgQVNUMjMwMFxuIiApOyAKKyAgICAgICAgICAgIHBWR0FJbmZvLT51c0RldmljZUlEID0gMHgyMzAwOyAKKyAgICAgICAgICAgIHBWR0FJbmZvLT5qUmV2aXNpb24gID0gMHgyMDsgICAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgICAgY2FzZSAweDAxMDEwMjAzIDogCisgICAgICAgICAgICBwcmludGYoIlRoZSBjaGlwIGlzIEFTVDEwNTBcbiIgKTsgCisgICAgICAgICAgICBwVkdBSW5mby0+dXNEZXZpY2VJRCA9IDB4MTA1MDsgCisgICAgICAgICAgICBwVkdBSW5mby0+alJldmlzaW9uICA9IDB4MjA7ICAgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGRlZmF1bHQgICAgIDogCisgICAgICAgICAgICBwcmludGYgKCJFcnJvciBTaWxpY29uIFJldmlzaW9uIElEKFNDVTdDKSAlMDhseCEhIVxuIiwgUmVhZFNPQ19ERCggMHgxZTZlMjAwMCArIDB4N2MgKSApOyAKKyAgICAgICAgICAgIHJldHVybigxKTsKKyAgICB9CisgICAgCisgICAgCisgICAgR2V0RFJBTUluZm8oIHBWR0FJbmZvICk7CisgICAgR2V0Q0xLSW5mbyggcFZHQUluZm8gKTsKKworICAgIGlmICggKCBhcmdjIDw9IDEgKSB8fCAoIGFyZ2MgPj0gNCApICl7CisgICAgICAgIHByaW50X3VzYWdlKCk7CisgICAgICAgIHJldHVybiAoRVJSX0ZBVEFMKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoIGkgPSAxOyBpIDwgYXJnYzsgaSsrICkgeworICAgICAgICAgICAgc3dpdGNoICggaSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RyY21wKGFyZ3ZbaV0sICJtLXBsbCIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIAlpZiAocFZHQUluZm8tPmpSZXZpc2lvbiA+PSAweDIwKQorICAgICAgICAgICAgICAgICAgICAJICAgIFBMTE1vZGUgPSBNUExMX1BMTE1PREVfQVNUMjMwMDsKKyAgICAgICAgICAgICAgICAgICAgCWVsc2UKKyAgICAgICAgICAgICAgICAgICAgCSAgICBQTExNb2RlID0gTVBMTF9QTExNT0RFOworICAgICAgICAgICAgICAgICAgICAJCisgICAgICAgICAgICAgICAgICAgIAlSZWZDbGsgPSBwVkdBSW5mby0+dWxNQ0xLICogMTAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgCWlmIChwVkdBSW5mby0+alJldmlzaW9uID49IDB4MjApCS8vZHVhbC1lZGdlCisgICAgICAgICAgICAgICAgICAgIAkgICAgUmVmQ2xrIC89IDI7ICAgICAgICAgICAgCQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgImgtcGxsIikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgCSAgICAgICAgICAgIGlmIChwVkdBSW5mby0+alJldmlzaW9uID49IDB4MjApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUExMTW9kZSA9IEhQTExfUExMTU9ERV9BU1QyMzAwOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBMTE1vZGUgPSBIUExMX1BMTE1PREU7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vQVNUMjMwMCBvbmx5IGhhcyBIQ0xLIHJpbmcgdGVzdCBtb2RlLCB5Y2NoZW5AMDQwNTEyCisgICAgICAgICAgICAgICAgICAgICAgICBSZWZDbGsgPSBwVkdBSW5mby0+dWxDUFVDTEsgKiAxMDAwMDAwOwkvL090aGVyICA6IEgtUExMCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFZHQUluZm8tPmpSZXZpc2lvbiA+PSAweDIwKQkvL0FTVDIzMDA6IEhDTEsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZDbGsgPSBwVkdBSW5mby0+dWxBSEJDTEsgKiAxMDAwMDAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdXNhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRVJSX0ZBVEFMKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIHVsRXJyUmF0ZSA9IChVTE9ORykgc3RydG91bChhcmd2W2ldLCAmc3RvcF9hdCwgMTApOwkgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gLy8gRW5kIHN3aXRjaCgpCisgICAgICAgIH0gLy8gRW5kIGZvcgorICAgIH0gCisgICAgCisgICAgLyogQ29tcGFyZSByaW5nICovCisgICAgaWYgKENvbXBhcmVUb1JpbmcocFZHQUluZm8sIFBMTE1vZGUsIFJlZkNsaywgdWxFcnJSYXRlICkgPT0gVFJVRSkKKyAgICB7CisJICAgIHByaW50ZigiW1BBU1NdICVzIFBMTCBDaGVjayBQYXNzISEgXG4iLCBhcmd2WzFdKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJICAgIHByaW50ZigiW0VSUk9SXSAlcyBQTEwgQ2hlY2sgRmFpbGVkISEgXG4iLCBhcmd2WzFdKTsJCisgICAgICAgIHJldHVybiAoRVJSX0ZBVEFMKTsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvU1BJTS5jIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvU1BJTS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYmRkMDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9TUElNLmMKQEAgLTAsMCArMSw2MyBAQAorLyoNCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCisgKg0KKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBDQorICovDQorI2RlZmluZSBTUElNX0MNCitzdGF0aWMgY29uc3QgY2hhciBUaGlzRmlsZVtdID0gIlNQSU0uYyI7DQorDQorI2luY2x1ZGUgIlNXRlVOQy5IIg0KKw0KKyNpZmRlZiBTUElfQlVTDQorDQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKyNpbmNsdWRlIDxjb25pby5oPg0KKyNpbmNsdWRlIDxzdHJpbmcuaD4NCisjaW5jbHVkZSAiVFlQRURFRi5IIg0KKyNpbmNsdWRlICJMSUJfU1BJLkgiDQorDQorI2RlZmluZSBTUElNX0NNRF9XSEEgICAgIDB4MDENCisjZGVmaW5lIFNQSU1fQ01EX1JEICAgICAgMHgwQg0KKyNkZWZpbmUgU1BJTV9DTURfRFJEICAgICAweEJCDQorI2RlZmluZSBTUElNX0NNRF9XUiAgICAgIDB4MDINCisjZGVmaW5lIFNQSU1fQ01EX0RXUiAgICAgMHhEMg0KKyNkZWZpbmUgU1BJTV9DTURfU1RBICAgICAweDA1DQorI2RlZmluZSBTUElNX0NNRF9FTkJZVEUgIDB4MDYNCisjZGVmaW5lIFNQSU1fQ01EX0RJU0JZVEUgMHgwNA0KKw0KK1VMT05HIHNwaW1fY3M7DQorVUxPTkcgc3BpbV9iYXNlOw0KK1VMT05HIHNwaW1faGFkcjsNCisNCit2b2lkIHNwaW1fZW5kKCkNCit7DQorICBVTE9ORyBkYXRhOw0KKw0KKyAgZGF0YSA9IE1JbmR3bSgoVUxPTkcpbW1pb2Jhc2UsIDB4MUU2MjAwMTAgKyAoc3BpbV9jcyA8PCAyKSk7DQorICBNT3V0ZHdtKCAoVUxPTkcpbW1pb2Jhc2UsIDB4MUU2MjAwMTAgKyAoc3BpbV9jcyA8PCAyKSwgZGF0YSB8IDB4NCk7DQorICBNT3V0ZHdtKCAoVUxPTkcpbW1pb2Jhc2UsIDB4MUU2MjAwMTAgKyAoc3BpbV9jcyA8PCAyKSwgZGF0YSk7DQorfQ0KKw0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQordm9pZCBzcGltX2luaXQoaW50IGNzKQ0KK3sNCisgIFVMT05HIGRhdGE7DQorDQorICBzcGltX2NzID0gY3M7DQorICBNT3V0ZHdtKCAoVUxPTkcpbW1pb2Jhc2UsIDB4MUU2MjAwMDAsICgweDIgPDwgKGNzIDw8IDEpKSB8ICgweDEwMDAwIDw8IGNzKSk7DQorICBNT3V0ZHdtKCAoVUxPTkcpbW1pb2Jhc2UsIDB4MUU2MjAwMTAgKyAoY3MgPDwgMiksIDB4MDAwMDAwMDcpOw0KKyAgTU91dGR3bSggKFVMT05HKW1taW9iYXNlLCAweDFFNjIwMDEwICsgKGNzIDw8IDIpLCAweDAwMDAyMDAzKTsNCisgIE1PdXRkd20oIChVTE9ORyltbWlvYmFzZSwgMHgxRTYyMDAwNCwgMHgxMDAgPDwgY3MpOw0KKyAgZGF0YSA9IE1JbmR3bSgoVUxPTkcpbW1pb2Jhc2UsIDB4MUU2MjAwMzAgKyAoY3MgPDwgMikpOw0KKyAgc3BpbV9iYXNlID0gMHgyMDAwMDAwMCB8ICgoZGF0YSAmIDB4MDA3ZjAwMDApIDw8IDcpOw0KKyAgTU91dHdtICggKFVMT05HKW1taW9iYXNlLCBzcGltX2Jhc2UsIFNQSU1fQ01EX1dIQSk7DQorICBzcGltX2VuZCgpOw0KKyAgc3BpbV9oYWRyID0gMDsNCit9DQorI2VuZGlmIC8vIEVuZCBTUElfQlVTDQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvU1REVUJPT1QuSCBiL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL1NURFVCT09ULkgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiZjU5MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL1NURFVCT09ULkgKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaWZuZGVmIFNURFVCT09UX0gKKyNkZWZpbmUgU1REVUJPT1RfSAorCit1bnNpZ25lZCBsb25nIGludCBzdHJ0b3VsKGNoYXIgKnN0cmluZywgY2hhciAqKmVuZFB0ciwgaW50IGJhc2UpOworaW50IGF0b2koIGNoYXIgc1tdICk7CitpbnQgcmFuZCh2b2lkKTsKKworI2VuZGlmIC8vIEVuZCBTVERVQk9PVF9ICmRpZmYgLS1naXQgYS9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9TVERVQk9PVC5jIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvU1REVUJPT1QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGUyOTk3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvU1REVUJPT1QuYwpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjZGVmaW5lIFNURFVCT09UX0MKK3N0YXRpYyBjb25zdCBjaGFyIFRoaXNGaWxlW10gPSAiU1REVUJPT1QuYyI7CisKKyNpbmNsdWRlICJTV0ZVTkMuSCIKKworI2lmZGVmIFNMVF9VQk9PVAorCitpbnQgaXNzcGFjZSAoIGNoYXIgYyApCit7CisgICAgaWYgKCAoIGMgPT0gJyAnICkgfHwgKCBjID09IDkgKSB8fCAoIGMgPT0gMTMgKSApCisgICAgICAgIHJldHVybiAxOworICAgIAorICAgIHJldHVybiAwOworfQorCisvKiAKKyAqIHN0cnRvdWwuYyAtLQorICoKKyAqICBTb3VyY2UgY29kZSBmb3IgdGhlICJzdHJ0b3VsIiBsaWJyYXJ5IHByb2NlZHVyZS4KKyAqCisgKiBDb3B5cmlnaHQgMTk4OCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQKKyAqIGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuICBUaGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhCisgKiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMKKyAqIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dAorICogZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICovCisKKy8vI2luY2x1ZGUgPGN0eXBlLmg+CisKKy8qCisgKiBUaGUgdGFibGUgYmVsb3cgaXMgdXNlZCB0byBjb252ZXJ0IGZyb20gQVNDSUkgZGlnaXRzIHRvIGEKKyAqIG51bWVyaWNhbCBlcXVpdmFsZW50LiAgSXQgbWFwcyBmcm9tICcwJyB0aHJvdWdoICd6JyB0byBpbnRlZ2VycworICogKDEwMCBmb3Igbm9uLWRpZ2l0IGNoYXJhY3RlcnMpLgorICovCisKK3N0YXRpYyBjaGFyIGN2dEluW10gPSB7CisgICAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgICAgICAgLyogJzAnIC0gJzknICovCisgICAgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwgMTAwLCAgICAgIC8qIHB1bmN0dWF0aW9uICovCisgICAgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIC8qICdBJyAtICdaJyAqLworICAgIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LAorICAgIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsCisgICAgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwgICAgICAgLyogcHVuY3R1YXRpb24gKi8KKyAgICAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgLyogJ2EnIC0gJ3onICovCisgICAgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksCisgICAgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNX07CisKKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBzdHJ0b3VsIC0tCisgKgorICogIENvbnZlcnQgYW4gQVNDSUkgc3RyaW5nIGludG8gYW4gaW50ZWdlci4KKyAqCisgKiBSZXN1bHRzOgorICogIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGludGVnZXIgZXF1aXZhbGVudCBvZiBzdHJpbmcuICBJZiBlbmRQdHIKKyAqICBpcyBub24tTlVMTCwgdGhlbiAqZW5kUHRyIGlzIGZpbGxlZCBpbiB3aXRoIHRoZSBjaGFyYWN0ZXIKKyAqICBhZnRlciB0aGUgbGFzdCBvbmUgdGhhdCB3YXMgcGFydCBvZiB0aGUgaW50ZWdlci4gIElmIHN0cmluZworICogIGRvZXNuJ3QgY29udGFpbiBhIHZhbGlkIGludGVnZXIgdmFsdWUsIHRoZW4gemVybyBpcyByZXR1cm5lZAorICogIGFuZCAqZW5kUHRyIGlzIHNldCB0byBzdHJpbmcuCisgKgorICogU2lkZSBlZmZlY3RzOgorICogIE5vbmUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKwordW5zaWduZWQgbG9uZyBpbnQKK3N0cnRvdWwoY2hhciAqc3RyaW5nLCBjaGFyICoqZW5kUHRyLCBpbnQgYmFzZSkKKyAgICAvKiBzdHJpbmc7ICAgICBTdHJpbmcgb2YgQVNDSUkgZGlnaXRzLCBwb3NzaWJseQorICAgICAgICAgICAgICAgICAqIHByZWNlZGVkIGJ5IHdoaXRlIHNwYWNlLiAgRm9yIGJhc2VzCisgICAgICAgICAgICAgICAgICogZ3JlYXRlciB0aGFuIDEwLCBlaXRoZXIgbG93ZXItIG9yCisgICAgICAgICAgICAgICAgICogdXBwZXItY2FzZSBkaWdpdHMgbWF5IGJlIHVzZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgLyogKiplbmRQdHI7ICAgV2hlcmUgdG8gc3RvcmUgYWRkcmVzcyBvZiB0ZXJtaW5hdGluZworICAgICAgICAgICAgICAgICAqIGNoYXJhY3Rlciwgb3IgTlVMTC4gKi8KKyAgICAvKiBiYXNlOyAgICAgICBCYXNlIGZvciBjb252ZXJzaW9uLiAgTXVzdCBiZSBsZXNzCisgICAgICAgICAgICAgICAgICogdGhhbiAzNy4gIElmIDAsIHRoZW4gdGhlIGJhc2UgaXMgY2hvc2VuCisgICAgICAgICAgICAgICAgICogZnJvbSB0aGUgbGVhZGluZyBjaGFyYWN0ZXJzIG9mIHN0cmluZzoKKyAgICAgICAgICAgICAgICAgKiAiMHgiIG1lYW5zIGhleCwgIjAiIG1lYW5zIG9jdGFsLCBhbnl0aGluZworICAgICAgICAgICAgICAgICAqIGVsc2UgbWVhbnMgZGVjaW1hbC4KKyAgICAgICAgICAgICAgICAgKi8KK3sKKyAgICByZWdpc3RlciBjaGFyICpwOworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IHJlc3VsdCA9IDA7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgZGlnaXQ7CisgICAgaW50IGFueURpZ2l0cyA9IDA7CisKKyAgICAvKgorICAgICAqIFNraXAgYW55IGxlYWRpbmcgYmxhbmtzLgorICAgICAqLworCisgICAgcCA9IHN0cmluZzsKKyAgICB3aGlsZSAoaXNzcGFjZSgqcCkpIHsKKyAgICBwICs9IDE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiBubyBiYXNlIHdhcyBwcm92aWRlZCwgcGljayBvbmUgZnJvbSB0aGUgbGVhZGluZyBjaGFyYWN0ZXJzCisgICAgICogb2YgdGhlIHN0cmluZy4KKyAgICAgKi8KKyAgICAKKyAgICBpZiAoYmFzZSA9PSAwKQorICAgIHsKKyAgICBpZiAoKnAgPT0gJzAnKSB7CisgICAgICAgIHAgKz0gMTsKKyAgICAgICAgaWYgKCpwID09ICd4JykgeworICAgICAgICBwICs9IDE7CisgICAgICAgIGJhc2UgPSAxNjsKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAvKgorICAgICAgICAgKiBNdXN0IHNldCBhbnlEaWdpdHMgaGVyZSwgb3RoZXJ3aXNlICIwIiBwcm9kdWNlcyBhCisgICAgICAgICAqICJubyBkaWdpdHMiIGVycm9yLgorICAgICAgICAgKi8KKworICAgICAgICBhbnlEaWdpdHMgPSAxOworICAgICAgICBiYXNlID0gODsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGJhc2UgPSAxMDsKKyAgICB9IGVsc2UgaWYgKGJhc2UgPT0gMTYpIHsKKworICAgIC8qCisgICAgICogU2tpcCBhIGxlYWRpbmcgIjB4IiBmcm9tIGhleCBudW1iZXJzLgorICAgICAqLworCisgICAgaWYgKChwWzBdID09ICcwJykgJiYgKHBbMV0gPT0gJ3gnKSkgeworICAgICAgICBwICs9IDI7CisgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogU29ycnkgdGhpcyBjb2RlIGlzIHNvIG1lc3N5LCBidXQgc3BlZWQgc2VlbXMgaW1wb3J0YW50LiAgRG8KKyAgICAgKiBkaWZmZXJlbnQgdGhpbmdzIGZvciBiYXNlIDgsIDEwLCAxNiwgYW5kIG90aGVyLgorICAgICAqLworCisgICAgaWYgKGJhc2UgPT0gOCkgeworICAgIGZvciAoIDsgOyBwICs9IDEpIHsKKyAgICAgICAgZGlnaXQgPSAqcCAtICcwJzsKKyAgICAgICAgaWYgKGRpZ2l0ID4gNykgeworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IDMpICsgZGlnaXQ7CisgICAgICAgIGFueURpZ2l0cyA9IDE7CisgICAgfQorICAgIH0gZWxzZSBpZiAoYmFzZSA9PSAxMCkgeworICAgIGZvciAoIDsgOyBwICs9IDEpIHsKKyAgICAgICAgZGlnaXQgPSAqcCAtICcwJzsKKyAgICAgICAgaWYgKGRpZ2l0ID4gOSkgeworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSAoMTAqcmVzdWx0KSArIGRpZ2l0OworICAgICAgICBhbnlEaWdpdHMgPSAxOworICAgIH0KKyAgICB9IGVsc2UgaWYgKGJhc2UgPT0gMTYpIHsKKyAgICBmb3IgKCA7IDsgcCArPSAxKSB7CisgICAgICAgIGRpZ2l0ID0gKnAgLSAnMCc7CisgICAgICAgIGlmIChkaWdpdCA+ICgneicgLSAnMCcpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRpZ2l0ID0gY3Z0SW5bZGlnaXRdOworICAgICAgICBpZiAoZGlnaXQgPiAxNSkgeworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IDQpICsgZGlnaXQ7CisgICAgICAgIGFueURpZ2l0cyA9IDE7CisgICAgfQorICAgIH0gZWxzZSB7CisgICAgZm9yICggOyA7IHAgKz0gMSkgeworICAgICAgICBkaWdpdCA9ICpwIC0gJzAnOworICAgICAgICBpZiAoZGlnaXQgPiAoJ3onIC0gJzAnKSkgeworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkaWdpdCA9IGN2dEluW2RpZ2l0XTsKKyAgICAgICAgaWYgKGRpZ2l0ID49IGJhc2UpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0KmJhc2UgKyBkaWdpdDsKKyAgICAgICAgYW55RGlnaXRzID0gMTsKKyAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZWUgaWYgdGhlcmUgd2VyZSBhbnkgZGlnaXRzIGF0IGFsbC4KKyAgICAgKi8KKworICAgIGlmICghYW55RGlnaXRzKSB7CisgICAgcCA9IHN0cmluZzsKKyAgICB9CisKKyAgICBpZiAoZW5kUHRyICE9IDApIHsKKyAgICAqZW5kUHRyID0gcDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IGF0b2koIGNoYXIgc1tdICkKK3sKKworICAgIGludCBpOworICAgIGludCBhbnMgPSAwOworCisgICAgZm9yKCBpID0gMDsgc1tpXSA+PSAnMCcgJiYgc1tpXSA8PSAnOSc7ICsraSApCisgICAgICAgIGFucyA9ICggMTAgKiBhbnMgKSArICggc1tpXSAtICcwJyApOworCisgICAgcmV0dXJuIGFuczsKK30gCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiByYW5kOnJldHVybiBwc2V1ZG8tcmFuZG9tIGludGVnZXIgb24gMC4uLjMyNzY3ICovCitpbnQgcmFuZCh2b2lkKQoreworICAgIHN0YXRpYyB1bnNpZ25lZCBsb25nIGludCBuZXh0ID0gMTsKKyAgICAKKyAgICBuZXh0ID0gbmV4dCAqIDExMDM1MTUyNDUgKyAxMjM0NTsgCisKKyAgICByZXR1cm4gKHVuc2lnbmVkIGludCkgKCBuZXh0IC8gNjU1MzYgKSAlIDMyNzY4OworfQorCisjZW5kaWYgLy8gRW5kIFNMVF9VQk9PVApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvU1RSRVNTLmMgYi9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9TVFJFU1MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmZkNjRmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvU1RSRVNTLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qDQorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorICoNCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQ0KKyAqLw0KKyNkZWZpbmUgU1RSRVNTX0MNCitzdGF0aWMgY29uc3QgY2hhciBUaGlzRmlsZVtdID0gIlNUUkVTUy5jIjsNCisNCisjaW5jbHVkZSAiU1dGVU5DLkgiDQorI2luY2x1ZGUgPENPTU1JTkYuSD4NCisjaW5jbHVkZSA8SU8uSD4NCisNCisjZGVmaW5lIFRJTUVPVVRfRFJBTSAgICAgICAgICAgICAgNTAwMDAwMA0KKw0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCitpbnQgTU1DVGVzdEJ1cnN0KHVuc2lnbmVkIGludCBkYXRhZ2VuKQ0KK3sNCisgIHVuc2lnbmVkIGludCBkYXRhOw0KKyAgdW5zaWduZWQgaW50IHRpbWVvdXQgPSAwOw0KKyAgDQorICBXcml0ZVNPQ19ERCggMHgxRTZFMDA3MCwgMHgwMDAwMDAwMCApOw0KKyAgV3JpdGVTT0NfREQoIDB4MUU2RTAwNzAsICgweDAwMDAwMEMxIHwgKGRhdGFnZW4gPDwgMykpICk7DQorICANCisgIGRvIHsNCisgICAgZGF0YSA9IFJlYWRTT0NfREQoIDB4MUU2RTAwNzAgKSAmIDB4MzAwMDsNCisNCisgICAgaWYoIGRhdGEgJiAweDIwMDAgKQ0KKyAgICAgIHJldHVybigwKTsNCisNCisgICAgaWYoICsrdGltZW91dCA+IFRJTUVPVVRfRFJBTSApIHsNCisgICAgICBwcmludGYoIlRpbWVvdXQhIVxuIik7DQorICAgICAgV3JpdGVTT0NfREQoIDB4MUU2RTAwNzAsIDB4MDAwMDAwMDAgKTsNCisgICAgICANCisgICAgICByZXR1cm4oMCk7DQorICAgIH0NCisgIH0gd2hpbGUoICFkYXRhICk7DQorICBXcml0ZVNPQ19ERCggMHgxRTZFMDA3MCwgMHgwMDAwMDAwMCApOw0KKyAgDQorICByZXR1cm4oMSk7DQorfQ0KKw0KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCitpbnQgTU1DVGVzdFNpbmdsZSh1bnNpZ25lZCBpbnQgZGF0YWdlbikNCit7DQorICB1bnNpZ25lZCBpbnQgZGF0YTsNCisgIHVuc2lnbmVkIGludCB0aW1lb3V0ID0gMDsNCisNCisgIFdyaXRlU09DX0REKCAweDFFNkUwMDcwLCAweDAwMDAwMDAwICk7DQorICBXcml0ZVNPQ19ERCggMHgxRTZFMDA3MCwgKDB4MDAwMDAwODUgfCAoZGF0YWdlbiA8PCAzKSkgKTsNCisgIA0KKyAgZG8gew0KKyAgICBkYXRhID0gUmVhZFNPQ19ERCggMHgxRTZFMDA3MCApICYgMHgzMDAwOw0KKyAgICANCisgICAgaWYoIGRhdGEgJiAweDIwMDAgKQ0KKyAgICAgIHJldHVybigwKTsNCisgICAgDQorICAgIGlmKCArK3RpbWVvdXQgPiBUSU1FT1VUX0RSQU0gKXsNCisgICAgICBwcmludGYoIlRpbWVvdXQhIVxuIik7DQorICAgICAgV3JpdGVTT0NfREQoIDB4MUU2RTAwNzAsIDB4MDAwMDAwMDAgKTsNCisgICAgICANCisgICAgICByZXR1cm4oMCk7DQorICAgIH0NCisgIH0gd2hpbGUgKCAhZGF0YSApOw0KKyAgV3JpdGVTT0NfREQoIDB4MUU2RTAwNzAsIDB4MDAwMDAwMDAgKTsNCisgIA0KKyAgcmV0dXJuKDEpOw0KK30NCisNCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQoraW50IE1NQ1Rlc3QoKQ0KK3sNCisgIHVuc2lnbmVkIGludCBwYXR0ZXJuOw0KKw0KKyAgcGF0dGVybiA9IFJlYWRTT0NfREQoIDB4MUU2RTIwNzggKTsNCisgIHByaW50ZigiUGF0dGVybiA9ICUwOFggOiAiLHBhdHRlcm4pOw0KKw0KKyAgV3JpdGVTT0NfREQoMHgxRTZFMDA3NCwgKERSQU1fTWFwQWRyIHwgMHg3ZmZmZmYpICk7DQorICBXcml0ZVNPQ19ERCgweDFFNkUwMDdDLCBwYXR0ZXJuICk7DQorICANCisgIGlmKCFNTUNUZXN0QnVyc3QoMCkpICAgIHJldHVybigwKTsNCisgIGlmKCFNTUNUZXN0QnVyc3QoMSkpICAgIHJldHVybigwKTsNCisgIGlmKCFNTUNUZXN0QnVyc3QoMikpICAgIHJldHVybigwKTsNCisgIGlmKCFNTUNUZXN0QnVyc3QoMykpICAgIHJldHVybigwKTsNCisgIGlmKCFNTUNUZXN0QnVyc3QoNCkpICAgIHJldHVybigwKTsNCisgIGlmKCFNTUNUZXN0QnVyc3QoNSkpICAgIHJldHVybigwKTsNCisgIGlmKCFNTUNUZXN0QnVyc3QoNikpICAgIHJldHVybigwKTsNCisgIGlmKCFNTUNUZXN0QnVyc3QoNykpICAgIHJldHVybigwKTsNCisgIGlmKCFNTUNUZXN0U2luZ2xlKDApKSAgIHJldHVybigwKTsNCisgIGlmKCFNTUNUZXN0U2luZ2xlKDEpKSAgIHJldHVybigwKTsNCisgIGlmKCFNTUNUZXN0U2luZ2xlKDIpKSAgIHJldHVybigwKTsNCisgIGlmKCFNTUNUZXN0U2luZ2xlKDMpKSAgIHJldHVybigwKTsNCisgIGlmKCFNTUNUZXN0U2luZ2xlKDQpKSAgIHJldHVybigwKTsNCisgIGlmKCFNTUNUZXN0U2luZ2xlKDUpKSAgIHJldHVybigwKTsNCisgIGlmKCFNTUNUZXN0U2luZ2xlKDYpKSAgIHJldHVybigwKTsNCisgIGlmKCFNTUNUZXN0U2luZ2xlKDcpKSAgIHJldHVybigwKTsNCisNCisgIHJldHVybigxKTsNCit9DQorDQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KK2ludCBkcmFtX3N0cmVzc19mdW5jdGlvbihpbnQgYXJnYywgY2hhciAqYXJndltdKQ0KK3sNCisgICAgdW5zaWduZWQgaW50IFBhc3M7DQorICAgIHVuc2lnbmVkIGludCBQYXNzQ250ICAgICA9IDA7DQorICAgIHVuc2lnbmVkIGludCBUZXN0Y291bnRlciA9IDA7DQorICAgIGludCAgICAgICAgICByZXQgPSAxOw0KKyAgICBjaGFyICAgICAgICAgKnN0b3BfYXQ7DQorDQorICAgIHByaW50ZigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBcbiIpOyAgICAgICANCisgICAgcHJpbnRmKCIqKiogQVNQRUVEIFN0cmVzcyBEUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqIFxuIik7DQorICAgIHByaW50ZigiKioqICAgICAgICAgICAgICAgICAgICAgICAgICAyMDEzMTEwNyBmb3IgdS1ib290ICoqKiBcbiIpOw0KKyAgICBwcmludGYoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXG4iKTsgDQorICAgIHByaW50ZigiXG4iKTsgDQorICANCisgICAgaWYgKCBhcmdjICE9IDIgKXsNCisgICAgICAgIHJldCA9IDA7DQorICAgICAgICByZXR1cm4gKCByZXQgKTsNCisgICAgfQ0KKyAgICBlbHNlIHsNCisgICAgICAgIFRlc3Rjb3VudGVyID0gKHVuc2lnbmVkIGludCkgc3RydG91bChhcmd2WzFdLCAmc3RvcF9hdCwgMTApOyAgICAgICAgICAgICAgICAgICAgIA0KKyAgICB9DQorDQorICAgIFdyaXRlU09DX0REKDB4MUU2RTAwMDAsIDB4RkM2MDAzMDkpOyAgIA0KKw0KKyAgICB3aGlsZSggKCBUZXN0Y291bnRlciA+IFBhc3NDbnQgKSB8fCAoIFRlc3Rjb3VudGVyID09IDAgKSApew0KKyAgICAgICAgaWYoICFNTUNUZXN0KCkgKSB7DQorICAgICAgICAgICAgcHJpbnRmKCJGQUlMLi4uJWQvJWRcbiIsIFBhc3NDbnQsIFRlc3Rjb3VudGVyKTsNCisgICAgICAgICAgICByZXQgPSAwOw0KKyAgICAgIA0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgUGFzc0NudCsrOw0KKyAgICAgICAgICAgIHByaW50ZigiUGFzcyAlZC8lZFxuIiwgUGFzc0NudCwgVGVzdGNvdW50ZXIpOw0KKyAgICAgICAgfQ0KKyAgICAgfSAvLyBFbmQgd2hpbGUoKQ0KKyAgICAgDQorICAgICByZXR1cm4oIHJldCApOw0KK30NCisNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9TV0ZVTkMuSCBiL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL1NXRlVOQy5ICm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMDM2NTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9TV0ZVTkMuSApAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaWZuZGVmIFNXRlVOQ19ICisjZGVmaW5lIFNXRlVOQ19ICisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFByb2dyYW0gaW5mb3JtYXRpb24KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lICAgIFZFUl9OQU1FICAgICJWZXIgMC4zNCB2ZXJzaW9uIEAyMDE0LzAzLzI1IDA5MzIiCisKKy8qID09IFN0ZXAgMTogPT09PT09IFN1cHBvcnQgT1Mgc3lzdGVtID09PT09PT09PT09PT09PT09PT0gKi8KKy8vIExpbnV4QVAKKy8vICNkZWZpbmUgV2luZG93cworI2RlZmluZSBTTFRfVUJPT1QKKy8vI2RlZmluZSBTTFRfRE9TCisKKy8qID09IFN0ZXAgMjo9PT09PT09PSBTdXBwb3J0IGludGVyZmFjZSA9PT09PT09PT09PT09PT09PT0gKi8KKy8qIENob29zZSBPbmUgKi8KKy8vI2RlZmluZSBTUElfQlVTCisvLyNkZWZpbmUgVVNFX0xQQworLy8jZGVmaW5lIFVTRV9QMkEgICAgIC8vIFBDSSBvciBQQ0llIGJ1cyB0byBBSEIgYnVzCisKKy8qID09IFN0ZXAgMzo9PT09PT09PT09ICBTdXBwb3J0IENoaXAgICA9PT09PT09PT09PT09PT09PT0gKi8KKy8vI2RlZmluZSBBU1QxMDEwX0NISVAKKy8vI2RlZmluZSBBU1QzMjAwX0lPTUFQCisvLyNkZWZpbmUgRlBHQQorCisjaWZkZWYgQVNUMTAxMF9DSElQCisgICAgI2lmZGVmIFNMVF9VQk9PVAorICAgICAgICAjZGVmaW5lIEFTVDEwMTBfSU9NQVAgICAxCisgICAgI2VuZGlmCisgICAgI2lmZGVmIFNMVF9ET1MKKyAgICAgICAgI2RlZmluZSBBU1QxMDEwX0lPTUFQICAgMgorICAgICAgICAKKyAgICAgICAgLy8gQVNUMTAxMCBvbmx5IGhhcyBMUEMgaW50ZXJmYWNlIAorICAgICAgICAjdW5kZWYgVVNFX1AyQQorICAgICAgICAjdW5kZWYgU1BJX0JVUworICAgICAgICAjZGVmaW5lIFVTRV9MUEMKKyAgICAjZW5kaWYKKyNlbmRpZiAgIAorCisvKiA9PSBTdGVwIDQ6PT09PT09PT09PSAgIFNlbGVjdCBQSFkgICAgPT09PT09PT09PT09PT09PT09ICovCisvLyNkZWZpbmUgU1VQUE9SVF9QSFlfTEFOOTMwMyAgICAgICAgLy8gSW5pdGlhbCBQSFkgdmlhIEkyQyBidXMKKyNkZWZpbmUgTEFOOTMwM19JMkNfQlVTTlVNICAgICAgNiAgLy8gMS1iYXNlZAorI2RlZmluZSBMQU45MzAzX0kyQ19BRFIgICAgICAgICAweDE0CisKKy8qID09PT09PT09PT09PT09PT09PT09PT0gUHJvZ3JhbSA9PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8vIFRoZSAiUEhZX05DU0kiIG9wdGlvbiBpcyBvbmx5IGZvciBET1MgY29tcGlsZXIKKyNpZiBkZWZpbmVkIChQSFlfTkNTSSkKKyAgICAjaWZkZWYgU0xUX1VCT09UCisgICAgICAgICNlcnJvciBXcm9uZyBzZXR0aW5nLi4uLi4uCisgICAgI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKFBIWV9OQ1NJKQorICAgICNpZmRlZiBTVVBQT1JUX1BIWV9MQU45MzAzCisgICAgICAgICNlcnJvciBXcm9uZyBzZXR0aW5nIChDYW4ndCBzdXBwb3J0IExBTjkzMDMpLi4uLi4uCisgICAgI2VuZGlmCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT0gIENoZWNrIHNldHRpbmcgID09PT09PT09PT09PT09PT09PT09PSAqLworI2lmZGVmIFNMVF9VQk9PVAorICAgICNpZmRlZiBTTFRfRE9TCisgICAgICAgICNlcnJvciBDYW4gTk9UIHN1cHBvcnQgdHdvIE9TIAorICAgICNlbmRpZgorI2VuZGlmCisjaWZkZWYgU0xUX0RPUworICAgICNpZmRlZiBTTFRfVUJPT1QKKyAgICAgICAgI2Vycm9yIENhbiBOT1Qgc3VwcG9ydCB0d28gT1MgCisgICAgI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFVTRV9QMkEKKyAgICAjaWZkZWYgU0xUX1VCT09UCisgICAgICAgICNlcnJvciBDYW4gTk9UIGJlIHNldCBQQ0kgYnVzIGluIFVib290CisgICAgI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBVU0VfTFBDCisgICAgI2lmZGVmIFNMVF9VQk9PVAorICAgICAgICAjZXJyb3IgQ2FuIE5PVCBiZSBzZXQgTFBDIGJ1cyBpbiBVYm9vdAorICAgICNlbmRpZgorI2VuZGlmCisjaWZkZWYgU1BJX0JVUworICAgICNpZmRlZiBTTFRfVUJPT1QKKyAgICAgICAgI2Vycm9yIENhbiBOT1QgYmUgc2V0IFNQSSBidXMgaW4gVWJvb3QgCisgICAgI2VuZGlmCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09IFByb2dyYW0gZmxvdyBjb250cm9sID09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2RlZmluZSBSVU5fU1RFUCAgICAgICAgICAgICAgICAgICAgIDUKKy8vIDA6IHJlYWRfc2N1CisvLyAxOiBwYXJhbWV0ZXIgc2V0dXAKKy8vIDI6IGluaXRfc2N1MSwKKy8vIDM6IGluaXRfc2N1X21hY3JzdAorLy8gNDogRGF0YSBJbml0aWFsCisvLyA1OiBBTEwKKworLyogPT09PT09PT09PT09PT09PT09PT09PSBTd2l0Y2ggcHJpbnQgZGVidWcgbWVzc2FnZSA9PT09PT09PT09PT09PT09PT09PT09ICovCisjZGVmaW5lICAgRGJnUHJuX0VuYWJsZV9EZWJ1Z19kZWxheSAgMAorLy8jZGVmaW5lICAgRGJnUHJuX0Z1bmNIZWFkZXIgICAgICAgICAgMCAvLzEKKyNkZWZpbmUgICBEYmdQcm5fRXJyRmxnICAgICAgICAgICAgICAwCisjZGVmaW5lICAgRGJnUHJuX0J1ZkFkciAgICAgICAgICAgICAgMCAvLzEKKyNkZWZpbmUgICBEYmdQcm5fQnVmZGF0ICAgICAgICAgICAgICAwCisjZGVmaW5lICAgRGJnUHJuX0J1ZmRhdERldGFpbCAgICAgICAgMAorI2RlZmluZSAgIERiZ1Bybl9QSFlSVyAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgICBEYmdQcm5fUEhZSW5pdCAgICAgICAgICAgICAwCisjZGVmaW5lICAgRGJnUHJuX1BIWU5hbWUgICAgICAgICAgICAgMAorI2RlZmluZSAgIERiZ1Bybl9EdW1wTUFDQ250ICAgICAgICAgIDAKKyNkZWZpbmUgICBEYmdQcm5fSW5mbyAgICAgICAgICAgICAgICAwIC8vMQorI2RlZmluZSAgIERiZ1Bybl9GUkFNRV9MRU4gICAgICAgICAgIDAKKworCisvKiA9PT09PT09PT09PT0gRW5hYmxlIG9yIERpc2FibGUgQ2hlY2sgaXRlbSBvZiB0aGUgZGVzY3JpcHRvciA9PT09PT09PT09PT0gKi8KKyNkZWZpbmUgICBDaGVja1J4T3duCisjZGVmaW5lICAgQ2hlY2tSeEVycgorLy8jZGVmaW5lICAgQ2hlY2tPZGROaWJibGUKKyNkZWZpbmUgICBDaGVja0NSQworI2RlZmluZSAgIENoZWNrUnhGSUZPRnVsbAorI2RlZmluZSAgIENoZWNrUnhMZW4KKy8vI2RlZmluZSAgIENoZWNrRGF0YUV2ZXJ5VGltZQorCisvLyNkZWZpbmUgICBDaGVja1J4YnVmVU5BVkEKKyNkZWZpbmUgICBDaGVja1JQa3RMb3N0CisvLyNkZWZpbmUgICBDaGVja05QVHhidWZVTkFWQQorI2RlZmluZSAgIENoZWNrVFBrdExvc3QKKyNkZWZpbmUgICBDaGVja1J4QnVmCisKKyNlbmRpZiAvLyBTV0ZVTkNfSApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvVFJBUFRFU1QuYyBiL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL1RSQVBURVNULmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5MzZjMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL1RSQVBURVNULmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2RlZmluZSBQTExURVNUX0MKK3N0YXRpYyBjb25zdCBjaGFyIFRoaXNGaWxlW10gPSAiUExMVEVTVC5jIjsKKworI2luY2x1ZGUgIlNXRlVOQy5IIgorCisjaW5jbHVkZSA8Q09NTUlORi5IPgorI2luY2x1ZGUgPFRZUEVERUYuSD4KKyNpbmNsdWRlIDxJTy5IPgorCisjZGVmaW5lIEFTVENISVBfMjQwMCAgICAwCisjZGVmaW5lIEFTVENISVBfMjMwMCAgICAxCisjZGVmaW5lIEFTVENISVBfMTQwMCAgICAyCisjZGVmaW5lIEFTVENISVBfMTMwMCAgICAzCisjZGVmaW5lIEFTVENISVBfMTA1MCAgICA0CisKK2NvbnN0IFVDSEFSIGpWZXJzaW9uW10gPSAidi4wLjYwLjA2IjsKKwordHlwZWRlZiBzdHJ1Y3QgX1RSQVBJTkZPIHsKKyAgICBVU0hPUlQgIENQVV9jbGs7CisgICAgVUNIQVIgICBDUFVfQUhCX3JhdGlvOworfSBfVHJhcEluZm87CisKK2NvbnN0IF9UcmFwSW5mbyBBU1RfZGVmYXVsdF90cmFwX3NldHRpbmdbXSA9IHsKKyAgICAvLyBDUFVfY2xrLCBDUFVfQUhCX3JhdGlvCisgICAgeyAzODQsICAgICAgMiB9LCAgICAgICAgICAgIC8vIEFTVDI0MDAgb3IgQVNUMTI1MCAoIEFTVENISVBfMjQwMCApCisgICAgeyAzODQsICAgICAgMiB9LCAgICAgICAgICAgIC8vIEFTVDIzMDAgKCBBU1RDSElQXzIzMDAgKQorICAgIHsgMzg0LCAgIDB4RkYgfSwgICAgICAgICAgICAvLyBBU1QxNDAwICggQVNUQ0hJUF8xNDAwICkKKyAgICB7IDM4NCwgICAweEZGIH0sICAgICAgICAgICAgLy8gQVNUMTMwMCAoIEFTVENISVBfMTMwMCApCisgICAgeyAzODQsICAgICAgMiB9ICAgICAgICAgICAgIC8vIEFTVDEwNTAgKCBBU1RDSElQXzEwNTAgKQorfTsKKworaW50IHRyYXBfZnVuY3Rpb24oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBVQ0hBUiAgIGNoaXB0eXBlOyAgIAorICAgIFVMT05HICAgdWxEYXRhLCB1bFRlbXA7IAorICAgIFVDSEFSICAgc3RhdHVzID0gVFJVRTsKKyAgICBVU0hPUlQgIHZhbF90cmFwOworICAgIAorICAgIHByaW50ZigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBcbiIpOyAgICAgICAKKyAgICBwcmludGYoIioqKiBBU1BFRUQgVHJhcCBUZXN0ICVzIExvZyAgICAgICAgICAgICAgICoqKiBcbiIsIGpWZXJzaW9uKTsKKyAgICBwcmludGYoIioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHUtYm9vdCAqKiogXG4iKTsKKyAgICBwcmludGYoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXG4iKTsgCisgICAgcHJpbnRmKCJcbiIpOyAKKyAgICAKKyAgICAvLyBDaGVjayBjaGlwIHR5cGUKKyAgICBzd2l0Y2ggKCBSZWFkU09DX0REKCAweDFlNmUyMDAwICsgMHg3YyApICkgeyAgIAorICAgICAgICBjYXNlIDB4MDIwMTAzMDMgOgorICAgICAgICBjYXNlIDB4MDIwMDAzMDMgOiAKKyAgICAgICAgICAgIHByaW50ZigiVGhlIGNoaXAgaXMgQVNUMjQwMCBvciBBU1QxMjUwXG4iICk7IAorICAgICAgICAgICAgY2hpcHR5cGUgPSBBU1RDSElQXzI0MDA7IAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSAweDAyMDEwMTAzIDoKKyAgICAgICAgY2FzZSAweDAyMDAwMDAzIDogCisgICAgICAgICAgICBwcmludGYoIlRoZSBjaGlwIGlzIEFTVDE0MDBcbiIgKTsgCisgICAgICAgICAgICBjaGlwdHlwZSA9IEFTVENISVBfMTQwMDsgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIDB4MDEwMTAzMDMgOgorICAgICAgICBjYXNlIDB4MDEwMDAwMDMgOiAKKyAgICAgICAgICAgIHByaW50ZigiVGhlIGNoaXAgaXMgQVNUMjMwMFxuIiApOyAKKyAgICAgICAgICAgIGNoaXB0eXBlID0gQVNUQ0hJUF8yMzAwOyAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgICAgY2FzZSAweDAxMDEwMjAzIDogCisgICAgICAgICAgICBwcmludGYoIlRoZSBjaGlwIGlzIEFTVDEwNTBcbiIgKTsgCisgICAgICAgICAgICBjaGlwdHlwZSA9IEFTVENISVBfMTA1MDsgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIDB4MDEwMTAwMDMgOiAKKyAgICAgICAgICAgIHByaW50ZigiVGhlIGNoaXAgaXMgQVNUMTMwMFxuIiApOyAKKyAgICAgICAgICAgIGNoaXB0eXBlID0gQVNUQ0hJUF8xMzAwOyAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIGRlZmF1bHQgICAgIDogCisgICAgICAgICAgICBwcmludGYgKCJFcnJvciBTaWxpY29uIFJldmlzaW9uIElEKFNDVTdDKSAlMDhseCEhIVxuIiwgUmVhZFNPQ19ERCggMHgxZTZlMjAwMCArIDB4N2MgKSApOyAKKyAgICAgICAgICAgIHJldHVybigxKTsKKyAgICB9CisgICAgCisgICAgV3JpdGVTT0NfREQoMHgxZTZlMjAwMCwgMHgxNjg4QThBOCk7CisgICAgdWxEYXRhID0gUmVhZFNPQ19ERCgweDFlNmUyMDcwKTsKKyAgICAKKyAgICAvLyBDaGVjayBDUFUgY2xvY2sKKyAgICB1bFRlbXAgID0gdWxEYXRhOworICAgIHVsVGVtcCAmPSAweDAzMDA7CisgICAgdWxUZW1wID4+PSA4OworICAgIAorICAgIHN3aXRjaCAodWxUZW1wKQorICAgIHsKKyAgICAgICAgY2FzZSAweDAwOgorICAgICAgICAgICAgdmFsX3RyYXAgPSAzODQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDAxOgorICAgICAgICAgICAgdmFsX3RyYXAgPSAzNjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDAyOgorICAgICAgICAgICAgdmFsX3RyYXAgPSAzMzY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDAzOgorICAgICAgICAgICAgdmFsX3RyYXAgPSA0MDg7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgaWYgKEFTVF9kZWZhdWx0X3RyYXBfc2V0dGluZ1tjaGlwdHlwZV0uQ1BVX2NsayAhPSB2YWxfdHJhcCkKKyAgICB7CisgICAgICAgIHByaW50ZigiW0VSUk9SXSBDUFUgQ0xLOiBDb3JyZWN0IGlzICVkOyBSZWFsIGlzICVkIFxuIiwgQVNUX2RlZmF1bHRfdHJhcF9zZXR0aW5nW2NoaXB0eXBlXS5DUFVfY2xrLCB2YWxfdHJhcCk7CQorICAgIAlzdGF0dXMgPSBGQUxTRTsKKyAgICB9CisgICAgICAgICAgIAkKKyAgICAvLyBDaGVjayBjcHVfYWhiX3JhdGlvCisgICAgdWxUZW1wICA9IHVsRGF0YTsKKyAgICB1bFRlbXAgJj0gMHgwYzAwOworICAgIHVsVGVtcCA+Pj0gMTA7CisgICAgCisgICAgc3dpdGNoICh1bFRlbXApCisgICAgeworICAgICAgICBjYXNlIDB4MDA6CisgICAgICAgICAgICB2YWxfdHJhcCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDAxOgorICAgICAgICAgICAgdmFsX3RyYXAgPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwMjoKKyAgICAgICAgICAgIHZhbF90cmFwID0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MDM6CisgICAgICAgICAgICB2YWxfdHJhcCA9IDM7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgaWYgKEFTVF9kZWZhdWx0X3RyYXBfc2V0dGluZ1tjaGlwdHlwZV0uQ1BVX0FIQl9yYXRpbyAhPSB2YWxfdHJhcCkKKyAgICB7CisgICAgICAgIHByaW50ZigiW0VSUk9SXSBDUFU6QUhCOiBDb3JyZWN0IGlzICV4OjE7IFJlYWwgaXMgJXg6MSBcbiIsIEFTVF9kZWZhdWx0X3RyYXBfc2V0dGluZ1tjaGlwdHlwZV0uQ1BVX0FIQl9yYXRpbywgdmFsX3RyYXApOwkKKyAgICAJc3RhdHVzID0gRkFMU0U7CisgICAgfQorICAgIAorICAgIGlmICggc3RhdHVzID09IFRSVUUgKQorICAgICAgICBwcmludGYoIltQQVNTXSBoYXJkd2FyZSB0cmFwIGZvciBDUFUgY2xvY2sgYW5kIENQVVxcQUhCIHJhdGlvLlxuIik7CisgICAgCisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL1RZUEVERUYuSCBiL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL1RZUEVERUYuSApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDUzYWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvVFlQRURFRi5ICkBAIC0wLDAgKzEsNzQgQEAKKy8qDQorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorICoNCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQ0KKyAqLw0KKyNpZm5kZWYgVFlQRURFRl9IDQorI2RlZmluZSBUWVBFREVGX0gNCisNCisjaW5jbHVkZSAiU1dGVU5DLkgiDQorDQorLy8NCisvLyBEZWZpbmUNCisvLw0KKyNkZWZpbmUgICBQQ0kgICAgICAgICAgICAgICAgICAgMQ0KKyNkZWZpbmUgICBQQ0lFICAgICAgICAgICAgICAgICAgMg0KKyNkZWZpbmUgICBBR1AgICAgICAgICAgICAgICAgICAgMw0KKyNkZWZpbmUgICBBQ1RJVkUgICAgICAgICAgICAgICAgNA0KKw0KKyNpZiBkZWZpbmVkKExpbnV4QVApDQorICAgICNpZm5kZWYgRkxPTkcNCisgICAgICAgICNkZWZpbmUgRkxPTkcgICB1bnNpZ25lZCBsb25nDQorICAgICNlbmRpZg0KKyAgICAjaWZuZGVmIFVMT05HDQorICAgICAgICAjZGVmaW5lIFVMT05HICAgdW5zaWduZWQgbG9uZw0KKyAgICAjZW5kaWYNCisgICAgI2lmbmRlZiBMT05HDQorICAgICAgICAjZGVmaW5lIExPTkcgICAgbG9uZw0KKyAgICAjZW5kaWYNCisgICAgI2lmbmRlZiBVU0hPUlQNCisgICAgICAgICNkZWZpbmUgVVNIT1JUICB1bnNpZ25lZCBzaG9ydA0KKyAgICAjZW5kaWYNCisgICAgI2lmbmRlZiBTSE9SVA0KKyAgICAgICAgI2RlZmluZSBTSE9SVCAgIHNob3J0DQorICAgICNlbmRpZg0KKyAgICAjaWZuZGVmIFVDSEFSDQorICAgICAgICAjZGVmaW5lIFVDSEFSICAgdW5zaWduZWQgY2hhcg0KKyAgICAjZW5kaWYNCisgICAgI2lmbmRlZiBDSEFSDQorICAgICAgICAjZGVmaW5lIENIQVIgICAgY2hhcg0KKyAgICAjZW5kaWYNCisgICAgI2lmbmRlZiBCWVRFDQorICAgICAgICAjZGVmaW5lIEJZVEUgICAgdW5zaWduZWQgY2hhcg0KKyAgICAjZW5kaWYNCisgICAgI2lmbmRlZiBWT0lEDQorICAgICAgICAjZGVmaW5lIFZPSUQgICAgdm9pZA0KKyAgICAjZW5kaWYNCisgICAgI2lmbmRlZiBTQ0hBUg0KKyAgICAgICAgI2RlZmluZSBTQ0hBUiAgIHNpZ25lZCBjaGFyDQorICAgICNlbmRpZg0KKyNlbHNlCQ0KKy8qIERPUyBQcm9ncmFtICovDQorICAgICNkZWZpbmUgICAgIFZPSUQJICB2b2lkDQorICAgICNkZWZpbmUgICAgIEZMT05HICAgICB1bnNpZ25lZCBsb25nDQorICAgICNkZWZpbmUgICAgIFVMT05HICAgICB1bnNpZ25lZCBsb25nDQorICAgICNkZWZpbmUgICAgIFVTSE9SVCAgICB1bnNpZ25lZCBzaG9ydA0KKyAgICAjZGVmaW5lICAgICBVQ0hBUiAgICAgdW5zaWduZWQgY2hhcg0KKyAgICAjZGVmaW5lICAgICBMT05HICAgICAgbG9uZw0KKyAgICAjZGVmaW5lICAgICBTSE9SVCAgICAgc2hvcnQNCisgICAgI2RlZmluZSAgICAgQ0hBUiAgICAgIGNoYXINCisgICAgI2RlZmluZSAgICAgQllURQkgIFVDSEFSDQorICAgICNkZWZpbmUgICAgIEJPT0wJICBTSE9SVA0KKyAgICAjZGVmaW5lICAgICBCT09MRUFOICAgdW5zaWduZWQgc2hvcnQNCisgICAgI2RlZmluZSAgICAgUFVMT05HICAgIFVMT05HICoNCisgICAgI2RlZmluZSAgICAgU0NIQVIgICAgIHNpZ25lZCBjaGFyDQorI2VuZGlmICAgIA0KKyAgICAjZGVmaW5lCSAgICBUUlVFICAgICAgMQ0KKyAgICAjZGVmaW5lCSAgICBGQUxTRSAgICAgMA0KKyAgICANCisjZW5kaWYgLy8gVFlQRURFRl9IDQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvbWFjdGVzdC5jIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvbWFjdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YmQ1NjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9tYWN0ZXN0LmMKQEAgLTAsMCArMSwxMjE1IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNkZWZpbmUgTUFDVEVTVF9DCitzdGF0aWMgY29uc3QgY2hhciBUaGlzRmlsZVtdID0gIk1BQ1RFU1QuYyI7CisKKyNpbmNsdWRlICJTV0ZVTkMuSCIKKworI2lmZGVmIFNMVF9VQk9PVAorICAjaW5jbHVkZSA8Y29tbW9uLmg+CisgICNpbmNsdWRlIDxjb21tYW5kLmg+CisgICNpbmNsdWRlIDxwb3N0Lmg+CisgICNpbmNsdWRlIDxtYWxsb2MuaD4KKyAgI2luY2x1ZGUgPG5ldC5oPgorICAjaW5jbHVkZSA8Q09NTUlORi5IPgorICAjaW5jbHVkZSA8U1REVUJPT1QuSD4KKyAgI2luY2x1ZGUgPElPLkg+CisjZWxzZQorICAjaW5jbHVkZSA8c3RkbGliLmg+CisgICNpbmNsdWRlIDxzdHJpbmcuaD4KKyAgI2luY2x1ZGUgIkxJQi5IIgorICAjaW5jbHVkZSAiQ09NTUlORi5IIgorICAjaW5jbHVkZSAiSU8uSCIKKyNlbmRpZgorCitjb25zdCAgQllURSAgICAgICAgVmFsX0FycmF5WzE2XSAgICA9IHswLDEsIDIsMywgNCw1LCA2LDcsIDgsOSwgMTAsMTEsIDEyLDEzLCAxNCwxNX07IC8vIEFTVDIzMDAtQTEKK2NvbnN0ICBCWVRFICAgICAgICBWYWxfQXJyYXlfQTBbMTZdID0gezgsMSwgMTAsMywgMTIsNSwgMTQsNywgMCw5LCAyLDExLCA0LDEzLCA2LDE1fTsgLy8gQVNUMjMwMC1BMAorCisjaWZkZWYgU0xUX1VCT09UCitpbnQgbWFpbl9mdW5jdGlvbihpbnQgYXJnYywgY2hhciAqYXJndltdKQorI2VuZGlmCisjaWZkZWYgU0xUX0RPUworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKKyNlbmRpZgoreworICAgIENIQVIgICAgTUFDMl9WYWxpZDsKKyAgICBDSEFSICAgIE1BQ18xR0VuOworICAgIENIQVIgICAgTUFDMV9STUlJOworICAgIENIQVIgICAgRW5hYmxlX0ludExvb3BQSFk7CisgICAgQ0hBUiAgICBEaXNhYmxlX1JlY292UEhZOworICAgIENIQVIgICAgRm9yY2UxRzsKKyAgICBDSEFSICAgIEZvcmNlMTBNOworICAgIENIQVIgICAgRm9yY2UxMDBNOworICAgIENIQVIgICAgKnN0b3BfYXQ7CisgICAgVUxPTkcgICBJT1N0cl92YWw7CisgICAgVUxPTkcgICBJT1N0cl9tYXg7CisgICAgVUxPTkcgICBJT1N0cl9zaGY7CisgICAgVUxPTkcgICBJT2RseV92YWw7CisgICAgVUxPTkcgICBFcnJfRmxhZ19hbGxhcGVlZDsgICAgCisgICAgaW50ICAgICBERVNfTG93TnVtYmVyOworICAgIGludCAgICAgaW5kZXg7CisgICAgaW50ICAgICBpOworICAgIGludCAgICAgajsKKyAgICAjaWZkZWYgRW5hYmxlX05DU0lfTE9PUF9JTkZJTkkKKyAgICAgICAgQllURSAgICBHU3BlZWRfb3JnWzNdOworICAgICNlbmRpZgorCisjaWZkZWYgU1BJX0JVUworICAgIFZJREVPX0VOR0lORV9JTkZPIFZpZGVvRW5naW5lSW5mbzsKKyNlbHNlCisgICAgLy8gKCBVU0VfUDJBIHwgVVNFX0xQQyApCisgICAgVUNIQVIgICAqdWxNTUlPTGluZWFyQmFzZUFkZHJlc3M7CisjZW5kaWYKKworICAgICNpZmRlZiBTTFRfVUJPT1QKKyAgICAjZWxzZQorICAgICAgICB0aW1lKCZ0aW1lc3RhcnQpOworICAgICNlbmRpZgorCisgICAgLy8gRm9yIERPUyBzeXN0ZW0KKyAgICAjaWYgZGVmaW5lZChQSFlfTkNTSSkKKyAgICAgICAgLy8gRm9yIERPUyBjb21waWxlciBPUEVOIFdBVENPTQorICAgICAgICBNb2RlU3dpdGNoID0gTU9ERV9OU0NJOworICAgICNlbHNlCisgICAgICAgICNpZmRlZiBTTFRfRE9TCisgICAgICAgIE1vZGVTd2l0Y2ggPSBNT0RFX0RFRElDQVRFRDsKKyAgICAgICAgI2VuZGlmCisgICAgI2VuZGlmCisgICAgCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXJndW1lbnQgSW5pdGlhbAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBFcnJfRmxhZ19hbGxhcGVlZCA9IDA7CisgICAgRXJyX0ZsYWcgICAgICAgICAgPSAwOworICAgIEVycl9GbGFnX1ByaW50RW4gID0gMTsKKyAgICBMb29wX3JsWzBdICAgICAgICA9IDA7CisgICAgTG9vcF9ybFsxXSAgICAgICAgPSAwOworICAgIExvb3BfcmxbMl0gICAgICAgID0gMDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJ1cyBJbml0aWFsCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIGRlZmluZWQoTGludXhBUCkKKyNlbHNlICAgCisgIC8vRE9TIHN5c3RlbQorICAjaWZkZWYgU1BJX0JVUworICAjZW5kaWYKKyAgI2lmZGVmIFVTRV9MUEMKKworICAgICAgICBpZiAoIGZpbmRscGNwb3J0KCAweDBkICkgPT0gMCkgeworICAgICAgICAgICAgcHJpbnRmKCJGYWlsZWQgdG8gZmluZCBwcm9wZXIgTFBDIHBvcnQgXG4iKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICB9CisgICAgICAgIG9wZW5fYXNwZWVkX3Npb19wYXNzd29yZCgpOworICAgICAgICBlbmFibGVfYXNwZWVkX0xEVSggMHgwZCApOworICAjZW5kaWYKKyAgI2lmZGVmIFVTRV9QMkEKKyAgICAgICAgLy8gUENJIGJ1cworICAgICAgICAjaWZkZWYgRE9TX1BNT0RFVworICAgICAgICBpZiAoQ2hlY2tET1MoKSkgcmV0dXJuIDE7CisgICAgICAgICNlbmRpZgorCisgICAgICAgICNpZmRlZiAgRGJnUHJuX0Z1bmNIZWFkZXIKKyAgICAgICAgICAgIHByaW50ZiAoIkluaXRpYWwtTU1JT1xuIik7IAorICAgICAgICAgICAgRGVidWdfZGVsYXkoKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgIHVsUENJQmFzZUFkZHJlc3MgPSBGaW5kUENJRGV2aWNlICgweDFBMDMsIDB4MjAwMCwgQUNUSVZFKTsKKyAgICAgICAgaWYgKCB1bFBDSUJhc2VBZGRyZXNzID09IDAgKSAKKyAgICAgICAgICAgIHVsUENJQmFzZUFkZHJlc3MgPSBGaW5kUENJRGV2aWNlICgweDE2ODgsIDB4MjAwMCwgQUNUSVZFKTsKKyAgICAgICAgaWYgKCB1bFBDSUJhc2VBZGRyZXNzID09IDAgKSAKKyAgICAgICAgICAgIHVsUENJQmFzZUFkZHJlc3MgPSBGaW5kUENJRGV2aWNlICgweDFBMDMsIDB4MDIwMCwgQUNUSVZFKTsKKyAgICAgICAgaWYgKCB1bFBDSUJhc2VBZGRyZXNzID09IDAgKSAKKyAgICAgICAgICAgIHVsUENJQmFzZUFkZHJlc3MgPSBGaW5kUENJRGV2aWNlICgweDFBMDMsIDB4MzAwMCwgQUNUSVZFKTsKKyAgICAgICAgaWYgKCB1bFBDSUJhc2VBZGRyZXNzID09IDAgKSAKKyAgICAgICAgICAgIHVsUENJQmFzZUFkZHJlc3MgPSBGaW5kUENJRGV2aWNlICgweDFBMDMsIDB4MjAxMCwgQUNUSVZFKTsKKyAgICAgICAgaWYgKCB1bFBDSUJhc2VBZGRyZXNzID09IDAgKSB7IAorICAgICAgICAgICAgcHJpbnRmICgiQ2FuJ3QgZmluZCBkZXZpY2VcbiIpOyAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICB9CisKKyAgICAgICAgV3JpdGVQQ0lSZWcgKHVsUENJQmFzZUFkZHJlc3MsIDB4MDQsIDB4RkZGRkZGRmMsIDB4Myk7CisgICAgICAgIHVsTU1JT0Jhc2VBZGRyZXNzICAgICAgID0gUmVhZFBDSVJlZyAodWxQQ0lCYXNlQWRkcmVzcywgMHgxNCwgMHhGRkZGMDAwMCk7CisgICAgICAgIHVsTU1JT0xpbmVhckJhc2VBZGRyZXNzID0gKFVDSEFSICopTWFwUGh5c2ljYWxUb0xpbmVhciAodWxNTUlPQmFzZUFkZHJlc3MsIDY0ICogMTAyNCAqIDEwMjQpOworICAjZW5kaWYgLy8gI2lmZGVmIFVTRV9QMkEKKyNlbmRpZiAvLyBFbmQgZGVmaW5lZChMaW51eEFQKQorCisjaWZkZWYgU1BJX0JVUworICAgIEdldERldmljZVBDSUluZm8gKCZWaWRlb0VuZ2luZUluZm8pOworICAgIG1taW9iYXNlID0gVmlkZW9FbmdpbmVJbmZvLlZHQVBDSUluZm8udWxNTUlPQmFzZUFkZHJlc3M7CisgICAgc3BpbV9pbml0KFNQSV9DUyk7CisjZWxzZSAgICAKKyAgICAvLyAoIFVTRV9QMkEgfCBVU0VfTFBDICkKKyAgICBtbWlvYmFzZSA9IHVsTU1JT0xpbmVhckJhc2VBZGRyZXNzOworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaGVjayBDaGlwIEZlYXR1cmUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcmVhZF9zY3UoKTsKKworICAgIGlmIChSVU5fU1RFUCA+PSAxKSB7CisgICAgICAgIHN3aXRjaCAoU0NVXzdjaF9vbGQpIHsKKy8vICAgICAgICAgIGNhc2UgMHgwMjAwMDAwMyA6IHNwcmludGYoQVNUQ2hpcE5hbWUsICJbIF1BU1QzMjAwLUZQR0EiICAgICAgICAgICAgICAgICAgKTsgQVNUQ2hpcFR5cGUgPSA2OyBBU1QxMTAwID0gMDsgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgMHgwMzAyMDAwMyA6IHNwcmludGYoQVNUQ2hpcE5hbWUsICJbIF1BU1QxMDEwLUEyIiAgICAgICAgICAgICAgICAgICAgKTsgQVNUQ2hpcFR5cGUgPSA1OyBBU1QxMTAwID0gMDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MDMwMTAwMDMgOiBzcHJpbnRmKEFTVENoaXBOYW1lLCAiWyBdQVNUMTAxMC1BMSIgICAgICAgICAgICAgICAgICAgICk7IEFTVENoaXBUeXBlID0gNTsgQVNUMTEwMCA9IDA7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDAzMDAwMDAzIDogc3ByaW50ZihBU1RDaGlwTmFtZSwgIlsqXUFTVDEwMTAtQTAiICAgICAgICAgICAgICAgICAgICApOyBBU1RDaGlwVHlwZSA9IDU7IEFTVDExMDAgPSAwOyBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSAweDAyMDEwMzAzIDogc3ByaW50ZihBU1RDaGlwTmFtZSwgIlsqXUFTVDI0MDAtQTEiICAgICAgICAgICAgICAgICAgICApOyBBU1RDaGlwVHlwZSA9IDQ7IEFTVDExMDAgPSAwOyBicmVhazsvL0FTVDI0MDAtQTEKKyAgICAgICAgICAgIGNhc2UgMHgwMjAwMDMwMyA6IHNwcmludGYoQVNUQ2hpcE5hbWUsICJbIF1BU1QyNDAwLUEwIiAgICAgICAgICAgICAgICAgICAgKTsgQVNUQ2hpcFR5cGUgPSA0OyBBU1QxMTAwID0gMDsgYnJlYWs7Ly9BU1QyNDAwLUEwCisgICAgICAgICAgICBjYXNlIDB4MDIwMTAxMDMgOiBzcHJpbnRmKEFTVENoaXBOYW1lLCAiWypdQVNUMTQwMC1BMSIgICAgICAgICAgICAgICAgICAgICk7IEFTVENoaXBUeXBlID0gNDsgQVNUMTEwMCA9IDA7IGJyZWFrOy8vQVNUMTQwMC1BMQorICAgICAgICAgICAgY2FzZSAweDAyMDAwMDAzIDogc3ByaW50ZihBU1RDaGlwTmFtZSwgIlsgXUFTVDE0MDAtQTAiICAgICAgICAgICAgICAgICAgICApOyBBU1RDaGlwVHlwZSA9IDQ7IEFTVDExMDAgPSAwOyBicmVhazsvL0FTVDE0MDAtQTAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSAweDAxMDEwMzAzIDogc3ByaW50ZihBU1RDaGlwTmFtZSwgIlsqXUFTVDIzMDAtQTEiICAgICAgICAgICAgICAgICAgICApOyBBU1RDaGlwVHlwZSA9IDM7IEFTVDExMDAgPSAwOyBicmVhazsvL0FTVDIzMDAtQTEKKyAgICAgICAgICAgIGNhc2UgMHgwMTAxMDIwMyA6IHNwcmludGYoQVNUQ2hpcE5hbWUsICJbKl1BU1QxMDUwLUExIiAgICAgICAgICAgICAgICAgICAgKTsgQVNUQ2hpcFR5cGUgPSAzOyBBU1QxMTAwID0gMDsgYnJlYWs7Ly9BU1QxMDUwLUExCisgICAgICAgICAgICBjYXNlIDB4MDEwMTAwMDMgOiBzcHJpbnRmKEFTVENoaXBOYW1lLCAiWypdQVNUMTMwMC1BMSIgICAgICAgICAgICAgICAgICAgICk7IEFTVENoaXBUeXBlID0gMzsgQVNUMTEwMCA9IDA7IGJyZWFrOy8vQVNUMTMwMC1BMQorICAgICAgICAgICAgY2FzZSAweDAxMDAwMDAzIDogc3ByaW50ZihBU1RDaGlwTmFtZSwgIlsgXUFTVDIzMDAtQTAiICAgICAgICAgICAgICAgICAgICApOyBBU1RDaGlwVHlwZSA9IDM7IEFTVDExMDAgPSAwOyBicmVhazsvL0FTVDIzMDAtQTAKKy8vICAgICAgICAgIGNhc2UgMHgwMTg2MDAwMyA6IHNwcmludGYoQVNUQ2hpcE5hbWUsICJbIF1BU1QyMzAwLUZQR0EiICAgICAgICAgICAgICAgICAgKTsgQVNUQ2hpcFR5cGUgPSAzOyBBU1QxMTAwID0gMDsgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgMHgwMDAwMDEwMiA6IHNwcmludGYoQVNUQ2hpcE5hbWUsICJbKl1BU1QyMjAwLUExIiAgICAgICAgICAgICAgICAgICAgKTsgQVNUQ2hpcFR5cGUgPSAyOyBBU1QxMTAwID0gMDsgYnJlYWs7Ly9BU1QyMjAwLUExL0EwCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgMHgwMDAwMDMwMiA6IHNwcmludGYoQVNUQ2hpcE5hbWUsICJbKl1BU1QyMTAwLUEzIiAgICAgICAgICAgICAgICAgICAgKTsgQVNUQ2hpcFR5cGUgPSAxOyBBU1QxMTAwID0gMDsgYnJlYWs7Ly9BU1QyMTAwLUEzL0EyCisgICAgICAgICAgICBjYXNlIDB4MDAwMDAzMDEgOiBzcHJpbnRmKEFTVENoaXBOYW1lLCAiWyBdQVNUMjEwMC1BMSIgICAgICAgICAgICAgICAgICAgICk7IEFTVENoaXBUeXBlID0gMTsgQVNUMTEwMCA9IDA7IGJyZWFrOy8vQVNUMjEwMC1BMQorICAgICAgICAgICAgY2FzZSAweDAwMDAwMzAwIDogc3ByaW50ZihBU1RDaGlwTmFtZSwgIlsgXUFTVDIxMDAtQTAiICAgICAgICAgICAgICAgICAgICApOyBBU1RDaGlwVHlwZSA9IDE7IEFTVDExMDAgPSAwOyBicmVhazsvL0FTVDIxMDAtQTAKKyAgICAgICAgICAgIGNhc2UgMHgwMDAwMDIwMiA6IHNwcmludGYoQVNUQ2hpcE5hbWUsICJbKl1BU1QyMDUwL0FTVDExMDAtQTMsIEFTVDIxNTAtQTEiKTsgQVNUQ2hpcFR5cGUgPSAxOyBBU1QxMTAwID0gMTsgYnJlYWs7Ly9BU1QyMDUwL0FTVDExMDAtQTMvQTIgQVNUMjE1MC1BMS9BMAorICAgICAgICAgICAgY2FzZSAweDAwMDAwMjAxIDogc3ByaW50ZihBU1RDaGlwTmFtZSwgIlsgXUFTVDIwNTAvQVNUMTEwMC1BMSIgICAgICAgICAgICApOyBBU1RDaGlwVHlwZSA9IDE7IEFTVDExMDAgPSAxOyBicmVhazsvL0FTVDIwNTAvQVNUMTEwMC1BMQorICAgICAgICAgICAgY2FzZSAweDAwMDAwMjAwIDogc3ByaW50ZihBU1RDaGlwTmFtZSwgIlsgXUFTVDIwNTAvQVNUMTEwMC1BMCIgICAgICAgICAgICApOyBBU1RDaGlwVHlwZSA9IDE7IEFTVDExMDAgPSAxOyBicmVhazsvL0FTVDIwNTAvQVNUMTEwMC1BMAorICAgICAgICAgICAgCisgICAgICAgICAgICBkZWZhdWx0ICAgICA6IAorICAgICAgICAgICAgICAgIHByaW50ZiAoIkVycm9yIFNpbGljb24gUmV2aXNpb24gSUQoU0NVN0MpICUwOGx4ISEhXG4iLCBTQ1VfN2NoX29sZCk7IAorICAgICAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgfSAvLyBFbmQgc3dpdGNoIChTQ1VfN2NoX29sZCkKKyAgICAgICAgCisgICAgICAgIHN3aXRjaCAoQVNUQ2hpcFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgNiAgOiBBU1QyMzAwID0gMTsgQVNUMjQwMCA9IDE7IEFTVDEwMTAgPSAwOyBBU1QzMjAwID0gMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUgIDogQVNUMjMwMCA9IDE7IEFTVDI0MDAgPSAxOyBBU1QxMDEwID0gMTsgQVNUMzIwMCA9IDA7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA0ICA6IEFTVDIzMDAgPSAxOyBBU1QyNDAwID0gMTsgQVNUMTAxMCA9IDA7IEFTVDMyMDAgPSAwOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMyAgOiBBU1QyMzAwID0gMTsgQVNUMjQwMCA9IDA7IEFTVDEwMTAgPSAwOyBBU1QzMjAwID0gMDsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0IDogQVNUMjMwMCA9IDA7IEFTVDI0MDAgPSAwOyBBU1QxMDEwID0gMDsgQVNUMzIwMCA9IDA7IGJyZWFrOworICAgICAgICB9IC8vIEVuZCBzd2l0Y2ggKEFTVENoaXBUeXBlKQorCisgICAgICAgIGlmIChBU1RDaGlwVHlwZSA9PSAzKSB7CisjaWZkZWYgRm9yY2VfRW5hYmxlX01BQzM0CisgICAgICAgICAgICBXcml0ZVNPQ19ERCggU0NVX0JBU0UgKyAweGYwLCAweEFFRUQwMDAxICk7IC8vZW5hYmxlIG1hYzM0CisgICAgICAgICAgICBFbmFibGVfTUFDMzQgPSAxOworI2Vsc2UKKyAgICAgICAgICAgIGlmIChTQ1VfZjBoX29sZCAmIDB4MDAwMDAwMDEpIAorICAgICAgICAgICAgICAgIEVuYWJsZV9NQUMzNCA9IDE7CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBFbmFibGVfTUFDMzQgPSAwOworI2VuZGlmCisgICAgICAgIH0gCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgRW5hYmxlX01BQzM0ID0gMDsKKyAgICAgICAgfSAvLyBFbmQgaWYgKEFTVENoaXBUeXBlID09IDMpCisKKyAgICBTZXR0aW5nX3NjdSgpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXJndW1lbnQgSW5wdXQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIExvYWQgZGVmYXVsdCB2YWx1ZQorICAgICAgICBVc2VyRFZhbCAgICAgICAgID0gREVGX1VTRVJfREVGX1BBQ0tFVF9WQUw7CisgICAgICAgIElPVGltaW5nQnVuZF9hcmcgPSBERUZfSU9USU1JTkdCVU5EOworICAgICAgICBQSFlfQURSX2FyZyAgICAgID0gREVGX1BIWV9BRFI7CisgICAgICAgIFRlc3RNb2RlICAgICAgICAgPSBERUZfVEVTVE1PREU7CisgICAgICAgIExPT1BfSU5GSU5JICAgICAgPSAwOworICAgICAgICBMT09QX01BWF9hcmcgICAgID0gMDsKKyAgICAgICAgR0N0cmwgICAgICAgICAgICA9ICggREVGX01BQ19MT09QX0JBQ0sgPDwgNiApIHwgKCBERUZfU0tJUF9DSEVDS19QSFkgPDwgNSApIHwgKCBERUZfSU5JVF9QSFkgPDwgMyApOworICAgICAgICBHU3BlZWQgICAgICAgICAgID0gREVGX1NQRUVEOworICAgICAgICAKKyAgICAgICAgLy8gR2V0IHNldHRpbmcgaW5mb3JtYXRpb24gYnkgdXNlcgorICAgICAgICBHUnVuX01vZGUgICAgICAgID0gKEJZVEUpYXRvaShhcmd2WzFdKTsKKworICAgICAgICBpZiAoIE1vZGVTd2l0Y2ggPT0gTU9ERV9OU0NJICkgeworICAgICAgICAgICAgQVJQTnVtQ250ICAgICAgICA9IERFRl9BUlBOVU1DTlQ7CisgICAgICAgICAgICBDaGFubmVsVG9sTnVtICAgID0gREVGX0NIQU5ORUwyTlVNOworICAgICAgICAgICAgUGFja2FnZVRvbE51bSAgICA9IERFRl9QQUNLQUdFMk5VTTsKKyAgICAgICAgICAgIEdTcGVlZCAgICAgICAgICAgPSBTRVRfMTAwTUJQUzsgICAgICAgIC8vIEluIE5DU0kgbW9kZSwgd2Ugc2V0IHRvIDEwME0gYnBzCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFNldHRpbmcgdXNlcidzIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgaWYgKGFyZ2MgPiAxKSB7CisgICAgICAgICAgICBpZiAoIE1vZGVTd2l0Y2ggPT0gTU9ERV9OU0NJICkKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFyZ2MpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiBBUlBOdW1DbnQgICAgICAgID0gKFVMT05HKWF0b2koYXJndls2XSk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNjogSU9UaW1pbmdCdW5kX2FyZyA9IChCWVRFKWF0b2koYXJndls1XSk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNTogVGVzdE1vZGUgICAgICAgICA9IChCWVRFKWF0b2koYXJndls0XSk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogQ2hhbm5lbFRvbE51bSAgICA9IChCWVRFKWF0b2koYXJndlszXSk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogUGFja2FnZVRvbE51bSAgICA9IChCWVRFKWF0b2koYXJndlsyXSk7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFyZ2MpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA5OiBVc2VyRFZhbCAgICAgICAgID0gc3RydG91bCAoYXJndls4XSwgJnN0b3BfYXQsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiBJT1RpbWluZ0J1bmRfYXJnID0gKEJZVEUpYXRvaShhcmd2WzddKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiBQSFlfQURSX2FyZyAgICAgID0gKEJZVEUpYXRvaShhcmd2WzZdKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiBUZXN0TW9kZSAgICAgICAgID0gKEJZVEUpYXRvaShhcmd2WzVdKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiBzdHJjcHkoTE9PUF9TdHIsIGFyZ3ZbNF0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoTE9PUF9TdHIsICIjIikpIExPT1BfSU5GSU5JID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICBMT09QX01BWF9hcmcgPSAoVUxPTkcpYXRvaShMT09QX1N0cik7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogR0N0cmwgICAgICAgICAgICA9IChCWVRFKWF0b2koYXJndlszXSk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogR1NwZWVkICAgICAgICAgICA9IChCWVRFKWF0b2koYXJndlsyXSk7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgSU9UaW1pbmdCdW5kID0gSU9UaW1pbmdCdW5kX2FyZzsKKyAgICAgICAgICAgIFBIWV9BRFIgICAgICA9IFBIWV9BRFJfYXJnOworICAgICAgICB9IAorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIFdyb25nIHBhcmFtZXRlcgorICAgICAgICAgICAgaWYgKCBNb2RlU3dpdGNoID09IE1PREVfTlNDSSApIHsKKyAgICAgICAgICAgICAgICBpZiAoQVNUMjMwMCkgCisgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoIlxuTkNTSVRFU1QuZXhlICBydW5fbW9kZSAgPHBhY2thZ2VfbnVtPiAgPGNoYW5uZWxfbnVtPiAgPHRlc3RfbW9kZT4gIDxJTyBtYXJnaW4+XG5cbiIpOworICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiXG5OQ1NJVEVTVC5leGUgIHJ1bl9tb2RlICA8cGFja2FnZV9udW0+ICA8Y2hhbm5lbF9udW0+ICA8dGVzdF9tb2RlPlxuXG4iKTsKKyAgICAgICAgICAgICAgICBQcmludE1vZGUgKCk7CisgICAgICAgICAgICAgICAgUHJpbnRQYWtOVW0oKTsKKyAgICAgICAgICAgICAgICBQcmludENobE5VbSgpOworICAgICAgICAgICAgICAgIFByaW50VGVzdCAoKTsKKyAgICAgICAgICAgICAgICBpZiAoQVNUMjMwMCkgCisgICAgICAgICAgICAgICAgICAgIFByaW50SU9UaW1pbmdCdW5kICgpOworICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChBU1QyMzAwKSAKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiXG5NQUNURVNULmV4ZSAgcnVuX21vZGUgIDxzcGVlZD4gIDxjdHJsPiAgPGxvb3BfbWF4PiAgPHRlc3RfbW9kZT4gIDxwaHlfYWRyPiAgPElPIG1hcmdpbj5cblxuIik7CisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBwcmludGYgKCJcbk1BQ1RFU1QuZXhlICBydW5fbW9kZSAgPHNwZWVkPiAgPGN0cmw+ICA8bG9vcF9tYXg+ICA8dGVzdF9tb2RlPiAgPHBoeV9hZHI+XG5cbiIpOworICAgICAgICAgICAgICAgIFByaW50TW9kZSAoKTsKKyAgICAgICAgICAgICAgICBQcmludFNwZWVkICgpOworICAgICAgICAgICAgICAgIFByaW50Q3RybCAoKTsKKyAgICAgICAgICAgICAgICBQcmludExvb3AgKCk7CisgICAgICAgICAgICAgICAgUHJpbnRUZXN0ICgpOworICAgICAgICAgICAgICAgIFByaW50UEhZQWRyICgpOworICAgICAgICAgICAgICAgIGlmIChBU1QyMzAwKSAKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRJT1RpbWluZ0J1bmQgKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGaW5pc2hfQ2xvc2UoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICB9IC8vIEVuZCBpZiAoYXJnYyA+IDEpIAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2hlY2sgQXJndW1lbnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIHN3aXRjaCAoIEdSdW5fTW9kZSApIHsKKyAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgIHByaW50ZiAoIlxuW01BQzFdXG4iKTsgU2VsZWN0TUFDID0gMDsgSF9NQUNfQkFTRSA9IE1BQ19CQVNFMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICBwcmludGYgKCJcbltNQUMyXVxuIik7IFNlbGVjdE1BQyA9IDE7IEhfTUFDX0JBU0UgPSBNQUNfQkFTRTI7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiBpZiAoRW5hYmxlX01BQzM0KSB7cHJpbnRmICgiXG5bTUFDM11cbiIpOyBTZWxlY3RNQUMgPSAyOyBIX01BQ19CQVNFID0gTUFDX0JBU0UzOyBicmVhazt9IAorICAgICAgICAgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBFcnJvcl9NQUNfTW9kZTsKKyAgICAgICAgICAgIGNhc2UgMzogaWYgKEVuYWJsZV9NQUMzNCkge3ByaW50ZiAoIlxuW01BQzRdXG4iKTsgU2VsZWN0TUFDID0gMzsgSF9NQUNfQkFTRSA9IE1BQ19CQVNFNDsgYnJlYWs7fSAKKyAgICAgICAgICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRXJyb3JfTUFDX01vZGU7CisgICAgICAgICAgICBkZWZhdWx0OgorRXJyb3JfTUFDX01vZGU6ICAgICAKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiRXJyb3IgcnVuX21vZGUhISFcbiIpOworICAgICAgICAgICAgICAgICAgICBQcmludE1vZGUgKCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgIH0gLy8gRW5kIHN3aXRjaCAoIEdSdW5fTW9kZSApCisgICAgICAgIAorICAgICAgICBIX1RERVNfQkFTRSAgID0gVERFU19CQVNFMTsKKyAgICAgICAgSF9SREVTX0JBU0UgICA9IFJERVNfQkFTRTE7CisgICAgICAgIE1BQ19QSFlCQVNFICAgPSBIX01BQ19CQVNFOworICAgICAgICAKKyAgICAgICAgRm9yY2UxRyAgICAgICA9IDA7CisgICAgICAgIEZvcmNlMTBNICAgICAgPSAwOworICAgICAgICBGb3JjZTEwME0gICAgID0gMDsKKyAgICAgICAgR1NwZWVkX3NlbFswXSA9IDA7Ly8xRworICAgICAgICBHU3BlZWRfc2VsWzFdID0gMDsvLzEwME0KKyAgICAgICAgR1NwZWVkX3NlbFsyXSA9IDA7Ly8xME0KKyAgICAgICAgCisgICAgICAgIHN3aXRjaCAoIEdTcGVlZCApIHsKKyAgICAgICAgICAgIGNhc2UgU0VUXzFHQlBTICAgICAgICAgIDogRm9yY2UxRyAgID0gMTsgR1NwZWVkX3NlbFswXSA9IDE7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBTRVRfMTAwTUJQUyAgICAgICAgOiBGb3JjZTEwME0gPSAxOyBHU3BlZWRfc2VsWzFdID0gMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNFVF8xME1CUFMgICAgICAgICA6IEZvcmNlMTBNICA9IDE7IEdTcGVlZF9zZWxbMl0gPSAxOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0VUXzFHXzEwME1fMTBNQlBTIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogcHJpbnRmICgiRXJyb3Igc3BlZWQhISFcbiIpOworICAgICAgICAgICAgICAgIFByaW50U3BlZWQgKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICB9IC8vIEVuZCBzd2l0Y2ggKCBHU3BlZWQgKQorCisgICAgICAgIGlmICggTW9kZVN3aXRjaCA9PSBNT0RFX05TQ0kgKSB7CisgICAgICAgICAgICBFbmFibGVfTUFDTG9vcGJhY2sgPSAwOyAvLyBGb3IgbWFjdGVzdCBmdW5jdGlvbgorICAgICAgICAgICAgRW5hYmxlX1NraXBDaGtQSFkgID0gMDsgLy8gRm9yIG1hY3Rlc3QgZnVuY3Rpb24KKyAgICAgICAgICAgIEVuYWJsZV9JbnRMb29wUEhZICA9IDA7IC8vIEZvciBtYWN0ZXN0IGZ1bmN0aW9uCisgICAgICAgICAgICBFbmFibGVfSW5pdFBIWSAgICAgPSAwOyAvLyBGb3IgbWFjdGVzdCBmdW5jdGlvbgorICAgICAgICAgICAgRGlzYWJsZV9SZWNvdlBIWSAgID0gMDsgLy8gRm9yIG1hY3Rlc3QgZnVuY3Rpb24KKyAgICAgICAgICAgIEJ1cnN0RW5hYmxlICAgICAgICA9IDA7IC8vIEZvciBtYWN0ZXN0IGZ1bmN0aW9uCisKKyAgICAgICAgICAgIFByaW50TkNTSUVuID0gKEFSUE51bUNudCAmIDB4MSk7CisgICAgICAgICAgICBBUlBOdW1DbnQgICA9IEFSUE51bUNudCAmIDB4ZmZmZmZmZmU7CisgICAgCisgICAgICAgICAgICAvLyBDaGVjayBwYXJhbWV0ZXIKKyAgICAgICAgICAgIGlmICgoUGFja2FnZVRvbE51bSA8IDEpIHx8IChQYWNrYWdlVG9sTnVtID4gIDgpKSB7IAorICAgICAgICAgICAgICAgIFByaW50UGFrTlVtKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgICAgfQorLy8gICAgICAgICAgICBpZiAoKENoYW5uZWxUb2xOdW0gPCAwKSB8fCAoQ2hhbm5lbFRvbE51bSA+IDMyKSkgeyAKKyAgICAgICAgICAgIGlmIChDaGFubmVsVG9sTnVtID4gMzIpIHsgCisgICAgICAgICAgICAgICAgUHJpbnRDaGxOVW0oKTsgCisgICAgICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKFRlc3RNb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwIDogICAgICAgICAgICAgICBOQ1NJX0RpU0NoYW5uZWwgPSAxOyBJT1RpbWluZyA9IDA7IElPU3RyZW5ndGggPSAwOyBUeERhdGFFbmFibGUgPSAxOyBSeERhdGFFbmFibGUgPSAxOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOiAgICAgICAgICAgICAgIE5DU0lfRGlTQ2hhbm5lbCA9IDA7IElPVGltaW5nID0gMDsgSU9TdHJlbmd0aCA9IDA7IFR4RGF0YUVuYWJsZSA9IDE7IFJ4RGF0YUVuYWJsZSA9IDE7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNiA6IGlmIChBU1QyMzAwKSB7TkNTSV9EaVNDaGFubmVsID0gMTsgSU9UaW1pbmcgPSAxOyBJT1N0cmVuZ3RoID0gMDsgVHhEYXRhRW5hYmxlID0gMTsgUnhEYXRhRW5hYmxlID0gMTsgYnJlYWs7fSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRXJyb3JfVGVzdF9Nb2RlX05DU0k7CisgICAgICAgICAgICAgICAgY2FzZSA3IDogaWYgKEFTVDIzMDApIHtOQ1NJX0RpU0NoYW5uZWwgPSAxOyBJT1RpbWluZyA9IDE7IElPU3RyZW5ndGggPSAxOyBUeERhdGFFbmFibGUgPSAxOyBSeERhdGFFbmFibGUgPSAxOyBicmVhazt9IAorICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBFcnJvcl9UZXN0X01vZGVfTkNTSTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBXcm9uZyBwYXJhbWV0ZXIKK0Vycm9yX1Rlc3RfTW9kZV9OQ1NJOiAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiRXJyb3IgdGVzdF9tb2RlISEhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRUZXN0ICgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgICAgICB9IC8vIEVuZCBzd2l0Y2ggKFRlc3RNb2RlKQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKCBHQ3RybCAmIDB4ZmZmZmZmODMgKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmICgiRXJyb3IgY3RybCEhIVxuIik7CisgICAgICAgICAgICAgICAgUHJpbnRDdHJsICgpOworICAgICAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBFbmFibGVfTUFDTG9vcGJhY2sgPSAoIEdDdHJsID4+IDYgKSAmIDB4MTsgLy8gPz8KKyAgICAgICAgICAgICAgICBFbmFibGVfU2tpcENoa1BIWSAgPSAoIEdDdHJsID4+IDUgKSAmIDB4MTsgLy8gPz8KKyAgICAgICAgICAgICAgICBFbmFibGVfSW50TG9vcFBIWSAgPSAoIEdDdHJsID4+IDQgKSAmIDB4MTsKKyAgICAgICAgICAgICAgICBFbmFibGVfSW5pdFBIWSAgICAgPSAoIEdDdHJsID4+IDMgKSAmIDB4MTsKKyAgICAgICAgICAgICAgICBEaXNhYmxlX1JlY292UEhZICAgPSAoIEdDdHJsID4+IDIgKSAmIDB4MTsgLy8gPz8KKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICghQVNUMjQwMCAmJiBFbmFibGVfTUFDTG9vcGJhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiRXJyb3IgY3RybCEhIVxuIik7CisgICAgICAgICAgICAgICAgICAgIFByaW50Q3RybCAoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLy8gRW5kIGlmICggR0N0cmwgJiAweGZmZmZmZjgzICkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCFMT09QX01BWF9hcmcpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKEdTcGVlZCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNFVF8xR0JQUyAgICAgICAgIDogTE9PUF9NQVhfYXJnICA9IERFRl9MT09QX01BWCAqIDIwMDsgYnJlYWs7IC8vIDIwMTQwMzI1CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0VUXzEwME1CUFMgICAgICAgOiBMT09QX01BWF9hcmcgID0gREVGX0xPT1BfTUFYICogMjAgOyBicmVhazsgLy8gMjAxNDAzMjUKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTRVRfMTBNQlBTICAgICAgICA6IExPT1BfTUFYX2FyZyAgPSBERUZfTE9PUF9NQVggKiAxMCA7IGJyZWFrOyAvLyAyMDE0MDMyNQorICAgICAgICAgICAgICAgICAgICBjYXNlIFNFVF8xR18xMDBNXzEwTUJQUzogTE9PUF9NQVhfYXJnICA9IERFRl9MT09QX01BWCAqIDEwIDsgYnJlYWs7IC8vIDIwMTQwMzI1CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvLyBFbmQgaWYgKCFMT09QX01BWF9hcmcpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIExPT1BfTUFYID0gTE9PUF9NQVhfYXJnICogMTA7IC8vIDIwMTQwMzI1CisgICAgICAgICAgICBDYWxjdWxhdGVfTE9PUF9DaGVja051bSgpOworCisgICAgICAgICAgICBzd2l0Y2ggKFRlc3RNb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAgMCA6ICAgICAgICAgICAgICAgQnVyc3RFbmFibGUgPSAwOyBJRUVFVGVzdGluZyA9IDA7IElPVGltaW5nID0gMDsgSU9TdHJlbmd0aCA9IDA7IFR4RGF0YUVuYWJsZSA9IDE7IFJ4RGF0YUVuYWJsZSA9IDE7IERhdGFEZWxheSA9IDA7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgIDEgOiAgICAgICAgICAgICAgIEJ1cnN0RW5hYmxlID0gMTsgSUVFRVRlc3RpbmcgPSAxOyBJT1RpbWluZyA9IDA7IElPU3RyZW5ndGggPSAwOyBUeERhdGFFbmFibGUgPSAxOyBSeERhdGFFbmFibGUgPSAwOyBEYXRhRGVsYXkgPSAwOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICAyIDogICAgICAgICAgICAgICBCdXJzdEVuYWJsZSA9IDE7IElFRUVUZXN0aW5nID0gMTsgSU9UaW1pbmcgPSAwOyBJT1N0cmVuZ3RoID0gMDsgVHhEYXRhRW5hYmxlID0gMTsgUnhEYXRhRW5hYmxlID0gMDsgRGF0YURlbGF5ID0gMDsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAgMyA6ICAgICAgICAgICAgICAgQnVyc3RFbmFibGUgPSAxOyBJRUVFVGVzdGluZyA9IDE7IElPVGltaW5nID0gMDsgSU9TdHJlbmd0aCA9IDA7IFR4RGF0YUVuYWJsZSA9IDE7IFJ4RGF0YUVuYWJsZSA9IDA7IERhdGFEZWxheSA9IDA7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgIDQgOiAgICAgICAgICAgICAgIEJ1cnN0RW5hYmxlID0gMTsgSUVFRVRlc3RpbmcgPSAwOyBJT1RpbWluZyA9IDA7IElPU3RyZW5ndGggPSAwOyBUeERhdGFFbmFibGUgPSAxOyBSeERhdGFFbmFibGUgPSAwOyBEYXRhRGVsYXkgPSAwOyBicmVhazsgLy8gPz8KKyAgICAgICAgICAgICAgICBjYXNlICA1IDogICAgICAgICAgICAgICBCdXJzdEVuYWJsZSA9IDE7IElFRUVUZXN0aW5nID0gMTsgSU9UaW1pbmcgPSAwOyBJT1N0cmVuZ3RoID0gMDsgVHhEYXRhRW5hYmxlID0gMTsgUnhEYXRhRW5hYmxlID0gMDsgRGF0YURlbGF5ID0gMDsgYnJlYWs7IC8vID8/CisgICAgICAgICAgICAgICAgY2FzZSAgNiA6IGlmIChBU1QyMzAwKSB7QnVyc3RFbmFibGUgPSAwOyBJRUVFVGVzdGluZyA9IDA7IElPVGltaW5nID0gMTsgSU9TdHJlbmd0aCA9IDA7IFR4RGF0YUVuYWJsZSA9IDE7IFJ4RGF0YUVuYWJsZSA9IDE7IERhdGFEZWxheSA9IDA7IGJyZWFrO30gCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBFcnJvcl9UZXN0X01vZGU7CisgICAgICAgICAgICAgICAgY2FzZSAgNyA6IGlmIChBU1QyMzAwKSB7QnVyc3RFbmFibGUgPSAwOyBJRUVFVGVzdGluZyA9IDA7IElPVGltaW5nID0gMTsgSU9TdHJlbmd0aCA9IDE7IFR4RGF0YUVuYWJsZSA9IDE7IFJ4RGF0YUVuYWJsZSA9IDE7IERhdGFEZWxheSA9IDA7IGJyZWFrO30gCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBFcnJvcl9UZXN0X01vZGU7CisgICAgICAgICAgICAgICAgY2FzZSAgOCA6ICAgICAgICAgICAgICAgQnVyc3RFbmFibGUgPSAwOyBJRUVFVGVzdGluZyA9IDA7IElPVGltaW5nID0gMDsgSU9TdHJlbmd0aCA9IDA7IFR4RGF0YUVuYWJsZSA9IDE7IFJ4RGF0YUVuYWJsZSA9IDA7IERhdGFEZWxheSA9IDA7IGJyZWFrOyAvLyA/PworICAgICAgICAgICAgICAgIGNhc2UgIDkgOiAgICAgICAgICAgICAgIEJ1cnN0RW5hYmxlID0gMDsgSUVFRVRlc3RpbmcgPSAwOyBJT1RpbWluZyA9IDA7IElPU3RyZW5ndGggPSAwOyBUeERhdGFFbmFibGUgPSAwOyBSeERhdGFFbmFibGUgPSAxOyBEYXRhRGVsYXkgPSAwOyBicmVhazsgLy8gPz8KKyAgICAgICAgICAgICAgICBjYXNlIDEwIDogICAgICAgICAgICAgICBCdXJzdEVuYWJsZSA9IDA7IElFRUVUZXN0aW5nID0gMDsgSU9UaW1pbmcgPSAwOyBJT1N0cmVuZ3RoID0gMDsgVHhEYXRhRW5hYmxlID0gMTsgUnhEYXRhRW5hYmxlID0gMTsgRGF0YURlbGF5ID0gMTsgYnJlYWs7IC8vID8/CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKK0Vycm9yX1Rlc3RfTW9kZTogICAgICAgIAorICAgICAgICAgICAgICAgICAgICBwcmludGYgKCJFcnJvciB0ZXN0X21vZGUhISFcbiIpOworICAgICAgICAgICAgICAgICAgICBQcmludFRlc3QgKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgICAgIH0gLy8gRW5kIHN3aXRjaCAoVGVzdE1vZGUpCisKKyAgICAgICAgICAgIGlmICggUEhZX0FEUiA+IDMxICkgeworICAgICAgICAgICAgICAgIHByaW50ZiAoIkVycm9yIHBoeV9hZHIhISFcbiIpOworICAgICAgICAgICAgICAgIFByaW50UEhZQWRyICgpOworICAgICAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgICAgICAgIH0gLy8gRW5kIGlmIChQSFlfQURSID4gMzEpCisgICAgICAgIH0gLy8gRW5kIGlmICggTW9kZVN3aXRjaCA9PSBNT0RFX05TQ0kgKQorCisgICAgICAgIGlmICggQnVyc3RFbmFibGUgKSB7CisgICAgICAgICAgICBJT1RpbWluZ0J1bmQgPSAwOworICAgICAgICB9IAorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICggfkRhdGFEZWxheSAmJiBBU1QyMzAwICkgeworICAgICAgICAgICAgICAgIGlmICggISggKCAoNyA+PSBJT1RpbWluZ0J1bmQpICYmIChJT1RpbWluZ0J1bmQgJiAweDEpICkgfHwgCisgICAgICAgICAgICAgICAgICAgICAgICAoIElPVGltaW5nQnVuZCA9PSAwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYgKCJFcnJvciBJTyBtYXJnaW4hISFcbiIpOworICAgICAgICAgICAgICAgICAgICBQcmludElPVGltaW5nQnVuZCAoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBJT1RpbWluZ0J1bmQgPSAwOworICAgICAgICAgICAgfSAvLyBFbmQgaWYgKCB+RGF0YURlbGF5ICYmIEFTVDIzMDAgKQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBEZWZpbmUgT3V0cHV0IGZpbGUgbmFtZQorICAgICAgICAgICAgaWYgKCBNb2RlU3dpdGNoID09IE1PREVfTlNDSSApCisgICAgICAgICAgICAgICAgc3ByaW50ZihGaWxlTmFtZU1haW4sICIlZCIsIFNlbGVjdE1BQysxKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChFbmFibGVfSW50TG9vcFBIWSkgCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoRmlsZU5hbWVNYWluLCAiJWRJIiwgU2VsZWN0TUFDKzEpOworICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoRmlsZU5hbWVNYWluLCAiJWRFIiwgU2VsZWN0TUFDKzEpOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgICNpZm5kZWYgU0xUX1VCT09UCisgICAgICAgICAgICBpZiAoIElPVGltaW5nICkgeworICAgICAgICAgICAgICAgIGlmICggSU9TdHJlbmd0aCApIAorICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKEZpbGVOYW1lLCAiTUlPRCVzUy5sb2ciLCBGaWxlTmFtZU1haW4pOworICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihGaWxlTmFtZSwgIk1JT0Qlcy5sb2ciLCBGaWxlTmFtZU1haW4pOworCisgICAgICAgICAgICAgICAgZnBfbG9nID0gZm9wZW4oRmlsZU5hbWUsInciKTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCBJT1N0cmVuZ3RoICkgCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoRmlsZU5hbWUsICJNSU8lc1MubG9nIiwgRmlsZU5hbWVNYWluKTsKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoRmlsZU5hbWUsICJNSU8lcy5sb2ciLCBGaWxlTmFtZU1haW4pOworCisgICAgICAgICAgICAgICAgZnBfaW8gID0gZm9wZW4oRmlsZU5hbWUsInciKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKEZpbGVOYW1lLCAiTUFDJXMubG9nIiwgRmlsZU5hbWVNYWluKTsKKworICAgICAgICAgICAgICAgIGZwX2xvZyA9IGZvcGVuKEZpbGVOYW1lLCJ3Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgfSAvLyBFbmQgaWYgKEJ1cnN0RW5hYmxlKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2hlY2sgRGVmaW5pdGlvbgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIAorICAgICAgICAgICAgdmFsYXJ5W2ldID0gVmFsX0FycmF5W2ldOworICAgICAgICAKKyAgICAgICAgaWYgKCBBU1QzMjAwICkgeworICAgICAgICAgICAgTUFDX01vZGUgICA9IChTQ1VfNzBoX29sZCA+PiA2KSAmIDB4MTsKKyAgICAgICAgICAgIE1BQzFfMUdFbiAgPSAoTUFDX01vZGUgJiAweDEpID8gMSA6IDA7Ly8xOlJHTUlJLCAwOlJNSUkKKyAgICAgICAgICAgIE1BQzJfMUdFbiAgPSAwOworICAgICAgICAKKyAgICAgICAgICAgIE1BQzFfUk1JSSAgPSAhTUFDMV8xR0VuOworICAgICAgICAgICAgTUFDMl9STUlJICA9IDA7CisgICAgICAgICAgICBNQUMyX1ZhbGlkID0gMDsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZSBpZiAoIEFTVDEwMTAgKSB7CisgICAgICAgICAgICBNQUNfTW9kZSAgID0gMDsKKyAgICAgICAgICAgIE1BQzFfMUdFbiAgPSAwOworICAgICAgICAgICAgTUFDMl8xR0VuICA9IDA7CisgICAgICAgIAorICAgICAgICAgICAgTUFDMV9STUlJICA9IDE7CisgICAgICAgICAgICBNQUMyX1JNSUkgID0gMDsKKyAgICAgICAgICAgIE1BQzJfVmFsaWQgPSAwOworICAgICAgICB9IAorICAgICAgICBlbHNlIGlmICggQVNUMjMwMCApIHsKKyAgICAgICAgICAgIGlmIChTQ1VfN2NoX29sZCA9PSAweDAxMDAwMDAzKSB7CisgICAgICAgICAgICAgICAgLy9BU1QyMzAwLUEwCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsYXJ5W2ldID0gVmFsX0FycmF5X0EwW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICBNQUNfTW9kZSAgID0gKFNDVV83MGhfb2xkID4+IDYpICYgMHgzOworICAgICAgICAgICAgTUFDMV8xR0VuICA9IChNQUNfTW9kZSAmIDB4MSkgPyAxIDogMDsvLzE6UkdNSUksIDA6Uk1JSQorICAgICAgICAgICAgTUFDMl8xR0VuICA9IChNQUNfTW9kZSAmIDB4MikgPyAxIDogMDsvLzE6UkdNSUksIDA6Uk1JSQorICAgICAgICAKKyAgICAgICAgICAgIE1BQzFfUk1JSSAgPSAhTUFDMV8xR0VuOworICAgICAgICAgICAgTUFDMl9STUlJICA9ICFNQUMyXzFHRW47CisgICAgICAgICAgICBNQUMyX1ZhbGlkID0gMTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBNQUNfTW9kZSAgID0gKFNDVV83MGhfb2xkID4+IDYpICYgMHg3OworICAgICAgICAgICAgTUFDMV8xR0VuICA9IChNQUNfTW9kZSA9PSAweDApID8gMSA6IDA7CisgICAgICAgICAgICBNQUMyXzFHRW4gID0gMDsKKyAgICAgICAgCisgICAgICAgICAgICBzd2l0Y2ggKCBNQUNfTW9kZSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIDAgOiBNQUMxX1JNSUkgPSAwOyBNQUMyX1JNSUkgPSAwOyBNQUMyX1ZhbGlkID0gMDsgYnJlYWs7IC8vMDAwOiBTZWxlY3QgR01JSShNQUMjMSkgb25seQorICAgICAgICAgICAgICAgIGNhc2UgMSA6IE1BQzFfUk1JSSA9IDA7IE1BQzJfUk1JSSA9IDA7IE1BQzJfVmFsaWQgPSAxOyBicmVhazsgLy8wMDE6IFNlbGVjdCBNSUkgKE1BQyMxKSBhbmQgTUlJKE1BQyMyKQorICAgICAgICAgICAgICAgIGNhc2UgMiA6IE1BQzFfUk1JSSA9IDE7IE1BQzJfUk1JSSA9IDA7IE1BQzJfVmFsaWQgPSAxOyBicmVhazsgLy8wMTA6IFNlbGVjdCBSTUlJKE1BQyMxKSBhbmQgTUlJKE1BQyMyKQorICAgICAgICAgICAgICAgIGNhc2UgMyA6IE1BQzFfUk1JSSA9IDA7IE1BQzJfUk1JSSA9IDA7IE1BQzJfVmFsaWQgPSAwOyBicmVhazsgLy8wMTE6IFNlbGVjdCBNSUkgKE1BQyMxKSBvbmx5CisgICAgICAgICAgICAgICAgY2FzZSA0IDogTUFDMV9STUlJID0gMTsgTUFDMl9STUlJID0gMDsgTUFDMl9WYWxpZCA9IDA7IGJyZWFrOyAvLzEwMDogU2VsZWN0IFJNSUkoTUFDIzEpIG9ubHkKKy8vICAgICAgICAgICAgICBjYXNlIDUgOiBNQUMxX1JNSUkgPSAwOyBNQUMyX1JNSUkgPSAwOyBNQUMyX1ZhbGlkID0gMDsgYnJlYWs7IC8vMTAxOiBSZXNlcnZlZAorICAgICAgICAgICAgICAgIGNhc2UgNiA6IE1BQzFfUk1JSSA9IDE7IE1BQzJfUk1JSSA9IDE7IE1BQzJfVmFsaWQgPSAxOyBicmVhazsgLy8xMTA6IFNlbGVjdCBSTUlJKE1BQyMxKSBhbmQgUk1JSShNQUMjMikKKy8vICAgICAgICAgICAgICBjYXNlIDcgOiBNQUMxX1JNSUkgPSAwOyBNQUMyX1JNSUkgPSAwOyBNQUMyX1ZhbGlkID0gMDsgYnJlYWs7IC8vMTExOiBEaXNhYmxlIGR1YWwgTUFDCisgICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuKEZpbmlzaF9DaGVjayhFcnJfTUFDTW9kZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IC8vIEVuZCBpZiAoIEFTVDMyMDAgKQorICAgICAgICAKKyAgICAgICAgaWYgKCBTZWxlY3RNQUMgPT0gMCApIHsKKyAgICAgICAgICAgIEVuYWJsZV9STUlJID0gTUFDMV9STUlJOworICAgICAgICAgICAgTUFDXzFHRW4gICAgPSBNQUMxXzFHRW47CisgICAgICAgIAorICAgICAgICAgICAgaWYgKCBGb3JjZTFHICYgIU1BQzFfMUdFbiApIHsKKyAgICAgICAgICAgICAgICBwcmludGYgKCJcbk1BQzEgZG9uJ3Qgc3VwcG9ydCAxR2JwcyAhISFcbiIpOyAKKyAgICAgICAgICAgICAgICByZXR1cm4oIEZpbmlzaF9DaGVjayhFcnJfTUFDTW9kZSkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChTZWxlY3RNQUMgPT0gMSkgeworICAgICAgICAgICAgRW5hYmxlX1JNSUkgPSBNQUMyX1JNSUk7CisgICAgICAgICAgICBNQUNfMUdFbiAgICA9IE1BQzJfMUdFbjsKKyAgICAgICAgCisgICAgICAgICAgICBpZiAoIEZvcmNlMUcgJiAhTUFDMl8xR0VuICkgeworICAgICAgICAgICAgICAgIHByaW50ZiAoIlxuTUFDMiBkb24ndCBzdXBwb3J0IDFHYnBzICEhIVxuIik7IAorICAgICAgICAgICAgICAgIHJldHVybihGaW5pc2hfQ2hlY2soRXJyX01BQ01vZGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggIU1BQzJfVmFsaWQgKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmICgiXG5NQUMyIG5vdCB2YWxpZCAhISFcbiIpOyAKKyAgICAgICAgICAgICAgICByZXR1cm4oRmluaXNoX0NoZWNrKEVycl9NQUNNb2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgRW5hYmxlX1JNSUkgPSAxOworICAgICAgICAgICAgTUFDXzFHRW4gPSAwOworICAgICAgICAKKyAgICAgICAgICAgIGlmIChGb3JjZTFHKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmICgiXG5NQUMzL01BQzQgZG9uJ3Qgc3VwcG9ydCAxR2JwcyAhISFcbiIpOyAKKyAgICAgICAgICAgICAgICByZXR1cm4oRmluaXNoX0NoZWNrKEVycl9NQUNNb2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gLy8gRW5kIGlmICggU2VsZWN0TUFDID09IDAgKQorCisgICAgICAgIGlmICggTW9kZVN3aXRjaCA9PSBNT0RFX05TQ0kgKSB7CisgICAgICAgICAgICBpZiAoIUVuYWJsZV9STUlJKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmICgiXG5OQ1NJIG11c3QgYmUgUk1JSSBpbnRlcmZhY2UgISEhXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oRmluaXNoX0NoZWNrKEVycl9NQUNNb2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIEdTcGVlZCA9PSBTRVRfMUdfMTAwTV8xME1CUFMgKSB7CisgICAgICAgICAgICBHU3BlZWRfc2VsWzBdID0gTUFDXzFHRW47CisgICAgICAgICAgICBHU3BlZWRfc2VsWzFdID0gMTsKKyAgICAgICAgICAgIEdTcGVlZF9zZWxbMl0gPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBBU1QxMDEwICkgeworICAgICAgICAgICAgLy8gQ2hlY2sgYml0IDEzOjEyCisgICAgICAgICAgICBEYXRfVUxPTkcgPSBTQ1VfMDhoX29sZCAmIDB4MDAwMDMwMDA7CisgICAgICAgICAgICBpZiAoRGF0X1VMT05HICE9IDB4MDAwMDAwMDApCisgICAgICAgICAgICAgICAgcmV0dXJuKEZpbmlzaF9DaGVjayhFcnJfTUhDTEtfUmF0aW8pKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZSBpZiAoIEFTVDIzMDAgKSB7CisgICAgICAgICAgICBEYXRfVUxPTkcgPSAoU0NVXzA4aF9vbGQgPj4gMTYpICYgMHg3OworICAgICAgICAgICAgaWYgKE1BQzFfMUdFbiB8IE1BQzJfMUdFbikgeworICAgICAgICAgICAgICAgIGlmICggKERhdF9VTE9ORyA9PSAwKSB8fCAoRGF0X1VMT05HID4gMikgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oRmluaXNoX0NoZWNrKEVycl9NSENMS19SYXRpbykpOworICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChEYXRfVUxPTkcgIT0gNCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEZpbmlzaF9DaGVjayhFcnJfTUhDTEtfUmF0aW8pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvLyBFbmQgaWYgKEFTVDEwMTApCisKKyAgICAgICAgLy9NQUMKKyAgICAgICAgTUFDXzA4aF9vbGQgPSBSZWFkU09DX0REKCBIX01BQ19CQVNFICsgMHgwOCApOworICAgICAgICBNQUNfMGNoX29sZCA9IFJlYWRTT0NfREQoIEhfTUFDX0JBU0UgKyAweDBjICk7CisgICAgICAgIE1BQ180MGhfb2xkID0gUmVhZFNPQ19ERCggSF9NQUNfQkFTRSArIDB4NDAgKTsKKyAgICAgICAgCisgICAgICAgIGlmICggICgoTUFDXzA4aF9vbGQgPT0gMHgwMDAwKSAmJiAoTUFDXzBjaF9vbGQgPT0gMHgwMDAwMDAwMCkpCisgICAgICAgICAgIHx8ICgoTUFDXzA4aF9vbGQgPT0gMHhmZmZmKSAmJiAoTUFDXzBjaF9vbGQgPT0gMHhmZmZmZmZmZikpCisvLyAgICAgICAgIHx8IChNQUNfMGNoX29sZCAmIDB4MSkKKy8vICAgICAgICAgfHwgKE1BQ18wY2hfb2xkICYgMHgyKQorICAgICAgICAgICApIAorICAgICAgICB7CisgICAgICAgICAgICAvLyBMb2FkIGRlZmF1bHQgZm9yIE1BQyBhZGRyZXNzCisgICAgICAgICAgICBTQVswXSA9IDB4MDA7CisgICAgICAgICAgICBTQVsxXSA9IDB4NTc7CisgICAgICAgICAgICBTQVsyXSA9IDB4ODk7CisgICAgICAgICAgICBTQVszXSA9IDB4NTY7CisgICAgICAgICAgICBTQVs0XSA9IDB4ODg7CisgICAgICAgICAgICBTQVs1XSA9IDB4Mzg7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgU0FbMF0gPSAoTUFDXzA4aF9vbGQgPj4gIDgpICYgMHhmZjsKKyAgICAgICAgICAgIFNBWzFdID0gKE1BQ18wOGhfb2xkICAgICAgKSAmIDB4ZmY7CisgICAgICAgICAgICBTQVsyXSA9IChNQUNfMGNoX29sZCA+PiAyNCkgJiAweGZmOworICAgICAgICAgICAgU0FbM10gPSAoTUFDXzBjaF9vbGQgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgICAgIFNBWzRdID0gKE1BQ18wY2hfb2xkID4+ICA4KSAmIDB4ZmY7CisgICAgICAgICAgICBTQVs1XSA9IChNQUNfMGNoX29sZCAgICAgICkgJiAweGZmOworICAgICAgICB9CisgICAgICAgIC8vIHByaW50ZiAoIiUwOHggJTA4eDogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIE1BQ18wOGhfb2xkLCBNQUNfMGNoX29sZCwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSk7ICAgICAgICAKKworICAgICAgICBpZiAoIEFTVDIzMDAgKSB7CisjaWZkZWYgRm9yY2VfRW5hYmxlX05ld01ESU8KKyAgICAgICAgICAgIEFTVDIzMDBfTmV3TURJTyA9IDE7CisgICAgICAgICAgICBXcml0ZVNPQ19ERChIX01BQ19CQVNFKzB4NDAsIE1BQ180MGhfb2xkIHwgMHg4MDAwMDAwMCkKKyNlbHNlCisgICAgICAgICAgICBBU1QyMzAwX05ld01ESU8gPSAoTUFDXzQwaF9vbGQgJiAweDgwMDAwMDAwKSA/IDEgOiAwOworI2VuZGlmCisgICAgICAgIH0gCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQVNUMjMwMF9OZXdNRElPID0gMDsKKyAgICAgICAgfSAvLyBFbmQgaWYgKEFTVDIzMDApCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQYXJhbWV0ZXIgSW5pdGlhbAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgaWYgKCBBU1QzMjAwICkgeworICAgICAgICAgICAgU0NVXzA0aCA9IDB4MGMwMDA4MDA7IC8vUmVzZXQgRW5naW5lCisgICAgICAgIH0gCisgICAgICAgIGVsc2UgaWYgKEFTVDEwMTApIHsKKyAgICAgICAgICAgIFNDVV8wNGggPSAweDAwMDAwMDEwOyAvL1Jlc2V0IEVuZ2luZQorICAgICAgICB9IAorICAgICAgICBlbHNlIGlmIChBU1QyMzAwKSB7CisgICAgICAgICAgICBTQ1VfMDRoID0gMHgwYzAwMTgwMDsgLy9SZXNldCBFbmdpbmUKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBTQ1VfMDRoID0gMHgwMDAwMTgwMDsgLy9SZXNldCBFbmdpbmUKKyAgICAgICAgfSAvLyBFbmQgaWYgKCBBU1QzMjAwICkKKyAgICAKKyAgICAgICAgaWYgKCBNb2RlU3dpdGNoID09IE1PREVfTlNDSSApCisgICAgICAgICAgICAvLyBTZXQgdG8gMTAwTWJwcyBhbmQgRW5hYmxlIFJYIGJyb2FiY2FzdCBwYWNrZXRzIGFuZCBDUkNfQVBEIGFuZCBGdWxsIGR1cGxleAorICAgICAgICAgICAgTUFDXzUwaCA9IDB4MDAwYTA1MDA7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gUlhfQUxMQURSIGFuZCBDUkNfQVBEIGFuZCBGdWxsIGR1cGxleAorICAgICAgICAgICAgTUFDXzUwaCA9IDB4MDAwMDQ1MDA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICNpZmRlZiBFbmFibGVfUnVudAorICAgICAgICAgICAgTUFDXzUwaCA9IE1BQ181MGggfCAweDAwMDAxMDAwOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAKKyAgICAgICAgICAgICNpZmRlZiBFbmFibGVfSnVtYm8KKyAgICAgICAgICAgIE1BQ181MGggPSBNQUNfNTBoIHwgMHgwMDAwMjAwMDsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9IC8vIEVuZCBpZiAoIE1vZGVTd2l0Y2ggPT0gTU9ERV9OU0NJICkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlc2NyaXB0b3IgTnVtYmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBpZiAoIE1vZGVTd2l0Y2ggPT0gTU9ERV9ERURJQ0FURUQgKSB7CisKKyAgICAgICAgICAgICNpZmRlZiBFbmFibGVfSnVtYm8KKyAgICAgICAgICAgIERFU19Mb3dOdW1iZXIgPSAxOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIERFU19Mb3dOdW1iZXIgPSBJT1RpbWluZzsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgaWYgKCBFbmFibGVfU2tpcENoa1BIWSAmJiAoIFRlc3RNb2RlID09IDAgKSApIHsKKyAgICAgICAgICAgICAgICBERVNfTlVNQkVSID0gMTE0Oy8vZm9yIFNNU0MncyBMQU45MzAzIGlzc3VlCisgICAgICAgICAgICB9IAorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCBBU1QxMDEwIHwgQVNUMzIwMCApIHsKKyAgICAgICAgICAgICAgICAgICAgREVTX05VTUJFUiA9IChJT1RpbWluZ0J1bmQpID8gMTAwIDogMjU2OworICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoIEdTcGVlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU0VUXzFHQlBTICAgICAgICAgIDogREVTX05VTUJFUiA9IChJT1RpbWluZ0J1bmQpID8gMTAgOiAoREVTX0xvd051bWJlcikgPyA1MCA6IDQwMDsgYnJlYWs7IC8vIDIwMTQwMzI1CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNFVF8xMDBNQlBTICAgICAgICA6IERFU19OVU1CRVIgPSAoSU9UaW1pbmdCdW5kKSA/IDEwIDogKERFU19Mb3dOdW1iZXIpID8gNTAgOiA0MDA7IGJyZWFrOyAvLyAyMDE0MDMyNQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTRVRfMTBNQlBTICAgICAgICAgOiBERVNfTlVNQkVSID0gKElPVGltaW5nQnVuZCkgPyAxMCA6IChERVNfTG93TnVtYmVyKSA/IDEwIDogIDgwOyBicmVhazsgLy8gMjAxNDAzMjUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU0VUXzFHXzEwME1fMTBNQlBTIDogREVTX05VTUJFUiA9IChJT1RpbWluZ0J1bmQpID8gMTAgOiAoREVTX0xvd051bWJlcikgPyAxMCA6ICA4MDsgYnJlYWs7IC8vIDIwMTQwMzI1CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8vIEVuZCBpZiAoIEVuYWJsZV9Ta2lwQ2hrUEhZICYmICggVGVzdE1vZGUgPT0gMCApICkKKyAgICAgICAgICAgIH0gCisKKyAgICAgICAgICAgICNpZmRlZiBTZWxlY3REZXNOdW1iZXIKKyAgICAgICAgICAgIERFU19OVU1CRVIgPSBTZWxlY3REZXNOdW1iZXI7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIAorICAgICAgICAgICAgI2lmZGVmIFVTRV9MUEMKKyAgICAgICAgICAgICAgICBERVNfTlVNQkVSIC89IDg7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgCisgICAgICAgICAgICAjaWZkZWYgRU5BQkxFX0FSUF8yX1dPTAorICAgICAgICAgICAgaWYgKCBUZXN0TW9kZSA9PSA0ICkgeworICAgICAgICAgICAgICAgIERFU19OVU1CRVIgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAKKyAgICAgICAgICAgIERFU19OVU1CRVJfT3JnID0gREVTX05VTUJFUjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCBEYmdQcm5fSW5mbyApIHsKKyAgICAgICAgICAgICAgICBwcmludGYgKCJDaGVja0J1Zl9NQlNpemUgOiAlbGRcbiIsIENoZWNrQnVmX01CU2l6ZSk7CisgICAgICAgICAgICAgICAgcHJpbnRmICgiTE9PUF9DaGVja051bSAgIDogJWxkXG4iLCBMT09QX0NoZWNrTnVtKTsKKyAgICAgICAgICAgICAgICBwcmludGYgKCJERVNfTlVNQkVSICAgICAgOiAlbGRcbiIsIERFU19OVU1CRVIpOworICAgICAgICAgICAgICAgIHByaW50ZiAoIkRNQV9CdWZTaXplICAgICA6ICVsZCBieXRlc1xuIiwgRE1BX0J1ZlNpemUpOworICAgICAgICAgICAgICAgIHByaW50ZiAoIkRNQV9CdWZOdW0gICAgICA6ICVkXG4iLCBETUFfQnVmTnVtKTsKKyAgICAgICAgICAgICAgICBwcmludGYgKCJcbiIpOworICAgICAgICAgICAgfQorLy8gICAgICAgICAgaWYgKDMgPiBETUFfQnVmTnVtKSAKKy8vICAgICAgICAgICAgICAgIHJldHVybiggRmluaXNoX0NoZWNrKEVycl9ETUFCdWZOdW0pICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICgyID4gRE1BX0J1Zk51bSkgCisgICAgICAgICAgICAgICAgcmV0dXJuKCBGaW5pc2hfQ2hlY2soRXJyX0RNQUJ1Zk51bSkgKTsKKyAgICAgICAgfSAvLyBFbmQgaWYgKCBNb2RlU3dpdGNoID09IE1PREVfREVESUNBVEVEICkKKyAgICB9IC8vIEVuZCBpZiAoUlVOX1NURVAgPj0gMSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNDVSBJbml0aWFsCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGlmICggUlVOX1NURVAgPj0gMiApIHsKKyAgICAgICAgaW5pdF9zY3UxKCk7CisgICAgfQorICAgIAorICAgIGlmICggUlVOX1NURVAgPj0gMyApIHsKKyAgICAgICAgaW5pdF9zY3VfbWFjcnN0KCk7CisgICAgfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGF0YSBJbml0aWFsCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGlmIChSVU5fU1RFUCA+PSA0KSB7CisgICAgICAgIHNldHVwX2FycCgpOworICAgICAgICBpZiAoIE1vZGVTd2l0Y2ggPT0gIE1PREVfREVESUNBVEVEICkgeworCisgICAgICAgICAgICBGUkFNRV9MRU4gPSAoVUxPTkcgKiltYWxsb2MoREVTX05VTUJFUiAqIHNpemVvZiggVUxPTkcgKSk7CisgICAgICAgICAgICB3cF9sc3QgICAgPSAoVUxPTkcgKiltYWxsb2MoREVTX05VTUJFUiAqIHNpemVvZiggVUxPTkcgKSk7CisgICAgICAgIAorICAgICAgICAgICAgaWYgKCAhRlJBTUVfTEVOICkgCisgICAgICAgICAgICAgICAgcmV0dXJuKCBGaW5pc2hfQ2hlY2soIEVycl9NQUxMT0NfRnJtU2l6ZSApICk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoICF3cF9sc3QgKSAKKyAgICAgICAgICAgICAgICByZXR1cm4oIEZpbmlzaF9DaGVjayggRXJyX01BTExPQ19MYXN0V1AgKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBTZXR1cCBkYXRhIGFuZCBsZW5ndGgKKyAgICAgICAgICAgIFRlc3RpbmdTZXR1cCgpOworICAgICAgICB9IC8vIEVuZCBpZiAoIE1vZGVTd2l0Y2ggPT0gIE1PREVfREVESUNBVEVEICkKKyAgICAgICAgCisgICAgICAgIC8vIEdldCBiaXQgKHNoaWZ0KSBvZiBJTyBkcml2aW5nIHN0cmVuZ3RoIHJlZ2lzdGVyCisgICAgICAgIGlmICggSU9TdHJlbmd0aCApIHsKKyAgICAgICAgICAgIGlmIChBU1QxMDEwKSB7CisgICAgICAgICAgICAgICAgSU9TdHJfbWF4ID0gMTsvLzB+MQorICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIGVsc2UgaWYgKEFTVDI0MDApIHsKKyAgICAgICAgICAgICAgICBJT1N0cl9tYXggPSAxOy8vMH4xCisgICAgICAgICAgICAgICAgc3dpdGNoIChTZWxlY3RNQUMpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwICA6IElPU3RyX3NoZiA9ICA5OyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxICA6IElPU3RyX3NoZiA9IDExOyBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IAorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgSU9TdHJfbWF4ID0gMzsvLzB+MworICAgICAgICAgICAgICAgIHN3aXRjaCAoU2VsZWN0TUFDKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMCAgOiBJT1N0cl9zaGYgPSAgODsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMSAgOiBJT1N0cl9zaGYgPSAxMDsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMiAgOiBJT1N0cl9zaGYgPSAxMjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMyAgOiBJT1N0cl9zaGYgPSAxNDsgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IAorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIElPU3RyX21heCA9IDA7CisgICAgICAgICAgICBJT1N0cl9zaGYgPSAwOworICAgICAgICB9IC8vIEVuZCBpZiAoSU9TdHJlbmd0aCkKKworICAgICAgICAvLyBHZXQgY3VycmVudCBjbG9jayBkZWxheSB2YWx1ZSBvZiBUWChvdXQpIGFuZCBSWChpbikgaW4gdGhlIFNDVTQ4IHJlZ2lzdGVyCisgICAgICAgIC8vIGFuZCBzZXR0aW5nIHRlc3QgcmFuZ2UKKyAgICAgICAgaWYgKCBFbmFibGVfUk1JSSApIHsKKyAgICAgICAgICAgIHN3aXRjaCAoR1J1bl9Nb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwICA6IElPZGx5X291dF9zaGYgPSAyNDsgSU9kbHlfaW5fc2hmID0gIDg7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMSAgOiBJT2RseV9vdXRfc2hmID0gMjU7IElPZGx5X2luX3NoZiA9IDEyOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgIDogSU9kbHlfb3V0X3NoZiA9IDI2OyBJT2RseV9pbl9zaGYgPSAxNjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzICA6IElPZGx5X291dF9zaGYgPSAyNzsgSU9kbHlfaW5fc2hmID0gMjA7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSU9kbHlfaW5fcmVnICA9IChTQ1VfNDhoX29sZCA+PiBJT2RseV9pbl9zaGYgKSAmIDB4ZjsKKyAgICAgICAgICAgIElPZGx5X291dF9yZWcgPSAoU0NVXzQ4aF9vbGQgPj4gSU9kbHlfb3V0X3NoZikgJiAweDE7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3dpdGNoIChHUnVuX01vZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDAgIDogSU9kbHlfb3V0X3NoZiA9ICAwOyBJT2RseV9pbl9zaGYgID0gIDg7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMSAgOiBJT2RseV9vdXRfc2hmID0gIDQ7IElPZGx5X2luX3NoZiAgPSAxMjsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJT2RseV9pbl9yZWcgID0gKFNDVV80OGhfb2xkID4+IElPZGx5X2luX3NoZiApICYgMHhmOworICAgICAgICAgICAgSU9kbHlfb3V0X3JlZyA9IChTQ1VfNDhoX29sZCA+PiBJT2RseV9vdXRfc2hmKSAmIDB4ZjsKKyAgICAgICAgfSAvLyBFbmQgaWYgKCBFbmFibGVfUk1JSSApCisgICAgICAgIAorICAgICAgICAvLyBGaW5kIHRoZSBjb29yZGluYXRlIGluIFgtWSBheGlzCisgICAgICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPD0gMTU7IGluZGV4KysgKSAKKyAgICAgICAgICAgIGlmICggSU9kbHlfaW5fcmVnID09IHZhbGFyeVtpbmRleF0gKSB7CisgICAgICAgICAgICAgICAgSU9kbHlfaW5fcmVnX2lkeCA9IGluZGV4OyAKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZm9yICggaW5kZXggPSAwOyBpbmRleCA8PSAxNTsgaW5kZXgrKyApIAorICAgICAgICAgICAgaWYgKCBJT2RseV9vdXRfcmVnID09IHZhbGFyeVtpbmRleF0gKSB7CisgICAgICAgICAgICAgICAgSU9kbHlfb3V0X3JlZ19pZHggPSBpbmRleDsgCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBHZXQgdGhlIHJhbmdlIGZvciB0ZXN0bWFyZ2luIGJsb2NrCisgICAgICAgIGlmICggSU9UaW1pbmcgKSB7CisgICAgICAgICAgICBpZiAoIEVuYWJsZV9STUlJICkgeworICAgICAgICAgICAgICAgIElPZGx5X2luY3ZhbCAgPSAxOworICAgICAgICAgICAgICAgIElPZGx5X2luX3N0ciAgPSAwOworICAgICAgICAgICAgICAgIElPZGx5X2luX2VuZCAgPSAxNTsKKyAgICAgICAgICAgICAgICBJT2RseV9vdXRfc3RyID0gMDsKKyAgICAgICAgICAgICAgICBJT2RseV9vdXRfZW5kID0gMTsKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBJT2RseV9pbmN2YWwgID0gMTsKKyAgICAgICAgICAgICAgICBJT2RseV9pbl9zdHIgID0gMDsKKyAgICAgICAgICAgICAgICBJT2RseV9pbl9lbmQgID0gMTU7CisgICAgICAgICAgICAgICAgSU9kbHlfb3V0X3N0ciA9IDA7CisgICAgICAgICAgICAgICAgSU9kbHlfb3V0X2VuZCA9IDE1OworICAgICAgICAgICAgfQorICAgICAgICB9IAorICAgICAgICBlbHNlIGlmICggSU9UaW1pbmdCdW5kICkgeworICAgICAgICAgICAgaWYgKCBFbmFibGVfUk1JSSApIHsKKyAgICAgICAgICAgICAgICBJT2RseV9pbmN2YWwgID0gMTsKKyAgICAgICAgICAgICAgICBJT2RseV9pbl9zdHIgID0gSU9kbHlfaW5fcmVnX2lkeCAgLSAoIElPVGltaW5nQnVuZCA+PiAxICk7CisgICAgICAgICAgICAgICAgSU9kbHlfaW5fZW5kICA9IElPZGx5X2luX3JlZ19pZHggICsgKCBJT1RpbWluZ0J1bmQgPj4gMSApOworICAgICAgICAgICAgICAgIElPZGx5X291dF9zdHIgPSBJT2RseV9vdXRfcmVnX2lkeDsKKyAgICAgICAgICAgICAgICBJT2RseV9vdXRfZW5kID0gSU9kbHlfb3V0X3JlZ19pZHg7CisgICAgICAgICAgICB9IAorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgSU9kbHlfaW5jdmFsICA9IDE7CisgICAgICAgICAgICAgICAgSU9kbHlfaW5fc3RyICA9IElPZGx5X2luX3JlZ19pZHggIC0gKCBJT1RpbWluZ0J1bmQgPj4gMSApOworICAgICAgICAgICAgICAgIElPZGx5X2luX2VuZCAgPSBJT2RseV9pbl9yZWdfaWR4ICArICggSU9UaW1pbmdCdW5kID4+IDEgKTsKKyAgICAgICAgICAgICAgICBJT2RseV9vdXRfc3RyID0gSU9kbHlfb3V0X3JlZ19pZHggLSAoIElPVGltaW5nQnVuZCA+PiAxICk7CisgICAgICAgICAgICAgICAgSU9kbHlfb3V0X2VuZCA9IElPZGx5X291dF9yZWdfaWR4ICsgKCBJT1RpbWluZ0J1bmQgPj4gMSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChJT2RseV9pbl9zdHIgIDwgMCkgfHwgKElPZGx5X2luX2VuZCAgPiAxNSkpIAorICAgICAgICAgICAgICAgIHJldHVybiggRmluaXNoX0NoZWNrKCBFcnJfSU9NYXJnaW5PVUYgKSApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKChJT2RseV9vdXRfc3RyIDwgMCkgfHwgKElPZGx5X291dF9lbmQgPiAxNSkpIAorICAgICAgICAgICAgICAgIHJldHVybiggRmluaXNoX0NoZWNrKCBFcnJfSU9NYXJnaW5PVUYgKSApOworCisvLyAgICAgICAgICBpZiAoSU9kbHlfaW5fc3RyICA8ICAwKSBJT2RseV9pbl9zdHIgID0gIDA7CisvLyAgICAgICAgICBpZiAoSU9kbHlfaW5fZW5kICA+IDE1KSBJT2RseV9pbl9lbmQgID0gMTU7CisvLyAgICAgICAgICBpZiAoSU9kbHlfb3V0X3N0ciA8ICAwKSBJT2RseV9vdXRfc3RyID0gIDA7CisvLyAgICAgICAgICBpZiAoSU9kbHlfb3V0X2VuZCA+IDE1KSBJT2RseV9vdXRfZW5kID0gMTU7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgSU9kbHlfaW5jdmFsICA9IDE7CisgICAgICAgICAgICBJT2RseV9pbl9zdHIgID0gMDsKKyAgICAgICAgICAgIElPZGx5X2luX2VuZCAgPSAwOworICAgICAgICAgICAgSU9kbHlfb3V0X3N0ciA9IDA7CisgICAgICAgICAgICBJT2RseV9vdXRfZW5kID0gMDsKKyAgICAgICAgfSAvLyBFbmQgaWYgKElPVGltaW5nKQorICAgIH0gLy8gRW5kIGlmIChSVU5fU1RFUCA+PSA0KQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbWFpbgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBpZiAoUlVOX1NURVAgPj0gNSkgeworICAgICAgICAjaWZkZWYgIERiZ1Bybl9GdW5jSGVhZGVyCisgICAgICAgICAgICBwcmludGYgKCJHU3BlZWRfc2VsOiAlZCAlZCAlZFxuIiwgR1NwZWVkX3NlbFswXSwgR1NwZWVkX3NlbFsxXSwgR1NwZWVkX3NlbFsyXSk7IAorICAgICAgICAgICAgRGVidWdfZGVsYXkoKTsKKyAgICAgICAgI2VuZGlmCisKKyAgICBpZiAoIE1vZGVTd2l0Y2ggPT0gTU9ERV9OU0NJICkgeworICAgICAgICAjaWZkZWYgRW5hYmxlX05DU0lfTE9PUF9JTkZJTkkKKyAgICAgICAgZm9yICggR1NwZWVkX2lkeCA9IDA7IEdTcGVlZF9pZHggPCAzOyBHU3BlZWRfaWR4KysgKSB7CisgICAgICAgICAgICBHU3BlZWRfb3JnW0dTcGVlZF9pZHhdID0gR1NwZWVkX3NlbFtHU3BlZWRfaWR4XTsKKyAgICAgICAgfQorTkNTSV9MT09QX0lORklOSTo7CisgICAgICAgIGZvciAoIEdTcGVlZF9pZHggPSAwOyBHU3BlZWRfaWR4IDwgMzsgR1NwZWVkX2lkeCsrICkgeworICAgICAgICAgICAgR1NwZWVkX3NlbFtHU3BlZWRfaWR4XSA9IEdTcGVlZF9vcmdbR1NwZWVkX2lkeF07CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgfSAvLyBFbmQgaWYgKCBNb2RlU3dpdGNoID09IE1PREVfTlNDSSApCisKKyAgICAgICAgZm9yIChHU3BlZWRfaWR4ID0gMDsgR1NwZWVkX2lkeCA8IDM7IEdTcGVlZF9pZHgrKykgeworICAgICAgICAgICAgRXJyX0ZsYWdfUHJpbnRFbiA9IDE7CisgICAgICAgICAgICBpZiAoIEdTcGVlZF9zZWxbR1NwZWVkX2lkeF0gKSB7CisgICAgICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgTEFOIHNwZWVkCisgICAgICAgICAgICAgICAgaWYgKCBNb2RlU3dpdGNoID09ICBNT0RFX0RFRElDQVRFRCApIHsKKworCisgICAgICAgICAgICAgICAgICAgIC8vIFRlc3QgdGhyZWUgc3BlZWQgb2YgTEFOLCB3ZSB3aWxsIG1vZGlmeSBsb29wIG51bWJlcgorICAgICAgICAgICAgICAgICAgICBpZiAoR1NwZWVkID09IFNFVF8xR18xMDBNXzEwTUJQUykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgICAgICAoR1NwZWVkX3NlbFswXSkgTE9PUF9NQVggPSBMT09QX01BWF9hcmc7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChHU3BlZWRfc2VsWzFdKSBMT09QX01BWCA9IExPT1BfTUFYX2FyZyAvIDEwOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgTE9PUF9NQVggPSBMT09QX01BWF9hcmcgLyAxMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICFMT09QX01BWCApIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPT1BfTUFYID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FsY3VsYXRlX0xPT1BfQ2hlY2tOdW0oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLy8gU2V0dGluZyBzcGVlZCBvZiBMQU4KKyAgICAgICAgICAgICAgICAgICAgaWYgICAgICAoR1NwZWVkX3NlbFswXSkgTUFDXzUwaF9TcGVlZCA9IDB4MDAwMDAyMDA7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEdTcGVlZF9zZWxbMV0pIE1BQ181MGhfU3BlZWQgPSAweDAwMDgwMDAwOworICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICBNQUNfNTBoX1NwZWVkID0gMHgwMDAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAvLyBQSFkgSW5pdGlhbAorICAgICAgICAgICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICBpZiAoIEFTVDExMDAgKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfc2N1MigpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmICggRW5hYmxlX0luaXRQSFkgKSB7CisjaWZkZWYgU1VQUE9SVF9QSFlfTEFOOTMwMworICAgICAgICAgICAgICAgICAgICAgICAgTEFOOTMwMyhMQU45MzAzX0kyQ19CVVNOVU0sIFBIWV9BRFJfYXJnLCBHU3BlZWRfaWR4LCBFbmFibGVfSW50TG9vcFBIWSB8IChCdXJzdEVuYWJsZTw8MSkgfCBJRUVFVGVzdGluZyk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9waHkoIEVuYWJsZV9JbnRMb29wUEhZICk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIERFTEFZKCBEZWxheV9QSFlSc3QgKiAxMCApOworICAgICAgICAgICAgICAgICAgICB9IC8vIEVuZCBpZiAoRW5hYmxlX0luaXRQSFkpCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBBU1QxMTAwICkgCisgICAgICAgICAgICAgICAgICAgICAgICBpbml0X3NjdTMoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIEVycl9GbGFnICkgCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oIEZpbmlzaF9DaGVjayggMCApICk7CisgICAgICAgICAgICAgICAgfSAvLyBFbmQgaWYgKCBNb2RlU3dpdGNoID09ICBNT0RFX0RFRElDQVRFRCApCisKKyAgICAgICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgIC8vIFN0YXJ0CisgICAgICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBUaGUgbG9vcCBpcyBmb3IgZGlmZmVyZW50IElPIHN0cmVuZ3RoCisgICAgICAgICAgICAgICAgZm9yICggSU9TdHJfaSA9IDA7IElPU3RyX2kgPD0gSU9TdHJfbWF4OyBJT1N0cl9pKysgKSB7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvLyBQcmludCBIZWFkZXIgb2YgcmVwb3J0IHRvIG1vbml0b3IgYW5kIGxvZyBmaWxlCisgICAgICAgICAgICAgICAgICAgIGlmICggSU9UaW1pbmcgfHwgSU9UaW1pbmdCdW5kICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBJT1N0cmVuZ3RoICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggQVNUMTAxMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9TdHJfdmFsID0gKFNDVV9hY2hfb2xkICYgMHhmZmYwZmZmZikgfCAoKElPU3RyX2kpID8gMHhmMDAwMCA6IDB4MCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9TdHJfdmFsID0gKFNDVV85MGhfb2xkICYgMHhmZmZmMDBmZikgfCAoSU9TdHJfaSA8PCBJT1N0cl9zaGYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiXG5JT1N0cmVuZ3RoX3ZhbD0gJTA4eCwgIiwgSU9TdHJfdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiU0NVOTBoOiAlMDh4IC0+IiwgUmVhZFNPQ19ERChTQ1VfQkFTRSsweDkwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVTT0NfREQoIFNDVV9CQVNFICsgMHg5MCwgSU9TdHJfdmFsICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGYoIiAlMDh4XG4iLCBSZWFkU09DX0REKFNDVV9CQVNFKzB4OTApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWZuZGVmIFNMVF9VQk9PVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICAgICAgKEdTcGVlZF9zZWxbMF0pIGZwcmludGYoZnBfbG9nLCAiW1N0cmVuZ3RoICVkXVsxRyAgXT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIsIElPU3RyX2kpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEdTcGVlZF9zZWxbMV0pIGZwcmludGYoZnBfbG9nLCAiW1N0cmVuZ3RoICVkXVsxMDBNXT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIsIElPU3RyX2kpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnBfbG9nLCAiW1N0cmVuZ3RoICVkXVsxME0gXT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIsIElPU3RyX2kpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZm5kZWYgU0xUX1VCT09UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgICAgICAoR1NwZWVkX3NlbFswXSkgZnByaW50ZihmcF9sb2csICJbMUcgIF09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChHU3BlZWRfc2VsWzFdKSBmcHJpbnRmKGZwX2xvZywgIlsxMDBNXT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnBfbG9nLCAiWzEwTSBdPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggSU9UaW1pbmdCdW5kICkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRJT19IZWFkZXIoRlBfTE9HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggSU9UaW1pbmcgICAgICkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRJT19IZWFkZXIoRlBfSU8pOworCisgICAgICAgICAgICAgICAgICAgICAgICBQcmludElPX0hlYWRlcihTVERfT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggTW9kZVN3aXRjaCA9PSBNT0RFX0RFRElDQVRFRCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQnVyc3RFbmFibGUpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludF9IZWFkZXIoRlBfTE9HKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50X0hlYWRlcihTVERfT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSAvLyBFbmQgaWYgKElPVGltaW5nIHx8IElPVGltaW5nQnVuZCkKKyAgICAgICAgICAgICAgICAgICAgCisjaWZkZWYgRW5hYmxlX09sZF9TdHlsZQorICAgICAgICAgICAgICAgICAgICBmb3IgKElPZGx5X2kgPSBJT2RseV9pbl9zdHI7IElPZGx5X2kgPD0gSU9kbHlfaW5fZW5kOyBJT2RseV9pKz1JT2RseV9pbmN2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIElPZGx5X2luICA9IHZhbGFyeVtJT2RseV9pXTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIGZvciAoSU9kbHlfaiA9IElPZGx5X291dF9zdHI7IElPZGx5X2ogPD0gSU9kbHlfb3V0X2VuZDsgSU9kbHlfais9SU9kbHlfaW5jdmFsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJT2RseV9vdXQgPSB2YWxhcnlbSU9kbHlfal07CisjZW5kaWYKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElPVGltaW5nIHx8IElPVGltaW5nQnVuZCkgeworI2lmZGVmIEVuYWJsZV9GYXN0X1NDVQorICAjaWZkZWYgRW5hYmxlX09sZF9TdHlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlU09DX0REKFNDVV9CQVNFICsgMHg0OCwgU0NVXzQ4aF9taXggfCAoSU9kbHlfaW4gPDwgSU9kbHlfaW5fc2hmKSk7CisgICNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVTT0NfREQoU0NVX0JBU0UgKyAweDQ4LCBTQ1VfNDhoX21peCB8IChJT2RseV9vdXQgPDwgSU9kbHlfb3V0X3NoZikpOworICAjZW5kaWYKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBJT1RpbWluZ0J1bmQgKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRJT19MaW5lUyhGUF9MT0cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggSU9UaW1pbmcgICAgICkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50SU9fTGluZVMoRlBfSU8pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRJT19MaW5lUyhTVERfT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gRW5kIGlmIChJT1RpbWluZyB8fCBJT1RpbWluZ0J1bmQpCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTQ1UgSW5pdGlhbAorICAgICAgICAgICAgICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBFbmFibGVfRmFzdF9TQ1UKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfc2N1X21hY3JzdCgpOworI2VuZGlmCisjaWZkZWYgRW5hYmxlX09sZF9TdHlsZQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJT2RseV9qID0gSU9kbHlfb3V0X3N0cjsgSU9kbHlfaiA8PSBJT2RseV9vdXRfZW5kOyBJT2RseV9qKz1JT2RseV9pbmN2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT2RseV9vdXQgPSB2YWxhcnlbSU9kbHlfal07CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJT2RseV9pID0gSU9kbHlfaW5fc3RyOyBJT2RseV9pIDw9IElPZGx5X2luX2VuZDsgSU9kbHlfaSs9SU9kbHlfaW5jdmFsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9kbHlfaW4gID0gdmFsYXJ5W0lPZGx5X2ldOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBJT1RpbWluZyB8fCBJT1RpbWluZ0J1bmQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPZGx5X3ZhbCA9IChJT2RseV9pbiAgPDwgSU9kbHlfaW5fc2hmKSB8IChJT2RseV9vdXQgPDwgSU9kbHlfb3V0X3NoZik7CisKKy8vcHJpbnRmKCJcbklPZGx5X3ZhbD0gJTA4eCwgIiwgSU9kbHlfdmFsKTsKKy8vcHJpbnRmKCJTQ1U0OGg6ICUwOHggLT4iLCBSZWFkU09DX0REKCBTQ1VfQkFTRSArIDB4NDggKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlU09DX0REKCBTQ1VfQkFTRSArIDB4NDgsIFNDVV80OGhfbWl4IHwgSU9kbHlfdmFsICk7CisvL3ByaW50ZigiICUwOHhcbiIsIFJlYWRTT0NfREQoU0NVX0JBU0UrMHg0OCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gRW5kIGlmIChJT1RpbWluZyB8fCBJT1RpbWluZ0J1bmQpCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNDVSBJbml0aWFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBFbmFibGVfRmFzdF9TQ1UKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9zY3VfbWFjcnN0KCk7CisjZW5kaWYKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTUFDIEluaXRpYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfbWFjKEhfTUFDX0JBU0UsIEhfVERFU19CQVNFLCBIX1JERVNfQkFTRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBFcnJfRmxhZyApIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oIEZpbmlzaF9DaGVjaygwKSApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVzdGluZyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIE1vZGVTd2l0Y2ggPT0gTU9ERV9OU0NJICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGx5bWFwW0lPZGx5X2ldW0lPZGx5X2pdID0gcGh5X25jc2koKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRseW1hcFtJT2RseV9pXVtJT2RseV9qXSA9IFRlc3RpbmdMb29wKExPT1BfQ2hlY2tOdW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc3BsYXkgdG8gTG9nIGZpbGUgYW5kIG1vbml0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIElPVGltaW5nIHx8IElPVGltaW5nQnVuZCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIElPVGltaW5nQnVuZCApIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRJT19MaW5lKEZQX0xPRyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBJT1RpbWluZyAgICAgKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50SU9fTGluZShGUF9JTyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRJT19MaW5lKFNURF9PVVQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIHJhbmdlIG9mIGN1cnJlbnQgc2V0dGluZyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoIElPZGx5X2luX3JlZyA9PSBJT2RseV9pbiApICYmICggSU9kbHlfb3V0X3JlZyA9PSBJT2RseV9vdXQgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPZGx5X2lfbWluID0gSU9kbHlfaSAtICggSU9UaW1pbmdCdW5kID4+IDEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPZGx5X2lfbWF4ID0gSU9kbHlfaSArICggSU9UaW1pbmdCdW5kID4+IDEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIEVuYWJsZV9STUlJICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPZGx5X2pfbWluID0gSU9kbHlfajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT2RseV9qX21heCA9IElPZGx5X2o7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9kbHlfal9taW4gPSBJT2RseV9qIC0gKElPVGltaW5nQnVuZCA+PiAxICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9kbHlfal9tYXggPSBJT2RseV9qICsgKElPVGltaW5nQnVuZCA+PiAxICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50SU9fTGluZV9MT0coKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlByaV9FcnJGbGFnKEZQX0xPRyk7CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyX0ZsYWdfYWxsYXBlZWQgPSBFcnJfRmxhZ19hbGxhcGVlZCB8IEVycl9GbGFnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJfRmxhZyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfS8vIEVuZCBmb3IgKElPZGx5X2ogPSBJT2RseV9vdXRfc3RyOyBJT2RseV9qIDw9IElPZGx5X291dF9lbmQ7IElPZGx5X2orPUlPZGx5X2luY3ZhbCkKKyNpZm5kZWYgU0xUX1VCT09UICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIElPVGltaW5nIHx8IElPVGltaW5nQnVuZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIElPVGltaW5nQnVuZCApIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwX2xvZywgIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElPVGltaW5nICAgICkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnBfaW8sICJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICAgICAgICAgIH0gLy8gRW5kIGZvciAoSU9kbHlfaiA9IElPZGx5X291dF9zdHI7IElPZGx5X2ogPD0gSU9kbHlfb3V0X2VuZDsgSU9kbHlfais9SU9kbHlfaW5jdmFsKQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgLy8gRW5kCisgICAgICAgICAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBJT1RpbWluZyB8fCBJT1RpbWluZ0J1bmQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICggSU9kbHlfaV9taW4gPCAwICkgfHwgKCBJT2RseV9pX21heCA+IDE1ICkgKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5kRXJyKEVycl9JT01hcmdpbk9VRik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICggSU9kbHlfal9taW4gPCAwICkgfHwgKCBJT2RseV9qX21heCA+IDE1ICkgKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5kRXJyKEVycl9JT01hcmdpbk9VRik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggSU9kbHlfaV9taW4gPCAgMCApIElPZGx5X2lfbWluID0gIDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIElPZGx5X2lfbWF4ID4gMTUgKSBJT2RseV9pX21heCA9IDE1OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBJT2RseV9qX21pbiA8ICAwICkgSU9kbHlfal9taW4gPSAgMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggSU9kbHlfal9tYXggPiAxNSApIElPZGx5X2pfbWF4ID0gMTU7CisKKyNpZmRlZiBFbmFibGVfT2xkX1N0eWxlCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElPZGx5X2kgPSBJT2RseV9pX21pbjsgSU9kbHlfaSA8PSBJT2RseV9pX21heDsgSU9kbHlfaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSU9kbHlfaiA9IElPZGx5X2pfbWluOyBJT2RseV9qIDw9IElPZGx5X2pfbWF4OyBJT2RseV9qKyspCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJT2RseV9qID0gSU9kbHlfal9taW47IElPZGx5X2ogPD0gSU9kbHlfal9tYXg7IElPZGx5X2orKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElPZGx5X2kgPSBJT2RseV9pX21pbjsgSU9kbHlfaSA8PSBJT2RseV9pX21heDsgSU9kbHlfaSsrKQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBkbHltYXBbSU9kbHlfaV1bSU9kbHlfal0gKSB7CisjaWZkZWYgU0xUX0RPUyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggSU9UaW1pbmcgKSB7CisjaWZkZWYgRW5hYmxlX09sZF9TdHlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IElPZGx5X2lfbWluOyBpIDw9IElPZGx5X2lfbWF4OyBpKyspCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IElPZGx5X2pfbWluOyBqIDw9IElPZGx5X2pfbWF4OyBqKyspCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisjaWZkZWYgRW5hYmxlX09sZF9TdHlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBJT2RseV9qX21pbjsgaiA8PSBJT2RseV9qX21heDsgaisrKQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gSU9kbHlfaV9taW47IGkgPD0gSU9kbHlfaV9tYXg7IGkrKykKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRseW1hcFtpXVtqXSkgZnByaW50ZihmcF9pbywgInggIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICBmcHJpbnRmKGZwX2lvLCAibyAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwX2lvLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIEVuZCBpZiAoIElPVGltaW5nICkKKyNlbmRpZiAvLyBFbmQgU0xUX0RPUyAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5kRXJyKEVycl9JT01hcmdpbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEZpbmRfRXJyX0lPTWFyZ2luOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIEVuZCBpZiAoIGRseW1hcFtJT2RseV9pXVtJT2RseV9qXSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IC8vIEVuZCBpZiAoIElPVGltaW5nIHx8IElPVGltaW5nQnVuZCApCisKK0ZpbmRfRXJyX0lPTWFyZ2luOjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhQnVyc3RFbmFibGUgKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIEZQcmlfRXJyRmxhZyhGUF9MT0cpOworICAgICAgICAgICAgICAgICAgICBpZiAoIElPVGltaW5nICkgCisgICAgICAgICAgICAgICAgICAgICAgICBGUHJpX0VyckZsYWcoRlBfSU8pOworCisgICAgICAgICAgICAgICAgICAgIEZQcmlfRXJyRmxhZyhTVERfT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIEVycl9GbGFnX2FsbGFwZWVkID0gRXJyX0ZsYWdfYWxsYXBlZWQgfCBFcnJfRmxhZzsKKyAgICAgICAgICAgICAgICAgICAgRXJyX0ZsYWcgPSAwOworICAgICAgICAgICAgICAgIH0gLy8gRW5kIGZvciAoSU9TdHJfaSA9IDA7IElPU3RyX2kgPD0gSU9TdHJfbWF4OyBJT1N0cl9pKyspCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCBNb2RlU3dpdGNoID09IE1PREVfREVESUNBVEVEICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIEVuYWJsZV9Jbml0UEhZICYgIURpc2FibGVfUmVjb3ZQSFkgKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY292X3BoeShFbmFibGVfSW50TG9vcFBIWSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBHU3BlZWRfc2VsW0dTcGVlZF9pZHhdID0gMDsKKyAgICAgICAgICAgIH0gLy8gRW5kIGlmIChHU3BlZWRfc2VsW0dTcGVlZF9pZHhdKQorICAgICAgICAgICAgCisgICAgICAgICAgICBFcnJfRmxhZ19QcmludEVuID0gMDsKKyAgICAgICAgfSAvLyBFbmQgZm9yIChHU3BlZWRfaWR4ID0gMDsgR1NwZWVkX2lkeCA8IDM7IEdTcGVlZF9pZHgrKykKKyAgICAgICAgCisgICAgICAgIEVycl9GbGFnID0gRXJyX0ZsYWdfYWxsYXBlZWQ7CisKKyAgICAgICAgaWYgKCBNb2RlU3dpdGNoID09IE1PREVfTlNDSSApIHsKKyAgICAgICAgICAgICNpZmRlZiBFbmFibGVfTkNTSV9MT09QX0lORklOSQorICAgICAgICAgICAgaWYgKEVycl9GbGFnID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoZnBfbG9nKSB7CisgICAgICAgICAgICAgICAgICAgIGZjbG9zZShmcF9sb2cpOworICAgICAgICAgICAgICAgICAgICBmcF9sb2cgPSBmb3BlbihGaWxlTmFtZSwidyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIE5DU0lfTE9PUF9JTkZJTkk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9IC8vIEVuZCBpZiAoUlVOX1NURVAgPj0gNSkKKworICAgIHJldHVybihGaW5pc2hfQ2hlY2soMCkpOworICAgCit9CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NwdS9hcm05MjZlanMvYXNwZWVkL3Jlc2V0LmMgYi9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9yZXNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYTU3ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC9yZXNldC5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBBU1RfV0RUX0JBU0UgMHgxZTc4NTAwMAordm9pZCByZXNldF9jcHUodWxvbmcgYWRkcikKK3sKKwlfX3Jhd193cml0ZWwoMHgxMCAsIEFTVF9XRFRfQkFTRSsweDA0KTsKKwlfX3Jhd193cml0ZWwoMHg0NzU1LCBBU1RfV0RUX0JBU0UrMHgwOCk7CisJX19yYXdfd3JpdGVsKDB4MywgQVNUX1dEVF9CQVNFKzB4MGMpOworCisJd2hpbGUgKDEpCisJLypub3RoaW5nKi87Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jcHUvYXJtOTI2ZWpzL2FzcGVlZC90aW1lci5jIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmJhNWM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY3B1L2FybTkyNmVqcy9hc3BlZWQvdGltZXIuYwpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhcm05MjZlanMuaD4KKworI2RlZmluZSBUSU1FUl9MT0FEX1ZBTCAweGZmZmZmZmZmCisKKy8qIG1hY3JvIHRvIHJlYWQgdGhlIDMyIGJpdCB0aW1lciAqLworI2RlZmluZSBSRUFEX1RJTUVSICgqKHZvbGF0aWxlIHVsb25nICopKENPTkZJR19TWVNfVElNRVJCQVNFKzApKQorCitzdGF0aWMgdWxvbmcgdGltZXN0YW1wOworc3RhdGljIHVsb25nIGxhc3RkZWM7CisKK2ludCB0aW1lcl9pbml0ICh2b2lkKQoreworCSoodm9sYXRpbGUgdWxvbmcgKikoQ09ORklHX1NZU19USU1FUkJBU0UgKyA0KSAgICA9IFRJTUVSX0xPQURfVkFMOworCSoodm9sYXRpbGUgdWxvbmcgKikoQ09ORklHX1NZU19USU1FUkJBU0UgKyAweDMwKSA9IDB4MzsJCS8qIGVuYWJsZSB0aW1lcjEgKi8KKworCS8qIGluaXQgdGhlIHRpbWVzdGFtcCBhbmQgbGFzdGRlYyB2YWx1ZSAqLworCXJlc2V0X3RpbWVyX21hc2tlZCgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB0aW1lciB3aXRob3V0IGludGVycnVwdHMKKyAqLworCit2b2lkIHJlc2V0X3RpbWVyICh2b2lkKQoreworCXJlc2V0X3RpbWVyX21hc2tlZCAoKTsKK30KKwordWxvbmcgZ2V0X3RpbWVyICh1bG9uZyBiYXNlKQoreworCXJldHVybiBnZXRfdGltZXJfbWFza2VkICgpIC0gYmFzZTsKK30KKwordm9pZCBzZXRfdGltZXIgKHVsb25nIHQpCit7CisJdGltZXN0YW1wID0gdDsKK30KKworLyogZGVsYXkgeCB1c2Vjb25kcyBBTkQgcGVyc2VydmUgYWR2YW5jZSB0aW1zdGFtcCB2YWx1ZSAqLwordm9pZCB1ZGVsYXkgKHVuc2lnbmVkIGxvbmcgdXNlYykKK3sKKwl1bG9uZyB0bW8sIHRtcDsKKworCWlmKHVzZWMgPj0gMTAwMCl7CQkvKiBpZiAiYmlnIiBudW1iZXIsIHNwcmVhZCBub3JtYWxpemF0aW9uIHRvIHNlY29uZHMgKi8KKwkJdG1vID0gdXNlYyAvIDEwMDA7CS8qIHN0YXJ0IHRvIG5vcm1hbGl6ZSBmb3IgdXNlYyB0byB0aWNrcyBwZXIgc2VjICovCisJCXRtbyAqPSBDT05GSUdfU1lTX0haOwkJLyogZmluZCBudW1iZXIgb2YgInRpY2tzIiB0byB3YWl0IHRvIGFjaGlldmUgdGFyZ2V0ICovCisJCXRtbyAvPSAxMDAwOwkJLyogZmluaXNoIG5vcm1hbGl6ZS4gKi8KKwl9ZWxzZXsJCQkJLyogZWxzZSBzbWFsbCBudW1iZXIsIGRvbid0IGtpbGwgaXQgcHJpb3IgdG8gSFogbXVsdGlwbHkgKi8KKwkJdG1vID0gdXNlYyAqIENPTkZJR19TWVNfSFo7CisJCXRtbyAvPSAoMTAwMCoxMDAwKTsKKwl9CisKKwl0bXAgPSBnZXRfdGltZXIgKDApOwkJLyogZ2V0IGN1cnJlbnQgdGltZXN0YW1wICovCisJaWYoICh0bW8gKyB0bXAgKyAxKSA8IHRtcCApCS8qIGlmIHNldHRpbmcgdGhpcyBmb3Jkd2FyZCB3aWxsIHJvbGwgdGltZSBzdGFtcCAqLworCQlyZXNldF90aW1lcl9tYXNrZWQgKCk7CS8qIHJlc2V0ICJhZHZhbmNpbmciIHRpbWVzdGFtcCB0byAwLCBzZXQgbGFzdGRlYyB2YWx1ZSAqLworCWVsc2UKKwkJdG1vICs9IHRtcDsJCS8qIGVsc2UsIHNldCBhZHZhbmNpbmcgc3RhbXAgd2FrZSB1cCB0aW1lICovCisKKwl3aGlsZSAoZ2V0X3RpbWVyX21hc2tlZCAoKSA8IHRtbykvKiBsb29wIHRpbGwgZXZlbnQgKi8KKwkJLypOT1AqLzsKK30KKwordm9pZCByZXNldF90aW1lcl9tYXNrZWQgKHZvaWQpCit7CisJLyogcmVzZXQgdGltZSAqLworCWxhc3RkZWMgPSBSRUFEX1RJTUVSOyAgLyogY2FwdXJlIGN1cnJlbnQgZGVjcmVtZW50ZXIgdmFsdWUgdGltZSAqLworCXRpbWVzdGFtcCA9IDA7CSAgICAgICAvKiBzdGFydCAiYWR2YW5jaW5nIiB0aW1lIHN0YW1wIGZyb20gMCAqLworfQorCit1bG9uZyBnZXRfdGltZXJfbWFza2VkICh2b2lkKQoreworCXVsb25nIG5vdyA9IFJFQURfVElNRVI7CQkvKiBjdXJyZW50IHRpY2sgdmFsdWUgKi8KKworCWlmIChsYXN0ZGVjID49IG5vdykgewkJLyogbm9ybWFsIG1vZGUgKG5vbiByb2xsKSAqLworCQkvKiBub3JtYWwgbW9kZSAqLworCQl0aW1lc3RhbXAgKz0gbGFzdGRlYyAtIG5vdzsgLyogbW92ZSBzdGFtcCBmb3Jkd2FyZCB3aXRoIGFic291bHRlIGRpZmYgdGlja3MgKi8KKwl9IGVsc2UgewkJCS8qIHdlIGhhdmUgb3ZlcmZsb3cgb2YgdGhlIGNvdW50IGRvd24gdGltZXIgKi8KKwkJLyogbnRzID0gdHMgKyBsZCArIChUTFYgLSBub3cpCisJCSAqIHRzPW9sZCBzdGFtcCwgbGQ9dGltZSB0aGF0IHBhc3NlZCBiZWZvcmUgcGFzc2luZyB0aHJvdWdoIC0xCisJCSAqIChUTFYtbm93KSBhbW91bnQgb2YgdGltZSBhZnRlciBwYXNzaW5nIHRob3VnaCAtMQorCQkgKiBudHMgPSBuZXcgImFkdmFuY2luZyB0aW1lIHN0YW1wIi4uLml0IGNvdWxkIGFsc28gcm9sbCBhbmQgY2F1c2UgcHJvYmxlbXMuCisJCSAqLworCQl0aW1lc3RhbXAgKz0gbGFzdGRlYyArIFRJTUVSX0xPQURfVkFMIC0gbm93OworCX0KKwlsYXN0ZGVjID0gbm93OworCisJcmV0dXJuIHRpbWVzdGFtcDsKK30KKworLyogd2FpdHMgc3BlY2lmaWVkIGRlbGF5IHZhbHVlIGFuZCByZXNldHMgdGltZXN0YW1wICovCit2b2lkIHVkZWxheV9tYXNrZWQgKHVuc2lnbmVkIGxvbmcgdXNlYykKK3sKKwl1bG9uZyB0bW87CisJdWxvbmcgZW5kdGltZTsKKwlzaWduZWQgbG9uZyBkaWZmOworCisJaWYgKHVzZWMgPj0gMTAwMCkgewkJLyogaWYgImJpZyIgbnVtYmVyLCBzcHJlYWQgbm9ybWFsaXphdGlvbiB0byBzZWNvbmRzICovCisJCXRtbyA9IHVzZWMgLyAxMDAwOwkvKiBzdGFydCB0byBub3JtYWxpemUgZm9yIHVzZWMgdG8gdGlja3MgcGVyIHNlYyAqLworCQl0bW8gKj0gQ09ORklHX1NZU19IWjsJCS8qIGZpbmQgbnVtYmVyIG9mICJ0aWNrcyIgdG8gd2FpdCB0byBhY2hpZXZlIHRhcmdldCAqLworCQl0bW8gLz0gMTAwMDsJCS8qIGZpbmlzaCBub3JtYWxpemUuICovCisJfSBlbHNlIHsJCQkvKiBlbHNlIHNtYWxsIG51bWJlciwgZG9uJ3Qga2lsbCBpdCBwcmlvciB0byBIWiBtdWx0aXBseSAqLworCQl0bW8gPSB1c2VjICogQ09ORklHX1NZU19IWjsKKwkJdG1vIC89ICgxMDAwKjEwMDApOworCX0KKworCWVuZHRpbWUgPSBnZXRfdGltZXJfbWFza2VkICgpICsgdG1vOworCisJZG8geworCQl1bG9uZyBub3cgPSBnZXRfdGltZXJfbWFza2VkICgpOworCQlkaWZmID0gZW5kdGltZSAtIG5vdzsKKwl9IHdoaWxlIChkaWZmID49IDApOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBkZXJpdmVkIGZyb20gUG93ZXJQQyBjb2RlIChyZWFkIHRpbWViYXNlIGFzIGxvbmcgbG9uZykuCisgKiBPbiBBUk0gaXQganVzdCByZXR1cm5zIHRoZSB0aW1lciB2YWx1ZS4KKyAqLwordW5zaWduZWQgbG9uZyBsb25nIGdldF90aWNrcyh2b2lkKQoreworCXJldHVybiBnZXRfdGltZXIoMCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcml2ZWQgZnJvbSBQb3dlclBDIGNvZGUgKHRpbWViYXNlIGNsb2NrIGZyZXF1ZW5jeSkuCisgKiBPbiBBUk0gaXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHRpbWVyIHRpY2tzIHBlciBzZWNvbmQuCisgKi8KK3Vsb25nIGdldF90YmNsayAodm9pZCkKK3sKKwl1bG9uZyB0YmNsazsKKworCXRiY2xrID0gQ09ORklHX1NZU19IWjsKKwlyZXR1cm4gdGJjbGs7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9hcmNoLWFzcGVlZC9hc3BlZWRfaTJjLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9hcmNoLWFzcGVlZC9hc3BlZWRfaTJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxOWZjYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2FyY2gtYXNwZWVkL2FzcGVlZF9pMmMuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpZglkZWZpbmVkKENPTkZJR19BU1QxMzAwKQorI2RlZmluZSAgU0NVX0JBU0UgICAgICAgQ09ORklHX1NDVVJFR19CQVNFCisjZGVmaW5lICBJMkNfQkFTRSAgICAgICBDT05GSUdfSTJDUkVHX0JBU0UKKyNkZWZpbmUgIEkyQ19DSEFOTkVMICAgIENPTkZJR19JMkNfQ0hBTk5FTAorI2Vsc2UKKyNkZWZpbmUgIFNDVV9CQVNFICAgICAgIDB4MUU2RTIwMDAKKyNkZWZpbmUgIEkyQ19CQVNFICAgICAgIDB4MUU3OEEwMDAKKy8qIENhdXNlIFUtYm9vdCBpMmMgY29tbWFuZCBsaW1pdGF0aW9uLCBpdCBjYW4ndCBhc3NpZ24gY2hhbm5lbCBudW1iZXIuIE91ciBFRVBST00gaXMgYXQgY2hhbm5lbCAzIG5vdyovCisvKiBBU1QyMjAwJ3MgRUVQUk9NIGlzIGF0IGNoYW5uZWwgNCAqLworI2lmIGRlZmluZWQoQ09ORklHX0FTVDIyMDApIHx8IGRlZmluZWQoQ09ORklHX0FTVDIzMDApIHx8IGRlZmluZWQoQ09ORklHX0FTVDI0MDApCisjZGVmaW5lICBJMkNfQ0hBTk5FTCAgICA0CisjZWxzZQorI2RlZmluZSAgSTJDX0NIQU5ORUwgICAgMworI2VuZGlmCisjZW5kaWYKKworLyogRml4IHRpbWluZyBmb3IgRUVQUk9NIDEwMEtoeiovCisjZGVmaW5lICBBQ19USU1JTkcgICAgICAweDc3NzQzMzM1CisjZGVmaW5lICBBTExfQ0xFQVIgICAgICAweEZGRkZGRkZGCisjZGVmaW5lICBNQVNURVJfRU5BQkxFICAweDAxCisjZGVmaW5lICBTTEFWRV9FTkFCTEUgICAweDAyCisjZGVmaW5lICBMT09QX0NPVU5UICAgICAweDEwMDAwMAorI2RlZmluZSAgU0NVX1JFU0VUX0NPTlRST0wgICAgMHgwNAorI2RlZmluZSAgU0NVX01VTFRJRlVOQ1RJT05fUElOX0NUTDVfUkVHICAgIDB4OTAKKworLyogSTJDIFJlZ2lzdGVyICovCisjZGVmaW5lICBJMkNfRlVOQ1RJT05fQ09OVFJPTF9SRUdJU1RFUiAgICAoSTJDX0JBU0UgKyBJMkNfQ0hBTk5FTCAqIDB4NDAgKyAweDAwKQorI2RlZmluZSAgSTJDX0FDX1RJTUlOR19SRUdJU1RFUl8xICAgICAgICAgKEkyQ19CQVNFICsgSTJDX0NIQU5ORUwgKiAweDQwICsgMHgwNCkKKyNkZWZpbmUgIEkyQ19BQ19USU1JTkdfUkVHSVNURVJfMiAgICAgICAgIChJMkNfQkFTRSArIEkyQ19DSEFOTkVMICogMHg0MCArIDB4MDgpCisjZGVmaW5lICBJMkNfSU5URVJSVVBUX0NPTlRST0xfUkVHSVNURVIgICAoSTJDX0JBU0UgKyBJMkNfQ0hBTk5FTCAqIDB4NDAgKyAweDBjKQorI2RlZmluZSAgSTJDX0lOVEVSUlVQVF9TVEFUVVNfUkVHSVNURVIgICAgKEkyQ19CQVNFICsgSTJDX0NIQU5ORUwgKiAweDQwICsgMHgxMCkKKyNkZWZpbmUgIEkyQ19DT01NQU5EX1JFR0lTVEVSICAgICAgICAgICAgIChJMkNfQkFTRSArIEkyQ19DSEFOTkVMICogMHg0MCArIDB4MTQpCisjZGVmaW5lICBJMkNfREVWSUNFX0FERFJFU1NfUkVHSVNURVIgICAgICAoSTJDX0JBU0UgKyBJMkNfQ0hBTk5FTCAqIDB4NDAgKyAweDE4KQorI2RlZmluZSAgSTJDX0JVRkZFUl9DT05UUk9MX1JFR0lTVEVSICAgICAgKEkyQ19CQVNFICsgSTJDX0NIQU5ORUwgKiAweDQwICsgMHgxYykKKyNkZWZpbmUgIEkyQ19CWVRFX0JVRkZFUl9SRUdJU1RFUiAgICAgICAgIChJMkNfQkFTRSArIEkyQ19DSEFOTkVMICogMHg0MCArIDB4MjApCisjZGVmaW5lICBJMkNfRE1BX0NPTlRST0xfUkVHSVNURVIgICAgICAgICAoSTJDX0JBU0UgKyBJMkNfQ0hBTk5FTCAqIDB4NDAgKyAweDI0KQorI2RlZmluZSAgSTJDX0RNQV9TVEFUVVNfUkVHSVNURVIgICAgICAgICAgKEkyQ19CQVNFICsgSTJDX0NIQU5ORUwgKiAweDQwICsgMHgyOCkKKworLyogQ29tbWFuZCBCaXQgKi8KKyNkZWZpbmUgIE1BU1RFUl9TVEFSVF9DT01NQU5EICAgICgxIDw8IDApCisjZGVmaW5lICBNQVNURVJfVFhfQ09NTUFORCAgICAgICAoMSA8PCAxKQorI2RlZmluZSAgTUFTVEVSX1JYX0NPTU1BTkQgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgIFJYX0NPTU1BTkRfTElTVCAgICAgICAgICgxIDw8IDQpCisjZGVmaW5lICBNQVNURVJfU1RPUF9DT01NQU5EICAgICAoMSA8PCA1KQorCisvKiBJbnRlcnJ1cHQgU3RhdHVzIEJpdCAqLworI2RlZmluZSAgVFhfQUNLICAgICAgICAoMSA8PCAwKQorI2RlZmluZSAgVFhfTkFDSyAgICAgICAoMSA8PCAxKQorI2RlZmluZSAgUlhfRE9ORSAgICAgICAoMSA8PCAyKQorI2RlZmluZSAgU1RPUF9ET05FICAgICAoMSA8PCA0KQorCisvKiBNYWNyb3MgdG8gYWNjZXNzIHJlZ2lzdGVycyAqLworI2RlZmluZSBvdXRiKHYscCkgKih2b2xhdGlsZSB1OCAqKSAocCkgPSB2CisjZGVmaW5lIG91dHcodixwKSAqKHZvbGF0aWxlIHUxNiAqKSAocCkgPSB2CisjZGVmaW5lIG91dGwodixwKSAqKHZvbGF0aWxlIHUzMiAqKSAocCkgPSB2CisKKyNkZWZpbmUgaW5iKHApCSoodm9sYXRpbGUgdTggKikgKHApCisjZGVmaW5lIGludyhwKQkqKHZvbGF0aWxlIHUxNiAqKSAocCkKKyNkZWZpbmUgaW5sKHApCSoodm9sYXRpbGUgdTMyICopIChwKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC10eXBlcy5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC10eXBlcy5oCmluZGV4IDQ0MGIwNDEuLjQ4ZmNmMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gtdHlwZXMuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoLXR5cGVzLmgKQEAgLTE3NSw2ICsxNzUsMTYgQEAgZXh0ZXJuIHVuc2lnbmVkIGludCBfX21hY2hpbmVfYXJjaF90eXBlOwogI2RlZmluZSBNQUNIX1RZUEVfUEFMTVRYICAgICAgICAgICAgICAgODg1CiAjZGVmaW5lIE1BQ0hfVFlQRV9TM0MyNDEzICAgICAgICAgICAgICA4ODcKICNkZWZpbmUgTUFDSF9UWVBFX1dHMzAyVjIgICAgICAgICAgICAgIDg5MAorI2RlZmluZSBNQUNIX1RZUEVfQVNUMTEwMCAgICAgICAgICAgICAgOTAzCisjZGVmaW5lIE1BQ0hfVFlQRV9BU1QyMDAwICAgICAgICAgICAgICA5MDAKKyNkZWZpbmUgTUFDSF9UWVBFX0FTVDIxMDAgICAgICAgICAgICAgIDkwMgorI2RlZmluZSBNQUNIX1RZUEVfQVNUMjE1MCAgICAgICAgICAgICAgOTA3CisjZGVmaW5lIE1BQ0hfVFlQRV9BU1QyMjAwICAgICAgICAgICAgICA5MDYKKyNkZWZpbmUgTUFDSF9UWVBFX0FTVDIzMDBfRlBHQV8xICAgICAgIDkwMQorI2RlZmluZSBNQUNIX1RZUEVfQVNUMjMwMF9GUEdBXzIgICAgICAgOTAxCisjZGVmaW5lIE1BQ0hfVFlQRV9BU1QyMzAwICAgICAgICAgICAgICA5MDEKKyNkZWZpbmUgTUFDSF9UWVBFX0FTVDMxMDAgICAgICAgICAgICAgIDkwMQorI2RlZmluZSBNQUNIX1RZUEVfQVNQRUVEICAgICAgICAgICAgICAgODg4OAogI2RlZmluZSBNQUNIX1RZUEVfT01BUF8yNDMwU0RQICAgICAgICAgOTAwCiAjZGVmaW5lIE1BQ0hfVFlQRV9EQVZJTkNJX0VWTSAgICAgICAgICA5MDEKICNkZWZpbmUgTUFDSF9UWVBFX1BBTE1aNzIgICAgICAgICAgICAgIDkwNApAQCAtODQwLDcgKzg1MCw2IEBAIGV4dGVybiB1bnNpZ25lZCBpbnQgX19tYWNoaW5lX2FyY2hfdHlwZTsKICNkZWZpbmUgTUFDSF9UWVBFX05WMTAwMCAgICAgICAgICAgICAgIDMyMTgKICNkZWZpbmUgTUFDSF9UWVBFX05VQzk1MFRTICAgICAgICAgICAgIDMyMTkKICNkZWZpbmUgTUFDSF9UWVBFX05PS0lBX1JNNjgwICAgICAgICAgIDMyMjAKLSNkZWZpbmUgTUFDSF9UWVBFX0FTVDIyMDAgICAgICAgICAgICAgIDMyMjEKICNkZWZpbmUgTUFDSF9UWVBFX0xFQUQgICAgICAgICAgICAgICAgIDMyMjIKICNkZWZpbmUgTUFDSF9UWVBFX1VOSU5PMSAgICAgICAgICAgICAgIDMyMjMKICNkZWZpbmUgTUFDSF9UWVBFX0dSRUVDTyAgICAgICAgICAgICAgIDMyMjQKQEAgLTMwNjMsNiArMzA3MiwxMjYgQEAgZXh0ZXJuIHVuc2lnbmVkIGludCBfX21hY2hpbmVfYXJjaF90eXBlOwogIyBkZWZpbmUgbWFjaGluZV9pc193ZzMwMnYyKCkJKDApCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19NQUNIX0FTVDExMDAKKyMgaWZkZWYgbWFjaGluZV9hcmNoX3R5cGUKKyMgIHVuZGVmIG1hY2hpbmVfYXJjaF90eXBlCisjICBkZWZpbmUgbWFjaGluZV9hcmNoX3R5cGUJX19tYWNoaW5lX2FyY2hfdHlwZQorIyBlbHNlCisjICBkZWZpbmUgbWFjaGluZV9hcmNoX3R5cGUJTUFDSF9UWVBFX0FTVDExMDAKKyMgZW5kaWYKKyMgZGVmaW5lIG1hY2hpbmVfaXNfYXN0MTEwMCgpCShtYWNoaW5lX2FyY2hfdHlwZSA9PSBNQUNIX1RZUEVfQVNUMTEwMCkKKyNlbHNlCisjIGRlZmluZSBtYWNoaW5lX2lzX2FzdDExMDAoKQkoMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01BQ0hfQVNUMjAwMAorIyBpZmRlZiBtYWNoaW5lX2FyY2hfdHlwZQorIyAgdW5kZWYgbWFjaGluZV9hcmNoX3R5cGUKKyMgIGRlZmluZSBtYWNoaW5lX2FyY2hfdHlwZQlfX21hY2hpbmVfYXJjaF90eXBlCisjIGVsc2UKKyMgIGRlZmluZSBtYWNoaW5lX2FyY2hfdHlwZQlNQUNIX1RZUEVfQVNUMjAwMAorIyBlbmRpZgorIyBkZWZpbmUgbWFjaGluZV9pc19hc3QyMDAwKCkJKG1hY2hpbmVfYXJjaF90eXBlID09IE1BQ0hfVFlQRV9BU1QyMDAwKQorI2Vsc2UKKyMgZGVmaW5lIG1hY2hpbmVfaXNfYXN0MjAwMCgpCSgwKQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUFDSF9BU1QyMTAwCisjIGlmZGVmIG1hY2hpbmVfYXJjaF90eXBlCisjICB1bmRlZiBtYWNoaW5lX2FyY2hfdHlwZQorIyAgZGVmaW5lIG1hY2hpbmVfYXJjaF90eXBlCV9fbWFjaGluZV9hcmNoX3R5cGUKKyMgZWxzZQorIyAgZGVmaW5lIG1hY2hpbmVfYXJjaF90eXBlCU1BQ0hfVFlQRV9BU1QyMTAwCisjIGVuZGlmCisjIGRlZmluZSBtYWNoaW5lX2lzX2FzdDIxMDAoKQkobWFjaGluZV9hcmNoX3R5cGUgPT0gTUFDSF9UWVBFX0FTVDIxMDApCisjZWxzZQorIyBkZWZpbmUgbWFjaGluZV9pc19hc3QyMTAwKCkJKDApCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NQUNIX0FTVDIxNTAKKyMgaWZkZWYgbWFjaGluZV9hcmNoX3R5cGUKKyMgIHVuZGVmIG1hY2hpbmVfYXJjaF90eXBlCisjICBkZWZpbmUgbWFjaGluZV9hcmNoX3R5cGUJX19tYWNoaW5lX2FyY2hfdHlwZQorIyBlbHNlCisjICBkZWZpbmUgbWFjaGluZV9hcmNoX3R5cGUJTUFDSF9UWVBFX0FTVDIxNTAKKyMgZW5kaWYKKyMgZGVmaW5lIG1hY2hpbmVfaXNfYXN0MjE1MCgpCShtYWNoaW5lX2FyY2hfdHlwZSA9PSBNQUNIX1RZUEVfQVNUMjE1MCkKKyNlbHNlCisjIGRlZmluZSBtYWNoaW5lX2lzX2FzdDIxNTAoKQkoMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01BQ0hfQVNUMjIwMAorIyBpZmRlZiBtYWNoaW5lX2FyY2hfdHlwZQorIyAgdW5kZWYgbWFjaGluZV9hcmNoX3R5cGUKKyMgIGRlZmluZSBtYWNoaW5lX2FyY2hfdHlwZQlfX21hY2hpbmVfYXJjaF90eXBlCisjIGVsc2UKKyMgIGRlZmluZSBtYWNoaW5lX2FyY2hfdHlwZQlNQUNIX1RZUEVfQVNUMjIwMAorIyBlbmRpZgorIyBkZWZpbmUgbWFjaGluZV9pc19hc3QyMjAwKCkJKG1hY2hpbmVfYXJjaF90eXBlID09IE1BQ0hfVFlQRV9BU1QyMjAwKQorI2Vsc2UKKyMgZGVmaW5lIG1hY2hpbmVfaXNfYXN0MjIwMCgpCSgwKQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUFDSF9BU1QyMzAwX0ZQR0FfMQorIyBpZmRlZiBtYWNoaW5lX2FyY2hfdHlwZQorIyAgdW5kZWYgbWFjaGluZV9hcmNoX3R5cGUKKyMgIGRlZmluZSBtYWNoaW5lX2FyY2hfdHlwZQlfX21hY2hpbmVfYXJjaF90eXBlCisjIGVsc2UKKyMgIGRlZmluZSBtYWNoaW5lX2FyY2hfdHlwZQlNQUNIX1RZUEVfQVNUMjMwMF9GUEdBXzEKKyMgZW5kaWYKKyMgZGVmaW5lIG1hY2hpbmVfaXNfYXN0MjMwMF9mcGdhXzEoKQkobWFjaGluZV9hcmNoX3R5cGUgPT0gTUFDSF9UWVBFX0FTVDIzMDBfRlBHQV8xKQorI2Vsc2UKKyMgZGVmaW5lIG1hY2hpbmVfaXNfYXN0MjMwMF9mcGdhXzEoKQkoMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01BQ0hfQVNUMjMwMF9GUEdBXzIKKyMgaWZkZWYgbWFjaGluZV9hcmNoX3R5cGUKKyMgIHVuZGVmIG1hY2hpbmVfYXJjaF90eXBlCisjICBkZWZpbmUgbWFjaGluZV9hcmNoX3R5cGUJX19tYWNoaW5lX2FyY2hfdHlwZQorIyBlbHNlCisjICBkZWZpbmUgbWFjaGluZV9hcmNoX3R5cGUJTUFDSF9UWVBFX0FTVDIzMDBfRlBHQV8yCisjIGVuZGlmCisjIGRlZmluZSBtYWNoaW5lX2lzX2FzdDIzMDBfZnBnYV8yKCkJKG1hY2hpbmVfYXJjaF90eXBlID09IE1BQ0hfVFlQRV9BU1QyMzAwX0ZQR0FfMikKKyNlbHNlCisjIGRlZmluZSBtYWNoaW5lX2lzX2FzdDIzMDBfZnBnYV8yKCkJKDApCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NQUNIX0FTVDMxMDAKKyMgaWZkZWYgbWFjaGluZV9hcmNoX3R5cGUKKyMgIHVuZGVmIG1hY2hpbmVfYXJjaF90eXBlCisjICBkZWZpbmUgbWFjaGluZV9hcmNoX3R5cGUJX19tYWNoaW5lX2FyY2hfdHlwZQorIyBlbHNlCisjICBkZWZpbmUgbWFjaGluZV9hcmNoX3R5cGUJTUFDSF9UWVBFX0FTVDMxMDAKKyMgZW5kaWYKKyMgZGVmaW5lIG1hY2hpbmVfaXNfYXN0MzEwMCgpCShtYWNoaW5lX2FyY2hfdHlwZSA9PSBNQUNIX1RZUEVfQVNUMzEwMCkKKyNlbHNlCisjIGRlZmluZSBtYWNoaW5lX2lzX2FzdDMxMDAoKQkoMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01BQ0hfQVNQRUVECisjIGlmZGVmIG1hY2hpbmVfYXJjaF90eXBlCisjICB1bmRlZiBtYWNoaW5lX2FyY2hfdHlwZQorIyAgZGVmaW5lIG1hY2hpbmVfYXJjaF90eXBlCV9fbWFjaGluZV9hcmNoX3R5cGUKKyMgZWxzZQorIyAgZGVmaW5lIG1hY2hpbmVfYXJjaF90eXBlCU1BQ0hfVFlQRV9BU1BFRUQKKyMgZW5kaWYKKyMgZGVmaW5lIG1hY2hpbmVfaXNfYXNwZWVkKCkJKG1hY2hpbmVfYXJjaF90eXBlID09IE1BQ0hfVFlQRV9BU1BFRUQpCisjZWxzZQorIyBkZWZpbmUgbWFjaGluZV9pc19hc3BlZWQoKQkoMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01BQ0hfQVNUMjMwMAorIyBpZmRlZiBtYWNoaW5lX2FyY2hfdHlwZQorIyAgdW5kZWYgbWFjaGluZV9hcmNoX3R5cGUKKyMgIGRlZmluZSBtYWNoaW5lX2FyY2hfdHlwZQlfX21hY2hpbmVfYXJjaF90eXBlCisjIGVsc2UKKyMgIGRlZmluZSBtYWNoaW5lX2FyY2hfdHlwZQlNQUNIX1RZUEVfQVNUMjMwMAorIyBlbmRpZgorIyBkZWZpbmUgbWFjaGluZV9pc19hc3QyMzAwKCkJKG1hY2hpbmVfYXJjaF90eXBlID09IE1BQ0hfVFlQRV9BU1QyMzAwKQorI2Vsc2UKKyMgZGVmaW5lIG1hY2hpbmVfaXNfYXN0MjMwMCgpCSgwKQorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfTUFDSF9PTUFQXzI0MzBTRFAKICMgaWZkZWYgbWFjaGluZV9hcmNoX3R5cGUKICMgIHVuZGVmIG1hY2hpbmVfYXJjaF90eXBlCkBAIC0xMTA0MywxOCArMTExNzIsNiBAQCBleHRlcm4gdW5zaWduZWQgaW50IF9fbWFjaGluZV9hcmNoX3R5cGU7CiAjIGRlZmluZSBtYWNoaW5lX2lzX25va2lhX3JtNjgwKCkJKDApCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19NQUNIX0FTVDIyMDAKLSMgaWZkZWYgbWFjaGluZV9hcmNoX3R5cGUKLSMgIHVuZGVmIG1hY2hpbmVfYXJjaF90eXBlCi0jICBkZWZpbmUgbWFjaGluZV9hcmNoX3R5cGUJX19tYWNoaW5lX2FyY2hfdHlwZQotIyBlbHNlCi0jICBkZWZpbmUgbWFjaGluZV9hcmNoX3R5cGUJTUFDSF9UWVBFX0FTVDIyMDAKLSMgZW5kaWYKLSMgZGVmaW5lIG1hY2hpbmVfaXNfYXN0MjIwMCgpCShtYWNoaW5lX2FyY2hfdHlwZSA9PSBNQUNIX1RZUEVfQVNUMjIwMCkKLSNlbHNlCi0jIGRlZmluZSBtYWNoaW5lX2lzX2FzdDIyMDAoKQkoMCkKLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX01BQ0hfTEVBRAogIyBpZmRlZiBtYWNoaW5lX2FyY2hfdHlwZQogIyAgdW5kZWYgbWFjaGluZV9hcmNoX3R5cGUKZGlmZiAtLWdpdCBhL2JvYXJkL2FzcGVlZC9hc3QyMzAwL01ha2VmaWxlIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzMDBlNgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL01ha2VmaWxlCkBAIC0wLDAgKzEsNDIgQEAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworQ09CSlMJPSBhc3QyMzAwLm8gZmxhc2gubyBmbGFzaF9zcGkubyBwY2kubyBjcmMzMi5vIHNsdC5vIHJlZ3Rlc3QubyB2ZnVuLm8gdmhhY2UubyBjcnQubyB2aWRlb3Rlc3QubyBtYWN0ZXN0Lm8gaGFjdGVzdC5vIG1pY3Rlc3QubworCitpZmRlZiBDT05GSUdfRlBHQV9BU1BFRUQKK1NPQkpTICAgOj0gcGxhdGZvcm1fZnBnYS5vCitlbHNlCitTT0JKUyAgIDo9IHBsYXRmb3JtLm8KK2VuZGlmCisKK1NSQ1MgICAgOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMgICAgOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorU09CSlMgICA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykpCisKKyQoTElCKTogJChvYmopLmRlcGVuZCAkKE9CSlMpICQoU09CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpICQoU09CSlMpCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrICQob2JqKS5kZXBlbmQKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjMwMC9hZXMuYyBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL2Flcy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYzMGFiOTkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hc3BlZWQvYXN0MjMwMC9hZXMuYwpAQCAtMCwwICsxLDU3MyBAQAorLyoKKyAqICBBRVMgaW1wbGVtZW50YXRpb24KKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKy8qIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gcnVuIHRoZSB0ZXN0IHN1aXRlICovCisKKy8qICNkZWZpbmUgVEVTVCAqLworCisvKiB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHVzZSBwcmUtY29tcHV0ZWQgdGFibGVzICovCisvKiBvdGhlcndpc2UgdGhlIHRhYmxlcyB3aWxsIGJlIGdlbmVyYXRlZCBhdCB0aGUgZmlyc3QgcnVuICovCisKKyNkZWZpbmUgRklYRURfVEFCTEVTCisKKyNpZm5kZWYgRklYRURfVEFCTEVTCisKKy8qIGZvcndhcmQgUy1ib3ggJiB0YWJsZXMgKi8KKwordWludDMyIEZTYlsyNTZdOwordWludDMyIEZUMFsyNTZdOyAKK3VpbnQzMiBGVDFbMjU2XTsgCit1aW50MzIgRlQyWzI1Nl07IAordWludDMyIEZUM1syNTZdOyAKKworLyogcmV2ZXJzZSBTLWJveCAmIHRhYmxlcyAqLworCit1aW50MzIgUlNiWzI1Nl07Cit1aW50MzIgUlQwWzI1Nl07Cit1aW50MzIgUlQxWzI1Nl07Cit1aW50MzIgUlQyWzI1Nl07Cit1aW50MzIgUlQzWzI1Nl07CisKKy8qIHJvdW5kIGNvbnN0YW50cyAqLworCit1aW50MzIgUkNPTlsxMF07CisKKy8qIHRhYmxlcyBnZW5lcmF0aW9uIGZsYWcgKi8KKworaW50IGRvX2luaXQgPSAxOworCisvKiB0YWJsZXMgZ2VuZXJhdGlvbiByb3V0aW5lICovCisKKyNkZWZpbmUgUk9UUjgoeCkgKCAoICggeCA8PCAyNCApICYgMHhGRkZGRkZGRiApIHwgXAorICAgICAgICAgICAgICAgICAgICggKCB4ICYgMHhGRkZGRkZGRiApID4+ICA4ICkgKQorCisjZGVmaW5lIFhUSU1FKHgpICggKCB4IDw8ICAxICkgXiAoICggeCAmIDB4ODAgKSA/IDB4MUIgOiAweDAwICkgKQorI2RlZmluZSBNVUwoeCx5KSAoICggeCAmJiAgeSApID8gcG93Wyhsb2dbeF0gKyBsb2dbeV0pICUgMjU1XSA6IDAgKQorCit2b2lkIGFlc19nZW5fdGFibGVzKCB2b2lkICkKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50OCB4LCB5OworICAgIHVpbnQ4IHBvd1syNTZdOworICAgIHVpbnQ4IGxvZ1syNTZdOworCisgICAgLyogY29tcHV0ZSBwb3cgYW5kIGxvZyB0YWJsZXMgb3ZlciBHRigyXjgpICovCisKKyAgICBmb3IoIGkgPSAwLCB4ID0gMTsgaSA8IDI1NjsgaSsrLCB4IF49IFhUSU1FKCB4ICkgKQorICAgIHsKKyAgICAgICAgcG93W2ldID0geDsKKyAgICAgICAgbG9nW3hdID0gaTsKKyAgICB9CisKKyAgICAvKiBjYWxjdWxhdGUgdGhlIHJvdW5kIGNvbnN0YW50cyAqLworCisgICAgZm9yKCBpID0gMCwgeCA9IDE7IGkgPCAxMDsgaSsrLCB4ID0gWFRJTUUoIHggKSApCisgICAgeworICAgICAgICBSQ09OW2ldID0gKHVpbnQzMikgeCA8PCAyNDsKKyAgICB9CisKKyAgICAvKiBnZW5lcmF0ZSB0aGUgZm9yd2FyZCBhbmQgcmV2ZXJzZSBTLWJveGVzICovCisKKyAgICBGU2JbMHgwMF0gPSAweDYzOworICAgIFJTYlsweDYzXSA9IDB4MDA7CisKKyAgICBmb3IoIGkgPSAxOyBpIDwgMjU2OyBpKysgKQorICAgIHsKKyAgICAgICAgeCA9IHBvd1syNTUgLSBsb2dbaV1dOworCisgICAgICAgIHkgPSB4OyAgeSA9ICggeSA8PCAxICkgfCAoIHkgPj4gNyApOworICAgICAgICB4IF49IHk7IHkgPSAoIHkgPDwgMSApIHwgKCB5ID4+IDcgKTsKKyAgICAgICAgeCBePSB5OyB5ID0gKCB5IDw8IDEgKSB8ICggeSA+PiA3ICk7CisgICAgICAgIHggXj0geTsgeSA9ICggeSA8PCAxICkgfCAoIHkgPj4gNyApOworICAgICAgICB4IF49IHkgXiAweDYzOworCisgICAgICAgIEZTYltpXSA9IHg7CisgICAgICAgIFJTYlt4XSA9IGk7CisgICAgfQorCisgICAgLyogZ2VuZXJhdGUgdGhlIGZvcndhcmQgYW5kIHJldmVyc2UgdGFibGVzICovCisKKyAgICBmb3IoIGkgPSAwOyBpIDwgMjU2OyBpKysgKQorICAgIHsKKyAgICAgICAgeCA9ICh1bnNpZ25lZCBjaGFyKSBGU2JbaV07IHkgPSBYVElNRSggeCApOworCisgICAgICAgIEZUMFtpXSA9ICAgKHVpbnQzMikgKCB4IF4geSApIF4KKyAgICAgICAgICAgICAgICAgKCAodWludDMyKSB4IDw8ICA4ICkgXgorICAgICAgICAgICAgICAgICAoICh1aW50MzIpIHggPDwgMTYgKSBeCisgICAgICAgICAgICAgICAgICggKHVpbnQzMikgeSA8PCAyNCApOworCisgICAgICAgIEZUMFtpXSAmPSAweEZGRkZGRkZGOworCisgICAgICAgIEZUMVtpXSA9IFJPVFI4KCBGVDBbaV0gKTsKKyAgICAgICAgRlQyW2ldID0gUk9UUjgoIEZUMVtpXSApOworICAgICAgICBGVDNbaV0gPSBST1RSOCggRlQyW2ldICk7CisKKyAgICAgICAgeSA9ICh1bnNpZ25lZCBjaGFyKSBSU2JbaV07CisKKyAgICAgICAgUlQwW2ldID0gKCAodWludDMyKSBNVUwoIDB4MEIsIHkgKSAgICAgICApIF4KKyAgICAgICAgICAgICAgICAgKCAodWludDMyKSBNVUwoIDB4MEQsIHkgKSA8PCAgOCApIF4KKyAgICAgICAgICAgICAgICAgKCAodWludDMyKSBNVUwoIDB4MDksIHkgKSA8PCAxNiApIF4KKyAgICAgICAgICAgICAgICAgKCAodWludDMyKSBNVUwoIDB4MEUsIHkgKSA8PCAyNCApOworCisgICAgICAgIFJUMFtpXSAmPSAweEZGRkZGRkZGOworCisgICAgICAgIFJUMVtpXSA9IFJPVFI4KCBSVDBbaV0gKTsKKyAgICAgICAgUlQyW2ldID0gUk9UUjgoIFJUMVtpXSApOworICAgICAgICBSVDNbaV0gPSBST1RSOCggUlQyW2ldICk7CisgICAgfQorfQorCisjZWxzZQorCisvKiBmb3J3YXJkIFMtYm94ICovCisKK3N0YXRpYyBjb25zdCB1aW50MzIgRlNiWzI1Nl0gPQoreworICAgIDB4NjMsIDB4N0MsIDB4NzcsIDB4N0IsIDB4RjIsIDB4NkIsIDB4NkYsIDB4QzUsCisgICAgMHgzMCwgMHgwMSwgMHg2NywgMHgyQiwgMHhGRSwgMHhENywgMHhBQiwgMHg3NiwKKyAgICAweENBLCAweDgyLCAweEM5LCAweDdELCAweEZBLCAweDU5LCAweDQ3LCAweEYwLAorICAgIDB4QUQsIDB4RDQsIDB4QTIsIDB4QUYsIDB4OUMsIDB4QTQsIDB4NzIsIDB4QzAsCisgICAgMHhCNywgMHhGRCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzRiwgMHhGNywgMHhDQywKKyAgICAweDM0LCAweEE1LCAweEU1LCAweEYxLCAweDcxLCAweEQ4LCAweDMxLCAweDE1LAorICAgIDB4MDQsIDB4QzcsIDB4MjMsIDB4QzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OUEsCisgICAgMHgwNywgMHgxMiwgMHg4MCwgMHhFMiwgMHhFQiwgMHgyNywgMHhCMiwgMHg3NSwKKyAgICAweDA5LCAweDgzLCAweDJDLCAweDFBLCAweDFCLCAweDZFLCAweDVBLCAweEEwLAorICAgIDB4NTIsIDB4M0IsIDB4RDYsIDB4QjMsIDB4MjksIDB4RTMsIDB4MkYsIDB4ODQsCisgICAgMHg1MywgMHhEMSwgMHgwMCwgMHhFRCwgMHgyMCwgMHhGQywgMHhCMSwgMHg1QiwKKyAgICAweDZBLCAweENCLCAweEJFLCAweDM5LCAweDRBLCAweDRDLCAweDU4LCAweENGLAorICAgIDB4RDAsIDB4RUYsIDB4QUEsIDB4RkIsIDB4NDMsIDB4NEQsIDB4MzMsIDB4ODUsCisgICAgMHg0NSwgMHhGOSwgMHgwMiwgMHg3RiwgMHg1MCwgMHgzQywgMHg5RiwgMHhBOCwKKyAgICAweDUxLCAweEEzLCAweDQwLCAweDhGLCAweDkyLCAweDlELCAweDM4LCAweEY1LAorICAgIDB4QkMsIDB4QjYsIDB4REEsIDB4MjEsIDB4MTAsIDB4RkYsIDB4RjMsIDB4RDIsCisgICAgMHhDRCwgMHgwQywgMHgxMywgMHhFQywgMHg1RiwgMHg5NywgMHg0NCwgMHgxNywKKyAgICAweEM0LCAweEE3LCAweDdFLCAweDNELCAweDY0LCAweDVELCAweDE5LCAweDczLAorICAgIDB4NjAsIDB4ODEsIDB4NEYsIDB4REMsIDB4MjIsIDB4MkEsIDB4OTAsIDB4ODgsCisgICAgMHg0NiwgMHhFRSwgMHhCOCwgMHgxNCwgMHhERSwgMHg1RSwgMHgwQiwgMHhEQiwKKyAgICAweEUwLCAweDMyLCAweDNBLCAweDBBLCAweDQ5LCAweDA2LCAweDI0LCAweDVDLAorICAgIDB4QzIsIDB4RDMsIDB4QUMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4RTQsIDB4NzksCisgICAgMHhFNywgMHhDOCwgMHgzNywgMHg2RCwgMHg4RCwgMHhENSwgMHg0RSwgMHhBOSwKKyAgICAweDZDLCAweDU2LCAweEY0LCAweEVBLCAweDY1LCAweDdBLCAweEFFLCAweDA4LAorICAgIDB4QkEsIDB4NzgsIDB4MjUsIDB4MkUsIDB4MUMsIDB4QTYsIDB4QjQsIDB4QzYsCisgICAgMHhFOCwgMHhERCwgMHg3NCwgMHgxRiwgMHg0QiwgMHhCRCwgMHg4QiwgMHg4QSwKKyAgICAweDcwLCAweDNFLCAweEI1LCAweDY2LCAweDQ4LCAweDAzLCAweEY2LCAweDBFLAorICAgIDB4NjEsIDB4MzUsIDB4NTcsIDB4QjksIDB4ODYsIDB4QzEsIDB4MUQsIDB4OUUsCisgICAgMHhFMSwgMHhGOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhEOSwgMHg4RSwgMHg5NCwKKyAgICAweDlCLCAweDFFLCAweDg3LCAweEU5LCAweENFLCAweDU1LCAweDI4LCAweERGLAorICAgIDB4OEMsIDB4QTEsIDB4ODksIDB4MEQsIDB4QkYsIDB4RTYsIDB4NDIsIDB4NjgsCisgICAgMHg0MSwgMHg5OSwgMHgyRCwgMHgwRiwgMHhCMCwgMHg1NCwgMHhCQiwgMHgxNgorfTsKKworLyogZm9yd2FyZCB0YWJsZXMgKi8KKworI2RlZmluZSBGVCBcCitcCisgICAgVihDNiw2Myw2MyxBNSksIFYoRjgsN0MsN0MsODQpLCBWKEVFLDc3LDc3LDk5KSwgVihGNiw3Qiw3Qiw4RCksIFwKKyAgICBWKEZGLEYyLEYyLDBEKSwgVihENiw2Qiw2QixCRCksIFYoREUsNkYsNkYsQjEpLCBWKDkxLEM1LEM1LDU0KSwgXAorICAgIFYoNjAsMzAsMzAsNTApLCBWKDAyLDAxLDAxLDAzKSwgVihDRSw2Nyw2NyxBOSksIFYoNTYsMkIsMkIsN0QpLCBcCisgICAgVihFNyxGRSxGRSwxOSksIFYoQjUsRDcsRDcsNjIpLCBWKDRELEFCLEFCLEU2KSwgVihFQyw3Niw3Niw5QSksIFwKKyAgICBWKDhGLENBLENBLDQ1KSwgVigxRiw4Miw4Miw5RCksIFYoODksQzksQzksNDApLCBWKEZBLDdELDdELDg3KSwgXAorICAgIFYoRUYsRkEsRkEsMTUpLCBWKEIyLDU5LDU5LEVCKSwgVig4RSw0Nyw0NyxDOSksIFYoRkIsRjAsRjAsMEIpLCBcCisgICAgVig0MSxBRCxBRCxFQyksIFYoQjMsRDQsRDQsNjcpLCBWKDVGLEEyLEEyLEZEKSwgVig0NSxBRixBRixFQSksIFwKKyAgICBWKDIzLDlDLDlDLEJGKSwgVig1MyxBNCxBNCxGNyksIFYoRTQsNzIsNzIsOTYpLCBWKDlCLEMwLEMwLDVCKSwgXAorICAgIFYoNzUsQjcsQjcsQzIpLCBWKEUxLEZELEZELDFDKSwgVigzRCw5Myw5MyxBRSksIFYoNEMsMjYsMjYsNkEpLCBcCisgICAgVig2QywzNiwzNiw1QSksIFYoN0UsM0YsM0YsNDEpLCBWKEY1LEY3LEY3LDAyKSwgVig4MyxDQyxDQyw0RiksIFwKKyAgICBWKDY4LDM0LDM0LDVDKSwgVig1MSxBNSxBNSxGNCksIFYoRDEsRTUsRTUsMzQpLCBWKEY5LEYxLEYxLDA4KSwgXAorICAgIFYoRTIsNzEsNzEsOTMpLCBWKEFCLEQ4LEQ4LDczKSwgVig2MiwzMSwzMSw1MyksIFYoMkEsMTUsMTUsM0YpLCBcCisgICAgVigwOCwwNCwwNCwwQyksIFYoOTUsQzcsQzcsNTIpLCBWKDQ2LDIzLDIzLDY1KSwgVig5RCxDMyxDMyw1RSksIFwKKyAgICBWKDMwLDE4LDE4LDI4KSwgVigzNyw5Niw5NixBMSksIFYoMEEsMDUsMDUsMEYpLCBWKDJGLDlBLDlBLEI1KSwgXAorICAgIFYoMEUsMDcsMDcsMDkpLCBWKDI0LDEyLDEyLDM2KSwgVigxQiw4MCw4MCw5QiksIFYoREYsRTIsRTIsM0QpLCBcCisgICAgVihDRCxFQixFQiwyNiksIFYoNEUsMjcsMjcsNjkpLCBWKDdGLEIyLEIyLENEKSwgVihFQSw3NSw3NSw5RiksIFwKKyAgICBWKDEyLDA5LDA5LDFCKSwgVigxRCw4Myw4Myw5RSksIFYoNTgsMkMsMkMsNzQpLCBWKDM0LDFBLDFBLDJFKSwgXAorICAgIFYoMzYsMUIsMUIsMkQpLCBWKERDLDZFLDZFLEIyKSwgVihCNCw1QSw1QSxFRSksIFYoNUIsQTAsQTAsRkIpLCBcCisgICAgVihBNCw1Miw1MixGNiksIFYoNzYsM0IsM0IsNEQpLCBWKEI3LEQ2LEQ2LDYxKSwgVig3RCxCMyxCMyxDRSksIFwKKyAgICBWKDUyLDI5LDI5LDdCKSwgVihERCxFMyxFMywzRSksIFYoNUUsMkYsMkYsNzEpLCBWKDEzLDg0LDg0LDk3KSwgXAorICAgIFYoQTYsNTMsNTMsRjUpLCBWKEI5LEQxLEQxLDY4KSwgVigwMCwwMCwwMCwwMCksIFYoQzEsRUQsRUQsMkMpLCBcCisgICAgVig0MCwyMCwyMCw2MCksIFYoRTMsRkMsRkMsMUYpLCBWKDc5LEIxLEIxLEM4KSwgVihCNiw1Qiw1QixFRCksIFwKKyAgICBWKEQ0LDZBLDZBLEJFKSwgVig4RCxDQixDQiw0NiksIFYoNjcsQkUsQkUsRDkpLCBWKDcyLDM5LDM5LDRCKSwgXAorICAgIFYoOTQsNEEsNEEsREUpLCBWKDk4LDRDLDRDLEQ0KSwgVihCMCw1OCw1OCxFOCksIFYoODUsQ0YsQ0YsNEEpLCBcCisgICAgVihCQixEMCxEMCw2QiksIFYoQzUsRUYsRUYsMkEpLCBWKDRGLEFBLEFBLEU1KSwgVihFRCxGQixGQiwxNiksIFwKKyAgICBWKDg2LDQzLDQzLEM1KSwgVig5QSw0RCw0RCxENyksIFYoNjYsMzMsMzMsNTUpLCBWKDExLDg1LDg1LDk0KSwgXAorICAgIFYoOEEsNDUsNDUsQ0YpLCBWKEU5LEY5LEY5LDEwKSwgVigwNCwwMiwwMiwwNiksIFYoRkUsN0YsN0YsODEpLCBcCisgICAgVihBMCw1MCw1MCxGMCksIFYoNzgsM0MsM0MsNDQpLCBWKDI1LDlGLDlGLEJBKSwgVig0QixBOCxBOCxFMyksIFwKKyAgICBWKEEyLDUxLDUxLEYzKSwgVig1RCxBMyxBMyxGRSksIFYoODAsNDAsNDAsQzApLCBWKDA1LDhGLDhGLDhBKSwgXAorICAgIFYoM0YsOTIsOTIsQUQpLCBWKDIxLDlELDlELEJDKSwgVig3MCwzOCwzOCw0OCksIFYoRjEsRjUsRjUsMDQpLCBcCisgICAgVig2MyxCQyxCQyxERiksIFYoNzcsQjYsQjYsQzEpLCBWKEFGLERBLERBLDc1KSwgVig0MiwyMSwyMSw2MyksIFwKKyAgICBWKDIwLDEwLDEwLDMwKSwgVihFNSxGRixGRiwxQSksIFYoRkQsRjMsRjMsMEUpLCBWKEJGLEQyLEQyLDZEKSwgXAorICAgIFYoODEsQ0QsQ0QsNEMpLCBWKDE4LDBDLDBDLDE0KSwgVigyNiwxMywxMywzNSksIFYoQzMsRUMsRUMsMkYpLCBcCisgICAgVihCRSw1Riw1RixFMSksIFYoMzUsOTcsOTcsQTIpLCBWKDg4LDQ0LDQ0LENDKSwgVigyRSwxNywxNywzOSksIFwKKyAgICBWKDkzLEM0LEM0LDU3KSwgVig1NSxBNyxBNyxGMiksIFYoRkMsN0UsN0UsODIpLCBWKDdBLDNELDNELDQ3KSwgXAorICAgIFYoQzgsNjQsNjQsQUMpLCBWKEJBLDVELDVELEU3KSwgVigzMiwxOSwxOSwyQiksIFYoRTYsNzMsNzMsOTUpLCBcCisgICAgVihDMCw2MCw2MCxBMCksIFYoMTksODEsODEsOTgpLCBWKDlFLDRGLDRGLEQxKSwgVihBMyxEQyxEQyw3RiksIFwKKyAgICBWKDQ0LDIyLDIyLDY2KSwgVig1NCwyQSwyQSw3RSksIFYoM0IsOTAsOTAsQUIpLCBWKDBCLDg4LDg4LDgzKSwgXAorICAgIFYoOEMsNDYsNDYsQ0EpLCBWKEM3LEVFLEVFLDI5KSwgVig2QixCOCxCOCxEMyksIFYoMjgsMTQsMTQsM0MpLCBcCisgICAgVihBNyxERSxERSw3OSksIFYoQkMsNUUsNUUsRTIpLCBWKDE2LDBCLDBCLDFEKSwgVihBRCxEQixEQiw3NiksIFwKKyAgICBWKERCLEUwLEUwLDNCKSwgVig2NCwzMiwzMiw1NiksIFYoNzQsM0EsM0EsNEUpLCBWKDE0LDBBLDBBLDFFKSwgXAorICAgIFYoOTIsNDksNDksREIpLCBWKDBDLDA2LDA2LDBBKSwgVig0OCwyNCwyNCw2QyksIFYoQjgsNUMsNUMsRTQpLCBcCisgICAgVig5RixDMixDMiw1RCksIFYoQkQsRDMsRDMsNkUpLCBWKDQzLEFDLEFDLEVGKSwgVihDNCw2Miw2MixBNiksIFwKKyAgICBWKDM5LDkxLDkxLEE4KSwgVigzMSw5NSw5NSxBNCksIFYoRDMsRTQsRTQsMzcpLCBWKEYyLDc5LDc5LDhCKSwgXAorICAgIFYoRDUsRTcsRTcsMzIpLCBWKDhCLEM4LEM4LDQzKSwgVig2RSwzNywzNyw1OSksIFYoREEsNkQsNkQsQjcpLCBcCisgICAgVigwMSw4RCw4RCw4QyksIFYoQjEsRDUsRDUsNjQpLCBWKDlDLDRFLDRFLEQyKSwgVig0OSxBOSxBOSxFMCksIFwKKyAgICBWKEQ4LDZDLDZDLEI0KSwgVihBQyw1Niw1NixGQSksIFYoRjMsRjQsRjQsMDcpLCBWKENGLEVBLEVBLDI1KSwgXAorICAgIFYoQ0EsNjUsNjUsQUYpLCBWKEY0LDdBLDdBLDhFKSwgVig0NyxBRSxBRSxFOSksIFYoMTAsMDgsMDgsMTgpLCBcCisgICAgVig2RixCQSxCQSxENSksIFYoRjAsNzgsNzgsODgpLCBWKDRBLDI1LDI1LDZGKSwgVig1QywyRSwyRSw3MiksIFwKKyAgICBWKDM4LDFDLDFDLDI0KSwgVig1NyxBNixBNixGMSksIFYoNzMsQjQsQjQsQzcpLCBWKDk3LEM2LEM2LDUxKSwgXAorICAgIFYoQ0IsRTgsRTgsMjMpLCBWKEExLERELERELDdDKSwgVihFOCw3NCw3NCw5QyksIFYoM0UsMUYsMUYsMjEpLCBcCisgICAgVig5Niw0Qiw0QixERCksIFYoNjEsQkQsQkQsREMpLCBWKDBELDhCLDhCLDg2KSwgVigwRiw4QSw4QSw4NSksIFwKKyAgICBWKEUwLDcwLDcwLDkwKSwgVig3QywzRSwzRSw0MiksIFYoNzEsQjUsQjUsQzQpLCBWKENDLDY2LDY2LEFBKSwgXAorICAgIFYoOTAsNDgsNDgsRDgpLCBWKDA2LDAzLDAzLDA1KSwgVihGNyxGNixGNiwwMSksIFYoMUMsMEUsMEUsMTIpLCBcCisgICAgVihDMiw2MSw2MSxBMyksIFYoNkEsMzUsMzUsNUYpLCBWKEFFLDU3LDU3LEY5KSwgVig2OSxCOSxCOSxEMCksIFwKKyAgICBWKDE3LDg2LDg2LDkxKSwgVig5OSxDMSxDMSw1OCksIFYoM0EsMUQsMUQsMjcpLCBWKDI3LDlFLDlFLEI5KSwgXAorICAgIFYoRDksRTEsRTEsMzgpLCBWKEVCLEY4LEY4LDEzKSwgVigyQiw5OCw5OCxCMyksIFYoMjIsMTEsMTEsMzMpLCBcCisgICAgVihEMiw2OSw2OSxCQiksIFYoQTksRDksRDksNzApLCBWKDA3LDhFLDhFLDg5KSwgVigzMyw5NCw5NCxBNyksIFwKKyAgICBWKDJELDlCLDlCLEI2KSwgVigzQywxRSwxRSwyMiksIFYoMTUsODcsODcsOTIpLCBWKEM5LEU5LEU5LDIwKSwgXAorICAgIFYoODcsQ0UsQ0UsNDkpLCBWKEFBLDU1LDU1LEZGKSwgVig1MCwyOCwyOCw3OCksIFYoQTUsREYsREYsN0EpLCBcCisgICAgVigwMyw4Qyw4Qyw4RiksIFYoNTksQTEsQTEsRjgpLCBWKDA5LDg5LDg5LDgwKSwgVigxQSwwRCwwRCwxNyksIFwKKyAgICBWKDY1LEJGLEJGLERBKSwgVihENyxFNixFNiwzMSksIFYoODQsNDIsNDIsQzYpLCBWKEQwLDY4LDY4LEI4KSwgXAorICAgIFYoODIsNDEsNDEsQzMpLCBWKDI5LDk5LDk5LEIwKSwgVig1QSwyRCwyRCw3NyksIFYoMUUsMEYsMEYsMTEpLCBcCisgICAgVig3QixCMCxCMCxDQiksIFYoQTgsNTQsNTQsRkMpLCBWKDZELEJCLEJCLEQ2KSwgVigyQywxNiwxNiwzQSkKKworI2RlZmluZSBWKGEsYixjLGQpIDB4IyNhIyNiIyNjIyNkCitzdGF0aWMgY29uc3QgdWludDMyIEZUMFsyNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI2RlZmluZSBWKGEsYixjLGQpIDB4IyNkIyNhIyNiIyNjCitzdGF0aWMgY29uc3QgdWludDMyIEZUMVsyNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI2RlZmluZSBWKGEsYixjLGQpIDB4IyNjIyNkIyNhIyNiCitzdGF0aWMgY29uc3QgdWludDMyIEZUMlsyNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI2RlZmluZSBWKGEsYixjLGQpIDB4IyNiIyNjIyNkIyNhCitzdGF0aWMgY29uc3QgdWludDMyIEZUM1syNTZdID0geyBGVCB9OworI3VuZGVmIFYKKworI3VuZGVmIEZUCisKKy8qIHJldmVyc2UgUy1ib3ggKi8KKworc3RhdGljIGNvbnN0IHVpbnQzMiBSU2JbMjU2XSA9Cit7CisgICAgMHg1MiwgMHgwOSwgMHg2QSwgMHhENSwgMHgzMCwgMHgzNiwgMHhBNSwgMHgzOCwKKyAgICAweEJGLCAweDQwLCAweEEzLCAweDlFLCAweDgxLCAweEYzLCAweEQ3LCAweEZCLAorICAgIDB4N0MsIDB4RTMsIDB4MzksIDB4ODIsIDB4OUIsIDB4MkYsIDB4RkYsIDB4ODcsCisgICAgMHgzNCwgMHg4RSwgMHg0MywgMHg0NCwgMHhDNCwgMHhERSwgMHhFOSwgMHhDQiwKKyAgICAweDU0LCAweDdCLCAweDk0LCAweDMyLCAweEE2LCAweEMyLCAweDIzLCAweDNELAorICAgIDB4RUUsIDB4NEMsIDB4OTUsIDB4MEIsIDB4NDIsIDB4RkEsIDB4QzMsIDB4NEUsCisgICAgMHgwOCwgMHgyRSwgMHhBMSwgMHg2NiwgMHgyOCwgMHhEOSwgMHgyNCwgMHhCMiwKKyAgICAweDc2LCAweDVCLCAweEEyLCAweDQ5LCAweDZELCAweDhCLCAweEQxLCAweDI1LAorICAgIDB4NzIsIDB4RjgsIDB4RjYsIDB4NjQsIDB4ODYsIDB4NjgsIDB4OTgsIDB4MTYsCisgICAgMHhENCwgMHhBNCwgMHg1QywgMHhDQywgMHg1RCwgMHg2NSwgMHhCNiwgMHg5MiwKKyAgICAweDZDLCAweDcwLCAweDQ4LCAweDUwLCAweEZELCAweEVELCAweEI5LCAweERBLAorICAgIDB4NUUsIDB4MTUsIDB4NDYsIDB4NTcsIDB4QTcsIDB4OEQsIDB4OUQsIDB4ODQsCisgICAgMHg5MCwgMHhEOCwgMHhBQiwgMHgwMCwgMHg4QywgMHhCQywgMHhEMywgMHgwQSwKKyAgICAweEY3LCAweEU0LCAweDU4LCAweDA1LCAweEI4LCAweEIzLCAweDQ1LCAweDA2LAorICAgIDB4RDAsIDB4MkMsIDB4MUUsIDB4OEYsIDB4Q0EsIDB4M0YsIDB4MEYsIDB4MDIsCisgICAgMHhDMSwgMHhBRiwgMHhCRCwgMHgwMywgMHgwMSwgMHgxMywgMHg4QSwgMHg2QiwKKyAgICAweDNBLCAweDkxLCAweDExLCAweDQxLCAweDRGLCAweDY3LCAweERDLCAweEVBLAorICAgIDB4OTcsIDB4RjIsIDB4Q0YsIDB4Q0UsIDB4RjAsIDB4QjQsIDB4RTYsIDB4NzMsCisgICAgMHg5NiwgMHhBQywgMHg3NCwgMHgyMiwgMHhFNywgMHhBRCwgMHgzNSwgMHg4NSwKKyAgICAweEUyLCAweEY5LCAweDM3LCAweEU4LCAweDFDLCAweDc1LCAweERGLCAweDZFLAorICAgIDB4NDcsIDB4RjEsIDB4MUEsIDB4NzEsIDB4MUQsIDB4MjksIDB4QzUsIDB4ODksCisgICAgMHg2RiwgMHhCNywgMHg2MiwgMHgwRSwgMHhBQSwgMHgxOCwgMHhCRSwgMHgxQiwKKyAgICAweEZDLCAweDU2LCAweDNFLCAweDRCLCAweEM2LCAweEQyLCAweDc5LCAweDIwLAorICAgIDB4OUEsIDB4REIsIDB4QzAsIDB4RkUsIDB4NzgsIDB4Q0QsIDB4NUEsIDB4RjQsCisgICAgMHgxRiwgMHhERCwgMHhBOCwgMHgzMywgMHg4OCwgMHgwNywgMHhDNywgMHgzMSwKKyAgICAweEIxLCAweDEyLCAweDEwLCAweDU5LCAweDI3LCAweDgwLCAweEVDLCAweDVGLAorICAgIDB4NjAsIDB4NTEsIDB4N0YsIDB4QTksIDB4MTksIDB4QjUsIDB4NEEsIDB4MEQsCisgICAgMHgyRCwgMHhFNSwgMHg3QSwgMHg5RiwgMHg5MywgMHhDOSwgMHg5QywgMHhFRiwKKyAgICAweEEwLCAweEUwLCAweDNCLCAweDRELCAweEFFLCAweDJBLCAweEY1LCAweEIwLAorICAgIDB4QzgsIDB4RUIsIDB4QkIsIDB4M0MsIDB4ODMsIDB4NTMsIDB4OTksIDB4NjEsCisgICAgMHgxNywgMHgyQiwgMHgwNCwgMHg3RSwgMHhCQSwgMHg3NywgMHhENiwgMHgyNiwKKyAgICAweEUxLCAweDY5LCAweDE0LCAweDYzLCAweDU1LCAweDIxLCAweDBDLCAweDdECit9OworCisvKiByZXZlcnNlIHRhYmxlcyAqLworCisjZGVmaW5lIFJUIFwKK1wKKyAgICBWKDUxLEY0LEE3LDUwKSwgVig3RSw0MSw2NSw1MyksIFYoMUEsMTcsQTQsQzMpLCBWKDNBLDI3LDVFLDk2KSwgXAorICAgIFYoM0IsQUIsNkIsQ0IpLCBWKDFGLDlELDQ1LEYxKSwgVihBQyxGQSw1OCxBQiksIFYoNEIsRTMsMDMsOTMpLCBcCisgICAgVigyMCwzMCxGQSw1NSksIFYoQUQsNzYsNkQsRjYpLCBWKDg4LENDLDc2LDkxKSwgVihGNSwwMiw0QywyNSksIFwKKyAgICBWKDRGLEU1LEQ3LEZDKSwgVihDNSwyQSxDQixENyksIFYoMjYsMzUsNDQsODApLCBWKEI1LDYyLEEzLDhGKSwgXAorICAgIFYoREUsQjEsNUEsNDkpLCBWKDI1LEJBLDFCLDY3KSwgVig0NSxFQSwwRSw5OCksIFYoNUQsRkUsQzAsRTEpLCBcCisgICAgVihDMywyRiw3NSwwMiksIFYoODEsNEMsRjAsMTIpLCBWKDhELDQ2LDk3LEEzKSwgVig2QixEMyxGOSxDNiksIFwKKyAgICBWKDAzLDhGLDVGLEU3KSwgVigxNSw5Miw5Qyw5NSksIFYoQkYsNkQsN0EsRUIpLCBWKDk1LDUyLDU5LERBKSwgXAorICAgIFYoRDQsQkUsODMsMkQpLCBWKDU4LDc0LDIxLEQzKSwgVig0OSxFMCw2OSwyOSksIFYoOEUsQzksQzgsNDQpLCBcCisgICAgVig3NSxDMiw4OSw2QSksIFYoRjQsOEUsNzksNzgpLCBWKDk5LDU4LDNFLDZCKSwgVigyNyxCOSw3MSxERCksIFwKKyAgICBWKEJFLEUxLDRGLEI2KSwgVihGMCw4OCxBRCwxNyksIFYoQzksMjAsQUMsNjYpLCBWKDdELENFLDNBLEI0KSwgXAorICAgIFYoNjMsREYsNEEsMTgpLCBWKEU1LDFBLDMxLDgyKSwgVig5Nyw1MSwzMyw2MCksIFYoNjIsNTMsN0YsNDUpLCBcCisgICAgVihCMSw2NCw3NyxFMCksIFYoQkIsNkIsQUUsODQpLCBWKEZFLDgxLEEwLDFDKSwgVihGOSwwOCwyQiw5NCksIFwKKyAgICBWKDcwLDQ4LDY4LDU4KSwgVig4Riw0NSxGRCwxOSksIFYoOTQsREUsNkMsODcpLCBWKDUyLDdCLEY4LEI3KSwgXAorICAgIFYoQUIsNzMsRDMsMjMpLCBWKDcyLDRCLDAyLEUyKSwgVihFMywxRiw4Riw1NyksIFYoNjYsNTUsQUIsMkEpLCBcCisgICAgVihCMixFQiwyOCwwNyksIFYoMkYsQjUsQzIsMDMpLCBWKDg2LEM1LDdCLDlBKSwgVihEMywzNywwOCxBNSksIFwKKyAgICBWKDMwLDI4LDg3LEYyKSwgVigyMyxCRixBNSxCMiksIFYoMDIsMDMsNkEsQkEpLCBWKEVELDE2LDgyLDVDKSwgXAorICAgIFYoOEEsQ0YsMUMsMkIpLCBWKEE3LDc5LEI0LDkyKSwgVihGMywwNyxGMixGMCksIFYoNEUsNjksRTIsQTEpLCBcCisgICAgVig2NSxEQSxGNCxDRCksIFYoMDYsMDUsQkUsRDUpLCBWKEQxLDM0LDYyLDFGKSwgVihDNCxBNixGRSw4QSksIFwKKyAgICBWKDM0LDJFLDUzLDlEKSwgVihBMixGMyw1NSxBMCksIFYoMDUsOEEsRTEsMzIpLCBWKEE0LEY2LEVCLDc1KSwgXAorICAgIFYoMEIsODMsRUMsMzkpLCBWKDQwLDYwLEVGLEFBKSwgVig1RSw3MSw5RiwwNiksIFYoQkQsNkUsMTAsNTEpLCBcCisgICAgVigzRSwyMSw4QSxGOSksIFYoOTYsREQsMDYsM0QpLCBWKERELDNFLDA1LEFFKSwgVig0RCxFNixCRCw0NiksIFwKKyAgICBWKDkxLDU0LDhELEI1KSwgVig3MSxDNCw1RCwwNSksIFYoMDQsMDYsRDQsNkYpLCBWKDYwLDUwLDE1LEZGKSwgXAorICAgIFYoMTksOTgsRkIsMjQpLCBWKEQ2LEJELEU5LDk3KSwgVig4OSw0MCw0MyxDQyksIFYoNjcsRDksOUUsNzcpLCBcCisgICAgVihCMCxFOCw0MixCRCksIFYoMDcsODksOEIsODgpLCBWKEU3LDE5LDVCLDM4KSwgVig3OSxDOCxFRSxEQiksIFwKKyAgICBWKEExLDdDLDBBLDQ3KSwgVig3Qyw0MiwwRixFOSksIFYoRjgsODQsMUUsQzkpLCBWKDAwLDAwLDAwLDAwKSwgXAorICAgIFYoMDksODAsODYsODMpLCBWKDMyLDJCLEVELDQ4KSwgVigxRSwxMSw3MCxBQyksIFYoNkMsNUEsNzIsNEUpLCBcCisgICAgVihGRCwwRSxGRixGQiksIFYoMEYsODUsMzgsNTYpLCBWKDNELEFFLEQ1LDFFKSwgVigzNiwyRCwzOSwyNyksIFwKKyAgICBWKDBBLDBGLEQ5LDY0KSwgVig2OCw1QyxBNiwyMSksIFYoOUIsNUIsNTQsRDEpLCBWKDI0LDM2LDJFLDNBKSwgXAorICAgIFYoMEMsMEEsNjcsQjEpLCBWKDkzLDU3LEU3LDBGKSwgVihCNCxFRSw5NixEMiksIFYoMUIsOUIsOTEsOUUpLCBcCisgICAgVig4MCxDMCxDNSw0RiksIFYoNjEsREMsMjAsQTIpLCBWKDVBLDc3LDRCLDY5KSwgVigxQywxMiwxQSwxNiksIFwKKyAgICBWKEUyLDkzLEJBLDBBKSwgVihDMCxBMCwyQSxFNSksIFYoM0MsMjIsRTAsNDMpLCBWKDEyLDFCLDE3LDFEKSwgXAorICAgIFYoMEUsMDksMEQsMEIpLCBWKEYyLDhCLEM3LEFEKSwgVigyRCxCNixBOCxCOSksIFYoMTQsMUUsQTksQzgpLCBcCisgICAgVig1NyxGMSwxOSw4NSksIFYoQUYsNzUsMDcsNEMpLCBWKEVFLDk5LERELEJCKSwgVihBMyw3Riw2MCxGRCksIFwKKyAgICBWKEY3LDAxLDI2LDlGKSwgVig1Qyw3MixGNSxCQyksIFYoNDQsNjYsM0IsQzUpLCBWKDVCLEZCLDdFLDM0KSwgXAorICAgIFYoOEIsNDMsMjksNzYpLCBWKENCLDIzLEM2LERDKSwgVihCNixFRCxGQyw2OCksIFYoQjgsRTQsRjEsNjMpLCBcCisgICAgVihENywzMSxEQyxDQSksIFYoNDIsNjMsODUsMTApLCBWKDEzLDk3LDIyLDQwKSwgVig4NCxDNiwxMSwyMCksIFwKKyAgICBWKDg1LDRBLDI0LDdEKSwgVihEMixCQiwzRCxGOCksIFYoQUUsRjksMzIsMTEpLCBWKEM3LDI5LEExLDZEKSwgXAorICAgIFYoMUQsOUUsMkYsNEIpLCBWKERDLEIyLDMwLEYzKSwgVigwRCw4Niw1MixFQyksIFYoNzcsQzEsRTMsRDApLCBcCisgICAgVigyQixCMywxNiw2QyksIFYoQTksNzAsQjksOTkpLCBWKDExLDk0LDQ4LEZBKSwgVig0NyxFOSw2NCwyMiksIFwKKyAgICBWKEE4LEZDLDhDLEM0KSwgVihBMCxGMCwzRiwxQSksIFYoNTYsN0QsMkMsRDgpLCBWKDIyLDMzLDkwLEVGKSwgXAorICAgIFYoODcsNDksNEUsQzcpLCBWKEQ5LDM4LEQxLEMxKSwgVig4QyxDQSxBMixGRSksIFYoOTgsRDQsMEIsMzYpLCBcCisgICAgVihBNixGNSw4MSxDRiksIFYoQTUsN0EsREUsMjgpLCBWKERBLEI3LDhFLDI2KSwgVigzRixBRCxCRixBNCksIFwKKyAgICBWKDJDLDNBLDlELEU0KSwgVig1MCw3OCw5MiwwRCksIFYoNkEsNUYsQ0MsOUIpLCBWKDU0LDdFLDQ2LDYyKSwgXAorICAgIFYoRjYsOEQsMTMsQzIpLCBWKDkwLEQ4LEI4LEU4KSwgVigyRSwzOSxGNyw1RSksIFYoODIsQzMsQUYsRjUpLCBcCisgICAgVig5Riw1RCw4MCxCRSksIFYoNjksRDAsOTMsN0MpLCBWKDZGLEQ1LDJELEE5KSwgVihDRiwyNSwxMixCMyksIFwKKyAgICBWKEM4LEFDLDk5LDNCKSwgVigxMCwxOCw3RCxBNyksIFYoRTgsOUMsNjMsNkUpLCBWKERCLDNCLEJCLDdCKSwgXAorICAgIFYoQ0QsMjYsNzgsMDkpLCBWKDZFLDU5LDE4LEY0KSwgVihFQyw5QSxCNywwMSksIFYoODMsNEYsOUEsQTgpLCBcCisgICAgVihFNiw5NSw2RSw2NSksIFYoQUEsRkYsRTYsN0UpLCBWKDIxLEJDLENGLDA4KSwgVihFRiwxNSxFOCxFNiksIFwKKyAgICBWKEJBLEU3LDlCLEQ5KSwgVig0QSw2RiwzNixDRSksIFYoRUEsOUYsMDksRDQpLCBWKDI5LEIwLDdDLEQ2KSwgXAorICAgIFYoMzEsQTQsQjIsQUYpLCBWKDJBLDNGLDIzLDMxKSwgVihDNixBNSw5NCwzMCksIFYoMzUsQTIsNjYsQzApLCBcCisgICAgVig3NCw0RSxCQywzNyksIFYoRkMsODIsQ0EsQTYpLCBWKEUwLDkwLEQwLEIwKSwgVigzMyxBNyxEOCwxNSksIFwKKyAgICBWKEYxLDA0LDk4LDRBKSwgVig0MSxFQyxEQSxGNyksIFYoN0YsQ0QsNTAsMEUpLCBWKDE3LDkxLEY2LDJGKSwgXAorICAgIFYoNzYsNEQsRDYsOEQpLCBWKDQzLEVGLEIwLDREKSwgVihDQyxBQSw0RCw1NCksIFYoRTQsOTYsMDQsREYpLCBcCisgICAgVig5RSxEMSxCNSxFMyksIFYoNEMsNkEsODgsMUIpLCBWKEMxLDJDLDFGLEI4KSwgVig0Niw2NSw1MSw3RiksIFwKKyAgICBWKDlELDVFLEVBLDA0KSwgVigwMSw4QywzNSw1RCksIFYoRkEsODcsNzQsNzMpLCBWKEZCLDBCLDQxLDJFKSwgXAorICAgIFYoQjMsNjcsMUQsNUEpLCBWKDkyLERCLEQyLDUyKSwgVihFOSwxMCw1NiwzMyksIFYoNkQsRDYsNDcsMTMpLCBcCisgICAgVig5QSxENyw2MSw4QyksIFYoMzcsQTEsMEMsN0EpLCBWKDU5LEY4LDE0LDhFKSwgVihFQiwxMywzQyw4OSksIFwKKyAgICBWKENFLEE5LDI3LEVFKSwgVihCNyw2MSxDOSwzNSksIFYoRTEsMUMsRTUsRUQpLCBWKDdBLDQ3LEIxLDNDKSwgXAorICAgIFYoOUMsRDIsREYsNTkpLCBWKDU1LEYyLDczLDNGKSwgVigxOCwxNCxDRSw3OSksIFYoNzMsQzcsMzcsQkYpLCBcCisgICAgVig1MyxGNyxDRCxFQSksIFYoNUYsRkQsQUEsNUIpLCBWKERGLDNELDZGLDE0KSwgVig3OCw0NCxEQiw4NiksIFwKKyAgICBWKENBLEFGLEYzLDgxKSwgVihCOSw2OCxDNCwzRSksIFYoMzgsMjQsMzQsMkMpLCBWKEMyLEEzLDQwLDVGKSwgXAorICAgIFYoMTYsMUQsQzMsNzIpLCBWKEJDLEUyLDI1LDBDKSwgVigyOCwzQyw0OSw4QiksIFYoRkYsMEQsOTUsNDEpLCBcCisgICAgVigzOSxBOCwwMSw3MSksIFYoMDgsMEMsQjMsREUpLCBWKEQ4LEI0LEU0LDlDKSwgVig2NCw1NixDMSw5MCksIFwKKyAgICBWKDdCLENCLDg0LDYxKSwgVihENSwzMixCNiw3MCksIFYoNDgsNkMsNUMsNzQpLCBWKEQwLEI4LDU3LDQyKQorCisjZGVmaW5lIFYoYSxiLGMsZCkgMHgjI2EjI2IjI2MjI2QKK3N0YXRpYyBjb25zdCB1aW50MzIgUlQwWzI1Nl0gPSB7IFJUIH07CisjdW5kZWYgVgorCisjZGVmaW5lIFYoYSxiLGMsZCkgMHgjI2QjI2EjI2IjI2MKK3N0YXRpYyBjb25zdCB1aW50MzIgUlQxWzI1Nl0gPSB7IFJUIH07CisjdW5kZWYgVgorCisjZGVmaW5lIFYoYSxiLGMsZCkgMHgjI2MjI2QjI2EjI2IKK3N0YXRpYyBjb25zdCB1aW50MzIgUlQyWzI1Nl0gPSB7IFJUIH07CisjdW5kZWYgVgorCisjZGVmaW5lIFYoYSxiLGMsZCkgMHgjI2IjI2MjI2QjI2EKK3N0YXRpYyBjb25zdCB1aW50MzIgUlQzWzI1Nl0gPSB7IFJUIH07CisjdW5kZWYgVgorCisjdW5kZWYgUlQKKworLyogcm91bmQgY29uc3RhbnRzICovCisKK3N0YXRpYyBjb25zdCB1aW50MzIgUkNPTlsxMF0gPQoreworICAgIDB4MDEwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDQwMDAwMDAsIDB4MDgwMDAwMDAsCisgICAgMHgxMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg4MDAwMDAwMCwKKyAgICAweDFCMDAwMDAwLCAweDM2MDAwMDAwCit9OworCitpbnQgZG9faW5pdCA9IDA7CisKK3ZvaWQgYWVzX2dlbl90YWJsZXMoIHZvaWQgKQoreworfQorCisjZW5kaWYKKworLyogcGxhdGZvcm0taW5kZXBlbmRhbnQgMzItYml0IGludGVnZXIgbWFuaXB1bGF0aW9uIG1hY3JvcyAqLworCisjZGVmaW5lIEdFVF9VSU5UMzJfYWVzKG4sYixpKSAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChuKSA9ICggKHVpbnQzMikgKGIpWyhpKSAgICBdIDw8IDI0ICkgICAgICAgXAorICAgICAgICB8ICggKHVpbnQzMikgKGIpWyhpKSArIDFdIDw8IDE2ICkgICAgICAgXAorICAgICAgICB8ICggKHVpbnQzMikgKGIpWyhpKSArIDJdIDw8ICA4ICkgICAgICAgXAorICAgICAgICB8ICggKHVpbnQzMikgKGIpWyhpKSArIDNdICAgICAgICk7ICAgICAgXAorfQorCisjZGVmaW5lIFBVVF9VSU5UMzJfYWVzKG4sYixpKSAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChiKVsoaSkgICAgXSA9ICh1aW50OCkgKCAobikgPj4gMjQgKTsgICAgICAgXAorICAgIChiKVsoaSkgKyAxXSA9ICh1aW50OCkgKCAobikgPj4gMTYgKTsgICAgICAgXAorICAgIChiKVsoaSkgKyAyXSA9ICh1aW50OCkgKCAobikgPj4gIDggKTsgICAgICAgXAorICAgIChiKVsoaSkgKyAzXSA9ICh1aW50OCkgKCAobikgICAgICAgKTsgICAgICAgXAorfQorCisvKiBkZWNyeXB0aW9uIGtleSBzY2hlZHVsZSB0YWJsZXMgKi8KKworaW50IEtUX2luaXQgPSAxOworCit1aW50MzIgS1QwWzI1Nl07Cit1aW50MzIgS1QxWzI1Nl07Cit1aW50MzIgS1QyWzI1Nl07Cit1aW50MzIgS1QzWzI1Nl07CisKKy8qIEFFUyBrZXkgc2NoZWR1bGluZyByb3V0aW5lICovCitpbnQgYWVzX3NldF9rZXkoIGFlc19jb250ZXh0ICpjdHgsIHVpbnQ4ICprZXksIGludCBuYml0cyApCit7CisgICAgaW50IGk7CisgICAgdWludDMyICpSSywgKlNLOworCisgICAgaWYoIGRvX2luaXQgKQorICAgIHsKKyAgICAgICAgYWVzX2dlbl90YWJsZXMoKTsKKworICAgICAgICBkb19pbml0ID0gMDsKKyAgICB9CisKKyAgICBzd2l0Y2goIG5iaXRzICkKKyAgICB7CisgICAgICAgIGNhc2UgMTI4OiBjdHgtPm5yID0gMTA7IGJyZWFrOworICAgICAgICBjYXNlIDE5MjogY3R4LT5uciA9IDEyOyBicmVhazsKKyAgICAgICAgY2FzZSAyNTY6IGN0eC0+bnIgPSAxNDsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQgOiByZXR1cm4oIDEgKTsKKyAgICB9CisKKyAgICBSSyA9IGN0eC0+ZXJrOworCisgICAgZm9yKCBpID0gMDsgaSA8IChuYml0cyA+PiA1KTsgaSsrICkKKyAgICB7CisgICAgICAgIEdFVF9VSU5UMzJfYWVzKCBSS1tpXSwga2V5LCBpICogNCApOworICAgIH0KKworICAgIC8qIHNldHVwIGVuY3J5cHRpb24gcm91bmQga2V5cyAqLworCisgICAgc3dpdGNoKCBuYml0cyApCisgICAgeworICAgIGNhc2UgMTI4OgorCisgICAgICAgIGZvciggaSA9IDA7IGkgPCAxMDsgaSsrLCBSSyArPSA0ICkKKyAgICAgICAgeworICAgICAgICAgICAgUktbNF0gID0gUktbMF0gXiBSQ09OW2ldIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICggRlNiWyAodWludDgpICggUktbM10gPj4gMTYgKSBdIDw8IDI0ICkgXgorICAgICAgICAgICAgICAgICAgICAgICAgKCBGU2JbICh1aW50OCkgKCBSS1szXSA+PiAgOCApIF0gPDwgMTYgKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdICAgICAgICkgXSA8PCAgOCApIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICggRlNiWyAodWludDgpICggUktbM10gPj4gMjQgKSBdICAgICAgICk7CisKKyAgICAgICAgICAgIFJLWzVdICA9IFJLWzFdIF4gUktbNF07CisgICAgICAgICAgICBSS1s2XSAgPSBSS1syXSBeIFJLWzVdOworICAgICAgICAgICAgUktbN10gID0gUktbM10gXiBSS1s2XTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgMTkyOgorCisgICAgICAgIGZvciggaSA9IDA7IGkgPCA4OyBpKyssIFJLICs9IDYgKQorICAgICAgICB7CisgICAgICAgICAgICBSS1s2XSAgPSBSS1swXSBeIFJDT05baV0gXgorICAgICAgICAgICAgICAgICAgICAgICAgKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAxNiApIF0gPDwgMjQgKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAoIEZTYlsgKHVpbnQ4KSAoIFJLWzVdID4+ICA4ICkgXSA8PCAxNiApIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICggRlNiWyAodWludDgpICggUktbNV0gICAgICAgKSBdIDw8ICA4ICkgXgorICAgICAgICAgICAgICAgICAgICAgICAgKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAyNCApIF0gICAgICAgKTsKKworICAgICAgICAgICAgUktbN10gID0gUktbMV0gXiBSS1s2XTsKKyAgICAgICAgICAgIFJLWzhdICA9IFJLWzJdIF4gUktbN107CisgICAgICAgICAgICBSS1s5XSAgPSBSS1szXSBeIFJLWzhdOworICAgICAgICAgICAgUktbMTBdID0gUktbNF0gXiBSS1s5XTsKKyAgICAgICAgICAgIFJLWzExXSA9IFJLWzVdIF4gUktbMTBdOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAyNTY6CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IDc7IGkrKywgUksgKz0gOCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFJLWzhdICA9IFJLWzBdIF4gUkNPTltpXSBeCisgICAgICAgICAgICAgICAgICAgICAgICAoIEZTYlsgKHVpbnQ4KSAoIFJLWzddID4+IDE2ICkgXSA8PCAyNCApIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICggRlNiWyAodWludDgpICggUktbN10gPj4gIDggKSBdIDw8IDE2ICkgXgorICAgICAgICAgICAgICAgICAgICAgICAgKCBGU2JbICh1aW50OCkgKCBSS1s3XSAgICAgICApIF0gPDwgIDggKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAoIEZTYlsgKHVpbnQ4KSAoIFJLWzddID4+IDI0ICkgXSAgICAgICApOworCisgICAgICAgICAgICBSS1s5XSAgPSBSS1sxXSBeIFJLWzhdOworICAgICAgICAgICAgUktbMTBdID0gUktbMl0gXiBSS1s5XTsKKyAgICAgICAgICAgIFJLWzExXSA9IFJLWzNdIF4gUktbMTBdOworCisgICAgICAgICAgICBSS1sxMl0gPSBSS1s0XSBeCisgICAgICAgICAgICAgICAgICAgICAgICAoIEZTYlsgKHVpbnQ4KSAoIFJLWzExXSA+PiAyNCApIF0gPDwgMjQgKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAoIEZTYlsgKHVpbnQ4KSAoIFJLWzExXSA+PiAxNiApIF0gPDwgMTYgKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAoIEZTYlsgKHVpbnQ4KSAoIFJLWzExXSA+PiAgOCApIF0gPDwgIDggKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAoIEZTYlsgKHVpbnQ4KSAoIFJLWzExXSAgICAgICApIF0gICAgICAgKTsKKworICAgICAgICAgICAgUktbMTNdID0gUktbNV0gXiBSS1sxMl07CisgICAgICAgICAgICBSS1sxNF0gPSBSS1s2XSBeIFJLWzEzXTsKKyAgICAgICAgICAgIFJLWzE1XSA9IFJLWzddIF4gUktbMTRdOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIHNldHVwIGRlY3J5cHRpb24gcm91bmQga2V5cyAqLworCisgICAgaWYoIEtUX2luaXQgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IDI1NjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgS1QwW2ldID0gUlQwWyBGU2JbaV0gXTsKKyAgICAgICAgICAgIEtUMVtpXSA9IFJUMVsgRlNiW2ldIF07CisgICAgICAgICAgICBLVDJbaV0gPSBSVDJbIEZTYltpXSBdOworICAgICAgICAgICAgS1QzW2ldID0gUlQzWyBGU2JbaV0gXTsKKyAgICAgICAgfQorCisgICAgICAgIEtUX2luaXQgPSAwOworICAgIH0KKworICAgIFNLID0gY3R4LT5kcms7CisKKyAgICAqU0srKyA9ICpSSysrOworICAgICpTSysrID0gKlJLKys7CisgICAgKlNLKysgPSAqUksrKzsKKyAgICAqU0srKyA9ICpSSysrOworCisgICAgZm9yKCBpID0gMTsgaSA8IGN0eC0+bnI7IGkrKyApCisgICAgeworICAgICAgICBSSyAtPSA4OworCisgICAgICAgICpTSysrID0gS1QwWyAodWludDgpICggKlJLID4+IDI0ICkgXSBeCisgICAgICAgICAgICAgICAgS1QxWyAodWludDgpICggKlJLID4+IDE2ICkgXSBeCisgICAgICAgICAgICAgICAgS1QyWyAodWludDgpICggKlJLID4+ICA4ICkgXSBeCisgICAgICAgICAgICAgICAgS1QzWyAodWludDgpICggKlJLICAgICAgICkgXTsgUksrKzsKKworICAgICAgICAqU0srKyA9IEtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgorICAgICAgICAgICAgICAgIEtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgorICAgICAgICAgICAgICAgIEtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgorICAgICAgICAgICAgICAgIEtUM1sgKHVpbnQ4KSAoICpSSyAgICAgICApIF07IFJLKys7CisKKyAgICAgICAgKlNLKysgPSBLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKyAgICAgICAgICAgICAgICBLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKyAgICAgICAgICAgICAgICBLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKyAgICAgICAgICAgICAgICBLVDNbICh1aW50OCkgKCAqUksgICAgICAgKSBdOyBSSysrOworCisgICAgICAgICpTSysrID0gS1QwWyAodWludDgpICggKlJLID4+IDI0ICkgXSBeCisgICAgICAgICAgICAgICAgS1QxWyAodWludDgpICggKlJLID4+IDE2ICkgXSBeCisgICAgICAgICAgICAgICAgS1QyWyAodWludDgpICggKlJLID4+ICA4ICkgXSBeCisgICAgICAgICAgICAgICAgS1QzWyAodWludDgpICggKlJLICAgICAgICkgXTsgUksrKzsKKyAgICB9CisKKyAgICBSSyAtPSA4OworCisgICAgKlNLKysgPSAqUksrKzsKKyAgICAqU0srKyA9ICpSSysrOworICAgICpTSysrID0gKlJLKys7CisgICAgKlNLKysgPSAqUksrKzsKKworICAgIHJldHVybiggMCApOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDIzMDAvYXN0MjMwMC5jIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvYXN0MjMwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMTc3ODYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hc3BlZWQvYXN0MjMwMC9hc3QyMzAwLmMKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPHBjaS5oPgorCitpbnQgYm9hcmRfaW5pdCAodm9pZCkKK3sKKyAgICBERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKyAgICB1bnNpZ25lZCBjaGFyIGRhdGE7CisgICAgdW5zaWduZWQgbG9uZyByZWc7CisKKyAgICAvKiBBSEIgQ29udHJvbGxlciAqLworICAgICooKHZvbGF0aWxlIHVsb25nKikgMHgxRTYwMDAwMCkgID0gMHhBRUVEMUEwMzsJLyogdW5sb2NrIEFIQiBjb250cm9sbGVyICovIAorICAgICooKHZvbGF0aWxlIHVsb25nKikgMHgxRTYwMDA4QykgfD0gMHgwMTsJCS8qIG1hcCBEUkFNIHRvIDB4MDAwMDAwMDAgKi8KKyNpZmRlZiBDT05GSUdfUENJCisgICAgKigodm9sYXRpbGUgdWxvbmcqKSAweDFFNjAwMDhDKSB8PSAweDMwOwkJLyogbWFwIFBDSSAqLworI2VuZGlmCisKKyAgICAvKiBGbGFzaCBDb250cm9sbGVyICovCisjaWZkZWYJQ09ORklHX0ZMQVNIX0FTVDIzMDAKKyAgICAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2MjAwMDApIHw9IDB4ODAwZjAwMDA7CS8qIGVuYWJsZSBGbGFzaCBXcml0ZSAqLyAgICAgCisjZWxzZQorICAgICooKHZvbGF0aWxlIHVsb25nKikgMHgxNjAwMDAwMCkgfD0gMHgwMDAwMWMwMDsJLyogZW5hYmxlIEZsYXNoIFdyaXRlICovIAorI2VuZGlmICAgIAorCisgICAgLyogU0NVICovCisgICAgKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNmUyMDAwKSA9IDB4MTY4OEE4QTg7CS8qIHVubG9jayBTQ1UgKi8KKyAgICByZWcgPSAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwMDgpOwkJCisgICAgcmVnICY9IDB4MWMwZmZmZmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHJlZyB8PSAweDYxODAwMDAwOwkJCQkJCS8qIFBDTEsgID0gSFBMTC84ICovCQkJCQorI2lmZGVmIENPTkZJR19BU1QxMDcwCQorCXJlZyB8PSAweDMwMDAwMDsJCQkJCS8qIExIQ0xLID0gSFBMTC84ICovCisJcmVnIHw9IDB4ODAwMDA7CQkJCQkvKiBMUEMgSG9zdCBDbG9jayAqLworI2VuZGlmCQorICAgICooKHZvbGF0aWxlIHVsb25nKikgMHgxZTZlMjAwOCkgPSByZWc7ICAgICAKKyAgICByZWcgPSAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwMGMpOwkJLyogZW5hYmxlIDJEIENsayAqLworICAgICooKHZvbGF0aWxlIHVsb25nKikgMHgxZTZlMjAwYykgJj0gMHhGRkZGRkZGRDsKKy8qIGVuYWJsZSB3aWRlIHNjcmVlbi4gSWYgeW91ciB2aWRlbyBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCB3aWRlIHNjcmVlbiwgZG9uJ3QKK2VuYWJsZSB0aGlzIGJpdCAweDFlNmUyMDQwIERbMF0qLworICAgIHJlZyA9ICooKHZvbGF0aWxlIHVsb25nKikgMHgxZTZlMjA0MCk7CisgICAgKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNmUyMDQwKSB8PSAweDAxOworI2lmZGVmIENPTkZJR19BU1QxMDcwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qc2V0IFZQUEwxICovCisKKyAgICAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwMWMpID0gMHg2NDIwOworCisvLyBzZXQgZDItcGxsICYgZW5hYmxlIGQyLXBsbCBEWzIxOjIwXSwgRFs0XQorICAgIHJlZyA9ICooKHZvbGF0aWxlIHVsb25nKikgMHgxZTZlMjAyYyk7CisgICAgcmVnICY9IDB4ZmZjZmZmZWY7CisgICAgcmVnIHw9IDB4MDAyMDAwMTA7CisgICAgKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNmUyMDJjKSA9IHJlZzsKKworLy8gc2V0IE9TQ0NMSyA9IFZQTEwxCisgICAgKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNmUyMDEwKSA9IDB4ODsKKworLy8gZW5hYmxlIE9TQ0NMSworICAgIHJlZyA9ICooKHZvbGF0aWxlIHVsb25nKikgMHgxZTZlMjAyYyk7CisgICAgcmVnICY9IDB4ZmZmZmZmZmQ7CisgICAgcmVnIHw9IDB4MDAwMDAwMDI7CisgICAgKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNmUyMDJjKSA9IHJlZzsKKworLy8gZW5hYmxlIEFTVDEwNTAncyBMUEMgbWFzdGVyCisgICAgcmVnID0gKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNzg5MGEwKTsKKyAgICAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU3ODkwYTApIHw9IDB4MTE7CisjZW5kaWYKKyAgICAvKiBhcmNoIG51bWJlciAqLworICAgIGdkLT5iZC0+YmlfYXJjaF9udW1iZXIgPSBNQUNIX1RZUEVfQVNQRUVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAvKiBhZHJlc3Mgb2YgYm9vdCBwYXJhbWV0ZXJzICovCisgICAgZ2QtPmJkLT5iaV9ib290X3BhcmFtcyA9IDB4NDAwMDAxMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHJldHVybiAwOworfQorCitpbnQgZHJhbV9pbml0ICh2b2lkKQoreworICAgIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBnZC0+YmQtPmJpX2RyYW1bMF0uc3RhcnQgPSBQSFlTX1NEUkFNXzE7CisgICAgZ2QtPmJkLT5iaV9kcmFtWzBdLnNpemUgID0gUEhZU19TRFJBTV8xX1NJWkU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHJldHVybiAwOworfQorCisvKgorU0NVN0M6IFNpbGljb24gUmV2aXNpb24gSUQgUmVnaXN0ZXIKK0RbMzE6MjRdOiBDaGlwIElECiswOiBBU1QyMDUwL0FTVDIxMDAvQVNUMjE1MC9BU1QyMjAwL0FTVDMwMDAKKzE6IEFTVDIzMDAKKworRFsyMzoxNl0gU2lsaWNvbiByZXZpc2lvbiBJRCBmb3IgQVNUMjMwMCBnZW5lcmF0aW9uIGFuZCBsYXRlcgorMDogQTAKKzE6IEExCisyOiBBMgorLgorLgorLgorRlBHQSByZXZpc2lvbiBzdGFydHMgZnJvbSAweDgwCisKKworRFsxMTo4XSBCb3VuZGluZyBvcHRpb24KKworRFs3OjBdIFNpbGljb24gcmV2aXNpb24gSUQgZm9yIEFTVDIwNTAvQVNUMjEwMCBnZW5lcmF0aW9uIChmb3Igc29mdHdhcmUgY29tcGF0aWJsZSkKKzA6IEEwCisxOiBBMQorMjogQTIKKzM6IEEzCisuCisuCitGUEdBIHJldmlzaW9uIHN0YXJ0cyBmcm9tIDB4MDgsIDh+MTAgbWVhbnMgQTAsIDExKyBtZWFucyBBMSwgQVNUMjMwMCBzaG91bGQgYmUgYXNzaWduZWQgdG8gMworKi8KK2ludCBtaXNjX2luaXRfcih2b2lkKQoreworICAgIHVuc2lnbmVkIGludCByZWcxLCByZXZpc2lvbiwgY2hpcF9pZDsKKworICAgIC8qIFNob3cgSC9XIFZlcnNpb24gKi8KKyAgICByZWcxID0gKHVuc2lnbmVkIGludCkgKCooKHVsb25nKikgMHgxZTZlMjA3YykpOworICAgIGNoaXBfaWQgPSAocmVnMSAmIDB4ZmYwMDAwMDApID4+IDI0OworICAgIHJldmlzaW9uID0gKHJlZzEgJiAweGZmMDAwMCkgPj4gMTY7CisKKyAgICBwdXRzICgiSC9XOiAgICIpOworICAgIGlmIChjaGlwX2lkID09IDEpIHsKKyAgICAJaWYgKHJldmlzaW9uID49IDB4ODApIHsKKyAgICAJCXByaW50ZigiQVNUMjMwMCBzZXJpZXMgRlBHQSBSZXYuICUwMnggXG4iLCByZXZpc2lvbik7CisgICAgCX0KKyAgICAJZWxzZSB7CisgICAgCQlwcmludGYoIkFTVDIzMDAgc2VyaWVzIGNoaXAgUmV2LiAlMDJ4IFxuIiwgcmV2aXNpb24pOworICAgIAl9CisgICAgfQorICAgIGVsc2UgaWYgKGNoaXBfaWQgPT0gMCkgeworCXByaW50ZigiQVNUMjA1MC9BU1QyMTUwIHNlcmllcyBjaGlwXG4iKTsKKyAgICB9CisKKyNpZmRlZiBDT05GSUdfQVNUMTA3MAorCXB1dHMgKCJDL0M6ICAgIik7CisJcmV2aXNpb24gPSAodW5zaWduZWQgaW50KSAoKigodWxvbmcqKSAweDYwMDAyMDM0KSk7CisJcHJpbnRmKCJBU1QxMDcwIElEIFslMDh4XSBcbiIsIHJldmlzaW9uKTsKKyNlbmRpZgorCisjaWZkZWYJQ09ORklHX1BDSQkKKyAgICBwY2lfaW5pdCAoKTsKKyNlbmRpZgorCisgICAgaWYgKGdldGVudiAoInZlcmlmeSIpID09IE5VTEwpIHsKKwlzZXRlbnYgKCJ2ZXJpZnkiLCAibiIpOworICAgIH0KKyAgICBpZiAoZ2V0ZW52ICgiZWVwcm9tIikgPT0gTlVMTCkgeworCXNldGVudiAoImVlcHJvbSIsICJ5Iik7CisgICAgfQorfQorCisjaWZkZWYJQ09ORklHX1BDSQorc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBob3NlOworCitleHRlcm4gdm9pZCBhc3BlZWRfaW5pdF9wY2kgKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7CisKK3ZvaWQgcGNpX2luaXRfYm9hcmQodm9pZCkKK3sKKyAgICBhc3BlZWRfaW5pdF9wY2koJmhvc2UpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjMwMC9jb25maWcubWsgYi9ib2FyZC9hc3BlZWQvYXN0MjMwMC9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjRjYTA5YgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL2NvbmZpZy5tawpAQCAtMCwwICsxLDE4IEBACisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKKyMgUk9NIHZlcnNpb24KKyNURVhUX0JBU0UgPSAweEJGQzAwMDAwCisKKyMgUkFNIHZlcnNpb24KK1RFWFRfQkFTRSA9IDB4NDA1MDAwMDAKKyNURVhUX0JBU0UgPSAweDAwMDAwMDAwCisjVEVYVF9CQVNFID0gMHgwMDQwMDAwMApkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDIzMDAvY3JjMzIuYyBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL2NyYzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2M4ZDJhYwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL2NyYzMyLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8ZW52aXJvbm1lbnQuaD4KKworI2lmZGVmIENPTkZJR18yU1BJRkxBU0gKKworZXh0ZXJuIGZsYXNoX2luZm9fdCBmbGFzaF9pbmZvW0NGR19NQVhfRkxBU0hfQkFOS1NdOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRhYmxlIG9mIENSQy0zMidzIG9mIGFsbCBzaW5nbGUtYnl0ZSB2YWx1ZXMgKG1hZGUgYnkgbWFrZV9hc3BlZWRfY3JjX3RhYmxlKQorICovCit1bnNpZ25lZCBsb25nIGFzcGVlZF9jcmNfdGFibGVbMjU2XSA9IHsKKyAgMHgwMDAwMDAwMEwsIDB4NzcwNzMwOTZMLCAweGVlMGU2MTJjTCwgMHg5OTA5NTFiYUwsIDB4MDc2ZGM0MTlMLAorICAweDcwNmFmNDhmTCwgMHhlOTYzYTUzNUwsIDB4OWU2NDk1YTNMLCAweDBlZGI4ODMyTCwgMHg3OWRjYjhhNEwsCisgIDB4ZTBkNWU5MWVMLCAweDk3ZDJkOTg4TCwgMHgwOWI2NGMyYkwsIDB4N2ViMTdjYmRMLCAweGU3YjgyZDA3TCwKKyAgMHg5MGJmMWQ5MUwsIDB4MWRiNzEwNjRMLCAweDZhYjAyMGYyTCwgMHhmM2I5NzE0OEwsIDB4ODRiZTQxZGVMLAorICAweDFhZGFkNDdkTCwgMHg2ZGRkZTRlYkwsIDB4ZjRkNGI1NTFMLCAweDgzZDM4NWM3TCwgMHgxMzZjOTg1NkwsCisgIDB4NjQ2YmE4YzBMLCAweGZkNjJmOTdhTCwgMHg4YTY1YzllY0wsIDB4MTQwMTVjNGZMLCAweDYzMDY2Y2Q5TCwKKyAgMHhmYTBmM2Q2M0wsIDB4OGQwODBkZjVMLCAweDNiNmUyMGM4TCwgMHg0YzY5MTA1ZUwsIDB4ZDU2MDQxZTRMLAorICAweGEyNjc3MTcyTCwgMHgzYzAzZTRkMUwsIDB4NGIwNGQ0NDdMLCAweGQyMGQ4NWZkTCwgMHhhNTBhYjU2YkwsCisgIDB4MzViNWE4ZmFMLCAweDQyYjI5ODZjTCwgMHhkYmJiYzlkNkwsIDB4YWNiY2Y5NDBMLCAweDMyZDg2Y2UzTCwKKyAgMHg0NWRmNWM3NUwsIDB4ZGNkNjBkY2ZMLCAweGFiZDEzZDU5TCwgMHgyNmQ5MzBhY0wsIDB4NTFkZTAwM2FMLAorICAweGM4ZDc1MTgwTCwgMHhiZmQwNjExNkwsIDB4MjFiNGY0YjVMLCAweDU2YjNjNDIzTCwgMHhjZmJhOTU5OUwsCisgIDB4YjhiZGE1MGZMLCAweDI4MDJiODllTCwgMHg1ZjA1ODgwOEwsIDB4YzYwY2Q5YjJMLCAweGIxMGJlOTI0TCwKKyAgMHgyZjZmN2M4N0wsIDB4NTg2ODRjMTFMLCAweGMxNjExZGFiTCwgMHhiNjY2MmQzZEwsIDB4NzZkYzQxOTBMLAorICAweDAxZGI3MTA2TCwgMHg5OGQyMjBiY0wsIDB4ZWZkNTEwMmFMLCAweDcxYjE4NTg5TCwgMHgwNmI2YjUxZkwsCisgIDB4OWZiZmU0YTVMLCAweGU4YjhkNDMzTCwgMHg3ODA3YzlhMkwsIDB4MGYwMGY5MzRMLCAweDk2MDlhODhlTCwKKyAgMHhlMTBlOTgxOEwsIDB4N2Y2YTBkYmJMLCAweDA4NmQzZDJkTCwgMHg5MTY0NmM5N0wsIDB4ZTY2MzVjMDFMLAorICAweDZiNmI1MWY0TCwgMHgxYzZjNjE2MkwsIDB4ODU2NTMwZDhMLCAweGYyNjIwMDRlTCwgMHg2YzA2OTVlZEwsCisgIDB4MWIwMWE1N2JMLCAweDgyMDhmNGMxTCwgMHhmNTBmYzQ1N0wsIDB4NjViMGQ5YzZMLCAweDEyYjdlOTUwTCwKKyAgMHg4YmJlYjhlYUwsIDB4ZmNiOTg4N2NMLCAweDYyZGQxZGRmTCwgMHgxNWRhMmQ0OUwsIDB4OGNkMzdjZjNMLAorICAweGZiZDQ0YzY1TCwgMHg0ZGIyNjE1OEwsIDB4M2FiNTUxY2VMLCAweGEzYmMwMDc0TCwgMHhkNGJiMzBlMkwsCisgIDB4NGFkZmE1NDFMLCAweDNkZDg5NWQ3TCwgMHhhNGQxYzQ2ZEwsIDB4ZDNkNmY0ZmJMLCAweDQzNjllOTZhTCwKKyAgMHgzNDZlZDlmY0wsIDB4YWQ2Nzg4NDZMLCAweGRhNjBiOGQwTCwgMHg0NDA0MmQ3M0wsIDB4MzMwMzFkZTVMLAorICAweGFhMGE0YzVmTCwgMHhkZDBkN2NjOUwsIDB4NTAwNTcxM2NMLCAweDI3MDI0MWFhTCwgMHhiZTBiMTAxMEwsCisgIDB4YzkwYzIwODZMLCAweDU3NjhiNTI1TCwgMHgyMDZmODViM0wsIDB4Yjk2NmQ0MDlMLCAweGNlNjFlNDlmTCwKKyAgMHg1ZWRlZjkwZUwsIDB4MjlkOWM5OThMLCAweGIwZDA5ODIyTCwgMHhjN2Q3YThiNEwsIDB4NTliMzNkMTdMLAorICAweDJlYjQwZDgxTCwgMHhiN2JkNWMzYkwsIDB4YzBiYTZjYWRMLCAweGVkYjg4MzIwTCwgMHg5YWJmYjNiNkwsCisgIDB4MDNiNmUyMGNMLCAweDc0YjFkMjlhTCwgMHhlYWQ1NDczOUwsIDB4OWRkMjc3YWZMLCAweDA0ZGIyNjE1TCwKKyAgMHg3M2RjMTY4M0wsIDB4ZTM2MzBiMTJMLCAweDk0NjQzYjg0TCwgMHgwZDZkNmEzZUwsIDB4N2E2YTVhYThMLAorICAweGU0MGVjZjBiTCwgMHg5MzA5ZmY5ZEwsIDB4MGEwMGFlMjdMLCAweDdkMDc5ZWIxTCwgMHhmMDBmOTM0NEwsCisgIDB4ODcwOGEzZDJMLCAweDFlMDFmMjY4TCwgMHg2OTA2YzJmZUwsIDB4Zjc2MjU3NWRMLCAweDgwNjU2N2NiTCwKKyAgMHgxOTZjMzY3MUwsIDB4NmU2YjA2ZTdMLCAweGZlZDQxYjc2TCwgMHg4OWQzMmJlMEwsIDB4MTBkYTdhNWFMLAorICAweDY3ZGQ0YWNjTCwgMHhmOWI5ZGY2ZkwsIDB4OGViZWVmZjlMLCAweDE3YjdiZTQzTCwgMHg2MGIwOGVkNUwsCisgIDB4ZDZkNmEzZThMLCAweGExZDE5MzdlTCwgMHgzOGQ4YzJjNEwsIDB4NGZkZmYyNTJMLCAweGQxYmI2N2YxTCwKKyAgMHhhNmJjNTc2N0wsIDB4M2ZiNTA2ZGRMLCAweDQ4YjIzNjRiTCwgMHhkODBkMmJkYUwsIDB4YWYwYTFiNGNMLAorICAweDM2MDM0YWY2TCwgMHg0MTA0N2E2MEwsIDB4ZGY2MGVmYzNMLCAweGE4NjdkZjU1TCwgMHgzMTZlOGVlZkwsCisgIDB4NDY2OWJlNzlMLCAweGNiNjFiMzhjTCwgMHhiYzY2ODMxYUwsIDB4MjU2ZmQyYTBMLCAweDUyNjhlMjM2TCwKKyAgMHhjYzBjNzc5NUwsIDB4YmIwYjQ3MDNMLCAweDIyMDIxNmI5TCwgMHg1NTA1MjYyZkwsIDB4YzViYTNiYmVMLAorICAweGIyYmQwYjI4TCwgMHgyYmI0NWE5MkwsIDB4NWNiMzZhMDRMLCAweGMyZDdmZmE3TCwgMHhiNWQwY2YzMUwsCisgIDB4MmNkOTllOGJMLCAweDViZGVhZTFkTCwgMHg5YjY0YzJiMEwsIDB4ZWM2M2YyMjZMLCAweDc1NmFhMzljTCwKKyAgMHgwMjZkOTMwYUwsIDB4OWMwOTA2YTlMLCAweGViMGUzNjNmTCwgMHg3MjA3Njc4NUwsIDB4MDUwMDU3MTNMLAorICAweDk1YmY0YTgyTCwgMHhlMmI4N2ExNEwsIDB4N2JiMTJiYWVMLCAweDBjYjYxYjM4TCwgMHg5MmQyOGU5YkwsCisgIDB4ZTVkNWJlMGRMLCAweDdjZGNlZmI3TCwgMHgwYmRiZGYyMUwsIDB4ODZkM2QyZDRMLCAweGYxZDRlMjQyTCwKKyAgMHg2OGRkYjNmOEwsIDB4MWZkYTgzNmVMLCAweDgxYmUxNmNkTCwgMHhmNmI5MjY1YkwsIDB4NmZiMDc3ZTFMLAorICAweDE4Yjc0Nzc3TCwgMHg4ODA4NWFlNkwsIDB4ZmYwZjZhNzBMLCAweDY2MDYzYmNhTCwgMHgxMTAxMGI1Y0wsCisgIDB4OGY2NTllZmZMLCAweGY4NjJhZTY5TCwgMHg2MTZiZmZkM0wsIDB4MTY2Y2NmNDVMLCAweGEwMGFlMjc4TCwKKyAgMHhkNzBkZDJlZUwsIDB4NGUwNDgzNTRMLCAweDM5MDNiM2MyTCwgMHhhNzY3MjY2MUwsIDB4ZDA2MDE2ZjdMLAorICAweDQ5Njk0NzRkTCwgMHgzZTZlNzdkYkwsIDB4YWVkMTZhNGFMLCAweGQ5ZDY1YWRjTCwgMHg0MGRmMGI2NkwsCisgIDB4MzdkODNiZjBMLCAweGE5YmNhZTUzTCwgMHhkZWJiOWVjNUwsIDB4NDdiMmNmN2ZMLCAweDMwYjVmZmU5TCwKKyAgMHhiZGJkZjIxY0wsIDB4Y2FiYWMyOGFMLCAweDUzYjM5MzMwTCwgMHgyNGI0YTNhNkwsIDB4YmFkMDM2MDVMLAorICAweGNkZDcwNjkzTCwgMHg1NGRlNTcyOUwsIDB4MjNkOTY3YmZMLCAweGIzNjY3YTJlTCwgMHhjNDYxNGFiOEwsCisgIDB4NWQ2ODFiMDJMLCAweDJhNmYyYjk0TCwgMHhiNDBiYmUzN0wsIDB4YzMwYzhlYTFMLCAweDVhMDVkZjFiTCwKKyAgMHgyZDAyZWY4ZEwKK307CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNkZWZpbmUgQVNQRUVEX0RPMShidWYpICBjcmMgPSBhc3BlZWRfY3JjX3RhYmxlWygoaW50KWNyYyBeICgqYnVmKyspKSAmIDB4ZmZdIF4gKGNyYyA+PiA4KTsKKyNkZWZpbmUgQVNQRUVEX0RPMihidWYpICBBU1BFRURfRE8xKGJ1Zik7IEFTUEVFRF9ETzEoYnVmKTsKKyNkZWZpbmUgQVNQRUVEX0RPNChidWYpICBBU1BFRURfRE8yKGJ1Zik7IEFTUEVFRF9ETzIoYnVmKTsKKyNkZWZpbmUgQVNQRUVEX0RPOChidWYpICBBU1BFRURfRE80KGJ1Zik7IEFTUEVFRF9ETzQoYnVmKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwordW5zaWduZWQgbG9uZyBzcGkyX2NyYzMyKGNyYywgYnVmLCBsZW4pCisgICAgdW5zaWduZWQgbG9uZyBjcmM7CisgICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgIHVuc2lnbmVkIGxvbmcgbGVuOworeworCisgICAgc2l6ZV90IGxlbjEsIGxlbjI7CisgICAgY2hhciAqczsKKworICAgIGxlbjEgPSBsZW4yID0gMDsKKyAgICBpZiAoICh1bG9uZykoYnVmKSA8PSAoZmxhc2hfaW5mb1swXS5zdGFydFswXSArIGZsYXNoX2luZm9bMF0uc2l6ZSkgKQorICAgICAgICBsZW4xID0gKGZsYXNoX2luZm9bMF0uc3RhcnRbMF0gKyBmbGFzaF9pbmZvWzBdLnNpemUpIC0gKHVsb25nKShidWYpOworICAgIAorICAgIGxlbjEgPSAobGVuIDwgbGVuMSkgPyBsZW46bGVuMTsKKyAgICBsZW4yID0gKGxlbiA8IGxlbjEpID8gMDogKGxlbiAtIGxlbjEpOworCisgICAgY3JjID0gY3JjIF4gMHhmZmZmZmZmZkw7CisgICAgd2hpbGUgKGxlbjEgPj0gOCkKKyAgICB7CisgICAgICBBU1BFRURfRE84KGJ1Zik7CisgICAgICBsZW4xIC09IDg7CisgICAgfQorICAgIGlmIChsZW4xKSBkbyB7CisgICAgICBBU1BFRURfRE8xKGJ1Zik7CisgICAgfSB3aGlsZSAoLS1sZW4xKTsKKyAgICAKKyAgICAvL3MgPSAoY2hhciAqKSBmbGFzaF9pbmZvWzFdLnN0YXJ0WzBdOworICAgIHM9IChjaGFyICopIGZsYXNoX21ha2VfYWRkciAoJmZsYXNoX2luZm9bMV0sIDAsIDApOworICAgIHdoaWxlIChsZW4yID49IDgpCisgICAgeworICAgICAgQVNQRUVEX0RPOChzKTsKKyAgICAgIGxlbjIgLT0gODsKKyAgICB9CisgICAgaWYgKGxlbjIpIGRvIHsKKyAgICAgIEFTUEVFRF9ETzEocyk7CisgICAgfSB3aGlsZSAoLS1sZW4yKTsgICAKKworICAgIHJldHVybiBjcmMgXiAweGZmZmZmZmZmTDsKKyAgICAKK30KKworI2VuZGlmIC8qIENPTkZJR18yU1BJRkxBU0ggKi8KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDIzMDAvY3J0LmMgYi9ib2FyZC9hc3BlZWQvYXN0MjMwMC9jcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNjdmNjY5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvY3J0LmMKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKworI2luY2x1ZGUgInR5cGUuaCIKKyNpbmNsdWRlICJ2ZXNhLmgiCisjaW5jbHVkZSAidmRlZi5oIgorI2luY2x1ZGUgInZmdW4uaCIKKyNpbmNsdWRlICJ2cmVnLmgiCisjaW5jbHVkZSAiY3J0LmgiCisKK1VMT05HIEFTVDMwMDBEQ0xLVGFibGVWIFtdID0geworICAgIDB4MDAwNDY1MTUsICAgICAvKiAwMDogVkNMSzI1XzE3NSAqLyAgCisgICAgMHgwMDA0NzI1NSwgICAgIC8qIDAxOiBWQ0xLMjhfMzIyICovCisgICAgMHgwMDA0NjgyYSwgICAgIC8qIDAyOiBWQ0xLMzFfNSAgICAgICAgICovCisgICAgMHgwMDA0NjcyYSwgICAgIC8qIDAzOiBWQ0xLMzYgICAgICAgICAgKi8KKyAgICAweDAwMDQ2YzUwLCAgICAgLyogMDQ6IFZDTEs0MCAgICAgICAgICAgKi8KKyAgICAweDAwMDQ2ODQyLCAgICAgLyogMDU6IFZDTEs0OV81ICAgICAgICAgKi8KKyAgICAweDAwMDA2YzMyLCAgICAgLyogMDY6IFZDTEs1MCAgICAgICAgICAgKi8KKyAgICAweDAwMDA2YTJmLCAgICAgLyogMDc6IFZDTEs1Nl8yNSAgICAgICAgKi8KKyAgICAweDAwMDA2YzQxLCAgICAgLyogMDg6IFZDTEs2NSAgKi8KKyAgICAweDAwMDA2ODMyLCAgICAgLyogMDk6IFZDTEs3NSAgICAgICAgICovCisgICAgMHgwMDAwNjcyZSwgICAgIC8qIDBBOiBWQ0xLNzhfNzUgICAgICAgICovCisgICAgMHgwMDAwNjgzZiwgICAgIC8qIDBCOiBWQ0xLOTRfNSAgICAgICAgICovCisgICAgMHgwMDAwNDgyNCwgICAgIC8qIDBDOiBWQ0xLMTA4ICAgICAgICAgICovCisJMHgwMDAwNDcyMywJCS8qIDBEOiBWQ0xLMTE5CQkJKi8KKyAgICAweDAwMDA0ODJkLCAgICAgLyogMEU6IFZDTEsxMzUgICAgICAgICAgKi8KKwkweDAwMDA0QjM3LAkJLyogMEY6IFZDTEsxNDZfMjUJCSovCisgICAgMHgwMDAwNDcyZSwgICAgIC8qIDEwOiBWQ0xLMTU3XzUgICAgICAgICovCisgICAgMHgwMDAwNDgzNiwgICAgIC8qIDExOiBWQ0xLMTYyICAgICAgICAgICovCisKK307CisKK0JPT0wgQ2hlY2tEQUMoaW50IG5DUlRJbmRleCkKK3sKKwlCWVRFCWJ0VmFsdWU7CQorCUJPT0wJYlZhbHVlOworCisJQllURSBidERldmljZVNlbGVjdDsKKworCXN3aXRjaCAobkNSVEluZGV4KQorCXsKKwljYXNlIENSVF8xOgorCQlidERldmljZVNlbGVjdCA9IERFVklDRV9BRERSRVNTX0NINzMwMV9DUlQxOworCQlicmVhazsKKwljYXNlIENSVF8yOgorCQlidERldmljZVNlbGVjdCA9IERFVklDRV9BRERSRVNTX0NINzMwMV9DUlQyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIkNSVEluZGV4IGlzIG5vdCAxIG9yIDIiKTsKKwkJcmV0dXJuIEZBTFNFOworCQlicmVhazsKKwl9CisKKwkvL0VuYWJsZSBhbGwgREFDJ3MgYW5kIHNldCByZWdpc3RlciAyMWhbMF0gPSAnMCcKKwkvL0RWSVAgYW5kIERWSUwgZGlzYWJsZSBmb3IgREFDCisJU2V0STJDUmVnQ2xpZW50KDAsIERFVklDRV9TRUxFQ1RfQ0g3MzAxLCBidERldmljZVNlbGVjdCwgQ0g3MzAxX1BNX1JFRywgMHgwMCk7CisKKwlidFZhbHVlID0gR2V0STJDUmVnQ2xpZW50KDAsIERFVklDRV9TRUxFQ1RfQ0g3MzAxLCBidERldmljZVNlbGVjdCwgQ0g3MzAxX0RDX1JFRyk7CisJYnRWYWx1ZSA9IGJ0VmFsdWUgJiAweEZFOworCVNldEkyQ1JlZ0NsaWVudCgwLCBERVZJQ0VfU0VMRUNUX0NINzMwMSwgYnREZXZpY2VTZWxlY3QsIENINzMwMV9EQ19SRUcsIGJ0VmFsdWUpOworCisJLy9TZXQgU0VOU0UgYml0IHRvIDEKKwlidFZhbHVlID0gR2V0STJDUmVnQ2xpZW50KDAsIERFVklDRV9TRUxFQ1RfQ0g3MzAxLCBidERldmljZVNlbGVjdCwgQ0g3MzAxX0NEX1JFRyk7CisJYnRWYWx1ZSA9IGJ0VmFsdWUgfCAweDAxOworCVNldEkyQ1JlZ0NsaWVudCgwLCBERVZJQ0VfU0VMRUNUX0NINzMwMSwgYnREZXZpY2VTZWxlY3QsIENINzMwMV9DRF9SRUcsIGJ0VmFsdWUpOworCisJLy9SZXNldCBTRU5TRSBiaXQgdG8gMAorCWJ0VmFsdWUgPSBHZXRJMkNSZWdDbGllbnQoMCwgREVWSUNFX1NFTEVDVF9DSDczMDEsIGJ0RGV2aWNlU2VsZWN0LCBDSDczMDFfQ0RfUkVHKTsKKwlidFZhbHVlID0gYnRWYWx1ZSAmIDB4RkU7CisJU2V0STJDUmVnQ2xpZW50KDAsIERFVklDRV9TRUxFQ1RfQ0g3MzAxLCBidERldmljZVNlbGVjdCwgQ0g3MzAxX0NEX1JFRywgYnRWYWx1ZSk7CisKKwliVmFsdWUgPSAoR2V0STJDUmVnQ2xpZW50KDAsIERFVklDRV9TRUxFQ1RfQ0g3MzAxLCBidERldmljZVNlbGVjdCwgQ0g3MzAxX0NEX1JFRykgJiBDRF9EQUNUKSA/IFRSVUUgOiBGQUxTRTsKKworCXJldHVybiBiVmFsdWU7Cit9CisKK1ZPSUQgIFNldENINzMwMUMoVUxPTkcJTU1JT0Jhc2UsCisJCQkJIGludAluQ1JUSW5kZXgsCisgICAgICAgICAgICAgICAgIGludAlpbkZyZXFSYW5nZSwKKwkJCQkgaW50CWluT3BlcmF0aW5nKQoreworCUJZVEUgYnREZXZpY2VTZWxlY3Q7CisJQllURSBidFZhbHVlOworCisvLyNpZmRlZiBFVkJfQ0xJRU5UCisJLy9vdXRwdXQgUkdCIGRvZXNuJ3QgbmVlZCB0byBzZXQgQ0g3MzAxCisJLy9pZiAoMSA9PSBpbk9wZXJhdGluZykKKwkvLwlyZXR1cm47CisvLyNlbmRpZgorCisJc3dpdGNoIChuQ1JUSW5kZXgpCisJeworCWNhc2UgQ1JUXzE6CisJCWJ0RGV2aWNlU2VsZWN0ID0gMHhFQTsKKworCQlicmVhazsKKwljYXNlIENSVF8yOgorCQlidERldmljZVNlbGVjdCA9IDB4RUM7CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJDUlRJbmRleCBpcyBub3QgMSBvciAyIik7CisJCXJldHVybjsKKwkJYnJlYWs7CisJfQorCisJaWYgKGluRnJlcVJhbmdlIDw9IFZDTEs2NSkKKwl7CisJICBwcmludGYoImNoNzMwMTogbG93IGYgXG4iKTsKKwkJU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDMzLCAweDA4KTsKKwkJU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDM0LCAweDE2KTsKKwkJU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDM2LCAweDYwKTsKKwl9CisJZWxzZQorCXsKKwkJU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDMzLCAweDA2KTsKKwkJU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDM0LCAweDI2KTsKKwkJU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDM2LCAweEEwKTsKKwl9CisKKwlzd2l0Y2ggKGluT3BlcmF0aW5nKQorCXsKKwljYXNlIDA6CisJCS8vRFZJIGlzIG5vcm1hbCBmdW5jdGlvbgorCQkgU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDQ5LCAweEMwKTsKKwkJIFNldEkyQ1JlZ0NsaWVudChNTUlPQmFzZSwgMHgzLCBidERldmljZVNlbGVjdCwgMHgxRCwgMHg0Nyk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJLy9SR0IKKwkJU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDQ4LCAweDE4KTsKKwkJU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDQ5LCAweDApOworCQlTZXRJMkNSZWdDbGllbnQoTU1JT0Jhc2UsIDB4MywgYnREZXZpY2VTZWxlY3QsIDB4NTYsIDB4MCk7CisJCVNldEkyQ1JlZ0NsaWVudChNTUlPQmFzZSwgMHgzLCBidERldmljZVNlbGVjdCwgMHgyMSwgMHg5KTsKKwkJU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDFELCAweDQ4KTsKKwkJU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDFDLCAweDAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfTsKK30KKwordm9pZCBTZXRBU1RNb2RlVGltaW5nIChVTE9ORyBNTUlPQmFzZSwgaW50IG5DUlRJbmRleCwgQllURSBNb2RlSW5kZXgsIEJZVEUgQ29sb3JEZXB0aCkKK3sKKyAgICBVTE9ORyAgICB0ZW1wLCBSZXRyYWNlU3RhcnQsIFJldHJhY2VFbmQsIERpc3BsYXlPZmZzZXQsIFRlcm1pbmFsQ291bnQsIGJwcDsKKworLy8gIEFjY2VzcyBDUlQgRW5naW5lCisJLy8gIFNldFBvbGFyaXR5CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoU0NVX0JBU0UsIENSVDFfQ09OVFJPTF9SRUcgKyBuQ1JUSW5kZXgqMHg2MCwgKCh2TW9kZVRhYmxlW01vZGVJbmRleF0uSG9yUG9sYXJpdHkgPDwgSE9SX1NZTkNfU0VMRUNUX0JJVCkgfCAodk1vZGVUYWJsZVtNb2RlSW5kZXhdLlZlclBvbGFyaXR5IDw8IFZFUl9TWU5DX1NFTEVDVF9CSVQpKSwgKEhPUl9TWU5DX1NFTEVDVF9NQVNLfFZFUl9TWU5DX1NFTEVDVF9NQVNLKSk7CisKKyNpZiBDT05GSUdfQVNUMzAwMAorCVdyaXRlTWVtb3J5TG9uZ0NsaWVudChTQ1VfQkFTRSwgQ1JUMV9DT05UUk9MMl9SRUcgKyBuQ1JUSW5kZXgqMHg2MCwgMHhjMCk7CisjZWxzZQorICAgIC8vMjEwMCBpcyBzaW5nbGUgZWRnZQorCVdyaXRlTWVtb3J5TG9uZ0NsaWVudChTQ1VfQkFTRSwgQ1JUMV9DT05UUk9MMl9SRUcgKyBuQ1JUSW5kZXgqMHg2MCwgMHg4MCk7CisjZW5kaWYgICAgCisJLy8gIEhvcml6b250YWwgVGltaW5nCisJdGVtcCA9IDA7CisgICAgdGVtcCA9ICgodk1vZGVUYWJsZVtNb2RlSW5kZXhdLkhvcml6b250YWxBY3RpdmUgLSAxKSA8PCBIT1JfRU5BQkxFX0VORF9CSVQpIHwgKCh2TW9kZVRhYmxlW01vZGVJbmRleF0uSG9yaXpvbnRhbFRvdGFsIC0gMSkgPDwgSE9SX1RPVEFMX0JJVCk7CisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KFNDVV9CQVNFLCBDUlQxX0hPUl9UT1RBTF9FTkRfUkVHICArIG5DUlRJbmRleCoweDYwLCB0ZW1wKTsKKworICAgIFJldHJhY2VTdGFydCA9IHZNb2RlVGFibGVbTW9kZUluZGV4XS5Ib3Jpem9udGFsVG90YWwgLSB2TW9kZVRhYmxlW01vZGVJbmRleF0uSEJhY2tQb3JjaCAtIHZNb2RlVGFibGVbTW9kZUluZGV4XS5IU3luY1RpbWUgLSB2TW9kZVRhYmxlW01vZGVJbmRleF0uSExlZnRCb3JkZXIgLSAxOworICAgIFJldHJhY2VFbmQgPSAoUmV0cmFjZVN0YXJ0ICsgdk1vZGVUYWJsZVtNb2RlSW5kZXhdLkhTeW5jVGltZSk7CisJdGVtcCA9IDA7CisgICAgdGVtcCA9IChSZXRyYWNlRW5kIDw8IEhPUl9SRVRSQUNFX0VORF9CSVQpIHwgKFJldHJhY2VTdGFydCA8PCBIT1JfUkVUUkFDRV9TVEFSVF9CSVQpOworICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChTQ1VfQkFTRSwgQ1JUMV9IT1JfUkVUUkFDRV9SRUcgICsgbkNSVEluZGV4KjB4NjAsIHRlbXApOworCisJLy8gIFZlcnRpY2FsIFRpbWluZworCXRlbXAgPSAwOworICAgIHRlbXAgPSAoKHZNb2RlVGFibGVbTW9kZUluZGV4XS5WZXJ0aWNhbEFjdGl2ZSAtIDEpIDw8IFZFUl9FTkFCTEVfRU5EX0JJVCkgfCAoKHZNb2RlVGFibGVbTW9kZUluZGV4XS5WZXJ0aWNhbFRvdGFsIC0gMSkgPDwgVkVSX1RPVEFMX0JJVCk7CisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KFNDVV9CQVNFLCBDUlQxX1ZFUl9UT1RBTF9FTkRfUkVHICArIG5DUlRJbmRleCoweDYwLCB0ZW1wKTsKKworCXRlbXAgPSAwOworICAgIFJldHJhY2VTdGFydCA9IHZNb2RlVGFibGVbTW9kZUluZGV4XS5WZXJ0aWNhbFRvdGFsIC0gdk1vZGVUYWJsZVtNb2RlSW5kZXhdLlZCYWNrUG9yY2ggLSB2TW9kZVRhYmxlW01vZGVJbmRleF0uVlN5bmNUaW1lIC0gdk1vZGVUYWJsZVtNb2RlSW5kZXhdLlZUb3BCb3JkZXIgLSAxOworICAgIFJldHJhY2VFbmQgPSAoUmV0cmFjZVN0YXJ0ICsgdk1vZGVUYWJsZVtNb2RlSW5kZXhdLlZTeW5jVGltZSk7CisgICAgdGVtcCA9IChSZXRyYWNlRW5kIDw8IFZFUl9SRVRSQUNFX0VORF9CSVQpIHwgKFJldHJhY2VTdGFydCA8PCBWRVJfUkVUUkFDRV9TVEFSVF9CSVQpOworICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChTQ1VfQkFTRSwgQ1JUMV9WRVJfUkVUUkFDRV9SRUcgICsgbkNSVEluZGV4KjB4NjAsIHRlbXApOworCisJLy8gIFNldCBDUlQgRGlzcGxheSBPZmZzZXQgYW5kIFRlcm1pbmFsIENvdW50CisgICAgaWYgKENvbG9yRGVwdGggPT0gUkdCXzU2NSkgeworICAgICAgICBicHAgPSAxNjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGJwcCA9IDMyOworICAgIH0KKworICAgIERpc3BsYXlPZmZzZXQgPSB2TW9kZVRhYmxlW01vZGVJbmRleF0uSG9yaXpvbnRhbEFjdGl2ZSAqIGJwcCAvIDg7CisgICAgVGVybWluYWxDb3VudCA9IHZNb2RlVGFibGVbTW9kZUluZGV4XS5Ib3Jpem9udGFsQWN0aXZlICogYnBwIC8gNjQ7CisgICAgaWYgKENvbG9yRGVwdGggPT0gWVVWXzQ0NCkgeworICAgICAgICBUZXJtaW5hbENvdW50ID0gVGVybWluYWxDb3VudCAqIDMgLyA0OworICAgIH0KKyAgICBpZiAoKCh2TW9kZVRhYmxlW01vZGVJbmRleF0uSG9yaXpvbnRhbEFjdGl2ZSAqIGJwcCkgJSA2NCkgIT0gMCkgeworICAgICAgICBUZXJtaW5hbENvdW50Kys7CisgICAgfQorCisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KFNDVV9CQVNFLCBDUlQxX0RJU1BMQVlfT0ZGU0VUICsgbkNSVEluZGV4KjB4NjAsICgoVGVybWluYWxDb3VudCA8PCBURVJNSU5BTF9DT1VOVF9CSVQpIHwgRGlzcGxheU9mZnNldCkpOworCisJLy8gIFNldCBDb2xvciBGb3JtYXQKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0NsaWVudChTQ1VfQkFTRSwgQ1JUMV9DT05UUk9MX1JFRyArIG5DUlRJbmRleCoweDYwLCAoQ29sb3JEZXB0aCA8PCBGT1JNQVRfU0VMRUNUX0JJVCksIEZPUk1BVF9TRUxFQ1RfTUFTSyk7CisKKwkvLyAgU2V0IFRocmVzaG9sZAorCXRlbXAgPSAwOworICAgIHRlbXAgPSAoQ1JUX0hJR0hfVEhSRVNIT0xEX1ZBTFVFIDw8IFRIUkVTX0hJR0hUX0JJVCkgfCAoQ1JUX0xPV19USFJFU0hPTERfVkFMVUUgPDwgVEhSRVNfTE9XX0JJVCk7CisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KFNDVV9CQVNFLCBDUlQxX1RIUkVTSE9MRF9SRUcgKyBuQ1JUSW5kZXgqMHg2MCwgdGVtcCk7CisKKwlXcml0ZU1lbW9yeUxvbmdDbGllbnQoU0NVX0JBU0UsIENSVDFfVklERU9fUExMX1JFRyArIG5DUlRJbmRleCoweDYwLCBBU1QzMDAwRENMS1RhYmxlVlt2TW9kZVRhYmxlW01vZGVJbmRleF0uUGl4ZWxDbG9ja10pOworfQorCit2b2lkIFNldEFTVENlbnRlcjEwMjRNb2RlVGltaW5nIChVTE9ORyBNTUlPQmFzZSwgaW50IG5DUlRJbmRleCwgQllURSBNb2RlSW5kZXgsIEJZVEUgQ29sb3JEZXB0aCkKK3sKKyAgICBVTE9ORyAgICB0ZW1wLCBSZXRyYWNlU3RhcnQsIFJldHJhY2VFbmQsIERpc3BsYXlPZmZzZXQsIFRlcm1pbmFsQ291bnQsIGJwcDsKKworCS8vICBBY2Nlc3MgQ1JUIEVuZ2luZQorCS8vICBTZXRQb2xhcml0eQorICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLQ2xpZW50KFNDVV9CQVNFLCBDUlQxX0NPTlRST0xfUkVHICsgbkNSVEluZGV4KjB4NjAsIChIT1JfTkVHQVRJVkUgPDwgSE9SX1NZTkNfU0VMRUNUX0JJVCkgfCAoVkVSX05FR0FUSVZFIDw8IFZFUl9TWU5DX1NFTEVDVF9CSVQpLCBIT1JfU1lOQ19TRUxFQ1RfTUFTS3xWRVJfU1lOQ19TRUxFQ1RfTUFTSyk7CisKKwlXcml0ZU1lbW9yeUxvbmdDbGllbnQoU0NVX0JBU0UsIENSVDFfQ09OVFJPTDJfUkVHICsgbkNSVEluZGV4KjB4NjAsIDB4QzApOworCisJLy8gIEhvcml6b250YWwgVGltaW5nCisJdGVtcCA9IDA7CisgICAgdGVtcCA9ICgodk1vZGVUYWJsZVtNb2RlSW5kZXhdLkhvcml6b250YWxBY3RpdmUgLSAxKSA8PCBIT1JfRU5BQkxFX0VORF9CSVQpIHwgKCh2TW9kZVRhYmxlWzEwXS5Ib3Jpem9udGFsVG90YWwgLSAxKSA8PCBIT1JfVE9UQUxfQklUKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoU0NVX0JBU0UsIENSVDFfSE9SX1RPVEFMX0VORF9SRUcgKyBuQ1JUSW5kZXgqMHg2MCwgdGVtcCk7CisKKyAgICBSZXRyYWNlU3RhcnQgPSB2TW9kZVRhYmxlWzEwXS5Ib3Jpem9udGFsVG90YWwgLSB2TW9kZVRhYmxlWzEwXS5IQmFja1BvcmNoIC0gdk1vZGVUYWJsZVsxMF0uSFN5bmNUaW1lIC0gdk1vZGVUYWJsZVsxMF0uSExlZnRCb3JkZXIgLSAxOworICAgIFJldHJhY2VTdGFydCA9IFJldHJhY2VTdGFydCAtICh2TW9kZVRhYmxlWzEwXS5Ib3Jpem9udGFsQWN0aXZlIC0gdk1vZGVUYWJsZVtNb2RlSW5kZXhdLkhvcml6b250YWxBY3RpdmUpIC8gMiAtIDE7CisgICAgUmV0cmFjZUVuZCA9IChSZXRyYWNlU3RhcnQgKyB2TW9kZVRhYmxlWzEwXS5IU3luY1RpbWUpOworCXRlbXAgPSAwOworICAgIHRlbXAgPSAoUmV0cmFjZUVuZCA8PCBIT1JfUkVUUkFDRV9FTkRfQklUKSB8IChSZXRyYWNlU3RhcnQgPDwgSE9SX1JFVFJBQ0VfU1RBUlRfQklUKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoU0NVX0JBU0UsIENSVDFfSE9SX1JFVFJBQ0VfUkVHICsgbkNSVEluZGV4KjB4NjAsIHRlbXApOworCisJLy8gIFZlcnRpY2FsIFRpbWluZworCXRlbXAgPSAwOworICAgIHRlbXAgPSAoKHZNb2RlVGFibGVbTW9kZUluZGV4XS5WZXJ0aWNhbEFjdGl2ZSAtIDEpIDw8IFZFUl9FTkFCTEVfRU5EX0JJVCkgfCAoKHZNb2RlVGFibGVbMTBdLlZlcnRpY2FsVG90YWwgLSAxKSA8PCBWRVJfVE9UQUxfQklUKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoU0NVX0JBU0UsIENSVDFfVkVSX1RPVEFMX0VORF9SRUcgKyBuQ1JUSW5kZXgqMHg2MCwgdGVtcCk7CisKKyAgICBSZXRyYWNlU3RhcnQgPSB2TW9kZVRhYmxlWzEwXS5WZXJ0aWNhbFRvdGFsIC0gdk1vZGVUYWJsZVsxMF0uVkJhY2tQb3JjaCAtIHZNb2RlVGFibGVbMTBdLlZTeW5jVGltZSAtIHZNb2RlVGFibGVbMTBdLlZUb3BCb3JkZXIgLSAxOworICAgIFJldHJhY2VTdGFydCA9IFJldHJhY2VTdGFydCAtICh2TW9kZVRhYmxlWzEwXS5WZXJ0aWNhbEFjdGl2ZSAtIHZNb2RlVGFibGVbTW9kZUluZGV4XS5WZXJ0aWNhbEFjdGl2ZSkgLyAyIC0gMTsKKyAgICBSZXRyYWNlRW5kID0gKFJldHJhY2VTdGFydCArIHZNb2RlVGFibGVbMTBdLlZTeW5jVGltZSk7CisgICAgdGVtcCA9IChSZXRyYWNlRW5kIDw8IFZFUl9SRVRSQUNFX0VORF9CSVQpIHwgKFJldHJhY2VTdGFydCA8PCBWRVJfUkVUUkFDRV9TVEFSVF9CSVQpOworICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChTQ1VfQkFTRSwgQ1JUMV9WRVJfUkVUUkFDRV9SRUcgKyBuQ1JUSW5kZXgqMHg2MCwgdGVtcCk7CisKKwkvLyAgU2V0IENSVCBEaXNwbGF5IE9mZnNldCBhbmQgVGVybWluYWwgQ291bnQKKyAgICBpZiAoQ29sb3JEZXB0aCA9PSBSR0JfNTY1KSB7CisgICAgICAgIGJwcCA9IDE2OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYnBwID0gMzI7CisgICAgfQorICAgIERpc3BsYXlPZmZzZXQgPSB2TW9kZVRhYmxlW01vZGVJbmRleF0uSG9yaXpvbnRhbEFjdGl2ZSAqIGJwcCAvIDg7CisgICAgVGVybWluYWxDb3VudCA9IHZNb2RlVGFibGVbTW9kZUluZGV4XS5Ib3Jpem9udGFsQWN0aXZlICogYnBwIC8gNjQ7CisgICAgaWYgKENvbG9yRGVwdGggPT0gWVVWXzQ0NCkgeworICAgICAgICBUZXJtaW5hbENvdW50ID0gVGVybWluYWxDb3VudCAqIDMgLyA0OworICAgIH0KKyAgICBpZiAoKCh2TW9kZVRhYmxlW01vZGVJbmRleF0uSG9yaXpvbnRhbEFjdGl2ZSAqIGJwcCkgJSA2NCkgIT0gMCkgeworICAgICAgICBUZXJtaW5hbENvdW50Kys7CisgICAgfQorCisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KFNDVV9CQVNFLCBDUlQxX0RJU1BMQVlfT0ZGU0VUICsgbkNSVEluZGV4KjB4NjAsIChUZXJtaW5hbENvdW50IDw8IFRFUk1JTkFMX0NPVU5UX0JJVCkgfCBEaXNwbGF5T2Zmc2V0KTsKKworCS8vICBTZXQgQ29sb3IgRm9ybWF0CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoU0NVX0JBU0UsIENSVDFfQ09OVFJPTF9SRUcgKyBuQ1JUSW5kZXgqMHg2MCwgKENvbG9yRGVwdGggPDwgRk9STUFUX1NFTEVDVF9CSVQpLCBGT1JNQVRfU0VMRUNUX01BU0spOworCisJLy8gIFNldCBUaHJlc2hvbGQKKwl0ZW1wID0gMDsKKyAgICB0ZW1wID0gKENSVF9ISUdIX1RIUkVTSE9MRF9WQUxVRSA8PCBUSFJFU19ISUdIVF9CSVQpIHwgKENSVF9MT1dfVEhSRVNIT0xEX1ZBTFVFIDw8IFRIUkVTX0xPV19CSVQpOworICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChTQ1VfQkFTRSwgQ1JUMV9USFJFU0hPTERfUkVHICsgbkNSVEluZGV4KjB4NjAsIHRlbXApOworICAgIAorCS8vIFNldCBEQ0xLCisJV3JpdGVNZW1vcnlMb25nQ2xpZW50KFNDVV9CQVNFLCBDUlQxX1ZJREVPX1BMTF9SRUcgKyBuQ1JUSW5kZXgqMHg2MCwgQVNUMzAwMERDTEtUYWJsZVZbdk1vZGVUYWJsZVtNb2RlSW5kZXhdLlBpeGVsQ2xvY2tdKTsKKworfQorCitCT09MICBBU1RTZXRNb2RlViAoVUxPTkcgTU1JT0Jhc2UsIGludCBuQ1JUSW5kZXgsIFVMT05HIFZHQUJhc2VBZGRyLCBVU0hPUlQgSG9yaXpvbnRhbCwgVVNIT1JUIFZlcnRpY2FsLCBCWVRFIENvbG9yRm9ybWF0LCBCWVRFIENlbnRlck1vZGUpCit7CisgICAgQllURSAgICBpLCBNb2RlSW5kZXg7CisgICAgQk9PTAliREFDOwkKKyAgICBVTE9ORyAgIHVsVGVtcDsKKworICAgIC8vICBBY2Nlc3MgQ1JUIEVuZ2luZQorICAgIC8vRW5hYmxlIENSVDEgZ3JhcGgKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0NsaWVudChTQ1VfQkFTRSwgQ1JUMV9DT05UUk9MX1JFRyArIDB4NjAqbkNSVEluZGV4LCBHUkFQSF9ESVNQTEFZX09OLCBHUkFQSF9ESVNQTEFZX01BU0spOworICAgIAorICAgIC8vICBTZXQgQ1JUIERpc3BsYXkgU3RhcnQgQWRkcmVzcworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLQ2xpZW50KFNDVV9CQVNFLCBDUlQxX0RJU1BMQVlfQUREUkVTUyArIDB4NjAqbkNSVEluZGV4LCBWR0FCYXNlQWRkciwgRElTUExBWV9BRERSRVNTX01BU0spOworCisgICAgZm9yIChpID0gMDsgaSA8IE1vZGU2MEhaQ291bnQ7IGkrKykgeworICAgICAgICBpZiAoKHZNb2RlVGFibGVbaV0uSG9yaXpvbnRhbEFjdGl2ZSA9PSBIb3Jpem9udGFsKSAmJiAodk1vZGVUYWJsZVtpXS5WZXJ0aWNhbEFjdGl2ZSA9PSBWZXJ0aWNhbCkpIHsKKworCSAgICBNb2RlSW5kZXggPSBpOworCisgICAgICAgICAgICBpZiAoQ2VudGVyTW9kZSAhPSAxKSB7CisgICAgICAgICAgICAgICAgU2V0QVNUTW9kZVRpbWluZyhNTUlPQmFzZSwgbkNSVEluZGV4LCBpLCBDb2xvckZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBTZXRBU1RDZW50ZXIxMDI0TW9kZVRpbWluZyAoTU1JT0Jhc2UsIG5DUlRJbmRleCwgaSwgQ29sb3JGb3JtYXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3VzZSBpbnRlcm5hbCB2aWRlbyBvdXQgc2lnYWwgYW5kIGRvbid0IG5lZWQgdXNlIDczMDEKKyAgICAgICAgICAgIC8qCisJCQliREFDID0gQ2hlY2tEQUMobkNSVEluZGV4KTsKKyAgICAgICAgICAgIAorCQkJU2V0Q0g3MzAxQygwLAorCQkJCW5DUlRJbmRleCwKKwkJCQl2TW9kZVRhYmxlW01vZGVJbmRleF0uUGl4ZWxDbG9jaywKKwkJCQliREFDKTsJCS8vRm9yIFJHQgorCQkJKi8JCisJCQlyZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBGQUxTRTsKK30KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDIzMDAvY3J0LmggYi9ib2FyZC9hc3BlZWQvYXN0MjMwMC9jcnQuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNzQ4M2JlCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvY3J0LmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2lmbmRlZiBfQ1JUX0hfCisjZGVmaW5lIF9DUlRfSF8KKworI2lmZGVmIFdhdGNvbQorI2RlZmluZQkJQ1JUX1JFTUFQX09GRlNFVAkweDEwMDAwCisjZWxzZQorI2RlZmluZQkJQ1JUX1JFTUFQX09GRlNFVAkweDAKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICBDUlQgcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCQlDUlRfQkFTRV9PRkZTRVQJCQkJCQkweDYwMDArQ1JUX1JFTUFQX09GRlNFVAorCisjZGVmaW5lCQlDUlQxX0NPTlRST0xfUkVHCQkJCQkweDAwICsgQ1JUX0JBU0VfT0ZGU0VUCisJI2RlZmluZQkJR1JBUEhfRElTUExBWV9CSVQJCQkJMAorCSNkZWZpbmUgICAgIEdSQVBIX0RJU1BMQVlfTUFTSwkJCQkoMTw8MCkKKwkJI2RlZmluZQkJR1JBUEhfRElTUExBWV9PTgkJCTEKKwkJI2RlZmluZQkJR1JBUEhfRElTUExBWV9PRkYJCQkwCisgICAgI2RlZmluZSAgICAgRk9STUFUX1NFTEVDVF9CSVQgICAgICAgICAgICAgICA4CisgICAgI2RlZmluZSAgICAgRk9STUFUX1NFTEVDVF9NQVNLICAgICAgICAgICAgICAoMzw8OCkgICAKKwkjZGVmaW5lCQlIT1JfU1lOQ19TRUxFQ1RfQklUCQkJCTE2CisgICAgI2RlZmluZQkJSE9SX1NZTkNfU0VMRUNUX01BU0sJCQkoMTw8MTYpCQorCQkjZGVmaW5lCQlIT1JfTkVHQVRJVkUJCQkJMQorCQkjZGVmaW5lCQlIT1JfUE9TSVRJVkUJCQkJMAorCSNkZWZpbmUJCVZFUl9TWU5DX1NFTEVDVF9CSVQJCQkJMTcKKyAgICAjZGVmaW5lCQlWRVJfU1lOQ19TRUxFQ1RfTUFTSwkJCSgxPDwxNykJCisJCSNkZWZpbmUJCVZFUl9ORUdBVElWRQkJCQkxCisJCSNkZWZpbmUJCVZFUl9QT1NJVElWRQkJCQkwCisKKyNkZWZpbmUJCUNSVDFfQ09OVFJPTDJfUkVHCQkJCQkweDA0ICsgQ1JUX0JBU0VfT0ZGU0VUCisgICAgICAgIAorI2RlZmluZSAgICAgQ1JUMV9WSURFT19QTExfUkVHICAgICAgICAgICAgICAgICAgMHgwQyArIENSVF9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIFBPU1RfRElWX0JJVCAgICAgICAgICAgICAgICAgICAgMTgKKyAgICAjZGVmaW5lICAgICBQT1NUX0RJVl9NQVNLICAgICAgICAgICAgICAgICAgIDM8PDE4CisgICAgICAgICNkZWZpbmUgICAgIERJVl8xXzEgICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgIC8vI2RlZmluZSAgICAgRElWXzFfMiAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAgICAgI2RlZmluZSAgICAgRElWXzFfMiAgICAgICAgICAgICAgICAgICAgIDIKKyAgICAgICAgI2RlZmluZSAgICAgRElWXzFfNCAgICAgICAgICAgICAgICAgICAgIDMKKyAgICAgICAgCisjZGVmaW5lICAgICBDUlQxX0hPUl9UT1RBTF9FTkRfUkVHICAgICAgICAgICAgICAweDEwICsgQ1JUX0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgSE9SX1RPVEFMX0JJVCAgICAgICAgICAgICAgICAgICAwCisgICAgI2RlZmluZSAgICAgSE9SX0VOQUJMRV9FTkRfQklUICAgICAgICAgICAgICAxNgorCisjZGVmaW5lICAgICBDUlQxX0hPUl9SRVRSQUNFX1JFRyAgICAgICAgICAgICAgICAweDE0ICsgQ1JUX0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgSE9SX1JFVFJBQ0VfU1RBUlRfQklUICAgICAgICAgICAwCisgICAgI2RlZmluZSAgICAgSE9SX1JFVFJBQ0VfRU5EX0JJVCAgICAgICAgICAgICAxNgorCisjZGVmaW5lICAgICBDUlQxX1ZFUl9UT1RBTF9FTkRfUkVHICAgICAgICAgICAgICAweDE4ICsgQ1JUX0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgVkVSX1RPVEFMX0JJVCAgICAgICAgICAgICAgICAgICAwCisgICAgI2RlZmluZSAgICAgVkVSX0VOQUJMRV9FTkRfQklUICAgICAgICAgICAgICAxNgorCisjZGVmaW5lICAgICBDUlQxX1ZFUl9SRVRSQUNFX1JFRyAgICAgICAgICAgICAgICAweDFDICsgQ1JUX0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgVkVSX1JFVFJBQ0VfU1RBUlRfQklUICAgICAgICAgICAwCisgICAgI2RlZmluZSAgICAgVkVSX1JFVFJBQ0VfRU5EX0JJVCAgICAgICAgICAgICAxNgorCisjZGVmaW5lICAgICBDUlQxX0RJU1BMQVlfQUREUkVTUwkJCQkweDIwICsgQ1JUX0JBU0VfT0ZGU0VUCisJI2RlZmluZQkJRElTUExBWV9BRERSRVNTX01BU0sJCQkweDBGRkZGRkZGCisKKyNkZWZpbmUgICAgIENSVDFfRElTUExBWV9PRkZTRVQgICAgICAgICAgICAgICAgIDB4MjQgKyBDUlRfQkFTRV9PRkZTRVQKKyAgICAjZGVmaW5lICAgICBESVNQTEFZX09GRlNFVF9BTElHTiAgICAgICAgICAgIDcgLyogOCBieXRlIGFsaWdubWVudCovCisgICAgI2RlZmluZSAgICAgVEVSTUlOQUxfQ09VTlRfQklUICAgICAgICAgICAgICAxNiAgICAKKworI2RlZmluZSAgICAgQ1JUMV9USFJFU0hPTERfUkVHICAgICAgICAgICAgICAgICAgMHgyOCArIENSVF9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIFRIUkVTX0xPV19CSVQgICAgICAgICAgICAgICAgICAgMAorICAgICNkZWZpbmUgICAgIFRIUkVTX0hJR0hUX0JJVCAgICAgICAgICAgICAgICAgOAorCisjZGVmaW5lICAgIENVUlNPUl9QT1NJVElPTiAgICAgICAgICAgICAgICAgIDB4MzAgKyBPRkZTRVQKKyNkZWZpbmUgICAgQ1VSU09SX09GRlNFVCAgICAgICAgICAgICAgICAgICAgMHgzNCArIE9GRlNFVAorI2RlZmluZSAgICBDVVJTT1JfUEFUVEVSTiAgICAgICAgICAgICAgICAgICAweDM4ICsgT0ZGU0VUCisjZGVmaW5lICAgIE9TRF9IT1JJWk9OVEFMICAgICAgICAgICAgICAgICAgIDB4NDAgKyBPRkZTRVQKKyNkZWZpbmUgICAgT1NEX1ZFUlRJQ0FMICAgICAgICAgICAgICAgICAgICAgMHg0NCArIE9GRlNFVAorI2RlZmluZSAgICBPU0RfUEFUVEVSTiAgICAgICAgICAgICAgICAgICAgICAweDQ4ICsgT0ZGU0VUCisjZGVmaW5lICAgIE9TRF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDB4NEMgKyBPRkZTRVQKKyNkZWZpbmUgICAgT1NEX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgICAgMHg1MCArIE9GRlNFVAorCisvL0NoNzMwMWMKKyNkZWZpbmUJCURFVklDRV9BRERSRVNTX0NINzMwMV9DUlQxCTB4RUEKKyNkZWZpbmUJCURFVklDRV9BRERSRVNTX0NINzMwMV9DUlQyCTB4RUMKKworCisjZGVmaW5lCQlERVZJQ0VfU0VMRUNUX0NINzMwMQkJMHgzCisKKy8qIENINzMwMSBSZWdpc3RlciBEZWZpbml0aW9uICovCisjZGVmaW5lICAgICBDSDczMDFfQ0RfUkVHCQkJCTB4MjAKKwkjZGVmaW5lICAgICBDRF9EQUNUCQkJCQkweDBFCisJI2RlZmluZQkJQ0RfRFZJVAkJCQkJMSA8PCA1CisjZGVmaW5lICAgICBDSDczMDFfRENfUkVHCQkJCTB4MjEKKyNkZWZpbmUgICAgIENINzMwMV9QTV9SRUcJCQkJMHg0OQorCitCT09MIENoZWNrSG90UGx1ZyhpbnQgbkNSVEluZGV4KTsKK0JPT0wgQ2hlY2tEQUMoaW50IG5DUlRJbmRleCk7CisKK0JPT0wgIEFTVFNldE1vZGVWIChVTE9ORyBNTUlPQmFzZSwgCisgICAgICAgICAgICAgICAgaW50IG5DUlRJbmRleCwgCisgICAgICAgICAgICAgICAgVUxPTkcgVkdBQmFzZUFkZHIsIAorICAgICAgICAgICAgICAgIFVTSE9SVCBIb3Jpem9udGFsLCAKKyAgICAgICAgICAgICAgICBVU0hPUlQgVmVydGljYWwsIAorICAgICAgICAgICAgICAgIEJZVEUgQ29sb3JGb3JtYXQsIAorICAgICAgICAgICAgICAgIEJZVEUgQ2VudGVyTW9kZSk7CisgICAgICAgICAgICAgICAgCitCT09MICBTZWxDUlRDbG9jayhVTE9ORyBNTUlPQmFzZSwKKwkJCQkgIGludAluQ1JUSW5kZXgsCisJCQkJICBVU0hPUlQgSG9yaXpvbnRhbCwgCisJCQkJICBVU0hPUlQgVmVydGljYWwpOworCit2b2lkIERpc2FibGVDUlQoVUxPTkcgTU1JT0Jhc2UsIGludCBuQ1JUSW5kZXgpOwordm9pZCBDbGVhckNSVFdpdGhCbGFjayhVTE9ORyB1bENSVEFkZHIsIGludCBpV2lkdGgsIGludCBpSGVpZ2h0KTsKKworI2VuZGlmIC8qIF9DUlRfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDIzMDAvZmxhc2guYyBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL2ZsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDYxMWQwZAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL2ZsYXNoLmMKQEAgLTAsMCArMSwxNjUxIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEhpc3RvcnkKKyAqIDAxLzIwLzIwMDQgLSBjb21iaW5lZCB2YXJpYW50cyBvZiBvcmlnaW5hbCBkcml2ZXIuCisgKiAwMS8yMi8yMDA0IC0gV3JpdGUgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzIGZvciBwYXJhbGxlbCBjaGlwcyAoVG9sdW5heSkKKyAqIDAxLzIzLzIwMDQgLSBTdXBwb3J0IGZvciB4OC94MTYgY2hpcHMgKFJ1bmUgUmFrbmVydWQpCisgKiAwMS8yNy8yMDA0IC0gTGl0dGxlIGVuZGlhbiBzdXBwb3J0IEVkIE9rZXJzb24KKyAqCisgKiBUZXN0ZWQgQXJjaGl0ZWN0dXJlcworICogUG9ydCBXaWR0aCAgQ2hpcCBXaWR0aCAgICAjIG9mIGJhbmtzCSAgIEZsYXNoIENoaXAgIEJvYXJkCisgKiAzMgkgICAgICAgMTYJICAgICAxCQkgICAyOEYxMjhKMyAgICBzZXJhbm9hL2VhZ2xlCisgKiA2NAkgICAgICAgMTYJICAgICAxCQkgICAyOEYxMjhKMyAgICBzZXJhbm9hL2ZhbGNvbgorICovCisvLyAoU3VuKSBUaGlzIENGSSBkcml2ZXIgaXMgd3JpdHRlbiBmb3IgZml4ZWQtd2lkdGggZmxhc2ggY2hpcHMuCisvLyBJdCB3YXMgbm90IGRlc2lnbmVkIGZvciBmbGV4aWJsZSA4LWJpdC8xNi1iaXQgY2hpcHMsIHdoaWNoIGFyZSB0aGUgbm9ybS4KKy8vIFdoZW4gdGhvc2UgY2hpcHMgYXJlIGNvbm5lY3RlZCB0byBhIGJ1cyBpbiA4LWJpdCBtb2RlLCB0aGUgYWRkcmVzcyB3aXJlcworLy8gcmlnaHQtc2hpZnRlZCBieSAxLgorLy9GSVhNRTogRml4IHRoZSBkcml2ZXIgdG8gYXV0by1kZXRlY3QgIjE2LWJpdCBmbGFzaCB3aXJlZCBpbiA4LWJpdCBtb2RlIi4KKy8vIExlZnQtc2hpZnQgQ0ZJIG9mZnNldHMgYnkgMSBiaXQgaW5zdGVhZCBvZiBkb3VibGluZyB0aGUgI2RlZmluZSB2YWx1ZXMuCisKKy8qIFRoZSBERUJVRyBkZWZpbmUgbXVzdCBiZSBiZWZvcmUgY29tbW9uIHRvIGVuYWJsZSBkZWJ1Z2dpbmcgKi8KKy8vIChTdW4pIENoYW5nZWQgdG8gREVCVUdfRkxBU0ggYmVjYXVzZSBmbGFzaCBkZWJ1ZygpcyBhcmUgdG9vIG51bWVyb3VzLgorLy8gI2RlZmluZSBERUJVRworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxlbnZpcm9ubWVudC5oPgorI2lmZGVmCUNPTkZJR19TWVNfRkxBU0hfQ0ZJCisKKy8qCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIENvbW1vbiBGbGFzaCBJbnRlcmZhY2UgKENGSSkgZHJpdmVyIGZvciBVLUJvb3QuCisgKiBUaGUgd2lkdGggb2YgdGhlIHBvcnQgYW5kIHRoZSB3aWR0aCBvZiB0aGUgY2hpcHMgYXJlIGRldGVybWluZWQgYXQgaW5pdGlhbGl6YXRpb24uCisgKiBUaGVzZSB3aWR0aHMgYXJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBhZGRyZXNzIGZvciBhY2Nlc3MgQ0ZJIGRhdGEgc3RydWN0dXJlcy4KKyAqIEl0IGhhcyBiZWVuIHRlc3RlZCBvbiBhbiBJbnRlbCBTdHJhdGFmbGFzaCBpbXBsZW1lbnRhdGlvbiBhbmQgQU1EIDI5RjAxNkQuCisgKgorICogUmVmZXJlbmNlcworICogSkVERUMgU3RhbmRhcmQgSkVTRDY4IC0gQ29tbW9uIEZsYXNoIEludGVyZmFjZSAoQ0ZJKQorICogSkVERUMgU3RhbmRhcmQgSkVQMTM3LUEgQ29tbW9uIEZsYXNoIEludGVyZmFjZSAoQ0ZJKSBJRCBDb2RlcworICogSW50ZWwgQXBwbGljYXRpb24gTm90ZSA2NDYgQ29tbW9uIEZsYXNoIEludGVyZmFjZSAoQ0ZJKSBhbmQgQ29tbWFuZCBTZXRzCisgKiBJbnRlbCAyOTA2NjctMDA4IDMgVm9sdCBJbnRlbCBTdHJhdGFGbGFzaCBNZW1vcnkgZGF0YXNoZWV0CisgKgorICogVE9ETworICoKKyAqIFVzZSBQcmltYXJ5IEV4dGVuZGVkIFF1ZXJ5IHRhYmxlIChQUkkpIGFuZCBBbHRlcm5hdGUgQWxnb3JpdGhtIFF1ZXJ5CisgKiBUYWJsZSAoQUxUKSB0byBkZXRlcm1pbmUgaWYgcHJvdGVjdGlvbiBpcyBhdmFpbGFibGUKKyAqCisgKiBBZGQgc3VwcG9ydCBmb3Igb3RoZXIgY29tbWFuZCBzZXRzIFVzZSB0aGUgUFJJIGFuZCBBTFQgdG8gZGV0ZXJtaW5lIGNvbW1hbmQgc2V0CisgKiBWZXJpZnkgZXJhc2UgYW5kIHByb2dyYW0gdGltZW91dHMuCisgKi8KKworI2lmbmRlZiBDT05GSUdfRkxBU0hfQkFOS1NfTElTVAorI2RlZmluZSBDT05GSUdfRkxBU0hfQkFOS1NfTElTVCB7IENPTkZJR19TWVNfRkxBU0hfQkFTRSB9CisjZW5kaWYKKworI2RlZmluZSBGTEFTSF9DTURfQ0ZJCQkJMHg5OAorI2RlZmluZSBGTEFTSF9DTURfUkVBRF9JRAkJMHg5MAorI2RlZmluZSBGTEFTSF9DTURfUkVTRVQJCQkweGZmCisjZGVmaW5lIEZMQVNIX0NNRF9CTE9DS19FUkFTRQkJMHgyMAorI2RlZmluZSBGTEFTSF9DTURfRVJBU0VfQ09ORklSTQkJMHhEMAorI2RlZmluZSBGTEFTSF9DTURfV1JJVEUJCQkweDQwCisjZGVmaW5lIEZMQVNIX0NNRF9QUk9URUNUCQkweDYwCisjZGVmaW5lIEZMQVNIX0NNRF9QUk9URUNUX1NFVAkJMHgwMQorI2RlZmluZSBGTEFTSF9DTURfUFJPVEVDVF9DTEVBUgkJMHhEMAorI2RlZmluZSBGTEFTSF9DTURfQ0xFQVJfU1RBVFVTCQkweDUwCisjZGVmaW5lIEZMQVNIX0NNRF9XUklURV9UT19CVUZGRVIJMHhFOAorI2RlZmluZSBGTEFTSF9DTURfV1JJVEVfQlVGRkVSX0NPTkZJUk0JMHhEMAorCisjZGVmaW5lIEZMQVNIX1NUQVRVU19ET05FCQkweDgwCisjZGVmaW5lIEZMQVNIX1NUQVRVU19FU1MJCTB4NDAKKyNkZWZpbmUgRkxBU0hfU1RBVFVTX0VDTEJTCQkweDIwCisjZGVmaW5lIEZMQVNIX1NUQVRVU19QU0xCUwkJMHgxMAorI2RlZmluZSBGTEFTSF9TVEFUVVNfVlBFTlMJCTB4MDgKKyNkZWZpbmUgRkxBU0hfU1RBVFVTX1BTUwkJMHgwNAorI2RlZmluZSBGTEFTSF9TVEFUVVNfRFBTCQkweDAyCisjZGVmaW5lIEZMQVNIX1NUQVRVU19SCQkJMHgwMQorI2RlZmluZSBGTEFTSF9TVEFUVVNfUFJPVEVDVAkJMHgwMQorCisjZGVmaW5lIEFNRF9DTURfUkVTRVQJCQkweEYwCisjZGVmaW5lIEFNRF9DTURfV1JJVEUJCQkweEEwCisjZGVmaW5lIEFNRF9DTURfRVJBU0VfU1RBUlQJCTB4ODAKKyNkZWZpbmUgQU1EX0NNRF9FUkFTRV9TRUNUT1IJCTB4MzAKKyNkZWZpbmUgQU1EX0NNRF9VTkxPQ0tfU1RBUlQJCTB4QUEKKyNkZWZpbmUgQU1EX0NNRF9VTkxPQ0tfQUNLCQkweDU1CisjZGVmaW5lIEFNRF9DTURfV1JJVEVfVE9fQlVGRkVSCQkweDI1CisjZGVmaW5lIEFNRF9DTURfQlVGRkVSX1RPX0ZMQVNICQkweDI5CisKKyNkZWZpbmUgQU1EX1NUQVRVU19UT0dHTEUJCTB4NDAKKyNkZWZpbmUgQU1EX1NUQVRVU19FUlJPUgkJMHgyMAorLy9GSVhNRTogVGhlc2UgMyB3ZXJlIGFsc28gY2hhbmdlZCBmb3IgOC1iaXQvMTYtYml0IGZsYXNoIGNoaXBzLgorI2RlZmluZSBBTURfQUREUl9FUkFTRV9TVEFSVAkJKDB4QUFBL2luZm8tPnBvcnR3aWR0aCkKKyNkZWZpbmUgQU1EX0FERFJfU1RBUlQJCQkoMHhBQUEvaW5mby0+cG9ydHdpZHRoKQorI2RlZmluZSBBTURfQUREUl9BQ0sJCQkoMHg1NTUvaW5mby0+cG9ydHdpZHRoKQorCisvL0ZJWE1FOiBGaXggdGhlIGRyaXZlciB0byBhdXRvLWRldGVjdCAiMTYtYml0IGZsYXNoIHdpcmVkIGluIDgtYml0IG1vZGUiLgorLy8gTGVmdC1zaGlmdCBDRkkgb2Zmc2V0cyBieSAxIGJpdCBpbnN0ZWFkIG9mIGRvdWJsaW5nIHRoZSAjZGVmaW5lIHZhbHVlcy4KKyNkZWZpbmUgRkxBU0hfT0ZGU0VUX0NGSQkJKDB4QUEvaW5mby0+cG9ydHdpZHRoKQorI2RlZmluZSBGTEFTSF9PRkZTRVRfQ0ZJX1JFU1AJCSgweDIwL2luZm8tPnBvcnR3aWR0aCkKKyNkZWZpbmUgRkxBU0hfT0ZGU0VUX0NGSV9SRVNQMQkJKDB4MjIvaW5mby0+cG9ydHdpZHRoKQorI2RlZmluZSBGTEFTSF9PRkZTRVRfQ0ZJX1JFU1AyCQkoMHgyNC9pbmZvLT5wb3J0d2lkdGgpCisjZGVmaW5lIEZMQVNIX09GRlNFVF9QUklNQVJZX1ZFTkRPUgkoMHgyNi9pbmZvLT5wb3J0d2lkdGgpCisjZGVmaW5lIEZMQVNIX09GRlNFVF9XVE9VVAkJKDB4M0UvaW5mby0+cG9ydHdpZHRoKQorI2RlZmluZSBGTEFTSF9PRkZTRVRfV0JUT1VUCQkoMHg0MC9pbmZvLT5wb3J0d2lkdGgpCisjZGVmaW5lIEZMQVNIX09GRlNFVF9FVE9VVAkJKDB4NDIvaW5mby0+cG9ydHdpZHRoKQorI2RlZmluZSBGTEFTSF9PRkZTRVRfQ0VUT1VUCQkoMHg0NC9pbmZvLT5wb3J0d2lkdGgpCisjZGVmaW5lIEZMQVNIX09GRlNFVF9XTUFYX1RPVVQJCSgweDQ2L2luZm8tPnBvcnR3aWR0aCkKKyNkZWZpbmUgRkxBU0hfT0ZGU0VUX1dCTUFYX1RPVVQJCSgweDQ4L2luZm8tPnBvcnR3aWR0aCkKKyNkZWZpbmUgRkxBU0hfT0ZGU0VUX0VNQVhfVE9VVAkJKDB4NEEvaW5mby0+cG9ydHdpZHRoKQorI2RlZmluZSBGTEFTSF9PRkZTRVRfQ0VNQVhfVE9VVAkJKDB4NEMvaW5mby0+cG9ydHdpZHRoKQorI2RlZmluZSBGTEFTSF9PRkZTRVRfU0laRQkJKDB4NEUvaW5mby0+cG9ydHdpZHRoKQorI2RlZmluZSBGTEFTSF9PRkZTRVRfSU5URVJGQUNFCQkoMHg1MC9pbmZvLT5wb3J0d2lkdGgpCisjZGVmaW5lIEZMQVNIX09GRlNFVF9CVUZGRVJfU0laRQkoMHg1NC9pbmZvLT5wb3J0d2lkdGgpCisjZGVmaW5lIEZMQVNIX09GRlNFVF9OVU1fRVJBU0VfUkVHSU9OUwkoMHg1OC9pbmZvLT5wb3J0d2lkdGgpCisjZGVmaW5lIEZMQVNIX09GRlNFVF9FUkFTRV9SRUdJT05TCSgweDVBL2luZm8tPnBvcnR3aWR0aCkKKyNkZWZpbmUgRkxBU0hfT0ZGU0VUX1BST1RFQ1QJCSgweDAyL2luZm8tPnBvcnR3aWR0aCkKKyNkZWZpbmUgRkxBU0hfT0ZGU0VUX1VTRVJfUFJPVEVDVElPTgkoMHg4NS9pbmZvLT5wb3J0d2lkdGgpCisjZGVmaW5lIEZMQVNIX09GRlNFVF9JTlRFTF9QUk9URUNUSU9OCSgweDgxL2luZm8tPnBvcnR3aWR0aCkKKworI2RlZmluZSBNQVhfTlVNX0VSQVNFX1JFR0lPTlMJCTQKKworI2RlZmluZSBGTEFTSF9NQU5fQ0ZJCQkJMHgwMTAwMDAwMAorCisjZGVmaW5lIENGSV9DTURTRVRfTk9ORQkJICAgIDAKKyNkZWZpbmUgQ0ZJX0NNRFNFVF9JTlRFTF9FWFRFTkRFRCAgIDEKKyNkZWZpbmUgQ0ZJX0NNRFNFVF9BTURfU1RBTkRBUkQJICAgIDIKKyNkZWZpbmUgQ0ZJX0NNRFNFVF9JTlRFTF9TVEFOREFSRCAgIDMKKyNkZWZpbmUgQ0ZJX0NNRFNFVF9BTURfRVhURU5ERUQJICAgIDQKKyNkZWZpbmUgQ0ZJX0NNRFNFVF9NSVRTVV9TVEFOREFSRCAgIDI1NgorI2RlZmluZSBDRklfQ01EU0VUX01JVFNVX0VYVEVOREVEICAgMjU3CisjZGVmaW5lIENGSV9DTURTRVRfU1NUCQkgICAgMjU4CisKKworI2lmZGVmIENPTkZJR19TWVNfRkxBU0hfQ0ZJX0FNRF9SRVNFVCAvKiBuZWVkZWQgZm9yIFNUTV9JRF8yOVczMjBEQiBvbiBVQzEwMCAqLworIyB1bmRlZiAgRkxBU0hfQ01EX1JFU0VUCisjIGRlZmluZSBGTEFTSF9DTURfUkVTRVQgICAgICAgICAgICAgICAgQU1EX0NNRF9SRVNFVCAvKiB1c2UgQU1ELVJlc2V0IGluc3RlYWQgKi8KKyNlbmRpZgorCisKK3R5cGVkZWYgdW5pb24geworCXVuc2lnbmVkIGNoYXIgYzsKKwl1bnNpZ25lZCBzaG9ydCB3OworCXVuc2lnbmVkIGxvbmcgbDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbGw7Cit9IGNmaXdvcmRfdDsKKwordHlwZWRlZiB1bmlvbiB7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqY3A7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKndwOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmxwOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbG9uZyAqbGxwOworfSBjZmlwdHJfdDsKKworLyogdXNlIENGR19NQVhfRkxBU0hfQkFOS1NfREVURUNUIGlmIGRlZmluZWQgKi8KKyNpZmRlZiBDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LU19ERVRFQ1QKK3N0YXRpYyB1bG9uZyBiYW5rX2Jhc2VbQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1NfREVURUNUXSA9IENPTkZJR19GTEFTSF9CQU5LU19MSVNUOworZmxhc2hfaW5mb190IGZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU19ERVRFQ1RdOwkvKiBGTEFTSCBjaGlwcyBpbmZvICovCisjZWxzZQorc3RhdGljIHVsb25nIGJhbmtfYmFzZVtDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LU10gPSBDT05GSUdfRkxBU0hfQkFOS1NfTElTVDsKK2ZsYXNoX2luZm9fdCBmbGFzaF9pbmZvW0NPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTXTsJCS8qIEZMQVNIIGNoaXBzIGluZm8gKi8KKyNlbmRpZgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZCBmbGFzaF9hZGRfYnl0ZSAoZmxhc2hfaW5mb190ICogaW5mbywgY2Zpd29yZF90ICogY3dvcmQsIHVjaGFyIGMpOworc3RhdGljIHZvaWQgZmxhc2hfbWFrZV9jbWQgKGZsYXNoX2luZm9fdCAqIGluZm8sIHVjaGFyIGNtZCwgdm9pZCAqY21kYnVmKTsKK3N0YXRpYyB2b2lkIGZsYXNoX3dyaXRlX2NtZCAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3QsIHVpbnQgb2Zmc2V0LCB1Y2hhciBjbWQpOworc3RhdGljIHZvaWQgZmxhc2hfd3JpdGVfY21kX25vZGJnIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdCwgdWludCBvZmZzZXQsIHVjaGFyIGNtZCk7CitzdGF0aWMgdm9pZCBmbGFzaF93cml0ZV9jbWRfaW50IChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdCwgdWludCBvZmZzZXQsIHVjaGFyIGNtZCwgaW50IG5vRGVidWcpOworc3RhdGljIHZvaWQgZmxhc2hfdW5sb2NrX3NlcSAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3QpOworc3RhdGljIGludCBmbGFzaF9pc2VxdWFsIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdCwgdWludCBvZmZzZXQsIHVjaGFyIGNtZCk7CitzdGF0aWMgaW50IGZsYXNoX2lzc2V0IChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdCwgdWludCBvZmZzZXQsIHVjaGFyIGNtZCk7CitzdGF0aWMgaW50IGZsYXNoX3RvZ2dsZSAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3QsIHVpbnQgb2Zmc2V0LCB1Y2hhciBjbWQpOworc3RhdGljIGludCBmbGFzaF9kZXRlY3RfY2ZpIChmbGFzaF9pbmZvX3QgKiBpbmZvKTsKK3Vsb25nIGZsYXNoX2dldF9zaXplICh1bG9uZyBiYXNlLCBpbnQgYmFua251bSk7CitzdGF0aWMgaW50IGZsYXNoX3dyaXRlX2NmaXdvcmQgKGZsYXNoX2luZm9fdCAqIGluZm8sIHVsb25nIGRlc3QsIGNmaXdvcmRfdCBjd29yZCk7CitzdGF0aWMgaW50IGZsYXNoX2Z1bGxfc3RhdHVzX2NoZWNrIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdG9yLAorCQkJCSAgICB1bG9uZyB0b3V0LCBjaGFyICpwcm9tcHQpOworc3RhdGljIHZvaWQgd3JpdGVfYnVmZmVyX2Fib3J0X3Jlc2V0KGZsYXNoX2luZm9fdCAqIGluZm8sIGZsYXNoX3NlY3RfdCBzZWN0b3IpOwkJCQkgICAgCisjaWYgZGVmaW5lZChDRkdfRU5WX0lTX0lOX0ZMQVNIKSB8fCBkZWZpbmVkKENGR19FTlZfQUREUl9SRURVTkQpIHx8IChDRkdfTU9OSVRPUl9CQVNFID49IENGR19GTEFTSF9CQVNFKQorc3RhdGljIGZsYXNoX2luZm9fdCAqZmxhc2hfZ2V0X2luZm8odWxvbmcgYmFzZSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTX0ZMQVNIX1VTRV9CVUZGRVJfV1JJVEUKK3N0YXRpYyBpbnQgZmxhc2hfd3JpdGVfY2ZpYnVmZmVyIChmbGFzaF9pbmZvX3QgKiBpbmZvLCB1bG9uZyBkZXN0LCB1Y2hhciAqIGNwLCBpbnQgbGVuKTsKK3N0YXRpYyBpbnQgZmxhc2hfd3JpdGVfY2ZpYnVmZmVyX2FtZCAoZmxhc2hfaW5mb190ICogaW5mbywgdWxvbmcgZGVzdCwgdWNoYXIgKiBjcCwgaW50IGxlbik7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogY3JlYXRlIGFuIGFkZHJlc3MgYmFzZWQgb24gdGhlIG9mZnNldCBhbmQgdGhlIHBvcnQgd2lkdGgKKyAqLworaW5saW5lIHVjaGFyICpmbGFzaF9tYWtlX2FkZHIgKGZsYXNoX2luZm9fdCAqIGluZm8sIGZsYXNoX3NlY3RfdCBzZWN0LCB1aW50IG9mZnNldCkKK3sKKwlyZXR1cm4gKCh1Y2hhciAqKSAoaW5mby0+c3RhcnRbc2VjdF0gKyAob2Zmc2V0ICogaW5mby0+cG9ydHdpZHRoKSkpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZWJ1ZyBzdXBwb3J0CisgKi8KKyNpZmRlZiBERUJVR19GTEFTSAorc3RhdGljIHZvaWQgcHJpbnRfbG9uZ2xvbmcgKGNoYXIgKnN0ciwgdW5zaWduZWQgbG9uZyBsb25nIGRhdGEpCit7CisJaW50IGk7CisJY2hhciAqY3A7CisKKwljcCA9ICh1bnNpZ25lZCBjaGFyICopICZkYXRhOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXNwcmludGYgKCZzdHJbaSAqIDJdLCAiJTIuMngiLCAqY3ArKyk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoREVCVUdfRkxBU0gpCitzdGF0aWMgdm9pZCBmbGFzaF9wcmludHFyeSAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3QpCit7CisJY2ZpcHRyX3QgY3B0cjsKKwlpbnQgeCwgeTsKKworCWZvciAoeCA9IDA7IHggPCAweDQwOyB4ICs9IDE2VSAvIGluZm8tPnBvcnR3aWR0aCkgeworCQljcHRyLmNwID0KKwkJCWZsYXNoX21ha2VfYWRkciAoaW5mbywgc2VjdCwKKwkJCQkJIHggKyBGTEFTSF9PRkZTRVRfQ0ZJX1JFU1ApOworCQlkZWJ1ZyAoIiVwIDogIiwgY3B0ci5jcCk7CisJCWZvciAoeSA9IDA7IHkgPCAxNjsgeSsrKSB7CisJCQlkZWJ1ZyAoIiUyLjJ4ICIsIGNwdHIuY3BbeV0pOworCQl9CisJCWRlYnVnICgiICIpOworCQlmb3IgKHkgPSAwOyB5IDwgMTY7IHkrKykgeworCQkJaWYgKGNwdHIuY3BbeV0gPj0gMHgyMCAmJiBjcHRyLmNwW3ldIDw9IDB4N2UpIHsKKwkJCQlkZWJ1ZyAoIiVjIiwgY3B0ci5jcFt5XSk7CisJCQl9IGVsc2UgeworCQkJCWRlYnVnICgiLiIpOworCQkJfQorCQl9CisJCWRlYnVnICgiXG4iKTsKKwl9Cit9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcmVhZCBhIGNoYXJhY3RlciBhdCBhIHBvcnQgd2lkdGggYWRkcmVzcworICovCitpbmxpbmUgdWNoYXIgZmxhc2hfcmVhZF91Y2hhciAoZmxhc2hfaW5mb190ICogaW5mbywgdWludCBvZmZzZXQpCit7CisJdWNoYXIgKmNwOworCisJY3AgPSBmbGFzaF9tYWtlX2FkZHIgKGluZm8sIDAsIG9mZnNldCk7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJcmV0dXJuIChjcFswXSk7CisjZWxzZQorCXJldHVybiAoY3BbaW5mby0+cG9ydHdpZHRoIC0gMV0pOworI2VuZGlmCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJlYWQgYSBzaG9ydCB3b3JkIGJ5IHN3YXBwaW5nIGZvciBwcGMgZm9ybWF0LgorICovCisjaWYgMAorc3RhdGljIHVzaG9ydCBmbGFzaF9yZWFkX3VzaG9ydCAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3QsIHVpbnQgb2Zmc2V0KQoreworCXVjaGFyICphZGRyOworCXVzaG9ydCByZXR2YWw7CisKKyNpZmRlZiBERUJVR19GTEFTSAorCWludCB4OworI2VuZGlmCisJYWRkciA9IGZsYXNoX21ha2VfYWRkciAoaW5mbywgc2VjdCwgb2Zmc2V0KTsKKworI2lmZGVmIERFQlVHX0ZMQVNICisJZGVidWcgKCJ1c2hvcnQgYWRkciBpcyBhdCAlcCBpbmZvLT5wb3J0d2lkdGggPSAlZFxuIiwgYWRkciwKKwkgICAgICAgaW5mby0+cG9ydHdpZHRoKTsKKwlmb3IgKHggPSAwOyB4IDwgMiAqIGluZm8tPnBvcnR3aWR0aDsgeCsrKSB7CisJCWRlYnVnICgiYWRkclsleF0gPSAweCV4XG4iLCB4LCBhZGRyW3hdKTsKKwl9CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwlpZiAoaW5mby0+aW50ZXJmYWNlID09IEZMQVNIX0NGSV9YOFgxNikgeworCSAgICByZXR2YWwgPSAoYWRkclswXSB8IChhZGRyWzJdIDw8IDgpKTsKKwl9IGVsc2UgeworCSAgICByZXR2YWwgPSAoYWRkclswXSB8IChhZGRyWyhpbmZvLT5wb3J0d2lkdGgpXSA8PCA4KSk7CisJfQorI2Vsc2UKKwlyZXR2YWwgPSAoKGFkZHJbKDIgKiBpbmZvLT5wb3J0d2lkdGgpIC0gMV0gPDwgOCkgfAorCQkgIGFkZHJbaW5mby0+cG9ydHdpZHRoIC0gMV0pOworI2VuZGlmCisKKwlkZWJ1ZyAoInJldHZhbCA9IDB4JXhcbiIsIHJldHZhbCk7CisJcmV0dXJuIHJldHZhbDsKK30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiByZWFkIGEgbG9uZyB3b3JkIGJ5IHBpY2tpbmcgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgb2YgZWFjaCBtYXhpbXVtCisgKiBwb3J0IHNpemUgd29yZC4gU3dhcCBmb3IgcHBjIGZvcm1hdC4KKyAqLworc3RhdGljIHVsb25nIGZsYXNoX3JlYWRfbG9uZyAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3QsIHVpbnQgb2Zmc2V0KQoreworCXVjaGFyICphZGRyOworCXVsb25nIHJldHZhbDsKKyNpZmRlZiBERUJVR19GTEFTSAorCWludCB4OworI2VuZGlmCisjaWYgMAorCXN3aXRjaCAoaW5mby0+aW50ZXJmYWNlKSB7CisJY2FzZSBGTEFTSF9DRklfWDg6CisJY2FzZSBGTEFTSF9DRklfWDE2OgorCSAgICBicmVhazsKKwljYXNlIEZMQVNIX0NGSV9YOFgxNjoKKwkgICAgb2Zmc2V0IDw8PSAxOworCX0KKyNlbmRpZgkKKwkvLyBmbGFzaF9tYWtlX2FkZHIoKSBtdWx0aXBsaWVzIG9mZnNldCBieSBpbmZvLT5wb3J0d2lkdGguCisJYWRkciA9IGZsYXNoX21ha2VfYWRkciAoaW5mbywgc2VjdCwgb2Zmc2V0KTsKKworI2lmZGVmIERFQlVHX0ZMQVNICisJZGVidWcgKCJsb25nIGFkZHIgaXMgYXQgJXAgaW5mby0+cG9ydHdpZHRoID0gJWRcbiIsIGFkZHIsCisJICAgICAgIGluZm8tPnBvcnR3aWR0aCk7CisJZm9yICh4ID0gMDsgeCA8IDQgKiBpbmZvLT5wb3J0d2lkdGg7IHgrKykgeworCQlkZWJ1ZyAoImFkZHJbJXhdID0gMHgleFxuIiwgeCwgYWRkclt4XSk7CisJfQorI2VuZGlmCisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJaWYgKGluZm8tPmludGVyZmFjZSA9PSBGTEFTSF9DRklfWDhYMTYpIHsKKwkgICAgcmV0dmFsID0gKGFkZHJbMF0gfCAoYWRkclsyXSA8PCA4KSB8IChhZGRyWzRdIDw8IDE2KSB8IChhZGRyWzZdIDw8IDI0KSk7CisJfSBlbHNlIHsKKwkgICAgcmV0dmFsID0gKGFkZHJbMF0gfCAoYWRkclsoaW5mby0+cG9ydHdpZHRoKV0gPDwgOCkgfAorCQkgICAgICAoYWRkclsoMiAqIGluZm8tPnBvcnR3aWR0aCldIDw8IDE2KSB8CisJCSAgICAgIChhZGRyWygzICogaW5mby0+cG9ydHdpZHRoKV0gPDwgMjQpKTsKKwl9CisjZWxzZQorCS8vRklYTUU6IFRoaXMgdW5kb2N1bWVudGVkIGNvZGUgYXBwZWFycyB0byBtYXRjaCBicm9rZW4gYnVzIHdpcmluZy4KKwlyZXR2YWwgPSAoYWRkclsoMiAqIGluZm8tPnBvcnR3aWR0aCkgLSAxXSA8PCAyNCkgfAorCQkoYWRkclsoaW5mby0+cG9ydHdpZHRoKSAtIDFdIDw8IDE2KSB8CisJCShhZGRyWyg0ICogaW5mby0+cG9ydHdpZHRoKSAtIDFdIDw8IDgpIHwKKwkJYWRkclsoMyAqIGluZm8tPnBvcnR3aWR0aCkgLSAxXTsKKyNlbmRpZgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordW5zaWduZWQgbG9uZyBmbGFzaF9pbml0ICh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IDA7CisJaW50IGk7CisKKwkvKiBJbml0OiBubyBGTEFTSGVzIGtub3duICovCisJZm9yIChpID0gMDsgaSA8IENPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTOyArK2kpIHsKKwkJZmxhc2hfaW5mb1tpXS5mbGFzaF9pZCA9IEZMQVNIX1VOS05PV047CisJCXNpemUgKz0gZmxhc2hfaW5mb1tpXS5zaXplID0gZmxhc2hfZ2V0X3NpemUgKGJhbmtfYmFzZVtpXSwgaSk7CisJCWlmIChmbGFzaF9pbmZvW2ldLmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHsKKyNpZm5kZWYgQ0ZHX0ZMQVNIX1FVSUVUX1RFU1QKKwkJCXByaW50ZiAoIiMjIFVua25vd24gRkxBU0ggb24gQmFuayAlZCAtIFNpemUgPSAweCUwOGx4ID0gJWxkIE1CXG4iLAorCQkJCWksIGZsYXNoX2luZm9baV0uc2l6ZSwgZmxhc2hfaW5mb1tpXS5zaXplIDw8IDIwKTsKKyNlbmRpZiAvKiBDRkdfRkxBU0hfUVVJRVRfVEVTVCAqLworCQl9CisJfQorCisJLyogTW9uaXRvciBwcm90ZWN0aW9uIE9OIGJ5IGRlZmF1bHQgKi8KKyNpZiAoQ09ORklHX01PTklUT1JfQkFTRSA+PSBDT05GSUdfU1lTX0ZMQVNIX0JBU0UpCisJZmxhc2hfcHJvdGVjdCAoRkxBR19QUk9URUNUX1NFVCwKKwkJICAgICAgIENPTkZJR19NT05JVE9SX0JBU0UsCisJCSAgICAgICBDT05GSUdfTU9OSVRPUl9CQVNFICsgbW9uaXRvcl9mbGFzaF9sZW4gIC0gMSwKKwkJICAgICAgIGZsYXNoX2dldF9pbmZvKENPTkZJR19NT05JVE9SX0JBU0UpKTsKKyNlbmRpZgorCisJLyogRW52aXJvbm1lbnQgcHJvdGVjdGlvbiBPTiBieSBkZWZhdWx0ICovCisjaWZkZWYgQ09ORklHX0VOVl9JU19JTl9GTEFTSAorCWZsYXNoX3Byb3RlY3QgKEZMQUdfUFJPVEVDVF9TRVQsCisJCSAgICAgICBDT05GSUdfRU5WX0FERFIsCisJCSAgICAgICBDT05GSUdfRU5WX0FERFIgKyBDT05GSUdfRU5WX1NFQ1RfU0laRSAtIDEsCisJCSAgICAgICBmbGFzaF9nZXRfaW5mbyhDT05GSUdfRU5WX0FERFIpKTsKKyNlbmRpZgorCisJLyogUmVkdW5kYW50IGVudmlyb25tZW50IHByb3RlY3Rpb24gT04gYnkgZGVmYXVsdCAqLworI2lmZGVmIENPTkZJR19FTlZfQUREUl9SRURVTkQKKwlmbGFzaF9wcm90ZWN0IChGTEFHX1BST1RFQ1RfU0VULAorCQkgICAgICAgQ09ORklHX0VOVl9BRERSX1JFRFVORCwKKwkJICAgICAgIENPTkZJR19FTlZfQUREUl9SRURVTkQgKyBDT05GSUdfRU5WX1NJWkVfUkVEVU5EIC0gMSwKKwkJICAgICAgIGZsYXNoX2dldF9pbmZvKENPTkZJR19FTlZfQUREUl9SRURVTkQpKTsKKyNlbmRpZgorCXJldHVybiAoc2l6ZSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX0VOVl9JU19JTl9GTEFTSCkgfHwgZGVmaW5lZChDT05GSUdfRU5WX0FERFJfUkVEVU5EKSB8fCAoQ09ORklHX01PTklUT1JfQkFTRSA+PSBDT05GSUdfU1lTX0ZMQVNIX0JBU0UpCitzdGF0aWMgZmxhc2hfaW5mb190ICpmbGFzaF9nZXRfaW5mbyh1bG9uZyBiYXNlKQoreworCWludCBpOworCWZsYXNoX2luZm9fdCAqIGluZm8gPSAwOworCisJZm9yIChpID0gMDsgaSA8IENPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTOyBpICsrKSB7CisJCWluZm8gPSAmIGZsYXNoX2luZm9baV07CisJCWlmIChpbmZvLT5zaXplICYmIGluZm8tPnN0YXJ0WzBdIDw9IGJhc2UgJiYKKwkJICAgIGJhc2UgPD0gaW5mby0+c3RhcnRbMF0gKyBpbmZvLT5zaXplIC0gMSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBpID09IENPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTID8gMCA6IGluZm87Cit9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQgZmxhc2hfZXJhc2UgKGZsYXNoX2luZm9fdCAqIGluZm8sIGludCBzX2ZpcnN0LCBpbnQgc19sYXN0KQoreworCWludCByY29kZSA9IDA7CisJaW50IHByb3Q7CisJZmxhc2hfc2VjdF90IHNlY3Q7CisgICAgICAgIHVjaGFyIGNoOworCXVjaGFyICphZGRyOworICAKKwlpZiAoaW5mby0+Zmxhc2hfaWQgIT0gRkxBU0hfTUFOX0NGSSkgeworCQlwdXRzICgiQ2FuJ3QgZXJhc2UgdW5rbm93biBmbGFzaCB0eXBlIC0gYWJvcnRlZFxuIik7CisJCXJldHVybiAxOworCX0KKwlpZiAoKHNfZmlyc3QgPCAwKSB8fCAoc19maXJzdCA+IHNfbGFzdCkpIHsKKwkJcHV0cyAoIi0gbm8gc2VjdG9ycyB0byBlcmFzZVxuIik7CisJCXJldHVybiAxOworCX0KKworCXByb3QgPSAwOworCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3QgPD0gc19sYXN0OyArK3NlY3QpIHsKKwkJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0pIHsKKwkJCXByb3QrKzsKKwkJfQorCX0KKwlpZiAocHJvdCkgeworCQlwcmludGYgKCItIFdhcm5pbmc6ICVkIHByb3RlY3RlZCBzZWN0b3JzIHdpbGwgbm90IGJlIGVyYXNlZCFcbiIsIHByb3QpOworCX0gZWxzZSB7CisJCXB1dGMgKCdcbicpOworCX0KKworCisJZm9yIChzZWN0ID0gc19maXJzdDsgc2VjdCA8PSBzX2xhc3Q7IHNlY3QrKykgeworCQlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSA9PSAwKSB7IC8qIG5vdCBwcm90ZWN0ZWQgKi8KKwkJCXN3aXRjaCAoaW5mby0+dmVuZG9yKSB7CisJCQljYXNlIENGSV9DTURTRVRfSU5URUxfU1RBTkRBUkQ6CisJCQljYXNlIENGSV9DTURTRVRfSU5URUxfRVhURU5ERUQ6CisJCQkJZmxhc2hfd3JpdGVfY21kIChpbmZvLCBzZWN0LCAwLCBGTEFTSF9DTURfQ0xFQVJfU1RBVFVTKTsKKwkJCQlmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3QsIDAsIEZMQVNIX0NNRF9CTE9DS19FUkFTRSk7CisJCQkJZmxhc2hfd3JpdGVfY21kIChpbmZvLCBzZWN0LCAwLCBGTEFTSF9DTURfRVJBU0VfQ09ORklSTSk7CisJCQkJYnJlYWs7CisJCQljYXNlIENGSV9DTURTRVRfQU1EX1NUQU5EQVJEOgorCQkJY2FzZSBDRklfQ01EU0VUX0FNRF9FWFRFTkRFRDoKKwkJCQlmbGFzaF91bmxvY2tfc2VxIChpbmZvLCBzZWN0KTsKKwkJCQlmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3QsIEFNRF9BRERSX0VSQVNFX1NUQVJULAorCQkJCQkJCUFNRF9DTURfRVJBU0VfU1RBUlQpOworCQkJCWZsYXNoX3VubG9ja19zZXEgKGluZm8sIHNlY3QpOworCQkJCWZsYXNoX3dyaXRlX2NtZCAoaW5mbywgc2VjdCwgMCwgQU1EX0NNRF9FUkFTRV9TRUNUT1IpOworCQkJCQorCQkJCS8qIHRvZ2dsZSAqLworCSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgPSBmbGFzaF9tYWtlX2FkZHIgKGluZm8sIHNlY3QsIDApOwkJCQkKKwkJCQlkbyB7CisJCQkJICAgIGNoID0gKih2b2xhdGlsZSB1Y2hhciAqKShhZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoICgoY2ggJiAweDgwKSA9PSAwKSB8fCAoY2ggIT0gMHhGRikgKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZGVidWcgKCJVbmtvd24gZmxhc2ggdmVuZG9yICVkXG4iLAorCQkJCSAgICAgICBpbmZvLT52ZW5kb3IpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoZmxhc2hfZnVsbF9zdGF0dXNfY2hlY2sKKwkJCSAgICAoaW5mbywgc2VjdCwgaW5mby0+ZXJhc2VfYmxrX3RvdXQsICJlcmFzZSIpKSB7CisJCQkJcmNvZGUgPSAxOworCQkJfSBlbHNlCisJCQkJcHV0YyAoJy4nKTsKKwkJfQorCX0KKwlwdXRzICgiIGRvbmVcbiIpOworCXJldHVybiByY29kZTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIGZsYXNoX3ByaW50X2luZm8gKGZsYXNoX2luZm9fdCAqIGluZm8pCit7CisJaW50IGk7CisKKwlpZiAoaW5mby0+Zmxhc2hfaWQgIT0gRkxBU0hfTUFOX0NGSSkgeworCQlwdXRzICgibWlzc2luZyBvciB1bmtub3duIEZMQVNIIHR5cGVcbiIpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRmICgiQ0ZJIGNvbmZvcm1hbnQgRkxBU0ggKCVkIHggJWQpIiwKKwkJKGluZm8tPnBvcnR3aWR0aCA8PCAzKSwgKGluZm8tPmNoaXB3aWR0aCA8PCAzKSk7CisJcHJpbnRmICgiICBTaXplOiAlbGQgTUIgaW4gJWQgU2VjdG9yc1xuIiwKKwkJaW5mby0+c2l6ZSA+PiAyMCwgaW5mby0+c2VjdG9yX2NvdW50KTsKKwlwcmludGYgKCIgRXJhc2UgdGltZW91dCAlbGQgbXMsIHdyaXRlIHRpbWVvdXQgJWxkIG1zLCBidWZmZXIgd3JpdGUgdGltZW91dCAlbGQgbXMsIGJ1ZmZlciBzaXplICVkXG4iLAorCQlpbmZvLT5lcmFzZV9ibGtfdG91dCwKKwkJaW5mby0+d3JpdGVfdG91dCwKKwkJaW5mby0+YnVmZmVyX3dyaXRlX3RvdXQsCisJCWluZm8tPmJ1ZmZlcl9zaXplKTsKKworCXB1dHMgKCIgIFNlY3RvciBTdGFydCBBZGRyZXNzZXM6Iik7CisJZm9yIChpID0gMDsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgKytpKSB7CisjaWZkZWYgQ0ZHX0ZMQVNIX0VNUFRZX0lORk8KKwkJaW50IGs7CisJCWludCBzaXplOworCQlpbnQgZXJhc2VkOworCQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpmbGFzaDsKKworCQkvKgorCQkgKiBDaGVjayBpZiB3aG9sZSBzZWN0b3IgaXMgZXJhc2VkCisJCSAqLworCQlpZiAoaSAhPSAoaW5mby0+c2VjdG9yX2NvdW50IC0gMSkpCisJCQlzaXplID0gaW5mby0+c3RhcnRbaSArIDFdIC0gaW5mby0+c3RhcnRbaV07CisJCWVsc2UKKwkJCXNpemUgPSBpbmZvLT5zdGFydFswXSArIGluZm8tPnNpemUgLSBpbmZvLT5zdGFydFtpXTsKKwkJZXJhc2VkID0gMTsKKwkJZmxhc2ggPSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSBpbmZvLT5zdGFydFtpXTsKKwkJc2l6ZSA9IHNpemUgPj4gMjsJLyogZGl2aWRlIGJ5IDQgZm9yIGxvbmd3b3JkIGFjY2VzcyAqLworCQlmb3IgKGsgPSAwOyBrIDwgc2l6ZTsgaysrKSB7CisJCQlpZiAoKmZsYXNoKysgIT0gMHhmZmZmZmZmZikgeworCQkJCWVyYXNlZCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoKGkgJSA1KSA9PSAwKQorCQkJcHJpbnRmICgiXG4iKTsKKwkJLyogcHJpbnQgZW1wdHkgYW5kIHJlYWQtb25seSBpbmZvICovCisJCXByaW50ZiAoIiAlMDhsWCVzJXMiLAorCQkJaW5mby0+c3RhcnRbaV0sCisJCQllcmFzZWQgPyAiIEUiIDogIiAgIiwKKwkJCWluZm8tPnByb3RlY3RbaV0gPyAiUk8gIiA6ICIgICAiKTsKKyNlbHNlCS8qICEgQ0ZHX0ZMQVNIX0VNUFRZX0lORk8gKi8KKwkJaWYgKChpICUgNSkgPT0gMCkKKwkJCXByaW50ZiAoIlxuICAgIik7CisJCXByaW50ZiAoIiAlMDhsWCVzIiwKKwkJCWluZm8tPnN0YXJ0W2ldLCBpbmZvLT5wcm90ZWN0W2ldID8gIiAoUk8pIiA6ICIgICAgICIpOworI2VuZGlmCisJfQorCXB1dGMgKCdcbicpOworCXJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weSBtZW1vcnkgdG8gZmxhc2gsIHJldHVybnM6CisgKiAwIC0gT0sKKyAqIDEgLSB3cml0ZSB0aW1lb3V0CisgKiAyIC0gRmxhc2ggbm90IGVyYXNlZAorICovCitpbnQgd3JpdGVfYnVmZiAoZmxhc2hfaW5mb190ICogaW5mbywgdWNoYXIgKiBzcmMsIHVsb25nIGFkZHIsIHVsb25nIGNudCkKK3sKKwl1bG9uZyB3cDsKKwl1bG9uZyBjcDsKKwlpbnQgYWxuOworCWNmaXdvcmRfdCBjd29yZDsKKwlpbnQgaSwgcmM7CisKKyNpZmRlZiBDT05GSUdfU1lTX0ZMQVNIX1VTRV9CVUZGRVJfV1JJVEUKKwl1bnNpZ25lZCBjaGFyIHBhdFtdID0geyd8JywgJy0nLCAnLycsICdcXCd9OworICAgICAgIAlpbnQgcGF0Y250ID0gMDsKKwlpbnQgYnVmZmVyZWRfc2l6ZTsKKyNlbmRpZgorCS8qIGdldCBsb3dlciBhbGlnbmVkIGFkZHJlc3MgKi8KKwkvKiBnZXQgbG93ZXIgYWxpZ25lZCBhZGRyZXNzICovCisJd3AgPSAoYWRkciAmIH4oaW5mby0+cG9ydHdpZHRoIC0gMSkpOworCisJLyogaGFuZGxlIHVuYWxpZ25lZCBzdGFydCAqLworCWlmICgoYWxuID0gYWRkciAtIHdwKSAhPSAwKSB7CisJCWN3b3JkLmwgPSAwOworCQljcCA9IHdwOworCQlmb3IgKGkgPSAwOyBpIDwgYWxuOyArK2ksICsrY3ApCisJCQlmbGFzaF9hZGRfYnl0ZSAoaW5mbywgJmN3b3JkLCAoKih1Y2hhciAqKSBjcCkpOworCisJCWZvciAoOyAoaSA8IGluZm8tPnBvcnR3aWR0aCkgJiYgKGNudCA+IDApOyBpKyspIHsKKwkJCWZsYXNoX2FkZF9ieXRlIChpbmZvLCAmY3dvcmQsICpzcmMrKyk7CisJCQljbnQtLTsKKwkJCWNwKys7CisJCX0KKwkJZm9yICg7IChjbnQgPT0gMCkgJiYgKGkgPCBpbmZvLT5wb3J0d2lkdGgpOyArK2ksICsrY3ApCisJCQlmbGFzaF9hZGRfYnl0ZSAoaW5mbywgJmN3b3JkLCAoKih1Y2hhciAqKSBjcCkpOworCQlpZiAoKHJjID0gZmxhc2hfd3JpdGVfY2Zpd29yZCAoaW5mbywgd3AsIGN3b3JkKSkgIT0gMCkKKwkJCXJldHVybiByYzsKKwkJd3AgPSBjcDsKKwl9CisKKwkvKiBoYW5kbGUgdGhlIGFsaWduZWQgcGFydCAqLworI2lmZGVmIENPTkZJR19TWVNfRkxBU0hfVVNFX0JVRkZFUl9XUklURQorCWJ1ZmZlcmVkX3NpemUgPSAoaW5mby0+cG9ydHdpZHRoIC8gaW5mby0+Y2hpcHdpZHRoKTsKKwlidWZmZXJlZF9zaXplICo9IGluZm8tPmJ1ZmZlcl9zaXplOworCXdoaWxlIChjbnQgPj0gaW5mby0+cG9ydHdpZHRoKSB7CisJCS8qIFNob3cgcHJvY2Vzc2luZyAqLworCQlpZiAoKCsrcGF0Y250ICUgMjU2KSA9PSAwKQorCQkgICAgcHJpbnRmKCIlY1xiIiwgcGF0WyhwYXRjbnQgLyAyNTYpICYgMHgwM10pOworCisJCWkgPSBidWZmZXJlZF9zaXplID4gY250ID8gY250IDogYnVmZmVyZWRfc2l6ZTsKKwkJaWYgKChyYyA9IGZsYXNoX3dyaXRlX2NmaWJ1ZmZlciAoaW5mbywgd3AsIHNyYywgaSkpICE9IEVSUl9PSykKKwkJCXJldHVybiByYzsKKwkJaSAtPSBpICYgKGluZm8tPnBvcnR3aWR0aCAtIDEpOworCQl3cCArPSBpOworCQlzcmMgKz0gaTsKKwkJY250IC09IGk7CisJfQorI2Vsc2UKKwl3aGlsZSAoY250ID49IGluZm8tPnBvcnR3aWR0aCkgeworCQljd29yZC5sID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IGluZm8tPnBvcnR3aWR0aDsgaSsrKSB7CisJCQlmbGFzaF9hZGRfYnl0ZSAoaW5mbywgJmN3b3JkLCAqc3JjKyspOworCQl9CisJCWlmICgocmMgPSBmbGFzaF93cml0ZV9jZml3b3JkIChpbmZvLCB3cCwgY3dvcmQpKSAhPSAwKQorCQkJcmV0dXJuIHJjOworCQl3cCArPSBpbmZvLT5wb3J0d2lkdGg7CisJCWNudCAtPSBpbmZvLT5wb3J0d2lkdGg7CisJfQorI2VuZGlmIC8qIENPTkZJR19TWVNfRkxBU0hfVVNFX0JVRkZFUl9XUklURSAqLworCWlmIChjbnQgPT0gMCkgeworCQlyZXR1cm4gKDApOworCX0KKworCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCB0YWlsIGJ5dGVzCisJICovCisJY3dvcmQubCA9IDA7CisJZm9yIChpID0gMCwgY3AgPSB3cDsgKGkgPCBpbmZvLT5wb3J0d2lkdGgpICYmIChjbnQgPiAwKTsgKytpLCArK2NwKSB7CisJCWZsYXNoX2FkZF9ieXRlIChpbmZvLCAmY3dvcmQsICpzcmMrKyk7CisJCS0tY250OworCX0KKwlmb3IgKDsgaSA8IGluZm8tPnBvcnR3aWR0aDsgKytpLCArK2NwKSB7CisJCWZsYXNoX2FkZF9ieXRlIChpbmZvLCAmY3dvcmQsICgqKHVjaGFyICopIGNwKSk7CisJfQorCisJcmV0dXJuIGZsYXNoX3dyaXRlX2NmaXdvcmQgKGluZm8sIHdwLCBjd29yZCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmZGVmIENGR19GTEFTSF9QUk9URUNUSU9OCisKK2ludCBmbGFzaF9yZWFsX3Byb3RlY3QgKGZsYXNoX2luZm9fdCAqIGluZm8sIGxvbmcgc2VjdG9yLCBpbnQgcHJvdCkKK3sKKwlpbnQgcmV0Y29kZSA9IDA7CisKKwlmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3RvciwgMCwgRkxBU0hfQ01EX0NMRUFSX1NUQVRVUyk7CisJZmxhc2hfd3JpdGVfY21kIChpbmZvLCBzZWN0b3IsIDAsIEZMQVNIX0NNRF9QUk9URUNUKTsKKwlpZiAocHJvdCkKKwkJZmxhc2hfd3JpdGVfY21kIChpbmZvLCBzZWN0b3IsIDAsIEZMQVNIX0NNRF9QUk9URUNUX1NFVCk7CisJZWxzZQorCQlmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3RvciwgMCwgRkxBU0hfQ01EX1BST1RFQ1RfQ0xFQVIpOworCisJaWYgKChyZXRjb2RlID0KKwkgICAgIGZsYXNoX2Z1bGxfc3RhdHVzX2NoZWNrIChpbmZvLCBzZWN0b3IsIGluZm8tPmVyYXNlX2Jsa190b3V0LAorCQkJCSAgICAgIHByb3QgPyAicHJvdGVjdCIgOiAidW5wcm90ZWN0IikpID09IDApIHsKKworCQlpbmZvLT5wcm90ZWN0W3NlY3Rvcl0gPSBwcm90OworCQkvKiBJbnRlbCdzIHVucHJvdGVjdCB1bnByb3RlY3RzIGFsbCBsb2NraW5nICovCisJCWlmIChwcm90ID09IDApIHsKKwkJCWZsYXNoX3NlY3RfdCBpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspIHsKKwkJCQlpZiAoaW5mby0+cHJvdGVjdFtpXSkKKwkJCQkJZmxhc2hfcmVhbF9wcm90ZWN0IChpbmZvLCBpLCAxKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmV0Y29kZTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZmxhc2hfcmVhZF91c2VyX3NlcmlhbCAtIHJlYWQgdGhlIE9uZVRpbWVQcm9ncmFtbWluZyBjZWxscworICovCit2b2lkIGZsYXNoX3JlYWRfdXNlcl9zZXJpYWwgKGZsYXNoX2luZm9fdCAqIGluZm8sIHZvaWQgKmJ1ZmZlciwgaW50IG9mZnNldCwKKwkJCSAgICAgaW50IGxlbikKK3sKKwl1Y2hhciAqc3JjOworCXVjaGFyICpkc3Q7CisKKwlkc3QgPSBidWZmZXI7CisJc3JjID0gZmxhc2hfbWFrZV9hZGRyIChpbmZvLCAwLCBGTEFTSF9PRkZTRVRfVVNFUl9QUk9URUNUSU9OKTsKKwlmbGFzaF93cml0ZV9jbWQgKGluZm8sIDAsIDAsIEZMQVNIX0NNRF9SRUFEX0lEKTsKKwltZW1jcHkgKGRzdCwgc3JjICsgb2Zmc2V0LCBsZW4pOworCWZsYXNoX3dyaXRlX2NtZCAoaW5mbywgMCwgMCwgaW5mby0+Y21kX3Jlc2V0KTsKK30KKworLyoKKyAqIGZsYXNoX3JlYWRfZmFjdG9yeV9zZXJpYWwgLSByZWFkIHRoZSBkZXZpY2UgSWQgZnJvbSB0aGUgcHJvdGVjdGlvbiBhcmVhCisgKi8KK3ZvaWQgZmxhc2hfcmVhZF9mYWN0b3J5X3NlcmlhbCAoZmxhc2hfaW5mb190ICogaW5mbywgdm9pZCAqYnVmZmVyLCBpbnQgb2Zmc2V0LAorCQkJCWludCBsZW4pCit7CisJdWNoYXIgKnNyYzsKKworCXNyYyA9IGZsYXNoX21ha2VfYWRkciAoaW5mbywgMCwgRkxBU0hfT0ZGU0VUX0lOVEVMX1BST1RFQ1RJT04pOworCWZsYXNoX3dyaXRlX2NtZCAoaW5mbywgMCwgMCwgRkxBU0hfQ01EX1JFQURfSUQpOworCW1lbWNweSAoYnVmZmVyLCBzcmMgKyBvZmZzZXQsIGxlbik7CisJZmxhc2hfd3JpdGVfY21kIChpbmZvLCAwLCAwLCBpbmZvLT5jbWRfcmVzZXQpOworfQorCisjZW5kaWYgLyogQ0ZHX0ZMQVNIX1BST1RFQ1RJT04gKi8KKworLyoKKyAqIGZsYXNoX2lzX2J1c3kgLSBjaGVjayB0byBzZWUgaWYgdGhlIGZsYXNoIGlzIGJ1c3kKKyAqIFRoaXMgcm91dGluZSBjaGVja3MgdGhlIHN0YXR1cyBvZiB0aGUgY2hpcCBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBjaGlwIGlzIGJ1c3kKKyAqLworc3RhdGljIGludCBmbGFzaF9pc19idXN5IChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdCkKK3sKKwlpbnQgcmV0dmFsOworCisJc3dpdGNoIChpbmZvLT52ZW5kb3IpIHsKKwljYXNlIENGSV9DTURTRVRfSU5URUxfU1RBTkRBUkQ6CisJY2FzZSBDRklfQ01EU0VUX0lOVEVMX0VYVEVOREVEOgorCQlyZXR2YWwgPSAhZmxhc2hfaXNzZXQgKGluZm8sIHNlY3QsIDAsIEZMQVNIX1NUQVRVU19ET05FKTsKKwkJYnJlYWs7CisJY2FzZSBDRklfQ01EU0VUX0FNRF9TVEFOREFSRDoKKwljYXNlIENGSV9DTURTRVRfQU1EX0VYVEVOREVEOgorCQlyZXR2YWwgPSBmbGFzaF90b2dnbGUgKGluZm8sIHNlY3QsIDAsIEFNRF9TVEFUVVNfVE9HR0xFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dmFsID0gMDsKKwl9CisjaWZkZWYgREVCVUdfRkxBU0gKKwlpZiAocmV0dmFsKQorCSAgICBkZWJ1ZyAoImZsYXNoX2lzX2J1c3k6ICVkXG4iLCByZXR2YWwpOworI2VuZGlmCisJcmV0dXJuIHJldHZhbDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIHdhaXQgZm9yIFhTUi43IHRvIGJlIHNldC4gVGltZSBvdXQgd2l0aCBhbiBlcnJvciBpZiBpdCBkb2VzIG5vdC4KKyAqICBUaGlzIHJvdXRpbmUgZG9lcyBub3Qgc2V0IHRoZSBmbGFzaCB0byByZWFkLWFycmF5IG1vZGUuCisgKi8KK3N0YXRpYyBpbnQgZmxhc2hfc3RhdHVzX2NoZWNrIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdG9yLAorCQkJICAgICAgIHVsb25nIHRvdXQsIGNoYXIgKnByb21wdCkKK3sKKwl1bG9uZyBzdGFydCwgbm93OworCisJLyogV2FpdCBmb3IgY29tbWFuZCBjb21wbGV0aW9uICovCisJLy8gKFN1bikgRml4IG9yZGVyIG9mIGNoZWNraW5nIHRpbWUgc28gaXQgd29ya3Mgd2hlbiB0aGUgQ1BVIGlzIHZlcnkKKwkvLyBzbG93LCBlLmcuLCBzaW5nbGUtc3RlcHBpbmcgb3IgZW11bGF0aW9uLgorCXN0YXJ0ID0gZ2V0X3RpbWVyICgwKTsKKwl3aGlsZSAobm93ID0gZ2V0X3RpbWVyKHN0YXJ0KSwKKwkgICAgICAgZmxhc2hfaXNfYnVzeSAoaW5mbywgc2VjdG9yKSkKKwl7CisJCWlmIChub3cgPiBpbmZvLT5lcmFzZV9ibGtfdG91dCkgeworCQkJcHJpbnRmICgiRmxhc2ggJXMgdGltZW91dCBhdCBhZGRyZXNzICVseCBkYXRhICVseFxuIiwKKwkJCQlwcm9tcHQsIGluZm8tPnN0YXJ0W3NlY3Rvcl0sCisJCQkJZmxhc2hfcmVhZF9sb25nIChpbmZvLCBzZWN0b3IsIDApKTsKKwkJCWZsYXNoX3dyaXRlX2NtZCAoaW5mbywgc2VjdG9yLCAwLCBpbmZvLT5jbWRfcmVzZXQpOworCQkJcmV0dXJuIEVSUl9USU1PVVQ7CisJCX0KKwl9CisJcmV0dXJuIEVSUl9PSzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogV2FpdCBmb3IgWFNSLjcgdG8gYmUgc2V0LCBpZiBpdCB0aW1lcyBvdXQgcHJpbnQgYW4gZXJyb3IsIG90aGVyd2lzZSBkbyBhIGZ1bGwgc3RhdHVzIGNoZWNrLgorICogVGhpcyByb3V0aW5lIHNldHMgdGhlIGZsYXNoIHRvIHJlYWQtYXJyYXkgbW9kZS4KKyAqLworc3RhdGljIGludCBmbGFzaF9mdWxsX3N0YXR1c19jaGVjayAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3RvciwKKwkJCQkgICAgdWxvbmcgdG91dCwgY2hhciAqcHJvbXB0KQoreworCWludCByZXRjb2RlOworCisJcmV0Y29kZSA9IGZsYXNoX3N0YXR1c19jaGVjayAoaW5mbywgc2VjdG9yLCB0b3V0LCBwcm9tcHQpOworCXN3aXRjaCAoaW5mby0+dmVuZG9yKSB7CisJY2FzZSBDRklfQ01EU0VUX0lOVEVMX0VYVEVOREVEOgorCWNhc2UgQ0ZJX0NNRFNFVF9JTlRFTF9TVEFOREFSRDoKKwkJaWYgKChyZXRjb2RlICE9IEVSUl9PSykKKwkJICAgICYmICFmbGFzaF9pc2VxdWFsIChpbmZvLCBzZWN0b3IsIDAsIEZMQVNIX1NUQVRVU19ET05FKSkgeworCQkJcmV0Y29kZSA9IEVSUl9JTlZBTDsKKwkJCXByaW50ZiAoIkZsYXNoICVzIGVycm9yIGF0IGFkZHJlc3MgJWx4XG4iLCBwcm9tcHQsCisJCQkJaW5mby0+c3RhcnRbc2VjdG9yXSk7CisJCQlpZiAoZmxhc2hfaXNzZXQgKGluZm8sIHNlY3RvciwgMCwgRkxBU0hfU1RBVFVTX0VDTEJTIHwgRkxBU0hfU1RBVFVTX1BTTEJTKSkgeworCQkJCXB1dHMgKCJDb21tYW5kIFNlcXVlbmNlIEVycm9yLlxuIik7CisJCQl9IGVsc2UgaWYgKGZsYXNoX2lzc2V0IChpbmZvLCBzZWN0b3IsIDAsIEZMQVNIX1NUQVRVU19FQ0xCUykpIHsKKwkJCQlwdXRzICgiQmxvY2sgRXJhc2UgRXJyb3IuXG4iKTsKKwkJCQlyZXRjb2RlID0gRVJSX05PVF9FUkFTRUQ7CisJCQl9IGVsc2UgaWYgKGZsYXNoX2lzc2V0IChpbmZvLCBzZWN0b3IsIDAsIEZMQVNIX1NUQVRVU19QU0xCUykpIHsKKwkJCQlwdXRzICgiTG9ja2luZyBFcnJvclxuIik7CisJCQl9CisJCQlpZiAoZmxhc2hfaXNzZXQgKGluZm8sIHNlY3RvciwgMCwgRkxBU0hfU1RBVFVTX0RQUykpIHsKKwkJCQlwdXRzICgiQmxvY2sgbG9ja2VkLlxuIik7CisJCQkJcmV0Y29kZSA9IEVSUl9QUk9URUNURUQ7CisJCQl9CisJCQlpZiAoZmxhc2hfaXNzZXQgKGluZm8sIHNlY3RvciwgMCwgRkxBU0hfU1RBVFVTX1ZQRU5TKSkKKwkJCQlwdXRzICgiVnBwIExvdyBFcnJvci5cbiIpOworCQl9CisJCWZsYXNoX3dyaXRlX2NtZCAoaW5mbywgc2VjdG9yLCAwLCBpbmZvLT5jbWRfcmVzZXQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIHJldGNvZGU7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2J1ZmZlcl9hYm9ydF9yZXNldChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdG9yKQoreworICAgICBmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3RvciwgMHhhYWEsIDB4YWEpOworICAgICBmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3RvciwgMHg1NTUsIDB4NTUpOworICAgICBmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3RvciwgMHhhYWEsIDB4ZjApOyAgICAJCit9CQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyB2b2lkIGZsYXNoX2FkZF9ieXRlIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBjZml3b3JkX3QgKiBjd29yZCwgdWNoYXIgYykKK3sKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1bnNpZ25lZCBzaG9ydAl3OworCXVuc2lnbmVkIGludAlsOworCXVuc2lnbmVkIGxvbmcgbG9uZyBsbDsKKyNlbmRpZgorCisJc3dpdGNoIChpbmZvLT5wb3J0d2lkdGgpIHsKKwljYXNlIEZMQVNIX0NGSV84QklUOgorCQljd29yZC0+YyA9IGM7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfQ0ZJXzE2QklUOgorI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCQl3ID0gYzsKKwkJdyA8PD0gODsKKwkJY3dvcmQtPncgPSAoY3dvcmQtPncgPj4gOCkgfCB3OworI2Vsc2UKKwkJY3dvcmQtPncgPSAoY3dvcmQtPncgPDwgOCkgfCBjOworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgRkxBU0hfQ0ZJXzMyQklUOgorI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCQlsID0gYzsKKwkJbCA8PD0gMjQ7CisJCWN3b3JkLT5sID0gKGN3b3JkLT5sID4+IDgpIHwgbDsKKyNlbHNlCisJCWN3b3JkLT5sID0gKGN3b3JkLT5sIDw8IDgpIHwgYzsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIEZMQVNIX0NGSV82NEJJVDoKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwkJbGwgPSBjOworCQlsbCA8PD0gNTY7CisJCWN3b3JkLT5sbCA9IChjd29yZC0+bGwgPj4gOCkgfCBsbDsKKyNlbHNlCisJCWN3b3JkLT5sbCA9IChjd29yZC0+bGwgPDwgOCkgfCBjOworI2VuZGlmCisJCWJyZWFrOworCX0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBtYWtlIGEgcHJvcGVyIHNpemVkIGNvbW1hbmQgYmFzZWQgb24gdGhlIHBvcnQgYW5kIGNoaXAgd2lkdGhzCisgKi8KK3N0YXRpYyB2b2lkIGZsYXNoX21ha2VfY21kIChmbGFzaF9pbmZvX3QgKiBpbmZvLCB1Y2hhciBjbWQsIHZvaWQgKmNtZGJ1ZikKK3sKKwlpbnQgaTsKKwl1Y2hhciAqY3AgPSAodWNoYXIgKikgY21kYnVmOworCisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJZm9yIChpID0gaW5mby0+cG9ydHdpZHRoOyBpID4gMDsgaS0tKQorI2Vsc2UKKwlmb3IgKGkgPSAxOyBpIDw9IGluZm8tPnBvcnR3aWR0aDsgaSsrKQorI2VuZGlmCisJCSpjcCsrID0gKGkgJiAoaW5mby0+Y2hpcHdpZHRoIC0gMSkpID8gJ1wwJyA6IGNtZDsKK30KKworLyoKKyAqIFdyaXRlIGEgcHJvcGVyIHNpemVkIGNvbW1hbmQgdG8gdGhlIGNvcnJlY3QgYWRkcmVzcworICovCitzdGF0aWMgdm9pZAorZmxhc2hfd3JpdGVfY21kIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdCwgdWludCBvZmZzZXQsCisJCSB1Y2hhciBjbWQpCit7CisjaWZkZWYgREVCVUdfRkxBU0gKKyAgICBjb25zdCBpbnQgbm9EZWJ1ZyA9IDA7CisjZWxzZQorICAgIGNvbnN0IGludCBub0RlYnVnID0gMTsKKyNlbmRpZgorICAgIHJldHVybiBmbGFzaF93cml0ZV9jbWRfaW50KGluZm8sIHNlY3QsIG9mZnNldCwgY21kLCBub0RlYnVnKTsKK30KK3N0YXRpYyB2b2lkCitmbGFzaF93cml0ZV9jbWRfbm9kYmcgKGZsYXNoX2luZm9fdCAqIGluZm8sIGZsYXNoX3NlY3RfdCBzZWN0LCB1aW50IG9mZnNldCwKKwkJICAgICAgIHVjaGFyIGNtZCkKK3sKKyAgICByZXR1cm4gZmxhc2hfd3JpdGVfY21kX2ludChpbmZvLCBzZWN0LCBvZmZzZXQsIGNtZCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkCitmbGFzaF93cml0ZV9jbWRfaW50IChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdCwgdWludCBvZmZzZXQsCisJCSAgICAgdWNoYXIgY21kLCBpbnQgbm9EZWJ1ZykKK3sKKworCXZvbGF0aWxlIGNmaXB0cl90IGFkZHI7CisJY2Zpd29yZF90IGN3b3JkOworCisJYWRkci5jcCA9IGZsYXNoX21ha2VfYWRkciAoaW5mbywgc2VjdCwgb2Zmc2V0KTsKKwlmbGFzaF9tYWtlX2NtZCAoaW5mbywgY21kLCAmY3dvcmQpOworCXN3aXRjaCAoaW5mby0+cG9ydHdpZHRoKSB7CisJY2FzZSBGTEFTSF9DRklfOEJJVDoKKwkJaWYgKG5vRGVidWcgPT0gMCkKKwkJZGVidWcgKCJmd2MgYWRkciAlcCBjbWQgJXggJXggOGJpdCB4ICVkIGJpdFxuIiwgYWRkci5jcCwgY21kLAorCQkgICAgICAgY3dvcmQuYywgaW5mby0+Y2hpcHdpZHRoIDw8IENGSV9GTEFTSF9TSElGVF9XSURUSCk7CisJCSphZGRyLmNwID0gY3dvcmQuYzsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9DRklfMTZCSVQ6CisJCWlmIChub0RlYnVnID09IDApCisJCWRlYnVnICgiZndjIGFkZHIgJXAgY21kICV4ICU0LjR4IDE2Yml0IHggJWQgYml0XG4iLCBhZGRyLndwLAorCQkgICAgICAgY21kLCBjd29yZC53LAorCQkgICAgICAgaW5mby0+Y2hpcHdpZHRoIDw8IENGSV9GTEFTSF9TSElGVF9XSURUSCk7CisJCSphZGRyLndwID0gY3dvcmQudzsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9DRklfMzJCSVQ6CisJCWlmIChub0RlYnVnID09IDApCisJCWRlYnVnICgiZndjIGFkZHIgJXAgY21kICV4ICU4LjhseCAzMmJpdCB4ICVkIGJpdFxuIiwgYWRkci5scCwKKwkJICAgICAgIGNtZCwgY3dvcmQubCwKKwkJICAgICAgIGluZm8tPmNoaXB3aWR0aCA8PCBDRklfRkxBU0hfU0hJRlRfV0lEVEgpOworCQkqYWRkci5scCA9IGN3b3JkLmw7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfQ0ZJXzY0QklUOgorI2lmZGVmIERFQlVHX0ZMQVNICisJCWlmIChub0RlYnVnID09IDApCisJCXsKKwkJCWNoYXIgc3RyWzIwXTsKKworCQkJcHJpbnRfbG9uZ2xvbmcgKHN0ciwgY3dvcmQubGwpOworCisJCQlkZWJ1ZyAoImZ3cml0ZSBhZGRyICVwIGNtZCAleCAlcyA2NCBiaXQgeCAlZCBiaXRcbiIsCisJCQkgICAgICAgYWRkci5sbHAsIGNtZCwgc3RyLAorCQkJICAgICAgIGluZm8tPmNoaXB3aWR0aCA8PCBDRklfRkxBU0hfU0hJRlRfV0lEVEgpOworCQl9CisjZW5kaWYKKwkJKmFkZHIubGxwID0gY3dvcmQubGw7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgZmxhc2hfdW5sb2NrX3NlcSAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3QpCit7CisJZmxhc2hfd3JpdGVfY21kX25vZGJnIChpbmZvLCBzZWN0LCBBTURfQUREUl9TVEFSVCwgQU1EX0NNRF9VTkxPQ0tfU1RBUlQpOworCWZsYXNoX3dyaXRlX2NtZF9ub2RiZyAoaW5mbywgc2VjdCwgQU1EX0FERFJfQUNLLCBBTURfQ01EX1VOTE9DS19BQ0spOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgZmxhc2hfaXNlcXVhbCAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3QsIHVpbnQgb2Zmc2V0LCB1Y2hhciBjbWQpCit7CisJY2ZpcHRyX3QgY3B0cjsKKwljZml3b3JkX3QgY3dvcmQ7CisJaW50IHJldHZhbDsKKyNpZmRlZiBERUJVR19GTEFTSAorCWNvbnN0IGludCBkYmcgPSAxOworI2Vsc2UKKwljb25zdCBpbnQgZGJnID0gMDsKKyNlbmRpZgorCWNwdHIuY3AgPSBmbGFzaF9tYWtlX2FkZHIgKGluZm8sIHNlY3QsIG9mZnNldCk7CisJZmxhc2hfbWFrZV9jbWQgKGluZm8sIGNtZCwgJmN3b3JkKTsKKworCWlmIChkYmcpCisJICAgIGRlYnVnICgiaXM9IGNtZCAleCglYykgYWRkciAlcCAiLCBjbWQsIGNtZCwgY3B0ci5jcCk7CisJc3dpdGNoIChpbmZvLT5wb3J0d2lkdGgpIHsKKwljYXNlIEZMQVNIX0NGSV84QklUOgorCQlpZiAoZGJnKQorCQkgICAgZGVidWcgKCJpcz0gJXggJXhcbiIsIGNwdHIuY3BbMF0sIGN3b3JkLmMpOworCQlyZXR2YWwgPSAoY3B0ci5jcFswXSA9PSBjd29yZC5jKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9DRklfMTZCSVQ6CisJCWlmIChkYmcpCisJCSAgICBkZWJ1ZyAoImlzPSAlNC40eCAlNC40eFxuIiwgY3B0ci53cFswXSwgY3dvcmQudyk7CisJCXJldHZhbCA9IChjcHRyLndwWzBdID09IGN3b3JkLncpOworCQlicmVhazsKKwljYXNlIEZMQVNIX0NGSV8zMkJJVDoKKwkJaWYgKGRiZykKKwkJICAgIGRlYnVnICgiaXM9ICU4LjhseCAlOC44bHhcbiIsIGNwdHIubHBbMF0sIGN3b3JkLmwpOworCQlyZXR2YWwgPSAoY3B0ci5scFswXSA9PSBjd29yZC5sKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9DRklfNjRCSVQ6CisjaWZkZWYgREVCVUdfRkxBU0gKKwkJeworCQkJY2hhciBzdHIxWzIwXTsKKwkJCWNoYXIgc3RyMlsyMF07CisKKwkJCXByaW50X2xvbmdsb25nIChzdHIxLCBjcHRyLmxscFswXSk7CisJCQlwcmludF9sb25nbG9uZyAoc3RyMiwgY3dvcmQubGwpOworCQkJZGVidWcgKCJpcz0gJXMgJXNcbiIsIHN0cjEsIHN0cjIpOworCQl9CisjZW5kaWYKKwkJcmV0dmFsID0gKGNwdHIubGxwWzBdID09IGN3b3JkLmxsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dmFsID0gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCBmbGFzaF9pc3NldCAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3QsIHVpbnQgb2Zmc2V0LCB1Y2hhciBjbWQpCit7CisJY2ZpcHRyX3QgY3B0cjsKKwljZml3b3JkX3QgY3dvcmQ7CisJaW50IHJldHZhbDsKKworCWNwdHIuY3AgPSBmbGFzaF9tYWtlX2FkZHIgKGluZm8sIHNlY3QsIG9mZnNldCk7CisJZmxhc2hfbWFrZV9jbWQgKGluZm8sIGNtZCwgJmN3b3JkKTsKKwlzd2l0Y2ggKGluZm8tPnBvcnR3aWR0aCkgeworCWNhc2UgRkxBU0hfQ0ZJXzhCSVQ6CisJCXJldHZhbCA9ICgoY3B0ci5jcFswXSAmIGN3b3JkLmMpID09IGN3b3JkLmMpOworCQlicmVhazsKKwljYXNlIEZMQVNIX0NGSV8xNkJJVDoKKwkJcmV0dmFsID0gKChjcHRyLndwWzBdICYgY3dvcmQudykgPT0gY3dvcmQudyk7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfQ0ZJXzMyQklUOgorCQlyZXR2YWwgPSAoKGNwdHIubHBbMF0gJiBjd29yZC5sKSA9PSBjd29yZC5sKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9DRklfNjRCSVQ6CisJCXJldHZhbCA9ICgoY3B0ci5sbHBbMF0gJiBjd29yZC5sbCkgPT0gY3dvcmQubGwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR2YWwgPSAwOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IGZsYXNoX3RvZ2dsZSAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3QsIHVpbnQgb2Zmc2V0LCB1Y2hhciBjbWQpCit7CisJY2ZpcHRyX3QgY3B0cjsKKwljZml3b3JkX3QgY3dvcmQ7CisJaW50IHJldHZhbDsKKworCWNwdHIuY3AgPSBmbGFzaF9tYWtlX2FkZHIgKGluZm8sIHNlY3QsIG9mZnNldCk7CisJZmxhc2hfbWFrZV9jbWQgKGluZm8sIGNtZCwgJmN3b3JkKTsKKwlzd2l0Y2ggKGluZm8tPnBvcnR3aWR0aCkgeworCWNhc2UgRkxBU0hfQ0ZJXzhCSVQ6CisJCXJldHZhbCA9ICgoY3B0ci5jcFswXSAmIGN3b3JkLmMpICE9IChjcHRyLmNwWzBdICYgY3dvcmQuYykpOworCQlicmVhazsKKwljYXNlIEZMQVNIX0NGSV8xNkJJVDoKKwkJcmV0dmFsID0gKChjcHRyLndwWzBdICYgY3dvcmQudykgIT0gKGNwdHIud3BbMF0gJiBjd29yZC53KSk7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfQ0ZJXzMyQklUOgorCQlyZXR2YWwgPSAoKGNwdHIubHBbMF0gJiBjd29yZC5sKSAhPSAoY3B0ci5scFswXSAmIGN3b3JkLmwpKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9DRklfNjRCSVQ6CisJCXJldHZhbCA9ICgoY3B0ci5sbHBbMF0gJiBjd29yZC5sbCkgIT0KKwkJCSAgKGNwdHIubGxwWzBdICYgY3dvcmQubGwpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dmFsID0gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGRldGVjdCBpZiBmbGFzaCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIENvbW1vbiBGbGFzaCBJbnRlcmZhY2UgKENGSSkKKyAqIGh0dHA6Ly93d3cuamVkZWMub3JnL2Rvd25sb2FkL3NlYXJjaC9qZXNkNjgucGRmCisgKgorKi8KK3N0YXRpYyBpbnQgZmxhc2hfZGV0ZWN0X2NmaSAoZmxhc2hfaW5mb190ICogaW5mbykKK3sKKyAgICAgICAgdWxvbmcgZGF0YTsKKyAgICAgICAgCQorCWRlYnVnICgiZmxhc2hfZGV0ZWN0X2NmaSgpLi4uICIpOworCisjaWYgICAgIGRlZmluZWQoQ09ORklHX0ZMQVNIX0FTVDIzMDApCisgICAgICAgIGRhdGEgPSAqKHVsb25nICopKDB4MWU2ZTIwNzApOwkJLyogaGFyZHdhcmUgdHJhcGluZyAqLworICAgICAgICBpZiAoZGF0YSAmIDB4MTApCQkJLyogRFs0XTogMC8xICg4LzE2KSAqLworICAgICAgICAgICAgaW5mby0+cG9ydHdpZHRoID0gRkxBU0hfQ0ZJXzE2QklUOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbmZvLT5wb3J0d2lkdGggPSBGTEFTSF9DRklfOEJJVDsgICAgICAgICAgICAKKyNlbHNlCisgICAgICAgIGluZm8tPnBvcnR3aWR0aCA9IEZMQVNIX0NGSV84QklUOworI2VuZGlmCisKKwl7ICAgICAJCisJCWZvciAoaW5mby0+Y2hpcHdpZHRoID0gRkxBU0hfQ0ZJX0JZODsKKwkJICAgICBpbmZvLT5jaGlwd2lkdGggPD0gaW5mby0+cG9ydHdpZHRoOworCQkgICAgIGluZm8tPmNoaXB3aWR0aCA8PD0gMSkgeworCQkJZmxhc2hfd3JpdGVfY21kIChpbmZvLCAwLCAwLCBGTEFTSF9DTURfUkVTRVQpOworCQkJZmxhc2hfd3JpdGVfY21kIChpbmZvLCAwLCBGTEFTSF9PRkZTRVRfQ0ZJLCBGTEFTSF9DTURfQ0ZJKTsKKwkJCWlmIChmbGFzaF9pc2VxdWFsIChpbmZvLCAwLCBGTEFTSF9PRkZTRVRfQ0ZJX1JFU1AsICdRJykKKwkJCSAgICAvL0ZJWE1FOiBOZXh0IDMgbGluZXMgd2VyZSBjaGFuZ2VkIGZvciA4LWJpdC8xNi1iaXQgZmxhc2ggY2hpcHMuCisJCQkgICAgJiYgZmxhc2hfaXNlcXVhbCAoaW5mbywgMCwgRkxBU0hfT0ZGU0VUX0NGSV9SRVNQMSwgJ1InKQorCQkJICAgICYmIGZsYXNoX2lzZXF1YWwgKGluZm8sIDAsIEZMQVNIX09GRlNFVF9DRklfUkVTUDIsICdZJykpIHsKKwkJCQlpbmZvLT5pbnRlcmZhY2UgPSBmbGFzaF9yZWFkX3VjaGFyIChpbmZvLCBGTEFTSF9PRkZTRVRfSU5URVJGQUNFKTsKKwkJCQlkZWJ1ZyAoImRldmljZSBpbnRlcmZhY2UgaXMgJWRcbiIsCisJCQkJICAgICAgIGluZm8tPmludGVyZmFjZSk7CisJCQkJZGVidWcgKCJmb3VuZCBwb3J0ICVkIGNoaXAgJWQgIiwKKwkJCQkgICAgICAgaW5mby0+cG9ydHdpZHRoLCBpbmZvLT5jaGlwd2lkdGgpOworCQkJCWRlYnVnICgicG9ydCAlZCBiaXRzIGNoaXAgJWQgYml0c1xuIiwKKwkJCQkgICAgICAgaW5mby0+cG9ydHdpZHRoIDw8IENGSV9GTEFTSF9TSElGVF9XSURUSCwKKwkJCQkgICAgICAgaW5mby0+Y2hpcHdpZHRoIDw8IENGSV9GTEFTSF9TSElGVF9XSURUSCk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisJZGVidWcgKCJub3QgZm91bmRcbiIpOworCXJldHVybiAwOworfQorCisvKgorICogVGhlIGZvbGxvd2luZyBjb2RlIGNhbm5vdCBiZSBydW4gZnJvbSBGTEFTSCEKKyAqCisgKi8KK3Vsb25nIGZsYXNoX2dldF9zaXplICh1bG9uZyBiYXNlLCBpbnQgYmFua251bSkKK3sKKwlmbGFzaF9pbmZvX3QgKmluZm8gPSAmZmxhc2hfaW5mb1tiYW5rbnVtXTsKKwlpbnQgaSwgajsKKwlmbGFzaF9zZWN0X3Qgc2VjdF9jbnQ7CisJdW5zaWduZWQgbG9uZyBzZWN0b3I7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJaW50IHNpemVfcmF0aW87CisJdWNoYXIgbnVtX2VyYXNlX3JlZ2lvbnM7CisJaW50IGVyYXNlX3JlZ2lvbl9zaXplOworCWludCBlcmFzZV9yZWdpb25fY291bnQ7CisKKwlpbmZvLT5zdGFydFswXSA9IGJhc2U7CisKKwlpZiAoZmxhc2hfZGV0ZWN0X2NmaSAoaW5mbykpIHsKKwkJaW5mby0+dmVuZG9yID0gZmxhc2hfcmVhZF91Y2hhciAoaW5mbywgRkxBU0hfT0ZGU0VUX1BSSU1BUllfVkVORE9SKTsKKyNpZiBkZWZpbmVkKERFQlVHX0ZMQVNIKQorCQlmbGFzaF9wcmludHFyeSAoaW5mbywgMCk7CisjZW5kaWYKKwkJc3dpdGNoIChpbmZvLT52ZW5kb3IpIHsKKwkJY2FzZSBDRklfQ01EU0VUX0lOVEVMX1NUQU5EQVJEOgorCQljYXNlIENGSV9DTURTRVRfSU5URUxfRVhURU5ERUQ6CisJCWRlZmF1bHQ6CisJCQlpbmZvLT5jbWRfcmVzZXQgPSBGTEFTSF9DTURfUkVTRVQ7CisJCQlicmVhazsKKwkJY2FzZSBDRklfQ01EU0VUX0FNRF9TVEFOREFSRDoKKwkJY2FzZSBDRklfQ01EU0VUX0FNRF9FWFRFTkRFRDoKKwkJCWluZm8tPmNtZF9yZXNldCA9IEFNRF9DTURfUkVTRVQ7CisJCQlicmVhazsKKwkJfQorCisJCWRlYnVnWCgyLCAibWFudWZhY3R1cmVyIGlzICVkXG4iLCBpbmZvLT52ZW5kb3IpOworCQlzaXplX3JhdGlvID0gaW5mby0+cG9ydHdpZHRoIC8gaW5mby0+Y2hpcHdpZHRoOworCQkvKiBpZiB0aGUgY2hpcCBpcyB4OC94MTYgcmVkdWNlIHRoZSByYXRpbyBieSBoYWxmICovCisjaWYgMAorCQlpZiAoKGluZm8tPmludGVyZmFjZSA9PSBGTEFTSF9DRklfWDhYMTYpCisJCSAgICAmJiAoaW5mby0+Y2hpcHdpZHRoID09IEZMQVNIX0NGSV9CWTgpKSB7CisJCQlzaXplX3JhdGlvID4+PSAxOworCQl9CisjZW5kaWYKKwkJbnVtX2VyYXNlX3JlZ2lvbnMgPSBmbGFzaF9yZWFkX3VjaGFyIChpbmZvLCBGTEFTSF9PRkZTRVRfTlVNX0VSQVNFX1JFR0lPTlMpOworCQlkZWJ1Z1goMiwgInNpemVfcmF0aW8gJWQgcG9ydCAlZCBiaXRzIGNoaXAgJWQgYml0c1xuIiwKKwkJICAgICAgIHNpemVfcmF0aW8sIGluZm8tPnBvcnR3aWR0aCA8PCBDRklfRkxBU0hfU0hJRlRfV0lEVEgsCisJCSAgICAgICBpbmZvLT5jaGlwd2lkdGggPDwgQ0ZJX0ZMQVNIX1NISUZUX1dJRFRIKTsKKwkJZGVidWdYKDIsICJmb3VuZCAlZCBlcmFzZSByZWdpb25zXG4iLCBudW1fZXJhc2VfcmVnaW9ucyk7CisJCXNlY3RfY250ID0gMDsKKwkJc2VjdG9yID0gYmFzZTsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9lcmFzZV9yZWdpb25zOyBpKyspIHsKKwkJCWlmIChpID4gTUFYX05VTV9FUkFTRV9SRUdJT05TKSB7CisJCQkJcHJpbnRmICgiJWQgZXJhc2UgcmVnaW9ucyBmb3VuZCwgb25seSAlZCB1c2VkXG4iLAorCQkJCQludW1fZXJhc2VfcmVnaW9ucywgTUFYX05VTV9FUkFTRV9SRUdJT05TKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8vIENGSSBFcmFzZSBCbG9jayBSZWdpb24gSW5mb3JtYXRpb246CisJCQkvLyBCaXRzWzMxOjE2XSA9IHNlY3Rfc2l6ZS8yNTYsIDAgbWVhbnMgMTI4LWJ5dGUKKwkJCS8vIEJpdHNbMTU6MF0gID0gbnVtX3NlY3RvcnMgLSAxCisJCQl0bXAgPSBmbGFzaF9yZWFkX2xvbmcoaW5mbywgMCwKKwkJCQkJICAgICAgRkxBU0hfT0ZGU0VUX0VSQVNFX1JFR0lPTlMgKyBpICogNCk7CisJCQlkZWJ1ZygiQ0ZJIGVyYXNlIGJsb2NrIHJlZ2lvbiBpbmZvWyVkXTogMHglMDh4LCAiLAorCQkJICAgICAgaSwgdG1wKTsKKwkJCWVyYXNlX3JlZ2lvbl9jb3VudCA9ICh0bXAgJiAweGZmZmYpICsgMTsKKwkJCXRtcCA+Pj0gMTY7CisJCQllcmFzZV9yZWdpb25fc2l6ZSA9ICh0bXAgPyB0bXAgKiAyNTYgOiAxMjgpOworCQkJZGVidWcgKCJlcmFzZV9yZWdpb25fY291bnQ9JWQgZXJhc2VfcmVnaW9uX3NpemU9JWRcbiIsCisJCQkJZXJhc2VfcmVnaW9uX2NvdW50LCBlcmFzZV9yZWdpb25fc2l6ZSk7CisjaWYgMAorICAgICAgICAgICAgICAgICAgICAgICAgZXJhc2VfcmVnaW9uX3NpemUgID0gQ0ZHX0ZMQVNIX1NFQ1RPUl9TSVpFOwkvLyBDb21tZW50ZWQgb3V0CisgICAgICAgICAgICAgICAgICAgICAgICBlcmFzZV9yZWdpb25fY291bnQgPSBDRkdfRkxBU0hfU0VDVE9SX0NPVU5UOwkvLyBDb21tZW50ZWQgb3V0CisjZW5kaWYKKwkJCWlmIChzZWN0X2NudCArIGVyYXNlX3JlZ2lvbl9jb3VudCA+IENPTkZJR19TWVNfTUFYX0ZMQVNIX1NFQ1QpIHsKKwkJCSAgICBwcmludGYoIldhcm5pbmc6IEVyYXNlIHJlZ2lvbiAlZCBhZGRzIHRvbyBtYW55IGZsYXNoIHNlY3RvcnMiCisJCQkJICAgIiAlZCslZDsgcmVkdWNpbmcgdG8gZml0IHRvdGFsIGxpbWl0IG9mICVkXG4iLAorCQkJCSAgIGksIHNlY3RfY250LCBlcmFzZV9yZWdpb25fY291bnQsIENPTkZJR19TWVNfTUFYX0ZMQVNIX1NFQ1QpOworCQkJICAgIGVyYXNlX3JlZ2lvbl9jb3VudCA9IENPTkZJR19TWVNfTUFYX0ZMQVNIX1NFQ1QgLSBzZWN0X2NudDsKKwkJCX0KKwkJCWZvciAoaiA9IDA7IGogPCBlcmFzZV9yZWdpb25fY291bnQ7IGorKykgeworCQkJCWluZm8tPnN0YXJ0W3NlY3RfY250XSA9IHNlY3RvcjsKKwkJCQlzZWN0b3IgKz0gKGVyYXNlX3JlZ2lvbl9zaXplICogc2l6ZV9yYXRpbyk7CisKKwkJCQkvKgorCQkJCSAqIE9ubHkgcmVhZCBwcm90ZWN0aW9uIHN0YXR1cyBmcm9tIHN1cHBvcnRlZCBkZXZpY2VzIChpbnRlbC4uLikKKwkJCQkgKi8KKwkJCQlzd2l0Y2ggKGluZm8tPnZlbmRvcikgeworCQkJCWNhc2UgQ0ZJX0NNRFNFVF9JTlRFTF9FWFRFTkRFRDoKKwkJCQljYXNlIENGSV9DTURTRVRfSU5URUxfU1RBTkRBUkQ6CisJCQkJCWluZm8tPnByb3RlY3Rbc2VjdF9jbnRdID0KKwkJCQkJCWZsYXNoX2lzc2V0IChpbmZvLCBzZWN0X2NudCwKKwkJCQkJCQkgICAgIEZMQVNIX09GRlNFVF9QUk9URUNULAorCQkJCQkJCSAgICAgRkxBU0hfU1RBVFVTX1BST1RFQ1QpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlpbmZvLT5wcm90ZWN0W3NlY3RfY250XSA9IDA7IC8qIGRlZmF1bHQ6IG5vdCBwcm90ZWN0ZWQgKi8KKwkJCQl9CisKKwkJCQlzZWN0X2NudCsrOworCQkJfQorCQl9CisKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gc2VjdF9jbnQ7CisJCS8qIG11bHRpcGx5IHRoZSBzaXplIGJ5IHRoZSBudW1iZXIgb2YgY2hpcHMgKi8KKwkJLy8gaW5mby0+c2l6ZSA9ICgxIDw8IGZsYXNoX3JlYWRfdWNoYXIgKGluZm8sIEZMQVNIX09GRlNFVF9TSVpFKSkgKiBzaXplX3JhdGlvOworCQkvLyBVc2Ugb25seSB0aGUgc2VjdG9ycyB0aGF0IGZpdCB3aXRoaW4gdGhlIGZsYXNoX2luZm8gYXJyYXkgc2l6ZS4KKwkJaW5mby0+c2l6ZSA9IHNlY3RvciAtIGJhc2U7CisJCXByaW50ZigiRmxhc2ggYmFuayAlZCBhdCAlMDh4IGhhcyAweCV4IGJ5dGVzIGluICVkIHNlY3RvcnMiCisJCSAgICAgICAiIChjaGlwU2l6ZSAxPDwlZCwgc2l6ZV9yYXRpbyAlZCkuXG4iLAorCQkgICAgICAgYmFua251bSwgYmFzZSwgaW5mby0+c2l6ZSwgaW5mby0+c2VjdG9yX2NvdW50LAorCQkgICAgICAgZmxhc2hfcmVhZF91Y2hhcihpbmZvLCBGTEFTSF9PRkZTRVRfU0laRSksIHNpemVfcmF0aW8pOworCisJCWluZm8tPmJ1ZmZlcl9zaXplID0gKDEgPDwgZmxhc2hfcmVhZF91Y2hhciAoaW5mbywgRkxBU0hfT0ZGU0VUX0JVRkZFUl9TSVpFKSk7CQkKKwkJLyogTGltaXQgdGhlIGJ1ZmZlciBzaXplIHRvIDMyYnl0ZXMgdG8gbWVldCBtb3N0IG9mIEFNRC1zdHlsZXMgZmxhc2gncyBtaW5pbXVtIHJlcXVpcmVtZW50ICovCisJCWlmIChpbmZvLT5idWZmZXJfc2l6ZSA+IDMyKQorCQkgICAgaW5mby0+YnVmZmVyX3NpemUgPSAzMjsgICAgCisJCXRtcCA9IDEgPDwgZmxhc2hfcmVhZF91Y2hhciAoaW5mbywgRkxBU0hfT0ZGU0VUX0VUT1VUKTsKKwkJaW5mby0+ZXJhc2VfYmxrX3RvdXQgPSAodG1wICogKDEgPDwgZmxhc2hfcmVhZF91Y2hhciAoaW5mbywgRkxBU0hfT0ZGU0VUX0VNQVhfVE9VVCkpKTsKKwkJdG1wID0gMSA8PCBmbGFzaF9yZWFkX3VjaGFyIChpbmZvLCBGTEFTSF9PRkZTRVRfV0JUT1VUKTsKKwkJaW5mby0+YnVmZmVyX3dyaXRlX3RvdXQgPSAodG1wICogKDEgPDwgZmxhc2hfcmVhZF91Y2hhciAoaW5mbywgRkxBU0hfT0ZGU0VUX1dCTUFYX1RPVVQpKSk7CisJCXRtcCA9IDEgPDwgZmxhc2hfcmVhZF91Y2hhciAoaW5mbywgRkxBU0hfT0ZGU0VUX1dUT1VUKTsKKwkJaW5mby0+d3JpdGVfdG91dCA9ICh0bXAgKiAoMSA8PCBmbGFzaF9yZWFkX3VjaGFyIChpbmZvLCBGTEFTSF9PRkZTRVRfV01BWF9UT1VUKSkpIC8gMTAwMDsKKwkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9NQU5fQ0ZJOworI2lmIDAKKwkJaWYgKChpbmZvLT5pbnRlcmZhY2UgPT0gRkxBU0hfQ0ZJX1g4WDE2KSAmJiAoaW5mby0+Y2hpcHdpZHRoID09IEZMQVNIX0NGSV9CWTgpKSB7CisJCQlpbmZvLT5wb3J0d2lkdGggPj49IDE7CS8qIFhYWCAtIE5lZWQgdG8gdGVzdCBvbiB4OC94MTYgaW4gcGFyYWxsZWwuICovCisJCX0KKyNlbmRpZgorCX0KKworCWZsYXNoX3dyaXRlX2NtZCAoaW5mbywgMCwgMCwgaW5mby0+Y21kX3Jlc2V0KTsKKwlyZXR1cm4gKGluZm8tPnNpemUpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCBmbGFzaF93cml0ZV9jZml3b3JkIChmbGFzaF9pbmZvX3QgKiBpbmZvLCB1bG9uZyBkZXN0LAorCQkJCWNmaXdvcmRfdCBjd29yZCkKK3sKKworCWNmaXB0cl90IGN0bGFkZHI7CisJY2ZpcHRyX3QgY3B0cjsKKwlpbnQgZmxhZzsKKworCWN0bGFkZHIuY3AgPSBmbGFzaF9tYWtlX2FkZHIgKGluZm8sIDAsIDApOworCWNwdHIuY3AgPSAodWNoYXIgKikgZGVzdDsKKworCisJLyogQ2hlY2sgaWYgRmxhc2ggaXMgKHN1ZmZpY2llbnRseSkgZXJhc2VkICovCisJc3dpdGNoIChpbmZvLT5wb3J0d2lkdGgpIHsKKwljYXNlIEZMQVNIX0NGSV84QklUOgorCQlmbGFnID0gKChjcHRyLmNwWzBdICYgY3dvcmQuYykgPT0gY3dvcmQuYyk7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfQ0ZJXzE2QklUOgorCQlmbGFnID0gKChjcHRyLndwWzBdICYgY3dvcmQudykgPT0gY3dvcmQudyk7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfQ0ZJXzMyQklUOgorCQlmbGFnID0gKChjcHRyLmxwWzBdICYgY3dvcmQubCkgPT0gY3dvcmQubCk7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfQ0ZJXzY0QklUOgorCQlmbGFnID0gKChjcHRyLmxscFswXSAmIGN3b3JkLmxsKSA9PSBjd29yZC5sbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAyOworCX0KKwlpZiAoIWZsYWcpCisJCXJldHVybiAyOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWNoIG1pZ2h0IGNhdXNlIGEgdGltZW91dCBoZXJlICovCisJZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cyAoKTsKKworCXN3aXRjaCAoaW5mby0+dmVuZG9yKSB7CisJY2FzZSBDRklfQ01EU0VUX0lOVEVMX0VYVEVOREVEOgorCWNhc2UgQ0ZJX0NNRFNFVF9JTlRFTF9TVEFOREFSRDoKKwkJZmxhc2hfd3JpdGVfY21kX25vZGJnIChpbmZvLCAwLCAwLCBGTEFTSF9DTURfQ0xFQVJfU1RBVFVTKTsKKwkJZmxhc2hfd3JpdGVfY21kX25vZGJnIChpbmZvLCAwLCAwLCBGTEFTSF9DTURfV1JJVEUpOworCQlicmVhazsKKwljYXNlIENGSV9DTURTRVRfQU1EX0VYVEVOREVEOgorCWNhc2UgQ0ZJX0NNRFNFVF9BTURfU1RBTkRBUkQ6CisJCWZsYXNoX3VubG9ja19zZXEgKGluZm8sIDApOworCQlmbGFzaF93cml0ZV9jbWRfbm9kYmcgKGluZm8sIDAsIEFNRF9BRERSX1NUQVJULCBBTURfQ01EX1dSSVRFKTsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChpbmZvLT5wb3J0d2lkdGgpIHsKKwljYXNlIEZMQVNIX0NGSV84QklUOgorCQljcHRyLmNwWzBdID0gY3dvcmQuYzsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9DRklfMTZCSVQ6CisJCWNwdHIud3BbMF0gPSBjd29yZC53OworCQlicmVhazsKKwljYXNlIEZMQVNIX0NGSV8zMkJJVDoKKwkJY3B0ci5scFswXSA9IGN3b3JkLmw7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfQ0ZJXzY0QklUOgorCQljcHRyLmxscFswXSA9IGN3b3JkLmxsOworCQlicmVhazsKKwl9CisKKwkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoZmxhZykKKwkJZW5hYmxlX2ludGVycnVwdHMgKCk7CisKKwlyZXR1cm4gZmxhc2hfZnVsbF9zdGF0dXNfY2hlY2sgKGluZm8sIDAsIGluZm8tPndyaXRlX3RvdXQsICJ3cml0ZSIpOworfQorCisjaWZkZWYgQ09ORklHX1NZU19GTEFTSF9VU0VfQlVGRkVSX1dSSVRFCisKKy8qIGxvb3AgdGhyb3VnaCB0aGUgc2VjdG9ycyBmcm9tIHRoZSBoaWdoZXN0IGFkZHJlc3MKKyAqIHdoZW4gdGhlIHBhc3NlZCBhZGRyZXNzIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIHNlY3RvciBhZGRyZXNzCisgKiB3ZSBoYXZlIGEgbWF0Y2gKKyAqLworc3RhdGljIGZsYXNoX3NlY3RfdCBmaW5kX3NlY3RvciAoZmxhc2hfaW5mb190ICogaW5mbywgdWxvbmcgYWRkcikKK3sKKwlmbGFzaF9zZWN0X3Qgc2VjdG9yOworCisJZm9yIChzZWN0b3IgPSBpbmZvLT5zZWN0b3JfY291bnQgLSAxOyBzZWN0b3IgPj0gMDsgc2VjdG9yLS0pIHsKKwkJaWYgKGFkZHIgPj0gaW5mby0+c3RhcnRbc2VjdG9yXSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gc2VjdG9yOworfQorCitzdGF0aWMgaW50IGZsYXNoX3dyaXRlX2NmaWJ1ZmZlciAoZmxhc2hfaW5mb190ICogaW5mbywgdWxvbmcgZGVzdCwgdWNoYXIgKiBjcCwKKwkJCQkgIGludCBsZW4pCit7CisJZmxhc2hfc2VjdF90IHNlY3RvcjsKKwlpbnQgY250OworCWludCByZXRjb2RlOworCXZvbGF0aWxlIGNmaXB0cl90IHNyYzsKKwl2b2xhdGlsZSBjZmlwdHJfdCBkc3Q7CisKKy8qIEFkZCBBTUQgd3JpdGUgYnVmZmVyIG1vZGUgc3VwcG9ydCwgeWNjaGVuQDEwMjAwNiAqLworI2lmIDAKKwkvKiBidWZmZXJlZCB3cml0ZXMgaW4gdGhlIEFNRCBjaGlwIHNldCBpcyBub3Qgc3VwcG9ydGVkIHlldCAqLworCWlmKChpbmZvLT52ZW5kb3IgPT0gIENGSV9DTURTRVRfQU1EX1NUQU5EQVJEKSB8fAorCQkoaW5mby0+dmVuZG9yID09IENGSV9DTURTRVRfQU1EX0VYVEVOREVEKSkKKwkJcmV0dXJuIEVSUl9JTlZBTDsKKyNlbmRpZgorCWlmKChpbmZvLT52ZW5kb3IgPT0gIENGSV9DTURTRVRfQU1EX1NUQU5EQVJEKSB8fAorCQkoaW5mby0+dmVuZG9yID09IENGSV9DTURTRVRfQU1EX0VYVEVOREVEKSkKKwl7CisJCXJldGNvZGUgPSBmbGFzaF93cml0ZV9jZmlidWZmZXJfYW1kKGluZm8sIGRlc3QsIGNwLCBsZW4pOworICAgICAgICAgICAgICAgIHJldHVybiByZXRjb2RlOworICAgICAgICB9CisKKwlzcmMuY3AgPSBjcDsKKwlkc3QuY3AgPSAodWNoYXIgKikgZGVzdDsKKwlzZWN0b3IgPSBmaW5kX3NlY3RvciAoaW5mbywgZGVzdCk7CisJZmxhc2hfd3JpdGVfY21kIChpbmZvLCBzZWN0b3IsIDAsIEZMQVNIX0NNRF9DTEVBUl9TVEFUVVMpOworCWZsYXNoX3dyaXRlX2NtZCAoaW5mbywgc2VjdG9yLCAwLCBGTEFTSF9DTURfV1JJVEVfVE9fQlVGRkVSKTsKKwlpZiAoKHJldGNvZGUgPQorCSAgICAgZmxhc2hfc3RhdHVzX2NoZWNrIChpbmZvLCBzZWN0b3IsIGluZm8tPmJ1ZmZlcl93cml0ZV90b3V0LAorCQkJCSAid3JpdGUgdG8gYnVmZmVyIikpID09IEVSUl9PSykgeworCQkvKiByZWR1Y2UgdGhlIG51bWJlciBvZiBsb29wcyBieSB0aGUgd2lkdGggb2YgdGhlIHBvcnQJKi8KKwkJc3dpdGNoIChpbmZvLT5wb3J0d2lkdGgpIHsKKwkJY2FzZSBGTEFTSF9DRklfOEJJVDoKKwkJCWNudCA9IGxlbjsKKwkJCWJyZWFrOworCQljYXNlIEZMQVNIX0NGSV8xNkJJVDoKKwkJCWNudCA9IGxlbiA+PiAxOworCQkJYnJlYWs7CisJCWNhc2UgRkxBU0hfQ0ZJXzMyQklUOgorCQkJY250ID0gbGVuID4+IDI7CisJCQlicmVhazsKKwkJY2FzZSBGTEFTSF9DRklfNjRCSVQ6CisJCQljbnQgPSBsZW4gPj4gMzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIEVSUl9JTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWZsYXNoX3dyaXRlX2NtZCAoaW5mbywgc2VjdG9yLCAwLCAodWNoYXIpIGNudCAtIDEpOworCQl3aGlsZSAoY250LS0gPiAwKSB7CisJCQlzd2l0Y2ggKGluZm8tPnBvcnR3aWR0aCkgeworCQkJY2FzZSBGTEFTSF9DRklfOEJJVDoKKwkJCQkqZHN0LmNwKysgPSAqc3JjLmNwKys7CisJCQkJYnJlYWs7CisJCQljYXNlIEZMQVNIX0NGSV8xNkJJVDoKKwkJCQkqZHN0LndwKysgPSAqc3JjLndwKys7CisJCQkJYnJlYWs7CisJCQljYXNlIEZMQVNIX0NGSV8zMkJJVDoKKwkJCQkqZHN0LmxwKysgPSAqc3JjLmxwKys7CisJCQkJYnJlYWs7CisJCQljYXNlIEZMQVNIX0NGSV82NEJJVDoKKwkJCQkqZHN0LmxscCsrID0gKnNyYy5sbHArKzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIEVSUl9JTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3RvciwgMCwKKwkJCQkgRkxBU0hfQ01EX1dSSVRFX0JVRkZFUl9DT05GSVJNKTsKKwkJcmV0Y29kZSA9CisJCQlmbGFzaF9mdWxsX3N0YXR1c19jaGVjayAoaW5mbywgc2VjdG9yLAorCQkJCQkJIGluZm8tPmJ1ZmZlcl93cml0ZV90b3V0LAorCQkJCQkJICJidWZmZXIgd3JpdGUiKTsKKwl9CisJZmxhc2hfd3JpdGVfY21kIChpbmZvLCBzZWN0b3IsIDAsIEZMQVNIX0NNRF9DTEVBUl9TVEFUVVMpOworCXJldHVybiByZXRjb2RlOworfQorCisKK3N0YXRpYyBpbnQgZmxhc2hfd3JpdGVfY2ZpYnVmZmVyX2FtZCAoZmxhc2hfaW5mb190ICogaW5mbywgdWxvbmcgZGVzdCwgdWNoYXIgKiBjcCwKKwkJCQkgIGludCBsZW4pCit7CisJZmxhc2hfc2VjdF90IHNlY3RvcjsKKwlpbnQgY250OworCWludCByZXRjb2RlOworCXZvbGF0aWxlIGNmaXB0cl90IHNyYzsKKwl2b2xhdGlsZSBjZmlwdHJfdCBkc3Q7CisJdm9sYXRpbGUgY2Zpd29yZF90IHRtcHNyYywgdG1wZHN0OworCisJc3JjLmNwID0gY3A7CisJZHN0LmNwID0gKHVjaGFyICopIGRlc3Q7CisJc2VjdG9yID0gZmluZF9zZWN0b3IgKGluZm8sIGRlc3QpOworCWZsYXNoX3VubG9ja19zZXEgKGluZm8sIDApOworCWlmICgocmV0Y29kZSA9CisJICAgICBmbGFzaF9zdGF0dXNfY2hlY2sgKGluZm8sIHNlY3RvciwgaW5mby0+YnVmZmVyX3dyaXRlX3RvdXQsCisJCQkJICJ3cml0ZSB0byBidWZmZXIiKSkgPT0gRVJSX09LKSB7CisJCS8qIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGxvb3BzIGJ5IHRoZSB3aWR0aCBvZiB0aGUgcG9ydAkqLworCQlzd2l0Y2ggKGluZm8tPnBvcnR3aWR0aCkgeworCQljYXNlIEZMQVNIX0NGSV84QklUOgorCQkJY250ID0gbGVuOworCQkJKmRzdC5jcCA9ICh1Y2hhcikgKEFNRF9DTURfV1JJVEVfVE9fQlVGRkVSKTsKKwkJCSpkc3QuY3AgPSAodWNoYXIpIChjbnQgLTEpOworCQkJYnJlYWs7CisJCWNhc2UgRkxBU0hfQ0ZJXzE2QklUOgorCQkJY250ID0gbGVuID4+IDE7CisJCQkqZHN0LndwID0gKHVuc2lnbmVkIHNob3J0KSAoQU1EX0NNRF9XUklURV9UT19CVUZGRVIpOworCQkJKmRzdC53cCA9ICh1bnNpZ25lZCBzaG9ydCkgKGNudCAtMSk7CisJCQlicmVhazsKKwkJY2FzZSBGTEFTSF9DRklfMzJCSVQ6CisJCQljbnQgPSBsZW4gPj4gMjsKKwkJCSpkc3QubHAgPSAodW5zaWduZWQgbG9uZykgKEFNRF9DTURfV1JJVEVfVE9fQlVGRkVSKTsKKwkJCSpkc3QubHAgPSAodW5zaWduZWQgbG9uZykgKGNudCAtMSk7CisJCQlicmVhazsKKwkJY2FzZSBGTEFTSF9DRklfNjRCSVQ6CisJCQljbnQgPSBsZW4gPj4gMzsKKwkJCSpkc3QubGxwID0gKHVuc2lnbmVkIGxvbmcgbG9uZykgKEFNRF9DTURfV1JJVEVfVE9fQlVGRkVSKTsKKwkJCSpkc3QubGxwID0gKHVuc2lnbmVkIGxvbmcgbG9uZykgKGNudCAtMSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBFUlJfSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQl3aGlsZSAoY250LS0gPiAwKSB7CisJCQlzd2l0Y2ggKGluZm8tPnBvcnR3aWR0aCkgeworCQkJY2FzZSBGTEFTSF9DRklfOEJJVDoKKwkJCQkqZHN0LmNwKysgPSAqc3JjLmNwKys7CisJCQkJYnJlYWs7CisJCQljYXNlIEZMQVNIX0NGSV8xNkJJVDoKKwkJCQkqZHN0LndwKysgPSAqc3JjLndwKys7CisJCQkJYnJlYWs7CisJCQljYXNlIEZMQVNIX0NGSV8zMkJJVDoKKwkJCQkqZHN0LmxwKysgPSAqc3JjLmxwKys7CisJCQkJYnJlYWs7CisJCQljYXNlIEZMQVNIX0NGSV82NEJJVDoKKwkJCQkqZHN0LmxscCsrID0gKnNyYy5sbHArKzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIEVSUl9JTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQkJCQkKKwkJc3dpdGNoIChpbmZvLT5wb3J0d2lkdGgpIHsKKwkJY2FzZSBGTEFTSF9DRklfOEJJVDoKKwkJICAgICAgICBzcmMuY3AtLTsKKwkJICAgICAgICBkc3QuY3AtLTsKKwkJCSpkc3QuY3AgPSAodW5zaWduZWQgY2hhcikgKEFNRF9DTURfQlVGRkVSX1RPX0ZMQVNIKTsKKwkJICAgICAgICB0bXBzcmMuYyA9ICpzcmMuY3AgJiAweDgwOworCQkgICAgICAgIAorCQkgICAgICAgIGRvIHsKKwkJICAgICAgICAgICAgdG1wZHN0LmMgPSAqKHZvbGF0aWxlIHVjaGFyICopKGRzdC5jcCk7CQkgICAgICAgIAorCQkgICAgICAgIAkKKwkJICAgICAgICAgICAgaWYgKHRtcGRzdC5jICYgMHgyMCkgewkvKiB0b2dnbGUgRFE1ICovCisJCSAgICAgICAgICAgICAgICAgdG1wZHN0LmMgPSAqKHZvbGF0aWxlIHVjaGFyICopKGRzdC5jcCk7CQkgICAgICAgIAorCQkgICAgICAgICAgICAgICAgIGlmICgodG1wZHN0LmMgJiAweDgwKSAhPSB0bXBzcmMuYykKKwkJICAgICAgICAgICAgICAgICB7CisJCSAgICAgICAgICAgICAgICAgICAgIHByaW50ZigicHJvZ3JhbSBlcnJvciBvY2N1cnJlZFxuIik7CisJCQkgICAgICAgICAgICAgZmxhc2hfd3JpdGVfY21kIChpbmZvLCBzZWN0b3IsIDAsIGluZm8tPmNtZF9yZXNldCk7CQkgICAgICAgICAgICAKKwkJCSAgICAgICAgICAgICByZXR1cm4gRVJSX1BST0dfRVJST1I7CQkJICAgICAgICAgICAgIAorCQkJICAgICAgICAgfSAgICAKKwkJICAgICAgICAgICAgfQorCQkgICAgICAgICAgICBlbHNlIGlmICh0bXBkc3QuYyAmIDB4MDIpIHsJLyogdG9nZ2xlIERRMSAqLworCQkgICAgICAgICAgICAgICAgIHRtcGRzdC5jID0gKih2b2xhdGlsZSB1Y2hhciAqKShkc3QuY3ApOwkJICAgICAgICAKKwkJICAgICAgICAgICAgICAgICBpZiAoKHRtcGRzdC5jICYgMHg4MCkgIT0gdG1wc3JjLmMpCisJCSAgICAgICAgICAgICAgICAgeworCQkgICAgICAgICAgICAgICAgICAgICBwcmludGYoIndyaXRlIGJ1ZmZlciBlcnJvciBvY2N1cnJlZCBcbiIpOworCQkgICAgICAgICAgICAgICAgICAgICB3cml0ZV9idWZmZXJfYWJvcnRfcmVzZXQoaW5mbywgc2VjdG9yKTsKKwkJCSAgICAgICAgICAgICByZXR1cm4gRVJSX1BST0dfRVJST1I7CQkJICAgICAgICAgICAgIAorCQkJICAgICAgICAgfSAJCSAgICAgICAgICAgIAorCQkgICAgICAgICAgICB9CQorCQkgICAgICAgICAgICAJCSAgICAgICAgICAgICAgICAJCisJCSAgICAgICAgfSB3aGlsZSAoKHRtcGRzdC5jICYgMHg4MCkgIT0gdG1wc3JjLmMpOworCQkgICAgICAgIAkJCSAgICAgICAgCisJCQlicmVhazsKKwkJY2FzZSBGTEFTSF9DRklfMTZCSVQ6CisJCSAgICAgICAgc3JjLndwLS07CisJCSAgICAgICAgZHN0LndwLS07CisJCQkqZHN0LndwID0gKHVuc2lnbmVkIHNob3J0KSAoQU1EX0NNRF9CVUZGRVJfVE9fRkxBU0gpOworCQkgICAgICAgIHRtcHNyYy53ID0gKnNyYy53cCAmIDB4ODA7CisKKwkJICAgICAgICBkbyB7CisJCSAgICAgICAgICAgIHRtcGRzdC53ID0gKih2b2xhdGlsZSBzaG9ydCAqKShkc3Qud3ApOwkJICAgICAgICAKKwkJICAgICAgICAJCisJCSAgICAgICAgICAgIGlmICh0bXBkc3QudyAmIDB4MjApIHsJLyogdG9nZ2xlIERRNSAqLworCQkgICAgICAgICAgICAgICAgIHRtcGRzdC53ID0gKih2b2xhdGlsZSB1c2hvcnQgKikoZHN0LndwKTsJCSAgICAgICAgCisJCSAgICAgICAgICAgICAgICAgaWYgKCh0bXBkc3QudyAmIDB4ODApICE9IHRtcHNyYy53KQorCQkgICAgICAgICAgICAgICAgIHsKKwkJICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJwcm9ncmFtIGVycm9yIG9jY3VycmVkXG4iKTsKKwkJCSAgICAgICAgICAgICBmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3RvciwgMCwgaW5mby0+Y21kX3Jlc2V0KTsJCSAgICAgICAgICAgIAorCQkJICAgICAgICAgICAgIHJldHVybiBFUlJfUFJPR19FUlJPUjsJCQkgICAgICAgICAgICAgCisJCQkgICAgICAgICB9ICAgIAorCQkgICAgICAgICAgICB9CisJCSAgICAgICAgICAgIGVsc2UgaWYgKHRtcGRzdC53ICYgMHgwMikgewkvKiB0b2dnbGUgRFExICovCisJCSAgICAgICAgICAgICAgICAgdG1wZHN0LncgPSAqKHZvbGF0aWxlIHVzaG9ydCAqKShkc3Qud3ApOwkJICAgICAgICAKKwkJICAgICAgICAgICAgICAgICBpZiAoKHRtcGRzdC53ICYgMHg4MCkgIT0gdG1wc3JjLncpCisJCSAgICAgICAgICAgICAgICAgeworCQkgICAgICAgICAgICAgICAgICAgICBwcmludGYoIndyaXRlIGJ1ZmZlciBlcnJvciBvY2N1cnJlZCBcbiIpOworCQkgICAgICAgICAgICAgICAgICAgICB3cml0ZV9idWZmZXJfYWJvcnRfcmVzZXQoaW5mbywgc2VjdG9yKTsKKwkJCSAgICAgICAgICAgICByZXR1cm4gRVJSX1BST0dfRVJST1I7CQkJICAgICAgICAgICAgIAorCQkJICAgICAgICAgfSAJCSAgICAgICAgICAgIAorCQkgICAgICAgICAgICB9CQorCQkgICAgICAgICAgICAJCSAgICAgICAgICAgICAgICAJCisJCSAgICAgICAgfSB3aGlsZSAoKHRtcGRzdC53ICYgMHg4MCkgIT0gdG1wc3JjLncpOworCQkgICAgICAgIAorCQkJYnJlYWs7CisJCWNhc2UgRkxBU0hfQ0ZJXzMyQklUOgorCQkgICAgICAgIHNyYy5scC0tOworCQkgICAgICAgIGRzdC5scC0tOworCQkJKmRzdC5scCA9ICh1bnNpZ25lZCBsb25nKSAoQU1EX0NNRF9CVUZGRVJfVE9fRkxBU0gpOworCQkgICAgICAgIHRtcHNyYy5sID0gKnNyYy5scCAmIDB4ODA7CisJCSAgICAgICAgCisJCSAgICAgICAgZG8geworCQkgICAgICAgICAgICB0bXBkc3QubCA9ICoodm9sYXRpbGUgdWxvbmcgKikoZHN0LmxwKTsJCSAgICAgICAgCisJCSAgICAgICAgCQorCQkgICAgICAgICAgICBpZiAodG1wZHN0LmwgJiAweDIwKSB7CS8qIHRvZ2dsZSBEUTUgKi8KKwkJICAgICAgICAgICAgICAgICB0bXBkc3QubCA9ICoodm9sYXRpbGUgdWxvbmcgKikoZHN0LmxwKTsJCSAgICAgICAgCisJCSAgICAgICAgICAgICAgICAgaWYgKCh0bXBkc3QubCAmIDB4ODApICE9IHRtcHNyYy5sKQorCQkgICAgICAgICAgICAgICAgIHsKKwkJICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJwcm9ncmFtIGVycm9yIG9jY3VycmVkXG4iKTsKKwkJCSAgICAgICAgICAgICBmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3RvciwgMCwgaW5mby0+Y21kX3Jlc2V0KTsJCSAgICAgICAgICAgIAorCQkJICAgICAgICAgICAgIHJldHVybiBFUlJfUFJPR19FUlJPUjsJCQkgICAgICAgICAgICAgCisJCQkgICAgICAgICB9ICAgIAorCQkgICAgICAgICAgICB9CisJCSAgICAgICAgICAgIGVsc2UgaWYgKHRtcGRzdC5sICYgMHgwMikgewkvKiB0b2dnbGUgRFExICovCisJCSAgICAgICAgICAgICAgICAgdG1wZHN0LmwgPSAqKHZvbGF0aWxlIHVsb25nICopKGRzdC5scCk7CQkgICAgICAgIAorCQkgICAgICAgICAgICAgICAgIGlmICgodG1wZHN0LmwgJiAweDgwKSAhPSB0bXBzcmMubCkKKwkJICAgICAgICAgICAgICAgICB7CisJCSAgICAgICAgICAgICAgICAgICAgIHByaW50Zigid3JpdGUgYnVmZmVyIGVycm9yIG9jY3VycmVkIFxuIik7CisJCSAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2J1ZmZlcl9hYm9ydF9yZXNldChpbmZvLCBzZWN0b3IpOworCQkJICAgICAgICAgICAgIHJldHVybiBFUlJfUFJPR19FUlJPUjsJCQkgICAgICAgICAgICAgCisJCQkgICAgICAgICB9IAkJICAgICAgICAgICAgCisJCSAgICAgICAgICAgIH0JCisJCSAgICAgICAgICAgIAkJICAgICAgICAgICAgICAgIAkKKwkJICAgICAgICB9IHdoaWxlICgodG1wZHN0LmwgJiAweDgwKSAhPSB0bXBzcmMubCk7CisJCSAgICAgICAgCisJCQlicmVhazsKKwkJY2FzZSBGTEFTSF9DRklfNjRCSVQ6CisJCSAgICAgICAgc3JjLmxscC0tOworCQkgICAgICAgIGRzdC5sbHAtLTsKKwkJCSpkc3QubGxwID0gKHVuc2lnbmVkIGxvbmcgbG9uZykgKEFNRF9DTURfQlVGRkVSX1RPX0ZMQVNIKTsKKwkJICAgICAgICB0bXBzcmMubGwgPSAqc3JjLmxscCAmIDB4ODA7CisJCSAgICAgICAgCisJCSAgICAgICAgZG8geworCQkgICAgICAgICAgICB0bXBkc3QubGwgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbG9uZyAqKShkc3QubGxwKTsJCSAgICAgICAgCisJCSAgICAgICAgCQorCQkgICAgICAgICAgICBpZiAodG1wZHN0LmxsICYgMHgyMCkgewkvKiB0b2dnbGUgRFE1ICovCisJCSAgICAgICAgICAgICAgICAgdG1wZHN0LmxsID0gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGxvbmcgKikoZHN0LmxscCk7CQkgICAgICAgIAorCQkgICAgICAgICAgICAgICAgIGlmICgodG1wZHN0LmxsICYgMHg4MCkgIT0gdG1wc3JjLmxsKQorCQkgICAgICAgICAgICAgICAgIHsKKwkJICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJwcm9ncmFtIGVycm9yIG9jY3VycmVkXG4iKTsKKwkJCSAgICAgICAgICAgICBmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3RvciwgMCwgaW5mby0+Y21kX3Jlc2V0KTsJCSAgICAgICAgICAgIAorCQkJICAgICAgICAgICAgIHJldHVybiBFUlJfUFJPR19FUlJPUjsJCQkgICAgICAgICAgICAgCisJCQkgICAgICAgICB9ICAgIAorCQkgICAgICAgICAgICB9CisJCSAgICAgICAgICAgIGVsc2UgaWYgKHRtcGRzdC5sbCAmIDB4MDIpIHsJLyogdG9nZ2xlIERRMSAqLworCQkgICAgICAgICAgICAgICAgIHRtcGRzdC5sbCA9ICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsb25nICopKGRzdC5sbHApOwkJICAgICAgICAKKwkJICAgICAgICAgICAgICAgICBpZiAoKHRtcGRzdC5sbCAmIDB4ODApICE9IHRtcHNyYy5sbCkKKwkJICAgICAgICAgICAgICAgICB7CisJCSAgICAgICAgICAgICAgICAgICAgIHByaW50Zigid3JpdGUgYnVmZmVyIGVycm9yIG9jY3VycmVkIFxuIik7CisJCSAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2J1ZmZlcl9hYm9ydF9yZXNldChpbmZvLCBzZWN0b3IpOworCQkJICAgICAgICAgICAgIHJldHVybiBFUlJfUFJPR19FUlJPUjsJCQkgICAgICAgICAgICAgCisJCQkgICAgICAgICB9IAkJICAgICAgICAgICAgCisJCSAgICAgICAgICAgIH0JCisJCSAgICAgICAgICAgIAkJICAgICAgICAgICAgICAgIAkKKwkJICAgICAgICB9IHdoaWxlICgodG1wZHN0LmxsICYgMHg4MCkgIT0gdG1wc3JjLmxsKTsKKwkJICAgICAgICAKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIEVSUl9JTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0Y29kZSA9CisJCQlmbGFzaF9mdWxsX3N0YXR1c19jaGVjayAoaW5mbywgc2VjdG9yLAorCQkJCQkJIGluZm8tPmJ1ZmZlcl93cml0ZV90b3V0LAorCQkJCQkJICJidWZmZXIgd3JpdGUiKTsKKwl9CisKKwlyZXR1cm4gcmV0Y29kZTsKK30KKyNlbmRpZiAvKiBDT05GSUdfU1lTX0ZMQVNIX1VTRV9CVUZGRVJfV1JJVEUgKi8KKworI2lmZGVmCUNPTkZJR19GTEFTSF9BU1QyMzAwX0RNQQorI2RlZmluZSBTVENCYXNlQWRkcmVzcwkJCTB4MWU2MjAwMDAKKworLyogZm9yIERNQSAqLworI2RlZmluZSBSRUdfRkxBU0hfSU5URVJSVVBUX1NUQVRVUwkweDA4CisjZGVmaW5lIFJFR19GTEFTSF9ETUFfQ09OVFJPTAkJMHg4MAorI2RlZmluZSBSRUdfRkxBU0hfRE1BX0ZMQVNIX0JBU0UJMHg4NAorI2RlZmluZSBSRUdfRkxBU0hfRE1BX0RSQU1fQkFTRQkJMHg4OAorI2RlZmluZSBSRUdfRkxBU0hfRE1BX0xFTkdUSAkJMHg4YworCisjZGVmaW5lIEZMQVNIX1NUQVRVU19ETUFfQlVTWQkJMHgwMDAwCisjZGVmaW5lIEZMQVNIX1NUQVRVU19ETUFfUkVBRFkJCTB4MDgwMAorI2RlZmluZSBGTEFTSF9TVEFUVVNfRE1BX0NMRUFSCQkweDA4MDAKKworI2RlZmluZSBGTEFTSF9ETUFfRU5BQkxFCQkweDAxCisKK3ZvaWQgKiBtZW1tb3ZlX2RtYSh2b2lkICogZGVzdCxjb25zdCB2b2lkICpzcmMsc2l6ZV90IGNvdW50KQoreworCXVsb25nIGNvdW50X2FsaWduLCBwb2xsX3RpbWUsIGRhdGE7CisJCisJY291bnRfYWxpZ24gPSAoY291bnQgKyAzKSAmIDB4RkZGRkZGRkM7CS8qIDQtYnl0ZXMgYWxpZ24gKi8KKyAgICAgICAgcG9sbF90aW1lID0gMTAwOwkJCS8qIHNldCAxMDAgdXMgYXMgZGVmYXVsdCAqLworCisJKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBSRUdfRkxBU0hfRE1BX0NPTlRST0wpID0gKHVsb25nKSAofkZMQVNIX0RNQV9FTkFCTEUpOworCQorCSoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgUkVHX0ZMQVNIX0RNQV9GTEFTSF9CQVNFKSA9ICh1bG9uZyAqKSAoc3JjKTsKKwkqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIFJFR19GTEFTSF9ETUFfRFJBTV9CQVNFKSA9ICh1bG9uZyAqKSAoZGVzdCk7CisJKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBSRUdfRkxBU0hfRE1BX0xFTkdUSCkgPSAodWxvbmcpIChjb3VudF9hbGlnbik7CisgICAgICAgIHVkZWxheSgxMCk7CisJKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBSRUdfRkxBU0hfRE1BX0NPTlRST0wpID0gKHVsb25nKSAoRkxBU0hfRE1BX0VOQUJMRSk7CisJCisJLyogd2FpdCBwb2xsICovCisJZG8geworCSAgICB1ZGVsYXkocG9sbF90aW1lKTsJCisJICAgIGRhdGEgPSAqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIFJFR19GTEFTSF9JTlRFUlJVUFRfU1RBVFVTKTsKKwl9IHdoaWxlICghKGRhdGEgJiBGTEFTSF9TVEFUVVNfRE1BX1JFQURZKSk7CisJCisJLyogY2xlYXIgc3RhdHVzICovCisJKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBSRUdfRkxBU0hfSU5URVJSVVBUX1NUQVRVUykgfD0gRkxBU0hfU1RBVFVTX0RNQV9DTEVBUjsKK30JCisjZW5kaWYKKyNlbmRpZiAvKiBDRkdfRkxBU0hfQ0ZJICovCmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjMwMC9mbGFzaF9zcGkuYyBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL2ZsYXNoX3NwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY2NjA2MjgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hc3BlZWQvYXN0MjMwMC9mbGFzaF9zcGkuYwpAQCAtMCwwICsxLDE2MzkgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBIaXN0b3J5CisgKiAwMS8yMC8yMDA0IC0gY29tYmluZWQgdmFyaWFudHMgb2Ygb3JpZ2luYWwgZHJpdmVyLgorICogMDEvMjIvMjAwNCAtIFdyaXRlIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cyBmb3IgcGFyYWxsZWwgY2hpcHMgKFRvbHVuYXkpCisgKiAwMS8yMy8yMDA0IC0gU3VwcG9ydCBmb3IgeDgveDE2IGNoaXBzIChSdW5lIFJha25lcnVkKQorICogMDEvMjcvMjAwNCAtIExpdHRsZSBlbmRpYW4gc3VwcG9ydCBFZCBPa2Vyc29uCisgKgorICogVGVzdGVkIEFyY2hpdGVjdHVyZXMKKyAqIFBvcnQgV2lkdGggIENoaXAgV2lkdGggICAgIyBvZiBiYW5rcwkgICBGbGFzaCBDaGlwICBCb2FyZAorICogMzIJICAgICAgIDE2CSAgICAgMQkJICAgMjhGMTI4SjMgICAgc2VyYW5vYS9lYWdsZQorICogNjQJICAgICAgIDE2CSAgICAgMQkJICAgMjhGMTI4SjMgICAgc2VyYW5vYS9mYWxjb24KKyAqCisgKi8KKworLyogVGhlIERFQlVHIGRlZmluZSBtdXN0IGJlIGJlZm9yZSBjb21tb24gdG8gZW5hYmxlIGRlYnVnZ2luZyAqLworLyogI2RlZmluZSBERUJVRwkqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxlbnZpcm9ubWVudC5oPgorI2lmZGVmCUNPTkZJR19GTEFTSF9TUEkKKworLyoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgQ29tbW9uIEZsYXNoIEludGVyZmFjZSAoQ0ZJKSBkcml2ZXIgZm9yIFUtQm9vdC4KKyAqIFRoZSB3aWR0aCBvZiB0aGUgcG9ydCBhbmQgdGhlIHdpZHRoIG9mIHRoZSBjaGlwcyBhcmUgZGV0ZXJtaW5lZCBhdCBpbml0aWFsaXphdGlvbi4KKyAqIFRoZXNlIHdpZHRocyBhcmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGFkZHJlc3MgZm9yIGFjY2VzcyBDRkkgZGF0YSBzdHJ1Y3R1cmVzLgorICogSXQgaGFzIGJlZW4gdGVzdGVkIG9uIGFuIEludGVsIFN0cmF0YWZsYXNoIGltcGxlbWVudGF0aW9uIGFuZCBBTUQgMjlGMDE2RC4KKyAqCisgKiBSZWZlcmVuY2VzCisgKiBKRURFQyBTdGFuZGFyZCBKRVNENjggLSBDb21tb24gRmxhc2ggSW50ZXJmYWNlIChDRkkpCisgKiBKRURFQyBTdGFuZGFyZCBKRVAxMzctQSBDb21tb24gRmxhc2ggSW50ZXJmYWNlIChDRkkpIElEIENvZGVzCisgKiBJbnRlbCBBcHBsaWNhdGlvbiBOb3RlIDY0NiBDb21tb24gRmxhc2ggSW50ZXJmYWNlIChDRkkpIGFuZCBDb21tYW5kIFNldHMKKyAqIEludGVsIDI5MDY2Ny0wMDggMyBWb2x0IEludGVsIFN0cmF0YUZsYXNoIE1lbW9yeSBkYXRhc2hlZXQKKyAqCisgKiBUT0RPCisgKgorICogVXNlIFByaW1hcnkgRXh0ZW5kZWQgUXVlcnkgdGFibGUgKFBSSSkgYW5kIEFsdGVybmF0ZSBBbGdvcml0aG0gUXVlcnkKKyAqIFRhYmxlIChBTFQpIHRvIGRldGVybWluZSBpZiBwcm90ZWN0aW9uIGlzIGF2YWlsYWJsZQorICoKKyAqIEFkZCBzdXBwb3J0IGZvciBvdGhlciBjb21tYW5kIHNldHMgVXNlIHRoZSBQUkkgYW5kIEFMVCB0byBkZXRlcm1pbmUgY29tbWFuZCBzZXQKKyAqIFZlcmlmeSBlcmFzZSBhbmQgcHJvZ3JhbSB0aW1lb3V0cy4KKyAqLworCisjaWZuZGVmIENPTkZJR19GTEFTSF9CQU5LU19MSVNUCisjZGVmaW5lIENPTkZJR19GTEFTSF9CQU5LU19MSVNUIHsgQ09ORklHX1NZU19GTEFTSF9CQVNFIH0KKyNlbmRpZgorCisvKiB1c2UgQ0ZHX01BWF9GTEFTSF9CQU5LU19ERVRFQ1QgaWYgZGVmaW5lZCAqLworI2lmZGVmIENPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTX0RFVEVDVAorc3RhdGljIHVsb25nIGJhbmtfYmFzZVtDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LU19ERVRFQ1RdID0gQ09ORklHX0ZMQVNIX0JBTktTX0xJU1Q7CitmbGFzaF9pbmZvX3QgZmxhc2hfaW5mb1tDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LU19ERVRFQ1RdOwkvKiBGTEFTSCBjaGlwcyBpbmZvICovCisjZWxzZQorc3RhdGljIHVsb25nIGJhbmtfYmFzZVtDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LU10gPSBDT05GSUdfRkxBU0hfQkFOS1NfTElTVDsKK2ZsYXNoX2luZm9fdCBmbGFzaF9pbmZvW0NPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTXTsJCS8qIEZMQVNIIGNoaXBzIGluZm8gKi8KKyNlbmRpZgorCisvKiBTdXBwb3J0IEZsYXNoIElEICovCisjZGVmaW5lIFNUTTI1UDY0CQkweDE3MjAyMAorI2RlZmluZSBTVE0yNVAxMjgJCTB4MTgyMDIwCisjZGVmaW5lIE4yNVEyNTYJCQkweDE5YmEyMAorI2RlZmluZSBOMjVRNTEyCQkJMHgyMGJhMjAKKyNkZWZpbmUgUzI1RkwwNjRBCQkweDE2MDIwMQorI2RlZmluZSBTMjVGTDEyOFAJCTB4MTgyMDAxCisjZGVmaW5lIFMyNUZMMjU2UwkJMHgxOTAyMDEKKyNkZWZpbmUgVzI1WDE2CQkJMHgxNTMwZWYKKyNkZWZpbmUgVzI1WDY0CQkJMHgxNzMwZWYKKyNkZWZpbmUgVzI1UTY0QlYJCTB4MTc0MGVmCisjZGVmaW5lIFcyNVExMjhCVgkJMHgxODQwZWYKKyNkZWZpbmUgVzI1UTI1NkZWCQkweDE5NDBlZgorI2RlZmluZSBNWDI1TDE2MDVECQkweDE1MjBDMgorI2RlZmluZSBNWDI1TDEyODA1RAkJMHgxODIwQzIKKyNkZWZpbmUgTVgyNUwyNTYzNUUJCTB4MTkyMEMyCisjZGVmaW5lIFNTVDI1VkYwMTZCICAgICAgICAgICAgIDB4NDEyNWJmCisjZGVmaW5lIFNTVDI1VkYwNjRDICAgICAgICAgICAgIDB4NGIyNWJmCisjZGVmaW5lIEFUMjVERjE2MQkJMHgwMjQ2MUYKKyNkZWZpbmUgQVQyNURGMzIxCQkweDAxNDcxRgorCisvKiBTUEkgRGVmaW5lICovCisjaWYJZGVmaW5lZChDT05GSUdfRkxBU0hfQVNUMjMwMCkgfHwgZGVmaW5lZChDT05GSUdfQVNUMTMwMCkKKyNpZglkZWZpbmVkKENPTkZJR19BU1QxMzAwKQorI2RlZmluZSBTVENCYXNlQWRkcmVzcwkJCTB4MDA2MjAwMDAKKyNlbHNlCisjZGVmaW5lIFNUQ0Jhc2VBZGRyZXNzCQkJMHgxZTYyMDAwMAorI2VuZGlmCisjZGVmaW5lIFNDVV9SRVZJU0lPTl9SRUdJU1RFUgkJMHgxZTZlMjA3YworI2RlZmluZSBTQ1VfQ0FDSEVfQ1RSTF9SRUdJU1RFUgkJMHgxZTZlMjExOAorCisjZGVmaW5lIFNQSUN0cmxSZWdPZmZzZXQJCTB4MTAKKyNkZWZpbmUgU1BJQ3RybFJlZ09mZnNldDIJCTB4MTQKKworI2RlZmluZSBTUElNaXNjQ3RybFJlZ09mZnNldAkJMHg1NAorCisvKiBmb3IgRE1BICovCisjZGVmaW5lIFJFR19GTEFTSF9JTlRFUlJVUFRfU1RBVFVTCTB4MDgKKyNkZWZpbmUgUkVHX0ZMQVNIX0RNQV9DT05UUk9MCQkweDgwCisjZGVmaW5lIFJFR19GTEFTSF9ETUFfRkxBU0hfQkFTRQkweDg0CisjZGVmaW5lIFJFR19GTEFTSF9ETUFfRFJBTV9CQVNFCQkweDg4CisjZGVmaW5lIFJFR19GTEFTSF9ETUFfTEVOR1RICQkweDhjCisKKyNkZWZpbmUgRkxBU0hfU1RBVFVTX0RNQV9CVVNZCQkweDAwMDAKKyNkZWZpbmUgRkxBU0hfU1RBVFVTX0RNQV9SRUFEWQkJMHgwODAwCisjZGVmaW5lIEZMQVNIX1NUQVRVU19ETUFfQ0xFQVIJCTB4MDgwMAorCisjZGVmaW5lIEZMQVNIX0RNQV9FTkFCTEUJCTB4MDEKKyNlbHNlCisjZGVmaW5lIFNUQ0Jhc2VBZGRyZXNzCQkJMHgxNjAwMDAwMAorCisjZGVmaW5lIFNQSUN0cmxSZWdPZmZzZXQJCTB4MDQKKyNkZWZpbmUgU1BJQ3RybFJlZ09mZnNldDIJCTB4MEMKKyNlbmRpZgkvKiBDT05GSUdfRkxBU0hfQVNUMjMwMCAqLworCisjZGVmaW5lIENNRF9NQVNLCQkweEZGRkZGRkY4CisKKyNkZWZpbmUgTk9STUFMUkVBRAkJMHgwMAorI2RlZmluZQlGQVNUUkVBRAkJMHgwMQorI2RlZmluZSBOT1JNQUxXUklURQkJMHgwMgorI2RlZmluZSBVU0VSTU9ERQkJMHgwMworCisjZGVmaW5lIENFX0xPVwkJCTB4MDAKKyNkZWZpbmUgQ0VfSElHSAkJCTB4MDQKKworLyogQVNUMjMwMCBvbmx5ICovCisjZGVmaW5lIElPTU9ERXgxCQkweDAwMDAwMDAwCisjZGVmaW5lIElPTU9ERXgyCQkweDIwMDAwMDAwCisjZGVmaW5lIElPTU9ERXgyX2R1bW15CQkweDMwMDAwMDAwCisjZGVmaW5lIElPTU9ERXg0CQkweDQwMDAwMDAwCisjZGVmaW5lIElPTU9ERXg0X2R1bW15CQkweDUwMDAwMDAwCisKKyNkZWZpbmUgRFVNTVlfQ09NTUFORF9PVVQJMHgwMDAwODAwMAorLyogfkFTVDIzMDAgb25seSAqLworCisvKiBzcGVjaWZpY3NwaSAqLworI2RlZmluZSBTcGVjaWZpY1NQSV9OMjVRNTEyCTB4MDAwMDAwMDEJCQorCitzdGF0aWMgdWxvbmcgQVNUMjMwMF9TUElDTEtfRElWWzE2XSA9IHsweDBGLCAweDA3LCAweDBFLCAweDA2LCAweDBELCAweDA1LCAweDBDLCAweDA0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCLCAweDAzLCAweDBBLCAweDAyLCAweDA5LCAweDAxLCAweDA4LCAweDAwIH07CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZCByZXNldF9mbGFzaCAoZmxhc2hfaW5mb190ICogaW5mbyk7CitzdGF0aWMgdm9pZCBlbmFibGVfd3JpdGUgKGZsYXNoX2luZm9fdCAqIGluZm8pOworc3RhdGljIHZvaWQgd3JpdGVfc3RhdHVzX3JlZ2lzdGVyIChmbGFzaF9pbmZvX3QgKiBpbmZvLCB1Y2hhciBkYXRhKTsKK3N0YXRpYyB2b2lkIGVuYWJsZTRiIChmbGFzaF9pbmZvX3QgKiBpbmZvKTsKK3N0YXRpYyB2b2lkIGVuYWJsZTRiX3NwYW5zaW9uIChmbGFzaF9pbmZvX3QgKiBpbmZvKTsKK3N0YXRpYyB2b2lkIGVuYWJsZTRiX251bW9ueXggKGZsYXNoX2luZm9fdCAqIGluZm8pOworc3RhdGljIHVsb25nIGZsYXNoX2dldF9zaXplICh1bG9uZyBiYXNlLCBpbnQgYmFua251bSk7CitzdGF0aWMgaW50IGZsYXNoX3dyaXRlX2J1ZmZlciAoZmxhc2hfaW5mb190ICppbmZvLCB1Y2hhciAqc3JjLCB1bG9uZyBhZGRyLCBpbnQgbGVuKTsKKyNpZiBkZWZpbmVkKENGR19FTlZfSVNfSU5fRkxBU0gpIHx8IGRlZmluZWQoQ0ZHX0VOVl9BRERSX1JFRFVORCkgfHwgKENGR19NT05JVE9SX0JBU0UgPj0gQ0ZHX0ZMQVNIX0JBU0UpCitzdGF0aWMgZmxhc2hfaW5mb190ICpmbGFzaF9nZXRfaW5mbyh1bG9uZyBiYXNlKTsKKyNlbmRpZgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGNyZWF0ZSBhbiBhZGRyZXNzIGJhc2VkIG9uIHRoZSBvZmZzZXQgYW5kIHRoZSBwb3J0IHdpZHRoCisgKi8KK2lubGluZSB1Y2hhciAqZmxhc2hfbWFrZV9hZGRyIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdCwgdWludCBvZmZzZXQpCit7CisjaWZkZWYgQ09ORklHXzJTUElGTEFTSAorICAgICAgICBpZiAoaW5mby0+c3RhcnRbMF0gPj0gUEhZU19GTEFTSF8yKQorCSAgICByZXR1cm4gKCh1Y2hhciAqKSAoaW5mby0+c3RhcnRbc2VjdF0gKyAob2Zmc2V0ICogMSkgLSAoUEhZU19GTEFTSF8yIC0gUEhZU19GTEFTSF8yX0JBU0UpICkpOyAgICAgICAgCisgICAgICAgIGVsc2UKKwkgICAgcmV0dXJuICgodWNoYXIgKikgKGluZm8tPnN0YXJ0W3NlY3RdICsgKG9mZnNldCAqIDEpKSk7CisjZWxzZQorCXJldHVybiAoKHVjaGFyICopIChpbmZvLT5zdGFydFtzZWN0XSArIChvZmZzZXQgKiAxKSkpOworI2VuZGlmCQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiByZWFkIGEgY2hhcmFjdGVyIGF0IGEgcG9ydCB3aWR0aCBhZGRyZXNzCisgKi8KK2lubGluZSB1Y2hhciBmbGFzaF9yZWFkX3VjaGFyIChmbGFzaF9pbmZvX3QgKiBpbmZvLCB1aW50IG9mZnNldCkKK3sKKwl1Y2hhciAqY3A7CisKKwljcCA9IGZsYXNoX21ha2VfYWRkciAoaW5mbywgMCwgb2Zmc2V0KTsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwlyZXR1cm4gKGNwWzBdKTsKKyNlbHNlCisJcmV0dXJuIChjcFsxIC0gMV0pOworI2VuZGlmCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJlYWQgYSBzaG9ydCB3b3JkIGJ5IHN3YXBwaW5nIGZvciBwcGMgZm9ybWF0LgorICovCit1c2hvcnQgZmxhc2hfcmVhZF91c2hvcnQgKGZsYXNoX2luZm9fdCAqIGluZm8sIGZsYXNoX3NlY3RfdCBzZWN0LCB1aW50IG9mZnNldCkKK3sKKwl1Y2hhciAqYWRkcjsKKwl1c2hvcnQgcmV0dmFsOworCisjaWZkZWYgREVCVUcKKwlpbnQgeDsKKyNlbmRpZgorCWFkZHIgPSBmbGFzaF9tYWtlX2FkZHIgKGluZm8sIHNlY3QsIG9mZnNldCk7CisKKyNpZmRlZiBERUJVRworCWRlYnVnICgidXNob3J0IGFkZHIgaXMgYXQgJXAgMSA9ICVkXG4iLCBhZGRyLAorCSAgICAgICAxKTsKKwlmb3IgKHggPSAwOyB4IDwgMiAqIDE7IHgrKykgeworCQlkZWJ1ZyAoImFkZHJbJXhdID0gMHgleFxuIiwgeCwgYWRkclt4XSk7CisJfQorI2VuZGlmCisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJcmV0dmFsID0gKChhZGRyWygxKV0gPDwgOCkgfCBhZGRyWzBdKTsKKyNlbHNlCisJcmV0dmFsID0gKChhZGRyWygyICogMSkgLSAxXSA8PCA4KSB8CisJCSAgYWRkclsxIC0gMV0pOworI2VuZGlmCisKKwlkZWJ1ZyAoInJldHZhbCA9IDB4JXhcbiIsIHJldHZhbCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcmVhZCBhIGxvbmcgd29yZCBieSBwaWNraW5nIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlIG9mIGVhY2ggbWFpeGltdW0KKyAqIHBvcnQgc2l6ZSB3b3JkLiBTd2FwIGZvciBwcGMgZm9ybWF0LgorICovCit1bG9uZyBmbGFzaF9yZWFkX2xvbmcgKGZsYXNoX2luZm9fdCAqIGluZm8sIGZsYXNoX3NlY3RfdCBzZWN0LCB1aW50IG9mZnNldCkKK3sKKwl1Y2hhciAqYWRkcjsKKwl1bG9uZyByZXR2YWw7CisKKyNpZmRlZiBERUJVRworCWludCB4OworI2VuZGlmCisJYWRkciA9IGZsYXNoX21ha2VfYWRkciAoaW5mbywgc2VjdCwgb2Zmc2V0KTsKKworI2lmZGVmIERFQlVHCisJZGVidWcgKCJsb25nIGFkZHIgaXMgYXQgJXAgMSA9ICVkXG4iLCBhZGRyLAorCSAgICAgICAxKTsKKwlmb3IgKHggPSAwOyB4IDwgNCAqIDE7IHgrKykgeworCQlkZWJ1ZyAoImFkZHJbJXhdID0gMHgleFxuIiwgeCwgYWRkclt4XSk7CisJfQorI2VuZGlmCisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJcmV0dmFsID0gKGFkZHJbMF0gPDwgMTYpIHwgKGFkZHJbKDEpXSA8PCAyNCkgfAorCQkoYWRkclsoMiAqIDEpXSkgfCAoYWRkclsoMyAqIDEpXSA8PCA4KTsKKyNlbHNlCisJcmV0dmFsID0gKGFkZHJbKDIgKiAxKSAtIDFdIDw8IDI0KSB8CisJCShhZGRyWygxKSAtIDFdIDw8IDE2KSB8CisJCShhZGRyWyg0ICogMSkgLSAxXSA8PCA4KSB8CisJCWFkZHJbKDMgKiAxKSAtIDFdOworI2VuZGlmCisJcmV0dXJuIHJldHZhbDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgdm9pZCBkaXNhYmxlX2NhY2hlKHZvaWQpCit7CisjaWYJZGVmaW5lZChBU1QxMzAwX0NQVV9DQUNIRV9FTkFCTEUpCisgICAgICAgIHVsb25nIHVsZGF0YTsKKyAgICAgICAgCisgICAgICAgIHVsZGF0YSAgPSAqKHZvbGF0aWxlIHVsb25nICopIChTQ1VfQ0FDSEVfQ1RSTF9SRUdJU1RFUik7CisgICAgICAgIHVsZGF0YSAmPSAweGZmZmZmZmZkOworICAgICAgICAqKHVsb25nICopIChTQ1VfQ0FDSEVfQ1RSTF9SRUdJU1RFUikgPSB1bGRhdGE7ICAgICAgICAKKyNlbmRpZgorfQkKKworc3RhdGljIHZvaWQgZW5hYmxlX2NhY2hlKHZvaWQpCit7CisjaWYJZGVmaW5lZChBU1QxMzAwX0NQVV9DQUNIRV9FTkFCTEUpCisgICAgICAgIHVsb25nIHVsZGF0YTsKKyAgICAgICAgCisgICAgICAgIHVsZGF0YSAgPSAqKHZvbGF0aWxlIHVsb25nICopIChTQ1VfQ0FDSEVfQ1RSTF9SRUdJU1RFUik7CisgICAgICAgIHVsZGF0YSB8PSAweDAwMDAwMDAyOworICAgICAgICAqKHVsb25nICopIChTQ1VfQ0FDSEVfQ1RSTF9SRUdJU1RFUikgPSB1bGRhdGE7ICAgICAgICAKKyNlbmRpZgorfQorCSAKK3N0YXRpYyB2b2lkIHJlc2V0X2ZsYXNoIChmbGFzaF9pbmZvX3QgKiBpbmZvKQoreworICAgICAgICB1bG9uZyB1bEN0cmxEYXRhLCBDdHJsT2Zmc2V0LCBNaXNjQ3RybE9mZnNldDsKKyAgICAgICAgCisgICAgICAgIGlmIChpbmZvLT5DRSA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICBDdHJsT2Zmc2V0ID0gU1BJQ3RybFJlZ09mZnNldDI7CisgICAgICAgIH0gICAgCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3RybE9mZnNldCA9IFNQSUN0cmxSZWdPZmZzZXQ7CisgICAgICAgIH0gICAgCisKKyNpZiAgICBkZWZpbmVkKENPTkZJR19GTEFTSF9BU1QyMzAwKSB8fCBkZWZpbmVkKENPTkZJR19BU1QxMzAwKQorICAgICAgICB1bEN0cmxEYXRhID0gaW5mby0+aW9tb2RlIHwgKGluZm8tPnJlYWRjbWQgPDwgMTYpIHwgKGluZm8tPnRDS19SZWFkIDw8IDgpIHwgKGluZm8tPmR1bW15Ynl0ZSA8PCA2KSB8IEZBU1RSRUFEOworI2lmIDAgICAgICAgIAorICAgICAgICBpZiAoaW5mby0+cXVhZHBvcnQpCisgICAgICAgIHsgICAgICAgIAkKKyAgICAgICAgICAgIE1pc2NDdHJsT2Zmc2V0ID0gU1BJTWlzY0N0cmxSZWdPZmZzZXQ7CisgICAgICAgICAgICAqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIE1pc2NDdHJsT2Zmc2V0KSA9IGluZm8tPmR1bW15ZGF0YTsgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHVsQ3RybERhdGEgfD0gRFVNTVlfQ09NTUFORF9PVVQ7CisgICAgICAgIH0KKyNlbmRpZiAgICAgICAgCisjZWxzZSAgICAgIAorICAgICAgICB1bEN0cmxEYXRhICA9IChpbmZvLT5yZWFkY21kIDw8IDE2KSB8IChpbmZvLT50Q0tfUmVhZCA8PCA4KSB8IChpbmZvLT5kdW1teWJ5dGUgPDwgNikgfCBGQVNUUkVBRDsgICAgICAgICAKKyAgICAgICAgaWYgKGluZm8tPmR1YWxwb3J0KQorICAgICAgICAgICAgdWxDdHJsRGF0YSAgfD0gMHgwODsgICAgICAgIAorI2VuZGlmICAgICAgICAKKyAgICAgICAgKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBDdHJsT2Zmc2V0KSA9IHVsQ3RybERhdGE7ICAgICAgICAKKyAgICAgICAgCisgICAgICAgIGVuYWJsZV9jYWNoZSgpOyAgICAKK30KKwkgCitzdGF0aWMgdm9pZCBlbmFibGVfd3JpdGUgKGZsYXNoX2luZm9fdCAqIGluZm8pCit7CisJdWxvbmcgYmFzZTsKKyAgICAgICAgdWxvbmcgdWxDdHJsRGF0YSwgQ3RybE9mZnNldDsKKyAgICAgICAgdWNoYXIgalJlZzsKKyAgICAgICAgCisgICAgICAgIGlmIChpbmZvLT5DRSA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICBDdHJsT2Zmc2V0ID0gU1BJQ3RybFJlZ09mZnNldDI7CisgICAgICAgIH0gICAgCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3RybE9mZnNldCA9IFNQSUN0cmxSZWdPZmZzZXQ7CisgICAgICAgIH0gICAgCisgICAgICAgICAgICAgICAgICAKKwkvL2Jhc2UgPSBpbmZvLT5zdGFydFswXTsKKwliYXNlID0gZmxhc2hfbWFrZV9hZGRyIChpbmZvLCAwLCAwKTsKKworICAgICAgICB1bEN0cmxEYXRhICA9IChpbmZvLT50Q0tfV3JpdGUgPDwgOCk7ICAgICAgICAKKyAgICAgICAgdWxDdHJsRGF0YSB8PSBDRV9MT1cgfCBVU0VSTU9ERTsKKyAgICAgICAgKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBDdHJsT2Zmc2V0KSA9IHVsQ3RybERhdGE7CisgICAgICAgIHVkZWxheSgyMDApOworICAgICAgICAqKHVjaGFyICopIChiYXNlKSA9ICh1Y2hhcikgKDB4MDYpOworICAgICAgICB1ZGVsYXkoMTApOworICAgICAgICB1bEN0cmxEYXRhICY9IENNRF9NQVNLOworICAgICAgICB1bEN0cmxEYXRhIHw9IENFX0hJR0ggfCBVU0VSTU9ERTsKKyAgICAgICAgKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBDdHJsT2Zmc2V0KSA9IHVsQ3RybERhdGE7CisgICAgICAgIHVkZWxheSgyMDApOworCisgICAgICAgIHVsQ3RybERhdGEgJj0gQ01EX01BU0s7CisgICAgICAgIHVsQ3RybERhdGEgfD0gQ0VfTE9XIHwgVVNFUk1PREU7CisgICAgICAgICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgICAgICB1ZGVsYXkoMjAwKTsKKyAgICAgICAgKih1Y2hhciAqKSAoYmFzZSkgPSAodWNoYXIpICgweDA1KTsKKyAgICAgICAgdWRlbGF5KDEwKTsKKyAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBqUmVnID0gKih2b2xhdGlsZSB1Y2hhciAqKSAoYmFzZSk7CisgICAgICAgIH0gd2hpbGUgKCEoalJlZyAmIDB4MDIpKTsgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAorICAgICAgICB1bEN0cmxEYXRhICY9IENNRF9NQVNLOworICAgICAgICB1bEN0cmxEYXRhIHw9IENFX0hJR0ggfCBVU0VSTU9ERTsKKyAgICAgICAgKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBDdHJsT2Zmc2V0KSA9IHVsQ3RybERhdGE7CisgICAgICAgIHVkZWxheSgyMDApOworCit9CisJCQorc3RhdGljIHZvaWQgd3JpdGVfc3RhdHVzX3JlZ2lzdGVyIChmbGFzaF9pbmZvX3QgKiBpbmZvLCB1Y2hhciBkYXRhKQoreworCXVsb25nIGJhc2U7CisgICAgICAgIHVsb25nIHVsU01NQmFzZSwgdWxDdHJsRGF0YSwgQ3RybE9mZnNldDsKKyAgICAgICAgdWNoYXIgalJlZzsKKyAgICAgICAgCisgICAgICAgIGlmIChpbmZvLT5DRSA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICBDdHJsT2Zmc2V0ID0gU1BJQ3RybFJlZ09mZnNldDI7CisgICAgICAgIH0gICAgCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3RybE9mZnNldCA9IFNQSUN0cmxSZWdPZmZzZXQ7CisgICAgICAgIH0gICAgCisgICAgCisJLy9iYXNlID0gaW5mby0+c3RhcnRbMF07CisJYmFzZSA9IGZsYXNoX21ha2VfYWRkciAoaW5mbywgMCwgMCk7CisKKyAgICAgICAgZW5hYmxlX3dyaXRlIChpbmZvKTsKKworICAgICAgICB1bEN0cmxEYXRhICA9IChpbmZvLT50Q0tfV3JpdGUgPDwgOCk7CisgICAgICAgIHVsQ3RybERhdGEgfD0gQ0VfTE9XIHwgVVNFUk1PREU7CisgICAgICAgICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgICAgICB1ZGVsYXkoMjAwKTsKKyAgICAgICAgKih1Y2hhciAqKSAoYmFzZSkgPSAodWNoYXIpICgweDAxKTsKKyAgICAgICAgdWRlbGF5KDEwKTsKKyAgICAgICAgKih1Y2hhciAqKSAoYmFzZSkgPSAodWNoYXIpIChkYXRhKTsgICAgICAgICAgICAgICAgCisgICAgICAgIHVsQ3RybERhdGEgJj0gQ01EX01BU0s7CisgICAgICAgIHVsQ3RybERhdGEgfD0gQ0VfSElHSCB8IFVTRVJNT0RFOworICAgICAgICAqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIEN0cmxPZmZzZXQpID0gdWxDdHJsRGF0YTsKKyAgICAgICAgdWRlbGF5KDIwMCk7CisKKyAgICAgICAgdWxDdHJsRGF0YSAmPSBDTURfTUFTSzsKKyAgICAgICAgdWxDdHJsRGF0YSB8PSBDRV9MT1cgfCBVU0VSTU9ERTsKKyAgICAgICAgKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBDdHJsT2Zmc2V0KSA9IHVsQ3RybERhdGE7CisgICAgICAgIHVkZWxheSgyMDApOworICAgICAgICAqKHVjaGFyICopIChiYXNlKSA9ICh1Y2hhcikgKDB4MDUpOworICAgICAgICB1ZGVsYXkoMTApOworICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGpSZWcgPSAqKHZvbGF0aWxlIHVjaGFyICopIChiYXNlKTsKKyAgICAgICAgfSB3aGlsZSAoalJlZyAmIDB4MDEpOworICAgICAgICB1bEN0cmxEYXRhICY9IENNRF9NQVNLOyAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAKKyAgICAgICAgdWxDdHJsRGF0YSB8PSBDRV9ISUdIIHwgVVNFUk1PREU7CisgICAgICAgICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgICAgICB1ZGVsYXkoMjAwKTsKKworfQorCitzdGF0aWMgdm9pZCBlbmFibGU0YiAoZmxhc2hfaW5mb190ICogaW5mbykKK3sKKwl1bG9uZyBiYXNlOworICAgICAgICB1bG9uZyB1bFNNTUJhc2UsIHVsQ3RybERhdGEsIEN0cmxPZmZzZXQ7CisgICAgICAgIHVjaGFyIGpSZWc7CisgICAgICAgIAorICAgICAgICBpZiAoaW5mby0+Q0UgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgQ3RybE9mZnNldCA9IFNQSUN0cmxSZWdPZmZzZXQyOworICAgICAgICB9ICAgIAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN0cmxPZmZzZXQgPSBTUElDdHJsUmVnT2Zmc2V0OworICAgICAgICB9ICAgIAorICAgIAorCS8vYmFzZSA9IGluZm8tPnN0YXJ0WzBdOworCWJhc2UgPSBmbGFzaF9tYWtlX2FkZHIgKGluZm8sIDAsIDApOworCisgICAgICAgIHVsQ3RybERhdGEgID0gKGluZm8tPnRDS19Xcml0ZSA8PCA4KTsKKyAgICAgICAgdWxDdHJsRGF0YSB8PSBDRV9MT1cgfCBVU0VSTU9ERTsKKyAgICAgICAgKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBDdHJsT2Zmc2V0KSA9IHVsQ3RybERhdGE7CisgICAgICAgIHVkZWxheSgyMDApOworICAgICAgICAqKHVjaGFyICopIChiYXNlKSA9ICh1Y2hhcikgKDB4YjcpOworICAgICAgICB1bEN0cmxEYXRhICY9IENNRF9NQVNLOyAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAKKyAgICAgICAgdWxDdHJsRGF0YSB8PSBDRV9ISUdIIHwgVVNFUk1PREU7CisgICAgICAgICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgICAgICB1ZGVsYXkoMjAwKTsKKyAKK30gLyogZW5hYmxlNGIgKi8KKworc3RhdGljIHZvaWQgZW5hYmxlNGJfc3BhbnNpb24gKGZsYXNoX2luZm9fdCAqIGluZm8pCit7CisJdWxvbmcgYmFzZTsKKyAgICAJdWxvbmcgdWxTTU1CYXNlLCB1bEN0cmxEYXRhLCBDdHJsT2Zmc2V0OworICAgIAl1Y2hhciBqUmVnOworICAgICAgICAKKyAgICAJaWYgKGluZm8tPkNFID09IDIpCisgICAgCXsKKyAgICAgICAgICAgIEN0cmxPZmZzZXQgPSBTUElDdHJsUmVnT2Zmc2V0MjsKKyAgICAJfSAgICAKKyAgICAJZWxzZQorICAgIAl7CisgICAgICAgICAgICBDdHJsT2Zmc2V0ID0gU1BJQ3RybFJlZ09mZnNldDsKKyAgICAJfSAgICAKKyAgICAKKwkvL2Jhc2UgPSBpbmZvLT5zdGFydFswXTsKKwliYXNlID0gZmxhc2hfbWFrZV9hZGRyIChpbmZvLCAwLCAwKTsKKworCS8qIEVuYWJsZSA0QjogQkFSMCBEWzddID0gMSAqLworICAgIAl1bEN0cmxEYXRhICA9IChpbmZvLT50Q0tfV3JpdGUgPDwgOCk7CisgICAgCXVsQ3RybERhdGEgfD0gQ0VfTE9XIHwgVVNFUk1PREU7CisgICAgCSoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgIAl1ZGVsYXkoMjAwKTsKKyAgICAJKih1Y2hhciAqKSAoYmFzZSkgPSAodWNoYXIpICgweDE3KTsKKyAgICAJdWRlbGF5KDEwKTsKKyAgICAJKih1Y2hhciAqKSAoYmFzZSkgPSAodWNoYXIpICgweDgwKTsgICAgCisgICAgCXVsQ3RybERhdGEgJj0gQ01EX01BU0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAorICAgIAl1bEN0cmxEYXRhIHw9IENFX0hJR0ggfCBVU0VSTU9ERTsKKyAgICAJKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBDdHJsT2Zmc2V0KSA9IHVsQ3RybERhdGE7CisgICAgCXVkZWxheSgyMDApOworCisgICAgCXVsQ3RybERhdGEgJj0gQ01EX01BU0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAorICAgIAl1bEN0cmxEYXRhIHw9IENFX0xPVyB8IFVTRVJNT0RFOworICAgIAkqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIEN0cmxPZmZzZXQpID0gdWxDdHJsRGF0YTsKKyAgICAJdWRlbGF5KDIwMCk7CisgICAgCSoodWNoYXIgKikgKGJhc2UpID0gKHVjaGFyKSAoMHgxNik7CisgICAgCXVkZWxheSgxMCk7CisgICAgCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgalJlZyA9ICoodm9sYXRpbGUgdWNoYXIgKikgKGJhc2UpOworICAgIAl9IHdoaWxlICghKGpSZWcgJiAweDgwKSk7CisgICAgCXVsQ3RybERhdGEgJj0gQ01EX01BU0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAKKyAgICAJdWxDdHJsRGF0YSB8PSBDRV9ISUdIIHwgVVNFUk1PREU7CisgICAJICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgIAl1ZGVsYXkoMjAwKTsKKwkKK30gLyogZW5hYmxlNGJfc3BhbnNpb24gKi8KKworc3RhdGljIHZvaWQgZW5hYmxlNGJfbnVtb255eCAoZmxhc2hfaW5mb190ICogaW5mbykKK3sKKwl1bG9uZyBiYXNlOworICAgIAl1bG9uZyB1bFNNTUJhc2UsIHVsQ3RybERhdGEsIEN0cmxPZmZzZXQ7CisgICAgCXVjaGFyIGpSZWc7CisgICAgICAgIAorICAgIAlpZiAoaW5mby0+Q0UgPT0gMikKKyAgICAJeworICAgICAgICAgICAgQ3RybE9mZnNldCA9IFNQSUN0cmxSZWdPZmZzZXQyOworICAgIAl9ICAgIAorICAgIAllbHNlCisgICAgCXsKKyAgICAgICAgICAgIEN0cmxPZmZzZXQgPSBTUElDdHJsUmVnT2Zmc2V0OworICAgIAl9ICAgIAorICAgIAorCS8vYmFzZSA9IGluZm8tPnN0YXJ0WzBdOworCWJhc2UgPSBmbGFzaF9tYWtlX2FkZHIgKGluZm8sIDAsIDApOworCisJLyogRW5hYmxlIFdyaXRlICovCisJZW5hYmxlX3dyaXRlIChpbmZvKTsKKwkKKwkvKiBFbmFibGUgNEI6IENNRDoweEI3ICovCisgICAgCXVsQ3RybERhdGEgID0gKGluZm8tPnRDS19Xcml0ZSA8PCA4KTsKKyAgICAJdWxDdHJsRGF0YSB8PSBDRV9MT1cgfCBVU0VSTU9ERTsKKyAgICAJKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBDdHJsT2Zmc2V0KSA9IHVsQ3RybERhdGE7CisgICAgCXVkZWxheSgyMDApOworICAgIAkqKHVjaGFyICopIChiYXNlKSA9ICh1Y2hhcikgKDB4QjcpOworICAgIAl1ZGVsYXkoMTApOworICAgIAl1bEN0cmxEYXRhICY9IENNRF9NQVNLOyAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAKKyAgICAJdWxDdHJsRGF0YSB8PSBDRV9ISUdIIHwgVVNFUk1PREU7CisgICAgCSoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgIAl1ZGVsYXkoMjAwKTsKKworfSAvKiBlbmFibGU0Yl9udW1vbnl4ICovCisKKy8qCisgKgorICovCitzdGF0aWMgdWxvbmcgZmxhc2hfZ2V0X3NpemUgKHVsb25nIGJhc2UsIGludCBiYW5rbnVtKQoreworCWZsYXNoX2luZm9fdCAqaW5mbyA9ICZmbGFzaF9pbmZvW2JhbmtudW1dOworCWludCBqOworCXVuc2lnbmVkIGxvbmcgc2VjdG9yOworCWludCBlcmFzZV9yZWdpb25fc2l6ZTsKKyAgICAgICAgdWxvbmcgdWxDdHJsRGF0YSwgQ3RybE9mZnNldDsKKyAgICAgICAgdWxvbmcgdWxJRDsKKyAgICAgICAgdWNoYXIgY2hbM107CisgICAgICAgIHVsb25nIGNwdWNsaywgZGl2LCByZWc7CisgICAgICAgIHVsb25nIFdyaXRlQ2xrLCBFcmFzZUNsaywgUmVhZENsazsKKyAgICAgICAgdWxvbmcgdmJhc2U7CisgICAgICAgIHVsb25nIFNDVVJldmlzaW9uOworCisgICAgICAgIHVsb25nIHVsUmVmUExMOworICAgICAgICB1bG9uZyB1bERlTnVtZXJhdG9yOworICAgICAgICB1bG9uZyB1bE51bWVyYXRvcjsKKyAgICAgICAgdWxvbmcgdWxPRDsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgCisgICAgICAgIGRpc2FibGVfY2FjaGUoKTsKKyAgICAgICAgCisJaW5mby0+c3RhcnRbMF0gPSBiYXNlOworCXZiYXNlID0gZmxhc2hfbWFrZV9hZGRyIChpbmZvLCAwLCAwKTsKKworI2lmCWRlZmluZWQoQ09ORklHX0ZMQVNIX0FTVDIzMDApIHx8IGRlZmluZWQoQ09ORklHX0FTVDEzMDApCisgICAgICAgIEN0cmxPZmZzZXQgPSBTUElDdHJsUmVnT2Zmc2V0OyAgICAgICAgCQorICAgICAgICBpbmZvLT5DRSA9IDA7ICAgICAgICAgICAgICAgIAkKKyNlbHNlCisgICAgICAgIGlmICh2YmFzZSA9PSBQSFlTX0ZMQVNIXzEpCisgICAgICAgIHsKKyAgICAgICAgICAgIEN0cmxPZmZzZXQgPSBTUElDdHJsUmVnT2Zmc2V0MjsKKyAgICAgICAgICAgIGluZm8tPkNFID0gMjsKKyAgICAgICAgfSAgICAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdHJsT2Zmc2V0ID0gU1BJQ3RybFJlZ09mZnNldDsgICAgICAgIAkKKyAgICAgICAgICAgIGluZm8tPkNFID0gMDsgICAgICAgIAkKKyAgICAgICAgfSAgICAKKyNlbmRpZgorICAgICAgICAgICAgCisgICAgICAgIC8qIEdldCBGbGFzaCBJRCAqLworICAgICAgICB1bEN0cmxEYXRhICA9ICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgJiBDTURfTUFTSzsgICAgICAgIAorICAgICAgICB1bEN0cmxEYXRhIHw9IENFX0xPVyB8IFVTRVJNT0RFOworICAgICAgICAqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIEN0cmxPZmZzZXQpID0gdWxDdHJsRGF0YTsKKyAgICAgICAgdWRlbGF5KDIwMCk7CisgICAgICAgICoodWNoYXIgKikgKHZiYXNlKSA9ICh1Y2hhcikgKDB4OUYpOworICAgICAgICB1ZGVsYXkoMTApOworICAgICAgICBjaFswXSA9ICoodm9sYXRpbGUgdWNoYXIgKikodmJhc2UpOworICAgICAgICB1ZGVsYXkoMTApOworICAgICAgICBjaFsxXSA9ICoodm9sYXRpbGUgdWNoYXIgKikodmJhc2UpOworICAgICAgICB1ZGVsYXkoMTApOworICAgICAgICBjaFsyXSA9ICoodm9sYXRpbGUgdWNoYXIgKikodmJhc2UpOworICAgICAgICB1ZGVsYXkoMTApOyAgICAgICAgICAgICAgIAorICAgICAgICB1bEN0cmxEYXRhICA9ICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgJiBDTURfTUFTSzsgICAgICAgIAorICAgICAgICB1bEN0cmxEYXRhIHw9IENFX0hJR0ggfCBVU0VSTU9ERTsKKyAgICAgICAgKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBDdHJsT2Zmc2V0KSA9IHVsQ3RybERhdGE7CisgICAgICAgIHVkZWxheSgyMDApOworICAgICAgICB1bElEID0gKCh1bG9uZyljaFswXSkgfCAoKHVsb25nKWNoWzFdIDw8IDgpIHwgKCh1bG9uZyljaFsyXSA8PCAxNikgOyAgICAgICAgCisgICAgICAgIGluZm8tPmZsYXNoX2lkID0gdWxJRDsKKyAgICAgICAgCisgICAgICAgIC8vcHJpbnRmKCJTUEkgRmxhc2ggSUQ6ICV4IFxuIiwgdWxJRCk7CisKKyAgICAgICAgLyogaW5pdCBkZWZhdWx0ICovICAgICAgICAKKyAgICAgICAgaW5mby0+aW9tb2RlID0gSU9NT0RFeDE7CisgICAgICAgIGluZm8tPmFkZHJlc3MzMiA9IDA7CisgICAgICAgIGluZm8tPnF1YWRwb3J0ID0gMDsKKyAgICAgICAgaW5mby0+c3BlY2lmaWNzcGkgPSAwOworCisgICAgICAgIHN3aXRjaCAoaW5mby0+Zmxhc2hfaWQpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBTVE0yNVA2NDoKKwkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gMTI4OworCSAgICBpbmZvLT5zaXplID0gMHg4MDAwMDA7ICAgICAgICAJCisgICAgICAgICAgICBlcmFzZV9yZWdpb25fc2l6ZSAgPSAweDEwMDAwOworICAgICAgICAgICAgaW5mby0+cmVhZGNtZCA9IDB4MGI7CisgICAgICAgICAgICBpbmZvLT5kdWFscG9ydCA9IDA7CisgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAxOworICAgICAgICAgICAgaW5mby0+YnVmZmVyc2l6ZSA9IDI1NjsKKyAgICAgICAgICAgIFdyaXRlQ2xrID0gNDA7CisgICAgICAgICAgICBFcmFzZUNsayA9IDIwOworICAgICAgICAgICAgUmVhZENsayAgPSA0MDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RNMjVQMTI4OgorCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSA2NDsKKwkgICAgaW5mby0+c2l6ZSA9IDB4MTAwMDAwMDsgICAgICAgIAkKKyAgICAgICAgICAgIGVyYXNlX3JlZ2lvbl9zaXplICA9IDB4NDAwMDA7CisgICAgICAgICAgICBpbmZvLT5yZWFkY21kID0gMHgwYjsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1YWxwb3J0ID0gMDsKKyAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDE7CisgICAgICAgICAgICBpbmZvLT5idWZmZXJzaXplID0gMjU2OyAgICAgICAgICAgIAorICAgICAgICAgICAgV3JpdGVDbGsgPSA1MDsKKyAgICAgICAgICAgIEVyYXNlQ2xrID0gMjA7CisgICAgICAgICAgICBSZWFkQ2xrICA9IDUwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBOMjVRMjU2OgorCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSAyNTY7CisJICAgIGluZm8tPnNpemUgPSAweDEwMDAwMDA7ICAgICAgICAJCisgICAgICAgICAgICBlcmFzZV9yZWdpb25fc2l6ZSAgPSAweDEwMDAwOworICAgICAgICAgICAgaW5mby0+cmVhZGNtZCA9IDB4MGI7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdWFscG9ydCA9IDA7CisgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAxOworICAgICAgICAgICAgaW5mby0+YnVmZmVyc2l6ZSA9IDI1NjsgICAgICAgICAgICAKKyAgICAgICAgICAgIFdyaXRlQ2xrID0gNTA7CisgICAgICAgICAgICBFcmFzZUNsayA9IDIwOworICAgICAgICAgICAgUmVhZENsayAgPSA1MDsKKyNpZglkZWZpbmVkKENPTkZJR19GTEFTSF9BU1QyMzAwKSB8fCBkZWZpbmVkKENPTkZJR19BU1QxMzAwKQorCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSA1MTI7CisJICAgIGluZm8tPnNpemUgPSAweDIwMDAwMDA7CisJICAgIGluZm8tPmFkZHJlc3MzMiA9IDE7ICAgICAgICAJCisjZW5kaWYKKwkgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBOMjVRNTEyOgorCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSAyNTY7CisJICAgIGluZm8tPnNpemUgPSAweDEwMDAwMDA7ICAgICAgICAJCisgICAgICAgICAgICBlcmFzZV9yZWdpb25fc2l6ZSAgPSAweDEwMDAwOworICAgICAgICAgICAgaW5mby0+cmVhZGNtZCA9IDB4MGI7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdWFscG9ydCA9IDA7CisgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAxOworICAgICAgICAgICAgaW5mby0+YnVmZmVyc2l6ZSA9IDI1NjsgCisgICAgICAgICAgICBpbmZvLT5zcGVjaWZpY3NwaSA9IFNwZWNpZmljU1BJX04yNVE1MTI7ICAgICAgICAgICAKKyAgICAgICAgICAgIFdyaXRlQ2xrID0gNTA7CisgICAgICAgICAgICBFcmFzZUNsayA9IDIwOworICAgICAgICAgICAgUmVhZENsayAgPSA1MDsKKyNpZglkZWZpbmVkKENPTkZJR19GTEFTSF9BU1QyMzAwKSB8fCBkZWZpbmVkKENPTkZJR19BU1QxMzAwKQorCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSAxMDI0OworCSAgICBpbmZvLT5zaXplID0gMHg0MDAwMDAwOworCSAgICBpbmZvLT5hZGRyZXNzMzIgPSAxOyAgICAgICAgCQorI2VuZGlmCisJICAgIGJyZWFrOworCSAgICAJICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGNhc2UgVzI1WDE2OgorCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSAzMjsKKwkgICAgaW5mby0+c2l6ZSA9IDB4MjAwMDAwOyAgICAgICAgCQorICAgICAgICAgICAgZXJhc2VfcmVnaW9uX3NpemUgID0gMHgxMDAwMDsKKyAgICAgICAgICAgIGluZm8tPnJlYWRjbWQgPSAweDNiOyAgICAgICAgICAgIAorICAgICAgICAgICAgaW5mby0+ZHVhbHBvcnQgPSAxOyAgICAgICAgICAgIAorICAgICAgICAgICAgaW5mby0+ZHVtbXlieXRlID0gMTsKKyAgICAgICAgICAgIGluZm8tPmlvbW9kZSA9IElPTU9ERXgyOyAKKyAgICAgICAgICAgIGluZm8tPmJ1ZmZlcnNpemUgPSAyNTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFdyaXRlQ2xrID0gNTA7CisgICAgICAgICAgICBFcmFzZUNsayA9IDI1OworICAgICAgICAgICAgUmVhZENsayAgPSA1MDsgICAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgVzI1WDY0OgorCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSAxMjg7CisJICAgIGluZm8tPnNpemUgPSAweDgwMDAwMDsgICAgICAgIAkKKyAgICAgICAgICAgIGVyYXNlX3JlZ2lvbl9zaXplICA9IDB4MTAwMDA7CisgICAgICAgICAgICBpbmZvLT5yZWFkY21kID0gMHgzYjsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1YWxwb3J0ID0gMTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDE7CisgICAgICAgICAgICBpbmZvLT5pb21vZGUgPSBJT01PREV4MjsKKyAgICAgICAgICAgIGluZm8tPmJ1ZmZlcnNpemUgPSAyNTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBXcml0ZUNsayA9IDUwOworICAgICAgICAgICAgRXJhc2VDbGsgPSAyNTsKKyAgICAgICAgICAgIFJlYWRDbGsgID0gNTA7ICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFcyNVE2NEJWOgorCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSAxMjg7CisJICAgIGluZm8tPnNpemUgPSAweDgwMDAwMDsgICAgICAgIAkKKyAgICAgICAgICAgIGVyYXNlX3JlZ2lvbl9zaXplICA9IDB4MTAwMDA7CisgICAgICAgICAgICBpbmZvLT5yZWFkY21kID0gMHgzYjsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1YWxwb3J0ID0gMTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDE7CisgICAgICAgICAgICBpbmZvLT5pb21vZGUgPSBJT01PREV4MjsgCisgICAgICAgICAgICBpbmZvLT5idWZmZXJzaXplID0gMjU2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBXcml0ZUNsayA9IDgwOworICAgICAgICAgICAgRXJhc2VDbGsgPSA0MDsKKyAgICAgICAgICAgIFJlYWRDbGsgID0gODA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIFcyNVExMjhCVjoKKwkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gMjU2OworCSAgICBpbmZvLT5zaXplID0gMHgxMDAwMDAwOyAgICAgICAgCQorICAgICAgICAgICAgZXJhc2VfcmVnaW9uX3NpemUgID0gMHgxMDAwMDsKKyAgICAgICAgICAgIGluZm8tPnJlYWRjbWQgPSAweDNiOyAgICAgICAgICAgIAorICAgICAgICAgICAgaW5mby0+ZHVhbHBvcnQgPSAxOyAgICAgICAgICAgIAorICAgICAgICAgICAgaW5mby0+ZHVtbXlieXRlID0gMTsKKyAgICAgICAgICAgIGluZm8tPmlvbW9kZSA9IElPTU9ERXgyOyAKKyAgICAgICAgICAgIGluZm8tPmJ1ZmZlcnNpemUgPSAyNTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFdyaXRlQ2xrID0gMTA0OworICAgICAgICAgICAgRXJhc2VDbGsgPSA1MDsKKyAgICAgICAgICAgIFJlYWRDbGsgID0gMTA0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXMjVRMjU2RlY6CisJICAgIGluZm8tPnNlY3Rvcl9jb3VudCA9IDI1NjsKKwkgICAgaW5mby0+c2l6ZSA9IDB4MTAwMDAwMDsgICAgICAgIAkKKyAgICAgICAgICAgIGVyYXNlX3JlZ2lvbl9zaXplICA9IDB4MTAwMDA7CisgICAgICAgICAgICBpbmZvLT5yZWFkY21kID0gMHgwYjsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1YWxwb3J0ID0gMDsKKyAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDE7CisgICAgICAgICAgICBpbmZvLT5idWZmZXJzaXplID0gMjU2OyAgICAgICAgICAgIAorICAgICAgICAgICAgV3JpdGVDbGsgPSA1MDsKKyAgICAgICAgICAgIEVyYXNlQ2xrID0gMjA7CisgICAgICAgICAgICBSZWFkQ2xrICA9IDUwOworI2lmCWRlZmluZWQoQ09ORklHX0ZMQVNIX0FTVDIzMDApIHx8IGRlZmluZWQoQ09ORklHX0FTVDEzMDApCisJICAgIGluZm8tPnNlY3Rvcl9jb3VudCA9IDUxMjsKKwkgICAgaW5mby0+c2l6ZSA9IDB4MjAwMDAwMDsKKwkgICAgaW5mby0+YWRkcmVzczMyID0gMTsgICAgICAgIAkKKyNlbmRpZgorCSAgICBicmVhazsKKwkgICAgICAgICAgICAgICAgCisgICAgICAgIGNhc2UgUzI1RkwwNjRBOgorCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSAxMjg7CisJICAgIGluZm8tPnNpemUgPSAweDgwMDAwMDsgICAgICAgIAkKKyAgICAgICAgICAgIGVyYXNlX3JlZ2lvbl9zaXplICA9IDB4MTAwMDA7CisgICAgICAgICAgICBpbmZvLT5yZWFkY21kID0gMHgwYjsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1YWxwb3J0ID0gMDsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDE7CisgICAgICAgICAgICBpbmZvLT5idWZmZXJzaXplID0gMjU2OyAgICAgICAgICAgIAorICAgICAgICAgICAgV3JpdGVDbGsgPSA1MDsKKyAgICAgICAgICAgIEVyYXNlQ2xrID0gMjU7CisgICAgICAgICAgICBSZWFkQ2xrICA9IDUwOyAgICAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTMjVGTDEyOFA6CisJICAgIGluZm8tPnNlY3Rvcl9jb3VudCA9IDI1NjsKKwkgICAgaW5mby0+c2l6ZSA9IDB4MTAwMDAwMDsgICAgICAgIAkKKyAgICAgICAgICAgIGVyYXNlX3JlZ2lvbl9zaXplICA9IDB4MTAwMDA7CisgICAgICAgICAgICBpbmZvLT5yZWFkY21kID0gMHgwYjsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1YWxwb3J0ID0gMDsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDE7CisgICAgICAgICAgICBpbmZvLT5idWZmZXJzaXplID0gMjU2OyAgICAgICAgICAgIAorICAgICAgICAgICAgV3JpdGVDbGsgPSAxMDA7CisgICAgICAgICAgICBFcmFzZUNsayA9IDQwOworICAgICAgICAgICAgUmVhZENsayAgPSAxMDA7ICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFMyNUZMMjU2UzoKKwkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gMjU2OworCSAgICBpbmZvLT5zaXplID0gMHgxMDAwMDAwOyAgICAgICAgCQorICAgICAgICAgICAgZXJhc2VfcmVnaW9uX3NpemUgID0gMHgxMDAwMDsKKyAgICAgICAgICAgIGluZm8tPnJlYWRjbWQgPSAweDBiOyAgICAgICAgICAgIAorICAgICAgICAgICAgaW5mby0+ZHVhbHBvcnQgPSAwOworICAgICAgICAgICAgaW5mby0+ZHVtbXlieXRlID0gMTsKKyAgICAgICAgICAgIGluZm8tPmJ1ZmZlcnNpemUgPSAyNTY7ICAgICAgICAgICAgCisgICAgICAgICAgICBXcml0ZUNsayA9IDUwOworICAgICAgICAgICAgRXJhc2VDbGsgPSAyMDsKKyAgICAgICAgICAgIFJlYWRDbGsgID0gNTA7CisjaWYJZGVmaW5lZChDT05GSUdfRkxBU0hfQVNUMjMwMCkgfHwgZGVmaW5lZChDT05GSUdfQVNUMTMwMCkKKwkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gNTEyOworCSAgICBpbmZvLT5zaXplID0gMHgyMDAwMDAwOworCSAgICBpbmZvLT5hZGRyZXNzMzIgPSAxOyAgICAgICAgCQorI2VuZGlmCisJICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTVgyNUwyNTYzNUU6CisJICAgIGluZm8tPnNlY3Rvcl9jb3VudCA9IDI1NjsKKwkgICAgaW5mby0+c2l6ZSA9IDB4MTAwMDAwMDsgICAgICAgIAkKKyAgICAgICAgICAgIGVyYXNlX3JlZ2lvbl9zaXplICA9IDB4MTAwMDA7CisgICAgICAgICAgICBpbmZvLT5yZWFkY21kID0gMHgwYjsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1YWxwb3J0ID0gMDsKKyAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDE7CisgICAgICAgICAgICBpbmZvLT5idWZmZXJzaXplID0gMjU2OyAgICAgICAgICAgIAorICAgICAgICAgICAgV3JpdGVDbGsgPSA1MDsKKyAgICAgICAgICAgIEVyYXNlQ2xrID0gMjA7CisgICAgICAgICAgICBSZWFkQ2xrICA9IDUwOworI2lmCWRlZmluZWQoQ09ORklHX0ZMQVNIX0FTVDIzMDApIHx8IGRlZmluZWQoQ09ORklHX0FTVDEzMDApCisJICAgIGluZm8tPnNlY3Rvcl9jb3VudCA9IDUxMjsKKwkgICAgaW5mby0+c2l6ZSA9IDB4MjAwMDAwMDsKKwkgICAgaW5mby0+YWRkcmVzczMyID0gMTsgICAgICAgIAkKKyNpZglkZWZpbmVkKENPTkZJR19GTEFTSF9TUEl4Ml9EdW1teSkKKyAgICAgICAgICAgIGluZm8tPnJlYWRjbWQgPSAweGJiOyAgICAgICAgICAgIAorICAgICAgICAgICAgaW5mby0+ZHVtbXlieXRlID0gMTsKKyAgICAgICAgICAgIGluZm8tPmR1YWxwb3J0ID0gMTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmlvbW9kZSA9IElPTU9ERXgyX2R1bW15OworI2VsaWYJZGVmaW5lZChDT05GSUdfRkxBU0hfU1BJeDRfRHVtbXkpCisgICAgICAgICAgICBpbmZvLT5yZWFkY21kID0gMHhlYjsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDM7CisgICAgICAgICAgICBpbmZvLT5kdWFscG9ydCA9IDA7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5pb21vZGUgPSBJT01PREV4NF9kdW1teTsKKyAgICAgICAgICAgIGluZm8tPnF1YWRwb3J0ID0gMTsKKyAgICAgICAgICAgIGluZm8tPmR1bW15ZGF0YSA9IDB4YWE7ICAgICAgICAgICAgCisjZW5kaWYgICAgICAgICAgICAKKyNlbmRpZiAgICAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTVgyNUwxMjgwNUQ6CisJICAgIGluZm8tPnNlY3Rvcl9jb3VudCA9IDI1NjsKKwkgICAgaW5mby0+c2l6ZSA9IDB4MTAwMDAwMDsgICAgICAgIAkKKyAgICAgICAgICAgIGVyYXNlX3JlZ2lvbl9zaXplICA9IDB4MTAwMDA7CisgICAgICAgICAgICBpbmZvLT5yZWFkY21kID0gMHgwYjsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1YWxwb3J0ID0gMDsKKyAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDE7CisgICAgICAgICAgICBpbmZvLT5idWZmZXJzaXplID0gMjU2OyAgICAgICAgICAgIAorLyoKK1NDVTdDOiBTaWxpY29uIFJldmlzaW9uIElEIFJlZ2lzdGVyCitEWzMxOjI0XTogQ2hpcCBJRAorMDogQVNUMjA1MC9BU1QyMTAwL0FTVDIxNTAvQVNUMjIwMC9BU1QzMDAwCisxOiBBU1QyMzAwCisKK0RbMjM6MTZdIFNpbGljb24gcmV2aXNpb24gSUQgZm9yIEFTVDIzMDAgZ2VuZXJhdGlvbiBhbmQgbGF0ZXIKKzA6IEEwCisxOiBBMQorMjogQTIKKy4KKy4KKy4KK0ZQR0EgcmV2aXNpb24gc3RhcnRzIGZyb20gMHg4MAorCitBU1QyMzAwIEEwIFNQSSBjYW4ndCBydW4gZmFzdGVyIHRoYW4gNTBNaHoKKyovCisgICAgICAgICAgICBXcml0ZUNsayA9IDUwOworICAgICAgICAgICAgRXJhc2VDbGsgPSAyMDsKKyAgICAgICAgICAgIFJlYWRDbGsgID0gNTA7CisKKyAgICAgICAgICAgIFNDVVJldmlzaW9uID0gKih1bG9uZyAqKSAoU0NVX1JFVklTSU9OX1JFR0lTVEVSKTsKKyAgICAgICAgICAgIGlmICgoKFNDVVJldmlzaW9uID4+IDI0KSAmIDB4ZmYpID09IDB4MDEpIHsgLy9BU1QyMzAwCisgICAgICAgICAgICAJaWYgKCgoU0NVUmV2aXNpb24gPj4gMTYpICYgMHhmZikgPT0gMHgwMCkgeyAvL0EwCisgICAgICAgICAgICAJCVdyaXRlQ2xrID0gMjU7CisgICAgICAgICAgICAJCUVyYXNlQ2xrID0gMjA7CisgICAgICAgICAgICAJCVJlYWRDbGsgID0gMjU7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgfQorI2lmCWRlZmluZWQoQ09ORklHX0ZMQVNIX0FTVDIzMDApIHx8IGRlZmluZWQoQ09ORklHX0FTVDEzMDApCisjaWYJZGVmaW5lZChDT05GSUdfRkxBU0hfU1BJeDJfRHVtbXkpCisgICAgICAgICAgICBpbmZvLT5yZWFkY21kID0gMHhiYjsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDE7CisgICAgICAgICAgICBpbmZvLT5kdWFscG9ydCA9IDE7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5pb21vZGUgPSBJT01PREV4Ml9kdW1teTsKKyNlbGlmCWRlZmluZWQoQ09ORklHX0ZMQVNIX1NQSXg0X0R1bW15KQorICAgICAgICAgICAgaW5mby0+cmVhZGNtZCA9IDB4ZWI7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAzOworICAgICAgICAgICAgaW5mby0+ZHVhbHBvcnQgPSAwOyAgICAgICAgICAgIAorICAgICAgICAgICAgaW5mby0+aW9tb2RlID0gSU9NT0RFeDRfZHVtbXk7CisgICAgICAgICAgICBpbmZvLT5xdWFkcG9ydCA9IDE7CisgICAgICAgICAgICBpbmZvLT5kdW1teWRhdGEgPSAweGFhOyAgICAgICAgICAgIAorI2VuZGlmICAgICAgICAgICAgCisjZW5kaWYgICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1YMjVMMTYwNUQ6CisJICAgIGluZm8tPnNlY3Rvcl9jb3VudCA9IDMyOworCSAgICBpbmZvLT5zaXplID0gMHgyMDAwMDA7ICAgICAgICAJCisgICAgICAgICAgICBlcmFzZV9yZWdpb25fc2l6ZSAgPSAweDEwMDAwOworICAgICAgICAgICAgaW5mby0+cmVhZGNtZCA9IDB4MGI7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdWFscG9ydCA9IDA7CisgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAxOworICAgICAgICAgICAgaW5mby0+YnVmZmVyc2l6ZSA9IDI1NjsgICAgICAgICAgICAKKyAgICAgICAgICAgIFdyaXRlQ2xrID0gNTA7CisgICAgICAgICAgICBFcmFzZUNsayA9IDIwOworICAgICAgICAgICAgUmVhZENsayAgPSA1MDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1NUMjVWRjAxNkI6CisJICAgIGluZm8tPnNlY3Rvcl9jb3VudCA9IDMyOworCSAgICBpbmZvLT5zaXplID0gMHgyMDAwMDA7ICAgICAgICAJCisgICAgICAgICAgICBlcmFzZV9yZWdpb25fc2l6ZSAgPSAweDEwMDAwOworICAgICAgICAgICAgaW5mby0+cmVhZGNtZCA9IDB4MGI7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdWFscG9ydCA9IDA7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAxOworICAgICAgICAgICAgaW5mby0+YnVmZmVyc2l6ZSA9IDE7ICAgICAgICAgICAgCisgICAgICAgICAgICBXcml0ZUNsayA9IDUwOworICAgICAgICAgICAgRXJhc2VDbGsgPSAyNTsKKyAgICAgICAgICAgIFJlYWRDbGsgID0gNTA7ICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNTVDI1VkYwNjRDOgorCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSAxMjg7CisJICAgIGluZm8tPnNpemUgPSAweDgwMDAwMDsgICAgICAgIAkKKyAgICAgICAgICAgIGVyYXNlX3JlZ2lvbl9zaXplICA9IDB4MTAwMDA7CisgICAgICAgICAgICBpbmZvLT5yZWFkY21kID0gMHgwYjsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1YWxwb3J0ID0gMDsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDE7CisgICAgICAgICAgICBpbmZvLT5idWZmZXJzaXplID0gMTsgICAgICAgICAgICAKKyAgICAgICAgICAgIFdyaXRlQ2xrID0gNTA7CisgICAgICAgICAgICBFcmFzZUNsayA9IDI1OworICAgICAgICAgICAgUmVhZENsayAgPSA1MDsgICAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVQyNURGMTYxOgorCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSAzMjsKKwkgICAgaW5mby0+c2l6ZSA9IDB4MjAwMDAwOyAgICAgICAgCQorICAgICAgICAgICAgZXJhc2VfcmVnaW9uX3NpemUgID0gMHgxMDAwMDsKKyAgICAgICAgICAgIGluZm8tPnJlYWRjbWQgPSAweDBiOyAgICAgICAgICAgIAorICAgICAgICAgICAgaW5mby0+ZHVhbHBvcnQgPSAwOyAgICAgICAgICAgIAorICAgICAgICAgICAgaW5mby0+ZHVtbXlieXRlID0gMTsKKyAgICAgICAgICAgIGluZm8tPmJ1ZmZlcnNpemUgPSAxOyAgICAgICAgICAgIAorICAgICAgICAgICAgV3JpdGVDbGsgPSA1MDsKKyAgICAgICAgICAgIEVyYXNlQ2xrID0gMjU7CisgICAgICAgICAgICBSZWFkQ2xrICA9IDUwOyAgICAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7CisgCisgICAgICAgIGNhc2UgQVQyNURGMzIxOgorCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSAzMjsKKwkgICAgaW5mby0+c2l6ZSA9IDB4NDAwMDAwOyAgICAgICAgCQorICAgICAgICAgICAgZXJhc2VfcmVnaW9uX3NpemUgID0gMHgxMDAwMDsKKyAgICAgICAgICAgIGluZm8tPnJlYWRjbWQgPSAweDBiOyAgICAgICAgICAgIAorICAgICAgICAgICAgaW5mby0+ZHVhbHBvcnQgPSAwOyAgICAgICAgICAgIAorICAgICAgICAgICAgaW5mby0+ZHVtbXlieXRlID0gMTsKKyAgICAgICAgICAgIGluZm8tPmJ1ZmZlcnNpemUgPSAxOyAgICAgICAgICAgIAorICAgICAgICAgICAgV3JpdGVDbGsgPSA1MDsKKyAgICAgICAgICAgIEVyYXNlQ2xrID0gMjU7CisgICAgICAgICAgICBSZWFkQ2xrICA9IDUwOyAgICAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGRlZmF1bHQ6CS8qIHVzZSBKRURFQyBJRCAqLworICAgICAgICAgICAgZXJhc2VfcmVnaW9uX3NpemUgID0gMHgxMDAwMDsKKyAgICAgICAgICAgIGluZm8tPnJlYWRjbWQgPSAweDBiOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaW5mby0+ZHVhbHBvcnQgID0gMDsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDE7CisgICAgICAgICAgICBpbmZvLT5idWZmZXJzaXplID0gMTsgICAgICAgICAgICAKKyAgICAgICAgICAgIFdyaXRlQ2xrID0gNTA7CisgICAgICAgICAgICBFcmFzZUNsayA9IDI1OworICAgICAgICAgICAgUmVhZENsayAgPSA1MDsgIAorICAgICAgICAgICAgaWYgKChpbmZvLT5mbGFzaF9pZCAmIDB4RkYpID09IDB4MUYpCS8qIEF0bWVsICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChpbmZvLT5mbGFzaF9pZCAmIDB4MDAxRjAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDAwNDAwOgkKKyAgICAgICAgCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSA4OworICAgIAkgICAgICAgICAgICBpbmZvLT5zaXplID0gMHg4MDAwMDsgICAgICAgIAkKKwkgICAgICAgICAgICBicmVhazsJICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDAwNTAwOgkKKyAgICAgICAgCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSAxNjsKKyAgICAJICAgICAgICAgICAgaW5mby0+c2l6ZSA9IDB4MTAwMDAwOyAgICAgICAgCQorCSAgICAgICAgICAgIGJyZWFrOwkgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgMHgwMDA2MDA6CQorICAgICAgICAJICAgIGluZm8tPnNlY3Rvcl9jb3VudCA9IDMyOworICAgIAkgICAgICAgICAgICBpbmZvLT5zaXplID0gMHgyMDAwMDA7ICAgICAgICAJCisJICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDAwMDcwMDoJCisgICAgICAgIAkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gNjQ7CisgICAgCSAgICAgICAgICAgIGluZm8tPnNpemUgPSAweDQwMDAwMDsgICAgICAgIAkKKwkgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDAwODAwOgkKKyAgICAgICAgCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSAxMjg7CisgICAgCSAgICAgICAgICAgIGluZm8tPnNpemUgPSAweDgwMDAwMDsgICAgICAgIAkKKwkgICAgICAgICAgICBicmVhazsJICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSAweDAwMDkwMDoJCisgICAgICAgIAkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gMjU2OworICAgIAkgICAgICAgICAgICBpbmZvLT5zaXplID0gMHgxMDAwMDAwOyAgICAgICAgCQorCSAgICAgICAgICAgIGJyZWFrOwkgICAgICAgICAgICAJICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJDYW4ndCBzdXBwb3J0IHRoaXMgU1BJIEZsYXNoISEgXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CSAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0gICAJICAgICAgICAgICAgCisgICAgICAgICAgICB9IC8qIEF0bWVsIEpERUMgKi8gICAgICAgIAorICAgICAgICAgICAgZWxzZQkvKiBKREVDICovCQkJCQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiAweEZGMDAwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAweDEyMDAwMDoJCisgICAgICAgIAkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gNDsKKyAgICAJICAgICAgICAgICAgaW5mby0+c2l6ZSA9IDB4NDAwMDA7ICAgICAgICAJCisJICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDEzMDAwMDoJCisJICAgICAgICAgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gODsKKwkgICAgICAgICAgICBpbmZvLT5zaXplID0gMHg4MDAwMDsgICAgICAgIAkKKwkgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MTQwMDAwOgkKKwkgICAgICAgICAgICBpbmZvLT5zZWN0b3JfY291bnQgPTE2OworCSAgICAgICAgICAgIGluZm8tPnNpemUgPSAweDEwMDAwMDsgICAgICAgIAkKKwkgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MTUwMDAwOgkKKwkgICAgICAgICAgICBpbmZvLT5zZWN0b3JfY291bnQgPTMyOworCSAgICAgICAgICAgIGluZm8tPnNpemUgPSAweDIwMDAwMDsgICAgICAgIAkKKwkgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MTYwMDAwOgkKKwkgICAgICAgICAgICBpbmZvLT5zZWN0b3JfY291bnQgPTY0OworCSAgICAgICAgICAgIGluZm8tPnNpemUgPSAweDQwMDAwMDsgICAgICAgIAkKKwkgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MTcwMDAwOgkKKwkgICAgICAgICAgICBpbmZvLT5zZWN0b3JfY291bnQgPTEyODsKKwkgICAgICAgICAgICBpbmZvLT5zaXplID0gMHg4MDAwMDA7ICAgICAgICAJCisJICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDE4MDAwMDoJCisJICAgICAgICAgICAgaW5mby0+c2VjdG9yX2NvdW50ID0yNTY7CisJICAgICAgICAgICAgaW5mby0+c2l6ZSA9IDB4MTAwMDAwMDsgICAgICAgIAkKKwkgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MTkwMDAwOgkKKwkgICAgICAgICAgICBpbmZvLT5zZWN0b3JfY291bnQgPTI1NjsKKwkgICAgICAgICAgICBpbmZvLT5zaXplID0gMHgxMDAwMDAwOworI2lmCWRlZmluZWQoQ09ORklHX0ZMQVNIX0FTVDIzMDApIHx8IGRlZmluZWQoQ09ORklHX0FTVDEzMDApCisJICAgICAgICAgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gNTEyOworCSAgICAgICAgICAgIGluZm8tPnNpemUgPSAweDIwMDAwMDA7CisJICAgICAgICAgICAgaW5mby0+YWRkcmVzczMyID0gMTsgICAgICAgIAkKKyNpZglkZWZpbmVkKENPTkZJR19GTEFTSF9TUEl4Ml9EdW1teSkKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+cmVhZGNtZCA9IDB4YmI7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmR1YWxwb3J0ID0gMTsgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+aW9tb2RlID0gSU9NT0RFeDJfZHVtbXk7CisjZWxpZglkZWZpbmVkKENPTkZJR19GTEFTSF9TUEl4NF9EdW1teSkKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+cmVhZGNtZCA9IDB4ZWI7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDM7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmR1YWxwb3J0ID0gMDsgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+aW9tb2RlID0gSU9NT0RFeDRfZHVtbXk7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPnF1YWRwb3J0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+ZHVtbXlkYXRhID0gMHhhYTsgICAgICAgICAgICAKKyNlbmRpZiAgICAgICAgICAgIAorI2VuZGlmICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCQorCSAgICAgICAgICAgIGJyZWFrOworCSAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgMHgyMDAwMDA6CQorCSAgICAgICAgICAgIGluZm8tPnNlY3Rvcl9jb3VudCA9MjU2OworCSAgICAgICAgICAgIGluZm8tPnNpemUgPSAweDEwMDAwMDA7CisgICAgICAgICAgICAgICAgICAgIGlmICgoaW5mby0+Zmxhc2hfaWQgJiAweEZGKSA9PSAweDIwKQkvKiBudW1vbnl4ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zcGVjaWZpY3NwaSA9IFNwZWNpZmljU1BJX04yNVE1MTI7CisjaWYJZGVmaW5lZChDT05GSUdfRkxBU0hfQVNUMjMwMCkgfHwgZGVmaW5lZChDT05GSUdfQVNUMTMwMCkKKwkgICAgICAgICAgICBpbmZvLT5zZWN0b3JfY291bnQgPSAxMDI0OworCSAgICAgICAgICAgIGluZm8tPnNpemUgPSAweDQwMDAwMDA7CisJICAgICAgICAgICAgaW5mby0+YWRkcmVzczMyID0gMTsgICAgICAgIAkKKyNpZglkZWZpbmVkKENPTkZJR19GTEFTSF9TUEl4Ml9EdW1teSkKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+cmVhZGNtZCA9IDB4YmI7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmR1YWxwb3J0ID0gMTsgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+aW9tb2RlID0gSU9NT0RFeDJfZHVtbXk7CisjZWxpZglkZWZpbmVkKENPTkZJR19GTEFTSF9TUEl4NF9EdW1teSkKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+cmVhZGNtZCA9IDB4ZWI7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDM7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmR1YWxwb3J0ID0gMDsgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+aW9tb2RlID0gSU9NT0RFeDRfZHVtbXk7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPnF1YWRwb3J0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+ZHVtbXlkYXRhID0gMHhhYTsgICAgICAgICAgICAKKyNlbmRpZiAgICAgICAgICAgIAorI2VuZGlmICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCQorCSAgICAgICAgICAgIGJyZWFrOworCSAgICAgICAgICAgIAkgICAgICAgIAkgICAgICAgICAgICAJICAgICAgICAKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBwcmludGYoIkNhbid0IHN1cHBvcnQgdGhpcyBTUEkgRmxhc2ghISBcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9ICAgIAorICAgICAgICAgICAgfSAvKiBKREVDICovICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAJCQkJCisgICAgICAgIGRlYnVnICgiZXJhc2VfcmVnaW9uX2NvdW50ID0gJWQgZXJhc2VfcmVnaW9uX3NpemUgPSAlZFxuIiwKKwkJZXJhc2VfcmVnaW9uX2NvdW50LCBlcmFzZV9yZWdpb25fc2l6ZSk7CisKKwlzZWN0b3IgPSBiYXNlOwkJCQorCWZvciAoaiA9IDA7IGogPCBpbmZvLT5zZWN0b3JfY291bnQ7IGorKykgeworCQkKKwkJaW5mby0+c3RhcnRbal0gPSBzZWN0b3I7CisJCXNlY3RvciArPSBlcmFzZV9yZWdpb25fc2l6ZTsKKwkJaW5mby0+cHJvdGVjdFtqXSA9IDA7IC8qIGRlZmF1bHQ6IG5vdCBwcm90ZWN0ZWQgKi8KKwl9CisKKyAgICAgICAgLyogc2V0IFNQSSBmbGFzaCBleHRlbmRlZCBpbmZvICovCisjaWYgCWRlZmluZWQoQ09ORklHX0FTVDEzMDApCisJaWYgKGluZm8tPnNpemUgPiAweDIwMDAwMCkJLyogbGltaXQgTUFYIEZsYXNoIHRvIDJNQiBmb3IgQVNUMTMwMCAqLworCSAgICBpbmZvLT5zaXplID0gMHgyMDAwMDA7CisjZW5kaWYKKyNpZglkZWZpbmVkKENPTkZJR19BU1QyNDAwKSB8fCBkZWZpbmVkKENPTkZJR19BU1QyMzAwKSB8fCBkZWZpbmVkKENPTkZJR19BU1QyMzAwX0ZQR0FfMSkgfHwgZGVmaW5lZChDT05GSUdfQVNUMjMwMF9GUEdBXzIpIHx8IGRlZmluZWQoQ09ORklHX0FTVDEzMDApCisgICAgICAgIHJlZyA9ICooKHZvbGF0aWxlIHVsb25nKikgMHgxZTZlMjAyNCk7CisgICAgICAgIGlmIChyZWcgJiAweDQwMDAwKQorICAgICAgICB7CisgICAgICAgICAgICByZWcgPSAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwNzApOwkgICAgICAgIAorCSAgICAgICAgCisgICAgICAgICAgICB1bFJlZlBMTCA9IDI0OworICAgICAgICAgICAgdWxEZU51bWVyYXRvciA9IHJlZyAmIDB4MEY7CisgICAgICAgICAgICB1bE51bWVyYXRvciA9IChyZWcgJiAweDA3RTApID4+IDU7CisgICAgICAgICAgICB1bE9EID0gKHJlZyAmIDB4MTApID8gMToyOyAgICAgICAgICAgICAgICAgICAgCisgICAgIAkgICAgCisgICAgICAgICAgICBjcHVjbGsgPSB1bFJlZlBMTCAqIHVsT0QgKiAodWxOdW1lcmF0b3IgKyAyKSAvICh1bERlTnVtZXJhdG9yICsgMSk7ICAgIAorICAgICAgICB9ICAgICAgICAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZWcgPSAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwNzApOwkgICAgICAgIAorI2lmCWRlZmluZWQoQ09ORklHX0FTVDI0MDApCisgICAgICAgICAgICBpZiAocmVnICYgMHgwMDgwMDAwMCkJLy9yZWYuIGNsazoyNU1IegorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAocmVnICYgMHgzMDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMHgwMDA6CisgICAgICAgICAgICAgICAgICAgIGNwdWNsayA9IDQwMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDEwMDoKKyAgICAgICAgICAgICAgICAgICAgY3B1Y2xrID0gMzc1OworICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgMHgyMDA6CisgICAgICAgICAgICAgICAgICAgIGNwdWNsayA9IDM1MDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAKKyAgICAgICAgICAgICAgICBjYXNlIDB4MzAwOgorICAgICAgICAgICAgICAgICAgICBjcHVjbGsgPSAzMjU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0JICAgICAgICAgICAgCSAgICAgICAgICAgIAorICAgICAgICAgICAgfSAgICAgICAgCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChyZWcgJiAweDMwMCkJLy9yZWYuIGNsazoyNE1IegorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDAwOgorICAgICAgICAgICAgICAgICAgICBjcHVjbGsgPSAzODQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHgxMDA6CisgICAgICAgICAgICAgICAgICAgIGNwdWNsayA9IDM2MDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAKKyAgICAgICAgICAgICAgICBjYXNlIDB4MjAwOgorICAgICAgICAgICAgICAgICAgICBjcHVjbGsgPSAzMzY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSAweDMwMDoKKyAgICAgICAgICAgICAgICAgICAgY3B1Y2xrID0gMzEyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CSAgICAgICAgICAgIAorICAgICAgICAgICAgfQorI2Vsc2UJICAgICAgICAKKyAgICAgICAgICAgIHN3aXRjaCAocmVnICYgMHgzMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDB4MDAwOgorICAgICAgICAgICAgICAgICBjcHVjbGsgPSAzODQ7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDEwMDoKKyAgICAgICAgICAgICAgICAgY3B1Y2xrID0gMzYwOworICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgIAorICAgICAgICAgICAgY2FzZSAweDIwMDoKKyAgICAgICAgICAgICAgICAgY3B1Y2xrID0gMzM2OworICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgIAorICAgICAgICAgICAgY2FzZSAweDMwMDoKKyAgICAgICAgICAgICAgICAgY3B1Y2xrID0gNDA4OworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAgICAgICAgICAgIAorICAgICAgICB9CQorICAgICAgICAKKyAgICAgICAgcmVnID0gKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNmUyMDcwKTsgICAgICAgIAorICAgICAgICBzd2l0Y2ggKHJlZyAmIDB4YzAwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMHgwMDA6CisgICAgICAgICAgICAgICAgIGNwdWNsayAvPSAxOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDQwMDoKKyAgICAgICAgICAgICAgICAgY3B1Y2xrIC89IDI7CisgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgCisgICAgICAgIGNhc2UgMHg4MDA6CQorICAgICAgICAgICAgICAgICBjcHVjbGsgLz0gNDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhDMDA6CQorICAgICAgICAgICAgICAgICBjcHVjbGsgLz0gMzsKKyAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0KKyNlbHNlCS8qIEFTVDIxMDAgKi8gICAgICAgIAorICAgICAgICByZWcgPSAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwNzApOworICAgICAgICBzd2l0Y2ggKHJlZyAmIDB4ZTAwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMHgwMDA6CisgICAgICAgICAgICAgICAgIGNwdWNsayA9IDI2NjsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgyMDA6CisgICAgICAgICAgICAgICAgIGNwdWNsayA9IDIzMzsKKyAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAKKyAgICAgICAgY2FzZSAweDQwMDoKKyAgICAgICAgICAgICAgICAgY3B1Y2xrID0gMjAwOworICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgIAorICAgICAgICBjYXNlIDB4NjAwOgorICAgICAgICAgICAgICAgICBjcHVjbGsgPSAxNjY7CisgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgCisgICAgICAgIGNhc2UgMHg4MDA6CisgICAgICAgICAgICAgICAgIGNwdWNsayA9IDEzMzsKKyAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAKKyAgICAgICAgY2FzZSAweEEwMDoKKyAgICAgICAgICAgICAgICAgY3B1Y2xrID0gMTAwOworICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgIAorICAgICAgICBjYXNlIDB4QzAwOgorICAgICAgICAgICAgICAgICBjcHVjbGsgPSAzMDA7CisgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgCisgICAgICAgIGNhc2UgMHhFMDA6CQorICAgICAgICAgICAgICAgICBjcHVjbGsgPSAyNDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAKKyAgICAgICAgfQkKKyAgICAgICAgc3dpdGNoIChyZWcgJiAweDMwMDApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAweDEwMDA6CisgICAgICAgICAgICAgICAgIGNwdWNsayAvPSAyOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDIwMDA6CisgICAgICAgICAgICAgICAgIGNwdWNsayAvPSA0OworICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgIAorICAgICAgICBjYXNlIDB4MzAwMDoJCisgICAgICAgICAgICAgICAgIGNwdWNsayAvPSAzOworICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgIAorICAgICAgICB9CisjZW5kaWYKKworI2lmCWRlZmluZWQoQ09ORklHX0FTVDI0MDApIHx8IGRlZmluZWQoQ09ORklHX0FTVDIzMDApIHx8IGRlZmluZWQoQ09ORklHX0FTVDIzMDBfRlBHQV8xKSB8fCBkZWZpbmVkKENPTkZJR19BU1QyMzAwX0ZQR0FfMikgfHwgZGVmaW5lZChDT05GSUdfQVNUMTMwMCkKKworI2lmICAgICBkZWZpbmVkKENPTkZJR19BU1QyMzAwKSB8fCBkZWZpbmVkKENPTkZJR19BU1QxMzAwKQorICAgICAgICAvKiBsaW1pdCBNYXggU1BJIENMSyB0byA1ME1IeiAoRGF0YXNoZWV0IHYxLjIpICovCisgICAgICAgIGlmIChXcml0ZUNsayA+IDUwKSBXcml0ZUNsayA9IDUwOworICAgICAgICBpZiAoRXJhc2VDbGsgPiA1MCkgRXJhc2VDbGsgPSA1MDsKKyAgICAgICAgaWYgKFJlYWRDbGsgPiA1MCkgIFJlYWRDbGsgID0gNTA7CisjZW5kaWYKKworICAgICAgICBkaXYgPSAxOworICAgICAgICB3aGlsZSAoICgoY3B1Y2xrL2RpdikgPiBXcml0ZUNsaykgJiYgKGRpdiA8IDE2KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpdisrOwkKKyAgICAgICAgfQorICAgICAgICBpbmZvLT50Q0tfV3JpdGUgPSBBU1QyMzAwX1NQSUNMS19ESVZbZGl2LTFdOworICAgICAgICAKKyAgICAgICAgZGl2ID0gMTsKKyAgICAgICAgd2hpbGUgKCAoKGNwdWNsay9kaXYpID4gRXJhc2VDbGspICYmIChkaXYgPCAxNikgKQorICAgICAgICB7CisgICAgICAgICAgICBkaXYrKzsJCisgICAgICAgIH0gICAgICAgIAorICAgICAgICBpbmZvLT50Q0tfRXJhc2UgPSBBU1QyMzAwX1NQSUNMS19ESVZbZGl2LTFdOworCisgICAgICAgIGRpdiA9IDE7CisgICAgICAgIHdoaWxlICggKChjcHVjbGsvZGl2KSA+IFJlYWRDbGspICYmIChkaXYgPCAxNikgKQorICAgICAgICB7CisgICAgICAgICAgICBkaXYrKzsJCisgICAgICAgIH0gICAgICAgIAorICAgICAgICBpbmZvLT50Q0tfUmVhZCA9IEFTVDIzMDBfU1BJQ0xLX0RJVltkaXYtMV07CisjZWxzZSAgICAgICAgCQorICAgICAgICBkaXYgPSAyOworICAgICAgICBpbmZvLT50Q0tfV3JpdGUgPSA3OworICAgICAgICB3aGlsZSAoIChjcHVjbGsvZGl2KSA+IFdyaXRlQ2xrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW5mby0+dENLX1dyaXRlLS07CQorICAgICAgICAgICAgZGl2ICs9MjsJCisgICAgICAgIH0KKyAgICAgICAgZGl2ID0gMjsKKyAgICAgICAgaW5mby0+dENLX0VyYXNlID0gNzsKKyAgICAgICAgd2hpbGUgKCAoY3B1Y2xrL2RpdikgPiBFcmFzZUNsayApCisgICAgICAgIHsKKyAgICAgICAgICAgIGluZm8tPnRDS19FcmFzZS0tOwkKKyAgICAgICAgICAgIGRpdiArPTI7CQorICAgICAgICB9CisgICAgICAgIGRpdiA9IDI7CisgICAgICAgIGluZm8tPnRDS19SZWFkID0gNzsKKyAgICAgICAgd2hpbGUgKCAoY3B1Y2xrL2RpdikgPiBSZWFkQ2xrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW5mby0+dENLX1JlYWQtLTsJCisgICAgICAgICAgICBkaXYgKz0yOwkKKyAgICAgICAgfQorI2VuZGlmCisJCisJLyogdW5wcm90ZWN0IGZsYXNoICovCQorICAgICAgICB3cml0ZV9zdGF0dXNfcmVnaXN0ZXIoaW5mbywgMCk7CisKKyAgICAgICAgaWYgKGluZm8tPnF1YWRwb3J0KQorICAgICAgICAgICAgd3JpdGVfc3RhdHVzX3JlZ2lzdGVyKGluZm8sIDB4NDApOwkvKiBlbmFibGUgUUUgKi8KKworICAgICAgICBpZiAoaW5mby0+YWRkcmVzczMyKQkgCisgICAgICAgIHsgICAgICAgICAgCisgICAgICAgICAgICByZWcgPSAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwNzApOwkvKiBzZXQgSC9XIFRyYXBwaW5ncyAqLworICAgICAgICAgICAgcmVnIHw9IDB4MTA7CisgICAgICAgICAgICAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwNzApID0gcmVnOworICAgICAgICAgICAgCisgICAgICAgICAgICByZWcgID0gKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNjIwMDA0KTsJLyogZW5hYmxlIDMyYiBjb250cm9sIGJpdCovCisgICAgICAgICAgICByZWcgfD0gKDB4MDEgPDwgaW5mby0+Q0UpOworICAgICAgICAgICAgKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNjIwMDA0KSA9IHJlZzsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogc2V0IGZsYXNoIGNoaXBzIHRvIDMyYml0cyBhZGRyZXNzaW5nIG1vZGUgKi8KKyAgICAgICAgICAgIGlmICgoaW5mby0+Zmxhc2hfaWQgJiAweEZGKSA9PSAweDAxKQkvKiBTcGFuc2lvbiAqLworICAgICAgICAgICAgICAgIGVuYWJsZTRiX3NwYW5zaW9uKGluZm8pOworICAgICAgICAgICAgZWxzZSBpZiAoKGluZm8tPmZsYXNoX2lkICYgMHhGRikgPT0gMHgyMCkJLyogTnVtb255eCAqLworICAgICAgICAgICAgICAgIGVuYWJsZTRiX251bW9ueXgoaW5mbyk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgZWxzZSAvKiBNWElDLCBXaW5ib25kICovCisgICAgICAgICAgICAgICAgZW5hYmxlNGIoaW5mbyk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICB9ICAgIAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgcmVzZXRfZmxhc2goaW5mbyk7CisgICAgICAgIAorCXJldHVybiAoaW5mby0+c2l6ZSk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IGZsYXNoX3dyaXRlX2J1ZmZlciAoZmxhc2hfaW5mb190ICppbmZvLCB1Y2hhciAqc3JjLCB1bG9uZyBhZGRyLCBpbnQgbGVuKQoreworICAgICAgICB1bG9uZyBqLCBiYXNlLCBvZmZzZXQ7CisgICAgICAgIHVsb25nIHVsU01NQmFzZSwgdWxDdHJsRGF0YSwgQ3RybE9mZnNldDsKKyAgICAgICAgdWNoYXIgalJlZzsKKworICAgICAgICBpZiAoaW5mby0+Q0UgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgQ3RybE9mZnNldCA9IFNQSUN0cmxSZWdPZmZzZXQyOworICAgICAgICB9ICAgIAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN0cmxPZmZzZXQgPSBTUElDdHJsUmVnT2Zmc2V0OworICAgICAgICB9ICAgIAorICAgICAgICAgICAgCisJYmFzZSA9IGluZm8tPnN0YXJ0WzBdOworCW9mZnNldCA9IGFkZHIgLSBiYXNlOworCWJhc2UgPSBmbGFzaF9tYWtlX2FkZHIgKGluZm8sIDAsIDApOworCQorICAgICAgICBlbmFibGVfd3JpdGUgKGluZm8pOworCisgICAgICAgIHVsQ3RybERhdGEgID0gKGluZm8tPnRDS19Xcml0ZSA8PCA4KTsKKworICAgICAgICB1bEN0cmxEYXRhICY9IENNRF9NQVNLOworICAgICAgICB1bEN0cmxEYXRhIHw9IENFX0xPVyB8IFVTRVJNT0RFOworICAgICAgICAqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIEN0cmxPZmZzZXQpID0gdWxDdHJsRGF0YTsKKyAgICAgICAgdWRlbGF5KDIwMCk7CisgICAgICAgICoodWNoYXIgKikgKGJhc2UpID0gKHVjaGFyKSAoMHgwMik7CisgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgIGlmIChpbmZvLT5hZGRyZXNzMzIpCisgICAgICAgIHsKKyAgICAgICAgICAgICoodWNoYXIgKikgKGJhc2UpID0gKHVjaGFyKSAoKG9mZnNldCAmIDB4ZmYwMDAwMDApID4+IDI0KTsKKyAgICAgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgIH0KKyAgICAgICAgKih1Y2hhciAqKSAoYmFzZSkgPSAodWNoYXIpICgob2Zmc2V0ICYgMHhmZjAwMDApID4+IDE2KTsKKyAgICAgICAgdWRlbGF5KDEwKTsKKyAgICAgICAgKih1Y2hhciAqKSAoYmFzZSkgPSAodWNoYXIpICgob2Zmc2V0ICYgMHgwMGZmMDApID4+IDgpOworICAgICAgICB1ZGVsYXkoMTApOworICAgICAgICAqKHVjaGFyICopIChiYXNlKSA9ICh1Y2hhcikgKChvZmZzZXQgJiAweDAwMDBmZikpOworICAgICAgICB1ZGVsYXkoMTApOworCisgICAgICAgIGZvciAoaj0wOyBqPGxlbjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICAqKHVjaGFyICopIChiYXNlKSA9ICoodWNoYXIgKikgKHNyYysrKTsKKyAgICAgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgIH0gICAgCisgICAgICAgICAgICAgICAgIAorICAgICAgICB1bEN0cmxEYXRhICY9IENNRF9NQVNLOworICAgICAgICB1bEN0cmxEYXRhIHw9IENFX0hJR0ggfCBVU0VSTU9ERTsKKyAgICAgICAgKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBDdHJsT2Zmc2V0KSA9IHVsQ3RybERhdGE7CisgICAgICAgIHVkZWxheSgyMDApOworCisgICAgICAgIHVsQ3RybERhdGEgJj0gQ01EX01BU0s7CisgICAgICAgIHVsQ3RybERhdGEgfD0gQ0VfTE9XIHwgVVNFUk1PREU7CisgICAgICAgICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgICAgICB1ZGVsYXkoMjAwKTsKKyAgICAgICAgKih1Y2hhciAqKSAoYmFzZSkgPSAodWNoYXIpICgweDA1KTsKKyAgICAgICAgdWRlbGF5KDEwKTsKKyAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBqUmVnID0gKih2b2xhdGlsZSB1Y2hhciAqKSAoYmFzZSk7CisgICAgICAgIH0gd2hpbGUgKChqUmVnICYgMHgwMSkpOworICAgICAgICB1bEN0cmxEYXRhICY9IENNRF9NQVNLOworICAgICAgICB1bEN0cmxEYXRhIHw9IENFX0hJR0ggfCBVU0VSTU9ERTsKKyAgICAgICAgKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBDdHJsT2Zmc2V0KSA9IHVsQ3RybERhdGE7CisgICAgICAgIHVkZWxheSgyMDApOworCisgICAgICAgIC8qIFJGU1IgKi8KKyAgICAgICAgaWYgKGluZm8tPnNwZWNpZmljc3BpID09IFNwZWNpZmljU1BJX04yNVE1MTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVsQ3RybERhdGEgJj0gQ01EX01BU0s7CisgICAgICAgICAgICB1bEN0cmxEYXRhIHw9IENFX0xPVyB8IFVTRVJNT0RFOworICAgICAgICAgICAgKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBDdHJsT2Zmc2V0KSA9IHVsQ3RybERhdGE7CisgICAgICAgICAgICB1ZGVsYXkoMjAwKTsKKyAgICAgICAgICAgICoodWNoYXIgKikgKGJhc2UpID0gKHVjaGFyKSAoMHg3MCk7CisgICAgICAgICAgICB1ZGVsYXkoMTApOworICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGpSZWcgPSAqKHZvbGF0aWxlIHVjaGFyICopIChiYXNlKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKCEoalJlZyAmIDB4ODApKTsKKyAgICAgICAgICAgIHVsQ3RybERhdGEgJj0gQ01EX01BU0s7CisgICAgICAgICAgICB1bEN0cmxEYXRhIHw9IENFX0hJR0ggfCBVU0VSTU9ERTsKKyAgICAgICAgICAgICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgICAgICAgICAgdWRlbGF5KDIwMCk7CisgICAgICAgIH0gICAgICAgICAgIAorfQkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIGV4cG9ydCBmdW5jdGlvbnMKKyAqICAKKyAqLworIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogCisgKi8KK3Vuc2lnbmVkIGxvbmcgZmxhc2hfaW5pdCAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemUgPSAwOworCWludCBpOworCisJLyogSW5pdDogbm8gRkxBU0hlcyBrbm93biAqLworCWZvciAoaSA9IDA7IGkgPCBDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LUzsgKytpKSB7CisJCWZsYXNoX2luZm9baV0uZmxhc2hfaWQgPSBGTEFTSF9VTktOT1dOOworCQlzaXplICs9IGZsYXNoX2luZm9baV0uc2l6ZSA9IGZsYXNoX2dldF9zaXplIChiYW5rX2Jhc2VbaV0sIGkpOworCQlpZiAoZmxhc2hfaW5mb1tpXS5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB7CisjaWZuZGVmIENGR19GTEFTSF9RVUlFVF9URVNUCisJCQlwcmludGYgKCIjIyBVbmtub3duIEZMQVNIIG9uIEJhbmsgJWQgLSBTaXplID0gMHglMDhseCA9ICVsZCBNQlxuIiwKKwkJCQlpLCBmbGFzaF9pbmZvW2ldLnNpemUsIGZsYXNoX2luZm9baV0uc2l6ZSA8PCAyMCk7CisjZW5kaWYgLyogQ0ZHX0ZMQVNIX1FVSUVUX1RFU1QgKi8KKwkJfQorCX0KKworCS8qIE1vbml0b3IgcHJvdGVjdGlvbiBPTiBieSBkZWZhdWx0ICovCisjaWYgKENPTkZJR19NT05JVE9SX0JBU0UgPj0gQ09ORklHX1NZU19GTEFTSF9CQVNFKQorCWZsYXNoX3Byb3RlY3QgKEZMQUdfUFJPVEVDVF9TRVQsCisJCSAgICAgICBDT05GSUdfTU9OSVRPUl9CQVNFLAorCQkgICAgICAgQ09ORklHX01PTklUT1JfQkFTRSArIG1vbml0b3JfZmxhc2hfbGVuICAtIDEsCisJCSAgICAgICBmbGFzaF9nZXRfaW5mbyhDT05GSUdfTU9OSVRPUl9CQVNFKSk7CisjZW5kaWYKKworCS8qIEVudmlyb25tZW50IHByb3RlY3Rpb24gT04gYnkgZGVmYXVsdCAqLworI2lmZGVmIENPTkZJR19FTlZfSVNfSU5fRkxBU0gKKwlmbGFzaF9wcm90ZWN0IChGTEFHX1BST1RFQ1RfU0VULAorCQkgICAgICAgQ09ORklHX0VOVl9BRERSLAorCQkgICAgICAgQ09ORklHX0VOVl9BRERSICsgQ09ORklHX0VOVl9TRUNUX1NJWkUgLSAxLAorCQkgICAgICAgZmxhc2hfZ2V0X2luZm8oQ09ORklHX0VOVl9BRERSKSk7CisjZW5kaWYKKworCS8qIFJlZHVuZGFudCBlbnZpcm9ubWVudCBwcm90ZWN0aW9uIE9OIGJ5IGRlZmF1bHQgKi8KKyNpZmRlZiBDT05GSUdfRU5WX0FERFJfUkVEVU5ECisJZmxhc2hfcHJvdGVjdCAoRkxBR19QUk9URUNUX1NFVCwKKwkJICAgICAgIENPTkZJR19FTlZfQUREUl9SRURVTkQsCisJCSAgICAgICBDT05GSUdfRU5WX0FERFJfUkVEVU5EICsgQ09ORklHX0VOVl9TSVpFX1JFRFVORCAtIDEsCisJCSAgICAgICBmbGFzaF9nZXRfaW5mbyhDT05GSUdfRU5WX0FERFJfUkVEVU5EKSk7CisjZW5kaWYKKwlyZXR1cm4gKHNpemUpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19FTlZfSVNfSU5fRkxBU0gpIHx8IGRlZmluZWQoQ09ORklHX0VOVl9BRERSX1JFRFVORCkgfHwgKENPTkZJR19NT05JVE9SX0JBU0UgPj0gQ09ORklHX1NZU19GTEFTSF9CQVNFKQorc3RhdGljIGZsYXNoX2luZm9fdCAqZmxhc2hfZ2V0X2luZm8odWxvbmcgYmFzZSkKK3sKKwlpbnQgaTsKKwlmbGFzaF9pbmZvX3QgKiBpbmZvID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LUzsgaSArKykgeworCQlpbmZvID0gJiBmbGFzaF9pbmZvW2ldOworCQlpZiAoaW5mby0+c2l6ZSAmJiBpbmZvLT5zdGFydFswXSA8PSBiYXNlICYmCisJCSAgICBiYXNlIDw9IGluZm8tPnN0YXJ0WzBdICsgaW5mby0+c2l6ZSAtIDEpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gaSA9PSBDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LUyA/IDAgOiBpbmZvOworfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50IGZsYXNoX2VyYXNlIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBpbnQgc19maXJzdCwgaW50IHNfbGFzdCkKK3sKKwlpbnQgcmNvZGUgPSAwOworCWludCBwcm90OworCWZsYXNoX3NlY3RfdCBzZWN0OworCisgICAgICAgIHVsb25nIGJhc2UsIG9mZnNldDsKKyAgICAgICAgdWxvbmcgdWxTTU1CYXNlLCB1bEN0cmxEYXRhLCBDdHJsT2Zmc2V0OworICAgICAgICB1Y2hhciBqUmVnOworICAgICAgICAKKyAgICAgICAgZGlzYWJsZV9jYWNoZSgpOworICAgICAgICAKKyAgICAgICAgaWYgKGluZm8tPkNFID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEN0cmxPZmZzZXQgPSBTUElDdHJsUmVnT2Zmc2V0MjsKKyAgICAgICAgfSAgICAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdHJsT2Zmc2V0ID0gU1BJQ3RybFJlZ09mZnNldDsKKyAgICAgICAgfSAgICAKKyAgICAgICAgICAgICAgICAgICAgCisJaWYgKChzX2ZpcnN0IDwgMCkgfHwgKHNfZmlyc3QgPiBzX2xhc3QpKSB7CisJCXB1dHMgKCItIG5vIHNlY3RvcnMgdG8gZXJhc2VcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlwcm90ID0gMDsKKwlmb3IgKHNlY3QgPSBzX2ZpcnN0OyBzZWN0IDw9IHNfbGFzdDsgKytzZWN0KSB7CisJCWlmIChpbmZvLT5wcm90ZWN0W3NlY3RdKSB7CisJCQlwcm90Kys7CisJCX0KKwl9CisJaWYgKHByb3QpIHsKKwkJcHJpbnRmICgiLSBXYXJuaW5nOiAlZCBwcm90ZWN0ZWQgc2VjdG9ycyB3aWxsIG5vdCBiZSBlcmFzZWQhXG4iLCBwcm90KTsKKwl9IGVsc2UgeworCQlwdXRjICgnXG4nKTsKKwl9CisKKyAgICAgICAgdWxDdHJsRGF0YSAgPSAoaW5mby0+dENLX0VyYXNlIDw8IDgpOworCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3QgPD0gc19sYXN0OyBzZWN0KyspIHsKKwkJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0gPT0gMCkgeyAvKiBub3QgcHJvdGVjdGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBlcmFzaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVfd3JpdGUoaW5mbyk7CisKKwkgICAgICAgICAgICAgICAgYmFzZSA9IGluZm8tPnN0YXJ0WzBdOworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gaW5mby0+c3RhcnRbc2VjdF0gLSBiYXNlOworCSAgICAgICAgICAgICAgICBiYXNlID0gZmxhc2hfbWFrZV9hZGRyIChpbmZvLCAwLCAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdWxDdHJsRGF0YSAmPSBDTURfTUFTSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVsQ3RybERhdGEgfD0gQ0VfTE9XIHwgVVNFUk1PREU7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIEN0cmxPZmZzZXQpID0gdWxDdHJsRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVkZWxheSgyMDApOworICAgICAgICAgICAgICAgICAgICAgICAgKih1Y2hhciAqKSAoYmFzZSkgPSAodWNoYXIpICgweGQ4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+YWRkcmVzczMyKQorICAgICAgICAgICAgICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHVjaGFyICopIChiYXNlKSA9ICh1Y2hhcikgKChvZmZzZXQgJiAweGZmMDAwMDAwKSA+PiAyNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRlbGF5KDEwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICoodWNoYXIgKikgKGJhc2UpID0gKHVjaGFyKSAoKG9mZnNldCAmIDB4ZmYwMDAwKSA+PiAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICB1ZGVsYXkoMTApOworICAgICAgICAgICAgICAgICAgICAgICAgKih1Y2hhciAqKSAoYmFzZSkgPSAodWNoYXIpICgob2Zmc2V0ICYgMHgwMGZmMDApID4+IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgdWRlbGF5KDEwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICoodWNoYXIgKikgKGJhc2UpID0gKHVjaGFyKSAoKG9mZnNldCAmIDB4MDAwMGZmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1ZGVsYXkoMTApOworCisgICAgICAgICAgICAgICAgICAgICAgICB1bEN0cmxEYXRhICY9IENNRF9NQVNLOworICAgICAgICAgICAgICAgICAgICAgICAgdWxDdHJsRGF0YSB8PSBDRV9ISUdIIHwgVVNFUk1PREU7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIEN0cmxPZmZzZXQpID0gdWxDdHJsRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVkZWxheSgyMDApOworCisgICAgICAgICAgICAgICAgICAgICAgICB1bEN0cmxEYXRhICY9IENNRF9NQVNLOworICAgICAgICAgICAgICAgICAgICAgICAgdWxDdHJsRGF0YSB8PSBDRV9MT1cgfCBVU0VSTU9ERTsKKyAgICAgICAgICAgICAgICAgICAgICAgICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgdWRlbGF5KDIwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHVjaGFyICopIChiYXNlKSA9ICh1Y2hhcikgKDB4MDUpOworICAgICAgICAgICAgICAgICAgICAgICAgdWRlbGF5KDEwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqUmVnID0gKih2b2xhdGlsZSB1Y2hhciAqKSAoYmFzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgoalJlZyAmIDB4MDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVsQ3RybERhdGEgJj0gQ01EX01BU0s7CisgICAgICAgICAgICAgICAgICAgICAgICB1bEN0cmxEYXRhIHw9IENFX0hJR0ggfCBVU0VSTU9ERTsKKyAgICAgICAgICAgICAgICAgICAgICAgICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgdWRlbGF5KDIwMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJGU1IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT5zcGVjaWZpY3NwaSA9PSBTcGVjaWZpY1NQSV9OMjVRNTEyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsQ3RybERhdGEgJj0gQ01EX01BU0s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxDdHJsRGF0YSB8PSBDRV9MT1cgfCBVU0VSTU9ERTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIEN0cmxPZmZzZXQpID0gdWxDdHJsRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZGVsYXkoMjAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHVjaGFyICopIChiYXNlKSA9ICh1Y2hhcikgKDB4NzApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqUmVnID0gKih2b2xhdGlsZSB1Y2hhciAqKSAoYmFzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoIShqUmVnICYgMHg4MCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsQ3RybERhdGEgJj0gQ01EX01BU0s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxDdHJsRGF0YSB8PSBDRV9ISUdIIHwgVVNFUk1PREU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBDdHJsT2Zmc2V0KSA9IHVsQ3RybERhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRlbGF5KDIwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9ICAgCisgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCXB1dGMgKCcuJyk7CisJCX0KKwl9CisJcHV0cyAoIiBkb25lXG4iKTsKKwkKKwlyZXNldF9mbGFzaChpbmZvKTsKKwkKKwlyZXR1cm4gcmNvZGU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBmbGFzaF9wcmludF9pbmZvIChmbGFzaF9pbmZvX3QgKiBpbmZvKQoreworCXB1dGMgKCdcbicpOworCXJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weSBtZW1vcnkgdG8gZmxhc2gsIHJldHVybnM6CisgKiAwIC0gT0sKKyAqIDEgLSB3cml0ZSB0aW1lb3V0CisgKiAyIC0gRmxhc2ggbm90IGVyYXNlZAorICovCitpbnQgd3JpdGVfYnVmZiAoZmxhc2hfaW5mb190ICogaW5mbywgdWNoYXIgKiBzcmMsIHVsb25nIGFkZHIsIHVsb25nIGNudCkKK3sKKwlpbnQgY291bnQ7CisJdW5zaWduZWQgY2hhciBwYXRbXSA9IHsnfCcsICctJywgJy8nLCAnXFwnfTsKKwlpbnQgcGF0Y250OworCQorICAgICAgICBkaXNhYmxlX2NhY2hlKCk7CQorICAgICAgICAKKwkvKiBnZXQgbG93ZXIgYWxpZ25lZCBhZGRyZXNzICovCQorICAgICAgICBpZiAoYWRkciAmIChpbmZvLT5idWZmZXJzaXplIC0gMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvdW50ID0gY250ID49IGluZm8tPmJ1ZmZlcnNpemUgPyAoaW5mby0+YnVmZmVyc2l6ZSAtIChhZGRyICYgMHhmZikpOmNudDsJCisgICAgICAgICAgICBmbGFzaF93cml0ZV9idWZmZXIgKGluZm8sIHNyYywgYWRkciwgY291bnQpOworICAgICAgICAgICAgYWRkcis9IGNvdW50OworICAgICAgICAgICAgc3JjICs9IGNvdW50OworICAgICAgICAgICAgY250IC09IGNvdW50OwkKKyAgICAgICAgfQorCQorCS8qIHByb2cgKi8JCQorCXdoaWxlIChjbnQgPiAwKSB7CQkJCQorCSAgICBjb3VudCA9IGNudCA+PSBpbmZvLT5idWZmZXJzaXplID8gaW5mby0+YnVmZmVyc2l6ZTpjbnQ7CisgICAgICAgICAgICBmbGFzaF93cml0ZV9idWZmZXIgKGluZm8sIHNyYywgYWRkciwgY291bnQpOworICAgICAgICAgICAgYWRkcis9IGNvdW50OworICAgICAgICAgICAgc3JjICs9IGNvdW50OworICAgICAgICAgICAgY250IC09IGNvdW50OworICAgICAgICAgICAgcHJpbnRmKCIlY1xiIiwgcGF0WyhwYXRjbnQrKykgJiAweDAzXSk7ICAgICAgICAgICAgCSAgICAgCQorCX0gCQkKKworCXJlc2V0X2ZsYXNoKGluZm8pOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKKyNpZmRlZglDT05GSUdfRkxBU0hfQVNUMjMwMF9ETUEKK3ZvaWQgKiBtZW1tb3ZlX2RtYSh2b2lkICogZGVzdCxjb25zdCB2b2lkICpzcmMsc2l6ZV90IGNvdW50KQoreworCXVsb25nIGNvdW50X2FsaWduLCBwb2xsX3RpbWUsIGRhdGE7CisJCisJY291bnRfYWxpZ24gPSAoY291bnQgKyAzKSAmIDB4RkZGRkZGRkM7CS8qIDQtYnl0ZXMgYWxpZ24gKi8KKyAgICAgICAgcG9sbF90aW1lID0gMTAwOwkJCS8qIHNldCAxMDAgdXMgYXMgZGVmYXVsdCAqLworCisgICAgICAgIC8qIGZvcmNlIGVuZCBvZiBidXJzdCByZWFkICovCisJKih2b2xhdGlsZSB1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBTUElDdHJsUmVnT2Zmc2V0KSB8PSBDRV9ISUdIOworCSoodm9sYXRpbGUgdWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgU1BJQ3RybFJlZ09mZnNldCkgJj0gfkNFX0hJR0g7CisgICAgICAgICAgCisJKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBSRUdfRkxBU0hfRE1BX0NPTlRST0wpID0gKHVsb25nKSAofkZMQVNIX0RNQV9FTkFCTEUpOwkKKwkqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIFJFR19GTEFTSF9ETUFfRkxBU0hfQkFTRSkgPSAodWxvbmcgKikgKHNyYyk7CisJKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBSRUdfRkxBU0hfRE1BX0RSQU1fQkFTRSkgPSAodWxvbmcgKikgKGRlc3QpOworCSoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgUkVHX0ZMQVNIX0RNQV9MRU5HVEgpID0gKHVsb25nKSAoY291bnRfYWxpZ24pOworCSoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgUkVHX0ZMQVNIX0RNQV9DT05UUk9MKSA9ICh1bG9uZykgKEZMQVNIX0RNQV9FTkFCTEUpOworCQorCS8qIHdhaXQgcG9sbCAqLworCWRvIHsKKwkgICAgdWRlbGF5KHBvbGxfdGltZSk7CQorCSAgICBkYXRhID0gKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBSRUdfRkxBU0hfSU5URVJSVVBUX1NUQVRVUyk7CisJfSB3aGlsZSAoIShkYXRhICYgRkxBU0hfU1RBVFVTX0RNQV9SRUFEWSkpOworCQorCS8qIGNsZWFyIHN0YXR1cyAqLworCSoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgUkVHX0ZMQVNIX0lOVEVSUlVQVF9TVEFUVVMpIHw9IEZMQVNIX1NUQVRVU19ETUFfQ0xFQVI7Cit9CQorI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX0ZMQVNIX1NQSSAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDIzMDAvaGFjdGVzdC5jIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvaGFjdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJmYTg3ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hc3BlZWQvYXN0MjMwMC9oYWN0ZXN0LmMKQEAgLTAsMCArMSw3NjIgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIERpYWdub3N0aWNzIHN1cHBvcnQKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxwb3N0Lmg+CisjaW5jbHVkZSAic2x0LmgiCisKKyNpZiAoKENGR19DTURfU0xUICYgQ0ZHX0NNRF9IQUNURVNUKSAmJiBkZWZpbmVkKENPTkZJR19TTFQpKQorI2luY2x1ZGUgImhhY3Rlc3QuaCIKKworI2luY2x1ZGUgImFlcy5jIgorI2luY2x1ZGUgInJjNC5jIgorCitzdGF0aWMgdW5zaWduZWQgY2hhciBjcnlwdG9fc3JjW0NSWVBUT19NQVhfU1JDXSwgY3J5cHRvX2RzdFtDUllQVE9fTUFYX0RTVF0sIGNyeXB0b19jb250ZXh0W0NSWVBUT19NQVhfQ09OVEVYVF07CitzdGF0aWMgdW5zaWduZWQgY2hhciBoYXNoX3NyY1tIQVNIX01BWF9TUkNdLCBoYXNoX2RzdFtIQVNIX01BWF9EU1RdLCBobWFjX2tleVtITUFDX01BWF9LRVldOworCisvKgorICogdGFibGUgCisgKi8KK3N0YXRpYyBhZXNfdGVzdCBhZXN0ZXN0W10gPSB7CisgICAgeyBDUllQVE9NT0RFX0VDQiwgMTI4LAorICAgICB7MHgyYiwgMHg3ZSwgMHgxNSwgMHgxNiwgMHgyOCwgMHhhZSwgMHhkMiwgMHhhNiwgMHhhYiwgMHhmNywgMHgxNSwgMHg4OCwgMHgwOSwgMHhjZiwgMHg0ZiwgMHgzYywgJ1wwJ30sCisgICAgIHsweDMyLCAweDQzLCAweGY2LCAweGE4LCAweDg4LCAweDVhLCAweDMwLCAweDhkLCAweDMxLCAweDMxLCAweDk4LCAweGEyLCAweGUwLCAweDM3LCAweDA3LCAweDM0LCAnXDAnfSwKKyAgICAgezB4MzksIDB4MjUsIDB4ODQsIDB4MWQsIDB4MDIsIDB4ZGMsIDB4MDksIDB4ZmIsIDB4ZGMsIDB4MTEsIDB4ODUsIDB4OTcsIDB4MTksIDB4NmEsIDB4MGIsIDB4MzIsICdcMCd9IH0sCisgICAgezB4RkYsIDB4RkYsICIiLCAiIiwgIiJ9LAkJLyogRW5kIE1hcmsgKi8KK307CisKK3N0YXRpYyByYzRfdGVzdCByYzR0ZXN0W10gPSB7CisgICAge3sweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweGFiLCAweGNkLCAweGVmLCAnXDAnfSwKKyAgICAgezB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsICdcMCd9fSwgCQorICAgIHt7MHhmZn0sIHsweGZmfX0sCQkJCS8qIEVuZCBNYXJrICovCQorfTsKKworc3RhdGljIGhhc2hfdGVzdCBoYXNodGVzdFtdID0geworICAgIHtIQVNITU9ERV9TSEExLCAyMCwKKyAgICAgImFiYyIsCisgICAgIHsweDUzLCAweDIwLCAweGIwLCAweDhjLCAweGExLCAweGY1LCAweDc0LCAweDYyLCAweDUwLCAweDcxLCAweDg5LCAweDQxLCAweGM1LCAweDBhLCAweGRmLCAweDRlLCAweGJiLCAweDU1LCAweDc2LCAweDA2LCAnXDAnfX0sCisgICAgezB4RkYsIDB4RkYsICIiLCAiIn0sCQkJLyogRW5kIE1hcmsgKi8gCit9OworCitzdGF0aWMgaG1hY190ZXN0IGhtYWN0ZXN0W10gPSB7CisgICAge0hBU0hNT0RFX1NIQTEsIDY0LCAyMCwKKyAgICAgezB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgJ1wwJyB9LAorICAgICAiU2FtcGxlICMxIiwKKyAgICAgezB4YmYsIDB4MzksIDB4ZGEsIDB4YjEsIDB4N2QsIDB4YzIsIDB4ZTEsIDB4MjMsIDB4MGQsIDB4MjgsIDB4MzUsIDB4M2IsIDB4OGMsIDB4Y2IsIDB4MTQsIDB4YjYsIDB4MjIsIDB4MDIsIDB4NjUsIDB4YjMsICdcMCd9fSwKKyAgICB7MHhGRiwgMHhGRiwgMHhGRiwgIiIsICIiLCAiIn0sCQkJLyogRW5kIE1hcmsgKi8gCit9OworCit2b2lkIEVuYWJsZUhNQUModm9pZCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIHVsRGF0YTsKKyAgICAJCisgICAgLyogaW5pdCBTQ1UgKi8KKyAgICAqKHVuc2lnbmVkIGxvbmcgKikgKDB4MWU2ZTIwMDApID0gMHgxNjg4YThhODsKKyAgICAKKyAgICB1bERhdGEgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKDB4MWU2ZTIwMGMpOworICAgIHVsRGF0YSAmPSAweGZkZmZmOworICAgICoodW5zaWduZWQgbG9uZyAqKSAoMHgxZTZlMjAwYykgPSB1bERhdGE7CisgICAgdWRlbGF5KDEwMCk7CisgICAgdWxEYXRhID0gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopICgweDFlNmUyMDA0KTsKKyAgICB1bERhdGEgJj0gMHhmZmZlZjsKKyAgICAqKHVuc2lnbmVkIGxvbmcgKikgKDB4MWU2ZTIwMDQpID0gdWxEYXRhOworICAgIAorfQorCisvKiBBRVMgKi8KK3ZvaWQgYWVzX2VuY19hc3QzMDAwKGFlc19jb250ZXh0ICpjdHgsIHVpbnQ4ICppbnB1dCwgdWludDggKml2LCB1aW50OCAqb3V0cHV0LCB1aW50MzIgdWxNc2dMZW5ndGggLCB1aW50MzIgdWxBRVNNb2RlKQoreworCisgICAgdW5zaWduZWQgbG9uZyBpLCB1bFRlbXAsIHVsQ29tbWFuZDsKKyAgICB1bnNpZ25lZCBjaGFyIGNoOworICAgIHVuc2lnbmVkIGNoYXIgKnBqc3JjLCAqcGpkc3QsICpwamNvbnRleHQ7CisgICAgCisgICAgdWxDb21tYW5kID0gQ1JZUFRPX0VOQUJMRV9SVyB8IENSWVBUT19FTkFCTEVfQ09OVEVYVF9MT0FEIHwgQ1JZUFRPX0VOQUJMRV9DT05URVhUX1NBVkUgfCBcCisgICAgICAgICAgICAgICAgQ1JZUFRPX0FFUyB8IENSWVBUT19FTkNSWVBUTyB8IENSWVBUT19TWU5DX01PREVfQVNZTkM7CisKKyAgICBzd2l0Y2ggKGN0eC0+bnIpCisgICAgeworICAgIGNhc2UgMTA6CisgICAgICAgIHVsQ29tbWFuZCB8PSBDUllQVE9fQUVTMTI4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEyOgorICAgICAgICB1bENvbW1hbmQgfD0gQ1JZUFRPX0FFUzE5MjsKKyAgICAgICAgYnJlYWs7ICAgIAorICAgIGNhc2UgMTQ6CisgICAgICAgIHVsQ29tbWFuZCB8PSBDUllQVE9fQUVTMjU2OworICAgICAgICBicmVhazsgICAgCisgICAgfQorCisgICAgc3dpdGNoICh1bEFFU01vZGUpCisgICAgeworICAgIGNhc2UgQ1JZUFRPTU9ERV9FQ0I6CisgICAgICAgIHVsQ29tbWFuZCB8PSBDUllQVE9fQUVTX0VDQjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDUllQVE9NT0RFX0NCQzoKKyAgICAgICAgdWxDb21tYW5kIHw9IENSWVBUT19BRVNfQ0JDOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENSWVBUT01PREVfQ0ZCOgorICAgICAgICB1bENvbW1hbmQgfD0gQ1JZUFRPX0FFU19DRkI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1JZUFRPTU9ERV9PRkI6CisgICAgICAgIHVsQ29tbWFuZCB8PSBDUllQVE9fQUVTX09GQjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDUllQVE9NT0RFX0NUUjoKKyAgICAgICAgdWxDb21tYW5kIHw9IENSWVBUT19BRVNfQ1RSOworICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgCisgICAgfQorCisgICAgcGpzcmMgPSAodW5zaWduZWQgY2hhciAqKSBtMTZieXRlQWxpZ25tZW50KCh1bnNpZ25lZCBsb25nKSBjcnlwdG9fc3JjKTsKKyAgICBwamRzdCA9ICh1bnNpZ25lZCBjaGFyICopIG0xNmJ5dGVBbGlnbm1lbnQoKHVuc2lnbmVkIGxvbmcpIGNyeXB0b19kc3QpOworICAgIHBqY29udGV4dCA9ICh1bnNpZ25lZCBjaGFyICopIG0xNmJ5dGVBbGlnbm1lbnQoKHVuc2lnbmVkIGxvbmcpIGNyeXB0b19jb250ZXh0KTsKKyAgICAJCisgICAgLyogSW5pdCBIVyAqLworICAgICoodW5zaWduZWQgbG9uZyAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0NSWVBUT19TUkNfQkFTRV9PRkZTRVQpID0gKHVuc2lnbmVkIGxvbmcpIHBqc3JjOworICAgICoodW5zaWduZWQgbG9uZyAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0NSWVBUT19EU1RfQkFTRV9PRkZTRVQpID0gKHVuc2lnbmVkIGxvbmcpIHBqZHN0OworICAgICoodW5zaWduZWQgbG9uZyAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0NSWVBUT19DT05URVhUX0JBU0VfT0ZGU0VUKSA9ICh1bnNpZ25lZCBsb25nKSBwamNvbnRleHQ7CisgICAgKih1bnNpZ25lZCBsb25nICopIChIQUNfUkVHX0JBU0UgKyBSRUdfQ1JZUFRPX0xFTl9PRkZTRVQpID0gdWxNc2dMZW5ndGg7CisKKyAgICAvKiBTZXQgc291cmNlICovCisgICAgZm9yIChpPTA7IGk8IHVsTXNnTGVuZ3RoOyBpKyspCisgICAgeworICAgIAljaCA9ICoodWludDggKikoaW5wdXQgKyBpKTsgICAgCQorICAgIAkqKHVpbnQ4ICopIChwanNyYyArIGkpID0gY2g7CisgICAgfQorICAgICAKKyAgICAvKiBTZXQgQ29udGV4dCAqLworICAgIC8qIFNldCBJViAqLworICAgIGZvciAoaT0wOyBpPDE2OyBpKyspCisgICAgeworICAgICAgICBjaCA9ICoodWludDggKikgKGl2ICsgaSk7CisgICAgCSoodWludDggKikgKHBqY29udGV4dCArIGkpID0gY2g7CisgICAgfQorICAgICAgIAorICAgIC8qIFNldCBFeHBhbnNpb24gS2V5ICovICAgCisgICAgZm9yIChpPTA7IGk8KDQqKGN0eC0+bnIrMSkpOyBpKyspCisgICAgeworICAgICAgICB1bFRlbXAgPSAoKGN0eC0+ZXJrW2ldICYgMHhGRikgPDwgMjQpICsgKChjdHgtPmVya1tpXSAmIDB4RkYwMCkgPDwgOCkgKyAoKGN0eC0+ZXJrW2ldICYgMHhGRjAwMDApID4+IDgpICsgKChjdHgtPmVya1tpXSAmIDB4RkYwMDAwMDApID4+IDI0KTsKKyAgICAJKih1aW50MzIgKikgKHBqY29udGV4dCArIGkqNCArIDE2KSA9IHVsVGVtcDsKKyAgICB9CisKKyAgICAvKiBmaXJlIGNtZCAqLworICAgICoodW5zaWduZWQgbG9uZyAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0NSWVBUT19DTURfQkFTRV9PRkZTRVQpID0gdWxDb21tYW5kOworICAgIGRvIHsKKyAgICAgICAgdWxUZW1wID0gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChIQUNfUkVHX0JBU0UgKyBSRUdfQ1JZUFRPX1NUQVRVU19PRkZTRVQpOworICAgIH0gd2hpbGUgKHVsVGVtcCAmIENSWVBUT19CVVNZKTsJCisgICAgCisgICAgLyogT3V0cHV0ICovCisgICAgZm9yIChpPTA7IGk8dWxNc2dMZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIGNoID0gKih1aW50OCAqKSAocGpkc3QgKyBpKTsgICAgICAgIAorICAgICAgICAqKHVpbnQ4ICopIChvdXRwdXQgKyBpKSA9IGNoOyAgICAKKyAgICB9CisgICAgCit9IC8qIGFlc19lbmNfYXN0MzAwMCAqLworCisKK3ZvaWQgYWVzX2RlY19hc3QzMDAwKGFlc19jb250ZXh0ICpjdHgsIHVpbnQ4ICppbnB1dCwgdWludDggKml2LCB1aW50OCAqb3V0cHV0LCB1aW50MzIgdWxNc2dMZW5ndGggLCB1aW50MzIgdWxBRVNNb2RlKQoreworICAgIHVuc2lnbmVkIGxvbmcgaSwgdWxUZW1wLCB1bENvbW1hbmQ7CisgICAgdW5zaWduZWQgY2hhciBjaDsKKyAgICB1bnNpZ25lZCBjaGFyICpwanNyYywgKnBqZHN0LCAqcGpjb250ZXh0OworICAgIAorICAgIHVsQ29tbWFuZCA9IENSWVBUT19FTkFCTEVfUlcgfCBDUllQVE9fRU5BQkxFX0NPTlRFWFRfTE9BRCB8IENSWVBUT19FTkFCTEVfQ09OVEVYVF9TQVZFIHwgXAorICAgICAgICAgICAgICAgIENSWVBUT19BRVMgfCBDUllQVE9fREVDUllQVE8gfCBDUllQVE9fU1lOQ19NT0RFX0FTWU5DOworCisgICAgc3dpdGNoIChjdHgtPm5yKQorICAgIHsKKyAgICBjYXNlIDEwOgorICAgICAgICB1bENvbW1hbmQgfD0gQ1JZUFRPX0FFUzEyODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjoKKyAgICAgICAgdWxDb21tYW5kIHw9IENSWVBUT19BRVMxOTI7CisgICAgICAgIGJyZWFrOyAgICAKKyAgICBjYXNlIDE0OgorICAgICAgICB1bENvbW1hbmQgfD0gQ1JZUFRPX0FFUzI1NjsKKyAgICAgICAgYnJlYWs7ICAgIAorICAgIH0KKworICAgIHN3aXRjaCAodWxBRVNNb2RlKQorICAgIHsKKyAgICBjYXNlIENSWVBUT01PREVfRUNCOgorICAgICAgICB1bENvbW1hbmQgfD0gQ1JZUFRPX0FFU19FQ0I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1JZUFRPTU9ERV9DQkM6CisgICAgICAgIHVsQ29tbWFuZCB8PSBDUllQVE9fQUVTX0NCQzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDUllQVE9NT0RFX0NGQjoKKyAgICAgICAgdWxDb21tYW5kIHw9IENSWVBUT19BRVNfQ0ZCOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENSWVBUT01PREVfT0ZCOgorICAgICAgICB1bENvbW1hbmQgfD0gQ1JZUFRPX0FFU19PRkI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1JZUFRPTU9ERV9DVFI6CisgICAgICAgIHVsQ29tbWFuZCB8PSBDUllQVE9fQUVTX0NUUjsKKyAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgIAorICAgIH0KKworICAgIHBqc3JjID0gKHVuc2lnbmVkIGNoYXIgKikgbTE2Ynl0ZUFsaWdubWVudCgodW5zaWduZWQgbG9uZykgY3J5cHRvX3NyYyk7CisgICAgcGpkc3QgPSAodW5zaWduZWQgY2hhciAqKSBtMTZieXRlQWxpZ25tZW50KCh1bnNpZ25lZCBsb25nKSBjcnlwdG9fZHN0KTsKKyAgICBwamNvbnRleHQgPSAodW5zaWduZWQgY2hhciAqKSBtMTZieXRlQWxpZ25tZW50KCh1bnNpZ25lZCBsb25nKSBjcnlwdG9fY29udGV4dCk7CisJCisgICAgLyogSW5pdCBIVyAqLworICAgICoodW5zaWduZWQgbG9uZyAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0NSWVBUT19TUkNfQkFTRV9PRkZTRVQpID0gKHVuc2lnbmVkIGxvbmcpIHBqc3JjOworICAgICoodW5zaWduZWQgbG9uZyAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0NSWVBUT19EU1RfQkFTRV9PRkZTRVQpID0gKHVuc2lnbmVkIGxvbmcpIHBqZHN0OworICAgICoodW5zaWduZWQgbG9uZyAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0NSWVBUT19DT05URVhUX0JBU0VfT0ZGU0VUKSA9ICh1bnNpZ25lZCBsb25nKSBwamNvbnRleHQ7CisgICAgKih1bnNpZ25lZCBsb25nICopIChIQUNfUkVHX0JBU0UgKyBSRUdfQ1JZUFRPX0xFTl9PRkZTRVQpID0gdWxNc2dMZW5ndGg7CisKKyAgICAvKiBTZXQgc291cmNlICovCisgICAgZm9yIChpPTA7IGk8IHVsTXNnTGVuZ3RoOyBpKyspCisgICAgeworICAgIAljaCA9ICoodWludDggKikoaW5wdXQgKyBpKTsgICAgCQorICAgIAkqKHVpbnQ4ICopIChwanNyYyArIGkpID0gY2g7CisgICAgfQorICAgICAKKyAgICAvKiBTZXQgQ29udGV4dCAqLworICAgIC8qIFNldCBJViAqLworICAgIGZvciAoaT0wOyBpPDE2OyBpKyspCisgICAgeworICAgICAgICBjaCA9ICoodWludDggKikgKGl2ICsgaSk7CisgICAgCSoodWludDggKikgKHBqY29udGV4dCArIGkpID0gY2g7CisgICAgfQorICAgICAgIAorICAgIC8qIFNldCBFeHBhbnNpb24gS2V5ICovICAgCisgICAgZm9yIChpPTA7IGk8KDQqKGN0eC0+bnIrMSkpOyBpKyspCisgICAgeworICAgICAgICB1bFRlbXAgPSAoKGN0eC0+ZXJrW2ldICYgMHhGRikgPDwgMjQpICsgKChjdHgtPmVya1tpXSAmIDB4RkYwMCkgPDwgOCkgKyAoKGN0eC0+ZXJrW2ldICYgMHhGRjAwMDApID4+IDgpICsgKChjdHgtPmVya1tpXSAmIDB4RkYwMDAwMDApID4+IDI0KTsKKyAgICAJKih1aW50MzIgKikgKHBqY29udGV4dCArIGkqNCArIDE2KSA9IHVsVGVtcDsKKyAgICB9CisKKyAgICAvKiBmaXJlIGNtZCAqLworICAgICoodW5zaWduZWQgbG9uZyAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0NSWVBUT19DTURfQkFTRV9PRkZTRVQpID0gdWxDb21tYW5kOworICAgIGRvIHsKKyAgICAgICAgdWxUZW1wID0gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChIQUNfUkVHX0JBU0UgKyBSRUdfQ1JZUFRPX1NUQVRVU19PRkZTRVQpOworICAgIH0gd2hpbGUgKHVsVGVtcCAmIENSWVBUT19CVVNZKTsJCisgICAgCisgICAgLyogT3V0cHV0ICovCisgICAgZm9yIChpPTA7IGk8dWxNc2dMZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIGNoID0gKih1aW50OCAqKSAocGpkc3QgKyBpKTsgICAgICAgIAorICAgICAgICAqKHVpbnQ4ICopIChvdXRwdXQgKyBpKSA9IGNoOyAgICAKKyAgICB9CisKK30gLyogYWVzX2RlY19hc3QzMDAwICovCisKK3ZvaWQgcmM0X2NyeXB0X2FzdDMwMDAodWludDggKmRhdGEsIGludCB1bE1zZ0xlbmd0aCwgdWludDggKnJjNF9rZXksIHVpbnQzMiB1bEtleUxlbmd0aCkKK3sKKyAgICBzdHJ1Y3QgcmM0X3N0YXRlIHM7CisgICAgdW5zaWduZWQgbG9uZyBpLCB1bFRlbXAsIHVsQ29tbWFuZDsKKyAgICB1bnNpZ25lZCBjaGFyIGNoOworICAgIHVuc2lnbmVkIGNoYXIgKnBqc3JjLCAqcGpkc3QsICpwamNvbnRleHQ7CisKKyAgICB1bENvbW1hbmQgPSBDUllQVE9fRU5BQkxFX1JXIHwgQ1JZUFRPX0VOQUJMRV9DT05URVhUX0xPQUQgfCBDUllQVE9fRU5BQkxFX0NPTlRFWFRfU0FWRSB8IFwKKyAgICAgICAgICAgICAgICBDUllQVE9fUkM0IHwgQ1JZUFRPX1NZTkNfTU9ERV9BU1lOQzsKKworICAgIHJjNF9zZXR1cCggJnMsIHJjNF9rZXksIHVsS2V5TGVuZ3RoICk7CisKKyAgICBwanNyYyA9ICh1bnNpZ25lZCBjaGFyICopIG0xNmJ5dGVBbGlnbm1lbnQoKHVuc2lnbmVkIGxvbmcpIGNyeXB0b19zcmMpOworICAgIHBqZHN0ID0gKHVuc2lnbmVkIGNoYXIgKikgbTE2Ynl0ZUFsaWdubWVudCgodW5zaWduZWQgbG9uZykgY3J5cHRvX2RzdCk7CisgICAgcGpjb250ZXh0ID0gKHVuc2lnbmVkIGNoYXIgKikgbTE2Ynl0ZUFsaWdubWVudCgodW5zaWduZWQgbG9uZykgY3J5cHRvX2NvbnRleHQpOworCQorICAgIC8qIEluaXQgSFcgKi8KKyAgICAqKHVpbnQzMiAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0NSWVBUT19TUkNfQkFTRV9PRkZTRVQpID0gKHVuc2lnbmVkIGxvbmcpIHBqc3JjOwkKKyAgICAqKHVpbnQzMiAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0NSWVBUT19EU1RfQkFTRV9PRkZTRVQpID0gKHVuc2lnbmVkIGxvbmcpIHBqZHN0OwkKKyAgICAqKHVpbnQzMiAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0NSWVBUT19DT05URVhUX0JBU0VfT0ZGU0VUKSA9ICh1bnNpZ25lZCBsb25nKSBwamNvbnRleHQ7CQorICAgICoodWludDMyICopIChIQUNfUkVHX0JBU0UgKyBSRUdfQ1JZUFRPX0xFTl9PRkZTRVQpID0gdWxNc2dMZW5ndGg7CQorICAgICAgICAgIAkKKworICAgIC8qIFNldCBzb3VyY2UgKi8KKyAgICBmb3IgKGk9MDsgaTwgdWxNc2dMZW5ndGg7IGkrKykKKyAgICB7CisgICAgCWNoID0gKih1aW50OCAqKShkYXRhICsgaSk7CisgICAgCSoodWludDggKikgKHBqc3JjICsgaSkgPSBjaDsKKyAgICB9CisgICAgIAorICAgIC8qIFNldCBDb250ZXh0ICovCisgICAgLyogU2V0IGksIGogKi8KKyAgICAqKHVpbnQzMiAqKSAocGpjb250ZXh0ICsgOCkgPSAweDAwMDE7CQorICAgICAgIAorICAgIC8qIFNldCBFeHBhbnNpb24gS2V5ICovICAgCisgICAgZm9yIChpPTA7IGk8KDI1Ni80KTsgaSsrKQorICAgIHsKKyAgICAgICB1bFRlbXAgPSAocy5tW2kgKiA0XSAmIDB4RkYpICsgKChzLm1baSAqIDQgKyAxXSAmIDB4RkYpIDw8IDgpICsgKChzLm1baSAqIDQgKyAyXSAmIDB4RkYpIDw8IDE2KSArICgocy5tW2kgKiA0KyAzXSAmIDB4RkYpIDw8IDI0KTsKKyAgICAgICAqKHVpbnQzMiAqKSAocGpjb250ZXh0ICsgaSo0ICsgMTYpID0gdWxUZW1wOwkKKyAgICB9CisKKyAgICAvKiBmaXJlIGNtZCAqLworICAgICoodWludDMyICopIChIQUNfUkVHX0JBU0UgKyBSRUdfQ1JZUFRPX0NNRF9CQVNFX09GRlNFVCkgPSB1bENvbW1hbmQ7ICAgIAorICAgIGRvIHsKKyAgICAJdWxUZW1wID0gKih2b2xhdGlsZSB1aW50MzIgKikgKEhBQ19SRUdfQkFTRSArIFJFR19DUllQVE9fU1RBVFVTX09GRlNFVCk7CisgICAgfSB3aGlsZSAodWxUZW1wICYgQ1JZUFRPX0JVU1kpOwkKKworICAgIC8qIE91dHB1dCAqLworICAgIGZvciAoaT0wOyBpPHVsTXNnTGVuZ3RoOyBpKyspCisgICAgeworICAgICAgICBjaCA9ICoodm9sYXRpbGUgdWludDggKikgKHBqZHN0ICsgaSk7CisgICAgICAgICoodWludDggKikgKGRhdGEgKyBpKSA9IGNoOyAgICAKKyAgICB9CisKK30gLyogcmM0X2NyeXB0X2FzdDMwMDAJKi8KKworLyogSGFzaCAqLwordm9pZCBoYXNoX2FzdDMwMDAodWludDggKm1zZywgdWludDMyIHVsTGVuZ3RoLCB1bnNpZ25lZCBjaGFyICpvdXRwdXQsIHVpbnQzMiB1bEhhc2hNb2RlKQoreworICAgdWludDMyIGksIHVsVGVtcCwgdWxDb21tYW5kLCB1bERpZ2VzdExlbmd0aCwgdWxNeU1zZ0xlbmd0aDsKKyAgIHVpbnQ4IGNoOworICAgdW5zaWduZWQgY2hhciAqcGpzcmMsICpwamRzdDsKKyAgIAorICAgLyogR2V0IEluZm8gKi8KKyAgIHN3aXRjaCAodWxIYXNoTW9kZSkKKyAgIHsKKyAgIGNhc2UgSEFTSE1PREVfTUQ1OgorICAgICAgICB1bENvbW1hbmQgPSBIQVNIX0FMR19TRUxFQ1RfTUQ1OworICAgICAgICB1bERpZ2VzdExlbmd0aCA9IDE2OworICAgICAgIGJyZWFrOworICAgY2FzZSBIQVNITU9ERV9TSEExOgorICAgICAgICB1bENvbW1hbmQgPSBIQVNIX0FMR19TRUxFQ1RfU0hBMSB8IDB4MDg7CisgICAgICAgIHVsRGlnZXN0TGVuZ3RoID0gMjA7CisgICAgICAgYnJlYWs7CisgICBjYXNlIEhBU0hNT0RFX1NIQTI1NjoKKyAgICAgICAgdWxDb21tYW5kID0gSEFTSF9BTEdfU0VMRUNUX1NIQTI1NiB8IDB4MDg7CisgICAgICAgIHVsRGlnZXN0TGVuZ3RoID0gMzI7CisgICAgICAgYnJlYWs7CisgICBjYXNlIEhBU0hNT0RFX1NIQTIyNDoKKyAgICAgICAgdWxDb21tYW5kID0gSEFTSF9BTEdfU0VMRUNUX1NIQTIyNCB8IDB4MDg7CisgICAgICAgIHVsRGlnZXN0TGVuZ3RoID0gMjg7CisgICAgICAgYnJlYWs7ICAgICAgIAkKKyAgIH0gICAJICAgIAorCisgICAgcGpzcmMgPSAodW5zaWduZWQgY2hhciAqKSBtMTZieXRlQWxpZ25tZW50KCh1bnNpZ25lZCBsb25nKSBoYXNoX3NyYyk7CisgICAgcGpkc3QgPSAodW5zaWduZWQgY2hhciAqKSBtMTZieXRlQWxpZ25tZW50KCh1bnNpZ25lZCBsb25nKSBoYXNoX2RzdCk7CisKKyAgICAvKiAxNmJ5dGUgYWxpZ25tZW50ICovCisgICAgdWxNeU1zZ0xlbmd0aCA9IG0xNmJ5dGVBbGlnbm1lbnQodWxMZW5ndGgpOworICAgCQorICAgLyogSW5pdC4gSFcgKi8KKyAgICAqKHVpbnQzMiAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0hBU0hfU1JDX0JBU0VfT0ZGU0VUKSA9ICh1bnNpZ25lZCBsb25nKSBwanNyYzsJCisgICAgKih1aW50MzIgKikgKEhBQ19SRUdfQkFTRSArIFJFR19IQVNIX0RTVF9CQVNFX09GRlNFVCkgPSAodW5zaWduZWQgbG9uZykgcGpkc3Q7CQorICAgICoodWludDMyICopIChIQUNfUkVHX0JBU0UgKyBSRUdfSEFTSF9MRU5fT0ZGU0VUKSA9IHVsTXlNc2dMZW5ndGg7CQorICAgICAgICAKKyAgICAvKiB3cml0ZSBzcmMgKi8KKyAgICBmb3IgKGk9MDsgaTx1bExlbmd0aDsgaSsrKQorICAgIHsKKyAgICAJY2ggPSAqKHVpbnQ4ICopKG1zZytpKTsKKyAgICAJKih1aW50OCAqKSAocGpzcmMgKyBpKSA9IGNoOworICAgIH0gICAgCisgICAgZm9yIChpPXVsTGVuZ3RoOyBpPHVsTXlNc2dMZW5ndGg7IGkrKykKKyAgICAgICAgKih1aW50OCAqKSAocGpzcmMgKyBpKSA9IDA7CisgICAgICAgIAorICAgIC8qIGZpcmUgY21kICovCisgICAgKih1aW50MzIgKikgKEhBQ19SRUdfQkFTRSArIFJFR19IQVNIX0NNRF9PRkZTRVQpID0gdWxDb21tYW5kOwkKKyAgICAKKyAgICAvKiBnZXQgZGlnZXN0ICovCisgICAgZG8geworICAgIAl1bFRlbXAgPSAqKHZvbGF0aWxlIHVpbnQzMiAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0hBU0hfU1RBVFVTX09GRlNFVCk7ICAgIAkKKyAgICB9IHdoaWxlICh1bFRlbXAgJiBIQVNIX0JVU1kpOwkKKyAgICAJCisgICAgZm9yIChpPTA7IGk8dWxEaWdlc3RMZW5ndGg7IGkrKykKKyAgICB7CisgICAgICAgIGNoID0gKih2b2xhdGlsZSB1aW50OCAqKSAocGpkc3QgKyBpKTsKKyAgICAgICAqKHVpbnQ4ICopIChvdXRwdXQgKyBpKSA9IGNoOyAgICAKKyAgICB9ICAgICAgICAKKyAKK30gLyogaGFzaF9hc3QzMDAwICovCQorCisvKiBITUFDICovCit2b2lkIGhtYWNrZXlfYXN0MzAwMCh1aW50OCAqa2V5LCB1aW50MzIgdWxLZXlMZW5ndGgsIHVpbnQzMiB1bEhhc2hNb2RlKQoreworICAgIHVpbnQzMiBpLCB1bEJsa0xlbmd0aCwgdWxEaWdlc3RMZW5ndGgsIHVsVGVtcCwgdWxDb21tYW5kOworICAgIHVpbnQ4IGswWzY0XSwgc3VtWzMyXTsKKyAgICB1aW50OCBjaDsKKyAgICB1bnNpZ25lZCBjaGFyICpwanNyYywgKnBqZHN0LCAqcGprZXk7CisKKyAgIC8qIEdldCBJbmZvICovCisgICBzd2l0Y2ggKHVsSGFzaE1vZGUpCisgICB7CisgICBjYXNlIEhBU0hNT0RFX01ENToKKyAgICAgICAgdWxDb21tYW5kID0gSEFTSF9BTEdfU0VMRUNUX01ENTsKKyAgICAgICAgdWxEaWdlc3RMZW5ndGggPSAxNjsKKyAgICAgICBicmVhazsKKyAgIGNhc2UgSEFTSE1PREVfU0hBMToKKyAgICAgICAgdWxDb21tYW5kID0gSEFTSF9BTEdfU0VMRUNUX1NIQTEgfCAweDA4OworICAgICAgICB1bERpZ2VzdExlbmd0aCA9IDIwOworICAgICAgIGJyZWFrOworICAgY2FzZSBIQVNITU9ERV9TSEEyNTY6CisgICAgICAgIHVsQ29tbWFuZCA9IEhBU0hfQUxHX1NFTEVDVF9TSEEyNTYgfCAweDA4OworICAgICAgICB1bERpZ2VzdExlbmd0aCA9IDMyOworICAgICAgIGJyZWFrOworICAgY2FzZSBIQVNITU9ERV9TSEEyMjQ6CisgICAgICAgIHVsQ29tbWFuZCA9IEhBU0hfQUxHX1NFTEVDVF9TSEEyMjQgfCAweDA4OworICAgICAgICB1bERpZ2VzdExlbmd0aCA9IDI4OworICAgICAgIGJyZWFrOyAgICAgICAJCisgICB9ICAgCSAgICAKKyAgIHVsQmxrTGVuZ3RoID0gNjQ7CQkJCS8qIE1ENSwgU0hBMS8yNTYvMjI0OiA2NGJ5dGVzICovCisKKyAgICAvKiBJbml0ICovCisgICAgbWVtc2V0KCAodm9pZCAqKSBrMCwgMCwgNjQpOwkJLyogcmVzZXQgdG8gemVybyAqLworICAgIG1lbXNldCggKHZvaWQgKikgc3VtLCAwLCAzMik7CQkvKiByZXNldCB0byB6ZXJvICovCisKKyAgICAvKiBHZXQgazAgKi8KKyAgICBpZiAodWxLZXlMZW5ndGggPD0gdWxCbGtMZW5ndGgpCisgICAgICAgIG1lbWNweSggKHZvaWQgKikgazAsICh2b2lkICopIGtleSwgdWxLZXlMZW5ndGggKTsgICAgICAgCisgICAgZWxzZSAvKiAodWxLZXlMZW5ndGggPiB1bEJsa0xlbmd0aCkgKi8KKyAgICB7CisgICAgICAgIGhhc2hfYXN0MzAwMChrZXksIHVsS2V5TGVuZ3RoLCBzdW0sIHVsSGFzaE1vZGUpOworICAgICAgICBtZW1jcHkoICh2b2lkICopIGswLCAodm9pZCAqKSBzdW0sIHVsRGlnZXN0TGVuZ3RoICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfSAgICAJCisKKyAgICBwanNyYyA9ICh1bnNpZ25lZCBjaGFyICopIG0xNmJ5dGVBbGlnbm1lbnQoKHVuc2lnbmVkIGxvbmcpIGhhc2hfc3JjKTsKKyAgICBwamRzdCA9ICh1bnNpZ25lZCBjaGFyICopIG0xNmJ5dGVBbGlnbm1lbnQoKHVuc2lnbmVkIGxvbmcpIGhhc2hfZHN0KTsKKyAgICBwamtleSA9ICh1bnNpZ25lZCBjaGFyICopIG02NGJ5dGVBbGlnbm1lbnQoKHVuc2lnbmVkIGxvbmcpIGhtYWNfa2V5KTsKKyAgICAKKyAgICAvKiBDYWxjdWxhdGUgZGlnZXN0ICovCisgICAgKih1aW50MzIgKikgKEhBQ19SRUdfQkFTRSArIFJFR19IQVNIX1NSQ19CQVNFX09GRlNFVCkgPSAodW5zaWduZWQgbG9uZykgcGpzcmM7CisgICAgKih1aW50MzIgKikgKEhBQ19SRUdfQkFTRSArIFJFR19IQVNIX0RTVF9CQVNFX09GRlNFVCkgPSAodW5zaWduZWQgbG9uZykgcGpkc3Q7CisgICAgKih1aW50MzIgKikgKEhBQ19SRUdfQkFTRSArIFJFR19IQVNIX0tFWV9CQVNFX09GRlNFVCkgPSAodW5zaWduZWQgbG9uZykgcGprZXk7CisgICAgKih1aW50MzIgKikgKEhBQ19SRUdfQkFTRSArIFJFR19IQVNIX0xFTl9PRkZTRVQpID0gdWxCbGtMZW5ndGg7CisgICAgICAgIAorICAgIC8qIHdyaXRlIGtleSB0byBzcmMgKi8KKyAgICBmb3IgKGk9MDsgaTx1bEJsa0xlbmd0aDsgaSsrKQorICAgIHsKKyAgICAJY2ggPSAqKHVpbnQ4ICopKGswK2kpOworICAgICAgICAqKHVpbnQ4ICopIChwanNyYyArIGkpID0gY2g7CisgICAgfSAgICAKKyAgICAKKyAgICAvKiBmaXJlIGNtZCBmb3IgY2FsY3VsYXRlICovCisgICAgKih1aW50MzIgKikgKEhBQ19SRUdfQkFTRSArIFJFR19IQVNIX0NNRF9PRkZTRVQpID0gdWxDb21tYW5kIHwgSEFDX0RJR0VTVF9DQUxfRU5BQkxFOyAgICAKKyAgICBkbyB7CisgICAgCXVsVGVtcCA9ICoodm9sYXRpbGUgdWludDMyICopIChIQUNfUkVHX0JBU0UgKyBSRUdfSEFTSF9TVEFUVVNfT0ZGU0VUKTsgICAgCQorICAgIH0gd2hpbGUgKHVsVGVtcCAmIEhBU0hfQlVTWSk7CQorICAgICAgICAgCit9IC8qIGhtYWNrZXlfYXN0MzAwMCAqLworCit2b2lkIGhtYWNfYXN0MzAwMCh1aW50OCAqa2V5LCB1aW50MzIgdWxLZXlMZW5ndGgsIHVpbnQ4ICptc2csIHVpbnQzMiB1bE1zZ0xlbmd0aCwgdWludDMyIHVsSGFzaE1vZGUsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCkKK3sKKyAgICB1aW50MzIgaSwgdWxUZW1wLCB1bENvbW1hbmQsIHVsRGlnZXN0TGVuZ3RoLCB1bE15TXNnTGVuZ3RoOzsKKyAgICB1aW50OCBjaDsKKyAgICB1bnNpZ25lZCBjaGFyICpwanNyYywgKnBqZHN0LCAqcGprZXk7CisKKyAgICAvKiBDYWxjdWxhdGUgZGlnZXN0ICovCisgICBzd2l0Y2ggKHVsSGFzaE1vZGUpCisgICB7CisgICBjYXNlIEhBU0hNT0RFX01ENToKKyAgICAgICAgdWxDb21tYW5kID0gSEFTSF9BTEdfU0VMRUNUX01ENTsKKyAgICAgICAgdWxEaWdlc3RMZW5ndGggPSAxNjsKKyAgICAgICBicmVhazsKKyAgIGNhc2UgSEFTSE1PREVfU0hBMToKKyAgICAgICAgdWxDb21tYW5kID0gSEFTSF9BTEdfU0VMRUNUX1NIQTEgfCAweDA4OworICAgICAgICB1bERpZ2VzdExlbmd0aCA9IDIwOworICAgICAgIGJyZWFrOworICAgY2FzZSBIQVNITU9ERV9TSEEyNTY6CisgICAgICAgIHVsQ29tbWFuZCA9IEhBU0hfQUxHX1NFTEVDVF9TSEEyNTYgfCAweDA4OworICAgICAgICB1bERpZ2VzdExlbmd0aCA9IDMyOworICAgICAgIGJyZWFrOworICAgY2FzZSBIQVNITU9ERV9TSEEyMjQ6CisgICAgICAgIHVsQ29tbWFuZCA9IEhBU0hfQUxHX1NFTEVDVF9TSEEyMjQgfCAweDA4OworICAgICAgICB1bERpZ2VzdExlbmd0aCA9IDI4OworICAgICAgIGJyZWFrOyAgICAgICAJCisgICB9ICAgCSAgICAKKyAKKyAgICBwanNyYyA9ICh1bnNpZ25lZCBjaGFyICopIG0xNmJ5dGVBbGlnbm1lbnQoKHVuc2lnbmVkIGxvbmcpIGhhc2hfc3JjKTsKKyAgICBwamRzdCA9ICh1bnNpZ25lZCBjaGFyICopIG0xNmJ5dGVBbGlnbm1lbnQoKHVuc2lnbmVkIGxvbmcpIGhhc2hfZHN0KTsKKyAgICBwamtleSA9ICh1bnNpZ25lZCBjaGFyICopIG02NGJ5dGVBbGlnbm1lbnQoKHVuc2lnbmVkIGxvbmcpIGhtYWNfa2V5KTsKKyAgICAKKyAgICAvKiAxNmJ5dGUgYWxpZ25tZW50ICovCisgICAgdWxNeU1zZ0xlbmd0aCA9IG0xNmJ5dGVBbGlnbm1lbnQodWxNc2dMZW5ndGgpOworICAgIAkJCisgICAgLyogSW5pdC4gSFcgKi8KKyAgICAqKHVpbnQzMiAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0hBU0hfU1JDX0JBU0VfT0ZGU0VUKSA9ICh1bnNpZ25lZCBsb25nKSBwanNyYzsKKyAgICAqKHVpbnQzMiAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0hBU0hfRFNUX0JBU0VfT0ZGU0VUKSA9ICh1bnNpZ25lZCBsb25nKSBwamRzdDsKKyAgICAqKHVpbnQzMiAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0hBU0hfS0VZX0JBU0VfT0ZGU0VUKSA9ICh1bnNpZ25lZCBsb25nKSBwamtleTsKKyAgICAqKHVpbnQzMiAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0hBU0hfTEVOX09GRlNFVCkgPSB1bE15TXNnTGVuZ3RoOworCisgICAgLyogd3JpdGUgVGV4dCB0byBzcmMgKi8KKyAgICBmb3IgKGk9MDsgaTx1bE1zZ0xlbmd0aDsgaSsrKQorICAgIHsKKyAgICAJY2ggPSAqKHVpbnQ4ICopKG1zZytpKTsKKyAgICAgICAgKih1aW50OCAqKSAocGpzcmMgKyBpKSA9IGNoOworICAgIH0gICAgCisgICAgZm9yIChpPXVsTXNnTGVuZ3RoOyBpPHVsTXlNc2dMZW5ndGg7IGkrKykKKyAgICAgICAgKih1aW50OCAqKSAocGpzcmMgKyBpKSA9IDA7CisgICAgCisgICAgLyogZmlyZSBjbWQgKi8KKyAgICAqKHVpbnQzMiAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0hBU0hfQ01EX09GRlNFVCkgPSB1bENvbW1hbmQgfCBIQUNfRU5BQkxFOyAgICAgICAgCisgICAgZG8geworICAgIAl1bFRlbXAgPSAqKHZvbGF0aWxlIHVpbnQzMiAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0hBU0hfU1RBVFVTX09GRlNFVCk7ICAgIAkKKyAgICB9IHdoaWxlICh1bFRlbXAgJiBIQVNIX0JVU1kpOworCisgICAgLyogT3V0cHV0IERpZ2VzdCAqLworICAgIGZvciAoaT0wOyBpPHVsRGlnZXN0TGVuZ3RoOyBpKyspCisgICAgeworICAgICAgICBjaCA9ICoodWludDggKikgKHBqZHN0ICsgaSk7CisgICAgICAgICoodWludDggKikgKG91dHB1dCArIGkpID0gY2g7ICAgIAorICAgIH0KKworfSAvKiBobWFjX2FzdDMwMDAgKi8KKworLyogbWFpbiBoYWN0ZXN0IHByb2NlZHVyZSAqLworaW50IGRvX2hhY3Rlc3QgKHZvaWQpCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgaSwgaiwgRmxhZ3MgPSAwOworCWFlc190ZXN0ICpwamFlc190ZXN0OworICAgICAgICBhZXNfY29udGV4dCBhZXNfY3R4OworICAgICAgICB1bnNpZ25lZCBjaGFyIEFFU19Nb2RlWzhdLCBhZXNfb3V0cHV0WzY0XTsKKwl1bnNpZ25lZCBsb25nIHVsQUVTTXNnTGVuZ3RoOworCQorCXJjNF90ZXN0ICpwanJjNF90ZXN0OworCXVuc2lnbmVkIGNoYXIgcmM0X2J1Zl9zd1s2NF0sIHJjNF9idWZfaHdbNjRdOworCXVuc2lnbmVkIGxvbmcgdWxSQzRLZXlMZW5ndGgsIHVsUkM0TXNnTGVuZ3RoOworCQorCWhhc2hfdGVzdCAqcGpoYXNoX3Rlc3Q7CisJdW5zaWduZWQgY2hhciBIQVNIX01vZGVbOF0sIGhhc2hfb3V0WzY0XTsKKworCWhtYWNfdGVzdCAqcGpobWFjX3Rlc3Q7CisJdW5zaWduZWQgY2hhciBITUFDX01vZGVbOF0sIGhtYWNfb3V0WzY0XTsKKworCUVuYWJsZUhNQUMoKTsKKwkKKwkvKiBBRVMgVGVzdCAqLworCXBqYWVzX3Rlc3QgPSBhZXN0ZXN0OworCXdoaWxlIChwamFlc190ZXN0LT5hZXNfbW9kZSAhPSAweEZGKQorCXsKKworICAgICAgICAgICAgaWYgKHBqYWVzX3Rlc3QtPmFlc19tb2RlID09IENSWVBUT01PREVfQ0JDKQorICAgICAgICAgICAgICAgIHN0cmNweSAoQUVTX01vZGUsICJDQkMiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBqYWVzX3Rlc3QtPmFlc19tb2RlID09IENSWVBUT01PREVfQ0ZCKQorICAgICAgICAgICAgICAgIHN0cmNweSAoQUVTX01vZGUsICJDRkIiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBqYWVzX3Rlc3QtPmFlc19tb2RlID09IENSWVBUT01PREVfT0ZCKQorICAgICAgICAgICAgICAgIHN0cmNweSAoQUVTX01vZGUsICJPRkIiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBqYWVzX3Rlc3QtPmFlc19tb2RlID09IENSWVBUT01PREVfQ1RSKQorICAgICAgICAgICAgICAgIHN0cmNweSAoQUVTX01vZGUsICJDVFIiKTsKKyAgICAgICAgICAgIGVsc2UgICAgCisgICAgICAgICAgICAgICAgc3RyY3B5IChBRVNfTW9kZSwgIkVDQiIpOworCisgICAgICAgICAgICAvKiBHZXQgTXNnLiBMZW5ndGggKi8KKyAgICAgICAgICAgIHVsQUVTTXNnTGVuZ3RoID0gc3RybGVuKHBqYWVzX3Rlc3QtPnBsYWludGV4dCk7CisgICAgICAgICAgICBqID0gKCAodWxBRVNNc2dMZW5ndGggKyAxNSkgPj4gNCkgPDwgNDsKKyAgICAgICAgICAgIGZvciAoaT11bEFFU01zZ0xlbmd0aDsgaTxqOyBpKyspCisgICAgICAgICAgICAgICAgcGphZXNfdGVzdC0+cGxhaW50ZXh0W2ldID0gMDsKKyAgICAgICAgICAgIHVsQUVTTXNnTGVuZ3RoID0gajsgICAgCisgICAgICAgICAgICAgICAgCQkKKyAgICAgICAgICAgIGFlc19zZXRfa2V5KCZhZXNfY3R4LCBwamFlc190ZXN0LT5rZXksIHBqYWVzX3Rlc3QtPmtleV9sZW5ndGgpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBFbmNyeXB0aW9uIFRlc3QgKi8KKyAgICAgICAgICAgIGFlc19lbmNfYXN0MzAwMCgmYWVzX2N0eCwgcGphZXNfdGVzdC0+cGxhaW50ZXh0LCBwamFlc190ZXN0LT5rZXksIGFlc19vdXRwdXQsIHVsQUVTTXNnTGVuZ3RoLCBwamFlc190ZXN0LT5hZXNfbW9kZSk7CSAgICAKKwkgICAgaWYgKHN0cm5jbXAoYWVzX291dHB1dCwgcGphZXNfdGVzdC0+Y2lwaGVydGV4dCwgdWxBRVNNc2dMZW5ndGgpKQorCSAgICB7CisJICAgIAlGbGFncyB8PSBGTEFHX0FFU1RFU1RfRkFJTDsJICAgIAkKKwkgICAgICAgIHByaW50ZigiW0lORk9dIEFFUyVkICVzIE1vZGUgRW5jcnlwdGlvbiBGYWlsZWQgXG4iLCBwamFlc190ZXN0LT5rZXlfbGVuZ3RoLCBBRVNfTW9kZSk7CisJICAgICAgICBwcmludGYoIltEQkddIEdvbGRlbiBEYXRhIER1bXAgLi4uLiBcbiIpOwkgICAgICAgIAorCSAgICAgICAgZm9yIChpPTA7IGk8IHVsQUVTTXNnTGVuZ3RoOyBpKyspCisJICAgICAgICB7CisJICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIsIHBqYWVzX3Rlc3QtPmNpcGhlcnRleHRbaV0pOwkgICAgICAgIAkKKwkgICAgICAgICAgICBpZiAoKChpKzEpICUgOCkgPT0gMCkKKwkgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiIpOyAgICAgICAgCisJICAgICAgICB9ICAgICAgICAKKwkgICAgICAgIHByaW50ZigiXG4gW0RCR10gRXJyb3IgRGF0YSBEdW1wIC4uLi4gXG4iKTsKKwkgICAgICAgIGZvciAoaT0wOyBpPCB1bEFFU01zZ0xlbmd0aDsgaSsrKQorCSAgICAgICAgeworCSAgICAgICAgICAgIHByaW50ZigiJTAyeCAiLCBhZXNfb3V0cHV0W2ldKTsJICAgICAgICAJCisJICAgICAgICAgICAgaWYgKCgoaSsxKSAlIDgpID09IDApCisJICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsgICAgICAgIAorCSAgICAgICAgfQorCSAgICAgICAgcHJpbnRmKCJcbiIpOwkgICAgICAgICAgICAgICAgCisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJICAgIAkvKgorCSAgICAgICAgcHJpbnRmKCJbSU5GT10gQUVTJWQgJXMgTW9kZSBFbmNyeXB0aW9uIFBhc3NlZCBcbiIsIHBqYWVzX3Rlc3QtPmtleV9sZW5ndGgsIEFFU19Nb2RlKTsKKwkgICAgICAgICovCisJICAgIH0JCisKKyAgICAgICAgICAgIC8qIERlY3J5cHRpb24gVGVzdCAqLworICAgICAgICAgICAgYWVzX2RlY19hc3QzMDAwKCZhZXNfY3R4LCBwamFlc190ZXN0LT5jaXBoZXJ0ZXh0LCBwamFlc190ZXN0LT5rZXksIGFlc19vdXRwdXQsIHVsQUVTTXNnTGVuZ3RoLCBwamFlc190ZXN0LT5hZXNfbW9kZSk7CSAgICAKKwkgICAgaWYgKHN0cm5jbXAoYWVzX291dHB1dCwgcGphZXNfdGVzdC0+cGxhaW50ZXh0LCB1bEFFU01zZ0xlbmd0aCkpCisJICAgIHsKKwkgICAgCUZsYWdzIHw9IEZMQUdfQUVTVEVTVF9GQUlMOworCSAgICAgICAgcHJpbnRmKCJbSU5GT10gQUVTJWQgJXMgTW9kZSBEZWNyeXB0aW9uIEZhaWxlZCBcbiIsIHBqYWVzX3Rlc3QtPmtleV9sZW5ndGgsIEFFU19Nb2RlKTsJICAgICAgICAKKwkgICAgICAgIHByaW50ZigiW0RCR10gR29sZGVuIERhdGEgRHVtcCAuLi4uIFxuIik7CisJICAgICAgICBmb3IgKGk9MDsgaTwgdWxBRVNNc2dMZW5ndGg7IGkrKykKKwkgICAgICAgIHsKKwkgICAgICAgICAgICBwcmludGYoIiUwMnggIiwgcGphZXNfdGVzdC0+cGxhaW50ZXh0W2ldKTsJICAgICAgICAJCisJICAgICAgICAgICAgaWYgKCgoaSsxKSAlIDgpID09IDApCisJICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsgICAgICAgIAorCSAgICAgICAgfSAgICAgICAgCisJICAgICAgICBwcmludGYoIlxuIFtEQkddIEVycm9yIERhdGEgRHVtcCAuLi4uIFxuIik7CisJICAgICAgICBmb3IgKGk9MDsgaTwgdWxBRVNNc2dMZW5ndGg7IGkrKykKKwkgICAgICAgIHsKKwkgICAgICAgICAgICBwcmludGYoIiUwMnggIiwgYWVzX291dHB1dFtpXSk7CSAgICAgICAgCQorCSAgICAgICAgICAgIGlmICgoKGkrMSkgJSA4KSA9PSAwKQorCSAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7ICAgICAgICAKKwkgICAgICAgIH0KKwkgICAgICAgIHByaW50ZigiXG4iKTsJICAgICAgICAgICAgICAgIAorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCSAgICAJLyoKKwkgICAgICAgIHByaW50ZigiW0lORk9dIEFFUyVkICVzIE1vZGUgRGVjcnlwdGlvbiBQYXNzZWQgXG4iLCBwamFlc190ZXN0LT5rZXlfbGVuZ3RoLCBBRVNfTW9kZSk7CisJICAgICAgICAqLworCSAgICB9CQorCSAgICAKKwkgICAgcGphZXNfdGVzdCsrOworICAgICAgICB9IC8qIEFFUyAqLworCisJLyogUkM0IFRlc3QgKi8KKwlwanJjNF90ZXN0ID0gcmM0dGVzdDsKKwl3aGlsZSAoKHBqcmM0X3Rlc3QtPmtleVswXSAhPSAweGZmKSAmJiAocGpyYzRfdGVzdC0+ZGF0YVswXSAhPSAweGZmKSkKKwl7CisKKyAgICAgICAgICAgIC8qIEdldCBJbmZvICovCisgICAgICAgICAgICB1bFJDNEtleUxlbmd0aCA9IHN0cmxlbihwanJjNF90ZXN0LT5rZXkpOworICAgICAgICAgICAgdWxSQzRNc2dMZW5ndGggPSBzdHJsZW4ocGpyYzRfdGVzdC0+ZGF0YSk7CisgICAgICAgICAgICBtZW1jcHkoICh2b2lkICopIHJjNF9idWZfc3csICh2b2lkICopIHBqcmM0X3Rlc3QtPmRhdGEsIHVsUkM0TXNnTGVuZ3RoICk7CisgICAgICAgICAgICBtZW1jcHkoICh2b2lkICopIHJjNF9idWZfaHcsICh2b2lkICopIHBqcmM0X3Rlc3QtPmRhdGEsIHVsUkM0TXNnTGVuZ3RoICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgIC8qIENyeXB0byAqLworICAgICAgICAgICAgcmM0X2NyeXB0X3N3KHJjNF9idWZfc3csIHVsUkM0TXNnTGVuZ3RoLCBwanJjNF90ZXN0LT5rZXksIHVsUkM0S2V5TGVuZ3RoKTsKKyAgICAgICAgICAgIHJjNF9jcnlwdF9hc3QzMDAwKHJjNF9idWZfaHcsIHVsUkM0TXNnTGVuZ3RoLCBwanJjNF90ZXN0LT5rZXksIHVsUkM0S2V5TGVuZ3RoKTsKKyAgICAgICAgICAgCisJICAgIGlmIChzdHJuY21wKHJjNF9idWZfaHcsIHJjNF9idWZfc3csIHVsUkM0TXNnTGVuZ3RoKSkKKwkgICAgeworCSAgICAJRmxhZ3MgfD0gRkxBR19SQzRURVNUX0ZBSUw7CSAgICAJCisJICAgICAgICBwcmludGYoIltJTkZPXSBSQzQgRW5jcnlwdGlvbiBGYWlsZWQgXG4iKTsKKwkgICAgICAgIHByaW50ZigiW0RCR10gR29sZGVuIERhdGEgRHVtcCAuLi4uIFxuIik7CisJICAgICAgICBmb3IgKGk9MDsgaTwgdWxSQzRNc2dMZW5ndGg7IGkrKykKKwkgICAgICAgIHsKKwkgICAgICAgICAgICBwcmludGYoIiUwMnggIiwgcmM0X2J1Zl9zd1tpXSk7CisJICAgICAgICAgICAgaWYgKCgoaSsxKSAlIDgpID09IDApCisJICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsgICAgICAgIAorCSAgICAgICAgfQorCSAgICAgICAgcHJpbnRmKCJcbiBbREJHXSBFcnJvciBEYXRhIER1bXAgLi4uLiBcbiIpOworCSAgICAgICAgZm9yIChpPTA7IGk8IHVsUkM0TXNnTGVuZ3RoOyBpKyspCisJICAgICAgICB7CisJICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIsIHJjNF9idWZfaHdbaV0pOworCSAgICAgICAgICAgIGlmICgoKGkrMSkgJSA4KSA9PSAwKQorCSAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7ICAgICAgICAKKwkgICAgICAgIH0KKwkgICAgICAgIHByaW50ZigiXG4iKTsJICAgICAgICAKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkgICAgCS8qCisJICAgICAgICBwcmludGYoIltJTkZPXSBSQzQgRW5jcnlwdGlvbiBQYXNzZWQgXG4iKTsKKwkgICAgICAgICovCisJICAgIH0JCisKKwkgICAgcGpyYzRfdGVzdCsrOworCSAgICAKKyAgICAgICAgfSAvKiBSQzQgKi8KKyAgICAgICAKKwkvKiBIYXNoIFRlc3QgKi8KKwlwamhhc2hfdGVzdCA9IGhhc2h0ZXN0OworCXdoaWxlIChwamhhc2hfdGVzdC0+aGFzaF9tb2RlICE9IDB4RkYpCisJeworCisgICAgICAgICAgICBpZiAocGpoYXNoX3Rlc3QtPmhhc2hfbW9kZSA9PSBIQVNITU9ERV9NRDUpCisgICAgICAgICAgICAgICAgc3RyY3B5IChIQVNIX01vZGUsICJNRDUiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBqaGFzaF90ZXN0LT5oYXNoX21vZGUgPT0gSEFTSE1PREVfU0hBMSkKKyAgICAgICAgICAgICAgICBzdHJjcHkgKEhBU0hfTW9kZSwgIlNIQTEiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBqaGFzaF90ZXN0LT5oYXNoX21vZGUgPT0gSEFTSE1PREVfU0hBMjU2KQorICAgICAgICAgICAgICAgIHN0cmNweSAoSEFTSF9Nb2RlLCAiU0hBMjU2Iik7CisgICAgICAgICAgICBlbHNlIGlmIChwamhhc2hfdGVzdC0+aGFzaF9tb2RlID09IEhBU0hNT0RFX1NIQTIyNCkKKyAgICAgICAgICAgICAgICBzdHJjcHkgKEhBU0hfTW9kZSwgIlNIQTIyNCIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBIYXNoICovICAgCQkKKyAgICAgICAgICAgIGhhc2hfYXN0MzAwMChwamhhc2hfdGVzdC0+aW5wdXQsIHN0cmxlbihwamhhc2hfdGVzdC0+aW5wdXQpLCBoYXNoX291dCwgcGpoYXNoX3Rlc3QtPmhhc2hfbW9kZSk7ICAgICAgICAgICAgCisJICAgIGlmIChzdHJuY21wKGhhc2hfb3V0LCBwamhhc2hfdGVzdC0+ZGlnZXN0LCBwamhhc2hfdGVzdC0+ZGlnZXN0X2xlbmd0aCkpCisJICAgIHsKKwkgICAgCUZsYWdzIHw9IEZMQUdfSEFTSFRFU1RfRkFJTDsJICAgIAkKKwkgICAgICAgIHByaW50ZigiW0lORk9dIEhBU0ggJXMgRmFpbGVkIFxuIiwgSEFTSF9Nb2RlKTsKKwkgICAgICAgIHByaW50ZigiW0RCR10gR29sZGVuIERhdGEgRHVtcCAuLi4uIFxuIik7CSAgICAgICAgCisJICAgICAgICBmb3IgKGk9MDsgaTwgcGpoYXNoX3Rlc3QtPmRpZ2VzdF9sZW5ndGg7IGkrKykKKwkgICAgICAgIHsKKwkgICAgICAgICAgICBwcmludGYoIiUwMnggIixwamhhc2hfdGVzdC0+ZGlnZXN0W2ldKTsKKwkgICAgICAgICAgICBpZiAoKChpKzEpICUgOCkgPT0gMCkgCQorCSAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7ICAgICAgICAKKwkgICAgICAgIH0gICAgICAgIAorCSAgICAgICAgcHJpbnRmKCJcbiBbREJHXSBFcnJvciBEYXRhIER1bXAgLi4uLiBcbiIpOworCSAgICAgICAgZm9yIChpPTA7IGk8IHBqaGFzaF90ZXN0LT5kaWdlc3RfbGVuZ3RoOyBpKyspCisJICAgICAgICB7CisJICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIsaGFzaF9vdXRbaV0pOworCSAgICAgICAgICAgIGlmICgoKGkrMSkgJSA4KSA9PSAwKSAJCisJICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsgICAgICAgIAorCSAgICAgICAgfQorCSAgICAgICAgcHJpbnRmKCJcbiIpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCSAgICAJLyoKKwkgICAgICAgIHByaW50ZigiW0lORk9dIEhBU0ggJXMgUGFzc2VkIFxuIiwgSEFTSF9Nb2RlKTsKKwkgICAgICAgICovCisJICAgIH0JCisKKyAgICAgICAgICAgIHBqaGFzaF90ZXN0Kys7CisgICAgICAgICAgICAKKyAgICAgICAgfSAvKiBIYXNoIFRlc3QgKi8KKworCS8qIEhNQUMgVGVzdCAqLworCXBqaG1hY190ZXN0ID0gaG1hY3Rlc3Q7CisJd2hpbGUgKHBqaG1hY190ZXN0LT5oYXNoX21vZGUgIT0gMHhGRikKKwl7CisKKyAgICAgICAgICAgIGlmIChwamhtYWNfdGVzdC0+aGFzaF9tb2RlID09IEhBU0hNT0RFX01ENSkKKyAgICAgICAgICAgICAgICBzdHJjcHkgKEhNQUNfTW9kZSwgIk1ENSIpOworICAgICAgICAgICAgZWxzZSBpZiAocGpobWFjX3Rlc3QtPmhhc2hfbW9kZSA9PSBIQVNITU9ERV9TSEExKQorICAgICAgICAgICAgICAgIHN0cmNweSAoSE1BQ19Nb2RlLCAiU0hBMSIpOworICAgICAgICAgICAgZWxzZSBpZiAocGpobWFjX3Rlc3QtPmhhc2hfbW9kZSA9PSBIQVNITU9ERV9TSEEyNTYpCisgICAgICAgICAgICAgICAgc3RyY3B5IChITUFDX01vZGUsICJTSEEyNTYiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBqaG1hY190ZXN0LT5oYXNoX21vZGUgPT0gSEFTSE1PREVfU0hBMjI0KQorICAgICAgICAgICAgICAgIHN0cmNweSAoSE1BQ19Nb2RlLCAiU0hBMjI0Iik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIEhNQUMgKi8gICAJCQorICAgICAgICAgICAgaG1hY2tleV9hc3QzMDAwKHBqaG1hY190ZXN0LT5rZXksIHBqaG1hY190ZXN0LT5rZXlfbGVuZ3RoLCBwamhtYWNfdGVzdC0+aGFzaF9tb2RlKTsKKyAgICAgICAgICAgIGhtYWNfYXN0MzAwMChwamhtYWNfdGVzdC0+a2V5LCBwamhtYWNfdGVzdC0+a2V5X2xlbmd0aCwgcGpobWFjX3Rlc3QtPmlucHV0LCBzdHJsZW4ocGpobWFjX3Rlc3QtPmlucHV0KSwgcGpobWFjX3Rlc3QtPmhhc2hfbW9kZSwgaG1hY19vdXQpOyAgICAgICAgICAgIAorCSAgICBpZiAoc3RybmNtcChobWFjX291dCwgcGpobWFjX3Rlc3QtPmRpZ2VzdCwgcGpobWFjX3Rlc3QtPmRpZ2VzdF9sZW5ndGgpKQorCSAgICB7CisJICAgIAlGbGFncyB8PSBGTEFHX0hBU0hURVNUX0ZBSUw7CSAgICAJCisJICAgICAgICBwcmludGYoIltJTkZPXSBITUFDICVzIEZhaWxlZCBcbiIsIEhNQUNfTW9kZSk7CisJICAgICAgICBwcmludGYoIltEQkddIEdvbGRlbiBEYXRhIER1bXAgLi4uLiBcbiIpOwkgICAgICAgIAorCSAgICAgICAgZm9yIChpPTA7IGk8IHBqaG1hY190ZXN0LT5kaWdlc3RfbGVuZ3RoOyBpKyspCisJICAgICAgICB7CisJICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIscGpobWFjX3Rlc3QtPmRpZ2VzdFtpXSk7CisJICAgICAgICAgICAgaWYgKCgoaSsxKSAlIDgpID09IDApIAkKKwkgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiIpOyAgICAgICAgCisJICAgICAgICB9ICAgICAgICAKKwkgICAgICAgIHByaW50ZigiXG4gW0RCR10gRXJyb3IgRGF0YSBEdW1wIC4uLi4gXG4iKTsKKwkgICAgICAgIGZvciAoaT0wOyBpPCBwamhtYWNfdGVzdC0+ZGlnZXN0X2xlbmd0aDsgaSsrKQorCSAgICAgICAgeworCSAgICAgICAgICAgIHByaW50ZigiJTAyeCAiLGhtYWNfb3V0W2ldKTsKKwkgICAgICAgICAgICBpZiAoKChpKzEpICUgOCkgPT0gMCkgCQorCSAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7ICAgICAgICAKKwkgICAgICAgIH0KKwkgICAgICAgIHByaW50ZigiXG4iKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkgICAgCS8qCisJICAgICAgICBwcmludGYoIltJTkZPXSBITUFDICVzIFBhc3NlZCBcbiIsIEhNQUNfTW9kZSk7CisJICAgICAgICAqLworCSAgICB9CQorCisgICAgICAgICAgICBwamhtYWNfdGVzdCsrOworICAgICAgICAgICAgCisgICAgICAgIH0gLyogSE1BQyBUZXN0ICovCisKKwlyZXR1cm4gRmxhZ3M7CisJCit9CisKKyNlbmRpZiAvKiBDT05GSUdfU0xUICovCmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjMwMC9oYWN0ZXN0LmggYi9ib2FyZC9hc3BlZWQvYXN0MjMwMC9oYWN0ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmNmMjE4NgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL2hhY3Rlc3QuaApAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisvKiBFcnIgRmxhZ3MgKi8KKyNkZWZpbmUgRkxBR19BRVNURVNUX0ZBSUwgIAkJMHgwMDAwMDAwMQorI2RlZmluZSBGTEFHX1JDNFRFU1RfRkFJTCAgCQkweDAwMDAwMDAyCisjZGVmaW5lIEZMQUdfSEFTSFRFU1RfRkFJTCAgCQkweDAwMDAwMDA0CisKKy8qIFNwZWNpZmljICovCisvKgorI2RlZmluZSBEUkFNX0JBU0UJCQkweDQwMDAwMDAwCisjZGVmaW5lCUNSWVBUT19TUkNfQkFTRQkJCShEUkFNX0JBU0UgKyAweDEwMDAwMCkKKyNkZWZpbmUJQ1JZUFRPX0RTVF9CQVNFCQkJKERSQU1fQkFTRSArIDB4MjAwMDAwKQorI2RlZmluZQlDUllQVE9fQ09OVEVYVF9CQVNFCQkoRFJBTV9CQVNFICsgMHgzMDAwMDApCisKKyNkZWZpbmUJSEFTSF9TUkNfQkFTRQkJCShEUkFNX0JBU0UgKyAweDQwMDAwMCkKKyNkZWZpbmUJSEFTSF9EU1RfQkFTRQkJCShEUkFNX0JBU0UgKyAweDUwMDAwMCkKKyNkZWZpbmUJSE1BQ19LRVlfQkFTRQkJCShEUkFNX0JBU0UgKyAweDYwMDAwMCkKKyovCisjZGVmaW5lIG0wOGJ5dGVBbGlnbm1lbnQoeCkJCSgoeCArIDB4MDAwMDAwMDcpICYgMHhGRkZGRkZGOCkKKyNkZWZpbmUgbTE2Ynl0ZUFsaWdubWVudCh4KQkJKCh4ICsgMHgwMDAwMDAwRikgJiAweEZGRkZGRkYwKQorI2RlZmluZSBtNjRieXRlQWxpZ25tZW50KHgpCQkoKHggKyAweDAwMDAwMDNGKSAmIDB4RkZGRkZGQzApCisKKyNkZWZpbmUgQ1JZUFRPX0FMSUdOTUVOVAkJMTYKKyNkZWZpbmUgQ1JZUFRPX01BWF9TUkMJCQkoMTAwK0NSWVBUT19BTElHTk1FTlQpCisjZGVmaW5lIENSWVBUT19NQVhfRFNUCQkJKDEwMCtDUllQVE9fQUxJR05NRU5UKQorI2RlZmluZSBDUllQVE9fTUFYX0NPTlRFWFQJCSgxMDArQ1JZUFRPX0FMSUdOTUVOVCkKKworI2RlZmluZSBIQVNIX0FMSUdOTUVOVAkJCTE2CisjZGVmaW5lIEhNQUNfS0VZX0FMSUdOTUVOVAkgCTY0CisjZGVmaW5lIEhBU0hfTUFYX1NSQwkJCSgxMDArSEFTSF9BTElHTk1FTlQpCisjZGVmaW5lIEhBU0hfTUFYX0RTVAkJCSgzMitIQVNIX0FMSUdOTUVOVCkKKyNkZWZpbmUgSE1BQ19NQVhfS0VZCQkJKDY0K0hNQUNfS0VZX0FMSUdOTUVOVCkKKworLyogR2VuZXJhbCAqLworI2RlZmluZSBIQUNfUkVHX0JBU0UgCQkJMHgxZTZlMzAwMAorCisjZGVmaW5lIE1BWF9LRVlMRU5HVEgJCQkxMDAKKyNkZWZpbmUgTUFYX1RFWFRMRU5HVEgJCQkxMDAKKyNkZWZpbmUgTUFYX0FFU1RFWFRMRU5HVEgJCTI1NgorI2RlZmluZSBNQVhfUkM0VEVYVExFTkdUSAkJMjU2CisjZGVmaW5lIE1BWF9SQzRLRVlMRU5HVEgJCTI1NgorCisjZGVmaW5lIENSWVBUT01PREVfRUNCCQkJMHgwMAorI2RlZmluZSBDUllQVE9NT0RFX0NCQwkJCTB4MDEKKyNkZWZpbmUgQ1JZUFRPTU9ERV9DRkIJCQkweDAyCisjZGVmaW5lIENSWVBUT01PREVfT0ZCCQkJMHgwMworI2RlZmluZSBDUllQVE9NT0RFX0NUUgkJCTB4MDQKKworI2RlZmluZSBIQVNITU9ERV9NRDUJCQkweDAwCisjZGVmaW5lIEhBU0hNT0RFX1NIQTEJCQkweDAxCisjZGVmaW5lIEhBU0hNT0RFX1NIQTI1NgkJCTB4MDIKKyNkZWZpbmUgSEFTSE1PREVfU0hBMjI0CQkJMHgwMworCisjZGVmaW5lIE1JWE1PREVfRElTQUJMRSAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBNSVhNT0RFX0NSWVBUTyAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTUlYTU9ERV9IQVNIICAgICAgICAgICAgICAgICAgICAweDAzCisKKyNkZWZpbmUgUkVHX0NSWVBUT19TUkNfQkFTRV9PRkZTRVQJMHgwMAorI2RlZmluZSBSRUdfQ1JZUFRPX0RTVF9CQVNFX09GRlNFVAkweDA0CisjZGVmaW5lIFJFR19DUllQVE9fQ09OVEVYVF9CQVNFX09GRlNFVAkweDA4CisjZGVmaW5lIFJFR19DUllQVE9fTEVOX09GRlNFVAkJMHgwQworI2RlZmluZSBSRUdfQ1JZUFRPX0NNRF9CQVNFX09GRlNFVAkweDEwCisvLyNkZWZpbmUgUkVHX0NSWVBUT19FTkFCTEVfT0ZGU0VUCTB4MTQKKyNkZWZpbmUgUkVHX0NSWVBUT19TVEFUVVNfT0ZGU0VUCTB4MUMKKworI2RlZmluZSBSRUdfSEFTSF9TUkNfQkFTRV9PRkZTRVQJMHgyMAorI2RlZmluZSBSRUdfSEFTSF9EU1RfQkFTRV9PRkZTRVQJMHgyNAorI2RlZmluZSBSRUdfSEFTSF9LRVlfQkFTRV9PRkZTRVQJMHgyOAorI2RlZmluZSBSRUdfSEFTSF9MRU5fT0ZGU0VUCQkweDJDCisjZGVmaW5lIFJFR19IQVNIX0NNRF9PRkZTRVQJCTB4MzAKKy8vI2RlZmluZSBSRUdfSEFTSF9FTkFCTEVfT0ZGU0VUCQkweDE0CisjZGVmaW5lIFJFR19IQVNIX1NUQVRVU19PRkZTRVQJCTB4MUMKKworI2RlZmluZSBIQVNIX0JVU1kJCQkweDAxCisjZGVmaW5lIENSWVBUT19CVVNZCQkJMHgwMgorCisvLyNkZWZpbmUgRU5BQkxFX0hBU0gJCQkweDAxCisvLyNkZWZpbmUgRElTQUJMRV9IQVNICQkJMHgwMAorLy8jZGVmaW5lIEVOQUJMRV9DUllQVE8JCQkweDAyCisvLyNkZWZpbmUgRElTQUJMRV9DUllQVE8JCQkweDAwCisKKyNkZWZpbmUgQ1JZUFRPX1NZTkNfTU9ERV9NQVNLCQkweDAzCisjZGVmaW5lIENSWVBUT19TWU5DX01PREVfQVNZTkMJCTB4MDAKKyNkZWZpbmUgQ1JZUFRPX1NZTkNfTU9ERV9QQVNTSVZFCTB4MDIKKyNkZWZpbmUgQ1JZUFRPX1NZTkNfTU9ERV9BQ1RJVkUJCTB4MDMKKworI2RlZmluZSBDUllQVE9fQUVTMTI4CQkJMHgwMAorI2RlZmluZSBDUllQVE9fQUVTMTkyCQkJMHgwNAorI2RlZmluZSBDUllQVE9fQUVTMjU2CQkJMHgwOAorCisjZGVmaW5lIENSWVBUT19BRVNfRUNCCQkJMHgwMAorI2RlZmluZSBDUllQVE9fQUVTX0NCQwkJCTB4MTAKKyNkZWZpbmUgQ1JZUFRPX0FFU19DRkIJCQkweDIwCisjZGVmaW5lIENSWVBUT19BRVNfT0ZCCQkJMHgzMAorI2RlZmluZSBDUllQVE9fQUVTX0NUUgkJCTB4NDAKKworI2RlZmluZSBDUllQVE9fRU5DUllQVE8JCQkweDgwCisjZGVmaW5lIENSWVBUT19ERUNSWVBUTwkJCTB4MDAKKworI2RlZmluZSBDUllQVE9fQUVTCQkJMHgwMDAKKyNkZWZpbmUgQ1JZUFRPX1JDNAkJCTB4MTAwCisKKyNkZWZpbmUgQ1JZUFRPX0VOQUJMRV9SVwkJMHgwMDAKKyNkZWZpbmUgQ1JZUFRPX0VOQUJMRV9DT05URVhUX0xPQUQJMHgwMDAKKyNkZWZpbmUgQ1JZUFRPX0VOQUJMRV9DT05URVhUX1NBVkUJMHgwMDAKKworI2RlZmluZSBIQVNIX1NZTkNfTU9ERV9NQVNLCQkweDAzCisjZGVmaW5lIEhBU0hfU1lOQ19NT0RFX0FTWU5DCQkweDAwCisjZGVmaW5lIEhBU0hfU1lOQ19NT0RFX1BBU1NJVkUJCTB4MDIKKyNkZWZpbmUgSEFTSF9TWU5DX01PREVfQUNUSVZFCQkweDAzCisKKyNkZWZpbmUgSEFTSF9SRUFEX1NXQVBfRU5BQkxFCQkweDA0CisjZGVmaW5lIEhNQUNfU1dBUF9DT05UUk9MX0VOQUJMRQkweDA4CisKKyNkZWZpbmUgSEFTSF9BTEdfU0VMRUNUX01BU0sJCTB4NzAKKyNkZWZpbmUgSEFTSF9BTEdfU0VMRUNUX01ENQkJMHgwMAorI2RlZmluZSBIQVNIX0FMR19TRUxFQ1RfU0hBMQkJMHgyMAorI2RlZmluZSBIQVNIX0FMR19TRUxFQ1RfU0hBMjI0CQkweDQwCisjZGVmaW5lIEhBU0hfQUxHX1NFTEVDVF9TSEEyNTYJCTB4NTAKKworI2RlZmluZSBIQUNfRU5BQkxFCQkJMHg4MAorI2RlZmluZSBIQUNfRElHRVNUX0NBTF9FTkFCTEUJCTB4MTgwCisjZGVmaW5lIEhBU0hfSU5UX0VOQUJMRQkJCTB4MjAwCisKKy8qIEFFUyAqLworI2lmbmRlZiB1aW50OAorI2RlZmluZSB1aW50OCAgdW5zaWduZWQgY2hhcgorI2VuZGlmCisKKyNpZm5kZWYgdWludDMyCisjZGVmaW5lIHVpbnQzMiB1bnNpZ25lZCBsb25nIGludAorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyIGVya1s2NF07ICAgICAvKiBlbmNyeXB0aW9uIHJvdW5kIGtleXMgKi8KKyAgICB1aW50MzIgZHJrWzY0XTsgICAgIC8qIGRlY3J5cHRpb24gcm91bmQga2V5cyAqLworICAgIGludCBucjsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHJvdW5kcyAqLworfQorYWVzX2NvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50CSAgYWVzX21vZGU7CisgICAgaW50CSAga2V5X2xlbmd0aDsKKwkKKyAgICB1aW50OCBrZXlbMzJdOwkvKiBhcyBpdiBpbiBDVFIgbW9kZSAqLworICAgIHVpbnQ4IHBsYWludGV4dFs2NF07CisgICAgdWludDggY2lwaGVydGV4dFs2NF07CisgICAgCit9CithZXNfdGVzdDsKKworLyogUkM0ICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQ4IGtleVszMl07CisgICAgdWludDggZGF0YVs2NF07Cit9CityYzRfdGVzdDsKKworLyogSGFzaCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQJICBoYXNoX21vZGU7CisgICAgaW50CSAgZGlnZXN0X2xlbmd0aDsKKwkKKyAgICB1aW50OCBpbnB1dFs2NF07CisgICAgdWludDggZGlnZXN0WzY0XTsKKyAgICAKK30KK2hhc2hfdGVzdDsKKwkKKy8qIEhNQUMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50CSAgaGFzaF9tb2RlOworICAgIGludAkgIGtleV9sZW5ndGg7CisgICAgaW50CSAgZGlnZXN0X2xlbmd0aDsKKworICAgIHVpbnQ4IGtleVsxMDBdOwkKKyAgICB1aW50OCBpbnB1dFs2NF07CisgICAgdWludDggZGlnZXN0WzY0XTsKKyAgICAKK30KK2htYWNfdGVzdDsKZGlmZiAtLWdpdCBhL2JvYXJkL2FzcGVlZC9hc3QyMzAwL21hY3Rlc3QuYyBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL21hY3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NTY2YjY1Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvbWFjdGVzdC5jCkBAIC0wLDAgKzEsNTA0IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDcgQVNQRUVEIFNvZnR3YXJlCisgKiBNQUMgTWFudWZhY3R1cmUgVGVzdCBpbiBBU1BFRUQncyBTREsgdmVyc2lvbiAwLjIwLjAxCisgKgorICogUmVsZWFzZSBIaXN0b3J5CisgKiAxLiBGaXJzdCBSZWxlYXNlLCByaXZlckAyMDA3MTEzMAorICogMi4gRml4IHRoZSBlbmRsZXNzIGxvb3Agd2hlbiBQSFkgaXMgbm90IHJlYWR5LCByaXZlckAyMDA3MTIwNAorICoKKyAqIFRlc3QgaXRlbXM6CisgKiAxLiBTdXBwb3J0IE1BUlZFTEwgUEhZIG9ubHkgaW4gdGhpcyB2ZXJzaW9uCisgKiAyLiBNREMvTURJTworICogMy4gR01BQy9EdXBsZXggVFgvUlggRnVsbF9TaXplLCBQYWNrZXRfTGVuZ3RoIFRlc3QKKyAqIDQuIDEwME0vRHVwbGV4IFRYL1JYIEZ1bGxfU2l6ZSwgUGFja2V0X0xlbmd0aCBUZXN0CisgKgorICoKKyAqCisqLworCisKKy8qCisqIERpYWdub3N0aWNzIHN1cHBvcnQKKyovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPHBvc3QuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxuZXQuaD4KKyNpbmNsdWRlICJzbHQuaCIKKworI2lmICgoQ0ZHX0NNRF9TTFQgJiBDRkdfQ01EX01BQ1RFU1QpICYmIGRlZmluZWQoQ09ORklHX1NMVCkpCisjaW5jbHVkZSAibWFjdGVzdC5oIgorCitzdGF0aWMgaW50IElOTCh1X2xvbmcgYmFzZSwgdV9sb25nIGFkZHIpCit7CisJcmV0dXJuIGxlMzJfdG9fY3B1KCoodm9sYXRpbGUgdV9sb25nICopKGFkZHIgKyBiYXNlKSk7Cit9CisKK3N0YXRpYyB2b2lkIE9VVEwodV9sb25nIGJhc2UsIGludCBjb21tYW5kLCB1X2xvbmcgYWRkcikKK3sKKwkqKHZvbGF0aWxlIHVfbG9uZyAqKShhZGRyICsgYmFzZSkgPSBjcHVfdG9fbGUzMihjb21tYW5kKTsKK30KKworCitzdGF0aWMgdm9pZCBTQ1VfTUFDMV9FbmFibGUgKHZvaWQpCit7CisJdW5zaWduZWQgaW50IFNDVV9SZWdpc3RlcjsKKworLy9NQUMxIFJFU0VUL1BIWV9MSU5LIGluIFNDVQorICAgICAgICBTQ1VfUmVnaXN0ZXIgPSBJTkwoU0NVX0JBU0UsIFNDVV9SRVNFVF9DT05UUk9MX1JFRyk7CisJT1VUTChTQ1VfQkFTRSwgU0NVX1JlZ2lzdGVyICYgfigweDgwMCksIFNDVV9SRVNFVF9DT05UUk9MX1JFRyk7CisJCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgLiBSZWFkcyBhIHJlZ2lzdGVyIGZyb20gdGhlIE1JSSBNYW5hZ2VtZW50IHNlcmlhbCBpbnRlcmZhY2UKKyAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdTE2IHBoeV9yZWFkX3JlZ2lzdGVyICh1OCBQSFlfUmVnaXN0ZXIsIHU4IFBIWV9BZGRyZXNzKQoreworCXUzMiBEYXRhLCBTdGF0dXMgPSAwLCBMb29wX0NvdW50ID0gMCwgUEhZX1JlYWR5ID0gMTsKKwl1MTYgUmV0dXJuX0RhdGE7CisKKwlPVVRMKE1BQzFfSU9fQkFTRSwgKFBIWV9SZWdpc3RlciA8PCAyMSkgKyAoUEhZX0FkZHJlc3MgPDwgMTYpICsgTUlJUkQgKyBNRENfQ1lDVEhSLCBQSFlDUl9SRUcpOworCWRvIHsKKwkJU3RhdHVzID0gKElOTCAoTUFDMV9JT19CQVNFLCBQSFlDUl9SRUcpICYgTUlJUkQpOworCQlMb29wX0NvdW50Kys7CisJCWlmIChMb29wX0NvdW50ID49IFBIWV9MT09QKSB7CisJCQlQSFlfUmVhZHkgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChTdGF0dXMgPT0gTUlJUkQpOworICAgICAgIAorCWlmIChQSFlfUmVhZHkgPT0gMCkgeworCQlwcmludGYgKCJQSFkgTk9UIFJFREFZXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCXVkZWxheSg1KjEwMDApOworCURhdGEgPSBJTkwgKE1BQzFfSU9fQkFTRSwgUEhZREFUQV9SRUcpOworCVJldHVybl9EYXRhID0gKERhdGEgPj4gMTYpOworCisJcmV0dXJuIFJldHVybl9EYXRhOworfQorCitzdGF0aWMgdm9pZCBwaHlfd3JpdGVfcmVnaXN0ZXIgKHU4IFBIWV9SZWdpc3RlciwgdTggUEhZX0FkZHJlc3MsIHUxNiBQSFlfRGF0YSkKK3sKKwl1MzIgU3RhdHVzID0gMCwgTG9vcF9Db3VudCA9IDAsIFBIWV9SZWFkeSA9IDE7CisKKwlPVVRMKE1BQzFfSU9fQkFTRSwgUEhZX0RhdGEsIFBIWURBVEFfUkVHKTsKKwlPVVRMKE1BQzFfSU9fQkFTRSwgKFBIWV9SZWdpc3RlciA8PCAyMSkgKyAoUEhZX0FkZHJlc3MgPDwgMTYpICsgTUlJV1IgKyBNRENfQ1lDVEhSLCBQSFlDUl9SRUcpOworCWRvIHsKKwkJU3RhdHVzID0gKElOTCAoTUFDMV9JT19CQVNFLCBQSFlDUl9SRUcpICYgTUlJV1IpOworCQlMb29wX0NvdW50Kys7CisJCWlmIChMb29wX0NvdW50ID49IFBIWV9MT09QKSB7CisJCQlQSFlfUmVhZHkgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChTdGF0dXMgPT0gTUlJV1IpOworCWlmIChQSFlfUmVhZHkgPT0gMCkgeworCQlwcmludGYgKCJQSFkgTk9UIFJFREFZXG4iKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgd2FpdF9saW5rX3Jlc29sdmUgKHZvaWQpCit7CisJaW50IHJlc29sdmVkX3N0YXR1cywgTG9vcF9Db3VudCA9IDAsIFBIWV9SZWFkeSA9IDE7CisKKyAgICAgICAgZG8geworICAgICAgIAkJcmVzb2x2ZWRfc3RhdHVzID0gKHBoeV9yZWFkX3JlZ2lzdGVyICgweDExLCAwKSAmIChQSFlfUkVTT0xWRURfYml0IHwgUEhZX0xJTktfYml0KSk7CisgICAgICAgICAgICAgICAJTG9vcF9Db3VudCsrOworICAgICAgICAgICAgICAgCWlmIChMb29wX0NvdW50ID49IFBIWV9MT09QKSB7CisgICAgICAgICAgICAgICAgICAgCVBIWV9SZWFkeSA9IDA7CisgICAgICAgICAgICAgICAgICAgIAlwcmludGYgKCJQSFkgTk9UIFJFQURZXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgCWJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAocmVzb2x2ZWRfc3RhdHVzICE9IChQSFlfUkVTT0xWRURfYml0IHwgUEhZX0xJTktfYml0KSk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gUEhZX1JlYWR5OworfQorCitzdGF0aWMgdm9pZCBzZXRfcGh5X3NwZWVkIChpbnQgY2hpcCwgaW50IHNwZWVkLCBpbnQgZHVwbGV4KQoreworCXVuc2lnbmVkIHNob3J0IGRhdGEsIHN0YXR1czsKKworCisJaWYgKGNoaXAgPT0gUEhZSURfVkVORE9SX01BUlZFTEwpIHsKKwkJaWYgKChzcGVlZCA9PSBQSFlfU1BFRURfMUcpICYmIChkdXBsZXggPT0gRFVQTEVYX0ZVTEwpKSB7CisvL01hbnVhbCBDb250cm9sCisJCQlwaHlfd3JpdGVfcmVnaXN0ZXIgKDE4LCAwLCAwKTsKKwkJCWRhdGEgPSBwaHlfcmVhZF9yZWdpc3RlciAoOSwgMCk7CisJCQlwaHlfd3JpdGVfcmVnaXN0ZXIgKDksIDAsIGRhdGEgfCAweDE4MDApOworLy9QSFkgUmVzZXQKKwkJCXBoeV93cml0ZV9yZWdpc3RlciAoMCwgMCwgMHgwMTQwIHwgMHg4MDAwKTsKKwkJCWRvIHsKKwkJCQlzdGF0dXMgPSAocGh5X3JlYWRfcmVnaXN0ZXIgKDAsIDApICYgMHg4MDAwKTsgCisJCQl9IHdoaWxlIChzdGF0dXMgIT0gMCk7CisJCisvL0ZvcmNlIDFHCisJCQlwaHlfd3JpdGVfcmVnaXN0ZXIgKDI5LCAwLCAweDA3KTsKKwkJCWRhdGEgPSBwaHlfcmVhZF9yZWdpc3RlciAoMzAsIDApOworCQkJcGh5X3dyaXRlX3JlZ2lzdGVyICgzMCwgMCwgZGF0YSB8IDB4MDgpOworCQkJcGh5X3dyaXRlX3JlZ2lzdGVyICgyOSwgMCwgMHgxMCk7CisJCQlkYXRhID0gcGh5X3JlYWRfcmVnaXN0ZXIgKDMwLCAwKTsKKwkJCXBoeV93cml0ZV9yZWdpc3RlciAoMzAsIDAsIGRhdGEgfCAweDAyKTsKKwkJCXBoeV93cml0ZV9yZWdpc3RlciAoMjksIDAsIDB4MTIpOworCQkJZGF0YSA9IHBoeV9yZWFkX3JlZ2lzdGVyICgzMCwgMCk7CisJCQlwaHlfd3JpdGVfcmVnaXN0ZXIgKDMwLCAwLCBkYXRhIHwgMHgwMSk7CisJCisJCQlwcmludGYgKCJGT1JDRSBNQVJWRUxMIFBIWSB0byAxRy9EVVBMRVggRE9ORVxuIik7CisJCX0KKwkJZWxzZSBpZiAoKHNwZWVkID09IFBIWV9TUEVFRF8xMDBNKSAmJiAoZHVwbGV4ID09IERVUExFWF9GVUxMKSkgeworLy9QSFkgUmVzZXQKKwkJCXBoeV93cml0ZV9yZWdpc3RlciAoMCwgMCwgMHgyMTAwIHwgMHg4MDAwKTsKKwkJCWRvIHsKKwkJCQlzdGF0dXMgPSAocGh5X3JlYWRfcmVnaXN0ZXIgKDAsIDApICYgMHg4MDAwKTsgCisJCQl9IHdoaWxlIChzdGF0dXMgIT0gMCk7CisJCisvL0ZvcmNlIDEwME0KKwkJCWRhdGEgPSBwaHlfcmVhZF9yZWdpc3RlciAoMCwgMCk7CisJCQlwaHlfd3JpdGVfcmVnaXN0ZXIgKDAsIDAsIGRhdGEgfCAweDQwMDAgfCAweDgwMDApOworCQkJZG8geworCQkJCXN0YXR1cyA9IChwaHlfcmVhZF9yZWdpc3RlciAoMCwgMCkgJiAweDgwMDApOyAKKwkJCX0gd2hpbGUgKHN0YXR1cyAhPSAwKTsKKwkJCWRhdGEgPSBwaHlfcmVhZF9yZWdpc3RlciAoMCwgMCk7CisKKwkJCXByaW50ZiAoIkZPUkNFIE1BUlZFTEwgUEhZIHRvIDEwME0vRFVQTEVYIERPTkVcbiIpOworCQl9CisJfQorCWVsc2UgaWYgKCAoY2hpcCA9PSBQSFlJRF9WRU5ET1JfUlRMODIwMUUpIHx8IChjaGlwID09IFBIWUlEX1ZFTkRPUl9CUk9BRENPTSkgKXsKKwkJLyogYmFzaWMgc2V0dGluZyAqLworCQlkYXRhICA9IHBoeV9yZWFkX3JlZ2lzdGVyICgwLCAwKTsKKwkJZGF0YSAmPSAweDcxNDA7CisJCWRhdGEgfD0gMHg0MDAwOworCQlpZiAoc3BlZWQgPT0gUEhZX1NQRUVEXzEwME0pCisJCSAgICBkYXRhIHw9IDB4MjAwMDsKKyAgICAgICAgICAgICAgICBpZiAoZHVwbGV4ID09IERVUExFWF9GVUxMKQkJICAgIAorICAgICAgICAgICAgICAgICAgICBkYXRhIHw9IDB4MDEwMDsKKwkJcGh5X3dyaXRlX3JlZ2lzdGVyICgwLCAwLCBkYXRhKTsKKworICAgICAgICAgICAgICAgIC8qIHJlc2V0ICovCisJCXBoeV93cml0ZV9yZWdpc3RlciAoMCwgMCwgZGF0YSB8IDB4ODAwMCk7CisJCWRvIHsKKwkJCXN0YXR1cyA9IChwaHlfcmVhZF9yZWdpc3RlciAoMCwgMCkgJiAweDgwMDApOyAKKwkJfSB3aGlsZSAoc3RhdHVzICE9IDApOworCSAgICAgICAgdWRlbGF5KDEwMCoxMDAwKTsKKwkJCisJCS8qIGJhc2ljIHNldHRpbmcgKi8KKwkJcGh5X3dyaXRlX3JlZ2lzdGVyICgwLCAwLCBkYXRhKTsKKworICAgICAgICAgICAgICAgIGlmIChjaGlwID09IFBIWUlEX1ZFTkRPUl9SVEw4MjAxRSkKKwkJICAgIHByaW50ZiAoIkZPUkNFIFJUTDgyMDFFIFBIWSB0byAxMDBNL0RVUExFWCBET05FXG4iKTsJCQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoaXAgPT0gUEhZSURfVkVORE9SX0JST0FEQ09NKQorCQkgICAgcHJpbnRmICgiRk9SQ0UgQnJvYWRjb20gUEhZIHRvIDEwME0vRFVQTEVYIERPTkVcbiIpOwkJCisJCSAgICAKKwl9CQorCQorfQorCitzdGF0aWMgdm9pZCBNQUMxX3Jlc2V0ICh2b2lkKQoreworICAgIE9VVEwoTUFDMV9JT19CQVNFLCBTV19SU1RfYml0LCBNQUNDUl9SRUcpOworICAgIGZvciAoOyAoSU5MKE1BQzFfSU9fQkFTRSwgTUFDQ1JfUkVHICkgJiBTV19SU1RfYml0KSAhPSAwOyApIHt1ZGVsYXkoMTAwMCk7fQorICAgIE9VVEwoTUFDMV9JT19CQVNFLCAwLCBJRVJfUkVHICk7Cit9CisKK3N0YXRpYyBpbnQgc2V0X21hYzFfY29udHJvbF9yZWdpc3RlciAoaW50IENoaXBfSUQpCit7CisJdW5zaWduZWQgbG9uZwlNQUNfQ1JfUmVnaXN0ZXIgPSAwOworCWludCAgICBQSFlfUmVhZHkgPSAxOworCXUxNiAgICBQSFlfU3RhdHVzLCBQSFlfU3BlZWQsIFBIWV9EdXBsZXgsIEFkdmVydGlzZSwgTGlua19QYXJ0bmVyOworCisJTUFDX0NSX1JlZ2lzdGVyID0gU1BFRURfMTAwTV9NT0RFX2JpdCB8IFJYX0FMTEFEUl9iaXQgfCBGVUxMRFVQX2JpdCB8IFJYTUFDX0VOX2JpdCB8IFJYRE1BX0VOX2JpdCB8IFRYTUFDX0VOX2JpdCB8IFRYRE1BX0VOX2JpdCB8IENSQ19BUERfYml0OworCisJaWYgKCAoQ2hpcF9JRCA9PSBQSFlJRF9WRU5ET1JfQlJPQURDT00pIHx8IChDaGlwX0lEID09IFBIWUlEX1ZFTkRPUl9SVEw4MjAxRSkpIHsKKwkJQWR2ZXJ0aXNlID0gcGh5X3JlYWRfcmVnaXN0ZXIgKDB4MDQsIDApOworCQlMaW5rX1BhcnRuZXIgPSBwaHlfcmVhZF9yZWdpc3RlciAoMHgwNSwgMCk7CisJCUFkdmVydGlzZSA9IChBZHZlcnRpc2UgJiBQSFlfU1BFRURfRFVQTEVYX01BU0spOworCQlMaW5rX1BhcnRuZXIgPSAoTGlua19QYXJ0bmVyICYgUEhZX1NQRUVEX0RVUExFWF9NQVNLKTsKKwkJaWYgKChBZHZlcnRpc2UgJiBMaW5rX1BhcnRuZXIpICYgUEhZXzEwME1fRFVQTEVYKSB7CisJCQlNQUNfQ1JfUmVnaXN0ZXIgfD0gU1BFRURfMTAwTV9NT0RFX2JpdDsKKwkJCU1BQ19DUl9SZWdpc3RlciB8PSBGVUxMRFVQX2JpdDsKKwkJfQorCQllbHNlIGlmICgoQWR2ZXJ0aXNlICYgTGlua19QYXJ0bmVyKSAmIFBIWV8xMDBNX0hBTEYpIHsKKwkJCU1BQ19DUl9SZWdpc3RlciB8PSBTUEVFRF8xMDBNX01PREVfYml0OworCQkJTUFDX0NSX1JlZ2lzdGVyICY9IH5GVUxMRFVQX2JpdDsKKwkJfQorCQllbHNlIGlmICgoQWR2ZXJ0aXNlICYgTGlua19QYXJ0bmVyKSAmIFBIWV8xME1fRFVQTEVYKSB7CisJCQlNQUNfQ1JfUmVnaXN0ZXIgJj0gflNQRUVEXzEwME1fTU9ERV9iaXQ7CisJCQlNQUNfQ1JfUmVnaXN0ZXIgfD0gRlVMTERVUF9iaXQ7CisJCX0KKwkJZWxzZSBpZiAoKEFkdmVydGlzZSAmIExpbmtfUGFydG5lcikgJiBQSFlfMTBNX0hBTEYpIHsKKwkJCU1BQ19DUl9SZWdpc3RlciAmPSB+U1BFRURfMTAwTV9NT0RFX2JpdDsKKwkJCU1BQ19DUl9SZWdpc3RlciAmPSB+RlVMTERVUF9iaXQ7CisJCX0KKwl9CisJZWxzZSBpZiAoQ2hpcF9JRCA9PSBQSFlJRF9WRU5ET1JfTUFSVkVMTCkgeworCisJCVBIWV9SZWFkeSA9IHdhaXRfbGlua19yZXNvbHZlICgpOworCisJCWlmIChQSFlfUmVhZHkgPT0gMSkgeworCQkJUEhZX1N0YXR1cyA9IHBoeV9yZWFkX3JlZ2lzdGVyICgweDExLCAwKTsKKwkJCVBIWV9TcGVlZCA9IChQSFlfU3RhdHVzICYgUEhZX1NQRUVEX01BU0spID4+IDE0OworCQkJUEhZX0R1cGxleCA9IChQSFlfU3RhdHVzICYgUEhZX0RVUExFWF9NQVNLKSA+PiAxMzsKKworCQkJaWYgKFBIWV9TcGVlZCA9PSBTUEVFRF8xMDAwTSkgeworCQkJCU1BQ19DUl9SZWdpc3RlciB8PSBHTUFDX01PREVfYml0OworICAgICAgICAgICAgICAgIAl9CisJCQllbHNlIHsKKwkJCQlNQUNfQ1JfUmVnaXN0ZXIgJj0gfkdNQUNfTU9ERV9iaXQ7CisJCQkJaWYgKFBIWV9TcGVlZCA9PSBTUEVFRF8xME0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIAkJTUFDX0NSX1JlZ2lzdGVyICY9IH5TUEVFRF8xMDBNX01PREVfYml0OworICAgICAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIAlpZiAoUEhZX0R1cGxleCA9PSBEVVBMRVhfSEFMRikgeworCQkJCU1BQ19DUl9SZWdpc3RlciAmPSB+RlVMTERVUF9iaXQ7CisJCQl9CisJCX0KKwl9CisJT1VUTChNQUMxX0lPX0JBU0UsIE1BQ19DUl9SZWdpc3RlciwgTUFDQ1JfUkVHKTsKKworCXJldHVybiBQSFlfUmVhZHk7Cit9CisKK3N0YXRpYyB2b2lkIHJpbmdfYnVmZmVyX2FsbG9jICh2b2lkKQoreworCXVuc2lnbmVkIGludCBpLCBqOworCisvL1dyaXRlIGRhdGEgaW50byBUWCBidWZmZXIKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IFRYX0JVRkZfU1o7IGorKykgeworCQkJdHhfYnVmZmVyW2ldW2pdID0gaSAqIDQgKyBqOworCQl9CisJfQorLy9Jbml0aWFsaXplIFJYIGJ1ZmZlciB0byAwCisJZm9yIChpID0gMDsgaSA8IE5VTV9SWDsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBSWF9CVUZGX1NaOyBqKyspIHsKKwkJCXJ4X2J1ZmZlcltpXVtqXSA9IDA7CisJCX0KKwl9CisvL1ByZXBhcmUgZGVzY3JpcHRvcgorCWZvciAoaSA9IDA7IGkgPCBOVU1fUlg7IGkrKykgeworCQlyeF9yaW5nW2ldLnN0YXR1cyA9IGNwdV90b19sZTMyKFJYUEtUX1JEWSArIFJYX0JVRkZfU1opOworCQlyeF9yaW5nW2ldLmJ1ZiA9ICgodTMyKSAmcnhfYnVmZmVyW2ldKTsKKwkJcnhfcmluZ1tpXS5yZXNlcnZlZCA9IDA7CisJfQorCWZvciAoaSA9IDA7IGkgPCBOVU1fVFg7IGkrKykgeworCQl0eF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJCXR4X3JpbmdbaV0uZGVzMSA9IDA7CisJCXR4X3JpbmdbaV0uYnVmID0gKCh1MzIpICZ0eF9idWZmZXJbaV0pOworCQl0eF9yaW5nW2ldLnJlc2VydmVkID0gMDsKKwl9CisKKwlyeF9yaW5nW05VTV9SWCAtIDFdLnN0YXR1cyB8PSBjcHVfdG9fbGUzMihFRE9SUik7CisJdHhfcmluZ1tOVU1fVFggLSAxXS5zdGF0dXMgfD0gY3B1X3RvX2xlMzIoRURPVFIpOworCisJT1VUTChNQUMxX0lPX0JBU0UsICgodTMyKSAmdHhfcmluZyksIFRYUl9CQURSX1JFRyk7CisJT1VUTChNQUMxX0lPX0JBU0UsICgodTMyKSAmcnhfcmluZyksIFJYUl9CQURSX1JFRyk7CisJCisJdHhfbmV3ID0gMDsKKwlyeF9uZXcgPSAwOworfQorCitzdGF0aWMgaW50IHBhY2tldF90ZXN0ICh2b2lkKQoreworCXVuc2lnbmVkIGludCByeF9zdGF0dXMsIGxlbmd0aCwgaSwgTG9vcF9Db3VudCA9IDA7CisKKwl0eF9yaW5nW3R4X25ld10uc3RhdHVzIHw9IGNwdV90b19sZTMyKExUUyB8IEZUUyB8IFRYX0JVRkZfU1opOworCXR4X3JpbmdbdHhfbmV3XS5zdGF0dXMgfD0gY3B1X3RvX2xlMzIoVFhETUFfT1dOKTsKKwlPVVRMKE1BQzFfSU9fQkFTRSwgUE9MTF9ERU1BTkQsIFRYUERfUkVHKTsKKworLy9Db21wYXJlIHJlc3VsdAorCWRvIHsKKwkJcnhfc3RhdHVzID0gcnhfcmluZ1tyeF9uZXddLnN0YXR1czsKKwkJTG9vcF9Db3VudCsrOworCX0gd2hpbGUgKCEocnhfc3RhdHVzICYgUlhQS1RfU1RBVFVTKSAmJiAoTG9vcF9Db3VudCA8IFBIWV9MT09QKSk7CisJaWYgKHJ4X3N0YXR1cyAmIChSWF9FUlIgfCBDUkNfRVJSIHwgRlRMIHwgUlVOVCB8IFJYX09ERF9OQikpIHsKKwkJLyogVGhlcmUgd2FzIGFuIGVycm9yLiovCisJCXByaW50ZigiUlggZXJyb3Igc3RhdHVzID0gMHglMDhYXG4iLCByeF9zdGF0dXMpOworCQlyZXR1cm4gUEFDS0VUX1RFU1RfRkFJTDsKKwl9IGVsc2UgeworCQlsZW5ndGggPSAocnhfc3RhdHVzICYgQllURV9DT1VOVF9NQVNLKTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX0JVRkZfU1ogLyA0OyBpKyspIHsKKwkJCWlmIChyeF9idWZmZXJbcnhfbmV3XVtpXSAhPSB0eF9idWZmZXJbdHhfbmV3XVtpXSkgeworCQkJCXByaW50ZiAoIkVSUk9SIGF0IHBhY2tldCAlZCwgYWRkcmVzcyAleFxuIiwgcnhfbmV3LCBpKTsKKwkJCQlwcmludGYgKCJHb2xkID0gJTh4LCBSZWFsID0gJTh4XG4iLCB0eF9idWZmZXJbdHhfbmV3XVtpXSwgcnhfYnVmZmVyW3J4X25ld11baV0pOworCQkJCXJldHVybiBQQUNLRVRfVEVTVF9GQUlMOworCQkJfQorCQl9CisJfQorICAgIAl0eF9uZXcgPSAodHhfbmV3ICsgMSkgJSBOVU1fVFg7CisJcnhfbmV3ID0gKHJ4X25ldyArIDEpICUgTlVNX1JYOworCisJcmV0dXJuIFRFU1RfUEFTUzsKK30KKworc3RhdGljIGludCBwYWNrZXRfbGVuZ3RoX3Rlc3QgKGludCBwYWNrZXRfbGVuZ3RoKQoreworCXVuc2lnbmVkIGludCByeF9zdGF0dXMsIGxlbmd0aCwgaSwgTG9vcF9Db3VudCA9IDA7CisKKwl0eF9yaW5nW3R4X25ld10uc3RhdHVzICY9ICh+KEJZVEVfQ09VTlRfTUFTSykpOworCXR4X3JpbmdbdHhfbmV3XS5zdGF0dXMgfD0gY3B1X3RvX2xlMzIoTFRTIHwgRlRTIHwgcGFja2V0X2xlbmd0aCk7CisJdHhfcmluZ1t0eF9uZXddLnN0YXR1cyB8PSBjcHVfdG9fbGUzMihUWERNQV9PV04pOworCU9VVEwoTUFDMV9JT19CQVNFLCBQT0xMX0RFTUFORCwgVFhQRF9SRUcpOworCisvL0NvbXBhcmUgcmVzdWx0CisJZG8geworCQlyeF9zdGF0dXMgPSByeF9yaW5nW3J4X25ld10uc3RhdHVzOworCQlMb29wX0NvdW50Kys7CisJfSB3aGlsZSAoIShyeF9zdGF0dXMgJiBSWFBLVF9TVEFUVVMpICYmIChMb29wX0NvdW50IDwgUEhZX0xPT1ApKTsKKwlpZiAocnhfc3RhdHVzICYgKFJYX0VSUiB8IENSQ19FUlIgfCBGVEwgfCBSVU5UIHwgUlhfT0REX05CKSkgeworCQkvKiBUaGVyZSB3YXMgYW4gZXJyb3IuKi8KKwkJcHJpbnRmKCJSWCBlcnJvciBzdGF0dXMgPSAweCUwOFhcbiIsIHJ4X3N0YXR1cyk7CisJCXJldHVybiBQQUNLRVRfTEVOR1RIX1RFU1RfRkFJTDsKKwl9IGVsc2UgeworCQlsZW5ndGggPSAocnhfc3RhdHVzICYgQllURV9DT1VOVF9NQVNLKSAtIDQ7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCAhPSBwYWNrZXRfbGVuZ3RoKSB7CisJCQlwcmludGYgKCJSZWNlaXZlZCBMZW5ndGggRVJST1IuIEdvbGQgPSAlZCwgRmFpbCA9ICVkXG4iLHBhY2tldF9sZW5ndGgsIGxlbmd0aCk7CisJCQlwcmludGYgKCJyeF9uZXcgPSAlZCwgdHhfbmV3ID0gJWRcbiIsIHJ4X25ldywgdHhfbmV3KTsKKwkJCXJldHVybiBQQUNLRVRfTEVOR1RIX1RFU1RfRkFJTDsKKyAgICAgICAgICAgICAgICB9CisJCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkgICAgaWYgKHJ4X2J1ZmZlcltyeF9uZXddW2ldICE9IHR4X2J1ZmZlclt0eF9uZXddW2ldKSB7CisJCSAgICAJcHJpbnRmICgiRVJST1IgYXQgcGFja2V0ICVkLCBhZGRyZXNzICV4XG4iLCByeF9uZXcsIGkpOworCQkgICAgCXByaW50ZiAoIkdvbGQgPSAlOHgsIFJlYWwgPSAlOHhcbiIsIHR4X2J1ZmZlclt0eF9uZXddW2ldLCByeF9idWZmZXJbcnhfbmV3XVtpXSk7CisJCSAgICAJcmV0dXJuIFBBQ0tFVF9MRU5HVEhfVEVTVF9GQUlMOworCQkgICAgfQorCQl9CisJfQorCXJ4X3JpbmdbcnhfbmV3XS5zdGF0dXMgJj0gKH4oUlhQS1RfU1RBVFVTKSk7CisgICAgCXR4X25ldyA9ICh0eF9uZXcgKyAxKSAlIE5VTV9UWDsKKwlyeF9uZXcgPSAocnhfbmV3ICsgMSkgJSBOVU1fUlg7CisKKwlyZXR1cm4gVEVTVF9QQVNTOworfQorCitzdGF0aWMgaW50IE1BQzFfaW5pdCAoaW50IGlkKQoreworCWludCBwaHlfc3RhdHVzID0gMDsKKworCU1BQzFfcmVzZXQgKCk7CisJcGh5X3N0YXR1cyA9IHNldF9tYWMxX2NvbnRyb2xfcmVnaXN0ZXIgKGlkKTsKKyAgICAgICAJcmluZ19idWZmZXJfYWxsb2MgKCk7CisgICAgICAgCQorICAgICAgIAlyZXR1cm4gcGh5X3N0YXR1czsKK30KKworaW50IGRvX21hY3Rlc3QgKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHBoeV9pZCwgaTsKKwlpbnQgdGVzdF9yZXN1bHQgPSAwLCBwaHlfc3RhdHVzID0gMDsKKworCVNDVV9NQUMxX0VuYWJsZSgpOworCXBoeV9pZCA9ICgocGh5X3JlYWRfcmVnaXN0ZXIgKDB4MDIsIDApIDw8IDE2KSArIHBoeV9yZWFkX3JlZ2lzdGVyICgweDAzLCAwKSkgJiBQSFlJRF9WRU5ET1JfTUFTSzsKKwlpZiAocGh5X2lkID09IFBIWUlEX1ZFTkRPUl9NQVJWRUxMKSB7CisgICAgICAgIAlwcmludGYgKCJQSFkgREVURUNURUQgLS0tLS0tPiBNQVJWRUxMXG4iKTsKKworICAgICAgICAJc2V0X3BoeV9zcGVlZCAocGh5X2lkLCBQSFlfU1BFRURfMUcsIERVUExFWF9GVUxMKTsKKyAgICAgICAgCWlmICgocGh5X3N0YXR1cyA9IE1BQzFfaW5pdCAocGh5X2lkKSkgIT0gMCkgeworCSAgICAgICAgCWZvciAoaSA9IDA7IGkgPCBOVU1fVFg7IGkrKykgeworCQkJCXRlc3RfcmVzdWx0IHw9IHBhY2tldF90ZXN0ICgpOworCQkJCWlmICh0ZXN0X3Jlc3VsdCAhPSAwKQorCQkJCQlicmVhazsKKyAgICAgICAgCQl9CisgICAgICAgIAl9CisJCWVsc2UgaWYgKHBoeV9zdGF0dXMgPT0gMCkgeworCQkJcHJpbnRmICgiUEhZIEZBSUw6IFBsZWFzZSBDaGVjayBJZiB5b3UgYXJlIHVzaW5nIExPT1AgQkFDSyBDb25uZWN0b3JcbiIpOworCQkJdGVzdF9yZXN1bHQgPSAzOworCQkJcmV0dXJuCXRlc3RfcmVzdWx0OworCQl9CisgICAgICAgIAlpZiAoKHBoeV9zdGF0dXMgPSBNQUMxX2luaXQgKHBoeV9pZCkpICE9IDApIHsKKyAgICAgICAgCQlmb3IgKGkgPSA2MDsgaSA8IFRYX0JVRkZfU1o7IGkrKykgeworCQkJCXRlc3RfcmVzdWx0IHw9IHBhY2tldF9sZW5ndGhfdGVzdCAoaSk7CisJCQkJaWYgKHRlc3RfcmVzdWx0ICE9IDApCisJCQkJCWJyZWFrOworICAgICAgICAJCX0KKyAgICAgICAgCX0KKwkJZWxzZSBpZiAocGh5X3N0YXR1cyA9PSAwKSB7CisJCQlwcmludGYgKCJQSFkgRkFJTDogUGxlYXNlIENoZWNrIElmIHlvdSBhcmUgdXNpbmcgTE9PUCBCQUNLIENvbm5lY3RvclxuIik7CisJCQl0ZXN0X3Jlc3VsdCA9IDM7CisJCQlyZXR1cm4JdGVzdF9yZXN1bHQ7CisJCX0KKyAgICAgICAgCXNldF9waHlfc3BlZWQgKHBoeV9pZCwgUEhZX1NQRUVEXzEwME0sIERVUExFWF9GVUxMKTsKKyAgICAgICAgCWlmICgocGh5X3N0YXR1cyA9IE1BQzFfaW5pdCAocGh5X2lkKSkgIT0gMCkgeworICAgICAgICAJCWZvciAoaSA9IDA7IGkgPCBOVU1fVFg7IGkrKykgeworCQkJCXRlc3RfcmVzdWx0IHw9IHBhY2tldF90ZXN0ICgpOworCQkJCWlmICh0ZXN0X3Jlc3VsdCAhPSAwKQorCQkJCQlicmVhazsKKyAgICAgICAgCQl9CisgICAgICAgIAl9CisJCWVsc2UgaWYgKHBoeV9zdGF0dXMgPT0gMCkgeworCQkJcHJpbnRmICgiUEhZIEZBSUw6IFBsZWFzZSBDaGVjayBJZiB5b3UgYXJlIHVzaW5nIExPT1AgQkFDSyBDb25uZWN0b3JcbiIpOworCQkJdGVzdF9yZXN1bHQgPSAzOworCQkJcmV0dXJuCXRlc3RfcmVzdWx0OworCQl9CisKKyAgICAgICAgCWlmICgocGh5X3N0YXR1cyA9IE1BQzFfaW5pdCAocGh5X2lkKSkgIT0gMCkgeworICAgICAgICAJCWZvciAoaSA9IDYwOyBpIDwgVFhfQlVGRl9TWjsgaSsrKSB7CisJCQkJdGVzdF9yZXN1bHQgfD0gcGFja2V0X2xlbmd0aF90ZXN0IChpKTsKKyAgICAgICAgCQkJaWYgKHRlc3RfcmVzdWx0ICE9IDApCisJICAgICAgICAJICAgIAkJYnJlYWs7CisgICAgICAgIAkJfQorICAgICAgICAJfQorCQllbHNlIGlmIChwaHlfc3RhdHVzID09IDApIHsKKwkJCXByaW50ZiAoIlBIWSBGQUlMOiBQbGVhc2UgQ2hlY2sgSWYgeW91IGFyZSB1c2luZyBMT09QIEJBQ0sgQ29ubmVjdG9yXG4iKTsKKwkJCXRlc3RfcmVzdWx0ID0gMzsKKwkJCXJldHVybgl0ZXN0X3Jlc3VsdDsKKwkJfQorICAgICAgICB9CisJZWxzZSBpZiAoIChwaHlfaWQgPT0gUEhZSURfVkVORE9SX1JUTDgyMDFFKSB8fCAocGh5X2lkID09IFBIWUlEX1ZFTkRPUl9CUk9BRENPTSkgKXsKKwkJCisgICAgICAgIAlpZiAocGh5X2lkID09IFBIWUlEX1ZFTkRPUl9SVEw4MjAxRSkKKyAgICAgICAgCSAgICBwcmludGYgKCJQSFkgREVURUNURUQgLS0tLS0tPiBSVEwgODIwMUUgXG4iKTsKKyAgICAgICAgCWVsc2UgaWYgKHBoeV9pZCA9PSBQSFlJRF9WRU5ET1JfQlJPQURDT00pCisgICAgICAgIAkgICAgcHJpbnRmICgiUEhZIERFVEVDVEVEIC0tLS0tLT4gQnJvYWRjb20gXG4iKTsKKyAgICAgICAgCQorICAgICAgICAJc2V0X3BoeV9zcGVlZCAocGh5X2lkLCBQSFlfU1BFRURfMTAwTSwgRFVQTEVYX0ZVTEwpOworICAgICAgICAJaWYgKChwaHlfc3RhdHVzID0gTUFDMV9pbml0IChwaHlfaWQpKSAhPSAwKSB7CisgICAgICAgIAkJZm9yIChpID0gMDsgaSA8IE5VTV9UWDsgaSsrKSB7CisJCQkJdGVzdF9yZXN1bHQgfD0gcGFja2V0X3Rlc3QgKCk7CisJCQkJaWYgKHRlc3RfcmVzdWx0ICE9IDApCisJCQkJCWJyZWFrOworICAgICAgICAJCX0KKyAgICAgICAgCX0KKwkJZWxzZSBpZiAocGh5X3N0YXR1cyA9PSAwKSB7CisJCQlwcmludGYgKCJQSFkgRkFJTDogUGxlYXNlIENoZWNrIElmIHlvdSBhcmUgdXNpbmcgTE9PUCBCQUNLIENvbm5lY3RvclxuIik7CisJCQl0ZXN0X3Jlc3VsdCA9IDM7CisJCQlyZXR1cm4JdGVzdF9yZXN1bHQ7CisJCX0KKworICAgICAgICAJaWYgKChwaHlfc3RhdHVzID0gTUFDMV9pbml0IChwaHlfaWQpKSAhPSAwKSB7CisgICAgICAgIAkJZm9yIChpID0gNjA7IGkgPCBUWF9CVUZGX1NaOyBpKyspIHsKKwkJCQl0ZXN0X3Jlc3VsdCB8PSBwYWNrZXRfbGVuZ3RoX3Rlc3QgKGkpOworICAgICAgICAJCQlpZiAodGVzdF9yZXN1bHQgIT0gMCkKKwkgICAgICAgIAkgICAgCQlicmVhazsKKyAgICAgICAgCQl9CisgICAgICAgIAl9CisJCWVsc2UgaWYgKHBoeV9zdGF0dXMgPT0gMCkgeworCQkJcHJpbnRmICgiUEhZIEZBSUw6IFBsZWFzZSBDaGVjayBJZiB5b3UgYXJlIHVzaW5nIExPT1AgQkFDSyBDb25uZWN0b3JcbiIpOworCQkJdGVzdF9yZXN1bHQgPSAzOworCQkJcmV0dXJuCXRlc3RfcmVzdWx0OworCQl9ICAgICAgICAJCisgICAgICAgIH0JCisgICAgICAgICAgCisJaWYgKChwaHlfc3RhdHVzID09IDApICYmICh0ZXN0X3Jlc3VsdCAmIFBBQ0tFVF9URVNUX0ZBSUwpKSB7CisJCXByaW50ZiAoIlBhY2tldCBUZXN0IEZBSUwgIVxuIik7CisJfQorCWVsc2UgaWYgKChwaHlfc3RhdHVzID09IDApICYmICh0ZXN0X3Jlc3VsdCAmIFBBQ0tFVF9MRU5HVEhfVEVTVF9GQUlMKSkgeworCQlwcmludGYgKCJQYWNrZXQgTGVuZ3RoIFRlc3QgRkFJTCAhXG4iKTsKKwl9CisKKwlyZXR1cm4gdGVzdF9yZXN1bHQ7CisJCit9CisKKyNlbmRpZiAvKiBDT05GSUdfU0xUICovCmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjMwMC9tYWN0ZXN0LmggYi9ib2FyZC9hc3BlZWQvYXN0MjMwMC9tYWN0ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTc1YjdiYgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL21hY3Rlc3QuaApAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisvKiBNQUNUZXN0LmggKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICBHZW5lcmFsIERlZmluaXRpb24KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIE1BQzFfSU9fQkFTRQkJMHgxRTY2MDAwMAorI2RlZmluZSBQSFlfTE9PUAkJMTAwMDAwCisjZGVmaW5lIE5VTV9SWAkJCTQ4CisjZGVmaW5lIE5VTV9UWAkJCTQ4CisjZGVmaW5lIFJYX0JVRkZfU1oJCTE1MTQKKyNkZWZpbmUgVFhfQlVGRl9TWgkJMTUxNAorI2RlZmluZSBUT1VUX0xPT1AJCTEwMDAwMDAKKyNkZWZpbmUgRVRIX0FMRU4JCTYKKyNkZWZpbmUgUE9MTF9ERU1BTkQJCTEKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgIE1BQyBSZWdpc3RlciBJbmRleAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgSVNSX1JFRwkJCTB4MDAJCQkJLy8gaW50ZXJydXBzIHN0YXR1cyByZWdpc3RlcgorI2RlZmluZSBJRVJfUkVHCQkJMHgwNAkJCQkvLyBpbnRlcnJ1cHQgbWFrcyByZWdpc3RlcgorI2RlZmluZSBNQUNfTUFEUl9SRUcJCTB4MDgJCQkJLy8gTUFDIGFkZHJlc3MgKE1vc3Qgc2lnbmlmaWNhbnQpCisjZGVmaW5lIE1BQ19MQURSX1JFRwkJMHgwYwkJCQkvLyBNQUMgYWRkcmVzcyAoTGVhc3Qgc2lnbmlmaWNhbnQpCisjZGVmaW5lIE1BSFQwX1JFRwkJMHgxMAkJCQkvLyBNdWx0aWNhc3QgQWRkcmVzcyBIYXNoIFRhYmxlIDAgcmVnaXN0ZXIKKyNkZWZpbmUgTUFIVDFfUkVHCQkweDE0CQkJCS8vIE11bHRpY2FzdCBBZGRyZXNzIEhhc2ggVGFibGUgMSByZWdpc3RlcgorI2RlZmluZSBUWFBEX1JFRwkJMHgxOAkJCQkvLyBUcmFuc21pdCBQb2xsIERlbWFuZCByZWdpc3RlcgorI2RlZmluZSBSWFBEX1JFRwkJMHgxYwkJCQkvLyBSZWNlaXZlIFBvbGwgRGVtYW5kIHJlZ2lzdGVyCisjZGVmaW5lIFRYUl9CQURSX1JFRwkJMHgyMAkJCQkvLyBUcmFuc21pdCBSaW5nIEJhc2UgQWRkcmVzcyByZWdpc3RlcgorI2RlZmluZSBSWFJfQkFEUl9SRUcJCTB4MjQJCQkJLy8gUmVjZWl2ZSBSaW5nIEJhc2UgQWRkcmVzcyByZWdpc3RlcgorI2RlZmluZSBIUFRYUERfUkVHCQkweDI4CisjZGVmaW5lIEhQVFhSX0JBRFJfUkVHCQkweDJjCisjZGVmaW5lIElUQ19SRUcJCQkweDMwCQkJCS8vIGludGVycnVwdCB0aW1lciBjb250cm9sIHJlZ2lzdGVyCisjZGVmaW5lIEFQVENfUkVHCQkweDM0CQkJCS8vIEF1dG9tYXRpYyBQb2xsaW5nIFRpbWVyIGNvbnRyb2wgcmVnaXN0ZXIKKyNkZWZpbmUgREJMQUNfUkVHCQkweDM4CQkJCS8vIERNQSBCdXJzdCBMZW5ndGggYW5kIEFyYml0cmF0aW9uIGNvbnRyb2wgcmVnaXN0ZXIKKyNkZWZpbmUgRE1BRklGT1NfUkVHCQkweDNjCisjZGVmaW5lIEZFQVJfUkVHCQkweDQ0CisjZGVmaW5lIFRQQUZDUl9SRUcJCTB4NDgKKyNkZWZpbmUgUkJTUl9SRUcJCTB4NGMKKyNkZWZpbmUgTUFDQ1JfUkVHCQkweDUwCQkJCS8vIE1BQyBjb250cm9sIHJlZ2lzdGVyCisjZGVmaW5lIE1BQ1NSX1JFRwkJMHg1NAkJCQkvLyBNQUMgc3RhdHVzIHJlZ2lzdGVyCisjZGVmaW5lIFBIWUNSX1JFRwkJMHg2MAkJCQkvLyBQSFkgY29udHJvbCByZWdpc3RlcgorI2RlZmluZSBQSFlEQVRBX1JFRwkJMHg2NAkJCQkvLyBQSFkgV3JpdGUgRGF0YSByZWdpc3RlcgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8JCVBIWUNSX1JFRworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgUEhZX1JFX0FVVE9fYml0CQkJKDFVTDw8OSkKKyNkZWZpbmUgUEhZX1JFQURfYml0CQkJKDFVTDw8MjYpCisjZGVmaW5lIFBIWV9XUklURV9iaXQJCQkoMVVMPDwyNykKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLwkJUEhZQ1JfUkVHIAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgUEhZX0FVVE9fT0tfYml0CQkJKDFVTDw8NSkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLwkJUEhZIElOVF9TVEFUX1JFRyAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIFBIWV9TUEVFRF9DSEdfYml0CQkoMVVMPDwxNCkKKyNkZWZpbmUgUEhZX0RVUExFWF9DSEdfYml0CQkoMVVMPDwxMykKKyNkZWZpbmUgUEhZX0xJTktfQ0hHX2JpdAkJKDFVTDw8MTApCisjZGVmaW5lIFBIWV9BVVRPX0NPTVBfYml0CQkoMVVMPDwxMSkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLwkJUEhZIFNQRV9TVEFUX1JFRyAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIFBIWV9SRVNPTFZFRF9iaXQJCSgxVUw8PDExKQorI2RlZmluZSBQSFlfTElOS19iaXQJCQkoMVVMPDwxMCkKKyNkZWZpbmUgUEhZX1NQRUVEX21hc2sJCQkweEMwMDAKKyNkZWZpbmUgUEhZX1NQRUVEXzEwTQkJCTB4MAorI2RlZmluZSBQSFlfU1BFRURfMTAwTQkJCTB4MQorI2RlZmluZSBQSFlfU1BFRURfMUcJCQkweDIKKyNkZWZpbmUgUEhZX0RVUExFWF9tYXNrICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgUEhZX1NQRUVEX0RVUExFWF9NQVNLICAgICAgICAgICAweDAxRTAKKyNkZWZpbmUgUEhZXzEwME1fRFVQTEVYICAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgUEhZXzEwME1fSEFMRiAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgUEhZXzEwTV9EVVBMRVggICAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgUEhZXzEwTV9IQUxGICAgICAgICAgICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgTElOS19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIFBIWUlEX1ZFTkRPUl9NQVNLCQkweGZmZmZmYzAwCisjZGVmaW5lIFBIWUlEX1ZFTkRPUl9NQVJWRUxMCQkweDAxNDEwYzAwCisjZGVmaW5lIFBIWUlEX1ZFTkRPUl9CUk9BRENPTQkJMHgwMDQwNjAwMAorI2RlZmluZSBQSFlJRF9WRU5ET1JfUlRMODIwMUUJCTB4MDAxY2M4MDAKKyNkZWZpbmUgRFVQTEVYX0ZVTEwJCQkweDAxCisjZGVmaW5lIERVUExFWF9IQUxGCQkJMHgwMAorCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCQlNQUNDUl9SRUcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgU1dfUlNUX2JpdAkJKDFVTDw8MzEpCQkJCS8vIHNvZnR3YXJlIHJlc2V0LworI2RlZmluZSBESVJQQVRIX2JpdAkJKDFVTDw8MjEpCisjZGVmaW5lIFJYX0lQQ1NfRkFJTF9iaXQJKDFVTDw8MjApCisjZGVmaW5lIFNQRUVEXzEwME1fTU9ERV9iaXQJCSgxVUw8PDE5KQorI2RlZmluZSBSWF9VRFBDU19GQUlMX2JpdAkoMVVMPDwxOCkKKyNkZWZpbmUgUlhfQlJPQURQS1RfYml0CQkoMVVMPDwxNykJCQkJLy8gUmVjZWl2aW5nIGJyb2FkY2FzdCBwYWNrZXQKKyNkZWZpbmUgUlhfTVVMVElQS1RfYml0CQkoMVVMPDwxNikJCQkJLy8gcmVjZWl2aW5nIG11bHRpY2FzdCBwYWNrZXQKKyNkZWZpbmUgUlhfSFRfRU5fYml0CQkoMVVMPDwxNSkKKyNkZWZpbmUgUlhfQUxMQURSX2JpdAkJKDFVTDw8MTQpCQkJCS8vIG5vdCBjaGVjayBpbmNvbWluZyBwYWNrZXQncyBkZXN0aW5hdGlvbiBhZGRyZXNzCisjZGVmaW5lIEpVTUJPX0xGX2JpdAkJKDFVTDw8MTMpCisjZGVmaW5lIFJYX1JVTlRfYml0CQkoMVVMPDwxMikJCQkJLy8gU3RvcmUgaW5jb21pbmcgcGFja2V0IGV2ZW4gaXRzIGxlbmd0aCBpcyBsZXMgdGhhbiA2NCBieXRlCisjZGVmaW5lIENSQ19DSEtfYml0CQkoMVVMPDwxMSkKKyNkZWZpbmUgQ1JDX0FQRF9iaXQJCSgxVUw8PDEwKQkJCQkvLyBhcHBlbmQgY3JjIHRvIHRyYW5zbWl0IHBhY2tldAorI2RlZmluZSBHTUFDX01PREVfYml0CQkoMVVMPDw5KQorI2RlZmluZSBGVUxMRFVQX2JpdAkJKDFVTDw8OCkJCQkJLy8gZnVsbCBkdXBsZXgKKyNkZWZpbmUgRU5SWF9JTl9IQUxGVFhfYml0CSgxVUw8PDcpCisjZGVmaW5lIExPT1BfRU5fYml0CQkoMVVMPDw2KQkJCQkvLyBJbnRlcm5hbCBsb29wLWJhY2sKKyNkZWZpbmUgSFBUWFJfRU5fYml0CQkoMVVMPDw1KQorI2RlZmluZSBSRU1PVkVfVkxBTl9iaXQJCSgxVUw8PDQpCisjZGVmaW5lIFJYTUFDX0VOX2JpdAkJKDFVTDw8MykJCQkJLy8gcmVjZWl2ZXIgZW5hYmxlCisjZGVmaW5lIFRYTUFDX0VOX2JpdAkJKDFVTDw8MikJCQkJLy8gdHJhbnNtaXR0ZXIgZW5hYmxlCisjZGVmaW5lIFJYRE1BX0VOX2JpdAkJKDFVTDw8MSkJCQkJLy8gZW5hYmxlIERNQSByZWNlaXZpbmcgY2hhbm5lbAorI2RlZmluZSBUWERNQV9FTl9iaXQJCSgxVUw8PDApCQkJCS8vIGVuYWJsZSBETUEgdHJhbnNtaXR0aW5nIGNoYW5uZWwKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8JCVNDVV9SRUcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lICBTQ1VfQkFTRQkJCTB4MUU2RTIwMDAKKyNkZWZpbmUgIFNDVV9QUk9URUNUX0tFWV9SRUcgICAgICAgICAgICAweDAKKyNkZWZpbmUgIFNDVV9QUk9UX0tFWV9NQUdJQyAgICAgICAgICAgICAweDE2ODhhOGE4CisjZGVmaW5lICBTQ1VfUkVTRVRfQ09OVFJPTF9SRUcgICAgICAgICAgMHgwNAorI2RlZmluZSAgU0NVX1JFU0VUX01BQzEgICAgICAgICAgICAgICAgICgxdSA8PCAxMSkKKyNkZWZpbmUgIFNDVV9SRVNFVF9NQUMyICAgICAgICAgICAgICAgICAoMXUgPDwgMTIpCisjZGVmaW5lICBTQ1VfSEFSRFdBUkVfVFJBUFBJTkdfUkVHICAgICAgMHg3MAorI2RlZmluZSAgU0NVX0hUX01BQ19JTlRGX0xTQklUICAgICAgICAgIDYKKyNkZWZpbmUgIFNDVV9IVF9NQUNfSU5URVJGQUNFICAgICAgICAgICAoMHg3dSA8PCBTQ1VfSFRfTUFDX0lOVEZfTFNCSVQpCisjZGVmaW5lICBNQUNfSU5URl9TSU5HTEVfUE9SVF9NT0RFUyAgICAgKDF1PDwwLypHTUlJKi8gfCAxdTw8My8qTUlJX09OTFkqLyB8IDF1PDw0LypSTUlJX09OTFkqLykKKyNkZWZpbmUgIFNDVV9IVF9NQUNfR01JSSAgICAgICAgICAgICAgICAweDB1CisvLyBNSUkgYW5kIE1JSSBtb2RlCisjZGVmaW5lICBTQ1VfSFRfTUFDX01JSV9NSUkgICAgICAgICAgICAgMHgxdQorI2RlZmluZSAgU0NVX0hUX01BQ19NSUlfT05MWSAgICAgICAgICAgIDB4M3UKKyNkZWZpbmUgIFNDVV9IVF9NQUNfUk1JSV9PTkxZICAgICAgICAgICAweDR1CisjZGVmaW5lICBTQ1VfTVVMVElGVU5DVElPTl9QSU5fUkVHICAgICAgMHg3NAorI2RlZmluZSAgU0NVX01GUF9NQUMyX1BIWUxJTksgICAgICAgICAgICgxdSA8PCAyNikKKyNkZWZpbmUgIFNDVV9NRlBfTUFDMV9QSFlMSU5LICAgICAgICAgICAoMXUgPDwgMjUpCisjZGVmaW5lICBTQ1VfTUZQX01BQzJfTUlJX0lOVEYgICAgICAgICAgKDF1IDw8IDIxKQorI2RlZmluZSAgU0NVX01GUF9NQUMyX01EQ19NRElPICAgICAgICAgICgxdSA8PCAyMCkKKyNkZWZpbmUgIFNDVV9TSUxJQ09OX1JFVklTSU9OX1JFRyAgICAgICAweDdDCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgUEhZIFIvVyBSZWdpc3RlciBCaXQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIE1JSVdSICAgICAgICAgICAgICAgICAgICgxVUw8PDI3KQorI2RlZmluZSBNSUlSRCAgICAgICAgICAgICAgICAgICAoMVVMPDwyNikKKyNkZWZpbmUgTURDX0NZQ1RIUiAgICAgICAgICAgICAgMHgzNAorI2RlZmluZSBQSFlfU1BFRURfTUFTSyAgICAgICAgICAweEMwMDAKKyNkZWZpbmUgUEhZX0RVUExFWF9NQVNLICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFNQRUVEXzEwMDBNICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgU1BFRURfMTAwTSAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBTUEVFRF8xME0gICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIERVUExFWF9GVUxMICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRFVQTEVYX0hBTEYgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBSRVNPTFZFRF9CSVQgICAgICAgICAgICAweDgwMAorCisjZGVmaW5lIFBIWV9TUEVFRF9EVVBMRVhfTUFTSyAgIDB4MDFFMAorI2RlZmluZSBQSFlfMTAwTV9EVVBMRVggICAgICAgICAweDAxMDAKKyNkZWZpbmUgUEhZXzEwME1fSEFMRiAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFBIWV8xME1fRFVQTEVYICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBQSFlfMTBNX0hBTEYgICAgICAgICAgICAweDAwMjAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlc2NyaXB0b3IgYml0cy4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIFRYRE1BX09XTgkweDgwMDAwMDAwCS8qIE93biBCaXQgKi8KKyNkZWZpbmUgUlhQS1RfUkRZICAgICAgIDB4MDAwMDAwMDAgICAgICAKKyNkZWZpbmUgUlhQS1RfU1RBVFVTICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgRURPUlIJCTB4NDAwMDAwMDAJLyogUmVjZWl2ZSBFbmQgT2YgUmluZyAqLworI2RlZmluZSBMUlMJCTB4MTAwMDAwMDAJLyogTGFzdCBEZXNjcmlwdG9yICovCisjZGVmaW5lIFJEX0VTCQkweDAwMDA4MDAwCS8qIEVycm9yIFN1bW1hcnkgKi8KKyNkZWZpbmUgRURPVFIJCTB4NDAwMDAwMDAJLyogVHJhbnNtaXQgRW5kIE9mIFJpbmcgKi8KKyNkZWZpbmUgVF9PV04JCTB4ODAwMDAwMDAJLyogT3duIEJpdCAqLworI2RlZmluZSBMVFMJCTB4MTAwMDAwMDAJLyogTGFzdCBTZWdtZW50ICovCisjZGVmaW5lIEZUUwkJMHgyMDAwMDAwMAkvKiBGaXJzdCBTZWdtZW50ICovCisjZGVmaW5lIENSQ19FUlIgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIFREX0VTCQkweDAwMDA4MDAwCS8qIEVycm9yIFN1bW1hcnkgKi8KKyNkZWZpbmUgVERfU0VUCQkweDA4MDAwMDAwCS8qIFNldHVwIFBhY2tldCAqLworI2RlZmluZSBSWF9FUlIgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBGVEwgICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBSVU5UICAgICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBSWF9PRERfTkIgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBCWVRFX0NPVU5UX01BU0sgMHgwMDAwM0ZGRgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU1BFRUQvRFVQTEVYIFBhcmFtZXRlcnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXR1cm4gU3RhdHVzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBURVNUX1BBU1MJCQkwCisjZGVmaW5lIFBBQ0tFVF9URVNUX0ZBSUwJCTEKKyNkZWZpbmUgUEFDS0VUX0xFTkdUSF9URVNUX0ZBSUwJCTIKKworc3RydWN0ICBtYWNfZGVzYyB7CisJdm9sYXRpbGUgczMyIHN0YXR1czsKKwl1MzIgZGVzMTsKKwl1MzIgcmVzZXJ2ZWQ7CisJdTMyIGJ1ZjsJCit9Oworc3RhdGljIHN0cnVjdCBtYWNfZGVzYyByeF9yaW5nW05VTV9SWF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMzIpKSk7IC8qIFJYIGRlc2NyaXB0b3IgcmluZyAgICAgICAgICovCitzdGF0aWMgc3RydWN0IG1hY19kZXNjIHR4X3JpbmdbTlVNX1RYXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgzMikpKTsgLyogVFggZGVzY3JpcHRvciByaW5nICAgICAgICAgKi8KK3N0YXRpYyBpbnQgcnhfbmV3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUlggZGVzY3JpcHRvciByaW5nIHBvaW50ZXIgKi8KK3N0YXRpYyBpbnQgdHhfbmV3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVFggZGVzY3JpcHRvciByaW5nIHBvaW50ZXIgKi8KK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHJ4X2J1ZmZlcltOVU1fUlhdW1JYX0JVRkZfU1pdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDMyKSkpOyAvKiBSWCBidWZmZXIgICAgICAgICAqLworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgdHhfYnVmZmVyW05VTV9UWF1bVFhfQlVGRl9TWl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMzIpKSk7IC8qIFRYIGJ1ZmZlciAgICAgICAgICovCmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjMwMC9taWN0ZXN0LmMgYi9ib2FyZC9hc3BlZWQvYXN0MjMwMC9taWN0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWIyYjM0MgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL21pY3Rlc3QuYwpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogRGlhZ25vc3RpY3Mgc3VwcG9ydAorICovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPHBvc3QuaD4KKyNpbmNsdWRlICJzbHQuaCIKKworI2lmICgoQ0ZHX0NNRF9TTFQgJiBDRkdfQ01EX01JQ1RFU1QpICYmIGRlZmluZWQoQ09ORklHX1NMVCkpCisjaW5jbHVkZSAibWljdGVzdC5oIgorCitzdGF0aWMgdW5zaWduZWQgY2hhciBjdHJsYnVmW01JQ19NQVhfQ1RSTF07CitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGtzdW1idWZbTUlDX01BWF9DSEtTVU1dOworCit2b2lkIHZJbml0U0NVKHZvaWQpCit7CisgICAgdW5zaWduZWQgbG9uZyB1bERhdGE7CisKKyAgICAqKHVuc2lnbmVkIGxvbmcgKikgKDB4MWU2ZTIwMDApID0gMHgxNjg4QThBODsKKworICAgIHVkZWxheSgxMDApOworCisgICAgdWxEYXRhID0gKih1bnNpZ25lZCBsb25nICopICgweDFlNmUyMDA0KTsKKyAgICB1bERhdGEgJj0gMHhiZmZmZjsKKyAgICAqKHVuc2lnbmVkIGxvbmcgKikgKDB4MWU2ZTIwMDQpID0gdWxEYXRhOworICAgICAgICAgCQorfQorCit2b2lkIHZJbml0TUlDKHZvaWQpCit7CisgICAgdW5zaWduZWQgbG9uZyBpLCBqLCB1bFBhZ2VOdW1iZXI7CisgICAgdW5zaWduZWQgY2hhciAqcGpjdHJsLCAqcGpzdW07CisgICAgCisgICAgdWxQYWdlTnVtYmVyID0gRFJBTVNJWkUgPj4gMTI7CQorCisgICAgcGpjdHJsID0gKHVuc2lnbmVkIGNoYXIgKikobTE2Ynl0ZUFsaWdubWVudCgodW5zaWduZWQgbG9uZykgY3RybGJ1ZikpOworICAgIHBqc3VtID0gKHVuc2lnbmVkIGNoYXIgKikobTE2Ynl0ZUFsaWdubWVudCgodW5zaWduZWQgbG9uZykgY2hrc3VtYnVmKSk7CisgICAgCisgICAgLyogaW5pdCBjdHJsIGJ1ZmZlciAoMmJpdHMgZm9yIG9uZSBwYWdlKSAqLworICAgIGZvciAoaT0wOyBpPCAodWxQYWdlTnVtYmVyLzQpOyBpKyspCisgICAgICAgICoodW5zaWduZWQgY2hhciAqKSAocGpjdHJsICsgaSkgPSBERUZBVUxUX0NUUkw7CisgICAgICAKKyAgICAvKiBpbml0IGNoa3N1bSBidWYgKDRieXRlcyBmb3Igb25lIHBhZ2UpICovCisgICAgZm9yIChpPTA7IGk8dWxQYWdlTnVtYmVyOyBpKyspCisgICAgICAgICoodW5zaWduZWQgbG9uZyAqKSAocGpzdW0gKyBpKjQpID0gREVGQVVMVF9DSEtTVU07CisgICAgCisgICAgKih1bnNpZ25lZCBsb25nICopIChNSUNfQkFTRSArIE1JQ19DVFJMQlVGRl9SRUcpICAgPSAodW5zaWduZWQgbG9uZykgcGpjdHJsOworICAgICoodW5zaWduZWQgbG9uZyAqKSAoTUlDX0JBU0UgKyBNSUNfQ0hLU1VNQlVGX1JFRykgID0gKHVuc2lnbmVkIGxvbmcpIHBqc3VtOworICAgICoodW5zaWduZWQgbG9uZyAqKSAoTUlDX0JBU0UgKyBNSUNfUkFURUNUUkxfUkVHKSAgID0gKHVuc2lnbmVkIGxvbmcpIERFRkFVTFRfUkFURTsKKyAgICAqKHVuc2lnbmVkIGxvbmcgKikgKE1JQ19CQVNFICsgTUlDX0VOR0lORUNUUkxfUkVHKSA9IE1JQ19FTkFCTEVfTUlDIHwgKERSQU1TSVpFIC0gMHgxMDAwKTsKKwkKK30KKwordm9pZCB2RGlzYWJsZU1JQyh2b2lkKQoreworICAgICoodW5zaWduZWQgbG9uZyAqKSAoTUlDX0JBU0UgKyBNSUNfRU5HSU5FQ1RSTF9SRUcpICAgPSBNSUNfUkVTRVRfTUlDOworCQorfQorCitpbnQgZG9fY2hrc3VtKHZvaWQpCit7CisgICAgdW5zaWduZWQgbG9uZyBpLCBqLCBrLCB1bFBhZ2VOdW1iZXI7CisgICAgaW50IFN0YXR1cyA9IDA7CisgICAgdW5zaWduZWQgc2hvcnQgdG1wOworICAgIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgc3VtMSwgc3VtMjsKKyAgICB1bnNpZ25lZCBsb25nIGdvbGRlbnN1bSwgY2hrc3VtOworICAgIHVuc2lnbmVkIGxvbmcgbGVuLCB0bGVuOworICAgIHVuc2lnbmVkIGNoYXIgKnBqc3VtOworCisgICAgdWxQYWdlTnVtYmVyID0gRFJBTVNJWkUgPj4gMTI7CQorICAgIHBqc3VtID0gKHVuc2lnbmVkIGNoYXIgKikobTE2Ynl0ZUFsaWdubWVudCgodW5zaWduZWQgbG9uZykgY2hrc3VtYnVmKSk7CisKKyAgICAvKiBzdGFydCB0ZXN0ICovICAgIAorICAgIGZvciAoaT0wOyBpPHVsUGFnZU51bWJlcjsgaSsrKQorICAgIHsKKyAgICAJCisgICAgCXN1bTEgPSAweGZmZmYsIHN1bTIgPSAweGZmZmY7CisgICAgCWxlbiA9IDB4MDgwMDsKKyAgICAJaiA9IDA7CisgICAgCQorICAgIAl3aGlsZSAobGVuKQorICAgIAl7CisgICAgCSAgICB0bGVuID0gbGVuID4gMzYwID8gMzYwIDogbGVuOworICAgIAkgICAgbGVuIC09IHRsZW47CisgICAgCSAgICBkbyB7CisgICAgCSAgICAgICB0bXAgPSAqKHVuc2lnbmVkIHNob3J0ICopIChEUkFNX0JBU0UgKyAoKGkgPDwgMTIpICsgaikpOwkKKyAgICAgICAgICAgICAgIHN1bTEgKz0gKHVuc2lnbmVkIGxvbmcpIHRtcDsgICAJICAgIAkKKyAgICAJICAgICAgIHN1bTIgKz0gc3VtMTsKKyAgICAJICAgICAgIGorPTI7CisgICAgCSAgICB9IHdoaWxlICgtLXRsZW4pOworICAgIAkgICAgc3VtMSA9IChzdW0xICYgMHhmZmZmKSArIChzdW0xID4+IDE2KTsKKyAgICAJICAgIHN1bTIgPSAoc3VtMiAmIDB4ZmZmZikgKyAoc3VtMiA+PiAxNik7ICAgCSAgICAgICAgCQorICAgIAl9CisgICAgCQorICAgIAlzdW0xID0gKHN1bTEgJiAweGZmZmYpICsgKHN1bTEgPj4gMTYpOworICAgIAlzdW0yID0gKHN1bTIgJiAweGZmZmYpICsgKHN1bTIgPj4gMTYpOworICAgIAkKKyAgICAJZ29sZGVuc3VtID0gKHN1bTIgPDwgMTYpIHwgc3VtMTsKKyAgICAgICAgaz0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgY2hrc3VtID0gKih1bnNpZ25lZCBsb25nICopIChwanN1bSArIGkqNCk7CisgICAgICAgICAgICB1ZGVsYXkoMTAwKTsKKyAgICAgICAgICAgIGsrKzsKKyAgICAJfSB3aGlsZSAoKGNoa3N1bSA9PSAwKSAmJiAoazwxMDAwKSk7CisgICAgCQorICAgIAlpZiAoY2hrc3VtICE9IGdvbGRlbnN1bSkKKyAgICAJeworICAgIAkgICAgICAgIFN0YXR1cyA9IDE7CQorICAgICAgICAgICAgICAgIHByaW50ZigiW0ZBSUxdIE1JQyBDaGtzdW0gRmFpbGVkIGF0IFBhZ2UgJXggXG4iLCBpKTsKKyAgICAJfQorCisgICAgfSAvKiBlbmQgb2YgaSBsb29wICovCisJCQorICAgIHJldHVybiAoU3RhdHVzKTsKKyAgICAJCit9CisKK2ludCBkb19taWN0ZXN0ICh2b2lkKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIEZsYWdzID0gMDsKKworICAgICAgICB2SW5pdFNDVSgpOworICAgICAgICB2SW5pdE1JQygpOworICAgICAgICAKKyAgICAgICAgaWYgKGRvX2Noa3N1bSgpKQorICAgICAgICAgICAgRmxhZ3MgPSAxOworICAgICAgICAgICAgCisgICAgICAgIHZEaXNhYmxlTUlDKCk7CisgICAgICAgIAorCXJldHVybiBGbGFnczsKKwkKK30KKworI2VuZGlmIC8qIENPTkZJR19TTFQgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2FzcGVlZC9hc3QyMzAwL21pY3Rlc3QuaCBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL21pY3Rlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMTRiYjQxCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvbWljdGVzdC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworLyogTWFjcm8gKi8KKyNkZWZpbmUgbTA4Ynl0ZUFsaWdubWVudCh4KQkJKCh4ICsgMHgwMDAwMDAwNykgJiAweEZGRkZGRkY4KQorI2RlZmluZSBtMTZieXRlQWxpZ25tZW50KHgpCQkoKHggKyAweDAwMDAwMDBGKSAmIDB4RkZGRkZGRjApCisjZGVmaW5lIG02NGJ5dGVBbGlnbm1lbnQoeCkJCSgoeCArIDB4MDAwMDAwM0YpICYgMHhGRkZGRkZDMCkKKworLyogT3B0aW9ucyAqLworI2RlZmluZSBNSUNfVEVTVF9QQUdFCQkzMgorI2RlZmluZSBEUkFNU0laRQkJKE1JQ19URVNUX1BBR0UgKiAweDEwMDApCisjZGVmaW5lIE1JQ19NQVhfQ1RSTAkJKE1JQ19URVNUX1BBR0UgLyA0ICsgMTYpCisjZGVmaW5lIE1JQ19NQVhfQ0hLU1VNCQkoTUlDX1RFU1RfUEFHRSAqIDQgKyAxNikKKworLyogRGVmYXVsdCBTZXR0aW5nICovCisjZGVmaW5lIERFRkFVTFRfUkFURQkJMHgwMDAwMDAwMAorI2RlZmluZSBERUZBVUxUX0NUUkwJCTB4RkYKKyNkZWZpbmUgREVGQVVMVF9DSEtTVU0JCTB4MDAwMDAwMDAKKyNkZWZpbmUgREVGQVVMVF9XUklURUJBQ0sJMHgwODg4MDAwMAorCisvKiBSZWcuIERlZmluaXRpb24gKi8KKyNkZWZpbmUgRFJBTV9CQVNFCQkweDQwMDAwMDAwCisjZGVmaW5lIE1JQ19CQVNFCQkweDFlNjQwMDAwCisjZGVmaW5lIE1JQ19DVFJMQlVGRl9SRUcJMHgwMAorI2RlZmluZSBNSUNfQ0hLU1VNQlVGX1JFRwkweDA0CisjZGVmaW5lIE1JQ19SQVRFQ1RSTF9SRUcJMHgwOAorI2RlZmluZSBNSUNfRU5HSU5FQ1RSTF9SRUcJMHgwQworI2RlZmluZSBNSUNfU1RPUFBBR0VfUkVHCTB4MTAKKyNkZWZpbmUgTUlDX1NUQVRVU19SRUcJCTB4MTQKKyNkZWZpbmUgTUlDX1NUQVRVUzFfUkVHCQkweDE4CisjZGVmaW5lIE1JQ19TVEFUVVMyX1JFRwkJMHgxQworCisjZGVmaW5lIE1JQ19SRVNFVF9NSUMJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUlDX0VOQUJMRV9NSUMJCTB4MTAwMDAwMDAKKyNkZWZpbmUgTUlDX01BWFBBR0VfTUFTSwkweDBGRkZGMDAwCisjZGVmaW5lIE1JQ19XUklURUJBQ0tfTUFTSwkweEZGRkYwMDAwCisjZGVmaW5lIE1JQ19TVE9QUEFHRV9NQVNLCTB4MDAwMEZGRkYKKyNkZWZpbmUgTUlDX1BBR0VFUlJPUgkJMHg0MDAwMDAwMAorI2RlZmluZSBNSUNfUEFHRTFFUlJPUgkJMHgxMDAwMDAwMAorI2RlZmluZSBNSUNfUEFHRTJFUlJPUgkJMHgyMDAwMDAwMAorI2RlZmluZSBNSUNfSU5UTUFTSwkJMHgwMDA2MDAwMAorI2RlZmluZSBNSUNfRVJSUEFHRU5PX01BU0sJMHgwMDAwRkZGRgorCisjZGVmaW5lIE1JQ19DVFJMX01BU0sJCTB4MDMKKyNkZWZpbmUgTUlDX0NUUkxfU0tJUAkJMHgwMAorI2RlZmluZSBNSUNfQ1RSTF9DSEsxCQkweDAxCisjZGVmaW5lIE1JQ19DVFJMX0NISzIJCTB4MDIKKyNkZWZpbmUgTUlDX0NUUkxfQ0hLMwkJMHgwMwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDIzMDAvcGNpLmMgYi9ib2FyZC9hc3BlZWQvYXN0MjMwMC9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YjE3NDY2Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvcGNpLmMKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxwY2kuaD4KKworI2lmZGVmIENPTkZJR19QQ0kKKworI2RlZmluZSBQQ0lfQ1NSX0JBU0UJCTB4NjAwMDAwMDAKKyNkZWZpbmUgQVNQRUVEX1BDSV9JT19CQVNFCTB4MDAwMDAwMDAKKyNkZWZpbmUgQVNQRUVEX1BDSV9JT19TSVpFCTB4MDAwMTAwMDAKKyNkZWZpbmUgQVNQRUVEX1BDSV9NRU1fQkFTRQkweDY4MDAwMDAwCisjZGVmaW5lIEFTUEVFRF9QQ0lfTUVNX1NJWkUJMHgxODAwMDAwMAorCisjZGVmaW5lIENTUl9DUlBfQ01EX09GRlNFVAkweDAwCisjZGVmaW5lIENTUl9DUlBfV1JJVEVfT0ZGU0VUICAgIDB4MDQKKyNkZWZpbmUgQ1NSX0NSUF9SRUFEX09GRlNFVAkweDA4CisjZGVmaW5lIENTUl9QQ0lfQUREUl9PRkZTRVQJMHgwQworI2RlZmluZSBDU1JfUENJX0NNRF9PRkZTRVQJMHgxMAorI2RlZmluZSBDU1JfUENJX1dSSVRFX09GRlNFVAkweDE0CisjZGVmaW5lIENTUl9QQ0lfUkVBRF9PRkZTRVQJMHgxOAorI2RlZmluZSBDU1JfUENJX1NUQVRVU19PRkZTRVQJMHgxQworCisjZGVmaW5lIENSUF9BRERSX1JFRwkJKHZvbGF0aWxlIHVsb25nKikgKFBDSV9DU1JfQkFTRSArIENTUl9DUlBfQ01EX09GRlNFVCkKKyNkZWZpbmUgQ1JQX1dSSVRFX1JFRwkJKHZvbGF0aWxlIHVsb25nKikgKFBDSV9DU1JfQkFTRSArIENTUl9DUlBfV1JJVEVfT0ZGU0VUKQorI2RlZmluZSBDUlBfUkVBRF9SRUcJCSh2b2xhdGlsZSB1bG9uZyopIChQQ0lfQ1NSX0JBU0UgKyBDU1JfQ1JQX1JFQURfT0ZGU0VUKQorI2RlZmluZSBQQ0lfQUREUl9SRUcJCSh2b2xhdGlsZSB1bG9uZyopIChQQ0lfQ1NSX0JBU0UgKyBDU1JfUENJX0FERFJfT0ZGU0VUKQorI2RlZmluZSBQQ0lfQ01EX1JFRwkJKHZvbGF0aWxlIHVsb25nKikgKFBDSV9DU1JfQkFTRSArIENTUl9QQ0lfQ01EX09GRlNFVCkKKyNkZWZpbmUgUENJX1dSSVRFX1JFRwkJKHZvbGF0aWxlIHVsb25nKikgKFBDSV9DU1JfQkFTRSArIENTUl9QQ0lfV1JJVEVfT0ZGU0VUKQorI2RlZmluZSBQQ0lfUkVBRF9SRUcJCSh2b2xhdGlsZSB1bG9uZyopIChQQ0lfQ1NSX0JBU0UgKyBDU1JfUENJX1JFQURfT0ZGU0VUKQorCisjZGVmaW5lIFBDSV9DTURfUkVBRAkJMHgwQQorI2RlZmluZSBQQ0lfQ01EX1dSSVRFCQkweDBCCisKKyNkZWZpbmUgUkVTRVRfUENJX1NUQVRVUyAgICAgICAgKih2b2xhdGlsZSB1bG9uZyopIChQQ0lfQ1NSX0JBU0UgKyBDU1JfUENJX1NUQVRVU19PRkZTRVQpID0gMHgwMQorI2RlZmluZSBDSEtfUENJX1NUQVRVUyAgICAgICAgICAoKih2b2xhdGlsZSB1bG9uZyopIChQQ0lfQ1NSX0JBU0UgKyBDU1JfUENJX1NUQVRVU19PRkZTRVQpICYgMHgwMykKKworc3RhdGljIGludCBwY2lfY29uZmlnX2FjY2VzcyAodTggYWNjZXNzX3R5cGUsIHUzMiBkZXYsIHUzMiByZWcsIHUzMiAqIGRhdGEpCit7CisJdTMyIGJ1czsKKwl1MzIgZGV2aWNlOworCXUzMiBmdW5jdGlvbjsKKworCWJ1cyA9ICgoZGV2ICYgMHhmZjAwMDApID4+IDE2KTsKKwlkZXZpY2UgPSAoKGRldiAmIDB4ZjgwMCkgPj4gMTEpOworCWZ1bmN0aW9uID0gKGRldiAmIDB4MDcwMCk7CisKKwlpZiAoYnVzID09IDApIHsKKwkJLy8gVHlwZSAwIENvbmZpZ3VyYXRpb24gCQkKKwkJKlBDSV9BRERSX1JFRyA9ICh1MzIpICgxVUwgPDwgZGV2aWNlIHwgZnVuY3Rpb24gfCAocmVnICYgMHhmYykpOworCX0gZWxzZSB7CisJCS8vIFR5cGUgMSBDb25maWd1cmF0aW9uIAorCQkqUENJX0FERFJfUkVHID0gKHUzMikgKGRldiB8ICgocmVnIC8gNCkgPDwgMikgfCAxKTsKKwl9CisKKyAgICAgICAgUkVTRVRfUENJX1NUQVRVUzsKKyAgICAgICAgCisJaWYgKGFjY2Vzc190eXBlID09IFBDSV9DTURfV1JJVEUpIHsKKwkJKlBDSV9DTURfUkVHID0gKHVsb25nKSBQQ0lfQ01EX1dSSVRFOworCQkqUENJX1dSSVRFX1JFRyA9ICpkYXRhOworCX0gZWxzZSB7CisJCSpQQ0lfQ01EX1JFRyA9ICh1bG9uZykgUENJX0NNRF9SRUFEOwkJCisJCSpkYXRhID0gKlBDSV9SRUFEX1JFRzsKKwl9CisgICAgICAgICAgICAKKwlyZXR1cm4gKENIS19QQ0lfU1RBVFVTKTsKK30KKworc3RhdGljIGludCBhc3BlZWRfcGNpX3JlYWRfY29uZmlnX2J5dGUgKHUzMiBob3NlLCB1MzIgZGV2LCB1MzIgcmVnLCB1OCAqIHZhbCkKK3sKKwl1MzIgZGF0YTsKKworCWlmIChwY2lfY29uZmlnX2FjY2VzcyAoUENJX0NNRF9SRUFELCBkZXYsIHJlZywgJmRhdGEpKSB7CisJCSp2YWwgPSAwOworCQlyZXR1cm4gLTE7CisJfQkKKworCSp2YWwgPSAoZGF0YSA+PiAoKHJlZyAmIDMpIDw8IDMpKSAmIDB4ZmY7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFzcGVlZF9wY2lfcmVhZF9jb25maWdfd29yZCAodTMyIGhvc2UsIHUzMiBkZXYsIHUzMiByZWcsIHUxNiAqIHZhbCkKK3sKKwl1MzIgZGF0YTsKKworCWlmIChyZWcgJiAxKQorCQlyZXR1cm4gLTE7CisKKwlpZiAocGNpX2NvbmZpZ19hY2Nlc3MgKFBDSV9DTURfUkVBRCwgZGV2LCByZWcsICZkYXRhKSkgeworCQkqdmFsID0gMDsKKwkJcmV0dXJuIC0xOworCX0gCQkKKworCSp2YWwgPSAoZGF0YSA+PiAoKHJlZyAmIDMpIDw8IDMpKSAmIDB4ZmZmZjsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYXNwZWVkX3BjaV9yZWFkX2NvbmZpZ19kd29yZCAodTMyIGhvc2UsIHUzMiBkZXYsIHUzMiByZWcsCisJCQkJCSB1MzIgKiB2YWwpCit7CisJdTMyIGRhdGEgPSAwOworCisJaWYgKHJlZyAmIDMpCisJCXJldHVybiAtMTsKKworCWlmIChwY2lfY29uZmlnX2FjY2VzcyAoUENJX0NNRF9SRUFELCBkZXYsIHJlZywgJmRhdGEpKQl7CisJCSp2YWwgPSAwOworCQlyZXR1cm4gLTE7CisJfQkJCisKKwkqdmFsID0gZGF0YTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgYXNwZWVkX3BjaV93cml0ZV9jb25maWdfYnl0ZSAodTMyIGhvc2UsIHUzMiBkZXYsIHUzMiByZWcsIHU4IHZhbCkKK3sKKwl1MzIgZGF0YSA9IDA7CisKKwlpZiAocGNpX2NvbmZpZ19hY2Nlc3MgKFBDSV9DTURfUkVBRCwgZGV2LCByZWcsICZkYXRhKSkKKwkJcmV0dXJuIC0xOworCisJZGF0YSA9IChkYXRhICYgfigweGZmIDw8ICgocmVnICYgMykgPDwgMykpKSB8ICh2YWwgPDwKKwkJCQkJCSAgICAgICAoKHJlZyAmIDMpIDw8IDMpKTsKKworCWlmIChwY2lfY29uZmlnX2FjY2VzcyAoUENJX0NNRF9XUklURSwgZGV2LCByZWcsICZkYXRhKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBhc3BlZWRfcGNpX3dyaXRlX2NvbmZpZ193b3JkICh1MzIgaG9zZSwgdTMyIGRldiwgdTMyIHJlZywgdTE2IHZhbCkKK3sKKwl1MzIgZGF0YSA9IDA7CisKKwlpZiAocmVnICYgMSkKKwkJcmV0dXJuIC0xOworCisJaWYgKHBjaV9jb25maWdfYWNjZXNzIChQQ0lfQ01EX1JFQUQsIGRldiwgcmVnLCAmZGF0YSkpCisJCXJldHVybiAtMTsKKworCWRhdGEgPSAoZGF0YSAmIH4oMHhmZmZmIDw8ICgocmVnICYgMykgPDwgMykpKSB8ICh2YWwgPDwKKwkJCQkJCQkgKChyZWcgJiAzKSA8PCAzKSk7CisKKwlpZiAocGNpX2NvbmZpZ19hY2Nlc3MgKFBDSV9DTURfV1JJVEUsIGRldiwgcmVnLCAmZGF0YSkpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzcGVlZF9wY2lfd3JpdGVfY29uZmlnX2R3b3JkICh1MzIgaG9zZSwgdTMyIGRldiwgdTMyIHJlZywgdTMyIHZhbCkKK3sKKwl1MzIgZGF0YTsKKworCWlmIChyZWcgJiAzKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlkYXRhID0gdmFsOworCisJaWYgKHBjaV9jb25maWdfYWNjZXNzIChQQ0lfQ01EX1dSSVRFLCBkZXYsIHJlZywgJmRhdGEpKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gKDApOworfQorCisvKgorICoJSW5pdGlhbGl6ZSBQQ0lVCisgKi8KK2FzcGVlZF9wY2l1X2luaXQgKCkKK3sKKworICAgIHVuc2lnbmVkIGxvbmcgcmVnOworCisgICAgLyogUmVzZXQgUENJIEhvc3QgKi8KKyAgICByZWcgPSAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwMDQpOworICAgICooKHZvbGF0aWxlIHVsb25nKikgMHgxZTZlMjAwNCkgPSByZWcgfCAweDAwMjgwMDAwOworCisgICAgcmVnID0gKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNmUyMDc0KTsJCS8qIFJFUTIgKi8gICAgCisgICAgKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNmUyMDc0KSA9IHJlZyB8IDB4MDAwMDAwMTA7CisKKyAgICAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwMDgpIHw9IDB4MDAwODAwMDA7ICAgICAgICAKKyAgICByZWcgPSAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwMGMpOyAKKyAgICAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwMGMpID0gcmVnICYgMHhmZmY3ZmZmZjsKKyAgICB1ZGVsYXkoMSk7IAorICAgICooKHZvbGF0aWxlIHVsb25nKikgMHgxZTZlMjAwNCkgJj0gMHhmZmY3ZmZmZjsKKyAgICAgICAgICAgICAgICAgCisgICAgLyogSW5pdGlhbCBQQ0kgSG9zdCAqLworICAgIFJFU0VUX1BDSV9TVEFUVVM7CisJCisgICAgKkNSUF9BRERSX1JFRyA9ICgodWxvbmcpKFBDSV9DTURfUkVBRCkgPDwgMTYpIHwgMHgwNDsKKyAgICByZWcgPSAqQ1JQX1JFQURfUkVHOworICAgIAorICAgICpDUlBfQUREUl9SRUcgPSAoKHVsb25nKShQQ0lfQ01EX1dSSVRFKSA8PCAxNikgfCAweDA0OworICAgICpDUlBfV1JJVEVfUkVHID0gcmVnIHwgMHgwNzsKKyAgIAorfQorCisvKgorICoJSW5pdGlhbGl6ZSBNb2R1bGUKKyAqLworCit2b2lkIGFzcGVlZF9pbml0X3BjaSAoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCWhvc2UtPmZpcnN0X2J1c25vID0gMDsKKwlob3NlLT5sYXN0X2J1c25vID0gMHhmZjsKKworCWFzcGVlZF9wY2l1X2luaXQgKCk7CQkJLyogSW5pdGlhbGl6ZSBQQ0lVICovCisKKwkvKiBQQ0kgbWVtb3J5IHNwYWNlICMxICovCisJcGNpX3NldF9yZWdpb24gKGhvc2UtPnJlZ2lvbnMgKyAwLAorCQkJQVNQRUVEX1BDSV9NRU1fQkFTRSwgQVNQRUVEX1BDSV9NRU1fQkFTRSwgQVNQRUVEX1BDSV9NRU1fU0laRSwgUENJX1JFR0lPTl9NRU0pOworCisJLyogUENJIEkvTyBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uIChob3NlLT5yZWdpb25zICsgMSwKKwkJCUFTUEVFRF9QQ0lfSU9fQkFTRSwgQVNQRUVEX1BDSV9JT19CQVNFLCBBU1BFRURfUENJX0lPX1NJWkUsIFBDSV9SRUdJT05fSU8pOworCisJaG9zZS0+cmVnaW9uX2NvdW50ID0gMjsKKworCWhvc2UtPnJlYWRfYnl0ZSAgID0gYXNwZWVkX3BjaV9yZWFkX2NvbmZpZ19ieXRlOworCWhvc2UtPnJlYWRfd29yZCAgID0gYXNwZWVkX3BjaV9yZWFkX2NvbmZpZ193b3JkOworCWhvc2UtPnJlYWRfZHdvcmQgID0gYXNwZWVkX3BjaV9yZWFkX2NvbmZpZ19kd29yZDsKKwlob3NlLT53cml0ZV9ieXRlICA9IGFzcGVlZF9wY2lfd3JpdGVfY29uZmlnX2J5dGU7CisJaG9zZS0+d3JpdGVfd29yZCAgPSBhc3BlZWRfcGNpX3dyaXRlX2NvbmZpZ193b3JkOworCWhvc2UtPndyaXRlX2R3b3JkID0gYXNwZWVkX3BjaV93cml0ZV9jb25maWdfZHdvcmQ7CisKKwlwY2lfcmVnaXN0ZXJfaG9zZSAoaG9zZSk7CisKKwlob3NlLT5sYXN0X2J1c25vID0gcGNpX2hvc2Vfc2NhbiAoaG9zZSk7CisKKwlyZXR1cm47Cit9CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjMwMC9wbGF0Zm9ybS5TIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2U4ZjI2Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvcGxhdGZvcm0uUwpAQCAtMCwwICsxLDMwODkgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworLyoKKyAqIEJvYXJkIHNwZWNpZmljIHNldHVwIGluZm8KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBU1BFRUQgVGVjaG5vbG9neSBJbmMuCisgKiBBU1QyMzAwL0FTVDI0MDAgRERSMi9ERFIzIFNEUkFNIGNvbnRyb2xsZXIgaW5pdGlhbGl6YXRpb24gYW5kIGNhbGlicmF0aW9uIHNlcXVlbmNlCisgKgorICogR2FyeSBIc3UsIDxnYXJ5X2hzdUBhc3BlZWR0ZWNoLmNvbT4KKyAqCisgKiBSZWxlYXNlIGRhdGU6IDIwMTQuMTIuMjkgZm9ybWFsIHJlbGVhc2UgZm9yIFNESzAuNjAKKyAqCisgKiBNb2RpZmllZCBsaXN0IGZyb20gdjAuMjMKKyAqIEVDMS4gTW9kaWZ5IERRSURMWSBhbmQgRFFTSS1NQ0xLMlggY2FsaWJyYXRpb24gYWxnb3JpdGhtCisgKiBFQzIuIFJlbW92ZSBwYXNzIDIgRFFJRExZIGZpbmV0dW5lIHByb2Nlc3MKKyAqIEVDMy4gTW9kaWZ5IEVDQyBjb2RlCisgKiBFQzQuIEFkZCBBU1QyNDAwIHN1cHBvcnRpbmcKKyAqIEVDNS4gQWRkIFNQSSB0aW1pbmcgY2FsaWJyYXRpb24gZm9yIEFTVDI0MDAKKyAqIEVDNi4gUmVtb3ZlIEFTVDIzMDAtQTAgUENJLWUgd29ya2Fyb3VuZAorICogRUM3LiBBZGQgQ0sgZHV0eSBjYWxpYnJhdGlvbiBmb3IgQVNUMjQwMAorICogRUM4LiBSZW1vdmUgI2RlZmluZSBDT05GSUdfRFJBTV9VQVJUX09VVCwgZGVmYXVsdCBoYXMgbWVzc2FnZSBvdXRwdXQgdG8gVUFSVDUKKyAqIEVDOS4gQWRkIERSQU0gc2l6ZSBhdXRvLWRldGVjdGlvbgorICogRUMxMC4gQWRkIEdQSU8gcmVnaXN0ZXIgY2xlYXIgd2hlbiB3YXRjaGRvZyByZWJvb3QgKG9ubHkgZm9yIEFTVDI0MDApCisgKiBFQzExLiBNb3ZlIHRoZSAiU29sdmUgQVNQTSIgY29kZSBwb3NpdGlvbiBvZiBBU1QyMzAwIHRvIGF2b2lkIHdhdGNoZG9nIHJlc2V0CisgKgorICogTW9kaWZpZWQgbGlzdCBmcm9tIHYwLjUzCisgKiBFQzEuIEFkZCBzb2x1dGlvbiBvZiBMUEMgbG9jayBpc3N1ZSBkdWUgdG8gd2F0Y2hkb2cgcmVzZXQuIChBUCBub3RlIEEyMzAwLTExKQorICoKKyAqIE1vZGlmaWVkIGxpc3QgZnJvbSB2MC41NgorICogRUMxLiBGaXggcmVhZCBEUVMgaW5wdXQgbWFzayB3aW5kb3cgdG9vIGxhdGUgaXNzdWUgaWYgRFJBTSdzIHRfRFFTQ0sgaXMgZWFybGllciB0b28gbXVjaAorICogICAgICAoZXguIE5hbnlhIE5UNUNCNjRNMTZGUCkKKyAqICAgICAgMS4gQ2hhbmdlIGluaXQgdmFsdWUgb2YgTUNSMThbNF0gZnJvbSAnMScgdG8gJzAnCisgKiAgICAgIDIuIEFkZCBDQlI0IGNvZGUgdG8gZmluZXR1bmUgTUNSMThbNF0KKyAqCisgKiBNb2RpZmllZCBsaXN0IGZyb20gdjAuNTkKKyAqIEVDMS4gQWRkIERRUyBpbnB1dCBnYXRpbmcgd2luZG93IGRlbGF5IHR1bmluZyAoMS8yIFQpIHdoZW4gQ0JSIHJldHJ5CisgKiBFQzIuIE1vZGlmeSBETEwxIE1BZGogPSAweDRDCisgKgorICogT3B0aW9uYWwgZGVmaW5lIHZhcmlhYmxlCisgKiAxLiBEUkFNIFNwZWVkICAgICAgICAgICAgIC8vCisgKiAgICBDT05GSUdfRFJBTV8zMzYgICAgICAgIC8vIDMzNk1IeiAoRERSLTY2NykKKyAqICAgIENPTkZJR19EUkFNXzQwOCAgICAgICAgLy8gNDA4TUh6IChERFItODAwKSAoZGVmYXVsdCkKKyAqIDIuIEVDQyBGdW5jdGlvbiBlbmFibGUKKyAqICAgIENPTkZJR19EUkFNX0VDQyAgICAgICAgLy8gZGVmaW5lIHRvIGVuYWJsZSBFQ0MgZnVuY3Rpb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBlbmFibGVkLCBtdXN0IGRlZmluZSB0aGUgRUNDIHByb3RlY3RlZCBtZW1vcnkgc2l6ZSBhdCAweDFlNmUwMDU0CisgKiAzLiBVQVJUNSBtZXNzYWdlIG91dHB1dCAgIC8vCisgKiAgICBDT05GSUdfRFJBTV9VQVJUXzM4NDAwIC8vIHNldCB0aGUgVUFSVCBiYXVkIHJhdGUgdG8gMzg0MDAsIGRlZmF1bHQgaXMgMTE1MjAwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHZlcnNpb24uaD4KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBDYWxpYnJhdGlvbiBNYWNybyBTdGFydAorIFVzYWJsZSByZWdpc3RlcnM6CisgIHIwLCByMSwgcjIsIHIzLCByNSwgcjYsIHI3LCByOCwgcjksIHIxMCwgcjExCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUEFUVEVSTl9UQUJMRSwKKyAgIGluaXRfZGVsYXlfdGltZXIsCisgICBjaGVja19kZWxheV90aW1lciwKKyAgIGNsZWFyX2RlbGF5X3RpbWVyLAorICAgcmVjb3JkX2RsbDJfcGFzc19yYW5nZSwKKyAgIHJlY29yZF9kbGwyX3Bhc3NfcmFuZ2VfaCwKKyAgIGFyZSBmb3IgRFJBTSBjYWxpYnJhdGlvbiAqLworCitQQVRURVJOX1RBQkxFOgorICAgIC53b3JkICAgMHhmZjAwZmYwMAorICAgIC53b3JkICAgMHhjYzMzY2MzMworICAgIC53b3JkICAgMHhhYTU1YWE1NQorICAgIC53b3JkICAgMHg4ODc3ODg3NworICAgIC53b3JkICAgMHg5MmNjNGQ2ZSAgICAgICBAIDUKKyAgICAud29yZCAgIDB4NTQzZDNjZGUKKyAgICAud29yZCAgIDB4ZjFlODQzYzcKKyAgICAud29yZCAgIDB4N2M2MWQyNTMKKyAgICAud29yZCAgIDB4MDAwMDAwMDAgICAgICAgQCA4CisKKyAgICAubWFjcm8gaW5pdF9kZWxheV90aW1lcgorICAgIGxkciByMCwgPTB4MWU3ODIwMjQgICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IFRpbWVyMyBSZWxvYWQKKyAgICBzdHIgcjIsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2YzAwMzggICAgICAgICAgICAgICAgICAgICAgICAgIEAgQ2xlYXIgVGltZXIzIElTUgorICAgIGxkciByMSwgPTB4MDAwNDAwMDAKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU3ODIwMzAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgRW5hYmxlIFRpbWVyMworICAgIGxkciByMSwgW3IwXQorICAgIG1vdiByMiwgIzcKKyAgICBvcnIgcjEsIHIxLCByMiwgbHNsICM4CisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmMwMDkwICAgICAgICAgICAgICAgICAgICAgICAgICBAIENoZWNrIElTUiBmb3IgVGltZXIzIHRpbWVvdXQKKyAgICAuZW5kbQorCisgICAgLm1hY3JvIGNoZWNrX2RlbGF5X3RpbWVyCisgICAgbGRyIHIxLCBbcjBdCisgICAgYmljIHIxLCByMSwgIzB4RkZGQkZGRkYKKyAgICBtb3YgcjIsIHIxLCBsc3IgIzE4CisgICAgY21wIHIyLCAjMHgwMQorICAgIC5lbmRtCisKKyAgICAubWFjcm8gY2xlYXJfZGVsYXlfdGltZXIKKyAgICBsZHIgcjAsID0weDFlNzgyMDMwICAgICAgICAgICAgICAgICAgICAgICAgICBAIERpc2FibGUgVGltZXIzCisgICAgbGRyIHIxLCBbcjBdCisgICAgYmljIHIxLCByMSwgIzB4MDAwMDBGMDAKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2YzAwMzggICAgICAgICAgICAgICAgICAgICAgICAgIEAgQ2xlYXIgVGltZXIzIElTUgorICAgIGxkciByMSwgPTB4MDAwNDAwMDAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICAuZW5kbQorCisgICAgLm1hY3JvIHJlY29yZF9kbGwyX3Bhc3NfcmFuZ2UKKyAgICBsZHIgICAgICAgICAgICAgICAgIHIxLCBbcjBdCisgICAgYmljICAgICAgICAgICAgICAgICByMiwgcjEsICMweEZGRkZGRjAwCisgICAgY21wICAgICAgICAgICAgICAgICByMiwgcjMgICAgICAgICAgICAgICAgICAgQCByZWNvcmQgbWluCisgICAgYmljZ3QgICAgICAgICAgICAgICByMSwgcjEsICMweDAwMDAwMEZGCisgICAgb3JyZ3QgICAgICAgICAgICAgICByMSwgcjEsIHIzCisgICAgYmljICAgICAgICAgICAgICAgICByMiwgcjEsICMweEZGRkYwMEZGCisgICAgY21wICAgICAgICAgICAgICAgICByMywgcjIsIGxzciAjOCAgICAgICAgICAgQCByZWNvcmQgbWF4CisgICAgYmljZ3QgICAgICAgICAgICAgICByMSwgcjEsICMweDAwMDBGRjAwCisgICAgb3JyZ3QgICAgICAgICAgICAgICByMSwgcjEsIHIzLCBsc2wgIzgKKyAgICBzdHIgICAgICAgICAgICAgICAgIHIxLCBbcjBdCisgICAgLmVuZG0KKworICAgIC5tYWNybyByZWNvcmRfZGxsMl9wYXNzX3JhbmdlX2gKKyAgICBsZHIgICAgICAgICAgICAgICAgIHIxLCBbcjBdCisgICAgYmljICAgICAgICAgICAgICAgICByMiwgcjEsICMweEZGMDBGRkZGCisgICAgbW92ICAgICAgICAgICAgICAgICByMiwgcjIsIGxzciAjMTYKKyAgICBjbXAgICAgICAgICAgICAgICAgIHIyLCByMyAgICAgICAgICAgICAgICAgICBAIHJlY29yZCBtaW4KKyAgICBiaWNndCAgICAgICAgICAgICAgIHIxLCByMSwgIzB4MDBGRjAwMDAKKyAgICBvcnJndCAgICAgICAgICAgICAgIHIxLCByMSwgcjMsIGxzbCAjMTYKKyAgICBiaWMgICAgICAgICAgICAgICAgIHIyLCByMSwgIzB4MDBGRkZGRkYKKyAgICBjbXAgICAgICAgICAgICAgICAgIHIzLCByMiwgbHNyICMyNCAgICAgICAgICBAIHJlY29yZCBtYXgKKyAgICBiaWNndCAgICAgICAgICAgICAgIHIxLCByMSwgIzB4RkYwMDAwMDAKKyAgICBvcnJndCAgICAgICAgICAgICAgIHIxLCByMSwgcjMsIGxzbCAjMjQKKyAgICBzdHIgICAgICAgICAgICAgICAgIHIxLCBbcjBdCisgICAgLmVuZG0KKworICAgIC5tYWNybyBpbml0X3NwaV9jaGVja3N1bQorICAgIGxkciByMCwgPTB4MWU2MjAwODQKKyAgICBsZHIgcjEsID0weDIwMDEwMDAwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTYyMDA4QworICAgIGxkciByMSwgPTB4MjAwMDAyMDAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNjIwMDgwCisgICAgbGRyIHIxLCA9MHgwMDAwMDAwRAorICAgIG9yciByMiwgcjIsIHI3CisgICAgb3JyIHIxLCByMSwgcjIsIGxzbCAjOAorICAgIGFuZCByMiwgcjYsICMweEYKKyAgICBvcnIgcjEsIHIxLCByMiwgbHNsICM0CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTYyMDAwOAorICAgIGxkciByMiwgPTB4MDAwMDA4MDAKKyAgICAuZW5kbQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQ2FsaWJyYXRpb24gTWFjcm8gRW5kCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFBDX1BhdGNoOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCB0byBTUkFNIGJhc2UgMHgxZTcyMDQwMAorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgc3RyICAgcjMsIFtyMl0KKyAgICBiaWMgICByMSwgcjEsICMweEZGCitMUENfUGF0Y2hfUzE6CisgICAgc3VicyAgcjUsIHI1LCAjMHgwMQorICAgIG1vdmVxIHBjLCByOAorICAgIGxkciAgIHIzLCBbcjJdCisgICAgdHN0ICAgcjMsICMweDAxCisgICAgbW92bmUgcGMsIHI4CisgICAgbW92ICAgcGMsIHI3CitMUENfUGF0Y2hfUzI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIHRvIFNSQU0gYmFzZSAweDFlNzIwNDgwCisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBtb3YgICBwYywgcjkKK0xQQ19QYXRjaF9FOgorCisuZ2xvYmwgbG93bGV2ZWxfaW5pdAorbG93bGV2ZWxfaW5pdDoKKworaW5pdF9kcmFtOgorICAgIC8qIHNhdmUgbHIgKi8KKyAgICBtb3YgcjQsIGxyCisvKiBUZXN0IC0gRFJBTSBpbml0aWFsIHRpbWUgKi8KKyAgICBsZHIgcjAsID0weDFlNzgyMDQ0CisgICAgbGRyIHIxLCA9MHhGRkZGRkZGRgorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTc4MjAzMAorICAgIGxkciByMSwgW3IwXQorICAgIGJpYyByMSwgcjEsICMweDAwMDBGMDAwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbW92IHIyLCAjMworICAgIG9yciByMSwgcjEsIHIyLCBsc2wgIzEyCisgICAgc3RyIHIxLCBbcjBdCisvKiBUZXN0IC0gRFJBTSBpbml0aWFsIHRpbWUgKi8KKworICAgIC8qU2V0IFNjcmF0Y2ggcmVnaXN0ZXIgQml0IDcgYmVmb3JlIGluaXRpYWxpemUqLworICAgIGxkciByMCwgPTB4MWU2ZTIwMDAKKyAgICBsZHIgcjEsID0weDE2ODhhOGE4CisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUyMDQwCisgICAgbGRyIHIxLCBbcjBdCisgICAgb3JyIHIxLCByMSwgIzB4ODAKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIC8qIEZpeCBMUEMgbG9jayBpc3N1ZSBmb3IgQVNUMjMwMCAqLworICAgIGxkciByMCwgPTB4MWU2ZTIwN2MgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQ2hlY2sgQVNUMjMwMAorICAgIGxkciByMSwgW3IwXQorICAgIG1vdiByMSwgcjEsIGxzciAjMjQKKyAgICBjbXAgcjEsICMweDAxCisgICAgYm5lIGxwY19yZWNvdmVyX2VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBub3QgbWF0Y2ggQVNUMjMwMAorCisgICAgbW92IHIzLCAjMHgwCitscGNfcmVjb3Zlcl9jaGVjazoKKyAgICBsZHIgcjAsID0weDFlNzg5MDBjICAgICAgICAgICAgICAgICAgICAgICAgICBAIGNoZWNrIEhJQ1IzWzRdPTB4MQorICAgIGxkciByMSwgW3IwXQorICAgIHRzdCByMSwgIzB4MTAKKyAgICBiZXEgbHBjX3JlY292ZXJfZW5kCisgICAgbGRyIHIwLCA9MHgxZTc4OTAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjaGVjayBISUNSMVs3XT0weDEKKyAgICBsZHIgcjEsIFtyMF0KKyAgICB0c3QgcjEsICMweDgwCisgICAgYmVxIGxwY19yZWNvdmVyX2VuZAorICAgIGxkciByMCwgPTB4MWU3ODkwYTAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY2hlY2sgTEhDUjBbMjc6MjRdPTB4NgorICAgIGxkciByMSwgW3IwXQorICAgIG1vdiByMSwgcjEsIGxzciAjMjQKKyAgICBhbmQgcjEsIHIxLCAjMHhGCisgICAgY21wIHIxLCAjMHgwNgorICAgIGJuZSBscGNfcmVjb3Zlcl9lbmQKKyAgICBhZGQgcjMsIHIzLCAjMHgwMQorICAgIGNtcCByMywgIzB4NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcmVwZWF0IDUgdGltZXMKKyAgICBibGUgbHBjX3JlY292ZXJfY2hlY2sKKworICAgIG1vdiByMywgIzB4MAorbHBjX3JlY292ZXJfaW5pdDoKKyAgICBsZHIgcjAsID0weDFlNzg5MGE0ICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNldCBMSENSMVsxOjBdPTB4MAorICAgIGxkciByMSwgPTB4MDAwMDAwMDAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBhZGQgcjMsIHIzLCAjMHgwMQorICAgIGNtcCByMywgIzB4MjAKKyAgICBiZ2UgbHBjX3JlY292ZXJfZW5kCisgICAgbGRyIHIxLCBbcjBdCisgICAgdHN0IHIxLCAjMHgwMQorICAgIGJuZSBscGNfcmVjb3Zlcl9pbml0CisKKyAgICBsZHIgcjAsID0weDFlNzg5MGIwICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNldCBMSENSNFs3OjBdPTB4RkYKKyAgICBsZHIgcjEsID0weDAwMDAwMEZGCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4OTBiNCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzZXQgTEhDUjVbMzE6MF09MHhGRkZGRkZGRgorICAgIGxkciByMSwgPTB4RkZGRkZGRkYKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzg5MGI4ICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNldCBMSENSNlszMTowXT0weEZGRkZGRkZGCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBhZHIgcjYsIExQQ19QYXRjaAorICAgIGFkciByNywgTFBDX1BhdGNoX1MyCisgICAgbGRyIHIwLCA9MHgxZTcyMDQwMAorY29weV9scGNfcGF0Y2hfMToKKyAgICBsZHIgcjEsIFtyNl0KKyAgICBzdHIgcjEsIFtyMF0KKyAgICBhZGQgcjYsIHI2LCAjMHg0CisgICAgYWRkIHIwLCByMCwgIzB4NAorICAgIGNtcCByNiwgcjcKKyAgICBibmUgY29weV9scGNfcGF0Y2hfMQorCisgICAgYWRyIHI2LCBMUENfUGF0Y2hfUzIKKyAgICBhZHIgcjcsIExQQ19QYXRjaF9FCisgICAgbGRyIHIwLCA9MHgxZTcyMDQ4MAorY29weV9scGNfcGF0Y2hfMjoKKyAgICBsZHIgcjEsIFtyNl0KKyAgICBzdHIgcjEsIFtyMF0KKyAgICBhZGQgcjYsIHI2LCAjMHg0CisgICAgYWRkIHIwLCByMCwgIzB4NAorICAgIGNtcCByNiwgcjcKKyAgICBibmUgY29weV9scGNfcGF0Y2hfMgorCisgICAgbGRyIHIwLCA9MHgxZTc4OTBhMCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzZXQgTEhDUjBbMzE6MF09MHhGRkZGRkYwMQorICAgIGxkciByMSwgPTB4RkZGRkZGMDEKKyAgICBhZGQgcjIsIHIwLCAjMHg0CisgICAgbW92IHIzLCAjMHgwMQorICAgIG1vdiByNSwgIzB4MTAKKyAgICBhZHIgcjksIGxwY19yZWNvdmVyX2VuZAorICAgIGFkciByNiwgTFBDX1BhdGNoCisgICAgYWRyIHI3LCBMUENfUGF0Y2hfUzEKKyAgICBzdWIgcjYsIHI3LCByNgorICAgIGxkciByNywgPTB4MWU3MjA0MDAKKyAgICBhZGQgcjcsIHI3LCByNgorICAgIGxkciByOCwgPTB4MWU3MjA0ODAKKyAgICBsZHIgcGMsID0weDFlNzIwNDAwCisKK2xwY19yZWNvdmVyX2VuZDoKKyAgICBsZHIgcjAsID0weDFlNzg5MGEwICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNldCBMSENSMFszMTowXT0weEZGRkZGRjAwCisgICAgbGRyIHIxLCA9MHhGRkZGRkYwMAorICAgIHN0ciByMSwgW3IwXQorICAgIC8qIDxFTkQ+IEZpeCBMUEMgbG9jayBpc3N1ZSBmb3IgQVNUMjMwMCAqLworCisgICAgLyogQ2hlY2sgU2NyYXRjaCBSZWdpc3RlciBCaXQgNiAqLworICAgIGxkciByMCwgPTB4MWU2ZTIwNDAKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBiaWMgcjEsIHIxLCAjMHhGRkZGRkZCRgorICAgIG1vdiByMiwgcjEsIGxzciAjNgorICAgIGNtcCByMiwgIzB4MDEKKyAgICBiZXEgcGxhdGZvcm1fZXhpdAorCisgICAgbGRyIHIyLCA9MHgwMzMxMDNGMSAgICAgICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIFBMTCBwYXJhbWV0ZXIgZm9yIDI0TWh6IENMS0lOICgzOTY6MzI0KQorLyogIGxkciByMiwgPTB4MDE5MDAxRjAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCBQTEwgcGFyYW1ldGVyIGZvciAyNE1oeiBDTEtJTiAoNDA4OjMzNikgKi8KKyAgICBsZHIgcjAsID0weDFlNmUyMDdjICAgICAgICAgICAgICAgICAgICAgICAgICBAIENoZWNrIFJldmlzaW9uIElECisgICAgbGRyIHIxLCBbcjBdCisgICAgbW92IHIxLCByMSwgbHNyICMyNAorICAgIGNtcCByMSwgIzB4MDIKKyAgICBibmUgc2V0X01QTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIG5vdCBtYXRjaCBBU1QyNDAwCisKKyAgICBsZHIgcjAsID0weDFlNmUyMDcwICAgICAgICAgICAgICAgICAgICAgICAgICBAIENoZWNrIENMS0lOIGZyZXEKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsIHIxLCBsc3IgIzIzCisgICAgdHN0IHIxLCAjMHgwMQorICAgIGxkcm5lIHIyLCA9MHgwMTcwMDFEMCAgICAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCBQTEwgcGFyYW1ldGVyIGZvciAyNU1oeiBDTEtJTiAoNDAwOjMyNSkKKworc2V0X01QTEw6CisgICAgbGRyIHIwLCA9MHgxZTZlMjAyMCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBNLVBMTCAoRERSIFNEUkFNKSBGcmVxdWVuY3kKKyAgICBsZHIgcjEsID0weEZGRkYKKyNpZiBkZWZpbmVkKENPTkZJR19EUkFNXzMzNikKKyAgICBtb3YgcjIsIHIyLCBsc3IgIzE2CisjZW5kaWYKKyAgICBhbmQgcjEsIHIyLCByMQorICAgIHN0ciByMSwgW3IwXQorCisvKiBEZWJ1ZyAtIFVBUlQgY29uc29sZSBtZXNzYWdlICovCisgICAgbGRyIHIwLCA9MHgxZTc4NDAwYworICAgIG1vdiByMSwgIzB4ODMKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTIwMmMKKyAgICBsZHIgcjIsIFtyMF0KKyAgICBtb3YgcjIsIHIyLCBsc3IgIzEyCisgICAgdHN0IHIyLCAjMHgwMQorICAgIGxkciByMCwgPTB4MWU3ODQwMDAKKyAgICBtb3ZlcSByMSwgIzB4MEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIEJhdWRyYXRlIDExNTIwMAorICAgIG1vdm5lIHIxLCAjMHgwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQmF1ZHJhdGUgMTE1MjAwLCBkaXYxMworI2lmIGRlZmluZWQoQ09ORklHX0RSQU1fVUFSVF8zODQwMCkKKyAgICBtb3ZlcSByMSwgIzB4MjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIEJhdWRyYXRlIDM4NDAwCisgICAgbW92bmUgcjEsICMweDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBCYXVkcmF0ZSAzODQwMCAsIGRpdjEzCisjZW5kaWYKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU3ODQwMDQKKyAgICBtb3YgcjEsICMweDAwCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNzg0MDBjCisgICAgbW92IHIxLCAjMHgwMworICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTc4NDAwOAorICAgIG1vdiByMSwgIzB4MDcKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU3ODQwMDAKKyAgICBtb3YgcjEsICMweDBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICdccicKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDBBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICdcbicKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICdEJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4NTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ1InCisgICAgc3RyIHIxLCBbcjBdCisgICAgbW92IHIxLCAjMHg0MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnQScKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICdNJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJyAnCisgICAgc3RyIHIxLCBbcjBdCisgICAgbW92IHIxLCAjMHg0OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnSScKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICduJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4NjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ2knCisgICAgc3RyIHIxLCBbcjBdCisgICAgbW92IHIxLCAjMHg3NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAndCcKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICctJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4NDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ0QnCisgICAgc3RyIHIxLCBbcjBdCisgICAgbW92IHIxLCAjMHg0NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnRCcKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICdSJworICAgIHN0ciByMSwgW3IwXQorLyogRGVidWcgLSBVQVJUIGNvbnNvbGUgbWVzc2FnZSAqLworCisgICAgLyogRGVsYXkgYWJvdXQgMTAwdXMgKi8KKyAgICBsZHIgcjAsID0weDFlNzgyMDMwICAgICAgICAgICAgICAgICAgICAgICAgICBAIEluaXQgVGltZXIzIENvbnRyb2wKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBiaWMgcjEsIHIxLCAjMHgwMDAwMEYwMAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIyLCA9MHgwMDAwMDA2NCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgVGltZXIzIFJlbG9hZCA9IDEwMCB1cworICAgIGluaXRfZGVsYXlfdGltZXIKK2RlbGF5XzA6CisgICAgY2hlY2tfZGVsYXlfdGltZXIKKyAgICBibmUgZGVsYXlfMAorICAgIGNsZWFyX2RlbGF5X3RpbWVyCisgICAgLyogZW5kIGRlbGF5IDEwMHVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBJbml0IERSQU0gY29tbW9uIHJlZ2lzdGVycworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBsZHIgcjAsID0weDFlNmUwMDAwCisgICAgbGRyIHIxLCA9MHhmYzYwMDMwOQorICAgIHN0ciByMSwgW3IwXQorCisgICAgLyogUmVzZXQgTU1DICovCisgICAgbGRyIHIxLCA9MHgwMDAwMDAwMAorICAgIGxkciByMCwgPTB4MWU2ZTAwMzQKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNmUwMDE4CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTZlMDAyNAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU2ZTAwNjQgICAgICAgICAgICAgICAgICAgICAgICAgIEAgUkVHX01BREosIHBvd2VyIGRvd24gRExMCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjEsID0weDAwMDM0QzRDICAgICAgICAgICAgICAgICAgICAgICAgICBAIFJFR19NQURKLCByZXNldCBETEwKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwNjggICAgICAgICAgICAgICAgICAgICAgICAgIEAgUkVHX1NBREoKKyAgICBsZHIgcjEsID0weDAwMDAxODAwCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICAvKiBEZWxheSBhYm91dCAxMHVzICovCisgICAgbGRyIHIyLCA9MHgwMDAwMDAwQiAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgVGltZXIzIFJlbG9hZCA9IDEwIHVzCisgICAgaW5pdF9kZWxheV90aW1lcgorZGVsYXlfMToKKyAgICBjaGVja19kZWxheV90aW1lcgorICAgIGJuZSBkZWxheV8xCisgICAgY2xlYXJfZGVsYXlfdGltZXIKKyAgICAvKiBlbmQgZGVsYXkgMTB1cyAqLworCisgICAgbGRyIHIwLCA9MHgxZTZlMDA2NCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBSRUdfTUFESiB8IDB4QzAwMDAsIGVuYWJsZSBETEwKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBsZHIgcjIsID0weEMwMDAwCisgICAgb3JyIHIxLCByMSwgcjIKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMDgKKyAgICBsZHIgcjEsID0weDAwOTAwNDBmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWR0EgKi8KKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMTgKKyAgICBsZHIgcjEsID0weDQwMDBBMTIwCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDE4CisgICAgbGRyIHIxLCA9MHgwMDAwMDEyMAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAzOAorICAgIGxkciByMSwgPTB4MDAwMDAwMDAKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwNDAKKyAgICBsZHIgcjEsID0weEZGNDQ0NDQ0CisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDQ0CisgICAgbGRyIHIxLCA9MHgyMjIyMjIyMgorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDA0OAorICAgIGxkciByMSwgPTB4MjIyMjIyMjIKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwNGMKKyAgICBsZHIgcjEsID0weDIyMjIyMjIyCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDUwCisgICAgbGRyIHIxLCA9MHg4MDAwMDAwMAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDA1MAorICAgIGxkciByMSwgPTB4MDAwMDAwMDAKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwNTQKKyAgICBsZHIgcjEsID0weDAwMDAwMDAwCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDYwICAgICAgICAgICAgICAgICAgICAgICAgICBAIFJFR19EUlYKKyAgICBsZHIgcjEsID0weDAwMDAwMEZBICAgICAgICAgICAgICAgICAgICAgICAgICBAIDQwOCBNSHoKKyNpZiBkZWZpbmVkKENPTkZJR19EUkFNXzMzNikKKyAgICBsZHIgcjEsID0weDAwMDAwMEZBCisjZW5kaWYKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwNzAKKyAgICBsZHIgcjEsID0weDAwMDAwMDAwCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDc0CisgICAgbGRyIHIxLCA9MHgwMDAwMDAwMAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDA3OAorICAgIGxkciByMSwgPTB4MDAwMDAwMDAKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwN2MKKyAgICBsZHIgcjEsID0weDAwMDAwMDAwCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDgwCisgICAgbGRyIHIxLCA9MHgwMDAwMDAwMAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDA4NAorICAgIGxkciByMSwgPTB4MDBGRkZGRkYKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwODggICAgICAgICAgICAgICAgICAgICAgICAgIEAgUkVHX0RRSURMWQorICAgIGxkciByMSwgPTB4MDAwMDAwODkgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNDA4IE1IegorI2lmIGRlZmluZWQoQ09ORklHX0RSQU1fMzM2KQorICAgIGxkciByMSwgPTB4MDAwMDAwNzQKKyNlbmRpZgorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAyMCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBSRUdfRFFTSUMKKyAgICBsZHIgcjEsID0weDAwMDAwMEUyICAgICAgICAgICAgICAgICAgICAgICAgICBAIDQwOCBNSHoKKyNpZiBkZWZpbmVkKENPTkZJR19EUkFNXzMzNikKKyAgICBsZHIgcjEsID0weDAwMDAwMEJBCisjZW5kaWYKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIC8qIERlbGF5IGFib3V0IDEwdXMgKi8KKyAgICBsZHIgcjIsID0weDAwMDAwMDBCICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBUaW1lcjMgUmVsb2FkID0gMTAgdXMKKyAgICBpbml0X2RlbGF5X3RpbWVyCitkZWxheV8yOgorICAgIGNoZWNrX2RlbGF5X3RpbWVyCisgICAgYm5lIGRlbGF5XzIKKyAgICBjbGVhcl9kZWxheV90aW1lcgorICAgIC8qIGVuZCBkZWxheSAxMHVzICovCisKKyAgICAvKiBDaGVjayBEUkFNIFR5cGUgYnkgSC9XIFRyYXBwaW5nICovCisgICAgbGRyIHIwLCA9MHgxZTZlMjA3MAorICAgIGxkciByMSwgW3IwXQorICAgIGJpYyByMSwgcjEsICMweEZFRkZGRkZGICAgICAgICAgICAgICAgICAgICAgIEAgYml0WzI0XT0xID0+IEREUjIKKyAgICBtb3YgcjIsIHIxLCBsc3IgIzI0CisgICAgY21wIHIyLCAjMHgwMQorICAgIGJlcSBkZHIyX2luaXQKKyAgICBiICAgZGRyM19pbml0CisuTFRPUkcKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEREUjMgSW5pdAorCisgdFJDRCAgID0gMTUgICAgIG5zCisgdFJBUyAgID0gMzcuNSAgIG5zCisgdFJSRCAgID0gbWF4KDQgQ0ssMTAgbnMpCisgdFJQICAgID0gMTUgICAgIG5zCisgdFJGQyAgID0gMTEwbnMvMUdiaXQsIDE2MG5zLzJHYml0LCAzMDBucy80R2JpdAorIHRSVFAgICA9IG1heCg0IENLLDcuNSBucykKKyB0V1IgICAgPSAxNSAgICAgbnMKKyB0WFNOUiAgPSBtYXgoMTAgQ0ssMjAwIG5zKQorIHRXVFIgICA9IG1heCg0IENLLDcuNSBucykKKyB0RkFXICAgPSA1MCAgICAgbnMKKyB0TVJEICAgPSBtYXgoMTUgQ0ssMjAgbnMpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZGRyM19pbml0OgorLyogRGVidWcgLSBVQVJUIGNvbnNvbGUgbWVzc2FnZSAqLworICAgIGxkciByMCwgPTB4MWU3ODQwMDAKKyAgICBtb3YgcjEsICMweDMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICczJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4MEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ1xyJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4MEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ1xuJworICAgIHN0ciByMSwgW3IwXQorLyogRGVidWcgLSBVQVJUIGNvbnNvbGUgbWVzc2FnZSAqLworCisgICAgbGRyIHIwLCA9MHgxZTZlMDAwNAorICAgIGxkciByMSwgPTB4MDAwMDA1MzEgICAgICAgICAgICAgICAgICAgICAgICAgIEAgRGVmYXVsdCBzZXQgdG8gMUdiaXQKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMTAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgUkVHX0FDMQorICAgIGxkciByMSwgPTB4MzMzMDI4MjUgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNDA4IE1IegorI2lmIGRlZmluZWQoQ09ORklHX0RSQU1fMzM2KQorICAgIGxkciByMSwgPTB4MjIyMDI3MjUKKyNlbmRpZgorICAgIHN0ciByMSwgW3IwXQorCisgICAgLyogQ2hlY2sgRFJBTSBDTCBUaW1pbmcgYnkgSC9XIFRyYXBwaW5nICovCisgICAgbGRyIHIwLCA9MHgxZTZlMjA3MAorICAgIGxkciByMSwgW3IwXQorICAgIGJpYyByMSwgcjEsICMweEY5RkZGRkZGCisgICAgbW92IHIyLCByMSwgbHNyICM5ICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgQ0wKKyAgICBsZHIgcjEsID0weDAwMDIwMDAwCisgICAgYWRkIHIyLCByMiwgcjEKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBiaWMgcjEsIHIxLCAjMHhGQkZGRkZGRgorICAgIG1vdiByMSwgcjEsIGxzciAjNiAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IENXTAorICAgIG9yciByMiwgcjIsIHIxCisgICAgbGRyIHIxLCA9MHgwMDMwMDAwMAorICAgIGFkZCByMiwgcjIsIHIxCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDE0ICAgICAgICAgICAgICAgICAgICAgICAgICBAIFJFR19BQzIKKyAgICBsZHIgcjEsID0weENDMDA5NjNGICAgICAgICAgICAgICAgICAgICAgICAgICBAIDQwOCBNSHoKKyNpZiBkZWZpbmVkKENPTkZJR19EUkFNXzMzNikKKyAgICBsZHIgcjEsID0weEFBMDA3NjM2CisjZW5kaWYKKyAgICBvcnIgcjEsIHIxLCByMgorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjaGVjayAyNDAwIG1vZGUKKyAgICBsZHIgcjIsIFtyMF0KKyAgICBtb3YgcjIsIHIyLCBsc3IgIzEwCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDZjICAgICAgICAgICAgICAgICAgICAgICAgICBAIFJFR19JT1oKKyAgICBsZHIgcjEsID0weDAwMDAyMzEyICAgICAgICAgICAgICAgICAgICAgICAgICBAIDQwOCBNSHoKKyNpZiBkZWZpbmVkKENPTkZJR19EUkFNXzMzNikKKyAgICBsZHIgcjEsID0weDAwMDAyMzEyCisjZW5kaWYKKyAgICB0c3QgcjIsICMweDAxCisgICAgbW92ZXEgcjEsIHIxLCBsc3IgIzgKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAxMjAKKyAgICBtb3YgcjEsICMwCisgICAgc3RyIHIxLCBbcjBdCisgICAgdHN0IHIyLCAjMHgwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjaGVjayBBU1QyMzAwCisgICAgYmVxIENCUkRMTDFfMjMwMF9TdGFydAorICAgIGxkciByMCwgPTB4MWU2ZTIwN2MgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY2hlY2sgQVNUMjQwMCByZXZpc2lvbiBBMAorICAgIGxkciByMSwgW3IwXQorICAgIG1vdiByMSwgcjEsIGxzciAjMTYKKyAgICBhbmQgcjEsIHIxLCAjMHhGRgorICAgIGNtcCByMSwgIzB4MAorICAgIGJlcSBDQlJETEwxXzIzMDBfU3RhcnQKKyAgICBiICAgQ0JSRExMMV8yNDAwX1N0YXJ0CitNQ0xLMlhfUGhhc2VfQ0JSX0RvbmVfRERSMzoKKyAgICBsZHIgcjAsID0weDFlNmUwMDE4CisgICAgbGRyIHIxLCBbcjBdCisgICAgb3JyIHIxLCByMSwgIzB4NDAKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMzQKKyAgICBsZHIgcjEsID0weDAwMDAwMDAxCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDBjCisgICAgbGRyIHIxLCA9MHgwMDAwMDA0MAorICAgIHN0ciByMSwgW3IwXQorCisgICAgLyogRGVsYXkgYWJvdXQgNDAwdXMgKi8KKyAgICBsZHIgcjIsID0weDAwMDAwMTkwICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBUaW1lcjMgUmVsb2FkID0gNDAwIHVzCisgICAgaW5pdF9kZWxheV90aW1lcgorZGVsYXkzXzQ6CisgICAgY2hlY2tfZGVsYXlfdGltZXIKKyAgICBibmUgZGVsYXkzXzQKKyAgICBjbGVhcl9kZWxheV90aW1lcgorICAgIC8qIGVuZCBkZWxheSA0MDB1cyAqLworCisgICAgLyogQ2hlY2sgRFJBTSBDTCBUaW1pbmcgYnkgSC9XIFRyYXBwaW5nICovCisgICAgbGRyIHIwLCA9MHgxZTZlMjA3MAorICAgIGxkciByMSwgW3IwXQorICAgIGJpYyByMSwgcjEsICMweEY5RkZGRkZGCisgICAgbW92IHIyLCByMSwgbHNyICMyMSAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgQ0wKKyAgICBsZHIgcjEsID0weDAwMDAwMDEwCisgICAgYWRkIHIyLCByMiwgcjEKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBiaWMgcjEsIHIxLCAjMHhGQkZGRkZGRgorICAgIG1vdiByMSwgcjEsIGxzciAjNyAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IENXTAorICAgIG9yciByMiwgcjIsIHIxCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDJjICAgICAgICAgICAgICAgICAgICAgICAgICBAIFJFR19NUlMKKyAgICBsZHIgcjEsID0weDA0MDAxNzAwICAgICAgICAgICAgICAgICAgICAgICAgICBAIDQwOCBNSHoKKyNpZiBkZWZpbmVkKENPTkZJR19EUkFNXzMzNikKKyAgICBsZHIgcjEsID0weDA0MDAxNTAwCisjZW5kaWYKKyAgICBvcnIgcjEsIHIxLCByMgorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAzMCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBSRUdfRU1SUworICAgIGxkciByMSwgPTB4MDAwMDAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNDA4IE1IegorI2lmIGRlZmluZWQoQ09ORklHX0RSQU1fMzM2KQorICAgIGxkciByMSwgPTB4MDAwMDAwMDAKKyNlbmRpZgorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAyOCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgRU1SUzIKKyAgICBsZHIgcjEsID0weDAwMDAwMDA1CisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDI4ICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBFTVJTMworICAgIGxkciByMSwgPTB4MDAwMDAwMDcKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMjggICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IEVNUlMKKyAgICBsZHIgcjEsID0weDAwMDAwMDAzCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDI4ICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBNUlMKKyAgICBsZHIgcjEsID0weDAwMDAwMDAxCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDJjICAgICAgICAgICAgICAgICAgICAgICAgICBAIFJFR19NUlMKKyAgICBsZHIgcjEsID0weDA0MDAxNjAwICAgICAgICAgICAgICAgICAgICAgICAgICBAIDQwOCBNSHoKKyNpZiBkZWZpbmVkKENPTkZJR19EUkFNXzMzNikKKyAgICBsZHIgcjEsID0weDA0MDAxNDAwCisjZW5kaWYKKyAgICBvcnIgcjEsIHIxLCByMgorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAwYyAgICAgICAgICAgICAgICAgICAgICAgICAgQCBSZWZyZXNoIDggdGltZXMKKyAgICBsZHIgcjEsID0weDAwMDA1QzQ4CisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDI4ICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBNUlMKKyAgICBsZHIgcjEsID0weDAwMDAwMDAxCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDBjICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCByZWZyZXNoIGN5Y2xlCisgICAgbGRyIHIxLCA9MHgwMDAwMjAwMQorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAxNAorICAgIGxkciByMSwgW3IwXQorICAgIGJpYyByMSwgcjEsICMweEZGRjlGRkZGCisgICAgbW92IHIyLCByMSwgbHNyICMzICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBnZXQgQ0wKKworICAgIGxkciByMCwgPTB4MWU2ZTAwMzQgICAgICAgICAgICAgICAgICAgICAgICAgIEAgUkVHX1BXQworICAgIGxkciByMSwgPTB4MDAwMDAzMDMgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNDA4IE1IegorI2lmIGRlZmluZWQoQ09ORklHX0RSQU1fMzM2KQorICAgIGxkciByMSwgPTB4MDAwMDAzMDMKKyNlbmRpZgorICAgIG9yciByMSwgcjEsIHIyCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBiICAgQ2FsaWJyYXRpb25fU3RhcnQKKy5MVE9SRworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEVuZCBERFIzIEluaXQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBERFIyIEluaXQKKworIHRSQ0QgICA9IDE1ICAgIG5zCisgdFJBUyAgID0gNDUgICAgbnMKKyB0UlJEICAgPSAxMCAgICBucworIHRSUCAgICA9IDE1ICAgIG5zCisgdFJGQyAgID0gMTA1bnMvNTEyTWJpdCwgMTI3LjVucy8xR2JpdCwgMTk3LjVucy8yR2JpdCwgMzI3LjVucy80R2JpdAorIHRSVFAgICA9IDcuNSAgIG5zCisgdFdSICAgID0gMTUgICAgbnMKKyB0WFNOUiAgPSAyMDAgICBucworIHRXVFIgICA9IDcuNSAgIG5zCisgdEZBVyAgID0gNTAgICAgbnMKKyB0TVJEICAgPSA0ICAgICBDSworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2RkcjJfaW5pdDoKKy8qIERlYnVnIC0gVUFSVCBjb25zb2xlIG1lc3NhZ2UgKi8KKyAgICBsZHIgcjAsID0weDFlNzg0MDAwCisgICAgbW92IHIxLCAjMHgzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnMicKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICdccicKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDBBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICdcbicKKyAgICBzdHIgcjEsIFtyMF0KKy8qIERlYnVnIC0gVUFSVCBjb25zb2xlIG1lc3NhZ2UgKi8KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMDQKKyAgICBsZHIgcjEsID0weDAwMDAwNTEwICAgICAgICAgICAgICAgICAgICAgICAgICBAIERlZmF1bHQgc2V0IHRvIDUxMk1iaXQKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMTAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgUkVHX0FDMQorICAgIGxkciByMSwgPTB4MzMzMDI3MTQgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNDA4IE1IegorI2lmIGRlZmluZWQoQ09ORklHX0RSQU1fMzM2KQorICAgIGxkciByMSwgPTB4MjIyMDE2MTMKKyNlbmRpZgorICAgIHN0ciByMSwgW3IwXQorCisgICAgLyogQ2hlY2sgRFJBTSBDTCBUaW1pbmcgYnkgSC9XIFRyYXBwaW5nICovCisgICAgbGRyIHIwLCA9MHgxZTZlMjA3MAorICAgIGxkciByMSwgW3IwXQorICAgIGJpYyByMSwgcjEsICMweEY5RkZGRkZGCisgICAgbW92IHIyLCByMSwgbHNyICM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgQ0wKKyAgICBtb3YgcjEsIHIyLCBsc3IgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBDV0wKKyAgICBvcnIgcjIsIHIyLCByMQorICAgIGxkciByMSwgPTB4MDAxMTAwMDAKKyAgICBhZGQgcjIsIHIyLCByMQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAxNCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBSRUdfQUMyCisgICAgbGRyIHIxLCA9MHhDQzAwQjAzRiAgICAgICAgICAgICAgICAgICAgICAgICAgQCA0MDggTUh6CisjaWYgZGVmaW5lZChDT05GSUdfRFJBTV8zMzYpCisgICAgbGRyIHIxLCA9MHhBQTAwOTAzQgorI2VuZGlmCisgICAgb3JyIHIxLCByMSwgcjIKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMDQgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY2hlY2sgMjQwMCBtb2RlCisgICAgbGRyIHIyLCBbcjBdCisgICAgbW92IHIyLCByMiwgbHNyICMxMAorCisgICAgbGRyIHIwLCA9MHgxZTZlMDA2YyAgICAgICAgICAgICAgICAgICAgICAgICAgQCBSRUdfSU9aCisgICAgbGRyIHIxLCA9MHgwMDAwMjMxMiAgICAgICAgICAgICAgICAgICAgICAgICAgQCA0MDggTUh6CisjaWYgZGVmaW5lZChDT05GSUdfRFJBTV8zMzYpCisgICAgbGRyIHIxLCA9MHgwMDAwMjMxMgorI2VuZGlmCisgICAgdHN0IHIyLCAjMHgwMQorICAgIG1vdmVxIHIxLCByMSwgbHNyICM4CisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMTIwCisgICAgbW92IHIxLCAjMQorICAgIHN0ciByMSwgW3IwXQorICAgIHRzdCByMiwgIzB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY2hlY2sgQVNUMjMwMAorICAgIGJlcSBDQlJETEwxXzIzMDBfU3RhcnQKKyAgICBsZHIgcjAsID0weDFlNmUyMDdjICAgICAgICAgICAgICAgICAgICAgICAgICBAIGNoZWNrIEFTVDI0MDAgcmV2aXNpb24gQTAKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsIHIxLCBsc3IgIzE2CisgICAgYW5kIHIxLCByMSwgIzB4RkYKKyAgICBjbXAgcjEsICMweDAKKyAgICBiZXEgQ0JSRExMMV8yMzAwX1N0YXJ0CisgICAgYiAgIENCUkRMTDFfMjQwMF9TdGFydAorTUNMSzJYX1BoYXNlX0NCUl9Eb25lX0REUjI6CisKKyAgICBsZHIgcjAsID0weDFlNmUwMDM0CisgICAgbGRyIHIxLCA9MHgwMDAwMDAwMQorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAwYworICAgIGxkciByMSwgPTB4MDAwMDAwMDAKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIC8qIERlbGF5IGFib3V0IDQwMHVzICovCisgICAgbGRyIHIyLCA9MHgwMDAwMDE5MCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgVGltZXIzIFJlbG9hZCA9IDQwMCB1cworICAgIGluaXRfZGVsYXlfdGltZXIKK2RlbGF5Ml80OgorICAgIGNoZWNrX2RlbGF5X3RpbWVyCisgICAgYm5lIGRlbGF5Ml80CisgICAgY2xlYXJfZGVsYXlfdGltZXIKKyAgICAvKiBlbmQgZGVsYXkgNDAwdXMgKi8KKworICAgIC8qIENoZWNrIERSQU0gQ0wgVGltaW5nIGJ5IEgvVyBUcmFwcGluZyAqLworICAgIGxkciByMCwgPTB4MWU2ZTIwNzAKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBiaWMgcjEsIHIxLCAjMHhGOUZGRkZGRgorICAgIG1vdiByMiwgcjEsIGxzciAjMjEgICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IENMCisgICAgbGRyIHIxLCA9MHgwMDAwMDA0MAorICAgIG9yciByMiwgcjIsIHIxCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDJjICAgICAgICAgICAgICAgICAgICAgICAgICBAIFJFR19NUlMKKyAgICBsZHIgcjEsID0weDAwMDAwRDAzICAgICAgICAgICAgICAgICAgICAgICAgICBAIDQwOCBNSHoKKyNpZiBkZWZpbmVkKENPTkZJR19EUkFNXzMzNikKKyAgICBsZHIgcjEsID0weDAwMDAwQjAzCisjZW5kaWYKKyAgICBvcnIgcjEsIHIxLCByMgorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAzMCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBSRUdfRU1SUworICAgIGxkciByMSwgPTB4MDAwMDAwNDAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNDA4IE1IegorI2lmIGRlZmluZWQoQ09ORklHX0RSQU1fMzM2KQorICAgIGxkciByMSwgPTB4MDAwMDAwNDAKKyNlbmRpZgorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAyOCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgRU1SUzIKKyAgICBsZHIgcjEsID0weDAwMDAwMDA1CisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDI4ICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBFTVJTMworICAgIGxkciByMSwgPTB4MDAwMDAwMDcKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMjggICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IEVNUlMKKyAgICBsZHIgcjEsID0weDAwMDAwMDAzCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDI4ICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBNUlMKKyAgICBsZHIgcjEsID0weDAwMDAwMDAxCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDBjICAgICAgICAgICAgICAgICAgICAgICAgICBAIFJlZnJlc2ggOCB0aW1lcworICAgIGxkciByMSwgPTB4MDAwMDVDMDgKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMmMgICAgICAgICAgICAgICAgICAgICAgICAgIEAgUkVHX01SUworICAgIGxkciByMSwgPTB4MDAwMDBDMDMgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNDA4IE1IegorI2lmIGRlZmluZWQoQ09ORklHX0RSQU1fMzM2KQorICAgIGxkciByMSwgPTB4MDAwMDBBMDMKKyNlbmRpZgorICAgIG9yciByMSwgcjEsIHIyCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDI4ICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBNUlMKKyAgICBsZHIgcjEsID0weDAwMDAwMDAxCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDMwICAgICAgICAgICAgICAgICAgICAgICAgICBAIFJFR19FTVJTCisgICAgbGRyIHIxLCA9MHgwMDAwMDNDMCAgICAgICAgICAgICAgICAgICAgICAgICAgQCA0MDggTUh6CisjaWYgZGVmaW5lZChDT05GSUdfRFJBTV8zMzYpCisgICAgbGRyIHIxLCA9MHgwMDAwMDNDMAorI2VuZGlmCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDI4ICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBFTVJTCisgICAgbGRyIHIxLCA9MHgwMDAwMDAwMworICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAzMCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBSRUdfRU1SUworICAgIGxkciByMSwgPTB4MDAwMDAwNDAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNDA4IE1IegorI2lmIGRlZmluZWQoQ09ORklHX0RSQU1fMzM2KQorICAgIGxkciByMSwgPTB4MDAwMDAwNDAKKyNlbmRpZgorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAyOCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgRU1SUworICAgIGxkciByMSwgPTB4MDAwMDAwMDMKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMGMgICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IHJlZnJlc2ggY3ljbGUKKyAgICBsZHIgcjEsID0weDAwMDAyMDAxCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDE0CisgICAgbGRyIHIxLCBbcjBdCisgICAgYmljIHIxLCByMSwgIzB4RkZGOUZGRkYKKyAgICBtb3YgcjIsIHIxLCBsc3IgIzMgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBDTAorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAzNCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBSRUdfUFdDCisgICAgbGRyIHIxLCA9MHgwMDAwMDUwMyAgICAgICAgICAgICAgICAgICAgICAgICAgQCA0MDggTUh6CisjaWYgZGVmaW5lZChDT05GSUdfRFJBTV8zMzYpCisgICAgbGRyIHIxLCA9MHgwMDAwMDUwMworI2VuZGlmCisgICAgb3JyIHIxLCByMSwgcjIKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGIgICBDYWxpYnJhdGlvbl9TdGFydAorLkxUT1JHCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRW5kIEREUjIgSW5pdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBERFIgQ0sgZHV0eSBmaW5ldHVuZSBwcm9ncmFtCisgICAgU1JBTSBidWZmZXIgZGVmaW5pdGlvbgorICAgIDB4MUU3MjAyMDQgOiBnZGxsICAgICBnb2xkZW4gRExMMSByZWNvcmQKKyAgICAweDFFNzIwMjA4IDogZ2R1dHkgICAgZ29sZGVuIGR1dHkgc2V0dGluZyByZWNvcmQKKyAgICAweDFFNzIwMjBDIDogZ2R1dHlzdW0gZ29sZGVuIGR1dHkgZGF0YSByZWNvcmQKKyAgICAweDFFNzIwMjEwIDogZHV0eSByZWNvcmQgb2YgZGVsYXkgMCAgaW52ZXJ0CisgICAgMHgxRTcyMDIxNCA6IGR1dHkgcmVjb3JkIG9mIGRlbGF5IDEgIGludmVydAorICAgIC4uLi4KKyAgICAweDFFNzIwMjRDIDogZHV0eSByZWNvcmQgb2YgZGVsYXkgMTUgaW52ZXJ0CisgICAgMHgxRTcyMDI1MCA6IGR1dHkgcmVjb3JkIG9mIGRlbGF5IDAKKyAgICAweDFFNzIwMjU0IDogZHV0eSByZWNvcmQgb2YgZGVsYXkgMQorICAgIC4uLi4KKyAgICAweDFFNzIwMjhDIDogZHV0eSByZWNvcmQgb2YgZGVsYXkgMTUKKworICAgIFJlZ2lzdGVyIHVzYWdlCisgICAgcjAgLSByMyA9IGZyZWUKKyAgICByNCAgPSByZWNvcmQgdGhlIHJldHVybiBwYyB2YWx1ZSwgZG8gbm90IHVzZQorICAgIHI1ICA9IGZyZWUKKyAgICByNiAgPSBmcmVlCisgICAgcjcgID0gZHV0eSBjb3VudAorICAgIHI4ICA9IGdkbGwKKyAgICByOSAgPSBnZHV0eQorICAgIHIxMCA9IGdkdXR5c3VtCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ0JSRExMMV8yNDAwX1N0YXJ0OgorICAgIGxkciAgIHIwLCA9MHgxZTZlMDEyMAorICAgIGxkciAgIHIxLCBbcjBdCisgICAgb3JyICAgcjEsIHIxLCAjMHgwMgorICAgIHN0ciAgIHIxLCBbcjBdCisKKyAgICBsZHIgICByMSwgPTB4MDAwMDAwMDAKKyAgICBsZHIgICByMCwgPTB4MWU3MjAyMDQKKyAgICBsZHIgICByMiwgPTB4MWU3MjAyYTAKK2luaXRfc3JhbV9zdGFydDA6CisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBhZGQgICByMCwgcjAsICM0CisgICAgY21wICAgcjAsIHIyCisgICAgYmx0ICAgaW5pdF9zcmFtX3N0YXJ0MAorCisgICAgbGRyICAgcjAsID0weDFlNmUwMDM0CisgICAgbW92ICAgcjEsICMweDIwCisgICAgc3RyICAgcjEsIFtyMF0KKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDA2MAorICAgIGxkciAgIHIxLCBbcjBdCisgICAgbW92ICAgcjIsICMweDAxCisgICAgb3JyICAgcjEsIHIxLCByMiwgbHNsICMxMworICAgIHN0ciAgIHIxLCBbcjBdCisKKyAgICBtb3YgICByNywgIzB4MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgZHV0eSBjb3VudAorICAgIG1vdiAgIHI4LCAjMHgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBnZGxsCisgICAgbW92ICAgcjksICMweDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IGdkdXR5CisgICAgbW92ICAgcjEwLCAjMHgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IGdkdXR5c3VtCitjYnJkbGwxX2R1dHlfc3RhcnQ6CisgICAgY21wICAgcjcsICMzMgorICAgIGJnZSAgIGNicmRsbDFfZHV0eV9lbmQKKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDAxOAorICAgIGxkciAgIHIxLCA9MHgwMDAwODEyMAorICAgIHN0ciAgIHIxLCBbcjBdCisKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwNjAKKyAgICBsZHIgICByMSwgW3IwXQorICAgIGJpYyAgIHIxLCByMSwgIzB4MDAwMDFGMDAKKyAgICBvcnIgICByMSwgcjEsIHI3LCBsc2wgIzgKKyAgICBtb3YgICByMiwgIzB4MTAKKyAgICBlb3IgICByMSwgcjEsIHIyLCBsc2wgIzgKKyAgICBzdHIgICByMSwgW3IwXQorCisgICAgbGRyICAgcjAsID0weDFlNmUwMDAwICAgICAgICAgICAgICAgICAgICAgICAgQCBkdW1teSByZWFkCisgICAgbGRyICAgcjEsIFtyMF0KKworICAgIGIgICAgIENCUkRMTDFfMjMwMF9TdGFydAorQ0JSRExMMV8yNDAwX0NhbGw6CisKKyAgICBtb3YgICByNSwgIzB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgZHFpZGx5IGNvdW50CisgICAgbW92ICAgcjYsICMweDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IGR1dHkgc3VtCitjYnJkbGwxX2R1dHlfY2FsX3N0YXJ0OgorICAgIGNtcCAgIHI1LCAjMHgwNQorICAgIGJnZSAgIGNicmRsbDFfZHV0eV9jYWxfZW5kCisKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwMTgKKyAgICBsZHIgICByMSwgPTB4MDAyMDAxMjAKKyAgICBvcnIgICByMSwgcjEsIHI1LCBsc2wgIzE2CisgICAgc3RyICAgcjEsIFtyMF0KKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDAwMAorICAgIGxkciAgIHIxLCBbcjBdCisKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwMTgKKyAgICBsZHIgICByMSwgW3IwXQorICAgIG1vdiAgIHIyLCAjMHgxMAorICAgIG9yciAgIHIxLCByMSwgcjIsIGxzbCAjMjQKKyAgICBzdHIgICByMSwgW3IwXQorCisgICAgbGRyICAgcjAsID0weDFlNmUwMDgwCisgICAgbGRyICAgcjEsID0weDgwMDAwMDAwICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IGR1dHkgY2FsIHdhaXRpbmcKK2NicmRsbDFfZHV0eV9jYWxfd2FpdDoKKyAgICBsZHIgICByMiwgW3IwXQorICAgIHRzdCAgIHIyLCByMQorICAgIGJlcSAgIGNicmRsbDFfZHV0eV9jYWxfd2FpdAorCisgICAgbGRyICAgcjAsID0weDFlNmUwMDhjCisgICAgbGRyICAgcjIsIFtyMF0KKworICAgIGxkciAgIHIwLCA9MHgxZTcyMDIxMAorICAgIGFkZCAgIHIwLCByMCwgcjcsIGxzbCAjMgorICAgIHN0ciAgIHIyLCBbcjBdCisKKyAgICBsZHIgICByMSwgPTB4RkZGRgorICAgIGFuZCAgIHIzLCByMSwgcjIKKyAgICBjbXAgICByMywgcjEKKyAgICBtb3ZlcSByMiwgcjIsIGxzciAjMTYKKyAgICBhbmQgICByMywgcjEsIHIyCisgICAgYWRkICAgcjYsIHI2LCByMworICAgIGxkciAgIHIxLCA9MHhGMDAwCisgICAgY21wICAgcjMsIHIxCisgICAgYmx0ICAgY2JyZGxsMV9kdXR5X2NhbF9lbmQKKyAgICBhZGQgICByNSwgcjUsICMweDAxCisgICAgYiAgICAgY2JyZGxsMV9kdXR5X2NhbF9zdGFydAorCitjYnJkbGwxX2R1dHlfY2FsX2VuZDoKKyAgICBtb3YgICByNiwgcjYsIGxzciAjMiAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBkdXR5c3VtCisgICAgY21wICAgcjYsIHIxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjaGVjayBkdXR5c3VtID4gZ2R1dHlzdW0KKyAgICBibGUgICBjYnJkbGwxX2R1dHlfbmV4dAorICAgIGxkciAgIHIwLCA9MHgxZTZlMDA2OAorICAgIGxkciAgIHI4LCBbcjBdCisgICAgZW9yICAgcjksIHI3LCAjMHgxMAorICAgIG1vdiAgIHIxMCwgcjYKKworY2JyZGxsMV9kdXR5X25leHQ6CisgICAgYWRkICAgcjcsIHI3LCAjMHgwMQorICAgIGNtcCAgIHI3LCAjMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY2hlY2sgZHV0eSA+PSAxNQorICAgIGJsdCAgIGNicmRsbDFfZHV0eV9zdGFydAorICAgIGxkciAgIHIwLCA9MHhGQTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY2hlY2sgZ2R1dHlzdW0gPiAweEZBMDAKKyAgICBjbXAgICByMTAsIHIwCisgICAgYmx0ICAgY2JyZGxsMV9kdXR5X3N0YXJ0CisKK2NicmRsbDFfZHV0eV9lbmQ6CisgICAgbGRyICAgcjAsID0weDFlNmUwMDYwCisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBiaWMgICByMSwgcjEsICMweDAwMDAxRjAwCisgICAgb3JyICAgcjEsIHIxLCByOSwgbHNsICM4CisgICAgc3RyICAgcjEsIFtyMF0KKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDA2OAorICAgIGJpYyAgIHI4LCByOCwgIzB4RkYwMDAwMDAKKyAgICBiaWMgICByOCwgcjgsICMweDAwRkYwMDAwCisgICAgc3RyICAgcjgsIFtyMF0KKworICAgIGxkciAgIHIwLCA9MHgxZTcyMDIwNCAgICAgICAgICAgICAgICAgICAgICAgIEAgcmVjb3JkIHJlc3VsdAorICAgIHN0ciAgIHI4LCBbcjBdCisgICAgYWRkICAgcjAsIHIwLCAjMHgwNAorICAgIHN0ciAgIHI5LCBbcjBdCisgICAgYWRkICAgcjAsIHIwLCAjMHgwNAorICAgIHN0ciAgIHIxMCwgW3IwXQorCisgICAgbGRyICAgcjAsID0weDFlNmUwMDE4CisgICAgbGRyICAgcjEsID0weDAwMDA4MTIwCisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwMDAgICAgICAgICAgICAgICAgICAgICAgICBAIGR1bW15IHJlYWQKKyAgICBsZHIgICByMSwgW3IwXQorICAgIGxkciAgIHIwLCA9MHgxZTZlMDAxOAorICAgIGxkciAgIHIxLCA9MHgwMDAwMDEyMAorICAgIHN0ciAgIHIxLCBbcjBdCisKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAxMjAKKyAgICBsZHIgICByMSwgW3IwXQorICAgIGNtcCAgIHIxLCAjMHgzCisgICAgYmVxICAgTUNMSzJYX1BoYXNlX0NCUl9Eb25lX0REUjIKKyAgICBiICAgICBNQ0xLMlhfUGhhc2VfQ0JSX0RvbmVfRERSMworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgTUNMSzJYIGxvY2sgdG8gTUNMSyBwcm9ncmFtCisgIHIwIC0gcjMgPSBmcmVlCisgIHI1ID0gbWFkam1heAorICByNiA9IGRsbGVuZAorICAweDFFNzIwMjAwID0gMHg5NmNudDpmYWlsY250OmRsbG1heDpkbGxtaW4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDQlJETEwxXzIzMDBfU3RhcnQ6CisgICAgbGRyICAgcjAsID0weDFlNmUwMDY0CisgICAgbGRyICAgcjUsIFtyMF0KKyAgICBhbmQgICByNSwgcjUsICMweEZGICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgbWFkam1heAorICAgIG1vdiAgIHI2LCByNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBkbGxlbmQKKworICAgIGxkciAgIHIxLCA9MHgwMDAwMDBmZgorICAgIGxkciAgIHIwLCA9MHgxZTcyMDIwMAorICAgIHN0ciAgIHIxLCBbcjBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBkbGxjbnQyOmRsbG1heDpkbGxtaW4KKworICAgIG1vdiAgIHIzLCAjMHgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBsb29wIGNvdW50CitjYnJkbGwxX3NjYW5fc3RhcnQ6CisgICAgY21wICAgcjMsIHI2CisgICAgYmdlICAgY2JyZGxsMV9zY2FuX2VuZAorCisgICAgbGRyICAgcjAsID0weDFlNmUwMDE4CisgICAgbGRyICAgcjEsID0weDAwMDA4MTIwCisgICAgc3RyICAgcjEsIFtyMF0KKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDA2OAorICAgIG1vdiAgIHIxLCByMworICAgIGNtcCAgIHIxLCByNQorICAgIHN1YmdlIHIxLCByMSwgcjUKKyAgICBzdHIgICByMSwgW3IwXQorCisgICAgbGRyICAgcjAsID0weDFlNmUwMDAwICAgICAgICAgICAgICAgICAgICAgICAgQCBkdW1teSByZWFkCisgICAgbGRyICAgcjEsIFtyMF0KKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDAxOAorICAgIGxkciAgIHIxLCA9MHgwMDAwMDEyMAorICAgIHN0ciAgIHIxLCBbcjBdCisKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwMDAgICAgICAgICAgICAgICAgICAgICAgICBAIGR1bW15IHJlYWQKKyAgICBsZHIgICByMSwgW3IwXQorICAgIGxkciAgIHIwLCA9MHgxZTZlMDAwMCAgICAgICAgICAgICAgICAgICAgICAgIEAgZHVtbXkgcmVhZAorICAgIGxkciAgIHIxLCBbcjBdCisKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwMWMKKyAgICBsZHIgICByMSwgW3IwXQorICAgIG1vdiAgIHIxLCByMSwgbHNyICMxNgorICAgIGFuZCAgIHIxLCByMSwgIzB4RkYKKworICAgIGFuZCAgIHIyLCByMSwgIzB4OTYKKyAgICBjbXAgICByMiwgIzB4OTYKKyAgICBiZXEgICBjYnJkbGwxX3NjYW5fcGFzcyAgICAgICAgICAgICAgICAgICAgICBAIGlmIChtY2xrMnhfcGhhc2UgJiAweDk2KSA9PSAweDk2CisgICAgbGRyICAgcjAsID0weDFlNzIwMjAwCisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBtb3YgICByMiwgcjEsIGxzciAjOAorICAgIGFuZHMgIHIyLCByMiwgIzB4RkYgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZ2V0IGRsbG1heAorICAgIGJlcSAgIGNicmRsbDFfc2Nhbl9uZXh0ICAgICAgICAgICAgICAgICAgICAgIEAgaWYgZGxsbWF4ID09IDAKKyAgICBtb3YgICByMiwgcjEsIGxzciAjMTYKKyAgICBhbmQgICByMiwgcjIsICMweEZGCisgICAgYWRkICAgcjIsIHIyLCAjMHgwMQorICAgIGNtcCAgIHIyLCAjMHgwMgorICAgIG1vdmdlIHI2LCByMworICAgIGJpYyAgIHIxLCByMSwgIzB4MDBGRjAwMDAKKyAgICBvcnIgICByMSwgcjEsIHIyLCBsc2wgIzE2CisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBiICAgICBjYnJkbGwxX3NjYW5fbmV4dAorCitjYnJkbGwxX3NjYW5fcGFzczoKKyAgICBjbXAgICByMywgIzB4MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGlmIGRsbCA9IDAKKyAgICBtb3ZlcSByMywgIzB4MEYKKyAgICBhZGRlcSByNiwgcjYsICMweDEwCisgICAgYmVxICAgY2JyZGxsMV9zY2FuX25leHQKKyAgICBsZHIgICByMCwgPTB4MWU3MjAyMDAKKyAgICBsZHIgICByMiwgW3IwXQorICAgIGNtcCAgIHIxLCAjMHg5NgorICAgIGJuZSAgIGNicmRsbDFfc2Nhbl9wYXNzMgorICAgIG1vdiAgIHIxLCByMiwgbHNyICMyNAorICAgIGFkZCAgIHIxLCByMSwgIzB4MDEKKyAgICBiaWMgICByMiwgcjIsICMweEZGMDAwMDAwCisgICAgb3JyICAgcjIsIHIyLCByMSwgbHNsICMyNAorICAgIGNtcCAgIHIxLCAjMHgwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY2hlY2sgKHBoYXNlID09IDB4OTYpIGNvdW50ID09IDMKKyAgICBiaWNnZSByMiwgcjIsICMweDAwMDBGRjAwCisgICAgYmljZ2UgcjIsIHIyLCAjMHgwMDAwMDBGRgorICAgIG9ycmdlIHIyLCByMiwgcjMsIGxzbCAjOAorICAgIG9ycmdlIHIyLCByMiwgcjMKKyAgICBzdHIgICByMiwgW3IwXQorICAgIGJnZSAgIGNicmRsbDFfc2Nhbl9lbmQKKworY2JyZGxsMV9zY2FuX3Bhc3MyOgorICAgIGFuZCAgIHIxLCByMiwgIzB4RkYgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaWYoZGxsbWluID4gZGxsKQorICAgIGNtcCAgIHIxLCByMworICAgIGJpY2d0IHIyLCByMiwgIzB4MDAwMDAwRkYKKyAgICBvcnJndCByMiwgcjIsIHIzCisKKyAgICBtb3YgICByMSwgcjIsIGxzciAjOCAgICAgICAgICAgICAgICAgICAgICAgICBAIGlmKGRsbG1heCA8IGRsbCkKKyAgICBhbmQgICByMSwgcjEsICMweEZGCisgICAgY21wICAgcjEsIHIzCisgICAgYmljbHQgcjIsIHIyLCAjMHgwMDAwRkYwMAorICAgIG9ycmx0IHIyLCByMiwgcjMsIGxzbCAjOAorCisgICAgYmljICAgcjIsIHIyLCAjMHgwMEZGMDAwMAorICAgIHN0ciAgIHIyLCBbcjBdCisKK2NicmRsbDFfc2Nhbl9uZXh0OgorICAgIGFkZCAgIHIzLCByMywgIzB4MDEKKyAgICBiICAgICBjYnJkbGwxX3NjYW5fc3RhcnQKKworY2JyZGxsMV9zY2FuX2VuZDoKKyAgICBsZHIgICByMCwgPTB4MWU3MjAyMDAKKyAgICBsZHIgICByMSwgW3IwXQorICAgIG1vdiAgIHIyLCByMSwgbHNyICM4ICAgICAgICAgICAgICAgICAgICAgICAgIEAgZ2V0IGRsbG1heAorICAgIGFuZHMgIHIyLCByMiwgIzB4RkYKKyAgICBibmUgICBjYnJkbGwxX3NjYW5fZG9uZSAgICAgICAgICAgICAgICAgICAgICBAIGlmKGRsbG1heCAhPSAwKQorICAgIGxkciAgIHIwLCA9MHgxZTZlMDA2NAorICAgIGxkciAgIHIzLCBbcjBdCisgICAgYmljICAgcjEsIHIzLCAjMHgwMDBDMDAwMAorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgYWRkICAgcjAsIHIwLCAjMHgwNAorICAgIG1vdiAgIHIxLCAjMHgwCisgICAgc3RyICAgcjEsIFtyMF0KKworICAgIC8qIERlbGF5IGFib3V0IDEwdXMgKi8KKyAgICBsZHIgcjIsID0weDAwMDAwMDBBICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBUaW1lcjMgUmVsb2FkID0gMTAgdXMKKyAgICBpbml0X2RlbGF5X3RpbWVyCitkZWxheTBfMToKKyAgICBjaGVja19kZWxheV90aW1lcgorICAgIGJuZSBkZWxheTBfMQorICAgIGNsZWFyX2RlbGF5X3RpbWVyCisgICAgLyogZW5kIGRlbGF5IDEwdXMgKi8KKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDA2NAorICAgIHN0ciAgIHIzLCBbcjBdCisKKyAgICAvKiBEZWxheSBhYm91dCAxMHVzICovCisgICAgbGRyIHIyLCA9MHgwMDAwMDAwQSAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgVGltZXIzIFJlbG9hZCA9IDEwIHVzCisgICAgaW5pdF9kZWxheV90aW1lcgorZGVsYXkwXzI6CisgICAgY2hlY2tfZGVsYXlfdGltZXIKKyAgICBibmUgZGVsYXkwXzIKKyAgICBjbGVhcl9kZWxheV90aW1lcgorICAgIC8qIGVuZCBkZWxheSAxMHVzICovCisKKyAgICBiICAgICBDQlJETEwxXzIzMDBfU3RhcnQKKworY2JyZGxsMV9zY2FuX2RvbmU6CisgICAgYW5kICAgcjEsIHIxLCAjMHhGRgorICAgIGFkZCAgIHIxLCByMSwgcjIKKyAgICBtb3YgICByNiwgcjEsIGxzciAjMSAgICAgICAgICAgICAgICAgICAgICAgICBAIGRsbDEuMCA9IChkbGxtaW4gKyBkbGxtYXgpID4+IDEKKyAgICBjbXAgICByNiwgcjUKKyAgICBzdWJnZSByNiwgcjYsIHI1CisgICAgYWRkICAgcjMsIHI2LCByNSwgbHNyICMyICAgICAgICAgICAgICAgICAgICAgQCBkbGwxLjEgPSBkbGwxLjAgKyAoTUFESiA+PiAyKQorCisgICAgbGRyICAgcjAsID0weDFlNmUwMDA0CisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBtb3YgICByMSwgcjEsIGxzciAjMTAKKyAgICB0c3QgICByMSwgIzB4MQorICAgIGJuZSAgIGNicmRsbDFfc2Nhbl9zZXRfMjQwMAorICAgIGNtcCAgIHIzLCByNQorICAgIHN1YmdlIHIzLCByMywgcjUKKyAgICBtb3YgICByMiwgIzB4MAorICAgIHRzdCAgIHIzLCAjMHgwOAorICAgIGJlcSAgIGNicmRsbDFfc2Nhbl9zZXRfMjMwMF8yICAgICAgICAgICAgICAgIEAgaWYgIShkbGwgJiA4KQorY2JyZGxsMV9zY2FuX3NldF8yMzAwXzE6ICAgICAgICAgICAgICAgICAgICAgICAgIEAgaWYgIChkbGwgJiA4KQorICAgIG1vdiAgIHIxLCAjMHgwCisgICAgdHN0ICAgcjMsICMweDA4CisgICAgYWRkZXEgcjEsIHIxLCAjMHgwMQorICAgIGNtcCAgIHIyLCAjMHgwNQorICAgIGFkZGdlIHIxLCByMSwgIzB4MDEKKyAgICBjbXAgICByMSwgIzB4MDIKKyAgICBiZXEgICBjYnJkbGwxX3NjYW5fc2V0CisgICAgYWRkICAgcjIsIHIyLCAjMHgwMQorICAgIGFkZCAgIHIzLCByMywgIzB4MDEKKyAgICBjbXAgICByMywgcjUKKyAgICBzdWJnZSByMywgcjMsIHI1CisgICAgYiAgICAgY2JyZGxsMV9zY2FuX3NldF8yMzAwXzEKKworY2JyZGxsMV9zY2FuX3NldF8yMzAwXzI6CisgICAgYW5kICAgcjEsIHIzLCAjMHgwNworICAgIGNtcCAgIHIxLCAjMHgwNworICAgIGJlcSAgIGNicmRsbDFfc2Nhbl9zZXQKKyAgICBjbXAgICByMiwgIzB4MDUKKyAgICBiZ2UgICBjYnJkbGwxX3NjYW5fc2V0CisgICAgYWRkICAgcjIsIHIyLCAjMHgwMQorICAgIGFkZCAgIHIzLCByMywgIzB4MDEKKyAgICBjbXAgICByMywgcjUKKyAgICBzdWJnZSByMywgcjMsIHI1CisgICAgYiAgICAgY2JyZGxsMV9zY2FuX3NldF8yMzAwXzIKKworY2JyZGxsMV9zY2FuX3NldF8yNDAwOgorICAgIGFkZCAgIHIzLCByMywgIzB4MDUgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZGxsMS4xID0gZGxsMS4wICsgKE1BREogPj4gMikgKyA1CisgICAgY21wICAgcjMsIHI1CisgICAgc3ViZ2UgcjMsIHIzLCByNQorCitjYnJkbGwxX3NjYW5fc2V0OgorICAgIG9yciAgIHIxLCByNiwgcjMsIGxzbCAjOAorICAgIGxkciAgIHIwLCA9MHgxZTZlMDA2OAorICAgIHN0ciAgIHIxLCBbcjBdCisKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAxMjAKKyAgICBsZHIgICByMSwgW3IwXQorICAgIGNtcCAgIHIxLCAjMHgwCisgICAgYmVxICAgTUNMSzJYX1BoYXNlX0NCUl9Eb25lX0REUjMKKyAgICBjbXAgICByMSwgIzB4MQorICAgIGJlcSAgIE1DTEsyWF9QaGFzZV9DQlJfRG9uZV9ERFIyCisgICAgYiAgICAgQ0JSRExMMV8yNDAwX0NhbGwKKworLkxUT1JHCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBDYWxpYnJhdGlvbiBDb2RlIFN0YXJ0CisgICAgU1JBTSBidWZmZXIgZGVmaW5pdGlvbgorICAgIDB4MUU3MjAwMDAgOiBQYXNzIDEsIERMTEkgTUlOIHZhbHVlIHJhbmdlCisgICAgMHgxRTcyMDAwOCA6IERRUzAgRExMIHZhbGlkIHJhbmdlLCAybmQgdGltZSBDQlIKKyAgICAweDFFNzIwMDBDIDogRFFTMSBETEwgdmFsaWQgcmFuZ2UsIDJuZCB0aW1lIENCUgorICAgIDB4MUU3MjAwMTAgOiBEUTAgIERMTCB2YWxpZCByYW5nZSwgUGFzcyAxCisgICAgMHgxRTcyMDAxNCA6IERRMSAgRExMIHZhbGlkIHJhbmdlLCBQYXNzIDEKKyAgICAuLi4uCisgICAgMHgxRTcyMDA0OCA6IERRMTQgRExMIHZhbGlkIHJhbmdlLCBQYXNzIDEKKyAgICAweDFFNzIwMDRDIDogRFExNSBETEwgdmFsaWQgcmFuZ2UsIFBhc3MgMQorICAgIDB4MUU3MjAwOTAgOiBETEwxIFNBZGogcmVjb3JkCisgICAgMHgxRTcyMDA5NCA6IERRTCAgUGFzczEgZmluZXR1bmUgcmVzdWx0CisgICAgMHgxRTcyMDA5OCA6IERRSCAgUGFzczEgZmluZXR1bmUgcmVzdWx0CisgICAgMHgxRTcyMDA5QyA6IERSQU0gaW5pdGlhbCB0aW1lLCAodXMpCisgICAgMHgxRTcyMDBBMCA6IENCUjMgcmV0cnkgY291bnRlcgorICAgIDB4MUU3MjAwQTQgOiBEUkFNIGluaXRpYWwgdGltZSwgKHVzKQorICAgIDB4MUU3MjAwQTggOiBSZWxlYXNlZCBkYXRlCisgICAgMHgxRTcyMDBBQyA6IFJlbGVhc2VkIFNESyB2ZXJzaW9uCisgICAgMHgxRTcyMDBCMCA6IERRUyBpbnB1dCBtYXNrIHdpbmRvdyBmb3IgTUNSMThbNF0gPSAwCisgICAgMHgxRTcyMDBCNCA6IERRUyBpbnB1dCBtYXNrIHdpbmRvdyBmb3IgTUNSMThbNF0gPSAxCisgICAgMHgxRTcyMDEwMCA6IERRSURMWT0wMCwgRExMIHZhbGlkIHJhbmdlCisgICAgMHgxRTcyMDEwNCA6IERRSURMWT0wMSwgRExMIHZhbGlkIHJhbmdlCisgICAgLi4uLgorICAgIDB4MUU3MjAxNzggOiBEUUlETFk9MzAsIERMTCB2YWxpZCByYW5nZQorICAgIDB4MUU3MjAxN0MgOiBEUUlETFk9MzEsIERMTCB2YWxpZCByYW5nZQorICAgIDB4MUU3MjAxODAgOiBEUVNJLU1DTEsyWCBQLXBoYXNlIHBhc3MgcmVjb3JkIERMTDI9IDAtMzEKKyAgICAweDFFNzIwMTg0IDogRFFTSS1NQ0xLMlggUC1waGFzZSBwYXNzIHJlY29yZCBETEwyPTMyLTYzCisgICAgMHgxRTcyMDE4OCA6IERRU0ktTUNMSzJYIE4tcGhhc2UgcGFzcyByZWNvcmQgRExMMj0gMC0zMQorICAgIDB4MUU3MjAxOEMgOiBEUVNJLU1DTEsyWCBOLXBoYXNlIHBhc3MgcmVjb3JkIERMTDI9MzItNjMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDYWxpYnJhdGlvbl9TdGFydF9wcmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBUb2dnbGUgRFFTSSBtYXNrIGRlbGF5CisgICAgbGRyIHIwLCA9MHgxZTZlMDAxOAorICAgIGxkciByMSwgW3IwXQorICAgIGVvciByMSwgcjEsICMweDEwCisgICAgc3RyIHIxLCBbcjBdCisKK0NhbGlicmF0aW9uX1N0YXJ0OgorLyogSW5pdCBTUkFNIGJ1ZmZlciAqLworICAgIGxkciByMSwgPTB4MDAwMDAwZmYKKyAgICBsZHIgcjAsID0weDFlNzIwMDAwCisgICAgbGRyIHIyLCA9MHgxZTcyMDEwMAoraW5pdF9zcmFtX3N0YXJ0OgorICAgIHN0ciByMSwgW3IwXQorICAgIGFkZCByMCwgcjAsICM0CisgICAgY21wIHIwLCByMgorICAgIGJsdCBpbml0X3NyYW1fc3RhcnQKKworICAgIGxkciByMSwgPTB4MDBmZjAwZmYKKyAgICBsZHIgcjAsID0weDFlNzIwMTAwCisgICAgbGRyIHIyLCA9MHgxZTcyMDE4MAoraW5pdF9zcmFtX3N0YXJ0MjoKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBhZGQgcjAsIHIwLCAjNAorICAgIGNtcCByMCwgcjIKKyAgICBibHQgaW5pdF9zcmFtX3N0YXJ0MgorCisgICAgbGRyIHIxLCA9MHgwMDAwMDAwMAorICAgIGxkciByMCwgPTB4MWU3MjAxODAKKyAgICBsZHIgcjIsID0weDFlNzIwMjAwCitpbml0X3NyYW1fc3RhcnQzOgorICAgIHN0ciByMSwgW3IwXQorICAgIGFkZCByMCwgcjAsICM0CisgICAgY21wIHIwLCByMgorICAgIGJsdCBpbml0X3NyYW1fc3RhcnQzCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDY4ICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNhdmUgdGhlIERMTDEgU0FkaiBpbml0aWFsIHZhbHVlCisgICAgbGRyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTcyMDA5MAorICAgIHN0ciByMSwgW3IwXQorCisvKiBTdGFydAorICByMCA9IGZyZWUKKyAgcjEgPSBmcmVlCisgIHIyID0gZnJlZQorICByMyA9IGZyZWUKKyAgcjQgPSByZWNvcmQgdGhlIHJldHVybiBwYyB2YWx1ZSwgZG8gbm90IHVzZQorICByNSA9IHBhdHRlcm4gdGFibGUgaW5kZXgKKyAgcjYgPSBwYXNzIGNvdW50CisgIHI3ID0gZHJhbSBETEwyIHBhcmFtZXRlciBpbmRleCAoMHgxZTZlMDA2OCksIG1heCBpcyAweDRDCisqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZpbmUgRFFJIGRlbGF5IGFuZCBEUVNJLU1DTEsgcGhhc2UKKyAgcjggID0gRFFJRExZIGNvdW50CisgIHI5ICA9IERRU0ktTUNMSzJYIHBoYXNlIGNvdW50CisgIHIxMCA9IHBhdHRlcm4gZmFpbCByZXRyeSBjb3VudGVyLCBpbml0aWFsaXplIHRvIDIgKGZhaWwgMiB0aW1lcykKKyAgcjExID0gcGFzc2NudCBhY2N1bXVsYXRvciBmb3IgZWFjaCBEUUlETFkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NCUjBfU1RBUlQ6CisvKiBEZWJ1ZyAtIFVBUlQgY29uc29sZSBtZXNzYWdlICovCisgICAgbGRyIHIwLCA9MHgxZTc4NDAwMAorICAgIG1vdiByMSwgIzB4NDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ0MnCisgICAgc3RyIHIxLCBbcjBdCisgICAgbW92IHIxLCAjMHg0MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnQicKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICdSJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4MzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJzAnCisgICAgc3RyIHIxLCBbcjBdCisgICAgbW92IHIxLCAjMHgyRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnLScKKyAgICBzdHIgcjEsIFtyMF0KKy8qIERlYnVnIC0gVUFSVCBjb25zb2xlIG1lc3NhZ2UgKi8KKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDAxOAorICAgIGxkciAgIHIxLCBbcjBdCisgICAgYmljICAgcjEsIHIxLCAjMHhGRjAwMDAwMAorICAgIGJpYyAgIHIxLCByMSwgIzB4MDBGRjAwMDAKKyAgICBzdHIgICByMSwgW3IwXQorCisgICAgbGRyICAgcjAsID0weDFlNmUwMDc0ICAgICAgICAgICAgICAgICAgICAgICAgQCBzZXQgdGhlIHRlc3RpbmcgRFJBTSBzaXplID0gMUtCCisgICAgbGRyICAgcjEsID0weDAwMDAwM0ZGCisgICAgc3RyICAgcjEsIFtyMF0KKworICAgIG1vdiAgIHI4LCAjMHgwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBEUUlETFkKKyAgICBtb3YgICByOSwgIzB4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgRFFTSS1NQ0xLMlggcGhhc2UKKyAgICBtb3YgICByMTEsICMweDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgcGFzc2NudCBhY2N1bXVsYXRvcgorCitjYnIwX25leHRfZHFpZGx5OgorICAgIGNtcCAgIHI5LCAjMHgwMAorICAgIGJuZSAgIGNicjBfbmV4dF9kcXNpcGhhc2UKKyAgICBjbXAgICByMTEsICMweDAwCisgICAgYWRkZXEgcjgsIHI4LCAjMHgwMSAgICAgICAgICAgICAgICAgICAgICAgICAgQCBqdW1wIDEgc3RhZ2UgaWYgbm8gcGFzcyBhdCBwcmV2aW91cyBzdGFnZQorICAgIG1vdiAgIHIxMSwgIzB4MDAKKyAgICBhZGQgICByOCwgcjgsICMweDAxCisgICAgY21wICAgcjgsICMweDFGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBtYXggRFFJRExZID0gMzEKKyAgICBiZ3QgICBDQlIwX0VORAorCisvKiBEZWJ1ZyAtIFVBUlQgY29uc29sZSBtZXNzYWdlICovCisgICAgbGRyICAgcjAsID0weDFlNzg0MDAwCisgICAgYW5kICAgcjEsIHI4LCAjMHgwNworICAgIGFkZCAgIHIxLCByMSwgIzB4MzAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJzAtNycKKyAgICBzdHIgICByMSwgW3IwXQorLyogRGVidWcgLSBVQVJUIGNvbnNvbGUgbWVzc2FnZSAqLworCisgICAgbGRyICAgcjAsID0weDFlNmUwMDE4CisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBiaWMgICByMSwgcjEsICMweDAwRkYwMDAwCisgICAgb3JyICAgcjEsIHIxLCByOCwgbHNsICMxNgorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbW92ICAgcjksICMweDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnMSc6cF9waGFzZSwgJzAnOm5fcGhhc2UKKworICAgIC8qIERlbGF5IGFib3V0IDN1cyAqLyAgICAgICAgICAgICAgICAgICAgICAgIEAgd2FpdCBEUUlETFkgbG9hZAorICAgIGxkciByMiwgPTB4MDAwMDAwMDMgICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IFRpbWVyNCBSZWxvYWQgPSAzIHVzCisgICAgaW5pdF9kZWxheV90aW1lcgorZGVsYXlfNDoKKyAgICBjaGVja19kZWxheV90aW1lcgorICAgIGJuZSBkZWxheV80CisgICAgY2xlYXJfZGVsYXlfdGltZXIKKyAgICAvKiBlbmQgZGVsYXkgM3VzICovCisKKyAgICBiICAgICBjYnIwX2RsbDJfc2Nhbl9zdGFydAorCitjYnIwX25leHRfZHFzaXBoYXNlOgorICAgIGxkciAgIHIwLCA9MHgxZTZlMDAxOAorICAgIGxkciAgIHIxLCBbcjBdCisgICAgb3JyICAgcjEsIHIxLCByOSwgbHNsICMyMyAgICAgICAgICAgICAgICAgICAgQCBzZXQgRFFTSS1NQ0xLMlggcGhhc2UKKyAgICBzdHIgICByMSwgW3IwXQorICAgIG1vdiAgIHI5LCAjMHgwMAorCitjYnIwX2RsbDJfc2Nhbl9zdGFydDoKKyAgICBtb3YgICByNiwgIzB4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgcGFzcyBjb3VudAorICAgIG1vdiAgIHI3LCAjMHgwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBETEwyIHBhcmFtZXRlciBpbmRleAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIERMTDIgZGVsYXkgbWFyZ2luIHRlc3QgbG9vcAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NicjBfbmV4dF9kbGwyX3BhcmFtZXRlcjoKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwNjggICAgICAgICAgICAgICAgICAgICAgICBAIGxvYWQgRExMMiBwYXJhbWV0ZXIKKyAgICBsZHIgICByMSwgW3IwXQorICAgIGJpYyAgIHIxLCByMSwgIzB4MDBGRjAwMDAKKyAgICBiaWMgICByMSwgcjEsICMweEZGMDAwMDAwCisgICAgb3JyICAgcjEsIHIxLCByNywgbHNsICMxNgorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbGRyICAgcjIsID0weDQwNDA0MDQwICAgICAgICAgICAgICAgICAgICAgICAgQCBETEwyIG1heCBpcyAweDQwNDA0MDQwCisgICAgY21wICAgcjcsIHIyCisgICAgYmdlICAgY2JyMF9uZXh0X2RxaWRseQorICAgIGxkciAgIHIyLCA9MHgwMTAxMDEwMQorICAgIGFkZCAgIHI3LCByNywgcjIKKworLyogQ0JSU2NhbjMoKSBzdGFydCAqLworICAgIGFkcmwgIHI1LCBQQVRURVJOX1RBQkxFICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBwYXR0ZXJuIHRhYmxlIGluZGV4CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFRlc3QgcGF0dGVybiBpdGVyYXRpb24gbG9vcAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NicjBfbmV4dF90ZXN0X3BhdHRlcm46CisgICAgbW92ICAgcjEwLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzZXQgdGhlIHJldHJ5IGxvb3AgPSAyIG9mIGVhY2ggcGF0dGVybgorICAgIGxkciAgIHIxLCBbcjVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCB0ZXN0IHBhdHRlcm4KKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwN2MKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGNtcCAgIHIxLCAjMHgwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgdGhlIGxhc3QgZGF0YSBpbiBwYXR0ZXJuIGlzIDB4MDAKKyAgICBibmUgICBjYnIwX3Rlc3RfYnVyc3QKKworICAgIGFuZCAgIHIzLCByNywgIzB4RkYKKyAgICBzdWIgICByMywgcjMsICMweDAxICAgICAgICAgICAgICAgICAgICAgICAgICBAIHdlIGFkZCAxIGFmdGVyIGxvb3AgY2hlY2sgc28gd2UgbmVlZCB0byBkZWNyZWFzZSAxCisgICAgY21wICAgcjMsICMweDAwCisgICAgYmVxICAgY2JyMF9uZXh0X2RxaWRseSAgICAgICAgICAgICAgICAgICAgICAgQCBwYXNzIGF0IGRsbGkgPSAwLCBpbnZhbGlkCisgICAgYWRkICAgcjYsIHI2LCAjMHgwMSAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbmNyZW1lbnQgcGFzcyBjb3VudAorICAgIGFkZCAgIHIxMSwgcjExLCAjMHgwMSAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5jcmVtZW50IHBhc3MgY291bnQKKworICAgIGxkciAgIHIwLCA9MHgxZTcyMDE4MCAgICAgICAgICAgICAgICAgICAgICAgIEAgcmVjb3JkIERMTDIgcGFzcyB3aW5kb3cKKyAgICBjbXAgICByOSwgIzB4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIERRU0ktTUNMSzJYIHBoYXNlIGNoZWNrCisgICAgYWRkZXEgcjAsIHIwLCAjMHgwOAorICAgIGNtcCAgIHIzLCAjMzIKKyAgICBhZGRnZSByMCwgcjAsICMweDQKKyAgICBhbmQgICByMSwgcjMsICMweDFGCisgICAgbW92ICAgcjIsICMweDEKKyAgICBtb3YgICByMiwgcjIsIGxzbCByMQorICAgIGxkciAgIHIxLCBbcjBdCisgICAgb3JyICAgcjEsIHIxLCByMgorICAgIHN0ciAgIHIxLCBbcjBdCisKKyAgICBsZHIgICByMCwgPTB4MWU3MjAxMDAgICAgICAgICAgICAgICAgICAgICAgICBAIHJlY29yZCBETEwyIG1pbjptYXggdmFsdWUgZm9yIGVhY2ggRFFJRExZCisgICAgYWRkICAgcjAsIHIwLCByOCwgbHNsICMyCisgICAgY21wICAgcjksICMweDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBEUVNJLU1DTEsyWCBwaGFzZSBjaGVjaworICAgIGJlcSAgIGNicjBfdGVzdF9wYXNzX2Rxc2luCisgICAgcmVjb3JkX2RsbDJfcGFzc19yYW5nZQorICAgIGIgICAgIGNicjBfbmV4dF9kbGwyX3BhcmFtZXRlcgorCitjYnIwX3Rlc3RfcGFzc19kcXNpbjoKKyAgICByZWNvcmRfZGxsMl9wYXNzX3JhbmdlX2gKKyAgICBiICAgICBjYnIwX25leHRfZGxsMl9wYXJhbWV0ZXIKKworY2JyMF90ZXN0X3BhdHRlcm5fZmFpbDoKKyAgICBjbXAgICByNiwgIzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHBhc3NjbnQgPj0gNQorICAgIGJnZSAgIGNicjBfbmV4dF9kcWlkbHkKKyAgICBsZHIgICByMCwgPTB4MWU3MjAxMDAgICAgICAgICAgICAgICAgICAgICAgICBAIHJlc2V0IERMTDIgbWluOm1heCB2YWx1ZQorICAgIGFkZCAgIHIwLCByMCwgcjgsIGxzbCAjMgorICAgIGxkciAgIHIxLCBbcjBdCisgICAgbGRyICAgcjIsID0weEZGRkYwMDAwCisgICAgbGRyICAgcjMsID0weDAwMDAwMEZGCisgICAgY21wICAgcjksICMweDAwCisgICAgbW92ZXEgcjIsIHIyLCBsc3IgIzE2CisgICAgbW92ZXEgcjMsIHIzLCBsc2wgIzE2CisgICAgYW5kICAgcjEsIHIxLCByMgorICAgIG9yciAgIHIxLCByMSwgcjMKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGIgICAgIGNicjBfbmV4dF9kbGwyX3BhcmFtZXRlciAgICAgICAgICAgICAgIEAgQ0JSU2NhbjMoKSBlbmQgYW5kIHRlc3QgcmVzdWx0IGZhaWwsIGdvIHRvIG5leHQgc3RlcAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFRlc3QgZmFpbCByZXRyeSBsb29wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2JyMF9wYXR0ZXJuX2ZhaWxfcmV0cnk6CisKKy8qIENCUlRlc3QzKCkgc3RhcnQgKi8KK2NicjBfdGVzdF9idXJzdDoKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwNzAKKyAgICBsZHIgICByMSwgPTB4MDAwMDAwMDAKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGxkciAgIHIxLCA9MHgwMDAwMDBDMQorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbGRyICAgcjMsID0weDMwMDAKK2NicjBfd2FpdF9lbmdpbmVfaWRsZV8wOgorICAgIGxkciAgIHIyLCBbcjBdCisgICAgdHN0ICAgcjIsIHIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBEWzEyXSA9IGlkbGUgYml0CisgICAgYmVxICAgY2JyMF93YWl0X2VuZ2luZV9pZGxlXzAKKworICAgIGxkciAgIHIyLCBbcjBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcmVhZCBmYWlsIGJpdCBzdGF0dXMKKyAgICBtb3YgICByMSwgIzB4MAorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbW92ICAgcjIsIHIyLCBsc3IgIzEzICAgICAgICAgICAgICAgICAgICAgICAgQCBEWzEzXSA9IGZhaWwgYml0CisgICAgY21wICAgcjIsICMweDAwCisgICAgYm5lICAgY2JyMF90ZXN0X2ZhaWwKKworY2JyMF90ZXN0X3NpbmdsZToKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwNzAKKyAgICBsZHIgICByMSwgPTB4MDAwMDAwMDAKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGxkciAgIHIxLCA9MHgwMDAwMDA4NQorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbGRyICAgcjMsID0weDMwMDAKK2NicjBfd2FpdF9lbmdpbmVfaWRsZV8xOgorICAgIGxkciAgIHIyLCBbcjBdCisgICAgdHN0ICAgcjIsIHIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBEWzEyXSA9IGlkbGUgYml0CisgICAgYmVxICAgY2JyMF93YWl0X2VuZ2luZV9pZGxlXzEKKworICAgIGxkciAgIHIyLCBbcjBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcmVhZCBmYWlsIGJpdCBzdGF0dXMKKyAgICBtb3YgICByMSwgIzB4MAorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbW92ICAgcjIsIHIyLCBsc3IgIzEzICAgICAgICAgICAgICAgICAgICAgICAgQCBEWzEzXSA9IGZhaWwgYml0CisgICAgY21wICAgcjIsICMweDAwCisgICAgYmVxICAgY2JyMF90ZXN0X3Bhc3MKKworLyogQ0JSVGVzdDMoKSBlbmQgKi8KKworY2JyMF90ZXN0X2ZhaWw6CisgICAgc3VicyAgcjEwLCByMTAsICMxCisgICAgYm5lICAgY2JyMF9wYXR0ZXJuX2ZhaWxfcmV0cnkKKyAgICBiICAgICBjYnIwX3Rlc3RfcGF0dGVybl9mYWlsICAgICAgICAgICAgICAgICBAIENCUlNjYW4zKCkgcmV0dXJuKDApCisKK2NicjBfdGVzdF9wYXNzOgorICAgIGFkZCAgIHI1LCByNSwgIzB4MDQgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5jcmVhc2UgdGhlIHRlc3QgcGF0dGVybiBpbmRleAorICAgIGIgICAgIGNicjBfbmV4dF90ZXN0X3BhdHRlcm4KKworQ0JSMF9FTkQ6CisgICAgbW92ICAgcjUsICMweDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IERRSURMWSBzZWFyY2ggY291bnQKKyAgICBtb3YgICByNiwgIzB4MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgbWF4X21hcmdpbjpnX21hcmdpbgorICAgIG1vdiAgIHI4LCAjMHgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBnX3NpZGUKKyAgICBtb3YgICByNywgIzB4MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgbWF4aW11bSBtYXJnaW4gRFFJRExZLERRU0ktTUNMSzJYIHBoYXNlCitjYnIwX3NlYXJjaF9kbGxfbWFyZ2luX3M6CisgICAgbGRyICAgcjAsID0weDFlNzIwMTAwCisgICAgYWRkICAgcjAsIHIwLCByNSwgbHNsICMyCisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBhbmQgICByMiwgcjEsICMweEZGICAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBkbGxtaW5fcAorICAgIG1vdiAgIHIxLCByMSwgbHNyICM4CisgICAgYW5kICAgcjMsIHIxLCAjMHhGRiAgICAgICAgICAgICAgICAgICAgICAgICAgQCBnZXQgZGxsbWF4X3AKKyAgICBzdWJzICByMiwgcjMsIHIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBtYXJnaW4tUAorICAgIG1vdm1pIHIyLCAjMHgwCisgICAgbW92ICAgcjEsIHIxLCBsc3IgIzgKKyAgICBhbmQgICByMywgcjEsICMweEZGICAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBkbGxtaW5fbgorICAgIG1vdiAgIHIxLCByMSwgbHNyICM4CisgICAgYW5kICAgcjEsIHIxLCAjMHhGRiAgICAgICAgICAgICAgICAgICAgICAgICAgQCBnZXQgZGxsbWF4X24KKyAgICBzdWJzICByMywgcjEsIHIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBtYXJnaW4tTgorICAgIG1vdm1pIHIzLCAjMHgwCisgICAgYWRkICAgcjEsIHIyLCByMworICAgIGNtcCAgIHIxLCAjMHgwCisgICAgYmVxICAgY2JyMF9zZWFyY2hfZGxsX21hcmdpbl9lICAgICAgICAgICAgICAgQCBpZiBtYXJnaW4tUCA9IDAgJiYgbWFyZ2luLU4gPSAwCisKKyAgICBsZHIgICByOSwgW3IwXQorICAgIGxkciAgIHIwLCA9MHgxZTcyMDE4MAorICAgIGNtcCAgIHIyLCByMworICAgIG9ycmx0IHI1LCByNSwgIzB4ODAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbWFyZ2luLU4gPiBtYXJnaW4tUAorICAgIGFkZGx0IHIwLCByMCwgIzB4MDgKKyAgICBtb3ZsdCByOSwgcjksIGxzciAjMTYKKyAgICBtb3ZnZSByMywgcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIG1heChtYXJnaW4tUC9OKQorICAgIGFkZCAgIHIyLCByMywgIzB4MiAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZGVmaW5lICsvLSAyIHN0ZXBzIG9mIHZhcmlhdGlvbgorICAgIG1vdiAgIHIxLCByNiwgbHNyICMxNgorICAgIGNtcCAgIHIyLCByMQorICAgIGJsdCAgIGNicjBfc2VhcmNoX2RsbF9tYXJnaW5fZSAgICAgICAgICAgICAgIEAgaWYgbWF4KG1hcmdpbi1QL04pICsgMiA8IG1heF9tYXJnaW4KKworICAgIGFuZCAgIHIxLCByOSwgIzB4RkYgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcjEgPSBkbGxpIGNvdW50ZXIKKyAgICBjbXAgICByMSwgIzMyCisgICAgbGRyZ2UgcjIsIFtyMCwgIzB4NF0gICAgICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIHBhc3Mgd2luZG93CisgICAgbGRybHQgcjIsIFtyMF0KKyAgICBhbmQgICByMSwgcjEsICMweDFGCisgICAgbW92ICAgcjEwLCAjMHgxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IHRlc3QgYml0IG1hc2sKKyAgICBtb3YgICByMTAsIHIxMCwgbHNsIHIxCisgICAgYW5kICAgcjEsIHI5LCAjMHhGRgorY2JyMF9zZWFyY2hfZGxsbWluX21hcmdpbl9zOgorICAgIHRzdCAgIHIyLCByMTAKKyAgICBiZXEgICBjYnIwX3NlYXJjaF9kbGxtaW5fbWFyZ2luX2UKKyAgICBtb3YgICByMTAsIHIxMCwgbHNyICMxCisgICAgY21wICAgcjEsICMzMgorICAgIGxkcmVxIHIyLCBbcjBdCisgICAgbGRyZXEgcjEwLCA9MHg4MDAwMDAwMAorICAgIHN1YnMgIHIxLCByMSwgIzB4MQorICAgIGJuZSAgIGNicjBfc2VhcmNoX2RsbG1pbl9tYXJnaW5fcworCitjYnIwX3NlYXJjaF9kbGxtaW5fbWFyZ2luX2U6CisgICAgYW5kICAgcjIsIHI5LCAjMHhGRgorICAgIHN1YiAgIHIxMSwgcjIsIHIxICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZ2V0IGRsbG1pbiBzaWRlIG1hcmdpbgorCisgICAgbW92ICAgcjksIHI5LCBsc3IgIzgKKyAgICBhbmQgICByMSwgcjksICMweEZGICAgICAgICAgICAgICAgICAgICAgICAgICBAIHIxID0gZGxsaSBjb3VudGVyCisgICAgY21wICAgcjEsICMzMgorICAgIGxkcmdlIHIyLCBbcjAsICMweDRdICAgICAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCBwYXNzIHdpbmRvdworICAgIGxkcmx0IHIyLCBbcjBdCisgICAgYW5kICAgcjEsIHIxLCAjMHgxRgorICAgIG1vdiAgIHIxMCwgIzB4MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCB0ZXN0IGJpdCBtYXNrCisgICAgbW92ICAgcjEwLCByMTAsIGxzbCByMQorICAgIGFuZCAgIHIxLCByOSwgIzB4RkYKK2NicjBfc2VhcmNoX2RsbG1heF9tYXJnaW5fczoKKyAgICB0c3QgICByMiwgcjEwCisgICAgYmVxICAgY2JyMF9zZWFyY2hfZGxsbWF4X21hcmdpbl9lCisgICAgbW92ICAgcjEwLCByMTAsIGxzbCAjMQorICAgIGNtcCAgIHIxLCAjMzEKKyAgICBsZHJlcSByMiwgW3IwLCAjMHg0XQorICAgIGxkcmVxIHIxMCwgPTB4MDAwMDAwMDEKKyAgICBhZGQgICByMSwgcjEsICMweDEKKyAgICBjbXAgICByMSwgIzY0CisgICAgYm5lICAgY2JyMF9zZWFyY2hfZGxsbWF4X21hcmdpbl9zCisKK2NicjBfc2VhcmNoX2RsbG1heF9tYXJnaW5fZToKKyAgICBhbmQgICByMiwgcjksICMweEZGCisgICAgc3ViICAgcjEsIHIxLCByMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBnZXQgZGxsbWF4IHNpZGUgbWFyZ2luCisgICAgY21wICAgcjEsIHIxMQorICAgIG1vdmx0IHIxMSwgcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZ2V0IHNpZGVfbWFyZ2luCisKK2NicjBfY2hlY2tfZGxsX21hcmdpbjogICAgICAgICAgICAgICAgICAgICAgICAgICBAIGlmIG1heChtYXJnaW4tUC9OKSA+IGdfbWFyZ2luICYmIHNpZGVfbWFyZ2luID49IGdfc2lkZSAmJiBkcWlkbHkgPD0gMjAKKyAgICBjbXAgICByNSwgIzIwCisgICAgYmd0ICAgY2JyMF9jaGVja19kbGxfbWFyZ2luMgorICAgIGFuZCAgIHIxLCByNiwgIzB4RkYKKyAgICBjbXAgICByMywgcjEKKyAgICBibGUgICBjYnIwX2NoZWNrX2RsbF9tYXJnaW4zCisgICAgY21wICAgcjExLCByOAorICAgIGJnZSAgIGNicjBfc2V0X2RsbF9tYXJnaW4KKworY2JyMF9jaGVja19kbGxfbWFyZ2luMjogICAgICAgICAgICAgICAgICAgICAgICAgIEAgaWYgbWF4KG1hcmdpbi1QL04pID4gZ19tYXJnaW4rMSAmJiBzaWRlX21hcmdpbiA+PSBnX3NpZGUpCisgICAgYW5kICAgcjEsIHI2LCAjMHhGRgorICAgIGFkZCAgIHIyLCByMSwgIzB4MQorICAgIGNtcCAgIHIzLCByMgorICAgIGJsZSAgIGNicjBfY2hlY2tfZGxsX21hcmdpbjMKKyAgICBjbXAgICByMTEsIHI4CisgICAgYmdlICAgY2JyMF9zZXRfZGxsX21hcmdpbgorCitjYnIwX2NoZWNrX2RsbF9tYXJnaW4zOiAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpZiBzaWRlX21hcmdpbiA+IGdfc2lkZSAmJiBnX3NpZGUgPCA4CisgICAgY21wICAgcjgsICM4CisgICAgYmdlICAgY2JyMF9zZWFyY2hfZGxsX21hcmdpbl9lCisgICAgY21wICAgcjExLCByOAorICAgIGJsZSAgIGNicjBfc2VhcmNoX2RsbF9tYXJnaW5fZQorCitjYnIwX3NldF9kbGxfbWFyZ2luOgorICAgIG1vdiAgIHIxLCByNiwgbHNyICMxNgorICAgIGNtcCAgIHIzLCByMQorICAgIGJpY2d0IHI2LCByNiwgIzB4MDBGRjAwMDAKKyAgICBvcnJndCByNiwgcjYsIHIzLCBsc2wgIzE2CisgICAgYmljICAgcjYsIHI2LCAjMHgwMDAwMDBGRgorICAgIG9yciAgIHI2LCByNiwgcjMKKyAgICBtb3YgICByNywgcjUKKyAgICBtb3YgICByOCwgcjExCisKK2NicjBfc2VhcmNoX2RsbF9tYXJnaW5fZToKKyAgICBhbmQgICByNSwgcjUsICMweDdGCisgICAgYWRkICAgcjUsIHI1LCAjMHgwMQorICAgIGNtcCAgIHI1LCAjMHgyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbGFzdCBEUUlETFkKKyAgICBibHQgICBjYnIwX3NlYXJjaF9kbGxfbWFyZ2luX3MKKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDAxOAorICAgIGxkciAgIHIxLCBbcjBdCisgICAgYmljICAgcjEsIHIxLCAjMHgwMEZGMDAwMAorICAgIG9yciAgIHIxLCByMSwgcjcsIGxzbCAjMTYKKyAgICBzdHIgICByMSwgW3IwXQorCisgICAgbGRyICAgcjAsID0weDFlNmUwMDY4CisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBiaWMgICByMSwgcjEsICMweDAwRkYwMDAwCisgICAgYmljICAgcjEsIHIxLCAjMHhGRjAwMDAwMAorICAgIHN0ciAgIHIxLCBbcjBdCisKKyAgICAvKiBEZWxheSBhYm91dCA1dXMgKi8KKyAgICBsZHIgcjIsID0weDAwMDAwMDA1ICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBUaW1lcjUgUmVsb2FkID0gNSB1cworICAgIGluaXRfZGVsYXlfdGltZXIKK2RlbGF5XzU6CisgICAgY2hlY2tfZGVsYXlfdGltZXIKKyAgICBibmUgZGVsYXlfNQorICAgIGNsZWFyX2RlbGF5X3RpbWVyCisgICAgLyogZW5kIGRlbGF5IDV1cyAqLworCisgICAgbGRyIHIwLCA9MHgxZTZlMDAwYyAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgcmVmcmVzaCBjeWNsZQorICAgIGxkciByMSwgPTB4MDAwMDVDMDEKKyAgICBzdHIgcjEsIFtyMF0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZpbmUgdHVuZSBwZXIgYml0IERRIGlucHV0IGRlbGF5IC0tIFBhc3MgMSwgbGVmdCBlZGdlIGFsaWduCisgIHI4ICA9IGZyZWUKKyAgcjkgID0gRFEgZmFpbCBiaXQgYWNjdW11bGF0b3IKKyAgcjEwID0gcGF0dGVybiBmYWlsIGNvdW50ZXIsIGluaXRpYWxpemUgdG8gNSAoZmFpbCA1IHRpbWVzKQorICByMTEgPSBmcmVlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDQlIxX1NUQVJUOgorLyogRGVidWcgLSBVQVJUIGNvbnNvbGUgbWVzc2FnZSAqLworICAgIGxkciByMCwgPTB4MWU3ODQwMDAKKyAgICBtb3YgcjEsICMweDBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICdccicKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDBBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICdcbicKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICdDJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4NDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ0InCisgICAgc3RyIHIxLCBbcjBdCisgICAgbW92IHIxLCAjMHg1MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnUicKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICcxJworICAgIHN0ciByMSwgW3IwXQorLyogRGVidWcgLSBVQVJUIGNvbnNvbGUgbWVzc2FnZSAqLworCisgICAgbW92ICAgcjYsICMweDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IHBhc3MgY291bnQKKyAgICBtb3YgICByNywgIzB4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgRExMMiBwYXJhbWV0ZXIgaW5kZXgKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBETEwyIGRlbGF5IG1hcmdpbiB0ZXN0IGxvb3AKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjYnIxX25leHRfZGxsMl9wYXJhbWV0ZXI6CisgICAgbGRyICAgcjAsID0weDFlNmUwMDY4ICAgICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIERMTDIgcGFyYW1ldGVyCisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBiaWMgICByMSwgcjEsICMweDAwRkYwMDAwCisgICAgYmljICAgcjEsIHIxLCAjMHhGRjAwMDAwMAorICAgIG9yciAgIHIxLCByMSwgcjcsIGxzbCAjMTYKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGxkciAgIHIyLCA9MHg0MDQwNDA0MCAgICAgICAgICAgICAgICAgICAgICAgIEAgcGFyYW1ldGVyJ3MgbWF4IGlzIHRvIDB4NDA0MDQwNDAKKyAgICBjbXAgICByNywgcjIKKyAgICBiZ2UgICBDQlIxX0VORAorICAgIGxkciAgIHIyLCA9MHgwMTAxMDEwMQorICAgIGFkZCAgIHI3LCByNywgcjIKKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDA3NCAgICAgICAgICAgICAgICAgICAgICAgIEAgc2V0IHRoZSB0ZXN0aW5nIERSQU0gc2l6ZSA9IDRLQgorICAgIGxkciAgIHIxLCA9MHgwMDAwMEZGRgorICAgIHN0ciAgIHIxLCBbcjBdCisKKy8qIENCUlNjYW4yKCkgc3RhcnQgKi8KKyAgICBsZHIgICByOSwgPTB4RkZGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgdGVzdCBzdGF0dXMKKyAgICBhZHJsICByNSwgUEFUVEVSTl9UQUJMRSAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgcGF0dGVybiB0YWJsZSBpbmRleAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBUZXN0IHBhdHRlcm4gaXRlcmF0aW9uIGxvb3AKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjYnIxX25leHRfdGVzdF9wYXR0ZXJuOgorICAgIG1vdiAgIHIxMCwgIzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc2V0IHRoZSByZXRyeSBsb29wIG9mIGVhY2ggcGF0dGVybgorICAgIGxkciAgIHIxLCBbcjVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCB0ZXN0IHBhdHRlcm4KKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwN2MKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGNtcCAgIHIxLCAjMHgwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgdGhlIGxhc3QgZGF0YSBpbiBwYXR0ZXJuIGlzIDB4MDAKKyAgICBibmUgICBjYnIxX3Rlc3Rfc2luZ2xlCisKK2NicjFfdGVzdF9wYXR0ZXJuX2VuZDoKKyAgICBjbXAgICByOSwgIzB4MDAKKyAgICBibmUgICBjYnIxX3Rlc3RfcGFzc19kcWkKKyAgICBjbXAgICByNiwgIzEwCisgICAgYmdlICAgQ0JSMV9FTkQKKyAgICBiICAgICBjYnIxX25leHRfZGxsMl9wYXJhbWV0ZXIgICAgICAgICAgICAgICBAIENCUlNjYW4yKCkgZW5kIGFuZCB0ZXN0IHJlc3VsdCBmYWlsLCBnbyB0byBuZXh0IHN0ZXAKKworY2JyMV90ZXN0X3Bhc3NfZHFpOgorICAgIGFuZCAgIHIzLCByNywgIzB4RkYKKyAgICBzdWIgICByMywgcjMsICMweDAxICAgICAgICAgICAgICAgICAgICAgICAgICBAIHdlIGFkZCAxIGFmdGVyIGxvb3AgY2hlY2sgc28gd2UgbmVlZCB0byBkZWNyZWFzZSAxCisgICAgYWRkICAgcjYsIHI2LCAjMHgwMSAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbmNyZW1lbnQgcGFzcyBjb3VudAorICAgIGxkciAgIHIwLCA9MHgxZTcyMDAxMAorICAgIG1vdiAgIHI4LCAjMHgwMQorY2JyMV90ZXN0X3Bhc3NfZHFpX2xvb3BfczoKKyAgICB0c3QgICByOSwgcjgKKyAgICBiZXEgICBjYnIxX3Rlc3RfcGFzc19kcWlfbG9vcF9lCisgICAgcmVjb3JkX2RsbDJfcGFzc19yYW5nZQorCitjYnIxX3Rlc3RfcGFzc19kcWlfbG9vcF9lOgorICAgIGFkZCAgIHIwLCByMCwgIzB4MDQKKyAgICBtb3YgICByOCwgcjgsIGxzbCAjMQorICAgIGxkciAgIHIxLCA9MHhGRkZGCisgICAgdHN0ICAgcjgsIHIxCisgICAgYm5lICAgY2JyMV90ZXN0X3Bhc3NfZHFpX2xvb3BfcworICAgIGIgICAgIGNicjFfbmV4dF9kbGwyX3BhcmFtZXRlcgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFRlc3QgZmFpbCByZXRyeSBsb29wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2JyMV9wYXR0ZXJuX2ZhaWxfcmV0cnk6CisKKy8qIENCUlRlc3QyKCkgc3RhcnQgKi8KK2NicjFfdGVzdF9zaW5nbGU6CisgICAgbGRyICAgcjAsID0weDFlNmUwMDcwCisgICAgbGRyICAgcjEsID0weDAwMDAwMDAwCisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBsZHIgICByMSwgPTB4MDAwMDAwMDUKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGxkciAgIHIzLCA9MHgxMDAwCisgICAgbGRyICAgcjEsID0weDEwMDAKK2NicjFfd2FpdF9lbmdpbmVfaWRsZV8wOgorICAgIHN1YnMgIHIxLCByMSwgIzEKKyAgICBiZXEgICBjYnIxX3Rlc3Rfc2luZ2xlX2VuZAorICAgIGxkciAgIHIyLCBbcjBdCisgICAgdHN0ICAgcjIsIHIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBEWzEyXSA9IGlkbGUgYml0CisgICAgYmVxICAgY2JyMV93YWl0X2VuZ2luZV9pZGxlXzAKKworY2JyMV90ZXN0X3NpbmdsZV9lbmQ6CisgICAgbGRyICAgcjAsID0weDFlNmUwMDc4ICAgICAgICAgICAgICAgICAgICAgICAgQCByZWFkIGZhaWwgYml0IHN0YXR1cworICAgIGxkciAgIHIxMSwgW3IwXQorICAgIG9yciAgIHIxMSwgcjExLCByMTEsIGxzciAjMTYKKyAgICBiaWMgICByMTEsIHIxMSwgIzB4RkYwMDAwMDAKKyAgICBiaWMgICByMTEsIHIxMSwgIzB4MDBGRjAwMDAKKworICAgIGxkciAgIHIxLCA9MHhGRkZGCisgICAgY21wICAgcjExLCByMQorICAgIGJlcSAgIGNicjFfdGVzdF9mYWlsCisKK2NicjFfdGVzdF9idXJzdDoKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwNzAKKyAgICBsZHIgICByMiwgPTB4MDAwMDAwMDAKKyAgICBzdHIgICByMiwgW3IwXQorICAgIGxkciAgIHIyLCA9MHgwMDAwMDA0MQorICAgIHN0ciAgIHIyLCBbcjBdCisgICAgbGRyICAgcjMsID0weDEwMDAKKyAgICBsZHIgICByMSwgPTB4MTAwMAorY2JyMV93YWl0X2VuZ2luZV9pZGxlXzE6CisgICAgc3VicyAgcjEsIHIxLCAjMQorICAgIGJlcSAgIGNicjFfdGVzdF9idXJzdF9lbmQKKyAgICBsZHIgICByMiwgW3IwXQorICAgIHRzdCAgIHIyLCByMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgRFsxMl0gPSBpZGxlIGJpdAorICAgIGJlcSAgIGNicjFfd2FpdF9lbmdpbmVfaWRsZV8xCisKK2NicjFfdGVzdF9idXJzdF9lbmQ6CisgICAgbGRyICAgcjAsID0weDFlNmUwMDc4ICAgICAgICAgICAgICAgICAgICAgICAgQCByZWFkIGZhaWwgYml0IHN0YXR1cworICAgIGxkciAgIHIyLCBbcjBdCisgICAgb3JyICAgcjIsIHIyLCByMiwgbHNyICMxNgorICAgIGJpYyAgIHIyLCByMiwgIzB4RkYwMDAwMDAKKyAgICBiaWMgICByMiwgcjIsICMweDAwRkYwMDAwCisgICAgb3JyICAgcjExLCByMTEsIHIyCisKKyAgICBsZHIgICByMiwgPTB4RkZGRgorICAgIGNtcCAgIHIxMSwgcjIKKyAgICBibmUgICBjYnIxX3Rlc3RfcGFzcworLyogQ0JSVGVzdDIoKSBlbmQgKi8KKworY2JyMV90ZXN0X2ZhaWw6CisgICAgc3VicyAgcjEwLCByMTAsICMxCisgICAgYm5lICAgY2JyMV9wYXR0ZXJuX2ZhaWxfcmV0cnkKKyAgICBtb3YgICByOSwgIzB4MDAKKyAgICBiICAgICBjYnIxX3Rlc3RfcGF0dGVybl9lbmQgICAgICAgICAgICAgICAgICBAIENCUlNjYW4yKCkgcmV0dXJuKDApCisKK2NicjFfdGVzdF9wYXNzOgorICAgIGxkciAgIHIxLCA9MHhGRkZGICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcmVjb3JkIHRoZSBwYXNzIGJpdAorICAgIGVvciAgIHIxMSwgcjExLCByMQorICAgIGFuZCAgIHI5LCByOSwgcjExICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgRFEgcGFzcyBiaXQKKyAgICBjbXAgICByOSwgIzB4MDAKKyAgICBiZXEgICBjYnIxX3Rlc3RfcGF0dGVybl9lbmQgICAgICAgICAgICAgICAgICBAIENCUlNjYW4yKCkgcmV0dXJuKDApCisKKyAgICBhZGQgICByNSwgcjUsICMweDA0ICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluY3JlYXNlIHRoZSB0ZXN0IHBhdHRlcm4gaW5kZXgKKyAgICBiICAgICBjYnIxX25leHRfdGVzdF9wYXR0ZXJuCisKK0NCUjFfRU5EOgorICAgIG1vdiAgIHI1LCAjMHgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBEUSBETExfbWluIHN1bQorICAgIG1vdiAgIHI2LCAjMHgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBEUSBETExfbWluIHZhbGlkIGNvdW50CisgICAgbGRyICAgcjAsID0weDFlNzIwMDBjCisgICAgbGRyICAgcjMsID0weDFlNzIwMDUwCitjYnIxX3NlYXJjaF9kbGxtaW5fczoKKyAgICBhZGQgICByMCwgcjAsICMweDA0CisgICAgY21wICAgcjAsIHIzCisgICAgYmVxICAgY2JyMV9zZWFyY2hfZGxsbWluX2UKKyAgICBsZHIgICByMSwgW3IwXQorICAgIG1vdiAgIHIyLCByMSwgbHNyICM4CisgICAgYW5kICAgcjIsIHIyLCAjMHhGRiAgICAgICAgICAgICAgICAgICAgICAgICAgQCBnZXQgZGxsbWF4CisgICAgYW5kICAgcjEsIHIxLCAjMHhGRiAgICAgICAgICAgICAgICAgICAgICAgICAgQCBnZXQgZGxsbWluCisgICAgc3VicyAgcjIsIHIyLCByMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBkbGxtYXggLSBkbGxtaW4KKyAgICBibWkgICBjYnIxX3NlYXJjaF9kbGxtaW5fcyAgICAgICAgICAgICAgICAgICBAIG5vIHZhbGlkIG1hcmdpbiBmb3VuZCwgYnlwYXNzIGZpbmUgdHVuZQorICAgIGNtcCAgIHIyLCAjMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgKGRsbG1heCAtIGRsbG1pbikgPCAxMAorICAgIGJsdCAgIGNicjFfc2VhcmNoX2RsbG1pbl9zICAgICAgICAgICAgICAgICAgIEAgbm8gZW5vdWdoIG1hcmdpbiBmb3VuZCwgYnlwYXNzIGZpbmUgdHVuZQorICAgIGFkZCAgIHI1LCByNSwgcjEKKyAgICBhZGQgICByNiwgcjYsICMxCisgICAgYiAgICAgY2JyMV9zZWFyY2hfZGxsbWluX3MKKworY2JyMV9zZWFyY2hfZGxsbWluX2U6CisgICAgY21wICAgcjYsICMxNgorICAgIGJuZSAgIENhbGlicmF0aW9uX1N0YXJ0X3ByZSAgICAgICAgICAgICAgICAgIEAgbm90IGFsbCBiaXRzIHZhbGlkLCByZXRyeSBhZ2FpbgorCisgICAgbW92ICAgcjUsIHI1LCBsc3IgIzQKKyAgICBsZHIgICByMCwgPTB4MWU3MjAwMDAKKyAgICBzdHIgICByNSwgW3IwXQorCisgICAgbW92ICAgcjYsICMweDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IERRTCBDQlIgdmFsdWUKKyAgICBsZHIgICByMCwgPTB4MWU3MjAwMzAKKyAgICBsZHIgICByNywgPTB4MWU3MjAwMGMKK2NicjFfc2V0X3Jlc3VsdF9kcWw6CisgICAgc3ViICAgcjAsIHIwLCAjNAorICAgIGNtcCAgIHIwLCByNworICAgIGJlcSAgIGNicjFfc2V0X3Jlc3VsdF9uZXh0CisgICAgbW92ICAgcjYsIHI2LCBsc2wgIzMKKyAgICBsZHIgICByMSwgW3IwXQorICAgIG1vdiAgIHIyLCByMSwgbHNyICM4CisgICAgYW5kICAgcjIsIHIyLCAjMHhGRiAgICAgICAgICAgICAgICAgICAgICAgICAgQCBnZXQgZGxsbWF4CisgICAgYW5kICAgcjEsIHIxLCAjMHhGRiAgICAgICAgICAgICAgICAgICAgICAgICAgQCBnZXQgZGxsbWluCisgICAgbW92ICAgcjMsIHIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBkbGwgPSBkbGxtaW4KKyAgICBjbXAgICByNSwgcjMKKyAgICBibHQgICBjYnIxX3NldF9yZXN1bHRfZHFsX25lZworICAgIHN1YiAgIHIxLCByNSwgcjMKKyAgICBtb3YgICByMiwgIzE5CisgICAgbXVsICAgcjEsIHIyLCByMQorICAgIG1vdiAgIHIxLCByMSwgbHNyICM1ICAgICAgICAgICAgICAgICAgICAgICAgIEAgZHFpX3R1bmUgPSAoKGdvbGRfZGxsIC0gZGxsKSAqIDE5KSA+PiA1CisgICAgY21wICAgcjEsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBkcWlfdHVuZSBtYXggPSAyCisgICAgbW92Z3QgcjEsICMyCisgICAgb3JyICAgcjYsIHI2LCByMQorICAgIGIgICAgIGNicjFfc2V0X3Jlc3VsdF9kcWwKKworY2JyMV9zZXRfcmVzdWx0X2RxbF9uZWc6CisgICAgc3ViICAgcjEsIHIzLCByNQorICAgIG1vdiAgIHIyLCAjMTkKKyAgICBtdWwgICByMSwgcjIsIHIxCisgICAgbW92ICAgcjEsIHIxLCBsc3IgIzUgICAgICAgICAgICAgICAgICAgICAgICAgQCBkcWlfdHVuZSA9ICgoZ29sZF9kbGwgLSBkbGwpICogMTkpID4+IDUKKyAgICBjbXAgICByMSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGRxaV90dW5lIG1heCA9IC0yCisgICAgbW92Z3QgcjEsICMyCisgICAgbW92ICAgcjIsICM4CisgICAgc3ViICAgcjEsIHIyLCByMQorICAgIGFuZCAgIHIxLCByMSwgIzcKKyAgICBvcnIgICByNiwgcjYsIHIxCisgICAgYiAgICAgY2JyMV9zZXRfcmVzdWx0X2RxbAorCitjYnIxX3NldF9yZXN1bHRfbmV4dDoKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwODAgICAgICAgICAgICAgICAgICAgICAgICBAIHNhdmUgRFFMIGZpbmUgdHVuZSByZXN1bHQKKyAgICBzdHIgICByNiwgW3IwXQorICAgIGxkciAgIHIwLCA9MHgxZTcyMDA5NAorICAgIHN0ciAgIHI2LCBbcjBdCisKKyAgICBtb3YgICByNiwgIzB4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgRFFIIENCUiB2YWx1ZQorICAgIGxkciAgIHIwLCA9MHgxZTcyMDA1MAorICAgIGxkciAgIHI3LCA9MHgxZTcyMDAyYworY2JyMV9zZXRfcmVzdWx0X2RxaDoKKyAgICBzdWIgICByMCwgcjAsICM0CisgICAgY21wICAgcjAsIHI3CisgICAgYmVxICAgY2JyMV9zZXRfcmVzdWx0X2VuZAorICAgIG1vdiAgIHI2LCByNiwgbHNsICMzCisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBtb3YgICByMiwgcjEsIGxzciAjOAorICAgIGFuZCAgIHIyLCByMiwgIzB4RkYgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZ2V0IGRsbG1heAorICAgIGFuZCAgIHIxLCByMSwgIzB4RkYgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZ2V0IGRsbG1pbgorICAgIG1vdiAgIHIzLCByMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZGxsID0gZGxsbWluCisgICAgY21wICAgcjUsIHIzCisgICAgYmx0ICAgY2JyMV9zZXRfcmVzdWx0X2RxaF9uZWcKKyAgICBzdWIgICByMSwgcjUsIHIzCisgICAgbW92ICAgcjIsICMxOQorICAgIG11bCAgIHIxLCByMiwgcjEKKyAgICBtb3YgICByMSwgcjEsIGxzciAjNSAgICAgICAgICAgICAgICAgICAgICAgICBAIGRxaV90dW5lID0gKChnb2xkX2RsbCAtIGRsbCkgKiAxOSkgPj4gNQorICAgIGNtcCAgIHIxLCAjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZHFpX3R1bmUgbWF4ID0gMgorICAgIG1vdmd0IHIxLCAjMworICAgIHN1YnMgIHIxLCByMSwgIzEKKyAgICBtb3ZtaSByMSwgIzcKKyAgICBvcnIgICByNiwgcjYsIHIxCisgICAgYiAgICAgY2JyMV9zZXRfcmVzdWx0X2RxaAorCitjYnIxX3NldF9yZXN1bHRfZHFoX25lZzoKKyAgICBzdWIgICByMSwgcjMsIHI1CisgICAgbW92ICAgcjIsICMxOQorICAgIG11bCAgIHIxLCByMiwgcjEKKyAgICBtb3YgICByMSwgcjEsIGxzciAjNSAgICAgICAgICAgICAgICAgICAgICAgICBAIGRxaV90dW5lID0gKChnb2xkX2RsbCAtIGRsbCkgKiAxOSkgPj4gNQorICAgIGFkZCAgIHIxLCByMSwgIzEKKyAgICBjbXAgICByMSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGRxaV90dW5lIG1heCA9IC0yCisgICAgbW92Z3QgcjEsICMyCisgICAgbW92ICAgcjIsICM4CisgICAgc3ViICAgcjEsIHIyLCByMQorICAgIGFuZCAgIHIxLCByMSwgIzcKKyAgICBvcnIgICByNiwgcjYsIHIxCisgICAgYiAgICAgY2JyMV9zZXRfcmVzdWx0X2RxaAorCitjYnIxX3NldF9yZXN1bHRfZW5kOgorICAgIGxkciAgIHIwLCA9MHgxZTZlMDA4NCAgICAgICAgICAgICAgICAgICAgICAgIEAgc2F2ZSBEUUggZmluZSB0dW5lIHJlc3VsdAorICAgIHN0ciAgIHI2LCBbcjBdCisgICAgbGRyICAgcjAsID0weDFlNzIwMDk4CisgICAgc3RyICAgcjYsIFtyMF0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFNlYXJjaCB0aGUgRExMMiBkZXRhaWwgbWFyZ2luCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgbGRyICAgcjAsID0weDFlNzIwMGEwCisgICAgbW92ICAgcjEsICMwCisgICAgc3RyICAgcjEsIFtyMF0KKworQ0JSM19TVEFSVDoKKy8qIERlYnVnIC0gVUFSVCBjb25zb2xlIG1lc3NhZ2UgKi8KKyAgICBsZHIgcjAsID0weDFlNzg0MDAwCisgICAgbW92IHIxLCAjMHgzMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnMycKKyAgICBzdHIgcjEsIFtyMF0KKy8qIERlYnVnIC0gVUFSVCBjb25zb2xlIG1lc3NhZ2UgKi8KKworICAgIG1vdiAgIHI2LCAjMHgwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBwYXNzIGNvdW50CisgICAgbW92ICAgcjcsICMweDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IERMTDIgcGFyYW1ldGVyIGluZGV4CisgICAgbGRyICAgcjEsID0weDAwMDAwMGZmCisgICAgbGRyICAgcjAsID0weDFlNzIwMDA4ICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IERRTCBkbGxtYXgsZGxsbWluCisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBsZHIgICByMCwgPTB4MWU3MjAwMGMgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgRFFIIGRsbG1heCxkbGxtaW4KKyAgICBzdHIgICByMSwgW3IwXQorCisgICAgbGRyICAgcjAsID0weDFlNzIwMGEwICAgICAgICAgICAgICAgICAgICAgICAgQCBDQlIzIGl0ZXJhdGlvbiBjb3VudGVyCisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBhZGQgICByMSwgcjEsICMxCisgICAgc3RyICAgcjEsIFtyMF0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBETEwyIGRlbGF5IG1hcmdpbiB0ZXN0IGxvb3AKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjYnIzX25leHRfZGxsMl9wYXJhbWV0ZXI6CisgICAgbGRyICAgcjAsID0weDFlNmUwMDY4ICAgICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIERMTDIgcGFyYW1ldGVyCisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBiaWMgICByMSwgcjEsICMweDAwRkYwMDAwCisgICAgYmljICAgcjEsIHIxLCAjMHhGRjAwMDAwMAorICAgIG9yciAgIHIxLCByMSwgcjcsIGxzbCAjMTYKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGxkciAgIHIyLCA9MHg0MDQwNDA0MCAgICAgICAgICAgICAgICAgICAgICAgIEAgcGFyYW1ldGVyJ3MgbWF4IGlzIHRvIDB4NDA0MDQwNDAKKyAgICBjbXAgICByNywgcjIKKyAgICBiZ2UgICBDQlIzX0VORAorICAgIGxkciAgIHIyLCA9MHgwMTAxMDEwMQorICAgIGFkZCAgIHI3LCByNywgcjIKKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDA3NCAgICAgICAgICAgICAgICAgICAgICAgIEAgc2V0IHRoZSB0ZXN0aW5nIERSQU0gc2l6ZSA9IDY0S0IKKyAgICBsZHIgICByMSwgPTB4MDAwMEZGRkYKKyAgICBzdHIgICByMSwgW3IwXQorCisvKiBDQlJTY2FuKCkgc3RhcnQgKi8KKyAgICBtb3YgICByOSwgIzB4MDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgdGVzdCBzdGF0dXMKKyAgICBhZHJsICByNSwgUEFUVEVSTl9UQUJMRSAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgcGF0dGVybiB0YWJsZSBpbmRleAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBUZXN0IHBhdHRlcm4gaXRlcmF0aW9uIGxvb3AKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjYnIzX25leHRfdGVzdF9wYXR0ZXJuOgorICAgIG1vdiAgIHIxMCwgIzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc2V0IHRoZSByZXRyeSBsb29wIG9mIGVhY2ggcGF0dGVybgorICAgIGxkciAgIHIxLCBbcjVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCB0ZXN0IHBhdHRlcm4KKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwN2MKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGNtcCAgIHIxLCAjMHgwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgdGhlIGxhc3QgZGF0YSBpbiBwYXR0ZXJuIGlzIDB4MDAKKyAgICBibmUgICBjYnIzX3Rlc3Rfc2luZ2xlCisKK2NicjNfdGVzdF9wYXR0ZXJuX2VuZDoKKyAgICBjbXAgICByOSwgIzB4MDAKKyAgICBibmUgICBjYnIzX3Rlc3RfcGFzc19kcWwKKyAgICBjbXAgICByNiwgIzEwCisgICAgYmdlICAgQ0JSM19FTkQKKyAgICBiICAgICBjYnIzX25leHRfZGxsMl9wYXJhbWV0ZXIgICAgICAgICAgICAgICBAIENCUlNjYW4oKSBlbmQgYW5kIHRlc3QgcmVzdWx0IGZhaWwsIGdvIHRvIG5leHQgc3RlcAorCitjYnIzX3Rlc3RfcGFzc19kcWw6CisgICAgYW5kICAgcjMsIHI3LCAjMHhGRgorICAgIHN1YiAgIHIzLCByMywgIzB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgIEAgd2UgYWRkIG9uZSBhZnRlciBsb29wIGNoZWNrIHNvIHdlIG5lZWQgdG8gZGVjcmVhc2UgMQorICAgIGFkZCAgIHI2LCByNiwgIzB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5jcmVtZW50IHBhc3MgY291bnQKKyAgICB0c3QgICByOSwgIzB4MDEKKyAgICBiZXEgICBjYnIzX3Rlc3RfcGFzc19kcWgKKworICAgIGxkciAgIHIwLCA9MHgxRTcyMDAwOAorICAgIHJlY29yZF9kbGwyX3Bhc3NfcmFuZ2UKKworY2JyM190ZXN0X3Bhc3NfZHFoOgorICAgIHRzdCAgIHI5LCAjMHgwMgorICAgIGJlcSAgIGNicjNfbmV4dF9kbGwyX3BhcmFtZXRlcgorICAgIGxkciAgIHIwLCA9MHgxRTcyMDAwYworICAgIHJlY29yZF9kbGwyX3Bhc3NfcmFuZ2UKKyAgICBiICAgICBjYnIzX25leHRfZGxsMl9wYXJhbWV0ZXIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBUZXN0IGZhaWwgcmV0cnkgbG9vcAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NicjNfcGF0dGVybl9mYWlsX3JldHJ5OgorCisvKiBDQlJUZXN0KCkgc3RhcnQgKi8KK2NicjNfdGVzdF9zaW5nbGU6CisgICAgbGRyICAgcjAsID0weDFlNmUwMDcwCisgICAgbGRyICAgcjEsID0weDAwMDAwMDAwCisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBsZHIgICByMSwgPTB4MDAwMDAwMDUKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGxkciAgIHIzLCA9MHgxMDAwCisgICAgbGRyICAgcjgsID0weDEwMDAwCitjYnIzX3dhaXRfZW5naW5lX2lkbGVfMDoKKyAgICBzdWJzICByOCwgcjgsICMxCisgICAgYmVxICAgY2JyM190ZXN0X3NpbmdsZV9lbmQKKyAgICBsZHIgICByMiwgW3IwXQorICAgIHRzdCAgIHIyLCByMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgRFsxMl0gPSBpZGxlIGJpdAorICAgIGJlcSAgIGNicjNfd2FpdF9lbmdpbmVfaWRsZV8wCisKK2NicjNfdGVzdF9zaW5nbGVfZW5kOgorICAgIGxkciAgIHIwLCA9MHgxZTZlMDA3OCAgICAgICAgICAgICAgICAgICAgICAgIEAgcmVhZCBmYWlsIGJpdCBzdGF0dXMKKyAgICBsZHIgICByMTEsIFtyMF0KKyAgICBvcnIgICByMTEsIHIxMSwgcjExLCBsc3IgIzE2CisgICAgYmljICAgcjExLCByMTEsICMweEZGMDAwMDAwCisgICAgYmljICAgcjExLCByMTEsICMweDAwRkYwMDAwCisKKyAgICBsZHIgICByMSwgPTB4RkYKKyAgICB0c3QgICByMTEsIHIxCisgICAgYmVxICAgY2JyM190ZXN0X2J1cnN0CisgICAgdHN0ICAgcjExLCByMSwgbHNsICM4CisgICAgYm5lICAgY2JyM190ZXN0X2ZhaWwKKworY2JyM190ZXN0X2J1cnN0OgorICAgIG1vdiAgIHIxLCAjMHgwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdGlhbGl6ZSBsb29wIGluZGV4LCByMSBpcyBsb29wJ3MgaW5kZXgKK2NicjNfdGVzdF9idXJzdF9sb29wOgorICAgIGxkciAgIHIwLCA9MHgxZTZlMDA3MAorICAgIGxkciAgIHIyLCA9MHgwMDAwMDAwMAorICAgIHN0ciAgIHIyLCBbcjBdCisgICAgbW92ICAgcjIsIHIxLCBsc2wgIzMKKyAgICBvcnIgICByMiwgcjIsICMweDQxICAgICAgICAgICAgICAgICAgICAgICAgICBAIHRlc3QgY29tbWFuZCA9IDB4NDEgfCAoZGF0YWdlbiA8PCAzKQorICAgIHN0ciAgIHIyLCBbcjBdCisgICAgbGRyICAgcjMsID0weDEwMDAKKyAgICBsZHIgICByOCwgPTB4MTAwMDAKK2NicjNfd2FpdF9lbmdpbmVfaWRsZV8xOgorICAgIHN1YnMgIHI4LCByOCwgIzEKKyAgICBiZXEgICBjYnIzX3Rlc3RfYnVyc3RfZW5kCisgICAgbGRyICAgcjIsIFtyMF0KKyAgICB0c3QgICByMiwgcjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIERbMTJdID0gaWRsZSBiaXQKKyAgICBiZXEgICBjYnIzX3dhaXRfZW5naW5lX2lkbGVfMQorCitjYnIzX3Rlc3RfYnVyc3RfZW5kOgorICAgIGxkciAgIHIwLCA9MHgxZTZlMDA3OCAgICAgICAgICAgICAgICAgICAgICAgIEAgcmVhZCBmYWlsIGJpdCBzdGF0dXMKKyAgICBsZHIgICByMiwgW3IwXQorICAgIG9yciAgIHIyLCByMiwgcjIsIGxzciAjMTYKKyAgICBiaWMgICByMiwgcjIsICMweEZGMDAwMDAwCisgICAgYmljICAgcjIsIHIyLCAjMHgwMEZGMDAwMAorICAgIG9yciAgIHIxMSwgcjExLCByMgorCisgICAgbGRyICAgcjIsID0weEZGCisgICAgdHN0ICAgcjExLCByMgorICAgIGJlcSAgIGNicjNfbmV4dF90ZXN0X2J1cnN0X21vZGUKKyAgICB0c3QgICByMTEsIHIyLCBsc2wgIzgKKyAgICBiZXEgICBjYnIzX25leHRfdGVzdF9idXJzdF9tb2RlCisvKiBDQlJUZXN0KCkgZW5kICovCisKK2NicjNfdGVzdF9mYWlsOgorICAgIHN1YnMgIHIxMCwgcjEwLCAjMQorICAgIGJuZSAgIGNicjNfcGF0dGVybl9mYWlsX3JldHJ5CisgICAgbW92ICAgcjksICMweDAwCisgICAgYiAgICAgY2JyM190ZXN0X3BhdHRlcm5fZW5kICAgICAgICAgICAgICAgICAgQCBDQlJTY2FuKCkgcmV0dXJuKDApCisKK2NicjNfbmV4dF90ZXN0X2J1cnN0X21vZGU6CisgICAgYWRkICAgcjEsIHIxLCAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbmNyZWFzZSB0aGUgdGVzdCBtb2RlIGluZGV4CisgICAgY21wICAgcjEsICMweDA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB0aGVyZSBhcmUgOCBtb2RlcworICAgIGJuZSAgIGNicjNfdGVzdF9idXJzdF9sb29wCisKKyAgICBsZHIgICByMSwgPTB4RkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHJlY29yZCB0aGUgcGFzcyBieXRlCisgICAgdHN0ICAgcjExLCByMQorICAgIGFuZG5lIHI5LCByOSwgIzB4MDIgICAgICAgICAgICAgICAgICAgICAgICAgIEAgRFFMIGZhaWwKKyAgICB0c3QgICByMTEsIHIxLCBsc2wgIzgKKyAgICBhbmRuZSByOSwgcjksICMweDAxICAgICAgICAgICAgICAgICAgICAgICAgICBAIERRSCBmYWlsCisgICAgY21wICAgcjksICMweDAwCisgICAgYmVxICAgY2JyM190ZXN0X3BhdHRlcm5fZW5kICAgICAgICAgICAgICAgICAgQCBDQlJTY2FuKCkgcmV0dXJuKDApCisKKyAgICBhZGQgICByNSwgcjUsICMweDA0ICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluY3JlYXNlIHRoZSB0ZXN0IHBhdHRlcm4gaW5kZXgKKyAgICBiICAgICBjYnIzX25leHRfdGVzdF9wYXR0ZXJuCisKK0NCUjNfRU5EOgorICAgIGxkciAgIHIwLCA9MHgxZTcyMDAwYyAgICAgICAgICAgICAgICAgICAgICAgIEAgY2hlY2sgRFFIIG1hcmdpbgorICAgIGxkciAgIHIxLCBbcjBdCisgICAgbW92ICAgcjIsIHIxLCBsc3IgIzgKKyAgICBhbmQgICByMiwgcjIsICMweEZGICAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBkbGxtYXgKKyAgICBhbmQgICByMSwgcjEsICMweEZGICAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBkbGxtaW4KKyAgICBzdWJzICByNSwgcjIsIHIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGRsbG1heCAtIGRsbG1pbgorICAgIGJtaSAgIENCUjNfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbm8gdmFsaWQgbWFyZ2luIGZvdW5kLCByZXRyeSBhZ2FpbgorICAgIGNtcCAgIHI1LCAjMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgKGRsbG1heCAtIGRsbG1pbikgPCAxMAorICAgIGJsdCAgIENCUjNfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbm8gZW5vdWdoIG1hcmdpbiBmb3VuZCwgcmV0cnkgYWdhaW4KKyAgICBhZGQgICByMiwgcjEsIHIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIChkbGxtaW5bMV0gKyBkbGxtYXhbMV0gKyAxKSA+PiAxCisgICAgYWRkICAgcjIsIHIyLCAjMHgwMQorICAgIG1vdiAgIHIxLCByMiwgbHNyICMxCisgICAgbW92ICAgcjMsIHIxLCBsc2wgIzgKKyAgICBsZHIgICByMSwgW3IwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHN0b3JlIHRoZSBkbGwgc2VhcmNoIHJlc3VsdAorICAgIGJpYyAgIHIxLCByMSwgIzB4RkYwMDAwMDAKKyAgICBiaWMgICByMSwgcjEsICMweDAwRkYwMDAwCisgICAgb3JyICAgcjEsIHIxLCByMywgbHNsICM4CisgICAgc3RyICAgcjEsIFtyMF0KKworICAgIGxkciAgIHIwLCA9MHgxZTcyMDAwOCAgICAgICAgICAgICAgICAgICAgICAgIEAgY2hlY2sgRFFMIG1hcmdpbgorICAgIGxkciAgIHIxLCBbcjBdCisgICAgbW92ICAgcjIsIHIxLCBsc3IgIzgKKyAgICBhbmQgICByMiwgcjIsICMweEZGICAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBkbGxtYXgKKyAgICBhbmQgICByMSwgcjEsICMweEZGICAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBkbGxtaW4KKyAgICBzdWJzICByNSwgcjIsIHIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGRsbG1heCAtIGRsbG1pbgorICAgIGJtaSAgIENCUjNfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbm8gdmFsaWQgbWFyZ2luIGZvdW5kLCByZXRyeSBhZ2FpbgorICAgIGNtcCAgIHI1LCAjMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgKGRsbG1heCAtIGRsbG1pbikgPCAxMAorICAgIGJsdCAgIENCUjNfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbm8gZW5vdWdoIG1hcmdpbiBmb3VuZCwgcmV0cnkgYWdhaW4KKyAgICBhZGQgICByMiwgcjEsIHIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIChkbGxtaW5bMF0gKyBkbGxtYXhbMF0gKyAxKSA+PiAxCisgICAgYWRkICAgcjIsIHIyLCAjMHgwMQorICAgIG1vdiAgIHIxLCByMiwgbHNyICMxCisgICAgbGRyICAgcjIsIFtyMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzdG9yZSB0aGUgZGxsIHNlYXJjaCByZXN1bHQKKyAgICBiaWMgICByMiwgcjIsICMweEZGMDAwMDAwCisgICAgYmljICAgcjIsIHIyLCAjMHgwMEZGMDAwMAorICAgIG9yciAgIHIyLCByMiwgcjEsIGxzbCAjMTYKKyAgICBzdHIgICByMiwgW3IwXQorICAgIG9yciAgIHIzLCByMywgcjEKKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDA2OCAgICAgICAgICAgICAgICAgICAgICAgIEAgc2F2ZSB0aGUgcmVzdWx0IGRsbCB2YWx1ZQorICAgIGxkciAgIHIxLCBbcjBdCisgICAgYmljICAgcjEsIHIxLCAjMHhGRjAwMDAwMAorICAgIGJpYyAgIHIxLCByMSwgIzB4MDBGRjAwMDAKKyAgICBvcnIgICByMSwgcjEsIHIzLCBsc2wgIzE2CisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBiICAgICBDQlI0X1NUQVJUCisKKy5MVE9SRworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgU2VhcmNoIHRoZSBEUVMgaW5wdXQgbWFzayBtYXJnaW4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NCUjRfU1RBUlQ6CisvKiBEZWJ1ZyAtIFVBUlQgY29uc29sZSBtZXNzYWdlICovCisgICAgbGRyIHIwLCA9MHgxZTc4NDAwMAorICAgIG1vdiByMSwgIzB4MzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJzQnCisgICAgc3RyIHIxLCBbcjBdCisvKiBEZWJ1ZyAtIFVBUlQgY29uc29sZSBtZXNzYWdlICovCisKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwNzQgICAgICAgICAgICAgICAgICAgICAgICBAIHNldCB0aGUgdGVzdGluZyBEUkFNIHNpemUgPSA0S0IKKyAgICBsZHIgICByMSwgPTB4MDAwMDBGRkYKKyAgICBzdHIgICByMSwgW3IwXQorCisgICAgbW92ICAgcjgsICMweDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IE1DUjE4WzRdCisgICAgbGRyICAgcjEsID0weDAwMDAwMGZmCisgICAgbGRyICAgcjAsID0weDFlNzIwMGIwICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IE1DUjE4WzRdPTAgbWF4LG1pbgorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbGRyICAgcjAsID0weDFlNzIwMGI0ICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IE1DUjE4WzRdPTEgbWF4LG1pbgorICAgIHN0ciAgIHIxLCBbcjBdCisKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwMTgKKyAgICBsZHIgICByMSwgW3IwXQorICAgIGJpYyAgIHIxLCByMSwgIzB4MDAwMDAwMUYKKyAgICBzdHIgICByMSwgW3IwXQorCisgICAgYiAgICAgY2JyNF9zY2FuX3N0YXJ0CisKK2NicjRfbmV4dF9tYXNrZGx5OgorICAgIGFkZCAgIHI4LCByOCwgIzB4MDEKKyAgICBhbmQgICByMiwgcjgsICMweDAxCisgICAgbGRyICAgcjAsID0weDFlNmUwMDE4CisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBiaWMgICByMSwgcjEsICMweDAwMDAwMDFGCisgICAgb3JyICAgcjEsIHIxLCByMiwgbHNsICM0CisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBjbXAgICByOCwgIzB4MDIKKyAgICBiZ2UgICBDQlI0X0VORAorCitjYnI0X3NjYW5fc3RhcnQ6CisgICAgbW92ICAgcjYsICMweDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IHBhc3MgY291bnQKKyAgICBtb3YgICByNywgIzB4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgbWFzayBkZWxheQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIERRUyBNYXNrIGRlbGF5IG1hcmdpbiB0ZXN0IGxvb3AKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjYnI0X25leHRfcGFyYW1ldGVyOgorICAgIGNtcCAgIHI3LCAjMHgxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbWF4IGRlbGF5ID0gMHhGCisgICAgYmdlICAgY2JyNF9uZXh0X21hc2tkbHkKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwMTggICAgICAgICAgICAgICAgICAgICAgICBAIGxvYWQgTUNSMTggcGFyYW1ldGVyCisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBiaWMgICByMSwgcjEsICMweDAwMDAwMDBGCisgICAgb3JyICAgcjEsIHIxLCByNworICAgIHN0ciAgIHIxLCBbcjBdCisgICAgYWRkICAgcjcsIHI3LCAjMHgwMQorCisvKiBDQlJTY2FuMygpIHN0YXJ0ICovCisgICAgYWRybCAgcjUsIFBBVFRFUk5fVEFCTEUgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IHBhdHRlcm4gdGFibGUgaW5kZXgKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgVGVzdCBwYXR0ZXJuIGl0ZXJhdGlvbiBsb29wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2JyNF9uZXh0X3Rlc3RfcGF0dGVybjoKKyAgICBtb3YgICByMTAsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNldCB0aGUgcmV0cnkgbG9vcCA9IDIgb2YgZWFjaCBwYXR0ZXJuCisgICAgbGRyICAgcjEsIFtyNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIHRlc3QgcGF0dGVybgorICAgIGxkciAgIHIwLCA9MHgxZTZlMDA3YworICAgIHN0ciAgIHIxLCBbcjBdCisgICAgY21wICAgcjEsICMweDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB0aGUgbGFzdCBkYXRhIGluIHBhdHRlcm4gaXMgMHgwMAorICAgIGJuZSAgIGNicjRfdGVzdF9idXJzdAorCisgICAgYW5kICAgcjMsIHI3LCAjMHhGRgorICAgIHN1YiAgIHIzLCByMywgIzB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgIEAgd2UgYWRkIDEgYWZ0ZXIgbG9vcCBjaGVjayBzbyB3ZSBuZWVkIHRvIGRlY3JlYXNlIDEKKyAgICBhZGQgICByNiwgcjYsICMweDAxICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluY3JlbWVudCBwYXNzIGNvdW50CisKKyAgICBsZHIgICByMCwgPTB4MWU3MjAwYjAgICAgICAgICAgICAgICAgICAgICAgICBAIHJlY29yZCBwYXNzIHdpbmRvdworICAgIGFkZCAgIHIwLCByMCwgcjgsIGxzbCAjMgorICAgIHJlY29yZF9kbGwyX3Bhc3NfcmFuZ2UKKyAgICBtb3YgICByMiwgIzB4MDEKKyAgICBhZGQgICByMSwgcjEsIHIyLCBsc2wgIzE2CisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBiICAgICBjYnI0X25leHRfcGFyYW1ldGVyCisKK2NicjRfdGVzdF9wYXR0ZXJuX2ZhaWw6CisgICAgY21wICAgcjYsICM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBwYXNzY250ID49IDUKKyAgICBiZ2UgICBjYnI0X25leHRfbWFza2RseQorICAgIGIgICAgIGNicjRfbmV4dF9wYXJhbWV0ZXIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBUZXN0IGZhaWwgcmV0cnkgbG9vcAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NicjRfcGF0dGVybl9mYWlsX3JldHJ5OgorCisvKiBDQlJUZXN0MygpIHN0YXJ0ICovCitjYnI0X3Rlc3RfYnVyc3Q6CisgICAgbGRyICAgcjAsID0weDFlNmUwMDcwCisgICAgbGRyICAgcjEsID0weDAwMDAwMDAwCisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBsZHIgICByMSwgPTB4MDAwMDAwQzEKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGxkciAgIHIzLCA9MHgzMDAwCitjYnI0X3dhaXRfZW5naW5lX2lkbGVfMDoKKyAgICBsZHIgICByMiwgW3IwXQorICAgIHRzdCAgIHIyLCByMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgRFsxMl0gPSBpZGxlIGJpdAorICAgIGJlcSAgIGNicjRfd2FpdF9lbmdpbmVfaWRsZV8wCisKKyAgICBsZHIgICByMiwgW3IwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHJlYWQgZmFpbCBiaXQgc3RhdHVzCisgICAgbW92ICAgcjEsICMweDAKKyAgICBzdHIgICByMSwgW3IwXQorICAgIG1vdiAgIHIyLCByMiwgbHNyICMxMyAgICAgICAgICAgICAgICAgICAgICAgIEAgRFsxM10gPSBmYWlsIGJpdAorICAgIGNtcCAgIHIyLCAjMHgwMAorICAgIGJuZSAgIGNicjRfdGVzdF9mYWlsCisKK2NicjRfdGVzdF9zaW5nbGU6CisgICAgbGRyICAgcjAsID0weDFlNmUwMDcwCisgICAgbGRyICAgcjEsID0weDAwMDAwMDAwCisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBsZHIgICByMSwgPTB4MDAwMDAwODUKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGxkciAgIHIzLCA9MHgzMDAwCitjYnI0X3dhaXRfZW5naW5lX2lkbGVfMToKKyAgICBsZHIgICByMiwgW3IwXQorICAgIHRzdCAgIHIyLCByMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgRFsxMl0gPSBpZGxlIGJpdAorICAgIGJlcSAgIGNicjRfd2FpdF9lbmdpbmVfaWRsZV8xCisKKyAgICBsZHIgICByMiwgW3IwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHJlYWQgZmFpbCBiaXQgc3RhdHVzCisgICAgbW92ICAgcjEsICMweDAKKyAgICBzdHIgICByMSwgW3IwXQorICAgIG1vdiAgIHIyLCByMiwgbHNyICMxMyAgICAgICAgICAgICAgICAgICAgICAgIEAgRFsxM10gPSBmYWlsIGJpdAorICAgIGNtcCAgIHIyLCAjMHgwMAorICAgIGJlcSAgIGNicjRfdGVzdF9wYXNzCisKKy8qIENCUlRlc3QzKCkgZW5kICovCisKK2NicjRfdGVzdF9mYWlsOgorICAgIHN1YnMgIHIxMCwgcjEwLCAjMQorICAgIGJuZSAgIGNicjRfcGF0dGVybl9mYWlsX3JldHJ5CisgICAgYiAgICAgY2JyNF90ZXN0X3BhdHRlcm5fZmFpbCAgICAgICAgICAgICAgICAgQCBDQlJTY2FuMygpIHJldHVybigwKQorCitjYnI0X3Rlc3RfcGFzczoKKyAgICBhZGQgICByNSwgcjUsICMweDA0ICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluY3JlYXNlIHRoZSB0ZXN0IHBhdHRlcm4gaW5kZXgKKyAgICBiICAgICBjYnI0X25leHRfdGVzdF9wYXR0ZXJuCisKK0NCUjRfRU5EOgorICAgIGxkciAgIHIwLCA9MHgxZTcyMDBiMCAgICAgICAgICAgICAgICAgICAgICAgIEAgY2hlY2sgbWFzayBtYXJnaW4KKyAgICBsZHIgICByMSwgW3IwXQorICAgIGFkZCAgIHIwLCByMCwgIzB4MDQKKyAgICBsZHIgICByMiwgW3IwXQorICAgIGFuZHMgIHI2LCByMiwgIzB4RkYgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZ2V0IG1pbiBvZiBNQ1IxOFs0XSA9IDEKKyAgICBibmUgICBjYnI0X25vc2V0X2RlbGF5CisgICAgYW5kcyAgcjUsIHIxLCAjMHhGRiAgICAgICAgICAgICAgICAgICAgICAgICAgQCBnZXQgbWluIG9mIE1DUjE4WzRdID0gMAorICAgIGJuZSAgIGNicjRfc2V0X2RlbGF5CisgICAgbW92ICAgcjEsIHIxLCBsc3IgIzggICAgICAgICAgICAgICAgICAgICAgICAgQCBnZXQgbWF4IG9mIE1DUjE4WzRdID0gMAorICAgIGFuZCAgIHIxLCByMSwgIzB4RkYKKyAgICBtb3YgICByMiwgcjIsIGxzciAjOCAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBtYXggb2YgTUNSMThbNF0gPSAxCisgICAgYW5kICAgcjIsIHIyLCAjMHhGRgorICAgIHN1YiAgIHIxLCByMSwgcjUKKyAgICBzdWIgICByMiwgcjIsIHI2CisgICAgY21wICAgcjEsIHIyCisgICAgYmdlICAgY2JyNF9ub3NldF9kZWxheQorCitjYnI0X3NldF9kZWxheToKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwMTgKKyAgICBsZHIgICByMSwgW3IwXQorICAgIG9yciAgIHIxLCByMSwgIzB4MTAKKyAgICBzdHIgICByMSwgW3IwXQorCitjYnI0X25vc2V0X2RlbGF5OgorICAgIGxkciAgIHIwLCA9MHgxZTZlMDA3MAorICAgIGxkciAgIHIxLCA9MHgwMDAwMDAwMAorICAgIHN0ciAgIHIxLCBbcjBdCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBDQlIgRmluaXNoCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQ2hlY2sgRFJBTSBTaXplCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgbGRyICAgcjAsID0weDFlNmUyMDcwCisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBiaWMgICByMSwgcjEsICMweEZFRkZGRkZGICAgICAgICAgICAgICAgICAgICBAIGJpdFsyNF09MSA9PiBERFIyCisgICAgbW92ICAgcjIsIHIxLCBsc3IgIzI0CisgICAgY21wICAgcjIsICMweDAxCisgICAgYmVxICAgY2hlY2tfZGRyMl9zaXplCisKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwMDQKKyAgICBsZHIgICByNSwgW3IwXQorICAgIGJpYyAgIHI1LCByNSwgIzB4MDAwMDAwMDMgICAgICAgICAgICAgICAgICAgIEAgcmVjb3JkIE1DUjA0CisgICAgb3JyICAgcjEsIHI1LCAjMHgzCisgICAgc3RyICAgcjEsIFtyMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzZXQgdG8gNEdiaXQKKyAgICBsZHIgICByNiwgPTB4MDAzRjIyMTcKKyNpZiBkZWZpbmVkKENPTkZJR19EUkFNXzMzNikKKyAgICBsZHIgICByNiwgPTB4MDAzNjFDMTMKKyNlbmRpZgorICAgIGIgICAgIGNoZWNrX2RyYW1fc2l6ZQorCitjaGVja19kZHIyX3NpemU6CisgICAgbGRyICAgcjAsID0weDFlNmUwMDA0CisgICAgbGRyICAgcjUsIFtyMF0KKyAgICBiaWMgICByNSwgcjUsICMweDAwMDAwMDIzICAgICAgICAgICAgICAgICAgICBAIHJlY29yZCBNQ1IwNAorICAgIG9yciAgIHIxLCByNSwgIzB4MjMKKyAgICBzdHIgICByMSwgW3IwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNldCB0byA0R2JpdAorICAgIGxkciAgIHI2LCA9MHgzRjJCMUIxNgorI2lmIGRlZmluZWQoQ09ORklHX0RSQU1fMzM2KQorICAgIGxkciAgIHI2LCA9MHgzQjIzMTYxMgorI2VuZGlmCisKKyAgICBsZHIgICByMCwgPTB4NDAwMDAwMDAKKyAgICBsZHIgICByMSwgPTB4MTgxNzE5MUEKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGxkciAgIHIwLCA9MHg0MDAwMjAwMAorICAgIGxkciAgIHIxLCA9MHg3MzYxNjUzMgorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbGRyICAgcjAsID0weDQwMDAwMDAwCisgICAgbGRyICAgcjEsID0weDE4MTcxOTFBCisgICAgbGRyICAgcjIsIFtyMF0KKyAgICBjbXAgICByMSwgcjIKKyAgICBibmUgICBjaGVja19kcmFtX3NpemVfZW5kICAgICAgICAgICAgICAgICAgICBAID09IDUxMk1iaXQKKyAgICBvcnIgICByNSwgcjUsICMweDIwICAgICAgICAgICAgICAgICAgICAgICAgICBAID49IDFHYml0CisgICAgbW92ICAgcjYsIHI2LCBsc3IgIzgKKworY2hlY2tfZHJhbV9zaXplOgorICAgIGxkciAgIHIwLCA9MHg1MDEwMDAwMAorICAgIGxkciAgIHIxLCA9MHg0MTQyNDM0NAorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbGRyICAgcjAsID0weDQ4MTAwMDAwCisgICAgbGRyICAgcjEsID0weDI1MjYyNzI4CisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBsZHIgICByMCwgPTB4NDAxMDAwMDAKKyAgICBsZHIgICByMSwgPTB4MTkxQTFCMUMKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGxkciAgIHIwLCA9MHg1MDEwMDAwMAorICAgIGxkciAgIHIxLCA9MHg0MTQyNDM0NAorICAgIGxkciAgIHIyLCBbcjBdCisgICAgY21wICAgcjIsIHIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCA9PSA0R2JpdAorICAgIG9ycmVxIHI1LCByNSwgIzB4MDMKKyAgICBtb3ZlcSByNiwgcjYsIGxzciAjMTYKKyAgICBiZXEgICBjaGVja19kcmFtX3NpemVfZW5kCisgICAgbGRyICAgcjAsID0weDQ4MTAwMDAwCisgICAgbGRyICAgcjEsID0weDI1MjYyNzI4CisgICAgbGRyICAgcjIsIFtyMF0KKyAgICBjbXAgICByMiwgcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAID09IDJHYml0CisgICAgb3JyZXEgcjUsIHI1LCAjMHgwMgorICAgIG1vdmVxIHI2LCByNiwgbHNyICM4CisgICAgYmVxICAgY2hlY2tfZHJhbV9zaXplX2VuZAorICAgIG9yciAgIHI1LCByNSwgIzB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgIEAgPT0gMUdiaXQKKworY2hlY2tfZHJhbV9zaXplX2VuZDoKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwMDQKKyAgICBzdHIgICByNSwgW3IwXQorICAgIGxkciAgIHIwLCA9MHgxZTZlMDAxNAorICAgIGxkciAgIHIxLCBbcjBdCisgICAgYmljICAgcjEsIHIxLCAjMHgwMDAwMDBGRgorICAgIGFuZCAgIHI2LCByNiwgIzB4RkYKKyAgICBvcnIgICByMSwgcjEsIHI2CisgICAgc3RyICAgcjEsIFtyMF0KKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDEyMCAgICAgICAgICAgICAgICAgICAgICAgIEAgVkdBIENvbXBhdGlibGUgTW9kZQorICAgIGxkciAgIHIxLCA9MHgwMDAwNTBDMCAgICAgICAgICAgICAgICAgICAgICAgIEAgNDA4IE1IegorI2lmIGRlZmluZWQoQ09ORklHX0RSQU1fMzM2KQorICAgIGxkciAgIHIxLCA9MHgwMDAwNERDMAorI2VuZGlmCisgICAgc3RyICAgcjEsIFtyMF0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFZlcnNpb24gTnVtYmVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgbGRyICAgcjAsID0weDFlNzIwMGE4CisgICAgbGRyICAgcjEsID0weDIwMTQxMjI5ICAgICAgICAgICAgICAgICAgICAgICAgQCByZWxlYXNlZCBkYXRlCisgICAgc3RyICAgcjEsIFtyMF0KKworICAgIGFkZCAgIHIwLCByMCwgIzQKKyAgICBsZHIgICByMSwgPTB4MDAwMDAwNjAgICAgICAgICAgICAgICAgICAgICAgICBAIHJlbGVhc2VkIFNESyB2ZXJzaW9uCisgICAgc3RyICAgcjEsIFtyMF0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIENhbGlicmF0aW9uIENvZGUgRW5kCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzZXRfc2NyYXRjaDoKKyAgICAvKlNldCBTY3JhdGNoIHJlZ2lzdGVyIEJpdCA2IGFmdGVyIGRkciBpbml0aWFsIGZpbmlzaGVkICovCisgICAgbGRyIHIwLCA9MHgxZTZlMjA0MAorICAgIGxkciByMSwgW3IwXQorICAgIG9yciByMSwgcjEsICMweDQwCisgICAgc3RyIHIxLCBbcjBdCisKKy8qIERlYnVnIC0gVUFSVCBjb25zb2xlIG1lc3NhZ2UgKi8KKyAgICBsZHIgcjAsID0weDFlNzg0MDAwCisgICAgbW92IHIxLCAjMHg0NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnRCcKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICdvJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4NkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ24nCisgICAgc3RyIHIxLCBbcjBdCisgICAgbW92IHIxLCAjMHg2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnZScKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICdccicKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDBBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICdcbicKKyAgICBzdHIgcjEsIFtyMF0KKy8qIERlYnVnIC0gVUFSVCBjb25zb2xlIG1lc3NhZ2UgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFNvbHZlIFBDSWUgQVNQTSBpc3N1ZSwgb25seSBhcHBsaWVkIHRvIEFTVDIzMDAgc2VyaWVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGxkciByMCwgPTB4MWU2ZTIwN2MgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQ2hlY2sgYm91bmRpbmcgZm9yIEFTVDExNTAgZXhpc3RlbmNlCisgICAgbGRyIHIxLCBbcjBdCisgICAgbW92IHIyLCByMSwgbHNyICMyNAorICAgIGNtcCByMiwgIzB4MDEKKyAgICBibmUgcGxhdGZvcm1fZXhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIG5vdCBtYXRjaCBBU1QyMzAwCisgICAgYmljIHIxLCByMSwgIzB4RkZGRkZDRkYKKyAgICBtb3YgcjEsIHIxLCBsc3IgIzgKKyAgICBjbXAgcjEsICMweDAyCisgICAgYmVxIHBsYXRmb3JtX2V4aXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBtYXRjaCBBU1QxMDUwCisKKyAgICBsZHIgcjAsID0weDFlNmUyMDA0ICAgICAgICAgICAgICAgICAgICAgICAgICBAIERpc2FibGUgSTJDIGNvbnRyb2xsZXIgcmVzZXQKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBvcnIgcjEsIHIxLCAjMHgwNAorICAgIHN0ciByMSwgW3IwXQorICAgIGJpYyByMSwgcjEsICMweDA0CisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNzhhMDU0ICAgICAgICAgICAgICAgICAgICAgICAgICBAIENoZWNrIEkyQyBidXMgc3RhdGUsIGlmIGJ1c3kgdGhlbiBxdWl0CisgICAgbGRyIHIxLCBbcjBdCisgICAgbW92IHIxLCByMSwgbHNyICMxNworICAgIGFuZCByMSwgcjEsICMweDAzCisgICAgY21wIHIxLCAjMHgwMworICAgIGJuZSBwbGF0Zm9ybV9leGl0CisKKyAgICBsZHIgcjAsID0weDFlNzhhMDQwICAgICAgICAgICAgICAgICAgICAgICAgICBAIEluaXQgSTJDMSBjb250cm9sbGVyCisgICAgbW92IHIxLCAjMHgwMQorICAgIG9yciByMSwgcjEsIHIxLCBsc2wgIzE2CisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNzhhMDQ0CisgICAgbGRyIHIxLCA9MHg3Nzc3NjcwNAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbW92IHIxLCAjMHgwCisgICAgbGRyIHIwLCA9MHgxZTc4YTA0OAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3OGEwNGMKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU3OGEwNTAKKyAgICBsZHIgcjEsID0weEZGRkZGRkZGCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNzhhMjAwICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBBU1QxMTUwIEkyQyBwYXNzd29yZAorICAgIGxkciByMSwgPTB4MDBBODhGQTgKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU3OGEwNWMKKyAgICBsZHIgcjEsID0weDAwMDAwMjAwICAgICAgICAgICAgICAgICAgICAgICAgICBAIEVuYWJsZSBidWZmZXIgbW9kZSB0cmFuc2ZlcmluZyAzIGJ5dGVzCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNzhhMDU0CisgICAgbGRyIHIxLCA9MHgwMDAwMDA2MyAgICAgICAgICAgICAgICAgICAgICAgICAgQCBGaXJlIGNvbW1tYW5kCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNzhhMDUwCitpMmNfd2FpdF9jbWRkb25lXzE6CisgICAgbGRyIHIxLCBbcjBdCisgICAgdHN0IHIxLCAjMHgzOAorICAgIGJlcSBpMmNfd2FpdF9jbWRkb25lXzEKKyAgICB0c3QgcjEsICMweDJBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHRyYW5zbWl0IGVycm9yCisgICAgYm5lIHBsYXRmb3JtX2V4aXQyCisgICAgbGRyIHIxLCA9MHhGRkZGRkZGRgorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTc4YTIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBEaXNhYmxlIEFTUE0gY2FwYWJpbGl0eQorICAgIGxkciByMSwgPTB4MDQwMDVEQTgKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU3OGEyMDQKKyAgICBsZHIgcjEsID0weDAwMDAwMDI0CisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNzhhMDVjCisgICAgbGRyIHIxLCA9MHgwMDAwMDIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBFbmFibGUgYnVmZmVyIG1vZGUgdHJhbnNmZXJpbmcgMyBieXRlcworICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTc4YTA1NAorICAgIGxkciByMSwgPTB4MDAwMDAwNjMgICAgICAgICAgICAgICAgICAgICAgICAgIEAgRmlyZSBjb21tbWFuZAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTc4YTA1MAoraTJjX3dhaXRfY21kZG9uZV8yOgorICAgIGxkciByMSwgW3IwXQorICAgIHRzdCByMSwgIzB4MzgKKyAgICBiZXEgaTJjX3dhaXRfY21kZG9uZV8yCisgICAgdHN0IHIxLCAjMHgyQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB0cmFuc21pdCBlcnJvcgorICAgIGJuZSBwbGF0Zm9ybV9leGl0MgorICAgIGxkciByMSwgPTB4RkZGRkZGRkYKKyAgICBzdHIgcjEsIFtyMF0KKworcGxhdGZvcm1fZXhpdDI6CisgICAgbGRyIHIwLCA9MHgxZTc4YTA0MCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBEaXNhYmxlIEkyQzEgY29udHJvbGxlcgorICAgIG1vdiByMSwgIzB4MDAKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGIgICBwbGF0Zm9ybV9leGl0CisuTFRPUkcKKworcGxhdGZvcm1fZXhpdDoKKyNpZmRlZiAgICAgIENPTkZJR19EUkFNX0VDQworICAgIGxkciByMCwgPTB4MWU2ZTAwMDQKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBvcnIgcjEsIHIxLCAjMHg4MAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDA1NAorICAgIGxkciByMSwgPTB4MDUwMDAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVDQyBwcm90ZWN0ZWQgbWVtb3J5IHNpemUsIGRlZmF1bHQgc2V0IGF0IDgwTSAgICovCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDdDCisgICAgbGRyIHIxLCA9MHgwMDAwMDAwMAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU2ZTAwNzQKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwNzAKKyAgICBsZHIgcjEsID0weDAwMDAwMjIxCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDcwCisgICAgbGRyIHIyLCA9MHgwMDAwMTAwMAorRUNDX0luaXRfRmxhZzoKKyAgICBsZHIgcjEsIFtyMF0KKyAgICB0c3QgcjEsIHIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIERbMTJdID0gMSwgRG9uZQorICAgIGJlcSBFQ0NfSW5pdF9GbGFnCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDcwCisgICAgbGRyIHIxLCA9MHgwMDAwMDAwMAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDA1MAorICAgIGxkciByMSwgPTB4ODAwMDAwMDAKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwNTAKKyAgICBsZHIgcjEsID0weDAwMDAwMDAwCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDcwCisgICAgbGRyIHIxLCA9MHgwMDAwMDQwMAorICAgIHN0ciByMSwgW3IwXQorI2VuZGlmCisgICAgbGRyIHIwLCA9MHgxZTZlMjAwOCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgVmlkZW8gRUNMSyBwaGFzZQorICAgIGxkciByMSwgW3IwXQorICAgIGxkciByMiwgPTB4ZmZmZmZmZjMKKyAgICBhbmQgcjEsIHIxLCByMgorICAgIG9yciByMSwgcjEsICMweDA4CisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUyMDA0CisgICAgbGRyIHIxLCBbcjBdCisgICAgbGRyIHIyLCA9MHhGRkJGRkZGRiAgICAgICAgICAgICAgICAgICAgICAgICAgQCBFbmFibGUgSlRBRyBNYXN0ZXIsIHNvbHZlIEFSTSBzdHVja2VkIGJ5IEpUQUcgaXNzdWUKKyAgICBhbmQgcjEsIHIxLCByMgorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMjA0OCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgTUFDIGludGVyZmFjZSBkZWxheSB0aW1pbmcKKyAgICBsZHIgcjEsID0weDIyNTUKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTIwNzAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IE1BQyBBSEIgYnVzIGNsb2NrCisgICAgbGRyIHIxLCBbcjBdCisgICAgbW92IHIyLCAjMHgwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBEZWZhdWx0IFJNSUksIHNldCBNSENMSyA9IEhQTEwvMTAKKyAgICB0c3QgcjEsICMweEMwCisgICAgbW92bmUgcjIsICMweDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpZiBSR01JSSwgICAgIHNldCBNSENMSyA9IEhQTEwvNgorICAgIGxkciByMCwgPTB4MWU2ZTIwMDgKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBiaWMgcjEsIHIxLCAjMHgwMDA3MDAwMAorICAgIG9yciByMSwgcjEsIHIyLCBsc2wgIzE2CisgICAgc3RyIHIxLCBbcjBdCisKKy8qIFRlc3QgLSBEUkFNIGluaXRpYWwgdGltZSAqLworICAgIGxkciByMCwgPTB4MWU3ODIwNDAKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weEZGRkZGRkZGCisgICAgc3ViIHIxLCByMCwgcjEKKyAgICBsZHIgcjAsID0weDFlNzIwMDljCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTcyMDBhNAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODIwMzAKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBiaWMgcjEsIHIxLCAjMHgwMDAwRjAwMAorICAgIHN0ciByMSwgW3IwXQorLyogVGVzdCAtIERSQU0gaW5pdGlhbCB0aW1lICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBSZXNldCBHUElPIHJlZ2lzdGVycyB3aGVuIHdhdGNoZG9nIHJlc2V0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGxkciByMCwgPTB4MWU2ZTIwN2MgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQ2hlY2sgUmV2aXNpb24gSUQKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsIHIxLCBsc3IgIzI0CisgICAgY21wIHIxLCAjMHgwMgorICAgIGJuZSBwbGF0Zm9ybV9leGl0MyAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbm90IG1hdGNoIEFTVDI0MDAKKworICAgIGxkciByMCwgPTB4MWU2ZTIwM2MgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQ2hlY2sgd2F0Y2hkb2cgcmVzZXQgZXZlbnQKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBhbmQgcjEsIHIxLCAjMHgwNgorICAgIGNtcCByMSwgIzB4MAorICAgIGJlcSBwbGF0Zm9ybV9leGl0MyAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbm8gd2F0Y2hkb2cgcmVzZXQgZXZlbnQKKworICAgIGxkciByMCwgPTB4MWU2ZTIwOWMgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQ2hlY2sgd2F0Y2hkb2cgR1BJTyBzZWxlY3Rpb24KKyAgICBsZHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsIHIxLCBsc3IgIzIxCisgICAgdHN0IHIxLCAjMHgwMQorICAgIGJlcSBwbGF0Zm9ybV9leGl0MyAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbm8gd2F0Y2hkb2cgcmVzZXQgc2VsZWN0aW9uCisKKyAgICBsZHIgcjEsID0weDAwMDAwMDAwICAgICAgICAgICAgICAgICAgICAgICAgICBAIGNsZWFyIEdQSU8gcmVnaXN0ZXIgcmVzZXQgYnkgUFJTVF9OCisgICAgbGRyIHIyLCA9MHhGRkZGRkZGRgorICAgIGxkciByMCwgPTB4MWU3ODAwMDgKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMDBjCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDAxMAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwMTQKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMDE4CisgICAgc3RyIHIyLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDAyOAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwMmMKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMDMwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDAzNAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwMzgKKyAgICBzdHIgcjIsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMDQwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDA0NAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwNDgKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMDRjCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDA1MAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwNTQKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMDU4CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDA2MAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwNjQKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMDY4CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDA2YworICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwOTAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMDk0CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDA5OAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwOWMKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMGEwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDBhNAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwYTgKKyAgICBzdHIgcjIsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMGIwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDBiNAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwYjgKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMGUwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDBlNAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwZTgKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMGVjCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDBmMAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwZjQKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMGY4CisgICAgc3RyIHIyLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDEwMAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxMDQKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTA4CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDExMAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxMTQKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTE4CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDExYworICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxMjAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTI0CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDEyOAorICAgIHN0ciByMiwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxMzAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTM0CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDEzOAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxNDAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTQ0CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDE0OAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxNGMKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTUwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDE1NAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxNTgKKyAgICBzdHIgcjIsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTYwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDE2NAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxNjgKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTcwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDE3NAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxNzgKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTdjCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDE4MAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxODQKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTg4CisgICAgc3RyIHIyLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDE5MAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxOTQKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTk4CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDFkMAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxZDQKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU3ODAyMDQgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY2xlYXIgU0dQSU9NIHJlZ2lzdGVyIHJlc2V0IGJ5IFBSU1RfTgorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAyMDgKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMjBjCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDIxMAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAyMTQKKyAgICBzdHIgcjIsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMjIwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDIyNAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAyMjgKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMjJjCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDIzMAorICAgIHN0ciByMiwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAyM2MKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMjQwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDI0NAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAyNDgKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMjRjCisgICAgc3RyIHIyLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDI1NAorICAgIGxkciByMywgPTB4MDEwMDAwNDAKKyAgICBzdHIgcjMsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMjU4CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDI1YworICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAyNjAKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU3ODAzMDAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY2xlYXIgU0dQSU9TIHJlZ2lzdGVyIHJlc2V0IGJ5IFBSU1RfTgorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAzMDQKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMzA4CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDMwYworICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAzMTAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMzE0CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDMxOAorICAgIHN0ciByMiwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAzMWMKKyAgICBzdHIgcjIsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMzIwCisgICAgc3RyIHIyLCBbcjBdCisKK3BsYXRmb3JtX2V4aXQzOgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgU1BJIFRpbWluZyBDYWxpYnJhdGlvbiwgbm90IGFwcGxpY2FibGUgdG8gQVNUMjMwMCBzZXJpZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgbGRyIHIwLCA9MHgxZTZlMjA3YyAgICAgICAgICAgICAgICAgICAgICAgICAgQCBDaGVjayBSZXZpc2lvbiBJRAorICAgIGxkciByMSwgW3IwXQorICAgIG1vdiByMSwgcjEsIGxzciAjMjQKKyAgICBjbXAgcjEsICMweDAyCisgICAgYmx0IHBsYXRmb3JtX2V4aXQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBub3QgbWF0Y2ggQVNUMjQwMCBvciBsYXRlcgorCisgICAgbGRyIHIwLCA9MHgxZTZlMjA3MCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBDaGVjayBTUEkgZmxhc2gKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBhbmQgcjEsIHIxLCAjMHgwMworICAgIGNtcCByMSwgIzB4MDIKKyAgICBibmUgcGxhdGZvcm1fZXhpdDQKKworICAgIG1vdiByMiwgIzB4MAorICAgIG1vdiByNiwgIzB4MAorICAgIG1vdiByNywgIzB4MAorICAgIGluaXRfc3BpX2NoZWNrc3VtCitzcGlfY2hlY2tzdW1fd2FpdF8wOgorICAgIGxkciByMSwgW3IwXQorICAgIHRzdCByMSwgcjIKKyAgICBiZXEgc3BpX2NoZWNrc3VtX3dhaXRfMAorICAgIGxkciByMCwgPTB4MWU2MjAwOTAKKyAgICBsZHIgcjUsIFtyMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHJlY29yZCBnb2xkZW4gY2hlY2tzdW0KKyAgICBsZHIgcjAsID0weDFlNjIwMDgwCisgICAgbW92IHIxLCAjMHgwCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNjIwMDEwICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNldCB0byBmYXN0IHJlYWQgbW9kZQorICAgIGxkciByMSwgPTB4MDAwQjAwNDEKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByNiwgPTB4MDBGN0U2RDAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgSW5pdCBzcGljbGsgbG9vcAorICAgIG1vdiByOCwgIzB4MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgSW5pdCBkZWxheSByZWNvcmQKKworc3BpX2Nicl9uZXh0X2Nsa3JhdGU6CisgICAgbW92IHI2LCByNiwgbHNyICMweDQKKyAgICBjbXAgcjYsICMweDAKKyAgICBiZXEgc3BpX2Nicl9lbmQKKworICAgIG1vdiByNywgIzB4MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgSW5pdCBkZWxheSBsb29wCisgICAgbW92IHI4LCByOCwgbHNsICM0CisKK3NwaV9jYnJfbmV4dF9kZWxheV9zOgorICAgIG1vdiByMiwgIzB4OAorICAgIGluaXRfc3BpX2NoZWNrc3VtCitzcGlfY2hlY2tzdW1fd2FpdF8xOgorICAgIGxkciByMSwgW3IwXQorICAgIHRzdCByMSwgcjIKKyAgICBiZXEgc3BpX2NoZWNrc3VtX3dhaXRfMQorICAgIGxkciByMCwgPTB4MWU2MjAwOTAKKyAgICBsZHIgcjIsIFtyMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHJlYWQgY2hlY2tzdW0KKyAgICBsZHIgcjAsID0weDFlNjIwMDgwCisgICAgbW92IHIxLCAjMHgwCisgICAgc3RyIHIxLCBbcjBdCisgICAgY21wIHIyLCByNQorICAgIGJuZSBzcGlfY2JyX25leHRfZGVsYXlfZQorCisgICAgbW92IHIyLCAjMHgwCisgICAgaW5pdF9zcGlfY2hlY2tzdW0KK3NwaV9jaGVja3N1bV93YWl0XzI6CisgICAgbGRyIHIxLCBbcjBdCisgICAgdHN0IHIxLCByMgorICAgIGJlcSBzcGlfY2hlY2tzdW1fd2FpdF8yCisgICAgbGRyIHIwLCA9MHgxZTYyMDA5MAorICAgIGxkciByMiwgW3IwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcmVhZCBjaGVja3N1bQorICAgIGxkciByMCwgPTB4MWU2MjAwODAKKyAgICBtb3YgcjEsICMweDAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBjbXAgcjIsIHI1CisgICAgYm5lIHNwaV9jYnJfbmV4dF9kZWxheV9lCisKKyAgICBvcnIgcjgsIHI4LCByNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHJlY29yZCBwYXNzZWQgZGVsYXkKKyAgICBiICAgc3BpX2Nicl9uZXh0X2Nsa3JhdGUKKworc3BpX2Nicl9uZXh0X2RlbGF5X2U6CisgICAgYWRkIHI3LCByNywgIzB4MQorICAgIGNtcCByNywgIzB4NgorICAgIGJsdCBzcGlfY2JyX25leHRfZGVsYXlfcworICAgIGIgICBzcGlfY2JyX25leHRfY2xrcmF0ZQorCitzcGlfY2JyX2VuZDoKKyAgICBsZHIgcjAsID0weDFlNjIwMDk0CisgICAgc3RyIHI4LCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTYyMDAxMAorICAgIG1vdiByMSwgIzB4MAorICAgIHN0ciByMSwgW3IwXQorCitwbGF0Zm9ybV9leGl0NDoKKworICAgIC8qIHJlc3RvcmUgbHIgKi8KKyAgICBtb3YgbHIsIHI0CisKKyAgICAvKiBiYWNrIHRvIGFyY2ggY2FsbGluZyBjb2RlICovCisgICAgbW92IHBjLCBscgpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDIzMDAvcmM0LmMgYi9ib2FyZC9hc3BlZWQvYXN0MjMwMC9yYzQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMmUwZmZhCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvcmM0LmMKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCitzdHJ1Y3QgcmM0X3N0YXRlCit7CisgICAgaW50IHgsIHksIG1bMjU2XTsKK307CisKK3ZvaWQgcmM0X3NldHVwKCBzdHJ1Y3QgcmM0X3N0YXRlICpzLCB1bnNpZ25lZCBjaGFyICprZXksICBpbnQgbGVuZ3RoICkKK3sKKyAgICBpbnQgaSwgaiwgaywgKm0sIGE7CisKKyAgICBzLT54ID0gMDsKKyAgICBzLT55ID0gMDsKKyAgICBtID0gcy0+bTsKKworICAgIGZvciggaSA9IDA7IGkgPCAyNTY7IGkrKyApCisgICAgeworICAgICAgICBtW2ldID0gaTsKKyAgICB9CisKKyAgICBqID0gayA9IDA7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgMjU2OyBpKysgKQorICAgIHsKKyAgICAgICAgYSA9IG1baV07CisgICAgICAgIGogPSAodW5zaWduZWQgY2hhcikgKCBqICsgYSArIGtleVtrXSApOworICAgICAgICBtW2ldID0gbVtqXTsgbVtqXSA9IGE7CisgICAgICAgIGlmKCArK2sgPj0gbGVuZ3RoICkgayA9IDA7CisgICAgfQorfQorCit2b2lkIHJjNF9jcnlwdCggc3RydWN0IHJjNF9zdGF0ZSAqcywgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbmd0aCApCit7IAorICAgIGludCBpLCB4LCB5LCAqbSwgYSwgYjsKKworICAgIHggPSBzLT54OworICAgIHkgPSBzLT55OworICAgIG0gPSBzLT5tOworCisgICAgZm9yKCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrICkKKyAgICB7CisgICAgICAgIHggPSAodW5zaWduZWQgY2hhcikgKCB4ICsgMSApOyBhID0gbVt4XTsKKyAgICAgICAgeSA9ICh1bnNpZ25lZCBjaGFyKSAoIHkgKyBhICk7CisgICAgICAgIG1beF0gPSBiID0gbVt5XTsKKyAgICAgICAgbVt5XSA9IGE7CisgICAgICAgIGRhdGFbaV0gXj0gbVsodW5zaWduZWQgY2hhcikgKCBhICsgYiApXTsKKyAgICB9CisKKyAgICBzLT54ID0geDsKKyAgICBzLT55ID0geTsKK30KKwordm9pZCByYzRfY3J5cHRfc3codW5zaWduZWQgY2hhciAqZGF0YSwgaW50IHVsTXNnTGVuZ3RoLCB1bnNpZ25lZCBjaGFyICpyYzRfa2V5LCB1bnNpZ25lZCBsb25nIHVsS2V5TGVuZ3RoICkKK3sKKyAgICBzdHJ1Y3QgcmM0X3N0YXRlIHM7CisgICAgCisgICAgcmM0X3NldHVwKCAmcywgcmM0X2tleSwgdWxLZXlMZW5ndGggKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHJjNF9jcnlwdCggJnMsIGRhdGEsIHVsTXNnTGVuZ3RoICk7ICAgIAorfQpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDIzMDAvcmVndGVzdC5jIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvcmVndGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFjZDc1YWUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hc3BlZWQvYXN0MjMwMC9yZWd0ZXN0LmMKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogRGlhZ25vc3RpY3Mgc3VwcG9ydAorICovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPHBvc3QuaD4KKyNpbmNsdWRlICJzbHQuaCIKKworI2lmICgoQ0ZHX0NNRF9TTFQgJiBDRkdfQ01EX1JFR1RFU1QpICYmIGRlZmluZWQoQ09ORklHX1NMVCkpCisjaW5jbHVkZSAicmVndGVzdC5oIgorCitpbnQgZG9fcmVndGVzdCAodm9pZCkKK3sKKwlfU09DUmVnVGVzdEluZm8JKnBqU09DUmVnSW5mbzsKKwlfU09DUmVnVGVzdFRibCAqcGpSZWdUYWJsZTsKKwl1bnNpZ25lZCBsb25nIHVsUmVnQmFzZTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyB1bEluZGV4LCB1bEJhY2ssIHVsQU5ELCB1bE1hc2ssIHVsRGF0YSwgdWxUZW1wOworICAgICAgICB1bnNpZ25lZCBsb25nIEZsYWdzID0gMDsKKwkKKwkvKiB1bmxvY2sgcmVnICovCisgICAgICAgICoodW5zaWduZWQgbG9uZyAqKSAoMHgxZTYwMDAwMCkgPSAweGFlZWQxYTAzOwkvKiBBSEJDICovCisgICAgICAgICoodW5zaWduZWQgbG9uZyAqKSAoMHgxZTZlMDAwMCkgPSAweGZjNjAwMzA5OwkvKiBNTUMgKi8KKyAgICAgICAgKih1bnNpZ25lZCBsb25nICopICgweDFlNmUyMDAwKSA9IDB4MTY4OGE4YTg7CS8qIFNDVSAqLworCisgICAgICAgIC8qIFNDVSAqLworCisgICAgICAgIC8qIGRvIHRlc3QgKi8JCisgICAgICAgIHBqU09DUmVnSW5mbyA9IFNPQ1JlZ1Rlc3RJbmZvOworICAgICAgICB3aGlsZSAoc3RyY21wKHBqU09DUmVnSW5mby0+ak5hbWUsICJFTkQiKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogUmVnLiBUZXN0IFN0YXJ0ICovCisgICAgICAgICAgICB1bFJlZ0Jhc2UgPSBwalNPQ1JlZ0luZm8tPnVsUmVnT2Zmc2V0OworICAgICAgICAgICAgcGpSZWdUYWJsZSA9IHBqU09DUmVnSW5mby0+cGpUYmxJbmRleDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgd2hpbGUgKHBqUmVnVGFibGUtPnVsSW5kZXggIT0gMHhGRkZGRkZGRikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bEluZGV4ID0gdWxSZWdCYXNlICsgcGpSZWdUYWJsZS0+dWxJbmRleDsJCisKKyAgICAgICAgICAgICAgICB1bEJhY2sgPSAqKHVuc2lnbmVkIGxvbmcgKikgKHVsSW5kZXgpOworCisgICAgICAgICAgICAgICAgdWxNYXNrICA9IHBqUmVnVGFibGUtPnVsTWFzazsKKyAgICAgICAgICAgICAgICB1bEFORCAgPSB+cGpSZWdUYWJsZS0+dWxNYXNrOworICAgICAgIAkgICAgICAgIAkgICAgCQorICAgICAgICAgICAgICAgIHVsRGF0YSAgPSAweEZGRkZGRkZGICYgcGpSZWdUYWJsZS0+dWxNYXNrOworICAgICAgICAgICAgICAgICoodW5zaWduZWQgbG9uZyAqKSAodWxJbmRleCkgPSB1bERhdGE7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHVsVGVtcCA9ICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAodWxJbmRleCkgJiBwalJlZ1RhYmxlLT51bE1hc2s7CisgICAgICAgICAgICAgICAgaWYgKHVsRGF0YSAhPSB1bFRlbXApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGbGFncyB8PSBwalNPQ1JlZ0luZm8tPnVsRmxhZ3M7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiW0RCR10gUmVnVGVzdDogRmFpbGVkIEluZGV4OiV4LCBEYXRhOiV4LCBUZW1wOiV4IFxuIiwgdWxJbmRleCwgdWxEYXRhLCB1bFRlbXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB1bERhdGEgID0gMHgwMDAwMDAwMCAmIHBqUmVnVGFibGUtPnVsTWFzazsKKyAgICAgICAgICAgICAgICAqKHVuc2lnbmVkIGxvbmcgKikgKHVsSW5kZXgpID0gdWxEYXRhOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB1bFRlbXAgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKHVsSW5kZXgpICYgcGpSZWdUYWJsZS0+dWxNYXNrOworICAgICAgICAgICAgICAgIGlmICh1bERhdGEgIT0gdWxUZW1wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRmxhZ3MgfD0gcGpTT0NSZWdJbmZvLT51bEZsYWdzOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIltEQkddIFJlZ1Rlc3Q6IEZhaWxlZCBJbmRleDoleCwgRGF0YToleCwgVGVtcDoleCBcbiIsIHVsSW5kZXgsIHVsRGF0YSwgdWxUZW1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICoodW5zaWduZWQgbG9uZyAqKSAodWxJbmRleCkgPSB1bEJhY2s7CisgICAgICAgCisgICAgICAgICAgICAgICAgcGpSZWdUYWJsZSsrOworICAgICAgICAgIAkKKyAgICAgICAgICAgfSAvKiBJbmRpdmlkdWFsIFJlZy4gVGVzdCAqLworCisgICAgICAgICAgIGlmIChGbGFncyAmIHBqU09DUmVnSW5mby0+dWxGbGFncykKKyAgICAgICAgICAgICAgIHByaW50ZigiW0lORk9dIFJlZ1Rlc3Q6ICVzIEZhaWxlZCBcbiIsIHBqU09DUmVnSW5mby0+ak5hbWUpOworICAgICAgICAgICAKKyAgICAgICAgICAgcGpTT0NSZWdJbmZvKys7CisgICAgICAgICAgIAorICAgICAgICB9IC8qIFJlZy4gVGVzdCAqLworCisJcmV0dXJuIEZsYWdzOworCQorfQorCisjZW5kaWYgLyogQ09ORklHX1NMVCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDIzMDAvcmVndGVzdC5oIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvcmVndGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ5YTM2MGUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hc3BlZWQvYXN0MjMwMC9yZWd0ZXN0LmgKQEAgLTAsMCArMSwyNTUgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGxvbmcgdWxJbmRleDsKKyAgICB1bnNpZ25lZCBsb25nIHVsTWFzazsKK30gX1NPQ1JlZ1Rlc3RUYmw7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBjaGFyIGpOYW1lWzEwXTsKKyAgICB1bnNpZ25lZCBsb25nIHVsUmVnT2Zmc2V0OworICAgIF9TT0NSZWdUZXN0VGJsICpwalRibEluZGV4OworICAgIHVuc2lnbmVkIGxvbmcgdWxGbGFnczsKK30gX1NPQ1JlZ1Rlc3RJbmZvOworCitfU09DUmVnVGVzdFRibCBTTUNSZWdUZXN0VGJsW10gPSB7CisgICAgezB4MDAwMDAwMDAsIDB4MDAwMDFGRjN9LAorICAgIHsweDAwMDAwMDA0LCAweEZGRkZGRkZGfSwKKyAgICB7MHgwMDAwMDAwOCwgMHgwRkZGMTdGRn0sCisgICAgezB4MDAwMDAwMEMsIDB4RkZGRkZGRkZ9LAorICAgIHsweDAwMDAwMDEwLCAweEZGNUZGRkYzfSwKKyAgICB7MHgwMDAwMDAxOCwgMHgwRkZGRkZGRn0sCisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgQUhCQ1JlZ1Rlc3RUYmxbXSA9IHsKKyAgICB7MHgwMDAwMDA4MCwgMHgwMDAwRkZGRX0sICAgICAgICAJCisgICAgezB4MDAwMDAwODgsIDB4MDEwMDAwMDB9LAorICAgIHsweDAwMDAwMDhjLCAweDAwMDAwMDMxfSwJCisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgTUlDUmVnVGVzdFRibFtdID0geworLyoJCisgICAgezB4MDAwMDAwMDAsIDB4MEZGRkZGRjh9LAorICAgIHsweDAwMDAwMDA0LCAweDBGRkZGRkY4fSwKKyAgICB7MHgwMDAwMDAwOCwgMHgwMDAwRkZGRn0sCisgICAgezB4MDAwMDAwMEMsIDB4MEZGRkYwMDB9LAorICAgIHsweDAwMDAwMDEwLCAweEZGRkZGRkZGfSwKKyovCisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LAorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgTUFDMVJlZ1Rlc3RUYmxbXSA9IHsKKyAgICB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sICAgICAgICAJCit9OworCitfU09DUmVnVGVzdFRibCBNQUMyUmVnVGVzdFRibFtdID0geworICAgIHsweEZGRkZGRkZGLCAweEZGRkZGRkZGfSwgICAgICAgIAkKK307CisKK19TT0NSZWdUZXN0VGJsIFVTQjJSZWdUZXN0VGJsW10gPSB7CisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgVklDUmVnVGVzdFRibFtdID0geworICAgIHsweDAwMDAwMDBDLCAweEZGRkZGRkZGfSwKKyAgICB7MHgwMDAwMDAyNCwgMHhGRkZGRkZGRn0sCisgICAgezB4MDAwMDAwMjgsIDB4RkZGRkZGRkZ9LAorICAgIHsweDAwMDAwMDJDLCAweEZGRkZGRkZGfSwKKyAgICB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sCit9OworCitfU09DUmVnVGVzdFRibCBNTUNSZWdUZXN0VGJsW10gPSB7CisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgVVNCMTFSZWdUZXN0VGJsW10gPSB7CisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgU0NVUmVnVGVzdFRibFtdID0geworICAgIHsweEZGRkZGRkZGLCAweEZGRkZGRkZGfSwgICAgICAgIAkKK307CisKK19TT0NSZWdUZXN0VGJsIEhBU0VSZWdUZXN0VGJsW10gPSB7CisgICAgezB4MDAwMDAwMDAsIDB4MEZGRkZGRjh9LAorICAgIHsweDAwMDAwMDA0LCAweDBGRkZGRkY4fSwKKyAgICB7MHgwMDAwMDAwOCwgMHgwRkZGRkZGOH0sCisgICAgezB4MDAwMDAwMEMsIDB4MEZGRkZGRjh9LAorICAgIC8vezB4MDAwMDAwMTAsIDB4MDAwMDFGRkZ9LAorICAgIHsweDAwMDAwMDIwLCAweDBGRkZGRkY4fSwKKyAgICB7MHgwMDAwMDAyNCwgMHgwRkZGRkZGOH0sCisgICAgezB4MDAwMDAwMjgsIDB4MEZGRkZGYzB9LAorICAgIHsweDAwMDAwMDJDLCAweDBGRkZGRkZGfSwKKyAgICAvL3sweDAwMDAwMDMwLCAweDAwMDAwM0ZGfSwKKyAgICB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sCit9OworCitfU09DUmVnVGVzdFRibCBJMlNSZWdUZXN0VGJsW10gPSB7CisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgQ1JUUmVnVGVzdFRibFtdID0geworLyoJCisgICAgezB4MDAwMDAwMDAsIDB4MDAxRjM3MDN9LAorICAgIHsweDAwMDAwMDA0LCAweDAwMDBGRkMxfSwKKyovICAgIAorICAgIHsweDAwMDAwMDEwLCAweDBGRkYwRkZGfSwKKyAgICB7MHgwMDAwMDAxNCwgMHgwRkZGMEZGRn0sCisgICAgezB4MDAwMDAwMTgsIDB4MDdGRjA3RkZ9LAorICAgIHsweDAwMDAwMDFDLCAweDA3RkYwN0ZGfSwKKyAgICB7MHgwMDAwMDAyMCwgMHgwRkZGRkZGOH0sCisgICAgezB4MDAwMDAwMjQsIDB4MDdGRjNGRjh9LAorLyogICAgCisgICAgezB4MDAwMDAwMjgsIDB4MDAzRjAwM0Z9LAorICAgIHsweDAwMDAwMDMwLCAweDAwM0YwMDNGfSwKKyAgICB7MHgwMDAwMDAzNCwgMHgwRkZGMEZGRn0sCisgICAgezB4MDAwMDAwMzgsIDB4MEZGRkZGRjh9LAorKi8gICAgCisgICAgezB4MDAwMDAwNDAsIDB4MEZGRjBGRkZ9LAorICAgIHsweDAwMDAwMDQ0LCAweDA3RkYwN0ZGfSwKKyAgICB7MHgwMDAwMDA0OCwgMHgwRkZGRkZGOH0sCisgICAgezB4MDAwMDAwNEMsIDB4MDBGRjA3Rjh9LAorICAgIHsweDAwMDAwMDUwLCAweDAwMEYwRjBGfSwKKy8qICAgIAorICAgIHsweDAwMDAwMDYwLCAweDAwMUYzNzAzfSwKKyAgICB7MHgwMDAwMDA2NCwgMHgwMDAwRkZDMX0sCisqLyAgICAKKyAgICB7MHgwMDAwMDA3MCwgMHgwRkZGMEZGRn0sCisgICAgezB4MDAwMDAwNzQsIDB4MEZGRjBGRkZ9LAorICAgIHsweDAwMDAwMDc4LCAweDA3RkYwN0ZGfSwKKyAgICB7MHgwMDAwMDA3QywgMHgwN0ZGMDdGRn0sCisgICAgezB4MDAwMDAwODAsIDB4MEZGRkZGRjh9LAorICAgIHsweDAwMDAwMDg0LCAweDA3RkYzRkY4fSwKKy8qICAgIAorICAgIHsweDAwMDAwMDg4LCAweDAwM0YwMDNGfSwKKyAgICB7MHgwMDAwMDA5MCwgMHgwMDNGMDAzRn0sCisgICAgezB4MDAwMDAwOTQsIDB4MEZGRjBGRkZ9LAorICAgIHsweDAwMDAwMDk4LCAweDBGRkZGRkY4fSwKKyovICAgIAorICAgIHsweDAwMDAwMEEwLCAweDBGRkYwRkZGfSwKKyAgICB7MHgwMDAwMDBBNCwgMHgwN0ZGMDdGRn0sCisgICAgezB4MDAwMDAwQTgsIDB4MEZGRkZGRjh9LAorICAgIHsweDAwMDAwMEFDLCAweDAwRkYwN0Y4fSwKKyAgICB7MHgwMDAwMDBCMCwgMHgwMDBGMEYwRn0sCisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LAorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgVklERU9SZWdUZXN0VGJsW10gPSB7CisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgQTJQUmVnVGVzdFRibFtdID0geworICAgIHsweEZGRkZGRkZGLCAweEZGRkZGRkZGfSwgICAgICAgIAkKK307CisKK19TT0NSZWdUZXN0VGJsIE1ETUFSZWdUZXN0VGJsW10gPSB7CisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgTTJEUmVnVGVzdFRibFtdID0geworICAgIHsweEZGRkZGRkZGLCAweEZGRkZGRkZGfSwgICAgICAgIAkKK307CisKK19TT0NSZWdUZXN0VGJsIEdQSU9SZWdUZXN0VGJsW10gPSB7CisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgUlRDUmVnVGVzdFRibFtdID0geworICAgIHsweEZGRkZGRkZGLCAweEZGRkZGRkZGfSwgICAgICAgIAkKK307CisKK19TT0NSZWdUZXN0VGJsIFRJTUVSUmVnVGVzdFRibFtdID0geworICAgIHsweEZGRkZGRkZGLCAweEZGRkZGRkZGfSwgICAgICAgIAkKK307CisKK19TT0NSZWdUZXN0VGJsIFVBUlQxUmVnVGVzdFRibFtdID0geworICAgIHsweEZGRkZGRkZGLCAweEZGRkZGRkZGfSwgICAgICAgIAkKK307CisKK19TT0NSZWdUZXN0VGJsIFVBUlQyUmVnVGVzdFRibFtdID0geworICAgIHsweEZGRkZGRkZGLCAweEZGRkZGRkZGfSwgICAgICAgIAkKK307CisKK19TT0NSZWdUZXN0VGJsIFdEVFJlZ1Rlc3RUYmxbXSA9IHsKKyAgICB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sICAgICAgICAJCit9OworCitfU09DUmVnVGVzdFRibCBQV01SZWdUZXN0VGJsW10gPSB7CisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgVlVBUlQxUmVnVGVzdFRibFtdID0geworICAgIHsweEZGRkZGRkZGLCAweEZGRkZGRkZGfSwgICAgICAgIAkKK307CisKK19TT0NSZWdUZXN0VGJsIFZVQVJUMlJlZ1Rlc3RUYmxbXSA9IHsKKyAgICB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sICAgICAgICAJCit9OworCitfU09DUmVnVGVzdFRibCBMUENSZWdUZXN0VGJsW10gPSB7CisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgSTJDUmVnVGVzdFRibFtdID0geworICAgIHsweEZGRkZGRkZGLCAweEZGRkZGRkZGfSwgICAgICAgIAkKK307CisKK19TT0NSZWdUZXN0VGJsIFBFQ0lSZWdUZXN0VGJsW10gPSB7CisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgUENJQVJlZ1Rlc3RUYmxbXSA9IHsKKyAgICB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sICAgICAgICAJCit9OworCitfU09DUmVnVGVzdFRibCBQQ0lSZWdUZXN0VGJsW10gPSB7CisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworCisvKiBUZXN0IExpc3QgKi8KK19TT0NSZWdUZXN0SW5mbyBTT0NSZWdUZXN0SW5mb1tdID0geworICAgIC8qIFRlc3QgTmFtZSwgUmVnLiBPZmZzZXQsICAgICAgVGVzdCBUYWJsZSwgRXJyb3IgQ29kZSAgKi8KKyAgICB7ICAgIlNNQ1JFRyIsIDB4MTYwMDAwMDAsICAgIFNNQ1JlZ1Rlc3RUYmwsIDB4MDAwMDAwMDF9LAorICAgIHsgICJBSEJDUkVHIiwgMHgxZTYwMDAwMCwgICBBSEJDUmVnVGVzdFRibCwgMHgwMDAwMDAwMn0sCisgICAgeyAgICJNSUNSRUciLCAweDFlNjQwMDAwLCAgICBNSUNSZWdUZXN0VGJsLCAweDAwMDAwMDA0fSwKKyAgICB7ICAiTUFDMVJFRyIsIDB4MWU2NjAwMDAsICAgTUFDMVJlZ1Rlc3RUYmwsIDB4MDAwMDAwMDh9LAorICAgIHsgICJNQUMyUkVHIiwgMHgxZTY4MDAwMCwgICBNQUMyUmVnVGVzdFRibCwgMHgwMDAwMDAxMH0sCisgICAgeyAgIlVTQjJSRUciLCAweDFlNmEwMDAwLCAgIFVTQjJSZWdUZXN0VGJsLCAweDAwMDAwMDIwfSwKKyAgICB7ICAgIlZJQ1JFRyIsIDB4MWU2YzAwMDAsICAgIFZJQ1JlZ1Rlc3RUYmwsIDB4MDAwMDAwNDB9LAorICAgIHsgICAiTU1DUkVHIiwgMHgxZTZlMDAwMCwgICAgTU1DUmVnVGVzdFRibCwgMHgwMDAwMDA4MH0sCisgICAgeyAiVVNCMTFSRUciLCAweDFlNmUxMDAwLCAgVVNCMTFSZWdUZXN0VGJsLCAweDAwMDAwMTAwfSwKKyAgICB7ICAgIlNDVVJFRyIsIDB4MWU2ZTIwMDAsICAgIFNDVVJlZ1Rlc3RUYmwsIDB4MDAwMDAyMDB9LAorICAgIHsgICJIQVNFUkVHIiwgMHgxZTZlMzAwMCwgICBIQVNFUmVnVGVzdFRibCwgMHgwMDAwMDQwMH0sCisgICAgeyAgICJJMlNSRUciLCAweDFlNmU1MDAwLCAgICBJMlNSZWdUZXN0VGJsLCAweDAwMDAwODAwfSwKKyAgICB7ICAgIkNSVFJFRyIsIDB4MWU2ZTYwMDAsICAgIENSVFJlZ1Rlc3RUYmwsIDB4MDAwMDEwMDB9LAorICAgIHsgIlZJREVPUkVHIiwgMHgxZTcwMDAwMCwgIFZJREVPUmVnVGVzdFRibCwgMHgwMDAwMjAwMH0sCisgICAgeyAgICJBMlBSRUciLCAweDFlNzIwMDAwLCAgICBBMlBSZWdUZXN0VGJsLCAweDAwMDA0MDAwfSwKKyAgICB7ICAiTURNQVJFRyIsIDB4MWU3NDAwMDAsICAgTURNQVJlZ1Rlc3RUYmwsIDB4MDAwMDgwMDB9LAorICAgIHsgICAgIjJEUkVHIiwgMHgxZTc2MDAwMCwgICAgTTJEUmVnVGVzdFRibCwgMHgwMDAxMDAwMH0sCisgICAgeyAgIkdQSU9SRUciLCAweDFlNzgwMDAwLCAgIEdQSU9SZWdUZXN0VGJsLCAweDAwMDIwMDAwfSwKKyAgICB7ICAgIlJUQ1JFRyIsIDB4MWU3ODEwMDAsICAgIFJUQ1JlZ1Rlc3RUYmwsIDB4MDAwNDAwMDB9LAorICAgIHsgIlRJTUVSUkVHIiwgMHgxZTc4MjAwMCwgIFRJTUVSUmVnVGVzdFRibCwgMHgwMDA4MDAwMH0sCisgICAgeyAiVUFSVDFSRUciLCAweDFlNzgzMDAwLCAgVUFSVDFSZWdUZXN0VGJsLCAweDAwMTAwMDAwfSwKKyAgICB7ICJVQVJUMlJFRyIsIDB4MWU3ODQwMDAsICBVQVJUMlJlZ1Rlc3RUYmwsIDB4MDAyMDAwMDB9LAorICAgIHsgICAiV0RUUkVHIiwgMHgxZTc4NTAwMCwgICAgV0RUUmVnVGVzdFRibCwgMHgwMDQwMDAwMH0sCisgICAgeyAgICJQV01SRUciLCAweDFlNzg2MDAwLCAgICBQV01SZWdUZXN0VGJsLCAweDAwODAwMDAwfSwKKyAgICB7IlZVQVJUMVJFRyIsIDB4MWU3ODcwMDAsIFZVQVJUMVJlZ1Rlc3RUYmwsIDB4MDEwMDAwMDB9LAorICAgIHsiVlVBUlQyUkVHIiwgMHgxZTc4ODAwMCwgVlVBUlQyUmVnVGVzdFRibCwgMHgwMjAwMDAwMH0sCisgICAgeyAgICJMUENSRUciLCAweDFlNzg5MDAwLCAgICBMUENSZWdUZXN0VGJsLCAweDA0MDAwMDAwfSwKKyAgICB7ICAgIkkyQ1JFRyIsIDB4MWU3OEEwMDAsICAgIEkyQ1JlZ1Rlc3RUYmwsIDB4MDgwMDAwMDB9LAorICAgIHsgICJQRUNJUkVHIiwgMHgxZTc4QjAwMCwgICBQRUNJUmVnVGVzdFRibCwgMHgxMDAwMDAwMH0sCisgICAgeyAgIlBDSUFSRUciLCAweDFlNzhDMDAwLCAgIFBDSUFSZWdUZXN0VGJsLCAweDIwMDAwMDAwfSwKKyAgICB7ICAgIlBDSVJFRyIsIDB4NjAwMDAwMDAsICAgIFBDSVJlZ1Rlc3RUYmwsIDB4NDAwMDAwMDB9LCAgICAgICAgCisgICAgeyAgICAgICJFTkQiLCAweGZmZmZmZmZmLCAgICAgICAgICAgICBOVUxMLCAweGZmZmZmZmZmfQorfTsKZGlmZiAtLWdpdCBhL2JvYXJkL2FzcGVlZC9hc3QyMzAwL3NsdC5jIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvc2x0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzI4M2QzNAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL3NsdC5jCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBEaWFnbm9zdGljcyBzdXBwb3J0CisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8cG9zdC5oPgorI2luY2x1ZGUgInNsdC5oIgorCisjaWYgZGVmaW5lZCAoQ09ORklHX1NMVCkKKworaW50IGRvX3NsdCAoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGludCBmbGFncyA9IDA7CisgICAgaW50IGxvb3AgID0gMTsKKwkKKyAgICBpZiAoYXJnYyA+IDEpIHsKKyAgICAgICAgbG9vcCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDEwKTsKKyAgICB9CisJCisgICAgZG8geworCitkb19zbHRfc3RhcnQ6CisJLyogUmVnLiBUZXN0ICovCisjaWYgKENGR19DTURfU0xUICYgQ0ZHX0NNRF9SRUdURVNUKQorCWlmIChkb19yZWd0ZXN0KCkpCisJeworCSAgICBmbGFncyB8PSBGTEFHX1JFR1RFU1RfRkFJTDsJCisgICAgICAgICAgICBwcmludGYoIltJTkZPXSBSZWdUZXN0IEZhaWxlZCBcbiIpOworCX0gICAgCisJZWxzZQorICAgICAgICAgICAgcHJpbnRmKCJbSU5GT10gUmVnVGVzdCBQYXNzZWQgXG4iKTsKKyNlbmRpZgorI2lmIChDRkdfQ01EX1NMVCAmIENGR19DTURfTUFDVEVTVCkKKwlpZiAoZG9fbWFjdGVzdCgpKQorCXsKKwkgICAgZmxhZ3MgfD0gRkxBR19NQUNURVNUX0ZBSUw7CQorICAgICAgICAgICAgcHJpbnRmKCJbSU5GT10gTUFDVGVzdCBGYWlsZWQgXG4iKTsKKwl9ICAgIAorCWVsc2UKKyAgICAgICAgICAgIHByaW50ZigiW0lORk9dIE1BQ1Rlc3QgUGFzc2VkIFxuIik7CisjZW5kaWYKKyNpZiAoQ0ZHX0NNRF9TTFQgJiBDRkdfQ01EX1ZJREVPVEVTVCkKKwlpZiAoZG9fdmlkZW90ZXN0KCkpCisJeworCSAgICBmbGFncyB8PSBGTEFHX1ZJREVPVEVTVF9GQUlMOwkKKyAgICAgICAgICAgIHByaW50ZigiW0lORk9dIFZpZGVvVGVzdCBGYWlsZWQgXG4iKTsKKwl9ICAgIAorCWVsc2UKKyAgICAgICAgICAgIHByaW50ZigiW0lORk9dIFZpZGVvVGVzdCBQYXNzZWQgXG4iKTsKKyNlbmRpZgorI2lmIChDRkdfQ01EX1NMVCAmIENGR19DTURfSEFDVEVTVCkKKwlpZiAoZG9faGFjdGVzdCgpKQorCXsKKwkgICAgZmxhZ3MgfD0gRkxBR19IQUNURVNUX0ZBSUw7CQorICAgICAgICAgICAgcHJpbnRmKCJbSU5GT10gSEFDVGVzdCBGYWlsZWQgXG4iKTsKKwl9ICAgIAorCWVsc2UKKyAgICAgICAgICAgIHByaW50ZigiW0lORk9dIEhBQ1Rlc3QgUGFzc2VkIFxuIik7CisjZW5kaWYKKyNpZiAoQ0ZHX0NNRF9TTFQgJiBDRkdfQ01EX01JQ1RFU1QpCisJaWYgKGRvX21pY3Rlc3QoKSkKKwl7CisJICAgIGZsYWdzIHw9IEZMQUdfTUlDVEVTVF9GQUlMOwkKKyAgICAgICAgICAgIHByaW50ZigiW0lORk9dIE1JQ1Rlc3QgRmFpbGVkIFxuIik7CisJfSAgICAKKwllbHNlCisgICAgICAgICAgICBwcmludGYoIltJTkZPXSBNSUNUZXN0IFBhc3NlZCBcbiIpOworI2VuZGlmCisJCisJLyogU3VtbWFyeSAqLworCWlmIChmbGFncykKKyAgICAgICAgICAgIHByaW50ZiAoIltJTkZPXSBTTFQgVGVzdCBGYWlsZWQhISBcbiIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYgKCJbSU5GT10gU0xUIFRlc3QgUGFzc2VkISEgXG4iKTsgICAgCisgICAgICAgCisgICAgICAgIGlmIChsb29wID09IDApCQkJLyogaW5maW5pdGUgKi8KKyAgICAgICAgICAgIGdvdG8gZG9fc2x0X3N0YXJ0OworICAgICAgICBlbHNlCisgICAgICAgICAgICBsb29wLS07ICAgIAorICAgICAgICAgICAgCisgICAgfSB3aGlsZSAobG9vcCk7CisKKyAgICByZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1VfQk9PVF9DTUQoCisJc2x0LAlDT05GSUdfU1lTX01BWEFSR1MsCTAsCWRvX3NsdCwKKwkic2x0IC0gc2x0IHRlc3QgcHJvZ3JhbSBcbiIsCisJTlVMTAorKTsKKworI2VuZGlmIC8qIENPTkZJR19TTFQgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2FzcGVlZC9hc3QyMzAwL3NsdC5oIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvc2x0LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGU2NTBiYwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL3NsdC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2RlZmluZSBDRkdfQ01EX1JFR1RFU1QJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ0ZHX0NNRF9NQUNURVNUCQkweDAwMDAwMDAyCisjZGVmaW5lIENGR19DTURfVklERU9URVNUCTB4MDAwMDAwMDQKKyNkZWZpbmUgQ0ZHX0NNRF9IQUNURVNUCQkweDAwMDAwMDA4CisjZGVmaW5lIENGR19DTURfTUlDVEVTVAkJMHgwMDAwMDAxMAorI2RlZmluZSBDRkdfQ01EX09TRFRFU1QJCTB4MDAwMDAwMjAKKyNkZWZpbmUgQ0ZHX0NNRF8yRFRFU1QgIAkweDAwMDAwMDQwCisjZGVmaW5lIENGR19DTURfSFdDVEVTVCAgCTB4MDAwMDAwODAKKworI2RlZmluZSBGTEFHX1JFR1RFU1RfRkFJTCAgCTB4MDAwMDAwMDEKKyNkZWZpbmUgRkxBR19NQUNURVNUX0ZBSUwgIAkweDAwMDAwMDAyCisjZGVmaW5lIEZMQUdfVklERU9URVNUX0ZBSUwgIAkweDAwMDAwMDA0CisjZGVmaW5lIEZMQUdfSEFDVEVTVF9GQUlMICAJMHgwMDAwMDAwOAorI2RlZmluZSBGTEFHX01JQ1RFU1RfRkFJTCAgCTB4MDAwMDAwMTAKKyNkZWZpbmUgRkxBR19PU0RURVNUX0ZBSUwgIAkweDAwMDAwMDIwCisjZGVmaW5lIEZMQUdfMkRURVNUX0ZBSUwgIAkweDAwMDAwMDQwCisjZGVmaW5lIEZMQUdfSFdDVEVTVF9GQUlMICAJMHgwMDAwMDA4MAorCisKZGlmZiAtLWdpdCBhL2JvYXJkL2FzcGVlZC9hc3QyMzAwL3R5cGUuaCBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNTdlZTVhCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvdHlwZS5oCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpZm5kZWYgX1RZUEVfSF8KKyNkZWZpbmUgX1RZUEVfSF8KKworCXR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICAgICAgICAgIEJPT0w7CisJdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgVUlOVDg7CisJdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgVUlOVDE2OworCXR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIFVJTlQzMjsKKworCSNkZWZpbmUgIEZMT05HICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nCisJI2RlZmluZSAgQllURSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIKKwkjZGVmaW5lICBJTlQgICAgICAgICAgICAgICAgICAgICAgaW50CisJI2RlZmluZSAgVk9JRCAgICAgICAgICAgICAgICAgICAgIHZvaWQKKwkjZGVmaW5lICBCT09MRUFOICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQKKwkjZGVmaW5lICBVTE9ORyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZworCSNkZWZpbmUgIFVTSE9SVCAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydAorCSNkZWZpbmUgIFVDSEFSICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyCisJI2RlZmluZSAgQ0hBUiAgICAgICAgICAgICAgICAgICAgIGNoYXIKKwkjZGVmaW5lICBMT05HICAgICAgICAgICAgICAgICAgICAgbG9uZworCSNkZWZpbmUgIFBVQ0hBUiAgICAgICAgICAgICAgICAgICBVQ0hBUiAqCisJI2RlZmluZSAgUFVMT05HICAgICAgICAgICAgICAgICAgIFVMT05HICoKKworCSNkZWZpbmUgIEZBSUwgICAgICAgICAgICAgICAgICAgICAxCisKKwkjZGVmaW5lICBpbnRmdW5jICAgICAgaW50Mzg2CisKKwkjZGVmaW5lICBvdXRkd3BvcnQgICAgICAgICBvdXRwZAorCSNkZWZpbmUgIGluZHdwb3J0ICAgICAgICAgIGlucGQKKwkjZGVmaW5lICBvdXRwb3J0ICAgICAgICAgICBvdXRwCisJI2RlZmluZSAgaW5wb3J0ICAgICAgICAgICAgaW5wCisKKwkvLyNkZWZpbmUgICAgIE5VTEwgICAgKCh2b2lkICopMCkKKwkjZGVmaW5lICAgICBGQUxTRSAgIDAKKwkjZGVmaW5lICAgICBUUlVFICAgIDEKKworCSNkZWZpbmUgUmVhZE1lbW9yeUJZVEUoYmFzZWFkZHJlc3Msb2Zmc2V0KSAgICAgICAgKihCWVRFICopKChVTE9ORykoYmFzZWFkZHJlc3MpKyhVTE9ORykob2Zmc2V0KSkKKwkjZGVmaW5lIFJlYWRNZW1vcnlMb25nKGJhc2VhZGRyZXNzLG9mZnNldCkgICAgICAgICooVUxPTkcgKikoKFVMT05HKShiYXNlYWRkcmVzcykrKFVMT05HKShvZmZzZXQpKQorCSNkZWZpbmUgUmVhZE1lbW9yeVNob3J0KGJhc2VhZGRyZXNzLG9mZnNldCkgICAgICAgKihVU0hPUlQgKikoKFVMT05HKShiYXNlYWRkcmVzcykrKFVMT05HKShvZmZzZXQpKQorCSNkZWZpbmUgV3JpdGVNZW1vcnlCWVRFKGJhc2VhZGRyZXNzLG9mZnNldCxkYXRhKSAgKihCWVRFICopKChVTE9ORykoYmFzZWFkZHJlc3MpKyhVTE9ORykob2Zmc2V0KSkgPSAoQllURSkoZGF0YSkKKwkjZGVmaW5lIFdyaXRlTWVtb3J5TG9uZyhiYXNlYWRkcmVzcyxvZmZzZXQsZGF0YSkgICooVUxPTkcgKikoKFVMT05HKShiYXNlYWRkcmVzcykrKFVMT05HKShvZmZzZXQpKT0oVUxPTkcpKGRhdGEpCisJI2RlZmluZSBXcml0ZU1lbW9yeVNob3J0KGJhc2VhZGRyZXNzLG9mZnNldCxkYXRhKSAqKFVTSE9SVCAqKSgoVUxPTkcpKGJhc2VhZGRyZXNzKSsoVUxPTkcpKG9mZnNldCkpPShVU0hPUlQpKGRhdGEpCisJI2RlZmluZSBXcml0ZU1lbW9yeUxvbmdXaXRoQU5ERGF0YShiYXNlYWRkcmVzcywgb2Zmc2V0LCBhbmRkYXRhLCBkYXRhKSAgKihVTE9ORyAqKSgoVUxPTkcpKGJhc2VhZGRyZXNzKSsoVUxPTkcpKG9mZnNldCkpID0gKihVTE9ORyAqKSgoVUxPTkcpKGJhc2VhZGRyZXNzKSsoVUxPTkcpKG9mZnNldCkpICYgKFVMT05HKShhbmRkYXRhKSB8IChVTE9ORykoZGF0YSkKKworCSNkZWZpbmUgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0soYmFzZWFkZHJlc3MsIG9mZnNldCwgZGF0YSwgbWFzaykgXAorCSoodm9sYXRpbGUgVUxPTkcgKikoKFVMT05HKShiYXNlYWRkcmVzcykrKFVMT05HKShvZmZzZXQpKSA9ICoodm9sYXRpbGUgVUxPTkcgKikoKChVTE9ORykoYmFzZWFkZHJlc3MpKyhVTE9ORykob2Zmc2V0KSkgJiAoVUxPTkcpKH4obWFzaykpKSB8ICgoVUxPTkcpKGRhdGEpICYgKFVMT05HKShtYXNrKSkKKworCSNkZWZpbmUgUmVhZE1lbW9yeUxvbmdIb3N0KGJhc2VhZGRyZXNzLG9mZnNldCkgICAgICAgICoodm9sYXRpbGUgVUxPTkcgKikoKFVMT05HKShiYXNlYWRkcmVzcykrKFVMT05HKShvZmZzZXQpKQorCSNkZWZpbmUgV3JpdGVNZW1vcnlMb25nSG9zdChiYXNlYWRkcmVzcyxvZmZzZXQsZGF0YSkgICoodm9sYXRpbGUgVUxPTkcgKikoKFVMT05HKShiYXNlYWRkcmVzcykrKFVMT05HKShvZmZzZXQpKT0oVUxPTkcpKGRhdGEpCisJI2RlZmluZSBXcml0ZU1lbW9yeUJZVEVIb3N0KGJhc2VhZGRyZXNzLG9mZnNldCxkYXRhKSAgKih2b2xhdGlsZSBCWVRFICopKChVTE9ORykoYmFzZWFkZHJlc3MpKyhVTE9ORykob2Zmc2V0KSkgPSAoQllURSkoZGF0YSkgICAgCisjZGVmaW5lIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChiYXNlYWRkcmVzcywgb2Zmc2V0LCBkYXRhLCBtYXNrKSAgKih2b2xhdGlsZSBVTE9ORyAqKSgoVUxPTkcpKGJhc2VhZGRyZXNzKSsoVUxPTkcpKG9mZnNldCkpID0gKCgoKih2b2xhdGlsZSBVTE9ORyAqKSgoVUxPTkcpKGJhc2VhZGRyZXNzKSsoVUxPTkcpKG9mZnNldCkpKSYofm1hc2spKSB8IChVTE9ORykoKGRhdGEpJihtYXNrKSkpCisgICAgCisJI2RlZmluZSBSZWFkTWVtb3J5TG9uZ0NsaWVudChiYXNlYWRkcmVzcyxvZmZzZXQpICAgICAgICAqKHZvbGF0aWxlIFVMT05HICopKChVTE9ORykoYmFzZWFkZHJlc3MpKyhVTE9ORykob2Zmc2V0KSkKKwkjZGVmaW5lIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChiYXNlYWRkcmVzcyxvZmZzZXQsZGF0YSkgICoodm9sYXRpbGUgVUxPTkcgKikoKFVMT05HKShiYXNlYWRkcmVzcykrKFVMT05HKShvZmZzZXQpKT0oVUxPTkcpKGRhdGEpCisJI2RlZmluZSBXcml0ZU1lbW9yeUJZVEVDbGllbnQoYmFzZWFkZHJlc3Msb2Zmc2V0LGRhdGEpICAqKHZvbGF0aWxlIEJZVEUgKikoKFVMT05HKShiYXNlYWRkcmVzcykrKFVMT05HKShvZmZzZXQpKSA9IChCWVRFKShkYXRhKSAgICAKKyNkZWZpbmUgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoYmFzZWFkZHJlc3MsIG9mZnNldCwgZGF0YSwgbWFzaykgICoodm9sYXRpbGUgVUxPTkcgKikoKFVMT05HKShiYXNlYWRkcmVzcykrKFVMT05HKShvZmZzZXQpKSA9ICgoKCoodm9sYXRpbGUgVUxPTkcgKikoKFVMT05HKShiYXNlYWRkcmVzcykrKFVMT05HKShvZmZzZXQpKSkmKH5tYXNrKSkgfCAoVUxPTkcpKChkYXRhKSYobWFzaykpKQorCisjaWZkZWYgQlVGX0dMT0JBTFMKKyNkZWZpbmUgQlVGX0VYVAorI2Vsc2UKKyNkZWZpbmUgQlVGX0VYVCBleHRlcm4KKyNlbmRpZgorCitCVUZfRVhUIFVMT05HICAgIGdfQ0FQVFVSRV9WSURFTzFfQlVGMV9BRERSOyAvKiBWSURFTzFfQlVGXzFfQUREUiovIAorQlVGX0VYVCBVTE9ORyAgICBnX0NBUFRVUkVfVklERU8xX0JVRjJfQUREUjsgLyogVklERU8xX0JVRl8yX0FERFIqLworQlVGX0VYVCBVTE9ORyAgICBnX1ZJREVPMV9DT01QUkVTU19CVUZfQUREUjsgLyogRW5jb2RlIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KK0JVRl9FWFQgVUxPTkcgICAgZ19WSURFTzFfQ1JDX0JVRl9BRERSOworQlVGX0VYVCBVTE9ORyAgICBnX1ZJREVPMV9GTEFHX0JVRl9BRERSOworQlVGX0VYVCBVTE9ORyAgICBnX1ZJREVPMV9SQzRfQlVGX0FERFI7CisKKworQlVGX0VYVCBVTE9ORyAgICBnX0NBUFRVUkVfVklERU8yX0JVRjFfQUREUjsgCitCVUZfRVhUIFVMT05HICAgIGdfQ0FQVFVSRV9WSURFTzJfQlVGMl9BRERSOyAKK0JVRl9FWFQgVUxPTkcgICAgZ19WSURFTzJfQ09NUFJFU1NfQlVGX0FERFI7CitCVUZfRVhUIFVMT05HICAgIGdfVklERU8yX0NSQ19CVUZfQUREUjsKK0JVRl9FWFQgVUxPTkcgICAgZ19WSURFTzJfRkxBR19CVUZfQUREUjsKK0JVRl9FWFQgVUxPTkcgICAgZ19WSURFTzJfUkM0X0JVRl9BRERSOworCitCVUZfRVhUIFVMT05HICAgIGdfVklERU8xX0RFQ09ERV9CVUZfMV9BRERSOworQlVGX0VYVCBVTE9ORyAgICBnX1ZJREVPMV9ERUNPREVfQlVGXzJfQUREUjsKK0JVRl9FWFQgVUxPTkcgICAgZ19WSURFTzFfREVDT01QUkVTU19CVUZfQUREUjsKK0JVRl9FWFQgVUxPTkcgICAgZ19WSURFTzFfREVDT0RFX1JDNF9CVUZfQUREUjsKKworQlVGX0VYVCBVTE9ORyAgICBnX1ZJREVPMl9ERUNPREVfQlVGXzFfQUREUjsKK0JVRl9FWFQgVUxPTkcgICAgZ19WSURFTzJfREVDT0RFX0JVRl8yX0FERFI7CitCVUZfRVhUIFVMT05HICAgIGdfVklERU8yX0RFQ09NUFJFU1NfQlVGX0FERFI7CitCVUZfRVhUIFVMT05HICAgIGdfVklERU8yX0RFQ09ERV9SQzRfQlVGX0FERFI7CisKK0JVRl9FWFQgVUxPTkcgICAgZ19DQVBUVVJFX1ZJREVPTV9CVUYxX0FERFI7IAorQlVGX0VYVCBVTE9ORyAgICBnX0NBUFRVUkVfVklERU9NX0JVRjJfQUREUjsgCitCVUZfRVhUIFVMT05HICAgIGdfVklERU9NX0NPTVBSRVNTX0JVRl9BRERSOworQlVGX0VYVCBVTE9ORyAgICBnX1ZJREVPTV9GTEFHX0JVRl9BRERSOworQlVGX0VYVCBVTE9ORyAgICBnX1ZJREVPTV9SQzRfQlVGX0FERFI7CisKK0JVRl9FWFQgVUxPTkcgICAgZ19WSURFT01fREVDT0RFX0JVRl8xX0FERFI7CitCVUZfRVhUIFVMT05HICAgIGdfVklERU9NX0RFQ09ERV9CVUZfMl9BRERSOworQlVGX0VYVCBVTE9ORyAgICBnX1ZJREVPTV9ERUNPTVBSRVNTX0JVRl9BRERSOworQlVGX0VYVCBVTE9ORyAgICBnX1ZJREVPTV9ERUNPREVfUkM0X0JVRl9BRERSOworCisjaWZkZWYgV0lOX0dMT0JBTFMKKyNkZWZpbmUgV0lOX0VYVAorI2Vsc2UKKyNkZWZpbmUgV0lOX0VYVCBleHRlcm4KKyNlbmRpZgorCitXSU5fRVhUIFVTSE9SVAlnX0RlZldpZHRoLCBnX0RlZkhlaWdodDsKKyAgIAorI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjMwMC91LWJvb3QubGRzIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNWE5MGVmCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvdS1ib290LmxkcwpAQCAtMCwwICsxLDQ1IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKKy8qT1VUUFVUX0ZPUk1BVCgiZWxmMzItYXJtIiwgImVsZjMyLWFybSIsICJlbGYzMi1hcm0iKSovCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCisJLiA9IEFMSUdOKDQpOworCS50ZXh0CSAgIDoKKwl7CisJICBjcHUvYXJtOTI2ZWpzL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisKKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCV9fdV9ib290X2NtZF9zdGFydCA9IC47CisJLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKwlfX3VfYm9vdF9jbWRfZW5kID0gLjsKKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjMwMC92ZGVmLmggYi9ib2FyZC9hc3BlZWQvYXN0MjMwMC92ZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2M5OWI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL3ZkZWYuaApAQCAtMCwwICsxLDUwMCBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaWZuZGVmIF9WREVGX0hfCisjZGVmaW5lIF9WREVGX0hfCisKKyNkZWZpbmUgICAgIFZJREVPMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgICAgIFZJREVPMV9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgICAgIFZJREVPMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgICAgIFZJREVPMl9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKworI2RlZmluZQkJVklERU9NX09OCQkJCQkJCTB4MDQKKyNkZWZpbmUgICAgIFZJREVPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZQkJQ1JUXzEJCQkJCQkJCTAKKyNkZWZpbmUJCUNSVF8xX09OCQkJCQkJCTB4MDEKKyNkZWZpbmUJCUNSVF8yCQkJCQkJCQkxCisjZGVmaW5lCQlDUlRfMl9PTgkJCQkJCQkweDAyCisKKyNkZWZpbmUJCVNJTkdMRV9DT0RFQ19TSU5HTEVfQ0FQVFVSRQkJCTAKKyNkZWZpbmUgICAgIEFVVE9fQ09ERUNfU0lOR0xFX0NBUFRVUkUJCQkyCisjZGVmaW5lCQlBVVRPX0NPREVDX0FVVE9fQ0FQVFVSRQkJCQkzCisKKyNkZWZpbmUJCU1BQzFfQkFTRQkJCQkJCQkweDFFNjYwMDAwCisjZGVmaW5lICAgICBBUEJfQlJJREdFXzFfQkFTRSAgICAgICAgICAgICAgICAgICAweDFFNkUwMDAwCisjZGVmaW5lICAgICBWSURFT19SRUdfQkFTRSAgICAgICAgICAgICAgICAgICAgICAweDFFNzAwMDAwCisjZGVmaW5lICAgICBBUEJfQlJJREdFXzJfQkFTRSAgICAgICAgICAgICAgICAgICAweDFFNzgwMDAwCisKKyNkZWZpbmUJCURSQU1fSU5JVF9CQVNFCQkJCQkJMHgxRTZFMDAwMAorCisjZGVmaW5lCQlTRFJBTV9QUk9URUNUX1JFRwkJCQkJMHgwMAorICAgICNkZWZpbmUgICAgIFNEUkFNX1dSSVRFX0RJU0FCTEUgICAgICAgICAgICAgMAorICAgICNkZWZpbmUgICAgIFNEUkFNX1dSSVRFX0VOQUJMRSAgICAgICAgICAgICAgMQorCisjZGVmaW5lCQlTQ1VfQkFTRQkJCQkJCQkweDFFNkUwMDAwCisjZGVmaW5lCQlTQ1VfT0ZGU0VUCQkJCQkJCTB4MjAwMAorCisjZGVmaW5lCQlWSUNfQkFTRQkJCQkJCQkweDFFNkMwMDAwCisJI2RlZmluZQkJVklERU9fSU5UX0JJVAkJCQk3CisKKyNkZWZpbmUJCUlSUV9TVEFUVVNfUkVHCQkJCQkJMHgwMAorI2RlZmluZQkJUkFXX0lOVF9TVEFUVVNfUkVHCQkJCQkweDA4CisjZGVmaW5lCQlJTlRfU0VMX1JFRwkJCQkJCQkweDBDCisJI2RlZmluZQkJRklRX0lOVAkJCQkJCQkxCisJI2RlZmluZQkJSVJRX0lOVAkJCQkJCQkwCQorI2RlZmluZQkJSU5UX0VOX1JFRwkJCQkJCQkweDEwCisjZGVmaW5lCQlJTlRfRU5fQ0xFQVJfUkVHCQkJCQkweDE0CisjZGVmaW5lCQlJTlRfU09GVF9SRUcJCQkJCQkweDE4CisjZGVmaW5lCQlJTlRfU09GVF9DTEVBUl9SRUcJCQkJCTB4MUMKKyNkZWZpbmUJCUlOVF9TRU5TRV9SRUcJCQkJCQkweDI0CisJI2RlZmluZQkJTEVWRUxfU0VOU0UJCQkJCQkxCisJI2RlZmluZQkJRURHRV9TRU5TRQkJCQkJCTAKKyNkZWZpbmUJCUlOVF9FVkVOVF9SRUcJCQkJCQkweDJDCisJI2RlZmluZQkJSElHSF9MRVZFTF9TRU5TRQkJCQkxCisJI2RlZmluZQkJTE9XX0xFVkVMX1NFTlNFCQkJCQkwCisKKyNkZWZpbmUJCVNDVV9IV19UUkFQUElOR19SRUcJCQkJCTB4NzAgKyBTQ1VfT0ZGU0VUCisJI2RlZmluZQkJQ0xJRU5UX01PREVfRU5fQklUCQkJCTE4CisJI2RlZmluZQkJQ0xJRU5UX01PREVfRU5fTUFTSwkJCQkweDAwMDQwMDAwCisJCSNkZWZpbmUJCUJFX0hPU1RfQ0hJUAkJCQkwCisJCSNkZWZpbmUJCUJFX0NMSUVOVF9DSElQCQkJCTEKKworI2RlZmluZSAgICAgU0NVX1VMT0NLX0tFWSAgICAgICAgICAgICAgICAgICAgICAgMHgxNjg4QThBOAorICAgIAorI2RlZmluZSAgICAgU0NVX1BST1RFQ1RfUkVHICAgICAgICAgICAgICAgICAgICAgMHgwMCArIFNDVV9PRkZTRVQKKyAgICAjZGVmaW5lICAgICBTQ1VfV1JJVEVfRElTQUJMRSAgICAgICAgICAgICAgIDAKKyAgICAjZGVmaW5lICAgICBTQ1VfV1JJVEVfRU5BQkxFICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSAgICAgU0NVX0NPTlRST0xfUkVHICAgICAgICAgICAgICAgICAgICAgMHgwNCArIFNDVV9PRkZTRVQgICAgCisJI2RlZmluZSAgICAgVklERU9fRU5HSU5FX1JFU0VUCQkJCTB4MDAwMDAwNDAKKwkJI2RlZmluZSAgICAgVklERU9fRU5HSU5FX1JFU0VUX0JJVCAgICAgIDYKKwkJI2RlZmluZSAgICAgVklERU9fRU5HSU5FX1JFU0VUX01BU0sgICAgIDB4MDAwMDAwNDAKKyAgICAgICAgI2RlZmluZSAgICAgVklERU9fUkVTRVRfRU4gICAgICAgICAgICAgIDEKKyAgICAgICAgI2RlZmluZSAgICAgVklERU9fUkVTRVRfT0ZGICAgICAgICAgICAgIDAKKworI2RlZmluZSAgICAgU0NVX0NMT0NLX1NFTEVDVElPTl9SRUcgICAgICAgICAgICAgMHgwOCArIFNDVV9PRkZTRVQKKwkjZGVmaW5lCQlQT1JUQV9DTE9DS19ERUxBWV9NQVNLCQkJNyA8PCA4CS8vVmlkZW8gcG9ydCBBIG91dHB1dCBjbGNvayBzZWxlY3Rpb24KKwkJI2RlZmluZQlQT1JUQV9DTE9DS19JTlZfREVMQVlfMU5TCQk1IDw8IDgJLy9DbG9jayBpbnZlcnNlZCBhbmQgZGVsYXkgfiAybnMKKwkJI2RlZmluZQlQT1JUQV9DTE9DS19JTlZfREVMQVlfMk5TCQk2IDw8IDgJLy9DbG9jayBpbnZlcnNlZCBhbmQgZGVsYXkgfiAzbnMKKwkjZGVmaW5lCQlQT1JUQl9DTE9DS19ERUxBWV9NQVNLCQkJNyA8PCAxMgkvL1ZpZGVvIHBvcnQgQiBvdXRwdXQgY2xvY2sgZGVsYXkKKwkJI2RlZmluZQlQT1JUQl9DTE9DS19JTlZfREVMQVlfMU5TCQk1IDw8IDEyCS8vQ2xvY2sgaW52ZXJzZWQgYW5kIGRlbGF5IH4gM25zCisJCSNkZWZpbmUJUE9SVEJfQ0xPQ0tfSU5WX0RFTEFZXzJOUwkJNiA8PCAxMgkvL0Nsb2NrIGludmVyc2VkIGFuZCBkZWxheSB+IDNucworCSNkZWZpbmUJCVBPUlRCX0NMT0NLX1NFTAkJCQkJMSA8PCAxNSAvL1ZpZGVvIHBvcnQgQiBjbG9jayBzZWxlY3Rpb24KKwkJI2RlZmluZQlQT1JUQl9GUk9NX0QxQ0xLCQkJCTAgPDwgMTUKKwkJI2RlZmluZSBQT1JUQl9GUk9NX0QyQ0xLCQkJCTEgPDwgMTUKKwkjZGVmaW5lCQlFQ0xLX0NMS19TRUxfTUFTSwkJCQkoMyA8PCAyKQorCQkjZGVmaW5lCUVDTEtfRlJPTV9IUExMCQkJCQkoMSA8PCAyKQorCisJI2RlZmluZSAgICAgRDJDTEtfQ0xPQ0tfU0VMRUNUSU9OCQkJMHgwMDAyMDAwMAorCQkjZGVmaW5lICAgICBEMkNMS19DTE9DS19TRUxFQ1RJT05fQklUICAgMTcKKwkJI2RlZmluZSAgICAgRDJDTEtfQ0xPQ0tfU0VMRUNUSU9OX01BU0sgIDB4MDAwNjAwMDAKKwkJI2RlZmluZQkJTk9STUFMX0NSVDEJCQkJCTAKKyAgICAgICAgI2RlZmluZSAgICAgVjFDTEtfVklERU8xCQkJCTIKKyAgICAgICAgI2RlZmluZSAgICAgVjFDTEtfVklERU8yCQkJCTMKKworI2RlZmluZSAgICAgU0NVX0NMT0NLX1NUT1BfUkVHCQkJCQkweDBDICsgU0NVX09GRlNFVCAgICAKKwkjZGVmaW5lCQlFTl9FQ0xLCQkJCQkJCTAgPDwgMAkvL0VuYWJsZSBFQ0xLIChGb3IgVmlkZW8gRW5naW5lKQorCSNkZWZpbmUJCVNUT1BfRUNMS19CSVQJCQkJCTAKKwkjZGVmaW5lCQlTVE9QX0VDTEtfTUFTSwkJCQkJMSA8PCAwCisJI2RlZmluZQkJRU5fVjFDTEsJCQkJCQkwIDw8IDMgIC8vRW5hYmxlIFYxQ0xLIChGb3IgVmlkZW8gQ2FwdHVyZSAjMSkKKwkjZGVmaW5lCQlTVE9QX1YxQ0xLX0JJVAkJCQkJMworCSNkZWZpbmUJCVNUT1BfVjFDTEtfTUFTSwkJCQkJMSA8PCAzCisJI2RlZmluZQkJRU5fRDFDTEsJCQkJCQkwIDw8IDEwIC8vRW5hYmxlIEQxQ0xLIChGb3IgQ1JUMSkKKwkjZGVmaW5lCQlTVE9QX0QxQ0xLX0JJVAkJCQkJMTAKKwkjZGVmaW5lCQlTVE9QX0QxQ0xLX01BU0sJCQkJCTEgPDwgMTAKKwkjZGVmaW5lCQlFTl9EMkNMSwkJCQkJCTAgPDwgMTEgLy9TdG9wIEQyQ0xLIChGb3IgQ1JUMikKKwkjZGVmaW5lCQlTVE9QX0QyQ0xLCQkJCQkJKDEgPDwgMTEpCisJI2RlZmluZQkJU1RPUF9EMkNMS19CSVQJCQkJCTExCisJI2RlZmluZQkJU1RPUF9EMkNMS19NQVNLCQkJCQkxIDw8IDExCisJI2RlZmluZQkJRU5fVjJDTEsJCQkJCQkwIDw8IDEyIC8vU3RvcCBWMkNMSyAoRm9yIFZpZGVvIENhcHR1cmUgIzIpCisJI2RlZmluZQkJU1RPUF9WMkNMS19CSVQJCQkJCTEyCisJI2RlZmluZQkJU1RPUF9WMkNMS19NQVNLCQkJCQkxIDw8IDEyCisJI2RlZmluZQkJU1RPUF9IQUNFX0JJVAkJCQkJMTMKKwkjZGVmaW5lCQlFTl9IQUNFCQkJCQkJCSgwIDw8IDEzKQorCSNkZWZpbmUJCVNUT1BfSEFDRV9NQVNLCQkJCQkoMSA8PCAxMykKKwkjZGVmaW5lICAgICBFTl9JMlNDTEsJCQkJCQkwIDw8IDE4CisJI2RlZmluZSAgICAgU1RPUF9JMlNDTEtfTUFTSwkJCQkxIDw8IDE4CisKKyNkZWZpbmUgICAgIFNDVV9QSU5fQ1RSTDFfUkVHCQkJCQkweDc0ICsgU0NVX09GRlNFVAorCSNkZWZpbmUJCUkyQ181X1BJTl9FTgkJCQkJMSA8PCAxMgkvL0VuYWJsZSBJMkMgIzUgUElOCisJI2RlZmluZQkJSTJDXzVfUElOX09GRgkJCQkJMCA8PCAxMgkvL0Rpc2FibGUgSTJDICM1IFBJTgorCSNkZWZpbmUJCUkyQ181X1BJTl9NQVNLCQkJCQkxIDw8IDEyCisJI2RlZmluZQkJVkdBX1BJTl9PRkYJCQkJCQkwIDw8IDE1IC8vRW5hYmxlIFZHQSBwaW5zCisJI2RlZmluZQkJVkdBX1BJTl9NQVNLCQkJCQkxIDw8IDE1CisJI2RlZmluZQkJVklERU9fUE9SVEFfRU4JCQkJCTEgPDwgMTYgLy9FbmFibGUgVmlkZW8gcG9ydCBBIGNvbnRyb2wgcGlucworCSNkZWZpbmUJCVZJREVPX1BPUlRBX01BU0sJCQkJMSA8PCAxNgorCSNkZWZpbmUJCVZJREVPX1BPUlRCX0VOCQkJCQkxIDw8IDE3IC8vRW5hYmxlIFZpZGVvIHBvcnQgQiBjb250cm9sIHBpbnMKKwkjZGVmaW5lCQlWSURFT19QT1JUQl9NQVNLCQkJCTEgPDwgMTcKKwkjZGVmaW5lCQlWSURFT19WUDFfRU4JCQkJCTEgPDwgMjIgLy9FbmFibGUgVlBbMTE6MF0KKwkjZGVmaW5lCQlWSURFT19WUDFfTUFTSwkJCQkJMSA8PCAyMiAKKwkjZGVmaW5lCQlWSURFT19WUDJfRU4JCQkJCTEgPDwgMjMgLy9FbmFibGUgVlBbMjM6MTJdCisJI2RlZmluZQkJVklERU9fVlAyX01BU0sJCQkJCTEgPDwgMjMKKwkjZGVmaW5lCQlJMlNfUElOX0VOCQkJCQkJMSA8PCAyOSAvL0VuYWJsZSBJMlMgZnVuY3Rpb24gcGlucworCSNkZWZpbmUJCUkyU19QSU5fTUFTSwkJCQkJMSA8PCAyOQorCisjZGVmaW5lICAgICBTQ1VfUElOX0NUUkwyX1JFRwkJCQkJMHg3OCArIFNDVV9PRkZTRVQKKwkjZGVmaW5lCQlWSURFT19QT1JUQV9TSU5HTEVfRURHRV9NQVNLCTEgPDwgMAorCQkjZGVmaW5lCQlWSURFT19QT1JUQV9TSU5HTEVfRURHRQkJMSA8PCAwCS8vRW5hYmxlIFZpZGVvIHBvcnQgQSBzaW5nbGUgbW9kZQorCQkjZGVmaW5lCQlWSURFT19QT1JUQV9EVUFMX0VER0UJCTAgPDwgMAorCSNkZWZpbmUJCVZJREVPX1BPUlRCX1NJTkdMRV9FREdFX01BU0sJMSA8PCAxCisJCSNkZWZpbmUJCVZJREVPX1BPUlRCX0RVQUxfRURHRQkJMCA8PCAxCisJCSNkZWZpbmUJCVZJREVPX1BPUlRCX1NJTkdMRV9FREdFCQkxIDw8IDEJLy9FbmFibGUgVmlkZW8gcG9ydCBCIHNpbmdsZSBtb2RlCisKKyNkZWZpbmUJCVNDVV9NX1BMTF9QQVJBTV9SRUcJCQkJCTB4MjAgKyBTQ1VfT0ZGU0VUCisKKyNkZWZpbmUJCURSQU1fQkFTRQkJCQkJCQkweDQwMDAwMDAwCisKKyNkZWZpbmUgICAgIElOUFVUX0JJVENPVU5UX1lVVjQ0NAkJCQk0CisjZGVmaW5lCQlJTlBVVF9CSVRDT1VOVF9ZVVY0MjAJCQkJMgorCisvKiBIVyBjb21tZW50IHZhbHVlICovCisvL1BBU1NXT1JECisjZGVmaW5lICAgICBWSURFT19VTkxPQ0tfS0VZICAgICAgICAgICAgICAgICAgICAweDFBMDM4QUE4CisjZGVmaW5lCQlTQ1VfVU5MT0NLX0tFWQkJCQkJCTB4MTY4OEE4QTgKKyNkZWZpbmUJCVNEUkFNX1VOTE9DS19LRVkJCQkJCTB4RkM2MDAzMDkKKworCisvLyNkZWZpbmUgICAgIFNBTVBMRV9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAwMDAuMAorI2lmZGVmIE9TQ19ORVcKKyAgICAjZGVmaW5lICAgICBTQU1QTEVfUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0NTc2MDAwLjAKKyNlbHNlCisgICAgI2RlZmluZSAgICAgU0FNUExFX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMDAwMC4wCisjZW5kaWYKKworI2RlZmluZSAgICAgTU9ERURFVEVDVElPTl9WRVJUSUNBTF9TVEFCTEVfTUFYSU1VTSAgICAgICAweDQKKyNkZWZpbmUgICAgIE1PREVERVRFQ1RJT05fSE9SSVpPTlRBTF9TVEFCTEVfTUFYSU1VTSAgICAgMHg0CisjZGVmaW5lICAgICBNT0RFREVURUNUSU9OX1ZFUlRJQ0FMX1NUQUJMRV9USFJFU0hPTEQgICAgIDB4NAorI2RlZmluZSAgICAgTU9ERURFVEVDVElPTl9IT1JJWk9OVEFMX1NUQUJMRV9USFJFU0hPTEQgICAweDgKKworI2RlZmluZSAgICAgTU9ERURFVEVDVElPTl9FREdFX1BJWEVMX1RIUkVTX0RJR0lUQUwgICAgICAyCisjZGVmaW5lICAgICBNT0RFREVURUNUSU9OX0VER0VfUElYRUxfVEhSRVNfQU5BTE9HRSAgICAgIDB4MEEKKworI2RlZmluZQkJTU9ERURFVEVDVElPTl9PSwkJCQkJCQkwCisjZGVmaW5lCQlNT0RFREVURUNUSU9OX0VSUk9SCQkJCQkJCTEKKyNkZWZpbmUJCUpVREdFX01PREVfRVJST1IJCQkJCQkJMgorCisvL0kyQyBMb29wIENvdW50CisjZGVmaW5lICAgIExPT1BfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMAorI2RlZmluZSAgICBDQU5fTk9UX0ZJTkRfREVWSUNFICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgICAgU0VUX0kyQ19ET05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lCSAgIEkyQ19CQVNFCQkJCQkJCQkJICAgMHhBMDAwCisjZGVmaW5lICAgIEFDX1RJTUlORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3Nzc0MzM1NQorCisvL0kyQyBjaGFubmVsIGFuZCBEZXZpY2VzCisjZGVmaW5lICAgICBJMkNfVklERU8xX0VFUFJPTSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgICAgSTJDX1ZJREVPMl9FRVBST00gICAgICAgICAgICAgICAgICAgICAgICAgICAweDUKKyNkZWZpbmUgICAgIEkyQ19WSURFTzJfOTg4MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisvKgorVUxPTkcgICAgQ0FQVFVSRTFfQUREUkVTUyA9ICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwOworVUxPTkcgICAgQ0FQVFVSRTJfQUREUkVTUyA9ICAgICAgICAgICAgICAgICAgICAgMHgzMDAwMDAwOworVUxPTkcgICAgUEFTUzFfRU5DT0RFX1NPVVJDRV9BRERSRVNTID0gICAgICAgICAgMHgxMDAwMDAwOworVUxPTkcgICAgUEFTUzFfRU5DT0RFX0RFU1RJTkFUSU9OX0FERFJFU1MgPSAgICAgMHgyMDAwMDAwOworVUxPTkcgICAgQnVmZmVyMV9ERUNPREVfU09VUkNFX0FERFJFU1MgPSAgICAgICAgMHgxMDAwMDAwOworVUxPTkcgICAgQnVmZmVyMl9ERUNPREVfU09VUkNFX0FERFJFU1MgPSAgICAgICAgMHgxNDAwMDAwOworVUxPTkcgICAgUEFTUzFfREVDT0RFX0RFU1RJTkFUSU9OX0FERFJFU1MgPSAgICAgMHg2MDAwMDA7CitVTE9ORyAgICBDQVBUVVJFXzJORF9BRERSRVNTID0gICAgICAgICAgICAgICAgICAweDE4MDAwMDA7CitVTE9ORyAgICBQQVNTMV8yTkRfRU5DT0RFX1NPVVJDRV9BRERSRVNTID0gICAgICAweDE4MDAwMDA7CitVTE9ORyAgICBQQVNTMV8yTkRfRU5DT0RFX0RFU1RJTkFUSU9OX0FERFJFU1MgPSAweDI4MDAwMDA7CitVTE9ORyAgICBQQVNTMV8yTkRfREVDT0RFX1NPVVJDRV9BRERSRVNTID0gICAgICAweDEwMDAwMDA7CitVTE9ORyAgICBQQVNTMV8yTkRfREVDT0RFX0RFU1RJTkFUSU9OX0FERFJFU1MgPSAweDYwMDAwMDsKK1VMT05HICAgIFBBU1MyX0VOQ09ERV9TT1VSQ0VfQUREUkVTUyA9ICAgICAgICAgIDB4MDAwMDAwOworVUxPTkcgICAgUEFTUzJfRU5DT0RFX0RFU1RJTkFUSU9OX0FERFJFU1MgPSAgICAgMHhDMDAwMDA7CitVTE9ORyAgICBQQVNTMl9ERUNPREVfU09VUkNFX0FERFJFU1MgPSAgICAgICAgICAweEMwMDAwMDsKK1VMT05HICAgIFBBU1MyX0RFQ09ERV9ERVNUSU5BVElPTl9BRERSRVNTID0gICAgIDB4NjAwMDAwOworVUxORyAgICBQQVNTMl9ERUNPREVfUkVGRVJFTkNFX0FERFJFU1MgPSAgICAgICAweDYwMDAwMDsKKyovCisKK3R5cGVkZWYgc3RydWN0IF9DVExfUkVHX0cgeworICAgIFVMT05HICAgQ29tcHJlc3NNb2RlOjE7CisgICAgVUxPTkcgICBTa2lwRW1wdHlGcmFtZToxOworICAgIFVMT05HICAgTWVtQnVyc3RMZW46MjsKKyAgICBVTE9ORyAgIExpbmVCdWZFbjoyOworICAgIFVMT05HICAgVW51c2VkOjI2OworfSBDVExfUkVHX0c7CisKKwordHlwZWRlZiB1bmlvbiBfVV9DVExfRyB7CisgICAgVUxPTkcgICAgICAgVmFsdWU7CisgICAgQ1RMX1JFR19HICAgQ3RsUmVnOworfSBVX0NUTF9HOworCit0eXBlZGVmIHN0cnVjdCBfTU9ERV9ERVRFQ1RJT05fUEFSQU1fUkVHIHsKKyAgICBVTE9ORyAgIFVudXNlZDE6ODsKKyAgICBVTE9ORyAgIEVkZ2VQaXhlbFRocmVzOjg7CisgICAgVUxPTkcgICBWZXJTdGFibGVNYXg6NDsKKyAgICBVTE9ORyAgIEhvclN0YWJsZU1heDo0OworICAgIFVMT05HICAgVmVyRGlmZk1heDo0OworICAgIFVMT05HICAgSG9yRGlmZk1heDo0OworfSBNT0RFX0RFVEVDVElPTl9QQVJBTV9SRUc7CisKK3R5cGVkZWYgc3RydWN0IF9DUkNfUFJJX1BBUkFNX1JFRyB7CisgICAgVUxPTkcgICBFbmFibGU6MTsKKyAgICBVTE9ORyAgIEhpZ2hCaXRPbmx5OjE7CisgICAgVUxPTkcgICBTa2lwQ291bnRNYXg6NjsKKyAgICBVTE9ORyAgIFBvbHlMb3c6ODsKKyAgICBVTE9ORyAgIFBvbHlIaWdoOjE2OworfSBDUkNfUFJJX1BBUkFNX1JFRzsKKwordHlwZWRlZiB1bmlvbiBfVV9DUkNfUFJJX1BBUkFNIHsKKyAgICBVTE9ORyAgICAgICAgICAgICAgIFZhbHVlOworICAgIENSQ19QUklfUEFSQU1fUkVHICAgQ1JDUHJpUGFyYW07Cit9IFVfQ1JDX1BSSV9QQVJBTTsKKwordHlwZWRlZiBzdHJ1Y3QgX0NSQ19TRUNfUEFSQU1fUkVHIHsKKyAgICBVTE9ORyAgIFVudXNlZDE6ODsKKyAgICBVTE9ORyAgIFBvbHlMb3c6ODsKKyAgICBVTE9ORyAgIFBvbHlIaWdoOjE2OworfSBDUkNfU0VDX1BBUkFNX1JFRzsKKwordHlwZWRlZiB1bmlvbiBfVV9DUkNfU0VDX1BBUkFNIHsKKyAgICBVTE9ORyAgICAgICAgICAgICAgIFZhbHVlOworICAgIENSQ19TRUNfUEFSQU1fUkVHICAgQ1JDU2VjUGFyYW07Cit9IFVfQ1JDX1NFQ19QQVJBTTsKKwordHlwZWRlZiBzdHJ1Y3QgX0dFTkVSQUxfSU5GTyB7CisgICAgQllURSAgICAgICAgICAgICAgICBFbmFibGVWaWRlb007CisgICAgQllURSAgICAgICAgICAgICAgICBDZW50ZXJNb2RlOworCUJZVEUJCQkJUkM0Tm9SZXNldEZyYW1lOworCUJZVEUJCQkJUkM0VGVzdE1vZGU7CisgICAgVV9DVExfRyAgICAgICAgICAgICB1Q3RsUmVnOworICAgIFVfQ1JDX1BSSV9QQVJBTSAgICAgdUNSQ1ByaVBhcmFtOworICAgIFVfQ1JDX1NFQ19QQVJBTSAgICAgdUNSQ1NlY1BhcmFtOworfSBHRU5FUkFMX0lORk8sICpQR0VORVJBTF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBfU0VRX0NUTF9SRUcgeworICAgIFVMT05HICAgVW51c2VkMToxOworICAgIFVMT05HICAgVW51c2VkMjoxOworICAgIFVMT05HICAgVW51c2VkMzoxOworICAgIFVMT05HICAgQ2FwdHVyZUF1dG9Nb2RlOjE7CisgICAgVUxPTkcgICBVbnVzZWQ0OjE7CisgICAgVUxPTkcgICBDb2RlY0F1dG9Nb2RlOjE7CisgICAgVUxPTkcgICBVbnVzZWQ1OjE7CisgICAgVUxPTkcgICBXYXRjaERvZzoxOworICAgIFVMT05HICAgQ1JUU2VsOjE7CisgICAgVUxPTkcgICBBbnRpVGVhcmluZzoxOworICAgIFVMT05HICAgRGF0YVR5cGU6MjsKKyAgICBVTE9ORyAgIFVudXNlZDY6MjA7Cit9IFNFUV9DVExfUkVHOworCit0eXBlZGVmIHVuaW9uIF9VX1NFUV9DVEwgeworICAgIFVMT05HICAgICAgICAgICAgICAgVmFsdWU7CisgICAgU0VRX0NUTF9SRUcgICBTZXFDdGxSZWc7Cit9IFVfU0VRX0NUTDsKKwordHlwZWRlZiBzdHJ1Y3QgX0NUTF9SRUcgeworICAgIFVMT05HICAgU3JjSHN5bmM6MTsKKyAgICBVTE9ORyAgIFNyY1ZzeW5jOjE7CisgICAgVUxPTkcgICBFeHRTcmM6MTsKKyAgICBVTE9ORyAgIEFuYWxvbmdFeHRTcmM6MTsKKyAgICBVTE9ORyAgIEludFRpbWluZ0dlbjoxOworICAgIFVMT05HICAgSW50RGF0YUZyb206MTsKKyAgICBVTE9ORyAgIFdyaXRlRm10OjI7CisgICAgVUxPTkcgICBWR0FDdXJzb3I6MTsKKyAgICBVTE9ORyAgIExpbmVhck1vZGU6MTsKKyAgICBVTE9ORyAgIENsb2NrRGVsYXk6MjsKKyAgICBVTE9ORyAgIENDSVI2NTZTcmM6MTsKKyAgICBVTE9ORyAgIFBvcnRDbG9jazoxOworICAgIFVMT05HICAgRXh0UG9ydDoxOyAgICAgICAgCisgICAgVUxPTkcgICBVbnVzZWQxOjE7CisgICAgVUxPTkcgICBGcmFtZVJhdGU6ODsKKyAgICBVTE9ORyAgIFVudXNlZDI6ODsKK30gQ1RMX1JFRzsKKwordHlwZWRlZiB1bmlvbiBfVV9DVEwgeworICAgIFVMT05HICAgICAgIFZhbHVlOworICAgIENUTF9SRUcgICAgIEN0bFJlZzsKK30gVV9DVExfUkVHOworCit0eXBlZGVmIHN0cnVjdCBfVElNSU5HX0dFTl9TRVRUSU5HX0ggeworICAgIFVMT05HICAgSERFRW5kOjEzOworICAgIFVMT05HICAgVW51c2VkMTozOworICAgIFVMT05HICAgSERFU3RhcnQ6MTM7CisgICAgVUxPTkcgICBVbnVzZWQyOjM7Cit9IFRJTUlOR19HRU5fU0VUVElOR19IOworCit0eXBlZGVmIHN0cnVjdCBfVElNSU5HX0dFTl9TRVRUSU5HX1YgeworICAgIFVMT05HICAgVkRFRW5kOjEzOworICAgIFVMT05HICAgVW51c2VkMTozOworICAgIFVMT05HICAgVkRFU3RhcnQ6MTM7CisgICAgVUxPTkcgICBVbnVzZWQyOjM7Cit9IFRJTUlOR19HRU5fU0VUVElOR19WOworCit0eXBlZGVmIHN0cnVjdCBfQkNEX0NUTF9SRUcgeworICAgIFVMT05HICAgRW5hYmxlOjE7CisgICAgVUxPTkcgICBVbnVzZWQxOjE1OworICAgIFVMT05HICAgVG9sZXJhbmNlOjg7CisgICAgVUxPTkcgICBVbnVzZWQyOjg7Cit9IEJDRF9DVExfUkVHOworCit0eXBlZGVmIHVuaW9uIF9VX0JDRF9DVEwgeworICAgIFVMT05HICAgICAgICAgICBWYWx1ZTsKKyAgICBCQ0RfQ1RMX1JFRyAgICAgQkNEQ3RsUmVnOworfSBVX0JDRF9DVEw7CisKK3R5cGVkZWYgc3RydWN0IF9DT01QUkVTU19XSU5ET1dfUkVHIHsKKyAgICBVTE9ORyAgIFZlckxpbmU6MTM7CisgICAgVUxPTkcgICBVbnVzZWQxOjM7CisgICAgVUxPTkcgICBIb3JQaXhlbDoxMzsKKyAgICBVTE9ORyAgIFVudXNlZDI6MzsKK30gQ09NUFJFU1NfV0lORE9XX1JFRzsKKwordHlwZWRlZiBzdHJ1Y3QgX1NUUkVBTV9CVUZfU0laRSB7CisgICAgVUxPTkcgICBQYWNrZXRTaXplOjM7CisgICAgVUxPTkcgICBSaW5nQnVmTnVtOjI7CisgICAgVUxPTkcgICBVbnVzZWQxOjExOworICAgIFVMT05HICAgU2tpcEhpZ2hNQlRocmVzOjc7CisgICAgVUxPTkcgICBTa2lwVGVzdE1vZGU6MjsKKyAgICBVTE9ORyAgIFVudXNlZDI6NzsKK30gU1RSRUFNX0JVRl9TSVpFOworCit0eXBlZGVmIHVuaW9uIF9VX1NUUkVBTV9CVUYgeworICAgIFVMT05HICAgICAgICAgICAgICAgVmFsdWU7CisgICAgU1RSRUFNX0JVRl9TSVpFICAgICBTdHJlYW1CdWZTaXplOworfSBVX1NUUkVBTV9CVUY7CisKKwordHlwZWRlZiBzdHJ1Y3QgX0NPTVBSRVNTX0NUTF9SRUcgeworICAgIFVMT05HICAgSlBFR09ubHk6MTsgLyogVHJ1ZTogSnBlZyBPbmx5IG1vZGUoRGlzYWJsZSBWUSksIEZhbHNlOkpwZWcgYW5kIFZRIG1peCBtb2RlICovCisgICAgVUxPTkcgICBFbjRWUToxOyAvKiBUcnVlOiAxLCAyLCA0IGNvbG9yIG1vZGUsIEZhbHNlOiAxLDIgY29sb3IgbW9kZSAqLworICAgIFVMT05HICAgQ29kZWNNb2RlOjE7IC8qIEhpZ2ggYW5kIGJlc3QgUXVhbnRpemF0aW9uIGVuY29kaW5nL2RlY29kaW5nIHNldHRpbmcqLworICAgIFVMT05HICAgRHVhbFF1YWxpdHk6MTsKKyAgICBVTE9ORyAgIEVuQmVzdDoxOworICAgIFVMT05HICAgRW5SQzQ6MTsKKyAgICBVTE9ORyAgIE5vckNocm9tYURDVFRhYmxlOjU7CisgICAgVUxPTkcgICBOb3JMdW1hRENUVGFibGU6NTsKKyAgICBVTE9ORyAgIEVuSGlnaDoxOworICAgIFVMT05HICAgVGVzdEN0bDoyOworICAgIFVMT05HICAgVVZGbXQ6MTsKKyAgICBVTE9ORyAgIEh1ZlRhYmxlOjI7CisgICAgVUxPTkcgICBBbHRlclZhbHVlMTo1OworICAgIFVMT05HICAgQWx0ZXJWYWx1ZTI6NTsKK30gQ09NUFJFU1NfQ1RMX1JFRzsKKwordHlwZWRlZiB1bmlvbiBfVV9DT01QUkVTU19DVEwgeworICAgIFVMT05HICAgICAgICAgICAgICAgVmFsdWU7CisgICAgQ09NUFJFU1NfQ1RMX1JFRyAgICBDb21wcmVzc0N0bFJlZzsKK30gVV9DT01QUkVTU19DVEw7CisKK3R5cGVkZWYgc3RydWN0IF9RVUFOVElfVEFCTEVfTE9XX1JFRyB7CisgICAgVUxPTkcgICBDaHJvbWFUYWJsZTo1OworICAgIFVMT05HICAgTHVtYVRhYmxlOjU7CisgICAgVUxPTkcgICBVbnVzZWQxOjIyOworfSBRVUFOVElfVEFCTEVfTE9XX1JFRzsKKwordHlwZWRlZiB1bmlvbiBfVV9DUVVBTlRJX1RBQkxFX0xPVyB7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgVmFsdWU7CisgICAgUVVBTlRJX1RBQkxFX0xPV19SRUcgICAgUVRhYmxlTG93UmVnOworfSBVX1FVQU5USV9UQUJMRV9MT1c7CisKK3R5cGVkZWYgc3RydWN0IF9RVUFOVElfVkFMVUVfUkVHIHsKKyAgICBVTE9ORyAgIEhpZ2g6MTU7CisJVUxPTkcJVW51c2VkMToxOworICAgIFVMT05HICAgQmVzdDoxNTsKKyAgICBVTE9ORyAgIFVudXNlZDI6MTsKK30gUVVBTlRJX1ZBTFVFX1JFRzsKKwordHlwZWRlZiB1bmlvbiBfVV9RVUFOVElfVkFMVUUgeworICAgIFVMT05HICAgICAgICAgICAgICAgVmFsdWU7CisgICAgUVVBTlRJX1ZBTFVFX1JFRyAgICBRVmFsdWVSZWc7Cit9IFVfUVVBTlRJX1ZBTFVFOworCit0eXBlZGVmIHN0cnVjdCBfQlNEX1BBUkFNX1JFRyB7CisgICAgVUxPTkcgICBIaWdoVGhyZXM6ODsKKyAgICBVTE9ORyAgIExvd1RocmVzOjg7CisgICAgVUxPTkcgICBIaWdoQ291bnQ6NjsKKyAgICBVTE9ORyAgIFVudXNlZDE6MjsKKyAgICBVTE9ORyAgIExvd0NvdW50OjY7CisgICAgVUxPTkcgICBVbnVzZWQyOjI7Cit9IEJTRF9QQVJBTV9SRUc7CisKK3R5cGVkZWYgdW5pb24gX1VfQlNEX1BBUkFNIHsKKyAgICBVTE9ORyAgICAgICAgICAgVmFsdWU7CisgICAgQlNEX1BBUkFNX1JFRyAgIEJTRFBhcmFtUmVnOworfSBVX0JTRF9QQVJBTTsKKwordHlwZWRlZiBzdHJ1Y3QgX1ZJREVPX0lORk8geworICAgIEJZVEUgICAgICBFeHRBRENBY3Q7ICAgIC8qIHJlYWQgZnJvbSBtb2RlY3Rpb24gcmVnaXN0ZXIgKi8KKwlCWVRFCSAgRW5hYmxlUkM0OworICAgIEJZVEUgICAgICBEb3duU2NhbGluZ01ldGhvZDsKKyAgICBVU0hPUlQgICAgQW5hbG9nRGlmZmVyZW50aWFsVGhyZXNob2xkOyAvKiBCQ0QgdG9sZXJhbmNlICovCisgICAgVVNIT1JUICAgIERpZ2l0YWxEaWZmZXJlbnRpYWxUaHJlc2hvbGQ7IC8qIEJDRCB0b2xlcmFuY2UgKi8KKyAgICBVU0hPUlQgICAgRHN0V2lkdGg7CisgICAgVVNIT1JUICAgIERzdEhlaWdodDsKKyAgICBVU0hPUlQgICAgU3JjV2lkdGg7CisgICAgVVNIT1JUICAgIFNyY0hlaWdodDsKKyAgICBCWVRFICAgICAgSGlnaEx1bWFUYWJsZTsgLyogaWYgSGlnaCBhbmQgYmVzdCBKcGVnIGNvZGVjIGVuYWJsZSwgdXNlIEhpZ2hMdW1hVGFibGUgYW5kIEhpZ2hDaHJvbWFUYWJsZSwgb3RoZXJ3aXNlIEhpZ2hEZVF1YW50aVZhbHVlIGFuZCBCZXN0RGVxdWFudGlWYWx1ZSovCisgICAgQllURSAgICAgIEhpZ2hDaHJvbWFUYWJsZTsKKyAgICBCWVRFICAgICAgSGlnaERlUXVhbnRpVmFsdWU7CisgICAgQllURSAgICAgIEJlc3REZXF1YW50aVZhbHVlOworICAgIFVfU0VRX0NUTCAgICAgICAgICAgICAgIHVTZXFDdGxSZWc7CisgICAgVV9DVExfUkVHICAgICAgICAgICAgICAgdUN0bFJlZzsKKyAgICBVX0JDRF9DVEwgICAgICAgICAgICAgICB1QkNEQ3RsUmVnOworICAgIFVfU1RSRUFNX0JVRiAgICAgICAgICAgIHVTdHJlYW1CdWZTaXplOworICAgIFVfQ09NUFJFU1NfQ1RMICAgICAgICAgIHVDb21wcmVzc0N0bFJlZzsKKyAgICBVX1FVQU5USV9UQUJMRV9MT1cgICAgICB1UVRhYmxlTG93UmVnOworICAgIFVfUVVBTlRJX1ZBTFVFICAgICAgICAgIHVRVmFsdWVSZWc7CisgICAgVV9CU0RfUEFSQU0gICAgICAgICAgICAgdUJTRFBhcmFtUmVnOworfSBWSURFT19JTkZPLCAqUFZJREVPX0lORk8gOworCit0eXBlZGVmIHN0cnVjdCBfVklERU9NX1NFUV9DVExfUkVHIHsKKyAgICBVTE9ORyAgIFVudXNlZDE6MTsgIC8vQml0IDAKKyAgICBVTE9ORyAgIFVudXNlZDI6MTsJLy9CaXQgMQorICAgIFVMT05HICAgVW51c2VkMzoxOwkJLy9CaXQgMgorICAgIFVMT05HICAgU3RyZWFtTW9kZToxOwkvL0JpdCAzCisgICAgVUxPTkcgICBVbnVzZWQ0OjE7CS8vQml0IDQKKyAgICBVTE9ORyAgIENvZGVjQXV0b01vZGU6MTsJLy9CaXQgNQorCVVMT05HCVVudXNlZDY6MTsJLy9CaXQgNgorICAgIFVMT05HICAgVW51c2VkNzoxOwkvL0JpdCA3CisgICAgVUxPTkcgICBTcmNTZWw6MTsJLy9CaXQgOAorICAgIFVMT05HICAgVW51c2VkOToxOwkvL0JpdCA5CisgICAgVUxPTkcgICBEYXRhVHlwZToyOyAgLy9CaXRbMTE6MTBdCisgICAgVUxPTkcgICBVbnVzZWQxMjoyMDsKK30gVklERU9NX1NFUV9DVExfUkVHOworCit0eXBlZGVmIHVuaW9uIF9VX1ZJREVPTV9TRVFfQ1RMIHsKKyAgICBVTE9ORwkJCQkJVmFsdWU7CisgICAgVklERU9NX1NFUV9DVExfUkVHCQlTZXFDdGxSZWc7Cit9IFVfVklERU9NX1NFUV9DVEw7CisKK3R5cGVkZWYgc3RydWN0IF9WSURFT01fSU5GTyB7CisgICAgQllURSAgICAgIERvd25TY2FsaW5nTWV0aG9kOworICAgIFVTSE9SVCAgICBBbmFsb2dEaWZmZXJlbnRpYWxUaHJlc2hvbGQ7IC8qIEJDRCB0b2xlcmFuY2UgKi8KKyAgICBVU0hPUlQgICAgRGlnaXRhbERpZmZlcmVudGlhbFRocmVzaG9sZDsgLyogQkNEIHRvbGVyYW5jZSAqLworICAgIFVTSE9SVCAgICBEc3RXaWR0aDsKKyAgICBVU0hPUlQgICAgRHN0SGVpZ2h0OworICAgIFVTSE9SVCAgICBTcmNXaWR0aDsKKyAgICBVU0hPUlQgICAgU3JjSGVpZ2h0OworICAgIEJZVEUgICAgICBIaWdoTHVtYVRhYmxlOyAvKiBpZiBIaWdoIGFuZCBiZXN0IEpwZWcgY29kZWMgZW5hYmxlLCB1c2UgSGlnaEx1bWFUYWJsZSBhbmQgSGlnaENocm9tYVRhYmxlLCBvdGhlcndpc2UgSGlnaERlUXVhbnRpVmFsdWUgYW5kIEJlc3REZXF1YW50aVZhbHVlKi8KKyAgICBCWVRFICAgICAgSGlnaENocm9tYVRhYmxlOworICAgIEJZVEUgICAgICBIaWdoRGVRdWFudGlWYWx1ZTsKKyAgICBCWVRFICAgICAgQmVzdERlcXVhbnRpVmFsdWU7CisgICAgQllURSAgICAgIFBhY2tldFNpemU7ICAgLy90aGUgc2FtZSBhcyB2aWRlbzEgJiB2aWRlbzIKKyAgICBCWVRFICAgICAgUmluZ0J1Zk51bTsKKwlCWVRFCSAgRW5hYmxlUkM0OworICAgIFVfVklERU9NX1NFUV9DVEwgICAgICAgIHVTZXFDdGxSZWc7CisgICAgVV9CQ0RfQ1RMICAgICAgICAgICAgICAgdUJDREN0bFJlZzsKKyAgICBVX0NPTVBSRVNTX0NUTCAgICAgICAgICB1Q29tcHJlc3NDdGxSZWc7CisgICAgVV9RVUFOVElfVEFCTEVfTE9XICAgICAgdVFUYWJsZUxvd1JlZzsKKyAgICBVX1FVQU5USV9WQUxVRSAgICAgICAgICB1UVZhbHVlUmVnOworICAgIFVfQlNEX1BBUkFNICAgICAgICAgICAgIHVCU0RQYXJhbVJlZzsKK30gVklERU9NX0lORk8sICpQVklERU9NX0lORk8gOworCit0eXBlZGVmIHN0cnVjdCBfVklERU9fTU9ERV9JTkZPCit7CisgICAgVVNIT1JUICAgIFg7CisgICAgVVNIT1JUICAgIFk7CisgICAgVVNIT1JUICAgIENvbG9yRGVwdGg7CisgICAgVVNIT1JUICAgIFJlZnJlc2hSYXRlOworICAgIEJZVEUgICAgICBNb2RlSW5kZXg7Cit9IFZJREVPX01PREVfSU5GTywgKlBWSURFT19NT0RFX0lORk87CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjMwMC92ZXNhLmggYi9ib2FyZC9hc3BlZWQvYXN0MjMwMC92ZXNhLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjlhYmE5MAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL3Zlc2EuaApAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaWZuZGVmIF9WRVNBX0hfCisjZGVmaW5lIF9WRVNBX0hfCisKK3R5cGVkZWYgZW51bSAKK3sKKwlWQ0xLMjVfMTc1CT0gMHgwMCwKKwlWQ0xLMjhfMzIyCT0gMHgwMSwKKwlWQ0xLMzFfNQk9IDB4MDIsCisJVkNMSzMxXzU3NAk9IDB4MDMsCisJVkNMSzMyXzc2CT0gMHgwNCwKKwlWQ0xLMzNfMTU0CT0gMHgwNSwKKwlWQ0xLMzYJCT0gMHgwNiwKKwlWQ0xLNDAJCT0gMHgwNywKKwlWQ0xLNDVfOTc4CT0gMHgwOCwKKwlWQ0xLNDlfNQk9IDB4MDksCisJVkNMSzUwCQk9IDB4MEEsCisJVkNMSzUyXzk1CT0gMHgwQiwKKwlWQ0xLNTZfMjUJPSAweDBDLAorCVZDTEs2NQkJPSAweDBELAorCVZDTEs3NF80OAk9IDB4MEUsCisJVkNMSzc1CQk9IDB4MEYsCisJVkNMSzc4Xzc1CT0gMHgxMCwKKwlWQ0xLNzlfMzczCT0gMHgxMSwKKwlWQ0xLODFfNjI0CT0gMHgxMiwKKwlWQ0xLODNfNDYyCT0gMHgxMywKKwlWQ0xLODRfNzE1CT0gMHgxNCwKKwlWQ0xLOTRfNQk9IDB4MTUsCisJVkNMSzEwNl81CT0gMHgxNiwKKwlWQ0xLMTA4CQk9IDB4MTcsCisJVkNMSzExOQkJPSAweDE4LAorCVZDTEsxMzUJCT0gMHgxOSwKKwlWQ0xLMTM2XzM1OCA9IDB4MUEsCisJVkNMSzE0Nl8yNQk9IDB4MUIsCisJVkNMSzE1NAkJPSAweDFDLAorCVZDTEsxNTdfNQk9IDB4MUQsCisJVkNMSzE2MgkJPSAweDFFCit9IGVQSVhFTF9DTE9DSzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVTSE9SVCAgICBIb3Jpem9udGFsVG90YWw7CisgICAgVVNIT1JUICAgIFZlcnRpY2FsVG90YWw7CisgICAgVVNIT1JUICAgIEhvcml6b250YWxBY3RpdmU7CisgICAgVVNIT1JUICAgIFZlcnRpY2FsQWN0aXZlOworICAgIEJZVEUgICAgICBSZWZyZXNoUmF0ZTsKKyAgICBkb3VibGUgICAgSG9yaXpvbnRhbEZyZXF1ZW5jeTsKKyAgICBVU0hPUlQgICAgSFN5bmNUaW1lOworICAgIFVTSE9SVCAgICBIQmFja1BvcmNoOworICAgIFVTSE9SVCAgICBWU3luY1RpbWU7CisgICAgVVNIT1JUICAgIFZCYWNrUG9yY2g7CisgICAgVVNIT1JUICAgIEhMZWZ0Qm9yZGVyOworICAgIFVTSE9SVCAgICBIUmlnaHRCb3JkZXI7CisgICAgVVNIT1JUICAgIFZCb3R0b21Cb3JkZXI7CisgICAgVVNIT1JUCSAgVlRvcEJvcmRlcjsKKwlVU0hPUlQJICBQaXhlbENsb2NrOworCUJPT0wJICBIb3JQb2xhcml0eTsKKwlCT09MCSAgVmVyUG9sYXJpdHk7CisgICAgQllURSAgICAgIEFEQ0luZGV4MTsKKyAgICBCWVRFICAgICAgQURDSW5kZXgyOworICAgIEJZVEUgICAgICBBRENJbmRleDM7CisgICAgQllURSAgICAgIEFEQ0luZGV4NTsKKyAgICBCWVRFICAgICAgQURDSW5kZXg2OworICAgIEJZVEUgICAgICBBRENJbmRleDc7CisgICAgQllURSAgICAgIEFEQ0luZGV4ODsKKyAgICBCWVRFICAgICAgQURDSW5kZXg5OworICAgIEJZVEUgICAgICBBRENJbmRleEE7CisgICAgQllURSAgICAgIEFEQ0luZGV4RjsKKyAgICBCWVRFICAgICAgQURDSW5kZXgxNTsKKyAgICBpbnQgICAgICAgSG9yaXpvbnRhbFNoaWZ0OworICAgIGludCAgICAgICBWZXJ0aWNhbFNoaWZ0OworfSBWRVNBX01PREU7CisKKyNkZWZpbmUgSE9SX1BPU0lUSVZFIDAKKyNkZWZpbmUgSE9SX05FR0FUSVZFIDEKKyNkZWZpbmUgVkVSX1BPU0lUSVZFIDAKKyNkZWZpbmUgVkVSX05FR0FUSVZFIDEKKworI2lmZGVmIFZFU0FfR0xPQkFMUworCisvLyAgTm90ZTogTW9kaWZpZWQgZm9yIG1vZGVzIHdoaWNoIGhhdmUgYm9yZGVyIGlzc3VlCitWRVNBX01PREUgdk1vZGVUYWJsZVtdID0geworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gNjBIeiBtb2RlCisvLyA3MjB4NDgwIGRvbmUKKyAgezEwNTYsIDQ5NywgIDcyMCwgIDQ4MCwgIDYwLCAyOS45MDAsIDg4LCAgMTA0LCAzLCAxMywgMCwgMCwgMCwgMCwJVkNMSzMxXzU3NCwgIEhPUl9ORUdBVElWRSwgVkVSX05FR0FUSVZFLCAweDQxLAkweEYwLCAweDQ4LCAweDA1LCAweDIwLCAweDU4LCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAgNiwJMn0sCisvLyA4NDh4NDgwIGRvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHsxMDY0LCA1MTcsICA4NDgsICA0ODAsICA2MCwgMzEuMTYwLCA4OCwgIDkxLCAgMywgMjYsIDAsIDAsIDAsIDAsCVZDTEszM18xNTQsICBIT1JfTkVHQVRJVkUsIFZFUl9ORUdBVElWRSwgMHg0MiwJMHg3MCwgMHg0OCwgMHgwNSwgMHgyMCwgMHg1OCwgMHg2MCwgMHg2MCwgMHg2MCwJMHg1RSwgMHhGRSwgIDYsCTJ9LAorICB7ODAwLCAgNTI1LCAgNjQwLCAgNDgwLCAgNjAsIDMxLjQ2OSwgOTYsICA0MCwgIDIsIDI1LCAxLCAxLCA4LCA4LAlWQ0xLMjVfMTc1LCAgSE9SX05FR0FUSVZFLCBWRVJfTkVHQVRJVkUsIDB4MzEsCTB4RjAsIDB4NDgsIDB4MDUsIDB4MjAsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NjAsCTB4NUUsIDB4RkUsICA2LAkyfSwKKy8vIDcyMHg1NzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgezkxMiwgIDU5NywgIDcyMCwgIDU3NiwgIDYwLCAzNS45MjAsIDcyLCAgODgsICAzLCAxNywgMCwgMCwgMCwgMCwJVkNMSzMyXzc2LCAgIEhPUl9ORUdBVElWRSwgVkVSX05FR0FUSVZFLCAweDM4LAkweEYwLCAweDQ4LCAweDA1LCAweDIwLCAweDQ4LCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAgNiwJMn0sCisvLyA5NjB4NjAwIEdURiBkb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHsxMjMyLCA2MjIsICA5NjAsICA2MDAsICA2MCwgMzcuMzIwLCA5NiwgIDEzNiwgMywgMTgsIDAsIDAsIDAsIDAsCVZDTEs0NV85NzgsICBIT1JfTkVHQVRJVkUsIFZFUl9ORUdBVElWRSwgMHg0QywJMHhGMCwgMHg2MCwgMHgwNSwgMHgyMCwgMHg2MCwgMHg2MCwgMHg2MCwgMHg2MCwJMHg1RSwgMHhGRSwgLTEsCTB9LAorICB7MTA1NiwgNjI4LCAgODAwLCAgNjAwLCAgNjAsIDM3Ljg3OSwgMTI4LCA4OCwgIDQsIDIzLCAwLCAwLCAwLCAwLAlWQ0xLNDAsCSAgICAgSE9SX1BPU0lUSVZFLCBWRVJfUE9TSVRJVkUsIDB4NDEsCTB4RjAsIDB4NjAsIDB4MDUsIDB4MjAsIDB4ODAsIDB4NjAsIDB4NjAsIDB4NjAsCTB4NUUsIDB4RkUsIC0xLAkwfSwKKy8vIDEwODh4NjEyIEdURiBkb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgezEzOTIsIDYzNCwgIDEwODgsIDYxMiwgIDYwLCAzOC4wNCwgIDExMiwgMTUyLCAzLCAxOCwgMCwgMCwgMCwgMCwJVkNMSzUyXzk1LCAgIEhPUl9ORUdBVElWRSwgVkVSX05FR0FUSVZFLCAweDU2LAkweEYwLCAweDYwLCAweDA1LCAweDIwLCAweDcwLCAweDYwLCAweDYwLCAweDYwLCAweDVFLCAweEZFLCAtMSwgMH0sCisvLyAxMjgweDcyMCBHVEYgZG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHsxNjY0LCA3NDYsICAxMjgwLCA3MjAsICA2MCwgNDQuNzYwLCAxMzYsIDE5MiwgMywgMjIsIDAsIDAsIDAsIDAsCVZDTEs3NF80OCwgICBIT1JfTkVHQVRJVkUsIFZFUl9ORUdBVElWRSwgMHg2NywJMHhGMCwgMHhBOCwgMHgwNSwgMHgyMCwgMHg4OCwgMHg2MCwgMHg2MCwgMHg2MCwgMHg1RSwgMHhGRSwgLTEsIDB9LAorLy8gMTM2MHg3NjggR1RGIGRvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB7MTc3NiwgNzk1LCAgMTM2MCwgNzY4LCAgNjAsIDQ3LjcwMCwgMTQ0LCAyMDgsIDMsIDIzLCAwLCAwLCAwLCAwLAlWQ0xLODRfNzE1LCAgSE9SX05FR0FUSVZFLCBWRVJfTkVHQVRJVkUsIDB4NkUsCTB4RjAsIDB4QTgsIDB4MDUsIDB4MjAsIDB4OTAsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NUUsIDB4RkUsICA3LCAxfSwKKy8vIDEyODB4NzY4IGRvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgezE2NjQsIDc5OCwgIDEyODAsIDc2OCwgIDYwLCA0Ny43MDAsIDEyOCwgMTg0LCA3LCAyMCwgMCwgMCwgMCwgMCwJVkNMSzc5XzM3MywgIEhPUl9ORUdBVElWRSwgVkVSX05FR0FUSVZFLCAweDY3LAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweDgwLCAweDYwLCAweDYwLCAweDYwLCAweDVFLCAweEZFLCAgNywgMX0sCisgIHsxMzQ0LCA4MDYsICAxMDI0LCA3NjgsICA2MCwgNDguMzYzLCAxMzYsIDE2MCwgNiwgMjksIDAsIDAsIDAsIDAsCVZDTEs2NSwJICAgICBIT1JfTkVHQVRJVkUsIFZFUl9ORUdBVElWRSwgMHg1MywJMHhGMCwgMHhBOCwgMHgwNSwgMHgyMCwgMHg4OCwgMHg2MCwgMHg2MCwgMHg2MCwJMHg1RSwgMHhGRSwgLTEsCTd9LAorLy8gMTI4MHg4MDAgR1RGIGRvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB7MTY4MCwgODI4LCAgMTI4MCwgODAwLCAgNjAsIDQ5LjY4MCwgMTM2LCAyMDAsIDMsIDI0LCAwLCAwLCAwLCAwLAlWQ0xLODNfNDYyLCAgSE9SX05FR0FUSVZFLCBWRVJfTkVHQVRJVkUsIDB4NjgsCTB4RjAsIDB4QTgsIDB4MDUsIDB4MjAsIDB4ODgsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NUUsIDB4RkUsIC0xLCAwfSwKKy8vIDExNTJ4ODY0IEdURiBkb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgezE1MjAsIDg5NSwgIDExNTIsIDg2NCwgIDYwLCA1My43MDAsIDEyMCwgMTg0LCAzLCAyNywgMCwgMCwgMCwgMCwJVkNMSzgxXzYyNCwgIEhPUl9ORUdBVElWRSwgVkVSX05FR0FUSVZFLCAweDVFLAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweDc4LCAweDYwLCAweDYwLCAweDYwLCAweDVFLCAweEZFLCAtMSwgMH0sCisvLyAxNjAweDkwMCBHVEYgZG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHsyMTI4LCA5MzIsICAxNjAwLCA5MDAsICA2MCwgNTUuOTIwLCAxNjgsIDI2NCwgMywgMjgsIDAsIDAsIDAsIDAsCVZDTEsxMTksCSBIT1JfTkVHQVRJVkUsIFZFUl9ORUdBVElWRSwgMHg4NCwJMHhGMCwgMHhBOCwgMHgwNSwgMHgyMCwgMHhBOCwgMHg2MCwgMHg2MCwgMHg2MCwgMHg1RSwgMHhGRSwgLTEsIDB9LAorLy8gMTQ0MFg5MDAgQ1ZUIGRvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB7MTkwNCwgOTMzLCAgMTQ0MCwgOTAwLCAgNjAsIDU1LjkzNSwgMTUyLCAyMzIsIDYsCTI1LAkwLCAwLCAwLCAwLAlWQ0xLMTA2XzUsICAgSE9SX05FR0FUSVZFLCBWRVJfUE9TSVRJVkUsIDB4NzYsCTB4RjAsIDB4QTgsIDB4MDUsIDB4MjAsIDB4OTYsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NUUsIDB4RkUsIC0xLCAwfSwKKyAgezE4MDAsIDEwMDAsIDEyODAsIDk2MCwgIDYwLCA2MC4wMDAsIDExMiwgMzEyLCAzLCAzNiwgMCwgMCwgMCwgMCwJVkNMSzEwOCwJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDcwLAkweDcwLCAweEE4LCAweDA1LCAweDIwLCAweDcwLCAweDYwLCAweDYwLCAweDYwLCAweDVFLCAweEZFLCAtMSwgMH0sCisvLyAxNjAweDEwMjQgR1RGIGRvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHsyMTQ0LCAxMDYwLCAxNjAwLCAxMDI0LCA2MCwgNjMuNjAwLCAxNjgsIDI3MiwgMywgMzIsIDAsIDAsIDAsIDAsCVZDTEsxMzZfMzU4LCBIT1JfTkVHQVRJVkUsIFZFUl9ORUdBVElWRSwgMHg4NSwJMHhGMCwgMHhFOCwgMHgwNSwgMHgyMCwgMHhBOCwgMHg2MCwgMHg2MCwgMHg2MCwJMHg1RSwgMHhGRSwgLTEsCTB9LAorICB7MTY4OCwgMTA2NiwgMTI4MCwgMTAyNCwgNjAsIDYzLjk4MSwgMTEyLCAyNDgsIDMsIDM4LCAwLCAwLCAwLCAwLAlWQ0xLMTA4LAkgSE9SX1BPU0lUSVZFLCBWRVJfUE9TSVRJVkUsIDB4NjksCTB4NzAsIDB4QTgsIDB4MDUsIDB4MjAsIDB4NzAsIDB4NjAsIDB4NjAsIDB4NjAsCTB4NUUsIDB4RkUsIC0xLAkwfSwKKy8vIDE2ODBYMTA1MCBDVlQgZG9uZSBSZWR1Y2VkIEJsYW5raW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB7MTg0MCwgMTA4MCwgMTY4MCwgMTA1MCwgNjAsIDY0LjY3NCwgMzIsICA4MCwJIDYsCTIxLAkwLCAwLCAwLCAwLAlWQ0xLMTE5LAkgSE9SX1BPU0lUSVZFLCBWRVJfTkVHQVRJVkUsIDB4NzIsCTB4RjAsIDB4QTgsIDB4MDUsIDB4MjAsIDB4MjAsIDB4NjAsIDB4NjAsIDB4NjAsCTB4NUUsIDB4RkUsIC0xLAkwfSwKKy8vIDE5MjBYMTIwMCBDVlQgZG9uZSBSZWR1Y2VkIEJsYW5raW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHsyMDgwLCAxMjM1LCAxOTIwLCAxMjAwLCA2MCwgNzQuMDM4LCAzMiwgIDgwLCAgNiwgMjYsIDAsIDAsIDAsIDAsIFZDTEsxNTQsICAgICBIT1JfUE9TSVRJVkUsIFZFUl9ORUdBVElWRSwgMHg4MSwJMHhGMCwgMHhBOCwgMHgwNSwgMHgyMCwgMHgyMCwgMHg2MCwgMHg2MCwgMHg2MCwJMHg1RSwgMHhGRSwgLTEsCTB9LAorICAvL3syMTYwLCAgICAgICAgICAgMTI1MCwgICAgICAgICAgIDE2MDAsICAgICAgICAgICAxMjAwLCA2MCw3NS4wMDAsICAgICAgICAgICAxOTIsICAgICAgICAzMDQsICAgICAgICAgMywgICAgICAgICAgNDYsICAgICAgICAgIDAsICAgICAgICAgICAgMCwgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIDAsCQkJVkNMSzE2MiwJCUhPUl9QT1NJVElWRSwJVkVSX1BPU0lUSVZFfSwKKyAgezIxNjAsIDEyNDgsIDE2MDAsIDEyMDAsIDYwLCA3NS4wMDAsIDE5MiwgMzA0LCAzLCA0NiwgMCwgMCwgMCwgMCwJVkNMSzE2MiwJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDg2LAkweEYwLCAweEU4LCAweDA1LCAweDIwLCAweEMwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgTm90IDYwSHogbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB7OTAwLCAgNDQ5LCAgNzIwLCAgNDAwLCAgNzAsIDMxLjQ2OSwgMTA4LCA0NSwgIDIsIDI1LCAxLCAxLCA4LCA4LAkwLAkJCSBIT1JfTkVHQVRJVkUsIFZFUl9ORUdBVElWRSwgMHgzOCwJMHgzMCwgMHg0OCwgMHgwNSwgMHgyMCwgMHg2QywgMHg2MCwgMHg2MCwgMHg2MCwJMHg1RSwgMHhGRSwgIDYsCTF9LAorICB7ODMyLCAgNTIwLCAgNjQwLCAgNDgwLCAgNzIsIDM3Ljg2MSwgNDAsICAxMjAsIDMsIDIwLCAxLCAxLCA4LCA4LAkwLAkJCSBIT1JfTkVHQVRJVkUsIFZFUl9ORUdBVElWRSwgMHgzMywJMHhGMCwgMHg0OCwgMHgwNSwgMHgyMCwgMHgyOCwgMHg2MCwgMHg2MCwgMHg2MCwJMHg1RSwgMHhGRSwgIDYsCTN9LAorICB7ODQwLCAgNTAwLCAgNjQwLCAgNDgwLCAgNzUsIDM3LjUwMCwgNjQsICAxMjAsIDMsIDE2LCAwLCAwLCAwLCAwLAkwLAkJCSBIT1JfTkVHQVRJVkUsIFZFUl9ORUdBVElWRSwgMHgzNCwJMHg3MCwgMHg0OCwgMHgwNSwgMHgyMCwgMHg0MCwgMHg2MCwgMHg2MCwgMHg2MCwJMHg1RSwgMHhGRSwgLTEsCTN9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHs4MzIsICA1MDksICA2NDAsICA0ODAsICA4NSwgNDMuMjY5LCA1NiwgIDgwLCAgMywgMjUsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9ORUdBVElWRSwgVkVSX05FR0FUSVZFLCAweDMzLAkweEYwLCAweDQ4LCAweDA1LCAweDIwLCAweDM4LCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJM30sCisgIHsxMDI0LCA2MjUsICA4MDAsICA2MDAsICA1NiwgMzUuMTU2LCA3MiwgIDEyOCwgMiwgMjIsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDNGLAkweEYwLCAweDYwLCAweDA1LCAweDIwLCAweDQ4LCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsxMDQwLCA2NjYsICA4MDAsICA2MDAsICA3MiwgNDguMDc3LCAxMjAsIDY0LCAgNiwgMjMsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDQwLAkweEYwLCAweDYwLCAweDA1LCAweDIwLCAweDc4LCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsxMDU2LCA2MjUsICA4MDAsICA2MDAsICA3NSwgNDYuODc1LCA4MCwgIDE2MCwgMywgMjEsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDQxLAkweEYwLCAweDYwLCAweDA1LCAweDIwLCAweDUwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsxMDQ4LCA2MzEsICA4MDAsICA2MDAsICA4NSwgNTMuNjc0LCA2NCwgIDE1MiwgMywgMjcsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDQxLAkweDcwLCAweDYwLCAweDA1LCAweDIwLCAweDQwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsxMzI4LCA4MDYsICAxMDI0LCA3NjgsICA3MCwgNTYuNDc2LCAxMzYsIDE0NCwgNiwgMjksIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9ORUdBVElWRSwgVkVSX05FR0FUSVZFLCAweDUyLAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweDg4LCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJN30sCisgIHsxMzEyLCA4MDAsICAxMDI0LCA3NjgsICA3NSwgNjAuMDIzLCA5NiwgIDE3NiwgMywgMjgsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDUxLAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweDYwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMX0sCisgIHsxMzc2LCA4MDgsICAxMDI0LCA3NjgsICA4NSwgNjguNjc3LCA5NiwgIDIwOCwgMywgMzYsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDU1LAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweDYwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMX0sCisgIHsxNjAwLCA5MDAsICAxMTUyLCA4NjQsICA3NSwgNjcuNTAwLCAxMjgsIDI1NiwgMywgMzIsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDYzLAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweDgwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsxNzI4LCAxMDExLCAxMjgwLCA5NjAsICA4NSwgODUuOTM4LCAxNjAsIDIyNCwgMywgNDcsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDZCLAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweEEwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsxNjg4LCAxMDY2LCAxMjgwLCAxMDI0LCA3NSwgNzkuOTc2LCAxNDQsIDI0OCwgMywgMzgsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDY5LAkweDcwLCAweEU4LCAweDA1LCAweDIwLCAweDkwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsxNzI4LCAxMDcyLCAxMjgwLCAxMDI0LCA4NSwgOTEuMTQ2LCAxNjAsIDIyNCwgMywgNDQsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDZCLAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweEEwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsyMTYwLCAxMjUwLCAxNjAwLCAxMjAwLCA2NSwgODEuMjUwLCAxOTIsIDMwNCwgMywgNDYsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDg2LAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweEMwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsyMTYwLCAxMjUwLCAxNjAwLCAxMjAwLCA3MCwgODcuNTAwLCAxOTIsIDMwNCwgMywgNDYsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDg2LAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweEMwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsyMTYwLCAxMjUwLCAxNjAwLCAxMjAwLCA3NSwgOTMuNzUwLCAxOTIsIDMwNCwgMywgNDYsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDg2LAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweEMwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsyMTYwLCAxMjUwLCAxNjAwLCAxMjAwLCA4NSwgMTA2LjI1MCwxOTIsIDMwNCwgMywgNDYsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDg2LAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweEMwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0KK307CisKK1VTSE9SVCAgTW9kZU51bWJlckNvdW50ID0gc2l6ZW9mICh2TW9kZVRhYmxlKSAvIHNpemVvZiAoVkVTQV9NT0RFKTsKK1VTSE9SVCAgTW9kZTYwSFpDb3VudCA9IDIxOworCisjZWxzZSAgLyogTk9UIFZFU0FfR0xPQkFMUyAqLworZXh0ZXJuIFZFU0FfTU9ERSB2TW9kZVRhYmxlW107CitleHRlcm4gVVNIT1JUICBNb2RlTnVtYmVyQ291bnQ7CitleHRlcm4gVVNIT1JUICBNb2RlNjBIWkNvdW50OworI2VuZGlmCisKKyNlbmRpZiAvKiBfVkVTQV9IXyAqLworCisKZGlmZiAtLWdpdCBhL2JvYXJkL2FzcGVlZC9hc3QyMzAwL3ZmdW4uYyBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL3ZmdW4uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNzA3ZTgwCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvdmZ1bi5jCkBAIC0wLDAgKzEsNTQ1IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNkZWZpbmUgQlVGX0dMT0JBTFMKKyNpbmNsdWRlICJ0eXBlLmgiCisjaW5jbHVkZSAidmRlZi5oIgorI2luY2x1ZGUgInZyZWcuaCIKKyNpbmNsdWRlICJjcnQuaCIKKyNpbmNsdWRlICJ2ZnVuLmgiCisKK1VMT05HIFVubG9ja1NDVVJlZ0hvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgS2V5KQoreworICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoU0NVX0JBU0UsIFNDVV9QUk9URUNUX1JFRywgS2V5KTsKKyAgICByZXR1cm4gUmVhZE1lbW9yeUxvbmdIb3N0KFNDVV9CQVNFLFNDVV9QUk9URUNUX1JFRyk7Cit9CisKK3ZvaWQgUmVzZXRWaWRlb0hvc3Qodm9pZCkKK3sKKwlXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoU0NVX0JBU0UsIFNDVV9DT05UUk9MX1JFRywgVklERU9fUkVTRVRfRU4gPDwgVklERU9fRU5HSU5FX1JFU0VUX0JJVCwgVklERU9fRU5HSU5FX1JFU0VUX01BU0spOworCVdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgU0NVX0NPTlRST0xfUkVHLCBWSURFT19SRVNFVF9PRkYgPDwgVklERU9fRU5HSU5FX1JFU0VUX0JJVCwgVklERU9fRU5HSU5FX1JFU0VUX01BU0spOworfQorCit2b2lkIFN0YXJ0TW9kZURldGVjdGlvblRyaWdnZXJIb3N0KFVMT05HICAgTU1JT0Jhc2UsIFVMT05HIG9mZnNldCkKK3sKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIG9mZnNldCwgMCwgTU9ERV9ERVRFQ1RJT05fVFJJR0dFUik7CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBvZmZzZXQsIE1PREVfREVURUNUSU9OX1RSSUdHRVIsIE1PREVfREVURUNUSU9OX1RSSUdHRVIpOworfQorCitCT09MIFJlYWRWaWRlb0ludGVycnVwdEhvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgdmFsdWUpCit7CisgICAgcmV0dXJuICgoUmVhZE1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFT19JTlRfQ09OVFJPTF9SRUFEX1JFRykgJiB2YWx1ZSkgPyBUUlVFIDogRkFMU0UpOworfQorCitVTE9ORyBVbmxvY2tWaWRlb1JlZ0hvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgS2V5KQoreworICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIEtFWV9DT05UUk9MX1JFRywgS2V5KTsKKyAgICByZXR1cm4gUmVhZE1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLEtFWV9DT05UUk9MX1JFRyk7Cit9CisKK3ZvaWQgU3RhcnRWaWRlb0NhcHR1cmVUcmlnZ2VySG9zdChVTE9ORyAgIE1NSU9CYXNlLCBVTE9ORyBvZmZzZXQpCit7CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBvZmZzZXQsIDAsIFZJREVPX0NBUFRVUkVfVFJJR0dFUik7CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBvZmZzZXQsIFZJREVPX0NBUFRVUkVfVFJJR0dFUiwgVklERU9fQ0FQVFVSRV9UUklHR0VSKTsKK30KKwordm9pZCBTdGFydFZpZGVvQ29kZWNUcmlnZ2VySG9zdChVTE9ORyAgIE1NSU9CYXNlLCBVTE9ORyBvZmZzZXQpCit7CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBvZmZzZXQsIDAsIFZJREVPX0NPREVDX1RSSUdHRVIpOworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgb2Zmc2V0LCBWSURFT19DT0RFQ19UUklHR0VSLCBWSURFT19DT0RFQ19UUklHR0VSKTsKK30KKwordm9pZCBTdG9wTW9kZURldGVjdGlvblRyaWdnZXJIb3N0KFVMT05HICAgTU1JT0Jhc2UsIFVMT05HIG9mZnNldCkKK3sKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIG9mZnNldCwgMCwgTU9ERV9ERVRFQ1RJT05fVFJJR0dFUik7Cit9CisKK3ZvaWQgQ2xlYXJWaWRlb0ludGVycnVwdEhvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgdmFsdWUpCit7CisgICAgLy9Xcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPX0lOVF9DT05UUk9MX0NMRUFSX1JFRywgdmFsdWUsIHZhbHVlKTsKKwlXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFT19JTlRfQ09OVFJPTF9DTEVBUl9SRUcsIHZhbHVlKTsKK30KKworLyogVW5Mb2NrIFNDVSBIb3N0IGFuZCBSZXNldCBFbmdpbmUgKi8KK0JPT0wgQ2hlY2tPblN0YXJ0SG9zdCh2b2lkKQoreworICAgIGludCBpPTAsIGR3VmFsdWU9MDsKKyAgICAKKyAgICBkbworICAgIHsKKwlkd1ZhbHVlID0gVW5sb2NrU0NVUmVnSG9zdCgwLCBTQ1VfVU5MT0NLX0tFWSk7CisJaSsrOworICAgIH0KKyAgICB3aGlsZSAoKFNDVV9XUklURV9FTkFCTEUgIT0gZHdWYWx1ZSkgJiYgKGk8MTApKTsKKworICAgIC8vQ2xlYXIgU0NVIFJlc2V0IFJlZ2lzdGVyCisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChTQ1VfQkFTRSwgU0NVX0NPTlRST0xfUkVHLCAwKTsKKworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgU0NVX0NMT0NLX1NUT1BfUkVHLCAoRU5fRUNMSyB8IEVOX1YxQ0xLIHwgRU5fVjJDTEspLCAoU1RPUF9FQ0xLX01BU0sgfCBTVE9QX1YxQ0xLX01BU0sgfCBTVE9QX1YyQ0xLX01BU0spKTsKKworI2lmCWRlZmluZWQoQ09ORklHX0FTVDIzMDApCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFNDVV9CQVNFLCAoMHg5MCArIFNDVV9PRkZTRVQpLCAweDAwMDAwMDIwLCAweDAwMDAwMDMwKTsJLy9lbmFibGUgMjRiaXRzCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFNDVV9CQVNFLCAoMHg4OCArIFNDVV9PRkZTRVQpLCAweDAwMGZmZjAwLCAweDAwMGZmZjAwKTsJLy9lbmFibGUgdmlkZW8gbXVsdGktcGlucyAgICAKKyNlbHNlCS8vQVNUMjEwMCAKKyAgICAvL1dyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgU0NVX1BJTl9DVFJMMV9SRUcsIChWSURFT19QT1JUQV9FTiB8IFZJREVPX1BPUlRCX0VOIHwgVklERU9fVlAxX0VOIHwgVklERU9fVlAyX0VOKSAsIAorICAgIC8vCQkJCQkJCShWSURFT19QT1JUQV9NQVNLIHwgVklERU9fUE9SVEJfTUFTSyB8IFZJREVPX1ZQMV9NQVNLIHwgVklERU9fVlAyX01BU0spKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoU0NVX0JBU0UsIFNDVV9QSU5fQ1RSTDJfUkVHLCAoVklERU9fUE9SVEFfU0lOR0xFX0VER0UgfCBWSURFT19QT1JUQl9TSU5HTEVfRURHRSkgLCAKKwkgICAgICAJCQkJCQkgICAgIChWSURFT19QT1JUQV9TSU5HTEVfRURHRV9NQVNLIHwgVklERU9fUE9SVEJfU0lOR0xFX0VER0VfTUFTSykpOworI2VuZGlmCSAgICAgIAkJCQkJCSAgICAgCisKKyAgICBSZXNldFZpZGVvSG9zdCgpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK0JPT0wgQ2hlY2tPblN0YXJ0Q2xpZW50KHZvaWQpCit7CisJaW50IGk9MCwgZHdWYWx1ZT0wOworICAgIAorCWRvCisJeworCQlkd1ZhbHVlID0gVW5sb2NrU0NVUmVnSG9zdCgwLCBTQ1VfVU5MT0NLX0tFWSk7CisJCWkrKzsKKwl9CisJd2hpbGUgKChTQ1VfV1JJVEVfRU5BQkxFICE9IGR3VmFsdWUpICYmIChpPDEwKSk7CisKKwkvL0NsZWFyIFNDVSBSZXNldCBSZWdpc3RlcgorCVdyaXRlTWVtb3J5TG9uZ0NsaWVudChTQ1VfQkFTRSwgU0NVX0NPTlRST0xfUkVHLCAwKTsKKworCVdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLQ2xpZW50KFNDVV9CQVNFLCBTQ1VfQ0xPQ0tfU1RPUF9SRUcsIChFTl9FQ0xLIHwgRU5fVjFDTEsgfCBFTl9EMUNMSyB8IEVOX0QyQ0xLIHwgRU5fVjJDTEspLCAKKwkJCQkJCQkJICAoU1RPUF9FQ0xLX01BU0sgfCBTVE9QX0QxQ0xLX01BU0sgfCBTVE9QX0QyQ0xLX01BU0sgfCBTVE9QX1YxQ0xLX01BU0sgfCBTVE9QX1YyQ0xLX01BU0spKTsKKworCS8vV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoU0NVX0JBU0UsIFNDVV9DTE9DS19TRUxFQ1RJT05fUkVHLCBQT1JUQl9GUk9NX0QyQ0xLIHwgUE9SVEJfQ0xPQ0tfSU5WX0RFTEFZXzNOUyB8IFBPUlRBX0NMT0NLX0lOVl9ERUxBWV8zTlMsIFBPUlRCX0NMT0NLX1NFTCB8IFBPUlRCX0NMT0NLX0RFTEFZX01BU0sgfCBQT1JUQV9DTE9DS19ERUxBWV9NQVNLKTsKKwkvL0ExRVZBCisJV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoU0NVX0JBU0UsIFNDVV9DTE9DS19TRUxFQ1RJT05fUkVHLCAoUE9SVEJfRlJPTV9EMkNMSyB8IFBPUlRCX0NMT0NLX0lOVl9ERUxBWV8xTlMgfCBQT1JUQV9DTE9DS19JTlZfREVMQVlfMU5TKSwgKFBPUlRCX0NMT0NLX1NFTCB8IFBPUlRCX0NMT0NLX0RFTEFZX01BU0sgfCBQT1JUQV9DTE9DS19ERUxBWV9NQVNLKSk7CisJV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoU0NVX0JBU0UsIDB4MjAyQywgKDB4MDM8PDkpLCAoMHgwMzw8OSkpOworCisJV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoU0NVX0JBU0UsIFNDVV9QSU5fQ1RSTDFfUkVHLCAoVklERU9fUE9SVEFfRU4gfCBWSURFT19QT1JUQl9FTiB8IFZJREVPX1ZQMV9FTiB8IFZJREVPX1ZQMl9FTiksIAorCQkJCQkJCQkgIChWSURFT19QT1JUQV9NQVNLIHwgVklERU9fUE9SVEJfTUFTSyB8IFZJREVPX1ZQMV9NQVNLIHwgVklERU9fVlAyX01BU0spKTsKKworI2lmIENPTkZJR19BU1QzMDAwCisJV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoU0NVX0JBU0UsIFNDVV9QSU5fQ1RSTDJfUkVHLCAoVklERU9fUE9SVEFfRFVBTF9FREdFIHwgVklERU9fUE9SVEJfRFVBTF9FREdFKSwgCisJCQkJCQkJCSAgKFZJREVPX1BPUlRBX1NJTkdMRV9FREdFX01BU0sgfCBWSURFT19QT1JUQl9TSU5HTEVfRURHRV9NQVNLKSk7CisjZWxzZQorCS8vMjEwMCBpcyBzaW5nbGUgZWRnZQorCVdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLQ2xpZW50KFNDVV9CQVNFLCBTQ1VfUElOX0NUUkwyX1JFRywgKFZJREVPX1BPUlRBX1NJTkdMRV9FREdFIHwgVklERU9fUE9SVEJfU0lOR0xFX0VER0UpLCAKKwkJCQkJCQkJICAoVklERU9fUE9SVEFfU0lOR0xFX0VER0VfTUFTSyB8IFZJREVPX1BPUlRCX1NJTkdMRV9FREdFX01BU0spKTsKKyNlbmRpZgorCisJV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoU0NVX0JBU0UsIFNDVV9DTE9DS19TVE9QX1JFRywgKEVOX0QxQ0xLIHwgRU5fRDJDTEspLCAoU1RPUF9EMUNMS19NQVNLIHwgU1RPUF9EMkNMS19NQVNLKSk7CisJV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoU0NVX0JBU0UsIFNDVV9QSU5fQ1RSTDFfUkVHLCBWR0FfUElOX09GRiwgVkdBX1BJTl9NQVNLKTsKKworICAgIC8vUmVzZXRWaWRlb0hvc3QoKTsKKworCXJldHVybiBUUlVFOworfQorCitVTE9ORyAgSW5pdGlhbGl6ZVZpZGVvRW5naW5lSG9zdCAoVUxPTkcgICAgICAgICAgICAgICAgTU1JT0Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgblZpZGVvLAorCQkJCQkJCSAgIEJPT0wJCQkJCUhvclBvbGFyaXR5LAorCQkJCQkJCSAgIEJPT0wJCQkJCVZlclBvbGFyaXR5KQoreworICAgIC8vVUxPTkcgICB0ZW1wLCB0ZW1wMSwgdGVtcDI7IAorICAgIFVMT05HICAgZHdSZWdPZmZzZXQgPSBuVmlkZW8gKiAweDEwMDsKKyAgICBVTE9ORyAgIGR3VmFsdWU7CisgICAgaW50ICAgICBpOworCisKKyAgICAvKiBHZW5lcmFsIFZpZGVvIENvbnRyb2wgKi8KKyAgICAvL0xpbmVCdWZFbiAwCisgICAgLy9kd1ZhbHVlID0gKENPTVBSRVNTX01PREUgPDwgQ09ERUNfREVDT01QUkVTU19NT0RFX0JJVCkgfCBERUxBWV9WU1lOQ19FTjsKKyAgICBkd1ZhbHVlID0gMDsKKyAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFT19DT05UUk9MX1JFRywgZHdWYWx1ZSk7CisgICAgLy9WaWRlbyBEYXRhIFRydW5jYXRpb24gUmVnaXN0ZXIKKwlXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCAweDMyOCwgMCk7CisKKwkvL0QyQ0xLIGNsb2NrIG11c3QgY29uZmlnIGFjY29yZGluZyB0byB2aWRlbydzIGxpbmUgYnVmZmVyCisJaWYgKFZJREVPMSA9PSBuVmlkZW8pCisJICAgIGR3VmFsdWUgPSBMSU5FX0JVRkZFUl9WSURFTzE7CisgICAgZWxzZQorICAgICAgICBkd1ZhbHVlID0gTElORV9CVUZGRVJfVklERU8yOworICAgIAorCS8vRDJDTEsgY2xvY2sgbXVzdCBjb25maWcgYWNjb3JkaW5nIHRvIHZpZGVvJ3MgbGluZSBidWZmZXIKKwlzd2l0Y2ggKGR3VmFsdWUpCisJeworCWNhc2UgTElORV9CVUZGRVJfT0ZGOgorCQlXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoU0NVX0JBU0UsIFNDVV9DTE9DS19TRUxFQ1RJT05fUkVHLCBOT1JNQUxfQ1JUMSwgRDJDTEtfQ0xPQ0tfU0VMRUNUSU9OX01BU0spOworCQlXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoU0NVX0JBU0UsIFNDVV9DTE9DS19TVE9QX1JFRywgU1RPUF9EMkNMSywgU1RPUF9EMkNMS19NQVNLKTsKKwkJYnJlYWs7CisJY2FzZSBMSU5FX0JVRkZFUl9WSURFTzE6CisJCVdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgU0NVX0NMT0NLX1NFTEVDVElPTl9SRUcsIFYxQ0xLX1ZJREVPMSA8PCBEMkNMS19DTE9DS19TRUxFQ1RJT05fQklULCBEMkNMS19DTE9DS19TRUxFQ1RJT05fTUFTSyk7CisJCVdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgU0NVX0NMT0NLX1NUT1BfUkVHLCBFTl9EMkNMSywgU1RPUF9EMkNMS19NQVNLKTsKKwkJYnJlYWs7CisJY2FzZSBMSU5FX0JVRkZFUl9WSURFTzI6CisJCVdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgU0NVX0NMT0NLX1NFTEVDVElPTl9SRUcsIFYxQ0xLX1ZJREVPMiA8PCBEMkNMS19DTE9DS19TRUxFQ1RJT05fQklULCBEMkNMS19DTE9DS19TRUxFQ1RJT05fTUFTSyk7CisJCVdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgU0NVX0NMT0NLX1NUT1BfUkVHLCBFTl9EMkNMSywgU1RPUF9EMkNMS19NQVNLKTsKKwkJYnJlYWs7CisJY2FzZSBMSU5FX0JVRkZFUl9WSURFT006CisJCS8vSWYgc2VsZWN0IHRoaXMgb3B0aW9uLCBpdCB3aWxsIGNvbmZpZyBhdCB2aWRlb00gSU5JVAorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKyAgICBkd1ZhbHVlID0gMDsKKyAgICAvL1ZSMzAgbm93IGlzIGNhcHR1cmUgd2luZG93IGluIHRoZSBjb21wcmVzc2lvbgorICAgIGR3VmFsdWUgPSBnX0RlZkhlaWdodCA8PCBDQVBUVVJFX1ZFUl9MSU5FX0JJVCB8CisgICAgZ19EZWZXaWR0aCA8PCBDQVBUVVJFX0hPUl9QSVhFTF9CSVQ7CisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0NBUFRVUkVfV0lORE9XU19SRUcgKyBkd1JlZ09mZnNldCwgZHdWYWx1ZSk7ICAgICAgICAKKworICAgIGR3VmFsdWUgPSAwOworICAgIC8vVlIzNCBub3cgaXMgZGVzdGlvbmF0aW9uIHdpbmRvdyBpbiB0aGUgY29tcHJlc3Npb24KKwlkd1ZhbHVlID0gZ19EZWZIZWlnaHQgPDwgQ09NUFJFU1NfVkVSX0xJTkVfQklUIHwKKwlnX0RlZldpZHRoIDw8IENPTVBSRVNTX0hPUl9QSVhFTF9CSVQ7CisKKyAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfQ09NUFJFU1NfV0lORE9XU19SRUcgKyBkd1JlZ09mZnNldCwgZHdWYWx1ZSk7ICAgICAgICAKKworICAgIC8vQml0Q09VTlQgYWNjb3JkaW5nIGNvbXByZXNzIGRhdGEgZm9ybWF0CisgICAgZHdWYWx1ZSA9IFlVVjQ0NF9NT0RFOworCWlmIChZVVY0NDRfTU9ERSA9PSBkd1ZhbHVlKQorCQlXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9CVUZfTElORV9PRkZTRVRfUkVHICsgZHdSZWdPZmZzZXQsIGdfRGVmV2lkdGggKiBJTlBVVF9CSVRDT1VOVF9ZVVY0NDQsIEJVRl9MSU5FX09GRlNFVF9NQVNLKTsKKwllbHNlCisJCVdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0JVRl9MSU5FX09GRlNFVF9SRUcgKyBkd1JlZ09mZnNldCwgZ19EZWZXaWR0aCAqIElOUFVUX0JJVENPVU5UX1lVVjQyMCwgQlVGX0xJTkVfT0ZGU0VUX01BU0spOworICAgICAgICAgICAgICAKKyAgICAvLyAgQ1JDCisgICAgLy9EaXNhYmxlCisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU9fQ1JDX1BSSU1BUllfUkVHLCAweDApOyAgICAKKyAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFT19DUkNfU0VDT05EX1JFRywgMHgwKTsKKyAgICAKKyAgICAvKiBTZXF1ZW5jZSBDb250cm9sIHJlZ2lzdGVyICovCisJLy9Pb25seSBFbmNvZGVyIG5lZWQgdG8gc2V0CisJLyogRW5naW5lIFNlcXVlbmNlIENvbnRvbCBSZWdpc3RlciAqLworCWR3VmFsdWUgPSAoV0FUQ0hfRE9HX0VOIDw8IFdBVENIX0RPR19FTkFCTEVfQklUKSB8CisJICAgICAgICAgICAgVklERU9fQ0FQVFVSRV9BVVRPX01PREUgfAorCSAgICAgICAgICAgIFZJREVPX0NPREVDX0FVVE9fTU9ERTsKKyAgICAKKyAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfRU5HSU5FX1NFUVVFTkNFX0NPTlRST0xfUkVHICsgZHdSZWdPZmZzZXQsIGR3VmFsdWUpOworICAgIAorICAgIC8qIENvbnRyb2wgcmVnaXN0ZXIgKi8KKwlkd1ZhbHVlID0gKEhPUl9ORUdBVElWRSA9PSBIb3JQb2xhcml0eSkgPyBOT19JTlZFUlNFX1BPTCA6IElOVkVSU0VfUE9MOworCWR3VmFsdWUgPSAoKChWRVJfTkVHQVRJVkUgPT0gVmVyUG9sYXJpdHkpID8gTk9fSU5WRVJTRV9QT0wgOiBJTlZFUlNFX1BPTCkgPDwgVklERU9fVlNZTkNfUE9MQVJJVFlfQklUKSB8IGR3VmFsdWU7CisgICAgCisJLyogSFcgUmVjb21tYW5kKi8KKwkvL2R3VmFsdWUgPSAoVElMRV9NT0RFIDw8IDkpIHwgZHdWYWx1ZTsKKwlkd1ZhbHVlID0gKEVYVEVSTkFMX1ZHQV9TT1VSQ0UgPDwgRVhURVJOQUxfU09VUkNFX0JJVCkgfCBkd1ZhbHVlOworICAgIAorICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9DT05UUk9MX1JFRyArIGR3UmVnT2Zmc2V0LCBkd1ZhbHVlKTsKKyAgICAgICAgCisgICAgLyogQkNEIHJlZ2lzdGVyICovCisgICAgLy9OTyBCQ0QKKyAgICBkd1ZhbHVlID0gMDsKKyAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfQkNEX0NPTlRST0xfUkVHICsgZHdSZWdPZmZzZXQsIGR3VmFsdWUpOworCisgICAgLyogU3RyZWFtIEJ1ZmZlciBTaXplIHJlZ2lzdGVyICovCisgICAgZHdWYWx1ZSA9IChZVVZfVEVTVCA8PCBTS0lQX1RFU1RfTU9ERV9CSVQpIHwKKyAgICAgICAgICAgICAgICAoUEFDS0VUX1NJWkVfMzJLQiA8PCBTVFJFQU1fUEFDS0VUX1NJWkVfQklUKSB8CisgICAgICAgICAgICAgICAgKFBBQ0tFVFNfOCA8PCBSSU5HX0JVRl9QQUNLRVRfTlVNX0JJVCk7CisgICAgLyogdGhlIHNhbWUgd2l0aCBWaWRlbzEsIFZpZGVvMiwgYW5kIFZpZGVvTSovCisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX1NUUkVBTV9CVUZfU0laRSwgZHdWYWx1ZSk7CisKKyAgICAvKiBDb21yZXNzaW9uIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyAgICBkd1ZhbHVlID0gKFVTRV9VVl9DSVI2NTYgPDwgVVZfQ0lSNjU2X0ZPUk1BVF9CSVQpfAorICAgICAgICAgICAgICAgIChKUEVHX01JWF9NT0RFIDw8IEpQRUdfT05MWV9CSVQpfAorICAgICAgICAgICAgICAgIChWUV80X0NPTE9SX01PREUgPDwgVlFfNF9DT0xPUl9CSVQpfAorICAgICAgICAgICAgICAgIChRVUFOVElfQ09ERUNfTU9ERSA8PCBRVUFMSVRZX0NPREVDX1NFVFRJTkdfQklUKXwKKyAgICAgICAgICAgICAgICAoNyA8PCBOT1JNQUxfUVVBTlRJX0NIUk9NSV9UQUJMRV9CSVQpIHwKKyAgICAgICAgICAgICAgICAoMjMgPDwgTk9STUFMX1FVQU5USV9MVU1JX1RBQkxFX0JJVCk7CisgICAKKyAgICAvL1ZpZGVvMiBoYXZlIHNhbWUgdmFsdWUgYXMgdmlkZW8xCisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0NPTVBSRVNTX0NPTlRST0xfUkVHLCBkd1ZhbHVlKTsKKworICAgIC8qIEpQRUcgUXVhbnRpemF0aW9uIFRhYmxlIHJlZ2lzdGVyICovCisgICAgZHdWYWx1ZSA9IDA7CisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX1FVQU5USV9UQUJMRV9MT1dfUkVHLCBkd1ZhbHVlKTsKKyAgICAKKyAgICAvKiBRdWFudGl6YXRpb24gdmFsdWUgcmVnaXN0ZXIgKi8KKyAgICAvL1ZpZGVvMiBoYXZlIHNhbWUgdmFsdWUgYXMgdmlkZW8xCisgICAgZHdWYWx1ZSA9IDA7CisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX1FVQU5USV9WQUxVRV9SRUcsIGR3VmFsdWUpOworCisgICAgLy9WaWRlbyBCU0QgUGFyYW1ldGVyIFJlZ2lzdGVyCisgICAgLy9WaWRlbzIgaGF2ZSBzYW1lIHZhbHVlIGFzIHZpZGVvMQorICAgIGR3VmFsdWUgPSAwOworICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9CU0RfUEFSQV9SRUcsIGR3VmFsdWUpOworCisgICAgLy9ubyBzY2FsZQorICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9TQ0FMRV9GQUNUT1JfUkVHLCAgMHgxMDAwMTAwMCk7CisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX1NDQUxFX0ZBQ1RPUl9QQVJBTUVURVIwX1JFRywgMHgwMDIwMDAwMCk7CisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX1NDQUxFX0ZBQ1RPUl9QQVJBTUVURVIxX1JFRywgMHgwMDIwMDAwMCk7CisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX1NDQUxFX0ZBQ1RPUl9QQVJBTUVURVIyX1JFRywgMHgwMDIwMDAwMCk7CisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX1NDQUxFX0ZBQ1RPUl9QQVJBTUVURVIzX1JFRywgMHgwMDIwMDAwMCk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKK1VMT05HICBJbml0aWFsaXplVmlkZW9FbmdpbmVDbGllbnQgKFVMT05HICAgICAgICAgICAgICAgIE1NSU9CYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIG5WaWRlbykKK3sKKyAgICAvL1VMT05HICAgdGVtcCwgdGVtcDEsIHRlbXAyOyAKKyAgICBVTE9ORyAgIGR3UmVnT2Zmc2V0ID0gblZpZGVvICogMHgxMDA7CisgICAgVUxPTkcgICBkd1ZhbHVlOworICAgIGludCAgICAgaTsKKworCisgICAgLyogR2VuZXJhbCBWaWRlbyBDb250cm9sICovCisgICAgLy9MaW5lQnVmRW4gMAorICAgIGR3VmFsdWUgPSAoREVDT01QUkVTU19NT0RFIDw8IENPREVDX0RFQ09NUFJFU1NfTU9ERV9CSVQpOworICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPX0NPTlRST0xfUkVHLCBkd1ZhbHVlKTsKKyAgICAvL1ZpZGVvIERhdGEgVHJ1bmNhdGlvbiBSZWdpc3RlcgorCVdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIDB4MzI4LCAwKTsKKworICAgIC8vVlIzMCBub3cgaXMgY2FwdHVyZSB3aW5kb3cgaW4gdGhlIGNvbXByZXNzaW9uCisgICAgZHdWYWx1ZSA9IGdfRGVmSGVpZ2h0IDw8IENBUFRVUkVfVkVSX0xJTkVfQklUIHwKKyAgICBnX0RlZldpZHRoIDw8IENBUFRVUkVfSE9SX1BJWEVMX0JJVDsKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9DQVBUVVJFX1dJTkRPV1NfUkVHICsgZHdSZWdPZmZzZXQsIGR3VmFsdWUsIENBUFRVUkVfVkVSX0xJTkVfTUFTSyB8IENBUFRVUkVfSE9SX1BJWEVMX01BU0spOyAgICAgICAgCisKKyAgICAvL1ZSMzQgbm93IGlzIGRlc3Rpb25hdGlvbiB3aW5kb3cgaW4gdGhlIGNvbXByZXNzaW9uCisJZHdWYWx1ZSA9IGdfRGVmSGVpZ2h0IDw8IENPTVBSRVNTX1ZFUl9MSU5FX0JJVCB8CisJZ19EZWZXaWR0aCA8PCBDT01QUkVTU19IT1JfUElYRUxfQklUOworCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfQ09NUFJFU1NfV0lORE9XU19SRUcgKyBkd1JlZ09mZnNldCwgZHdWYWx1ZSwgQ09NUFJFU1NfVkVSX0xJTkVfTUFTSyB8IENPTVBSRVNTX0hPUl9QSVhFTF9NQVNLKTsgICAgICAgIAorCisgICAgLy9CaXRDT1VOVCBhY2NvcmRpbmcgY29tcHJlc3MgZGF0YSBmb3JtYXQKKyAgICBkd1ZhbHVlID0gWVVWNDQ0X01PREU7CisJaWYgKFlVVjQ0NF9NT0RFID09IGR3VmFsdWUpCisJCVdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0JVRl9MSU5FX09GRlNFVF9SRUcgKyBkd1JlZ09mZnNldCwgZ19EZWZXaWR0aCAqIElOUFVUX0JJVENPVU5UX1lVVjQ0NCwgQlVGX0xJTkVfT0ZGU0VUX01BU0spOworCWVsc2UKKwkJV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfQlVGX0xJTkVfT0ZGU0VUX1JFRyArIGR3UmVnT2Zmc2V0LCBnX0RlZldpZHRoICogSU5QVVRfQklUQ09VTlRfWVVWNDIwLCBCVUZfTElORV9PRkZTRVRfTUFTSyk7CisgICAgICAgICAgICAgIAorICAgIC8vICBDUkMKKyAgICAvL0Rpc2FibGUKKyAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFT19DUkNfUFJJTUFSWV9SRUcsIDB4MCk7ICAgIAorICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPX0NSQ19TRUNPTkRfUkVHLCAweDApOworICAgIAorICAgIC8qIFNlcXVlbmNlIENvbnRyb2wgcmVnaXN0ZXIgKi8KKwkvL09vbmx5IEVuY29kZXIgbmVlZCB0byBzZXQKKwkvKiBFbmdpbmUgU2VxdWVuY2UgQ29udG9sIFJlZ2lzdGVyICovCisgICAgZHdWYWx1ZSA9IFZJREVPX0NBUFRVUkVfQVVUT19NT0RFIHwKKyAgICAgICAgVklERU9fQ09ERUNfQVVUT19NT0RFOworICAgIAorICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9FTkdJTkVfU0VRVUVOQ0VfQ09OVFJPTF9SRUcgKyBkd1JlZ09mZnNldCwgZHdWYWx1ZSk7CisgICAgCisgICAgLyogQ29udHJvbCByZWdpc3RlciAqLworCS8qIEhXIFJlY29tbWFuZCovCisJZHdWYWx1ZSA9IChUSUxFX01PREUgPDwgOSk7IAkKKyAgICAKKyAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfQ09OVFJPTF9SRUcgKyBkd1JlZ09mZnNldCwgZHdWYWx1ZSk7CisgICAgICAgIAorICAgIC8qIEJDRCByZWdpc3RlciAqLworICAgIC8vTk8gQkNECisgICAgZHdWYWx1ZSA9IDA7CisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0JDRF9DT05UUk9MX1JFRyArIGR3UmVnT2Zmc2V0LCBkd1ZhbHVlKTsKKworICAgIC8qIFN0cmVhbSBCdWZmZXIgU2l6ZSByZWdpc3RlciAqLworICAgIGR3VmFsdWUgPSAoWVVWX1RFU1QgPDwgU0tJUF9URVNUX01PREVfQklUKSB8CisgICAgICAgICAgICAgICAgKFBBQ0tFVF9TSVpFXzMyS0IgPDwgU1RSRUFNX1BBQ0tFVF9TSVpFX0JJVCkgfAorICAgICAgICAgICAgICAgIChQQUNLRVRTXzggPDwgUklOR19CVUZfUEFDS0VUX05VTV9CSVQpOworICAgIC8qIHRoZSBzYW1lIHdpdGggVmlkZW8xLCBWaWRlbzIsIGFuZCBWaWRlb00qLworICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9TVFJFQU1fQlVGX1NJWkUsIGR3VmFsdWUpOworICAgICAgICAKKworICAgIC8qIENvbXJlc3Npb24gY29udHJvbCByZWdpc3RlciAqLworICAgIGR3VmFsdWUgPSAoVVNFX1VWX0NJUjY1NiA8PCBVVl9DSVI2NTZfRk9STUFUX0JJVCl8CisgICAgICAgICAgICAgICAgKEpQRUdfTUlYX01PREUgPDwgSlBFR19PTkxZX0JJVCl8CisgICAgICAgICAgICAgICAgKFZRXzRfQ09MT1JfTU9ERSA8PCBWUV80X0NPTE9SX0JJVCl8CisgICAgICAgICAgICAgICAgKFFVQU5USV9DT0RFQ19NT0RFIDw8IFFVQUxJVFlfQ09ERUNfU0VUVElOR19CSVQpfAorICAgICAgICAgICAgICAgICg3IDw8IE5PUk1BTF9RVUFOVElfQ0hST01JX1RBQkxFX0JJVCkgfAorICAgICAgICAgICAgICAgICgyMyA8PCBOT1JNQUxfUVVBTlRJX0xVTUlfVEFCTEVfQklUKTsKKyAgIAorICAgIC8vVmlkZW8yIGhhdmUgc2FtZSB2YWx1ZSBhcyB2aWRlbzEKKyAgICBpZiAoVklERU8xID09IG5WaWRlbykKKyAgICB7CisgICAgICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9DT01QUkVTU19DT05UUk9MX1JFRywgZHdWYWx1ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPTV9DT01QUkVTU19DT05UUk9MX1JFRywgZHdWYWx1ZSk7CisgICAgfQorCisgICAgLyogSlBFRyBRdWFudGl6YXRpb24gVGFibGUgcmVnaXN0ZXIgKi8KKyAgICBkd1ZhbHVlID0gMDsKKyAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfUVVBTlRJX1RBQkxFX0xPV19SRUcsIGR3VmFsdWUpOworICAgIAorICAgIC8qIFF1YW50aXphdGlvbiB2YWx1ZSByZWdpc3RlciAqLworICAgIC8vVmlkZW8yIGhhdmUgc2FtZSB2YWx1ZSBhcyB2aWRlbzEKKyAgICBkd1ZhbHVlID0gMDsKKyAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfUVVBTlRJX1ZBTFVFX1JFRywgZHdWYWx1ZSk7CisKKyAgICAvL1ZpZGVvIEJTRCBQYXJhbWV0ZXIgUmVnaXN0ZXIKKyAgICAvL1ZpZGVvMiBoYXZlIHNhbWUgdmFsdWUgYXMgdmlkZW8xCisgICAgZHdWYWx1ZSA9IDA7CisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0JTRF9QQVJBX1JFRywgZHdWYWx1ZSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworQllURSAgR2V0STJDUmVnQ2xpZW50KFVMT05HICBNTUlPQmFzZSwgCisJCQkJIEJZVEUgRGV2aWNlU2VsZWN0LCAKKwkJCQkgQllURSBEZXZpY2VBZGRyZXNzLCAKKwkJCQkgQllURSBSZWdpc3RlckluZGV4KQoreworICAgIEJZVEUgICAgRGF0YTsKKyAgICBVTE9ORyAgIFN0YXR1czsKKworLy8gIFJlc2V0CisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDAwLCAwKTsKKy8vICBTZXQgQUMgVGltaW5nIGFuZCBTcGVlZAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgwNCwgQUNfVElNSU5HKTsKKy8vICBMb3dlciBTcGVlZAorLy8gICAgV3JpdGVNZW1vcnlMb25nV2l0aEFORERhdGEgKFZpZGVvRW5naW5lSW5mby0+VkdBUENJSW5mby51bE1NSU9CYXNlQWRkcmVzcywgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgwNCwgMCwgMHgzMzMxNzgwNSk7CisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDA4LCAwKTsKKy8vICBDbGVhciBJbnRlcnJ1cHQKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTAsIDB4RkZGRkZGRkYpOworLy8gIEVuYWJsZSBNYXN0ZXIgTW9kZQorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgwMCwgMSk7CisvLyAgRW5hYmxlIEludGVycnVwdAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgwQywgMHhBRik7CisvLyAgQllURSBJMkMgTW9kZQorLy8gIFN0YXJ0IGFuZCBTZW5kIERldmljZSBBZGRyZXNzCisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDIwLCBEZXZpY2VBZGRyZXNzKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTQsIDB4Myk7CisvLyAgV2FpdCBUWCBBQ0sKKyAgICBkbyB7CisgICAgICAgIFN0YXR1cyA9IFJlYWRNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDEwKSAmIDB4MDM7CisgICAgfSB3aGlsZSAoU3RhdHVzICE9IDEpOworLy8gIENsZWFyIEludGVycnVwdAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxMCwgMHhGRkZGRkZGRik7CisvLyAgU2VuZCBEZXZpY2UgUmVnaXN0ZXIgSW5kZXgKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MjAsIFJlZ2lzdGVySW5kZXgpOworICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxNCwgMHgyKTsKKy8vICBXYWl0IFR4IEFDSworICAgIGRvIHsKKyAgICAgICAgU3RhdHVzID0gUmVhZE1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTApICYgMHgwMzsKKyAgICB9IHdoaWxlIChTdGF0dXMgIT0gMSk7CisvLyAgQ2xlYXIgSW50ZXJydXB0CisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDEwLCAweEZGRkZGRkZGKTsKKy8vICBTdGFydCwgU2VuZCBEZXZpY2UgQWRkcmVzcyArIDEoUmVhZCBNb2RlKSwgUmVjZWl2ZSBEYXRhCisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDIwLCBEZXZpY2VBZGRyZXNzICsgMSk7CisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDE0LCAweDFCKTsKKy8vICBXYWl0IFJ4IERvbmUKKyAgICBkbyB7CisgICAgICAgIFN0YXR1cyA9IChSZWFkTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxMCkgJiAweDA0KSA+PiAyOworICAgIH0gd2hpbGUgKFN0YXR1cyAhPSAxKTsKKy8vICBDbGVhciBJbnRlcnJ1cHQKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTAsIDB4RkZGRkZGRkYpOworCisvLyAgRW5hYmxlIFNUT1AgSW50ZXJydXB0CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MEMsIDB4MTAsIDB4MTApOworLy8gIElzc3VlIFNUT1AgQ29tbWFuZAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxNCwgMHgyMCk7CisvLyAgV2FpdCBTVE9QCisgICAgZG8geworICAgICAgICBTdGF0dXMgPSAoUmVhZE1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTApICYgMHgxMCkgPj4gNDsKKyAgICB9IHdoaWxlIChTdGF0dXMgIT0gMSk7CisvLyAgRGlzYWJsZSBTVE9QIEludGVycnVwdAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgwQywgMHgxMCk7CisvLyAgQ2xlYXIgSW50ZXJydXB0CisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDEwLCAweEZGRkZGRkZGKTsKKy8vICBSZWFkIFJlY2VpdmVkIERhdGEKKyAgICBEYXRhID0gKEJZVEUpKChSZWFkTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgyMCkgJiAweEZGMDApID4+IDgpOworCisgICAgcmV0dXJuICAgIERhdGE7Cit9CisKK1VMT05HICBTZXRJMkNSZWdDbGllbnQoVUxPTkcgIE1NSU9CYXNlLCAKKyAgICAgICAgICAgICAgICAgQllURSAgIERldmljZVNlbGVjdCwgCisgICAgICAgICAgICAgICAgIEJZVEUgICBEZXZpY2VBZGRyZXNzLCAKKyAgICAgICAgICAgICAgICAgQllURSAgIFJlZ2lzdGVySW5kZXgsIAorICAgICAgICAgICAgICAgICBCWVRFICAgUmVnaXN0ZXJWYWx1ZSkKK3sKKyAgICBVTE9ORyAgIFN0YXR1czsgCisJVUxPTkcgICBDb3VudCA9IDA7CisKKy8vICBSZXNldAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgwMCwgMCk7CisvLyAgU2V0IFNwZWVkCisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDA0LCBBQ19USU1JTkcpOworLy8gIExvd2VyIFNwZWVkCisvLyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoQU5ERGF0YSAoVmlkZW9FbmdpbmVJbmZvLT5WR0FQQ0lJbmZvLnVsTU1JT0Jhc2VBZGRyZXNzLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDA0LCAwLCAweDMzMzE3ODA1KTsKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MDgsIDApOworLy8gIENsZWFyIEludGVycnVwdAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxMCwgMHhGRkZGRkZGRik7CisvLyAgRW5hYmxlIE1hc3RlciBNb2RlCisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDAwLCAxKTsKKy8vICBFbmFibGUgSW50ZXJydXB0CisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDBDLCAweEFGKTsKKy8vICBCWVRFIEkyQyBNb2RlCisvLyAgU3RhcnQgYW5kIFNlbmQgRGV2aWNlIEFkZHJlc3MKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MjAsIERldmljZUFkZHJlc3MpOworICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxNCwgMHgzKTsKKy8vICBXYWl0IFR4IEFDSworICAgIGRvIHsKKyAgICAgICAgQ291bnQrKzsKKyAgICAgICAgU3RhdHVzID0gUmVhZE1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTApICYgMHgwMzsKKworCQlpZiAoMiA9PSBTdGF0dXMpCisJCXsKKwkJCS8vQ2xlYXIgSW50ZXJydXB0CisJCQlXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTAsIDB4RkZGRkZGRkYpOworCQkJLy9SZS1TZW5kIFN0YXJ0IGFuZCBTZW5kIERldmljZSBBZGRyZXNzIHdoaWxlIE5BQ0sgcmV0dXJuCisJCQlXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MjAsIERldmljZUFkZHJlc3MpOworCQkJV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDE0LCAweDMpOworCQl9CisJCS8vZWxzZQorCQl7CisJCQlpZiAoQ291bnQgPiBMT09QX0NPVU5UKSB7CisJCQkJcmV0dXJuIENBTl9OT1RfRklORF9ERVZJQ0U7CisJCQl9CisJCX0KKyAgICB9IHdoaWxlIChTdGF0dXMgIT0gMSk7CisgICAgQ291bnQgPSAwOworLy8gIENsZWFyIEludGVycnVwdAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxMCwgMHhGRkZGRkZGRik7CisvLyAgU2VuZCBEZXZpY2UgUmVnaXN0ZXIgSW5kZXgKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MjAsIFJlZ2lzdGVySW5kZXgpOworICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxNCwgMHgyKTsKKy8vICBXYWl0IFR4IEFDSworICAgIGRvIHsKKyAgICAgICAgQ291bnQrKzsKKyAgICAgICAgU3RhdHVzID0gUmVhZE1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTApICYgMHgwMzsKKyAgICAgICAgaWYgKENvdW50ID4gTE9PUF9DT1VOVCkgeworICAgICAgICAgICAgcmV0dXJuIENBTl9OT1RfRklORF9ERVZJQ0U7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChTdGF0dXMgIT0gMSk7CisgICAgQ291bnQgPSAwOworLy8gIENsZWFyIEludGVycnVwdAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxMCwgMHhGRkZGRkZGRik7CisvLyAgU2VuZCBEZXZpY2UgUmVnaXN0ZXIgVmFsdWUgYW5kIFN0b3AKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MjAsIFJlZ2lzdGVyVmFsdWUpOworICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxNCwgMHgyKTsKKy8vICBXYWl0IFR4IEFDSworICAgIGRvIHsKKyAgICAgICAgQ291bnQrKzsKKyAgICAgICAgU3RhdHVzID0gUmVhZE1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTApICYgMHgwMzsKKyAgICAgICAgaWYgKENvdW50ID4gTE9PUF9DT1VOVCkgeworICAgICAgICAgICAgcmV0dXJuIENBTl9OT1RfRklORF9ERVZJQ0U7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChTdGF0dXMgIT0gMSk7CisgICAgQ291bnQgPSAwOworLy8gIENsZWFyIEludGVycnVwdAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxMCwgMHhGRkZGRkZGRik7CisvLyAgRW5hYmxlIFNUT1AgSW50ZXJydXB0CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MEMsIDB4MTAsIDB4MTApOworLy8gIElzc3VlIFNUT1AgQ29tbWFuZAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxNCwgMHgyMCk7CisvLyAgV2FpdCBTVE9QCisgICAgZG8geworICAgICAgICBDb3VudCsrOworICAgICAgICBTdGF0dXMgPSAoUmVhZE1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTApICYgMHgxMCkgPj4gNDsKKyAgICAgICAgaWYgKENvdW50ID4gTE9PUF9DT1VOVCkgeworICAgICAgICAgICAgcmV0dXJuIENBTl9OT1RfRklORF9ERVZJQ0U7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChTdGF0dXMgIT0gMSk7CisvLyAgRGlzYWJsZSBTVE9QIEludGVycnVwdAorICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDBDLCAwLCAweDEwKTsKKy8vICBDbGVhciBJbnRlcnJ1cHQKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTAsIDB4RkZGRkZGRkYpOworCisgICAgcmV0dXJuIFNFVF9JMkNfRE9ORTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL2FzcGVlZC9hc3QyMzAwL3ZmdW4uaCBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL3ZmdW4uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MGY5ZWM0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvdmZ1bi5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2lmbmRlZiBfVkZVTl9IXworI2RlZmluZSBfVkZVTl9IXworCisvLyNkZWZpbmUgdkJ1ZkFsaWduKHgpCQkgICAgKCh4ICsgMHgwMDAwMDA3RikgJiAweEZGRkZGRjgwKSAvLzEyOCBieXRlIGFsaWdubWVudAorI2RlZmluZSB2QnVmQWxpZ24oeCkJCSAgICAoKHggKyAweDAwMDAwM0ZGKSAmIDB4RkZGRkZDMDApIC8vMTI4IGJ5dGUgYWxpZ25tZW50CisjZGVmaW5lIHZCdWZBbGlnbjIoeCkJCSAgICAoKHggKyAweDAwMDBGRkZGKSAmIDB4RkZGRjAwMDApIC8vMTI4IGJ5dGUgYWxpZ25tZW50CisjZGVmaW5lIHYxNmJ5dGVBbGlnbih4KQkJICAgICgoeCArIDB4MDAwMDAwMEYpICYgMHhGRkZGRkZGMCkKKyNkZWZpbmUgdkJ1Zl9BTElHTk1FTlQJCQkxMjgKKworI2RlZmluZSBIT1NUX1RPVEFMX1NJWkUgICAgICAgICAweDgwMDAwMDAgICAvKiAxMjhNICovCisjZGVmaW5lIFNUQVRJT05fVE9UQUxfU0laRSAgICAgIDB4RjgwMDAwMCAgIC8qIDEyME0gKi8KKworI2RlZmluZSBWSURFT19TT1VSQ0VfU0laRSAgICAgICAweDIwMDAwMCAgICAvKiA4MDBYNjAwWDQgPSAweDFENEMwMCAqLworI2RlZmluZSBWSURFT19NQVhfU1RSRUFNX1NJWkUgICAweDQwMDAwMCAgICAvKiAzMlgxMjhLID0gMHg0MDAwMDAgKi8KKyNkZWZpbmUgVklERU9fRkxBR19TSVpFICAgICAgICAgMHg1MDAwICAgICAgLyogMTkyMFgxMjAwLzEyOCA9IDB4NDY1MCovIAorI2RlZmluZSBWSURFT19DUkNfU0laRSAgICAgICAgICAweDUwMDAwICAgICAvKiAxOTIwLzY0WDEyMDBYOCA9IDB4NDY1MDAqLworCisjZGVmaW5lIFZJREVPMV9FTl9UT1RBTF9TSVpFICAgIChWSURFT19TT1VSQ0VfU0laRSoyK1ZJREVPX01BWF9TVFJFQU1fU0laRStWSURFT19GTEFHX1NJWkUrVklERU9fQ1JDX1NJWkUpIC8qIDB4MTY1NTAwMCA9ICBhYm91dCAyM00qLworI2RlZmluZSBWSURFTzJfRU5fVE9UQUxfU0laRSAgICBWSURFTzFfRU5fVE9UQUxfU0laRQorLy8jZGVmaW5lIFZJREVPTV9FTl9UT1RBTF9TSVpFICAgIChWSURFT19TT1VSQ0VfU0laRSoyK1ZJREVPX01BWF9TVFJFQU1fU0laRStWSURFT19GTEFHX1NJWkUpIC8qIDB4MTYwNTAwMCA9IGFib3V0IDIyLjdNICovCisvLyNkZWZpbmUgVklERU9fSE9TVF9TSVpFICAgICAgICAgKFZJREVPMV9FTl9UT1RBTF9TSVpFICsgVklERU8yX0VOX1RPVEFMX1NJWkUgKyBWSURFT01fRU5fVE9UQUxfU0laRSkgLyogMHg2OTkyMjgxNiA9IGFib3V0IDcwTSAqLworI2RlZmluZSBWSURFT19IT1NUX1NJWkUgICAgICAgICAoVklERU8xX0VOX1RPVEFMX1NJWkUgKyBWSURFTzJfRU5fVE9UQUxfU0laRSkgLyogTk9UIE5FRUQgVklERU9NICovCisKKyNkZWZpbmUgVklERU8xX0VOX0JBU0UgICAgICAgICAgMHgxMDAwMDAKKyNkZWZpbmUgVklERU8yX0VOX0JBU0UgICAgICAgICAgKFZJREVPMV9FTl9CQVNFICsgVklERU8xX0VOX1RPVEFMX1NJWkUpCisjZGVmaW5lIFZJREVPTV9FTl9CQVNFICAgICAgICAgIChWSURFTzJfRU5fQkFTRSArIFZJREVPMl9FTl9UT1RBTF9TSVpFKQorCisjZGVmaW5lIFZJREVPMV9ERV9UT1RBTF9TSVpFICAgIChWSURFT19NQVhfU1RSRUFNX1NJWkUgKyBWSURFT19TT1VSQ0VfU0laRSkgLyogMHhEMDAwMDAgPSAxM00qLworI2RlZmluZSBWSURFTzJfREVfVE9UQUxfU0laRSAgICAoVklERU8xX0RFX1RPVEFMX1NJWkUpCisjZGVmaW5lIFZJREVPX1NUQVRJT05fU0laRSAgICAgIChWSURFTzFfREVfVE9UQUxfU0laRSArIFZJREVPMl9ERV9UT1RBTF9TSVpFKSAvKiAyNk0gKi8KKworI2RlZmluZSBWSURFTzFfREVfQkFTRSAgICAgICAgICBWSURFT19IT1NUX1NJWkUKKyNkZWZpbmUgVklERU8yX0RFX0JBU0UgICAgICAgICAgKFZJREVPMV9ERV9CQVNFICsgVklERU8xX0RFX1RPVEFMX1NJWkUpCisjZGVmaW5lIFZJREVPX0FMTF9TSVpFICAgICAgICAgIChWSURFT19IT1NUX1NJWkUgKyBWSURFT19TVEFUSU9OX1NJWkUpIC8vSG9zdCBhbmQgU3RhdGlvbgorCisjZGVmaW5lIE91dGR3bUJhbmtNb2RlSG9zdChvZmZzZXQsZGF0YSkgICAgICAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KERSQU1fQkFTRSxvZmZzZXQsZGF0YSkKKyNkZWZpbmUgSW5kd21CYW5rTW9kZUhvc3Qob2Zmc2V0KSAgICAgICAgICAgICAgIFJlYWRNZW1vcnlMb25nSG9zdChEUkFNX0JBU0Usb2Zmc2V0KSAgICAgIAorCitVTE9ORyBVbmxvY2tWaWRlb1JlZ0hvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgS2V5KTsKK0JPT0wgQ2hlY2tPblN0YXJ0SG9zdCh2b2lkKTsKK0JPT0wgQ2hlY2tPblN0YXJ0Q2xpZW50KHZvaWQpOwordm9pZCBTdGFydFZpZGVvQ2FwdHVyZVRyaWdnZXJIb3N0KFVMT05HICAgTU1JT0Jhc2UsIFVMT05HIG9mZnNldCk7Cit2b2lkIFN0YXJ0VmlkZW9DYXB0dXJlVHJpZ2dlckhvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgb2Zmc2V0KTsKK3ZvaWQgU3RhcnRWaWRlb0NvZGVjVHJpZ2dlckhvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgb2Zmc2V0KTsKK1VMT05HIFVubG9ja1NDVVJlZ0hvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgS2V5KTsKK1VMT05HIFVubG9ja1NDVVJlZ0hvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgS2V5KTsKK3ZvaWQgU3RhcnRNb2RlRGV0ZWN0aW9uVHJpZ2dlckhvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgb2Zmc2V0KTsKK3ZvaWQgQ2xlYXJWaWRlb0ludGVycnVwdEhvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgdmFsdWUpOworQk9PTCBSZWFkVmlkZW9JbnRlcnJ1cHRIb3N0KFVMT05HICAgTU1JT0Jhc2UsIFVMT05HIHZhbHVlKTsKK3ZvaWQgU3RvcE1vZGVEZXRlY3Rpb25UcmlnZ2VySG9zdChVTE9ORyAgIE1NSU9CYXNlLCBVTE9ORyBvZmZzZXQpOwordm9pZCBSZXNldFZpZGVvSG9zdCh2b2lkKTsKK1VMT05HICBJbml0aWFsaXplVmlkZW9FbmdpbmVIb3N0IChVTE9ORyAgICAgICAgICAgICAgICBNTUlPQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBuVmlkZW8sCisJCQkJCQkJICAgQk9PTAkJCQkJSG9yUG9sYXJpdHksCisJCQkJICBCT09MCQkJCQlWZXJQb2xhcml0eSk7CitVTE9ORyAgSW5pdGlhbGl6ZVZpZGVvRW5naW5lQ2xpZW50IChVTE9ORyAgICAgICAgICAgICAgICBNTUlPQmFzZSwKKwkJCQkgICAgaW50ICAgICAgICAgICAgICAgICAgblZpZGVvKTsKK0JZVEUgIEdldEkyQ1JlZ0NsaWVudChVTE9ORyAgTU1JT0Jhc2UsIAorCQkJCSBCWVRFIERldmljZVNlbGVjdCwgCisJCQkJIEJZVEUgRGV2aWNlQWRkcmVzcywgCisJCQkJIEJZVEUgUmVnaXN0ZXJJbmRleCk7CisKK1VMT05HICBTZXRJMkNSZWdDbGllbnQoVUxPTkcgIE1NSU9CYXNlLCAKKyAgICAgICAgICAgICAgICAgQllURSAgIERldmljZVNlbGVjdCwgCisgICAgICAgICAgICAgICAgIEJZVEUgICBEZXZpY2VBZGRyZXNzLCAKKyAgICAgICAgICAgICAgICAgQllURSAgIFJlZ2lzdGVySW5kZXgsIAorCQkJCSBCWVRFICAgUmVnaXN0ZXJWYWx1ZSk7CisjZW5kaWYgLy9fVkZVTl9IXworCmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjMwMC92Z2Fody5oIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvdmdhaHcuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43Y2JiYTBkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvdmdhaHcuaApAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNb2RlIFN0dWZmCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVmYXVsdCBTZXR0aW5ncyAqLworI2RlZmluZSBDUlRfTE9XX1RIUkVTSE9MRF9WQUxVRSAgICAgICAgIDB4MTIKKyNkZWZpbmUgQ1JUX0hJR0hfVEhSRVNIT0xEX1ZBTFVFICAgICAgICAweDFFCisKKy8qIE91dHB1dCBTZWxlY3Rpb24gKi8KKyNkZWZpbmUgQ1JUMQkJCQkweDAwCisjZGVmaW5lIENSVDIJCQkJMHgwMQorI2RlZmluZSBEVkkxCQkJCTB4MTAKKyNkZWZpbmUgRFZJMgkJCQkweDExCisjZGVmaW5lIExWRFMxCQkJCTB4MjAKKyNkZWZpbmUgTFZEUzIJCQkJMHgyMQorCisvKiBNb2RlIExpbWl0YXRpb24gKi8KKyNkZWZpbmUgTUFYX0hSZXNvbHV0aW9uCQkxNjAwCisjZGVmaW5lIE1BWF9WUmVzb2x1dGlvbgkJMTIwMAorIAorLyogU3RkLiBUYWJsZSBJbmRleCBEZWZpbml0aW9uICovCisjZGVmaW5lIFRleHRNb2RlSW5kZXggCQkwCisjZGVmaW5lIEVHQU1vZGVJbmRleCAJCTEKKyNkZWZpbmUgVkdBTW9kZUluZGV4IAkJMgorI2RlZmluZSBIaUNNb2RlSW5kZXggCQkzCisjZGVmaW5lIFRydWVDTW9kZUluZGV4IAkJNAorCisvKiBEQ0xLIEluZGV4ICovCisjZGVmaW5lIFZDTEsyNV8xNzUgICAgIAkJMHgwMAorI2RlZmluZSBWQ0xLMjhfMzIyICAgICAJCTB4MDEKKyNkZWZpbmUgVkNMSzMxXzUgICAgICAgCQkweDAyCisjZGVmaW5lIFZDTEszNiAgICAgICAgIAkJMHgwMworI2RlZmluZSBWQ0xLNDAgICAgICAgICAJCTB4MDQKKyNkZWZpbmUgVkNMSzQ5XzUgICAgICAgCQkweDA1CisjZGVmaW5lIFZDTEs1MCAgICAgICAgIAkJMHgwNgorI2RlZmluZSBWQ0xLNTZfMjUgICAgICAJCTB4MDcKKyNkZWZpbmUgVkNMSzY1CQkgCTB4MDgKKyNkZWZpbmUgVkNMSzc1CSAgICAgICAgCTB4MDkKKyNkZWZpbmUgVkNMSzc4Xzc1ICAgICAgCQkweDBBCisjZGVmaW5lIFZDTEs5NF81ICAgICAgIAkJMHgwQgorI2RlZmluZSBWQ0xLMTA4ICAgICAgICAJCTB4MEMKKyNkZWZpbmUgVkNMSzEzNSAgICAgICAgCQkweDBECisjZGVmaW5lIFZDTEsxNTdfNSAgICAgIAkJMHgwRQorI2RlZmluZSBWQ0xLMTYyICAgICAgICAJCTB4MEYKKyNkZWZpbmUgVkNMSzExOSAgICAgICAgCQkweDEwCisKKy8qIEZsYWdzIERlZmluaXRpb24gKi8KKyNkZWZpbmUgQ2hhcng4RG90ICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBIYWxmRENMSyAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIERvdWJsZVNjYW5Nb2RlICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgTGluZUNvbXBhcmVPZmYgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBTeW5jUFAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFN5bmNQTiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgU3luY05QICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBTeW5jTk4gICAgICAgICAgICAgICAgICAweDAwMDAwMEMwCisjZGVmaW5lIEhCb3JkZXIgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgVkJvcmRlciAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBDT0xPUklOREVYCQkweDAwMDAwMDAwCisjZGVmaW5lIE1PTk9JTkRFWAkJMHgwMDAwMDEwMAorCisvKiBEQUMgRGVmaW5pdGlvbiAqLworI2RlZmluZSBEQUNfTlVNX1RFWFQJCTY0CisjZGVmaW5lIERBQ19OVU1fRUdBCQk2NAorI2RlZmluZSBEQUNfTlVNX1ZHQQkJMjU2CisKKy8qIEFTVDMwMDAgUmVnLiBEZWZpbml0aW9uICovCisjZGVmaW5lCUFTVDMwMDBfVkdBUkVHX0JBU0UJMHgxZTZlNjAwMAorI2RlZmluZSBBU1QzMDAwX1ZHQTFfQ1RMUkVHCTB4MDAKKyNkZWZpbmUgQVNUMzAwMF9WR0ExX0NUTFJFRzIJMHgwNAorI2RlZmluZSBBU1QzMDAwX1ZHQTFfU1RBVFVTUkVHCTB4MDggCisjZGVmaW5lIEFTVDMwMDBfVkdBMV9QTEwJMHgwQworI2RlZmluZSBBU1QzMDAwX1ZHQTFfSFRSRUcJMHgxMAorI2RlZmluZSBBU1QzMDAwX1ZHQTFfSFJSRUcJMHgxNAorI2RlZmluZSBBU1QzMDAwX1ZHQTFfVlRSRUcJMHgxOAorI2RlZmluZSBBU1QzMDAwX1ZHQTFfVlJSRUcJMHgxQworI2RlZmluZSBBU1QzMDAwX1ZHQTFfU1RBUlRBRERSCTB4MjAKKyNkZWZpbmUgQVNUMzAwMF9WR0ExX09GRlNFVFJFRwkweDI0CisjZGVmaW5lIEFTVDMwMDBfVkdBMV9USFJFU0hPTEQJMHgyOAorI2RlZmluZSBBU1QzMDAwX0hXQzFfT0ZGU0VUICAgICAweDMwCisjZGVmaW5lIEFTVDMwMDBfSFdDMV9YWQkJMHgzNAorI2RlZmluZSBBU1QzMDAwX0hXQzFfUEJhc2UgICAgICAweDM4CisjZGVmaW5lIEFTVDMwMDBfT1NEMV9IICAgICAgICAgIDB4NDAKKyNkZWZpbmUgQVNUMzAwMF9PU0QxX1YgICAgICAgICAgMHg0NAorI2RlZmluZSBBU1QzMDAwX09TRDFfUEJhc2UgICAgICAweDQ4CisjZGVmaW5lIEFTVDMwMDBfT1NEMV9PZmZzZXQgICAgIDB4NEMKKyNkZWZpbmUgQVNUMzAwMF9PU0QxX1RIUkVTSE9MRCAgMHg1MAorCisjZGVmaW5lIEFTVDMwMDBfVkdBMl9DVExSRUcJMHg2MAorI2RlZmluZSBBU1QzMDAwX1ZHQTJfQ1RMUkVHMgkweDY0CisjZGVmaW5lIEFTVDMwMDBfVkdBMl9TVEFUVVNSRUcJMHg2OCAKKyNkZWZpbmUgQVNUMzAwMF9WR0EyX1BMTAkweDZDCisjZGVmaW5lIEFTVDMwMDBfVkdBMl9IVFJFRwkweDcwCisjZGVmaW5lIEFTVDMwMDBfVkdBMl9IUlJFRwkweDc0CisjZGVmaW5lIEFTVDMwMDBfVkdBMl9WVFJFRwkweDc4CisjZGVmaW5lIEFTVDMwMDBfVkdBMl9WUlJFRwkweDdDCisjZGVmaW5lIEFTVDMwMDBfVkdBMl9TVEFSVEFERFIJMHg4MAorI2RlZmluZSBBU1QzMDAwX1ZHQTJfT0ZGU0VUUkVHCTB4ODQKKyNkZWZpbmUgQVNUMzAwMF9WR0EyX1RIUkVTSE9MRAkweDg4CisjZGVmaW5lIEFTVDMwMDBfSFdDMl9PRkZTRVQgICAgIDB4OTAKKyNkZWZpbmUgQVNUMzAwMF9IV0MyX1hZCQkweDk0CisjZGVmaW5lIEFTVDMwMDBfSFdDMl9QQmFzZSAgICAgIDB4OTgKKyNkZWZpbmUgQVNUMzAwMF9PU0QyX0ggICAgICAgICAgMHhBMAorI2RlZmluZSBBU1QzMDAwX09TRDJfViAgICAgICAgICAweEE0CisjZGVmaW5lIEFTVDMwMDBfT1NEMl9QQmFzZSAgICAgIDB4QTgKKyNkZWZpbmUgQVNUMzAwMF9PU0QyX09mZnNldCAgICAgMHhBQworI2RlZmluZSBBU1QzMDAwX09TRDJfVEhSRVNIT0xEICAweEIwCisKKy8qIERhdGEgU3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUNIQVIgTW9kZU5hbWVbMjBdOworICAgIFVTSE9SVCB1c01vZGVJbmRleDsKKyAgICBVU0hPUlQgdXNNb2RlSUQ7CisgICAgVVNIT1JUIHVzQ29sb3JJbmRleDsKKyAgICBVU0hPUlQgdXNSZWZyZXNoUmF0ZUluZGV4OworICAgIFVTSE9SVCB1c1dpZHRoOworICAgIFVTSE9SVCB1c0hlaWdodDsKKyAgICBVU0hPUlQgdXNCaXRzUGVyUGxhbmU7CisgICAgVVNIT1JUIHVzUmVmcmVzaFJhdGU7ICAgIAorfSBNb2RlSW5mb1N0cnVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCQorICAgIFVDSEFSIE1JU0M7CQorICAgIFVDSEFSIFNFUVs0XTsKKyAgICBVQ0hBUiBDUlRDWzI1XTsKKyAgICBVQ0hBUiBBUlsyMF07CSAgICAKKyAgICBVQ0hBUiBHUls5XTsKKyAgICAKK30gVkJJT1NfU1REVEFCTEVfU1RSVUNULCAqUFZCSU9TX1NURFRBQkxFX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCQorICAgIFVMT05HIEhUOworICAgIFVMT05HIEhERTsKKyAgICBVTE9ORyBIRlA7CisgICAgVUxPTkcgSFNZTkM7CisgICAgVUxPTkcgVlQ7CisgICAgVUxPTkcgVkRFOworICAgIFVMT05HIFZGUDsKKyAgICBVTE9ORyBWU1lOQzsKKyAgICBVTE9ORyBEQ0xLSW5kZXg7ICAgICAgICAKKyAgICBVTE9ORyBGbGFnczsKKworICAgIFVMT05HIHVsUmVmcmVzaFJhdGU7CisgICAgVUxPTkcgdWxSZWZyZXNoUmF0ZUluZGV4OworICAgIFVMT05HIHVsTW9kZUlEOworICAgICAgICAKK30gVkJJT1NfRU5IVEFCTEVfU1RSVUNULCAqUFZCSU9TX0VOSFRBQkxFX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVDSEFSIFBhcmFtMTsKKyAgICBVQ0hBUiBQYXJhbTI7CisgICAgVUNIQVIgUGFyYW0zOwkKK30gVkJJT1NfRENMS19JTkZPLCAqUFZCSU9TX0RDTEtfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVDSEFSIERBQ1I7CisgICAgVUNIQVIgREFDRzsKKyAgICBVQ0hBUiBEQUNCOwkKK30gVkJJT1NfREFDX0lORk8sICpQVkJJT1NfREFDX0lORk87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQVkJJT1NfU1REVEFCTEVfU1RSVUNUIHBTdGRUYWJsZUVudHJ5OworICAgIFBWQklPU19FTkhUQUJMRV9TVFJVQ1QgcEVuaFRhYmxlRW50cnk7CisgICAgCQorfSBWQklPU19NT0RFX0lORk8sICpQVkJJT1NfTU9ERV9JTkZPOwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDIzMDAvdmhhY2UuYyBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL3ZoYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDA0NWNiZAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL3ZoYWNlLmMKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjZGVmaW5lIEhBU0hfR0xPQkFMUworI2luY2x1ZGUgInR5cGUuaCIKKyNpbmNsdWRlICJ2ZGVmLmgiCisjaW5jbHVkZSAidmhhY2UuaCIKKyNpbmNsdWRlICJ2ZnVuLmgiCisKK3ZvaWQgSGFzaEFzdDMwMDAoVUxPTkcgdWxMZW5ndGgsIFVMT05HICpvdXRwdXQsIFVMT05HIHVsSGFzaE1vZGUpCit7CisJVUxPTkcgaSwgdWxUZW1wLCB1bENvbW1hbmQsIHVsRGlnZXN0TGVuZ3RoOworCVVMT05HIHVsVmFsdWU7CisgICAKKwkvKiBHZXQgSW5mbyAqLworCXN3aXRjaCAodWxIYXNoTW9kZSkKKwl7CisJY2FzZSBWSEFTSE1PREVfTUQ1OgorCQl1bENvbW1hbmQgPSBWSEFTSF9BTEdfU0VMRUNUX01ENTsKKwkJdWxEaWdlc3RMZW5ndGggPSAxNjsKKwkJYnJlYWs7CisJY2FzZSBWSEFTSE1PREVfU0hBMToKKwkJdWxDb21tYW5kID0gVkhBU0hfQUxHX1NFTEVDVF9TSEExOworCQl1bERpZ2VzdExlbmd0aCA9IDIwOworCQlicmVhazsKKwljYXNlIFZIQVNITU9ERV9TSEEyNTY6CisJCXVsQ29tbWFuZCA9IFZIQVNIX0FMR19TRUxFQ1RfU0hBMjU2OworCQl1bERpZ2VzdExlbmd0aCA9IDMyOworCQlicmVhazsKKwljYXNlIFZIQVNITU9ERV9TSEEyMjQ6CisJCXVsQ29tbWFuZCA9IFZIQVNIX0FMR19TRUxFQ1RfU0hBMjI0OworCQl1bERpZ2VzdExlbmd0aCA9IDI4OworCQlicmVhazsgICAgICAgCQorCX0KKyAgIAkKKwkvKiBJbml0LiBIVyAqLworCVdyaXRlTWVtb3J5TG9uZ0hvc3QoVkhBQ19SRUdfQkFTRSwgVlJFR19IQVNIX1NSQ19CQVNFX09GRlNFVCwgZ19IYXNoU3JjQnVmZmVyKTsKKwlXcml0ZU1lbW9yeUxvbmdIb3N0KFZIQUNfUkVHX0JBU0UsIFZSRUdfSEFTSF9EU1RfQkFTRV9PRkZTRVQsIGdfSGFzaERzdEJ1ZmZlcik7CisJV3JpdGVNZW1vcnlMb25nSG9zdChWSEFDX1JFR19CQVNFLCBWUkVHX0hBU0hfTEVOX09GRlNFVCwgdWxMZW5ndGgpOworICAgICAgICAKKyAgICAvKiB3cml0ZSBzcmMgKi8KKwkvL2FscmVhZHkgZmlsbCBpbiBnX1ZJREVPMV9DT01QUkVTU19CVUZfQUREUgorCisgICAgLyogZmlyZSBjbWQgKi8KKwlXcml0ZU1lbW9yeUxvbmdIb3N0KFZIQUNfUkVHX0JBU0UsIFZSRUdfSEFTSF9DTURfT0ZGU0VULCB1bENvbW1hbmQpOworICAgIAorICAgIC8qIGdldCBkaWdlc3QgKi8KKyAgICBkbyB7CisgICAgCXVsVGVtcCA9IFJlYWRNZW1vcnlMb25nSG9zdChWSEFDX1JFR19CQVNFLCBWUkVHX0hBU0hfU1RBVFVTX09GRlNFVCk7CisgICAgfSB3aGlsZSAodWxUZW1wICYgVkhBU0hfQlVTWSk7CQorICAgIAkKKyAgICBmb3IgKGk9MDsgaTx1bERpZ2VzdExlbmd0aC80OyBpKyspCisgICAgeworICAgICAgICAgICAgICAgIHVsVmFsdWUgPSAqKCgoVUxPTkcgKilnX0hhc2hEc3RCdWZmZXIpICsgaSk7IAorCisJCS8vb3V0cHV0IGlzIFVMT05HIHBvaW50ZXIKKwkJKihvdXRwdXQgKyBpKSA9IHVsVmFsdWU7ICAgIAorICAgIH0gICAgICAgIAorfQpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDIzMDAvdmhhY2UuaCBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL3ZoYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDYwOTg5YgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL3ZoYWNlLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaWZuZGVmIF9WSEFDRV9IXworI2RlZmluZSBfVkhBQ0VfSF8KKworI2RlZmluZSBWSEFTSE1PREVfTUQ1CQkJMHgwMAorI2RlZmluZSBWSEFTSE1PREVfU0hBMQkJCTB4MDEKKyNkZWZpbmUgVkhBU0hNT0RFX1NIQTI1NgkJCTB4MDIKKyNkZWZpbmUgVkhBU0hNT0RFX1NIQTIyNAkJCTB4MDMKKworI2RlZmluZSBWSEFTSF9BTEdfU0VMRUNUX01BU0sJCTB4NzAKKyNkZWZpbmUgVkhBU0hfQUxHX1NFTEVDVF9NRDUJCQkweDAwCisjZGVmaW5lIFZIQVNIX0FMR19TRUxFQ1RfU0hBMQkJMHgyMAorI2RlZmluZSBWSEFTSF9BTEdfU0VMRUNUX1NIQTIyNAkJMHg0MAorI2RlZmluZSBWSEFTSF9BTEdfU0VMRUNUX1NIQTI1NgkJMHg1MAorCisjZGVmaW5lIFZIQVNIX0JVU1kJCQkweDAxCisKKyNkZWZpbmUgVkhBQ19SRUdfQkFTRSAJCQkweDFlNmUwMDAwCisjZGVmaW5lCVZIQUNfUkVHX09GRlNFVAkJCTB4MzAwMAorCisjZGVmaW5lIFZSRUdfSEFTSF9TUkNfQkFTRV9PRkZTRVQJKDB4MjArVkhBQ19SRUdfT0ZGU0VUKQorI2RlZmluZSBWUkVHX0hBU0hfRFNUX0JBU0VfT0ZGU0VUCSgweDI0K1ZIQUNfUkVHX09GRlNFVCkKKyNkZWZpbmUgVlJFR19IQVNIX0tFWV9CQVNFX09GRlNFVAkoMHgyOCtWSEFDX1JFR19PRkZTRVQpCisjZGVmaW5lIFZSRUdfSEFTSF9MRU5fT0ZGU0VUCQkJKDB4MkMrVkhBQ19SRUdfT0ZGU0VUKQorI2RlZmluZSBWUkVHX0hBU0hfQ01EX09GRlNFVAkJCSgweDMwK1ZIQUNfUkVHX09GRlNFVCkKKworI2RlZmluZSBWUkVHX0hBU0hfU1RBVFVTX09GRlNFVAkJKDB4MUMrVkhBQ19SRUdfT0ZGU0VUKQorCit0eXBlZGVmIHN0cnVjdAoreworCWludCBIYXNoTW9kZTsKKwlpbnQgRGlnZXN0TGVuOworfSBIQVNIX01FVEhPRDsKKworCisjaWZkZWYgSEFTSF9HTE9CQUxTCisjZGVmaW5lIEhBU0hfRVhUCisjZWxzZQorI2RlZmluZSBIQVNIX0VYVCBleHRlcm4KKyNlbmRpZgorCitIQVNIX0VYVCBIQVNIX01FVEhPRAlnX0hhc2hNZXRob2Q7CitIQVNIX0VYVCBCWVRFCQkJZ19EaWdlc3RCdWZbMzJdOworSEFTSF9FWFQgVUxPTkcJCQlnX0hhc2hTcmNCdWZmZXI7CitIQVNIX0VYVCBVTE9ORwkJCWdfSGFzaERzdEJ1ZmZlcjsKKwordm9pZCBIYXNoQXN0MzAwMChVTE9ORyB1bExlbmd0aCwgVUxPTkcgKm91dHB1dCwgVUxPTkcgdWxIYXNoTW9kZSk7CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDIzMDAvdmlkZW90ZXN0LmMgYi9ib2FyZC9hc3BlZWQvYXN0MjMwMC92aWRlb3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMmU0OTUzCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvdmlkZW90ZXN0LmMKQEAgLTAsMCArMSw3NzkgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIERpYWdub3N0aWNzIHN1cHBvcnQKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxwb3N0Lmg+CisKKyNpbmNsdWRlICJzbHQuaCIKKyNkZWZpbmUgV0lOX0dMT0JBTFMKKyNpbmNsdWRlICJ0eXBlLmgiCisjaW5jbHVkZSAidnJlZy5oIgorI2RlZmluZSBWRVNBX0dMT0JBTFMKKyNpbmNsdWRlICJ2ZXNhLmgiCisjaW5jbHVkZSAidmZ1bi5oIgorI2luY2x1ZGUgInZkZWYuaCIKKyNpbmNsdWRlICJ2aGFjZS5oIgorI2luY2x1ZGUgImNydC5oIgorI2luY2x1ZGUgInZpZGVvdGVzdC5oIgorCisjZGVmaW5lIFZIQVNIX0FMSUdOTUVOVAkJCTE2CisjZGVmaW5lIFZIQVNIX01BWF9EU1QJCQkoMzIrVkhBU0hfQUxJR05NRU5UKQorCisKKyNpZiAoKENGR19DTURfU0xUICYgQ0ZHX0NNRF9WSURFT1RFU1QpICYmIGRlZmluZWQoQ09ORklHX1NMVCkpCisjaW5jbHVkZSAidmlkZW90ZXN0LmgiCisKKyNkZWZpbmUgUkFORF9NQVggMzI3NjcgLy8yXjE2LTEKKworVUxPTkcgcmFuZFNlZWQgPSAxOworCit2b2lkIHNyYW5kKFVMT05HIHNlZWQpCit7CisgIHJhbmRTZWVkID0gc2VlZDsKK30KKworaW50IHJhbmQodm9pZCkKK3sKKyAgcmFuZFNlZWQgPSByYW5kU2VlZCAqIDIxNDAxMyArIDI1MzEwMTE7CisgIHJldHVybiAoaW50KShyYW5kU2VlZCA+PiAxNyk7IC8vMzIgLTE1ID0gMTcKK30KKworLy9zdGF0aWMgdW5zaWduZWQgY2hhciBDYXB0dXJlVmlkZW8xQnVmMUFkZHJbVklERU9fU09VUkNFX1NJWkVdLCBDYXB0dXJlVmlkZW8xQnVmMkFkZHJbVklERU9fU09VUkNFX1NJWkVdLCBWaWRlbzFDb21wcmVzc0J1ZkFkZHJbQ1JZUFRPX01BWF9DT05URVhUXTsKK1VMT05HIHBDYXB0dXJlVmlkZW8xQnVmMUFkZHJbVklERU9fU09VUkNFX1NJWkUvNF0sIHBDYXB0dXJlVmlkZW8xQnVmMkFkZHJbVklERU9fU09VUkNFX1NJWkUvNF0sIHBWaWRlbzFDb21wcmVzc0J1ZkFkZHJbVklERU9fTUFYX1NUUkVBTV9TSVpFLzRdLCBwVmlkZW8xRmxhZ0J1ZkFkZHJbVklERU9fRkxBR19TSVpFXTsKK1VMT05HIHBDYXB0dXJlVmlkZW8yQnVmMUFkZHJbVklERU9fU09VUkNFX1NJWkUvNF0sIHBDYXB0dXJlVmlkZW8yQnVmMkFkZHJbVklERU9fU09VUkNFX1NJWkUvNF0sIHBWaWRlbzJDb21wcmVzc0J1ZkFkZHJbVklERU9fTUFYX1NUUkVBTV9TSVpFLzRdLCBwVmlkZW8yRmxhZ0J1ZkFkZHJbVklERU9fRkxBR19TSVpFXTsKKworVUxPTkcgcFZIYXNoRHN0QnVmZmVyW1ZIQVNIX01BWF9EU1QvNF07CisKK1VMT05HIHBWaWRlbzFEZWNBZGRyW1ZJREVPX1NPVVJDRV9TSVpFLzRdOworVUxPTkcgcENydDFBZGRyW1ZJREVPX1NPVVJDRV9TSVpFLzRdOworLy9VTE9ORyBwQ2FwMUFkZHJbVklERU9fU09VUkNFX1NJWkUvNF07CisKK0JPT0wgQWxsb2NhdGVFbmNvZGVCdWZIb3N0KFVMT05HIE1NSU9CYXNlLCBpbnQgblZpZGVvKQoreworICAgIC8vVUxPTkcgICAgIEFkZHI7CisgICAgLy9VTE9ORyAgICAgZHdSZWdPZmZzZXQgPSBuVmlkZW8gKiAweDEwMDsKKworICAgIGlmIChWSURFTzEgPT0gblZpZGVvKQorICAgIHsKKyAgICAgICAgCisgICAgICAgIC8vQWRkciA9IChVTE9ORyltYWxsb2MocFZpZGVvSW5mby0+U3JjV2lkdGggKiBwVmlkZW9JbmZvLT5TcmNIZWlnaHQgKiA0KTsKKyAgICAgICAgLy9wQ2FwdHVyZVZpZGVvMUJ1ZjFBZGRyID0gbWFsbG9jKFZJREVPX1NPVVJDRV9TSVpFKTsKKworICAgICAgICBnX0NBUFRVUkVfVklERU8xX0JVRjFfQUREUiA9IHZCdWZBbGlnbigoVUxPTkcpcENhcHR1cmVWaWRlbzFCdWYxQWRkcik7CisgICAgICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0JVRl8xX0FERFJfUkVHLCBnX0NBUFRVUkVfVklERU8xX0JVRjFfQUREUiwgQlVGXzFfQUREUl9NQVNLKTsKKyAgICAgICAgCisgICAgICAgIC8vQWRkciA9IChVTE9ORyltYWxsb2MocFZpZGVvSW5mby0+U3JjV2lkdGggKiBwVmlkZW9JbmZvLT5TcmNIZWlnaHQgKiA0KTsKKyAgICAgICAgLy9wQ2FwdHVyZVZpZGVvMUJ1ZjJBZGRyID0gbWFsbG9jKFZJREVPX1NPVVJDRV9TSVpFKTsKKworICAgICAgICBnX0NBUFRVUkVfVklERU8xX0JVRjJfQUREUiA9IHZCdWZBbGlnbigoVUxPTkcpcENhcHR1cmVWaWRlbzFCdWYyQWRkcik7CisgICAgICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0JVRl8yX0FERFJfUkVHLCBnX0NBUFRVUkVfVklERU8xX0JVRjJfQUREUiwgQlVGXzJfQUREUl9NQVNLKTsKKyAgICAgICAgCisgICAgICAgIC8vQWRkciA9IChVTE9ORyltYWxsb2MocFZpZGVvSW5mby0+dVN0cmVhbUJ1ZlNpemUuU3RyZWFtQnVmU2l6ZS5SaW5nQnVmTnVtICogcFZpZGVvSW5mby0+dVN0cmVhbUJ1ZlNpemUuU3RyZWFtQnVmU2l6ZS5QYWNrZXRTaXplKQorICAgICAgICAvL3BWaWRlbzFDb21wcmVzc0J1ZkFkZHIgPSBtYWxsb2MoVklERU9fTUFYX1NUUkVBTV9TSVpFKTsKKyAgICAgICAgZ19WSURFTzFfQ09NUFJFU1NfQlVGX0FERFIgPSB2QnVmQWxpZ24oKFVMT05HKXBWaWRlbzFDb21wcmVzc0J1ZkFkZHIpOworICAgICAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9DT01QUkVTU19CVUZfQUREUl9SRUcsIGdfVklERU8xX0NPTVBSRVNTX0JVRl9BRERSLCBCVUZfMl9BRERSX01BU0spOworICAgICAgICAKKyAgICAgICAgLy9BZGRyID0gKFVMT05HKW1hbGxvYygocFZpZGVvSW5mby0+U3JjSGVpZ2gvNjQpICogcFZpZGVvSW5mby0+U3JjV2lkdGggKiA4KTsKKyAgICAgICAgLy9nX1ZJREVPMV9DUkNfQlVGX0FERFIgPSB2QnVmQWxpZ24oKFVMT05HKW1hbGxvYyhWSURFT19NQVhfU1RSRUFNX1NJWkUpKTsKKyAgICAgICAgLy9Xcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9DUkNfQlVGX0FERFJfUkVHLCBnX1ZJREVPMV9DUkNfQlVGX0FERFIsIEJVRl8yX0FERFJfTUFTSyk7CisgICAgICAgIAorCisgICAgICAgIC8vQWRkciA9IChVTE9ORyltYWxsb2MocFZpZGVvSW5mby0+U3JjSGVpZ2ggKiBwVmlkZW9JbmZvLT5TcmNXaWR0aCAgLyAxMjggKC82NCo0LzgpKTsKKyAgICAgICAgLy9wVmlkZW8xRmxhZ0J1ZkFkZHIgPSBtYWxsb2MoVklERU9fRkxBR19TSVpFKTsKKyAgICAgICAgZ19WSURFTzFfRkxBR19CVUZfQUREUiA9IHZCdWZBbGlnbigoVUxPTkcpcFZpZGVvMUZsYWdCdWZBZGRyKTsKKyAgICAgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfRkxBR19CVUZfQUREUl9SRUcsIGdfVklERU8xX0ZMQUdfQlVGX0FERFIsIEJVRl8yX0FERFJfTUFTSyk7CisgICAgfQorICAgIGVsc2UgaWYgKFZJREVPMiA9PSBuVmlkZW8pCisgICAgeworICAgICAgICAvL0FkZHIgPSAoVUxPTkcpbWFsbG9jKHBWaWRlb0luZm8tPlNyY1dpZHRoICogcFZpZGVvSW5mby0+U3JjSGVpZ2h0ICogNCk7CisgICAgICAgIC8vcENhcHR1cmVWaWRlbzJCdWYxQWRkciA9IG1hbGxvYyhWSURFT19TT1VSQ0VfU0laRSk7CisgICAgICAgIGdfQ0FQVFVSRV9WSURFTzJfQlVGMV9BRERSID0gdkJ1ZkFsaWduKChVTE9ORylwQ2FwdHVyZVZpZGVvMkJ1ZjFBZGRyKTsKKyAgICAgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzJfQlVGXzFfQUREUl9SRUcsIGdfQ0FQVFVSRV9WSURFTzJfQlVGMV9BRERSLCBCVUZfMV9BRERSX01BU0spOworICAgICAgICAKKyAgICAgICAgLy9BZGRyID0gKFVMT05HKW1hbGxvYyhwVmlkZW9JbmZvLT5TcmNXaWR0aCAqIHBWaWRlb0luZm8tPlNyY0hlaWdodCAqIDQpOworICAgICAgICAvL3BDYXB0dXJlVmlkZW8yQnVmMkFkZHIgPSBtYWxsb2MoVklERU9fU09VUkNFX1NJWkUpOworICAgICAgICBnX0NBUFRVUkVfVklERU8yX0JVRjJfQUREUiA9IHZCdWZBbGlnbigoVUxPTkcpcENhcHR1cmVWaWRlbzJCdWYyQWRkcik7CisgICAgICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8yX0JVRl8yX0FERFJfUkVHLCBnX0NBUFRVUkVfVklERU8yX0JVRjJfQUREUiwgQlVGXzJfQUREUl9NQVNLKTsKKyAgICAgICAgCisgICAgICAgIC8vQWRkciA9IChVTE9ORyltYWxsb2MocFZpZGVvSW5mby0+dVN0cmVhbUJ1ZlNpemUuU3RyZWFtQnVmU2l6ZS5SaW5nQnVmTnVtICogcFZpZGVvSW5mby0+dVN0cmVhbUJ1ZlNpemUuU3RyZWFtQnVmU2l6ZS5QYWNrZXRTaXplKQorICAgICAgICAvL3BWaWRlbzJDb21wcmVzc0J1ZkFkZHIgPSBtYWxsb2MoVklERU9fTUFYX1NUUkVBTV9TSVpFKTsKKyAgICAgICAgZ19WSURFTzJfQ09NUFJFU1NfQlVGX0FERFIgPSB2QnVmQWxpZ24oKFVMT05HKXBWaWRlbzJDb21wcmVzc0J1ZkFkZHIpOworICAgICAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMl9DT01QUkVTU19CVUZfQUREUl9SRUcsIGdfVklERU8yX0NPTVBSRVNTX0JVRl9BRERSLCBCVUZfMl9BRERSX01BU0spOworICAgICAgICAKKyAgICAgICAgLy9BZGRyID0gKFVMT05HKW1hbGxvYygocFZpZGVvSW5mby0+U3JjSGVpZ2gvNjQpICogcFZpZGVvSW5mby0+U3JjV2lkdGggKiA4KTsKKyAgICAgICAgLy9nX1ZJREVPMV9DUkNfQlVGX0FERFIgPSB2QnVmQWxpZ24oKFVMT05HKW1hbGxvYyhWSURFT19NQVhfU1RSRUFNX1NJWkUpKTsKKyAgICAgICAgLy9Xcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9DUkNfQlVGX0FERFJfUkVHLCBnX1ZJREVPMV9DUkNfQlVGX0FERFIsIEJVRl8yX0FERFJfTUFTSyk7CisgICAgICAgIAorCisgICAgICAgIC8vQWRkciA9IChVTE9ORyltYWxsb2MocFZpZGVvSW5mby0+U3JjSGVpZ2ggKiBwVmlkZW9JbmZvLT5TcmNXaWR0aCAgLyAxMjggKC82NCo0LzgpKTsKKyAgICAgICAgLy9wVmlkZW8yRmxhZ0J1ZkFkZHIgPSBtYWxsb2MoVklERU9fRkxBR19TSVpFKTsKKyAgICAgICAgZ19WSURFTzJfRkxBR19CVUZfQUREUiA9IHZCdWZBbGlnbigoVUxPTkcpcFZpZGVvMkZsYWdCdWZBZGRyKTsKKyAgICAgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzJfRkxBR19CVUZfQUREUl9SRUcsIGdfVklERU8yX0ZMQUdfQlVGX0FERFIsIEJVRl8yX0FERFJfTUFTSyk7CisgICAgfQorICAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogMS4gcHJvZHVjdCByYW5kb20gZGF0YSB0byBlbmNvZGUgICAgICAgICAgICAgICAgICAgICAqLworLyogMi4gdXNlIGhhc2ggdG8gdmVyaWZ5IGVuY29kZSBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLworLyogMy4gdXNlIGVuY29kZSBzdHJlYW0gdG8gZGVjb21wcmVzcyBvcmlnaW5hbCBkYXRhICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IENvZGVjVGVzdCh2b2lkKQoreworICAgIGludAkgIG51bSwgaT0wLCBqPTA7CisgICAgVUxPTkcgdWxUZW1wID0gMCwgdWxUZW1wMjsKKyAgICBpbnQgICBkd1ZhbHVlOworICAgIFVMT05HIHVsSFdXcDsKKyAgICBVTE9ORyB1bEhXUHQ7CisKKyAgICAvL21heCBzaXplCisgICAgVUxPTkcgdEFycmF5WzMyLzRdOworICAgIAorICAgIC8vbW9kZSBkZXRlY3Rpb24KKyAgICBCT09MCWJFeHRlcm5hbCA9IFRSVUU7CisgICAgQk9PTAliQW5hbG9nID0gVFJVRTsKKyAgICBVTE9ORwlTdGF0dXM7CSAgICAKKworI2lmIGRlZmluZWQoQ09ORklHX0FTVDIzMDApCisgICAgVUxPTkcgdWxIYXNoU2hhMVs1XSAgPSB7MHgzZjBjMmFkNiwweGM4ZWI3MDc0LDB4YTk5MjkzNTIsMHhmY2Q1YjhiMCwweDc2ZmE4NDYxfTsKKyAgICBVTE9ORyBhSGFzaERlY29kZVs1XSA9IHsweGIyM2I2MmJiLDB4ZDIyYTYwMmIsMHgxMTMwMzhhMCwweDcyMTdjNmFiLDB4Y2IxNTZmMDZ9OworI2Vsc2UKKyAgICBVTE9ORyB1bEhhc2hTaGExWzVdID0gezB4MmExOWU5OWYsMHg5OWIxYmIyZCwweDlhYzgyODYyLDB4NDkyMDVlNDMsMHg2YmM0YjRkN307CisgICAgVUxPTkcgYUhhc2hEZWNvZGVbNV0gPSB7MHgyOTA3YTgyNywweGFmMzM3MDc5LDB4NDc4MTdmMWYsMHhiMGI3Y2Q2OCwweDhkMzNiZDJ9OworI2VuZGlmCisKKyAgICAvL0xvYWQgcGF0dGVybiB0byBzcmMxICYgc3JjMiBidWZmZXIKKyAgICBzcmFuZCgxKTsKKworICAgIC8vVG90YWwgc2l6ZSA6IERlZldpZHRoKkRlSGVpZ2h0KjQKKyAgICAvL3JhbmQgZnVuY3Rpb246IDE2IGJpdHMgb25lIHRpbWUgaXMgZXF1YWwgdG8gMiBieXRlcworICAgIC8vT3V0ZHdtQmFua01vZGU6IDMyIGJpdHMgb25lIHRpbWUgaXMgZXF1YWwgdG8gNCBieXRlcworICAgIGZvciAoaT0wOyBpPGdfRGVmV2lkdGgqZ19EZWZIZWlnaHQqMjsgaSsrKQorICAgIHsKKwlpZiAoaSUyKQorCXsKKwkgICAgdWxUZW1wMiA9IHJhbmQoKTsKKwkgICAgdWxUZW1wID0gKHVsVGVtcDIgPDwgMTYpIHwgdWxUZW1wOworCSAgICAvL1dyaXRlTWVtb3J5TG9uZ0hvc3QoRFJBTV9CQVNFLCBnX0NBUFRVUkVfVklERU8xX0JVRjFfQUREUiArICgoaS0xKS8yKSo0LCB1bFRlbXApOworCSAgICAqKCgoVUxPTkcgKilnX0NBUFRVUkVfVklERU8xX0JVRjFfQUREUikgKyAoaS0xKS8yKSA9IHVsVGVtcDsKKwkgICAgdWxUZW1wID0gMDsKKwl9CisJZWxzZQorCXsKKwkgICAgdWxUZW1wID0gcmFuZCgpOworCX0KKyAgICB9CisKKyAgICAvKiBpbml0IGVuY29kZXIgZW5naW5lICovCisgICAgSW5pdGlhbGl6ZVZpZGVvRW5naW5lSG9zdCAoMCwKKwkJCSAgICAgICBWSURFTzEsCisJCQkgICAgICAgdk1vZGVUYWJsZVsyXS5Ib3JQb2xhcml0eSwKKwkJCSAgICAgICB2TW9kZVRhYmxlWzJdLlZlclBvbGFyaXR5KTsKKworICAgIC8qIHJlc2V0IG9mZnNldCBwb2ludGVyIHJlZ2lzdGVyKi8gICAgCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfRU5HSU5FX1NFUVVFTkNFX0NPTlRST0xfUkVHLCAwLCBWSURFT19DT0RFQ19UUklHR0VSIHwgVklERU9fQ0FQVFVSRV9UUklHR0VSKTsKKworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0NPTVBSRVNTX0JVRl9SRUFEX09GRlNFVF9SRUcsIDAsIENPTVBSRVNTX0JVRl9SRUFEX09GRlNFVF9NQVNLKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9CVUZfQ09ERUNfT0ZGU0VUX1JFQUQsIDAsIEJVRl9DT0RFQ19PRkZTRVRfTUFTSyk7CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfQ09NUFJFU1NfQlVGX1BST0NFU1NfT0ZGU0VUX1JFRywgMCwgQ09NUFJFU1NfQlVGX1BST0NFU1NfT0ZGU0VUX01BU0spOworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0NPTVBSRVNTX0ZSQU1FX0VORF9SRUFELCAwLCBDT01QUkVTU19GUkFNRV9FTkRfUkVBRF9NQVNLKTsKKworICAgIC8qIHN0YXJ0IGNvbXByZXNzIHN0cmVhbSAqLworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0VOR0lORV9TRVFVRU5DRV9DT05UUk9MX1JFRywgTU9ERV9ERVRFQ1RJT05fVFJJR0dFUiwgTU9ERV9ERVRFQ1RJT05fVFJJR0dFUik7CisgICAgLy9TdHJlYW0gbW9kZTogc2V0IENPREVDIHRyaWdnZXIgZmlyc3QKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9FTkdJTkVfU0VRVUVOQ0VfQ09OVFJPTF9SRUcsIFZJREVPX0NPREVDX1RSSUdHRVIsIFZJREVPX0NPREVDX1RSSUdHRVIpOworCisgICAgLy9TdHJlYW0gbW9kZTogc3RhcnQgdHJpZ2dlciAob25seSB0cmlnZ2VyIGNhcHR1cmUgYml0KQorICAgIFN0YXJ0VmlkZW9DYXB0dXJlVHJpZ2dlckhvc3QoMCwgVklERU8xX0VOR0lORV9TRVFVRU5DRV9DT05UUk9MX1JFRyk7CisKKyAgICAvL3N0b3AgZW5naW5lCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfRU5HSU5FX1NFUVVFTkNFX0NPTlRST0xfUkVHLCAwLCAweEZGKTsgICAgCisjaWYgZGVmaW5lZChDT05GSUdfQVNUMjMwMCkKKyAgICBkbyB7CS8qIHdhaXQgY29tcHJlc3MgZW5naW5lIGlkbGUgKi8KKwl1bFRlbXAgPSBSZWFkTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9FTkdJTkVfU0VRVUVOQ0VfQ09OVFJPTF9SRUcpOyAgICAJCisgICAgfSB3aGlsZSAoISh1bFRlbXAgJiAweDQwMDAwKSk7CQorI2VuZGlmCisKKyAgICAvL3JlYWQgMzAgdGltZXMgdG8gZ2V0IEhXIHdyaXRlIHBvaW50ZXIKKyAgICBmb3IgKGk9MDsgaTwzMDAwMDsgaSsrKQorCXVsSFdXcCA9IFJlYWRNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0JVRl9DT0RFQ19PRkZTRVRfUkVBRCk7CisKKyAgICBnX0hhc2hTcmNCdWZmZXIgPSBnX1ZJREVPMV9DT01QUkVTU19CVUZfQUREUiArIDEyODsgLy9za2lwIGVuY29kZSBkYXRhIDEyOCBieXRlCQorICAgIGdfSGFzaERzdEJ1ZmZlciA9IHYxNmJ5dGVBbGlnbigodW5zaWduZWQgbG9uZylwVkhhc2hEc3RCdWZmZXIpOworICAgIHVsVGVtcCA9IDMwMDsKKworICAgIC8vRW5hYmxlIGhhc2ggY2xvY2sKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoU0NVX0JBU0UsIFNDVV9DTE9DS19TVE9QX1JFRywgRU5fSEFDRSwgU1RPUF9IQUNFX01BU0spOworICAgIGdfSGFzaE1ldGhvZC5IYXNoTW9kZSA9IFZIQVNITU9ERV9TSEExOworICAgIGdfSGFzaE1ldGhvZC5EaWdlc3RMZW4gPSAyMDsKKyAgICBIYXNoQXN0MzAwMCh1bFRlbXAsIHRBcnJheSwgZ19IYXNoTWV0aG9kLkhhc2hNb2RlKTsKKworICAgIGlmIChzdHJuY21wKChjb25zdCBjaGFyICopdEFycmF5LCAoY29uc3QgY2hhciAqKXVsSGFzaFNoYTEsIGdfSGFzaE1ldGhvZC5EaWdlc3RMZW4pKQorICAgIHsKKwlwcmludGYoIltWSURFT10gRW5jb2RlciBUZXN0OiBXcm9uZ1xuIik7CisgICAgICAgIC8vRXhpdFZpZGVvVGVzdCgpOworICAgICAgICByZXR1cm4gVklERU9fRU5DT0RFX0ZBSUw7CisgICAgfQorICAgIGVsc2UKKyAgICB7ICAgIAorCXByaW50ZigiW1ZJREVPXSBFbmNvZGVyIFRlc3Q6IFBhc3NcbiIpOworICAgIH0KKworI2lmIDAKKyAgICAvKioqKioqKiogcHJlcGFyZSBmb3IgbmV4dCBkZWNvZGluZyB0ZXN0IGF0IHRoZSBzYW1lIGNoaXAgKioqKioqKioqKiovCisgICAgUmVzZXRWaWRlb0hvc3QoKTsKKworICAgIGR3VmFsdWU9MDsKKworICAgIGRvCisgICAgeworCWR3VmFsdWUgPSBVbmxvY2tWaWRlb1JlZ0hvc3QoMCwgVklERU9fVU5MT0NLX0tFWSk7CisJaSsrOworICAgIH0KKyAgICB3aGlsZSAoKFZJREVPX1VOTE9DSyAhPSBkd1ZhbHVlKSAmJiAoaTwxMCkpOworCisgICAgaWYgKFZJREVPX1VOTE9DSyAhPSBkd1ZhbHVlKQorICAgIHsKKwlwcmludGYoIltWSURFT10gVmlkZW8gcmVnaXN0ZXIgaXMgbG9ja2VkIik7CisJcmV0dXJuIFZJREVPX1VOTE9DS19GQUlMOworICAgIH0KKworICAgIC8vIGFsbG9jYXRlIGRlY29kaW5nIGJ1ZmZlcgorICAgIC8vVXNlIENvbXByZXNzIGJ1ZmZlciBsYXN0IHRpbWUsIGFuZCBEb24ndCBuZWVkIHRvIGFsbG9jYXRlCisgICAgZ19WSURFTzFfREVDT0RFX0JVRl8xX0FERFIgPSBnX1ZJREVPMV9DT01QUkVTU19CVUZfQUREUjsKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9CVUZfMV9BRERSX1JFRywgZ19WSURFTzFfREVDT0RFX0JVRl8xX0FERFIsIEJVRl8xX0FERFJfTUFTSyk7CisgICAgCisgICAgLy8JcFZpZGVvMURlY0FkZHIgPSBtYWxsb2MoVklERU9fU09VUkNFX1NJWkUpOworICAgIGdfVklERU8xX0RFQ09NUFJFU1NfQlVGX0FERFIgPSB2QnVmQWxpZ24oKHVuc2lnbmVkIGxvbmcpcFZpZGVvMURlY0FkZHIpOyAgICAKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9DT01QUkVTU19CVUZfQUREUl9SRUcsIGdfVklERU8xX0RFQ09NUFJFU1NfQlVGX0FERFIsIENPTVBSRVNTX0JVRl9BRERSX01BU0spOworICAgIAorICAgIC8vQWRkciA9IChVTE9ORyltYWxsb2MoMjU2KTsKKyAgICAvL2dfVklERU8xX1JDNF9CVUZfQUREUiA9IEFkZHI7CisgICAgLy9nX1ZJREVPMV9ERUNPREVfUkM0X0JVRl9BRERSID0gZ19WSURFTzFfREVDT01QUkVTU19CVUZfQUREUiArIDB4ODAwMDAwOyAvL2Fzc3VtZSB2aWRlbyBzaXplIGlzIDhNQiBmb3IgdW1jb21wcmVzc2VkIGJ1ZjsKKyAgICAvL1dyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLQ2xpZW50KFZJREVPX1JFR19CQVNFLCBWSURFTzFfUkM0X1RBQkxFX0FERFIsIGdfVklERU8xX0RFQ09ERV9SQzRfQlVGX0FERFIsIFJDNF9UQUJMRV9BRERSX01BU0spOworCisgICAgLy9IVyByZWNvbW1hbmRlZCB2YWx1ZQorICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0JVRl8yX0FERFJfUkVHLCBnX1ZJREVPMV9ERUNPTVBSRVNTX0JVRl9BRERSLCBCVUZfMl9BRERSX01BU0spOworICAgIC8vV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoVklERU9fUkVHX0JBU0UsIFZJREVPMV9CVUZfMl9BRERSX1JFRywgMCwgQlVGXzJfQUREUl9NQVNLKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9DUkNfQlVGX0FERFJfUkVHLCAwLCBCVUZfMl9BRERSX01BU0spOyAgICAgICAgICAgIAorCisgICAgLyogaW5pdCBlbmNvZGVyIGVuZ2luZSAqLworICAgIEluaXRpYWxpemVWaWRlb0VuZ2luZUNsaWVudCAoMCwgVklERU8xKTsKKworICAgIC8qIHJlc2V0IG9mZnNldCBwb2ludGVyIHJlZ2lzdGVyKi8gICAgCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfRU5HSU5FX1NFUVVFTkNFX0NPTlRST0xfUkVHLCAwLCBWSURFT19DT0RFQ19UUklHR0VSIHwgVklERU9fQ0FQVFVSRV9UUklHR0VSKTsKKworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0NPTVBSRVNTX0JVRl9SRUFEX09GRlNFVF9SRUcsIDAsIENPTVBSRVNTX0JVRl9SRUFEX09GRlNFVF9NQVNLKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9CVUZfQ09ERUNfT0ZGU0VUX1JFQUQsIDAsIEJVRl9DT0RFQ19PRkZTRVRfTUFTSyk7CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfQ09NUFJFU1NfQlVGX1BST0NFU1NfT0ZGU0VUX1JFRywgMCwgQ09NUFJFU1NfQlVGX1BST0NFU1NfT0ZGU0VUX01BU0spOworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0NPTVBSRVNTX0ZSQU1FX0VORF9SRUFELCAwLCBDT01QUkVTU19GUkFNRV9FTkRfUkVBRF9NQVNLKTsKKworICAgIFN0YXJ0VmlkZW9Db2RlY1RyaWdnZXJIb3N0KDAsIFZJREVPMV9FTkdJTkVfU0VRVUVOQ0VfQ09OVFJPTF9SRUcpOworCisgICAgLy93cnRpZSBTVyB3cml0ZSBwb2ludGVyCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfREVDT01QUkVTU19CVUZfUFJPQ0VTU19PRkZTRVRfUkVHLCB1bEhXV3AsIENPTVBSRVNTX0JVRl9SRUFEX09GRlNFVF9NQVNLKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9ERUNPTVBSRVNTX0JVRl9XUklURV9PRkZTRVRfUkVHLCB1bEhXV3AsIENPTVBSRVNTX0JVRl9SRUFEX09GRlNFVF9NQVNLKTsKKworICAgIGkgPSAwOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHVsSFdQdCA9IFJlYWRNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0JVRl9DT0RFQ19PRkZTRVRfUkVBRCk7CisgICAgICAgIGkrKzsKKyAgICB9d2hpbGUoKHVsSFdQdCAhPSB1bEhXV3ApICYmIChpPDEwMDAwKSk7CisKKyAgICBpZiAoMTAwMDAgPiBpKQorICAgIHsKKyAJcHJpbnRmKCJbVklERU9dIERlY29kZXIgUG9pbnRlciBjYW5ub3QgbW92ZSEhISAvbiIpOworICAgICAgICAvL0V4aXRWaWRlb1Rlc3QoKTsKKwlyZXR1cm4gVklERU9fREVDT0RFX0ZBSUw7ICAgICAgIAorICAgIH0KKyAgICAgICAgCisgICAgLy84KjggWVVWQSBibG9jaworICAgIGZvciAoaT0yNDsgaTxnX0RlZldpZHRoKmdfRGVmSGVpZ2h0OyBpPWkrMzIpCisgICAgeworICAgICAgICAqKCgoVUxPTkcgKilnX1ZJREVPMV9ERUNPTVBSRVNTX0JVRl9BRERSKSArIGkpID0gMHgwOworCSooKChVTE9ORyAqKWdfVklERU8xX0RFQ09NUFJFU1NfQlVGX0FERFIpICsgaSsxKSA9IDB4MDsKKyAgICB9CisKKyAgICBnX0hhc2hTcmNCdWZmZXIgPSBnX1ZJREVPMV9ERUNPTVBSRVNTX0JVRl9BRERSOworICAgIC8vZ19IYXNoRHN0QnVmZmVyID0gVklERU8xX0VOX0JBU0UgKyBWSURFT19BTExfU0laRTsgLy9jb25maWcgZm9yd2FyZAorCisgICAgdWxUZW1wID0gMzAwOworCisgICAgLy9FbmFibGUgaGFzaCBjbG9jaworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgU0NVX0NMT0NLX1NUT1BfUkVHLCBFTl9IQUNFLCBTVE9QX0hBQ0VfTUFTSyk7CisgICAgZ19IYXNoTWV0aG9kLkhhc2hNb2RlID0gVkhBU0hNT0RFX1NIQTE7CisgICAgZ19IYXNoTWV0aG9kLkRpZ2VzdExlbiA9IDIwOworICAgIEhhc2hBc3QzMDAwKHVsVGVtcCwgdEFycmF5LCBnX0hhc2hNZXRob2QuSGFzaE1vZGUpOworCisgICAgaWYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKil0QXJyYXksIChjb25zdCBjaGFyICopYUhhc2hEZWNvZGUsIGdfSGFzaE1ldGhvZC5EaWdlc3RMZW4pKQorICAgIHsKKwlwcmludGYoIltWSURFT10gRGVjb2RlciBUZXN0OiBXcm9uZ1xuIik7CisgICAgICAgIC8vRXhpdFZpZGVvVGVzdCgpOworICAgICAgICByZXR1cm4gVklERU9fREVDT0RFX0ZBSUw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcHJpbnRmKCJbVklERU9dIERlY29kZXIgVGVzdDogUGFzc1xuIik7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gVklERU9fVEVTVF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIE9ubHkgdXNlZCBpbiB0aGUgaG9zdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHRlc3QgZnVuY3Rpb246IE1vZGUgZGV0ZWN0aW9uIGFuZCBDYXB0dXJlIHBhdHRlcm4gICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IENhcFRlc3Qodm9pZCkKK3sKKyAgICBVTE9ORyAgIGR3VmFsdWUsIFN0YXR1czsKKyAgICBpbnQgICAgIGk7CisgICAgQk9PTCAgICBiQW5hbG9nOworICAgIFVMT05HCUhTdGFydCwgSEVuZCwgVlN0YXJ0LCBWRW5kOworICAgIFVTSE9SVAl1c0NSVEhvciwgdXNDUlRWZXI7CisgICAgVUxPTkcgICB1bEhvciwgdWxWZXI7CisgICAgVUxPTkcgICB1bFZHQUJhc2VBZGRyLCB1bENhcEFkZHI7CisgICAgVUxPTkcgICB1bEZsYWc7CisgICAgCisgICAgcHJpbnRmKCJcbiAtLS0tLS0tLS0gTW9kZSBEZXRlY3Rpb24gVGVzdCAtLS0tLS0tLS0gXG4iKTsKKyAgICAvL2NsZWFyIGNsZWFyIHJlZ2lzdGVyCisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0NPTlRST0xfUkVHLCAwKTsKKyAgICBkd1ZhbHVlID0gUmVhZE1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfQ09OVFJPTF9SRUcpOworCisgICAgLy8gIE5vdGU6IEN1cnJlbnQgbW9kZSBkZXRlY3Rpb24gcHJvY2VkdXJlIGhhcyB0byBzZXQgc2lnbmFsIGlucHV0IDFzdAorICAgIC8vTm90ZTogQ2xlYXIgYW5kIGVuYWJsZSBpbnRlcnJ1cHQgRW5jb2RlCisgICAgQ2xlYXJWaWRlb0ludGVycnVwdEhvc3QoMCwgVklERU8xX01PREVfREVURUNUSU9OX1JFQURZX0NMRUFSKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPX0lOVF9DT05UUk9MX0VOX1JFRywgVklERU8xX01PREVfREVURUNUSU9OX1JFQURZX0lOVF9FTiwgVklERU8xX01PREVfREVURUNUSU9OX1JFQURZX0lOVF9FTik7CisgICAgLy8gIFNldCBpbnB1dCBzaWduYWwKKyAgICBkd1ZhbHVlIHw9IEVYVEVSTkFMX1ZHQV9TT1VSQ0U7CisgICAgCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfQ09OVFJPTF9SRUcsIChkd1ZhbHVlIDw8RVhURVJOQUxfU09VUkNFX0JJVCksIEVYVEVSTkFMX1NPVVJDRV9NQVNLKTsKKworLy8gIFNldCBIL1Ygc3RhYmxlIG1heGltdW0KKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPX01PREVfREVURUNUSU9OX1BBUkFNX1JFRywgKE1PREVERVRFQ1RJT05fVkVSVElDQUxfU1RBQkxFX01BWElNVU0gPDwgVkVSX1NUQUJMRV9NQVhfQklUKSwgMHgwMDBGMDAwMCk7CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFT19NT0RFX0RFVEVDVElPTl9QQVJBTV9SRUcsIChNT0RFREVURUNUSU9OX0hPUklaT05UQUxfU1RBQkxFX01BWElNVU0gPDwgSE9SX1NUQUJMRV9NQVhfQklUKSwgSE9SX1NUQUJMRV9NQVhfQklUX01BU0spOworLy8gIFNldCBIL1Ygc3RhYmxlIHRocmVzaG9sZAorICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU9fTU9ERV9ERVRFQ1RJT05fUEFSQU1fUkVHLCAoTU9ERURFVEVDVElPTl9WRVJUSUNBTF9TVEFCTEVfVEhSRVNIT0xEIDw8IFZFUl9TVEFCTEVfVEhSRVNfQklUKSwgVkVSX1NUQUJMRV9USFJFU19CSVRfTUFTSyk7CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFT19NT0RFX0RFVEVDVElPTl9QQVJBTV9SRUcsIChNT0RFREVURUNUSU9OX0hPUklaT05UQUxfU1RBQkxFX1RIUkVTSE9MRCA8PCBIT1JfU1RBQkxFX1RIUkVTX0JJVCksIEhPUl9TVEFCTEVfVEhSRVNfQklUX01BU0spOworICAgIAorICAgIC8vVHJpZ2dlciBtb2RlIGRldGVjdGlvbgorICAgIC8vIHR1cm4gb2ZmIFdBVENIX0RPRyBmaXJzdAorICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0VOR0lORV9TRVFVRU5DRV9DT05UUk9MX1JFRywgKFdBVENIX0RPR19PRkYgPDwgV0FUQ0hfRE9HX0VOQUJMRV9CSVQpLCBXQVRDSF9ET0dfRU5fTUFTSyk7CisgICAgICAgIAorICAgIC8vICBOb3RlOiBDbGVhciBtb2RlIGRldGVjdGlvbiByZWFkeSBpbnRlcnJ1cHQKKyAgICAvL0NsZWFyVmlkZW9JbnRlcnJ1cHQoTU1JT0Jhc2UsIE1PREVfREVURUNUSU9OX1JFQURZX0NMRUFSKTsKKyAgICBTdGFydE1vZGVEZXRlY3Rpb25UcmlnZ2VySG9zdCgwLCBWSURFTzFfRU5HSU5FX1NFUVVFTkNFX0NPTlRST0xfUkVHKTsKKworCisvLyAgTm90ZTogUG9sbGluZyBtb2RlIGRldGVjdGlvbiByZWFkeSBpbnRlcnJ1cHQKKyAgICAvL2l0IHNvbWV0aW1lIHRha2UgYSBsb25nIHRpbWUsIGVzcGVjaWFsbHkgZHVyaW5nIGNoYW5nZSBtb2RlLCAKKyAgICAvL3NvIHRoZSBsb29wIGNvdW50IG11c3QgYmUgYmlnLCBvciB5b3UgY2FuJ3QgcHVsbCBpdCBieSB0aW1lcgorICAgIGkgPSAwOworICAgIGRvIHsKKworCQlTdGF0dXMgPSBSZWFkVmlkZW9JbnRlcnJ1cHRIb3N0KDAsIFZJREVPMV9NT0RFX0RFVEVDVElPTl9SRUFEWV9SRUFEKTsKKwkJaSsrOworICAgIH0gd2hpbGUgKCghU3RhdHVzKSAmIChpPDUwMDAwMCkpOworCisgICAgaWYgKCFTdGF0dXMpCisgICAgeworCXByaW50ZigiW1ZJREVPXSBNb2RlIGRldGVjdGlvbiBlcnJvclxuIik7CisgICAgICAgIC8vRXhpdFZpZGVvVGVzdCgpOworCXJldHVybiBWSURFT19URVNUX0ZBSUw7CisgICAgfQorCisgICAgSFN0YXJ0CT0gKFJlYWRNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERTFfTU9ERV9ERVRFQ1RJT05fRURHRV9IX1JFRykgJiBMRUZUX0VER0VfTE9DQVRJT05fTUFTSykgPj4gTEVGVF9FREdFX0xPQ0FUSU9OX0JJVDsKKyAgICBIRW5kCT0gKFJlYWRNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERTFfTU9ERV9ERVRFQ1RJT05fRURHRV9IX1JFRykgJiBSSUdIVF9FREdFX0xPQ0FUSU9OX01BU0spID4+IFJJR0hUX0VER0VfTE9DQVRJT05fQklUOworCisgICAgVlN0YXJ0CT0gKFJlYWRNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERTFfTU9ERV9ERVRFQ1RJT05fRURHRV9WX1JFRykgJiBUT1BfRURHRV9MT0NBVElPTl9NQVNLKSA+PiBUT1BfRURHRV9MT0NBVElPTl9CSVQ7CisgICAgVkVuZAk9IChSZWFkTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREUxX01PREVfREVURUNUSU9OX0VER0VfVl9SRUcpICYgQk9UVE9NX0VER0VfTE9DQVRJT05fTUFTSykgPj4gQk9UVE9NX0VER0VfTE9DQVRJT05fQklUOworCisgICAgdWxIb3IgPSBIRW5kLUhTdGFydCsxOworICAgIHVsVmVyID0gVkVuZC1WU3RhcnQrMTsKKworICAgIHByaW50ZigiW1ZJREVPXSBSZXNvbHV0aW9uOiBIWyVkXSAqIFZbJWRdXG4iLCB1bEhvciwgdWxWZXIpOworCisgICAgaWYgKChnX0RlZldpZHRoID09IHVsSG9yKSAmIChnX0RlZkhlaWdodCA9PSB1bFZlcikpCisgICAgeworICAgIAlwcmludGYoIltWSURFT10gTW9kZSBkZXRlY3Rpb24gUEFTU1xuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcHJpbnRmKCJbVklERU9dIE1vZGUgZGV0ZWN0aW9uIEZBSUxcbiIpOworCXJldHVybiBWSURFT19URVNUX0ZBSUw7CisgICAgfQorCisgICAgaWYoISgoUmVhZE1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfTU9ERV9ERVRFQ1RJT05fU1RBVFVTX1JFQURfUkVHKSAmIEFOQUxPTkdfRElHSVRBTF9SRUFEKSA+PiBBTkFMT05HX0RJR0lUQUxfUkVBRF9CSVQpKQorCWJBbmFsb2cgPSBGQUxTRTsKKyAgICBlbHNlCisJYkFuYWxvZyA9IFRSVUU7CisKKyAgICAvLyAgTm90ZTogQ2xlYXIgbW9kZSBkZXRlY3Rpb24gcmVhZHkgaW50ZXJydXB0CisgICAgQ2xlYXJWaWRlb0ludGVycnVwdEhvc3QoMCwgVklERU8xX01PREVfREVURUNUSU9OX1JFQURZX0NMRUFSKTsKKworICAgIHByaW50ZigiXG4gLS0tLS0tLS0tIENhcHR1cmUgVGVzdCAtLS0tLS0tLS0gXG4iKTsKKworICAgIC8vY2FwdHVyZSBlbmdpbmUKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9USU1FSU5HX0dFTl9IT1JfUkVHLCAoSEVuZCA8PCBWSURFT19IREVfRU5EX0JJVCksIFZJREVPX0hERV9FTkRfTUFTSyk7CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfVElNRUlOR19HRU5fSE9SX1JFRywgKEhTdGFydCA8PCBWSURFT19IREVfU1RBUlRfQklUKSwgVklERU9fSERFX1NUQVJUX01BU0spOworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX1RJTUVJTkdfR0VOX1ZfUkVHLCAoVkVuZCA8PCBWSURFT19WREVfRU5EX0JJVCksIFZJREVPX1ZERV9FTkRfTUFTSyk7CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfVElNRUlOR19HRU5fVl9SRUcsIChWU3RhcnQgPDwgVklERU9fVkRFX1NUQVJUX0JJVCksIFZJREVPX1ZERV9TVEFSVF9NQVNLKTsKKwkKKyAgICB1bENhcEFkZHIgPSB2QnVmQWxpZ24yKChVTE9ORylwQ2FwdHVyZVZpZGVvMUJ1ZjFBZGRyKTsgICAgCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfQlVGXzFfQUREUl9SRUcsIHVsQ2FwQWRkciwgQlVGXzFfQUREUl9NQVNLKTsKKyAgICAKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9CVUZfMl9BRERSX1JFRywgMCwgQlVGXzJfQUREUl9NQVNLKTsKKworICAgIEluaXRpYWxpemVWaWRlb0VuZ2luZUhvc3QgKDAsCisJCQkgICAgICAgVklERU8xLAorCQkgICAgICAgICAgICAgICB2TW9kZVRhYmxlWzJdLkhvclBvbGFyaXR5LAorCQkJICAgICAgIHZNb2RlVGFibGVbMl0uVmVyUG9sYXJpdHkpOworCisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgMHgwNCwgMHgwMSk7CisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgMHgzMDAsIDB4MCk7CisjaWYgZGVmaW5lZChDT05GSUdfQVNUMjMwMCkKKwlXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIDB4OCwgMHgwODgwLCAweDBlYzApOworI2VsaWYgZGVmaW5lZChDT05GSUdfQVNUMzAwMCkKKwlXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIDB4OCwgMHgyODAwLCAweDI4MDApOwkKKyNlbHNlCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCAweDgsIDB4YTAwLCAweDJhODApOyAvL3RpbGUgbW9kZQorI2VuZGlmCisKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9USU1FSU5HX0dFTl9IT1JfUkVHLCAweGEwMDAwMDAwLCAweGEwMDAwMDAwKTsKKyAgIAorICAgIC8vb25seSB0cmlnZ2VyIGNhcHR1cmUsIGluIHNvdXJjZSBidWZmZXIgKHZyNDQpLCB0aGUgZnJvbnQgb2YgZGF0YSBpcyBjb3JyZWN0LgorICAgIC8vU3RhcnRWaWRlb0NhcHR1cmVUcmlnZ2VySG9zdCgwLCBWSURFTzFfRU5HSU5FX1NFUVVFTkNFX0NPTlRST0xfUkVHKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfRU5HSU5FX1NFUVVFTkNFX0NPTlRST0xfUkVHLCBWSURFT19DQVBUVVJFX1RSSUdHRVIpOworCisgICAgaSA9IDA7CisgICAgZG8geworICAgICAgICBTdGF0dXMgPSBSZWFkTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9FTkdJTkVfU0VRVUVOQ0VfQ09OVFJPTF9SRUcpICYgQ0FQVFVSRV9SRUFEWV9NQVNLOworCWkrKzsKKyAgICB9IHdoaWxlICgoIVN0YXR1cykgJiAoaTw1MDAwMDApKTsKKworICAgIGlmICghU3RhdHVzKQorICAgIHsKKwlwcmludGYoIltWSURFT10gQ2FwdHVyZSBpcyBub3QgUkVBRFlcbiIpOworCXJldHVybiBWSURFT19URVNUX0ZBSUw7CisgICAgfSAgCisKKyNpZiAhZGVmaW5lZChDT05GSUdfQVNUMjMwMCkJCisgICAgdWxWR0FCYXNlQWRkciA9IHVsQ2FwQWRkciArIDB4MTAwMDsKKworICAgIC8qIGNoZWNrIHBhdHRlcm4gKi8KKyAgICB1bEZsYWcgPSAwOyAvL25vIDAgaXMgZXJyb3IKKworICAgIGZvciAoaT0wOyBpPDEwMDsgaSsrKQorICAgIHsKKyAgICAgICAgZHdWYWx1ZSA9ICooVUxPTkcgKikodWxWR0FCYXNlQWRkciArIGkqMzIpOworCWlmICgweDMyMzIzMjMyICE9IGR3VmFsdWUpCisJeworCSAgICBwcmludGYoIltWSURFT10gQ2FwdHVyZSBUZXN0IGZhaWwgLS0gY2FwdHVyZSBkYXRhIGRvZXNuJ3QgbWF0Y2ggc291cmNlIFxuIik7CisJICAgIHByaW50ZigiW1ZJREVPXTEgaT0lZCB2YWx1ZT0leFxuIiwgaSwgZHdWYWx1ZSk7CisgICAgICAgICAgICB1bEZsYWcgPSAxOworICAgICAgICAgICAgYnJlYWs7CisJfQorCisJZHdWYWx1ZSA9ICooVUxPTkcgKikodWxWR0FCYXNlQWRkciArIGkqMzIgKyA0KTsKKwlpZiAoMHgzMjMyMzIzMiAhPSBkd1ZhbHVlKQorCXsKKwkgICAgcHJpbnRmKCJbVklERU9dIENhcHR1cmUgVGVzdCBmYWlsIC0tIGNhcHR1cmUgZGF0YSBkb2Vzbid0IG1hdGNoIHNvdXJjZSBcbiIpOworCSAgICBwcmludGYoIltWSURFT10yIGk9JWQgdmFsdWU9JXhcbiIsIGksIGR3VmFsdWUpOworCSAgICB1bEZsYWcgPSAxOworCSAgICBicmVhazsKKwl9CisKKwlkd1ZhbHVlID0gKihVTE9ORyAqKSh1bFZHQUJhc2VBZGRyICsgaSozMiArIDgpOworCWlmICgweDgwODA4MDgwICE9IGR3VmFsdWUpCisJeworCSAgICBwcmludGYoIltWSURFT10gQ2FwdHVyZSBUZXN0IGZhaWwgLS0gY2FwdHVyZSBkYXRhIGRvZXNuJ3QgbWF0Y2ggc291cmNlIFxuIik7CisJICAgIHByaW50ZigiW1ZJREVPXTMgaT0lZCB2YWx1ZT0leFxuIiwgaSwgZHdWYWx1ZSk7CisJICAgIHVsRmxhZyA9IDE7CisJICAgIGJyZWFrOworCX0KKworCWR3VmFsdWUgPSAqKFVMT05HICopKHVsVkdBQmFzZUFkZHIgKyBpKjMyICsgMTIpOworCWlmICgweDgwODA4MDgwICE9IGR3VmFsdWUpCisJeworCSAgICBwcmludGYoIltWSURFT10gQ2FwdHVyZSBUZXN0IGZhaWwgLS0gY2FwdHVyZSBkYXRhIGRvZXNuJ3QgbWF0Y2ggc291cmNlIFxuIik7CisJICAgIHByaW50ZigiNCBpPSVkIHZhbHVlPSV4XG4iLCBpLCBkd1ZhbHVlKTsKKwkgICAgdWxGbGFnID0gMTsKKwkgICAgYnJlYWs7CisJfQorCisJZHdWYWx1ZSA9ICooVUxPTkcgKikodWxWR0FCYXNlQWRkciArIGkqMzIgKyAxNik7CisJaWYgKDB4ODA4MDgwODAgIT0gZHdWYWx1ZSkKKwl7CisJICAgcHJpbnRmKCJbVklERU9dIENhcHR1cmUgVGVzdCBmYWlsIC0tIGNhcHR1cmUgZGF0YSBkb2Vzbid0IG1hdGNoIHNvdXJjZSBcbiIpOworCSAgIHByaW50ZigiNSBpPSVkIHZhbHVlPSV4XG4iLCBpLCBkd1ZhbHVlKTsKKwkgICB1bEZsYWcgPSAxOworCSAgIGJyZWFrOworCX0KKworCWR3VmFsdWUgPSAqKFVMT05HICopKHVsVkdBQmFzZUFkZHIgKyBpKjMyICsgMjApOworCWlmICgweDgwODA4MDgwICE9IGR3VmFsdWUpCisJeworCSAgIHByaW50ZigiW1ZJREVPXSBDYXB0dXJlIFRlc3QgZmFpbCAtLSBjYXB0dXJlIGRhdGEgZG9lc24ndCBtYXRjaCBzb3VyY2UgXG4iKTsKKwkgICBwcmludGYoIjYgaT0lZCB2YWx1ZT0leFxuIiwgaSwgZHdWYWx1ZSk7CisJICAgdWxGbGFnID0gMTsKKwkgICBicmVhazsKKwkgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGlmICghdWxGbGFnKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJbVklERU9dIENhcHR1cmUgVGVzdCBPS1xuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcHJpbnRmKCJbVklERU9dIENhcHR1cmUgVGVzdCBGQUlMXG4iKTsKKwlyZXR1cm4gVklERU9fVEVTVF9GQUlMOworICAgIH0KKwkKKyAgICByZXR1cm4gVklERU9fVEVTVF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIE9ubHkgdXNlZCBpbiB0aGUgc3RhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IENSVFRlc3Qodm9pZCkKK3sKKyAgICBVTE9ORyAgIHVsVkdBQmFzZUFkZHI7CisgICAgQllURSAgICBidENSVENlbnRlck1vZGUsIGJ0Q1JUQ29sb3JGbXQ7CisgICAgVVNIT1JUICB1c0NSVEhvciwgdXNDUlRWZXI7CisgICAgVUxPTkcgICB1bERhdGE7CisKKyAgICBpbnQgaSxqOworCisgICAgLy9wcmludGYoIlxuIC0tLS0tLS0tLSBUdXJuIG9uIENSVCAtLS0tLS0tLS0gXG4iKTsKKyAgICAKKyAgICAvL0VuYWJsZSBDUlQxIGZpcnN0CisgICAgdWxWR0FCYXNlQWRkciA9IHZCdWZBbGlnbigodW5zaWduZWQgbG9uZylwQ3J0MUFkZHIpOworICAgIAorICAgIGJ0Q1JUQ2VudGVyTW9kZSAgICAgPSAwOworICAgIGJ0Q1JUQ29sb3JGbXQJPSBZVVZfNDQ0OworICAgIHVzQ1JUSG9yCQk9IGdfRGVmV2lkdGg7CisgICAgdXNDUlRWZXIJCT0gZ19EZWZIZWlnaHQ7CQorCisgICAgQ2hlY2tPblN0YXJ0Q2xpZW50KCk7CisKKyAgICAvKiBGaWxsIFBhdHRlcm4gKi8KKyAgICBmb3IgKGk9MDsgaTx1c0NSVEhvcjsgaSsrKQorICAgIHsKKwlmb3IgKGo9MDsgajx1c0NSVFZlci84OyBqKyspCisJeworCSAgICAvL1kKKwkgICAgLy91bERhdGEgPSAweDEwMTAxMDEwOworCSAgICB1bERhdGEgPSAweDMyMzIzMjMyOworCSAgICAqKFVMT05HICopKHVsVkdBQmFzZUFkZHIgKyAoaSp1c0NSVFZlcio0K2oqMzIpKSA9IHVsRGF0YTsKKwkgICAgLy91bERhdGEgPSAweDEwMTAxMDEwOworCSAgICB1bERhdGEgPSAweDMyMzIzMjMyOworCSAgICAqKFVMT05HICopKHVsVkdBQmFzZUFkZHIgKyAoaSp1c0NSVFZlcio0K2oqMzIpICs0KSA9IHVsRGF0YTsKKwkgICAgLy9VCisJICAgIHVsRGF0YSA9IDB4ODA4MDgwODA7CisJICAgIC8vdWxEYXRhID0gMHg3Nzc3Nzc3NzsKKwkgICAgKihVTE9ORyAqKSh1bFZHQUJhc2VBZGRyICsgKGkqdXNDUlRWZXIqNCtqKjMyKSArOCkgPSB1bERhdGE7CisJICAgIHVsRGF0YSA9IDB4ODA4MDgwODA7CisJICAgIC8vdWxEYXRhID0gMHg3Nzc3Nzc3NzsKKwkgICAgKihVTE9ORyAqKSh1bFZHQUJhc2VBZGRyICsgKGkqdXNDUlRWZXIqNCtqKjMyKSArMTIpID0gdWxEYXRhOworCSAgICAvL1YKKwkgICAgdWxEYXRhID0gMHg4MDgwODA4MDsKKwkgICAgLy91bERhdGEgPSAweDExMTExMTExOworCSAgICAqKFVMT05HICopKHVsVkdBQmFzZUFkZHIgKyAoaSp1c0NSVFZlcio0K2oqMzIpICsxNikgPSB1bERhdGE7CisJICAgIHVsRGF0YSA9IDB4ODA4MDgwODA7CisJICAgIC8vdWxEYXRhID0gMHgxMTExMTExMTsKKwkgICAgKihVTE9ORyAqKSh1bFZHQUJhc2VBZGRyICsgKGkqdXNDUlRWZXIqNCtqKjMyKSArMjApID0gdWxEYXRhOworCSAgICAvL0EKKwkgICAgdWxEYXRhID0gMHhGRkZGRkZGRkY7CisJICAgICooVUxPTkcgKikodWxWR0FCYXNlQWRkciArIChpKnVzQ1JUVmVyKjQraiozMikgKzI0KSA9IHVsRGF0YTsKKwkgICAgdWxEYXRhID0gMHhGRkZGRkZGRkY7CisJICAgICooVUxPTkcgKikodWxWR0FCYXNlQWRkciArIChpKnVzQ1JUVmVyKjQraiozMikgKzI4KSA9IHVsRGF0YTsKKwl9CisgICAgfSAgLyogfkZpbGwgUGF0dGVybiAqLworCisjaWYgZGVmaW5lZChDT05GSUdfQVNUMjMwMCkgICAgICAgCisgICAgaWYoIUFTVFNldE1vZGVWICgwLCBDUlRfMiwgdWxWR0FCYXNlQWRkciwgdXNDUlRIb3IsIHVzQ1JUVmVyLCBidENSVENvbG9yRm10LCBidENSVENlbnRlck1vZGUpKQorI2Vsc2UKKyAgICBpZighQVNUU2V0TW9kZVYgKDAsIENSVF8xLCB1bFZHQUJhc2VBZGRyLCB1c0NSVEhvciwgdXNDUlRWZXIsIGJ0Q1JUQ29sb3JGbXQsIGJ0Q1JUQ2VudGVyTW9kZSkpCisjZW5kaWYgICAgCisgICAgeyAgIAorICAgICAgICBwcmludGYoIltWSURFT10gVGhlIHJlc29sdXRpb24gaXMgbm90IGluIG1vZGUgdGFibGUgbGlzdFxuIik7CisgICAgICAgIHJldHVybiBDUlRfRkFJTDsKKyAgICB9CisgICAgCisgICAgLy9wcmludGYoIltWSURFT10gQ1JUIHR1cm4gb25cbiIpOworCisgICAgcmV0dXJuIFZJREVPX1RFU1RfT0s7Cit9CisKK2ludCBkb192aWRlb3Rlc3QgKHZvaWQpCit7CisgICAgaW50IGR3VmFsdWU9MDsKKyAgICBpbnQgaSA9IDA7CisgICAgaW50IGlSZXQ7ICAgIAorICAgIFVMT05HICAgdWxSZXN0b3JlMSwgdWxUZW1wOworICAgIEJPT0wgICAgYkNsaWVudDsKKworCisgICAgLy9Jbml0VmlkZW9UZXN0KCk7CisgICAgZ19EZWZXaWR0aCA9IDY0MDsgCisgICAgZ19EZWZIZWlnaHQ9IDQ4MDsKKworICAgIHByaW50ZigiXG4gLS0tLS0tLS0tIENvZGVjIFRlc3QgLS0tLS0tLS0tIFxuIik7CisKKyNpZiBkZWZpbmVkKENPTkZJR19BU1QyMzAwKQorICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgU0NVX0NPTlRST0xfUkVHLCAweDAwMDAyMDAwLCAweDAwMDAyMDAwKTsKKyNlbmRpZgorCisgICAgQ2hlY2tPblN0YXJ0SG9zdCgpOworICAgIAorICAgIGRvCisgICAgeworICAgICAgICBkd1ZhbHVlID0gVW5sb2NrVmlkZW9SZWdIb3N0KDAsIFZJREVPX1VOTE9DS19LRVkpOworCWkrKzsKKyAgICB9CisgICAgd2hpbGUgKChWSURFT19VTkxPQ0sgIT0gZHdWYWx1ZSkgJiYgKGk8MTAwMCkpOworCisgICAgaWYgKFZJREVPX1VOTE9DSyAhPSBkd1ZhbHVlKQorICAgIHsKKwlwcmludGYoIltWSURFT10gVmlkZW8gcmVnaXN0ZXIgaXMgbG9ja2VkIFxuIik7CisJcmV0dXJuIFZJREVPX1RFU1RfRkFJTDsKKyAgICB9CisgICAgQWxsb2NhdGVFbmNvZGVCdWZIb3N0KDAsIFZJREVPMSk7CisKKyAgICBpUmV0ID0gQ29kZWNUZXN0KCk7CQorICAgIGlmIChpUmV0KQorICAgICAgICByZXR1cm4gVklERU9fVEVTVF9GQUlMOworCisjaWYgZGVmaW5lZChDT05GSUdfQVNUMjMwMCkKKyAgICAvKiBJbml0IFNDVSAqLyAKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoU0NVX0JBU0UsICgweDJjICsgU0NVX09GRlNFVCksIDB4MDAwNDAwMDAsIDB4MDAwNDAwMTApOwkvKiBFbmFibGUgRDItUExMICovCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFNDVV9CQVNFLCBTQ1VfQ0xPQ0tfU1RPUF9SRUcsIDAsIDB4MDAwMDA0MDApOwkJLyogRW5hYmxlIEQyQ0xLICovCisgICAgdWRlbGF5KDEwKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoU0NVX0JBU0UsIFNDVV9DT05UUk9MX1JFRywgMCwgMHgwMDAwMjAwMCk7CisgICAgCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFNDVV9CQVNFLCAoMHg5MCArIFNDVV9PRkZTRVQpLCAweDIwLCAweDAwMDAwMDMwKTsgCS8qIGVuYWJsZSB2aWRlbyBtb2RlIHNpbmdsZSBlZGdlICovCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFNDVV9CQVNFLCAoMHg4NCArIFNDVV9PRkZTRVQpLCAweGZmZmUwMDAwLCAweGZmZmUwMDAwKTsgLyogbXVsdGktcGlucyAqLworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgKDB4ODggKyBTQ1VfT0ZGU0VUKSwgMHgwMDBmZmZmZiwgMHgwMDBmZmZmZik7IC8qIG11bHRpLXBpbnMgKi8gICAgCisgICAgCisgICAgaVJldCA9IENSVFRlc3QoKTsKKyAgICBpZiAoaVJldCkKKyAgICB7CisgICAgCXByaW50ZigiW1ZJREVPXSBDUlQgVGVzdCBGYWlsZWQgXG4iKTsKKyAgICAgICAgcmV0dXJuIFZJREVPX1RFU1RfRkFJTDsKKyAgICB9CisKKyAgICBpUmV0ID0gQ2FwVGVzdCgpOwkJCisgICAgaWYgKGlSZXQpCisgICAgeworICAgIAlwcmludGYoIltWSURFT10gQ2FwdHVyZSBUZXN0IEZhaWxlZCBcbiIpOworICAgICAgICByZXR1cm4gVklERU9fVEVTVF9GQUlMOworICAgIH0KKyNlbHNlCisgICAgLy9Ib3N0IG9yIENsaWVudAorICAgIGJDbGllbnQgPSAoKFJlYWRNZW1vcnlMb25nKFNDVV9CQVNFLCBTQ1VfSFdfVFJBUFBJTkdfUkVHKSAmIENMSUVOVF9NT0RFX0VOX01BU0spP1RSVUU6RkFMU0UpOworICAgIC8vcmVzZXQgdmlkZW8gZm9yIGFub3RoZXIgdGVzdGluZworICAgIFJlc2V0VmlkZW9Ib3N0KCk7CisgICAgZHdWYWx1ZT0wOworICAgIGkgPSAwOworICAgIGRvCisgICAgeworCWR3VmFsdWUgPSBVbmxvY2tWaWRlb1JlZ0hvc3QoMCwgVklERU9fVU5MT0NLX0tFWSk7CisJaSsrOworICAgIH0KKyAgICB3aGlsZSAoKFZJREVPX1VOTE9DSyAhPSBkd1ZhbHVlKSAmJiAoaTwxMCkpOworCisgICAgaWYgKFZJREVPX1VOTE9DSyAhPSBkd1ZhbHVlKQorICAgIHsKKwlwcmludGYoIltWSURFT10gVmlkZW8gcmVnaXN0ZXIgaXMgbG9ja2VkIik7CisJcmV0dXJuIFZJREVPX1VOTE9DS19GQUlMOworICAgIH0KKworICAgIC8vY2hlY2sgaWYgMWU2ZTAwMDhbMywwXSBpcyAwCisgICAgdWxSZXN0b3JlMSA9IFJlYWRNZW1vcnlMb25nSG9zdCgweDFlNmUwMDAwLCA4KTsKKyAgICBkd1ZhbHVlID0gUmVhZE1lbW9yeUxvbmdIb3N0KDB4MWU2ZTAwMDAsIDgpJjB4RjsKKworICAgIC8vc2V0IDFlNmUwMDA4WzMsMF0gdG8gMAorICAgIGlmIChkd1ZhbHVlKQorICAgIHsKKyAgICAgICAgV3JpdGVNZW1vcnlMb25nSG9zdCgweDFlNmUwMDAwLCAwLCAweGZjNjAwMzA5KTsKKyAgICAgICAgCisgICAgICAgIGk9MDsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgZHdWYWx1ZSA9IFJlYWRNZW1vcnlMb25nSG9zdCgweDFlNmUwMDAwLDApOworICAgICAgICB9d2hpbGUoKDEgIT0gZHdWYWx1ZSkmJiAoaTwxMCkpOworICAgICAgICAKKyAgICAgICAgaWYgKDEgIT0gZHdWYWx1ZSkKKyAgICAJeworICAgIAkJcHJpbnRmKCIweDFlNmUwMDAwIGlzIGxvY2tlZCIpOworICAgIAkJcmV0dXJuIFZJREVPX1VOTE9DS19GQUlMOworICAgIAl9CisgICAgfQorCisgICAgLy9vbmx5IGNsZWFyIDFlNmUwMDA4WzMsMF0KKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoMHgxZTZlMDAwMCwgOCwgMCwgMHhmKTsKKyAgICAKKyAgICBiQ2xpZW50ID0gMDsKKyAgICBpZiAoIWJDbGllbnQpCisgICAgeworICAgICAgICAvL1RvIHR1cm4gb24gY3J0LCBtdXN0IGJlIHRoZSBjbGllbnQgbW9kZQorICAgICAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoU0NVX0JBU0UsIFNDVV9IV19UUkFQUElOR19SRUcsIChCRV9DTElFTlRfQ0hJUCA8PCBDTElFTlRfTU9ERV9FTl9CSVQpLCBDTElFTlRfTU9ERV9FTl9NQVNLKTsKKyAgICAgICAgICAgIAorICAgICAgICBpUmV0ID0gQ1JUVGVzdCgpOworCisgICAgICAgIGlmIChpUmV0KQorICAgICAgICB7CisgICAgICAgICAgICAvL3RyYXBwaW5nIHRvIGhvc3QsIHRoZSBWc3luYyBvZiBDUlQgY2FuJ3Qgb3V0cHV0IGFuZCB0aGUgaG9zdCBkb2Vzbid0IGhhdmUgdmlkZW8gc3luYyBpbnB1dAorICAgICAgICAgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFNDVV9CQVNFLCBTQ1VfSFdfVFJBUFBJTkdfUkVHLCAoQkVfSE9TVF9DSElQIDw8IENMSUVOVF9NT0RFX0VOX0JJVCksIENMSUVOVF9NT0RFX0VOX01BU0spOworICAgICAgICAgICAgLy9yZXN0b3JlIHZhbHVlCisgICAgICAgICAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KDB4MWU2ZTAwMDAsIDgsIHVsUmVzdG9yZTEpOworICAgICAgICAgICAgLy9sb2NrIHJlZ2lzdGVyCisgICAgICAgICAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KDB4MWU2ZTAwMDAsIDAsIDB4MTIzNDU2NzgpOyAKKyAgICAgICAgICAgIHJldHVybiBWSURFT19URVNUX0ZBSUw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlSZXQgPSBDYXBUZXN0KCk7CisJCQorICAgICAgICBpZiAoaVJldCkKKyAgICAgICAgeworICAgICAgICAgICAgLy90cmFwcGluZyB0byBob3N0LCB0aGUgVnN5bmMgb2YgQ1JUIGNhbid0IG91dHB1dCBhbmQgdGhlIGhvc3QgZG9lc24ndCBoYXZlIHZpZGVvIHN5bmMgaW5wdXQKKyAgICAgICAgICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgU0NVX0hXX1RSQVBQSU5HX1JFRywgKEJFX0hPU1RfQ0hJUCA8PCBDTElFTlRfTU9ERV9FTl9CSVQpLCBDTElFTlRfTU9ERV9FTl9NQVNLKTsKKyAgICAgICAgICAgIC8vcmVzdG9yZSB2YWx1ZQorICAgICAgICAgICAgV3JpdGVNZW1vcnlMb25nSG9zdCgweDFlNmUwMDAwLCA4LCB1bFJlc3RvcmUxKTsKKyAgICAgICAgICAgIC8vbG9jayByZWdpc3RlcgorICAgICAgICAgICAgV3JpdGVNZW1vcnlMb25nSG9zdCgweDFlNmUwMDAwLCAwLCAweDEyMzQ1Njc4KTsgCisKKyAgICAgICAgICAgIHJldHVybiBWSURFT19URVNUX0ZBSUw7CisgICAgICAgIH0KKwkJLy9Xcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoU0NVX0JBU0UsIFNDVV9IV19UUkFQUElOR19SRUcsIChCRV9IT1NUX0NISVAgPDwgQ0xJRU5UX01PREVfRU5fQklUKSwgQ0xJRU5UX01PREVfRU5fTUFTSyk7CisgICAgfQorICAgIC8vdHJhcHBpbmcgdG8gaG9zdCwgdGhlIFZzeW5jIG9mIENSVCBjYW4ndCBvdXRwdXQgYW5kIHRoZSBob3N0IGRvZXNuJ3QgaGF2ZSB2aWRlbyBzeW5jIGlucHV0CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFNDVV9CQVNFLCBTQ1VfSFdfVFJBUFBJTkdfUkVHLCAoQkVfSE9TVF9DSElQIDw8IENMSUVOVF9NT0RFX0VOX0JJVCksIENMSUVOVF9NT0RFX0VOX01BU0spOworICAgIC8vcmVzdG9yZSB2YWx1ZQorICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoMHgxZTZlMDAwMCwgOCwgdWxSZXN0b3JlMSk7CisgICAgLy9sb2NrIHJlZ2lzdGVyCisgICAgV3JpdGVNZW1vcnlMb25nSG9zdCgweDFlNmUwMDAwLCAwLCAweDEyMzQ1Njc4KTsgCisjZW5kaWYKKworICAgIHJldHVybiBWSURFT19URVNUX09LOwkKK30KKyNlbmRpZiAvKiBDT05GSUdfU0xUICovCmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjMwMC92aWRlb3Rlc3QuaCBiL2JvYXJkL2FzcGVlZC9hc3QyMzAwL3ZpZGVvdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc5YjhkZDkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hc3BlZWQvYXN0MjMwMC92aWRlb3Rlc3QuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKy8qIFZpZGVvVGVzdC5oICovCisjaWZuZGVmIF9WSURFT1RFU1RfSF8KKyNkZWZpbmUgX1ZJREVPVEVTVF9IXworCisjZGVmaW5lIFZJREVPX1RFU1RfT0sgICAgICAgMAorI2RlZmluZSBWSURFT19URVNUX0ZBSUwgICAgIDEKKworI2RlZmluZSBWSURFT19VTkxPQ0tfRkFJTCAgIDEKKyNkZWZpbmUgVklERU9fRU5DT0RFX0ZBSUwgICAyCisjZGVmaW5lIFZJREVPX0RFQ09ERV9GQUlMICAgMworI2RlZmluZSBDUlRfRkFJTCAgICAgICAgICAgIDQKKworI2VuZGlmIC8qIF9WSURFT1RFU1RfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDIzMDAvdnJlZy5oIGIvYm9hcmQvYXNwZWVkL2FzdDIzMDAvdnJlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk3Mzg1NDgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hc3BlZWQvYXN0MjMwMC92cmVnLmgKQEAgLTAsMCArMSw4NDUgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2lmbmRlZiBfVlJFR19IXworI2RlZmluZSBfVlJFR19IXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICBDUlQgcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lICAgIENSVF9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwCisjZGVmaW5lICAgIFZHQV9HUkFQSF9CQVNFX0FERFJFU1MgICAgICAgICAgICAgIDB4NjAwMDAwCisjZGVmaW5lICAgIFZHQV9DVVJTT1JfQkFTRV9BRERSRVNTICAgICAgICAgICAgIDB4MzAwMDAwCisjZGVmaW5lICAgIFZHQV9PU0RfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgIDB4MzAwMDAwCisjZGVmaW5lICAgIFJHQl81NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICBSR0JfODg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgICAgWVVWXzQ0NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lCSAgIE5PX1NVUFBPUlRFRF9DUlRfRk1UCQkJCSAgIDB4MworI2RlZmluZSAgICBDUlRfTE9XX1RIUkVTSE9MRF9WQUxVRSAgICAgICAgICAgICAweDEyCisjZGVmaW5lICAgIENSVF9ISUdIX1RIUkVTSE9MRF9WQUxVRSAgICAgICAgICAgIDB4MUUKKworLy8gQVNUMzAwMCdzIFJlZ2lzdGVycyAKKyNpZmRlZiBXYXRjb20KKyNkZWZpbmUgICAgIFZJREVPQkFTRV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMAorI2Vsc2UKKyNkZWZpbmUgICAgIFZJREVPQkFTRV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZW5kaWYKKworI2RlZmluZSAgICAgS0VZX0NPTlRST0xfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIFZJREVPX0xPQ0tFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisgICAgI2RlZmluZSAgICAgVklERU9fVU5MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworLy8gUmVnaXN0ZXJzIGZvciB2aWRlbzEgYW5kIHZpZGVvMgorI2RlZmluZSAgICAgVklERU8xX0VOR0lORV9TRVFVRU5DRV9DT05UUk9MX1JFRyAgICAgICAgICAweDA0ICsgVklERU9CQVNFX09GRlNFVAorI2RlZmluZSAgICAgVklERU8yX0VOR0lORV9TRVFVRU5DRV9DT05UUk9MX1JFRyAgICAgICAgICAweDEwNCArIFZJREVPQkFTRV9PRkZTRVQKKyAgICAjZGVmaW5lICAgICBNT0RFX0RFVEVDVElPTl9UUklHR0VSICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgLy9CaXRbMF0gdHJpZ2dlciBIVyBhdXRvIG1vZGUgZGV0ZWN0aW9uCisgICAgI2RlZmluZSAgICAgVklERU9fQ0FQVFVSRV9UUklHR0VSICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIgIC8vQml0WzFdIHRyaWdnZXIgSFcgdG8gY2FwdHVyZSB2aWRlbworCSNkZWZpbmUJCUZPUkNFX0hXX0lETEVfTUFTSwkJCQkJCSgxPDwyKQkJLy9CaXRbMl0gRm9yY2UgZW5naW5lIGludG8gcmVhZHkoaWRsZSkgc3RhdGUKKwkJI2RlZmluZQkJRU5HSU5FX1JFU0VUCQkJCQkJKDA8PDIpCisJCSNkZWZpbmUJCUVOR0lORV9JRExFCQkJCQkJCSgxPDwyKQorICAgICNkZWZpbmUgICAgIFZJREVPX0NBUFRVUkVfQVVUT19NT0RFICAgICAgICAgICAgICAgICAweDAwMDAwMDA4ICAvL0JpdFszXQorICAgICAgICAjZGVmaW5lICAgICBDQVBUVVJFX0ZSQU1FX01PREUgICAgICAgICAgICAgICAgICAwCisgICAgICAgICNkZWZpbmUgICAgIENBUFRVUkVfQVVUT19NT0RFICAgICAgICAgICAgICAgICAgIDEKKwkJI2RlZmluZQkJQ0FQVFVSRV9BVVRPX01PREVfQklUCQkJCTMKKwkJI2RlZmluZQkJQ0FQVFVSRV9BVVRPX01PREVfTUFTSwkJCQkweDAwMDAwMDA4CisgICAgI2RlZmluZSAgICAgVklERU9fQ09ERUNfVFJJR0dFUiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAgIC8vQml0WzRdIHRyaWdnZXIgSFcgdG8gY29tcHJlc3Mgb3IgZGVjb21wcmVzcyB2aWRlbworICAgICAgICAjZGVmaW5lICAgICBDT0RFQ19UUklHR0VSX0JJVCAgICAgICAgICAgICAgICAgICA0CisgICAgICAgICNkZWZpbmUgICAgIENPREVDX1RSSUdHRVJfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyAgICAgICAgI2RlZmluZSAgICAgQ0xFQVJfQ09ERUNfVFJJR0dFUiAgICAgICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBFTl9DT0RFQ19UUklHR0VSICAgICAgICAgICAgICAgICAgICAxCisgICAgI2RlZmluZSAgICAgVklERU9fQ09ERUNfQVVUT19NT0RFICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAgIC8vQml0WzVdCisgICAgICAgICNkZWZpbmUgICAgIENPREVDX0ZSQU1FX01PREUgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgQ09ERUNfQVVUT19NT0RFICAgICAgICAgICAgICAgICAgICAgMQorCQkjZGVmaW5lCQlDT0RFQ19BVVRPX01PREVfQklUCQkJCQk1CisgICAgICAgICNkZWZpbmUgICAgIENPREVDX0FVVE9fTU9ERV9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKwkjZGVmaW5lCQlJTlNFUlRfRlVMTF9GUkFNRV9NQVNLCQkJCQkoMTw8NikJCS8vQml0WzZdIEluc2VydCBmdWxsIGZyYW1lIGNvbXByZXNzaW9uCisJCSNkZWZpbmUJCUlOU0VSVF9GVUxMX0ZSQU1FX0VOCQkJCSgxPDw2KQorCQkjZGVmaW5lCQlJTlNFUlRfRlVMTF9GUkFNRV9PRkYJCQkJKDA8PDYpCisgICAgI2RlZmluZSAgICAgV0FUQ0hfRE9HX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAgIC8vQml0WzddIFZpZGVvIEVuYWJsZSB3YXRjaCBkb2cgZm9yIG1vZGUgY2hhbmdlIGRldGVjdGlvbgorICAgICAgICAjZGVmaW5lICAgICBXQVRDSF9ET0dfRU5BQkxFX0JJVCAgICAgICAgICAgICAgICA3CisgICAgICAgICNkZWZpbmUgICAgIFdBVENIX0RPR19PRkYgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgV0FUQ0hfRE9HX0VOICAgICAgICAgICAgICAgICAgICAgICAgMQorICAgICAgICAjZGVmaW5lICAgICBXQVRDSF9ET0dfRU5fTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisgICAgI2RlZmluZSAgICAgVklERU9fQ1JUX1NFTEVDVElPTiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAgIC8vQml0WzhdCisgICAgICAgICNkZWZpbmUgICAgIENSVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgQ1JUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorICAgICNkZWZpbmUgICAgIEFOVElfVEVBUklOR19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwICAvL0JpdFs5XSBBbnRpLXRlYXJpbmcgbW9kZSBlbmFibGUgZm9yIGRlY29kaW5nCisgICAgICAgICNkZWZpbmUgICAgIEFOVElfVEVBUklOR19FTiAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAjZGVmaW5lICAgICBTVFJFQU1fREFUQV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMCAgLy9CaXRbMTE6MTBdIEJ1ZmZlciBhbmQgU3RyZWFtIERhdGEgdHlwZQorICAgICAgICAjZGVmaW5lICAgICBTVFJFQU1fREFUQV9NT0RFX0JJVCAgICAgICAgICAgICAgICAxMAorICAgICAgICAjZGVmaW5lICAgICBTVFJFQU1fREFUQV9NT0RFX01BU0sgICAgICAgICAgICAgICAweDAwMDAwQzAwCisgICAgICAgICNkZWZpbmUgICAgIFlVVjQ0NF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgWVVWNDIwX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgMQorICAgICAgICAjZGVmaW5lICAgICBZVVY0MjBfTU9ERV9XSVRIX0FTVDIwMDAgICAgICAgICAgICAyIC8vQVNUMjAwMCBjb21wYXRpYmxlCisgICAgI2RlZmluZSAgICAgVklERU9fQ0FQVFVSRV9SRUFEWSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAgIC8vQml0WzE2XSBWaWRlbyBjYXB0dXJlIHJlYWR5IHN0YXR1cyByZWFkIGJhY2socmVhZCBvbmx5KQorCQkjZGVmaW5lCQlDQVBUVVJFX1JFQURZX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwICAKKyAgICAgICAgI2RlZmluZSAgICAgSFdfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBIV19JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisgICAgI2RlZmluZSAgICAgVklERU9fQ09ERUNfUkVBRFkgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAgIC8vQml0WzE4XSBWaWRlbyBjb2RlYyByZWFkeSBzdGF0dXMgcmVhZCBiYWNrKHJlYWQgb25seSkKKwkJI2RlZmluZQkJQ09ERUNfUkVBRFlfTUFTSwkJCQkJMHgwMDA0MDAwMAorICAgICAgICAvLyNkZWZpbmUgICAgIEhXX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgLy8jZGVmaW5lICAgICBIV19JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisgICAgCisjZGVmaW5lICAgIFZJREVPMV9DT05UUk9MX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDggKyBWSURFT0JBU0VfT0ZGU0VUCisjZGVmaW5lICAgIFZJREVPMl9DT05UUk9MX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTA4ICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIFZJREVPX0hTWU5DX1BPTEFSSVRZICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFswXSBWaWRlbyBzb3VyY2UgaHN5bmMgcG9sYXJpdHkKKyAgICAgICAgI2RlZmluZSAgICAgVklERU9fSFNZTkNfUE9MQVJJVFlfQklUICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBOT19JTlZFUlNFX1BPTCAgICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgICNkZWZpbmUgICAgIElOVkVSU0VfUE9MCQkJCQkJCTEKKyAgICAjZGVmaW5lICAgICBWSURFT19WU1lOQ19QT0xBUklUWSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMiAgLy9CaXRbMV0gVmlkZW8gc291cmNlIHZzeW5jIHBvbGFyaXR5CisgICAgICAgICNkZWZpbmUgICAgIFZJREVPX1ZTWU5DX1BPTEFSSVRZX0JJVCAgICAgICAgICAgIDEgICAgICAgIAorICAgICAgICAvL1NldHRpbmcgZGVmaW5hdGlvbiB0aGUgc2FtZSBhcyBWSURFT19IU1lOQ19QT0xBUklUWQorICAgICNkZWZpbmUgICAgIFZJREVPX0VYVEVSTkFMX1NPVVJDRSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0ICAvL0JpdFsyXSBWaWRlbyBleHRlcm5hbCBzb3VyY2UKKyAgICAgICAgI2RlZmluZSAgICAgRVhURVJOQUxfU09VUkNFX0JJVCAgICAgICAgICAgICAgICAgMgorICAgICAgICAjZGVmaW5lICAgICBJTlRFUk5BTF9WR0FfU09VUkNFICAgICAgICAgICAgICAgICAwCisgICAgICAgICNkZWZpbmUgICAgIEVYVEVSTkFMX1ZHQV9TT1VSQ0UgICAgICAgICAgICAgICAgIDEKKyAgICAgICAgI2RlZmluZSAgICAgRVhURVJOQUxfU09VUkNFX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwMDAwNCAgICAgICAgICAgICAgICAgICAgIAorICAgICNkZWZpbmUgICAgIFZJREVPX0FOQUxPTkdfRVhURVJOQUxfU09VUkNFICAgICAgICAgICAweDAwMDAwMDA4ICAvL0JpdFszXSBWaWRlbyBBbmFsb2cgZXh0ZXJuYWwgc291cmNlCisgICAgICAgICNkZWZpbmUgICAgIEFOQUxPTkdfRVhURVJOQUxfU09VUkNFX0JJVCAgICAgICAgIDMKKyAgICAgICAgI2RlZmluZSAgICAgRFZJX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBBTkFMT0dfUkdCX1NPVVJDRSAgICAgICAgICAgICAgICAgICAxCisgICAgI2RlZmluZSAgICAgVklERU9fSU5URVJOQUxfVElNSU5HX0dFTiAgICAgICAgICAgICAgIDB4MDAwMDAwMTAgIC8vQml0WzRdIFZpZGVvIFVzZSBpbnRlcm5hbCB0aW1pbmcgZ2VuZXJhdG9yCisgICAgICAgICNkZWZpbmUgICAgIElOVEVSTkFMX1RJTUlOR19HRU5fQklUICAgICAgICAgICAgIDQKKyAgICAgICAgI2RlZmluZSAgICAgRVhURVJOQUxfREVfU0lHTkFMICAgICAgICAgICAgICAgICAgMCAvL0RWSSBvbmx5CisgICAgICAgICNkZWZpbmUgICAgIFZSMENfVlIxMF9ERV9TSU5HQUwgICAgICAgICAgICAgICAgIDEgLy91c2UgVlIwQyBhbmQgVlIxMCBmb3IgZ2VuZXJhdGUgVkRFIHNpZ25hbAorICAgIC8qKioqKiogICAgIFZpZGVvMiBPbmx5IGZyb20gREFDICAgICoqKioqKi8gICAgICAgIAorICAgICNkZWZpbmUgICAgIFZJREVPMV9DQVBUVVJFX0ZST00gICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwICAvL0JpdFs1XSBWaWRlbzEgY2FwdHVyZSBkYXRhIGRpcmVjdCBmcm9tIFZHQSBmcmFtZSBidWZmZXIoaW50ZXJuYWwgVkdBIG9ubHkpICAKKyAgICAgICAgI2RlZmluZSAgICAgRlJPTV9EQUNfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBGUk9NX0ZSQU1FX0JVRkZFUiAgICAgICAgICAgICAgICAgICAxICAgICAKKyAgICAjZGVmaW5lICAgICBXUklURV9EQVRBX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MCAgLy9CaXRbNzo2XSBXcml0ZSBkYXRhIGZvcm1hdAorICAgICAgICAjZGVmaW5lICAgICBXUklURV9EQVRBX0ZPUk1BVF9CSVQgICAgICAgICAgICAgICA2CisgICAgICAgICNkZWZpbmUgICAgIFdSVElFX0RBVEFfRk9STUFUX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwQzAKKyAgICAgICAgI2RlZmluZSAgICAgQ0NJUjYwMV8yX1lVVl9GT1JNQVQgICAgICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBGVUxMX1lVVl9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAxCisgICAgICAgICNkZWZpbmUgICAgIFJHQl9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKwkJI2RlZmluZSAgICAgVkdBX0NVUlNPUl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAgIC8vQml0WzhdIEV4dGVybmFsIHZpZGVvIHBvcnQgc2xlY3Rpb24KKyAgICAgICAgI2RlZmluZSAgICAgVkdBX0NVUlNPUl9OT1JNQUwgICAgICAgICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBWR0FfQ1VSU09SX09GRiAgICAgICAgICAgICAgICAgICAgICAxICAgIAorICAgICNkZWZpbmUgICAgIFZJREVPX0NBUFRVUkVfTElORUFSX01PREUgICAgICAgICAgICAgICAweDAwMDAwMjAwICAvL0JpdFs5XSBWSURFT19DQVBUVVJFX0xJTkVBUl9NT0RFCisgICAgICAgICNkZWZpbmUgICAgIExJTkVBUl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgVElMRV9NT0RFCQkgICAgICAgICAgICAgICAgICAgIDEJCQorICAgICNkZWZpbmUgICAgIFZJREVPX0NMT0NLX0RFTEFZICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwICAvL0JpdFsxMToxMF0gVmlkZW8gY2xvY2sgZGVsYXkgY29udHJvbAorICAgICAgICAjZGVmaW5lICAgICBWSURFT19DTE9DS19ERUxBWV9CSVQgICAgICAgICAgICAgICAxMAorICAgICAgICAjZGVmaW5lICAgICBWSURFT19DTE9DS19ERUxBWV9NQVNLICAgICAgICAgICAgICAweDAwMDAwQzAwCisgICAgICAgICNkZWZpbmUgICAgIERFTEFZXzBfTlMgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgREVMQVlfMV9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgMQorICAgICAgICAjZGVmaW5lICAgICBJTlZfQU5EX0RFTEFZXzBfTlMgICAgICAgICAgICAgICAgICAyCisgICAgICAgICNkZWZpbmUgICAgIElOVl9BTkRfREVMQVlfMV9OUyAgICAgICAgICAgICAgICAgIDMKKyAgICAjZGVmaW5lICAgICBWSURFT19DQ0lSNjU2X1NPVVJDRV9NT0RFICAgICAgICAgICAgICAgMHgwMDAwMTAwMCAgLy9CaXRbMTJdIFZpZGVvIENDSVI2NTYgc291cmNlIG1vZGUKKyAgICAgICAgI2RlZmluZSAgICAgUkdCX1NPVVJDRV9NT0RFICAgICAgICAgICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBDQ0lSNjU2X1NPVVJDRV9NT0RFICAgICAgICAgICAgICAgICAxCisgICAgI2RlZmluZSAgICAgU09VUkNFX1BPUlRfQ0xPQ0tfTU9ERSAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAgIC8vQml0WzEzXSBWaWRlbyBTb3VyY2UgcG9ydCBjbG9jayBtb2RlCisgICAgICAgICNkZWZpbmUgICAgIFNJTkdMRV9FREdFX01PREUgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgRFVBTF9FREdFX01PREUgICAgICAgICAgICAgICAgICAgICAgMQorICAgICNkZWZpbmUgICAgIEVYVEVSTkFMX1BPUlRfU0VMRUNUSU9OICAgICAgICAgICAgICAgICAweDAwMDA0MDAwICAvL0JpdFsxNF0gRXh0ZXJuYWwgdmlkZW8gcG9ydCBzbGVjdGlvbgorICAgICAgICAjZGVmaW5lICAgICBWSURFT19QT1JUX0EgICAgICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPX1BPUlRfQiAgICAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAjZGVmaW5lICAgICBWSURFT19DQVBUVVJFX0ZSQU1FX1JBVEUgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMjM6MTZdIFZpZGVvIGNhcHR1cmUgZnJhbWUgcmF0ZSBjb250cm9sCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPX0NBUFRVUkVfRlJBTUVfUkFURV9CSVQgICAgICAgIDE2CisgICAgICAgICNkZWZpbmUgICAgIFZJREVPX0NBUFRVUkVfRlJBTUVfUkFURV9NQVNLICAgICAgIDB4MDBGRjAwMDAgIC8vTWF4aW11bSBmcmFtZSByYXRlID0gWFggKiBTb3VyY2VGUFMgLyA2MAorCisjZGVmaW5lICAgIFZJREVPMV9USU1FSU5HX0dFTl9IT1JfUkVHICAgICAgICAgICAgICAgICAgIDB4MEMgKyBWSURFT0JBU0VfT0ZGU0VUCisjZGVmaW5lICAgIFZJREVPMl9USU1FSU5HX0dFTl9IT1JfUkVHICAgICAgICAgICAgICAgICAgIDB4MTBDICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIFZJREVPX0hERV9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwICAvL0JpdFsxMjowXSBWaWRlbyBIREUgRW5kIHRpbWluZyBnZW5lcmF0b3IKKyAgICAjZGVmaW5lICAgICBWSURFT19IREVfRU5EX0JJVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLy9OdW1iZXIgb2YgcGl4ZWxzIGZyb20gcmlzaW5nIGVkZ2Ugb2YgSHN5bmMgZm9yIGZpcnN0IGFjdGl2ZSBwaXhlbAorICAgICNkZWZpbmUgICAgIFZJREVPX0hERV9FTkRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxRkZGCisgICAgI2RlZmluZSAgICAgVklERU9fSERFX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAgIC8vQml0WzI4OjE2XSBWaWRlbyBIREUgU3RhcnQgdGltaW5nIGdlbmVyYXRvcgorICAgICNkZWZpbmUgICAgIFZJREVPX0hERV9TVEFSVF9CSVQgICAgICAgICAgICAgICAgICAgICAxNiAvL051bWJlciBvZiBwaXhlbHMgZnJvbSByaXNpbmcgZWRnZSBvZiBIc3luYyBmb3IgbGFzdCBhY3RpdmUgcGl4ZWwKKyAgICAjZGVmaW5lICAgICBWSURFT19IREVfU1RBUlRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgxRkZGMDAwMAorICAgICAgICAjZGVmaW5lICAgICBGUkFNRV9SQVRFX09GRiAgICAgICAgICAgICAgICAgICAgICAwICAgIAorICAgIAorI2RlZmluZSAgICBWSURFTzFfVElNRUlOR19HRU5fVl9SRUcgICAgICAgICAgICAgICAgICAgICAweDEwICsgVklERU9CQVNFX09GRlNFVAorI2RlZmluZSAgICBWSURFTzJfVElNRUlOR19HRU5fVl9SRUcgICAgICAgICAgICAgICAgICAgICAweDExMCArIFZJREVPQkFTRV9PRkZTRVQKKyAgICAjZGVmaW5lICAgICBWSURFT19WREVfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgLy9CaXRbMTE6MF0gVmlkZW8gVkRFIEVuZCB0aW1pbmcgZ2VuZXJhdG9yCisgICAgI2RlZmluZSAgICAgVklERU9fVkRFX0VORF9CSVQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8vTnVtYmVyIG9mIHBpeGVscyBmcm9tIHJpc2luZyBlZGdlIG9mIFZzeW5jIGZvciBmaXJzdCBhY3RpdmUgcGl4ZWwKKyAgICAjZGVmaW5lICAgICBWSURFT19WREVfRU5EX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMEZGRgorICAgICNkZWZpbmUgICAgIFZJREVPX1ZERV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwICAvL0JpdFsyNzoxNl0gVmlkZW8gVkRFIFN0YXJ0IHRpbWluZyBnZW5lcmF0b3IKKyAgICAjZGVmaW5lICAgICBWSURFT19WREVfU1RBUlRfQklUICAgICAgICAgICAgICAgICAgICAgMTYgLy9OdW1iZXIgb2YgcGl4ZWxzIGZyb20gcmlzaW5nIGVkZ2Ugb2YgVnN5bmMgZm9yIGxhc3QgYWN0aXZlIHBpeGVsCisgICAgI2RlZmluZSAgICAgVklERU9fVkRFX1NUQVJUX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MEZGRjAwMDAKKworI2RlZmluZSAgICBWSURFTzFfU0NBTEVfRkFDVE9SX1JFRyAgICAgICAgICAgICAgICAgICAgICAweDE0ICsgVklERU9CQVNFX09GRlNFVAorI2RlZmluZSAgICBWSURFTzJfU0NBTEVfRkFDVE9SX1JFRyAgICAgICAgICAgICAgICAgICAgICAweDExNCArIFZJREVPQkFTRV9PRkZTRVQKKyAgICAjZGVmaW5lICAgICBIT1JfU0NBTElOR19GQUNUT1IgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgLy9CaXRbMTU6MF0gVmlkZW8gSG9yaXpvbnRhbCBzY2FsaW5nIGZhY3RvcgorICAgICNkZWZpbmUgICAgIEhPUl9TQ0FMSU5HX0ZBQ1RPUl9CSVQgICAgICAgICAgICAgICAgICAwICAgLy9UaGUgZm9ybXVsYT00MDk2LyhIb3Jpem9udGFsIHNjYWxpbmcgZmFjb3RyKQorICAgICNkZWZpbmUgICAgIEhPUl9TQ0FMSU5HX0ZBQ1RPUl9NQVNLICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisgICAgI2RlZmluZSAgICAgVkVSX1NDQUxJTkdfRkFDVE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAgIC8vQml0WzMxOjE2XSBWaWRlbyBWZXJ0aWNhbCBzY2FsaW5nIGZhY3RvcgorICAgICNkZWZpbmUgICAgIFZFUl9TQ0FMSU5HX0ZBQ1RPUl9CSVQgICAgICAgICAgICAgICAgICAxNiAgIC8vVGhlIGZvcm11bGE9NDA5Ni8oVmVydGljYWwgc2NhbGluZyBmYWNvdHIpCisgICAgI2RlZmluZSAgICAgVkVSX1NDQUxJTkdfRkFDVE9SX01BU0sgICAgICAgICAgICAgICAgIDB4RkZGRjAwMDAKKworI2RlZmluZSAgICBWSURFTzFfU0NBTEVfRkFDVE9SX1BBUkFNRVRFUjBfUkVHICAgICAgICAgICAweDE4ICsgVklERU9CQVNFX09GRlNFVCAgLy9TY2FsaW5nIFBhcmFtZXRlcnMgRjAwLCBGMDEsIEYwMiwgRjAzCisjZGVmaW5lICAgIFZJREVPMl9TQ0FMRV9GQUNUT1JfUEFSQU1FVEVSMF9SRUcgICAgICAgICAgIDB4MTE4ICsgVklERU9CQVNFX09GRlNFVCAgIAorCisjZGVmaW5lICAgIFZJREVPMV9TQ0FMRV9GQUNUT1JfUEFSQU1FVEVSMV9SRUcgICAgICAgICAgIDB4MUMgKyBWSURFT0JBU0VfT0ZGU0VUICAvL1NjYWxpbmcgUGFyYW1ldGVycyBGMTAsIEYxMSwgRjEyLCBGMTMKKyNkZWZpbmUgICAgVklERU8yX1NDQUxFX0ZBQ1RPUl9QQVJBTUVURVIxX1JFRyAgICAgICAgICAgMHgxMUMgKyBWSURFT0JBU0VfT0ZGU0VUICAgCisKKyNkZWZpbmUgICAgVklERU8xX1NDQUxFX0ZBQ1RPUl9QQVJBTUVURVIyX1JFRyAgICAgICAgICAgMHgyMCArIFZJREVPQkFTRV9PRkZTRVQgIC8vU2NhbGluZyBQYXJhbWV0ZXJzIEYyMCwgRjIxLCBGMjIsIEYyMworI2RlZmluZSAgICBWSURFTzJfU0NBTEVfRkFDVE9SX1BBUkFNRVRFUjJfUkVHICAgICAgICAgICAweDEyMCArIFZJREVPQkFTRV9PRkZTRVQgICAKKworI2RlZmluZSAgICBWSURFTzFfU0NBTEVfRkFDVE9SX1BBUkFNRVRFUjNfUkVHICAgICAgICAgICAweDI0ICsgVklERU9CQVNFX09GRlNFVCAgLy9TY2FsaW5nIFBhcmFtZXRlcnMgRjMwLCBGMzEsIEYzMiwgRjMzCisjZGVmaW5lICAgIFZJREVPMl9TQ0FMRV9GQUNUT1JfUEFSQU1FVEVSM19SRUcgICAgICAgICAgIDB4MTI0ICsgVklERU9CQVNFX09GRlNFVAorCisjZGVmaW5lICAgIFZJREVPMV9CQ0RfQ09OVFJPTF9SRUcgICAgICAgICAgICAgICAgICAgICAgIDB4MkMgKyBWSURFT0JBU0VfT0ZGU0VUCisjZGVmaW5lICAgIFZJREVPMl9CQ0RfQ09OVFJPTF9SRUcgICAgICAgICAgICAgICAgICAgICAgIDB4MTJDICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIEJDRF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFswXSBFbmFibGUgYmxvY2sgY2hhbmdlIGRldGVjdGlvbihCQ0QpCisgICAgICAgICNkZWZpbmUgICAgIEJDRF9FTkFCTEVfQklUICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgQkNEX0VOQUJMRV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorICAgICNkZWZpbmUgICAgIEJDRF9UT0xFUkFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwICAvL0JpdFsyMzoxNl0KKyAgICAgICAgI2RlZmluZSAgICAgQkNEX1RPTEVSQU5DRV9CSVQgICAgICAgICAgICAgICAgICAgMTYgLy9mbGFnIGFzIGNoYW5nZWQgYmxvY2sgd2hlbiB0aGUgdmlkZW8gZGF0YSBkaWZmZXJlbmNlIGdyZWF0ZXIKKyAgICAgICAgI2RlZmluZSAgICAgQkNEX1RPTEVSQU5DRV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMEZGMDAwMAorCisjZGVmaW5lICAgICBWSURFTzFfQ0FQVFVSRV9XSU5ET1dTX1JFRyAgICAgICAgICAgICAgICAgIDB4MzAgKyBWSURFT0JBU0VfT0ZGU0VUCisjZGVmaW5lICAgICBWSURFTzJfQ0FQVFVSRV9XSU5ET1dTX1JFRyAgICAgICAgICAgICAgICAgIDB4MTMwICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIENBUFRVUkVfVkVSX0xJTkUJCQkJCQkweDAwMDAwMDAxICAvL0JpdFsxMDowXSBWaWRlbyBjb21wcmVzc2lvbiB2ZXJ0aWNhbCBsaW5lIHRvdGFsCisgICAgI2RlZmluZSAgICAgQ0FQVFVSRV9WRVJfTElORV9CSVQJCQkJCTAKKyAgICAjZGVmaW5lICAgICBDQVBUVVJFX1ZFUl9MSU5FX01BU0sJCQkJCTB4MDAwMDA3RkYKKyAgICAjZGVmaW5lICAgICBDQVBUVVJFX0hPUl9QSVhFTAkJCQkJCTB4MDAwMTAwMDAgIC8vQml0WzI2OjE2XSBWaWRlbyBjb21wcmVzc2lvbiB2ZXJ0aWNhbCBsaW5lIHRvdGFsCisgICAgI2RlZmluZSAgICAgQ0FQVFVSRV9IT1JfUElYRUxfQklUCQkJCQkxNgorICAgICNkZWZpbmUgICAgIENBUFRVUkVfSE9SX1BJWEVMX01BU0sJCQkJCTB4MDdGRjAwMDAKKworI2RlZmluZSAgICAgVklERU8xX0NPTVBSRVNTX1dJTkRPV1NfUkVHICAgICAgICAgICAgICAgICAweDM0ICsgVklERU9CQVNFX09GRlNFVAorI2RlZmluZSAgICAgVklERU8yX0NPTVBSRVNTX1dJTkRPV1NfUkVHICAgICAgICAgICAgICAgICAweDEzNCArIFZJREVPQkFTRV9PRkZTRVQKKyAgICAjZGVmaW5lICAgICBDT01QUkVTU19WRVJfTElORSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgLy9CaXRbMTA6MF0gVmlkZW8gY29tcHJlc3Npb24gdmVydGljYWwgbGluZSB0b3RhbAorICAgICNkZWZpbmUgICAgIENPTVBSRVNTX1ZFUl9MSU5FX0JJVCAgICAgICAgICAgICAgICAgICAwCisgICAgI2RlZmluZSAgICAgQ09NUFJFU1NfVkVSX0xJTkVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDA3RkYKKyAgICAjZGVmaW5lICAgICBDT01QUkVTU19IT1JfUElYRUwgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMjY6MTZdIFZpZGVvIGNvbXByZXNzaW9uIHZlcnRpY2FsIGxpbmUgdG90YWwKKyAgICAjZGVmaW5lICAgICBDT01QUkVTU19IT1JfUElYRUxfQklUICAgICAgICAgICAgICAgICAgMTYKKyAgICAjZGVmaW5lICAgICBDT01QUkVTU19IT1JfUElYRUxfTUFTSyAgICAgICAgICAgICAgICAgMHgwN0ZGMDAwMAorCisjZGVmaW5lICAgICBWSURFTzFfQ09NUFJFU1NfQlVGX1BST0NFU1NfT0ZGU0VUX1JFRyAgICAgIDB4MzgKKyNkZWZpbmUgICAgIFZJREVPMl9DT01QUkVTU19CVUZfUFJPQ0VTU19PRkZTRVRfUkVHICAgICAgMHgxMzgKKyAgICAjZGVmaW5lICAgICBDT01QUkVTU19CVUZfUFJPQ0VTU19PRkZTRVRfQUxJR04gICAgICAgMTI3IC8vMTI4IGJ5dGUgYWxpZ25tZW50CisgICAgI2RlZmluZSAgICAgQ09NUFJFU1NfQlVGX1BST0NFU1NfT0ZGU0VUX01BU0sgICAgICAgIDB4RkZGRkZGCisKKyNkZWZpbmUgICAgIFZJREVPMV9ERUNPTVBSRVNTX0JVRl9QUk9DRVNTX09GRlNFVF9SRUcgICAgMHgzOAorI2RlZmluZSAgICAgVklERU8yX0RFQ09NUFJFU1NfQlVGX1BST0NFU1NfT0ZGU0VUX1JFRyAgICAweDEzOAorICAgICNkZWZpbmUgICAgIERFQ09NUFJFU1NfQlVGX1BST0NFU1NfT0ZGU0VUX0FMSUdOICAgICAxMjcgLy8xMjggYnl0ZSBhbGlnbm1lbnQKKyAgICAjZGVmaW5lICAgICBERUNPTVBSRVNTX0JVRl9QUk9DRVNTX09GRlNFVF9NQVNLICAgICAgMHhGRkZGRkYKKworCisvL0ZvciBDb21wcmVzc2lvbgorI2RlZmluZSAgICAgVklERU8xX0NPTVBSRVNTX0JVRl9SRUFEX09GRlNFVF9SRUcgICAgICAgICAweDNDICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9Gb3Igc3RyZWFtIG1vZGUKKyNkZWZpbmUgICAgIFZJREVPMl9DT01QUkVTU19CVUZfUkVBRF9PRkZTRVRfUkVHICAgICAgICAgMHgxM0MgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgQ09NUFJFU1NfQlVGX1JFQURfT0ZGU0VUX0FMSUdOICAgICAgICAgIDEyNyAvLzEyOCBieXRlIGFsaWdubWVudAorICAgICNkZWZpbmUgICAgIENPTVBSRVNTX0JVRl9SRUFEX09GRlNFVF9NQVNLICAgICAgICAgICAweDAwRkZGRkZGCisvL0ZvciBEZWNvbXByZXNzaW9uCisjZGVmaW5lICAgICBWSURFTzFfREVDT01QUkVTU19CVUZfV1JJVEVfT0ZGU0VUX1JFRyAgICAgIDB4M0MgKyBWSURFT0JBU0VfT0ZGU0VUICAgICAvL0ZvciBzdHJlYW0gbW9kZSAKKyNkZWZpbmUgICAgIFZJREVPMl9ERUNPTVBSRVNTX0JVRl9XUklURV9PRkZTRVRfUkVHICAgICAgMHgxM0MgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgREVDT01QUkVTU19CVUZfV1JJVEVfT0ZGU0VUX0FMSUdOICAgICAgIDEyNyAvLzEyOCBieXRlIGFsaWdubWVudAorICAgICNkZWZpbmUgICAgIERFQ09NUFJFU1NfQlVGX1dSSVRFX09GRlNFVF9NQVNLICAgICAgICAweDAwRkZGRkZGCisKKyNkZWZpbmUgICAgIFZJREVPMV9DUkNfQlVGX0FERFJfUkVHICAgICAgICAgICAgICAgICAgICAgMHg0MCArIFZJREVPQkFTRV9PRkZTRVQKKyNkZWZpbmUgICAgIFZJREVPMl9DUkNfQlVGX0FERFJfUkVHICAgICAgICAgICAgICAgICAgICAgMHgxNDAgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgQ1JDX0JVRl9BRERSX0FMSUdOICAgICAgICAgICAgICAgICAgICAgIDcgICAvLzggYnl0ZSBhbGlnbm1lbnQKKyAgICAjZGVmaW5lICAgICBDUkNfQlVGX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwRkZGRkZGRgorCisjZGVmaW5lICAgICBWSURFTzFfQlVGXzFfQUREUl9SRUcgICAgICAgICAgICAgICAgICAgICAgIDB4NDQgKyBWSURFT0JBU0VfT0ZGU0VUICAgICAvL0ZvciBTb3VyY2UgQnVmZmVyIGluIGZyYW1lIG1vZGUKKyNkZWZpbmUgICAgIFZJREVPMl9CVUZfMV9BRERSX1JFRyAgICAgICAgICAgICAgICAgICAgICAgMHgxNDQgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgQlVGXzFfQUREUl9BTElHTiAgICAgICAgICAgICAgICAgICAgICAgIDI1NSAvLzI1NiBieXRlIGFsaWdubWVudAorICAgICNkZWZpbmUgICAgIEJVRl8xX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDFGRkZGRkZGCisKKyNkZWZpbmUgICAgIFZJREVPMV9CVUZfTElORV9PRkZTRVRfUkVHICAgICAgICAgICAgICAgICAgMHg0OCArIFZJREVPQkFTRV9PRkZTRVQgICAgIC8vTXVzdCBzZXQgYm90aCBpbiBGcmFtZS9TdHJlYW0gbW9kZQorI2RlZmluZSAgICAgVklERU8yX0JVRl9MSU5FX09GRlNFVF9SRUcgICAgICAgICAgICAgICAgICAweDE0OCArIFZJREVPQkFTRV9PRkZTRVQKKyAgICAjZGVmaW5lICAgICBCVUZfTElORV9PRkZTRVRfQUxJR04gICAgICAgICAgICAgICAgICAgNyAvLzggYnl0ZSBhbGlnbm1lbnQKKyAgICAjZGVmaW5lICAgICBCVUZfTElORV9PRkZTRVRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwM0ZGRgorCisjZGVmaW5lICAgICBWSURFTzFfQlVGXzJfQUREUl9SRUcgICAgICAgICAgICAgICAgICAgICAgIDB4NEMgKyBWSURFT0JBU0VfT0ZGU0VUICAgICAvL0ZvciBCQ0QgQnVmZmVyIGluIGZyYW1lIG1vZGUKKyNkZWZpbmUgICAgIFZJREVPMl9CVUZfMl9BRERSX1JFRyAgICAgICAgICAgICAgICAgICAgICAgMHgxNEMgKyBWSURFT0JBU0VfT0ZGU0VUICAgICAKKyAgICAjZGVmaW5lICAgICBCVUZfMl9BRERSX0FMSUdOICAgICAgICAgICAgICAgICAgICAgICAgMjU1IC8vMjU2IGJ5dGUgYWxpZ25tZW50CisgICAgI2RlZmluZSAgICAgQlVGXzJfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUZGRkZGRkYKKworI2RlZmluZSAgICAgVklERU8xX0ZMQUdfQlVGX0FERFJfUkVHICAgICAgICAgICAgICAgICAgICAweDUwICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9Gb3IgYmxvY2sgY2hhbmdlIGZsYWcgYnVmZmVyCisjZGVmaW5lICAgICBWSURFTzJfRkxBR19CVUZfQUREUl9SRUcgICAgICAgICAgICAgICAgICAgIDB4MTUwICsgVklERU9CQVNFX09GRlNFVCAgICAgCisgICAgI2RlZmluZSAgICAgRkxBR19CVUZfQUREUl9BTElHTiAgICAgICAgICAgICAgICAgICAgIDcgLy84IGJ5dGUgYWxpZ25tZW50CisgICAgI2RlZmluZSAgICAgRkxBR19CVUZfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MUZGRkZGRkYKKworI2RlZmluZSAgICAgVklERU8xX0NPTVBSRVNTX0JVRl9BRERSX1JFRyAgICAgICAgICAgICAgICAweDU0ICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9Gb3Igc3RyZWFtIG1vZGUKKyNkZWZpbmUgICAgIFZJREVPMl9DT01QUkVTU19CVUZfQUREUl9SRUcgICAgICAgICAgICAgICAgMHgxNTQgKyBWSURFT0JBU0VfT0ZGU0VUICAgICAKKyAgICAjZGVmaW5lICAgICBDT01QUkVTU19CVUZfQUREUl9BTElHTiAgICAgICAgICAgICAgICAgMTI3IC8vMTI4IGJ5dGUgYWxpZ25tZW50CisgICAgI2RlZmluZSAgICAgQ09NUFJFU1NfQlVGX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgIDB4MUZGRkZGRkYKKworI2RlZmluZSAgICAgVklERU8xX1NUUkVBTV9CVUZfU0laRSAgICAgICAgICAgICAgICAgICAgICAweDU4ICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9Gb3Igc3RyZWFtIG1vZGUgCisjZGVmaW5lICAgICBWSURFTzJfU1RSRUFNX0JVRl9TSVpFICAgICAgICAgICAgICAgICAgICAgIDB4MTU4ICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIFNUUkVBTV9QQUNLRVRfU0laRSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisgICAgICAgICNkZWZpbmUgICAgIFNUUkVBTV9QQUNLRVRfU0laRV9CSVQgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgU1RSRUFNX1BBQ0tFVF9TSVpFX01BU0sgICAgICAgICAgICAgMHgwMDAwMDAwNworICAgICAgICAjZGVmaW5lICAgICBQQUNLRVRfU0laRV8xS0IgICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgICNkZWZpbmUgICAgIFBBQ0tFVF9TSVpFXzJLQiAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAgICAgI2RlZmluZSAgICAgUEFDS0VUX1NJWkVfNEtCICAgICAgICAgICAgICAgICAgICAgMgorICAgICAgICAjZGVmaW5lICAgICBQQUNLRVRfU0laRV84S0IgICAgICAgICAgICAgICAgICAgICAzCisgICAgICAgICNkZWZpbmUgICAgIFBBQ0tFVF9TSVpFXzE2S0IgICAgICAgICAgICAgICAgICAgIDQKKyAgICAgICAgI2RlZmluZSAgICAgUEFDS0VUX1NJWkVfMzJLQiAgICAgICAgICAgICAgICAgICAgNQorICAgICAgICAjZGVmaW5lICAgICBQQUNLRVRfU0laRV82NEtCICAgICAgICAgICAgICAgICAgICA2CisgICAgICAgICNkZWZpbmUgICAgIFBBQ0tFVF9TSVpFXzEyOEtCICAgICAgICAgICAgICAgICAgIDcKKyAgICAjZGVmaW5lICAgICBSSU5HX0JVRl9QQUNLRVRfTlVNICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorICAgICAgICAjZGVmaW5lICAgICBSSU5HX0JVRl9QQUNLRVRfTlVNX0JJVCAgICAgICAgICAgICAzCisgICAgICAgICNkZWZpbmUgICAgIFJJTkdfQlVGX1BBQ0tFVF9OVU1fTUFTSyAgICAgICAgICAgIDB4MDAwMDAwMTgKKyAgICAgICAgI2RlZmluZSAgICAgUEFDS0VUU180ICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBQQUNLRVRTXzggICAgICAgICAgICAgICAgICAgICAgICAgICAxCisgICAgICAgICNkZWZpbmUgICAgIFBBQ0tFVFNfMTYgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyAgICAgICAgI2RlZmluZSAgICAgUEFDS0VUU18zMiAgICAgICAgICAgICAgICAgICAgICAgICAgMworICAgICNkZWZpbmUgICAgIFNLSVBfSElHSF9NQl9USFJFUyAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwICAvL0JpdFsyMjoxNl0gU2tpcCBoaWdoIHF1YWxpdHkgbWFjcm8gYmxvY2sgdGhyZXNob2xkCisgICAgICAgICNkZWZpbmUgICAgIFNLSVBfSElHSF9NQl9USFJFU19CSVQgICAgICAgICAgICAgIDE2CisgICAgICAgICNkZWZpbmUgICAgIFNLSVBfSElHSF9NQl9USFJFU19NQVNLICAgICAgICAgICAgIDB4MDA3RjAwMDAKKyAgICAjZGVmaW5lICAgICBTS0lQX1RFU1RfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwMDAwMCAgLy9CaXRbMjQ6MjNdIFNraXAgdGVzdCBtb2RlCisgICAgICAgICNkZWZpbmUgICAgIFNLSVBfVEVTVF9NT0RFX0JJVCAgICAgICAgICAgICAgICAgIDIzCisgICAgICAgICNkZWZpbmUgICAgIFNLSVBfVEVTVF9NT0RFX01BU0sgICAgICAgICAgICAgICAgIDB4MDE4MDAwMDAKKyAgICAgICAgI2RlZmluZSAgICAgWVVWX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgIC8vcmVjb21tZW5kCisKKyNkZWZpbmUgICAgIFZJREVPMV9CVUZfQ09ERUNfT0ZGU0VUX1JFQUQgICAgICAgICAgICAgICAgMHg1QyArIFZJREVPQkFTRV9PRkZTRVQgICAgIC8vRm9yIHN0cmVhbSBtb2RlLCAgICAgICAgIAorI2RlZmluZSAgICAgVklERU8yX0JVRl9DT0RFQ19PRkZTRVRfUkVBRCAgICAgICAgICAgICAgICAweDE1QyArIFZJREVPQkFTRV9PRkZTRVQgICAgLy9WaWRlbyBzdHJlYW0gYnVmZmVyIG9mZnNldCByZWFkIGJhY2soSFcpCisgICAgI2RlZmluZSAgICAgQlVGX0NPREVDX09GRlNFVF9BTElHTiAgICAgICAgICAgICAgICAgIDI1NSAvLzI1NiBieXRlIGFsaWdubWVudAorICAgICNkZWZpbmUgICAgIEJVRl9DT0RFQ19PRkZTRVRfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwRkZGRkZGCisKKyNkZWZpbmUgICAgIFZJREVPMV9DT01QUkVTU19DT05UUk9MX1JFRyAgICAgICAgICAgICAgICAgMHg2MCArIFZJREVPQkFTRV9PRkZTRVQKKyNkZWZpbmUgICAgIFZJREVPMl9DT01QUkVTU19DT05UUk9MX1JFRyAgICAgICAgICAgICAgICAgMHgxNjAgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgSlBFR19PTkxZX0VOQ09ERSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgIC8vQml0WzBdIEpQRUcgb25seSBlbmNvZGluZworICAgICAgICAjZGVmaW5lICAgICBKUEVHX09OTFlfQklUICAgICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgICNkZWZpbmUgICAgIEpQRUdfTUlYX01PREUgICAgICAgICAgICAgICAgICAgICAgIDAgICAvL0VuYWJsZSBKUEVHL1ZRIG1peCBtb2RlIGVuY29kaW5nCisgICAgICAgICNkZWZpbmUgICAgIEpQRUdfT05MWV9NT0RFICAgICAgICAgICAgICAgICAgICAgIDEgICAvL0pQRUcgZW5jb2RpbmcgbW9kZSBvbmx5CisgICAgI2RlZmluZSAgICAgVlFfNF9DT0xPUl9FTkNPREUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIgIC8vQml0WzFdIEVuYWJsZSA0IGNvbG9yIFZRIGVuY29kaW5nCisgICAgICAgICNkZWZpbmUgICAgIFZRXzRfQ09MT1JfQklUICAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAgICAgI2RlZmluZSAgICAgVlFfMV8yX0NPTE9SX01PREUgICAgICAgICAgICAgICAgICAgMCAgIC8vMSBhbmQgMiBjb2xvciBtb2RlIFZRIGVuY29kaW5nCisgICAgICAgICNkZWZpbmUgICAgIFZRXzRfQ09MT1JfTU9ERSAgICAgICAgICAgICAgICAgICAgIDEgICAvLzEsIDIgYW5kIDQgY29sb3IgVlEgZW5jb2RpbmcKKyAgICAjZGVmaW5lICAgICBRVUFMSVRZX0NPREVDX1NFVFRJTkcgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNCAgLy9CaXRbMl0gSGlnaCBhbmQgYmVzdCB2aWRlbyBxdWFsaXR5IGNvZGVjIG1vZGUgc2V0dGluZworICAgICAgICAjZGVmaW5lICAgICBRVUFMSVRZX0NPREVDX1NFVFRJTkdfQklUICAgICAgICAgICAyCisgICAgICAgICNkZWZpbmUgICAgIEpQRUdfQ09ERUNfTU9ERSAgICAgICAgICAgICAgICAgICAgIDAgICAvL25vdCBzdXBwb3J0ZWQgaW4gYmVzdCB2aWRlbyBxdWFsaXR5IG1vZGUKKyAgICAgICAgI2RlZmluZSAgICAgUVVBTlRJX0NPREVDX01PREUgICAgICAgICAgICAgICAgICAgMQorICAgICNkZWZpbmUgICAgIEpQRUdfRFVBTF9RVUFMSVRZX0VOICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4ICAvL0JpdFszXSBKUEVHIGR1YWwgcXVhbGl0eSBtb2RlCisgICAgICAgICNkZWZpbmUgICAgIEVOX0pQRUdfRFVBTF9RVUFMSVRZICAgICAgICAgICAgICAgIDEgICAvL2VuYWJsZShvbmx5IGZvciBub3JtYWwgdmlkZW8gcXVhbGl0eSBtb2RlKQorICAgICNkZWZpbmUgICAgIEJFU1RfUVVBTElUWV9FTiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwICAvL0JpdFs0XSBCZXN0IHF1YWxpdHkgdmlkZW8gbW9kZSBlbmFibGUKKyAgICAgICAgI2RlZmluZSAgICAgQkVTVF9RVUFMSVRZX0VOX0JJVCAgICAgICAgICAgICAgICAgNAorICAgICAgICAjZGVmaW5lICAgICBFTl9CRVNUX1FVQUxJVFkgICAgICAgICAgICAgICAgICAgICAxICAgLy9lbmFibGUob25seSBmb3IgcXVhbnRpemF0aW9uIGNvZGVjIG1vZGUpCisgICAgI2RlZmluZSAgICAgUkM0X0NSWVBUX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAgIC8vQml0WzVdIEVuYWJsZSBSQzQgZW5jcnlwdGlvbi9kZWNyeXB0aW9uCisJCSNkZWZpbmUJCVJDNF9DUllQVF9FTl9CSVQJCQkJCTUKKwkJI2RlZmluZSAgICAgUkM0X0NSWVBUX0VOX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorICAgICAgICAjZGVmaW5lICAgICBSQzRfQ1JZUFRfT04gICAgICAgICAgICAgICAgICAgICAgICAxICAgLy9lbmFibGUKKyAgICAjZGVmaW5lICAgICBOT1JNQUxfUVVBTlRJX0NIUk9NSV9UQUJMRSAgICAgICAgICAgICAgMHgwMDAwMDA0MCAgLy9CaXRbMTA6Nl0gTm9ybWFsIHZpZGVvIHF1YWxpdHkgbW9kZSBKUEVHIERDVCBjaHJvbWkgcXVhbnRpbmF0aW9uIHRhYmxlCisgICAgICAgICNkZWZpbmUgICAgIE5PUk1BTF9RVUFOVElfQ0hST01JX1RBQkxFX0JJVCAgICAgIDYKKyAgICAgICAgI2RlZmluZSAgICAgTk9STUFMX1FVQU5USV9DSFJPTUlfVEFCTEVfTUFTSyAgICAgMHgwMDAwMDdDMAorICAgICNkZWZpbmUgICAgIE5PUk1BTF9RVUFOVElfTFVNSV9UQUJMRSAgICAgICAgICAgICAgICAweDAwMDAwODAwICAvL0JpdFsxNToxMV0gTm9ybWFsIHZpZGVvIHF1YWxpdHkgbW9kZSBKUEVHIERDVCBsdW1pIHF1YW50aW5hdGlvbiB0YWJsZQorICAgICAgICAjZGVmaW5lICAgICBOT1JNQUxfUVVBTlRJX0xVTUlfVEFCTEVfQklUICAgICAgICAxMQorICAgICAgICAjZGVmaW5lICAgICBOT1JNQUxfUVVBTlRJX0xVTUlfVEFCTEVfTUFTSyAgICAgICAweDAwMDBGODAwCisgICAgI2RlZmluZSAgICAgSElHSF9RVUFMSVRZX0VOICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAgIC8vQml0WzE2XSBIaWdoIHZpZGVvIHF1YWxpdHkgbW9kZSBlbmFibGUKKyAgICAgICAgI2RlZmluZSAgICAgSElHSF9RVUFMSVRZX0VOX0JJVCAgICAgICAgICAgICAgICAgMTYKKyAgICAgICAgI2RlZmluZSAgICAgRU5fSElHSF9RVUFMSVRZICAgICAgICAgICAgICAgICAgICAgMSAgIC8vRW5hYmxlCisgICAgI2RlZmluZSAgICAgVVZfQ0lSNjU2X0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAgIC8vQml0WzE5XSBVViBmcm9tYXQKKyAgICAgICAgI2RlZmluZSAgICAgVVZfQ0lSNjU2X0ZPUk1BVF9CSVQgICAgICAgICAgICAgICAgMTkKKyAgICAgICAgI2RlZmluZSAgICAgVVNFX1VWX0NJUjY1NiAgICAgICAgICAgICAgICAgICAgICAgMSAgIC8vcmVjb21tYW5kCisgICAgI2RlZmluZSAgICAgSFVGRk1BTl9UQUJMRV9TRUxFQ1QgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAgIC8vQml0WzIwXSBKUEVHIEh1ZmZtYW4gdGFibGUgY29tYmluYXRpb24KKyAgICAgICAgI2RlZmluZSAgICAgRFVBTF9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgIC8vRHVhbCBZLCBVViB0YWJsZQorICAgICAgICAjZGVmaW5lICAgICBTSU5HTEVfVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAxICAgLy9TaW5nbGUgWSB0YWJsZQorICAgICAgICAjZGVmaW5lICAgICBTSU5HTEVfVVZfVEFCTEUgICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwICAvLzF4OiBTaW5nbGUgVVYgdGFibGUKKyAgICAjZGVmaW5lICAgICBISUdIX1FVQU5USV9DSFJPTUlfVEFCTEUgICAgICAgICAgICAgICAgMHgwMDQwMDAwMCAgLy9CaXRbMjY6MjJdIEhpZ2ggcXVhbGl0eSBKUEVHIERDVCBjaHJvbWkgcXVhbnRpemF0aW9uIHRhYmxlCisgICAgICAgICNkZWZpbmUgICAgIEhJR0hfUVVBTlRJX0NIUk9NSV9UQUJMRV9CSVQgICAgICAgIDIyCisgICAgICAgICNkZWZpbmUgICAgIEhJR0hfUVVBTlRJX0NIUk9NSV9UQUJMRV9NQVNLICAgICAgIDB4MDdDMDAwMDAgICAgICAgICAgICAgICAgCisgICAgI2RlZmluZSAgICAgSElHSF9ERVFVQU5USV9WQUxVRSAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDAgIC8vQml0WzI2OjIyXSBIaWdoIHF1YWxpdHkgZGUtcXVhbnRpemF0aW9uIHZhbHVlCisgICAgICAgICNkZWZpbmUgICAgIEhJR0hfREVRVUFOVElfVkFMVUVfQklUICAgICAgICAgICAgIDIyCisgICAgICAgICNkZWZpbmUgICAgIEhJR0hfREVRVUFOVElfVkFMVUVfTUFTSyAgICAgICAgICAgIDB4MDdDMDAwMDAgICAgICAgIAorICAgICNkZWZpbmUgICAgIEhJR0hfUVVBTlRJX0xVTUlfVEFCTEUgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwICAvL0JpdFszMToyN10gSGlnaCBxdWFsaXR5IEpQRUcgRENUIGx1bWkgcXVhbnRpemF0aW9uIHRhYmxlCisgICAgICAgICNkZWZpbmUgICAgIEhJR0hfUVVBTlRJX0xVTUlfVEFCTEVfQklUICAgICAgICAgIDI3CisgICAgICAgICNkZWZpbmUgICAgIEhJR0hfUVVBTlRJX0xVTUlfVEFCTEVfTUFTSyAgICAgICAgIDB4RjgwMDAwMDAKKyAgICAjZGVmaW5lICAgICBCRVNUX0RFUVVBTlRJX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMCAgLy9CaXRbMzE6MjddIEJlc3QgcXVhbGl0eSBkZS1xdWFudGl6YXRpb24gdmFsdWUKKyAgICAgICAgI2RlZmluZSAgICAgQkVTVF9ERVFVQU5USV9WQUxVRV9CSVQgICAgICAgICAgICAgMjcKKyAgICAgICAgI2RlZmluZSAgICAgQkVTVF9ERVFVQU5USV9WQUxVRV9NQVNLICAgICAgICAgICAgMHhGODAwMDAwMAorICAgICAgICAKKworI2RlZmluZSAgICAgVklERU8xX1FVQU5USV9UQUJMRV9MT1dfUkVHICAgICAgICAgICAgICAgICAweDY0ICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9NYXRjaCB3aXRoIDB4NjAgQml0WzEwOjZdLCBCaXRbMTU6MTFdCisjZGVmaW5lICAgICBWSURFTzJfUVVBTlRJX1RBQkxFX0xPV19SRUcgICAgICAgICAgICAgICAgIDB4MTY0ICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIFFVQU5USV9DSFJPTUlfVEFCTEVfTE9XICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFs0OjBdIE5vcm1hbCB2aWRlbyBsb3cgcXVhbGl0eSBibG9jayBjaHJvbWkgcXVhbnRpemF0aW9uIHRhYmxlCisgICAgICAgICNkZWZpbmUgICAgIFFVQU5USV9DSFJPTUlfVEFCTEVfTE9XX0JJVCAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgUVVBTlRJX0NIUk9NSV9UQUJMRV9MT1dfTUFTSyAgICAgICAgMHgwMDAwMDAxRgorICAgICNkZWZpbmUgICAgIFFVQU5USV9MVU1JX1RBQkxFX0xPVyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwICAvL0JpdFs5OjVdIE5vcm1hbCB2aWRlbyBsb3cgcXVhbGl0eSBibG9jayBsdW1pIHF1YW50aXphdGlvbiB0YWJsZQorICAgICAgICAjZGVmaW5lICAgICBRVUFOVElfTFVNSV9UQUJMRV9MT1dfQklUICAgICAgICAgICA1CisgICAgICAgICNkZWZpbmUgICAgIFFVQU5USV9MVU1JX1RBQkxFX0xPV19NQVNLICAgICAgICAgIDB4MDAwMDAzRTAKKworI2RlZmluZSAgICAgVklERU8xX1FVQU5USV9WQUxVRV9SRUcgICAgICAgICAgICAgICAgICAgICAweDY4ICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9NYXRjaCB3aXRoIDB4NjAgQml0WzI2OjIyXSxCaXRbMzE6MjddCisjZGVmaW5lICAgICBWSURFTzJfUVVBTlRJX1ZBTFVFX1JFRyAgICAgICAgICAgICAgICAgICAgIDB4MTY4ICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIEhJR0hfUVVBTlRJX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFsxNDowXSBIaWdoIHF1YWxpdHkgcXVhbnRpemF0aW9uIHZhbHVlLiBGb3JtYXQgaXMgMS4xNAorICAgICAgICAjZGVmaW5lICAgICBISUdIX1FVQU5USV9WQUxVRV9CSVQgICAgICAgICAgICAgICAwCisgICAgICAgICNkZWZpbmUgICAgIEhJR0hfUVVBTlRJX1ZBTFVFX01BU0sgICAgICAgICAgICAgIDB4MDAwMDdGRkYKKyAgICAjZGVmaW5lICAgICBCRVNUX1FVQU5USV9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMzA6MTZdIEJlc3QgcXVhbGl0eSBxdWFudGl6YXRpb24gdmFsdWUuIEZvcm1hdCBpcyAxLjE0CisgICAgICAgICNkZWZpbmUgICAgIEJFU1RfUVVBTlRJX1ZBTFVFX0JJVCAgICAgICAgICAgICAgIDE2CisgICAgICAgICNkZWZpbmUgICAgIEJFU1RfUVVBTlRJX1ZBTFVFX01BU0sgICAgICAgICAgICAgIDB4N0ZGRjAwMDAKKyAgICAKKyNkZWZpbmUgICAgIFZJREVPMV9CU0RfUEFSQV9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgMHg2QyArIFZJREVPQkFTRV9PRkZTRVQgICAgLy9WaWRlbyBCU0QgUGFyYW1ldGVycyBSZWdpc3RlciAgICAKKyNkZWZpbmUgICAgIFZJREVPMl9CU0RfUEFSQV9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNkMgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgQlNEX0hJR0hfVEhSRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgIC8vQml0Wzc6MF0gQmxvY2sgc2hhcnBuZXNzIGRldGVjdGlvbiBoaWdoIHRocmVzaG9sZAorICAgICNkZWZpbmUgICAgIEJTRF9ISUdIX1RIUkVTX0JJVCAgICAgICAgICAgICAgICAgICAgICAwCisgICAgI2RlZmluZSAgICAgQlNEX0hJR0hfVEhSRVNfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKKyAgICAjZGVmaW5lICAgICBCU0RfTE9XX1RIUkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMCAgLy9CaXRbMTU6OF0gQmxvY2sgc2hhcHJwbmVzcyBkZXRlY3Rpb24gbG93IHRocmVzaG9sZAorICAgICNkZWZpbmUgICAgIEJTRF9MT1dfVEhSRVNfQklUICAgICAgICAgICAgICAgICAgICAgICA4CisgICAgI2RlZmluZSAgICAgQlNEX0xPV19USFJFU19NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGMDAKKyAgICAjZGVmaW5lICAgICBCU0RfSElHSF9DT1VOVFMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMjE6MTZdIEJsb2NrIHNoYXJwbmVzcyBkZXRlY3Rpb24gaGlnaCBjb3VudHMgdGhyZXNob2xkCisgICAgI2RlZmluZSAgICAgQlNEX0hJR0hfQ09VTlRTX0JJVCAgICAgICAgICAgICAgICAgICAgIDE2CisgICAgI2RlZmluZSAgICAgQlNEX0hJR0hfQ09VTlRTX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAzRjAwMDAKKyAgICAjZGVmaW5lICAgICBCU0RfTE9XX0NPVU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMCAgLy9CaXRbMjc6MjJdIEJsb2NrIHNoYXJwbmVzcyBkZXRlY3Rpb24gbG93IGNvdW50cyB0aHJlc2hvbGQKKyAgICAjZGVmaW5lICAgICBCU0RfTE9XX0NPVU5UU19CSVQgICAgICAgICAgICAgICAgICAgICAgMjIKKyAgICAjZGVmaW5lICAgICBCU0RfTE9XX0NPVU5UU19NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwRkMwMDAwMAorCisjZGVmaW5lIFZJREVPMV9DT01QUkVTU19GUkFNRV9TSVpFX1JFRyAgICAgICAgICAgICAgICAgIDB4NzAgKyBWSURFT0JBU0VfT0ZGU0VUCisjZGVmaW5lIFZJREVPMl9DT01QUkVTU19GUkFNRV9TSVpFX1JFRyAgICAgICAgICAgICAgICAgIDB4MTcwICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIENPTVBSRVNTX0ZSQU1FX1NJWkVfUkVBRCAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFsxOTowXSBWaWRlbyBjb21wcmVzc2lvbiBmcmFtZSBzaXplIHJlYWQgYmFjayhudW1iZXIgb2YgRFcpCisgICAgI2RlZmluZSAgICAgQ09NUFJFU1NfRlJBTUVfU0laRV9SRUFEX0JJVCAgICAgICAgICAgIDAKKyAgICAjZGVmaW5lICAgICBDT01QUkVTU19GUkFNRV9TSVpFX1JFQURfTUFTSyAgICAgICAgICAgMHgwMDNGRkZGRgorCisjZGVmaW5lICAgICBWSURFTzFfQ09NUFJFU1NfQkxPQ0tfQ09VTlRfUkVHICAgICAgICAgICAgIDB4NzQgKyBWSURFT0JBU0VfT0ZGU0VUCisjZGVmaW5lICAgICBWSURFTzJfQ09NUFJFU1NfQkxPQ0tfQ09VTlRfUkVHICAgICAgICAgICAgIDB4MTc0ICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIFBST0NFU1NfQkxPQ0tfQ09VTlRfUkVBRF9CSVQgICAgICAgICAgICAwCisgICAgI2RlZmluZSAgICAgUFJPQ0VTU19CTE9DS19DT1VOVF9SRUFEX01BU0sJCQkweDAwMDAzRkZGCS8vQml0WzEzOjBdIFZpZGVvIHByb2Nlc3NlZCB0b3RhbCBibG9jayBjb3VudGVyIHJlYWQgYmFjayhudW1iZXIgb2YgYmxvY2tzKQorICAgICNkZWZpbmUgICAgIENPTVBSRVNTX0JMT0NLX0NPVU5UX1JFQURfQklUICAgICAgICAgICAxNgorICAgICNkZWZpbmUgICAgIENPTVBSRVNTX0JMT0NLX0NPVU5UX1JFQURfTUFTSyAgICAgICAgICAweEZGRkYwMDAwCS8vQml0WzI5OjE2XSBWaWRlbyBwcm9jZXNzZWQgdG90YWwgYmxvY2sgY291bnRlciByZWFkIGJhY2sobnVtYmVyIG9mIGJsb2NrcykKKworI2RlZmluZSAgICAgVklERU8xX0NPTVBSRVNTX0ZSQU1FX0VORF9SRUFEICAgICAgICAgICAgICAweDc4ICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9WaWRlbyBjb21wcmVzc2lvbiBzdHJlYW0gZnJhbWUgZW5kIHBvaW50ZXIgICAgCisjZGVmaW5lICAgICBWSURFTzJfQ09NUFJFU1NfRlJBTUVfRU5EX1JFQUQgICAgICAgICAgICAgIDB4MTc4ICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIENPTVBSRVNTX0ZSQU1FX0VORF9SRUFEX0FMSUdOICAgICAgICAgICA3CisgICAgI2RlZmluZSAgICAgQ09NUFJFU1NfRlJBTUVfRU5EX1JFQURfTUFTSyAgICAgICAgICAgIDB4MDBGRkZGRkYKKworI2RlZmluZSAgICAgVklERU8xX0NPTVBSRVNTX0ZSQU1FX0NPVU5UX1JFQUQgICAgICAgICAgICAweDdDICsgVklERU9CQVNFX09GRlNFVCAgICAgCisjZGVmaW5lICAgICBWSURFTzJfQ09NUFJFU1NfRlJBTUVfQ09VTlRfUkVBRCAgICAgICAgICAgIDB4MTdDICsgVklERU9CQVNFX09GRlNFVCAKKyAgICAjZGVmaW5lICAgICBDT01QUkVTU19GUkFNRV9DT1VOVF9SRUFEICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgLy9CaXRbMTU6MF0gVmlkZW8gY29tcHJlc3Npb24gZnJhbWUgY291bnQgcmVhZCBiYWNrKG51bWJlciBvZiBmcmFtZSkKKyAgICAjZGVmaW5lICAgICBDT01QUkVTU19GUkFNRV9DT1VOVF9SRUFEX0JJVCAgICAgICAgICAgMAorICAgICNkZWZpbmUgICAgIENPTVBSRVNTX0ZSQU1FX0NPVU5UX1JFQURfTUFTSyAgICAgICAgICAweEZGRkZGRkZGCisKKyNkZWZpbmUgICAgIFZJREVPMV9VU0VSX0RFRklORV9IRUFERVIgICAgICAgICAgICAgICAgICAgMHg4MCArIFZJREVPQkFTRV9PRkZTRVQKKyNkZWZpbmUgICAgIFZJREVPMl9VU0VSX0RFRklORV9IRUFERVIgICAgICAgICAgICAgICAgICAgMHgxODAgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgVVNFUl9ERUZJTkVfSEVBREVSICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgIC8vQml0WzE1OjBdIFZpZGVvIHVzZXIgZGVmaW5lZCBoZWFkZXIgcGFyYW1ldGVyCisgICAgI2RlZmluZSAgICAgVVNFUl9ERUZJTkVfSEVBREVSX0JJVCAgICAgICAgICAgICAgICAgIDAKKyAgICAjZGVmaW5lICAgICBVU0VSX0RFRklORV9IRUFERVJfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorICAgIAorI2RlZmluZSAgICAgVklERTFfTU9ERV9ERVRFQ1RJT05fRURHRV9IX1JFRyAgICAgICAgICAgICAweDkwICsgVklERU9CQVNFX09GRlNFVAorI2RlZmluZSAgICAgVklERTJfTU9ERV9ERVRFQ1RJT05fRURHRV9IX1JFRyAgICAgICAgICAgICAweDE5MCArIFZJREVPQkFTRV9PRkZTRVQKKyAgICAjZGVmaW5lICAgICBMRUZUX0VER0VfTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgLy9CaXRbMTE6MF0gVmlkZW8gc291cmNlIGxlZnQgZWRnZSBsb2NhdGlvbiBmcm9tIHN5bmMgcmlzaW5nIGVkZ2UKKyAgICAjZGVmaW5lICAgICBMRUZUX0VER0VfTE9DQVRJT05fQklUICAgICAgICAgICAgICAgICAgMAorICAgICNkZWZpbmUgICAgIExFRlRfRURHRV9MT0NBVElPTl9NQVNLICAgICAgICAgICAgICAgICAweDAwMDAwRkZGCisJI2RlZmluZQkJTk9fVkVSX1NZTkMJCQkJCQkJCSgxIDw8IDEyKQkJLy9CaXRbMTJdIE5vIFZlcnRpY2FsIHN5bmMgZGV0ZWN0ZWQKKwkjZGVmaW5lCQlOT19IT1JfU1lOQwkJCQkJCQkJKDEgPDwgMTMpCQkvL0JpdFsxM10gTm8gaG9yaXpvbnRhbCBzeW5jIGRldGVjdGVkCisJI2RlZmluZQkJTk9fQUNUSVZFX0RJU1AJCQkJCQkJKDEgPDwgMTQpCQkvL0JpdFsxNF0gTm8gYWN0aXZlIGRpc3BsYXkgZGV0ZWN0ZWQKKwkjZGVmaW5lCQlOT19ESVNQX0NMT0NLCQkJCQkJCSgxIDw8IDE1KQkJCisgICAgI2RlZmluZSAgICAgUklHSFRfRURHRV9MT0NBVElPTiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAgIC8vQml0WzI3OjE2XSBWaWRlbyBzb3VyY2UgcmlnaHQgZWRnZSBsb2NhdGlvbiBmcm9tIHN5bmMgcmlzaW5nIGVkZ2UKKyAgICAjZGVmaW5lICAgICBSSUdIVF9FREdFX0xPQ0FUSU9OX0JJVCAgICAgICAgICAgICAgICAgMTYKKyAgICAjZGVmaW5lICAgICBSSUdIVF9FREdFX0xPQ0FUSU9OX01BU0sgICAgICAgICAgICAgICAgMHgwRkZGMDAwMAorCisjZGVmaW5lICAgICBWSURFMV9NT0RFX0RFVEVDVElPTl9FREdFX1ZfUkVHICAgICAgICAgICAgIDB4OTQgKyBWSURFT0JBU0VfT0ZGU0VUCisjZGVmaW5lICAgICBWSURFMl9NT0RFX0RFVEVDVElPTl9FREdFX1ZfUkVHICAgICAgICAgICAgIDB4MTk0ICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIFRPUF9FREdFX0xPQ0FUSU9OICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFsxMTowXSBWaWRlbyBzb3VyY2UgdG9wIGVkZ2UgbG9jYXRpb24gZnJvbSBzeW5jIHJpc2luZyBlZGdlCisgICAgI2RlZmluZSAgICAgVE9QX0VER0VfTE9DQVRJT05fQklUICAgICAgICAgICAgICAgICAgIDAKKyAgICAjZGVmaW5lICAgICBUT1BfRURHRV9MT0NBVElPTl9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMEZGRgorICAgICNkZWZpbmUgICAgIEJPVFRPTV9FREdFX0xPQ0FUSU9OICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwICAvL0JpdFsyNzoxNl0gVmlkZW8gc291cmNlIGJvdHRvbSBlZGdlIGxvY2F0aW9uIGZyb20gc3luYyByaXNpbmcgZWRnZQorICAgICNkZWZpbmUgICAgIEJPVFRPTV9FREdFX0xPQ0FUSU9OX0JJVCAgICAgICAgICAgICAgICAxNgorICAgICNkZWZpbmUgICAgIEJPVFRPTV9FREdFX0xPQ0FUSU9OX01BU0sgICAgICAgICAgICAgICAweDBGRkYwMDAwCisKKyNkZWZpbmUgVklERU8xX01PREVfREVURUNUSU9OX1NUQVRVU19SRUFEX1JFRyAgICAgICAgICAgMHg5OCArIFZJREVPQkFTRV9PRkZTRVQKKyNkZWZpbmUgVklERU8yX01PREVfREVURUNUSU9OX1NUQVRVU19SRUFEX1JFRyAgICAgICAgICAgMHgxOTggKyBWSURFT0JBU0VfT0ZGU0VUICAgIAorICAgICNkZWZpbmUgICAgIE1PREVfREVURUNUSU9OX0hPUl9USU1FX1JFQUQgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFsxMTowXSBNb2RlIGRldGVjdGlvbiBIb3Jpem9udGFsIHRpbWUgcmVhZCBiYWNrIChyZWFkIG9ubHkpCisgICAgI2RlZmluZSAgICAgTU9ERV9ERVRFQ1RJT05fSE9SX1RJTUVfUkVBRF9CSVQgICAgICAgIDAKKyAgICAjZGVmaW5lICAgICBNT0RFX0RFVEVDVElPTl9IT1JfVElNRV9SRUFEX01BU0sgICAgICAgMHgwMDAwMEZGRgorICAgICNkZWZpbmUgICAgIEFOQUxPTkdfRElHSVRBTF9SRUFEICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwICAvL0JpdFsxMl0gQXV0byBkZXRlY3Rpb24gZm9yIGV4dGVybmFsIGFuYWxvZyBvciBkaWdpdGFsIHNvdXJjZSByZWFkIGJhY2sKKyAgICAgICAgI2RlZmluZSAgICAgQU5BTE9OR19ESUdJVEFMX1JFQURfQklUICAgICAgICAgICAgMTIKKyAgICAgICAgI2RlZmluZSAgICAgRFZJX1NJR05BTCAgICAgICAgICAgICAgICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBBRENfU0lHTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAxCisgICAgI2RlZmluZSAgICAgTU9ERV9ERVRFQ1RJT05fSE9SX1NUQUJMRV9SRUFEICAgICAgICAgIDB4MDAwMDIwMDAgIC8vQml0WzEzXSBNb2RlIGRldGVjdGlvbiBob3Jpem9udGFsIHN0YWJsZSByZWFkIGJhY2sKKyAgICAgICAgI2RlZmluZSAgICAgSE9SX1NUQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMQorICAgICNkZWZpbmUgICAgIE1PREVfREVURUNUSU9OX1ZFUl9TVEFCTEVfUkVBRCAgICAgICAgICAweDAwMDA0MDAwICAvL0JpdFsxNF0gTW9kZSBkZXRlY3Rpb24gdmVydGljYWwgc3RhYmxlIHJlYWQgYmFjaworICAgICAgICAjZGVmaW5lICAgICBWRVJfU1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAxCisgICAgI2RlZmluZSAgICAgT1VUX0xPQ0tfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAgIC8vQml0WzE1XSBNb2RlIGRldGVjdGlvbiBvdXQgb2YgbG9jayByZWFkIGJhY2sKKyAgICAgICAgI2RlZmluZSAgICAgU0lHTkFMX09VVF9MT0NLICAgICAgICAgICAgICAgICAgICAgMQorICAgICNkZWZpbmUgICAgIE1PREVfREVURUNUSU9OX1ZFUl9MSU5FX1JFQUQgICAgICAgICAgICAweDAwMDEwMDAwICAvL0JpdFsyNzoxNl0gTW9kZSBkZXRlY3Rpb24gVmVydGljYWwgbGluZXMgcmVhZCBiYWNrCisgICAgI2RlZmluZSAgICAgTU9ERV9ERVRFQ1RJT05fVkVSX0xJTkVfUkVBRF9CSVQgICAgICAgIDE2CisgICAgI2RlZmluZSAgICAgTU9ERV9ERVRFQ1RJT05fVkVSX0xJTkVfUkVBRF9NQVNLICAgICAgIDB4MEZGRjAwMDAKKyAgICAjZGVmaW5lICAgICBWU1lOQ19QT0xBUklUWV9SRUFEICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMCAgLy9CaXRbMjhdIFZzeW5jIHBvbGFyaXR5IHJlYWQgYmFjaworICAgICNkZWZpbmUgICAgIEhTWU5DX1BPTEFSSVRZX1JFQUQgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwICAvL0JpdFsyOV0gSHN5bmMgcG9sYXJpdHkgcmVhZCBiYWNrCisgICAgI2RlZmluZSAgICAgTU9ERV9ERVRFQ1RJT05fVlNZTkNfUkVBRFkgICAgICAgICAgICAgIDB4NDAwMDAwMDAgIC8vQml0WzMwXSBNb2RlIGRldGVjdGlvbiBWc3luYyByZWFkeQorICAgICNkZWZpbmUgICAgIE1PREVfREVURUNUSU9OX0hTWU5DX1JFQURZICAgICAgICAgICAgICAweDgwMDAwMDAwICAvL0JpdFszMV0gTW9kZSBkZXRlY3Rpb24gSHN5bmMgcmVhZHkKKworLyoqKioqKiAgICAgVklERU8gTUVNQUdFUiBTRVRUSU5HICAgICAgICAgICAgICAgKioqKioqLworI2RlZmluZSAgICAgVklERU9NX0VOR0lORV9TRVFVRU5DRV9DT05UUk9MX1JFRyAgICAgICAgICAweDIwNCArIFZJREVPQkFTRV9PRkZTRVQKKyAgICAjZGVmaW5lICAgICBWSURFT01fQ0FQVFVSRV9UUklHR0VSICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMiAgLy9CaXRbMV0gdHJpZ2dlciBIVyB0byBjYXB0dXJlIHZpZGVvCisgICAgI2RlZmluZSAgICAgVklERU9NX0FVVE9fTU9ERQkJCQkJCTB4MDAwMDAwMDggIC8vQml0WzNdCisgICAgICAgICNkZWZpbmUgICAgIERJU0FCTEVfQVVUT19NT0RFICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgQVVUT19DT01QUkVTUwkJCQkJCTEKKyAgICAjZGVmaW5lICAgICBWSURFT01fQ09ERUNfVFJJR0dFUiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMCAgLy9CaXRbNF0gdHJpZ2dlciBIVyB0byBjb21wcmVzcyBvciBkZWNvbXByZXNzIHZpZGVvCisgICAgI2RlZmluZSAgICAgVklERU9NX1NPVVJDRV9TRUxFQ1RJT04gICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAgIC8vQml0WzhdCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorICAgIC8vI2RlZmluZSAgICAgU1RSRUFNX0RBVEFfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAgIC8vQml0WzExOjEwXSBCdWZmZXIgYW5kIFN0cmVhbSBEYXRhIHR5cGUKKyAgICAvLyAgICAjZGVmaW5lICAgICBTVFJFQU1fREFUQV9NT0RFX0JJVCAgICAgICAgICAgICAgICAxMAorICAgIC8vICAgICNkZWZpbmUgICAgIFNUUkVBTV9EQVRBX01PREVfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMDBDMDAKKyAgICAvLyAgICAjZGVmaW5lICAgICBZVVY0NDRfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAwCisgICAgLy8gICAgI2RlZmluZSAgICAgWVVWNDIwX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgMQorICAgIC8vICAgICNkZWZpbmUgICAgIFlVVjQyMF9NT0RFX1dJVEhfQVNUMjAwMCAgICAgICAgICAgIDIgLy9BU1QyMDAwIGNvbXBhdGlibGUKKyAgICAjZGVmaW5lICAgICBWSURFT01fQ0FQVFVSRV9SRUFEWSAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMTZdIFZpZGVvIGNhcHR1cmUgcmVhZHkgc3RhdHVzIHJlYWQgYmFjayhyZWFkIG9ubHkpCisgICAgICAgIC8vI2RlZmluZSAgICAgSFdfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorICAgICAgICAvLyNkZWZpbmUgICAgIEhXX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAjZGVmaW5lICAgICBWSURFT01fQ09ERUNfUkVBRFkgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMCAgLy9CaXRbMThdIFZpZGVvIGNvZGVjIHJlYWR5IHN0YXR1cyByZWFkIGJhY2socmVhZCBvbmx5KQorICAgICAgICAvLyNkZWZpbmUgICAgIEhXX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgLy8jZGVmaW5lICAgICBIV19JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgICAgVklERU9NX1NDQUxFX0ZBQ1RPUl9SRUcgICAgICAgICAgICAgICAgICAgICAgMHgyMTQgKyBWSURFT0JBU0VfT0ZGU0VUCisvLyAgICAjZGVmaW5lICAgICBIT1JfU0NBTElOR19GQUNUT1IgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgLy9CaXRbMTU6MF0gVmlkZW8gSG9yaXpvbnRhbCBzY2FsaW5nIGZhY3RvcgorLy8gICAgI2RlZmluZSAgICAgSE9SX1NDQUxJTkdfRkFDVE9SX0JJVCAgICAgICAgICAgICAgICAgIDAgICAvL1RoZSBmb3JtdWxhPTQwOTYvKEhvcml6b250YWwgc2NhbGluZyBmYWNvdHIpCisvLyAgICAjZGVmaW5lICAgICBIT1JfU0NBTElOR19GQUNUT1JfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorLy8gICAgI2RlZmluZSAgICAgVkVSX1NDQUxJTkdfRkFDVE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAgIC8vQml0WzMxOjE2XSBWaWRlbyBWZXJ0aWNhbCBzY2FsaW5nIGZhY3RvcgorLy8gICAgI2RlZmluZSAgICAgVkVSX1NDQUxJTkdfRkFDVE9SX0JJVCAgICAgICAgICAgICAgICAgIDE2ICAgLy9UaGUgZm9ybXVsYT00MDk2LyhWZXJ0aWNhbCBzY2FsaW5nIGZhY290cikKKy8vICAgICNkZWZpbmUgICAgIFZFUl9TQ0FMSU5HX0ZBQ1RPUl9NQVNLICAgICAgICAgICAgICAgICAweEZGRkYwMDAwCisKKyNkZWZpbmUgICAgVklERU9NX1NDQUxFX0ZBQ1RPUl9QQVJBTUVURVIwX1JFRyAgICAgICAgICAgMHgyMTggKyBWSURFT0JBU0VfT0ZGU0VUICAvL1NjYWxpbmcgUGFyYW1ldGVycyBGMDAsIEYwMSwgRjAyLCBGMDMKKworI2RlZmluZSAgICBWSURFT01fU0NBTEVfRkFDVE9SX1BBUkFNRVRFUjFfUkVHICAgICAgICAgICAweDIxQyArIFZJREVPQkFTRV9PRkZTRVQgIC8vU2NhbGluZyBQYXJhbWV0ZXJzIEYxMCwgRjExLCBGMTIsIEYxMworCisjZGVmaW5lICAgIFZJREVPTV9TQ0FMRV9GQUNUT1JfUEFSQU1FVEVSMl9SRUcgICAgICAgICAgIDB4MjIwICsgVklERU9CQVNFX09GRlNFVCAgLy9TY2FsaW5nIFBhcmFtZXRlcnMgRjIwLCBGMjEsIEYyMiwgRjIzCisKKyNkZWZpbmUgICAgVklERU9NX1NDQUxFX0ZBQ1RPUl9QQVJBTUVURVIzX1JFRyAgICAgICAgICAgMHgyMjQgKyBWSURFT0JBU0VfT0ZGU0VUICAvL1NjYWxpbmcgUGFyYW1ldGVycyBGMzAsIEYzMSwgRjMyLCBGMzMKKworI2RlZmluZSAgICBWSURFT01fQkNEX0NPTlRST0xfUkVHICAgICAgICAgICAgICAgICAgICAgICAweDIyQyArIFZJREVPQkFTRV9PRkZTRVQKKyAgICAvLyNkZWZpbmUgICAgIEJDRF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFswXSBFbmFibGUgYmxvY2sgY2hhbmdlIGRldGVjdGlvbihCQ0QpCisgICAgLy8jZGVmaW5lICAgICBCQ0RfVE9MRVJBTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMjM6MTZdCisgICAgLy8gICAgI2RlZmluZSAgICAgQkNEX1RPTEVSQU5DRV9CSVQgICAgICAgICAgICAgICAgICAgMTYgLy9mbGFnIGFzIGNoYW5nZWQgYmxvY2sgd2hlbiB0aGUgdmlkZW8gZGF0YSBkaWZmZXJlbmNlIGdyZWF0ZXIKKyAgICAvLyAgICAjZGVmaW5lICAgICBCQ0RfVE9MRVJBTkNFX01BU0sgICAgICAgICAgICAgICAgICAweDAwRkYwMDAwCisKKyNkZWZpbmUgICAgIFZJREVPTV9DQVBUVVJFX1dJTkRPV1NfUkVHICAgICAgICAgICAgICAgICAgMHgyMzAgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgLy8jZGVmaW5lICAgICBSQzRfVEFCTEVfQUREUl9BTElHTiAgICAgICAgICAgICAgICAgICAgNyAgIC8vOCBieXRlIGFsaWdubWVudAorICAgIC8vI2RlZmluZSAgICAgUkM0X1RBQkxFX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MEZGRkZGRkYKKworI2RlZmluZSAgICAgVklERU9NX0NPTVBSRVNTX1dJTkRPV1NfUkVHICAgICAgICAgICAgICAgICAweDIzNCArIFZJREVPQkFTRV9PRkZTRVQKKyAgICAvLyNkZWZpbmUgICAgIENPTVBSRVNTX1ZFUl9MSU5FICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFsxMjowXSBWaWRlbyBjb21wcmVzc2lvbiB2ZXJ0aWNhbCBsaW5lIHRvdGFsCisgICAgLy8jZGVmaW5lICAgICBDT01QUkVTU19WRVJfTElORV9CSVQgICAgICAgICAgICAgICAgICAgMAorICAgIC8vI2RlZmluZSAgICAgQ09NUFJFU1NfVkVSX0xJTkVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDFGRkYKKyAgICAvLyNkZWZpbmUgICAgIENPTVBSRVNTX0hPUl9QSVhFTCAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwICAvL0JpdFsxMjowXSBWaWRlbyBjb21wcmVzc2lvbiB2ZXJ0aWNhbCBsaW5lIHRvdGFsCisgICAgLy8jZGVmaW5lICAgICBDT01QUkVTU19IT1JfUElYRUxfQklUICAgICAgICAgICAgICAgICAgMTYKKyAgICAvLyNkZWZpbmUgICAgIENPTVBSRVNTX0hPUl9QSVhFTF9NQVNLICAgICAgICAgICAgICAgICAweDFGRkYwMDAwCisKKyNkZWZpbmUgICAgIFZJREVPTV9DT01QUkVTU19CVUZfUFJPQ0VTU19PRkZTRVRfUkVHICAgICAgMHgyMzgKKyAgICAvLyNkZWZpbmUgICAgIENPTVBSRVNTX0JVRl9QUk9DRVNTX09GRlNFVF9BTElHTiAgICAgICAxMjcgLy8xMjggYnl0ZSBhbGlnbm1lbnQKKyAgICAvLyNkZWZpbmUgICAgIENPTVBSRVNTX0JVRl9QUk9DRVNTX09GRlNFVF9NQVNLICAgICAgICAweDNGRkZGRgorCisKKy8vRm9yIENvbXByZXNzaW9uCisjZGVmaW5lICAgICBWSURFT01fQ09NUFJFU1NfQlVGX1JFQURfT0ZGU0VUX1JFRyAgICAgICAgIDB4MjNDICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9Gb3Igc3RyZWFtIG1vZGUKKyAgICAvLyNkZWZpbmUgICAgIENPTVBSRVNTX0JVRl9SRUFEX09GRlNFVF9BTElHTiAgICAgICAgICAxMjcgLy8xMjggYnl0ZSBhbGlnbm1lbnQKKyAgICAvLyNkZWZpbmUgICAgIENPTVBSRVNTX0JVRl9SRUFEX09GRlNFVF9NQVNLICAgICAgICAgICAweDAwM0ZGRkZGCisvL0ZvciBEZWNvbXByZXNzaW9uCisjZGVmaW5lICAgICBWSURFT01fREVDT01QUkVTU19CVUZfV1JJVEVfT0ZGU0VUX1JFRyAgICAgIDB4MjNDICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9Gb3Igc3RyZWFtIG1vZGUgCisgICAgLy8jZGVmaW5lICAgICBERUNPTVBSRVNTX0JVRl9XUklURV9PRkZTRVRfQUxJR04gICAgICAgMTI3IC8vMTI4IGJ5dGUgYWxpZ25tZW50CisgICAgLy8jZGVmaW5lICAgICBERUNPTVBSRVNTX0JVRl9XUklURV9PRkZTRVRfTUFTSyAgICAgICAgMHgwMDNGRkZGRgorICAgIAorI2RlZmluZSAgICAgVklERU9NX0JVRl8xX0FERFJfUkVHICAgICAgICAgICAgICAgICAgICAgICAweDI0NCArIFZJREVPQkFTRV9PRkZTRVQgICAgIC8vRm9yIFNvdXJjZSBCdWZmZXIgaW4gZnJhbWUgbW9kZQorICAgIC8vI2RlZmluZSAgICAgQlVGXzFfQUREUl9BTElHTiAgICAgICAgICAgICAgICAgICAgICAgIDI1NSAvLzI1NiBieXRlIGFsaWdubWVudAorICAgIC8vI2RlZmluZSAgICAgQlVGXzFfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEZGRkZGRkYKKworI2RlZmluZSAgICAgVklERU9NX0JVRl9MSU5FX09GRlNFVF9SRUcgICAgICAgICAgICAgICAgICAweDI0OCArIFZJREVPQkFTRV9PRkZTRVQgICAgIC8vTXVzdCBzZXQgYm90aCBpbiBGcmFtZS9TdHJlYW0gbW9kZQorICAgIC8vI2RlZmluZSAgICAgQlVGX0xJTkVfT0ZGU0VUX0FMSUdOICAgICAgICAgICAgICAgICAgIDcgLy84IGJ5dGUgYWxpZ25tZW50CisgICAgLy8jZGVmaW5lICAgICBCVUZfTElORV9PRkZTRVRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwM0ZGRgorCisjZGVmaW5lICAgICBWSURFT01fQlVGXzJfQUREUl9SRUcgICAgICAgICAgICAgICAgICAgICAgIDB4MjRDICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9Gb3IgQkNEIEJ1ZmZlciBpbiBmcmFtZSBtb2RlCisgICAgLy8jZGVmaW5lICAgICBCVUZfMl9BRERSX0FMSUdOICAgICAgICAgICAgICAgICAgICAgICAgMjU1IC8vMjU2IGJ5dGUgYWxpZ25tZW50CisgICAgLy8jZGVmaW5lICAgICBCVUZfMl9BRERSX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRkZGRkZGRgorCisjZGVmaW5lICAgICBWSURFT01fRkxBR19CVUZfQUREUl9SRUcgICAgICAgICAgICAgICAgICAgIDB4MjUwICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9Gb3IgYmxvY2sgY2hhbmdlIGZsYWcgYnVmZmVyCisgICAgLy8jZGVmaW5lICAgICBGTEFHX0JVRl9BRERSX0FMSUdOICAgICAgICAgICAgICAgICAgICAgNyAvLzggYnl0ZSBhbGlnbm1lbnQKKyAgICAvLyNkZWZpbmUgICAgIEZMQUdfQlVGX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDBGRkZGRkZGCisKKyNkZWZpbmUgICAgIFZJREVPTV9DT01QUkVTU19CVUZfQUREUl9SRUcgICAgICAgICAgICAgICAgMHgyNTQgKyBWSURFT0JBU0VfT0ZGU0VUICAgICAvL0ZvciBzdHJlYW0gbW9kZQorICAgIC8vI2RlZmluZSAgICAgRkxBR19CVUZfQUREUl9BTElHTiAgICAgICAgICAgICAgICAgICAgIDcgLy84IGJ5dGUgYWxpZ25tZW50CisgICAgLy8jZGVmaW5lICAgICBGTEFHX0JVRl9BRERSX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwRkZGRkZGRgorICAgIAorI2RlZmluZSAgICAgVklERU9NX0JVRl9DT0RFQ19PRkZTRVRfUkVBRCAgICAgICAgICAgICAgICAweDI1QyArIFZJREVPQkFTRV9PRkZTRVQgICAgIC8vRm9yIHN0cmVhbSBtb2RlLCAgICAgICAgIAorICAgIC8vI2RlZmluZSAgICAgQlVGX0NPREVDX09GRlNFVF9BTElHTiAgICAgICAgICAgICAgICAgIDI1NSAvLzI1NiBieXRlIGFsaWdubWVudAorICAgIC8vI2RlZmluZSAgICAgQlVGX0NPREVDX09GRlNFVF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAzRkZGRkYKKyAgICAKKyNkZWZpbmUgICAgIFZJREVPTV9DT01QUkVTU19DT05UUk9MX1JFRyAgICAgICAgICAgICAgICAgMHgyNjAgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgLy8jZGVmaW5lICAgICBKUEVHX09OTFlfRU5DT0RFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgLy9CaXRbMF0gSlBFRyBvbmx5IGVuY29kaW5nCisgICAgLy8gICAgI2RlZmluZSAgICAgSlBFR19NSVhfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgMCAgIC8vRW5hYmxlIEpQRUcvVlEgbWl4IG1vZGUgZW5jb2RpbmcKKyAgICAvLyAgICAjZGVmaW5lICAgICBKUEVHX09OTFlfTU9ERSAgICAgICAgICAgICAgICAgICAgICAxICAgLy9KUEVHIGVuY29kaW5nIG1vZGUgb25seQorICAgIC8vI2RlZmluZSAgICAgVlFfNF9DT0xPUl9FTkNPREUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIgIC8vQml0WzFdIEVuYWJsZSA0IGNvbG9yIFZRIGVuY29kaW5nCisgICAgLy8gICAgI2RlZmluZSAgICAgVlFfMV8yX0NPTE9SX01PREUgICAgICAgICAgICAgICAgICAgMCAgIC8vMSBhbmQgMiBjb2xvciBtb2RlIFZRIGVuY29kaW5nCisgICAgLy8gICAgI2RlZmluZSAgICAgVlFfNF9DT0xPUl9NT0RFICAgICAgICAgICAgICAgICAgICAgMSAgIC8vMSwgMiBhbmQgNCBjb2xvciBWUSBlbmNvZGluZworICAgIC8vI2RlZmluZSAgICAgUVVBTElUWV9DT0RFQ19TRVRUSU5HICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQgIC8vQml0WzJdIEhpZ2ggYW5kIGJlc3QgdmlkZW8gcXVhbGl0eSBjb2RlYyBtb2RlIHNldHRpbmcKKyAgICAvLyAgICAjZGVmaW5lICAgICBKUEVHX0NPREVDX01PREUgICAgICAgICAgICAgICAgICAgICAwICAgLy9ub3Qgc3VwcG9ydGVkIGluIGJlc3QgdmlkZW8gcXVhbGl0eSBtb2RlCisgICAgLy8gICAgI2RlZmluZSAgICAgUVVBTlRJX0NPREVDX01PREUgICAgICAgICAgICAgICAgICAgMQorICAgIC8vI2RlZmluZSAgICAgSlBFR19EVUFMX1FVQUxJVFlfRU4gICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDggIC8vQml0WzNdIEpQRUcgZHVhbCBxdWFsaXR5IG1vZGUKKyAgICAvLyAgICAjZGVmaW5lICAgICBFTl9KUEVHX0RVQUxfUVVBTElUWSAgICAgICAgICAgICAgICAxICAgLy9lbmFibGUob25seSBmb3Igbm9ybWFsIHZpZGVvIHF1YWxpdHkgbW9kZSkKKyAgICAvLyNkZWZpbmUgICAgIEJFU1RfUVVBTElUWV9FTiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwICAvL0JpdFs0XSBCZXN0IHF1YWxpdHkgdmlkZW8gbW9kZSBlbmFibGUKKyAgICAvLyAgICAjZGVmaW5lICAgICBFTl9CRVNUX1FVQUxJVFkgICAgICAgICAgICAgICAgICAgICAxICAgLy9lbmFibGUob25seSBmb3IgcXVhbnRpemF0aW9uIGNvZGVjIG1vZGUpCisgICAgLy8jZGVmaW5lICAgICBSQzRfQ1JZUFRfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMCAgLy9CaXRbNV0gRW5hYmxlIFJDNCBlbmNyeXB0aW9uL2RlY3J5cHRpb24KKyAgICAvLyAgICAjZGVmaW5lICAgICBFTl9SQzRfQ1JZUFQgICAgICAgICAgICAgICAgICAgICAgICAxICAgLy9lbmFibGUKKyAgICAvLyNkZWZpbmUgICAgIE5PUk1BTF9RVUFOVElfQ0hST01JX1RBQkxFICAgICAgICAgICAgICAweDAwMDAwMDQwICAvL0JpdFsxMDo2XSBOb3JtYWwgdmlkZW8gcXVhbGl0eSBtb2RlIEpQRUcgRENUIGNocm9taSBxdWFudGluYXRpb24gdGFibGUKKyAgICAvLyAgICAjZGVmaW5lICAgICBOT1JNQUxfUVVBTlRJX0NIUk9NSV9UQUJMRV9CSVQgICAgICA2CisgICAgLy8gICAgI2RlZmluZSAgICAgTk9STUFMX1FVQU5USV9DSFJPTUlfVEFCTEVfTUFTSyAgICAgMHgwMDAwMDdDMAorICAgIC8vI2RlZmluZSAgICAgTk9STUFMX1FVQU5USV9MVU1JX1RBQkxFICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAgIC8vQml0WzE1OjExXSBOb3JtYWwgdmlkZW8gcXVhbGl0eSBtb2RlIEpQRUcgRENUIGx1bWkgcXVhbnRpbmF0aW9uIHRhYmxlCisgICAgLy8gICAgI2RlZmluZSAgICAgTk9STUFMX1FVQU5USV9MVU1JX1RBQkxFX0JJVCAgICAgICAgMTEKKyAgICAvLyAgICAjZGVmaW5lICAgICBOT1JNQUxfUVVBTlRJX0xVTUlfVEFCTEVfTUFTSyAgICAgICAweDAwMDBGODAwCisgICAgLy8jZGVmaW5lICAgICBISUdIX1FVQUxJVFlfRU4gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMTZdIEhpZ2ggdmlkZW8gcXVhbGl0eSBtb2RlIGVuYWJsZQorICAgIC8vICAgICNkZWZpbmUgICAgIEVOX0hJR0hfUVVBTElUWSAgICAgICAgICAgICAgICAgICAgIDEgICAvL0VuYWJsZQorICAgIC8vI2RlZmluZSAgICAgVVZfQ0lSNjU2X0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAgIC8vQml0WzE5XSBVViBmcm9tYXQKKyAgICAvLyAgICAjZGVmaW5lICAgICBVU0VfVVZfQ0lSNjU2ICAgICAgICAgICAgICAgICAgICAgICAxICAgLy9yZWNvbW1hbmQKKyAgICAvLyNkZWZpbmUgICAgIEhVRkZNQU5fVEFCTEVfU0VMRUNUICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwICAvL0JpdFsyMF0gSlBFRyBIdWZmbWFuIHRhYmxlIGNvbWJpbmF0aW9uCisgICAgLy8gICAgI2RlZmluZSAgICAgRFVBTF9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgIC8vRHVhbCBZLCBVViB0YWJsZQorICAgIC8vICAgICNkZWZpbmUgICAgIFNJTkdMRV9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIDEgICAvL1NpbmdsZSBZIHRhYmxlCisgICAgLy8gICAgI2RlZmluZSAgICAgU0lOR0xFX1VWX1RBQkxFICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMCAgLy8xeDogU2luZ2xlIFVWIHRhYmxlCisgICAgLy8jZGVmaW5lICAgICBISUdIX1FVQU5USV9DSFJPTUlfVEFCTEUgICAgICAgICAgICAgICAgMHgwMDQwMDAwMCAgLy9CaXRbMjY6MjJdIEhpZ2ggcXVhbGl0eSBKUEVHIERDVCBjaHJvbWkgcXVhbnRpemF0aW9uIHRhYmxlCisgICAgLy8gICAgI2RlZmluZSAgICAgSElHSF9RVUFOVElfQ0hST01JX1RBQkxFX0JJVCAgICAgICAgMjIKKyAgICAvLyAgICAjZGVmaW5lICAgICBISUdIX1FVQU5USV9DSFJPTUlfVEFCTEVfTUFTSyAgICAgICAweDA3QzAwMDAwICAgICAgICAgICAgICAgIAorICAgIC8vI2RlZmluZSAgICAgSElHSF9ERVFVQU5USV9WQUxVRSAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDAgIC8vQml0WzI2OjIyXSBIaWdoIHF1YWxpdHkgZGUtcXVhbnRpemF0aW9uIHZhbHVlCisgICAgLy8gICAgI2RlZmluZSAgICAgSElHSF9ERVFVQU5USV9WQUxVRV9CSVQgICAgICAgICAgICAgMjIKKyAgICAvLyAgICAjZGVmaW5lICAgICBISUdIX0RFUVVBTlRJX1ZBTFVFX01BU0sgICAgICAgICAgICAweDA3QzAwMDAwICAgICAgICAKKyAgICAvLyNkZWZpbmUgICAgIEhJR0hfUVVBTlRJX0xVTUlfVEFCTEUgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwICAvL0JpdFszMToyN10gSGlnaCBxdWFsaXR5IEpQRUcgRENUIGx1bWkgcXVhbnRpemF0aW9uIHRhYmxlCisgICAgLy8gICAgI2RlZmluZSAgICAgSElHSF9RVUFOVElfTFVNSV9UQUJMRV9CSVQgICAgICAgICAgMjcKKyAgICAvLyAgICAjZGVmaW5lICAgICBISUdIX1FVQU5USV9MVU1JX1RBQkxFX01BU0sgICAgICAgICAweEY4MDAwMDAwCisgICAgLy8jZGVmaW5lICAgICBCRVNUX0RFUVVBTlRJX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMCAgLy9CaXRbMzE6MjddIEJlc3QgcXVhbGl0eSBkZS1xdWFudGl6YXRpb24gdmFsdWUKKyAgICAvLyAgICAjZGVmaW5lICAgICBCRVNUX1FVQU5USV9WQUxVRV9CSVQgICAgICAgICAgICAgICAyNworICAgIC8vICAgICNkZWZpbmUgICAgIEJFU1RfUVVBTlRJX1ZBTFVFX01BU0sgICAgICAgICAgICAgIDB4RjgwMDAwMDAKKyAgICAKKyNkZWZpbmUgICAgIFZJREVPTV9RVUFOVElfVEFCTEVfTE9XX1JFRyAgICAgICAgICAgICAgICAgMHgyNjQgKyBWSURFT0JBU0VfT0ZGU0VUICAgICAvL01hdGNoIHdpdGggMHg2MCBCaXRbMTA6Nl0sIEJpdFsxNToxMV0KKy8vICAgICNkZWZpbmUgICAgIFFVQU5USV9DSFJPTUlfVEFCTEVfTE9XICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFs0OjBdIE5vcm1hbCB2aWRlbyBsb3cgcXVhbGl0eSBibG9jayBjaHJvbWkgcXVhbnRpemF0aW9uIHRhYmxlCisvLyAgICAgICAgI2RlZmluZSAgICAgUVVBTlRJX0NIUk9NSV9UQUJMRV9MT1dfQklUICAgICAgICAgMAorLy8gICAgICAgICNkZWZpbmUgICAgIFFVQU5USV9DSFJPTUlfVEFCTEVfTE9XX01BU0sgICAgICAgIDB4MDAwMDAwMUYKKy8vICAgICNkZWZpbmUgICAgIFFVQU5USV9MVU1JX1RBQkxFX0xPVyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwICAvL0JpdFs5OjVdIE5vcm1hbCB2aWRlbyBsb3cgcXVhbGl0eSBibG9jayBsdW1pIHF1YW50aXphdGlvbiB0YWJsZQorLy8gICAgICAgICNkZWZpbmUgICAgIFFVQU5USV9DSFJPTUlfVEFCTEVfTE9XX0JJVCAgICAgICAgIDUKKy8vICAgICAgICAjZGVmaW5lICAgICBRVUFOVElfQ0hST01JX1RBQkxFX0xPV19NQVNLICAgICAgICAweDAwMDAwM0UwCisKKyNkZWZpbmUgICAgIFZJREVPTV9RVUFOVElfVkFMVUVfUkVHICAgICAgICAgICAgICAgICAgICAgMHgyNjggKyBWSURFT0JBU0VfT0ZGU0VUICAgICAvL01hdGNoIHdpdGggMHg2MCBCaXRbMjY6MjJdLEJpdFszMToyN10KKy8vICAgICNkZWZpbmUgICAgIEhJR0hfUVVBTlRJX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFsxNDowXSBIaWdoIHF1YWxpdHkgcXVhbnRpemF0aW9uIHZhbHVlLiBGb3JtYXQgaXMgMS4xNAorLy8gICAgICAgICNkZWZpbmUgICAgIEhJR0hfUVVBTlRJX1ZBTFVFX0JJVCAgICAgICAgICAgICAgIDAKKy8vICAgICAgICAjZGVmaW5lICAgICBISUdIX1FVQU5USV9WQUxVRV9NQVNLICAgICAgICAgICAgICAweDAwMDA3RkZGCisvLyAgICAjZGVmaW5lICAgICBCRVNUX1FVQU5USV9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMzA6MTZdIEJlc3QgcXVhbGl0eSBxdWFudGl6YXRpb24gdmFsdWUuIEZvcm1hdCBpcyAxLjE0CisvLyAgICAgICAgI2RlZmluZSAgICAgQkVTVF9RVUFOVElfVkFMVUVfQklUICAgICAgICAgICAgICAgMTYKKy8vICAgICAgICAjZGVmaW5lICAgICBCRVNUX1FVQU5USV9WQUxVRV9NQVNLICAgICAgICAgICAgICAweDdGRkYwMDAwCisgICAgCisjZGVmaW5lICAgICBWSURFT01fQlNEX1BBUkFfUkVHICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjZDICsgVklERU9CQVNFX09GRlNFVCAgICAvL1ZpZGVvIEJTRCBQYXJhbWV0ZXJzIFJlZ2lzdGVyICAgIAorLy8gICAgI2RlZmluZSAgICAgQlNEX0hJR0hfVEhSRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgIC8vQml0Wzc6MF0gQmxvY2sgc2hhcnBuZXNzIGRldGVjdGlvbiBoaWdoIHRocmVzaG9sZAorLy8gICAgI2RlZmluZSAgICAgQlNEX0hJR0hfVEhSRVNfQklUICAgICAgICAgICAgICAgICAgICAgIDAKKy8vICAgICNkZWZpbmUgICAgIEJTRF9ISUdIX1RIUkVTX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEZGCisvLyAgICAjZGVmaW5lICAgICBCU0RfTE9XX1RIUkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMCAgLy9CaXRbMTU6OF0gQmxvY2sgc2hhcHJwbmVzcyBkZXRlY3Rpb24gbG93IHRocmVzaG9sZAorLy8gICAgI2RlZmluZSAgICAgQlNEX0xPV19USFJFU19CSVQgICAgICAgICAgICAgICAgICAgICAgIDgKKy8vICAgICNkZWZpbmUgICAgIEJTRF9MT1dfVEhSRVNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRjAwCisvLyAgICAjZGVmaW5lICAgICBCU0RfSElHSF9DT1VOVFMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMjE6MTZdIEJsb2NrIHNoYXJwbmVzcyBkZXRlY3Rpb24gaGlnaCBjb3VudHMgdGhyZXNob2xkCisvLyAgICAjZGVmaW5lICAgICBCU0RfSElHSF9DT1VOVFNfQklUICAgICAgICAgICAgICAgICAgICAgMTYKKy8vICAgICNkZWZpbmUgICAgIEJTRF9ISUdIX0NPVU5UU19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwM0YwMDAwCisvLyAgICAjZGVmaW5lICAgICBCU0RfTE9XX0NPVU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMCAgLy9CaXRbMjc6MjRdIEJsb2NrIHNoYXJwbmVzcyBkZXRlY3Rpb24gbG93IGNvdW50cyB0aHJlc2hvbGQKKy8vICAgICNkZWZpbmUgICAgIEJTRF9MT1dfQ09VTlRTX0JJVCAgICAgICAgICAgICAgICAgICAgICAyNAorLy8gICAgI2RlZmluZSAgICAgQlNEX0xPV19DT1VOVFNfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4M0YwMDAwMDAKKworI2RlZmluZSBWSURFT01fQ09NUFJFU1NfRlJBTUVfU0laRV9SRUcJCQkJCSAgMHgyNzAgKyBWSURFT0JBU0VfT0ZGU0VUCisvLyAgICAjZGVmaW5lICAgICBDT01QUkVTU19GUkFNRV9TSVpFX1JFQUQgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgLy9CaXRbMTk6MF0gVmlkZW8gY29tcHJlc3Npb24gZnJhbWUgc2l6ZSByZWFkIGJhY2sobnVtYmVyIG9mIERXKQorLy8gICAgI2RlZmluZSAgICAgQ09NUFJFU1NfRlJBTUVfU0laRV9SRUFEX0JJVCAgICAgICAgICAgIDAKKy8vICAgICNkZWZpbmUgICAgIENPTVBSRVNTX0ZSQU1FX1NJWkVfUkVBRF9NQVNLICAgICAgICAgICAweDAwMEZGRkZGCisKKyNkZWZpbmUgICAgIFZJREVPTV9DT01QUkVTU19CTE9DS19DT1VOVF9SRUcJCQkJICAweDI3NCArIFZJREVPQkFTRV9PRkZTRVQKKy8vICAgICNkZWZpbmUgICAgIENPTVBSRVNTX0JMT0NLX0NPVU5UX1JFQUQgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFsxNTowXSBWaWRlbyBjb21wcmVzcyBibG9jayBjb3VudGVyIHJlYWQgYmFjayhudW1iZXIgb2YgYmxvY2tzKQorLy8gICAgI2RlZmluZSAgICAgQ09NUFJFU1NfQkxPQ0tfQ09VTlRfUkVBRF9CSVQgICAgICAgICAgIDAKKy8vICAgICNkZWZpbmUgICAgIENPTVBSRVNTX0JMT0NLX0NPVU5UX1JFQURfTUFTSyAgICAgICAgICAweDAwMDBGRkZGCisKKyNkZWZpbmUgICAgIFZJREVPTV9DT01QUkVTU19GUkFNRV9FTkRfUkVBRCAgICAgICAgICAgICAgMHgyNzggKyBWSURFT0JBU0VfT0ZGU0VUICAgICAvL1ZpZGVvIGNvbXByZXNzaW9uIHN0cmVhbSBmcmFtZSBlbmQgcG9pbnRlciAgICAKKyAgICAvLyNkZWZpbmUgICAgIENPTVBSRVNTX0ZSQU1FX0VORF9SRUFEX0FMSUdOICAgICAgICAgICA3CisgICAgLy8jZGVmaW5lICAgICBDT01QUkVTU19GUkFNRV9FTkRfUkVBRF9NQVNLICAgICAgICAgICAgMHgwMDNGRkZGRgorICAgIAorI2RlZmluZSAgICAgVklERU9NX1VTRVJfREVGSU5FX0hFQURFUl9SRUcJCQkgICAgICAweDI4MCArIFZJREVPQkFTRV9PRkZTRVQKKy8vICAgICNkZWZpbmUgICAgIFVTRVJfREVGSU5FX0hFQURFUiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFsxNTowXSBWaWRlbyB1c2VyIGRlZmluZWQgaGVhZGVyIHBhcmFtZXRlcgorLy8gICAgI2RlZmluZSAgICAgVVNFUl9ERUZJTkVfSEVBREVSX0JJVCAgICAgICAgICAgICAgICAgIDAKKy8vICAgICNkZWZpbmUgICAgIFVTRVJfREVGSU5FX0hFQURFUl9NQVNLICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisKKy8qKioqKiogIFZSMzAwLVZSM0ZDOiBHZW5lcmFsIENvbnRyb2wgcmVnaXN0ZXJzICAqKioqKi8KKyNkZWZpbmUgICAgIFZJREVPX0NPTlRST0xfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgQ09ERUNfREVDT01QUkVTU19NT0RFICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgIC8vQml0WzBdIENvZGVjIGluIGRlLWNvbXByZXNzaW9uIG1vZGUKKyAgICAgICAgI2RlZmluZSAgICAgQ09ERUNfREVDT01QUkVTU19NT0RFX0JJVCAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBDT0RFQ19ERUNPTVBSRVNTX01PREVfTUFTSyAgICAgICAgICAweDAwMDAwMDAxIAorICAgICAgICAjZGVmaW5lICAgICBDT01QUkVTU19NT0RFICAgICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgICNkZWZpbmUgICAgIERFQ09NUFJFU1NfTU9ERSAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAjZGVmaW5lICAgICBWSURFT19TQUZFX01PREUJCQkJCQkJMHgwMDAwMDAwMiAgLy9CaXRbMV0gVklERU8gU0FGRSBNT0RFCisJCSNkZWZpbmUgICAgIFZJREVPX1NBRkVfTU9ERV9CSVQJCQkJCTEKKwkJI2RlZmluZSAgICAgVklERU9fU0FGRV9NT0RFX09GRgkJICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBWSURFT19TQUZFX01PREVfT04JCSAgICAgICAgICAgIDEKKyAgICAjZGVmaW5lICAgICBERUxBWV9WU1lOQwkJCQkJCQkJMHgwMDAwMDAwNCAgLy9CaXRbMl0gRGVsYXkgSW50ZXJuYWwgVlNZTkMKKyAgICAgICAgI2RlZmluZSAgICAgREVMQVlfVlNZTkNfQklUICAgICAgICAgICAgICAgICAgICAgMgorICAgICAgICAjZGVmaW5lICAgICBERUxBWV9WU1lOQ19NQVNLICAgICAgICAgICAgICAgICAgICAoMTw8MikKKwkJI2RlZmluZQkJREVMQVlfVlNZTkNfT0ZGCQkJCQkJKDA8PDIpCisJCSNkZWZpbmUJCURFTEFZX1ZTWU5DX0VOCQkJCQkJKDE8PDIpCisgICAgI2RlZmluZSAgICAgVkVSX0RPV05TQ0FMSU5HX0xJTkVfQlVGRkVSX0VOICAgICAgICAgIDB4MDAwMDAwMTAgIC8vQml0WzU6NF0gVmlkZW8gdmVydGljYWwgZG93bnNjYWxpbmcgbGluZSBidWZmZXIgZW5hYmxlCisJCSNkZWZpbmUJCVZFUl9MSU5FX0JVRkZFUl9NQVNLCQkJCSgzPDw0KQorICAgICAgICAjZGVmaW5lICAgICBMSU5FX0JVRkZFUl9PRkYgICAgICAgICAgICAgICAgICAgICAoMDw8NCkKKyAgICAgICAgI2RlZmluZSAgICAgTElORV9CVUZGRVJfVklERU8xICAgICAgICAgICAgICAgICAgMQorICAgICAgICAjZGVmaW5lICAgICBMSU5FX0JVRkZFUl9WSURFTzIgICAgICAgICAgICAgICAgICAyCisgICAgICAgICNkZWZpbmUgICAgIExJTkVfQlVGRkVSX1ZJREVPTSAgICAgICAgICAgICAgICAgIDMKKyAgICAjZGVmaW5lICAgICBSQzRfS0VZX0JVRkZFUl9TRUxFQ1RJT04JCQkJKDFVTDw8NikgIC8vQml0Wzc6Nl0gUkM0IEtleSBCdWZmZXIgU2VsZWN0aW9uCisJCSNkZWZpbmUJCVJDNF9LRVlfQlVGRkVSX1NFTEVDVElPTl9CSVQJCTYKKwkJI2RlZmluZQkJUkM0X0tFWV9CVUZGRVJfU0VMRUNUSU9OX01BU0sJCSgzVUw8PDYpCisgICAgICAgICNkZWZpbmUgICAgIFJDNF9LRVlfQlVGRkVSX1ZJREVPMSAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgUkM0X0tFWV9CVUZGRVJfVklERU8yICAgICAgICAgICAgICAgMQorICAgICAgICAjZGVmaW5lICAgICBSQzRfS0VZX0JVRkZFUl9WSURFT00gICAgICAgICAgICAgICAyCisgICAgI2RlZmluZSAgICAgUkM0X0lOSVRfUkVTRVQJCQkJCQkJKDFVTDw8OCkgIC8vQml0WzhdIFJDNCBpbml0aWFsIHJlc2V0CisJCSNkZWZpbmUgICAgIFJDNF9JTklUX1JFU0VUX0JJVAkJCQkJOAorCQkjZGVmaW5lICAgICBSQzRfSU5JVF9SRVNFVF9NQVNLCQkJCQkoMVVMPDw4KQorCQkjZGVmaW5lICAgICBSQzRfTk9STUFMX01PREUJCQkJCQkwCisJCSNkZWZpbmUgICAgIFJDNF9SRVNFVF9DT1VOVEVSCQkJCQkxCisgICAgI2RlZmluZSAgICAgUkM0X1RFU1RfTU9ERQkJCQkJCQkoMVVMPDw5KSAgLy9CaXRbOV0gUkM0IHRlc3QgbW9kZQorCQkjZGVmaW5lICAgICBSQzRfVEVTVF9NT0RFX0JJVAkJCQkJOQorCQkjZGVmaW5lICAgICBSQzRfVEVTVF9PRkYJCQkJCQkwCisJCSNkZWZpbmUgICAgIFJDNF9URVNUX09OCQkJCQkJCTEKKyAgICAjZGVmaW5lICAgICBSQzRfU0FWRV9NT0RFCQkJCQkJCSgxVUw8PDE0KSAgLy9CaXRbMTRdIFJDNCBzYXZlIG1vZGUKKwkJI2RlZmluZSAgICAgUkM0X1NBVkVfTU9ERV9CSVQJCQkJCTE0CisJCSNkZWZpbmUgICAgIFJDNF9TQVZFX01PREVfTUFTSwkJCQkJKDFVTDw8MTQpCisJCSNkZWZpbmUgICAgIFJDNF9TQVZFX01PREVfT0ZGCQkJCQkwCisJCSNkZWZpbmUgICAgIFJDNF9TQVZFX01PREVfT04JCQkJCTEKKyAgICAjZGVmaW5lICAgICBSQzRfTk9fUkVTRVRfRlJBTUUJCQkJCQkoMVVMPDwxNSkgIC8vQml0WzE1XSBSQzQgbm8gcmVzZXQgd2hlbiBmcmFtZSBjb21wbGV0ZWQKKwkJI2RlZmluZSAgICAgUkM0X05PX1JFU0VUX0ZSQU1FX0JJVAkJCQkxNQorCQkjZGVmaW5lICAgICBSQzRfTk9fUkVTRVRfRlJBTUVfTUFTSwkJCQkoMVVMPDwxNSkKKwkJI2RlZmluZSAgICAgUkM0X05PX1JFU0VUX0ZSQU1FX09GRgkJCQkwCQkvL0Fsd2F5cyByZXNldAorCQkjZGVmaW5lICAgICBSQzRfTk9fUkVTRVRfRlJBTUVfT04JCQkJMQorCisjZGVmaW5lIFZJREVPX0lOVF9DT05UUk9MX0VOX1JFRyAgICAgICAgICAgICAgICAgICAgICAgIDB4MzA0ICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIFZJREVPMV9XQVRDSF9ET0dfSU5UX0VOICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFswXSBFbmFibGUgVmlkZW8xIG1vZGUgZGV0ZWN0aW9uIHdhdGNoIGRvZyBvdXQgb2YgbG9jayBpbnRlcnJ1cHQKKyAgICAjZGVmaW5lICAgICBWSURFTzFfSU5QVVRfQ09NUExFVEVfSU5UX0VOICAgICAgICAgICAgMHgwMDAwMDAwMiAgLy9CaXRbMV0gRW5hYmxlIFZpZGVvMSB2aWRlbyBpbnB1dCBjb21wbGV0ZSBpbnRlcnJ1cHQgIChmcmFtZSBjb21wbGV0ZSBvbmx5IGZvciBmcmFtZSBtb2RlKQorICAgICNkZWZpbmUgICAgIFZJREVPMV9QQUNLRVRfUkVBRFlfSU5UX0VOICAgICAgICAgICAgICAweDAwMDAwMDA0ICAvL0JpdFsyXSBFbmFibGUgVmlkZW8xIHBhY2tldCByZWFkeSBpbnRlcnJ1cHQKKyAgICAjZGVmaW5lICAgICBWSURFTzFfQ09NUFJFU1NfQ09NUExFVEVfSU5UX0VOICAgICAgICAgMHgwMDAwMDAwOCAgLy9CaXRbM10gRW5hYmxlIFZpZGVvMSBjb21wcmVzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgICAjZGVmaW5lICAgICBWSURFTzFfTU9ERV9ERVRFQ1RJT05fUkVBRFlfSU5UX0VOICAgICAgMHgwMDAwMDAxMCAgLy9CaXRbNF0gRW5hYmxlIHZpZGVvMSBtb2RlIGRldGVjdGlvbiByZWFkeSBpbnRlcnJ1cHQKKyAgICAjZGVmaW5lICAgICBWSURFTzFfRlJBTUVfQ09NUExFVEVfSU5UX0VOICAgICAgICAgICAgMHgwMDAwMDAyMCAgLy9CaXRbNV0gRW5hYmxlIFZpZGVvMSBmcmFtZSBjb21wbGV0ZSBpbnRlcnJ1cHQgICAgIChvbmx5IGZvciBzdHJlYW0gbW9kZSkKKyAgICAjZGVmaW5lICAgICBWSURFTzFfU1RSRUFNX0VSUl9JTlRfRU4gICAgICAgICAgICAgICAgMHgwMDAwMDA0MCAgLy9CaXRbNl0gRW5hYmxlIFZpZGVvMSBkZWNvZGUgc3RyZWFtIGVycm9yIGludGVycnVwdAorICAgICNkZWZpbmUgICAgIFZJREVPMl9XQVRDSF9ET0dfSU5UX0VOICAgICAgICAgICAgICAgICAweDAwMDAwMTAwICAvL0JpdFs4XSBFbmFibGUgVmlkZW8yIG1vZGUgZGV0ZWN0aW9uIHdhdGNoIGRvZyBvdXQgb2YgbG9jayBpbnRlcnJ1cHQKKyAgICAjZGVmaW5lICAgICBWSURFTzJfSU5QVVRfQ09NUExFVEVfSU5UX0VOICAgICAgICAgICAgMHgwMDAwMDIwMCAgLy9CaXRbOV0gRW5hYmxlIFZpZGVvMiB2aWRlbyBpbnB1dCBjb21wbGV0ZSBpbnRlcnJ1cHQgIChmcmFtZSBjb21wbGV0ZSBvbmx5IGZvciBmcmFtZSBtb2RlKQorICAgICNkZWZpbmUgICAgIFZJREVPMl9QQUNLRVRfUkVBRFlfSU5UX0VOICAgICAgICAgICAgICAweDAwMDAwNDAwICAvL0JpdFsxMF0gRW5hYmxlIFZpZGVvMiBwYWNrZXQgcmVhZHkgaW50ZXJydXB0CisgICAgI2RlZmluZSAgICAgVklERU8yX0NPTVBSRVNTX0NPTVBMRVRFX0lOVF9FTiAgICAgICAgIDB4MDAwMDA4MDAgIC8vQml0WzExXSBFbmFibGUgVmlkZW8yIGNvbXByZXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAgICNkZWZpbmUgICAgIFZJREVPMl9NT0RFX0RFVEVDVElPTl9SRUFEWV9JTlRfRU4gICAgICAweDAwMDAxMDAwICAvL0JpdFsxMl0gRW5hYmxlIHZpZGVvMiBtb2RlIGRldGVjdGlvbiByZWFkeSBpbnRlcnJ1cHQKKyAgICAjZGVmaW5lICAgICBWSURFTzJfRlJBTUVfQ09NUExFVEVfSU5UX0VOICAgICAgICAgICAgMHgwMDAwMjAwMCAgLy9CaXRbMTNdIEVuYWJsZSBWaWRlbzIgZnJhbWUgY29tcGxldGUgaW50ZXJydXB0ICAgIChvbmx5IGZvciBzdHJlYW0gbW9kZSkKKyAgICAjZGVmaW5lICAgICBWSURFTzJfU1RSRUFNX0VSUl9JTlRfRU4gICAgICAgICAgICAgICAgMHgwMDAwNDAwMCAgLy9CaXRbMTRdIEVuYWJsZSBWaWRlbzIgZGVjb2RlIHN0cmVhbSBlcnJvciBpbnRlcnJ1cHQKKyAgICAjZGVmaW5lICAgICBWSURFT01fSU5QVVRfQ09NUExFVEVfSU5UX0VOICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMTZdIEVuYWJsZSBWaWRlb00gdmlkZW8gaW5wdXQgY29tcGxldGUgaW50ZXJydXB0CisgICAgI2RlZmluZSAgICAgVklERU9NX0NPTVBSRVNTX0NPTVBMRVRFX0lOVF9FTiAgICAgICAgIDB4MDAwMjAwMDAgIC8vQml0WzE3XSBFbmFibGUgVmlkZW9NIGNvbXByZXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorCSNkZWZpbmUgICAgIFZJREVPTV9QQUNLRVRfUkVBRFlfSU5UX0VOCQkJCTB4MDAwNDAwMDAgIC8vQml0WzE4XSBFbmFibGUgVmlkZW9NIHBhY2tldCByZWFkeSBpbnRlcnJ1cHQKKwkjZGVmaW5lICAgICBWSURFT01fRlJBTUVfQ09NUExFVEVfSU5UX0VOICAgICAgICAgICAgMHgwMDA4MDAwMCAgLy9CaXRbMTldIEVuYWJsZSBWaWRlb00gZnJhbWUgY29tcGxldGUgaW50ZXJydXB0ICAgIChvbmx5IGZvciBzdHJlYW0gbW9kZSkKKyAgICAKKyNkZWZpbmUgVklERU9fSU5UX0NPTlRST0xfUkVBRF9SRUcgICAgICAgICAgICAgICAgICAgICAgMHgzMDggKyBWSURFT0JBU0VfT0ZGU0VUIC8vQ2xlYXIgd2hlbiB3cml0ZSAxCisgICAgI2RlZmluZSAgICAgVklERU8xX1dBVENIX0RPR19SRUFEICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgIC8vQml0WzBdIFZpZGVvMSBtb2RlIGRldGVjdGlvbiB3YXRjaCBkb2cgb3V0IG9mIGxvY2sgaW50ZXJydXB0IHN0YXR1cyByZWFkIGJhY2sKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8xX1dBVENIX0RPR19CSVQJCQkJMAorICAgICAgICAjZGVmaW5lICAgICBWSURFTzFfV0FUQ0hfRE9HX01BU0sJCQkJMHgwMDAwMDAwMQorICAgICNkZWZpbmUgICAgIFZJREVPMV9JTlBVVF9DT01QTEVURV9SRUFEICAgICAgICAgICAgICAweDAwMDAwMDAyICAvL0JpdFsxXSBWaWRlbzEgdmlkZW8gaW5wdXQgY29tcGxldGUgaW50ZXJydXB0IHN0YXR1cyByZWFkIGJhY2sgKGZyYW1lIGNvbXBsZXRlIG9ubHkgZm9yIGZyYW1lIG1vZGUpCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPMV9JTlBVVF9DT01QTEVURV9CSVQJCQkxCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPMV9JTlBVVF9DT01QTEVURV9NQVNLCQkJMHgwMDAwMDAwMgorICAgICNkZWZpbmUgICAgIFZJREVPMV9QQUNLRVRfUkVBRFlfUkVBRCAgICAgICAgICAgICAgICAweDAwMDAwMDA0ICAvL0JpdFsyXSBWaWRlbzEgcGFja2V0IHJlYWR5IGludGVycnVwdCBzdGF0dXMgcmVhZCBiYWNrCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPMV9QQUNLRVRfUkVBRFlfQklUCQkgICAgICAgIDIKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8xX1BBQ0tFVF9SRUFEWV9NQVNLCQkgICAgMHgwMDAwMDAwNAorICAgICNkZWZpbmUgICAgIFZJREVPMV9DT01QUkVTU19DT01QTEVURV9SRUFEICAgICAgICAgICAweDAwMDAwMDA4ICAvL0JpdFszXSBWaWRlbzEgY29tcHJlc3Npb24gY29tcGxldGUgaW50ZXJydXB0IHN0YXR1cyByZWFkIGJhY2sKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8xX0NPTVBSRVNTX0NPTVBMRVRFX0JJVAkJMworICAgICAgICAjZGVmaW5lICAgICBWSURFTzFfQ09NUFJFU1NfQ09NUExFVEVfTUFTSwkJMHgwMDAwMDAwOAorICAgICNkZWZpbmUgICAgIFZJREVPMV9NT0RFX0RFVEVDVElPTl9SRUFEWV9SRUFEICAgICAgICAweDAwMDAwMDEwICAvL0JpdFs0XSBWaWRlbzEgbW9kZSBkZXRlY3Rpb24gcmVhZHkgaW50ZXJydXB0IHN0YXR1cyByZWFkIGJhY2sKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8xX01PREVfREVURUNUSU9OX1JFQURZX0JJVCAgICAgNAorICAgICNkZWZpbmUgICAgIFZJREVPMV9GUkFNRV9DT01QTEVURV9SRUFEICAgICAgICAgICAgICAweDAwMDAwMDIwICAvL0JpdFs1XSBWaWRlbzEgZnJhbWUgY29tcGxldGUgaW50ZXJydXB0IHN0YXR1cyByZWFkIGJhY2sKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8xX0ZSQU1FX0NPTVBMRVRFX0JJVAkJCTUKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8xX0ZSQU1FX0NPTVBMRVRFX01BU0sJCQkweDAwMDAwMDIwCisgICAgI2RlZmluZSAgICAgVklERU8xX1NUUkVBTV9FUlJfUkVBRCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAgIC8vQml0WzZdIFZpZGVvMSBkZWNvZGUgc3RyZWFtIGVycm9yIGludGVycnVwdCBzdGF0dXMgcmVhZCBiYWNrCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPMV9TVFJFQU1fRVJSX0JJVAkJCQk2CisgICAgICAgICNkZWZpbmUgICAgIFZJREVPMV9TVFJFQU1fRVJSX01BU0sJCQkJMHgwMDAwMDA0MAorICAgICNkZWZpbmUgICAgIFZJREVPMl9XQVRDSF9ET0dfUkVBRCAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwICAvL0JpdFs4XSBWaWRlbzIgbW9kZSBkZXRlY3Rpb24gd2F0Y2ggZG9nIG91dCBvZiBsb2NrIGludGVycnVwdCBzdGF0dXMgcmVhZCBiYWNrCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPMl9XQVRDSF9ET0dfQklUCQkJCTgKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8yX1dBVENIX0RPR19NQVNLCQkJCTB4MDAwMDAxMDAKKyAgICAjZGVmaW5lICAgICBWSURFTzJfSU5QVVRfQ09NUExFVEVfUkVBRCAgICAgICAgICAgICAgMHgwMDAwMDIwMCAgLy9CaXRbOV0gVmlkZW8yIHZpZGVvIGlucHV0IGNvbXBsZXRlIGludGVycnVwdCBzdGF0dXMgcmVhZCBiYWNrIChmcmFtZSBjb21wbGV0ZSBvbmx5IGZvciBmcmFtZSBtb2RlKQorICAgICAgICAjZGVmaW5lICAgICBWSURFTzJfSU5QVVRfQ09NUExFVEVfQklUCQkJOQorICAgICAgICAjZGVmaW5lICAgICBWSURFTzJfSU5QVVRfQ09NUExFVEVfTUFTSwkJCTB4MDAwMDAyMDAKKyAgICAjZGVmaW5lICAgICBWSURFTzJfUEFDS0VUX1JFQURZX1JFQUQgICAgICAgICAgICAgICAgMHgwMDAwMDQwMCAgLy9CaXRbMTBdIFZpZGVvMiBwYWNrZXQgcmVhZHkgaW50ZXJydXB0IHN0YXR1cyByZWFkIGJhY2sKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8yX1BBQ0tFVF9SRUFEWV9CSVQJCSAgICAgICAgMTAKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8yX1BBQ0tFVF9SRUFEWV9NQVNLCQkgICAgMHgwMDAwMDQwMAorICAgICNkZWZpbmUgICAgIFZJREVPMl9DT01QUkVTU19DT01QTEVURV9SRUFEICAgICAgICAgICAweDAwMDAwODAwICAvL0JpdFsxMV0gVmlkZW8yIGNvbXByZXNzaW9uIGNvbXBsZXRlIGludGVycnVwdCBzdGF0dXMgcmVhZCBiYWNrIAorICAgICAgICAjZGVmaW5lICAgICBWSURFTzJfQ09NUFJFU1NfQ09NUExFVEVfQklUCQkxMQorICAgICAgICAjZGVmaW5lICAgICBWSURFTzJfQ09NUFJFU1NfQ09NUExFVEVfTUFTSwkJMHgwMDAwMDgwMCAgICAgIAorCQkjZGVmaW5lICAgICBWSURFTzJfTU9ERV9ERVRFQ1RJT05fUkVBRFlfUkVBRCAgICAweDAwMDAxMDAwICAvL0JpdFsxMl0gVmlkZW8yIG1vZGUgZGV0ZWN0aW9uIHJlYWR5IGludGVycnVwdCBzdGF0dXMgcmVhZCBiYWNrCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPMl9NT0RFX0RFVEVDVElPTl9SRUFEWV9CSVQgICAgIDEyICAgICAgICAgICAgICAKKyAgICAjZGVmaW5lICAgICBWSURFTzJfRlJBTUVfQ09NUExFVEVfUkVBRCAgICAgICAgICAgICAgMHgwMDAwMjAwMCAgLy9CaXRbMTNdIFZpZGVvMiBmcmFtZSBjb21wbGV0ZSBpbnRlcnJ1cHQgc3RhdHVzIHJlYWQgYmFjaworICAgICAgICAjZGVmaW5lICAgICBWSURFTzJfRlJBTUVfQ09NUExFVEVfQklUCQkgICAgMTMKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8yX0ZSQU1FX0NPTVBMRVRFX01BU0sJCQkweDAwMDAyMDAwCisgICAgI2RlZmluZSAgICAgVklERU8yX1NUUkVBTV9FUlJfUkVBRCAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAgIC8vQml0WzE0XSBWaWRlbzIgZGVjb2RlIHN0cmVhbSBlcnJvciBpbnRlcnJ1cHQgc3RhdHVzIHJlYWQgYmFjaworICAgICAgICAjZGVmaW5lICAgICBWSURFTzJfU1RSRUFNX0VSUl9CSVQJCQkJMTQKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8yX1NUUkVBTV9FUlJfTUFTSwkJCQkweDAwMDA0MDAwCisgICAgLy9uZWVkIGNoZWNrIHNwZWMKKyAgICAjZGVmaW5lICAgICBWSURFT01fSU5QVVRfQ09NUExFVEVfUkVBRCAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMTZdIFZpZGVvTSB2aWRlbyBpbnB1dCBjb21wbGV0ZSBpbnRlcnJ1cHQgc3RhdHVzIHJlYWQgYmFjaworICAgICAgICAjZGVmaW5lICAgICBWSURFT01fSU5QVVRfQ09NUExFVEVfQklUCQkJMTYKKyAgICAgICAgI2RlZmluZSAgICAgVklERU9NX0lOUFVUX0NPTVBMRVRFX01BU0sJCQkweDAwMDEwMDAwCisgICAgI2RlZmluZSAgICAgVklERU9NX0NPTVBSRVNTX0NPTVBMRVRFX1JFQUQgICAgICAgICAgIDB4MDAwMjAwMDAgIC8vQml0WzE3XSBWaWRlb00gY29tcHJlc3Npb24gY29tcGxldGUgaW50ZXJydXB0IHN0YXR1cyByZWFkIGJhY2sKKyAgICAgICAgI2RlZmluZSAgICAgVklERU9NX0NPTVBSRVNTX0NPTVBMRVRFX0JJVAkJMTcKKyAgICAgICAgI2RlZmluZSAgICAgVklERU9NX0NPTVBSRVNTX0NPTVBMRVRFX01BU0sJCTB4MDAwMjAwMDAKKyAgICAjZGVmaW5lICAgICBWSURFT01fUEFDS0VUX1JFQURZX1JFQUQgICAgICAgICAgICAgICAgMHgwMDA0MDAwMCAgLy9CaXRbMThdIENsZWFyIFBhY2tldCByZWFkeSBpbnRlcnJ1cHQgd2hlbiB3cml0ZSAxCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPTV9QQUNLRVRfUkVBRFlfQklUICAgICAgICAgICAgIDE4CisgICAgICAgICNkZWZpbmUgICAgIFZJREVPTV9QQUNLRVRfUkVBRFlfTUFTSyAgICAgICAgICAgIDB4MDAwNDAwMDAgICAgCisgICAgI2RlZmluZSAgICAgVklERU9NX0ZSQU1FX0NPTVBMRVRFX1JFQUQgICAgICAgICAgICAgIDB4MDAwODAwMDAgIC8vQml0WzE5XSBDbGVhciBGcmFtZSBjb21wbGV0ZSBpbnRlcnJ1cHQgd2hlbiB3cml0ZSAxCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPTV9GUkFNRV9DT01QTEVURV9CSVQgICAgICAgICAgIDE5CisgICAgICAgICNkZWZpbmUgICAgIFZJREVPTV9GUkFNRV9DT01QTEVURV9NQVNLICAgICAgICAgIDB4MDAwODAwMDAKKyAgIAorI2RlZmluZSBWSURFT19JTlRfQ09OVFJPTF9DTEVBUl9SRUcgICAgICAgICAgICAgICAgICAgICAweDMwOCArIFZJREVPQkFTRV9PRkZTRVQgLy9DbGVhciB3aGVuIHdyaXRlIDEKKyAgICAvL0NsZWFyIHdoZW4gd3JpdGUgMQorICAgICNkZWZpbmUgICAgIFZJREVPMV9XQVRDSF9ET0dfQ0xFQVIgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFswXSBDbGVhciBtb2RlIGRldGVjdGlvbiB3YXRjaCBkb2cgb3V0IG9mIGxvY2sgaW50ZXJydXB0IHdoZW4gd3JpdGUgMQorICAgICNkZWZpbmUgICAgIFZJREVPMV9JTlBVVF9DT01QTEVURV9DTEVBUiAgICAgICAgICAgICAweDAwMDAwMDAyICAvL0JpdFsxXSBDbGVhciB2aWRlbyBpbnB1dCBjb21wbGV0ZSBpbnRlcnJ1cHQgd2hlbiB3cml0ZSAxIChmcmFtZSBjb21wbGV0ZSBvbmx5IGZvciBmcmFtZSBtb2RlKQorICAgICNkZWZpbmUgICAgIFZJREVPMV9QQUNLRVRfUkVBRFlfQ0xFQVIgICAgICAgICAgICAgICAweDAwMDAwMDA0ICAvL0JpdFsyXSBDbGVhciBQYWNrZXQgcmVhZHkgaW50ZXJydXB0IHdoZW4gd3JpdGUgMQorICAgICAgICAjZGVmaW5lICAgICBWSURFTzFfUEFDS0VUX1JFQURZX0NMRUFSX0JJVCAgICAgICAyCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPMV9QQUNLRVRfUkVBRFlfQ0xFQVJfTUFTSyAgICAgIDB4MDAwMDAwMDQKKyAgICAjZGVmaW5lICAgICBWSURFTzFfQ09NUFJFU1NfQ09NUExFVEVfQ0xFQVIgICAgICAgICAgMHgwMDAwMDAwOCAgLy9CaXRbM10gQ2xlYXIgdmlkZW8gY29tcHJlc3Npb24gaW50ZXJydXB0IHdoZW4gd3JpdGUgMQorICAgICNkZWZpbmUgICAgIFZJREVPMV9NT0RFX0RFVEVDVElPTl9SRUFEWV9DTEVBUiAgICAgICAweDAwMDAwMDEwICAvL0JpdFs0XSBDbGVhciBWaWRlbzEgTW9kZSBkZXRlY3Rpb24gcmVhZHkgaW50ZXJydXB0IHdoZW4gd3JpdGUgMQorICAgICNkZWZpbmUgICAgIFZJREVPMV9GUkFNRV9DT01QTEVURV9DTEVBUiAgICAgICAgICAgICAweDAwMDAwMDIwICAvL0JpdFs1XSBDbGVhciBGcmFtZSBjb21wbGV0ZSBpbnRlcnJ1cHQgd2hlbiB3cml0ZSAxCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPMV9GUkFNRV9DT01QTEVURV9DTEVBUl9CSVQgICAgIDUKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8xX0ZSQU1FX0NPTVBMRVRFX0NMRUFSX01BU0sgICAgMHgwMDAwMDAyMAorICAgICNkZWZpbmUgICAgIFZJREVPMV9TVFJFQU1fRVJSX0NMRUFSICAgICAgICAgICAgICAgICAweDAwMDAwMDQwICAvL0JpdFs2XSBDbGVhciBkZWNvZGUgc3RyZWFtIGVycm9yIGludGVycnVwdCB3aGVuIHdyaXRlIDEKKyAgICAjZGVmaW5lICAgICBWSURFTzJfV0FUQ0hfRE9HX0NMRUFSICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMCAgLy9CaXRbOF0gQ2xlYXIgTW9kZSBkZXRlY3Rpb24gaW50ZXJydXB0IHdoZW4gd3JpdGUgMQorICAgICNkZWZpbmUgICAgIFZJREVPMl9JTlBVVF9DT01QTEVURV9DTEVBUiAgICAgICAgICAgICAweDAwMDAwMjAwICAvL0JpdFs5XSBDbGVhciB2aWRlbyBpbnB1dCBjb21wbGV0ZSBpbnRlcnJ1cHQgd2hlbiB3cml0ZSAxCisgICAgI2RlZmluZSAgICAgVklERU8yX1BBQ0tFVF9SRUFEWV9DTEVBUiAgICAgICAgICAgICAgIDB4MDAwMDA0MDAgIC8vQml0WzEwXSBDbGVhciBwYWNrZXQgcmVhZHkgaW50ZXJydXB0IHdoZW4gd3JpdGUgMQorICAgICNkZWZpbmUgICAgIFZJREVPMl9DT01QUkVTU19DT01QTEVURV9DTEVBUiAgICAgICAgICAweDAwMDAwODAwICAvL0JpdFsxMV0gQ2xlYXIgdmlkZW8gY29tcHJlc3Npb24gY29tcGxldGUgaW50ZXJydXB0IHdoZW4gd3JpdGUgMQorICAgICNkZWZpbmUgICAgIFZJREVPMl9NT0RFX0RFVEVDVElPTl9SRUFEWV9DTEVBUiAgICAgICAweDAwMDAxMDAwICAvL0JpdFsxMl0gQ2xlYXIgVmlkZW8yIE1vZGUgZGV0ZWN0aW9uIHJlYWR5IGludGVycnVwdCB3aGVuIHdyaXRlIDEKKyAgICAjZGVmaW5lICAgICBWSURFTzJfRlJBTUVfQ09NUExFVEVfQ0xFQVIgICAgICAgICAgICAgMHgwMDAwMjAwMCAgLy9CaXRbMTNdIENsZWFyIEZyYW1lIGNvbXBsZXRlIGludGVycnVwdCB3aGVuIHdyaXRlIDEgKGZyYW1lIGNvbXBsZXRlIG9ubHkgZm9yIGZyYW1lIG1vZGUpCisgICAgI2RlZmluZSAgICAgVklERU8yX1NUUkVBTV9FUlJfQ0xFQVIgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAgIC8vQml0WzE0XSBDbGVhciBEZWNvZGUgc3RyZWFtIGVycm9yIGludGVycnVwdCB3aGVuIHdyaXRlIDEKKyAgICAvL25lZWQgY2hlY2sgc3BlYworICAgICNkZWZpbmUgICAgIFZJREVPTV9JTlBVVF9DT01QTEVURV9DTEVBUiAgICAgICAgICAgICAweDAwMDEwMDAwICAvL0JpdFsxNl0gQ2xlYXIgdmlkZW8gaW5wdXQgY29tcGxldGUgaW50ZXJydXB0IHdoZW4gd3JpdGUgMQorICAgICNkZWZpbmUgICAgIFZJREVPTV9DT01QUkVTU19DT01QTEVURV9DTEVBUiAgICAgICAgICAweDAwMDIwMDAwICAvL0JpdFsxN10gQ2xlYXIgY29tcHJlc3Npb24gY29tcGxldGUgaW50ZXJydXB0IHdoZW4gd3JpdGUgMQorICAgICAgICAjZGVmaW5lICAgICBWSURFT01fQ09NUFJFU1NfQ09NUExFVEVfQ0xFQVJfQklUICAxNworICAgICAgICAjZGVmaW5lICAgICBWSURFT01fQ09NUFJFU1NfQ09NUExFVEVfQ0xFQVJfTUFTSyAweDAwMDIwMDAwICAgIAorCSNkZWZpbmUgICAgIFZJREVPTV9QQUNLRVRfUkVBRFlfQ0xFQVIJCQkJMHgwMDA0MDAwMCAgLy9CaXRbMThdIENsZWFyIGNvbXByZXNzaW9uIGNvbXBsZXRlIGludGVycnVwdCB3aGVuIHdyaXRlIDEKKyAgICAgICAgI2RlZmluZSAgICAgVklERU9NX1BBQ0tFVF9SRUFEWV9DTEVBUl9CSVQgICAgICAgMTgKKyAgICAgICAgI2RlZmluZSAgICAgVklERU9NX1BBQ0tFVF9SRUFEWV9DTEVBUl9NQVNLICAgICAgMHgwMDA0MDAwMCAgICAKKyAgICAjZGVmaW5lICAgICBWSURFT01fRlJBTUVfQ09NUExFVEVfQ0xFQVIgICAgICAgICAgICAgMHgwMDEwMDAwMCAgLy9CaXRbMjBdIENsZWFyIEZyYW1lIGNvbXBsZXRlIGludGVycnVwdCB3aGVuIHdyaXRlIDEKKyAgICAgICAgI2RlZmluZSAgICAgVklERU9NX0ZSQU1FX0NPTVBMRVRFX0NMRUFSX0JJVCAgICAgMjAKKyAgICAgICAgI2RlZmluZSAgICAgVklERU9NX0ZSQU1FX0NPTVBMRVRFX0NMRUFSX01BU0sgICAgMHgwMDEwMDAwMAorICAgICNkZWZpbmUgICAgIFZJREVPTV9TVFJFQU1fRVJSX0NMRUFSICAgICAgICAgICAgICAgICAweDAwMjAwMDAwICAvL0JpdFsyMV0gQ2xlYXIgZGVjb2RlIHN0cmVhbSBlcnJvciBpbnRlcnJ1cHQgd2hlbiB3cml0ZSAxCisgICAgCisjZGVmaW5lIFZJREVPX01PREVfREVURUNUSU9OX1BBUkFNX1JFRyAgICAgICAgICAgICAgICAgIDB4MzBDICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIEVER0VfUElYRUxfVEhSRVNfQklUICAgICAgICAgICAgICAgICAgICA4ICAgICAgICAgICAvL0JpdFsxNTo4XSBNb2RlIGRldGVjdGlvbiBlZGdlIHBpeGVsIHRocmVzaG9sZAorICAgICNkZWZpbmUgICAgIEVER0VfUElYRUxfVEhSRVNfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDBGRjAwICAKKyAgICAjZGVmaW5lICAgICBWRVJfU1RBQkxFX01BWF9CSVQgICAgICAgICAgICAgICAgICAgICAgMTYgICAgICAgICAgLy9CaXRbMTk6MTZdIE1vZGUgZGV0ZWN0aW9uIHZlcnRpY2FsIHN0YWJsZSBtYXhpbXVtCisgICAgI2RlZmluZSAgICAgVkVSX1NUQUJMRV9NQVhfQklUX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwRjAwMDAgIAorICAgICNkZWZpbmUgICAgIEhPUl9TVEFCTEVfTUFYX0JJVCAgICAgICAgICAgICAgICAgICAgICAyMCAgICAgICAgICAvL0JpdFsyMzoyMF0gTW9kZSBkZXRlY3Rpb24gaG9yaXpvbnRhbCBzdGFibGUgbWF4aW11bQorICAgICNkZWZpbmUgICAgIEhPUl9TVEFCTEVfTUFYX0JJVF9NQVNLICAgICAgICAgICAgICAgICAweDAwRjAwMDAwCisgICAgI2RlZmluZSAgICAgVkVSX1NUQUJMRV9USFJFU19CSVQgICAgICAgICAgICAgICAgICAgIDI0ICAgICAgICAgIC8vQml0WzI3OjI0XSBNb2RlIGRldGVjdGlvbiB2ZXJ0aWNhbCBzdGFibGUgdGhyZXNob2xkCisgICAgI2RlZmluZSAgICAgVkVSX1NUQUJMRV9USFJFU19CSVRfTUFTSyAgICAgICAgICAgICAgIDB4MEYwMDAwMDAgIAorICAgICNkZWZpbmUgICAgIEhPUl9TVEFCTEVfVEhSRVNfQklUICAgICAgICAgICAgICAgICAgICAyOCAgICAgICAgICAvL0JpdFszMToyOF0gTW9kZSBkZXRlY3Rpb24gaG9yaXpvbnRhbCBzdGFibGUgdGhyZXNob2xkCisgICAgI2RlZmluZSAgICAgSE9SX1NUQUJMRV9USFJFU19CSVRfTUFTSyAgICAgICAgICAgICAgIDB4RjAwMDAwMDAKKyAgICAKKyNkZWZpbmUgVklERU9fQ1JDX1BSSU1BUllfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMjAgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgQ1JDX0NIRUNLX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgIC8vQml0WzBdIFZpZGVvIHBvcnQgMS8yIEVuYWJsZSB2aWRlbyBjYXB0dXJlIHdyaXRlIENSQyBjaGVjaworICAgICAgICAjZGVmaW5lICAgICBDUkNfQ0hFQ0tfRU5fQklUICAgICAgICAgICAgICAgICAgICAwCisgICAgI2RlZmluZSAgICAgQ1JDX0NIRUNLX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIgIC8vQml0WzFdIFZpZGVvIHBvcnQgMS8yIENSQyBjaGVjayBoaWdoIGJpdCBvbmx5CisgICAgICAgICNkZWZpbmUgICAgIENSQ19DSEVDS19ISUdIX0JJVCAgICAgICAgICAgICAgICAgIDEKKyAgICAjZGVmaW5lICAgICBTS0lQX0NPVU5UX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNCAgLy9CaXRbNzoyXSBWaWRlbyBwb3J0IDEvMiBNYXggY2FwdHVyZSB3cml0ZSBza2lwIGNvdW50CisgICAgICAgICNkZWZpbmUgICAgIFNLSVBfQ09VTlRfTUFYX0JJVCAgICAgICAgICAgICAgICAgIDIKKyAgICAgICAgI2RlZmluZSAgICAgU0tJUF9DT1VOVF9NQVhfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwMDBGQworICAgICNkZWZpbmUgICAgIENSQ19QUklNQVJZX1BPTFlfTE9XICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwICAvL0JpdFsxNTo4XSBQcmltYXJ5IENSQyBsb3cgOC1iaXQgcG9seW5vbWlhbAorICAgICAgICAjZGVmaW5lICAgICBDUkNfUklNQVJZX1BPTFlfTE9XX0JJVCAgICAgICAgICAgICA4CisgICAgICAgICNkZWZpbmUgICAgIENSQ19SSU1BUllfUE9MWV9MT1dfTUFTSyAgICAgICAgICAgIDB4MDAwMEZGMDAKKyAgICAjZGVmaW5lICAgICBDUkNfUFJJTUFSWV9QT0xZX0hJR0ggICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMzE6MTZdIFByaW1hcnkgQ1JDIGhpZ2ggOC1iaXQgcG9seW5vbWlhbAorICAgICAgICAjZGVmaW5lICAgICBDUkNfUklNQVJZX1BPTFlfSElHSF9CSVQgICAgICAgICAgICAxNgorICAgICAgICAjZGVmaW5lICAgICBDUkNfUklNQVJZX1BPTFlfSElHSF9NQVNLICAgICAgICAgICAweEZGRkYwMDAwCisgICAgICAgIAorCisjZGVmaW5lIFZJREVPX0NSQ19TRUNPTkRfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzI0ICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIENSQ19TRUNPTkRfUE9MWV9MT1cgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwICAvL0JpdFsxNTo4XSBTZWNvbmRhcnkgQ1JDIGxvdyA4LWJpdCBwb2x5bm9taWFsCisgICAgICAgICNkZWZpbmUgICAgIENSQ19TRUNPTkRfUE9MWV9MT1dfQklUICAgICAgICAgICAgIDgKKyAgICAgICAgI2RlZmluZSAgICAgQ1JDX1NFQ09ORF9QT0xZX0xPV19NQVNLICAgICAgICAgICAgMHgwMDAwRkYwMAorICAgICNkZWZpbmUgICAgIENSQ19TRUNPTkRfUE9MWV9ISUdIICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwICAvL0JpdFszMToxNl0gU2Vjb25kYXJ5IENSQyBoaWdoIDgtYml0IHBvbHlub21pYWwKKyAgICAgICAgI2RlZmluZSAgICAgQ1JDX1NFQ09ORF9QT0xZX0hJR0hfQklUICAgICAgICAgICAgMTYKKyAgICAgICAgI2RlZmluZSAgICAgQ1JDX1NFQ09ORF9QT0xZX0hJR0hfTUFTSyAgICAgICAgICAgMHhGRkZGMDAwMAorCisjZGVmaW5lIFZJREVPMV9SQzRfS0VZU19SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMCArIFZJREVPQkFTRV9PRkZTRVQgLy9Ub3RhbCBWaWRlbzEgUkM0IEtleXMgICAgIAorI2RlZmluZSBWSURFTzJfUkM0X0tFWVNfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDAgKyBWSURFT0JBU0VfT0ZGU0VUIC8vVG90YWwgVmlkZW8yIFJDNCBLZXlzICAgICAKKyNkZWZpbmUgVklERU9NX1JDNF9LRVlTX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjAwICsgVklERU9CQVNFX09GRlNFVCAvL1RvdGFsIFZpZGVvTSBSQzQgS2V5cyAgICAgCisKKyNlbmRpZiAvKiBlbmQgb2YgX1ZSRUdfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDI0MDAvTWFrZWZpbGUgYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTcwZWExCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDI0MDAvTWFrZWZpbGUKQEAgLTAsMCArMSw0NCBAQAorIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitDT0JKUyAgIDo9IGFzdDI0MDAubyBmbGFzaC5vIGZsYXNoX3NwaS5vIHBjaS5vIGNyYzMyLm8gc2x0Lm8gcmVndGVzdC5vIHZmdW4ubyB2aGFjZS5vIGNydC5vIHZpZGVvdGVzdC5vIG1hY3Rlc3QubyBoYWN0ZXN0Lm8gbWljdGVzdC5vCisKK2lmZXEgKCQoQ09ORklHX0ZQR0FfQVNQRUVEKSx5KQorU09CSlMgICA6PSBwbGF0Zm9ybV9mcGdhLm8KK2Vsc2UgaWZlcSAoJChDT05GSUdfU0xUX0FTUEVFRCkseSkKK1NPQkpTCTo9IHBsYXRmb3JtX3NsdC5vCitlbHNlCitTT0JKUyAgIDo9IHBsYXRmb3JtLm8KK2VuZGlmCisKK1NSQ1MgICAgOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMgICAgOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorU09CSlMgICA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykpCisKKyQoTElCKTogJChvYmopLmRlcGVuZCAkKE9CSlMpICQoU09CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpICQoU09CSlMpCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrICQob2JqKS5kZXBlbmQKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjQwMC9hZXMuYyBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL2Flcy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc2MjYyZTcKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC9hZXMuYwpAQCAtMCwwICsxLDU3OSBAQAorLyoKKyAqICBBRVMgaW1wbGVtZW50YXRpb24KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisvKiB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHJ1biB0aGUgdGVzdCBzdWl0ZSAqLworCisvKiAjZGVmaW5lIFRFU1QgKi8KKworLyogdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSB0byB1c2UgcHJlLWNvbXB1dGVkIHRhYmxlcyAqLworLyogb3RoZXJ3aXNlIHRoZSB0YWJsZXMgd2lsbCBiZSBnZW5lcmF0ZWQgYXQgdGhlIGZpcnN0IHJ1biAqLworCisjZGVmaW5lIEZJWEVEX1RBQkxFUworCisjaWZuZGVmIEZJWEVEX1RBQkxFUworCisvKiBmb3J3YXJkIFMtYm94ICYgdGFibGVzICovCisKK3VpbnQzMiBGU2JbMjU2XTsKK3VpbnQzMiBGVDBbMjU2XTsgCit1aW50MzIgRlQxWzI1Nl07IAordWludDMyIEZUMlsyNTZdOyAKK3VpbnQzMiBGVDNbMjU2XTsgCisKKy8qIHJldmVyc2UgUy1ib3ggJiB0YWJsZXMgKi8KKwordWludDMyIFJTYlsyNTZdOwordWludDMyIFJUMFsyNTZdOwordWludDMyIFJUMVsyNTZdOwordWludDMyIFJUMlsyNTZdOwordWludDMyIFJUM1syNTZdOworCisvKiByb3VuZCBjb25zdGFudHMgKi8KKwordWludDMyIFJDT05bMTBdOworCisvKiB0YWJsZXMgZ2VuZXJhdGlvbiBmbGFnICovCisKK2ludCBkb19pbml0ID0gMTsKKworLyogdGFibGVzIGdlbmVyYXRpb24gcm91dGluZSAqLworCisjZGVmaW5lIFJPVFI4KHgpICggKCAoIHggPDwgMjQgKSAmIDB4RkZGRkZGRkYgKSB8IFwKKyAgICAgICAgICAgICAgICAgICAoICggeCAmIDB4RkZGRkZGRkYgKSA+PiAgOCApICkKKworI2RlZmluZSBYVElNRSh4KSAoICggeCA8PCAgMSApIF4gKCAoIHggJiAweDgwICkgPyAweDFCIDogMHgwMCApICkKKyNkZWZpbmUgTVVMKHgseSkgKCAoIHggJiYgIHkgKSA/IHBvd1sobG9nW3hdICsgbG9nW3ldKSAlIDI1NV0gOiAwICkKKwordm9pZCBhZXNfZ2VuX3RhYmxlcyggdm9pZCApCit7CisgICAgaW50IGk7CisgICAgdWludDggeCwgeTsKKyAgICB1aW50OCBwb3dbMjU2XTsKKyAgICB1aW50OCBsb2dbMjU2XTsKKworICAgIC8qIGNvbXB1dGUgcG93IGFuZCBsb2cgdGFibGVzIG92ZXIgR0YoMl44KSAqLworCisgICAgZm9yKCBpID0gMCwgeCA9IDE7IGkgPCAyNTY7IGkrKywgeCBePSBYVElNRSggeCApICkKKyAgICB7CisgICAgICAgIHBvd1tpXSA9IHg7CisgICAgICAgIGxvZ1t4XSA9IGk7CisgICAgfQorCisgICAgLyogY2FsY3VsYXRlIHRoZSByb3VuZCBjb25zdGFudHMgKi8KKworICAgIGZvciggaSA9IDAsIHggPSAxOyBpIDwgMTA7IGkrKywgeCA9IFhUSU1FKCB4ICkgKQorICAgIHsKKyAgICAgICAgUkNPTltpXSA9ICh1aW50MzIpIHggPDwgMjQ7CisgICAgfQorCisgICAgLyogZ2VuZXJhdGUgdGhlIGZvcndhcmQgYW5kIHJldmVyc2UgUy1ib3hlcyAqLworCisgICAgRlNiWzB4MDBdID0gMHg2MzsKKyAgICBSU2JbMHg2M10gPSAweDAwOworCisgICAgZm9yKCBpID0gMTsgaSA8IDI1NjsgaSsrICkKKyAgICB7CisgICAgICAgIHggPSBwb3dbMjU1IC0gbG9nW2ldXTsKKworICAgICAgICB5ID0geDsgIHkgPSAoIHkgPDwgMSApIHwgKCB5ID4+IDcgKTsKKyAgICAgICAgeCBePSB5OyB5ID0gKCB5IDw8IDEgKSB8ICggeSA+PiA3ICk7CisgICAgICAgIHggXj0geTsgeSA9ICggeSA8PCAxICkgfCAoIHkgPj4gNyApOworICAgICAgICB4IF49IHk7IHkgPSAoIHkgPDwgMSApIHwgKCB5ID4+IDcgKTsKKyAgICAgICAgeCBePSB5IF4gMHg2MzsKKworICAgICAgICBGU2JbaV0gPSB4OworICAgICAgICBSU2JbeF0gPSBpOworICAgIH0KKworICAgIC8qIGdlbmVyYXRlIHRoZSBmb3J3YXJkIGFuZCByZXZlcnNlIHRhYmxlcyAqLworCisgICAgZm9yKCBpID0gMDsgaSA8IDI1NjsgaSsrICkKKyAgICB7CisgICAgICAgIHggPSAodW5zaWduZWQgY2hhcikgRlNiW2ldOyB5ID0gWFRJTUUoIHggKTsKKworICAgICAgICBGVDBbaV0gPSAgICh1aW50MzIpICggeCBeIHkgKSBeCisgICAgICAgICAgICAgICAgICggKHVpbnQzMikgeCA8PCAgOCApIF4KKyAgICAgICAgICAgICAgICAgKCAodWludDMyKSB4IDw8IDE2ICkgXgorICAgICAgICAgICAgICAgICAoICh1aW50MzIpIHkgPDwgMjQgKTsKKworICAgICAgICBGVDBbaV0gJj0gMHhGRkZGRkZGRjsKKworICAgICAgICBGVDFbaV0gPSBST1RSOCggRlQwW2ldICk7CisgICAgICAgIEZUMltpXSA9IFJPVFI4KCBGVDFbaV0gKTsKKyAgICAgICAgRlQzW2ldID0gUk9UUjgoIEZUMltpXSApOworCisgICAgICAgIHkgPSAodW5zaWduZWQgY2hhcikgUlNiW2ldOworCisgICAgICAgIFJUMFtpXSA9ICggKHVpbnQzMikgTVVMKCAweDBCLCB5ICkgICAgICAgKSBeCisgICAgICAgICAgICAgICAgICggKHVpbnQzMikgTVVMKCAweDBELCB5ICkgPDwgIDggKSBeCisgICAgICAgICAgICAgICAgICggKHVpbnQzMikgTVVMKCAweDA5LCB5ICkgPDwgMTYgKSBeCisgICAgICAgICAgICAgICAgICggKHVpbnQzMikgTVVMKCAweDBFLCB5ICkgPDwgMjQgKTsKKworICAgICAgICBSVDBbaV0gJj0gMHhGRkZGRkZGRjsKKworICAgICAgICBSVDFbaV0gPSBST1RSOCggUlQwW2ldICk7CisgICAgICAgIFJUMltpXSA9IFJPVFI4KCBSVDFbaV0gKTsKKyAgICAgICAgUlQzW2ldID0gUk9UUjgoIFJUMltpXSApOworICAgIH0KK30KKworI2Vsc2UKKworLyogZm9yd2FyZCBTLWJveCAqLworCitzdGF0aWMgY29uc3QgdWludDMyIEZTYlsyNTZdID0KK3sKKyAgICAweDYzLCAweDdDLCAweDc3LCAweDdCLCAweEYyLCAweDZCLCAweDZGLCAweEM1LAorICAgIDB4MzAsIDB4MDEsIDB4NjcsIDB4MkIsIDB4RkUsIDB4RDcsIDB4QUIsIDB4NzYsCisgICAgMHhDQSwgMHg4MiwgMHhDOSwgMHg3RCwgMHhGQSwgMHg1OSwgMHg0NywgMHhGMCwKKyAgICAweEFELCAweEQ0LCAweEEyLCAweEFGLCAweDlDLCAweEE0LCAweDcyLCAweEMwLAorICAgIDB4QjcsIDB4RkQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M0YsIDB4RjcsIDB4Q0MsCisgICAgMHgzNCwgMHhBNSwgMHhFNSwgMHhGMSwgMHg3MSwgMHhEOCwgMHgzMSwgMHgxNSwKKyAgICAweDA0LCAweEM3LCAweDIzLCAweEMzLCAweDE4LCAweDk2LCAweDA1LCAweDlBLAorICAgIDB4MDcsIDB4MTIsIDB4ODAsIDB4RTIsIDB4RUIsIDB4MjcsIDB4QjIsIDB4NzUsCisgICAgMHgwOSwgMHg4MywgMHgyQywgMHgxQSwgMHgxQiwgMHg2RSwgMHg1QSwgMHhBMCwKKyAgICAweDUyLCAweDNCLCAweEQ2LCAweEIzLCAweDI5LCAweEUzLCAweDJGLCAweDg0LAorICAgIDB4NTMsIDB4RDEsIDB4MDAsIDB4RUQsIDB4MjAsIDB4RkMsIDB4QjEsIDB4NUIsCisgICAgMHg2QSwgMHhDQiwgMHhCRSwgMHgzOSwgMHg0QSwgMHg0QywgMHg1OCwgMHhDRiwKKyAgICAweEQwLCAweEVGLCAweEFBLCAweEZCLCAweDQzLCAweDRELCAweDMzLCAweDg1LAorICAgIDB4NDUsIDB4RjksIDB4MDIsIDB4N0YsIDB4NTAsIDB4M0MsIDB4OUYsIDB4QTgsCisgICAgMHg1MSwgMHhBMywgMHg0MCwgMHg4RiwgMHg5MiwgMHg5RCwgMHgzOCwgMHhGNSwKKyAgICAweEJDLCAweEI2LCAweERBLCAweDIxLCAweDEwLCAweEZGLCAweEYzLCAweEQyLAorICAgIDB4Q0QsIDB4MEMsIDB4MTMsIDB4RUMsIDB4NUYsIDB4OTcsIDB4NDQsIDB4MTcsCisgICAgMHhDNCwgMHhBNywgMHg3RSwgMHgzRCwgMHg2NCwgMHg1RCwgMHgxOSwgMHg3MywKKyAgICAweDYwLCAweDgxLCAweDRGLCAweERDLCAweDIyLCAweDJBLCAweDkwLCAweDg4LAorICAgIDB4NDYsIDB4RUUsIDB4QjgsIDB4MTQsIDB4REUsIDB4NUUsIDB4MEIsIDB4REIsCisgICAgMHhFMCwgMHgzMiwgMHgzQSwgMHgwQSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1QywKKyAgICAweEMyLCAweEQzLCAweEFDLCAweDYyLCAweDkxLCAweDk1LCAweEU0LCAweDc5LAorICAgIDB4RTcsIDB4QzgsIDB4MzcsIDB4NkQsIDB4OEQsIDB4RDUsIDB4NEUsIDB4QTksCisgICAgMHg2QywgMHg1NiwgMHhGNCwgMHhFQSwgMHg2NSwgMHg3QSwgMHhBRSwgMHgwOCwKKyAgICAweEJBLCAweDc4LCAweDI1LCAweDJFLCAweDFDLCAweEE2LCAweEI0LCAweEM2LAorICAgIDB4RTgsIDB4REQsIDB4NzQsIDB4MUYsIDB4NEIsIDB4QkQsIDB4OEIsIDB4OEEsCisgICAgMHg3MCwgMHgzRSwgMHhCNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhGNiwgMHgwRSwKKyAgICAweDYxLCAweDM1LCAweDU3LCAweEI5LCAweDg2LCAweEMxLCAweDFELCAweDlFLAorICAgIDB4RTEsIDB4RjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4RDksIDB4OEUsIDB4OTQsCisgICAgMHg5QiwgMHgxRSwgMHg4NywgMHhFOSwgMHhDRSwgMHg1NSwgMHgyOCwgMHhERiwKKyAgICAweDhDLCAweEExLCAweDg5LCAweDBELCAweEJGLCAweEU2LCAweDQyLCAweDY4LAorICAgIDB4NDEsIDB4OTksIDB4MkQsIDB4MEYsIDB4QjAsIDB4NTQsIDB4QkIsIDB4MTYKK307CisKKy8qIGZvcndhcmQgdGFibGVzICovCisKKyNkZWZpbmUgRlQgXAorXAorICAgIFYoQzYsNjMsNjMsQTUpLCBWKEY4LDdDLDdDLDg0KSwgVihFRSw3Nyw3Nyw5OSksIFYoRjYsN0IsN0IsOEQpLCBcCisgICAgVihGRixGMixGMiwwRCksIFYoRDYsNkIsNkIsQkQpLCBWKERFLDZGLDZGLEIxKSwgVig5MSxDNSxDNSw1NCksIFwKKyAgICBWKDYwLDMwLDMwLDUwKSwgVigwMiwwMSwwMSwwMyksIFYoQ0UsNjcsNjcsQTkpLCBWKDU2LDJCLDJCLDdEKSwgXAorICAgIFYoRTcsRkUsRkUsMTkpLCBWKEI1LEQ3LEQ3LDYyKSwgVig0RCxBQixBQixFNiksIFYoRUMsNzYsNzYsOUEpLCBcCisgICAgVig4RixDQSxDQSw0NSksIFYoMUYsODIsODIsOUQpLCBWKDg5LEM5LEM5LDQwKSwgVihGQSw3RCw3RCw4NyksIFwKKyAgICBWKEVGLEZBLEZBLDE1KSwgVihCMiw1OSw1OSxFQiksIFYoOEUsNDcsNDcsQzkpLCBWKEZCLEYwLEYwLDBCKSwgXAorICAgIFYoNDEsQUQsQUQsRUMpLCBWKEIzLEQ0LEQ0LDY3KSwgVig1RixBMixBMixGRCksIFYoNDUsQUYsQUYsRUEpLCBcCisgICAgVigyMyw5Qyw5QyxCRiksIFYoNTMsQTQsQTQsRjcpLCBWKEU0LDcyLDcyLDk2KSwgVig5QixDMCxDMCw1QiksIFwKKyAgICBWKDc1LEI3LEI3LEMyKSwgVihFMSxGRCxGRCwxQyksIFYoM0QsOTMsOTMsQUUpLCBWKDRDLDI2LDI2LDZBKSwgXAorICAgIFYoNkMsMzYsMzYsNUEpLCBWKDdFLDNGLDNGLDQxKSwgVihGNSxGNyxGNywwMiksIFYoODMsQ0MsQ0MsNEYpLCBcCisgICAgVig2OCwzNCwzNCw1QyksIFYoNTEsQTUsQTUsRjQpLCBWKEQxLEU1LEU1LDM0KSwgVihGOSxGMSxGMSwwOCksIFwKKyAgICBWKEUyLDcxLDcxLDkzKSwgVihBQixEOCxEOCw3MyksIFYoNjIsMzEsMzEsNTMpLCBWKDJBLDE1LDE1LDNGKSwgXAorICAgIFYoMDgsMDQsMDQsMEMpLCBWKDk1LEM3LEM3LDUyKSwgVig0NiwyMywyMyw2NSksIFYoOUQsQzMsQzMsNUUpLCBcCisgICAgVigzMCwxOCwxOCwyOCksIFYoMzcsOTYsOTYsQTEpLCBWKDBBLDA1LDA1LDBGKSwgVigyRiw5QSw5QSxCNSksIFwKKyAgICBWKDBFLDA3LDA3LDA5KSwgVigyNCwxMiwxMiwzNiksIFYoMUIsODAsODAsOUIpLCBWKERGLEUyLEUyLDNEKSwgXAorICAgIFYoQ0QsRUIsRUIsMjYpLCBWKDRFLDI3LDI3LDY5KSwgVig3RixCMixCMixDRCksIFYoRUEsNzUsNzUsOUYpLCBcCisgICAgVigxMiwwOSwwOSwxQiksIFYoMUQsODMsODMsOUUpLCBWKDU4LDJDLDJDLDc0KSwgVigzNCwxQSwxQSwyRSksIFwKKyAgICBWKDM2LDFCLDFCLDJEKSwgVihEQyw2RSw2RSxCMiksIFYoQjQsNUEsNUEsRUUpLCBWKDVCLEEwLEEwLEZCKSwgXAorICAgIFYoQTQsNTIsNTIsRjYpLCBWKDc2LDNCLDNCLDREKSwgVihCNyxENixENiw2MSksIFYoN0QsQjMsQjMsQ0UpLCBcCisgICAgVig1MiwyOSwyOSw3QiksIFYoREQsRTMsRTMsM0UpLCBWKDVFLDJGLDJGLDcxKSwgVigxMyw4NCw4NCw5NyksIFwKKyAgICBWKEE2LDUzLDUzLEY1KSwgVihCOSxEMSxEMSw2OCksIFYoMDAsMDAsMDAsMDApLCBWKEMxLEVELEVELDJDKSwgXAorICAgIFYoNDAsMjAsMjAsNjApLCBWKEUzLEZDLEZDLDFGKSwgVig3OSxCMSxCMSxDOCksIFYoQjYsNUIsNUIsRUQpLCBcCisgICAgVihENCw2QSw2QSxCRSksIFYoOEQsQ0IsQ0IsNDYpLCBWKDY3LEJFLEJFLEQ5KSwgVig3MiwzOSwzOSw0QiksIFwKKyAgICBWKDk0LDRBLDRBLERFKSwgVig5OCw0Qyw0QyxENCksIFYoQjAsNTgsNTgsRTgpLCBWKDg1LENGLENGLDRBKSwgXAorICAgIFYoQkIsRDAsRDAsNkIpLCBWKEM1LEVGLEVGLDJBKSwgVig0RixBQSxBQSxFNSksIFYoRUQsRkIsRkIsMTYpLCBcCisgICAgVig4Niw0Myw0MyxDNSksIFYoOUEsNEQsNEQsRDcpLCBWKDY2LDMzLDMzLDU1KSwgVigxMSw4NSw4NSw5NCksIFwKKyAgICBWKDhBLDQ1LDQ1LENGKSwgVihFOSxGOSxGOSwxMCksIFYoMDQsMDIsMDIsMDYpLCBWKEZFLDdGLDdGLDgxKSwgXAorICAgIFYoQTAsNTAsNTAsRjApLCBWKDc4LDNDLDNDLDQ0KSwgVigyNSw5Riw5RixCQSksIFYoNEIsQTgsQTgsRTMpLCBcCisgICAgVihBMiw1MSw1MSxGMyksIFYoNUQsQTMsQTMsRkUpLCBWKDgwLDQwLDQwLEMwKSwgVigwNSw4Riw4Riw4QSksIFwKKyAgICBWKDNGLDkyLDkyLEFEKSwgVigyMSw5RCw5RCxCQyksIFYoNzAsMzgsMzgsNDgpLCBWKEYxLEY1LEY1LDA0KSwgXAorICAgIFYoNjMsQkMsQkMsREYpLCBWKDc3LEI2LEI2LEMxKSwgVihBRixEQSxEQSw3NSksIFYoNDIsMjEsMjEsNjMpLCBcCisgICAgVigyMCwxMCwxMCwzMCksIFYoRTUsRkYsRkYsMUEpLCBWKEZELEYzLEYzLDBFKSwgVihCRixEMixEMiw2RCksIFwKKyAgICBWKDgxLENELENELDRDKSwgVigxOCwwQywwQywxNCksIFYoMjYsMTMsMTMsMzUpLCBWKEMzLEVDLEVDLDJGKSwgXAorICAgIFYoQkUsNUYsNUYsRTEpLCBWKDM1LDk3LDk3LEEyKSwgVig4OCw0NCw0NCxDQyksIFYoMkUsMTcsMTcsMzkpLCBcCisgICAgVig5MyxDNCxDNCw1NyksIFYoNTUsQTcsQTcsRjIpLCBWKEZDLDdFLDdFLDgyKSwgVig3QSwzRCwzRCw0NyksIFwKKyAgICBWKEM4LDY0LDY0LEFDKSwgVihCQSw1RCw1RCxFNyksIFYoMzIsMTksMTksMkIpLCBWKEU2LDczLDczLDk1KSwgXAorICAgIFYoQzAsNjAsNjAsQTApLCBWKDE5LDgxLDgxLDk4KSwgVig5RSw0Riw0RixEMSksIFYoQTMsREMsREMsN0YpLCBcCisgICAgVig0NCwyMiwyMiw2NiksIFYoNTQsMkEsMkEsN0UpLCBWKDNCLDkwLDkwLEFCKSwgVigwQiw4OCw4OCw4MyksIFwKKyAgICBWKDhDLDQ2LDQ2LENBKSwgVihDNyxFRSxFRSwyOSksIFYoNkIsQjgsQjgsRDMpLCBWKDI4LDE0LDE0LDNDKSwgXAorICAgIFYoQTcsREUsREUsNzkpLCBWKEJDLDVFLDVFLEUyKSwgVigxNiwwQiwwQiwxRCksIFYoQUQsREIsREIsNzYpLCBcCisgICAgVihEQixFMCxFMCwzQiksIFYoNjQsMzIsMzIsNTYpLCBWKDc0LDNBLDNBLDRFKSwgVigxNCwwQSwwQSwxRSksIFwKKyAgICBWKDkyLDQ5LDQ5LERCKSwgVigwQywwNiwwNiwwQSksIFYoNDgsMjQsMjQsNkMpLCBWKEI4LDVDLDVDLEU0KSwgXAorICAgIFYoOUYsQzIsQzIsNUQpLCBWKEJELEQzLEQzLDZFKSwgVig0MyxBQyxBQyxFRiksIFYoQzQsNjIsNjIsQTYpLCBcCisgICAgVigzOSw5MSw5MSxBOCksIFYoMzEsOTUsOTUsQTQpLCBWKEQzLEU0LEU0LDM3KSwgVihGMiw3OSw3OSw4QiksIFwKKyAgICBWKEQ1LEU3LEU3LDMyKSwgVig4QixDOCxDOCw0MyksIFYoNkUsMzcsMzcsNTkpLCBWKERBLDZELDZELEI3KSwgXAorICAgIFYoMDEsOEQsOEQsOEMpLCBWKEIxLEQ1LEQ1LDY0KSwgVig5Qyw0RSw0RSxEMiksIFYoNDksQTksQTksRTApLCBcCisgICAgVihEOCw2Qyw2QyxCNCksIFYoQUMsNTYsNTYsRkEpLCBWKEYzLEY0LEY0LDA3KSwgVihDRixFQSxFQSwyNSksIFwKKyAgICBWKENBLDY1LDY1LEFGKSwgVihGNCw3QSw3QSw4RSksIFYoNDcsQUUsQUUsRTkpLCBWKDEwLDA4LDA4LDE4KSwgXAorICAgIFYoNkYsQkEsQkEsRDUpLCBWKEYwLDc4LDc4LDg4KSwgVig0QSwyNSwyNSw2RiksIFYoNUMsMkUsMkUsNzIpLCBcCisgICAgVigzOCwxQywxQywyNCksIFYoNTcsQTYsQTYsRjEpLCBWKDczLEI0LEI0LEM3KSwgVig5NyxDNixDNiw1MSksIFwKKyAgICBWKENCLEU4LEU4LDIzKSwgVihBMSxERCxERCw3QyksIFYoRTgsNzQsNzQsOUMpLCBWKDNFLDFGLDFGLDIxKSwgXAorICAgIFYoOTYsNEIsNEIsREQpLCBWKDYxLEJELEJELERDKSwgVigwRCw4Qiw4Qiw4NiksIFYoMEYsOEEsOEEsODUpLCBcCisgICAgVihFMCw3MCw3MCw5MCksIFYoN0MsM0UsM0UsNDIpLCBWKDcxLEI1LEI1LEM0KSwgVihDQyw2Niw2NixBQSksIFwKKyAgICBWKDkwLDQ4LDQ4LEQ4KSwgVigwNiwwMywwMywwNSksIFYoRjcsRjYsRjYsMDEpLCBWKDFDLDBFLDBFLDEyKSwgXAorICAgIFYoQzIsNjEsNjEsQTMpLCBWKDZBLDM1LDM1LDVGKSwgVihBRSw1Nyw1NyxGOSksIFYoNjksQjksQjksRDApLCBcCisgICAgVigxNyw4Niw4Niw5MSksIFYoOTksQzEsQzEsNTgpLCBWKDNBLDFELDFELDI3KSwgVigyNyw5RSw5RSxCOSksIFwKKyAgICBWKEQ5LEUxLEUxLDM4KSwgVihFQixGOCxGOCwxMyksIFYoMkIsOTgsOTgsQjMpLCBWKDIyLDExLDExLDMzKSwgXAorICAgIFYoRDIsNjksNjksQkIpLCBWKEE5LEQ5LEQ5LDcwKSwgVigwNyw4RSw4RSw4OSksIFYoMzMsOTQsOTQsQTcpLCBcCisgICAgVigyRCw5Qiw5QixCNiksIFYoM0MsMUUsMUUsMjIpLCBWKDE1LDg3LDg3LDkyKSwgVihDOSxFOSxFOSwyMCksIFwKKyAgICBWKDg3LENFLENFLDQ5KSwgVihBQSw1NSw1NSxGRiksIFYoNTAsMjgsMjgsNzgpLCBWKEE1LERGLERGLDdBKSwgXAorICAgIFYoMDMsOEMsOEMsOEYpLCBWKDU5LEExLEExLEY4KSwgVigwOSw4OSw4OSw4MCksIFYoMUEsMEQsMEQsMTcpLCBcCisgICAgVig2NSxCRixCRixEQSksIFYoRDcsRTYsRTYsMzEpLCBWKDg0LDQyLDQyLEM2KSwgVihEMCw2OCw2OCxCOCksIFwKKyAgICBWKDgyLDQxLDQxLEMzKSwgVigyOSw5OSw5OSxCMCksIFYoNUEsMkQsMkQsNzcpLCBWKDFFLDBGLDBGLDExKSwgXAorICAgIFYoN0IsQjAsQjAsQ0IpLCBWKEE4LDU0LDU0LEZDKSwgVig2RCxCQixCQixENiksIFYoMkMsMTYsMTYsM0EpCisKKyNkZWZpbmUgVihhLGIsYyxkKSAweCMjYSMjYiMjYyMjZAorc3RhdGljIGNvbnN0IHVpbnQzMiBGVDBbMjU2XSA9IHsgRlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUgVihhLGIsYyxkKSAweCMjZCMjYSMjYiMjYworc3RhdGljIGNvbnN0IHVpbnQzMiBGVDFbMjU2XSA9IHsgRlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUgVihhLGIsYyxkKSAweCMjYyMjZCMjYSMjYgorc3RhdGljIGNvbnN0IHVpbnQzMiBGVDJbMjU2XSA9IHsgRlQgfTsKKyN1bmRlZiBWCisKKyNkZWZpbmUgVihhLGIsYyxkKSAweCMjYiMjYyMjZCMjYQorc3RhdGljIGNvbnN0IHVpbnQzMiBGVDNbMjU2XSA9IHsgRlQgfTsKKyN1bmRlZiBWCisKKyN1bmRlZiBGVAorCisvKiByZXZlcnNlIFMtYm94ICovCisKK3N0YXRpYyBjb25zdCB1aW50MzIgUlNiWzI1Nl0gPQoreworICAgIDB4NTIsIDB4MDksIDB4NkEsIDB4RDUsIDB4MzAsIDB4MzYsIDB4QTUsIDB4MzgsCisgICAgMHhCRiwgMHg0MCwgMHhBMywgMHg5RSwgMHg4MSwgMHhGMywgMHhENywgMHhGQiwKKyAgICAweDdDLCAweEUzLCAweDM5LCAweDgyLCAweDlCLCAweDJGLCAweEZGLCAweDg3LAorICAgIDB4MzQsIDB4OEUsIDB4NDMsIDB4NDQsIDB4QzQsIDB4REUsIDB4RTksIDB4Q0IsCisgICAgMHg1NCwgMHg3QiwgMHg5NCwgMHgzMiwgMHhBNiwgMHhDMiwgMHgyMywgMHgzRCwKKyAgICAweEVFLCAweDRDLCAweDk1LCAweDBCLCAweDQyLCAweEZBLCAweEMzLCAweDRFLAorICAgIDB4MDgsIDB4MkUsIDB4QTEsIDB4NjYsIDB4MjgsIDB4RDksIDB4MjQsIDB4QjIsCisgICAgMHg3NiwgMHg1QiwgMHhBMiwgMHg0OSwgMHg2RCwgMHg4QiwgMHhEMSwgMHgyNSwKKyAgICAweDcyLCAweEY4LCAweEY2LCAweDY0LCAweDg2LCAweDY4LCAweDk4LCAweDE2LAorICAgIDB4RDQsIDB4QTQsIDB4NUMsIDB4Q0MsIDB4NUQsIDB4NjUsIDB4QjYsIDB4OTIsCisgICAgMHg2QywgMHg3MCwgMHg0OCwgMHg1MCwgMHhGRCwgMHhFRCwgMHhCOSwgMHhEQSwKKyAgICAweDVFLCAweDE1LCAweDQ2LCAweDU3LCAweEE3LCAweDhELCAweDlELCAweDg0LAorICAgIDB4OTAsIDB4RDgsIDB4QUIsIDB4MDAsIDB4OEMsIDB4QkMsIDB4RDMsIDB4MEEsCisgICAgMHhGNywgMHhFNCwgMHg1OCwgMHgwNSwgMHhCOCwgMHhCMywgMHg0NSwgMHgwNiwKKyAgICAweEQwLCAweDJDLCAweDFFLCAweDhGLCAweENBLCAweDNGLCAweDBGLCAweDAyLAorICAgIDB4QzEsIDB4QUYsIDB4QkQsIDB4MDMsIDB4MDEsIDB4MTMsIDB4OEEsIDB4NkIsCisgICAgMHgzQSwgMHg5MSwgMHgxMSwgMHg0MSwgMHg0RiwgMHg2NywgMHhEQywgMHhFQSwKKyAgICAweDk3LCAweEYyLCAweENGLCAweENFLCAweEYwLCAweEI0LCAweEU2LCAweDczLAorICAgIDB4OTYsIDB4QUMsIDB4NzQsIDB4MjIsIDB4RTcsIDB4QUQsIDB4MzUsIDB4ODUsCisgICAgMHhFMiwgMHhGOSwgMHgzNywgMHhFOCwgMHgxQywgMHg3NSwgMHhERiwgMHg2RSwKKyAgICAweDQ3LCAweEYxLCAweDFBLCAweDcxLCAweDFELCAweDI5LCAweEM1LCAweDg5LAorICAgIDB4NkYsIDB4QjcsIDB4NjIsIDB4MEUsIDB4QUEsIDB4MTgsIDB4QkUsIDB4MUIsCisgICAgMHhGQywgMHg1NiwgMHgzRSwgMHg0QiwgMHhDNiwgMHhEMiwgMHg3OSwgMHgyMCwKKyAgICAweDlBLCAweERCLCAweEMwLCAweEZFLCAweDc4LCAweENELCAweDVBLCAweEY0LAorICAgIDB4MUYsIDB4REQsIDB4QTgsIDB4MzMsIDB4ODgsIDB4MDcsIDB4QzcsIDB4MzEsCisgICAgMHhCMSwgMHgxMiwgMHgxMCwgMHg1OSwgMHgyNywgMHg4MCwgMHhFQywgMHg1RiwKKyAgICAweDYwLCAweDUxLCAweDdGLCAweEE5LCAweDE5LCAweEI1LCAweDRBLCAweDBELAorICAgIDB4MkQsIDB4RTUsIDB4N0EsIDB4OUYsIDB4OTMsIDB4QzksIDB4OUMsIDB4RUYsCisgICAgMHhBMCwgMHhFMCwgMHgzQiwgMHg0RCwgMHhBRSwgMHgyQSwgMHhGNSwgMHhCMCwKKyAgICAweEM4LCAweEVCLCAweEJCLCAweDNDLCAweDgzLCAweDUzLCAweDk5LCAweDYxLAorICAgIDB4MTcsIDB4MkIsIDB4MDQsIDB4N0UsIDB4QkEsIDB4NzcsIDB4RDYsIDB4MjYsCisgICAgMHhFMSwgMHg2OSwgMHgxNCwgMHg2MywgMHg1NSwgMHgyMSwgMHgwQywgMHg3RAorfTsKKworLyogcmV2ZXJzZSB0YWJsZXMgKi8KKworI2RlZmluZSBSVCBcCitcCisgICAgVig1MSxGNCxBNyw1MCksIFYoN0UsNDEsNjUsNTMpLCBWKDFBLDE3LEE0LEMzKSwgVigzQSwyNyw1RSw5NiksIFwKKyAgICBWKDNCLEFCLDZCLENCKSwgVigxRiw5RCw0NSxGMSksIFYoQUMsRkEsNTgsQUIpLCBWKDRCLEUzLDAzLDkzKSwgXAorICAgIFYoMjAsMzAsRkEsNTUpLCBWKEFELDc2LDZELEY2KSwgVig4OCxDQyw3Niw5MSksIFYoRjUsMDIsNEMsMjUpLCBcCisgICAgVig0RixFNSxENyxGQyksIFYoQzUsMkEsQ0IsRDcpLCBWKDI2LDM1LDQ0LDgwKSwgVihCNSw2MixBMyw4RiksIFwKKyAgICBWKERFLEIxLDVBLDQ5KSwgVigyNSxCQSwxQiw2NyksIFYoNDUsRUEsMEUsOTgpLCBWKDVELEZFLEMwLEUxKSwgXAorICAgIFYoQzMsMkYsNzUsMDIpLCBWKDgxLDRDLEYwLDEyKSwgVig4RCw0Niw5NyxBMyksIFYoNkIsRDMsRjksQzYpLCBcCisgICAgVigwMyw4Riw1RixFNyksIFYoMTUsOTIsOUMsOTUpLCBWKEJGLDZELDdBLEVCKSwgVig5NSw1Miw1OSxEQSksIFwKKyAgICBWKEQ0LEJFLDgzLDJEKSwgVig1OCw3NCwyMSxEMyksIFYoNDksRTAsNjksMjkpLCBWKDhFLEM5LEM4LDQ0KSwgXAorICAgIFYoNzUsQzIsODksNkEpLCBWKEY0LDhFLDc5LDc4KSwgVig5OSw1OCwzRSw2QiksIFYoMjcsQjksNzEsREQpLCBcCisgICAgVihCRSxFMSw0RixCNiksIFYoRjAsODgsQUQsMTcpLCBWKEM5LDIwLEFDLDY2KSwgVig3RCxDRSwzQSxCNCksIFwKKyAgICBWKDYzLERGLDRBLDE4KSwgVihFNSwxQSwzMSw4MiksIFYoOTcsNTEsMzMsNjApLCBWKDYyLDUzLDdGLDQ1KSwgXAorICAgIFYoQjEsNjQsNzcsRTApLCBWKEJCLDZCLEFFLDg0KSwgVihGRSw4MSxBMCwxQyksIFYoRjksMDgsMkIsOTQpLCBcCisgICAgVig3MCw0OCw2OCw1OCksIFYoOEYsNDUsRkQsMTkpLCBWKDk0LERFLDZDLDg3KSwgVig1Miw3QixGOCxCNyksIFwKKyAgICBWKEFCLDczLEQzLDIzKSwgVig3Miw0QiwwMixFMiksIFYoRTMsMUYsOEYsNTcpLCBWKDY2LDU1LEFCLDJBKSwgXAorICAgIFYoQjIsRUIsMjgsMDcpLCBWKDJGLEI1LEMyLDAzKSwgVig4NixDNSw3Qiw5QSksIFYoRDMsMzcsMDgsQTUpLCBcCisgICAgVigzMCwyOCw4NyxGMiksIFYoMjMsQkYsQTUsQjIpLCBWKDAyLDAzLDZBLEJBKSwgVihFRCwxNiw4Miw1QyksIFwKKyAgICBWKDhBLENGLDFDLDJCKSwgVihBNyw3OSxCNCw5MiksIFYoRjMsMDcsRjIsRjApLCBWKDRFLDY5LEUyLEExKSwgXAorICAgIFYoNjUsREEsRjQsQ0QpLCBWKDA2LDA1LEJFLEQ1KSwgVihEMSwzNCw2MiwxRiksIFYoQzQsQTYsRkUsOEEpLCBcCisgICAgVigzNCwyRSw1Myw5RCksIFYoQTIsRjMsNTUsQTApLCBWKDA1LDhBLEUxLDMyKSwgVihBNCxGNixFQiw3NSksIFwKKyAgICBWKDBCLDgzLEVDLDM5KSwgVig0MCw2MCxFRixBQSksIFYoNUUsNzEsOUYsMDYpLCBWKEJELDZFLDEwLDUxKSwgXAorICAgIFYoM0UsMjEsOEEsRjkpLCBWKDk2LERELDA2LDNEKSwgVihERCwzRSwwNSxBRSksIFYoNEQsRTYsQkQsNDYpLCBcCisgICAgVig5MSw1NCw4RCxCNSksIFYoNzEsQzQsNUQsMDUpLCBWKDA0LDA2LEQ0LDZGKSwgVig2MCw1MCwxNSxGRiksIFwKKyAgICBWKDE5LDk4LEZCLDI0KSwgVihENixCRCxFOSw5NyksIFYoODksNDAsNDMsQ0MpLCBWKDY3LEQ5LDlFLDc3KSwgXAorICAgIFYoQjAsRTgsNDIsQkQpLCBWKDA3LDg5LDhCLDg4KSwgVihFNywxOSw1QiwzOCksIFYoNzksQzgsRUUsREIpLCBcCisgICAgVihBMSw3QywwQSw0NyksIFYoN0MsNDIsMEYsRTkpLCBWKEY4LDg0LDFFLEM5KSwgVigwMCwwMCwwMCwwMCksIFwKKyAgICBWKDA5LDgwLDg2LDgzKSwgVigzMiwyQixFRCw0OCksIFYoMUUsMTEsNzAsQUMpLCBWKDZDLDVBLDcyLDRFKSwgXAorICAgIFYoRkQsMEUsRkYsRkIpLCBWKDBGLDg1LDM4LDU2KSwgVigzRCxBRSxENSwxRSksIFYoMzYsMkQsMzksMjcpLCBcCisgICAgVigwQSwwRixEOSw2NCksIFYoNjgsNUMsQTYsMjEpLCBWKDlCLDVCLDU0LEQxKSwgVigyNCwzNiwyRSwzQSksIFwKKyAgICBWKDBDLDBBLDY3LEIxKSwgVig5Myw1NyxFNywwRiksIFYoQjQsRUUsOTYsRDIpLCBWKDFCLDlCLDkxLDlFKSwgXAorICAgIFYoODAsQzAsQzUsNEYpLCBWKDYxLERDLDIwLEEyKSwgVig1QSw3Nyw0Qiw2OSksIFYoMUMsMTIsMUEsMTYpLCBcCisgICAgVihFMiw5MyxCQSwwQSksIFYoQzAsQTAsMkEsRTUpLCBWKDNDLDIyLEUwLDQzKSwgVigxMiwxQiwxNywxRCksIFwKKyAgICBWKDBFLDA5LDBELDBCKSwgVihGMiw4QixDNyxBRCksIFYoMkQsQjYsQTgsQjkpLCBWKDE0LDFFLEE5LEM4KSwgXAorICAgIFYoNTcsRjEsMTksODUpLCBWKEFGLDc1LDA3LDRDKSwgVihFRSw5OSxERCxCQiksIFYoQTMsN0YsNjAsRkQpLCBcCisgICAgVihGNywwMSwyNiw5RiksIFYoNUMsNzIsRjUsQkMpLCBWKDQ0LDY2LDNCLEM1KSwgVig1QixGQiw3RSwzNCksIFwKKyAgICBWKDhCLDQzLDI5LDc2KSwgVihDQiwyMyxDNixEQyksIFYoQjYsRUQsRkMsNjgpLCBWKEI4LEU0LEYxLDYzKSwgXAorICAgIFYoRDcsMzEsREMsQ0EpLCBWKDQyLDYzLDg1LDEwKSwgVigxMyw5NywyMiw0MCksIFYoODQsQzYsMTEsMjApLCBcCisgICAgVig4NSw0QSwyNCw3RCksIFYoRDIsQkIsM0QsRjgpLCBWKEFFLEY5LDMyLDExKSwgVihDNywyOSxBMSw2RCksIFwKKyAgICBWKDFELDlFLDJGLDRCKSwgVihEQyxCMiwzMCxGMyksIFYoMEQsODYsNTIsRUMpLCBWKDc3LEMxLEUzLEQwKSwgXAorICAgIFYoMkIsQjMsMTYsNkMpLCBWKEE5LDcwLEI5LDk5KSwgVigxMSw5NCw0OCxGQSksIFYoNDcsRTksNjQsMjIpLCBcCisgICAgVihBOCxGQyw4QyxDNCksIFYoQTAsRjAsM0YsMUEpLCBWKDU2LDdELDJDLEQ4KSwgVigyMiwzMyw5MCxFRiksIFwKKyAgICBWKDg3LDQ5LDRFLEM3KSwgVihEOSwzOCxEMSxDMSksIFYoOEMsQ0EsQTIsRkUpLCBWKDk4LEQ0LDBCLDM2KSwgXAorICAgIFYoQTYsRjUsODEsQ0YpLCBWKEE1LDdBLERFLDI4KSwgVihEQSxCNyw4RSwyNiksIFYoM0YsQUQsQkYsQTQpLCBcCisgICAgVigyQywzQSw5RCxFNCksIFYoNTAsNzgsOTIsMEQpLCBWKDZBLDVGLENDLDlCKSwgVig1NCw3RSw0Niw2MiksIFwKKyAgICBWKEY2LDhELDEzLEMyKSwgVig5MCxEOCxCOCxFOCksIFYoMkUsMzksRjcsNUUpLCBWKDgyLEMzLEFGLEY1KSwgXAorICAgIFYoOUYsNUQsODAsQkUpLCBWKDY5LEQwLDkzLDdDKSwgVig2RixENSwyRCxBOSksIFYoQ0YsMjUsMTIsQjMpLCBcCisgICAgVihDOCxBQyw5OSwzQiksIFYoMTAsMTgsN0QsQTcpLCBWKEU4LDlDLDYzLDZFKSwgVihEQiwzQixCQiw3QiksIFwKKyAgICBWKENELDI2LDc4LDA5KSwgVig2RSw1OSwxOCxGNCksIFYoRUMsOUEsQjcsMDEpLCBWKDgzLDRGLDlBLEE4KSwgXAorICAgIFYoRTYsOTUsNkUsNjUpLCBWKEFBLEZGLEU2LDdFKSwgVigyMSxCQyxDRiwwOCksIFYoRUYsMTUsRTgsRTYpLCBcCisgICAgVihCQSxFNyw5QixEOSksIFYoNEEsNkYsMzYsQ0UpLCBWKEVBLDlGLDA5LEQ0KSwgVigyOSxCMCw3QyxENiksIFwKKyAgICBWKDMxLEE0LEIyLEFGKSwgVigyQSwzRiwyMywzMSksIFYoQzYsQTUsOTQsMzApLCBWKDM1LEEyLDY2LEMwKSwgXAorICAgIFYoNzQsNEUsQkMsMzcpLCBWKEZDLDgyLENBLEE2KSwgVihFMCw5MCxEMCxCMCksIFYoMzMsQTcsRDgsMTUpLCBcCisgICAgVihGMSwwNCw5OCw0QSksIFYoNDEsRUMsREEsRjcpLCBWKDdGLENELDUwLDBFKSwgVigxNyw5MSxGNiwyRiksIFwKKyAgICBWKDc2LDRELEQ2LDhEKSwgVig0MyxFRixCMCw0RCksIFYoQ0MsQUEsNEQsNTQpLCBWKEU0LDk2LDA0LERGKSwgXAorICAgIFYoOUUsRDEsQjUsRTMpLCBWKDRDLDZBLDg4LDFCKSwgVihDMSwyQywxRixCOCksIFYoNDYsNjUsNTEsN0YpLCBcCisgICAgVig5RCw1RSxFQSwwNCksIFYoMDEsOEMsMzUsNUQpLCBWKEZBLDg3LDc0LDczKSwgVihGQiwwQiw0MSwyRSksIFwKKyAgICBWKEIzLDY3LDFELDVBKSwgVig5MixEQixEMiw1MiksIFYoRTksMTAsNTYsMzMpLCBWKDZELEQ2LDQ3LDEzKSwgXAorICAgIFYoOUEsRDcsNjEsOEMpLCBWKDM3LEExLDBDLDdBKSwgVig1OSxGOCwxNCw4RSksIFYoRUIsMTMsM0MsODkpLCBcCisgICAgVihDRSxBOSwyNyxFRSksIFYoQjcsNjEsQzksMzUpLCBWKEUxLDFDLEU1LEVEKSwgVig3QSw0NyxCMSwzQyksIFwKKyAgICBWKDlDLEQyLERGLDU5KSwgVig1NSxGMiw3MywzRiksIFYoMTgsMTQsQ0UsNzkpLCBWKDczLEM3LDM3LEJGKSwgXAorICAgIFYoNTMsRjcsQ0QsRUEpLCBWKDVGLEZELEFBLDVCKSwgVihERiwzRCw2RiwxNCksIFYoNzgsNDQsREIsODYpLCBcCisgICAgVihDQSxBRixGMyw4MSksIFYoQjksNjgsQzQsM0UpLCBWKDM4LDI0LDM0LDJDKSwgVihDMixBMyw0MCw1RiksIFwKKyAgICBWKDE2LDFELEMzLDcyKSwgVihCQyxFMiwyNSwwQyksIFYoMjgsM0MsNDksOEIpLCBWKEZGLDBELDk1LDQxKSwgXAorICAgIFYoMzksQTgsMDEsNzEpLCBWKDA4LDBDLEIzLERFKSwgVihEOCxCNCxFNCw5QyksIFYoNjQsNTYsQzEsOTApLCBcCisgICAgVig3QixDQiw4NCw2MSksIFYoRDUsMzIsQjYsNzApLCBWKDQ4LDZDLDVDLDc0KSwgVihEMCxCOCw1Nyw0MikKKworI2RlZmluZSBWKGEsYixjLGQpIDB4IyNhIyNiIyNjIyNkCitzdGF0aWMgY29uc3QgdWludDMyIFJUMFsyNTZdID0geyBSVCB9OworI3VuZGVmIFYKKworI2RlZmluZSBWKGEsYixjLGQpIDB4IyNkIyNhIyNiIyNjCitzdGF0aWMgY29uc3QgdWludDMyIFJUMVsyNTZdID0geyBSVCB9OworI3VuZGVmIFYKKworI2RlZmluZSBWKGEsYixjLGQpIDB4IyNjIyNkIyNhIyNiCitzdGF0aWMgY29uc3QgdWludDMyIFJUMlsyNTZdID0geyBSVCB9OworI3VuZGVmIFYKKworI2RlZmluZSBWKGEsYixjLGQpIDB4IyNiIyNjIyNkIyNhCitzdGF0aWMgY29uc3QgdWludDMyIFJUM1syNTZdID0geyBSVCB9OworI3VuZGVmIFYKKworI3VuZGVmIFJUCisKKy8qIHJvdW5kIGNvbnN0YW50cyAqLworCitzdGF0aWMgY29uc3QgdWludDMyIFJDT05bMTBdID0KK3sKKyAgICAweDAxMDAwMDAwLCAweDAyMDAwMDAwLCAweDA0MDAwMDAwLCAweDA4MDAwMDAwLAorICAgIDB4MTAwMDAwMDAsIDB4MjAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4ODAwMDAwMDAsCisgICAgMHgxQjAwMDAwMCwgMHgzNjAwMDAwMAorfTsKKworaW50IGRvX2luaXQgPSAwOworCit2b2lkIGFlc19nZW5fdGFibGVzKCB2b2lkICkKK3sKK30KKworI2VuZGlmCisKKy8qIHBsYXRmb3JtLWluZGVwZW5kYW50IDMyLWJpdCBpbnRlZ2VyIG1hbmlwdWxhdGlvbiBtYWNyb3MgKi8KKworI2RlZmluZSBHRVRfVUlOVDMyX2FlcyhuLGIsaSkgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAobikgPSAoICh1aW50MzIpIChiKVsoaSkgICAgXSA8PCAyNCApICAgICAgIFwKKyAgICAgICAgfCAoICh1aW50MzIpIChiKVsoaSkgKyAxXSA8PCAxNiApICAgICAgIFwKKyAgICAgICAgfCAoICh1aW50MzIpIChiKVsoaSkgKyAyXSA8PCAgOCApICAgICAgIFwKKyAgICAgICAgfCAoICh1aW50MzIpIChiKVsoaSkgKyAzXSAgICAgICApOyAgICAgIFwKK30KKworI2RlZmluZSBQVVRfVUlOVDMyX2FlcyhuLGIsaSkgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYilbKGkpICAgIF0gPSAodWludDgpICggKG4pID4+IDI0ICk7ICAgICAgIFwKKyAgICAoYilbKGkpICsgMV0gPSAodWludDgpICggKG4pID4+IDE2ICk7ICAgICAgIFwKKyAgICAoYilbKGkpICsgMl0gPSAodWludDgpICggKG4pID4+ICA4ICk7ICAgICAgIFwKKyAgICAoYilbKGkpICsgM10gPSAodWludDgpICggKG4pICAgICAgICk7ICAgICAgIFwKK30KKworLyogZGVjcnlwdGlvbiBrZXkgc2NoZWR1bGUgdGFibGVzICovCisKK2ludCBLVF9pbml0ID0gMTsKKwordWludDMyIEtUMFsyNTZdOwordWludDMyIEtUMVsyNTZdOwordWludDMyIEtUMlsyNTZdOwordWludDMyIEtUM1syNTZdOworCisvKiBBRVMga2V5IHNjaGVkdWxpbmcgcm91dGluZSAqLworaW50IGFlc19zZXRfa2V5KCBhZXNfY29udGV4dCAqY3R4LCB1aW50OCAqa2V5LCBpbnQgbmJpdHMgKQoreworICAgIGludCBpOworICAgIHVpbnQzMiAqUkssICpTSzsKKworICAgIGlmKCBkb19pbml0ICkKKyAgICB7CisgICAgICAgIGFlc19nZW5fdGFibGVzKCk7CisKKyAgICAgICAgZG9faW5pdCA9IDA7CisgICAgfQorCisgICAgc3dpdGNoKCBuYml0cyApCisgICAgeworICAgICAgICBjYXNlIDEyODogY3R4LT5uciA9IDEwOyBicmVhazsKKyAgICAgICAgY2FzZSAxOTI6IGN0eC0+bnIgPSAxMjsgYnJlYWs7CisgICAgICAgIGNhc2UgMjU2OiBjdHgtPm5yID0gMTQ7IGJyZWFrOworICAgICAgICBkZWZhdWx0IDogcmV0dXJuKCAxICk7CisgICAgfQorCisgICAgUksgPSBjdHgtPmVyazsKKworICAgIGZvciggaSA9IDA7IGkgPCAobmJpdHMgPj4gNSk7IGkrKyApCisgICAgeworICAgICAgICBHRVRfVUlOVDMyX2FlcyggUktbaV0sIGtleSwgaSAqIDQgKTsKKyAgICB9CisKKyAgICAvKiBzZXR1cCBlbmNyeXB0aW9uIHJvdW5kIGtleXMgKi8KKworICAgIHN3aXRjaCggbmJpdHMgKQorICAgIHsKKyAgICBjYXNlIDEyODoKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgMTA7IGkrKywgUksgKz0gNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFJLWzRdICA9IFJLWzBdIF4gUkNPTltpXSBeCisgICAgICAgICAgICAgICAgICAgICAgICAoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdID4+IDE2ICkgXSA8PCAyNCApIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICggRlNiWyAodWludDgpICggUktbM10gPj4gIDggKSBdIDw8IDE2ICkgXgorICAgICAgICAgICAgICAgICAgICAgICAgKCBGU2JbICh1aW50OCkgKCBSS1szXSAgICAgICApIF0gPDwgIDggKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdID4+IDI0ICkgXSAgICAgICApOworCisgICAgICAgICAgICBSS1s1XSAgPSBSS1sxXSBeIFJLWzRdOworICAgICAgICAgICAgUktbNl0gID0gUktbMl0gXiBSS1s1XTsKKyAgICAgICAgICAgIFJLWzddICA9IFJLWzNdIF4gUktbNl07CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDE5MjoKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgODsgaSsrLCBSSyArPSA2ICkKKyAgICAgICAgeworICAgICAgICAgICAgUktbNl0gID0gUktbMF0gXiBSQ09OW2ldIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICggRlNiWyAodWludDgpICggUktbNV0gPj4gMTYgKSBdIDw8IDI0ICkgXgorICAgICAgICAgICAgICAgICAgICAgICAgKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAgOCApIF0gPDwgMTYgKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAoIEZTYlsgKHVpbnQ4KSAoIFJLWzVdICAgICAgICkgXSA8PCAgOCApIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICggRlNiWyAodWludDgpICggUktbNV0gPj4gMjQgKSBdICAgICAgICk7CisKKyAgICAgICAgICAgIFJLWzddICA9IFJLWzFdIF4gUktbNl07CisgICAgICAgICAgICBSS1s4XSAgPSBSS1syXSBeIFJLWzddOworICAgICAgICAgICAgUktbOV0gID0gUktbM10gXiBSS1s4XTsKKyAgICAgICAgICAgIFJLWzEwXSA9IFJLWzRdIF4gUktbOV07CisgICAgICAgICAgICBSS1sxMV0gPSBSS1s1XSBeIFJLWzEwXTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgMjU2OgorCisgICAgICAgIGZvciggaSA9IDA7IGkgPCA3OyBpKyssIFJLICs9IDggKQorICAgICAgICB7CisgICAgICAgICAgICBSS1s4XSAgPSBSS1swXSBeIFJDT05baV0gXgorICAgICAgICAgICAgICAgICAgICAgICAgKCBGU2JbICh1aW50OCkgKCBSS1s3XSA+PiAxNiApIF0gPDwgMjQgKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAoIEZTYlsgKHVpbnQ4KSAoIFJLWzddID4+ICA4ICkgXSA8PCAxNiApIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICggRlNiWyAodWludDgpICggUktbN10gICAgICAgKSBdIDw8ICA4ICkgXgorICAgICAgICAgICAgICAgICAgICAgICAgKCBGU2JbICh1aW50OCkgKCBSS1s3XSA+PiAyNCApIF0gICAgICAgKTsKKworICAgICAgICAgICAgUktbOV0gID0gUktbMV0gXiBSS1s4XTsKKyAgICAgICAgICAgIFJLWzEwXSA9IFJLWzJdIF4gUktbOV07CisgICAgICAgICAgICBSS1sxMV0gPSBSS1szXSBeIFJLWzEwXTsKKworICAgICAgICAgICAgUktbMTJdID0gUktbNF0gXgorICAgICAgICAgICAgICAgICAgICAgICAgKCBGU2JbICh1aW50OCkgKCBSS1sxMV0gPj4gMjQgKSBdIDw8IDI0ICkgXgorICAgICAgICAgICAgICAgICAgICAgICAgKCBGU2JbICh1aW50OCkgKCBSS1sxMV0gPj4gMTYgKSBdIDw8IDE2ICkgXgorICAgICAgICAgICAgICAgICAgICAgICAgKCBGU2JbICh1aW50OCkgKCBSS1sxMV0gPj4gIDggKSBdIDw8ICA4ICkgXgorICAgICAgICAgICAgICAgICAgICAgICAgKCBGU2JbICh1aW50OCkgKCBSS1sxMV0gICAgICAgKSBdICAgICAgICk7CisKKyAgICAgICAgICAgIFJLWzEzXSA9IFJLWzVdIF4gUktbMTJdOworICAgICAgICAgICAgUktbMTRdID0gUktbNl0gXiBSS1sxM107CisgICAgICAgICAgICBSS1sxNV0gPSBSS1s3XSBeIFJLWzE0XTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBzZXR1cCBkZWNyeXB0aW9uIHJvdW5kIGtleXMgKi8KKworICAgIGlmKCBLVF9pbml0ICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCAyNTY7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEtUMFtpXSA9IFJUMFsgRlNiW2ldIF07CisgICAgICAgICAgICBLVDFbaV0gPSBSVDFbIEZTYltpXSBdOworICAgICAgICAgICAgS1QyW2ldID0gUlQyWyBGU2JbaV0gXTsKKyAgICAgICAgICAgIEtUM1tpXSA9IFJUM1sgRlNiW2ldIF07CisgICAgICAgIH0KKworICAgICAgICBLVF9pbml0ID0gMDsKKyAgICB9CisKKyAgICBTSyA9IGN0eC0+ZHJrOworCisgICAgKlNLKysgPSAqUksrKzsKKyAgICAqU0srKyA9ICpSSysrOworICAgICpTSysrID0gKlJLKys7CisgICAgKlNLKysgPSAqUksrKzsKKworICAgIGZvciggaSA9IDE7IGkgPCBjdHgtPm5yOyBpKysgKQorICAgIHsKKyAgICAgICAgUksgLT0gODsKKworICAgICAgICAqU0srKyA9IEtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgorICAgICAgICAgICAgICAgIEtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgorICAgICAgICAgICAgICAgIEtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgorICAgICAgICAgICAgICAgIEtUM1sgKHVpbnQ4KSAoICpSSyAgICAgICApIF07IFJLKys7CisKKyAgICAgICAgKlNLKysgPSBLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KKyAgICAgICAgICAgICAgICBLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KKyAgICAgICAgICAgICAgICBLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KKyAgICAgICAgICAgICAgICBLVDNbICh1aW50OCkgKCAqUksgICAgICAgKSBdOyBSSysrOworCisgICAgICAgICpTSysrID0gS1QwWyAodWludDgpICggKlJLID4+IDI0ICkgXSBeCisgICAgICAgICAgICAgICAgS1QxWyAodWludDgpICggKlJLID4+IDE2ICkgXSBeCisgICAgICAgICAgICAgICAgS1QyWyAodWludDgpICggKlJLID4+ICA4ICkgXSBeCisgICAgICAgICAgICAgICAgS1QzWyAodWludDgpICggKlJLICAgICAgICkgXTsgUksrKzsKKworICAgICAgICAqU0srKyA9IEtUMFsgKHVpbnQ4KSAoICpSSyA+PiAyNCApIF0gXgorICAgICAgICAgICAgICAgIEtUMVsgKHVpbnQ4KSAoICpSSyA+PiAxNiApIF0gXgorICAgICAgICAgICAgICAgIEtUMlsgKHVpbnQ4KSAoICpSSyA+PiAgOCApIF0gXgorICAgICAgICAgICAgICAgIEtUM1sgKHVpbnQ4KSAoICpSSyAgICAgICApIF07IFJLKys7CisgICAgfQorCisgICAgUksgLT0gODsKKworICAgICpTSysrID0gKlJLKys7CisgICAgKlNLKysgPSAqUksrKzsKKyAgICAqU0srKyA9ICpSSysrOworICAgICpTSysrID0gKlJLKys7CisKKyAgICByZXR1cm4oIDAgKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL2FzcGVlZC9hc3QyNDAwL2FzdDI0MDAuYyBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL2FzdDI0MDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWJjY2JlCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDI0MDAvYXN0MjQwMC5jCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxwY2kuaD4KKworaW50IGJvYXJkX2luaXQgKHZvaWQpCit7CisgICAgREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisJdW5zaWduZWQgY2hhciBkYXRhOworCXVuc2lnbmVkIGxvbmcgZ3BpbzsKKwl1bnNpZ25lZCBsb25nIHJlZzsKKworICAgIC8qIEFIQiBDb250cm9sbGVyICovCisgICAgKigodm9sYXRpbGUgdWxvbmcqKSAweDFFNjAwMDAwKSAgPSAweEFFRUQxQTAzOwkvKiB1bmxvY2sgQUhCIGNvbnRyb2xsZXIgKi8KKyAgICAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MUU2MDAwOEMpIHw9IDB4MDE7CQkvKiBtYXAgRFJBTSB0byAweDAwMDAwMDAwICovCisKKyAgICAvKiBGbGFzaCBDb250cm9sbGVyICovCisjaWZkZWYJQ09ORklHX0ZMQVNIX0FTVDIzMDAKKyAgICAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2MjAwMDApIHw9IDB4ODAwZjAwMDA7CS8qIGVuYWJsZSBGbGFzaCBXcml0ZSAqLworI2Vsc2UKKyAgICAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MTYwMDAwMDApIHw9IDB4MDAwMDFjMDA7CS8qIGVuYWJsZSBGbGFzaCBXcml0ZSAqLworI2VuZGlmCisKKyAgICAvKiBTQ1UgKi8KKyAgICAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwMDApID0gMHgxNjg4QThBODsJLyogdW5sb2NrIFNDVSAqLworCXJlZyA9ICooKHZvbGF0aWxlIHVsb25nKikgMHgxZTZlMjAwOCk7CisJcmVnICY9IDB4MWMwZmZmZmY7CisJcmVnIHw9IDB4NjE4MDAwMDA7CQkJCS8qIFBDTEsgID0gSFBMTC84ICovCisjaWZkZWYgQ09ORklHX0FTVDEwNzAKKwkvL2NoZWNrIGxwYyBvciBscGMrIG1vZGUKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCWdwaW8gPSAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU3ODAwNzApOwkJLyogbW9kZSBjaGVjayAqLworCWlmKGdwaW8gJiAweDIpCisJCXJlZyB8PSAweDEwMDAwMDsJCQkJLyogTEhDTEsgPSBIUExMLzQgKi8KKwllbHNlCisJCXJlZyB8PSAweDMwMDAwMDsJCQkJLyogTEhDTEsgPSBIUExMLzggKi8KKworCXJlZyB8PSAweDgwMDAwOyAJCQkJLyogZW5hYmxlIExQQyBIb3N0IENsb2NrICovCisKKyAgICAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwMDgpID0gcmVnOworCisJcmVnID0gKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNmUyMDBjKTsJCS8qIGVuYWJsZSBMUEMgY2xvY2sgKi8KKwkqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwMGMpICY9IH4oMSA8PCAyOCk7CisKKwlpZihncGlvICYgMHgyKSB7CisKKwkJLy91c2UgTFBDKyBmb3Igc3lzIGNsaworCQkvLyBzZXQgT1NDQ0xLID0gVlBMTDEKKwkJKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNmUyMDEwKSA9IDB4MTg7CisKKwkJLy8gZW5hYmxlIE9TQ0NMSworCQlyZWcgPSAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwMmMpOworCQlyZWcgfD0gMHgwMDAwMDAwMjsKKwkJKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNmUyMDJjKSA9IHJlZzsKKwl9IGVsc2UgeworCQkvLyBVU0UgTFBDIHVzZSBEMiBjbGsKKwkJLypzZXQgVlBQTDEgKi8KKwkgICAgKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNmUyMDFjKSA9IDB4NjQyMDsKKworCQkvLyBzZXQgZDItcGxsICYgZW5hYmxlIGQyLXBsbCBEWzIxOjIwXSwgRFs0XQorCSAgICByZWcgPSAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwMmMpOworCSAgICByZWcgJj0gMHhmZmNmZmZlZjsKKwkgICAgcmVnIHw9IDB4MDAyMDAwMTA7CisJICAgICooKHZvbGF0aWxlIHVsb25nKikgMHgxZTZlMjAyYykgPSByZWc7CisKKwkJLy8gc2V0IE9TQ0NMSyA9IFZQTEwxCisJICAgICooKHZvbGF0aWxlIHVsb25nKikgMHgxZTZlMjAxMCkgPSAweDg7CisKKwkJLy8gZW5hYmxlIE9TQ0NMSworCSAgICByZWcgPSAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwMmMpOworCSAgICByZWcgJj0gMHhmZmZmZmZmZDsKKwkgICAgcmVnIHw9IDB4MDAwMDAwMDI7CisJICAgICooKHZvbGF0aWxlIHVsb25nKikgMHgxZTZlMjAyYykgPSByZWc7CisJfQorI2Vsc2UKKwkqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwMDgpID0gcmVnOworI2VuZGlmCisgICAgcmVnID0gKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNmUyMDBjKTsJCS8qIGVuYWJsZSAyRCBDbGsgKi8KKyAgICAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwMGMpICY9IDB4RkZGRkZGRkQ7CisvKiBlbmFibGUgd2lkZSBzY3JlZW4uIElmIHlvdXIgdmlkZW8gZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgd2lkZSBzY3JlZW4sIGRvbid0CitlbmFibGUgdGhpcyBiaXQgMHgxZTZlMjA0MCBEWzBdKi8KKyAgICByZWcgPSAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwNDApOworICAgICooKHZvbGF0aWxlIHVsb25nKikgMHgxZTZlMjA0MCkgfD0gMHgwMTsKKworICAgIC8qIGFyY2ggbnVtYmVyICovCisgICAgZ2QtPmJkLT5iaV9hcmNoX251bWJlciA9IE1BQ0hfVFlQRV9BU1BFRUQ7CisKKyAgICAvKiBhZHJlc3Mgb2YgYm9vdCBwYXJhbWV0ZXJzICovCisgICAgZ2QtPmJkLT5iaV9ib290X3BhcmFtcyA9IDB4NDAwMDAxMDA7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGRyYW1faW5pdCAodm9pZCkKK3sKKyAgICBERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworICAgIGdkLT5iZC0+YmlfZHJhbVswXS5zdGFydCA9IFBIWVNfU0RSQU1fMTsKKyAgICBnZC0+YmQtPmJpX2RyYW1bMF0uc2l6ZSAgPSBQSFlTX1NEUkFNXzFfU0laRTsKKworICAgIHJldHVybiAwOworfQorCisvKgorU0NVN0M6IFNpbGljb24gUmV2aXNpb24gSUQgUmVnaXN0ZXIKK0RbMzE6MjRdOiBDaGlwIElECiswOiBBU1QyMDUwL0FTVDIxMDAvQVNUMjE1MC9BU1QyMjAwL0FTVDMwMDAKKzE6IEFTVDIzMDAKKworRFsyMzoxNl0gU2lsaWNvbiByZXZpc2lvbiBJRCBmb3IgQVNUMjMwMCBnZW5lcmF0aW9uIGFuZCBsYXRlcgorMDogQTAKKzE6IEExCisyOiBBMgorLgorLgorLgorRlBHQSByZXZpc2lvbiBzdGFydHMgZnJvbSAweDgwCisKKworRFsxMTo4XSBCb3VuZGluZyBvcHRpb24KKworRFs3OjBdIFNpbGljb24gcmV2aXNpb24gSUQgZm9yIEFTVDIwNTAvQVNUMjEwMCBnZW5lcmF0aW9uIChmb3Igc29mdHdhcmUgY29tcGF0aWJsZSkKKzA6IEEwCisxOiBBMQorMjogQTIKKzM6IEEzCisuCisuCitGUEdBIHJldmlzaW9uIHN0YXJ0cyBmcm9tIDB4MDgsIDh+MTAgbWVhbnMgQTAsIDExKyBtZWFucyBBMSwgQVNUMjMwMCBzaG91bGQgYmUgYXNzaWduZWQgdG8gMworKi8KK2ludCB3YWl0X2NhbGlicmF0aW9uX2RvbmUoKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKwl1bnNpZ25lZCBsb25nIHJlZywgY291bnQgPSAwOworCisJZG8geworCQl1ZGVsYXkoMTAwMCk7CisJCWNvdW50Kys7CisJCWlmIChjb3VudCA+PSAxMDAwKSB7CisKKwkJCXJldHVybiAxOworCQl9CisJfSB3aGlsZSAoKCoodm9sYXRpbGUgdWxvbmcqKSAweDFlNmVjMDAwKSAmIDB4ZjAwKTsKKworLy8JcHJpbnRmICgiY291bnQgPSAlZFxuIiwgY291bnQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEFTVDEwNzAgQ2FsaWJyYXRpb24KK1Byb2dyYW0gMHgxMDEgdG8gMHgxZTZlYzAwMAorV2FpdCB0aWxsIDFlNmVjMDAwIFs4XSA9IDAKK0NoZWNrIDB4MWU2ZWMwMDQgPSAweDVhNWE1YTVhCisqLworaW50IGFzdDEwNzBfY2FsaWJyYXRpb24oKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKwl1bnNpZ25lZCBsb25nIHJlZywgaSwgajsKKworCS8vb25seSBmb3IgMiBjaGlwCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisvLwkJCXByaW50ZiAoImNoaXAgPSAlZCwgZGVsYXkgPSAlZFxuIiwgaSwgaik7CisJCQkqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZWMwMDApID0gKGogPDwgKDEyICsgaSAqIDIpKSArICgxIDw8ICg4ICsgaSkpICsgMHgwMTsKKy8vCQkJcHJpbnRmICgiMWU2ZWMwMDAgPSAleFxuIiwgKih2b2xhdGlsZSB1bG9uZyopMHgxZTZlYzAwMCk7CisJCQlpZiAoIXdhaXRfY2FsaWJyYXRpb25fZG9uZSgpKSB7CisJCQkJaWYgKCgqKHZvbGF0aWxlIHVsb25nKikgMHgxZTZlYzAwNCkgPT0gMHg1YTVhNWE1YSkgeworLy8JCQkJCXByaW50ZiAoImNhbGlicmF0aW9uIHJlc3VsdDogY2hpcCAlZCBwYXNzLCB0aW1pbmcgPSAlZFxuIiwgaSwgaik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlIHsKKy8vCQkJCQlwcmludGYgKCJjYWxpYnJhdGlvbiByZXN1bHQ6IGNoaXAgJWQgZmFpbCwgdGltaW5nID0gJWRcbiIsIGksIGopOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitpbnQgbWlzY19pbml0X3Iodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgcmVnLCByZWcxLCByZXZpc2lvbiwgY2hpcF9pZCwgbHBjX3BsdXM7CisKKyNpZmRlZiBDT05GSUdfQVNUMTA3MAorCS8vUmVzZXQgQVNUMTA3MCBhbmQgQVNUMjQwMCBlbmdpbmUgW2JpdCAyMzoxNV0KKwlyZWcgPSAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU3ODkwYTApOworCXJlZyAmPSB+MHg4MDgwMDA7CisJKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNzg5MGEwKSA9IHJlZzsKKworCXVkZWxheSg1MDAwKTsKKworCWxwY19wbHVzID0gKCooKHZvbGF0aWxlIHVsb25nKikgMHgxZTc4MDA3MCkpICYgMHgyOworCisJcmVnID0gKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNzg5MGEwKTsKKwlyZWcgfD0gMHg4MDAwMDA7CisJKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNzg5MGEwKSA9IHJlZzsKKworCXVkZWxheSgxMDAwKTsKKworCXJlZyA9ICooKHZvbGF0aWxlIHVsb25nKikgMHgxZTc4OTBhMCk7CisJcmVnIHw9IDB4MDA4MDAwOworCSooKHZvbGF0aWxlIHVsb25nKikgMHgxZTc4OTBhMCkgPSByZWc7CisKKworCWlmKGxwY19wbHVzKSB7CisJCSooKHZvbGF0aWxlIHVsb25nKikgMHgxRTYwMDA4QykgfD0gMHgwMTE7CQkvKiBtYXAgRFJBTSB0byAweDAwMDAwMDAwIGFuZCBMUEMrIDB4NzAwMDAwMDAqLworCisJCS8vU0NVIG11bHRpLUZ1bmN0aW9uIHBpbgorCQlyZWcgPSAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwOTApOworCQlyZWcgfD0gKDEgPDwgMzApOworCQkqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwOTApID0gcmVnOworCQkvL0xQQysgRW5naW5lIEVuYWJsZQorCQlyZWcgPSAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZWMwMDApOworCQlyZWcgfD0gMTsKKwkJKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNmVjMDAwKSA9IHJlZzsKKworCQlhc3QxMDcwX2NhbGlicmF0aW9uKCk7CisKKwl9IGVsc2UgeworCQkvLyBlbmFibGUgQVNUMTA1MCdzIExQQyBtYXN0ZXIKKwkJcmVnID0gKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNzg5MGEwKTsKKwkJKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNzg5MGEwKSB8PSAweDExOworCisJfQorCisjZW5kaWYKKyAgICAvKiBTaG93IEgvVyBWZXJzaW9uICovCisgICAgcmVnMSA9ICh1bnNpZ25lZCBpbnQpICgqKCh1bG9uZyopIDB4MWU2ZTIwN2MpKTsKKyAgICBjaGlwX2lkID0gKHJlZzEgJiAweGZmMDAwMDAwKSA+PiAyNDsKKyAgICByZXZpc2lvbiA9IChyZWcxICYgMHhmZjAwMDApID4+IDE2OworCisgICAgcHV0cyAoIkgvVzogICAiKTsKKyAgICBpZiAoY2hpcF9pZCA9PSAxKSB7CisgICAgCWlmIChyZXZpc2lvbiA+PSAweDgwKSB7CisgICAgCQlwcmludGYoIkFTVDIzMDAgc2VyaWVzIEZQR0EgUmV2LiAlMDJ4IFxuIiwgcmV2aXNpb24pOworICAgIAl9CisgICAgCWVsc2UgeworICAgIAkJcHJpbnRmKCJBU1QyMzAwIHNlcmllcyBjaGlwIFJldi4gJTAyeCBcbiIsIHJldmlzaW9uKTsKKyAgICAJfQorICAgIH0KKyAgICBlbHNlIGlmIChjaGlwX2lkID09IDIpIHsKKyAgICAJcHJpbnRmKCJBU1QyNDAwIHNlcmllcyBjaGlwIFJldi4gJTAyeCBcbiIsIHJldmlzaW9uKTsKKyAgICB9CisgICAgZWxzZSBpZiAoY2hpcF9pZCA9PSAwKSB7CisJCXByaW50ZigiQVNUMjA1MC9BU1QyMTUwIHNlcmllcyBjaGlwXG4iKTsKKyAgICB9CisKKyNpZmRlZiBDT05GSUdfQVNUMTA3MAorCWlmKGxwY19wbHVzKSB7CisJCXB1dHMgKCJDL0M6ICAgTFBDKyA6Iik7CisJCXJldmlzaW9uID0gKHVuc2lnbmVkIGludCkgKCooKHVsb25nKikgMHg3MDAwMjAzNCkpOworCQlwcmludGYoIkFTVDEwNzAgSUQgWyUwOHhdICIsIHJldmlzaW9uKTsKKworCQlpZigoKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNzgwMDcwKSkgJiAweDQpIHsKKwkJCWlmKCh1bnNpZ25lZCBpbnQpICgqKCh1bG9uZyopIDB4NzAwMTIwMzQpKSA9PSAweDEwNzAwMDAxKQorCQkJCXByaW50ZigiLCAybmQgOiBBU1QxMDcwIElEIFslMDh4XSBcbiIsICh1bnNpZ25lZCBpbnQpICgqKCh1bG9uZyopIDB4NzAwMTIwMzQpKSk7CisJCQllbHNlCisJCQkJcHJpbnRmKCJcbiIpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCJcbiIpOworCQl9CisJfSBlbHNlIHsKKwkJcHV0cyAoIkMvQzogICBMUEMgIDoiKTsKKwkJcmV2aXNpb24gPSAodW5zaWduZWQgaW50KSAoKigodWxvbmcqKSAweDYwMDAyMDM0KSk7CisJCXByaW50ZigiTFBDIDogQVNUMTA3MCBJRCBbJTA4eF0gXG4iLCByZXZpc2lvbik7CisKKwl9CisjZW5kaWYKKworI2lmZGVmCUNPTkZJR19QQ0kKKyAgICBwY2lfaW5pdCAoKTsKKyNlbmRpZgorCisgICAgaWYgKGdldGVudiAoInZlcmlmeSIpID09IE5VTEwpIHsKKwlzZXRlbnYgKCJ2ZXJpZnkiLCAibiIpOworICAgIH0KKyAgICBpZiAoZ2V0ZW52ICgiZWVwcm9tIikgPT0gTlVMTCkgeworCXNldGVudiAoImVlcHJvbSIsICJ5Iik7CisgICAgfQorfQorCisjaWZkZWYJQ09ORklHX1BDSQorc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBob3NlOworCitleHRlcm4gdm9pZCBhc3BlZWRfaW5pdF9wY2kgKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSk7CisKK3ZvaWQgcGNpX2luaXRfYm9hcmQodm9pZCkKK3sKKyAgICBhc3BlZWRfaW5pdF9wY2koJmhvc2UpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjQwMC9jb25maWcubWsgYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjRjYTA5YgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL2NvbmZpZy5tawpAQCAtMCwwICsxLDE4IEBACisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKKyMgUk9NIHZlcnNpb24KKyNURVhUX0JBU0UgPSAweEJGQzAwMDAwCisKKyMgUkFNIHZlcnNpb24KK1RFWFRfQkFTRSA9IDB4NDA1MDAwMDAKKyNURVhUX0JBU0UgPSAweDAwMDAwMDAwCisjVEVYVF9CQVNFID0gMHgwMDQwMDAwMApkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDI0MDAvY3JjMzIuYyBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL2NyYzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2M4ZDJhYwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL2NyYzMyLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8ZW52aXJvbm1lbnQuaD4KKworI2lmZGVmIENPTkZJR18yU1BJRkxBU0gKKworZXh0ZXJuIGZsYXNoX2luZm9fdCBmbGFzaF9pbmZvW0NGR19NQVhfRkxBU0hfQkFOS1NdOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRhYmxlIG9mIENSQy0zMidzIG9mIGFsbCBzaW5nbGUtYnl0ZSB2YWx1ZXMgKG1hZGUgYnkgbWFrZV9hc3BlZWRfY3JjX3RhYmxlKQorICovCit1bnNpZ25lZCBsb25nIGFzcGVlZF9jcmNfdGFibGVbMjU2XSA9IHsKKyAgMHgwMDAwMDAwMEwsIDB4NzcwNzMwOTZMLCAweGVlMGU2MTJjTCwgMHg5OTA5NTFiYUwsIDB4MDc2ZGM0MTlMLAorICAweDcwNmFmNDhmTCwgMHhlOTYzYTUzNUwsIDB4OWU2NDk1YTNMLCAweDBlZGI4ODMyTCwgMHg3OWRjYjhhNEwsCisgIDB4ZTBkNWU5MWVMLCAweDk3ZDJkOTg4TCwgMHgwOWI2NGMyYkwsIDB4N2ViMTdjYmRMLCAweGU3YjgyZDA3TCwKKyAgMHg5MGJmMWQ5MUwsIDB4MWRiNzEwNjRMLCAweDZhYjAyMGYyTCwgMHhmM2I5NzE0OEwsIDB4ODRiZTQxZGVMLAorICAweDFhZGFkNDdkTCwgMHg2ZGRkZTRlYkwsIDB4ZjRkNGI1NTFMLCAweDgzZDM4NWM3TCwgMHgxMzZjOTg1NkwsCisgIDB4NjQ2YmE4YzBMLCAweGZkNjJmOTdhTCwgMHg4YTY1YzllY0wsIDB4MTQwMTVjNGZMLCAweDYzMDY2Y2Q5TCwKKyAgMHhmYTBmM2Q2M0wsIDB4OGQwODBkZjVMLCAweDNiNmUyMGM4TCwgMHg0YzY5MTA1ZUwsIDB4ZDU2MDQxZTRMLAorICAweGEyNjc3MTcyTCwgMHgzYzAzZTRkMUwsIDB4NGIwNGQ0NDdMLCAweGQyMGQ4NWZkTCwgMHhhNTBhYjU2YkwsCisgIDB4MzViNWE4ZmFMLCAweDQyYjI5ODZjTCwgMHhkYmJiYzlkNkwsIDB4YWNiY2Y5NDBMLCAweDMyZDg2Y2UzTCwKKyAgMHg0NWRmNWM3NUwsIDB4ZGNkNjBkY2ZMLCAweGFiZDEzZDU5TCwgMHgyNmQ5MzBhY0wsIDB4NTFkZTAwM2FMLAorICAweGM4ZDc1MTgwTCwgMHhiZmQwNjExNkwsIDB4MjFiNGY0YjVMLCAweDU2YjNjNDIzTCwgMHhjZmJhOTU5OUwsCisgIDB4YjhiZGE1MGZMLCAweDI4MDJiODllTCwgMHg1ZjA1ODgwOEwsIDB4YzYwY2Q5YjJMLCAweGIxMGJlOTI0TCwKKyAgMHgyZjZmN2M4N0wsIDB4NTg2ODRjMTFMLCAweGMxNjExZGFiTCwgMHhiNjY2MmQzZEwsIDB4NzZkYzQxOTBMLAorICAweDAxZGI3MTA2TCwgMHg5OGQyMjBiY0wsIDB4ZWZkNTEwMmFMLCAweDcxYjE4NTg5TCwgMHgwNmI2YjUxZkwsCisgIDB4OWZiZmU0YTVMLCAweGU4YjhkNDMzTCwgMHg3ODA3YzlhMkwsIDB4MGYwMGY5MzRMLCAweDk2MDlhODhlTCwKKyAgMHhlMTBlOTgxOEwsIDB4N2Y2YTBkYmJMLCAweDA4NmQzZDJkTCwgMHg5MTY0NmM5N0wsIDB4ZTY2MzVjMDFMLAorICAweDZiNmI1MWY0TCwgMHgxYzZjNjE2MkwsIDB4ODU2NTMwZDhMLCAweGYyNjIwMDRlTCwgMHg2YzA2OTVlZEwsCisgIDB4MWIwMWE1N2JMLCAweDgyMDhmNGMxTCwgMHhmNTBmYzQ1N0wsIDB4NjViMGQ5YzZMLCAweDEyYjdlOTUwTCwKKyAgMHg4YmJlYjhlYUwsIDB4ZmNiOTg4N2NMLCAweDYyZGQxZGRmTCwgMHgxNWRhMmQ0OUwsIDB4OGNkMzdjZjNMLAorICAweGZiZDQ0YzY1TCwgMHg0ZGIyNjE1OEwsIDB4M2FiNTUxY2VMLCAweGEzYmMwMDc0TCwgMHhkNGJiMzBlMkwsCisgIDB4NGFkZmE1NDFMLCAweDNkZDg5NWQ3TCwgMHhhNGQxYzQ2ZEwsIDB4ZDNkNmY0ZmJMLCAweDQzNjllOTZhTCwKKyAgMHgzNDZlZDlmY0wsIDB4YWQ2Nzg4NDZMLCAweGRhNjBiOGQwTCwgMHg0NDA0MmQ3M0wsIDB4MzMwMzFkZTVMLAorICAweGFhMGE0YzVmTCwgMHhkZDBkN2NjOUwsIDB4NTAwNTcxM2NMLCAweDI3MDI0MWFhTCwgMHhiZTBiMTAxMEwsCisgIDB4YzkwYzIwODZMLCAweDU3NjhiNTI1TCwgMHgyMDZmODViM0wsIDB4Yjk2NmQ0MDlMLCAweGNlNjFlNDlmTCwKKyAgMHg1ZWRlZjkwZUwsIDB4MjlkOWM5OThMLCAweGIwZDA5ODIyTCwgMHhjN2Q3YThiNEwsIDB4NTliMzNkMTdMLAorICAweDJlYjQwZDgxTCwgMHhiN2JkNWMzYkwsIDB4YzBiYTZjYWRMLCAweGVkYjg4MzIwTCwgMHg5YWJmYjNiNkwsCisgIDB4MDNiNmUyMGNMLCAweDc0YjFkMjlhTCwgMHhlYWQ1NDczOUwsIDB4OWRkMjc3YWZMLCAweDA0ZGIyNjE1TCwKKyAgMHg3M2RjMTY4M0wsIDB4ZTM2MzBiMTJMLCAweDk0NjQzYjg0TCwgMHgwZDZkNmEzZUwsIDB4N2E2YTVhYThMLAorICAweGU0MGVjZjBiTCwgMHg5MzA5ZmY5ZEwsIDB4MGEwMGFlMjdMLCAweDdkMDc5ZWIxTCwgMHhmMDBmOTM0NEwsCisgIDB4ODcwOGEzZDJMLCAweDFlMDFmMjY4TCwgMHg2OTA2YzJmZUwsIDB4Zjc2MjU3NWRMLCAweDgwNjU2N2NiTCwKKyAgMHgxOTZjMzY3MUwsIDB4NmU2YjA2ZTdMLCAweGZlZDQxYjc2TCwgMHg4OWQzMmJlMEwsIDB4MTBkYTdhNWFMLAorICAweDY3ZGQ0YWNjTCwgMHhmOWI5ZGY2ZkwsIDB4OGViZWVmZjlMLCAweDE3YjdiZTQzTCwgMHg2MGIwOGVkNUwsCisgIDB4ZDZkNmEzZThMLCAweGExZDE5MzdlTCwgMHgzOGQ4YzJjNEwsIDB4NGZkZmYyNTJMLCAweGQxYmI2N2YxTCwKKyAgMHhhNmJjNTc2N0wsIDB4M2ZiNTA2ZGRMLCAweDQ4YjIzNjRiTCwgMHhkODBkMmJkYUwsIDB4YWYwYTFiNGNMLAorICAweDM2MDM0YWY2TCwgMHg0MTA0N2E2MEwsIDB4ZGY2MGVmYzNMLCAweGE4NjdkZjU1TCwgMHgzMTZlOGVlZkwsCisgIDB4NDY2OWJlNzlMLCAweGNiNjFiMzhjTCwgMHhiYzY2ODMxYUwsIDB4MjU2ZmQyYTBMLCAweDUyNjhlMjM2TCwKKyAgMHhjYzBjNzc5NUwsIDB4YmIwYjQ3MDNMLCAweDIyMDIxNmI5TCwgMHg1NTA1MjYyZkwsIDB4YzViYTNiYmVMLAorICAweGIyYmQwYjI4TCwgMHgyYmI0NWE5MkwsIDB4NWNiMzZhMDRMLCAweGMyZDdmZmE3TCwgMHhiNWQwY2YzMUwsCisgIDB4MmNkOTllOGJMLCAweDViZGVhZTFkTCwgMHg5YjY0YzJiMEwsIDB4ZWM2M2YyMjZMLCAweDc1NmFhMzljTCwKKyAgMHgwMjZkOTMwYUwsIDB4OWMwOTA2YTlMLCAweGViMGUzNjNmTCwgMHg3MjA3Njc4NUwsIDB4MDUwMDU3MTNMLAorICAweDk1YmY0YTgyTCwgMHhlMmI4N2ExNEwsIDB4N2JiMTJiYWVMLCAweDBjYjYxYjM4TCwgMHg5MmQyOGU5YkwsCisgIDB4ZTVkNWJlMGRMLCAweDdjZGNlZmI3TCwgMHgwYmRiZGYyMUwsIDB4ODZkM2QyZDRMLCAweGYxZDRlMjQyTCwKKyAgMHg2OGRkYjNmOEwsIDB4MWZkYTgzNmVMLCAweDgxYmUxNmNkTCwgMHhmNmI5MjY1YkwsIDB4NmZiMDc3ZTFMLAorICAweDE4Yjc0Nzc3TCwgMHg4ODA4NWFlNkwsIDB4ZmYwZjZhNzBMLCAweDY2MDYzYmNhTCwgMHgxMTAxMGI1Y0wsCisgIDB4OGY2NTllZmZMLCAweGY4NjJhZTY5TCwgMHg2MTZiZmZkM0wsIDB4MTY2Y2NmNDVMLCAweGEwMGFlMjc4TCwKKyAgMHhkNzBkZDJlZUwsIDB4NGUwNDgzNTRMLCAweDM5MDNiM2MyTCwgMHhhNzY3MjY2MUwsIDB4ZDA2MDE2ZjdMLAorICAweDQ5Njk0NzRkTCwgMHgzZTZlNzdkYkwsIDB4YWVkMTZhNGFMLCAweGQ5ZDY1YWRjTCwgMHg0MGRmMGI2NkwsCisgIDB4MzdkODNiZjBMLCAweGE5YmNhZTUzTCwgMHhkZWJiOWVjNUwsIDB4NDdiMmNmN2ZMLCAweDMwYjVmZmU5TCwKKyAgMHhiZGJkZjIxY0wsIDB4Y2FiYWMyOGFMLCAweDUzYjM5MzMwTCwgMHgyNGI0YTNhNkwsIDB4YmFkMDM2MDVMLAorICAweGNkZDcwNjkzTCwgMHg1NGRlNTcyOUwsIDB4MjNkOTY3YmZMLCAweGIzNjY3YTJlTCwgMHhjNDYxNGFiOEwsCisgIDB4NWQ2ODFiMDJMLCAweDJhNmYyYjk0TCwgMHhiNDBiYmUzN0wsIDB4YzMwYzhlYTFMLCAweDVhMDVkZjFiTCwKKyAgMHgyZDAyZWY4ZEwKK307CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNkZWZpbmUgQVNQRUVEX0RPMShidWYpICBjcmMgPSBhc3BlZWRfY3JjX3RhYmxlWygoaW50KWNyYyBeICgqYnVmKyspKSAmIDB4ZmZdIF4gKGNyYyA+PiA4KTsKKyNkZWZpbmUgQVNQRUVEX0RPMihidWYpICBBU1BFRURfRE8xKGJ1Zik7IEFTUEVFRF9ETzEoYnVmKTsKKyNkZWZpbmUgQVNQRUVEX0RPNChidWYpICBBU1BFRURfRE8yKGJ1Zik7IEFTUEVFRF9ETzIoYnVmKTsKKyNkZWZpbmUgQVNQRUVEX0RPOChidWYpICBBU1BFRURfRE80KGJ1Zik7IEFTUEVFRF9ETzQoYnVmKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwordW5zaWduZWQgbG9uZyBzcGkyX2NyYzMyKGNyYywgYnVmLCBsZW4pCisgICAgdW5zaWduZWQgbG9uZyBjcmM7CisgICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgIHVuc2lnbmVkIGxvbmcgbGVuOworeworCisgICAgc2l6ZV90IGxlbjEsIGxlbjI7CisgICAgY2hhciAqczsKKworICAgIGxlbjEgPSBsZW4yID0gMDsKKyAgICBpZiAoICh1bG9uZykoYnVmKSA8PSAoZmxhc2hfaW5mb1swXS5zdGFydFswXSArIGZsYXNoX2luZm9bMF0uc2l6ZSkgKQorICAgICAgICBsZW4xID0gKGZsYXNoX2luZm9bMF0uc3RhcnRbMF0gKyBmbGFzaF9pbmZvWzBdLnNpemUpIC0gKHVsb25nKShidWYpOworICAgIAorICAgIGxlbjEgPSAobGVuIDwgbGVuMSkgPyBsZW46bGVuMTsKKyAgICBsZW4yID0gKGxlbiA8IGxlbjEpID8gMDogKGxlbiAtIGxlbjEpOworCisgICAgY3JjID0gY3JjIF4gMHhmZmZmZmZmZkw7CisgICAgd2hpbGUgKGxlbjEgPj0gOCkKKyAgICB7CisgICAgICBBU1BFRURfRE84KGJ1Zik7CisgICAgICBsZW4xIC09IDg7CisgICAgfQorICAgIGlmIChsZW4xKSBkbyB7CisgICAgICBBU1BFRURfRE8xKGJ1Zik7CisgICAgfSB3aGlsZSAoLS1sZW4xKTsKKyAgICAKKyAgICAvL3MgPSAoY2hhciAqKSBmbGFzaF9pbmZvWzFdLnN0YXJ0WzBdOworICAgIHM9IChjaGFyICopIGZsYXNoX21ha2VfYWRkciAoJmZsYXNoX2luZm9bMV0sIDAsIDApOworICAgIHdoaWxlIChsZW4yID49IDgpCisgICAgeworICAgICAgQVNQRUVEX0RPOChzKTsKKyAgICAgIGxlbjIgLT0gODsKKyAgICB9CisgICAgaWYgKGxlbjIpIGRvIHsKKyAgICAgIEFTUEVFRF9ETzEocyk7CisgICAgfSB3aGlsZSAoLS1sZW4yKTsgICAKKworICAgIHJldHVybiBjcmMgXiAweGZmZmZmZmZmTDsKKyAgICAKK30KKworI2VuZGlmIC8qIENPTkZJR18yU1BJRkxBU0ggKi8KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDI0MDAvY3J0LmMgYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC9jcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNjdmNjY5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDI0MDAvY3J0LmMKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKworI2luY2x1ZGUgInR5cGUuaCIKKyNpbmNsdWRlICJ2ZXNhLmgiCisjaW5jbHVkZSAidmRlZi5oIgorI2luY2x1ZGUgInZmdW4uaCIKKyNpbmNsdWRlICJ2cmVnLmgiCisjaW5jbHVkZSAiY3J0LmgiCisKK1VMT05HIEFTVDMwMDBEQ0xLVGFibGVWIFtdID0geworICAgIDB4MDAwNDY1MTUsICAgICAvKiAwMDogVkNMSzI1XzE3NSAqLyAgCisgICAgMHgwMDA0NzI1NSwgICAgIC8qIDAxOiBWQ0xLMjhfMzIyICovCisgICAgMHgwMDA0NjgyYSwgICAgIC8qIDAyOiBWQ0xLMzFfNSAgICAgICAgICovCisgICAgMHgwMDA0NjcyYSwgICAgIC8qIDAzOiBWQ0xLMzYgICAgICAgICAgKi8KKyAgICAweDAwMDQ2YzUwLCAgICAgLyogMDQ6IFZDTEs0MCAgICAgICAgICAgKi8KKyAgICAweDAwMDQ2ODQyLCAgICAgLyogMDU6IFZDTEs0OV81ICAgICAgICAgKi8KKyAgICAweDAwMDA2YzMyLCAgICAgLyogMDY6IFZDTEs1MCAgICAgICAgICAgKi8KKyAgICAweDAwMDA2YTJmLCAgICAgLyogMDc6IFZDTEs1Nl8yNSAgICAgICAgKi8KKyAgICAweDAwMDA2YzQxLCAgICAgLyogMDg6IFZDTEs2NSAgKi8KKyAgICAweDAwMDA2ODMyLCAgICAgLyogMDk6IFZDTEs3NSAgICAgICAgICovCisgICAgMHgwMDAwNjcyZSwgICAgIC8qIDBBOiBWQ0xLNzhfNzUgICAgICAgICovCisgICAgMHgwMDAwNjgzZiwgICAgIC8qIDBCOiBWQ0xLOTRfNSAgICAgICAgICovCisgICAgMHgwMDAwNDgyNCwgICAgIC8qIDBDOiBWQ0xLMTA4ICAgICAgICAgICovCisJMHgwMDAwNDcyMywJCS8qIDBEOiBWQ0xLMTE5CQkJKi8KKyAgICAweDAwMDA0ODJkLCAgICAgLyogMEU6IFZDTEsxMzUgICAgICAgICAgKi8KKwkweDAwMDA0QjM3LAkJLyogMEY6IFZDTEsxNDZfMjUJCSovCisgICAgMHgwMDAwNDcyZSwgICAgIC8qIDEwOiBWQ0xLMTU3XzUgICAgICAgICovCisgICAgMHgwMDAwNDgzNiwgICAgIC8qIDExOiBWQ0xLMTYyICAgICAgICAgICovCisKK307CisKK0JPT0wgQ2hlY2tEQUMoaW50IG5DUlRJbmRleCkKK3sKKwlCWVRFCWJ0VmFsdWU7CQorCUJPT0wJYlZhbHVlOworCisJQllURSBidERldmljZVNlbGVjdDsKKworCXN3aXRjaCAobkNSVEluZGV4KQorCXsKKwljYXNlIENSVF8xOgorCQlidERldmljZVNlbGVjdCA9IERFVklDRV9BRERSRVNTX0NINzMwMV9DUlQxOworCQlicmVhazsKKwljYXNlIENSVF8yOgorCQlidERldmljZVNlbGVjdCA9IERFVklDRV9BRERSRVNTX0NINzMwMV9DUlQyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIkNSVEluZGV4IGlzIG5vdCAxIG9yIDIiKTsKKwkJcmV0dXJuIEZBTFNFOworCQlicmVhazsKKwl9CisKKwkvL0VuYWJsZSBhbGwgREFDJ3MgYW5kIHNldCByZWdpc3RlciAyMWhbMF0gPSAnMCcKKwkvL0RWSVAgYW5kIERWSUwgZGlzYWJsZSBmb3IgREFDCisJU2V0STJDUmVnQ2xpZW50KDAsIERFVklDRV9TRUxFQ1RfQ0g3MzAxLCBidERldmljZVNlbGVjdCwgQ0g3MzAxX1BNX1JFRywgMHgwMCk7CisKKwlidFZhbHVlID0gR2V0STJDUmVnQ2xpZW50KDAsIERFVklDRV9TRUxFQ1RfQ0g3MzAxLCBidERldmljZVNlbGVjdCwgQ0g3MzAxX0RDX1JFRyk7CisJYnRWYWx1ZSA9IGJ0VmFsdWUgJiAweEZFOworCVNldEkyQ1JlZ0NsaWVudCgwLCBERVZJQ0VfU0VMRUNUX0NINzMwMSwgYnREZXZpY2VTZWxlY3QsIENINzMwMV9EQ19SRUcsIGJ0VmFsdWUpOworCisJLy9TZXQgU0VOU0UgYml0IHRvIDEKKwlidFZhbHVlID0gR2V0STJDUmVnQ2xpZW50KDAsIERFVklDRV9TRUxFQ1RfQ0g3MzAxLCBidERldmljZVNlbGVjdCwgQ0g3MzAxX0NEX1JFRyk7CisJYnRWYWx1ZSA9IGJ0VmFsdWUgfCAweDAxOworCVNldEkyQ1JlZ0NsaWVudCgwLCBERVZJQ0VfU0VMRUNUX0NINzMwMSwgYnREZXZpY2VTZWxlY3QsIENINzMwMV9DRF9SRUcsIGJ0VmFsdWUpOworCisJLy9SZXNldCBTRU5TRSBiaXQgdG8gMAorCWJ0VmFsdWUgPSBHZXRJMkNSZWdDbGllbnQoMCwgREVWSUNFX1NFTEVDVF9DSDczMDEsIGJ0RGV2aWNlU2VsZWN0LCBDSDczMDFfQ0RfUkVHKTsKKwlidFZhbHVlID0gYnRWYWx1ZSAmIDB4RkU7CisJU2V0STJDUmVnQ2xpZW50KDAsIERFVklDRV9TRUxFQ1RfQ0g3MzAxLCBidERldmljZVNlbGVjdCwgQ0g3MzAxX0NEX1JFRywgYnRWYWx1ZSk7CisKKwliVmFsdWUgPSAoR2V0STJDUmVnQ2xpZW50KDAsIERFVklDRV9TRUxFQ1RfQ0g3MzAxLCBidERldmljZVNlbGVjdCwgQ0g3MzAxX0NEX1JFRykgJiBDRF9EQUNUKSA/IFRSVUUgOiBGQUxTRTsKKworCXJldHVybiBiVmFsdWU7Cit9CisKK1ZPSUQgIFNldENINzMwMUMoVUxPTkcJTU1JT0Jhc2UsCisJCQkJIGludAluQ1JUSW5kZXgsCisgICAgICAgICAgICAgICAgIGludAlpbkZyZXFSYW5nZSwKKwkJCQkgaW50CWluT3BlcmF0aW5nKQoreworCUJZVEUgYnREZXZpY2VTZWxlY3Q7CisJQllURSBidFZhbHVlOworCisvLyNpZmRlZiBFVkJfQ0xJRU5UCisJLy9vdXRwdXQgUkdCIGRvZXNuJ3QgbmVlZCB0byBzZXQgQ0g3MzAxCisJLy9pZiAoMSA9PSBpbk9wZXJhdGluZykKKwkvLwlyZXR1cm47CisvLyNlbmRpZgorCisJc3dpdGNoIChuQ1JUSW5kZXgpCisJeworCWNhc2UgQ1JUXzE6CisJCWJ0RGV2aWNlU2VsZWN0ID0gMHhFQTsKKworCQlicmVhazsKKwljYXNlIENSVF8yOgorCQlidERldmljZVNlbGVjdCA9IDB4RUM7CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJDUlRJbmRleCBpcyBub3QgMSBvciAyIik7CisJCXJldHVybjsKKwkJYnJlYWs7CisJfQorCisJaWYgKGluRnJlcVJhbmdlIDw9IFZDTEs2NSkKKwl7CisJICBwcmludGYoImNoNzMwMTogbG93IGYgXG4iKTsKKwkJU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDMzLCAweDA4KTsKKwkJU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDM0LCAweDE2KTsKKwkJU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDM2LCAweDYwKTsKKwl9CisJZWxzZQorCXsKKwkJU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDMzLCAweDA2KTsKKwkJU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDM0LCAweDI2KTsKKwkJU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDM2LCAweEEwKTsKKwl9CisKKwlzd2l0Y2ggKGluT3BlcmF0aW5nKQorCXsKKwljYXNlIDA6CisJCS8vRFZJIGlzIG5vcm1hbCBmdW5jdGlvbgorCQkgU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDQ5LCAweEMwKTsKKwkJIFNldEkyQ1JlZ0NsaWVudChNTUlPQmFzZSwgMHgzLCBidERldmljZVNlbGVjdCwgMHgxRCwgMHg0Nyk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJLy9SR0IKKwkJU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDQ4LCAweDE4KTsKKwkJU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDQ5LCAweDApOworCQlTZXRJMkNSZWdDbGllbnQoTU1JT0Jhc2UsIDB4MywgYnREZXZpY2VTZWxlY3QsIDB4NTYsIDB4MCk7CisJCVNldEkyQ1JlZ0NsaWVudChNTUlPQmFzZSwgMHgzLCBidERldmljZVNlbGVjdCwgMHgyMSwgMHg5KTsKKwkJU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDFELCAweDQ4KTsKKwkJU2V0STJDUmVnQ2xpZW50KE1NSU9CYXNlLCAweDMsIGJ0RGV2aWNlU2VsZWN0LCAweDFDLCAweDAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfTsKK30KKwordm9pZCBTZXRBU1RNb2RlVGltaW5nIChVTE9ORyBNTUlPQmFzZSwgaW50IG5DUlRJbmRleCwgQllURSBNb2RlSW5kZXgsIEJZVEUgQ29sb3JEZXB0aCkKK3sKKyAgICBVTE9ORyAgICB0ZW1wLCBSZXRyYWNlU3RhcnQsIFJldHJhY2VFbmQsIERpc3BsYXlPZmZzZXQsIFRlcm1pbmFsQ291bnQsIGJwcDsKKworLy8gIEFjY2VzcyBDUlQgRW5naW5lCisJLy8gIFNldFBvbGFyaXR5CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoU0NVX0JBU0UsIENSVDFfQ09OVFJPTF9SRUcgKyBuQ1JUSW5kZXgqMHg2MCwgKCh2TW9kZVRhYmxlW01vZGVJbmRleF0uSG9yUG9sYXJpdHkgPDwgSE9SX1NZTkNfU0VMRUNUX0JJVCkgfCAodk1vZGVUYWJsZVtNb2RlSW5kZXhdLlZlclBvbGFyaXR5IDw8IFZFUl9TWU5DX1NFTEVDVF9CSVQpKSwgKEhPUl9TWU5DX1NFTEVDVF9NQVNLfFZFUl9TWU5DX1NFTEVDVF9NQVNLKSk7CisKKyNpZiBDT05GSUdfQVNUMzAwMAorCVdyaXRlTWVtb3J5TG9uZ0NsaWVudChTQ1VfQkFTRSwgQ1JUMV9DT05UUk9MMl9SRUcgKyBuQ1JUSW5kZXgqMHg2MCwgMHhjMCk7CisjZWxzZQorICAgIC8vMjEwMCBpcyBzaW5nbGUgZWRnZQorCVdyaXRlTWVtb3J5TG9uZ0NsaWVudChTQ1VfQkFTRSwgQ1JUMV9DT05UUk9MMl9SRUcgKyBuQ1JUSW5kZXgqMHg2MCwgMHg4MCk7CisjZW5kaWYgICAgCisJLy8gIEhvcml6b250YWwgVGltaW5nCisJdGVtcCA9IDA7CisgICAgdGVtcCA9ICgodk1vZGVUYWJsZVtNb2RlSW5kZXhdLkhvcml6b250YWxBY3RpdmUgLSAxKSA8PCBIT1JfRU5BQkxFX0VORF9CSVQpIHwgKCh2TW9kZVRhYmxlW01vZGVJbmRleF0uSG9yaXpvbnRhbFRvdGFsIC0gMSkgPDwgSE9SX1RPVEFMX0JJVCk7CisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KFNDVV9CQVNFLCBDUlQxX0hPUl9UT1RBTF9FTkRfUkVHICArIG5DUlRJbmRleCoweDYwLCB0ZW1wKTsKKworICAgIFJldHJhY2VTdGFydCA9IHZNb2RlVGFibGVbTW9kZUluZGV4XS5Ib3Jpem9udGFsVG90YWwgLSB2TW9kZVRhYmxlW01vZGVJbmRleF0uSEJhY2tQb3JjaCAtIHZNb2RlVGFibGVbTW9kZUluZGV4XS5IU3luY1RpbWUgLSB2TW9kZVRhYmxlW01vZGVJbmRleF0uSExlZnRCb3JkZXIgLSAxOworICAgIFJldHJhY2VFbmQgPSAoUmV0cmFjZVN0YXJ0ICsgdk1vZGVUYWJsZVtNb2RlSW5kZXhdLkhTeW5jVGltZSk7CisJdGVtcCA9IDA7CisgICAgdGVtcCA9IChSZXRyYWNlRW5kIDw8IEhPUl9SRVRSQUNFX0VORF9CSVQpIHwgKFJldHJhY2VTdGFydCA8PCBIT1JfUkVUUkFDRV9TVEFSVF9CSVQpOworICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChTQ1VfQkFTRSwgQ1JUMV9IT1JfUkVUUkFDRV9SRUcgICsgbkNSVEluZGV4KjB4NjAsIHRlbXApOworCisJLy8gIFZlcnRpY2FsIFRpbWluZworCXRlbXAgPSAwOworICAgIHRlbXAgPSAoKHZNb2RlVGFibGVbTW9kZUluZGV4XS5WZXJ0aWNhbEFjdGl2ZSAtIDEpIDw8IFZFUl9FTkFCTEVfRU5EX0JJVCkgfCAoKHZNb2RlVGFibGVbTW9kZUluZGV4XS5WZXJ0aWNhbFRvdGFsIC0gMSkgPDwgVkVSX1RPVEFMX0JJVCk7CisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KFNDVV9CQVNFLCBDUlQxX1ZFUl9UT1RBTF9FTkRfUkVHICArIG5DUlRJbmRleCoweDYwLCB0ZW1wKTsKKworCXRlbXAgPSAwOworICAgIFJldHJhY2VTdGFydCA9IHZNb2RlVGFibGVbTW9kZUluZGV4XS5WZXJ0aWNhbFRvdGFsIC0gdk1vZGVUYWJsZVtNb2RlSW5kZXhdLlZCYWNrUG9yY2ggLSB2TW9kZVRhYmxlW01vZGVJbmRleF0uVlN5bmNUaW1lIC0gdk1vZGVUYWJsZVtNb2RlSW5kZXhdLlZUb3BCb3JkZXIgLSAxOworICAgIFJldHJhY2VFbmQgPSAoUmV0cmFjZVN0YXJ0ICsgdk1vZGVUYWJsZVtNb2RlSW5kZXhdLlZTeW5jVGltZSk7CisgICAgdGVtcCA9IChSZXRyYWNlRW5kIDw8IFZFUl9SRVRSQUNFX0VORF9CSVQpIHwgKFJldHJhY2VTdGFydCA8PCBWRVJfUkVUUkFDRV9TVEFSVF9CSVQpOworICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChTQ1VfQkFTRSwgQ1JUMV9WRVJfUkVUUkFDRV9SRUcgICsgbkNSVEluZGV4KjB4NjAsIHRlbXApOworCisJLy8gIFNldCBDUlQgRGlzcGxheSBPZmZzZXQgYW5kIFRlcm1pbmFsIENvdW50CisgICAgaWYgKENvbG9yRGVwdGggPT0gUkdCXzU2NSkgeworICAgICAgICBicHAgPSAxNjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGJwcCA9IDMyOworICAgIH0KKworICAgIERpc3BsYXlPZmZzZXQgPSB2TW9kZVRhYmxlW01vZGVJbmRleF0uSG9yaXpvbnRhbEFjdGl2ZSAqIGJwcCAvIDg7CisgICAgVGVybWluYWxDb3VudCA9IHZNb2RlVGFibGVbTW9kZUluZGV4XS5Ib3Jpem9udGFsQWN0aXZlICogYnBwIC8gNjQ7CisgICAgaWYgKENvbG9yRGVwdGggPT0gWVVWXzQ0NCkgeworICAgICAgICBUZXJtaW5hbENvdW50ID0gVGVybWluYWxDb3VudCAqIDMgLyA0OworICAgIH0KKyAgICBpZiAoKCh2TW9kZVRhYmxlW01vZGVJbmRleF0uSG9yaXpvbnRhbEFjdGl2ZSAqIGJwcCkgJSA2NCkgIT0gMCkgeworICAgICAgICBUZXJtaW5hbENvdW50Kys7CisgICAgfQorCisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KFNDVV9CQVNFLCBDUlQxX0RJU1BMQVlfT0ZGU0VUICsgbkNSVEluZGV4KjB4NjAsICgoVGVybWluYWxDb3VudCA8PCBURVJNSU5BTF9DT1VOVF9CSVQpIHwgRGlzcGxheU9mZnNldCkpOworCisJLy8gIFNldCBDb2xvciBGb3JtYXQKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0NsaWVudChTQ1VfQkFTRSwgQ1JUMV9DT05UUk9MX1JFRyArIG5DUlRJbmRleCoweDYwLCAoQ29sb3JEZXB0aCA8PCBGT1JNQVRfU0VMRUNUX0JJVCksIEZPUk1BVF9TRUxFQ1RfTUFTSyk7CisKKwkvLyAgU2V0IFRocmVzaG9sZAorCXRlbXAgPSAwOworICAgIHRlbXAgPSAoQ1JUX0hJR0hfVEhSRVNIT0xEX1ZBTFVFIDw8IFRIUkVTX0hJR0hUX0JJVCkgfCAoQ1JUX0xPV19USFJFU0hPTERfVkFMVUUgPDwgVEhSRVNfTE9XX0JJVCk7CisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KFNDVV9CQVNFLCBDUlQxX1RIUkVTSE9MRF9SRUcgKyBuQ1JUSW5kZXgqMHg2MCwgdGVtcCk7CisKKwlXcml0ZU1lbW9yeUxvbmdDbGllbnQoU0NVX0JBU0UsIENSVDFfVklERU9fUExMX1JFRyArIG5DUlRJbmRleCoweDYwLCBBU1QzMDAwRENMS1RhYmxlVlt2TW9kZVRhYmxlW01vZGVJbmRleF0uUGl4ZWxDbG9ja10pOworfQorCit2b2lkIFNldEFTVENlbnRlcjEwMjRNb2RlVGltaW5nIChVTE9ORyBNTUlPQmFzZSwgaW50IG5DUlRJbmRleCwgQllURSBNb2RlSW5kZXgsIEJZVEUgQ29sb3JEZXB0aCkKK3sKKyAgICBVTE9ORyAgICB0ZW1wLCBSZXRyYWNlU3RhcnQsIFJldHJhY2VFbmQsIERpc3BsYXlPZmZzZXQsIFRlcm1pbmFsQ291bnQsIGJwcDsKKworCS8vICBBY2Nlc3MgQ1JUIEVuZ2luZQorCS8vICBTZXRQb2xhcml0eQorICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLQ2xpZW50KFNDVV9CQVNFLCBDUlQxX0NPTlRST0xfUkVHICsgbkNSVEluZGV4KjB4NjAsIChIT1JfTkVHQVRJVkUgPDwgSE9SX1NZTkNfU0VMRUNUX0JJVCkgfCAoVkVSX05FR0FUSVZFIDw8IFZFUl9TWU5DX1NFTEVDVF9CSVQpLCBIT1JfU1lOQ19TRUxFQ1RfTUFTS3xWRVJfU1lOQ19TRUxFQ1RfTUFTSyk7CisKKwlXcml0ZU1lbW9yeUxvbmdDbGllbnQoU0NVX0JBU0UsIENSVDFfQ09OVFJPTDJfUkVHICsgbkNSVEluZGV4KjB4NjAsIDB4QzApOworCisJLy8gIEhvcml6b250YWwgVGltaW5nCisJdGVtcCA9IDA7CisgICAgdGVtcCA9ICgodk1vZGVUYWJsZVtNb2RlSW5kZXhdLkhvcml6b250YWxBY3RpdmUgLSAxKSA8PCBIT1JfRU5BQkxFX0VORF9CSVQpIHwgKCh2TW9kZVRhYmxlWzEwXS5Ib3Jpem9udGFsVG90YWwgLSAxKSA8PCBIT1JfVE9UQUxfQklUKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoU0NVX0JBU0UsIENSVDFfSE9SX1RPVEFMX0VORF9SRUcgKyBuQ1JUSW5kZXgqMHg2MCwgdGVtcCk7CisKKyAgICBSZXRyYWNlU3RhcnQgPSB2TW9kZVRhYmxlWzEwXS5Ib3Jpem9udGFsVG90YWwgLSB2TW9kZVRhYmxlWzEwXS5IQmFja1BvcmNoIC0gdk1vZGVUYWJsZVsxMF0uSFN5bmNUaW1lIC0gdk1vZGVUYWJsZVsxMF0uSExlZnRCb3JkZXIgLSAxOworICAgIFJldHJhY2VTdGFydCA9IFJldHJhY2VTdGFydCAtICh2TW9kZVRhYmxlWzEwXS5Ib3Jpem9udGFsQWN0aXZlIC0gdk1vZGVUYWJsZVtNb2RlSW5kZXhdLkhvcml6b250YWxBY3RpdmUpIC8gMiAtIDE7CisgICAgUmV0cmFjZUVuZCA9IChSZXRyYWNlU3RhcnQgKyB2TW9kZVRhYmxlWzEwXS5IU3luY1RpbWUpOworCXRlbXAgPSAwOworICAgIHRlbXAgPSAoUmV0cmFjZUVuZCA8PCBIT1JfUkVUUkFDRV9FTkRfQklUKSB8IChSZXRyYWNlU3RhcnQgPDwgSE9SX1JFVFJBQ0VfU1RBUlRfQklUKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoU0NVX0JBU0UsIENSVDFfSE9SX1JFVFJBQ0VfUkVHICsgbkNSVEluZGV4KjB4NjAsIHRlbXApOworCisJLy8gIFZlcnRpY2FsIFRpbWluZworCXRlbXAgPSAwOworICAgIHRlbXAgPSAoKHZNb2RlVGFibGVbTW9kZUluZGV4XS5WZXJ0aWNhbEFjdGl2ZSAtIDEpIDw8IFZFUl9FTkFCTEVfRU5EX0JJVCkgfCAoKHZNb2RlVGFibGVbMTBdLlZlcnRpY2FsVG90YWwgLSAxKSA8PCBWRVJfVE9UQUxfQklUKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoU0NVX0JBU0UsIENSVDFfVkVSX1RPVEFMX0VORF9SRUcgKyBuQ1JUSW5kZXgqMHg2MCwgdGVtcCk7CisKKyAgICBSZXRyYWNlU3RhcnQgPSB2TW9kZVRhYmxlWzEwXS5WZXJ0aWNhbFRvdGFsIC0gdk1vZGVUYWJsZVsxMF0uVkJhY2tQb3JjaCAtIHZNb2RlVGFibGVbMTBdLlZTeW5jVGltZSAtIHZNb2RlVGFibGVbMTBdLlZUb3BCb3JkZXIgLSAxOworICAgIFJldHJhY2VTdGFydCA9IFJldHJhY2VTdGFydCAtICh2TW9kZVRhYmxlWzEwXS5WZXJ0aWNhbEFjdGl2ZSAtIHZNb2RlVGFibGVbTW9kZUluZGV4XS5WZXJ0aWNhbEFjdGl2ZSkgLyAyIC0gMTsKKyAgICBSZXRyYWNlRW5kID0gKFJldHJhY2VTdGFydCArIHZNb2RlVGFibGVbMTBdLlZTeW5jVGltZSk7CisgICAgdGVtcCA9IChSZXRyYWNlRW5kIDw8IFZFUl9SRVRSQUNFX0VORF9CSVQpIHwgKFJldHJhY2VTdGFydCA8PCBWRVJfUkVUUkFDRV9TVEFSVF9CSVQpOworICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChTQ1VfQkFTRSwgQ1JUMV9WRVJfUkVUUkFDRV9SRUcgKyBuQ1JUSW5kZXgqMHg2MCwgdGVtcCk7CisKKwkvLyAgU2V0IENSVCBEaXNwbGF5IE9mZnNldCBhbmQgVGVybWluYWwgQ291bnQKKyAgICBpZiAoQ29sb3JEZXB0aCA9PSBSR0JfNTY1KSB7CisgICAgICAgIGJwcCA9IDE2OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYnBwID0gMzI7CisgICAgfQorICAgIERpc3BsYXlPZmZzZXQgPSB2TW9kZVRhYmxlW01vZGVJbmRleF0uSG9yaXpvbnRhbEFjdGl2ZSAqIGJwcCAvIDg7CisgICAgVGVybWluYWxDb3VudCA9IHZNb2RlVGFibGVbTW9kZUluZGV4XS5Ib3Jpem9udGFsQWN0aXZlICogYnBwIC8gNjQ7CisgICAgaWYgKENvbG9yRGVwdGggPT0gWVVWXzQ0NCkgeworICAgICAgICBUZXJtaW5hbENvdW50ID0gVGVybWluYWxDb3VudCAqIDMgLyA0OworICAgIH0KKyAgICBpZiAoKCh2TW9kZVRhYmxlW01vZGVJbmRleF0uSG9yaXpvbnRhbEFjdGl2ZSAqIGJwcCkgJSA2NCkgIT0gMCkgeworICAgICAgICBUZXJtaW5hbENvdW50Kys7CisgICAgfQorCisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KFNDVV9CQVNFLCBDUlQxX0RJU1BMQVlfT0ZGU0VUICsgbkNSVEluZGV4KjB4NjAsIChUZXJtaW5hbENvdW50IDw8IFRFUk1JTkFMX0NPVU5UX0JJVCkgfCBEaXNwbGF5T2Zmc2V0KTsKKworCS8vICBTZXQgQ29sb3IgRm9ybWF0CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoU0NVX0JBU0UsIENSVDFfQ09OVFJPTF9SRUcgKyBuQ1JUSW5kZXgqMHg2MCwgKENvbG9yRGVwdGggPDwgRk9STUFUX1NFTEVDVF9CSVQpLCBGT1JNQVRfU0VMRUNUX01BU0spOworCisJLy8gIFNldCBUaHJlc2hvbGQKKwl0ZW1wID0gMDsKKyAgICB0ZW1wID0gKENSVF9ISUdIX1RIUkVTSE9MRF9WQUxVRSA8PCBUSFJFU19ISUdIVF9CSVQpIHwgKENSVF9MT1dfVEhSRVNIT0xEX1ZBTFVFIDw8IFRIUkVTX0xPV19CSVQpOworICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChTQ1VfQkFTRSwgQ1JUMV9USFJFU0hPTERfUkVHICsgbkNSVEluZGV4KjB4NjAsIHRlbXApOworICAgIAorCS8vIFNldCBEQ0xLCisJV3JpdGVNZW1vcnlMb25nQ2xpZW50KFNDVV9CQVNFLCBDUlQxX1ZJREVPX1BMTF9SRUcgKyBuQ1JUSW5kZXgqMHg2MCwgQVNUMzAwMERDTEtUYWJsZVZbdk1vZGVUYWJsZVtNb2RlSW5kZXhdLlBpeGVsQ2xvY2tdKTsKKworfQorCitCT09MICBBU1RTZXRNb2RlViAoVUxPTkcgTU1JT0Jhc2UsIGludCBuQ1JUSW5kZXgsIFVMT05HIFZHQUJhc2VBZGRyLCBVU0hPUlQgSG9yaXpvbnRhbCwgVVNIT1JUIFZlcnRpY2FsLCBCWVRFIENvbG9yRm9ybWF0LCBCWVRFIENlbnRlck1vZGUpCit7CisgICAgQllURSAgICBpLCBNb2RlSW5kZXg7CisgICAgQk9PTAliREFDOwkKKyAgICBVTE9ORyAgIHVsVGVtcDsKKworICAgIC8vICBBY2Nlc3MgQ1JUIEVuZ2luZQorICAgIC8vRW5hYmxlIENSVDEgZ3JhcGgKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0NsaWVudChTQ1VfQkFTRSwgQ1JUMV9DT05UUk9MX1JFRyArIDB4NjAqbkNSVEluZGV4LCBHUkFQSF9ESVNQTEFZX09OLCBHUkFQSF9ESVNQTEFZX01BU0spOworICAgIAorICAgIC8vICBTZXQgQ1JUIERpc3BsYXkgU3RhcnQgQWRkcmVzcworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLQ2xpZW50KFNDVV9CQVNFLCBDUlQxX0RJU1BMQVlfQUREUkVTUyArIDB4NjAqbkNSVEluZGV4LCBWR0FCYXNlQWRkciwgRElTUExBWV9BRERSRVNTX01BU0spOworCisgICAgZm9yIChpID0gMDsgaSA8IE1vZGU2MEhaQ291bnQ7IGkrKykgeworICAgICAgICBpZiAoKHZNb2RlVGFibGVbaV0uSG9yaXpvbnRhbEFjdGl2ZSA9PSBIb3Jpem9udGFsKSAmJiAodk1vZGVUYWJsZVtpXS5WZXJ0aWNhbEFjdGl2ZSA9PSBWZXJ0aWNhbCkpIHsKKworCSAgICBNb2RlSW5kZXggPSBpOworCisgICAgICAgICAgICBpZiAoQ2VudGVyTW9kZSAhPSAxKSB7CisgICAgICAgICAgICAgICAgU2V0QVNUTW9kZVRpbWluZyhNTUlPQmFzZSwgbkNSVEluZGV4LCBpLCBDb2xvckZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBTZXRBU1RDZW50ZXIxMDI0TW9kZVRpbWluZyAoTU1JT0Jhc2UsIG5DUlRJbmRleCwgaSwgQ29sb3JGb3JtYXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL3VzZSBpbnRlcm5hbCB2aWRlbyBvdXQgc2lnYWwgYW5kIGRvbid0IG5lZWQgdXNlIDczMDEKKyAgICAgICAgICAgIC8qCisJCQliREFDID0gQ2hlY2tEQUMobkNSVEluZGV4KTsKKyAgICAgICAgICAgIAorCQkJU2V0Q0g3MzAxQygwLAorCQkJCW5DUlRJbmRleCwKKwkJCQl2TW9kZVRhYmxlW01vZGVJbmRleF0uUGl4ZWxDbG9jaywKKwkJCQliREFDKTsJCS8vRm9yIFJHQgorCQkJKi8JCisJCQlyZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBGQUxTRTsKK30KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDI0MDAvY3J0LmggYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC9jcnQuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNzQ4M2JlCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDI0MDAvY3J0LmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2lmbmRlZiBfQ1JUX0hfCisjZGVmaW5lIF9DUlRfSF8KKworI2lmZGVmIFdhdGNvbQorI2RlZmluZQkJQ1JUX1JFTUFQX09GRlNFVAkweDEwMDAwCisjZWxzZQorI2RlZmluZQkJQ1JUX1JFTUFQX09GRlNFVAkweDAKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICBDUlQgcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCQlDUlRfQkFTRV9PRkZTRVQJCQkJCQkweDYwMDArQ1JUX1JFTUFQX09GRlNFVAorCisjZGVmaW5lCQlDUlQxX0NPTlRST0xfUkVHCQkJCQkweDAwICsgQ1JUX0JBU0VfT0ZGU0VUCisJI2RlZmluZQkJR1JBUEhfRElTUExBWV9CSVQJCQkJMAorCSNkZWZpbmUgICAgIEdSQVBIX0RJU1BMQVlfTUFTSwkJCQkoMTw8MCkKKwkJI2RlZmluZQkJR1JBUEhfRElTUExBWV9PTgkJCTEKKwkJI2RlZmluZQkJR1JBUEhfRElTUExBWV9PRkYJCQkwCisgICAgI2RlZmluZSAgICAgRk9STUFUX1NFTEVDVF9CSVQgICAgICAgICAgICAgICA4CisgICAgI2RlZmluZSAgICAgRk9STUFUX1NFTEVDVF9NQVNLICAgICAgICAgICAgICAoMzw8OCkgICAKKwkjZGVmaW5lCQlIT1JfU1lOQ19TRUxFQ1RfQklUCQkJCTE2CisgICAgI2RlZmluZQkJSE9SX1NZTkNfU0VMRUNUX01BU0sJCQkoMTw8MTYpCQorCQkjZGVmaW5lCQlIT1JfTkVHQVRJVkUJCQkJMQorCQkjZGVmaW5lCQlIT1JfUE9TSVRJVkUJCQkJMAorCSNkZWZpbmUJCVZFUl9TWU5DX1NFTEVDVF9CSVQJCQkJMTcKKyAgICAjZGVmaW5lCQlWRVJfU1lOQ19TRUxFQ1RfTUFTSwkJCSgxPDwxNykJCisJCSNkZWZpbmUJCVZFUl9ORUdBVElWRQkJCQkxCisJCSNkZWZpbmUJCVZFUl9QT1NJVElWRQkJCQkwCisKKyNkZWZpbmUJCUNSVDFfQ09OVFJPTDJfUkVHCQkJCQkweDA0ICsgQ1JUX0JBU0VfT0ZGU0VUCisgICAgICAgIAorI2RlZmluZSAgICAgQ1JUMV9WSURFT19QTExfUkVHICAgICAgICAgICAgICAgICAgMHgwQyArIENSVF9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIFBPU1RfRElWX0JJVCAgICAgICAgICAgICAgICAgICAgMTgKKyAgICAjZGVmaW5lICAgICBQT1NUX0RJVl9NQVNLICAgICAgICAgICAgICAgICAgIDM8PDE4CisgICAgICAgICNkZWZpbmUgICAgIERJVl8xXzEgICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgIC8vI2RlZmluZSAgICAgRElWXzFfMiAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAgICAgI2RlZmluZSAgICAgRElWXzFfMiAgICAgICAgICAgICAgICAgICAgIDIKKyAgICAgICAgI2RlZmluZSAgICAgRElWXzFfNCAgICAgICAgICAgICAgICAgICAgIDMKKyAgICAgICAgCisjZGVmaW5lICAgICBDUlQxX0hPUl9UT1RBTF9FTkRfUkVHICAgICAgICAgICAgICAweDEwICsgQ1JUX0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgSE9SX1RPVEFMX0JJVCAgICAgICAgICAgICAgICAgICAwCisgICAgI2RlZmluZSAgICAgSE9SX0VOQUJMRV9FTkRfQklUICAgICAgICAgICAgICAxNgorCisjZGVmaW5lICAgICBDUlQxX0hPUl9SRVRSQUNFX1JFRyAgICAgICAgICAgICAgICAweDE0ICsgQ1JUX0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgSE9SX1JFVFJBQ0VfU1RBUlRfQklUICAgICAgICAgICAwCisgICAgI2RlZmluZSAgICAgSE9SX1JFVFJBQ0VfRU5EX0JJVCAgICAgICAgICAgICAxNgorCisjZGVmaW5lICAgICBDUlQxX1ZFUl9UT1RBTF9FTkRfUkVHICAgICAgICAgICAgICAweDE4ICsgQ1JUX0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgVkVSX1RPVEFMX0JJVCAgICAgICAgICAgICAgICAgICAwCisgICAgI2RlZmluZSAgICAgVkVSX0VOQUJMRV9FTkRfQklUICAgICAgICAgICAgICAxNgorCisjZGVmaW5lICAgICBDUlQxX1ZFUl9SRVRSQUNFX1JFRyAgICAgICAgICAgICAgICAweDFDICsgQ1JUX0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgVkVSX1JFVFJBQ0VfU1RBUlRfQklUICAgICAgICAgICAwCisgICAgI2RlZmluZSAgICAgVkVSX1JFVFJBQ0VfRU5EX0JJVCAgICAgICAgICAgICAxNgorCisjZGVmaW5lICAgICBDUlQxX0RJU1BMQVlfQUREUkVTUwkJCQkweDIwICsgQ1JUX0JBU0VfT0ZGU0VUCisJI2RlZmluZQkJRElTUExBWV9BRERSRVNTX01BU0sJCQkweDBGRkZGRkZGCisKKyNkZWZpbmUgICAgIENSVDFfRElTUExBWV9PRkZTRVQgICAgICAgICAgICAgICAgIDB4MjQgKyBDUlRfQkFTRV9PRkZTRVQKKyAgICAjZGVmaW5lICAgICBESVNQTEFZX09GRlNFVF9BTElHTiAgICAgICAgICAgIDcgLyogOCBieXRlIGFsaWdubWVudCovCisgICAgI2RlZmluZSAgICAgVEVSTUlOQUxfQ09VTlRfQklUICAgICAgICAgICAgICAxNiAgICAKKworI2RlZmluZSAgICAgQ1JUMV9USFJFU0hPTERfUkVHICAgICAgICAgICAgICAgICAgMHgyOCArIENSVF9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIFRIUkVTX0xPV19CSVQgICAgICAgICAgICAgICAgICAgMAorICAgICNkZWZpbmUgICAgIFRIUkVTX0hJR0hUX0JJVCAgICAgICAgICAgICAgICAgOAorCisjZGVmaW5lICAgIENVUlNPUl9QT1NJVElPTiAgICAgICAgICAgICAgICAgIDB4MzAgKyBPRkZTRVQKKyNkZWZpbmUgICAgQ1VSU09SX09GRlNFVCAgICAgICAgICAgICAgICAgICAgMHgzNCArIE9GRlNFVAorI2RlZmluZSAgICBDVVJTT1JfUEFUVEVSTiAgICAgICAgICAgICAgICAgICAweDM4ICsgT0ZGU0VUCisjZGVmaW5lICAgIE9TRF9IT1JJWk9OVEFMICAgICAgICAgICAgICAgICAgIDB4NDAgKyBPRkZTRVQKKyNkZWZpbmUgICAgT1NEX1ZFUlRJQ0FMICAgICAgICAgICAgICAgICAgICAgMHg0NCArIE9GRlNFVAorI2RlZmluZSAgICBPU0RfUEFUVEVSTiAgICAgICAgICAgICAgICAgICAgICAweDQ4ICsgT0ZGU0VUCisjZGVmaW5lICAgIE9TRF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDB4NEMgKyBPRkZTRVQKKyNkZWZpbmUgICAgT1NEX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgICAgMHg1MCArIE9GRlNFVAorCisvL0NoNzMwMWMKKyNkZWZpbmUJCURFVklDRV9BRERSRVNTX0NINzMwMV9DUlQxCTB4RUEKKyNkZWZpbmUJCURFVklDRV9BRERSRVNTX0NINzMwMV9DUlQyCTB4RUMKKworCisjZGVmaW5lCQlERVZJQ0VfU0VMRUNUX0NINzMwMQkJMHgzCisKKy8qIENINzMwMSBSZWdpc3RlciBEZWZpbml0aW9uICovCisjZGVmaW5lICAgICBDSDczMDFfQ0RfUkVHCQkJCTB4MjAKKwkjZGVmaW5lICAgICBDRF9EQUNUCQkJCQkweDBFCisJI2RlZmluZQkJQ0RfRFZJVAkJCQkJMSA8PCA1CisjZGVmaW5lICAgICBDSDczMDFfRENfUkVHCQkJCTB4MjEKKyNkZWZpbmUgICAgIENINzMwMV9QTV9SRUcJCQkJMHg0OQorCitCT09MIENoZWNrSG90UGx1ZyhpbnQgbkNSVEluZGV4KTsKK0JPT0wgQ2hlY2tEQUMoaW50IG5DUlRJbmRleCk7CisKK0JPT0wgIEFTVFNldE1vZGVWIChVTE9ORyBNTUlPQmFzZSwgCisgICAgICAgICAgICAgICAgaW50IG5DUlRJbmRleCwgCisgICAgICAgICAgICAgICAgVUxPTkcgVkdBQmFzZUFkZHIsIAorICAgICAgICAgICAgICAgIFVTSE9SVCBIb3Jpem9udGFsLCAKKyAgICAgICAgICAgICAgICBVU0hPUlQgVmVydGljYWwsIAorICAgICAgICAgICAgICAgIEJZVEUgQ29sb3JGb3JtYXQsIAorICAgICAgICAgICAgICAgIEJZVEUgQ2VudGVyTW9kZSk7CisgICAgICAgICAgICAgICAgCitCT09MICBTZWxDUlRDbG9jayhVTE9ORyBNTUlPQmFzZSwKKwkJCQkgIGludAluQ1JUSW5kZXgsCisJCQkJICBVU0hPUlQgSG9yaXpvbnRhbCwgCisJCQkJICBVU0hPUlQgVmVydGljYWwpOworCit2b2lkIERpc2FibGVDUlQoVUxPTkcgTU1JT0Jhc2UsIGludCBuQ1JUSW5kZXgpOwordm9pZCBDbGVhckNSVFdpdGhCbGFjayhVTE9ORyB1bENSVEFkZHIsIGludCBpV2lkdGgsIGludCBpSGVpZ2h0KTsKKworI2VuZGlmIC8qIF9DUlRfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDI0MDAvZmxhc2guYyBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL2ZsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDYxMWQwZAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL2ZsYXNoLmMKQEAgLTAsMCArMSwxNjUxIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEhpc3RvcnkKKyAqIDAxLzIwLzIwMDQgLSBjb21iaW5lZCB2YXJpYW50cyBvZiBvcmlnaW5hbCBkcml2ZXIuCisgKiAwMS8yMi8yMDA0IC0gV3JpdGUgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzIGZvciBwYXJhbGxlbCBjaGlwcyAoVG9sdW5heSkKKyAqIDAxLzIzLzIwMDQgLSBTdXBwb3J0IGZvciB4OC94MTYgY2hpcHMgKFJ1bmUgUmFrbmVydWQpCisgKiAwMS8yNy8yMDA0IC0gTGl0dGxlIGVuZGlhbiBzdXBwb3J0IEVkIE9rZXJzb24KKyAqCisgKiBUZXN0ZWQgQXJjaGl0ZWN0dXJlcworICogUG9ydCBXaWR0aCAgQ2hpcCBXaWR0aCAgICAjIG9mIGJhbmtzCSAgIEZsYXNoIENoaXAgIEJvYXJkCisgKiAzMgkgICAgICAgMTYJICAgICAxCQkgICAyOEYxMjhKMyAgICBzZXJhbm9hL2VhZ2xlCisgKiA2NAkgICAgICAgMTYJICAgICAxCQkgICAyOEYxMjhKMyAgICBzZXJhbm9hL2ZhbGNvbgorICovCisvLyAoU3VuKSBUaGlzIENGSSBkcml2ZXIgaXMgd3JpdHRlbiBmb3IgZml4ZWQtd2lkdGggZmxhc2ggY2hpcHMuCisvLyBJdCB3YXMgbm90IGRlc2lnbmVkIGZvciBmbGV4aWJsZSA4LWJpdC8xNi1iaXQgY2hpcHMsIHdoaWNoIGFyZSB0aGUgbm9ybS4KKy8vIFdoZW4gdGhvc2UgY2hpcHMgYXJlIGNvbm5lY3RlZCB0byBhIGJ1cyBpbiA4LWJpdCBtb2RlLCB0aGUgYWRkcmVzcyB3aXJlcworLy8gcmlnaHQtc2hpZnRlZCBieSAxLgorLy9GSVhNRTogRml4IHRoZSBkcml2ZXIgdG8gYXV0by1kZXRlY3QgIjE2LWJpdCBmbGFzaCB3aXJlZCBpbiA4LWJpdCBtb2RlIi4KKy8vIExlZnQtc2hpZnQgQ0ZJIG9mZnNldHMgYnkgMSBiaXQgaW5zdGVhZCBvZiBkb3VibGluZyB0aGUgI2RlZmluZSB2YWx1ZXMuCisKKy8qIFRoZSBERUJVRyBkZWZpbmUgbXVzdCBiZSBiZWZvcmUgY29tbW9uIHRvIGVuYWJsZSBkZWJ1Z2dpbmcgKi8KKy8vIChTdW4pIENoYW5nZWQgdG8gREVCVUdfRkxBU0ggYmVjYXVzZSBmbGFzaCBkZWJ1ZygpcyBhcmUgdG9vIG51bWVyb3VzLgorLy8gI2RlZmluZSBERUJVRworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxlbnZpcm9ubWVudC5oPgorI2lmZGVmCUNPTkZJR19TWVNfRkxBU0hfQ0ZJCisKKy8qCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIENvbW1vbiBGbGFzaCBJbnRlcmZhY2UgKENGSSkgZHJpdmVyIGZvciBVLUJvb3QuCisgKiBUaGUgd2lkdGggb2YgdGhlIHBvcnQgYW5kIHRoZSB3aWR0aCBvZiB0aGUgY2hpcHMgYXJlIGRldGVybWluZWQgYXQgaW5pdGlhbGl6YXRpb24uCisgKiBUaGVzZSB3aWR0aHMgYXJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBhZGRyZXNzIGZvciBhY2Nlc3MgQ0ZJIGRhdGEgc3RydWN0dXJlcy4KKyAqIEl0IGhhcyBiZWVuIHRlc3RlZCBvbiBhbiBJbnRlbCBTdHJhdGFmbGFzaCBpbXBsZW1lbnRhdGlvbiBhbmQgQU1EIDI5RjAxNkQuCisgKgorICogUmVmZXJlbmNlcworICogSkVERUMgU3RhbmRhcmQgSkVTRDY4IC0gQ29tbW9uIEZsYXNoIEludGVyZmFjZSAoQ0ZJKQorICogSkVERUMgU3RhbmRhcmQgSkVQMTM3LUEgQ29tbW9uIEZsYXNoIEludGVyZmFjZSAoQ0ZJKSBJRCBDb2RlcworICogSW50ZWwgQXBwbGljYXRpb24gTm90ZSA2NDYgQ29tbW9uIEZsYXNoIEludGVyZmFjZSAoQ0ZJKSBhbmQgQ29tbWFuZCBTZXRzCisgKiBJbnRlbCAyOTA2NjctMDA4IDMgVm9sdCBJbnRlbCBTdHJhdGFGbGFzaCBNZW1vcnkgZGF0YXNoZWV0CisgKgorICogVE9ETworICoKKyAqIFVzZSBQcmltYXJ5IEV4dGVuZGVkIFF1ZXJ5IHRhYmxlIChQUkkpIGFuZCBBbHRlcm5hdGUgQWxnb3JpdGhtIFF1ZXJ5CisgKiBUYWJsZSAoQUxUKSB0byBkZXRlcm1pbmUgaWYgcHJvdGVjdGlvbiBpcyBhdmFpbGFibGUKKyAqCisgKiBBZGQgc3VwcG9ydCBmb3Igb3RoZXIgY29tbWFuZCBzZXRzIFVzZSB0aGUgUFJJIGFuZCBBTFQgdG8gZGV0ZXJtaW5lIGNvbW1hbmQgc2V0CisgKiBWZXJpZnkgZXJhc2UgYW5kIHByb2dyYW0gdGltZW91dHMuCisgKi8KKworI2lmbmRlZiBDT05GSUdfRkxBU0hfQkFOS1NfTElTVAorI2RlZmluZSBDT05GSUdfRkxBU0hfQkFOS1NfTElTVCB7IENPTkZJR19TWVNfRkxBU0hfQkFTRSB9CisjZW5kaWYKKworI2RlZmluZSBGTEFTSF9DTURfQ0ZJCQkJMHg5OAorI2RlZmluZSBGTEFTSF9DTURfUkVBRF9JRAkJMHg5MAorI2RlZmluZSBGTEFTSF9DTURfUkVTRVQJCQkweGZmCisjZGVmaW5lIEZMQVNIX0NNRF9CTE9DS19FUkFTRQkJMHgyMAorI2RlZmluZSBGTEFTSF9DTURfRVJBU0VfQ09ORklSTQkJMHhEMAorI2RlZmluZSBGTEFTSF9DTURfV1JJVEUJCQkweDQwCisjZGVmaW5lIEZMQVNIX0NNRF9QUk9URUNUCQkweDYwCisjZGVmaW5lIEZMQVNIX0NNRF9QUk9URUNUX1NFVAkJMHgwMQorI2RlZmluZSBGTEFTSF9DTURfUFJPVEVDVF9DTEVBUgkJMHhEMAorI2RlZmluZSBGTEFTSF9DTURfQ0xFQVJfU1RBVFVTCQkweDUwCisjZGVmaW5lIEZMQVNIX0NNRF9XUklURV9UT19CVUZGRVIJMHhFOAorI2RlZmluZSBGTEFTSF9DTURfV1JJVEVfQlVGRkVSX0NPTkZJUk0JMHhEMAorCisjZGVmaW5lIEZMQVNIX1NUQVRVU19ET05FCQkweDgwCisjZGVmaW5lIEZMQVNIX1NUQVRVU19FU1MJCTB4NDAKKyNkZWZpbmUgRkxBU0hfU1RBVFVTX0VDTEJTCQkweDIwCisjZGVmaW5lIEZMQVNIX1NUQVRVU19QU0xCUwkJMHgxMAorI2RlZmluZSBGTEFTSF9TVEFUVVNfVlBFTlMJCTB4MDgKKyNkZWZpbmUgRkxBU0hfU1RBVFVTX1BTUwkJMHgwNAorI2RlZmluZSBGTEFTSF9TVEFUVVNfRFBTCQkweDAyCisjZGVmaW5lIEZMQVNIX1NUQVRVU19SCQkJMHgwMQorI2RlZmluZSBGTEFTSF9TVEFUVVNfUFJPVEVDVAkJMHgwMQorCisjZGVmaW5lIEFNRF9DTURfUkVTRVQJCQkweEYwCisjZGVmaW5lIEFNRF9DTURfV1JJVEUJCQkweEEwCisjZGVmaW5lIEFNRF9DTURfRVJBU0VfU1RBUlQJCTB4ODAKKyNkZWZpbmUgQU1EX0NNRF9FUkFTRV9TRUNUT1IJCTB4MzAKKyNkZWZpbmUgQU1EX0NNRF9VTkxPQ0tfU1RBUlQJCTB4QUEKKyNkZWZpbmUgQU1EX0NNRF9VTkxPQ0tfQUNLCQkweDU1CisjZGVmaW5lIEFNRF9DTURfV1JJVEVfVE9fQlVGRkVSCQkweDI1CisjZGVmaW5lIEFNRF9DTURfQlVGRkVSX1RPX0ZMQVNICQkweDI5CisKKyNkZWZpbmUgQU1EX1NUQVRVU19UT0dHTEUJCTB4NDAKKyNkZWZpbmUgQU1EX1NUQVRVU19FUlJPUgkJMHgyMAorLy9GSVhNRTogVGhlc2UgMyB3ZXJlIGFsc28gY2hhbmdlZCBmb3IgOC1iaXQvMTYtYml0IGZsYXNoIGNoaXBzLgorI2RlZmluZSBBTURfQUREUl9FUkFTRV9TVEFSVAkJKDB4QUFBL2luZm8tPnBvcnR3aWR0aCkKKyNkZWZpbmUgQU1EX0FERFJfU1RBUlQJCQkoMHhBQUEvaW5mby0+cG9ydHdpZHRoKQorI2RlZmluZSBBTURfQUREUl9BQ0sJCQkoMHg1NTUvaW5mby0+cG9ydHdpZHRoKQorCisvL0ZJWE1FOiBGaXggdGhlIGRyaXZlciB0byBhdXRvLWRldGVjdCAiMTYtYml0IGZsYXNoIHdpcmVkIGluIDgtYml0IG1vZGUiLgorLy8gTGVmdC1zaGlmdCBDRkkgb2Zmc2V0cyBieSAxIGJpdCBpbnN0ZWFkIG9mIGRvdWJsaW5nIHRoZSAjZGVmaW5lIHZhbHVlcy4KKyNkZWZpbmUgRkxBU0hfT0ZGU0VUX0NGSQkJKDB4QUEvaW5mby0+cG9ydHdpZHRoKQorI2RlZmluZSBGTEFTSF9PRkZTRVRfQ0ZJX1JFU1AJCSgweDIwL2luZm8tPnBvcnR3aWR0aCkKKyNkZWZpbmUgRkxBU0hfT0ZGU0VUX0NGSV9SRVNQMQkJKDB4MjIvaW5mby0+cG9ydHdpZHRoKQorI2RlZmluZSBGTEFTSF9PRkZTRVRfQ0ZJX1JFU1AyCQkoMHgyNC9pbmZvLT5wb3J0d2lkdGgpCisjZGVmaW5lIEZMQVNIX09GRlNFVF9QUklNQVJZX1ZFTkRPUgkoMHgyNi9pbmZvLT5wb3J0d2lkdGgpCisjZGVmaW5lIEZMQVNIX09GRlNFVF9XVE9VVAkJKDB4M0UvaW5mby0+cG9ydHdpZHRoKQorI2RlZmluZSBGTEFTSF9PRkZTRVRfV0JUT1VUCQkoMHg0MC9pbmZvLT5wb3J0d2lkdGgpCisjZGVmaW5lIEZMQVNIX09GRlNFVF9FVE9VVAkJKDB4NDIvaW5mby0+cG9ydHdpZHRoKQorI2RlZmluZSBGTEFTSF9PRkZTRVRfQ0VUT1VUCQkoMHg0NC9pbmZvLT5wb3J0d2lkdGgpCisjZGVmaW5lIEZMQVNIX09GRlNFVF9XTUFYX1RPVVQJCSgweDQ2L2luZm8tPnBvcnR3aWR0aCkKKyNkZWZpbmUgRkxBU0hfT0ZGU0VUX1dCTUFYX1RPVVQJCSgweDQ4L2luZm8tPnBvcnR3aWR0aCkKKyNkZWZpbmUgRkxBU0hfT0ZGU0VUX0VNQVhfVE9VVAkJKDB4NEEvaW5mby0+cG9ydHdpZHRoKQorI2RlZmluZSBGTEFTSF9PRkZTRVRfQ0VNQVhfVE9VVAkJKDB4NEMvaW5mby0+cG9ydHdpZHRoKQorI2RlZmluZSBGTEFTSF9PRkZTRVRfU0laRQkJKDB4NEUvaW5mby0+cG9ydHdpZHRoKQorI2RlZmluZSBGTEFTSF9PRkZTRVRfSU5URVJGQUNFCQkoMHg1MC9pbmZvLT5wb3J0d2lkdGgpCisjZGVmaW5lIEZMQVNIX09GRlNFVF9CVUZGRVJfU0laRQkoMHg1NC9pbmZvLT5wb3J0d2lkdGgpCisjZGVmaW5lIEZMQVNIX09GRlNFVF9OVU1fRVJBU0VfUkVHSU9OUwkoMHg1OC9pbmZvLT5wb3J0d2lkdGgpCisjZGVmaW5lIEZMQVNIX09GRlNFVF9FUkFTRV9SRUdJT05TCSgweDVBL2luZm8tPnBvcnR3aWR0aCkKKyNkZWZpbmUgRkxBU0hfT0ZGU0VUX1BST1RFQ1QJCSgweDAyL2luZm8tPnBvcnR3aWR0aCkKKyNkZWZpbmUgRkxBU0hfT0ZGU0VUX1VTRVJfUFJPVEVDVElPTgkoMHg4NS9pbmZvLT5wb3J0d2lkdGgpCisjZGVmaW5lIEZMQVNIX09GRlNFVF9JTlRFTF9QUk9URUNUSU9OCSgweDgxL2luZm8tPnBvcnR3aWR0aCkKKworI2RlZmluZSBNQVhfTlVNX0VSQVNFX1JFR0lPTlMJCTQKKworI2RlZmluZSBGTEFTSF9NQU5fQ0ZJCQkJMHgwMTAwMDAwMAorCisjZGVmaW5lIENGSV9DTURTRVRfTk9ORQkJICAgIDAKKyNkZWZpbmUgQ0ZJX0NNRFNFVF9JTlRFTF9FWFRFTkRFRCAgIDEKKyNkZWZpbmUgQ0ZJX0NNRFNFVF9BTURfU1RBTkRBUkQJICAgIDIKKyNkZWZpbmUgQ0ZJX0NNRFNFVF9JTlRFTF9TVEFOREFSRCAgIDMKKyNkZWZpbmUgQ0ZJX0NNRFNFVF9BTURfRVhURU5ERUQJICAgIDQKKyNkZWZpbmUgQ0ZJX0NNRFNFVF9NSVRTVV9TVEFOREFSRCAgIDI1NgorI2RlZmluZSBDRklfQ01EU0VUX01JVFNVX0VYVEVOREVEICAgMjU3CisjZGVmaW5lIENGSV9DTURTRVRfU1NUCQkgICAgMjU4CisKKworI2lmZGVmIENPTkZJR19TWVNfRkxBU0hfQ0ZJX0FNRF9SRVNFVCAvKiBuZWVkZWQgZm9yIFNUTV9JRF8yOVczMjBEQiBvbiBVQzEwMCAqLworIyB1bmRlZiAgRkxBU0hfQ01EX1JFU0VUCisjIGRlZmluZSBGTEFTSF9DTURfUkVTRVQgICAgICAgICAgICAgICAgQU1EX0NNRF9SRVNFVCAvKiB1c2UgQU1ELVJlc2V0IGluc3RlYWQgKi8KKyNlbmRpZgorCisKK3R5cGVkZWYgdW5pb24geworCXVuc2lnbmVkIGNoYXIgYzsKKwl1bnNpZ25lZCBzaG9ydCB3OworCXVuc2lnbmVkIGxvbmcgbDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbGw7Cit9IGNmaXdvcmRfdDsKKwordHlwZWRlZiB1bmlvbiB7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqY3A7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKndwOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmxwOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbG9uZyAqbGxwOworfSBjZmlwdHJfdDsKKworLyogdXNlIENGR19NQVhfRkxBU0hfQkFOS1NfREVURUNUIGlmIGRlZmluZWQgKi8KKyNpZmRlZiBDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LU19ERVRFQ1QKK3N0YXRpYyB1bG9uZyBiYW5rX2Jhc2VbQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1NfREVURUNUXSA9IENPTkZJR19GTEFTSF9CQU5LU19MSVNUOworZmxhc2hfaW5mb190IGZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU19ERVRFQ1RdOwkvKiBGTEFTSCBjaGlwcyBpbmZvICovCisjZWxzZQorc3RhdGljIHVsb25nIGJhbmtfYmFzZVtDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LU10gPSBDT05GSUdfRkxBU0hfQkFOS1NfTElTVDsKK2ZsYXNoX2luZm9fdCBmbGFzaF9pbmZvW0NPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTXTsJCS8qIEZMQVNIIGNoaXBzIGluZm8gKi8KKyNlbmRpZgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZCBmbGFzaF9hZGRfYnl0ZSAoZmxhc2hfaW5mb190ICogaW5mbywgY2Zpd29yZF90ICogY3dvcmQsIHVjaGFyIGMpOworc3RhdGljIHZvaWQgZmxhc2hfbWFrZV9jbWQgKGZsYXNoX2luZm9fdCAqIGluZm8sIHVjaGFyIGNtZCwgdm9pZCAqY21kYnVmKTsKK3N0YXRpYyB2b2lkIGZsYXNoX3dyaXRlX2NtZCAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3QsIHVpbnQgb2Zmc2V0LCB1Y2hhciBjbWQpOworc3RhdGljIHZvaWQgZmxhc2hfd3JpdGVfY21kX25vZGJnIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdCwgdWludCBvZmZzZXQsIHVjaGFyIGNtZCk7CitzdGF0aWMgdm9pZCBmbGFzaF93cml0ZV9jbWRfaW50IChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdCwgdWludCBvZmZzZXQsIHVjaGFyIGNtZCwgaW50IG5vRGVidWcpOworc3RhdGljIHZvaWQgZmxhc2hfdW5sb2NrX3NlcSAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3QpOworc3RhdGljIGludCBmbGFzaF9pc2VxdWFsIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdCwgdWludCBvZmZzZXQsIHVjaGFyIGNtZCk7CitzdGF0aWMgaW50IGZsYXNoX2lzc2V0IChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdCwgdWludCBvZmZzZXQsIHVjaGFyIGNtZCk7CitzdGF0aWMgaW50IGZsYXNoX3RvZ2dsZSAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3QsIHVpbnQgb2Zmc2V0LCB1Y2hhciBjbWQpOworc3RhdGljIGludCBmbGFzaF9kZXRlY3RfY2ZpIChmbGFzaF9pbmZvX3QgKiBpbmZvKTsKK3Vsb25nIGZsYXNoX2dldF9zaXplICh1bG9uZyBiYXNlLCBpbnQgYmFua251bSk7CitzdGF0aWMgaW50IGZsYXNoX3dyaXRlX2NmaXdvcmQgKGZsYXNoX2luZm9fdCAqIGluZm8sIHVsb25nIGRlc3QsIGNmaXdvcmRfdCBjd29yZCk7CitzdGF0aWMgaW50IGZsYXNoX2Z1bGxfc3RhdHVzX2NoZWNrIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdG9yLAorCQkJCSAgICB1bG9uZyB0b3V0LCBjaGFyICpwcm9tcHQpOworc3RhdGljIHZvaWQgd3JpdGVfYnVmZmVyX2Fib3J0X3Jlc2V0KGZsYXNoX2luZm9fdCAqIGluZm8sIGZsYXNoX3NlY3RfdCBzZWN0b3IpOwkJCQkgICAgCisjaWYgZGVmaW5lZChDRkdfRU5WX0lTX0lOX0ZMQVNIKSB8fCBkZWZpbmVkKENGR19FTlZfQUREUl9SRURVTkQpIHx8IChDRkdfTU9OSVRPUl9CQVNFID49IENGR19GTEFTSF9CQVNFKQorc3RhdGljIGZsYXNoX2luZm9fdCAqZmxhc2hfZ2V0X2luZm8odWxvbmcgYmFzZSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTX0ZMQVNIX1VTRV9CVUZGRVJfV1JJVEUKK3N0YXRpYyBpbnQgZmxhc2hfd3JpdGVfY2ZpYnVmZmVyIChmbGFzaF9pbmZvX3QgKiBpbmZvLCB1bG9uZyBkZXN0LCB1Y2hhciAqIGNwLCBpbnQgbGVuKTsKK3N0YXRpYyBpbnQgZmxhc2hfd3JpdGVfY2ZpYnVmZmVyX2FtZCAoZmxhc2hfaW5mb190ICogaW5mbywgdWxvbmcgZGVzdCwgdWNoYXIgKiBjcCwgaW50IGxlbik7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogY3JlYXRlIGFuIGFkZHJlc3MgYmFzZWQgb24gdGhlIG9mZnNldCBhbmQgdGhlIHBvcnQgd2lkdGgKKyAqLworaW5saW5lIHVjaGFyICpmbGFzaF9tYWtlX2FkZHIgKGZsYXNoX2luZm9fdCAqIGluZm8sIGZsYXNoX3NlY3RfdCBzZWN0LCB1aW50IG9mZnNldCkKK3sKKwlyZXR1cm4gKCh1Y2hhciAqKSAoaW5mby0+c3RhcnRbc2VjdF0gKyAob2Zmc2V0ICogaW5mby0+cG9ydHdpZHRoKSkpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZWJ1ZyBzdXBwb3J0CisgKi8KKyNpZmRlZiBERUJVR19GTEFTSAorc3RhdGljIHZvaWQgcHJpbnRfbG9uZ2xvbmcgKGNoYXIgKnN0ciwgdW5zaWduZWQgbG9uZyBsb25nIGRhdGEpCit7CisJaW50IGk7CisJY2hhciAqY3A7CisKKwljcCA9ICh1bnNpZ25lZCBjaGFyICopICZkYXRhOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXNwcmludGYgKCZzdHJbaSAqIDJdLCAiJTIuMngiLCAqY3ArKyk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoREVCVUdfRkxBU0gpCitzdGF0aWMgdm9pZCBmbGFzaF9wcmludHFyeSAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3QpCit7CisJY2ZpcHRyX3QgY3B0cjsKKwlpbnQgeCwgeTsKKworCWZvciAoeCA9IDA7IHggPCAweDQwOyB4ICs9IDE2VSAvIGluZm8tPnBvcnR3aWR0aCkgeworCQljcHRyLmNwID0KKwkJCWZsYXNoX21ha2VfYWRkciAoaW5mbywgc2VjdCwKKwkJCQkJIHggKyBGTEFTSF9PRkZTRVRfQ0ZJX1JFU1ApOworCQlkZWJ1ZyAoIiVwIDogIiwgY3B0ci5jcCk7CisJCWZvciAoeSA9IDA7IHkgPCAxNjsgeSsrKSB7CisJCQlkZWJ1ZyAoIiUyLjJ4ICIsIGNwdHIuY3BbeV0pOworCQl9CisJCWRlYnVnICgiICIpOworCQlmb3IgKHkgPSAwOyB5IDwgMTY7IHkrKykgeworCQkJaWYgKGNwdHIuY3BbeV0gPj0gMHgyMCAmJiBjcHRyLmNwW3ldIDw9IDB4N2UpIHsKKwkJCQlkZWJ1ZyAoIiVjIiwgY3B0ci5jcFt5XSk7CisJCQl9IGVsc2UgeworCQkJCWRlYnVnICgiLiIpOworCQkJfQorCQl9CisJCWRlYnVnICgiXG4iKTsKKwl9Cit9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcmVhZCBhIGNoYXJhY3RlciBhdCBhIHBvcnQgd2lkdGggYWRkcmVzcworICovCitpbmxpbmUgdWNoYXIgZmxhc2hfcmVhZF91Y2hhciAoZmxhc2hfaW5mb190ICogaW5mbywgdWludCBvZmZzZXQpCit7CisJdWNoYXIgKmNwOworCisJY3AgPSBmbGFzaF9tYWtlX2FkZHIgKGluZm8sIDAsIG9mZnNldCk7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJcmV0dXJuIChjcFswXSk7CisjZWxzZQorCXJldHVybiAoY3BbaW5mby0+cG9ydHdpZHRoIC0gMV0pOworI2VuZGlmCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJlYWQgYSBzaG9ydCB3b3JkIGJ5IHN3YXBwaW5nIGZvciBwcGMgZm9ybWF0LgorICovCisjaWYgMAorc3RhdGljIHVzaG9ydCBmbGFzaF9yZWFkX3VzaG9ydCAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3QsIHVpbnQgb2Zmc2V0KQoreworCXVjaGFyICphZGRyOworCXVzaG9ydCByZXR2YWw7CisKKyNpZmRlZiBERUJVR19GTEFTSAorCWludCB4OworI2VuZGlmCisJYWRkciA9IGZsYXNoX21ha2VfYWRkciAoaW5mbywgc2VjdCwgb2Zmc2V0KTsKKworI2lmZGVmIERFQlVHX0ZMQVNICisJZGVidWcgKCJ1c2hvcnQgYWRkciBpcyBhdCAlcCBpbmZvLT5wb3J0d2lkdGggPSAlZFxuIiwgYWRkciwKKwkgICAgICAgaW5mby0+cG9ydHdpZHRoKTsKKwlmb3IgKHggPSAwOyB4IDwgMiAqIGluZm8tPnBvcnR3aWR0aDsgeCsrKSB7CisJCWRlYnVnICgiYWRkclsleF0gPSAweCV4XG4iLCB4LCBhZGRyW3hdKTsKKwl9CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwlpZiAoaW5mby0+aW50ZXJmYWNlID09IEZMQVNIX0NGSV9YOFgxNikgeworCSAgICByZXR2YWwgPSAoYWRkclswXSB8IChhZGRyWzJdIDw8IDgpKTsKKwl9IGVsc2UgeworCSAgICByZXR2YWwgPSAoYWRkclswXSB8IChhZGRyWyhpbmZvLT5wb3J0d2lkdGgpXSA8PCA4KSk7CisJfQorI2Vsc2UKKwlyZXR2YWwgPSAoKGFkZHJbKDIgKiBpbmZvLT5wb3J0d2lkdGgpIC0gMV0gPDwgOCkgfAorCQkgIGFkZHJbaW5mby0+cG9ydHdpZHRoIC0gMV0pOworI2VuZGlmCisKKwlkZWJ1ZyAoInJldHZhbCA9IDB4JXhcbiIsIHJldHZhbCk7CisJcmV0dXJuIHJldHZhbDsKK30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiByZWFkIGEgbG9uZyB3b3JkIGJ5IHBpY2tpbmcgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgb2YgZWFjaCBtYXhpbXVtCisgKiBwb3J0IHNpemUgd29yZC4gU3dhcCBmb3IgcHBjIGZvcm1hdC4KKyAqLworc3RhdGljIHVsb25nIGZsYXNoX3JlYWRfbG9uZyAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3QsIHVpbnQgb2Zmc2V0KQoreworCXVjaGFyICphZGRyOworCXVsb25nIHJldHZhbDsKKyNpZmRlZiBERUJVR19GTEFTSAorCWludCB4OworI2VuZGlmCisjaWYgMAorCXN3aXRjaCAoaW5mby0+aW50ZXJmYWNlKSB7CisJY2FzZSBGTEFTSF9DRklfWDg6CisJY2FzZSBGTEFTSF9DRklfWDE2OgorCSAgICBicmVhazsKKwljYXNlIEZMQVNIX0NGSV9YOFgxNjoKKwkgICAgb2Zmc2V0IDw8PSAxOworCX0KKyNlbmRpZgkKKwkvLyBmbGFzaF9tYWtlX2FkZHIoKSBtdWx0aXBsaWVzIG9mZnNldCBieSBpbmZvLT5wb3J0d2lkdGguCisJYWRkciA9IGZsYXNoX21ha2VfYWRkciAoaW5mbywgc2VjdCwgb2Zmc2V0KTsKKworI2lmZGVmIERFQlVHX0ZMQVNICisJZGVidWcgKCJsb25nIGFkZHIgaXMgYXQgJXAgaW5mby0+cG9ydHdpZHRoID0gJWRcbiIsIGFkZHIsCisJICAgICAgIGluZm8tPnBvcnR3aWR0aCk7CisJZm9yICh4ID0gMDsgeCA8IDQgKiBpbmZvLT5wb3J0d2lkdGg7IHgrKykgeworCQlkZWJ1ZyAoImFkZHJbJXhdID0gMHgleFxuIiwgeCwgYWRkclt4XSk7CisJfQorI2VuZGlmCisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJaWYgKGluZm8tPmludGVyZmFjZSA9PSBGTEFTSF9DRklfWDhYMTYpIHsKKwkgICAgcmV0dmFsID0gKGFkZHJbMF0gfCAoYWRkclsyXSA8PCA4KSB8IChhZGRyWzRdIDw8IDE2KSB8IChhZGRyWzZdIDw8IDI0KSk7CisJfSBlbHNlIHsKKwkgICAgcmV0dmFsID0gKGFkZHJbMF0gfCAoYWRkclsoaW5mby0+cG9ydHdpZHRoKV0gPDwgOCkgfAorCQkgICAgICAoYWRkclsoMiAqIGluZm8tPnBvcnR3aWR0aCldIDw8IDE2KSB8CisJCSAgICAgIChhZGRyWygzICogaW5mby0+cG9ydHdpZHRoKV0gPDwgMjQpKTsKKwl9CisjZWxzZQorCS8vRklYTUU6IFRoaXMgdW5kb2N1bWVudGVkIGNvZGUgYXBwZWFycyB0byBtYXRjaCBicm9rZW4gYnVzIHdpcmluZy4KKwlyZXR2YWwgPSAoYWRkclsoMiAqIGluZm8tPnBvcnR3aWR0aCkgLSAxXSA8PCAyNCkgfAorCQkoYWRkclsoaW5mby0+cG9ydHdpZHRoKSAtIDFdIDw8IDE2KSB8CisJCShhZGRyWyg0ICogaW5mby0+cG9ydHdpZHRoKSAtIDFdIDw8IDgpIHwKKwkJYWRkclsoMyAqIGluZm8tPnBvcnR3aWR0aCkgLSAxXTsKKyNlbmRpZgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordW5zaWduZWQgbG9uZyBmbGFzaF9pbml0ICh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IDA7CisJaW50IGk7CisKKwkvKiBJbml0OiBubyBGTEFTSGVzIGtub3duICovCisJZm9yIChpID0gMDsgaSA8IENPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTOyArK2kpIHsKKwkJZmxhc2hfaW5mb1tpXS5mbGFzaF9pZCA9IEZMQVNIX1VOS05PV047CisJCXNpemUgKz0gZmxhc2hfaW5mb1tpXS5zaXplID0gZmxhc2hfZ2V0X3NpemUgKGJhbmtfYmFzZVtpXSwgaSk7CisJCWlmIChmbGFzaF9pbmZvW2ldLmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHsKKyNpZm5kZWYgQ0ZHX0ZMQVNIX1FVSUVUX1RFU1QKKwkJCXByaW50ZiAoIiMjIFVua25vd24gRkxBU0ggb24gQmFuayAlZCAtIFNpemUgPSAweCUwOGx4ID0gJWxkIE1CXG4iLAorCQkJCWksIGZsYXNoX2luZm9baV0uc2l6ZSwgZmxhc2hfaW5mb1tpXS5zaXplIDw8IDIwKTsKKyNlbmRpZiAvKiBDRkdfRkxBU0hfUVVJRVRfVEVTVCAqLworCQl9CisJfQorCisJLyogTW9uaXRvciBwcm90ZWN0aW9uIE9OIGJ5IGRlZmF1bHQgKi8KKyNpZiAoQ09ORklHX01PTklUT1JfQkFTRSA+PSBDT05GSUdfU1lTX0ZMQVNIX0JBU0UpCisJZmxhc2hfcHJvdGVjdCAoRkxBR19QUk9URUNUX1NFVCwKKwkJICAgICAgIENPTkZJR19NT05JVE9SX0JBU0UsCisJCSAgICAgICBDT05GSUdfTU9OSVRPUl9CQVNFICsgbW9uaXRvcl9mbGFzaF9sZW4gIC0gMSwKKwkJICAgICAgIGZsYXNoX2dldF9pbmZvKENPTkZJR19NT05JVE9SX0JBU0UpKTsKKyNlbmRpZgorCisJLyogRW52aXJvbm1lbnQgcHJvdGVjdGlvbiBPTiBieSBkZWZhdWx0ICovCisjaWZkZWYgQ09ORklHX0VOVl9JU19JTl9GTEFTSAorCWZsYXNoX3Byb3RlY3QgKEZMQUdfUFJPVEVDVF9TRVQsCisJCSAgICAgICBDT05GSUdfRU5WX0FERFIsCisJCSAgICAgICBDT05GSUdfRU5WX0FERFIgKyBDT05GSUdfRU5WX1NFQ1RfU0laRSAtIDEsCisJCSAgICAgICBmbGFzaF9nZXRfaW5mbyhDT05GSUdfRU5WX0FERFIpKTsKKyNlbmRpZgorCisJLyogUmVkdW5kYW50IGVudmlyb25tZW50IHByb3RlY3Rpb24gT04gYnkgZGVmYXVsdCAqLworI2lmZGVmIENPTkZJR19FTlZfQUREUl9SRURVTkQKKwlmbGFzaF9wcm90ZWN0IChGTEFHX1BST1RFQ1RfU0VULAorCQkgICAgICAgQ09ORklHX0VOVl9BRERSX1JFRFVORCwKKwkJICAgICAgIENPTkZJR19FTlZfQUREUl9SRURVTkQgKyBDT05GSUdfRU5WX1NJWkVfUkVEVU5EIC0gMSwKKwkJICAgICAgIGZsYXNoX2dldF9pbmZvKENPTkZJR19FTlZfQUREUl9SRURVTkQpKTsKKyNlbmRpZgorCXJldHVybiAoc2l6ZSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX0VOVl9JU19JTl9GTEFTSCkgfHwgZGVmaW5lZChDT05GSUdfRU5WX0FERFJfUkVEVU5EKSB8fCAoQ09ORklHX01PTklUT1JfQkFTRSA+PSBDT05GSUdfU1lTX0ZMQVNIX0JBU0UpCitzdGF0aWMgZmxhc2hfaW5mb190ICpmbGFzaF9nZXRfaW5mbyh1bG9uZyBiYXNlKQoreworCWludCBpOworCWZsYXNoX2luZm9fdCAqIGluZm8gPSAwOworCisJZm9yIChpID0gMDsgaSA8IENPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTOyBpICsrKSB7CisJCWluZm8gPSAmIGZsYXNoX2luZm9baV07CisJCWlmIChpbmZvLT5zaXplICYmIGluZm8tPnN0YXJ0WzBdIDw9IGJhc2UgJiYKKwkJICAgIGJhc2UgPD0gaW5mby0+c3RhcnRbMF0gKyBpbmZvLT5zaXplIC0gMSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBpID09IENPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTID8gMCA6IGluZm87Cit9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitpbnQgZmxhc2hfZXJhc2UgKGZsYXNoX2luZm9fdCAqIGluZm8sIGludCBzX2ZpcnN0LCBpbnQgc19sYXN0KQoreworCWludCByY29kZSA9IDA7CisJaW50IHByb3Q7CisJZmxhc2hfc2VjdF90IHNlY3Q7CisgICAgICAgIHVjaGFyIGNoOworCXVjaGFyICphZGRyOworICAKKwlpZiAoaW5mby0+Zmxhc2hfaWQgIT0gRkxBU0hfTUFOX0NGSSkgeworCQlwdXRzICgiQ2FuJ3QgZXJhc2UgdW5rbm93biBmbGFzaCB0eXBlIC0gYWJvcnRlZFxuIik7CisJCXJldHVybiAxOworCX0KKwlpZiAoKHNfZmlyc3QgPCAwKSB8fCAoc19maXJzdCA+IHNfbGFzdCkpIHsKKwkJcHV0cyAoIi0gbm8gc2VjdG9ycyB0byBlcmFzZVxuIik7CisJCXJldHVybiAxOworCX0KKworCXByb3QgPSAwOworCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3QgPD0gc19sYXN0OyArK3NlY3QpIHsKKwkJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0pIHsKKwkJCXByb3QrKzsKKwkJfQorCX0KKwlpZiAocHJvdCkgeworCQlwcmludGYgKCItIFdhcm5pbmc6ICVkIHByb3RlY3RlZCBzZWN0b3JzIHdpbGwgbm90IGJlIGVyYXNlZCFcbiIsIHByb3QpOworCX0gZWxzZSB7CisJCXB1dGMgKCdcbicpOworCX0KKworCisJZm9yIChzZWN0ID0gc19maXJzdDsgc2VjdCA8PSBzX2xhc3Q7IHNlY3QrKykgeworCQlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSA9PSAwKSB7IC8qIG5vdCBwcm90ZWN0ZWQgKi8KKwkJCXN3aXRjaCAoaW5mby0+dmVuZG9yKSB7CisJCQljYXNlIENGSV9DTURTRVRfSU5URUxfU1RBTkRBUkQ6CisJCQljYXNlIENGSV9DTURTRVRfSU5URUxfRVhURU5ERUQ6CisJCQkJZmxhc2hfd3JpdGVfY21kIChpbmZvLCBzZWN0LCAwLCBGTEFTSF9DTURfQ0xFQVJfU1RBVFVTKTsKKwkJCQlmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3QsIDAsIEZMQVNIX0NNRF9CTE9DS19FUkFTRSk7CisJCQkJZmxhc2hfd3JpdGVfY21kIChpbmZvLCBzZWN0LCAwLCBGTEFTSF9DTURfRVJBU0VfQ09ORklSTSk7CisJCQkJYnJlYWs7CisJCQljYXNlIENGSV9DTURTRVRfQU1EX1NUQU5EQVJEOgorCQkJY2FzZSBDRklfQ01EU0VUX0FNRF9FWFRFTkRFRDoKKwkJCQlmbGFzaF91bmxvY2tfc2VxIChpbmZvLCBzZWN0KTsKKwkJCQlmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3QsIEFNRF9BRERSX0VSQVNFX1NUQVJULAorCQkJCQkJCUFNRF9DTURfRVJBU0VfU1RBUlQpOworCQkJCWZsYXNoX3VubG9ja19zZXEgKGluZm8sIHNlY3QpOworCQkJCWZsYXNoX3dyaXRlX2NtZCAoaW5mbywgc2VjdCwgMCwgQU1EX0NNRF9FUkFTRV9TRUNUT1IpOworCQkJCQorCQkJCS8qIHRvZ2dsZSAqLworCSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgPSBmbGFzaF9tYWtlX2FkZHIgKGluZm8sIHNlY3QsIDApOwkJCQkKKwkJCQlkbyB7CisJCQkJICAgIGNoID0gKih2b2xhdGlsZSB1Y2hhciAqKShhZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoICgoY2ggJiAweDgwKSA9PSAwKSB8fCAoY2ggIT0gMHhGRikgKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZGVidWcgKCJVbmtvd24gZmxhc2ggdmVuZG9yICVkXG4iLAorCQkJCSAgICAgICBpbmZvLT52ZW5kb3IpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoZmxhc2hfZnVsbF9zdGF0dXNfY2hlY2sKKwkJCSAgICAoaW5mbywgc2VjdCwgaW5mby0+ZXJhc2VfYmxrX3RvdXQsICJlcmFzZSIpKSB7CisJCQkJcmNvZGUgPSAxOworCQkJfSBlbHNlCisJCQkJcHV0YyAoJy4nKTsKKwkJfQorCX0KKwlwdXRzICgiIGRvbmVcbiIpOworCXJldHVybiByY29kZTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIGZsYXNoX3ByaW50X2luZm8gKGZsYXNoX2luZm9fdCAqIGluZm8pCit7CisJaW50IGk7CisKKwlpZiAoaW5mby0+Zmxhc2hfaWQgIT0gRkxBU0hfTUFOX0NGSSkgeworCQlwdXRzICgibWlzc2luZyBvciB1bmtub3duIEZMQVNIIHR5cGVcbiIpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRmICgiQ0ZJIGNvbmZvcm1hbnQgRkxBU0ggKCVkIHggJWQpIiwKKwkJKGluZm8tPnBvcnR3aWR0aCA8PCAzKSwgKGluZm8tPmNoaXB3aWR0aCA8PCAzKSk7CisJcHJpbnRmICgiICBTaXplOiAlbGQgTUIgaW4gJWQgU2VjdG9yc1xuIiwKKwkJaW5mby0+c2l6ZSA+PiAyMCwgaW5mby0+c2VjdG9yX2NvdW50KTsKKwlwcmludGYgKCIgRXJhc2UgdGltZW91dCAlbGQgbXMsIHdyaXRlIHRpbWVvdXQgJWxkIG1zLCBidWZmZXIgd3JpdGUgdGltZW91dCAlbGQgbXMsIGJ1ZmZlciBzaXplICVkXG4iLAorCQlpbmZvLT5lcmFzZV9ibGtfdG91dCwKKwkJaW5mby0+d3JpdGVfdG91dCwKKwkJaW5mby0+YnVmZmVyX3dyaXRlX3RvdXQsCisJCWluZm8tPmJ1ZmZlcl9zaXplKTsKKworCXB1dHMgKCIgIFNlY3RvciBTdGFydCBBZGRyZXNzZXM6Iik7CisJZm9yIChpID0gMDsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgKytpKSB7CisjaWZkZWYgQ0ZHX0ZMQVNIX0VNUFRZX0lORk8KKwkJaW50IGs7CisJCWludCBzaXplOworCQlpbnQgZXJhc2VkOworCQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpmbGFzaDsKKworCQkvKgorCQkgKiBDaGVjayBpZiB3aG9sZSBzZWN0b3IgaXMgZXJhc2VkCisJCSAqLworCQlpZiAoaSAhPSAoaW5mby0+c2VjdG9yX2NvdW50IC0gMSkpCisJCQlzaXplID0gaW5mby0+c3RhcnRbaSArIDFdIC0gaW5mby0+c3RhcnRbaV07CisJCWVsc2UKKwkJCXNpemUgPSBpbmZvLT5zdGFydFswXSArIGluZm8tPnNpemUgLSBpbmZvLT5zdGFydFtpXTsKKwkJZXJhc2VkID0gMTsKKwkJZmxhc2ggPSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSBpbmZvLT5zdGFydFtpXTsKKwkJc2l6ZSA9IHNpemUgPj4gMjsJLyogZGl2aWRlIGJ5IDQgZm9yIGxvbmd3b3JkIGFjY2VzcyAqLworCQlmb3IgKGsgPSAwOyBrIDwgc2l6ZTsgaysrKSB7CisJCQlpZiAoKmZsYXNoKysgIT0gMHhmZmZmZmZmZikgeworCQkJCWVyYXNlZCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoKGkgJSA1KSA9PSAwKQorCQkJcHJpbnRmICgiXG4iKTsKKwkJLyogcHJpbnQgZW1wdHkgYW5kIHJlYWQtb25seSBpbmZvICovCisJCXByaW50ZiAoIiAlMDhsWCVzJXMiLAorCQkJaW5mby0+c3RhcnRbaV0sCisJCQllcmFzZWQgPyAiIEUiIDogIiAgIiwKKwkJCWluZm8tPnByb3RlY3RbaV0gPyAiUk8gIiA6ICIgICAiKTsKKyNlbHNlCS8qICEgQ0ZHX0ZMQVNIX0VNUFRZX0lORk8gKi8KKwkJaWYgKChpICUgNSkgPT0gMCkKKwkJCXByaW50ZiAoIlxuICAgIik7CisJCXByaW50ZiAoIiAlMDhsWCVzIiwKKwkJCWluZm8tPnN0YXJ0W2ldLCBpbmZvLT5wcm90ZWN0W2ldID8gIiAoUk8pIiA6ICIgICAgICIpOworI2VuZGlmCisJfQorCXB1dGMgKCdcbicpOworCXJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weSBtZW1vcnkgdG8gZmxhc2gsIHJldHVybnM6CisgKiAwIC0gT0sKKyAqIDEgLSB3cml0ZSB0aW1lb3V0CisgKiAyIC0gRmxhc2ggbm90IGVyYXNlZAorICovCitpbnQgd3JpdGVfYnVmZiAoZmxhc2hfaW5mb190ICogaW5mbywgdWNoYXIgKiBzcmMsIHVsb25nIGFkZHIsIHVsb25nIGNudCkKK3sKKwl1bG9uZyB3cDsKKwl1bG9uZyBjcDsKKwlpbnQgYWxuOworCWNmaXdvcmRfdCBjd29yZDsKKwlpbnQgaSwgcmM7CisKKyNpZmRlZiBDT05GSUdfU1lTX0ZMQVNIX1VTRV9CVUZGRVJfV1JJVEUKKwl1bnNpZ25lZCBjaGFyIHBhdFtdID0geyd8JywgJy0nLCAnLycsICdcXCd9OworICAgICAgIAlpbnQgcGF0Y250ID0gMDsKKwlpbnQgYnVmZmVyZWRfc2l6ZTsKKyNlbmRpZgorCS8qIGdldCBsb3dlciBhbGlnbmVkIGFkZHJlc3MgKi8KKwkvKiBnZXQgbG93ZXIgYWxpZ25lZCBhZGRyZXNzICovCisJd3AgPSAoYWRkciAmIH4oaW5mby0+cG9ydHdpZHRoIC0gMSkpOworCisJLyogaGFuZGxlIHVuYWxpZ25lZCBzdGFydCAqLworCWlmICgoYWxuID0gYWRkciAtIHdwKSAhPSAwKSB7CisJCWN3b3JkLmwgPSAwOworCQljcCA9IHdwOworCQlmb3IgKGkgPSAwOyBpIDwgYWxuOyArK2ksICsrY3ApCisJCQlmbGFzaF9hZGRfYnl0ZSAoaW5mbywgJmN3b3JkLCAoKih1Y2hhciAqKSBjcCkpOworCisJCWZvciAoOyAoaSA8IGluZm8tPnBvcnR3aWR0aCkgJiYgKGNudCA+IDApOyBpKyspIHsKKwkJCWZsYXNoX2FkZF9ieXRlIChpbmZvLCAmY3dvcmQsICpzcmMrKyk7CisJCQljbnQtLTsKKwkJCWNwKys7CisJCX0KKwkJZm9yICg7IChjbnQgPT0gMCkgJiYgKGkgPCBpbmZvLT5wb3J0d2lkdGgpOyArK2ksICsrY3ApCisJCQlmbGFzaF9hZGRfYnl0ZSAoaW5mbywgJmN3b3JkLCAoKih1Y2hhciAqKSBjcCkpOworCQlpZiAoKHJjID0gZmxhc2hfd3JpdGVfY2Zpd29yZCAoaW5mbywgd3AsIGN3b3JkKSkgIT0gMCkKKwkJCXJldHVybiByYzsKKwkJd3AgPSBjcDsKKwl9CisKKwkvKiBoYW5kbGUgdGhlIGFsaWduZWQgcGFydCAqLworI2lmZGVmIENPTkZJR19TWVNfRkxBU0hfVVNFX0JVRkZFUl9XUklURQorCWJ1ZmZlcmVkX3NpemUgPSAoaW5mby0+cG9ydHdpZHRoIC8gaW5mby0+Y2hpcHdpZHRoKTsKKwlidWZmZXJlZF9zaXplICo9IGluZm8tPmJ1ZmZlcl9zaXplOworCXdoaWxlIChjbnQgPj0gaW5mby0+cG9ydHdpZHRoKSB7CisJCS8qIFNob3cgcHJvY2Vzc2luZyAqLworCQlpZiAoKCsrcGF0Y250ICUgMjU2KSA9PSAwKQorCQkgICAgcHJpbnRmKCIlY1xiIiwgcGF0WyhwYXRjbnQgLyAyNTYpICYgMHgwM10pOworCisJCWkgPSBidWZmZXJlZF9zaXplID4gY250ID8gY250IDogYnVmZmVyZWRfc2l6ZTsKKwkJaWYgKChyYyA9IGZsYXNoX3dyaXRlX2NmaWJ1ZmZlciAoaW5mbywgd3AsIHNyYywgaSkpICE9IEVSUl9PSykKKwkJCXJldHVybiByYzsKKwkJaSAtPSBpICYgKGluZm8tPnBvcnR3aWR0aCAtIDEpOworCQl3cCArPSBpOworCQlzcmMgKz0gaTsKKwkJY250IC09IGk7CisJfQorI2Vsc2UKKwl3aGlsZSAoY250ID49IGluZm8tPnBvcnR3aWR0aCkgeworCQljd29yZC5sID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IGluZm8tPnBvcnR3aWR0aDsgaSsrKSB7CisJCQlmbGFzaF9hZGRfYnl0ZSAoaW5mbywgJmN3b3JkLCAqc3JjKyspOworCQl9CisJCWlmICgocmMgPSBmbGFzaF93cml0ZV9jZml3b3JkIChpbmZvLCB3cCwgY3dvcmQpKSAhPSAwKQorCQkJcmV0dXJuIHJjOworCQl3cCArPSBpbmZvLT5wb3J0d2lkdGg7CisJCWNudCAtPSBpbmZvLT5wb3J0d2lkdGg7CisJfQorI2VuZGlmIC8qIENPTkZJR19TWVNfRkxBU0hfVVNFX0JVRkZFUl9XUklURSAqLworCWlmIChjbnQgPT0gMCkgeworCQlyZXR1cm4gKDApOworCX0KKworCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCB0YWlsIGJ5dGVzCisJICovCisJY3dvcmQubCA9IDA7CisJZm9yIChpID0gMCwgY3AgPSB3cDsgKGkgPCBpbmZvLT5wb3J0d2lkdGgpICYmIChjbnQgPiAwKTsgKytpLCArK2NwKSB7CisJCWZsYXNoX2FkZF9ieXRlIChpbmZvLCAmY3dvcmQsICpzcmMrKyk7CisJCS0tY250OworCX0KKwlmb3IgKDsgaSA8IGluZm8tPnBvcnR3aWR0aDsgKytpLCArK2NwKSB7CisJCWZsYXNoX2FkZF9ieXRlIChpbmZvLCAmY3dvcmQsICgqKHVjaGFyICopIGNwKSk7CisJfQorCisJcmV0dXJuIGZsYXNoX3dyaXRlX2NmaXdvcmQgKGluZm8sIHdwLCBjd29yZCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmZGVmIENGR19GTEFTSF9QUk9URUNUSU9OCisKK2ludCBmbGFzaF9yZWFsX3Byb3RlY3QgKGZsYXNoX2luZm9fdCAqIGluZm8sIGxvbmcgc2VjdG9yLCBpbnQgcHJvdCkKK3sKKwlpbnQgcmV0Y29kZSA9IDA7CisKKwlmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3RvciwgMCwgRkxBU0hfQ01EX0NMRUFSX1NUQVRVUyk7CisJZmxhc2hfd3JpdGVfY21kIChpbmZvLCBzZWN0b3IsIDAsIEZMQVNIX0NNRF9QUk9URUNUKTsKKwlpZiAocHJvdCkKKwkJZmxhc2hfd3JpdGVfY21kIChpbmZvLCBzZWN0b3IsIDAsIEZMQVNIX0NNRF9QUk9URUNUX1NFVCk7CisJZWxzZQorCQlmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3RvciwgMCwgRkxBU0hfQ01EX1BST1RFQ1RfQ0xFQVIpOworCisJaWYgKChyZXRjb2RlID0KKwkgICAgIGZsYXNoX2Z1bGxfc3RhdHVzX2NoZWNrIChpbmZvLCBzZWN0b3IsIGluZm8tPmVyYXNlX2Jsa190b3V0LAorCQkJCSAgICAgIHByb3QgPyAicHJvdGVjdCIgOiAidW5wcm90ZWN0IikpID09IDApIHsKKworCQlpbmZvLT5wcm90ZWN0W3NlY3Rvcl0gPSBwcm90OworCQkvKiBJbnRlbCdzIHVucHJvdGVjdCB1bnByb3RlY3RzIGFsbCBsb2NraW5nICovCisJCWlmIChwcm90ID09IDApIHsKKwkJCWZsYXNoX3NlY3RfdCBpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspIHsKKwkJCQlpZiAoaW5mby0+cHJvdGVjdFtpXSkKKwkJCQkJZmxhc2hfcmVhbF9wcm90ZWN0IChpbmZvLCBpLCAxKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmV0Y29kZTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZmxhc2hfcmVhZF91c2VyX3NlcmlhbCAtIHJlYWQgdGhlIE9uZVRpbWVQcm9ncmFtbWluZyBjZWxscworICovCit2b2lkIGZsYXNoX3JlYWRfdXNlcl9zZXJpYWwgKGZsYXNoX2luZm9fdCAqIGluZm8sIHZvaWQgKmJ1ZmZlciwgaW50IG9mZnNldCwKKwkJCSAgICAgaW50IGxlbikKK3sKKwl1Y2hhciAqc3JjOworCXVjaGFyICpkc3Q7CisKKwlkc3QgPSBidWZmZXI7CisJc3JjID0gZmxhc2hfbWFrZV9hZGRyIChpbmZvLCAwLCBGTEFTSF9PRkZTRVRfVVNFUl9QUk9URUNUSU9OKTsKKwlmbGFzaF93cml0ZV9jbWQgKGluZm8sIDAsIDAsIEZMQVNIX0NNRF9SRUFEX0lEKTsKKwltZW1jcHkgKGRzdCwgc3JjICsgb2Zmc2V0LCBsZW4pOworCWZsYXNoX3dyaXRlX2NtZCAoaW5mbywgMCwgMCwgaW5mby0+Y21kX3Jlc2V0KTsKK30KKworLyoKKyAqIGZsYXNoX3JlYWRfZmFjdG9yeV9zZXJpYWwgLSByZWFkIHRoZSBkZXZpY2UgSWQgZnJvbSB0aGUgcHJvdGVjdGlvbiBhcmVhCisgKi8KK3ZvaWQgZmxhc2hfcmVhZF9mYWN0b3J5X3NlcmlhbCAoZmxhc2hfaW5mb190ICogaW5mbywgdm9pZCAqYnVmZmVyLCBpbnQgb2Zmc2V0LAorCQkJCWludCBsZW4pCit7CisJdWNoYXIgKnNyYzsKKworCXNyYyA9IGZsYXNoX21ha2VfYWRkciAoaW5mbywgMCwgRkxBU0hfT0ZGU0VUX0lOVEVMX1BST1RFQ1RJT04pOworCWZsYXNoX3dyaXRlX2NtZCAoaW5mbywgMCwgMCwgRkxBU0hfQ01EX1JFQURfSUQpOworCW1lbWNweSAoYnVmZmVyLCBzcmMgKyBvZmZzZXQsIGxlbik7CisJZmxhc2hfd3JpdGVfY21kIChpbmZvLCAwLCAwLCBpbmZvLT5jbWRfcmVzZXQpOworfQorCisjZW5kaWYgLyogQ0ZHX0ZMQVNIX1BST1RFQ1RJT04gKi8KKworLyoKKyAqIGZsYXNoX2lzX2J1c3kgLSBjaGVjayB0byBzZWUgaWYgdGhlIGZsYXNoIGlzIGJ1c3kKKyAqIFRoaXMgcm91dGluZSBjaGVja3MgdGhlIHN0YXR1cyBvZiB0aGUgY2hpcCBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBjaGlwIGlzIGJ1c3kKKyAqLworc3RhdGljIGludCBmbGFzaF9pc19idXN5IChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdCkKK3sKKwlpbnQgcmV0dmFsOworCisJc3dpdGNoIChpbmZvLT52ZW5kb3IpIHsKKwljYXNlIENGSV9DTURTRVRfSU5URUxfU1RBTkRBUkQ6CisJY2FzZSBDRklfQ01EU0VUX0lOVEVMX0VYVEVOREVEOgorCQlyZXR2YWwgPSAhZmxhc2hfaXNzZXQgKGluZm8sIHNlY3QsIDAsIEZMQVNIX1NUQVRVU19ET05FKTsKKwkJYnJlYWs7CisJY2FzZSBDRklfQ01EU0VUX0FNRF9TVEFOREFSRDoKKwljYXNlIENGSV9DTURTRVRfQU1EX0VYVEVOREVEOgorCQlyZXR2YWwgPSBmbGFzaF90b2dnbGUgKGluZm8sIHNlY3QsIDAsIEFNRF9TVEFUVVNfVE9HR0xFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dmFsID0gMDsKKwl9CisjaWZkZWYgREVCVUdfRkxBU0gKKwlpZiAocmV0dmFsKQorCSAgICBkZWJ1ZyAoImZsYXNoX2lzX2J1c3k6ICVkXG4iLCByZXR2YWwpOworI2VuZGlmCisJcmV0dXJuIHJldHZhbDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIHdhaXQgZm9yIFhTUi43IHRvIGJlIHNldC4gVGltZSBvdXQgd2l0aCBhbiBlcnJvciBpZiBpdCBkb2VzIG5vdC4KKyAqICBUaGlzIHJvdXRpbmUgZG9lcyBub3Qgc2V0IHRoZSBmbGFzaCB0byByZWFkLWFycmF5IG1vZGUuCisgKi8KK3N0YXRpYyBpbnQgZmxhc2hfc3RhdHVzX2NoZWNrIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdG9yLAorCQkJICAgICAgIHVsb25nIHRvdXQsIGNoYXIgKnByb21wdCkKK3sKKwl1bG9uZyBzdGFydCwgbm93OworCisJLyogV2FpdCBmb3IgY29tbWFuZCBjb21wbGV0aW9uICovCisJLy8gKFN1bikgRml4IG9yZGVyIG9mIGNoZWNraW5nIHRpbWUgc28gaXQgd29ya3Mgd2hlbiB0aGUgQ1BVIGlzIHZlcnkKKwkvLyBzbG93LCBlLmcuLCBzaW5nbGUtc3RlcHBpbmcgb3IgZW11bGF0aW9uLgorCXN0YXJ0ID0gZ2V0X3RpbWVyICgwKTsKKwl3aGlsZSAobm93ID0gZ2V0X3RpbWVyKHN0YXJ0KSwKKwkgICAgICAgZmxhc2hfaXNfYnVzeSAoaW5mbywgc2VjdG9yKSkKKwl7CisJCWlmIChub3cgPiBpbmZvLT5lcmFzZV9ibGtfdG91dCkgeworCQkJcHJpbnRmICgiRmxhc2ggJXMgdGltZW91dCBhdCBhZGRyZXNzICVseCBkYXRhICVseFxuIiwKKwkJCQlwcm9tcHQsIGluZm8tPnN0YXJ0W3NlY3Rvcl0sCisJCQkJZmxhc2hfcmVhZF9sb25nIChpbmZvLCBzZWN0b3IsIDApKTsKKwkJCWZsYXNoX3dyaXRlX2NtZCAoaW5mbywgc2VjdG9yLCAwLCBpbmZvLT5jbWRfcmVzZXQpOworCQkJcmV0dXJuIEVSUl9USU1PVVQ7CisJCX0KKwl9CisJcmV0dXJuIEVSUl9PSzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogV2FpdCBmb3IgWFNSLjcgdG8gYmUgc2V0LCBpZiBpdCB0aW1lcyBvdXQgcHJpbnQgYW4gZXJyb3IsIG90aGVyd2lzZSBkbyBhIGZ1bGwgc3RhdHVzIGNoZWNrLgorICogVGhpcyByb3V0aW5lIHNldHMgdGhlIGZsYXNoIHRvIHJlYWQtYXJyYXkgbW9kZS4KKyAqLworc3RhdGljIGludCBmbGFzaF9mdWxsX3N0YXR1c19jaGVjayAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3RvciwKKwkJCQkgICAgdWxvbmcgdG91dCwgY2hhciAqcHJvbXB0KQoreworCWludCByZXRjb2RlOworCisJcmV0Y29kZSA9IGZsYXNoX3N0YXR1c19jaGVjayAoaW5mbywgc2VjdG9yLCB0b3V0LCBwcm9tcHQpOworCXN3aXRjaCAoaW5mby0+dmVuZG9yKSB7CisJY2FzZSBDRklfQ01EU0VUX0lOVEVMX0VYVEVOREVEOgorCWNhc2UgQ0ZJX0NNRFNFVF9JTlRFTF9TVEFOREFSRDoKKwkJaWYgKChyZXRjb2RlICE9IEVSUl9PSykKKwkJICAgICYmICFmbGFzaF9pc2VxdWFsIChpbmZvLCBzZWN0b3IsIDAsIEZMQVNIX1NUQVRVU19ET05FKSkgeworCQkJcmV0Y29kZSA9IEVSUl9JTlZBTDsKKwkJCXByaW50ZiAoIkZsYXNoICVzIGVycm9yIGF0IGFkZHJlc3MgJWx4XG4iLCBwcm9tcHQsCisJCQkJaW5mby0+c3RhcnRbc2VjdG9yXSk7CisJCQlpZiAoZmxhc2hfaXNzZXQgKGluZm8sIHNlY3RvciwgMCwgRkxBU0hfU1RBVFVTX0VDTEJTIHwgRkxBU0hfU1RBVFVTX1BTTEJTKSkgeworCQkJCXB1dHMgKCJDb21tYW5kIFNlcXVlbmNlIEVycm9yLlxuIik7CisJCQl9IGVsc2UgaWYgKGZsYXNoX2lzc2V0IChpbmZvLCBzZWN0b3IsIDAsIEZMQVNIX1NUQVRVU19FQ0xCUykpIHsKKwkJCQlwdXRzICgiQmxvY2sgRXJhc2UgRXJyb3IuXG4iKTsKKwkJCQlyZXRjb2RlID0gRVJSX05PVF9FUkFTRUQ7CisJCQl9IGVsc2UgaWYgKGZsYXNoX2lzc2V0IChpbmZvLCBzZWN0b3IsIDAsIEZMQVNIX1NUQVRVU19QU0xCUykpIHsKKwkJCQlwdXRzICgiTG9ja2luZyBFcnJvclxuIik7CisJCQl9CisJCQlpZiAoZmxhc2hfaXNzZXQgKGluZm8sIHNlY3RvciwgMCwgRkxBU0hfU1RBVFVTX0RQUykpIHsKKwkJCQlwdXRzICgiQmxvY2sgbG9ja2VkLlxuIik7CisJCQkJcmV0Y29kZSA9IEVSUl9QUk9URUNURUQ7CisJCQl9CisJCQlpZiAoZmxhc2hfaXNzZXQgKGluZm8sIHNlY3RvciwgMCwgRkxBU0hfU1RBVFVTX1ZQRU5TKSkKKwkJCQlwdXRzICgiVnBwIExvdyBFcnJvci5cbiIpOworCQl9CisJCWZsYXNoX3dyaXRlX2NtZCAoaW5mbywgc2VjdG9yLCAwLCBpbmZvLT5jbWRfcmVzZXQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIHJldGNvZGU7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2J1ZmZlcl9hYm9ydF9yZXNldChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdG9yKQoreworICAgICBmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3RvciwgMHhhYWEsIDB4YWEpOworICAgICBmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3RvciwgMHg1NTUsIDB4NTUpOworICAgICBmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3RvciwgMHhhYWEsIDB4ZjApOyAgICAJCit9CQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyB2b2lkIGZsYXNoX2FkZF9ieXRlIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBjZml3b3JkX3QgKiBjd29yZCwgdWNoYXIgYykKK3sKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwl1bnNpZ25lZCBzaG9ydAl3OworCXVuc2lnbmVkIGludAlsOworCXVuc2lnbmVkIGxvbmcgbG9uZyBsbDsKKyNlbmRpZgorCisJc3dpdGNoIChpbmZvLT5wb3J0d2lkdGgpIHsKKwljYXNlIEZMQVNIX0NGSV84QklUOgorCQljd29yZC0+YyA9IGM7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfQ0ZJXzE2QklUOgorI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCQl3ID0gYzsKKwkJdyA8PD0gODsKKwkJY3dvcmQtPncgPSAoY3dvcmQtPncgPj4gOCkgfCB3OworI2Vsc2UKKwkJY3dvcmQtPncgPSAoY3dvcmQtPncgPDwgOCkgfCBjOworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgRkxBU0hfQ0ZJXzMyQklUOgorI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCQlsID0gYzsKKwkJbCA8PD0gMjQ7CisJCWN3b3JkLT5sID0gKGN3b3JkLT5sID4+IDgpIHwgbDsKKyNlbHNlCisJCWN3b3JkLT5sID0gKGN3b3JkLT5sIDw8IDgpIHwgYzsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIEZMQVNIX0NGSV82NEJJVDoKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwkJbGwgPSBjOworCQlsbCA8PD0gNTY7CisJCWN3b3JkLT5sbCA9IChjd29yZC0+bGwgPj4gOCkgfCBsbDsKKyNlbHNlCisJCWN3b3JkLT5sbCA9IChjd29yZC0+bGwgPDwgOCkgfCBjOworI2VuZGlmCisJCWJyZWFrOworCX0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBtYWtlIGEgcHJvcGVyIHNpemVkIGNvbW1hbmQgYmFzZWQgb24gdGhlIHBvcnQgYW5kIGNoaXAgd2lkdGhzCisgKi8KK3N0YXRpYyB2b2lkIGZsYXNoX21ha2VfY21kIChmbGFzaF9pbmZvX3QgKiBpbmZvLCB1Y2hhciBjbWQsIHZvaWQgKmNtZGJ1ZikKK3sKKwlpbnQgaTsKKwl1Y2hhciAqY3AgPSAodWNoYXIgKikgY21kYnVmOworCisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJZm9yIChpID0gaW5mby0+cG9ydHdpZHRoOyBpID4gMDsgaS0tKQorI2Vsc2UKKwlmb3IgKGkgPSAxOyBpIDw9IGluZm8tPnBvcnR3aWR0aDsgaSsrKQorI2VuZGlmCisJCSpjcCsrID0gKGkgJiAoaW5mby0+Y2hpcHdpZHRoIC0gMSkpID8gJ1wwJyA6IGNtZDsKK30KKworLyoKKyAqIFdyaXRlIGEgcHJvcGVyIHNpemVkIGNvbW1hbmQgdG8gdGhlIGNvcnJlY3QgYWRkcmVzcworICovCitzdGF0aWMgdm9pZAorZmxhc2hfd3JpdGVfY21kIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdCwgdWludCBvZmZzZXQsCisJCSB1Y2hhciBjbWQpCit7CisjaWZkZWYgREVCVUdfRkxBU0gKKyAgICBjb25zdCBpbnQgbm9EZWJ1ZyA9IDA7CisjZWxzZQorICAgIGNvbnN0IGludCBub0RlYnVnID0gMTsKKyNlbmRpZgorICAgIHJldHVybiBmbGFzaF93cml0ZV9jbWRfaW50KGluZm8sIHNlY3QsIG9mZnNldCwgY21kLCBub0RlYnVnKTsKK30KK3N0YXRpYyB2b2lkCitmbGFzaF93cml0ZV9jbWRfbm9kYmcgKGZsYXNoX2luZm9fdCAqIGluZm8sIGZsYXNoX3NlY3RfdCBzZWN0LCB1aW50IG9mZnNldCwKKwkJICAgICAgIHVjaGFyIGNtZCkKK3sKKyAgICByZXR1cm4gZmxhc2hfd3JpdGVfY21kX2ludChpbmZvLCBzZWN0LCBvZmZzZXQsIGNtZCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkCitmbGFzaF93cml0ZV9jbWRfaW50IChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdCwgdWludCBvZmZzZXQsCisJCSAgICAgdWNoYXIgY21kLCBpbnQgbm9EZWJ1ZykKK3sKKworCXZvbGF0aWxlIGNmaXB0cl90IGFkZHI7CisJY2Zpd29yZF90IGN3b3JkOworCisJYWRkci5jcCA9IGZsYXNoX21ha2VfYWRkciAoaW5mbywgc2VjdCwgb2Zmc2V0KTsKKwlmbGFzaF9tYWtlX2NtZCAoaW5mbywgY21kLCAmY3dvcmQpOworCXN3aXRjaCAoaW5mby0+cG9ydHdpZHRoKSB7CisJY2FzZSBGTEFTSF9DRklfOEJJVDoKKwkJaWYgKG5vRGVidWcgPT0gMCkKKwkJZGVidWcgKCJmd2MgYWRkciAlcCBjbWQgJXggJXggOGJpdCB4ICVkIGJpdFxuIiwgYWRkci5jcCwgY21kLAorCQkgICAgICAgY3dvcmQuYywgaW5mby0+Y2hpcHdpZHRoIDw8IENGSV9GTEFTSF9TSElGVF9XSURUSCk7CisJCSphZGRyLmNwID0gY3dvcmQuYzsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9DRklfMTZCSVQ6CisJCWlmIChub0RlYnVnID09IDApCisJCWRlYnVnICgiZndjIGFkZHIgJXAgY21kICV4ICU0LjR4IDE2Yml0IHggJWQgYml0XG4iLCBhZGRyLndwLAorCQkgICAgICAgY21kLCBjd29yZC53LAorCQkgICAgICAgaW5mby0+Y2hpcHdpZHRoIDw8IENGSV9GTEFTSF9TSElGVF9XSURUSCk7CisJCSphZGRyLndwID0gY3dvcmQudzsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9DRklfMzJCSVQ6CisJCWlmIChub0RlYnVnID09IDApCisJCWRlYnVnICgiZndjIGFkZHIgJXAgY21kICV4ICU4LjhseCAzMmJpdCB4ICVkIGJpdFxuIiwgYWRkci5scCwKKwkJICAgICAgIGNtZCwgY3dvcmQubCwKKwkJICAgICAgIGluZm8tPmNoaXB3aWR0aCA8PCBDRklfRkxBU0hfU0hJRlRfV0lEVEgpOworCQkqYWRkci5scCA9IGN3b3JkLmw7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfQ0ZJXzY0QklUOgorI2lmZGVmIERFQlVHX0ZMQVNICisJCWlmIChub0RlYnVnID09IDApCisJCXsKKwkJCWNoYXIgc3RyWzIwXTsKKworCQkJcHJpbnRfbG9uZ2xvbmcgKHN0ciwgY3dvcmQubGwpOworCisJCQlkZWJ1ZyAoImZ3cml0ZSBhZGRyICVwIGNtZCAleCAlcyA2NCBiaXQgeCAlZCBiaXRcbiIsCisJCQkgICAgICAgYWRkci5sbHAsIGNtZCwgc3RyLAorCQkJICAgICAgIGluZm8tPmNoaXB3aWR0aCA8PCBDRklfRkxBU0hfU0hJRlRfV0lEVEgpOworCQl9CisjZW5kaWYKKwkJKmFkZHIubGxwID0gY3dvcmQubGw7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgZmxhc2hfdW5sb2NrX3NlcSAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3QpCit7CisJZmxhc2hfd3JpdGVfY21kX25vZGJnIChpbmZvLCBzZWN0LCBBTURfQUREUl9TVEFSVCwgQU1EX0NNRF9VTkxPQ0tfU1RBUlQpOworCWZsYXNoX3dyaXRlX2NtZF9ub2RiZyAoaW5mbywgc2VjdCwgQU1EX0FERFJfQUNLLCBBTURfQ01EX1VOTE9DS19BQ0spOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgZmxhc2hfaXNlcXVhbCAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3QsIHVpbnQgb2Zmc2V0LCB1Y2hhciBjbWQpCit7CisJY2ZpcHRyX3QgY3B0cjsKKwljZml3b3JkX3QgY3dvcmQ7CisJaW50IHJldHZhbDsKKyNpZmRlZiBERUJVR19GTEFTSAorCWNvbnN0IGludCBkYmcgPSAxOworI2Vsc2UKKwljb25zdCBpbnQgZGJnID0gMDsKKyNlbmRpZgorCWNwdHIuY3AgPSBmbGFzaF9tYWtlX2FkZHIgKGluZm8sIHNlY3QsIG9mZnNldCk7CisJZmxhc2hfbWFrZV9jbWQgKGluZm8sIGNtZCwgJmN3b3JkKTsKKworCWlmIChkYmcpCisJICAgIGRlYnVnICgiaXM9IGNtZCAleCglYykgYWRkciAlcCAiLCBjbWQsIGNtZCwgY3B0ci5jcCk7CisJc3dpdGNoIChpbmZvLT5wb3J0d2lkdGgpIHsKKwljYXNlIEZMQVNIX0NGSV84QklUOgorCQlpZiAoZGJnKQorCQkgICAgZGVidWcgKCJpcz0gJXggJXhcbiIsIGNwdHIuY3BbMF0sIGN3b3JkLmMpOworCQlyZXR2YWwgPSAoY3B0ci5jcFswXSA9PSBjd29yZC5jKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9DRklfMTZCSVQ6CisJCWlmIChkYmcpCisJCSAgICBkZWJ1ZyAoImlzPSAlNC40eCAlNC40eFxuIiwgY3B0ci53cFswXSwgY3dvcmQudyk7CisJCXJldHZhbCA9IChjcHRyLndwWzBdID09IGN3b3JkLncpOworCQlicmVhazsKKwljYXNlIEZMQVNIX0NGSV8zMkJJVDoKKwkJaWYgKGRiZykKKwkJICAgIGRlYnVnICgiaXM9ICU4LjhseCAlOC44bHhcbiIsIGNwdHIubHBbMF0sIGN3b3JkLmwpOworCQlyZXR2YWwgPSAoY3B0ci5scFswXSA9PSBjd29yZC5sKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9DRklfNjRCSVQ6CisjaWZkZWYgREVCVUdfRkxBU0gKKwkJeworCQkJY2hhciBzdHIxWzIwXTsKKwkJCWNoYXIgc3RyMlsyMF07CisKKwkJCXByaW50X2xvbmdsb25nIChzdHIxLCBjcHRyLmxscFswXSk7CisJCQlwcmludF9sb25nbG9uZyAoc3RyMiwgY3dvcmQubGwpOworCQkJZGVidWcgKCJpcz0gJXMgJXNcbiIsIHN0cjEsIHN0cjIpOworCQl9CisjZW5kaWYKKwkJcmV0dmFsID0gKGNwdHIubGxwWzBdID09IGN3b3JkLmxsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dmFsID0gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCBmbGFzaF9pc3NldCAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3QsIHVpbnQgb2Zmc2V0LCB1Y2hhciBjbWQpCit7CisJY2ZpcHRyX3QgY3B0cjsKKwljZml3b3JkX3QgY3dvcmQ7CisJaW50IHJldHZhbDsKKworCWNwdHIuY3AgPSBmbGFzaF9tYWtlX2FkZHIgKGluZm8sIHNlY3QsIG9mZnNldCk7CisJZmxhc2hfbWFrZV9jbWQgKGluZm8sIGNtZCwgJmN3b3JkKTsKKwlzd2l0Y2ggKGluZm8tPnBvcnR3aWR0aCkgeworCWNhc2UgRkxBU0hfQ0ZJXzhCSVQ6CisJCXJldHZhbCA9ICgoY3B0ci5jcFswXSAmIGN3b3JkLmMpID09IGN3b3JkLmMpOworCQlicmVhazsKKwljYXNlIEZMQVNIX0NGSV8xNkJJVDoKKwkJcmV0dmFsID0gKChjcHRyLndwWzBdICYgY3dvcmQudykgPT0gY3dvcmQudyk7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfQ0ZJXzMyQklUOgorCQlyZXR2YWwgPSAoKGNwdHIubHBbMF0gJiBjd29yZC5sKSA9PSBjd29yZC5sKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9DRklfNjRCSVQ6CisJCXJldHZhbCA9ICgoY3B0ci5sbHBbMF0gJiBjd29yZC5sbCkgPT0gY3dvcmQubGwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR2YWwgPSAwOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IGZsYXNoX3RvZ2dsZSAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3QsIHVpbnQgb2Zmc2V0LCB1Y2hhciBjbWQpCit7CisJY2ZpcHRyX3QgY3B0cjsKKwljZml3b3JkX3QgY3dvcmQ7CisJaW50IHJldHZhbDsKKworCWNwdHIuY3AgPSBmbGFzaF9tYWtlX2FkZHIgKGluZm8sIHNlY3QsIG9mZnNldCk7CisJZmxhc2hfbWFrZV9jbWQgKGluZm8sIGNtZCwgJmN3b3JkKTsKKwlzd2l0Y2ggKGluZm8tPnBvcnR3aWR0aCkgeworCWNhc2UgRkxBU0hfQ0ZJXzhCSVQ6CisJCXJldHZhbCA9ICgoY3B0ci5jcFswXSAmIGN3b3JkLmMpICE9IChjcHRyLmNwWzBdICYgY3dvcmQuYykpOworCQlicmVhazsKKwljYXNlIEZMQVNIX0NGSV8xNkJJVDoKKwkJcmV0dmFsID0gKChjcHRyLndwWzBdICYgY3dvcmQudykgIT0gKGNwdHIud3BbMF0gJiBjd29yZC53KSk7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfQ0ZJXzMyQklUOgorCQlyZXR2YWwgPSAoKGNwdHIubHBbMF0gJiBjd29yZC5sKSAhPSAoY3B0ci5scFswXSAmIGN3b3JkLmwpKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9DRklfNjRCSVQ6CisJCXJldHZhbCA9ICgoY3B0ci5sbHBbMF0gJiBjd29yZC5sbCkgIT0KKwkJCSAgKGNwdHIubGxwWzBdICYgY3dvcmQubGwpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dmFsID0gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGRldGVjdCBpZiBmbGFzaCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIENvbW1vbiBGbGFzaCBJbnRlcmZhY2UgKENGSSkKKyAqIGh0dHA6Ly93d3cuamVkZWMub3JnL2Rvd25sb2FkL3NlYXJjaC9qZXNkNjgucGRmCisgKgorKi8KK3N0YXRpYyBpbnQgZmxhc2hfZGV0ZWN0X2NmaSAoZmxhc2hfaW5mb190ICogaW5mbykKK3sKKyAgICAgICAgdWxvbmcgZGF0YTsKKyAgICAgICAgCQorCWRlYnVnICgiZmxhc2hfZGV0ZWN0X2NmaSgpLi4uICIpOworCisjaWYgICAgIGRlZmluZWQoQ09ORklHX0ZMQVNIX0FTVDIzMDApCisgICAgICAgIGRhdGEgPSAqKHVsb25nICopKDB4MWU2ZTIwNzApOwkJLyogaGFyZHdhcmUgdHJhcGluZyAqLworICAgICAgICBpZiAoZGF0YSAmIDB4MTApCQkJLyogRFs0XTogMC8xICg4LzE2KSAqLworICAgICAgICAgICAgaW5mby0+cG9ydHdpZHRoID0gRkxBU0hfQ0ZJXzE2QklUOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbmZvLT5wb3J0d2lkdGggPSBGTEFTSF9DRklfOEJJVDsgICAgICAgICAgICAKKyNlbHNlCisgICAgICAgIGluZm8tPnBvcnR3aWR0aCA9IEZMQVNIX0NGSV84QklUOworI2VuZGlmCisKKwl7ICAgICAJCisJCWZvciAoaW5mby0+Y2hpcHdpZHRoID0gRkxBU0hfQ0ZJX0JZODsKKwkJICAgICBpbmZvLT5jaGlwd2lkdGggPD0gaW5mby0+cG9ydHdpZHRoOworCQkgICAgIGluZm8tPmNoaXB3aWR0aCA8PD0gMSkgeworCQkJZmxhc2hfd3JpdGVfY21kIChpbmZvLCAwLCAwLCBGTEFTSF9DTURfUkVTRVQpOworCQkJZmxhc2hfd3JpdGVfY21kIChpbmZvLCAwLCBGTEFTSF9PRkZTRVRfQ0ZJLCBGTEFTSF9DTURfQ0ZJKTsKKwkJCWlmIChmbGFzaF9pc2VxdWFsIChpbmZvLCAwLCBGTEFTSF9PRkZTRVRfQ0ZJX1JFU1AsICdRJykKKwkJCSAgICAvL0ZJWE1FOiBOZXh0IDMgbGluZXMgd2VyZSBjaGFuZ2VkIGZvciA4LWJpdC8xNi1iaXQgZmxhc2ggY2hpcHMuCisJCQkgICAgJiYgZmxhc2hfaXNlcXVhbCAoaW5mbywgMCwgRkxBU0hfT0ZGU0VUX0NGSV9SRVNQMSwgJ1InKQorCQkJICAgICYmIGZsYXNoX2lzZXF1YWwgKGluZm8sIDAsIEZMQVNIX09GRlNFVF9DRklfUkVTUDIsICdZJykpIHsKKwkJCQlpbmZvLT5pbnRlcmZhY2UgPSBmbGFzaF9yZWFkX3VjaGFyIChpbmZvLCBGTEFTSF9PRkZTRVRfSU5URVJGQUNFKTsKKwkJCQlkZWJ1ZyAoImRldmljZSBpbnRlcmZhY2UgaXMgJWRcbiIsCisJCQkJICAgICAgIGluZm8tPmludGVyZmFjZSk7CisJCQkJZGVidWcgKCJmb3VuZCBwb3J0ICVkIGNoaXAgJWQgIiwKKwkJCQkgICAgICAgaW5mby0+cG9ydHdpZHRoLCBpbmZvLT5jaGlwd2lkdGgpOworCQkJCWRlYnVnICgicG9ydCAlZCBiaXRzIGNoaXAgJWQgYml0c1xuIiwKKwkJCQkgICAgICAgaW5mby0+cG9ydHdpZHRoIDw8IENGSV9GTEFTSF9TSElGVF9XSURUSCwKKwkJCQkgICAgICAgaW5mby0+Y2hpcHdpZHRoIDw8IENGSV9GTEFTSF9TSElGVF9XSURUSCk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisJZGVidWcgKCJub3QgZm91bmRcbiIpOworCXJldHVybiAwOworfQorCisvKgorICogVGhlIGZvbGxvd2luZyBjb2RlIGNhbm5vdCBiZSBydW4gZnJvbSBGTEFTSCEKKyAqCisgKi8KK3Vsb25nIGZsYXNoX2dldF9zaXplICh1bG9uZyBiYXNlLCBpbnQgYmFua251bSkKK3sKKwlmbGFzaF9pbmZvX3QgKmluZm8gPSAmZmxhc2hfaW5mb1tiYW5rbnVtXTsKKwlpbnQgaSwgajsKKwlmbGFzaF9zZWN0X3Qgc2VjdF9jbnQ7CisJdW5zaWduZWQgbG9uZyBzZWN0b3I7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJaW50IHNpemVfcmF0aW87CisJdWNoYXIgbnVtX2VyYXNlX3JlZ2lvbnM7CisJaW50IGVyYXNlX3JlZ2lvbl9zaXplOworCWludCBlcmFzZV9yZWdpb25fY291bnQ7CisKKwlpbmZvLT5zdGFydFswXSA9IGJhc2U7CisKKwlpZiAoZmxhc2hfZGV0ZWN0X2NmaSAoaW5mbykpIHsKKwkJaW5mby0+dmVuZG9yID0gZmxhc2hfcmVhZF91Y2hhciAoaW5mbywgRkxBU0hfT0ZGU0VUX1BSSU1BUllfVkVORE9SKTsKKyNpZiBkZWZpbmVkKERFQlVHX0ZMQVNIKQorCQlmbGFzaF9wcmludHFyeSAoaW5mbywgMCk7CisjZW5kaWYKKwkJc3dpdGNoIChpbmZvLT52ZW5kb3IpIHsKKwkJY2FzZSBDRklfQ01EU0VUX0lOVEVMX1NUQU5EQVJEOgorCQljYXNlIENGSV9DTURTRVRfSU5URUxfRVhURU5ERUQ6CisJCWRlZmF1bHQ6CisJCQlpbmZvLT5jbWRfcmVzZXQgPSBGTEFTSF9DTURfUkVTRVQ7CisJCQlicmVhazsKKwkJY2FzZSBDRklfQ01EU0VUX0FNRF9TVEFOREFSRDoKKwkJY2FzZSBDRklfQ01EU0VUX0FNRF9FWFRFTkRFRDoKKwkJCWluZm8tPmNtZF9yZXNldCA9IEFNRF9DTURfUkVTRVQ7CisJCQlicmVhazsKKwkJfQorCisJCWRlYnVnWCgyLCAibWFudWZhY3R1cmVyIGlzICVkXG4iLCBpbmZvLT52ZW5kb3IpOworCQlzaXplX3JhdGlvID0gaW5mby0+cG9ydHdpZHRoIC8gaW5mby0+Y2hpcHdpZHRoOworCQkvKiBpZiB0aGUgY2hpcCBpcyB4OC94MTYgcmVkdWNlIHRoZSByYXRpbyBieSBoYWxmICovCisjaWYgMAorCQlpZiAoKGluZm8tPmludGVyZmFjZSA9PSBGTEFTSF9DRklfWDhYMTYpCisJCSAgICAmJiAoaW5mby0+Y2hpcHdpZHRoID09IEZMQVNIX0NGSV9CWTgpKSB7CisJCQlzaXplX3JhdGlvID4+PSAxOworCQl9CisjZW5kaWYKKwkJbnVtX2VyYXNlX3JlZ2lvbnMgPSBmbGFzaF9yZWFkX3VjaGFyIChpbmZvLCBGTEFTSF9PRkZTRVRfTlVNX0VSQVNFX1JFR0lPTlMpOworCQlkZWJ1Z1goMiwgInNpemVfcmF0aW8gJWQgcG9ydCAlZCBiaXRzIGNoaXAgJWQgYml0c1xuIiwKKwkJICAgICAgIHNpemVfcmF0aW8sIGluZm8tPnBvcnR3aWR0aCA8PCBDRklfRkxBU0hfU0hJRlRfV0lEVEgsCisJCSAgICAgICBpbmZvLT5jaGlwd2lkdGggPDwgQ0ZJX0ZMQVNIX1NISUZUX1dJRFRIKTsKKwkJZGVidWdYKDIsICJmb3VuZCAlZCBlcmFzZSByZWdpb25zXG4iLCBudW1fZXJhc2VfcmVnaW9ucyk7CisJCXNlY3RfY250ID0gMDsKKwkJc2VjdG9yID0gYmFzZTsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9lcmFzZV9yZWdpb25zOyBpKyspIHsKKwkJCWlmIChpID4gTUFYX05VTV9FUkFTRV9SRUdJT05TKSB7CisJCQkJcHJpbnRmICgiJWQgZXJhc2UgcmVnaW9ucyBmb3VuZCwgb25seSAlZCB1c2VkXG4iLAorCQkJCQludW1fZXJhc2VfcmVnaW9ucywgTUFYX05VTV9FUkFTRV9SRUdJT05TKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8vIENGSSBFcmFzZSBCbG9jayBSZWdpb24gSW5mb3JtYXRpb246CisJCQkvLyBCaXRzWzMxOjE2XSA9IHNlY3Rfc2l6ZS8yNTYsIDAgbWVhbnMgMTI4LWJ5dGUKKwkJCS8vIEJpdHNbMTU6MF0gID0gbnVtX3NlY3RvcnMgLSAxCisJCQl0bXAgPSBmbGFzaF9yZWFkX2xvbmcoaW5mbywgMCwKKwkJCQkJICAgICAgRkxBU0hfT0ZGU0VUX0VSQVNFX1JFR0lPTlMgKyBpICogNCk7CisJCQlkZWJ1ZygiQ0ZJIGVyYXNlIGJsb2NrIHJlZ2lvbiBpbmZvWyVkXTogMHglMDh4LCAiLAorCQkJICAgICAgaSwgdG1wKTsKKwkJCWVyYXNlX3JlZ2lvbl9jb3VudCA9ICh0bXAgJiAweGZmZmYpICsgMTsKKwkJCXRtcCA+Pj0gMTY7CisJCQllcmFzZV9yZWdpb25fc2l6ZSA9ICh0bXAgPyB0bXAgKiAyNTYgOiAxMjgpOworCQkJZGVidWcgKCJlcmFzZV9yZWdpb25fY291bnQ9JWQgZXJhc2VfcmVnaW9uX3NpemU9JWRcbiIsCisJCQkJZXJhc2VfcmVnaW9uX2NvdW50LCBlcmFzZV9yZWdpb25fc2l6ZSk7CisjaWYgMAorICAgICAgICAgICAgICAgICAgICAgICAgZXJhc2VfcmVnaW9uX3NpemUgID0gQ0ZHX0ZMQVNIX1NFQ1RPUl9TSVpFOwkvLyBDb21tZW50ZWQgb3V0CisgICAgICAgICAgICAgICAgICAgICAgICBlcmFzZV9yZWdpb25fY291bnQgPSBDRkdfRkxBU0hfU0VDVE9SX0NPVU5UOwkvLyBDb21tZW50ZWQgb3V0CisjZW5kaWYKKwkJCWlmIChzZWN0X2NudCArIGVyYXNlX3JlZ2lvbl9jb3VudCA+IENPTkZJR19TWVNfTUFYX0ZMQVNIX1NFQ1QpIHsKKwkJCSAgICBwcmludGYoIldhcm5pbmc6IEVyYXNlIHJlZ2lvbiAlZCBhZGRzIHRvbyBtYW55IGZsYXNoIHNlY3RvcnMiCisJCQkJICAgIiAlZCslZDsgcmVkdWNpbmcgdG8gZml0IHRvdGFsIGxpbWl0IG9mICVkXG4iLAorCQkJCSAgIGksIHNlY3RfY250LCBlcmFzZV9yZWdpb25fY291bnQsIENPTkZJR19TWVNfTUFYX0ZMQVNIX1NFQ1QpOworCQkJICAgIGVyYXNlX3JlZ2lvbl9jb3VudCA9IENPTkZJR19TWVNfTUFYX0ZMQVNIX1NFQ1QgLSBzZWN0X2NudDsKKwkJCX0KKwkJCWZvciAoaiA9IDA7IGogPCBlcmFzZV9yZWdpb25fY291bnQ7IGorKykgeworCQkJCWluZm8tPnN0YXJ0W3NlY3RfY250XSA9IHNlY3RvcjsKKwkJCQlzZWN0b3IgKz0gKGVyYXNlX3JlZ2lvbl9zaXplICogc2l6ZV9yYXRpbyk7CisKKwkJCQkvKgorCQkJCSAqIE9ubHkgcmVhZCBwcm90ZWN0aW9uIHN0YXR1cyBmcm9tIHN1cHBvcnRlZCBkZXZpY2VzIChpbnRlbC4uLikKKwkJCQkgKi8KKwkJCQlzd2l0Y2ggKGluZm8tPnZlbmRvcikgeworCQkJCWNhc2UgQ0ZJX0NNRFNFVF9JTlRFTF9FWFRFTkRFRDoKKwkJCQljYXNlIENGSV9DTURTRVRfSU5URUxfU1RBTkRBUkQ6CisJCQkJCWluZm8tPnByb3RlY3Rbc2VjdF9jbnRdID0KKwkJCQkJCWZsYXNoX2lzc2V0IChpbmZvLCBzZWN0X2NudCwKKwkJCQkJCQkgICAgIEZMQVNIX09GRlNFVF9QUk9URUNULAorCQkJCQkJCSAgICAgRkxBU0hfU1RBVFVTX1BST1RFQ1QpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlpbmZvLT5wcm90ZWN0W3NlY3RfY250XSA9IDA7IC8qIGRlZmF1bHQ6IG5vdCBwcm90ZWN0ZWQgKi8KKwkJCQl9CisKKwkJCQlzZWN0X2NudCsrOworCQkJfQorCQl9CisKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gc2VjdF9jbnQ7CisJCS8qIG11bHRpcGx5IHRoZSBzaXplIGJ5IHRoZSBudW1iZXIgb2YgY2hpcHMgKi8KKwkJLy8gaW5mby0+c2l6ZSA9ICgxIDw8IGZsYXNoX3JlYWRfdWNoYXIgKGluZm8sIEZMQVNIX09GRlNFVF9TSVpFKSkgKiBzaXplX3JhdGlvOworCQkvLyBVc2Ugb25seSB0aGUgc2VjdG9ycyB0aGF0IGZpdCB3aXRoaW4gdGhlIGZsYXNoX2luZm8gYXJyYXkgc2l6ZS4KKwkJaW5mby0+c2l6ZSA9IHNlY3RvciAtIGJhc2U7CisJCXByaW50ZigiRmxhc2ggYmFuayAlZCBhdCAlMDh4IGhhcyAweCV4IGJ5dGVzIGluICVkIHNlY3RvcnMiCisJCSAgICAgICAiIChjaGlwU2l6ZSAxPDwlZCwgc2l6ZV9yYXRpbyAlZCkuXG4iLAorCQkgICAgICAgYmFua251bSwgYmFzZSwgaW5mby0+c2l6ZSwgaW5mby0+c2VjdG9yX2NvdW50LAorCQkgICAgICAgZmxhc2hfcmVhZF91Y2hhcihpbmZvLCBGTEFTSF9PRkZTRVRfU0laRSksIHNpemVfcmF0aW8pOworCisJCWluZm8tPmJ1ZmZlcl9zaXplID0gKDEgPDwgZmxhc2hfcmVhZF91Y2hhciAoaW5mbywgRkxBU0hfT0ZGU0VUX0JVRkZFUl9TSVpFKSk7CQkKKwkJLyogTGltaXQgdGhlIGJ1ZmZlciBzaXplIHRvIDMyYnl0ZXMgdG8gbWVldCBtb3N0IG9mIEFNRC1zdHlsZXMgZmxhc2gncyBtaW5pbXVtIHJlcXVpcmVtZW50ICovCisJCWlmIChpbmZvLT5idWZmZXJfc2l6ZSA+IDMyKQorCQkgICAgaW5mby0+YnVmZmVyX3NpemUgPSAzMjsgICAgCisJCXRtcCA9IDEgPDwgZmxhc2hfcmVhZF91Y2hhciAoaW5mbywgRkxBU0hfT0ZGU0VUX0VUT1VUKTsKKwkJaW5mby0+ZXJhc2VfYmxrX3RvdXQgPSAodG1wICogKDEgPDwgZmxhc2hfcmVhZF91Y2hhciAoaW5mbywgRkxBU0hfT0ZGU0VUX0VNQVhfVE9VVCkpKTsKKwkJdG1wID0gMSA8PCBmbGFzaF9yZWFkX3VjaGFyIChpbmZvLCBGTEFTSF9PRkZTRVRfV0JUT1VUKTsKKwkJaW5mby0+YnVmZmVyX3dyaXRlX3RvdXQgPSAodG1wICogKDEgPDwgZmxhc2hfcmVhZF91Y2hhciAoaW5mbywgRkxBU0hfT0ZGU0VUX1dCTUFYX1RPVVQpKSk7CisJCXRtcCA9IDEgPDwgZmxhc2hfcmVhZF91Y2hhciAoaW5mbywgRkxBU0hfT0ZGU0VUX1dUT1VUKTsKKwkJaW5mby0+d3JpdGVfdG91dCA9ICh0bXAgKiAoMSA8PCBmbGFzaF9yZWFkX3VjaGFyIChpbmZvLCBGTEFTSF9PRkZTRVRfV01BWF9UT1VUKSkpIC8gMTAwMDsKKwkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9NQU5fQ0ZJOworI2lmIDAKKwkJaWYgKChpbmZvLT5pbnRlcmZhY2UgPT0gRkxBU0hfQ0ZJX1g4WDE2KSAmJiAoaW5mby0+Y2hpcHdpZHRoID09IEZMQVNIX0NGSV9CWTgpKSB7CisJCQlpbmZvLT5wb3J0d2lkdGggPj49IDE7CS8qIFhYWCAtIE5lZWQgdG8gdGVzdCBvbiB4OC94MTYgaW4gcGFyYWxsZWwuICovCisJCX0KKyNlbmRpZgorCX0KKworCWZsYXNoX3dyaXRlX2NtZCAoaW5mbywgMCwgMCwgaW5mby0+Y21kX3Jlc2V0KTsKKwlyZXR1cm4gKGluZm8tPnNpemUpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCBmbGFzaF93cml0ZV9jZml3b3JkIChmbGFzaF9pbmZvX3QgKiBpbmZvLCB1bG9uZyBkZXN0LAorCQkJCWNmaXdvcmRfdCBjd29yZCkKK3sKKworCWNmaXB0cl90IGN0bGFkZHI7CisJY2ZpcHRyX3QgY3B0cjsKKwlpbnQgZmxhZzsKKworCWN0bGFkZHIuY3AgPSBmbGFzaF9tYWtlX2FkZHIgKGluZm8sIDAsIDApOworCWNwdHIuY3AgPSAodWNoYXIgKikgZGVzdDsKKworCisJLyogQ2hlY2sgaWYgRmxhc2ggaXMgKHN1ZmZpY2llbnRseSkgZXJhc2VkICovCisJc3dpdGNoIChpbmZvLT5wb3J0d2lkdGgpIHsKKwljYXNlIEZMQVNIX0NGSV84QklUOgorCQlmbGFnID0gKChjcHRyLmNwWzBdICYgY3dvcmQuYykgPT0gY3dvcmQuYyk7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfQ0ZJXzE2QklUOgorCQlmbGFnID0gKChjcHRyLndwWzBdICYgY3dvcmQudykgPT0gY3dvcmQudyk7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfQ0ZJXzMyQklUOgorCQlmbGFnID0gKChjcHRyLmxwWzBdICYgY3dvcmQubCkgPT0gY3dvcmQubCk7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfQ0ZJXzY0QklUOgorCQlmbGFnID0gKChjcHRyLmxscFswXSAmIGN3b3JkLmxsKSA9PSBjd29yZC5sbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAyOworCX0KKwlpZiAoIWZsYWcpCisJCXJldHVybiAyOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWNoIG1pZ2h0IGNhdXNlIGEgdGltZW91dCBoZXJlICovCisJZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cyAoKTsKKworCXN3aXRjaCAoaW5mby0+dmVuZG9yKSB7CisJY2FzZSBDRklfQ01EU0VUX0lOVEVMX0VYVEVOREVEOgorCWNhc2UgQ0ZJX0NNRFNFVF9JTlRFTF9TVEFOREFSRDoKKwkJZmxhc2hfd3JpdGVfY21kX25vZGJnIChpbmZvLCAwLCAwLCBGTEFTSF9DTURfQ0xFQVJfU1RBVFVTKTsKKwkJZmxhc2hfd3JpdGVfY21kX25vZGJnIChpbmZvLCAwLCAwLCBGTEFTSF9DTURfV1JJVEUpOworCQlicmVhazsKKwljYXNlIENGSV9DTURTRVRfQU1EX0VYVEVOREVEOgorCWNhc2UgQ0ZJX0NNRFNFVF9BTURfU1RBTkRBUkQ6CisJCWZsYXNoX3VubG9ja19zZXEgKGluZm8sIDApOworCQlmbGFzaF93cml0ZV9jbWRfbm9kYmcgKGluZm8sIDAsIEFNRF9BRERSX1NUQVJULCBBTURfQ01EX1dSSVRFKTsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChpbmZvLT5wb3J0d2lkdGgpIHsKKwljYXNlIEZMQVNIX0NGSV84QklUOgorCQljcHRyLmNwWzBdID0gY3dvcmQuYzsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9DRklfMTZCSVQ6CisJCWNwdHIud3BbMF0gPSBjd29yZC53OworCQlicmVhazsKKwljYXNlIEZMQVNIX0NGSV8zMkJJVDoKKwkJY3B0ci5scFswXSA9IGN3b3JkLmw7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfQ0ZJXzY0QklUOgorCQljcHRyLmxscFswXSA9IGN3b3JkLmxsOworCQlicmVhazsKKwl9CisKKwkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoZmxhZykKKwkJZW5hYmxlX2ludGVycnVwdHMgKCk7CisKKwlyZXR1cm4gZmxhc2hfZnVsbF9zdGF0dXNfY2hlY2sgKGluZm8sIDAsIGluZm8tPndyaXRlX3RvdXQsICJ3cml0ZSIpOworfQorCisjaWZkZWYgQ09ORklHX1NZU19GTEFTSF9VU0VfQlVGRkVSX1dSSVRFCisKKy8qIGxvb3AgdGhyb3VnaCB0aGUgc2VjdG9ycyBmcm9tIHRoZSBoaWdoZXN0IGFkZHJlc3MKKyAqIHdoZW4gdGhlIHBhc3NlZCBhZGRyZXNzIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIHNlY3RvciBhZGRyZXNzCisgKiB3ZSBoYXZlIGEgbWF0Y2gKKyAqLworc3RhdGljIGZsYXNoX3NlY3RfdCBmaW5kX3NlY3RvciAoZmxhc2hfaW5mb190ICogaW5mbywgdWxvbmcgYWRkcikKK3sKKwlmbGFzaF9zZWN0X3Qgc2VjdG9yOworCisJZm9yIChzZWN0b3IgPSBpbmZvLT5zZWN0b3JfY291bnQgLSAxOyBzZWN0b3IgPj0gMDsgc2VjdG9yLS0pIHsKKwkJaWYgKGFkZHIgPj0gaW5mby0+c3RhcnRbc2VjdG9yXSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gc2VjdG9yOworfQorCitzdGF0aWMgaW50IGZsYXNoX3dyaXRlX2NmaWJ1ZmZlciAoZmxhc2hfaW5mb190ICogaW5mbywgdWxvbmcgZGVzdCwgdWNoYXIgKiBjcCwKKwkJCQkgIGludCBsZW4pCit7CisJZmxhc2hfc2VjdF90IHNlY3RvcjsKKwlpbnQgY250OworCWludCByZXRjb2RlOworCXZvbGF0aWxlIGNmaXB0cl90IHNyYzsKKwl2b2xhdGlsZSBjZmlwdHJfdCBkc3Q7CisKKy8qIEFkZCBBTUQgd3JpdGUgYnVmZmVyIG1vZGUgc3VwcG9ydCwgeWNjaGVuQDEwMjAwNiAqLworI2lmIDAKKwkvKiBidWZmZXJlZCB3cml0ZXMgaW4gdGhlIEFNRCBjaGlwIHNldCBpcyBub3Qgc3VwcG9ydGVkIHlldCAqLworCWlmKChpbmZvLT52ZW5kb3IgPT0gIENGSV9DTURTRVRfQU1EX1NUQU5EQVJEKSB8fAorCQkoaW5mby0+dmVuZG9yID09IENGSV9DTURTRVRfQU1EX0VYVEVOREVEKSkKKwkJcmV0dXJuIEVSUl9JTlZBTDsKKyNlbmRpZgorCWlmKChpbmZvLT52ZW5kb3IgPT0gIENGSV9DTURTRVRfQU1EX1NUQU5EQVJEKSB8fAorCQkoaW5mby0+dmVuZG9yID09IENGSV9DTURTRVRfQU1EX0VYVEVOREVEKSkKKwl7CisJCXJldGNvZGUgPSBmbGFzaF93cml0ZV9jZmlidWZmZXJfYW1kKGluZm8sIGRlc3QsIGNwLCBsZW4pOworICAgICAgICAgICAgICAgIHJldHVybiByZXRjb2RlOworICAgICAgICB9CisKKwlzcmMuY3AgPSBjcDsKKwlkc3QuY3AgPSAodWNoYXIgKikgZGVzdDsKKwlzZWN0b3IgPSBmaW5kX3NlY3RvciAoaW5mbywgZGVzdCk7CisJZmxhc2hfd3JpdGVfY21kIChpbmZvLCBzZWN0b3IsIDAsIEZMQVNIX0NNRF9DTEVBUl9TVEFUVVMpOworCWZsYXNoX3dyaXRlX2NtZCAoaW5mbywgc2VjdG9yLCAwLCBGTEFTSF9DTURfV1JJVEVfVE9fQlVGRkVSKTsKKwlpZiAoKHJldGNvZGUgPQorCSAgICAgZmxhc2hfc3RhdHVzX2NoZWNrIChpbmZvLCBzZWN0b3IsIGluZm8tPmJ1ZmZlcl93cml0ZV90b3V0LAorCQkJCSAid3JpdGUgdG8gYnVmZmVyIikpID09IEVSUl9PSykgeworCQkvKiByZWR1Y2UgdGhlIG51bWJlciBvZiBsb29wcyBieSB0aGUgd2lkdGggb2YgdGhlIHBvcnQJKi8KKwkJc3dpdGNoIChpbmZvLT5wb3J0d2lkdGgpIHsKKwkJY2FzZSBGTEFTSF9DRklfOEJJVDoKKwkJCWNudCA9IGxlbjsKKwkJCWJyZWFrOworCQljYXNlIEZMQVNIX0NGSV8xNkJJVDoKKwkJCWNudCA9IGxlbiA+PiAxOworCQkJYnJlYWs7CisJCWNhc2UgRkxBU0hfQ0ZJXzMyQklUOgorCQkJY250ID0gbGVuID4+IDI7CisJCQlicmVhazsKKwkJY2FzZSBGTEFTSF9DRklfNjRCSVQ6CisJCQljbnQgPSBsZW4gPj4gMzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIEVSUl9JTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWZsYXNoX3dyaXRlX2NtZCAoaW5mbywgc2VjdG9yLCAwLCAodWNoYXIpIGNudCAtIDEpOworCQl3aGlsZSAoY250LS0gPiAwKSB7CisJCQlzd2l0Y2ggKGluZm8tPnBvcnR3aWR0aCkgeworCQkJY2FzZSBGTEFTSF9DRklfOEJJVDoKKwkJCQkqZHN0LmNwKysgPSAqc3JjLmNwKys7CisJCQkJYnJlYWs7CisJCQljYXNlIEZMQVNIX0NGSV8xNkJJVDoKKwkJCQkqZHN0LndwKysgPSAqc3JjLndwKys7CisJCQkJYnJlYWs7CisJCQljYXNlIEZMQVNIX0NGSV8zMkJJVDoKKwkJCQkqZHN0LmxwKysgPSAqc3JjLmxwKys7CisJCQkJYnJlYWs7CisJCQljYXNlIEZMQVNIX0NGSV82NEJJVDoKKwkJCQkqZHN0LmxscCsrID0gKnNyYy5sbHArKzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIEVSUl9JTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3RvciwgMCwKKwkJCQkgRkxBU0hfQ01EX1dSSVRFX0JVRkZFUl9DT05GSVJNKTsKKwkJcmV0Y29kZSA9CisJCQlmbGFzaF9mdWxsX3N0YXR1c19jaGVjayAoaW5mbywgc2VjdG9yLAorCQkJCQkJIGluZm8tPmJ1ZmZlcl93cml0ZV90b3V0LAorCQkJCQkJICJidWZmZXIgd3JpdGUiKTsKKwl9CisJZmxhc2hfd3JpdGVfY21kIChpbmZvLCBzZWN0b3IsIDAsIEZMQVNIX0NNRF9DTEVBUl9TVEFUVVMpOworCXJldHVybiByZXRjb2RlOworfQorCisKK3N0YXRpYyBpbnQgZmxhc2hfd3JpdGVfY2ZpYnVmZmVyX2FtZCAoZmxhc2hfaW5mb190ICogaW5mbywgdWxvbmcgZGVzdCwgdWNoYXIgKiBjcCwKKwkJCQkgIGludCBsZW4pCit7CisJZmxhc2hfc2VjdF90IHNlY3RvcjsKKwlpbnQgY250OworCWludCByZXRjb2RlOworCXZvbGF0aWxlIGNmaXB0cl90IHNyYzsKKwl2b2xhdGlsZSBjZmlwdHJfdCBkc3Q7CisJdm9sYXRpbGUgY2Zpd29yZF90IHRtcHNyYywgdG1wZHN0OworCisJc3JjLmNwID0gY3A7CisJZHN0LmNwID0gKHVjaGFyICopIGRlc3Q7CisJc2VjdG9yID0gZmluZF9zZWN0b3IgKGluZm8sIGRlc3QpOworCWZsYXNoX3VubG9ja19zZXEgKGluZm8sIDApOworCWlmICgocmV0Y29kZSA9CisJICAgICBmbGFzaF9zdGF0dXNfY2hlY2sgKGluZm8sIHNlY3RvciwgaW5mby0+YnVmZmVyX3dyaXRlX3RvdXQsCisJCQkJICJ3cml0ZSB0byBidWZmZXIiKSkgPT0gRVJSX09LKSB7CisJCS8qIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGxvb3BzIGJ5IHRoZSB3aWR0aCBvZiB0aGUgcG9ydAkqLworCQlzd2l0Y2ggKGluZm8tPnBvcnR3aWR0aCkgeworCQljYXNlIEZMQVNIX0NGSV84QklUOgorCQkJY250ID0gbGVuOworCQkJKmRzdC5jcCA9ICh1Y2hhcikgKEFNRF9DTURfV1JJVEVfVE9fQlVGRkVSKTsKKwkJCSpkc3QuY3AgPSAodWNoYXIpIChjbnQgLTEpOworCQkJYnJlYWs7CisJCWNhc2UgRkxBU0hfQ0ZJXzE2QklUOgorCQkJY250ID0gbGVuID4+IDE7CisJCQkqZHN0LndwID0gKHVuc2lnbmVkIHNob3J0KSAoQU1EX0NNRF9XUklURV9UT19CVUZGRVIpOworCQkJKmRzdC53cCA9ICh1bnNpZ25lZCBzaG9ydCkgKGNudCAtMSk7CisJCQlicmVhazsKKwkJY2FzZSBGTEFTSF9DRklfMzJCSVQ6CisJCQljbnQgPSBsZW4gPj4gMjsKKwkJCSpkc3QubHAgPSAodW5zaWduZWQgbG9uZykgKEFNRF9DTURfV1JJVEVfVE9fQlVGRkVSKTsKKwkJCSpkc3QubHAgPSAodW5zaWduZWQgbG9uZykgKGNudCAtMSk7CisJCQlicmVhazsKKwkJY2FzZSBGTEFTSF9DRklfNjRCSVQ6CisJCQljbnQgPSBsZW4gPj4gMzsKKwkJCSpkc3QubGxwID0gKHVuc2lnbmVkIGxvbmcgbG9uZykgKEFNRF9DTURfV1JJVEVfVE9fQlVGRkVSKTsKKwkJCSpkc3QubGxwID0gKHVuc2lnbmVkIGxvbmcgbG9uZykgKGNudCAtMSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBFUlJfSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQl3aGlsZSAoY250LS0gPiAwKSB7CisJCQlzd2l0Y2ggKGluZm8tPnBvcnR3aWR0aCkgeworCQkJY2FzZSBGTEFTSF9DRklfOEJJVDoKKwkJCQkqZHN0LmNwKysgPSAqc3JjLmNwKys7CisJCQkJYnJlYWs7CisJCQljYXNlIEZMQVNIX0NGSV8xNkJJVDoKKwkJCQkqZHN0LndwKysgPSAqc3JjLndwKys7CisJCQkJYnJlYWs7CisJCQljYXNlIEZMQVNIX0NGSV8zMkJJVDoKKwkJCQkqZHN0LmxwKysgPSAqc3JjLmxwKys7CisJCQkJYnJlYWs7CisJCQljYXNlIEZMQVNIX0NGSV82NEJJVDoKKwkJCQkqZHN0LmxscCsrID0gKnNyYy5sbHArKzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIEVSUl9JTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQkJCQkKKwkJc3dpdGNoIChpbmZvLT5wb3J0d2lkdGgpIHsKKwkJY2FzZSBGTEFTSF9DRklfOEJJVDoKKwkJICAgICAgICBzcmMuY3AtLTsKKwkJICAgICAgICBkc3QuY3AtLTsKKwkJCSpkc3QuY3AgPSAodW5zaWduZWQgY2hhcikgKEFNRF9DTURfQlVGRkVSX1RPX0ZMQVNIKTsKKwkJICAgICAgICB0bXBzcmMuYyA9ICpzcmMuY3AgJiAweDgwOworCQkgICAgICAgIAorCQkgICAgICAgIGRvIHsKKwkJICAgICAgICAgICAgdG1wZHN0LmMgPSAqKHZvbGF0aWxlIHVjaGFyICopKGRzdC5jcCk7CQkgICAgICAgIAorCQkgICAgICAgIAkKKwkJICAgICAgICAgICAgaWYgKHRtcGRzdC5jICYgMHgyMCkgewkvKiB0b2dnbGUgRFE1ICovCisJCSAgICAgICAgICAgICAgICAgdG1wZHN0LmMgPSAqKHZvbGF0aWxlIHVjaGFyICopKGRzdC5jcCk7CQkgICAgICAgIAorCQkgICAgICAgICAgICAgICAgIGlmICgodG1wZHN0LmMgJiAweDgwKSAhPSB0bXBzcmMuYykKKwkJICAgICAgICAgICAgICAgICB7CisJCSAgICAgICAgICAgICAgICAgICAgIHByaW50ZigicHJvZ3JhbSBlcnJvciBvY2N1cnJlZFxuIik7CisJCQkgICAgICAgICAgICAgZmxhc2hfd3JpdGVfY21kIChpbmZvLCBzZWN0b3IsIDAsIGluZm8tPmNtZF9yZXNldCk7CQkgICAgICAgICAgICAKKwkJCSAgICAgICAgICAgICByZXR1cm4gRVJSX1BST0dfRVJST1I7CQkJICAgICAgICAgICAgIAorCQkJICAgICAgICAgfSAgICAKKwkJICAgICAgICAgICAgfQorCQkgICAgICAgICAgICBlbHNlIGlmICh0bXBkc3QuYyAmIDB4MDIpIHsJLyogdG9nZ2xlIERRMSAqLworCQkgICAgICAgICAgICAgICAgIHRtcGRzdC5jID0gKih2b2xhdGlsZSB1Y2hhciAqKShkc3QuY3ApOwkJICAgICAgICAKKwkJICAgICAgICAgICAgICAgICBpZiAoKHRtcGRzdC5jICYgMHg4MCkgIT0gdG1wc3JjLmMpCisJCSAgICAgICAgICAgICAgICAgeworCQkgICAgICAgICAgICAgICAgICAgICBwcmludGYoIndyaXRlIGJ1ZmZlciBlcnJvciBvY2N1cnJlZCBcbiIpOworCQkgICAgICAgICAgICAgICAgICAgICB3cml0ZV9idWZmZXJfYWJvcnRfcmVzZXQoaW5mbywgc2VjdG9yKTsKKwkJCSAgICAgICAgICAgICByZXR1cm4gRVJSX1BST0dfRVJST1I7CQkJICAgICAgICAgICAgIAorCQkJICAgICAgICAgfSAJCSAgICAgICAgICAgIAorCQkgICAgICAgICAgICB9CQorCQkgICAgICAgICAgICAJCSAgICAgICAgICAgICAgICAJCisJCSAgICAgICAgfSB3aGlsZSAoKHRtcGRzdC5jICYgMHg4MCkgIT0gdG1wc3JjLmMpOworCQkgICAgICAgIAkJCSAgICAgICAgCisJCQlicmVhazsKKwkJY2FzZSBGTEFTSF9DRklfMTZCSVQ6CisJCSAgICAgICAgc3JjLndwLS07CisJCSAgICAgICAgZHN0LndwLS07CisJCQkqZHN0LndwID0gKHVuc2lnbmVkIHNob3J0KSAoQU1EX0NNRF9CVUZGRVJfVE9fRkxBU0gpOworCQkgICAgICAgIHRtcHNyYy53ID0gKnNyYy53cCAmIDB4ODA7CisKKwkJICAgICAgICBkbyB7CisJCSAgICAgICAgICAgIHRtcGRzdC53ID0gKih2b2xhdGlsZSBzaG9ydCAqKShkc3Qud3ApOwkJICAgICAgICAKKwkJICAgICAgICAJCisJCSAgICAgICAgICAgIGlmICh0bXBkc3QudyAmIDB4MjApIHsJLyogdG9nZ2xlIERRNSAqLworCQkgICAgICAgICAgICAgICAgIHRtcGRzdC53ID0gKih2b2xhdGlsZSB1c2hvcnQgKikoZHN0LndwKTsJCSAgICAgICAgCisJCSAgICAgICAgICAgICAgICAgaWYgKCh0bXBkc3QudyAmIDB4ODApICE9IHRtcHNyYy53KQorCQkgICAgICAgICAgICAgICAgIHsKKwkJICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJwcm9ncmFtIGVycm9yIG9jY3VycmVkXG4iKTsKKwkJCSAgICAgICAgICAgICBmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3RvciwgMCwgaW5mby0+Y21kX3Jlc2V0KTsJCSAgICAgICAgICAgIAorCQkJICAgICAgICAgICAgIHJldHVybiBFUlJfUFJPR19FUlJPUjsJCQkgICAgICAgICAgICAgCisJCQkgICAgICAgICB9ICAgIAorCQkgICAgICAgICAgICB9CisJCSAgICAgICAgICAgIGVsc2UgaWYgKHRtcGRzdC53ICYgMHgwMikgewkvKiB0b2dnbGUgRFExICovCisJCSAgICAgICAgICAgICAgICAgdG1wZHN0LncgPSAqKHZvbGF0aWxlIHVzaG9ydCAqKShkc3Qud3ApOwkJICAgICAgICAKKwkJICAgICAgICAgICAgICAgICBpZiAoKHRtcGRzdC53ICYgMHg4MCkgIT0gdG1wc3JjLncpCisJCSAgICAgICAgICAgICAgICAgeworCQkgICAgICAgICAgICAgICAgICAgICBwcmludGYoIndyaXRlIGJ1ZmZlciBlcnJvciBvY2N1cnJlZCBcbiIpOworCQkgICAgICAgICAgICAgICAgICAgICB3cml0ZV9idWZmZXJfYWJvcnRfcmVzZXQoaW5mbywgc2VjdG9yKTsKKwkJCSAgICAgICAgICAgICByZXR1cm4gRVJSX1BST0dfRVJST1I7CQkJICAgICAgICAgICAgIAorCQkJICAgICAgICAgfSAJCSAgICAgICAgICAgIAorCQkgICAgICAgICAgICB9CQorCQkgICAgICAgICAgICAJCSAgICAgICAgICAgICAgICAJCisJCSAgICAgICAgfSB3aGlsZSAoKHRtcGRzdC53ICYgMHg4MCkgIT0gdG1wc3JjLncpOworCQkgICAgICAgIAorCQkJYnJlYWs7CisJCWNhc2UgRkxBU0hfQ0ZJXzMyQklUOgorCQkgICAgICAgIHNyYy5scC0tOworCQkgICAgICAgIGRzdC5scC0tOworCQkJKmRzdC5scCA9ICh1bnNpZ25lZCBsb25nKSAoQU1EX0NNRF9CVUZGRVJfVE9fRkxBU0gpOworCQkgICAgICAgIHRtcHNyYy5sID0gKnNyYy5scCAmIDB4ODA7CisJCSAgICAgICAgCisJCSAgICAgICAgZG8geworCQkgICAgICAgICAgICB0bXBkc3QubCA9ICoodm9sYXRpbGUgdWxvbmcgKikoZHN0LmxwKTsJCSAgICAgICAgCisJCSAgICAgICAgCQorCQkgICAgICAgICAgICBpZiAodG1wZHN0LmwgJiAweDIwKSB7CS8qIHRvZ2dsZSBEUTUgKi8KKwkJICAgICAgICAgICAgICAgICB0bXBkc3QubCA9ICoodm9sYXRpbGUgdWxvbmcgKikoZHN0LmxwKTsJCSAgICAgICAgCisJCSAgICAgICAgICAgICAgICAgaWYgKCh0bXBkc3QubCAmIDB4ODApICE9IHRtcHNyYy5sKQorCQkgICAgICAgICAgICAgICAgIHsKKwkJICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJwcm9ncmFtIGVycm9yIG9jY3VycmVkXG4iKTsKKwkJCSAgICAgICAgICAgICBmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3RvciwgMCwgaW5mby0+Y21kX3Jlc2V0KTsJCSAgICAgICAgICAgIAorCQkJICAgICAgICAgICAgIHJldHVybiBFUlJfUFJPR19FUlJPUjsJCQkgICAgICAgICAgICAgCisJCQkgICAgICAgICB9ICAgIAorCQkgICAgICAgICAgICB9CisJCSAgICAgICAgICAgIGVsc2UgaWYgKHRtcGRzdC5sICYgMHgwMikgewkvKiB0b2dnbGUgRFExICovCisJCSAgICAgICAgICAgICAgICAgdG1wZHN0LmwgPSAqKHZvbGF0aWxlIHVsb25nICopKGRzdC5scCk7CQkgICAgICAgIAorCQkgICAgICAgICAgICAgICAgIGlmICgodG1wZHN0LmwgJiAweDgwKSAhPSB0bXBzcmMubCkKKwkJICAgICAgICAgICAgICAgICB7CisJCSAgICAgICAgICAgICAgICAgICAgIHByaW50Zigid3JpdGUgYnVmZmVyIGVycm9yIG9jY3VycmVkIFxuIik7CisJCSAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2J1ZmZlcl9hYm9ydF9yZXNldChpbmZvLCBzZWN0b3IpOworCQkJICAgICAgICAgICAgIHJldHVybiBFUlJfUFJPR19FUlJPUjsJCQkgICAgICAgICAgICAgCisJCQkgICAgICAgICB9IAkJICAgICAgICAgICAgCisJCSAgICAgICAgICAgIH0JCisJCSAgICAgICAgICAgIAkJICAgICAgICAgICAgICAgIAkKKwkJICAgICAgICB9IHdoaWxlICgodG1wZHN0LmwgJiAweDgwKSAhPSB0bXBzcmMubCk7CisJCSAgICAgICAgCisJCQlicmVhazsKKwkJY2FzZSBGTEFTSF9DRklfNjRCSVQ6CisJCSAgICAgICAgc3JjLmxscC0tOworCQkgICAgICAgIGRzdC5sbHAtLTsKKwkJCSpkc3QubGxwID0gKHVuc2lnbmVkIGxvbmcgbG9uZykgKEFNRF9DTURfQlVGRkVSX1RPX0ZMQVNIKTsKKwkJICAgICAgICB0bXBzcmMubGwgPSAqc3JjLmxscCAmIDB4ODA7CisJCSAgICAgICAgCisJCSAgICAgICAgZG8geworCQkgICAgICAgICAgICB0bXBkc3QubGwgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbG9uZyAqKShkc3QubGxwKTsJCSAgICAgICAgCisJCSAgICAgICAgCQorCQkgICAgICAgICAgICBpZiAodG1wZHN0LmxsICYgMHgyMCkgewkvKiB0b2dnbGUgRFE1ICovCisJCSAgICAgICAgICAgICAgICAgdG1wZHN0LmxsID0gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGxvbmcgKikoZHN0LmxscCk7CQkgICAgICAgIAorCQkgICAgICAgICAgICAgICAgIGlmICgodG1wZHN0LmxsICYgMHg4MCkgIT0gdG1wc3JjLmxsKQorCQkgICAgICAgICAgICAgICAgIHsKKwkJICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJwcm9ncmFtIGVycm9yIG9jY3VycmVkXG4iKTsKKwkJCSAgICAgICAgICAgICBmbGFzaF93cml0ZV9jbWQgKGluZm8sIHNlY3RvciwgMCwgaW5mby0+Y21kX3Jlc2V0KTsJCSAgICAgICAgICAgIAorCQkJICAgICAgICAgICAgIHJldHVybiBFUlJfUFJPR19FUlJPUjsJCQkgICAgICAgICAgICAgCisJCQkgICAgICAgICB9ICAgIAorCQkgICAgICAgICAgICB9CisJCSAgICAgICAgICAgIGVsc2UgaWYgKHRtcGRzdC5sbCAmIDB4MDIpIHsJLyogdG9nZ2xlIERRMSAqLworCQkgICAgICAgICAgICAgICAgIHRtcGRzdC5sbCA9ICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsb25nICopKGRzdC5sbHApOwkJICAgICAgICAKKwkJICAgICAgICAgICAgICAgICBpZiAoKHRtcGRzdC5sbCAmIDB4ODApICE9IHRtcHNyYy5sbCkKKwkJICAgICAgICAgICAgICAgICB7CisJCSAgICAgICAgICAgICAgICAgICAgIHByaW50Zigid3JpdGUgYnVmZmVyIGVycm9yIG9jY3VycmVkIFxuIik7CisJCSAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2J1ZmZlcl9hYm9ydF9yZXNldChpbmZvLCBzZWN0b3IpOworCQkJICAgICAgICAgICAgIHJldHVybiBFUlJfUFJPR19FUlJPUjsJCQkgICAgICAgICAgICAgCisJCQkgICAgICAgICB9IAkJICAgICAgICAgICAgCisJCSAgICAgICAgICAgIH0JCisJCSAgICAgICAgICAgIAkJICAgICAgICAgICAgICAgIAkKKwkJICAgICAgICB9IHdoaWxlICgodG1wZHN0LmxsICYgMHg4MCkgIT0gdG1wc3JjLmxsKTsKKwkJICAgICAgICAKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIEVSUl9JTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0Y29kZSA9CisJCQlmbGFzaF9mdWxsX3N0YXR1c19jaGVjayAoaW5mbywgc2VjdG9yLAorCQkJCQkJIGluZm8tPmJ1ZmZlcl93cml0ZV90b3V0LAorCQkJCQkJICJidWZmZXIgd3JpdGUiKTsKKwl9CisKKwlyZXR1cm4gcmV0Y29kZTsKK30KKyNlbmRpZiAvKiBDT05GSUdfU1lTX0ZMQVNIX1VTRV9CVUZGRVJfV1JJVEUgKi8KKworI2lmZGVmCUNPTkZJR19GTEFTSF9BU1QyMzAwX0RNQQorI2RlZmluZSBTVENCYXNlQWRkcmVzcwkJCTB4MWU2MjAwMDAKKworLyogZm9yIERNQSAqLworI2RlZmluZSBSRUdfRkxBU0hfSU5URVJSVVBUX1NUQVRVUwkweDA4CisjZGVmaW5lIFJFR19GTEFTSF9ETUFfQ09OVFJPTAkJMHg4MAorI2RlZmluZSBSRUdfRkxBU0hfRE1BX0ZMQVNIX0JBU0UJMHg4NAorI2RlZmluZSBSRUdfRkxBU0hfRE1BX0RSQU1fQkFTRQkJMHg4OAorI2RlZmluZSBSRUdfRkxBU0hfRE1BX0xFTkdUSAkJMHg4YworCisjZGVmaW5lIEZMQVNIX1NUQVRVU19ETUFfQlVTWQkJMHgwMDAwCisjZGVmaW5lIEZMQVNIX1NUQVRVU19ETUFfUkVBRFkJCTB4MDgwMAorI2RlZmluZSBGTEFTSF9TVEFUVVNfRE1BX0NMRUFSCQkweDA4MDAKKworI2RlZmluZSBGTEFTSF9ETUFfRU5BQkxFCQkweDAxCisKK3ZvaWQgKiBtZW1tb3ZlX2RtYSh2b2lkICogZGVzdCxjb25zdCB2b2lkICpzcmMsc2l6ZV90IGNvdW50KQoreworCXVsb25nIGNvdW50X2FsaWduLCBwb2xsX3RpbWUsIGRhdGE7CisJCisJY291bnRfYWxpZ24gPSAoY291bnQgKyAzKSAmIDB4RkZGRkZGRkM7CS8qIDQtYnl0ZXMgYWxpZ24gKi8KKyAgICAgICAgcG9sbF90aW1lID0gMTAwOwkJCS8qIHNldCAxMDAgdXMgYXMgZGVmYXVsdCAqLworCisJKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBSRUdfRkxBU0hfRE1BX0NPTlRST0wpID0gKHVsb25nKSAofkZMQVNIX0RNQV9FTkFCTEUpOworCQorCSoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgUkVHX0ZMQVNIX0RNQV9GTEFTSF9CQVNFKSA9ICh1bG9uZyAqKSAoc3JjKTsKKwkqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIFJFR19GTEFTSF9ETUFfRFJBTV9CQVNFKSA9ICh1bG9uZyAqKSAoZGVzdCk7CisJKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBSRUdfRkxBU0hfRE1BX0xFTkdUSCkgPSAodWxvbmcpIChjb3VudF9hbGlnbik7CisgICAgICAgIHVkZWxheSgxMCk7CisJKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBSRUdfRkxBU0hfRE1BX0NPTlRST0wpID0gKHVsb25nKSAoRkxBU0hfRE1BX0VOQUJMRSk7CisJCisJLyogd2FpdCBwb2xsICovCisJZG8geworCSAgICB1ZGVsYXkocG9sbF90aW1lKTsJCisJICAgIGRhdGEgPSAqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIFJFR19GTEFTSF9JTlRFUlJVUFRfU1RBVFVTKTsKKwl9IHdoaWxlICghKGRhdGEgJiBGTEFTSF9TVEFUVVNfRE1BX1JFQURZKSk7CisJCisJLyogY2xlYXIgc3RhdHVzICovCisJKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBSRUdfRkxBU0hfSU5URVJSVVBUX1NUQVRVUykgfD0gRkxBU0hfU1RBVFVTX0RNQV9DTEVBUjsKK30JCisjZW5kaWYKKyNlbmRpZiAvKiBDRkdfRkxBU0hfQ0ZJICovCmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjQwMC9mbGFzaF9zcGkuYyBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL2ZsYXNoX3NwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFkODkyNTQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC9mbGFzaF9zcGkuYwpAQCAtMCwwICsxLDE2MzQgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogSGlzdG9yeQorICogMDEvMjAvMjAwNCAtIGNvbWJpbmVkIHZhcmlhbnRzIG9mIG9yaWdpbmFsIGRyaXZlci4KKyAqIDAxLzIyLzIwMDQgLSBXcml0ZSBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudHMgZm9yIHBhcmFsbGVsIGNoaXBzIChUb2x1bmF5KQorICogMDEvMjMvMjAwNCAtIFN1cHBvcnQgZm9yIHg4L3gxNiBjaGlwcyAoUnVuZSBSYWtuZXJ1ZCkKKyAqIDAxLzI3LzIwMDQgLSBMaXR0bGUgZW5kaWFuIHN1cHBvcnQgRWQgT2tlcnNvbgorICoKKyAqIFRlc3RlZCBBcmNoaXRlY3R1cmVzCisgKiBQb3J0IFdpZHRoICBDaGlwIFdpZHRoICAgICMgb2YgYmFua3MJICAgRmxhc2ggQ2hpcCAgQm9hcmQKKyAqIDMyCSAgICAgICAxNgkgICAgIDEJCSAgIDI4RjEyOEozICAgIHNlcmFub2EvZWFnbGUKKyAqIDY0CSAgICAgICAxNgkgICAgIDEJCSAgIDI4RjEyOEozICAgIHNlcmFub2EvZmFsY29uCisgKgorICovCisKKy8qIFRoZSBERUJVRyBkZWZpbmUgbXVzdCBiZSBiZWZvcmUgY29tbW9uIHRvIGVuYWJsZSBkZWJ1Z2dpbmcgKi8KKy8qICNkZWZpbmUgREVCVUcJKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8ZW52aXJvbm1lbnQuaD4KKyNpZmRlZglDT05GSUdfRkxBU0hfU1BJCisKKy8qCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIENvbW1vbiBGbGFzaCBJbnRlcmZhY2UgKENGSSkgZHJpdmVyIGZvciBVLUJvb3QuCisgKiBUaGUgd2lkdGggb2YgdGhlIHBvcnQgYW5kIHRoZSB3aWR0aCBvZiB0aGUgY2hpcHMgYXJlIGRldGVybWluZWQgYXQgaW5pdGlhbGl6YXRpb24uCisgKiBUaGVzZSB3aWR0aHMgYXJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBhZGRyZXNzIGZvciBhY2Nlc3MgQ0ZJIGRhdGEgc3RydWN0dXJlcy4KKyAqIEl0IGhhcyBiZWVuIHRlc3RlZCBvbiBhbiBJbnRlbCBTdHJhdGFmbGFzaCBpbXBsZW1lbnRhdGlvbiBhbmQgQU1EIDI5RjAxNkQuCisgKgorICogUmVmZXJlbmNlcworICogSkVERUMgU3RhbmRhcmQgSkVTRDY4IC0gQ29tbW9uIEZsYXNoIEludGVyZmFjZSAoQ0ZJKQorICogSkVERUMgU3RhbmRhcmQgSkVQMTM3LUEgQ29tbW9uIEZsYXNoIEludGVyZmFjZSAoQ0ZJKSBJRCBDb2RlcworICogSW50ZWwgQXBwbGljYXRpb24gTm90ZSA2NDYgQ29tbW9uIEZsYXNoIEludGVyZmFjZSAoQ0ZJKSBhbmQgQ29tbWFuZCBTZXRzCisgKiBJbnRlbCAyOTA2NjctMDA4IDMgVm9sdCBJbnRlbCBTdHJhdGFGbGFzaCBNZW1vcnkgZGF0YXNoZWV0CisgKgorICogVE9ETworICoKKyAqIFVzZSBQcmltYXJ5IEV4dGVuZGVkIFF1ZXJ5IHRhYmxlIChQUkkpIGFuZCBBbHRlcm5hdGUgQWxnb3JpdGhtIFF1ZXJ5CisgKiBUYWJsZSAoQUxUKSB0byBkZXRlcm1pbmUgaWYgcHJvdGVjdGlvbiBpcyBhdmFpbGFibGUKKyAqCisgKiBBZGQgc3VwcG9ydCBmb3Igb3RoZXIgY29tbWFuZCBzZXRzIFVzZSB0aGUgUFJJIGFuZCBBTFQgdG8gZGV0ZXJtaW5lIGNvbW1hbmQgc2V0CisgKiBWZXJpZnkgZXJhc2UgYW5kIHByb2dyYW0gdGltZW91dHMuCisgKi8KKworI2lmbmRlZiBDT05GSUdfRkxBU0hfQkFOS1NfTElTVAorI2RlZmluZSBDT05GSUdfRkxBU0hfQkFOS1NfTElTVCB7IENPTkZJR19TWVNfRkxBU0hfQkFTRSB9CisjZW5kaWYKKworLyogdXNlIENGR19NQVhfRkxBU0hfQkFOS1NfREVURUNUIGlmIGRlZmluZWQgKi8KKyNpZmRlZiBDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LU19ERVRFQ1QKK3N0YXRpYyB1bG9uZyBiYW5rX2Jhc2VbQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1NfREVURUNUXSA9IENPTkZJR19GTEFTSF9CQU5LU19MSVNUOworZmxhc2hfaW5mb190IGZsYXNoX2luZm9bQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1NfREVURUNUXTsJLyogRkxBU0ggY2hpcHMgaW5mbyAqLworI2Vsc2UKK3N0YXRpYyB1bG9uZyBiYW5rX2Jhc2VbQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1NdID0gQ09ORklHX0ZMQVNIX0JBTktTX0xJU1Q7CitmbGFzaF9pbmZvX3QgZmxhc2hfaW5mb1tDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LU107CQkvKiBGTEFTSCBjaGlwcyBpbmZvICovCisjZW5kaWYKKworLyogU3VwcG9ydCBGbGFzaCBJRCAqLworI2RlZmluZSBTVE0yNVA2NAkJMHgxNzIwMjAKKyNkZWZpbmUgU1RNMjVQMTI4CQkweDE4MjAyMAorI2RlZmluZSBOMjVRMjU2CQkJMHgxOWJhMjAKKyNkZWZpbmUgTjI1UTUxMgkJCTB4MjBiYTIwCisjZGVmaW5lIFMyNUZMMDY0QQkJMHgxNjAyMDEKKyNkZWZpbmUgUzI1RkwxMjhQCQkweDE4MjAwMQorI2RlZmluZSBTMjVGTDI1NlMJCTB4MTkwMjAxCisjZGVmaW5lIFcyNVgxNgkJCTB4MTUzMGVmCisjZGVmaW5lIFcyNVg2NAkJCTB4MTczMGVmCisjZGVmaW5lIFcyNVE2NEJWCQkweDE3NDBlZgorI2RlZmluZSBXMjVRMTI4QlYJCTB4MTg0MGVmCisjZGVmaW5lIFcyNVEyNTZGVgkJMHgxOTQwZWYKKyNkZWZpbmUgTVgyNUwxNjA1RAkJMHgxNTIwQzIKKyNkZWZpbmUgTVgyNUwxMjgwNUQJCTB4MTgyMEMyCisjZGVmaW5lIE1YMjVMMjU2MzVFCQkweDE5MjBDMgorI2RlZmluZSBTU1QyNVZGMDE2QiAgICAgICAgICAgICAweDQxMjViZgorI2RlZmluZSBTU1QyNVZGMDY0QyAgICAgICAgICAgICAweDRiMjViZgorI2RlZmluZSBBVDI1REYxNjEJCTB4MDI0NjFGCisjZGVmaW5lIEFUMjVERjMyMQkJMHgwMTQ3MUYKKworLyogU1BJIERlZmluZSAqLworI2lmCWRlZmluZWQoQ09ORklHX0ZMQVNIX0FTVDIzMDApIHx8IGRlZmluZWQoQ09ORklHX0FTVDEzMDApCisjaWYJZGVmaW5lZChDT05GSUdfQVNUMTMwMCkKKyNkZWZpbmUgU1RDQmFzZUFkZHJlc3MJCQkweDAwNjIwMDAwCisjZWxzZQorI2RlZmluZSBTVENCYXNlQWRkcmVzcwkJCTB4MWU2MjAwMDAKKyNlbmRpZgorI2RlZmluZSBTQ1VfUkVWSVNJT05fUkVHSVNURVIJCTB4MWU2ZTIwN2MKKyNkZWZpbmUgU0NVX0NBQ0hFX0NUUkxfUkVHSVNURVIJCTB4MWU2ZTIxMTgKKworI2RlZmluZSBTUElDdHJsUmVnT2Zmc2V0CQkweDEwCisjZGVmaW5lIFNQSUN0cmxSZWdPZmZzZXQyCQkweDE0CisKKyNkZWZpbmUgU1BJTWlzY0N0cmxSZWdPZmZzZXQJCTB4NTQKKworLyogZm9yIERNQSAqLworI2RlZmluZSBSRUdfRkxBU0hfSU5URVJSVVBUX1NUQVRVUwkweDA4CisjZGVmaW5lIFJFR19GTEFTSF9ETUFfQ09OVFJPTAkJMHg4MAorI2RlZmluZSBSRUdfRkxBU0hfRE1BX0ZMQVNIX0JBU0UJMHg4NAorI2RlZmluZSBSRUdfRkxBU0hfRE1BX0RSQU1fQkFTRQkJMHg4OAorI2RlZmluZSBSRUdfRkxBU0hfRE1BX0xFTkdUSAkJMHg4YworCisjZGVmaW5lIEZMQVNIX1NUQVRVU19ETUFfQlVTWQkJMHgwMDAwCisjZGVmaW5lIEZMQVNIX1NUQVRVU19ETUFfUkVBRFkJCTB4MDgwMAorI2RlZmluZSBGTEFTSF9TVEFUVVNfRE1BX0NMRUFSCQkweDA4MDAKKworI2RlZmluZSBGTEFTSF9ETUFfRU5BQkxFCQkweDAxCisjZWxzZQorI2RlZmluZSBTVENCYXNlQWRkcmVzcwkJCTB4MTYwMDAwMDAKKworI2RlZmluZSBTUElDdHJsUmVnT2Zmc2V0CQkweDA0CisjZGVmaW5lIFNQSUN0cmxSZWdPZmZzZXQyCQkweDBDCisjZW5kaWYJLyogQ09ORklHX0ZMQVNIX0FTVDIzMDAgKi8KKworI2RlZmluZSBDTURfTUFTSwkJMHhGRkZGRkZGOAorCisjZGVmaW5lIE5PUk1BTFJFQUQJCTB4MDAKKyNkZWZpbmUJRkFTVFJFQUQJCTB4MDEKKyNkZWZpbmUgTk9STUFMV1JJVEUJCTB4MDIKKyNkZWZpbmUgVVNFUk1PREUJCTB4MDMKKworI2RlZmluZSBDRV9MT1cJCQkweDAwCisjZGVmaW5lIENFX0hJR0gJCQkweDA0CisKKy8qIEFTVDIzMDAgb25seSAqLworI2RlZmluZSBJT01PREV4MQkJMHgwMDAwMDAwMAorI2RlZmluZSBJT01PREV4MgkJMHgyMDAwMDAwMAorI2RlZmluZSBJT01PREV4Ml9kdW1teQkJMHgzMDAwMDAwMAorI2RlZmluZSBJT01PREV4NAkJMHg0MDAwMDAwMAorI2RlZmluZSBJT01PREV4NF9kdW1teQkJMHg1MDAwMDAwMAorCisjZGVmaW5lIERVTU1ZX0NPTU1BTkRfT1VUCTB4MDAwMDgwMDAKKy8qIH5BU1QyMzAwIG9ubHkgKi8KKworLyogc3BlY2lmaWNzcGkgKi8KKyNkZWZpbmUgU3BlY2lmaWNTUElfTjI1UTUxMgkweDAwMDAwMDAxCQkKKworc3RhdGljIHVsb25nIEFTVDIzMDBfU1BJQ0xLX0RJVlsxNl0gPSB7MHgwRiwgMHgwNywgMHgwRSwgMHgwNiwgMHgwRCwgMHgwNSwgMHgwQywgMHgwNCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQiwgMHgwMywgMHgwQSwgMHgwMiwgMHgwOSwgMHgwMSwgMHgwOCwgMHgwMCB9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQgcmVzZXRfZmxhc2ggKGZsYXNoX2luZm9fdCAqIGluZm8pOworc3RhdGljIHZvaWQgZW5hYmxlX3dyaXRlIChmbGFzaF9pbmZvX3QgKiBpbmZvKTsKK3N0YXRpYyB2b2lkIHdyaXRlX3N0YXR1c19yZWdpc3RlciAoZmxhc2hfaW5mb190ICogaW5mbywgdWNoYXIgZGF0YSk7CitzdGF0aWMgdm9pZCBlbmFibGU0YiAoZmxhc2hfaW5mb190ICogaW5mbyk7CitzdGF0aWMgdm9pZCBlbmFibGU0Yl9zcGFuc2lvbiAoZmxhc2hfaW5mb190ICogaW5mbyk7CitzdGF0aWMgdm9pZCBlbmFibGU0Yl9udW1vbnl4IChmbGFzaF9pbmZvX3QgKiBpbmZvKTsKK3N0YXRpYyB1bG9uZyBmbGFzaF9nZXRfc2l6ZSAodWxvbmcgYmFzZSwgaW50IGJhbmtudW0pOworc3RhdGljIGludCBmbGFzaF93cml0ZV9idWZmZXIgKGZsYXNoX2luZm9fdCAqaW5mbywgdWNoYXIgKnNyYywgdWxvbmcgYWRkciwgaW50IGxlbik7CisjaWYgZGVmaW5lZChDRkdfRU5WX0lTX0lOX0ZMQVNIKSB8fCBkZWZpbmVkKENGR19FTlZfQUREUl9SRURVTkQpIHx8IChDRkdfTU9OSVRPUl9CQVNFID49IENGR19GTEFTSF9CQVNFKQorc3RhdGljIGZsYXNoX2luZm9fdCAqZmxhc2hfZ2V0X2luZm8odWxvbmcgYmFzZSk7CisjZW5kaWYKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBjcmVhdGUgYW4gYWRkcmVzcyBiYXNlZCBvbiB0aGUgb2Zmc2V0IGFuZCB0aGUgcG9ydCB3aWR0aAorICovCitpbmxpbmUgdWNoYXIgKmZsYXNoX21ha2VfYWRkciAoZmxhc2hfaW5mb190ICogaW5mbywgZmxhc2hfc2VjdF90IHNlY3QsIHVpbnQgb2Zmc2V0KQoreworI2lmZGVmIENPTkZJR18yU1BJRkxBU0gKKyAgICAgICAgaWYgKGluZm8tPnN0YXJ0WzBdID49IFBIWVNfRkxBU0hfMikKKwkgICAgcmV0dXJuICgodWNoYXIgKikgKGluZm8tPnN0YXJ0W3NlY3RdICsgKG9mZnNldCAqIDEpIC0gKFBIWVNfRkxBU0hfMiAtIFBIWVNfRkxBU0hfMl9CQVNFKSApKTsgICAgICAgIAorICAgICAgICBlbHNlCisJICAgIHJldHVybiAoKHVjaGFyICopIChpbmZvLT5zdGFydFtzZWN0XSArIChvZmZzZXQgKiAxKSkpOworI2Vsc2UKKwlyZXR1cm4gKCh1Y2hhciAqKSAoaW5mby0+c3RhcnRbc2VjdF0gKyAob2Zmc2V0ICogMSkpKTsKKyNlbmRpZgkKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcmVhZCBhIGNoYXJhY3RlciBhdCBhIHBvcnQgd2lkdGggYWRkcmVzcworICovCitpbmxpbmUgdWNoYXIgZmxhc2hfcmVhZF91Y2hhciAoZmxhc2hfaW5mb190ICogaW5mbywgdWludCBvZmZzZXQpCit7CisJdWNoYXIgKmNwOworCisJY3AgPSBmbGFzaF9tYWtlX2FkZHIgKGluZm8sIDAsIG9mZnNldCk7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJcmV0dXJuIChjcFswXSk7CisjZWxzZQorCXJldHVybiAoY3BbMSAtIDFdKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiByZWFkIGEgc2hvcnQgd29yZCBieSBzd2FwcGluZyBmb3IgcHBjIGZvcm1hdC4KKyAqLwordXNob3J0IGZsYXNoX3JlYWRfdXNob3J0IChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdCwgdWludCBvZmZzZXQpCit7CisJdWNoYXIgKmFkZHI7CisJdXNob3J0IHJldHZhbDsKKworI2lmZGVmIERFQlVHCisJaW50IHg7CisjZW5kaWYKKwlhZGRyID0gZmxhc2hfbWFrZV9hZGRyIChpbmZvLCBzZWN0LCBvZmZzZXQpOworCisjaWZkZWYgREVCVUcKKwlkZWJ1ZyAoInVzaG9ydCBhZGRyIGlzIGF0ICVwIDEgPSAlZFxuIiwgYWRkciwKKwkgICAgICAgMSk7CisJZm9yICh4ID0gMDsgeCA8IDIgKiAxOyB4KyspIHsKKwkJZGVidWcgKCJhZGRyWyV4XSA9IDB4JXhcbiIsIHgsIGFkZHJbeF0pOworCX0KKyNlbmRpZgorI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXJldHZhbCA9ICgoYWRkclsoMSldIDw8IDgpIHwgYWRkclswXSk7CisjZWxzZQorCXJldHZhbCA9ICgoYWRkclsoMiAqIDEpIC0gMV0gPDwgOCkgfAorCQkgIGFkZHJbMSAtIDFdKTsKKyNlbmRpZgorCisJZGVidWcgKCJyZXR2YWwgPSAweCV4XG4iLCByZXR2YWwpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJlYWQgYSBsb25nIHdvcmQgYnkgcGlja2luZyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBvZiBlYWNoIG1haXhpbXVtCisgKiBwb3J0IHNpemUgd29yZC4gU3dhcCBmb3IgcHBjIGZvcm1hdC4KKyAqLwordWxvbmcgZmxhc2hfcmVhZF9sb25nIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBmbGFzaF9zZWN0X3Qgc2VjdCwgdWludCBvZmZzZXQpCit7CisJdWNoYXIgKmFkZHI7CisJdWxvbmcgcmV0dmFsOworCisjaWZkZWYgREVCVUcKKwlpbnQgeDsKKyNlbmRpZgorCWFkZHIgPSBmbGFzaF9tYWtlX2FkZHIgKGluZm8sIHNlY3QsIG9mZnNldCk7CisKKyNpZmRlZiBERUJVRworCWRlYnVnICgibG9uZyBhZGRyIGlzIGF0ICVwIDEgPSAlZFxuIiwgYWRkciwKKwkgICAgICAgMSk7CisJZm9yICh4ID0gMDsgeCA8IDQgKiAxOyB4KyspIHsKKwkJZGVidWcgKCJhZGRyWyV4XSA9IDB4JXhcbiIsIHgsIGFkZHJbeF0pOworCX0KKyNlbmRpZgorI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorCXJldHZhbCA9IChhZGRyWzBdIDw8IDE2KSB8IChhZGRyWygxKV0gPDwgMjQpIHwKKwkJKGFkZHJbKDIgKiAxKV0pIHwgKGFkZHJbKDMgKiAxKV0gPDwgOCk7CisjZWxzZQorCXJldHZhbCA9IChhZGRyWygyICogMSkgLSAxXSA8PCAyNCkgfAorCQkoYWRkclsoMSkgLSAxXSA8PCAxNikgfAorCQkoYWRkclsoNCAqIDEpIC0gMV0gPDwgOCkgfAorCQlhZGRyWygzICogMSkgLSAxXTsKKyNlbmRpZgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIHZvaWQgZGlzYWJsZV9jYWNoZSh2b2lkKQoreworI2lmCWRlZmluZWQoQVNUMTMwMF9DUFVfQ0FDSEVfRU5BQkxFKQorICAgICAgICB1bG9uZyB1bGRhdGE7CisgICAgICAgIAorICAgICAgICB1bGRhdGEgID0gKih2b2xhdGlsZSB1bG9uZyAqKSAoU0NVX0NBQ0hFX0NUUkxfUkVHSVNURVIpOworICAgICAgICB1bGRhdGEgJj0gMHhmZmZmZmZmZDsKKyAgICAgICAgKih1bG9uZyAqKSAoU0NVX0NBQ0hFX0NUUkxfUkVHSVNURVIpID0gdWxkYXRhOyAgICAgICAgCisjZW5kaWYKK30JCisKK3N0YXRpYyB2b2lkIGVuYWJsZV9jYWNoZSh2b2lkKQoreworI2lmCWRlZmluZWQoQVNUMTMwMF9DUFVfQ0FDSEVfRU5BQkxFKQorICAgICAgICB1bG9uZyB1bGRhdGE7CisgICAgICAgIAorICAgICAgICB1bGRhdGEgID0gKih2b2xhdGlsZSB1bG9uZyAqKSAoU0NVX0NBQ0hFX0NUUkxfUkVHSVNURVIpOworICAgICAgICB1bGRhdGEgfD0gMHgwMDAwMDAwMjsKKyAgICAgICAgKih1bG9uZyAqKSAoU0NVX0NBQ0hFX0NUUkxfUkVHSVNURVIpID0gdWxkYXRhOyAgICAgICAgCisjZW5kaWYKK30KKwkgCitzdGF0aWMgdm9pZCByZXNldF9mbGFzaCAoZmxhc2hfaW5mb190ICogaW5mbykKK3sKKyAgICAgICAgdWxvbmcgdWxDdHJsRGF0YSwgQ3RybE9mZnNldCwgTWlzY0N0cmxPZmZzZXQ7CisgICAgICAgIAorICAgICAgICBpZiAoaW5mby0+Q0UgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgQ3RybE9mZnNldCA9IFNQSUN0cmxSZWdPZmZzZXQyOworICAgICAgICB9ICAgIAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN0cmxPZmZzZXQgPSBTUElDdHJsUmVnT2Zmc2V0OworICAgICAgICB9ICAgIAorCisjaWYgICAgZGVmaW5lZChDT05GSUdfRkxBU0hfQVNUMjMwMCkgfHwgZGVmaW5lZChDT05GSUdfQVNUMTMwMCkKKyAgICAgICAgdWxDdHJsRGF0YSA9IGluZm8tPmlvbW9kZSB8IChpbmZvLT5yZWFkY21kIDw8IDE2KSB8IChpbmZvLT50Q0tfUmVhZCA8PCA4KSB8IChpbmZvLT5kdW1teWJ5dGUgPDwgNikgfCBGQVNUUkVBRDsKKyNpZiAwICAgICAgICAKKyAgICAgICAgaWYgKGluZm8tPnF1YWRwb3J0KQorICAgICAgICB7ICAgICAgICAJCisgICAgICAgICAgICBNaXNjQ3RybE9mZnNldCA9IFNQSU1pc2NDdHJsUmVnT2Zmc2V0OworICAgICAgICAgICAgKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBNaXNjQ3RybE9mZnNldCkgPSBpbmZvLT5kdW1teWRhdGE7ICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB1bEN0cmxEYXRhIHw9IERVTU1ZX0NPTU1BTkRfT1VUOworICAgICAgICB9CisjZW5kaWYgICAgICAgIAorI2Vsc2UgICAgICAKKyAgICAgICAgdWxDdHJsRGF0YSAgPSAoaW5mby0+cmVhZGNtZCA8PCAxNikgfCAoaW5mby0+dENLX1JlYWQgPDwgOCkgfCAoaW5mby0+ZHVtbXlieXRlIDw8IDYpIHwgRkFTVFJFQUQ7ICAgICAgICAgCisgICAgICAgIGlmIChpbmZvLT5kdWFscG9ydCkKKyAgICAgICAgICAgIHVsQ3RybERhdGEgIHw9IDB4MDg7ICAgICAgICAKKyNlbmRpZiAgICAgICAgCisgICAgICAgICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOyAgICAgICAgCisgICAgICAgIAorICAgICAgICBlbmFibGVfY2FjaGUoKTsgICAgCit9CisJIAorc3RhdGljIHZvaWQgZW5hYmxlX3dyaXRlIChmbGFzaF9pbmZvX3QgKiBpbmZvKQoreworCXVsb25nIGJhc2U7CisgICAgICAgIHVsb25nIHVsQ3RybERhdGEsIEN0cmxPZmZzZXQ7CisgICAgICAgIHVjaGFyIGpSZWc7CisgICAgICAgIAorICAgICAgICBpZiAoaW5mby0+Q0UgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgQ3RybE9mZnNldCA9IFNQSUN0cmxSZWdPZmZzZXQyOworICAgICAgICB9ICAgIAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN0cmxPZmZzZXQgPSBTUElDdHJsUmVnT2Zmc2V0OworICAgICAgICB9ICAgIAorICAgICAgICAgICAgICAgICAgCisJLy9iYXNlID0gaW5mby0+c3RhcnRbMF07CisJYmFzZSA9IGZsYXNoX21ha2VfYWRkciAoaW5mbywgMCwgMCk7CisKKyAgICAgICAgdWxDdHJsRGF0YSAgPSAoaW5mby0+dENLX1dyaXRlIDw8IDgpOyAgICAgICAgCisgICAgICAgIHVsQ3RybERhdGEgfD0gQ0VfTE9XIHwgVVNFUk1PREU7CisgICAgICAgICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgICAgICB1ZGVsYXkoMjAwKTsKKyAgICAgICAgKih1Y2hhciAqKSAoYmFzZSkgPSAodWNoYXIpICgweDA2KTsKKyAgICAgICAgdWRlbGF5KDEwKTsKKyAgICAgICAgdWxDdHJsRGF0YSAmPSBDTURfTUFTSzsKKyAgICAgICAgdWxDdHJsRGF0YSB8PSBDRV9ISUdIIHwgVVNFUk1PREU7CisgICAgICAgICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgICAgICB1ZGVsYXkoMjAwKTsKKworICAgICAgICB1bEN0cmxEYXRhICY9IENNRF9NQVNLOworICAgICAgICB1bEN0cmxEYXRhIHw9IENFX0xPVyB8IFVTRVJNT0RFOworICAgICAgICAqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIEN0cmxPZmZzZXQpID0gdWxDdHJsRGF0YTsKKyAgICAgICAgdWRlbGF5KDIwMCk7CisgICAgICAgICoodWNoYXIgKikgKGJhc2UpID0gKHVjaGFyKSAoMHgwNSk7CisgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgalJlZyA9ICoodm9sYXRpbGUgdWNoYXIgKikgKGJhc2UpOworICAgICAgICB9IHdoaWxlICghKGpSZWcgJiAweDAyKSk7ICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAKKyAgICAgICAgdWxDdHJsRGF0YSAmPSBDTURfTUFTSzsKKyAgICAgICAgdWxDdHJsRGF0YSB8PSBDRV9ISUdIIHwgVVNFUk1PREU7CisgICAgICAgICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgICAgICB1ZGVsYXkoMjAwKTsKKworfQorCQkKK3N0YXRpYyB2b2lkIHdyaXRlX3N0YXR1c19yZWdpc3RlciAoZmxhc2hfaW5mb190ICogaW5mbywgdWNoYXIgZGF0YSkKK3sKKwl1bG9uZyBiYXNlOworICAgICAgICB1bG9uZyB1bFNNTUJhc2UsIHVsQ3RybERhdGEsIEN0cmxPZmZzZXQ7CisgICAgICAgIHVjaGFyIGpSZWc7CisgICAgICAgIAorICAgICAgICBpZiAoaW5mby0+Q0UgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgQ3RybE9mZnNldCA9IFNQSUN0cmxSZWdPZmZzZXQyOworICAgICAgICB9ICAgIAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN0cmxPZmZzZXQgPSBTUElDdHJsUmVnT2Zmc2V0OworICAgICAgICB9ICAgIAorICAgIAorCS8vYmFzZSA9IGluZm8tPnN0YXJ0WzBdOworCWJhc2UgPSBmbGFzaF9tYWtlX2FkZHIgKGluZm8sIDAsIDApOworCisgICAgICAgIGVuYWJsZV93cml0ZSAoaW5mbyk7CisKKyAgICAgICAgdWxDdHJsRGF0YSAgPSAoaW5mby0+dENLX1dyaXRlIDw8IDgpOworICAgICAgICB1bEN0cmxEYXRhIHw9IENFX0xPVyB8IFVTRVJNT0RFOworICAgICAgICAqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIEN0cmxPZmZzZXQpID0gdWxDdHJsRGF0YTsKKyAgICAgICAgdWRlbGF5KDIwMCk7CisgICAgICAgICoodWNoYXIgKikgKGJhc2UpID0gKHVjaGFyKSAoMHgwMSk7CisgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgICoodWNoYXIgKikgKGJhc2UpID0gKHVjaGFyKSAoZGF0YSk7ICAgICAgICAgICAgICAgIAorICAgICAgICB1bEN0cmxEYXRhICY9IENNRF9NQVNLOworICAgICAgICB1bEN0cmxEYXRhIHw9IENFX0hJR0ggfCBVU0VSTU9ERTsKKyAgICAgICAgKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBDdHJsT2Zmc2V0KSA9IHVsQ3RybERhdGE7CisgICAgICAgIHVkZWxheSgyMDApOworCisgICAgICAgIHVsQ3RybERhdGEgJj0gQ01EX01BU0s7CisgICAgICAgIHVsQ3RybERhdGEgfD0gQ0VfTE9XIHwgVVNFUk1PREU7CisgICAgICAgICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgICAgICB1ZGVsYXkoMjAwKTsKKyAgICAgICAgKih1Y2hhciAqKSAoYmFzZSkgPSAodWNoYXIpICgweDA1KTsKKyAgICAgICAgdWRlbGF5KDEwKTsKKyAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBqUmVnID0gKih2b2xhdGlsZSB1Y2hhciAqKSAoYmFzZSk7CisgICAgICAgIH0gd2hpbGUgKGpSZWcgJiAweDAxKTsKKyAgICAgICAgdWxDdHJsRGF0YSAmPSBDTURfTUFTSzsgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCisgICAgICAgIHVsQ3RybERhdGEgfD0gQ0VfSElHSCB8IFVTRVJNT0RFOworICAgICAgICAqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIEN0cmxPZmZzZXQpID0gdWxDdHJsRGF0YTsKKyAgICAgICAgdWRlbGF5KDIwMCk7CisKK30KKworc3RhdGljIHZvaWQgZW5hYmxlNGIgKGZsYXNoX2luZm9fdCAqIGluZm8pCit7CisJdWxvbmcgYmFzZTsKKyAgICAgICAgdWxvbmcgdWxTTU1CYXNlLCB1bEN0cmxEYXRhLCBDdHJsT2Zmc2V0OworICAgICAgICB1Y2hhciBqUmVnOworICAgICAgICAKKyAgICAgICAgaWYgKGluZm8tPkNFID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEN0cmxPZmZzZXQgPSBTUElDdHJsUmVnT2Zmc2V0MjsKKyAgICAgICAgfSAgICAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdHJsT2Zmc2V0ID0gU1BJQ3RybFJlZ09mZnNldDsKKyAgICAgICAgfSAgICAKKyAgICAKKwkvL2Jhc2UgPSBpbmZvLT5zdGFydFswXTsKKwliYXNlID0gZmxhc2hfbWFrZV9hZGRyIChpbmZvLCAwLCAwKTsKKworICAgICAgICB1bEN0cmxEYXRhICA9IChpbmZvLT50Q0tfV3JpdGUgPDwgOCk7CisgICAgICAgIHVsQ3RybERhdGEgfD0gQ0VfTE9XIHwgVVNFUk1PREU7CisgICAgICAgICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgICAgICB1ZGVsYXkoMjAwKTsKKyAgICAgICAgKih1Y2hhciAqKSAoYmFzZSkgPSAodWNoYXIpICgweGI3KTsKKyAgICAgICAgdWxDdHJsRGF0YSAmPSBDTURfTUFTSzsgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCisgICAgICAgIHVsQ3RybERhdGEgfD0gQ0VfSElHSCB8IFVTRVJNT0RFOworICAgICAgICAqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIEN0cmxPZmZzZXQpID0gdWxDdHJsRGF0YTsKKyAgICAgICAgdWRlbGF5KDIwMCk7CisgCit9IC8qIGVuYWJsZTRiICovCisKK3N0YXRpYyB2b2lkIGVuYWJsZTRiX3NwYW5zaW9uIChmbGFzaF9pbmZvX3QgKiBpbmZvKQoreworCXVsb25nIGJhc2U7CisgICAgCXVsb25nIHVsU01NQmFzZSwgdWxDdHJsRGF0YSwgQ3RybE9mZnNldDsKKyAgICAJdWNoYXIgalJlZzsKKyAgICAgICAgCisgICAgCWlmIChpbmZvLT5DRSA9PSAyKQorICAgIAl7CisgICAgICAgICAgICBDdHJsT2Zmc2V0ID0gU1BJQ3RybFJlZ09mZnNldDI7CisgICAgCX0gICAgCisgICAgCWVsc2UKKyAgICAJeworICAgICAgICAgICAgQ3RybE9mZnNldCA9IFNQSUN0cmxSZWdPZmZzZXQ7CisgICAgCX0gICAgCisgICAgCisJLy9iYXNlID0gaW5mby0+c3RhcnRbMF07CisJYmFzZSA9IGZsYXNoX21ha2VfYWRkciAoaW5mbywgMCwgMCk7CisKKwkvKiBFbmFibGUgNEI6IEJBUjAgRFs3XSA9IDEgKi8KKyAgICAJdWxDdHJsRGF0YSAgPSAoaW5mby0+dENLX1dyaXRlIDw8IDgpOworICAgIAl1bEN0cmxEYXRhIHw9IENFX0xPVyB8IFVTRVJNT0RFOworICAgIAkqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIEN0cmxPZmZzZXQpID0gdWxDdHJsRGF0YTsKKyAgICAJdWRlbGF5KDIwMCk7CisgICAgCSoodWNoYXIgKikgKGJhc2UpID0gKHVjaGFyKSAoMHgxNyk7CisgICAgCXVkZWxheSgxMCk7CisgICAgCSoodWNoYXIgKikgKGJhc2UpID0gKHVjaGFyKSAoMHg4MCk7ICAgIAorICAgIAl1bEN0cmxEYXRhICY9IENNRF9NQVNLOyAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAKKyAgICAJdWxDdHJsRGF0YSB8PSBDRV9ISUdIIHwgVVNFUk1PREU7CisgICAgCSoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgIAl1ZGVsYXkoMjAwKTsKKworICAgIAl1bEN0cmxEYXRhICY9IENNRF9NQVNLOyAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAKKyAgICAJdWxDdHJsRGF0YSB8PSBDRV9MT1cgfCBVU0VSTU9ERTsKKyAgICAJKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBDdHJsT2Zmc2V0KSA9IHVsQ3RybERhdGE7CisgICAgCXVkZWxheSgyMDApOworICAgIAkqKHVjaGFyICopIChiYXNlKSA9ICh1Y2hhcikgKDB4MTYpOworICAgIAl1ZGVsYXkoMTApOworICAgIAlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGpSZWcgPSAqKHZvbGF0aWxlIHVjaGFyICopIChiYXNlKTsKKyAgICAJfSB3aGlsZSAoIShqUmVnICYgMHg4MCkpOworICAgIAl1bEN0cmxEYXRhICY9IENNRF9NQVNLOyAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCisgICAgCXVsQ3RybERhdGEgfD0gQ0VfSElHSCB8IFVTRVJNT0RFOworICAgCSAqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIEN0cmxPZmZzZXQpID0gdWxDdHJsRGF0YTsKKyAgICAJdWRlbGF5KDIwMCk7CisJCit9IC8qIGVuYWJsZTRiX3NwYW5zaW9uICovCisKK3N0YXRpYyB2b2lkIGVuYWJsZTRiX251bW9ueXggKGZsYXNoX2luZm9fdCAqIGluZm8pCit7CisJdWxvbmcgYmFzZTsKKyAgICAJdWxvbmcgdWxTTU1CYXNlLCB1bEN0cmxEYXRhLCBDdHJsT2Zmc2V0OworICAgIAl1Y2hhciBqUmVnOworICAgICAgICAKKyAgICAJaWYgKGluZm8tPkNFID09IDIpCisgICAgCXsKKyAgICAgICAgICAgIEN0cmxPZmZzZXQgPSBTUElDdHJsUmVnT2Zmc2V0MjsKKyAgICAJfSAgICAKKyAgICAJZWxzZQorICAgIAl7CisgICAgICAgICAgICBDdHJsT2Zmc2V0ID0gU1BJQ3RybFJlZ09mZnNldDsKKyAgICAJfSAgICAKKyAgICAKKwkvL2Jhc2UgPSBpbmZvLT5zdGFydFswXTsKKwliYXNlID0gZmxhc2hfbWFrZV9hZGRyIChpbmZvLCAwLCAwKTsKKworCS8qIEVuYWJsZSBXcml0ZSAqLworCWVuYWJsZV93cml0ZSAoaW5mbyk7CisJCisJLyogRW5hYmxlIDRCOiBDTUQ6MHhCNyAqLworICAgIAl1bEN0cmxEYXRhICA9IChpbmZvLT50Q0tfV3JpdGUgPDwgOCk7CisgICAgCXVsQ3RybERhdGEgfD0gQ0VfTE9XIHwgVVNFUk1PREU7CisgICAgCSoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgIAl1ZGVsYXkoMjAwKTsKKyAgICAJKih1Y2hhciAqKSAoYmFzZSkgPSAodWNoYXIpICgweEI3KTsKKyAgICAJdWRlbGF5KDEwKTsKKyAgICAJdWxDdHJsRGF0YSAmPSBDTURfTUFTSzsgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCisgICAgCXVsQ3RybERhdGEgfD0gQ0VfSElHSCB8IFVTRVJNT0RFOworICAgIAkqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIEN0cmxPZmZzZXQpID0gdWxDdHJsRGF0YTsKKyAgICAJdWRlbGF5KDIwMCk7CisKK30gLyogZW5hYmxlNGJfbnVtb255eCAqLworCisvKgorICoKKyAqLworc3RhdGljIHVsb25nIGZsYXNoX2dldF9zaXplICh1bG9uZyBiYXNlLCBpbnQgYmFua251bSkKK3sKKwlmbGFzaF9pbmZvX3QgKmluZm8gPSAmZmxhc2hfaW5mb1tiYW5rbnVtXTsKKwlpbnQgajsKKwl1bnNpZ25lZCBsb25nIHNlY3RvcjsKKwlpbnQgZXJhc2VfcmVnaW9uX3NpemU7CisgICAgICAgIHVsb25nIHVsQ3RybERhdGEsIEN0cmxPZmZzZXQ7CisgICAgICAgIHVsb25nIHVsSUQ7CisgICAgICAgIHVjaGFyIGNoWzNdOworICAgICAgICB1bG9uZyBjcHVjbGssIGRpdiwgcmVnOworICAgICAgICB1bG9uZyBXcml0ZUNsaywgRXJhc2VDbGssIFJlYWRDbGs7CisgICAgICAgIHVsb25nIHZiYXNlOworICAgICAgICB1bG9uZyBTQ1VSZXZpc2lvbjsKKworICAgICAgICB1bG9uZyB1bFJlZlBMTDsKKyAgICAgICAgdWxvbmcgdWxEZU51bWVyYXRvcjsKKyAgICAgICAgdWxvbmcgdWxOdW1lcmF0b3I7CisgICAgICAgIHVsb25nIHVsT0Q7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICBkaXNhYmxlX2NhY2hlKCk7CisgICAgICAgIAorCWluZm8tPnN0YXJ0WzBdID0gYmFzZTsKKwl2YmFzZSA9IGZsYXNoX21ha2VfYWRkciAoaW5mbywgMCwgMCk7CisKKyNpZglkZWZpbmVkKENPTkZJR19GTEFTSF9BU1QyMzAwKSB8fCBkZWZpbmVkKENPTkZJR19BU1QxMzAwKQorICAgICAgICBDdHJsT2Zmc2V0ID0gU1BJQ3RybFJlZ09mZnNldDsgICAgICAgIAkKKyAgICAgICAgaW5mby0+Q0UgPSAwOyAgICAgICAgICAgICAgICAJCisjZWxzZQorICAgICAgICBpZiAodmJhc2UgPT0gUEhZU19GTEFTSF8xKQorICAgICAgICB7CisgICAgICAgICAgICBDdHJsT2Zmc2V0ID0gU1BJQ3RybFJlZ09mZnNldDI7CisgICAgICAgICAgICBpbmZvLT5DRSA9IDI7CisgICAgICAgIH0gICAgCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3RybE9mZnNldCA9IFNQSUN0cmxSZWdPZmZzZXQ7ICAgICAgICAJCisgICAgICAgICAgICBpbmZvLT5DRSA9IDA7ICAgICAgICAJCisgICAgICAgIH0gICAgCisjZW5kaWYKKyAgICAgICAgICAgIAorICAgICAgICAvKiBHZXQgRmxhc2ggSUQgKi8KKyAgICAgICAgdWxDdHJsRGF0YSAgPSAqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIEN0cmxPZmZzZXQpICYgQ01EX01BU0s7ICAgICAgICAKKyAgICAgICAgdWxDdHJsRGF0YSB8PSBDRV9MT1cgfCBVU0VSTU9ERTsKKyAgICAgICAgKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBDdHJsT2Zmc2V0KSA9IHVsQ3RybERhdGE7CisgICAgICAgIHVkZWxheSgyMDApOworICAgICAgICAqKHVjaGFyICopICh2YmFzZSkgPSAodWNoYXIpICgweDlGKTsKKyAgICAgICAgdWRlbGF5KDEwKTsKKyAgICAgICAgY2hbMF0gPSAqKHZvbGF0aWxlIHVjaGFyICopKHZiYXNlKTsKKyAgICAgICAgdWRlbGF5KDEwKTsKKyAgICAgICAgY2hbMV0gPSAqKHZvbGF0aWxlIHVjaGFyICopKHZiYXNlKTsKKyAgICAgICAgdWRlbGF5KDEwKTsKKyAgICAgICAgY2hbMl0gPSAqKHZvbGF0aWxlIHVjaGFyICopKHZiYXNlKTsKKyAgICAgICAgdWRlbGF5KDEwKTsgICAgICAgICAgICAgICAKKyAgICAgICAgdWxDdHJsRGF0YSAgPSAqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIEN0cmxPZmZzZXQpICYgQ01EX01BU0s7ICAgICAgICAKKyAgICAgICAgdWxDdHJsRGF0YSB8PSBDRV9ISUdIIHwgVVNFUk1PREU7CisgICAgICAgICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgICAgICB1ZGVsYXkoMjAwKTsKKyAgICAgICAgdWxJRCA9ICgodWxvbmcpY2hbMF0pIHwgKCh1bG9uZyljaFsxXSA8PCA4KSB8ICgodWxvbmcpY2hbMl0gPDwgMTYpIDsgICAgICAgIAorICAgICAgICBpbmZvLT5mbGFzaF9pZCA9IHVsSUQ7CisgICAgICAgIAorICAgICAgICAvL3ByaW50ZigiU1BJIEZsYXNoIElEOiAleCBcbiIsIHVsSUQpOworCisgICAgICAgIC8qIGluaXQgZGVmYXVsdCAqLyAgICAgICAgCisgICAgICAgIGluZm8tPmlvbW9kZSA9IElPTU9ERXgxOworICAgICAgICBpbmZvLT5hZGRyZXNzMzIgPSAwOworICAgICAgICBpbmZvLT5xdWFkcG9ydCA9IDA7CisgICAgICAgIGluZm8tPnNwZWNpZmljc3BpID0gMDsKKworICAgICAgICBzd2l0Y2ggKGluZm8tPmZsYXNoX2lkKQorICAgICAgICB7CisgICAgICAgIGNhc2UgU1RNMjVQNjQ6CisJICAgIGluZm8tPnNlY3Rvcl9jb3VudCA9IDEyODsKKwkgICAgaW5mby0+c2l6ZSA9IDB4ODAwMDAwOyAgICAgICAgCQorICAgICAgICAgICAgZXJhc2VfcmVnaW9uX3NpemUgID0gMHgxMDAwMDsKKyAgICAgICAgICAgIGluZm8tPnJlYWRjbWQgPSAweDBiOworICAgICAgICAgICAgaW5mby0+ZHVhbHBvcnQgPSAwOworICAgICAgICAgICAgaW5mby0+ZHVtbXlieXRlID0gMTsKKyAgICAgICAgICAgIGluZm8tPmJ1ZmZlcnNpemUgPSAyNTY7CisgICAgICAgICAgICBXcml0ZUNsayA9IDQwOworICAgICAgICAgICAgRXJhc2VDbGsgPSAyMDsKKyAgICAgICAgICAgIFJlYWRDbGsgID0gNDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNUTTI1UDEyODoKKwkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gNjQ7CisJICAgIGluZm8tPnNpemUgPSAweDEwMDAwMDA7ICAgICAgICAJCisgICAgICAgICAgICBlcmFzZV9yZWdpb25fc2l6ZSAgPSAweDQwMDAwOworICAgICAgICAgICAgaW5mby0+cmVhZGNtZCA9IDB4MGI7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdWFscG9ydCA9IDA7CisgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAxOworICAgICAgICAgICAgaW5mby0+YnVmZmVyc2l6ZSA9IDI1NjsgICAgICAgICAgICAKKyAgICAgICAgICAgIFdyaXRlQ2xrID0gNTA7CisgICAgICAgICAgICBFcmFzZUNsayA9IDIwOworICAgICAgICAgICAgUmVhZENsayAgPSA1MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgTjI1UTI1NjoKKwkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gMjU2OworCSAgICBpbmZvLT5zaXplID0gMHgxMDAwMDAwOyAgICAgICAgCQorICAgICAgICAgICAgZXJhc2VfcmVnaW9uX3NpemUgID0gMHgxMDAwMDsKKyAgICAgICAgICAgIGluZm8tPnJlYWRjbWQgPSAweDBiOyAgICAgICAgICAgIAorICAgICAgICAgICAgaW5mby0+ZHVhbHBvcnQgPSAwOworICAgICAgICAgICAgaW5mby0+ZHVtbXlieXRlID0gMTsKKyAgICAgICAgICAgIGluZm8tPmJ1ZmZlcnNpemUgPSAyNTY7ICAgICAgICAgICAgCisgICAgICAgICAgICBXcml0ZUNsayA9IDUwOworICAgICAgICAgICAgRXJhc2VDbGsgPSAyMDsKKyAgICAgICAgICAgIFJlYWRDbGsgID0gNTA7CisjaWYJZGVmaW5lZChDT05GSUdfRkxBU0hfQVNUMjMwMCkgfHwgZGVmaW5lZChDT05GSUdfQVNUMTMwMCkKKwkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gNTEyOworCSAgICBpbmZvLT5zaXplID0gMHgyMDAwMDAwOworCSAgICBpbmZvLT5hZGRyZXNzMzIgPSAxOyAgICAgICAgCQorI2VuZGlmCisJICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTjI1UTUxMjoKKwkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gMjU2OworCSAgICBpbmZvLT5zaXplID0gMHgxMDAwMDAwOyAgICAgICAgCQorICAgICAgICAgICAgZXJhc2VfcmVnaW9uX3NpemUgID0gMHgxMDAwMDsKKyAgICAgICAgICAgIGluZm8tPnJlYWRjbWQgPSAweDBiOyAgICAgICAgICAgIAorICAgICAgICAgICAgaW5mby0+ZHVhbHBvcnQgPSAwOworICAgICAgICAgICAgaW5mby0+ZHVtbXlieXRlID0gMTsKKyAgICAgICAgICAgIGluZm8tPmJ1ZmZlcnNpemUgPSAyNTY7IAorICAgICAgICAgICAgaW5mby0+c3BlY2lmaWNzcGkgPSBTcGVjaWZpY1NQSV9OMjVRNTEyOyAgICAgICAgICAgCisgICAgICAgICAgICBXcml0ZUNsayA9IDUwOworICAgICAgICAgICAgRXJhc2VDbGsgPSAyMDsKKyAgICAgICAgICAgIFJlYWRDbGsgID0gNTA7CisjaWYJZGVmaW5lZChDT05GSUdfRkxBU0hfQVNUMjMwMCkgfHwgZGVmaW5lZChDT05GSUdfQVNUMTMwMCkKKwkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gMTAyNDsKKwkgICAgaW5mby0+c2l6ZSA9IDB4NDAwMDAwMDsKKwkgICAgaW5mby0+YWRkcmVzczMyID0gMTsgICAgICAgIAkKKyNlbmRpZgorCSAgICBicmVhazsKKwkgICAgCSAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBjYXNlIFcyNVgxNjoKKwkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gMzI7CisJICAgIGluZm8tPnNpemUgPSAweDIwMDAwMDsgICAgICAgIAkKKyAgICAgICAgICAgIGVyYXNlX3JlZ2lvbl9zaXplICA9IDB4MTAwMDA7CisgICAgICAgICAgICBpbmZvLT5yZWFkY21kID0gMHgzYjsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1YWxwb3J0ID0gMTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDE7CisgICAgICAgICAgICBpbmZvLT5pb21vZGUgPSBJT01PREV4MjsgCisgICAgICAgICAgICBpbmZvLT5idWZmZXJzaXplID0gMjU2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBXcml0ZUNsayA9IDUwOworICAgICAgICAgICAgRXJhc2VDbGsgPSAyNTsKKyAgICAgICAgICAgIFJlYWRDbGsgID0gNTA7ICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIFcyNVg2NDoKKwkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gMTI4OworCSAgICBpbmZvLT5zaXplID0gMHg4MDAwMDA7ICAgICAgICAJCisgICAgICAgICAgICBlcmFzZV9yZWdpb25fc2l6ZSAgPSAweDEwMDAwOworICAgICAgICAgICAgaW5mby0+cmVhZGNtZCA9IDB4M2I7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdWFscG9ydCA9IDE7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAxOworICAgICAgICAgICAgaW5mby0+aW9tb2RlID0gSU9NT0RFeDI7CisgICAgICAgICAgICBpbmZvLT5idWZmZXJzaXplID0gMjU2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgV3JpdGVDbGsgPSA1MDsKKyAgICAgICAgICAgIEVyYXNlQ2xrID0gMjU7CisgICAgICAgICAgICBSZWFkQ2xrICA9IDUwOyAgICAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBXMjVRNjRCVjoKKwkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gMTI4OworCSAgICBpbmZvLT5zaXplID0gMHg4MDAwMDA7ICAgICAgICAJCisgICAgICAgICAgICBlcmFzZV9yZWdpb25fc2l6ZSAgPSAweDEwMDAwOworICAgICAgICAgICAgaW5mby0+cmVhZGNtZCA9IDB4M2I7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdWFscG9ydCA9IDE7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAxOworICAgICAgICAgICAgaW5mby0+aW9tb2RlID0gSU9NT0RFeDI7IAorICAgICAgICAgICAgaW5mby0+YnVmZmVyc2l6ZSA9IDI1NjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgV3JpdGVDbGsgPSA4MDsKKyAgICAgICAgICAgIEVyYXNlQ2xrID0gNDA7CisgICAgICAgICAgICBSZWFkQ2xrICA9IDgwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBXMjVRMTI4QlY6CisJICAgIGluZm8tPnNlY3Rvcl9jb3VudCA9IDI1NjsKKwkgICAgaW5mby0+c2l6ZSA9IDB4MTAwMDAwMDsgICAgICAgIAkKKyAgICAgICAgICAgIGVyYXNlX3JlZ2lvbl9zaXplICA9IDB4MTAwMDA7CisgICAgICAgICAgICBpbmZvLT5yZWFkY21kID0gMHgzYjsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1YWxwb3J0ID0gMTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDE7CisgICAgICAgICAgICBpbmZvLT5pb21vZGUgPSBJT01PREV4MjsgCisgICAgICAgICAgICBpbmZvLT5idWZmZXJzaXplID0gMjU2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBXcml0ZUNsayA9IDEwNDsKKyAgICAgICAgICAgIEVyYXNlQ2xrID0gNTA7CisgICAgICAgICAgICBSZWFkQ2xrICA9IDEwNDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVzI1UTI1NkZWOgorCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSAyNTY7CisJICAgIGluZm8tPnNpemUgPSAweDEwMDAwMDA7ICAgICAgICAJCisgICAgICAgICAgICBlcmFzZV9yZWdpb25fc2l6ZSAgPSAweDEwMDAwOworICAgICAgICAgICAgaW5mby0+cmVhZGNtZCA9IDB4MGI7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdWFscG9ydCA9IDA7CisgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAxOworICAgICAgICAgICAgaW5mby0+YnVmZmVyc2l6ZSA9IDI1NjsgICAgICAgICAgICAKKyAgICAgICAgICAgIFdyaXRlQ2xrID0gNTA7CisgICAgICAgICAgICBFcmFzZUNsayA9IDIwOworICAgICAgICAgICAgUmVhZENsayAgPSA1MDsKKyNpZglkZWZpbmVkKENPTkZJR19GTEFTSF9BU1QyMzAwKSB8fCBkZWZpbmVkKENPTkZJR19BU1QxMzAwKQorCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSA1MTI7CisJICAgIGluZm8tPnNpemUgPSAweDIwMDAwMDA7CisJICAgIGluZm8tPmFkZHJlc3MzMiA9IDE7ICAgICAgICAJCisjZW5kaWYKKwkgICAgYnJlYWs7CisJICAgICAgICAgICAgICAgIAorICAgICAgICBjYXNlIFMyNUZMMDY0QToKKwkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gMTI4OworCSAgICBpbmZvLT5zaXplID0gMHg4MDAwMDA7ICAgICAgICAJCisgICAgICAgICAgICBlcmFzZV9yZWdpb25fc2l6ZSAgPSAweDEwMDAwOworICAgICAgICAgICAgaW5mby0+cmVhZGNtZCA9IDB4MGI7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdWFscG9ydCA9IDA7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAxOworICAgICAgICAgICAgaW5mby0+YnVmZmVyc2l6ZSA9IDI1NjsgICAgICAgICAgICAKKyAgICAgICAgICAgIFdyaXRlQ2xrID0gNTA7CisgICAgICAgICAgICBFcmFzZUNsayA9IDI1OworICAgICAgICAgICAgUmVhZENsayAgPSA1MDsgICAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUzI1RkwxMjhQOgorCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSAyNTY7CisJICAgIGluZm8tPnNpemUgPSAweDEwMDAwMDA7ICAgICAgICAJCisgICAgICAgICAgICBlcmFzZV9yZWdpb25fc2l6ZSAgPSAweDEwMDAwOworICAgICAgICAgICAgaW5mby0+cmVhZGNtZCA9IDB4MGI7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdWFscG9ydCA9IDA7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAxOworICAgICAgICAgICAgaW5mby0+YnVmZmVyc2l6ZSA9IDI1NjsgICAgICAgICAgICAKKyAgICAgICAgICAgIFdyaXRlQ2xrID0gMTAwOworICAgICAgICAgICAgRXJhc2VDbGsgPSA0MDsKKyAgICAgICAgICAgIFJlYWRDbGsgID0gMTAwOyAgICAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTMjVGTDI1NlM6CisJICAgIGluZm8tPnNlY3Rvcl9jb3VudCA9IDI1NjsKKwkgICAgaW5mby0+c2l6ZSA9IDB4MTAwMDAwMDsgICAgICAgIAkKKyAgICAgICAgICAgIGVyYXNlX3JlZ2lvbl9zaXplICA9IDB4MTAwMDA7CisgICAgICAgICAgICBpbmZvLT5yZWFkY21kID0gMHgwYjsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1YWxwb3J0ID0gMDsKKyAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDE7CisgICAgICAgICAgICBpbmZvLT5idWZmZXJzaXplID0gMjU2OyAgICAgICAgICAgIAorICAgICAgICAgICAgV3JpdGVDbGsgPSA1MDsKKyAgICAgICAgICAgIEVyYXNlQ2xrID0gMjA7CisgICAgICAgICAgICBSZWFkQ2xrICA9IDUwOworI2lmCWRlZmluZWQoQ09ORklHX0ZMQVNIX0FTVDIzMDApIHx8IGRlZmluZWQoQ09ORklHX0FTVDEzMDApCisJICAgIGluZm8tPnNlY3Rvcl9jb3VudCA9IDUxMjsKKwkgICAgaW5mby0+c2l6ZSA9IDB4MjAwMDAwMDsKKwkgICAgaW5mby0+YWRkcmVzczMyID0gMTsgICAgICAgIAkKKyNlbmRpZgorCSAgICBicmVhazsKKworICAgICAgICBjYXNlIE1YMjVMMjU2MzVFOgorCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSAyNTY7CisJICAgIGluZm8tPnNpemUgPSAweDEwMDAwMDA7ICAgICAgICAJCisgICAgICAgICAgICBlcmFzZV9yZWdpb25fc2l6ZSAgPSAweDEwMDAwOworICAgICAgICAgICAgaW5mby0+cmVhZGNtZCA9IDB4MGI7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdWFscG9ydCA9IDA7CisgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAxOworICAgICAgICAgICAgaW5mby0+YnVmZmVyc2l6ZSA9IDI1NjsgICAgICAgICAgICAKKyAgICAgICAgICAgIFdyaXRlQ2xrID0gNTA7CisgICAgICAgICAgICBFcmFzZUNsayA9IDIwOworICAgICAgICAgICAgUmVhZENsayAgPSA1MDsKKyNpZglkZWZpbmVkKENPTkZJR19GTEFTSF9BU1QyMzAwKSB8fCBkZWZpbmVkKENPTkZJR19BU1QxMzAwKQorCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSA1MTI7CisJICAgIGluZm8tPnNpemUgPSAweDIwMDAwMDA7CisJICAgIGluZm8tPmFkZHJlc3MzMiA9IDE7ICAgICAgICAJCisjaWYJZGVmaW5lZChDT05GSUdfRkxBU0hfU1BJeDJfRHVtbXkpCisgICAgICAgICAgICBpbmZvLT5yZWFkY21kID0gMHhiYjsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDE7CisgICAgICAgICAgICBpbmZvLT5kdWFscG9ydCA9IDE7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5pb21vZGUgPSBJT01PREV4Ml9kdW1teTsKKyNlbGlmCWRlZmluZWQoQ09ORklHX0ZMQVNIX1NQSXg0X0R1bW15KQorICAgICAgICAgICAgaW5mby0+cmVhZGNtZCA9IDB4ZWI7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAzOworICAgICAgICAgICAgaW5mby0+ZHVhbHBvcnQgPSAwOyAgICAgICAgICAgIAorICAgICAgICAgICAgaW5mby0+aW9tb2RlID0gSU9NT0RFeDRfZHVtbXk7CisgICAgICAgICAgICBpbmZvLT5xdWFkcG9ydCA9IDE7CisgICAgICAgICAgICBpbmZvLT5kdW1teWRhdGEgPSAweGFhOyAgICAgICAgICAgIAorI2VuZGlmICAgICAgICAgICAgCisjZW5kaWYgICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1YMjVMMTI4MDVEOgorCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSAyNTY7CisJICAgIGluZm8tPnNpemUgPSAweDEwMDAwMDA7ICAgICAgICAJCisgICAgICAgICAgICBlcmFzZV9yZWdpb25fc2l6ZSAgPSAweDEwMDAwOworICAgICAgICAgICAgaW5mby0+cmVhZGNtZCA9IDB4MGI7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdWFscG9ydCA9IDA7CisgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAxOworICAgICAgICAgICAgaW5mby0+YnVmZmVyc2l6ZSA9IDI1NjsgICAgICAgICAgICAKKy8qCitTQ1U3QzogU2lsaWNvbiBSZXZpc2lvbiBJRCBSZWdpc3RlcgorRFszMToyNF06IENoaXAgSUQKKzA6IEFTVDIwNTAvQVNUMjEwMC9BU1QyMTUwL0FTVDIyMDAvQVNUMzAwMAorMTogQVNUMjMwMAorCitEWzIzOjE2XSBTaWxpY29uIHJldmlzaW9uIElEIGZvciBBU1QyMzAwIGdlbmVyYXRpb24gYW5kIGxhdGVyCiswOiBBMAorMTogQTEKKzI6IEEyCisuCisuCisuCitGUEdBIHJldmlzaW9uIHN0YXJ0cyBmcm9tIDB4ODAKKworQVNUMjMwMCBBMCBTUEkgY2FuJ3QgcnVuIGZhc3RlciB0aGFuIDUwTWh6CisqLworICAgICAgICAgICAgV3JpdGVDbGsgPSA1MDsKKyAgICAgICAgICAgIEVyYXNlQ2xrID0gMjA7CisgICAgICAgICAgICBSZWFkQ2xrICA9IDUwOworCisgICAgICAgICAgICBTQ1VSZXZpc2lvbiA9ICoodWxvbmcgKikgKFNDVV9SRVZJU0lPTl9SRUdJU1RFUik7CisgICAgICAgICAgICBpZiAoKChTQ1VSZXZpc2lvbiA+PiAyNCkgJiAweGZmKSA9PSAweDAxKSB7IC8vQVNUMjMwMAorICAgICAgICAgICAgCWlmICgoKFNDVVJldmlzaW9uID4+IDE2KSAmIDB4ZmYpID09IDB4MDApIHsgLy9BMAorICAgICAgICAgICAgCQlXcml0ZUNsayA9IDI1OworICAgICAgICAgICAgCQlFcmFzZUNsayA9IDIwOworICAgICAgICAgICAgCQlSZWFkQ2xrICA9IDI1OworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIH0KKyNpZglkZWZpbmVkKENPTkZJR19GTEFTSF9BU1QyMzAwKSB8fCBkZWZpbmVkKENPTkZJR19BU1QxMzAwKQorI2lmCWRlZmluZWQoQ09ORklHX0ZMQVNIX1NQSXgyX0R1bW15KQorICAgICAgICAgICAgaW5mby0+cmVhZGNtZCA9IDB4YmI7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAxOworICAgICAgICAgICAgaW5mby0+ZHVhbHBvcnQgPSAxOyAgICAgICAgICAgIAorICAgICAgICAgICAgaW5mby0+aW9tb2RlID0gSU9NT0RFeDJfZHVtbXk7CisjZWxpZglkZWZpbmVkKENPTkZJR19GTEFTSF9TUEl4NF9EdW1teSkKKyAgICAgICAgICAgIGluZm8tPnJlYWRjbWQgPSAweGViOyAgICAgICAgICAgIAorICAgICAgICAgICAgaW5mby0+ZHVtbXlieXRlID0gMzsKKyAgICAgICAgICAgIGluZm8tPmR1YWxwb3J0ID0gMDsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmlvbW9kZSA9IElPTU9ERXg0X2R1bW15OworICAgICAgICAgICAgaW5mby0+cXVhZHBvcnQgPSAxOworICAgICAgICAgICAgaW5mby0+ZHVtbXlkYXRhID0gMHhhYTsgICAgICAgICAgICAKKyNlbmRpZiAgICAgICAgICAgIAorI2VuZGlmICAgICAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNWDI1TDE2MDVEOgorCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSAzMjsKKwkgICAgaW5mby0+c2l6ZSA9IDB4MjAwMDAwOyAgICAgICAgCQorICAgICAgICAgICAgZXJhc2VfcmVnaW9uX3NpemUgID0gMHgxMDAwMDsKKyAgICAgICAgICAgIGluZm8tPnJlYWRjbWQgPSAweDBiOyAgICAgICAgICAgIAorICAgICAgICAgICAgaW5mby0+ZHVhbHBvcnQgPSAwOworICAgICAgICAgICAgaW5mby0+ZHVtbXlieXRlID0gMTsKKyAgICAgICAgICAgIGluZm8tPmJ1ZmZlcnNpemUgPSAyNTY7ICAgICAgICAgICAgCisgICAgICAgICAgICBXcml0ZUNsayA9IDUwOworICAgICAgICAgICAgRXJhc2VDbGsgPSAyMDsKKyAgICAgICAgICAgIFJlYWRDbGsgID0gNTA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNTVDI1VkYwMTZCOgorCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSAzMjsKKwkgICAgaW5mby0+c2l6ZSA9IDB4MjAwMDAwOyAgICAgICAgCQorICAgICAgICAgICAgZXJhc2VfcmVnaW9uX3NpemUgID0gMHgxMDAwMDsKKyAgICAgICAgICAgIGluZm8tPnJlYWRjbWQgPSAweDBiOyAgICAgICAgICAgIAorICAgICAgICAgICAgaW5mby0+ZHVhbHBvcnQgPSAwOyAgICAgICAgICAgIAorICAgICAgICAgICAgaW5mby0+ZHVtbXlieXRlID0gMTsKKyAgICAgICAgICAgIGluZm8tPmJ1ZmZlcnNpemUgPSAxOyAgICAgICAgICAgIAorICAgICAgICAgICAgV3JpdGVDbGsgPSA1MDsKKyAgICAgICAgICAgIEVyYXNlQ2xrID0gMjU7CisgICAgICAgICAgICBSZWFkQ2xrICA9IDUwOyAgICAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTU1QyNVZGMDY0QzoKKwkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gMTI4OworCSAgICBpbmZvLT5zaXplID0gMHg4MDAwMDA7ICAgICAgICAJCisgICAgICAgICAgICBlcmFzZV9yZWdpb25fc2l6ZSAgPSAweDEwMDAwOworICAgICAgICAgICAgaW5mby0+cmVhZGNtZCA9IDB4MGI7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdWFscG9ydCA9IDA7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAxOworICAgICAgICAgICAgaW5mby0+YnVmZmVyc2l6ZSA9IDE7ICAgICAgICAgICAgCisgICAgICAgICAgICBXcml0ZUNsayA9IDUwOworICAgICAgICAgICAgRXJhc2VDbGsgPSAyNTsKKyAgICAgICAgICAgIFJlYWRDbGsgID0gNTA7ICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFUMjVERjE2MToKKwkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gMzI7CisJICAgIGluZm8tPnNpemUgPSAweDIwMDAwMDsgICAgICAgIAkKKyAgICAgICAgICAgIGVyYXNlX3JlZ2lvbl9zaXplICA9IDB4MTAwMDA7CisgICAgICAgICAgICBpbmZvLT5yZWFkY21kID0gMHgwYjsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1YWxwb3J0ID0gMDsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDE7CisgICAgICAgICAgICBpbmZvLT5idWZmZXJzaXplID0gMTsgICAgICAgICAgICAKKyAgICAgICAgICAgIFdyaXRlQ2xrID0gNTA7CisgICAgICAgICAgICBFcmFzZUNsayA9IDI1OworICAgICAgICAgICAgUmVhZENsayAgPSA1MDsgICAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworIAorICAgICAgICBjYXNlIEFUMjVERjMyMToKKwkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gMzI7CisJICAgIGluZm8tPnNpemUgPSAweDQwMDAwMDsgICAgICAgIAkKKyAgICAgICAgICAgIGVyYXNlX3JlZ2lvbl9zaXplICA9IDB4MTAwMDA7CisgICAgICAgICAgICBpbmZvLT5yZWFkY21kID0gMHgwYjsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1YWxwb3J0ID0gMDsgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1bW15Ynl0ZSA9IDE7CisgICAgICAgICAgICBpbmZvLT5idWZmZXJzaXplID0gMTsgICAgICAgICAgICAKKyAgICAgICAgICAgIFdyaXRlQ2xrID0gNTA7CisgICAgICAgICAgICBFcmFzZUNsayA9IDI1OworICAgICAgICAgICAgUmVhZENsayAgPSA1MDsgICAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBkZWZhdWx0OgkvKiB1c2UgSkVERUMgSUQgKi8KKyAgICAgICAgICAgIGVyYXNlX3JlZ2lvbl9zaXplICA9IDB4MTAwMDA7CisgICAgICAgICAgICBpbmZvLT5yZWFkY21kID0gMHgwYjsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGluZm8tPmR1YWxwb3J0ICA9IDA7ICAgICAgICAgICAgCisgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAxOworICAgICAgICAgICAgaW5mby0+YnVmZmVyc2l6ZSA9IDE7ICAgICAgICAgICAgCisgICAgICAgICAgICBXcml0ZUNsayA9IDUwOworICAgICAgICAgICAgRXJhc2VDbGsgPSAyNTsKKyAgICAgICAgICAgIFJlYWRDbGsgID0gNTA7ICAKKyAgICAgICAgICAgIGlmICgoaW5mby0+Zmxhc2hfaWQgJiAweEZGKSA9PSAweDFGKQkvKiBBdG1lbCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiAweDAwMUYwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAweDAwMDQwMDoJCisgICAgICAgIAkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gODsKKyAgICAJICAgICAgICAgICAgaW5mby0+c2l6ZSA9IDB4ODAwMDA7ICAgICAgICAJCisJICAgICAgICAgICAgYnJlYWs7CSAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSAweDAwMDUwMDoJCisgICAgICAgIAkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gMTY7CisgICAgCSAgICAgICAgICAgIGluZm8tPnNpemUgPSAweDEwMDAwMDsgICAgICAgIAkKKwkgICAgICAgICAgICBicmVhazsJICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDAwNjAwOgkKKyAgICAgICAgCSAgICBpbmZvLT5zZWN0b3JfY291bnQgPSAzMjsKKyAgICAJICAgICAgICAgICAgaW5mby0+c2l6ZSA9IDB4MjAwMDAwOyAgICAgICAgCQorCSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHgwMDA3MDA6CQorICAgICAgICAJICAgIGluZm8tPnNlY3Rvcl9jb3VudCA9IDY0OworICAgIAkgICAgICAgICAgICBpbmZvLT5zaXplID0gMHg0MDAwMDA7ICAgICAgICAJCisJICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDAwMDgwMDoJCisgICAgICAgIAkgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gMTI4OworICAgIAkgICAgICAgICAgICBpbmZvLT5zaXplID0gMHg4MDAwMDA7ICAgICAgICAJCisJICAgICAgICAgICAgYnJlYWs7CSAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgMHgwMDA5MDA6CQorICAgICAgICAJICAgIGluZm8tPnNlY3Rvcl9jb3VudCA9IDI1NjsKKyAgICAJICAgICAgICAgICAgaW5mby0+c2l6ZSA9IDB4MTAwMDAwMDsgICAgICAgIAkKKwkgICAgICAgICAgICBicmVhazsJICAgICAgICAgICAgCSAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQ2FuJ3Qgc3VwcG9ydCB0aGlzIFNQSSBGbGFzaCEhIFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwkgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9ICAgCSAgICAgICAgICAgIAorICAgICAgICAgICAgfSAvKiBBdG1lbCBKREVDICovICAgICAgICAKKyAgICAgICAgICAgIGVsc2UJLyogSkRFQyAqLwkJCQkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGluZm8tPmZsYXNoX2lkICYgMHhGRjAwMDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMHgxMjAwMDA6CQorICAgICAgICAJICAgIGluZm8tPnNlY3Rvcl9jb3VudCA9IDQ7CisgICAgCSAgICAgICAgICAgIGluZm8tPnNpemUgPSAweDQwMDAwOyAgICAgICAgCQorCSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHgxMzAwMDA6CQorCSAgICAgICAgICAgIGluZm8tPnNlY3Rvcl9jb3VudCA9IDg7CisJICAgICAgICAgICAgaW5mby0+c2l6ZSA9IDB4ODAwMDA7ICAgICAgICAJCisJICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDE0MDAwMDoJCisJICAgICAgICAgICAgaW5mby0+c2VjdG9yX2NvdW50ID0xNjsKKwkgICAgICAgICAgICBpbmZvLT5zaXplID0gMHgxMDAwMDA7ICAgICAgICAJCisJICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDE1MDAwMDoJCisJICAgICAgICAgICAgaW5mby0+c2VjdG9yX2NvdW50ID0zMjsKKwkgICAgICAgICAgICBpbmZvLT5zaXplID0gMHgyMDAwMDA7ICAgICAgICAJCisJICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDE2MDAwMDoJCisJICAgICAgICAgICAgaW5mby0+c2VjdG9yX2NvdW50ID02NDsKKwkgICAgICAgICAgICBpbmZvLT5zaXplID0gMHg0MDAwMDA7ICAgICAgICAJCisJICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDE3MDAwMDoJCisJICAgICAgICAgICAgaW5mby0+c2VjdG9yX2NvdW50ID0xMjg7CisJICAgICAgICAgICAgaW5mby0+c2l6ZSA9IDB4ODAwMDAwOyAgICAgICAgCQorCSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHgxODAwMDA6CQorCSAgICAgICAgICAgIGluZm8tPnNlY3Rvcl9jb3VudCA9MjU2OworCSAgICAgICAgICAgIGluZm8tPnNpemUgPSAweDEwMDAwMDA7ICAgICAgICAJCisJICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDE5MDAwMDoJCisJICAgICAgICAgICAgaW5mby0+c2VjdG9yX2NvdW50ID0yNTY7CisJICAgICAgICAgICAgaW5mby0+c2l6ZSA9IDB4MTAwMDAwMDsKKyNpZglkZWZpbmVkKENPTkZJR19GTEFTSF9BU1QyMzAwKSB8fCBkZWZpbmVkKENPTkZJR19BU1QxMzAwKQorCSAgICAgICAgICAgIGluZm8tPnNlY3Rvcl9jb3VudCA9IDUxMjsKKwkgICAgICAgICAgICBpbmZvLT5zaXplID0gMHgyMDAwMDAwOworCSAgICAgICAgICAgIGluZm8tPmFkZHJlc3MzMiA9IDE7ICAgICAgICAJCisjaWYJZGVmaW5lZChDT05GSUdfRkxBU0hfU1BJeDJfRHVtbXkpCisgICAgICAgICAgICAgICAgICAgIGluZm8tPnJlYWRjbWQgPSAweGJiOyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAxOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5kdWFscG9ydCA9IDE7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGluZm8tPmlvbW9kZSA9IElPTU9ERXgyX2R1bW15OworI2VsaWYJZGVmaW5lZChDT05GSUdfRkxBU0hfU1BJeDRfRHVtbXkpCisgICAgICAgICAgICAgICAgICAgIGluZm8tPnJlYWRjbWQgPSAweGViOyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAzOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5kdWFscG9ydCA9IDA7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGluZm8tPmlvbW9kZSA9IElPTU9ERXg0X2R1bW15OworICAgICAgICAgICAgICAgICAgICBpbmZvLT5xdWFkcG9ydCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmR1bW15ZGF0YSA9IDB4YWE7ICAgICAgICAgICAgCisjZW5kaWYgICAgICAgICAgICAKKyNlbmRpZiAgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkKKwkgICAgICAgICAgICBicmVhazsKKwkgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjYXNlIDB4MjAwMDAwOgkKKwkgICAgICAgICAgICBpbmZvLT5zZWN0b3JfY291bnQgPTI1NjsKKwkgICAgICAgICAgICBpbmZvLT5zaXplID0gMHgxMDAwMDAwOworICAgICAgICAgICAgICAgICAgICBpZiAoKGluZm8tPmZsYXNoX2lkICYgMHhGRikgPT0gMHgyMCkJLyogbnVtb255eCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c3BlY2lmaWNzcGkgPSBTcGVjaWZpY1NQSV9OMjVRNTEyOworI2lmCWRlZmluZWQoQ09ORklHX0ZMQVNIX0FTVDIzMDApIHx8IGRlZmluZWQoQ09ORklHX0FTVDEzMDApCisJICAgICAgICAgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gMTAyNDsKKwkgICAgICAgICAgICBpbmZvLT5zaXplID0gMHg0MDAwMDAwOworCSAgICAgICAgICAgIGluZm8tPmFkZHJlc3MzMiA9IDE7ICAgICAgICAJCisjaWYJZGVmaW5lZChDT05GSUdfRkxBU0hfU1BJeDJfRHVtbXkpCisgICAgICAgICAgICAgICAgICAgIGluZm8tPnJlYWRjbWQgPSAweGJiOyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAxOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5kdWFscG9ydCA9IDE7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGluZm8tPmlvbW9kZSA9IElPTU9ERXgyX2R1bW15OworI2VsaWYJZGVmaW5lZChDT05GSUdfRkxBU0hfU1BJeDRfRHVtbXkpCisgICAgICAgICAgICAgICAgICAgIGluZm8tPnJlYWRjbWQgPSAweGViOyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpbmZvLT5kdW1teWJ5dGUgPSAzOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5kdWFscG9ydCA9IDA7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGluZm8tPmlvbW9kZSA9IElPTU9ERXg0X2R1bW15OworICAgICAgICAgICAgICAgICAgICBpbmZvLT5xdWFkcG9ydCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmR1bW15ZGF0YSA9IDB4YWE7ICAgICAgICAgICAgCisjZW5kaWYgICAgICAgICAgICAKKyNlbmRpZiAgICAgICAgICAgICAJICAgICAgICAgICAgICAgIAkKKwkgICAgICAgICAgICBicmVhazsKKwkgICAgICAgICAgICAJICAgICAgICAJICAgICAgICAgICAgCSAgICAgICAgCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJDYW4ndCBzdXBwb3J0IHRoaXMgU1BJIEZsYXNoISEgXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfSAgICAKKyAgICAgICAgICAgIH0gLyogSkRFQyAqLyAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgCQkJCQorICAgICAgICBkZWJ1ZyAoImVyYXNlX3JlZ2lvbl9jb3VudCA9ICVkIGVyYXNlX3JlZ2lvbl9zaXplID0gJWRcbiIsCisJCWVyYXNlX3JlZ2lvbl9jb3VudCwgZXJhc2VfcmVnaW9uX3NpemUpOworCisJc2VjdG9yID0gYmFzZTsJCQkKKwlmb3IgKGogPSAwOyBqIDwgaW5mby0+c2VjdG9yX2NvdW50OyBqKyspIHsKKwkJCisJCWluZm8tPnN0YXJ0W2pdID0gc2VjdG9yOworCQlzZWN0b3IgKz0gZXJhc2VfcmVnaW9uX3NpemU7CisJCWluZm8tPnByb3RlY3Rbal0gPSAwOyAvKiBkZWZhdWx0OiBub3QgcHJvdGVjdGVkICovCisJfQorCisgICAgICAgIC8qIHNldCBTUEkgZmxhc2ggZXh0ZW5kZWQgaW5mbyAqLworI2lmIAlkZWZpbmVkKENPTkZJR19BU1QxMzAwKQorCWlmIChpbmZvLT5zaXplID4gMHgyMDAwMDApCS8qIGxpbWl0IE1BWCBGbGFzaCB0byAyTUIgZm9yIEFTVDEzMDAgKi8KKwkgICAgaW5mby0+c2l6ZSA9IDB4MjAwMDAwOworI2VuZGlmCisjaWYJZGVmaW5lZChDT05GSUdfQVNUMjQwMCkgfHwgZGVmaW5lZChDT05GSUdfQVNUMjMwMCkgfHwgZGVmaW5lZChDT05GSUdfQVNUMjMwMF9GUEdBXzEpIHx8IGRlZmluZWQoQ09ORklHX0FTVDIzMDBfRlBHQV8yKSB8fCBkZWZpbmVkKENPTkZJR19BU1QxMzAwKQorICAgICAgICByZWcgPSAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwMjQpOworICAgICAgICBpZiAocmVnICYgMHg0MDAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmVnID0gKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNmUyMDcwKTsJICAgICAgICAKKwkgICAgICAgIAorICAgICAgICAgICAgdWxSZWZQTEwgPSAyNDsKKyAgICAgICAgICAgIHVsRGVOdW1lcmF0b3IgPSByZWcgJiAweDBGOworICAgICAgICAgICAgdWxOdW1lcmF0b3IgPSAocmVnICYgMHgwN0UwKSA+PiA1OworICAgICAgICAgICAgdWxPRCA9IChyZWcgJiAweDEwKSA/IDE6MjsgICAgICAgICAgICAgICAgICAgIAorICAgICAJICAgIAorICAgICAgICAgICAgY3B1Y2xrID0gdWxSZWZQTEwgKiB1bE9EICogKHVsTnVtZXJhdG9yICsgMikgLyAodWxEZU51bWVyYXRvciArIDEpOyAgICAKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVnID0gKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNmUyMDcwKTsJICAgICAgICAKKyNpZglkZWZpbmVkKENPTkZJR19BU1QyNDAwKQorICAgICAgICAgICAgaWYgKHJlZyAmIDB4MDA4MDAwMDApCS8vcmVmLiBjbGs6MjVNSHoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlZyAmIDB4MzAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDAwOgorICAgICAgICAgICAgICAgICAgICBjcHVjbGsgPSA0MDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHgxMDA6CisgICAgICAgICAgICAgICAgICAgIGNwdWNsayA9IDM3NTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAKKyAgICAgICAgICAgICAgICBjYXNlIDB4MjAwOgorICAgICAgICAgICAgICAgICAgICBjcHVjbGsgPSAzNTA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSAweDMwMDoKKyAgICAgICAgICAgICAgICAgICAgY3B1Y2xrID0gMzI1OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CSAgICAgICAgICAgIAkgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gICAgICAgIAorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAocmVnICYgMHgzMDApCS8vcmVmLiBjbGs6MjRNSHoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAweDAwMDoKKyAgICAgICAgICAgICAgICAgICAgY3B1Y2xrID0gMzg0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MTAwOgorICAgICAgICAgICAgICAgICAgICBjcHVjbGsgPSAzNjA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSAweDIwMDoKKyAgICAgICAgICAgICAgICAgICAgY3B1Y2xrID0gMzM2OworICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgMHgzMDA6CisgICAgICAgICAgICAgICAgICAgIGNwdWNsayA9IDMxMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQkgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyNlbHNlCSAgICAgICAgCisgICAgICAgICAgICBzd2l0Y2ggKHJlZyAmIDB4MzAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAweDAwMDoKKyAgICAgICAgICAgICAgICAgY3B1Y2xrID0gMzg0OworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgxMDA6CisgICAgICAgICAgICAgICAgIGNwdWNsayA9IDM2MDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgMHgyMDA6CisgICAgICAgICAgICAgICAgIGNwdWNsayA9IDMzNjsKKyAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgMHgzMDA6CisgICAgICAgICAgICAgICAgIGNwdWNsayA9IDQwODsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjZW5kaWYgICAgICAgICAgICAKKyAgICAgICAgfQkKKyAgICAgICAgCisgICAgICAgIHJlZyA9ICooKHZvbGF0aWxlIHVsb25nKikgMHgxZTZlMjA3MCk7ICAgICAgICAKKyAgICAgICAgc3dpdGNoIChyZWcgJiAweGMwMCkKKyAgICAgICAgeworICAgICAgICBjYXNlIDB4MDAwOgorICAgICAgICAgICAgICAgICBjcHVjbGsgLz0gMTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg0MDA6CisgICAgICAgICAgICAgICAgIGNwdWNsayAvPSAyOworICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgIAorICAgICAgICBjYXNlIDB4ODAwOgkKKyAgICAgICAgICAgICAgICAgY3B1Y2xrIC89IDQ7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4QzAwOgkKKyAgICAgICAgICAgICAgICAgY3B1Y2xrIC89IDM7CisgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9CisjZWxzZQkvKiBBU1QyMTAwICovICAgICAgICAKKyAgICAgICAgcmVnID0gKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNmUyMDcwKTsKKyAgICAgICAgc3dpdGNoIChyZWcgJiAweGUwMCkKKyAgICAgICAgeworICAgICAgICBjYXNlIDB4MDAwOgorICAgICAgICAgICAgICAgICBjcHVjbGsgPSAyNjY7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MjAwOgorICAgICAgICAgICAgICAgICBjcHVjbGsgPSAyMzM7CisgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgCisgICAgICAgIGNhc2UgMHg0MDA6CisgICAgICAgICAgICAgICAgIGNwdWNsayA9IDIwMDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAKKyAgICAgICAgY2FzZSAweDYwMDoKKyAgICAgICAgICAgICAgICAgY3B1Y2xrID0gMTY2OworICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgIAorICAgICAgICBjYXNlIDB4ODAwOgorICAgICAgICAgICAgICAgICBjcHVjbGsgPSAxMzM7CisgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgCisgICAgICAgIGNhc2UgMHhBMDA6CisgICAgICAgICAgICAgICAgIGNwdWNsayA9IDEwMDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAKKyAgICAgICAgY2FzZSAweEMwMDoKKyAgICAgICAgICAgICAgICAgY3B1Y2xrID0gMzAwOworICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgIAorICAgICAgICBjYXNlIDB4RTAwOgkKKyAgICAgICAgICAgICAgICAgY3B1Y2xrID0gMjQ7CisgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgCisgICAgICAgIH0JCisgICAgICAgIHN3aXRjaCAocmVnICYgMHgzMDAwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMHgxMDAwOgorICAgICAgICAgICAgICAgICBjcHVjbGsgLz0gMjsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgyMDAwOgorICAgICAgICAgICAgICAgICBjcHVjbGsgLz0gNDsKKyAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAKKyAgICAgICAgY2FzZSAweDMwMDA6CQorICAgICAgICAgICAgICAgICBjcHVjbGsgLz0gMzsKKyAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAKKyAgICAgICAgfQorI2VuZGlmCisKKyNpZglkZWZpbmVkKENPTkZJR19BU1QyNDAwKSB8fCBkZWZpbmVkKENPTkZJR19BU1QyMzAwKSB8fCBkZWZpbmVkKENPTkZJR19BU1QyMzAwX0ZQR0FfMSkgfHwgZGVmaW5lZChDT05GSUdfQVNUMjMwMF9GUEdBXzIpIHx8IGRlZmluZWQoQ09ORklHX0FTVDEzMDApCisKKyNpZiAgICAgZGVmaW5lZChDT05GSUdfQVNUMjMwMCkgfHwgZGVmaW5lZChDT05GSUdfQVNUMTMwMCkKKyAgICAgICAgLyogbGltaXQgTWF4IFNQSSBDTEsgdG8gNTBNSHogKERhdGFzaGVldCB2MS4yKSAqLworICAgICAgICBpZiAoV3JpdGVDbGsgPiA1MCkgV3JpdGVDbGsgPSA1MDsKKyAgICAgICAgaWYgKEVyYXNlQ2xrID4gNTApIEVyYXNlQ2xrID0gNTA7CisgICAgICAgIGlmIChSZWFkQ2xrID4gNTApICBSZWFkQ2xrICA9IDUwOworI2VuZGlmCisKKyAgICAgICAgZGl2ID0gMTsKKyAgICAgICAgd2hpbGUgKCAoKGNwdWNsay9kaXYpID4gV3JpdGVDbGspICYmIChkaXYgPCAxNikgKQorICAgICAgICB7CisgICAgICAgICAgICBkaXYrKzsJCisgICAgICAgIH0KKyAgICAgICAgaW5mby0+dENLX1dyaXRlID0gQVNUMjMwMF9TUElDTEtfRElWW2Rpdi0xXTsKKyAgICAgICAgCisgICAgICAgIGRpdiA9IDE7CisgICAgICAgIHdoaWxlICggKChjcHVjbGsvZGl2KSA+IEVyYXNlQ2xrKSAmJiAoZGl2IDwgMTYpICkKKyAgICAgICAgeworICAgICAgICAgICAgZGl2Kys7CQorICAgICAgICB9ICAgICAgICAKKyAgICAgICAgaW5mby0+dENLX0VyYXNlID0gQVNUMjMwMF9TUElDTEtfRElWW2Rpdi0xXTsKKworICAgICAgICBkaXYgPSAxOworICAgICAgICB3aGlsZSAoICgoY3B1Y2xrL2RpdikgPiBSZWFkQ2xrKSAmJiAoZGl2IDwgMTYpICkKKyAgICAgICAgeworICAgICAgICAgICAgZGl2Kys7CQorICAgICAgICB9ICAgICAgICAKKyAgICAgICAgaW5mby0+dENLX1JlYWQgPSBBU1QyMzAwX1NQSUNMS19ESVZbZGl2LTFdOworI2Vsc2UgICAgICAgIAkKKyAgICAgICAgZGl2ID0gMjsKKyAgICAgICAgaW5mby0+dENLX1dyaXRlID0gNzsKKyAgICAgICAgd2hpbGUgKCAoY3B1Y2xrL2RpdikgPiBXcml0ZUNsayApCisgICAgICAgIHsKKyAgICAgICAgICAgIGluZm8tPnRDS19Xcml0ZS0tOwkKKyAgICAgICAgICAgIGRpdiArPTI7CQorICAgICAgICB9CisgICAgICAgIGRpdiA9IDI7CisgICAgICAgIGluZm8tPnRDS19FcmFzZSA9IDc7CisgICAgICAgIHdoaWxlICggKGNwdWNsay9kaXYpID4gRXJhc2VDbGsgKQorICAgICAgICB7CisgICAgICAgICAgICBpbmZvLT50Q0tfRXJhc2UtLTsJCisgICAgICAgICAgICBkaXYgKz0yOwkKKyAgICAgICAgfQorICAgICAgICBkaXYgPSAyOworICAgICAgICBpbmZvLT50Q0tfUmVhZCA9IDc7CisgICAgICAgIHdoaWxlICggKGNwdWNsay9kaXYpID4gUmVhZENsayApCisgICAgICAgIHsKKyAgICAgICAgICAgIGluZm8tPnRDS19SZWFkLS07CQorICAgICAgICAgICAgZGl2ICs9MjsJCisgICAgICAgIH0KKyNlbmRpZgorCQorCS8qIHVucHJvdGVjdCBmbGFzaCAqLwkKKyAgICAgICAgd3JpdGVfc3RhdHVzX3JlZ2lzdGVyKGluZm8sIDApOworCisgICAgICAgIGlmIChpbmZvLT5xdWFkcG9ydCkKKyAgICAgICAgICAgIHdyaXRlX3N0YXR1c19yZWdpc3RlcihpbmZvLCAweDQwKTsJLyogZW5hYmxlIFFFICovCisKKyAgICAgICAgaWYgKGluZm8tPmFkZHJlc3MzMikJIAorICAgICAgICB7ICAgICAgICAgIAorICAgICAgICAgICAgcmVnID0gKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNmUyMDcwKTsJLyogc2V0IEgvVyBUcmFwcGluZ3MgKi8KKyAgICAgICAgICAgIHJlZyB8PSAweDEwOworICAgICAgICAgICAgKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNmUyMDcwKSA9IHJlZzsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmVnICA9ICooKHZvbGF0aWxlIHVsb25nKikgMHgxZTYyMDAwNCk7CS8qIGVuYWJsZSAzMmIgY29udHJvbCBiaXQqLworICAgICAgICAgICAgcmVnIHw9ICgweDAxIDw8IGluZm8tPkNFKTsKKyAgICAgICAgICAgICooKHZvbGF0aWxlIHVsb25nKikgMHgxZTYyMDAwNCkgPSByZWc7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIHNldCBmbGFzaCBjaGlwcyB0byAzMmJpdHMgYWRkcmVzc2luZyBtb2RlICovCisgICAgICAgICAgICBpZiAoKGluZm8tPmZsYXNoX2lkICYgMHhGRikgPT0gMHgwMSkJLyogU3BhbnNpb24gKi8KKyAgICAgICAgICAgICAgICBlbmFibGU0Yl9zcGFuc2lvbihpbmZvKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKChpbmZvLT5mbGFzaF9pZCAmIDB4RkYpID09IDB4MjApCS8qIE51bW9ueXggKi8KKyAgICAgICAgICAgICAgICBlbmFibGU0Yl9udW1vbnl4KGluZm8pOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGVsc2UgLyogTVhJQywgV2luYm9uZCAqLworICAgICAgICAgICAgICAgIGVuYWJsZTRiKGluZm8pOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgfSAgICAKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHJlc2V0X2ZsYXNoKGluZm8pOworICAgICAgICAKKwlyZXR1cm4gKGluZm8tPnNpemUpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCBmbGFzaF93cml0ZV9idWZmZXIgKGZsYXNoX2luZm9fdCAqaW5mbywgdWNoYXIgKnNyYywgdWxvbmcgYWRkciwgaW50IGxlbikKK3sKKyAgICAgICAgdWxvbmcgaiwgYmFzZSwgb2Zmc2V0OworICAgICAgICB1bG9uZyB1bFNNTUJhc2UsIHVsQ3RybERhdGEsIEN0cmxPZmZzZXQ7CisgICAgICAgIHVjaGFyIGpSZWc7CisKKyAgICAgICAgaWYgKGluZm8tPkNFID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEN0cmxPZmZzZXQgPSBTUElDdHJsUmVnT2Zmc2V0MjsKKyAgICAgICAgfSAgICAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdHJsT2Zmc2V0ID0gU1BJQ3RybFJlZ09mZnNldDsKKyAgICAgICAgfSAgICAKKyAgICAgICAgICAgIAorCWJhc2UgPSBpbmZvLT5zdGFydFswXTsKKwlvZmZzZXQgPSBhZGRyIC0gYmFzZTsKKwliYXNlID0gZmxhc2hfbWFrZV9hZGRyIChpbmZvLCAwLCAwKTsKKwkKKyAgICAgICAgZW5hYmxlX3dyaXRlIChpbmZvKTsKKworICAgICAgICB1bEN0cmxEYXRhICA9IChpbmZvLT50Q0tfV3JpdGUgPDwgOCk7CisKKyAgICAgICAgdWxDdHJsRGF0YSAmPSBDTURfTUFTSzsKKyAgICAgICAgdWxDdHJsRGF0YSB8PSBDRV9MT1cgfCBVU0VSTU9ERTsKKyAgICAgICAgKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBDdHJsT2Zmc2V0KSA9IHVsQ3RybERhdGE7CisgICAgICAgIHVkZWxheSgyMDApOworICAgICAgICAqKHVjaGFyICopIChiYXNlKSA9ICh1Y2hhcikgKDB4MDIpOworICAgICAgICB1ZGVsYXkoMTApOworICAgICAgICBpZiAoaW5mby0+YWRkcmVzczMyKQorICAgICAgICB7CisgICAgICAgICAgICAqKHVjaGFyICopIChiYXNlKSA9ICh1Y2hhcikgKChvZmZzZXQgJiAweGZmMDAwMDAwKSA+PiAyNCk7CisgICAgICAgICAgICB1ZGVsYXkoMTApOworICAgICAgICB9CisgICAgICAgICoodWNoYXIgKikgKGJhc2UpID0gKHVjaGFyKSAoKG9mZnNldCAmIDB4ZmYwMDAwKSA+PiAxNik7CisgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgICoodWNoYXIgKikgKGJhc2UpID0gKHVjaGFyKSAoKG9mZnNldCAmIDB4MDBmZjAwKSA+PiA4KTsKKyAgICAgICAgdWRlbGF5KDEwKTsKKyAgICAgICAgKih1Y2hhciAqKSAoYmFzZSkgPSAodWNoYXIpICgob2Zmc2V0ICYgMHgwMDAwZmYpKTsKKyAgICAgICAgdWRlbGF5KDEwKTsKKworICAgICAgICBmb3IgKGo9MDsgajxsZW47IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgKih1Y2hhciAqKSAoYmFzZSkgPSAqKHVjaGFyICopIChzcmMrKyk7CisgICAgICAgICAgICB1ZGVsYXkoMTApOworICAgICAgICB9ICAgIAorICAgICAgICAgICAgICAgICAKKyAgICAgICAgdWxDdHJsRGF0YSAmPSBDTURfTUFTSzsKKyAgICAgICAgdWxDdHJsRGF0YSB8PSBDRV9ISUdIIHwgVVNFUk1PREU7CisgICAgICAgICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgICAgICB1ZGVsYXkoMjAwKTsKKworICAgICAgICB1bEN0cmxEYXRhICY9IENNRF9NQVNLOworICAgICAgICB1bEN0cmxEYXRhIHw9IENFX0xPVyB8IFVTRVJNT0RFOworICAgICAgICAqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIEN0cmxPZmZzZXQpID0gdWxDdHJsRGF0YTsKKyAgICAgICAgdWRlbGF5KDIwMCk7CisgICAgICAgICoodWNoYXIgKikgKGJhc2UpID0gKHVjaGFyKSAoMHgwNSk7CisgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgalJlZyA9ICoodm9sYXRpbGUgdWNoYXIgKikgKGJhc2UpOworICAgICAgICB9IHdoaWxlICgoalJlZyAmIDB4MDEpKTsKKyAgICAgICAgdWxDdHJsRGF0YSAmPSBDTURfTUFTSzsKKyAgICAgICAgdWxDdHJsRGF0YSB8PSBDRV9ISUdIIHwgVVNFUk1PREU7CisgICAgICAgICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgICAgICB1ZGVsYXkoMjAwKTsKKworICAgICAgICAvKiBSRlNSICovCisgICAgICAgIGlmIChpbmZvLT5zcGVjaWZpY3NwaSA9PSBTcGVjaWZpY1NQSV9OMjVRNTEyKQorICAgICAgICB7CisgICAgICAgICAgICB1bEN0cmxEYXRhICY9IENNRF9NQVNLOworICAgICAgICAgICAgdWxDdHJsRGF0YSB8PSBDRV9MT1cgfCBVU0VSTU9ERTsKKyAgICAgICAgICAgICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgICAgICAgICAgdWRlbGF5KDIwMCk7CisgICAgICAgICAgICAqKHVjaGFyICopIChiYXNlKSA9ICh1Y2hhcikgKDB4NzApOworICAgICAgICAgICAgdWRlbGF5KDEwKTsKKyAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBqUmVnID0gKih2b2xhdGlsZSB1Y2hhciAqKSAoYmFzZSk7CisgICAgICAgICAgICB9IHdoaWxlICghKGpSZWcgJiAweDgwKSk7CisgICAgICAgICAgICB1bEN0cmxEYXRhICY9IENNRF9NQVNLOworICAgICAgICAgICAgdWxDdHJsRGF0YSB8PSBDRV9ISUdIIHwgVVNFUk1PREU7CisgICAgICAgICAgICAqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIEN0cmxPZmZzZXQpID0gdWxDdHJsRGF0YTsKKyAgICAgICAgICAgIHVkZWxheSgyMDApOworICAgICAgICB9ICAgICAgICAgICAKK30JCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBleHBvcnQgZnVuY3Rpb25zCisgKiAgCisgKi8KKyAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIAorICovCit1bnNpZ25lZCBsb25nIGZsYXNoX2luaXQgKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBzaXplID0gMDsKKwlpbnQgaTsKKworCS8qIEluaXQ6IG5vIEZMQVNIZXMga25vd24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1M7ICsraSkgeworCQlmbGFzaF9pbmZvW2ldLmZsYXNoX2lkID0gRkxBU0hfVU5LTk9XTjsKKwkJc2l6ZSArPSBmbGFzaF9pbmZvW2ldLnNpemUgPSBmbGFzaF9nZXRfc2l6ZSAoYmFua19iYXNlW2ldLCBpKTsKKwkJaWYgKGZsYXNoX2luZm9baV0uZmxhc2hfaWQgPT0gRkxBU0hfVU5LTk9XTikgeworI2lmbmRlZiBDRkdfRkxBU0hfUVVJRVRfVEVTVAorCQkJcHJpbnRmICgiIyMgVW5rbm93biBGTEFTSCBvbiBCYW5rICVkIC0gU2l6ZSA9IDB4JTA4bHggPSAlbGQgTUJcbiIsCisJCQkJaSwgZmxhc2hfaW5mb1tpXS5zaXplLCBmbGFzaF9pbmZvW2ldLnNpemUgPDwgMjApOworI2VuZGlmIC8qIENGR19GTEFTSF9RVUlFVF9URVNUICovCisJCX0KKwl9CisKKwkvKiBNb25pdG9yIHByb3RlY3Rpb24gT04gYnkgZGVmYXVsdCAqLworI2lmIChDT05GSUdfTU9OSVRPUl9CQVNFID49IENPTkZJR19TWVNfRkxBU0hfQkFTRSkKKwlmbGFzaF9wcm90ZWN0IChGTEFHX1BST1RFQ1RfU0VULAorCQkgICAgICAgQ09ORklHX01PTklUT1JfQkFTRSwKKwkJICAgICAgIENPTkZJR19NT05JVE9SX0JBU0UgKyBtb25pdG9yX2ZsYXNoX2xlbiAgLSAxLAorCQkgICAgICAgZmxhc2hfZ2V0X2luZm8oQ09ORklHX01PTklUT1JfQkFTRSkpOworI2VuZGlmCisKKwkvKiBFbnZpcm9ubWVudCBwcm90ZWN0aW9uIE9OIGJ5IGRlZmF1bHQgKi8KKyNpZmRlZiBDT05GSUdfRU5WX0lTX0lOX0ZMQVNICisJZmxhc2hfcHJvdGVjdCAoRkxBR19QUk9URUNUX1NFVCwKKwkJICAgICAgIENPTkZJR19FTlZfQUREUiwKKwkJICAgICAgIENPTkZJR19FTlZfQUREUiArIENPTkZJR19FTlZfU0VDVF9TSVpFIC0gMSwKKwkJICAgICAgIGZsYXNoX2dldF9pbmZvKENPTkZJR19FTlZfQUREUikpOworI2VuZGlmCisKKwkvKiBSZWR1bmRhbnQgZW52aXJvbm1lbnQgcHJvdGVjdGlvbiBPTiBieSBkZWZhdWx0ICovCisjaWZkZWYgQ09ORklHX0VOVl9BRERSX1JFRFVORAorCWZsYXNoX3Byb3RlY3QgKEZMQUdfUFJPVEVDVF9TRVQsCisJCSAgICAgICBDT05GSUdfRU5WX0FERFJfUkVEVU5ELAorCQkgICAgICAgQ09ORklHX0VOVl9BRERSX1JFRFVORCArIENPTkZJR19FTlZfU0laRV9SRURVTkQgLSAxLAorCQkgICAgICAgZmxhc2hfZ2V0X2luZm8oQ09ORklHX0VOVl9BRERSX1JFRFVORCkpOworI2VuZGlmCisJcmV0dXJuIChzaXplKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWYgZGVmaW5lZChDT05GSUdfRU5WX0lTX0lOX0ZMQVNIKSB8fCBkZWZpbmVkKENPTkZJR19FTlZfQUREUl9SRURVTkQpIHx8IChDT05GSUdfTU9OSVRPUl9CQVNFID49IENPTkZJR19TWVNfRkxBU0hfQkFTRSkKK3N0YXRpYyBmbGFzaF9pbmZvX3QgKmZsYXNoX2dldF9pbmZvKHVsb25nIGJhc2UpCit7CisJaW50IGk7CisJZmxhc2hfaW5mb190ICogaW5mbyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1M7IGkgKyspIHsKKwkJaW5mbyA9ICYgZmxhc2hfaW5mb1tpXTsKKwkJaWYgKGluZm8tPnNpemUgJiYgaW5mby0+c3RhcnRbMF0gPD0gYmFzZSAmJgorCQkgICAgYmFzZSA8PSBpbmZvLT5zdGFydFswXSArIGluZm8tPnNpemUgLSAxKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGkgPT0gQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1MgPyAwIDogaW5mbzsKK30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2ludCBmbGFzaF9lcmFzZSAoZmxhc2hfaW5mb190ICogaW5mbywgaW50IHNfZmlyc3QsIGludCBzX2xhc3QpCit7CisJaW50IHJjb2RlID0gMDsKKwlpbnQgcHJvdDsKKwlmbGFzaF9zZWN0X3Qgc2VjdDsKKworICAgICAgICB1bG9uZyBiYXNlLCBvZmZzZXQ7CisgICAgICAgIHVsb25nIHVsU01NQmFzZSwgdWxDdHJsRGF0YSwgQ3RybE9mZnNldDsKKyAgICAgICAgdWNoYXIgalJlZzsKKyAgICAgICAgCisgICAgICAgIGRpc2FibGVfY2FjaGUoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChpbmZvLT5DRSA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICBDdHJsT2Zmc2V0ID0gU1BJQ3RybFJlZ09mZnNldDI7CisgICAgICAgIH0gICAgCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3RybE9mZnNldCA9IFNQSUN0cmxSZWdPZmZzZXQ7CisgICAgICAgIH0gICAgCisgICAgICAgICAgICAgICAgICAgIAorCWlmICgoc19maXJzdCA8IDApIHx8IChzX2ZpcnN0ID4gc19sYXN0KSkgeworCQlwdXRzICgiLSBubyBzZWN0b3JzIHRvIGVyYXNlXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcHJvdCA9IDA7CisJZm9yIChzZWN0ID0gc19maXJzdDsgc2VjdCA8PSBzX2xhc3Q7ICsrc2VjdCkgeworCQlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSkgeworCQkJcHJvdCsrOworCQl9CisJfQorCWlmIChwcm90KSB7CisJCXByaW50ZiAoIi0gV2FybmluZzogJWQgcHJvdGVjdGVkIHNlY3RvcnMgd2lsbCBub3QgYmUgZXJhc2VkIVxuIiwgcHJvdCk7CisJfSBlbHNlIHsKKwkJcHV0YyAoJ1xuJyk7CisJfQorCisgICAgICAgIHVsQ3RybERhdGEgID0gKGluZm8tPnRDS19FcmFzZSA8PCA4KTsKKwlmb3IgKHNlY3QgPSBzX2ZpcnN0OyBzZWN0IDw9IHNfbGFzdDsgc2VjdCsrKSB7CisJCWlmIChpbmZvLT5wcm90ZWN0W3NlY3RdID09IDApIHsgLyogbm90IHByb3RlY3RlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgZXJhc2luZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlX3dyaXRlKGluZm8pOworCisJICAgICAgICAgICAgICAgIGJhc2UgPSBpbmZvLT5zdGFydFswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGluZm8tPnN0YXJ0W3NlY3RdIC0gYmFzZTsKKwkgICAgICAgICAgICAgICAgYmFzZSA9IGZsYXNoX21ha2VfYWRkciAoaW5mbywgMCwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHVsQ3RybERhdGEgJj0gQ01EX01BU0s7CisgICAgICAgICAgICAgICAgICAgICAgICB1bEN0cmxEYXRhIHw9IENFX0xPVyB8IFVTRVJNT0RFOworICAgICAgICAgICAgICAgICAgICAgICAgKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBDdHJsT2Zmc2V0KSA9IHVsQ3RybERhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICB1ZGVsYXkoMjAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICoodWNoYXIgKikgKGJhc2UpID0gKHVjaGFyKSAoMHhkOCk7CisgICAgICAgICAgICAgICAgICAgICAgICB1ZGVsYXkoMTApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8tPmFkZHJlc3MzMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih1Y2hhciAqKSAoYmFzZSkgPSAodWNoYXIpICgob2Zmc2V0ICYgMHhmZjAwMDAwMCkgPj4gMjQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAqKHVjaGFyICopIChiYXNlKSA9ICh1Y2hhcikgKChvZmZzZXQgJiAweGZmMDAwMCkgPj4gMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgdWRlbGF5KDEwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICoodWNoYXIgKikgKGJhc2UpID0gKHVjaGFyKSAoKG9mZnNldCAmIDB4MDBmZjAwKSA+PiA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHVjaGFyICopIChiYXNlKSA9ICh1Y2hhcikgKChvZmZzZXQgJiAweDAwMDBmZikpOworICAgICAgICAgICAgICAgICAgICAgICAgdWRlbGF5KDEwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdWxDdHJsRGF0YSAmPSBDTURfTUFTSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVsQ3RybERhdGEgfD0gQ0VfSElHSCB8IFVTRVJNT0RFOworICAgICAgICAgICAgICAgICAgICAgICAgKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBDdHJsT2Zmc2V0KSA9IHVsQ3RybERhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICB1ZGVsYXkoMjAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdWxDdHJsRGF0YSAmPSBDTURfTUFTSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVsQ3RybERhdGEgfD0gQ0VfTE9XIHwgVVNFUk1PREU7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIEN0cmxPZmZzZXQpID0gdWxDdHJsRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVkZWxheSgyMDApOworICAgICAgICAgICAgICAgICAgICAgICAgKih1Y2hhciAqKSAoYmFzZSkgPSAodWNoYXIpICgweDA1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgalJlZyA9ICoodm9sYXRpbGUgdWNoYXIgKikgKGJhc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoKGpSZWcgJiAweDAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1bEN0cmxEYXRhICY9IENNRF9NQVNLOworICAgICAgICAgICAgICAgICAgICAgICAgdWxDdHJsRGF0YSB8PSBDRV9ISUdIIHwgVVNFUk1PREU7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIEN0cmxPZmZzZXQpID0gdWxDdHJsRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVkZWxheSgyMDApOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBSRlNSICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+c3BlY2lmaWNzcGkgPT0gU3BlY2lmaWNTUElfTjI1UTUxMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bEN0cmxEYXRhICY9IENNRF9NQVNLOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsQ3RybERhdGEgfD0gQ0VfTE9XIHwgVVNFUk1PREU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBDdHJsT2Zmc2V0KSA9IHVsQ3RybERhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRlbGF5KDIwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih1Y2hhciAqKSAoYmFzZSkgPSAodWNoYXIpICgweDcwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZGVsYXkoMTApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalJlZyA9ICoodm9sYXRpbGUgdWNoYXIgKikgKGJhc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKCEoalJlZyAmIDB4ODApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bEN0cmxEYXRhICY9IENNRF9NQVNLOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsQ3RybERhdGEgfD0gQ0VfSElHSCB8IFVTRVJNT0RFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgQ3RybE9mZnNldCkgPSB1bEN0cmxEYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkZWxheSgyMDApOworICAgICAgICAgICAgICAgICAgICAgICAgfSAgIAorICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlwdXRjICgnLicpOworCQl9CisJfQorCXB1dHMgKCIgZG9uZVxuIik7CisJCisJcmVzZXRfZmxhc2goaW5mbyk7CisJCisJcmV0dXJuIHJjb2RlOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgZmxhc2hfcHJpbnRfaW5mbyAoZmxhc2hfaW5mb190ICogaW5mbykKK3sKKwlwdXRjICgnXG4nKTsKKwlyZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHkgbWVtb3J5IHRvIGZsYXNoLCByZXR1cm5zOgorICogMCAtIE9LCisgKiAxIC0gd3JpdGUgdGltZW91dAorICogMiAtIEZsYXNoIG5vdCBlcmFzZWQKKyAqLworaW50IHdyaXRlX2J1ZmYgKGZsYXNoX2luZm9fdCAqIGluZm8sIHVjaGFyICogc3JjLCB1bG9uZyBhZGRyLCB1bG9uZyBjbnQpCit7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGNoYXIgcGF0W10gPSB7J3wnLCAnLScsICcvJywgJ1xcJ307CisJaW50IHBhdGNudDsKKwkKKyAgICAgICAgZGlzYWJsZV9jYWNoZSgpOwkKKyAgICAgICAgCisJLyogZ2V0IGxvd2VyIGFsaWduZWQgYWRkcmVzcyAqLwkKKyAgICAgICAgaWYgKGFkZHIgJiAoaW5mby0+YnVmZmVyc2l6ZSAtIDEpKQorICAgICAgICB7CisgICAgICAgICAgICBjb3VudCA9IGNudCA+PSBpbmZvLT5idWZmZXJzaXplID8gKGluZm8tPmJ1ZmZlcnNpemUgLSAoYWRkciAmIDB4ZmYpKTpjbnQ7CQorICAgICAgICAgICAgZmxhc2hfd3JpdGVfYnVmZmVyIChpbmZvLCBzcmMsIGFkZHIsIGNvdW50KTsKKyAgICAgICAgICAgIGFkZHIrPSBjb3VudDsKKyAgICAgICAgICAgIHNyYyArPSBjb3VudDsKKyAgICAgICAgICAgIGNudCAtPSBjb3VudDsJCisgICAgICAgIH0KKwkKKwkvKiBwcm9nICovCQkKKwl3aGlsZSAoY250ID4gMCkgewkJCQkKKwkgICAgY291bnQgPSBjbnQgPj0gaW5mby0+YnVmZmVyc2l6ZSA/IGluZm8tPmJ1ZmZlcnNpemU6Y250OworICAgICAgICAgICAgZmxhc2hfd3JpdGVfYnVmZmVyIChpbmZvLCBzcmMsIGFkZHIsIGNvdW50KTsKKyAgICAgICAgICAgIGFkZHIrPSBjb3VudDsKKyAgICAgICAgICAgIHNyYyArPSBjb3VudDsKKyAgICAgICAgICAgIGNudCAtPSBjb3VudDsKKyAgICAgICAgICAgIHByaW50ZigiJWNcYiIsIHBhdFsocGF0Y250KyspICYgMHgwM10pOyAgICAgICAgICAgIAkgICAgIAkKKwl9IAkJCisKKwlyZXNldF9mbGFzaChpbmZvKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCisjaWZkZWYJQ09ORklHX0ZMQVNIX0FTVDIzMDBfRE1BCit2b2lkICogbWVtbW92ZV9kbWEodm9pZCAqIGRlc3QsY29uc3Qgdm9pZCAqc3JjLHNpemVfdCBjb3VudCkKK3sKKwl1bG9uZyBjb3VudF9hbGlnbiwgcG9sbF90aW1lLCBkYXRhOworCQorCWNvdW50X2FsaWduID0gKGNvdW50ICsgMykgJiAweEZGRkZGRkZDOwkvKiA0LWJ5dGVzIGFsaWduICovCisgICAgICAgIHBvbGxfdGltZSA9IDEwMDsJCQkvKiBzZXQgMTAwIHVzIGFzIGRlZmF1bHQgKi8KKworICAgICAgICAvKiBmb3JjZSBlbmQgb2YgYnVyc3QgcmVhZCAqLworCSoodm9sYXRpbGUgdWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgU1BJQ3RybFJlZ09mZnNldCkgfD0gQ0VfSElHSDsKKwkqKHZvbGF0aWxlIHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIFNQSUN0cmxSZWdPZmZzZXQpICY9IH5DRV9ISUdIOworICAgICAgICAgIAorCSoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgUkVHX0ZMQVNIX0RNQV9DT05UUk9MKSA9ICh1bG9uZykgKH5GTEFTSF9ETUFfRU5BQkxFKTsJCisJKih1bG9uZyAqKSAoU1RDQmFzZUFkZHJlc3MgKyBSRUdfRkxBU0hfRE1BX0ZMQVNIX0JBU0UpID0gKHVsb25nICopIChzcmMpOworCSoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgUkVHX0ZMQVNIX0RNQV9EUkFNX0JBU0UpID0gKHVsb25nICopIChkZXN0KTsKKwkqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIFJFR19GTEFTSF9ETUFfTEVOR1RIKSA9ICh1bG9uZykgKGNvdW50X2FsaWduKTsKKwkqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIFJFR19GTEFTSF9ETUFfQ09OVFJPTCkgPSAodWxvbmcpIChGTEFTSF9ETUFfRU5BQkxFKTsKKwkKKwkvKiB3YWl0IHBvbGwgKi8KKwlkbyB7CisJICAgIHVkZWxheShwb2xsX3RpbWUpOwkKKwkgICAgZGF0YSA9ICoodWxvbmcgKikgKFNUQ0Jhc2VBZGRyZXNzICsgUkVHX0ZMQVNIX0lOVEVSUlVQVF9TVEFUVVMpOworCX0gd2hpbGUgKCEoZGF0YSAmIEZMQVNIX1NUQVRVU19ETUFfUkVBRFkpKTsKKwkKKwkvKiBjbGVhciBzdGF0dXMgKi8KKwkqKHVsb25nICopIChTVENCYXNlQWRkcmVzcyArIFJFR19GTEFTSF9JTlRFUlJVUFRfU1RBVFVTKSB8PSBGTEFTSF9TVEFUVVNfRE1BX0NMRUFSOworfQkKKyNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19GTEFTSF9TUEkgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2FzcGVlZC9hc3QyNDAwL2hhY3Rlc3QuYyBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL2hhY3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZmE4N2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDI0MDAvaGFjdGVzdC5jCkBAIC0wLDAgKzEsNzYyIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBEaWFnbm9zdGljcyBzdXBwb3J0CisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8cG9zdC5oPgorI2luY2x1ZGUgInNsdC5oIgorCisjaWYgKChDRkdfQ01EX1NMVCAmIENGR19DTURfSEFDVEVTVCkgJiYgZGVmaW5lZChDT05GSUdfU0xUKSkKKyNpbmNsdWRlICJoYWN0ZXN0LmgiCisKKyNpbmNsdWRlICJhZXMuYyIKKyNpbmNsdWRlICJyYzQuYyIKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY3J5cHRvX3NyY1tDUllQVE9fTUFYX1NSQ10sIGNyeXB0b19kc3RbQ1JZUFRPX01BWF9EU1RdLCBjcnlwdG9fY29udGV4dFtDUllQVE9fTUFYX0NPTlRFWFRdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgaGFzaF9zcmNbSEFTSF9NQVhfU1JDXSwgaGFzaF9kc3RbSEFTSF9NQVhfRFNUXSwgaG1hY19rZXlbSE1BQ19NQVhfS0VZXTsKKworLyoKKyAqIHRhYmxlIAorICovCitzdGF0aWMgYWVzX3Rlc3QgYWVzdGVzdFtdID0geworICAgIHsgQ1JZUFRPTU9ERV9FQ0IsIDEyOCwKKyAgICAgezB4MmIsIDB4N2UsIDB4MTUsIDB4MTYsIDB4MjgsIDB4YWUsIDB4ZDIsIDB4YTYsIDB4YWIsIDB4ZjcsIDB4MTUsIDB4ODgsIDB4MDksIDB4Y2YsIDB4NGYsIDB4M2MsICdcMCd9LAorICAgICB7MHgzMiwgMHg0MywgMHhmNiwgMHhhOCwgMHg4OCwgMHg1YSwgMHgzMCwgMHg4ZCwgMHgzMSwgMHgzMSwgMHg5OCwgMHhhMiwgMHhlMCwgMHgzNywgMHgwNywgMHgzNCwgJ1wwJ30sCisgICAgIHsweDM5LCAweDI1LCAweDg0LCAweDFkLCAweDAyLCAweGRjLCAweDA5LCAweGZiLCAweGRjLCAweDExLCAweDg1LCAweDk3LCAweDE5LCAweDZhLCAweDBiLCAweDMyLCAnXDAnfSB9LAorICAgIHsweEZGLCAweEZGLCAiIiwgIiIsICIifSwJCS8qIEVuZCBNYXJrICovCit9OworCitzdGF0aWMgcmM0X3Rlc3QgcmM0dGVzdFtdID0geworICAgIHt7MHgwMSwgMHgyMywgMHg0NSwgMHg2NywgMHg4OSwgMHhhYiwgMHhjZCwgMHhlZiwgJ1wwJ30sCisgICAgIHsweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweGFiLCAweGNkLCAweGVmLCAnXDAnfX0sIAkKKyAgICB7ezB4ZmZ9LCB7MHhmZn19LAkJCQkvKiBFbmQgTWFyayAqLwkKK307CisKK3N0YXRpYyBoYXNoX3Rlc3QgaGFzaHRlc3RbXSA9IHsKKyAgICB7SEFTSE1PREVfU0hBMSwgMjAsCisgICAgICJhYmMiLAorICAgICB7MHg1MywgMHgyMCwgMHhiMCwgMHg4YywgMHhhMSwgMHhmNSwgMHg3NCwgMHg2MiwgMHg1MCwgMHg3MSwgMHg4OSwgMHg0MSwgMHhjNSwgMHgwYSwgMHhkZiwgMHg0ZSwgMHhiYiwgMHg1NSwgMHg3NiwgMHgwNiwgJ1wwJ319LAorICAgIHsweEZGLCAweEZGLCAiIiwgIiJ9LAkJCS8qIEVuZCBNYXJrICovIAorfTsKKworc3RhdGljIGhtYWNfdGVzdCBobWFjdGVzdFtdID0geworICAgIHtIQVNITU9ERV9TSEExLCA2NCwgMjAsCisgICAgIHsweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsICdcMCcgfSwKKyAgICAgIlNhbXBsZSAjMSIsCisgICAgIHsweGJmLCAweDM5LCAweGRhLCAweGIxLCAweDdkLCAweGMyLCAweGUxLCAweDIzLCAweDBkLCAweDI4LCAweDM1LCAweDNiLCAweDhjLCAweGNiLCAweDE0LCAweGI2LCAweDIyLCAweDAyLCAweDY1LCAweGIzLCAnXDAnfX0sCisgICAgezB4RkYsIDB4RkYsIDB4RkYsICIiLCAiIiwgIiJ9LAkJCS8qIEVuZCBNYXJrICovIAorfTsKKwordm9pZCBFbmFibGVITUFDKHZvaWQpCit7CisgICAgdW5zaWduZWQgbG9uZyB1bERhdGE7CisgICAgCQorICAgIC8qIGluaXQgU0NVICovCisgICAgKih1bnNpZ25lZCBsb25nICopICgweDFlNmUyMDAwKSA9IDB4MTY4OGE4YTg7CisgICAgCisgICAgdWxEYXRhID0gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopICgweDFlNmUyMDBjKTsKKyAgICB1bERhdGEgJj0gMHhmZGZmZjsKKyAgICAqKHVuc2lnbmVkIGxvbmcgKikgKDB4MWU2ZTIwMGMpID0gdWxEYXRhOworICAgIHVkZWxheSgxMDApOworICAgIHVsRGF0YSA9ICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoMHgxZTZlMjAwNCk7CisgICAgdWxEYXRhICY9IDB4ZmZmZWY7CisgICAgKih1bnNpZ25lZCBsb25nICopICgweDFlNmUyMDA0KSA9IHVsRGF0YTsKKyAgICAKK30KKworLyogQUVTICovCit2b2lkIGFlc19lbmNfYXN0MzAwMChhZXNfY29udGV4dCAqY3R4LCB1aW50OCAqaW5wdXQsIHVpbnQ4ICppdiwgdWludDggKm91dHB1dCwgdWludDMyIHVsTXNnTGVuZ3RoICwgdWludDMyIHVsQUVTTW9kZSkKK3sKKworICAgIHVuc2lnbmVkIGxvbmcgaSwgdWxUZW1wLCB1bENvbW1hbmQ7CisgICAgdW5zaWduZWQgY2hhciBjaDsKKyAgICB1bnNpZ25lZCBjaGFyICpwanNyYywgKnBqZHN0LCAqcGpjb250ZXh0OworICAgIAorICAgIHVsQ29tbWFuZCA9IENSWVBUT19FTkFCTEVfUlcgfCBDUllQVE9fRU5BQkxFX0NPTlRFWFRfTE9BRCB8IENSWVBUT19FTkFCTEVfQ09OVEVYVF9TQVZFIHwgXAorICAgICAgICAgICAgICAgIENSWVBUT19BRVMgfCBDUllQVE9fRU5DUllQVE8gfCBDUllQVE9fU1lOQ19NT0RFX0FTWU5DOworCisgICAgc3dpdGNoIChjdHgtPm5yKQorICAgIHsKKyAgICBjYXNlIDEwOgorICAgICAgICB1bENvbW1hbmQgfD0gQ1JZUFRPX0FFUzEyODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjoKKyAgICAgICAgdWxDb21tYW5kIHw9IENSWVBUT19BRVMxOTI7CisgICAgICAgIGJyZWFrOyAgICAKKyAgICBjYXNlIDE0OgorICAgICAgICB1bENvbW1hbmQgfD0gQ1JZUFRPX0FFUzI1NjsKKyAgICAgICAgYnJlYWs7ICAgIAorICAgIH0KKworICAgIHN3aXRjaCAodWxBRVNNb2RlKQorICAgIHsKKyAgICBjYXNlIENSWVBUT01PREVfRUNCOgorICAgICAgICB1bENvbW1hbmQgfD0gQ1JZUFRPX0FFU19FQ0I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1JZUFRPTU9ERV9DQkM6CisgICAgICAgIHVsQ29tbWFuZCB8PSBDUllQVE9fQUVTX0NCQzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDUllQVE9NT0RFX0NGQjoKKyAgICAgICAgdWxDb21tYW5kIHw9IENSWVBUT19BRVNfQ0ZCOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENSWVBUT01PREVfT0ZCOgorICAgICAgICB1bENvbW1hbmQgfD0gQ1JZUFRPX0FFU19PRkI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1JZUFRPTU9ERV9DVFI6CisgICAgICAgIHVsQ29tbWFuZCB8PSBDUllQVE9fQUVTX0NUUjsKKyAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgIAorICAgIH0KKworICAgIHBqc3JjID0gKHVuc2lnbmVkIGNoYXIgKikgbTE2Ynl0ZUFsaWdubWVudCgodW5zaWduZWQgbG9uZykgY3J5cHRvX3NyYyk7CisgICAgcGpkc3QgPSAodW5zaWduZWQgY2hhciAqKSBtMTZieXRlQWxpZ25tZW50KCh1bnNpZ25lZCBsb25nKSBjcnlwdG9fZHN0KTsKKyAgICBwamNvbnRleHQgPSAodW5zaWduZWQgY2hhciAqKSBtMTZieXRlQWxpZ25tZW50KCh1bnNpZ25lZCBsb25nKSBjcnlwdG9fY29udGV4dCk7CisgICAgCQorICAgIC8qIEluaXQgSFcgKi8KKyAgICAqKHVuc2lnbmVkIGxvbmcgKikgKEhBQ19SRUdfQkFTRSArIFJFR19DUllQVE9fU1JDX0JBU0VfT0ZGU0VUKSA9ICh1bnNpZ25lZCBsb25nKSBwanNyYzsKKyAgICAqKHVuc2lnbmVkIGxvbmcgKikgKEhBQ19SRUdfQkFTRSArIFJFR19DUllQVE9fRFNUX0JBU0VfT0ZGU0VUKSA9ICh1bnNpZ25lZCBsb25nKSBwamRzdDsKKyAgICAqKHVuc2lnbmVkIGxvbmcgKikgKEhBQ19SRUdfQkFTRSArIFJFR19DUllQVE9fQ09OVEVYVF9CQVNFX09GRlNFVCkgPSAodW5zaWduZWQgbG9uZykgcGpjb250ZXh0OworICAgICoodW5zaWduZWQgbG9uZyAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0NSWVBUT19MRU5fT0ZGU0VUKSA9IHVsTXNnTGVuZ3RoOworCisgICAgLyogU2V0IHNvdXJjZSAqLworICAgIGZvciAoaT0wOyBpPCB1bE1zZ0xlbmd0aDsgaSsrKQorICAgIHsKKyAgICAJY2ggPSAqKHVpbnQ4ICopKGlucHV0ICsgaSk7ICAgIAkKKyAgICAJKih1aW50OCAqKSAocGpzcmMgKyBpKSA9IGNoOworICAgIH0KKyAgICAgCisgICAgLyogU2V0IENvbnRleHQgKi8KKyAgICAvKiBTZXQgSVYgKi8KKyAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQorICAgIHsKKyAgICAgICAgY2ggPSAqKHVpbnQ4ICopIChpdiArIGkpOworICAgIAkqKHVpbnQ4ICopIChwamNvbnRleHQgKyBpKSA9IGNoOworICAgIH0KKyAgICAgICAKKyAgICAvKiBTZXQgRXhwYW5zaW9uIEtleSAqLyAgIAorICAgIGZvciAoaT0wOyBpPCg0KihjdHgtPm5yKzEpKTsgaSsrKQorICAgIHsKKyAgICAgICAgdWxUZW1wID0gKChjdHgtPmVya1tpXSAmIDB4RkYpIDw8IDI0KSArICgoY3R4LT5lcmtbaV0gJiAweEZGMDApIDw8IDgpICsgKChjdHgtPmVya1tpXSAmIDB4RkYwMDAwKSA+PiA4KSArICgoY3R4LT5lcmtbaV0gJiAweEZGMDAwMDAwKSA+PiAyNCk7CisgICAgCSoodWludDMyICopIChwamNvbnRleHQgKyBpKjQgKyAxNikgPSB1bFRlbXA7CisgICAgfQorCisgICAgLyogZmlyZSBjbWQgKi8KKyAgICAqKHVuc2lnbmVkIGxvbmcgKikgKEhBQ19SRUdfQkFTRSArIFJFR19DUllQVE9fQ01EX0JBU0VfT0ZGU0VUKSA9IHVsQ29tbWFuZDsKKyAgICBkbyB7CisgICAgICAgIHVsVGVtcCA9ICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0NSWVBUT19TVEFUVVNfT0ZGU0VUKTsKKyAgICB9IHdoaWxlICh1bFRlbXAgJiBDUllQVE9fQlVTWSk7CQorICAgIAorICAgIC8qIE91dHB1dCAqLworICAgIGZvciAoaT0wOyBpPHVsTXNnTGVuZ3RoOyBpKyspCisgICAgeworICAgICAgICBjaCA9ICoodWludDggKikgKHBqZHN0ICsgaSk7ICAgICAgICAKKyAgICAgICAgKih1aW50OCAqKSAob3V0cHV0ICsgaSkgPSBjaDsgICAgCisgICAgfQorICAgIAorfSAvKiBhZXNfZW5jX2FzdDMwMDAgKi8KKworCit2b2lkIGFlc19kZWNfYXN0MzAwMChhZXNfY29udGV4dCAqY3R4LCB1aW50OCAqaW5wdXQsIHVpbnQ4ICppdiwgdWludDggKm91dHB1dCwgdWludDMyIHVsTXNnTGVuZ3RoICwgdWludDMyIHVsQUVTTW9kZSkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGksIHVsVGVtcCwgdWxDb21tYW5kOworICAgIHVuc2lnbmVkIGNoYXIgY2g7CisgICAgdW5zaWduZWQgY2hhciAqcGpzcmMsICpwamRzdCwgKnBqY29udGV4dDsKKyAgICAKKyAgICB1bENvbW1hbmQgPSBDUllQVE9fRU5BQkxFX1JXIHwgQ1JZUFRPX0VOQUJMRV9DT05URVhUX0xPQUQgfCBDUllQVE9fRU5BQkxFX0NPTlRFWFRfU0FWRSB8IFwKKyAgICAgICAgICAgICAgICBDUllQVE9fQUVTIHwgQ1JZUFRPX0RFQ1JZUFRPIHwgQ1JZUFRPX1NZTkNfTU9ERV9BU1lOQzsKKworICAgIHN3aXRjaCAoY3R4LT5ucikKKyAgICB7CisgICAgY2FzZSAxMDoKKyAgICAgICAgdWxDb21tYW5kIHw9IENSWVBUT19BRVMxMjg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTI6CisgICAgICAgIHVsQ29tbWFuZCB8PSBDUllQVE9fQUVTMTkyOworICAgICAgICBicmVhazsgICAgCisgICAgY2FzZSAxNDoKKyAgICAgICAgdWxDb21tYW5kIHw9IENSWVBUT19BRVMyNTY7CisgICAgICAgIGJyZWFrOyAgICAKKyAgICB9CisKKyAgICBzd2l0Y2ggKHVsQUVTTW9kZSkKKyAgICB7CisgICAgY2FzZSBDUllQVE9NT0RFX0VDQjoKKyAgICAgICAgdWxDb21tYW5kIHw9IENSWVBUT19BRVNfRUNCOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENSWVBUT01PREVfQ0JDOgorICAgICAgICB1bENvbW1hbmQgfD0gQ1JZUFRPX0FFU19DQkM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1JZUFRPTU9ERV9DRkI6CisgICAgICAgIHVsQ29tbWFuZCB8PSBDUllQVE9fQUVTX0NGQjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDUllQVE9NT0RFX09GQjoKKyAgICAgICAgdWxDb21tYW5kIHw9IENSWVBUT19BRVNfT0ZCOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENSWVBUT01PREVfQ1RSOgorICAgICAgICB1bENvbW1hbmQgfD0gQ1JZUFRPX0FFU19DVFI7CisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAKKyAgICB9CisKKyAgICBwanNyYyA9ICh1bnNpZ25lZCBjaGFyICopIG0xNmJ5dGVBbGlnbm1lbnQoKHVuc2lnbmVkIGxvbmcpIGNyeXB0b19zcmMpOworICAgIHBqZHN0ID0gKHVuc2lnbmVkIGNoYXIgKikgbTE2Ynl0ZUFsaWdubWVudCgodW5zaWduZWQgbG9uZykgY3J5cHRvX2RzdCk7CisgICAgcGpjb250ZXh0ID0gKHVuc2lnbmVkIGNoYXIgKikgbTE2Ynl0ZUFsaWdubWVudCgodW5zaWduZWQgbG9uZykgY3J5cHRvX2NvbnRleHQpOworCQorICAgIC8qIEluaXQgSFcgKi8KKyAgICAqKHVuc2lnbmVkIGxvbmcgKikgKEhBQ19SRUdfQkFTRSArIFJFR19DUllQVE9fU1JDX0JBU0VfT0ZGU0VUKSA9ICh1bnNpZ25lZCBsb25nKSBwanNyYzsKKyAgICAqKHVuc2lnbmVkIGxvbmcgKikgKEhBQ19SRUdfQkFTRSArIFJFR19DUllQVE9fRFNUX0JBU0VfT0ZGU0VUKSA9ICh1bnNpZ25lZCBsb25nKSBwamRzdDsKKyAgICAqKHVuc2lnbmVkIGxvbmcgKikgKEhBQ19SRUdfQkFTRSArIFJFR19DUllQVE9fQ09OVEVYVF9CQVNFX09GRlNFVCkgPSAodW5zaWduZWQgbG9uZykgcGpjb250ZXh0OworICAgICoodW5zaWduZWQgbG9uZyAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0NSWVBUT19MRU5fT0ZGU0VUKSA9IHVsTXNnTGVuZ3RoOworCisgICAgLyogU2V0IHNvdXJjZSAqLworICAgIGZvciAoaT0wOyBpPCB1bE1zZ0xlbmd0aDsgaSsrKQorICAgIHsKKyAgICAJY2ggPSAqKHVpbnQ4ICopKGlucHV0ICsgaSk7ICAgIAkKKyAgICAJKih1aW50OCAqKSAocGpzcmMgKyBpKSA9IGNoOworICAgIH0KKyAgICAgCisgICAgLyogU2V0IENvbnRleHQgKi8KKyAgICAvKiBTZXQgSVYgKi8KKyAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQorICAgIHsKKyAgICAgICAgY2ggPSAqKHVpbnQ4ICopIChpdiArIGkpOworICAgIAkqKHVpbnQ4ICopIChwamNvbnRleHQgKyBpKSA9IGNoOworICAgIH0KKyAgICAgICAKKyAgICAvKiBTZXQgRXhwYW5zaW9uIEtleSAqLyAgIAorICAgIGZvciAoaT0wOyBpPCg0KihjdHgtPm5yKzEpKTsgaSsrKQorICAgIHsKKyAgICAgICAgdWxUZW1wID0gKChjdHgtPmVya1tpXSAmIDB4RkYpIDw8IDI0KSArICgoY3R4LT5lcmtbaV0gJiAweEZGMDApIDw8IDgpICsgKChjdHgtPmVya1tpXSAmIDB4RkYwMDAwKSA+PiA4KSArICgoY3R4LT5lcmtbaV0gJiAweEZGMDAwMDAwKSA+PiAyNCk7CisgICAgCSoodWludDMyICopIChwamNvbnRleHQgKyBpKjQgKyAxNikgPSB1bFRlbXA7CisgICAgfQorCisgICAgLyogZmlyZSBjbWQgKi8KKyAgICAqKHVuc2lnbmVkIGxvbmcgKikgKEhBQ19SRUdfQkFTRSArIFJFR19DUllQVE9fQ01EX0JBU0VfT0ZGU0VUKSA9IHVsQ29tbWFuZDsKKyAgICBkbyB7CisgICAgICAgIHVsVGVtcCA9ICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0NSWVBUT19TVEFUVVNfT0ZGU0VUKTsKKyAgICB9IHdoaWxlICh1bFRlbXAgJiBDUllQVE9fQlVTWSk7CQorICAgIAorICAgIC8qIE91dHB1dCAqLworICAgIGZvciAoaT0wOyBpPHVsTXNnTGVuZ3RoOyBpKyspCisgICAgeworICAgICAgICBjaCA9ICoodWludDggKikgKHBqZHN0ICsgaSk7ICAgICAgICAKKyAgICAgICAgKih1aW50OCAqKSAob3V0cHV0ICsgaSkgPSBjaDsgICAgCisgICAgfQorCit9IC8qIGFlc19kZWNfYXN0MzAwMCAqLworCit2b2lkIHJjNF9jcnlwdF9hc3QzMDAwKHVpbnQ4ICpkYXRhLCBpbnQgdWxNc2dMZW5ndGgsIHVpbnQ4ICpyYzRfa2V5LCB1aW50MzIgdWxLZXlMZW5ndGgpCit7CisgICAgc3RydWN0IHJjNF9zdGF0ZSBzOworICAgIHVuc2lnbmVkIGxvbmcgaSwgdWxUZW1wLCB1bENvbW1hbmQ7CisgICAgdW5zaWduZWQgY2hhciBjaDsKKyAgICB1bnNpZ25lZCBjaGFyICpwanNyYywgKnBqZHN0LCAqcGpjb250ZXh0OworCisgICAgdWxDb21tYW5kID0gQ1JZUFRPX0VOQUJMRV9SVyB8IENSWVBUT19FTkFCTEVfQ09OVEVYVF9MT0FEIHwgQ1JZUFRPX0VOQUJMRV9DT05URVhUX1NBVkUgfCBcCisgICAgICAgICAgICAgICAgQ1JZUFRPX1JDNCB8IENSWVBUT19TWU5DX01PREVfQVNZTkM7CisKKyAgICByYzRfc2V0dXAoICZzLCByYzRfa2V5LCB1bEtleUxlbmd0aCApOworCisgICAgcGpzcmMgPSAodW5zaWduZWQgY2hhciAqKSBtMTZieXRlQWxpZ25tZW50KCh1bnNpZ25lZCBsb25nKSBjcnlwdG9fc3JjKTsKKyAgICBwamRzdCA9ICh1bnNpZ25lZCBjaGFyICopIG0xNmJ5dGVBbGlnbm1lbnQoKHVuc2lnbmVkIGxvbmcpIGNyeXB0b19kc3QpOworICAgIHBqY29udGV4dCA9ICh1bnNpZ25lZCBjaGFyICopIG0xNmJ5dGVBbGlnbm1lbnQoKHVuc2lnbmVkIGxvbmcpIGNyeXB0b19jb250ZXh0KTsKKwkKKyAgICAvKiBJbml0IEhXICovCisgICAgKih1aW50MzIgKikgKEhBQ19SRUdfQkFTRSArIFJFR19DUllQVE9fU1JDX0JBU0VfT0ZGU0VUKSA9ICh1bnNpZ25lZCBsb25nKSBwanNyYzsJCisgICAgKih1aW50MzIgKikgKEhBQ19SRUdfQkFTRSArIFJFR19DUllQVE9fRFNUX0JBU0VfT0ZGU0VUKSA9ICh1bnNpZ25lZCBsb25nKSBwamRzdDsJCisgICAgKih1aW50MzIgKikgKEhBQ19SRUdfQkFTRSArIFJFR19DUllQVE9fQ09OVEVYVF9CQVNFX09GRlNFVCkgPSAodW5zaWduZWQgbG9uZykgcGpjb250ZXh0OwkKKyAgICAqKHVpbnQzMiAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0NSWVBUT19MRU5fT0ZGU0VUKSA9IHVsTXNnTGVuZ3RoOwkKKyAgICAgICAgICAJCisKKyAgICAvKiBTZXQgc291cmNlICovCisgICAgZm9yIChpPTA7IGk8IHVsTXNnTGVuZ3RoOyBpKyspCisgICAgeworICAgIAljaCA9ICoodWludDggKikoZGF0YSArIGkpOworICAgIAkqKHVpbnQ4ICopIChwanNyYyArIGkpID0gY2g7CisgICAgfQorICAgICAKKyAgICAvKiBTZXQgQ29udGV4dCAqLworICAgIC8qIFNldCBpLCBqICovCisgICAgKih1aW50MzIgKikgKHBqY29udGV4dCArIDgpID0gMHgwMDAxOwkKKyAgICAgICAKKyAgICAvKiBTZXQgRXhwYW5zaW9uIEtleSAqLyAgIAorICAgIGZvciAoaT0wOyBpPCgyNTYvNCk7IGkrKykKKyAgICB7CisgICAgICAgdWxUZW1wID0gKHMubVtpICogNF0gJiAweEZGKSArICgocy5tW2kgKiA0ICsgMV0gJiAweEZGKSA8PCA4KSArICgocy5tW2kgKiA0ICsgMl0gJiAweEZGKSA8PCAxNikgKyAoKHMubVtpICogNCsgM10gJiAweEZGKSA8PCAyNCk7CisgICAgICAgKih1aW50MzIgKikgKHBqY29udGV4dCArIGkqNCArIDE2KSA9IHVsVGVtcDsJCisgICAgfQorCisgICAgLyogZmlyZSBjbWQgKi8KKyAgICAqKHVpbnQzMiAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0NSWVBUT19DTURfQkFTRV9PRkZTRVQpID0gdWxDb21tYW5kOyAgICAKKyAgICBkbyB7CisgICAgCXVsVGVtcCA9ICoodm9sYXRpbGUgdWludDMyICopIChIQUNfUkVHX0JBU0UgKyBSRUdfQ1JZUFRPX1NUQVRVU19PRkZTRVQpOworICAgIH0gd2hpbGUgKHVsVGVtcCAmIENSWVBUT19CVVNZKTsJCisKKyAgICAvKiBPdXRwdXQgKi8KKyAgICBmb3IgKGk9MDsgaTx1bE1zZ0xlbmd0aDsgaSsrKQorICAgIHsKKyAgICAgICAgY2ggPSAqKHZvbGF0aWxlIHVpbnQ4ICopIChwamRzdCArIGkpOworICAgICAgICAqKHVpbnQ4ICopIChkYXRhICsgaSkgPSBjaDsgICAgCisgICAgfQorCit9IC8qIHJjNF9jcnlwdF9hc3QzMDAwCSovCisKKy8qIEhhc2ggKi8KK3ZvaWQgaGFzaF9hc3QzMDAwKHVpbnQ4ICptc2csIHVpbnQzMiB1bExlbmd0aCwgdW5zaWduZWQgY2hhciAqb3V0cHV0LCB1aW50MzIgdWxIYXNoTW9kZSkKK3sKKyAgIHVpbnQzMiBpLCB1bFRlbXAsIHVsQ29tbWFuZCwgdWxEaWdlc3RMZW5ndGgsIHVsTXlNc2dMZW5ndGg7CisgICB1aW50OCBjaDsKKyAgIHVuc2lnbmVkIGNoYXIgKnBqc3JjLCAqcGpkc3Q7CisgICAKKyAgIC8qIEdldCBJbmZvICovCisgICBzd2l0Y2ggKHVsSGFzaE1vZGUpCisgICB7CisgICBjYXNlIEhBU0hNT0RFX01ENToKKyAgICAgICAgdWxDb21tYW5kID0gSEFTSF9BTEdfU0VMRUNUX01ENTsKKyAgICAgICAgdWxEaWdlc3RMZW5ndGggPSAxNjsKKyAgICAgICBicmVhazsKKyAgIGNhc2UgSEFTSE1PREVfU0hBMToKKyAgICAgICAgdWxDb21tYW5kID0gSEFTSF9BTEdfU0VMRUNUX1NIQTEgfCAweDA4OworICAgICAgICB1bERpZ2VzdExlbmd0aCA9IDIwOworICAgICAgIGJyZWFrOworICAgY2FzZSBIQVNITU9ERV9TSEEyNTY6CisgICAgICAgIHVsQ29tbWFuZCA9IEhBU0hfQUxHX1NFTEVDVF9TSEEyNTYgfCAweDA4OworICAgICAgICB1bERpZ2VzdExlbmd0aCA9IDMyOworICAgICAgIGJyZWFrOworICAgY2FzZSBIQVNITU9ERV9TSEEyMjQ6CisgICAgICAgIHVsQ29tbWFuZCA9IEhBU0hfQUxHX1NFTEVDVF9TSEEyMjQgfCAweDA4OworICAgICAgICB1bERpZ2VzdExlbmd0aCA9IDI4OworICAgICAgIGJyZWFrOyAgICAgICAJCisgICB9ICAgCSAgICAKKworICAgIHBqc3JjID0gKHVuc2lnbmVkIGNoYXIgKikgbTE2Ynl0ZUFsaWdubWVudCgodW5zaWduZWQgbG9uZykgaGFzaF9zcmMpOworICAgIHBqZHN0ID0gKHVuc2lnbmVkIGNoYXIgKikgbTE2Ynl0ZUFsaWdubWVudCgodW5zaWduZWQgbG9uZykgaGFzaF9kc3QpOworCisgICAgLyogMTZieXRlIGFsaWdubWVudCAqLworICAgIHVsTXlNc2dMZW5ndGggPSBtMTZieXRlQWxpZ25tZW50KHVsTGVuZ3RoKTsKKyAgIAkKKyAgIC8qIEluaXQuIEhXICovCisgICAgKih1aW50MzIgKikgKEhBQ19SRUdfQkFTRSArIFJFR19IQVNIX1NSQ19CQVNFX09GRlNFVCkgPSAodW5zaWduZWQgbG9uZykgcGpzcmM7CQorICAgICoodWludDMyICopIChIQUNfUkVHX0JBU0UgKyBSRUdfSEFTSF9EU1RfQkFTRV9PRkZTRVQpID0gKHVuc2lnbmVkIGxvbmcpIHBqZHN0OwkKKyAgICAqKHVpbnQzMiAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0hBU0hfTEVOX09GRlNFVCkgPSB1bE15TXNnTGVuZ3RoOwkKKyAgICAgICAgCisgICAgLyogd3JpdGUgc3JjICovCisgICAgZm9yIChpPTA7IGk8dWxMZW5ndGg7IGkrKykKKyAgICB7CisgICAgCWNoID0gKih1aW50OCAqKShtc2craSk7CisgICAgCSoodWludDggKikgKHBqc3JjICsgaSkgPSBjaDsKKyAgICB9ICAgIAorICAgIGZvciAoaT11bExlbmd0aDsgaTx1bE15TXNnTGVuZ3RoOyBpKyspCisgICAgICAgICoodWludDggKikgKHBqc3JjICsgaSkgPSAwOworICAgICAgICAKKyAgICAvKiBmaXJlIGNtZCAqLworICAgICoodWludDMyICopIChIQUNfUkVHX0JBU0UgKyBSRUdfSEFTSF9DTURfT0ZGU0VUKSA9IHVsQ29tbWFuZDsJCisgICAgCisgICAgLyogZ2V0IGRpZ2VzdCAqLworICAgIGRvIHsKKyAgICAJdWxUZW1wID0gKih2b2xhdGlsZSB1aW50MzIgKikgKEhBQ19SRUdfQkFTRSArIFJFR19IQVNIX1NUQVRVU19PRkZTRVQpOyAgICAJCisgICAgfSB3aGlsZSAodWxUZW1wICYgSEFTSF9CVVNZKTsJCisgICAgCQorICAgIGZvciAoaT0wOyBpPHVsRGlnZXN0TGVuZ3RoOyBpKyspCisgICAgeworICAgICAgICBjaCA9ICoodm9sYXRpbGUgdWludDggKikgKHBqZHN0ICsgaSk7CisgICAgICAgKih1aW50OCAqKSAob3V0cHV0ICsgaSkgPSBjaDsgICAgCisgICAgfSAgICAgICAgCisgCit9IC8qIGhhc2hfYXN0MzAwMCAqLwkKKworLyogSE1BQyAqLwordm9pZCBobWFja2V5X2FzdDMwMDAodWludDggKmtleSwgdWludDMyIHVsS2V5TGVuZ3RoLCB1aW50MzIgdWxIYXNoTW9kZSkKK3sKKyAgICB1aW50MzIgaSwgdWxCbGtMZW5ndGgsIHVsRGlnZXN0TGVuZ3RoLCB1bFRlbXAsIHVsQ29tbWFuZDsKKyAgICB1aW50OCBrMFs2NF0sIHN1bVszMl07CisgICAgdWludDggY2g7CisgICAgdW5zaWduZWQgY2hhciAqcGpzcmMsICpwamRzdCwgKnBqa2V5OworCisgICAvKiBHZXQgSW5mbyAqLworICAgc3dpdGNoICh1bEhhc2hNb2RlKQorICAgeworICAgY2FzZSBIQVNITU9ERV9NRDU6CisgICAgICAgIHVsQ29tbWFuZCA9IEhBU0hfQUxHX1NFTEVDVF9NRDU7CisgICAgICAgIHVsRGlnZXN0TGVuZ3RoID0gMTY7CisgICAgICAgYnJlYWs7CisgICBjYXNlIEhBU0hNT0RFX1NIQTE6CisgICAgICAgIHVsQ29tbWFuZCA9IEhBU0hfQUxHX1NFTEVDVF9TSEExIHwgMHgwODsKKyAgICAgICAgdWxEaWdlc3RMZW5ndGggPSAyMDsKKyAgICAgICBicmVhazsKKyAgIGNhc2UgSEFTSE1PREVfU0hBMjU2OgorICAgICAgICB1bENvbW1hbmQgPSBIQVNIX0FMR19TRUxFQ1RfU0hBMjU2IHwgMHgwODsKKyAgICAgICAgdWxEaWdlc3RMZW5ndGggPSAzMjsKKyAgICAgICBicmVhazsKKyAgIGNhc2UgSEFTSE1PREVfU0hBMjI0OgorICAgICAgICB1bENvbW1hbmQgPSBIQVNIX0FMR19TRUxFQ1RfU0hBMjI0IHwgMHgwODsKKyAgICAgICAgdWxEaWdlc3RMZW5ndGggPSAyODsKKyAgICAgICBicmVhazsgICAgICAgCQorICAgfSAgIAkgICAgCisgICB1bEJsa0xlbmd0aCA9IDY0OwkJCQkvKiBNRDUsIFNIQTEvMjU2LzIyNDogNjRieXRlcyAqLworCisgICAgLyogSW5pdCAqLworICAgIG1lbXNldCggKHZvaWQgKikgazAsIDAsIDY0KTsJCS8qIHJlc2V0IHRvIHplcm8gKi8KKyAgICBtZW1zZXQoICh2b2lkICopIHN1bSwgMCwgMzIpOwkJLyogcmVzZXQgdG8gemVybyAqLworCisgICAgLyogR2V0IGswICovCisgICAgaWYgKHVsS2V5TGVuZ3RoIDw9IHVsQmxrTGVuZ3RoKQorICAgICAgICBtZW1jcHkoICh2b2lkICopIGswLCAodm9pZCAqKSBrZXksIHVsS2V5TGVuZ3RoICk7ICAgICAgIAorICAgIGVsc2UgLyogKHVsS2V5TGVuZ3RoID4gdWxCbGtMZW5ndGgpICovCisgICAgeworICAgICAgICBoYXNoX2FzdDMwMDAoa2V5LCB1bEtleUxlbmd0aCwgc3VtLCB1bEhhc2hNb2RlKTsKKyAgICAgICAgbWVtY3B5KCAodm9pZCAqKSBrMCwgKHZvaWQgKikgc3VtLCB1bERpZ2VzdExlbmd0aCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0gICAgCQorCisgICAgcGpzcmMgPSAodW5zaWduZWQgY2hhciAqKSBtMTZieXRlQWxpZ25tZW50KCh1bnNpZ25lZCBsb25nKSBoYXNoX3NyYyk7CisgICAgcGpkc3QgPSAodW5zaWduZWQgY2hhciAqKSBtMTZieXRlQWxpZ25tZW50KCh1bnNpZ25lZCBsb25nKSBoYXNoX2RzdCk7CisgICAgcGprZXkgPSAodW5zaWduZWQgY2hhciAqKSBtNjRieXRlQWxpZ25tZW50KCh1bnNpZ25lZCBsb25nKSBobWFjX2tleSk7CisgICAgCisgICAgLyogQ2FsY3VsYXRlIGRpZ2VzdCAqLworICAgICoodWludDMyICopIChIQUNfUkVHX0JBU0UgKyBSRUdfSEFTSF9TUkNfQkFTRV9PRkZTRVQpID0gKHVuc2lnbmVkIGxvbmcpIHBqc3JjOworICAgICoodWludDMyICopIChIQUNfUkVHX0JBU0UgKyBSRUdfSEFTSF9EU1RfQkFTRV9PRkZTRVQpID0gKHVuc2lnbmVkIGxvbmcpIHBqZHN0OworICAgICoodWludDMyICopIChIQUNfUkVHX0JBU0UgKyBSRUdfSEFTSF9LRVlfQkFTRV9PRkZTRVQpID0gKHVuc2lnbmVkIGxvbmcpIHBqa2V5OworICAgICoodWludDMyICopIChIQUNfUkVHX0JBU0UgKyBSRUdfSEFTSF9MRU5fT0ZGU0VUKSA9IHVsQmxrTGVuZ3RoOworICAgICAgICAKKyAgICAvKiB3cml0ZSBrZXkgdG8gc3JjICovCisgICAgZm9yIChpPTA7IGk8dWxCbGtMZW5ndGg7IGkrKykKKyAgICB7CisgICAgCWNoID0gKih1aW50OCAqKShrMCtpKTsKKyAgICAgICAgKih1aW50OCAqKSAocGpzcmMgKyBpKSA9IGNoOworICAgIH0gICAgCisgICAgCisgICAgLyogZmlyZSBjbWQgZm9yIGNhbGN1bGF0ZSAqLworICAgICoodWludDMyICopIChIQUNfUkVHX0JBU0UgKyBSRUdfSEFTSF9DTURfT0ZGU0VUKSA9IHVsQ29tbWFuZCB8IEhBQ19ESUdFU1RfQ0FMX0VOQUJMRTsgICAgCisgICAgZG8geworICAgIAl1bFRlbXAgPSAqKHZvbGF0aWxlIHVpbnQzMiAqKSAoSEFDX1JFR19CQVNFICsgUkVHX0hBU0hfU1RBVFVTX09GRlNFVCk7ICAgIAkKKyAgICB9IHdoaWxlICh1bFRlbXAgJiBIQVNIX0JVU1kpOwkKKyAgICAgICAgIAorfSAvKiBobWFja2V5X2FzdDMwMDAgKi8KKwordm9pZCBobWFjX2FzdDMwMDAodWludDggKmtleSwgdWludDMyIHVsS2V5TGVuZ3RoLCB1aW50OCAqbXNnLCB1aW50MzIgdWxNc2dMZW5ndGgsIHVpbnQzMiB1bEhhc2hNb2RlLCB1bnNpZ25lZCBjaGFyICpvdXRwdXQpCit7CisgICAgdWludDMyIGksIHVsVGVtcCwgdWxDb21tYW5kLCB1bERpZ2VzdExlbmd0aCwgdWxNeU1zZ0xlbmd0aDs7CisgICAgdWludDggY2g7CisgICAgdW5zaWduZWQgY2hhciAqcGpzcmMsICpwamRzdCwgKnBqa2V5OworCisgICAgLyogQ2FsY3VsYXRlIGRpZ2VzdCAqLworICAgc3dpdGNoICh1bEhhc2hNb2RlKQorICAgeworICAgY2FzZSBIQVNITU9ERV9NRDU6CisgICAgICAgIHVsQ29tbWFuZCA9IEhBU0hfQUxHX1NFTEVDVF9NRDU7CisgICAgICAgIHVsRGlnZXN0TGVuZ3RoID0gMTY7CisgICAgICAgYnJlYWs7CisgICBjYXNlIEhBU0hNT0RFX1NIQTE6CisgICAgICAgIHVsQ29tbWFuZCA9IEhBU0hfQUxHX1NFTEVDVF9TSEExIHwgMHgwODsKKyAgICAgICAgdWxEaWdlc3RMZW5ndGggPSAyMDsKKyAgICAgICBicmVhazsKKyAgIGNhc2UgSEFTSE1PREVfU0hBMjU2OgorICAgICAgICB1bENvbW1hbmQgPSBIQVNIX0FMR19TRUxFQ1RfU0hBMjU2IHwgMHgwODsKKyAgICAgICAgdWxEaWdlc3RMZW5ndGggPSAzMjsKKyAgICAgICBicmVhazsKKyAgIGNhc2UgSEFTSE1PREVfU0hBMjI0OgorICAgICAgICB1bENvbW1hbmQgPSBIQVNIX0FMR19TRUxFQ1RfU0hBMjI0IHwgMHgwODsKKyAgICAgICAgdWxEaWdlc3RMZW5ndGggPSAyODsKKyAgICAgICBicmVhazsgICAgICAgCQorICAgfSAgIAkgICAgCisgCisgICAgcGpzcmMgPSAodW5zaWduZWQgY2hhciAqKSBtMTZieXRlQWxpZ25tZW50KCh1bnNpZ25lZCBsb25nKSBoYXNoX3NyYyk7CisgICAgcGpkc3QgPSAodW5zaWduZWQgY2hhciAqKSBtMTZieXRlQWxpZ25tZW50KCh1bnNpZ25lZCBsb25nKSBoYXNoX2RzdCk7CisgICAgcGprZXkgPSAodW5zaWduZWQgY2hhciAqKSBtNjRieXRlQWxpZ25tZW50KCh1bnNpZ25lZCBsb25nKSBobWFjX2tleSk7CisgICAgCisgICAgLyogMTZieXRlIGFsaWdubWVudCAqLworICAgIHVsTXlNc2dMZW5ndGggPSBtMTZieXRlQWxpZ25tZW50KHVsTXNnTGVuZ3RoKTsKKyAgICAJCQorICAgIC8qIEluaXQuIEhXICovCisgICAgKih1aW50MzIgKikgKEhBQ19SRUdfQkFTRSArIFJFR19IQVNIX1NSQ19CQVNFX09GRlNFVCkgPSAodW5zaWduZWQgbG9uZykgcGpzcmM7CisgICAgKih1aW50MzIgKikgKEhBQ19SRUdfQkFTRSArIFJFR19IQVNIX0RTVF9CQVNFX09GRlNFVCkgPSAodW5zaWduZWQgbG9uZykgcGpkc3Q7CisgICAgKih1aW50MzIgKikgKEhBQ19SRUdfQkFTRSArIFJFR19IQVNIX0tFWV9CQVNFX09GRlNFVCkgPSAodW5zaWduZWQgbG9uZykgcGprZXk7CisgICAgKih1aW50MzIgKikgKEhBQ19SRUdfQkFTRSArIFJFR19IQVNIX0xFTl9PRkZTRVQpID0gdWxNeU1zZ0xlbmd0aDsKKworICAgIC8qIHdyaXRlIFRleHQgdG8gc3JjICovCisgICAgZm9yIChpPTA7IGk8dWxNc2dMZW5ndGg7IGkrKykKKyAgICB7CisgICAgCWNoID0gKih1aW50OCAqKShtc2craSk7CisgICAgICAgICoodWludDggKikgKHBqc3JjICsgaSkgPSBjaDsKKyAgICB9ICAgIAorICAgIGZvciAoaT11bE1zZ0xlbmd0aDsgaTx1bE15TXNnTGVuZ3RoOyBpKyspCisgICAgICAgICoodWludDggKikgKHBqc3JjICsgaSkgPSAwOworICAgIAorICAgIC8qIGZpcmUgY21kICovCisgICAgKih1aW50MzIgKikgKEhBQ19SRUdfQkFTRSArIFJFR19IQVNIX0NNRF9PRkZTRVQpID0gdWxDb21tYW5kIHwgSEFDX0VOQUJMRTsgICAgICAgIAorICAgIGRvIHsKKyAgICAJdWxUZW1wID0gKih2b2xhdGlsZSB1aW50MzIgKikgKEhBQ19SRUdfQkFTRSArIFJFR19IQVNIX1NUQVRVU19PRkZTRVQpOyAgICAJCisgICAgfSB3aGlsZSAodWxUZW1wICYgSEFTSF9CVVNZKTsKKworICAgIC8qIE91dHB1dCBEaWdlc3QgKi8KKyAgICBmb3IgKGk9MDsgaTx1bERpZ2VzdExlbmd0aDsgaSsrKQorICAgIHsKKyAgICAgICAgY2ggPSAqKHVpbnQ4ICopIChwamRzdCArIGkpOworICAgICAgICAqKHVpbnQ4ICopIChvdXRwdXQgKyBpKSA9IGNoOyAgICAKKyAgICB9CisKK30gLyogaG1hY19hc3QzMDAwICovCisKKy8qIG1haW4gaGFjdGVzdCBwcm9jZWR1cmUgKi8KK2ludCBkb19oYWN0ZXN0ICh2b2lkKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIGksIGosIEZsYWdzID0gMDsKKwlhZXNfdGVzdCAqcGphZXNfdGVzdDsKKyAgICAgICAgYWVzX2NvbnRleHQgYWVzX2N0eDsKKyAgICAgICAgdW5zaWduZWQgY2hhciBBRVNfTW9kZVs4XSwgYWVzX291dHB1dFs2NF07CisJdW5zaWduZWQgbG9uZyB1bEFFU01zZ0xlbmd0aDsKKwkKKwlyYzRfdGVzdCAqcGpyYzRfdGVzdDsKKwl1bnNpZ25lZCBjaGFyIHJjNF9idWZfc3dbNjRdLCByYzRfYnVmX2h3WzY0XTsKKwl1bnNpZ25lZCBsb25nIHVsUkM0S2V5TGVuZ3RoLCB1bFJDNE1zZ0xlbmd0aDsKKwkKKwloYXNoX3Rlc3QgKnBqaGFzaF90ZXN0OworCXVuc2lnbmVkIGNoYXIgSEFTSF9Nb2RlWzhdLCBoYXNoX291dFs2NF07CisKKwlobWFjX3Rlc3QgKnBqaG1hY190ZXN0OworCXVuc2lnbmVkIGNoYXIgSE1BQ19Nb2RlWzhdLCBobWFjX291dFs2NF07CisKKwlFbmFibGVITUFDKCk7CisJCisJLyogQUVTIFRlc3QgKi8KKwlwamFlc190ZXN0ID0gYWVzdGVzdDsKKwl3aGlsZSAocGphZXNfdGVzdC0+YWVzX21vZGUgIT0gMHhGRikKKwl7CisKKyAgICAgICAgICAgIGlmIChwamFlc190ZXN0LT5hZXNfbW9kZSA9PSBDUllQVE9NT0RFX0NCQykKKyAgICAgICAgICAgICAgICBzdHJjcHkgKEFFU19Nb2RlLCAiQ0JDIik7CisgICAgICAgICAgICBlbHNlIGlmIChwamFlc190ZXN0LT5hZXNfbW9kZSA9PSBDUllQVE9NT0RFX0NGQikKKyAgICAgICAgICAgICAgICBzdHJjcHkgKEFFU19Nb2RlLCAiQ0ZCIik7CisgICAgICAgICAgICBlbHNlIGlmIChwamFlc190ZXN0LT5hZXNfbW9kZSA9PSBDUllQVE9NT0RFX09GQikKKyAgICAgICAgICAgICAgICBzdHJjcHkgKEFFU19Nb2RlLCAiT0ZCIik7CisgICAgICAgICAgICBlbHNlIGlmIChwamFlc190ZXN0LT5hZXNfbW9kZSA9PSBDUllQVE9NT0RFX0NUUikKKyAgICAgICAgICAgICAgICBzdHJjcHkgKEFFU19Nb2RlLCAiQ1RSIik7CisgICAgICAgICAgICBlbHNlICAgIAorICAgICAgICAgICAgICAgIHN0cmNweSAoQUVTX01vZGUsICJFQ0IiKTsKKworICAgICAgICAgICAgLyogR2V0IE1zZy4gTGVuZ3RoICovCisgICAgICAgICAgICB1bEFFU01zZ0xlbmd0aCA9IHN0cmxlbihwamFlc190ZXN0LT5wbGFpbnRleHQpOworICAgICAgICAgICAgaiA9ICggKHVsQUVTTXNnTGVuZ3RoICsgMTUpID4+IDQpIDw8IDQ7CisgICAgICAgICAgICBmb3IgKGk9dWxBRVNNc2dMZW5ndGg7IGk8ajsgaSsrKQorICAgICAgICAgICAgICAgIHBqYWVzX3Rlc3QtPnBsYWludGV4dFtpXSA9IDA7CisgICAgICAgICAgICB1bEFFU01zZ0xlbmd0aCA9IGo7ICAgIAorICAgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICBhZXNfc2V0X2tleSgmYWVzX2N0eCwgcGphZXNfdGVzdC0+a2V5LCBwamFlc190ZXN0LT5rZXlfbGVuZ3RoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogRW5jcnlwdGlvbiBUZXN0ICovCisgICAgICAgICAgICBhZXNfZW5jX2FzdDMwMDAoJmFlc19jdHgsIHBqYWVzX3Rlc3QtPnBsYWludGV4dCwgcGphZXNfdGVzdC0+a2V5LCBhZXNfb3V0cHV0LCB1bEFFU01zZ0xlbmd0aCwgcGphZXNfdGVzdC0+YWVzX21vZGUpOwkgICAgCisJICAgIGlmIChzdHJuY21wKGFlc19vdXRwdXQsIHBqYWVzX3Rlc3QtPmNpcGhlcnRleHQsIHVsQUVTTXNnTGVuZ3RoKSkKKwkgICAgeworCSAgICAJRmxhZ3MgfD0gRkxBR19BRVNURVNUX0ZBSUw7CSAgICAJCisJICAgICAgICBwcmludGYoIltJTkZPXSBBRVMlZCAlcyBNb2RlIEVuY3J5cHRpb24gRmFpbGVkIFxuIiwgcGphZXNfdGVzdC0+a2V5X2xlbmd0aCwgQUVTX01vZGUpOworCSAgICAgICAgcHJpbnRmKCJbREJHXSBHb2xkZW4gRGF0YSBEdW1wIC4uLi4gXG4iKTsJICAgICAgICAKKwkgICAgICAgIGZvciAoaT0wOyBpPCB1bEFFU01zZ0xlbmd0aDsgaSsrKQorCSAgICAgICAgeworCSAgICAgICAgICAgIHByaW50ZigiJTAyeCAiLCBwamFlc190ZXN0LT5jaXBoZXJ0ZXh0W2ldKTsJICAgICAgICAJCisJICAgICAgICAgICAgaWYgKCgoaSsxKSAlIDgpID09IDApCisJICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsgICAgICAgIAorCSAgICAgICAgfSAgICAgICAgCisJICAgICAgICBwcmludGYoIlxuIFtEQkddIEVycm9yIERhdGEgRHVtcCAuLi4uIFxuIik7CisJICAgICAgICBmb3IgKGk9MDsgaTwgdWxBRVNNc2dMZW5ndGg7IGkrKykKKwkgICAgICAgIHsKKwkgICAgICAgICAgICBwcmludGYoIiUwMnggIiwgYWVzX291dHB1dFtpXSk7CSAgICAgICAgCQorCSAgICAgICAgICAgIGlmICgoKGkrMSkgJSA4KSA9PSAwKQorCSAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7ICAgICAgICAKKwkgICAgICAgIH0KKwkgICAgICAgIHByaW50ZigiXG4iKTsJICAgICAgICAgICAgICAgIAorCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCSAgICAJLyoKKwkgICAgICAgIHByaW50ZigiW0lORk9dIEFFUyVkICVzIE1vZGUgRW5jcnlwdGlvbiBQYXNzZWQgXG4iLCBwamFlc190ZXN0LT5rZXlfbGVuZ3RoLCBBRVNfTW9kZSk7CisJICAgICAgICAqLworCSAgICB9CQorCisgICAgICAgICAgICAvKiBEZWNyeXB0aW9uIFRlc3QgKi8KKyAgICAgICAgICAgIGFlc19kZWNfYXN0MzAwMCgmYWVzX2N0eCwgcGphZXNfdGVzdC0+Y2lwaGVydGV4dCwgcGphZXNfdGVzdC0+a2V5LCBhZXNfb3V0cHV0LCB1bEFFU01zZ0xlbmd0aCwgcGphZXNfdGVzdC0+YWVzX21vZGUpOwkgICAgCisJICAgIGlmIChzdHJuY21wKGFlc19vdXRwdXQsIHBqYWVzX3Rlc3QtPnBsYWludGV4dCwgdWxBRVNNc2dMZW5ndGgpKQorCSAgICB7CisJICAgIAlGbGFncyB8PSBGTEFHX0FFU1RFU1RfRkFJTDsKKwkgICAgICAgIHByaW50ZigiW0lORk9dIEFFUyVkICVzIE1vZGUgRGVjcnlwdGlvbiBGYWlsZWQgXG4iLCBwamFlc190ZXN0LT5rZXlfbGVuZ3RoLCBBRVNfTW9kZSk7CSAgICAgICAgCisJICAgICAgICBwcmludGYoIltEQkddIEdvbGRlbiBEYXRhIER1bXAgLi4uLiBcbiIpOworCSAgICAgICAgZm9yIChpPTA7IGk8IHVsQUVTTXNnTGVuZ3RoOyBpKyspCisJICAgICAgICB7CisJICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIsIHBqYWVzX3Rlc3QtPnBsYWludGV4dFtpXSk7CSAgICAgICAgCQorCSAgICAgICAgICAgIGlmICgoKGkrMSkgJSA4KSA9PSAwKQorCSAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7ICAgICAgICAKKwkgICAgICAgIH0gICAgICAgIAorCSAgICAgICAgcHJpbnRmKCJcbiBbREJHXSBFcnJvciBEYXRhIER1bXAgLi4uLiBcbiIpOworCSAgICAgICAgZm9yIChpPTA7IGk8IHVsQUVTTXNnTGVuZ3RoOyBpKyspCisJICAgICAgICB7CisJICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIsIGFlc19vdXRwdXRbaV0pOwkgICAgICAgIAkKKwkgICAgICAgICAgICBpZiAoKChpKzEpICUgOCkgPT0gMCkKKwkgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiIpOyAgICAgICAgCisJICAgICAgICB9CisJICAgICAgICBwcmludGYoIlxuIik7CSAgICAgICAgICAgICAgICAKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkgICAgCS8qCisJICAgICAgICBwcmludGYoIltJTkZPXSBBRVMlZCAlcyBNb2RlIERlY3J5cHRpb24gUGFzc2VkIFxuIiwgcGphZXNfdGVzdC0+a2V5X2xlbmd0aCwgQUVTX01vZGUpOworCSAgICAgICAgKi8KKwkgICAgfQkKKwkgICAgCisJICAgIHBqYWVzX3Rlc3QrKzsKKyAgICAgICAgfSAvKiBBRVMgKi8KKworCS8qIFJDNCBUZXN0ICovCisJcGpyYzRfdGVzdCA9IHJjNHRlc3Q7CisJd2hpbGUgKChwanJjNF90ZXN0LT5rZXlbMF0gIT0gMHhmZikgJiYgKHBqcmM0X3Rlc3QtPmRhdGFbMF0gIT0gMHhmZikpCisJeworCisgICAgICAgICAgICAvKiBHZXQgSW5mbyAqLworICAgICAgICAgICAgdWxSQzRLZXlMZW5ndGggPSBzdHJsZW4ocGpyYzRfdGVzdC0+a2V5KTsKKyAgICAgICAgICAgIHVsUkM0TXNnTGVuZ3RoID0gc3RybGVuKHBqcmM0X3Rlc3QtPmRhdGEpOworICAgICAgICAgICAgbWVtY3B5KCAodm9pZCAqKSByYzRfYnVmX3N3LCAodm9pZCAqKSBwanJjNF90ZXN0LT5kYXRhLCB1bFJDNE1zZ0xlbmd0aCApOworICAgICAgICAgICAgbWVtY3B5KCAodm9pZCAqKSByYzRfYnVmX2h3LCAodm9pZCAqKSBwanJjNF90ZXN0LT5kYXRhLCB1bFJDNE1zZ0xlbmd0aCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAvKiBDcnlwdG8gKi8KKyAgICAgICAgICAgIHJjNF9jcnlwdF9zdyhyYzRfYnVmX3N3LCB1bFJDNE1zZ0xlbmd0aCwgcGpyYzRfdGVzdC0+a2V5LCB1bFJDNEtleUxlbmd0aCk7CisgICAgICAgICAgICByYzRfY3J5cHRfYXN0MzAwMChyYzRfYnVmX2h3LCB1bFJDNE1zZ0xlbmd0aCwgcGpyYzRfdGVzdC0+a2V5LCB1bFJDNEtleUxlbmd0aCk7CisgICAgICAgICAgIAorCSAgICBpZiAoc3RybmNtcChyYzRfYnVmX2h3LCByYzRfYnVmX3N3LCB1bFJDNE1zZ0xlbmd0aCkpCisJICAgIHsKKwkgICAgCUZsYWdzIHw9IEZMQUdfUkM0VEVTVF9GQUlMOwkgICAgCQorCSAgICAgICAgcHJpbnRmKCJbSU5GT10gUkM0IEVuY3J5cHRpb24gRmFpbGVkIFxuIik7CisJICAgICAgICBwcmludGYoIltEQkddIEdvbGRlbiBEYXRhIER1bXAgLi4uLiBcbiIpOworCSAgICAgICAgZm9yIChpPTA7IGk8IHVsUkM0TXNnTGVuZ3RoOyBpKyspCisJICAgICAgICB7CisJICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIsIHJjNF9idWZfc3dbaV0pOworCSAgICAgICAgICAgIGlmICgoKGkrMSkgJSA4KSA9PSAwKQorCSAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7ICAgICAgICAKKwkgICAgICAgIH0KKwkgICAgICAgIHByaW50ZigiXG4gW0RCR10gRXJyb3IgRGF0YSBEdW1wIC4uLi4gXG4iKTsKKwkgICAgICAgIGZvciAoaT0wOyBpPCB1bFJDNE1zZ0xlbmd0aDsgaSsrKQorCSAgICAgICAgeworCSAgICAgICAgICAgIHByaW50ZigiJTAyeCAiLCByYzRfYnVmX2h3W2ldKTsKKwkgICAgICAgICAgICBpZiAoKChpKzEpICUgOCkgPT0gMCkKKwkgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiIpOyAgICAgICAgCisJICAgICAgICB9CisJICAgICAgICBwcmludGYoIlxuIik7CSAgICAgICAgCisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJICAgIAkvKgorCSAgICAgICAgcHJpbnRmKCJbSU5GT10gUkM0IEVuY3J5cHRpb24gUGFzc2VkIFxuIik7CisJICAgICAgICAqLworCSAgICB9CQorCisJICAgIHBqcmM0X3Rlc3QrKzsKKwkgICAgCisgICAgICAgIH0gLyogUkM0ICovCisgICAgICAgCisJLyogSGFzaCBUZXN0ICovCisJcGpoYXNoX3Rlc3QgPSBoYXNodGVzdDsKKwl3aGlsZSAocGpoYXNoX3Rlc3QtPmhhc2hfbW9kZSAhPSAweEZGKQorCXsKKworICAgICAgICAgICAgaWYgKHBqaGFzaF90ZXN0LT5oYXNoX21vZGUgPT0gSEFTSE1PREVfTUQ1KQorICAgICAgICAgICAgICAgIHN0cmNweSAoSEFTSF9Nb2RlLCAiTUQ1Iik7CisgICAgICAgICAgICBlbHNlIGlmIChwamhhc2hfdGVzdC0+aGFzaF9tb2RlID09IEhBU0hNT0RFX1NIQTEpCisgICAgICAgICAgICAgICAgc3RyY3B5IChIQVNIX01vZGUsICJTSEExIik7CisgICAgICAgICAgICBlbHNlIGlmIChwamhhc2hfdGVzdC0+aGFzaF9tb2RlID09IEhBU0hNT0RFX1NIQTI1NikKKyAgICAgICAgICAgICAgICBzdHJjcHkgKEhBU0hfTW9kZSwgIlNIQTI1NiIpOworICAgICAgICAgICAgZWxzZSBpZiAocGpoYXNoX3Rlc3QtPmhhc2hfbW9kZSA9PSBIQVNITU9ERV9TSEEyMjQpCisgICAgICAgICAgICAgICAgc3RyY3B5IChIQVNIX01vZGUsICJTSEEyMjQiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogSGFzaCAqLyAgIAkJCisgICAgICAgICAgICBoYXNoX2FzdDMwMDAocGpoYXNoX3Rlc3QtPmlucHV0LCBzdHJsZW4ocGpoYXNoX3Rlc3QtPmlucHV0KSwgaGFzaF9vdXQsIHBqaGFzaF90ZXN0LT5oYXNoX21vZGUpOyAgICAgICAgICAgIAorCSAgICBpZiAoc3RybmNtcChoYXNoX291dCwgcGpoYXNoX3Rlc3QtPmRpZ2VzdCwgcGpoYXNoX3Rlc3QtPmRpZ2VzdF9sZW5ndGgpKQorCSAgICB7CisJICAgIAlGbGFncyB8PSBGTEFHX0hBU0hURVNUX0ZBSUw7CSAgICAJCisJICAgICAgICBwcmludGYoIltJTkZPXSBIQVNIICVzIEZhaWxlZCBcbiIsIEhBU0hfTW9kZSk7CisJICAgICAgICBwcmludGYoIltEQkddIEdvbGRlbiBEYXRhIER1bXAgLi4uLiBcbiIpOwkgICAgICAgIAorCSAgICAgICAgZm9yIChpPTA7IGk8IHBqaGFzaF90ZXN0LT5kaWdlc3RfbGVuZ3RoOyBpKyspCisJICAgICAgICB7CisJICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIscGpoYXNoX3Rlc3QtPmRpZ2VzdFtpXSk7CisJICAgICAgICAgICAgaWYgKCgoaSsxKSAlIDgpID09IDApIAkKKwkgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiIpOyAgICAgICAgCisJICAgICAgICB9ICAgICAgICAKKwkgICAgICAgIHByaW50ZigiXG4gW0RCR10gRXJyb3IgRGF0YSBEdW1wIC4uLi4gXG4iKTsKKwkgICAgICAgIGZvciAoaT0wOyBpPCBwamhhc2hfdGVzdC0+ZGlnZXN0X2xlbmd0aDsgaSsrKQorCSAgICAgICAgeworCSAgICAgICAgICAgIHByaW50ZigiJTAyeCAiLGhhc2hfb3V0W2ldKTsKKwkgICAgICAgICAgICBpZiAoKChpKzEpICUgOCkgPT0gMCkgCQorCSAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7ICAgICAgICAKKwkgICAgICAgIH0KKwkgICAgICAgIHByaW50ZigiXG4iKTsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkgICAgCS8qCisJICAgICAgICBwcmludGYoIltJTkZPXSBIQVNIICVzIFBhc3NlZCBcbiIsIEhBU0hfTW9kZSk7CisJICAgICAgICAqLworCSAgICB9CQorCisgICAgICAgICAgICBwamhhc2hfdGVzdCsrOworICAgICAgICAgICAgCisgICAgICAgIH0gLyogSGFzaCBUZXN0ICovCisKKwkvKiBITUFDIFRlc3QgKi8KKwlwamhtYWNfdGVzdCA9IGhtYWN0ZXN0OworCXdoaWxlIChwamhtYWNfdGVzdC0+aGFzaF9tb2RlICE9IDB4RkYpCisJeworCisgICAgICAgICAgICBpZiAocGpobWFjX3Rlc3QtPmhhc2hfbW9kZSA9PSBIQVNITU9ERV9NRDUpCisgICAgICAgICAgICAgICAgc3RyY3B5IChITUFDX01vZGUsICJNRDUiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBqaG1hY190ZXN0LT5oYXNoX21vZGUgPT0gSEFTSE1PREVfU0hBMSkKKyAgICAgICAgICAgICAgICBzdHJjcHkgKEhNQUNfTW9kZSwgIlNIQTEiKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBqaG1hY190ZXN0LT5oYXNoX21vZGUgPT0gSEFTSE1PREVfU0hBMjU2KQorICAgICAgICAgICAgICAgIHN0cmNweSAoSE1BQ19Nb2RlLCAiU0hBMjU2Iik7CisgICAgICAgICAgICBlbHNlIGlmIChwamhtYWNfdGVzdC0+aGFzaF9tb2RlID09IEhBU0hNT0RFX1NIQTIyNCkKKyAgICAgICAgICAgICAgICBzdHJjcHkgKEhNQUNfTW9kZSwgIlNIQTIyNCIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBITUFDICovICAgCQkKKyAgICAgICAgICAgIGhtYWNrZXlfYXN0MzAwMChwamhtYWNfdGVzdC0+a2V5LCBwamhtYWNfdGVzdC0+a2V5X2xlbmd0aCwgcGpobWFjX3Rlc3QtPmhhc2hfbW9kZSk7CisgICAgICAgICAgICBobWFjX2FzdDMwMDAocGpobWFjX3Rlc3QtPmtleSwgcGpobWFjX3Rlc3QtPmtleV9sZW5ndGgsIHBqaG1hY190ZXN0LT5pbnB1dCwgc3RybGVuKHBqaG1hY190ZXN0LT5pbnB1dCksIHBqaG1hY190ZXN0LT5oYXNoX21vZGUsIGhtYWNfb3V0KTsgICAgICAgICAgICAKKwkgICAgaWYgKHN0cm5jbXAoaG1hY19vdXQsIHBqaG1hY190ZXN0LT5kaWdlc3QsIHBqaG1hY190ZXN0LT5kaWdlc3RfbGVuZ3RoKSkKKwkgICAgeworCSAgICAJRmxhZ3MgfD0gRkxBR19IQVNIVEVTVF9GQUlMOwkgICAgCQorCSAgICAgICAgcHJpbnRmKCJbSU5GT10gSE1BQyAlcyBGYWlsZWQgXG4iLCBITUFDX01vZGUpOworCSAgICAgICAgcHJpbnRmKCJbREJHXSBHb2xkZW4gRGF0YSBEdW1wIC4uLi4gXG4iKTsJICAgICAgICAKKwkgICAgICAgIGZvciAoaT0wOyBpPCBwamhtYWNfdGVzdC0+ZGlnZXN0X2xlbmd0aDsgaSsrKQorCSAgICAgICAgeworCSAgICAgICAgICAgIHByaW50ZigiJTAyeCAiLHBqaG1hY190ZXN0LT5kaWdlc3RbaV0pOworCSAgICAgICAgICAgIGlmICgoKGkrMSkgJSA4KSA9PSAwKSAJCisJICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsgICAgICAgIAorCSAgICAgICAgfSAgICAgICAgCisJICAgICAgICBwcmludGYoIlxuIFtEQkddIEVycm9yIERhdGEgRHVtcCAuLi4uIFxuIik7CisJICAgICAgICBmb3IgKGk9MDsgaTwgcGpobWFjX3Rlc3QtPmRpZ2VzdF9sZW5ndGg7IGkrKykKKwkgICAgICAgIHsKKwkgICAgICAgICAgICBwcmludGYoIiUwMnggIixobWFjX291dFtpXSk7CisJICAgICAgICAgICAgaWYgKCgoaSsxKSAlIDgpID09IDApIAkKKwkgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiIpOyAgICAgICAgCisJICAgICAgICB9CisJICAgICAgICBwcmludGYoIlxuIik7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJICAgIAkvKgorCSAgICAgICAgcHJpbnRmKCJbSU5GT10gSE1BQyAlcyBQYXNzZWQgXG4iLCBITUFDX01vZGUpOworCSAgICAgICAgKi8KKwkgICAgfQkKKworICAgICAgICAgICAgcGpobWFjX3Rlc3QrKzsKKyAgICAgICAgICAgIAorICAgICAgICB9IC8qIEhNQUMgVGVzdCAqLworCisJcmV0dXJuIEZsYWdzOworCQorfQorCisjZW5kaWYgLyogQ09ORklHX1NMVCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDI0MDAvaGFjdGVzdC5oIGIvYm9hcmQvYXNwZWVkL2FzdDI0MDAvaGFjdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZjZjIxODYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC9oYWN0ZXN0LmgKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworLyogRXJyIEZsYWdzICovCisjZGVmaW5lIEZMQUdfQUVTVEVTVF9GQUlMICAJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRkxBR19SQzRURVNUX0ZBSUwgIAkJMHgwMDAwMDAwMgorI2RlZmluZSBGTEFHX0hBU0hURVNUX0ZBSUwgIAkJMHgwMDAwMDAwNAorCisvKiBTcGVjaWZpYyAqLworLyoKKyNkZWZpbmUgRFJBTV9CQVNFCQkJMHg0MDAwMDAwMAorI2RlZmluZQlDUllQVE9fU1JDX0JBU0UJCQkoRFJBTV9CQVNFICsgMHgxMDAwMDApCisjZGVmaW5lCUNSWVBUT19EU1RfQkFTRQkJCShEUkFNX0JBU0UgKyAweDIwMDAwMCkKKyNkZWZpbmUJQ1JZUFRPX0NPTlRFWFRfQkFTRQkJKERSQU1fQkFTRSArIDB4MzAwMDAwKQorCisjZGVmaW5lCUhBU0hfU1JDX0JBU0UJCQkoRFJBTV9CQVNFICsgMHg0MDAwMDApCisjZGVmaW5lCUhBU0hfRFNUX0JBU0UJCQkoRFJBTV9CQVNFICsgMHg1MDAwMDApCisjZGVmaW5lCUhNQUNfS0VZX0JBU0UJCQkoRFJBTV9CQVNFICsgMHg2MDAwMDApCisqLworI2RlZmluZSBtMDhieXRlQWxpZ25tZW50KHgpCQkoKHggKyAweDAwMDAwMDA3KSAmIDB4RkZGRkZGRjgpCisjZGVmaW5lIG0xNmJ5dGVBbGlnbm1lbnQoeCkJCSgoeCArIDB4MDAwMDAwMEYpICYgMHhGRkZGRkZGMCkKKyNkZWZpbmUgbTY0Ynl0ZUFsaWdubWVudCh4KQkJKCh4ICsgMHgwMDAwMDAzRikgJiAweEZGRkZGRkMwKQorCisjZGVmaW5lIENSWVBUT19BTElHTk1FTlQJCTE2CisjZGVmaW5lIENSWVBUT19NQVhfU1JDCQkJKDEwMCtDUllQVE9fQUxJR05NRU5UKQorI2RlZmluZSBDUllQVE9fTUFYX0RTVAkJCSgxMDArQ1JZUFRPX0FMSUdOTUVOVCkKKyNkZWZpbmUgQ1JZUFRPX01BWF9DT05URVhUCQkoMTAwK0NSWVBUT19BTElHTk1FTlQpCisKKyNkZWZpbmUgSEFTSF9BTElHTk1FTlQJCQkxNgorI2RlZmluZSBITUFDX0tFWV9BTElHTk1FTlQJIAk2NAorI2RlZmluZSBIQVNIX01BWF9TUkMJCQkoMTAwK0hBU0hfQUxJR05NRU5UKQorI2RlZmluZSBIQVNIX01BWF9EU1QJCQkoMzIrSEFTSF9BTElHTk1FTlQpCisjZGVmaW5lIEhNQUNfTUFYX0tFWQkJCSg2NCtITUFDX0tFWV9BTElHTk1FTlQpCisKKy8qIEdlbmVyYWwgKi8KKyNkZWZpbmUgSEFDX1JFR19CQVNFIAkJCTB4MWU2ZTMwMDAKKworI2RlZmluZSBNQVhfS0VZTEVOR1RICQkJMTAwCisjZGVmaW5lIE1BWF9URVhUTEVOR1RICQkJMTAwCisjZGVmaW5lIE1BWF9BRVNURVhUTEVOR1RICQkyNTYKKyNkZWZpbmUgTUFYX1JDNFRFWFRMRU5HVEgJCTI1NgorI2RlZmluZSBNQVhfUkM0S0VZTEVOR1RICQkyNTYKKworI2RlZmluZSBDUllQVE9NT0RFX0VDQgkJCTB4MDAKKyNkZWZpbmUgQ1JZUFRPTU9ERV9DQkMJCQkweDAxCisjZGVmaW5lIENSWVBUT01PREVfQ0ZCCQkJMHgwMgorI2RlZmluZSBDUllQVE9NT0RFX09GQgkJCTB4MDMKKyNkZWZpbmUgQ1JZUFRPTU9ERV9DVFIJCQkweDA0CisKKyNkZWZpbmUgSEFTSE1PREVfTUQ1CQkJMHgwMAorI2RlZmluZSBIQVNITU9ERV9TSEExCQkJMHgwMQorI2RlZmluZSBIQVNITU9ERV9TSEEyNTYJCQkweDAyCisjZGVmaW5lIEhBU0hNT0RFX1NIQTIyNAkJCTB4MDMKKworI2RlZmluZSBNSVhNT0RFX0RJU0FCTEUgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgTUlYTU9ERV9DUllQVE8gICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIE1JWE1PREVfSEFTSCAgICAgICAgICAgICAgICAgICAgMHgwMworCisjZGVmaW5lIFJFR19DUllQVE9fU1JDX0JBU0VfT0ZGU0VUCTB4MDAKKyNkZWZpbmUgUkVHX0NSWVBUT19EU1RfQkFTRV9PRkZTRVQJMHgwNAorI2RlZmluZSBSRUdfQ1JZUFRPX0NPTlRFWFRfQkFTRV9PRkZTRVQJMHgwOAorI2RlZmluZSBSRUdfQ1JZUFRPX0xFTl9PRkZTRVQJCTB4MEMKKyNkZWZpbmUgUkVHX0NSWVBUT19DTURfQkFTRV9PRkZTRVQJMHgxMAorLy8jZGVmaW5lIFJFR19DUllQVE9fRU5BQkxFX09GRlNFVAkweDE0CisjZGVmaW5lIFJFR19DUllQVE9fU1RBVFVTX09GRlNFVAkweDFDCisKKyNkZWZpbmUgUkVHX0hBU0hfU1JDX0JBU0VfT0ZGU0VUCTB4MjAKKyNkZWZpbmUgUkVHX0hBU0hfRFNUX0JBU0VfT0ZGU0VUCTB4MjQKKyNkZWZpbmUgUkVHX0hBU0hfS0VZX0JBU0VfT0ZGU0VUCTB4MjgKKyNkZWZpbmUgUkVHX0hBU0hfTEVOX09GRlNFVAkJMHgyQworI2RlZmluZSBSRUdfSEFTSF9DTURfT0ZGU0VUCQkweDMwCisvLyNkZWZpbmUgUkVHX0hBU0hfRU5BQkxFX09GRlNFVAkJMHgxNAorI2RlZmluZSBSRUdfSEFTSF9TVEFUVVNfT0ZGU0VUCQkweDFDCisKKyNkZWZpbmUgSEFTSF9CVVNZCQkJMHgwMQorI2RlZmluZSBDUllQVE9fQlVTWQkJCTB4MDIKKworLy8jZGVmaW5lIEVOQUJMRV9IQVNICQkJMHgwMQorLy8jZGVmaW5lIERJU0FCTEVfSEFTSAkJCTB4MDAKKy8vI2RlZmluZSBFTkFCTEVfQ1JZUFRPCQkJMHgwMgorLy8jZGVmaW5lIERJU0FCTEVfQ1JZUFRPCQkJMHgwMAorCisjZGVmaW5lIENSWVBUT19TWU5DX01PREVfTUFTSwkJMHgwMworI2RlZmluZSBDUllQVE9fU1lOQ19NT0RFX0FTWU5DCQkweDAwCisjZGVmaW5lIENSWVBUT19TWU5DX01PREVfUEFTU0lWRQkweDAyCisjZGVmaW5lIENSWVBUT19TWU5DX01PREVfQUNUSVZFCQkweDAzCisKKyNkZWZpbmUgQ1JZUFRPX0FFUzEyOAkJCTB4MDAKKyNkZWZpbmUgQ1JZUFRPX0FFUzE5MgkJCTB4MDQKKyNkZWZpbmUgQ1JZUFRPX0FFUzI1NgkJCTB4MDgKKworI2RlZmluZSBDUllQVE9fQUVTX0VDQgkJCTB4MDAKKyNkZWZpbmUgQ1JZUFRPX0FFU19DQkMJCQkweDEwCisjZGVmaW5lIENSWVBUT19BRVNfQ0ZCCQkJMHgyMAorI2RlZmluZSBDUllQVE9fQUVTX09GQgkJCTB4MzAKKyNkZWZpbmUgQ1JZUFRPX0FFU19DVFIJCQkweDQwCisKKyNkZWZpbmUgQ1JZUFRPX0VOQ1JZUFRPCQkJMHg4MAorI2RlZmluZSBDUllQVE9fREVDUllQVE8JCQkweDAwCisKKyNkZWZpbmUgQ1JZUFRPX0FFUwkJCTB4MDAwCisjZGVmaW5lIENSWVBUT19SQzQJCQkweDEwMAorCisjZGVmaW5lIENSWVBUT19FTkFCTEVfUlcJCTB4MDAwCisjZGVmaW5lIENSWVBUT19FTkFCTEVfQ09OVEVYVF9MT0FECTB4MDAwCisjZGVmaW5lIENSWVBUT19FTkFCTEVfQ09OVEVYVF9TQVZFCTB4MDAwCisKKyNkZWZpbmUgSEFTSF9TWU5DX01PREVfTUFTSwkJMHgwMworI2RlZmluZSBIQVNIX1NZTkNfTU9ERV9BU1lOQwkJMHgwMAorI2RlZmluZSBIQVNIX1NZTkNfTU9ERV9QQVNTSVZFCQkweDAyCisjZGVmaW5lIEhBU0hfU1lOQ19NT0RFX0FDVElWRQkJMHgwMworCisjZGVmaW5lIEhBU0hfUkVBRF9TV0FQX0VOQUJMRQkJMHgwNAorI2RlZmluZSBITUFDX1NXQVBfQ09OVFJPTF9FTkFCTEUJMHgwOAorCisjZGVmaW5lIEhBU0hfQUxHX1NFTEVDVF9NQVNLCQkweDcwCisjZGVmaW5lIEhBU0hfQUxHX1NFTEVDVF9NRDUJCTB4MDAKKyNkZWZpbmUgSEFTSF9BTEdfU0VMRUNUX1NIQTEJCTB4MjAKKyNkZWZpbmUgSEFTSF9BTEdfU0VMRUNUX1NIQTIyNAkJMHg0MAorI2RlZmluZSBIQVNIX0FMR19TRUxFQ1RfU0hBMjU2CQkweDUwCisKKyNkZWZpbmUgSEFDX0VOQUJMRQkJCTB4ODAKKyNkZWZpbmUgSEFDX0RJR0VTVF9DQUxfRU5BQkxFCQkweDE4MAorI2RlZmluZSBIQVNIX0lOVF9FTkFCTEUJCQkweDIwMAorCisvKiBBRVMgKi8KKyNpZm5kZWYgdWludDgKKyNkZWZpbmUgdWludDggIHVuc2lnbmVkIGNoYXIKKyNlbmRpZgorCisjaWZuZGVmIHVpbnQzMgorI2RlZmluZSB1aW50MzIgdW5zaWduZWQgbG9uZyBpbnQKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMiBlcmtbNjRdOyAgICAgLyogZW5jcnlwdGlvbiByb3VuZCBrZXlzICovCisgICAgdWludDMyIGRya1s2NF07ICAgICAvKiBkZWNyeXB0aW9uIHJvdW5kIGtleXMgKi8KKyAgICBpbnQgbnI7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiByb3VuZHMgKi8KK30KK2Flc19jb250ZXh0OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludAkgIGFlc19tb2RlOworICAgIGludAkgIGtleV9sZW5ndGg7CisJCisgICAgdWludDgga2V5WzMyXTsJLyogYXMgaXYgaW4gQ1RSIG1vZGUgKi8KKyAgICB1aW50OCBwbGFpbnRleHRbNjRdOworICAgIHVpbnQ4IGNpcGhlcnRleHRbNjRdOworICAgIAorfQorYWVzX3Rlc3Q7CisKKy8qIFJDNCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OCBrZXlbMzJdOworICAgIHVpbnQ4IGRhdGFbNjRdOworfQorcmM0X3Rlc3Q7CisKKy8qIEhhc2ggKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50CSAgaGFzaF9tb2RlOworICAgIGludAkgIGRpZ2VzdF9sZW5ndGg7CisJCisgICAgdWludDggaW5wdXRbNjRdOworICAgIHVpbnQ4IGRpZ2VzdFs2NF07CisgICAgCit9CitoYXNoX3Rlc3Q7CisJCisvKiBITUFDICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludAkgIGhhc2hfbW9kZTsKKyAgICBpbnQJICBrZXlfbGVuZ3RoOworICAgIGludAkgIGRpZ2VzdF9sZW5ndGg7CisKKyAgICB1aW50OCBrZXlbMTAwXTsJCisgICAgdWludDggaW5wdXRbNjRdOworICAgIHVpbnQ4IGRpZ2VzdFs2NF07CisgICAgCit9CitobWFjX3Rlc3Q7CmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjQwMC9tYWN0ZXN0LmMgYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC9tYWN0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjIwNTRiOQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL21hY3Rlc3QuYwpAQCAtMCwwICsxLDUxMCBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisvKgorICogKEMpIENvcHlyaWdodCAyMDA3IEFTUEVFRCBTb2Z0d2FyZQorICogTUFDIE1hbnVmYWN0dXJlIFRlc3QgaW4gQVNQRUVEJ3MgU0RLIHZlcnNpb24gMC4yMC4wMQorICoKKyAqIFJlbGVhc2UgSGlzdG9yeQorICogMS4gRmlyc3QgUmVsZWFzZSwgcml2ZXJAMjAwNzExMzAKKyAqIDIuIEZpeCB0aGUgZW5kbGVzcyBsb29wIHdoZW4gUEhZIGlzIG5vdCByZWFkeSwgcml2ZXJAMjAwNzEyMDQKKyAqCisgKiBUZXN0IGl0ZW1zOgorICogMS4gU3VwcG9ydCBNQVJWRUxMIFBIWSBvbmx5IGluIHRoaXMgdmVyc2lvbgorICogMi4gTURDL01ESU8KKyAqIDMuIEdNQUMvRHVwbGV4IFRYL1JYIEZ1bGxfU2l6ZSwgUGFja2V0X0xlbmd0aCBUZXN0CisgKiA0LiAxMDBNL0R1cGxleCBUWC9SWCBGdWxsX1NpemUsIFBhY2tldF9MZW5ndGggVGVzdAorICoKKyAqCisgKgorKi8KKworCisvKgorKiBEaWFnbm9zdGljcyBzdXBwb3J0CisqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxwb3N0Lmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8bmV0Lmg+CisjaW5jbHVkZSAic2x0LmgiCisKKyNpZiAoKENGR19DTURfU0xUICYgQ0ZHX0NNRF9NQUNURVNUKSAmJiBkZWZpbmVkKENPTkZJR19TTFQpKQorI2luY2x1ZGUgIm1hY3Rlc3QuaCIKKworc3RhdGljIGludCBJTkwodV9sb25nIGJhc2UsIHVfbG9uZyBhZGRyKQoreworCXJldHVybiBsZTMyX3RvX2NwdSgqKHZvbGF0aWxlIHVfbG9uZyAqKShhZGRyICsgYmFzZSkpOworfQorCitzdGF0aWMgdm9pZCBPVVRMKHVfbG9uZyBiYXNlLCBpbnQgY29tbWFuZCwgdV9sb25nIGFkZHIpCit7CisJKih2b2xhdGlsZSB1X2xvbmcgKikoYWRkciArIGJhc2UpID0gY3B1X3RvX2xlMzIoY29tbWFuZCk7Cit9CisKKworc3RhdGljIHZvaWQgU0NVX01BQzFfRW5hYmxlICh1OCBlbmFibGUpCit7CisJdW5zaWduZWQgaW50IFNDVV9SZWdpc3RlcjsKKworCWlmKGVuYWJsZSkgeworLy9NQUMxIFJFU0VUL1BIWV9MSU5LIGluIFNDVQorICAgICAgICBTQ1VfUmVnaXN0ZXIgPSBJTkwoU0NVX0JBU0UsIFNDVV9SRVNFVF9DT05UUk9MX1JFRyk7CisJT1VUTChTQ1VfQkFTRSwgU0NVX1JlZ2lzdGVyICYgfigweDgwMCksIFNDVV9SRVNFVF9DT05UUk9MX1JFRyk7CisJfSBlbHNlIHsKKwkJU0NVX1JlZ2lzdGVyID0gSU5MKFNDVV9CQVNFLCBTQ1VfUkVTRVRfQ09OVFJPTF9SRUcpOworCQlPVVRMKFNDVV9CQVNFLCBTQ1VfUmVnaXN0ZXIgfCgweDgwMCksIFNDVV9SRVNFVF9DT05UUk9MX1JFRyk7CisJCit9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgLiBSZWFkcyBhIHJlZ2lzdGVyIGZyb20gdGhlIE1JSSBNYW5hZ2VtZW50IHNlcmlhbCBpbnRlcmZhY2UKKyAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdTE2IHBoeV9yZWFkX3JlZ2lzdGVyICh1OCBQSFlfUmVnaXN0ZXIsIHU4IFBIWV9BZGRyZXNzKQoreworCXUzMiBEYXRhLCBTdGF0dXMgPSAwLCBMb29wX0NvdW50ID0gMCwgUEhZX1JlYWR5ID0gMTsKKwl1MTYgUmV0dXJuX0RhdGE7CisKKwlPVVRMKE1BQzFfSU9fQkFTRSwgKFBIWV9SZWdpc3RlciA8PCAyMSkgKyAoUEhZX0FkZHJlc3MgPDwgMTYpICsgTUlJUkQgKyBNRENfQ1lDVEhSLCBQSFlDUl9SRUcpOworCWRvIHsKKwkJU3RhdHVzID0gKElOTCAoTUFDMV9JT19CQVNFLCBQSFlDUl9SRUcpICYgTUlJUkQpOworCQlMb29wX0NvdW50Kys7CisJCWlmIChMb29wX0NvdW50ID49IFBIWV9MT09QKSB7CisJCQlQSFlfUmVhZHkgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChTdGF0dXMgPT0gTUlJUkQpOworICAgICAgIAorCWlmIChQSFlfUmVhZHkgPT0gMCkgeworCQlwcmludGYgKCJQSFkgTk9UIFJFREFZXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCXVkZWxheSg1KjEwMDApOworCURhdGEgPSBJTkwgKE1BQzFfSU9fQkFTRSwgUEhZREFUQV9SRUcpOworCVJldHVybl9EYXRhID0gKERhdGEgPj4gMTYpOworCisJcmV0dXJuIFJldHVybl9EYXRhOworfQorCitzdGF0aWMgdm9pZCBwaHlfd3JpdGVfcmVnaXN0ZXIgKHU4IFBIWV9SZWdpc3RlciwgdTggUEhZX0FkZHJlc3MsIHUxNiBQSFlfRGF0YSkKK3sKKwl1MzIgU3RhdHVzID0gMCwgTG9vcF9Db3VudCA9IDAsIFBIWV9SZWFkeSA9IDE7CisKKwlPVVRMKE1BQzFfSU9fQkFTRSwgUEhZX0RhdGEsIFBIWURBVEFfUkVHKTsKKwlPVVRMKE1BQzFfSU9fQkFTRSwgKFBIWV9SZWdpc3RlciA8PCAyMSkgKyAoUEhZX0FkZHJlc3MgPDwgMTYpICsgTUlJV1IgKyBNRENfQ1lDVEhSLCBQSFlDUl9SRUcpOworCWRvIHsKKwkJU3RhdHVzID0gKElOTCAoTUFDMV9JT19CQVNFLCBQSFlDUl9SRUcpICYgTUlJV1IpOworCQlMb29wX0NvdW50Kys7CisJCWlmIChMb29wX0NvdW50ID49IFBIWV9MT09QKSB7CisJCQlQSFlfUmVhZHkgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChTdGF0dXMgPT0gTUlJV1IpOworCWlmIChQSFlfUmVhZHkgPT0gMCkgeworCQlwcmludGYgKCJQSFkgTk9UIFJFREFZXG4iKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgd2FpdF9saW5rX3Jlc29sdmUgKHZvaWQpCit7CisJaW50IHJlc29sdmVkX3N0YXR1cywgTG9vcF9Db3VudCA9IDAsIFBIWV9SZWFkeSA9IDE7CisKKyAgICAgICAgZG8geworICAgICAgIAkJcmVzb2x2ZWRfc3RhdHVzID0gKHBoeV9yZWFkX3JlZ2lzdGVyICgweDExLCAwKSAmIChQSFlfUkVTT0xWRURfYml0IHwgUEhZX0xJTktfYml0KSk7CisgICAgICAgICAgICAgICAJTG9vcF9Db3VudCsrOworICAgICAgICAgICAgICAgCWlmIChMb29wX0NvdW50ID49IFBIWV9MT09QKSB7CisgICAgICAgICAgICAgICAgICAgCVBIWV9SZWFkeSA9IDA7CisgICAgICAgICAgICAgICAgICAgIAlwcmludGYgKCJQSFkgTk9UIFJFQURZXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgCWJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAocmVzb2x2ZWRfc3RhdHVzICE9IChQSFlfUkVTT0xWRURfYml0IHwgUEhZX0xJTktfYml0KSk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gUEhZX1JlYWR5OworfQorCitzdGF0aWMgdm9pZCBzZXRfcGh5X3NwZWVkIChpbnQgY2hpcCwgaW50IHNwZWVkLCBpbnQgZHVwbGV4KQoreworCXVuc2lnbmVkIHNob3J0IGRhdGEsIHN0YXR1czsKKworCisJaWYgKGNoaXAgPT0gUEhZSURfVkVORE9SX01BUlZFTEwpIHsKKwkJaWYgKChzcGVlZCA9PSBQSFlfU1BFRURfMUcpICYmIChkdXBsZXggPT0gRFVQTEVYX0ZVTEwpKSB7CisvL01hbnVhbCBDb250cm9sCisJCQlwaHlfd3JpdGVfcmVnaXN0ZXIgKDE4LCAwLCAwKTsKKwkJCWRhdGEgPSBwaHlfcmVhZF9yZWdpc3RlciAoOSwgMCk7CisJCQlwaHlfd3JpdGVfcmVnaXN0ZXIgKDksIDAsIGRhdGEgfCAweDE4MDApOworLy9QSFkgUmVzZXQKKwkJCXBoeV93cml0ZV9yZWdpc3RlciAoMCwgMCwgMHgwMTQwIHwgMHg4MDAwKTsKKwkJCWRvIHsKKwkJCQlzdGF0dXMgPSAocGh5X3JlYWRfcmVnaXN0ZXIgKDAsIDApICYgMHg4MDAwKTsgCisJCQl9IHdoaWxlIChzdGF0dXMgIT0gMCk7CisJCisvL0ZvcmNlIDFHCisJCQlwaHlfd3JpdGVfcmVnaXN0ZXIgKDI5LCAwLCAweDA3KTsKKwkJCWRhdGEgPSBwaHlfcmVhZF9yZWdpc3RlciAoMzAsIDApOworCQkJcGh5X3dyaXRlX3JlZ2lzdGVyICgzMCwgMCwgZGF0YSB8IDB4MDgpOworCQkJcGh5X3dyaXRlX3JlZ2lzdGVyICgyOSwgMCwgMHgxMCk7CisJCQlkYXRhID0gcGh5X3JlYWRfcmVnaXN0ZXIgKDMwLCAwKTsKKwkJCXBoeV93cml0ZV9yZWdpc3RlciAoMzAsIDAsIGRhdGEgfCAweDAyKTsKKwkJCXBoeV93cml0ZV9yZWdpc3RlciAoMjksIDAsIDB4MTIpOworCQkJZGF0YSA9IHBoeV9yZWFkX3JlZ2lzdGVyICgzMCwgMCk7CisJCQlwaHlfd3JpdGVfcmVnaXN0ZXIgKDMwLCAwLCBkYXRhIHwgMHgwMSk7CisJCisJCQlwcmludGYgKCJGT1JDRSBNQVJWRUxMIFBIWSB0byAxRy9EVVBMRVggRE9ORVxuIik7CisJCX0KKwkJZWxzZSBpZiAoKHNwZWVkID09IFBIWV9TUEVFRF8xMDBNKSAmJiAoZHVwbGV4ID09IERVUExFWF9GVUxMKSkgeworLy9QSFkgUmVzZXQKKwkJCXBoeV93cml0ZV9yZWdpc3RlciAoMCwgMCwgMHgyMTAwIHwgMHg4MDAwKTsKKwkJCWRvIHsKKwkJCQlzdGF0dXMgPSAocGh5X3JlYWRfcmVnaXN0ZXIgKDAsIDApICYgMHg4MDAwKTsgCisJCQl9IHdoaWxlIChzdGF0dXMgIT0gMCk7CisJCisvL0ZvcmNlIDEwME0KKwkJCWRhdGEgPSBwaHlfcmVhZF9yZWdpc3RlciAoMCwgMCk7CisJCQlwaHlfd3JpdGVfcmVnaXN0ZXIgKDAsIDAsIGRhdGEgfCAweDQwMDAgfCAweDgwMDApOworCQkJZG8geworCQkJCXN0YXR1cyA9IChwaHlfcmVhZF9yZWdpc3RlciAoMCwgMCkgJiAweDgwMDApOyAKKwkJCX0gd2hpbGUgKHN0YXR1cyAhPSAwKTsKKwkJCWRhdGEgPSBwaHlfcmVhZF9yZWdpc3RlciAoMCwgMCk7CisKKwkJCXByaW50ZiAoIkZPUkNFIE1BUlZFTEwgUEhZIHRvIDEwME0vRFVQTEVYIERPTkVcbiIpOworCQl9CisJfQorCWVsc2UgaWYgKCAoY2hpcCA9PSBQSFlJRF9WRU5ET1JfUlRMODIwMUUpIHx8IChjaGlwID09IFBIWUlEX1ZFTkRPUl9CUk9BRENPTSkgKXsKKwkJLyogYmFzaWMgc2V0dGluZyAqLworCQlkYXRhICA9IHBoeV9yZWFkX3JlZ2lzdGVyICgwLCAwKTsKKwkJZGF0YSAmPSAweDcxNDA7CisJCWRhdGEgfD0gMHg0MDAwOworCQlpZiAoc3BlZWQgPT0gUEhZX1NQRUVEXzEwME0pCisJCSAgICBkYXRhIHw9IDB4MjAwMDsKKyAgICAgICAgICAgICAgICBpZiAoZHVwbGV4ID09IERVUExFWF9GVUxMKQkJICAgIAorICAgICAgICAgICAgICAgICAgICBkYXRhIHw9IDB4MDEwMDsKKwkJcGh5X3dyaXRlX3JlZ2lzdGVyICgwLCAwLCBkYXRhKTsKKworICAgICAgICAgICAgICAgIC8qIHJlc2V0ICovCisJCXBoeV93cml0ZV9yZWdpc3RlciAoMCwgMCwgZGF0YSB8IDB4ODAwMCk7CisJCWRvIHsKKwkJCXN0YXR1cyA9IChwaHlfcmVhZF9yZWdpc3RlciAoMCwgMCkgJiAweDgwMDApOyAKKwkJfSB3aGlsZSAoc3RhdHVzICE9IDApOworCSAgICAgICAgdWRlbGF5KDEwMCoxMDAwKTsKKwkJCisJCS8qIGJhc2ljIHNldHRpbmcgKi8KKwkJcGh5X3dyaXRlX3JlZ2lzdGVyICgwLCAwLCBkYXRhKTsKKworICAgICAgICAgICAgICAgIGlmIChjaGlwID09IFBIWUlEX1ZFTkRPUl9SVEw4MjAxRSkKKwkJICAgIHByaW50ZiAoIkZPUkNFIFJUTDgyMDFFIFBIWSB0byAxMDBNL0RVUExFWCBET05FXG4iKTsJCQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoaXAgPT0gUEhZSURfVkVORE9SX0JST0FEQ09NKQorCQkgICAgcHJpbnRmICgiRk9SQ0UgQnJvYWRjb20gUEhZIHRvIDEwME0vRFVQTEVYIERPTkVcbiIpOwkJCisJCSAgICAKKwl9CQorCQorfQorCitzdGF0aWMgdm9pZCBNQUMxX3Jlc2V0ICh2b2lkKQoreworICAgIE9VVEwoTUFDMV9JT19CQVNFLCBTV19SU1RfYml0LCBNQUNDUl9SRUcpOworICAgIGZvciAoOyAoSU5MKE1BQzFfSU9fQkFTRSwgTUFDQ1JfUkVHICkgJiBTV19SU1RfYml0KSAhPSAwOyApIHt1ZGVsYXkoMTAwMCk7fQorICAgIE9VVEwoTUFDMV9JT19CQVNFLCAwLCBJRVJfUkVHICk7Cit9CisKK3N0YXRpYyBpbnQgc2V0X21hYzFfY29udHJvbF9yZWdpc3RlciAoaW50IENoaXBfSUQpCit7CisJdW5zaWduZWQgbG9uZwlNQUNfQ1JfUmVnaXN0ZXIgPSAwOworCWludCAgICBQSFlfUmVhZHkgPSAxOworCXUxNiAgICBQSFlfU3RhdHVzLCBQSFlfU3BlZWQsIFBIWV9EdXBsZXgsIEFkdmVydGlzZSwgTGlua19QYXJ0bmVyOworCisJTUFDX0NSX1JlZ2lzdGVyID0gU1BFRURfMTAwTV9NT0RFX2JpdCB8IFJYX0FMTEFEUl9iaXQgfCBGVUxMRFVQX2JpdCB8IFJYTUFDX0VOX2JpdCB8IFJYRE1BX0VOX2JpdCB8IFRYTUFDX0VOX2JpdCB8IFRYRE1BX0VOX2JpdCB8IENSQ19BUERfYml0OworCisJaWYgKCAoQ2hpcF9JRCA9PSBQSFlJRF9WRU5ET1JfQlJPQURDT00pIHx8IChDaGlwX0lEID09IFBIWUlEX1ZFTkRPUl9SVEw4MjAxRSkpIHsKKwkJQWR2ZXJ0aXNlID0gcGh5X3JlYWRfcmVnaXN0ZXIgKDB4MDQsIDApOworCQlMaW5rX1BhcnRuZXIgPSBwaHlfcmVhZF9yZWdpc3RlciAoMHgwNSwgMCk7CisJCUFkdmVydGlzZSA9IChBZHZlcnRpc2UgJiBQSFlfU1BFRURfRFVQTEVYX01BU0spOworCQlMaW5rX1BhcnRuZXIgPSAoTGlua19QYXJ0bmVyICYgUEhZX1NQRUVEX0RVUExFWF9NQVNLKTsKKwkJaWYgKChBZHZlcnRpc2UgJiBMaW5rX1BhcnRuZXIpICYgUEhZXzEwME1fRFVQTEVYKSB7CisJCQlNQUNfQ1JfUmVnaXN0ZXIgfD0gU1BFRURfMTAwTV9NT0RFX2JpdDsKKwkJCU1BQ19DUl9SZWdpc3RlciB8PSBGVUxMRFVQX2JpdDsKKwkJfQorCQllbHNlIGlmICgoQWR2ZXJ0aXNlICYgTGlua19QYXJ0bmVyKSAmIFBIWV8xMDBNX0hBTEYpIHsKKwkJCU1BQ19DUl9SZWdpc3RlciB8PSBTUEVFRF8xMDBNX01PREVfYml0OworCQkJTUFDX0NSX1JlZ2lzdGVyICY9IH5GVUxMRFVQX2JpdDsKKwkJfQorCQllbHNlIGlmICgoQWR2ZXJ0aXNlICYgTGlua19QYXJ0bmVyKSAmIFBIWV8xME1fRFVQTEVYKSB7CisJCQlNQUNfQ1JfUmVnaXN0ZXIgJj0gflNQRUVEXzEwME1fTU9ERV9iaXQ7CisJCQlNQUNfQ1JfUmVnaXN0ZXIgfD0gRlVMTERVUF9iaXQ7CisJCX0KKwkJZWxzZSBpZiAoKEFkdmVydGlzZSAmIExpbmtfUGFydG5lcikgJiBQSFlfMTBNX0hBTEYpIHsKKwkJCU1BQ19DUl9SZWdpc3RlciAmPSB+U1BFRURfMTAwTV9NT0RFX2JpdDsKKwkJCU1BQ19DUl9SZWdpc3RlciAmPSB+RlVMTERVUF9iaXQ7CisJCX0KKwl9CisJZWxzZSBpZiAoQ2hpcF9JRCA9PSBQSFlJRF9WRU5ET1JfTUFSVkVMTCkgeworCisJCVBIWV9SZWFkeSA9IHdhaXRfbGlua19yZXNvbHZlICgpOworCisJCWlmIChQSFlfUmVhZHkgPT0gMSkgeworCQkJUEhZX1N0YXR1cyA9IHBoeV9yZWFkX3JlZ2lzdGVyICgweDExLCAwKTsKKwkJCVBIWV9TcGVlZCA9IChQSFlfU3RhdHVzICYgUEhZX1NQRUVEX01BU0spID4+IDE0OworCQkJUEhZX0R1cGxleCA9IChQSFlfU3RhdHVzICYgUEhZX0RVUExFWF9NQVNLKSA+PiAxMzsKKworCQkJaWYgKFBIWV9TcGVlZCA9PSBTUEVFRF8xMDAwTSkgeworCQkJCU1BQ19DUl9SZWdpc3RlciB8PSBHTUFDX01PREVfYml0OworICAgICAgICAgICAgICAgIAl9CisJCQllbHNlIHsKKwkJCQlNQUNfQ1JfUmVnaXN0ZXIgJj0gfkdNQUNfTU9ERV9iaXQ7CisJCQkJaWYgKFBIWV9TcGVlZCA9PSBTUEVFRF8xME0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIAkJTUFDX0NSX1JlZ2lzdGVyICY9IH5TUEVFRF8xMDBNX01PREVfYml0OworICAgICAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIAlpZiAoUEhZX0R1cGxleCA9PSBEVVBMRVhfSEFMRikgeworCQkJCU1BQ19DUl9SZWdpc3RlciAmPSB+RlVMTERVUF9iaXQ7CisJCQl9CisJCX0KKwl9CisJT1VUTChNQUMxX0lPX0JBU0UsIE1BQ19DUl9SZWdpc3RlciwgTUFDQ1JfUkVHKTsKKworCXJldHVybiBQSFlfUmVhZHk7Cit9CisKK3N0YXRpYyB2b2lkIHJpbmdfYnVmZmVyX2FsbG9jICh2b2lkKQoreworCXVuc2lnbmVkIGludCBpLCBqOworCisvL1dyaXRlIGRhdGEgaW50byBUWCBidWZmZXIKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IFRYX0JVRkZfU1o7IGorKykgeworCQkJdHhfYnVmZmVyW2ldW2pdID0gaSAqIDQgKyBqOworCQl9CisJfQorLy9Jbml0aWFsaXplIFJYIGJ1ZmZlciB0byAwCisJZm9yIChpID0gMDsgaSA8IE5VTV9SWDsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBSWF9CVUZGX1NaOyBqKyspIHsKKwkJCXJ4X2J1ZmZlcltpXVtqXSA9IDA7CisJCX0KKwl9CisvL1ByZXBhcmUgZGVzY3JpcHRvcgorCWZvciAoaSA9IDA7IGkgPCBOVU1fUlg7IGkrKykgeworCQlyeF9yaW5nW2ldLnN0YXR1cyA9IGNwdV90b19sZTMyKFJYUEtUX1JEWSArIFJYX0JVRkZfU1opOworCQlyeF9yaW5nW2ldLmJ1ZiA9ICgodTMyKSAmcnhfYnVmZmVyW2ldKTsKKwkJcnhfcmluZ1tpXS5yZXNlcnZlZCA9IDA7CisJfQorCWZvciAoaSA9IDA7IGkgPCBOVU1fVFg7IGkrKykgeworCQl0eF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJCXR4X3JpbmdbaV0uZGVzMSA9IDA7CisJCXR4X3JpbmdbaV0uYnVmID0gKCh1MzIpICZ0eF9idWZmZXJbaV0pOworCQl0eF9yaW5nW2ldLnJlc2VydmVkID0gMDsKKwl9CisKKwlyeF9yaW5nW05VTV9SWCAtIDFdLnN0YXR1cyB8PSBjcHVfdG9fbGUzMihFRE9SUik7CisJdHhfcmluZ1tOVU1fVFggLSAxXS5zdGF0dXMgfD0gY3B1X3RvX2xlMzIoRURPVFIpOworCisJT1VUTChNQUMxX0lPX0JBU0UsICgodTMyKSAmdHhfcmluZyksIFRYUl9CQURSX1JFRyk7CisJT1VUTChNQUMxX0lPX0JBU0UsICgodTMyKSAmcnhfcmluZyksIFJYUl9CQURSX1JFRyk7CisJCisJdHhfbmV3ID0gMDsKKwlyeF9uZXcgPSAwOworfQorCitzdGF0aWMgaW50IHBhY2tldF90ZXN0ICh2b2lkKQoreworCXVuc2lnbmVkIGludCByeF9zdGF0dXMsIGxlbmd0aCwgaSwgTG9vcF9Db3VudCA9IDA7CisKKwl0eF9yaW5nW3R4X25ld10uc3RhdHVzIHw9IGNwdV90b19sZTMyKExUUyB8IEZUUyB8IFRYX0JVRkZfU1opOworCXR4X3JpbmdbdHhfbmV3XS5zdGF0dXMgfD0gY3B1X3RvX2xlMzIoVFhETUFfT1dOKTsKKwlPVVRMKE1BQzFfSU9fQkFTRSwgUE9MTF9ERU1BTkQsIFRYUERfUkVHKTsKKworLy9Db21wYXJlIHJlc3VsdAorCWRvIHsKKwkJcnhfc3RhdHVzID0gcnhfcmluZ1tyeF9uZXddLnN0YXR1czsKKwkJTG9vcF9Db3VudCsrOworCX0gd2hpbGUgKCEocnhfc3RhdHVzICYgUlhQS1RfU1RBVFVTKSAmJiAoTG9vcF9Db3VudCA8IFBIWV9MT09QKSk7CisJaWYgKHJ4X3N0YXR1cyAmIChSWF9FUlIgfCBDUkNfRVJSIHwgRlRMIHwgUlVOVCB8IFJYX09ERF9OQikpIHsKKwkJLyogVGhlcmUgd2FzIGFuIGVycm9yLiovCisJCXByaW50ZigiUlggZXJyb3Igc3RhdHVzID0gMHglMDhYXG4iLCByeF9zdGF0dXMpOworCQlyZXR1cm4gUEFDS0VUX1RFU1RfRkFJTDsKKwl9IGVsc2UgeworCQlsZW5ndGggPSAocnhfc3RhdHVzICYgQllURV9DT1VOVF9NQVNLKTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX0JVRkZfU1ogLyA0OyBpKyspIHsKKwkJCWlmIChyeF9idWZmZXJbcnhfbmV3XVtpXSAhPSB0eF9idWZmZXJbdHhfbmV3XVtpXSkgeworCQkJCXByaW50ZiAoIkVSUk9SIGF0IHBhY2tldCAlZCwgYWRkcmVzcyAleFxuIiwgcnhfbmV3LCBpKTsKKwkJCQlwcmludGYgKCJHb2xkID0gJTh4LCBSZWFsID0gJTh4XG4iLCB0eF9idWZmZXJbdHhfbmV3XVtpXSwgcnhfYnVmZmVyW3J4X25ld11baV0pOworCQkJCXJldHVybiBQQUNLRVRfVEVTVF9GQUlMOworCQkJfQorCQl9CisJfQorICAgIAl0eF9uZXcgPSAodHhfbmV3ICsgMSkgJSBOVU1fVFg7CisJcnhfbmV3ID0gKHJ4X25ldyArIDEpICUgTlVNX1JYOworCisJcmV0dXJuIFRFU1RfUEFTUzsKK30KKworc3RhdGljIGludCBwYWNrZXRfbGVuZ3RoX3Rlc3QgKGludCBwYWNrZXRfbGVuZ3RoKQoreworCXVuc2lnbmVkIGludCByeF9zdGF0dXMsIGxlbmd0aCwgaSwgTG9vcF9Db3VudCA9IDA7CisKKwl0eF9yaW5nW3R4X25ld10uc3RhdHVzICY9ICh+KEJZVEVfQ09VTlRfTUFTSykpOworCXR4X3JpbmdbdHhfbmV3XS5zdGF0dXMgfD0gY3B1X3RvX2xlMzIoTFRTIHwgRlRTIHwgcGFja2V0X2xlbmd0aCk7CisJdHhfcmluZ1t0eF9uZXddLnN0YXR1cyB8PSBjcHVfdG9fbGUzMihUWERNQV9PV04pOworCU9VVEwoTUFDMV9JT19CQVNFLCBQT0xMX0RFTUFORCwgVFhQRF9SRUcpOworCisvL0NvbXBhcmUgcmVzdWx0CisJZG8geworCQlyeF9zdGF0dXMgPSByeF9yaW5nW3J4X25ld10uc3RhdHVzOworCQlMb29wX0NvdW50Kys7CisJfSB3aGlsZSAoIShyeF9zdGF0dXMgJiBSWFBLVF9TVEFUVVMpICYmIChMb29wX0NvdW50IDwgUEhZX0xPT1ApKTsKKwlpZiAocnhfc3RhdHVzICYgKFJYX0VSUiB8IENSQ19FUlIgfCBGVEwgfCBSVU5UIHwgUlhfT0REX05CKSkgeworCQkvKiBUaGVyZSB3YXMgYW4gZXJyb3IuKi8KKwkJcHJpbnRmKCJSWCBlcnJvciBzdGF0dXMgPSAweCUwOFhcbiIsIHJ4X3N0YXR1cyk7CisJCXJldHVybiBQQUNLRVRfTEVOR1RIX1RFU1RfRkFJTDsKKwl9IGVsc2UgeworCQlsZW5ndGggPSAocnhfc3RhdHVzICYgQllURV9DT1VOVF9NQVNLKSAtIDQ7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCAhPSBwYWNrZXRfbGVuZ3RoKSB7CisJCQlwcmludGYgKCJSZWNlaXZlZCBMZW5ndGggRVJST1IuIEdvbGQgPSAlZCwgRmFpbCA9ICVkXG4iLHBhY2tldF9sZW5ndGgsIGxlbmd0aCk7CisJCQlwcmludGYgKCJyeF9uZXcgPSAlZCwgdHhfbmV3ID0gJWRcbiIsIHJ4X25ldywgdHhfbmV3KTsKKwkJCXJldHVybiBQQUNLRVRfTEVOR1RIX1RFU1RfRkFJTDsKKyAgICAgICAgICAgICAgICB9CisJCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkgICAgaWYgKHJ4X2J1ZmZlcltyeF9uZXddW2ldICE9IHR4X2J1ZmZlclt0eF9uZXddW2ldKSB7CisJCSAgICAJcHJpbnRmICgiRVJST1IgYXQgcGFja2V0ICVkLCBhZGRyZXNzICV4XG4iLCByeF9uZXcsIGkpOworCQkgICAgCXByaW50ZiAoIkdvbGQgPSAlOHgsIFJlYWwgPSAlOHhcbiIsIHR4X2J1ZmZlclt0eF9uZXddW2ldLCByeF9idWZmZXJbcnhfbmV3XVtpXSk7CisJCSAgICAJcmV0dXJuIFBBQ0tFVF9MRU5HVEhfVEVTVF9GQUlMOworCQkgICAgfQorCQl9CisJfQorCXJ4X3JpbmdbcnhfbmV3XS5zdGF0dXMgJj0gKH4oUlhQS1RfU1RBVFVTKSk7CisgICAgCXR4X25ldyA9ICh0eF9uZXcgKyAxKSAlIE5VTV9UWDsKKwlyeF9uZXcgPSAocnhfbmV3ICsgMSkgJSBOVU1fUlg7CisKKwlyZXR1cm4gVEVTVF9QQVNTOworfQorCitzdGF0aWMgaW50IE1BQzFfaW5pdCAoaW50IGlkKQoreworCWludCBwaHlfc3RhdHVzID0gMDsKKworCU1BQzFfcmVzZXQgKCk7CisJcGh5X3N0YXR1cyA9IHNldF9tYWMxX2NvbnRyb2xfcmVnaXN0ZXIgKGlkKTsKKyAgICAgICAJcmluZ19idWZmZXJfYWxsb2MgKCk7CisgICAgICAgCQorICAgICAgIAlyZXR1cm4gcGh5X3N0YXR1czsKK30KKworaW50IGRvX21hY3Rlc3QgKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHBoeV9pZCwgaTsKKwlpbnQgdGVzdF9yZXN1bHQgPSAwLCBwaHlfc3RhdHVzID0gMDsKKworCVNDVV9NQUMxX0VuYWJsZSgxKTsKKwlwaHlfaWQgPSAoKHBoeV9yZWFkX3JlZ2lzdGVyICgweDAyLCAwKSA8PCAxNikgKyBwaHlfcmVhZF9yZWdpc3RlciAoMHgwMywgMCkpICYgUEhZSURfVkVORE9SX01BU0s7CisJaWYgKHBoeV9pZCA9PSBQSFlJRF9WRU5ET1JfTUFSVkVMTCkgeworICAgICAgICAJcHJpbnRmICgiUEhZIERFVEVDVEVEIC0tLS0tLT4gTUFSVkVMTFxuIik7CisKKyAgICAgICAgCXNldF9waHlfc3BlZWQgKHBoeV9pZCwgUEhZX1NQRUVEXzFHLCBEVVBMRVhfRlVMTCk7CisgICAgICAgIAlpZiAoKHBoeV9zdGF0dXMgPSBNQUMxX2luaXQgKHBoeV9pZCkpICE9IDApIHsKKwkgICAgICAgIAlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYOyBpKyspIHsKKwkJCQl0ZXN0X3Jlc3VsdCB8PSBwYWNrZXRfdGVzdCAoKTsKKwkJCQlpZiAodGVzdF9yZXN1bHQgIT0gMCkKKwkJCQkJYnJlYWs7CisgICAgICAgIAkJfQorICAgICAgICAJfQorCQllbHNlIGlmIChwaHlfc3RhdHVzID09IDApIHsKKwkJCXByaW50ZiAoIlBIWSBGQUlMOiBQbGVhc2UgQ2hlY2sgSWYgeW91IGFyZSB1c2luZyBMT09QIEJBQ0sgQ29ubmVjdG9yXG4iKTsKKwkJCXRlc3RfcmVzdWx0ID0gMzsKKwkJCXJldHVybgl0ZXN0X3Jlc3VsdDsKKwkJfQorICAgICAgICAJaWYgKChwaHlfc3RhdHVzID0gTUFDMV9pbml0IChwaHlfaWQpKSAhPSAwKSB7CisgICAgICAgIAkJZm9yIChpID0gNjA7IGkgPCBUWF9CVUZGX1NaOyBpKyspIHsKKwkJCQl0ZXN0X3Jlc3VsdCB8PSBwYWNrZXRfbGVuZ3RoX3Rlc3QgKGkpOworCQkJCWlmICh0ZXN0X3Jlc3VsdCAhPSAwKQorCQkJCQlicmVhazsKKyAgICAgICAgCQl9CisgICAgICAgIAl9CisJCWVsc2UgaWYgKHBoeV9zdGF0dXMgPT0gMCkgeworCQkJcHJpbnRmICgiUEhZIEZBSUw6IFBsZWFzZSBDaGVjayBJZiB5b3UgYXJlIHVzaW5nIExPT1AgQkFDSyBDb25uZWN0b3JcbiIpOworCQkJdGVzdF9yZXN1bHQgPSAzOworCQkJcmV0dXJuCXRlc3RfcmVzdWx0OworCQl9CisgICAgICAgIAlzZXRfcGh5X3NwZWVkIChwaHlfaWQsIFBIWV9TUEVFRF8xMDBNLCBEVVBMRVhfRlVMTCk7CisgICAgICAgIAlpZiAoKHBoeV9zdGF0dXMgPSBNQUMxX2luaXQgKHBoeV9pZCkpICE9IDApIHsKKyAgICAgICAgCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYOyBpKyspIHsKKwkJCQl0ZXN0X3Jlc3VsdCB8PSBwYWNrZXRfdGVzdCAoKTsKKwkJCQlpZiAodGVzdF9yZXN1bHQgIT0gMCkKKwkJCQkJYnJlYWs7CisgICAgICAgIAkJfQorICAgICAgICAJfQorCQllbHNlIGlmIChwaHlfc3RhdHVzID09IDApIHsKKwkJCXByaW50ZiAoIlBIWSBGQUlMOiBQbGVhc2UgQ2hlY2sgSWYgeW91IGFyZSB1c2luZyBMT09QIEJBQ0sgQ29ubmVjdG9yXG4iKTsKKwkJCXRlc3RfcmVzdWx0ID0gMzsKKwkJCXJldHVybgl0ZXN0X3Jlc3VsdDsKKwkJfQorCisgICAgICAgIAlpZiAoKHBoeV9zdGF0dXMgPSBNQUMxX2luaXQgKHBoeV9pZCkpICE9IDApIHsKKyAgICAgICAgCQlmb3IgKGkgPSA2MDsgaSA8IFRYX0JVRkZfU1o7IGkrKykgeworCQkJCXRlc3RfcmVzdWx0IHw9IHBhY2tldF9sZW5ndGhfdGVzdCAoaSk7CisgICAgICAgIAkJCWlmICh0ZXN0X3Jlc3VsdCAhPSAwKQorCSAgICAgICAgCSAgICAJCWJyZWFrOworICAgICAgICAJCX0KKyAgICAgICAgCX0KKwkJZWxzZSBpZiAocGh5X3N0YXR1cyA9PSAwKSB7CisJCQlwcmludGYgKCJQSFkgRkFJTDogUGxlYXNlIENoZWNrIElmIHlvdSBhcmUgdXNpbmcgTE9PUCBCQUNLIENvbm5lY3RvclxuIik7CisJCQl0ZXN0X3Jlc3VsdCA9IDM7CisJCQlyZXR1cm4JdGVzdF9yZXN1bHQ7CisJCX0KKyAgICAgICAgfQorCWVsc2UgaWYgKCAocGh5X2lkID09IFBIWUlEX1ZFTkRPUl9SVEw4MjAxRSkgfHwgKHBoeV9pZCA9PSBQSFlJRF9WRU5ET1JfQlJPQURDT00pICl7CisJCQorICAgICAgICAJaWYgKHBoeV9pZCA9PSBQSFlJRF9WRU5ET1JfUlRMODIwMUUpCisgICAgICAgIAkgICAgcHJpbnRmICgiUEhZIERFVEVDVEVEIC0tLS0tLT4gUlRMIDgyMDFFIFxuIik7CisgICAgICAgIAllbHNlIGlmIChwaHlfaWQgPT0gUEhZSURfVkVORE9SX0JST0FEQ09NKQorICAgICAgICAJICAgIHByaW50ZiAoIlBIWSBERVRFQ1RFRCAtLS0tLS0+IEJyb2FkY29tIFxuIik7CisgICAgICAgIAkKKyAgICAgICAgCXNldF9waHlfc3BlZWQgKHBoeV9pZCwgUEhZX1NQRUVEXzEwME0sIERVUExFWF9GVUxMKTsKKyAgICAgICAgCWlmICgocGh5X3N0YXR1cyA9IE1BQzFfaW5pdCAocGh5X2lkKSkgIT0gMCkgeworICAgICAgICAJCWZvciAoaSA9IDA7IGkgPCBOVU1fVFg7IGkrKykgeworCQkJCXRlc3RfcmVzdWx0IHw9IHBhY2tldF90ZXN0ICgpOworCQkJCWlmICh0ZXN0X3Jlc3VsdCAhPSAwKQorCQkJCQlicmVhazsKKyAgICAgICAgCQl9CisgICAgICAgIAl9CisJCWVsc2UgaWYgKHBoeV9zdGF0dXMgPT0gMCkgeworCQkJcHJpbnRmICgiUEhZIEZBSUw6IFBsZWFzZSBDaGVjayBJZiB5b3UgYXJlIHVzaW5nIExPT1AgQkFDSyBDb25uZWN0b3JcbiIpOworCQkJdGVzdF9yZXN1bHQgPSAzOworCQkJcmV0dXJuCXRlc3RfcmVzdWx0OworCQl9CisKKyAgICAgICAgCWlmICgocGh5X3N0YXR1cyA9IE1BQzFfaW5pdCAocGh5X2lkKSkgIT0gMCkgeworICAgICAgICAJCWZvciAoaSA9IDYwOyBpIDwgVFhfQlVGRl9TWjsgaSsrKSB7CisJCQkJdGVzdF9yZXN1bHQgfD0gcGFja2V0X2xlbmd0aF90ZXN0IChpKTsKKyAgICAgICAgCQkJaWYgKHRlc3RfcmVzdWx0ICE9IDApCisJICAgICAgICAJICAgIAkJYnJlYWs7CisgICAgICAgIAkJfQorICAgICAgICAJfQorCQllbHNlIGlmIChwaHlfc3RhdHVzID09IDApIHsKKwkJCXByaW50ZiAoIlBIWSBGQUlMOiBQbGVhc2UgQ2hlY2sgSWYgeW91IGFyZSB1c2luZyBMT09QIEJBQ0sgQ29ubmVjdG9yXG4iKTsKKwkJCXRlc3RfcmVzdWx0ID0gMzsKKwkJCXJldHVybgl0ZXN0X3Jlc3VsdDsKKwkJfSAgICAgICAgCQorICAgICAgICB9CQorICAgICAgICAgIAorCWlmICgocGh5X3N0YXR1cyA9PSAwKSAmJiAodGVzdF9yZXN1bHQgJiBQQUNLRVRfVEVTVF9GQUlMKSkgeworCQlwcmludGYgKCJQYWNrZXQgVGVzdCBGQUlMICFcbiIpOworCX0KKwllbHNlIGlmICgocGh5X3N0YXR1cyA9PSAwKSAmJiAodGVzdF9yZXN1bHQgJiBQQUNLRVRfTEVOR1RIX1RFU1RfRkFJTCkpIHsKKwkJcHJpbnRmICgiUGFja2V0IExlbmd0aCBUZXN0IEZBSUwgIVxuIik7CisJfQorCisJU0NVX01BQzFfRW5hYmxlKDApOworCXJldHVybiB0ZXN0X3Jlc3VsdDsKKwkKK30KKworI2VuZGlmIC8qIENPTkZJR19TTFQgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2FzcGVlZC9hc3QyNDAwL21hY3Rlc3QuaCBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL21hY3Rlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNzViN2JiCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDI0MDAvbWFjdGVzdC5oCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKy8qIE1BQ1Rlc3QuaCAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgIEdlbmVyYWwgRGVmaW5pdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgTUFDMV9JT19CQVNFCQkweDFFNjYwMDAwCisjZGVmaW5lIFBIWV9MT09QCQkxMDAwMDAKKyNkZWZpbmUgTlVNX1JYCQkJNDgKKyNkZWZpbmUgTlVNX1RYCQkJNDgKKyNkZWZpbmUgUlhfQlVGRl9TWgkJMTUxNAorI2RlZmluZSBUWF9CVUZGX1NaCQkxNTE0CisjZGVmaW5lIFRPVVRfTE9PUAkJMTAwMDAwMAorI2RlZmluZSBFVEhfQUxFTgkJNgorI2RlZmluZSBQT0xMX0RFTUFORAkJMQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICAgICAgICAgTUFDIFJlZ2lzdGVyIEluZGV4CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBJU1JfUkVHCQkJMHgwMAkJCQkvLyBpbnRlcnJ1cHMgc3RhdHVzIHJlZ2lzdGVyCisjZGVmaW5lIElFUl9SRUcJCQkweDA0CQkJCS8vIGludGVycnVwdCBtYWtzIHJlZ2lzdGVyCisjZGVmaW5lIE1BQ19NQURSX1JFRwkJMHgwOAkJCQkvLyBNQUMgYWRkcmVzcyAoTW9zdCBzaWduaWZpY2FudCkKKyNkZWZpbmUgTUFDX0xBRFJfUkVHCQkweDBjCQkJCS8vIE1BQyBhZGRyZXNzIChMZWFzdCBzaWduaWZpY2FudCkKKyNkZWZpbmUgTUFIVDBfUkVHCQkweDEwCQkJCS8vIE11bHRpY2FzdCBBZGRyZXNzIEhhc2ggVGFibGUgMCByZWdpc3RlcgorI2RlZmluZSBNQUhUMV9SRUcJCTB4MTQJCQkJLy8gTXVsdGljYXN0IEFkZHJlc3MgSGFzaCBUYWJsZSAxIHJlZ2lzdGVyCisjZGVmaW5lIFRYUERfUkVHCQkweDE4CQkJCS8vIFRyYW5zbWl0IFBvbGwgRGVtYW5kIHJlZ2lzdGVyCisjZGVmaW5lIFJYUERfUkVHCQkweDFjCQkJCS8vIFJlY2VpdmUgUG9sbCBEZW1hbmQgcmVnaXN0ZXIKKyNkZWZpbmUgVFhSX0JBRFJfUkVHCQkweDIwCQkJCS8vIFRyYW5zbWl0IFJpbmcgQmFzZSBBZGRyZXNzIHJlZ2lzdGVyCisjZGVmaW5lIFJYUl9CQURSX1JFRwkJMHgyNAkJCQkvLyBSZWNlaXZlIFJpbmcgQmFzZSBBZGRyZXNzIHJlZ2lzdGVyCisjZGVmaW5lIEhQVFhQRF9SRUcJCTB4MjgKKyNkZWZpbmUgSFBUWFJfQkFEUl9SRUcJCTB4MmMKKyNkZWZpbmUgSVRDX1JFRwkJCTB4MzAJCQkJLy8gaW50ZXJydXB0IHRpbWVyIGNvbnRyb2wgcmVnaXN0ZXIKKyNkZWZpbmUgQVBUQ19SRUcJCTB4MzQJCQkJLy8gQXV0b21hdGljIFBvbGxpbmcgVGltZXIgY29udHJvbCByZWdpc3RlcgorI2RlZmluZSBEQkxBQ19SRUcJCTB4MzgJCQkJLy8gRE1BIEJ1cnN0IExlbmd0aCBhbmQgQXJiaXRyYXRpb24gY29udHJvbCByZWdpc3RlcgorI2RlZmluZSBETUFGSUZPU19SRUcJCTB4M2MKKyNkZWZpbmUgRkVBUl9SRUcJCTB4NDQKKyNkZWZpbmUgVFBBRkNSX1JFRwkJMHg0OAorI2RlZmluZSBSQlNSX1JFRwkJMHg0YworI2RlZmluZSBNQUNDUl9SRUcJCTB4NTAJCQkJLy8gTUFDIGNvbnRyb2wgcmVnaXN0ZXIKKyNkZWZpbmUgTUFDU1JfUkVHCQkweDU0CQkJCS8vIE1BQyBzdGF0dXMgcmVnaXN0ZXIKKyNkZWZpbmUgUEhZQ1JfUkVHCQkweDYwCQkJCS8vIFBIWSBjb250cm9sIHJlZ2lzdGVyCisjZGVmaW5lIFBIWURBVEFfUkVHCQkweDY0CQkJCS8vIFBIWSBXcml0ZSBEYXRhIHJlZ2lzdGVyCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLwkJUEhZQ1JfUkVHCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBQSFlfUkVfQVVUT19iaXQJCQkoMVVMPDw5KQorI2RlZmluZSBQSFlfUkVBRF9iaXQJCQkoMVVMPDwyNikKKyNkZWZpbmUgUEhZX1dSSVRFX2JpdAkJCSgxVUw8PDI3KQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCQlQSFlDUl9SRUcgCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBQSFlfQVVUT19PS19iaXQJCQkoMVVMPDw1KQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCQlQSFkgSU5UX1NUQVRfUkVHIAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgUEhZX1NQRUVEX0NIR19iaXQJCSgxVUw8PDE0KQorI2RlZmluZSBQSFlfRFVQTEVYX0NIR19iaXQJCSgxVUw8PDEzKQorI2RlZmluZSBQSFlfTElOS19DSEdfYml0CQkoMVVMPDwxMCkKKyNkZWZpbmUgUEhZX0FVVE9fQ09NUF9iaXQJCSgxVUw8PDExKQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCQlQSFkgU1BFX1NUQVRfUkVHIAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgUEhZX1JFU09MVkVEX2JpdAkJKDFVTDw8MTEpCisjZGVmaW5lIFBIWV9MSU5LX2JpdAkJCSgxVUw8PDEwKQorI2RlZmluZSBQSFlfU1BFRURfbWFzawkJCTB4QzAwMAorI2RlZmluZSBQSFlfU1BFRURfMTBNCQkJMHgwCisjZGVmaW5lIFBIWV9TUEVFRF8xMDBNCQkJMHgxCisjZGVmaW5lIFBIWV9TUEVFRF8xRwkJCTB4MgorI2RlZmluZSBQSFlfRFVQTEVYX21hc2sgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBQSFlfU1BFRURfRFVQTEVYX01BU0sgICAgICAgICAgIDB4MDFFMAorI2RlZmluZSBQSFlfMTAwTV9EVVBMRVggICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBQSFlfMTAwTV9IQUxGICAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBQSFlfMTBNX0RVUExFWCAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBQSFlfMTBNX0hBTEYgICAgICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBMSU5LX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgUEhZSURfVkVORE9SX01BU0sJCTB4ZmZmZmZjMDAKKyNkZWZpbmUgUEhZSURfVkVORE9SX01BUlZFTEwJCTB4MDE0MTBjMDAKKyNkZWZpbmUgUEhZSURfVkVORE9SX0JST0FEQ09NCQkweDAwNDA2MDAwCisjZGVmaW5lIFBIWUlEX1ZFTkRPUl9SVEw4MjAxRQkJMHgwMDFjYzgwMAorI2RlZmluZSBEVVBMRVhfRlVMTAkJCTB4MDEKKyNkZWZpbmUgRFVQTEVYX0hBTEYJCQkweDAwCisKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8JCU1BQ0NSX1JFRworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBTV19SU1RfYml0CQkoMVVMPDwzMSkJCQkJLy8gc29mdHdhcmUgcmVzZXQvCisjZGVmaW5lIERJUlBBVEhfYml0CQkoMVVMPDwyMSkKKyNkZWZpbmUgUlhfSVBDU19GQUlMX2JpdAkoMVVMPDwyMCkKKyNkZWZpbmUgU1BFRURfMTAwTV9NT0RFX2JpdAkJKDFVTDw8MTkpCisjZGVmaW5lIFJYX1VEUENTX0ZBSUxfYml0CSgxVUw8PDE4KQorI2RlZmluZSBSWF9CUk9BRFBLVF9iaXQJCSgxVUw8PDE3KQkJCQkvLyBSZWNlaXZpbmcgYnJvYWRjYXN0IHBhY2tldAorI2RlZmluZSBSWF9NVUxUSVBLVF9iaXQJCSgxVUw8PDE2KQkJCQkvLyByZWNlaXZpbmcgbXVsdGljYXN0IHBhY2tldAorI2RlZmluZSBSWF9IVF9FTl9iaXQJCSgxVUw8PDE1KQorI2RlZmluZSBSWF9BTExBRFJfYml0CQkoMVVMPDwxNCkJCQkJLy8gbm90IGNoZWNrIGluY29taW5nIHBhY2tldCdzIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyNkZWZpbmUgSlVNQk9fTEZfYml0CQkoMVVMPDwxMykKKyNkZWZpbmUgUlhfUlVOVF9iaXQJCSgxVUw8PDEyKQkJCQkvLyBTdG9yZSBpbmNvbWluZyBwYWNrZXQgZXZlbiBpdHMgbGVuZ3RoIGlzIGxlcyB0aGFuIDY0IGJ5dGUKKyNkZWZpbmUgQ1JDX0NIS19iaXQJCSgxVUw8PDExKQorI2RlZmluZSBDUkNfQVBEX2JpdAkJKDFVTDw8MTApCQkJCS8vIGFwcGVuZCBjcmMgdG8gdHJhbnNtaXQgcGFja2V0CisjZGVmaW5lIEdNQUNfTU9ERV9iaXQJCSgxVUw8PDkpCisjZGVmaW5lIEZVTExEVVBfYml0CQkoMVVMPDw4KQkJCQkvLyBmdWxsIGR1cGxleAorI2RlZmluZSBFTlJYX0lOX0hBTEZUWF9iaXQJKDFVTDw8NykKKyNkZWZpbmUgTE9PUF9FTl9iaXQJCSgxVUw8PDYpCQkJCS8vIEludGVybmFsIGxvb3AtYmFjaworI2RlZmluZSBIUFRYUl9FTl9iaXQJCSgxVUw8PDUpCisjZGVmaW5lIFJFTU9WRV9WTEFOX2JpdAkJKDFVTDw8NCkKKyNkZWZpbmUgUlhNQUNfRU5fYml0CQkoMVVMPDwzKQkJCQkvLyByZWNlaXZlciBlbmFibGUKKyNkZWZpbmUgVFhNQUNfRU5fYml0CQkoMVVMPDwyKQkJCQkvLyB0cmFuc21pdHRlciBlbmFibGUKKyNkZWZpbmUgUlhETUFfRU5fYml0CQkoMVVMPDwxKQkJCQkvLyBlbmFibGUgRE1BIHJlY2VpdmluZyBjaGFubmVsCisjZGVmaW5lIFRYRE1BX0VOX2JpdAkJKDFVTDw8MCkJCQkJLy8gZW5hYmxlIERNQSB0cmFuc21pdHRpbmcgY2hhbm5lbAorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLwkJU0NVX1JFRworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgIFNDVV9CQVNFCQkJMHgxRTZFMjAwMAorI2RlZmluZSAgU0NVX1BST1RFQ1RfS0VZX1JFRyAgICAgICAgICAgIDB4MAorI2RlZmluZSAgU0NVX1BST1RfS0VZX01BR0lDICAgICAgICAgICAgIDB4MTY4OGE4YTgKKyNkZWZpbmUgIFNDVV9SRVNFVF9DT05UUk9MX1JFRyAgICAgICAgICAweDA0CisjZGVmaW5lICBTQ1VfUkVTRVRfTUFDMSAgICAgICAgICAgICAgICAgKDF1IDw8IDExKQorI2RlZmluZSAgU0NVX1JFU0VUX01BQzIgICAgICAgICAgICAgICAgICgxdSA8PCAxMikKKyNkZWZpbmUgIFNDVV9IQVJEV0FSRV9UUkFQUElOR19SRUcgICAgICAweDcwCisjZGVmaW5lICBTQ1VfSFRfTUFDX0lOVEZfTFNCSVQgICAgICAgICAgNgorI2RlZmluZSAgU0NVX0hUX01BQ19JTlRFUkZBQ0UgICAgICAgICAgICgweDd1IDw8IFNDVV9IVF9NQUNfSU5URl9MU0JJVCkKKyNkZWZpbmUgIE1BQ19JTlRGX1NJTkdMRV9QT1JUX01PREVTICAgICAoMXU8PDAvKkdNSUkqLyB8IDF1PDwzLypNSUlfT05MWSovIHwgMXU8PDQvKlJNSUlfT05MWSovKQorI2RlZmluZSAgU0NVX0hUX01BQ19HTUlJICAgICAgICAgICAgICAgIDB4MHUKKy8vIE1JSSBhbmQgTUlJIG1vZGUKKyNkZWZpbmUgIFNDVV9IVF9NQUNfTUlJX01JSSAgICAgICAgICAgICAweDF1CisjZGVmaW5lICBTQ1VfSFRfTUFDX01JSV9PTkxZICAgICAgICAgICAgMHgzdQorI2RlZmluZSAgU0NVX0hUX01BQ19STUlJX09OTFkgICAgICAgICAgIDB4NHUKKyNkZWZpbmUgIFNDVV9NVUxUSUZVTkNUSU9OX1BJTl9SRUcgICAgICAweDc0CisjZGVmaW5lICBTQ1VfTUZQX01BQzJfUEhZTElOSyAgICAgICAgICAgKDF1IDw8IDI2KQorI2RlZmluZSAgU0NVX01GUF9NQUMxX1BIWUxJTksgICAgICAgICAgICgxdSA8PCAyNSkKKyNkZWZpbmUgIFNDVV9NRlBfTUFDMl9NSUlfSU5URiAgICAgICAgICAoMXUgPDwgMjEpCisjZGVmaW5lICBTQ1VfTUZQX01BQzJfTURDX01ESU8gICAgICAgICAgKDF1IDw8IDIwKQorI2RlZmluZSAgU0NVX1NJTElDT05fUkVWSVNJT05fUkVHICAgICAgIDB4N0MKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBQSFkgUi9XIFJlZ2lzdGVyIEJpdAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgTUlJV1IgICAgICAgICAgICAgICAgICAgKDFVTDw8MjcpCisjZGVmaW5lIE1JSVJEICAgICAgICAgICAgICAgICAgICgxVUw8PDI2KQorI2RlZmluZSBNRENfQ1lDVEhSICAgICAgICAgICAgICAweDM0CisjZGVmaW5lIFBIWV9TUEVFRF9NQVNLICAgICAgICAgIDB4QzAwMAorI2RlZmluZSBQSFlfRFVQTEVYX01BU0sgICAgICAgICAweDIwMDAKKyNkZWZpbmUgU1BFRURfMTAwME0gICAgICAgICAgICAgMHgwMgorI2RlZmluZSBTUEVFRF8xMDBNICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFNQRUVEXzEwTSAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgRFVQTEVYX0ZVTEwgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBEVVBMRVhfSEFMRiAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFJFU09MVkVEX0JJVCAgICAgICAgICAgIDB4ODAwCisKKyNkZWZpbmUgUEhZX1NQRUVEX0RVUExFWF9NQVNLICAgMHgwMUUwCisjZGVmaW5lIFBIWV8xMDBNX0RVUExFWCAgICAgICAgIDB4MDEwMAorI2RlZmluZSBQSFlfMTAwTV9IQUxGICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgUEhZXzEwTV9EVVBMRVggICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFBIWV8xME1fSEFMRiAgICAgICAgICAgIDB4MDAyMAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGVzY3JpcHRvciBiaXRzLgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgVFhETUFfT1dOCTB4ODAwMDAwMDAJLyogT3duIEJpdCAqLworI2RlZmluZSBSWFBLVF9SRFkgICAgICAgMHgwMDAwMDAwMCAgICAgIAorI2RlZmluZSBSWFBLVF9TVEFUVVMgICAgMHg4MDAwMDAwMAorI2RlZmluZSBFRE9SUgkJMHg0MDAwMDAwMAkvKiBSZWNlaXZlIEVuZCBPZiBSaW5nICovCisjZGVmaW5lIExSUwkJMHgxMDAwMDAwMAkvKiBMYXN0IERlc2NyaXB0b3IgKi8KKyNkZWZpbmUgUkRfRVMJCTB4MDAwMDgwMDAJLyogRXJyb3IgU3VtbWFyeSAqLworI2RlZmluZSBFRE9UUgkJMHg0MDAwMDAwMAkvKiBUcmFuc21pdCBFbmQgT2YgUmluZyAqLworI2RlZmluZSBUX09XTgkJMHg4MDAwMDAwMAkvKiBPd24gQml0ICovCisjZGVmaW5lIExUUwkJMHgxMDAwMDAwMAkvKiBMYXN0IFNlZ21lbnQgKi8KKyNkZWZpbmUgRlRTCQkweDIwMDAwMDAwCS8qIEZpcnN0IFNlZ21lbnQgKi8KKyNkZWZpbmUgQ1JDX0VSUiAgICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgVERfRVMJCTB4MDAwMDgwMDAJLyogRXJyb3IgU3VtbWFyeSAqLworI2RlZmluZSBURF9TRVQJCTB4MDgwMDAwMDAJLyogU2V0dXAgUGFja2V0ICovCisjZGVmaW5lIFJYX0VSUiAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIEZUTCAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIFJVTlQgICAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIFJYX09ERF9OQiAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIEJZVEVfQ09VTlRfTUFTSyAweDAwMDAzRkZGCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTUEVFRC9EVVBMRVggUGFyYW1ldGVycworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldHVybiBTdGF0dXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIFRFU1RfUEFTUwkJCTAKKyNkZWZpbmUgUEFDS0VUX1RFU1RfRkFJTAkJMQorI2RlZmluZSBQQUNLRVRfTEVOR1RIX1RFU1RfRkFJTAkJMgorCitzdHJ1Y3QgIG1hY19kZXNjIHsKKwl2b2xhdGlsZSBzMzIgc3RhdHVzOworCXUzMiBkZXMxOworCXUzMiByZXNlcnZlZDsKKwl1MzIgYnVmOwkKK307CitzdGF0aWMgc3RydWN0IG1hY19kZXNjIHJ4X3JpbmdbTlVNX1JYXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgzMikpKTsgLyogUlggZGVzY3JpcHRvciByaW5nICAgICAgICAgKi8KK3N0YXRpYyBzdHJ1Y3QgbWFjX2Rlc2MgdHhfcmluZ1tOVU1fVFhdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDMyKSkpOyAvKiBUWCBkZXNjcmlwdG9yIHJpbmcgICAgICAgICAqLworc3RhdGljIGludCByeF9uZXc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSWCBkZXNjcmlwdG9yIHJpbmcgcG9pbnRlciAqLworc3RhdGljIGludCB0eF9uZXc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUWCBkZXNjcmlwdG9yIHJpbmcgcG9pbnRlciAqLworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgcnhfYnVmZmVyW05VTV9SWF1bUlhfQlVGRl9TWl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMzIpKSk7IC8qIFJYIGJ1ZmZlciAgICAgICAgICovCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciB0eF9idWZmZXJbTlVNX1RYXVtUWF9CVUZGX1NaXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgzMikpKTsgLyogVFggYnVmZmVyICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL2FzcGVlZC9hc3QyNDAwL21pY3Rlc3QuYyBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL21pY3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYjJiMzQyCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDI0MDAvbWljdGVzdC5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBEaWFnbm9zdGljcyBzdXBwb3J0CisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8cG9zdC5oPgorI2luY2x1ZGUgInNsdC5oIgorCisjaWYgKChDRkdfQ01EX1NMVCAmIENGR19DTURfTUlDVEVTVCkgJiYgZGVmaW5lZChDT05GSUdfU0xUKSkKKyNpbmNsdWRlICJtaWN0ZXN0LmgiCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGN0cmxidWZbTUlDX01BWF9DVFJMXTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoa3N1bWJ1ZltNSUNfTUFYX0NIS1NVTV07CisKK3ZvaWQgdkluaXRTQ1Uodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIHVsRGF0YTsKKworICAgICoodW5zaWduZWQgbG9uZyAqKSAoMHgxZTZlMjAwMCkgPSAweDE2ODhBOEE4OworCisgICAgdWRlbGF5KDEwMCk7CisKKyAgICB1bERhdGEgPSAqKHVuc2lnbmVkIGxvbmcgKikgKDB4MWU2ZTIwMDQpOworICAgIHVsRGF0YSAmPSAweGJmZmZmOworICAgICoodW5zaWduZWQgbG9uZyAqKSAoMHgxZTZlMjAwNCkgPSB1bERhdGE7CisgICAgICAgICAJCit9CisKK3ZvaWQgdkluaXRNSUModm9pZCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGksIGosIHVsUGFnZU51bWJlcjsKKyAgICB1bnNpZ25lZCBjaGFyICpwamN0cmwsICpwanN1bTsKKyAgICAKKyAgICB1bFBhZ2VOdW1iZXIgPSBEUkFNU0laRSA+PiAxMjsJCisKKyAgICBwamN0cmwgPSAodW5zaWduZWQgY2hhciAqKShtMTZieXRlQWxpZ25tZW50KCh1bnNpZ25lZCBsb25nKSBjdHJsYnVmKSk7CisgICAgcGpzdW0gPSAodW5zaWduZWQgY2hhciAqKShtMTZieXRlQWxpZ25tZW50KCh1bnNpZ25lZCBsb25nKSBjaGtzdW1idWYpKTsKKyAgICAKKyAgICAvKiBpbml0IGN0cmwgYnVmZmVyICgyYml0cyBmb3Igb25lIHBhZ2UpICovCisgICAgZm9yIChpPTA7IGk8ICh1bFBhZ2VOdW1iZXIvNCk7IGkrKykKKyAgICAgICAgKih1bnNpZ25lZCBjaGFyICopIChwamN0cmwgKyBpKSA9IERFRkFVTFRfQ1RSTDsKKyAgICAgIAorICAgIC8qIGluaXQgY2hrc3VtIGJ1ZiAoNGJ5dGVzIGZvciBvbmUgcGFnZSkgKi8KKyAgICBmb3IgKGk9MDsgaTx1bFBhZ2VOdW1iZXI7IGkrKykKKyAgICAgICAgKih1bnNpZ25lZCBsb25nICopIChwanN1bSArIGkqNCkgPSBERUZBVUxUX0NIS1NVTTsKKyAgICAKKyAgICAqKHVuc2lnbmVkIGxvbmcgKikgKE1JQ19CQVNFICsgTUlDX0NUUkxCVUZGX1JFRykgICA9ICh1bnNpZ25lZCBsb25nKSBwamN0cmw7CisgICAgKih1bnNpZ25lZCBsb25nICopIChNSUNfQkFTRSArIE1JQ19DSEtTVU1CVUZfUkVHKSAgPSAodW5zaWduZWQgbG9uZykgcGpzdW07CisgICAgKih1bnNpZ25lZCBsb25nICopIChNSUNfQkFTRSArIE1JQ19SQVRFQ1RSTF9SRUcpICAgPSAodW5zaWduZWQgbG9uZykgREVGQVVMVF9SQVRFOworICAgICoodW5zaWduZWQgbG9uZyAqKSAoTUlDX0JBU0UgKyBNSUNfRU5HSU5FQ1RSTF9SRUcpID0gTUlDX0VOQUJMRV9NSUMgfCAoRFJBTVNJWkUgLSAweDEwMDApOworCQorfQorCit2b2lkIHZEaXNhYmxlTUlDKHZvaWQpCit7CisgICAgKih1bnNpZ25lZCBsb25nICopIChNSUNfQkFTRSArIE1JQ19FTkdJTkVDVFJMX1JFRykgICA9IE1JQ19SRVNFVF9NSUM7CisJCit9CisKK2ludCBkb19jaGtzdW0odm9pZCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGksIGosIGssIHVsUGFnZU51bWJlcjsKKyAgICBpbnQgU3RhdHVzID0gMDsKKyAgICB1bnNpZ25lZCBzaG9ydCB0bXA7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBzdW0xLCBzdW0yOworICAgIHVuc2lnbmVkIGxvbmcgZ29sZGVuc3VtLCBjaGtzdW07CisgICAgdW5zaWduZWQgbG9uZyBsZW4sIHRsZW47CisgICAgdW5zaWduZWQgY2hhciAqcGpzdW07CisKKyAgICB1bFBhZ2VOdW1iZXIgPSBEUkFNU0laRSA+PiAxMjsJCisgICAgcGpzdW0gPSAodW5zaWduZWQgY2hhciAqKShtMTZieXRlQWxpZ25tZW50KCh1bnNpZ25lZCBsb25nKSBjaGtzdW1idWYpKTsKKworICAgIC8qIHN0YXJ0IHRlc3QgKi8gICAgCisgICAgZm9yIChpPTA7IGk8dWxQYWdlTnVtYmVyOyBpKyspCisgICAgeworICAgIAkKKyAgICAJc3VtMSA9IDB4ZmZmZiwgc3VtMiA9IDB4ZmZmZjsKKyAgICAJbGVuID0gMHgwODAwOworICAgIAlqID0gMDsKKyAgICAJCisgICAgCXdoaWxlIChsZW4pCisgICAgCXsKKyAgICAJICAgIHRsZW4gPSBsZW4gPiAzNjAgPyAzNjAgOiBsZW47CisgICAgCSAgICBsZW4gLT0gdGxlbjsKKyAgICAJICAgIGRvIHsKKyAgICAJICAgICAgIHRtcCA9ICoodW5zaWduZWQgc2hvcnQgKikgKERSQU1fQkFTRSArICgoaSA8PCAxMikgKyBqKSk7CQorICAgICAgICAgICAgICAgc3VtMSArPSAodW5zaWduZWQgbG9uZykgdG1wOyAgIAkgICAgCQorICAgIAkgICAgICAgc3VtMiArPSBzdW0xOworICAgIAkgICAgICAgais9MjsKKyAgICAJICAgIH0gd2hpbGUgKC0tdGxlbik7CisgICAgCSAgICBzdW0xID0gKHN1bTEgJiAweGZmZmYpICsgKHN1bTEgPj4gMTYpOworICAgIAkgICAgc3VtMiA9IChzdW0yICYgMHhmZmZmKSArIChzdW0yID4+IDE2KTsgICAJICAgICAgICAJCisgICAgCX0KKyAgICAJCisgICAgCXN1bTEgPSAoc3VtMSAmIDB4ZmZmZikgKyAoc3VtMSA+PiAxNik7CisgICAgCXN1bTIgPSAoc3VtMiAmIDB4ZmZmZikgKyAoc3VtMiA+PiAxNik7CisgICAgCQorICAgIAlnb2xkZW5zdW0gPSAoc3VtMiA8PCAxNikgfCBzdW0xOworICAgICAgICBrPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBjaGtzdW0gPSAqKHVuc2lnbmVkIGxvbmcgKikgKHBqc3VtICsgaSo0KTsKKyAgICAgICAgICAgIHVkZWxheSgxMDApOworICAgICAgICAgICAgaysrOworICAgIAl9IHdoaWxlICgoY2hrc3VtID09IDApICYmIChrPDEwMDApKTsKKyAgICAJCisgICAgCWlmIChjaGtzdW0gIT0gZ29sZGVuc3VtKQorICAgIAl7CisgICAgCSAgICAgICAgU3RhdHVzID0gMTsJCisgICAgICAgICAgICAgICAgcHJpbnRmKCJbRkFJTF0gTUlDIENoa3N1bSBGYWlsZWQgYXQgUGFnZSAleCBcbiIsIGkpOworICAgIAl9CisKKyAgICB9IC8qIGVuZCBvZiBpIGxvb3AgKi8KKwkJCisgICAgcmV0dXJuIChTdGF0dXMpOworICAgIAkKK30KKworaW50IGRvX21pY3Rlc3QgKHZvaWQpCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgRmxhZ3MgPSAwOworCisgICAgICAgIHZJbml0U0NVKCk7CisgICAgICAgIHZJbml0TUlDKCk7CisgICAgICAgIAorICAgICAgICBpZiAoZG9fY2hrc3VtKCkpCisgICAgICAgICAgICBGbGFncyA9IDE7CisgICAgICAgICAgICAKKyAgICAgICAgdkRpc2FibGVNSUMoKTsKKyAgICAgICAgCisJcmV0dXJuIEZsYWdzOworCQorfQorCisjZW5kaWYgLyogQ09ORklHX1NMVCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDI0MDAvbWljdGVzdC5oIGIvYm9hcmQvYXNwZWVkL2FzdDI0MDAvbWljdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUxNGJiNDEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC9taWN0ZXN0LmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisvKiBNYWNybyAqLworI2RlZmluZSBtMDhieXRlQWxpZ25tZW50KHgpCQkoKHggKyAweDAwMDAwMDA3KSAmIDB4RkZGRkZGRjgpCisjZGVmaW5lIG0xNmJ5dGVBbGlnbm1lbnQoeCkJCSgoeCArIDB4MDAwMDAwMEYpICYgMHhGRkZGRkZGMCkKKyNkZWZpbmUgbTY0Ynl0ZUFsaWdubWVudCh4KQkJKCh4ICsgMHgwMDAwMDAzRikgJiAweEZGRkZGRkMwKQorCisvKiBPcHRpb25zICovCisjZGVmaW5lIE1JQ19URVNUX1BBR0UJCTMyCisjZGVmaW5lIERSQU1TSVpFCQkoTUlDX1RFU1RfUEFHRSAqIDB4MTAwMCkKKyNkZWZpbmUgTUlDX01BWF9DVFJMCQkoTUlDX1RFU1RfUEFHRSAvIDQgKyAxNikKKyNkZWZpbmUgTUlDX01BWF9DSEtTVU0JCShNSUNfVEVTVF9QQUdFICogNCArIDE2KQorCisvKiBEZWZhdWx0IFNldHRpbmcgKi8KKyNkZWZpbmUgREVGQVVMVF9SQVRFCQkweDAwMDAwMDAwCisjZGVmaW5lIERFRkFVTFRfQ1RSTAkJMHhGRgorI2RlZmluZSBERUZBVUxUX0NIS1NVTQkJMHgwMDAwMDAwMAorI2RlZmluZSBERUZBVUxUX1dSSVRFQkFDSwkweDA4ODgwMDAwCisKKy8qIFJlZy4gRGVmaW5pdGlvbiAqLworI2RlZmluZSBEUkFNX0JBU0UJCTB4NDAwMDAwMDAKKyNkZWZpbmUgTUlDX0JBU0UJCTB4MWU2NDAwMDAKKyNkZWZpbmUgTUlDX0NUUkxCVUZGX1JFRwkweDAwCisjZGVmaW5lIE1JQ19DSEtTVU1CVUZfUkVHCTB4MDQKKyNkZWZpbmUgTUlDX1JBVEVDVFJMX1JFRwkweDA4CisjZGVmaW5lIE1JQ19FTkdJTkVDVFJMX1JFRwkweDBDCisjZGVmaW5lIE1JQ19TVE9QUEFHRV9SRUcJMHgxMAorI2RlZmluZSBNSUNfU1RBVFVTX1JFRwkJMHgxNAorI2RlZmluZSBNSUNfU1RBVFVTMV9SRUcJCTB4MTgKKyNkZWZpbmUgTUlDX1NUQVRVUzJfUkVHCQkweDFDCisKKyNkZWZpbmUgTUlDX1JFU0VUX01JQwkJMHgwMDAwMDAwMAorI2RlZmluZSBNSUNfRU5BQkxFX01JQwkJMHgxMDAwMDAwMAorI2RlZmluZSBNSUNfTUFYUEFHRV9NQVNLCTB4MEZGRkYwMDAKKyNkZWZpbmUgTUlDX1dSSVRFQkFDS19NQVNLCTB4RkZGRjAwMDAKKyNkZWZpbmUgTUlDX1NUT1BQQUdFX01BU0sJMHgwMDAwRkZGRgorI2RlZmluZSBNSUNfUEFHRUVSUk9SCQkweDQwMDAwMDAwCisjZGVmaW5lIE1JQ19QQUdFMUVSUk9SCQkweDEwMDAwMDAwCisjZGVmaW5lIE1JQ19QQUdFMkVSUk9SCQkweDIwMDAwMDAwCisjZGVmaW5lIE1JQ19JTlRNQVNLCQkweDAwMDYwMDAwCisjZGVmaW5lIE1JQ19FUlJQQUdFTk9fTUFTSwkweDAwMDBGRkZGCisKKyNkZWZpbmUgTUlDX0NUUkxfTUFTSwkJMHgwMworI2RlZmluZSBNSUNfQ1RSTF9TS0lQCQkweDAwCisjZGVmaW5lIE1JQ19DVFJMX0NISzEJCTB4MDEKKyNkZWZpbmUgTUlDX0NUUkxfQ0hLMgkJMHgwMgorI2RlZmluZSBNSUNfQ1RSTF9DSEszCQkweDAzCmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjQwMC9wY2kuYyBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjViMTc0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC9wY2kuYwpAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHBjaS5oPgorCisjaWZkZWYgQ09ORklHX1BDSQorCisjZGVmaW5lIFBDSV9DU1JfQkFTRQkJMHg2MDAwMDAwMAorI2RlZmluZSBBU1BFRURfUENJX0lPX0JBU0UJMHgwMDAwMDAwMAorI2RlZmluZSBBU1BFRURfUENJX0lPX1NJWkUJMHgwMDAxMDAwMAorI2RlZmluZSBBU1BFRURfUENJX01FTV9CQVNFCTB4NjgwMDAwMDAKKyNkZWZpbmUgQVNQRUVEX1BDSV9NRU1fU0laRQkweDE4MDAwMDAwCisKKyNkZWZpbmUgQ1NSX0NSUF9DTURfT0ZGU0VUCTB4MDAKKyNkZWZpbmUgQ1NSX0NSUF9XUklURV9PRkZTRVQgICAgMHgwNAorI2RlZmluZSBDU1JfQ1JQX1JFQURfT0ZGU0VUCTB4MDgKKyNkZWZpbmUgQ1NSX1BDSV9BRERSX09GRlNFVAkweDBDCisjZGVmaW5lIENTUl9QQ0lfQ01EX09GRlNFVAkweDEwCisjZGVmaW5lIENTUl9QQ0lfV1JJVEVfT0ZGU0VUCTB4MTQKKyNkZWZpbmUgQ1NSX1BDSV9SRUFEX09GRlNFVAkweDE4CisjZGVmaW5lIENTUl9QQ0lfU1RBVFVTX09GRlNFVAkweDFDCisKKyNkZWZpbmUgQ1JQX0FERFJfUkVHCQkodm9sYXRpbGUgdWxvbmcqKSAoUENJX0NTUl9CQVNFICsgQ1NSX0NSUF9DTURfT0ZGU0VUKQorI2RlZmluZSBDUlBfV1JJVEVfUkVHCQkodm9sYXRpbGUgdWxvbmcqKSAoUENJX0NTUl9CQVNFICsgQ1NSX0NSUF9XUklURV9PRkZTRVQpCisjZGVmaW5lIENSUF9SRUFEX1JFRwkJKHZvbGF0aWxlIHVsb25nKikgKFBDSV9DU1JfQkFTRSArIENTUl9DUlBfUkVBRF9PRkZTRVQpCisjZGVmaW5lIFBDSV9BRERSX1JFRwkJKHZvbGF0aWxlIHVsb25nKikgKFBDSV9DU1JfQkFTRSArIENTUl9QQ0lfQUREUl9PRkZTRVQpCisjZGVmaW5lIFBDSV9DTURfUkVHCQkodm9sYXRpbGUgdWxvbmcqKSAoUENJX0NTUl9CQVNFICsgQ1NSX1BDSV9DTURfT0ZGU0VUKQorI2RlZmluZSBQQ0lfV1JJVEVfUkVHCQkodm9sYXRpbGUgdWxvbmcqKSAoUENJX0NTUl9CQVNFICsgQ1NSX1BDSV9XUklURV9PRkZTRVQpCisjZGVmaW5lIFBDSV9SRUFEX1JFRwkJKHZvbGF0aWxlIHVsb25nKikgKFBDSV9DU1JfQkFTRSArIENTUl9QQ0lfUkVBRF9PRkZTRVQpCisKKyNkZWZpbmUgUENJX0NNRF9SRUFECQkweDBBCisjZGVmaW5lIFBDSV9DTURfV1JJVEUJCTB4MEIKKworI2RlZmluZSBSRVNFVF9QQ0lfU1RBVFVTICAgICAgICAqKHZvbGF0aWxlIHVsb25nKikgKFBDSV9DU1JfQkFTRSArIENTUl9QQ0lfU1RBVFVTX09GRlNFVCkgPSAweDAxCisjZGVmaW5lIENIS19QQ0lfU1RBVFVTICAgICAgICAgICgqKHZvbGF0aWxlIHVsb25nKikgKFBDSV9DU1JfQkFTRSArIENTUl9QQ0lfU1RBVFVTX09GRlNFVCkgJiAweDAzKQorCitzdGF0aWMgaW50IHBjaV9jb25maWdfYWNjZXNzICh1OCBhY2Nlc3NfdHlwZSwgdTMyIGRldiwgdTMyIHJlZywgdTMyICogZGF0YSkKK3sKKwl1MzIgYnVzOworCXUzMiBkZXZpY2U7CisJdTMyIGZ1bmN0aW9uOworCisJYnVzID0gKChkZXYgJiAweGZmMDAwMCkgPj4gMTYpOworCWRldmljZSA9ICgoZGV2ICYgMHhmODAwKSA+PiAxMSk7CisJZnVuY3Rpb24gPSAoZGV2ICYgMHgwNzAwKTsKKworCWlmIChidXMgPT0gMCkgeworCQkvLyBUeXBlIDAgQ29uZmlndXJhdGlvbiAJCQorCQkqUENJX0FERFJfUkVHID0gKHUzMikgKDFVTCA8PCBkZXZpY2UgfCBmdW5jdGlvbiB8IChyZWcgJiAweGZjKSk7CisJfSBlbHNlIHsKKwkJLy8gVHlwZSAxIENvbmZpZ3VyYXRpb24gCisJCSpQQ0lfQUREUl9SRUcgPSAodTMyKSAoZGV2IHwgKChyZWcgLyA0KSA8PCAyKSB8IDEpOworCX0KKworICAgICAgICBSRVNFVF9QQ0lfU1RBVFVTOworICAgICAgICAKKwlpZiAoYWNjZXNzX3R5cGUgPT0gUENJX0NNRF9XUklURSkgeworCQkqUENJX0NNRF9SRUcgPSAodWxvbmcpIFBDSV9DTURfV1JJVEU7CisJCSpQQ0lfV1JJVEVfUkVHID0gKmRhdGE7CisJfSBlbHNlIHsKKwkJKlBDSV9DTURfUkVHID0gKHVsb25nKSBQQ0lfQ01EX1JFQUQ7CQkKKwkJKmRhdGEgPSAqUENJX1JFQURfUkVHOworCX0KKyAgICAgICAgICAgIAorCXJldHVybiAoQ0hLX1BDSV9TVEFUVVMpOworfQorCitzdGF0aWMgaW50IGFzcGVlZF9wY2lfcmVhZF9jb25maWdfYnl0ZSAodTMyIGhvc2UsIHUzMiBkZXYsIHUzMiByZWcsIHU4ICogdmFsKQoreworCXUzMiBkYXRhOworCisJaWYgKHBjaV9jb25maWdfYWNjZXNzIChQQ0lfQ01EX1JFQUQsIGRldiwgcmVnLCAmZGF0YSkpIHsKKwkJKnZhbCA9IDA7CisJCXJldHVybiAtMTsKKwl9CQorCisJKnZhbCA9IChkYXRhID4+ICgocmVnICYgMykgPDwgMykpICYgMHhmZjsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYXNwZWVkX3BjaV9yZWFkX2NvbmZpZ193b3JkICh1MzIgaG9zZSwgdTMyIGRldiwgdTMyIHJlZywgdTE2ICogdmFsKQoreworCXUzMiBkYXRhOworCisJaWYgKHJlZyAmIDEpCisJCXJldHVybiAtMTsKKworCWlmIChwY2lfY29uZmlnX2FjY2VzcyAoUENJX0NNRF9SRUFELCBkZXYsIHJlZywgJmRhdGEpKSB7CisJCSp2YWwgPSAwOworCQlyZXR1cm4gLTE7CisJfSAJCQorCisJKnZhbCA9IChkYXRhID4+ICgocmVnICYgMykgPDwgMykpICYgMHhmZmZmOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBhc3BlZWRfcGNpX3JlYWRfY29uZmlnX2R3b3JkICh1MzIgaG9zZSwgdTMyIGRldiwgdTMyIHJlZywKKwkJCQkJIHUzMiAqIHZhbCkKK3sKKwl1MzIgZGF0YSA9IDA7CisKKwlpZiAocmVnICYgMykKKwkJcmV0dXJuIC0xOworCisJaWYgKHBjaV9jb25maWdfYWNjZXNzIChQQ0lfQ01EX1JFQUQsIGRldiwgcmVnLCAmZGF0YSkpCXsKKwkJKnZhbCA9IDA7CisJCXJldHVybiAtMTsKKwl9CQkKKworCSp2YWwgPSBkYXRhOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBhc3BlZWRfcGNpX3dyaXRlX2NvbmZpZ19ieXRlICh1MzIgaG9zZSwgdTMyIGRldiwgdTMyIHJlZywgdTggdmFsKQoreworCXUzMiBkYXRhID0gMDsKKworCWlmIChwY2lfY29uZmlnX2FjY2VzcyAoUENJX0NNRF9SRUFELCBkZXYsIHJlZywgJmRhdGEpKQorCQlyZXR1cm4gLTE7CisKKwlkYXRhID0gKGRhdGEgJiB+KDB4ZmYgPDwgKChyZWcgJiAzKSA8PCAzKSkpIHwgKHZhbCA8PAorCQkJCQkJICAgICAgICgocmVnICYgMykgPDwgMykpOworCisJaWYgKHBjaV9jb25maWdfYWNjZXNzIChQQ0lfQ01EX1dSSVRFLCBkZXYsIHJlZywgJmRhdGEpKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFzcGVlZF9wY2lfd3JpdGVfY29uZmlnX3dvcmQgKHUzMiBob3NlLCB1MzIgZGV2LCB1MzIgcmVnLCB1MTYgdmFsKQoreworCXUzMiBkYXRhID0gMDsKKworCWlmIChyZWcgJiAxKQorCQlyZXR1cm4gLTE7CisKKwlpZiAocGNpX2NvbmZpZ19hY2Nlc3MgKFBDSV9DTURfUkVBRCwgZGV2LCByZWcsICZkYXRhKSkKKwkJcmV0dXJuIC0xOworCisJZGF0YSA9IChkYXRhICYgfigweGZmZmYgPDwgKChyZWcgJiAzKSA8PCAzKSkpIHwgKHZhbCA8PAorCQkJCQkJCSAoKHJlZyAmIDMpIDw8IDMpKTsKKworCWlmIChwY2lfY29uZmlnX2FjY2VzcyAoUENJX0NNRF9XUklURSwgZGV2LCByZWcsICZkYXRhKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXNwZWVkX3BjaV93cml0ZV9jb25maWdfZHdvcmQgKHUzMiBob3NlLCB1MzIgZGV2LCB1MzIgcmVnLCB1MzIgdmFsKQoreworCXUzMiBkYXRhOworCisJaWYgKHJlZyAmIDMpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCWRhdGEgPSB2YWw7CisKKwlpZiAocGNpX2NvbmZpZ19hY2Nlc3MgKFBDSV9DTURfV1JJVEUsIGRldiwgcmVnLCAmZGF0YSkpCisJCXJldHVybiAtMTsKKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKglJbml0aWFsaXplIFBDSVUKKyAqLworYXNwZWVkX3BjaXVfaW5pdCAoKQoreworCisgICAgdW5zaWduZWQgbG9uZyByZWc7CisKKyAgICAvKiBSZXNldCBQQ0kgSG9zdCAqLworICAgIHJlZyA9ICooKHZvbGF0aWxlIHVsb25nKikgMHgxZTZlMjAwNCk7CisgICAgKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNmUyMDA0KSA9IHJlZyB8IDB4MDAyODAwMDA7CisKKyAgICByZWcgPSAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwNzQpOwkJLyogUkVRMiAqLyAgICAKKyAgICAqKCh2b2xhdGlsZSB1bG9uZyopIDB4MWU2ZTIwNzQpID0gcmVnIHwgMHgwMDAwMDAxMDsKKworICAgICooKHZvbGF0aWxlIHVsb25nKikgMHgxZTZlMjAwOCkgfD0gMHgwMDA4MDAwMDsgICAgICAgIAorICAgIHJlZyA9ICooKHZvbGF0aWxlIHVsb25nKikgMHgxZTZlMjAwYyk7IAorICAgICooKHZvbGF0aWxlIHVsb25nKikgMHgxZTZlMjAwYykgPSByZWcgJiAweGZmZjdmZmZmOworICAgIHVkZWxheSgxKTsgCisgICAgKigodm9sYXRpbGUgdWxvbmcqKSAweDFlNmUyMDA0KSAmPSAweGZmZjdmZmZmOworICAgICAgICAgICAgICAgICAKKyAgICAvKiBJbml0aWFsIFBDSSBIb3N0ICovCisgICAgUkVTRVRfUENJX1NUQVRVUzsKKwkKKyAgICAqQ1JQX0FERFJfUkVHID0gKCh1bG9uZykoUENJX0NNRF9SRUFEKSA8PCAxNikgfCAweDA0OworICAgIHJlZyA9ICpDUlBfUkVBRF9SRUc7CisgICAgCisgICAgKkNSUF9BRERSX1JFRyA9ICgodWxvbmcpKFBDSV9DTURfV1JJVEUpIDw8IDE2KSB8IDB4MDQ7CisgICAgKkNSUF9XUklURV9SRUcgPSByZWcgfCAweDA3OworICAgCit9CisKKy8qCisgKglJbml0aWFsaXplIE1vZHVsZQorICovCisKK3ZvaWQgYXNwZWVkX2luaXRfcGNpIChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJaG9zZS0+Zmlyc3RfYnVzbm8gPSAwOworCWhvc2UtPmxhc3RfYnVzbm8gPSAweGZmOworCisJYXNwZWVkX3BjaXVfaW5pdCAoKTsJCQkvKiBJbml0aWFsaXplIFBDSVUgKi8KKworCS8qIFBDSSBtZW1vcnkgc3BhY2UgIzEgKi8KKwlwY2lfc2V0X3JlZ2lvbiAoaG9zZS0+cmVnaW9ucyArIDAsCisJCQlBU1BFRURfUENJX01FTV9CQVNFLCBBU1BFRURfUENJX01FTV9CQVNFLCBBU1BFRURfUENJX01FTV9TSVpFLCBQQ0lfUkVHSU9OX01FTSk7CisKKwkvKiBQQ0kgSS9PIHNwYWNlICovCisJcGNpX3NldF9yZWdpb24gKGhvc2UtPnJlZ2lvbnMgKyAxLAorCQkJQVNQRUVEX1BDSV9JT19CQVNFLCBBU1BFRURfUENJX0lPX0JBU0UsIEFTUEVFRF9QQ0lfSU9fU0laRSwgUENJX1JFR0lPTl9JTyk7CisKKwlob3NlLT5yZWdpb25fY291bnQgPSAyOworCisJaG9zZS0+cmVhZF9ieXRlICAgPSBhc3BlZWRfcGNpX3JlYWRfY29uZmlnX2J5dGU7CisJaG9zZS0+cmVhZF93b3JkICAgPSBhc3BlZWRfcGNpX3JlYWRfY29uZmlnX3dvcmQ7CisJaG9zZS0+cmVhZF9kd29yZCAgPSBhc3BlZWRfcGNpX3JlYWRfY29uZmlnX2R3b3JkOworCWhvc2UtPndyaXRlX2J5dGUgID0gYXNwZWVkX3BjaV93cml0ZV9jb25maWdfYnl0ZTsKKwlob3NlLT53cml0ZV93b3JkICA9IGFzcGVlZF9wY2lfd3JpdGVfY29uZmlnX3dvcmQ7CisJaG9zZS0+d3JpdGVfZHdvcmQgPSBhc3BlZWRfcGNpX3dyaXRlX2NvbmZpZ19kd29yZDsKKworCXBjaV9yZWdpc3Rlcl9ob3NlIChob3NlKTsKKworCWhvc2UtPmxhc3RfYnVzbm8gPSBwY2lfaG9zZV9zY2FuIChob3NlKTsKKworCXJldHVybjsKK30KKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKZGlmZiAtLWdpdCBhL2JvYXJkL2FzcGVlZC9hc3QyNDAwL3BsYXRmb3JtLlMgYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC9wbGF0Zm9ybS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZThmMjYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC9wbGF0Zm9ybS5TCkBAIC0wLDAgKzEsMzA4OSBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisvKgorICogQm9hcmQgc3BlY2lmaWMgc2V0dXAgaW5mbworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFTUEVFRCBUZWNobm9sb2d5IEluYy4KKyAqIEFTVDIzMDAvQVNUMjQwMCBERFIyL0REUjMgU0RSQU0gY29udHJvbGxlciBpbml0aWFsaXphdGlvbiBhbmQgY2FsaWJyYXRpb24gc2VxdWVuY2UKKyAqCisgKiBHYXJ5IEhzdSwgPGdhcnlfaHN1QGFzcGVlZHRlY2guY29tPgorICoKKyAqIFJlbGVhc2UgZGF0ZTogMjAxNC4xMi4yOSBmb3JtYWwgcmVsZWFzZSBmb3IgU0RLMC42MAorICoKKyAqIE1vZGlmaWVkIGxpc3QgZnJvbSB2MC4yMworICogRUMxLiBNb2RpZnkgRFFJRExZIGFuZCBEUVNJLU1DTEsyWCBjYWxpYnJhdGlvbiBhbGdvcml0aG0KKyAqIEVDMi4gUmVtb3ZlIHBhc3MgMiBEUUlETFkgZmluZXR1bmUgcHJvY2VzcworICogRUMzLiBNb2RpZnkgRUNDIGNvZGUKKyAqIEVDNC4gQWRkIEFTVDI0MDAgc3VwcG9ydGluZworICogRUM1LiBBZGQgU1BJIHRpbWluZyBjYWxpYnJhdGlvbiBmb3IgQVNUMjQwMAorICogRUM2LiBSZW1vdmUgQVNUMjMwMC1BMCBQQ0ktZSB3b3JrYXJvdW5kCisgKiBFQzcuIEFkZCBDSyBkdXR5IGNhbGlicmF0aW9uIGZvciBBU1QyNDAwCisgKiBFQzguIFJlbW92ZSAjZGVmaW5lIENPTkZJR19EUkFNX1VBUlRfT1VULCBkZWZhdWx0IGhhcyBtZXNzYWdlIG91dHB1dCB0byBVQVJUNQorICogRUM5LiBBZGQgRFJBTSBzaXplIGF1dG8tZGV0ZWN0aW9uCisgKiBFQzEwLiBBZGQgR1BJTyByZWdpc3RlciBjbGVhciB3aGVuIHdhdGNoZG9nIHJlYm9vdCAob25seSBmb3IgQVNUMjQwMCkKKyAqIEVDMTEuIE1vdmUgdGhlICJTb2x2ZSBBU1BNIiBjb2RlIHBvc2l0aW9uIG9mIEFTVDIzMDAgdG8gYXZvaWQgd2F0Y2hkb2cgcmVzZXQKKyAqCisgKiBNb2RpZmllZCBsaXN0IGZyb20gdjAuNTMKKyAqIEVDMS4gQWRkIHNvbHV0aW9uIG9mIExQQyBsb2NrIGlzc3VlIGR1ZSB0byB3YXRjaGRvZyByZXNldC4gKEFQIG5vdGUgQTIzMDAtMTEpCisgKgorICogTW9kaWZpZWQgbGlzdCBmcm9tIHYwLjU2CisgKiBFQzEuIEZpeCByZWFkIERRUyBpbnB1dCBtYXNrIHdpbmRvdyB0b28gbGF0ZSBpc3N1ZSBpZiBEUkFNJ3MgdF9EUVNDSyBpcyBlYXJsaWVyIHRvbyBtdWNoCisgKiAgICAgIChleC4gTmFueWEgTlQ1Q0I2NE0xNkZQKQorICogICAgICAxLiBDaGFuZ2UgaW5pdCB2YWx1ZSBvZiBNQ1IxOFs0XSBmcm9tICcxJyB0byAnMCcKKyAqICAgICAgMi4gQWRkIENCUjQgY29kZSB0byBmaW5ldHVuZSBNQ1IxOFs0XQorICoKKyAqIE1vZGlmaWVkIGxpc3QgZnJvbSB2MC41OQorICogRUMxLiBBZGQgRFFTIGlucHV0IGdhdGluZyB3aW5kb3cgZGVsYXkgdHVuaW5nICgxLzIgVCkgd2hlbiBDQlIgcmV0cnkKKyAqIEVDMi4gTW9kaWZ5IERMTDEgTUFkaiA9IDB4NEMKKyAqCisgKiBPcHRpb25hbCBkZWZpbmUgdmFyaWFibGUKKyAqIDEuIERSQU0gU3BlZWQgICAgICAgICAgICAgLy8KKyAqICAgIENPTkZJR19EUkFNXzMzNiAgICAgICAgLy8gMzM2TUh6IChERFItNjY3KQorICogICAgQ09ORklHX0RSQU1fNDA4ICAgICAgICAvLyA0MDhNSHogKEREUi04MDApIChkZWZhdWx0KQorICogMi4gRUNDIEZ1bmN0aW9uIGVuYWJsZQorICogICAgQ09ORklHX0RSQU1fRUNDICAgICAgICAvLyBkZWZpbmUgdG8gZW5hYmxlIEVDQyBmdW5jdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGVuYWJsZWQsIG11c3QgZGVmaW5lIHRoZSBFQ0MgcHJvdGVjdGVkIG1lbW9yeSBzaXplIGF0IDB4MWU2ZTAwNTQKKyAqIDMuIFVBUlQ1IG1lc3NhZ2Ugb3V0cHV0ICAgLy8KKyAqICAgIENPTkZJR19EUkFNX1VBUlRfMzg0MDAgLy8gc2V0IHRoZSBVQVJUIGJhdWQgcmF0ZSB0byAzODQwMCwgZGVmYXVsdCBpcyAxMTUyMDAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8dmVyc2lvbi5oPgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIENhbGlicmF0aW9uIE1hY3JvIFN0YXJ0CisgVXNhYmxlIHJlZ2lzdGVyczoKKyAgcjAsIHIxLCByMiwgcjMsIHI1LCByNiwgcjcsIHI4LCByOSwgcjEwLCByMTEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQQVRURVJOX1RBQkxFLAorICAgaW5pdF9kZWxheV90aW1lciwKKyAgIGNoZWNrX2RlbGF5X3RpbWVyLAorICAgY2xlYXJfZGVsYXlfdGltZXIsCisgICByZWNvcmRfZGxsMl9wYXNzX3JhbmdlLAorICAgcmVjb3JkX2RsbDJfcGFzc19yYW5nZV9oLAorICAgYXJlIGZvciBEUkFNIGNhbGlicmF0aW9uICovCisKK1BBVFRFUk5fVEFCTEU6CisgICAgLndvcmQgICAweGZmMDBmZjAwCisgICAgLndvcmQgICAweGNjMzNjYzMzCisgICAgLndvcmQgICAweGFhNTVhYTU1CisgICAgLndvcmQgICAweDg4Nzc4ODc3CisgICAgLndvcmQgICAweDkyY2M0ZDZlICAgICAgIEAgNQorICAgIC53b3JkICAgMHg1NDNkM2NkZQorICAgIC53b3JkICAgMHhmMWU4NDNjNworICAgIC53b3JkICAgMHg3YzYxZDI1MworICAgIC53b3JkICAgMHgwMDAwMDAwMCAgICAgICBAIDgKKworICAgIC5tYWNybyBpbml0X2RlbGF5X3RpbWVyCisgICAgbGRyIHIwLCA9MHgxZTc4MjAyNCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgVGltZXIzIFJlbG9hZAorICAgIHN0ciByMiwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZjMDAzOCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBDbGVhciBUaW1lcjMgSVNSCisgICAgbGRyIHIxLCA9MHgwMDA0MDAwMAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTc4MjAzMCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBFbmFibGUgVGltZXIzCisgICAgbGRyIHIxLCBbcjBdCisgICAgbW92IHIyLCAjNworICAgIG9yciByMSwgcjEsIHIyLCBsc2wgIzgKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2YzAwOTAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQ2hlY2sgSVNSIGZvciBUaW1lcjMgdGltZW91dAorICAgIC5lbmRtCisKKyAgICAubWFjcm8gY2hlY2tfZGVsYXlfdGltZXIKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBiaWMgcjEsIHIxLCAjMHhGRkZCRkZGRgorICAgIG1vdiByMiwgcjEsIGxzciAjMTgKKyAgICBjbXAgcjIsICMweDAxCisgICAgLmVuZG0KKworICAgIC5tYWNybyBjbGVhcl9kZWxheV90aW1lcgorICAgIGxkciByMCwgPTB4MWU3ODIwMzAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgRGlzYWJsZSBUaW1lcjMKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBiaWMgcjEsIHIxLCAjMHgwMDAwMEYwMAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZjMDAzOCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBDbGVhciBUaW1lcjMgSVNSCisgICAgbGRyIHIxLCA9MHgwMDA0MDAwMAorICAgIHN0ciByMSwgW3IwXQorICAgIC5lbmRtCisKKyAgICAubWFjcm8gcmVjb3JkX2RsbDJfcGFzc19yYW5nZQorICAgIGxkciAgICAgICAgICAgICAgICAgcjEsIFtyMF0KKyAgICBiaWMgICAgICAgICAgICAgICAgIHIyLCByMSwgIzB4RkZGRkZGMDAKKyAgICBjbXAgICAgICAgICAgICAgICAgIHIyLCByMyAgICAgICAgICAgICAgICAgICBAIHJlY29yZCBtaW4KKyAgICBiaWNndCAgICAgICAgICAgICAgIHIxLCByMSwgIzB4MDAwMDAwRkYKKyAgICBvcnJndCAgICAgICAgICAgICAgIHIxLCByMSwgcjMKKyAgICBiaWMgICAgICAgICAgICAgICAgIHIyLCByMSwgIzB4RkZGRjAwRkYKKyAgICBjbXAgICAgICAgICAgICAgICAgIHIzLCByMiwgbHNyICM4ICAgICAgICAgICBAIHJlY29yZCBtYXgKKyAgICBiaWNndCAgICAgICAgICAgICAgIHIxLCByMSwgIzB4MDAwMEZGMDAKKyAgICBvcnJndCAgICAgICAgICAgICAgIHIxLCByMSwgcjMsIGxzbCAjOAorICAgIHN0ciAgICAgICAgICAgICAgICAgcjEsIFtyMF0KKyAgICAuZW5kbQorCisgICAgLm1hY3JvIHJlY29yZF9kbGwyX3Bhc3NfcmFuZ2VfaAorICAgIGxkciAgICAgICAgICAgICAgICAgcjEsIFtyMF0KKyAgICBiaWMgICAgICAgICAgICAgICAgIHIyLCByMSwgIzB4RkYwMEZGRkYKKyAgICBtb3YgICAgICAgICAgICAgICAgIHIyLCByMiwgbHNyICMxNgorICAgIGNtcCAgICAgICAgICAgICAgICAgcjIsIHIzICAgICAgICAgICAgICAgICAgIEAgcmVjb3JkIG1pbgorICAgIGJpY2d0ICAgICAgICAgICAgICAgcjEsIHIxLCAjMHgwMEZGMDAwMAorICAgIG9ycmd0ICAgICAgICAgICAgICAgcjEsIHIxLCByMywgbHNsICMxNgorICAgIGJpYyAgICAgICAgICAgICAgICAgcjIsIHIxLCAjMHgwMEZGRkZGRgorICAgIGNtcCAgICAgICAgICAgICAgICAgcjMsIHIyLCBsc3IgIzI0ICAgICAgICAgIEAgcmVjb3JkIG1heAorICAgIGJpY2d0ICAgICAgICAgICAgICAgcjEsIHIxLCAjMHhGRjAwMDAwMAorICAgIG9ycmd0ICAgICAgICAgICAgICAgcjEsIHIxLCByMywgbHNsICMyNAorICAgIHN0ciAgICAgICAgICAgICAgICAgcjEsIFtyMF0KKyAgICAuZW5kbQorCisgICAgLm1hY3JvIGluaXRfc3BpX2NoZWNrc3VtCisgICAgbGRyIHIwLCA9MHgxZTYyMDA4NAorICAgIGxkciByMSwgPTB4MjAwMTAwMDAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNjIwMDhDCisgICAgbGRyIHIxLCA9MHgyMDAwMDIwMAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU2MjAwODAKKyAgICBsZHIgcjEsID0weDAwMDAwMDBECisgICAgb3JyIHIyLCByMiwgcjcKKyAgICBvcnIgcjEsIHIxLCByMiwgbHNsICM4CisgICAgYW5kIHIyLCByNiwgIzB4RgorICAgIG9yciByMSwgcjEsIHIyLCBsc2wgIzQKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNjIwMDA4CisgICAgbGRyIHIyLCA9MHgwMDAwMDgwMAorICAgIC5lbmRtCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBDYWxpYnJhdGlvbiBNYWNybyBFbmQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMUENfUGF0Y2g6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIHRvIFNSQU0gYmFzZSAweDFlNzIwNDAwCisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBzdHIgICByMywgW3IyXQorICAgIGJpYyAgIHIxLCByMSwgIzB4RkYKK0xQQ19QYXRjaF9TMToKKyAgICBzdWJzICByNSwgcjUsICMweDAxCisgICAgbW92ZXEgcGMsIHI4CisgICAgbGRyICAgcjMsIFtyMl0KKyAgICB0c3QgICByMywgIzB4MDEKKyAgICBtb3ZuZSBwYywgcjgKKyAgICBtb3YgICBwYywgcjcKK0xQQ19QYXRjaF9TMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGxvYWQgdG8gU1JBTSBiYXNlIDB4MWU3MjA0ODAKKyAgICBzdHIgICByMSwgW3IwXQorICAgIG1vdiAgIHBjLCByOQorTFBDX1BhdGNoX0U6CisKKy5nbG9ibCBsb3dsZXZlbF9pbml0Citsb3dsZXZlbF9pbml0OgorCitpbml0X2RyYW06CisgICAgLyogc2F2ZSBsciAqLworICAgIG1vdiByNCwgbHIKKy8qIFRlc3QgLSBEUkFNIGluaXRpYWwgdGltZSAqLworICAgIGxkciByMCwgPTB4MWU3ODIwNDQKKyAgICBsZHIgcjEsID0weEZGRkZGRkZGCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNzgyMDMwCisgICAgbGRyIHIxLCBbcjBdCisgICAgYmljIHIxLCByMSwgIzB4MDAwMEYwMDAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjIsICMzCisgICAgb3JyIHIxLCByMSwgcjIsIGxzbCAjMTIKKyAgICBzdHIgcjEsIFtyMF0KKy8qIFRlc3QgLSBEUkFNIGluaXRpYWwgdGltZSAqLworCisgICAgLypTZXQgU2NyYXRjaCByZWdpc3RlciBCaXQgNyBiZWZvcmUgaW5pdGlhbGl6ZSovCisgICAgbGRyIHIwLCA9MHgxZTZlMjAwMAorICAgIGxkciByMSwgPTB4MTY4OGE4YTgKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTIwNDAKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBvcnIgcjEsIHIxLCAjMHg4MAorICAgIHN0ciByMSwgW3IwXQorCisgICAgLyogRml4IExQQyBsb2NrIGlzc3VlIGZvciBBU1QyMzAwICovCisgICAgbGRyIHIwLCA9MHgxZTZlMjA3YyAgICAgICAgICAgICAgICAgICAgICAgICAgQCBDaGVjayBBU1QyMzAwCisgICAgbGRyIHIxLCBbcjBdCisgICAgbW92IHIxLCByMSwgbHNyICMyNAorICAgIGNtcCByMSwgIzB4MDEKKyAgICBibmUgbHBjX3JlY292ZXJfZW5kICAgICAgICAgICAgICAgICAgICAgICAgICBAIG5vdCBtYXRjaCBBU1QyMzAwCisKKyAgICBtb3YgcjMsICMweDAKK2xwY19yZWNvdmVyX2NoZWNrOgorICAgIGxkciByMCwgPTB4MWU3ODkwMGMgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY2hlY2sgSElDUjNbNF09MHgxCisgICAgbGRyIHIxLCBbcjBdCisgICAgdHN0IHIxLCAjMHgxMAorICAgIGJlcSBscGNfcmVjb3Zlcl9lbmQKKyAgICBsZHIgcjAsID0weDFlNzg5MDA0ICAgICAgICAgICAgICAgICAgICAgICAgICBAIGNoZWNrIEhJQ1IxWzddPTB4MQorICAgIGxkciByMSwgW3IwXQorICAgIHRzdCByMSwgIzB4ODAKKyAgICBiZXEgbHBjX3JlY292ZXJfZW5kCisgICAgbGRyIHIwLCA9MHgxZTc4OTBhMCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjaGVjayBMSENSMFsyNzoyNF09MHg2CisgICAgbGRyIHIxLCBbcjBdCisgICAgbW92IHIxLCByMSwgbHNyICMyNAorICAgIGFuZCByMSwgcjEsICMweEYKKyAgICBjbXAgcjEsICMweDA2CisgICAgYm5lIGxwY19yZWNvdmVyX2VuZAorICAgIGFkZCByMywgcjMsICMweDAxCisgICAgY21wIHIzLCAjMHg1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCByZXBlYXQgNSB0aW1lcworICAgIGJsZSBscGNfcmVjb3Zlcl9jaGVjaworCisgICAgbW92IHIzLCAjMHgwCitscGNfcmVjb3Zlcl9pbml0OgorICAgIGxkciByMCwgPTB4MWU3ODkwYTQgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc2V0IExIQ1IxWzE6MF09MHgwCisgICAgbGRyIHIxLCA9MHgwMDAwMDAwMAorICAgIHN0ciByMSwgW3IwXQorICAgIGFkZCByMywgcjMsICMweDAxCisgICAgY21wIHIzLCAjMHgyMAorICAgIGJnZSBscGNfcmVjb3Zlcl9lbmQKKyAgICBsZHIgcjEsIFtyMF0KKyAgICB0c3QgcjEsICMweDAxCisgICAgYm5lIGxwY19yZWNvdmVyX2luaXQKKworICAgIGxkciByMCwgPTB4MWU3ODkwYjAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc2V0IExIQ1I0Wzc6MF09MHhGRgorICAgIGxkciByMSwgPTB4MDAwMDAwRkYKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzg5MGI0ICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNldCBMSENSNVszMTowXT0weEZGRkZGRkZGCisgICAgbGRyIHIxLCA9MHhGRkZGRkZGRgorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODkwYjggICAgICAgICAgICAgICAgICAgICAgICAgIEAgc2V0IExIQ1I2WzMxOjBdPTB4RkZGRkZGRkYKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGFkciByNiwgTFBDX1BhdGNoCisgICAgYWRyIHI3LCBMUENfUGF0Y2hfUzIKKyAgICBsZHIgcjAsID0weDFlNzIwNDAwCitjb3B5X2xwY19wYXRjaF8xOgorICAgIGxkciByMSwgW3I2XQorICAgIHN0ciByMSwgW3IwXQorICAgIGFkZCByNiwgcjYsICMweDQKKyAgICBhZGQgcjAsIHIwLCAjMHg0CisgICAgY21wIHI2LCByNworICAgIGJuZSBjb3B5X2xwY19wYXRjaF8xCisKKyAgICBhZHIgcjYsIExQQ19QYXRjaF9TMgorICAgIGFkciByNywgTFBDX1BhdGNoX0UKKyAgICBsZHIgcjAsID0weDFlNzIwNDgwCitjb3B5X2xwY19wYXRjaF8yOgorICAgIGxkciByMSwgW3I2XQorICAgIHN0ciByMSwgW3IwXQorICAgIGFkZCByNiwgcjYsICMweDQKKyAgICBhZGQgcjAsIHIwLCAjMHg0CisgICAgY21wIHI2LCByNworICAgIGJuZSBjb3B5X2xwY19wYXRjaF8yCisKKyAgICBsZHIgcjAsID0weDFlNzg5MGEwICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNldCBMSENSMFszMTowXT0weEZGRkZGRjAxCisgICAgbGRyIHIxLCA9MHhGRkZGRkYwMQorICAgIGFkZCByMiwgcjAsICMweDQKKyAgICBtb3YgcjMsICMweDAxCisgICAgbW92IHI1LCAjMHgxMAorICAgIGFkciByOSwgbHBjX3JlY292ZXJfZW5kCisgICAgYWRyIHI2LCBMUENfUGF0Y2gKKyAgICBhZHIgcjcsIExQQ19QYXRjaF9TMQorICAgIHN1YiByNiwgcjcsIHI2CisgICAgbGRyIHI3LCA9MHgxZTcyMDQwMAorICAgIGFkZCByNywgcjcsIHI2CisgICAgbGRyIHI4LCA9MHgxZTcyMDQ4MAorICAgIGxkciBwYywgPTB4MWU3MjA0MDAKKworbHBjX3JlY292ZXJfZW5kOgorICAgIGxkciByMCwgPTB4MWU3ODkwYTAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc2V0IExIQ1IwWzMxOjBdPTB4RkZGRkZGMDAKKyAgICBsZHIgcjEsID0weEZGRkZGRjAwCisgICAgc3RyIHIxLCBbcjBdCisgICAgLyogPEVORD4gRml4IExQQyBsb2NrIGlzc3VlIGZvciBBU1QyMzAwICovCisKKyAgICAvKiBDaGVjayBTY3JhdGNoIFJlZ2lzdGVyIEJpdCA2ICovCisgICAgbGRyIHIwLCA9MHgxZTZlMjA0MAorICAgIGxkciByMSwgW3IwXQorICAgIGJpYyByMSwgcjEsICMweEZGRkZGRkJGCisgICAgbW92IHIyLCByMSwgbHNyICM2CisgICAgY21wIHIyLCAjMHgwMQorICAgIGJlcSBwbGF0Zm9ybV9leGl0CisKKyAgICBsZHIgcjIsID0weDAzMzEwM0YxICAgICAgICAgICAgICAgICAgICAgICAgICBAIGxvYWQgUExMIHBhcmFtZXRlciBmb3IgMjRNaHogQ0xLSU4gKDM5NjozMjQpCisvKiAgbGRyIHIyLCA9MHgwMTkwMDFGMCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIFBMTCBwYXJhbWV0ZXIgZm9yIDI0TWh6IENMS0lOICg0MDg6MzM2KSAqLworICAgIGxkciByMCwgPTB4MWU2ZTIwN2MgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQ2hlY2sgUmV2aXNpb24gSUQKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsIHIxLCBsc3IgIzI0CisgICAgY21wIHIxLCAjMHgwMgorICAgIGJuZSBzZXRfTVBMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbm90IG1hdGNoIEFTVDI0MDAKKworICAgIGxkciByMCwgPTB4MWU2ZTIwNzAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQ2hlY2sgQ0xLSU4gZnJlcQorICAgIGxkciByMSwgW3IwXQorICAgIG1vdiByMSwgcjEsIGxzciAjMjMKKyAgICB0c3QgcjEsICMweDAxCisgICAgbGRybmUgcjIsID0weDAxNzAwMUQwICAgICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIFBMTCBwYXJhbWV0ZXIgZm9yIDI1TWh6IENMS0lOICg0MDA6MzI1KQorCitzZXRfTVBMTDoKKyAgICBsZHIgcjAsID0weDFlNmUyMDIwICAgICAgICAgICAgICAgICAgICAgICAgICBAIE0tUExMIChERFIgU0RSQU0pIEZyZXF1ZW5jeQorICAgIGxkciByMSwgPTB4RkZGRgorI2lmIGRlZmluZWQoQ09ORklHX0RSQU1fMzM2KQorICAgIG1vdiByMiwgcjIsIGxzciAjMTYKKyNlbmRpZgorICAgIGFuZCByMSwgcjIsIHIxCisgICAgc3RyIHIxLCBbcjBdCisKKy8qIERlYnVnIC0gVUFSVCBjb25zb2xlIG1lc3NhZ2UgKi8KKyAgICBsZHIgcjAsID0weDFlNzg0MDBjCisgICAgbW92IHIxLCAjMHg4MworICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMjAyYworICAgIGxkciByMiwgW3IwXQorICAgIG1vdiByMiwgcjIsIGxzciAjMTIKKyAgICB0c3QgcjIsICMweDAxCisgICAgbGRyIHIwLCA9MHgxZTc4NDAwMAorICAgIG1vdmVxIHIxLCAjMHgwRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQmF1ZHJhdGUgMTE1MjAwCisgICAgbW92bmUgcjEsICMweDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBCYXVkcmF0ZSAxMTUyMDAsIGRpdjEzCisjaWYgZGVmaW5lZChDT05GSUdfRFJBTV9VQVJUXzM4NDAwKQorICAgIG1vdmVxIHIxLCAjMHgyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQmF1ZHJhdGUgMzg0MDAKKyAgICBtb3ZuZSByMSwgIzB4MDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIEJhdWRyYXRlIDM4NDAwICwgZGl2MTMKKyNlbmRpZgorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTc4NDAwNAorICAgIG1vdiByMSwgIzB4MDAKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU3ODQwMGMKKyAgICBtb3YgcjEsICMweDAzCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNzg0MDA4CisgICAgbW92IHIxLCAjMHgwNworICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTc4NDAwMAorICAgIG1vdiByMSwgIzB4MEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ1xyJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4MEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ1xuJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4NDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ0QnCisgICAgc3RyIHIxLCBbcjBdCisgICAgbW92IHIxLCAjMHg1MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnUicKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICdBJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4NEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ00nCisgICAgc3RyIHIxLCBbcjBdCisgICAgbW92IHIxLCAjMHgyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnICcKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDQ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICdJJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4NkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ24nCisgICAgc3RyIHIxLCBbcjBdCisgICAgbW92IHIxLCAjMHg2OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnaScKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDc0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICd0JworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4MkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJy0nCisgICAgc3RyIHIxLCBbcjBdCisgICAgbW92IHIxLCAjMHg0NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnRCcKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICdEJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4NTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ1InCisgICAgc3RyIHIxLCBbcjBdCisvKiBEZWJ1ZyAtIFVBUlQgY29uc29sZSBtZXNzYWdlICovCisKKyAgICAvKiBEZWxheSBhYm91dCAxMDB1cyAqLworICAgIGxkciByMCwgPTB4MWU3ODIwMzAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgSW5pdCBUaW1lcjMgQ29udHJvbAorICAgIGxkciByMSwgW3IwXQorICAgIGJpYyByMSwgcjEsICMweDAwMDAwRjAwCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjIsID0weDAwMDAwMDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBUaW1lcjMgUmVsb2FkID0gMTAwIHVzCisgICAgaW5pdF9kZWxheV90aW1lcgorZGVsYXlfMDoKKyAgICBjaGVja19kZWxheV90aW1lcgorICAgIGJuZSBkZWxheV8wCisgICAgY2xlYXJfZGVsYXlfdGltZXIKKyAgICAvKiBlbmQgZGVsYXkgMTAwdXMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEluaXQgRFJBTSBjb21tb24gcmVnaXN0ZXJzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGxkciByMCwgPTB4MWU2ZTAwMDAKKyAgICBsZHIgcjEsID0weGZjNjAwMzA5CisgICAgc3RyIHIxLCBbcjBdCisKKyAgICAvKiBSZXNldCBNTUMgKi8KKyAgICBsZHIgcjEsID0weDAwMDAwMDAwCisgICAgbGRyIHIwLCA9MHgxZTZlMDAzNAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU2ZTAwMTgKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNmUwMDI0CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTZlMDA2NCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBSRUdfTUFESiwgcG93ZXIgZG93biBETEwKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMSwgPTB4MDAwMzRDNEMgICAgICAgICAgICAgICAgICAgICAgICAgIEAgUkVHX01BREosIHJlc2V0IERMTAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDA2OCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBSRUdfU0FESgorICAgIGxkciByMSwgPTB4MDAwMDE4MDAKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIC8qIERlbGF5IGFib3V0IDEwdXMgKi8KKyAgICBsZHIgcjIsID0weDAwMDAwMDBCICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBUaW1lcjMgUmVsb2FkID0gMTAgdXMKKyAgICBpbml0X2RlbGF5X3RpbWVyCitkZWxheV8xOgorICAgIGNoZWNrX2RlbGF5X3RpbWVyCisgICAgYm5lIGRlbGF5XzEKKyAgICBjbGVhcl9kZWxheV90aW1lcgorICAgIC8qIGVuZCBkZWxheSAxMHVzICovCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBAIFJFR19NQURKIHwgMHhDMDAwMCwgZW5hYmxlIERMTAorICAgIGxkciByMSwgW3IwXQorICAgIGxkciByMiwgPTB4QzAwMDAKKyAgICBvcnIgcjEsIHIxLCByMgorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAwOAorICAgIGxkciByMSwgPTB4MDA5MDA0MGYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZHQSAqLworICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAxOAorICAgIGxkciByMSwgPTB4NDAwMEExMjAKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMTgKKyAgICBsZHIgcjEsID0weDAwMDAwMTIwCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDM4CisgICAgbGRyIHIxLCA9MHgwMDAwMDAwMAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDA0MAorICAgIGxkciByMSwgPTB4RkY0NDQ0NDQKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwNDQKKyAgICBsZHIgcjEsID0weDIyMjIyMjIyCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDQ4CisgICAgbGRyIHIxLCA9MHgyMjIyMjIyMgorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDA0YworICAgIGxkciByMSwgPTB4MjIyMjIyMjIKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwNTAKKyAgICBsZHIgcjEsID0weDgwMDAwMDAwCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDUwCisgICAgbGRyIHIxLCA9MHgwMDAwMDAwMAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDA1NAorICAgIGxkciByMSwgPTB4MDAwMDAwMDAKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwNjAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgUkVHX0RSVgorICAgIGxkciByMSwgPTB4MDAwMDAwRkEgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNDA4IE1IegorI2lmIGRlZmluZWQoQ09ORklHX0RSQU1fMzM2KQorICAgIGxkciByMSwgPTB4MDAwMDAwRkEKKyNlbmRpZgorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDA3MAorICAgIGxkciByMSwgPTB4MDAwMDAwMDAKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwNzQKKyAgICBsZHIgcjEsID0weDAwMDAwMDAwCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDc4CisgICAgbGRyIHIxLCA9MHgwMDAwMDAwMAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDA3YworICAgIGxkciByMSwgPTB4MDAwMDAwMDAKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwODAKKyAgICBsZHIgcjEsID0weDAwMDAwMDAwCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDg0CisgICAgbGRyIHIxLCA9MHgwMEZGRkZGRgorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDA4OCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBSRUdfRFFJRExZCisgICAgbGRyIHIxLCA9MHgwMDAwMDA4OSAgICAgICAgICAgICAgICAgICAgICAgICAgQCA0MDggTUh6CisjaWYgZGVmaW5lZChDT05GSUdfRFJBTV8zMzYpCisgICAgbGRyIHIxLCA9MHgwMDAwMDA3NAorI2VuZGlmCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDIwICAgICAgICAgICAgICAgICAgICAgICAgICBAIFJFR19EUVNJQworICAgIGxkciByMSwgPTB4MDAwMDAwRTIgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNDA4IE1IegorI2lmIGRlZmluZWQoQ09ORklHX0RSQU1fMzM2KQorICAgIGxkciByMSwgPTB4MDAwMDAwQkEKKyNlbmRpZgorICAgIHN0ciByMSwgW3IwXQorCisgICAgLyogRGVsYXkgYWJvdXQgMTB1cyAqLworICAgIGxkciByMiwgPTB4MDAwMDAwMEIgICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IFRpbWVyMyBSZWxvYWQgPSAxMCB1cworICAgIGluaXRfZGVsYXlfdGltZXIKK2RlbGF5XzI6CisgICAgY2hlY2tfZGVsYXlfdGltZXIKKyAgICBibmUgZGVsYXlfMgorICAgIGNsZWFyX2RlbGF5X3RpbWVyCisgICAgLyogZW5kIGRlbGF5IDEwdXMgKi8KKworICAgIC8qIENoZWNrIERSQU0gVHlwZSBieSBIL1cgVHJhcHBpbmcgKi8KKyAgICBsZHIgcjAsID0weDFlNmUyMDcwCisgICAgbGRyIHIxLCBbcjBdCisgICAgYmljIHIxLCByMSwgIzB4RkVGRkZGRkYgICAgICAgICAgICAgICAgICAgICAgQCBiaXRbMjRdPTEgPT4gRERSMgorICAgIG1vdiByMiwgcjEsIGxzciAjMjQKKyAgICBjbXAgcjIsICMweDAxCisgICAgYmVxIGRkcjJfaW5pdAorICAgIGIgICBkZHIzX2luaXQKKy5MVE9SRworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRERSMyBJbml0CisKKyB0UkNEICAgPSAxNSAgICAgbnMKKyB0UkFTICAgPSAzNy41ICAgbnMKKyB0UlJEICAgPSBtYXgoNCBDSywxMCBucykKKyB0UlAgICAgPSAxNSAgICAgbnMKKyB0UkZDICAgPSAxMTBucy8xR2JpdCwgMTYwbnMvMkdiaXQsIDMwMG5zLzRHYml0CisgdFJUUCAgID0gbWF4KDQgQ0ssNy41IG5zKQorIHRXUiAgICA9IDE1ICAgICBucworIHRYU05SICA9IG1heCgxMCBDSywyMDAgbnMpCisgdFdUUiAgID0gbWF4KDQgQ0ssNy41IG5zKQorIHRGQVcgICA9IDUwICAgICBucworIHRNUkQgICA9IG1heCgxNSBDSywyMCBucykKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitkZHIzX2luaXQ6CisvKiBEZWJ1ZyAtIFVBUlQgY29uc29sZSBtZXNzYWdlICovCisgICAgbGRyIHIwLCA9MHgxZTc4NDAwMAorICAgIG1vdiByMSwgIzB4MzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJzMnCisgICAgc3RyIHIxLCBbcjBdCisgICAgbW92IHIxLCAjMHgwRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnXHInCisgICAgc3RyIHIxLCBbcjBdCisgICAgbW92IHIxLCAjMHgwQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnXG4nCisgICAgc3RyIHIxLCBbcjBdCisvKiBEZWJ1ZyAtIFVBUlQgY29uc29sZSBtZXNzYWdlICovCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDA0CisgICAgbGRyIHIxLCA9MHgwMDAwMDUzMSAgICAgICAgICAgICAgICAgICAgICAgICAgQCBEZWZhdWx0IHNldCB0byAxR2JpdAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBSRUdfQUMxCisgICAgbGRyIHIxLCA9MHgzMzMwMjgyNSAgICAgICAgICAgICAgICAgICAgICAgICAgQCA0MDggTUh6CisjaWYgZGVmaW5lZChDT05GSUdfRFJBTV8zMzYpCisgICAgbGRyIHIxLCA9MHgyMjIwMjcyNQorI2VuZGlmCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICAvKiBDaGVjayBEUkFNIENMIFRpbWluZyBieSBIL1cgVHJhcHBpbmcgKi8KKyAgICBsZHIgcjAsID0weDFlNmUyMDcwCisgICAgbGRyIHIxLCBbcjBdCisgICAgYmljIHIxLCByMSwgIzB4RjlGRkZGRkYKKyAgICBtb3YgcjIsIHIxLCBsc3IgIzkgICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBDTAorICAgIGxkciByMSwgPTB4MDAwMjAwMDAKKyAgICBhZGQgcjIsIHIyLCByMQorICAgIGxkciByMSwgW3IwXQorICAgIGJpYyByMSwgcjEsICMweEZCRkZGRkZGCisgICAgbW92IHIxLCByMSwgbHNyICM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgQ1dMCisgICAgb3JyIHIyLCByMiwgcjEKKyAgICBsZHIgcjEsID0weDAwMzAwMDAwCisgICAgYWRkIHIyLCByMiwgcjEKKworICAgIGxkciByMCwgPTB4MWU2ZTAwMTQgICAgICAgICAgICAgICAgICAgICAgICAgIEAgUkVHX0FDMgorICAgIGxkciByMSwgPTB4Q0MwMDk2M0YgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNDA4IE1IegorI2lmIGRlZmluZWQoQ09ORklHX0RSQU1fMzM2KQorICAgIGxkciByMSwgPTB4QUEwMDc2MzYKKyNlbmRpZgorICAgIG9yciByMSwgcjEsIHIyCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDA0ICAgICAgICAgICAgICAgICAgICAgICAgICBAIGNoZWNrIDI0MDAgbW9kZQorICAgIGxkciByMiwgW3IwXQorICAgIG1vdiByMiwgcjIsIGxzciAjMTAKKworICAgIGxkciByMCwgPTB4MWU2ZTAwNmMgICAgICAgICAgICAgICAgICAgICAgICAgIEAgUkVHX0lPWgorICAgIGxkciByMSwgPTB4MDAwMDIzMTIgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNDA4IE1IegorI2lmIGRlZmluZWQoQ09ORklHX0RSQU1fMzM2KQorICAgIGxkciByMSwgPTB4MDAwMDIzMTIKKyNlbmRpZgorICAgIHRzdCByMiwgIzB4MDEKKyAgICBtb3ZlcSByMSwgcjEsIGxzciAjOAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDEyMAorICAgIG1vdiByMSwgIzAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICB0c3QgcjIsICMweDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGNoZWNrIEFTVDIzMDAKKyAgICBiZXEgQ0JSRExMMV8yMzAwX1N0YXJ0CisgICAgbGRyIHIwLCA9MHgxZTZlMjA3YyAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjaGVjayBBU1QyNDAwIHJldmlzaW9uIEEwCisgICAgbGRyIHIxLCBbcjBdCisgICAgbW92IHIxLCByMSwgbHNyICMxNgorICAgIGFuZCByMSwgcjEsICMweEZGCisgICAgY21wIHIxLCAjMHgwCisgICAgYmVxIENCUkRMTDFfMjMwMF9TdGFydAorICAgIGIgICBDQlJETEwxXzI0MDBfU3RhcnQKK01DTEsyWF9QaGFzZV9DQlJfRG9uZV9ERFIzOgorICAgIGxkciByMCwgPTB4MWU2ZTAwMTgKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBvcnIgcjEsIHIxLCAjMHg0MAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAzNAorICAgIGxkciByMSwgPTB4MDAwMDAwMDEKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMGMKKyAgICBsZHIgcjEsID0weDAwMDAwMDQwCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICAvKiBEZWxheSBhYm91dCA0MDB1cyAqLworICAgIGxkciByMiwgPTB4MDAwMDAxOTAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IFRpbWVyMyBSZWxvYWQgPSA0MDAgdXMKKyAgICBpbml0X2RlbGF5X3RpbWVyCitkZWxheTNfNDoKKyAgICBjaGVja19kZWxheV90aW1lcgorICAgIGJuZSBkZWxheTNfNAorICAgIGNsZWFyX2RlbGF5X3RpbWVyCisgICAgLyogZW5kIGRlbGF5IDQwMHVzICovCisKKyAgICAvKiBDaGVjayBEUkFNIENMIFRpbWluZyBieSBIL1cgVHJhcHBpbmcgKi8KKyAgICBsZHIgcjAsID0weDFlNmUyMDcwCisgICAgbGRyIHIxLCBbcjBdCisgICAgYmljIHIxLCByMSwgIzB4RjlGRkZGRkYKKyAgICBtb3YgcjIsIHIxLCBsc3IgIzIxICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBDTAorICAgIGxkciByMSwgPTB4MDAwMDAwMTAKKyAgICBhZGQgcjIsIHIyLCByMQorICAgIGxkciByMSwgW3IwXQorICAgIGJpYyByMSwgcjEsICMweEZCRkZGRkZGCisgICAgbW92IHIxLCByMSwgbHNyICM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgQ1dMCisgICAgb3JyIHIyLCByMiwgcjEKKworICAgIGxkciByMCwgPTB4MWU2ZTAwMmMgICAgICAgICAgICAgICAgICAgICAgICAgIEAgUkVHX01SUworICAgIGxkciByMSwgPTB4MDQwMDE3MDAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNDA4IE1IegorI2lmIGRlZmluZWQoQ09ORklHX0RSQU1fMzM2KQorICAgIGxkciByMSwgPTB4MDQwMDE1MDAKKyNlbmRpZgorICAgIG9yciByMSwgcjEsIHIyCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDMwICAgICAgICAgICAgICAgICAgICAgICAgICBAIFJFR19FTVJTCisgICAgbGRyIHIxLCA9MHgwMDAwMDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgQCA0MDggTUh6CisjaWYgZGVmaW5lZChDT05GSUdfRFJBTV8zMzYpCisgICAgbGRyIHIxLCA9MHgwMDAwMDAwMAorI2VuZGlmCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDI4ICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBFTVJTMgorICAgIGxkciByMSwgPTB4MDAwMDAwMDUKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMjggICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IEVNUlMzCisgICAgbGRyIHIxLCA9MHgwMDAwMDAwNworICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAyOCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgRU1SUworICAgIGxkciByMSwgPTB4MDAwMDAwMDMKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMjggICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IE1SUworICAgIGxkciByMSwgPTB4MDAwMDAwMDEKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMmMgICAgICAgICAgICAgICAgICAgICAgICAgIEAgUkVHX01SUworICAgIGxkciByMSwgPTB4MDQwMDE2MDAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNDA4IE1IegorI2lmIGRlZmluZWQoQ09ORklHX0RSQU1fMzM2KQorICAgIGxkciByMSwgPTB4MDQwMDE0MDAKKyNlbmRpZgorICAgIG9yciByMSwgcjEsIHIyCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDBjICAgICAgICAgICAgICAgICAgICAgICAgICBAIFJlZnJlc2ggOCB0aW1lcworICAgIGxkciByMSwgPTB4MDAwMDVDNDgKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMjggICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IE1SUworICAgIGxkciByMSwgPTB4MDAwMDAwMDEKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMGMgICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IHJlZnJlc2ggY3ljbGUKKyAgICBsZHIgcjEsID0weDAwMDAyMDAxCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDE0CisgICAgbGRyIHIxLCBbcjBdCisgICAgYmljIHIxLCByMSwgIzB4RkZGOUZGRkYKKyAgICBtb3YgcjIsIHIxLCBsc3IgIzMgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBDTAorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAzNCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBSRUdfUFdDCisgICAgbGRyIHIxLCA9MHgwMDAwMDMwMyAgICAgICAgICAgICAgICAgICAgICAgICAgQCA0MDggTUh6CisjaWYgZGVmaW5lZChDT05GSUdfRFJBTV8zMzYpCisgICAgbGRyIHIxLCA9MHgwMDAwMDMwMworI2VuZGlmCisgICAgb3JyIHIxLCByMSwgcjIKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGIgICBDYWxpYnJhdGlvbl9TdGFydAorLkxUT1JHCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRW5kIEREUjMgSW5pdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEREUjIgSW5pdAorCisgdFJDRCAgID0gMTUgICAgbnMKKyB0UkFTICAgPSA0NSAgICBucworIHRSUkQgICA9IDEwICAgIG5zCisgdFJQICAgID0gMTUgICAgbnMKKyB0UkZDICAgPSAxMDVucy81MTJNYml0LCAxMjcuNW5zLzFHYml0LCAxOTcuNW5zLzJHYml0LCAzMjcuNW5zLzRHYml0CisgdFJUUCAgID0gNy41ICAgbnMKKyB0V1IgICAgPSAxNSAgICBucworIHRYU05SICA9IDIwMCAgIG5zCisgdFdUUiAgID0gNy41ICAgbnMKKyB0RkFXICAgPSA1MCAgICBucworIHRNUkQgICA9IDQgICAgIENLCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZGRyMl9pbml0OgorLyogRGVidWcgLSBVQVJUIGNvbnNvbGUgbWVzc2FnZSAqLworICAgIGxkciByMCwgPTB4MWU3ODQwMDAKKyAgICBtb3YgcjEsICMweDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICcyJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4MEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ1xyJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4MEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ1xuJworICAgIHN0ciByMSwgW3IwXQorLyogRGVidWcgLSBVQVJUIGNvbnNvbGUgbWVzc2FnZSAqLworCisgICAgbGRyIHIwLCA9MHgxZTZlMDAwNAorICAgIGxkciByMSwgPTB4MDAwMDA1MTAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgRGVmYXVsdCBzZXQgdG8gNTEyTWJpdAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBSRUdfQUMxCisgICAgbGRyIHIxLCA9MHgzMzMwMjcxNCAgICAgICAgICAgICAgICAgICAgICAgICAgQCA0MDggTUh6CisjaWYgZGVmaW5lZChDT05GSUdfRFJBTV8zMzYpCisgICAgbGRyIHIxLCA9MHgyMjIwMTYxMworI2VuZGlmCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICAvKiBDaGVjayBEUkFNIENMIFRpbWluZyBieSBIL1cgVHJhcHBpbmcgKi8KKyAgICBsZHIgcjAsID0weDFlNmUyMDcwCisgICAgbGRyIHIxLCBbcjBdCisgICAgYmljIHIxLCByMSwgIzB4RjlGRkZGRkYKKyAgICBtb3YgcjIsIHIxLCBsc3IgIzUgICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBDTAorICAgIG1vdiByMSwgcjIsIGxzciAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IENXTAorICAgIG9yciByMiwgcjIsIHIxCisgICAgbGRyIHIxLCA9MHgwMDExMDAwMAorICAgIGFkZCByMiwgcjIsIHIxCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDE0ICAgICAgICAgICAgICAgICAgICAgICAgICBAIFJFR19BQzIKKyAgICBsZHIgcjEsID0weENDMDBCMDNGICAgICAgICAgICAgICAgICAgICAgICAgICBAIDQwOCBNSHoKKyNpZiBkZWZpbmVkKENPTkZJR19EUkFNXzMzNikKKyAgICBsZHIgcjEsID0weEFBMDA5MDNCCisjZW5kaWYKKyAgICBvcnIgcjEsIHIxLCByMgorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjaGVjayAyNDAwIG1vZGUKKyAgICBsZHIgcjIsIFtyMF0KKyAgICBtb3YgcjIsIHIyLCBsc3IgIzEwCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDZjICAgICAgICAgICAgICAgICAgICAgICAgICBAIFJFR19JT1oKKyAgICBsZHIgcjEsID0weDAwMDAyMzEyICAgICAgICAgICAgICAgICAgICAgICAgICBAIDQwOCBNSHoKKyNpZiBkZWZpbmVkKENPTkZJR19EUkFNXzMzNikKKyAgICBsZHIgcjEsID0weDAwMDAyMzEyCisjZW5kaWYKKyAgICB0c3QgcjIsICMweDAxCisgICAgbW92ZXEgcjEsIHIxLCBsc3IgIzgKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAxMjAKKyAgICBtb3YgcjEsICMxCisgICAgc3RyIHIxLCBbcjBdCisgICAgdHN0IHIyLCAjMHgwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjaGVjayBBU1QyMzAwCisgICAgYmVxIENCUkRMTDFfMjMwMF9TdGFydAorICAgIGxkciByMCwgPTB4MWU2ZTIwN2MgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY2hlY2sgQVNUMjQwMCByZXZpc2lvbiBBMAorICAgIGxkciByMSwgW3IwXQorICAgIG1vdiByMSwgcjEsIGxzciAjMTYKKyAgICBhbmQgcjEsIHIxLCAjMHhGRgorICAgIGNtcCByMSwgIzB4MAorICAgIGJlcSBDQlJETEwxXzIzMDBfU3RhcnQKKyAgICBiICAgQ0JSRExMMV8yNDAwX1N0YXJ0CitNQ0xLMlhfUGhhc2VfQ0JSX0RvbmVfRERSMjoKKworICAgIGxkciByMCwgPTB4MWU2ZTAwMzQKKyAgICBsZHIgcjEsID0weDAwMDAwMDAxCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDBjCisgICAgbGRyIHIxLCA9MHgwMDAwMDAwMAorICAgIHN0ciByMSwgW3IwXQorCisgICAgLyogRGVsYXkgYWJvdXQgNDAwdXMgKi8KKyAgICBsZHIgcjIsID0weDAwMDAwMTkwICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBUaW1lcjMgUmVsb2FkID0gNDAwIHVzCisgICAgaW5pdF9kZWxheV90aW1lcgorZGVsYXkyXzQ6CisgICAgY2hlY2tfZGVsYXlfdGltZXIKKyAgICBibmUgZGVsYXkyXzQKKyAgICBjbGVhcl9kZWxheV90aW1lcgorICAgIC8qIGVuZCBkZWxheSA0MDB1cyAqLworCisgICAgLyogQ2hlY2sgRFJBTSBDTCBUaW1pbmcgYnkgSC9XIFRyYXBwaW5nICovCisgICAgbGRyIHIwLCA9MHgxZTZlMjA3MAorICAgIGxkciByMSwgW3IwXQorICAgIGJpYyByMSwgcjEsICMweEY5RkZGRkZGCisgICAgbW92IHIyLCByMSwgbHNyICMyMSAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgQ0wKKyAgICBsZHIgcjEsID0weDAwMDAwMDQwCisgICAgb3JyIHIyLCByMiwgcjEKKworICAgIGxkciByMCwgPTB4MWU2ZTAwMmMgICAgICAgICAgICAgICAgICAgICAgICAgIEAgUkVHX01SUworICAgIGxkciByMSwgPTB4MDAwMDBEMDMgICAgICAgICAgICAgICAgICAgICAgICAgIEAgNDA4IE1IegorI2lmIGRlZmluZWQoQ09ORklHX0RSQU1fMzM2KQorICAgIGxkciByMSwgPTB4MDAwMDBCMDMKKyNlbmRpZgorICAgIG9yciByMSwgcjEsIHIyCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDMwICAgICAgICAgICAgICAgICAgICAgICAgICBAIFJFR19FTVJTCisgICAgbGRyIHIxLCA9MHgwMDAwMDA0MCAgICAgICAgICAgICAgICAgICAgICAgICAgQCA0MDggTUh6CisjaWYgZGVmaW5lZChDT05GSUdfRFJBTV8zMzYpCisgICAgbGRyIHIxLCA9MHgwMDAwMDA0MAorI2VuZGlmCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDI4ICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBFTVJTMgorICAgIGxkciByMSwgPTB4MDAwMDAwMDUKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMjggICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IEVNUlMzCisgICAgbGRyIHIxLCA9MHgwMDAwMDAwNworICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAyOCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgRU1SUworICAgIGxkciByMSwgPTB4MDAwMDAwMDMKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMjggICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IE1SUworICAgIGxkciByMSwgPTB4MDAwMDAwMDEKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMGMgICAgICAgICAgICAgICAgICAgICAgICAgIEAgUmVmcmVzaCA4IHRpbWVzCisgICAgbGRyIHIxLCA9MHgwMDAwNUMwOAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAyYyAgICAgICAgICAgICAgICAgICAgICAgICAgQCBSRUdfTVJTCisgICAgbGRyIHIxLCA9MHgwMDAwMEMwMyAgICAgICAgICAgICAgICAgICAgICAgICAgQCA0MDggTUh6CisjaWYgZGVmaW5lZChDT05GSUdfRFJBTV8zMzYpCisgICAgbGRyIHIxLCA9MHgwMDAwMEEwMworI2VuZGlmCisgICAgb3JyIHIxLCByMSwgcjIKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMjggICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IE1SUworICAgIGxkciByMSwgPTB4MDAwMDAwMDEKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMzAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgUkVHX0VNUlMKKyAgICBsZHIgcjEsID0weDAwMDAwM0MwICAgICAgICAgICAgICAgICAgICAgICAgICBAIDQwOCBNSHoKKyNpZiBkZWZpbmVkKENPTkZJR19EUkFNXzMzNikKKyAgICBsZHIgcjEsID0weDAwMDAwM0MwCisjZW5kaWYKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMjggICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IEVNUlMKKyAgICBsZHIgcjEsID0weDAwMDAwMDAzCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDMwICAgICAgICAgICAgICAgICAgICAgICAgICBAIFJFR19FTVJTCisgICAgbGRyIHIxLCA9MHgwMDAwMDA0MCAgICAgICAgICAgICAgICAgICAgICAgICAgQCA0MDggTUh6CisjaWYgZGVmaW5lZChDT05GSUdfRFJBTV8zMzYpCisgICAgbGRyIHIxLCA9MHgwMDAwMDA0MAorI2VuZGlmCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDI4ICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBFTVJTCisgICAgbGRyIHIxLCA9MHgwMDAwMDAwMworICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDAwYyAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgcmVmcmVzaCBjeWNsZQorICAgIGxkciByMSwgPTB4MDAwMDIwMDEKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwMTQKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBiaWMgcjEsIHIxLCAjMHhGRkY5RkZGRgorICAgIG1vdiByMiwgcjEsIGxzciAjMyAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZ2V0IENMCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDM0ICAgICAgICAgICAgICAgICAgICAgICAgICBAIFJFR19QV0MKKyAgICBsZHIgcjEsID0weDAwMDAwNTAzICAgICAgICAgICAgICAgICAgICAgICAgICBAIDQwOCBNSHoKKyNpZiBkZWZpbmVkKENPTkZJR19EUkFNXzMzNikKKyAgICBsZHIgcjEsID0weDAwMDAwNTAzCisjZW5kaWYKKyAgICBvcnIgcjEsIHIxLCByMgorICAgIHN0ciByMSwgW3IwXQorCisgICAgYiAgIENhbGlicmF0aW9uX1N0YXJ0CisuTFRPUkcKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBFbmQgRERSMiBJbml0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEREUiBDSyBkdXR5IGZpbmV0dW5lIHByb2dyYW0KKyAgICBTUkFNIGJ1ZmZlciBkZWZpbml0aW9uCisgICAgMHgxRTcyMDIwNCA6IGdkbGwgICAgIGdvbGRlbiBETEwxIHJlY29yZAorICAgIDB4MUU3MjAyMDggOiBnZHV0eSAgICBnb2xkZW4gZHV0eSBzZXR0aW5nIHJlY29yZAorICAgIDB4MUU3MjAyMEMgOiBnZHV0eXN1bSBnb2xkZW4gZHV0eSBkYXRhIHJlY29yZAorICAgIDB4MUU3MjAyMTAgOiBkdXR5IHJlY29yZCBvZiBkZWxheSAwICBpbnZlcnQKKyAgICAweDFFNzIwMjE0IDogZHV0eSByZWNvcmQgb2YgZGVsYXkgMSAgaW52ZXJ0CisgICAgLi4uLgorICAgIDB4MUU3MjAyNEMgOiBkdXR5IHJlY29yZCBvZiBkZWxheSAxNSBpbnZlcnQKKyAgICAweDFFNzIwMjUwIDogZHV0eSByZWNvcmQgb2YgZGVsYXkgMAorICAgIDB4MUU3MjAyNTQgOiBkdXR5IHJlY29yZCBvZiBkZWxheSAxCisgICAgLi4uLgorICAgIDB4MUU3MjAyOEMgOiBkdXR5IHJlY29yZCBvZiBkZWxheSAxNQorCisgICAgUmVnaXN0ZXIgdXNhZ2UKKyAgICByMCAtIHIzID0gZnJlZQorICAgIHI0ICA9IHJlY29yZCB0aGUgcmV0dXJuIHBjIHZhbHVlLCBkbyBub3QgdXNlCisgICAgcjUgID0gZnJlZQorICAgIHI2ICA9IGZyZWUKKyAgICByNyAgPSBkdXR5IGNvdW50CisgICAgcjggID0gZ2RsbAorICAgIHI5ICA9IGdkdXR5CisgICAgcjEwID0gZ2R1dHlzdW0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDQlJETEwxXzI0MDBfU3RhcnQ6CisgICAgbGRyICAgcjAsID0weDFlNmUwMTIwCisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBvcnIgICByMSwgcjEsICMweDAyCisgICAgc3RyICAgcjEsIFtyMF0KKworICAgIGxkciAgIHIxLCA9MHgwMDAwMDAwMAorICAgIGxkciAgIHIwLCA9MHgxZTcyMDIwNAorICAgIGxkciAgIHIyLCA9MHgxZTcyMDJhMAoraW5pdF9zcmFtX3N0YXJ0MDoKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGFkZCAgIHIwLCByMCwgIzQKKyAgICBjbXAgICByMCwgcjIKKyAgICBibHQgICBpbml0X3NyYW1fc3RhcnQwCisKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwMzQKKyAgICBtb3YgICByMSwgIzB4MjAKKyAgICBzdHIgICByMSwgW3IwXQorCisgICAgbGRyICAgcjAsID0weDFlNmUwMDYwCisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBtb3YgICByMiwgIzB4MDEKKyAgICBvcnIgICByMSwgcjEsIHIyLCBsc2wgIzEzCisgICAgc3RyICAgcjEsIFtyMF0KKworICAgIG1vdiAgIHI3LCAjMHgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBkdXR5IGNvdW50CisgICAgbW92ICAgcjgsICMweDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IGdkbGwKKyAgICBtb3YgICByOSwgIzB4MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgZ2R1dHkKKyAgICBtb3YgICByMTAsICMweDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgZ2R1dHlzdW0KK2NicmRsbDFfZHV0eV9zdGFydDoKKyAgICBjbXAgICByNywgIzMyCisgICAgYmdlICAgY2JyZGxsMV9kdXR5X2VuZAorCisgICAgbGRyICAgcjAsID0weDFlNmUwMDE4CisgICAgbGRyICAgcjEsID0weDAwMDA4MTIwCisgICAgc3RyICAgcjEsIFtyMF0KKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDA2MAorICAgIGxkciAgIHIxLCBbcjBdCisgICAgYmljICAgcjEsIHIxLCAjMHgwMDAwMUYwMAorICAgIG9yciAgIHIxLCByMSwgcjcsIGxzbCAjOAorICAgIG1vdiAgIHIyLCAjMHgxMAorICAgIGVvciAgIHIxLCByMSwgcjIsIGxzbCAjOAorICAgIHN0ciAgIHIxLCBbcjBdCisKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwMDAgICAgICAgICAgICAgICAgICAgICAgICBAIGR1bW15IHJlYWQKKyAgICBsZHIgICByMSwgW3IwXQorCisgICAgYiAgICAgQ0JSRExMMV8yMzAwX1N0YXJ0CitDQlJETEwxXzI0MDBfQ2FsbDoKKworICAgIG1vdiAgIHI1LCAjMHgwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBkcWlkbHkgY291bnQKKyAgICBtb3YgICByNiwgIzB4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgZHV0eSBzdW0KK2NicmRsbDFfZHV0eV9jYWxfc3RhcnQ6CisgICAgY21wICAgcjUsICMweDA1CisgICAgYmdlICAgY2JyZGxsMV9kdXR5X2NhbF9lbmQKKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDAxOAorICAgIGxkciAgIHIxLCA9MHgwMDIwMDEyMAorICAgIG9yciAgIHIxLCByMSwgcjUsIGxzbCAjMTYKKyAgICBzdHIgICByMSwgW3IwXQorCisgICAgbGRyICAgcjAsID0weDFlNmUwMDAwCisgICAgbGRyICAgcjEsIFtyMF0KKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDAxOAorICAgIGxkciAgIHIxLCBbcjBdCisgICAgbW92ICAgcjIsICMweDEwCisgICAgb3JyICAgcjEsIHIxLCByMiwgbHNsICMyNAorICAgIHN0ciAgIHIxLCBbcjBdCisKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwODAKKyAgICBsZHIgICByMSwgPTB4ODAwMDAwMDAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgZHV0eSBjYWwgd2FpdGluZworY2JyZGxsMV9kdXR5X2NhbF93YWl0OgorICAgIGxkciAgIHIyLCBbcjBdCisgICAgdHN0ICAgcjIsIHIxCisgICAgYmVxICAgY2JyZGxsMV9kdXR5X2NhbF93YWl0CisKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwOGMKKyAgICBsZHIgICByMiwgW3IwXQorCisgICAgbGRyICAgcjAsID0weDFlNzIwMjEwCisgICAgYWRkICAgcjAsIHIwLCByNywgbHNsICMyCisgICAgc3RyICAgcjIsIFtyMF0KKworICAgIGxkciAgIHIxLCA9MHhGRkZGCisgICAgYW5kICAgcjMsIHIxLCByMgorICAgIGNtcCAgIHIzLCByMQorICAgIG1vdmVxIHIyLCByMiwgbHNyICMxNgorICAgIGFuZCAgIHIzLCByMSwgcjIKKyAgICBhZGQgICByNiwgcjYsIHIzCisgICAgbGRyICAgcjEsID0weEYwMDAKKyAgICBjbXAgICByMywgcjEKKyAgICBibHQgICBjYnJkbGwxX2R1dHlfY2FsX2VuZAorICAgIGFkZCAgIHI1LCByNSwgIzB4MDEKKyAgICBiICAgICBjYnJkbGwxX2R1dHlfY2FsX3N0YXJ0CisKK2NicmRsbDFfZHV0eV9jYWxfZW5kOgorICAgIG1vdiAgIHI2LCByNiwgbHNyICMyICAgICAgICAgICAgICAgICAgICAgICAgIEAgZ2V0IGR1dHlzdW0KKyAgICBjbXAgICByNiwgcjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGNoZWNrIGR1dHlzdW0gPiBnZHV0eXN1bQorICAgIGJsZSAgIGNicmRsbDFfZHV0eV9uZXh0CisgICAgbGRyICAgcjAsID0weDFlNmUwMDY4CisgICAgbGRyICAgcjgsIFtyMF0KKyAgICBlb3IgICByOSwgcjcsICMweDEwCisgICAgbW92ICAgcjEwLCByNgorCitjYnJkbGwxX2R1dHlfbmV4dDoKKyAgICBhZGQgICByNywgcjcsICMweDAxCisgICAgY21wICAgcjcsICMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjaGVjayBkdXR5ID49IDE1CisgICAgYmx0ICAgY2JyZGxsMV9kdXR5X3N0YXJ0CisgICAgbGRyICAgcjAsID0weEZBMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjaGVjayBnZHV0eXN1bSA+IDB4RkEwMAorICAgIGNtcCAgIHIxMCwgcjAKKyAgICBibHQgICBjYnJkbGwxX2R1dHlfc3RhcnQKKworY2JyZGxsMV9kdXR5X2VuZDoKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwNjAKKyAgICBsZHIgICByMSwgW3IwXQorICAgIGJpYyAgIHIxLCByMSwgIzB4MDAwMDFGMDAKKyAgICBvcnIgICByMSwgcjEsIHI5LCBsc2wgIzgKKyAgICBzdHIgICByMSwgW3IwXQorCisgICAgbGRyICAgcjAsID0weDFlNmUwMDY4CisgICAgYmljICAgcjgsIHI4LCAjMHhGRjAwMDAwMAorICAgIGJpYyAgIHI4LCByOCwgIzB4MDBGRjAwMDAKKyAgICBzdHIgICByOCwgW3IwXQorCisgICAgbGRyICAgcjAsID0weDFlNzIwMjA0ICAgICAgICAgICAgICAgICAgICAgICAgQCByZWNvcmQgcmVzdWx0CisgICAgc3RyICAgcjgsIFtyMF0KKyAgICBhZGQgICByMCwgcjAsICMweDA0CisgICAgc3RyICAgcjksIFtyMF0KKyAgICBhZGQgICByMCwgcjAsICMweDA0CisgICAgc3RyICAgcjEwLCBbcjBdCisKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwMTgKKyAgICBsZHIgICByMSwgPTB4MDAwMDgxMjAKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGxkciAgIHIwLCA9MHgxZTZlMDAwMCAgICAgICAgICAgICAgICAgICAgICAgIEAgZHVtbXkgcmVhZAorICAgIGxkciAgIHIxLCBbcjBdCisgICAgbGRyICAgcjAsID0weDFlNmUwMDE4CisgICAgbGRyICAgcjEsID0weDAwMDAwMTIwCisgICAgc3RyICAgcjEsIFtyMF0KKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDEyMAorICAgIGxkciAgIHIxLCBbcjBdCisgICAgY21wICAgcjEsICMweDMKKyAgICBiZXEgICBNQ0xLMlhfUGhhc2VfQ0JSX0RvbmVfRERSMgorICAgIGIgICAgIE1DTEsyWF9QaGFzZV9DQlJfRG9uZV9ERFIzCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBNQ0xLMlggbG9jayB0byBNQ0xLIHByb2dyYW0KKyAgcjAgLSByMyA9IGZyZWUKKyAgcjUgPSBtYWRqbWF4CisgIHI2ID0gZGxsZW5kCisgIDB4MUU3MjAyMDAgPSAweDk2Y250OmZhaWxjbnQ6ZGxsbWF4OmRsbG1pbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NCUkRMTDFfMjMwMF9TdGFydDoKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwNjQKKyAgICBsZHIgICByNSwgW3IwXQorICAgIGFuZCAgIHI1LCByNSwgIzB4RkYgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBtYWRqbWF4CisgICAgbW92ICAgcjYsIHI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IGRsbGVuZAorCisgICAgbGRyICAgcjEsID0weDAwMDAwMGZmCisgICAgbGRyICAgcjAsID0weDFlNzIwMjAwCisgICAgc3RyICAgcjEsIFtyMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IGRsbGNudDI6ZGxsbWF4OmRsbG1pbgorCisgICAgbW92ICAgcjMsICMweDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IGxvb3AgY291bnQKK2NicmRsbDFfc2Nhbl9zdGFydDoKKyAgICBjbXAgICByMywgcjYKKyAgICBiZ2UgICBjYnJkbGwxX3NjYW5fZW5kCisKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwMTgKKyAgICBsZHIgICByMSwgPTB4MDAwMDgxMjAKKyAgICBzdHIgICByMSwgW3IwXQorCisgICAgbGRyICAgcjAsID0weDFlNmUwMDY4CisgICAgbW92ICAgcjEsIHIzCisgICAgY21wICAgcjEsIHI1CisgICAgc3ViZ2UgcjEsIHIxLCByNQorICAgIHN0ciAgIHIxLCBbcjBdCisKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwMDAgICAgICAgICAgICAgICAgICAgICAgICBAIGR1bW15IHJlYWQKKyAgICBsZHIgICByMSwgW3IwXQorCisgICAgbGRyICAgcjAsID0weDFlNmUwMDE4CisgICAgbGRyICAgcjEsID0weDAwMDAwMTIwCisgICAgc3RyICAgcjEsIFtyMF0KKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDAwMCAgICAgICAgICAgICAgICAgICAgICAgIEAgZHVtbXkgcmVhZAorICAgIGxkciAgIHIxLCBbcjBdCisgICAgbGRyICAgcjAsID0weDFlNmUwMDAwICAgICAgICAgICAgICAgICAgICAgICAgQCBkdW1teSByZWFkCisgICAgbGRyICAgcjEsIFtyMF0KKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDAxYworICAgIGxkciAgIHIxLCBbcjBdCisgICAgbW92ICAgcjEsIHIxLCBsc3IgIzE2CisgICAgYW5kICAgcjEsIHIxLCAjMHhGRgorCisgICAgYW5kICAgcjIsIHIxLCAjMHg5NgorICAgIGNtcCAgIHIyLCAjMHg5NgorICAgIGJlcSAgIGNicmRsbDFfc2Nhbl9wYXNzICAgICAgICAgICAgICAgICAgICAgIEAgaWYgKG1jbGsyeF9waGFzZSAmIDB4OTYpID09IDB4OTYKKyAgICBsZHIgICByMCwgPTB4MWU3MjAyMDAKKyAgICBsZHIgICByMSwgW3IwXQorICAgIG1vdiAgIHIyLCByMSwgbHNyICM4CisgICAgYW5kcyAgcjIsIHIyLCAjMHhGRiAgICAgICAgICAgICAgICAgICAgICAgICAgQCBnZXQgZGxsbWF4CisgICAgYmVxICAgY2JyZGxsMV9zY2FuX25leHQgICAgICAgICAgICAgICAgICAgICAgQCBpZiBkbGxtYXggPT0gMAorICAgIG1vdiAgIHIyLCByMSwgbHNyICMxNgorICAgIGFuZCAgIHIyLCByMiwgIzB4RkYKKyAgICBhZGQgICByMiwgcjIsICMweDAxCisgICAgY21wICAgcjIsICMweDAyCisgICAgbW92Z2UgcjYsIHIzCisgICAgYmljICAgcjEsIHIxLCAjMHgwMEZGMDAwMAorICAgIG9yciAgIHIxLCByMSwgcjIsIGxzbCAjMTYKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGIgICAgIGNicmRsbDFfc2Nhbl9uZXh0CisKK2NicmRsbDFfc2Nhbl9wYXNzOgorICAgIGNtcCAgIHIzLCAjMHgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaWYgZGxsID0gMAorICAgIG1vdmVxIHIzLCAjMHgwRgorICAgIGFkZGVxIHI2LCByNiwgIzB4MTAKKyAgICBiZXEgICBjYnJkbGwxX3NjYW5fbmV4dAorICAgIGxkciAgIHIwLCA9MHgxZTcyMDIwMAorICAgIGxkciAgIHIyLCBbcjBdCisgICAgY21wICAgcjEsICMweDk2CisgICAgYm5lICAgY2JyZGxsMV9zY2FuX3Bhc3MyCisgICAgbW92ICAgcjEsIHIyLCBsc3IgIzI0CisgICAgYWRkICAgcjEsIHIxLCAjMHgwMQorICAgIGJpYyAgIHIyLCByMiwgIzB4RkYwMDAwMDAKKyAgICBvcnIgICByMiwgcjIsIHIxLCBsc2wgIzI0CisgICAgY21wICAgcjEsICMweDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjaGVjayAocGhhc2UgPT0gMHg5NikgY291bnQgPT0gMworICAgIGJpY2dlIHIyLCByMiwgIzB4MDAwMEZGMDAKKyAgICBiaWNnZSByMiwgcjIsICMweDAwMDAwMEZGCisgICAgb3JyZ2UgcjIsIHIyLCByMywgbHNsICM4CisgICAgb3JyZ2UgcjIsIHIyLCByMworICAgIHN0ciAgIHIyLCBbcjBdCisgICAgYmdlICAgY2JyZGxsMV9zY2FuX2VuZAorCitjYnJkbGwxX3NjYW5fcGFzczI6CisgICAgYW5kICAgcjEsIHIyLCAjMHhGRiAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpZihkbGxtaW4gPiBkbGwpCisgICAgY21wICAgcjEsIHIzCisgICAgYmljZ3QgcjIsIHIyLCAjMHgwMDAwMDBGRgorICAgIG9ycmd0IHIyLCByMiwgcjMKKworICAgIG1vdiAgIHIxLCByMiwgbHNyICM4ICAgICAgICAgICAgICAgICAgICAgICAgIEAgaWYoZGxsbWF4IDwgZGxsKQorICAgIGFuZCAgIHIxLCByMSwgIzB4RkYKKyAgICBjbXAgICByMSwgcjMKKyAgICBiaWNsdCByMiwgcjIsICMweDAwMDBGRjAwCisgICAgb3JybHQgcjIsIHIyLCByMywgbHNsICM4CisKKyAgICBiaWMgICByMiwgcjIsICMweDAwRkYwMDAwCisgICAgc3RyICAgcjIsIFtyMF0KKworY2JyZGxsMV9zY2FuX25leHQ6CisgICAgYWRkICAgcjMsIHIzLCAjMHgwMQorICAgIGIgICAgIGNicmRsbDFfc2Nhbl9zdGFydAorCitjYnJkbGwxX3NjYW5fZW5kOgorICAgIGxkciAgIHIwLCA9MHgxZTcyMDIwMAorICAgIGxkciAgIHIxLCBbcjBdCisgICAgbW92ICAgcjIsIHIxLCBsc3IgIzggICAgICAgICAgICAgICAgICAgICAgICAgQCBnZXQgZGxsbWF4CisgICAgYW5kcyAgcjIsIHIyLCAjMHhGRgorICAgIGJuZSAgIGNicmRsbDFfc2Nhbl9kb25lICAgICAgICAgICAgICAgICAgICAgIEAgaWYoZGxsbWF4ICE9IDApCisgICAgbGRyICAgcjAsID0weDFlNmUwMDY0CisgICAgbGRyICAgcjMsIFtyMF0KKyAgICBiaWMgICByMSwgcjMsICMweDAwMEMwMDAwCisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBhZGQgICByMCwgcjAsICMweDA0CisgICAgbW92ICAgcjEsICMweDAKKyAgICBzdHIgICByMSwgW3IwXQorCisgICAgLyogRGVsYXkgYWJvdXQgMTB1cyAqLworICAgIGxkciByMiwgPTB4MDAwMDAwMEEgICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IFRpbWVyMyBSZWxvYWQgPSAxMCB1cworICAgIGluaXRfZGVsYXlfdGltZXIKK2RlbGF5MF8xOgorICAgIGNoZWNrX2RlbGF5X3RpbWVyCisgICAgYm5lIGRlbGF5MF8xCisgICAgY2xlYXJfZGVsYXlfdGltZXIKKyAgICAvKiBlbmQgZGVsYXkgMTB1cyAqLworCisgICAgbGRyICAgcjAsID0weDFlNmUwMDY0CisgICAgc3RyICAgcjMsIFtyMF0KKworICAgIC8qIERlbGF5IGFib3V0IDEwdXMgKi8KKyAgICBsZHIgcjIsID0weDAwMDAwMDBBICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBUaW1lcjMgUmVsb2FkID0gMTAgdXMKKyAgICBpbml0X2RlbGF5X3RpbWVyCitkZWxheTBfMjoKKyAgICBjaGVja19kZWxheV90aW1lcgorICAgIGJuZSBkZWxheTBfMgorICAgIGNsZWFyX2RlbGF5X3RpbWVyCisgICAgLyogZW5kIGRlbGF5IDEwdXMgKi8KKworICAgIGIgICAgIENCUkRMTDFfMjMwMF9TdGFydAorCitjYnJkbGwxX3NjYW5fZG9uZToKKyAgICBhbmQgICByMSwgcjEsICMweEZGCisgICAgYWRkICAgcjEsIHIxLCByMgorICAgIG1vdiAgIHI2LCByMSwgbHNyICMxICAgICAgICAgICAgICAgICAgICAgICAgIEAgZGxsMS4wID0gKGRsbG1pbiArIGRsbG1heCkgPj4gMQorICAgIGNtcCAgIHI2LCByNQorICAgIHN1YmdlIHI2LCByNiwgcjUKKyAgICBhZGQgICByMywgcjYsIHI1LCBsc3IgIzIgICAgICAgICAgICAgICAgICAgICBAIGRsbDEuMSA9IGRsbDEuMCArIChNQURKID4+IDIpCisKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwMDQKKyAgICBsZHIgICByMSwgW3IwXQorICAgIG1vdiAgIHIxLCByMSwgbHNyICMxMAorICAgIHRzdCAgIHIxLCAjMHgxCisgICAgYm5lICAgY2JyZGxsMV9zY2FuX3NldF8yNDAwCisgICAgY21wICAgcjMsIHI1CisgICAgc3ViZ2UgcjMsIHIzLCByNQorICAgIG1vdiAgIHIyLCAjMHgwCisgICAgdHN0ICAgcjMsICMweDA4CisgICAgYmVxICAgY2JyZGxsMV9zY2FuX3NldF8yMzAwXzIgICAgICAgICAgICAgICAgQCBpZiAhKGRsbCAmIDgpCitjYnJkbGwxX3NjYW5fc2V0XzIzMDBfMTogICAgICAgICAgICAgICAgICAgICAgICAgQCBpZiAgKGRsbCAmIDgpCisgICAgbW92ICAgcjEsICMweDAKKyAgICB0c3QgICByMywgIzB4MDgKKyAgICBhZGRlcSByMSwgcjEsICMweDAxCisgICAgY21wICAgcjIsICMweDA1CisgICAgYWRkZ2UgcjEsIHIxLCAjMHgwMQorICAgIGNtcCAgIHIxLCAjMHgwMgorICAgIGJlcSAgIGNicmRsbDFfc2Nhbl9zZXQKKyAgICBhZGQgICByMiwgcjIsICMweDAxCisgICAgYWRkICAgcjMsIHIzLCAjMHgwMQorICAgIGNtcCAgIHIzLCByNQorICAgIHN1YmdlIHIzLCByMywgcjUKKyAgICBiICAgICBjYnJkbGwxX3NjYW5fc2V0XzIzMDBfMQorCitjYnJkbGwxX3NjYW5fc2V0XzIzMDBfMjoKKyAgICBhbmQgICByMSwgcjMsICMweDA3CisgICAgY21wICAgcjEsICMweDA3CisgICAgYmVxICAgY2JyZGxsMV9zY2FuX3NldAorICAgIGNtcCAgIHIyLCAjMHgwNQorICAgIGJnZSAgIGNicmRsbDFfc2Nhbl9zZXQKKyAgICBhZGQgICByMiwgcjIsICMweDAxCisgICAgYWRkICAgcjMsIHIzLCAjMHgwMQorICAgIGNtcCAgIHIzLCByNQorICAgIHN1YmdlIHIzLCByMywgcjUKKyAgICBiICAgICBjYnJkbGwxX3NjYW5fc2V0XzIzMDBfMgorCitjYnJkbGwxX3NjYW5fc2V0XzI0MDA6CisgICAgYWRkICAgcjMsIHIzLCAjMHgwNSAgICAgICAgICAgICAgICAgICAgICAgICAgQCBkbGwxLjEgPSBkbGwxLjAgKyAoTUFESiA+PiAyKSArIDUKKyAgICBjbXAgICByMywgcjUKKyAgICBzdWJnZSByMywgcjMsIHI1CisKK2NicmRsbDFfc2Nhbl9zZXQ6CisgICAgb3JyICAgcjEsIHI2LCByMywgbHNsICM4CisgICAgbGRyICAgcjAsID0weDFlNmUwMDY4CisgICAgc3RyICAgcjEsIFtyMF0KKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDEyMAorICAgIGxkciAgIHIxLCBbcjBdCisgICAgY21wICAgcjEsICMweDAKKyAgICBiZXEgICBNQ0xLMlhfUGhhc2VfQ0JSX0RvbmVfRERSMworICAgIGNtcCAgIHIxLCAjMHgxCisgICAgYmVxICAgTUNMSzJYX1BoYXNlX0NCUl9Eb25lX0REUjIKKyAgICBiICAgICBDQlJETEwxXzI0MDBfQ2FsbAorCisuTFRPUkcKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIENhbGlicmF0aW9uIENvZGUgU3RhcnQKKyAgICBTUkFNIGJ1ZmZlciBkZWZpbml0aW9uCisgICAgMHgxRTcyMDAwMCA6IFBhc3MgMSwgRExMSSBNSU4gdmFsdWUgcmFuZ2UKKyAgICAweDFFNzIwMDA4IDogRFFTMCBETEwgdmFsaWQgcmFuZ2UsIDJuZCB0aW1lIENCUgorICAgIDB4MUU3MjAwMEMgOiBEUVMxIERMTCB2YWxpZCByYW5nZSwgMm5kIHRpbWUgQ0JSCisgICAgMHgxRTcyMDAxMCA6IERRMCAgRExMIHZhbGlkIHJhbmdlLCBQYXNzIDEKKyAgICAweDFFNzIwMDE0IDogRFExICBETEwgdmFsaWQgcmFuZ2UsIFBhc3MgMQorICAgIC4uLi4KKyAgICAweDFFNzIwMDQ4IDogRFExNCBETEwgdmFsaWQgcmFuZ2UsIFBhc3MgMQorICAgIDB4MUU3MjAwNEMgOiBEUTE1IERMTCB2YWxpZCByYW5nZSwgUGFzcyAxCisgICAgMHgxRTcyMDA5MCA6IERMTDEgU0FkaiByZWNvcmQKKyAgICAweDFFNzIwMDk0IDogRFFMICBQYXNzMSBmaW5ldHVuZSByZXN1bHQKKyAgICAweDFFNzIwMDk4IDogRFFIICBQYXNzMSBmaW5ldHVuZSByZXN1bHQKKyAgICAweDFFNzIwMDlDIDogRFJBTSBpbml0aWFsIHRpbWUsICh1cykKKyAgICAweDFFNzIwMEEwIDogQ0JSMyByZXRyeSBjb3VudGVyCisgICAgMHgxRTcyMDBBNCA6IERSQU0gaW5pdGlhbCB0aW1lLCAodXMpCisgICAgMHgxRTcyMDBBOCA6IFJlbGVhc2VkIGRhdGUKKyAgICAweDFFNzIwMEFDIDogUmVsZWFzZWQgU0RLIHZlcnNpb24KKyAgICAweDFFNzIwMEIwIDogRFFTIGlucHV0IG1hc2sgd2luZG93IGZvciBNQ1IxOFs0XSA9IDAKKyAgICAweDFFNzIwMEI0IDogRFFTIGlucHV0IG1hc2sgd2luZG93IGZvciBNQ1IxOFs0XSA9IDEKKyAgICAweDFFNzIwMTAwIDogRFFJRExZPTAwLCBETEwgdmFsaWQgcmFuZ2UKKyAgICAweDFFNzIwMTA0IDogRFFJRExZPTAxLCBETEwgdmFsaWQgcmFuZ2UKKyAgICAuLi4uCisgICAgMHgxRTcyMDE3OCA6IERRSURMWT0zMCwgRExMIHZhbGlkIHJhbmdlCisgICAgMHgxRTcyMDE3QyA6IERRSURMWT0zMSwgRExMIHZhbGlkIHJhbmdlCisgICAgMHgxRTcyMDE4MCA6IERRU0ktTUNMSzJYIFAtcGhhc2UgcGFzcyByZWNvcmQgRExMMj0gMC0zMQorICAgIDB4MUU3MjAxODQgOiBEUVNJLU1DTEsyWCBQLXBoYXNlIHBhc3MgcmVjb3JkIERMTDI9MzItNjMKKyAgICAweDFFNzIwMTg4IDogRFFTSS1NQ0xLMlggTi1waGFzZSBwYXNzIHJlY29yZCBETEwyPSAwLTMxCisgICAgMHgxRTcyMDE4QyA6IERRU0ktTUNMSzJYIE4tcGhhc2UgcGFzcyByZWNvcmQgRExMMj0zMi02MworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NhbGlicmF0aW9uX1N0YXJ0X3ByZTogICAgICAgICAgICAgICAgICAgICAgICAgICBAIFRvZ2dsZSBEUVNJIG1hc2sgZGVsYXkKKyAgICBsZHIgcjAsID0weDFlNmUwMDE4CisgICAgbGRyIHIxLCBbcjBdCisgICAgZW9yIHIxLCByMSwgIzB4MTAKKyAgICBzdHIgcjEsIFtyMF0KKworQ2FsaWJyYXRpb25fU3RhcnQ6CisvKiBJbml0IFNSQU0gYnVmZmVyICovCisgICAgbGRyIHIxLCA9MHgwMDAwMDBmZgorICAgIGxkciByMCwgPTB4MWU3MjAwMDAKKyAgICBsZHIgcjIsID0weDFlNzIwMTAwCitpbml0X3NyYW1fc3RhcnQ6CisgICAgc3RyIHIxLCBbcjBdCisgICAgYWRkIHIwLCByMCwgIzQKKyAgICBjbXAgcjAsIHIyCisgICAgYmx0IGluaXRfc3JhbV9zdGFydAorCisgICAgbGRyIHIxLCA9MHgwMGZmMDBmZgorICAgIGxkciByMCwgPTB4MWU3MjAxMDAKKyAgICBsZHIgcjIsID0weDFlNzIwMTgwCitpbml0X3NyYW1fc3RhcnQyOgorICAgIHN0ciByMSwgW3IwXQorICAgIGFkZCByMCwgcjAsICM0CisgICAgY21wIHIwLCByMgorICAgIGJsdCBpbml0X3NyYW1fc3RhcnQyCisKKyAgICBsZHIgcjEsID0weDAwMDAwMDAwCisgICAgbGRyIHIwLCA9MHgxZTcyMDE4MAorICAgIGxkciByMiwgPTB4MWU3MjAyMDAKK2luaXRfc3JhbV9zdGFydDM6CisgICAgc3RyIHIxLCBbcjBdCisgICAgYWRkIHIwLCByMCwgIzQKKyAgICBjbXAgcjAsIHIyCisgICAgYmx0IGluaXRfc3JhbV9zdGFydDMKKworICAgIGxkciByMCwgPTB4MWU2ZTAwNjggICAgICAgICAgICAgICAgICAgICAgICAgIEAgc2F2ZSB0aGUgRExMMSBTQWRqIGluaXRpYWwgdmFsdWUKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzIwMDkwCisgICAgc3RyIHIxLCBbcjBdCisKKy8qIFN0YXJ0CisgIHIwID0gZnJlZQorICByMSA9IGZyZWUKKyAgcjIgPSBmcmVlCisgIHIzID0gZnJlZQorICByNCA9IHJlY29yZCB0aGUgcmV0dXJuIHBjIHZhbHVlLCBkbyBub3QgdXNlCisgIHI1ID0gcGF0dGVybiB0YWJsZSBpbmRleAorICByNiA9IHBhc3MgY291bnQKKyAgcjcgPSBkcmFtIERMTDIgcGFyYW1ldGVyIGluZGV4ICgweDFlNmUwMDY4KSwgbWF4IGlzIDB4NEMKKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRmluZSBEUUkgZGVsYXkgYW5kIERRU0ktTUNMSyBwaGFzZQorICByOCAgPSBEUUlETFkgY291bnQKKyAgcjkgID0gRFFTSS1NQ0xLMlggcGhhc2UgY291bnQKKyAgcjEwID0gcGF0dGVybiBmYWlsIHJldHJ5IGNvdW50ZXIsIGluaXRpYWxpemUgdG8gMiAoZmFpbCAyIHRpbWVzKQorICByMTEgPSBwYXNzY250IGFjY3VtdWxhdG9yIGZvciBlYWNoIERRSURMWQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ0JSMF9TVEFSVDoKKy8qIERlYnVnIC0gVUFSVCBjb25zb2xlIG1lc3NhZ2UgKi8KKyAgICBsZHIgcjAsID0weDFlNzg0MDAwCisgICAgbW92IHIxLCAjMHg0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnQycKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICdCJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4NTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ1InCisgICAgc3RyIHIxLCBbcjBdCisgICAgbW92IHIxLCAjMHgzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnMCcKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICctJworICAgIHN0ciByMSwgW3IwXQorLyogRGVidWcgLSBVQVJUIGNvbnNvbGUgbWVzc2FnZSAqLworCisgICAgbGRyICAgcjAsID0weDFlNmUwMDE4CisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBiaWMgICByMSwgcjEsICMweEZGMDAwMDAwCisgICAgYmljICAgcjEsIHIxLCAjMHgwMEZGMDAwMAorICAgIHN0ciAgIHIxLCBbcjBdCisKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwNzQgICAgICAgICAgICAgICAgICAgICAgICBAIHNldCB0aGUgdGVzdGluZyBEUkFNIHNpemUgPSAxS0IKKyAgICBsZHIgICByMSwgPTB4MDAwMDAzRkYKKyAgICBzdHIgICByMSwgW3IwXQorCisgICAgbW92ICAgcjgsICMweDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IERRSURMWQorICAgIG1vdiAgIHI5LCAjMHgwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBEUVNJLU1DTEsyWCBwaGFzZQorICAgIG1vdiAgIHIxMSwgIzB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBwYXNzY250IGFjY3VtdWxhdG9yCisKK2NicjBfbmV4dF9kcWlkbHk6CisgICAgY21wICAgcjksICMweDAwCisgICAgYm5lICAgY2JyMF9uZXh0X2Rxc2lwaGFzZQorICAgIGNtcCAgIHIxMSwgIzB4MDAKKyAgICBhZGRlcSByOCwgcjgsICMweDAxICAgICAgICAgICAgICAgICAgICAgICAgICBAIGp1bXAgMSBzdGFnZSBpZiBubyBwYXNzIGF0IHByZXZpb3VzIHN0YWdlCisgICAgbW92ICAgcjExLCAjMHgwMAorICAgIGFkZCAgIHI4LCByOCwgIzB4MDEKKyAgICBjbXAgICByOCwgIzB4MUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIG1heCBEUUlETFkgPSAzMQorICAgIGJndCAgIENCUjBfRU5ECisKKy8qIERlYnVnIC0gVUFSVCBjb25zb2xlIG1lc3NhZ2UgKi8KKyAgICBsZHIgICByMCwgPTB4MWU3ODQwMDAKKyAgICBhbmQgICByMSwgcjgsICMweDA3CisgICAgYWRkICAgcjEsIHIxLCAjMHgzMCAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnMC03JworICAgIHN0ciAgIHIxLCBbcjBdCisvKiBEZWJ1ZyAtIFVBUlQgY29uc29sZSBtZXNzYWdlICovCisKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwMTgKKyAgICBsZHIgICByMSwgW3IwXQorICAgIGJpYyAgIHIxLCByMSwgIzB4MDBGRjAwMDAKKyAgICBvcnIgICByMSwgcjEsIHI4LCBsc2wgIzE2CisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBtb3YgICByOSwgIzB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICcxJzpwX3BoYXNlLCAnMCc6bl9waGFzZQorCisgICAgLyogRGVsYXkgYWJvdXQgM3VzICovICAgICAgICAgICAgICAgICAgICAgICAgQCB3YWl0IERRSURMWSBsb2FkCisgICAgbGRyIHIyLCA9MHgwMDAwMDAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgVGltZXI0IFJlbG9hZCA9IDMgdXMKKyAgICBpbml0X2RlbGF5X3RpbWVyCitkZWxheV80OgorICAgIGNoZWNrX2RlbGF5X3RpbWVyCisgICAgYm5lIGRlbGF5XzQKKyAgICBjbGVhcl9kZWxheV90aW1lcgorICAgIC8qIGVuZCBkZWxheSAzdXMgKi8KKworICAgIGIgICAgIGNicjBfZGxsMl9zY2FuX3N0YXJ0CisKK2NicjBfbmV4dF9kcXNpcGhhc2U6CisgICAgbGRyICAgcjAsID0weDFlNmUwMDE4CisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBvcnIgICByMSwgcjEsIHI5LCBsc2wgIzIzICAgICAgICAgICAgICAgICAgICBAIHNldCBEUVNJLU1DTEsyWCBwaGFzZQorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbW92ICAgcjksICMweDAwCisKK2NicjBfZGxsMl9zY2FuX3N0YXJ0OgorICAgIG1vdiAgIHI2LCAjMHgwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBwYXNzIGNvdW50CisgICAgbW92ICAgcjcsICMweDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IERMTDIgcGFyYW1ldGVyIGluZGV4CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRExMMiBkZWxheSBtYXJnaW4gdGVzdCBsb29wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2JyMF9uZXh0X2RsbDJfcGFyYW1ldGVyOgorICAgIGxkciAgIHIwLCA9MHgxZTZlMDA2OCAgICAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCBETEwyIHBhcmFtZXRlcgorICAgIGxkciAgIHIxLCBbcjBdCisgICAgYmljICAgcjEsIHIxLCAjMHgwMEZGMDAwMAorICAgIGJpYyAgIHIxLCByMSwgIzB4RkYwMDAwMDAKKyAgICBvcnIgICByMSwgcjEsIHI3LCBsc2wgIzE2CisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBsZHIgICByMiwgPTB4NDA0MDQwNDAgICAgICAgICAgICAgICAgICAgICAgICBAIERMTDIgbWF4IGlzIDB4NDA0MDQwNDAKKyAgICBjbXAgICByNywgcjIKKyAgICBiZ2UgICBjYnIwX25leHRfZHFpZGx5CisgICAgbGRyICAgcjIsID0weDAxMDEwMTAxCisgICAgYWRkICAgcjcsIHI3LCByMgorCisvKiBDQlJTY2FuMygpIHN0YXJ0ICovCisgICAgYWRybCAgcjUsIFBBVFRFUk5fVEFCTEUgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IHBhdHRlcm4gdGFibGUgaW5kZXgKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgVGVzdCBwYXR0ZXJuIGl0ZXJhdGlvbiBsb29wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2JyMF9uZXh0X3Rlc3RfcGF0dGVybjoKKyAgICBtb3YgICByMTAsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNldCB0aGUgcmV0cnkgbG9vcCA9IDIgb2YgZWFjaCBwYXR0ZXJuCisgICAgbGRyICAgcjEsIFtyNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIHRlc3QgcGF0dGVybgorICAgIGxkciAgIHIwLCA9MHgxZTZlMDA3YworICAgIHN0ciAgIHIxLCBbcjBdCisgICAgY21wICAgcjEsICMweDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB0aGUgbGFzdCBkYXRhIGluIHBhdHRlcm4gaXMgMHgwMAorICAgIGJuZSAgIGNicjBfdGVzdF9idXJzdAorCisgICAgYW5kICAgcjMsIHI3LCAjMHhGRgorICAgIHN1YiAgIHIzLCByMywgIzB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgIEAgd2UgYWRkIDEgYWZ0ZXIgbG9vcCBjaGVjayBzbyB3ZSBuZWVkIHRvIGRlY3JlYXNlIDEKKyAgICBjbXAgICByMywgIzB4MDAKKyAgICBiZXEgICBjYnIwX25leHRfZHFpZGx5ICAgICAgICAgICAgICAgICAgICAgICBAIHBhc3MgYXQgZGxsaSA9IDAsIGludmFsaWQKKyAgICBhZGQgICByNiwgcjYsICMweDAxICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluY3JlbWVudCBwYXNzIGNvdW50CisgICAgYWRkICAgcjExLCByMTEsICMweDAxICAgICAgICAgICAgICAgICAgICAgICAgQCBpbmNyZW1lbnQgcGFzcyBjb3VudAorCisgICAgbGRyICAgcjAsID0weDFlNzIwMTgwICAgICAgICAgICAgICAgICAgICAgICAgQCByZWNvcmQgRExMMiBwYXNzIHdpbmRvdworICAgIGNtcCAgIHI5LCAjMHgwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgRFFTSS1NQ0xLMlggcGhhc2UgY2hlY2sKKyAgICBhZGRlcSByMCwgcjAsICMweDA4CisgICAgY21wICAgcjMsICMzMgorICAgIGFkZGdlIHIwLCByMCwgIzB4NAorICAgIGFuZCAgIHIxLCByMywgIzB4MUYKKyAgICBtb3YgICByMiwgIzB4MQorICAgIG1vdiAgIHIyLCByMiwgbHNsIHIxCisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBvcnIgICByMSwgcjEsIHIyCisgICAgc3RyICAgcjEsIFtyMF0KKworICAgIGxkciAgIHIwLCA9MHgxZTcyMDEwMCAgICAgICAgICAgICAgICAgICAgICAgIEAgcmVjb3JkIERMTDIgbWluOm1heCB2YWx1ZSBmb3IgZWFjaCBEUUlETFkKKyAgICBhZGQgICByMCwgcjAsIHI4LCBsc2wgIzIKKyAgICBjbXAgICByOSwgIzB4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIERRU0ktTUNMSzJYIHBoYXNlIGNoZWNrCisgICAgYmVxICAgY2JyMF90ZXN0X3Bhc3NfZHFzaW4KKyAgICByZWNvcmRfZGxsMl9wYXNzX3JhbmdlCisgICAgYiAgICAgY2JyMF9uZXh0X2RsbDJfcGFyYW1ldGVyCisKK2NicjBfdGVzdF9wYXNzX2Rxc2luOgorICAgIHJlY29yZF9kbGwyX3Bhc3NfcmFuZ2VfaAorICAgIGIgICAgIGNicjBfbmV4dF9kbGwyX3BhcmFtZXRlcgorCitjYnIwX3Rlc3RfcGF0dGVybl9mYWlsOgorICAgIGNtcCAgIHI2LCAjNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcGFzc2NudCA+PSA1CisgICAgYmdlICAgY2JyMF9uZXh0X2RxaWRseQorICAgIGxkciAgIHIwLCA9MHgxZTcyMDEwMCAgICAgICAgICAgICAgICAgICAgICAgIEAgcmVzZXQgRExMMiBtaW46bWF4IHZhbHVlCisgICAgYWRkICAgcjAsIHIwLCByOCwgbHNsICMyCisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBsZHIgICByMiwgPTB4RkZGRjAwMDAKKyAgICBsZHIgICByMywgPTB4MDAwMDAwRkYKKyAgICBjbXAgICByOSwgIzB4MDAKKyAgICBtb3ZlcSByMiwgcjIsIGxzciAjMTYKKyAgICBtb3ZlcSByMywgcjMsIGxzbCAjMTYKKyAgICBhbmQgICByMSwgcjEsIHIyCisgICAgb3JyICAgcjEsIHIxLCByMworICAgIHN0ciAgIHIxLCBbcjBdCisgICAgYiAgICAgY2JyMF9uZXh0X2RsbDJfcGFyYW1ldGVyICAgICAgICAgICAgICAgQCBDQlJTY2FuMygpIGVuZCBhbmQgdGVzdCByZXN1bHQgZmFpbCwgZ28gdG8gbmV4dCBzdGVwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgVGVzdCBmYWlsIHJldHJ5IGxvb3AKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjYnIwX3BhdHRlcm5fZmFpbF9yZXRyeToKKworLyogQ0JSVGVzdDMoKSBzdGFydCAqLworY2JyMF90ZXN0X2J1cnN0OgorICAgIGxkciAgIHIwLCA9MHgxZTZlMDA3MAorICAgIGxkciAgIHIxLCA9MHgwMDAwMDAwMAorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbGRyICAgcjEsID0weDAwMDAwMEMxCisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBsZHIgICByMywgPTB4MzAwMAorY2JyMF93YWl0X2VuZ2luZV9pZGxlXzA6CisgICAgbGRyICAgcjIsIFtyMF0KKyAgICB0c3QgICByMiwgcjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIERbMTJdID0gaWRsZSBiaXQKKyAgICBiZXEgICBjYnIwX3dhaXRfZW5naW5lX2lkbGVfMAorCisgICAgbGRyICAgcjIsIFtyMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCByZWFkIGZhaWwgYml0IHN0YXR1cworICAgIG1vdiAgIHIxLCAjMHgwCisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBtb3YgICByMiwgcjIsIGxzciAjMTMgICAgICAgICAgICAgICAgICAgICAgICBAIERbMTNdID0gZmFpbCBiaXQKKyAgICBjbXAgICByMiwgIzB4MDAKKyAgICBibmUgICBjYnIwX3Rlc3RfZmFpbAorCitjYnIwX3Rlc3Rfc2luZ2xlOgorICAgIGxkciAgIHIwLCA9MHgxZTZlMDA3MAorICAgIGxkciAgIHIxLCA9MHgwMDAwMDAwMAorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbGRyICAgcjEsID0weDAwMDAwMDg1CisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBsZHIgICByMywgPTB4MzAwMAorY2JyMF93YWl0X2VuZ2luZV9pZGxlXzE6CisgICAgbGRyICAgcjIsIFtyMF0KKyAgICB0c3QgICByMiwgcjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIERbMTJdID0gaWRsZSBiaXQKKyAgICBiZXEgICBjYnIwX3dhaXRfZW5naW5lX2lkbGVfMQorCisgICAgbGRyICAgcjIsIFtyMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCByZWFkIGZhaWwgYml0IHN0YXR1cworICAgIG1vdiAgIHIxLCAjMHgwCisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBtb3YgICByMiwgcjIsIGxzciAjMTMgICAgICAgICAgICAgICAgICAgICAgICBAIERbMTNdID0gZmFpbCBiaXQKKyAgICBjbXAgICByMiwgIzB4MDAKKyAgICBiZXEgICBjYnIwX3Rlc3RfcGFzcworCisvKiBDQlJUZXN0MygpIGVuZCAqLworCitjYnIwX3Rlc3RfZmFpbDoKKyAgICBzdWJzICByMTAsIHIxMCwgIzEKKyAgICBibmUgICBjYnIwX3BhdHRlcm5fZmFpbF9yZXRyeQorICAgIGIgICAgIGNicjBfdGVzdF9wYXR0ZXJuX2ZhaWwgICAgICAgICAgICAgICAgIEAgQ0JSU2NhbjMoKSByZXR1cm4oMCkKKworY2JyMF90ZXN0X3Bhc3M6CisgICAgYWRkICAgcjUsIHI1LCAjMHgwNCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbmNyZWFzZSB0aGUgdGVzdCBwYXR0ZXJuIGluZGV4CisgICAgYiAgICAgY2JyMF9uZXh0X3Rlc3RfcGF0dGVybgorCitDQlIwX0VORDoKKyAgICBtb3YgICByNSwgIzB4MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgRFFJRExZIHNlYXJjaCBjb3VudAorICAgIG1vdiAgIHI2LCAjMHgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBtYXhfbWFyZ2luOmdfbWFyZ2luCisgICAgbW92ICAgcjgsICMweDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IGdfc2lkZQorICAgIG1vdiAgIHI3LCAjMHgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBtYXhpbXVtIG1hcmdpbiBEUUlETFksRFFTSS1NQ0xLMlggcGhhc2UKK2NicjBfc2VhcmNoX2RsbF9tYXJnaW5fczoKKyAgICBsZHIgICByMCwgPTB4MWU3MjAxMDAKKyAgICBhZGQgICByMCwgcjAsIHI1LCBsc2wgIzIKKyAgICBsZHIgICByMSwgW3IwXQorICAgIGFuZCAgIHIyLCByMSwgIzB4RkYgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZ2V0IGRsbG1pbl9wCisgICAgbW92ICAgcjEsIHIxLCBsc3IgIzgKKyAgICBhbmQgICByMywgcjEsICMweEZGICAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBkbGxtYXhfcAorICAgIHN1YnMgIHIyLCByMywgcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZ2V0IG1hcmdpbi1QCisgICAgbW92bWkgcjIsICMweDAKKyAgICBtb3YgICByMSwgcjEsIGxzciAjOAorICAgIGFuZCAgIHIzLCByMSwgIzB4RkYgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZ2V0IGRsbG1pbl9uCisgICAgbW92ICAgcjEsIHIxLCBsc3IgIzgKKyAgICBhbmQgICByMSwgcjEsICMweEZGICAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBkbGxtYXhfbgorICAgIHN1YnMgIHIzLCByMSwgcjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZ2V0IG1hcmdpbi1OCisgICAgbW92bWkgcjMsICMweDAKKyAgICBhZGQgICByMSwgcjIsIHIzCisgICAgY21wICAgcjEsICMweDAKKyAgICBiZXEgICBjYnIwX3NlYXJjaF9kbGxfbWFyZ2luX2UgICAgICAgICAgICAgICBAIGlmIG1hcmdpbi1QID0gMCAmJiBtYXJnaW4tTiA9IDAKKworICAgIGxkciAgIHI5LCBbcjBdCisgICAgbGRyICAgcjAsID0weDFlNzIwMTgwCisgICAgY21wICAgcjIsIHIzCisgICAgb3JybHQgcjUsIHI1LCAjMHg4MCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBtYXJnaW4tTiA+IG1hcmdpbi1QCisgICAgYWRkbHQgcjAsIHIwLCAjMHgwOAorICAgIG1vdmx0IHI5LCByOSwgbHNyICMxNgorICAgIG1vdmdlIHIzLCByMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbWF4KG1hcmdpbi1QL04pCisgICAgYWRkICAgcjIsIHIzLCAjMHgyICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBkZWZpbmUgKy8tIDIgc3RlcHMgb2YgdmFyaWF0aW9uCisgICAgbW92ICAgcjEsIHI2LCBsc3IgIzE2CisgICAgY21wICAgcjIsIHIxCisgICAgYmx0ICAgY2JyMF9zZWFyY2hfZGxsX21hcmdpbl9lICAgICAgICAgICAgICAgQCBpZiBtYXgobWFyZ2luLVAvTikgKyAyIDwgbWF4X21hcmdpbgorCisgICAgYW5kICAgcjEsIHI5LCAjMHhGRiAgICAgICAgICAgICAgICAgICAgICAgICAgQCByMSA9IGRsbGkgY291bnRlcgorICAgIGNtcCAgIHIxLCAjMzIKKyAgICBsZHJnZSByMiwgW3IwLCAjMHg0XSAgICAgICAgICAgICAgICAgICAgICAgICBAIGxvYWQgcGFzcyB3aW5kb3cKKyAgICBsZHJsdCByMiwgW3IwXQorICAgIGFuZCAgIHIxLCByMSwgIzB4MUYKKyAgICBtb3YgICByMTAsICMweDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgdGVzdCBiaXQgbWFzaworICAgIG1vdiAgIHIxMCwgcjEwLCBsc2wgcjEKKyAgICBhbmQgICByMSwgcjksICMweEZGCitjYnIwX3NlYXJjaF9kbGxtaW5fbWFyZ2luX3M6CisgICAgdHN0ICAgcjIsIHIxMAorICAgIGJlcSAgIGNicjBfc2VhcmNoX2RsbG1pbl9tYXJnaW5fZQorICAgIG1vdiAgIHIxMCwgcjEwLCBsc3IgIzEKKyAgICBjbXAgICByMSwgIzMyCisgICAgbGRyZXEgcjIsIFtyMF0KKyAgICBsZHJlcSByMTAsID0weDgwMDAwMDAwCisgICAgc3VicyAgcjEsIHIxLCAjMHgxCisgICAgYm5lICAgY2JyMF9zZWFyY2hfZGxsbWluX21hcmdpbl9zCisKK2NicjBfc2VhcmNoX2RsbG1pbl9tYXJnaW5fZToKKyAgICBhbmQgICByMiwgcjksICMweEZGCisgICAgc3ViICAgcjExLCByMiwgcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBnZXQgZGxsbWluIHNpZGUgbWFyZ2luCisKKyAgICBtb3YgICByOSwgcjksIGxzciAjOAorICAgIGFuZCAgIHIxLCByOSwgIzB4RkYgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcjEgPSBkbGxpIGNvdW50ZXIKKyAgICBjbXAgICByMSwgIzMyCisgICAgbGRyZ2UgcjIsIFtyMCwgIzB4NF0gICAgICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIHBhc3Mgd2luZG93CisgICAgbGRybHQgcjIsIFtyMF0KKyAgICBhbmQgICByMSwgcjEsICMweDFGCisgICAgbW92ICAgcjEwLCAjMHgxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IHRlc3QgYml0IG1hc2sKKyAgICBtb3YgICByMTAsIHIxMCwgbHNsIHIxCisgICAgYW5kICAgcjEsIHI5LCAjMHhGRgorY2JyMF9zZWFyY2hfZGxsbWF4X21hcmdpbl9zOgorICAgIHRzdCAgIHIyLCByMTAKKyAgICBiZXEgICBjYnIwX3NlYXJjaF9kbGxtYXhfbWFyZ2luX2UKKyAgICBtb3YgICByMTAsIHIxMCwgbHNsICMxCisgICAgY21wICAgcjEsICMzMQorICAgIGxkcmVxIHIyLCBbcjAsICMweDRdCisgICAgbGRyZXEgcjEwLCA9MHgwMDAwMDAwMQorICAgIGFkZCAgIHIxLCByMSwgIzB4MQorICAgIGNtcCAgIHIxLCAjNjQKKyAgICBibmUgICBjYnIwX3NlYXJjaF9kbGxtYXhfbWFyZ2luX3MKKworY2JyMF9zZWFyY2hfZGxsbWF4X21hcmdpbl9lOgorICAgIGFuZCAgIHIyLCByOSwgIzB4RkYKKyAgICBzdWIgICByMSwgcjEsIHIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBkbGxtYXggc2lkZSBtYXJnaW4KKyAgICBjbXAgICByMSwgcjExCisgICAgbW92bHQgcjExLCByMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBnZXQgc2lkZV9tYXJnaW4KKworY2JyMF9jaGVja19kbGxfbWFyZ2luOiAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaWYgbWF4KG1hcmdpbi1QL04pID4gZ19tYXJnaW4gJiYgc2lkZV9tYXJnaW4gPj0gZ19zaWRlICYmIGRxaWRseSA8PSAyMAorICAgIGNtcCAgIHI1LCAjMjAKKyAgICBiZ3QgICBjYnIwX2NoZWNrX2RsbF9tYXJnaW4yCisgICAgYW5kICAgcjEsIHI2LCAjMHhGRgorICAgIGNtcCAgIHIzLCByMQorICAgIGJsZSAgIGNicjBfY2hlY2tfZGxsX21hcmdpbjMKKyAgICBjbXAgICByMTEsIHI4CisgICAgYmdlICAgY2JyMF9zZXRfZGxsX21hcmdpbgorCitjYnIwX2NoZWNrX2RsbF9tYXJnaW4yOiAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpZiBtYXgobWFyZ2luLVAvTikgPiBnX21hcmdpbisxICYmIHNpZGVfbWFyZ2luID49IGdfc2lkZSkKKyAgICBhbmQgICByMSwgcjYsICMweEZGCisgICAgYWRkICAgcjIsIHIxLCAjMHgxCisgICAgY21wICAgcjMsIHIyCisgICAgYmxlICAgY2JyMF9jaGVja19kbGxfbWFyZ2luMworICAgIGNtcCAgIHIxMSwgcjgKKyAgICBiZ2UgICBjYnIwX3NldF9kbGxfbWFyZ2luCisKK2NicjBfY2hlY2tfZGxsX21hcmdpbjM6ICAgICAgICAgICAgICAgICAgICAgICAgICBAIGlmIHNpZGVfbWFyZ2luID4gZ19zaWRlICYmIGdfc2lkZSA8IDgKKyAgICBjbXAgICByOCwgIzgKKyAgICBiZ2UgICBjYnIwX3NlYXJjaF9kbGxfbWFyZ2luX2UKKyAgICBjbXAgICByMTEsIHI4CisgICAgYmxlICAgY2JyMF9zZWFyY2hfZGxsX21hcmdpbl9lCisKK2NicjBfc2V0X2RsbF9tYXJnaW46CisgICAgbW92ICAgcjEsIHI2LCBsc3IgIzE2CisgICAgY21wICAgcjMsIHIxCisgICAgYmljZ3QgcjYsIHI2LCAjMHgwMEZGMDAwMAorICAgIG9ycmd0IHI2LCByNiwgcjMsIGxzbCAjMTYKKyAgICBiaWMgICByNiwgcjYsICMweDAwMDAwMEZGCisgICAgb3JyICAgcjYsIHI2LCByMworICAgIG1vdiAgIHI3LCByNQorICAgIG1vdiAgIHI4LCByMTEKKworY2JyMF9zZWFyY2hfZGxsX21hcmdpbl9lOgorICAgIGFuZCAgIHI1LCByNSwgIzB4N0YKKyAgICBhZGQgICByNSwgcjUsICMweDAxCisgICAgY21wICAgcjUsICMweDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBsYXN0IERRSURMWQorICAgIGJsdCAgIGNicjBfc2VhcmNoX2RsbF9tYXJnaW5fcworCisgICAgbGRyICAgcjAsID0weDFlNmUwMDE4CisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBiaWMgICByMSwgcjEsICMweDAwRkYwMDAwCisgICAgb3JyICAgcjEsIHIxLCByNywgbHNsICMxNgorICAgIHN0ciAgIHIxLCBbcjBdCisKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwNjgKKyAgICBsZHIgICByMSwgW3IwXQorICAgIGJpYyAgIHIxLCByMSwgIzB4MDBGRjAwMDAKKyAgICBiaWMgICByMSwgcjEsICMweEZGMDAwMDAwCisgICAgc3RyICAgcjEsIFtyMF0KKworICAgIC8qIERlbGF5IGFib3V0IDV1cyAqLworICAgIGxkciByMiwgPTB4MDAwMDAwMDUgICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IFRpbWVyNSBSZWxvYWQgPSA1IHVzCisgICAgaW5pdF9kZWxheV90aW1lcgorZGVsYXlfNToKKyAgICBjaGVja19kZWxheV90aW1lcgorICAgIGJuZSBkZWxheV81CisgICAgY2xlYXJfZGVsYXlfdGltZXIKKyAgICAvKiBlbmQgZGVsYXkgNXVzICovCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDBjICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCByZWZyZXNoIGN5Y2xlCisgICAgbGRyIHIxLCA9MHgwMDAwNUMwMQorICAgIHN0ciByMSwgW3IwXQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRmluZSB0dW5lIHBlciBiaXQgRFEgaW5wdXQgZGVsYXkgLS0gUGFzcyAxLCBsZWZ0IGVkZ2UgYWxpZ24KKyAgcjggID0gZnJlZQorICByOSAgPSBEUSBmYWlsIGJpdCBhY2N1bXVsYXRvcgorICByMTAgPSBwYXR0ZXJuIGZhaWwgY291bnRlciwgaW5pdGlhbGl6ZSB0byA1IChmYWlsIDUgdGltZXMpCisgIHIxMSA9IGZyZWUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NCUjFfU1RBUlQ6CisvKiBEZWJ1ZyAtIFVBUlQgY29uc29sZSBtZXNzYWdlICovCisgICAgbGRyIHIwLCA9MHgxZTc4NDAwMAorICAgIG1vdiByMSwgIzB4MEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ1xyJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4MEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ1xuJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4NDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ0MnCisgICAgc3RyIHIxLCBbcjBdCisgICAgbW92IHIxLCAjMHg0MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnQicKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICdSJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4MzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJzEnCisgICAgc3RyIHIxLCBbcjBdCisvKiBEZWJ1ZyAtIFVBUlQgY29uc29sZSBtZXNzYWdlICovCisKKyAgICBtb3YgICByNiwgIzB4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgcGFzcyBjb3VudAorICAgIG1vdiAgIHI3LCAjMHgwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBETEwyIHBhcmFtZXRlciBpbmRleAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIERMTDIgZGVsYXkgbWFyZ2luIHRlc3QgbG9vcAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NicjFfbmV4dF9kbGwyX3BhcmFtZXRlcjoKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwNjggICAgICAgICAgICAgICAgICAgICAgICBAIGxvYWQgRExMMiBwYXJhbWV0ZXIKKyAgICBsZHIgICByMSwgW3IwXQorICAgIGJpYyAgIHIxLCByMSwgIzB4MDBGRjAwMDAKKyAgICBiaWMgICByMSwgcjEsICMweEZGMDAwMDAwCisgICAgb3JyICAgcjEsIHIxLCByNywgbHNsICMxNgorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbGRyICAgcjIsID0weDQwNDA0MDQwICAgICAgICAgICAgICAgICAgICAgICAgQCBwYXJhbWV0ZXIncyBtYXggaXMgdG8gMHg0MDQwNDA0MAorICAgIGNtcCAgIHI3LCByMgorICAgIGJnZSAgIENCUjFfRU5ECisgICAgbGRyICAgcjIsID0weDAxMDEwMTAxCisgICAgYWRkICAgcjcsIHI3LCByMgorCisgICAgbGRyICAgcjAsID0weDFlNmUwMDc0ICAgICAgICAgICAgICAgICAgICAgICAgQCBzZXQgdGhlIHRlc3RpbmcgRFJBTSBzaXplID0gNEtCCisgICAgbGRyICAgcjEsID0weDAwMDAwRkZGCisgICAgc3RyICAgcjEsIFtyMF0KKworLyogQ0JSU2NhbjIoKSBzdGFydCAqLworICAgIGxkciAgIHI5LCA9MHhGRkZGICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCB0ZXN0IHN0YXR1cworICAgIGFkcmwgIHI1LCBQQVRURVJOX1RBQkxFICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBwYXR0ZXJuIHRhYmxlIGluZGV4CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFRlc3QgcGF0dGVybiBpdGVyYXRpb24gbG9vcAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NicjFfbmV4dF90ZXN0X3BhdHRlcm46CisgICAgbW92ICAgcjEwLCAjNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzZXQgdGhlIHJldHJ5IGxvb3Agb2YgZWFjaCBwYXR0ZXJuCisgICAgbGRyICAgcjEsIFtyNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIHRlc3QgcGF0dGVybgorICAgIGxkciAgIHIwLCA9MHgxZTZlMDA3YworICAgIHN0ciAgIHIxLCBbcjBdCisgICAgY21wICAgcjEsICMweDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB0aGUgbGFzdCBkYXRhIGluIHBhdHRlcm4gaXMgMHgwMAorICAgIGJuZSAgIGNicjFfdGVzdF9zaW5nbGUKKworY2JyMV90ZXN0X3BhdHRlcm5fZW5kOgorICAgIGNtcCAgIHI5LCAjMHgwMAorICAgIGJuZSAgIGNicjFfdGVzdF9wYXNzX2RxaQorICAgIGNtcCAgIHI2LCAjMTAKKyAgICBiZ2UgICBDQlIxX0VORAorICAgIGIgICAgIGNicjFfbmV4dF9kbGwyX3BhcmFtZXRlciAgICAgICAgICAgICAgIEAgQ0JSU2NhbjIoKSBlbmQgYW5kIHRlc3QgcmVzdWx0IGZhaWwsIGdvIHRvIG5leHQgc3RlcAorCitjYnIxX3Rlc3RfcGFzc19kcWk6CisgICAgYW5kICAgcjMsIHI3LCAjMHhGRgorICAgIHN1YiAgIHIzLCByMywgIzB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgIEAgd2UgYWRkIDEgYWZ0ZXIgbG9vcCBjaGVjayBzbyB3ZSBuZWVkIHRvIGRlY3JlYXNlIDEKKyAgICBhZGQgICByNiwgcjYsICMweDAxICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluY3JlbWVudCBwYXNzIGNvdW50CisgICAgbGRyICAgcjAsID0weDFlNzIwMDEwCisgICAgbW92ICAgcjgsICMweDAxCitjYnIxX3Rlc3RfcGFzc19kcWlfbG9vcF9zOgorICAgIHRzdCAgIHI5LCByOAorICAgIGJlcSAgIGNicjFfdGVzdF9wYXNzX2RxaV9sb29wX2UKKyAgICByZWNvcmRfZGxsMl9wYXNzX3JhbmdlCisKK2NicjFfdGVzdF9wYXNzX2RxaV9sb29wX2U6CisgICAgYWRkICAgcjAsIHIwLCAjMHgwNAorICAgIG1vdiAgIHI4LCByOCwgbHNsICMxCisgICAgbGRyICAgcjEsID0weEZGRkYKKyAgICB0c3QgICByOCwgcjEKKyAgICBibmUgICBjYnIxX3Rlc3RfcGFzc19kcWlfbG9vcF9zCisgICAgYiAgICAgY2JyMV9uZXh0X2RsbDJfcGFyYW1ldGVyCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgVGVzdCBmYWlsIHJldHJ5IGxvb3AKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjYnIxX3BhdHRlcm5fZmFpbF9yZXRyeToKKworLyogQ0JSVGVzdDIoKSBzdGFydCAqLworY2JyMV90ZXN0X3NpbmdsZToKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwNzAKKyAgICBsZHIgICByMSwgPTB4MDAwMDAwMDAKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGxkciAgIHIxLCA9MHgwMDAwMDAwNQorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbGRyICAgcjMsID0weDEwMDAKKyAgICBsZHIgICByMSwgPTB4MTAwMAorY2JyMV93YWl0X2VuZ2luZV9pZGxlXzA6CisgICAgc3VicyAgcjEsIHIxLCAjMQorICAgIGJlcSAgIGNicjFfdGVzdF9zaW5nbGVfZW5kCisgICAgbGRyICAgcjIsIFtyMF0KKyAgICB0c3QgICByMiwgcjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIERbMTJdID0gaWRsZSBiaXQKKyAgICBiZXEgICBjYnIxX3dhaXRfZW5naW5lX2lkbGVfMAorCitjYnIxX3Rlc3Rfc2luZ2xlX2VuZDoKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwNzggICAgICAgICAgICAgICAgICAgICAgICBAIHJlYWQgZmFpbCBiaXQgc3RhdHVzCisgICAgbGRyICAgcjExLCBbcjBdCisgICAgb3JyICAgcjExLCByMTEsIHIxMSwgbHNyICMxNgorICAgIGJpYyAgIHIxMSwgcjExLCAjMHhGRjAwMDAwMAorICAgIGJpYyAgIHIxMSwgcjExLCAjMHgwMEZGMDAwMAorCisgICAgbGRyICAgcjEsID0weEZGRkYKKyAgICBjbXAgICByMTEsIHIxCisgICAgYmVxICAgY2JyMV90ZXN0X2ZhaWwKKworY2JyMV90ZXN0X2J1cnN0OgorICAgIGxkciAgIHIwLCA9MHgxZTZlMDA3MAorICAgIGxkciAgIHIyLCA9MHgwMDAwMDAwMAorICAgIHN0ciAgIHIyLCBbcjBdCisgICAgbGRyICAgcjIsID0weDAwMDAwMDQxCisgICAgc3RyICAgcjIsIFtyMF0KKyAgICBsZHIgICByMywgPTB4MTAwMAorICAgIGxkciAgIHIxLCA9MHgxMDAwCitjYnIxX3dhaXRfZW5naW5lX2lkbGVfMToKKyAgICBzdWJzICByMSwgcjEsICMxCisgICAgYmVxICAgY2JyMV90ZXN0X2J1cnN0X2VuZAorICAgIGxkciAgIHIyLCBbcjBdCisgICAgdHN0ICAgcjIsIHIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBEWzEyXSA9IGlkbGUgYml0CisgICAgYmVxICAgY2JyMV93YWl0X2VuZ2luZV9pZGxlXzEKKworY2JyMV90ZXN0X2J1cnN0X2VuZDoKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwNzggICAgICAgICAgICAgICAgICAgICAgICBAIHJlYWQgZmFpbCBiaXQgc3RhdHVzCisgICAgbGRyICAgcjIsIFtyMF0KKyAgICBvcnIgICByMiwgcjIsIHIyLCBsc3IgIzE2CisgICAgYmljICAgcjIsIHIyLCAjMHhGRjAwMDAwMAorICAgIGJpYyAgIHIyLCByMiwgIzB4MDBGRjAwMDAKKyAgICBvcnIgICByMTEsIHIxMSwgcjIKKworICAgIGxkciAgIHIyLCA9MHhGRkZGCisgICAgY21wICAgcjExLCByMgorICAgIGJuZSAgIGNicjFfdGVzdF9wYXNzCisvKiBDQlJUZXN0MigpIGVuZCAqLworCitjYnIxX3Rlc3RfZmFpbDoKKyAgICBzdWJzICByMTAsIHIxMCwgIzEKKyAgICBibmUgICBjYnIxX3BhdHRlcm5fZmFpbF9yZXRyeQorICAgIG1vdiAgIHI5LCAjMHgwMAorICAgIGIgICAgIGNicjFfdGVzdF9wYXR0ZXJuX2VuZCAgICAgICAgICAgICAgICAgIEAgQ0JSU2NhbjIoKSByZXR1cm4oMCkKKworY2JyMV90ZXN0X3Bhc3M6CisgICAgbGRyICAgcjEsID0weEZGRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCByZWNvcmQgdGhlIHBhc3MgYml0CisgICAgZW9yICAgcjExLCByMTEsIHIxCisgICAgYW5kICAgcjksIHI5LCByMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBEUSBwYXNzIGJpdAorICAgIGNtcCAgIHI5LCAjMHgwMAorICAgIGJlcSAgIGNicjFfdGVzdF9wYXR0ZXJuX2VuZCAgICAgICAgICAgICAgICAgIEAgQ0JSU2NhbjIoKSByZXR1cm4oMCkKKworICAgIGFkZCAgIHI1LCByNSwgIzB4MDQgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5jcmVhc2UgdGhlIHRlc3QgcGF0dGVybiBpbmRleAorICAgIGIgICAgIGNicjFfbmV4dF90ZXN0X3BhdHRlcm4KKworQ0JSMV9FTkQ6CisgICAgbW92ICAgcjUsICMweDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IERRIERMTF9taW4gc3VtCisgICAgbW92ICAgcjYsICMweDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IERRIERMTF9taW4gdmFsaWQgY291bnQKKyAgICBsZHIgICByMCwgPTB4MWU3MjAwMGMKKyAgICBsZHIgICByMywgPTB4MWU3MjAwNTAKK2NicjFfc2VhcmNoX2RsbG1pbl9zOgorICAgIGFkZCAgIHIwLCByMCwgIzB4MDQKKyAgICBjbXAgICByMCwgcjMKKyAgICBiZXEgICBjYnIxX3NlYXJjaF9kbGxtaW5fZQorICAgIGxkciAgIHIxLCBbcjBdCisgICAgbW92ICAgcjIsIHIxLCBsc3IgIzgKKyAgICBhbmQgICByMiwgcjIsICMweEZGICAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBkbGxtYXgKKyAgICBhbmQgICByMSwgcjEsICMweEZGICAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBkbGxtaW4KKyAgICBzdWJzICByMiwgcjIsIHIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGRsbG1heCAtIGRsbG1pbgorICAgIGJtaSAgIGNicjFfc2VhcmNoX2RsbG1pbl9zICAgICAgICAgICAgICAgICAgIEAgbm8gdmFsaWQgbWFyZ2luIGZvdW5kLCBieXBhc3MgZmluZSB0dW5lCisgICAgY21wICAgcjIsICMxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAoZGxsbWF4IC0gZGxsbWluKSA8IDEwCisgICAgYmx0ICAgY2JyMV9zZWFyY2hfZGxsbWluX3MgICAgICAgICAgICAgICAgICAgQCBubyBlbm91Z2ggbWFyZ2luIGZvdW5kLCBieXBhc3MgZmluZSB0dW5lCisgICAgYWRkICAgcjUsIHI1LCByMQorICAgIGFkZCAgIHI2LCByNiwgIzEKKyAgICBiICAgICBjYnIxX3NlYXJjaF9kbGxtaW5fcworCitjYnIxX3NlYXJjaF9kbGxtaW5fZToKKyAgICBjbXAgICByNiwgIzE2CisgICAgYm5lICAgQ2FsaWJyYXRpb25fU3RhcnRfcHJlICAgICAgICAgICAgICAgICAgQCBub3QgYWxsIGJpdHMgdmFsaWQsIHJldHJ5IGFnYWluCisKKyAgICBtb3YgICByNSwgcjUsIGxzciAjNAorICAgIGxkciAgIHIwLCA9MHgxZTcyMDAwMAorICAgIHN0ciAgIHI1LCBbcjBdCisKKyAgICBtb3YgICByNiwgIzB4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgRFFMIENCUiB2YWx1ZQorICAgIGxkciAgIHIwLCA9MHgxZTcyMDAzMAorICAgIGxkciAgIHI3LCA9MHgxZTcyMDAwYworY2JyMV9zZXRfcmVzdWx0X2RxbDoKKyAgICBzdWIgICByMCwgcjAsICM0CisgICAgY21wICAgcjAsIHI3CisgICAgYmVxICAgY2JyMV9zZXRfcmVzdWx0X25leHQKKyAgICBtb3YgICByNiwgcjYsIGxzbCAjMworICAgIGxkciAgIHIxLCBbcjBdCisgICAgbW92ICAgcjIsIHIxLCBsc3IgIzgKKyAgICBhbmQgICByMiwgcjIsICMweEZGICAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBkbGxtYXgKKyAgICBhbmQgICByMSwgcjEsICMweEZGICAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBkbGxtaW4KKyAgICBtb3YgICByMywgcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGRsbCA9IGRsbG1pbgorICAgIGNtcCAgIHI1LCByMworICAgIGJsdCAgIGNicjFfc2V0X3Jlc3VsdF9kcWxfbmVnCisgICAgc3ViICAgcjEsIHI1LCByMworICAgIG1vdiAgIHIyLCAjMTkKKyAgICBtdWwgICByMSwgcjIsIHIxCisgICAgbW92ICAgcjEsIHIxLCBsc3IgIzUgICAgICAgICAgICAgICAgICAgICAgICAgQCBkcWlfdHVuZSA9ICgoZ29sZF9kbGwgLSBkbGwpICogMTkpID4+IDUKKyAgICBjbXAgICByMSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGRxaV90dW5lIG1heCA9IDIKKyAgICBtb3ZndCByMSwgIzIKKyAgICBvcnIgICByNiwgcjYsIHIxCisgICAgYiAgICAgY2JyMV9zZXRfcmVzdWx0X2RxbAorCitjYnIxX3NldF9yZXN1bHRfZHFsX25lZzoKKyAgICBzdWIgICByMSwgcjMsIHI1CisgICAgbW92ICAgcjIsICMxOQorICAgIG11bCAgIHIxLCByMiwgcjEKKyAgICBtb3YgICByMSwgcjEsIGxzciAjNSAgICAgICAgICAgICAgICAgICAgICAgICBAIGRxaV90dW5lID0gKChnb2xkX2RsbCAtIGRsbCkgKiAxOSkgPj4gNQorICAgIGNtcCAgIHIxLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZHFpX3R1bmUgbWF4ID0gLTIKKyAgICBtb3ZndCByMSwgIzIKKyAgICBtb3YgICByMiwgIzgKKyAgICBzdWIgICByMSwgcjIsIHIxCisgICAgYW5kICAgcjEsIHIxLCAjNworICAgIG9yciAgIHI2LCByNiwgcjEKKyAgICBiICAgICBjYnIxX3NldF9yZXN1bHRfZHFsCisKK2NicjFfc2V0X3Jlc3VsdF9uZXh0OgorICAgIGxkciAgIHIwLCA9MHgxZTZlMDA4MCAgICAgICAgICAgICAgICAgICAgICAgIEAgc2F2ZSBEUUwgZmluZSB0dW5lIHJlc3VsdAorICAgIHN0ciAgIHI2LCBbcjBdCisgICAgbGRyICAgcjAsID0weDFlNzIwMDk0CisgICAgc3RyICAgcjYsIFtyMF0KKworICAgIG1vdiAgIHI2LCAjMHgwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBEUUggQ0JSIHZhbHVlCisgICAgbGRyICAgcjAsID0weDFlNzIwMDUwCisgICAgbGRyICAgcjcsID0weDFlNzIwMDJjCitjYnIxX3NldF9yZXN1bHRfZHFoOgorICAgIHN1YiAgIHIwLCByMCwgIzQKKyAgICBjbXAgICByMCwgcjcKKyAgICBiZXEgICBjYnIxX3NldF9yZXN1bHRfZW5kCisgICAgbW92ICAgcjYsIHI2LCBsc2wgIzMKKyAgICBsZHIgICByMSwgW3IwXQorICAgIG1vdiAgIHIyLCByMSwgbHNyICM4CisgICAgYW5kICAgcjIsIHIyLCAjMHhGRiAgICAgICAgICAgICAgICAgICAgICAgICAgQCBnZXQgZGxsbWF4CisgICAgYW5kICAgcjEsIHIxLCAjMHhGRiAgICAgICAgICAgICAgICAgICAgICAgICAgQCBnZXQgZGxsbWluCisgICAgbW92ICAgcjMsIHIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBkbGwgPSBkbGxtaW4KKyAgICBjbXAgICByNSwgcjMKKyAgICBibHQgICBjYnIxX3NldF9yZXN1bHRfZHFoX25lZworICAgIHN1YiAgIHIxLCByNSwgcjMKKyAgICBtb3YgICByMiwgIzE5CisgICAgbXVsICAgcjEsIHIyLCByMQorICAgIG1vdiAgIHIxLCByMSwgbHNyICM1ICAgICAgICAgICAgICAgICAgICAgICAgIEAgZHFpX3R1bmUgPSAoKGdvbGRfZGxsIC0gZGxsKSAqIDE5KSA+PiA1CisgICAgY21wICAgcjEsICMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBkcWlfdHVuZSBtYXggPSAyCisgICAgbW92Z3QgcjEsICMzCisgICAgc3VicyAgcjEsIHIxLCAjMQorICAgIG1vdm1pIHIxLCAjNworICAgIG9yciAgIHI2LCByNiwgcjEKKyAgICBiICAgICBjYnIxX3NldF9yZXN1bHRfZHFoCisKK2NicjFfc2V0X3Jlc3VsdF9kcWhfbmVnOgorICAgIHN1YiAgIHIxLCByMywgcjUKKyAgICBtb3YgICByMiwgIzE5CisgICAgbXVsICAgcjEsIHIyLCByMQorICAgIG1vdiAgIHIxLCByMSwgbHNyICM1ICAgICAgICAgICAgICAgICAgICAgICAgIEAgZHFpX3R1bmUgPSAoKGdvbGRfZGxsIC0gZGxsKSAqIDE5KSA+PiA1CisgICAgYWRkICAgcjEsIHIxLCAjMQorICAgIGNtcCAgIHIxLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZHFpX3R1bmUgbWF4ID0gLTIKKyAgICBtb3ZndCByMSwgIzIKKyAgICBtb3YgICByMiwgIzgKKyAgICBzdWIgICByMSwgcjIsIHIxCisgICAgYW5kICAgcjEsIHIxLCAjNworICAgIG9yciAgIHI2LCByNiwgcjEKKyAgICBiICAgICBjYnIxX3NldF9yZXN1bHRfZHFoCisKK2NicjFfc2V0X3Jlc3VsdF9lbmQ6CisgICAgbGRyICAgcjAsID0weDFlNmUwMDg0ICAgICAgICAgICAgICAgICAgICAgICAgQCBzYXZlIERRSCBmaW5lIHR1bmUgcmVzdWx0CisgICAgc3RyICAgcjYsIFtyMF0KKyAgICBsZHIgICByMCwgPTB4MWU3MjAwOTgKKyAgICBzdHIgICByNiwgW3IwXQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgU2VhcmNoIHRoZSBETEwyIGRldGFpbCBtYXJnaW4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBsZHIgICByMCwgPTB4MWU3MjAwYTAKKyAgICBtb3YgICByMSwgIzAKKyAgICBzdHIgICByMSwgW3IwXQorCitDQlIzX1NUQVJUOgorLyogRGVidWcgLSBVQVJUIGNvbnNvbGUgbWVzc2FnZSAqLworICAgIGxkciByMCwgPTB4MWU3ODQwMDAKKyAgICBtb3YgcjEsICMweDMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICczJworICAgIHN0ciByMSwgW3IwXQorLyogRGVidWcgLSBVQVJUIGNvbnNvbGUgbWVzc2FnZSAqLworCisgICAgbW92ICAgcjYsICMweDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0IHBhc3MgY291bnQKKyAgICBtb3YgICByNywgIzB4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgRExMMiBwYXJhbWV0ZXIgaW5kZXgKKyAgICBsZHIgICByMSwgPTB4MDAwMDAwZmYKKyAgICBsZHIgICByMCwgPTB4MWU3MjAwMDggICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgRFFMIGRsbG1heCxkbGxtaW4KKyAgICBzdHIgICByMSwgW3IwXQorICAgIGxkciAgIHIwLCA9MHgxZTcyMDAwYyAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBEUUggZGxsbWF4LGRsbG1pbgorICAgIHN0ciAgIHIxLCBbcjBdCisKKyAgICBsZHIgICByMCwgPTB4MWU3MjAwYTAgICAgICAgICAgICAgICAgICAgICAgICBAIENCUjMgaXRlcmF0aW9uIGNvdW50ZXIKKyAgICBsZHIgICByMSwgW3IwXQorICAgIGFkZCAgIHIxLCByMSwgIzEKKyAgICBzdHIgICByMSwgW3IwXQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIERMTDIgZGVsYXkgbWFyZ2luIHRlc3QgbG9vcAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NicjNfbmV4dF9kbGwyX3BhcmFtZXRlcjoKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwNjggICAgICAgICAgICAgICAgICAgICAgICBAIGxvYWQgRExMMiBwYXJhbWV0ZXIKKyAgICBsZHIgICByMSwgW3IwXQorICAgIGJpYyAgIHIxLCByMSwgIzB4MDBGRjAwMDAKKyAgICBiaWMgICByMSwgcjEsICMweEZGMDAwMDAwCisgICAgb3JyICAgcjEsIHIxLCByNywgbHNsICMxNgorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbGRyICAgcjIsID0weDQwNDA0MDQwICAgICAgICAgICAgICAgICAgICAgICAgQCBwYXJhbWV0ZXIncyBtYXggaXMgdG8gMHg0MDQwNDA0MAorICAgIGNtcCAgIHI3LCByMgorICAgIGJnZSAgIENCUjNfRU5ECisgICAgbGRyICAgcjIsID0weDAxMDEwMTAxCisgICAgYWRkICAgcjcsIHI3LCByMgorCisgICAgbGRyICAgcjAsID0weDFlNmUwMDc0ICAgICAgICAgICAgICAgICAgICAgICAgQCBzZXQgdGhlIHRlc3RpbmcgRFJBTSBzaXplID0gNjRLQgorICAgIGxkciAgIHIxLCA9MHgwMDAwRkZGRgorICAgIHN0ciAgIHIxLCBbcjBdCisKKy8qIENCUlNjYW4oKSBzdGFydCAqLworICAgIG1vdiAgIHI5LCAjMHgwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCB0ZXN0IHN0YXR1cworICAgIGFkcmwgIHI1LCBQQVRURVJOX1RBQkxFICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBwYXR0ZXJuIHRhYmxlIGluZGV4CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFRlc3QgcGF0dGVybiBpdGVyYXRpb24gbG9vcAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NicjNfbmV4dF90ZXN0X3BhdHRlcm46CisgICAgbW92ICAgcjEwLCAjNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzZXQgdGhlIHJldHJ5IGxvb3Agb2YgZWFjaCBwYXR0ZXJuCisgICAgbGRyICAgcjEsIFtyNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIHRlc3QgcGF0dGVybgorICAgIGxkciAgIHIwLCA9MHgxZTZlMDA3YworICAgIHN0ciAgIHIxLCBbcjBdCisgICAgY21wICAgcjEsICMweDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB0aGUgbGFzdCBkYXRhIGluIHBhdHRlcm4gaXMgMHgwMAorICAgIGJuZSAgIGNicjNfdGVzdF9zaW5nbGUKKworY2JyM190ZXN0X3BhdHRlcm5fZW5kOgorICAgIGNtcCAgIHI5LCAjMHgwMAorICAgIGJuZSAgIGNicjNfdGVzdF9wYXNzX2RxbAorICAgIGNtcCAgIHI2LCAjMTAKKyAgICBiZ2UgICBDQlIzX0VORAorICAgIGIgICAgIGNicjNfbmV4dF9kbGwyX3BhcmFtZXRlciAgICAgICAgICAgICAgIEAgQ0JSU2NhbigpIGVuZCBhbmQgdGVzdCByZXN1bHQgZmFpbCwgZ28gdG8gbmV4dCBzdGVwCisKK2NicjNfdGVzdF9wYXNzX2RxbDoKKyAgICBhbmQgICByMywgcjcsICMweEZGCisgICAgc3ViICAgcjMsIHIzLCAjMHgwMSAgICAgICAgICAgICAgICAgICAgICAgICAgQCB3ZSBhZGQgb25lIGFmdGVyIGxvb3AgY2hlY2sgc28gd2UgbmVlZCB0byBkZWNyZWFzZSAxCisgICAgYWRkICAgcjYsIHI2LCAjMHgwMSAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbmNyZW1lbnQgcGFzcyBjb3VudAorICAgIHRzdCAgIHI5LCAjMHgwMQorICAgIGJlcSAgIGNicjNfdGVzdF9wYXNzX2RxaAorCisgICAgbGRyICAgcjAsID0weDFFNzIwMDA4CisgICAgcmVjb3JkX2RsbDJfcGFzc19yYW5nZQorCitjYnIzX3Rlc3RfcGFzc19kcWg6CisgICAgdHN0ICAgcjksICMweDAyCisgICAgYmVxICAgY2JyM19uZXh0X2RsbDJfcGFyYW1ldGVyCisgICAgbGRyICAgcjAsID0weDFFNzIwMDBjCisgICAgcmVjb3JkX2RsbDJfcGFzc19yYW5nZQorICAgIGIgICAgIGNicjNfbmV4dF9kbGwyX3BhcmFtZXRlcgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFRlc3QgZmFpbCByZXRyeSBsb29wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2JyM19wYXR0ZXJuX2ZhaWxfcmV0cnk6CisKKy8qIENCUlRlc3QoKSBzdGFydCAqLworY2JyM190ZXN0X3NpbmdsZToKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwNzAKKyAgICBsZHIgICByMSwgPTB4MDAwMDAwMDAKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGxkciAgIHIxLCA9MHgwMDAwMDAwNQorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbGRyICAgcjMsID0weDEwMDAKKyAgICBsZHIgICByOCwgPTB4MTAwMDAKK2NicjNfd2FpdF9lbmdpbmVfaWRsZV8wOgorICAgIHN1YnMgIHI4LCByOCwgIzEKKyAgICBiZXEgICBjYnIzX3Rlc3Rfc2luZ2xlX2VuZAorICAgIGxkciAgIHIyLCBbcjBdCisgICAgdHN0ICAgcjIsIHIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBEWzEyXSA9IGlkbGUgYml0CisgICAgYmVxICAgY2JyM193YWl0X2VuZ2luZV9pZGxlXzAKKworY2JyM190ZXN0X3NpbmdsZV9lbmQ6CisgICAgbGRyICAgcjAsID0weDFlNmUwMDc4ICAgICAgICAgICAgICAgICAgICAgICAgQCByZWFkIGZhaWwgYml0IHN0YXR1cworICAgIGxkciAgIHIxMSwgW3IwXQorICAgIG9yciAgIHIxMSwgcjExLCByMTEsIGxzciAjMTYKKyAgICBiaWMgICByMTEsIHIxMSwgIzB4RkYwMDAwMDAKKyAgICBiaWMgICByMTEsIHIxMSwgIzB4MDBGRjAwMDAKKworICAgIGxkciAgIHIxLCA9MHhGRgorICAgIHRzdCAgIHIxMSwgcjEKKyAgICBiZXEgICBjYnIzX3Rlc3RfYnVyc3QKKyAgICB0c3QgICByMTEsIHIxLCBsc2wgIzgKKyAgICBibmUgICBjYnIzX3Rlc3RfZmFpbAorCitjYnIzX3Rlc3RfYnVyc3Q6CisgICAgbW92ICAgcjEsICMweDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0aWFsaXplIGxvb3AgaW5kZXgsIHIxIGlzIGxvb3AncyBpbmRleAorY2JyM190ZXN0X2J1cnN0X2xvb3A6CisgICAgbGRyICAgcjAsID0weDFlNmUwMDcwCisgICAgbGRyICAgcjIsID0weDAwMDAwMDAwCisgICAgc3RyICAgcjIsIFtyMF0KKyAgICBtb3YgICByMiwgcjEsIGxzbCAjMworICAgIG9yciAgIHIyLCByMiwgIzB4NDEgICAgICAgICAgICAgICAgICAgICAgICAgIEAgdGVzdCBjb21tYW5kID0gMHg0MSB8IChkYXRhZ2VuIDw8IDMpCisgICAgc3RyICAgcjIsIFtyMF0KKyAgICBsZHIgICByMywgPTB4MTAwMAorICAgIGxkciAgIHI4LCA9MHgxMDAwMAorY2JyM193YWl0X2VuZ2luZV9pZGxlXzE6CisgICAgc3VicyAgcjgsIHI4LCAjMQorICAgIGJlcSAgIGNicjNfdGVzdF9idXJzdF9lbmQKKyAgICBsZHIgICByMiwgW3IwXQorICAgIHRzdCAgIHIyLCByMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgRFsxMl0gPSBpZGxlIGJpdAorICAgIGJlcSAgIGNicjNfd2FpdF9lbmdpbmVfaWRsZV8xCisKK2NicjNfdGVzdF9idXJzdF9lbmQ6CisgICAgbGRyICAgcjAsID0weDFlNmUwMDc4ICAgICAgICAgICAgICAgICAgICAgICAgQCByZWFkIGZhaWwgYml0IHN0YXR1cworICAgIGxkciAgIHIyLCBbcjBdCisgICAgb3JyICAgcjIsIHIyLCByMiwgbHNyICMxNgorICAgIGJpYyAgIHIyLCByMiwgIzB4RkYwMDAwMDAKKyAgICBiaWMgICByMiwgcjIsICMweDAwRkYwMDAwCisgICAgb3JyICAgcjExLCByMTEsIHIyCisKKyAgICBsZHIgICByMiwgPTB4RkYKKyAgICB0c3QgICByMTEsIHIyCisgICAgYmVxICAgY2JyM19uZXh0X3Rlc3RfYnVyc3RfbW9kZQorICAgIHRzdCAgIHIxMSwgcjIsIGxzbCAjOAorICAgIGJlcSAgIGNicjNfbmV4dF90ZXN0X2J1cnN0X21vZGUKKy8qIENCUlRlc3QoKSBlbmQgKi8KKworY2JyM190ZXN0X2ZhaWw6CisgICAgc3VicyAgcjEwLCByMTAsICMxCisgICAgYm5lICAgY2JyM19wYXR0ZXJuX2ZhaWxfcmV0cnkKKyAgICBtb3YgICByOSwgIzB4MDAKKyAgICBiICAgICBjYnIzX3Rlc3RfcGF0dGVybl9lbmQgICAgICAgICAgICAgICAgICBAIENCUlNjYW4oKSByZXR1cm4oMCkKKworY2JyM19uZXh0X3Rlc3RfYnVyc3RfbW9kZToKKyAgICBhZGQgICByMSwgcjEsICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluY3JlYXNlIHRoZSB0ZXN0IG1vZGUgaW5kZXgKKyAgICBjbXAgICByMSwgIzB4MDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHRoZXJlIGFyZSA4IG1vZGVzCisgICAgYm5lICAgY2JyM190ZXN0X2J1cnN0X2xvb3AKKworICAgIGxkciAgIHIxLCA9MHhGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcmVjb3JkIHRoZSBwYXNzIGJ5dGUKKyAgICB0c3QgICByMTEsIHIxCisgICAgYW5kbmUgcjksIHI5LCAjMHgwMiAgICAgICAgICAgICAgICAgICAgICAgICAgQCBEUUwgZmFpbAorICAgIHRzdCAgIHIxMSwgcjEsIGxzbCAjOAorICAgIGFuZG5lIHI5LCByOSwgIzB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgIEAgRFFIIGZhaWwKKyAgICBjbXAgICByOSwgIzB4MDAKKyAgICBiZXEgICBjYnIzX3Rlc3RfcGF0dGVybl9lbmQgICAgICAgICAgICAgICAgICBAIENCUlNjYW4oKSByZXR1cm4oMCkKKworICAgIGFkZCAgIHI1LCByNSwgIzB4MDQgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5jcmVhc2UgdGhlIHRlc3QgcGF0dGVybiBpbmRleAorICAgIGIgICAgIGNicjNfbmV4dF90ZXN0X3BhdHRlcm4KKworQ0JSM19FTkQ6CisgICAgbGRyICAgcjAsID0weDFlNzIwMDBjICAgICAgICAgICAgICAgICAgICAgICAgQCBjaGVjayBEUUggbWFyZ2luCisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBtb3YgICByMiwgcjEsIGxzciAjOAorICAgIGFuZCAgIHIyLCByMiwgIzB4RkYgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZ2V0IGRsbG1heAorICAgIGFuZCAgIHIxLCByMSwgIzB4RkYgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZ2V0IGRsbG1pbgorICAgIHN1YnMgIHI1LCByMiwgcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZGxsbWF4IC0gZGxsbWluCisgICAgYm1pICAgQ0JSM19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBubyB2YWxpZCBtYXJnaW4gZm91bmQsIHJldHJ5IGFnYWluCisgICAgY21wICAgcjUsICMxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAoZGxsbWF4IC0gZGxsbWluKSA8IDEwCisgICAgYmx0ICAgQ0JSM19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBubyBlbm91Z2ggbWFyZ2luIGZvdW5kLCByZXRyeSBhZ2FpbgorICAgIGFkZCAgIHIyLCByMSwgcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgKGRsbG1pblsxXSArIGRsbG1heFsxXSArIDEpID4+IDEKKyAgICBhZGQgICByMiwgcjIsICMweDAxCisgICAgbW92ICAgcjEsIHIyLCBsc3IgIzEKKyAgICBtb3YgICByMywgcjEsIGxzbCAjOAorICAgIGxkciAgIHIxLCBbcjBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc3RvcmUgdGhlIGRsbCBzZWFyY2ggcmVzdWx0CisgICAgYmljICAgcjEsIHIxLCAjMHhGRjAwMDAwMAorICAgIGJpYyAgIHIxLCByMSwgIzB4MDBGRjAwMDAKKyAgICBvcnIgICByMSwgcjEsIHIzLCBsc2wgIzgKKyAgICBzdHIgICByMSwgW3IwXQorCisgICAgbGRyICAgcjAsID0weDFlNzIwMDA4ICAgICAgICAgICAgICAgICAgICAgICAgQCBjaGVjayBEUUwgbWFyZ2luCisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBtb3YgICByMiwgcjEsIGxzciAjOAorICAgIGFuZCAgIHIyLCByMiwgIzB4RkYgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZ2V0IGRsbG1heAorICAgIGFuZCAgIHIxLCByMSwgIzB4RkYgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZ2V0IGRsbG1pbgorICAgIHN1YnMgIHI1LCByMiwgcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZGxsbWF4IC0gZGxsbWluCisgICAgYm1pICAgQ0JSM19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBubyB2YWxpZCBtYXJnaW4gZm91bmQsIHJldHJ5IGFnYWluCisgICAgY21wICAgcjUsICMxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAoZGxsbWF4IC0gZGxsbWluKSA8IDEwCisgICAgYmx0ICAgQ0JSM19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBubyBlbm91Z2ggbWFyZ2luIGZvdW5kLCByZXRyeSBhZ2FpbgorICAgIGFkZCAgIHIyLCByMSwgcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgKGRsbG1pblswXSArIGRsbG1heFswXSArIDEpID4+IDEKKyAgICBhZGQgICByMiwgcjIsICMweDAxCisgICAgbW92ICAgcjEsIHIyLCBsc3IgIzEKKyAgICBsZHIgICByMiwgW3IwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHN0b3JlIHRoZSBkbGwgc2VhcmNoIHJlc3VsdAorICAgIGJpYyAgIHIyLCByMiwgIzB4RkYwMDAwMDAKKyAgICBiaWMgICByMiwgcjIsICMweDAwRkYwMDAwCisgICAgb3JyICAgcjIsIHIyLCByMSwgbHNsICMxNgorICAgIHN0ciAgIHIyLCBbcjBdCisgICAgb3JyICAgcjMsIHIzLCByMQorCisgICAgbGRyICAgcjAsID0weDFlNmUwMDY4ICAgICAgICAgICAgICAgICAgICAgICAgQCBzYXZlIHRoZSByZXN1bHQgZGxsIHZhbHVlCisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBiaWMgICByMSwgcjEsICMweEZGMDAwMDAwCisgICAgYmljICAgcjEsIHIxLCAjMHgwMEZGMDAwMAorICAgIG9yciAgIHIxLCByMSwgcjMsIGxzbCAjMTYKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGIgICAgIENCUjRfU1RBUlQKKworLkxUT1JHCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBTZWFyY2ggdGhlIERRUyBpbnB1dCBtYXNrIG1hcmdpbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ0JSNF9TVEFSVDoKKy8qIERlYnVnIC0gVUFSVCBjb25zb2xlIG1lc3NhZ2UgKi8KKyAgICBsZHIgcjAsID0weDFlNzg0MDAwCisgICAgbW92IHIxLCAjMHgzNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnNCcKKyAgICBzdHIgcjEsIFtyMF0KKy8qIERlYnVnIC0gVUFSVCBjb25zb2xlIG1lc3NhZ2UgKi8KKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDA3NCAgICAgICAgICAgICAgICAgICAgICAgIEAgc2V0IHRoZSB0ZXN0aW5nIERSQU0gc2l6ZSA9IDRLQgorICAgIGxkciAgIHIxLCA9MHgwMDAwMEZGRgorICAgIHN0ciAgIHIxLCBbcjBdCisKKyAgICBtb3YgICByOCwgIzB4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgTUNSMThbNF0KKyAgICBsZHIgICByMSwgPTB4MDAwMDAwZmYKKyAgICBsZHIgICByMCwgPTB4MWU3MjAwYjAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgTUNSMThbNF09MCBtYXgsbWluCisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBsZHIgICByMCwgPTB4MWU3MjAwYjQgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgTUNSMThbNF09MSBtYXgsbWluCisgICAgc3RyICAgcjEsIFtyMF0KKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDAxOAorICAgIGxkciAgIHIxLCBbcjBdCisgICAgYmljICAgcjEsIHIxLCAjMHgwMDAwMDAxRgorICAgIHN0ciAgIHIxLCBbcjBdCisKKyAgICBiICAgICBjYnI0X3NjYW5fc3RhcnQKKworY2JyNF9uZXh0X21hc2tkbHk6CisgICAgYWRkICAgcjgsIHI4LCAjMHgwMQorICAgIGFuZCAgIHIyLCByOCwgIzB4MDEKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwMTgKKyAgICBsZHIgICByMSwgW3IwXQorICAgIGJpYyAgIHIxLCByMSwgIzB4MDAwMDAwMUYKKyAgICBvcnIgICByMSwgcjEsIHIyLCBsc2wgIzQKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGNtcCAgIHI4LCAjMHgwMgorICAgIGJnZSAgIENCUjRfRU5ECisKK2NicjRfc2Nhbl9zdGFydDoKKyAgICBtb3YgICByNiwgIzB4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgcGFzcyBjb3VudAorICAgIG1vdiAgIHI3LCAjMHgwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdCBtYXNrIGRlbGF5CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRFFTIE1hc2sgZGVsYXkgbWFyZ2luIHRlc3QgbG9vcAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NicjRfbmV4dF9wYXJhbWV0ZXI6CisgICAgY21wICAgcjcsICMweDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBtYXggZGVsYXkgPSAweEYKKyAgICBiZ2UgICBjYnI0X25leHRfbWFza2RseQorICAgIGxkciAgIHIwLCA9MHgxZTZlMDAxOCAgICAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCBNQ1IxOCBwYXJhbWV0ZXIKKyAgICBsZHIgICByMSwgW3IwXQorICAgIGJpYyAgIHIxLCByMSwgIzB4MDAwMDAwMEYKKyAgICBvcnIgICByMSwgcjEsIHI3CisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBhZGQgICByNywgcjcsICMweDAxCisKKy8qIENCUlNjYW4zKCkgc3RhcnQgKi8KKyAgICBhZHJsICByNSwgUEFUVEVSTl9UQUJMRSAgICAgICAgICAgICAgICAgICAgICBAIGluaXQgcGF0dGVybiB0YWJsZSBpbmRleAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBUZXN0IHBhdHRlcm4gaXRlcmF0aW9uIGxvb3AKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjYnI0X25leHRfdGVzdF9wYXR0ZXJuOgorICAgIG1vdiAgIHIxMCwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc2V0IHRoZSByZXRyeSBsb29wID0gMiBvZiBlYWNoIHBhdHRlcm4KKyAgICBsZHIgICByMSwgW3I1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGxvYWQgdGVzdCBwYXR0ZXJuCisgICAgbGRyICAgcjAsID0weDFlNmUwMDdjCisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBjbXAgICByMSwgIzB4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHRoZSBsYXN0IGRhdGEgaW4gcGF0dGVybiBpcyAweDAwCisgICAgYm5lICAgY2JyNF90ZXN0X2J1cnN0CisKKyAgICBhbmQgICByMywgcjcsICMweEZGCisgICAgc3ViICAgcjMsIHIzLCAjMHgwMSAgICAgICAgICAgICAgICAgICAgICAgICAgQCB3ZSBhZGQgMSBhZnRlciBsb29wIGNoZWNrIHNvIHdlIG5lZWQgdG8gZGVjcmVhc2UgMQorICAgIGFkZCAgIHI2LCByNiwgIzB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5jcmVtZW50IHBhc3MgY291bnQKKworICAgIGxkciAgIHIwLCA9MHgxZTcyMDBiMCAgICAgICAgICAgICAgICAgICAgICAgIEAgcmVjb3JkIHBhc3Mgd2luZG93CisgICAgYWRkICAgcjAsIHIwLCByOCwgbHNsICMyCisgICAgcmVjb3JkX2RsbDJfcGFzc19yYW5nZQorICAgIG1vdiAgIHIyLCAjMHgwMQorICAgIGFkZCAgIHIxLCByMSwgcjIsIGxzbCAjMTYKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGIgICAgIGNicjRfbmV4dF9wYXJhbWV0ZXIKKworY2JyNF90ZXN0X3BhdHRlcm5fZmFpbDoKKyAgICBjbXAgICByNiwgIzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHBhc3NjbnQgPj0gNQorICAgIGJnZSAgIGNicjRfbmV4dF9tYXNrZGx5CisgICAgYiAgICAgY2JyNF9uZXh0X3BhcmFtZXRlcgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFRlc3QgZmFpbCByZXRyeSBsb29wCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2JyNF9wYXR0ZXJuX2ZhaWxfcmV0cnk6CisKKy8qIENCUlRlc3QzKCkgc3RhcnQgKi8KK2NicjRfdGVzdF9idXJzdDoKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwNzAKKyAgICBsZHIgICByMSwgPTB4MDAwMDAwMDAKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGxkciAgIHIxLCA9MHgwMDAwMDBDMQorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbGRyICAgcjMsID0weDMwMDAKK2NicjRfd2FpdF9lbmdpbmVfaWRsZV8wOgorICAgIGxkciAgIHIyLCBbcjBdCisgICAgdHN0ICAgcjIsIHIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBEWzEyXSA9IGlkbGUgYml0CisgICAgYmVxICAgY2JyNF93YWl0X2VuZ2luZV9pZGxlXzAKKworICAgIGxkciAgIHIyLCBbcjBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcmVhZCBmYWlsIGJpdCBzdGF0dXMKKyAgICBtb3YgICByMSwgIzB4MAorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbW92ICAgcjIsIHIyLCBsc3IgIzEzICAgICAgICAgICAgICAgICAgICAgICAgQCBEWzEzXSA9IGZhaWwgYml0CisgICAgY21wICAgcjIsICMweDAwCisgICAgYm5lICAgY2JyNF90ZXN0X2ZhaWwKKworY2JyNF90ZXN0X3NpbmdsZToKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwNzAKKyAgICBsZHIgICByMSwgPTB4MDAwMDAwMDAKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGxkciAgIHIxLCA9MHgwMDAwMDA4NQorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbGRyICAgcjMsID0weDMwMDAKK2NicjRfd2FpdF9lbmdpbmVfaWRsZV8xOgorICAgIGxkciAgIHIyLCBbcjBdCisgICAgdHN0ICAgcjIsIHIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBEWzEyXSA9IGlkbGUgYml0CisgICAgYmVxICAgY2JyNF93YWl0X2VuZ2luZV9pZGxlXzEKKworICAgIGxkciAgIHIyLCBbcjBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcmVhZCBmYWlsIGJpdCBzdGF0dXMKKyAgICBtb3YgICByMSwgIzB4MAorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbW92ICAgcjIsIHIyLCBsc3IgIzEzICAgICAgICAgICAgICAgICAgICAgICAgQCBEWzEzXSA9IGZhaWwgYml0CisgICAgY21wICAgcjIsICMweDAwCisgICAgYmVxICAgY2JyNF90ZXN0X3Bhc3MKKworLyogQ0JSVGVzdDMoKSBlbmQgKi8KKworY2JyNF90ZXN0X2ZhaWw6CisgICAgc3VicyAgcjEwLCByMTAsICMxCisgICAgYm5lICAgY2JyNF9wYXR0ZXJuX2ZhaWxfcmV0cnkKKyAgICBiICAgICBjYnI0X3Rlc3RfcGF0dGVybl9mYWlsICAgICAgICAgICAgICAgICBAIENCUlNjYW4zKCkgcmV0dXJuKDApCisKK2NicjRfdGVzdF9wYXNzOgorICAgIGFkZCAgIHI1LCByNSwgIzB4MDQgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5jcmVhc2UgdGhlIHRlc3QgcGF0dGVybiBpbmRleAorICAgIGIgICAgIGNicjRfbmV4dF90ZXN0X3BhdHRlcm4KKworQ0JSNF9FTkQ6CisgICAgbGRyICAgcjAsID0weDFlNzIwMGIwICAgICAgICAgICAgICAgICAgICAgICAgQCBjaGVjayBtYXNrIG1hcmdpbgorICAgIGxkciAgIHIxLCBbcjBdCisgICAgYWRkICAgcjAsIHIwLCAjMHgwNAorICAgIGxkciAgIHIyLCBbcjBdCisgICAgYW5kcyAgcjYsIHIyLCAjMHhGRiAgICAgICAgICAgICAgICAgICAgICAgICAgQCBnZXQgbWluIG9mIE1DUjE4WzRdID0gMQorICAgIGJuZSAgIGNicjRfbm9zZXRfZGVsYXkKKyAgICBhbmRzICByNSwgcjEsICMweEZGICAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBtaW4gb2YgTUNSMThbNF0gPSAwCisgICAgYm5lICAgY2JyNF9zZXRfZGVsYXkKKyAgICBtb3YgICByMSwgcjEsIGxzciAjOCAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBtYXggb2YgTUNSMThbNF0gPSAwCisgICAgYW5kICAgcjEsIHIxLCAjMHhGRgorICAgIG1vdiAgIHIyLCByMiwgbHNyICM4ICAgICAgICAgICAgICAgICAgICAgICAgIEAgZ2V0IG1heCBvZiBNQ1IxOFs0XSA9IDEKKyAgICBhbmQgICByMiwgcjIsICMweEZGCisgICAgc3ViICAgcjEsIHIxLCByNQorICAgIHN1YiAgIHIyLCByMiwgcjYKKyAgICBjbXAgICByMSwgcjIKKyAgICBiZ2UgICBjYnI0X25vc2V0X2RlbGF5CisKK2NicjRfc2V0X2RlbGF5OgorICAgIGxkciAgIHIwLCA9MHgxZTZlMDAxOAorICAgIGxkciAgIHIxLCBbcjBdCisgICAgb3JyICAgcjEsIHIxLCAjMHgxMAorICAgIHN0ciAgIHIxLCBbcjBdCisKK2NicjRfbm9zZXRfZGVsYXk6CisgICAgbGRyICAgcjAsID0weDFlNmUwMDcwCisgICAgbGRyICAgcjEsID0weDAwMDAwMDAwCisgICAgc3RyICAgcjEsIFtyMF0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIENCUiBGaW5pc2gKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBDaGVjayBEUkFNIFNpemUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBsZHIgICByMCwgPTB4MWU2ZTIwNzAKKyAgICBsZHIgICByMSwgW3IwXQorICAgIGJpYyAgIHIxLCByMSwgIzB4RkVGRkZGRkYgICAgICAgICAgICAgICAgICAgIEAgYml0WzI0XT0xID0+IEREUjIKKyAgICBtb3YgICByMiwgcjEsIGxzciAjMjQKKyAgICBjbXAgICByMiwgIzB4MDEKKyAgICBiZXEgICBjaGVja19kZHIyX3NpemUKKworICAgIGxkciAgIHIwLCA9MHgxZTZlMDAwNAorICAgIGxkciAgIHI1LCBbcjBdCisgICAgYmljICAgcjUsIHI1LCAjMHgwMDAwMDAwMyAgICAgICAgICAgICAgICAgICAgQCByZWNvcmQgTUNSMDQKKyAgICBvcnIgICByMSwgcjUsICMweDMKKyAgICBzdHIgICByMSwgW3IwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNldCB0byA0R2JpdAorICAgIGxkciAgIHI2LCA9MHgwMDNGMjIxNworI2lmIGRlZmluZWQoQ09ORklHX0RSQU1fMzM2KQorICAgIGxkciAgIHI2LCA9MHgwMDM2MUMxMworI2VuZGlmCisgICAgYiAgICAgY2hlY2tfZHJhbV9zaXplCisKK2NoZWNrX2RkcjJfc2l6ZToKKyAgICBsZHIgICByMCwgPTB4MWU2ZTAwMDQKKyAgICBsZHIgICByNSwgW3IwXQorICAgIGJpYyAgIHI1LCByNSwgIzB4MDAwMDAwMjMgICAgICAgICAgICAgICAgICAgIEAgcmVjb3JkIE1DUjA0CisgICAgb3JyICAgcjEsIHI1LCAjMHgyMworICAgIHN0ciAgIHIxLCBbcjBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc2V0IHRvIDRHYml0CisgICAgbGRyICAgcjYsID0weDNGMkIxQjE2CisjaWYgZGVmaW5lZChDT05GSUdfRFJBTV8zMzYpCisgICAgbGRyICAgcjYsID0weDNCMjMxNjEyCisjZW5kaWYKKworICAgIGxkciAgIHIwLCA9MHg0MDAwMDAwMAorICAgIGxkciAgIHIxLCA9MHgxODE3MTkxQQorICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbGRyICAgcjAsID0weDQwMDAyMDAwCisgICAgbGRyICAgcjEsID0weDczNjE2NTMyCisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBsZHIgICByMCwgPTB4NDAwMDAwMDAKKyAgICBsZHIgICByMSwgPTB4MTgxNzE5MUEKKyAgICBsZHIgICByMiwgW3IwXQorICAgIGNtcCAgIHIxLCByMgorICAgIGJuZSAgIGNoZWNrX2RyYW1fc2l6ZV9lbmQgICAgICAgICAgICAgICAgICAgIEAgPT0gNTEyTWJpdAorICAgIG9yciAgIHI1LCByNSwgIzB4MjAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgPj0gMUdiaXQKKyAgICBtb3YgICByNiwgcjYsIGxzciAjOAorCitjaGVja19kcmFtX3NpemU6CisgICAgbGRyICAgcjAsID0weDUwMTAwMDAwCisgICAgbGRyICAgcjEsID0weDQxNDI0MzQ0CisgICAgc3RyICAgcjEsIFtyMF0KKyAgICBsZHIgICByMCwgPTB4NDgxMDAwMDAKKyAgICBsZHIgICByMSwgPTB4MjUyNjI3MjgKKyAgICBzdHIgICByMSwgW3IwXQorICAgIGxkciAgIHIwLCA9MHg0MDEwMDAwMAorICAgIGxkciAgIHIxLCA9MHgxOTFBMUIxQworICAgIHN0ciAgIHIxLCBbcjBdCisgICAgbGRyICAgcjAsID0weDUwMTAwMDAwCisgICAgbGRyICAgcjEsID0weDQxNDI0MzQ0CisgICAgbGRyICAgcjIsIFtyMF0KKyAgICBjbXAgICByMiwgcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAID09IDRHYml0CisgICAgb3JyZXEgcjUsIHI1LCAjMHgwMworICAgIG1vdmVxIHI2LCByNiwgbHNyICMxNgorICAgIGJlcSAgIGNoZWNrX2RyYW1fc2l6ZV9lbmQKKyAgICBsZHIgICByMCwgPTB4NDgxMDAwMDAKKyAgICBsZHIgICByMSwgPTB4MjUyNjI3MjgKKyAgICBsZHIgICByMiwgW3IwXQorICAgIGNtcCAgIHIyLCByMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgPT0gMkdiaXQKKyAgICBvcnJlcSByNSwgcjUsICMweDAyCisgICAgbW92ZXEgcjYsIHI2LCBsc3IgIzgKKyAgICBiZXEgICBjaGVja19kcmFtX3NpemVfZW5kCisgICAgb3JyICAgcjUsIHI1LCAjMHgwMSAgICAgICAgICAgICAgICAgICAgICAgICAgQCA9PSAxR2JpdAorCitjaGVja19kcmFtX3NpemVfZW5kOgorICAgIGxkciAgIHIwLCA9MHgxZTZlMDAwNAorICAgIHN0ciAgIHI1LCBbcjBdCisgICAgbGRyICAgcjAsID0weDFlNmUwMDE0CisgICAgbGRyICAgcjEsIFtyMF0KKyAgICBiaWMgICByMSwgcjEsICMweDAwMDAwMEZGCisgICAgYW5kICAgcjYsIHI2LCAjMHhGRgorICAgIG9yciAgIHIxLCByMSwgcjYKKyAgICBzdHIgICByMSwgW3IwXQorCisgICAgbGRyICAgcjAsID0weDFlNmUwMTIwICAgICAgICAgICAgICAgICAgICAgICAgQCBWR0EgQ29tcGF0aWJsZSBNb2RlCisgICAgbGRyICAgcjEsID0weDAwMDA1MEMwICAgICAgICAgICAgICAgICAgICAgICAgQCA0MDggTUh6CisjaWYgZGVmaW5lZChDT05GSUdfRFJBTV8zMzYpCisgICAgbGRyICAgcjEsID0weDAwMDA0REMwCisjZW5kaWYKKyAgICBzdHIgICByMSwgW3IwXQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgVmVyc2lvbiBOdW1iZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBsZHIgICByMCwgPTB4MWU3MjAwYTgKKyAgICBsZHIgICByMSwgPTB4MjAxNDEyMjkgICAgICAgICAgICAgICAgICAgICAgICBAIHJlbGVhc2VkIGRhdGUKKyAgICBzdHIgICByMSwgW3IwXQorCisgICAgYWRkICAgcjAsIHIwLCAjNAorICAgIGxkciAgIHIxLCA9MHgwMDAwMDA2MCAgICAgICAgICAgICAgICAgICAgICAgIEAgcmVsZWFzZWQgU0RLIHZlcnNpb24KKyAgICBzdHIgICByMSwgW3IwXQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQ2FsaWJyYXRpb24gQ29kZSBFbmQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3NldF9zY3JhdGNoOgorICAgIC8qU2V0IFNjcmF0Y2ggcmVnaXN0ZXIgQml0IDYgYWZ0ZXIgZGRyIGluaXRpYWwgZmluaXNoZWQgKi8KKyAgICBsZHIgcjAsID0weDFlNmUyMDQwCisgICAgbGRyIHIxLCBbcjBdCisgICAgb3JyIHIxLCByMSwgIzB4NDAKKyAgICBzdHIgcjEsIFtyMF0KKworLyogRGVidWcgLSBVQVJUIGNvbnNvbGUgbWVzc2FnZSAqLworICAgIGxkciByMCwgPTB4MWU3ODQwMDAKKyAgICBtb3YgcjEsICMweDQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICdEJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4NkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ28nCisgICAgc3RyIHIxLCBbcjBdCisgICAgbW92IHIxLCAjMHg2RSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAnbicKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsICMweDY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICdlJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4MEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ1xyJworICAgIHN0ciByMSwgW3IwXQorICAgIG1vdiByMSwgIzB4MEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJ1xuJworICAgIHN0ciByMSwgW3IwXQorLyogRGVidWcgLSBVQVJUIGNvbnNvbGUgbWVzc2FnZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgU29sdmUgUENJZSBBU1BNIGlzc3VlLCBvbmx5IGFwcGxpZWQgdG8gQVNUMjMwMCBzZXJpZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgbGRyIHIwLCA9MHgxZTZlMjA3YyAgICAgICAgICAgICAgICAgICAgICAgICAgQCBDaGVjayBib3VuZGluZyBmb3IgQVNUMTE1MCBleGlzdGVuY2UKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBtb3YgcjIsIHIxLCBsc3IgIzI0CisgICAgY21wIHIyLCAjMHgwMQorICAgIGJuZSBwbGF0Zm9ybV9leGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbm90IG1hdGNoIEFTVDIzMDAKKyAgICBiaWMgcjEsIHIxLCAjMHhGRkZGRkNGRgorICAgIG1vdiByMSwgcjEsIGxzciAjOAorICAgIGNtcCByMSwgIzB4MDIKKyAgICBiZXEgcGxhdGZvcm1fZXhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIG1hdGNoIEFTVDEwNTAKKworICAgIGxkciByMCwgPTB4MWU2ZTIwMDQgICAgICAgICAgICAgICAgICAgICAgICAgIEAgRGlzYWJsZSBJMkMgY29udHJvbGxlciByZXNldAorICAgIGxkciByMSwgW3IwXQorICAgIG9yciByMSwgcjEsICMweDA0CisgICAgc3RyIHIxLCBbcjBdCisgICAgYmljIHIxLCByMSwgIzB4MDQKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU3OGEwNTQgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQ2hlY2sgSTJDIGJ1cyBzdGF0ZSwgaWYgYnVzeSB0aGVuIHF1aXQKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBtb3YgcjEsIHIxLCBsc3IgIzE3CisgICAgYW5kIHIxLCByMSwgIzB4MDMKKyAgICBjbXAgcjEsICMweDAzCisgICAgYm5lIHBsYXRmb3JtX2V4aXQKKworICAgIGxkciByMCwgPTB4MWU3OGEwNDAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgSW5pdCBJMkMxIGNvbnRyb2xsZXIKKyAgICBtb3YgcjEsICMweDAxCisgICAgb3JyIHIxLCByMSwgcjEsIGxzbCAjMTYKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU3OGEwNDQKKyAgICBsZHIgcjEsID0weDc3Nzc2NzA0CisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBtb3YgcjEsICMweDAKKyAgICBsZHIgcjAsID0weDFlNzhhMDQ4CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4YTA0YworICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTc4YTA1MAorICAgIGxkciByMSwgPTB4RkZGRkZGRkYKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU3OGEyMDAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgU2V0IEFTVDExNTAgSTJDIHBhc3N3b3JkCisgICAgbGRyIHIxLCA9MHgwMEE4OEZBOAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTc4YTA1YworICAgIGxkciByMSwgPTB4MDAwMDAyMDAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgRW5hYmxlIGJ1ZmZlciBtb2RlIHRyYW5zZmVyaW5nIDMgYnl0ZXMKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU3OGEwNTQKKyAgICBsZHIgcjEsID0weDAwMDAwMDYzICAgICAgICAgICAgICAgICAgICAgICAgICBAIEZpcmUgY29tbW1hbmQKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU3OGEwNTAKK2kyY193YWl0X2NtZGRvbmVfMToKKyAgICBsZHIgcjEsIFtyMF0KKyAgICB0c3QgcjEsICMweDM4CisgICAgYmVxIGkyY193YWl0X2NtZGRvbmVfMQorICAgIHRzdCByMSwgIzB4MkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgdHJhbnNtaXQgZXJyb3IKKyAgICBibmUgcGxhdGZvcm1fZXhpdDIKKyAgICBsZHIgcjEsID0weEZGRkZGRkZGCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNzhhMjAwICAgICAgICAgICAgICAgICAgICAgICAgICBAIERpc2FibGUgQVNQTSBjYXBhYmlsaXR5CisgICAgbGRyIHIxLCA9MHgwNDAwNURBOAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTc4YTIwNAorICAgIGxkciByMSwgPTB4MDAwMDAwMjQKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU3OGEwNWMKKyAgICBsZHIgcjEsID0weDAwMDAwMjAwICAgICAgICAgICAgICAgICAgICAgICAgICBAIEVuYWJsZSBidWZmZXIgbW9kZSB0cmFuc2ZlcmluZyAzIGJ5dGVzCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNzhhMDU0CisgICAgbGRyIHIxLCA9MHgwMDAwMDA2MyAgICAgICAgICAgICAgICAgICAgICAgICAgQCBGaXJlIGNvbW1tYW5kCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNzhhMDUwCitpMmNfd2FpdF9jbWRkb25lXzI6CisgICAgbGRyIHIxLCBbcjBdCisgICAgdHN0IHIxLCAjMHgzOAorICAgIGJlcSBpMmNfd2FpdF9jbWRkb25lXzIKKyAgICB0c3QgcjEsICMweDJBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHRyYW5zbWl0IGVycm9yCisgICAgYm5lIHBsYXRmb3JtX2V4aXQyCisgICAgbGRyIHIxLCA9MHhGRkZGRkZGRgorICAgIHN0ciByMSwgW3IwXQorCitwbGF0Zm9ybV9leGl0MjoKKyAgICBsZHIgcjAsID0weDFlNzhhMDQwICAgICAgICAgICAgICAgICAgICAgICAgICBAIERpc2FibGUgSTJDMSBjb250cm9sbGVyCisgICAgbW92IHIxLCAjMHgwMAorICAgIHN0ciByMSwgW3IwXQorCisgICAgYiAgIHBsYXRmb3JtX2V4aXQKKy5MVE9SRworCitwbGF0Zm9ybV9leGl0OgorI2lmZGVmICAgICAgQ09ORklHX0RSQU1fRUNDCisgICAgbGRyIHIwLCA9MHgxZTZlMDAwNAorICAgIGxkciByMSwgW3IwXQorICAgIG9yciByMSwgcjEsICMweDgwCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDU0CisgICAgbGRyIHIxLCA9MHgwNTAwMDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRUNDIHByb3RlY3RlZCBtZW1vcnkgc2l6ZSwgZGVmYXVsdCBzZXQgYXQgODBNICAgKi8KKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwN0MKKyAgICBsZHIgcjEsID0weDAwMDAwMDAwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTZlMDA3NAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDA3MAorICAgIGxkciByMSwgPTB4MDAwMDAyMjEKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwNzAKKyAgICBsZHIgcjIsID0weDAwMDAxMDAwCitFQ0NfSW5pdF9GbGFnOgorICAgIGxkciByMSwgW3IwXQorICAgIHRzdCByMSwgcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgRFsxMl0gPSAxLCBEb25lCisgICAgYmVxIEVDQ19Jbml0X0ZsYWcKKworICAgIGxkciByMCwgPTB4MWU2ZTAwNzAKKyAgICBsZHIgcjEsID0weDAwMDAwMDAwCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUwMDUwCisgICAgbGRyIHIxLCA9MHg4MDAwMDAwMAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMDA1MAorICAgIGxkciByMSwgPTB4MDAwMDAwMDAKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTAwNzAKKyAgICBsZHIgcjEsID0weDAwMDAwNDAwCisgICAgc3RyIHIxLCBbcjBdCisjZW5kaWYKKyAgICBsZHIgcjAsID0weDFlNmUyMDA4ICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBWaWRlbyBFQ0xLIHBoYXNlCisgICAgbGRyIHIxLCBbcjBdCisgICAgbGRyIHIyLCA9MHhmZmZmZmZmMworICAgIGFuZCByMSwgcjEsIHIyCisgICAgb3JyIHIxLCByMSwgIzB4MDgKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2ZTIwMDQKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBsZHIgcjIsID0weEZGQkZGRkZGICAgICAgICAgICAgICAgICAgICAgICAgICBAIEVuYWJsZSBKVEFHIE1hc3Rlciwgc29sdmUgQVJNIHN0dWNrZWQgYnkgSlRBRyBpc3N1ZQorICAgIGFuZCByMSwgcjEsIHIyCisgICAgc3RyIHIxLCBbcjBdCisKKyAgICBsZHIgcjAsID0weDFlNmUyMDQ4ICAgICAgICAgICAgICAgICAgICAgICAgICBAIFNldCBNQUMgaW50ZXJmYWNlIGRlbGF5IHRpbWluZworICAgIGxkciByMSwgPTB4MjI1NQorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTZlMjA3MCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBTZXQgTUFDIEFIQiBidXMgY2xvY2sKKyAgICBsZHIgcjEsIFtyMF0KKyAgICBtb3YgcjIsICMweDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIERlZmF1bHQgUk1JSSwgc2V0IE1IQ0xLID0gSFBMTC8xMAorICAgIHRzdCByMSwgIzB4QzAKKyAgICBtb3ZuZSByMiwgIzB4MDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGlmIFJHTUlJLCAgICAgc2V0IE1IQ0xLID0gSFBMTC82CisgICAgbGRyIHIwLCA9MHgxZTZlMjAwOAorICAgIGxkciByMSwgW3IwXQorICAgIGJpYyByMSwgcjEsICMweDAwMDcwMDAwCisgICAgb3JyIHIxLCByMSwgcjIsIGxzbCAjMTYKKyAgICBzdHIgcjEsIFtyMF0KKworLyogVGVzdCAtIERSQU0gaW5pdGlhbCB0aW1lICovCisgICAgbGRyIHIwLCA9MHgxZTc4MjA0MAorICAgIGxkciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4RkZGRkZGRkYKKyAgICBzdWIgcjEsIHIwLCByMQorICAgIGxkciByMCwgPTB4MWU3MjAwOWMKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzIwMGE0CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MjAzMAorICAgIGxkciByMSwgW3IwXQorICAgIGJpYyByMSwgcjEsICMweDAwMDBGMDAwCisgICAgc3RyIHIxLCBbcjBdCisvKiBUZXN0IC0gRFJBTSBpbml0aWFsIHRpbWUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFJlc2V0IEdQSU8gcmVnaXN0ZXJzIHdoZW4gd2F0Y2hkb2cgcmVzZXQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgbGRyIHIwLCA9MHgxZTZlMjA3YyAgICAgICAgICAgICAgICAgICAgICAgICAgQCBDaGVjayBSZXZpc2lvbiBJRAorICAgIGxkciByMSwgW3IwXQorICAgIG1vdiByMSwgcjEsIGxzciAjMjQKKyAgICBjbXAgcjEsICMweDAyCisgICAgYm5lIHBsYXRmb3JtX2V4aXQzICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBub3QgbWF0Y2ggQVNUMjQwMAorCisgICAgbGRyIHIwLCA9MHgxZTZlMjAzYyAgICAgICAgICAgICAgICAgICAgICAgICAgQCBDaGVjayB3YXRjaGRvZyByZXNldCBldmVudAorICAgIGxkciByMSwgW3IwXQorICAgIGFuZCByMSwgcjEsICMweDA2CisgICAgY21wIHIxLCAjMHgwCisgICAgYmVxIHBsYXRmb3JtX2V4aXQzICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBubyB3YXRjaGRvZyByZXNldCBldmVudAorCisgICAgbGRyIHIwLCA9MHgxZTZlMjA5YyAgICAgICAgICAgICAgICAgICAgICAgICAgQCBDaGVjayB3YXRjaGRvZyBHUElPIHNlbGVjdGlvbgorICAgIGxkciByMSwgW3IwXQorICAgIG1vdiByMSwgcjEsIGxzciAjMjEKKyAgICB0c3QgcjEsICMweDAxCisgICAgYmVxIHBsYXRmb3JtX2V4aXQzICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBubyB3YXRjaGRvZyByZXNldCBzZWxlY3Rpb24KKworICAgIGxkciByMSwgPTB4MDAwMDAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY2xlYXIgR1BJTyByZWdpc3RlciByZXNldCBieSBQUlNUX04KKyAgICBsZHIgcjIsID0weEZGRkZGRkZGCisgICAgbGRyIHIwLCA9MHgxZTc4MDAwOAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwMGMKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMDEwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDAxNAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwMTgKKyAgICBzdHIgcjIsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMDI4CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDAyYworICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwMzAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMDM0CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDAzOAorICAgIHN0ciByMiwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwNDAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMDQ0CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDA0OAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwNGMKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMDUwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDA1NAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwNTgKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMDYwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDA2NAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwNjgKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMDZjCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDA5MAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwOTQKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMDk4CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDA5YworICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwYTAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMGE0CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDBhOAorICAgIHN0ciByMiwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwYjAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMGI0CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDBiOAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwZTAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMGU0CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDBlOAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwZWMKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMGYwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDBmNAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAwZjgKKyAgICBzdHIgcjIsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTAwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDEwNAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxMDgKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTEwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDExNAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxMTgKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTFjCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDEyMAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxMjQKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTI4CisgICAgc3RyIHIyLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDEzMAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxMzQKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTM4CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDE0MAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxNDQKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTQ4CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDE0YworICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxNTAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTU0CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDE1OAorICAgIHN0ciByMiwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxNjAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTY0CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDE2OAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxNzAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTc0CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDE3OAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxN2MKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTgwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDE4NAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxODgKKyAgICBzdHIgcjIsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMTkwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDE5NAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAxOTgKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMWQwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDFkNAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTc4MDIwNCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjbGVhciBTR1BJT00gcmVnaXN0ZXIgcmVzZXQgYnkgUFJTVF9OCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDIwOAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAyMGMKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMjEwCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDIxNAorICAgIHN0ciByMiwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAyMjAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMjI0CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDIyOAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAyMmMKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMjMwCisgICAgc3RyIHIyLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDIzYworICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAyNDAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMjQ0CisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDI0OAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAyNGMKKyAgICBzdHIgcjIsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMjU0CisgICAgbGRyIHIzLCA9MHgwMTAwMDA0MAorICAgIHN0ciByMywgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAyNTgKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMjVjCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDI2MAorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHIwLCA9MHgxZTc4MDMwMCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjbGVhciBTR1BJT1MgcmVnaXN0ZXIgcmVzZXQgYnkgUFJTVF9OCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDMwNAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAzMDgKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMzBjCisgICAgc3RyIHIxLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDMxMAorICAgIHN0ciByMSwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAzMTQKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNzgwMzE4CisgICAgc3RyIHIyLCBbcjBdCisgICAgbGRyIHIwLCA9MHgxZTc4MDMxYworICAgIHN0ciByMiwgW3IwXQorICAgIGxkciByMCwgPTB4MWU3ODAzMjAKKyAgICBzdHIgcjIsIFtyMF0KKworcGxhdGZvcm1fZXhpdDM6CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBTUEkgVGltaW5nIENhbGlicmF0aW9uLCBub3QgYXBwbGljYWJsZSB0byBBU1QyMzAwIHNlcmllcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBsZHIgcjAsID0weDFlNmUyMDdjICAgICAgICAgICAgICAgICAgICAgICAgICBAIENoZWNrIFJldmlzaW9uIElECisgICAgbGRyIHIxLCBbcjBdCisgICAgbW92IHIxLCByMSwgbHNyICMyNAorICAgIGNtcCByMSwgIzB4MDIKKyAgICBibHQgcGxhdGZvcm1fZXhpdDQgICAgICAgICAgICAgICAgICAgICAgICAgICBAIG5vdCBtYXRjaCBBU1QyNDAwIG9yIGxhdGVyCisKKyAgICBsZHIgcjAsID0weDFlNmUyMDcwICAgICAgICAgICAgICAgICAgICAgICAgICBAIENoZWNrIFNQSSBmbGFzaAorICAgIGxkciByMSwgW3IwXQorICAgIGFuZCByMSwgcjEsICMweDAzCisgICAgY21wIHIxLCAjMHgwMgorICAgIGJuZSBwbGF0Zm9ybV9leGl0NAorCisgICAgbW92IHIyLCAjMHgwCisgICAgbW92IHI2LCAjMHgwCisgICAgbW92IHI3LCAjMHgwCisgICAgaW5pdF9zcGlfY2hlY2tzdW0KK3NwaV9jaGVja3N1bV93YWl0XzA6CisgICAgbGRyIHIxLCBbcjBdCisgICAgdHN0IHIxLCByMgorICAgIGJlcSBzcGlfY2hlY2tzdW1fd2FpdF8wCisgICAgbGRyIHIwLCA9MHgxZTYyMDA5MAorICAgIGxkciByNSwgW3IwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcmVjb3JkIGdvbGRlbiBjaGVja3N1bQorICAgIGxkciByMCwgPTB4MWU2MjAwODAKKyAgICBtb3YgcjEsICMweDAKKyAgICBzdHIgcjEsIFtyMF0KKworICAgIGxkciByMCwgPTB4MWU2MjAwMTAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc2V0IHRvIGZhc3QgcmVhZCBtb2RlCisgICAgbGRyIHIxLCA9MHgwMDBCMDA0MQorICAgIHN0ciByMSwgW3IwXQorCisgICAgbGRyIHI2LCA9MHgwMEY3RTZEMCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBJbml0IHNwaWNsayBsb29wCisgICAgbW92IHI4LCAjMHgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBJbml0IGRlbGF5IHJlY29yZAorCitzcGlfY2JyX25leHRfY2xrcmF0ZToKKyAgICBtb3YgcjYsIHI2LCBsc3IgIzB4NAorICAgIGNtcCByNiwgIzB4MAorICAgIGJlcSBzcGlfY2JyX2VuZAorCisgICAgbW92IHI3LCAjMHgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBJbml0IGRlbGF5IGxvb3AKKyAgICBtb3YgcjgsIHI4LCBsc2wgIzQKKworc3BpX2Nicl9uZXh0X2RlbGF5X3M6CisgICAgbW92IHIyLCAjMHg4CisgICAgaW5pdF9zcGlfY2hlY2tzdW0KK3NwaV9jaGVja3N1bV93YWl0XzE6CisgICAgbGRyIHIxLCBbcjBdCisgICAgdHN0IHIxLCByMgorICAgIGJlcSBzcGlfY2hlY2tzdW1fd2FpdF8xCisgICAgbGRyIHIwLCA9MHgxZTYyMDA5MAorICAgIGxkciByMiwgW3IwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcmVhZCBjaGVja3N1bQorICAgIGxkciByMCwgPTB4MWU2MjAwODAKKyAgICBtb3YgcjEsICMweDAKKyAgICBzdHIgcjEsIFtyMF0KKyAgICBjbXAgcjIsIHI1CisgICAgYm5lIHNwaV9jYnJfbmV4dF9kZWxheV9lCisKKyAgICBtb3YgcjIsICMweDAKKyAgICBpbml0X3NwaV9jaGVja3N1bQorc3BpX2NoZWNrc3VtX3dhaXRfMjoKKyAgICBsZHIgcjEsIFtyMF0KKyAgICB0c3QgcjEsIHIyCisgICAgYmVxIHNwaV9jaGVja3N1bV93YWl0XzIKKyAgICBsZHIgcjAsID0weDFlNjIwMDkwCisgICAgbGRyIHIyLCBbcjBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCByZWFkIGNoZWNrc3VtCisgICAgbGRyIHIwLCA9MHgxZTYyMDA4MAorICAgIG1vdiByMSwgIzB4MAorICAgIHN0ciByMSwgW3IwXQorICAgIGNtcCByMiwgcjUKKyAgICBibmUgc3BpX2Nicl9uZXh0X2RlbGF5X2UKKworICAgIG9yciByOCwgcjgsIHI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcmVjb3JkIHBhc3NlZCBkZWxheQorICAgIGIgICBzcGlfY2JyX25leHRfY2xrcmF0ZQorCitzcGlfY2JyX25leHRfZGVsYXlfZToKKyAgICBhZGQgcjcsIHI3LCAjMHgxCisgICAgY21wIHI3LCAjMHg2CisgICAgYmx0IHNwaV9jYnJfbmV4dF9kZWxheV9zCisgICAgYiAgIHNwaV9jYnJfbmV4dF9jbGtyYXRlCisKK3NwaV9jYnJfZW5kOgorICAgIGxkciByMCwgPTB4MWU2MjAwOTQKKyAgICBzdHIgcjgsIFtyMF0KKyAgICBsZHIgcjAsID0weDFlNjIwMDEwCisgICAgbW92IHIxLCAjMHgwCisgICAgc3RyIHIxLCBbcjBdCisKK3BsYXRmb3JtX2V4aXQ0OgorCisgICAgLyogcmVzdG9yZSBsciAqLworICAgIG1vdiBsciwgcjQKKworICAgIC8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKyAgICBtb3YgcGMsIGxyCmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjQwMC9yYzQuYyBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL3JjNC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMyZTBmZmEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC9yYzQuYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KK3N0cnVjdCByYzRfc3RhdGUKK3sKKyAgICBpbnQgeCwgeSwgbVsyNTZdOworfTsKKwordm9pZCByYzRfc2V0dXAoIHN0cnVjdCByYzRfc3RhdGUgKnMsIHVuc2lnbmVkIGNoYXIgKmtleSwgIGludCBsZW5ndGggKQoreworICAgIGludCBpLCBqLCBrLCAqbSwgYTsKKworICAgIHMtPnggPSAwOworICAgIHMtPnkgPSAwOworICAgIG0gPSBzLT5tOworCisgICAgZm9yKCBpID0gMDsgaSA8IDI1NjsgaSsrICkKKyAgICB7CisgICAgICAgIG1baV0gPSBpOworICAgIH0KKworICAgIGogPSBrID0gMDsKKworICAgIGZvciggaSA9IDA7IGkgPCAyNTY7IGkrKyApCisgICAgeworICAgICAgICBhID0gbVtpXTsKKyAgICAgICAgaiA9ICh1bnNpZ25lZCBjaGFyKSAoIGogKyBhICsga2V5W2tdICk7CisgICAgICAgIG1baV0gPSBtW2pdOyBtW2pdID0gYTsKKyAgICAgICAgaWYoICsrayA+PSBsZW5ndGggKSBrID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgcmM0X2NyeXB0KCBzdHJ1Y3QgcmM0X3N0YXRlICpzLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuZ3RoICkKK3sgCisgICAgaW50IGksIHgsIHksICptLCBhLCBiOworCisgICAgeCA9IHMtPng7CisgICAgeSA9IHMtPnk7CisgICAgbSA9IHMtPm07CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKysgKQorICAgIHsKKyAgICAgICAgeCA9ICh1bnNpZ25lZCBjaGFyKSAoIHggKyAxICk7IGEgPSBtW3hdOworICAgICAgICB5ID0gKHVuc2lnbmVkIGNoYXIpICggeSArIGEgKTsKKyAgICAgICAgbVt4XSA9IGIgPSBtW3ldOworICAgICAgICBtW3ldID0gYTsKKyAgICAgICAgZGF0YVtpXSBePSBtWyh1bnNpZ25lZCBjaGFyKSAoIGEgKyBiICldOworICAgIH0KKworICAgIHMtPnggPSB4OworICAgIHMtPnkgPSB5OworfQorCit2b2lkIHJjNF9jcnlwdF9zdyh1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgdWxNc2dMZW5ndGgsIHVuc2lnbmVkIGNoYXIgKnJjNF9rZXksIHVuc2lnbmVkIGxvbmcgdWxLZXlMZW5ndGggKQoreworICAgIHN0cnVjdCByYzRfc3RhdGUgczsKKyAgICAKKyAgICByYzRfc2V0dXAoICZzLCByYzRfa2V5LCB1bEtleUxlbmd0aCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgcmM0X2NyeXB0KCAmcywgZGF0YSwgdWxNc2dMZW5ndGggKTsgICAgCit9CmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjQwMC9yZWd0ZXN0LmMgYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC9yZWd0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWNkNzVhZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL3JlZ3Rlc3QuYwpAQCAtMCwwICsxLDkxIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBEaWFnbm9zdGljcyBzdXBwb3J0CisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8cG9zdC5oPgorI2luY2x1ZGUgInNsdC5oIgorCisjaWYgKChDRkdfQ01EX1NMVCAmIENGR19DTURfUkVHVEVTVCkgJiYgZGVmaW5lZChDT05GSUdfU0xUKSkKKyNpbmNsdWRlICJyZWd0ZXN0LmgiCisKK2ludCBkb19yZWd0ZXN0ICh2b2lkKQoreworCV9TT0NSZWdUZXN0SW5mbwkqcGpTT0NSZWdJbmZvOworCV9TT0NSZWdUZXN0VGJsICpwalJlZ1RhYmxlOworCXVuc2lnbmVkIGxvbmcgdWxSZWdCYXNlOworICAgICAgICB1bnNpZ25lZCBsb25nIHVsSW5kZXgsIHVsQmFjaywgdWxBTkQsIHVsTWFzaywgdWxEYXRhLCB1bFRlbXA7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgRmxhZ3MgPSAwOworCQorCS8qIHVubG9jayByZWcgKi8KKyAgICAgICAgKih1bnNpZ25lZCBsb25nICopICgweDFlNjAwMDAwKSA9IDB4YWVlZDFhMDM7CS8qIEFIQkMgKi8KKyAgICAgICAgKih1bnNpZ25lZCBsb25nICopICgweDFlNmUwMDAwKSA9IDB4ZmM2MDAzMDk7CS8qIE1NQyAqLworICAgICAgICAqKHVuc2lnbmVkIGxvbmcgKikgKDB4MWU2ZTIwMDApID0gMHgxNjg4YThhODsJLyogU0NVICovCisKKyAgICAgICAgLyogU0NVICovCisKKyAgICAgICAgLyogZG8gdGVzdCAqLwkKKyAgICAgICAgcGpTT0NSZWdJbmZvID0gU09DUmVnVGVzdEluZm87CisgICAgICAgIHdoaWxlIChzdHJjbXAocGpTT0NSZWdJbmZvLT5qTmFtZSwgIkVORCIpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBSZWcuIFRlc3QgU3RhcnQgKi8KKyAgICAgICAgICAgIHVsUmVnQmFzZSA9IHBqU09DUmVnSW5mby0+dWxSZWdPZmZzZXQ7CisgICAgICAgICAgICBwalJlZ1RhYmxlID0gcGpTT0NSZWdJbmZvLT5walRibEluZGV4OworICAgICAgICAgICAgCisgICAgICAgICAgICB3aGlsZSAocGpSZWdUYWJsZS0+dWxJbmRleCAhPSAweEZGRkZGRkZGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVsSW5kZXggPSB1bFJlZ0Jhc2UgKyBwalJlZ1RhYmxlLT51bEluZGV4OwkKKworICAgICAgICAgICAgICAgIHVsQmFjayA9ICoodW5zaWduZWQgbG9uZyAqKSAodWxJbmRleCk7CisKKyAgICAgICAgICAgICAgICB1bE1hc2sgID0gcGpSZWdUYWJsZS0+dWxNYXNrOworICAgICAgICAgICAgICAgIHVsQU5EICA9IH5walJlZ1RhYmxlLT51bE1hc2s7CisgICAgICAgCSAgICAgICAgCSAgICAJCisgICAgICAgICAgICAgICAgdWxEYXRhICA9IDB4RkZGRkZGRkYgJiBwalJlZ1RhYmxlLT51bE1hc2s7CisgICAgICAgICAgICAgICAgKih1bnNpZ25lZCBsb25nICopICh1bEluZGV4KSA9IHVsRGF0YTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdWxUZW1wID0gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopICh1bEluZGV4KSAmIHBqUmVnVGFibGUtPnVsTWFzazsKKyAgICAgICAgICAgICAgICBpZiAodWxEYXRhICE9IHVsVGVtcCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZsYWdzIHw9IHBqU09DUmVnSW5mby0+dWxGbGFnczsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJbREJHXSBSZWdUZXN0OiBGYWlsZWQgSW5kZXg6JXgsIERhdGE6JXgsIFRlbXA6JXggXG4iLCB1bEluZGV4LCB1bERhdGEsIHVsVGVtcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHVsRGF0YSAgPSAweDAwMDAwMDAwICYgcGpSZWdUYWJsZS0+dWxNYXNrOworICAgICAgICAgICAgICAgICoodW5zaWduZWQgbG9uZyAqKSAodWxJbmRleCkgPSB1bERhdGE7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHVsVGVtcCA9ICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAodWxJbmRleCkgJiBwalJlZ1RhYmxlLT51bE1hc2s7CisgICAgICAgICAgICAgICAgaWYgKHVsRGF0YSAhPSB1bFRlbXApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGbGFncyB8PSBwalNPQ1JlZ0luZm8tPnVsRmxhZ3M7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiW0RCR10gUmVnVGVzdDogRmFpbGVkIEluZGV4OiV4LCBEYXRhOiV4LCBUZW1wOiV4IFxuIiwgdWxJbmRleCwgdWxEYXRhLCB1bFRlbXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgKih1bnNpZ25lZCBsb25nICopICh1bEluZGV4KSA9IHVsQmFjazsKKyAgICAgICAKKyAgICAgICAgICAgICAgICBwalJlZ1RhYmxlKys7CisgICAgICAgICAgCQorICAgICAgICAgICB9IC8qIEluZGl2aWR1YWwgUmVnLiBUZXN0ICovCisKKyAgICAgICAgICAgaWYgKEZsYWdzICYgcGpTT0NSZWdJbmZvLT51bEZsYWdzKQorICAgICAgICAgICAgICAgcHJpbnRmKCJbSU5GT10gUmVnVGVzdDogJXMgRmFpbGVkIFxuIiwgcGpTT0NSZWdJbmZvLT5qTmFtZSk7CisgICAgICAgICAgIAorICAgICAgICAgICBwalNPQ1JlZ0luZm8rKzsKKyAgICAgICAgICAgCisgICAgICAgIH0gLyogUmVnLiBUZXN0ICovCisKKwlyZXR1cm4gRmxhZ3M7CisJCit9CisKKyNlbmRpZiAvKiBDT05GSUdfU0xUICovCmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjQwMC9yZWd0ZXN0LmggYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC9yZWd0ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDlhMzYwZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL3JlZ3Rlc3QuaApAQCAtMCwwICsxLDI1NSBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgbG9uZyB1bEluZGV4OworICAgIHVuc2lnbmVkIGxvbmcgdWxNYXNrOworfSBfU09DUmVnVGVzdFRibDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGNoYXIgak5hbWVbMTBdOworICAgIHVuc2lnbmVkIGxvbmcgdWxSZWdPZmZzZXQ7CisgICAgX1NPQ1JlZ1Rlc3RUYmwgKnBqVGJsSW5kZXg7CisgICAgdW5zaWduZWQgbG9uZyB1bEZsYWdzOworfSBfU09DUmVnVGVzdEluZm87CisKK19TT0NSZWdUZXN0VGJsIFNNQ1JlZ1Rlc3RUYmxbXSA9IHsKKyAgICB7MHgwMDAwMDAwMCwgMHgwMDAwMUZGM30sCisgICAgezB4MDAwMDAwMDQsIDB4RkZGRkZGRkZ9LAorICAgIHsweDAwMDAwMDA4LCAweDBGRkYxN0ZGfSwKKyAgICB7MHgwMDAwMDAwQywgMHhGRkZGRkZGRn0sCisgICAgezB4MDAwMDAwMTAsIDB4RkY1RkZGRjN9LAorICAgIHsweDAwMDAwMDE4LCAweDBGRkZGRkZGfSwKKyAgICB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sICAgICAgICAJCit9OworCitfU09DUmVnVGVzdFRibCBBSEJDUmVnVGVzdFRibFtdID0geworICAgIHsweDAwMDAwMDgwLCAweDAwMDBGRkZFfSwgICAgICAgIAkKKyAgICB7MHgwMDAwMDA4OCwgMHgwMTAwMDAwMH0sCisgICAgezB4MDAwMDAwOGMsIDB4MDAwMDAwMzF9LAkKKyAgICB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sICAgICAgICAJCit9OworCitfU09DUmVnVGVzdFRibCBNSUNSZWdUZXN0VGJsW10gPSB7CisvKgkKKyAgICB7MHgwMDAwMDAwMCwgMHgwRkZGRkZGOH0sCisgICAgezB4MDAwMDAwMDQsIDB4MEZGRkZGRjh9LAorICAgIHsweDAwMDAwMDA4LCAweDAwMDBGRkZGfSwKKyAgICB7MHgwMDAwMDAwQywgMHgwRkZGRjAwMH0sCisgICAgezB4MDAwMDAwMTAsIDB4RkZGRkZGRkZ9LAorKi8KKyAgICB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sCit9OworCitfU09DUmVnVGVzdFRibCBNQUMxUmVnVGVzdFRibFtdID0geworICAgIHsweEZGRkZGRkZGLCAweEZGRkZGRkZGfSwgICAgICAgIAkKK307CisKK19TT0NSZWdUZXN0VGJsIE1BQzJSZWdUZXN0VGJsW10gPSB7CisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgVVNCMlJlZ1Rlc3RUYmxbXSA9IHsKKyAgICB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sICAgICAgICAJCit9OworCitfU09DUmVnVGVzdFRibCBWSUNSZWdUZXN0VGJsW10gPSB7CisgICAgezB4MDAwMDAwMEMsIDB4RkZGRkZGRkZ9LAorICAgIHsweDAwMDAwMDI0LCAweEZGRkZGRkZGfSwKKyAgICB7MHgwMDAwMDAyOCwgMHhGRkZGRkZGRn0sCisgICAgezB4MDAwMDAwMkMsIDB4RkZGRkZGRkZ9LAorICAgIHsweEZGRkZGRkZGLCAweEZGRkZGRkZGfSwKK307CisKK19TT0NSZWdUZXN0VGJsIE1NQ1JlZ1Rlc3RUYmxbXSA9IHsKKyAgICB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sICAgICAgICAJCit9OworCitfU09DUmVnVGVzdFRibCBVU0IxMVJlZ1Rlc3RUYmxbXSA9IHsKKyAgICB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sICAgICAgICAJCit9OworCitfU09DUmVnVGVzdFRibCBTQ1VSZWdUZXN0VGJsW10gPSB7CisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgSEFTRVJlZ1Rlc3RUYmxbXSA9IHsKKyAgICB7MHgwMDAwMDAwMCwgMHgwRkZGRkZGOH0sCisgICAgezB4MDAwMDAwMDQsIDB4MEZGRkZGRjh9LAorICAgIHsweDAwMDAwMDA4LCAweDBGRkZGRkY4fSwKKyAgICB7MHgwMDAwMDAwQywgMHgwRkZGRkZGOH0sCisgICAgLy97MHgwMDAwMDAxMCwgMHgwMDAwMUZGRn0sCisgICAgezB4MDAwMDAwMjAsIDB4MEZGRkZGRjh9LAorICAgIHsweDAwMDAwMDI0LCAweDBGRkZGRkY4fSwKKyAgICB7MHgwMDAwMDAyOCwgMHgwRkZGRkZjMH0sCisgICAgezB4MDAwMDAwMkMsIDB4MEZGRkZGRkZ9LAorICAgIC8vezB4MDAwMDAwMzAsIDB4MDAwMDAzRkZ9LAorICAgIHsweEZGRkZGRkZGLCAweEZGRkZGRkZGfSwKK307CisKK19TT0NSZWdUZXN0VGJsIEkyU1JlZ1Rlc3RUYmxbXSA9IHsKKyAgICB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sICAgICAgICAJCit9OworCitfU09DUmVnVGVzdFRibCBDUlRSZWdUZXN0VGJsW10gPSB7CisvKgkKKyAgICB7MHgwMDAwMDAwMCwgMHgwMDFGMzcwM30sCisgICAgezB4MDAwMDAwMDQsIDB4MDAwMEZGQzF9LAorKi8gICAgCisgICAgezB4MDAwMDAwMTAsIDB4MEZGRjBGRkZ9LAorICAgIHsweDAwMDAwMDE0LCAweDBGRkYwRkZGfSwKKyAgICB7MHgwMDAwMDAxOCwgMHgwN0ZGMDdGRn0sCisgICAgezB4MDAwMDAwMUMsIDB4MDdGRjA3RkZ9LAorICAgIHsweDAwMDAwMDIwLCAweDBGRkZGRkY4fSwKKyAgICB7MHgwMDAwMDAyNCwgMHgwN0ZGM0ZGOH0sCisvKiAgICAKKyAgICB7MHgwMDAwMDAyOCwgMHgwMDNGMDAzRn0sCisgICAgezB4MDAwMDAwMzAsIDB4MDAzRjAwM0Z9LAorICAgIHsweDAwMDAwMDM0LCAweDBGRkYwRkZGfSwKKyAgICB7MHgwMDAwMDAzOCwgMHgwRkZGRkZGOH0sCisqLyAgICAKKyAgICB7MHgwMDAwMDA0MCwgMHgwRkZGMEZGRn0sCisgICAgezB4MDAwMDAwNDQsIDB4MDdGRjA3RkZ9LAorICAgIHsweDAwMDAwMDQ4LCAweDBGRkZGRkY4fSwKKyAgICB7MHgwMDAwMDA0QywgMHgwMEZGMDdGOH0sCisgICAgezB4MDAwMDAwNTAsIDB4MDAwRjBGMEZ9LAorLyogICAgCisgICAgezB4MDAwMDAwNjAsIDB4MDAxRjM3MDN9LAorICAgIHsweDAwMDAwMDY0LCAweDAwMDBGRkMxfSwKKyovICAgIAorICAgIHsweDAwMDAwMDcwLCAweDBGRkYwRkZGfSwKKyAgICB7MHgwMDAwMDA3NCwgMHgwRkZGMEZGRn0sCisgICAgezB4MDAwMDAwNzgsIDB4MDdGRjA3RkZ9LAorICAgIHsweDAwMDAwMDdDLCAweDA3RkYwN0ZGfSwKKyAgICB7MHgwMDAwMDA4MCwgMHgwRkZGRkZGOH0sCisgICAgezB4MDAwMDAwODQsIDB4MDdGRjNGRjh9LAorLyogICAgCisgICAgezB4MDAwMDAwODgsIDB4MDAzRjAwM0Z9LAorICAgIHsweDAwMDAwMDkwLCAweDAwM0YwMDNGfSwKKyAgICB7MHgwMDAwMDA5NCwgMHgwRkZGMEZGRn0sCisgICAgezB4MDAwMDAwOTgsIDB4MEZGRkZGRjh9LAorKi8gICAgCisgICAgezB4MDAwMDAwQTAsIDB4MEZGRjBGRkZ9LAorICAgIHsweDAwMDAwMEE0LCAweDA3RkYwN0ZGfSwKKyAgICB7MHgwMDAwMDBBOCwgMHgwRkZGRkZGOH0sCisgICAgezB4MDAwMDAwQUMsIDB4MDBGRjA3Rjh9LAorICAgIHsweDAwMDAwMEIwLCAweDAwMEYwRjBGfSwKKyAgICB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sCit9OworCitfU09DUmVnVGVzdFRibCBWSURFT1JlZ1Rlc3RUYmxbXSA9IHsKKyAgICB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sICAgICAgICAJCit9OworCitfU09DUmVnVGVzdFRibCBBMlBSZWdUZXN0VGJsW10gPSB7CisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgTURNQVJlZ1Rlc3RUYmxbXSA9IHsKKyAgICB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sICAgICAgICAJCit9OworCitfU09DUmVnVGVzdFRibCBNMkRSZWdUZXN0VGJsW10gPSB7CisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgR1BJT1JlZ1Rlc3RUYmxbXSA9IHsKKyAgICB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sICAgICAgICAJCit9OworCitfU09DUmVnVGVzdFRibCBSVENSZWdUZXN0VGJsW10gPSB7CisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgVElNRVJSZWdUZXN0VGJsW10gPSB7CisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgVUFSVDFSZWdUZXN0VGJsW10gPSB7CisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgVUFSVDJSZWdUZXN0VGJsW10gPSB7CisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgV0RUUmVnVGVzdFRibFtdID0geworICAgIHsweEZGRkZGRkZGLCAweEZGRkZGRkZGfSwgICAgICAgIAkKK307CisKK19TT0NSZWdUZXN0VGJsIFBXTVJlZ1Rlc3RUYmxbXSA9IHsKKyAgICB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sICAgICAgICAJCit9OworCitfU09DUmVnVGVzdFRibCBWVUFSVDFSZWdUZXN0VGJsW10gPSB7CisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgVlVBUlQyUmVnVGVzdFRibFtdID0geworICAgIHsweEZGRkZGRkZGLCAweEZGRkZGRkZGfSwgICAgICAgIAkKK307CisKK19TT0NSZWdUZXN0VGJsIExQQ1JlZ1Rlc3RUYmxbXSA9IHsKKyAgICB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sICAgICAgICAJCit9OworCitfU09DUmVnVGVzdFRibCBJMkNSZWdUZXN0VGJsW10gPSB7CisgICAgezB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LCAgICAgICAgCQorfTsKKworX1NPQ1JlZ1Rlc3RUYmwgUEVDSVJlZ1Rlc3RUYmxbXSA9IHsKKyAgICB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sICAgICAgICAJCit9OworCitfU09DUmVnVGVzdFRibCBQQ0lBUmVnVGVzdFRibFtdID0geworICAgIHsweEZGRkZGRkZGLCAweEZGRkZGRkZGfSwgICAgICAgIAkKK307CisKK19TT0NSZWdUZXN0VGJsIFBDSVJlZ1Rlc3RUYmxbXSA9IHsKKyAgICB7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sICAgICAgICAJCit9OworCisKKy8qIFRlc3QgTGlzdCAqLworX1NPQ1JlZ1Rlc3RJbmZvIFNPQ1JlZ1Rlc3RJbmZvW10gPSB7CisgICAgLyogVGVzdCBOYW1lLCBSZWcuIE9mZnNldCwgICAgICBUZXN0IFRhYmxlLCBFcnJvciBDb2RlICAqLworICAgIHsgICAiU01DUkVHIiwgMHgxNjAwMDAwMCwgICAgU01DUmVnVGVzdFRibCwgMHgwMDAwMDAwMX0sCisgICAgeyAgIkFIQkNSRUciLCAweDFlNjAwMDAwLCAgIEFIQkNSZWdUZXN0VGJsLCAweDAwMDAwMDAyfSwKKyAgICB7ICAgIk1JQ1JFRyIsIDB4MWU2NDAwMDAsICAgIE1JQ1JlZ1Rlc3RUYmwsIDB4MDAwMDAwMDR9LAorICAgIHsgICJNQUMxUkVHIiwgMHgxZTY2MDAwMCwgICBNQUMxUmVnVGVzdFRibCwgMHgwMDAwMDAwOH0sCisgICAgeyAgIk1BQzJSRUciLCAweDFlNjgwMDAwLCAgIE1BQzJSZWdUZXN0VGJsLCAweDAwMDAwMDEwfSwKKyAgICB7ICAiVVNCMlJFRyIsIDB4MWU2YTAwMDAsICAgVVNCMlJlZ1Rlc3RUYmwsIDB4MDAwMDAwMjB9LAorICAgIHsgICAiVklDUkVHIiwgMHgxZTZjMDAwMCwgICAgVklDUmVnVGVzdFRibCwgMHgwMDAwMDA0MH0sCisgICAgeyAgICJNTUNSRUciLCAweDFlNmUwMDAwLCAgICBNTUNSZWdUZXN0VGJsLCAweDAwMDAwMDgwfSwKKyAgICB7ICJVU0IxMVJFRyIsIDB4MWU2ZTEwMDAsICBVU0IxMVJlZ1Rlc3RUYmwsIDB4MDAwMDAxMDB9LAorICAgIHsgICAiU0NVUkVHIiwgMHgxZTZlMjAwMCwgICAgU0NVUmVnVGVzdFRibCwgMHgwMDAwMDIwMH0sCisgICAgeyAgIkhBU0VSRUciLCAweDFlNmUzMDAwLCAgIEhBU0VSZWdUZXN0VGJsLCAweDAwMDAwNDAwfSwKKyAgICB7ICAgIkkyU1JFRyIsIDB4MWU2ZTUwMDAsICAgIEkyU1JlZ1Rlc3RUYmwsIDB4MDAwMDA4MDB9LAorICAgIHsgICAiQ1JUUkVHIiwgMHgxZTZlNjAwMCwgICAgQ1JUUmVnVGVzdFRibCwgMHgwMDAwMTAwMH0sCisgICAgeyAiVklERU9SRUciLCAweDFlNzAwMDAwLCAgVklERU9SZWdUZXN0VGJsLCAweDAwMDAyMDAwfSwKKyAgICB7ICAgIkEyUFJFRyIsIDB4MWU3MjAwMDAsICAgIEEyUFJlZ1Rlc3RUYmwsIDB4MDAwMDQwMDB9LAorICAgIHsgICJNRE1BUkVHIiwgMHgxZTc0MDAwMCwgICBNRE1BUmVnVGVzdFRibCwgMHgwMDAwODAwMH0sCisgICAgeyAgICAiMkRSRUciLCAweDFlNzYwMDAwLCAgICBNMkRSZWdUZXN0VGJsLCAweDAwMDEwMDAwfSwKKyAgICB7ICAiR1BJT1JFRyIsIDB4MWU3ODAwMDAsICAgR1BJT1JlZ1Rlc3RUYmwsIDB4MDAwMjAwMDB9LAorICAgIHsgICAiUlRDUkVHIiwgMHgxZTc4MTAwMCwgICAgUlRDUmVnVGVzdFRibCwgMHgwMDA0MDAwMH0sCisgICAgeyAiVElNRVJSRUciLCAweDFlNzgyMDAwLCAgVElNRVJSZWdUZXN0VGJsLCAweDAwMDgwMDAwfSwKKyAgICB7ICJVQVJUMVJFRyIsIDB4MWU3ODMwMDAsICBVQVJUMVJlZ1Rlc3RUYmwsIDB4MDAxMDAwMDB9LAorICAgIHsgIlVBUlQyUkVHIiwgMHgxZTc4NDAwMCwgIFVBUlQyUmVnVGVzdFRibCwgMHgwMDIwMDAwMH0sCisgICAgeyAgICJXRFRSRUciLCAweDFlNzg1MDAwLCAgICBXRFRSZWdUZXN0VGJsLCAweDAwNDAwMDAwfSwKKyAgICB7ICAgIlBXTVJFRyIsIDB4MWU3ODYwMDAsICAgIFBXTVJlZ1Rlc3RUYmwsIDB4MDA4MDAwMDB9LAorICAgIHsiVlVBUlQxUkVHIiwgMHgxZTc4NzAwMCwgVlVBUlQxUmVnVGVzdFRibCwgMHgwMTAwMDAwMH0sCisgICAgeyJWVUFSVDJSRUciLCAweDFlNzg4MDAwLCBWVUFSVDJSZWdUZXN0VGJsLCAweDAyMDAwMDAwfSwKKyAgICB7ICAgIkxQQ1JFRyIsIDB4MWU3ODkwMDAsICAgIExQQ1JlZ1Rlc3RUYmwsIDB4MDQwMDAwMDB9LAorICAgIHsgICAiSTJDUkVHIiwgMHgxZTc4QTAwMCwgICAgSTJDUmVnVGVzdFRibCwgMHgwODAwMDAwMH0sCisgICAgeyAgIlBFQ0lSRUciLCAweDFlNzhCMDAwLCAgIFBFQ0lSZWdUZXN0VGJsLCAweDEwMDAwMDAwfSwKKyAgICB7ICAiUENJQVJFRyIsIDB4MWU3OEMwMDAsICAgUENJQVJlZ1Rlc3RUYmwsIDB4MjAwMDAwMDB9LAorICAgIHsgICAiUENJUkVHIiwgMHg2MDAwMDAwMCwgICAgUENJUmVnVGVzdFRibCwgMHg0MDAwMDAwMH0sICAgICAgICAKKyAgICB7ICAgICAgIkVORCIsIDB4ZmZmZmZmZmYsICAgICAgICAgICAgIE5VTEwsIDB4ZmZmZmZmZmZ9Cit9OwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDI0MDAvc2x0LmMgYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC9zbHQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMjgzZDM0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDI0MDAvc2x0LmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIERpYWdub3N0aWNzIHN1cHBvcnQKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxwb3N0Lmg+CisjaW5jbHVkZSAic2x0LmgiCisKKyNpZiBkZWZpbmVkIChDT05GSUdfU0xUKQorCitpbnQgZG9fc2x0IChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgaW50IGZsYWdzID0gMDsKKyAgICBpbnQgbG9vcCAgPSAxOworCQorICAgIGlmIChhcmdjID4gMSkgeworICAgICAgICBsb29wID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTApOworICAgIH0KKwkKKyAgICBkbyB7CisKK2RvX3NsdF9zdGFydDoKKwkvKiBSZWcuIFRlc3QgKi8KKyNpZiAoQ0ZHX0NNRF9TTFQgJiBDRkdfQ01EX1JFR1RFU1QpCisJaWYgKGRvX3JlZ3Rlc3QoKSkKKwl7CisJICAgIGZsYWdzIHw9IEZMQUdfUkVHVEVTVF9GQUlMOwkKKyAgICAgICAgICAgIHByaW50ZigiW0lORk9dIFJlZ1Rlc3QgRmFpbGVkIFxuIik7CisJfSAgICAKKwllbHNlCisgICAgICAgICAgICBwcmludGYoIltJTkZPXSBSZWdUZXN0IFBhc3NlZCBcbiIpOworI2VuZGlmCisjaWYgKENGR19DTURfU0xUICYgQ0ZHX0NNRF9NQUNURVNUKQorCWlmIChkb19tYWN0ZXN0KCkpCisJeworCSAgICBmbGFncyB8PSBGTEFHX01BQ1RFU1RfRkFJTDsJCisgICAgICAgICAgICBwcmludGYoIltJTkZPXSBNQUNUZXN0IEZhaWxlZCBcbiIpOworCX0gICAgCisJZWxzZQorICAgICAgICAgICAgcHJpbnRmKCJbSU5GT10gTUFDVGVzdCBQYXNzZWQgXG4iKTsKKyNlbmRpZgorI2lmIChDRkdfQ01EX1NMVCAmIENGR19DTURfVklERU9URVNUKQorCWlmIChkb192aWRlb3Rlc3QoKSkKKwl7CisJICAgIGZsYWdzIHw9IEZMQUdfVklERU9URVNUX0ZBSUw7CQorICAgICAgICAgICAgcHJpbnRmKCJbSU5GT10gVmlkZW9UZXN0IEZhaWxlZCBcbiIpOworCX0gICAgCisJZWxzZQorICAgICAgICAgICAgcHJpbnRmKCJbSU5GT10gVmlkZW9UZXN0IFBhc3NlZCBcbiIpOworI2VuZGlmCisjaWYgKENGR19DTURfU0xUICYgQ0ZHX0NNRF9IQUNURVNUKQorCWlmIChkb19oYWN0ZXN0KCkpCisJeworCSAgICBmbGFncyB8PSBGTEFHX0hBQ1RFU1RfRkFJTDsJCisgICAgICAgICAgICBwcmludGYoIltJTkZPXSBIQUNUZXN0IEZhaWxlZCBcbiIpOworCX0gICAgCisJZWxzZQorICAgICAgICAgICAgcHJpbnRmKCJbSU5GT10gSEFDVGVzdCBQYXNzZWQgXG4iKTsKKyNlbmRpZgorI2lmIChDRkdfQ01EX1NMVCAmIENGR19DTURfTUlDVEVTVCkKKwlpZiAoZG9fbWljdGVzdCgpKQorCXsKKwkgICAgZmxhZ3MgfD0gRkxBR19NSUNURVNUX0ZBSUw7CQorICAgICAgICAgICAgcHJpbnRmKCJbSU5GT10gTUlDVGVzdCBGYWlsZWQgXG4iKTsKKwl9ICAgIAorCWVsc2UKKyAgICAgICAgICAgIHByaW50ZigiW0lORk9dIE1JQ1Rlc3QgUGFzc2VkIFxuIik7CisjZW5kaWYKKwkKKwkvKiBTdW1tYXJ5ICovCisJaWYgKGZsYWdzKQorICAgICAgICAgICAgcHJpbnRmICgiW0lORk9dIFNMVCBUZXN0IEZhaWxlZCEhIFxuIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZiAoIltJTkZPXSBTTFQgVGVzdCBQYXNzZWQhISBcbiIpOyAgICAKKyAgICAgICAKKyAgICAgICAgaWYgKGxvb3AgPT0gMCkJCQkvKiBpbmZpbml0ZSAqLworICAgICAgICAgICAgZ290byBkb19zbHRfc3RhcnQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxvb3AtLTsgICAgCisgICAgICAgICAgICAKKyAgICB9IHdoaWxlIChsb29wKTsKKworICAgIHJldHVybiAwOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworVV9CT09UX0NNRCgKKwlzbHQsCUNPTkZJR19TWVNfTUFYQVJHUywJMCwJZG9fc2x0LAorCSJzbHQgLSBzbHQgdGVzdCBwcm9ncmFtIFxuIiwKKwlOVUxMCispOworCisjZW5kaWYgLyogQ09ORklHX1NMVCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDI0MDAvc2x0LmggYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC9zbHQuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZTY1MGJjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDI0MDAvc2x0LmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjZGVmaW5lIENGR19DTURfUkVHVEVTVAkJMHgwMDAwMDAwMQorI2RlZmluZSBDRkdfQ01EX01BQ1RFU1QJCTB4MDAwMDAwMDIKKyNkZWZpbmUgQ0ZHX0NNRF9WSURFT1RFU1QJMHgwMDAwMDAwNAorI2RlZmluZSBDRkdfQ01EX0hBQ1RFU1QJCTB4MDAwMDAwMDgKKyNkZWZpbmUgQ0ZHX0NNRF9NSUNURVNUCQkweDAwMDAwMDEwCisjZGVmaW5lIENGR19DTURfT1NEVEVTVAkJMHgwMDAwMDAyMAorI2RlZmluZSBDRkdfQ01EXzJEVEVTVCAgCTB4MDAwMDAwNDAKKyNkZWZpbmUgQ0ZHX0NNRF9IV0NURVNUICAJMHgwMDAwMDA4MAorCisjZGVmaW5lIEZMQUdfUkVHVEVTVF9GQUlMICAJMHgwMDAwMDAwMQorI2RlZmluZSBGTEFHX01BQ1RFU1RfRkFJTCAgCTB4MDAwMDAwMDIKKyNkZWZpbmUgRkxBR19WSURFT1RFU1RfRkFJTCAgCTB4MDAwMDAwMDQKKyNkZWZpbmUgRkxBR19IQUNURVNUX0ZBSUwgIAkweDAwMDAwMDA4CisjZGVmaW5lIEZMQUdfTUlDVEVTVF9GQUlMICAJMHgwMDAwMDAxMAorI2RlZmluZSBGTEFHX09TRFRFU1RfRkFJTCAgCTB4MDAwMDAwMjAKKyNkZWZpbmUgRkxBR18yRFRFU1RfRkFJTCAgCTB4MDAwMDAwNDAKKyNkZWZpbmUgRkxBR19IV0NURVNUX0ZBSUwgIAkweDAwMDAwMDgwCisKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDI0MDAvdHlwZS5oIGIvYm9hcmQvYXNwZWVkL2FzdDI0MDAvdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY1N2VlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC90eXBlLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2lmbmRlZiBfVFlQRV9IXworI2RlZmluZSBfVFlQRV9IXworCisJdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgQk9PTDsKKwl0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICBVSU5UODsKKwl0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgICBVSU5UMTY7CisJdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgVUlOVDMyOworCisJI2RlZmluZSAgRkxPTkcgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcKKwkjZGVmaW5lICBCWVRFICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhcgorCSNkZWZpbmUgIElOVCAgICAgICAgICAgICAgICAgICAgICBpbnQKKwkjZGVmaW5lICBWT0lEICAgICAgICAgICAgICAgICAgICAgdm9pZAorCSNkZWZpbmUgIEJPT0xFQU4gICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydAorCSNkZWZpbmUgIFVMT05HICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nCisJI2RlZmluZSAgVVNIT1JUICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0CisJI2RlZmluZSAgVUNIQVIgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIKKwkjZGVmaW5lICBDSEFSICAgICAgICAgICAgICAgICAgICAgY2hhcgorCSNkZWZpbmUgIExPTkcgICAgICAgICAgICAgICAgICAgICBsb25nCisJI2RlZmluZSAgUFVDSEFSICAgICAgICAgICAgICAgICAgIFVDSEFSICoKKwkjZGVmaW5lICBQVUxPTkcgICAgICAgICAgICAgICAgICAgVUxPTkcgKgorCisJI2RlZmluZSAgRkFJTCAgICAgICAgICAgICAgICAgICAgIDEKKworCSNkZWZpbmUgIGludGZ1bmMgICAgICBpbnQzODYKKworCSNkZWZpbmUgIG91dGR3cG9ydCAgICAgICAgIG91dHBkCisJI2RlZmluZSAgaW5kd3BvcnQgICAgICAgICAgaW5wZAorCSNkZWZpbmUgIG91dHBvcnQgICAgICAgICAgIG91dHAKKwkjZGVmaW5lICBpbnBvcnQgICAgICAgICAgICBpbnAKKworCS8vI2RlZmluZSAgICAgTlVMTCAgICAoKHZvaWQgKikwKQorCSNkZWZpbmUgICAgIEZBTFNFICAgMAorCSNkZWZpbmUgICAgIFRSVUUgICAgMQorCisJI2RlZmluZSBSZWFkTWVtb3J5QllURShiYXNlYWRkcmVzcyxvZmZzZXQpICAgICAgICAqKEJZVEUgKikoKFVMT05HKShiYXNlYWRkcmVzcykrKFVMT05HKShvZmZzZXQpKQorCSNkZWZpbmUgUmVhZE1lbW9yeUxvbmcoYmFzZWFkZHJlc3Msb2Zmc2V0KSAgICAgICAgKihVTE9ORyAqKSgoVUxPTkcpKGJhc2VhZGRyZXNzKSsoVUxPTkcpKG9mZnNldCkpCisJI2RlZmluZSBSZWFkTWVtb3J5U2hvcnQoYmFzZWFkZHJlc3Msb2Zmc2V0KSAgICAgICAqKFVTSE9SVCAqKSgoVUxPTkcpKGJhc2VhZGRyZXNzKSsoVUxPTkcpKG9mZnNldCkpCisJI2RlZmluZSBXcml0ZU1lbW9yeUJZVEUoYmFzZWFkZHJlc3Msb2Zmc2V0LGRhdGEpICAqKEJZVEUgKikoKFVMT05HKShiYXNlYWRkcmVzcykrKFVMT05HKShvZmZzZXQpKSA9IChCWVRFKShkYXRhKQorCSNkZWZpbmUgV3JpdGVNZW1vcnlMb25nKGJhc2VhZGRyZXNzLG9mZnNldCxkYXRhKSAgKihVTE9ORyAqKSgoVUxPTkcpKGJhc2VhZGRyZXNzKSsoVUxPTkcpKG9mZnNldCkpPShVTE9ORykoZGF0YSkKKwkjZGVmaW5lIFdyaXRlTWVtb3J5U2hvcnQoYmFzZWFkZHJlc3Msb2Zmc2V0LGRhdGEpICooVVNIT1JUICopKChVTE9ORykoYmFzZWFkZHJlc3MpKyhVTE9ORykob2Zmc2V0KSk9KFVTSE9SVCkoZGF0YSkKKwkjZGVmaW5lIFdyaXRlTWVtb3J5TG9uZ1dpdGhBTkREYXRhKGJhc2VhZGRyZXNzLCBvZmZzZXQsIGFuZGRhdGEsIGRhdGEpICAqKFVMT05HICopKChVTE9ORykoYmFzZWFkZHJlc3MpKyhVTE9ORykob2Zmc2V0KSkgPSAqKFVMT05HICopKChVTE9ORykoYmFzZWFkZHJlc3MpKyhVTE9ORykob2Zmc2V0KSkgJiAoVUxPTkcpKGFuZGRhdGEpIHwgKFVMT05HKShkYXRhKQorCisJI2RlZmluZSBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTSyhiYXNlYWRkcmVzcywgb2Zmc2V0LCBkYXRhLCBtYXNrKSBcCisJKih2b2xhdGlsZSBVTE9ORyAqKSgoVUxPTkcpKGJhc2VhZGRyZXNzKSsoVUxPTkcpKG9mZnNldCkpID0gKih2b2xhdGlsZSBVTE9ORyAqKSgoKFVMT05HKShiYXNlYWRkcmVzcykrKFVMT05HKShvZmZzZXQpKSAmIChVTE9ORykofihtYXNrKSkpIHwgKChVTE9ORykoZGF0YSkgJiAoVUxPTkcpKG1hc2spKQorCisJI2RlZmluZSBSZWFkTWVtb3J5TG9uZ0hvc3QoYmFzZWFkZHJlc3Msb2Zmc2V0KSAgICAgICAgKih2b2xhdGlsZSBVTE9ORyAqKSgoVUxPTkcpKGJhc2VhZGRyZXNzKSsoVUxPTkcpKG9mZnNldCkpCisJI2RlZmluZSBXcml0ZU1lbW9yeUxvbmdIb3N0KGJhc2VhZGRyZXNzLG9mZnNldCxkYXRhKSAgKih2b2xhdGlsZSBVTE9ORyAqKSgoVUxPTkcpKGJhc2VhZGRyZXNzKSsoVUxPTkcpKG9mZnNldCkpPShVTE9ORykoZGF0YSkKKwkjZGVmaW5lIFdyaXRlTWVtb3J5QllURUhvc3QoYmFzZWFkZHJlc3Msb2Zmc2V0LGRhdGEpICAqKHZvbGF0aWxlIEJZVEUgKikoKFVMT05HKShiYXNlYWRkcmVzcykrKFVMT05HKShvZmZzZXQpKSA9IChCWVRFKShkYXRhKSAgICAKKyNkZWZpbmUgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KGJhc2VhZGRyZXNzLCBvZmZzZXQsIGRhdGEsIG1hc2spICAqKHZvbGF0aWxlIFVMT05HICopKChVTE9ORykoYmFzZWFkZHJlc3MpKyhVTE9ORykob2Zmc2V0KSkgPSAoKCgqKHZvbGF0aWxlIFVMT05HICopKChVTE9ORykoYmFzZWFkZHJlc3MpKyhVTE9ORykob2Zmc2V0KSkpJih+bWFzaykpIHwgKFVMT05HKSgoZGF0YSkmKG1hc2spKSkKKyAgICAKKwkjZGVmaW5lIFJlYWRNZW1vcnlMb25nQ2xpZW50KGJhc2VhZGRyZXNzLG9mZnNldCkgICAgICAgICoodm9sYXRpbGUgVUxPTkcgKikoKFVMT05HKShiYXNlYWRkcmVzcykrKFVMT05HKShvZmZzZXQpKQorCSNkZWZpbmUgV3JpdGVNZW1vcnlMb25nQ2xpZW50KGJhc2VhZGRyZXNzLG9mZnNldCxkYXRhKSAgKih2b2xhdGlsZSBVTE9ORyAqKSgoVUxPTkcpKGJhc2VhZGRyZXNzKSsoVUxPTkcpKG9mZnNldCkpPShVTE9ORykoZGF0YSkKKwkjZGVmaW5lIFdyaXRlTWVtb3J5QllURUNsaWVudChiYXNlYWRkcmVzcyxvZmZzZXQsZGF0YSkgICoodm9sYXRpbGUgQllURSAqKSgoVUxPTkcpKGJhc2VhZGRyZXNzKSsoVUxPTkcpKG9mZnNldCkpID0gKEJZVEUpKGRhdGEpICAgIAorI2RlZmluZSBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0NsaWVudChiYXNlYWRkcmVzcywgb2Zmc2V0LCBkYXRhLCBtYXNrKSAgKih2b2xhdGlsZSBVTE9ORyAqKSgoVUxPTkcpKGJhc2VhZGRyZXNzKSsoVUxPTkcpKG9mZnNldCkpID0gKCgoKih2b2xhdGlsZSBVTE9ORyAqKSgoVUxPTkcpKGJhc2VhZGRyZXNzKSsoVUxPTkcpKG9mZnNldCkpKSYofm1hc2spKSB8IChVTE9ORykoKGRhdGEpJihtYXNrKSkpCisKKyNpZmRlZiBCVUZfR0xPQkFMUworI2RlZmluZSBCVUZfRVhUCisjZWxzZQorI2RlZmluZSBCVUZfRVhUIGV4dGVybgorI2VuZGlmCisKK0JVRl9FWFQgVUxPTkcgICAgZ19DQVBUVVJFX1ZJREVPMV9CVUYxX0FERFI7IC8qIFZJREVPMV9CVUZfMV9BRERSKi8gCitCVUZfRVhUIFVMT05HICAgIGdfQ0FQVFVSRV9WSURFTzFfQlVGMl9BRERSOyAvKiBWSURFTzFfQlVGXzJfQUREUiovCitCVUZfRVhUIFVMT05HICAgIGdfVklERU8xX0NPTVBSRVNTX0JVRl9BRERSOyAvKiBFbmNvZGUgZGVzdGluYXRpb24gYWRkcmVzcyAqLworQlVGX0VYVCBVTE9ORyAgICBnX1ZJREVPMV9DUkNfQlVGX0FERFI7CitCVUZfRVhUIFVMT05HICAgIGdfVklERU8xX0ZMQUdfQlVGX0FERFI7CitCVUZfRVhUIFVMT05HICAgIGdfVklERU8xX1JDNF9CVUZfQUREUjsKKworCitCVUZfRVhUIFVMT05HICAgIGdfQ0FQVFVSRV9WSURFTzJfQlVGMV9BRERSOyAKK0JVRl9FWFQgVUxPTkcgICAgZ19DQVBUVVJFX1ZJREVPMl9CVUYyX0FERFI7IAorQlVGX0VYVCBVTE9ORyAgICBnX1ZJREVPMl9DT01QUkVTU19CVUZfQUREUjsKK0JVRl9FWFQgVUxPTkcgICAgZ19WSURFTzJfQ1JDX0JVRl9BRERSOworQlVGX0VYVCBVTE9ORyAgICBnX1ZJREVPMl9GTEFHX0JVRl9BRERSOworQlVGX0VYVCBVTE9ORyAgICBnX1ZJREVPMl9SQzRfQlVGX0FERFI7CisKK0JVRl9FWFQgVUxPTkcgICAgZ19WSURFTzFfREVDT0RFX0JVRl8xX0FERFI7CitCVUZfRVhUIFVMT05HICAgIGdfVklERU8xX0RFQ09ERV9CVUZfMl9BRERSOworQlVGX0VYVCBVTE9ORyAgICBnX1ZJREVPMV9ERUNPTVBSRVNTX0JVRl9BRERSOworQlVGX0VYVCBVTE9ORyAgICBnX1ZJREVPMV9ERUNPREVfUkM0X0JVRl9BRERSOworCitCVUZfRVhUIFVMT05HICAgIGdfVklERU8yX0RFQ09ERV9CVUZfMV9BRERSOworQlVGX0VYVCBVTE9ORyAgICBnX1ZJREVPMl9ERUNPREVfQlVGXzJfQUREUjsKK0JVRl9FWFQgVUxPTkcgICAgZ19WSURFTzJfREVDT01QUkVTU19CVUZfQUREUjsKK0JVRl9FWFQgVUxPTkcgICAgZ19WSURFTzJfREVDT0RFX1JDNF9CVUZfQUREUjsKKworQlVGX0VYVCBVTE9ORyAgICBnX0NBUFRVUkVfVklERU9NX0JVRjFfQUREUjsgCitCVUZfRVhUIFVMT05HICAgIGdfQ0FQVFVSRV9WSURFT01fQlVGMl9BRERSOyAKK0JVRl9FWFQgVUxPTkcgICAgZ19WSURFT01fQ09NUFJFU1NfQlVGX0FERFI7CitCVUZfRVhUIFVMT05HICAgIGdfVklERU9NX0ZMQUdfQlVGX0FERFI7CitCVUZfRVhUIFVMT05HICAgIGdfVklERU9NX1JDNF9CVUZfQUREUjsKKworQlVGX0VYVCBVTE9ORyAgICBnX1ZJREVPTV9ERUNPREVfQlVGXzFfQUREUjsKK0JVRl9FWFQgVUxPTkcgICAgZ19WSURFT01fREVDT0RFX0JVRl8yX0FERFI7CitCVUZfRVhUIFVMT05HICAgIGdfVklERU9NX0RFQ09NUFJFU1NfQlVGX0FERFI7CitCVUZfRVhUIFVMT05HICAgIGdfVklERU9NX0RFQ09ERV9SQzRfQlVGX0FERFI7CisKKyNpZmRlZiBXSU5fR0xPQkFMUworI2RlZmluZSBXSU5fRVhUCisjZWxzZQorI2RlZmluZSBXSU5fRVhUIGV4dGVybgorI2VuZGlmCisKK1dJTl9FWFQgVVNIT1JUCWdfRGVmV2lkdGgsIGdfRGVmSGVpZ2h0OworICAgCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL2FzcGVlZC9hc3QyNDAwL3UtYm9vdC5sZHMgYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZmMGZlMjIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC91LWJvb3QubGRzCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDx3Z0BkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKKy8qT1VUUFVUX0ZPUk1BVCgiZWxmMzItYXJtIiwgImVsZjMyLWFybSIsICJlbGYzMi1hcm0iKSovCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCisJLiA9IEFMSUdOKDQpOworCS50ZXh0CSAgIDoKKwl7CisJICBjcHUvYXJtOTI2ZWpzL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisKKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCV9fdV9ib290X2NtZF9zdGFydCA9IC47CisJLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKwlfX3VfYm9vdF9jbWRfZW5kID0gLjsKKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjQwMC92ZGVmLmggYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC92ZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2M5OWI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL3ZkZWYuaApAQCAtMCwwICsxLDUwMCBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaWZuZGVmIF9WREVGX0hfCisjZGVmaW5lIF9WREVGX0hfCisKKyNkZWZpbmUgICAgIFZJREVPMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgICAgIFZJREVPMV9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgICAgIFZJREVPMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgICAgIFZJREVPMl9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKworI2RlZmluZQkJVklERU9NX09OCQkJCQkJCTB4MDQKKyNkZWZpbmUgICAgIFZJREVPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZQkJQ1JUXzEJCQkJCQkJCTAKKyNkZWZpbmUJCUNSVF8xX09OCQkJCQkJCTB4MDEKKyNkZWZpbmUJCUNSVF8yCQkJCQkJCQkxCisjZGVmaW5lCQlDUlRfMl9PTgkJCQkJCQkweDAyCisKKyNkZWZpbmUJCVNJTkdMRV9DT0RFQ19TSU5HTEVfQ0FQVFVSRQkJCTAKKyNkZWZpbmUgICAgIEFVVE9fQ09ERUNfU0lOR0xFX0NBUFRVUkUJCQkyCisjZGVmaW5lCQlBVVRPX0NPREVDX0FVVE9fQ0FQVFVSRQkJCQkzCisKKyNkZWZpbmUJCU1BQzFfQkFTRQkJCQkJCQkweDFFNjYwMDAwCisjZGVmaW5lICAgICBBUEJfQlJJREdFXzFfQkFTRSAgICAgICAgICAgICAgICAgICAweDFFNkUwMDAwCisjZGVmaW5lICAgICBWSURFT19SRUdfQkFTRSAgICAgICAgICAgICAgICAgICAgICAweDFFNzAwMDAwCisjZGVmaW5lICAgICBBUEJfQlJJREdFXzJfQkFTRSAgICAgICAgICAgICAgICAgICAweDFFNzgwMDAwCisKKyNkZWZpbmUJCURSQU1fSU5JVF9CQVNFCQkJCQkJMHgxRTZFMDAwMAorCisjZGVmaW5lCQlTRFJBTV9QUk9URUNUX1JFRwkJCQkJMHgwMAorICAgICNkZWZpbmUgICAgIFNEUkFNX1dSSVRFX0RJU0FCTEUgICAgICAgICAgICAgMAorICAgICNkZWZpbmUgICAgIFNEUkFNX1dSSVRFX0VOQUJMRSAgICAgICAgICAgICAgMQorCisjZGVmaW5lCQlTQ1VfQkFTRQkJCQkJCQkweDFFNkUwMDAwCisjZGVmaW5lCQlTQ1VfT0ZGU0VUCQkJCQkJCTB4MjAwMAorCisjZGVmaW5lCQlWSUNfQkFTRQkJCQkJCQkweDFFNkMwMDAwCisJI2RlZmluZQkJVklERU9fSU5UX0JJVAkJCQk3CisKKyNkZWZpbmUJCUlSUV9TVEFUVVNfUkVHCQkJCQkJMHgwMAorI2RlZmluZQkJUkFXX0lOVF9TVEFUVVNfUkVHCQkJCQkweDA4CisjZGVmaW5lCQlJTlRfU0VMX1JFRwkJCQkJCQkweDBDCisJI2RlZmluZQkJRklRX0lOVAkJCQkJCQkxCisJI2RlZmluZQkJSVJRX0lOVAkJCQkJCQkwCQorI2RlZmluZQkJSU5UX0VOX1JFRwkJCQkJCQkweDEwCisjZGVmaW5lCQlJTlRfRU5fQ0xFQVJfUkVHCQkJCQkweDE0CisjZGVmaW5lCQlJTlRfU09GVF9SRUcJCQkJCQkweDE4CisjZGVmaW5lCQlJTlRfU09GVF9DTEVBUl9SRUcJCQkJCTB4MUMKKyNkZWZpbmUJCUlOVF9TRU5TRV9SRUcJCQkJCQkweDI0CisJI2RlZmluZQkJTEVWRUxfU0VOU0UJCQkJCQkxCisJI2RlZmluZQkJRURHRV9TRU5TRQkJCQkJCTAKKyNkZWZpbmUJCUlOVF9FVkVOVF9SRUcJCQkJCQkweDJDCisJI2RlZmluZQkJSElHSF9MRVZFTF9TRU5TRQkJCQkxCisJI2RlZmluZQkJTE9XX0xFVkVMX1NFTlNFCQkJCQkwCisKKyNkZWZpbmUJCVNDVV9IV19UUkFQUElOR19SRUcJCQkJCTB4NzAgKyBTQ1VfT0ZGU0VUCisJI2RlZmluZQkJQ0xJRU5UX01PREVfRU5fQklUCQkJCTE4CisJI2RlZmluZQkJQ0xJRU5UX01PREVfRU5fTUFTSwkJCQkweDAwMDQwMDAwCisJCSNkZWZpbmUJCUJFX0hPU1RfQ0hJUAkJCQkwCisJCSNkZWZpbmUJCUJFX0NMSUVOVF9DSElQCQkJCTEKKworI2RlZmluZSAgICAgU0NVX1VMT0NLX0tFWSAgICAgICAgICAgICAgICAgICAgICAgMHgxNjg4QThBOAorICAgIAorI2RlZmluZSAgICAgU0NVX1BST1RFQ1RfUkVHICAgICAgICAgICAgICAgICAgICAgMHgwMCArIFNDVV9PRkZTRVQKKyAgICAjZGVmaW5lICAgICBTQ1VfV1JJVEVfRElTQUJMRSAgICAgICAgICAgICAgIDAKKyAgICAjZGVmaW5lICAgICBTQ1VfV1JJVEVfRU5BQkxFICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSAgICAgU0NVX0NPTlRST0xfUkVHICAgICAgICAgICAgICAgICAgICAgMHgwNCArIFNDVV9PRkZTRVQgICAgCisJI2RlZmluZSAgICAgVklERU9fRU5HSU5FX1JFU0VUCQkJCTB4MDAwMDAwNDAKKwkJI2RlZmluZSAgICAgVklERU9fRU5HSU5FX1JFU0VUX0JJVCAgICAgIDYKKwkJI2RlZmluZSAgICAgVklERU9fRU5HSU5FX1JFU0VUX01BU0sgICAgIDB4MDAwMDAwNDAKKyAgICAgICAgI2RlZmluZSAgICAgVklERU9fUkVTRVRfRU4gICAgICAgICAgICAgIDEKKyAgICAgICAgI2RlZmluZSAgICAgVklERU9fUkVTRVRfT0ZGICAgICAgICAgICAgIDAKKworI2RlZmluZSAgICAgU0NVX0NMT0NLX1NFTEVDVElPTl9SRUcgICAgICAgICAgICAgMHgwOCArIFNDVV9PRkZTRVQKKwkjZGVmaW5lCQlQT1JUQV9DTE9DS19ERUxBWV9NQVNLCQkJNyA8PCA4CS8vVmlkZW8gcG9ydCBBIG91dHB1dCBjbGNvayBzZWxlY3Rpb24KKwkJI2RlZmluZQlQT1JUQV9DTE9DS19JTlZfREVMQVlfMU5TCQk1IDw8IDgJLy9DbG9jayBpbnZlcnNlZCBhbmQgZGVsYXkgfiAybnMKKwkJI2RlZmluZQlQT1JUQV9DTE9DS19JTlZfREVMQVlfMk5TCQk2IDw8IDgJLy9DbG9jayBpbnZlcnNlZCBhbmQgZGVsYXkgfiAzbnMKKwkjZGVmaW5lCQlQT1JUQl9DTE9DS19ERUxBWV9NQVNLCQkJNyA8PCAxMgkvL1ZpZGVvIHBvcnQgQiBvdXRwdXQgY2xvY2sgZGVsYXkKKwkJI2RlZmluZQlQT1JUQl9DTE9DS19JTlZfREVMQVlfMU5TCQk1IDw8IDEyCS8vQ2xvY2sgaW52ZXJzZWQgYW5kIGRlbGF5IH4gM25zCisJCSNkZWZpbmUJUE9SVEJfQ0xPQ0tfSU5WX0RFTEFZXzJOUwkJNiA8PCAxMgkvL0Nsb2NrIGludmVyc2VkIGFuZCBkZWxheSB+IDNucworCSNkZWZpbmUJCVBPUlRCX0NMT0NLX1NFTAkJCQkJMSA8PCAxNSAvL1ZpZGVvIHBvcnQgQiBjbG9jayBzZWxlY3Rpb24KKwkJI2RlZmluZQlQT1JUQl9GUk9NX0QxQ0xLCQkJCTAgPDwgMTUKKwkJI2RlZmluZSBQT1JUQl9GUk9NX0QyQ0xLCQkJCTEgPDwgMTUKKwkjZGVmaW5lCQlFQ0xLX0NMS19TRUxfTUFTSwkJCQkoMyA8PCAyKQorCQkjZGVmaW5lCUVDTEtfRlJPTV9IUExMCQkJCQkoMSA8PCAyKQorCisJI2RlZmluZSAgICAgRDJDTEtfQ0xPQ0tfU0VMRUNUSU9OCQkJMHgwMDAyMDAwMAorCQkjZGVmaW5lICAgICBEMkNMS19DTE9DS19TRUxFQ1RJT05fQklUICAgMTcKKwkJI2RlZmluZSAgICAgRDJDTEtfQ0xPQ0tfU0VMRUNUSU9OX01BU0sgIDB4MDAwNjAwMDAKKwkJI2RlZmluZQkJTk9STUFMX0NSVDEJCQkJCTAKKyAgICAgICAgI2RlZmluZSAgICAgVjFDTEtfVklERU8xCQkJCTIKKyAgICAgICAgI2RlZmluZSAgICAgVjFDTEtfVklERU8yCQkJCTMKKworI2RlZmluZSAgICAgU0NVX0NMT0NLX1NUT1BfUkVHCQkJCQkweDBDICsgU0NVX09GRlNFVCAgICAKKwkjZGVmaW5lCQlFTl9FQ0xLCQkJCQkJCTAgPDwgMAkvL0VuYWJsZSBFQ0xLIChGb3IgVmlkZW8gRW5naW5lKQorCSNkZWZpbmUJCVNUT1BfRUNMS19CSVQJCQkJCTAKKwkjZGVmaW5lCQlTVE9QX0VDTEtfTUFTSwkJCQkJMSA8PCAwCisJI2RlZmluZQkJRU5fVjFDTEsJCQkJCQkwIDw8IDMgIC8vRW5hYmxlIFYxQ0xLIChGb3IgVmlkZW8gQ2FwdHVyZSAjMSkKKwkjZGVmaW5lCQlTVE9QX1YxQ0xLX0JJVAkJCQkJMworCSNkZWZpbmUJCVNUT1BfVjFDTEtfTUFTSwkJCQkJMSA8PCAzCisJI2RlZmluZQkJRU5fRDFDTEsJCQkJCQkwIDw8IDEwIC8vRW5hYmxlIEQxQ0xLIChGb3IgQ1JUMSkKKwkjZGVmaW5lCQlTVE9QX0QxQ0xLX0JJVAkJCQkJMTAKKwkjZGVmaW5lCQlTVE9QX0QxQ0xLX01BU0sJCQkJCTEgPDwgMTAKKwkjZGVmaW5lCQlFTl9EMkNMSwkJCQkJCTAgPDwgMTEgLy9TdG9wIEQyQ0xLIChGb3IgQ1JUMikKKwkjZGVmaW5lCQlTVE9QX0QyQ0xLCQkJCQkJKDEgPDwgMTEpCisJI2RlZmluZQkJU1RPUF9EMkNMS19CSVQJCQkJCTExCisJI2RlZmluZQkJU1RPUF9EMkNMS19NQVNLCQkJCQkxIDw8IDExCisJI2RlZmluZQkJRU5fVjJDTEsJCQkJCQkwIDw8IDEyIC8vU3RvcCBWMkNMSyAoRm9yIFZpZGVvIENhcHR1cmUgIzIpCisJI2RlZmluZQkJU1RPUF9WMkNMS19CSVQJCQkJCTEyCisJI2RlZmluZQkJU1RPUF9WMkNMS19NQVNLCQkJCQkxIDw8IDEyCisJI2RlZmluZQkJU1RPUF9IQUNFX0JJVAkJCQkJMTMKKwkjZGVmaW5lCQlFTl9IQUNFCQkJCQkJCSgwIDw8IDEzKQorCSNkZWZpbmUJCVNUT1BfSEFDRV9NQVNLCQkJCQkoMSA8PCAxMykKKwkjZGVmaW5lICAgICBFTl9JMlNDTEsJCQkJCQkwIDw8IDE4CisJI2RlZmluZSAgICAgU1RPUF9JMlNDTEtfTUFTSwkJCQkxIDw8IDE4CisKKyNkZWZpbmUgICAgIFNDVV9QSU5fQ1RSTDFfUkVHCQkJCQkweDc0ICsgU0NVX09GRlNFVAorCSNkZWZpbmUJCUkyQ181X1BJTl9FTgkJCQkJMSA8PCAxMgkvL0VuYWJsZSBJMkMgIzUgUElOCisJI2RlZmluZQkJSTJDXzVfUElOX09GRgkJCQkJMCA8PCAxMgkvL0Rpc2FibGUgSTJDICM1IFBJTgorCSNkZWZpbmUJCUkyQ181X1BJTl9NQVNLCQkJCQkxIDw8IDEyCisJI2RlZmluZQkJVkdBX1BJTl9PRkYJCQkJCQkwIDw8IDE1IC8vRW5hYmxlIFZHQSBwaW5zCisJI2RlZmluZQkJVkdBX1BJTl9NQVNLCQkJCQkxIDw8IDE1CisJI2RlZmluZQkJVklERU9fUE9SVEFfRU4JCQkJCTEgPDwgMTYgLy9FbmFibGUgVmlkZW8gcG9ydCBBIGNvbnRyb2wgcGlucworCSNkZWZpbmUJCVZJREVPX1BPUlRBX01BU0sJCQkJMSA8PCAxNgorCSNkZWZpbmUJCVZJREVPX1BPUlRCX0VOCQkJCQkxIDw8IDE3IC8vRW5hYmxlIFZpZGVvIHBvcnQgQiBjb250cm9sIHBpbnMKKwkjZGVmaW5lCQlWSURFT19QT1JUQl9NQVNLCQkJCTEgPDwgMTcKKwkjZGVmaW5lCQlWSURFT19WUDFfRU4JCQkJCTEgPDwgMjIgLy9FbmFibGUgVlBbMTE6MF0KKwkjZGVmaW5lCQlWSURFT19WUDFfTUFTSwkJCQkJMSA8PCAyMiAKKwkjZGVmaW5lCQlWSURFT19WUDJfRU4JCQkJCTEgPDwgMjMgLy9FbmFibGUgVlBbMjM6MTJdCisJI2RlZmluZQkJVklERU9fVlAyX01BU0sJCQkJCTEgPDwgMjMKKwkjZGVmaW5lCQlJMlNfUElOX0VOCQkJCQkJMSA8PCAyOSAvL0VuYWJsZSBJMlMgZnVuY3Rpb24gcGlucworCSNkZWZpbmUJCUkyU19QSU5fTUFTSwkJCQkJMSA8PCAyOQorCisjZGVmaW5lICAgICBTQ1VfUElOX0NUUkwyX1JFRwkJCQkJMHg3OCArIFNDVV9PRkZTRVQKKwkjZGVmaW5lCQlWSURFT19QT1JUQV9TSU5HTEVfRURHRV9NQVNLCTEgPDwgMAorCQkjZGVmaW5lCQlWSURFT19QT1JUQV9TSU5HTEVfRURHRQkJMSA8PCAwCS8vRW5hYmxlIFZpZGVvIHBvcnQgQSBzaW5nbGUgbW9kZQorCQkjZGVmaW5lCQlWSURFT19QT1JUQV9EVUFMX0VER0UJCTAgPDwgMAorCSNkZWZpbmUJCVZJREVPX1BPUlRCX1NJTkdMRV9FREdFX01BU0sJMSA8PCAxCisJCSNkZWZpbmUJCVZJREVPX1BPUlRCX0RVQUxfRURHRQkJMCA8PCAxCisJCSNkZWZpbmUJCVZJREVPX1BPUlRCX1NJTkdMRV9FREdFCQkxIDw8IDEJLy9FbmFibGUgVmlkZW8gcG9ydCBCIHNpbmdsZSBtb2RlCisKKyNkZWZpbmUJCVNDVV9NX1BMTF9QQVJBTV9SRUcJCQkJCTB4MjAgKyBTQ1VfT0ZGU0VUCisKKyNkZWZpbmUJCURSQU1fQkFTRQkJCQkJCQkweDQwMDAwMDAwCisKKyNkZWZpbmUgICAgIElOUFVUX0JJVENPVU5UX1lVVjQ0NAkJCQk0CisjZGVmaW5lCQlJTlBVVF9CSVRDT1VOVF9ZVVY0MjAJCQkJMgorCisvKiBIVyBjb21tZW50IHZhbHVlICovCisvL1BBU1NXT1JECisjZGVmaW5lICAgICBWSURFT19VTkxPQ0tfS0VZICAgICAgICAgICAgICAgICAgICAweDFBMDM4QUE4CisjZGVmaW5lCQlTQ1VfVU5MT0NLX0tFWQkJCQkJCTB4MTY4OEE4QTgKKyNkZWZpbmUJCVNEUkFNX1VOTE9DS19LRVkJCQkJCTB4RkM2MDAzMDkKKworCisvLyNkZWZpbmUgICAgIFNBTVBMRV9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAwMDAuMAorI2lmZGVmIE9TQ19ORVcKKyAgICAjZGVmaW5lICAgICBTQU1QTEVfUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0NTc2MDAwLjAKKyNlbHNlCisgICAgI2RlZmluZSAgICAgU0FNUExFX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMDAwMC4wCisjZW5kaWYKKworI2RlZmluZSAgICAgTU9ERURFVEVDVElPTl9WRVJUSUNBTF9TVEFCTEVfTUFYSU1VTSAgICAgICAweDQKKyNkZWZpbmUgICAgIE1PREVERVRFQ1RJT05fSE9SSVpPTlRBTF9TVEFCTEVfTUFYSU1VTSAgICAgMHg0CisjZGVmaW5lICAgICBNT0RFREVURUNUSU9OX1ZFUlRJQ0FMX1NUQUJMRV9USFJFU0hPTEQgICAgIDB4NAorI2RlZmluZSAgICAgTU9ERURFVEVDVElPTl9IT1JJWk9OVEFMX1NUQUJMRV9USFJFU0hPTEQgICAweDgKKworI2RlZmluZSAgICAgTU9ERURFVEVDVElPTl9FREdFX1BJWEVMX1RIUkVTX0RJR0lUQUwgICAgICAyCisjZGVmaW5lICAgICBNT0RFREVURUNUSU9OX0VER0VfUElYRUxfVEhSRVNfQU5BTE9HRSAgICAgIDB4MEEKKworI2RlZmluZQkJTU9ERURFVEVDVElPTl9PSwkJCQkJCQkwCisjZGVmaW5lCQlNT0RFREVURUNUSU9OX0VSUk9SCQkJCQkJCTEKKyNkZWZpbmUJCUpVREdFX01PREVfRVJST1IJCQkJCQkJMgorCisvL0kyQyBMb29wIENvdW50CisjZGVmaW5lICAgIExPT1BfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMAorI2RlZmluZSAgICBDQU5fTk9UX0ZJTkRfREVWSUNFICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgICAgU0VUX0kyQ19ET05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lCSAgIEkyQ19CQVNFCQkJCQkJCQkJICAgMHhBMDAwCisjZGVmaW5lICAgIEFDX1RJTUlORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3Nzc0MzM1NQorCisvL0kyQyBjaGFubmVsIGFuZCBEZXZpY2VzCisjZGVmaW5lICAgICBJMkNfVklERU8xX0VFUFJPTSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgICAgSTJDX1ZJREVPMl9FRVBST00gICAgICAgICAgICAgICAgICAgICAgICAgICAweDUKKyNkZWZpbmUgICAgIEkyQ19WSURFTzJfOTg4MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisvKgorVUxPTkcgICAgQ0FQVFVSRTFfQUREUkVTUyA9ICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwOworVUxPTkcgICAgQ0FQVFVSRTJfQUREUkVTUyA9ICAgICAgICAgICAgICAgICAgICAgMHgzMDAwMDAwOworVUxPTkcgICAgUEFTUzFfRU5DT0RFX1NPVVJDRV9BRERSRVNTID0gICAgICAgICAgMHgxMDAwMDAwOworVUxPTkcgICAgUEFTUzFfRU5DT0RFX0RFU1RJTkFUSU9OX0FERFJFU1MgPSAgICAgMHgyMDAwMDAwOworVUxPTkcgICAgQnVmZmVyMV9ERUNPREVfU09VUkNFX0FERFJFU1MgPSAgICAgICAgMHgxMDAwMDAwOworVUxPTkcgICAgQnVmZmVyMl9ERUNPREVfU09VUkNFX0FERFJFU1MgPSAgICAgICAgMHgxNDAwMDAwOworVUxPTkcgICAgUEFTUzFfREVDT0RFX0RFU1RJTkFUSU9OX0FERFJFU1MgPSAgICAgMHg2MDAwMDA7CitVTE9ORyAgICBDQVBUVVJFXzJORF9BRERSRVNTID0gICAgICAgICAgICAgICAgICAweDE4MDAwMDA7CitVTE9ORyAgICBQQVNTMV8yTkRfRU5DT0RFX1NPVVJDRV9BRERSRVNTID0gICAgICAweDE4MDAwMDA7CitVTE9ORyAgICBQQVNTMV8yTkRfRU5DT0RFX0RFU1RJTkFUSU9OX0FERFJFU1MgPSAweDI4MDAwMDA7CitVTE9ORyAgICBQQVNTMV8yTkRfREVDT0RFX1NPVVJDRV9BRERSRVNTID0gICAgICAweDEwMDAwMDA7CitVTE9ORyAgICBQQVNTMV8yTkRfREVDT0RFX0RFU1RJTkFUSU9OX0FERFJFU1MgPSAweDYwMDAwMDsKK1VMT05HICAgIFBBU1MyX0VOQ09ERV9TT1VSQ0VfQUREUkVTUyA9ICAgICAgICAgIDB4MDAwMDAwOworVUxPTkcgICAgUEFTUzJfRU5DT0RFX0RFU1RJTkFUSU9OX0FERFJFU1MgPSAgICAgMHhDMDAwMDA7CitVTE9ORyAgICBQQVNTMl9ERUNPREVfU09VUkNFX0FERFJFU1MgPSAgICAgICAgICAweEMwMDAwMDsKK1VMT05HICAgIFBBU1MyX0RFQ09ERV9ERVNUSU5BVElPTl9BRERSRVNTID0gICAgIDB4NjAwMDAwOworVUxORyAgICBQQVNTMl9ERUNPREVfUkVGRVJFTkNFX0FERFJFU1MgPSAgICAgICAweDYwMDAwMDsKKyovCisKK3R5cGVkZWYgc3RydWN0IF9DVExfUkVHX0cgeworICAgIFVMT05HICAgQ29tcHJlc3NNb2RlOjE7CisgICAgVUxPTkcgICBTa2lwRW1wdHlGcmFtZToxOworICAgIFVMT05HICAgTWVtQnVyc3RMZW46MjsKKyAgICBVTE9ORyAgIExpbmVCdWZFbjoyOworICAgIFVMT05HICAgVW51c2VkOjI2OworfSBDVExfUkVHX0c7CisKKwordHlwZWRlZiB1bmlvbiBfVV9DVExfRyB7CisgICAgVUxPTkcgICAgICAgVmFsdWU7CisgICAgQ1RMX1JFR19HICAgQ3RsUmVnOworfSBVX0NUTF9HOworCit0eXBlZGVmIHN0cnVjdCBfTU9ERV9ERVRFQ1RJT05fUEFSQU1fUkVHIHsKKyAgICBVTE9ORyAgIFVudXNlZDE6ODsKKyAgICBVTE9ORyAgIEVkZ2VQaXhlbFRocmVzOjg7CisgICAgVUxPTkcgICBWZXJTdGFibGVNYXg6NDsKKyAgICBVTE9ORyAgIEhvclN0YWJsZU1heDo0OworICAgIFVMT05HICAgVmVyRGlmZk1heDo0OworICAgIFVMT05HICAgSG9yRGlmZk1heDo0OworfSBNT0RFX0RFVEVDVElPTl9QQVJBTV9SRUc7CisKK3R5cGVkZWYgc3RydWN0IF9DUkNfUFJJX1BBUkFNX1JFRyB7CisgICAgVUxPTkcgICBFbmFibGU6MTsKKyAgICBVTE9ORyAgIEhpZ2hCaXRPbmx5OjE7CisgICAgVUxPTkcgICBTa2lwQ291bnRNYXg6NjsKKyAgICBVTE9ORyAgIFBvbHlMb3c6ODsKKyAgICBVTE9ORyAgIFBvbHlIaWdoOjE2OworfSBDUkNfUFJJX1BBUkFNX1JFRzsKKwordHlwZWRlZiB1bmlvbiBfVV9DUkNfUFJJX1BBUkFNIHsKKyAgICBVTE9ORyAgICAgICAgICAgICAgIFZhbHVlOworICAgIENSQ19QUklfUEFSQU1fUkVHICAgQ1JDUHJpUGFyYW07Cit9IFVfQ1JDX1BSSV9QQVJBTTsKKwordHlwZWRlZiBzdHJ1Y3QgX0NSQ19TRUNfUEFSQU1fUkVHIHsKKyAgICBVTE9ORyAgIFVudXNlZDE6ODsKKyAgICBVTE9ORyAgIFBvbHlMb3c6ODsKKyAgICBVTE9ORyAgIFBvbHlIaWdoOjE2OworfSBDUkNfU0VDX1BBUkFNX1JFRzsKKwordHlwZWRlZiB1bmlvbiBfVV9DUkNfU0VDX1BBUkFNIHsKKyAgICBVTE9ORyAgICAgICAgICAgICAgIFZhbHVlOworICAgIENSQ19TRUNfUEFSQU1fUkVHICAgQ1JDU2VjUGFyYW07Cit9IFVfQ1JDX1NFQ19QQVJBTTsKKwordHlwZWRlZiBzdHJ1Y3QgX0dFTkVSQUxfSU5GTyB7CisgICAgQllURSAgICAgICAgICAgICAgICBFbmFibGVWaWRlb007CisgICAgQllURSAgICAgICAgICAgICAgICBDZW50ZXJNb2RlOworCUJZVEUJCQkJUkM0Tm9SZXNldEZyYW1lOworCUJZVEUJCQkJUkM0VGVzdE1vZGU7CisgICAgVV9DVExfRyAgICAgICAgICAgICB1Q3RsUmVnOworICAgIFVfQ1JDX1BSSV9QQVJBTSAgICAgdUNSQ1ByaVBhcmFtOworICAgIFVfQ1JDX1NFQ19QQVJBTSAgICAgdUNSQ1NlY1BhcmFtOworfSBHRU5FUkFMX0lORk8sICpQR0VORVJBTF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBfU0VRX0NUTF9SRUcgeworICAgIFVMT05HICAgVW51c2VkMToxOworICAgIFVMT05HICAgVW51c2VkMjoxOworICAgIFVMT05HICAgVW51c2VkMzoxOworICAgIFVMT05HICAgQ2FwdHVyZUF1dG9Nb2RlOjE7CisgICAgVUxPTkcgICBVbnVzZWQ0OjE7CisgICAgVUxPTkcgICBDb2RlY0F1dG9Nb2RlOjE7CisgICAgVUxPTkcgICBVbnVzZWQ1OjE7CisgICAgVUxPTkcgICBXYXRjaERvZzoxOworICAgIFVMT05HICAgQ1JUU2VsOjE7CisgICAgVUxPTkcgICBBbnRpVGVhcmluZzoxOworICAgIFVMT05HICAgRGF0YVR5cGU6MjsKKyAgICBVTE9ORyAgIFVudXNlZDY6MjA7Cit9IFNFUV9DVExfUkVHOworCit0eXBlZGVmIHVuaW9uIF9VX1NFUV9DVEwgeworICAgIFVMT05HICAgICAgICAgICAgICAgVmFsdWU7CisgICAgU0VRX0NUTF9SRUcgICBTZXFDdGxSZWc7Cit9IFVfU0VRX0NUTDsKKwordHlwZWRlZiBzdHJ1Y3QgX0NUTF9SRUcgeworICAgIFVMT05HICAgU3JjSHN5bmM6MTsKKyAgICBVTE9ORyAgIFNyY1ZzeW5jOjE7CisgICAgVUxPTkcgICBFeHRTcmM6MTsKKyAgICBVTE9ORyAgIEFuYWxvbmdFeHRTcmM6MTsKKyAgICBVTE9ORyAgIEludFRpbWluZ0dlbjoxOworICAgIFVMT05HICAgSW50RGF0YUZyb206MTsKKyAgICBVTE9ORyAgIFdyaXRlRm10OjI7CisgICAgVUxPTkcgICBWR0FDdXJzb3I6MTsKKyAgICBVTE9ORyAgIExpbmVhck1vZGU6MTsKKyAgICBVTE9ORyAgIENsb2NrRGVsYXk6MjsKKyAgICBVTE9ORyAgIENDSVI2NTZTcmM6MTsKKyAgICBVTE9ORyAgIFBvcnRDbG9jazoxOworICAgIFVMT05HICAgRXh0UG9ydDoxOyAgICAgICAgCisgICAgVUxPTkcgICBVbnVzZWQxOjE7CisgICAgVUxPTkcgICBGcmFtZVJhdGU6ODsKKyAgICBVTE9ORyAgIFVudXNlZDI6ODsKK30gQ1RMX1JFRzsKKwordHlwZWRlZiB1bmlvbiBfVV9DVEwgeworICAgIFVMT05HICAgICAgIFZhbHVlOworICAgIENUTF9SRUcgICAgIEN0bFJlZzsKK30gVV9DVExfUkVHOworCit0eXBlZGVmIHN0cnVjdCBfVElNSU5HX0dFTl9TRVRUSU5HX0ggeworICAgIFVMT05HICAgSERFRW5kOjEzOworICAgIFVMT05HICAgVW51c2VkMTozOworICAgIFVMT05HICAgSERFU3RhcnQ6MTM7CisgICAgVUxPTkcgICBVbnVzZWQyOjM7Cit9IFRJTUlOR19HRU5fU0VUVElOR19IOworCit0eXBlZGVmIHN0cnVjdCBfVElNSU5HX0dFTl9TRVRUSU5HX1YgeworICAgIFVMT05HICAgVkRFRW5kOjEzOworICAgIFVMT05HICAgVW51c2VkMTozOworICAgIFVMT05HICAgVkRFU3RhcnQ6MTM7CisgICAgVUxPTkcgICBVbnVzZWQyOjM7Cit9IFRJTUlOR19HRU5fU0VUVElOR19WOworCit0eXBlZGVmIHN0cnVjdCBfQkNEX0NUTF9SRUcgeworICAgIFVMT05HICAgRW5hYmxlOjE7CisgICAgVUxPTkcgICBVbnVzZWQxOjE1OworICAgIFVMT05HICAgVG9sZXJhbmNlOjg7CisgICAgVUxPTkcgICBVbnVzZWQyOjg7Cit9IEJDRF9DVExfUkVHOworCit0eXBlZGVmIHVuaW9uIF9VX0JDRF9DVEwgeworICAgIFVMT05HICAgICAgICAgICBWYWx1ZTsKKyAgICBCQ0RfQ1RMX1JFRyAgICAgQkNEQ3RsUmVnOworfSBVX0JDRF9DVEw7CisKK3R5cGVkZWYgc3RydWN0IF9DT01QUkVTU19XSU5ET1dfUkVHIHsKKyAgICBVTE9ORyAgIFZlckxpbmU6MTM7CisgICAgVUxPTkcgICBVbnVzZWQxOjM7CisgICAgVUxPTkcgICBIb3JQaXhlbDoxMzsKKyAgICBVTE9ORyAgIFVudXNlZDI6MzsKK30gQ09NUFJFU1NfV0lORE9XX1JFRzsKKwordHlwZWRlZiBzdHJ1Y3QgX1NUUkVBTV9CVUZfU0laRSB7CisgICAgVUxPTkcgICBQYWNrZXRTaXplOjM7CisgICAgVUxPTkcgICBSaW5nQnVmTnVtOjI7CisgICAgVUxPTkcgICBVbnVzZWQxOjExOworICAgIFVMT05HICAgU2tpcEhpZ2hNQlRocmVzOjc7CisgICAgVUxPTkcgICBTa2lwVGVzdE1vZGU6MjsKKyAgICBVTE9ORyAgIFVudXNlZDI6NzsKK30gU1RSRUFNX0JVRl9TSVpFOworCit0eXBlZGVmIHVuaW9uIF9VX1NUUkVBTV9CVUYgeworICAgIFVMT05HICAgICAgICAgICAgICAgVmFsdWU7CisgICAgU1RSRUFNX0JVRl9TSVpFICAgICBTdHJlYW1CdWZTaXplOworfSBVX1NUUkVBTV9CVUY7CisKKwordHlwZWRlZiBzdHJ1Y3QgX0NPTVBSRVNTX0NUTF9SRUcgeworICAgIFVMT05HICAgSlBFR09ubHk6MTsgLyogVHJ1ZTogSnBlZyBPbmx5IG1vZGUoRGlzYWJsZSBWUSksIEZhbHNlOkpwZWcgYW5kIFZRIG1peCBtb2RlICovCisgICAgVUxPTkcgICBFbjRWUToxOyAvKiBUcnVlOiAxLCAyLCA0IGNvbG9yIG1vZGUsIEZhbHNlOiAxLDIgY29sb3IgbW9kZSAqLworICAgIFVMT05HICAgQ29kZWNNb2RlOjE7IC8qIEhpZ2ggYW5kIGJlc3QgUXVhbnRpemF0aW9uIGVuY29kaW5nL2RlY29kaW5nIHNldHRpbmcqLworICAgIFVMT05HICAgRHVhbFF1YWxpdHk6MTsKKyAgICBVTE9ORyAgIEVuQmVzdDoxOworICAgIFVMT05HICAgRW5SQzQ6MTsKKyAgICBVTE9ORyAgIE5vckNocm9tYURDVFRhYmxlOjU7CisgICAgVUxPTkcgICBOb3JMdW1hRENUVGFibGU6NTsKKyAgICBVTE9ORyAgIEVuSGlnaDoxOworICAgIFVMT05HICAgVGVzdEN0bDoyOworICAgIFVMT05HICAgVVZGbXQ6MTsKKyAgICBVTE9ORyAgIEh1ZlRhYmxlOjI7CisgICAgVUxPTkcgICBBbHRlclZhbHVlMTo1OworICAgIFVMT05HICAgQWx0ZXJWYWx1ZTI6NTsKK30gQ09NUFJFU1NfQ1RMX1JFRzsKKwordHlwZWRlZiB1bmlvbiBfVV9DT01QUkVTU19DVEwgeworICAgIFVMT05HICAgICAgICAgICAgICAgVmFsdWU7CisgICAgQ09NUFJFU1NfQ1RMX1JFRyAgICBDb21wcmVzc0N0bFJlZzsKK30gVV9DT01QUkVTU19DVEw7CisKK3R5cGVkZWYgc3RydWN0IF9RVUFOVElfVEFCTEVfTE9XX1JFRyB7CisgICAgVUxPTkcgICBDaHJvbWFUYWJsZTo1OworICAgIFVMT05HICAgTHVtYVRhYmxlOjU7CisgICAgVUxPTkcgICBVbnVzZWQxOjIyOworfSBRVUFOVElfVEFCTEVfTE9XX1JFRzsKKwordHlwZWRlZiB1bmlvbiBfVV9DUVVBTlRJX1RBQkxFX0xPVyB7CisgICAgVUxPTkcgICAgICAgICAgICAgICAgICAgVmFsdWU7CisgICAgUVVBTlRJX1RBQkxFX0xPV19SRUcgICAgUVRhYmxlTG93UmVnOworfSBVX1FVQU5USV9UQUJMRV9MT1c7CisKK3R5cGVkZWYgc3RydWN0IF9RVUFOVElfVkFMVUVfUkVHIHsKKyAgICBVTE9ORyAgIEhpZ2g6MTU7CisJVUxPTkcJVW51c2VkMToxOworICAgIFVMT05HICAgQmVzdDoxNTsKKyAgICBVTE9ORyAgIFVudXNlZDI6MTsKK30gUVVBTlRJX1ZBTFVFX1JFRzsKKwordHlwZWRlZiB1bmlvbiBfVV9RVUFOVElfVkFMVUUgeworICAgIFVMT05HICAgICAgICAgICAgICAgVmFsdWU7CisgICAgUVVBTlRJX1ZBTFVFX1JFRyAgICBRVmFsdWVSZWc7Cit9IFVfUVVBTlRJX1ZBTFVFOworCit0eXBlZGVmIHN0cnVjdCBfQlNEX1BBUkFNX1JFRyB7CisgICAgVUxPTkcgICBIaWdoVGhyZXM6ODsKKyAgICBVTE9ORyAgIExvd1RocmVzOjg7CisgICAgVUxPTkcgICBIaWdoQ291bnQ6NjsKKyAgICBVTE9ORyAgIFVudXNlZDE6MjsKKyAgICBVTE9ORyAgIExvd0NvdW50OjY7CisgICAgVUxPTkcgICBVbnVzZWQyOjI7Cit9IEJTRF9QQVJBTV9SRUc7CisKK3R5cGVkZWYgdW5pb24gX1VfQlNEX1BBUkFNIHsKKyAgICBVTE9ORyAgICAgICAgICAgVmFsdWU7CisgICAgQlNEX1BBUkFNX1JFRyAgIEJTRFBhcmFtUmVnOworfSBVX0JTRF9QQVJBTTsKKwordHlwZWRlZiBzdHJ1Y3QgX1ZJREVPX0lORk8geworICAgIEJZVEUgICAgICBFeHRBRENBY3Q7ICAgIC8qIHJlYWQgZnJvbSBtb2RlY3Rpb24gcmVnaXN0ZXIgKi8KKwlCWVRFCSAgRW5hYmxlUkM0OworICAgIEJZVEUgICAgICBEb3duU2NhbGluZ01ldGhvZDsKKyAgICBVU0hPUlQgICAgQW5hbG9nRGlmZmVyZW50aWFsVGhyZXNob2xkOyAvKiBCQ0QgdG9sZXJhbmNlICovCisgICAgVVNIT1JUICAgIERpZ2l0YWxEaWZmZXJlbnRpYWxUaHJlc2hvbGQ7IC8qIEJDRCB0b2xlcmFuY2UgKi8KKyAgICBVU0hPUlQgICAgRHN0V2lkdGg7CisgICAgVVNIT1JUICAgIERzdEhlaWdodDsKKyAgICBVU0hPUlQgICAgU3JjV2lkdGg7CisgICAgVVNIT1JUICAgIFNyY0hlaWdodDsKKyAgICBCWVRFICAgICAgSGlnaEx1bWFUYWJsZTsgLyogaWYgSGlnaCBhbmQgYmVzdCBKcGVnIGNvZGVjIGVuYWJsZSwgdXNlIEhpZ2hMdW1hVGFibGUgYW5kIEhpZ2hDaHJvbWFUYWJsZSwgb3RoZXJ3aXNlIEhpZ2hEZVF1YW50aVZhbHVlIGFuZCBCZXN0RGVxdWFudGlWYWx1ZSovCisgICAgQllURSAgICAgIEhpZ2hDaHJvbWFUYWJsZTsKKyAgICBCWVRFICAgICAgSGlnaERlUXVhbnRpVmFsdWU7CisgICAgQllURSAgICAgIEJlc3REZXF1YW50aVZhbHVlOworICAgIFVfU0VRX0NUTCAgICAgICAgICAgICAgIHVTZXFDdGxSZWc7CisgICAgVV9DVExfUkVHICAgICAgICAgICAgICAgdUN0bFJlZzsKKyAgICBVX0JDRF9DVEwgICAgICAgICAgICAgICB1QkNEQ3RsUmVnOworICAgIFVfU1RSRUFNX0JVRiAgICAgICAgICAgIHVTdHJlYW1CdWZTaXplOworICAgIFVfQ09NUFJFU1NfQ1RMICAgICAgICAgIHVDb21wcmVzc0N0bFJlZzsKKyAgICBVX1FVQU5USV9UQUJMRV9MT1cgICAgICB1UVRhYmxlTG93UmVnOworICAgIFVfUVVBTlRJX1ZBTFVFICAgICAgICAgIHVRVmFsdWVSZWc7CisgICAgVV9CU0RfUEFSQU0gICAgICAgICAgICAgdUJTRFBhcmFtUmVnOworfSBWSURFT19JTkZPLCAqUFZJREVPX0lORk8gOworCit0eXBlZGVmIHN0cnVjdCBfVklERU9NX1NFUV9DVExfUkVHIHsKKyAgICBVTE9ORyAgIFVudXNlZDE6MTsgIC8vQml0IDAKKyAgICBVTE9ORyAgIFVudXNlZDI6MTsJLy9CaXQgMQorICAgIFVMT05HICAgVW51c2VkMzoxOwkJLy9CaXQgMgorICAgIFVMT05HICAgU3RyZWFtTW9kZToxOwkvL0JpdCAzCisgICAgVUxPTkcgICBVbnVzZWQ0OjE7CS8vQml0IDQKKyAgICBVTE9ORyAgIENvZGVjQXV0b01vZGU6MTsJLy9CaXQgNQorCVVMT05HCVVudXNlZDY6MTsJLy9CaXQgNgorICAgIFVMT05HICAgVW51c2VkNzoxOwkvL0JpdCA3CisgICAgVUxPTkcgICBTcmNTZWw6MTsJLy9CaXQgOAorICAgIFVMT05HICAgVW51c2VkOToxOwkvL0JpdCA5CisgICAgVUxPTkcgICBEYXRhVHlwZToyOyAgLy9CaXRbMTE6MTBdCisgICAgVUxPTkcgICBVbnVzZWQxMjoyMDsKK30gVklERU9NX1NFUV9DVExfUkVHOworCit0eXBlZGVmIHVuaW9uIF9VX1ZJREVPTV9TRVFfQ1RMIHsKKyAgICBVTE9ORwkJCQkJVmFsdWU7CisgICAgVklERU9NX1NFUV9DVExfUkVHCQlTZXFDdGxSZWc7Cit9IFVfVklERU9NX1NFUV9DVEw7CisKK3R5cGVkZWYgc3RydWN0IF9WSURFT01fSU5GTyB7CisgICAgQllURSAgICAgIERvd25TY2FsaW5nTWV0aG9kOworICAgIFVTSE9SVCAgICBBbmFsb2dEaWZmZXJlbnRpYWxUaHJlc2hvbGQ7IC8qIEJDRCB0b2xlcmFuY2UgKi8KKyAgICBVU0hPUlQgICAgRGlnaXRhbERpZmZlcmVudGlhbFRocmVzaG9sZDsgLyogQkNEIHRvbGVyYW5jZSAqLworICAgIFVTSE9SVCAgICBEc3RXaWR0aDsKKyAgICBVU0hPUlQgICAgRHN0SGVpZ2h0OworICAgIFVTSE9SVCAgICBTcmNXaWR0aDsKKyAgICBVU0hPUlQgICAgU3JjSGVpZ2h0OworICAgIEJZVEUgICAgICBIaWdoTHVtYVRhYmxlOyAvKiBpZiBIaWdoIGFuZCBiZXN0IEpwZWcgY29kZWMgZW5hYmxlLCB1c2UgSGlnaEx1bWFUYWJsZSBhbmQgSGlnaENocm9tYVRhYmxlLCBvdGhlcndpc2UgSGlnaERlUXVhbnRpVmFsdWUgYW5kIEJlc3REZXF1YW50aVZhbHVlKi8KKyAgICBCWVRFICAgICAgSGlnaENocm9tYVRhYmxlOworICAgIEJZVEUgICAgICBIaWdoRGVRdWFudGlWYWx1ZTsKKyAgICBCWVRFICAgICAgQmVzdERlcXVhbnRpVmFsdWU7CisgICAgQllURSAgICAgIFBhY2tldFNpemU7ICAgLy90aGUgc2FtZSBhcyB2aWRlbzEgJiB2aWRlbzIKKyAgICBCWVRFICAgICAgUmluZ0J1Zk51bTsKKwlCWVRFCSAgRW5hYmxlUkM0OworICAgIFVfVklERU9NX1NFUV9DVEwgICAgICAgIHVTZXFDdGxSZWc7CisgICAgVV9CQ0RfQ1RMICAgICAgICAgICAgICAgdUJDREN0bFJlZzsKKyAgICBVX0NPTVBSRVNTX0NUTCAgICAgICAgICB1Q29tcHJlc3NDdGxSZWc7CisgICAgVV9RVUFOVElfVEFCTEVfTE9XICAgICAgdVFUYWJsZUxvd1JlZzsKKyAgICBVX1FVQU5USV9WQUxVRSAgICAgICAgICB1UVZhbHVlUmVnOworICAgIFVfQlNEX1BBUkFNICAgICAgICAgICAgIHVCU0RQYXJhbVJlZzsKK30gVklERU9NX0lORk8sICpQVklERU9NX0lORk8gOworCit0eXBlZGVmIHN0cnVjdCBfVklERU9fTU9ERV9JTkZPCit7CisgICAgVVNIT1JUICAgIFg7CisgICAgVVNIT1JUICAgIFk7CisgICAgVVNIT1JUICAgIENvbG9yRGVwdGg7CisgICAgVVNIT1JUICAgIFJlZnJlc2hSYXRlOworICAgIEJZVEUgICAgICBNb2RlSW5kZXg7Cit9IFZJREVPX01PREVfSU5GTywgKlBWSURFT19NT0RFX0lORk87CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjQwMC92ZXNhLmggYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC92ZXNhLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjlhYmE5MAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL3Zlc2EuaApAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaWZuZGVmIF9WRVNBX0hfCisjZGVmaW5lIF9WRVNBX0hfCisKK3R5cGVkZWYgZW51bSAKK3sKKwlWQ0xLMjVfMTc1CT0gMHgwMCwKKwlWQ0xLMjhfMzIyCT0gMHgwMSwKKwlWQ0xLMzFfNQk9IDB4MDIsCisJVkNMSzMxXzU3NAk9IDB4MDMsCisJVkNMSzMyXzc2CT0gMHgwNCwKKwlWQ0xLMzNfMTU0CT0gMHgwNSwKKwlWQ0xLMzYJCT0gMHgwNiwKKwlWQ0xLNDAJCT0gMHgwNywKKwlWQ0xLNDVfOTc4CT0gMHgwOCwKKwlWQ0xLNDlfNQk9IDB4MDksCisJVkNMSzUwCQk9IDB4MEEsCisJVkNMSzUyXzk1CT0gMHgwQiwKKwlWQ0xLNTZfMjUJPSAweDBDLAorCVZDTEs2NQkJPSAweDBELAorCVZDTEs3NF80OAk9IDB4MEUsCisJVkNMSzc1CQk9IDB4MEYsCisJVkNMSzc4Xzc1CT0gMHgxMCwKKwlWQ0xLNzlfMzczCT0gMHgxMSwKKwlWQ0xLODFfNjI0CT0gMHgxMiwKKwlWQ0xLODNfNDYyCT0gMHgxMywKKwlWQ0xLODRfNzE1CT0gMHgxNCwKKwlWQ0xLOTRfNQk9IDB4MTUsCisJVkNMSzEwNl81CT0gMHgxNiwKKwlWQ0xLMTA4CQk9IDB4MTcsCisJVkNMSzExOQkJPSAweDE4LAorCVZDTEsxMzUJCT0gMHgxOSwKKwlWQ0xLMTM2XzM1OCA9IDB4MUEsCisJVkNMSzE0Nl8yNQk9IDB4MUIsCisJVkNMSzE1NAkJPSAweDFDLAorCVZDTEsxNTdfNQk9IDB4MUQsCisJVkNMSzE2MgkJPSAweDFFCit9IGVQSVhFTF9DTE9DSzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVTSE9SVCAgICBIb3Jpem9udGFsVG90YWw7CisgICAgVVNIT1JUICAgIFZlcnRpY2FsVG90YWw7CisgICAgVVNIT1JUICAgIEhvcml6b250YWxBY3RpdmU7CisgICAgVVNIT1JUICAgIFZlcnRpY2FsQWN0aXZlOworICAgIEJZVEUgICAgICBSZWZyZXNoUmF0ZTsKKyAgICBkb3VibGUgICAgSG9yaXpvbnRhbEZyZXF1ZW5jeTsKKyAgICBVU0hPUlQgICAgSFN5bmNUaW1lOworICAgIFVTSE9SVCAgICBIQmFja1BvcmNoOworICAgIFVTSE9SVCAgICBWU3luY1RpbWU7CisgICAgVVNIT1JUICAgIFZCYWNrUG9yY2g7CisgICAgVVNIT1JUICAgIEhMZWZ0Qm9yZGVyOworICAgIFVTSE9SVCAgICBIUmlnaHRCb3JkZXI7CisgICAgVVNIT1JUICAgIFZCb3R0b21Cb3JkZXI7CisgICAgVVNIT1JUCSAgVlRvcEJvcmRlcjsKKwlVU0hPUlQJICBQaXhlbENsb2NrOworCUJPT0wJICBIb3JQb2xhcml0eTsKKwlCT09MCSAgVmVyUG9sYXJpdHk7CisgICAgQllURSAgICAgIEFEQ0luZGV4MTsKKyAgICBCWVRFICAgICAgQURDSW5kZXgyOworICAgIEJZVEUgICAgICBBRENJbmRleDM7CisgICAgQllURSAgICAgIEFEQ0luZGV4NTsKKyAgICBCWVRFICAgICAgQURDSW5kZXg2OworICAgIEJZVEUgICAgICBBRENJbmRleDc7CisgICAgQllURSAgICAgIEFEQ0luZGV4ODsKKyAgICBCWVRFICAgICAgQURDSW5kZXg5OworICAgIEJZVEUgICAgICBBRENJbmRleEE7CisgICAgQllURSAgICAgIEFEQ0luZGV4RjsKKyAgICBCWVRFICAgICAgQURDSW5kZXgxNTsKKyAgICBpbnQgICAgICAgSG9yaXpvbnRhbFNoaWZ0OworICAgIGludCAgICAgICBWZXJ0aWNhbFNoaWZ0OworfSBWRVNBX01PREU7CisKKyNkZWZpbmUgSE9SX1BPU0lUSVZFIDAKKyNkZWZpbmUgSE9SX05FR0FUSVZFIDEKKyNkZWZpbmUgVkVSX1BPU0lUSVZFIDAKKyNkZWZpbmUgVkVSX05FR0FUSVZFIDEKKworI2lmZGVmIFZFU0FfR0xPQkFMUworCisvLyAgTm90ZTogTW9kaWZpZWQgZm9yIG1vZGVzIHdoaWNoIGhhdmUgYm9yZGVyIGlzc3VlCitWRVNBX01PREUgdk1vZGVUYWJsZVtdID0geworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gNjBIeiBtb2RlCisvLyA3MjB4NDgwIGRvbmUKKyAgezEwNTYsIDQ5NywgIDcyMCwgIDQ4MCwgIDYwLCAyOS45MDAsIDg4LCAgMTA0LCAzLCAxMywgMCwgMCwgMCwgMCwJVkNMSzMxXzU3NCwgIEhPUl9ORUdBVElWRSwgVkVSX05FR0FUSVZFLCAweDQxLAkweEYwLCAweDQ4LCAweDA1LCAweDIwLCAweDU4LCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAgNiwJMn0sCisvLyA4NDh4NDgwIGRvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHsxMDY0LCA1MTcsICA4NDgsICA0ODAsICA2MCwgMzEuMTYwLCA4OCwgIDkxLCAgMywgMjYsIDAsIDAsIDAsIDAsCVZDTEszM18xNTQsICBIT1JfTkVHQVRJVkUsIFZFUl9ORUdBVElWRSwgMHg0MiwJMHg3MCwgMHg0OCwgMHgwNSwgMHgyMCwgMHg1OCwgMHg2MCwgMHg2MCwgMHg2MCwJMHg1RSwgMHhGRSwgIDYsCTJ9LAorICB7ODAwLCAgNTI1LCAgNjQwLCAgNDgwLCAgNjAsIDMxLjQ2OSwgOTYsICA0MCwgIDIsIDI1LCAxLCAxLCA4LCA4LAlWQ0xLMjVfMTc1LCAgSE9SX05FR0FUSVZFLCBWRVJfTkVHQVRJVkUsIDB4MzEsCTB4RjAsIDB4NDgsIDB4MDUsIDB4MjAsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NjAsCTB4NUUsIDB4RkUsICA2LAkyfSwKKy8vIDcyMHg1NzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgezkxMiwgIDU5NywgIDcyMCwgIDU3NiwgIDYwLCAzNS45MjAsIDcyLCAgODgsICAzLCAxNywgMCwgMCwgMCwgMCwJVkNMSzMyXzc2LCAgIEhPUl9ORUdBVElWRSwgVkVSX05FR0FUSVZFLCAweDM4LAkweEYwLCAweDQ4LCAweDA1LCAweDIwLCAweDQ4LCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAgNiwJMn0sCisvLyA5NjB4NjAwIEdURiBkb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHsxMjMyLCA2MjIsICA5NjAsICA2MDAsICA2MCwgMzcuMzIwLCA5NiwgIDEzNiwgMywgMTgsIDAsIDAsIDAsIDAsCVZDTEs0NV85NzgsICBIT1JfTkVHQVRJVkUsIFZFUl9ORUdBVElWRSwgMHg0QywJMHhGMCwgMHg2MCwgMHgwNSwgMHgyMCwgMHg2MCwgMHg2MCwgMHg2MCwgMHg2MCwJMHg1RSwgMHhGRSwgLTEsCTB9LAorICB7MTA1NiwgNjI4LCAgODAwLCAgNjAwLCAgNjAsIDM3Ljg3OSwgMTI4LCA4OCwgIDQsIDIzLCAwLCAwLCAwLCAwLAlWQ0xLNDAsCSAgICAgSE9SX1BPU0lUSVZFLCBWRVJfUE9TSVRJVkUsIDB4NDEsCTB4RjAsIDB4NjAsIDB4MDUsIDB4MjAsIDB4ODAsIDB4NjAsIDB4NjAsIDB4NjAsCTB4NUUsIDB4RkUsIC0xLAkwfSwKKy8vIDEwODh4NjEyIEdURiBkb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgezEzOTIsIDYzNCwgIDEwODgsIDYxMiwgIDYwLCAzOC4wNCwgIDExMiwgMTUyLCAzLCAxOCwgMCwgMCwgMCwgMCwJVkNMSzUyXzk1LCAgIEhPUl9ORUdBVElWRSwgVkVSX05FR0FUSVZFLCAweDU2LAkweEYwLCAweDYwLCAweDA1LCAweDIwLCAweDcwLCAweDYwLCAweDYwLCAweDYwLCAweDVFLCAweEZFLCAtMSwgMH0sCisvLyAxMjgweDcyMCBHVEYgZG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHsxNjY0LCA3NDYsICAxMjgwLCA3MjAsICA2MCwgNDQuNzYwLCAxMzYsIDE5MiwgMywgMjIsIDAsIDAsIDAsIDAsCVZDTEs3NF80OCwgICBIT1JfTkVHQVRJVkUsIFZFUl9ORUdBVElWRSwgMHg2NywJMHhGMCwgMHhBOCwgMHgwNSwgMHgyMCwgMHg4OCwgMHg2MCwgMHg2MCwgMHg2MCwgMHg1RSwgMHhGRSwgLTEsIDB9LAorLy8gMTM2MHg3NjggR1RGIGRvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB7MTc3NiwgNzk1LCAgMTM2MCwgNzY4LCAgNjAsIDQ3LjcwMCwgMTQ0LCAyMDgsIDMsIDIzLCAwLCAwLCAwLCAwLAlWQ0xLODRfNzE1LCAgSE9SX05FR0FUSVZFLCBWRVJfTkVHQVRJVkUsIDB4NkUsCTB4RjAsIDB4QTgsIDB4MDUsIDB4MjAsIDB4OTAsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NUUsIDB4RkUsICA3LCAxfSwKKy8vIDEyODB4NzY4IGRvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgezE2NjQsIDc5OCwgIDEyODAsIDc2OCwgIDYwLCA0Ny43MDAsIDEyOCwgMTg0LCA3LCAyMCwgMCwgMCwgMCwgMCwJVkNMSzc5XzM3MywgIEhPUl9ORUdBVElWRSwgVkVSX05FR0FUSVZFLCAweDY3LAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweDgwLCAweDYwLCAweDYwLCAweDYwLCAweDVFLCAweEZFLCAgNywgMX0sCisgIHsxMzQ0LCA4MDYsICAxMDI0LCA3NjgsICA2MCwgNDguMzYzLCAxMzYsIDE2MCwgNiwgMjksIDAsIDAsIDAsIDAsCVZDTEs2NSwJICAgICBIT1JfTkVHQVRJVkUsIFZFUl9ORUdBVElWRSwgMHg1MywJMHhGMCwgMHhBOCwgMHgwNSwgMHgyMCwgMHg4OCwgMHg2MCwgMHg2MCwgMHg2MCwJMHg1RSwgMHhGRSwgLTEsCTd9LAorLy8gMTI4MHg4MDAgR1RGIGRvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB7MTY4MCwgODI4LCAgMTI4MCwgODAwLCAgNjAsIDQ5LjY4MCwgMTM2LCAyMDAsIDMsIDI0LCAwLCAwLCAwLCAwLAlWQ0xLODNfNDYyLCAgSE9SX05FR0FUSVZFLCBWRVJfTkVHQVRJVkUsIDB4NjgsCTB4RjAsIDB4QTgsIDB4MDUsIDB4MjAsIDB4ODgsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NUUsIDB4RkUsIC0xLCAwfSwKKy8vIDExNTJ4ODY0IEdURiBkb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgezE1MjAsIDg5NSwgIDExNTIsIDg2NCwgIDYwLCA1My43MDAsIDEyMCwgMTg0LCAzLCAyNywgMCwgMCwgMCwgMCwJVkNMSzgxXzYyNCwgIEhPUl9ORUdBVElWRSwgVkVSX05FR0FUSVZFLCAweDVFLAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweDc4LCAweDYwLCAweDYwLCAweDYwLCAweDVFLCAweEZFLCAtMSwgMH0sCisvLyAxNjAweDkwMCBHVEYgZG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHsyMTI4LCA5MzIsICAxNjAwLCA5MDAsICA2MCwgNTUuOTIwLCAxNjgsIDI2NCwgMywgMjgsIDAsIDAsIDAsIDAsCVZDTEsxMTksCSBIT1JfTkVHQVRJVkUsIFZFUl9ORUdBVElWRSwgMHg4NCwJMHhGMCwgMHhBOCwgMHgwNSwgMHgyMCwgMHhBOCwgMHg2MCwgMHg2MCwgMHg2MCwgMHg1RSwgMHhGRSwgLTEsIDB9LAorLy8gMTQ0MFg5MDAgQ1ZUIGRvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB7MTkwNCwgOTMzLCAgMTQ0MCwgOTAwLCAgNjAsIDU1LjkzNSwgMTUyLCAyMzIsIDYsCTI1LAkwLCAwLCAwLCAwLAlWQ0xLMTA2XzUsICAgSE9SX05FR0FUSVZFLCBWRVJfUE9TSVRJVkUsIDB4NzYsCTB4RjAsIDB4QTgsIDB4MDUsIDB4MjAsIDB4OTYsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NUUsIDB4RkUsIC0xLCAwfSwKKyAgezE4MDAsIDEwMDAsIDEyODAsIDk2MCwgIDYwLCA2MC4wMDAsIDExMiwgMzEyLCAzLCAzNiwgMCwgMCwgMCwgMCwJVkNMSzEwOCwJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDcwLAkweDcwLCAweEE4LCAweDA1LCAweDIwLCAweDcwLCAweDYwLCAweDYwLCAweDYwLCAweDVFLCAweEZFLCAtMSwgMH0sCisvLyAxNjAweDEwMjQgR1RGIGRvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHsyMTQ0LCAxMDYwLCAxNjAwLCAxMDI0LCA2MCwgNjMuNjAwLCAxNjgsIDI3MiwgMywgMzIsIDAsIDAsIDAsIDAsCVZDTEsxMzZfMzU4LCBIT1JfTkVHQVRJVkUsIFZFUl9ORUdBVElWRSwgMHg4NSwJMHhGMCwgMHhFOCwgMHgwNSwgMHgyMCwgMHhBOCwgMHg2MCwgMHg2MCwgMHg2MCwJMHg1RSwgMHhGRSwgLTEsCTB9LAorICB7MTY4OCwgMTA2NiwgMTI4MCwgMTAyNCwgNjAsIDYzLjk4MSwgMTEyLCAyNDgsIDMsIDM4LCAwLCAwLCAwLCAwLAlWQ0xLMTA4LAkgSE9SX1BPU0lUSVZFLCBWRVJfUE9TSVRJVkUsIDB4NjksCTB4NzAsIDB4QTgsIDB4MDUsIDB4MjAsIDB4NzAsIDB4NjAsIDB4NjAsIDB4NjAsCTB4NUUsIDB4RkUsIC0xLAkwfSwKKy8vIDE2ODBYMTA1MCBDVlQgZG9uZSBSZWR1Y2VkIEJsYW5raW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB7MTg0MCwgMTA4MCwgMTY4MCwgMTA1MCwgNjAsIDY0LjY3NCwgMzIsICA4MCwJIDYsCTIxLAkwLCAwLCAwLCAwLAlWQ0xLMTE5LAkgSE9SX1BPU0lUSVZFLCBWRVJfTkVHQVRJVkUsIDB4NzIsCTB4RjAsIDB4QTgsIDB4MDUsIDB4MjAsIDB4MjAsIDB4NjAsIDB4NjAsIDB4NjAsCTB4NUUsIDB4RkUsIC0xLAkwfSwKKy8vIDE5MjBYMTIwMCBDVlQgZG9uZSBSZWR1Y2VkIEJsYW5raW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHsyMDgwLCAxMjM1LCAxOTIwLCAxMjAwLCA2MCwgNzQuMDM4LCAzMiwgIDgwLCAgNiwgMjYsIDAsIDAsIDAsIDAsIFZDTEsxNTQsICAgICBIT1JfUE9TSVRJVkUsIFZFUl9ORUdBVElWRSwgMHg4MSwJMHhGMCwgMHhBOCwgMHgwNSwgMHgyMCwgMHgyMCwgMHg2MCwgMHg2MCwgMHg2MCwJMHg1RSwgMHhGRSwgLTEsCTB9LAorICAvL3syMTYwLCAgICAgICAgICAgMTI1MCwgICAgICAgICAgIDE2MDAsICAgICAgICAgICAxMjAwLCA2MCw3NS4wMDAsICAgICAgICAgICAxOTIsICAgICAgICAzMDQsICAgICAgICAgMywgICAgICAgICAgNDYsICAgICAgICAgIDAsICAgICAgICAgICAgMCwgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIDAsCQkJVkNMSzE2MiwJCUhPUl9QT1NJVElWRSwJVkVSX1BPU0lUSVZFfSwKKyAgezIxNjAsIDEyNDgsIDE2MDAsIDEyMDAsIDYwLCA3NS4wMDAsIDE5MiwgMzA0LCAzLCA0NiwgMCwgMCwgMCwgMCwJVkNMSzE2MiwJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDg2LAkweEYwLCAweEU4LCAweDA1LCAweDIwLCAweEMwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgTm90IDYwSHogbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB7OTAwLCAgNDQ5LCAgNzIwLCAgNDAwLCAgNzAsIDMxLjQ2OSwgMTA4LCA0NSwgIDIsIDI1LCAxLCAxLCA4LCA4LAkwLAkJCSBIT1JfTkVHQVRJVkUsIFZFUl9ORUdBVElWRSwgMHgzOCwJMHgzMCwgMHg0OCwgMHgwNSwgMHgyMCwgMHg2QywgMHg2MCwgMHg2MCwgMHg2MCwJMHg1RSwgMHhGRSwgIDYsCTF9LAorICB7ODMyLCAgNTIwLCAgNjQwLCAgNDgwLCAgNzIsIDM3Ljg2MSwgNDAsICAxMjAsIDMsIDIwLCAxLCAxLCA4LCA4LAkwLAkJCSBIT1JfTkVHQVRJVkUsIFZFUl9ORUdBVElWRSwgMHgzMywJMHhGMCwgMHg0OCwgMHgwNSwgMHgyMCwgMHgyOCwgMHg2MCwgMHg2MCwgMHg2MCwJMHg1RSwgMHhGRSwgIDYsCTN9LAorICB7ODQwLCAgNTAwLCAgNjQwLCAgNDgwLCAgNzUsIDM3LjUwMCwgNjQsICAxMjAsIDMsIDE2LCAwLCAwLCAwLCAwLAkwLAkJCSBIT1JfTkVHQVRJVkUsIFZFUl9ORUdBVElWRSwgMHgzNCwJMHg3MCwgMHg0OCwgMHgwNSwgMHgyMCwgMHg0MCwgMHg2MCwgMHg2MCwgMHg2MCwJMHg1RSwgMHhGRSwgLTEsCTN9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHs4MzIsICA1MDksICA2NDAsICA0ODAsICA4NSwgNDMuMjY5LCA1NiwgIDgwLCAgMywgMjUsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9ORUdBVElWRSwgVkVSX05FR0FUSVZFLCAweDMzLAkweEYwLCAweDQ4LCAweDA1LCAweDIwLCAweDM4LCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJM30sCisgIHsxMDI0LCA2MjUsICA4MDAsICA2MDAsICA1NiwgMzUuMTU2LCA3MiwgIDEyOCwgMiwgMjIsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDNGLAkweEYwLCAweDYwLCAweDA1LCAweDIwLCAweDQ4LCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsxMDQwLCA2NjYsICA4MDAsICA2MDAsICA3MiwgNDguMDc3LCAxMjAsIDY0LCAgNiwgMjMsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDQwLAkweEYwLCAweDYwLCAweDA1LCAweDIwLCAweDc4LCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsxMDU2LCA2MjUsICA4MDAsICA2MDAsICA3NSwgNDYuODc1LCA4MCwgIDE2MCwgMywgMjEsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDQxLAkweEYwLCAweDYwLCAweDA1LCAweDIwLCAweDUwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsxMDQ4LCA2MzEsICA4MDAsICA2MDAsICA4NSwgNTMuNjc0LCA2NCwgIDE1MiwgMywgMjcsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDQxLAkweDcwLCAweDYwLCAweDA1LCAweDIwLCAweDQwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsxMzI4LCA4MDYsICAxMDI0LCA3NjgsICA3MCwgNTYuNDc2LCAxMzYsIDE0NCwgNiwgMjksIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9ORUdBVElWRSwgVkVSX05FR0FUSVZFLCAweDUyLAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweDg4LCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJN30sCisgIHsxMzEyLCA4MDAsICAxMDI0LCA3NjgsICA3NSwgNjAuMDIzLCA5NiwgIDE3NiwgMywgMjgsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDUxLAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweDYwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMX0sCisgIHsxMzc2LCA4MDgsICAxMDI0LCA3NjgsICA4NSwgNjguNjc3LCA5NiwgIDIwOCwgMywgMzYsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDU1LAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweDYwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMX0sCisgIHsxNjAwLCA5MDAsICAxMTUyLCA4NjQsICA3NSwgNjcuNTAwLCAxMjgsIDI1NiwgMywgMzIsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDYzLAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweDgwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsxNzI4LCAxMDExLCAxMjgwLCA5NjAsICA4NSwgODUuOTM4LCAxNjAsIDIyNCwgMywgNDcsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDZCLAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweEEwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsxNjg4LCAxMDY2LCAxMjgwLCAxMDI0LCA3NSwgNzkuOTc2LCAxNDQsIDI0OCwgMywgMzgsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDY5LAkweDcwLCAweEU4LCAweDA1LCAweDIwLCAweDkwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsxNzI4LCAxMDcyLCAxMjgwLCAxMDI0LCA4NSwgOTEuMTQ2LCAxNjAsIDIyNCwgMywgNDQsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDZCLAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweEEwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsyMTYwLCAxMjUwLCAxNjAwLCAxMjAwLCA2NSwgODEuMjUwLCAxOTIsIDMwNCwgMywgNDYsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDg2LAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweEMwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsyMTYwLCAxMjUwLCAxNjAwLCAxMjAwLCA3MCwgODcuNTAwLCAxOTIsIDMwNCwgMywgNDYsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDg2LAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweEMwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsyMTYwLCAxMjUwLCAxNjAwLCAxMjAwLCA3NSwgOTMuNzUwLCAxOTIsIDMwNCwgMywgNDYsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDg2LAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweEMwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0sCisgIHsyMTYwLCAxMjUwLCAxNjAwLCAxMjAwLCA4NSwgMTA2LjI1MCwxOTIsIDMwNCwgMywgNDYsIDAsIDAsIDAsIDAsCTAsCQkJIEhPUl9QT1NJVElWRSwgVkVSX1BPU0lUSVZFLCAweDg2LAkweEYwLCAweEE4LCAweDA1LCAweDIwLCAweEMwLCAweDYwLCAweDYwLCAweDYwLAkweDVFLCAweEZFLCAtMSwJMH0KK307CisKK1VTSE9SVCAgTW9kZU51bWJlckNvdW50ID0gc2l6ZW9mICh2TW9kZVRhYmxlKSAvIHNpemVvZiAoVkVTQV9NT0RFKTsKK1VTSE9SVCAgTW9kZTYwSFpDb3VudCA9IDIxOworCisjZWxzZSAgLyogTk9UIFZFU0FfR0xPQkFMUyAqLworZXh0ZXJuIFZFU0FfTU9ERSB2TW9kZVRhYmxlW107CitleHRlcm4gVVNIT1JUICBNb2RlTnVtYmVyQ291bnQ7CitleHRlcm4gVVNIT1JUICBNb2RlNjBIWkNvdW50OworI2VuZGlmCisKKyNlbmRpZiAvKiBfVkVTQV9IXyAqLworCisKZGlmZiAtLWdpdCBhL2JvYXJkL2FzcGVlZC9hc3QyNDAwL3ZmdW4uYyBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL3ZmdW4uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNzA3ZTgwCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDI0MDAvdmZ1bi5jCkBAIC0wLDAgKzEsNTQ1IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNkZWZpbmUgQlVGX0dMT0JBTFMKKyNpbmNsdWRlICJ0eXBlLmgiCisjaW5jbHVkZSAidmRlZi5oIgorI2luY2x1ZGUgInZyZWcuaCIKKyNpbmNsdWRlICJjcnQuaCIKKyNpbmNsdWRlICJ2ZnVuLmgiCisKK1VMT05HIFVubG9ja1NDVVJlZ0hvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgS2V5KQoreworICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoU0NVX0JBU0UsIFNDVV9QUk9URUNUX1JFRywgS2V5KTsKKyAgICByZXR1cm4gUmVhZE1lbW9yeUxvbmdIb3N0KFNDVV9CQVNFLFNDVV9QUk9URUNUX1JFRyk7Cit9CisKK3ZvaWQgUmVzZXRWaWRlb0hvc3Qodm9pZCkKK3sKKwlXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoU0NVX0JBU0UsIFNDVV9DT05UUk9MX1JFRywgVklERU9fUkVTRVRfRU4gPDwgVklERU9fRU5HSU5FX1JFU0VUX0JJVCwgVklERU9fRU5HSU5FX1JFU0VUX01BU0spOworCVdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgU0NVX0NPTlRST0xfUkVHLCBWSURFT19SRVNFVF9PRkYgPDwgVklERU9fRU5HSU5FX1JFU0VUX0JJVCwgVklERU9fRU5HSU5FX1JFU0VUX01BU0spOworfQorCit2b2lkIFN0YXJ0TW9kZURldGVjdGlvblRyaWdnZXJIb3N0KFVMT05HICAgTU1JT0Jhc2UsIFVMT05HIG9mZnNldCkKK3sKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIG9mZnNldCwgMCwgTU9ERV9ERVRFQ1RJT05fVFJJR0dFUik7CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBvZmZzZXQsIE1PREVfREVURUNUSU9OX1RSSUdHRVIsIE1PREVfREVURUNUSU9OX1RSSUdHRVIpOworfQorCitCT09MIFJlYWRWaWRlb0ludGVycnVwdEhvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgdmFsdWUpCit7CisgICAgcmV0dXJuICgoUmVhZE1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFT19JTlRfQ09OVFJPTF9SRUFEX1JFRykgJiB2YWx1ZSkgPyBUUlVFIDogRkFMU0UpOworfQorCitVTE9ORyBVbmxvY2tWaWRlb1JlZ0hvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgS2V5KQoreworICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIEtFWV9DT05UUk9MX1JFRywgS2V5KTsKKyAgICByZXR1cm4gUmVhZE1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLEtFWV9DT05UUk9MX1JFRyk7Cit9CisKK3ZvaWQgU3RhcnRWaWRlb0NhcHR1cmVUcmlnZ2VySG9zdChVTE9ORyAgIE1NSU9CYXNlLCBVTE9ORyBvZmZzZXQpCit7CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBvZmZzZXQsIDAsIFZJREVPX0NBUFRVUkVfVFJJR0dFUik7CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBvZmZzZXQsIFZJREVPX0NBUFRVUkVfVFJJR0dFUiwgVklERU9fQ0FQVFVSRV9UUklHR0VSKTsKK30KKwordm9pZCBTdGFydFZpZGVvQ29kZWNUcmlnZ2VySG9zdChVTE9ORyAgIE1NSU9CYXNlLCBVTE9ORyBvZmZzZXQpCit7CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBvZmZzZXQsIDAsIFZJREVPX0NPREVDX1RSSUdHRVIpOworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgb2Zmc2V0LCBWSURFT19DT0RFQ19UUklHR0VSLCBWSURFT19DT0RFQ19UUklHR0VSKTsKK30KKwordm9pZCBTdG9wTW9kZURldGVjdGlvblRyaWdnZXJIb3N0KFVMT05HICAgTU1JT0Jhc2UsIFVMT05HIG9mZnNldCkKK3sKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIG9mZnNldCwgMCwgTU9ERV9ERVRFQ1RJT05fVFJJR0dFUik7Cit9CisKK3ZvaWQgQ2xlYXJWaWRlb0ludGVycnVwdEhvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgdmFsdWUpCit7CisgICAgLy9Xcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPX0lOVF9DT05UUk9MX0NMRUFSX1JFRywgdmFsdWUsIHZhbHVlKTsKKwlXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFT19JTlRfQ09OVFJPTF9DTEVBUl9SRUcsIHZhbHVlKTsKK30KKworLyogVW5Mb2NrIFNDVSBIb3N0IGFuZCBSZXNldCBFbmdpbmUgKi8KK0JPT0wgQ2hlY2tPblN0YXJ0SG9zdCh2b2lkKQoreworICAgIGludCBpPTAsIGR3VmFsdWU9MDsKKyAgICAKKyAgICBkbworICAgIHsKKwlkd1ZhbHVlID0gVW5sb2NrU0NVUmVnSG9zdCgwLCBTQ1VfVU5MT0NLX0tFWSk7CisJaSsrOworICAgIH0KKyAgICB3aGlsZSAoKFNDVV9XUklURV9FTkFCTEUgIT0gZHdWYWx1ZSkgJiYgKGk8MTApKTsKKworICAgIC8vQ2xlYXIgU0NVIFJlc2V0IFJlZ2lzdGVyCisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChTQ1VfQkFTRSwgU0NVX0NPTlRST0xfUkVHLCAwKTsKKworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgU0NVX0NMT0NLX1NUT1BfUkVHLCAoRU5fRUNMSyB8IEVOX1YxQ0xLIHwgRU5fVjJDTEspLCAoU1RPUF9FQ0xLX01BU0sgfCBTVE9QX1YxQ0xLX01BU0sgfCBTVE9QX1YyQ0xLX01BU0spKTsKKworI2lmCWRlZmluZWQoQ09ORklHX0FTVDIzMDApCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFNDVV9CQVNFLCAoMHg5MCArIFNDVV9PRkZTRVQpLCAweDAwMDAwMDIwLCAweDAwMDAwMDMwKTsJLy9lbmFibGUgMjRiaXRzCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFNDVV9CQVNFLCAoMHg4OCArIFNDVV9PRkZTRVQpLCAweDAwMGZmZjAwLCAweDAwMGZmZjAwKTsJLy9lbmFibGUgdmlkZW8gbXVsdGktcGlucyAgICAKKyNlbHNlCS8vQVNUMjEwMCAKKyAgICAvL1dyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgU0NVX1BJTl9DVFJMMV9SRUcsIChWSURFT19QT1JUQV9FTiB8IFZJREVPX1BPUlRCX0VOIHwgVklERU9fVlAxX0VOIHwgVklERU9fVlAyX0VOKSAsIAorICAgIC8vCQkJCQkJCShWSURFT19QT1JUQV9NQVNLIHwgVklERU9fUE9SVEJfTUFTSyB8IFZJREVPX1ZQMV9NQVNLIHwgVklERU9fVlAyX01BU0spKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoU0NVX0JBU0UsIFNDVV9QSU5fQ1RSTDJfUkVHLCAoVklERU9fUE9SVEFfU0lOR0xFX0VER0UgfCBWSURFT19QT1JUQl9TSU5HTEVfRURHRSkgLCAKKwkgICAgICAJCQkJCQkgICAgIChWSURFT19QT1JUQV9TSU5HTEVfRURHRV9NQVNLIHwgVklERU9fUE9SVEJfU0lOR0xFX0VER0VfTUFTSykpOworI2VuZGlmCSAgICAgIAkJCQkJCSAgICAgCisKKyAgICBSZXNldFZpZGVvSG9zdCgpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK0JPT0wgQ2hlY2tPblN0YXJ0Q2xpZW50KHZvaWQpCit7CisJaW50IGk9MCwgZHdWYWx1ZT0wOworICAgIAorCWRvCisJeworCQlkd1ZhbHVlID0gVW5sb2NrU0NVUmVnSG9zdCgwLCBTQ1VfVU5MT0NLX0tFWSk7CisJCWkrKzsKKwl9CisJd2hpbGUgKChTQ1VfV1JJVEVfRU5BQkxFICE9IGR3VmFsdWUpICYmIChpPDEwKSk7CisKKwkvL0NsZWFyIFNDVSBSZXNldCBSZWdpc3RlcgorCVdyaXRlTWVtb3J5TG9uZ0NsaWVudChTQ1VfQkFTRSwgU0NVX0NPTlRST0xfUkVHLCAwKTsKKworCVdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLQ2xpZW50KFNDVV9CQVNFLCBTQ1VfQ0xPQ0tfU1RPUF9SRUcsIChFTl9FQ0xLIHwgRU5fVjFDTEsgfCBFTl9EMUNMSyB8IEVOX0QyQ0xLIHwgRU5fVjJDTEspLCAKKwkJCQkJCQkJICAoU1RPUF9FQ0xLX01BU0sgfCBTVE9QX0QxQ0xLX01BU0sgfCBTVE9QX0QyQ0xLX01BU0sgfCBTVE9QX1YxQ0xLX01BU0sgfCBTVE9QX1YyQ0xLX01BU0spKTsKKworCS8vV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoU0NVX0JBU0UsIFNDVV9DTE9DS19TRUxFQ1RJT05fUkVHLCBQT1JUQl9GUk9NX0QyQ0xLIHwgUE9SVEJfQ0xPQ0tfSU5WX0RFTEFZXzNOUyB8IFBPUlRBX0NMT0NLX0lOVl9ERUxBWV8zTlMsIFBPUlRCX0NMT0NLX1NFTCB8IFBPUlRCX0NMT0NLX0RFTEFZX01BU0sgfCBQT1JUQV9DTE9DS19ERUxBWV9NQVNLKTsKKwkvL0ExRVZBCisJV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoU0NVX0JBU0UsIFNDVV9DTE9DS19TRUxFQ1RJT05fUkVHLCAoUE9SVEJfRlJPTV9EMkNMSyB8IFBPUlRCX0NMT0NLX0lOVl9ERUxBWV8xTlMgfCBQT1JUQV9DTE9DS19JTlZfREVMQVlfMU5TKSwgKFBPUlRCX0NMT0NLX1NFTCB8IFBPUlRCX0NMT0NLX0RFTEFZX01BU0sgfCBQT1JUQV9DTE9DS19ERUxBWV9NQVNLKSk7CisJV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoU0NVX0JBU0UsIDB4MjAyQywgKDB4MDM8PDkpLCAoMHgwMzw8OSkpOworCisJV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoU0NVX0JBU0UsIFNDVV9QSU5fQ1RSTDFfUkVHLCAoVklERU9fUE9SVEFfRU4gfCBWSURFT19QT1JUQl9FTiB8IFZJREVPX1ZQMV9FTiB8IFZJREVPX1ZQMl9FTiksIAorCQkJCQkJCQkgIChWSURFT19QT1JUQV9NQVNLIHwgVklERU9fUE9SVEJfTUFTSyB8IFZJREVPX1ZQMV9NQVNLIHwgVklERU9fVlAyX01BU0spKTsKKworI2lmIENPTkZJR19BU1QzMDAwCisJV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoU0NVX0JBU0UsIFNDVV9QSU5fQ1RSTDJfUkVHLCAoVklERU9fUE9SVEFfRFVBTF9FREdFIHwgVklERU9fUE9SVEJfRFVBTF9FREdFKSwgCisJCQkJCQkJCSAgKFZJREVPX1BPUlRBX1NJTkdMRV9FREdFX01BU0sgfCBWSURFT19QT1JUQl9TSU5HTEVfRURHRV9NQVNLKSk7CisjZWxzZQorCS8vMjEwMCBpcyBzaW5nbGUgZWRnZQorCVdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLQ2xpZW50KFNDVV9CQVNFLCBTQ1VfUElOX0NUUkwyX1JFRywgKFZJREVPX1BPUlRBX1NJTkdMRV9FREdFIHwgVklERU9fUE9SVEJfU0lOR0xFX0VER0UpLCAKKwkJCQkJCQkJICAoVklERU9fUE9SVEFfU0lOR0xFX0VER0VfTUFTSyB8IFZJREVPX1BPUlRCX1NJTkdMRV9FREdFX01BU0spKTsKKyNlbmRpZgorCisJV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoU0NVX0JBU0UsIFNDVV9DTE9DS19TVE9QX1JFRywgKEVOX0QxQ0xLIHwgRU5fRDJDTEspLCAoU1RPUF9EMUNMS19NQVNLIHwgU1RPUF9EMkNMS19NQVNLKSk7CisJV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoU0NVX0JBU0UsIFNDVV9QSU5fQ1RSTDFfUkVHLCBWR0FfUElOX09GRiwgVkdBX1BJTl9NQVNLKTsKKworICAgIC8vUmVzZXRWaWRlb0hvc3QoKTsKKworCXJldHVybiBUUlVFOworfQorCitVTE9ORyAgSW5pdGlhbGl6ZVZpZGVvRW5naW5lSG9zdCAoVUxPTkcgICAgICAgICAgICAgICAgTU1JT0Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgblZpZGVvLAorCQkJCQkJCSAgIEJPT0wJCQkJCUhvclBvbGFyaXR5LAorCQkJCQkJCSAgIEJPT0wJCQkJCVZlclBvbGFyaXR5KQoreworICAgIC8vVUxPTkcgICB0ZW1wLCB0ZW1wMSwgdGVtcDI7IAorICAgIFVMT05HICAgZHdSZWdPZmZzZXQgPSBuVmlkZW8gKiAweDEwMDsKKyAgICBVTE9ORyAgIGR3VmFsdWU7CisgICAgaW50ICAgICBpOworCisKKyAgICAvKiBHZW5lcmFsIFZpZGVvIENvbnRyb2wgKi8KKyAgICAvL0xpbmVCdWZFbiAwCisgICAgLy9kd1ZhbHVlID0gKENPTVBSRVNTX01PREUgPDwgQ09ERUNfREVDT01QUkVTU19NT0RFX0JJVCkgfCBERUxBWV9WU1lOQ19FTjsKKyAgICBkd1ZhbHVlID0gMDsKKyAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFT19DT05UUk9MX1JFRywgZHdWYWx1ZSk7CisgICAgLy9WaWRlbyBEYXRhIFRydW5jYXRpb24gUmVnaXN0ZXIKKwlXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCAweDMyOCwgMCk7CisKKwkvL0QyQ0xLIGNsb2NrIG11c3QgY29uZmlnIGFjY29yZGluZyB0byB2aWRlbydzIGxpbmUgYnVmZmVyCisJaWYgKFZJREVPMSA9PSBuVmlkZW8pCisJICAgIGR3VmFsdWUgPSBMSU5FX0JVRkZFUl9WSURFTzE7CisgICAgZWxzZQorICAgICAgICBkd1ZhbHVlID0gTElORV9CVUZGRVJfVklERU8yOworICAgIAorCS8vRDJDTEsgY2xvY2sgbXVzdCBjb25maWcgYWNjb3JkaW5nIHRvIHZpZGVvJ3MgbGluZSBidWZmZXIKKwlzd2l0Y2ggKGR3VmFsdWUpCisJeworCWNhc2UgTElORV9CVUZGRVJfT0ZGOgorCQlXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoU0NVX0JBU0UsIFNDVV9DTE9DS19TRUxFQ1RJT05fUkVHLCBOT1JNQUxfQ1JUMSwgRDJDTEtfQ0xPQ0tfU0VMRUNUSU9OX01BU0spOworCQlXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoU0NVX0JBU0UsIFNDVV9DTE9DS19TVE9QX1JFRywgU1RPUF9EMkNMSywgU1RPUF9EMkNMS19NQVNLKTsKKwkJYnJlYWs7CisJY2FzZSBMSU5FX0JVRkZFUl9WSURFTzE6CisJCVdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgU0NVX0NMT0NLX1NFTEVDVElPTl9SRUcsIFYxQ0xLX1ZJREVPMSA8PCBEMkNMS19DTE9DS19TRUxFQ1RJT05fQklULCBEMkNMS19DTE9DS19TRUxFQ1RJT05fTUFTSyk7CisJCVdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgU0NVX0NMT0NLX1NUT1BfUkVHLCBFTl9EMkNMSywgU1RPUF9EMkNMS19NQVNLKTsKKwkJYnJlYWs7CisJY2FzZSBMSU5FX0JVRkZFUl9WSURFTzI6CisJCVdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgU0NVX0NMT0NLX1NFTEVDVElPTl9SRUcsIFYxQ0xLX1ZJREVPMiA8PCBEMkNMS19DTE9DS19TRUxFQ1RJT05fQklULCBEMkNMS19DTE9DS19TRUxFQ1RJT05fTUFTSyk7CisJCVdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgU0NVX0NMT0NLX1NUT1BfUkVHLCBFTl9EMkNMSywgU1RPUF9EMkNMS19NQVNLKTsKKwkJYnJlYWs7CisJY2FzZSBMSU5FX0JVRkZFUl9WSURFT006CisJCS8vSWYgc2VsZWN0IHRoaXMgb3B0aW9uLCBpdCB3aWxsIGNvbmZpZyBhdCB2aWRlb00gSU5JVAorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKyAgICBkd1ZhbHVlID0gMDsKKyAgICAvL1ZSMzAgbm93IGlzIGNhcHR1cmUgd2luZG93IGluIHRoZSBjb21wcmVzc2lvbgorICAgIGR3VmFsdWUgPSBnX0RlZkhlaWdodCA8PCBDQVBUVVJFX1ZFUl9MSU5FX0JJVCB8CisgICAgZ19EZWZXaWR0aCA8PCBDQVBUVVJFX0hPUl9QSVhFTF9CSVQ7CisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0NBUFRVUkVfV0lORE9XU19SRUcgKyBkd1JlZ09mZnNldCwgZHdWYWx1ZSk7ICAgICAgICAKKworICAgIGR3VmFsdWUgPSAwOworICAgIC8vVlIzNCBub3cgaXMgZGVzdGlvbmF0aW9uIHdpbmRvdyBpbiB0aGUgY29tcHJlc3Npb24KKwlkd1ZhbHVlID0gZ19EZWZIZWlnaHQgPDwgQ09NUFJFU1NfVkVSX0xJTkVfQklUIHwKKwlnX0RlZldpZHRoIDw8IENPTVBSRVNTX0hPUl9QSVhFTF9CSVQ7CisKKyAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfQ09NUFJFU1NfV0lORE9XU19SRUcgKyBkd1JlZ09mZnNldCwgZHdWYWx1ZSk7ICAgICAgICAKKworICAgIC8vQml0Q09VTlQgYWNjb3JkaW5nIGNvbXByZXNzIGRhdGEgZm9ybWF0CisgICAgZHdWYWx1ZSA9IFlVVjQ0NF9NT0RFOworCWlmIChZVVY0NDRfTU9ERSA9PSBkd1ZhbHVlKQorCQlXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9CVUZfTElORV9PRkZTRVRfUkVHICsgZHdSZWdPZmZzZXQsIGdfRGVmV2lkdGggKiBJTlBVVF9CSVRDT1VOVF9ZVVY0NDQsIEJVRl9MSU5FX09GRlNFVF9NQVNLKTsKKwllbHNlCisJCVdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0JVRl9MSU5FX09GRlNFVF9SRUcgKyBkd1JlZ09mZnNldCwgZ19EZWZXaWR0aCAqIElOUFVUX0JJVENPVU5UX1lVVjQyMCwgQlVGX0xJTkVfT0ZGU0VUX01BU0spOworICAgICAgICAgICAgICAKKyAgICAvLyAgQ1JDCisgICAgLy9EaXNhYmxlCisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU9fQ1JDX1BSSU1BUllfUkVHLCAweDApOyAgICAKKyAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFT19DUkNfU0VDT05EX1JFRywgMHgwKTsKKyAgICAKKyAgICAvKiBTZXF1ZW5jZSBDb250cm9sIHJlZ2lzdGVyICovCisJLy9Pb25seSBFbmNvZGVyIG5lZWQgdG8gc2V0CisJLyogRW5naW5lIFNlcXVlbmNlIENvbnRvbCBSZWdpc3RlciAqLworCWR3VmFsdWUgPSAoV0FUQ0hfRE9HX0VOIDw8IFdBVENIX0RPR19FTkFCTEVfQklUKSB8CisJICAgICAgICAgICAgVklERU9fQ0FQVFVSRV9BVVRPX01PREUgfAorCSAgICAgICAgICAgIFZJREVPX0NPREVDX0FVVE9fTU9ERTsKKyAgICAKKyAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfRU5HSU5FX1NFUVVFTkNFX0NPTlRST0xfUkVHICsgZHdSZWdPZmZzZXQsIGR3VmFsdWUpOworICAgIAorICAgIC8qIENvbnRyb2wgcmVnaXN0ZXIgKi8KKwlkd1ZhbHVlID0gKEhPUl9ORUdBVElWRSA9PSBIb3JQb2xhcml0eSkgPyBOT19JTlZFUlNFX1BPTCA6IElOVkVSU0VfUE9MOworCWR3VmFsdWUgPSAoKChWRVJfTkVHQVRJVkUgPT0gVmVyUG9sYXJpdHkpID8gTk9fSU5WRVJTRV9QT0wgOiBJTlZFUlNFX1BPTCkgPDwgVklERU9fVlNZTkNfUE9MQVJJVFlfQklUKSB8IGR3VmFsdWU7CisgICAgCisJLyogSFcgUmVjb21tYW5kKi8KKwkvL2R3VmFsdWUgPSAoVElMRV9NT0RFIDw8IDkpIHwgZHdWYWx1ZTsKKwlkd1ZhbHVlID0gKEVYVEVSTkFMX1ZHQV9TT1VSQ0UgPDwgRVhURVJOQUxfU09VUkNFX0JJVCkgfCBkd1ZhbHVlOworICAgIAorICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9DT05UUk9MX1JFRyArIGR3UmVnT2Zmc2V0LCBkd1ZhbHVlKTsKKyAgICAgICAgCisgICAgLyogQkNEIHJlZ2lzdGVyICovCisgICAgLy9OTyBCQ0QKKyAgICBkd1ZhbHVlID0gMDsKKyAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfQkNEX0NPTlRST0xfUkVHICsgZHdSZWdPZmZzZXQsIGR3VmFsdWUpOworCisgICAgLyogU3RyZWFtIEJ1ZmZlciBTaXplIHJlZ2lzdGVyICovCisgICAgZHdWYWx1ZSA9IChZVVZfVEVTVCA8PCBTS0lQX1RFU1RfTU9ERV9CSVQpIHwKKyAgICAgICAgICAgICAgICAoUEFDS0VUX1NJWkVfMzJLQiA8PCBTVFJFQU1fUEFDS0VUX1NJWkVfQklUKSB8CisgICAgICAgICAgICAgICAgKFBBQ0tFVFNfOCA8PCBSSU5HX0JVRl9QQUNLRVRfTlVNX0JJVCk7CisgICAgLyogdGhlIHNhbWUgd2l0aCBWaWRlbzEsIFZpZGVvMiwgYW5kIFZpZGVvTSovCisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX1NUUkVBTV9CVUZfU0laRSwgZHdWYWx1ZSk7CisKKyAgICAvKiBDb21yZXNzaW9uIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyAgICBkd1ZhbHVlID0gKFVTRV9VVl9DSVI2NTYgPDwgVVZfQ0lSNjU2X0ZPUk1BVF9CSVQpfAorICAgICAgICAgICAgICAgIChKUEVHX01JWF9NT0RFIDw8IEpQRUdfT05MWV9CSVQpfAorICAgICAgICAgICAgICAgIChWUV80X0NPTE9SX01PREUgPDwgVlFfNF9DT0xPUl9CSVQpfAorICAgICAgICAgICAgICAgIChRVUFOVElfQ09ERUNfTU9ERSA8PCBRVUFMSVRZX0NPREVDX1NFVFRJTkdfQklUKXwKKyAgICAgICAgICAgICAgICAoNyA8PCBOT1JNQUxfUVVBTlRJX0NIUk9NSV9UQUJMRV9CSVQpIHwKKyAgICAgICAgICAgICAgICAoMjMgPDwgTk9STUFMX1FVQU5USV9MVU1JX1RBQkxFX0JJVCk7CisgICAKKyAgICAvL1ZpZGVvMiBoYXZlIHNhbWUgdmFsdWUgYXMgdmlkZW8xCisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0NPTVBSRVNTX0NPTlRST0xfUkVHLCBkd1ZhbHVlKTsKKworICAgIC8qIEpQRUcgUXVhbnRpemF0aW9uIFRhYmxlIHJlZ2lzdGVyICovCisgICAgZHdWYWx1ZSA9IDA7CisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX1FVQU5USV9UQUJMRV9MT1dfUkVHLCBkd1ZhbHVlKTsKKyAgICAKKyAgICAvKiBRdWFudGl6YXRpb24gdmFsdWUgcmVnaXN0ZXIgKi8KKyAgICAvL1ZpZGVvMiBoYXZlIHNhbWUgdmFsdWUgYXMgdmlkZW8xCisgICAgZHdWYWx1ZSA9IDA7CisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX1FVQU5USV9WQUxVRV9SRUcsIGR3VmFsdWUpOworCisgICAgLy9WaWRlbyBCU0QgUGFyYW1ldGVyIFJlZ2lzdGVyCisgICAgLy9WaWRlbzIgaGF2ZSBzYW1lIHZhbHVlIGFzIHZpZGVvMQorICAgIGR3VmFsdWUgPSAwOworICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9CU0RfUEFSQV9SRUcsIGR3VmFsdWUpOworCisgICAgLy9ubyBzY2FsZQorICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9TQ0FMRV9GQUNUT1JfUkVHLCAgMHgxMDAwMTAwMCk7CisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX1NDQUxFX0ZBQ1RPUl9QQVJBTUVURVIwX1JFRywgMHgwMDIwMDAwMCk7CisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX1NDQUxFX0ZBQ1RPUl9QQVJBTUVURVIxX1JFRywgMHgwMDIwMDAwMCk7CisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX1NDQUxFX0ZBQ1RPUl9QQVJBTUVURVIyX1JFRywgMHgwMDIwMDAwMCk7CisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX1NDQUxFX0ZBQ1RPUl9QQVJBTUVURVIzX1JFRywgMHgwMDIwMDAwMCk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKK1VMT05HICBJbml0aWFsaXplVmlkZW9FbmdpbmVDbGllbnQgKFVMT05HICAgICAgICAgICAgICAgIE1NSU9CYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIG5WaWRlbykKK3sKKyAgICAvL1VMT05HICAgdGVtcCwgdGVtcDEsIHRlbXAyOyAKKyAgICBVTE9ORyAgIGR3UmVnT2Zmc2V0ID0gblZpZGVvICogMHgxMDA7CisgICAgVUxPTkcgICBkd1ZhbHVlOworICAgIGludCAgICAgaTsKKworCisgICAgLyogR2VuZXJhbCBWaWRlbyBDb250cm9sICovCisgICAgLy9MaW5lQnVmRW4gMAorICAgIGR3VmFsdWUgPSAoREVDT01QUkVTU19NT0RFIDw8IENPREVDX0RFQ09NUFJFU1NfTU9ERV9CSVQpOworICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPX0NPTlRST0xfUkVHLCBkd1ZhbHVlKTsKKyAgICAvL1ZpZGVvIERhdGEgVHJ1bmNhdGlvbiBSZWdpc3RlcgorCVdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIDB4MzI4LCAwKTsKKworICAgIC8vVlIzMCBub3cgaXMgY2FwdHVyZSB3aW5kb3cgaW4gdGhlIGNvbXByZXNzaW9uCisgICAgZHdWYWx1ZSA9IGdfRGVmSGVpZ2h0IDw8IENBUFRVUkVfVkVSX0xJTkVfQklUIHwKKyAgICBnX0RlZldpZHRoIDw8IENBUFRVUkVfSE9SX1BJWEVMX0JJVDsKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9DQVBUVVJFX1dJTkRPV1NfUkVHICsgZHdSZWdPZmZzZXQsIGR3VmFsdWUsIENBUFRVUkVfVkVSX0xJTkVfTUFTSyB8IENBUFRVUkVfSE9SX1BJWEVMX01BU0spOyAgICAgICAgCisKKyAgICAvL1ZSMzQgbm93IGlzIGRlc3Rpb25hdGlvbiB3aW5kb3cgaW4gdGhlIGNvbXByZXNzaW9uCisJZHdWYWx1ZSA9IGdfRGVmSGVpZ2h0IDw8IENPTVBSRVNTX1ZFUl9MSU5FX0JJVCB8CisJZ19EZWZXaWR0aCA8PCBDT01QUkVTU19IT1JfUElYRUxfQklUOworCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfQ09NUFJFU1NfV0lORE9XU19SRUcgKyBkd1JlZ09mZnNldCwgZHdWYWx1ZSwgQ09NUFJFU1NfVkVSX0xJTkVfTUFTSyB8IENPTVBSRVNTX0hPUl9QSVhFTF9NQVNLKTsgICAgICAgIAorCisgICAgLy9CaXRDT1VOVCBhY2NvcmRpbmcgY29tcHJlc3MgZGF0YSBmb3JtYXQKKyAgICBkd1ZhbHVlID0gWVVWNDQ0X01PREU7CisJaWYgKFlVVjQ0NF9NT0RFID09IGR3VmFsdWUpCisJCVdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0JVRl9MSU5FX09GRlNFVF9SRUcgKyBkd1JlZ09mZnNldCwgZ19EZWZXaWR0aCAqIElOUFVUX0JJVENPVU5UX1lVVjQ0NCwgQlVGX0xJTkVfT0ZGU0VUX01BU0spOworCWVsc2UKKwkJV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfQlVGX0xJTkVfT0ZGU0VUX1JFRyArIGR3UmVnT2Zmc2V0LCBnX0RlZldpZHRoICogSU5QVVRfQklUQ09VTlRfWVVWNDIwLCBCVUZfTElORV9PRkZTRVRfTUFTSyk7CisgICAgICAgICAgICAgIAorICAgIC8vICBDUkMKKyAgICAvL0Rpc2FibGUKKyAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFT19DUkNfUFJJTUFSWV9SRUcsIDB4MCk7ICAgIAorICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPX0NSQ19TRUNPTkRfUkVHLCAweDApOworICAgIAorICAgIC8qIFNlcXVlbmNlIENvbnRyb2wgcmVnaXN0ZXIgKi8KKwkvL09vbmx5IEVuY29kZXIgbmVlZCB0byBzZXQKKwkvKiBFbmdpbmUgU2VxdWVuY2UgQ29udG9sIFJlZ2lzdGVyICovCisgICAgZHdWYWx1ZSA9IFZJREVPX0NBUFRVUkVfQVVUT19NT0RFIHwKKyAgICAgICAgVklERU9fQ09ERUNfQVVUT19NT0RFOworICAgIAorICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9FTkdJTkVfU0VRVUVOQ0VfQ09OVFJPTF9SRUcgKyBkd1JlZ09mZnNldCwgZHdWYWx1ZSk7CisgICAgCisgICAgLyogQ29udHJvbCByZWdpc3RlciAqLworCS8qIEhXIFJlY29tbWFuZCovCisJZHdWYWx1ZSA9IChUSUxFX01PREUgPDwgOSk7IAkKKyAgICAKKyAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfQ09OVFJPTF9SRUcgKyBkd1JlZ09mZnNldCwgZHdWYWx1ZSk7CisgICAgICAgIAorICAgIC8qIEJDRCByZWdpc3RlciAqLworICAgIC8vTk8gQkNECisgICAgZHdWYWx1ZSA9IDA7CisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0JDRF9DT05UUk9MX1JFRyArIGR3UmVnT2Zmc2V0LCBkd1ZhbHVlKTsKKworICAgIC8qIFN0cmVhbSBCdWZmZXIgU2l6ZSByZWdpc3RlciAqLworICAgIGR3VmFsdWUgPSAoWVVWX1RFU1QgPDwgU0tJUF9URVNUX01PREVfQklUKSB8CisgICAgICAgICAgICAgICAgKFBBQ0tFVF9TSVpFXzMyS0IgPDwgU1RSRUFNX1BBQ0tFVF9TSVpFX0JJVCkgfAorICAgICAgICAgICAgICAgIChQQUNLRVRTXzggPDwgUklOR19CVUZfUEFDS0VUX05VTV9CSVQpOworICAgIC8qIHRoZSBzYW1lIHdpdGggVmlkZW8xLCBWaWRlbzIsIGFuZCBWaWRlb00qLworICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9TVFJFQU1fQlVGX1NJWkUsIGR3VmFsdWUpOworICAgICAgICAKKworICAgIC8qIENvbXJlc3Npb24gY29udHJvbCByZWdpc3RlciAqLworICAgIGR3VmFsdWUgPSAoVVNFX1VWX0NJUjY1NiA8PCBVVl9DSVI2NTZfRk9STUFUX0JJVCl8CisgICAgICAgICAgICAgICAgKEpQRUdfTUlYX01PREUgPDwgSlBFR19PTkxZX0JJVCl8CisgICAgICAgICAgICAgICAgKFZRXzRfQ09MT1JfTU9ERSA8PCBWUV80X0NPTE9SX0JJVCl8CisgICAgICAgICAgICAgICAgKFFVQU5USV9DT0RFQ19NT0RFIDw8IFFVQUxJVFlfQ09ERUNfU0VUVElOR19CSVQpfAorICAgICAgICAgICAgICAgICg3IDw8IE5PUk1BTF9RVUFOVElfQ0hST01JX1RBQkxFX0JJVCkgfAorICAgICAgICAgICAgICAgICgyMyA8PCBOT1JNQUxfUVVBTlRJX0xVTUlfVEFCTEVfQklUKTsKKyAgIAorICAgIC8vVmlkZW8yIGhhdmUgc2FtZSB2YWx1ZSBhcyB2aWRlbzEKKyAgICBpZiAoVklERU8xID09IG5WaWRlbykKKyAgICB7CisgICAgICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9DT01QUkVTU19DT05UUk9MX1JFRywgZHdWYWx1ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPTV9DT01QUkVTU19DT05UUk9MX1JFRywgZHdWYWx1ZSk7CisgICAgfQorCisgICAgLyogSlBFRyBRdWFudGl6YXRpb24gVGFibGUgcmVnaXN0ZXIgKi8KKyAgICBkd1ZhbHVlID0gMDsKKyAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfUVVBTlRJX1RBQkxFX0xPV19SRUcsIGR3VmFsdWUpOworICAgIAorICAgIC8qIFF1YW50aXphdGlvbiB2YWx1ZSByZWdpc3RlciAqLworICAgIC8vVmlkZW8yIGhhdmUgc2FtZSB2YWx1ZSBhcyB2aWRlbzEKKyAgICBkd1ZhbHVlID0gMDsKKyAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfUVVBTlRJX1ZBTFVFX1JFRywgZHdWYWx1ZSk7CisKKyAgICAvL1ZpZGVvIEJTRCBQYXJhbWV0ZXIgUmVnaXN0ZXIKKyAgICAvL1ZpZGVvMiBoYXZlIHNhbWUgdmFsdWUgYXMgdmlkZW8xCisgICAgZHdWYWx1ZSA9IDA7CisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0JTRF9QQVJBX1JFRywgZHdWYWx1ZSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworQllURSAgR2V0STJDUmVnQ2xpZW50KFVMT05HICBNTUlPQmFzZSwgCisJCQkJIEJZVEUgRGV2aWNlU2VsZWN0LCAKKwkJCQkgQllURSBEZXZpY2VBZGRyZXNzLCAKKwkJCQkgQllURSBSZWdpc3RlckluZGV4KQoreworICAgIEJZVEUgICAgRGF0YTsKKyAgICBVTE9ORyAgIFN0YXR1czsKKworLy8gIFJlc2V0CisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDAwLCAwKTsKKy8vICBTZXQgQUMgVGltaW5nIGFuZCBTcGVlZAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgwNCwgQUNfVElNSU5HKTsKKy8vICBMb3dlciBTcGVlZAorLy8gICAgV3JpdGVNZW1vcnlMb25nV2l0aEFORERhdGEgKFZpZGVvRW5naW5lSW5mby0+VkdBUENJSW5mby51bE1NSU9CYXNlQWRkcmVzcywgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgwNCwgMCwgMHgzMzMxNzgwNSk7CisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDA4LCAwKTsKKy8vICBDbGVhciBJbnRlcnJ1cHQKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTAsIDB4RkZGRkZGRkYpOworLy8gIEVuYWJsZSBNYXN0ZXIgTW9kZQorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgwMCwgMSk7CisvLyAgRW5hYmxlIEludGVycnVwdAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgwQywgMHhBRik7CisvLyAgQllURSBJMkMgTW9kZQorLy8gIFN0YXJ0IGFuZCBTZW5kIERldmljZSBBZGRyZXNzCisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDIwLCBEZXZpY2VBZGRyZXNzKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTQsIDB4Myk7CisvLyAgV2FpdCBUWCBBQ0sKKyAgICBkbyB7CisgICAgICAgIFN0YXR1cyA9IFJlYWRNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDEwKSAmIDB4MDM7CisgICAgfSB3aGlsZSAoU3RhdHVzICE9IDEpOworLy8gIENsZWFyIEludGVycnVwdAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxMCwgMHhGRkZGRkZGRik7CisvLyAgU2VuZCBEZXZpY2UgUmVnaXN0ZXIgSW5kZXgKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MjAsIFJlZ2lzdGVySW5kZXgpOworICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxNCwgMHgyKTsKKy8vICBXYWl0IFR4IEFDSworICAgIGRvIHsKKyAgICAgICAgU3RhdHVzID0gUmVhZE1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTApICYgMHgwMzsKKyAgICB9IHdoaWxlIChTdGF0dXMgIT0gMSk7CisvLyAgQ2xlYXIgSW50ZXJydXB0CisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDEwLCAweEZGRkZGRkZGKTsKKy8vICBTdGFydCwgU2VuZCBEZXZpY2UgQWRkcmVzcyArIDEoUmVhZCBNb2RlKSwgUmVjZWl2ZSBEYXRhCisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDIwLCBEZXZpY2VBZGRyZXNzICsgMSk7CisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDE0LCAweDFCKTsKKy8vICBXYWl0IFJ4IERvbmUKKyAgICBkbyB7CisgICAgICAgIFN0YXR1cyA9IChSZWFkTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxMCkgJiAweDA0KSA+PiAyOworICAgIH0gd2hpbGUgKFN0YXR1cyAhPSAxKTsKKy8vICBDbGVhciBJbnRlcnJ1cHQKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTAsIDB4RkZGRkZGRkYpOworCisvLyAgRW5hYmxlIFNUT1AgSW50ZXJydXB0CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MEMsIDB4MTAsIDB4MTApOworLy8gIElzc3VlIFNUT1AgQ29tbWFuZAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxNCwgMHgyMCk7CisvLyAgV2FpdCBTVE9QCisgICAgZG8geworICAgICAgICBTdGF0dXMgPSAoUmVhZE1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTApICYgMHgxMCkgPj4gNDsKKyAgICB9IHdoaWxlIChTdGF0dXMgIT0gMSk7CisvLyAgRGlzYWJsZSBTVE9QIEludGVycnVwdAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgwQywgMHgxMCk7CisvLyAgQ2xlYXIgSW50ZXJydXB0CisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDEwLCAweEZGRkZGRkZGKTsKKy8vICBSZWFkIFJlY2VpdmVkIERhdGEKKyAgICBEYXRhID0gKEJZVEUpKChSZWFkTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgyMCkgJiAweEZGMDApID4+IDgpOworCisgICAgcmV0dXJuICAgIERhdGE7Cit9CisKK1VMT05HICBTZXRJMkNSZWdDbGllbnQoVUxPTkcgIE1NSU9CYXNlLCAKKyAgICAgICAgICAgICAgICAgQllURSAgIERldmljZVNlbGVjdCwgCisgICAgICAgICAgICAgICAgIEJZVEUgICBEZXZpY2VBZGRyZXNzLCAKKyAgICAgICAgICAgICAgICAgQllURSAgIFJlZ2lzdGVySW5kZXgsIAorICAgICAgICAgICAgICAgICBCWVRFICAgUmVnaXN0ZXJWYWx1ZSkKK3sKKyAgICBVTE9ORyAgIFN0YXR1czsgCisJVUxPTkcgICBDb3VudCA9IDA7CisKKy8vICBSZXNldAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgwMCwgMCk7CisvLyAgU2V0IFNwZWVkCisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDA0LCBBQ19USU1JTkcpOworLy8gIExvd2VyIFNwZWVkCisvLyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoQU5ERGF0YSAoVmlkZW9FbmdpbmVJbmZvLT5WR0FQQ0lJbmZvLnVsTU1JT0Jhc2VBZGRyZXNzLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDA0LCAwLCAweDMzMzE3ODA1KTsKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MDgsIDApOworLy8gIENsZWFyIEludGVycnVwdAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxMCwgMHhGRkZGRkZGRik7CisvLyAgRW5hYmxlIE1hc3RlciBNb2RlCisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDAwLCAxKTsKKy8vICBFbmFibGUgSW50ZXJydXB0CisgICAgV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDBDLCAweEFGKTsKKy8vICBCWVRFIEkyQyBNb2RlCisvLyAgU3RhcnQgYW5kIFNlbmQgRGV2aWNlIEFkZHJlc3MKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MjAsIERldmljZUFkZHJlc3MpOworICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxNCwgMHgzKTsKKy8vICBXYWl0IFR4IEFDSworICAgIGRvIHsKKyAgICAgICAgQ291bnQrKzsKKyAgICAgICAgU3RhdHVzID0gUmVhZE1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTApICYgMHgwMzsKKworCQlpZiAoMiA9PSBTdGF0dXMpCisJCXsKKwkJCS8vQ2xlYXIgSW50ZXJydXB0CisJCQlXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTAsIDB4RkZGRkZGRkYpOworCQkJLy9SZS1TZW5kIFN0YXJ0IGFuZCBTZW5kIERldmljZSBBZGRyZXNzIHdoaWxlIE5BQ0sgcmV0dXJuCisJCQlXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MjAsIERldmljZUFkZHJlc3MpOworCQkJV3JpdGVNZW1vcnlMb25nQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDE0LCAweDMpOworCQl9CisJCS8vZWxzZQorCQl7CisJCQlpZiAoQ291bnQgPiBMT09QX0NPVU5UKSB7CisJCQkJcmV0dXJuIENBTl9OT1RfRklORF9ERVZJQ0U7CisJCQl9CisJCX0KKyAgICB9IHdoaWxlIChTdGF0dXMgIT0gMSk7CisgICAgQ291bnQgPSAwOworLy8gIENsZWFyIEludGVycnVwdAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxMCwgMHhGRkZGRkZGRik7CisvLyAgU2VuZCBEZXZpY2UgUmVnaXN0ZXIgSW5kZXgKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MjAsIFJlZ2lzdGVySW5kZXgpOworICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxNCwgMHgyKTsKKy8vICBXYWl0IFR4IEFDSworICAgIGRvIHsKKyAgICAgICAgQ291bnQrKzsKKyAgICAgICAgU3RhdHVzID0gUmVhZE1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTApICYgMHgwMzsKKyAgICAgICAgaWYgKENvdW50ID4gTE9PUF9DT1VOVCkgeworICAgICAgICAgICAgcmV0dXJuIENBTl9OT1RfRklORF9ERVZJQ0U7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChTdGF0dXMgIT0gMSk7CisgICAgQ291bnQgPSAwOworLy8gIENsZWFyIEludGVycnVwdAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxMCwgMHhGRkZGRkZGRik7CisvLyAgU2VuZCBEZXZpY2UgUmVnaXN0ZXIgVmFsdWUgYW5kIFN0b3AKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MjAsIFJlZ2lzdGVyVmFsdWUpOworICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxNCwgMHgyKTsKKy8vICBXYWl0IFR4IEFDSworICAgIGRvIHsKKyAgICAgICAgQ291bnQrKzsKKyAgICAgICAgU3RhdHVzID0gUmVhZE1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTApICYgMHgwMzsKKyAgICAgICAgaWYgKENvdW50ID4gTE9PUF9DT1VOVCkgeworICAgICAgICAgICAgcmV0dXJuIENBTl9OT1RfRklORF9ERVZJQ0U7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChTdGF0dXMgIT0gMSk7CisgICAgQ291bnQgPSAwOworLy8gIENsZWFyIEludGVycnVwdAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxMCwgMHhGRkZGRkZGRik7CisvLyAgRW5hYmxlIFNUT1AgSW50ZXJydXB0CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MEMsIDB4MTAsIDB4MTApOworLy8gIElzc3VlIFNUT1AgQ29tbWFuZAorICAgIFdyaXRlTWVtb3J5TG9uZ0NsaWVudChBUEJfQlJJREdFXzJfQkFTRSwgSTJDX0JBU0UgKyBEZXZpY2VTZWxlY3QgKiAweDQwICsgMHgxNCwgMHgyMCk7CisvLyAgV2FpdCBTVE9QCisgICAgZG8geworICAgICAgICBDb3VudCsrOworICAgICAgICBTdGF0dXMgPSAoUmVhZE1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTApICYgMHgxMCkgPj4gNDsKKyAgICAgICAgaWYgKENvdW50ID4gTE9PUF9DT1VOVCkgeworICAgICAgICAgICAgcmV0dXJuIENBTl9OT1RfRklORF9ERVZJQ0U7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChTdGF0dXMgIT0gMSk7CisvLyAgRGlzYWJsZSBTVE9QIEludGVycnVwdAorICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLQ2xpZW50KEFQQl9CUklER0VfMl9CQVNFLCBJMkNfQkFTRSArIERldmljZVNlbGVjdCAqIDB4NDAgKyAweDBDLCAwLCAweDEwKTsKKy8vICBDbGVhciBJbnRlcnJ1cHQKKyAgICBXcml0ZU1lbW9yeUxvbmdDbGllbnQoQVBCX0JSSURHRV8yX0JBU0UsIEkyQ19CQVNFICsgRGV2aWNlU2VsZWN0ICogMHg0MCArIDB4MTAsIDB4RkZGRkZGRkYpOworCisgICAgcmV0dXJuIFNFVF9JMkNfRE9ORTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL2FzcGVlZC9hc3QyNDAwL3ZmdW4uaCBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL3ZmdW4uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MGY5ZWM0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDI0MDAvdmZ1bi5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2lmbmRlZiBfVkZVTl9IXworI2RlZmluZSBfVkZVTl9IXworCisvLyNkZWZpbmUgdkJ1ZkFsaWduKHgpCQkgICAgKCh4ICsgMHgwMDAwMDA3RikgJiAweEZGRkZGRjgwKSAvLzEyOCBieXRlIGFsaWdubWVudAorI2RlZmluZSB2QnVmQWxpZ24oeCkJCSAgICAoKHggKyAweDAwMDAwM0ZGKSAmIDB4RkZGRkZDMDApIC8vMTI4IGJ5dGUgYWxpZ25tZW50CisjZGVmaW5lIHZCdWZBbGlnbjIoeCkJCSAgICAoKHggKyAweDAwMDBGRkZGKSAmIDB4RkZGRjAwMDApIC8vMTI4IGJ5dGUgYWxpZ25tZW50CisjZGVmaW5lIHYxNmJ5dGVBbGlnbih4KQkJICAgICgoeCArIDB4MDAwMDAwMEYpICYgMHhGRkZGRkZGMCkKKyNkZWZpbmUgdkJ1Zl9BTElHTk1FTlQJCQkxMjgKKworI2RlZmluZSBIT1NUX1RPVEFMX1NJWkUgICAgICAgICAweDgwMDAwMDAgICAvKiAxMjhNICovCisjZGVmaW5lIFNUQVRJT05fVE9UQUxfU0laRSAgICAgIDB4RjgwMDAwMCAgIC8qIDEyME0gKi8KKworI2RlZmluZSBWSURFT19TT1VSQ0VfU0laRSAgICAgICAweDIwMDAwMCAgICAvKiA4MDBYNjAwWDQgPSAweDFENEMwMCAqLworI2RlZmluZSBWSURFT19NQVhfU1RSRUFNX1NJWkUgICAweDQwMDAwMCAgICAvKiAzMlgxMjhLID0gMHg0MDAwMDAgKi8KKyNkZWZpbmUgVklERU9fRkxBR19TSVpFICAgICAgICAgMHg1MDAwICAgICAgLyogMTkyMFgxMjAwLzEyOCA9IDB4NDY1MCovIAorI2RlZmluZSBWSURFT19DUkNfU0laRSAgICAgICAgICAweDUwMDAwICAgICAvKiAxOTIwLzY0WDEyMDBYOCA9IDB4NDY1MDAqLworCisjZGVmaW5lIFZJREVPMV9FTl9UT1RBTF9TSVpFICAgIChWSURFT19TT1VSQ0VfU0laRSoyK1ZJREVPX01BWF9TVFJFQU1fU0laRStWSURFT19GTEFHX1NJWkUrVklERU9fQ1JDX1NJWkUpIC8qIDB4MTY1NTAwMCA9ICBhYm91dCAyM00qLworI2RlZmluZSBWSURFTzJfRU5fVE9UQUxfU0laRSAgICBWSURFTzFfRU5fVE9UQUxfU0laRQorLy8jZGVmaW5lIFZJREVPTV9FTl9UT1RBTF9TSVpFICAgIChWSURFT19TT1VSQ0VfU0laRSoyK1ZJREVPX01BWF9TVFJFQU1fU0laRStWSURFT19GTEFHX1NJWkUpIC8qIDB4MTYwNTAwMCA9IGFib3V0IDIyLjdNICovCisvLyNkZWZpbmUgVklERU9fSE9TVF9TSVpFICAgICAgICAgKFZJREVPMV9FTl9UT1RBTF9TSVpFICsgVklERU8yX0VOX1RPVEFMX1NJWkUgKyBWSURFT01fRU5fVE9UQUxfU0laRSkgLyogMHg2OTkyMjgxNiA9IGFib3V0IDcwTSAqLworI2RlZmluZSBWSURFT19IT1NUX1NJWkUgICAgICAgICAoVklERU8xX0VOX1RPVEFMX1NJWkUgKyBWSURFTzJfRU5fVE9UQUxfU0laRSkgLyogTk9UIE5FRUQgVklERU9NICovCisKKyNkZWZpbmUgVklERU8xX0VOX0JBU0UgICAgICAgICAgMHgxMDAwMDAKKyNkZWZpbmUgVklERU8yX0VOX0JBU0UgICAgICAgICAgKFZJREVPMV9FTl9CQVNFICsgVklERU8xX0VOX1RPVEFMX1NJWkUpCisjZGVmaW5lIFZJREVPTV9FTl9CQVNFICAgICAgICAgIChWSURFTzJfRU5fQkFTRSArIFZJREVPMl9FTl9UT1RBTF9TSVpFKQorCisjZGVmaW5lIFZJREVPMV9ERV9UT1RBTF9TSVpFICAgIChWSURFT19NQVhfU1RSRUFNX1NJWkUgKyBWSURFT19TT1VSQ0VfU0laRSkgLyogMHhEMDAwMDAgPSAxM00qLworI2RlZmluZSBWSURFTzJfREVfVE9UQUxfU0laRSAgICAoVklERU8xX0RFX1RPVEFMX1NJWkUpCisjZGVmaW5lIFZJREVPX1NUQVRJT05fU0laRSAgICAgIChWSURFTzFfREVfVE9UQUxfU0laRSArIFZJREVPMl9ERV9UT1RBTF9TSVpFKSAvKiAyNk0gKi8KKworI2RlZmluZSBWSURFTzFfREVfQkFTRSAgICAgICAgICBWSURFT19IT1NUX1NJWkUKKyNkZWZpbmUgVklERU8yX0RFX0JBU0UgICAgICAgICAgKFZJREVPMV9ERV9CQVNFICsgVklERU8xX0RFX1RPVEFMX1NJWkUpCisjZGVmaW5lIFZJREVPX0FMTF9TSVpFICAgICAgICAgIChWSURFT19IT1NUX1NJWkUgKyBWSURFT19TVEFUSU9OX1NJWkUpIC8vSG9zdCBhbmQgU3RhdGlvbgorCisjZGVmaW5lIE91dGR3bUJhbmtNb2RlSG9zdChvZmZzZXQsZGF0YSkgICAgICAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KERSQU1fQkFTRSxvZmZzZXQsZGF0YSkKKyNkZWZpbmUgSW5kd21CYW5rTW9kZUhvc3Qob2Zmc2V0KSAgICAgICAgICAgICAgIFJlYWRNZW1vcnlMb25nSG9zdChEUkFNX0JBU0Usb2Zmc2V0KSAgICAgIAorCitVTE9ORyBVbmxvY2tWaWRlb1JlZ0hvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgS2V5KTsKK0JPT0wgQ2hlY2tPblN0YXJ0SG9zdCh2b2lkKTsKK0JPT0wgQ2hlY2tPblN0YXJ0Q2xpZW50KHZvaWQpOwordm9pZCBTdGFydFZpZGVvQ2FwdHVyZVRyaWdnZXJIb3N0KFVMT05HICAgTU1JT0Jhc2UsIFVMT05HIG9mZnNldCk7Cit2b2lkIFN0YXJ0VmlkZW9DYXB0dXJlVHJpZ2dlckhvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgb2Zmc2V0KTsKK3ZvaWQgU3RhcnRWaWRlb0NvZGVjVHJpZ2dlckhvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgb2Zmc2V0KTsKK1VMT05HIFVubG9ja1NDVVJlZ0hvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgS2V5KTsKK1VMT05HIFVubG9ja1NDVVJlZ0hvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgS2V5KTsKK3ZvaWQgU3RhcnRNb2RlRGV0ZWN0aW9uVHJpZ2dlckhvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgb2Zmc2V0KTsKK3ZvaWQgQ2xlYXJWaWRlb0ludGVycnVwdEhvc3QoVUxPTkcgICBNTUlPQmFzZSwgVUxPTkcgdmFsdWUpOworQk9PTCBSZWFkVmlkZW9JbnRlcnJ1cHRIb3N0KFVMT05HICAgTU1JT0Jhc2UsIFVMT05HIHZhbHVlKTsKK3ZvaWQgU3RvcE1vZGVEZXRlY3Rpb25UcmlnZ2VySG9zdChVTE9ORyAgIE1NSU9CYXNlLCBVTE9ORyBvZmZzZXQpOwordm9pZCBSZXNldFZpZGVvSG9zdCh2b2lkKTsKK1VMT05HICBJbml0aWFsaXplVmlkZW9FbmdpbmVIb3N0IChVTE9ORyAgICAgICAgICAgICAgICBNTUlPQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBuVmlkZW8sCisJCQkJCQkJICAgQk9PTAkJCQkJSG9yUG9sYXJpdHksCisJCQkJICBCT09MCQkJCQlWZXJQb2xhcml0eSk7CitVTE9ORyAgSW5pdGlhbGl6ZVZpZGVvRW5naW5lQ2xpZW50IChVTE9ORyAgICAgICAgICAgICAgICBNTUlPQmFzZSwKKwkJCQkgICAgaW50ICAgICAgICAgICAgICAgICAgblZpZGVvKTsKK0JZVEUgIEdldEkyQ1JlZ0NsaWVudChVTE9ORyAgTU1JT0Jhc2UsIAorCQkJCSBCWVRFIERldmljZVNlbGVjdCwgCisJCQkJIEJZVEUgRGV2aWNlQWRkcmVzcywgCisJCQkJIEJZVEUgUmVnaXN0ZXJJbmRleCk7CisKK1VMT05HICBTZXRJMkNSZWdDbGllbnQoVUxPTkcgIE1NSU9CYXNlLCAKKyAgICAgICAgICAgICAgICAgQllURSAgIERldmljZVNlbGVjdCwgCisgICAgICAgICAgICAgICAgIEJZVEUgICBEZXZpY2VBZGRyZXNzLCAKKyAgICAgICAgICAgICAgICAgQllURSAgIFJlZ2lzdGVySW5kZXgsIAorCQkJCSBCWVRFICAgUmVnaXN0ZXJWYWx1ZSk7CisjZW5kaWYgLy9fVkZVTl9IXworCmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjQwMC92Z2Fody5oIGIvYm9hcmQvYXNwZWVkL2FzdDI0MDAvdmdhaHcuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43Y2JiYTBkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDI0MDAvdmdhaHcuaApAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNb2RlIFN0dWZmCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVmYXVsdCBTZXR0aW5ncyAqLworI2RlZmluZSBDUlRfTE9XX1RIUkVTSE9MRF9WQUxVRSAgICAgICAgIDB4MTIKKyNkZWZpbmUgQ1JUX0hJR0hfVEhSRVNIT0xEX1ZBTFVFICAgICAgICAweDFFCisKKy8qIE91dHB1dCBTZWxlY3Rpb24gKi8KKyNkZWZpbmUgQ1JUMQkJCQkweDAwCisjZGVmaW5lIENSVDIJCQkJMHgwMQorI2RlZmluZSBEVkkxCQkJCTB4MTAKKyNkZWZpbmUgRFZJMgkJCQkweDExCisjZGVmaW5lIExWRFMxCQkJCTB4MjAKKyNkZWZpbmUgTFZEUzIJCQkJMHgyMQorCisvKiBNb2RlIExpbWl0YXRpb24gKi8KKyNkZWZpbmUgTUFYX0hSZXNvbHV0aW9uCQkxNjAwCisjZGVmaW5lIE1BWF9WUmVzb2x1dGlvbgkJMTIwMAorIAorLyogU3RkLiBUYWJsZSBJbmRleCBEZWZpbml0aW9uICovCisjZGVmaW5lIFRleHRNb2RlSW5kZXggCQkwCisjZGVmaW5lIEVHQU1vZGVJbmRleCAJCTEKKyNkZWZpbmUgVkdBTW9kZUluZGV4IAkJMgorI2RlZmluZSBIaUNNb2RlSW5kZXggCQkzCisjZGVmaW5lIFRydWVDTW9kZUluZGV4IAkJNAorCisvKiBEQ0xLIEluZGV4ICovCisjZGVmaW5lIFZDTEsyNV8xNzUgICAgIAkJMHgwMAorI2RlZmluZSBWQ0xLMjhfMzIyICAgICAJCTB4MDEKKyNkZWZpbmUgVkNMSzMxXzUgICAgICAgCQkweDAyCisjZGVmaW5lIFZDTEszNiAgICAgICAgIAkJMHgwMworI2RlZmluZSBWQ0xLNDAgICAgICAgICAJCTB4MDQKKyNkZWZpbmUgVkNMSzQ5XzUgICAgICAgCQkweDA1CisjZGVmaW5lIFZDTEs1MCAgICAgICAgIAkJMHgwNgorI2RlZmluZSBWQ0xLNTZfMjUgICAgICAJCTB4MDcKKyNkZWZpbmUgVkNMSzY1CQkgCTB4MDgKKyNkZWZpbmUgVkNMSzc1CSAgICAgICAgCTB4MDkKKyNkZWZpbmUgVkNMSzc4Xzc1ICAgICAgCQkweDBBCisjZGVmaW5lIFZDTEs5NF81ICAgICAgIAkJMHgwQgorI2RlZmluZSBWQ0xLMTA4ICAgICAgICAJCTB4MEMKKyNkZWZpbmUgVkNMSzEzNSAgICAgICAgCQkweDBECisjZGVmaW5lIFZDTEsxNTdfNSAgICAgIAkJMHgwRQorI2RlZmluZSBWQ0xLMTYyICAgICAgICAJCTB4MEYKKyNkZWZpbmUgVkNMSzExOSAgICAgICAgCQkweDEwCisKKy8qIEZsYWdzIERlZmluaXRpb24gKi8KKyNkZWZpbmUgQ2hhcng4RG90ICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBIYWxmRENMSyAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIERvdWJsZVNjYW5Nb2RlICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgTGluZUNvbXBhcmVPZmYgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBTeW5jUFAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFN5bmNQTiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgU3luY05QICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBTeW5jTk4gICAgICAgICAgICAgICAgICAweDAwMDAwMEMwCisjZGVmaW5lIEhCb3JkZXIgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgVkJvcmRlciAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBDT0xPUklOREVYCQkweDAwMDAwMDAwCisjZGVmaW5lIE1PTk9JTkRFWAkJMHgwMDAwMDEwMAorCisvKiBEQUMgRGVmaW5pdGlvbiAqLworI2RlZmluZSBEQUNfTlVNX1RFWFQJCTY0CisjZGVmaW5lIERBQ19OVU1fRUdBCQk2NAorI2RlZmluZSBEQUNfTlVNX1ZHQQkJMjU2CisKKy8qIEFTVDMwMDAgUmVnLiBEZWZpbml0aW9uICovCisjZGVmaW5lCUFTVDMwMDBfVkdBUkVHX0JBU0UJMHgxZTZlNjAwMAorI2RlZmluZSBBU1QzMDAwX1ZHQTFfQ1RMUkVHCTB4MDAKKyNkZWZpbmUgQVNUMzAwMF9WR0ExX0NUTFJFRzIJMHgwNAorI2RlZmluZSBBU1QzMDAwX1ZHQTFfU1RBVFVTUkVHCTB4MDggCisjZGVmaW5lIEFTVDMwMDBfVkdBMV9QTEwJMHgwQworI2RlZmluZSBBU1QzMDAwX1ZHQTFfSFRSRUcJMHgxMAorI2RlZmluZSBBU1QzMDAwX1ZHQTFfSFJSRUcJMHgxNAorI2RlZmluZSBBU1QzMDAwX1ZHQTFfVlRSRUcJMHgxOAorI2RlZmluZSBBU1QzMDAwX1ZHQTFfVlJSRUcJMHgxQworI2RlZmluZSBBU1QzMDAwX1ZHQTFfU1RBUlRBRERSCTB4MjAKKyNkZWZpbmUgQVNUMzAwMF9WR0ExX09GRlNFVFJFRwkweDI0CisjZGVmaW5lIEFTVDMwMDBfVkdBMV9USFJFU0hPTEQJMHgyOAorI2RlZmluZSBBU1QzMDAwX0hXQzFfT0ZGU0VUICAgICAweDMwCisjZGVmaW5lIEFTVDMwMDBfSFdDMV9YWQkJMHgzNAorI2RlZmluZSBBU1QzMDAwX0hXQzFfUEJhc2UgICAgICAweDM4CisjZGVmaW5lIEFTVDMwMDBfT1NEMV9IICAgICAgICAgIDB4NDAKKyNkZWZpbmUgQVNUMzAwMF9PU0QxX1YgICAgICAgICAgMHg0NAorI2RlZmluZSBBU1QzMDAwX09TRDFfUEJhc2UgICAgICAweDQ4CisjZGVmaW5lIEFTVDMwMDBfT1NEMV9PZmZzZXQgICAgIDB4NEMKKyNkZWZpbmUgQVNUMzAwMF9PU0QxX1RIUkVTSE9MRCAgMHg1MAorCisjZGVmaW5lIEFTVDMwMDBfVkdBMl9DVExSRUcJMHg2MAorI2RlZmluZSBBU1QzMDAwX1ZHQTJfQ1RMUkVHMgkweDY0CisjZGVmaW5lIEFTVDMwMDBfVkdBMl9TVEFUVVNSRUcJMHg2OCAKKyNkZWZpbmUgQVNUMzAwMF9WR0EyX1BMTAkweDZDCisjZGVmaW5lIEFTVDMwMDBfVkdBMl9IVFJFRwkweDcwCisjZGVmaW5lIEFTVDMwMDBfVkdBMl9IUlJFRwkweDc0CisjZGVmaW5lIEFTVDMwMDBfVkdBMl9WVFJFRwkweDc4CisjZGVmaW5lIEFTVDMwMDBfVkdBMl9WUlJFRwkweDdDCisjZGVmaW5lIEFTVDMwMDBfVkdBMl9TVEFSVEFERFIJMHg4MAorI2RlZmluZSBBU1QzMDAwX1ZHQTJfT0ZGU0VUUkVHCTB4ODQKKyNkZWZpbmUgQVNUMzAwMF9WR0EyX1RIUkVTSE9MRAkweDg4CisjZGVmaW5lIEFTVDMwMDBfSFdDMl9PRkZTRVQgICAgIDB4OTAKKyNkZWZpbmUgQVNUMzAwMF9IV0MyX1hZCQkweDk0CisjZGVmaW5lIEFTVDMwMDBfSFdDMl9QQmFzZSAgICAgIDB4OTgKKyNkZWZpbmUgQVNUMzAwMF9PU0QyX0ggICAgICAgICAgMHhBMAorI2RlZmluZSBBU1QzMDAwX09TRDJfViAgICAgICAgICAweEE0CisjZGVmaW5lIEFTVDMwMDBfT1NEMl9QQmFzZSAgICAgIDB4QTgKKyNkZWZpbmUgQVNUMzAwMF9PU0QyX09mZnNldCAgICAgMHhBQworI2RlZmluZSBBU1QzMDAwX09TRDJfVEhSRVNIT0xEICAweEIwCisKKy8qIERhdGEgU3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUNIQVIgTW9kZU5hbWVbMjBdOworICAgIFVTSE9SVCB1c01vZGVJbmRleDsKKyAgICBVU0hPUlQgdXNNb2RlSUQ7CisgICAgVVNIT1JUIHVzQ29sb3JJbmRleDsKKyAgICBVU0hPUlQgdXNSZWZyZXNoUmF0ZUluZGV4OworICAgIFVTSE9SVCB1c1dpZHRoOworICAgIFVTSE9SVCB1c0hlaWdodDsKKyAgICBVU0hPUlQgdXNCaXRzUGVyUGxhbmU7CisgICAgVVNIT1JUIHVzUmVmcmVzaFJhdGU7ICAgIAorfSBNb2RlSW5mb1N0cnVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCQorICAgIFVDSEFSIE1JU0M7CQorICAgIFVDSEFSIFNFUVs0XTsKKyAgICBVQ0hBUiBDUlRDWzI1XTsKKyAgICBVQ0hBUiBBUlsyMF07CSAgICAKKyAgICBVQ0hBUiBHUls5XTsKKyAgICAKK30gVkJJT1NfU1REVEFCTEVfU1RSVUNULCAqUFZCSU9TX1NURFRBQkxFX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCQorICAgIFVMT05HIEhUOworICAgIFVMT05HIEhERTsKKyAgICBVTE9ORyBIRlA7CisgICAgVUxPTkcgSFNZTkM7CisgICAgVUxPTkcgVlQ7CisgICAgVUxPTkcgVkRFOworICAgIFVMT05HIFZGUDsKKyAgICBVTE9ORyBWU1lOQzsKKyAgICBVTE9ORyBEQ0xLSW5kZXg7ICAgICAgICAKKyAgICBVTE9ORyBGbGFnczsKKworICAgIFVMT05HIHVsUmVmcmVzaFJhdGU7CisgICAgVUxPTkcgdWxSZWZyZXNoUmF0ZUluZGV4OworICAgIFVMT05HIHVsTW9kZUlEOworICAgICAgICAKK30gVkJJT1NfRU5IVEFCTEVfU1RSVUNULCAqUFZCSU9TX0VOSFRBQkxFX1NUUlVDVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVDSEFSIFBhcmFtMTsKKyAgICBVQ0hBUiBQYXJhbTI7CisgICAgVUNIQVIgUGFyYW0zOwkKK30gVkJJT1NfRENMS19JTkZPLCAqUFZCSU9TX0RDTEtfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVDSEFSIERBQ1I7CisgICAgVUNIQVIgREFDRzsKKyAgICBVQ0hBUiBEQUNCOwkKK30gVkJJT1NfREFDX0lORk8sICpQVkJJT1NfREFDX0lORk87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQVkJJT1NfU1REVEFCTEVfU1RSVUNUIHBTdGRUYWJsZUVudHJ5OworICAgIFBWQklPU19FTkhUQUJMRV9TVFJVQ1QgcEVuaFRhYmxlRW50cnk7CisgICAgCQorfSBWQklPU19NT0RFX0lORk8sICpQVkJJT1NfTU9ERV9JTkZPOwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDI0MDAvdmhhY2UuYyBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL3ZoYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDA0NWNiZAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL3ZoYWNlLmMKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjZGVmaW5lIEhBU0hfR0xPQkFMUworI2luY2x1ZGUgInR5cGUuaCIKKyNpbmNsdWRlICJ2ZGVmLmgiCisjaW5jbHVkZSAidmhhY2UuaCIKKyNpbmNsdWRlICJ2ZnVuLmgiCisKK3ZvaWQgSGFzaEFzdDMwMDAoVUxPTkcgdWxMZW5ndGgsIFVMT05HICpvdXRwdXQsIFVMT05HIHVsSGFzaE1vZGUpCit7CisJVUxPTkcgaSwgdWxUZW1wLCB1bENvbW1hbmQsIHVsRGlnZXN0TGVuZ3RoOworCVVMT05HIHVsVmFsdWU7CisgICAKKwkvKiBHZXQgSW5mbyAqLworCXN3aXRjaCAodWxIYXNoTW9kZSkKKwl7CisJY2FzZSBWSEFTSE1PREVfTUQ1OgorCQl1bENvbW1hbmQgPSBWSEFTSF9BTEdfU0VMRUNUX01ENTsKKwkJdWxEaWdlc3RMZW5ndGggPSAxNjsKKwkJYnJlYWs7CisJY2FzZSBWSEFTSE1PREVfU0hBMToKKwkJdWxDb21tYW5kID0gVkhBU0hfQUxHX1NFTEVDVF9TSEExOworCQl1bERpZ2VzdExlbmd0aCA9IDIwOworCQlicmVhazsKKwljYXNlIFZIQVNITU9ERV9TSEEyNTY6CisJCXVsQ29tbWFuZCA9IFZIQVNIX0FMR19TRUxFQ1RfU0hBMjU2OworCQl1bERpZ2VzdExlbmd0aCA9IDMyOworCQlicmVhazsKKwljYXNlIFZIQVNITU9ERV9TSEEyMjQ6CisJCXVsQ29tbWFuZCA9IFZIQVNIX0FMR19TRUxFQ1RfU0hBMjI0OworCQl1bERpZ2VzdExlbmd0aCA9IDI4OworCQlicmVhazsgICAgICAgCQorCX0KKyAgIAkKKwkvKiBJbml0LiBIVyAqLworCVdyaXRlTWVtb3J5TG9uZ0hvc3QoVkhBQ19SRUdfQkFTRSwgVlJFR19IQVNIX1NSQ19CQVNFX09GRlNFVCwgZ19IYXNoU3JjQnVmZmVyKTsKKwlXcml0ZU1lbW9yeUxvbmdIb3N0KFZIQUNfUkVHX0JBU0UsIFZSRUdfSEFTSF9EU1RfQkFTRV9PRkZTRVQsIGdfSGFzaERzdEJ1ZmZlcik7CisJV3JpdGVNZW1vcnlMb25nSG9zdChWSEFDX1JFR19CQVNFLCBWUkVHX0hBU0hfTEVOX09GRlNFVCwgdWxMZW5ndGgpOworICAgICAgICAKKyAgICAvKiB3cml0ZSBzcmMgKi8KKwkvL2FscmVhZHkgZmlsbCBpbiBnX1ZJREVPMV9DT01QUkVTU19CVUZfQUREUgorCisgICAgLyogZmlyZSBjbWQgKi8KKwlXcml0ZU1lbW9yeUxvbmdIb3N0KFZIQUNfUkVHX0JBU0UsIFZSRUdfSEFTSF9DTURfT0ZGU0VULCB1bENvbW1hbmQpOworICAgIAorICAgIC8qIGdldCBkaWdlc3QgKi8KKyAgICBkbyB7CisgICAgCXVsVGVtcCA9IFJlYWRNZW1vcnlMb25nSG9zdChWSEFDX1JFR19CQVNFLCBWUkVHX0hBU0hfU1RBVFVTX09GRlNFVCk7CisgICAgfSB3aGlsZSAodWxUZW1wICYgVkhBU0hfQlVTWSk7CQorICAgIAkKKyAgICBmb3IgKGk9MDsgaTx1bERpZ2VzdExlbmd0aC80OyBpKyspCisgICAgeworICAgICAgICAgICAgICAgIHVsVmFsdWUgPSAqKCgoVUxPTkcgKilnX0hhc2hEc3RCdWZmZXIpICsgaSk7IAorCisJCS8vb3V0cHV0IGlzIFVMT05HIHBvaW50ZXIKKwkJKihvdXRwdXQgKyBpKSA9IHVsVmFsdWU7ICAgIAorICAgIH0gICAgICAgIAorfQpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDI0MDAvdmhhY2UuaCBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL3ZoYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDYwOTg5YgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL3ZoYWNlLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaWZuZGVmIF9WSEFDRV9IXworI2RlZmluZSBfVkhBQ0VfSF8KKworI2RlZmluZSBWSEFTSE1PREVfTUQ1CQkJMHgwMAorI2RlZmluZSBWSEFTSE1PREVfU0hBMQkJCTB4MDEKKyNkZWZpbmUgVkhBU0hNT0RFX1NIQTI1NgkJCTB4MDIKKyNkZWZpbmUgVkhBU0hNT0RFX1NIQTIyNAkJCTB4MDMKKworI2RlZmluZSBWSEFTSF9BTEdfU0VMRUNUX01BU0sJCTB4NzAKKyNkZWZpbmUgVkhBU0hfQUxHX1NFTEVDVF9NRDUJCQkweDAwCisjZGVmaW5lIFZIQVNIX0FMR19TRUxFQ1RfU0hBMQkJMHgyMAorI2RlZmluZSBWSEFTSF9BTEdfU0VMRUNUX1NIQTIyNAkJMHg0MAorI2RlZmluZSBWSEFTSF9BTEdfU0VMRUNUX1NIQTI1NgkJMHg1MAorCisjZGVmaW5lIFZIQVNIX0JVU1kJCQkweDAxCisKKyNkZWZpbmUgVkhBQ19SRUdfQkFTRSAJCQkweDFlNmUwMDAwCisjZGVmaW5lCVZIQUNfUkVHX09GRlNFVAkJCTB4MzAwMAorCisjZGVmaW5lIFZSRUdfSEFTSF9TUkNfQkFTRV9PRkZTRVQJKDB4MjArVkhBQ19SRUdfT0ZGU0VUKQorI2RlZmluZSBWUkVHX0hBU0hfRFNUX0JBU0VfT0ZGU0VUCSgweDI0K1ZIQUNfUkVHX09GRlNFVCkKKyNkZWZpbmUgVlJFR19IQVNIX0tFWV9CQVNFX09GRlNFVAkoMHgyOCtWSEFDX1JFR19PRkZTRVQpCisjZGVmaW5lIFZSRUdfSEFTSF9MRU5fT0ZGU0VUCQkJKDB4MkMrVkhBQ19SRUdfT0ZGU0VUKQorI2RlZmluZSBWUkVHX0hBU0hfQ01EX09GRlNFVAkJCSgweDMwK1ZIQUNfUkVHX09GRlNFVCkKKworI2RlZmluZSBWUkVHX0hBU0hfU1RBVFVTX09GRlNFVAkJKDB4MUMrVkhBQ19SRUdfT0ZGU0VUKQorCit0eXBlZGVmIHN0cnVjdAoreworCWludCBIYXNoTW9kZTsKKwlpbnQgRGlnZXN0TGVuOworfSBIQVNIX01FVEhPRDsKKworCisjaWZkZWYgSEFTSF9HTE9CQUxTCisjZGVmaW5lIEhBU0hfRVhUCisjZWxzZQorI2RlZmluZSBIQVNIX0VYVCBleHRlcm4KKyNlbmRpZgorCitIQVNIX0VYVCBIQVNIX01FVEhPRAlnX0hhc2hNZXRob2Q7CitIQVNIX0VYVCBCWVRFCQkJZ19EaWdlc3RCdWZbMzJdOworSEFTSF9FWFQgVUxPTkcJCQlnX0hhc2hTcmNCdWZmZXI7CitIQVNIX0VYVCBVTE9ORwkJCWdfSGFzaERzdEJ1ZmZlcjsKKwordm9pZCBIYXNoQXN0MzAwMChVTE9ORyB1bExlbmd0aCwgVUxPTkcgKm91dHB1dCwgVUxPTkcgdWxIYXNoTW9kZSk7CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDI0MDAvdmlkZW90ZXN0LmMgYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC92aWRlb3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMmU0OTUzCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvYXNwZWVkL2FzdDI0MDAvdmlkZW90ZXN0LmMKQEAgLTAsMCArMSw3NzkgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIERpYWdub3N0aWNzIHN1cHBvcnQKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxwb3N0Lmg+CisKKyNpbmNsdWRlICJzbHQuaCIKKyNkZWZpbmUgV0lOX0dMT0JBTFMKKyNpbmNsdWRlICJ0eXBlLmgiCisjaW5jbHVkZSAidnJlZy5oIgorI2RlZmluZSBWRVNBX0dMT0JBTFMKKyNpbmNsdWRlICJ2ZXNhLmgiCisjaW5jbHVkZSAidmZ1bi5oIgorI2luY2x1ZGUgInZkZWYuaCIKKyNpbmNsdWRlICJ2aGFjZS5oIgorI2luY2x1ZGUgImNydC5oIgorI2luY2x1ZGUgInZpZGVvdGVzdC5oIgorCisjZGVmaW5lIFZIQVNIX0FMSUdOTUVOVAkJCTE2CisjZGVmaW5lIFZIQVNIX01BWF9EU1QJCQkoMzIrVkhBU0hfQUxJR05NRU5UKQorCisKKyNpZiAoKENGR19DTURfU0xUICYgQ0ZHX0NNRF9WSURFT1RFU1QpICYmIGRlZmluZWQoQ09ORklHX1NMVCkpCisjaW5jbHVkZSAidmlkZW90ZXN0LmgiCisKKyNkZWZpbmUgUkFORF9NQVggMzI3NjcgLy8yXjE2LTEKKworVUxPTkcgcmFuZFNlZWQgPSAxOworCit2b2lkIHNyYW5kKFVMT05HIHNlZWQpCit7CisgIHJhbmRTZWVkID0gc2VlZDsKK30KKworaW50IHJhbmQodm9pZCkKK3sKKyAgcmFuZFNlZWQgPSByYW5kU2VlZCAqIDIxNDAxMyArIDI1MzEwMTE7CisgIHJldHVybiAoaW50KShyYW5kU2VlZCA+PiAxNyk7IC8vMzIgLTE1ID0gMTcKK30KKworLy9zdGF0aWMgdW5zaWduZWQgY2hhciBDYXB0dXJlVmlkZW8xQnVmMUFkZHJbVklERU9fU09VUkNFX1NJWkVdLCBDYXB0dXJlVmlkZW8xQnVmMkFkZHJbVklERU9fU09VUkNFX1NJWkVdLCBWaWRlbzFDb21wcmVzc0J1ZkFkZHJbQ1JZUFRPX01BWF9DT05URVhUXTsKK1VMT05HIHBDYXB0dXJlVmlkZW8xQnVmMUFkZHJbVklERU9fU09VUkNFX1NJWkUvNF0sIHBDYXB0dXJlVmlkZW8xQnVmMkFkZHJbVklERU9fU09VUkNFX1NJWkUvNF0sIHBWaWRlbzFDb21wcmVzc0J1ZkFkZHJbVklERU9fTUFYX1NUUkVBTV9TSVpFLzRdLCBwVmlkZW8xRmxhZ0J1ZkFkZHJbVklERU9fRkxBR19TSVpFXTsKK1VMT05HIHBDYXB0dXJlVmlkZW8yQnVmMUFkZHJbVklERU9fU09VUkNFX1NJWkUvNF0sIHBDYXB0dXJlVmlkZW8yQnVmMkFkZHJbVklERU9fU09VUkNFX1NJWkUvNF0sIHBWaWRlbzJDb21wcmVzc0J1ZkFkZHJbVklERU9fTUFYX1NUUkVBTV9TSVpFLzRdLCBwVmlkZW8yRmxhZ0J1ZkFkZHJbVklERU9fRkxBR19TSVpFXTsKKworVUxPTkcgcFZIYXNoRHN0QnVmZmVyW1ZIQVNIX01BWF9EU1QvNF07CisKK1VMT05HIHBWaWRlbzFEZWNBZGRyW1ZJREVPX1NPVVJDRV9TSVpFLzRdOworVUxPTkcgcENydDFBZGRyW1ZJREVPX1NPVVJDRV9TSVpFLzRdOworLy9VTE9ORyBwQ2FwMUFkZHJbVklERU9fU09VUkNFX1NJWkUvNF07CisKK0JPT0wgQWxsb2NhdGVFbmNvZGVCdWZIb3N0KFVMT05HIE1NSU9CYXNlLCBpbnQgblZpZGVvKQoreworICAgIC8vVUxPTkcgICAgIEFkZHI7CisgICAgLy9VTE9ORyAgICAgZHdSZWdPZmZzZXQgPSBuVmlkZW8gKiAweDEwMDsKKworICAgIGlmIChWSURFTzEgPT0gblZpZGVvKQorICAgIHsKKyAgICAgICAgCisgICAgICAgIC8vQWRkciA9IChVTE9ORyltYWxsb2MocFZpZGVvSW5mby0+U3JjV2lkdGggKiBwVmlkZW9JbmZvLT5TcmNIZWlnaHQgKiA0KTsKKyAgICAgICAgLy9wQ2FwdHVyZVZpZGVvMUJ1ZjFBZGRyID0gbWFsbG9jKFZJREVPX1NPVVJDRV9TSVpFKTsKKworICAgICAgICBnX0NBUFRVUkVfVklERU8xX0JVRjFfQUREUiA9IHZCdWZBbGlnbigoVUxPTkcpcENhcHR1cmVWaWRlbzFCdWYxQWRkcik7CisgICAgICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0JVRl8xX0FERFJfUkVHLCBnX0NBUFRVUkVfVklERU8xX0JVRjFfQUREUiwgQlVGXzFfQUREUl9NQVNLKTsKKyAgICAgICAgCisgICAgICAgIC8vQWRkciA9IChVTE9ORyltYWxsb2MocFZpZGVvSW5mby0+U3JjV2lkdGggKiBwVmlkZW9JbmZvLT5TcmNIZWlnaHQgKiA0KTsKKyAgICAgICAgLy9wQ2FwdHVyZVZpZGVvMUJ1ZjJBZGRyID0gbWFsbG9jKFZJREVPX1NPVVJDRV9TSVpFKTsKKworICAgICAgICBnX0NBUFRVUkVfVklERU8xX0JVRjJfQUREUiA9IHZCdWZBbGlnbigoVUxPTkcpcENhcHR1cmVWaWRlbzFCdWYyQWRkcik7CisgICAgICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0JVRl8yX0FERFJfUkVHLCBnX0NBUFRVUkVfVklERU8xX0JVRjJfQUREUiwgQlVGXzJfQUREUl9NQVNLKTsKKyAgICAgICAgCisgICAgICAgIC8vQWRkciA9IChVTE9ORyltYWxsb2MocFZpZGVvSW5mby0+dVN0cmVhbUJ1ZlNpemUuU3RyZWFtQnVmU2l6ZS5SaW5nQnVmTnVtICogcFZpZGVvSW5mby0+dVN0cmVhbUJ1ZlNpemUuU3RyZWFtQnVmU2l6ZS5QYWNrZXRTaXplKQorICAgICAgICAvL3BWaWRlbzFDb21wcmVzc0J1ZkFkZHIgPSBtYWxsb2MoVklERU9fTUFYX1NUUkVBTV9TSVpFKTsKKyAgICAgICAgZ19WSURFTzFfQ09NUFJFU1NfQlVGX0FERFIgPSB2QnVmQWxpZ24oKFVMT05HKXBWaWRlbzFDb21wcmVzc0J1ZkFkZHIpOworICAgICAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9DT01QUkVTU19CVUZfQUREUl9SRUcsIGdfVklERU8xX0NPTVBSRVNTX0JVRl9BRERSLCBCVUZfMl9BRERSX01BU0spOworICAgICAgICAKKyAgICAgICAgLy9BZGRyID0gKFVMT05HKW1hbGxvYygocFZpZGVvSW5mby0+U3JjSGVpZ2gvNjQpICogcFZpZGVvSW5mby0+U3JjV2lkdGggKiA4KTsKKyAgICAgICAgLy9nX1ZJREVPMV9DUkNfQlVGX0FERFIgPSB2QnVmQWxpZ24oKFVMT05HKW1hbGxvYyhWSURFT19NQVhfU1RSRUFNX1NJWkUpKTsKKyAgICAgICAgLy9Xcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9DUkNfQlVGX0FERFJfUkVHLCBnX1ZJREVPMV9DUkNfQlVGX0FERFIsIEJVRl8yX0FERFJfTUFTSyk7CisgICAgICAgIAorCisgICAgICAgIC8vQWRkciA9IChVTE9ORyltYWxsb2MocFZpZGVvSW5mby0+U3JjSGVpZ2ggKiBwVmlkZW9JbmZvLT5TcmNXaWR0aCAgLyAxMjggKC82NCo0LzgpKTsKKyAgICAgICAgLy9wVmlkZW8xRmxhZ0J1ZkFkZHIgPSBtYWxsb2MoVklERU9fRkxBR19TSVpFKTsKKyAgICAgICAgZ19WSURFTzFfRkxBR19CVUZfQUREUiA9IHZCdWZBbGlnbigoVUxPTkcpcFZpZGVvMUZsYWdCdWZBZGRyKTsKKyAgICAgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfRkxBR19CVUZfQUREUl9SRUcsIGdfVklERU8xX0ZMQUdfQlVGX0FERFIsIEJVRl8yX0FERFJfTUFTSyk7CisgICAgfQorICAgIGVsc2UgaWYgKFZJREVPMiA9PSBuVmlkZW8pCisgICAgeworICAgICAgICAvL0FkZHIgPSAoVUxPTkcpbWFsbG9jKHBWaWRlb0luZm8tPlNyY1dpZHRoICogcFZpZGVvSW5mby0+U3JjSGVpZ2h0ICogNCk7CisgICAgICAgIC8vcENhcHR1cmVWaWRlbzJCdWYxQWRkciA9IG1hbGxvYyhWSURFT19TT1VSQ0VfU0laRSk7CisgICAgICAgIGdfQ0FQVFVSRV9WSURFTzJfQlVGMV9BRERSID0gdkJ1ZkFsaWduKChVTE9ORylwQ2FwdHVyZVZpZGVvMkJ1ZjFBZGRyKTsKKyAgICAgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzJfQlVGXzFfQUREUl9SRUcsIGdfQ0FQVFVSRV9WSURFTzJfQlVGMV9BRERSLCBCVUZfMV9BRERSX01BU0spOworICAgICAgICAKKyAgICAgICAgLy9BZGRyID0gKFVMT05HKW1hbGxvYyhwVmlkZW9JbmZvLT5TcmNXaWR0aCAqIHBWaWRlb0luZm8tPlNyY0hlaWdodCAqIDQpOworICAgICAgICAvL3BDYXB0dXJlVmlkZW8yQnVmMkFkZHIgPSBtYWxsb2MoVklERU9fU09VUkNFX1NJWkUpOworICAgICAgICBnX0NBUFRVUkVfVklERU8yX0JVRjJfQUREUiA9IHZCdWZBbGlnbigoVUxPTkcpcENhcHR1cmVWaWRlbzJCdWYyQWRkcik7CisgICAgICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8yX0JVRl8yX0FERFJfUkVHLCBnX0NBUFRVUkVfVklERU8yX0JVRjJfQUREUiwgQlVGXzJfQUREUl9NQVNLKTsKKyAgICAgICAgCisgICAgICAgIC8vQWRkciA9IChVTE9ORyltYWxsb2MocFZpZGVvSW5mby0+dVN0cmVhbUJ1ZlNpemUuU3RyZWFtQnVmU2l6ZS5SaW5nQnVmTnVtICogcFZpZGVvSW5mby0+dVN0cmVhbUJ1ZlNpemUuU3RyZWFtQnVmU2l6ZS5QYWNrZXRTaXplKQorICAgICAgICAvL3BWaWRlbzJDb21wcmVzc0J1ZkFkZHIgPSBtYWxsb2MoVklERU9fTUFYX1NUUkVBTV9TSVpFKTsKKyAgICAgICAgZ19WSURFTzJfQ09NUFJFU1NfQlVGX0FERFIgPSB2QnVmQWxpZ24oKFVMT05HKXBWaWRlbzJDb21wcmVzc0J1ZkFkZHIpOworICAgICAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMl9DT01QUkVTU19CVUZfQUREUl9SRUcsIGdfVklERU8yX0NPTVBSRVNTX0JVRl9BRERSLCBCVUZfMl9BRERSX01BU0spOworICAgICAgICAKKyAgICAgICAgLy9BZGRyID0gKFVMT05HKW1hbGxvYygocFZpZGVvSW5mby0+U3JjSGVpZ2gvNjQpICogcFZpZGVvSW5mby0+U3JjV2lkdGggKiA4KTsKKyAgICAgICAgLy9nX1ZJREVPMV9DUkNfQlVGX0FERFIgPSB2QnVmQWxpZ24oKFVMT05HKW1hbGxvYyhWSURFT19NQVhfU1RSRUFNX1NJWkUpKTsKKyAgICAgICAgLy9Xcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9DUkNfQlVGX0FERFJfUkVHLCBnX1ZJREVPMV9DUkNfQlVGX0FERFIsIEJVRl8yX0FERFJfTUFTSyk7CisgICAgICAgIAorCisgICAgICAgIC8vQWRkciA9IChVTE9ORyltYWxsb2MocFZpZGVvSW5mby0+U3JjSGVpZ2ggKiBwVmlkZW9JbmZvLT5TcmNXaWR0aCAgLyAxMjggKC82NCo0LzgpKTsKKyAgICAgICAgLy9wVmlkZW8yRmxhZ0J1ZkFkZHIgPSBtYWxsb2MoVklERU9fRkxBR19TSVpFKTsKKyAgICAgICAgZ19WSURFTzJfRkxBR19CVUZfQUREUiA9IHZCdWZBbGlnbigoVUxPTkcpcFZpZGVvMkZsYWdCdWZBZGRyKTsKKyAgICAgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzJfRkxBR19CVUZfQUREUl9SRUcsIGdfVklERU8yX0ZMQUdfQlVGX0FERFIsIEJVRl8yX0FERFJfTUFTSyk7CisgICAgfQorICAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogMS4gcHJvZHVjdCByYW5kb20gZGF0YSB0byBlbmNvZGUgICAgICAgICAgICAgICAgICAgICAqLworLyogMi4gdXNlIGhhc2ggdG8gdmVyaWZ5IGVuY29kZSBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLworLyogMy4gdXNlIGVuY29kZSBzdHJlYW0gdG8gZGVjb21wcmVzcyBvcmlnaW5hbCBkYXRhICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IENvZGVjVGVzdCh2b2lkKQoreworICAgIGludAkgIG51bSwgaT0wLCBqPTA7CisgICAgVUxPTkcgdWxUZW1wID0gMCwgdWxUZW1wMjsKKyAgICBpbnQgICBkd1ZhbHVlOworICAgIFVMT05HIHVsSFdXcDsKKyAgICBVTE9ORyB1bEhXUHQ7CisKKyAgICAvL21heCBzaXplCisgICAgVUxPTkcgdEFycmF5WzMyLzRdOworICAgIAorICAgIC8vbW9kZSBkZXRlY3Rpb24KKyAgICBCT09MCWJFeHRlcm5hbCA9IFRSVUU7CisgICAgQk9PTAliQW5hbG9nID0gVFJVRTsKKyAgICBVTE9ORwlTdGF0dXM7CSAgICAKKworI2lmIGRlZmluZWQoQ09ORklHX0FTVDIzMDApCisgICAgVUxPTkcgdWxIYXNoU2hhMVs1XSAgPSB7MHgzZjBjMmFkNiwweGM4ZWI3MDc0LDB4YTk5MjkzNTIsMHhmY2Q1YjhiMCwweDc2ZmE4NDYxfTsKKyAgICBVTE9ORyBhSGFzaERlY29kZVs1XSA9IHsweGIyM2I2MmJiLDB4ZDIyYTYwMmIsMHgxMTMwMzhhMCwweDcyMTdjNmFiLDB4Y2IxNTZmMDZ9OworI2Vsc2UKKyAgICBVTE9ORyB1bEhhc2hTaGExWzVdID0gezB4MmExOWU5OWYsMHg5OWIxYmIyZCwweDlhYzgyODYyLDB4NDkyMDVlNDMsMHg2YmM0YjRkN307CisgICAgVUxPTkcgYUhhc2hEZWNvZGVbNV0gPSB7MHgyOTA3YTgyNywweGFmMzM3MDc5LDB4NDc4MTdmMWYsMHhiMGI3Y2Q2OCwweDhkMzNiZDJ9OworI2VuZGlmCisKKyAgICAvL0xvYWQgcGF0dGVybiB0byBzcmMxICYgc3JjMiBidWZmZXIKKyAgICBzcmFuZCgxKTsKKworICAgIC8vVG90YWwgc2l6ZSA6IERlZldpZHRoKkRlSGVpZ2h0KjQKKyAgICAvL3JhbmQgZnVuY3Rpb246IDE2IGJpdHMgb25lIHRpbWUgaXMgZXF1YWwgdG8gMiBieXRlcworICAgIC8vT3V0ZHdtQmFua01vZGU6IDMyIGJpdHMgb25lIHRpbWUgaXMgZXF1YWwgdG8gNCBieXRlcworICAgIGZvciAoaT0wOyBpPGdfRGVmV2lkdGgqZ19EZWZIZWlnaHQqMjsgaSsrKQorICAgIHsKKwlpZiAoaSUyKQorCXsKKwkgICAgdWxUZW1wMiA9IHJhbmQoKTsKKwkgICAgdWxUZW1wID0gKHVsVGVtcDIgPDwgMTYpIHwgdWxUZW1wOworCSAgICAvL1dyaXRlTWVtb3J5TG9uZ0hvc3QoRFJBTV9CQVNFLCBnX0NBUFRVUkVfVklERU8xX0JVRjFfQUREUiArICgoaS0xKS8yKSo0LCB1bFRlbXApOworCSAgICAqKCgoVUxPTkcgKilnX0NBUFRVUkVfVklERU8xX0JVRjFfQUREUikgKyAoaS0xKS8yKSA9IHVsVGVtcDsKKwkgICAgdWxUZW1wID0gMDsKKwl9CisJZWxzZQorCXsKKwkgICAgdWxUZW1wID0gcmFuZCgpOworCX0KKyAgICB9CisKKyAgICAvKiBpbml0IGVuY29kZXIgZW5naW5lICovCisgICAgSW5pdGlhbGl6ZVZpZGVvRW5naW5lSG9zdCAoMCwKKwkJCSAgICAgICBWSURFTzEsCisJCQkgICAgICAgdk1vZGVUYWJsZVsyXS5Ib3JQb2xhcml0eSwKKwkJCSAgICAgICB2TW9kZVRhYmxlWzJdLlZlclBvbGFyaXR5KTsKKworICAgIC8qIHJlc2V0IG9mZnNldCBwb2ludGVyIHJlZ2lzdGVyKi8gICAgCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfRU5HSU5FX1NFUVVFTkNFX0NPTlRST0xfUkVHLCAwLCBWSURFT19DT0RFQ19UUklHR0VSIHwgVklERU9fQ0FQVFVSRV9UUklHR0VSKTsKKworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0NPTVBSRVNTX0JVRl9SRUFEX09GRlNFVF9SRUcsIDAsIENPTVBSRVNTX0JVRl9SRUFEX09GRlNFVF9NQVNLKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9CVUZfQ09ERUNfT0ZGU0VUX1JFQUQsIDAsIEJVRl9DT0RFQ19PRkZTRVRfTUFTSyk7CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfQ09NUFJFU1NfQlVGX1BST0NFU1NfT0ZGU0VUX1JFRywgMCwgQ09NUFJFU1NfQlVGX1BST0NFU1NfT0ZGU0VUX01BU0spOworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0NPTVBSRVNTX0ZSQU1FX0VORF9SRUFELCAwLCBDT01QUkVTU19GUkFNRV9FTkRfUkVBRF9NQVNLKTsKKworICAgIC8qIHN0YXJ0IGNvbXByZXNzIHN0cmVhbSAqLworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0VOR0lORV9TRVFVRU5DRV9DT05UUk9MX1JFRywgTU9ERV9ERVRFQ1RJT05fVFJJR0dFUiwgTU9ERV9ERVRFQ1RJT05fVFJJR0dFUik7CisgICAgLy9TdHJlYW0gbW9kZTogc2V0IENPREVDIHRyaWdnZXIgZmlyc3QKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9FTkdJTkVfU0VRVUVOQ0VfQ09OVFJPTF9SRUcsIFZJREVPX0NPREVDX1RSSUdHRVIsIFZJREVPX0NPREVDX1RSSUdHRVIpOworCisgICAgLy9TdHJlYW0gbW9kZTogc3RhcnQgdHJpZ2dlciAob25seSB0cmlnZ2VyIGNhcHR1cmUgYml0KQorICAgIFN0YXJ0VmlkZW9DYXB0dXJlVHJpZ2dlckhvc3QoMCwgVklERU8xX0VOR0lORV9TRVFVRU5DRV9DT05UUk9MX1JFRyk7CisKKyAgICAvL3N0b3AgZW5naW5lCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfRU5HSU5FX1NFUVVFTkNFX0NPTlRST0xfUkVHLCAwLCAweEZGKTsgICAgCisjaWYgZGVmaW5lZChDT05GSUdfQVNUMjMwMCkKKyAgICBkbyB7CS8qIHdhaXQgY29tcHJlc3MgZW5naW5lIGlkbGUgKi8KKwl1bFRlbXAgPSBSZWFkTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9FTkdJTkVfU0VRVUVOQ0VfQ09OVFJPTF9SRUcpOyAgICAJCisgICAgfSB3aGlsZSAoISh1bFRlbXAgJiAweDQwMDAwKSk7CQorI2VuZGlmCisKKyAgICAvL3JlYWQgMzAgdGltZXMgdG8gZ2V0IEhXIHdyaXRlIHBvaW50ZXIKKyAgICBmb3IgKGk9MDsgaTwzMDAwMDsgaSsrKQorCXVsSFdXcCA9IFJlYWRNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0JVRl9DT0RFQ19PRkZTRVRfUkVBRCk7CisKKyAgICBnX0hhc2hTcmNCdWZmZXIgPSBnX1ZJREVPMV9DT01QUkVTU19CVUZfQUREUiArIDEyODsgLy9za2lwIGVuY29kZSBkYXRhIDEyOCBieXRlCQorICAgIGdfSGFzaERzdEJ1ZmZlciA9IHYxNmJ5dGVBbGlnbigodW5zaWduZWQgbG9uZylwVkhhc2hEc3RCdWZmZXIpOworICAgIHVsVGVtcCA9IDMwMDsKKworICAgIC8vRW5hYmxlIGhhc2ggY2xvY2sKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoU0NVX0JBU0UsIFNDVV9DTE9DS19TVE9QX1JFRywgRU5fSEFDRSwgU1RPUF9IQUNFX01BU0spOworICAgIGdfSGFzaE1ldGhvZC5IYXNoTW9kZSA9IFZIQVNITU9ERV9TSEExOworICAgIGdfSGFzaE1ldGhvZC5EaWdlc3RMZW4gPSAyMDsKKyAgICBIYXNoQXN0MzAwMCh1bFRlbXAsIHRBcnJheSwgZ19IYXNoTWV0aG9kLkhhc2hNb2RlKTsKKworICAgIGlmIChzdHJuY21wKChjb25zdCBjaGFyICopdEFycmF5LCAoY29uc3QgY2hhciAqKXVsSGFzaFNoYTEsIGdfSGFzaE1ldGhvZC5EaWdlc3RMZW4pKQorICAgIHsKKwlwcmludGYoIltWSURFT10gRW5jb2RlciBUZXN0OiBXcm9uZ1xuIik7CisgICAgICAgIC8vRXhpdFZpZGVvVGVzdCgpOworICAgICAgICByZXR1cm4gVklERU9fRU5DT0RFX0ZBSUw7CisgICAgfQorICAgIGVsc2UKKyAgICB7ICAgIAorCXByaW50ZigiW1ZJREVPXSBFbmNvZGVyIFRlc3Q6IFBhc3NcbiIpOworICAgIH0KKworI2lmIDAKKyAgICAvKioqKioqKiogcHJlcGFyZSBmb3IgbmV4dCBkZWNvZGluZyB0ZXN0IGF0IHRoZSBzYW1lIGNoaXAgKioqKioqKioqKiovCisgICAgUmVzZXRWaWRlb0hvc3QoKTsKKworICAgIGR3VmFsdWU9MDsKKworICAgIGRvCisgICAgeworCWR3VmFsdWUgPSBVbmxvY2tWaWRlb1JlZ0hvc3QoMCwgVklERU9fVU5MT0NLX0tFWSk7CisJaSsrOworICAgIH0KKyAgICB3aGlsZSAoKFZJREVPX1VOTE9DSyAhPSBkd1ZhbHVlKSAmJiAoaTwxMCkpOworCisgICAgaWYgKFZJREVPX1VOTE9DSyAhPSBkd1ZhbHVlKQorICAgIHsKKwlwcmludGYoIltWSURFT10gVmlkZW8gcmVnaXN0ZXIgaXMgbG9ja2VkIik7CisJcmV0dXJuIFZJREVPX1VOTE9DS19GQUlMOworICAgIH0KKworICAgIC8vIGFsbG9jYXRlIGRlY29kaW5nIGJ1ZmZlcgorICAgIC8vVXNlIENvbXByZXNzIGJ1ZmZlciBsYXN0IHRpbWUsIGFuZCBEb24ndCBuZWVkIHRvIGFsbG9jYXRlCisgICAgZ19WSURFTzFfREVDT0RFX0JVRl8xX0FERFIgPSBnX1ZJREVPMV9DT01QUkVTU19CVUZfQUREUjsKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9CVUZfMV9BRERSX1JFRywgZ19WSURFTzFfREVDT0RFX0JVRl8xX0FERFIsIEJVRl8xX0FERFJfTUFTSyk7CisgICAgCisgICAgLy8JcFZpZGVvMURlY0FkZHIgPSBtYWxsb2MoVklERU9fU09VUkNFX1NJWkUpOworICAgIGdfVklERU8xX0RFQ09NUFJFU1NfQlVGX0FERFIgPSB2QnVmQWxpZ24oKHVuc2lnbmVkIGxvbmcpcFZpZGVvMURlY0FkZHIpOyAgICAKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9DT01QUkVTU19CVUZfQUREUl9SRUcsIGdfVklERU8xX0RFQ09NUFJFU1NfQlVGX0FERFIsIENPTVBSRVNTX0JVRl9BRERSX01BU0spOworICAgIAorICAgIC8vQWRkciA9IChVTE9ORyltYWxsb2MoMjU2KTsKKyAgICAvL2dfVklERU8xX1JDNF9CVUZfQUREUiA9IEFkZHI7CisgICAgLy9nX1ZJREVPMV9ERUNPREVfUkM0X0JVRl9BRERSID0gZ19WSURFTzFfREVDT01QUkVTU19CVUZfQUREUiArIDB4ODAwMDAwOyAvL2Fzc3VtZSB2aWRlbyBzaXplIGlzIDhNQiBmb3IgdW1jb21wcmVzc2VkIGJ1ZjsKKyAgICAvL1dyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLQ2xpZW50KFZJREVPX1JFR19CQVNFLCBWSURFTzFfUkM0X1RBQkxFX0FERFIsIGdfVklERU8xX0RFQ09ERV9SQzRfQlVGX0FERFIsIFJDNF9UQUJMRV9BRERSX01BU0spOworCisgICAgLy9IVyByZWNvbW1hbmRlZCB2YWx1ZQorICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0JVRl8yX0FERFJfUkVHLCBnX1ZJREVPMV9ERUNPTVBSRVNTX0JVRl9BRERSLCBCVUZfMl9BRERSX01BU0spOworICAgIC8vV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tDbGllbnQoVklERU9fUkVHX0JBU0UsIFZJREVPMV9CVUZfMl9BRERSX1JFRywgMCwgQlVGXzJfQUREUl9NQVNLKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9DUkNfQlVGX0FERFJfUkVHLCAwLCBCVUZfMl9BRERSX01BU0spOyAgICAgICAgICAgIAorCisgICAgLyogaW5pdCBlbmNvZGVyIGVuZ2luZSAqLworICAgIEluaXRpYWxpemVWaWRlb0VuZ2luZUNsaWVudCAoMCwgVklERU8xKTsKKworICAgIC8qIHJlc2V0IG9mZnNldCBwb2ludGVyIHJlZ2lzdGVyKi8gICAgCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfRU5HSU5FX1NFUVVFTkNFX0NPTlRST0xfUkVHLCAwLCBWSURFT19DT0RFQ19UUklHR0VSIHwgVklERU9fQ0FQVFVSRV9UUklHR0VSKTsKKworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0NPTVBSRVNTX0JVRl9SRUFEX09GRlNFVF9SRUcsIDAsIENPTVBSRVNTX0JVRl9SRUFEX09GRlNFVF9NQVNLKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9CVUZfQ09ERUNfT0ZGU0VUX1JFQUQsIDAsIEJVRl9DT0RFQ19PRkZTRVRfTUFTSyk7CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfQ09NUFJFU1NfQlVGX1BST0NFU1NfT0ZGU0VUX1JFRywgMCwgQ09NUFJFU1NfQlVGX1BST0NFU1NfT0ZGU0VUX01BU0spOworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0NPTVBSRVNTX0ZSQU1FX0VORF9SRUFELCAwLCBDT01QUkVTU19GUkFNRV9FTkRfUkVBRF9NQVNLKTsKKworICAgIFN0YXJ0VmlkZW9Db2RlY1RyaWdnZXJIb3N0KDAsIFZJREVPMV9FTkdJTkVfU0VRVUVOQ0VfQ09OVFJPTF9SRUcpOworCisgICAgLy93cnRpZSBTVyB3cml0ZSBwb2ludGVyCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfREVDT01QUkVTU19CVUZfUFJPQ0VTU19PRkZTRVRfUkVHLCB1bEhXV3AsIENPTVBSRVNTX0JVRl9SRUFEX09GRlNFVF9NQVNLKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9ERUNPTVBSRVNTX0JVRl9XUklURV9PRkZTRVRfUkVHLCB1bEhXV3AsIENPTVBSRVNTX0JVRl9SRUFEX09GRlNFVF9NQVNLKTsKKworICAgIGkgPSAwOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHVsSFdQdCA9IFJlYWRNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0JVRl9DT0RFQ19PRkZTRVRfUkVBRCk7CisgICAgICAgIGkrKzsKKyAgICB9d2hpbGUoKHVsSFdQdCAhPSB1bEhXV3ApICYmIChpPDEwMDAwKSk7CisKKyAgICBpZiAoMTAwMDAgPiBpKQorICAgIHsKKyAJcHJpbnRmKCJbVklERU9dIERlY29kZXIgUG9pbnRlciBjYW5ub3QgbW92ZSEhISAvbiIpOworICAgICAgICAvL0V4aXRWaWRlb1Rlc3QoKTsKKwlyZXR1cm4gVklERU9fREVDT0RFX0ZBSUw7ICAgICAgIAorICAgIH0KKyAgICAgICAgCisgICAgLy84KjggWVVWQSBibG9jaworICAgIGZvciAoaT0yNDsgaTxnX0RlZldpZHRoKmdfRGVmSGVpZ2h0OyBpPWkrMzIpCisgICAgeworICAgICAgICAqKCgoVUxPTkcgKilnX1ZJREVPMV9ERUNPTVBSRVNTX0JVRl9BRERSKSArIGkpID0gMHgwOworCSooKChVTE9ORyAqKWdfVklERU8xX0RFQ09NUFJFU1NfQlVGX0FERFIpICsgaSsxKSA9IDB4MDsKKyAgICB9CisKKyAgICBnX0hhc2hTcmNCdWZmZXIgPSBnX1ZJREVPMV9ERUNPTVBSRVNTX0JVRl9BRERSOworICAgIC8vZ19IYXNoRHN0QnVmZmVyID0gVklERU8xX0VOX0JBU0UgKyBWSURFT19BTExfU0laRTsgLy9jb25maWcgZm9yd2FyZAorCisgICAgdWxUZW1wID0gMzAwOworCisgICAgLy9FbmFibGUgaGFzaCBjbG9jaworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgU0NVX0NMT0NLX1NUT1BfUkVHLCBFTl9IQUNFLCBTVE9QX0hBQ0VfTUFTSyk7CisgICAgZ19IYXNoTWV0aG9kLkhhc2hNb2RlID0gVkhBU0hNT0RFX1NIQTE7CisgICAgZ19IYXNoTWV0aG9kLkRpZ2VzdExlbiA9IDIwOworICAgIEhhc2hBc3QzMDAwKHVsVGVtcCwgdEFycmF5LCBnX0hhc2hNZXRob2QuSGFzaE1vZGUpOworCisgICAgaWYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKil0QXJyYXksIChjb25zdCBjaGFyICopYUhhc2hEZWNvZGUsIGdfSGFzaE1ldGhvZC5EaWdlc3RMZW4pKQorICAgIHsKKwlwcmludGYoIltWSURFT10gRGVjb2RlciBUZXN0OiBXcm9uZ1xuIik7CisgICAgICAgIC8vRXhpdFZpZGVvVGVzdCgpOworICAgICAgICByZXR1cm4gVklERU9fREVDT0RFX0ZBSUw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcHJpbnRmKCJbVklERU9dIERlY29kZXIgVGVzdDogUGFzc1xuIik7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gVklERU9fVEVTVF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIE9ubHkgdXNlZCBpbiB0aGUgaG9zdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHRlc3QgZnVuY3Rpb246IE1vZGUgZGV0ZWN0aW9uIGFuZCBDYXB0dXJlIHBhdHRlcm4gICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IENhcFRlc3Qodm9pZCkKK3sKKyAgICBVTE9ORyAgIGR3VmFsdWUsIFN0YXR1czsKKyAgICBpbnQgICAgIGk7CisgICAgQk9PTCAgICBiQW5hbG9nOworICAgIFVMT05HCUhTdGFydCwgSEVuZCwgVlN0YXJ0LCBWRW5kOworICAgIFVTSE9SVAl1c0NSVEhvciwgdXNDUlRWZXI7CisgICAgVUxPTkcgICB1bEhvciwgdWxWZXI7CisgICAgVUxPTkcgICB1bFZHQUJhc2VBZGRyLCB1bENhcEFkZHI7CisgICAgVUxPTkcgICB1bEZsYWc7CisgICAgCisgICAgcHJpbnRmKCJcbiAtLS0tLS0tLS0gTW9kZSBEZXRlY3Rpb24gVGVzdCAtLS0tLS0tLS0gXG4iKTsKKyAgICAvL2NsZWFyIGNsZWFyIHJlZ2lzdGVyCisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0NPTlRST0xfUkVHLCAwKTsKKyAgICBkd1ZhbHVlID0gUmVhZE1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfQ09OVFJPTF9SRUcpOworCisgICAgLy8gIE5vdGU6IEN1cnJlbnQgbW9kZSBkZXRlY3Rpb24gcHJvY2VkdXJlIGhhcyB0byBzZXQgc2lnbmFsIGlucHV0IDFzdAorICAgIC8vTm90ZTogQ2xlYXIgYW5kIGVuYWJsZSBpbnRlcnJ1cHQgRW5jb2RlCisgICAgQ2xlYXJWaWRlb0ludGVycnVwdEhvc3QoMCwgVklERU8xX01PREVfREVURUNUSU9OX1JFQURZX0NMRUFSKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPX0lOVF9DT05UUk9MX0VOX1JFRywgVklERU8xX01PREVfREVURUNUSU9OX1JFQURZX0lOVF9FTiwgVklERU8xX01PREVfREVURUNUSU9OX1JFQURZX0lOVF9FTik7CisgICAgLy8gIFNldCBpbnB1dCBzaWduYWwKKyAgICBkd1ZhbHVlIHw9IEVYVEVSTkFMX1ZHQV9TT1VSQ0U7CisgICAgCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfQ09OVFJPTF9SRUcsIChkd1ZhbHVlIDw8RVhURVJOQUxfU09VUkNFX0JJVCksIEVYVEVSTkFMX1NPVVJDRV9NQVNLKTsKKworLy8gIFNldCBIL1Ygc3RhYmxlIG1heGltdW0KKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPX01PREVfREVURUNUSU9OX1BBUkFNX1JFRywgKE1PREVERVRFQ1RJT05fVkVSVElDQUxfU1RBQkxFX01BWElNVU0gPDwgVkVSX1NUQUJMRV9NQVhfQklUKSwgMHgwMDBGMDAwMCk7CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFT19NT0RFX0RFVEVDVElPTl9QQVJBTV9SRUcsIChNT0RFREVURUNUSU9OX0hPUklaT05UQUxfU1RBQkxFX01BWElNVU0gPDwgSE9SX1NUQUJMRV9NQVhfQklUKSwgSE9SX1NUQUJMRV9NQVhfQklUX01BU0spOworLy8gIFNldCBIL1Ygc3RhYmxlIHRocmVzaG9sZAorICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU9fTU9ERV9ERVRFQ1RJT05fUEFSQU1fUkVHLCAoTU9ERURFVEVDVElPTl9WRVJUSUNBTF9TVEFCTEVfVEhSRVNIT0xEIDw8IFZFUl9TVEFCTEVfVEhSRVNfQklUKSwgVkVSX1NUQUJMRV9USFJFU19CSVRfTUFTSyk7CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFT19NT0RFX0RFVEVDVElPTl9QQVJBTV9SRUcsIChNT0RFREVURUNUSU9OX0hPUklaT05UQUxfU1RBQkxFX1RIUkVTSE9MRCA8PCBIT1JfU1RBQkxFX1RIUkVTX0JJVCksIEhPUl9TVEFCTEVfVEhSRVNfQklUX01BU0spOworICAgIAorICAgIC8vVHJpZ2dlciBtb2RlIGRldGVjdGlvbgorICAgIC8vIHR1cm4gb2ZmIFdBVENIX0RPRyBmaXJzdAorICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX0VOR0lORV9TRVFVRU5DRV9DT05UUk9MX1JFRywgKFdBVENIX0RPR19PRkYgPDwgV0FUQ0hfRE9HX0VOQUJMRV9CSVQpLCBXQVRDSF9ET0dfRU5fTUFTSyk7CisgICAgICAgIAorICAgIC8vICBOb3RlOiBDbGVhciBtb2RlIGRldGVjdGlvbiByZWFkeSBpbnRlcnJ1cHQKKyAgICAvL0NsZWFyVmlkZW9JbnRlcnJ1cHQoTU1JT0Jhc2UsIE1PREVfREVURUNUSU9OX1JFQURZX0NMRUFSKTsKKyAgICBTdGFydE1vZGVEZXRlY3Rpb25UcmlnZ2VySG9zdCgwLCBWSURFTzFfRU5HSU5FX1NFUVVFTkNFX0NPTlRST0xfUkVHKTsKKworCisvLyAgTm90ZTogUG9sbGluZyBtb2RlIGRldGVjdGlvbiByZWFkeSBpbnRlcnJ1cHQKKyAgICAvL2l0IHNvbWV0aW1lIHRha2UgYSBsb25nIHRpbWUsIGVzcGVjaWFsbHkgZHVyaW5nIGNoYW5nZSBtb2RlLCAKKyAgICAvL3NvIHRoZSBsb29wIGNvdW50IG11c3QgYmUgYmlnLCBvciB5b3UgY2FuJ3QgcHVsbCBpdCBieSB0aW1lcgorICAgIGkgPSAwOworICAgIGRvIHsKKworCQlTdGF0dXMgPSBSZWFkVmlkZW9JbnRlcnJ1cHRIb3N0KDAsIFZJREVPMV9NT0RFX0RFVEVDVElPTl9SRUFEWV9SRUFEKTsKKwkJaSsrOworICAgIH0gd2hpbGUgKCghU3RhdHVzKSAmIChpPDUwMDAwMCkpOworCisgICAgaWYgKCFTdGF0dXMpCisgICAgeworCXByaW50ZigiW1ZJREVPXSBNb2RlIGRldGVjdGlvbiBlcnJvclxuIik7CisgICAgICAgIC8vRXhpdFZpZGVvVGVzdCgpOworCXJldHVybiBWSURFT19URVNUX0ZBSUw7CisgICAgfQorCisgICAgSFN0YXJ0CT0gKFJlYWRNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERTFfTU9ERV9ERVRFQ1RJT05fRURHRV9IX1JFRykgJiBMRUZUX0VER0VfTE9DQVRJT05fTUFTSykgPj4gTEVGVF9FREdFX0xPQ0FUSU9OX0JJVDsKKyAgICBIRW5kCT0gKFJlYWRNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERTFfTU9ERV9ERVRFQ1RJT05fRURHRV9IX1JFRykgJiBSSUdIVF9FREdFX0xPQ0FUSU9OX01BU0spID4+IFJJR0hUX0VER0VfTE9DQVRJT05fQklUOworCisgICAgVlN0YXJ0CT0gKFJlYWRNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgVklERTFfTU9ERV9ERVRFQ1RJT05fRURHRV9WX1JFRykgJiBUT1BfRURHRV9MT0NBVElPTl9NQVNLKSA+PiBUT1BfRURHRV9MT0NBVElPTl9CSVQ7CisgICAgVkVuZAk9IChSZWFkTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREUxX01PREVfREVURUNUSU9OX0VER0VfVl9SRUcpICYgQk9UVE9NX0VER0VfTE9DQVRJT05fTUFTSykgPj4gQk9UVE9NX0VER0VfTE9DQVRJT05fQklUOworCisgICAgdWxIb3IgPSBIRW5kLUhTdGFydCsxOworICAgIHVsVmVyID0gVkVuZC1WU3RhcnQrMTsKKworICAgIHByaW50ZigiW1ZJREVPXSBSZXNvbHV0aW9uOiBIWyVkXSAqIFZbJWRdXG4iLCB1bEhvciwgdWxWZXIpOworCisgICAgaWYgKChnX0RlZldpZHRoID09IHVsSG9yKSAmIChnX0RlZkhlaWdodCA9PSB1bFZlcikpCisgICAgeworICAgIAlwcmludGYoIltWSURFT10gTW9kZSBkZXRlY3Rpb24gUEFTU1xuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcHJpbnRmKCJbVklERU9dIE1vZGUgZGV0ZWN0aW9uIEZBSUxcbiIpOworCXJldHVybiBWSURFT19URVNUX0ZBSUw7CisgICAgfQorCisgICAgaWYoISgoUmVhZE1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfTU9ERV9ERVRFQ1RJT05fU1RBVFVTX1JFQURfUkVHKSAmIEFOQUxPTkdfRElHSVRBTF9SRUFEKSA+PiBBTkFMT05HX0RJR0lUQUxfUkVBRF9CSVQpKQorCWJBbmFsb2cgPSBGQUxTRTsKKyAgICBlbHNlCisJYkFuYWxvZyA9IFRSVUU7CisKKyAgICAvLyAgTm90ZTogQ2xlYXIgbW9kZSBkZXRlY3Rpb24gcmVhZHkgaW50ZXJydXB0CisgICAgQ2xlYXJWaWRlb0ludGVycnVwdEhvc3QoMCwgVklERU8xX01PREVfREVURUNUSU9OX1JFQURZX0NMRUFSKTsKKworICAgIHByaW50ZigiXG4gLS0tLS0tLS0tIENhcHR1cmUgVGVzdCAtLS0tLS0tLS0gXG4iKTsKKworICAgIC8vY2FwdHVyZSBlbmdpbmUKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9USU1FSU5HX0dFTl9IT1JfUkVHLCAoSEVuZCA8PCBWSURFT19IREVfRU5EX0JJVCksIFZJREVPX0hERV9FTkRfTUFTSyk7CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfVElNRUlOR19HRU5fSE9SX1JFRywgKEhTdGFydCA8PCBWSURFT19IREVfU1RBUlRfQklUKSwgVklERU9fSERFX1NUQVJUX01BU0spOworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChWSURFT19SRUdfQkFTRSwgVklERU8xX1RJTUVJTkdfR0VOX1ZfUkVHLCAoVkVuZCA8PCBWSURFT19WREVfRU5EX0JJVCksIFZJREVPX1ZERV9FTkRfTUFTSyk7CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfVElNRUlOR19HRU5fVl9SRUcsIChWU3RhcnQgPDwgVklERU9fVkRFX1NUQVJUX0JJVCksIFZJREVPX1ZERV9TVEFSVF9NQVNLKTsKKwkKKyAgICB1bENhcEFkZHIgPSB2QnVmQWxpZ24yKChVTE9ORylwQ2FwdHVyZVZpZGVvMUJ1ZjFBZGRyKTsgICAgCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfQlVGXzFfQUREUl9SRUcsIHVsQ2FwQWRkciwgQlVGXzFfQUREUl9NQVNLKTsKKyAgICAKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9CVUZfMl9BRERSX1JFRywgMCwgQlVGXzJfQUREUl9NQVNLKTsKKworICAgIEluaXRpYWxpemVWaWRlb0VuZ2luZUhvc3QgKDAsCisJCQkgICAgICAgVklERU8xLAorCQkgICAgICAgICAgICAgICB2TW9kZVRhYmxlWzJdLkhvclBvbGFyaXR5LAorCQkJICAgICAgIHZNb2RlVGFibGVbMl0uVmVyUG9sYXJpdHkpOworCisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgMHgwNCwgMHgwMSk7CisgICAgV3JpdGVNZW1vcnlMb25nSG9zdChWSURFT19SRUdfQkFTRSwgMHgzMDAsIDB4MCk7CisjaWYgZGVmaW5lZChDT05GSUdfQVNUMjMwMCkKKwlXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIDB4OCwgMHgwODgwLCAweDBlYzApOworI2VsaWYgZGVmaW5lZChDT05GSUdfQVNUMzAwMCkKKwlXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIDB4OCwgMHgyODAwLCAweDI4MDApOwkKKyNlbHNlCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFZJREVPX1JFR19CQVNFLCAweDgsIDB4YTAwLCAweDJhODApOyAvL3RpbGUgbW9kZQorI2VuZGlmCisKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9USU1FSU5HX0dFTl9IT1JfUkVHLCAweGEwMDAwMDAwLCAweGEwMDAwMDAwKTsKKyAgIAorICAgIC8vb25seSB0cmlnZ2VyIGNhcHR1cmUsIGluIHNvdXJjZSBidWZmZXIgKHZyNDQpLCB0aGUgZnJvbnQgb2YgZGF0YSBpcyBjb3JyZWN0LgorICAgIC8vU3RhcnRWaWRlb0NhcHR1cmVUcmlnZ2VySG9zdCgwLCBWSURFTzFfRU5HSU5FX1NFUVVFTkNFX0NPTlRST0xfUkVHKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KFZJREVPX1JFR19CQVNFLCBWSURFTzFfRU5HSU5FX1NFUVVFTkNFX0NPTlRST0xfUkVHLCBWSURFT19DQVBUVVJFX1RSSUdHRVIpOworCisgICAgaSA9IDA7CisgICAgZG8geworICAgICAgICBTdGF0dXMgPSBSZWFkTWVtb3J5TG9uZ0hvc3QoVklERU9fUkVHX0JBU0UsIFZJREVPMV9FTkdJTkVfU0VRVUVOQ0VfQ09OVFJPTF9SRUcpICYgQ0FQVFVSRV9SRUFEWV9NQVNLOworCWkrKzsKKyAgICB9IHdoaWxlICgoIVN0YXR1cykgJiAoaTw1MDAwMDApKTsKKworICAgIGlmICghU3RhdHVzKQorICAgIHsKKwlwcmludGYoIltWSURFT10gQ2FwdHVyZSBpcyBub3QgUkVBRFlcbiIpOworCXJldHVybiBWSURFT19URVNUX0ZBSUw7CisgICAgfSAgCisKKyNpZiAhZGVmaW5lZChDT05GSUdfQVNUMjMwMCkJCisgICAgdWxWR0FCYXNlQWRkciA9IHVsQ2FwQWRkciArIDB4MTAwMDsKKworICAgIC8qIGNoZWNrIHBhdHRlcm4gKi8KKyAgICB1bEZsYWcgPSAwOyAvL25vIDAgaXMgZXJyb3IKKworICAgIGZvciAoaT0wOyBpPDEwMDsgaSsrKQorICAgIHsKKyAgICAgICAgZHdWYWx1ZSA9ICooVUxPTkcgKikodWxWR0FCYXNlQWRkciArIGkqMzIpOworCWlmICgweDMyMzIzMjMyICE9IGR3VmFsdWUpCisJeworCSAgICBwcmludGYoIltWSURFT10gQ2FwdHVyZSBUZXN0IGZhaWwgLS0gY2FwdHVyZSBkYXRhIGRvZXNuJ3QgbWF0Y2ggc291cmNlIFxuIik7CisJICAgIHByaW50ZigiW1ZJREVPXTEgaT0lZCB2YWx1ZT0leFxuIiwgaSwgZHdWYWx1ZSk7CisgICAgICAgICAgICB1bEZsYWcgPSAxOworICAgICAgICAgICAgYnJlYWs7CisJfQorCisJZHdWYWx1ZSA9ICooVUxPTkcgKikodWxWR0FCYXNlQWRkciArIGkqMzIgKyA0KTsKKwlpZiAoMHgzMjMyMzIzMiAhPSBkd1ZhbHVlKQorCXsKKwkgICAgcHJpbnRmKCJbVklERU9dIENhcHR1cmUgVGVzdCBmYWlsIC0tIGNhcHR1cmUgZGF0YSBkb2Vzbid0IG1hdGNoIHNvdXJjZSBcbiIpOworCSAgICBwcmludGYoIltWSURFT10yIGk9JWQgdmFsdWU9JXhcbiIsIGksIGR3VmFsdWUpOworCSAgICB1bEZsYWcgPSAxOworCSAgICBicmVhazsKKwl9CisKKwlkd1ZhbHVlID0gKihVTE9ORyAqKSh1bFZHQUJhc2VBZGRyICsgaSozMiArIDgpOworCWlmICgweDgwODA4MDgwICE9IGR3VmFsdWUpCisJeworCSAgICBwcmludGYoIltWSURFT10gQ2FwdHVyZSBUZXN0IGZhaWwgLS0gY2FwdHVyZSBkYXRhIGRvZXNuJ3QgbWF0Y2ggc291cmNlIFxuIik7CisJICAgIHByaW50ZigiW1ZJREVPXTMgaT0lZCB2YWx1ZT0leFxuIiwgaSwgZHdWYWx1ZSk7CisJICAgIHVsRmxhZyA9IDE7CisJICAgIGJyZWFrOworCX0KKworCWR3VmFsdWUgPSAqKFVMT05HICopKHVsVkdBQmFzZUFkZHIgKyBpKjMyICsgMTIpOworCWlmICgweDgwODA4MDgwICE9IGR3VmFsdWUpCisJeworCSAgICBwcmludGYoIltWSURFT10gQ2FwdHVyZSBUZXN0IGZhaWwgLS0gY2FwdHVyZSBkYXRhIGRvZXNuJ3QgbWF0Y2ggc291cmNlIFxuIik7CisJICAgIHByaW50ZigiNCBpPSVkIHZhbHVlPSV4XG4iLCBpLCBkd1ZhbHVlKTsKKwkgICAgdWxGbGFnID0gMTsKKwkgICAgYnJlYWs7CisJfQorCisJZHdWYWx1ZSA9ICooVUxPTkcgKikodWxWR0FCYXNlQWRkciArIGkqMzIgKyAxNik7CisJaWYgKDB4ODA4MDgwODAgIT0gZHdWYWx1ZSkKKwl7CisJICAgcHJpbnRmKCJbVklERU9dIENhcHR1cmUgVGVzdCBmYWlsIC0tIGNhcHR1cmUgZGF0YSBkb2Vzbid0IG1hdGNoIHNvdXJjZSBcbiIpOworCSAgIHByaW50ZigiNSBpPSVkIHZhbHVlPSV4XG4iLCBpLCBkd1ZhbHVlKTsKKwkgICB1bEZsYWcgPSAxOworCSAgIGJyZWFrOworCX0KKworCWR3VmFsdWUgPSAqKFVMT05HICopKHVsVkdBQmFzZUFkZHIgKyBpKjMyICsgMjApOworCWlmICgweDgwODA4MDgwICE9IGR3VmFsdWUpCisJeworCSAgIHByaW50ZigiW1ZJREVPXSBDYXB0dXJlIFRlc3QgZmFpbCAtLSBjYXB0dXJlIGRhdGEgZG9lc24ndCBtYXRjaCBzb3VyY2UgXG4iKTsKKwkgICBwcmludGYoIjYgaT0lZCB2YWx1ZT0leFxuIiwgaSwgZHdWYWx1ZSk7CisJICAgdWxGbGFnID0gMTsKKwkgICBicmVhazsKKwkgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGlmICghdWxGbGFnKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJbVklERU9dIENhcHR1cmUgVGVzdCBPS1xuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcHJpbnRmKCJbVklERU9dIENhcHR1cmUgVGVzdCBGQUlMXG4iKTsKKwlyZXR1cm4gVklERU9fVEVTVF9GQUlMOworICAgIH0KKwkKKyAgICByZXR1cm4gVklERU9fVEVTVF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIE9ubHkgdXNlZCBpbiB0aGUgc3RhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IENSVFRlc3Qodm9pZCkKK3sKKyAgICBVTE9ORyAgIHVsVkdBQmFzZUFkZHI7CisgICAgQllURSAgICBidENSVENlbnRlck1vZGUsIGJ0Q1JUQ29sb3JGbXQ7CisgICAgVVNIT1JUICB1c0NSVEhvciwgdXNDUlRWZXI7CisgICAgVUxPTkcgICB1bERhdGE7CisKKyAgICBpbnQgaSxqOworCisgICAgLy9wcmludGYoIlxuIC0tLS0tLS0tLSBUdXJuIG9uIENSVCAtLS0tLS0tLS0gXG4iKTsKKyAgICAKKyAgICAvL0VuYWJsZSBDUlQxIGZpcnN0CisgICAgdWxWR0FCYXNlQWRkciA9IHZCdWZBbGlnbigodW5zaWduZWQgbG9uZylwQ3J0MUFkZHIpOworICAgIAorICAgIGJ0Q1JUQ2VudGVyTW9kZSAgICAgPSAwOworICAgIGJ0Q1JUQ29sb3JGbXQJPSBZVVZfNDQ0OworICAgIHVzQ1JUSG9yCQk9IGdfRGVmV2lkdGg7CisgICAgdXNDUlRWZXIJCT0gZ19EZWZIZWlnaHQ7CQorCisgICAgQ2hlY2tPblN0YXJ0Q2xpZW50KCk7CisKKyAgICAvKiBGaWxsIFBhdHRlcm4gKi8KKyAgICBmb3IgKGk9MDsgaTx1c0NSVEhvcjsgaSsrKQorICAgIHsKKwlmb3IgKGo9MDsgajx1c0NSVFZlci84OyBqKyspCisJeworCSAgICAvL1kKKwkgICAgLy91bERhdGEgPSAweDEwMTAxMDEwOworCSAgICB1bERhdGEgPSAweDMyMzIzMjMyOworCSAgICAqKFVMT05HICopKHVsVkdBQmFzZUFkZHIgKyAoaSp1c0NSVFZlcio0K2oqMzIpKSA9IHVsRGF0YTsKKwkgICAgLy91bERhdGEgPSAweDEwMTAxMDEwOworCSAgICB1bERhdGEgPSAweDMyMzIzMjMyOworCSAgICAqKFVMT05HICopKHVsVkdBQmFzZUFkZHIgKyAoaSp1c0NSVFZlcio0K2oqMzIpICs0KSA9IHVsRGF0YTsKKwkgICAgLy9VCisJICAgIHVsRGF0YSA9IDB4ODA4MDgwODA7CisJICAgIC8vdWxEYXRhID0gMHg3Nzc3Nzc3NzsKKwkgICAgKihVTE9ORyAqKSh1bFZHQUJhc2VBZGRyICsgKGkqdXNDUlRWZXIqNCtqKjMyKSArOCkgPSB1bERhdGE7CisJICAgIHVsRGF0YSA9IDB4ODA4MDgwODA7CisJICAgIC8vdWxEYXRhID0gMHg3Nzc3Nzc3NzsKKwkgICAgKihVTE9ORyAqKSh1bFZHQUJhc2VBZGRyICsgKGkqdXNDUlRWZXIqNCtqKjMyKSArMTIpID0gdWxEYXRhOworCSAgICAvL1YKKwkgICAgdWxEYXRhID0gMHg4MDgwODA4MDsKKwkgICAgLy91bERhdGEgPSAweDExMTExMTExOworCSAgICAqKFVMT05HICopKHVsVkdBQmFzZUFkZHIgKyAoaSp1c0NSVFZlcio0K2oqMzIpICsxNikgPSB1bERhdGE7CisJICAgIHVsRGF0YSA9IDB4ODA4MDgwODA7CisJICAgIC8vdWxEYXRhID0gMHgxMTExMTExMTsKKwkgICAgKihVTE9ORyAqKSh1bFZHQUJhc2VBZGRyICsgKGkqdXNDUlRWZXIqNCtqKjMyKSArMjApID0gdWxEYXRhOworCSAgICAvL0EKKwkgICAgdWxEYXRhID0gMHhGRkZGRkZGRkY7CisJICAgICooVUxPTkcgKikodWxWR0FCYXNlQWRkciArIChpKnVzQ1JUVmVyKjQraiozMikgKzI0KSA9IHVsRGF0YTsKKwkgICAgdWxEYXRhID0gMHhGRkZGRkZGRkY7CisJICAgICooVUxPTkcgKikodWxWR0FCYXNlQWRkciArIChpKnVzQ1JUVmVyKjQraiozMikgKzI4KSA9IHVsRGF0YTsKKwl9CisgICAgfSAgLyogfkZpbGwgUGF0dGVybiAqLworCisjaWYgZGVmaW5lZChDT05GSUdfQVNUMjMwMCkgICAgICAgCisgICAgaWYoIUFTVFNldE1vZGVWICgwLCBDUlRfMiwgdWxWR0FCYXNlQWRkciwgdXNDUlRIb3IsIHVzQ1JUVmVyLCBidENSVENvbG9yRm10LCBidENSVENlbnRlck1vZGUpKQorI2Vsc2UKKyAgICBpZighQVNUU2V0TW9kZVYgKDAsIENSVF8xLCB1bFZHQUJhc2VBZGRyLCB1c0NSVEhvciwgdXNDUlRWZXIsIGJ0Q1JUQ29sb3JGbXQsIGJ0Q1JUQ2VudGVyTW9kZSkpCisjZW5kaWYgICAgCisgICAgeyAgIAorICAgICAgICBwcmludGYoIltWSURFT10gVGhlIHJlc29sdXRpb24gaXMgbm90IGluIG1vZGUgdGFibGUgbGlzdFxuIik7CisgICAgICAgIHJldHVybiBDUlRfRkFJTDsKKyAgICB9CisgICAgCisgICAgLy9wcmludGYoIltWSURFT10gQ1JUIHR1cm4gb25cbiIpOworCisgICAgcmV0dXJuIFZJREVPX1RFU1RfT0s7Cit9CisKK2ludCBkb192aWRlb3Rlc3QgKHZvaWQpCit7CisgICAgaW50IGR3VmFsdWU9MDsKKyAgICBpbnQgaSA9IDA7CisgICAgaW50IGlSZXQ7ICAgIAorICAgIFVMT05HICAgdWxSZXN0b3JlMSwgdWxUZW1wOworICAgIEJPT0wgICAgYkNsaWVudDsKKworCisgICAgLy9Jbml0VmlkZW9UZXN0KCk7CisgICAgZ19EZWZXaWR0aCA9IDY0MDsgCisgICAgZ19EZWZIZWlnaHQ9IDQ4MDsKKworICAgIHByaW50ZigiXG4gLS0tLS0tLS0tIENvZGVjIFRlc3QgLS0tLS0tLS0tIFxuIik7CisKKyNpZiBkZWZpbmVkKENPTkZJR19BU1QyMzAwKQorICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgU0NVX0NPTlRST0xfUkVHLCAweDAwMDAyMDAwLCAweDAwMDAyMDAwKTsKKyNlbmRpZgorCisgICAgQ2hlY2tPblN0YXJ0SG9zdCgpOworICAgIAorICAgIGRvCisgICAgeworICAgICAgICBkd1ZhbHVlID0gVW5sb2NrVmlkZW9SZWdIb3N0KDAsIFZJREVPX1VOTE9DS19LRVkpOworCWkrKzsKKyAgICB9CisgICAgd2hpbGUgKChWSURFT19VTkxPQ0sgIT0gZHdWYWx1ZSkgJiYgKGk8MTAwMCkpOworCisgICAgaWYgKFZJREVPX1VOTE9DSyAhPSBkd1ZhbHVlKQorICAgIHsKKwlwcmludGYoIltWSURFT10gVmlkZW8gcmVnaXN0ZXIgaXMgbG9ja2VkIFxuIik7CisJcmV0dXJuIFZJREVPX1RFU1RfRkFJTDsKKyAgICB9CisgICAgQWxsb2NhdGVFbmNvZGVCdWZIb3N0KDAsIFZJREVPMSk7CisKKyAgICBpUmV0ID0gQ29kZWNUZXN0KCk7CQorICAgIGlmIChpUmV0KQorICAgICAgICByZXR1cm4gVklERU9fVEVTVF9GQUlMOworCisjaWYgZGVmaW5lZChDT05GSUdfQVNUMjMwMCkKKyAgICAvKiBJbml0IFNDVSAqLyAKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoU0NVX0JBU0UsICgweDJjICsgU0NVX09GRlNFVCksIDB4MDAwNDAwMDAsIDB4MDAwNDAwMTApOwkvKiBFbmFibGUgRDItUExMICovCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFNDVV9CQVNFLCBTQ1VfQ0xPQ0tfU1RPUF9SRUcsIDAsIDB4MDAwMDA0MDApOwkJLyogRW5hYmxlIEQyQ0xLICovCisgICAgdWRlbGF5KDEwKTsKKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoU0NVX0JBU0UsIFNDVV9DT05UUk9MX1JFRywgMCwgMHgwMDAwMjAwMCk7CisgICAgCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFNDVV9CQVNFLCAoMHg5MCArIFNDVV9PRkZTRVQpLCAweDIwLCAweDAwMDAwMDMwKTsgCS8qIGVuYWJsZSB2aWRlbyBtb2RlIHNpbmdsZSBlZGdlICovCisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFNDVV9CQVNFLCAoMHg4NCArIFNDVV9PRkZTRVQpLCAweGZmZmUwMDAwLCAweGZmZmUwMDAwKTsgLyogbXVsdGktcGlucyAqLworICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgKDB4ODggKyBTQ1VfT0ZGU0VUKSwgMHgwMDBmZmZmZiwgMHgwMDBmZmZmZik7IC8qIG11bHRpLXBpbnMgKi8gICAgCisgICAgCisgICAgaVJldCA9IENSVFRlc3QoKTsKKyAgICBpZiAoaVJldCkKKyAgICB7CisgICAgCXByaW50ZigiW1ZJREVPXSBDUlQgVGVzdCBGYWlsZWQgXG4iKTsKKyAgICAgICAgcmV0dXJuIFZJREVPX1RFU1RfRkFJTDsKKyAgICB9CisKKyAgICBpUmV0ID0gQ2FwVGVzdCgpOwkJCisgICAgaWYgKGlSZXQpCisgICAgeworICAgIAlwcmludGYoIltWSURFT10gQ2FwdHVyZSBUZXN0IEZhaWxlZCBcbiIpOworICAgICAgICByZXR1cm4gVklERU9fVEVTVF9GQUlMOworICAgIH0KKyNlbHNlCisgICAgLy9Ib3N0IG9yIENsaWVudAorICAgIGJDbGllbnQgPSAoKFJlYWRNZW1vcnlMb25nKFNDVV9CQVNFLCBTQ1VfSFdfVFJBUFBJTkdfUkVHKSAmIENMSUVOVF9NT0RFX0VOX01BU0spP1RSVUU6RkFMU0UpOworICAgIC8vcmVzZXQgdmlkZW8gZm9yIGFub3RoZXIgdGVzdGluZworICAgIFJlc2V0VmlkZW9Ib3N0KCk7CisgICAgZHdWYWx1ZT0wOworICAgIGkgPSAwOworICAgIGRvCisgICAgeworCWR3VmFsdWUgPSBVbmxvY2tWaWRlb1JlZ0hvc3QoMCwgVklERU9fVU5MT0NLX0tFWSk7CisJaSsrOworICAgIH0KKyAgICB3aGlsZSAoKFZJREVPX1VOTE9DSyAhPSBkd1ZhbHVlKSAmJiAoaTwxMCkpOworCisgICAgaWYgKFZJREVPX1VOTE9DSyAhPSBkd1ZhbHVlKQorICAgIHsKKwlwcmludGYoIltWSURFT10gVmlkZW8gcmVnaXN0ZXIgaXMgbG9ja2VkIik7CisJcmV0dXJuIFZJREVPX1VOTE9DS19GQUlMOworICAgIH0KKworICAgIC8vY2hlY2sgaWYgMWU2ZTAwMDhbMywwXSBpcyAwCisgICAgdWxSZXN0b3JlMSA9IFJlYWRNZW1vcnlMb25nSG9zdCgweDFlNmUwMDAwLCA4KTsKKyAgICBkd1ZhbHVlID0gUmVhZE1lbW9yeUxvbmdIb3N0KDB4MWU2ZTAwMDAsIDgpJjB4RjsKKworICAgIC8vc2V0IDFlNmUwMDA4WzMsMF0gdG8gMAorICAgIGlmIChkd1ZhbHVlKQorICAgIHsKKyAgICAgICAgV3JpdGVNZW1vcnlMb25nSG9zdCgweDFlNmUwMDAwLCAwLCAweGZjNjAwMzA5KTsKKyAgICAgICAgCisgICAgICAgIGk9MDsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgZHdWYWx1ZSA9IFJlYWRNZW1vcnlMb25nSG9zdCgweDFlNmUwMDAwLDApOworICAgICAgICB9d2hpbGUoKDEgIT0gZHdWYWx1ZSkmJiAoaTwxMCkpOworICAgICAgICAKKyAgICAgICAgaWYgKDEgIT0gZHdWYWx1ZSkKKyAgICAJeworICAgIAkJcHJpbnRmKCIweDFlNmUwMDAwIGlzIGxvY2tlZCIpOworICAgIAkJcmV0dXJuIFZJREVPX1VOTE9DS19GQUlMOworICAgIAl9CisgICAgfQorCisgICAgLy9vbmx5IGNsZWFyIDFlNmUwMDA4WzMsMF0KKyAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoMHgxZTZlMDAwMCwgOCwgMCwgMHhmKTsKKyAgICAKKyAgICBiQ2xpZW50ID0gMDsKKyAgICBpZiAoIWJDbGllbnQpCisgICAgeworICAgICAgICAvL1RvIHR1cm4gb24gY3J0LCBtdXN0IGJlIHRoZSBjbGllbnQgbW9kZQorICAgICAgICBXcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoU0NVX0JBU0UsIFNDVV9IV19UUkFQUElOR19SRUcsIChCRV9DTElFTlRfQ0hJUCA8PCBDTElFTlRfTU9ERV9FTl9CSVQpLCBDTElFTlRfTU9ERV9FTl9NQVNLKTsKKyAgICAgICAgICAgIAorICAgICAgICBpUmV0ID0gQ1JUVGVzdCgpOworCisgICAgICAgIGlmIChpUmV0KQorICAgICAgICB7CisgICAgICAgICAgICAvL3RyYXBwaW5nIHRvIGhvc3QsIHRoZSBWc3luYyBvZiBDUlQgY2FuJ3Qgb3V0cHV0IGFuZCB0aGUgaG9zdCBkb2Vzbid0IGhhdmUgdmlkZW8gc3luYyBpbnB1dAorICAgICAgICAgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFNDVV9CQVNFLCBTQ1VfSFdfVFJBUFBJTkdfUkVHLCAoQkVfSE9TVF9DSElQIDw8IENMSUVOVF9NT0RFX0VOX0JJVCksIENMSUVOVF9NT0RFX0VOX01BU0spOworICAgICAgICAgICAgLy9yZXN0b3JlIHZhbHVlCisgICAgICAgICAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KDB4MWU2ZTAwMDAsIDgsIHVsUmVzdG9yZTEpOworICAgICAgICAgICAgLy9sb2NrIHJlZ2lzdGVyCisgICAgICAgICAgICBXcml0ZU1lbW9yeUxvbmdIb3N0KDB4MWU2ZTAwMDAsIDAsIDB4MTIzNDU2NzgpOyAKKyAgICAgICAgICAgIHJldHVybiBWSURFT19URVNUX0ZBSUw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlSZXQgPSBDYXBUZXN0KCk7CisJCQorICAgICAgICBpZiAoaVJldCkKKyAgICAgICAgeworICAgICAgICAgICAgLy90cmFwcGluZyB0byBob3N0LCB0aGUgVnN5bmMgb2YgQ1JUIGNhbid0IG91dHB1dCBhbmQgdGhlIGhvc3QgZG9lc24ndCBoYXZlIHZpZGVvIHN5bmMgaW5wdXQKKyAgICAgICAgICAgIFdyaXRlTWVtb3J5TG9uZ1dpdGhNQVNLSG9zdChTQ1VfQkFTRSwgU0NVX0hXX1RSQVBQSU5HX1JFRywgKEJFX0hPU1RfQ0hJUCA8PCBDTElFTlRfTU9ERV9FTl9CSVQpLCBDTElFTlRfTU9ERV9FTl9NQVNLKTsKKyAgICAgICAgICAgIC8vcmVzdG9yZSB2YWx1ZQorICAgICAgICAgICAgV3JpdGVNZW1vcnlMb25nSG9zdCgweDFlNmUwMDAwLCA4LCB1bFJlc3RvcmUxKTsKKyAgICAgICAgICAgIC8vbG9jayByZWdpc3RlcgorICAgICAgICAgICAgV3JpdGVNZW1vcnlMb25nSG9zdCgweDFlNmUwMDAwLCAwLCAweDEyMzQ1Njc4KTsgCisKKyAgICAgICAgICAgIHJldHVybiBWSURFT19URVNUX0ZBSUw7CisgICAgICAgIH0KKwkJLy9Xcml0ZU1lbW9yeUxvbmdXaXRoTUFTS0hvc3QoU0NVX0JBU0UsIFNDVV9IV19UUkFQUElOR19SRUcsIChCRV9IT1NUX0NISVAgPDwgQ0xJRU5UX01PREVfRU5fQklUKSwgQ0xJRU5UX01PREVfRU5fTUFTSyk7CisgICAgfQorICAgIC8vdHJhcHBpbmcgdG8gaG9zdCwgdGhlIFZzeW5jIG9mIENSVCBjYW4ndCBvdXRwdXQgYW5kIHRoZSBob3N0IGRvZXNuJ3QgaGF2ZSB2aWRlbyBzeW5jIGlucHV0CisgICAgV3JpdGVNZW1vcnlMb25nV2l0aE1BU0tIb3N0KFNDVV9CQVNFLCBTQ1VfSFdfVFJBUFBJTkdfUkVHLCAoQkVfSE9TVF9DSElQIDw8IENMSUVOVF9NT0RFX0VOX0JJVCksIENMSUVOVF9NT0RFX0VOX01BU0spOworICAgIC8vcmVzdG9yZSB2YWx1ZQorICAgIFdyaXRlTWVtb3J5TG9uZ0hvc3QoMHgxZTZlMDAwMCwgOCwgdWxSZXN0b3JlMSk7CisgICAgLy9sb2NrIHJlZ2lzdGVyCisgICAgV3JpdGVNZW1vcnlMb25nSG9zdCgweDFlNmUwMDAwLCAwLCAweDEyMzQ1Njc4KTsgCisjZW5kaWYKKworICAgIHJldHVybiBWSURFT19URVNUX09LOwkKK30KKyNlbmRpZiAvKiBDT05GSUdfU0xUICovCmRpZmYgLS1naXQgYS9ib2FyZC9hc3BlZWQvYXN0MjQwMC92aWRlb3Rlc3QuaCBiL2JvYXJkL2FzcGVlZC9hc3QyNDAwL3ZpZGVvdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc5YjhkZDkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC92aWRlb3Rlc3QuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKy8qIFZpZGVvVGVzdC5oICovCisjaWZuZGVmIF9WSURFT1RFU1RfSF8KKyNkZWZpbmUgX1ZJREVPVEVTVF9IXworCisjZGVmaW5lIFZJREVPX1RFU1RfT0sgICAgICAgMAorI2RlZmluZSBWSURFT19URVNUX0ZBSUwgICAgIDEKKworI2RlZmluZSBWSURFT19VTkxPQ0tfRkFJTCAgIDEKKyNkZWZpbmUgVklERU9fRU5DT0RFX0ZBSUwgICAyCisjZGVmaW5lIFZJREVPX0RFQ09ERV9GQUlMICAgMworI2RlZmluZSBDUlRfRkFJTCAgICAgICAgICAgIDQKKworI2VuZGlmIC8qIF9WSURFT1RFU1RfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvYm9hcmQvYXNwZWVkL2FzdDI0MDAvdnJlZy5oIGIvYm9hcmQvYXNwZWVkL2FzdDI0MDAvdnJlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk3Mzg1NDgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9hc3BlZWQvYXN0MjQwMC92cmVnLmgKQEAgLTAsMCArMSw4NDUgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2lmbmRlZiBfVlJFR19IXworI2RlZmluZSBfVlJFR19IXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICBDUlQgcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lICAgIENSVF9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwCisjZGVmaW5lICAgIFZHQV9HUkFQSF9CQVNFX0FERFJFU1MgICAgICAgICAgICAgIDB4NjAwMDAwCisjZGVmaW5lICAgIFZHQV9DVVJTT1JfQkFTRV9BRERSRVNTICAgICAgICAgICAgIDB4MzAwMDAwCisjZGVmaW5lICAgIFZHQV9PU0RfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgIDB4MzAwMDAwCisjZGVmaW5lICAgIFJHQl81NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICBSR0JfODg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgICAgWVVWXzQ0NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lCSAgIE5PX1NVUFBPUlRFRF9DUlRfRk1UCQkJCSAgIDB4MworI2RlZmluZSAgICBDUlRfTE9XX1RIUkVTSE9MRF9WQUxVRSAgICAgICAgICAgICAweDEyCisjZGVmaW5lICAgIENSVF9ISUdIX1RIUkVTSE9MRF9WQUxVRSAgICAgICAgICAgIDB4MUUKKworLy8gQVNUMzAwMCdzIFJlZ2lzdGVycyAKKyNpZmRlZiBXYXRjb20KKyNkZWZpbmUgICAgIFZJREVPQkFTRV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMAorI2Vsc2UKKyNkZWZpbmUgICAgIFZJREVPQkFTRV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZW5kaWYKKworI2RlZmluZSAgICAgS0VZX0NPTlRST0xfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIFZJREVPX0xPQ0tFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisgICAgI2RlZmluZSAgICAgVklERU9fVU5MT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworLy8gUmVnaXN0ZXJzIGZvciB2aWRlbzEgYW5kIHZpZGVvMgorI2RlZmluZSAgICAgVklERU8xX0VOR0lORV9TRVFVRU5DRV9DT05UUk9MX1JFRyAgICAgICAgICAweDA0ICsgVklERU9CQVNFX09GRlNFVAorI2RlZmluZSAgICAgVklERU8yX0VOR0lORV9TRVFVRU5DRV9DT05UUk9MX1JFRyAgICAgICAgICAweDEwNCArIFZJREVPQkFTRV9PRkZTRVQKKyAgICAjZGVmaW5lICAgICBNT0RFX0RFVEVDVElPTl9UUklHR0VSICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgLy9CaXRbMF0gdHJpZ2dlciBIVyBhdXRvIG1vZGUgZGV0ZWN0aW9uCisgICAgI2RlZmluZSAgICAgVklERU9fQ0FQVFVSRV9UUklHR0VSICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIgIC8vQml0WzFdIHRyaWdnZXIgSFcgdG8gY2FwdHVyZSB2aWRlbworCSNkZWZpbmUJCUZPUkNFX0hXX0lETEVfTUFTSwkJCQkJCSgxPDwyKQkJLy9CaXRbMl0gRm9yY2UgZW5naW5lIGludG8gcmVhZHkoaWRsZSkgc3RhdGUKKwkJI2RlZmluZQkJRU5HSU5FX1JFU0VUCQkJCQkJKDA8PDIpCisJCSNkZWZpbmUJCUVOR0lORV9JRExFCQkJCQkJCSgxPDwyKQorICAgICNkZWZpbmUgICAgIFZJREVPX0NBUFRVUkVfQVVUT19NT0RFICAgICAgICAgICAgICAgICAweDAwMDAwMDA4ICAvL0JpdFszXQorICAgICAgICAjZGVmaW5lICAgICBDQVBUVVJFX0ZSQU1FX01PREUgICAgICAgICAgICAgICAgICAwCisgICAgICAgICNkZWZpbmUgICAgIENBUFRVUkVfQVVUT19NT0RFICAgICAgICAgICAgICAgICAgIDEKKwkJI2RlZmluZQkJQ0FQVFVSRV9BVVRPX01PREVfQklUCQkJCTMKKwkJI2RlZmluZQkJQ0FQVFVSRV9BVVRPX01PREVfTUFTSwkJCQkweDAwMDAwMDA4CisgICAgI2RlZmluZSAgICAgVklERU9fQ09ERUNfVFJJR0dFUiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAgIC8vQml0WzRdIHRyaWdnZXIgSFcgdG8gY29tcHJlc3Mgb3IgZGVjb21wcmVzcyB2aWRlbworICAgICAgICAjZGVmaW5lICAgICBDT0RFQ19UUklHR0VSX0JJVCAgICAgICAgICAgICAgICAgICA0CisgICAgICAgICNkZWZpbmUgICAgIENPREVDX1RSSUdHRVJfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyAgICAgICAgI2RlZmluZSAgICAgQ0xFQVJfQ09ERUNfVFJJR0dFUiAgICAgICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBFTl9DT0RFQ19UUklHR0VSICAgICAgICAgICAgICAgICAgICAxCisgICAgI2RlZmluZSAgICAgVklERU9fQ09ERUNfQVVUT19NT0RFICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAgIC8vQml0WzVdCisgICAgICAgICNkZWZpbmUgICAgIENPREVDX0ZSQU1FX01PREUgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgQ09ERUNfQVVUT19NT0RFICAgICAgICAgICAgICAgICAgICAgMQorCQkjZGVmaW5lCQlDT0RFQ19BVVRPX01PREVfQklUCQkJCQk1CisgICAgICAgICNkZWZpbmUgICAgIENPREVDX0FVVE9fTU9ERV9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKwkjZGVmaW5lCQlJTlNFUlRfRlVMTF9GUkFNRV9NQVNLCQkJCQkoMTw8NikJCS8vQml0WzZdIEluc2VydCBmdWxsIGZyYW1lIGNvbXByZXNzaW9uCisJCSNkZWZpbmUJCUlOU0VSVF9GVUxMX0ZSQU1FX0VOCQkJCSgxPDw2KQorCQkjZGVmaW5lCQlJTlNFUlRfRlVMTF9GUkFNRV9PRkYJCQkJKDA8PDYpCisgICAgI2RlZmluZSAgICAgV0FUQ0hfRE9HX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAgIC8vQml0WzddIFZpZGVvIEVuYWJsZSB3YXRjaCBkb2cgZm9yIG1vZGUgY2hhbmdlIGRldGVjdGlvbgorICAgICAgICAjZGVmaW5lICAgICBXQVRDSF9ET0dfRU5BQkxFX0JJVCAgICAgICAgICAgICAgICA3CisgICAgICAgICNkZWZpbmUgICAgIFdBVENIX0RPR19PRkYgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgV0FUQ0hfRE9HX0VOICAgICAgICAgICAgICAgICAgICAgICAgMQorICAgICAgICAjZGVmaW5lICAgICBXQVRDSF9ET0dfRU5fTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisgICAgI2RlZmluZSAgICAgVklERU9fQ1JUX1NFTEVDVElPTiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAgIC8vQml0WzhdCisgICAgICAgICNkZWZpbmUgICAgIENSVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgQ1JUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorICAgICNkZWZpbmUgICAgIEFOVElfVEVBUklOR19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwICAvL0JpdFs5XSBBbnRpLXRlYXJpbmcgbW9kZSBlbmFibGUgZm9yIGRlY29kaW5nCisgICAgICAgICNkZWZpbmUgICAgIEFOVElfVEVBUklOR19FTiAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAjZGVmaW5lICAgICBTVFJFQU1fREFUQV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMCAgLy9CaXRbMTE6MTBdIEJ1ZmZlciBhbmQgU3RyZWFtIERhdGEgdHlwZQorICAgICAgICAjZGVmaW5lICAgICBTVFJFQU1fREFUQV9NT0RFX0JJVCAgICAgICAgICAgICAgICAxMAorICAgICAgICAjZGVmaW5lICAgICBTVFJFQU1fREFUQV9NT0RFX01BU0sgICAgICAgICAgICAgICAweDAwMDAwQzAwCisgICAgICAgICNkZWZpbmUgICAgIFlVVjQ0NF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgWVVWNDIwX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgMQorICAgICAgICAjZGVmaW5lICAgICBZVVY0MjBfTU9ERV9XSVRIX0FTVDIwMDAgICAgICAgICAgICAyIC8vQVNUMjAwMCBjb21wYXRpYmxlCisgICAgI2RlZmluZSAgICAgVklERU9fQ0FQVFVSRV9SRUFEWSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAgIC8vQml0WzE2XSBWaWRlbyBjYXB0dXJlIHJlYWR5IHN0YXR1cyByZWFkIGJhY2socmVhZCBvbmx5KQorCQkjZGVmaW5lCQlDQVBUVVJFX1JFQURZX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwICAKKyAgICAgICAgI2RlZmluZSAgICAgSFdfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBIV19JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisgICAgI2RlZmluZSAgICAgVklERU9fQ09ERUNfUkVBRFkgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAgIC8vQml0WzE4XSBWaWRlbyBjb2RlYyByZWFkeSBzdGF0dXMgcmVhZCBiYWNrKHJlYWQgb25seSkKKwkJI2RlZmluZQkJQ09ERUNfUkVBRFlfTUFTSwkJCQkJMHgwMDA0MDAwMAorICAgICAgICAvLyNkZWZpbmUgICAgIEhXX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgLy8jZGVmaW5lICAgICBIV19JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisgICAgCisjZGVmaW5lICAgIFZJREVPMV9DT05UUk9MX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDggKyBWSURFT0JBU0VfT0ZGU0VUCisjZGVmaW5lICAgIFZJREVPMl9DT05UUk9MX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTA4ICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIFZJREVPX0hTWU5DX1BPTEFSSVRZICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFswXSBWaWRlbyBzb3VyY2UgaHN5bmMgcG9sYXJpdHkKKyAgICAgICAgI2RlZmluZSAgICAgVklERU9fSFNZTkNfUE9MQVJJVFlfQklUICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBOT19JTlZFUlNFX1BPTCAgICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgICNkZWZpbmUgICAgIElOVkVSU0VfUE9MCQkJCQkJCTEKKyAgICAjZGVmaW5lICAgICBWSURFT19WU1lOQ19QT0xBUklUWSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMiAgLy9CaXRbMV0gVmlkZW8gc291cmNlIHZzeW5jIHBvbGFyaXR5CisgICAgICAgICNkZWZpbmUgICAgIFZJREVPX1ZTWU5DX1BPTEFSSVRZX0JJVCAgICAgICAgICAgIDEgICAgICAgIAorICAgICAgICAvL1NldHRpbmcgZGVmaW5hdGlvbiB0aGUgc2FtZSBhcyBWSURFT19IU1lOQ19QT0xBUklUWQorICAgICNkZWZpbmUgICAgIFZJREVPX0VYVEVSTkFMX1NPVVJDRSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0ICAvL0JpdFsyXSBWaWRlbyBleHRlcm5hbCBzb3VyY2UKKyAgICAgICAgI2RlZmluZSAgICAgRVhURVJOQUxfU09VUkNFX0JJVCAgICAgICAgICAgICAgICAgMgorICAgICAgICAjZGVmaW5lICAgICBJTlRFUk5BTF9WR0FfU09VUkNFICAgICAgICAgICAgICAgICAwCisgICAgICAgICNkZWZpbmUgICAgIEVYVEVSTkFMX1ZHQV9TT1VSQ0UgICAgICAgICAgICAgICAgIDEKKyAgICAgICAgI2RlZmluZSAgICAgRVhURVJOQUxfU09VUkNFX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwMDAwNCAgICAgICAgICAgICAgICAgICAgIAorICAgICNkZWZpbmUgICAgIFZJREVPX0FOQUxPTkdfRVhURVJOQUxfU09VUkNFICAgICAgICAgICAweDAwMDAwMDA4ICAvL0JpdFszXSBWaWRlbyBBbmFsb2cgZXh0ZXJuYWwgc291cmNlCisgICAgICAgICNkZWZpbmUgICAgIEFOQUxPTkdfRVhURVJOQUxfU09VUkNFX0JJVCAgICAgICAgIDMKKyAgICAgICAgI2RlZmluZSAgICAgRFZJX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBBTkFMT0dfUkdCX1NPVVJDRSAgICAgICAgICAgICAgICAgICAxCisgICAgI2RlZmluZSAgICAgVklERU9fSU5URVJOQUxfVElNSU5HX0dFTiAgICAgICAgICAgICAgIDB4MDAwMDAwMTAgIC8vQml0WzRdIFZpZGVvIFVzZSBpbnRlcm5hbCB0aW1pbmcgZ2VuZXJhdG9yCisgICAgICAgICNkZWZpbmUgICAgIElOVEVSTkFMX1RJTUlOR19HRU5fQklUICAgICAgICAgICAgIDQKKyAgICAgICAgI2RlZmluZSAgICAgRVhURVJOQUxfREVfU0lHTkFMICAgICAgICAgICAgICAgICAgMCAvL0RWSSBvbmx5CisgICAgICAgICNkZWZpbmUgICAgIFZSMENfVlIxMF9ERV9TSU5HQUwgICAgICAgICAgICAgICAgIDEgLy91c2UgVlIwQyBhbmQgVlIxMCBmb3IgZ2VuZXJhdGUgVkRFIHNpZ25hbAorICAgIC8qKioqKiogICAgIFZpZGVvMiBPbmx5IGZyb20gREFDICAgICoqKioqKi8gICAgICAgIAorICAgICNkZWZpbmUgICAgIFZJREVPMV9DQVBUVVJFX0ZST00gICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwICAvL0JpdFs1XSBWaWRlbzEgY2FwdHVyZSBkYXRhIGRpcmVjdCBmcm9tIFZHQSBmcmFtZSBidWZmZXIoaW50ZXJuYWwgVkdBIG9ubHkpICAKKyAgICAgICAgI2RlZmluZSAgICAgRlJPTV9EQUNfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBGUk9NX0ZSQU1FX0JVRkZFUiAgICAgICAgICAgICAgICAgICAxICAgICAKKyAgICAjZGVmaW5lICAgICBXUklURV9EQVRBX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MCAgLy9CaXRbNzo2XSBXcml0ZSBkYXRhIGZvcm1hdAorICAgICAgICAjZGVmaW5lICAgICBXUklURV9EQVRBX0ZPUk1BVF9CSVQgICAgICAgICAgICAgICA2CisgICAgICAgICNkZWZpbmUgICAgIFdSVElFX0RBVEFfRk9STUFUX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwQzAKKyAgICAgICAgI2RlZmluZSAgICAgQ0NJUjYwMV8yX1lVVl9GT1JNQVQgICAgICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBGVUxMX1lVVl9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAxCisgICAgICAgICNkZWZpbmUgICAgIFJHQl9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKwkJI2RlZmluZSAgICAgVkdBX0NVUlNPUl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAgIC8vQml0WzhdIEV4dGVybmFsIHZpZGVvIHBvcnQgc2xlY3Rpb24KKyAgICAgICAgI2RlZmluZSAgICAgVkdBX0NVUlNPUl9OT1JNQUwgICAgICAgICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBWR0FfQ1VSU09SX09GRiAgICAgICAgICAgICAgICAgICAgICAxICAgIAorICAgICNkZWZpbmUgICAgIFZJREVPX0NBUFRVUkVfTElORUFSX01PREUgICAgICAgICAgICAgICAweDAwMDAwMjAwICAvL0JpdFs5XSBWSURFT19DQVBUVVJFX0xJTkVBUl9NT0RFCisgICAgICAgICNkZWZpbmUgICAgIExJTkVBUl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgVElMRV9NT0RFCQkgICAgICAgICAgICAgICAgICAgIDEJCQorICAgICNkZWZpbmUgICAgIFZJREVPX0NMT0NLX0RFTEFZICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwICAvL0JpdFsxMToxMF0gVmlkZW8gY2xvY2sgZGVsYXkgY29udHJvbAorICAgICAgICAjZGVmaW5lICAgICBWSURFT19DTE9DS19ERUxBWV9CSVQgICAgICAgICAgICAgICAxMAorICAgICAgICAjZGVmaW5lICAgICBWSURFT19DTE9DS19ERUxBWV9NQVNLICAgICAgICAgICAgICAweDAwMDAwQzAwCisgICAgICAgICNkZWZpbmUgICAgIERFTEFZXzBfTlMgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgREVMQVlfMV9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgMQorICAgICAgICAjZGVmaW5lICAgICBJTlZfQU5EX0RFTEFZXzBfTlMgICAgICAgICAgICAgICAgICAyCisgICAgICAgICNkZWZpbmUgICAgIElOVl9BTkRfREVMQVlfMV9OUyAgICAgICAgICAgICAgICAgIDMKKyAgICAjZGVmaW5lICAgICBWSURFT19DQ0lSNjU2X1NPVVJDRV9NT0RFICAgICAgICAgICAgICAgMHgwMDAwMTAwMCAgLy9CaXRbMTJdIFZpZGVvIENDSVI2NTYgc291cmNlIG1vZGUKKyAgICAgICAgI2RlZmluZSAgICAgUkdCX1NPVVJDRV9NT0RFICAgICAgICAgICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBDQ0lSNjU2X1NPVVJDRV9NT0RFICAgICAgICAgICAgICAgICAxCisgICAgI2RlZmluZSAgICAgU09VUkNFX1BPUlRfQ0xPQ0tfTU9ERSAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAgIC8vQml0WzEzXSBWaWRlbyBTb3VyY2UgcG9ydCBjbG9jayBtb2RlCisgICAgICAgICNkZWZpbmUgICAgIFNJTkdMRV9FREdFX01PREUgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgRFVBTF9FREdFX01PREUgICAgICAgICAgICAgICAgICAgICAgMQorICAgICNkZWZpbmUgICAgIEVYVEVSTkFMX1BPUlRfU0VMRUNUSU9OICAgICAgICAgICAgICAgICAweDAwMDA0MDAwICAvL0JpdFsxNF0gRXh0ZXJuYWwgdmlkZW8gcG9ydCBzbGVjdGlvbgorICAgICAgICAjZGVmaW5lICAgICBWSURFT19QT1JUX0EgICAgICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPX1BPUlRfQiAgICAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAjZGVmaW5lICAgICBWSURFT19DQVBUVVJFX0ZSQU1FX1JBVEUgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMjM6MTZdIFZpZGVvIGNhcHR1cmUgZnJhbWUgcmF0ZSBjb250cm9sCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPX0NBUFRVUkVfRlJBTUVfUkFURV9CSVQgICAgICAgIDE2CisgICAgICAgICNkZWZpbmUgICAgIFZJREVPX0NBUFRVUkVfRlJBTUVfUkFURV9NQVNLICAgICAgIDB4MDBGRjAwMDAgIC8vTWF4aW11bSBmcmFtZSByYXRlID0gWFggKiBTb3VyY2VGUFMgLyA2MAorCisjZGVmaW5lICAgIFZJREVPMV9USU1FSU5HX0dFTl9IT1JfUkVHICAgICAgICAgICAgICAgICAgIDB4MEMgKyBWSURFT0JBU0VfT0ZGU0VUCisjZGVmaW5lICAgIFZJREVPMl9USU1FSU5HX0dFTl9IT1JfUkVHICAgICAgICAgICAgICAgICAgIDB4MTBDICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIFZJREVPX0hERV9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwICAvL0JpdFsxMjowXSBWaWRlbyBIREUgRW5kIHRpbWluZyBnZW5lcmF0b3IKKyAgICAjZGVmaW5lICAgICBWSURFT19IREVfRU5EX0JJVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLy9OdW1iZXIgb2YgcGl4ZWxzIGZyb20gcmlzaW5nIGVkZ2Ugb2YgSHN5bmMgZm9yIGZpcnN0IGFjdGl2ZSBwaXhlbAorICAgICNkZWZpbmUgICAgIFZJREVPX0hERV9FTkRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxRkZGCisgICAgI2RlZmluZSAgICAgVklERU9fSERFX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAgIC8vQml0WzI4OjE2XSBWaWRlbyBIREUgU3RhcnQgdGltaW5nIGdlbmVyYXRvcgorICAgICNkZWZpbmUgICAgIFZJREVPX0hERV9TVEFSVF9CSVQgICAgICAgICAgICAgICAgICAgICAxNiAvL051bWJlciBvZiBwaXhlbHMgZnJvbSByaXNpbmcgZWRnZSBvZiBIc3luYyBmb3IgbGFzdCBhY3RpdmUgcGl4ZWwKKyAgICAjZGVmaW5lICAgICBWSURFT19IREVfU1RBUlRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgxRkZGMDAwMAorICAgICAgICAjZGVmaW5lICAgICBGUkFNRV9SQVRFX09GRiAgICAgICAgICAgICAgICAgICAgICAwICAgIAorICAgIAorI2RlZmluZSAgICBWSURFTzFfVElNRUlOR19HRU5fVl9SRUcgICAgICAgICAgICAgICAgICAgICAweDEwICsgVklERU9CQVNFX09GRlNFVAorI2RlZmluZSAgICBWSURFTzJfVElNRUlOR19HRU5fVl9SRUcgICAgICAgICAgICAgICAgICAgICAweDExMCArIFZJREVPQkFTRV9PRkZTRVQKKyAgICAjZGVmaW5lICAgICBWSURFT19WREVfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgLy9CaXRbMTE6MF0gVmlkZW8gVkRFIEVuZCB0aW1pbmcgZ2VuZXJhdG9yCisgICAgI2RlZmluZSAgICAgVklERU9fVkRFX0VORF9CSVQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8vTnVtYmVyIG9mIHBpeGVscyBmcm9tIHJpc2luZyBlZGdlIG9mIFZzeW5jIGZvciBmaXJzdCBhY3RpdmUgcGl4ZWwKKyAgICAjZGVmaW5lICAgICBWSURFT19WREVfRU5EX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMEZGRgorICAgICNkZWZpbmUgICAgIFZJREVPX1ZERV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwICAvL0JpdFsyNzoxNl0gVmlkZW8gVkRFIFN0YXJ0IHRpbWluZyBnZW5lcmF0b3IKKyAgICAjZGVmaW5lICAgICBWSURFT19WREVfU1RBUlRfQklUICAgICAgICAgICAgICAgICAgICAgMTYgLy9OdW1iZXIgb2YgcGl4ZWxzIGZyb20gcmlzaW5nIGVkZ2Ugb2YgVnN5bmMgZm9yIGxhc3QgYWN0aXZlIHBpeGVsCisgICAgI2RlZmluZSAgICAgVklERU9fVkRFX1NUQVJUX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MEZGRjAwMDAKKworI2RlZmluZSAgICBWSURFTzFfU0NBTEVfRkFDVE9SX1JFRyAgICAgICAgICAgICAgICAgICAgICAweDE0ICsgVklERU9CQVNFX09GRlNFVAorI2RlZmluZSAgICBWSURFTzJfU0NBTEVfRkFDVE9SX1JFRyAgICAgICAgICAgICAgICAgICAgICAweDExNCArIFZJREVPQkFTRV9PRkZTRVQKKyAgICAjZGVmaW5lICAgICBIT1JfU0NBTElOR19GQUNUT1IgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgLy9CaXRbMTU6MF0gVmlkZW8gSG9yaXpvbnRhbCBzY2FsaW5nIGZhY3RvcgorICAgICNkZWZpbmUgICAgIEhPUl9TQ0FMSU5HX0ZBQ1RPUl9CSVQgICAgICAgICAgICAgICAgICAwICAgLy9UaGUgZm9ybXVsYT00MDk2LyhIb3Jpem9udGFsIHNjYWxpbmcgZmFjb3RyKQorICAgICNkZWZpbmUgICAgIEhPUl9TQ0FMSU5HX0ZBQ1RPUl9NQVNLICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisgICAgI2RlZmluZSAgICAgVkVSX1NDQUxJTkdfRkFDVE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAgIC8vQml0WzMxOjE2XSBWaWRlbyBWZXJ0aWNhbCBzY2FsaW5nIGZhY3RvcgorICAgICNkZWZpbmUgICAgIFZFUl9TQ0FMSU5HX0ZBQ1RPUl9CSVQgICAgICAgICAgICAgICAgICAxNiAgIC8vVGhlIGZvcm11bGE9NDA5Ni8oVmVydGljYWwgc2NhbGluZyBmYWNvdHIpCisgICAgI2RlZmluZSAgICAgVkVSX1NDQUxJTkdfRkFDVE9SX01BU0sgICAgICAgICAgICAgICAgIDB4RkZGRjAwMDAKKworI2RlZmluZSAgICBWSURFTzFfU0NBTEVfRkFDVE9SX1BBUkFNRVRFUjBfUkVHICAgICAgICAgICAweDE4ICsgVklERU9CQVNFX09GRlNFVCAgLy9TY2FsaW5nIFBhcmFtZXRlcnMgRjAwLCBGMDEsIEYwMiwgRjAzCisjZGVmaW5lICAgIFZJREVPMl9TQ0FMRV9GQUNUT1JfUEFSQU1FVEVSMF9SRUcgICAgICAgICAgIDB4MTE4ICsgVklERU9CQVNFX09GRlNFVCAgIAorCisjZGVmaW5lICAgIFZJREVPMV9TQ0FMRV9GQUNUT1JfUEFSQU1FVEVSMV9SRUcgICAgICAgICAgIDB4MUMgKyBWSURFT0JBU0VfT0ZGU0VUICAvL1NjYWxpbmcgUGFyYW1ldGVycyBGMTAsIEYxMSwgRjEyLCBGMTMKKyNkZWZpbmUgICAgVklERU8yX1NDQUxFX0ZBQ1RPUl9QQVJBTUVURVIxX1JFRyAgICAgICAgICAgMHgxMUMgKyBWSURFT0JBU0VfT0ZGU0VUICAgCisKKyNkZWZpbmUgICAgVklERU8xX1NDQUxFX0ZBQ1RPUl9QQVJBTUVURVIyX1JFRyAgICAgICAgICAgMHgyMCArIFZJREVPQkFTRV9PRkZTRVQgIC8vU2NhbGluZyBQYXJhbWV0ZXJzIEYyMCwgRjIxLCBGMjIsIEYyMworI2RlZmluZSAgICBWSURFTzJfU0NBTEVfRkFDVE9SX1BBUkFNRVRFUjJfUkVHICAgICAgICAgICAweDEyMCArIFZJREVPQkFTRV9PRkZTRVQgICAKKworI2RlZmluZSAgICBWSURFTzFfU0NBTEVfRkFDVE9SX1BBUkFNRVRFUjNfUkVHICAgICAgICAgICAweDI0ICsgVklERU9CQVNFX09GRlNFVCAgLy9TY2FsaW5nIFBhcmFtZXRlcnMgRjMwLCBGMzEsIEYzMiwgRjMzCisjZGVmaW5lICAgIFZJREVPMl9TQ0FMRV9GQUNUT1JfUEFSQU1FVEVSM19SRUcgICAgICAgICAgIDB4MTI0ICsgVklERU9CQVNFX09GRlNFVAorCisjZGVmaW5lICAgIFZJREVPMV9CQ0RfQ09OVFJPTF9SRUcgICAgICAgICAgICAgICAgICAgICAgIDB4MkMgKyBWSURFT0JBU0VfT0ZGU0VUCisjZGVmaW5lICAgIFZJREVPMl9CQ0RfQ09OVFJPTF9SRUcgICAgICAgICAgICAgICAgICAgICAgIDB4MTJDICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIEJDRF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFswXSBFbmFibGUgYmxvY2sgY2hhbmdlIGRldGVjdGlvbihCQ0QpCisgICAgICAgICNkZWZpbmUgICAgIEJDRF9FTkFCTEVfQklUICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgQkNEX0VOQUJMRV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorICAgICNkZWZpbmUgICAgIEJDRF9UT0xFUkFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwICAvL0JpdFsyMzoxNl0KKyAgICAgICAgI2RlZmluZSAgICAgQkNEX1RPTEVSQU5DRV9CSVQgICAgICAgICAgICAgICAgICAgMTYgLy9mbGFnIGFzIGNoYW5nZWQgYmxvY2sgd2hlbiB0aGUgdmlkZW8gZGF0YSBkaWZmZXJlbmNlIGdyZWF0ZXIKKyAgICAgICAgI2RlZmluZSAgICAgQkNEX1RPTEVSQU5DRV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMEZGMDAwMAorCisjZGVmaW5lICAgICBWSURFTzFfQ0FQVFVSRV9XSU5ET1dTX1JFRyAgICAgICAgICAgICAgICAgIDB4MzAgKyBWSURFT0JBU0VfT0ZGU0VUCisjZGVmaW5lICAgICBWSURFTzJfQ0FQVFVSRV9XSU5ET1dTX1JFRyAgICAgICAgICAgICAgICAgIDB4MTMwICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIENBUFRVUkVfVkVSX0xJTkUJCQkJCQkweDAwMDAwMDAxICAvL0JpdFsxMDowXSBWaWRlbyBjb21wcmVzc2lvbiB2ZXJ0aWNhbCBsaW5lIHRvdGFsCisgICAgI2RlZmluZSAgICAgQ0FQVFVSRV9WRVJfTElORV9CSVQJCQkJCTAKKyAgICAjZGVmaW5lICAgICBDQVBUVVJFX1ZFUl9MSU5FX01BU0sJCQkJCTB4MDAwMDA3RkYKKyAgICAjZGVmaW5lICAgICBDQVBUVVJFX0hPUl9QSVhFTAkJCQkJCTB4MDAwMTAwMDAgIC8vQml0WzI2OjE2XSBWaWRlbyBjb21wcmVzc2lvbiB2ZXJ0aWNhbCBsaW5lIHRvdGFsCisgICAgI2RlZmluZSAgICAgQ0FQVFVSRV9IT1JfUElYRUxfQklUCQkJCQkxNgorICAgICNkZWZpbmUgICAgIENBUFRVUkVfSE9SX1BJWEVMX01BU0sJCQkJCTB4MDdGRjAwMDAKKworI2RlZmluZSAgICAgVklERU8xX0NPTVBSRVNTX1dJTkRPV1NfUkVHICAgICAgICAgICAgICAgICAweDM0ICsgVklERU9CQVNFX09GRlNFVAorI2RlZmluZSAgICAgVklERU8yX0NPTVBSRVNTX1dJTkRPV1NfUkVHICAgICAgICAgICAgICAgICAweDEzNCArIFZJREVPQkFTRV9PRkZTRVQKKyAgICAjZGVmaW5lICAgICBDT01QUkVTU19WRVJfTElORSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgLy9CaXRbMTA6MF0gVmlkZW8gY29tcHJlc3Npb24gdmVydGljYWwgbGluZSB0b3RhbAorICAgICNkZWZpbmUgICAgIENPTVBSRVNTX1ZFUl9MSU5FX0JJVCAgICAgICAgICAgICAgICAgICAwCisgICAgI2RlZmluZSAgICAgQ09NUFJFU1NfVkVSX0xJTkVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDA3RkYKKyAgICAjZGVmaW5lICAgICBDT01QUkVTU19IT1JfUElYRUwgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMjY6MTZdIFZpZGVvIGNvbXByZXNzaW9uIHZlcnRpY2FsIGxpbmUgdG90YWwKKyAgICAjZGVmaW5lICAgICBDT01QUkVTU19IT1JfUElYRUxfQklUICAgICAgICAgICAgICAgICAgMTYKKyAgICAjZGVmaW5lICAgICBDT01QUkVTU19IT1JfUElYRUxfTUFTSyAgICAgICAgICAgICAgICAgMHgwN0ZGMDAwMAorCisjZGVmaW5lICAgICBWSURFTzFfQ09NUFJFU1NfQlVGX1BST0NFU1NfT0ZGU0VUX1JFRyAgICAgIDB4MzgKKyNkZWZpbmUgICAgIFZJREVPMl9DT01QUkVTU19CVUZfUFJPQ0VTU19PRkZTRVRfUkVHICAgICAgMHgxMzgKKyAgICAjZGVmaW5lICAgICBDT01QUkVTU19CVUZfUFJPQ0VTU19PRkZTRVRfQUxJR04gICAgICAgMTI3IC8vMTI4IGJ5dGUgYWxpZ25tZW50CisgICAgI2RlZmluZSAgICAgQ09NUFJFU1NfQlVGX1BST0NFU1NfT0ZGU0VUX01BU0sgICAgICAgIDB4RkZGRkZGCisKKyNkZWZpbmUgICAgIFZJREVPMV9ERUNPTVBSRVNTX0JVRl9QUk9DRVNTX09GRlNFVF9SRUcgICAgMHgzOAorI2RlZmluZSAgICAgVklERU8yX0RFQ09NUFJFU1NfQlVGX1BST0NFU1NfT0ZGU0VUX1JFRyAgICAweDEzOAorICAgICNkZWZpbmUgICAgIERFQ09NUFJFU1NfQlVGX1BST0NFU1NfT0ZGU0VUX0FMSUdOICAgICAxMjcgLy8xMjggYnl0ZSBhbGlnbm1lbnQKKyAgICAjZGVmaW5lICAgICBERUNPTVBSRVNTX0JVRl9QUk9DRVNTX09GRlNFVF9NQVNLICAgICAgMHhGRkZGRkYKKworCisvL0ZvciBDb21wcmVzc2lvbgorI2RlZmluZSAgICAgVklERU8xX0NPTVBSRVNTX0JVRl9SRUFEX09GRlNFVF9SRUcgICAgICAgICAweDNDICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9Gb3Igc3RyZWFtIG1vZGUKKyNkZWZpbmUgICAgIFZJREVPMl9DT01QUkVTU19CVUZfUkVBRF9PRkZTRVRfUkVHICAgICAgICAgMHgxM0MgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgQ09NUFJFU1NfQlVGX1JFQURfT0ZGU0VUX0FMSUdOICAgICAgICAgIDEyNyAvLzEyOCBieXRlIGFsaWdubWVudAorICAgICNkZWZpbmUgICAgIENPTVBSRVNTX0JVRl9SRUFEX09GRlNFVF9NQVNLICAgICAgICAgICAweDAwRkZGRkZGCisvL0ZvciBEZWNvbXByZXNzaW9uCisjZGVmaW5lICAgICBWSURFTzFfREVDT01QUkVTU19CVUZfV1JJVEVfT0ZGU0VUX1JFRyAgICAgIDB4M0MgKyBWSURFT0JBU0VfT0ZGU0VUICAgICAvL0ZvciBzdHJlYW0gbW9kZSAKKyNkZWZpbmUgICAgIFZJREVPMl9ERUNPTVBSRVNTX0JVRl9XUklURV9PRkZTRVRfUkVHICAgICAgMHgxM0MgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgREVDT01QUkVTU19CVUZfV1JJVEVfT0ZGU0VUX0FMSUdOICAgICAgIDEyNyAvLzEyOCBieXRlIGFsaWdubWVudAorICAgICNkZWZpbmUgICAgIERFQ09NUFJFU1NfQlVGX1dSSVRFX09GRlNFVF9NQVNLICAgICAgICAweDAwRkZGRkZGCisKKyNkZWZpbmUgICAgIFZJREVPMV9DUkNfQlVGX0FERFJfUkVHICAgICAgICAgICAgICAgICAgICAgMHg0MCArIFZJREVPQkFTRV9PRkZTRVQKKyNkZWZpbmUgICAgIFZJREVPMl9DUkNfQlVGX0FERFJfUkVHICAgICAgICAgICAgICAgICAgICAgMHgxNDAgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgQ1JDX0JVRl9BRERSX0FMSUdOICAgICAgICAgICAgICAgICAgICAgIDcgICAvLzggYnl0ZSBhbGlnbm1lbnQKKyAgICAjZGVmaW5lICAgICBDUkNfQlVGX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwRkZGRkZGRgorCisjZGVmaW5lICAgICBWSURFTzFfQlVGXzFfQUREUl9SRUcgICAgICAgICAgICAgICAgICAgICAgIDB4NDQgKyBWSURFT0JBU0VfT0ZGU0VUICAgICAvL0ZvciBTb3VyY2UgQnVmZmVyIGluIGZyYW1lIG1vZGUKKyNkZWZpbmUgICAgIFZJREVPMl9CVUZfMV9BRERSX1JFRyAgICAgICAgICAgICAgICAgICAgICAgMHgxNDQgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgQlVGXzFfQUREUl9BTElHTiAgICAgICAgICAgICAgICAgICAgICAgIDI1NSAvLzI1NiBieXRlIGFsaWdubWVudAorICAgICNkZWZpbmUgICAgIEJVRl8xX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDFGRkZGRkZGCisKKyNkZWZpbmUgICAgIFZJREVPMV9CVUZfTElORV9PRkZTRVRfUkVHICAgICAgICAgICAgICAgICAgMHg0OCArIFZJREVPQkFTRV9PRkZTRVQgICAgIC8vTXVzdCBzZXQgYm90aCBpbiBGcmFtZS9TdHJlYW0gbW9kZQorI2RlZmluZSAgICAgVklERU8yX0JVRl9MSU5FX09GRlNFVF9SRUcgICAgICAgICAgICAgICAgICAweDE0OCArIFZJREVPQkFTRV9PRkZTRVQKKyAgICAjZGVmaW5lICAgICBCVUZfTElORV9PRkZTRVRfQUxJR04gICAgICAgICAgICAgICAgICAgNyAvLzggYnl0ZSBhbGlnbm1lbnQKKyAgICAjZGVmaW5lICAgICBCVUZfTElORV9PRkZTRVRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwM0ZGRgorCisjZGVmaW5lICAgICBWSURFTzFfQlVGXzJfQUREUl9SRUcgICAgICAgICAgICAgICAgICAgICAgIDB4NEMgKyBWSURFT0JBU0VfT0ZGU0VUICAgICAvL0ZvciBCQ0QgQnVmZmVyIGluIGZyYW1lIG1vZGUKKyNkZWZpbmUgICAgIFZJREVPMl9CVUZfMl9BRERSX1JFRyAgICAgICAgICAgICAgICAgICAgICAgMHgxNEMgKyBWSURFT0JBU0VfT0ZGU0VUICAgICAKKyAgICAjZGVmaW5lICAgICBCVUZfMl9BRERSX0FMSUdOICAgICAgICAgICAgICAgICAgICAgICAgMjU1IC8vMjU2IGJ5dGUgYWxpZ25tZW50CisgICAgI2RlZmluZSAgICAgQlVGXzJfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUZGRkZGRkYKKworI2RlZmluZSAgICAgVklERU8xX0ZMQUdfQlVGX0FERFJfUkVHICAgICAgICAgICAgICAgICAgICAweDUwICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9Gb3IgYmxvY2sgY2hhbmdlIGZsYWcgYnVmZmVyCisjZGVmaW5lICAgICBWSURFTzJfRkxBR19CVUZfQUREUl9SRUcgICAgICAgICAgICAgICAgICAgIDB4MTUwICsgVklERU9CQVNFX09GRlNFVCAgICAgCisgICAgI2RlZmluZSAgICAgRkxBR19CVUZfQUREUl9BTElHTiAgICAgICAgICAgICAgICAgICAgIDcgLy84IGJ5dGUgYWxpZ25tZW50CisgICAgI2RlZmluZSAgICAgRkxBR19CVUZfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MUZGRkZGRkYKKworI2RlZmluZSAgICAgVklERU8xX0NPTVBSRVNTX0JVRl9BRERSX1JFRyAgICAgICAgICAgICAgICAweDU0ICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9Gb3Igc3RyZWFtIG1vZGUKKyNkZWZpbmUgICAgIFZJREVPMl9DT01QUkVTU19CVUZfQUREUl9SRUcgICAgICAgICAgICAgICAgMHgxNTQgKyBWSURFT0JBU0VfT0ZGU0VUICAgICAKKyAgICAjZGVmaW5lICAgICBDT01QUkVTU19CVUZfQUREUl9BTElHTiAgICAgICAgICAgICAgICAgMTI3IC8vMTI4IGJ5dGUgYWxpZ25tZW50CisgICAgI2RlZmluZSAgICAgQ09NUFJFU1NfQlVGX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgIDB4MUZGRkZGRkYKKworI2RlZmluZSAgICAgVklERU8xX1NUUkVBTV9CVUZfU0laRSAgICAgICAgICAgICAgICAgICAgICAweDU4ICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9Gb3Igc3RyZWFtIG1vZGUgCisjZGVmaW5lICAgICBWSURFTzJfU1RSRUFNX0JVRl9TSVpFICAgICAgICAgICAgICAgICAgICAgIDB4MTU4ICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIFNUUkVBTV9QQUNLRVRfU0laRSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisgICAgICAgICNkZWZpbmUgICAgIFNUUkVBTV9QQUNLRVRfU0laRV9CSVQgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgU1RSRUFNX1BBQ0tFVF9TSVpFX01BU0sgICAgICAgICAgICAgMHgwMDAwMDAwNworICAgICAgICAjZGVmaW5lICAgICBQQUNLRVRfU0laRV8xS0IgICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgICNkZWZpbmUgICAgIFBBQ0tFVF9TSVpFXzJLQiAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAgICAgI2RlZmluZSAgICAgUEFDS0VUX1NJWkVfNEtCICAgICAgICAgICAgICAgICAgICAgMgorICAgICAgICAjZGVmaW5lICAgICBQQUNLRVRfU0laRV84S0IgICAgICAgICAgICAgICAgICAgICAzCisgICAgICAgICNkZWZpbmUgICAgIFBBQ0tFVF9TSVpFXzE2S0IgICAgICAgICAgICAgICAgICAgIDQKKyAgICAgICAgI2RlZmluZSAgICAgUEFDS0VUX1NJWkVfMzJLQiAgICAgICAgICAgICAgICAgICAgNQorICAgICAgICAjZGVmaW5lICAgICBQQUNLRVRfU0laRV82NEtCICAgICAgICAgICAgICAgICAgICA2CisgICAgICAgICNkZWZpbmUgICAgIFBBQ0tFVF9TSVpFXzEyOEtCICAgICAgICAgICAgICAgICAgIDcKKyAgICAjZGVmaW5lICAgICBSSU5HX0JVRl9QQUNLRVRfTlVNICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorICAgICAgICAjZGVmaW5lICAgICBSSU5HX0JVRl9QQUNLRVRfTlVNX0JJVCAgICAgICAgICAgICAzCisgICAgICAgICNkZWZpbmUgICAgIFJJTkdfQlVGX1BBQ0tFVF9OVU1fTUFTSyAgICAgICAgICAgIDB4MDAwMDAwMTgKKyAgICAgICAgI2RlZmluZSAgICAgUEFDS0VUU180ICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBQQUNLRVRTXzggICAgICAgICAgICAgICAgICAgICAgICAgICAxCisgICAgICAgICNkZWZpbmUgICAgIFBBQ0tFVFNfMTYgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyAgICAgICAgI2RlZmluZSAgICAgUEFDS0VUU18zMiAgICAgICAgICAgICAgICAgICAgICAgICAgMworICAgICNkZWZpbmUgICAgIFNLSVBfSElHSF9NQl9USFJFUyAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwICAvL0JpdFsyMjoxNl0gU2tpcCBoaWdoIHF1YWxpdHkgbWFjcm8gYmxvY2sgdGhyZXNob2xkCisgICAgICAgICNkZWZpbmUgICAgIFNLSVBfSElHSF9NQl9USFJFU19CSVQgICAgICAgICAgICAgIDE2CisgICAgICAgICNkZWZpbmUgICAgIFNLSVBfSElHSF9NQl9USFJFU19NQVNLICAgICAgICAgICAgIDB4MDA3RjAwMDAKKyAgICAjZGVmaW5lICAgICBTS0lQX1RFU1RfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwMDAwMCAgLy9CaXRbMjQ6MjNdIFNraXAgdGVzdCBtb2RlCisgICAgICAgICNkZWZpbmUgICAgIFNLSVBfVEVTVF9NT0RFX0JJVCAgICAgICAgICAgICAgICAgIDIzCisgICAgICAgICNkZWZpbmUgICAgIFNLSVBfVEVTVF9NT0RFX01BU0sgICAgICAgICAgICAgICAgIDB4MDE4MDAwMDAKKyAgICAgICAgI2RlZmluZSAgICAgWVVWX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgIC8vcmVjb21tZW5kCisKKyNkZWZpbmUgICAgIFZJREVPMV9CVUZfQ09ERUNfT0ZGU0VUX1JFQUQgICAgICAgICAgICAgICAgMHg1QyArIFZJREVPQkFTRV9PRkZTRVQgICAgIC8vRm9yIHN0cmVhbSBtb2RlLCAgICAgICAgIAorI2RlZmluZSAgICAgVklERU8yX0JVRl9DT0RFQ19PRkZTRVRfUkVBRCAgICAgICAgICAgICAgICAweDE1QyArIFZJREVPQkFTRV9PRkZTRVQgICAgLy9WaWRlbyBzdHJlYW0gYnVmZmVyIG9mZnNldCByZWFkIGJhY2soSFcpCisgICAgI2RlZmluZSAgICAgQlVGX0NPREVDX09GRlNFVF9BTElHTiAgICAgICAgICAgICAgICAgIDI1NSAvLzI1NiBieXRlIGFsaWdubWVudAorICAgICNkZWZpbmUgICAgIEJVRl9DT0RFQ19PRkZTRVRfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwRkZGRkZGCisKKyNkZWZpbmUgICAgIFZJREVPMV9DT01QUkVTU19DT05UUk9MX1JFRyAgICAgICAgICAgICAgICAgMHg2MCArIFZJREVPQkFTRV9PRkZTRVQKKyNkZWZpbmUgICAgIFZJREVPMl9DT01QUkVTU19DT05UUk9MX1JFRyAgICAgICAgICAgICAgICAgMHgxNjAgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgSlBFR19PTkxZX0VOQ09ERSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgIC8vQml0WzBdIEpQRUcgb25seSBlbmNvZGluZworICAgICAgICAjZGVmaW5lICAgICBKUEVHX09OTFlfQklUICAgICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgICNkZWZpbmUgICAgIEpQRUdfTUlYX01PREUgICAgICAgICAgICAgICAgICAgICAgIDAgICAvL0VuYWJsZSBKUEVHL1ZRIG1peCBtb2RlIGVuY29kaW5nCisgICAgICAgICNkZWZpbmUgICAgIEpQRUdfT05MWV9NT0RFICAgICAgICAgICAgICAgICAgICAgIDEgICAvL0pQRUcgZW5jb2RpbmcgbW9kZSBvbmx5CisgICAgI2RlZmluZSAgICAgVlFfNF9DT0xPUl9FTkNPREUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIgIC8vQml0WzFdIEVuYWJsZSA0IGNvbG9yIFZRIGVuY29kaW5nCisgICAgICAgICNkZWZpbmUgICAgIFZRXzRfQ09MT1JfQklUICAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAgICAgI2RlZmluZSAgICAgVlFfMV8yX0NPTE9SX01PREUgICAgICAgICAgICAgICAgICAgMCAgIC8vMSBhbmQgMiBjb2xvciBtb2RlIFZRIGVuY29kaW5nCisgICAgICAgICNkZWZpbmUgICAgIFZRXzRfQ09MT1JfTU9ERSAgICAgICAgICAgICAgICAgICAgIDEgICAvLzEsIDIgYW5kIDQgY29sb3IgVlEgZW5jb2RpbmcKKyAgICAjZGVmaW5lICAgICBRVUFMSVRZX0NPREVDX1NFVFRJTkcgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNCAgLy9CaXRbMl0gSGlnaCBhbmQgYmVzdCB2aWRlbyBxdWFsaXR5IGNvZGVjIG1vZGUgc2V0dGluZworICAgICAgICAjZGVmaW5lICAgICBRVUFMSVRZX0NPREVDX1NFVFRJTkdfQklUICAgICAgICAgICAyCisgICAgICAgICNkZWZpbmUgICAgIEpQRUdfQ09ERUNfTU9ERSAgICAgICAgICAgICAgICAgICAgIDAgICAvL25vdCBzdXBwb3J0ZWQgaW4gYmVzdCB2aWRlbyBxdWFsaXR5IG1vZGUKKyAgICAgICAgI2RlZmluZSAgICAgUVVBTlRJX0NPREVDX01PREUgICAgICAgICAgICAgICAgICAgMQorICAgICNkZWZpbmUgICAgIEpQRUdfRFVBTF9RVUFMSVRZX0VOICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4ICAvL0JpdFszXSBKUEVHIGR1YWwgcXVhbGl0eSBtb2RlCisgICAgICAgICNkZWZpbmUgICAgIEVOX0pQRUdfRFVBTF9RVUFMSVRZICAgICAgICAgICAgICAgIDEgICAvL2VuYWJsZShvbmx5IGZvciBub3JtYWwgdmlkZW8gcXVhbGl0eSBtb2RlKQorICAgICNkZWZpbmUgICAgIEJFU1RfUVVBTElUWV9FTiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwICAvL0JpdFs0XSBCZXN0IHF1YWxpdHkgdmlkZW8gbW9kZSBlbmFibGUKKyAgICAgICAgI2RlZmluZSAgICAgQkVTVF9RVUFMSVRZX0VOX0JJVCAgICAgICAgICAgICAgICAgNAorICAgICAgICAjZGVmaW5lICAgICBFTl9CRVNUX1FVQUxJVFkgICAgICAgICAgICAgICAgICAgICAxICAgLy9lbmFibGUob25seSBmb3IgcXVhbnRpemF0aW9uIGNvZGVjIG1vZGUpCisgICAgI2RlZmluZSAgICAgUkM0X0NSWVBUX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAgIC8vQml0WzVdIEVuYWJsZSBSQzQgZW5jcnlwdGlvbi9kZWNyeXB0aW9uCisJCSNkZWZpbmUJCVJDNF9DUllQVF9FTl9CSVQJCQkJCTUKKwkJI2RlZmluZSAgICAgUkM0X0NSWVBUX0VOX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorICAgICAgICAjZGVmaW5lICAgICBSQzRfQ1JZUFRfT04gICAgICAgICAgICAgICAgICAgICAgICAxICAgLy9lbmFibGUKKyAgICAjZGVmaW5lICAgICBOT1JNQUxfUVVBTlRJX0NIUk9NSV9UQUJMRSAgICAgICAgICAgICAgMHgwMDAwMDA0MCAgLy9CaXRbMTA6Nl0gTm9ybWFsIHZpZGVvIHF1YWxpdHkgbW9kZSBKUEVHIERDVCBjaHJvbWkgcXVhbnRpbmF0aW9uIHRhYmxlCisgICAgICAgICNkZWZpbmUgICAgIE5PUk1BTF9RVUFOVElfQ0hST01JX1RBQkxFX0JJVCAgICAgIDYKKyAgICAgICAgI2RlZmluZSAgICAgTk9STUFMX1FVQU5USV9DSFJPTUlfVEFCTEVfTUFTSyAgICAgMHgwMDAwMDdDMAorICAgICNkZWZpbmUgICAgIE5PUk1BTF9RVUFOVElfTFVNSV9UQUJMRSAgICAgICAgICAgICAgICAweDAwMDAwODAwICAvL0JpdFsxNToxMV0gTm9ybWFsIHZpZGVvIHF1YWxpdHkgbW9kZSBKUEVHIERDVCBsdW1pIHF1YW50aW5hdGlvbiB0YWJsZQorICAgICAgICAjZGVmaW5lICAgICBOT1JNQUxfUVVBTlRJX0xVTUlfVEFCTEVfQklUICAgICAgICAxMQorICAgICAgICAjZGVmaW5lICAgICBOT1JNQUxfUVVBTlRJX0xVTUlfVEFCTEVfTUFTSyAgICAgICAweDAwMDBGODAwCisgICAgI2RlZmluZSAgICAgSElHSF9RVUFMSVRZX0VOICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAgIC8vQml0WzE2XSBIaWdoIHZpZGVvIHF1YWxpdHkgbW9kZSBlbmFibGUKKyAgICAgICAgI2RlZmluZSAgICAgSElHSF9RVUFMSVRZX0VOX0JJVCAgICAgICAgICAgICAgICAgMTYKKyAgICAgICAgI2RlZmluZSAgICAgRU5fSElHSF9RVUFMSVRZICAgICAgICAgICAgICAgICAgICAgMSAgIC8vRW5hYmxlCisgICAgI2RlZmluZSAgICAgVVZfQ0lSNjU2X0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAgIC8vQml0WzE5XSBVViBmcm9tYXQKKyAgICAgICAgI2RlZmluZSAgICAgVVZfQ0lSNjU2X0ZPUk1BVF9CSVQgICAgICAgICAgICAgICAgMTkKKyAgICAgICAgI2RlZmluZSAgICAgVVNFX1VWX0NJUjY1NiAgICAgICAgICAgICAgICAgICAgICAgMSAgIC8vcmVjb21tYW5kCisgICAgI2RlZmluZSAgICAgSFVGRk1BTl9UQUJMRV9TRUxFQ1QgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAgIC8vQml0WzIwXSBKUEVHIEh1ZmZtYW4gdGFibGUgY29tYmluYXRpb24KKyAgICAgICAgI2RlZmluZSAgICAgRFVBTF9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgIC8vRHVhbCBZLCBVViB0YWJsZQorICAgICAgICAjZGVmaW5lICAgICBTSU5HTEVfVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAxICAgLy9TaW5nbGUgWSB0YWJsZQorICAgICAgICAjZGVmaW5lICAgICBTSU5HTEVfVVZfVEFCTEUgICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwICAvLzF4OiBTaW5nbGUgVVYgdGFibGUKKyAgICAjZGVmaW5lICAgICBISUdIX1FVQU5USV9DSFJPTUlfVEFCTEUgICAgICAgICAgICAgICAgMHgwMDQwMDAwMCAgLy9CaXRbMjY6MjJdIEhpZ2ggcXVhbGl0eSBKUEVHIERDVCBjaHJvbWkgcXVhbnRpemF0aW9uIHRhYmxlCisgICAgICAgICNkZWZpbmUgICAgIEhJR0hfUVVBTlRJX0NIUk9NSV9UQUJMRV9CSVQgICAgICAgIDIyCisgICAgICAgICNkZWZpbmUgICAgIEhJR0hfUVVBTlRJX0NIUk9NSV9UQUJMRV9NQVNLICAgICAgIDB4MDdDMDAwMDAgICAgICAgICAgICAgICAgCisgICAgI2RlZmluZSAgICAgSElHSF9ERVFVQU5USV9WQUxVRSAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDAgIC8vQml0WzI2OjIyXSBIaWdoIHF1YWxpdHkgZGUtcXVhbnRpemF0aW9uIHZhbHVlCisgICAgICAgICNkZWZpbmUgICAgIEhJR0hfREVRVUFOVElfVkFMVUVfQklUICAgICAgICAgICAgIDIyCisgICAgICAgICNkZWZpbmUgICAgIEhJR0hfREVRVUFOVElfVkFMVUVfTUFTSyAgICAgICAgICAgIDB4MDdDMDAwMDAgICAgICAgIAorICAgICNkZWZpbmUgICAgIEhJR0hfUVVBTlRJX0xVTUlfVEFCTEUgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwICAvL0JpdFszMToyN10gSGlnaCBxdWFsaXR5IEpQRUcgRENUIGx1bWkgcXVhbnRpemF0aW9uIHRhYmxlCisgICAgICAgICNkZWZpbmUgICAgIEhJR0hfUVVBTlRJX0xVTUlfVEFCTEVfQklUICAgICAgICAgIDI3CisgICAgICAgICNkZWZpbmUgICAgIEhJR0hfUVVBTlRJX0xVTUlfVEFCTEVfTUFTSyAgICAgICAgIDB4RjgwMDAwMDAKKyAgICAjZGVmaW5lICAgICBCRVNUX0RFUVVBTlRJX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMCAgLy9CaXRbMzE6MjddIEJlc3QgcXVhbGl0eSBkZS1xdWFudGl6YXRpb24gdmFsdWUKKyAgICAgICAgI2RlZmluZSAgICAgQkVTVF9ERVFVQU5USV9WQUxVRV9CSVQgICAgICAgICAgICAgMjcKKyAgICAgICAgI2RlZmluZSAgICAgQkVTVF9ERVFVQU5USV9WQUxVRV9NQVNLICAgICAgICAgICAgMHhGODAwMDAwMAorICAgICAgICAKKworI2RlZmluZSAgICAgVklERU8xX1FVQU5USV9UQUJMRV9MT1dfUkVHICAgICAgICAgICAgICAgICAweDY0ICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9NYXRjaCB3aXRoIDB4NjAgQml0WzEwOjZdLCBCaXRbMTU6MTFdCisjZGVmaW5lICAgICBWSURFTzJfUVVBTlRJX1RBQkxFX0xPV19SRUcgICAgICAgICAgICAgICAgIDB4MTY0ICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIFFVQU5USV9DSFJPTUlfVEFCTEVfTE9XICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFs0OjBdIE5vcm1hbCB2aWRlbyBsb3cgcXVhbGl0eSBibG9jayBjaHJvbWkgcXVhbnRpemF0aW9uIHRhYmxlCisgICAgICAgICNkZWZpbmUgICAgIFFVQU5USV9DSFJPTUlfVEFCTEVfTE9XX0JJVCAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgUVVBTlRJX0NIUk9NSV9UQUJMRV9MT1dfTUFTSyAgICAgICAgMHgwMDAwMDAxRgorICAgICNkZWZpbmUgICAgIFFVQU5USV9MVU1JX1RBQkxFX0xPVyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwICAvL0JpdFs5OjVdIE5vcm1hbCB2aWRlbyBsb3cgcXVhbGl0eSBibG9jayBsdW1pIHF1YW50aXphdGlvbiB0YWJsZQorICAgICAgICAjZGVmaW5lICAgICBRVUFOVElfTFVNSV9UQUJMRV9MT1dfQklUICAgICAgICAgICA1CisgICAgICAgICNkZWZpbmUgICAgIFFVQU5USV9MVU1JX1RBQkxFX0xPV19NQVNLICAgICAgICAgIDB4MDAwMDAzRTAKKworI2RlZmluZSAgICAgVklERU8xX1FVQU5USV9WQUxVRV9SRUcgICAgICAgICAgICAgICAgICAgICAweDY4ICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9NYXRjaCB3aXRoIDB4NjAgQml0WzI2OjIyXSxCaXRbMzE6MjddCisjZGVmaW5lICAgICBWSURFTzJfUVVBTlRJX1ZBTFVFX1JFRyAgICAgICAgICAgICAgICAgICAgIDB4MTY4ICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIEhJR0hfUVVBTlRJX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFsxNDowXSBIaWdoIHF1YWxpdHkgcXVhbnRpemF0aW9uIHZhbHVlLiBGb3JtYXQgaXMgMS4xNAorICAgICAgICAjZGVmaW5lICAgICBISUdIX1FVQU5USV9WQUxVRV9CSVQgICAgICAgICAgICAgICAwCisgICAgICAgICNkZWZpbmUgICAgIEhJR0hfUVVBTlRJX1ZBTFVFX01BU0sgICAgICAgICAgICAgIDB4MDAwMDdGRkYKKyAgICAjZGVmaW5lICAgICBCRVNUX1FVQU5USV9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMzA6MTZdIEJlc3QgcXVhbGl0eSBxdWFudGl6YXRpb24gdmFsdWUuIEZvcm1hdCBpcyAxLjE0CisgICAgICAgICNkZWZpbmUgICAgIEJFU1RfUVVBTlRJX1ZBTFVFX0JJVCAgICAgICAgICAgICAgIDE2CisgICAgICAgICNkZWZpbmUgICAgIEJFU1RfUVVBTlRJX1ZBTFVFX01BU0sgICAgICAgICAgICAgIDB4N0ZGRjAwMDAKKyAgICAKKyNkZWZpbmUgICAgIFZJREVPMV9CU0RfUEFSQV9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgMHg2QyArIFZJREVPQkFTRV9PRkZTRVQgICAgLy9WaWRlbyBCU0QgUGFyYW1ldGVycyBSZWdpc3RlciAgICAKKyNkZWZpbmUgICAgIFZJREVPMl9CU0RfUEFSQV9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNkMgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgQlNEX0hJR0hfVEhSRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgIC8vQml0Wzc6MF0gQmxvY2sgc2hhcnBuZXNzIGRldGVjdGlvbiBoaWdoIHRocmVzaG9sZAorICAgICNkZWZpbmUgICAgIEJTRF9ISUdIX1RIUkVTX0JJVCAgICAgICAgICAgICAgICAgICAgICAwCisgICAgI2RlZmluZSAgICAgQlNEX0hJR0hfVEhSRVNfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKKyAgICAjZGVmaW5lICAgICBCU0RfTE9XX1RIUkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMCAgLy9CaXRbMTU6OF0gQmxvY2sgc2hhcHJwbmVzcyBkZXRlY3Rpb24gbG93IHRocmVzaG9sZAorICAgICNkZWZpbmUgICAgIEJTRF9MT1dfVEhSRVNfQklUICAgICAgICAgICAgICAgICAgICAgICA4CisgICAgI2RlZmluZSAgICAgQlNEX0xPV19USFJFU19NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGMDAKKyAgICAjZGVmaW5lICAgICBCU0RfSElHSF9DT1VOVFMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMjE6MTZdIEJsb2NrIHNoYXJwbmVzcyBkZXRlY3Rpb24gaGlnaCBjb3VudHMgdGhyZXNob2xkCisgICAgI2RlZmluZSAgICAgQlNEX0hJR0hfQ09VTlRTX0JJVCAgICAgICAgICAgICAgICAgICAgIDE2CisgICAgI2RlZmluZSAgICAgQlNEX0hJR0hfQ09VTlRTX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAzRjAwMDAKKyAgICAjZGVmaW5lICAgICBCU0RfTE9XX0NPVU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMCAgLy9CaXRbMjc6MjJdIEJsb2NrIHNoYXJwbmVzcyBkZXRlY3Rpb24gbG93IGNvdW50cyB0aHJlc2hvbGQKKyAgICAjZGVmaW5lICAgICBCU0RfTE9XX0NPVU5UU19CSVQgICAgICAgICAgICAgICAgICAgICAgMjIKKyAgICAjZGVmaW5lICAgICBCU0RfTE9XX0NPVU5UU19NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwRkMwMDAwMAorCisjZGVmaW5lIFZJREVPMV9DT01QUkVTU19GUkFNRV9TSVpFX1JFRyAgICAgICAgICAgICAgICAgIDB4NzAgKyBWSURFT0JBU0VfT0ZGU0VUCisjZGVmaW5lIFZJREVPMl9DT01QUkVTU19GUkFNRV9TSVpFX1JFRyAgICAgICAgICAgICAgICAgIDB4MTcwICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIENPTVBSRVNTX0ZSQU1FX1NJWkVfUkVBRCAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFsxOTowXSBWaWRlbyBjb21wcmVzc2lvbiBmcmFtZSBzaXplIHJlYWQgYmFjayhudW1iZXIgb2YgRFcpCisgICAgI2RlZmluZSAgICAgQ09NUFJFU1NfRlJBTUVfU0laRV9SRUFEX0JJVCAgICAgICAgICAgIDAKKyAgICAjZGVmaW5lICAgICBDT01QUkVTU19GUkFNRV9TSVpFX1JFQURfTUFTSyAgICAgICAgICAgMHgwMDNGRkZGRgorCisjZGVmaW5lICAgICBWSURFTzFfQ09NUFJFU1NfQkxPQ0tfQ09VTlRfUkVHICAgICAgICAgICAgIDB4NzQgKyBWSURFT0JBU0VfT0ZGU0VUCisjZGVmaW5lICAgICBWSURFTzJfQ09NUFJFU1NfQkxPQ0tfQ09VTlRfUkVHICAgICAgICAgICAgIDB4MTc0ICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIFBST0NFU1NfQkxPQ0tfQ09VTlRfUkVBRF9CSVQgICAgICAgICAgICAwCisgICAgI2RlZmluZSAgICAgUFJPQ0VTU19CTE9DS19DT1VOVF9SRUFEX01BU0sJCQkweDAwMDAzRkZGCS8vQml0WzEzOjBdIFZpZGVvIHByb2Nlc3NlZCB0b3RhbCBibG9jayBjb3VudGVyIHJlYWQgYmFjayhudW1iZXIgb2YgYmxvY2tzKQorICAgICNkZWZpbmUgICAgIENPTVBSRVNTX0JMT0NLX0NPVU5UX1JFQURfQklUICAgICAgICAgICAxNgorICAgICNkZWZpbmUgICAgIENPTVBSRVNTX0JMT0NLX0NPVU5UX1JFQURfTUFTSyAgICAgICAgICAweEZGRkYwMDAwCS8vQml0WzI5OjE2XSBWaWRlbyBwcm9jZXNzZWQgdG90YWwgYmxvY2sgY291bnRlciByZWFkIGJhY2sobnVtYmVyIG9mIGJsb2NrcykKKworI2RlZmluZSAgICAgVklERU8xX0NPTVBSRVNTX0ZSQU1FX0VORF9SRUFEICAgICAgICAgICAgICAweDc4ICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9WaWRlbyBjb21wcmVzc2lvbiBzdHJlYW0gZnJhbWUgZW5kIHBvaW50ZXIgICAgCisjZGVmaW5lICAgICBWSURFTzJfQ09NUFJFU1NfRlJBTUVfRU5EX1JFQUQgICAgICAgICAgICAgIDB4MTc4ICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIENPTVBSRVNTX0ZSQU1FX0VORF9SRUFEX0FMSUdOICAgICAgICAgICA3CisgICAgI2RlZmluZSAgICAgQ09NUFJFU1NfRlJBTUVfRU5EX1JFQURfTUFTSyAgICAgICAgICAgIDB4MDBGRkZGRkYKKworI2RlZmluZSAgICAgVklERU8xX0NPTVBSRVNTX0ZSQU1FX0NPVU5UX1JFQUQgICAgICAgICAgICAweDdDICsgVklERU9CQVNFX09GRlNFVCAgICAgCisjZGVmaW5lICAgICBWSURFTzJfQ09NUFJFU1NfRlJBTUVfQ09VTlRfUkVBRCAgICAgICAgICAgIDB4MTdDICsgVklERU9CQVNFX09GRlNFVCAKKyAgICAjZGVmaW5lICAgICBDT01QUkVTU19GUkFNRV9DT1VOVF9SRUFEICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgLy9CaXRbMTU6MF0gVmlkZW8gY29tcHJlc3Npb24gZnJhbWUgY291bnQgcmVhZCBiYWNrKG51bWJlciBvZiBmcmFtZSkKKyAgICAjZGVmaW5lICAgICBDT01QUkVTU19GUkFNRV9DT1VOVF9SRUFEX0JJVCAgICAgICAgICAgMAorICAgICNkZWZpbmUgICAgIENPTVBSRVNTX0ZSQU1FX0NPVU5UX1JFQURfTUFTSyAgICAgICAgICAweEZGRkZGRkZGCisKKyNkZWZpbmUgICAgIFZJREVPMV9VU0VSX0RFRklORV9IRUFERVIgICAgICAgICAgICAgICAgICAgMHg4MCArIFZJREVPQkFTRV9PRkZTRVQKKyNkZWZpbmUgICAgIFZJREVPMl9VU0VSX0RFRklORV9IRUFERVIgICAgICAgICAgICAgICAgICAgMHgxODAgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgVVNFUl9ERUZJTkVfSEVBREVSICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgIC8vQml0WzE1OjBdIFZpZGVvIHVzZXIgZGVmaW5lZCBoZWFkZXIgcGFyYW1ldGVyCisgICAgI2RlZmluZSAgICAgVVNFUl9ERUZJTkVfSEVBREVSX0JJVCAgICAgICAgICAgICAgICAgIDAKKyAgICAjZGVmaW5lICAgICBVU0VSX0RFRklORV9IRUFERVJfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorICAgIAorI2RlZmluZSAgICAgVklERTFfTU9ERV9ERVRFQ1RJT05fRURHRV9IX1JFRyAgICAgICAgICAgICAweDkwICsgVklERU9CQVNFX09GRlNFVAorI2RlZmluZSAgICAgVklERTJfTU9ERV9ERVRFQ1RJT05fRURHRV9IX1JFRyAgICAgICAgICAgICAweDE5MCArIFZJREVPQkFTRV9PRkZTRVQKKyAgICAjZGVmaW5lICAgICBMRUZUX0VER0VfTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgLy9CaXRbMTE6MF0gVmlkZW8gc291cmNlIGxlZnQgZWRnZSBsb2NhdGlvbiBmcm9tIHN5bmMgcmlzaW5nIGVkZ2UKKyAgICAjZGVmaW5lICAgICBMRUZUX0VER0VfTE9DQVRJT05fQklUICAgICAgICAgICAgICAgICAgMAorICAgICNkZWZpbmUgICAgIExFRlRfRURHRV9MT0NBVElPTl9NQVNLICAgICAgICAgICAgICAgICAweDAwMDAwRkZGCisJI2RlZmluZQkJTk9fVkVSX1NZTkMJCQkJCQkJCSgxIDw8IDEyKQkJLy9CaXRbMTJdIE5vIFZlcnRpY2FsIHN5bmMgZGV0ZWN0ZWQKKwkjZGVmaW5lCQlOT19IT1JfU1lOQwkJCQkJCQkJKDEgPDwgMTMpCQkvL0JpdFsxM10gTm8gaG9yaXpvbnRhbCBzeW5jIGRldGVjdGVkCisJI2RlZmluZQkJTk9fQUNUSVZFX0RJU1AJCQkJCQkJKDEgPDwgMTQpCQkvL0JpdFsxNF0gTm8gYWN0aXZlIGRpc3BsYXkgZGV0ZWN0ZWQKKwkjZGVmaW5lCQlOT19ESVNQX0NMT0NLCQkJCQkJCSgxIDw8IDE1KQkJCisgICAgI2RlZmluZSAgICAgUklHSFRfRURHRV9MT0NBVElPTiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAgIC8vQml0WzI3OjE2XSBWaWRlbyBzb3VyY2UgcmlnaHQgZWRnZSBsb2NhdGlvbiBmcm9tIHN5bmMgcmlzaW5nIGVkZ2UKKyAgICAjZGVmaW5lICAgICBSSUdIVF9FREdFX0xPQ0FUSU9OX0JJVCAgICAgICAgICAgICAgICAgMTYKKyAgICAjZGVmaW5lICAgICBSSUdIVF9FREdFX0xPQ0FUSU9OX01BU0sgICAgICAgICAgICAgICAgMHgwRkZGMDAwMAorCisjZGVmaW5lICAgICBWSURFMV9NT0RFX0RFVEVDVElPTl9FREdFX1ZfUkVHICAgICAgICAgICAgIDB4OTQgKyBWSURFT0JBU0VfT0ZGU0VUCisjZGVmaW5lICAgICBWSURFMl9NT0RFX0RFVEVDVElPTl9FREdFX1ZfUkVHICAgICAgICAgICAgIDB4MTk0ICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIFRPUF9FREdFX0xPQ0FUSU9OICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFsxMTowXSBWaWRlbyBzb3VyY2UgdG9wIGVkZ2UgbG9jYXRpb24gZnJvbSBzeW5jIHJpc2luZyBlZGdlCisgICAgI2RlZmluZSAgICAgVE9QX0VER0VfTE9DQVRJT05fQklUICAgICAgICAgICAgICAgICAgIDAKKyAgICAjZGVmaW5lICAgICBUT1BfRURHRV9MT0NBVElPTl9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMEZGRgorICAgICNkZWZpbmUgICAgIEJPVFRPTV9FREdFX0xPQ0FUSU9OICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwICAvL0JpdFsyNzoxNl0gVmlkZW8gc291cmNlIGJvdHRvbSBlZGdlIGxvY2F0aW9uIGZyb20gc3luYyByaXNpbmcgZWRnZQorICAgICNkZWZpbmUgICAgIEJPVFRPTV9FREdFX0xPQ0FUSU9OX0JJVCAgICAgICAgICAgICAgICAxNgorICAgICNkZWZpbmUgICAgIEJPVFRPTV9FREdFX0xPQ0FUSU9OX01BU0sgICAgICAgICAgICAgICAweDBGRkYwMDAwCisKKyNkZWZpbmUgVklERU8xX01PREVfREVURUNUSU9OX1NUQVRVU19SRUFEX1JFRyAgICAgICAgICAgMHg5OCArIFZJREVPQkFTRV9PRkZTRVQKKyNkZWZpbmUgVklERU8yX01PREVfREVURUNUSU9OX1NUQVRVU19SRUFEX1JFRyAgICAgICAgICAgMHgxOTggKyBWSURFT0JBU0VfT0ZGU0VUICAgIAorICAgICNkZWZpbmUgICAgIE1PREVfREVURUNUSU9OX0hPUl9USU1FX1JFQUQgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFsxMTowXSBNb2RlIGRldGVjdGlvbiBIb3Jpem9udGFsIHRpbWUgcmVhZCBiYWNrIChyZWFkIG9ubHkpCisgICAgI2RlZmluZSAgICAgTU9ERV9ERVRFQ1RJT05fSE9SX1RJTUVfUkVBRF9CSVQgICAgICAgIDAKKyAgICAjZGVmaW5lICAgICBNT0RFX0RFVEVDVElPTl9IT1JfVElNRV9SRUFEX01BU0sgICAgICAgMHgwMDAwMEZGRgorICAgICNkZWZpbmUgICAgIEFOQUxPTkdfRElHSVRBTF9SRUFEICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwICAvL0JpdFsxMl0gQXV0byBkZXRlY3Rpb24gZm9yIGV4dGVybmFsIGFuYWxvZyBvciBkaWdpdGFsIHNvdXJjZSByZWFkIGJhY2sKKyAgICAgICAgI2RlZmluZSAgICAgQU5BTE9OR19ESUdJVEFMX1JFQURfQklUICAgICAgICAgICAgMTIKKyAgICAgICAgI2RlZmluZSAgICAgRFZJX1NJR05BTCAgICAgICAgICAgICAgICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBBRENfU0lHTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAxCisgICAgI2RlZmluZSAgICAgTU9ERV9ERVRFQ1RJT05fSE9SX1NUQUJMRV9SRUFEICAgICAgICAgIDB4MDAwMDIwMDAgIC8vQml0WzEzXSBNb2RlIGRldGVjdGlvbiBob3Jpem9udGFsIHN0YWJsZSByZWFkIGJhY2sKKyAgICAgICAgI2RlZmluZSAgICAgSE9SX1NUQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMQorICAgICNkZWZpbmUgICAgIE1PREVfREVURUNUSU9OX1ZFUl9TVEFCTEVfUkVBRCAgICAgICAgICAweDAwMDA0MDAwICAvL0JpdFsxNF0gTW9kZSBkZXRlY3Rpb24gdmVydGljYWwgc3RhYmxlIHJlYWQgYmFjaworICAgICAgICAjZGVmaW5lICAgICBWRVJfU1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAxCisgICAgI2RlZmluZSAgICAgT1VUX0xPQ0tfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAgIC8vQml0WzE1XSBNb2RlIGRldGVjdGlvbiBvdXQgb2YgbG9jayByZWFkIGJhY2sKKyAgICAgICAgI2RlZmluZSAgICAgU0lHTkFMX09VVF9MT0NLICAgICAgICAgICAgICAgICAgICAgMQorICAgICNkZWZpbmUgICAgIE1PREVfREVURUNUSU9OX1ZFUl9MSU5FX1JFQUQgICAgICAgICAgICAweDAwMDEwMDAwICAvL0JpdFsyNzoxNl0gTW9kZSBkZXRlY3Rpb24gVmVydGljYWwgbGluZXMgcmVhZCBiYWNrCisgICAgI2RlZmluZSAgICAgTU9ERV9ERVRFQ1RJT05fVkVSX0xJTkVfUkVBRF9CSVQgICAgICAgIDE2CisgICAgI2RlZmluZSAgICAgTU9ERV9ERVRFQ1RJT05fVkVSX0xJTkVfUkVBRF9NQVNLICAgICAgIDB4MEZGRjAwMDAKKyAgICAjZGVmaW5lICAgICBWU1lOQ19QT0xBUklUWV9SRUFEICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMCAgLy9CaXRbMjhdIFZzeW5jIHBvbGFyaXR5IHJlYWQgYmFjaworICAgICNkZWZpbmUgICAgIEhTWU5DX1BPTEFSSVRZX1JFQUQgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwICAvL0JpdFsyOV0gSHN5bmMgcG9sYXJpdHkgcmVhZCBiYWNrCisgICAgI2RlZmluZSAgICAgTU9ERV9ERVRFQ1RJT05fVlNZTkNfUkVBRFkgICAgICAgICAgICAgIDB4NDAwMDAwMDAgIC8vQml0WzMwXSBNb2RlIGRldGVjdGlvbiBWc3luYyByZWFkeQorICAgICNkZWZpbmUgICAgIE1PREVfREVURUNUSU9OX0hTWU5DX1JFQURZICAgICAgICAgICAgICAweDgwMDAwMDAwICAvL0JpdFszMV0gTW9kZSBkZXRlY3Rpb24gSHN5bmMgcmVhZHkKKworLyoqKioqKiAgICAgVklERU8gTUVNQUdFUiBTRVRUSU5HICAgICAgICAgICAgICAgKioqKioqLworI2RlZmluZSAgICAgVklERU9NX0VOR0lORV9TRVFVRU5DRV9DT05UUk9MX1JFRyAgICAgICAgICAweDIwNCArIFZJREVPQkFTRV9PRkZTRVQKKyAgICAjZGVmaW5lICAgICBWSURFT01fQ0FQVFVSRV9UUklHR0VSICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMiAgLy9CaXRbMV0gdHJpZ2dlciBIVyB0byBjYXB0dXJlIHZpZGVvCisgICAgI2RlZmluZSAgICAgVklERU9NX0FVVE9fTU9ERQkJCQkJCTB4MDAwMDAwMDggIC8vQml0WzNdCisgICAgICAgICNkZWZpbmUgICAgIERJU0FCTEVfQVVUT19NT0RFICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgQVVUT19DT01QUkVTUwkJCQkJCTEKKyAgICAjZGVmaW5lICAgICBWSURFT01fQ09ERUNfVFJJR0dFUiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMCAgLy9CaXRbNF0gdHJpZ2dlciBIVyB0byBjb21wcmVzcyBvciBkZWNvbXByZXNzIHZpZGVvCisgICAgI2RlZmluZSAgICAgVklERU9NX1NPVVJDRV9TRUxFQ1RJT04gICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAgIC8vQml0WzhdCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorICAgIC8vI2RlZmluZSAgICAgU1RSRUFNX0RBVEFfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAgIC8vQml0WzExOjEwXSBCdWZmZXIgYW5kIFN0cmVhbSBEYXRhIHR5cGUKKyAgICAvLyAgICAjZGVmaW5lICAgICBTVFJFQU1fREFUQV9NT0RFX0JJVCAgICAgICAgICAgICAgICAxMAorICAgIC8vICAgICNkZWZpbmUgICAgIFNUUkVBTV9EQVRBX01PREVfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMDBDMDAKKyAgICAvLyAgICAjZGVmaW5lICAgICBZVVY0NDRfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAwCisgICAgLy8gICAgI2RlZmluZSAgICAgWVVWNDIwX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgMQorICAgIC8vICAgICNkZWZpbmUgICAgIFlVVjQyMF9NT0RFX1dJVEhfQVNUMjAwMCAgICAgICAgICAgIDIgLy9BU1QyMDAwIGNvbXBhdGlibGUKKyAgICAjZGVmaW5lICAgICBWSURFT01fQ0FQVFVSRV9SRUFEWSAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMTZdIFZpZGVvIGNhcHR1cmUgcmVhZHkgc3RhdHVzIHJlYWQgYmFjayhyZWFkIG9ubHkpCisgICAgICAgIC8vI2RlZmluZSAgICAgSFdfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorICAgICAgICAvLyNkZWZpbmUgICAgIEhXX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAjZGVmaW5lICAgICBWSURFT01fQ09ERUNfUkVBRFkgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMCAgLy9CaXRbMThdIFZpZGVvIGNvZGVjIHJlYWR5IHN0YXR1cyByZWFkIGJhY2socmVhZCBvbmx5KQorICAgICAgICAvLyNkZWZpbmUgICAgIEhXX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgLy8jZGVmaW5lICAgICBIV19JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgICAgVklERU9NX1NDQUxFX0ZBQ1RPUl9SRUcgICAgICAgICAgICAgICAgICAgICAgMHgyMTQgKyBWSURFT0JBU0VfT0ZGU0VUCisvLyAgICAjZGVmaW5lICAgICBIT1JfU0NBTElOR19GQUNUT1IgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgLy9CaXRbMTU6MF0gVmlkZW8gSG9yaXpvbnRhbCBzY2FsaW5nIGZhY3RvcgorLy8gICAgI2RlZmluZSAgICAgSE9SX1NDQUxJTkdfRkFDVE9SX0JJVCAgICAgICAgICAgICAgICAgIDAgICAvL1RoZSBmb3JtdWxhPTQwOTYvKEhvcml6b250YWwgc2NhbGluZyBmYWNvdHIpCisvLyAgICAjZGVmaW5lICAgICBIT1JfU0NBTElOR19GQUNUT1JfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorLy8gICAgI2RlZmluZSAgICAgVkVSX1NDQUxJTkdfRkFDVE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAgIC8vQml0WzMxOjE2XSBWaWRlbyBWZXJ0aWNhbCBzY2FsaW5nIGZhY3RvcgorLy8gICAgI2RlZmluZSAgICAgVkVSX1NDQUxJTkdfRkFDVE9SX0JJVCAgICAgICAgICAgICAgICAgIDE2ICAgLy9UaGUgZm9ybXVsYT00MDk2LyhWZXJ0aWNhbCBzY2FsaW5nIGZhY290cikKKy8vICAgICNkZWZpbmUgICAgIFZFUl9TQ0FMSU5HX0ZBQ1RPUl9NQVNLICAgICAgICAgICAgICAgICAweEZGRkYwMDAwCisKKyNkZWZpbmUgICAgVklERU9NX1NDQUxFX0ZBQ1RPUl9QQVJBTUVURVIwX1JFRyAgICAgICAgICAgMHgyMTggKyBWSURFT0JBU0VfT0ZGU0VUICAvL1NjYWxpbmcgUGFyYW1ldGVycyBGMDAsIEYwMSwgRjAyLCBGMDMKKworI2RlZmluZSAgICBWSURFT01fU0NBTEVfRkFDVE9SX1BBUkFNRVRFUjFfUkVHICAgICAgICAgICAweDIxQyArIFZJREVPQkFTRV9PRkZTRVQgIC8vU2NhbGluZyBQYXJhbWV0ZXJzIEYxMCwgRjExLCBGMTIsIEYxMworCisjZGVmaW5lICAgIFZJREVPTV9TQ0FMRV9GQUNUT1JfUEFSQU1FVEVSMl9SRUcgICAgICAgICAgIDB4MjIwICsgVklERU9CQVNFX09GRlNFVCAgLy9TY2FsaW5nIFBhcmFtZXRlcnMgRjIwLCBGMjEsIEYyMiwgRjIzCisKKyNkZWZpbmUgICAgVklERU9NX1NDQUxFX0ZBQ1RPUl9QQVJBTUVURVIzX1JFRyAgICAgICAgICAgMHgyMjQgKyBWSURFT0JBU0VfT0ZGU0VUICAvL1NjYWxpbmcgUGFyYW1ldGVycyBGMzAsIEYzMSwgRjMyLCBGMzMKKworI2RlZmluZSAgICBWSURFT01fQkNEX0NPTlRST0xfUkVHICAgICAgICAgICAgICAgICAgICAgICAweDIyQyArIFZJREVPQkFTRV9PRkZTRVQKKyAgICAvLyNkZWZpbmUgICAgIEJDRF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFswXSBFbmFibGUgYmxvY2sgY2hhbmdlIGRldGVjdGlvbihCQ0QpCisgICAgLy8jZGVmaW5lICAgICBCQ0RfVE9MRVJBTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMjM6MTZdCisgICAgLy8gICAgI2RlZmluZSAgICAgQkNEX1RPTEVSQU5DRV9CSVQgICAgICAgICAgICAgICAgICAgMTYgLy9mbGFnIGFzIGNoYW5nZWQgYmxvY2sgd2hlbiB0aGUgdmlkZW8gZGF0YSBkaWZmZXJlbmNlIGdyZWF0ZXIKKyAgICAvLyAgICAjZGVmaW5lICAgICBCQ0RfVE9MRVJBTkNFX01BU0sgICAgICAgICAgICAgICAgICAweDAwRkYwMDAwCisKKyNkZWZpbmUgICAgIFZJREVPTV9DQVBUVVJFX1dJTkRPV1NfUkVHICAgICAgICAgICAgICAgICAgMHgyMzAgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgLy8jZGVmaW5lICAgICBSQzRfVEFCTEVfQUREUl9BTElHTiAgICAgICAgICAgICAgICAgICAgNyAgIC8vOCBieXRlIGFsaWdubWVudAorICAgIC8vI2RlZmluZSAgICAgUkM0X1RBQkxFX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MEZGRkZGRkYKKworI2RlZmluZSAgICAgVklERU9NX0NPTVBSRVNTX1dJTkRPV1NfUkVHICAgICAgICAgICAgICAgICAweDIzNCArIFZJREVPQkFTRV9PRkZTRVQKKyAgICAvLyNkZWZpbmUgICAgIENPTVBSRVNTX1ZFUl9MSU5FICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFsxMjowXSBWaWRlbyBjb21wcmVzc2lvbiB2ZXJ0aWNhbCBsaW5lIHRvdGFsCisgICAgLy8jZGVmaW5lICAgICBDT01QUkVTU19WRVJfTElORV9CSVQgICAgICAgICAgICAgICAgICAgMAorICAgIC8vI2RlZmluZSAgICAgQ09NUFJFU1NfVkVSX0xJTkVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDFGRkYKKyAgICAvLyNkZWZpbmUgICAgIENPTVBSRVNTX0hPUl9QSVhFTCAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwICAvL0JpdFsxMjowXSBWaWRlbyBjb21wcmVzc2lvbiB2ZXJ0aWNhbCBsaW5lIHRvdGFsCisgICAgLy8jZGVmaW5lICAgICBDT01QUkVTU19IT1JfUElYRUxfQklUICAgICAgICAgICAgICAgICAgMTYKKyAgICAvLyNkZWZpbmUgICAgIENPTVBSRVNTX0hPUl9QSVhFTF9NQVNLICAgICAgICAgICAgICAgICAweDFGRkYwMDAwCisKKyNkZWZpbmUgICAgIFZJREVPTV9DT01QUkVTU19CVUZfUFJPQ0VTU19PRkZTRVRfUkVHICAgICAgMHgyMzgKKyAgICAvLyNkZWZpbmUgICAgIENPTVBSRVNTX0JVRl9QUk9DRVNTX09GRlNFVF9BTElHTiAgICAgICAxMjcgLy8xMjggYnl0ZSBhbGlnbm1lbnQKKyAgICAvLyNkZWZpbmUgICAgIENPTVBSRVNTX0JVRl9QUk9DRVNTX09GRlNFVF9NQVNLICAgICAgICAweDNGRkZGRgorCisKKy8vRm9yIENvbXByZXNzaW9uCisjZGVmaW5lICAgICBWSURFT01fQ09NUFJFU1NfQlVGX1JFQURfT0ZGU0VUX1JFRyAgICAgICAgIDB4MjNDICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9Gb3Igc3RyZWFtIG1vZGUKKyAgICAvLyNkZWZpbmUgICAgIENPTVBSRVNTX0JVRl9SRUFEX09GRlNFVF9BTElHTiAgICAgICAgICAxMjcgLy8xMjggYnl0ZSBhbGlnbm1lbnQKKyAgICAvLyNkZWZpbmUgICAgIENPTVBSRVNTX0JVRl9SRUFEX09GRlNFVF9NQVNLICAgICAgICAgICAweDAwM0ZGRkZGCisvL0ZvciBEZWNvbXByZXNzaW9uCisjZGVmaW5lICAgICBWSURFT01fREVDT01QUkVTU19CVUZfV1JJVEVfT0ZGU0VUX1JFRyAgICAgIDB4MjNDICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9Gb3Igc3RyZWFtIG1vZGUgCisgICAgLy8jZGVmaW5lICAgICBERUNPTVBSRVNTX0JVRl9XUklURV9PRkZTRVRfQUxJR04gICAgICAgMTI3IC8vMTI4IGJ5dGUgYWxpZ25tZW50CisgICAgLy8jZGVmaW5lICAgICBERUNPTVBSRVNTX0JVRl9XUklURV9PRkZTRVRfTUFTSyAgICAgICAgMHgwMDNGRkZGRgorICAgIAorI2RlZmluZSAgICAgVklERU9NX0JVRl8xX0FERFJfUkVHICAgICAgICAgICAgICAgICAgICAgICAweDI0NCArIFZJREVPQkFTRV9PRkZTRVQgICAgIC8vRm9yIFNvdXJjZSBCdWZmZXIgaW4gZnJhbWUgbW9kZQorICAgIC8vI2RlZmluZSAgICAgQlVGXzFfQUREUl9BTElHTiAgICAgICAgICAgICAgICAgICAgICAgIDI1NSAvLzI1NiBieXRlIGFsaWdubWVudAorICAgIC8vI2RlZmluZSAgICAgQlVGXzFfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEZGRkZGRkYKKworI2RlZmluZSAgICAgVklERU9NX0JVRl9MSU5FX09GRlNFVF9SRUcgICAgICAgICAgICAgICAgICAweDI0OCArIFZJREVPQkFTRV9PRkZTRVQgICAgIC8vTXVzdCBzZXQgYm90aCBpbiBGcmFtZS9TdHJlYW0gbW9kZQorICAgIC8vI2RlZmluZSAgICAgQlVGX0xJTkVfT0ZGU0VUX0FMSUdOICAgICAgICAgICAgICAgICAgIDcgLy84IGJ5dGUgYWxpZ25tZW50CisgICAgLy8jZGVmaW5lICAgICBCVUZfTElORV9PRkZTRVRfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwM0ZGRgorCisjZGVmaW5lICAgICBWSURFT01fQlVGXzJfQUREUl9SRUcgICAgICAgICAgICAgICAgICAgICAgIDB4MjRDICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9Gb3IgQkNEIEJ1ZmZlciBpbiBmcmFtZSBtb2RlCisgICAgLy8jZGVmaW5lICAgICBCVUZfMl9BRERSX0FMSUdOICAgICAgICAgICAgICAgICAgICAgICAgMjU1IC8vMjU2IGJ5dGUgYWxpZ25tZW50CisgICAgLy8jZGVmaW5lICAgICBCVUZfMl9BRERSX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRkZGRkZGRgorCisjZGVmaW5lICAgICBWSURFT01fRkxBR19CVUZfQUREUl9SRUcgICAgICAgICAgICAgICAgICAgIDB4MjUwICsgVklERU9CQVNFX09GRlNFVCAgICAgLy9Gb3IgYmxvY2sgY2hhbmdlIGZsYWcgYnVmZmVyCisgICAgLy8jZGVmaW5lICAgICBGTEFHX0JVRl9BRERSX0FMSUdOICAgICAgICAgICAgICAgICAgICAgNyAvLzggYnl0ZSBhbGlnbm1lbnQKKyAgICAvLyNkZWZpbmUgICAgIEZMQUdfQlVGX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDBGRkZGRkZGCisKKyNkZWZpbmUgICAgIFZJREVPTV9DT01QUkVTU19CVUZfQUREUl9SRUcgICAgICAgICAgICAgICAgMHgyNTQgKyBWSURFT0JBU0VfT0ZGU0VUICAgICAvL0ZvciBzdHJlYW0gbW9kZQorICAgIC8vI2RlZmluZSAgICAgRkxBR19CVUZfQUREUl9BTElHTiAgICAgICAgICAgICAgICAgICAgIDcgLy84IGJ5dGUgYWxpZ25tZW50CisgICAgLy8jZGVmaW5lICAgICBGTEFHX0JVRl9BRERSX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwRkZGRkZGRgorICAgIAorI2RlZmluZSAgICAgVklERU9NX0JVRl9DT0RFQ19PRkZTRVRfUkVBRCAgICAgICAgICAgICAgICAweDI1QyArIFZJREVPQkFTRV9PRkZTRVQgICAgIC8vRm9yIHN0cmVhbSBtb2RlLCAgICAgICAgIAorICAgIC8vI2RlZmluZSAgICAgQlVGX0NPREVDX09GRlNFVF9BTElHTiAgICAgICAgICAgICAgICAgIDI1NSAvLzI1NiBieXRlIGFsaWdubWVudAorICAgIC8vI2RlZmluZSAgICAgQlVGX0NPREVDX09GRlNFVF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAzRkZGRkYKKyAgICAKKyNkZWZpbmUgICAgIFZJREVPTV9DT01QUkVTU19DT05UUk9MX1JFRyAgICAgICAgICAgICAgICAgMHgyNjAgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgLy8jZGVmaW5lICAgICBKUEVHX09OTFlfRU5DT0RFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgLy9CaXRbMF0gSlBFRyBvbmx5IGVuY29kaW5nCisgICAgLy8gICAgI2RlZmluZSAgICAgSlBFR19NSVhfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgMCAgIC8vRW5hYmxlIEpQRUcvVlEgbWl4IG1vZGUgZW5jb2RpbmcKKyAgICAvLyAgICAjZGVmaW5lICAgICBKUEVHX09OTFlfTU9ERSAgICAgICAgICAgICAgICAgICAgICAxICAgLy9KUEVHIGVuY29kaW5nIG1vZGUgb25seQorICAgIC8vI2RlZmluZSAgICAgVlFfNF9DT0xPUl9FTkNPREUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIgIC8vQml0WzFdIEVuYWJsZSA0IGNvbG9yIFZRIGVuY29kaW5nCisgICAgLy8gICAgI2RlZmluZSAgICAgVlFfMV8yX0NPTE9SX01PREUgICAgICAgICAgICAgICAgICAgMCAgIC8vMSBhbmQgMiBjb2xvciBtb2RlIFZRIGVuY29kaW5nCisgICAgLy8gICAgI2RlZmluZSAgICAgVlFfNF9DT0xPUl9NT0RFICAgICAgICAgICAgICAgICAgICAgMSAgIC8vMSwgMiBhbmQgNCBjb2xvciBWUSBlbmNvZGluZworICAgIC8vI2RlZmluZSAgICAgUVVBTElUWV9DT0RFQ19TRVRUSU5HICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQgIC8vQml0WzJdIEhpZ2ggYW5kIGJlc3QgdmlkZW8gcXVhbGl0eSBjb2RlYyBtb2RlIHNldHRpbmcKKyAgICAvLyAgICAjZGVmaW5lICAgICBKUEVHX0NPREVDX01PREUgICAgICAgICAgICAgICAgICAgICAwICAgLy9ub3Qgc3VwcG9ydGVkIGluIGJlc3QgdmlkZW8gcXVhbGl0eSBtb2RlCisgICAgLy8gICAgI2RlZmluZSAgICAgUVVBTlRJX0NPREVDX01PREUgICAgICAgICAgICAgICAgICAgMQorICAgIC8vI2RlZmluZSAgICAgSlBFR19EVUFMX1FVQUxJVFlfRU4gICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDggIC8vQml0WzNdIEpQRUcgZHVhbCBxdWFsaXR5IG1vZGUKKyAgICAvLyAgICAjZGVmaW5lICAgICBFTl9KUEVHX0RVQUxfUVVBTElUWSAgICAgICAgICAgICAgICAxICAgLy9lbmFibGUob25seSBmb3Igbm9ybWFsIHZpZGVvIHF1YWxpdHkgbW9kZSkKKyAgICAvLyNkZWZpbmUgICAgIEJFU1RfUVVBTElUWV9FTiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwICAvL0JpdFs0XSBCZXN0IHF1YWxpdHkgdmlkZW8gbW9kZSBlbmFibGUKKyAgICAvLyAgICAjZGVmaW5lICAgICBFTl9CRVNUX1FVQUxJVFkgICAgICAgICAgICAgICAgICAgICAxICAgLy9lbmFibGUob25seSBmb3IgcXVhbnRpemF0aW9uIGNvZGVjIG1vZGUpCisgICAgLy8jZGVmaW5lICAgICBSQzRfQ1JZUFRfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMCAgLy9CaXRbNV0gRW5hYmxlIFJDNCBlbmNyeXB0aW9uL2RlY3J5cHRpb24KKyAgICAvLyAgICAjZGVmaW5lICAgICBFTl9SQzRfQ1JZUFQgICAgICAgICAgICAgICAgICAgICAgICAxICAgLy9lbmFibGUKKyAgICAvLyNkZWZpbmUgICAgIE5PUk1BTF9RVUFOVElfQ0hST01JX1RBQkxFICAgICAgICAgICAgICAweDAwMDAwMDQwICAvL0JpdFsxMDo2XSBOb3JtYWwgdmlkZW8gcXVhbGl0eSBtb2RlIEpQRUcgRENUIGNocm9taSBxdWFudGluYXRpb24gdGFibGUKKyAgICAvLyAgICAjZGVmaW5lICAgICBOT1JNQUxfUVVBTlRJX0NIUk9NSV9UQUJMRV9CSVQgICAgICA2CisgICAgLy8gICAgI2RlZmluZSAgICAgTk9STUFMX1FVQU5USV9DSFJPTUlfVEFCTEVfTUFTSyAgICAgMHgwMDAwMDdDMAorICAgIC8vI2RlZmluZSAgICAgTk9STUFMX1FVQU5USV9MVU1JX1RBQkxFICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAgIC8vQml0WzE1OjExXSBOb3JtYWwgdmlkZW8gcXVhbGl0eSBtb2RlIEpQRUcgRENUIGx1bWkgcXVhbnRpbmF0aW9uIHRhYmxlCisgICAgLy8gICAgI2RlZmluZSAgICAgTk9STUFMX1FVQU5USV9MVU1JX1RBQkxFX0JJVCAgICAgICAgMTEKKyAgICAvLyAgICAjZGVmaW5lICAgICBOT1JNQUxfUVVBTlRJX0xVTUlfVEFCTEVfTUFTSyAgICAgICAweDAwMDBGODAwCisgICAgLy8jZGVmaW5lICAgICBISUdIX1FVQUxJVFlfRU4gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMTZdIEhpZ2ggdmlkZW8gcXVhbGl0eSBtb2RlIGVuYWJsZQorICAgIC8vICAgICNkZWZpbmUgICAgIEVOX0hJR0hfUVVBTElUWSAgICAgICAgICAgICAgICAgICAgIDEgICAvL0VuYWJsZQorICAgIC8vI2RlZmluZSAgICAgVVZfQ0lSNjU2X0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAgIC8vQml0WzE5XSBVViBmcm9tYXQKKyAgICAvLyAgICAjZGVmaW5lICAgICBVU0VfVVZfQ0lSNjU2ICAgICAgICAgICAgICAgICAgICAgICAxICAgLy9yZWNvbW1hbmQKKyAgICAvLyNkZWZpbmUgICAgIEhVRkZNQU5fVEFCTEVfU0VMRUNUICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwICAvL0JpdFsyMF0gSlBFRyBIdWZmbWFuIHRhYmxlIGNvbWJpbmF0aW9uCisgICAgLy8gICAgI2RlZmluZSAgICAgRFVBTF9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgIC8vRHVhbCBZLCBVViB0YWJsZQorICAgIC8vICAgICNkZWZpbmUgICAgIFNJTkdMRV9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIDEgICAvL1NpbmdsZSBZIHRhYmxlCisgICAgLy8gICAgI2RlZmluZSAgICAgU0lOR0xFX1VWX1RBQkxFICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMCAgLy8xeDogU2luZ2xlIFVWIHRhYmxlCisgICAgLy8jZGVmaW5lICAgICBISUdIX1FVQU5USV9DSFJPTUlfVEFCTEUgICAgICAgICAgICAgICAgMHgwMDQwMDAwMCAgLy9CaXRbMjY6MjJdIEhpZ2ggcXVhbGl0eSBKUEVHIERDVCBjaHJvbWkgcXVhbnRpemF0aW9uIHRhYmxlCisgICAgLy8gICAgI2RlZmluZSAgICAgSElHSF9RVUFOVElfQ0hST01JX1RBQkxFX0JJVCAgICAgICAgMjIKKyAgICAvLyAgICAjZGVmaW5lICAgICBISUdIX1FVQU5USV9DSFJPTUlfVEFCTEVfTUFTSyAgICAgICAweDA3QzAwMDAwICAgICAgICAgICAgICAgIAorICAgIC8vI2RlZmluZSAgICAgSElHSF9ERVFVQU5USV9WQUxVRSAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDAgIC8vQml0WzI2OjIyXSBIaWdoIHF1YWxpdHkgZGUtcXVhbnRpemF0aW9uIHZhbHVlCisgICAgLy8gICAgI2RlZmluZSAgICAgSElHSF9ERVFVQU5USV9WQUxVRV9CSVQgICAgICAgICAgICAgMjIKKyAgICAvLyAgICAjZGVmaW5lICAgICBISUdIX0RFUVVBTlRJX1ZBTFVFX01BU0sgICAgICAgICAgICAweDA3QzAwMDAwICAgICAgICAKKyAgICAvLyNkZWZpbmUgICAgIEhJR0hfUVVBTlRJX0xVTUlfVEFCTEUgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwICAvL0JpdFszMToyN10gSGlnaCBxdWFsaXR5IEpQRUcgRENUIGx1bWkgcXVhbnRpemF0aW9uIHRhYmxlCisgICAgLy8gICAgI2RlZmluZSAgICAgSElHSF9RVUFOVElfTFVNSV9UQUJMRV9CSVQgICAgICAgICAgMjcKKyAgICAvLyAgICAjZGVmaW5lICAgICBISUdIX1FVQU5USV9MVU1JX1RBQkxFX01BU0sgICAgICAgICAweEY4MDAwMDAwCisgICAgLy8jZGVmaW5lICAgICBCRVNUX0RFUVVBTlRJX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMCAgLy9CaXRbMzE6MjddIEJlc3QgcXVhbGl0eSBkZS1xdWFudGl6YXRpb24gdmFsdWUKKyAgICAvLyAgICAjZGVmaW5lICAgICBCRVNUX1FVQU5USV9WQUxVRV9CSVQgICAgICAgICAgICAgICAyNworICAgIC8vICAgICNkZWZpbmUgICAgIEJFU1RfUVVBTlRJX1ZBTFVFX01BU0sgICAgICAgICAgICAgIDB4RjgwMDAwMDAKKyAgICAKKyNkZWZpbmUgICAgIFZJREVPTV9RVUFOVElfVEFCTEVfTE9XX1JFRyAgICAgICAgICAgICAgICAgMHgyNjQgKyBWSURFT0JBU0VfT0ZGU0VUICAgICAvL01hdGNoIHdpdGggMHg2MCBCaXRbMTA6Nl0sIEJpdFsxNToxMV0KKy8vICAgICNkZWZpbmUgICAgIFFVQU5USV9DSFJPTUlfVEFCTEVfTE9XICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFs0OjBdIE5vcm1hbCB2aWRlbyBsb3cgcXVhbGl0eSBibG9jayBjaHJvbWkgcXVhbnRpemF0aW9uIHRhYmxlCisvLyAgICAgICAgI2RlZmluZSAgICAgUVVBTlRJX0NIUk9NSV9UQUJMRV9MT1dfQklUICAgICAgICAgMAorLy8gICAgICAgICNkZWZpbmUgICAgIFFVQU5USV9DSFJPTUlfVEFCTEVfTE9XX01BU0sgICAgICAgIDB4MDAwMDAwMUYKKy8vICAgICNkZWZpbmUgICAgIFFVQU5USV9MVU1JX1RBQkxFX0xPVyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwICAvL0JpdFs5OjVdIE5vcm1hbCB2aWRlbyBsb3cgcXVhbGl0eSBibG9jayBsdW1pIHF1YW50aXphdGlvbiB0YWJsZQorLy8gICAgICAgICNkZWZpbmUgICAgIFFVQU5USV9DSFJPTUlfVEFCTEVfTE9XX0JJVCAgICAgICAgIDUKKy8vICAgICAgICAjZGVmaW5lICAgICBRVUFOVElfQ0hST01JX1RBQkxFX0xPV19NQVNLICAgICAgICAweDAwMDAwM0UwCisKKyNkZWZpbmUgICAgIFZJREVPTV9RVUFOVElfVkFMVUVfUkVHICAgICAgICAgICAgICAgICAgICAgMHgyNjggKyBWSURFT0JBU0VfT0ZGU0VUICAgICAvL01hdGNoIHdpdGggMHg2MCBCaXRbMjY6MjJdLEJpdFszMToyN10KKy8vICAgICNkZWZpbmUgICAgIEhJR0hfUVVBTlRJX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFsxNDowXSBIaWdoIHF1YWxpdHkgcXVhbnRpemF0aW9uIHZhbHVlLiBGb3JtYXQgaXMgMS4xNAorLy8gICAgICAgICNkZWZpbmUgICAgIEhJR0hfUVVBTlRJX1ZBTFVFX0JJVCAgICAgICAgICAgICAgIDAKKy8vICAgICAgICAjZGVmaW5lICAgICBISUdIX1FVQU5USV9WQUxVRV9NQVNLICAgICAgICAgICAgICAweDAwMDA3RkZGCisvLyAgICAjZGVmaW5lICAgICBCRVNUX1FVQU5USV9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMzA6MTZdIEJlc3QgcXVhbGl0eSBxdWFudGl6YXRpb24gdmFsdWUuIEZvcm1hdCBpcyAxLjE0CisvLyAgICAgICAgI2RlZmluZSAgICAgQkVTVF9RVUFOVElfVkFMVUVfQklUICAgICAgICAgICAgICAgMTYKKy8vICAgICAgICAjZGVmaW5lICAgICBCRVNUX1FVQU5USV9WQUxVRV9NQVNLICAgICAgICAgICAgICAweDdGRkYwMDAwCisgICAgCisjZGVmaW5lICAgICBWSURFT01fQlNEX1BBUkFfUkVHICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjZDICsgVklERU9CQVNFX09GRlNFVCAgICAvL1ZpZGVvIEJTRCBQYXJhbWV0ZXJzIFJlZ2lzdGVyICAgIAorLy8gICAgI2RlZmluZSAgICAgQlNEX0hJR0hfVEhSRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgIC8vQml0Wzc6MF0gQmxvY2sgc2hhcnBuZXNzIGRldGVjdGlvbiBoaWdoIHRocmVzaG9sZAorLy8gICAgI2RlZmluZSAgICAgQlNEX0hJR0hfVEhSRVNfQklUICAgICAgICAgICAgICAgICAgICAgIDAKKy8vICAgICNkZWZpbmUgICAgIEJTRF9ISUdIX1RIUkVTX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEZGCisvLyAgICAjZGVmaW5lICAgICBCU0RfTE9XX1RIUkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMCAgLy9CaXRbMTU6OF0gQmxvY2sgc2hhcHJwbmVzcyBkZXRlY3Rpb24gbG93IHRocmVzaG9sZAorLy8gICAgI2RlZmluZSAgICAgQlNEX0xPV19USFJFU19CSVQgICAgICAgICAgICAgICAgICAgICAgIDgKKy8vICAgICNkZWZpbmUgICAgIEJTRF9MT1dfVEhSRVNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRjAwCisvLyAgICAjZGVmaW5lICAgICBCU0RfSElHSF9DT1VOVFMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMjE6MTZdIEJsb2NrIHNoYXJwbmVzcyBkZXRlY3Rpb24gaGlnaCBjb3VudHMgdGhyZXNob2xkCisvLyAgICAjZGVmaW5lICAgICBCU0RfSElHSF9DT1VOVFNfQklUICAgICAgICAgICAgICAgICAgICAgMTYKKy8vICAgICNkZWZpbmUgICAgIEJTRF9ISUdIX0NPVU5UU19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwM0YwMDAwCisvLyAgICAjZGVmaW5lICAgICBCU0RfTE9XX0NPVU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMCAgLy9CaXRbMjc6MjRdIEJsb2NrIHNoYXJwbmVzcyBkZXRlY3Rpb24gbG93IGNvdW50cyB0aHJlc2hvbGQKKy8vICAgICNkZWZpbmUgICAgIEJTRF9MT1dfQ09VTlRTX0JJVCAgICAgICAgICAgICAgICAgICAgICAyNAorLy8gICAgI2RlZmluZSAgICAgQlNEX0xPV19DT1VOVFNfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4M0YwMDAwMDAKKworI2RlZmluZSBWSURFT01fQ09NUFJFU1NfRlJBTUVfU0laRV9SRUcJCQkJCSAgMHgyNzAgKyBWSURFT0JBU0VfT0ZGU0VUCisvLyAgICAjZGVmaW5lICAgICBDT01QUkVTU19GUkFNRV9TSVpFX1JFQUQgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgLy9CaXRbMTk6MF0gVmlkZW8gY29tcHJlc3Npb24gZnJhbWUgc2l6ZSByZWFkIGJhY2sobnVtYmVyIG9mIERXKQorLy8gICAgI2RlZmluZSAgICAgQ09NUFJFU1NfRlJBTUVfU0laRV9SRUFEX0JJVCAgICAgICAgICAgIDAKKy8vICAgICNkZWZpbmUgICAgIENPTVBSRVNTX0ZSQU1FX1NJWkVfUkVBRF9NQVNLICAgICAgICAgICAweDAwMEZGRkZGCisKKyNkZWZpbmUgICAgIFZJREVPTV9DT01QUkVTU19CTE9DS19DT1VOVF9SRUcJCQkJICAweDI3NCArIFZJREVPQkFTRV9PRkZTRVQKKy8vICAgICNkZWZpbmUgICAgIENPTVBSRVNTX0JMT0NLX0NPVU5UX1JFQUQgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFsxNTowXSBWaWRlbyBjb21wcmVzcyBibG9jayBjb3VudGVyIHJlYWQgYmFjayhudW1iZXIgb2YgYmxvY2tzKQorLy8gICAgI2RlZmluZSAgICAgQ09NUFJFU1NfQkxPQ0tfQ09VTlRfUkVBRF9CSVQgICAgICAgICAgIDAKKy8vICAgICNkZWZpbmUgICAgIENPTVBSRVNTX0JMT0NLX0NPVU5UX1JFQURfTUFTSyAgICAgICAgICAweDAwMDBGRkZGCisKKyNkZWZpbmUgICAgIFZJREVPTV9DT01QUkVTU19GUkFNRV9FTkRfUkVBRCAgICAgICAgICAgICAgMHgyNzggKyBWSURFT0JBU0VfT0ZGU0VUICAgICAvL1ZpZGVvIGNvbXByZXNzaW9uIHN0cmVhbSBmcmFtZSBlbmQgcG9pbnRlciAgICAKKyAgICAvLyNkZWZpbmUgICAgIENPTVBSRVNTX0ZSQU1FX0VORF9SRUFEX0FMSUdOICAgICAgICAgICA3CisgICAgLy8jZGVmaW5lICAgICBDT01QUkVTU19GUkFNRV9FTkRfUkVBRF9NQVNLICAgICAgICAgICAgMHgwMDNGRkZGRgorICAgIAorI2RlZmluZSAgICAgVklERU9NX1VTRVJfREVGSU5FX0hFQURFUl9SRUcJCQkgICAgICAweDI4MCArIFZJREVPQkFTRV9PRkZTRVQKKy8vICAgICNkZWZpbmUgICAgIFVTRVJfREVGSU5FX0hFQURFUiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFsxNTowXSBWaWRlbyB1c2VyIGRlZmluZWQgaGVhZGVyIHBhcmFtZXRlcgorLy8gICAgI2RlZmluZSAgICAgVVNFUl9ERUZJTkVfSEVBREVSX0JJVCAgICAgICAgICAgICAgICAgIDAKKy8vICAgICNkZWZpbmUgICAgIFVTRVJfREVGSU5FX0hFQURFUl9NQVNLICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisKKy8qKioqKiogIFZSMzAwLVZSM0ZDOiBHZW5lcmFsIENvbnRyb2wgcmVnaXN0ZXJzICAqKioqKi8KKyNkZWZpbmUgICAgIFZJREVPX0NPTlRST0xfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgQ09ERUNfREVDT01QUkVTU19NT0RFICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgIC8vQml0WzBdIENvZGVjIGluIGRlLWNvbXByZXNzaW9uIG1vZGUKKyAgICAgICAgI2RlZmluZSAgICAgQ09ERUNfREVDT01QUkVTU19NT0RFX0JJVCAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBDT0RFQ19ERUNPTVBSRVNTX01PREVfTUFTSyAgICAgICAgICAweDAwMDAwMDAxIAorICAgICAgICAjZGVmaW5lICAgICBDT01QUkVTU19NT0RFICAgICAgICAgICAgICAgICAgICAgICAwCisgICAgICAgICNkZWZpbmUgICAgIERFQ09NUFJFU1NfTU9ERSAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAjZGVmaW5lICAgICBWSURFT19TQUZFX01PREUJCQkJCQkJMHgwMDAwMDAwMiAgLy9CaXRbMV0gVklERU8gU0FGRSBNT0RFCisJCSNkZWZpbmUgICAgIFZJREVPX1NBRkVfTU9ERV9CSVQJCQkJCTEKKwkJI2RlZmluZSAgICAgVklERU9fU0FGRV9NT0RFX09GRgkJICAgICAgICAgICAgMAorICAgICAgICAjZGVmaW5lICAgICBWSURFT19TQUZFX01PREVfT04JCSAgICAgICAgICAgIDEKKyAgICAjZGVmaW5lICAgICBERUxBWV9WU1lOQwkJCQkJCQkJMHgwMDAwMDAwNCAgLy9CaXRbMl0gRGVsYXkgSW50ZXJuYWwgVlNZTkMKKyAgICAgICAgI2RlZmluZSAgICAgREVMQVlfVlNZTkNfQklUICAgICAgICAgICAgICAgICAgICAgMgorICAgICAgICAjZGVmaW5lICAgICBERUxBWV9WU1lOQ19NQVNLICAgICAgICAgICAgICAgICAgICAoMTw8MikKKwkJI2RlZmluZQkJREVMQVlfVlNZTkNfT0ZGCQkJCQkJKDA8PDIpCisJCSNkZWZpbmUJCURFTEFZX1ZTWU5DX0VOCQkJCQkJKDE8PDIpCisgICAgI2RlZmluZSAgICAgVkVSX0RPV05TQ0FMSU5HX0xJTkVfQlVGRkVSX0VOICAgICAgICAgIDB4MDAwMDAwMTAgIC8vQml0WzU6NF0gVmlkZW8gdmVydGljYWwgZG93bnNjYWxpbmcgbGluZSBidWZmZXIgZW5hYmxlCisJCSNkZWZpbmUJCVZFUl9MSU5FX0JVRkZFUl9NQVNLCQkJCSgzPDw0KQorICAgICAgICAjZGVmaW5lICAgICBMSU5FX0JVRkZFUl9PRkYgICAgICAgICAgICAgICAgICAgICAoMDw8NCkKKyAgICAgICAgI2RlZmluZSAgICAgTElORV9CVUZGRVJfVklERU8xICAgICAgICAgICAgICAgICAgMQorICAgICAgICAjZGVmaW5lICAgICBMSU5FX0JVRkZFUl9WSURFTzIgICAgICAgICAgICAgICAgICAyCisgICAgICAgICNkZWZpbmUgICAgIExJTkVfQlVGRkVSX1ZJREVPTSAgICAgICAgICAgICAgICAgIDMKKyAgICAjZGVmaW5lICAgICBSQzRfS0VZX0JVRkZFUl9TRUxFQ1RJT04JCQkJKDFVTDw8NikgIC8vQml0Wzc6Nl0gUkM0IEtleSBCdWZmZXIgU2VsZWN0aW9uCisJCSNkZWZpbmUJCVJDNF9LRVlfQlVGRkVSX1NFTEVDVElPTl9CSVQJCTYKKwkJI2RlZmluZQkJUkM0X0tFWV9CVUZGRVJfU0VMRUNUSU9OX01BU0sJCSgzVUw8PDYpCisgICAgICAgICNkZWZpbmUgICAgIFJDNF9LRVlfQlVGRkVSX1ZJREVPMSAgICAgICAgICAgICAgIDAKKyAgICAgICAgI2RlZmluZSAgICAgUkM0X0tFWV9CVUZGRVJfVklERU8yICAgICAgICAgICAgICAgMQorICAgICAgICAjZGVmaW5lICAgICBSQzRfS0VZX0JVRkZFUl9WSURFT00gICAgICAgICAgICAgICAyCisgICAgI2RlZmluZSAgICAgUkM0X0lOSVRfUkVTRVQJCQkJCQkJKDFVTDw8OCkgIC8vQml0WzhdIFJDNCBpbml0aWFsIHJlc2V0CisJCSNkZWZpbmUgICAgIFJDNF9JTklUX1JFU0VUX0JJVAkJCQkJOAorCQkjZGVmaW5lICAgICBSQzRfSU5JVF9SRVNFVF9NQVNLCQkJCQkoMVVMPDw4KQorCQkjZGVmaW5lICAgICBSQzRfTk9STUFMX01PREUJCQkJCQkwCisJCSNkZWZpbmUgICAgIFJDNF9SRVNFVF9DT1VOVEVSCQkJCQkxCisgICAgI2RlZmluZSAgICAgUkM0X1RFU1RfTU9ERQkJCQkJCQkoMVVMPDw5KSAgLy9CaXRbOV0gUkM0IHRlc3QgbW9kZQorCQkjZGVmaW5lICAgICBSQzRfVEVTVF9NT0RFX0JJVAkJCQkJOQorCQkjZGVmaW5lICAgICBSQzRfVEVTVF9PRkYJCQkJCQkwCisJCSNkZWZpbmUgICAgIFJDNF9URVNUX09OCQkJCQkJCTEKKyAgICAjZGVmaW5lICAgICBSQzRfU0FWRV9NT0RFCQkJCQkJCSgxVUw8PDE0KSAgLy9CaXRbMTRdIFJDNCBzYXZlIG1vZGUKKwkJI2RlZmluZSAgICAgUkM0X1NBVkVfTU9ERV9CSVQJCQkJCTE0CisJCSNkZWZpbmUgICAgIFJDNF9TQVZFX01PREVfTUFTSwkJCQkJKDFVTDw8MTQpCisJCSNkZWZpbmUgICAgIFJDNF9TQVZFX01PREVfT0ZGCQkJCQkwCisJCSNkZWZpbmUgICAgIFJDNF9TQVZFX01PREVfT04JCQkJCTEKKyAgICAjZGVmaW5lICAgICBSQzRfTk9fUkVTRVRfRlJBTUUJCQkJCQkoMVVMPDwxNSkgIC8vQml0WzE1XSBSQzQgbm8gcmVzZXQgd2hlbiBmcmFtZSBjb21wbGV0ZWQKKwkJI2RlZmluZSAgICAgUkM0X05PX1JFU0VUX0ZSQU1FX0JJVAkJCQkxNQorCQkjZGVmaW5lICAgICBSQzRfTk9fUkVTRVRfRlJBTUVfTUFTSwkJCQkoMVVMPDwxNSkKKwkJI2RlZmluZSAgICAgUkM0X05PX1JFU0VUX0ZSQU1FX09GRgkJCQkwCQkvL0Fsd2F5cyByZXNldAorCQkjZGVmaW5lICAgICBSQzRfTk9fUkVTRVRfRlJBTUVfT04JCQkJMQorCisjZGVmaW5lIFZJREVPX0lOVF9DT05UUk9MX0VOX1JFRyAgICAgICAgICAgICAgICAgICAgICAgIDB4MzA0ICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIFZJREVPMV9XQVRDSF9ET0dfSU5UX0VOICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFswXSBFbmFibGUgVmlkZW8xIG1vZGUgZGV0ZWN0aW9uIHdhdGNoIGRvZyBvdXQgb2YgbG9jayBpbnRlcnJ1cHQKKyAgICAjZGVmaW5lICAgICBWSURFTzFfSU5QVVRfQ09NUExFVEVfSU5UX0VOICAgICAgICAgICAgMHgwMDAwMDAwMiAgLy9CaXRbMV0gRW5hYmxlIFZpZGVvMSB2aWRlbyBpbnB1dCBjb21wbGV0ZSBpbnRlcnJ1cHQgIChmcmFtZSBjb21wbGV0ZSBvbmx5IGZvciBmcmFtZSBtb2RlKQorICAgICNkZWZpbmUgICAgIFZJREVPMV9QQUNLRVRfUkVBRFlfSU5UX0VOICAgICAgICAgICAgICAweDAwMDAwMDA0ICAvL0JpdFsyXSBFbmFibGUgVmlkZW8xIHBhY2tldCByZWFkeSBpbnRlcnJ1cHQKKyAgICAjZGVmaW5lICAgICBWSURFTzFfQ09NUFJFU1NfQ09NUExFVEVfSU5UX0VOICAgICAgICAgMHgwMDAwMDAwOCAgLy9CaXRbM10gRW5hYmxlIFZpZGVvMSBjb21wcmVzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAgICAjZGVmaW5lICAgICBWSURFTzFfTU9ERV9ERVRFQ1RJT05fUkVBRFlfSU5UX0VOICAgICAgMHgwMDAwMDAxMCAgLy9CaXRbNF0gRW5hYmxlIHZpZGVvMSBtb2RlIGRldGVjdGlvbiByZWFkeSBpbnRlcnJ1cHQKKyAgICAjZGVmaW5lICAgICBWSURFTzFfRlJBTUVfQ09NUExFVEVfSU5UX0VOICAgICAgICAgICAgMHgwMDAwMDAyMCAgLy9CaXRbNV0gRW5hYmxlIFZpZGVvMSBmcmFtZSBjb21wbGV0ZSBpbnRlcnJ1cHQgICAgIChvbmx5IGZvciBzdHJlYW0gbW9kZSkKKyAgICAjZGVmaW5lICAgICBWSURFTzFfU1RSRUFNX0VSUl9JTlRfRU4gICAgICAgICAgICAgICAgMHgwMDAwMDA0MCAgLy9CaXRbNl0gRW5hYmxlIFZpZGVvMSBkZWNvZGUgc3RyZWFtIGVycm9yIGludGVycnVwdAorICAgICNkZWZpbmUgICAgIFZJREVPMl9XQVRDSF9ET0dfSU5UX0VOICAgICAgICAgICAgICAgICAweDAwMDAwMTAwICAvL0JpdFs4XSBFbmFibGUgVmlkZW8yIG1vZGUgZGV0ZWN0aW9uIHdhdGNoIGRvZyBvdXQgb2YgbG9jayBpbnRlcnJ1cHQKKyAgICAjZGVmaW5lICAgICBWSURFTzJfSU5QVVRfQ09NUExFVEVfSU5UX0VOICAgICAgICAgICAgMHgwMDAwMDIwMCAgLy9CaXRbOV0gRW5hYmxlIFZpZGVvMiB2aWRlbyBpbnB1dCBjb21wbGV0ZSBpbnRlcnJ1cHQgIChmcmFtZSBjb21wbGV0ZSBvbmx5IGZvciBmcmFtZSBtb2RlKQorICAgICNkZWZpbmUgICAgIFZJREVPMl9QQUNLRVRfUkVBRFlfSU5UX0VOICAgICAgICAgICAgICAweDAwMDAwNDAwICAvL0JpdFsxMF0gRW5hYmxlIFZpZGVvMiBwYWNrZXQgcmVhZHkgaW50ZXJydXB0CisgICAgI2RlZmluZSAgICAgVklERU8yX0NPTVBSRVNTX0NPTVBMRVRFX0lOVF9FTiAgICAgICAgIDB4MDAwMDA4MDAgIC8vQml0WzExXSBFbmFibGUgVmlkZW8yIGNvbXByZXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorICAgICNkZWZpbmUgICAgIFZJREVPMl9NT0RFX0RFVEVDVElPTl9SRUFEWV9JTlRfRU4gICAgICAweDAwMDAxMDAwICAvL0JpdFsxMl0gRW5hYmxlIHZpZGVvMiBtb2RlIGRldGVjdGlvbiByZWFkeSBpbnRlcnJ1cHQKKyAgICAjZGVmaW5lICAgICBWSURFTzJfRlJBTUVfQ09NUExFVEVfSU5UX0VOICAgICAgICAgICAgMHgwMDAwMjAwMCAgLy9CaXRbMTNdIEVuYWJsZSBWaWRlbzIgZnJhbWUgY29tcGxldGUgaW50ZXJydXB0ICAgIChvbmx5IGZvciBzdHJlYW0gbW9kZSkKKyAgICAjZGVmaW5lICAgICBWSURFTzJfU1RSRUFNX0VSUl9JTlRfRU4gICAgICAgICAgICAgICAgMHgwMDAwNDAwMCAgLy9CaXRbMTRdIEVuYWJsZSBWaWRlbzIgZGVjb2RlIHN0cmVhbSBlcnJvciBpbnRlcnJ1cHQKKyAgICAjZGVmaW5lICAgICBWSURFT01fSU5QVVRfQ09NUExFVEVfSU5UX0VOICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMTZdIEVuYWJsZSBWaWRlb00gdmlkZW8gaW5wdXQgY29tcGxldGUgaW50ZXJydXB0CisgICAgI2RlZmluZSAgICAgVklERU9NX0NPTVBSRVNTX0NPTVBMRVRFX0lOVF9FTiAgICAgICAgIDB4MDAwMjAwMDAgIC8vQml0WzE3XSBFbmFibGUgVmlkZW9NIGNvbXByZXNzaW9uIGNvbXBsZXRlIGludGVycnVwdAorCSNkZWZpbmUgICAgIFZJREVPTV9QQUNLRVRfUkVBRFlfSU5UX0VOCQkJCTB4MDAwNDAwMDAgIC8vQml0WzE4XSBFbmFibGUgVmlkZW9NIHBhY2tldCByZWFkeSBpbnRlcnJ1cHQKKwkjZGVmaW5lICAgICBWSURFT01fRlJBTUVfQ09NUExFVEVfSU5UX0VOICAgICAgICAgICAgMHgwMDA4MDAwMCAgLy9CaXRbMTldIEVuYWJsZSBWaWRlb00gZnJhbWUgY29tcGxldGUgaW50ZXJydXB0ICAgIChvbmx5IGZvciBzdHJlYW0gbW9kZSkKKyAgICAKKyNkZWZpbmUgVklERU9fSU5UX0NPTlRST0xfUkVBRF9SRUcgICAgICAgICAgICAgICAgICAgICAgMHgzMDggKyBWSURFT0JBU0VfT0ZGU0VUIC8vQ2xlYXIgd2hlbiB3cml0ZSAxCisgICAgI2RlZmluZSAgICAgVklERU8xX1dBVENIX0RPR19SRUFEICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgIC8vQml0WzBdIFZpZGVvMSBtb2RlIGRldGVjdGlvbiB3YXRjaCBkb2cgb3V0IG9mIGxvY2sgaW50ZXJydXB0IHN0YXR1cyByZWFkIGJhY2sKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8xX1dBVENIX0RPR19CSVQJCQkJMAorICAgICAgICAjZGVmaW5lICAgICBWSURFTzFfV0FUQ0hfRE9HX01BU0sJCQkJMHgwMDAwMDAwMQorICAgICNkZWZpbmUgICAgIFZJREVPMV9JTlBVVF9DT01QTEVURV9SRUFEICAgICAgICAgICAgICAweDAwMDAwMDAyICAvL0JpdFsxXSBWaWRlbzEgdmlkZW8gaW5wdXQgY29tcGxldGUgaW50ZXJydXB0IHN0YXR1cyByZWFkIGJhY2sgKGZyYW1lIGNvbXBsZXRlIG9ubHkgZm9yIGZyYW1lIG1vZGUpCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPMV9JTlBVVF9DT01QTEVURV9CSVQJCQkxCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPMV9JTlBVVF9DT01QTEVURV9NQVNLCQkJMHgwMDAwMDAwMgorICAgICNkZWZpbmUgICAgIFZJREVPMV9QQUNLRVRfUkVBRFlfUkVBRCAgICAgICAgICAgICAgICAweDAwMDAwMDA0ICAvL0JpdFsyXSBWaWRlbzEgcGFja2V0IHJlYWR5IGludGVycnVwdCBzdGF0dXMgcmVhZCBiYWNrCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPMV9QQUNLRVRfUkVBRFlfQklUCQkgICAgICAgIDIKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8xX1BBQ0tFVF9SRUFEWV9NQVNLCQkgICAgMHgwMDAwMDAwNAorICAgICNkZWZpbmUgICAgIFZJREVPMV9DT01QUkVTU19DT01QTEVURV9SRUFEICAgICAgICAgICAweDAwMDAwMDA4ICAvL0JpdFszXSBWaWRlbzEgY29tcHJlc3Npb24gY29tcGxldGUgaW50ZXJydXB0IHN0YXR1cyByZWFkIGJhY2sKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8xX0NPTVBSRVNTX0NPTVBMRVRFX0JJVAkJMworICAgICAgICAjZGVmaW5lICAgICBWSURFTzFfQ09NUFJFU1NfQ09NUExFVEVfTUFTSwkJMHgwMDAwMDAwOAorICAgICNkZWZpbmUgICAgIFZJREVPMV9NT0RFX0RFVEVDVElPTl9SRUFEWV9SRUFEICAgICAgICAweDAwMDAwMDEwICAvL0JpdFs0XSBWaWRlbzEgbW9kZSBkZXRlY3Rpb24gcmVhZHkgaW50ZXJydXB0IHN0YXR1cyByZWFkIGJhY2sKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8xX01PREVfREVURUNUSU9OX1JFQURZX0JJVCAgICAgNAorICAgICNkZWZpbmUgICAgIFZJREVPMV9GUkFNRV9DT01QTEVURV9SRUFEICAgICAgICAgICAgICAweDAwMDAwMDIwICAvL0JpdFs1XSBWaWRlbzEgZnJhbWUgY29tcGxldGUgaW50ZXJydXB0IHN0YXR1cyByZWFkIGJhY2sKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8xX0ZSQU1FX0NPTVBMRVRFX0JJVAkJCTUKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8xX0ZSQU1FX0NPTVBMRVRFX01BU0sJCQkweDAwMDAwMDIwCisgICAgI2RlZmluZSAgICAgVklERU8xX1NUUkVBTV9FUlJfUkVBRCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAgIC8vQml0WzZdIFZpZGVvMSBkZWNvZGUgc3RyZWFtIGVycm9yIGludGVycnVwdCBzdGF0dXMgcmVhZCBiYWNrCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPMV9TVFJFQU1fRVJSX0JJVAkJCQk2CisgICAgICAgICNkZWZpbmUgICAgIFZJREVPMV9TVFJFQU1fRVJSX01BU0sJCQkJMHgwMDAwMDA0MAorICAgICNkZWZpbmUgICAgIFZJREVPMl9XQVRDSF9ET0dfUkVBRCAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwICAvL0JpdFs4XSBWaWRlbzIgbW9kZSBkZXRlY3Rpb24gd2F0Y2ggZG9nIG91dCBvZiBsb2NrIGludGVycnVwdCBzdGF0dXMgcmVhZCBiYWNrCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPMl9XQVRDSF9ET0dfQklUCQkJCTgKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8yX1dBVENIX0RPR19NQVNLCQkJCTB4MDAwMDAxMDAKKyAgICAjZGVmaW5lICAgICBWSURFTzJfSU5QVVRfQ09NUExFVEVfUkVBRCAgICAgICAgICAgICAgMHgwMDAwMDIwMCAgLy9CaXRbOV0gVmlkZW8yIHZpZGVvIGlucHV0IGNvbXBsZXRlIGludGVycnVwdCBzdGF0dXMgcmVhZCBiYWNrIChmcmFtZSBjb21wbGV0ZSBvbmx5IGZvciBmcmFtZSBtb2RlKQorICAgICAgICAjZGVmaW5lICAgICBWSURFTzJfSU5QVVRfQ09NUExFVEVfQklUCQkJOQorICAgICAgICAjZGVmaW5lICAgICBWSURFTzJfSU5QVVRfQ09NUExFVEVfTUFTSwkJCTB4MDAwMDAyMDAKKyAgICAjZGVmaW5lICAgICBWSURFTzJfUEFDS0VUX1JFQURZX1JFQUQgICAgICAgICAgICAgICAgMHgwMDAwMDQwMCAgLy9CaXRbMTBdIFZpZGVvMiBwYWNrZXQgcmVhZHkgaW50ZXJydXB0IHN0YXR1cyByZWFkIGJhY2sKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8yX1BBQ0tFVF9SRUFEWV9CSVQJCSAgICAgICAgMTAKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8yX1BBQ0tFVF9SRUFEWV9NQVNLCQkgICAgMHgwMDAwMDQwMAorICAgICNkZWZpbmUgICAgIFZJREVPMl9DT01QUkVTU19DT01QTEVURV9SRUFEICAgICAgICAgICAweDAwMDAwODAwICAvL0JpdFsxMV0gVmlkZW8yIGNvbXByZXNzaW9uIGNvbXBsZXRlIGludGVycnVwdCBzdGF0dXMgcmVhZCBiYWNrIAorICAgICAgICAjZGVmaW5lICAgICBWSURFTzJfQ09NUFJFU1NfQ09NUExFVEVfQklUCQkxMQorICAgICAgICAjZGVmaW5lICAgICBWSURFTzJfQ09NUFJFU1NfQ09NUExFVEVfTUFTSwkJMHgwMDAwMDgwMCAgICAgIAorCQkjZGVmaW5lICAgICBWSURFTzJfTU9ERV9ERVRFQ1RJT05fUkVBRFlfUkVBRCAgICAweDAwMDAxMDAwICAvL0JpdFsxMl0gVmlkZW8yIG1vZGUgZGV0ZWN0aW9uIHJlYWR5IGludGVycnVwdCBzdGF0dXMgcmVhZCBiYWNrCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPMl9NT0RFX0RFVEVDVElPTl9SRUFEWV9CSVQgICAgIDEyICAgICAgICAgICAgICAKKyAgICAjZGVmaW5lICAgICBWSURFTzJfRlJBTUVfQ09NUExFVEVfUkVBRCAgICAgICAgICAgICAgMHgwMDAwMjAwMCAgLy9CaXRbMTNdIFZpZGVvMiBmcmFtZSBjb21wbGV0ZSBpbnRlcnJ1cHQgc3RhdHVzIHJlYWQgYmFjaworICAgICAgICAjZGVmaW5lICAgICBWSURFTzJfRlJBTUVfQ09NUExFVEVfQklUCQkgICAgMTMKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8yX0ZSQU1FX0NPTVBMRVRFX01BU0sJCQkweDAwMDAyMDAwCisgICAgI2RlZmluZSAgICAgVklERU8yX1NUUkVBTV9FUlJfUkVBRCAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAgIC8vQml0WzE0XSBWaWRlbzIgZGVjb2RlIHN0cmVhbSBlcnJvciBpbnRlcnJ1cHQgc3RhdHVzIHJlYWQgYmFjaworICAgICAgICAjZGVmaW5lICAgICBWSURFTzJfU1RSRUFNX0VSUl9CSVQJCQkJMTQKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8yX1NUUkVBTV9FUlJfTUFTSwkJCQkweDAwMDA0MDAwCisgICAgLy9uZWVkIGNoZWNrIHNwZWMKKyAgICAjZGVmaW5lICAgICBWSURFT01fSU5QVVRfQ09NUExFVEVfUkVBRCAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMTZdIFZpZGVvTSB2aWRlbyBpbnB1dCBjb21wbGV0ZSBpbnRlcnJ1cHQgc3RhdHVzIHJlYWQgYmFjaworICAgICAgICAjZGVmaW5lICAgICBWSURFT01fSU5QVVRfQ09NUExFVEVfQklUCQkJMTYKKyAgICAgICAgI2RlZmluZSAgICAgVklERU9NX0lOUFVUX0NPTVBMRVRFX01BU0sJCQkweDAwMDEwMDAwCisgICAgI2RlZmluZSAgICAgVklERU9NX0NPTVBSRVNTX0NPTVBMRVRFX1JFQUQgICAgICAgICAgIDB4MDAwMjAwMDAgIC8vQml0WzE3XSBWaWRlb00gY29tcHJlc3Npb24gY29tcGxldGUgaW50ZXJydXB0IHN0YXR1cyByZWFkIGJhY2sKKyAgICAgICAgI2RlZmluZSAgICAgVklERU9NX0NPTVBSRVNTX0NPTVBMRVRFX0JJVAkJMTcKKyAgICAgICAgI2RlZmluZSAgICAgVklERU9NX0NPTVBSRVNTX0NPTVBMRVRFX01BU0sJCTB4MDAwMjAwMDAKKyAgICAjZGVmaW5lICAgICBWSURFT01fUEFDS0VUX1JFQURZX1JFQUQgICAgICAgICAgICAgICAgMHgwMDA0MDAwMCAgLy9CaXRbMThdIENsZWFyIFBhY2tldCByZWFkeSBpbnRlcnJ1cHQgd2hlbiB3cml0ZSAxCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPTV9QQUNLRVRfUkVBRFlfQklUICAgICAgICAgICAgIDE4CisgICAgICAgICNkZWZpbmUgICAgIFZJREVPTV9QQUNLRVRfUkVBRFlfTUFTSyAgICAgICAgICAgIDB4MDAwNDAwMDAgICAgCisgICAgI2RlZmluZSAgICAgVklERU9NX0ZSQU1FX0NPTVBMRVRFX1JFQUQgICAgICAgICAgICAgIDB4MDAwODAwMDAgIC8vQml0WzE5XSBDbGVhciBGcmFtZSBjb21wbGV0ZSBpbnRlcnJ1cHQgd2hlbiB3cml0ZSAxCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPTV9GUkFNRV9DT01QTEVURV9CSVQgICAgICAgICAgIDE5CisgICAgICAgICNkZWZpbmUgICAgIFZJREVPTV9GUkFNRV9DT01QTEVURV9NQVNLICAgICAgICAgIDB4MDAwODAwMDAKKyAgIAorI2RlZmluZSBWSURFT19JTlRfQ09OVFJPTF9DTEVBUl9SRUcgICAgICAgICAgICAgICAgICAgICAweDMwOCArIFZJREVPQkFTRV9PRkZTRVQgLy9DbGVhciB3aGVuIHdyaXRlIDEKKyAgICAvL0NsZWFyIHdoZW4gd3JpdGUgMQorICAgICNkZWZpbmUgICAgIFZJREVPMV9XQVRDSF9ET0dfQ0xFQVIgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAvL0JpdFswXSBDbGVhciBtb2RlIGRldGVjdGlvbiB3YXRjaCBkb2cgb3V0IG9mIGxvY2sgaW50ZXJydXB0IHdoZW4gd3JpdGUgMQorICAgICNkZWZpbmUgICAgIFZJREVPMV9JTlBVVF9DT01QTEVURV9DTEVBUiAgICAgICAgICAgICAweDAwMDAwMDAyICAvL0JpdFsxXSBDbGVhciB2aWRlbyBpbnB1dCBjb21wbGV0ZSBpbnRlcnJ1cHQgd2hlbiB3cml0ZSAxIChmcmFtZSBjb21wbGV0ZSBvbmx5IGZvciBmcmFtZSBtb2RlKQorICAgICNkZWZpbmUgICAgIFZJREVPMV9QQUNLRVRfUkVBRFlfQ0xFQVIgICAgICAgICAgICAgICAweDAwMDAwMDA0ICAvL0JpdFsyXSBDbGVhciBQYWNrZXQgcmVhZHkgaW50ZXJydXB0IHdoZW4gd3JpdGUgMQorICAgICAgICAjZGVmaW5lICAgICBWSURFTzFfUEFDS0VUX1JFQURZX0NMRUFSX0JJVCAgICAgICAyCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPMV9QQUNLRVRfUkVBRFlfQ0xFQVJfTUFTSyAgICAgIDB4MDAwMDAwMDQKKyAgICAjZGVmaW5lICAgICBWSURFTzFfQ09NUFJFU1NfQ09NUExFVEVfQ0xFQVIgICAgICAgICAgMHgwMDAwMDAwOCAgLy9CaXRbM10gQ2xlYXIgdmlkZW8gY29tcHJlc3Npb24gaW50ZXJydXB0IHdoZW4gd3JpdGUgMQorICAgICNkZWZpbmUgICAgIFZJREVPMV9NT0RFX0RFVEVDVElPTl9SRUFEWV9DTEVBUiAgICAgICAweDAwMDAwMDEwICAvL0JpdFs0XSBDbGVhciBWaWRlbzEgTW9kZSBkZXRlY3Rpb24gcmVhZHkgaW50ZXJydXB0IHdoZW4gd3JpdGUgMQorICAgICNkZWZpbmUgICAgIFZJREVPMV9GUkFNRV9DT01QTEVURV9DTEVBUiAgICAgICAgICAgICAweDAwMDAwMDIwICAvL0JpdFs1XSBDbGVhciBGcmFtZSBjb21wbGV0ZSBpbnRlcnJ1cHQgd2hlbiB3cml0ZSAxCisgICAgICAgICNkZWZpbmUgICAgIFZJREVPMV9GUkFNRV9DT01QTEVURV9DTEVBUl9CSVQgICAgIDUKKyAgICAgICAgI2RlZmluZSAgICAgVklERU8xX0ZSQU1FX0NPTVBMRVRFX0NMRUFSX01BU0sgICAgMHgwMDAwMDAyMAorICAgICNkZWZpbmUgICAgIFZJREVPMV9TVFJFQU1fRVJSX0NMRUFSICAgICAgICAgICAgICAgICAweDAwMDAwMDQwICAvL0JpdFs2XSBDbGVhciBkZWNvZGUgc3RyZWFtIGVycm9yIGludGVycnVwdCB3aGVuIHdyaXRlIDEKKyAgICAjZGVmaW5lICAgICBWSURFTzJfV0FUQ0hfRE9HX0NMRUFSICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMCAgLy9CaXRbOF0gQ2xlYXIgTW9kZSBkZXRlY3Rpb24gaW50ZXJydXB0IHdoZW4gd3JpdGUgMQorICAgICNkZWZpbmUgICAgIFZJREVPMl9JTlBVVF9DT01QTEVURV9DTEVBUiAgICAgICAgICAgICAweDAwMDAwMjAwICAvL0JpdFs5XSBDbGVhciB2aWRlbyBpbnB1dCBjb21wbGV0ZSBpbnRlcnJ1cHQgd2hlbiB3cml0ZSAxCisgICAgI2RlZmluZSAgICAgVklERU8yX1BBQ0tFVF9SRUFEWV9DTEVBUiAgICAgICAgICAgICAgIDB4MDAwMDA0MDAgIC8vQml0WzEwXSBDbGVhciBwYWNrZXQgcmVhZHkgaW50ZXJydXB0IHdoZW4gd3JpdGUgMQorICAgICNkZWZpbmUgICAgIFZJREVPMl9DT01QUkVTU19DT01QTEVURV9DTEVBUiAgICAgICAgICAweDAwMDAwODAwICAvL0JpdFsxMV0gQ2xlYXIgdmlkZW8gY29tcHJlc3Npb24gY29tcGxldGUgaW50ZXJydXB0IHdoZW4gd3JpdGUgMQorICAgICNkZWZpbmUgICAgIFZJREVPMl9NT0RFX0RFVEVDVElPTl9SRUFEWV9DTEVBUiAgICAgICAweDAwMDAxMDAwICAvL0JpdFsxMl0gQ2xlYXIgVmlkZW8yIE1vZGUgZGV0ZWN0aW9uIHJlYWR5IGludGVycnVwdCB3aGVuIHdyaXRlIDEKKyAgICAjZGVmaW5lICAgICBWSURFTzJfRlJBTUVfQ09NUExFVEVfQ0xFQVIgICAgICAgICAgICAgMHgwMDAwMjAwMCAgLy9CaXRbMTNdIENsZWFyIEZyYW1lIGNvbXBsZXRlIGludGVycnVwdCB3aGVuIHdyaXRlIDEgKGZyYW1lIGNvbXBsZXRlIG9ubHkgZm9yIGZyYW1lIG1vZGUpCisgICAgI2RlZmluZSAgICAgVklERU8yX1NUUkVBTV9FUlJfQ0xFQVIgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAgIC8vQml0WzE0XSBDbGVhciBEZWNvZGUgc3RyZWFtIGVycm9yIGludGVycnVwdCB3aGVuIHdyaXRlIDEKKyAgICAvL25lZWQgY2hlY2sgc3BlYworICAgICNkZWZpbmUgICAgIFZJREVPTV9JTlBVVF9DT01QTEVURV9DTEVBUiAgICAgICAgICAgICAweDAwMDEwMDAwICAvL0JpdFsxNl0gQ2xlYXIgdmlkZW8gaW5wdXQgY29tcGxldGUgaW50ZXJydXB0IHdoZW4gd3JpdGUgMQorICAgICNkZWZpbmUgICAgIFZJREVPTV9DT01QUkVTU19DT01QTEVURV9DTEVBUiAgICAgICAgICAweDAwMDIwMDAwICAvL0JpdFsxN10gQ2xlYXIgY29tcHJlc3Npb24gY29tcGxldGUgaW50ZXJydXB0IHdoZW4gd3JpdGUgMQorICAgICAgICAjZGVmaW5lICAgICBWSURFT01fQ09NUFJFU1NfQ09NUExFVEVfQ0xFQVJfQklUICAxNworICAgICAgICAjZGVmaW5lICAgICBWSURFT01fQ09NUFJFU1NfQ09NUExFVEVfQ0xFQVJfTUFTSyAweDAwMDIwMDAwICAgIAorCSNkZWZpbmUgICAgIFZJREVPTV9QQUNLRVRfUkVBRFlfQ0xFQVIJCQkJMHgwMDA0MDAwMCAgLy9CaXRbMThdIENsZWFyIGNvbXByZXNzaW9uIGNvbXBsZXRlIGludGVycnVwdCB3aGVuIHdyaXRlIDEKKyAgICAgICAgI2RlZmluZSAgICAgVklERU9NX1BBQ0tFVF9SRUFEWV9DTEVBUl9CSVQgICAgICAgMTgKKyAgICAgICAgI2RlZmluZSAgICAgVklERU9NX1BBQ0tFVF9SRUFEWV9DTEVBUl9NQVNLICAgICAgMHgwMDA0MDAwMCAgICAKKyAgICAjZGVmaW5lICAgICBWSURFT01fRlJBTUVfQ09NUExFVEVfQ0xFQVIgICAgICAgICAgICAgMHgwMDEwMDAwMCAgLy9CaXRbMjBdIENsZWFyIEZyYW1lIGNvbXBsZXRlIGludGVycnVwdCB3aGVuIHdyaXRlIDEKKyAgICAgICAgI2RlZmluZSAgICAgVklERU9NX0ZSQU1FX0NPTVBMRVRFX0NMRUFSX0JJVCAgICAgMjAKKyAgICAgICAgI2RlZmluZSAgICAgVklERU9NX0ZSQU1FX0NPTVBMRVRFX0NMRUFSX01BU0sgICAgMHgwMDEwMDAwMAorICAgICNkZWZpbmUgICAgIFZJREVPTV9TVFJFQU1fRVJSX0NMRUFSICAgICAgICAgICAgICAgICAweDAwMjAwMDAwICAvL0JpdFsyMV0gQ2xlYXIgZGVjb2RlIHN0cmVhbSBlcnJvciBpbnRlcnJ1cHQgd2hlbiB3cml0ZSAxCisgICAgCisjZGVmaW5lIFZJREVPX01PREVfREVURUNUSU9OX1BBUkFNX1JFRyAgICAgICAgICAgICAgICAgIDB4MzBDICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIEVER0VfUElYRUxfVEhSRVNfQklUICAgICAgICAgICAgICAgICAgICA4ICAgICAgICAgICAvL0JpdFsxNTo4XSBNb2RlIGRldGVjdGlvbiBlZGdlIHBpeGVsIHRocmVzaG9sZAorICAgICNkZWZpbmUgICAgIEVER0VfUElYRUxfVEhSRVNfTUFTSyAgICAgICAgICAgICAgICAgICAweDAwMDBGRjAwICAKKyAgICAjZGVmaW5lICAgICBWRVJfU1RBQkxFX01BWF9CSVQgICAgICAgICAgICAgICAgICAgICAgMTYgICAgICAgICAgLy9CaXRbMTk6MTZdIE1vZGUgZGV0ZWN0aW9uIHZlcnRpY2FsIHN0YWJsZSBtYXhpbXVtCisgICAgI2RlZmluZSAgICAgVkVSX1NUQUJMRV9NQVhfQklUX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwRjAwMDAgIAorICAgICNkZWZpbmUgICAgIEhPUl9TVEFCTEVfTUFYX0JJVCAgICAgICAgICAgICAgICAgICAgICAyMCAgICAgICAgICAvL0JpdFsyMzoyMF0gTW9kZSBkZXRlY3Rpb24gaG9yaXpvbnRhbCBzdGFibGUgbWF4aW11bQorICAgICNkZWZpbmUgICAgIEhPUl9TVEFCTEVfTUFYX0JJVF9NQVNLICAgICAgICAgICAgICAgICAweDAwRjAwMDAwCisgICAgI2RlZmluZSAgICAgVkVSX1NUQUJMRV9USFJFU19CSVQgICAgICAgICAgICAgICAgICAgIDI0ICAgICAgICAgIC8vQml0WzI3OjI0XSBNb2RlIGRldGVjdGlvbiB2ZXJ0aWNhbCBzdGFibGUgdGhyZXNob2xkCisgICAgI2RlZmluZSAgICAgVkVSX1NUQUJMRV9USFJFU19CSVRfTUFTSyAgICAgICAgICAgICAgIDB4MEYwMDAwMDAgIAorICAgICNkZWZpbmUgICAgIEhPUl9TVEFCTEVfVEhSRVNfQklUICAgICAgICAgICAgICAgICAgICAyOCAgICAgICAgICAvL0JpdFszMToyOF0gTW9kZSBkZXRlY3Rpb24gaG9yaXpvbnRhbCBzdGFibGUgdGhyZXNob2xkCisgICAgI2RlZmluZSAgICAgSE9SX1NUQUJMRV9USFJFU19CSVRfTUFTSyAgICAgICAgICAgICAgIDB4RjAwMDAwMDAKKyAgICAKKyNkZWZpbmUgVklERU9fQ1JDX1BSSU1BUllfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMjAgKyBWSURFT0JBU0VfT0ZGU0VUCisgICAgI2RlZmluZSAgICAgQ1JDX0NIRUNLX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgIC8vQml0WzBdIFZpZGVvIHBvcnQgMS8yIEVuYWJsZSB2aWRlbyBjYXB0dXJlIHdyaXRlIENSQyBjaGVjaworICAgICAgICAjZGVmaW5lICAgICBDUkNfQ0hFQ0tfRU5fQklUICAgICAgICAgICAgICAgICAgICAwCisgICAgI2RlZmluZSAgICAgQ1JDX0NIRUNLX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIgIC8vQml0WzFdIFZpZGVvIHBvcnQgMS8yIENSQyBjaGVjayBoaWdoIGJpdCBvbmx5CisgICAgICAgICNkZWZpbmUgICAgIENSQ19DSEVDS19ISUdIX0JJVCAgICAgICAgICAgICAgICAgIDEKKyAgICAjZGVmaW5lICAgICBTS0lQX0NPVU5UX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNCAgLy9CaXRbNzoyXSBWaWRlbyBwb3J0IDEvMiBNYXggY2FwdHVyZSB3cml0ZSBza2lwIGNvdW50CisgICAgICAgICNkZWZpbmUgICAgIFNLSVBfQ09VTlRfTUFYX0JJVCAgICAgICAgICAgICAgICAgIDIKKyAgICAgICAgI2RlZmluZSAgICAgU0tJUF9DT1VOVF9NQVhfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwMDBGQworICAgICNkZWZpbmUgICAgIENSQ19QUklNQVJZX1BPTFlfTE9XICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwICAvL0JpdFsxNTo4XSBQcmltYXJ5IENSQyBsb3cgOC1iaXQgcG9seW5vbWlhbAorICAgICAgICAjZGVmaW5lICAgICBDUkNfUklNQVJZX1BPTFlfTE9XX0JJVCAgICAgICAgICAgICA4CisgICAgICAgICNkZWZpbmUgICAgIENSQ19SSU1BUllfUE9MWV9MT1dfTUFTSyAgICAgICAgICAgIDB4MDAwMEZGMDAKKyAgICAjZGVmaW5lICAgICBDUkNfUFJJTUFSWV9QT0xZX0hJR0ggICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgLy9CaXRbMzE6MTZdIFByaW1hcnkgQ1JDIGhpZ2ggOC1iaXQgcG9seW5vbWlhbAorICAgICAgICAjZGVmaW5lICAgICBDUkNfUklNQVJZX1BPTFlfSElHSF9CSVQgICAgICAgICAgICAxNgorICAgICAgICAjZGVmaW5lICAgICBDUkNfUklNQVJZX1BPTFlfSElHSF9NQVNLICAgICAgICAgICAweEZGRkYwMDAwCisgICAgICAgIAorCisjZGVmaW5lIFZJREVPX0NSQ19TRUNPTkRfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzI0ICsgVklERU9CQVNFX09GRlNFVAorICAgICNkZWZpbmUgICAgIENSQ19TRUNPTkRfUE9MWV9MT1cgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwICAvL0JpdFsxNTo4XSBTZWNvbmRhcnkgQ1JDIGxvdyA4LWJpdCBwb2x5bm9taWFsCisgICAgICAgICNkZWZpbmUgICAgIENSQ19TRUNPTkRfUE9MWV9MT1dfQklUICAgICAgICAgICAgIDgKKyAgICAgICAgI2RlZmluZSAgICAgQ1JDX1NFQ09ORF9QT0xZX0xPV19NQVNLICAgICAgICAgICAgMHgwMDAwRkYwMAorICAgICNkZWZpbmUgICAgIENSQ19TRUNPTkRfUE9MWV9ISUdIICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwICAvL0JpdFszMToxNl0gU2Vjb25kYXJ5IENSQyBoaWdoIDgtYml0IHBvbHlub21pYWwKKyAgICAgICAgI2RlZmluZSAgICAgQ1JDX1NFQ09ORF9QT0xZX0hJR0hfQklUICAgICAgICAgICAgMTYKKyAgICAgICAgI2RlZmluZSAgICAgQ1JDX1NFQ09ORF9QT0xZX0hJR0hfTUFTSyAgICAgICAgICAgMHhGRkZGMDAwMAorCisjZGVmaW5lIFZJREVPMV9SQzRfS0VZU19SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMCArIFZJREVPQkFTRV9PRkZTRVQgLy9Ub3RhbCBWaWRlbzEgUkM0IEtleXMgICAgIAorI2RlZmluZSBWSURFTzJfUkM0X0tFWVNfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDAgKyBWSURFT0JBU0VfT0ZGU0VUIC8vVG90YWwgVmlkZW8yIFJDNCBLZXlzICAgICAKKyNkZWZpbmUgVklERU9NX1JDNF9LRVlTX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjAwICsgVklERU9CQVNFX09GRlNFVCAvL1RvdGFsIFZpZGVvTSBSQzQgS2V5cyAgICAgCisKKyNlbmRpZiAvKiBlbmQgb2YgX1ZSRUdfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvYm9hcmRzLmNmZyBiL2JvYXJkcy5jZmcKaW5kZXggNmEzNjhkZS4uNjc0ODk2YiAxMDA2NDQKLS0tIGEvYm9hcmRzLmNmZworKysgYi9ib2FyZHMuY2ZnCkBAIC03Miw2ICs3Miw3IEBAIG1pbmkyNDQwICAgICAgICAgICAgICAgICAgICAgYXJtICAgICAgICAgYXJtOTIwdCAgICAgbWluaTI0NDAgICAgICAgICAgICBmcmllbmRsCiBWQ01BOSAgICAgICAgICAgICAgICAgICAgICAgIGFybSAgICAgICAgIGFybTkyMHQgICAgIHZjbWE5ICAgICAgICAgICAgICAgbXBsICAgICAgICAgICAgczNjMjR4MAogc21kazI0MTAgICAgICAgICAgICAgICAgICAgICBhcm0gICAgICAgICBhcm05MjB0ICAgICAtICAgICAgICAgICAgICAgICAgIHNhbXN1bmcgICAgICAgIHMzYzI0eDAKIG9tYXAxNTEwaW5uICAgICAgICAgICAgICAgICAgYXJtICAgICAgICAgYXJtOTI1dCAgICAgLSAgICAgICAgICAgICAgICAgICB0aQorYXN0MjQwMCAgICAgICAgICAgICAgICAgICAgICBhcm0gICAgICAgICBhcm05MjZlanMgICBhc3QyNDAwICAgICAgICAgICAgIGFzcGVlZCAgICAgICAgIGFzcGVlZAogaW50ZWdyYXRvcmFwX2NtOTI2ZWpzICAgICAgICBhcm0gICAgICAgICBhcm05MjZlanMgICBpbnRlZ3JhdG9yICAgICAgICAgIGFybWx0ZCAgICAgICAgIC0gICAgICAgICAgIGludGVncmF0b3JhcDpDTTkyNkVKX1MKIGludGVncmF0b3JjcF9jbTkyNmVqcyAgICAgICAgYXJtICAgICAgICAgYXJtOTI2ZWpzICAgaW50ZWdyYXRvciAgICAgICAgICBhcm1sdGQgICAgICAgICAtICAgICAgICAgICBpbnRlZ3JhdG9yY3A6Q005MjRFSl9TCiBhc3Blbml0ZSAgICAgICAgICAgICAgICAgICAgIGFybSAgICAgICAgIGFybTkyNmVqcyAgIC0gICAgICAgICAgICAgICAgICAgTWFydmVsbCAgICAgICAgYXJtYWRhMTAwCmRpZmYgLS1naXQgYS9jb21tb24vTWFrZWZpbGUgYi9jb21tb24vTWFrZWZpbGUKaW5kZXggNTNjOTJlZi4uNmJhNWYzOCAxMDA2NDQKLS0tIGEvY29tbW9uL01ha2VmaWxlCisrKyBiL2NvbW1vbi9NYWtlZmlsZQpAQCAtMTkwLDYgKzE5MCw4IEBAIENPQkpTLSQoQ09ORklHX0NNRF9aSVApICs9IGNtZF96aXAubwogQ09CSlMtJChDT05GSUdfQ01EX1pGUykgKz0gY21kX3pmcy5vCiAKICMgb3RoZXJzCitPQkpTLSQoQ09ORklHX0NNRF9ORVRURVNUKSArPSBjbWRfbmV0dGVzdC5vCitDT0JKUy0kKENPTkZJR19DTURfU0xUKSArPSBjbWRfc2x0Lm8KIENPQkpTLSQoQ09ORklHX0JPT1RTVEFHRSkgKz0gYm9vdHN0YWdlLm8KIENPQkpTLSQoQ09ORklHX0NPTlNPTEVfTVVYKSArPSBpb211eC5vCiBDT0JKUy15ICs9IGZsYXNoLm8KZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfbmV0dGVzdC5jIGIvY29tbW9uL2NtZF9uZXR0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5ZDdiNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9jbWRfbmV0dGVzdC5jCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPENPTU1JTkYuSD4KKworI2lmZGVmIFNMVF9VQk9PVAorZXh0ZXJuIGludCBtYWluX2Z1bmN0aW9uKGludCBhcmdjLCBjaGFyICphcmd2W10pOworCitpbnQgZG9fbWFjdGVzdCAoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIE1vZGVTd2l0Y2ggPSBNT0RFX0RFRElDQVRFRDsKKyAgICByZXR1cm4gbWFpbl9mdW5jdGlvbiggYXJnYywgYXJndik7Cit9CisKK2ludCBkb19uY3NpdGVzdCAoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIE1vZGVTd2l0Y2ggPSBNT0RFX05TQ0k7CisgICAgcmV0dXJuIG1haW5fZnVuY3Rpb24oIGFyZ2MsIGFyZ3YpOworfQorCitVX0JPT1RfQ01EKAorICAgIG1hY3Rlc3QsICAgIENPTkZJR19TWVNfTUFYQVJHUywgMCwgIGRvX21hY3Rlc3QsCisgICAgIm1hY3Rlc3QgLSBEZWRpY2F0ZWQgTEFOIHRlc3QgcHJvZ3JhbSBcbiIsCisgICAgTlVMTAorKTsKK1VfQk9PVF9DTUQoCisgICAgbmNzaXRlc3QsICAgIENPTkZJR19TWVNfTUFYQVJHUywgMCwgIGRvX25jc2l0ZXN0LAorICAgICJuY3NpdGVzdC0gU2hhcmUgTEFOIChOQy1TSSkgdGVzdCBwcm9ncmFtIFxuIiwKKyAgICBOVUxMCispOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBkb19waHlyZWFkIChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgaW50ICAgICBNQUNudW07CisgICAgaW50ICAgICBQSFlyZWc7CisgICAgVUxPTkcgICByZXN1bHRfZGF0YTsKKyAgICBpbnQgICAgIHJldCA9IDA7CisgICAgaW50ICAgICBQSFlhZGRyOworICAgIGludCAgICAgdGltZW91dCA9IDA7ICAgIAorCisgICAgZG8geworICAgICAgICBpZiAoIGFyZ2MgIT0gNCApIHsKKyAgICAgICAgICAgIHByaW50ZigiIFdyb25nIHBhcmFtZXRlciBudW1iZXIuXG4iICk7CisgICAgICAgICAgICBwcmludGYoIiBwaHlyIG1hYyBhZGRyIHJlZ1xuIiAgKTsKKyAgICAgICAgICAgIHByaW50ZigiICAgbWFjICAgICA6IDAgb3IgMS4gICBbaGV4XVxuIiAgKTsKKyAgICAgICAgICAgIHByaW50ZigiICAgUEhZIGFkZHI6IDAgdG8gMzEuICBbaGV4XVxuIiAgKTsKKyAgICAgICAgICAgIHByaW50ZigiICAgcmVnaXN0ZXI6IDAgdG8gMHhGRi5baGV4XVxuIiAgKTsKKyAgICAgICAgICAgIHByaW50ZigiIGV4YW1wbGU6IHBoeXIgMCAwIDFcbiIgICk7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgTUFDbnVtICA9IHN0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpOworICAgICAgICBQSFlhZGRyID0gc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7CisgICAgICAgIFBIWXJlZyAgPSBzdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKKyAgICAgICAgCisgICAgICAgIGlmICggTUFDbnVtID09IDAgKSB7CisgICAgICAgICAgICAvLyBTZXQgTUFDIDAKKyAgICAgICAgICAgIEhfTUFDX0JBU0UgID0gTUFDX0JBU0UxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBNQUNudW0gPT0gMSApIHsKKyAgICAgICAgICAgICAgICAvLyBTZXQgTUFDIDEKKyAgICAgICAgICAgICAgICBIX01BQ19CQVNFICA9IE1BQ19CQVNFMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHByaW50Zigid3JvbmcgcGFyYW1ldGVyIChtYWMgbnVtYmVyKVxuIik7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIE1BQ19QSFlCQVNFID0gSF9NQUNfQkFTRTsKKyAgICAgICAgCisgICAgICAgIGlmICggKCBQSFlhZGRyIDwgMCApIHx8ICggUEhZYWRkciA+IDMxICkgKSB7CisgICAgICAgICAgICBwcmludGYoIndyb25nIHBhcmFtZXRlciAoUEhZIGFkZHJlc3MpXG4iKTsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICBNQUNfNDBoX29sZCA9IFJlYWRTT0NfREQoIEhfTUFDX0JBU0UgKyAweDQwICk7CisgICAgICAgIEFTVDIzMDBfTmV3TURJTyA9IChNQUNfNDBoX29sZCAmIDB4ODAwMDAwMDApID8gMSA6IDA7CisgICAgICAgIAorICAgICAgICBpZiAoIEFTVDIzMDBfTmV3TURJTyApIHsKKyAgICAgICAgICAgIFdyaXRlU09DX0REKCBNQUNfUEhZQkFTRSArIDB4NjAsIE1BQ19QSFlSZF9OZXcgfCAoUEhZYWRkciA8PCA1KSB8ICggUEhZcmVnICYgMHgxZiApICk7CisgICAgICAgICAgICB3aGlsZSAoIFJlYWRTT0NfREQoIE1BQ19QSFlCQVNFICsgMHg2MCApICYgTUFDX1BIWUJ1c3lfTmV3ICkgeworICAgICAgICAgICAgICAgIGlmICggKyt0aW1lb3V0ID4gVElNRV9PVVRfUEhZX1JXICkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgREVMQVkoRGVsYXlfUEhZUmQpOworICAgICAgICAgICAgcmVzdWx0X2RhdGEgPSBSZWFkU09DX0REKCBNQUNfUEhZQkFTRSArIDB4NjQgKSAmIDB4ZmZmZjsgIAorICAgICAgICB9IAorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFdyaXRlU09DX0REKCBNQUNfUEhZQkFTRSArIDB4NjAsIE1EQ19UaHJlcyB8IE1BQ19QSFlSZCB8IChQSFlhZGRyIDw8IDE2KSB8ICgoUEhZcmVnICYgMHgxZikgPDwgMjEpICk7CisgICAgICAgICAgICB3aGlsZSAoIFJlYWRTT0NfREQoIE1BQ19QSFlCQVNFICsgMHg2MCApICYgTUFDX1BIWVJkICkgeworICAgICAgICAgICAgICAgIGlmICggKyt0aW1lb3V0ID4gVElNRV9PVVRfUEhZX1JXICkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgREVMQVkoIERlbGF5X1BIWVJkICk7CisgICAgICAgICAgICByZXN1bHRfZGF0YSA9IFJlYWRTT0NfREQoIE1BQ19QSFlCQVNFICsgMHg2NCApID4+IDE2OworICAgICAgICB9CisgICAgICAgIHByaW50ZigiIFBIWVslZF0gcmVnWyUyWF0gPSAlMDhsWFxuIiwgUEhZYWRkciwgUEhZcmVnLCByZXN1bHRfZGF0YSApOyAKKyAgICB9IHdoaWxlICggMCApOworICAgIAorICAgIHJldHVybiByZXQ7Cit9CisKKworaW50IGRvX3BoeXdyaXRlIChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgaW50ICAgICBNQUNudW07CisgICAgaW50ICAgICBQSFlyZWc7CisgICAgaW50ICAgICBQSFlhZGRyOworICAgIFVMT05HICAgcmVnX2RhdGE7CisgICAgaW50ICAgICByZXQgICAgID0gMDsKKyAgICBpbnQgICAgIHRpbWVvdXQgPSAwOyAgICAKKyAgICAKKyAgICBkbyB7CisgICAgICAgIGlmICggYXJnYyAhPSA1ICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCIgV3JvbmcgcGFyYW1ldGVyIG51bWJlci5cbiIgKTsKKyAgICAgICAgICAgIHByaW50ZigiIHBoeXcgbWFjIGFkZHIgcmVnIGRhdGFcbiIgICk7CisgICAgICAgICAgICBwcmludGYoIiAgIG1hYyAgICAgOiAwIG9yIDEuICAgICBbaGV4XVxuIiAgKTsKKyAgICAgICAgICAgIHByaW50ZigiICAgUEhZIGFkZHI6IDAgdG8gMzEuICAgIFtoZXhdXG4iICApOworICAgICAgICAgICAgcHJpbnRmKCIgICByZWdpc3RlcjogMCB0byAweEZGLiAgW2hleF1cbiIgICk7CisgICAgICAgICAgICBwcmludGYoIiAgIGRhdGEgICAgOiAwIHRvIDB4RkZGRi5baGV4XVxuIiAgKTsKKyAgICAgICAgICAgIHByaW50ZigiIGV4YW1wbGU6IHBoeXcgMCAwIDAgNjEwXG4iICApOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgTUFDbnVtICAgPSBzdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KTsKKyAgICAgICAgUEhZYWRkciAgPSBzdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKyAgICAgICAgUEhZcmVnICAgPSBzdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKKyAgICAgICAgcmVnX2RhdGEgPSBzdHJ0b3VsKGFyZ3ZbNF0sIE5VTEwsIDE2KTsKKyAgICAgICAgCisgICAgICAgIGlmICggTUFDbnVtID09IDAgKSB7CisgICAgICAgICAgICAvLyBTZXQgTUFDIDAKKyAgICAgICAgICAgIEhfTUFDX0JBU0UgID0gTUFDX0JBU0UxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBNQUNudW0gPT0gMSApIHsKKyAgICAgICAgICAgICAgICAvLyBTZXQgTUFDIDEKKyAgICAgICAgICAgICAgICBIX01BQ19CQVNFICA9IE1BQ19CQVNFMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHByaW50Zigid3JvbmcgcGFyYW1ldGVyIChtYWMgbnVtYmVyKVxuIik7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIE1BQ19QSFlCQVNFID0gSF9NQUNfQkFTRTsKKyAgICAgICAgCisgICAgICAgIGlmICggKCBQSFlhZGRyIDwgMCApIHx8ICggUEhZYWRkciA+IDMxICkgKSB7CisgICAgICAgICAgICBwcmludGYoIndyb25nIHBhcmFtZXRlciAoUEhZIGFkZHJlc3MpXG4iKTsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIE1BQ180MGhfb2xkID0gUmVhZFNPQ19ERCggSF9NQUNfQkFTRSArIDB4NDAgKTsKKyAgICAgICAgQVNUMjMwMF9OZXdNRElPID0gKE1BQ180MGhfb2xkICYgMHg4MDAwMDAwMCkgPyAxIDogMDsKKyAgICAgICAgCisgICAgICAgIGlmIChBU1QyMzAwX05ld01ESU8pIHsKKyAgICAgICAgICAgIFdyaXRlU09DX0REKCBNQUNfUEhZQkFTRSArIDB4NjAsICggcmVnX2RhdGEgPDwgMTYgKSB8IE1BQ19QSFlXcl9OZXcgfCAoUEhZYWRkcjw8NSkgfCAoUEhZcmVnICYgMHgxZikpOworCisgICAgICAgICAgICB3aGlsZSAoIFJlYWRTT0NfREQoIE1BQ19QSFlCQVNFICsgMHg2MCApICYgTUFDX1BIWUJ1c3lfTmV3ICkgeworICAgICAgICAgICAgICAgIGlmICggKyt0aW1lb3V0ID4gVElNRV9PVVRfUEhZX1JXICkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IAorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFdyaXRlU09DX0REKCBNQUNfUEhZQkFTRSArIDB4NjQsIHJlZ19kYXRhICk7CisgICAgICAgICAgICBXcml0ZVNPQ19ERCggTUFDX1BIWUJBU0UgKyAweDYwLCBNRENfVGhyZXMgfCBNQUNfUEhZV3IgfCAoUEhZYWRkcjw8MTYpIHwgKChQSFlyZWcgJiAweDFmKSA8PCAyMSkpOworCisgICAgICAgICAgICB3aGlsZSAoIFJlYWRTT0NfREQoIE1BQ19QSFlCQVNFICsgMHg2MCApICYgTUFDX1BIWVdyICkgeworICAgICAgICAgICAgICAgIGlmICggKyt0aW1lb3V0ID4gVElNRV9PVVRfUEhZX1JXICkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IC8vIEVuZCBpZiAoQVNUMjMwMF9OZXdNRElPKQorICAgICAgICAKKyAgICAgICAgcHJpbnRmKCJXcml0ZTogUEhZWyVkXSByZWdbJTJYXSA9ICUwOGxYXG4iLCBQSFlhZGRyLCBQSFlyZWcsIHJlZ19kYXRhICk7ICAgICAKKyAgICB9IHdoaWxlICggMCApOworCisgICAgcmV0dXJuIHJldDsKK30KKworVV9CT09UX0NNRCgKKyAgICBwaHlyLCAgICBDT05GSUdfU1lTX01BWEFSR1MsIDAsICBkb19waHlyZWFkLAorICAgICJwaHlyICAgIC0gUmVhZCBQSFkgcmVnaXN0ZXIuICAocGh5ciBtYWMgYWRkciByZWcpXG4iLAorICAgIE5VTEwKKyk7CisKK1VfQk9PVF9DTUQoCisgICAgcGh5dywgICAgQ09ORklHX1NZU19NQVhBUkdTLCAwLCAgZG9fcGh5d3JpdGUsCisgICAgInBoeXcgICAgLSBXcml0ZSBQSFkgcmVnaXN0ZXIuIChwaHl3IG1hYyBhZGRyIHJlZyBkYXRhKVxuIiwKKyAgICBOVUxMCispOworCisjZW5kaWYgLy8gRW5kIFNMVF9VQk9PVAorCmRpZmYgLS1naXQgYS9jb21tb24vY21kX3NsdC5jIGIvY29tbW9uL2NtZF9zbHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzYzNjkyCi0tLSAvZGV2L251bGwKKysrIGIvY29tbW9uL2NtZF9zbHQuYwpAQCAtMCwwICsxLDQ5IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisjaW5jbHVkZSA8Y29tbWFuZC5oPgorCitleHRlcm4gaW50IHBsbF9mdW5jdGlvbihpbnQgYXJnYywgY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgdHJhcF9mdW5jdGlvbihpbnQgYXJnYywgY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgZHJhbV9zdHJlc3NfZnVuY3Rpb24oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CisKK2ludCBkb19wbGx0ZXN0IChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgcmV0dXJuIHBsbF9mdW5jdGlvbiggYXJnYywgYXJndik7Cit9CisKK1VfQk9PVF9DTUQoCisgICAgcGxsdGVzdCwgICBDT05GSUdfU1lTX01BWEFSR1MsIDAsICBkb19wbGx0ZXN0LAorICAgICJwbGx0ZXN0IC0gUExMVGVzdCBbcGxsIG1vZGVdIFtlcnIgcmF0ZV0gXG4iLAorICAgIE5VTEwKKyk7CisKK2ludCBkb190cmFwdGVzdCAoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHJldHVybiB0cmFwX2Z1bmN0aW9uKCBhcmdjLCBhcmd2KTsKK30KKworVV9CT09UX0NNRCgKKyAgICB0cmFwdGVzdCwgICBDT05GSUdfU1lTX01BWEFSR1MsIDAsICBkb190cmFwdGVzdCwKKyAgICAidHJhcHRlc3QtIENoZWNrIGhhcmR3YXJlIHRyYXAgZm9yIENQVSBjbG9jayBhbmQgQ1BVXFxBSEIgcmF0aW8uXG4iLAorICAgIE5VTEwKKyk7CisKK2ludCBkb19kcmFtdGVzdCAoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHJldHVybiBkcmFtX3N0cmVzc19mdW5jdGlvbiggYXJnYywgYXJndik7Cit9CisKK1VfQk9PVF9DTUQoCisgICAgZHJhbXRlc3QsICAgQ09ORklHX1NZU19NQVhBUkdTLCAwLCAgZG9fZHJhbXRlc3QsCisgICAgImRyYW10ZXN0LSBTdHJlc3MgRFJBTS5cbiIsCisgICAgTlVMTAorKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL01ha2VmaWxlIGIvZHJpdmVycy9pMmMvTWFrZWZpbGUKaW5kZXggNzJlODVhMy4uMmIzNTU4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pMmMvTWFrZWZpbGUKQEAgLTQzLDYgKzQzLDcgQEAgQ09CSlMtJChDT05GSUdfUzNDNDRCMF9JMkMpICs9IHMzYzQ0YjBfaTJjLm8KIENPQkpTLSQoQ09ORklHX1NPRlRfSTJDKSArPSBzb2Z0X2kyYy5vCiBDT0JKUy0kKENPTkZJR19URUdSQV9JMkMpICs9IHRlZ3JhX2kyYy5vCiBDT0JKUy0kKENPTkZJR19UU0kxMDhfSTJDKSArPSB0c2kxMDhfaTJjLm8KK0NPQkpTLSQoQ09ORklHX0RSSVZFUl9BU1BFRURfSTJDKSArPSBhc3BlZWRfaTJjLm8KIENPQkpTLSQoQ09ORklHX1U4NTAwX0kyQykgKz0gdTg1MDBfaTJjLm8KIENPQkpTLSQoQ09ORklHX1NIX0kyQykgKz0gc2hfaTJjLm8KIENPQkpTLSQoQ09ORklHX1NIX1NINzczNF9JMkMpICs9IHNoX3NoNzczNF9pMmMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYXNwZWVkX2kyYy5jIGIvZHJpdmVycy9pMmMvYXNwZWVkX2kyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZmNmM3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9hc3BlZWRfaTJjLmMKQEAgLTAsMCArMSwyODYgQEAKKy8qCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXNwZWVkX2kyYy5oPgorCisjaWZkZWYgQ09ORklHX0RSSVZFUl9BU1BFRURfSTJDCisKK3ZvaWQgaTJjX2luaXQgKGludCBzcGVlZCwgaW50IHNsYXZlYWRkKQoreworCXVuc2lnbmVkIGxvbmcgU0NVUmVnaXN0ZXI7CisvL0kyQyBSZXNldAorICAgICAgICBTQ1VSZWdpc3RlciA9IGlubCAoU0NVX0JBU0UgKyBTQ1VfUkVTRVRfQ09OVFJPTCk7CisgICAgICAgIG91dGwgKFNDVVJlZ2lzdGVyICYgfigweDA0KSwgU0NVX0JBU0UgKyBTQ1VfUkVTRVRfQ09OVFJPTCk7CisvL0kyQyBNdWx0aS1QaW4KKyAgICAgICAgU0NVUmVnaXN0ZXIgPSBpbmwgKFNDVV9CQVNFICsgU0NVX01VTFRJRlVOQ1RJT05fUElOX0NUTDVfUkVHKTsKKyAgICAgICAgb3V0bCAoKFNDVVJlZ2lzdGVyIHwgMHgzMDAwMCksIFNDVV9CQVNFICsgU0NVX01VTFRJRlVOQ1RJT05fUElOX0NUTDVfUkVHKTsKKy8vUmVzZXQKKwlvdXRsICgwLCBJMkNfRlVOQ1RJT05fQ09OVFJPTF9SRUdJU1RFUik7CisvL1NldCBBQyBUaW1pbmcsIHdlIHVzZSBmaXggQUMgdGltaW5nIGZvciBlZXByb20gaW4gdS1ib290CisJb3V0bCAoQUNfVElNSU5HLCBJMkNfQUNfVElNSU5HX1JFR0lTVEVSXzEpOworCW91dGwgKDAsIEkyQ19BQ19USU1JTkdfUkVHSVNURVJfMik7CisvL0NsZWFyIEludGVycnVwdAorCW91dGwgKEFMTF9DTEVBUiwgSTJDX0lOVEVSUlVQVF9TVEFUVVNfUkVHSVNURVIpOworLy9FbmFibGUgTWFzdGVyIE1vZGUKKwlvdXRsIChNQVNURVJfRU5BQkxFLCBJMkNfRlVOQ1RJT05fQ09OVFJPTF9SRUdJU1RFUik7CisvL0VuYWJsZSBJbnRlcnJ1cHQsIFNUT1AgSW50ZXJydXB0IGhhcyBidWcgaW4gQVNUMjAwMAorCW91dGwgKDB4QUYsIEkyQ19JTlRFUlJVUFRfQ09OVFJPTF9SRUdJU1RFUik7CisvL1NldCBTbGF2ZSBhZGRyZXNzLCBzaG91bGQgbm90IHVzZSBmb3IgZWVwcm9tCisJb3V0bCAoc2xhdmVhZGQsIEkyQ19ERVZJQ0VfQUREUkVTU19SRUdJU1RFUik7Cit9CisKK3N0YXRpYyBpbnQgaTJjX3JlYWRfYnl0ZSAodTggZGV2YWRkciwgdTE2IHJlZ29mZnNldCwgdTggKiB2YWx1ZSwgaW50IGFsZW4pCit7CisJaW50IGkyY19lcnJvciA9IDA7CisJdTMyIHN0YXR1cywgY291bnQgPSAwOworCisvL1N0YXJ0IGFuZCBTZW5kIERldmljZSBBZGRyZXNzCisJb3V0bCAoZGV2YWRkciwgSTJDX0JZVEVfQlVGRkVSX1JFR0lTVEVSKTsKKwlvdXRsIChNQVNURVJfU1RBUlRfQ09NTUFORCB8IE1BU1RFUl9UWF9DT01NQU5ELCBJMkNfQ09NTUFORF9SRUdJU1RFUik7CisvL1dhaXQgVHggQUNLCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChpbmwgKEkyQ19JTlRFUlJVUFRfU1RBVFVTX1JFR0lTVEVSKSAmIChUWF9BQ0sgfCBUWF9OQUNLKSk7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgaWYgKGNvdW50ID09IExPT1BfQ09VTlQpIHsKKyAgICAgICAgICAgICAgICBpMmNfZXJyb3IgPSAxOworICAgICAgICAgICAgICAgIHByaW50ZiAoIlN0YXJ0IGFuZCBTZW5kIERldmljZSBBZGRyZXNzIGNhbid0IGdldCBBQ0sgYmFja1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGkyY19lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoc3RhdHVzICE9IFRYX0FDSyk7CisgICAgICAgIGNvdW50ID0gMDsKKy8vQ2xlYXIgSW50ZXJydXB0CisJb3V0bCAoQUxMX0NMRUFSLCBJMkNfSU5URVJSVVBUX1NUQVRVU19SRUdJU1RFUik7CisvL0NoZWNrIGlmIGFkZHJlc3MgbGVuZ3RoIGVxdWFscyB0byAxNmJpdHMKKyAgICAgICAgaWYgKGFsZW4gIT0gMSkgeworLy9TZW5kIERldmljZSBSZWdpc3RlciBPZmZzZXQgKEhJR0ggQllURSkKKwkgICAgb3V0bCAoKHJlZ29mZnNldCAmIDB4RkYwMCkgPj4gOCwgSTJDX0JZVEVfQlVGRkVSX1JFR0lTVEVSKTsKKwkgICAgb3V0bCAoTUFTVEVSX1RYX0NPTU1BTkQsIEkyQ19DT01NQU5EX1JFR0lTVEVSKTsKKy8vV2FpdCBUeCBBQ0sKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAoaW5sIChJMkNfSU5URVJSVVBUX1NUQVRVU19SRUdJU1RFUikgJiAoVFhfQUNLIHwgVFhfTkFDSykpOworICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50ID09IExPT1BfQ09VTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgaTJjX2Vycm9yID0gMTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiU2VuZCBEZXZpY2UgUmVnaXN0ZXIgT2Zmc2V0IGNhbid0IGdldCBBQ0sgYmFja1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpMmNfZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoc3RhdHVzICE9IFRYX0FDSyk7CisgICAgICAgICAgICBjb3VudCA9IDA7CisvL0NsZWFyIEludGVycnVwdAorCSAgICBvdXRsIChBTExfQ0xFQVIsIEkyQ19JTlRFUlJVUFRfU1RBVFVTX1JFR0lTVEVSKTsKKwl9CisvL1NlbmQgRGV2aWNlIFJlZ2lzdGVyIE9mZnNldChMT1cpCisJb3V0bCAocmVnb2Zmc2V0ICYgMHhGRiwgSTJDX0JZVEVfQlVGRkVSX1JFR0lTVEVSKTsKKwlvdXRsIChNQVNURVJfVFhfQ09NTUFORCwgSTJDX0NPTU1BTkRfUkVHSVNURVIpOworLy9XYWl0IFR4IEFDSworICAgICAgICBkbyB7CisgICAgICAgICAgICBzdGF0dXMgPSAoaW5sIChJMkNfSU5URVJSVVBUX1NUQVRVU19SRUdJU1RFUikgJiAoVFhfQUNLIHwgVFhfTkFDSykpOworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIGlmIChjb3VudCA9PSBMT09QX0NPVU5UKSB7CisgICAgICAgICAgICAgICAgaTJjX2Vycm9yID0gMTsKKyAgICAgICAgICAgICAgICBwcmludGYgKCJTZW5kIERldmljZSBSZWdpc3RlciBPZmZzZXQgY2FuJ3QgZ2V0IEFDSyBiYWNrXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTJjX2Vycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChzdGF0dXMgIT0gVFhfQUNLKTsKKyAgICAgICAgY291bnQgPSAwOworLy9DbGVhciBJbnRlcnJ1cHQKKwlvdXRsIChBTExfQ0xFQVIsIEkyQ19JTlRFUlJVUFRfU1RBVFVTX1JFR0lTVEVSKTsKKy8vU3RhcnQsIFNlbmQgRGV2aWNlIEFkZHJlc3MgKyAxIChSZWFkIE1vZGUpLCBSZWNlaXZlIERhdGEKKwlvdXRsIChkZXZhZGRyICsgMSwgSTJDX0JZVEVfQlVGRkVSX1JFR0lTVEVSKTsKKwlvdXRsIChNQVNURVJfU1RBUlRfQ09NTUFORCB8IE1BU1RFUl9UWF9DT01NQU5EIHwgTUFTVEVSX1JYX0NPTU1BTkQgfCBSWF9DT01NQU5EX0xJU1QsIEkyQ19DT01NQU5EX1JFR0lTVEVSKTsKKy8vV2FpdCBSeCBEb25lCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChpbmwgKEkyQ19JTlRFUlJVUFRfU1RBVFVTX1JFR0lTVEVSKSAmIFJYX0RPTkUpOworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIGlmIChjb3VudCA9PSBMT09QX0NPVU5UKSB7CisgICAgICAgICAgICAgICAgaTJjX2Vycm9yID0gMTsKKyAgICAgICAgICAgICAgICBwcmludGYgKCJDYW4ndCBnZXQgUlhfRE9ORSBiYWNrXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTJjX2Vycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChzdGF0dXMgIT0gUlhfRE9ORSk7CisgICAgICAgIGNvdW50ID0gMDsKKy8vQ2xlYXIgSW50ZXJydXB0CisJb3V0bCAoQUxMX0NMRUFSLCBJMkNfSU5URVJSVVBUX1NUQVRVU19SRUdJU1RFUik7CisvL0VuYWJsZSBJbnRlcnJ1cHQgKyBTdG9wIEludGVycnVwdAorCW91dGwgKDB4QkYsIEkyQ19JTlRFUlJVUFRfQ09OVFJPTF9SRUdJU1RFUik7CisvL0lzc3VlIFN0b3AgQ29tbWFuZAorCW91dGwgKE1BU1RFUl9TVE9QX0NPTU1BTkQsIEkyQ19DT01NQU5EX1JFR0lTVEVSKTsKKy8vV2FpdCBTdG9wCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChpbmwgKEkyQ19JTlRFUlJVUFRfU1RBVFVTX1JFR0lTVEVSKSAmIFNUT1BfRE9ORSk7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgaWYgKGNvdW50ID09IExPT1BfQ09VTlQpIHsKKyAgICAgICAgICAgICAgICBpMmNfZXJyb3IgPSAxOworICAgICAgICAgICAgICAgIHByaW50ZiAoIkNhbid0IGdldCBTVE9QIGJhY2tcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBpMmNfZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHN0YXR1cyAhPSBTVE9QX0RPTkUpOworLy9EaXNhYmxlIFN0b3AgSW50ZXJydXB0CisJb3V0bCAoMHhBRiwgSTJDX0lOVEVSUlVQVF9DT05UUk9MX1JFR0lTVEVSKTsKKy8vQ2xlYXIgSW50ZXJydXB0CisJb3V0bCAoQUxMX0NMRUFSLCBJMkNfSU5URVJSVVBUX1NUQVRVU19SRUdJU1RFUik7CisvL1JlYWQgUmVjZWl2ZWQgRGF0YQorICAgICAgICAqdmFsdWUgPSAoKGlubCAoSTJDX0JZVEVfQlVGRkVSX1JFR0lTVEVSKSAmIDB4RkYwMCkgPj4gOCk7CisKKwlyZXR1cm4gaTJjX2Vycm9yOworfQorCitzdGF0aWMgaW50IGkyY193cml0ZV9ieXRlICh1OCBkZXZhZGRyLCB1MTYgcmVnb2Zmc2V0LCB1OCB2YWx1ZSwgaW50IGFsZW4pCit7CisJaW50IGkyY19lcnJvciA9IDA7CisgICAgICAgIHUzMiBzdGF0dXMsIGNvdW50ID0gMDsKKworLy9TdGFydCBhbmQgU2VuZCBEZXZpY2UgQWRkcmVzcworCW91dGwgKGRldmFkZHIsIEkyQ19CWVRFX0JVRkZFUl9SRUdJU1RFUik7CisJb3V0bCAoTUFTVEVSX1NUQVJUX0NPTU1BTkQgfCBNQVNURVJfVFhfQ09NTUFORCwgSTJDX0NPTU1BTkRfUkVHSVNURVIpOworLy9XYWl0IFR4IEFDSworICAgICAgICBkbyB7CisgICAgICAgICAgICBzdGF0dXMgPSAoaW5sIChJMkNfSU5URVJSVVBUX1NUQVRVU19SRUdJU1RFUikgJiAoVFhfQUNLIHwgVFhfTkFDSykpOworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gVFhfTkFDSykgeworLy9DbGVhciBJbnRlcnJ1cHQKKyAgIAkgICAgICAgIG91dGwgKEFMTF9DTEVBUiwgSTJDX0lOVEVSUlVQVF9TVEFUVVNfUkVHSVNURVIpOworLy9SZS1zZW5kIFN0YXJ0IGFuZCBTZW5kIERldmljZSBBZGRyZXNzIHdoaWxlIE5BQ0sgcmV0dXJuCisJICAgICAgICBvdXRsIChkZXZhZGRyLCBJMkNfQllURV9CVUZGRVJfUkVHSVNURVIpOworICAgICAgICAJb3V0bCAoTUFTVEVSX1NUQVJUX0NPTU1BTkQgfCBNQVNURVJfVFhfQ09NTUFORCwgSTJDX0NPTU1BTkRfUkVHSVNURVIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAJaWYgKGNvdW50ID09IExPT1BfQ09VTlQpIHsKKyAgICAgICAgICAgIAkgICAgaTJjX2Vycm9yID0gMTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgiU3RhcnQgYW5kIFNlbmQgRGV2aWNlIEFkZHJlc3MgY2FuJ3QgZ2V0IEFDSyBiYWNrXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkyY19lcnJvcjsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHN0YXR1cyAhPSBUWF9BQ0spOworICAgICAgICBjb3VudCA9IDA7CisvL0NsZWFyIEludGVycnVwdAorCW91dGwgKEFMTF9DTEVBUiwgSTJDX0lOVEVSUlVQVF9TVEFUVVNfUkVHSVNURVIpOworLy9DaGVjayBpZiBhZGRyZXNzIGxlbmd0aCBlcXVhbHMgdG8gMTZiaXRzCisgICAgICAgIGlmIChhbGVuICE9IDEpIHsKKy8vU2VuZCBEZXZpY2UgUmVnaXN0ZXIgT2Zmc2V0IChISUdIIEJZVEUpCisJICAgIG91dGwgKChyZWdvZmZzZXQgJiAweEZGMDApID4+IDgsIEkyQ19CWVRFX0JVRkZFUl9SRUdJU1RFUik7CisJICAgIG91dGwgKE1BU1RFUl9UWF9DT01NQU5ELCBJMkNfQ09NTUFORF9SRUdJU1RFUik7CisvL1dhaXQgVHggQUNLCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gKGlubCAoSTJDX0lOVEVSUlVQVF9TVEFUVVNfUkVHSVNURVIpICYgKFRYX0FDSyB8IFRYX05BQ0spKTsKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSBMT09QX0NPVU5UKSB7CisgICAgICAgICAgICAgICAgICAgIGkyY19lcnJvciA9IDE7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoIlNlbmQgRGV2aWNlIFJlZ2lzdGVyIE9mZnNldCBjYW4ndCBnZXQgQUNLIGJhY2tcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTJjX2Vycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHN0YXR1cyAhPSBUWF9BQ0spOworICAgICAgICAgICAgY291bnQgPSAwOworLy9DbGVhciBJbnRlcnJ1cHQKKwkgICAgb3V0bCAoQUxMX0NMRUFSLCBJMkNfSU5URVJSVVBUX1NUQVRVU19SRUdJU1RFUik7CisJfQorLy9TZW5kIERldmljZSBSZWdpc3RlciBPZmZzZXQKKwlvdXRsIChyZWdvZmZzZXQgJiAweEZGLCBJMkNfQllURV9CVUZGRVJfUkVHSVNURVIpOworCW91dGwgKE1BU1RFUl9UWF9DT01NQU5ELCBJMkNfQ09NTUFORF9SRUdJU1RFUik7CisvL1dhaXQgVHggQUNLCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChpbmwgKEkyQ19JTlRFUlJVUFRfU1RBVFVTX1JFR0lTVEVSKSAmIChUWF9BQ0sgfCBUWF9OQUNLKSk7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgaWYgKGNvdW50ID09IExPT1BfQ09VTlQpIHsKKyAgICAgICAgICAgICAgICBpMmNfZXJyb3IgPSAxOworICAgICAgICAgICAgICAgIHByaW50ZiAoIlNlbmQgRGV2aWNlIFJlZ2lzdGVyIE9mZnNldCBjYW4ndCBnZXQgQUNLIGJhY2tcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBpMmNfZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHN0YXR1cyAhPSBUWF9BQ0spOworICAgICAgICBjb3VudCA9IDA7CisvL0NsZWFyIEludGVycnVwdAorCW91dGwgKEFMTF9DTEVBUiwgSTJDX0lOVEVSUlVQVF9TVEFUVVNfUkVHSVNURVIpOworLy9TZW5kIERldmljZSBSZWdpc3RlciBWYWx1ZQorCW91dGwgKHZhbHVlLCBJMkNfQllURV9CVUZGRVJfUkVHSVNURVIpOworCW91dGwgKE1BU1RFUl9UWF9DT01NQU5ELCBJMkNfQ09NTUFORF9SRUdJU1RFUik7CisvL1dhaXQgVHggQUNLCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChpbmwgKEkyQ19JTlRFUlJVUFRfU1RBVFVTX1JFR0lTVEVSKSAmIChUWF9BQ0sgfCBUWF9OQUNLKSk7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgaWYgKGNvdW50ID09IExPT1BfQ09VTlQpIHsKKyAgICAgICAgICAgICAgICBpMmNfZXJyb3IgPSAxOworICAgICAgICAgICAgICAgIHByaW50ZiAoIlNlbmQgRGV2aWNlIFJlZ2lzdGVyIFZhbHVlIGNhbid0IGdldCBBQ0sgYmFja1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGkyY19lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoc3RhdHVzICE9IFRYX0FDSyk7CisgICAgICAgIGNvdW50ID0gMDsKKy8vQ2xlYXIgSW50ZXJydXB0CisJb3V0bCAoQUxMX0NMRUFSLCBJMkNfSU5URVJSVVBUX1NUQVRVU19SRUdJU1RFUik7CisvL0VuYWJsZSBJbnRlcnJ1cHQgKyBTdG9wIEludGVycnVwdAorCW91dGwgKDB4QkYsIEkyQ19JTlRFUlJVUFRfQ09OVFJPTF9SRUdJU1RFUik7CisvL0lzc3VlIFN0b3AgQ29tbWFuZAorCW91dGwgKE1BU1RFUl9TVE9QX0NPTU1BTkQsIEkyQ19DT01NQU5EX1JFR0lTVEVSKTsKKy8vV2FpdCBTdG9wCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChpbmwgKEkyQ19JTlRFUlJVUFRfU1RBVFVTX1JFR0lTVEVSKSAmIFNUT1BfRE9ORSk7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgaWYgKGNvdW50ID09IExPT1BfQ09VTlQpIHsKKyAgICAgICAgICAgICAgICBpMmNfZXJyb3IgPSAxOworICAgICAgICAgICAgICAgIHByaW50ZiAoIkNhbid0IGdldCBTVE9QIGJhY2tcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBpMmNfZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHN0YXR1cyAhPSBTVE9QX0RPTkUpOworLy9EaXNhYmxlIFN0b3AgSW50ZXJydXB0CisJb3V0bCAoMHhBRiwgSTJDX0lOVEVSUlVQVF9DT05UUk9MX1JFR0lTVEVSKTsKKy8vQ2xlYXIgSW50ZXJydXB0CisJb3V0bCAoQUxMX0NMRUFSLCBJMkNfSU5URVJSVVBUX1NUQVRVU19SRUdJU1RFUik7CisKKwlyZXR1cm4gaTJjX2Vycm9yOworfQorCitpbnQgaTJjX3Byb2JlICh1Y2hhciBjaGlwKQoreworLy9TdXBwb3NlIElQIGlzIGFsd2F5cyBvbiBjaGlwCisJaW50IHJlcyA9IDA7CisJCisJcmV0dXJuIHJlczsKK30KKworaW50IGkyY19yZWFkICh1Y2hhciBkZXZpY2VfYWRkciwgdWludCByZWdpc3Rlcl9vZmZzZXQsIGludCBhbGVuLCB1Y2hhciAqIGJ1ZmZlciwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworICAgICAgICBpZiAoKGFsZW4gPT0gMSkgJiYgKChyZWdpc3Rlcl9vZmZzZXQgKyBsZW4pID4gMjU2KSkgeworICAgICAgICAJcHJpbnRmICgiUmVnaXN0ZXIgaW5kZXggb3ZlcmZsb3dcbiIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkgICAgICAgIGlmIChpMmNfcmVhZF9ieXRlIChkZXZpY2VfYWRkciwgcmVnaXN0ZXJfb2Zmc2V0ICsgaSwgJmJ1ZmZlcltpXSwgYWxlbikpIHsKKwkJICAgICAgICBwcmludGYgKCJJMkMgcmVhZDogSS9PIGVycm9yXG4iKTsKKwkJCWkyY19pbml0IChDT05GSUdfU1lTX0kyQ19TUEVFRCwgQ09ORklHX1NZU19JMkNfU0xBVkUpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGkyY193cml0ZSAodWNoYXIgZGV2aWNlX2FkZHIsIHVpbnQgcmVnaXN0ZXJfb2Zmc2V0LCBpbnQgYWxlbiwgdWNoYXIgKiBidWZmZXIsIGludCBsZW4pCit7CisJaW50IGk7CisKKyAgICAgICAgaWYgKChhbGVuID09IDEpICYmICgocmVnaXN0ZXJfb2Zmc2V0ICsgbGVuKSA+IDI1NikpIHsKKyAgICAgICAgCXByaW50ZiAoIlJlZ2lzdGVyIGluZGV4IG92ZXJmbG93XG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCSAgICAgICAgaWYgKGkyY193cml0ZV9ieXRlIChkZXZpY2VfYWRkciwgcmVnaXN0ZXJfb2Zmc2V0ICsgaSwgYnVmZmVyW2ldLCBhbGVuKSkgeworCQkgICAgICAgIHByaW50ZiAoIkkyQyByZWFkOiBJL08gZXJyb3JcbiIpOworCQkJaTJjX2luaXQgKENPTkZJR19TWVNfSTJDX1NQRUVELCBDT05GSUdfU1lTX0kyQ19TTEFWRSk7CisJCQlyZXR1cm4gMTsKKyAgIAkgICAgICAgIH0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19EUklWRVJfQVNQRUVEX0kyQyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9NYWtlZmlsZQppbmRleCA5Y2YyOTgzLi5hMWQxOWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9NYWtlZmlsZQpAQCAtNjgsNiArNjgsNyBAQCBDT0JKUy0kKENPTkZJR19QTEIyODAwX0VUSEVSKSArPSBwbGIyODAwX2V0aC5vCiBDT0JKUy0kKENPTkZJR19SVEw4MTM5KSArPSBydGw4MTM5Lm8KIENPQkpTLSQoQ09ORklHX1JUTDgxNjkpICs9IHJ0bDgxNjkubwogQ09CSlMtJChDT05GSUdfU0hfRVRIRVIpICs9IHNoX2V0aC5vCitDT0JKUy0kKENPTkZJR19BU1BFRUROSUMpICs9IGFzcGVlZG5pYy5vCiBDT0JKUy0kKENPTkZJR19TTUM5MTExMSkgKz0gc21jOTExMTEubwogQ09CSlMtJChDT05GSUdfU01DOTExWCkgKz0gc21jOTExeC5vCiBDT0JKUy0kKENPTkZJR19TVU5YSV9XRU1BQykgKz0gc3VueGlfd2VtYWMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXNwZWVkbmljLmMgYi9kcml2ZXJzL25ldC9hc3BlZWRuaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjFjZTA1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXNwZWVkbmljLmMKQEAgLTAsMCArMSwxNTI4IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSAmJiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIGRlZmluZWQoQ09ORklHX0FTUEVFRE5JQykKKworI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPG5ldC5oPgorI2luY2x1ZGUgPHBjaS5oPgorCisKKy8qCisgIFNDVTg4IERbMzFdOiBNQUMxIE1ESU8KKyAgU0NVODggRFszMF06IE1BQzEgTURDCisgIFNDVTkwIERbMl06ICBNQUMyIE1EQy9NRElPCisgIFNDVTgwIERbMF06ICBNQUMxIExpbmsKKyAgU0NVODAgRFsxXTogIE1BQzIgTGluaworKi8KKyNkZWZpbmUgcGNpX2ZpbmRfZGV2aWNlcyAgICAgICAgIE5VTEwKKyNkZWZpbmUgcGNpX3JlYWRfY29uZmlnX2R3b3JkICAgIE5VTEwKKyNpZiBkZWZpbmVkKENPTkZJR19BU1QxMzAwKQorI2RlZmluZSBTQ1VfQkFTRSAgICAgICAgICAgICAgICAgQ09ORklHX1NDVVJFR19CQVNFCisjZWxzZQorI2RlZmluZSBTQ1VfQkFTRSAgICAgICAgICAgICAgICAgMHgxRTZFMjAwMAorI2VuZGlmCisjZGVmaW5lIFNDVV9SRVNFVF9DT05UUk9MICAgICAgICAweDA0CisjZGVmaW5lIFNDVV9DTE9DS19TRUxFQ1RJT04gICAgICAweDA4CisjZGVmaW5lIFNDVV9DTE9DS19DT05UUk9MICAgICAgICAweDBDCisjZGVmaW5lIFNDVV9NQUNfQ0xPQ0tfREVMQVkgICAgICAweDQ4CisjZGVmaW5lIFNDVV9TQ1JBVENIX1JFR0lTVEVSICAgICAweDQwCisjZGVmaW5lIFNDVV9IQVJEV0FSRV9UUkFQUElORyAgICAweDcwCisjZGVmaW5lIFNDVV9QSU5fTVVYICAgICAgICAgICAgICAweDc0CisjZGVmaW5lIFNDVV9NVUxUSUZVTkNUSU9OX1BJTl9DVEwxX1JFRyAgICAgMHg4MAorI2RlZmluZSBTQ1VfTVVMVElGVU5DVElPTl9QSU5fQ1RMM19SRUcgICAgIDB4ODgKKyNkZWZpbmUgU0NVX01VTFRJRlVOQ1RJT05fUElOX0NUTDVfUkVHICAgICAweDkwCisjZGVmaW5lIE1BQ19JTlRFUkZBQ0UgICAgICAgICAgICAweDFDMAorI2RlZmluZSBHTUlJICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIE1JSSAgICAgICAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIE1BQzFfQ0xPQ0tfRU5BQkxFICAgICAgICAoMSA8PCAyMCkKKyNkZWZpbmUgTUFDMl9DTE9DS19FTkFCTEUgICAgICAgICgxIDw8IDIxKQorI2RlZmluZSBNQUNfQUhCX0NMT0NLX0RJVklERVIgICAgKDB4MDcgPDwgMTYpCisjaWYgZGVmaW5lZChDT05GSUdfQVNUMjMwMF9GUEdBXzIpIHx8IGRlZmluZWQoQ09ORklHX0FTVDIzMDApIHx8IGRlZmluZWQoQ09ORklHX0FTVDMxMDApIHx8IGRlZmluZWQoQ09ORklHX0FTVDI0MDApCisjZGVmaW5lIE1BQzFfTURJTyAgICAgICAgICAgICAgICAoMSA8PCAzMSkKKyNkZWZpbmUgTUFDMV9NREMgICAgICAgICAgICAgICAgICgxIDw8IDMwKQorI2RlZmluZSBNQUMxX1BIWV9MSU5LICAgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgTUFDMl9NRENfTURJTyAgICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIE1BQzFfUEhZX0xJTksgICAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBNQUMyX1BIWV9MSU5LICAgICAgICAgICAgKDEgPDwgMSkKKyNlbHNlCisjZGVmaW5lIE1BQzJfTURDX01ESU8gICAgICAgICAgICAoMSA8PCAyMCkKKyNkZWZpbmUgTUFDMl9NSUkgICAgICAgICAgICAgICAgICgxIDw8IDIxKQorI2RlZmluZSBNQUMxX1BIWV9MSU5LICAgICAgICAgICAgKDEgPDwgMjUpCisjZGVmaW5lIE1BQzJfUEhZX0xJTksgICAgICAgICAgICAoMSA8PCAyNikKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQVNUMTMwMCkKK3Vuc2lnbmVkIGludCBhc3BlZWRuaWNfaW9iYXNlWzFdID0ge0NPTkZJR19NQUNSRUdfQkFTRX07CisjZWxzZQordW5zaWduZWQgaW50IGFzcGVlZG5pY19pb2Jhc2VbQ09ORklHX0FTUEVFRF9NQUNfTlVNQkVSXSA9IHsKKyAgMHgxRTY2MDAwMCwgMHgxRTY4MDAwMH07CisjZW5kaWYKKworI3VuZGVmIERFQlVHX1NST00KKyN1bmRlZiBERUJVR19TUk9NMgorCisjdW5kZWYgVVBEQVRFX1NST00KKworLyogUENJIFJlZ2lzdGVycy4KKyAqLworI2RlZmluZSBQQ0lfQ0ZEQV9QU00gICAgMHg0MworCisjZGVmaW5lIENGUlZfUk4gICAweDAwMDAwMGYwICAvKiBSZXZpc2lvbiBOdW1iZXIgKi8KKworI2RlZmluZSBXQUtFVVAgICAgMHgwMCAgICAvKiBQb3dlciBTYXZpbmcgV2FrZXVwICovCisjZGVmaW5lIFNMRUVQICAgMHg4MCAgICAvKiBQb3dlciBTYXZpbmcgU2xlZXAgTW9kZSAqLworCisjZGVmaW5lIERDMjExNHhfQlJLIDB4MDAyMCAgICAvKiBDRlJWIGJyZWFrIGJldHdlZW4gREMyMTE0MiAmIERDMjExNDMgKi8KKworLyogTUFDIGNoaXAgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVNSX1JFRyAgICAgICAweDAwICAgICAgICAvLyBpbnRlcnJ1cHMgc3RhdHVzIHJlZ2lzdGVyCisjZGVmaW5lIElFUl9SRUcgICAgICAgMHgwNCAgICAgICAgLy8gaW50ZXJydXB0IG1ha3MgcmVnaXN0ZXIKKyNkZWZpbmUgTUFDX01BRFJfUkVHICAgICAgICAgICAgMHgwOCAgICAgICAgLy8gTUFDIGFkZHJlc3MgKE1vc3Qgc2lnbmlmaWNhbnQpCisjZGVmaW5lIE1BQ19MQURSX1JFRyAgICAgICAgICAgIDB4MGMgICAgICAgIC8vIE1BQyBhZGRyZXNzIChMZWFzdCBzaWduaWZpY2FudCkKKworI2RlZmluZSBNQUhUMF9SRUcgICAgIDB4MTAgICAgICAgIC8vIE11bHRpY2FzdCBBZGRyZXNzIEhhc2ggVGFibGUgMCByZWdpc3RlcgorI2RlZmluZSBNQUhUMV9SRUcgICAgIDB4MTQgICAgICAgIC8vIE11bHRpY2FzdCBBZGRyZXNzIEhhc2ggVGFibGUgMSByZWdpc3RlcgorI2RlZmluZSBUWFBEX1JFRyAgICAgIDB4MTggICAgICAgIC8vIFRyYW5zbWl0IFBvbGwgRGVtYW5kIHJlZ2lzdGVyCisjZGVmaW5lIFJYUERfUkVHICAgICAgMHgxYyAgICAgICAgLy8gUmVjZWl2ZSBQb2xsIERlbWFuZCByZWdpc3RlcgorI2RlZmluZSBUWFJfQkFEUl9SRUcgICAgICAgICAgICAweDIwICAgICAgICAvLyBUcmFuc21pdCBSaW5nIEJhc2UgQWRkcmVzcyByZWdpc3RlcgorI2RlZmluZSBSWFJfQkFEUl9SRUcgICAgICAgICAgICAweDI0ICAgICAgICAvLyBSZWNlaXZlIFJpbmcgQmFzZSBBZGRyZXNzIHJlZ2lzdGVyCisKKyNkZWZpbmUgSFBUWFBEX1JFRyAgICAgIDB4MjggIC8vCisjZGVmaW5lIEhQVFhSX0JBRFJfUkVHICAgICAgICAgICAgMHgyYyAgLy8KKworI2RlZmluZSBJVENfUkVHICAgICAgIDB4MzAgICAgICAgIC8vIGludGVycnVwdCB0aW1lciBjb250cm9sIHJlZ2lzdGVyCisjZGVmaW5lIEFQVENfUkVHICAgICAgMHgzNCAgICAgICAgLy8gQXV0b21hdGljIFBvbGxpbmcgVGltZXIgY29udHJvbCByZWdpc3RlcgorI2RlZmluZSBEQkxBQ19SRUcgICAgIDB4MzggICAgICAgIC8vIERNQSBCdXJzdCBMZW5ndGggYW5kIEFyYml0cmF0aW9uIGNvbnRyb2wgcmVnaXN0ZXIKKworI2RlZmluZSBETUFGSUZPU19SRUcgICAgICAgICAgICAweDNjICAvLworI2RlZmluZSBGRUFSX1JFRyAgICAgIDB4NDQgIC8vCisjZGVmaW5lIFRQQUZDUl9SRUcgICAgICAweDQ4ICAvLworI2RlZmluZSBSQlNSX1JFRyAgICAgIDB4NGMgIC8vZm9yIE5DIEJvZHkKKyNkZWZpbmUgTUFDQ1JfUkVHICAgICAweDUwICAgICAgICAvLyBNQUMgY29udHJvbCByZWdpc3RlcgorI2RlZmluZSBNQUNTUl9SRUcgICAgIDB4NTQgICAgICAgIC8vIE1BQyBzdGF0dXMgcmVnaXN0ZXIKKyNkZWZpbmUgUEhZQ1JfUkVHICAgICAweDYwICAgICAgICAvLyBQSFkgY29udHJvbCByZWdpc3RlcgorI2RlZmluZSBQSFlEQVRBX1JFRyAgICAgMHg2NCAgICAgICAgLy8gUEhZIFdyaXRlIERhdGEgcmVnaXN0ZXIKKyNkZWZpbmUgRkNSX1JFRyAgICAgICAweDY4ICAgICAgICAvLyBGbG93IENvbnRyb2wgcmVnaXN0ZXIKKyNkZWZpbmUgQlBSX1JFRyAgICAgICAweDZjICAgICAgICAvLyBiYWNrIHByZXNzdXJlIHJlZ2lzdGVyCisjZGVmaW5lIFdPTENSX1JFRyAgICAgMHg3MCAgICAgICAgLy8gV2FrZS1Pbi1MYW4gY29udHJvbCByZWdpc3RlcgorI2RlZmluZSBXT0xTUl9SRUcgICAgIDB4NzQgICAgICAgIC8vIFdha2UtT24tTGFuIHN0YXR1cyByZWdpc3RlcgorI2RlZmluZSBXRkNSQ19SRUcgICAgIDB4NzggICAgICAgIC8vIFdha2UtdXAgRnJhbWUgQ1JDIHJlZ2lzdGVyCisjZGVmaW5lIFdGQk0xX1JFRyAgICAgMHg4MCAgICAgICAgLy8gd2FrZS11cCBmcmFtZSBieXRlIG1hc2sgMXN0IGRvdWJsZSB3b3JkIHJlZ2lzdGVyCisjZGVmaW5lIFdGQk0yX1JFRyAgICAgMHg4NCAgICAgICAgLy8gd2FrZS11cCBmcmFtZSBieXRlIG1hc2sgMm5kIGRvdWJsZSB3b3JkIHJlZ2lzdGVyCisjZGVmaW5lIFdGQk0zX1JFRyAgICAgMHg4OCAgICAgICAgLy8gd2FrZS11cCBmcmFtZSBieXRlIG1hc2sgM3JkIGRvdWJsZSB3b3JkIHJlZ2lzdGVyCisjZGVmaW5lIFdGQk00X1JFRyAgICAgMHg4YyAgICAgICAgLy8gd2FrZS11cCBmcmFtZSBieXRlIG1hc2sgNHRoIGRvdWJsZSB3b3JkIHJlZ2lzdGVyCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgIE1BQ0NSX1JFRworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBTV19SU1RfYml0ICAgICAgKDFVTDw8MzEpICAgICAgIC8vIHNvZnR3YXJlIHJlc2V0LworI2RlZmluZSBESVJQQVRIX2JpdCAgICAgKDFVTDw8MjEpCisjZGVmaW5lIFJYX0lQQ1NfRkFJTF9iaXQgICgxVUw8PDIwKSAvLworI2RlZmluZSBSWF9UQ1BDU19GQUlMX2JpdCAoMVVMPDwxOSkgLy8KKyNkZWZpbmUgU1BFRURfMTAwTV9NT0RFX2JpdCAgICAgKDFVTDw8MTkpCisjZGVmaW5lIFJYX1VEUENTX0ZBSUxfYml0ICgxVUw8PDE4KSAvLworI2RlZmluZSBSWF9CUk9BRFBLVF9iaXQgICAoMVVMPDwxNykgICAgICAgLy8gUmVjZWl2aW5nIGJyb2FkY2FzdCBwYWNrZXQKKyNkZWZpbmUgUlhfTVVMVElQS1RfYml0ICAgKDFVTDw8MTYpICAgICAgIC8vIHJlY2VpdmluZyBtdWx0aWNhc3QgcGFja2V0CisjZGVmaW5lIFJYX0hUX0VOX2JpdCAgICAoMVVMPDwxNSkKKyNkZWZpbmUgUlhfQUxMQURSX2JpdCAgICgxVUw8PDE0KSAgICAgICAvLyBub3QgY2hlY2sgaW5jb21pbmcgcGFja2V0J3MgZGVzdGluYXRpb24gYWRkcmVzcworI2RlZmluZSBKVU1CT19MRl9iaXQgICAgKDFVTDw8MTMpIC8vCisjZGVmaW5lIFJYX1JVTlRfYml0ICAgICAoMVVMPDwxMikgICAgICAgLy8gU3RvcmUgaW5jb21pbmcgcGFja2V0IGV2ZW4gaXRzIGxlbmd0aCBpcyBsZXMgdGhhbiA2NCBieXRlCisjZGVmaW5lIENSQ19DSEtfYml0ICAgICAoMVVMPDwxMSkgLy8KKyNkZWZpbmUgQ1JDX0FQRF9iaXQgICAgICgxVUw8PDEwKSAgICAgICAvLyBhcHBlbmQgY3JjIHRvIHRyYW5zbWl0IHBhY2tldAorI2RlZmluZSBHTUFDX01PREVfYml0ICAgKDFVTDw8OSkgIC8vCisjZGVmaW5lIEZVTExEVVBfYml0ICAgICAoMVVMPDw4KSAgICAgICAgLy8gZnVsbCBkdXBsZXgKKyNkZWZpbmUgRU5SWF9JTl9IQUxGVFhfYml0ICAoMVVMPDw3KSAgLy8KKyNkZWZpbmUgTE9PUF9FTl9iaXQgICAgICgxVUw8PDYpICAgICAgICAvLyBJbnRlcm5hbCBsb29wLWJhY2sKKyNkZWZpbmUgSFBUWFJfRU5fYml0ICAgICgxVUw8PDUpICAvLworI2RlZmluZSBSRU1PVkVfVkxBTl9iaXQgICAoMVVMPDw0KSAgLy8KKyNkZWZpbmUgUlhNQUNfRU5fYml0ICAgICgxVUw8PDMpICAgICAgICAvLyByZWNlaXZlciBlbmFibGUKKyNkZWZpbmUgVFhNQUNfRU5fYml0ICAgICgxVUw8PDIpICAgICAgICAvLyB0cmFuc21pdHRlciBlbmFibGUKKyNkZWZpbmUgUlhETUFfRU5fYml0ICAgICgxVUw8PDEpICAgICAgICAvLyBlbmFibGUgRE1BIHJlY2VpdmluZyBjaGFubmVsCisjZGVmaW5lIFRYRE1BX0VOX2JpdCAgICAoMVVMPDwwKSAgICAgICAgLy8gZW5hYmxlIERNQSB0cmFuc21pdHRpbmcgY2hhbm5lbAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFBIWSBSL1cgUmVnaXN0ZXIgQml0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBNSUlXUiAgICAgICAgICAgICAgICAgICAoMVVMPDwyNykKKyNkZWZpbmUgTUlJUkQgICAgICAgICAgICAgICAgICAgKDFVTDw8MjYpCisjZGVmaW5lIE1EQ19DWUNUSFIgICAgICAgICAgICAgIDB4MzQKKyNkZWZpbmUgUEhZX1NQRUVEX01BU0sgICAgICAgICAgMHhDMDAwCisjZGVmaW5lIFBIWV9EVVBMRVhfTUFTSyAgICAgICAgIDB4MjAwMAorI2RlZmluZSBTUEVFRF8xMDAwTSAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFNQRUVEXzEwME0gICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgU1BFRURfMTBNICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBEVVBMRVhfRlVMTCAgICAgICAgICAgICAweDAxCisjZGVmaW5lIERVUExFWF9IQUxGICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUkVTT0xWRURfQklUICAgICAgICAgICAgMHg4MDAKKworI2RlZmluZSBQSFlfU1BFRURfRFVQTEVYX01BU0sgICAweDAxRTAKKyNkZWZpbmUgUEhZXzEwME1fRFVQTEVYICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFBIWV8xMDBNX0hBTEYgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBQSFlfMTBNX0RVUExFWCAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgUEhZXzEwTV9IQUxGICAgICAgICAgICAgMHgwMDIwCisKKworCisvKiBEZXNjcmlwdG9yIGJpdHMuCisgKi8KKyNkZWZpbmUgVFhETUFfT1dOIDB4ODAwMDAwMDAgIC8qIE93biBCaXQgKi8KKyNkZWZpbmUgUlhQS1RfUkRZICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgUlhQS1RfU1RBVFVTICAgIDB4ODAwMDAwMDAKKy8vI2RlZmluZSBFRE9SUiAgIDB4MDAwMDgwMDAgIC8qIFJlY2VpdmUgRW5kIE9mIFJpbmcgKi8KKyNkZWZpbmUgRURPUlIgICAweDQwMDAwMDAwICAvKiBSZWNlaXZlIEVuZCBPZiBSaW5nICovCisjZGVmaW5lIExSUyAgIDB4MTAwMDAwMDAgIC8qIExhc3QgRGVzY3JpcHRvciAqLworI2RlZmluZSBSRF9FUyAgIDB4MDAwMDgwMDAgIC8qIEVycm9yIFN1bW1hcnkgKi8KKy8vI2RlZmluZSBFRE9UUiAgIDB4MDAwMDgwMDAgIC8qIFRyYW5zbWl0IEVuZCBPZiBSaW5nICovCisjZGVmaW5lIEVET1RSICAgMHg0MDAwMDAwMCAgLyogVHJhbnNtaXQgRW5kIE9mIFJpbmcgKi8KKyNkZWZpbmUgVF9PV04gICAweDgwMDAwMDAwICAvKiBPd24gQml0ICovCisjZGVmaW5lIExUUyAgIDB4MTAwMDAwMDAgIC8qIExhc3QgU2VnbWVudCAqLworI2RlZmluZSBGVFMgICAweDIwMDAwMDAwICAvKiBGaXJzdCBTZWdtZW50ICovCisjZGVmaW5lIENSQ19FUlIgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIFREX0VTICAgMHgwMDAwODAwMCAgLyogRXJyb3IgU3VtbWFyeSAqLworI2RlZmluZSBURF9TRVQgICAgMHgwODAwMDAwMCAgLyogU2V0dXAgUGFja2V0ICovCisjZGVmaW5lIFJYX0VSUiAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIEZUTCAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIFJVTlQgICAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIFJYX09ERF9OQiAgICAgICAweDAwNDAwMDAwCisKKyNkZWZpbmUgUE9MTF9ERU1BTkQgMQorI2RlZmluZSBSRVNFVF9ERTRYNShkZXYpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGk9SU5MKGRldiwgTUFDQ1JfUkVHKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVkZWxheSgxMDAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9VVEwoZGV2LCBpIHwgU1dfUlNUX2JpdCwgTUFDQ1JfUkVHKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoOyAoSU5MKGRldiwgTUFDQ1JfUkVHICkgJiBTV19SU1RfYml0KSAhPSAwOyApIHt1ZGVsYXkoMTAwMCk7fSAgXAorICAgIE9VVEwoZGV2LCAwLCBJRVJfUkVHICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgU1RBUlRfTUFDKGRldikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgczMyIG9tcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9tciA9IElOTChkZXYsIE1BQ0NSX1JFRyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvbXIgfD0gUlhNQUNfRU5fYml0IHwgVFhNQUNfRU5fYml0IHwgUlhETUFfRU5fYml0IHwgVFhETUFfRU5fYml0OyBcCisgICAgT1VUTChkZXYsIG9tciwgTUFDQ1JfUkVHKTsgICAgLyogRW5hYmxlIHRoZSBUWCBhbmQvb3IgUlggKi8gICAgICAgXAorICB9CisKKyNkZWZpbmUgU1RPUF9NQUMoZGV2KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzMzIgb21yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvbXIgPSBJTkwoZGV2LCBNQUNDUl9SRUcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvbXIgJj0gfihSWE1BQ19FTl9iaXQgfCBUWE1BQ19FTl9iaXQgfCBSWERNQV9FTl9iaXQgfCBUWERNQV9FTl9iaXQpOyBcCisgICAgT1VUTChkZXYsIG9tciwgTUFDQ1JfUkVHKTsgICAgLyogRGlzYWJsZSB0aGUgVFggYW5kL29yIFJYICovICAgICAgICBcCisgIH0KKworI2RlZmluZSBOVU1fUlhfREVTQyBQS1RCVUZTUlgKKyNkZWZpbmUgTlVNX1RYX0RFU0MgMSAgICAgLyogTnVtYmVyIG9mIFRYIGRlc2NyaXB0b3JzICAgKi8KKyNkZWZpbmUgUlhfQlVGRl9TWiAgUEtUU0laRV9BTElHTgorI2RlZmluZSBUWF9CVUZGX1NaICAxNTE0CisKKyNkZWZpbmUgVE9VVF9MT09QICAgMTAwMDAwMAorI2RlZmluZSBQSFlfTE9PUCAgICAyNTAKKyNkZWZpbmUgRVRIX0FMRU4gIDYKKyNkZWZpbmUgTkNTSV9MT09QICAgMTUwMDAwMAorI2RlZmluZSBSRVRSWV9DT1VOVCAgICAgMQorCitzdHJ1Y3QgZGU0eDVfZGVzYyB7CisgIHZvbGF0aWxlIHMzMiBzdGF0dXM7CisgIHUzMiBkZXMxOworICB1MzIgcmVzZXJ2ZWQ7CisgIHUzMiBidWY7Cit9OworCisvL1BIWSBJbmZvcm1hdGlvbgorI2RlZmluZSBQSFlJRF9WRU5ET1JfTUFTSyAgIDB4ZmZmZmZjMDAKKyNkZWZpbmUgUEhZSURfVkVORE9SX01PREVMX01BU0sgICAweGZmZmZmZmYwCisjZGVmaW5lIFBIWUlEX1ZFTkRPUl9NQVJWRUxMICAgIDB4MDE0MTBjMDAKKyNkZWZpbmUgUEhZSURfVkVORE9SX0JST0FEQ09NICAgMHgwMDQwNjAwMAorI2RlZmluZSBQSFlJRF9WRU5ET1JfUkVBTFRFSyAgICAweDAwMWNjODAwCisjZGVmaW5lIFBIWUlEX1JUTDgyMDFFTCAgICAgMHgwMDFjYzgxMAorI2RlZmluZSBQSFlJRF9SVEw4MjExICAgICAgICAgMHgwMDFjYzkxMAorI2RlZmluZSBQSFlJRF9CQ001NDYxMkUgICAgICAgICAgICAgMHgwMzYyNUU2QQorCisvL05DU0kgZGVmaW5lICYgc3RydWN0dXJlCisvL05DLVNJIENvbW1hbmQgUGFja2V0Cit0eXBlZGVmIHN0cnVjdCB7CisvL0V0aGVybmV0IEhlYWRlcgorICB1bnNpZ25lZCBjaGFyICBEQVs2XTsKKyAgdW5zaWduZWQgY2hhciAgU0FbNl07CisgIHVuc2lnbmVkIHNob3J0IEV0aGVyVHlwZTsgICAgICAgICAgIC8vRE1URiBOQy1TSQorLy9OQy1TSSBDb250cm9sIFBhY2tldAorICB1bnNpZ25lZCBjaGFyICBNQ19JRDsgICAgICAgICAgIC8vTWFuYWdlbWVudCBDb250cm9sbGVyIHNob3VsZCBzZXQgdGhpcyBmaWVsZCB0byAweDAwCisgIHVuc2lnbmVkIGNoYXIgIEhlYWRlcl9SZXZpc2lvbjsgICAgICAgICAvL0ZvciBOQy1TSSAxLjAgc3BlYywgdGhpcyBmaWVsZCBoYXMgdG8gc2V0IDB4MDEKKyAgdW5zaWduZWQgY2hhciAgUmVzZXJ2ZWRfMTsgICAgICAgICAgICAvL1Jlc2VydmVkIGhhcyB0byBzZXQgdG8gMHgwMAorICB1bnNpZ25lZCBjaGFyICBJSUQ7ICAgICAgICAgICAgIC8vSW5zdGFuY2UgSUQKKyAgdW5zaWduZWQgY2hhciAgQ29tbWFuZDsKKyAgdW5zaWduZWQgY2hhciAgQ2hhbm5lbF9JRDsKKyAgdW5zaWduZWQgc2hvcnQgUGF5bG9hZF9MZW5ndGg7ICAgICAgICAgIC8vUGF5bG9hZCBMZW5ndGggPSAxMiBiaXRzLCA0IGJpdHMgYXJlIHJlc2VydmVkCisgIHVuc2lnbmVkIGxvbmcgIFJlc2VydmVkXzI7CisgIHVuc2lnbmVkIGxvbmcgIFJlc2VydmVkXzM7Cit9ICBOQ1NJX0NvbW1hbmRfUGFja2V0OworCit1bnNpZ25lZCBjaGFyICBQYXlsb2FkX0RhdGFbMTZdOwordW5zaWduZWQgY2hhciAgUGF5bG9hZF9QYWRbNF0gPSB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Cit1bnNpZ25lZCBsb25nICBQYXlsb2FkX0NoZWNrc3VtID0gMHgwMDAwMDAwMDsKKworCisvL0NvbW1hbmQgYW5kIFJlc3BvbnNlIFR5cGUKKyNkZWZpbmUgQ0xFQVJfSU5JVElBTF9TVEFURSAgICAgMHgwMCAgICAgIC8vTQorI2RlZmluZSBTRUxFQ1RfUEFDS0FHRSAgICAgICAgMHgwMSAgICAgIC8vTQorI2RlZmluZSBERVNFTEVDVF9QQUNLQUdFICAgICAgMHgwMiAgICAgIC8vTQorI2RlZmluZSBFTkFCTEVfQ0hBTk5FTCAgICAgICAgMHgwMyAgICAgIC8vTQorI2RlZmluZSBESVNBQkxFX0NIQU5ORUwgICAgICAgMHgwNCAgICAgIC8vTQorI2RlZmluZSBSRVNFVF9DSEFOTkVMICAgICAgIDB4MDUgICAgICAvL00KKyNkZWZpbmUgRU5BQkxFX0NIQU5ORUxfTkVUV09SS19UWCAgIDB4MDYgICAgICAvL00KKyNkZWZpbmUgRElTQUJMRV9DSEFOTkVMX05FVFdPUktfVFggICAgMHgwNyAgICAgIC8vTQorI2RlZmluZSBBRU5fRU5BQkxFICAgICAgICAweDA4CisjZGVmaW5lIFNFVF9MSU5LICAgICAgICAweDA5ICAgICAgLy9NCisjZGVmaW5lIEdFVF9MSU5LX1NUQVRVUyAgICAgICAweDBBICAgICAgLy9NCisjZGVmaW5lIFNFVF9WTEFOX0ZJTFRFUiAgICAgICAweDBCICAgICAgLy9NCisjZGVmaW5lIEVOQUJMRV9WTEFOICAgICAgIDB4MEMgICAgICAvL00KKyNkZWZpbmUgRElTQUJMRV9WTEFOICAgICAgICAweDBEICAgICAgLy9NCisjZGVmaW5lIFNFVF9NQUNfQUREUkVTUyAgICAgICAweDBFICAgICAgLy9NCisjZGVmaW5lIEVOQUJMRV9CUk9BRENBU1RfRklMVEVSSU5HICAgIDB4MTAgICAgICAvL00KKyNkZWZpbmUgRElTQUJMRV9CUk9BRENBU1RfRklMVEVSSU5HICAgMHgxMSAgICAgIC8vTQorI2RlZmluZSBFTkFCTEVfR0xPQkFMX01VTFRJQ0FTVF9GSUxURVJJTkcgMHgxMgorI2RlZmluZSBESVNBQkxFX0dMT0JBTF9NVUxUSUNBU1RfRklMVEVSSU5HICAweDEzCisjZGVmaW5lIFNFVF9OQ1NJX0ZMT1dfQ09OVFJPTCAgICAgMHgxNAorI2RlZmluZSBHRVRfVkVSU0lPTl9JRCAgICAgICAgMHgxNSAgICAgIC8vTQorI2RlZmluZSBHRVRfQ0FQQUJJTElUSUVTICAgICAgMHgxNiAgICAgIC8vTQorI2RlZmluZSBHRVRfUEFSQU1FVEVSUyAgICAgICAgMHgxNyAgICAgIC8vTQorI2RlZmluZSBHRVRfQ09OVFJPTExFUl9QQUNLRVRfU1RBVElTVElDUyAgMHgxOAorI2RlZmluZSBHRVRfTkNTSV9TVEFUSVNUSUNTICAgICAweDE5CisjZGVmaW5lIEdFVF9OQ1NJX1BBU1NfVEhST1VHSF9TVEFUSVNUSUNTICAweDFBCisKKy8vTkMtU0kgUmVzcG9uc2UgUGFja2V0Cit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGNoYXIgIERBWzZdOworICB1bnNpZ25lZCBjaGFyICBTQVs2XTsKKyAgdW5zaWduZWQgc2hvcnQgRXRoZXJUeXBlOyAgICAgICAgICAgLy9ETVRGIE5DLVNJCisvL05DLVNJIENvbnRyb2wgUGFja2V0CisgIHVuc2lnbmVkIGNoYXIgIE1DX0lEOyAgICAgICAgICAgLy9NYW5hZ2VtZW50IENvbnRyb2xsZXIgc2hvdWxkIHNldCB0aGlzIGZpZWxkIHRvIDB4MDAKKyAgdW5zaWduZWQgY2hhciAgSGVhZGVyX1JldmlzaW9uOyAgICAgICAgIC8vRm9yIE5DLVNJIDEuMCBzcGVjLCB0aGlzIGZpZWxkIGhhcyB0byBzZXQgMHgwMQorICB1bnNpZ25lZCBjaGFyICBSZXNlcnZlZF8xOyAgICAgICAgICAgIC8vUmVzZXJ2ZWQgaGFzIHRvIHNldCB0byAweDAwCisgIHVuc2lnbmVkIGNoYXIgIElJRDsgICAgICAgICAgICAgLy9JbnN0YW5jZSBJRAorICB1bnNpZ25lZCBjaGFyICBDb21tYW5kOworICB1bnNpZ25lZCBjaGFyICBDaGFubmVsX0lEOworICB1bnNpZ25lZCBzaG9ydCBQYXlsb2FkX0xlbmd0aDsgICAgICAgICAgLy9QYXlsb2FkIExlbmd0aCA9IDEyIGJpdHMsIDQgYml0cyBhcmUgcmVzZXJ2ZWQKKyAgdW5zaWduZWQgc2hvcnQgIFJlc2VydmVkXzI7CisgIHVuc2lnbmVkIHNob3J0ICBSZXNlcnZlZF8zOworICB1bnNpZ25lZCBzaG9ydCAgUmVzZXJ2ZWRfNDsKKyAgdW5zaWduZWQgc2hvcnQgIFJlc2VydmVkXzU7CisgIHVuc2lnbmVkIHNob3J0ICBSZXNwb25zZV9Db2RlOworICB1bnNpZ25lZCBzaG9ydCAgUmVhc29uX0NvZGU7CisgIHVuc2lnbmVkIGNoYXIgICBQYXlsb2FkX0RhdGFbNjRdOworfSAgTkNTSV9SZXNwb25zZV9QYWNrZXQ7CisKK05DU0lfQ29tbWFuZF9QYWNrZXQgTkNTSV9SZXF1ZXN0OworTkNTSV9SZXNwb25zZV9QYWNrZXQgTkNTSV9SZXNwb25kOworCisvL1N0YW5kYXJkIFJlc3BvbnNlIENvZGUKKyNkZWZpbmUgQ09NTUFORF9DT01QTEVURUQgICAgIDB4MDAKKyNkZWZpbmUgQ09NTUFORF9GQUlMRUQgICAgICAgIDB4MDEKKyNkZWZpbmUgQ09NTUFORF9VTkFWQUlMQUJMRSAgICAgMHgwMgorI2RlZmluZSBDT01NQU5EX1VOU1VQUE9SVEVEICAgICAweDAzCisKKy8vU3RhbmRhcmQgUmVhc29uIENvZGUKKyNkZWZpbmUgTk9fRVJST1IgICAgICAgIDB4MDAwMAorI2RlZmluZSBJTlRFUkZBQ0VfSU5JVElBTElaQVRJT05fUkVRVUlSRUQgMHgwMDAxCisjZGVmaW5lIFBBUkFNRVRFUl9JU19JTlZBTElEICAgICAgMHgwMDAyCisjZGVmaW5lIENIQU5ORUxfTk9UX1JFQURZICAgICAweDAwMDMKKyNkZWZpbmUgUEFDS0FHRV9OT1RfUkVBRFkgICAgIDB4MDAwNAorI2RlZmluZSBJTlZBTElEX1BBWUxPQURfTEVOR1RIICAgICAgMHgwMDA1CisjZGVmaW5lIFVOS05PV05fQ09NTUFORF9UWVBFICAgICAgMHg3RkZGCisKKworc3RydWN0IEFFTl9QYWNrZXQgeworLy9FdGhlcm5ldCBIZWFkZXIKKyAgdW5zaWduZWQgY2hhciAgREFbNl07CisgIHVuc2lnbmVkIGNoYXIgIFNBWzZdOyAgICAgICAgICAgLy9OZXR3b3JrIENvbnRyb2xsZXIgU0EgPSBGRjpGRjpGRjpGRjpGRjpGRgorICB1bnNpZ25lZCBzaG9ydCBFdGhlclR5cGU7ICAgICAgICAgICAvL0RNVEYgTkMtU0kKKy8vQUVOIFBhY2tldCBGb3JtYXQKKyAgdW5zaWduZWQgY2hhciAgTUNfSUQ7ICAgICAgICAgICAvL05ldHdvcmsgQ29udHJvbGxlciBzaG91bGQgc2V0IHRoaXMgZmllbGQgdG8gMHgwMAorICB1bnNpZ25lZCBjaGFyICBIZWFkZXJfUmV2aXNpb247ICAgICAgICAgLy9Gb3IgTkMtU0kgMS4wIHNwZWMsIHRoaXMgZmllbGQgaGFzIHRvIHNldCAweDAxCisgIHVuc2lnbmVkIGNoYXIgIFJlc2VydmVkXzE7ICAgICAgICAgICAgLy9SZXNlcnZlZCBoYXMgdG8gc2V0IHRvIDB4MDAKKy8vICAgIHVuc2lnbmVkIGNoYXIgIElJRCA9IDB4MDA7ICAgICAgICAgICAgLy9JbnN0YW5jZSBJRCA9IDAgaW4gTmV0d29yayBDb250cm9sbGVyCisvLyAgICB1bnNpZ25lZCBjaGFyICBDb21tYW5kID0gMHhGRjsgICAgICAgICAgLy9BRU4gPSAweEZGCisgIHVuc2lnbmVkIGNoYXIgIENoYW5uZWxfSUQ7CisvLyAgICB1bnNpZ25lZCBzaG9ydCBQYXlsb2FkX0xlbmd0aCA9IDB4MDQ7ICAgICAgIC8vUGF5bG9hZCBMZW5ndGggPSA0IGluIE5ldHdvcmsgQ29udHJvbGxlciBBRU4gUGFja2V0CisgIHVuc2lnbmVkIGxvbmcgIFJlc2VydmVkXzI7CisgIHVuc2lnbmVkIGxvbmcgIFJlc2VydmVkXzM7CisgIHVuc2lnbmVkIGNoYXIgIEFFTl9UeXBlOworLy8gICAgdW5zaWduZWQgY2hhciAgUmVzZXJ2ZWRfNFszXSA9IHsweDAwLCAweDAwLCAweDAwfTsKKyAgdW5zaWduZWQgbG9uZyAgT3B0aW9uYWxfQUVOX0RhdGE7CisgIHVuc2lnbmVkIGxvbmcgIFBheWxvYWRfQ2hlY2tzdW07Cit9OworCisvL0FFTiBUeXBlCisjZGVmaW5lIExJTktfU1RBVFVTX0NIQU5HRSAgICAgIDB4MAorI2RlZmluZSBDT05GSUdVUkFUSU9OX1JFUVVJUkVEICAgICAgMHgxCisjZGVmaW5lIEhPU1RfTkNfRFJJVkVSX1NUQVRVU19DSEFOR0UgICAgMHgyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgY2hhciBQYWNrYWdlX0lEOworICB1bnNpZ25lZCBjaGFyIENoYW5uZWxfSUQ7CisgIHVuc2lnbmVkIGxvbmcgQ2FwYWJpbGl0aWVzX0ZsYWdzOworICB1bnNpZ25lZCBsb25nIEJyb2FkY2FzdF9QYWNrZXRfRmlsdGVyX0NhcGFiaWxpdGllczsKKyAgdW5zaWduZWQgbG9uZyBNdWx0aWNhc3RfUGFja2V0X0ZpbHRlcl9DYXBhYmlsaXRpZXM7CisgIHVuc2lnbmVkIGxvbmcgQnVmZmVyaW5nX0NhcGFiaWxpdGllczsKKyAgdW5zaWduZWQgbG9uZyBBRU5fQ29udHJvbF9TdXBwb3J0OworfSBOQ1NJX0NhcGFiaWxpdHk7CitOQ1NJX0NhcGFiaWxpdHkgTkNTSV9DYXA7CisKKy8vU0VUX01BQ19BRERSRVNTCisjZGVmaW5lIFVOSUNBU1QgICAoMHgwMCA8PCA1KQorI2RlZmluZSBNVUxUSUNBU1QgKDB4MDEgPDwgNSkKKyNkZWZpbmUgRElTQUJMRV9NQUNfQUREUkVTU19GSUxURVIgIDB4MDAKKyNkZWZpbmUgRU5BQkxFX01BQ19BRERSRVNTX0ZJTFRFUiAweDAxCisKKy8vR0VUX0xJTktfU1RBVFVTCisjZGVmaW5lIExJTktfRE9XTiAwCisjZGVmaW5lIExJTktfVVAgICAxCisKK3N0YXRpYyBzdHJ1Y3QgZGU0eDVfZGVzYyByeF9yaW5nW05VTV9SWF9ERVNDXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgzMikpKTsgLyogUlggZGVzY3JpcHRvciByaW5nICAgICAgICAgKi8KK3N0YXRpYyBzdHJ1Y3QgZGU0eDVfZGVzYyB0eF9yaW5nW05VTV9UWF9ERVNDXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgzMikpKTsgLyogVFggZGVzY3JpcHRvciByaW5nICAgICAgICAgKi8KK3N0YXRpYyBpbnQgcnhfbmV3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUlggZGVzY3JpcHRvciByaW5nIHBvaW50ZXIgKi8KK3N0YXRpYyBpbnQgdHhfbmV3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVFggZGVzY3JpcHRvciByaW5nIHBvaW50ZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHR4X2J1ZmZlcltOVU1fVFhfREVTQ11bVFhfQlVGRl9TWl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMzIpKSk7CitzdGF0aWMgdW5zaWduZWQgY2hhciByeF9idWZmZXJbTlVNX1JYX0RFU0NdW1JYX0JVRkZfU1pdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDMyKSkpOworCisKK3N0YXRpYyBjaGFyIHJ4UmluZ1NpemU7CitzdGF0aWMgY2hhciB0eFJpbmdTaXplOworc3RhdGljIHVuc2lnbmVkIGludCBJbnN0YW5jZUlEID0gMDsKK3N0YXRpYyBpbnQgUmV0cnkgPSAwOworCitzdGF0aWMgaW50ICAgYXNwZWVkbmljX2luaXQoc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgYmRfdCogYmlzKTsKK3N0YXRpYyBpbnQgICBhc3BlZWRuaWNfc2VuZChzdHJ1Y3QgZXRoX2RldmljZSogZGV2LCB2b2xhdGlsZSB2b2lkICpwYWNrZXQsIGludCBsZW5ndGgpOworc3RhdGljIGludCAgIGFzcGVlZG5pY19yZWN2KHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpOworc3RhdGljIHZvaWQgIGFzcGVlZG5pY19oYWx0KHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpOworc3RhdGljIHZvaWQgIHNldF9tYWNfYWRkcmVzcyAoc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgYmRfdCogYmlzKTsKK3N0YXRpYyB2b2lkICBwaHlfd3JpdGVfcmVnaXN0ZXIgKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIHU4IFBIWV9SZWdpc3RlciwgdTggUEhZX0FkZHJlc3MsIHUxNiBQSFlfRGF0YSk7CitzdGF0aWMgdTE2ICAgcGh5X3JlYWRfcmVnaXN0ZXIgKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIHU4IFBIWV9SZWdpc3RlciwgdTggUEhZX0FkZHJlc3MpOworc3RhdGljIHZvaWQgIHNldF9tYWNfY29udHJvbF9yZWdpc3RlcihzdHJ1Y3QgZXRoX2RldmljZSogZGV2KTsKKworI2lmIGRlZmluZWQoQ09ORklHX0U1MDApCisjZGVmaW5lIHBoeXNfdG9fYnVzKGEpIChhKQorI2Vsc2UKKyNkZWZpbmUgcGh5c190b19idXMoYSkgIHBjaV9waHlzX3RvX21lbSgocGNpX2Rldl90KWRldi0+cHJpdiwgYSkKKyNlbmRpZgorCitzdGF0aWMgaW50IElOTChzdHJ1Y3QgZXRoX2RldmljZSogZGV2LCB1X2xvbmcgYWRkcikKK3sKKyAgcmV0dXJuIGxlMzJfdG9fY3B1KCoodm9sYXRpbGUgdV9sb25nICopKGFkZHIgKyBkZXYtPmlvYmFzZSkpOworfQorCitzdGF0aWMgdm9pZCBPVVRMKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIGludCBjb21tYW5kLCB1X2xvbmcgYWRkcikKK3sKKyAgKih2b2xhdGlsZSB1X2xvbmcgKikoYWRkciArIGRldi0+aW9iYXNlKSA9IGNwdV90b19sZTMyKGNvbW1hbmQpOworfQorCisKK3N0cnVjdCBldGhfZGV2aWNlIGFzcGVlZG5pY19kZXZpY2VbQ09ORklHX0FTUEVFRF9NQUNfTlVNQkVSXTsKKwordm9pZCBOQ1NJX1N0cnVjdF9Jbml0aWFsaXplKHZvaWQpCit7CisgIHVuc2lnbmVkIGxvbmcgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgTkNTSV9SZXF1ZXN0LkRBW2ldID0gMHhGRjsKKyAgICBOQ1NJX1Jlc3BvbmQuREFbaV0gPSAweEZGOworICAgIE5DU0lfUmVzcG9uZC5TQVtpXSA9IDB4RkY7CisgIH0KKyAgTkNTSV9SZXF1ZXN0LkV0aGVyVHlwZSA9IDB4Rjg4ODsKKyAgTkNTSV9SZXF1ZXN0Lk1DX0lEID0gMDsKKyAgTkNTSV9SZXF1ZXN0LkhlYWRlcl9SZXZpc2lvbiA9IDB4MDE7CisgIE5DU0lfUmVxdWVzdC5SZXNlcnZlZF8xID0gMDsKKyAgTkNTSV9SZXF1ZXN0LlJlc2VydmVkXzIgPSAwOworICBOQ1NJX1JlcXVlc3QuUmVzZXJ2ZWRfMyA9IDA7CisgIE5DU0lfUmVzcG9uZC5FdGhlclR5cGUgPSAweEY4ODg7CisgIE5DU0lfUmVzcG9uZC5NQ19JRCA9IDA7CisgIE5DU0lfUmVzcG9uZC5IZWFkZXJfUmV2aXNpb24gPSAweDAxOworICBOQ1NJX1Jlc3BvbmQuUmVzZXJ2ZWRfMSA9IDA7CisgIE5DU0lfUmVzcG9uZC5SZXNlcnZlZF8yID0gMDsKKyAgTkNTSV9SZXNwb25kLlJlc2VydmVkXzMgPSAwOworfQorCitpbnQgYXNwZWVkbmljX2luaXRpYWxpemUoYmRfdCAqYmlzKQoreworICBpbnQgICAgICAgICAgICAgICBjYXJkX251bWJlciA9IDA7CisgIHVuc2lnbmVkIGludCAgICBpb2Jhc2UsIFNDVVJlZ2lzdGVyOworICBzdHJ1Y3QgZXRoX2RldmljZSogIGRldjsKKworI2lmIGRlZmluZWQoQ09ORklHX0FTVDIzMDBfRlBHQV8yKSB8fCBkZWZpbmVkKENPTkZJR19BU1QyMzAwKSB8fCBkZWZpbmVkKENPTkZJR19BU1QzMTAwKSB8fCBkZWZpbmVkKENPTkZJR19BU1QyNDAwKQorLy9BU1QyMzAwCisvL01BQzEgQ0xPQ0svUkVTRVQvUEhZX0xJTksvTURDX01ESU8gaW4gU0NVCisgIFNDVVJlZ2lzdGVyID0gbGUzMl90b19jcHUoKih2b2xhdGlsZSB1X2xvbmcgKikoU0NVX0JBU0UgKyBTQ1VfUkVTRVRfQ09OVFJPTCkpOworICAqKHZvbGF0aWxlIHVfbG9uZyAqKShTQ1VfQkFTRSArIFNDVV9SRVNFVF9DT05UUk9MKSA9IGNwdV90b19sZTMyKFNDVVJlZ2lzdGVyIHwgMHg4MDApOworICB1ZGVsYXkoMTAwKTsKKyAgU0NVUmVnaXN0ZXIgPSBsZTMyX3RvX2NwdSgqKHZvbGF0aWxlIHVfbG9uZyAqKShTQ1VfQkFTRSArIFNDVV9DTE9DS19DT05UUk9MKSk7CisgICoodm9sYXRpbGUgdV9sb25nICopKFNDVV9CQVNFICsgU0NVX0NMT0NLX0NPTlRST0wpID0gY3B1X3RvX2xlMzIoU0NVUmVnaXN0ZXIgJiB+KE1BQzFfQ0xPQ0tfRU5BQkxFKSk7CisgIHVkZWxheSgxMDAwMCk7CisvL0FkZCBDbG9jayBTZWxlY3Rpb24gaW4gQVNUMjMwMCBBMSwgUGxlYXNlIGNoZWNrIHRoZSBkYXRhc2hlZXQgZm9yIG1vcmUgZGV0YWlsCisvL1RoZSBjdXJyZW50IHNhbXBsZSBjb2RlIHVzZXMgMDogSC1QTEwvMiBiZWNhdXNlIGFsbCBFVkJzIGhhdmUgUkdNSUkgaW50ZXJmYWNlCisvLyAgICAgICAgU0NVUmVnaXN0ZXIgPSBsZTMyX3RvX2NwdSgqKHZvbGF0aWxlIHVfbG9uZyAqKShTQ1VfQkFTRSArIFNDVV9DTE9DS19TRUxFQ1RJT04pKTsKKy8vICAqKHZvbGF0aWxlIHVfbG9uZyAqKShTQ1VfQkFTRSArIFNDVV9DTE9DS19TRUxFQ1RJT04pID0gY3B1X3RvX2xlMzIoU0NVUmVnaXN0ZXIgJiB+KE1BQ19BSEJfQ0xPQ0tfRElWSURFUikpOworICBTQ1VSZWdpc3RlciA9IGxlMzJfdG9fY3B1KCoodm9sYXRpbGUgdV9sb25nICopKFNDVV9CQVNFICsgU0NVX1JFU0VUX0NPTlRST0wpKTsKKyAgKih2b2xhdGlsZSB1X2xvbmcgKikoU0NVX0JBU0UgKyBTQ1VfUkVTRVRfQ09OVFJPTCkgPSBjcHVfdG9fbGUzMihTQ1VSZWdpc3RlciAmIH4oMHg4MDApKTsKKyAgU0NVUmVnaXN0ZXIgPSBsZTMyX3RvX2NwdSgqKHZvbGF0aWxlIHVfbG9uZyAqKShTQ1VfQkFTRSArIFNDVV9NVUxUSUZVTkNUSU9OX1BJTl9DVEwzX1JFRykpOworICAqKHZvbGF0aWxlIHVfbG9uZyAqKShTQ1VfQkFTRSArIFNDVV9NVUxUSUZVTkNUSU9OX1BJTl9DVEwzX1JFRykgPSBjcHVfdG9fbGUzMihTQ1VSZWdpc3RlciB8IChNQUMxX01ESU8gfCBNQUMxX01EQykpOworLy8gICAgICAgIFNDVVJlZ2lzdGVyID0gbGUzMl90b19jcHUoKih2b2xhdGlsZSB1X2xvbmcgKikoU0NVX0JBU0UgKyBTQ1VfTUFDX0NMT0NLX0RFTEFZKSk7CisvL0N1cnJlbnRseSB3ZSB1c2UgZml4IHZhbHVlIGluIE1BQyB0aW1pbmcgb24gRVZCCisvLyAgKih2b2xhdGlsZSB1X2xvbmcgKikoU0NVX0JBU0UgKyBTQ1VfTUFDX0NMT0NLX0RFTEFZKSA9IENPTkZJR19NQUNfSU5URVJGQUNFX0NMT0NLX0RFTEFZOworI2lmZGVmIENPTkZJR19NQUMxX1BIWV9MSU5LX0lOVEVSUlVQVAorICBTQ1VSZWdpc3RlciA9IGxlMzJfdG9fY3B1KCoodm9sYXRpbGUgdV9sb25nICopKFNDVV9CQVNFICsgU0NVX01VTFRJRlVOQ1RJT05fUElOX0NUTDFfUkVHKSk7CisgICoodm9sYXRpbGUgdV9sb25nICopKFNDVV9CQVNFICsgU0NVX01VTFRJRlVOQ1RJT05fUElOX0NUTDFfUkVHKSA9IGNwdV90b19sZTMyKFNDVVJlZ2lzdGVyIHwgKE1BQzFfUEhZX0xJTkspKTsKKyNlbmRpZgorCisvL01BQzIgQ0xPQ0svUkVTRVQvUEhZX0xJTksvTURDX01ESU8KKyNpZmRlZiBDT05GSUdfTUFDMl9FTkFCTEUKKyAgU0NVUmVnaXN0ZXIgPSBsZTMyX3RvX2NwdSgqKHZvbGF0aWxlIHVfbG9uZyAqKShTQ1VfQkFTRSArIFNDVV9SRVNFVF9DT05UUk9MKSk7CisgICoodm9sYXRpbGUgdV9sb25nICopKFNDVV9CQVNFICsgU0NVX1JFU0VUX0NPTlRST0wpID0gY3B1X3RvX2xlMzIoU0NVUmVnaXN0ZXIgfCAweDEwMDApOworICB1ZGVsYXkoMTApOworICBTQ1VSZWdpc3RlciA9IGxlMzJfdG9fY3B1KCoodm9sYXRpbGUgdV9sb25nICopKFNDVV9CQVNFICsgU0NVX0NMT0NLX0NPTlRST0wpKTsKKyAgKih2b2xhdGlsZSB1X2xvbmcgKikoU0NVX0JBU0UgKyBTQ1VfQ0xPQ0tfQ09OVFJPTCkgPSBjcHVfdG9fbGUzMihTQ1VSZWdpc3RlciAmIH4oTUFDMl9DTE9DS19FTkFCTEUpKTsKKyAgdWRlbGF5KDEwMDAwKTsKKyAgU0NVUmVnaXN0ZXIgPSBsZTMyX3RvX2NwdSgqKHZvbGF0aWxlIHVfbG9uZyAqKShTQ1VfQkFTRSArIFNDVV9SRVNFVF9DT05UUk9MKSk7CisgICoodm9sYXRpbGUgdV9sb25nICopKFNDVV9CQVNFICsgU0NVX1JFU0VUX0NPTlRST0wpID0gY3B1X3RvX2xlMzIoU0NVUmVnaXN0ZXIgJiB+KDB4MTAwMCkpOworICBTQ1VSZWdpc3RlciA9IGxlMzJfdG9fY3B1KCoodm9sYXRpbGUgdV9sb25nICopKFNDVV9CQVNFICsgU0NVX01VTFRJRlVOQ1RJT05fUElOX0NUTDVfUkVHKSk7CisgICoodm9sYXRpbGUgdV9sb25nICopKFNDVV9CQVNFICsgU0NVX01VTFRJRlVOQ1RJT05fUElOX0NUTDVfUkVHKSA9IGNwdV90b19sZTMyKFNDVVJlZ2lzdGVyIHwgKE1BQzJfTURDX01ESU8pKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NQUMyX1BIWV9MSU5LX0lOVEVSUlVQVAorICBTQ1VSZWdpc3RlciA9IGxlMzJfdG9fY3B1KCoodm9sYXRpbGUgdV9sb25nICopKFNDVV9CQVNFICsgU0NVX01VTFRJRlVOQ1RJT05fUElOX0NUTDFfUkVHKSk7CisgICoodm9sYXRpbGUgdV9sb25nICopKFNDVV9CQVNFICsgU0NVX01VTFRJRlVOQ1RJT05fUElOX0NUTDFfUkVHKSA9IGNwdV90b19sZTMyKFNDVVJlZ2lzdGVyIHwgKE1BQzJfUEhZX0xJTkspKTsKKyNlbmRpZgorI2Vsc2UKKy8vQVNUMTEwMC9BU1QyMDUwL0FTVDIxMDAKKy8vTUFDMSBSRVNFVC9QSFlfTElOSyBpbiBTQ1UKKyAgU0NVUmVnaXN0ZXIgPSBsZTMyX3RvX2NwdSgqKHZvbGF0aWxlIHVfbG9uZyAqKShTQ1VfQkFTRSArIFNDVV9SRVNFVF9DT05UUk9MKSk7CisgICoodm9sYXRpbGUgdV9sb25nICopKFNDVV9CQVNFICsgU0NVX1JFU0VUX0NPTlRST0wpID0gY3B1X3RvX2xlMzIoU0NVUmVnaXN0ZXIgJiB+KDB4ODAwKSk7CisjaWZkZWYgQ09ORklHX01BQzFfUEhZX0xJTktfSU5URVJSVVBUCisgIFNDVVJlZ2lzdGVyID0gbGUzMl90b19jcHUoKih2b2xhdGlsZSB1X2xvbmcgKikoU0NVX0JBU0UgKyBTQ1VfUElOX01VWCkpOworICAqKHZvbGF0aWxlIHVfbG9uZyAqKShTQ1VfQkFTRSArIFNDVV9QSU5fTVVYKSA9IGNwdV90b19sZTMyKFNDVVJlZ2lzdGVyIHwgKE1BQzFfUEhZX0xJTkspKTsKKyNlbmRpZgorCisvL01BQzIKKyNpZmRlZiBDT05GSUdfTUFDMl9FTkFCTEUKKyAgU0NVUmVnaXN0ZXIgPSBsZTMyX3RvX2NwdSgqKHZvbGF0aWxlIHVfbG9uZyAqKShTQ1VfQkFTRSArIFNDVV9SRVNFVF9DT05UUk9MKSk7CisgICoodm9sYXRpbGUgdV9sb25nICopKFNDVV9CQVNFICsgU0NVX1JFU0VUX0NPTlRST0wpID0gY3B1X3RvX2xlMzIoU0NVUmVnaXN0ZXIgJiB+KDB4MTAwMCkpOworICBTQ1VSZWdpc3RlciA9IGxlMzJfdG9fY3B1KCoodm9sYXRpbGUgdV9sb25nICopKFNDVV9CQVNFICsgU0NVX1BJTl9NVVgpKTsKKyAgKih2b2xhdGlsZSB1X2xvbmcgKikoU0NVX0JBU0UgKyBTQ1VfUElOX01VWCkgPSBjcHVfdG9fbGUzMihTQ1VSZWdpc3RlciB8IChNQUMyX01EQ19NRElPKSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTUFDMl9NSUlfRU5BQkxFCisgIFNDVVJlZ2lzdGVyID0gbGUzMl90b19jcHUoKih2b2xhdGlsZSB1X2xvbmcgKikoU0NVX0JBU0UgKyBTQ1VfUElOX01VWCkpOworICAqKHZvbGF0aWxlIHVfbG9uZyAqKShTQ1VfQkFTRSArIFNDVV9QSU5fTVVYKSA9IGNwdV90b19sZTMyKFNDVVJlZ2lzdGVyIHwgKE1BQzJfTUlJKSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTUFDMl9QSFlfTElOS19JTlRFUlJVUFQKKyAgU0NVUmVnaXN0ZXIgPSBsZTMyX3RvX2NwdSgqKHZvbGF0aWxlIHVfbG9uZyAqKShTQ1VfQkFTRSArIFNDVV9QSU5fTVVYKSk7CisgICoodm9sYXRpbGUgdV9sb25nICopKFNDVV9CQVNFICsgU0NVX1BJTl9NVVgpID0gY3B1X3RvX2xlMzIoU0NVUmVnaXN0ZXIgfCAoTUFDMl9QSFlfTElOSykpOworI2VuZGlmCisjZW5kaWYKKworICBpb2Jhc2UgPSBhc3BlZWRuaWNfaW9iYXNlW2NhcmRfbnVtYmVyXTsKKworICBkZXYgPSAmYXNwZWVkbmljX2RldmljZVtjYXJkX251bWJlcl07CisKKworICBzcHJpbnRmKGRldi0+bmFtZSwgImFzcGVlZG5pYyMlZCIsIGNhcmRfbnVtYmVyKTsKKworICBkZXYtPmlvYmFzZSA9IGlvYmFzZTsKKworICBpZiAoQ09ORklHX01BQzFfUEhZX1NFVFRJTkcgPj0gMSkgeworLy9OQ1NJIFN0cnVjdCBJbml0aWFsaXplCisgICAgTkNTSV9TdHJ1Y3RfSW5pdGlhbGl6ZSgpOworICB9CisvL1NldCBTY3JhdGNoIHJlZ2lzdGVyICgweDFFNkUyMDQwIERbMTU6MTRdKSgweDFFNkUyMDQxIERbNzo2XSkgdG8gaW5mb3JtIGtlcm5lbCBNQUMxIGRyaXZlcgorICBTQ1VSZWdpc3RlciA9IGxlMzJfdG9fY3B1KCoodm9sYXRpbGUgdV9sb25nICopKFNDVV9CQVNFICsgU0NVX1NDUkFUQ0hfUkVHSVNURVIpKTsKKyAgKih2b2xhdGlsZSB1X2xvbmcgKikoU0NVX0JBU0UgKyBTQ1VfU0NSQVRDSF9SRUdJU1RFUikgPSBjcHVfdG9fbGUzMigoU0NVUmVnaXN0ZXIgJiB+KDB4YzAwMCkpIHwgKENPTkZJR19NQUMxX1BIWV9TRVRUSU5HIDw8IDE0KSk7CisvL1NldCBTY3JhdGNoIHJlZ2lzdGVyICgweDFFNkUyMDQwIERbMTM6MTJdKSgweDFFNkUyMDQxIERbNTo0XSkgdG8gaW5mb3JtIGtlcm5lbCBNQUMyIGRyaXZlcgorICBTQ1VSZWdpc3RlciA9IGxlMzJfdG9fY3B1KCoodm9sYXRpbGUgdV9sb25nICopKFNDVV9CQVNFICsgU0NVX1NDUkFUQ0hfUkVHSVNURVIpKTsKKyAgKih2b2xhdGlsZSB1X2xvbmcgKikoU0NVX0JBU0UgKyBTQ1VfU0NSQVRDSF9SRUdJU1RFUikgPSBjcHVfdG9fbGUzMigoU0NVUmVnaXN0ZXIgJiB+KDB4MzAwMCkpIHwgKENPTkZJR19NQUMyX1BIWV9TRVRUSU5HIDw8IDEyKSk7CisKKworICBkZXYtPmluaXQgICA9IGFzcGVlZG5pY19pbml0OworICBkZXYtPmhhbHQgICA9IGFzcGVlZG5pY19oYWx0OworICBkZXYtPnNlbmQgICA9IGFzcGVlZG5pY19zZW5kOworICBkZXYtPnJlY3YgICA9IGFzcGVlZG5pY19yZWN2OworCisgIC8qIEVuc3VyZSB3ZSdyZSBub3Qgc2xlZXBpbmcuICovCisgIGlmIChDT05GSUdfTUFDMV9QSFlfU0VUVElORyA+PSAxKSB7CisgICAgdWRlbGF5KDIwMDAwMDApOyAvLzIuMCBzZWMKKyAgfQorICBlbHNlIHsKKyAgICB1ZGVsYXkoMTAgKiAxMDAwKTsKKyAgfQorCisKKyAgZGV2LT5pbml0KGRldiwgYmlzKTsKKworICBldGhfcmVnaXN0ZXIoZGV2KTsKKworCisgIHJldHVybiBjYXJkX251bWJlcjsKK30KKwordm9pZCBDYWxjdWxhdGVfQ2hlY2tzdW0odW5zaWduZWQgY2hhciAqYnVmZmVyX2Jhc2UsIGludCBMZW5ndGgpCit7CisgIHVuc2lnbmVkIGludCBpLCBDaGVja1N1bSA9IDA7CisgIHVuc2lnbmVkIGludCBEYXRhLCBEYXRhMTsKKworICBmb3IgKGkgPSAwOyBpIDwgKChMZW5ndGggLSAxNCkgLyAyKTsgaSsrKSB7CisgICAgRGF0YSA9IGJ1ZmZlcl9iYXNlW2kgKiAyXTsKKyAgICBEYXRhMSA9IGJ1ZmZlcl9iYXNlW2kgKiAyICsgMV07CisgICAgQ2hlY2tTdW0gKz0gKChEYXRhIDw8IDgpICsgRGF0YTEpOworICB9CisgIFBheWxvYWRfQ2hlY2tzdW0gPSAofihDaGVja1N1bSkgKyAxKTsgLy8yJ3MgY29tcGxlbWVudAorLy9JbnZlcnNlIGZvciBpbnNlcnQgaW50byBidWZmZXIKKyAgRGF0YSA9IChQYXlsb2FkX0NoZWNrc3VtICYgMHhGRjAwMDAwMCkgPj4gMjQ7CisgIERhdGExID0gKFBheWxvYWRfQ2hlY2tzdW0gJiAweDAwMDAwMEZGKSA8PCAyNDsKKyAgUGF5bG9hZF9DaGVja3N1bSA9IChQYXlsb2FkX0NoZWNrc3VtICYgMHgwMEZGRkYwMCkgKyBEYXRhICsgRGF0YTE7CisgIERhdGEgPSAoUGF5bG9hZF9DaGVja3N1bSAmIDB4MDBGRjAwMDApID4+IDg7CisgIERhdGExID0gKFBheWxvYWRfQ2hlY2tzdW0gJiAweDAwMDBGRjAwKSA8PCA4OworICBQYXlsb2FkX0NoZWNrc3VtID0gKFBheWxvYWRfQ2hlY2tzdW0gJiAweEZGMDAwMEZGKSArIERhdGEgKyBEYXRhMTsKK30KKwordm9pZCBjb3B5X2RhdGEgKGludCBMZW5ndGgpCit7CisgIG1lbWNweSAoKHVuc2lnbmVkIGNoYXIgKikodHhfcmluZ1t0eF9uZXddLmJ1ZiArIDMwKSwgJlBheWxvYWRfRGF0YSwgTGVuZ3RoKTsKKyAgQ2FsY3VsYXRlX0NoZWNrc3VtKCh1bnNpZ25lZCBjaGFyICopKHR4X3JpbmdbdHhfbmV3XS5idWYgKyAxNCksIDMwICsgTGVuZ3RoKTsKKyAgbWVtY3B5ICgodW5zaWduZWQgY2hhciAqKSh0eF9yaW5nW3R4X25ld10uYnVmICsgMzAgKyBMZW5ndGgpLCAmUGF5bG9hZF9DaGVja3N1bSwgNCk7Cit9CisKK3ZvaWQgTkNTSV9SeCAodm9pZCkKK3sKKyAgdW5zaWduZWQgbG9uZyBzdGF0dXMsIGxlbmd0aCwgaSA9IDA7CisKKyAgZG8geworICAgIHN0YXR1cyA9IChzMzIpbGUzMl90b19jcHUocnhfcmluZ1tyeF9uZXddLnN0YXR1cyk7CisgICAgaSsrOworICB9IHdoaWxlICghKCgoc3RhdHVzICYgUlhQS1RfU1RBVFVTKSAhPSAwKSB8fCAoaSA+PSBOQ1NJX0xPT1ApKSk7CisKKyAgaWYgKGkgPCBOQ1NJX0xPT1ApIHsKKyAgICBpZiAoc3RhdHVzICYgTFJTKSB7CisgICAgICBsZW5ndGggPSAobGUzMl90b19jcHUocnhfcmluZ1tyeF9uZXddLnN0YXR1cykgJiAweDNGRkYpOworICAgICAgbWVtY3B5ICgmTkNTSV9SZXNwb25kLCAodW5zaWduZWQgY2hhciAqKXJ4X3JpbmdbcnhfbmV3XS5idWYsIGxlbmd0aCk7CisgICAgfQorICAgIHJ4X3JpbmdbcnhfbmV3XS5zdGF0dXMgJj0gY3B1X3RvX2xlMzIoMHg3RkZGRkZGRik7CisgICAgcnhfbmV3ID0gKHJ4X25ldyArIDEpICUgcnhSaW5nU2l6ZTsKKyAgfQorfQorCit2b2lkIERlU2VsZWN0X1BhY2thZ2UgKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIGludCBQYWNrYWdlX0lEKQoreworICB1bnNpZ25lZCBsb25nIENvbWJpbmVkX0NoYW5uZWxfSUQ7CisKKy8vVFgKKyAgZG8geworICAgIEluc3RhbmNlSUQrKzsKKyAgICBOQ1NJX1JlcXVlc3QuSUlEID0gSW5zdGFuY2VJRDsKKyAgICBOQ1NJX1JlcXVlc3QuQ29tbWFuZCA9IERFU0VMRUNUX1BBQ0tBR0U7CisgICAgQ29tYmluZWRfQ2hhbm5lbF9JRCA9IChQYWNrYWdlX0lEIDw8IDUpICsgMHgxRjsgLy9JbnRlcm5hbCBDaGFubmVsIElEID0gMHgxRiwgMHgxRiBtZWFucyBhbGwgY2hhbm5lbAorICAgIE5DU0lfUmVxdWVzdC5DaGFubmVsX0lEID0gQ29tYmluZWRfQ2hhbm5lbF9JRDsKKyAgICBOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGggPSAwOworICAgIG1lbWNweSAoKHVuc2lnbmVkIGNoYXIgKil0eF9yaW5nW3R4X25ld10uYnVmLCAmTkNTSV9SZXF1ZXN0LCAzMCk7CisgICAgY29weV9kYXRhIChOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGgpOworICAgIGFzcGVlZG5pY19zZW5kIChkZXYsICh2b2lkICopdHhfcmluZ1t0eF9uZXddLmJ1ZiwgMzAgKyBOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGggKyA0KTsKKy8vUlgKKyAgICBOQ1NJX1J4KCk7CisgICAgaWYgKChOQ1NJX1Jlc3BvbmQuSUlEICE9IEluc3RhbmNlSUQpIHx8IChOQ1NJX1Jlc3BvbmQuQ29tbWFuZCAhPSAoREVTRUxFQ1RfUEFDS0FHRSB8IDB4ODApKSB8fCAoTkNTSV9SZXNwb25kLlJlc3BvbnNlX0NvZGUgIT0gQ09NTUFORF9DT01QTEVURUQpKSB7CisgICAgICBwcmludGYgKCJSZXRyeTogQ29tbWFuZCA9ICV4LCBSZXNwb25zZV9Db2RlID0gJXhcbiIsIE5DU0lfUmVxdWVzdC5Db21tYW5kLCBOQ1NJX1Jlc3BvbmQuUmVzcG9uc2VfQ29kZSk7CisgICAgICBSZXRyeSsrOworICAgICAgSW5zdGFuY2VJRC0tOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIFJldHJ5ID0gMDsKKyAgICB9CisgIH0gd2hpbGUgKChSZXRyeSAhPSAwKSAmJiAoUmV0cnkgPD0gUkVUUllfQ09VTlQpKTsKKyAgUmV0cnkgPSAwOworfQorCitpbnQgU2VsZWN0X1BhY2thZ2UgKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIGludCBQYWNrYWdlX0lEKQoreworICB1bnNpZ25lZCBsb25nIENvbWJpbmVkX0NoYW5uZWxfSUQsIEZvdW5kID0gMDsKKworLy9UWAorICBkbyB7CisgICAgSW5zdGFuY2VJRCsrOworICAgIE5DU0lfUmVxdWVzdC5JSUQgPSBJbnN0YW5jZUlEOworICAgIE5DU0lfUmVxdWVzdC5Db21tYW5kID0gU0VMRUNUX1BBQ0tBR0U7CisgICAgQ29tYmluZWRfQ2hhbm5lbF9JRCA9IChQYWNrYWdlX0lEIDw8IDUpICsgMHgxRjsgLy9JbnRlcm5hbCBDaGFubmVsIElEID0gMHgxRgorICAgIE5DU0lfUmVxdWVzdC5DaGFubmVsX0lEID0gQ29tYmluZWRfQ2hhbm5lbF9JRDsKKyAgICBOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGggPSAoNCA8PCA4KTsKKyAgICBtZW1jcHkgKCh1bnNpZ25lZCBjaGFyICopdHhfcmluZ1t0eF9uZXddLmJ1ZiwgJk5DU0lfUmVxdWVzdCwgMzApOworICAgIE5DU0lfUmVxdWVzdC5QYXlsb2FkX0xlbmd0aCA9IDQ7CisgICAgbWVtc2V0ICgodm9pZCAqKVBheWxvYWRfRGF0YSwgMCwgNCk7CisgICAgUGF5bG9hZF9EYXRhWzNdID0gMTsgLy9BcmJpdHJhdGlvbiBEaXNhYmxlCisgICAgY29weV9kYXRhIChOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGgpOworICAgIGFzcGVlZG5pY19zZW5kIChkZXYsICh2b2lkICopdHhfcmluZ1t0eF9uZXddLmJ1ZiwgMzAgKyBOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGggKyA0KTsKKy8vUlgKKyAgICBOQ1NJX1J4KCk7CisgICAgaWYgKChOQ1NJX1Jlc3BvbmQuSUlEICE9IEluc3RhbmNlSUQpIHx8IChOQ1NJX1Jlc3BvbmQuQ29tbWFuZCAhPSAoU0VMRUNUX1BBQ0tBR0UgfCAweDgwKSkgfHwgKE5DU0lfUmVzcG9uZC5SZXNwb25zZV9Db2RlICE9IENPTU1BTkRfQ09NUExFVEVEKSkgeworICAgICAgcHJpbnRmICgiUmV0cnk6IENvbW1hbmQgPSAleCwgUmVzcG9uc2VfQ29kZSA9ICV4XG4iLCBOQ1NJX1JlcXVlc3QuQ29tbWFuZCwgTkNTSV9SZXNwb25kLlJlc3BvbnNlX0NvZGUpOworICAgICAgUmV0cnkrKzsKKyAgICAgIEZvdW5kID0gMDsKKyAgICAgIEluc3RhbmNlSUQtLTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBSZXRyeSA9IDA7CisgICAgICBGb3VuZCA9IDE7CisgICAgfQorICB9IHdoaWxlICgoUmV0cnkgIT0gMCkgJiYgKFJldHJ5IDw9IFJFVFJZX0NPVU5UKSk7CisgIFJldHJ5ID0gMDsKKworICByZXR1cm4gRm91bmQ7Cit9CisKK3ZvaWQgRGVTZWxlY3RfQWN0aXZlX1BhY2thZ2UgKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpCit7CisgIHVuc2lnbmVkIGxvbmcgQ29tYmluZWRfQ2hhbm5lbF9JRDsKKy8vVFgKKyAgZG8geworICAgIEluc3RhbmNlSUQrKzsKKyAgICBOQ1NJX1JlcXVlc3QuSUlEID0gSW5zdGFuY2VJRDsKKyAgICBOQ1NJX1JlcXVlc3QuQ29tbWFuZCA9IERFU0VMRUNUX1BBQ0tBR0U7CisgICAgQ29tYmluZWRfQ2hhbm5lbF9JRCA9IChOQ1NJX0NhcC5QYWNrYWdlX0lEIDw8IDUpICsgMHgxRjsgLy9JbnRlcm5hbCBDaGFubmVsIElEID0gMHgxRiwgMHgxRiBtZWFucyBhbGwgY2hhbm5lbAorICAgIE5DU0lfUmVxdWVzdC5DaGFubmVsX0lEID0gQ29tYmluZWRfQ2hhbm5lbF9JRDsKKyAgICBOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGggPSAwOworICAgIG1lbWNweSAoKHVuc2lnbmVkIGNoYXIgKil0eF9yaW5nW3R4X25ld10uYnVmLCAmTkNTSV9SZXF1ZXN0LCAzMCk7CisgICAgY29weV9kYXRhIChOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGgpOworICAgIGFzcGVlZG5pY19zZW5kIChkZXYsICh2b2lkICopdHhfcmluZ1t0eF9uZXddLmJ1ZiwgMzAgKyBOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGggKyA0KTsKKy8vUlgKKyAgICBOQ1NJX1J4KCk7CisgICAgaWYgKChOQ1NJX1Jlc3BvbmQuSUlEICE9IEluc3RhbmNlSUQpIHx8IChOQ1NJX1Jlc3BvbmQuQ29tbWFuZCAhPSAoREVTRUxFQ1RfUEFDS0FHRSB8IDB4ODApKSB8fCAoTkNTSV9SZXNwb25kLlJlc3BvbnNlX0NvZGUgIT0gQ09NTUFORF9DT01QTEVURUQpKSB7CisgICAgICBwcmludGYgKCJSZXRyeTogQ29tbWFuZCA9ICV4LCBSZXNwb25zZV9Db2RlID0gJXhcbiIsIE5DU0lfUmVxdWVzdC5Db21tYW5kLCBOQ1NJX1Jlc3BvbmQuUmVzcG9uc2VfQ29kZSk7CisgICAgICBSZXRyeSsrOworICAgICAgSW5zdGFuY2VJRC0tOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIFJldHJ5ID0gMDsKKyAgICB9CisgIH0gd2hpbGUgKChSZXRyeSAhPSAwKSAmJiAoUmV0cnkgPD0gUkVUUllfQ09VTlQpKTsKKyAgUmV0cnkgPSAwOworfQorCitpbnQgU2VsZWN0X0FjdGl2ZV9QYWNrYWdlIChzdHJ1Y3QgZXRoX2RldmljZSogZGV2KQoreworICB1bnNpZ25lZCBsb25nIENvbWJpbmVkX0NoYW5uZWxfSUQsIEZvdW5kID0gMDsKKy8vVFgKKyAgZG8geworICAgIEluc3RhbmNlSUQrKzsKKyAgICBOQ1NJX1JlcXVlc3QuSUlEID0gSW5zdGFuY2VJRDsKKyAgICBOQ1NJX1JlcXVlc3QuQ29tbWFuZCA9IFNFTEVDVF9QQUNLQUdFOworICAgIENvbWJpbmVkX0NoYW5uZWxfSUQgPSAoTkNTSV9DYXAuUGFja2FnZV9JRCA8PCA1KSArIDB4MUY7IC8vSW50ZXJuYWwgQ2hhbm5lbCBJRCA9IDB4MUYKKyAgICBOQ1NJX1JlcXVlc3QuQ2hhbm5lbF9JRCA9IENvbWJpbmVkX0NoYW5uZWxfSUQ7CisgICAgTkNTSV9SZXF1ZXN0LlBheWxvYWRfTGVuZ3RoID0gKDQgPDwgOCk7CisgICAgbWVtY3B5ICgodW5zaWduZWQgY2hhciAqKXR4X3JpbmdbdHhfbmV3XS5idWYsICZOQ1NJX1JlcXVlc3QsIDMwKTsKKyAgICBOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGggPSA0OworICAgIG1lbXNldCAoKHZvaWQgKilQYXlsb2FkX0RhdGEsIDAsIDQpOworICAgIFBheWxvYWRfRGF0YVszXSA9IDE7IC8vQXJiaXRyYXRpb24gRGlzYWJsZQorICAgIGNvcHlfZGF0YSAoTkNTSV9SZXF1ZXN0LlBheWxvYWRfTGVuZ3RoKTsKKyAgICBhc3BlZWRuaWNfc2VuZCAoZGV2LCAodm9pZCAqKXR4X3JpbmdbdHhfbmV3XS5idWYsIDMwICsgTkNTSV9SZXF1ZXN0LlBheWxvYWRfTGVuZ3RoICsgNCk7CisvL1JYCisgICAgTkNTSV9SeCgpOworICAgIGlmICgoTkNTSV9SZXNwb25kLklJRCAhPSBJbnN0YW5jZUlEKSB8fCAoTkNTSV9SZXNwb25kLkNvbW1hbmQgIT0gKFNFTEVDVF9QQUNLQUdFIHwgMHg4MCkpIHx8IChOQ1NJX1Jlc3BvbmQuUmVzcG9uc2VfQ29kZSAhPSBDT01NQU5EX0NPTVBMRVRFRCkpIHsKKyAgICAgIHByaW50ZiAoIlJldHJ5OiBDb21tYW5kID0gJXgsIFJlc3BvbnNlX0NvZGUgPSAleFxuIiwgTkNTSV9SZXF1ZXN0LkNvbW1hbmQsIE5DU0lfUmVzcG9uZC5SZXNwb25zZV9Db2RlKTsKKyAgICAgIFJldHJ5Kys7CisgICAgICBGb3VuZCA9IDA7CisgICAgICBJbnN0YW5jZUlELS07CisgICAgfQorICAgIGVsc2UgeworICAgICAgUmV0cnkgPSAwOworICAgICAgRm91bmQgPSAxOworICAgIH0KKyAgfSB3aGlsZSAoKFJldHJ5ICE9IDApICYmIChSZXRyeSA8PSBSRVRSWV9DT1VOVCkpOworICBSZXRyeSA9IDA7CisKKyAgcmV0dXJuIEZvdW5kOworfQorCitpbnQgQ2xlYXJfSW5pdGlhbF9TdGF0ZSAoc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgaW50IENoYW5uZWxfSUQpCit7CisgIHVuc2lnbmVkIGxvbmcgQ29tYmluZWRfQ2hhbm5lbF9JRCwgRm91bmQgPSAwOworLy9UWAorICBkbyB7CisgICAgSW5zdGFuY2VJRCsrOworICAgIE5DU0lfUmVxdWVzdC5JSUQgPSBJbnN0YW5jZUlEOworICAgIE5DU0lfUmVxdWVzdC5Db21tYW5kID0gQ0xFQVJfSU5JVElBTF9TVEFURTsKKyAgICBDb21iaW5lZF9DaGFubmVsX0lEID0gKE5DU0lfQ2FwLlBhY2thZ2VfSUQgPDwgNSkgKyBDaGFubmVsX0lEOyAvL0ludGVybmFsIENoYW5uZWwgSUQgPSAwCisgICAgTkNTSV9SZXF1ZXN0LkNoYW5uZWxfSUQgPSBDb21iaW5lZF9DaGFubmVsX0lEOworICAgIE5DU0lfUmVxdWVzdC5QYXlsb2FkX0xlbmd0aCA9IDA7CisgICAgbWVtY3B5ICgodW5zaWduZWQgY2hhciAqKXR4X3JpbmdbdHhfbmV3XS5idWYsICZOQ1NJX1JlcXVlc3QsIDMwKTsKKyAgICBjb3B5X2RhdGEgKE5DU0lfUmVxdWVzdC5QYXlsb2FkX0xlbmd0aCk7CisgICAgYXNwZWVkbmljX3NlbmQgKGRldiwgKHZvaWQgKil0eF9yaW5nW3R4X25ld10uYnVmLCAzMCArIE5DU0lfUmVxdWVzdC5QYXlsb2FkX0xlbmd0aCArIDQpOworLy9SWAorICAgIE5DU0lfUngoKTsKKyAgICBpZiAoKE5DU0lfUmVzcG9uZC5JSUQgIT0gSW5zdGFuY2VJRCkgfHwgKE5DU0lfUmVzcG9uZC5Db21tYW5kICE9IChDTEVBUl9JTklUSUFMX1NUQVRFIHwgMHg4MCkpIHx8IChOQ1NJX1Jlc3BvbmQuUmVzcG9uc2VfQ29kZSAhPSBDT01NQU5EX0NPTVBMRVRFRCkpIHsKKyAgICAgIHByaW50ZiAoIlJldHJ5OiBDb21tYW5kID0gJXgsIFJlc3BvbnNlX0NvZGUgPSAleFxuIiwgTkNTSV9SZXF1ZXN0LkNvbW1hbmQsIE5DU0lfUmVzcG9uZC5SZXNwb25zZV9Db2RlKTsKKyAgICAgIFJldHJ5Kys7CisgICAgICBGb3VuZCA9IDA7CisgICAgICBJbnN0YW5jZUlELS07CisgICAgfQorICAgIGVsc2UgeworICAgICAgUmV0cnkgPSAwOworICAgICAgRm91bmQgPSAxOworICAgIH0KKyAgfSB3aGlsZSAoKFJldHJ5ICE9IDApICYmIChSZXRyeSA8PSBSRVRSWV9DT1VOVCkpOworICBSZXRyeSA9IDA7CisKKyAgcmV0dXJuIEZvdW5kOworfQorCit2b2lkIEdldF9WZXJzaW9uX0lEIChzdHJ1Y3QgZXRoX2RldmljZSogZGV2KQoreworICB1bnNpZ25lZCBsb25nIENvbWJpbmVkX0NoYW5uZWxfSUQ7CisvL1RYCisgIGRvIHsKKyAgICBJbnN0YW5jZUlEKys7CisgICAgTkNTSV9SZXF1ZXN0LklJRCA9IEluc3RhbmNlSUQ7CisgICAgTkNTSV9SZXF1ZXN0LkNvbW1hbmQgPSBHRVRfVkVSU0lPTl9JRDsKKyAgICBDb21iaW5lZF9DaGFubmVsX0lEID0gKE5DU0lfQ2FwLlBhY2thZ2VfSUQgPDwgNSkgKyBOQ1NJX0NhcC5DaGFubmVsX0lEOworICAgIE5DU0lfUmVxdWVzdC5DaGFubmVsX0lEID0gQ29tYmluZWRfQ2hhbm5lbF9JRDsKKyAgICBOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGggPSAwOworICAgIG1lbWNweSAoKHVuc2lnbmVkIGNoYXIgKil0eF9yaW5nW3R4X25ld10uYnVmLCAmTkNTSV9SZXF1ZXN0LCAzMCk7CisgICAgY29weV9kYXRhIChOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGgpOworICAgIGFzcGVlZG5pY19zZW5kIChkZXYsICh2b2lkICopdHhfcmluZ1t0eF9uZXddLmJ1ZiwgMzAgKyBOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGggKyA0KTsKKy8vUlgKKyAgICBOQ1NJX1J4KCk7CisgICAgaWYgKChOQ1NJX1Jlc3BvbmQuSUlEICE9IEluc3RhbmNlSUQpIHx8IChOQ1NJX1Jlc3BvbmQuQ29tbWFuZCAhPSAoR0VUX1ZFUlNJT05fSUQgfCAweDgwKSkgfHwgKE5DU0lfUmVzcG9uZC5SZXNwb25zZV9Db2RlICE9IENPTU1BTkRfQ09NUExFVEVEKSkgeworICAgICAgcHJpbnRmICgiUmV0cnk6IENvbW1hbmQgPSAleCwgUmVzcG9uc2VfQ29kZSA9ICV4XG4iLCBOQ1NJX1JlcXVlc3QuQ29tbWFuZCwgTkNTSV9SZXNwb25kLlJlc3BvbnNlX0NvZGUpOworICAgICAgUmV0cnkrKzsKKyAgICAgIEluc3RhbmNlSUQtLTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBSZXRyeSA9IDA7CisgICAgfQorICB9IHdoaWxlICgoUmV0cnkgIT0gMCkgJiYgKFJldHJ5IDw9IFJFVFJZX0NPVU5UKSk7CisgIFJldHJ5ID0gMDsKK30KKwordm9pZCBHZXRfQ2FwYWJpbGl0aWVzIChzdHJ1Y3QgZXRoX2RldmljZSogZGV2KQoreworICB1bnNpZ25lZCBsb25nIENvbWJpbmVkX0NoYW5uZWxfSUQ7CisvL1RYCisgIGRvIHsKKyAgICBJbnN0YW5jZUlEKys7CisgICAgTkNTSV9SZXF1ZXN0LklJRCA9IEluc3RhbmNlSUQ7CisgICAgTkNTSV9SZXF1ZXN0LkNvbW1hbmQgPSBHRVRfQ0FQQUJJTElUSUVTOworICAgIENvbWJpbmVkX0NoYW5uZWxfSUQgPSAoTkNTSV9DYXAuUGFja2FnZV9JRCA8PCA1KSArIE5DU0lfQ2FwLkNoYW5uZWxfSUQ7CisgICAgTkNTSV9SZXF1ZXN0LkNoYW5uZWxfSUQgPSBDb21iaW5lZF9DaGFubmVsX0lEOworICAgIE5DU0lfUmVxdWVzdC5QYXlsb2FkX0xlbmd0aCA9IDA7CisgICAgbWVtY3B5ICgodW5zaWduZWQgY2hhciAqKXR4X3JpbmdbdHhfbmV3XS5idWYsICZOQ1NJX1JlcXVlc3QsIDMwKTsKKyAgICBjb3B5X2RhdGEgKE5DU0lfUmVxdWVzdC5QYXlsb2FkX0xlbmd0aCk7CisgICAgYXNwZWVkbmljX3NlbmQgKGRldiwgKHZvaWQgKil0eF9yaW5nW3R4X25ld10uYnVmLCAzMCArIE5DU0lfUmVxdWVzdC5QYXlsb2FkX0xlbmd0aCArIDQpOworLy9SWAorICAgIE5DU0lfUngoKTsKKyAgICBpZiAoKE5DU0lfUmVzcG9uZC5JSUQgIT0gSW5zdGFuY2VJRCkgfHwgKE5DU0lfUmVzcG9uZC5Db21tYW5kICE9IChHRVRfQ0FQQUJJTElUSUVTIHwgMHg4MCkpIHx8IChOQ1NJX1Jlc3BvbmQuUmVzcG9uc2VfQ29kZSAhPSBDT01NQU5EX0NPTVBMRVRFRCkpIHsKKyAgICAgIHByaW50ZiAoIlJldHJ5OiBDb21tYW5kID0gJXgsIFJlc3BvbnNlX0NvZGUgPSAleFxuIiwgTkNTSV9SZXF1ZXN0LkNvbW1hbmQsIE5DU0lfUmVzcG9uZC5SZXNwb25zZV9Db2RlKTsKKyAgICAgIFJldHJ5Kys7CisgICAgICBJbnN0YW5jZUlELS07CisgICAgfQorICAgIGVsc2UgeworICAgICAgUmV0cnkgPSAwOworICAgICAgTkNTSV9DYXAuQ2FwYWJpbGl0aWVzX0ZsYWdzID0gTkNTSV9SZXNwb25kLlBheWxvYWRfRGF0YVswXTsKKyAgICAgIE5DU0lfQ2FwLkJyb2FkY2FzdF9QYWNrZXRfRmlsdGVyX0NhcGFiaWxpdGllcyA9IE5DU0lfUmVzcG9uZC5QYXlsb2FkX0RhdGFbMV07CisgICAgICBOQ1NJX0NhcC5NdWx0aWNhc3RfUGFja2V0X0ZpbHRlcl9DYXBhYmlsaXRpZXMgPSBOQ1NJX1Jlc3BvbmQuUGF5bG9hZF9EYXRhWzJdOworICAgICAgTkNTSV9DYXAuQnVmZmVyaW5nX0NhcGFiaWxpdGllcyA9IE5DU0lfUmVzcG9uZC5QYXlsb2FkX0RhdGFbM107CisgICAgICBOQ1NJX0NhcC5BRU5fQ29udHJvbF9TdXBwb3J0ID0gTkNTSV9SZXNwb25kLlBheWxvYWRfRGF0YVs0XTsKKyAgICB9CisgIH0gd2hpbGUgKChSZXRyeSAhPSAwKSAmJiAoUmV0cnkgPD0gUkVUUllfQ09VTlQpKTsKKyAgUmV0cnkgPSAwOworfQorCit2b2lkIEVuYWJsZV9TZXRfTUFDX0FkZHJlc3MgKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpCit7CisgIHVuc2lnbmVkIGxvbmcgQ29tYmluZWRfQ2hhbm5lbF9JRCwgaTsKKy8vVFgKKyAgZG8geworICAgIEluc3RhbmNlSUQrKzsKKyAgICBOQ1NJX1JlcXVlc3QuSUlEID0gSW5zdGFuY2VJRDsKKyAgICBOQ1NJX1JlcXVlc3QuQ29tbWFuZCA9IFNFVF9NQUNfQUREUkVTUzsKKyAgICBDb21iaW5lZF9DaGFubmVsX0lEID0gKE5DU0lfQ2FwLlBhY2thZ2VfSUQgPDwgNSkgKyBOQ1NJX0NhcC5DaGFubmVsX0lEOworICAgIE5DU0lfUmVxdWVzdC5DaGFubmVsX0lEID0gQ29tYmluZWRfQ2hhbm5lbF9JRDsKKyAgICBOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGggPSAoOCA8PCA4KTsKKyAgICBtZW1jcHkgKCh1bnNpZ25lZCBjaGFyICopdHhfcmluZ1t0eF9uZXddLmJ1ZiwgJk5DU0lfUmVxdWVzdCwgMzApOworICAgIE5DU0lfUmVxdWVzdC5QYXlsb2FkX0xlbmd0aCA9IDg7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgUGF5bG9hZF9EYXRhW2ldID0gTkNTSV9SZXF1ZXN0LlNBW2ldOworICAgIH0KKyAgICBQYXlsb2FkX0RhdGFbNl0gPSAxOyAvL01BQyBBZGRyZXNzIE51bSA9IDEgLS0+IGFkZHJlc3MgZmlsdGVyIDEsIGZpeGVkIGluIHNhbXBsZSBjb2RlCisgICAgUGF5bG9hZF9EYXRhWzddID0gVU5JQ0FTVCArIDAgKyBFTkFCTEVfTUFDX0FERFJFU1NfRklMVEVSOyAvL0FUICsgUmVzZXJ2ZWQgKyBFCisgICAgY29weV9kYXRhIChOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGgpOworICAgIGFzcGVlZG5pY19zZW5kIChkZXYsICh2b2lkICopdHhfcmluZ1t0eF9uZXddLmJ1ZiwgMzAgKyBOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGggKyA0KTsKKy8vUlgKKyAgICBOQ1NJX1J4KCk7CisgICAgaWYgKChOQ1NJX1Jlc3BvbmQuSUlEICE9IEluc3RhbmNlSUQpIHx8IChOQ1NJX1Jlc3BvbmQuQ29tbWFuZCAhPSAoU0VUX01BQ19BRERSRVNTIHwgMHg4MCkpIHx8IChOQ1NJX1Jlc3BvbmQuUmVzcG9uc2VfQ29kZSAhPSBDT01NQU5EX0NPTVBMRVRFRCkpIHsKKyAgICAgIHByaW50ZiAoIlJldHJ5OiBDb21tYW5kID0gJXgsIFJlc3BvbnNlX0NvZGUgPSAleFxuIiwgTkNTSV9SZXF1ZXN0LkNvbW1hbmQsIE5DU0lfUmVzcG9uZC5SZXNwb25zZV9Db2RlKTsKKyAgICAgIFJldHJ5Kys7CisgICAgICBJbnN0YW5jZUlELS07CisgICAgfQorICB9IHdoaWxlICgoUmV0cnkgIT0gMCkgJiYgKFJldHJ5IDw9IFJFVFJZX0NPVU5UKSk7CisgIFJldHJ5ID0gMDsKK30KKwordm9pZCBFbmFibGVfQnJvYWRjYXN0X0ZpbHRlciAoc3RydWN0IGV0aF9kZXZpY2UqIGRldikKK3sKKyAgdW5zaWduZWQgbG9uZyBDb21iaW5lZF9DaGFubmVsX0lEOworLy9UWAorICBkbyB7CisgICAgSW5zdGFuY2VJRCsrOworICAgIE5DU0lfUmVxdWVzdC5JSUQgPSBJbnN0YW5jZUlEOworICAgIE5DU0lfUmVxdWVzdC5Db21tYW5kID0gRU5BQkxFX0JST0FEQ0FTVF9GSUxURVJJTkc7CisgICAgQ29tYmluZWRfQ2hhbm5lbF9JRCA9IChOQ1NJX0NhcC5QYWNrYWdlX0lEIDw8IDUpICsgTkNTSV9DYXAuQ2hhbm5lbF9JRDsKKyAgICBOQ1NJX1JlcXVlc3QuQ2hhbm5lbF9JRCA9IENvbWJpbmVkX0NoYW5uZWxfSUQ7CisgICAgTkNTSV9SZXF1ZXN0LlBheWxvYWRfTGVuZ3RoID0gKDQgPDwgOCk7CisgICAgbWVtY3B5ICgodW5zaWduZWQgY2hhciAqKXR4X3JpbmdbdHhfbmV3XS5idWYsICZOQ1NJX1JlcXVlc3QsIDMwKTsKKyAgICBOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGggPSA0OworICAgIG1lbXNldCAoKHZvaWQgKilQYXlsb2FkX0RhdGEsIDAsIDQpOworICAgIFBheWxvYWRfRGF0YVszXSA9IDB4RjsgLy9BUlAsIERIQ1AsIE5ldEJJT1MKKyAgICBjb3B5X2RhdGEgKE5DU0lfUmVxdWVzdC5QYXlsb2FkX0xlbmd0aCk7CisgICAgYXNwZWVkbmljX3NlbmQgKGRldiwgKHZvaWQgKil0eF9yaW5nW3R4X25ld10uYnVmLCAzMCArIE5DU0lfUmVxdWVzdC5QYXlsb2FkX0xlbmd0aCArIDQpOworLy9SWAorICAgIE5DU0lfUngoKTsKKyAgICBpZiAoKE5DU0lfUmVzcG9uZC5JSUQgIT0gSW5zdGFuY2VJRCkgfHwgKE5DU0lfUmVzcG9uZC5Db21tYW5kICE9IChFTkFCTEVfQlJPQURDQVNUX0ZJTFRFUklORyB8IDB4ODApKSB8fCAoTkNTSV9SZXNwb25kLlJlc3BvbnNlX0NvZGUgIT0gQ09NTUFORF9DT01QTEVURUQpKSB7CisgICAgICBwcmludGYgKCJSZXRyeTogQ29tbWFuZCA9ICV4LCBSZXNwb25zZV9Db2RlID0gJXhcbiIsIE5DU0lfUmVxdWVzdC5Db21tYW5kLCBOQ1NJX1Jlc3BvbmQuUmVzcG9uc2VfQ29kZSk7CisgICAgICBSZXRyeSsrOworICAgICAgSW5zdGFuY2VJRC0tOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIFJldHJ5ID0gMDsKKyAgICB9CisgIH0gd2hpbGUgKChSZXRyeSAhPSAwKSAmJiAoUmV0cnkgPD0gUkVUUllfQ09VTlQpKTsKKyAgUmV0cnkgPSAwOworfQorCit2b2lkIEVuYWJsZV9BRU4gKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpCit7CisgIHVuc2lnbmVkIGxvbmcgQ29tYmluZWRfQ2hhbm5lbF9JRDsKKy8vVFgKKyAgZG8geworICAgIEluc3RhbmNlSUQrKzsKKyAgICBOQ1NJX1JlcXVlc3QuSUlEID0gSW5zdGFuY2VJRDsKKyAgICBOQ1NJX1JlcXVlc3QuQ29tbWFuZCA9IEFFTl9FTkFCTEU7CisgICAgQ29tYmluZWRfQ2hhbm5lbF9JRCA9IChOQ1NJX0NhcC5QYWNrYWdlX0lEIDw8IDUpICsgTkNTSV9DYXAuQ2hhbm5lbF9JRDsKKyAgICBOQ1NJX1JlcXVlc3QuQ2hhbm5lbF9JRCA9IENvbWJpbmVkX0NoYW5uZWxfSUQ7CisgICAgTkNTSV9SZXF1ZXN0LlBheWxvYWRfTGVuZ3RoID0gKDggPDwgOCk7CisgICAgbWVtY3B5ICgodW5zaWduZWQgY2hhciAqKXR4X3JpbmdbdHhfbmV3XS5idWYsICZOQ1NJX1JlcXVlc3QsIDMwKTsKKyAgICBOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGggPSA4OworICAgIG1lbXNldCAoKHZvaWQgKilQYXlsb2FkX0RhdGEsIDAsIDgpOworICAgIFBheWxvYWRfRGF0YVszXSA9IDB4MDA7IC8vTUMgSUQKKyAgICBQYXlsb2FkX0RhdGFbN10gPSAweDAxOyAvL0xpbmsgU3RhdHVzIG9ubHkKKyAgICBjb3B5X2RhdGEgKE5DU0lfUmVxdWVzdC5QYXlsb2FkX0xlbmd0aCk7CisgICAgYXNwZWVkbmljX3NlbmQgKGRldiwgKHZvaWQgKil0eF9yaW5nW3R4X25ld10uYnVmLCAzMCArIE5DU0lfUmVxdWVzdC5QYXlsb2FkX0xlbmd0aCArIDQpOworLy9SWAorICAgIE5DU0lfUngoKTsKKyAgICBpZiAoKE5DU0lfUmVzcG9uZC5JSUQgIT0gSW5zdGFuY2VJRCkgfHwgKE5DU0lfUmVzcG9uZC5Db21tYW5kICE9IChBRU5fRU5BQkxFIHwgMHg4MCkpIHx8IChOQ1NJX1Jlc3BvbmQuUmVzcG9uc2VfQ29kZSAhPSBDT01NQU5EX0NPTVBMRVRFRCkpIHsKKyAgICAgIHByaW50ZiAoIlJldHJ5OiBDb21tYW5kID0gJXgsIFJlc3BvbnNlX0NvZGUgPSAleFxuIiwgTkNTSV9SZXF1ZXN0LkNvbW1hbmQsIE5DU0lfUmVzcG9uZC5SZXNwb25zZV9Db2RlKTsKKyAgICAgIFJldHJ5Kys7CisgICAgICBJbnN0YW5jZUlELS07CisgICAgfQorICAgIGVsc2UgeworICAgICAgUmV0cnkgPSAwOworICAgIH0KKyAgfSB3aGlsZSAoKFJldHJ5ICE9IDApICYmIChSZXRyeSA8PSBSRVRSWV9DT1VOVCkpOworICBSZXRyeSA9IDA7Cit9CisKK3ZvaWQgRW5hYmxlX05ldHdvcmtfVFggKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpCit7CisgIHVuc2lnbmVkIGxvbmcgQ29tYmluZWRfQ2hhbm5lbF9JRDsKKy8vVFgKKyAgZG8geworICAgIEluc3RhbmNlSUQrKzsKKyAgICBOQ1NJX1JlcXVlc3QuSUlEID0gSW5zdGFuY2VJRDsKKyAgICBOQ1NJX1JlcXVlc3QuQ29tbWFuZCA9IEVOQUJMRV9DSEFOTkVMX05FVFdPUktfVFg7CisgICAgQ29tYmluZWRfQ2hhbm5lbF9JRCA9IChOQ1NJX0NhcC5QYWNrYWdlX0lEIDw8IDUpICsgTkNTSV9DYXAuQ2hhbm5lbF9JRDsKKyAgICBOQ1NJX1JlcXVlc3QuQ2hhbm5lbF9JRCA9IENvbWJpbmVkX0NoYW5uZWxfSUQ7CisgICAgTkNTSV9SZXF1ZXN0LlBheWxvYWRfTGVuZ3RoID0gMDsKKyAgICBtZW1jcHkgKCh1bnNpZ25lZCBjaGFyICopdHhfcmluZ1t0eF9uZXddLmJ1ZiwgJk5DU0lfUmVxdWVzdCwgMzApOworICAgIGNvcHlfZGF0YSAoTkNTSV9SZXF1ZXN0LlBheWxvYWRfTGVuZ3RoKTsKKyAgICBhc3BlZWRuaWNfc2VuZCAoZGV2LCAodm9pZCAqKXR4X3JpbmdbdHhfbmV3XS5idWYsIDMwICsgTkNTSV9SZXF1ZXN0LlBheWxvYWRfTGVuZ3RoICsgNCk7CisvL1JYCisgICAgTkNTSV9SeCgpOworICAgIGlmICgoTkNTSV9SZXNwb25kLklJRCAhPSBJbnN0YW5jZUlEKSB8fCAoTkNTSV9SZXNwb25kLkNvbW1hbmQgIT0gKEVOQUJMRV9DSEFOTkVMX05FVFdPUktfVFggfCAweDgwKSkgfHwgKE5DU0lfUmVzcG9uZC5SZXNwb25zZV9Db2RlICE9IENPTU1BTkRfQ09NUExFVEVEKSkgeworICAgICAgcHJpbnRmICgiUmV0cnk6IENvbW1hbmQgPSAleCwgUmVzcG9uc2VfQ29kZSA9ICV4XG4iLCBOQ1NJX1JlcXVlc3QuQ29tbWFuZCwgTkNTSV9SZXNwb25kLlJlc3BvbnNlX0NvZGUpOworICAgICAgUmV0cnkrKzsKKyAgICAgIEluc3RhbmNlSUQtLTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBSZXRyeSA9IDA7CisgICAgfQorICB9IHdoaWxlICgoUmV0cnkgIT0gMCkgJiYgKFJldHJ5IDw9IFJFVFJZX0NPVU5UKSk7CisgIFJldHJ5ID0gMDsKK30KKwordm9pZCBEaXNhYmxlX05ldHdvcmtfVFggKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpCit7CisgIHVuc2lnbmVkIGxvbmcgQ29tYmluZWRfQ2hhbm5lbF9JRDsKKy8vVFgKKyAgZG8geworICAgIEluc3RhbmNlSUQrKzsKKyAgICBOQ1NJX1JlcXVlc3QuSUlEID0gSW5zdGFuY2VJRDsKKyAgICBOQ1NJX1JlcXVlc3QuQ29tbWFuZCA9IERJU0FCTEVfQ0hBTk5FTF9ORVRXT1JLX1RYOworICAgIENvbWJpbmVkX0NoYW5uZWxfSUQgPSAoTkNTSV9DYXAuUGFja2FnZV9JRCA8PCA1KSArIE5DU0lfQ2FwLkNoYW5uZWxfSUQ7CisgICAgTkNTSV9SZXF1ZXN0LkNoYW5uZWxfSUQgPSBDb21iaW5lZF9DaGFubmVsX0lEOworICAgIE5DU0lfUmVxdWVzdC5QYXlsb2FkX0xlbmd0aCA9IDA7CisgICAgbWVtY3B5ICgodW5zaWduZWQgY2hhciAqKXR4X3JpbmdbdHhfbmV3XS5idWYsICZOQ1NJX1JlcXVlc3QsIDMwKTsKKyAgICBjb3B5X2RhdGEgKE5DU0lfUmVxdWVzdC5QYXlsb2FkX0xlbmd0aCk7CisgICAgYXNwZWVkbmljX3NlbmQgKGRldiwgKHZvaWQgKil0eF9yaW5nW3R4X25ld10uYnVmLCAzMCArIE5DU0lfUmVxdWVzdC5QYXlsb2FkX0xlbmd0aCArIDQpOworLy9SWAorICAgIE5DU0lfUngoKTsKKyAgICBpZiAoKE5DU0lfUmVzcG9uZC5JSUQgIT0gSW5zdGFuY2VJRCkgfHwgKE5DU0lfUmVzcG9uZC5Db21tYW5kICE9IChESVNBQkxFX0NIQU5ORUxfTkVUV09SS19UWCB8IDB4ODApKSB8fCAoTkNTSV9SZXNwb25kLlJlc3BvbnNlX0NvZGUgIT0gQ09NTUFORF9DT01QTEVURUQpKSB7CisgICAgICBwcmludGYgKCJSZXRyeTogQ29tbWFuZCA9ICV4LCBSZXNwb25zZV9Db2RlID0gJXhcbiIsIE5DU0lfUmVxdWVzdC5Db21tYW5kLCBOQ1NJX1Jlc3BvbmQuUmVzcG9uc2VfQ29kZSk7CisgICAgICBSZXRyeSsrOworICAgICAgSW5zdGFuY2VJRC0tOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIFJldHJ5ID0gMDsKKyAgICB9CisgIH0gd2hpbGUgKChSZXRyeSAhPSAwKSAmJiAoUmV0cnkgPD0gUkVUUllfQ09VTlQpKTsKKyAgUmV0cnkgPSAwOworfQorCit2b2lkIEVuYWJsZV9DaGFubmVsIChzdHJ1Y3QgZXRoX2RldmljZSogZGV2KQoreworICB1bnNpZ25lZCBsb25nIENvbWJpbmVkX0NoYW5uZWxfSUQ7CisvL1RYCisgIGRvIHsKKyAgICBJbnN0YW5jZUlEKys7CisgICAgTkNTSV9SZXF1ZXN0LklJRCA9IEluc3RhbmNlSUQ7CisgICAgTkNTSV9SZXF1ZXN0LkNvbW1hbmQgPSBFTkFCTEVfQ0hBTk5FTDsKKyAgICBDb21iaW5lZF9DaGFubmVsX0lEID0gKE5DU0lfQ2FwLlBhY2thZ2VfSUQgPDwgNSkgKyBOQ1NJX0NhcC5DaGFubmVsX0lEOworICAgIE5DU0lfUmVxdWVzdC5DaGFubmVsX0lEID0gQ29tYmluZWRfQ2hhbm5lbF9JRDsKKyAgICBOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGggPSAwOworICAgIG1lbWNweSAoKHVuc2lnbmVkIGNoYXIgKil0eF9yaW5nW3R4X25ld10uYnVmLCAmTkNTSV9SZXF1ZXN0LCAzMCk7CisgICAgY29weV9kYXRhIChOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGgpOworICAgIGFzcGVlZG5pY19zZW5kIChkZXYsICh2b2lkICopdHhfcmluZ1t0eF9uZXddLmJ1ZiwgMzAgKyBOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGggKyA0KTsKKy8vUlgKKyAgICBOQ1NJX1J4KCk7CisgICAgaWYgKChOQ1NJX1Jlc3BvbmQuSUlEICE9IEluc3RhbmNlSUQpIHx8IChOQ1NJX1Jlc3BvbmQuQ29tbWFuZCAhPSAoRU5BQkxFX0NIQU5ORUwgfCAweDgwKSkgfHwgKE5DU0lfUmVzcG9uZC5SZXNwb25zZV9Db2RlICE9IENPTU1BTkRfQ09NUExFVEVEKSkgeworICAgICAgcHJpbnRmICgiUmV0cnk6IENvbW1hbmQgPSAleCwgUmVzcG9uc2VfQ29kZSA9ICV4XG4iLCBOQ1NJX1JlcXVlc3QuQ29tbWFuZCwgTkNTSV9SZXNwb25kLlJlc3BvbnNlX0NvZGUpOworICAgICAgUmV0cnkrKzsKKyAgICAgIEluc3RhbmNlSUQtLTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBSZXRyeSA9IDA7CisgICAgfQorICB9IHdoaWxlICgoUmV0cnkgIT0gMCkgJiYgKFJldHJ5IDw9IFJFVFJZX0NPVU5UKSk7CisgIFJldHJ5ID0gMDsKK30KKwordm9pZCBEaXNhYmxlX0NoYW5uZWwgKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpCit7CisgIHVuc2lnbmVkIGxvbmcgQ29tYmluZWRfQ2hhbm5lbF9JRDsKKy8vVFgKKyAgZG8geworICAgIEluc3RhbmNlSUQrKzsKKyAgICBOQ1NJX1JlcXVlc3QuSUlEID0gSW5zdGFuY2VJRDsKKyAgICBOQ1NJX1JlcXVlc3QuQ29tbWFuZCA9IERJU0FCTEVfQ0hBTk5FTDsKKyAgICBDb21iaW5lZF9DaGFubmVsX0lEID0gKE5DU0lfQ2FwLlBhY2thZ2VfSUQgPDwgNSkgKyBOQ1NJX0NhcC5DaGFubmVsX0lEOworICAgIE5DU0lfUmVxdWVzdC5DaGFubmVsX0lEID0gQ29tYmluZWRfQ2hhbm5lbF9JRDsKKyAgICBOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGggPSAoNCA8PCA4KTsKKyAgICBtZW1jcHkgKCh1bnNpZ25lZCBjaGFyICopdHhfcmluZ1t0eF9uZXddLmJ1ZiwgJk5DU0lfUmVxdWVzdCwgMzApOworICAgIE5DU0lfUmVxdWVzdC5QYXlsb2FkX0xlbmd0aCA9IDQ7CisgICAgbWVtc2V0ICgodm9pZCAqKVBheWxvYWRfRGF0YSwgMCwgNCk7CisgICAgUGF5bG9hZF9EYXRhWzNdID0gMHgxOyAvL0FMRAorICAgIGNvcHlfZGF0YSAoTkNTSV9SZXF1ZXN0LlBheWxvYWRfTGVuZ3RoKTsKKyAgICBhc3BlZWRuaWNfc2VuZCAoZGV2LCAodm9pZCAqKXR4X3JpbmdbdHhfbmV3XS5idWYsIDMwICsgTkNTSV9SZXF1ZXN0LlBheWxvYWRfTGVuZ3RoICsgNCk7CisvL1JYCisgICAgTkNTSV9SeCgpOworICAgIGlmICgoTkNTSV9SZXNwb25kLklJRCAhPSBJbnN0YW5jZUlEKSB8fCAoTkNTSV9SZXNwb25kLkNvbW1hbmQgIT0gKERJU0FCTEVfQ0hBTk5FTCB8IDB4ODApKSB8fCAoTkNTSV9SZXNwb25kLlJlc3BvbnNlX0NvZGUgIT0gQ09NTUFORF9DT01QTEVURUQpKSB7CisgICAgICBwcmludGYgKCJSZXRyeTogQ29tbWFuZCA9ICV4LCBSZXNwb25zZV9Db2RlID0gJXhcbiIsIE5DU0lfUmVxdWVzdC5Db21tYW5kLCBOQ1NJX1Jlc3BvbmQuUmVzcG9uc2VfQ29kZSk7CisgICAgICBSZXRyeSsrOworICAgICAgSW5zdGFuY2VJRC0tOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIFJldHJ5ID0gMDsKKyAgICB9CisgIH0gd2hpbGUgKChSZXRyeSAhPSAwKSAmJiAoUmV0cnkgPD0gUkVUUllfQ09VTlQpKTsKKyAgUmV0cnkgPSAwOworfQorCitpbnQgR2V0X0xpbmtfU3RhdHVzIChzdHJ1Y3QgZXRoX2RldmljZSogZGV2KQoreworICB1bnNpZ25lZCBsb25nIENvbWJpbmVkX0NoYW5uZWxfSUQ7CisvL1RYCisgIGRvIHsKKyAgICBJbnN0YW5jZUlEKys7CisgICAgTkNTSV9SZXF1ZXN0LklJRCA9IEluc3RhbmNlSUQ7CisgICAgTkNTSV9SZXF1ZXN0LkNvbW1hbmQgPSBHRVRfTElOS19TVEFUVVM7CisgICAgQ29tYmluZWRfQ2hhbm5lbF9JRCA9IChOQ1NJX0NhcC5QYWNrYWdlX0lEIDw8IDUpICsgTkNTSV9DYXAuQ2hhbm5lbF9JRDsKKyAgICBOQ1NJX1JlcXVlc3QuQ2hhbm5lbF9JRCA9IENvbWJpbmVkX0NoYW5uZWxfSUQ7CisgICAgTkNTSV9SZXF1ZXN0LlBheWxvYWRfTGVuZ3RoID0gMDsKKyAgICBtZW1jcHkgKCh1bnNpZ25lZCBjaGFyICopdHhfcmluZ1t0eF9uZXddLmJ1ZiwgJk5DU0lfUmVxdWVzdCwgMzApOworICAgIGNvcHlfZGF0YSAoTkNTSV9SZXF1ZXN0LlBheWxvYWRfTGVuZ3RoKTsKKyAgICBhc3BlZWRuaWNfc2VuZCAoZGV2LCAodm9pZCAqKXR4X3JpbmdbdHhfbmV3XS5idWYsIDMwICsgTkNTSV9SZXF1ZXN0LlBheWxvYWRfTGVuZ3RoICsgNCk7CisvL1JYCisgICAgTkNTSV9SeCgpOworICAgIGlmICgoTkNTSV9SZXNwb25kLklJRCAhPSBJbnN0YW5jZUlEKSB8fCAoTkNTSV9SZXNwb25kLkNvbW1hbmQgIT0gKEdFVF9MSU5LX1NUQVRVUyB8IDB4ODApKSB8fCAoTkNTSV9SZXNwb25kLlJlc3BvbnNlX0NvZGUgIT0gQ09NTUFORF9DT01QTEVURUQpKSB7CisgICAgICBwcmludGYgKCJSZXRyeTogQ29tbWFuZCA9ICV4LCBSZXNwb25zZV9Db2RlID0gJXhcbiIsIE5DU0lfUmVxdWVzdC5Db21tYW5kLCBOQ1NJX1Jlc3BvbmQuUmVzcG9uc2VfQ29kZSk7CisgICAgICBSZXRyeSsrOworICAgICAgSW5zdGFuY2VJRC0tOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIFJldHJ5ID0gMDsKKyAgICB9CisgIH0gd2hpbGUgKChSZXRyeSAhPSAwKSAmJiAoUmV0cnkgPD0gUkVUUllfQ09VTlQpKTsKKyAgUmV0cnkgPSAwOworICBpZiAoTkNTSV9SZXNwb25kLlBheWxvYWRfRGF0YVszXSAmIDB4NDApIHsKKyAgICByZXR1cm4gKE5DU0lfUmVzcG9uZC5QYXlsb2FkX0RhdGFbM10gJiAweDAxKTsgLy9MaW5rIFVwIG9yIE5vdAorICB9CisgIGVsc2UgeworICAgIHJldHVybiAwOyAvL0F1dG8gTmVnb3RpYXRlIGRpZCBub3QgZmluaXNoCisgIH0KK30KKwordm9pZCBTZXRfTGluayAoc3RydWN0IGV0aF9kZXZpY2UqIGRldikKK3sKKyAgdW5zaWduZWQgbG9uZyBDb21iaW5lZF9DaGFubmVsX0lEOworLy9UWAorICBkbyB7CisgICAgSW5zdGFuY2VJRCsrOworICAgIE5DU0lfUmVxdWVzdC5JSUQgPSBJbnN0YW5jZUlEOworICAgIE5DU0lfUmVxdWVzdC5Db21tYW5kID0gU0VUX0xJTks7CisgICAgQ29tYmluZWRfQ2hhbm5lbF9JRCA9IChOQ1NJX0NhcC5QYWNrYWdlX0lEIDw8IDUpICsgTkNTSV9DYXAuQ2hhbm5lbF9JRDsKKyAgICBOQ1NJX1JlcXVlc3QuQ2hhbm5lbF9JRCA9IENvbWJpbmVkX0NoYW5uZWxfSUQ7CisgICAgTkNTSV9SZXF1ZXN0LlBheWxvYWRfTGVuZ3RoID0gKDggPDwgOCk7CisgICAgbWVtY3B5ICgodW5zaWduZWQgY2hhciAqKXR4X3JpbmdbdHhfbmV3XS5idWYsICZOQ1NJX1JlcXVlc3QsIDMwKTsKKyAgICBOQ1NJX1JlcXVlc3QuUGF5bG9hZF9MZW5ndGggPSA4OworICAgIG1lbXNldCAoKHZvaWQgKilQYXlsb2FkX0RhdGEsIDAsIDgpOworICAgIFBheWxvYWRfRGF0YVsyXSA9IDB4MDI7IC8vZnVsbCBkdXBsZXgKKyAgICBQYXlsb2FkX0RhdGFbM10gPSAweDA0OyAvLzEwME0sIGF1dG8tZGlzYWJsZQorICAgIGNvcHlfZGF0YSAoTkNTSV9SZXF1ZXN0LlBheWxvYWRfTGVuZ3RoKTsKKyAgICBhc3BlZWRuaWNfc2VuZCAoZGV2LCAodm9pZCAqKXR4X3JpbmdbdHhfbmV3XS5idWYsIDMwICsgTkNTSV9SZXF1ZXN0LlBheWxvYWRfTGVuZ3RoICsgNCk7CisvL1JYCisgICAgTkNTSV9SeCgpOworICAgIGlmICgoTkNTSV9SZXNwb25kLklJRCAhPSBJbnN0YW5jZUlEKSB8fCAoTkNTSV9SZXNwb25kLkNvbW1hbmQgIT0gKFNFVF9MSU5LIHwgMHg4MCkpIHx8IChOQ1NJX1Jlc3BvbmQuUmVzcG9uc2VfQ29kZSAhPSBDT01NQU5EX0NPTVBMRVRFRCkpIHsKKyAgICAgIHByaW50ZiAoIlJldHJ5OiBDb21tYW5kID0gJXgsIFJlc3BvbnNlX0NvZGUgPSAleFxuIiwgTkNTSV9SZXF1ZXN0LkNvbW1hbmQsIE5DU0lfUmVzcG9uZC5SZXNwb25zZV9Db2RlKTsKKyAgICAgIFJldHJ5Kys7CisgICAgICBJbnN0YW5jZUlELS07CisgICAgfQorICAgIGVsc2UgeworICAgICAgUmV0cnkgPSAwOworICAgIH0KKyAgfSB3aGlsZSAoKFJldHJ5ICE9IDApICYmIChSZXRyeSA8PSBSRVRSWV9DT1VOVCkpOworICBSZXRyeSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgYXNwZWVkbmljX2luaXQoc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgYmRfdCogYmlzKQoreworICB1bnNpZ25lZCBsb25nIGksIFBhY2thZ2VfRm91bmQgPSAwLCBDaGFubmVsX0ZvdW5kID0gMCwgUmVfU2VuZCA9IDAsIExpbmtfU3RhdHVzOworCisgIFJFU0VUX0RFNFg1KGRldik7CisgIHNldF9tYWNfYWRkcmVzcyAoZGV2LCBiaXMpOworICBzZXRfbWFjX2NvbnRyb2xfcmVnaXN0ZXIgKGRldik7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9SWF9ERVNDOyBpKyspIHsKKyAgICByeF9yaW5nW2ldLnN0YXR1cyA9IGNwdV90b19sZTMyKFJYUEtUX1JEWSArIFJYX0JVRkZfU1opOworICAgIHJ4X3JpbmdbaV0uYnVmID0gKHUzMikoJnJ4X2J1ZmZlcltpXSk7CisgICAgcnhfcmluZ1tpXS5yZXNlcnZlZCA9IDA7CisgIH0KKworICBmb3IgKGk9MDsgaSA8IE5VTV9UWF9ERVNDOyBpKyspIHsKKyAgICB0eF9yaW5nW2ldLnN0YXR1cyA9IDA7CisgICAgdHhfcmluZ1tpXS5kZXMxID0gMDsKKyAgICB0eF9yaW5nW2ldLmJ1ZiA9ICh1MzIpKCZ0eF9idWZmZXJbaV0pOworICAgIHR4X3JpbmdbaV0ucmVzZXJ2ZWQgPSAwOworICB9CisKKyAgcnhSaW5nU2l6ZSA9IE5VTV9SWF9ERVNDOworICB0eFJpbmdTaXplID0gTlVNX1RYX0RFU0M7CisKKyAgcnhfcmluZ1tyeFJpbmdTaXplIC0gMV0uc3RhdHVzIHw9IGNwdV90b19sZTMyKEVET1JSKTsKKyAgdHhfcmluZ1t0eFJpbmdTaXplIC0gMV0uc3RhdHVzIHw9IGNwdV90b19sZTMyKEVET1RSKTsKKworICBPVVRMKGRldiwgKCh1MzIpICZ0eF9yaW5nKSwgVFhSX0JBRFJfUkVHKTsKKyAgT1VUTChkZXYsICgodTMyKSAmcnhfcmluZyksIFJYUl9CQURSX1JFRyk7CisKKyAgU1RBUlRfTUFDKGRldik7CisKKyAgdHhfbmV3ID0gMDsKKyAgcnhfbmV3ID0gMDsKKworICBpZiAoQ09ORklHX01BQzFfUEhZX1NFVFRJTkcgPj0gMSkgeworLy9OQ1NJIFN0YXJ0CisvL0RlU2VsZWN0IFBhY2thZ2UvIFNlbGVjdCBQYWNrYWdlCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgRGVTZWxlY3RfUGFja2FnZSAoZGV2LCBpKTsKKyAgICAgIFBhY2thZ2VfRm91bmQgPSBTZWxlY3RfUGFja2FnZSAoZGV2LCBpKTsKKyAgICAgIGlmIChQYWNrYWdlX0ZvdW5kID09IDEpIHsKKy8vQVNUMjEwMC9BU1QyMDUwL0FTVDExMDAgc3VwcG9ydHMgMSBwYWNrYWdlIG9ubHkgaW4gY3VycmVudCBmaXJtd2FyZSB2ZXJzaW9uCisgICAgICAgIE5DU0lfQ2FwLlBhY2thZ2VfSUQgPSBpOworLy8gICAgICAgIFBhY2thZ2VfRm91bmQgPSAwOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKFBhY2thZ2VfRm91bmQgIT0gMCkgeworLy9Jbml0aWFsaSBTdGF0ZQorICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeyAvL1N1cHBvc2UgMiBjaGFubmVscyBpbiBjdXJyZW50IHZlcnNpb24sIFlvdSBjb3VsZCBtb2RpZnkgaXQgdG8gMHgxRiB0byBzdXBwb3J0IDMxIGNoYW5uZWxzCisgICAgICAgIENoYW5uZWxfRm91bmQgPSBDbGVhcl9Jbml0aWFsX1N0YXRlKGRldiwgaSk7CisgICAgICAgIGlmIChDaGFubmVsX0ZvdW5kID09IDEpIHsKKyAgICAgICAgICBOQ1NJX0NhcC5DaGFubmVsX0lEID0gaTsKKyAgICAgICAgICBwcmludGYgKCJGb3VuZCBOQ1NJIE5ldHdvcmsgQ29udHJvbGxlciBhdCAoJWQsICVkKVxuIiwgTkNTSV9DYXAuUGFja2FnZV9JRCwgTkNTSV9DYXAuQ2hhbm5lbF9JRCk7CisvL0dldCBWZXJzaW9uIGFuZCBDYXBhYmlsaXRpZXMKKyAgICAgICAgICBHZXRfVmVyc2lvbl9JRChkZXYpOworICAgICAgICAgIEdldF9DYXBhYmlsaXRpZXMoZGV2KTsKKyAgICAgICAgICBTZWxlY3RfQWN0aXZlX1BhY2thZ2UoZGV2KTsKKy8vQ29uZmlndXJhdGlvbgorICAgICAgICAgIEVuYWJsZV9TZXRfTUFDX0FkZHJlc3MoZGV2KTsKKyAgICAgICAgICBFbmFibGVfQnJvYWRjYXN0X0ZpbHRlcihkZXYpOworLy9FbmFibGUgVFgKKyAgICAgICAgICBFbmFibGVfTmV0d29ya19UWChkZXYpOworLy9FbmFibGUgQ2hhbm5lbAorICAgICAgICAgIEVuYWJsZV9DaGFubmVsKGRldik7CisvL0dldCBMaW5rIFN0YXR1cworICAgICAgICAgIFJlX0dldF9MaW5rX1N0YXR1czoKKyAgICAgICAgICBMaW5rX1N0YXR1cyA9IEdldF9MaW5rX1N0YXR1cyhkZXYpOworICAgICAgICAgIGlmIChMaW5rX1N0YXR1cyA9PSBMSU5LX1VQKSB7CisgICAgICAgICAgICBwcmludGYgKCJVc2luZyBOQ1NJIE5ldHdvcmsgQ29udHJvbGxlciAoJWQsICVkKVxuIiwgTkNTSV9DYXAuUGFja2FnZV9JRCwgTkNTSV9DYXAuQ2hhbm5lbF9JRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoKExpbmtfU3RhdHVzID09IExJTktfRE9XTikgJiYgKFJlX1NlbmQgPCAyKSkgeworICAgICAgICAgICAgUmVfU2VuZCsrOworICAgICAgICAgICAgZ290byBSZV9HZXRfTGlua19TdGF0dXM7CisgICAgICAgICAgfQorLy9EaXNhYmxlIFRYCisgICAgICAgICAgRGlzYWJsZV9OZXR3b3JrX1RYKGRldik7CisvL0Rpc2FibGUgQ2hhbm5lbAorLy8gICAgICAgICAgRGlzYWJsZV9DaGFubmVsKGRldik7CisgICAgICAgICAgUmVfU2VuZCA9IDA7CisgICAgICAgICAgQ2hhbm5lbF9Gb3VuZCA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgYXNwZWVkbmljX3NlbmQoc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgdm9sYXRpbGUgdm9pZCAqcGFja2V0LCBpbnQgbGVuZ3RoKQoreworICBpbnQgICBzdGF0dXMgPSAtMSwgb2xkbGVuZ3RoID0gMCwgZmFpbCA9IDA7CisgIGludCAgIGk7CisKKyAgaWYgKGxlbmd0aCA8PSAwKSB7CisgICAgcHJpbnRmKCIlczogYmFkIHBhY2tldCBzaXplOiAlZFxuIiwgZGV2LT5uYW1lLCBsZW5ndGgpOworICAgIGdvdG8gRG9uZTsKKyAgfQorCisKKyAgZm9yKGkgPSAwOyAodHhfcmluZ1t0eF9uZXddLnN0YXR1cyAmIGNwdV90b19sZTMyKFRYRE1BX09XTikpID09IDB4ODAwMDAwMDA7IGkrKykgeworICAgIGlmIChpID49IFRPVVRfTE9PUCkgeworICAgICAgcHJpbnRmKCIlczogdHggZXJyb3IgYnVmZmVyIG5vdCByZWFkeVxuIiwgZGV2LT5uYW1lKTsKKyAgICAgIGZhaWwgPSAxOworICAgICAgZ290byBEb25lOworICAgIH0KKyAgfQorCisKKyAgaWYgKGxlbmd0aCA8IDYwKSB7CisgICAgb2xkbGVuZ3RoID0gbGVuZ3RoOworLy8gICAgICAgICAgICBtZW1zZXQgKCh2b2lkICopY3B1X3RvX2xlMzIoKHUzMikgKHBhY2tldCArIGxlbmd0aCkpLCAwLCA2MCAtIGxlbmd0aCk7CisgICAgbGVuZ3RoID0gNjA7CisgIH0KKyAgdHhfcmluZ1t0eF9uZXddLmJ1ZiAgICA9IGNwdV90b19sZTMyKCgodTMyKSBwYWNrZXQpKTsKKyAgdHhfcmluZ1t0eF9uZXddLnN0YXR1cyAgICY9ICh+KDB4M0ZGRikpOworICB0eF9yaW5nW3R4X25ld10uc3RhdHVzICAgfD0gY3B1X3RvX2xlMzIoTFRTIHwgRlRTIHwgbGVuZ3RoKTsKKyAgdHhfcmluZ1t0eF9uZXddLnN0YXR1cyB8PSBjcHVfdG9fbGUzMihUWERNQV9PV04pOworCisgIE9VVEwoZGV2LCBQT0xMX0RFTUFORCwgVFhQRF9SRUcpOworCisgIGZvciAoaSA9IDA7ICh0eF9yaW5nW3R4X25ld10uc3RhdHVzICYgY3B1X3RvX2xlMzIoVFhETUFfT1dOKSkgPT0gMHg4MDAwMDAwMDsgaSsrKQorICB7CisgICAgaWYgKGkgPj0gVE9VVF9MT09QKQorICAgIHsKKyAgICAgIHByaW50ZigiLiVzOiB0eCBidWZmZXIgbm90IHJlYWR5XG4iLCBkZXYtPm5hbWUpOworICAgICAgZmFpbCA9IDE7CisgICAgICBnb3RvIERvbmU7CisgICAgfQorICB9CisKKyAgaWYgKGZhaWwgIT0gMSkgeworICAgIHN0YXR1cyA9IG9sZGxlbmd0aDsKKyAgfQorCisgIERvbmU6CisgIHR4X25ldyA9ICh0eF9uZXcrMSkgJSBOVU1fVFhfREVTQzsKKworICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGFzcGVlZG5pY19yZWN2KHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpCit7CisgIHMzMiAgIHN0YXR1czsKKyAgaW50ICAgbGVuZ3RoICAgID0gMDsKKworICBmb3IgKCA7IDsgKQorICB7CisgICAgc3RhdHVzID0gKHMzMilsZTMyX3RvX2NwdShyeF9yaW5nW3J4X25ld10uc3RhdHVzKTsKKworICAgIGlmICgoc3RhdHVzICYgUlhQS1RfU1RBVFVTKSA9PSAwKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICYgTFJTKSB7CisgICAgICAvKiBWYWxpZCBmcmFtZSBzdGF0dXMuCisgICAgICAgKi8KKyAgICAgIGlmIChzdGF0dXMgJiAoUlhfRVJSIHwgQ1JDX0VSUiB8IEZUTCB8IFJVTlQgfCBSWF9PRERfTkIpKSB7CisKKyAgICAgICAgLyogVGhlcmUgd2FzIGFuIGVycm9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpbnRmKCJSWCBlcnJvciBzdGF0dXMgPSAweCUwOFhcbiIsIHN0YXR1cyk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBBIHZhbGlkIGZyYW1lIHJlY2VpdmVkLgorICAgICAgICAgKi8KKyAgICAgICAgbGVuZ3RoID0gKGxlMzJfdG9fY3B1KHJ4X3JpbmdbcnhfbmV3XS5zdGF0dXMpICYgMHgzRkZGKTsKKyAgICAgICAgZGVidWcoIiVzKCk6IFJYIGJ1ZmZlciAlZCwgJXggcmVjZWl2ZWRcbiIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCByeF9uZXcsIGxlbmd0aCk7CisKKworICAgICAgICAvKiBQYXNzIHRoZSBwYWNrZXQgdXAgdG8gdGhlIHByb3RvY29sCisgICAgICAgICAqIGxheWVycy4KKyAgICAgICAgICovCisgICAgICAgIE5ldFJlY2VpdmUocnhfYnVmZmVyW3J4X25ld10sIGxlbmd0aCAtIDQpOworICAgICAgfQorCisgICAgICAvKiBDaGFuZ2UgYnVmZmVyIG93bmVyc2hpcCBmb3IgdGhpcyBmcmFtZSwgYmFjaworICAgICAgICogdG8gdGhlIGFkYXB0ZXIuCisgICAgICAgKi8KKyAgICAgIHJ4X3JpbmdbcnhfbmV3XS5zdGF0dXMgJj0gY3B1X3RvX2xlMzIoMHg3RkZGRkZGRik7CisvLyAgICAgIHJ4X3JpbmdbcnhfbmV3XS5zdGF0dXMgPSBjcHVfdG9fbGUzMihSWFBLVF9SRFkpOworICAgIH0KKworICAgIC8qIFVwZGF0ZSBlbnRyeSBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICByeF9uZXcgPSAocnhfbmV3ICsgMSkgJSByeFJpbmdTaXplOworICB9CisKKyAgcmV0dXJuIGxlbmd0aDsKK30KKworc3RhdGljIHZvaWQgYXNwZWVkbmljX2hhbHQoc3RydWN0IGV0aF9kZXZpY2UqIGRldikKK3sKKyAgU1RPUF9NQUMoZGV2KTsKK30KKworc3RhdGljIHZvaWQgc2V0X21hY19hZGRyZXNzIChzdHJ1Y3QgZXRoX2RldmljZSogZGV2LCBiZF90KiBiaXMpCit7CisgIHVuc2lnbmVkIGNoYXIgIG1hY19hZGRyZXNzWzZdOyAvLyA2IGJ5dGVzIG1hYyBhZGRyZXNzCisgIHVuc2lnbmVkIGNoYXIgIGV0aGFkZHJlc3NbMjBdOyAvLyBzdHJpbmcgZm9yIHNldGVudiBmdW5jdGlvbgorICBjaGFyICpzOworICBpbnQgaSwgZW52OyAgICAgICAgICAgICAgICAvLyBlbnYgdmFyaWFibGUgMDogZWVwcm9tLCAxOiBlbnZpcm9ubWVudCBwYXJhbWV0ZXJzCisKKyAgcyA9IGdldGVudiAoImVlcHJvbSIpOworICBlbnYgPSAocyAmJiAoKnMgPT0gJ3knKSkgPyAwIDogMTsKKworICBpZiAoZW52ID09IDApIHsKKyAgICBlbnYgPSAxOworICAgIGVlcHJvbV9pbml0ICgpOworICAgIGVlcHJvbV9yZWFkICgweEEwLCAwLCBtYWNfYWRkcmVzcywgNik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICBpZiAobWFjX2FkZHJlc3NbaV0gIT0gMHhGRikgeworICAgICAgICBlbnYgPSAwOyAgLy9TdXBwb3NlIG5vdCBhbGwgMHhGRiBpcyB2YWxpZAorICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChlbnYgPT0gMCkgeyAvLyBFRVBST00KKyAgICBzcHJpbnRmIChldGhhZGRyZXNzLCAiJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgiLCBtYWNfYWRkcmVzc1swXSwgbWFjX2FkZHJlc3NbMV0sIG1hY19hZGRyZXNzWzJdLCBtYWNfYWRkcmVzc1szXSwgbWFjX2FkZHJlc3NbNF0sIG1hY19hZGRyZXNzWzVdKTsKKyAgICBzZXRlbnYgKCJldGhhZGRyIiwgZXRoYWRkcmVzcyk7CisgICAgT1VUTChkZXYsICgobWFjX2FkZHJlc3NbMl0gPDwgMjQpIHwgKG1hY19hZGRyZXNzWzNdIDw8IDE2KSB8IChtYWNfYWRkcmVzc1s0XSA8PCA4KSB8IG1hY19hZGRyZXNzWzVdKSwgTUFDX0xBRFJfUkVHKTsKKyAgICBPVVRMKGRldiwgKChtYWNfYWRkcmVzc1swXSA8PCA4KSB8IG1hY19hZGRyZXNzWzFdKSwgTUFDX01BRFJfUkVHKTsKKyAgICBpZiAoQ09ORklHX01BQzFfUEhZX1NFVFRJTkcgPj0gMSkgeworICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICBOQ1NJX1JlcXVlc3QuU0FbaV0gPSBtYWNfYWRkcmVzc1tpXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSB7IC8vIEVudmlyb25tZW50IFBhcmFtZXRlcnMKKyAgICBPVVRMKGRldiwgKChiaXMtPmJpX2VuZXRhZGRyWzJdIDw8IDI0KSB8IChiaXMtPmJpX2VuZXRhZGRyWzNdIDw8IDE2KSB8IChiaXMtPmJpX2VuZXRhZGRyWzRdIDw8IDgpIHwgYmlzLT5iaV9lbmV0YWRkcls1XSksIE1BQ19MQURSX1JFRyk7CisgICAgT1VUTChkZXYsICgoYmlzLT5iaV9lbmV0YWRkclswXSA8PCA4KSB8IGJpcy0+YmlfZW5ldGFkZHJbMV0pLCBNQUNfTUFEUl9SRUcpOworICAgIGlmIChDT05GSUdfTUFDMV9QSFlfU0VUVElORyA+PSAxKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgIE5DU0lfUmVxdWVzdC5TQVtpXSA9IGJpcy0+YmlfZW5ldGFkZHJbaV07CisgICAgICB9CisgICAgfQorICB9CisKK30KKworCitzdGF0aWMgdTE2IHBoeV9yZWFkX3JlZ2lzdGVyIChzdHJ1Y3QgZXRoX2RldmljZSogZGV2LCB1OCBQSFlfUmVnaXN0ZXIsIHU4IFBIWV9BZGRyZXNzKQoreworICB1MzIgRGF0YSwgU3RhdHVzID0gMCwgTG9vcF9Db3VudCA9IDAsIFBIWV9SZWFkeSA9IDE7CisgIHUxNiBSZXR1cm5fRGF0YTsKKworI2lmZGVmICBSRUFMVEVLX1BIWV9TVVBQT1JUCisgIFBIWV9BZGRyZXNzID0gMHgwMTsKKyNlbmRpZgorLy8yMHVzICogMTAwID0gMm1zID4gKDEgLyAyLjVNaHopICogMHgzNAorICBPVVRMKGRldiwgKFBIWV9SZWdpc3RlciA8PCAyMSkgKyAoUEhZX0FkZHJlc3MgPDwgMTYpICsgTUlJUkQgKyBNRENfQ1lDVEhSLCBQSFlDUl9SRUcpOworICBkbyB7CisgICAgdWRlbGF5KDIwKTsKKyAgICBTdGF0dXMgPSAoSU5MIChkZXYsIFBIWUNSX1JFRykgJiBNSUlSRCk7CisgICAgTG9vcF9Db3VudCsrOworICAgIGlmIChMb29wX0NvdW50ID49IDEwMCkgeworICAgICAgUEhZX1JlYWR5ID0gMDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfSB3aGlsZSAoU3RhdHVzID09IE1JSVJEKTsKKworICBpZiAoUEhZX1JlYWR5ID09IDApIHsKKyAgICBwcmludGYgKCJQSFkgTk9UIFJFREFZICIpOworICAgIHJldHVybiAwOworICB9CisgIERhdGEgPSBJTkwgKGRldiwgUEhZREFUQV9SRUcpOworICBSZXR1cm5fRGF0YSA9IChEYXRhID4+IDE2KTsKKworICByZXR1cm4gUmV0dXJuX0RhdGE7Cit9CisKKworc3RhdGljIHZvaWQgcGh5X3dyaXRlX3JlZ2lzdGVyIChzdHJ1Y3QgZXRoX2RldmljZSogZGV2LCB1OCBQSFlfUmVnaXN0ZXIsIHU4IFBIWV9BZGRyZXNzLCB1MTYgUEhZX0RhdGEpCit7CisgIHUzMiBTdGF0dXMgPSAwLCBMb29wX0NvdW50ID0gMCwgUEhZX1JlYWR5ID0gMTsKKworI2lmZGVmICBSRUFMVEVLX1BIWV9TVVBQT1JUCisgIFBIWV9BZGRyZXNzID0gMHgwMTsKKyNlbmRpZgorLy8yMHVzICogMTAwID0gMm1zID4gKDEgLyAyLjVNaHopICogMHgzNAorICBPVVRMKGRldiwgUEhZX0RhdGEsIFBIWURBVEFfUkVHKTsKKyAgT1VUTChkZXYsIChQSFlfUmVnaXN0ZXIgPDwgMjEpICsgKFBIWV9BZGRyZXNzIDw8IDE2KSArIE1JSVdSICsgTURDX0NZQ1RIUiwgUEhZQ1JfUkVHKTsKKyAgZG8geworICAgIHVkZWxheSgyMCk7CisgICAgU3RhdHVzID0gKElOTCAoZGV2LCBQSFlDUl9SRUcpICYgTUlJV1IpOworICAgIExvb3BfQ291bnQrKzsKKyAgICBpZiAoTG9vcF9Db3VudCA+PSAxMDApIHsKKyAgICAgIFBIWV9SZWFkeSA9IDA7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKFN0YXR1cyA9PSBNSUlXUik7CisgIGlmIChQSFlfUmVhZHkgPT0gMCkgeworICAgIHByaW50ZiAoIlBIWSBOT1QgUkVEQVkgIik7CisgIH0KK30KKworc3RhdGljIHZvaWQgc2V0X21hY19jb250cm9sX3JlZ2lzdGVyIChzdHJ1Y3QgZXRoX2RldmljZSogZGV2KQoreworICB1bnNpZ25lZCBsb25nIE1BQ19DUl9SZWdpc3RlciA9IDA7CisgIHVuc2lnbmVkIGxvbmcgICBMb29wX0NvdW50ID0gMCwgUEhZX1JlYWR5ID0gMSwgQ2hpcF9JRDsKKyAgdTE2ICAgIFBIWV9TdGF0dXMsIFBIWV9TcGVlZCwgUEhZX0R1cGxleCwgUmVzb2x2ZWRfU3RhdHVzID0gMCwgQWR2ZXJ0aXNlLCBMaW5rX1BhcnRuZXI7CisKKyAgaWYgKENPTkZJR19NQUMxX1BIWV9TRVRUSU5HID49IDEpIHsKKyAgICBNQUNfQ1JfUmVnaXN0ZXIgPSBTUEVFRF8xMDBNX01PREVfYml0IHwgUlhfQlJPQURQS1RfYml0IHwgRlVMTERVUF9iaXQgfCBSWE1BQ19FTl9iaXQgfCBSWERNQV9FTl9iaXQgfCBUWE1BQ19FTl9iaXQgfCBUWERNQV9FTl9iaXQgfCBDUkNfQVBEX2JpdDsKKyAgfQorICBlbHNlIHsKKyAgICBNQUNfQ1JfUmVnaXN0ZXIgPSBTUEVFRF8xMDBNX01PREVfYml0IHwgRlVMTERVUF9iaXQgfCBSWE1BQ19FTl9iaXQgfCBSWERNQV9FTl9iaXQgfCBUWE1BQ19FTl9iaXQgfCBUWERNQV9FTl9iaXQgfCBDUkNfQVBEX2JpdDsKKyAgfQorCisgIGlmIChDT05GSUdfTUFDMV9QSFlfU0VUVElORyAhPSAyKSB7CisgICAgQ2hpcF9JRCA9ICgocGh5X3JlYWRfcmVnaXN0ZXIgKGRldiwgMHgwMiwgMCkpIDw8IDE2KTsKKyAgICBDaGlwX0lEIHw9IChwaHlfcmVhZF9yZWdpc3RlciAoZGV2LCAweDAzLCAwKSAmIDB4ZmZmZik7CisgICAgaWYgKCgoQ2hpcF9JRCAmIFBIWUlEX1ZFTkRPUl9NQVNLKSA9PSBQSFlJRF9WRU5ET1JfQlJPQURDT00pIHx8CisgICAgICAgICgoQ2hpcF9JRCAmIFBIWUlEX1ZFTkRPUl9NT0RFTF9NQVNLKSA9PSBQSFlJRF9SVEw4MjAxRUwpKSB7CisgICAgICBBZHZlcnRpc2UgPSBwaHlfcmVhZF9yZWdpc3RlciAoZGV2LCAweDA0LCAwKTsKKyAgICAgIExpbmtfUGFydG5lciA9IHBoeV9yZWFkX3JlZ2lzdGVyIChkZXYsIDB4MDUsIDApOworICAgICAgQWR2ZXJ0aXNlID0gKEFkdmVydGlzZSAmIFBIWV9TUEVFRF9EVVBMRVhfTUFTSyk7CisgICAgICBMaW5rX1BhcnRuZXIgPSAoTGlua19QYXJ0bmVyICYgUEhZX1NQRUVEX0RVUExFWF9NQVNLKTsKKyAgICAgIGlmICgoQWR2ZXJ0aXNlICYgTGlua19QYXJ0bmVyKSAmIFBIWV8xMDBNX0RVUExFWCkgeworICAgICAgICBNQUNfQ1JfUmVnaXN0ZXIgfD0gU1BFRURfMTAwTV9NT0RFX2JpdDsKKyAgICAgICAgTUFDX0NSX1JlZ2lzdGVyIHw9IEZVTExEVVBfYml0OworICAgICAgfQorICAgICAgZWxzZSBpZiAoKEFkdmVydGlzZSAmIExpbmtfUGFydG5lcikgJiBQSFlfMTAwTV9IQUxGKSB7CisgICAgICAgIE1BQ19DUl9SZWdpc3RlciB8PSBTUEVFRF8xMDBNX01PREVfYml0OworICAgICAgICBNQUNfQ1JfUmVnaXN0ZXIgJj0gfkZVTExEVVBfYml0OworICAgICAgfQorICAgICAgZWxzZSBpZiAoKEFkdmVydGlzZSAmIExpbmtfUGFydG5lcikgJiBQSFlfMTBNX0RVUExFWCkgeworICAgICAgICBNQUNfQ1JfUmVnaXN0ZXIgJj0gflNQRUVEXzEwME1fTU9ERV9iaXQ7CisgICAgICAgIE1BQ19DUl9SZWdpc3RlciB8PSBGVUxMRFVQX2JpdDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKChBZHZlcnRpc2UgJiBMaW5rX1BhcnRuZXIpICYgUEhZXzEwTV9IQUxGKSB7CisgICAgICAgIE1BQ19DUl9SZWdpc3RlciAmPSB+U1BFRURfMTAwTV9NT0RFX2JpdDsKKyAgICAgICAgTUFDX0NSX1JlZ2lzdGVyICY9IH5GVUxMRFVQX2JpdDsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKChDaGlwX0lEICYgUEhZSURfVkVORE9SX01BU0spID09IFBIWUlEX1ZFTkRPUl9NQVJWRUxMKSB8fAorICAgICAgICAgICAgICgoQ2hpcF9JRCAmIFBIWUlEX1ZFTkRPUl9NT0RFTF9NQVNLKSA9PSBQSFlJRF9SVEw4MjExKSkgeworLy9NYXggd2FpdGluZyB0aW1lID0gKDIwICsgMiltcyAqIDI1MChQSFlfTE9PUCkgPSA1LjVzCisgICAgICBkbyB7CisgICAgICAgIHVkZWxheSAoMjAwMDApOworICAgICAgICBSZXNvbHZlZF9TdGF0dXMgPSAocGh5X3JlYWRfcmVnaXN0ZXIgKGRldiwgMHgxMSwgMCkgJiBSRVNPTFZFRF9CSVQpOworICAgICAgICBMb29wX0NvdW50Kys7CisgICAgICAgIGlmIChMb29wX0NvdW50ID49IFBIWV9MT09QKSB7CisgICAgICAgICAgUEhZX1JlYWR5ID0gMDsKKyAgICAgICAgICBwcmludGYgKCJQSFkgTk9UIFJFQURZICIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IHdoaWxlIChSZXNvbHZlZF9TdGF0dXMgIT0gUkVTT0xWRURfQklUKTsKKworICAgICAgaWYgKFBIWV9SZWFkeSA9PSAxKSB7CisgICAgICAgIFBIWV9TdGF0dXMgPSBwaHlfcmVhZF9yZWdpc3RlciAoZGV2LCAweDExLCAwKTsKKyAgICAgICAgUEhZX1NwZWVkID0gKFBIWV9TdGF0dXMgJiBQSFlfU1BFRURfTUFTSykgPj4gMTQ7CisgICAgICAgIFBIWV9EdXBsZXggPSAoUEhZX1N0YXR1cyAmIFBIWV9EVVBMRVhfTUFTSykgPj4gMTM7CisKKyAgICAgICAgaWYgKFBIWV9TcGVlZCA9PSBTUEVFRF8xMDAwTSkgeworICAgICAgICAgIE1BQ19DUl9SZWdpc3RlciB8PSBHTUFDX01PREVfYml0OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIE1BQ19DUl9SZWdpc3RlciAmPSB+R01BQ19NT0RFX2JpdDsKKyAgICAgICAgICBpZiAoUEhZX1NwZWVkID09IFNQRUVEXzEwTSkgeworICAgICAgICAgICAgTUFDX0NSX1JlZ2lzdGVyICY9IH5TUEVFRF8xMDBNX01PREVfYml0OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoUEhZX0R1cGxleCA9PSBEVVBMRVhfSEFMRikgeworICAgICAgICAgIE1BQ19DUl9SZWdpc3RlciAmPSB+RlVMTERVUF9iaXQ7CisgICAgICAgIH0KKyAgICAgIH0KKy8vTEVEIENvbnRyb2wKKy8vICAgICAgICAgICAgICBpZiAoQ2hpcF9JRCA9PSAweDFDKSB7CisvLyAgICAgICAgICAgICAgICAgIFBIWV9TdGF0dXMgPSBwaHlfcmVhZF9yZWdpc3RlciAoZGV2LCAweDE4LCAwKTsKKy8vICAgICAgICAgICAgICAgIHBoeV93cml0ZV9yZWdpc3RlciAoZGV2LCAweDE4LCAwLCAoUEhZX1N0YXR1cyB8IDB4MDkpKTsKKy8vICAgICAgICAgICAgICB9CisvL0xFRCBDb250cm9sIERbMF0sIERbNl0KKy8vICAgICAgICAgICAgICBpZiAoQ2hpcF9JRCA9PSAweDE0MSkgeworLy8gICAgICAgICAgICAgICAgICBQSFlfU3RhdHVzID0gcGh5X3JlYWRfcmVnaXN0ZXIgKGRldiwgMHgxOCwgMCk7CisvLyAgICAgICAgICAgICAgICBwaHlfd3JpdGVfcmVnaXN0ZXIgKGRldiwgMHgxOCwgMCwgKChQSFlfU3RhdHVzICYgfigweDQxKSkgfCAweDAxKSk7CisvLyAgICAgICAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChDaGlwX0lEID09IFBIWUlEX0JDTTU0NjEyRSApICB7CisgICAgICBwaHlfd3JpdGVfcmVnaXN0ZXIgKCBkZXYsIDB4MUMsIDEsIDB4OEMwMCApOyAvLyBEaXNhYmxlIEdUWENMSyBDbG9jayBEZWxheSBFbmFibGUKKyAgICAgIHBoeV93cml0ZV9yZWdpc3RlciAoIGRldiwgMHgxOCwgMSwgMHhGMEU3ICk7IC8vIERpc2FibGUgUkdNSUkgUlhEIHRvIFJYQyBTa2V3CisKKyAgICAgIEFkdmVydGlzZSA9IHBoeV9yZWFkX3JlZ2lzdGVyIChkZXYsIDB4MDQsIDEpOworICAgICAgTGlua19QYXJ0bmVyID0gcGh5X3JlYWRfcmVnaXN0ZXIgKGRldiwgMHgwNSwgMSk7CisgICAgICBBZHZlcnRpc2UgPSAoQWR2ZXJ0aXNlICYgUEhZX1NQRUVEX0RVUExFWF9NQVNLKTsKKyAgICAgIExpbmtfUGFydG5lciA9IChMaW5rX1BhcnRuZXIgJiBQSFlfU1BFRURfRFVQTEVYX01BU0spOworICAgICAgaWYgKChBZHZlcnRpc2UgJiBMaW5rX1BhcnRuZXIpICYgUEhZXzEwME1fRFVQTEVYKSB7CisgICAgICAgIE1BQ19DUl9SZWdpc3RlciB8PSBTUEVFRF8xMDBNX01PREVfYml0OworICAgICAgICBNQUNfQ1JfUmVnaXN0ZXIgfD0gRlVMTERVUF9iaXQ7CisgICAgICB9CisgICAgICBlbHNlIGlmICgoQWR2ZXJ0aXNlICYgTGlua19QYXJ0bmVyKSAmIFBIWV8xMDBNX0hBTEYpIHsKKyAgICAgICAgTUFDX0NSX1JlZ2lzdGVyIHw9IFNQRUVEXzEwME1fTU9ERV9iaXQ7CisgICAgICAgIE1BQ19DUl9SZWdpc3RlciAmPSB+RlVMTERVUF9iaXQ7CisgICAgICB9CisgICAgICBlbHNlIGlmICgoQWR2ZXJ0aXNlICYgTGlua19QYXJ0bmVyKSAmIFBIWV8xME1fRFVQTEVYKSB7CisgICAgICAgIE1BQ19DUl9SZWdpc3RlciAmPSB+U1BFRURfMTAwTV9NT0RFX2JpdDsKKyAgICAgICAgTUFDX0NSX1JlZ2lzdGVyIHw9IEZVTExEVVBfYml0OworICAgICAgfQorICAgICAgZWxzZSBpZiAoKEFkdmVydGlzZSAmIExpbmtfUGFydG5lcikgJiBQSFlfMTBNX0hBTEYpIHsKKyAgICAgICAgTUFDX0NSX1JlZ2lzdGVyICY9IH5TUEVFRF8xMDBNX01PREVfYml0OworICAgICAgICBNQUNfQ1JfUmVnaXN0ZXIgJj0gfkZVTExEVVBfYml0OworICAgICAgfQorICAgIH1lbHNlIHsKKyAgICAgIHByaW50ZigiVW5rbm93IENoaXBfSUQgJXhcbiIsQ2hpcF9JRCk7CisgICAgfQorICB9CisgIE9VVEwoZGV2LCBNQUNfQ1JfUmVnaXN0ZXIsIE1BQ0NSX1JFRyk7Cit9CisKKyNlbmRpZiAgLyogQ0ZHX0NNRF9ORVQgJiYgQ09ORklHX05FVF9NVUxUSSAmJiBDT05GSUdfQVNQRUVETUFDICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYXN0MTEwMC5oIGIvaW5jbHVkZS9jb25maWdzL2FzdDExMDAuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYmQ2NTZlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL2FzdDExMDAuaApAQCAtMCwwICsxLDI1NyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogUGV0ZXIgQ2hlbiA8cGV0ZXJjQHNvY2xlLXRlY2guY29tLnR3PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qCisgKiBWZXJzaW9uIElkZW50aXR5IAorICovCisjZGVmaW5lIENPTkZJR19JREVOVF9TVFJJTkcJIiBBU1BFRUQgKHYuMC4xMikgIgorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqIChlYXN5IHRvIGNoYW5nZSkKKyAqLworLy8jZGVmaW5lIENPTkZJR19JTklUX0NSSVRJQ0FMCQkJLyogZGVmaW5lIGZvciBVLUJPT1QgMS4xLjEgKi8KKyN1bmRlZiAgQ09ORklHX0lOSVRfQ1JJVElDQUwJCQkvKiB1bmRlZiBmb3IgIFUtQk9PVCAxLjEuNCAqLyAKKyNkZWZpbmUgQ09ORklHX0FSTTkyNkVKUwkxCQkvKiBUaGlzIGlzIGFuIGFybTkyNmVqcyBDUFUgKi8KKyNkZWZpbmUJQ09ORklHX0FTUEVFRAkJMQorI2RlZmluZSBDT05GSUdfQVNUMTEwMAkJMQorLy8jZGVmaW5lIENPTkZJR19BU1QxMTAwX0ZQR0EKKyN1bmRlZiBDT05GSUdfQVNUMTEwMF9GUEdBCQkJLyogdW5kZWYgaWYgcmVhbCBjaGlwICovCisvLyNkZWZpbmUgQ09ORklHX0FTVDExMDBBMl9QQVRDSAorI3VuZGVmIENPTkZJR19BU1QxMTAwQTJfUEFUQ0gKKy8vI2RlZmluZSBDT05GSUdfMlNQSUZMQVNICQkJLyogQm9vdCBTUEk6IENTMiwgMm5kIFNQSTogQ1MwICovIC8qIE5vdCByZWFkeSAqLworI3VuZGVmIENPTkZJR18yU1BJRkxBU0gKKyN1bmRlZiBDT05GSUdfRERSNTEyXzIwMAorI2RlZmluZSBDT05GSUdfRERSSUkxR18yMDAJMQorI3VuZGVmIENPTkZJR19BU1BFRURfU0xUCisKKy8vI2RlZmluZSBDT05GSUdfVVNFX0lSUQkJCQkvKiB3ZSBkb24ndCBuZWVkIElSUS9GSVEgc3R1ZmYgKi8KKyNkZWZpbmUgQ09ORklHX01JU0NfSU5JVF9SIAorCisvKiAKKyAqIEVudmlyb25tZW50IENvbmZpZworICovCisjZGVmaW5lIENPTkZJR19DTURMSU5FX1RBRwkgMQkJLyogZW5hYmxlIHBhc3Npbmcgb2YgQVRBR3MJKi8KKyNkZWZpbmUgQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTIDEKKyNkZWZpbmUgQ09ORklHX0lOSVRSRF9UQUcJIDEKKyNkZWZpbmUJQ09ORklHX0JPT1RBUkdTIAkiZGVidWcgY29uc29sZT10dHlTMSwxMTUyMDBuOCByYW1kaXNrX3NpemU9MTYzODQgcm9vdD0vZGV2L3JhbSBydyBpbml0PS9saW51eHJjIG1lbT04ME0iCisjaWZkZWYgIENPTkZJR19BU1BFRURfU0xUCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMQkJLyogYXV0b2Jvb3QgYWZ0ZXIgMyBzZWNvbmRzCSovCisjZWxzZQorI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMJCS8qIGF1dG9ib290IGFmdGVyIDMgc2Vjb25kcwkqLworI2VuZGlmCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gMTQwODAwMDAgMTQzMDAwMDAiCisjZGVmaW5lIENPTkZJR19CT09URklMRQkJImFsbC5iaW4iCisjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREZMCisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKKy8qIAorICogQ1BVIFNldHRpbmcKKyAqLworI2RlZmluZSBDUFVfQ0xPQ0tfUkFURQkJMTgwMDAwMDAJLyogMTYuNSBNSHogY2xvY2sgZm9yIHRoZSBBUk0gY29yZSAqLworCisvKgorICogU2l6ZSBvZiBtYWxsb2MoKSBwb29sCisgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19NQUxMT0NfTEVOCQkoQ09ORklHX0VOVl9TSVpFICsgMTI4KjEwMjQpCisjZGVmaW5lIENPTkZJR19TWVNfR0JMX0RBVEFfU0laRQkxMjgJLyogc2l6ZSBpbiBieXRlcyByZXNlcnZlZCBmb3IgaW5pdGlhbCBkYXRhICovCisKKy8qCisgKiBTdGFjayBzaXplcywgIFRoZSBzdGFjayBzaXplcyBhcmUgc2V0IHVwIGluIHN0YXJ0LlMgdXNpbmcgdGhlIHNldHRpbmdzIGJlbG93CisgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRQkoMTI4KjEwMjQpCS8qIHJlZ3VsYXIgc3RhY2sgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRV9JUlEJKDQqMTAyNCkJLyogSVJRIHN0YWNrICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkVfRklRCSg0KjEwMjQpCS8qIEZJUSBzdGFjayAqLworCisvKgorICogTWVtb3J5IENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfTlJfRFJBTV9CQU5LUwkxCSAgIAkvKiB3ZSBoYXZlIDEgYmFuayBvZiBEUkFNICovCisjZGVmaW5lIFBIWVNfU0RSQU1fMQkJMHg0MDAwMDAwMCAJLyogU0RSQU0gQmFuayAjMSAqLworI2RlZmluZSBQSFlTX1NEUkFNXzFfU0laRQkweDQwMDAwMDAgCS8qIDY0IE1CICovCisKKyNkZWZpbmUgQ09ORklHX1NZU19TRFJBTV9CQVNFCTB4NDAwMDAwMDAKKworLyoKKyAqIEZMQVNIIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBQSFlTX0ZMQVNIXzEJCTB4MTQwMDAwMDAgCS8qIEZsYXNoIEJhbmsgIzEgKi8KKyNkZWZpbmUgUEhZU19GTEFTSF8yCQkweDE0ODAwMDAwIAkvKiBGbGFzaCBCYW5rICMyICovCisjZGVmaW5lIFBIWVNfRkxBU0hfMl9CQVNFCTB4MTAwMDAwMDAKKworI2lmZGVmIENPTkZJR18yU1BJRkxBU0gKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9CQVNFCQlQSFlTX0ZMQVNIXzJfQkFTRQorI2RlZmluZSBDT05GSUdfRkxBU0hfQkFOS1NfTElTVCAJeyBQSFlTX0ZMQVNIXzEsIFBIWVNfRkxBU0hfMiB9CisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTIAkyCisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX1NFQ1QJKDI1NikJCS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcCAqLworCisjZGVmaW5lIENPTkZJR19FTlZfSVNfSU5fRkxBU0gJCTEKKyNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVQJCTB4N0YwMDAwIAkvKiBlbnZpcm9ubWVudCBzdGFydHMgaGVyZSAgKi8KKyNkZWZpbmUgQ09ORklHX0VOVl9TSVpFCQkJMHgwMTAwMDAgCS8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yICovCisjZWxzZQorI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0JBU0UJCVBIWVNfRkxBU0hfMQorI2RlZmluZSBDT05GSUdfRkxBU0hfQkFOS1NfTElTVCAJeyBQSFlTX0ZMQVNIXzEgfQorI2RlZmluZSBDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LUyAJMQorI2RlZmluZSBDT05GSUdfU1lTX01BWF9GTEFTSF9TRUNUCSgyNTYpCQkvKiBtYXggbnVtYmVyIG9mIHNlY3RvcnMgb24gb25lIGNoaXAgKi8KKworI2RlZmluZSBDT05GSUdfRU5WX0lTX0lOX0ZMQVNICQkxCisjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUCQkweDdGMDAwMCAJLyogZW52aXJvbm1lbnQgc3RhcnRzIGhlcmUgICovCisjZGVmaW5lIENPTkZJR19FTlZfU0laRQkJCTB4MDEwMDAwIAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvciAqLworI2VuZGlmCisKKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIENPTkZJR19GTEFTSF9TUEkKKworI2RlZmluZSBDT05GSUdfTU9OSVRPUl9CQVNFCQlURVhUX0JBU0UKKyNkZWZpbmUgQ09ORklHX01PTklUT1JfTEVOCQkoMTkyIDw8IDEwKQorCisvKiB0aW1lb3V0IHZhbHVlcyBhcmUgaW4gdGlja3MgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9FUkFTRV9UT1VUCSgyMCpDT05GSUdfU1lTX0haKSAJLyogVGltZW91dCBmb3IgRmxhc2ggRXJhc2UgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9XUklURV9UT1VUCSgyMCpDT05GSUdfU1lTX0haKSAJLyogVGltZW91dCBmb3IgRmxhc2ggV3JpdGUgKi8KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfU1lTX0xPTkdIRUxQCQkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLworCisjZGVmaW5lIENPTkZJR19TWVNfUFJPTVBUCQkiYm9vdCMgIiAJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLworI2RlZmluZSBDT05GSUdfU1lTX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworI2RlZmluZSBDT05GSUdfU1lTX1BCU0laRSAoQ09ORklHX1NZU19DQlNJWkUrc2l6ZW9mKENPTkZJR19TWVNfUFJPTVBUKSsxNikgLyogUHJpbnQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19NQVhBUkdTCQkxNgkJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MJKi8KKyNkZWZpbmUgQ09ORklHX1NZU19CQVJHU0laRQkJQ09ORklHX1NZU19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZQkqLworCisjZGVmaW5lIENPTkZJR19TWVNfTUVNVEVTVF9TVEFSVAkweDQwMDAwMDAwCS8qIG1lbXRlc3Qgd29ya3Mgb24JKi8KKyNkZWZpbmUgQ09ORklHX1NZU19NRU1URVNUX0VORAkJMHg0NEZGRkZGRgkvKiAyNTYgTUIgaW4gRFJBTQkqLworCisjZGVmaW5lCUNPTkZJR19TWVNfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworI3VuZGVmCUNPTkZJR19TWVNfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworCisjZGVmaW5lIENPTkZJR19TWVNfTE9BRF9BRERSCQkweDQzMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCisKKyNkZWZpbmUgQ09ORklHX1NZU19USU1FUkJBU0UJCTB4MUU3ODIwMDAJLyogdXNlIHRpbWVyIDEgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19IWgkJCSgxKjEwMDAqMTAwMCkJLyogdXNlIGV4dGVybmFsIGNsayAoMU0pICovCisKKy8qCisgKiBTZXJpYWwgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MF9SRUdfU0laRQk0CisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MF9DTEsJCTI0MDAwMDAwCisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MF9DT00xCQkweDFlNzgzMDAwCisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MF9DT00yCQkweDFlNzg0MDAwCisjZGVmaW5lCUNPTkZJR19TWVNfTE9BRFNfQkFVRF9DSEFOR0UKKyNkZWZpbmUgQ09ORklHX1NFUklBTDEJCQkxCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYCQkyCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJCTExNTIwMAorI2RlZmluZSBDT05GSUdfU1lTX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KKworLyoKKyAqIFVTQiBkZXZpY2UgY29uZmlndXJhdGlvbgorICovCisvKgorI2RlZmluZSBDT05GSUdfVVNCX0RFVklDRQkJMQorI2RlZmluZSBDT05GSUdfVVNCX1RUWQkJCTEKKworI2RlZmluZSBDT05GSUdfVVNCRF9WRU5ET1JJRAkJMHgxMjM0CisjZGVmaW5lIENPTkZJR19VU0JEX1BST0RVQ1RJRAkJMHg1Njc4CisjZGVmaW5lIENPTkZJR19VU0JEX01BTlVGQUNUVVJFUgkiU2llbWVucyIKKyNkZWZpbmUgQ09ORklHX1VTQkRfUFJPRFVDVF9OQU1FCSJTWDEiCisqLworCisvKgorICogSTJDIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfSEFSRF9JMkMKKyNkZWZpbmUgQ09ORklHX1NZU19JMkNfU1BFRUQJCTEwMDAwMAorI2RlZmluZSBDT05GSUdfU1lTX0kyQ19TTEFWRQkJMQorI2RlZmluZSBDT05GSUdfRFJJVkVSX0FTUEVFRF9JMkMKKworLyoKKyogRUVQUk9NIGNvbmZpZ3VyYXRpb24KKyovCisjZGVmaW5lIENPTkZJR19TWVNfSTJDX0VFUFJPTV9BRERSX0xFTiAJMgorI2RlZmluZSBDT05GSUdfU1lTX0kyQ19FRVBST01fQUREUiAJMHhhMAorCisvKgorICogTklDIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBfX0JZVEVfT1JERVIgX19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIF9fTElUVExFX0VORElBTl9CSVRGSUVMRAorI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgorI2RlZmluZSBDT05GSUdfQVNQRUVETklDCisvLyNkZWZpbmUgQ09ORklHX01BQzFfUEhZX0xJTktfSU5URVJSVVBUCisvLyNkZWZpbmUgQ09ORklHX01BQzJfRU5BQkxFCisvLyNkZWZpbmUgQ09ORklHX01BQzJfTUlJX0VOQUJMRQorLy8jZGVmaW5lIENPTkZJR19NQUMyX1BIWV9MSU5LX0lOVEVSUlVQVAorCisvKgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogTk9USUNFOiBNQUMxIGFuZCBNQUMyIG5vdyBoYXZlIHRoZWlyIG93biBzZXBlcmF0ZSBQSFkgY29uZmlndXJhdGlvbi4KKyogV2UgdXNlIDIgYml0cyBmb3IgZWFjaCBNQUMgaW4gdGhlIHNjcmF0Y2ggcmVnaXN0ZXIoRFsxNToxMV0gaW4gMHgxRTZFMjA0MCkgdG8KKyogaW5mb3JtIGtlcm5lbCBkcml2ZXIuCisqIFRoZSBtZWFuaW5ncyBvZiB0aGUgMiBiaXRzIGFyZToKKyogMDAoMCk6IERlZGljYXRlZCBQSFkKKyogMDEoMSk6IEFTUEVFRCdzIEVWQSArIElOVEVMJ3MgTkMtU0kgUEhZIGNoaXAgRVZBCisqIDEwKDIpOiBBU1BFRUQncyBNQUMgaXMgY29ubmVjdGVkIHRvIE5DLVNJIFBIWSBjaGlwIGRpcmVjdGx5CisqIDExOiBSZXNlcnZlZAorKgorKiBXZSB1c2UgQ09ORklHX01BQzFfUEhZX1NFVFRJTkcgYW5kIENPTkZJR19NQUMyX1BIWV9TRVRUSU5HIGluIFUtQm9vdAorKiAwOiBEZWRpY2F0ZWQgUEhZCisqIDE6IEFTUEVFRCdzIEVWQSArIElOVEVMJ3MgTkMtU0kgUEhZIGNoaXAgRVZBCisqIDI6IEFTUEVFRCdzIE1BQyBpcyBjb25uZWN0ZWQgdG8gTkMtU0kgUEhZIGNoaXAgZGlyZWN0bHkKKyogMzogUmVzZXJ2ZWQKKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2RlZmluZSBDT05GSUdfTUFDMV9QSFlfU0VUVElORwkJMAorI2RlZmluZSBDT05GSUdfTUFDMl9QSFlfU0VUVElORwkJMAorI2RlZmluZSBDT05GSUdfTkVUX01VTFRJCisjZGVmaW5lIENPTkZJR19FVEhBQ1QJCQlhc3BlZWRuaWMjMAorI2RlZmluZSBDT05GSUdfR0FURVdBWUlQCQkxOTIuMTY4LjAuMQorI2RlZmluZSBDT05GSUdfTkVUTUFTSwkJCTI1NS4yNTUuMjU1LjAKKyNkZWZpbmUgQ09ORklHX0lQQUREUgkJCTE5Mi4xNjguMC4xODgKKyNkZWZpbmUgQ09ORklHX1NFUlZFUklQCQkJMTkyLjE2OC4wLjEyNgorI2RlZmluZSBDT05GSUdfRVRIQUREUgkJCTAwOkMwOkE4OjEyOjM0OjU2CisjZGVmaW5lIENPTkZJR19FVEgxQUREUgkJCTAwOkMwOkE4OjEyOjM0OjU3CisKKy8qCisgKiBTTFQKKyAqLworLyogCisjZGVmaW5lIENPTkZJR19TTFQKKyNkZWZpbmUgQ0ZHX0NNRF9TTFQJCShDRkdfQ01EX1JFR1RFU1QgfCBDRkdfQ01EX01BQ1RFU1QgfCBDRkdfQ01EX1ZJREVPVEVTVCB8IENGR19DTURfSEFDVEVTVCB8IENGR19DTURfTUlDVEVTVCkKKyovCisKKyNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYXN0MjEwMC5oIGIvaW5jbHVkZS9jb25maWdzL2FzdDIxMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzczM2I5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL2FzdDIxMDAuaApAQCAtMCwwICsxLDI3MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogUGV0ZXIgQ2hlbiA8cGV0ZXJjQHNvY2xlLXRlY2guY29tLnR3PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICogKGVhc3kgdG8gY2hhbmdlKQorICovCisvLyNkZWZpbmUgQ09ORklHX0lOSVRfQ1JJVElDQUwJCQkvKiBkZWZpbmUgZm9yIFUtQk9PVCAxLjEuMSAqLworI3VuZGVmICBDT05GSUdfSU5JVF9DUklUSUNBTAkJCS8qIHVuZGVmIGZvciAgVS1CT09UIDEuMS40ICovIAorI2RlZmluZSBDT05GSUdfQVJNOTI2RUpTCTEJCS8qIFRoaXMgaXMgYW4gYXJtOTI2ZWpzIENQVSAqLworI2RlZmluZQlDT05GSUdfQVNQRUVECQkxCisjZGVmaW5lIENPTkZJR19BU1QyMTAwCQkxCisvLyNkZWZpbmUgQ09ORklHX0FTVDIxMDBfRlBHQQorI3VuZGVmIENPTkZJR19BU1QyMTAwX0ZQR0EJCQkvKiB1bmRlZiBpZiByZWFsIGNoaXAgKi8KKy8vI2RlZmluZSBDT05GSUdfQVNUMjEwMEEyX1BBVENICisjdW5kZWYgQ09ORklHX0FTVDIxMDBBMl9QQVRDSAorI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0NGSQkJCQkvKiBDT05GSUdfRkxBU0hfQ0ZJLCBDT05GSUdfRkxBU0hfU1BJIGlzIGV4Y2x1c2l2ZSovCisvLyNkZWZpbmUgQ09ORklHX0ZMQVNIX1NQSQorLy8jZGVmaW5lIENPTkZJR18yU1BJRkxBU0gJCQkvKiBCb290IFNQSTogQ1MyLCAybmQgU1BJOiBDUzAgKi8KKyN1bmRlZiBDT05GSUdfRERSSUkxR18yNjYKKyN1bmRlZiBDT05GSUdfMlNQSUZMQVNICisjdW5kZWYgQ09ORklHX0FTUEVFRF9TTFQKKworLy8jZGVmaW5lIENPTkZJR19VU0VfSVJRCQkJCS8qIHdlIGRvbid0IG5lZWQgSVJRL0ZJUSBzdHVmZiAqLworI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX1IgCisKKy8qIAorICogRW52aXJvbm1lbnQgQ29uZmlnCisgKi8KKyNkZWZpbmUgQ09ORklHX0NNRExJTkVfVEFHCSAxCQkvKiBlbmFibGUgcGFzc2luZyBvZiBBVEFHcwkqLworI2RlZmluZSBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MgMQorI2RlZmluZSBDT05GSUdfSU5JVFJEX1RBRwkgMQorI2RlZmluZQlDT05GSUdfQk9PVEFSR1MgCSJkZWJ1ZyBjb25zb2xlPXR0eVMxLDExNTIwMG44IHJhbWRpc2tfc2l6ZT0xNjM4NCByb290PS9kZXYvcmFtIHJ3IGluaXQ9L2xpbnV4cmMgbWVtPTgwTSIKKyNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCQkvKiBhdXRvYm9vdCBhZnRlciAzIHNlY29uZHMJKi8KKyNpZmRlZglDT05GSUdfU1lTX0ZMQVNIX0NGSSAKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSAxMDA4MDAwMCAxMDMwMDAwMCIKKyNlbHNlCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gMTQwODAwMDAgMTQzMDAwMDAiCisjZW5kaWYKKyNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCQkiYWxsLmJpbiIKKyNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ERkwKKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKworLyogCisgKiBDUFUgU2V0dGluZworICovCisjZGVmaW5lIENQVV9DTE9DS19SQVRFCQkxODAwMDAwMAkvKiAxNi41IE1IeiBjbG9jayBmb3IgdGhlIEFSTSBjb3JlICovCisKKy8qCisgKiBTaXplIG9mIG1hbGxvYygpIHBvb2wKKyAqLworI2RlZmluZSBDT05GSUdfU1lTX01BTExPQ19MRU4JCShDT05GSUdfRU5WX1NJWkUgKyAxMjgqMTAyNCkKKyNkZWZpbmUgQ09ORklHX1NZU19HQkxfREFUQV9TSVpFCTEyOAkvKiBzaXplIGluIGJ5dGVzIHJlc2VydmVkIGZvciBpbml0aWFsIGRhdGEgKi8KKworLyoKKyAqIFN0YWNrIHNpemVzLCAgVGhlIHN0YWNrIHNpemVzIGFyZSBzZXQgdXAgaW4gc3RhcnQuUyB1c2luZyB0aGUgc2V0dGluZ3MgYmVsb3cKKyAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFCSgxMjgqMTAyNCkJLyogcmVndWxhciBzdGFjayAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFX0lSUQkoNCoxMDI0KQkvKiBJUlEgc3RhY2sgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRV9GSVEJKDQqMTAyNCkJLyogRklRIHN0YWNrICovCisKKy8qCisgKiBNZW1vcnkgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19OUl9EUkFNX0JBTktTCTEJICAgCS8qIHdlIGhhdmUgMSBiYW5rIG9mIERSQU0gKi8KKyNkZWZpbmUgUEhZU19TRFJBTV8xCQkweDQwMDAwMDAwIAkvKiBTRFJBTSBCYW5rICMxICovCisjZGVmaW5lIFBIWVNfU0RSQU1fMV9TSVpFCTB4NDAwMDAwMCAJLyogNjQgTUIgKi8KKworI2RlZmluZSBDT05GSUdfU1lTX1NEUkFNX0JBU0UJMHg0MDAwMDAwMAorCisvKgorICogRkxBU0ggQ29uZmlndXJhdGlvbgorICovCisjaWZkZWYgQ09ORklHX1NZU19GTEFTSF9DRkkJCQkJLyogTk9SIEZsYXNoICovCisKKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkweDEwMDAwMDAwIAkvKiBGbGFzaCBCYW5rICMxICovCisKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9CQVNFCQlQSFlTX0ZMQVNIXzEKKyNkZWZpbmUgQ09ORklHX0ZMQVNIX0JBTktTX0xJU1QgCXsgUEhZU19GTEFTSF8xIH0KKworI2RlZmluZSBDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LUyAJMQorI2RlZmluZSBDT05GSUdfU1lTX01BWF9GTEFTSF9TRUNUCSgyNTYpCQkvKiBtYXggbnVtYmVyIG9mIHNlY3RvcnMgb24gb25lIGNoaXAgKi8KKworI2RlZmluZSBDT05GSUdfRU5WX0lTX0lOX0ZMQVNICTEKKyNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVQJCTB4NjAwMDAgCS8qIGVudmlyb25tZW50IHN0YXJ0cyBoZXJlICAqLworI2RlZmluZSBDT05GSUdfRU5WX1NJWkUJCTB4MjAwMDAgCS8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yICovCisKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9DRklfQU1EX1JFU0VUCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfVVNFX0JVRkZFUl9XUklURQorCisjZWxzZQkJCQkJCS8qIFNQSSBGbGFzaCAqLworCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJMHgxNDAwMDAwMCAJLyogRmxhc2ggQmFuayAjMSAqLworI2RlZmluZSBQSFlTX0ZMQVNIXzIJCTB4MTQ4MDAwMDAgCS8qIEZsYXNoIEJhbmsgIzIgKi8KKyNkZWZpbmUgUEhZU19GTEFTSF8yX0JBU0UJMHgxMDAwMDAwMAorCisjaWZkZWYgQ09ORklHXzJTUElGTEFTSAorI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0JBU0UJCVBIWVNfRkxBU0hfMl9CQVNFCisjZGVmaW5lIENPTkZJR19GTEFTSF9CQU5LU19MSVNUIAl7IFBIWVNfRkxBU0hfMSwgUEhZU19GTEFTSF8yIH0KKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1MgCTIKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfU0VDVAkoMjU2KQkJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwICovCisKKyNkZWZpbmUgQ09ORklHX0VOVl9JU19JTl9GTEFTSAkJMQorI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVAkJMHg3RjAwMDAgCS8qIGVudmlyb25tZW50IHN0YXJ0cyBoZXJlICAqLworI2RlZmluZSBDT05GSUdfRU5WX1NJWkUJCQkweDAxMDAwMCAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IgKi8KKyNlbHNlCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfQkFTRQkJUEhZU19GTEFTSF8xCisjZGVmaW5lIENPTkZJR19GTEFTSF9CQU5LU19MSVNUIAl7IFBIWVNfRkxBU0hfMSB9CisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTIAkxCisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX1NFQ1QJKDI1NikJCS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcCAqLworCisjZGVmaW5lIENPTkZJR19FTlZfSVNfSU5fRkxBU0gJCTEKKyNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVQJCTB4N0YwMDAwIAkvKiBlbnZpcm9ubWVudCBzdGFydHMgaGVyZSAgKi8KKyNkZWZpbmUgQ09ORklHX0VOVl9TSVpFCQkJMHgwMTAwMDAgCS8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yICovCisjZW5kaWYKKworI2VuZGlmCisKKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOCisKKyNkZWZpbmUgQ09ORklHX01PTklUT1JfQkFTRQkJVEVYVF9CQVNFCisjZGVmaW5lIENPTkZJR19NT05JVE9SX0xFTgkJKDE5MiA8PCAxMCkKKworLyogdGltZW91dCB2YWx1ZXMgYXJlIGluIHRpY2tzICovCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfRVJBU0VfVE9VVAkoMjAqQ09ORklHX1NZU19IWikgCS8qIFRpbWVvdXQgZm9yIEZsYXNoIEVyYXNlICovCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfV1JJVEVfVE9VVAkoMjAqQ09ORklHX1NZU19IWikgCS8qIFRpbWVvdXQgZm9yIEZsYXNoIFdyaXRlICovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KKworI2RlZmluZSBDT05GSUdfU1lTX1BST01QVAkJImJvb3QjICIgCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KKyNkZWZpbmUgQ09ORklHX1NZU19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNkZWZpbmUgQ09ORklHX1NZU19QQlNJWkUgKENPTkZJR19TWVNfQ0JTSVpFK3NpemVvZihDT05GSUdfU1lTX1BST01QVCkrMTYpIC8qIFByaW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENPTkZJR19TWVNfTUFYQVJHUwkJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENPTkZJR19TWVNfQkFSR1NJWkUJCUNPTkZJR19TWVNfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUJKi8KKworI2RlZmluZSBDT05GSUdfU1lTX01FTVRFU1RfU1RBUlQJMHg0MDAwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uCSovCisjZGVmaW5lIENPTkZJR19TWVNfTUVNVEVTVF9FTkQJCTB4NDRGRkZGRkYJLyogMjU2IE1CIGluIERSQU0JKi8KKworI2RlZmluZQlDT05GSUdfU1lTX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKyN1bmRlZglDT05GSUdfU1lTX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKworI2RlZmluZSBDT05GSUdfU1lTX0xPQURfQUREUgkJMHg0MzAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLworCisjZGVmaW5lIENPTkZJR19TWVNfVElNRVJCQVNFCQkweDFFNzgyMDAwCS8qIHVzZSB0aW1lciAxICovCisjZGVmaW5lIENPTkZJR19TWVNfSFoJCQkoMSoxMDAwKjEwMDApCS8qIHVzZSBleHRlcm5hbCBjbGsgKDFNKSAqLworCisvKgorICogU2VyaWFsIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTAKKyNkZWZpbmUgQ09ORklHX1NZU19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfUkVHX1NJWkUJNAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfQ0xLCQkyNDAwMDAwMAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfQ09NMQkJMHgxZTc4MzAwMAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfQ09NMgkJMHgxZTc4NDAwMAorI2RlZmluZQlDT05GSUdfU1lTX0xPQURTX0JBVURfQ0hBTkdFCisjZGVmaW5lIENPTkZJR19TRVJJQUwxCQkJMQorI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWAkJMgorI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCQkxMTUyMDAKKyNkZWZpbmUgQ09ORklHX1NZU19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CisKKy8qCisgKiBVU0IgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyAqLworLyoKKyNkZWZpbmUgQ09ORklHX1VTQl9ERVZJQ0UJCTEKKyNkZWZpbmUgQ09ORklHX1VTQl9UVFkJCQkxCisKKyNkZWZpbmUgQ09ORklHX1VTQkRfVkVORE9SSUQJCTB4MTIzNAorI2RlZmluZSBDT05GSUdfVVNCRF9QUk9EVUNUSUQJCTB4NTY3OAorI2RlZmluZSBDT05GSUdfVVNCRF9NQU5VRkFDVFVSRVIJIlNpZW1lbnMiCisjZGVmaW5lIENPTkZJR19VU0JEX1BST0RVQ1RfTkFNRQkiU1gxIgorKi8KKworLyoKKyAqIEkyQyBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX0hBUkRfSTJDCisjZGVmaW5lIENPTkZJR19TWVNfSTJDX1NQRUVECQkxMDAwMDAKKyNkZWZpbmUgQ09ORklHX1NZU19JMkNfU0xBVkUJCTEKKyNkZWZpbmUgQ09ORklHX0RSSVZFUl9BU1BFRURfSTJDCisKKy8qCisqIEVFUFJPTSBjb25maWd1cmF0aW9uCisqLworI2RlZmluZSBDT05GSUdfU1lTX0kyQ19FRVBST01fQUREUl9MRU4gCTIKKyNkZWZpbmUgQ09ORklHX1NZU19JMkNfRUVQUk9NX0FERFIgCTB4YTAKKworLyoKKyAqIE5JQyBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgX19CWVRFX09SREVSIF9fTElUVExFX0VORElBTgorI2RlZmluZSBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKKyNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KKyNkZWZpbmUgQ09ORklHX0FTUEVFRE5JQworI2RlZmluZSBDT05GSUdfTUFDMV9QSFlfTElOS19JTlRFUlJVUFQKKyNkZWZpbmUgQ09ORklHX01BQzJfRU5BQkxFCisjZGVmaW5lIENPTkZJR19NQUMyX01JSV9FTkFCTEUKKy8vI2RlZmluZSBDT05GSUdfTUFDMl9QSFlfTElOS19JTlRFUlJVUFQKKy8qCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiBOT1RJQ0U6IE1BQzEgYW5kIE1BQzIgbm93IGhhdmUgdGhlaXIgb3duIHNlcGVyYXRlIFBIWSBjb25maWd1cmF0aW9uLgorKiBXZSB1c2UgMiBiaXRzIGZvciBlYWNoIE1BQyBpbiB0aGUgc2NyYXRjaCByZWdpc3RlcihEWzE1OjExXSBpbiAweDFFNkUyMDQwKSB0bworKiBpbmZvcm0ga2VybmVsIGRyaXZlci4KKyogVGhlIG1lYW5pbmdzIG9mIHRoZSAyIGJpdHMgYXJlOgorKiAwMCgwKTogRGVkaWNhdGVkIFBIWQorKiAwMSgxKTogQVNQRUVEJ3MgRVZBICsgSU5URUwncyBOQy1TSSBQSFkgY2hpcCBFVkEKKyogMTAoMik6IEFTUEVFRCdzIE1BQyBpcyBjb25uZWN0ZWQgdG8gTkMtU0kgUEhZIGNoaXAgZGlyZWN0bHkKKyogMTE6IFJlc2VydmVkCisqCisqIFdlIHVzZSBDT05GSUdfTUFDMV9QSFlfU0VUVElORyBhbmQgQ09ORklHX01BQzJfUEhZX1NFVFRJTkcgaW4gVS1Cb290CisqIDA6IERlZGljYXRlZCBQSFkKKyogMTogQVNQRUVEJ3MgRVZBICsgSU5URUwncyBOQy1TSSBQSFkgY2hpcCBFVkEKKyogMjogQVNQRUVEJ3MgTUFDIGlzIGNvbm5lY3RlZCB0byBOQy1TSSBQSFkgY2hpcCBkaXJlY3RseQorKiAzOiBSZXNlcnZlZAorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisjZGVmaW5lIENPTkZJR19NQUMxX1BIWV9TRVRUSU5HCQkwCisjZGVmaW5lIENPTkZJR19NQUMyX1BIWV9TRVRUSU5HCQkwCisjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkKKyNkZWZpbmUgQ09ORklHX0VUSEFDVAkJCWFzcGVlZG5pYyMwCisjZGVmaW5lIENPTkZJR19HQVRFV0FZSVAJCTE5Mi4xNjguMC4xCisjZGVmaW5lIENPTkZJR19ORVRNQVNLCQkJMjU1LjI1NS4yNTUuMAorI2RlZmluZSBDT05GSUdfSVBBRERSCQkJMTkyLjE2OC4wLjE4OAorI2RlZmluZSBDT05GSUdfU0VSVkVSSVAJCQkxOTIuMTY4LjAuMTA2CisjZGVmaW5lIENPTkZJR19FVEhBRERSCQkJMDA6QzA6QTg6MTI6MzQ6NTYKKyNkZWZpbmUgQ09ORklHX0VUSDFBRERSCQkJMDA6QzA6QTg6MTI6MzQ6NTcKKworLyoKKyAqIFNMVAorICovCisvKgorI2RlZmluZSBDT05GSUdfU0xUCisjZGVmaW5lIENPTkZJR19DTURfU0xUCQkoQ09ORklHX0NNRF9SRUdURVNUIHwgQ09ORklHX0NNRF9NQUNURVNUIHwgQ09ORklHX0NNRF9WSURFT1RFU1QgfCBDT05GSUdfQ01EX0hBQ1RFU1QgfCBDT05GSUdfQ01EX01JQ1RFU1QpCisqLworCisjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2FzdDIzMDAuaCBiL2luY2x1ZGUvY29uZmlncy9hc3QyMzAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc4ZTdjMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy9hc3QyMzAwLmgKQEAgLTAsMCArMSwzMjUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFBldGVyIENoZW4gPHBldGVyY0Bzb2NsZS10ZWNoLmNvbS50dz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqIChlYXN5IHRvIGNoYW5nZSkKKyAqLworLy8jZGVmaW5lIENPTkZJR19JTklUX0NSSVRJQ0FMCQkJLyogZGVmaW5lIGZvciBVLUJPT1QgMS4xLjEgKi8KKyN1bmRlZiAgQ09ORklHX0lOSVRfQ1JJVElDQUwJCQkvKiB1bmRlZiBmb3IgIFUtQk9PVCAxLjEuNCAqLyAKKyNkZWZpbmUgQ09ORklHX0FSTTkyNkVKUwkxCQkvKiBUaGlzIGlzIGFuIGFybTkyNmVqcyBDUFUgKi8KKyNkZWZpbmUJQ09ORklHX0FTUEVFRAkJMQorI2RlZmluZSBDT05GSUdfQVNUMjMwMAkJMQorLy8jZGVmaW5lIENPTkZJR19BU1QxMDcwCQkxCisvLyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9DRkkJCQkvKiBDT05GSUdfRkxBU0hfQ0ZJLCBDT05GSUdfRkxBU0hfU1BJIGlzIGV4Y2x1c2l2ZSovCisjZGVmaW5lIENPTkZJR19GTEFTSF9TUEkKKy8vI2RlZmluZSBDT05GSUdfMlNQSUZMQVNICQkJLyogQm9vdCBTUEk6IENTMiwgMm5kIFNQSTogQ1MwICovCisjdW5kZWYgQ09ORklHXzJTUElGTEFTSAorI3VuZGVmIENPTkZJR19BU1BFRURfU0xUCisjZGVmaW5lIENPTkZJR19GTEFTSF9BU1QyMzAwCisjZGVmaW5lIENPTkZJR19GTEFTSF9BU1QyMzAwX0RNQQorLy8jZGVmaW5lIENPTkZJR19GTEFTSF9TUEl4Ml9EdW1teQorLy8jZGVmaW5lIENPTkZJR19GTEFTSF9TUEl4NF9EdW1teQorI2RlZmluZSBDT05GSUdfQ1JUX0RJU1BMQVkJMQkJLyogdW5kZWYgaWYgbm90IHN1cHBvcnQgQ1JUICovCisKKy8vI2RlZmluZSBDT05GSUdfVVNFX0lSUQkJCQkvKiB3ZSBkb24ndCBuZWVkIElSUS9GSVEgc3R1ZmYgKi8KKyNkZWZpbmUgQ09ORklHX01JU0NfSU5JVF9SIAorCisvKgorICogRFJBTSBDb25maWcKKyAqCisgKiAxLiBEUkFNIFNpemUgICAgICAgICAgICAgIC8vCisgKiAgICBDT05GSUdfRFJBTV81MTJNQklUICAgIC8vIDUxMk0gYml0CisgKiAgICBDT05GSUdfRFJBTV8xR0JJVCAgICAgIC8vIDFHICAgYml0IChkZWZhdWx0KQorICogICAgQ09ORklHX0RSQU1fMkdCSVQgICAgICAvLyAyRyAgIGJpdAorICogICAgQ09ORklHX0RSQU1fNEdCSVQgICAgICAvLyA0RyAgIGJpdCAKKyAqIDIuIERSQU0gU3BlZWQgICAgICAgICAgICAgLy8KKyAqICAgIENPTkZJR19EUkFNXzMzNiAgICAgICAgLy8gMzM2TUh6IChERFItNjY3KQorICogICAgQ09ORklHX0RSQU1fNDA4ICAgICAgICAvLyA0MDhNSHogKEREUi04MDApIChkZWZhdWx0KQorICogMy4gVkdBIE1vZGUKKyAqICAgIENPTkZJR19DUlRfRElTUExBWSAgICAgLy8gZGVmaW5lIHRvIGRpc2FibGUgVkdBIGZ1bmN0aW9uCisgKiA0LiBFQ0MgRnVuY3Rpb24gZW5hYmxlCisgKiAgICBDT05GSUdfRFJBTV9FQ0MgICAgICAgIC8vIGRlZmluZSB0byBlbmFibGUgRUNDIGZ1bmN0aW9uCisgKiA1LiBVQVJUIERlYnVnIE1lc3NhZ2UKKyAqICAgIENPTkZJR19EUkFNX1VBUlRfT1VUICAgLy8gZW5hYmxlIG91dHB1dCBtZXNzYWdlIGF0IFVBUlQ1CisgKiAgICBDT05GSUdfRFJBTV9VQVJUXzM4NDAwIC8vIHNldCB0aGUgVUFSVCBiYXVkIHJhdGUgdG8gMzg0MDAsIGRlZmF1bHQgaXMgMTE1MjAwCisgKi8KKyAKKy8vMS4gRFJBTSBTaXplCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fNTEyTUJJVAorI2RlZmluZSAgICBDT05GSUdfRFJBTV8xR0JJVAorLy8jZGVmaW5lICAgIENPTkZJR19EUkFNXzJHQklUCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fNEdCSVQKKy8vMi4gRFJBTSBTcGVlZAorLy8jZGVmaW5lICAgIENPTkZJR19EUkFNXzMzNgorI2RlZmluZSAgICBDT05GSUdfRFJBTV80MDgKKy8vMy4gVkdBIE1vZGUKKy8vI2RlZmluZSAgICBDT05GSUdfQ1JUX0RJU1BMQVkKKy8vNC4gRUNDIEZ1bmN0aW9uIGVuYWJsZQorLy8jZGVmaW5lICAgIENPTkZJR19EUkFNX0VDQworLy81LiBVQVJUIERlYnVnIE1lc3NhZ2UKKyNkZWZpbmUgICAgQ09ORklHX0RSQU1fVUFSVF9PVVQKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV9VQVJUXzM4NDAwCisKKworCisvKiAKKyAqIEVudmlyb25tZW50IENvbmZpZworICovCisjZGVmaW5lIENPTkZJR19DTURMSU5FX1RBRwkgMQkJLyogZW5hYmxlIHBhc3Npbmcgb2YgQVRBR3MJKi8KKyNkZWZpbmUgQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTIDEKKyNkZWZpbmUgQ09ORklHX0lOSVRSRF9UQUcJIDEKKyNkZWZpbmUJQ09ORklHX0JPT1RBUkdTIAkiZGVidWcgY29uc29sZT10dHlTMCwxMTUyMDBuOCByYW1kaXNrX3NpemU9MTYzODQgcm9vdD0vZGV2L3JhbSBydyBpbml0PS9saW51eHJjIG1lbT04ME0iCisjZGVmaW5lIENPTkZJR19VUERBVEUgICAgICAgICAgICJ0ZnRwIDQwODAwMDAwIGFzdDIzMDAuc2NyOyBzbyA0MDgwMDAwMCciCisKKyNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCQkvKiBhdXRvYm9vdCBhZnRlciAzIHNlY29uZHMJKi8KKyNpZmRlZiBDT05GSUdfRkxBU0hfQVNUMjMwMAorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIDIwMDgwMDAwIDIwMzAwMDAwIgorI2Vsc2UKKyNpZmRlZglDT05GSUdfU1lTX0ZMQVNIX0NGSSAKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSAxMDA4MDAwMCAxMDMwMDAwMCIKKyNlbHNlCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gMTQwODAwMDAgMTQzMDAwMDAiCisjZW5kaWYKKyNlbmRpZgorI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJCSJhbGwuYmluIgorI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RGTAorI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCisvKiAKKyAqIENQVSBTZXR0aW5nCisgKi8KKyNkZWZpbmUgQ1BVX0NMT0NLX1JBVEUJCTE4MDAwMDAwCS8qIDE2LjUgTUh6IGNsb2NrIGZvciB0aGUgQVJNIGNvcmUgKi8KKworLyoKKyAqIFNpemUgb2YgbWFsbG9jKCkgcG9vbAorICovCisjZGVmaW5lIENPTkZJR19TWVNfTUFMTE9DX0xFTgkJKENPTkZJR19FTlZfU0laRSArIDc2OCoxMDI0KQorI2RlZmluZSBDT05GSUdfU1lTX0dCTF9EQVRBX1NJWkUJMTI4CS8qIHNpemUgaW4gYnl0ZXMgcmVzZXJ2ZWQgZm9yIGluaXRpYWwgZGF0YSAqLworCisvKgorICogU3RhY2sgc2l6ZXMsICBUaGUgc3RhY2sgc2l6ZXMgYXJlIHNldCB1cCBpbiBzdGFydC5TIHVzaW5nIHRoZSBzZXR0aW5ncyBiZWxvdworICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkUJKDEyOCoxMDI0KQkvKiByZWd1bGFyIHN0YWNrICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkVfSVJRCSg0KjEwMjQpCS8qIElSUSBzdGFjayAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFX0ZJUQkoNCoxMDI0KQkvKiBGSVEgc3RhY2sgKi8KKworLyoKKyAqIE1lbW9yeSBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX05SX0RSQU1fQkFOS1MJMQkgICAJLyogd2UgaGF2ZSAxIGJhbmsgb2YgRFJBTSAqLworI2RlZmluZSBQSFlTX1NEUkFNXzEJCTB4NDAwMDAwMDAgCS8qIFNEUkFNIEJhbmsgIzEgKi8KKyNkZWZpbmUgUEhZU19TRFJBTV8xX1NJWkUJMHg0MDAwMDAwIAkvKiA2NCBNQiAqLworCisjZGVmaW5lIENPTkZJR19TWVNfU0RSQU1fQkFTRQkweDQwMDAwMDAwCisKKy8qCisgKiBGTEFTSCBDb25maWd1cmF0aW9uCisgKi8KKyNpZmRlZiBDT05GSUdfU1lTX0ZMQVNIX0NGSQkJCQkvKiBOT1IgRmxhc2ggKi8KKworI2lmZGVmIENPTkZJR19GTEFTSF9BU1QyMzAwCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJCTB4MjAwMDAwMDAgCS8qIEZsYXNoIEJhbmsgIzEgKi8KKyNlbHNlCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJCTB4MTAwMDAwMDAgCS8qIEZsYXNoIEJhbmsgIzEgKi8KKyNlbmRpZgorCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfQkFTRQkJUEhZU19GTEFTSF8xCisjZGVmaW5lIENPTkZJR19GTEFTSF9CQU5LU19MSVNUIAl7IFBIWVNfRkxBU0hfMSB9CisKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1MgCTEKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfU0VDVAkoMjU2KQkJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwICovCisKKyNkZWZpbmUgQ09ORklHX0VOVl9JU19JTl9GTEFTSAkxCisjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUCQkJMHg2MDAwMCAJLyogZW52aXJvbm1lbnQgc3RhcnRzIGhlcmUgICovCisjZGVmaW5lIENPTkZJR19FTlZfU0laRQkJCTB4MjAwMDAgCS8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yICovCisKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9DRklfQU1EX1JFU0VUCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfVVNFX0JVRkZFUl9XUklURQorCisjZWxzZQkJCQkJCS8qIFNQSSBGbGFzaCAqLworCisjaWZkZWYgQ09ORklHX0ZMQVNIX0FTVDIzMDAKKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkweDIwMDAwMDAwIAkvKiBGbGFzaCBCYW5rICMxICovCisjZWxzZQorI2RlZmluZSBQSFlTX0ZMQVNIXzEJCTB4MTQwMDAwMDAgCS8qIEZsYXNoIEJhbmsgIzEgKi8KKyNkZWZpbmUgUEhZU19GTEFTSF8yCQkweDE0ODAwMDAwIAkvKiBGbGFzaCBCYW5rICMyICovCisjZGVmaW5lIFBIWVNfRkxBU0hfMl9CQVNFCTB4MTAwMDAwMDAKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHXzJTUElGTEFTSAorI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0JBU0UJCVBIWVNfRkxBU0hfMl9CQVNFCisjZGVmaW5lIENPTkZJR19GTEFTSF9CQU5LU19MSVNUIAl7IFBIWVNfRkxBU0hfMSwgUEhZU19GTEFTSF8yIH0KKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1MgCTIKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfU0VDVAkoMTAyNCkJCS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcCAqLworCisjZGVmaW5lIENPTkZJR19FTlZfSVNfSU5fRkxBU0gJCTEKKyNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVQJCTB4N0YwMDAwIAkvKiBlbnZpcm9ubWVudCBzdGFydHMgaGVyZSAgKi8KKyNkZWZpbmUgQ09ORklHX0VOVl9TSVpFCQkJMHgwMTAwMDAgCS8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yICovCisjZWxzZQorI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0JBU0UJCVBIWVNfRkxBU0hfMQorI2RlZmluZSBDT05GSUdfRkxBU0hfQkFOS1NfTElTVCAJeyBQSFlTX0ZMQVNIXzEgfQorI2RlZmluZSBDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LUyAJMQorI2RlZmluZSBDT05GSUdfU1lTX01BWF9GTEFTSF9TRUNUCSgxMDI0KQkJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwICovCisKKyNkZWZpbmUgQ09ORklHX0VOVl9JU19JTl9GTEFTSAkJMQorI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVAkJMHg3RjAwMDAgCS8qIGVudmlyb25tZW50IHN0YXJ0cyBoZXJlICAqLworI2RlZmluZSBDT05GSUdfRU5WX1NJWkUJCQkweDAxMDAwMCAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IgKi8KKyNlbmRpZgorCisjZW5kaWYKKworI2RlZmluZSBfX0xJVFRMRV9FTkRJQU4KKworI2RlZmluZSBDT05GSUdfTU9OSVRPUl9CQVNFCQlURVhUX0JBU0UKKyNkZWZpbmUgQ09ORklHX01PTklUT1JfTEVOCQkoMTkyIDw8IDEwKQorCisvKiB0aW1lb3V0IHZhbHVlcyBhcmUgaW4gdGlja3MgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9FUkFTRV9UT1VUCSgyMCpDT05GSUdfU1lTX0haKSAJLyogVGltZW91dCBmb3IgRmxhc2ggRXJhc2UgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9XUklURV9UT1VUCSgyMCpDT05GSUdfU1lTX0haKSAJLyogVGltZW91dCBmb3IgRmxhc2ggV3JpdGUgKi8KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfU1lTX0xPTkdIRUxQCQkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLworCisjZGVmaW5lIENPTkZJR19TWVNfUFJPTVBUCQkiYm9vdCMgIiAJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLworI2RlZmluZSBDT05GSUdfU1lTX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworI2RlZmluZSBDT05GSUdfU1lTX1BCU0laRSAoQ09ORklHX1NZU19DQlNJWkUrc2l6ZW9mKENPTkZJR19TWVNfUFJPTVBUKSsxNikgLyogUHJpbnQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19NQVhBUkdTCQkxNgkJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MJKi8KKyNkZWZpbmUgQ09ORklHX1NZU19CQVJHU0laRQkJQ09ORklHX1NZU19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZQkqLworCisjZGVmaW5lIENPTkZJR19TWVNfTUVNVEVTVF9TVEFSVAkweDQwMDAwMDAwCS8qIG1lbXRlc3Qgd29ya3Mgb24JKi8KKyNkZWZpbmUgQ09ORklHX1NZU19NRU1URVNUX0VORAkJMHg0NEZGRkZGRgkvKiAyNTYgTUIgaW4gRFJBTQkqLworCisjZGVmaW5lCUNPTkZJR19TWVNfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworI3VuZGVmCUNPTkZJR19TWVNfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworCisjZGVmaW5lIENPTkZJR19TWVNfTE9BRF9BRERSCQkweDQzMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCisKKyNkZWZpbmUgQ09ORklHX1NZU19USU1FUkJBU0UJCTB4MUU3ODIwMDAJLyogdXNlIHRpbWVyIDEgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19IWgkJCSgxKjEwMDAqMTAwMCkJLyogdXNlIGV4dGVybmFsIGNsayAoMU0pICovCisKKy8qCisgKiBTZXJpYWwgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MF9SRUdfU0laRQk0CisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MF9DTEsJCTI0MDAwMDAwCisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MF9DT00xCQkweDFlNzgzMDAwCisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MF9DT00yCQkweDFlNzg0MDAwCisjZGVmaW5lCUNPTkZJR19TWVNfTE9BRFNfQkFVRF9DSEFOR0UKKyNkZWZpbmUgQ09ORklHX1NFUklBTDEJCQkxCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYCQkyCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJCTExNTIwMAorI2RlZmluZSBDT05GSUdfU1lTX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KKworLyoKKyAqIFVTQiBkZXZpY2UgY29uZmlndXJhdGlvbgorICovCisvKgorI2RlZmluZSBDT05GSUdfVVNCX0RFVklDRQkJMQorI2RlZmluZSBDT05GSUdfVVNCX1RUWQkJCTEKKworI2RlZmluZSBDT05GSUdfVVNCRF9WRU5ET1JJRAkJMHgxMjM0CisjZGVmaW5lIENPTkZJR19VU0JEX1BST0RVQ1RJRAkJMHg1Njc4CisjZGVmaW5lIENPTkZJR19VU0JEX01BTlVGQUNUVVJFUgkiU2llbWVucyIKKyNkZWZpbmUgQ09ORklHX1VTQkRfUFJPRFVDVF9OQU1FCSJTWDEiCisqLworCisvKgorICogSTJDIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfSEFSRF9JMkMKKyNkZWZpbmUgQ09ORklHX1NZU19JMkNfU1BFRUQJCTEwMDAwMAorI2RlZmluZSBDT05GSUdfU1lTX0kyQ19TTEFWRQkJMQorI2RlZmluZSBDT05GSUdfRFJJVkVSX0FTUEVFRF9JMkMKKworLyoKKyogRUVQUk9NIGNvbmZpZ3VyYXRpb24KKyovCisjZGVmaW5lIENPTkZJR19TWVNfSTJDX0VFUFJPTV9BRERSX0xFTiAJMgorI2RlZmluZSBDT05GSUdfU1lTX0kyQ19FRVBST01fQUREUiAJMHhhMAorCisvKgorICogTklDIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBfX0JZVEVfT1JERVIgX19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIF9fTElUVExFX0VORElBTl9CSVRGSUVMRAorI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgorI2RlZmluZSBDT05GSUdfQVNQRUVETklDCisvLyNkZWZpbmUgQ09ORklHX01BQzFfUEhZX0xJTktfSU5URVJSVVBUCisjZGVmaW5lIENPTkZJR19NQUMyX0VOQUJMRQorI2RlZmluZSBDT05GSUdfTUFDMl9QSFlfTElOS19JTlRFUlJVUFQKKy8qCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiBOT1RJQ0U6IE1BQzEgYW5kIE1BQzIgbm93IGhhdmUgdGhlaXIgb3duIHNlcGVyYXRlIFBIWSBjb25maWd1cmF0aW9uLgorKiBXZSB1c2UgMiBiaXRzIGZvciBlYWNoIE1BQyBpbiB0aGUgc2NyYXRjaCByZWdpc3RlcihEWzE1OjExXSBpbiAweDFFNkUyMDQwKSB0bworKiBpbmZvcm0ga2VybmVsIGRyaXZlci4KKyogVGhlIG1lYW5pbmdzIG9mIHRoZSAyIGJpdHMgYXJlOgorKiAwMCgwKTogRGVkaWNhdGVkIFBIWQorKiAwMSgxKTogQVNQRUVEJ3MgRVZBICsgSU5URUwncyBOQy1TSSBQSFkgY2hpcCBFVkEKKyogMTAoMik6IEFTUEVFRCdzIE1BQyBpcyBjb25uZWN0ZWQgdG8gTkMtU0kgUEhZIGNoaXAgZGlyZWN0bHkKKyogMTE6IFJlc2VydmVkCisqCisqIFdlIHVzZSBDT05GSUdfTUFDMV9QSFlfU0VUVElORyBhbmQgQ09ORklHX01BQzJfUEhZX1NFVFRJTkcgaW4gVS1Cb290CisqIDA6IERlZGljYXRlZCBQSFkKKyogMTogQVNQRUVEJ3MgRVZBICsgSU5URUwncyBOQy1TSSBQSFkgY2hpcCBFVkEKKyogMjogQVNQRUVEJ3MgTUFDIGlzIGNvbm5lY3RlZCB0byBOQy1TSSBQSFkgY2hpcCBkaXJlY3RseQorKiAzOiBSZXNlcnZlZAorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisjZGVmaW5lIENPTkZJR19NQUMxX1BIWV9TRVRUSU5HCQkyCisjZGVmaW5lIENPTkZJR19NQUMyX1BIWV9TRVRUSU5HCQkwCisjZGVmaW5lIENPTkZJR19NQUNfSU5URVJGQUNFX0NMT0NLX0RFTEFZCTB4MjI1NQorI2RlZmluZSBDT05GSUdfTkVUX01VTFRJCisjZGVmaW5lIENPTkZJR19FVEhBQ1QJCQlhc3BlZWRuaWMjMAorI2RlZmluZSBDT05GSUdfR0FURVdBWUlQCQkxOTIuMTY4LjAuMQorI2RlZmluZSBDT05GSUdfTkVUTUFTSwkJCTI1NS4yNTUuMjU1LjAKKyNkZWZpbmUgQ09ORklHX0lQQUREUgkJCTE5Mi4xNjguMC40NQorI2RlZmluZSBDT05GSUdfU0VSVkVSSVAJCQkxOTIuMTY4LjAuODEKKyNkZWZpbmUgQ09ORklHX0VUSEFERFIJCQkwMDpDMDpBODoxMjozNDo1NgorI2RlZmluZSBDT05GSUdfRVRIMUFERFIJCQkwMDpDMDpBODoxMjozNDo1NworCisvKgorICogU0xUCisgKi8KKy8qCisjZGVmaW5lIENPTkZJR19TTFQKKyNkZWZpbmUgQ0ZHX0NNRF9TTFQJCShDRkdfQ01EX1ZJREVPVEVTVCB8IENGR19DTURfTUFDVEVTVCB8IENGR19DTURfSEFDVEVTVCB8IENGR19DTURfTUlDVEVTVCkKKyovCisKKyNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYXN0MjMwMF9hc3QxMDcwLmggYi9pbmNsdWRlL2NvbmZpZ3MvYXN0MjMwMF9hc3QxMDcwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdhYmRmNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy9hc3QyMzAwX2FzdDEwNzAuaApAQCAtMCwwICsxLDMyMyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogUGV0ZXIgQ2hlbiA8cGV0ZXJjQHNvY2xlLXRlY2guY29tLnR3PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICogKGVhc3kgdG8gY2hhbmdlKQorICovCisvLyNkZWZpbmUgQ09ORklHX0lOSVRfQ1JJVElDQUwJCQkvKiBkZWZpbmUgZm9yIFUtQk9PVCAxLjEuMSAqLworI3VuZGVmICBDT05GSUdfSU5JVF9DUklUSUNBTAkJCS8qIHVuZGVmIGZvciAgVS1CT09UIDEuMS40ICovIAorI2RlZmluZSBDT05GSUdfQVJNOTI2RUpTCTEJCS8qIFRoaXMgaXMgYW4gYXJtOTI2ZWpzIENQVSAqLworI2RlZmluZQlDT05GSUdfQVNQRUVECQkxCisjZGVmaW5lIENPTkZJR19BU1QyMzAwCQkxCisjZGVmaW5lIENPTkZJR19BU1QxMDcwCQkxCisvLyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9DRkkJCQkvKiBDT05GSUdfRkxBU0hfQ0ZJLCBDT05GSUdfRkxBU0hfU1BJIGlzIGV4Y2x1c2l2ZSovCisjZGVmaW5lIENPTkZJR19GTEFTSF9TUEkKKy8vI2RlZmluZSBDT05GSUdfMlNQSUZMQVNICQkJLyogQm9vdCBTUEk6IENTMiwgMm5kIFNQSTogQ1MwICovCisjdW5kZWYgQ09ORklHXzJTUElGTEFTSAorI3VuZGVmIENPTkZJR19BU1BFRURfU0xUCisjZGVmaW5lIENPTkZJR19GTEFTSF9BU1QyMzAwCisjZGVmaW5lIENPTkZJR19GTEFTSF9BU1QyMzAwX0RNQQorLy8jZGVmaW5lIENPTkZJR19GTEFTSF9TUEl4Ml9EdW1teQorLy8jZGVmaW5lIENPTkZJR19GTEFTSF9TUEl4NF9EdW1teQorI2RlZmluZSBDT05GSUdfQ1JUX0RJU1BMQVkJMQkJLyogdW5kZWYgaWYgbm90IHN1cHBvcnQgQ1JUICovCisKKy8vI2RlZmluZSBDT05GSUdfVVNFX0lSUQkJCQkvKiB3ZSBkb24ndCBuZWVkIElSUS9GSVEgc3R1ZmYgKi8KKyNkZWZpbmUgQ09ORklHX01JU0NfSU5JVF9SIAorCisvKgorICogRFJBTSBDb25maWcKKyAqCisgKiAxLiBEUkFNIFNpemUgICAgICAgICAgICAgIC8vCisgKiAgICBDT05GSUdfRFJBTV81MTJNQklUICAgIC8vIDUxMk0gYml0CisgKiAgICBDT05GSUdfRFJBTV8xR0JJVCAgICAgIC8vIDFHICAgYml0IChkZWZhdWx0KQorICogICAgQ09ORklHX0RSQU1fMkdCSVQgICAgICAvLyAyRyAgIGJpdAorICogICAgQ09ORklHX0RSQU1fNEdCSVQgICAgICAvLyA0RyAgIGJpdCAKKyAqIDIuIERSQU0gU3BlZWQgICAgICAgICAgICAgLy8KKyAqICAgIENPTkZJR19EUkFNXzMzNiAgICAgICAgLy8gMzM2TUh6IChERFItNjY3KQorICogICAgQ09ORklHX0RSQU1fNDA4ICAgICAgICAvLyA0MDhNSHogKEREUi04MDApIChkZWZhdWx0KQorICogMy4gVkdBIE1vZGUKKyAqICAgIENPTkZJR19DUlRfRElTUExBWSAgICAgLy8gZGVmaW5lIHRvIGRpc2FibGUgVkdBIGZ1bmN0aW9uCisgKiA0LiBFQ0MgRnVuY3Rpb24gZW5hYmxlCisgKiAgICBDT05GSUdfRFJBTV9FQ0MgICAgICAgIC8vIGRlZmluZSB0byBlbmFibGUgRUNDIGZ1bmN0aW9uCisgKiA1LiBVQVJUIERlYnVnIE1lc3NhZ2UKKyAqICAgIENPTkZJR19EUkFNX1VBUlRfT1VUICAgLy8gZW5hYmxlIG91dHB1dCBtZXNzYWdlIGF0IFVBUlQ1CisgKiAgICBDT05GSUdfRFJBTV9VQVJUXzM4NDAwIC8vIHNldCB0aGUgVUFSVCBiYXVkIHJhdGUgdG8gMzg0MDAsIGRlZmF1bHQgaXMgMTE1MjAwCisgKi8KKyAKKy8vMS4gRFJBTSBTaXplCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fNTEyTUJJVAorI2RlZmluZSAgICBDT05GSUdfRFJBTV8xR0JJVAorLy8jZGVmaW5lICAgIENPTkZJR19EUkFNXzJHQklUCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fNEdCSVQKKy8vMi4gRFJBTSBTcGVlZAorLy8jZGVmaW5lICAgIENPTkZJR19EUkFNXzMzNgorI2RlZmluZSAgICBDT05GSUdfRFJBTV80MDgKKy8vMy4gVkdBIE1vZGUKKy8vI2RlZmluZSAgICBDT05GSUdfQ1JUX0RJU1BMQVkKKy8vNC4gRUNDIEZ1bmN0aW9uIGVuYWJsZQorLy8jZGVmaW5lICAgIENPTkZJR19EUkFNX0VDQworLy81LiBVQVJUIERlYnVnIE1lc3NhZ2UKKyNkZWZpbmUgICAgQ09ORklHX0RSQU1fVUFSVF9PVVQKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV9VQVJUXzM4NDAwCisKKworCisvKiAKKyAqIEVudmlyb25tZW50IENvbmZpZworICovCisjZGVmaW5lIENPTkZJR19DTURMSU5FX1RBRwkgMQkJLyogZW5hYmxlIHBhc3Npbmcgb2YgQVRBR3MJKi8KKyNkZWZpbmUgQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTIDEKKyNkZWZpbmUgQ09ORklHX0lOSVRSRF9UQUcJIDEKKyNkZWZpbmUJQ09ORklHX0JPT1RBUkdTIAkiZGVidWcgY29uc29sZT10dHlTMCwxMTUyMDBuOCByYW1kaXNrX3NpemU9MTYzODQgcm9vdD0vZGV2L3JhbSBydyBpbml0PS9saW51eHJjIG1lbT04ME0iCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwkJLyogYXV0b2Jvb3QgYWZ0ZXIgMyBzZWNvbmRzCSovCisjaWZkZWYgQ09ORklHX0ZMQVNIX0FTVDIzMDAKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSAyMDA4MDAwMCAyMDMwMDAwMCIKKyNlbHNlCisjaWZkZWYJQ09ORklHX1NZU19GTEFTSF9DRkkgCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gMTAwODAwMDAgMTAzMDAwMDAiCisjZWxzZQorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIDE0MDgwMDAwIDE0MzAwMDAwIgorI2VuZGlmCisjZW5kaWYKKyNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCQkiYWxsLmJpbiIKKyNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ERkwKKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKworLyogCisgKiBDUFUgU2V0dGluZworICovCisjZGVmaW5lIENQVV9DTE9DS19SQVRFCQkxODAwMDAwMAkvKiAxNi41IE1IeiBjbG9jayBmb3IgdGhlIEFSTSBjb3JlICovCisKKy8qCisgKiBTaXplIG9mIG1hbGxvYygpIHBvb2wKKyAqLworI2RlZmluZSBDT05GSUdfU1lTX01BTExPQ19MRU4JCShDT05GSUdfRU5WX1NJWkUgKyA3NjgqMTAyNCkKKyNkZWZpbmUgQ09ORklHX1NZU19HQkxfREFUQV9TSVpFCTEyOAkvKiBzaXplIGluIGJ5dGVzIHJlc2VydmVkIGZvciBpbml0aWFsIGRhdGEgKi8KKworLyoKKyAqIFN0YWNrIHNpemVzLCAgVGhlIHN0YWNrIHNpemVzIGFyZSBzZXQgdXAgaW4gc3RhcnQuUyB1c2luZyB0aGUgc2V0dGluZ3MgYmVsb3cKKyAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFCSgxMjgqMTAyNCkJLyogcmVndWxhciBzdGFjayAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFX0lSUQkoNCoxMDI0KQkvKiBJUlEgc3RhY2sgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRV9GSVEJKDQqMTAyNCkJLyogRklRIHN0YWNrICovCisKKy8qCisgKiBNZW1vcnkgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19OUl9EUkFNX0JBTktTCTEJICAgCS8qIHdlIGhhdmUgMSBiYW5rIG9mIERSQU0gKi8KKyNkZWZpbmUgUEhZU19TRFJBTV8xCQkweDQwMDAwMDAwIAkvKiBTRFJBTSBCYW5rICMxICovCisjZGVmaW5lIFBIWVNfU0RSQU1fMV9TSVpFCTB4NDAwMDAwMCAJLyogNjQgTUIgKi8KKworI2RlZmluZSBDT05GSUdfU1lTX1NEUkFNX0JBU0UJMHg0MDAwMDAwMAorCisvKgorICogRkxBU0ggQ29uZmlndXJhdGlvbgorICovCisjaWZkZWYgQ09ORklHX1NZU19GTEFTSF9DRkkJCQkJLyogTk9SIEZsYXNoICovCisKKyNpZmRlZiBDT05GSUdfRkxBU0hfQVNUMjMwMAorI2RlZmluZSBQSFlTX0ZMQVNIXzEJCQkweDIwMDAwMDAwIAkvKiBGbGFzaCBCYW5rICMxICovCisjZWxzZQorI2RlZmluZSBQSFlTX0ZMQVNIXzEJCQkweDEwMDAwMDAwIAkvKiBGbGFzaCBCYW5rICMxICovCisjZW5kaWYKKworI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0JBU0UJCVBIWVNfRkxBU0hfMQorI2RlZmluZSBDT05GSUdfRkxBU0hfQkFOS1NfTElTVCAJeyBQSFlTX0ZMQVNIXzEgfQorCisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTIAkxCisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX1NFQ1QJKDI1NikJCS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcCAqLworCisjZGVmaW5lIENPTkZJR19FTlZfSVNfSU5fRkxBU0gJMQorI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVAkJCTB4NjAwMDAgCS8qIGVudmlyb25tZW50IHN0YXJ0cyBoZXJlICAqLworI2RlZmluZSBDT05GSUdfRU5WX1NJWkUJCQkweDIwMDAwIAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvciAqLworCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfQ0ZJX0FNRF9SRVNFVAorI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX1VTRV9CVUZGRVJfV1JJVEUKKworI2Vsc2UJCQkJCQkvKiBTUEkgRmxhc2ggKi8KKworI2lmZGVmIENPTkZJR19GTEFTSF9BU1QyMzAwCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJMHgyMDAwMDAwMCAJLyogRmxhc2ggQmFuayAjMSAqLworI2Vsc2UKKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkweDE0MDAwMDAwIAkvKiBGbGFzaCBCYW5rICMxICovCisjZGVmaW5lIFBIWVNfRkxBU0hfMgkJMHgxNDgwMDAwMCAJLyogRmxhc2ggQmFuayAjMiAqLworI2RlZmluZSBQSFlTX0ZMQVNIXzJfQkFTRQkweDEwMDAwMDAwCisjZW5kaWYKKworI2lmZGVmIENPTkZJR18yU1BJRkxBU0gKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9CQVNFCQlQSFlTX0ZMQVNIXzJfQkFTRQorI2RlZmluZSBDT05GSUdfRkxBU0hfQkFOS1NfTElTVCAJeyBQSFlTX0ZMQVNIXzEsIFBIWVNfRkxBU0hfMiB9CisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTIAkyCisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX1NFQ1QJKDEwMjQpCQkvKiBtYXggbnVtYmVyIG9mIHNlY3RvcnMgb24gb25lIGNoaXAgKi8KKworI2RlZmluZSBDT05GSUdfRU5WX0lTX0lOX0ZMQVNICQkxCisjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUCQkweDdGMDAwMCAJLyogZW52aXJvbm1lbnQgc3RhcnRzIGhlcmUgICovCisjZGVmaW5lIENPTkZJR19FTlZfU0laRQkJCTB4MDEwMDAwIAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvciAqLworI2Vsc2UKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9CQVNFCQlQSFlTX0ZMQVNIXzEKKyNkZWZpbmUgQ09ORklHX0ZMQVNIX0JBTktTX0xJU1QgCXsgUEhZU19GTEFTSF8xIH0KKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1MgCTEKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfU0VDVAkoMTAyNCkJCS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcCAqLworCisjZGVmaW5lIENPTkZJR19FTlZfSVNfSU5fRkxBU0gJCTEKKyNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVQJCTB4N0YwMDAwIAkvKiBlbnZpcm9ubWVudCBzdGFydHMgaGVyZSAgKi8KKyNkZWZpbmUgQ09ORklHX0VOVl9TSVpFCQkJMHgwMTAwMDAgCS8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yICovCisjZW5kaWYKKworI2VuZGlmCisKKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOCisKKyNkZWZpbmUgQ09ORklHX01PTklUT1JfQkFTRQkJVEVYVF9CQVNFCisjZGVmaW5lIENPTkZJR19NT05JVE9SX0xFTgkJKDE5MiA8PCAxMCkKKworLyogdGltZW91dCB2YWx1ZXMgYXJlIGluIHRpY2tzICovCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfRVJBU0VfVE9VVAkoMjAqQ09ORklHX1NZU19IWikgCS8qIFRpbWVvdXQgZm9yIEZsYXNoIEVyYXNlICovCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfV1JJVEVfVE9VVAkoMjAqQ09ORklHX1NZU19IWikgCS8qIFRpbWVvdXQgZm9yIEZsYXNoIFdyaXRlICovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KKworI2RlZmluZSBDT05GSUdfU1lTX1BST01QVAkJImJvb3QjICIgCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KKyNkZWZpbmUgQ09ORklHX1NZU19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNkZWZpbmUgQ09ORklHX1NZU19QQlNJWkUgKENPTkZJR19TWVNfQ0JTSVpFK3NpemVvZihDT05GSUdfU1lTX1BST01QVCkrMTYpIC8qIFByaW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENPTkZJR19TWVNfTUFYQVJHUwkJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENPTkZJR19TWVNfQkFSR1NJWkUJCUNPTkZJR19TWVNfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUJKi8KKworI2RlZmluZSBDT05GSUdfU1lTX01FTVRFU1RfU1RBUlQJMHg0MDAwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uCSovCisjZGVmaW5lIENPTkZJR19TWVNfTUVNVEVTVF9FTkQJCTB4NDRGRkZGRkYJLyogMjU2IE1CIGluIERSQU0JKi8KKworI2RlZmluZQlDT05GSUdfU1lTX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKyN1bmRlZglDT05GSUdfU1lTX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKworI2RlZmluZSBDT05GSUdfU1lTX0xPQURfQUREUgkJMHg0MzAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLworCisjZGVmaW5lIENPTkZJR19TWVNfVElNRVJCQVNFCQkweDFFNzgyMDAwCS8qIHVzZSB0aW1lciAxICovCisjZGVmaW5lIENPTkZJR19TWVNfSFoJCQkoMSoxMDAwKjEwMDApCS8qIHVzZSBleHRlcm5hbCBjbGsgKDFNKSAqLworCisvKgorICogU2VyaWFsIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTAKKyNkZWZpbmUgQ09ORklHX1NZU19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfUkVHX1NJWkUJNAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfQ0xLCQkyNDAwMDAwMAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfQ09NMQkJMHgxZTc4MzAwMAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfQ09NMgkJMHgxZTc4NDAwMAorI2RlZmluZQlDT05GSUdfU1lTX0xPQURTX0JBVURfQ0hBTkdFCisjZGVmaW5lIENPTkZJR19TRVJJQUwxCQkJMQorI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWAkJMgorI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCQkxMTUyMDAKKyNkZWZpbmUgQ09ORklHX1NZU19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CisKKy8qCisgKiBVU0IgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyAqLworLyoKKyNkZWZpbmUgQ09ORklHX1VTQl9ERVZJQ0UJCTEKKyNkZWZpbmUgQ09ORklHX1VTQl9UVFkJCQkxCisKKyNkZWZpbmUgQ09ORklHX1VTQkRfVkVORE9SSUQJCTB4MTIzNAorI2RlZmluZSBDT05GSUdfVVNCRF9QUk9EVUNUSUQJCTB4NTY3OAorI2RlZmluZSBDT05GSUdfVVNCRF9NQU5VRkFDVFVSRVIJIlNpZW1lbnMiCisjZGVmaW5lIENPTkZJR19VU0JEX1BST0RVQ1RfTkFNRQkiU1gxIgorKi8KKworLyoKKyAqIEkyQyBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX0hBUkRfSTJDCisjZGVmaW5lIENPTkZJR19TWVNfSTJDX1NQRUVECQkxMDAwMDAKKyNkZWZpbmUgQ09ORklHX1NZU19JMkNfU0xBVkUJCTEKKyNkZWZpbmUgQ09ORklHX0RSSVZFUl9BU1BFRURfSTJDCisKKy8qCisqIEVFUFJPTSBjb25maWd1cmF0aW9uCisqLworI2RlZmluZSBDT05GSUdfU1lTX0kyQ19FRVBST01fQUREUl9MRU4gCTIKKyNkZWZpbmUgQ09ORklHX1NZU19JMkNfRUVQUk9NX0FERFIgCTB4YTAKKworLyoKKyAqIE5JQyBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgX19CWVRFX09SREVSIF9fTElUVExFX0VORElBTgorI2RlZmluZSBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKKyNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KKyNkZWZpbmUgQ09ORklHX0FTUEVFRE5JQworLy8jZGVmaW5lIENPTkZJR19NQUMxX1BIWV9MSU5LX0lOVEVSUlVQVAorI2RlZmluZSBDT05GSUdfTUFDMl9FTkFCTEUKKyNkZWZpbmUgQ09ORklHX01BQzJfUEhZX0xJTktfSU5URVJSVVBUCisvKgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogTk9USUNFOiBNQUMxIGFuZCBNQUMyIG5vdyBoYXZlIHRoZWlyIG93biBzZXBlcmF0ZSBQSFkgY29uZmlndXJhdGlvbi4KKyogV2UgdXNlIDIgYml0cyBmb3IgZWFjaCBNQUMgaW4gdGhlIHNjcmF0Y2ggcmVnaXN0ZXIoRFsxNToxMV0gaW4gMHgxRTZFMjA0MCkgdG8KKyogaW5mb3JtIGtlcm5lbCBkcml2ZXIuCisqIFRoZSBtZWFuaW5ncyBvZiB0aGUgMiBiaXRzIGFyZToKKyogMDAoMCk6IERlZGljYXRlZCBQSFkKKyogMDEoMSk6IEFTUEVFRCdzIEVWQSArIElOVEVMJ3MgTkMtU0kgUEhZIGNoaXAgRVZBCisqIDEwKDIpOiBBU1BFRUQncyBNQUMgaXMgY29ubmVjdGVkIHRvIE5DLVNJIFBIWSBjaGlwIGRpcmVjdGx5CisqIDExOiBSZXNlcnZlZAorKgorKiBXZSB1c2UgQ09ORklHX01BQzFfUEhZX1NFVFRJTkcgYW5kIENPTkZJR19NQUMyX1BIWV9TRVRUSU5HIGluIFUtQm9vdAorKiAwOiBEZWRpY2F0ZWQgUEhZCisqIDE6IEFTUEVFRCdzIEVWQSArIElOVEVMJ3MgTkMtU0kgUEhZIGNoaXAgRVZBCisqIDI6IEFTUEVFRCdzIE1BQyBpcyBjb25uZWN0ZWQgdG8gTkMtU0kgUEhZIGNoaXAgZGlyZWN0bHkKKyogMzogUmVzZXJ2ZWQKKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2RlZmluZSBDT05GSUdfTUFDMV9QSFlfU0VUVElORwkJMAorI2RlZmluZSBDT05GSUdfTUFDMl9QSFlfU0VUVElORwkJMAorI2RlZmluZSBDT05GSUdfTUFDX0lOVEVSRkFDRV9DTE9DS19ERUxBWQkweDIyNTUKKyNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQorI2RlZmluZSBDT05GSUdfRVRIQUNUCQkJYXNwZWVkbmljIzAKKyNkZWZpbmUgQ09ORklHX0dBVEVXQVlJUAkJMTkyLjE2OC4wLjEKKyNkZWZpbmUgQ09ORklHX05FVE1BU0sJCQkyNTUuMjU1LjI1NS4wCisjZGVmaW5lIENPTkZJR19JUEFERFIJCQkxOTIuMTY4LjAuNDUKKyNkZWZpbmUgQ09ORklHX1NFUlZFUklQCQkJMTkyLjE2OC4wLjgxCisjZGVmaW5lIENPTkZJR19FVEhBRERSCQkJMDA6QzA6QTg6MTI6MzQ6NTYKKyNkZWZpbmUgQ09ORklHX0VUSDFBRERSCQkJMDA6QzA6QTg6MTI6MzQ6NTcKKworLyoKKyAqIFNMVAorICovCisvKgorI2RlZmluZSBDT05GSUdfU0xUCisjZGVmaW5lIENGR19DTURfU0xUCQkoQ0ZHX0NNRF9WSURFT1RFU1QgfCBDRkdfQ01EX01BQ1RFU1QgfCBDRkdfQ01EX0hBQ1RFU1QgfCBDRkdfQ01EX01JQ1RFU1QpCisqLworCisjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2FzdDIzMDBfbm9yLmggYi9pbmNsdWRlL2NvbmZpZ3MvYXN0MjMwMF9ub3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2I4ZmUzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL2FzdDIzMDBfbm9yLmgKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFBldGVyIENoZW4gPHBldGVyY0Bzb2NsZS10ZWNoLmNvbS50dz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqIChlYXN5IHRvIGNoYW5nZSkKKyAqLworLy8jZGVmaW5lIENPTkZJR19JTklUX0NSSVRJQ0FMCQkJLyogZGVmaW5lIGZvciBVLUJPT1QgMS4xLjEgKi8KKyN1bmRlZiAgQ09ORklHX0lOSVRfQ1JJVElDQUwJCQkvKiB1bmRlZiBmb3IgIFUtQk9PVCAxLjEuNCAqLyAKKyNkZWZpbmUgQ09ORklHX0FSTTkyNkVKUwkxCQkvKiBUaGlzIGlzIGFuIGFybTkyNmVqcyBDUFUgKi8KKyNkZWZpbmUJQ09ORklHX0FTUEVFRAkJMQorI2RlZmluZSBDT05GSUdfQVNUMjMwMAkJMQorI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0NGSQkJCS8qIENPTkZJR19GTEFTSF9DRkksIENPTkZJR19GTEFTSF9TUEkgaXMgZXhjbHVzaXZlKi8KKy8vI2RlZmluZSBDT05GSUdfRkxBU0hfU1BJCisvLyNkZWZpbmUgQ09ORklHXzJTUElGTEFTSAkJCS8qIEJvb3QgU1BJOiBDUzIsIDJuZCBTUEk6IENTMCAqLworI3VuZGVmIENPTkZJR18yU1BJRkxBU0gKKyN1bmRlZiBDT05GSUdfQVNQRUVEX1NMVAorI2RlZmluZSBDT05GSUdfRkxBU0hfQVNUMjMwMAorI2RlZmluZSBDT05GSUdfRkxBU0hfQVNUMjMwMF9ETUEKKy8vI2RlZmluZSBDT05GSUdfRkxBU0hfU1BJeDJfRHVtbXkKKy8vI2RlZmluZSBDT05GSUdfRkxBU0hfU1BJeDRfRHVtbXkKKyNkZWZpbmUgQ09ORklHX0NSVF9ESVNQTEFZCTEJCS8qIHVuZGVmIGlmIG5vdCBzdXBwb3J0IENSVCAqLworCisvLyNkZWZpbmUgQ09ORklHX1VTRV9JUlEJCQkJLyogd2UgZG9uJ3QgbmVlZCBJUlEvRklRIHN0dWZmICovCisjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUiAKKworLyoKKyAqIERSQU0gQ29uZmlnCisgKgorICogMS4gRFJBTSBTaXplICAgICAgICAgICAgICAvLworICogICAgQ09ORklHX0RSQU1fNTEyTUJJVCAgICAvLyA1MTJNIGJpdAorICogICAgQ09ORklHX0RSQU1fMUdCSVQgICAgICAvLyAxRyAgIGJpdCAoZGVmYXVsdCkKKyAqICAgIENPTkZJR19EUkFNXzJHQklUICAgICAgLy8gMkcgICBiaXQKKyAqICAgIENPTkZJR19EUkFNXzRHQklUICAgICAgLy8gNEcgICBiaXQgCisgKiAyLiBEUkFNIFNwZWVkICAgICAgICAgICAgIC8vCisgKiAgICBDT05GSUdfRFJBTV8zMzYgICAgICAgIC8vIDMzNk1IeiAoRERSLTY2NykKKyAqICAgIENPTkZJR19EUkFNXzQwOCAgICAgICAgLy8gNDA4TUh6IChERFItODAwKSAoZGVmYXVsdCkKKyAqIDMuIFZHQSBNb2RlCisgKiAgICBDT05GSUdfQ1JUX0RJU1BMQVkgICAgIC8vIGRlZmluZSB0byBkaXNhYmxlIFZHQSBmdW5jdGlvbgorICogNC4gRUNDIEZ1bmN0aW9uIGVuYWJsZQorICogICAgQ09ORklHX0RSQU1fRUNDICAgICAgICAvLyBkZWZpbmUgdG8gZW5hYmxlIEVDQyBmdW5jdGlvbgorICogNS4gVUFSVCBEZWJ1ZyBNZXNzYWdlCisgKiAgICBDT05GSUdfRFJBTV9VQVJUX09VVCAgIC8vIGVuYWJsZSBvdXRwdXQgbWVzc2FnZSBhdCBVQVJUNQorICogICAgQ09ORklHX0RSQU1fVUFSVF8zODQwMCAvLyBzZXQgdGhlIFVBUlQgYmF1ZCByYXRlIHRvIDM4NDAwLCBkZWZhdWx0IGlzIDExNTIwMAorICovCisgCisvLzEuIERSQU0gU2l6ZQorLy8jZGVmaW5lICAgIENPTkZJR19EUkFNXzUxMk1CSVQKKyNkZWZpbmUgICAgQ09ORklHX0RSQU1fMUdCSVQKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV8yR0JJVAorLy8jZGVmaW5lICAgIENPTkZJR19EUkFNXzRHQklUCisvLzIuIERSQU0gU3BlZWQKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV8zMzYKKyNkZWZpbmUgICAgQ09ORklHX0RSQU1fNDA4CisvLzMuIFZHQSBNb2RlCisvLyNkZWZpbmUgICAgQ09ORklHX0NSVF9ESVNQTEFZCisvLzQuIEVDQyBGdW5jdGlvbiBlbmFibGUKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV9FQ0MKKy8vNS4gVUFSVCBEZWJ1ZyBNZXNzYWdlCisjZGVmaW5lICAgIENPTkZJR19EUkFNX1VBUlRfT1VUCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fVUFSVF8zODQwMAorCisKKworLyogCisgKiBFbnZpcm9ubWVudCBDb25maWcKKyAqLworI2RlZmluZSBDT05GSUdfQ01ETElORV9UQUcJIDEJCS8qIGVuYWJsZSBwYXNzaW5nIG9mIEFUQUdzCSovCisjZGVmaW5lIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUyAxCisjZGVmaW5lIENPTkZJR19JTklUUkRfVEFHCSAxCisjZGVmaW5lCUNPTkZJR19CT09UQVJHUyAJImRlYnVnIGNvbnNvbGU9dHR5UzAsMTE1MjAwbjggcmFtZGlza19zaXplPTE2Mzg0IHJvb3Q9L2Rldi9yYW0gcncgaW5pdD0vbGludXhyYyBtZW09ODBNIgorI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMJCS8qIGF1dG9ib290IGFmdGVyIDMgc2Vjb25kcwkqLworI2lmZGVmIENPTkZJR19GTEFTSF9BU1QyMzAwCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gMjAwODAwMDAgMjAzMDAwMDAiCisjZWxzZQorI2lmZGVmCUNPTkZJR19TWVNfRkxBU0hfQ0ZJIAorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIDEwMDgwMDAwIDEwMzAwMDAwIgorI2Vsc2UKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSAxNDA4MDAwMCAxNDMwMDAwMCIKKyNlbmRpZgorI2VuZGlmCisjZGVmaW5lIENPTkZJR19CT09URklMRQkJImFsbC5iaW4iCisjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREZMCisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKKy8qIAorICogQ1BVIFNldHRpbmcKKyAqLworI2RlZmluZSBDUFVfQ0xPQ0tfUkFURQkJMTgwMDAwMDAJLyogMTYuNSBNSHogY2xvY2sgZm9yIHRoZSBBUk0gY29yZSAqLworCisvKgorICogU2l6ZSBvZiBtYWxsb2MoKSBwb29sCisgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19NQUxMT0NfTEVOCQkoQ09ORklHX0VOVl9TSVpFICsgNzY4KjEwMjQpCisjZGVmaW5lIENPTkZJR19TWVNfR0JMX0RBVEFfU0laRQkxMjgJLyogc2l6ZSBpbiBieXRlcyByZXNlcnZlZCBmb3IgaW5pdGlhbCBkYXRhICovCisKKy8qCisgKiBTdGFjayBzaXplcywgIFRoZSBzdGFjayBzaXplcyBhcmUgc2V0IHVwIGluIHN0YXJ0LlMgdXNpbmcgdGhlIHNldHRpbmdzIGJlbG93CisgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRQkoMTI4KjEwMjQpCS8qIHJlZ3VsYXIgc3RhY2sgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRV9JUlEJKDQqMTAyNCkJLyogSVJRIHN0YWNrICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkVfRklRCSg0KjEwMjQpCS8qIEZJUSBzdGFjayAqLworCisvKgorICogTWVtb3J5IENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfTlJfRFJBTV9CQU5LUwkxCSAgIAkvKiB3ZSBoYXZlIDEgYmFuayBvZiBEUkFNICovCisjZGVmaW5lIFBIWVNfU0RSQU1fMQkJMHg0MDAwMDAwMCAJLyogU0RSQU0gQmFuayAjMSAqLworI2RlZmluZSBQSFlTX1NEUkFNXzFfU0laRQkweDQwMDAwMDAgCS8qIDY0IE1CICovCisKKyNkZWZpbmUgQ09ORklHX1NZU19TRFJBTV9CQVNFCTB4NDAwMDAwMDAKKworLyoKKyAqIEZMQVNIIENvbmZpZ3VyYXRpb24KKyAqLworI2lmZGVmIENPTkZJR19TWVNfRkxBU0hfQ0ZJCQkJCS8qIE5PUiBGbGFzaCAqLworCisjaWZkZWYgQ09ORklHX0ZMQVNIX0FTVDIzMDAKKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkJMHgyMDAwMDAwMCAJLyogRmxhc2ggQmFuayAjMSAqLworI2Vsc2UKKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkJMHgxMDAwMDAwMCAJLyogRmxhc2ggQmFuayAjMSAqLworI2VuZGlmCisKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9CQVNFCQlQSFlTX0ZMQVNIXzEKKyNkZWZpbmUgQ09ORklHX0ZMQVNIX0JBTktTX0xJU1QgCXsgUEhZU19GTEFTSF8xIH0KKworI2RlZmluZSBDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LUyAJMQorI2RlZmluZSBDT05GSUdfU1lTX01BWF9GTEFTSF9TRUNUCSgyNTYpCQkvKiBtYXggbnVtYmVyIG9mIHNlY3RvcnMgb24gb25lIGNoaXAgKi8KKworI2RlZmluZSBDT05GSUdfRU5WX0lTX0lOX0ZMQVNICTEKKyNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVQJCQkweDYwMDAwIAkvKiBlbnZpcm9ubWVudCBzdGFydHMgaGVyZSAgKi8KKyNkZWZpbmUgQ09ORklHX0VOVl9TSVpFCQkJMHgyMDAwMCAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IgKi8KKworI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0NGSV9BTURfUkVTRVQKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9VU0VfQlVGRkVSX1dSSVRFCisKKyNlbHNlCQkJCQkJLyogU1BJIEZsYXNoICovCisKKyNpZmRlZiBDT05GSUdfRkxBU0hfQVNUMjMwMAorI2RlZmluZSBQSFlTX0ZMQVNIXzEJCTB4MjAwMDAwMDAgCS8qIEZsYXNoIEJhbmsgIzEgKi8KKyNlbHNlCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJMHgxNDAwMDAwMCAJLyogRmxhc2ggQmFuayAjMSAqLworI2RlZmluZSBQSFlTX0ZMQVNIXzIJCTB4MTQ4MDAwMDAgCS8qIEZsYXNoIEJhbmsgIzIgKi8KKyNkZWZpbmUgUEhZU19GTEFTSF8yX0JBU0UJMHgxMDAwMDAwMAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfMlNQSUZMQVNICisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfQkFTRQkJUEhZU19GTEFTSF8yX0JBU0UKKyNkZWZpbmUgQ09ORklHX0ZMQVNIX0JBTktTX0xJU1QgCXsgUEhZU19GTEFTSF8xLCBQSFlTX0ZMQVNIXzIgfQorI2RlZmluZSBDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LUyAJMgorI2RlZmluZSBDT05GSUdfU1lTX01BWF9GTEFTSF9TRUNUCSgxMDI0KQkJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwICovCisKKyNkZWZpbmUgQ09ORklHX0VOVl9JU19JTl9GTEFTSAkJMQorI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVAkJMHg3RjAwMDAgCS8qIGVudmlyb25tZW50IHN0YXJ0cyBoZXJlICAqLworI2RlZmluZSBDT05GSUdfRU5WX1NJWkUJCQkweDAxMDAwMCAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IgKi8KKyNlbHNlCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfQkFTRQkJUEhZU19GTEFTSF8xCisjZGVmaW5lIENPTkZJR19GTEFTSF9CQU5LU19MSVNUIAl7IFBIWVNfRkxBU0hfMSB9CisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTIAkxCisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX1NFQ1QJKDEwMjQpCQkvKiBtYXggbnVtYmVyIG9mIHNlY3RvcnMgb24gb25lIGNoaXAgKi8KKworI2RlZmluZSBDT05GSUdfRU5WX0lTX0lOX0ZMQVNICQkxCisjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUCQkweDdGMDAwMCAJLyogZW52aXJvbm1lbnQgc3RhcnRzIGhlcmUgICovCisjZGVmaW5lIENPTkZJR19FTlZfU0laRQkJCTB4MDEwMDAwIAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvciAqLworI2VuZGlmCisKKyNlbmRpZgorCisjZGVmaW5lIF9fTElUVExFX0VORElBTgorCisjZGVmaW5lIENPTkZJR19NT05JVE9SX0JBU0UJCVRFWFRfQkFTRQorI2RlZmluZSBDT05GSUdfTU9OSVRPUl9MRU4JCSgxOTIgPDwgMTApCisKKy8qIHRpbWVvdXQgdmFsdWVzIGFyZSBpbiB0aWNrcyAqLworI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0VSQVNFX1RPVVQJKDIwKkNPTkZJR19TWVNfSFopIAkvKiBUaW1lb3V0IGZvciBGbGFzaCBFcmFzZSAqLworI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX1dSSVRFX1RPVVQJKDIwKkNPTkZJR19TWVNfSFopIAkvKiBUaW1lb3V0IGZvciBGbGFzaCBXcml0ZSAqLworCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19TWVNfTE9OR0hFTFAJCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCisKKyNkZWZpbmUgQ09ORklHX1NZU19QUk9NUFQJCSJib290IyAiIAkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCisjZGVmaW5lIENPTkZJR19TWVNfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisjZGVmaW5lIENPTkZJR19TWVNfUEJTSVpFIChDT05GSUdfU1lTX0NCU0laRStzaXplb2YoQ09ORklHX1NZU19QUk9NUFQpKzE2KSAvKiBQcmludCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDT05GSUdfU1lTX01BWEFSR1MJCTE2CQkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncwkqLworI2RlZmluZSBDT05GSUdfU1lTX0JBUkdTSVpFCQlDT05GSUdfU1lTX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplCSovCisKKyNkZWZpbmUgQ09ORklHX1NZU19NRU1URVNUX1NUQVJUCTB4NDAwMDAwMDAJLyogbWVtdGVzdCB3b3JrcyBvbgkqLworI2RlZmluZSBDT05GSUdfU1lTX01FTVRFU1RfRU5ECQkweDQ0RkZGRkZGCS8qIDI1NiBNQiBpbiBEUkFNCSovCisKKyNkZWZpbmUJQ09ORklHX1NZU19DTEtTX0lOX0haCQkvKiBldmVyeXRoaW5nLCBpbmNsIGJvYXJkIGluZm8sIGluIEh6ICovCisjdW5kZWYJQ09ORklHX1NZU19DTEtTX0lOX0haCQkvKiBldmVyeXRoaW5nLCBpbmNsIGJvYXJkIGluZm8sIGluIEh6ICovCisKKyNkZWZpbmUgQ09ORklHX1NZU19MT0FEX0FERFIJCTB4NDMwMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KKworI2RlZmluZSBDT05GSUdfU1lTX1RJTUVSQkFTRQkJMHgxRTc4MjAwMAkvKiB1c2UgdGltZXIgMSAqLworI2RlZmluZSBDT05GSUdfU1lTX0haCQkJKDEqMTAwMCoxMDAwKQkvKiB1c2UgZXh0ZXJuYWwgY2xrICgxTSkgKi8KKworLyoKKyAqIFNlcmlhbCBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19OUzE2NTUwCisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MF9TRVJJQUwKKyNkZWZpbmUgQ09ORklHX1NZU19OUzE2NTUwX1JFR19TSVpFCTQKKyNkZWZpbmUgQ09ORklHX1NZU19OUzE2NTUwX0NMSwkJMjQwMDAwMDAKKyNkZWZpbmUgQ09ORklHX1NZU19OUzE2NTUwX0NPTTEJCTB4MWU3ODMwMDAKKyNkZWZpbmUgQ09ORklHX1NZU19OUzE2NTUwX0NPTTIJCTB4MWU3ODQwMDAKKyNkZWZpbmUJQ09ORklHX1NZU19MT0FEU19CQVVEX0NIQU5HRQorI2RlZmluZSBDT05GSUdfU0VSSUFMMQkJCTEKKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVgJCTIKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkJMTE1MjAwCisjZGVmaW5lIENPTkZJR19TWVNfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQorCisvKgorICogVVNCIGRldmljZSBjb25maWd1cmF0aW9uCisgKi8KKy8qCisjZGVmaW5lIENPTkZJR19VU0JfREVWSUNFCQkxCisjZGVmaW5lIENPTkZJR19VU0JfVFRZCQkJMQorCisjZGVmaW5lIENPTkZJR19VU0JEX1ZFTkRPUklECQkweDEyMzQKKyNkZWZpbmUgQ09ORklHX1VTQkRfUFJPRFVDVElECQkweDU2NzgKKyNkZWZpbmUgQ09ORklHX1VTQkRfTUFOVUZBQ1RVUkVSCSJTaWVtZW5zIgorI2RlZmluZSBDT05GSUdfVVNCRF9QUk9EVUNUX05BTUUJIlNYMSIKKyovCisKKy8qCisgKiBJMkMgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19IQVJEX0kyQworI2RlZmluZSBDT05GSUdfU1lTX0kyQ19TUEVFRAkJMTAwMDAwCisjZGVmaW5lIENPTkZJR19TWVNfSTJDX1NMQVZFCQkxCisjZGVmaW5lIENPTkZJR19EUklWRVJfQVNQRUVEX0kyQworCisvKgorKiBFRVBST00gY29uZmlndXJhdGlvbgorKi8KKyNkZWZpbmUgQ09ORklHX1NZU19JMkNfRUVQUk9NX0FERFJfTEVOIAkyCisjZGVmaW5lIENPTkZJR19TWVNfSTJDX0VFUFJPTV9BRERSIAkweGEwCisKKy8qCisgKiBOSUMgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIF9fQllURV9PUkRFUiBfX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxECisjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCisjZGVmaW5lIENPTkZJR19BU1BFRUROSUMKKy8vI2RlZmluZSBDT05GSUdfTUFDMV9QSFlfTElOS19JTlRFUlJVUFQKKyNkZWZpbmUgQ09ORklHX01BQzJfRU5BQkxFCisjZGVmaW5lIENPTkZJR19NQUMyX1BIWV9MSU5LX0lOVEVSUlVQVAorLyoKKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIE5PVElDRTogTUFDMSBhbmQgTUFDMiBub3cgaGF2ZSB0aGVpciBvd24gc2VwZXJhdGUgUEhZIGNvbmZpZ3VyYXRpb24uCisqIFdlIHVzZSAyIGJpdHMgZm9yIGVhY2ggTUFDIGluIHRoZSBzY3JhdGNoIHJlZ2lzdGVyKERbMTU6MTFdIGluIDB4MUU2RTIwNDApIHRvCisqIGluZm9ybSBrZXJuZWwgZHJpdmVyLgorKiBUaGUgbWVhbmluZ3Mgb2YgdGhlIDIgYml0cyBhcmU6CisqIDAwKDApOiBEZWRpY2F0ZWQgUEhZCisqIDAxKDEpOiBBU1BFRUQncyBFVkEgKyBJTlRFTCdzIE5DLVNJIFBIWSBjaGlwIEVWQQorKiAxMCgyKTogQVNQRUVEJ3MgTUFDIGlzIGNvbm5lY3RlZCB0byBOQy1TSSBQSFkgY2hpcCBkaXJlY3RseQorKiAxMTogUmVzZXJ2ZWQKKyoKKyogV2UgdXNlIENPTkZJR19NQUMxX1BIWV9TRVRUSU5HIGFuZCBDT05GSUdfTUFDMl9QSFlfU0VUVElORyBpbiBVLUJvb3QKKyogMDogRGVkaWNhdGVkIFBIWQorKiAxOiBBU1BFRUQncyBFVkEgKyBJTlRFTCdzIE5DLVNJIFBIWSBjaGlwIEVWQQorKiAyOiBBU1BFRUQncyBNQUMgaXMgY29ubmVjdGVkIHRvIE5DLVNJIFBIWSBjaGlwIGRpcmVjdGx5CisqIDM6IFJlc2VydmVkCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKyNkZWZpbmUgQ09ORklHX01BQzFfUEhZX1NFVFRJTkcJCTAKKyNkZWZpbmUgQ09ORklHX01BQzJfUEhZX1NFVFRJTkcJCTAKKyNkZWZpbmUgQ09ORklHX01BQ19JTlRFUkZBQ0VfQ0xPQ0tfREVMQVkJMHgyMjU1CisjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkKKyNkZWZpbmUgQ09ORklHX0VUSEFDVAkJCWFzcGVlZG5pYyMwCisjZGVmaW5lIENPTkZJR19HQVRFV0FZSVAJCTE5Mi4xNjguMC4xCisjZGVmaW5lIENPTkZJR19ORVRNQVNLCQkJMjU1LjI1NS4yNTUuMAorI2RlZmluZSBDT05GSUdfSVBBRERSCQkJMTkyLjE2OC4wLjE4OAorI2RlZmluZSBDT05GSUdfU0VSVkVSSVAJCQkxOTIuMTY4LjAuMTA2CisjZGVmaW5lIENPTkZJR19FVEhBRERSCQkJMDA6QzA6QTg6MTI6MzQ6NTYKKyNkZWZpbmUgQ09ORklHX0VUSDFBRERSCQkJMDA6QzA6QTg6MTI6MzQ6NTcKKworLyoKKyAqIFNMVAorICovCisvKgorI2RlZmluZSBDT05GSUdfU0xUCisjZGVmaW5lIENGR19DTURfU0xUCQkoQ0ZHX0NNRF9WSURFT1RFU1QgfCBDRkdfQ01EX01BQ1RFU1QgfCBDRkdfQ01EX0hBQ1RFU1QgfCBDRkdfQ01EX01JQ1RFU1QpCisqLworCisjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2FzdDIzMDBfc3BpLmggYi9pbmNsdWRlL2NvbmZpZ3MvYXN0MjMwMF9zcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzY1NTMwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb25maWdzL2FzdDIzMDBfc3BpLmgKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFBldGVyIENoZW4gPHBldGVyY0Bzb2NsZS10ZWNoLmNvbS50dz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqIChlYXN5IHRvIGNoYW5nZSkKKyAqLworLy8jZGVmaW5lIENPTkZJR19JTklUX0NSSVRJQ0FMCQkJLyogZGVmaW5lIGZvciBVLUJPT1QgMS4xLjEgKi8KKyN1bmRlZiAgQ09ORklHX0lOSVRfQ1JJVElDQUwJCQkvKiB1bmRlZiBmb3IgIFUtQk9PVCAxLjEuNCAqLyAKKyNkZWZpbmUgQ09ORklHX0FSTTkyNkVKUwkxCQkvKiBUaGlzIGlzIGFuIGFybTkyNmVqcyBDUFUgKi8KKyNkZWZpbmUJQ09ORklHX0FTUEVFRAkJMQorI2RlZmluZSBDT05GSUdfQVNUMjMwMAkJMQorLy8jZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfQ0ZJCQkJLyogQ09ORklHX0ZMQVNIX0NGSSwgQ09ORklHX0ZMQVNIX1NQSSBpcyBleGNsdXNpdmUqLworI2RlZmluZSBDT05GSUdfRkxBU0hfU1BJCisvLyNkZWZpbmUgQ09ORklHXzJTUElGTEFTSAkJCS8qIEJvb3QgU1BJOiBDUzIsIDJuZCBTUEk6IENTMCAqLworI3VuZGVmIENPTkZJR18yU1BJRkxBU0gKKyN1bmRlZiBDT05GSUdfQVNQRUVEX1NMVAorI2RlZmluZSBDT05GSUdfRkxBU0hfQVNUMjMwMAorI2RlZmluZSBDT05GSUdfRkxBU0hfQVNUMjMwMF9ETUEKKy8vI2RlZmluZSBDT05GSUdfRkxBU0hfU1BJeDJfRHVtbXkKKy8vI2RlZmluZSBDT05GSUdfRkxBU0hfU1BJeDRfRHVtbXkKKyNkZWZpbmUgQ09ORklHX0NSVF9ESVNQTEFZCTEJCS8qIHVuZGVmIGlmIG5vdCBzdXBwb3J0IENSVCAqLworCisvLyNkZWZpbmUgQ09ORklHX1VTRV9JUlEJCQkJLyogd2UgZG9uJ3QgbmVlZCBJUlEvRklRIHN0dWZmICovCisjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUiAKKworLyoKKyAqIERSQU0gQ29uZmlnCisgKgorICogMS4gRFJBTSBTaXplICAgICAgICAgICAgICAvLworICogICAgQ09ORklHX0RSQU1fNTEyTUJJVCAgICAvLyA1MTJNIGJpdAorICogICAgQ09ORklHX0RSQU1fMUdCSVQgICAgICAvLyAxRyAgIGJpdCAoZGVmYXVsdCkKKyAqICAgIENPTkZJR19EUkFNXzJHQklUICAgICAgLy8gMkcgICBiaXQKKyAqICAgIENPTkZJR19EUkFNXzRHQklUICAgICAgLy8gNEcgICBiaXQgCisgKiAyLiBEUkFNIFNwZWVkICAgICAgICAgICAgIC8vCisgKiAgICBDT05GSUdfRFJBTV8zMzYgICAgICAgIC8vIDMzNk1IeiAoRERSLTY2NykKKyAqICAgIENPTkZJR19EUkFNXzQwOCAgICAgICAgLy8gNDA4TUh6IChERFItODAwKSAoZGVmYXVsdCkKKyAqIDMuIFZHQSBNb2RlCisgKiAgICBDT05GSUdfQ1JUX0RJU1BMQVkgICAgIC8vIGRlZmluZSB0byBkaXNhYmxlIFZHQSBmdW5jdGlvbgorICogNC4gRUNDIEZ1bmN0aW9uIGVuYWJsZQorICogICAgQ09ORklHX0RSQU1fRUNDICAgICAgICAvLyBkZWZpbmUgdG8gZW5hYmxlIEVDQyBmdW5jdGlvbgorICogNS4gVUFSVCBEZWJ1ZyBNZXNzYWdlCisgKiAgICBDT05GSUdfRFJBTV9VQVJUX09VVCAgIC8vIGVuYWJsZSBvdXRwdXQgbWVzc2FnZSBhdCBVQVJUNQorICogICAgQ09ORklHX0RSQU1fVUFSVF8zODQwMCAvLyBzZXQgdGhlIFVBUlQgYmF1ZCByYXRlIHRvIDM4NDAwLCBkZWZhdWx0IGlzIDExNTIwMAorICovCisgCisvLzEuIERSQU0gU2l6ZQorLy8jZGVmaW5lICAgIENPTkZJR19EUkFNXzUxMk1CSVQKKyNkZWZpbmUgICAgQ09ORklHX0RSQU1fMUdCSVQKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV8yR0JJVAorLy8jZGVmaW5lICAgIENPTkZJR19EUkFNXzRHQklUCisvLzIuIERSQU0gU3BlZWQKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV8zMzYKKyNkZWZpbmUgICAgQ09ORklHX0RSQU1fNDA4CisvLzMuIFZHQSBNb2RlCisvLyNkZWZpbmUgICAgQ09ORklHX0NSVF9ESVNQTEFZCisvLzQuIEVDQyBGdW5jdGlvbiBlbmFibGUKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV9FQ0MKKy8vNS4gVUFSVCBEZWJ1ZyBNZXNzYWdlCisjZGVmaW5lICAgIENPTkZJR19EUkFNX1VBUlRfT1VUCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fVUFSVF8zODQwMAorCisKKworLyogCisgKiBFbnZpcm9ubWVudCBDb25maWcKKyAqLworI2RlZmluZSBDT05GSUdfQ01ETElORV9UQUcJIDEJCS8qIGVuYWJsZSBwYXNzaW5nIG9mIEFUQUdzCSovCisjZGVmaW5lIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUyAxCisjZGVmaW5lIENPTkZJR19JTklUUkRfVEFHCSAxCisjZGVmaW5lCUNPTkZJR19CT09UQVJHUyAJImRlYnVnIGNvbnNvbGU9dHR5UzAsMTE1MjAwbjggcmFtZGlza19zaXplPTE2Mzg0IHJvb3Q9L2Rldi9yYW0gcncgaW5pdD0vbGludXhyYyBtZW09ODBNIgorI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMJCS8qIGF1dG9ib290IGFmdGVyIDMgc2Vjb25kcwkqLworI2lmZGVmIENPTkZJR19GTEFTSF9BU1QyMzAwCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gMjAwODAwMDAgMjAzMDAwMDAiCisjZWxzZQorI2lmZGVmCUNPTkZJR19TWVNfRkxBU0hfQ0ZJIAorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIDEwMDgwMDAwIDEwMzAwMDAwIgorI2Vsc2UKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSAxNDA4MDAwMCAxNDMwMDAwMCIKKyNlbmRpZgorI2VuZGlmCisjZGVmaW5lIENPTkZJR19CT09URklMRQkJImFsbC5iaW4iCisjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREZMCisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisKKy8qIAorICogQ1BVIFNldHRpbmcKKyAqLworI2RlZmluZSBDUFVfQ0xPQ0tfUkFURQkJMTgwMDAwMDAJLyogMTYuNSBNSHogY2xvY2sgZm9yIHRoZSBBUk0gY29yZSAqLworCisvKgorICogU2l6ZSBvZiBtYWxsb2MoKSBwb29sCisgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19NQUxMT0NfTEVOCQkoQ09ORklHX0VOVl9TSVpFICsgNzY4KjEwMjQpCisjZGVmaW5lIENPTkZJR19TWVNfR0JMX0RBVEFfU0laRQkxMjgJLyogc2l6ZSBpbiBieXRlcyByZXNlcnZlZCBmb3IgaW5pdGlhbCBkYXRhICovCisKKy8qCisgKiBTdGFjayBzaXplcywgIFRoZSBzdGFjayBzaXplcyBhcmUgc2V0IHVwIGluIHN0YXJ0LlMgdXNpbmcgdGhlIHNldHRpbmdzIGJlbG93CisgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRQkoMTI4KjEwMjQpCS8qIHJlZ3VsYXIgc3RhY2sgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRV9JUlEJKDQqMTAyNCkJLyogSVJRIHN0YWNrICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkVfRklRCSg0KjEwMjQpCS8qIEZJUSBzdGFjayAqLworCisvKgorICogTWVtb3J5IENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfTlJfRFJBTV9CQU5LUwkxCSAgIAkvKiB3ZSBoYXZlIDEgYmFuayBvZiBEUkFNICovCisjZGVmaW5lIFBIWVNfU0RSQU1fMQkJMHg0MDAwMDAwMCAJLyogU0RSQU0gQmFuayAjMSAqLworI2RlZmluZSBQSFlTX1NEUkFNXzFfU0laRQkweDQwMDAwMDAgCS8qIDY0IE1CICovCisKKyNkZWZpbmUgQ09ORklHX1NZU19TRFJBTV9CQVNFCTB4NDAwMDAwMDAKKworLyoKKyAqIEZMQVNIIENvbmZpZ3VyYXRpb24KKyAqLworI2lmZGVmIENPTkZJR19TWVNfRkxBU0hfQ0ZJCQkJCS8qIE5PUiBGbGFzaCAqLworCisjaWZkZWYgQ09ORklHX0ZMQVNIX0FTVDIzMDAKKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkJMHgyMDAwMDAwMCAJLyogRmxhc2ggQmFuayAjMSAqLworI2Vsc2UKKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkJMHgxMDAwMDAwMCAJLyogRmxhc2ggQmFuayAjMSAqLworI2VuZGlmCisKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9CQVNFCQlQSFlTX0ZMQVNIXzEKKyNkZWZpbmUgQ09ORklHX0ZMQVNIX0JBTktTX0xJU1QgCXsgUEhZU19GTEFTSF8xIH0KKworI2RlZmluZSBDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LUyAJMQorI2RlZmluZSBDT05GSUdfU1lTX01BWF9GTEFTSF9TRUNUCSgyNTYpCQkvKiBtYXggbnVtYmVyIG9mIHNlY3RvcnMgb24gb25lIGNoaXAgKi8KKworI2RlZmluZSBDT05GSUdfRU5WX0lTX0lOX0ZMQVNICTEKKyNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVQJCQkweDYwMDAwIAkvKiBlbnZpcm9ubWVudCBzdGFydHMgaGVyZSAgKi8KKyNkZWZpbmUgQ09ORklHX0VOVl9TSVpFCQkJMHgyMDAwMCAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IgKi8KKworI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0NGSV9BTURfUkVTRVQKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9VU0VfQlVGRkVSX1dSSVRFCisKKyNlbHNlCQkJCQkJLyogU1BJIEZsYXNoICovCisKKyNpZmRlZiBDT05GSUdfRkxBU0hfQVNUMjMwMAorI2RlZmluZSBQSFlTX0ZMQVNIXzEJCTB4MjAwMDAwMDAgCS8qIEZsYXNoIEJhbmsgIzEgKi8KKyNlbHNlCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJMHgxNDAwMDAwMCAJLyogRmxhc2ggQmFuayAjMSAqLworI2RlZmluZSBQSFlTX0ZMQVNIXzIJCTB4MTQ4MDAwMDAgCS8qIEZsYXNoIEJhbmsgIzIgKi8KKyNkZWZpbmUgUEhZU19GTEFTSF8yX0JBU0UJMHgxMDAwMDAwMAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfMlNQSUZMQVNICisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfQkFTRQkJUEhZU19GTEFTSF8yX0JBU0UKKyNkZWZpbmUgQ09ORklHX0ZMQVNIX0JBTktTX0xJU1QgCXsgUEhZU19GTEFTSF8xLCBQSFlTX0ZMQVNIXzIgfQorI2RlZmluZSBDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LUyAJMgorI2RlZmluZSBDT05GSUdfU1lTX01BWF9GTEFTSF9TRUNUCSgxMDI0KQkJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwICovCisKKyNkZWZpbmUgQ09ORklHX0VOVl9JU19JTl9GTEFTSAkJMQorI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVAkJMHg3RjAwMDAgCS8qIGVudmlyb25tZW50IHN0YXJ0cyBoZXJlICAqLworI2RlZmluZSBDT05GSUdfRU5WX1NJWkUJCQkweDAxMDAwMCAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IgKi8KKyNlbHNlCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfQkFTRQkJUEhZU19GTEFTSF8xCisjZGVmaW5lIENPTkZJR19GTEFTSF9CQU5LU19MSVNUIAl7IFBIWVNfRkxBU0hfMSB9CisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTIAkxCisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX1NFQ1QJKDEwMjQpCQkvKiBtYXggbnVtYmVyIG9mIHNlY3RvcnMgb24gb25lIGNoaXAgKi8KKworI2RlZmluZSBDT05GSUdfRU5WX0lTX0lOX0ZMQVNICQkxCisjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUCQkweDdGMDAwMCAJLyogZW52aXJvbm1lbnQgc3RhcnRzIGhlcmUgICovCisjZGVmaW5lIENPTkZJR19FTlZfU0laRQkJCTB4MDEwMDAwIAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvciAqLworI2VuZGlmCisKKyNlbmRpZgorCisjZGVmaW5lIF9fTElUVExFX0VORElBTgorCisjZGVmaW5lIENPTkZJR19NT05JVE9SX0JBU0UJCVRFWFRfQkFTRQorI2RlZmluZSBDT05GSUdfTU9OSVRPUl9MRU4JCSgxOTIgPDwgMTApCisKKy8qIHRpbWVvdXQgdmFsdWVzIGFyZSBpbiB0aWNrcyAqLworI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0VSQVNFX1RPVVQJKDIwKkNPTkZJR19TWVNfSFopIAkvKiBUaW1lb3V0IGZvciBGbGFzaCBFcmFzZSAqLworI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX1dSSVRFX1RPVVQJKDIwKkNPTkZJR19TWVNfSFopIAkvKiBUaW1lb3V0IGZvciBGbGFzaCBXcml0ZSAqLworCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19TWVNfTE9OR0hFTFAJCQkJLyogdW5kZWYgdG8gc2F2ZSBtZW1vcnkJCSovCisKKyNkZWZpbmUgQ09ORklHX1NZU19QUk9NUFQJCSJib290IyAiIAkvKiBNb25pdG9yIENvbW1hbmQgUHJvbXB0CSovCisjZGVmaW5lIENPTkZJR19TWVNfQ0JTSVpFCQkyNTYJCS8qIENvbnNvbGUgSS9PIEJ1ZmZlciBTaXplCSovCisjZGVmaW5lIENPTkZJR19TWVNfUEJTSVpFIChDT05GSUdfU1lTX0NCU0laRStzaXplb2YoQ09ORklHX1NZU19QUk9NUFQpKzE2KSAvKiBQcmludCBCdWZmZXIgU2l6ZSAqLworI2RlZmluZSBDT05GSUdfU1lTX01BWEFSR1MJCTE2CQkvKiBtYXggbnVtYmVyIG9mIGNvbW1hbmQgYXJncwkqLworI2RlZmluZSBDT05GSUdfU1lTX0JBUkdTSVpFCQlDT05GSUdfU1lTX0NCU0laRQkvKiBCb290IEFyZ3VtZW50IEJ1ZmZlciBTaXplCSovCisKKyNkZWZpbmUgQ09ORklHX1NZU19NRU1URVNUX1NUQVJUCTB4NDAwMDAwMDAJLyogbWVtdGVzdCB3b3JrcyBvbgkqLworI2RlZmluZSBDT05GSUdfU1lTX01FTVRFU1RfRU5ECQkweDQ0RkZGRkZGCS8qIDI1NiBNQiBpbiBEUkFNCSovCisKKyNkZWZpbmUJQ09ORklHX1NZU19DTEtTX0lOX0haCQkvKiBldmVyeXRoaW5nLCBpbmNsIGJvYXJkIGluZm8sIGluIEh6ICovCisjdW5kZWYJQ09ORklHX1NZU19DTEtTX0lOX0haCQkvKiBldmVyeXRoaW5nLCBpbmNsIGJvYXJkIGluZm8sIGluIEh6ICovCisKKyNkZWZpbmUgQ09ORklHX1NZU19MT0FEX0FERFIJCTB4NDMwMDAwMDAJLyogZGVmYXVsdCBsb2FkIGFkZHJlc3MgKi8KKworI2RlZmluZSBDT05GSUdfU1lTX1RJTUVSQkFTRQkJMHgxRTc4MjAwMAkvKiB1c2UgdGltZXIgMSAqLworI2RlZmluZSBDT05GSUdfU1lTX0haCQkJKDEqMTAwMCoxMDAwKQkvKiB1c2UgZXh0ZXJuYWwgY2xrICgxTSkgKi8KKworLyoKKyAqIFNlcmlhbCBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19OUzE2NTUwCisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MF9TRVJJQUwKKyNkZWZpbmUgQ09ORklHX1NZU19OUzE2NTUwX1JFR19TSVpFCTQKKyNkZWZpbmUgQ09ORklHX1NZU19OUzE2NTUwX0NMSwkJMjQwMDAwMDAKKyNkZWZpbmUgQ09ORklHX1NZU19OUzE2NTUwX0NPTTEJCTB4MWU3ODMwMDAKKyNkZWZpbmUgQ09ORklHX1NZU19OUzE2NTUwX0NPTTIJCTB4MWU3ODQwMDAKKyNkZWZpbmUJQ09ORklHX1NZU19MT0FEU19CQVVEX0NIQU5HRQorI2RlZmluZSBDT05GSUdfU0VSSUFMMQkJCTEKKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVgJCTIKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFCQkJMTE1MjAwCisjZGVmaW5lIENPTkZJR19TWVNfQkFVRFJBVEVfVEFCTEUJeyA5NjAwLCAxOTIwMCwgMzg0MDAsIDU3NjAwLCAxMTUyMDAgfQorCisvKgorICogVVNCIGRldmljZSBjb25maWd1cmF0aW9uCisgKi8KKy8qCisjZGVmaW5lIENPTkZJR19VU0JfREVWSUNFCQkxCisjZGVmaW5lIENPTkZJR19VU0JfVFRZCQkJMQorCisjZGVmaW5lIENPTkZJR19VU0JEX1ZFTkRPUklECQkweDEyMzQKKyNkZWZpbmUgQ09ORklHX1VTQkRfUFJPRFVDVElECQkweDU2NzgKKyNkZWZpbmUgQ09ORklHX1VTQkRfTUFOVUZBQ1RVUkVSCSJTaWVtZW5zIgorI2RlZmluZSBDT05GSUdfVVNCRF9QUk9EVUNUX05BTUUJIlNYMSIKKyovCisKKy8qCisgKiBJMkMgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19IQVJEX0kyQworI2RlZmluZSBDT05GSUdfU1lTX0kyQ19TUEVFRAkJMTAwMDAwCisjZGVmaW5lIENPTkZJR19TWVNfSTJDX1NMQVZFCQkxCisjZGVmaW5lIENPTkZJR19EUklWRVJfQVNQRUVEX0kyQworCisvKgorKiBFRVBST00gY29uZmlndXJhdGlvbgorKi8KKyNkZWZpbmUgQ09ORklHX1NZU19JMkNfRUVQUk9NX0FERFJfTEVOIAkyCisjZGVmaW5lIENPTkZJR19TWVNfSTJDX0VFUFJPTV9BRERSIAkweGEwCisKKy8qCisgKiBOSUMgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIF9fQllURV9PUkRFUiBfX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxECisjZGVmaW5lIENPTkZJR19NQUNfUEFSVElUSU9OCisjZGVmaW5lIENPTkZJR19BU1BFRUROSUMKKy8vI2RlZmluZSBDT05GSUdfTUFDMV9QSFlfTElOS19JTlRFUlJVUFQKKyNkZWZpbmUgQ09ORklHX01BQzJfRU5BQkxFCisjZGVmaW5lIENPTkZJR19NQUMyX1BIWV9MSU5LX0lOVEVSUlVQVAorLyoKKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIE5PVElDRTogTUFDMSBhbmQgTUFDMiBub3cgaGF2ZSB0aGVpciBvd24gc2VwZXJhdGUgUEhZIGNvbmZpZ3VyYXRpb24uCisqIFdlIHVzZSAyIGJpdHMgZm9yIGVhY2ggTUFDIGluIHRoZSBzY3JhdGNoIHJlZ2lzdGVyKERbMTU6MTFdIGluIDB4MUU2RTIwNDApIHRvCisqIGluZm9ybSBrZXJuZWwgZHJpdmVyLgorKiBUaGUgbWVhbmluZ3Mgb2YgdGhlIDIgYml0cyBhcmU6CisqIDAwKDApOiBEZWRpY2F0ZWQgUEhZCisqIDAxKDEpOiBBU1BFRUQncyBFVkEgKyBJTlRFTCdzIE5DLVNJIFBIWSBjaGlwIEVWQQorKiAxMCgyKTogQVNQRUVEJ3MgTUFDIGlzIGNvbm5lY3RlZCB0byBOQy1TSSBQSFkgY2hpcCBkaXJlY3RseQorKiAxMTogUmVzZXJ2ZWQKKyoKKyogV2UgdXNlIENPTkZJR19NQUMxX1BIWV9TRVRUSU5HIGFuZCBDT05GSUdfTUFDMl9QSFlfU0VUVElORyBpbiBVLUJvb3QKKyogMDogRGVkaWNhdGVkIFBIWQorKiAxOiBBU1BFRUQncyBFVkEgKyBJTlRFTCdzIE5DLVNJIFBIWSBjaGlwIEVWQQorKiAyOiBBU1BFRUQncyBNQUMgaXMgY29ubmVjdGVkIHRvIE5DLVNJIFBIWSBjaGlwIGRpcmVjdGx5CisqIDM6IFJlc2VydmVkCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKyNkZWZpbmUgQ09ORklHX01BQzFfUEhZX1NFVFRJTkcJCTAKKyNkZWZpbmUgQ09ORklHX01BQzJfUEhZX1NFVFRJTkcJCTAKKyNkZWZpbmUgQ09ORklHX01BQ19JTlRFUkZBQ0VfQ0xPQ0tfREVMQVkJMHgyMjU1CisjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkKKyNkZWZpbmUgQ09ORklHX0VUSEFDVAkJCWFzcGVlZG5pYyMwCisjZGVmaW5lIENPTkZJR19HQVRFV0FZSVAJCTE5Mi4xNjguMC4xCisjZGVmaW5lIENPTkZJR19ORVRNQVNLCQkJMjU1LjI1NS4yNTUuMAorI2RlZmluZSBDT05GSUdfSVBBRERSCQkJMTkyLjE2OC4wLjE4OAorI2RlZmluZSBDT05GSUdfU0VSVkVSSVAJCQkxOTIuMTY4LjAuMTA2CisjZGVmaW5lIENPTkZJR19FVEhBRERSCQkJMDA6QzA6QTg6MTI6MzQ6NTYKKyNkZWZpbmUgQ09ORklHX0VUSDFBRERSCQkJMDA6QzA6QTg6MTI6MzQ6NTcKKworLyoKKyAqIFNMVAorICovCisvKgorI2RlZmluZSBDT05GSUdfU0xUCisjZGVmaW5lIENGR19DTURfU0xUCQkoQ0ZHX0NNRF9WSURFT1RFU1QgfCBDRkdfQ01EX01BQ1RFU1QgfCBDRkdfQ01EX0hBQ1RFU1QgfCBDRkdfQ01EX01JQ1RFU1QpCisqLworCisjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2FzdDI0MDAuaCBiL2luY2x1ZGUvY29uZmlncy9hc3QyNDAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcwZmNmZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy9hc3QyNDAwLmgKQEAgLTAsMCArMSwzMjggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFBldGVyIENoZW4gPHBldGVyY0Bzb2NsZS10ZWNoLmNvbS50dz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqIChlYXN5IHRvIGNoYW5nZSkKKyAqLworLy8jZGVmaW5lIENPTkZJR19JTklUX0NSSVRJQ0FMCQkJLyogZGVmaW5lIGZvciBVLUJPT1QgMS4xLjEgKi8KKyN1bmRlZiAgQ09ORklHX0lOSVRfQ1JJVElDQUwJCQkvKiB1bmRlZiBmb3IgIFUtQk9PVCAxLjEuNCAqLyAKKy8vI2RlZmluZSBDT05GSUdfRlBHQV9BU1BFRUQJMQorI2RlZmluZSBDT05GSUdfQVJNOTI2RUpTCTEJCS8qIFRoaXMgaXMgYW4gYXJtOTI2ZWpzIENQVSAqLworI2RlZmluZQlDT05GSUdfQVNQRUVECQkxCisjZGVmaW5lIENPTkZJR19BU1QyNDAwCQkxCisvLyNkZWZpbmUgQ09ORklHX0FTVDEwNzAJCTEKKy8vI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0NGSQkJCS8qIENPTkZJR19GTEFTSF9DRkksIENPTkZJR19GTEFTSF9TUEkgaXMgZXhjbHVzaXZlKi8KKyNkZWZpbmUgQ09ORklHX0ZMQVNIX1NQSQorLy8jZGVmaW5lIENPTkZJR18yU1BJRkxBU0gJCQkvKiBCb290IFNQSTogQ1MyLCAybmQgU1BJOiBDUzAgKi8KKyN1bmRlZiBDT05GSUdfMlNQSUZMQVNICisjdW5kZWYgQ09ORklHX0FTUEVFRF9TTFQKKyNkZWZpbmUgQ09ORklHX0ZMQVNIX0FTVDIzMDAKKy8vI2RlZmluZSBDT05GSUdfRkxBU0hfQVNUMjMwMF9ETUEKKy8vI2RlZmluZSBDT05GSUdfRkxBU0hfU1BJeDJfRHVtbXkKKy8vI2RlZmluZSBDT05GSUdfRkxBU0hfU1BJeDRfRHVtbXkKKyNkZWZpbmUgQ09ORklHX0NSVF9ESVNQTEFZCTEJCS8qIHVuZGVmIGlmIG5vdCBzdXBwb3J0IENSVCAqLworCisvLyNkZWZpbmUgQ09ORklHX1VTRV9JUlEJCQkJLyogd2UgZG9uJ3QgbmVlZCBJUlEvRklRIHN0dWZmICovCisjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUiAKKworLyoKKyAqIERSQU0gQ29uZmlnCisgKgorICogMS4gRFJBTSBTaXplICAgICAgICAgICAgICAvLworICogICAgQ09ORklHX0RSQU1fNTEyTUJJVCAgICAvLyA1MTJNIGJpdAorICogICAgQ09ORklHX0RSQU1fMUdCSVQgICAgICAvLyAxRyAgIGJpdCAoZGVmYXVsdCkKKyAqICAgIENPTkZJR19EUkFNXzJHQklUICAgICAgLy8gMkcgICBiaXQKKyAqICAgIENPTkZJR19EUkFNXzRHQklUICAgICAgLy8gNEcgICBiaXQgCisgKiAyLiBEUkFNIFNwZWVkICAgICAgICAgICAgIC8vCisgKiAgICBDT05GSUdfRFJBTV8zMzYgICAgICAgIC8vIDMzNk1IeiAoRERSLTY2NykKKyAqICAgIENPTkZJR19EUkFNXzQwOCAgICAgICAgLy8gNDA4TUh6IChERFItODAwKSAoZGVmYXVsdCkKKyAqIDMuIFZHQSBNb2RlCisgKiAgICBDT05GSUdfQ1JUX0RJU1BMQVkgICAgIC8vIGRlZmluZSB0byBkaXNhYmxlIFZHQSBmdW5jdGlvbgorICogNC4gRUNDIEZ1bmN0aW9uIGVuYWJsZQorICogICAgQ09ORklHX0RSQU1fRUNDICAgICAgICAvLyBkZWZpbmUgdG8gZW5hYmxlIEVDQyBmdW5jdGlvbgorICogNS4gVUFSVCBEZWJ1ZyBNZXNzYWdlCisgKiAgICBDT05GSUdfRFJBTV9VQVJUX09VVCAgIC8vIGVuYWJsZSBvdXRwdXQgbWVzc2FnZSBhdCBVQVJUNQorICogICAgQ09ORklHX0RSQU1fVUFSVF8zODQwMCAvLyBzZXQgdGhlIFVBUlQgYmF1ZCByYXRlIHRvIDM4NDAwLCBkZWZhdWx0IGlzIDExNTIwMAorICovCisgCisvLzEuIERSQU0gU2l6ZQorLy8jZGVmaW5lICAgIENPTkZJR19EUkFNXzUxMk1CSVQKKyNkZWZpbmUgICAgQ09ORklHX0RSQU1fMUdCSVQKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV8yR0JJVAorLy8jZGVmaW5lICAgIENPTkZJR19EUkFNXzRHQklUCisvLzIuIERSQU0gU3BlZWQKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV8zMzYKKyNkZWZpbmUgICAgQ09ORklHX0RSQU1fNDA4CisvLzMuIFZHQSBNb2RlCisvLyNkZWZpbmUgICAgQ09ORklHX0NSVF9ESVNQTEFZCisvLzQuIEVDQyBGdW5jdGlvbiBlbmFibGUKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV9FQ0MKKy8vNS4gVUFSVCBEZWJ1ZyBNZXNzYWdlCisjZGVmaW5lICAgIENPTkZJR19EUkFNX1VBUlRfT1VUCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fVUFSVF8zODQwMAorCisKKworLyogCisgKiBFbnZpcm9ubWVudCBDb25maWcKKyAqLworI2RlZmluZSBDT05GSUdfQ01ETElORV9UQUcJIDEJCS8qIGVuYWJsZSBwYXNzaW5nIG9mIEFUQUdzCSovCisjZGVmaW5lIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUyAxCisjZGVmaW5lIENPTkZJR19JTklUUkRfVEFHCSAxCisjZGVmaW5lCUNPTkZJR19CT09UQVJHUyAJImRlYnVnIGNvbnNvbGU9dHR5UzAsMTE1MjAwbjggcmFtZGlza19zaXplPTE2Mzg0IHJvb3Q9L2Rldi9yYW0gcncgaW5pdD0vbGludXhyYyBtZW09ODBNIgorI2RlZmluZSBDT05GSUdfVVBEQVRFICAgICAgICAgICAidGZ0cCA0MDgwMDAwMCBhc3QyNDAwLnNjcjsgc28gNDA4MDAwMDAnIgorCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwkJLyogYXV0b2Jvb3QgYWZ0ZXIgMyBzZWNvbmRzCSovCisjaWZkZWYgQ09ORklHX0ZMQVNIX0FTVDIzMDAKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSAyMDA4MDAwMCAyMDMwMDAwMCIKKyNlbHNlCisjaWZkZWYJQ09ORklHX1NZU19GTEFTSF9DRkkgCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gMTAwODAwMDAgMTAzMDAwMDAiCisjZWxzZQorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIDE0MDgwMDAwIDE0MzAwMDAwIgorI2VuZGlmCisjZW5kaWYKKyNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCQkiYWxsLmJpbiIKKyNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ERkwKKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKyNkZWZpbmUgQ09ORklHX0NNRF9ORVRURVNUCisjZGVmaW5lIENPTkZJR19DTURfU0xUCisKKy8qIAorICogQ1BVIFNldHRpbmcKKyAqLworI2RlZmluZSBDUFVfQ0xPQ0tfUkFURQkJMTgwMDAwMDAJLyogMTYuNSBNSHogY2xvY2sgZm9yIHRoZSBBUk0gY29yZSAqLworCisvKgorICogU2l6ZSBvZiBtYWxsb2MoKSBwb29sCisgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19NQUxMT0NfTEVOCQkoQ09ORklHX0VOVl9TSVpFICsgNzY4KjEwMjQpCisjZGVmaW5lIENPTkZJR19TWVNfR0JMX0RBVEFfU0laRQkxMjgJLyogc2l6ZSBpbiBieXRlcyByZXNlcnZlZCBmb3IgaW5pdGlhbCBkYXRhICovCisKKy8qCisgKiBTdGFjayBzaXplcywgIFRoZSBzdGFjayBzaXplcyBhcmUgc2V0IHVwIGluIHN0YXJ0LlMgdXNpbmcgdGhlIHNldHRpbmdzIGJlbG93CisgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRQkoMTI4KjEwMjQpCS8qIHJlZ3VsYXIgc3RhY2sgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRV9JUlEJKDQqMTAyNCkJLyogSVJRIHN0YWNrICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkVfRklRCSg0KjEwMjQpCS8qIEZJUSBzdGFjayAqLworCisvKgorICogTWVtb3J5IENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfTlJfRFJBTV9CQU5LUwkxCSAgIAkvKiB3ZSBoYXZlIDEgYmFuayBvZiBEUkFNICovCisjZGVmaW5lIFBIWVNfU0RSQU1fMQkJMHg0MDAwMDAwMCAJLyogU0RSQU0gQmFuayAjMSAqLworI2RlZmluZSBQSFlTX1NEUkFNXzFfU0laRQkweDQwMDAwMDAgCS8qIDY0IE1CICovCisKKyNkZWZpbmUgQ09ORklHX1NZU19TRFJBTV9CQVNFCTB4NDAwMDAwMDAKKworLyoKKyAqIEZMQVNIIENvbmZpZ3VyYXRpb24KKyAqLworI2lmZGVmIENPTkZJR19TWVNfRkxBU0hfQ0ZJCQkJCS8qIE5PUiBGbGFzaCAqLworCisjaWZkZWYgQ09ORklHX0ZMQVNIX0FTVDIzMDAKKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkJMHgyMDAwMDAwMCAJLyogRmxhc2ggQmFuayAjMSAqLworI2Vsc2UKKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkJMHgxMDAwMDAwMCAJLyogRmxhc2ggQmFuayAjMSAqLworI2VuZGlmCisKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9CQVNFCQlQSFlTX0ZMQVNIXzEKKyNkZWZpbmUgQ09ORklHX0ZMQVNIX0JBTktTX0xJU1QgCXsgUEhZU19GTEFTSF8xIH0KKworI2RlZmluZSBDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LUyAJMQorI2RlZmluZSBDT05GSUdfU1lTX01BWF9GTEFTSF9TRUNUCSgyNTYpCQkvKiBtYXggbnVtYmVyIG9mIHNlY3RvcnMgb24gb25lIGNoaXAgKi8KKworI2RlZmluZSBDT05GSUdfRU5WX0lTX0lOX0ZMQVNICTEKKyNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVQJCQkJCTB4NjAwMDAgCS8qIGVudmlyb25tZW50IHN0YXJ0cyBoZXJlICAqLworI2RlZmluZSBDT05GSUdfRU5WX1NJWkUJCQkJCTB4MjAwMDAgCS8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yICovCisKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9DRklfQU1EX1JFU0VUCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfVVNFX0JVRkZFUl9XUklURQorCisjZWxzZQkJCQkJCS8qIFNQSSBGbGFzaCAqLworCisjaWZkZWYgQ09ORklHX0ZMQVNIX0FTVDIzMDAKKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkweDIwMDAwMDAwIAkvKiBGbGFzaCBCYW5rICMxICovCisjZWxzZQorI2RlZmluZSBQSFlTX0ZMQVNIXzEJCTB4MTQwMDAwMDAgCS8qIEZsYXNoIEJhbmsgIzEgKi8KKyNkZWZpbmUgUEhZU19GTEFTSF8yCQkweDE0ODAwMDAwIAkvKiBGbGFzaCBCYW5rICMyICovCisjZGVmaW5lIFBIWVNfRkxBU0hfMl9CQVNFCTB4MTAwMDAwMDAKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHXzJTUElGTEFTSAorI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0JBU0UJCVBIWVNfRkxBU0hfMl9CQVNFCisjZGVmaW5lIENPTkZJR19GTEFTSF9CQU5LU19MSVNUIAl7IFBIWVNfRkxBU0hfMSwgUEhZU19GTEFTSF8yIH0KKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1MgCTIKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfU0VDVAkoMTAyNCkJCS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcCAqLworCisjZGVmaW5lIENPTkZJR19FTlZfSVNfSU5fRkxBU0gJCTEKKyNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVQJCTB4N0YwMDAwIAkvKiBlbnZpcm9ubWVudCBzdGFydHMgaGVyZSAgKi8KKyNkZWZpbmUgQ09ORklHX0VOVl9TSVpFCQkJMHgwMTAwMDAgCS8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yICovCisjZWxzZQorI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0JBU0UJCVBIWVNfRkxBU0hfMQorI2RlZmluZSBDT05GSUdfRkxBU0hfQkFOS1NfTElTVCAJeyBQSFlTX0ZMQVNIXzEgfQorI2RlZmluZSBDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LUyAJMQorI2RlZmluZSBDT05GSUdfU1lTX01BWF9GTEFTSF9TRUNUCSgxMDI0KQkJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwICovCisKKyNkZWZpbmUgQ09ORklHX0VOVl9JU19JTl9GTEFTSAkJMQorI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVAkJMHg3RjAwMDAgCS8qIGVudmlyb25tZW50IHN0YXJ0cyBoZXJlICAqLworI2RlZmluZSBDT05GSUdfRU5WX1NJWkUJCQkweDAxMDAwMCAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IgKi8KKyNlbmRpZgorCisjZW5kaWYKKworI2RlZmluZSBfX0xJVFRMRV9FTkRJQU4KKworI2RlZmluZSBDT05GSUdfTU9OSVRPUl9CQVNFCQlURVhUX0JBU0UKKyNkZWZpbmUgQ09ORklHX01PTklUT1JfTEVOCQkoMTkyIDw8IDEwKQorCisvKiB0aW1lb3V0IHZhbHVlcyBhcmUgaW4gdGlja3MgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9FUkFTRV9UT1VUCSgyMCpDT05GSUdfU1lTX0haKSAJLyogVGltZW91dCBmb3IgRmxhc2ggRXJhc2UgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9XUklURV9UT1VUCSgyMCpDT05GSUdfU1lTX0haKSAJLyogVGltZW91dCBmb3IgRmxhc2ggV3JpdGUgKi8KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfU1lTX0xPTkdIRUxQCQkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLworCisjZGVmaW5lIENPTkZJR19TWVNfUFJPTVBUCQkiYm9vdCMgIiAJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLworI2RlZmluZSBDT05GSUdfU1lTX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworI2RlZmluZSBDT05GSUdfU1lTX1BCU0laRSAoQ09ORklHX1NZU19DQlNJWkUrc2l6ZW9mKENPTkZJR19TWVNfUFJPTVBUKSsxNikgLyogUHJpbnQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19NQVhBUkdTCQkxNgkJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MJKi8KKyNkZWZpbmUgQ09ORklHX1NZU19CQVJHU0laRQkJQ09ORklHX1NZU19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZQkqLworCisjZGVmaW5lIENPTkZJR19TWVNfTUVNVEVTVF9TVEFSVAkweDQwMDAwMDAwCS8qIG1lbXRlc3Qgd29ya3Mgb24JKi8KKyNkZWZpbmUgQ09ORklHX1NZU19NRU1URVNUX0VORAkJMHg0NEZGRkZGRgkvKiAyNTYgTUIgaW4gRFJBTQkqLworCisjZGVmaW5lCUNPTkZJR19TWVNfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworI3VuZGVmCUNPTkZJR19TWVNfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworCisjZGVmaW5lIENPTkZJR19TWVNfTE9BRF9BRERSCQkweDQzMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCisKKyNkZWZpbmUgQ09ORklHX1NZU19USU1FUkJBU0UJCTB4MUU3ODIwMDAJLyogdXNlIHRpbWVyIDEgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19IWgkJCSgxKjEwMDAqMTAwMCkJLyogdXNlIGV4dGVybmFsIGNsayAoMU0pICovCisKKy8qCisgKiBTZXJpYWwgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MF9SRUdfU0laRQk0CisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MF9DTEsJCTI0MDAwMDAwCisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MF9DT00xCQkweDFlNzgzMDAwCisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MF9DT00yCQkweDFlNzg0MDAwCisjZGVmaW5lCUNPTkZJR19TWVNfTE9BRFNfQkFVRF9DSEFOR0UKKyNkZWZpbmUgQ09ORklHX1NFUklBTDEJCQkxCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYCQkyCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJCTExNTIwMAorI2RlZmluZSBDT05GSUdfU1lTX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KKworLyoKKyAqIFVTQiBkZXZpY2UgY29uZmlndXJhdGlvbgorICovCisvKgorI2RlZmluZSBDT05GSUdfVVNCX0RFVklDRQkJMQorI2RlZmluZSBDT05GSUdfVVNCX1RUWQkJCTEKKworI2RlZmluZSBDT05GSUdfVVNCRF9WRU5ET1JJRAkJMHgxMjM0CisjZGVmaW5lIENPTkZJR19VU0JEX1BST0RVQ1RJRAkJMHg1Njc4CisjZGVmaW5lIENPTkZJR19VU0JEX01BTlVGQUNUVVJFUgkiU2llbWVucyIKKyNkZWZpbmUgQ09ORklHX1VTQkRfUFJPRFVDVF9OQU1FCSJTWDEiCisqLworCisvKgorICogSTJDIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfSEFSRF9JMkMKKyNkZWZpbmUgQ09ORklHX1NZU19JMkNfU1BFRUQJCTEwMDAwMAorI2RlZmluZSBDT05GSUdfU1lTX0kyQ19TTEFWRQkJMQorI2RlZmluZSBDT05GSUdfRFJJVkVSX0FTUEVFRF9JMkMKKworLyoKKyogRUVQUk9NIGNvbmZpZ3VyYXRpb24KKyovCisjZGVmaW5lIENPTkZJR19TWVNfSTJDX0VFUFJPTV9BRERSX0xFTiAJMgorI2RlZmluZSBDT05GSUdfU1lTX0kyQ19FRVBST01fQUREUiAJMHhhMAorCisvKgorICogTklDIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBfX0JZVEVfT1JERVIgX19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIF9fTElUVExFX0VORElBTl9CSVRGSUVMRAorI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgorI2RlZmluZSBDT05GSUdfQVNQRUVETklDCisjZGVmaW5lIENPTkZJR19NQUMxX1BIWV9MSU5LX0lOVEVSUlVQVAorI2RlZmluZSBDT05GSUdfTUFDMl9FTkFCTEUKKyNkZWZpbmUgQ09ORklHX01BQzJfUEhZX0xJTktfSU5URVJSVVBUCisvKgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogTk9USUNFOiBNQUMxIGFuZCBNQUMyIG5vdyBoYXZlIHRoZWlyIG93biBzZXBlcmF0ZSBQSFkgY29uZmlndXJhdGlvbi4KKyogV2UgdXNlIDIgYml0cyBmb3IgZWFjaCBNQUMgaW4gdGhlIHNjcmF0Y2ggcmVnaXN0ZXIoRFsxNToxMV0gaW4gMHgxRTZFMjA0MCkgdG8KKyogaW5mb3JtIGtlcm5lbCBkcml2ZXIuCisqIFRoZSBtZWFuaW5ncyBvZiB0aGUgMiBiaXRzIGFyZToKKyogMDAoMCk6IERlZGljYXRlZCBQSFkKKyogMDEoMSk6IEFTUEVFRCdzIEVWQSArIElOVEVMJ3MgTkMtU0kgUEhZIGNoaXAgRVZBCisqIDEwKDIpOiBBU1BFRUQncyBNQUMgaXMgY29ubmVjdGVkIHRvIE5DLVNJIFBIWSBjaGlwIGRpcmVjdGx5CisqIDExOiBSZXNlcnZlZAorKgorKiBXZSB1c2UgQ09ORklHX01BQzFfUEhZX1NFVFRJTkcgYW5kIENPTkZJR19NQUMyX1BIWV9TRVRUSU5HIGluIFUtQm9vdAorKiAwOiBEZWRpY2F0ZWQgUEhZCisqIDE6IEFTUEVFRCdzIEVWQSArIElOVEVMJ3MgTkMtU0kgUEhZIGNoaXAgRVZBCisqIDI6IEFTUEVFRCdzIE1BQyBpcyBjb25uZWN0ZWQgdG8gTkMtU0kgUEhZIGNoaXAgZGlyZWN0bHkKKyogMzogUmVzZXJ2ZWQKKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2RlZmluZSBDT05GSUdfTUFDMV9QSFlfU0VUVElORwkJMAorI2RlZmluZSBDT05GSUdfTUFDMl9QSFlfU0VUVElORwkJMAorI2RlZmluZSBDT05GSUdfTUFDX0lOVEVSRkFDRV9DTE9DS19ERUxBWQkweDIyNTUKKyNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQorI2RlZmluZSBDT05GSUdfRVRIQUNUCQkJYXNwZWVkbmljIzAKKyNkZWZpbmUgQ09ORklHX0dBVEVXQVlJUAkJMTkyLjE2OC4wLjEKKyNkZWZpbmUgQ09ORklHX05FVE1BU0sJCQkyNTUuMjU1LjI1NS4wCisjZGVmaW5lIENPTkZJR19JUEFERFIJCQkxOTIuMTY4LjAuNDUKKyNkZWZpbmUgQ09ORklHX1NFUlZFUklQCQkJMTkyLjE2OC4wLjgxCisjZGVmaW5lIENPTkZJR19FVEhBRERSCQkJMDA6QzA6QTg6MTI6MzQ6NTYKKyNkZWZpbmUgQ09ORklHX0VUSDFBRERSCQkJMDA6QzA6QTg6MTI6MzQ6NTcKKworLyoKKyAqIFNMVAorICovCisvKgorI2RlZmluZSBDT05GSUdfU0xUCisjZGVmaW5lIENGR19DTURfU0xUCQkoQ0ZHX0NNRF9WSURFT1RFU1QgfCBDRkdfQ01EX01BQ1RFU1QgfCBDRkdfQ01EX0hBQ1RFU1QgfCBDRkdfQ01EX01JQ1RFU1QpCisqLworCisjZW5kaWYJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2FzdDI0MDBfYXN0MTA3MC5oIGIvaW5jbHVkZS9jb25maWdzL2FzdDI0MDBfYXN0MTA3MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNmM0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvYXN0MjQwMF9hc3QxMDcwLmgKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFBldGVyIENoZW4gPHBldGVyY0Bzb2NsZS10ZWNoLmNvbS50dz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqIChlYXN5IHRvIGNoYW5nZSkKKyAqLworLy8jZGVmaW5lIENPTkZJR19JTklUX0NSSVRJQ0FMCQkJLyogZGVmaW5lIGZvciBVLUJPT1QgMS4xLjEgKi8KKyN1bmRlZiAgQ09ORklHX0lOSVRfQ1JJVElDQUwJCQkvKiB1bmRlZiBmb3IgIFUtQk9PVCAxLjEuNCAqLyAKKy8vI2RlZmluZSBDT05GSUdfRlBHQV9BU1BFRUQJMQorI2RlZmluZSBDT05GSUdfQVJNOTI2RUpTCTEJCS8qIFRoaXMgaXMgYW4gYXJtOTI2ZWpzIENQVSAqLworI2RlZmluZQlDT05GSUdfQVNQRUVECQkxCisjZGVmaW5lIENPTkZJR19BU1QyNDAwCQkxCisjZGVmaW5lIENPTkZJR19BU1QxMDcwCQkxCisvLyNkZWZpbmUgQ09ORklHX0NBTElCUkFUSU9OCTEKKy8vI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0NGSQkJCS8qIENPTkZJR19GTEFTSF9DRkksIENPTkZJR19GTEFTSF9TUEkgaXMgZXhjbHVzaXZlKi8KKyNkZWZpbmUgQ09ORklHX0ZMQVNIX1NQSQorLy8jZGVmaW5lIENPTkZJR18yU1BJRkxBU0gJCQkvKiBCb290IFNQSTogQ1MyLCAybmQgU1BJOiBDUzAgKi8KKyN1bmRlZiBDT05GSUdfMlNQSUZMQVNICisjdW5kZWYgQ09ORklHX0FTUEVFRF9TTFQKKyNkZWZpbmUgQ09ORklHX0ZMQVNIX0FTVDIzMDAKKyNkZWZpbmUgQ09ORklHX0ZMQVNIX0FTVDIzMDBfRE1BCisvLyNkZWZpbmUgQ09ORklHX0ZMQVNIX1NQSXgyX0R1bW15CisvLyNkZWZpbmUgQ09ORklHX0ZMQVNIX1NQSXg0X0R1bW15CisjZGVmaW5lIENPTkZJR19DUlRfRElTUExBWQkxCQkvKiB1bmRlZiBpZiBub3Qgc3VwcG9ydCBDUlQgKi8KKworLy8jZGVmaW5lIENPTkZJR19VU0VfSVJRCQkJCS8qIHdlIGRvbid0IG5lZWQgSVJRL0ZJUSBzdHVmZiAqLworI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX1IgCisKKy8qCisgKiBEUkFNIENvbmZpZworICoKKyAqIDEuIERSQU0gU2l6ZSAgICAgICAgICAgICAgLy8KKyAqICAgIENPTkZJR19EUkFNXzUxMk1CSVQgICAgLy8gNTEyTSBiaXQKKyAqICAgIENPTkZJR19EUkFNXzFHQklUICAgICAgLy8gMUcgICBiaXQgKGRlZmF1bHQpCisgKiAgICBDT05GSUdfRFJBTV8yR0JJVCAgICAgIC8vIDJHICAgYml0CisgKiAgICBDT05GSUdfRFJBTV80R0JJVCAgICAgIC8vIDRHICAgYml0IAorICogMi4gRFJBTSBTcGVlZCAgICAgICAgICAgICAvLworICogICAgQ09ORklHX0RSQU1fMzM2ICAgICAgICAvLyAzMzZNSHogKEREUi02NjcpCisgKiAgICBDT05GSUdfRFJBTV80MDggICAgICAgIC8vIDQwOE1IeiAoRERSLTgwMCkgKGRlZmF1bHQpCisgKiAzLiBWR0EgTW9kZQorICogICAgQ09ORklHX0NSVF9ESVNQTEFZICAgICAvLyBkZWZpbmUgdG8gZGlzYWJsZSBWR0EgZnVuY3Rpb24KKyAqIDQuIEVDQyBGdW5jdGlvbiBlbmFibGUKKyAqICAgIENPTkZJR19EUkFNX0VDQyAgICAgICAgLy8gZGVmaW5lIHRvIGVuYWJsZSBFQ0MgZnVuY3Rpb24KKyAqIDUuIFVBUlQgRGVidWcgTWVzc2FnZQorICogICAgQ09ORklHX0RSQU1fVUFSVF9PVVQgICAvLyBlbmFibGUgb3V0cHV0IG1lc3NhZ2UgYXQgVUFSVDUKKyAqICAgIENPTkZJR19EUkFNX1VBUlRfMzg0MDAgLy8gc2V0IHRoZSBVQVJUIGJhdWQgcmF0ZSB0byAzODQwMCwgZGVmYXVsdCBpcyAxMTUyMDAKKyAqLworIAorLy8xLiBEUkFNIFNpemUKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV81MTJNQklUCisjZGVmaW5lICAgIENPTkZJR19EUkFNXzFHQklUCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fMkdCSVQKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV80R0JJVAorLy8yLiBEUkFNIFNwZWVkCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fMzM2CisjZGVmaW5lICAgIENPTkZJR19EUkFNXzQwOAorLy8zLiBWR0EgTW9kZQorLy8jZGVmaW5lICAgIENPTkZJR19DUlRfRElTUExBWQorLy80LiBFQ0MgRnVuY3Rpb24gZW5hYmxlCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fRUNDCisvLzUuIFVBUlQgRGVidWcgTWVzc2FnZQorI2RlZmluZSAgICBDT05GSUdfRFJBTV9VQVJUX09VVAorLy8jZGVmaW5lICAgIENPTkZJR19EUkFNX1VBUlRfMzg0MDAKKworCisKKy8qIAorICogRW52aXJvbm1lbnQgQ29uZmlnCisgKi8KKyNkZWZpbmUgQ09ORklHX0NNRExJTkVfVEFHCSAxCQkvKiBlbmFibGUgcGFzc2luZyBvZiBBVEFHcwkqLworI2RlZmluZSBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MgMQorI2RlZmluZSBDT05GSUdfSU5JVFJEX1RBRwkgMQorI2RlZmluZQlDT05GSUdfQk9PVEFSR1MgCSJkZWJ1ZyBjb25zb2xlPXR0eVMwLDExNTIwMG44IHJhbWRpc2tfc2l6ZT0xNjM4NCByb290PS9kZXYvcmFtIHJ3IGluaXQ9L2xpbnV4cmMgbWVtPTgwTSIKKyNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCQkvKiBhdXRvYm9vdCBhZnRlciAzIHNlY29uZHMJKi8KKyNpZmRlZiBDT05GSUdfRkxBU0hfQVNUMjMwMAorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIDIwMDgwMDAwIDIwMzAwMDAwIgorI2Vsc2UKKyNpZmRlZglDT05GSUdfU1lTX0ZMQVNIX0NGSSAKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSAxMDA4MDAwMCAxMDMwMDAwMCIKKyNlbHNlCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gMTQwODAwMDAgMTQzMDAwMDAiCisjZW5kaWYKKyNlbmRpZgorI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJCSJhbGwuYmluIgorI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RGTAorI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorI2RlZmluZSBDT05GSUdfQ01EX05FVFRFU1QKKworLyogCisgKiBDUFUgU2V0dGluZworICovCisjZGVmaW5lIENQVV9DTE9DS19SQVRFCQkxODAwMDAwMAkvKiAxNi41IE1IeiBjbG9jayBmb3IgdGhlIEFSTSBjb3JlICovCisKKy8qCisgKiBTaXplIG9mIG1hbGxvYygpIHBvb2wKKyAqLworI2RlZmluZSBDT05GSUdfU1lTX01BTExPQ19MRU4JCShDT05GSUdfRU5WX1NJWkUgKyA3NjgqMTAyNCkKKyNkZWZpbmUgQ09ORklHX1NZU19HQkxfREFUQV9TSVpFCTEyOAkvKiBzaXplIGluIGJ5dGVzIHJlc2VydmVkIGZvciBpbml0aWFsIGRhdGEgKi8KKworLyoKKyAqIFN0YWNrIHNpemVzLCAgVGhlIHN0YWNrIHNpemVzIGFyZSBzZXQgdXAgaW4gc3RhcnQuUyB1c2luZyB0aGUgc2V0dGluZ3MgYmVsb3cKKyAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFCSgxMjgqMTAyNCkJLyogcmVndWxhciBzdGFjayAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFX0lSUQkoNCoxMDI0KQkvKiBJUlEgc3RhY2sgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRV9GSVEJKDQqMTAyNCkJLyogRklRIHN0YWNrICovCisKKy8qCisgKiBNZW1vcnkgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19OUl9EUkFNX0JBTktTCTEJICAgCS8qIHdlIGhhdmUgMSBiYW5rIG9mIERSQU0gKi8KKyNkZWZpbmUgUEhZU19TRFJBTV8xCQkweDQwMDAwMDAwIAkvKiBTRFJBTSBCYW5rICMxICovCisjZGVmaW5lIFBIWVNfU0RSQU1fMV9TSVpFCTB4NDAwMDAwMCAJLyogNjQgTUIgKi8KKworI2RlZmluZSBDT05GSUdfU1lTX1NEUkFNX0JBU0UJMHg0MDAwMDAwMAorCisvKgorICogRkxBU0ggQ29uZmlndXJhdGlvbgorICovCisjaWZkZWYgQ09ORklHX1NZU19GTEFTSF9DRkkJCQkJLyogTk9SIEZsYXNoICovCisKKyNpZmRlZiBDT05GSUdfRkxBU0hfQVNUMjMwMAorI2RlZmluZSBQSFlTX0ZMQVNIXzEJCQkweDIwMDAwMDAwIAkvKiBGbGFzaCBCYW5rICMxICovCisjZWxzZQorI2RlZmluZSBQSFlTX0ZMQVNIXzEJCQkweDEwMDAwMDAwIAkvKiBGbGFzaCBCYW5rICMxICovCisjZW5kaWYKKworI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0JBU0UJCVBIWVNfRkxBU0hfMQorI2RlZmluZSBDT05GSUdfRkxBU0hfQkFOS1NfTElTVCAJeyBQSFlTX0ZMQVNIXzEgfQorCisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTIAkxCisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX1NFQ1QJKDI1NikJCS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcCAqLworCisjZGVmaW5lIENPTkZJR19FTlZfSVNfSU5fRkxBU0gJMQorI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVAkJCTB4NjAwMDAgCS8qIGVudmlyb25tZW50IHN0YXJ0cyBoZXJlICAqLworI2RlZmluZSBDT05GSUdfRU5WX1NJWkUJCQkweDIwMDAwIAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvciAqLworCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfQ0ZJX0FNRF9SRVNFVAorI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX1VTRV9CVUZGRVJfV1JJVEUKKworI2Vsc2UJCQkJCQkvKiBTUEkgRmxhc2ggKi8KKworI2lmZGVmIENPTkZJR19GTEFTSF9BU1QyMzAwCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJMHgyMDAwMDAwMCAJLyogRmxhc2ggQmFuayAjMSAqLworI2Vsc2UKKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkweDE0MDAwMDAwIAkvKiBGbGFzaCBCYW5rICMxICovCisjZGVmaW5lIFBIWVNfRkxBU0hfMgkJMHgxNDgwMDAwMCAJLyogRmxhc2ggQmFuayAjMiAqLworI2RlZmluZSBQSFlTX0ZMQVNIXzJfQkFTRQkweDEwMDAwMDAwCisjZW5kaWYKKworI2lmZGVmIENPTkZJR18yU1BJRkxBU0gKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9CQVNFCQlQSFlTX0ZMQVNIXzJfQkFTRQorI2RlZmluZSBDT05GSUdfRkxBU0hfQkFOS1NfTElTVCAJeyBQSFlTX0ZMQVNIXzEsIFBIWVNfRkxBU0hfMiB9CisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTIAkyCisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX1NFQ1QJKDEwMjQpCQkvKiBtYXggbnVtYmVyIG9mIHNlY3RvcnMgb24gb25lIGNoaXAgKi8KKworI2RlZmluZSBDT05GSUdfRU5WX0lTX0lOX0ZMQVNICQkxCisjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUCQkweDdGMDAwMCAJLyogZW52aXJvbm1lbnQgc3RhcnRzIGhlcmUgICovCisjZGVmaW5lIENPTkZJR19FTlZfU0laRQkJCTB4MDEwMDAwIAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvciAqLworI2Vsc2UKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9CQVNFCQlQSFlTX0ZMQVNIXzEKKyNkZWZpbmUgQ09ORklHX0ZMQVNIX0JBTktTX0xJU1QgCXsgUEhZU19GTEFTSF8xIH0KKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1MgCTEKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfU0VDVAkoMTAyNCkJCS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcCAqLworCisjZGVmaW5lIENPTkZJR19FTlZfSVNfSU5fRkxBU0gJCTEKKyNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVQJCTB4N0YwMDAwIAkvKiBlbnZpcm9ubWVudCBzdGFydHMgaGVyZSAgKi8KKyNkZWZpbmUgQ09ORklHX0VOVl9TSVpFCQkJMHgwMTAwMDAgCS8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yICovCisjZW5kaWYKKworI2VuZGlmCisKKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOCisKKyNkZWZpbmUgQ09ORklHX01PTklUT1JfQkFTRQkJVEVYVF9CQVNFCisjZGVmaW5lIENPTkZJR19NT05JVE9SX0xFTgkJKDE5MiA8PCAxMCkKKworLyogdGltZW91dCB2YWx1ZXMgYXJlIGluIHRpY2tzICovCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfRVJBU0VfVE9VVAkoMjAqQ09ORklHX1NZU19IWikgCS8qIFRpbWVvdXQgZm9yIEZsYXNoIEVyYXNlICovCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfV1JJVEVfVE9VVAkoMjAqQ09ORklHX1NZU19IWikgCS8qIFRpbWVvdXQgZm9yIEZsYXNoIFdyaXRlICovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KKworI2RlZmluZSBDT05GSUdfU1lTX1BST01QVAkJImJvb3QjICIgCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KKyNkZWZpbmUgQ09ORklHX1NZU19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNkZWZpbmUgQ09ORklHX1NZU19QQlNJWkUgKENPTkZJR19TWVNfQ0JTSVpFK3NpemVvZihDT05GSUdfU1lTX1BST01QVCkrMTYpIC8qIFByaW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENPTkZJR19TWVNfTUFYQVJHUwkJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENPTkZJR19TWVNfQkFSR1NJWkUJCUNPTkZJR19TWVNfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUJKi8KKworI2RlZmluZSBDT05GSUdfU1lTX01FTVRFU1RfU1RBUlQJMHg0MDAwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uCSovCisjZGVmaW5lIENPTkZJR19TWVNfTUVNVEVTVF9FTkQJCTB4NDRGRkZGRkYJLyogMjU2IE1CIGluIERSQU0JKi8KKworI2RlZmluZQlDT05GSUdfU1lTX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKyN1bmRlZglDT05GSUdfU1lTX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKworI2RlZmluZSBDT05GSUdfU1lTX0xPQURfQUREUgkJMHg0MzAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLworCisjZGVmaW5lIENPTkZJR19TWVNfVElNRVJCQVNFCQkweDFFNzgyMDAwCS8qIHVzZSB0aW1lciAxICovCisjZGVmaW5lIENPTkZJR19TWVNfSFoJCQkoMSoxMDAwKjEwMDApCS8qIHVzZSBleHRlcm5hbCBjbGsgKDFNKSAqLworCisvKgorICogU2VyaWFsIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTAKKyNkZWZpbmUgQ09ORklHX1NZU19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfUkVHX1NJWkUJNAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfQ0xLCQkyNDAwMDAwMAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfQ09NMQkJMHgxZTc4MzAwMAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfQ09NMgkJMHgxZTc4NDAwMAorI2RlZmluZQlDT05GSUdfU1lTX0xPQURTX0JBVURfQ0hBTkdFCisjZGVmaW5lIENPTkZJR19TRVJJQUwxCQkJMQorI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWAkJMgorI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCQkxMTUyMDAKKyNkZWZpbmUgQ09ORklHX1NZU19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CisKKy8qCisgKiBVU0IgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyAqLworLyoKKyNkZWZpbmUgQ09ORklHX1VTQl9ERVZJQ0UJCTEKKyNkZWZpbmUgQ09ORklHX1VTQl9UVFkJCQkxCisKKyNkZWZpbmUgQ09ORklHX1VTQkRfVkVORE9SSUQJCTB4MTIzNAorI2RlZmluZSBDT05GSUdfVVNCRF9QUk9EVUNUSUQJCTB4NTY3OAorI2RlZmluZSBDT05GSUdfVVNCRF9NQU5VRkFDVFVSRVIJIlNpZW1lbnMiCisjZGVmaW5lIENPTkZJR19VU0JEX1BST0RVQ1RfTkFNRQkiU1gxIgorKi8KKworLyoKKyAqIEkyQyBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX0hBUkRfSTJDCisjZGVmaW5lIENPTkZJR19TWVNfSTJDX1NQRUVECQkxMDAwMDAKKyNkZWZpbmUgQ09ORklHX1NZU19JMkNfU0xBVkUJCTEKKyNkZWZpbmUgQ09ORklHX0RSSVZFUl9BU1BFRURfSTJDCisKKy8qCisqIEVFUFJPTSBjb25maWd1cmF0aW9uCisqLworI2RlZmluZSBDT05GSUdfU1lTX0kyQ19FRVBST01fQUREUl9MRU4gCTIKKyNkZWZpbmUgQ09ORklHX1NZU19JMkNfRUVQUk9NX0FERFIgCTB4YTAKKworLyoKKyAqIE5JQyBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgX19CWVRFX09SREVSIF9fTElUVExFX0VORElBTgorI2RlZmluZSBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKKyNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KKyNkZWZpbmUgQ09ORklHX0FTUEVFRE5JQworI2RlZmluZSBDT05GSUdfTUFDMV9QSFlfTElOS19JTlRFUlJVUFQKKyNkZWZpbmUgQ09ORklHX01BQzJfRU5BQkxFCisjZGVmaW5lIENPTkZJR19NQUMyX1BIWV9MSU5LX0lOVEVSUlVQVAorLyoKKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIE5PVElDRTogTUFDMSBhbmQgTUFDMiBub3cgaGF2ZSB0aGVpciBvd24gc2VwZXJhdGUgUEhZIGNvbmZpZ3VyYXRpb24uCisqIFdlIHVzZSAyIGJpdHMgZm9yIGVhY2ggTUFDIGluIHRoZSBzY3JhdGNoIHJlZ2lzdGVyKERbMTU6MTFdIGluIDB4MUU2RTIwNDApIHRvCisqIGluZm9ybSBrZXJuZWwgZHJpdmVyLgorKiBUaGUgbWVhbmluZ3Mgb2YgdGhlIDIgYml0cyBhcmU6CisqIDAwKDApOiBEZWRpY2F0ZWQgUEhZCisqIDAxKDEpOiBBU1BFRUQncyBFVkEgKyBJTlRFTCdzIE5DLVNJIFBIWSBjaGlwIEVWQQorKiAxMCgyKTogQVNQRUVEJ3MgTUFDIGlzIGNvbm5lY3RlZCB0byBOQy1TSSBQSFkgY2hpcCBkaXJlY3RseQorKiAxMTogUmVzZXJ2ZWQKKyoKKyogV2UgdXNlIENPTkZJR19NQUMxX1BIWV9TRVRUSU5HIGFuZCBDT05GSUdfTUFDMl9QSFlfU0VUVElORyBpbiBVLUJvb3QKKyogMDogRGVkaWNhdGVkIFBIWQorKiAxOiBBU1BFRUQncyBFVkEgKyBJTlRFTCdzIE5DLVNJIFBIWSBjaGlwIEVWQQorKiAyOiBBU1BFRUQncyBNQUMgaXMgY29ubmVjdGVkIHRvIE5DLVNJIFBIWSBjaGlwIGRpcmVjdGx5CisqIDM6IFJlc2VydmVkCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKyNkZWZpbmUgQ09ORklHX01BQzFfUEhZX1NFVFRJTkcJCTAKKyNkZWZpbmUgQ09ORklHX01BQzJfUEhZX1NFVFRJTkcJCTAKKyNkZWZpbmUgQ09ORklHX01BQ19JTlRFUkZBQ0VfQ0xPQ0tfREVMQVkJMHgyMjU1CisjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkKKyNkZWZpbmUgQ09ORklHX0VUSEFDVAkJCWFzcGVlZG5pYyMwCisjZGVmaW5lIENPTkZJR19HQVRFV0FZSVAJCTE5Mi4xNjguMC4xCisjZGVmaW5lIENPTkZJR19ORVRNQVNLCQkJMjU1LjI1NS4yNTUuMAorI2RlZmluZSBDT05GSUdfSVBBRERSCQkJMTkyLjE2OC4wLjQxCisjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJCTE5Mi4xNjguMC44MQorI2RlZmluZSBDT05GSUdfRVRIQUREUgkJCTAwOkMwOkE4OjEyOjM0OjU2CisjZGVmaW5lIENPTkZJR19FVEgxQUREUgkJCTAwOkMwOkE4OjEyOjM0OjU3CisKKy8qCisgKiBTTFQKKyAqLworLyoKKyNkZWZpbmUgQ09ORklHX1NMVAorI2RlZmluZSBDRkdfQ01EX1NMVAkJKENGR19DTURfVklERU9URVNUIHwgQ0ZHX0NNRF9NQUNURVNUIHwgQ0ZHX0NNRF9IQUNURVNUIHwgQ0ZHX0NNRF9NSUNURVNUKQorKi8KKworI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9hc3QyNDAwX2FzdDEwNzAxLmggYi9pbmNsdWRlL2NvbmZpZ3MvYXN0MjQwMF9hc3QxMDcwMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NTM1MzUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvYXN0MjQwMF9hc3QxMDcwMS5oCkBAIC0wLDAgKzEsMzI3IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBQZXRlciBDaGVuIDxwZXRlcmNAc29jbGUtdGVjaC5jb20udHc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKiAoZWFzeSB0byBjaGFuZ2UpCisgKi8KKy8vI2RlZmluZSBDT05GSUdfSU5JVF9DUklUSUNBTAkJCS8qIGRlZmluZSBmb3IgVS1CT09UIDEuMS4xICovCisjdW5kZWYgIENPTkZJR19JTklUX0NSSVRJQ0FMCQkJLyogdW5kZWYgZm9yICBVLUJPT1QgMS4xLjQgKi8gCisvLyNkZWZpbmUgQ09ORklHX0ZQR0FfQVNQRUVECTEKKyNkZWZpbmUgQ09ORklHX0FSTTkyNkVKUwkxCQkvKiBUaGlzIGlzIGFuIGFybTkyNmVqcyBDUFUgKi8KKyNkZWZpbmUJQ09ORklHX0FTUEVFRAkJMQorI2RlZmluZSBDT05GSUdfQVNUMjQwMAkJMQorI2RlZmluZSBDT05GSUdfQVNUMTA3MAkJMQorI2RlZmluZSBDT05GSUdfTFBDX1BMVVMJCTEKKy8vI2RlZmluZSBDT05GSUdfQ0FMSUJSQVRJT04JMQorLy8jZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfQ0ZJCQkJLyogQ09ORklHX0ZMQVNIX0NGSSwgQ09ORklHX0ZMQVNIX1NQSSBpcyBleGNsdXNpdmUqLworI2RlZmluZSBDT05GSUdfRkxBU0hfU1BJCisvLyNkZWZpbmUgQ09ORklHXzJTUElGTEFTSAkJCS8qIEJvb3QgU1BJOiBDUzIsIDJuZCBTUEk6IENTMCAqLworI3VuZGVmIENPTkZJR18yU1BJRkxBU0gKKyN1bmRlZiBDT05GSUdfQVNQRUVEX1NMVAorI2RlZmluZSBDT05GSUdfRkxBU0hfQVNUMjMwMAorI2RlZmluZSBDT05GSUdfRkxBU0hfQVNUMjMwMF9ETUEKKy8vI2RlZmluZSBDT05GSUdfRkxBU0hfU1BJeDJfRHVtbXkKKy8vI2RlZmluZSBDT05GSUdfRkxBU0hfU1BJeDRfRHVtbXkKKyNkZWZpbmUgQ09ORklHX0NSVF9ESVNQTEFZCTEJCS8qIHVuZGVmIGlmIG5vdCBzdXBwb3J0IENSVCAqLworCisvLyNkZWZpbmUgQ09ORklHX1VTRV9JUlEJCQkJLyogd2UgZG9uJ3QgbmVlZCBJUlEvRklRIHN0dWZmICovCisjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUiAKKworLyoKKyAqIERSQU0gQ29uZmlnCisgKgorICogMS4gRFJBTSBTaXplICAgICAgICAgICAgICAvLworICogICAgQ09ORklHX0RSQU1fNTEyTUJJVCAgICAvLyA1MTJNIGJpdAorICogICAgQ09ORklHX0RSQU1fMUdCSVQgICAgICAvLyAxRyAgIGJpdCAoZGVmYXVsdCkKKyAqICAgIENPTkZJR19EUkFNXzJHQklUICAgICAgLy8gMkcgICBiaXQKKyAqICAgIENPTkZJR19EUkFNXzRHQklUICAgICAgLy8gNEcgICBiaXQgCisgKiAyLiBEUkFNIFNwZWVkICAgICAgICAgICAgIC8vCisgKiAgICBDT05GSUdfRFJBTV8zMzYgICAgICAgIC8vIDMzNk1IeiAoRERSLTY2NykKKyAqICAgIENPTkZJR19EUkFNXzQwOCAgICAgICAgLy8gNDA4TUh6IChERFItODAwKSAoZGVmYXVsdCkKKyAqIDMuIFZHQSBNb2RlCisgKiAgICBDT05GSUdfQ1JUX0RJU1BMQVkgICAgIC8vIGRlZmluZSB0byBkaXNhYmxlIFZHQSBmdW5jdGlvbgorICogNC4gRUNDIEZ1bmN0aW9uIGVuYWJsZQorICogICAgQ09ORklHX0RSQU1fRUNDICAgICAgICAvLyBkZWZpbmUgdG8gZW5hYmxlIEVDQyBmdW5jdGlvbgorICogNS4gVUFSVCBEZWJ1ZyBNZXNzYWdlCisgKiAgICBDT05GSUdfRFJBTV9VQVJUX09VVCAgIC8vIGVuYWJsZSBvdXRwdXQgbWVzc2FnZSBhdCBVQVJUNQorICogICAgQ09ORklHX0RSQU1fVUFSVF8zODQwMCAvLyBzZXQgdGhlIFVBUlQgYmF1ZCByYXRlIHRvIDM4NDAwLCBkZWZhdWx0IGlzIDExNTIwMAorICovCisgCisvLzEuIERSQU0gU2l6ZQorLy8jZGVmaW5lICAgIENPTkZJR19EUkFNXzUxMk1CSVQKKyNkZWZpbmUgICAgQ09ORklHX0RSQU1fMUdCSVQKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV8yR0JJVAorLy8jZGVmaW5lICAgIENPTkZJR19EUkFNXzRHQklUCisvLzIuIERSQU0gU3BlZWQKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV8zMzYKKyNkZWZpbmUgICAgQ09ORklHX0RSQU1fNDA4CisvLzMuIFZHQSBNb2RlCisvLyNkZWZpbmUgICAgQ09ORklHX0NSVF9ESVNQTEFZCisvLzQuIEVDQyBGdW5jdGlvbiBlbmFibGUKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV9FQ0MKKy8vNS4gVUFSVCBEZWJ1ZyBNZXNzYWdlCisjZGVmaW5lICAgIENPTkZJR19EUkFNX1VBUlRfT1VUCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fVUFSVF8zODQwMAorCisKKworLyogCisgKiBFbnZpcm9ubWVudCBDb25maWcKKyAqLworI2RlZmluZSBDT05GSUdfQ01ETElORV9UQUcJIDEJCS8qIGVuYWJsZSBwYXNzaW5nIG9mIEFUQUdzCSovCisjZGVmaW5lIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUyAxCisjZGVmaW5lIENPTkZJR19JTklUUkRfVEFHCSAxCisjZGVmaW5lCUNPTkZJR19CT09UQVJHUyAJImRlYnVnIGNvbnNvbGU9dHR5UzAsMTE1MjAwbjggcmFtZGlza19zaXplPTE2Mzg0IHJvb3Q9L2Rldi9yYW0gcncgaW5pdD0vbGludXhyYyBtZW09ODBNIgorI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTMJCS8qIGF1dG9ib290IGFmdGVyIDMgc2Vjb25kcwkqLworI2lmZGVmIENPTkZJR19GTEFTSF9BU1QyMzAwCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gMjAwODAwMDAgMjAzMDAwMDAiCisjZWxzZQorI2lmZGVmCUNPTkZJR19TWVNfRkxBU0hfQ0ZJIAorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIDEwMDgwMDAwIDEwMzAwMDAwIgorI2Vsc2UKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSAxNDA4MDAwMCAxNDMwMDAwMCIKKyNlbmRpZgorI2VuZGlmCisjZGVmaW5lIENPTkZJR19CT09URklMRQkJImFsbC5iaW4iCisjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREZMCisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfTkVUVEVTVAorCisvKiAKKyAqIENQVSBTZXR0aW5nCisgKi8KKyNkZWZpbmUgQ1BVX0NMT0NLX1JBVEUJCTE4MDAwMDAwCS8qIDE2LjUgTUh6IGNsb2NrIGZvciB0aGUgQVJNIGNvcmUgKi8KKworLyoKKyAqIFNpemUgb2YgbWFsbG9jKCkgcG9vbAorICovCisjZGVmaW5lIENPTkZJR19TWVNfTUFMTE9DX0xFTgkJKENPTkZJR19FTlZfU0laRSArIDc2OCoxMDI0KQorI2RlZmluZSBDT05GSUdfU1lTX0dCTF9EQVRBX1NJWkUJMTI4CS8qIHNpemUgaW4gYnl0ZXMgcmVzZXJ2ZWQgZm9yIGluaXRpYWwgZGF0YSAqLworCisvKgorICogU3RhY2sgc2l6ZXMsICBUaGUgc3RhY2sgc2l6ZXMgYXJlIHNldCB1cCBpbiBzdGFydC5TIHVzaW5nIHRoZSBzZXR0aW5ncyBiZWxvdworICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkUJKDEyOCoxMDI0KQkvKiByZWd1bGFyIHN0YWNrICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkVfSVJRCSg0KjEwMjQpCS8qIElSUSBzdGFjayAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFX0ZJUQkoNCoxMDI0KQkvKiBGSVEgc3RhY2sgKi8KKworLyoKKyAqIE1lbW9yeSBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX05SX0RSQU1fQkFOS1MJMQkgICAJLyogd2UgaGF2ZSAxIGJhbmsgb2YgRFJBTSAqLworI2RlZmluZSBQSFlTX1NEUkFNXzEJCTB4NDAwMDAwMDAgCS8qIFNEUkFNIEJhbmsgIzEgKi8KKyNkZWZpbmUgUEhZU19TRFJBTV8xX1NJWkUJMHg0MDAwMDAwIAkvKiA2NCBNQiAqLworCisjZGVmaW5lIENPTkZJR19TWVNfU0RSQU1fQkFTRQkweDQwMDAwMDAwCisKKy8qCisgKiBGTEFTSCBDb25maWd1cmF0aW9uCisgKi8KKyNpZmRlZiBDT05GSUdfU1lTX0ZMQVNIX0NGSQkJCQkvKiBOT1IgRmxhc2ggKi8KKworI2lmZGVmIENPTkZJR19GTEFTSF9BU1QyMzAwCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJCTB4MjAwMDAwMDAgCS8qIEZsYXNoIEJhbmsgIzEgKi8KKyNlbHNlCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJCTB4MTAwMDAwMDAgCS8qIEZsYXNoIEJhbmsgIzEgKi8KKyNlbmRpZgorCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfQkFTRQkJUEhZU19GTEFTSF8xCisjZGVmaW5lIENPTkZJR19GTEFTSF9CQU5LU19MSVNUIAl7IFBIWVNfRkxBU0hfMSB9CisKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1MgCTEKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfU0VDVAkoMjU2KQkJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwICovCisKKyNkZWZpbmUgQ09ORklHX0VOVl9JU19JTl9GTEFTSAkxCisjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUCQkweEZFMDAwMCAJLyogZW52aXJvbm1lbnQgc3RhcnRzIGhlcmUgICovCisjZGVmaW5lIENPTkZJR19FTlZfU0laRQkJCTB4MDIwMDAwIAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvciAqLworCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfQ0ZJX0FNRF9SRVNFVAorI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX1VTRV9CVUZGRVJfV1JJVEUKKworI2Vsc2UJCQkJCQkvKiBTUEkgRmxhc2ggKi8KKworI2lmZGVmIENPTkZJR19GTEFTSF9BU1QyMzAwCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJMHgyMDAwMDAwMCAJLyogRmxhc2ggQmFuayAjMSAqLworI2Vsc2UKKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkweDE0MDAwMDAwIAkvKiBGbGFzaCBCYW5rICMxICovCisjZGVmaW5lIFBIWVNfRkxBU0hfMgkJMHgxNDgwMDAwMCAJLyogRmxhc2ggQmFuayAjMiAqLworI2RlZmluZSBQSFlTX0ZMQVNIXzJfQkFTRQkweDEwMDAwMDAwCisjZW5kaWYKKworI2lmZGVmIENPTkZJR18yU1BJRkxBU0gKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9CQVNFCQlQSFlTX0ZMQVNIXzJfQkFTRQorI2RlZmluZSBDT05GSUdfRkxBU0hfQkFOS1NfTElTVCAJeyBQSFlTX0ZMQVNIXzEsIFBIWVNfRkxBU0hfMiB9CisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTIAkyCisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX1NFQ1QJKDEwMjQpCQkvKiBtYXggbnVtYmVyIG9mIHNlY3RvcnMgb24gb25lIGNoaXAgKi8KKworI2RlZmluZSBDT05GSUdfRU5WX0lTX0lOX0ZMQVNICQkxCisjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUCQkweDdGMDAwMCAJLyogZW52aXJvbm1lbnQgc3RhcnRzIGhlcmUgICovCisjZGVmaW5lIENPTkZJR19FTlZfU0laRQkJCTB4MDEwMDAwIAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvciAqLworI2Vsc2UKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9CQVNFCQlQSFlTX0ZMQVNIXzEKKyNkZWZpbmUgQ09ORklHX0ZMQVNIX0JBTktTX0xJU1QgCXsgUEhZU19GTEFTSF8xIH0KKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1MgCTEKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfU0VDVAkoMTAyNCkJCS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcCAqLworCisjZGVmaW5lIENPTkZJR19FTlZfSVNfSU5fRkxBU0gJCTEKKyNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVQJCTB4N0YwMDAwIAkvKiBlbnZpcm9ubWVudCBzdGFydHMgaGVyZSAgKi8KKyNkZWZpbmUgQ09ORklHX0VOVl9TSVpFCQkJMHgwMTAwMDAgCS8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yICovCisjZW5kaWYKKworI2VuZGlmCisKKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOCisKKyNkZWZpbmUgQ09ORklHX01PTklUT1JfQkFTRQkJVEVYVF9CQVNFCisjZGVmaW5lIENPTkZJR19NT05JVE9SX0xFTgkJKDE5MiA8PCAxMCkKKworLyogdGltZW91dCB2YWx1ZXMgYXJlIGluIHRpY2tzICovCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfRVJBU0VfVE9VVAkoMjAqQ09ORklHX1NZU19IWikgCS8qIFRpbWVvdXQgZm9yIEZsYXNoIEVyYXNlICovCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfV1JJVEVfVE9VVAkoMjAqQ09ORklHX1NZU19IWikgCS8qIFRpbWVvdXQgZm9yIEZsYXNoIFdyaXRlICovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KKworI2RlZmluZSBDT05GSUdfU1lTX1BST01QVAkJImJvb3QjICIgCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KKyNkZWZpbmUgQ09ORklHX1NZU19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNkZWZpbmUgQ09ORklHX1NZU19QQlNJWkUgKENPTkZJR19TWVNfQ0JTSVpFK3NpemVvZihDT05GSUdfU1lTX1BST01QVCkrMTYpIC8qIFByaW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENPTkZJR19TWVNfTUFYQVJHUwkJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENPTkZJR19TWVNfQkFSR1NJWkUJCUNPTkZJR19TWVNfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUJKi8KKworI2RlZmluZSBDT05GSUdfU1lTX01FTVRFU1RfU1RBUlQJMHg0MDAwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uCSovCisjZGVmaW5lIENPTkZJR19TWVNfTUVNVEVTVF9FTkQJCTB4NDRGRkZGRkYJLyogMjU2IE1CIGluIERSQU0JKi8KKworI2RlZmluZQlDT05GSUdfU1lTX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKyN1bmRlZglDT05GSUdfU1lTX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKworI2RlZmluZSBDT05GSUdfU1lTX0xPQURfQUREUgkJMHg0MzAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLworCisjZGVmaW5lIENPTkZJR19TWVNfVElNRVJCQVNFCQkweDFFNzgyMDAwCS8qIHVzZSB0aW1lciAxICovCisjZGVmaW5lIENPTkZJR19TWVNfSFoJCQkoMSoxMDAwKjEwMDApCS8qIHVzZSBleHRlcm5hbCBjbGsgKDFNKSAqLworCisvKgorICogU2VyaWFsIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTAKKyNkZWZpbmUgQ09ORklHX1NZU19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfUkVHX1NJWkUJNAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfQ0xLCQkyNDAwMDAwMAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfQ09NMQkJMHgxZTc4MzAwMAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfQ09NMgkJMHgxZTc4NDAwMAorI2RlZmluZQlDT05GSUdfU1lTX0xPQURTX0JBVURfQ0hBTkdFCisjZGVmaW5lIENPTkZJR19TRVJJQUwxCQkJMQorI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWAkJMgorI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCQkxMTUyMDAKKyNkZWZpbmUgQ09ORklHX1NZU19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CisKKy8qCisgKiBVU0IgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyAqLworLyoKKyNkZWZpbmUgQ09ORklHX1VTQl9ERVZJQ0UJCTEKKyNkZWZpbmUgQ09ORklHX1VTQl9UVFkJCQkxCisKKyNkZWZpbmUgQ09ORklHX1VTQkRfVkVORE9SSUQJCTB4MTIzNAorI2RlZmluZSBDT05GSUdfVVNCRF9QUk9EVUNUSUQJCTB4NTY3OAorI2RlZmluZSBDT05GSUdfVVNCRF9NQU5VRkFDVFVSRVIJIlNpZW1lbnMiCisjZGVmaW5lIENPTkZJR19VU0JEX1BST0RVQ1RfTkFNRQkiU1gxIgorKi8KKworLyoKKyAqIEkyQyBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX0hBUkRfSTJDCisjZGVmaW5lIENPTkZJR19TWVNfSTJDX1NQRUVECQkxMDAwMDAKKyNkZWZpbmUgQ09ORklHX1NZU19JMkNfU0xBVkUJCTEKKyNkZWZpbmUgQ09ORklHX0RSSVZFUl9BU1BFRURfSTJDCisKKy8qCisqIEVFUFJPTSBjb25maWd1cmF0aW9uCisqLworI2RlZmluZSBDT05GSUdfU1lTX0kyQ19FRVBST01fQUREUl9MRU4gCTIKKyNkZWZpbmUgQ09ORklHX1NZU19JMkNfRUVQUk9NX0FERFIgCTB4YTAKKworLyoKKyAqIE5JQyBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgX19CWVRFX09SREVSIF9fTElUVExFX0VORElBTgorI2RlZmluZSBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKKyNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KKyNkZWZpbmUgQ09ORklHX0FTUEVFRE5JQworI2RlZmluZSBDT05GSUdfTUFDMV9QSFlfTElOS19JTlRFUlJVUFQKKyNkZWZpbmUgQ09ORklHX01BQzJfRU5BQkxFCisjZGVmaW5lIENPTkZJR19NQUMyX1BIWV9MSU5LX0lOVEVSUlVQVAorLyoKKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIE5PVElDRTogTUFDMSBhbmQgTUFDMiBub3cgaGF2ZSB0aGVpciBvd24gc2VwZXJhdGUgUEhZIGNvbmZpZ3VyYXRpb24uCisqIFdlIHVzZSAyIGJpdHMgZm9yIGVhY2ggTUFDIGluIHRoZSBzY3JhdGNoIHJlZ2lzdGVyKERbMTU6MTFdIGluIDB4MUU2RTIwNDApIHRvCisqIGluZm9ybSBrZXJuZWwgZHJpdmVyLgorKiBUaGUgbWVhbmluZ3Mgb2YgdGhlIDIgYml0cyBhcmU6CisqIDAwKDApOiBEZWRpY2F0ZWQgUEhZCisqIDAxKDEpOiBBU1BFRUQncyBFVkEgKyBJTlRFTCdzIE5DLVNJIFBIWSBjaGlwIEVWQQorKiAxMCgyKTogQVNQRUVEJ3MgTUFDIGlzIGNvbm5lY3RlZCB0byBOQy1TSSBQSFkgY2hpcCBkaXJlY3RseQorKiAxMTogUmVzZXJ2ZWQKKyoKKyogV2UgdXNlIENPTkZJR19NQUMxX1BIWV9TRVRUSU5HIGFuZCBDT05GSUdfTUFDMl9QSFlfU0VUVElORyBpbiBVLUJvb3QKKyogMDogRGVkaWNhdGVkIFBIWQorKiAxOiBBU1BFRUQncyBFVkEgKyBJTlRFTCdzIE5DLVNJIFBIWSBjaGlwIEVWQQorKiAyOiBBU1BFRUQncyBNQUMgaXMgY29ubmVjdGVkIHRvIE5DLVNJIFBIWSBjaGlwIGRpcmVjdGx5CisqIDM6IFJlc2VydmVkCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKyNkZWZpbmUgQ09ORklHX01BQzFfUEhZX1NFVFRJTkcJCTAKKyNkZWZpbmUgQ09ORklHX01BQzJfUEhZX1NFVFRJTkcJCTAKKyNkZWZpbmUgQ09ORklHX01BQ19JTlRFUkZBQ0VfQ0xPQ0tfREVMQVkJMHgyMjU1CisjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkKKyNkZWZpbmUgQ09ORklHX0VUSEFDVAkJCWFzcGVlZG5pYyMwCisjZGVmaW5lIENPTkZJR19HQVRFV0FZSVAJCTE5Mi4xNjguMC4xCisjZGVmaW5lIENPTkZJR19ORVRNQVNLCQkJMjU1LjI1NS4yNTUuMAorI2RlZmluZSBDT05GSUdfSVBBRERSCQkJMTkyLjE2OC4wLjQ1CisjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJCTE5Mi4xNjguMC41MworI2RlZmluZSBDT05GSUdfRVRIQUREUgkJCTAwOkMwOkE4OjEyOjM0OjU2CisjZGVmaW5lIENPTkZJR19FVEgxQUREUgkJCTAwOkMwOkE4OjEyOjM0OjU3CisKKy8qCisgKiBTTFQKKyAqLworLyoKKyNkZWZpbmUgQ09ORklHX1NMVAorI2RlZmluZSBDRkdfQ01EX1NMVAkJKENGR19DTURfVklERU9URVNUIHwgQ0ZHX0NNRF9NQUNURVNUIHwgQ0ZHX0NNRF9IQUNURVNUIHwgQ0ZHX0NNRF9NSUNURVNUKQorKi8KKworI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9hc3QyNDAwX25vci5oIGIvaW5jbHVkZS9jb25maWdzL2FzdDI0MDBfbm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxMGIzNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29uZmlncy9hc3QyNDAwX25vci5oCkBAIC0wLDAgKzEsMzIyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBQZXRlciBDaGVuIDxwZXRlcmNAc29jbGUtdGVjaC5jb20udHc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKiAoZWFzeSB0byBjaGFuZ2UpCisgKi8KKy8vI2RlZmluZSBDT05GSUdfSU5JVF9DUklUSUNBTAkJCS8qIGRlZmluZSBmb3IgVS1CT09UIDEuMS4xICovCisjdW5kZWYgIENPTkZJR19JTklUX0NSSVRJQ0FMCQkJLyogdW5kZWYgZm9yICBVLUJPT1QgMS4xLjQgKi8gCisjZGVmaW5lIENPTkZJR19BUk05MjZFSlMJMQkJLyogVGhpcyBpcyBhbiBhcm05MjZlanMgQ1BVICovCisjZGVmaW5lCUNPTkZJR19BU1BFRUQJCTEKKyNkZWZpbmUgQ09ORklHX0FTVDI0MDAJCTEKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9DRkkJCQkvKiBDT05GSUdfRkxBU0hfQ0ZJLCBDT05GSUdfRkxBU0hfU1BJIGlzIGV4Y2x1c2l2ZSovCisvLyNkZWZpbmUgQ09ORklHX0ZMQVNIX1NQSQorLy8jZGVmaW5lIENPTkZJR18yU1BJRkxBU0gJCQkvKiBCb290IFNQSTogQ1MyLCAybmQgU1BJOiBDUzAgKi8KKyN1bmRlZiBDT05GSUdfMlNQSUZMQVNICisjdW5kZWYgQ09ORklHX0FTUEVFRF9TTFQKKyNkZWZpbmUgQ09ORklHX0ZMQVNIX0FTVDIzMDAKKyNkZWZpbmUgQ09ORklHX0ZMQVNIX0FTVDIzMDBfRE1BCisvLyNkZWZpbmUgQ09ORklHX0ZMQVNIX1NQSXgyX0R1bW15CisvLyNkZWZpbmUgQ09ORklHX0ZMQVNIX1NQSXg0X0R1bW15CisjZGVmaW5lIENPTkZJR19DUlRfRElTUExBWQkxCQkvKiB1bmRlZiBpZiBub3Qgc3VwcG9ydCBDUlQgKi8KKworLy8jZGVmaW5lIENPTkZJR19VU0VfSVJRCQkJCS8qIHdlIGRvbid0IG5lZWQgSVJRL0ZJUSBzdHVmZiAqLworI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX1IgCisKKy8qCisgKiBEUkFNIENvbmZpZworICoKKyAqIDEuIERSQU0gU2l6ZSAgICAgICAgICAgICAgLy8KKyAqICAgIENPTkZJR19EUkFNXzUxMk1CSVQgICAgLy8gNTEyTSBiaXQKKyAqICAgIENPTkZJR19EUkFNXzFHQklUICAgICAgLy8gMUcgICBiaXQgKGRlZmF1bHQpCisgKiAgICBDT05GSUdfRFJBTV8yR0JJVCAgICAgIC8vIDJHICAgYml0CisgKiAgICBDT05GSUdfRFJBTV80R0JJVCAgICAgIC8vIDRHICAgYml0IAorICogMi4gRFJBTSBTcGVlZCAgICAgICAgICAgICAvLworICogICAgQ09ORklHX0RSQU1fMzM2ICAgICAgICAvLyAzMzZNSHogKEREUi02NjcpCisgKiAgICBDT05GSUdfRFJBTV80MDggICAgICAgIC8vIDQwOE1IeiAoRERSLTgwMCkgKGRlZmF1bHQpCisgKiAzLiBWR0EgTW9kZQorICogICAgQ09ORklHX0NSVF9ESVNQTEFZICAgICAvLyBkZWZpbmUgdG8gZGlzYWJsZSBWR0EgZnVuY3Rpb24KKyAqIDQuIEVDQyBGdW5jdGlvbiBlbmFibGUKKyAqICAgIENPTkZJR19EUkFNX0VDQyAgICAgICAgLy8gZGVmaW5lIHRvIGVuYWJsZSBFQ0MgZnVuY3Rpb24KKyAqIDUuIFVBUlQgRGVidWcgTWVzc2FnZQorICogICAgQ09ORklHX0RSQU1fVUFSVF9PVVQgICAvLyBlbmFibGUgb3V0cHV0IG1lc3NhZ2UgYXQgVUFSVDUKKyAqICAgIENPTkZJR19EUkFNX1VBUlRfMzg0MDAgLy8gc2V0IHRoZSBVQVJUIGJhdWQgcmF0ZSB0byAzODQwMCwgZGVmYXVsdCBpcyAxMTUyMDAKKyAqLworIAorLy8xLiBEUkFNIFNpemUKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV81MTJNQklUCisjZGVmaW5lICAgIENPTkZJR19EUkFNXzFHQklUCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fMkdCSVQKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV80R0JJVAorLy8yLiBEUkFNIFNwZWVkCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fMzM2CisjZGVmaW5lICAgIENPTkZJR19EUkFNXzQwOAorLy8zLiBWR0EgTW9kZQorLy8jZGVmaW5lICAgIENPTkZJR19DUlRfRElTUExBWQorLy80LiBFQ0MgRnVuY3Rpb24gZW5hYmxlCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fRUNDCisvLzUuIFVBUlQgRGVidWcgTWVzc2FnZQorI2RlZmluZSAgICBDT05GSUdfRFJBTV9VQVJUX09VVAorLy8jZGVmaW5lICAgIENPTkZJR19EUkFNX1VBUlRfMzg0MDAKKworCisKKy8qIAorICogRW52aXJvbm1lbnQgQ29uZmlnCisgKi8KKyNkZWZpbmUgQ09ORklHX0NNRExJTkVfVEFHCSAxCQkvKiBlbmFibGUgcGFzc2luZyBvZiBBVEFHcwkqLworI2RlZmluZSBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MgMQorI2RlZmluZSBDT05GSUdfSU5JVFJEX1RBRwkgMQorI2RlZmluZQlDT05GSUdfQk9PVEFSR1MgCSJkZWJ1ZyBjb25zb2xlPXR0eVMwLDExNTIwMG44IHJhbWRpc2tfc2l6ZT0xNjM4NCByb290PS9kZXYvcmFtIHJ3IGluaXQ9L2xpbnV4cmMgbWVtPTgwTSIKKyNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQkzCQkvKiBhdXRvYm9vdCBhZnRlciAzIHNlY29uZHMJKi8KKyNpZmRlZiBDT05GSUdfRkxBU0hfQVNUMjMwMAorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIDIwMDgwMDAwIDIwMzAwMDAwIgorI2Vsc2UKKyNpZmRlZglDT05GSUdfU1lTX0ZMQVNIX0NGSSAKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSAxMDA4MDAwMCAxMDMwMDAwMCIKKyNlbHNlCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gMTQwODAwMDAgMTQzMDAwMDAiCisjZW5kaWYKKyNlbmRpZgorI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJCSJhbGwuYmluIgorI2RlZmluZSBDT05GSUdfRU5WX09WRVJXUklURQorCisvKgorICogQ29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNpbmNsdWRlIDxjb25maWdfY21kX2RlZmF1bHQuaD4KKworI2RlZmluZSBDT05GSUdfQ01EX0RGTAorI2RlZmluZSBDT05GSUdfQ01EX0VOVgorI2RlZmluZSBDT05GSUdfQ01EX0ZMQVNICisjZGVmaW5lIENPTkZJR19DTURfTkVUCisjZGVmaW5lIENPTkZJR19DTURfUElORworI2RlZmluZSBDT05GSUdfQ01EX0kyQworI2RlZmluZSBDT05GSUdfQ01EX0VFUFJPTQorCisvKiAKKyAqIENQVSBTZXR0aW5nCisgKi8KKyNkZWZpbmUgQ1BVX0NMT0NLX1JBVEUJCTE4MDAwMDAwCS8qIDE2LjUgTUh6IGNsb2NrIGZvciB0aGUgQVJNIGNvcmUgKi8KKworLyoKKyAqIFNpemUgb2YgbWFsbG9jKCkgcG9vbAorICovCisjZGVmaW5lIENPTkZJR19TWVNfTUFMTE9DX0xFTgkJKENPTkZJR19FTlZfU0laRSArIDc2OCoxMDI0KQorI2RlZmluZSBDT05GSUdfU1lTX0dCTF9EQVRBX1NJWkUJMTI4CS8qIHNpemUgaW4gYnl0ZXMgcmVzZXJ2ZWQgZm9yIGluaXRpYWwgZGF0YSAqLworCisvKgorICogU3RhY2sgc2l6ZXMsICBUaGUgc3RhY2sgc2l6ZXMgYXJlIHNldCB1cCBpbiBzdGFydC5TIHVzaW5nIHRoZSBzZXR0aW5ncyBiZWxvdworICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkUJKDEyOCoxMDI0KQkvKiByZWd1bGFyIHN0YWNrICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkVfSVJRCSg0KjEwMjQpCS8qIElSUSBzdGFjayAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFX0ZJUQkoNCoxMDI0KQkvKiBGSVEgc3RhY2sgKi8KKworLyoKKyAqIE1lbW9yeSBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX05SX0RSQU1fQkFOS1MJMQkgICAJLyogd2UgaGF2ZSAxIGJhbmsgb2YgRFJBTSAqLworI2RlZmluZSBQSFlTX1NEUkFNXzEJCTB4NDAwMDAwMDAgCS8qIFNEUkFNIEJhbmsgIzEgKi8KKyNkZWZpbmUgUEhZU19TRFJBTV8xX1NJWkUJMHg0MDAwMDAwIAkvKiA2NCBNQiAqLworCisjZGVmaW5lIENPTkZJR19TWVNfU0RSQU1fQkFTRQkweDQwMDAwMDAwCisKKy8qCisgKiBGTEFTSCBDb25maWd1cmF0aW9uCisgKi8KKyNpZmRlZiBDT05GSUdfU1lTX0ZMQVNIX0NGSQkJCQkvKiBOT1IgRmxhc2ggKi8KKworI2lmZGVmIENPTkZJR19GTEFTSF9BU1QyMzAwCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJCTB4MjAwMDAwMDAgCS8qIEZsYXNoIEJhbmsgIzEgKi8KKyNlbHNlCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJCTB4MTAwMDAwMDAgCS8qIEZsYXNoIEJhbmsgIzEgKi8KKyNlbmRpZgorCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfQkFTRQkJUEhZU19GTEFTSF8xCisjZGVmaW5lIENPTkZJR19GTEFTSF9CQU5LU19MSVNUIAl7IFBIWVNfRkxBU0hfMSB9CisKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1MgCTEKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfU0VDVAkoMjU2KQkJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwICovCisKKyNkZWZpbmUgQ09ORklHX0VOVl9JU19JTl9GTEFTSAkxCisjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUCQkJMHg2MDAwMCAJLyogZW52aXJvbm1lbnQgc3RhcnRzIGhlcmUgICovCisjZGVmaW5lIENPTkZJR19FTlZfU0laRQkJCTB4MjAwMDAgCS8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yICovCisKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9DRklfQU1EX1JFU0VUCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfVVNFX0JVRkZFUl9XUklURQorCisjZWxzZQkJCQkJCS8qIFNQSSBGbGFzaCAqLworCisjaWZkZWYgQ09ORklHX0ZMQVNIX0FTVDIzMDAKKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkweDIwMDAwMDAwIAkvKiBGbGFzaCBCYW5rICMxICovCisjZWxzZQorI2RlZmluZSBQSFlTX0ZMQVNIXzEJCTB4MTQwMDAwMDAgCS8qIEZsYXNoIEJhbmsgIzEgKi8KKyNkZWZpbmUgUEhZU19GTEFTSF8yCQkweDE0ODAwMDAwIAkvKiBGbGFzaCBCYW5rICMyICovCisjZGVmaW5lIFBIWVNfRkxBU0hfMl9CQVNFCTB4MTAwMDAwMDAKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHXzJTUElGTEFTSAorI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0JBU0UJCVBIWVNfRkxBU0hfMl9CQVNFCisjZGVmaW5lIENPTkZJR19GTEFTSF9CQU5LU19MSVNUIAl7IFBIWVNfRkxBU0hfMSwgUEhZU19GTEFTSF8yIH0KKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1MgCTIKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfU0VDVAkoMTAyNCkJCS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcCAqLworCisjZGVmaW5lIENPTkZJR19FTlZfSVNfSU5fRkxBU0gJCTEKKyNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVQJCTB4N0YwMDAwIAkvKiBlbnZpcm9ubWVudCBzdGFydHMgaGVyZSAgKi8KKyNkZWZpbmUgQ09ORklHX0VOVl9TSVpFCQkJMHgwMTAwMDAgCS8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yICovCisjZWxzZQorI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0JBU0UJCVBIWVNfRkxBU0hfMQorI2RlZmluZSBDT05GSUdfRkxBU0hfQkFOS1NfTElTVCAJeyBQSFlTX0ZMQVNIXzEgfQorI2RlZmluZSBDT05GSUdfU1lTX01BWF9GTEFTSF9CQU5LUyAJMQorI2RlZmluZSBDT05GSUdfU1lTX01BWF9GTEFTSF9TRUNUCSgxMDI0KQkJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwICovCisKKyNkZWZpbmUgQ09ORklHX0VOVl9JU19JTl9GTEFTSAkJMQorI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVAkJMHg3RjAwMDAgCS8qIGVudmlyb25tZW50IHN0YXJ0cyBoZXJlICAqLworI2RlZmluZSBDT05GSUdfRU5WX1NJWkUJCQkweDAxMDAwMCAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IgKi8KKyNlbmRpZgorCisjZW5kaWYKKworI2RlZmluZSBfX0xJVFRMRV9FTkRJQU4KKworI2RlZmluZSBDT05GSUdfTU9OSVRPUl9CQVNFCQlURVhUX0JBU0UKKyNkZWZpbmUgQ09ORklHX01PTklUT1JfTEVOCQkoMTkyIDw8IDEwKQorCisvKiB0aW1lb3V0IHZhbHVlcyBhcmUgaW4gdGlja3MgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9FUkFTRV9UT1VUCSgyMCpDT05GSUdfU1lTX0haKSAJLyogVGltZW91dCBmb3IgRmxhc2ggRXJhc2UgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9XUklURV9UT1VUCSgyMCpDT05GSUdfU1lTX0haKSAJLyogVGltZW91dCBmb3IgRmxhc2ggV3JpdGUgKi8KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfU1lTX0xPTkdIRUxQCQkJCS8qIHVuZGVmIHRvIHNhdmUgbWVtb3J5CQkqLworCisjZGVmaW5lIENPTkZJR19TWVNfUFJPTVBUCQkiYm9vdCMgIiAJLyogTW9uaXRvciBDb21tYW5kIFByb21wdAkqLworI2RlZmluZSBDT05GSUdfU1lTX0NCU0laRQkJMjU2CQkvKiBDb25zb2xlIEkvTyBCdWZmZXIgU2l6ZQkqLworI2RlZmluZSBDT05GSUdfU1lTX1BCU0laRSAoQ09ORklHX1NZU19DQlNJWkUrc2l6ZW9mKENPTkZJR19TWVNfUFJPTVBUKSsxNikgLyogUHJpbnQgQnVmZmVyIFNpemUgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19NQVhBUkdTCQkxNgkJLyogbWF4IG51bWJlciBvZiBjb21tYW5kIGFyZ3MJKi8KKyNkZWZpbmUgQ09ORklHX1NZU19CQVJHU0laRQkJQ09ORklHX1NZU19DQlNJWkUJLyogQm9vdCBBcmd1bWVudCBCdWZmZXIgU2l6ZQkqLworCisjZGVmaW5lIENPTkZJR19TWVNfTUVNVEVTVF9TVEFSVAkweDQwMDAwMDAwCS8qIG1lbXRlc3Qgd29ya3Mgb24JKi8KKyNkZWZpbmUgQ09ORklHX1NZU19NRU1URVNUX0VORAkJMHg0NEZGRkZGRgkvKiAyNTYgTUIgaW4gRFJBTQkqLworCisjZGVmaW5lCUNPTkZJR19TWVNfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworI3VuZGVmCUNPTkZJR19TWVNfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworCisjZGVmaW5lIENPTkZJR19TWVNfTE9BRF9BRERSCQkweDQzMDAwMDAwCS8qIGRlZmF1bHQgbG9hZCBhZGRyZXNzICovCisKKyNkZWZpbmUgQ09ORklHX1NZU19USU1FUkJBU0UJCTB4MUU3ODIwMDAJLyogdXNlIHRpbWVyIDEgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19IWgkJCSgxKjEwMDAqMTAwMCkJLyogdXNlIGV4dGVybmFsIGNsayAoMU0pICovCisKKy8qCisgKiBTZXJpYWwgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MF9SRUdfU0laRQk0CisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MF9DTEsJCTI0MDAwMDAwCisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MF9DT00xCQkweDFlNzgzMDAwCisjZGVmaW5lIENPTkZJR19TWVNfTlMxNjU1MF9DT00yCQkweDFlNzg0MDAwCisjZGVmaW5lCUNPTkZJR19TWVNfTE9BRFNfQkFVRF9DSEFOR0UKKyNkZWZpbmUgQ09ORklHX1NFUklBTDEJCQkxCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYCQkyCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkJCTExNTIwMAorI2RlZmluZSBDT05GSUdfU1lTX0JBVURSQVRFX1RBQkxFCXsgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwIH0KKworLyoKKyAqIFVTQiBkZXZpY2UgY29uZmlndXJhdGlvbgorICovCisvKgorI2RlZmluZSBDT05GSUdfVVNCX0RFVklDRQkJMQorI2RlZmluZSBDT05GSUdfVVNCX1RUWQkJCTEKKworI2RlZmluZSBDT05GSUdfVVNCRF9WRU5ET1JJRAkJMHgxMjM0CisjZGVmaW5lIENPTkZJR19VU0JEX1BST0RVQ1RJRAkJMHg1Njc4CisjZGVmaW5lIENPTkZJR19VU0JEX01BTlVGQUNUVVJFUgkiU2llbWVucyIKKyNkZWZpbmUgQ09ORklHX1VTQkRfUFJPRFVDVF9OQU1FCSJTWDEiCisqLworCisvKgorICogSTJDIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfSEFSRF9JMkMKKyNkZWZpbmUgQ09ORklHX1NZU19JMkNfU1BFRUQJCTEwMDAwMAorI2RlZmluZSBDT05GSUdfU1lTX0kyQ19TTEFWRQkJMQorI2RlZmluZSBDT05GSUdfRFJJVkVSX0FTUEVFRF9JMkMKKworLyoKKyogRUVQUk9NIGNvbmZpZ3VyYXRpb24KKyovCisjZGVmaW5lIENPTkZJR19TWVNfSTJDX0VFUFJPTV9BRERSX0xFTiAJMgorI2RlZmluZSBDT05GSUdfU1lTX0kyQ19FRVBST01fQUREUiAJMHhhMAorCisvKgorICogTklDIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBfX0JZVEVfT1JERVIgX19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIF9fTElUVExFX0VORElBTl9CSVRGSUVMRAorI2RlZmluZSBDT05GSUdfTUFDX1BBUlRJVElPTgorI2RlZmluZSBDT05GSUdfQVNQRUVETklDCisjZGVmaW5lIENPTkZJR19NQUMxX1BIWV9MSU5LX0lOVEVSUlVQVAorI2RlZmluZSBDT05GSUdfTUFDMl9FTkFCTEUKKyNkZWZpbmUgQ09ORklHX01BQzJfUEhZX0xJTktfSU5URVJSVVBUCisvKgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogTk9USUNFOiBNQUMxIGFuZCBNQUMyIG5vdyBoYXZlIHRoZWlyIG93biBzZXBlcmF0ZSBQSFkgY29uZmlndXJhdGlvbi4KKyogV2UgdXNlIDIgYml0cyBmb3IgZWFjaCBNQUMgaW4gdGhlIHNjcmF0Y2ggcmVnaXN0ZXIoRFsxNToxMV0gaW4gMHgxRTZFMjA0MCkgdG8KKyogaW5mb3JtIGtlcm5lbCBkcml2ZXIuCisqIFRoZSBtZWFuaW5ncyBvZiB0aGUgMiBiaXRzIGFyZToKKyogMDAoMCk6IERlZGljYXRlZCBQSFkKKyogMDEoMSk6IEFTUEVFRCdzIEVWQSArIElOVEVMJ3MgTkMtU0kgUEhZIGNoaXAgRVZBCisqIDEwKDIpOiBBU1BFRUQncyBNQUMgaXMgY29ubmVjdGVkIHRvIE5DLVNJIFBIWSBjaGlwIGRpcmVjdGx5CisqIDExOiBSZXNlcnZlZAorKgorKiBXZSB1c2UgQ09ORklHX01BQzFfUEhZX1NFVFRJTkcgYW5kIENPTkZJR19NQUMyX1BIWV9TRVRUSU5HIGluIFUtQm9vdAorKiAwOiBEZWRpY2F0ZWQgUEhZCisqIDE6IEFTUEVFRCdzIEVWQSArIElOVEVMJ3MgTkMtU0kgUEhZIGNoaXAgRVZBCisqIDI6IEFTUEVFRCdzIE1BQyBpcyBjb25uZWN0ZWQgdG8gTkMtU0kgUEhZIGNoaXAgZGlyZWN0bHkKKyogMzogUmVzZXJ2ZWQKKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2RlZmluZSBDT05GSUdfTUFDMV9QSFlfU0VUVElORwkJMAorI2RlZmluZSBDT05GSUdfTUFDMl9QSFlfU0VUVElORwkJMAorI2RlZmluZSBDT05GSUdfTUFDX0lOVEVSRkFDRV9DTE9DS19ERUxBWQkweDIyNTUKKyNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQorI2RlZmluZSBDT05GSUdfRVRIQUNUCQkJYXNwZWVkbmljIzAKKyNkZWZpbmUgQ09ORklHX0dBVEVXQVlJUAkJMTkyLjE2OC4wLjEKKyNkZWZpbmUgQ09ORklHX05FVE1BU0sJCQkyNTUuMjU1LjI1NS4wCisjZGVmaW5lIENPTkZJR19JUEFERFIJCQkxOTIuMTY4LjAuMTg4CisjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJCTE5Mi4xNjguMC4xMDYKKyNkZWZpbmUgQ09ORklHX0VUSEFERFIJCQkwMDpDMDpBODoxMjozNDo1NgorI2RlZmluZSBDT05GSUdfRVRIMUFERFIJCQkwMDpDMDpBODoxMjozNDo1NworCisvKgorICogU0xUCisgKi8KKy8qCisjZGVmaW5lIENPTkZJR19TTFQKKyNkZWZpbmUgQ0ZHX0NNRF9TTFQJCShDRkdfQ01EX1ZJREVPVEVTVCB8IENGR19DTURfTUFDVEVTVCB8IENGR19DTURfSEFDVEVTVCB8IENGR19DTURfTUlDVEVTVCkKKyovCisKKyNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYXN0MjQwMF9zbHQuaCBiL2luY2x1ZGUvY29uZmlncy9hc3QyNDAwX3NsdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYTFjMzEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvYXN0MjQwMF9zbHQuaApAQCAtMCwwICsxLDMyOSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogUGV0ZXIgQ2hlbiA8cGV0ZXJjQHNvY2xlLXRlY2guY29tLnR3PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICogKGVhc3kgdG8gY2hhbmdlKQorICovCisvLyNkZWZpbmUgQ09ORklHX0lOSVRfQ1JJVElDQUwJCQkvKiBkZWZpbmUgZm9yIFUtQk9PVCAxLjEuMSAqLworI3VuZGVmICBDT05GSUdfSU5JVF9DUklUSUNBTAkJCS8qIHVuZGVmIGZvciAgVS1CT09UIDEuMS40ICovIAorLy8jZGVmaW5lIENPTkZJR19GUEdBX0FTUEVFRAkxCisjZGVmaW5lIENPTkZJR19BUk05MjZFSlMJMQkJLyogVGhpcyBpcyBhbiBhcm05MjZlanMgQ1BVICovCisjZGVmaW5lCUNPTkZJR19BU1BFRUQJCTEKKyNkZWZpbmUgQ09ORklHX0FTVDI0MDAJCTEKKyNkZWZpbmUgQ09ORklHX1NMVF9BU1BFRUQJMQorLy8jZGVmaW5lIENPTkZJR19BU1QxMDcwCQkxCisvLyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9DRkkJCQkvKiBDT05GSUdfRkxBU0hfQ0ZJLCBDT05GSUdfRkxBU0hfU1BJIGlzIGV4Y2x1c2l2ZSovCisjZGVmaW5lIENPTkZJR19GTEFTSF9TUEkKKy8vI2RlZmluZSBDT05GSUdfMlNQSUZMQVNICQkJLyogQm9vdCBTUEk6IENTMiwgMm5kIFNQSTogQ1MwICovCisjdW5kZWYgQ09ORklHXzJTUElGTEFTSAorI3VuZGVmIENPTkZJR19BU1BFRURfU0xUCisjZGVmaW5lIENPTkZJR19GTEFTSF9BU1QyMzAwCisvLyNkZWZpbmUgQ09ORklHX0ZMQVNIX0FTVDIzMDBfRE1BCisvLyNkZWZpbmUgQ09ORklHX0ZMQVNIX1NQSXgyX0R1bW15CisvLyNkZWZpbmUgQ09ORklHX0ZMQVNIX1NQSXg0X0R1bW15CisjZGVmaW5lIENPTkZJR19DUlRfRElTUExBWQkxCQkvKiB1bmRlZiBpZiBub3Qgc3VwcG9ydCBDUlQgKi8KKworLy8jZGVmaW5lIENPTkZJR19VU0VfSVJRCQkJCS8qIHdlIGRvbid0IG5lZWQgSVJRL0ZJUSBzdHVmZiAqLworI2RlZmluZSBDT05GSUdfTUlTQ19JTklUX1IgCisKKy8qCisgKiBEUkFNIENvbmZpZworICoKKyAqIDEuIERSQU0gU2l6ZSAgICAgICAgICAgICAgLy8KKyAqICAgIENPTkZJR19EUkFNXzUxMk1CSVQgICAgLy8gNTEyTSBiaXQKKyAqICAgIENPTkZJR19EUkFNXzFHQklUICAgICAgLy8gMUcgICBiaXQgKGRlZmF1bHQpCisgKiAgICBDT05GSUdfRFJBTV8yR0JJVCAgICAgIC8vIDJHICAgYml0CisgKiAgICBDT05GSUdfRFJBTV80R0JJVCAgICAgIC8vIDRHICAgYml0IAorICogMi4gRFJBTSBTcGVlZCAgICAgICAgICAgICAvLworICogICAgQ09ORklHX0RSQU1fMzM2ICAgICAgICAvLyAzMzZNSHogKEREUi02NjcpCisgKiAgICBDT05GSUdfRFJBTV80MDggICAgICAgIC8vIDQwOE1IeiAoRERSLTgwMCkgKGRlZmF1bHQpCisgKiAzLiBWR0EgTW9kZQorICogICAgQ09ORklHX0NSVF9ESVNQTEFZICAgICAvLyBkZWZpbmUgdG8gZGlzYWJsZSBWR0EgZnVuY3Rpb24KKyAqIDQuIEVDQyBGdW5jdGlvbiBlbmFibGUKKyAqICAgIENPTkZJR19EUkFNX0VDQyAgICAgICAgLy8gZGVmaW5lIHRvIGVuYWJsZSBFQ0MgZnVuY3Rpb24KKyAqIDUuIFVBUlQgRGVidWcgTWVzc2FnZQorICogICAgQ09ORklHX0RSQU1fVUFSVF9PVVQgICAvLyBlbmFibGUgb3V0cHV0IG1lc3NhZ2UgYXQgVUFSVDUKKyAqICAgIENPTkZJR19EUkFNX1VBUlRfMzg0MDAgLy8gc2V0IHRoZSBVQVJUIGJhdWQgcmF0ZSB0byAzODQwMCwgZGVmYXVsdCBpcyAxMTUyMDAKKyAqLworIAorLy8xLiBEUkFNIFNpemUKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV81MTJNQklUCisjZGVmaW5lICAgIENPTkZJR19EUkFNXzFHQklUCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fMkdCSVQKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV80R0JJVAorLy8yLiBEUkFNIFNwZWVkCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fMzM2CisjZGVmaW5lICAgIENPTkZJR19EUkFNXzQwOAorLy8zLiBWR0EgTW9kZQorLy8jZGVmaW5lICAgIENPTkZJR19DUlRfRElTUExBWQorLy80LiBFQ0MgRnVuY3Rpb24gZW5hYmxlCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fRUNDCisvLzUuIFVBUlQgRGVidWcgTWVzc2FnZQorI2RlZmluZSAgICBDT05GSUdfRFJBTV9VQVJUX09VVAorLy8jZGVmaW5lICAgIENPTkZJR19EUkFNX1VBUlRfMzg0MDAKKworCisKKy8qIAorICogRW52aXJvbm1lbnQgQ29uZmlnCisgKi8KKyNkZWZpbmUgQ09ORklHX0NNRExJTkVfVEFHCSAxCQkvKiBlbmFibGUgcGFzc2luZyBvZiBBVEFHcwkqLworI2RlZmluZSBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MgMQorI2RlZmluZSBDT05GSUdfSU5JVFJEX1RBRwkgMQorI2RlZmluZQlDT05GSUdfQk9PVEFSR1MgCSJkZWJ1ZyBjb25zb2xlPXR0eVMwLDExNTIwMG44IHJhbWRpc2tfc2l6ZT0xNjM4NCByb290PS9kZXYvcmFtIHJ3IGluaXQ9L2xpbnV4cmMgbWVtPTMyTSIKKyNkZWZpbmUgQ09ORklHX1VQREFURSAgICAgICAgICAgInRmdHAgNDA4MDAwMDAgYXN0MjQwMC5zY3I7IHNvIDQwODAwMDAwJyIKKworI2RlZmluZSBDT05GSUdfQk9PVERFTEFZCTAJCS8qIGF1dG9ib290IGFmdGVyIDMgc2Vjb25kcwkqLworI2lmZGVmIENPTkZJR19GTEFTSF9BU1QyMzAwCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkibWFjdGVzdCAwIDAgMjQgMiAwIDAgMDsgbWFjdGVzdCAxIDAgMjQgMiAwIDAgMDsgYm9vdG0gMjAwODAwMDAgMjAzMDAwMDAiCisjZWxzZQorI2lmZGVmCUNPTkZJR19TWVNfRkxBU0hfQ0ZJIAorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIDEwMDgwMDAwIDEwMzAwMDAwIgorI2Vsc2UKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSAxNDA4MDAwMCAxNDMwMDAwMCIKKyNlbmRpZgorI2VuZGlmCisjZGVmaW5lIENPTkZJR19CT09URklMRQkJImFsbC5iaW4iCisjZGVmaW5lIENPTkZJR19FTlZfT1ZFUldSSVRFCisKKy8qCisgKiBDb21tYW5kIGxpbmUgY29uZmlndXJhdGlvbi4KKyAqLworI2luY2x1ZGUgPGNvbmZpZ19jbWRfZGVmYXVsdC5oPgorCisjZGVmaW5lIENPTkZJR19DTURfREZMCisjZGVmaW5lIENPTkZJR19DTURfRU5WCisjZGVmaW5lIENPTkZJR19DTURfRkxBU0gKKyNkZWZpbmUgQ09ORklHX0NNRF9ORVQKKyNkZWZpbmUgQ09ORklHX0NNRF9QSU5HCisjZGVmaW5lIENPTkZJR19DTURfSTJDCisjZGVmaW5lIENPTkZJR19DTURfRUVQUk9NCisjZGVmaW5lIENPTkZJR19DTURfTkVUVEVTVAorI2RlZmluZSBDT05GSUdfQ01EX1NMVAorCisvKiAKKyAqIENQVSBTZXR0aW5nCisgKi8KKyNkZWZpbmUgQ1BVX0NMT0NLX1JBVEUJCTE4MDAwMDAwCS8qIDE2LjUgTUh6IGNsb2NrIGZvciB0aGUgQVJNIGNvcmUgKi8KKworLyoKKyAqIFNpemUgb2YgbWFsbG9jKCkgcG9vbAorICovCisjZGVmaW5lIENPTkZJR19TWVNfTUFMTE9DX0xFTgkJKENPTkZJR19FTlZfU0laRSArIDc2OCoxMDI0KQorI2RlZmluZSBDT05GSUdfU1lTX0dCTF9EQVRBX1NJWkUJMTI4CS8qIHNpemUgaW4gYnl0ZXMgcmVzZXJ2ZWQgZm9yIGluaXRpYWwgZGF0YSAqLworCisvKgorICogU3RhY2sgc2l6ZXMsICBUaGUgc3RhY2sgc2l6ZXMgYXJlIHNldCB1cCBpbiBzdGFydC5TIHVzaW5nIHRoZSBzZXR0aW5ncyBiZWxvdworICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkUJKDEyOCoxMDI0KQkvKiByZWd1bGFyIHN0YWNrICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkVfSVJRCSg0KjEwMjQpCS8qIElSUSBzdGFjayAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFX0ZJUQkoNCoxMDI0KQkvKiBGSVEgc3RhY2sgKi8KKworLyoKKyAqIE1lbW9yeSBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX05SX0RSQU1fQkFOS1MJMQkgICAJLyogd2UgaGF2ZSAxIGJhbmsgb2YgRFJBTSAqLworI2RlZmluZSBQSFlTX1NEUkFNXzEJCTB4NDAwMDAwMDAgCS8qIFNEUkFNIEJhbmsgIzEgKi8KKyNkZWZpbmUgUEhZU19TRFJBTV8xX1NJWkUJMHg0MDAwMDAwIAkvKiA2NCBNQiAqLworCisjZGVmaW5lIENPTkZJR19TWVNfU0RSQU1fQkFTRQkweDQwMDAwMDAwCisKKy8qCisgKiBGTEFTSCBDb25maWd1cmF0aW9uCisgKi8KKyNpZmRlZiBDT05GSUdfU1lTX0ZMQVNIX0NGSQkJCQkvKiBOT1IgRmxhc2ggKi8KKworI2lmZGVmIENPTkZJR19GTEFTSF9BU1QyMzAwCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJCTB4MjAwMDAwMDAgCS8qIEZsYXNoIEJhbmsgIzEgKi8KKyNlbHNlCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJCTB4MTAwMDAwMDAgCS8qIEZsYXNoIEJhbmsgIzEgKi8KKyNlbmRpZgorCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfQkFTRQkJUEhZU19GTEFTSF8xCisjZGVmaW5lIENPTkZJR19GTEFTSF9CQU5LU19MSVNUIAl7IFBIWVNfRkxBU0hfMSB9CisKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1MgCTEKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfU0VDVAkoMjU2KQkJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwICovCisKKyNkZWZpbmUgQ09ORklHX0VOVl9JU19JTl9GTEFTSAkxCisjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUCQkweEZFMDAwMCAJLyogZW52aXJvbm1lbnQgc3RhcnRzIGhlcmUgICovCisjZGVmaW5lIENPTkZJR19FTlZfU0laRQkJCTB4MDIwMDAwIAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvciAqLworCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfQ0ZJX0FNRF9SRVNFVAorI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX1VTRV9CVUZGRVJfV1JJVEUKKworI2Vsc2UJCQkJCQkvKiBTUEkgRmxhc2ggKi8KKworI2lmZGVmIENPTkZJR19GTEFTSF9BU1QyMzAwCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJMHgyMDAwMDAwMCAJLyogRmxhc2ggQmFuayAjMSAqLworI2Vsc2UKKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkweDE0MDAwMDAwIAkvKiBGbGFzaCBCYW5rICMxICovCisjZGVmaW5lIFBIWVNfRkxBU0hfMgkJMHgxNDgwMDAwMCAJLyogRmxhc2ggQmFuayAjMiAqLworI2RlZmluZSBQSFlTX0ZMQVNIXzJfQkFTRQkweDEwMDAwMDAwCisjZW5kaWYKKworI2lmZGVmIENPTkZJR18yU1BJRkxBU0gKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9CQVNFCQlQSFlTX0ZMQVNIXzJfQkFTRQorI2RlZmluZSBDT05GSUdfRkxBU0hfQkFOS1NfTElTVCAJeyBQSFlTX0ZMQVNIXzEsIFBIWVNfRkxBU0hfMiB9CisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTIAkyCisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX1NFQ1QJKDEwMjQpCQkvKiBtYXggbnVtYmVyIG9mIHNlY3RvcnMgb24gb25lIGNoaXAgKi8KKworI2RlZmluZSBDT05GSUdfRU5WX0lTX0lOX0ZMQVNICQkxCisjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUCQkweDdGMDAwMCAJLyogZW52aXJvbm1lbnQgc3RhcnRzIGhlcmUgICovCisjZGVmaW5lIENPTkZJR19FTlZfU0laRQkJCTB4MDEwMDAwIAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvciAqLworI2Vsc2UKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9CQVNFCQlQSFlTX0ZMQVNIXzEKKyNkZWZpbmUgQ09ORklHX0ZMQVNIX0JBTktTX0xJU1QgCXsgUEhZU19GTEFTSF8xIH0KKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1MgCTEKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfU0VDVAkoMTAyNCkJCS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcCAqLworCisjZGVmaW5lIENPTkZJR19FTlZfSVNfSU5fRkxBU0gJCTEKKyNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVQJCTB4N0YwMDAwIAkvKiBlbnZpcm9ubWVudCBzdGFydHMgaGVyZSAgKi8KKyNkZWZpbmUgQ09ORklHX0VOVl9TSVpFCQkJMHgwMTAwMDAgCS8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yICovCisjZW5kaWYKKworI2VuZGlmCisKKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOCisKKyNkZWZpbmUgQ09ORklHX01PTklUT1JfQkFTRQkJVEVYVF9CQVNFCisjZGVmaW5lIENPTkZJR19NT05JVE9SX0xFTgkJKDE5MiA8PCAxMCkKKworLyogdGltZW91dCB2YWx1ZXMgYXJlIGluIHRpY2tzICovCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfRVJBU0VfVE9VVAkoMjAqQ09ORklHX1NZU19IWikgCS8qIFRpbWVvdXQgZm9yIEZsYXNoIEVyYXNlICovCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfV1JJVEVfVE9VVAkoMjAqQ09ORklHX1NZU19IWikgCS8qIFRpbWVvdXQgZm9yIEZsYXNoIFdyaXRlICovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KKworI2RlZmluZSBDT05GSUdfU1lTX1BST01QVAkJImJvb3QjICIgCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KKyNkZWZpbmUgQ09ORklHX1NZU19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNkZWZpbmUgQ09ORklHX1NZU19QQlNJWkUgKENPTkZJR19TWVNfQ0JTSVpFK3NpemVvZihDT05GSUdfU1lTX1BST01QVCkrMTYpIC8qIFByaW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENPTkZJR19TWVNfTUFYQVJHUwkJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENPTkZJR19TWVNfQkFSR1NJWkUJCUNPTkZJR19TWVNfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUJKi8KKworI2RlZmluZSBDT05GSUdfU1lTX01FTVRFU1RfU1RBUlQJMHg0MDAwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uCSovCisjZGVmaW5lIENPTkZJR19TWVNfTUVNVEVTVF9FTkQJCTB4NDRGRkZGRkYJLyogMjU2IE1CIGluIERSQU0JKi8KKworI2RlZmluZQlDT05GSUdfU1lTX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKyN1bmRlZglDT05GSUdfU1lTX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKworI2RlZmluZSBDT05GSUdfU1lTX0xPQURfQUREUgkJMHg0MzAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLworCisjZGVmaW5lIENPTkZJR19TWVNfVElNRVJCQVNFCQkweDFFNzgyMDAwCS8qIHVzZSB0aW1lciAxICovCisjZGVmaW5lIENPTkZJR19TWVNfSFoJCQkoMSoxMDAwKjEwMDApCS8qIHVzZSBleHRlcm5hbCBjbGsgKDFNKSAqLworCisvKgorICogU2VyaWFsIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTAKKyNkZWZpbmUgQ09ORklHX1NZU19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfUkVHX1NJWkUJNAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfQ0xLCQkyNDAwMDAwMAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfQ09NMQkJMHgxZTc4MzAwMAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfQ09NMgkJMHgxZTc4NDAwMAorI2RlZmluZQlDT05GSUdfU1lTX0xPQURTX0JBVURfQ0hBTkdFCisjZGVmaW5lIENPTkZJR19TRVJJQUwxCQkJMQorI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWAkJMgorI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCQkxMTUyMDAKKyNkZWZpbmUgQ09ORklHX1NZU19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CisKKy8qCisgKiBVU0IgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyAqLworLyoKKyNkZWZpbmUgQ09ORklHX1VTQl9ERVZJQ0UJCTEKKyNkZWZpbmUgQ09ORklHX1VTQl9UVFkJCQkxCisKKyNkZWZpbmUgQ09ORklHX1VTQkRfVkVORE9SSUQJCTB4MTIzNAorI2RlZmluZSBDT05GSUdfVVNCRF9QUk9EVUNUSUQJCTB4NTY3OAorI2RlZmluZSBDT05GSUdfVVNCRF9NQU5VRkFDVFVSRVIJIlNpZW1lbnMiCisjZGVmaW5lIENPTkZJR19VU0JEX1BST0RVQ1RfTkFNRQkiU1gxIgorKi8KKworLyoKKyAqIEkyQyBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX0hBUkRfSTJDCisjZGVmaW5lIENPTkZJR19TWVNfSTJDX1NQRUVECQkxMDAwMDAKKyNkZWZpbmUgQ09ORklHX1NZU19JMkNfU0xBVkUJCTEKKyNkZWZpbmUgQ09ORklHX0RSSVZFUl9BU1BFRURfSTJDCisKKy8qCisqIEVFUFJPTSBjb25maWd1cmF0aW9uCisqLworI2RlZmluZSBDT05GSUdfU1lTX0kyQ19FRVBST01fQUREUl9MRU4gCTIKKyNkZWZpbmUgQ09ORklHX1NZU19JMkNfRUVQUk9NX0FERFIgCTB4YTAKKworLyoKKyAqIE5JQyBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgX19CWVRFX09SREVSIF9fTElUVExFX0VORElBTgorI2RlZmluZSBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKKyNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KKy8qI2RlZmluZSBDT05GSUdfQVNQRUVETklDKi8KKyNkZWZpbmUgQ09ORklHX01BQzFfUEhZX0xJTktfSU5URVJSVVBUCisjZGVmaW5lIENPTkZJR19NQUMyX0VOQUJMRQorI2RlZmluZSBDT05GSUdfTUFDMl9QSFlfTElOS19JTlRFUlJVUFQKKy8qCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiBOT1RJQ0U6IE1BQzEgYW5kIE1BQzIgbm93IGhhdmUgdGhlaXIgb3duIHNlcGVyYXRlIFBIWSBjb25maWd1cmF0aW9uLgorKiBXZSB1c2UgMiBiaXRzIGZvciBlYWNoIE1BQyBpbiB0aGUgc2NyYXRjaCByZWdpc3RlcihEWzE1OjExXSBpbiAweDFFNkUyMDQwKSB0bworKiBpbmZvcm0ga2VybmVsIGRyaXZlci4KKyogVGhlIG1lYW5pbmdzIG9mIHRoZSAyIGJpdHMgYXJlOgorKiAwMCgwKTogRGVkaWNhdGVkIFBIWQorKiAwMSgxKTogQVNQRUVEJ3MgRVZBICsgSU5URUwncyBOQy1TSSBQSFkgY2hpcCBFVkEKKyogMTAoMik6IEFTUEVFRCdzIE1BQyBpcyBjb25uZWN0ZWQgdG8gTkMtU0kgUEhZIGNoaXAgZGlyZWN0bHkKKyogMTE6IFJlc2VydmVkCisqCisqIFdlIHVzZSBDT05GSUdfTUFDMV9QSFlfU0VUVElORyBhbmQgQ09ORklHX01BQzJfUEhZX1NFVFRJTkcgaW4gVS1Cb290CisqIDA6IERlZGljYXRlZCBQSFkKKyogMTogQVNQRUVEJ3MgRVZBICsgSU5URUwncyBOQy1TSSBQSFkgY2hpcCBFVkEKKyogMjogQVNQRUVEJ3MgTUFDIGlzIGNvbm5lY3RlZCB0byBOQy1TSSBQSFkgY2hpcCBkaXJlY3RseQorKiAzOiBSZXNlcnZlZAorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisjZGVmaW5lIENPTkZJR19NQUMxX1BIWV9TRVRUSU5HCQkwCisjZGVmaW5lIENPTkZJR19NQUMyX1BIWV9TRVRUSU5HCQkwCisjZGVmaW5lIENPTkZJR19NQUNfSU5URVJGQUNFX0NMT0NLX0RFTEFZCTB4MjI1NQorI2RlZmluZSBDT05GSUdfTkVUX01VTFRJCisjZGVmaW5lIENPTkZJR19FVEhBQ1QJCQlhc3BlZWRuaWMjMAorI2RlZmluZSBDT05GSUdfR0FURVdBWUlQCQkxOTIuMTY4LjAuMQorI2RlZmluZSBDT05GSUdfTkVUTUFTSwkJCTI1NS4yNTUuMjU1LjAKKyNkZWZpbmUgQ09ORklHX0lQQUREUgkJCTE5Mi4xNjguMC40NQorI2RlZmluZSBDT05GSUdfU0VSVkVSSVAJCQkxOTIuMTY4LjAuODEKKyNkZWZpbmUgQ09ORklHX0VUSEFERFIJCQkwMDpDMDpBODoxMjozNDo1NgorI2RlZmluZSBDT05GSUdfRVRIMUFERFIJCQkwMDpDMDpBODoxMjozNDo1NworCisvKgorICogU0xUCisgKi8KKy8qCisjZGVmaW5lIENPTkZJR19TTFQKKyNkZWZpbmUgQ0ZHX0NNRF9TTFQJCShDRkdfQ01EX1ZJREVPVEVTVCB8IENGR19DTURfTUFDVEVTVCB8IENGR19DTURfSEFDVEVTVCB8IENGR19DTURfTUlDVEVTVCkKKyovCisKKyNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvYXN0MjQwMF9zcGkuaCBiL2luY2x1ZGUvY29uZmlncy9hc3QyNDAwX3NwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OGUxNjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvYXN0MjQwMF9zcGkuaApAQCAtMCwwICsxLDMyMiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogUGV0ZXIgQ2hlbiA8cGV0ZXJjQHNvY2xlLXRlY2guY29tLnR3PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICogKGVhc3kgdG8gY2hhbmdlKQorICovCisvLyNkZWZpbmUgQ09ORklHX0lOSVRfQ1JJVElDQUwJCQkvKiBkZWZpbmUgZm9yIFUtQk9PVCAxLjEuMSAqLworI3VuZGVmICBDT05GSUdfSU5JVF9DUklUSUNBTAkJCS8qIHVuZGVmIGZvciAgVS1CT09UIDEuMS40ICovIAorI2RlZmluZSBDT05GSUdfQVJNOTI2RUpTCTEJCS8qIFRoaXMgaXMgYW4gYXJtOTI2ZWpzIENQVSAqLworI2RlZmluZQlDT05GSUdfQVNQRUVECQkxCisjZGVmaW5lIENPTkZJR19BU1QyNDAwCQkxCisvLyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9DRkkJCQkvKiBDT05GSUdfRkxBU0hfQ0ZJLCBDT05GSUdfRkxBU0hfU1BJIGlzIGV4Y2x1c2l2ZSovCisjZGVmaW5lIENPTkZJR19GTEFTSF9TUEkKKy8vI2RlZmluZSBDT05GSUdfMlNQSUZMQVNICQkJLyogQm9vdCBTUEk6IENTMiwgMm5kIFNQSTogQ1MwICovCisjdW5kZWYgQ09ORklHXzJTUElGTEFTSAorI3VuZGVmIENPTkZJR19BU1BFRURfU0xUCisjZGVmaW5lIENPTkZJR19GTEFTSF9BU1QyMzAwCisjZGVmaW5lIENPTkZJR19GTEFTSF9BU1QyMzAwX0RNQQorLy8jZGVmaW5lIENPTkZJR19GTEFTSF9TUEl4Ml9EdW1teQorLy8jZGVmaW5lIENPTkZJR19GTEFTSF9TUEl4NF9EdW1teQorI2RlZmluZSBDT05GSUdfQ1JUX0RJU1BMQVkJMQkJLyogdW5kZWYgaWYgbm90IHN1cHBvcnQgQ1JUICovCisKKy8vI2RlZmluZSBDT05GSUdfVVNFX0lSUQkJCQkvKiB3ZSBkb24ndCBuZWVkIElSUS9GSVEgc3R1ZmYgKi8KKyNkZWZpbmUgQ09ORklHX01JU0NfSU5JVF9SIAorCisvKgorICogRFJBTSBDb25maWcKKyAqCisgKiAxLiBEUkFNIFNpemUgICAgICAgICAgICAgIC8vCisgKiAgICBDT05GSUdfRFJBTV81MTJNQklUICAgIC8vIDUxMk0gYml0CisgKiAgICBDT05GSUdfRFJBTV8xR0JJVCAgICAgIC8vIDFHICAgYml0IChkZWZhdWx0KQorICogICAgQ09ORklHX0RSQU1fMkdCSVQgICAgICAvLyAyRyAgIGJpdAorICogICAgQ09ORklHX0RSQU1fNEdCSVQgICAgICAvLyA0RyAgIGJpdCAKKyAqIDIuIERSQU0gU3BlZWQgICAgICAgICAgICAgLy8KKyAqICAgIENPTkZJR19EUkFNXzMzNiAgICAgICAgLy8gMzM2TUh6IChERFItNjY3KQorICogICAgQ09ORklHX0RSQU1fNDA4ICAgICAgICAvLyA0MDhNSHogKEREUi04MDApIChkZWZhdWx0KQorICogMy4gVkdBIE1vZGUKKyAqICAgIENPTkZJR19DUlRfRElTUExBWSAgICAgLy8gZGVmaW5lIHRvIGRpc2FibGUgVkdBIGZ1bmN0aW9uCisgKiA0LiBFQ0MgRnVuY3Rpb24gZW5hYmxlCisgKiAgICBDT05GSUdfRFJBTV9FQ0MgICAgICAgIC8vIGRlZmluZSB0byBlbmFibGUgRUNDIGZ1bmN0aW9uCisgKiA1LiBVQVJUIERlYnVnIE1lc3NhZ2UKKyAqICAgIENPTkZJR19EUkFNX1VBUlRfT1VUICAgLy8gZW5hYmxlIG91dHB1dCBtZXNzYWdlIGF0IFVBUlQ1CisgKiAgICBDT05GSUdfRFJBTV9VQVJUXzM4NDAwIC8vIHNldCB0aGUgVUFSVCBiYXVkIHJhdGUgdG8gMzg0MDAsIGRlZmF1bHQgaXMgMTE1MjAwCisgKi8KKyAKKy8vMS4gRFJBTSBTaXplCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fNTEyTUJJVAorI2RlZmluZSAgICBDT05GSUdfRFJBTV8xR0JJVAorLy8jZGVmaW5lICAgIENPTkZJR19EUkFNXzJHQklUCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fNEdCSVQKKy8vMi4gRFJBTSBTcGVlZAorLy8jZGVmaW5lICAgIENPTkZJR19EUkFNXzMzNgorI2RlZmluZSAgICBDT05GSUdfRFJBTV80MDgKKy8vMy4gVkdBIE1vZGUKKy8vI2RlZmluZSAgICBDT05GSUdfQ1JUX0RJU1BMQVkKKy8vNC4gRUNDIEZ1bmN0aW9uIGVuYWJsZQorLy8jZGVmaW5lICAgIENPTkZJR19EUkFNX0VDQworLy81LiBVQVJUIERlYnVnIE1lc3NhZ2UKKyNkZWZpbmUgICAgQ09ORklHX0RSQU1fVUFSVF9PVVQKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV9VQVJUXzM4NDAwCisKKworCisvKiAKKyAqIEVudmlyb25tZW50IENvbmZpZworICovCisjZGVmaW5lIENPTkZJR19DTURMSU5FX1RBRwkgMQkJLyogZW5hYmxlIHBhc3Npbmcgb2YgQVRBR3MJKi8KKyNkZWZpbmUgQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTIDEKKyNkZWZpbmUgQ09ORklHX0lOSVRSRF9UQUcJIDEKKyNkZWZpbmUJQ09ORklHX0JPT1RBUkdTIAkiZGVidWcgY29uc29sZT10dHlTMCwxMTUyMDBuOCByYW1kaXNrX3NpemU9MTYzODQgcm9vdD0vZGV2L3JhbSBydyBpbml0PS9saW51eHJjIG1lbT04ME0iCisjZGVmaW5lIENPTkZJR19CT09UREVMQVkJMwkJLyogYXV0b2Jvb3QgYWZ0ZXIgMyBzZWNvbmRzCSovCisjaWZkZWYgQ09ORklHX0ZMQVNIX0FTVDIzMDAKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSAyMDA4MDAwMCAyMDMwMDAwMCIKKyNlbHNlCisjaWZkZWYJQ09ORklHX1NZU19GTEFTSF9DRkkgCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gMTAwODAwMDAgMTAzMDAwMDAiCisjZWxzZQorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIDE0MDgwMDAwIDE0MzAwMDAwIgorI2VuZGlmCisjZW5kaWYKKyNkZWZpbmUgQ09ORklHX0JPT1RGSUxFCQkiYWxsLmJpbiIKKyNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ERkwKKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKworLyogCisgKiBDUFUgU2V0dGluZworICovCisjZGVmaW5lIENQVV9DTE9DS19SQVRFCQkxODAwMDAwMAkvKiAxNi41IE1IeiBjbG9jayBmb3IgdGhlIEFSTSBjb3JlICovCisKKy8qCisgKiBTaXplIG9mIG1hbGxvYygpIHBvb2wKKyAqLworI2RlZmluZSBDT05GSUdfU1lTX01BTExPQ19MRU4JCShDT05GSUdfRU5WX1NJWkUgKyA3NjgqMTAyNCkKKyNkZWZpbmUgQ09ORklHX1NZU19HQkxfREFUQV9TSVpFCTEyOAkvKiBzaXplIGluIGJ5dGVzIHJlc2VydmVkIGZvciBpbml0aWFsIGRhdGEgKi8KKworLyoKKyAqIFN0YWNrIHNpemVzLCAgVGhlIHN0YWNrIHNpemVzIGFyZSBzZXQgdXAgaW4gc3RhcnQuUyB1c2luZyB0aGUgc2V0dGluZ3MgYmVsb3cKKyAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFCSgxMjgqMTAyNCkJLyogcmVndWxhciBzdGFjayAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFX0lSUQkoNCoxMDI0KQkvKiBJUlEgc3RhY2sgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRV9GSVEJKDQqMTAyNCkJLyogRklRIHN0YWNrICovCisKKy8qCisgKiBNZW1vcnkgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19OUl9EUkFNX0JBTktTCTEJICAgCS8qIHdlIGhhdmUgMSBiYW5rIG9mIERSQU0gKi8KKyNkZWZpbmUgUEhZU19TRFJBTV8xCQkweDQwMDAwMDAwIAkvKiBTRFJBTSBCYW5rICMxICovCisjZGVmaW5lIFBIWVNfU0RSQU1fMV9TSVpFCTB4NDAwMDAwMCAJLyogNjQgTUIgKi8KKworI2RlZmluZSBDT05GSUdfU1lTX1NEUkFNX0JBU0UJMHg0MDAwMDAwMAorCisvKgorICogRkxBU0ggQ29uZmlndXJhdGlvbgorICovCisjaWZkZWYgQ09ORklHX1NZU19GTEFTSF9DRkkJCQkJLyogTk9SIEZsYXNoICovCisKKyNpZmRlZiBDT05GSUdfRkxBU0hfQVNUMjMwMAorI2RlZmluZSBQSFlTX0ZMQVNIXzEJCQkweDIwMDAwMDAwIAkvKiBGbGFzaCBCYW5rICMxICovCisjZWxzZQorI2RlZmluZSBQSFlTX0ZMQVNIXzEJCQkweDEwMDAwMDAwIAkvKiBGbGFzaCBCYW5rICMxICovCisjZW5kaWYKKworI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0JBU0UJCVBIWVNfRkxBU0hfMQorI2RlZmluZSBDT05GSUdfRkxBU0hfQkFOS1NfTElTVCAJeyBQSFlTX0ZMQVNIXzEgfQorCisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTIAkxCisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX1NFQ1QJKDI1NikJCS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcCAqLworCisjZGVmaW5lIENPTkZJR19FTlZfSVNfSU5fRkxBU0gJMQorI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVAkJCTB4NjAwMDAgCS8qIGVudmlyb25tZW50IHN0YXJ0cyBoZXJlICAqLworI2RlZmluZSBDT05GSUdfRU5WX1NJWkUJCQkweDIwMDAwIAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvciAqLworCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfQ0ZJX0FNRF9SRVNFVAorI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX1VTRV9CVUZGRVJfV1JJVEUKKworI2Vsc2UJCQkJCQkvKiBTUEkgRmxhc2ggKi8KKworI2lmZGVmIENPTkZJR19GTEFTSF9BU1QyMzAwCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJMHgyMDAwMDAwMCAJLyogRmxhc2ggQmFuayAjMSAqLworI2Vsc2UKKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkweDE0MDAwMDAwIAkvKiBGbGFzaCBCYW5rICMxICovCisjZGVmaW5lIFBIWVNfRkxBU0hfMgkJMHgxNDgwMDAwMCAJLyogRmxhc2ggQmFuayAjMiAqLworI2RlZmluZSBQSFlTX0ZMQVNIXzJfQkFTRQkweDEwMDAwMDAwCisjZW5kaWYKKworI2lmZGVmIENPTkZJR18yU1BJRkxBU0gKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9CQVNFCQlQSFlTX0ZMQVNIXzJfQkFTRQorI2RlZmluZSBDT05GSUdfRkxBU0hfQkFOS1NfTElTVCAJeyBQSFlTX0ZMQVNIXzEsIFBIWVNfRkxBU0hfMiB9CisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTIAkyCisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX1NFQ1QJKDEwMjQpCQkvKiBtYXggbnVtYmVyIG9mIHNlY3RvcnMgb24gb25lIGNoaXAgKi8KKworI2RlZmluZSBDT05GSUdfRU5WX0lTX0lOX0ZMQVNICQkxCisjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUCQkweDdGMDAwMCAJLyogZW52aXJvbm1lbnQgc3RhcnRzIGhlcmUgICovCisjZGVmaW5lIENPTkZJR19FTlZfU0laRQkJCTB4MDEwMDAwIAkvKiBUb3RhbCBTaXplIG9mIEVudmlyb25tZW50IFNlY3RvciAqLworI2Vsc2UKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9CQVNFCQlQSFlTX0ZMQVNIXzEKKyNkZWZpbmUgQ09ORklHX0ZMQVNIX0JBTktTX0xJU1QgCXsgUEhZU19GTEFTSF8xIH0KKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1MgCTEKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfU0VDVAkoMTAyNCkJCS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcCAqLworCisjZGVmaW5lIENPTkZJR19FTlZfSVNfSU5fRkxBU0gJCTEKKyNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVQJCTB4N0YwMDAwIAkvKiBlbnZpcm9ubWVudCBzdGFydHMgaGVyZSAgKi8KKyNkZWZpbmUgQ09ORklHX0VOVl9TSVpFCQkJMHgwMTAwMDAgCS8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yICovCisjZW5kaWYKKworI2VuZGlmCisKKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOCisKKyNkZWZpbmUgQ09ORklHX01PTklUT1JfQkFTRQkJVEVYVF9CQVNFCisjZGVmaW5lIENPTkZJR19NT05JVE9SX0xFTgkJKDE5MiA8PCAxMCkKKworLyogdGltZW91dCB2YWx1ZXMgYXJlIGluIHRpY2tzICovCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfRVJBU0VfVE9VVAkoMjAqQ09ORklHX1NZU19IWikgCS8qIFRpbWVvdXQgZm9yIEZsYXNoIEVyYXNlICovCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfV1JJVEVfVE9VVAkoMjAqQ09ORklHX1NZU19IWikgCS8qIFRpbWVvdXQgZm9yIEZsYXNoIFdyaXRlICovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KKworI2RlZmluZSBDT05GSUdfU1lTX1BST01QVAkJImJvb3QjICIgCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KKyNkZWZpbmUgQ09ORklHX1NZU19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNkZWZpbmUgQ09ORklHX1NZU19QQlNJWkUgKENPTkZJR19TWVNfQ0JTSVpFK3NpemVvZihDT05GSUdfU1lTX1BST01QVCkrMTYpIC8qIFByaW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENPTkZJR19TWVNfTUFYQVJHUwkJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENPTkZJR19TWVNfQkFSR1NJWkUJCUNPTkZJR19TWVNfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUJKi8KKworI2RlZmluZSBDT05GSUdfU1lTX01FTVRFU1RfU1RBUlQJMHg0MDAwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uCSovCisjZGVmaW5lIENPTkZJR19TWVNfTUVNVEVTVF9FTkQJCTB4NDRGRkZGRkYJLyogMjU2IE1CIGluIERSQU0JKi8KKworI2RlZmluZQlDT05GSUdfU1lTX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKyN1bmRlZglDT05GSUdfU1lTX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKworI2RlZmluZSBDT05GSUdfU1lTX0xPQURfQUREUgkJMHg0MzAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLworCisjZGVmaW5lIENPTkZJR19TWVNfVElNRVJCQVNFCQkweDFFNzgyMDAwCS8qIHVzZSB0aW1lciAxICovCisjZGVmaW5lIENPTkZJR19TWVNfSFoJCQkoMSoxMDAwKjEwMDApCS8qIHVzZSBleHRlcm5hbCBjbGsgKDFNKSAqLworCisvKgorICogU2VyaWFsIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTAKKyNkZWZpbmUgQ09ORklHX1NZU19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfUkVHX1NJWkUJNAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfQ0xLCQkyNDAwMDAwMAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfQ09NMQkJMHgxZTc4MzAwMAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfQ09NMgkJMHgxZTc4NDAwMAorI2RlZmluZQlDT05GSUdfU1lTX0xPQURTX0JBVURfQ0hBTkdFCisjZGVmaW5lIENPTkZJR19TRVJJQUwxCQkJMQorI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWAkJMgorI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCQkxMTUyMDAKKyNkZWZpbmUgQ09ORklHX1NZU19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CisKKy8qCisgKiBVU0IgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyAqLworLyoKKyNkZWZpbmUgQ09ORklHX1VTQl9ERVZJQ0UJCTEKKyNkZWZpbmUgQ09ORklHX1VTQl9UVFkJCQkxCisKKyNkZWZpbmUgQ09ORklHX1VTQkRfVkVORE9SSUQJCTB4MTIzNAorI2RlZmluZSBDT05GSUdfVVNCRF9QUk9EVUNUSUQJCTB4NTY3OAorI2RlZmluZSBDT05GSUdfVVNCRF9NQU5VRkFDVFVSRVIJIlNpZW1lbnMiCisjZGVmaW5lIENPTkZJR19VU0JEX1BST0RVQ1RfTkFNRQkiU1gxIgorKi8KKworLyoKKyAqIEkyQyBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX0hBUkRfSTJDCisjZGVmaW5lIENPTkZJR19TWVNfSTJDX1NQRUVECQkxMDAwMDAKKyNkZWZpbmUgQ09ORklHX1NZU19JMkNfU0xBVkUJCTEKKyNkZWZpbmUgQ09ORklHX0RSSVZFUl9BU1BFRURfSTJDCisKKy8qCisqIEVFUFJPTSBjb25maWd1cmF0aW9uCisqLworI2RlZmluZSBDT05GSUdfU1lTX0kyQ19FRVBST01fQUREUl9MRU4gCTIKKyNkZWZpbmUgQ09ORklHX1NZU19JMkNfRUVQUk9NX0FERFIgCTB4YTAKKworLyoKKyAqIE5JQyBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgX19CWVRFX09SREVSIF9fTElUVExFX0VORElBTgorI2RlZmluZSBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKKyNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KKyNkZWZpbmUgQ09ORklHX0FTUEVFRE5JQworI2RlZmluZSBDT05GSUdfTUFDMV9QSFlfTElOS19JTlRFUlJVUFQKKyNkZWZpbmUgQ09ORklHX01BQzJfRU5BQkxFCisjZGVmaW5lIENPTkZJR19NQUMyX1BIWV9MSU5LX0lOVEVSUlVQVAorLyoKKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIE5PVElDRTogTUFDMSBhbmQgTUFDMiBub3cgaGF2ZSB0aGVpciBvd24gc2VwZXJhdGUgUEhZIGNvbmZpZ3VyYXRpb24uCisqIFdlIHVzZSAyIGJpdHMgZm9yIGVhY2ggTUFDIGluIHRoZSBzY3JhdGNoIHJlZ2lzdGVyKERbMTU6MTFdIGluIDB4MUU2RTIwNDApIHRvCisqIGluZm9ybSBrZXJuZWwgZHJpdmVyLgorKiBUaGUgbWVhbmluZ3Mgb2YgdGhlIDIgYml0cyBhcmU6CisqIDAwKDApOiBEZWRpY2F0ZWQgUEhZCisqIDAxKDEpOiBBU1BFRUQncyBFVkEgKyBJTlRFTCdzIE5DLVNJIFBIWSBjaGlwIEVWQQorKiAxMCgyKTogQVNQRUVEJ3MgTUFDIGlzIGNvbm5lY3RlZCB0byBOQy1TSSBQSFkgY2hpcCBkaXJlY3RseQorKiAxMTogUmVzZXJ2ZWQKKyoKKyogV2UgdXNlIENPTkZJR19NQUMxX1BIWV9TRVRUSU5HIGFuZCBDT05GSUdfTUFDMl9QSFlfU0VUVElORyBpbiBVLUJvb3QKKyogMDogRGVkaWNhdGVkIFBIWQorKiAxOiBBU1BFRUQncyBFVkEgKyBJTlRFTCdzIE5DLVNJIFBIWSBjaGlwIEVWQQorKiAyOiBBU1BFRUQncyBNQUMgaXMgY29ubmVjdGVkIHRvIE5DLVNJIFBIWSBjaGlwIGRpcmVjdGx5CisqIDM6IFJlc2VydmVkCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKyNkZWZpbmUgQ09ORklHX01BQzFfUEhZX1NFVFRJTkcJCTAKKyNkZWZpbmUgQ09ORklHX01BQzJfUEhZX1NFVFRJTkcJCTAKKyNkZWZpbmUgQ09ORklHX01BQ19JTlRFUkZBQ0VfQ0xPQ0tfREVMQVkJMHgyMjU1CisjZGVmaW5lIENPTkZJR19ORVRfTVVMVEkKKyNkZWZpbmUgQ09ORklHX0VUSEFDVAkJCWFzcGVlZG5pYyMwCisjZGVmaW5lIENPTkZJR19HQVRFV0FZSVAJCTE5Mi4xNjguMC4xCisjZGVmaW5lIENPTkZJR19ORVRNQVNLCQkJMjU1LjI1NS4yNTUuMAorI2RlZmluZSBDT05GSUdfSVBBRERSCQkJMTkyLjE2OC4wLjQ1CisjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJCTE5Mi4xNjguMC44MQorI2RlZmluZSBDT05GSUdfRVRIQUREUgkJCTAwOkMwOkE4OjEyOjM0OjU2CisjZGVmaW5lIENPTkZJR19FVEgxQUREUgkJCTAwOkMwOkE4OjEyOjM0OjU3CisKKy8qCisgKiBTTFQKKyAqLworLyoKKyNkZWZpbmUgQ09ORklHX1NMVAorI2RlZmluZSBDRkdfQ01EX1NMVAkJKENGR19DTURfVklERU9URVNUIHwgQ0ZHX0NNRF9NQUNURVNUIHwgQ0ZHX0NNRF9IQUNURVNUIHwgQ0ZHX0NNRF9NSUNURVNUKQorKi8KKworI2VuZGlmCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9hc3QzMTAwLmggYi9pbmNsdWRlL2NvbmZpZ3MvYXN0MzEwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYTJhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvYXN0MzEwMC5oCkBAIC0wLDAgKzEsMzI1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBQZXRlciBDaGVuIDxwZXRlcmNAc29jbGUtdGVjaC5jb20udHc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKiAoZWFzeSB0byBjaGFuZ2UpCisgKi8KKy8vI2RlZmluZSBDT05GSUdfSU5JVF9DUklUSUNBTAkJCS8qIGRlZmluZSBmb3IgVS1CT09UIDEuMS4xICovCisjdW5kZWYgIENPTkZJR19JTklUX0NSSVRJQ0FMCQkJLyogdW5kZWYgZm9yICBVLUJPT1QgMS4xLjQgKi8gCisjZGVmaW5lIENPTkZJR19BUk05MjZFSlMJMQkJLyogVGhpcyBpcyBhbiBhcm05MjZlanMgQ1BVICovCisjZGVmaW5lCUNPTkZJR19BU1BFRUQJCTEKKy8vI2RlZmluZSBDT05GSUdfQVNUMjMwMAkJICAgIDEKKyNkZWZpbmUgQ09ORklHX0FTVDMxMDAJMQorI2RlZmluZSBDT05GSUdfQVNUMzEwMF9EMjAwICAgICAgICAgMSAgIC8qIENsaWVudHJvbiBEMjAwKi8KKy8vI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0NGSQkJCS8qIENPTkZJR19GTEFTSF9DRkksIENPTkZJR19GTEFTSF9TUEkgaXMgZXhjbHVzaXZlKi8KKyNkZWZpbmUgQ09ORklHX0ZMQVNIX1NQSQorLy8jZGVmaW5lIENPTkZJR18yU1BJRkxBU0gJCQkvKiBCb290IFNQSTogQ1MyLCAybmQgU1BJOiBDUzAgKi8KKyN1bmRlZiBDT05GSUdfMlNQSUZMQVNICisjdW5kZWYgQ09ORklHX0FTUEVFRF9TTFQKKyNkZWZpbmUgQ09ORklHX0ZMQVNIX0FTVDIzMDAKKy8vI2RlZmluZSBDT05GSUdfRkxBU0hfQVNUMjMwMF9ETUEKKy8vI2RlZmluZSBDT05GSUdfRkxBU0hfU1BJeDJfRHVtbXkKKy8vI2RlZmluZSBDT05GSUdfRkxBU0hfU1BJeDRfRHVtbXkKKyNkZWZpbmUgQ09ORklHX0NSVF9ESVNQTEFZCTEJCS8qIHVuZGVmIGlmIG5vdCBzdXBwb3J0IENSVCAqLworCisvLyNkZWZpbmUgQ09ORklHX1VTRV9JUlEJCQkJLyogd2UgZG9uJ3QgbmVlZCBJUlEvRklRIHN0dWZmICovCisjZGVmaW5lIENPTkZJR19NSVNDX0lOSVRfUiAKKworLyogCisgKiBEUkFNIENvbmZpZworICoKKyAqIDEuIERSQU0gU2l6ZSAgICAgICAgICAgICAgLy8KKyAqICAgIENPTkZJR19EUkFNXzUxMk1CSVQgICAgLy8gNTEyTSBiaXQKKyAqICAgIENPTkZJR19EUkFNXzFHQklUICAgICAgLy8gMUcgICBiaXQgKGRlZmF1bHQpCisgKiAgICBDT05GSUdfRFJBTV8yR0JJVCAgICAgIC8vIDJHICAgYml0CisgKiAgICBDT05GSUdfRFJBTV80R0JJVCAgICAgIC8vIDRHICAgYml0IAorICogMi4gRFJBTSBTcGVlZCAgICAgICAgICAgICAvLworICogICAgQ09ORklHX0RSQU1fMzM2ICAgICAgICAvLyAzMzZNSHogKEREUi02NjcpCisgKiAgICBDT05GSUdfRFJBTV80MDggICAgICAgIC8vIDQwOE1IeiAoRERSLTgwMCkgKGRlZmF1bHQpCisgKiAzLiBWR0EgTW9kZQorICogICAgQ09ORklHX0NSVF9ESVNQTEFZICAgICAvLyBkZWZpbmUgdG8gZGlzYWJsZSBWR0EgZnVuY3Rpb24KKyAqIDQuIEVDQyBGdW5jdGlvbiBlbmFibGUKKyAqICAgIENPTkZJR19EUkFNX0VDQyAgICAgICAgLy8gZGVmaW5lIHRvIGVuYWJsZSBFQ0MgZnVuY3Rpb24KKyAqIDUuIFVBUlQgRGVidWcgTWVzc2FnZQorICogICAgQ09ORklHX0RSQU1fVUFSVF9PVVQgICAvLyBlbmFibGUgb3V0cHV0IG1lc3NhZ2UgYXQgVUFSVDUKKyAqICAgIENPTkZJR19EUkFNX1VBUlRfMzg0MDAgLy8gc2V0IHRoZSBVQVJUIGJhdWQgcmF0ZSB0byAzODQwMCwgZGVmYXVsdCBpcyAxMTUyMDAKKyAqLworIAorLy8xLiBEUkFNIFNpemUKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV81MTJNQklUCisjZGVmaW5lICAgIENPTkZJR19EUkFNXzFHQklUCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fMkdCSVQKKy8vI2RlZmluZSAgICBDT05GSUdfRFJBTV80R0JJVAorLy8yLiBEUkFNIFNwZWVkCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fMzM2CisjZGVmaW5lICAgIENPTkZJR19EUkFNXzQwOAorLy8zLiBWR0EgTW9kZQorLy8jZGVmaW5lICAgIENPTkZJR19DUlRfRElTUExBWQorLy80LiBFQ0MgRnVuY3Rpb24gZW5hYmxlCisvLyNkZWZpbmUgICAgQ09ORklHX0RSQU1fRUNDCisvLzUuIFVBUlQgRGVidWcgTWVzc2FnZQorI2RlZmluZSAgICBDT05GSUdfRFJBTV9VQVJUX09VVAorLy8jZGVmaW5lICAgIENPTkZJR19EUkFNX1VBUlRfMzg0MDAKKworCisKKy8qIAorICogRW52aXJvbm1lbnQgQ29uZmlnCisgKi8KKyNkZWZpbmUgQ09ORklHX0NNRExJTkVfVEFHCSAxCQkvKiBlbmFibGUgcGFzc2luZyBvZiBBVEFHcwkqLworI2RlZmluZSBDT05GSUdfU0VUVVBfTUVNT1JZX1RBR1MgMQorI2RlZmluZSBDT05GSUdfSU5JVFJEX1RBRwkgMQorI2RlZmluZQlDT05GSUdfQk9PVEFSR1MgCSJkZWJ1ZyBjb25zb2xlPXR0eVMxLDExNTIwMG44IHJhbWRpc2tfc2l6ZT0xNjM4NCByb290PS9kZXYvcmFtIHJ3IGluaXQ9L2xpbnV4cmMgbWVtPTgwTSIKKyNkZWZpbmUgQ09ORklHX0JPT1RERUxBWQk0CQkvKiBhdXRvYm9vdCBhZnRlciA0IHNlY29uZHMJKi8KKyNpZmRlZiBDT05GSUdfRkxBU0hfQVNUMjMwMAorI2RlZmluZSBDT05GSUdfQk9PVENPTU1BTkQJImJvb3RtIDIwMDgwMDAwIDIwMzAwMDAwIgorI2Vsc2UKKyNpZmRlZglDT05GSUdfU1lTX0ZMQVNIX0NGSSAKKyNkZWZpbmUgQ09ORklHX0JPT1RDT01NQU5ECSJib290bSAxMDA4MDAwMCAxMDMwMDAwMCIKKyNlbHNlCisjZGVmaW5lIENPTkZJR19CT09UQ09NTUFORAkiYm9vdG0gMTQwODAwMDAgMTQzMDAwMDAiCisjZW5kaWYKKyNlbmRpZgorI2RlZmluZSBDT05GSUdfQk9PVEZJTEUJCSJhbGxjLmJpbiIKKyNkZWZpbmUgQ09ORklHX0VOVl9PVkVSV1JJVEUKKworLyoKKyAqIENvbW1hbmQgbGluZSBjb25maWd1cmF0aW9uLgorICovCisjaW5jbHVkZSA8Y29uZmlnX2NtZF9kZWZhdWx0Lmg+CisKKyNkZWZpbmUgQ09ORklHX0NNRF9ERkwKKyNkZWZpbmUgQ09ORklHX0NNRF9FTlYKKyNkZWZpbmUgQ09ORklHX0NNRF9GTEFTSAorI2RlZmluZSBDT05GSUdfQ01EX05FVAorI2RlZmluZSBDT05GSUdfQ01EX1BJTkcKKyNkZWZpbmUgQ09ORklHX0NNRF9JMkMKKyNkZWZpbmUgQ09ORklHX0NNRF9FRVBST00KKworLyogCisgKiBDUFUgU2V0dGluZworICovCisjZGVmaW5lIENQVV9DTE9DS19SQVRFCQkxODAwMDAwMAkvKiAxNi41IE1IeiBjbG9jayBmb3IgdGhlIEFSTSBjb3JlICovCisKKy8qCisgKiBTaXplIG9mIG1hbGxvYygpIHBvb2wKKyAqLworI2RlZmluZSBDT05GSUdfU1lTX01BTExPQ19MRU4JCShDT05GSUdfRU5WX1NJWkUgKyA3NjgqMTAyNCkKKyNkZWZpbmUgQ09ORklHX1NZU19HQkxfREFUQV9TSVpFCTEyOAkvKiBzaXplIGluIGJ5dGVzIHJlc2VydmVkIGZvciBpbml0aWFsIGRhdGEgKi8KKworLyoKKyAqIFN0YWNrIHNpemVzLCAgVGhlIHN0YWNrIHNpemVzIGFyZSBzZXQgdXAgaW4gc3RhcnQuUyB1c2luZyB0aGUgc2V0dGluZ3MgYmVsb3cKKyAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFCSgxMjgqMTAyNCkJLyogcmVndWxhciBzdGFjayAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFX0lSUQkoNCoxMDI0KQkvKiBJUlEgc3RhY2sgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRV9GSVEJKDQqMTAyNCkJLyogRklRIHN0YWNrICovCisKKy8qCisgKiBNZW1vcnkgQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19EUkFNXzUyOCAKKyNkZWZpbmUgQ09ORklHX05SX0RSQU1fQkFOS1MJMQkgICAJLyogd2UgaGF2ZSAxIGJhbmsgb2YgRFJBTSAqLworI2RlZmluZSBQSFlTX1NEUkFNXzEJCTB4NDAwMDAwMDAgCS8qIFNEUkFNIEJhbmsgIzEgKi8KKyNkZWZpbmUgUEhZU19TRFJBTV8xX1NJWkUJMHg0MDAwMDAwIAkvKiA2NCBNQiAqLworCisjZGVmaW5lIENPTkZJR19TWVNfU0RSQU1fQkFTRQkweDQwMDAwMDAwCisKKy8qCisgKiBGTEFTSCBDb25maWd1cmF0aW9uCisgKi8KKyNpZmRlZiBDT05GSUdfU1lTX0ZMQVNIX0NGSQkJCQkvKiBOT1IgRmxhc2ggKi8KKworI2lmZGVmIENPTkZJR19GTEFTSF9BU1QyMzAwCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJCTB4MjAwMDAwMDAgCS8qIEZsYXNoIEJhbmsgIzEgKi8KKyNlbHNlCisjZGVmaW5lIFBIWVNfRkxBU0hfMQkJCTB4MTAwMDAwMDAgCS8qIEZsYXNoIEJhbmsgIzEgKi8KKyNlbmRpZgorCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfQkFTRQkJUEhZU19GTEFTSF8xCisjZGVmaW5lIENPTkZJR19GTEFTSF9CQU5LU19MSVNUIAl7IFBIWVNfRkxBU0hfMSB9CisKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1MgCTEKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfU0VDVAkoMjU2KQkJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwICovCisKKyNkZWZpbmUgQ09ORklHX0VOVl9JU19JTl9GTEFTSAkxCisjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUCQkJMHg2MDAwMCAJLyogZW52aXJvbm1lbnQgc3RhcnRzIGhlcmUgICovCisjZGVmaW5lIENPTkZJR19FTlZfU0laRQkJCTB4MjAwMDAgCS8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yICovCisKKyNkZWZpbmUgQ09ORklHX1NZU19GTEFTSF9DRklfQU1EX1JFU0VUCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfVVNFX0JVRkZFUl9XUklURQorCisjZWxzZQkJCQkJCS8qIFNQSSBGbGFzaCAqLworCisjaWZkZWYgQ09ORklHX0ZMQVNIX0FTVDIzMDAKKyNkZWZpbmUgUEhZU19GTEFTSF8xCQkweDIwMDAwMDAwIAkvKiBGbGFzaCBCYW5rICMxICovCisjZWxzZQorI2RlZmluZSBQSFlTX0ZMQVNIXzEJCTB4MTQwMDAwMDAgCS8qIEZsYXNoIEJhbmsgIzEgKi8KKyNkZWZpbmUgUEhZU19GTEFTSF8yCQkweDE0ODAwMDAwIAkvKiBGbGFzaCBCYW5rICMyICovCisjZGVmaW5lIFBIWVNfRkxBU0hfMl9CQVNFCTB4MTAwMDAwMDAKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHXzJTUElGTEFTSAorI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0JBU0UJCVBIWVNfRkxBU0hfMl9CQVNFCisjZGVmaW5lIENPTkZJR19GTEFTSF9CQU5LU19MSVNUIAl7IFBIWVNfRkxBU0hfMSwgUEhZU19GTEFTSF8yIH0KKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfQkFOS1MgCTIKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhfRkxBU0hfU0VDVAkoNTEyKQkJLyogbWF4IG51bWJlciBvZiBzZWN0b3JzIG9uIG9uZSBjaGlwICovCisKKyNkZWZpbmUgQ09ORklHX0VOVl9JU19JTl9GTEFTSAkJMQorI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVAkJMHg3RjAwMDAgCS8qIGVudmlyb25tZW50IHN0YXJ0cyBoZXJlICAqLworI2RlZmluZSBDT05GSUdfRU5WX1NJWkUJCQkweDAxMDAwMCAJLyogVG90YWwgU2l6ZSBvZiBFbnZpcm9ubWVudCBTZWN0b3IgKi8KKyNlbHNlCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfQkFTRQkJUEhZU19GTEFTSF8xCisjZGVmaW5lIENPTkZJR19GTEFTSF9CQU5LU19MSVNUIAl7IFBIWVNfRkxBU0hfMSB9CisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX0JBTktTIAkxCisjZGVmaW5lIENPTkZJR19TWVNfTUFYX0ZMQVNIX1NFQ1QJKDUxMikJCS8qIG1heCBudW1iZXIgb2Ygc2VjdG9ycyBvbiBvbmUgY2hpcCAqLworCisjZGVmaW5lIENPTkZJR19FTlZfSVNfSU5fRkxBU0gJCTEKKyNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVQJCTB4N0YwMDAwIAkvKiBlbnZpcm9ubWVudCBzdGFydHMgaGVyZSAgKi8KKyNkZWZpbmUgQ09ORklHX0VOVl9TSVpFCQkJMHgwMTAwMDAgCS8qIFRvdGFsIFNpemUgb2YgRW52aXJvbm1lbnQgU2VjdG9yICovCisjZW5kaWYKKworI2VuZGlmCisKKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOCisKKyNkZWZpbmUgQ09ORklHX01PTklUT1JfQkFTRQkJVEVYVF9CQVNFCisjZGVmaW5lIENPTkZJR19NT05JVE9SX0xFTgkJKDE5MiA8PCAxMCkKKworLyogdGltZW91dCB2YWx1ZXMgYXJlIGluIHRpY2tzICovCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfRVJBU0VfVE9VVAkoMjAqQ09ORklHX1NZU19IWikgCS8qIFRpbWVvdXQgZm9yIEZsYXNoIEVyYXNlICovCisjZGVmaW5lIENPTkZJR19TWVNfRkxBU0hfV1JJVEVfVE9VVAkoMjAqQ09ORklHX1NZU19IWikgCS8qIFRpbWVvdXQgZm9yIEZsYXNoIFdyaXRlICovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19MT05HSEVMUAkJCQkvKiB1bmRlZiB0byBzYXZlIG1lbW9yeQkJKi8KKworI2RlZmluZSBDT05GSUdfU1lTX1BST01QVAkJImJvb3QjICIgCS8qIE1vbml0b3IgQ29tbWFuZCBQcm9tcHQJKi8KKyNkZWZpbmUgQ09ORklHX1NZU19DQlNJWkUJCTI1NgkJLyogQ29uc29sZSBJL08gQnVmZmVyIFNpemUJKi8KKyNkZWZpbmUgQ09ORklHX1NZU19QQlNJWkUgKENPTkZJR19TWVNfQ0JTSVpFK3NpemVvZihDT05GSUdfU1lTX1BST01QVCkrMTYpIC8qIFByaW50IEJ1ZmZlciBTaXplICovCisjZGVmaW5lIENPTkZJR19TWVNfTUFYQVJHUwkJMTYJCS8qIG1heCBudW1iZXIgb2YgY29tbWFuZCBhcmdzCSovCisjZGVmaW5lIENPTkZJR19TWVNfQkFSR1NJWkUJCUNPTkZJR19TWVNfQ0JTSVpFCS8qIEJvb3QgQXJndW1lbnQgQnVmZmVyIFNpemUJKi8KKworI2RlZmluZSBDT05GSUdfU1lTX01FTVRFU1RfU1RBUlQJMHg0MDAwMDAwMAkvKiBtZW10ZXN0IHdvcmtzIG9uCSovCisjZGVmaW5lIENPTkZJR19TWVNfTUVNVEVTVF9FTkQJCTB4NDRGRkZGRkYJLyogMjU2IE1CIGluIERSQU0JKi8KKworI2RlZmluZQlDT05GSUdfU1lTX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKyN1bmRlZglDT05GSUdfU1lTX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKworI2RlZmluZSBDT05GSUdfU1lTX0xPQURfQUREUgkJMHg0MzAwMDAwMAkvKiBkZWZhdWx0IGxvYWQgYWRkcmVzcyAqLworCisjZGVmaW5lIENPTkZJR19TWVNfVElNRVJCQVNFCQkweDFFNzgyMDAwCS8qIHVzZSB0aW1lciAxICovCisjZGVmaW5lIENPTkZJR19TWVNfSFoJCQkoMSoxMDAwKjEwMDApCS8qIHVzZSBleHRlcm5hbCBjbGsgKDFNKSAqLworCisvKgorICogU2VyaWFsIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTAKKyNkZWZpbmUgQ09ORklHX1NZU19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfUkVHX1NJWkUJNAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfQ0xLCQkyNDAwMDAwMAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfQ09NMQkJMHgxZTc4MzAwMAorI2RlZmluZSBDT05GSUdfU1lTX05TMTY1NTBfQ09NMgkJMHgxZTc4NDAwMAorI2RlZmluZQlDT05GSUdfU1lTX0xPQURTX0JBVURfQ0hBTkdFCisjZGVmaW5lIENPTkZJR19TRVJJQUwxCQkJMQorI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWAkJMgorI2RlZmluZSBDT05GSUdfQkFVRFJBVEUJCQkxMTUyMDAKKyNkZWZpbmUgQ09ORklHX1NZU19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCB9CisKKy8qCisgKiBVU0IgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyAqLworLyoKKyNkZWZpbmUgQ09ORklHX1VTQl9ERVZJQ0UJCTEKKyNkZWZpbmUgQ09ORklHX1VTQl9UVFkJCQkxCisKKyNkZWZpbmUgQ09ORklHX1VTQkRfVkVORE9SSUQJCTB4MTIzNAorI2RlZmluZSBDT05GSUdfVVNCRF9QUk9EVUNUSUQJCTB4NTY3OAorI2RlZmluZSBDT05GSUdfVVNCRF9NQU5VRkFDVFVSRVIJIlNpZW1lbnMiCisjZGVmaW5lIENPTkZJR19VU0JEX1BST0RVQ1RfTkFNRQkiU1gxIgorKi8KKworLyoKKyAqIEkyQyBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX0hBUkRfSTJDCisjZGVmaW5lIENPTkZJR19TWVNfSTJDX1NQRUVECQkxMDAwMDAKKyNkZWZpbmUgQ09ORklHX1NZU19JMkNfU0xBVkUJCTEKKyNkZWZpbmUgQ09ORklHX0RSSVZFUl9BU1BFRURfSTJDCisKKy8qCisqIEVFUFJPTSBjb25maWd1cmF0aW9uCisqLworI2RlZmluZSBDT05GSUdfU1lTX0kyQ19FRVBST01fQUREUl9MRU4gCTIKKyNkZWZpbmUgQ09ORklHX1NZU19JMkNfRUVQUk9NX0FERFIgCTB4YTAKKworLyoKKyAqIE5JQyBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgX19CWVRFX09SREVSIF9fTElUVExFX0VORElBTgorI2RlZmluZSBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKKyNkZWZpbmUgQ09ORklHX01BQ19QQVJUSVRJT04KKyNkZWZpbmUgQ09ORklHX0FTUEVFRE5JQworLy8jZGVmaW5lIENPTkZJR19NQUMxX1BIWV9MSU5LX0lOVEVSUlVQVAorI2RlZmluZSBDT05GSUdfTUFDMl9FTkFCTEUKKyNkZWZpbmUgQ09ORklHX01BQzJfUEhZX0xJTktfSU5URVJSVVBUCisvKgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogTk9USUNFOiBNQUMxIGFuZCBNQUMyIG5vdyBoYXZlIHRoZWlyIG93biBzZXBlcmF0ZSBQSFkgY29uZmlndXJhdGlvbi4KKyogV2UgdXNlIDIgYml0cyBmb3IgZWFjaCBNQUMgaW4gdGhlIHNjcmF0Y2ggcmVnaXN0ZXIoRFsxNToxMV0gaW4gMHgxRTZFMjA0MCkgdG8KKyogaW5mb3JtIGtlcm5lbCBkcml2ZXIuCisqIFRoZSBtZWFuaW5ncyBvZiB0aGUgMiBiaXRzIGFyZToKKyogMDAoMCk6IERlZGljYXRlZCBQSFkKKyogMDEoMSk6IEFTUEVFRCdzIEVWQSArIElOVEVMJ3MgTkMtU0kgUEhZIGNoaXAgRVZBCisqIDEwKDIpOiBBU1BFRUQncyBNQUMgaXMgY29ubmVjdGVkIHRvIE5DLVNJIFBIWSBjaGlwIGRpcmVjdGx5CisqIDExOiBSZXNlcnZlZAorKgorKiBXZSB1c2UgQ09ORklHX01BQzFfUEhZX1NFVFRJTkcgYW5kIENPTkZJR19NQUMyX1BIWV9TRVRUSU5HIGluIFUtQm9vdAorKiAwOiBEZWRpY2F0ZWQgUEhZCisqIDE6IEFTUEVFRCdzIEVWQSArIElOVEVMJ3MgTkMtU0kgUEhZIGNoaXAgRVZBCisqIDI6IEFTUEVFRCdzIE1BQyBpcyBjb25uZWN0ZWQgdG8gTkMtU0kgUEhZIGNoaXAgZGlyZWN0bHkKKyogMzogUmVzZXJ2ZWQKKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2RlZmluZSBDT05GSUdfTUFDMV9QSFlfU0VUVElORwkJMAorI2RlZmluZSBDT05GSUdfTUFDMl9QSFlfU0VUVElORwkJMAorI2RlZmluZSBDT05GSUdfTUFDX0lOVEVSRkFDRV9DTE9DS19ERUxBWQkweDIyNTUKKyNkZWZpbmUgQ09ORklHX05FVF9NVUxUSQorI2RlZmluZSBDT05GSUdfRVRIQUNUCQkJYXNwZWVkbmljIzAKKyNkZWZpbmUgQ09ORklHX0dBVEVXQVlJUAkJMTkyLjE2OC4wLjEKKyNkZWZpbmUgQ09ORklHX05FVE1BU0sJCQkyNTUuMjU1LjI1NS4wCisjZGVmaW5lIENPTkZJR19JUEFERFIJCQkxOTIuMTY4LjAuMjQ5CisjZGVmaW5lIENPTkZJR19TRVJWRVJJUAkJCTE5Mi4xNjguMC4xNTYKKyNkZWZpbmUgQ09ORklHX0VUSEFERFIJCQkwMDpEMDpBODoxMjozNDo1OAorI2RlZmluZSBDT05GSUdfRVRIMUFERFIJCQkwMDpEMDpBODoxMjozNDo1OQorCisvKgorICogU0xUCisgKi8KKy8qCisjZGVmaW5lIENPTkZJR19TTFQKKyNkZWZpbmUgQ0ZHX0NNRF9TTFQJCShDRkdfQ01EX1ZJREVPVEVTVCB8IENGR19DTURfTUFDVEVTVCB8IENGR19DTURfSEFDVEVTVCB8IENGR19DTURfTUlDVEVTVCkKKyovCisKKyNlbmRpZgkvKiBfX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZsYXNoLmggYi9pbmNsdWRlL2ZsYXNoLmgKaW5kZXggYzdhY2M5Ny4uZTc3YmUxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mbGFzaC5oCisrKyBiL2luY2x1ZGUvZmxhc2guaApAQCAtNTcsNiArNTcsMjEgQEAgdHlwZWRlZiBzdHJ1Y3QgewogCXVsb25nICAgYWRkcl91bmxvY2syOwkJLyogdW5sb2NrIGFkZHJlc3MgMiBmb3IgQU1EIGZsYXNoIHJvbXMgICovCiAJY29uc3QgY2hhciAqbmFtZTsJCS8qIGh1bWFuLXJlYWRhYmxlIG5hbWUJICAgICAgICAgICAgICAgICovCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfRkxBU0hfU1BJCisgIHVsb25nICAgcmVhZGNtZDsKKyAgdWxvbmcgICBkdWFscG9ydDsKKyAgdWxvbmcgICBkdW1teWJ5dGU7CisgIHVsb25nICAgdENLX1dyaXRlOworICB1bG9uZyAgIHRDS19FcmFzZTsKKyAgdWxvbmcgICB0Q0tfUmVhZDsKKyAgdWxvbmcgICBDRTsKKyAgdWxvbmcgICBpb21vZGU7CisgIHVsb25nICAgYWRkcmVzczMyOworICB1bG9uZyAgIHF1YWRwb3J0OworICB1bG9uZyAgIGR1bW15ZGF0YTsKKyAgdWxvbmcgICBidWZmZXJzaXplOworICB1bG9uZyAgIHNwZWNpZmljc3BpOworI2VuZGlmCiB9IGZsYXNoX2luZm9fdDsKIAogZXh0ZXJuIGZsYXNoX2luZm9fdCBmbGFzaF9pbmZvW107IC8qIGluZm8gZm9yIEZMQVNIIGNoaXBzCSovCg==