LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqIEZpbGUgRGVzY3JpcHRpb24gKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogRmlsZSBOYW1lOgkJJFdvcmtmaWxlOiAgIGhteF91cHJhZGVfc3lzdGVtLmMgICQKICogVmVyc2lvbjoJCQkkUmV2aXNpb246ICAgMS4wICAkCiAqIE9yaWdpbmFsIEF1dGhvcjoJCVlhbmcgSHl1biBVayAkCiAqIEN1cnJlbnQgQXV0aG9yOgkkQXV0aG9yOiBodXlhbmdAaHVtYXhkaWdpdGFsLmNvbSAkCiAqIERhdGU6CQkJJERhdGU6IDIwMTEuMDkuMzAKICogRmlsZSBEZXNjcmlwdGlvbjoJSHVtYXggVXBncmFkZSBBUElzCiAqIE1vZHVsZToKICogUmVtYXJrczoKICovCgovKioKICogQGRlZmdyb3VwIFVQR1JBREVfU1lTVEVNIFN5c3RlbSBBUElzIGZvciBVcGdyYWRlIE1vZHVsZQogKiBAaW5ncm91cCBVUEdSQURFCiAqLwoKLyoqCiAqIEBhdXRob3IgSHl1bnVrIFlhbmcoaHV5YW5nQGh1bWF4ZGlnaXRhbC5jb20pCiAqIEBkYXRlIDMwIFNlcHQgMjAxMQogKi8KCi8qKgogKiBAbm90ZQogKiBDb3B5cmlnaHQgKEMpIDIwMTEgSHVtYXggQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIDxicj4KICogVGhpcyBzb2Z0d2FyZSBpcyB0aGUgY29uZmlkZW50aWFsIGFuZCBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbgogKiBvZiBIdW1heCBDb3Jwb3JhdGlvbi4gWW91IG1heSBub3QgdXNlIG9yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQogKiBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhbnkgYXBwbGljYWJsZSBsaWNlbnNlCiAqIGFncmVlbWVudCBpbiB3cml0aW5nIGJldHdlZW4gSHVtYXggQ29ycG9yYXRpb24gYW5kIHlvdS4KICovCgogLypAeyovCgovKioKICogQGZpbGUgaG14X3VwZ3JhZGVfc3lzdGVtLmMKICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIEZpbGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBTdGFydCBJbmNsdWRpbmcgSGVhZGVyIEZpbGVzICovCiNpbmNsdWRlICJobXhfdXBncmFkZV9zeXN0ZW0uaCIKLyogRW5kIEluY2x1ZGluZyBIZWFkZXJzICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZGVmaW5lICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZmRlZiBUQVNLX0RFQlVHCiNkZWZpbmUgUHJpbnREZWJ1ZyhmbXQsIC4uLikgCQlwcmludGYgKGZtdCwgIyMgX19WQV9BUkdTX18pCiNkZWZpbmUgUHJpbnRFcnJvcihmbXQsIC4uLikgICAgCXByaW50ZiAoZm10LCAjIyBfX1ZBX0FSR1NfXykKI2RlZmluZSBQcmludEVudGVyKC4uLikJCQlwcmludGYoIigrKSVzXG4iLCBfX0ZVTkNUSU9OX18pCiNkZWZpbmUgUHJpbnRFeGl0KC4uLikJCQkJcHJpbnRmKCIoLSklc1xuIiwgX19GVU5DVElPTl9fKQojZWxzZQojZGVmaW5lIFByaW50RGVidWcoZm10LCAuLi4pICAgIAl3aGlsZSAoMCkgKChpbnQgKCopKGNoYXIgKiwgLi4uKSkgMCkKI2RlZmluZSBQcmludEVycm9yKGZtdCwgLi4uKQkJcHJpbnRmIChmbXQsICMjIF9fVkFfQVJHU19fKQojZGVmaW5lIFByaW50RW50ZXIoLi4uKSAJCQl3aGlsZSAoMCkgKChpbnQgKCopKGNoYXIgKiwgLi4uKSkgMCkKI2RlZmluZSBQcmludEV4aXQoLi4uKQkJCQl3aGlsZSAoMCkgKChpbnQgKCopKGNoYXIgKiwgLi4uKSkgMCkKI2VuZGlmCgoKI2RlZmluZSBsaXN0X3NpemUobGlzdCkgKChsaXN0KS0+Y3Vycl9tc2dfY291bnRfKQoKI2RlZmluZSBsaXN0X2JpdG1hcF9zaXplKGxpc3QsIGkpICgobGlzdCktPmJpdG1hcF9jb3VudFsoaSldKQoKI2RlZmluZSBsaXN0X2hlYWQobGlzdCwgaSkgKChsaXN0KS0+aGVhZFtpXSkKCiNkZWZpbmUgbGlzdF90YWlsKGxpc3QsIGkpICgobGlzdCktPnRhaWxbaV0pCgojZGVmaW5lIGxpc3RfaXNfaGVhZChsaXN0LCBlbGVtZW50KSAoKGVsZW1lbnQpID09IChsaXN0KS0+aGVhZCA/IDEgOiAwKQoKI2RlZmluZSBsaXN0X2lzX3RhaWwoZWxlbWVudCkgKChlbGVtZW50KS0+bmV4dCA9PSBOVUxMID8gMSA6IDApCgojZGVmaW5lIGxpc3RfZGF0YShlbGVtZW50KSAoKGVsZW1lbnQpLT5kYXRhKQoKI2RlZmluZSBsaXN0X25leHQoZWxlbWVudCkgKChlbGVtZW50KS0+bmV4dCkKCiNkZWZpbmUgSEFQUFkoYSkgKHZvaWQpKGEpCgovKiBFbmQgI2RlZmluZSAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdHlwZWRlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogU3RhcnQgdHlwZWRlZiAqLwovKiBFbmQgdHlwZWRlZiAqLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqIGdsb2JhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIFN0YXJ0IGdsb2JhbCB2YXJpYWJsZSAqLwoKLyogRW5kIGdsb2JhbCB2YXJpYWJsZSAqLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqIHN0YXRpYyB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIFN0YXJ0IHN0YXRpYyB2YXJpYWJsZSAqLwovKiBFbmQgc3RhdGljIHZhcmlhYmxlICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKiogc3RhdGljIGZ1bnRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBpbnQgUF9NU0dfQ2hlY2soc3RydWN0IEhNWF9NU0dfcXVldWUgKnEsIHVuc2lnbmVkIGxvbmcgcV9pZCk7CgoKLyoKICAgIGxpc3RfZmluZF9oaWdoZXN0X3ByaW9yaXR5X2JpdG1hcAogICAgYml0bWFwv6G8rSCwocDlILP0wLogv+y8sbz4wKe4piDDo7TCtNkuCiovCnVuc2lnbmVkIGxvbmcgbGlzdF9maW5kX2hpZ2hlc3RfcHJpb3JpdHlfYml0bWFwKHN0cnVjdCBITVhfTVNHX3F1ZXVlICpsaXN0KQp7CiAgICBpbnQgaTsKCiAgICBmb3IoaT1NU0dfUFJJT1JJVFlfTUFYLTE7IGk+PTA7IGktLSkKICAgIHsKICAgICAgICBpZihsaXN0LT5iaXRtYXBbaV0gPT0gMSkKICAgICAgICAgICAgcmV0dXJuIGk7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCgoKLyoKICAgIHByaW50X2xpc3QKICAgIEhNWF9NU0dfcXVldWUgsbjBtsO8IMD8w7y4piBQcmludMfRtNkuCiovCnZvaWQgcHJpbnRfbGlzdChjb25zdCBzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqbGlzdCkKewogICAgc3RydWN0IEhNWF9NU0dfZWxlbWVudCAgICAgICAgICAgKmVsZW1lbnQ7CiAgICBpbnQgICAgICAgICAgICAgICAgKmRhdGEsIGksIGNvdW50OwoKICAgIGZwcmludGYoc3Rkb3V0LCAiTXNnIFF1ZXVlIEN1cnJlbnQgdG90YWwgc2l6ZSBpcyAlbGRcbiIsIGxpc3Rfc2l6ZShsaXN0KSk7CgogICAgZm9yKGNvdW50PTA7IGNvdW50PE1TR19QUklPUklUWV9NQVg7IGNvdW50KyspCiAgICB7CiAgICAgICAgaSA9IDA7CgogICAgICAgIGlmKCBsaXN0LT5iaXRtYXBbY291bnRdICE9IDApCiAgICAgICAgewogICAgICAgICAgICBlbGVtZW50ID0gbGlzdF9oZWFkKGxpc3QsIGNvdW50KTsKCiAgICAgICAgICAgIHdoaWxlICgxKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIGRhdGEgPSBsaXN0X2RhdGEoZWxlbWVudCk7CiAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAicHJpb3JpdHlbJWRdIDogcWxpc3RbJTAzZF09JTAzZFxuIiwgY291bnQsIGksICpkYXRhKTsKCiAgICAgICAgICAgICAgIGkrKzsKCiAgICAgICAgICAgICAgIGlmIChsaXN0X2lzX3RhaWwoZWxlbWVudCkpCiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBsaXN0X25leHQoZWxlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCgoKLyoKICAgIGxpc3Rfc2V0X2JpdG1hcAogICAgv+y8sbz4wKe/oSDH2LTnx8+0wiC68cauuMrAuyBzZXQgx9G02S4KKi8Kdm9pZCBsaXN0X3NldF9iaXRtYXAoc3RydWN0IEhNWF9NU0dfcXVldWUgKmxpc3QsIHVuc2lnbmVkIGxvbmcgcHJpbykKewogICAgbGlzdC0+Yml0bWFwW3ByaW9dID0gMTsKfQoKCgovKgogICAgbGlzdF9jbGVhcl9iaXRtYXAKICAgIL/svLG8+MCnv6Egx9i058fPtMIguvHGrrjKwLsgY2xlYXIgx9G02S4KKi8Kdm9pZCBsaXN0X2NsZWFyX2JpdG1hcChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqbGlzdCwgdW5zaWduZWQgbG9uZyBwcmlvKQp7CiAgICBsaXN0LT5iaXRtYXBbcHJpb10gPSAwOwp9CgoKCgoKCgovKgogICAgbGlzdF9iaXRtYXBfY291bnRfaW5jcmVhc2UKICAgIMfYtOfHz7TCIL/svLG8+MCnwMcgYml0bWFwIENvdW50uKYgwfWwoSC9w8WytNkuCiovCnZvaWQgbGlzdF9iaXRtYXBfY291bnRfaW5jcmVhc2Uoc3RydWN0IEhNWF9NU0dfcXVldWUgKmxpc3QsIHVuc2lnbmVkIGxvbmcgcHJpbykKewogICAgbGlzdC0+Yml0bWFwX2NvdW50W3ByaW9dKys7Cn0KCgoKLyoKICAgIGxpc3RfYml0bWFwX2NvdW50X2RlY3JlYXNlCiAgICDH2LTnx8+0wiC/7LyxvPjAp8DHIGJpdG1hcCBDb3VudLimILCovNIgvcPFsrTZLgoqLwp2b2lkIGxpc3RfYml0bWFwX2NvdW50X2RlY3JlYXNlKHN0cnVjdCBITVhfTVNHX3F1ZXVlICpsaXN0LCB1bnNpZ25lZCBsb25nIHByaW8pCnsKICAgIGxpc3QtPmJpdG1hcF9jb3VudFtwcmlvXS0tOwp9CgoKLyoKICAgIGxpc3RfbWFwcGluZ190YXNrX3ByaW9yaXR5X3RvX21zZ3EKICAgIMXCvbrFqSC/7LyxvPjAp7imILHiwdjAuLfOILjevLzB9sWlIL/svLG8+MCnuKYgsOHBpMfRtNkuCiovCmludCBsaXN0X2ZpbmRfbXNnX3FfcHJpb3JpdHlfZnJvbV90YXNrX3ByaW9yaXR5KHVuc2lnbmVkIGxvbmcgKnByaW8pCnsKICAgIHN0cnVjdCBzY2hlZF9wYXJhbQlwYXJhbTsKICAgIGludCBwb2xpY3kgPSAwOwogICAgaW50IHJjOwoKICAgIHJjID0gcHRocmVhZF9nZXRzY2hlZHBhcmFtKCBwdGhyZWFkX3NlbGYoKSwgJnBvbGljeSwgJnBhcmFtKTsKICAgIGlmKHJjICE9IEhNWF9PSykKICAgIHsKCQkqcHJpbyA9IE1TR19QUklPUklUWTA7CgkJcmV0dXJuIEhNWF9PSzsKICAgIH0KICAgIFByaW50RGVidWcoInBvbGljeSA9ICVkXG4iLCBwb2xpY3kpOwogICAgUHJpbnREZWJ1ZygicGFyYW0uc2NoZWRfcHJpb3JpdHkgPSAlZFxuIiwgcGFyYW0uc2NoZWRfcHJpb3JpdHkpOwoKICAgIHN3aXRjaChwYXJhbS5zY2hlZF9wcmlvcml0eSkKICAgIHsKICAgICAgICBjYXNlIFVTRVJfUFJJT1JJVFkwOgogICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTE6CiAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBVU0VSX1BSSU9SSVRZMjoKICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFkyOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFVTRVJfUFJJT1JJVFkzOgogICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTM7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTQ6CiAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZNDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBVU0VSX1BSSU9SSVRZNToKICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFk1OwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFVTRVJfUFJJT1JJVFk2OgogICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTc6CiAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZNzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBVU0VSX1BSSU9SSVRZODoKICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFk4OwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFVTRVJfUFJJT1JJVFk5OgogICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTEwOgogICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTEwOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFVTRVJfUFJJT1JJVFkxMToKICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFkxMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBVU0VSX1BSSU9SSVRZMTI6CiAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZMTI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVVNFUl9QUklPUklUWTEzOgogICAgICAgICAgICAqcHJpbyA9IE1TR19QUklPUklUWTEzOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFVTRVJfUFJJT1JJVFkxNDoKICAgICAgICAgICAgKnByaW8gPSBNU0dfUFJJT1JJVFkxNDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBVU0VSX1BSSU9SSVRZMTU6CiAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZMTU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICpwcmlvID0gTVNHX1BSSU9SSVRZMTU7CiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIHJldHVybiBITVhfT0s7Cn0KCgovKgoJcV9pbnNlcnRfdGVtcF90YWlsX2VsZW1lbnQKCXRlbXAgUWV1Zb+hIGVsZW1lbnS4piC/rLDhIMfRtNkuCiovCnZvaWQgcV9pbnNlcnRfdGVtcF90YWlsX2VsZW1lbnQoc3RydWN0IEhNWF9NU0dfcXVldWUgKnEsIHN0cnVjdCBITVhfTVNHX2VsZW1lbnQgKmVsZW1lbnQpCnsKCWlmKHEtPnRlbXBfdGFpbCA9PSBOVUxMKQoJewoJCXEtPnRlbXBfaGVhZCA9IGVsZW1lbnQ7CgkJZWxlbWVudC0+bmV4dCA9IE5VTEw7CgkJZWxlbWVudC0+cHJldiA9IE5VTEw7CgkJcS0+dGVtcF90YWlsID0gZWxlbWVudDsKCX0KCWVsc2UKCXsKCQlxLT50ZW1wX3RhaWwtPm5leHQgPSBlbGVtZW50OwoJCWVsZW1lbnQtPm5leHQgPSBOVUxMOwoJCWVsZW1lbnQtPnByZXYgPSBxLT50ZW1wX3RhaWw7CgkJcS0+dGVtcF90YWlsID0gZWxlbWVudDsKCX0KfQoKLyoKCXFfcmVtb3ZlX3RlbXBfdGFpbF9lbGVtZW50Cgl0ZW1wIFFldWW/obytILi2wfa4tyBlbGVtZW50uKYgwaawxcfPv6kgs9Gw3MHYtNkuCiovCnZvaWQgcV9yZW1vdmVfdGVtcF90YWlsX2VsZW1lbnQoc3RydWN0IEhNWF9NU0dfcXVldWUgKnEsIAlzdHJ1Y3QgSE1YX01TR19lbGVtZW50ICoqZWxlbWVudCkKewoJUHJpbnRFbnRlcigpOwoKICAgICAgCSplbGVtZW50ID0gcS0+dGVtcF90YWlsOwoKCWlmKHEtPnRlbXBfaGVhZC0+bmV4dCA9PSBOVUxMKSAvL2VsZW1lbnQgMbCzILOywLogsOa/7C4KCXsKCQlxLT50ZW1wX2hlYWQgPSBOVUxMOwoJCXEtPnRlbXBfdGFpbCA9IE5VTEw7Cgl9CgllbHNlCgl7CgkJcS0+dGVtcF90YWlsLT5wcmV2LT5uZXh0ID0gTlVMTDsKCQlxLT50ZW1wX3RhaWwgPSBxLT50ZW1wX3RhaWwtPnByZXY7Cgl9CglQcmludEV4aXQoKTsKfQoKLyoKCXFfZGVzdG9yeV90ZW1wX3RhaWwKCXRlbXAgUWV1ZcDHIGVsZW1lbnQgbWVtb3J5uKYgvNK46r3DxbK02S4KKi8Kdm9pZCBxX2Rlc3RvcnlfdGVtcF90YWlsKHN0cnVjdCBITVhfTVNHX3F1ZXVlICpxKQp7CglzdHJ1Y3QgSE1YX01TR19lbGVtZW50ICpxX2VsZW1lbnQ7CgoJUHJpbnRFbnRlcigpOwoKCWRvCgl7CgkJcV9lbGVtZW50ID0gcS0+dGVtcF90YWlsOwoJCXEtPnRlbXBfdGFpbCA9IHEtPnRlbXBfdGFpbC0+cHJldjsKCgoJfSB3aGlsZShxLT50ZW1wX3RhaWwgIT0gTlVMTCk7CglpZiAocS0+cFBvb2wpCgl7CgkJZnJlZShxLT5wUG9vbCk7CgkJcS0+cFBvb2wgPSBOVUxMOwoJfQoJaWYgKHEtPnBEYXRhUG9vbCkKCXsKCQlmcmVlKHEtPnBEYXRhUG9vbCk7CgkJcS0+cERhdGFQb29sID0gTlVMTDsKCX0KCglQcmludEV4aXQoKTsKfQoKCi8qCiAgICBsaXN0X3JlbV9uZXh0CiAgICBlbGVtZW50v6G8rSBkYXRhuKYgu+jBpsfRtNkuCiovCmludCBsaXN0X3JlbV9uZXh0KHN0cnVjdCBITVhfTVNHX3F1ZXVlICpsaXN0LCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGNoYXIgdGltZW91dGZsYWcsIHN0cnVjdCB0aW1lc3BlYyAqdGltZW8pCnsKCXN0cnVjdCBITVhfTVNHX2VsZW1lbnQgICAgICAgICAgICpvbGRfZWxlbWVudDsKCXVuc2lnbmVkIGxvbmcgcHJpbzsKCWludCByYyA9IDA7CgoJUHJpbnRFbnRlcigpOwoKCWxpc3QtPnJlYWRlcl9jb3VudF8rKzsKCglpZiAoKGxpc3Rfc2l6ZShsaXN0KSA9PSAwIHx8IGxpc3QtPnJlYWRlcl9jb3VudF8gPiAxKSAmJiAwID09IHJjKQoJewoJCWlmKFRSVUUgPT0gdGltZW91dGZsYWcpCgkJewoJCQlyYyA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoJmxpc3QtPnFfbm90X2VtcHR5XywgJmxpc3QtPnFfbG9ja18sIHRpbWVvKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmMgPSBwdGhyZWFkX2NvbmRfd2FpdCgmbGlzdC0+cV9ub3RfZW1wdHlfLCAmbGlzdC0+cV9sb2NrXyk7CgkJfQoJfQoKCWxpc3QtPnJlYWRlcl9jb3VudF8tLTsKCglpZihyYyAhPSAwKQoJewoJCVByaW50RGVidWcoIiVzIDogcmNbJWRdICEhXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKCQlyZXR1cm4gcmM7Cgl9CgoJcHJpbyA9IGxpc3RfZmluZF9oaWdoZXN0X3ByaW9yaXR5X2JpdG1hcChsaXN0KTsKCVByaW50RGVidWcoImxpc3RfZmluZF9oaWdoZXN0X3ByaW9yaXR5X2JpdG1hcCA6IHByaW8gPSAlZFxuIiwgcHJpbyk7CgoJbWVtY3B5KGRhdGEsIGxpc3QtPmhlYWRbcHJpb10tPmRhdGEsIHNpemUpOwoJb2xkX2VsZW1lbnQgPSBsaXN0LT5oZWFkW3ByaW9dOwoJaWYoTlVMTCA9PSBsaXN0LT5oZWFkW3ByaW9dLT5uZXh0KQoJewoJCWxpc3QtPmhlYWRbcHJpb10gPSBOVUxMOwoJCWxpc3QtPnRhaWxbcHJpb10gPSBOVUxMOwoJfQoJZWxzZQoJewoJCWxpc3QtPmhlYWRbcHJpb10gPSBsaXN0LT5oZWFkW3ByaW9dLT5uZXh0OwoJfQoKCXFfaW5zZXJ0X3RlbXBfdGFpbF9lbGVtZW50KGxpc3QsIG9sZF9lbGVtZW50KTsKCWxpc3QtPmN1cnJfbXNnX2NvdW50Xy0tOwoJbGlzdF9iaXRtYXBfY291bnRfZGVjcmVhc2UobGlzdCwgcHJpbyk7CgoJaWYobGlzdC0+Yml0bWFwX2NvdW50W3ByaW9dID09IDApCgkgICAgbGlzdF9jbGVhcl9iaXRtYXAobGlzdCwgcHJpbyk7CgoJaWYgKGxpc3QtPndyaXRlcl9jb3VudF8gPiAwKQoJICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJmxpc3QtPnFfbm90X2Z1bGxfKTsKCglQcmludEV4aXQoKTsKCglyZXR1cm4gcmM7Cn0KCgpzdGF0aWMgdm9pZCAqdGhyZWFkX2Z1bmNfKHZvaWQgKmFyZykKewoJc3RydWN0IEhNWF9UQVNLX2FyZyAqcCA9IChzdHJ1Y3QgSE1YX1RBU0tfYXJnICopYXJnOwoJaW50IHJjID0gMDsKCiNpZiBkZWZpbmVkKENPTkZJR19ERUJVRykKCXAtPnBpZCA9IGdldHBpZCgpOwoJcC0+dGlkID0gKGxvbmcgaW50KXN5c2NhbGwoNDIyMik7CiNlbmRpZgoKCXB0aHJlYWRfbXV0ZXhfbG9jaygmcC0+bG9ja18pOwoKCXdoaWxlIChwLT5zdGFydCA9PSAwICYmIDAgPT0gcmMpIC8vd2FpdCBzaWduYWwKCQlyYyA9IHB0aHJlYWRfY29uZF93YWl0KCZwLT5jb25kXywgJnAtPmxvY2tfKTsKCglwdGhyZWFkX211dGV4X3VubG9jaygmcC0+bG9ja18pOwoKI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHKQoKCXAtPnRocmVhZF9pZCA9IHB0aHJlYWRfc2VsZigpOwoJUHJpbnREZWJ1ZygiWyVzXSB0YXNrIHN0YXJ0ZWQuLi5cbiIsIHAtPm5hbWUpOwojZW5kaWYKCgkoKnAtPnN0YXJ0X2Z1bmNfKShwLT5hcmdfKTsKCglyZXR1cm4gTlVMTDsKfQoKCi8qCiAgICBITVhfVEFTS19DcmVhdGUKICAgIMXCvbrFqbimILv9vLrH0bTZLgoqLwppbnQgSE1YX1RBU0tfQ3JlYXRlKHZvaWQgKCpzdGFydF9mdW5jKSh2b2lkICopLCB1bnNpZ25lZCBsb25nIHByaW8sdW5zaWduZWQgbG9uZyBzdGFja19zaXplLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICphcmcsIHVuc2lnbmVkIGxvbmcgKnRhc2tJZCwgaW50IElzSm9pbmFibGUpCnsKICAgIGludCByYzsKICAgIHN0cnVjdCBITVhfVEFTSyAqdGFzazsKICAgIHB0aHJlYWRfYXR0cl90IHRocmVhZF9hdHRyOwogICAgc3RydWN0IHNjaGVkX3BhcmFtCXNjaFBhcmFtOwogICAgdW5zaWduZWQgY2hhciAqcHVjRHN0U3RhY2tBZGRyID0gTlVMTDsKCXVuc2lnbmVkIGNoYXIgKnB1Y1Rhc2tTdGFjazsKCiAgICByYyA9IHB0aHJlYWRfYXR0cl9pbml0ICgmdGhyZWFkX2F0dHIpOwogICAgaWYgKHJjKSB7CiAgICAgICAgcmV0dXJuIEhNWF9FUlJPUjsKICAgIH0KCglyYyA9IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSAoJnRocmVhZF9hdHRyLCBITVhfVEFTS19QVEhSRUFEX0RFRkFVTFRfUFJJTyk7CglpZiAocmMpIHsKCQlyZXR1cm4gSE1YX0VSUk9SOwoJfQoKCXB0aHJlYWRfYXR0cl9nZXRzY2hlZHBhcmFtKCZ0aHJlYWRfYXR0ciwgJnNjaFBhcmFtKTsKCXNjaFBhcmFtLnNjaGVkX3ByaW9yaXR5ID0gcHJpbzsKCXJjID0gcHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0gKCZ0aHJlYWRfYXR0ciwgJnNjaFBhcmFtKTsKCWlmIChyYykgewoJCXJldHVybiBITVhfRVJST1I7Cgl9CgogICAgaWYgKHN0YWNrX3NpemUgPCBITVhfVEFTS19QVEhSRUFEX1NUQUNLX01JTikKICAgICAgICBzdGFja19zaXplID0gSE1YX1RBU0tfUFRIUkVBRF9TVEFDS19NSU47CgoJcHVjVGFza1N0YWNrID0gbWFsbG9jKHN0YWNrX3NpemUrSE1YX1RBU0tfU1RBQ0tfT1ZFUkhFQURfU0laRStITVhfVEFTS19HVUFSRF9TSVpFKTsKCWlmIChwdWNUYXNrU3RhY2sgPT0gTlVMTCkKCQlyZXR1cm4gSE1YX0VSUk9SOwogICAgbWVtc2V0KHB1Y1Rhc2tTdGFjaywgMHhBNSwgc3RhY2tfc2l6ZStITVhfVEFTS19TVEFDS19PVkVSSEVBRF9TSVpFK0hNWF9UQVNLX0dVQVJEX1NJWkUgKTsKCiAgICBQcmludERlYnVnKCIlcyglZCkgOiBwdWNUYXNrU3RhY2sgPSAlcCwgc3RhY2tfc2l6ZT0gJWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHB1Y1Rhc2tTdGFjaywgc3RhY2tfc2l6ZSk7CiAgICByYyA9IHB0aHJlYWRfYXR0cl9zZXRzdGFjaygmdGhyZWFkX2F0dHIsICh2b2lkICopcHVjVGFza1N0YWNrLCBzdGFja19zaXplICk7CiAgICBpZiAocmMpIHsKICAgICAgICByZXR1cm4gSE1YX0VSUk9SOwogICAgfQoKICAgIHJjID0gcHRocmVhZF9hdHRyX2dldHN0YWNrKCZ0aHJlYWRfYXR0ciwodm9pZCAqKSZwdWNEc3RTdGFja0FkZHIsIChzaXplX3QgKikmc3RhY2tfc2l6ZSApOwogICAgaWYgKHJjKSB7CiAgICAgICAgcmV0dXJuIEhNWF9FUlJPUjsKICAgIH0KICAgIFByaW50RGVidWcoIiVzKCVkKSA6IHB1Y0RzdFN0YWNrQWRkciA9ICVwLCBzdGFja19zaXplPSAlZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgcHVjRHN0U3RhY2tBZGRyLCBzdGFja19zaXplKTsKCiAgICBpZiAoSXNKb2luYWJsZSA9PSBUUlVFKQogICAgewogICAgICAgIHJjID0gcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZ0aHJlYWRfYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpOwogICAgfQogICAgZWxzZSBpZihJc0pvaW5hYmxlID09IEZBTFNFKQogICAgewogICAgICAgIHJjID0gcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZ0aHJlYWRfYXR0ciwgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIFByaW50RXJyb3IoIiVzKCVzKSA6IElzSm9pbmFibGUgUGFyYW1ldGVyIEVycm9yISFcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAgICAgICAgcmV0dXJuIEhNWF9FUlJPUjsKICAgIH0KCiAgICBpZiAocmMpIHsKICAgICAgICBQcmludEVycm9yICgiJXMoJWQpIDogRmFpbGVkIHRvIElzSm9pbmFibGUgJXNcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHN0cmVycm9yIChyYykpOwogICAgICAgIHJldHVybiBITVhfRVJST1I7CiAgICB9CgogICAgaWYgKHRhc2sgPSAoc3RydWN0IEhNWF9UQVNLICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgSE1YX1RBU0spKSwgTlVMTCA9PSB0YXNrKSB7CiAgICAgICAgKnRhc2tJZCA9IDA7CiAgICAgICAgZnJlZShwdWNUYXNrU3RhY2spOwogICAgICAgIHJldHVybiBITVhfRVJST1I7CiAgICB9CgogICAgdGFzay0+dGFyZ18uc3RhcnRfZnVuY18JPSBzdGFydF9mdW5jOwogICAgdGFzay0+dGFyZ18uYXJnXyAJCT0gYXJnOwogICAgdGFzay0+dGFyZ18ucHJpb3JpdHlfCT0gcHJpbzsKICAgIHRhc2stPnRhcmdfLnN0YWNrU2l6ZV8JPSBzdGFja19zaXplOwogICAgdGFzay0+dGFyZ18uSXNKb2luYWJsZQk9IElzSm9pbmFibGU7CiAgICB0YXNrLT50YXJnXy5wdWNUYXNrU3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKXB1Y1Rhc2tTdGFjazsKICAgIHRhc2stPnRhcmdfLnB1bFN0YWNrU3RhcnRBZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcgKilwdWNEc3RTdGFja0FkZHI7CgogICAgcHRocmVhZF9tdXRleF9pbml0KCZ0YXNrLT50YXJnXy5sb2NrXywgTlVMTCk7CiAgICBwdGhyZWFkX2NvbmRfaW5pdCgmdGFzay0+dGFyZ18uY29uZF8sIE5VTEwpOwogICAgdGFzay0+dGFyZ18uc3RhcnQgPSAwOwoKICAgIHN0cm5jcHkodGFzay0+dGFyZ18ubmFtZSwgbmFtZSwgc2l6ZW9mKHRhc2stPnRhcmdfLm5hbWUpLTEpOwoKICAgIHJjID0gcHRocmVhZF9jcmVhdGUoJnRhc2stPnRhc2tfLCAmdGhyZWFkX2F0dHIsIHRocmVhZF9mdW5jXywgJnRhc2stPnRhcmdfKTsKICAgIGlmIChyYykgewogICAgICAgIGZyZWUocHVjVGFza1N0YWNrKTsKICAgICAgICBmcmVlKHRhc2spOwogICAgICAgICp0YXNrSWQgPSAwOwogICAgICAgIHJldHVybiBITVhfRVJST1I7CiAgICB9CgogICAgKnRhc2tJZCA9ICh1bnNpZ25lZCBsb25nKXRhc2s7CgojaWYgZGVmaW5lZChDT05GSUdfVEFTS19QUklPUklUWSkKCXB0aHJlYWRfc2V0c2NoZWRwYXJhbSh0YXNrLT50YXNrXywgSE1YX1RBU0tfUFRIUkVBRF9ERUZBVUxUX1BSSU8sICZzY2hQYXJhbSk7CiNlbmRpZgoKICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZ0aHJlYWRfYXR0cik7CiAgICBQcmludERlYnVnKCIlcyglZCkgOiBzX3VjVGFza0NvdW50ID0gJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgc191Y1Rhc2tDb3VudCk7CiAgICByZXR1cm4gSE1YX09LOwp9CgppbnQgSE1YX1RBU0tfU3RhcnQodW5zaWduZWQgbG9uZyB0YXNrSWQpCnsKICAgIHN0cnVjdCBITVhfVEFTSyAqdGFzayA9IChzdHJ1Y3QgSE1YX1RBU0sgKil0YXNrSWQ7CiAgICBQcmludEVudGVyKCk7CgogICAgaWYoTlVMTCA9PSB0YXNrKQogICAgewogICAgICAgIFByaW50RXJyb3IoIiVzKCVkKSA6IHRhc2sgaXMgTlVMTCEhXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogICAgICAgIHJldHVybiBITVhfRVJST1I7CiAgICB9CgogICAgcHRocmVhZF9tdXRleF9sb2NrKCZ0YXNrLT50YXJnXy5sb2NrXyk7CiAgICBpZiAodGFzay0+dGFyZ18uc3RhcnQgPT0gMCkgewogICAgCXRhc2stPnRhcmdfLnN0YXJ0ID0gMTsKICAgIAlwdGhyZWFkX2NvbmRfc2lnbmFsKCZ0YXNrLT50YXJnXy5jb25kXyk7CiAgICB9CiAgICBwdGhyZWFkX211dGV4X3VubG9jaygmdGFzay0+dGFyZ18ubG9ja18pOwogICAgUHJpbnRFeGl0KCk7CiAgICByZXR1cm4gSE1YX09LOwp9CgovKgogICAgSE1YX1RBU0tfU3RvcAogICAgVGFza7imILz2x+C1yCDAzMjEv6EgwMwgx9S89rimIMijw+LH2LW1IFNUT1DAuiC1x8H2IL7KtMK02S4KICAgILTcwfYgY291bnS4uCAwwLi3ziC4uLXntNkuCiovCmludCBITVhfVEFTS19TdG9wKHVuc2lnbmVkIGxvbmcgdGFza0lkKQp7CiAgICBzdHJ1Y3QgSE1YX1RBU0sgKnRhc2sgPSAoc3RydWN0IEhNWF9UQVNLICopdGFza0lkOwoKICAgIFByaW50RW50ZXIoKTsKCiAgICBpZiAodGFzayA9PSBOVUxMKSB7CiAgICAgICAgcmV0dXJuIEhNWF9PSzsKICAgIH0KCiAgICBwdGhyZWFkX211dGV4X2xvY2soJnRhc2stPnRhcmdfLmxvY2tfKTsKICAgIGlmICh0YXNrLT50YXJnXy5zdGFydCAhPSAwKQogICAgICAgIHRhc2stPnRhcmdfLnN0YXJ0ID0gMDsKICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0YXNrLT50YXJnXy5sb2NrXyk7CgogICAgcmV0dXJuIEhNWF9PSzsKfQoKLyoKICAgIHNsZWVwCiAgICDFwr26xam4piDA4cDnv+602S4KKi8KaW50IEhNWF9TbGVlcCh1bnNpZ25lZCBsb25nIHVsdGltZSkKewoJc3RydWN0IHRpbWVzcGVjIGRlbGF5OwoJc3RydWN0IHRpbWVzcGVjIHJlbTsKCWludCByYzsKCglpZiAodWx0aW1lICE9IDApCgl7CgkJSE1YX1RBU0tfQ2hlY2tDYWxsYmFjaygpOwoJfQoJZGVsYXkudHZfc2VjID0gdWx0aW1lIC8gMTAwMDsKCWRlbGF5LnR2X25zZWMgPSAodWx0aW1lICUgMTAwMCkgKiAxMDAwMDAwOwoKCWZvciAoOzspIHsKCQlyYyA9IG5hbm9zbGVlcCgmZGVsYXksICZyZW0pOwoJCWlmICgwICE9IHJjKSB7CgkJCWlmIChFSU5UUiA9PSBlcnJubykgewoJCQkJZGVsYXkgPSByZW07CgkJCQljb250aW51ZTsKCQkJfQoJCQlyZXR1cm4gSE1YX0VSUk9SOwoJCX0KCQlicmVhazsKCX0KCglyZXR1cm4gSE1YX09LOwp9CgovKgogICAgSE1YX1RBU0tfRGVzdHJveQogICAgxcK9usWpuKYgvNK46sfRtNkuCiovCmludCBITVhfVEFTS19EZXN0cm95KHVuc2lnbmVkIGxvbmcgdGFza0lkKQp7CiAgICBpbnQgcmM7CiAgICBzdHJ1Y3QgSE1YX1RBU0sgKnRhc2sgPSAoc3RydWN0IEhNWF9UQVNLICopdGFza0lkOwoKICAgIGlmKCB0YXNrSWQgPT0gKHVuc2lnbmVkIGxvbmcpTlVMTCApCiAgICB7CiAgICAgICAgUHJpbnREZWJ1ZygiJXMoJWQpIHRhc2tJZCA9PSBOVUxMXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKICAgICAgICByZXR1cm4gSE1YX0VSUk9SOwogICAgfQogICAgZWxzZQogICAgewoJCXB0aHJlYWRfbXV0ZXhfbG9jaygmdGFzay0+dGFyZ18ubG9ja18pOwoJCWlmICh0YXNrLT50YXJnXy5zdGFydCA9PSAxKQoJCXsKCQkJdGFzay0+dGFyZ18uc3RhcnQgPSAwOwoJCX0KCQlyYyA9IHB0aHJlYWRfY2FuY2VsKHRhc2stPnRhc2tfKTsKCQlpZiAocmMpCgkJewoJCQlQcmludEVycm9yKCJbSE1YX1RBU0tfRGVzdHJveV0gd2FybmluZyA6IHRoZXJlIGlzIG5vIHRocmVhZCBpbiBwdGhyZWFkIHRhc2tJZCglMDhYKSBwdGhyZWFkSWQoJTA4WClcbiIsIHRhc2tJZCwgdGFzay0+dGFza18pOwoJCX0KCQlITVhfU2xlZXAoMSk7CiNpZiBkZWZpbmVkKENPTkZJR19USFJFQURfSk9JTl9URU1QT1JBUlkpCiNlbHNlCgkJaWYgKHRhc2stPnRhcmdfLklzSm9pbmFibGUpCiNlbmRpZgoJCQlwdGhyZWFkX2pvaW4odGFzay0+dGFza18sIE5VTEwpOwoKCQlmcmVlKHRhc2stPnRhcmdfLnB1Y1Rhc2tTdGFjayk7CgkJcHRocmVhZF9tdXRleF91bmxvY2soJnRhc2stPnRhcmdfLmxvY2tfKTsKICAgIH0KCiAgICBmcmVlKHRhc2spOwoKICAgIHJldHVybiBITVhfT0s7Cn0KCi8qCiAgICBITVhfVEFTS19TZXRDdXJyZW50UHJpb3JpdHkKICAgILv1t86/7iC/7LyxvPjAp7imILy8xsPH0bTZLgoqLwppbnQgSE1YX1RBU0tfU2V0Q3VycmVudFByaW9yaXR5KHVuc2lnbmVkIGxvbmcgdGFza0lkLCB1bnNpZ25lZCBsb25nIG5ld3ByaW9yaXR5KQp7CglpbnQgcmM7CglpbnQgcG9saWN5OwoJc3RydWN0IEhNWF9UQVNLICp0YXNrID0gKHN0cnVjdCBITVhfVEFTSyAqKXRhc2tJZDsKCXN0cnVjdCBzY2hlZF9wYXJhbQlzY2hQYXJhbTsKCglpZiAodGFzayA9PSBOVUxMKQoJewoJCXJldHVybiBITVhfRVJST1I7Cgl9CgoJcmMgPSBwdGhyZWFkX2dldHNjaGVkcGFyYW0odGFzay0+dGFza18sICZwb2xpY3ksICZzY2hQYXJhbSk7CglpZiAoc2NoUGFyYW0uc2NoZWRfcHJpb3JpdHkgPT0gKGludCluZXdwcmlvcml0eSkKCXsKCQlyZXR1cm4gSE1YX09LOwoJfQoKCXNjaFBhcmFtLnNjaGVkX3ByaW9yaXR5IAk9IG5ld3ByaW9yaXR5OwoKCXB0aHJlYWRfbXV0ZXhfbG9jaygmdGFzay0+dGFyZ18ubG9ja18pOwoJcmMgPSBwdGhyZWFkX3NldHNjaGVkcGFyYW0odGFzay0+dGFza18sIHBvbGljeSwgJnNjaFBhcmFtKTsKCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0YXNrLT50YXJnXy5sb2NrXyk7CgoJaWYgKHJjKSB7CgkJcmV0dXJuIEhNWF9FUlJPUjsKCX0KCglyZXR1cm4gSE1YX09LOwp9CgoKCi8qCiAgICBsaXN0X2luaXQKICAgIEhNWF9NU0dfcXVldWUgsbjBtsO8uKYgw8qx4sitIMfRtNkuCiovCnZvaWQgbGlzdF9pbml0KHN0cnVjdCBITVhfTVNHX3F1ZXVlICpsaXN0LCB1bnNpZ25lZCBsb25nIHVsU2l6ZSwgdW5zaWduZWQgbG9uZyB1bENvdW50LCB1bnNpZ25lZCBjaGFyIHVjU3VzcGVuZFR5cGUpCnsKICAgIGludCBpOwoKICAgIGxpc3QtPmN1cnJfbXNnX2NvdW50XyA9IDA7CiAgICBsaXN0LT5tc2dfc2l6ZV8gPSB1bFNpemU7CiAgICBsaXN0LT5tc2dfY291bnRfID0gdWxDb3VudDsKICAgIGxpc3QtPndyaXRlcl9jb3VudF8gPSAwOwogICAgbGlzdC0+cmVhZGVyX2NvdW50XyA9IDA7CiAgICBsaXN0LT5zdXNwZW5kX3R5cGVfID0gdWNTdXNwZW5kVHlwZTsKICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbGlzdC0+cV9sb2NrXywgTlVMTCk7CiAgICBwdGhyZWFkX2NvbmRfaW5pdCgmbGlzdC0+cV9ub3RfZW1wdHlfLCBOVUxMKTsKICAgIHB0aHJlYWRfY29uZF9pbml0KCZsaXN0LT5xX25vdF9mdWxsXywgTlVMTCk7CgogICAgbGlzdC0+dGVtcF9oZWFkID0gTlVMTDsKICAgIGxpc3QtPnRlbXBfdGFpbCA9IE5VTEw7CgogICAgZm9yKGk9MDsgaTxNU0dfUFJJT1JJVFlfTUFYOyBpKyspCiAgICB7CiAgICAgICAgbGlzdC0+aGVhZFtpXSA9IE5VTEw7CiAgICAgICAgbGlzdC0+dGFpbFtpXSA9IE5VTEw7CiAgICAgICAgbGlzdC0+Yml0bWFwX2NvdW50W2ldID0gMDsKICAgICAgICBsaXN0LT5iaXRtYXBbaV0gPSAwOwogICAgfQoKI2lmZGVmIEhNWF9NU0dfREVCVUcKICAgIGxpc3QtPnNlbmRUaWNrID0gMDsKICAgIGxpc3QtPnJlY2VpdmVUaWNrID0gMDsKICAgIGxpc3QtPmxhc3RTZW5kVGljayA9IDA7CiAgICBsaXN0LT5sYXN0UmVjZWl2ZVRpY2sgPSAwOwojZW5kaWYKICAgIHJldHVybjsKfQoKCgovKgogICAgbGlzdF9kZXN0cm95CiAgICBITVhfTVNHX3F1ZXVlILG4wbbDvLimILzSuOq9w8WytNkuCiovCnZvaWQgbGlzdF9kZXN0cm95KHN0cnVjdCBITVhfTVNHX3F1ZXVlICpsaXN0KQp7Cgl2b2lkICAgICAgICAgICAgICAgKmRhdGE7CgoJZGF0YSA9IChjaGFyICopbWFsbG9jKGxpc3QtPm1zZ19zaXplXyk7CgoJd2hpbGUgKGxpc3Rfc2l6ZShsaXN0KSA+IDApCgl7CgkJaWYgKCBsaXN0X3JlbV9uZXh0KGxpc3QsICh2b2lkICopZGF0YSwgbGlzdC0+bXNnX3NpemVfLCBGQUxTRSwgRkFMU0UpICE9IDAgKQoJCXsKCQkJUHJpbnRFcnJvcigiJXMgOiBsaXN0X3JlbV9uZXh0IEVycm9yISFcbiIsIF9fZnVuY19fKTsKCQl9Cgl9CgoJZnJlZShkYXRhKTsKCXJldHVybjsKfQoKCgovKgogICAgbGlzdF9pbnNfbmV4dAogICAgZWxlbWVudL+hIGRhdGG4piDD37Chx9G02S4KKi8KaW50IGxpc3RfaW5zX25leHQoc3RydWN0IEhNWF9NU0dfcXVldWUgKmxpc3QsIHVuc2lnbmVkIGxvbmcgcHJpbywgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBjaGFyIHRpbWVvdXRmbGFnLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVvKQp7CglzdHJ1Y3QgSE1YX01TR19lbGVtZW50ICAgICAgICAgICAqbmV3X2VsZW1lbnQ7CglpbnQgcmMgPSAwOwoKCVByaW50RW50ZXIoKTsKCglsaXN0LT53cml0ZXJfY291bnRfKys7CgoJd2hpbGUgKGxpc3QtPm1zZ19jb3VudF8gPT0gbGlzdC0+Y3Vycl9tc2dfY291bnRfICYmIDAgPT0gcmMpCgl7CgkgICAgaWYoVFJVRSA9PSB0aW1lb3V0ZmxhZykKCSAgICB7CgkgICAgICAgIHJjID0gcHRocmVhZF9jb25kX3RpbWVkd2FpdCgmbGlzdC0+cV9ub3RfZnVsbF8sICZsaXN0LT5xX2xvY2tfLCB0aW1lbyk7CgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkgICAgICAgIHJjID0gcHRocmVhZF9jb25kX3dhaXQoJmxpc3QtPnFfbm90X2Z1bGxfLCAmbGlzdC0+cV9sb2NrXyk7CgkgICAgfQoJfQoKCWxpc3QtPndyaXRlcl9jb3VudF8tLTsKCglpZihyYyAhPSAwKQoJewoJICAgIFByaW50RGVidWcoIiVzIDogcmNbJWRdICEhXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKCSAgICByZXR1cm4gcmM7Cgl9CgoJcV9yZW1vdmVfdGVtcF90YWlsX2VsZW1lbnQobGlzdCwgJm5ld19lbGVtZW50KTsKCgltZW1jcHkobmV3X2VsZW1lbnQtPmRhdGEsIGRhdGEsIHNpemUpOwoKCWlmKGxpc3QtPnRhaWxbcHJpb10gPT0gTlVMTCkKCXsKCQlsaXN0LT5oZWFkW3ByaW9dID0gbmV3X2VsZW1lbnQ7CgkJbmV3X2VsZW1lbnQtPm5leHQgPSBOVUxMOwoJCW5ld19lbGVtZW50LT5wcmV2ID0gTlVMTDsKCQlsaXN0LT50YWlsW3ByaW9dID0gbmV3X2VsZW1lbnQ7Cgl9CgllbHNlCgl7CgkJbGlzdC0+dGFpbFtwcmlvXS0+bmV4dCA9IG5ld19lbGVtZW50OwoJCW5ld19lbGVtZW50LT5uZXh0ID0gTlVMTDsKCQluZXdfZWxlbWVudC0+cHJldiA9IGxpc3QtPnRhaWxbcHJpb107CgkJbGlzdC0+dGFpbFtwcmlvXSA9IG5ld19lbGVtZW50OwoJfQoKCWxpc3QtPmN1cnJfbXNnX2NvdW50XysrOwoJbGlzdF9iaXRtYXBfY291bnRfaW5jcmVhc2UobGlzdCwgcHJpbyk7CglsaXN0X3NldF9iaXRtYXAobGlzdCwgcHJpbyk7CgoJaWYgKGxpc3QtPnJlYWRlcl9jb3VudF8gPiAwKQoJCXB0aHJlYWRfY29uZF9zaWduYWwoJmxpc3QtPnFfbm90X2VtcHR5Xyk7CgoJUHJpbnRFeGl0KCk7CglyZXR1cm4gSE1YX09LOwp9CgoKCgovKgogICAgSE1YX01TR19Jbml0CiAgICC43ry8wfYgxaW4piDDyrHiyK0gx9G02S4KKi8KaW50IEhNWF9NU0dfSW5pdCh2b2lkKQp7CiNpZiBkZWZpbmVkKEhNWF9NU0dfREVCVUcpCglUQUlMUV9JTklUKCZtc2dfcV9saXN0X2hlYWQpOwojZW5kaWYKICAgIHJldHVybiBITVhfT0s7Cn0KCgovKgogICAgSE1YX01TR19DcmVhdGUKICAgILjevLzB9iDFpbimILv9vLrH0bTZLgoqLwppbnQgSE1YX01TR19DcmVhdGUodW5zaWduZWQgbG9uZyBxX2NvdW50LCB1bnNpZ25lZCBsb25nIG1zZ19zaXplLAoJY29uc3QgY2hhciAqcV9uYW1lLCB1bnNpZ25lZCBsb25nICpxX2lkLCBITVhfU1VTUEVORFRZUEUgc3VzcGVuZFR5cGUpCnsKICAgIHN0cnVjdCBITVhfTVNHX3F1ZXVlICAgICAgICAgICAgICAgKnE7CiAgICBzdHJ1Y3QgSE1YX01TR19lbGVtZW50ICAgICAgICAgICAqcV9lbGVtZW50OwogICAgdW5zaWduZWQgbG9uZwkJCQkJaTsKICAgIHN0cnVjdCBITVhfTVNHX2VsZW1lbnQgICAgICAgICAgICpxX2VsZW1lbnRfcG9vbDsKCXVuc2lnbmVkIGNoYXIJCQkJCSpkYXRhX3Bvb2w7CglIQVBQWShxX25hbWUpOwoKICAgIFByaW50RW50ZXIoKTsKCiAgICBpZihzdXNwZW5kVHlwZSA+PSBITVhfU1VTUEVORFRZUEVfTUFYKQogICAgewogICAgICAgIFByaW50RXJyb3IoIiVzWyVkXSA6IHVsU3VzcGVuZFR5cGUgJWQgRXJyb3JcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sICBzdXNwZW5kVHlwZSk7CiAgICAgICAgcmV0dXJuIEhNWF9FUlJPUjsKICAgIH0KCiAgICBpZigocSA9IChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IEhNWF9NU0dfcXVldWUpKSkgPT0gTlVMTCkKICAgIHsKICAgICAgICBQcmludEVycm9yKCIlc1slZF0gOiBtYWxsb2MgRXJyb3JcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwogICAgICAgIHJldHVybiBITVhfRVJST1I7CiAgICB9CgoJbWVtc2V0KHEsIDAsIHNpemVvZihzdHJ1Y3QgSE1YX01TR19xdWV1ZSkpOwoKICAgIGxpc3RfaW5pdChxLCBtc2dfc2l6ZSwgcV9jb3VudCwgc3VzcGVuZFR5cGUpOwoJcV9lbGVtZW50X3Bvb2wgPSAoc3RydWN0IEhNWF9NU0dfZWxlbWVudCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IEhNWF9NU0dfZWxlbWVudCkqcV9jb3VudCk7CglkYXRhX3Bvb2wgPSAodW5zaWduZWQgY2hhciAqKW1hbGxvYyhtc2dfc2l6ZSpxX2NvdW50KTsKICAgIGZvcihpPTA7IGk8cV9jb3VudDsgaSsrKQogICAgewoJCXFfZWxlbWVudCA9ICZxX2VsZW1lbnRfcG9vbFtpXTsKCQlxX2VsZW1lbnQtPmRhdGEgPSAmZGF0YV9wb29sW2kqbXNnX3NpemVdOwogICAgICAgIHFfaW5zZXJ0X3RlbXBfdGFpbF9lbGVtZW50KHEsIHFfZWxlbWVudCk7CiAgICB9CglxLT5wRGF0YVBvb2wgPSBkYXRhX3Bvb2w7CglxLT5wUG9vbCA9IHFfZWxlbWVudF9wb29sOwoKICAgICpxX2lkID0gKHVuc2lnbmVkIGxvbmcpcTsKCiNpZiBkZWZpbmVkKEhNWF9NU0dfREVCVUcpCglUQUlMUV9JTlNFUlRfVEFJTCgmbXNnX3FfbGlzdF9oZWFkLCBxLCBlbnRyaWVzKTsKI2VuZGlmCiNpZiBkZWZpbmVkKENPTkZJR19ERUJVRykKCWlmIChxX25hbWUpCgkJc3RybmNweShxLT5uYW1lLCBxX25hbWUsIHNpemVvZihxLT5uYW1lKS0xKTsKCWVsc2UKCQlxLT5uYW1lWzBdID0gMDsKI2VuZGlmCglQcmludEV4aXQoKTsKCiAgICByZXR1cm4gSE1YX09LOwp9CgoKLyoKICAgIEhNWF9NU0dfRGVzdHJveQogICAguN68vMH2xaW4piC80rjqvcPFsrTZLgoqLwppbnQgSE1YX01TR19EZXN0cm95KHVuc2lnbmVkIGxvbmcgcV9pZCkKewoJc3RydWN0IEhNWF9NU0dfcXVldWUgKnE7CgoJUHJpbnRFbnRlcigpOwoKCXEgPSAoc3RydWN0IEhNWF9NU0dfcXVldWUgKilxX2lkOwoKCWlmKHEgPT0gTlVMTCkKCXsKCQlyZXR1cm4gSE1YX0VSUk9SOwoJfQoKCXB0aHJlYWRfY29uZF9kZXN0cm95KCZxLT5xX25vdF9mdWxsXyk7CglwdGhyZWFkX2NvbmRfZGVzdHJveSgmcS0+cV9ub3RfZW1wdHlfKTsKCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmcS0+cV9sb2NrXyk7CgoJbGlzdF9kZXN0cm95KHEpOwoJcV9kZXN0b3J5X3RlbXBfdGFpbChxKTsKCiNpZiBkZWZpbmVkKEhNWF9NU0dfREVCVUcpCglUQUlMUV9SRU1PVkUoJm1zZ19xX2xpc3RfaGVhZCwgcSwgZW50cmllcyk7CiNlbmRpZgoKCWlmKHEgIT0gTlVMTCkKCXsKCQlmcmVlKHEpOwoJfQoKCVByaW50RXhpdCgpOwoKCXJldHVybiBITVhfT0s7Cn0KCmludCBITVhfTVNHX0NsZWFyKHVuc2lnbmVkIGxvbmcgcV9pZCkKewoJc3RydWN0IEhNWF9NU0dfcXVldWUgCQkJICAqcTsKCWludCByYyA9IEhNWF9PSzsKCS8vCSAgc3RydWN0IHRpbWVzcGVjIGN1cl90aW1lOwoJbG9uZyBsb25nIGV4cF9uc2VjOwoJc3RydWN0IHRpbWVzcGVjIHRpbWVvLCBjdXJfdGltZTsKCXVuc2lnbmVkIGxvbmcgc2l6ZTsKCXZvaWQJCQkqcEJ1ZjsKCgoJUHJpbnRFbnRlcigpOwoKCXEgPSAoc3RydWN0IEhNWF9NU0dfcXVldWUgKilxX2lkOwoKCXNpemUgPSBxLT5tc2dfc2l6ZV87CglwQnVmID0gbWFsbG9jKHNpemUpOwoJaWYgKHBCdWYgPT0gTlVMTCkKCQlyZXR1cm4gSE1YX0VSUk9SOwoKCSh2b2lkKXB0aHJlYWRfbXV0ZXhfbG9jaygmcS0+cV9sb2NrXyk7CglkbwoJewoKCQljbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmY3VyX3RpbWUpOwoJCWV4cF9uc2VjID0gKGxvbmcgbG9uZyljdXJfdGltZS50dl9zZWMgKiAobG9uZyBsb25nKTEwMDAgKiAobG9uZyBsb25nKTEwMDAgKiAobG9uZyBsb25nKTEwMDAgKyAobG9uZyBsb25nKWN1cl90aW1lLnR2X25zZWM7CgkJdGltZW8udHZfc2VjID0gZXhwX25zZWMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKTsKCQl0aW1lby50dl9uc2VjID0gZXhwX25zZWMgJSAoMTAwMCAqIDEwMDAgKiAxMDAwKTsKCgkJcmMgPSBsaXN0X3JlbV9uZXh0KHEsIHBCdWYsIHNpemUsIFRSVUUsICZ0aW1lbyk7CgkJaWYoSE1YX09LICE9IHJjKQoJCXsKCQkJaWYoRVRJTUVET1VUID09IHJjKQoJCQl7CgkJCQkodm9pZClwdGhyZWFkX211dGV4X3VubG9jaygmcS0+cV9sb2NrXyk7CgkJCQlmcmVlKHBCdWYpOwoJCQkJcmV0dXJuIEhNWF9PSzsKCQkJfQoJCX0KCX13aGlsZSAoMSk7CiNpZmRlZiBERUJVR19NU0dfTElTVF9QUklOVAoJcHJpbnRfbGlzdChxKTsKI2VuZGlmCgoJKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOwoKCWZyZWUocEJ1Zik7CglQcmludEV4aXQoKTsKCXJldHVybiBITVhfT0s7Cn0KCgovKgogICAgSE1YX01TR19TZW5kCiAgICC43ry8wfa4piC6uLO9tNkuCiovCmludCBITVhfTVNHX1NlbmQodW5zaWduZWQgbG9uZyBxX2lkLCBjb25zdCB2b2lkICptc2csIHVuc2lnbmVkIGxvbmcgc2l6ZSkKewogICAgc3RydWN0IEhNWF9NU0dfcXVldWUgKnE7CiAgICBpbnQgcmMgPSBITVhfT0s7CiAgICB1bnNpZ25lZCBsb25nIHByaW87CgogICAgUHJpbnRFbnRlcigpOwoKICAgIHEgPSAoc3RydWN0IEhNWF9NU0dfcXVldWUgKilxX2lkOwoKICAgIGlmKHNpemUgPiBxLT5tc2dfc2l6ZV8pCiAgICB7CiAgICAgICAgUHJpbnRFcnJvcigiJXNbJWRdIDogc2l6ZSAlbGQgRXJyb3JcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHNpemUpOwogICAgICAgIHJldHVybiBITVhfRVJST1I7CiAgICB9CgoJSE1YX1RBU0tfQ2hlY2tDYWxsYmFjaygpOwoKCXJjID0gUF9NU0dfQ2hlY2socSwgcV9pZCk7CglpZiAoSE1YX09LICE9IHJjKQoJewojaWYgZGVmaW5lZChDT05GSUdfREVCVUcpCgkJUHJpbnRFcnJvcigiJXMoJWQpIDogUF9NU0dfQ2hlY2sgOiBITVhfTVNHX0ZVTEwhISBxdWV1ZSBuYW1lICglcylcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcS0+bmFtZSk7CiNlbmRpZgoJCXJldHVybiByYzsKCX0KCiAgICBpZihITVhfU1VTUEVORFRZUEVfUFJJT1JJVFkgPT0gcS0+c3VzcGVuZF90eXBlXykKICAgIHsKICAgICAgICByYyA9IGxpc3RfZmluZF9tc2dfcV9wcmlvcml0eV9mcm9tX3Rhc2tfcHJpb3JpdHkoJnByaW8pOwogICAgICAgIGlmKHJjICE9IEhNWF9PSykKICAgICAgICB7CgkJCXByaW8gPSBNU0dfUFJJT1JJVFkwOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBwcmlvID0gTVNHX1BSSU9SSVRZMDsKICAgIH0KCiAgICAodm9pZClwdGhyZWFkX211dGV4X2xvY2soJnEtPnFfbG9ja18pOwoKICAgIHJjID0gbGlzdF9pbnNfbmV4dChxLCBwcmlvLCBtc2csIHNpemUsIEZBTFNFLCBOVUxMKTsKCiAgICBpZihITVhfT0sgIT0gcmMpCiAgICB7CiAgICAgICAgUHJpbnRFcnJvcigiJXMgOiBsaXN0X2luc19uZXh0KCkgcmNbJWRdIEVycm9yISFcbiIsIF9fRlVOQ1RJT05fXywgcmMpOwogICAgICAgICh2b2lkKXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxLT5xX2xvY2tfKTsKICAgICAgICByZXR1cm4gcmM7CiAgICB9CgojaWZkZWYgREVCVUdfTVNHX0xJU1RfUFJJTlQKICAgIHByaW50X2xpc3QocSk7CiNlbmRpZgoKICAgICh2b2lkKXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxLT5xX2xvY2tfKTsKCiNpZmRlZiBITVhfTVNHX0RFQlVHCiAgICBxLT5sYXN0U2VuZFRpY2sgPSBWS19USU1FUl9HZXRTeXN0ZW1UaWNrKCk7CiNlbmRpZgoKICAgIFByaW50RXhpdCgpOwoKICAgIHJldHVybiBITVhfT0s7Cn0KCgoKLyoKICAgIEhNWF9NU0dfU2VuZFRpbWVvdXQKICAgILjevLzB9rimIFRpbWVvdXSzu7+hILq4s7202S4KKi8KaW50IEhNWF9NU0dfU2VuZFRpbWVvdXQodW5zaWduZWQgbG9uZyBxX2lkLCBjb25zdCB2b2lkICptc2csIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQp7CglzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqcTsKCWludCByYyA9IEhNWF9PSzsKCXVuc2lnbmVkIGxvbmcgcHJpbyA9IDA7CglzdHJ1Y3QgdGltZXNwZWMgdGltZW87CglzdHJ1Y3QgdGltZXNwZWMgY3VyX3RpbWU7Cglsb25nIGxvbmcgZXhwX25zZWM7CgoJUHJpbnRFbnRlcigpOwoKCWlmICh0aW1lb3V0ICE9IDApCgl7Ci8vCQlITVhfVEFTS19DaGVja0NhbGxiYWNrKCk7Cgl9CglpZiAodGltZW91dCA9PSAweEZGRkZGRkZGKQoJewoJCXJldHVybiBITVhfTVNHX1NlbmQocV9pZCwgbXNnLCBzaXplKTsKCX0KCglxID0gKHN0cnVjdCBITVhfTVNHX3F1ZXVlICopcV9pZDsKCglpZihzaXplID4gcS0+bXNnX3NpemVfKQoJewoJCVByaW50RXJyb3IoIiVzWyVkXSA6IHNpemUgJWxkIEVycm9yXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBzaXplKTsKCQlyZXR1cm4gSE1YX0VSUk9SOwoJfQoKCXJjID0gUF9NU0dfQ2hlY2socSwgcV9pZCk7CglpZiAoSE1YX09LICE9IHJjKQoJewojaWYgZGVmaW5lZChDT05GSUdfREVCVUcpCgkJUHJpbnRFcnJvcigiJXMoJWQpIDogUF9NU0dfQ2hlY2sgOiBITVhfTVNHX0ZVTEwhISBxdWV1ZSBuYW1lIDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcS0+bmFtZSk7CiNlbmRpZgoJCXJldHVybiByYzsKCX0KCglpZihITVhfU1VTUEVORFRZUEVfUFJJT1JJVFkgPT0gcS0+c3VzcGVuZF90eXBlXykKCXsKCQlyYyA9IGxpc3RfZmluZF9tc2dfcV9wcmlvcml0eV9mcm9tX3Rhc2tfcHJpb3JpdHkoJnByaW8pOwoJCWlmKHJjICE9IEhNWF9PSykKCQl7CgkJCXByaW8gPSBNU0dfUFJJT1JJVFkwOwoJCX0KCX0KCWVsc2UKCXsKCQlwcmlvID0gTVNHX1BSSU9SSVRZMDsKCX0KCgljbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmY3VyX3RpbWUpOwoJZXhwX25zZWMgPSAobG9uZyBsb25nKWN1cl90aW1lLnR2X3NlYyAqIDEwMDAgKiAxMDAwICogMTAwMCArIGN1cl90aW1lLnR2X25zZWM7CglpZiAodGltZW91dCAhPSAwKQoJCWV4cF9uc2VjICs9ICh0aW1lb3V0ICogMTAwMCAtIDk5OSkgKiAxMDAwOwoJdGltZW8udHZfc2VjID0gZXhwX25zZWMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKTsKCXRpbWVvLnR2X25zZWMgPSBleHBfbnNlYyAlICgxMDAwICogMTAwMCAqIDEwMDApOwoKCSh2b2lkKXB0aHJlYWRfbXV0ZXhfbG9jaygmcS0+cV9sb2NrXyk7CgoJcmMgPSBsaXN0X2luc19uZXh0KHEsIHByaW8sIG1zZywgc2l6ZSwgVFJVRSwgJnRpbWVvKTsKCWlmKEhNWF9PSyAhPSByYykKCXsKCSAgICAodm9pZClwdGhyZWFkX211dGV4X3VubG9jaygmcS0+cV9sb2NrXyk7CgoJICAgIGlmKEVUSU1FRE9VVCA9PSByYykKCSAgICB7CgkgICAgICAgIFByaW50RGVidWcoIiVzIDogbGlzdF9pbnNfbmV4dCgpIHJjWyVkXSBITVhfVElNRU9VVCEhXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKCSAgICAgICAgcmV0dXJuIEhNWF9USU1FT1VUOwoJICAgIH0KCSAgICBlbHNlCgkgICAgewoJICAgICAgICBQcmludEVycm9yKCIlcyA6IGxpc3RfaW5zX25leHQoKSByY1slZF0gRXJyb3IhIVxuIiwgX19GVU5DVElPTl9fLCByYyk7CgkgICAgICAgIHJldHVybiBITVhfRVJST1I7CgkgICAgfQoJfQoKI2lmZGVmIERFQlVHX01TR19MSVNUX1BSSU5UCglwcmludF9saXN0KHEpOwojZW5kaWYKCgkodm9pZClwdGhyZWFkX211dGV4X3VubG9jaygmcS0+cV9sb2NrXyk7CgoJUHJpbnRFeGl0KCk7CgoJcmV0dXJuIEhNWF9PSzsKfQoKCi8qCiAgICBITVhfTVNHX1NlbmRVcmdlbnQKICAgILHksd4guN68vMH2uKYgurizvbTZLgoqLwppbnQgSE1YX01TR19TZW5kVXJnZW50KHVuc2lnbmVkIGxvbmcgcV9pZCwgY29uc3Qgdm9pZCAqbXNnLCB1bnNpZ25lZCBsb25nIHNpemUpCnsKICAgIHN0cnVjdCBITVhfTVNHX3F1ZXVlICpxOwogICAgaW50IHJjID0gSE1YX09LOwogICAgdW5zaWduZWQgbG9uZyBwcmlvOwoKICAgIFByaW50RW50ZXIoKTsKCiAgICBxID0gKHN0cnVjdCBITVhfTVNHX3F1ZXVlICopcV9pZDsKCiAgICBpZihzaXplID4gcS0+bXNnX3NpemVfKQogICAgewogICAgICAgIFByaW50RXJyb3IoIiVzWyVkXSA6IHNpemUgJWxkIEVycm9yXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBzaXplKTsKICAgICAgICByZXR1cm4gSE1YX0VSUk9SOwogICAgfQoKCXJjID0gUF9NU0dfQ2hlY2socSwgcV9pZCk7CglpZiAoSE1YX09LICE9IHJjKQoJewojaWYgZGVmaW5lZChDT05GSUdfREVCVUcpCgkJUHJpbnRFcnJvcigiJXMoJWQpIDogUF9NU0dfQ2hlY2sgOiBITVhfTVNHX0ZVTEwhISBxdWV1ZSBuYW1lICglcylcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcS0+bmFtZSk7CiNlbmRpZgoJCXJldHVybiByYzsKCX0KCiAgICBpZihITVhfU1VTUEVORFRZUEVfUFJJT1JJVFkgPT0gcS0+c3VzcGVuZF90eXBlXykKICAgIHsKICAgICAgICBwcmlvID0gTVNHX1BSSU9SSVRZX01BWC0xOyAvL7ChwOUgs/TAuiC/7LyxvPjAp7fOILq4s7202S4KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBwcmlvID0gTVNHX1BSSU9SSVRZMDsKICAgIH0KCiAgICAodm9pZClwdGhyZWFkX211dGV4X2xvY2soJnEtPnFfbG9ja18pOwoKICAgIHJjID0gbGlzdF9pbnNfbmV4dChxLCBwcmlvLCBtc2csIHNpemUsIEZBTFNFLCBGQUxTRSk7CiAgICBpZihITVhfT0sgIT0gcmMpCiAgICB7CiAgICAgICAgUHJpbnRFcnJvcigiJXMgOiBsaXN0X2luc19uZXh0KCkgcmNbJWRdIEVycm9yISFcbiIsIF9fRlVOQ1RJT05fXywgcmMpOwogICAgICAgICh2b2lkKXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxLT5xX2xvY2tfKTsKICAgICAgICByZXR1cm4gcmM7CiAgICB9CgojaWZkZWYgREVCVUdfTVNHX0xJU1RfUFJJTlQKICAgIHByaW50X2xpc3QocSk7CiNlbmRpZgoKICAgICh2b2lkKXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxLT5xX2xvY2tfKTsKCiNpZmRlZiBITVhfTVNHX0RFQlVHCiAgICBxLT5sYXN0U2VuZFRpY2sgPSBWS19USU1FUl9HZXRTeXN0ZW1UaWNrKCk7CiNlbmRpZgoKICAgIFByaW50RXhpdCgpOwoKICAgIHJldHVybiBITVhfT0s7Cn0KCgovKgogICAgSE1YX01TR19TZW5kVXJnZW50VGltZW91dAogICAgseSx3iC43ry8wfa4piBUaW1lb3V0ILO7v6EgurizvbTZLgoqLwppbnQgSE1YX01TR19TZW5kVXJnZW50VGltZW91dCh1bnNpZ25lZCBsb25nIHFfaWQsIGNvbnN0IHZvaWQgKm1zZywgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCnsKCXN0cnVjdCBITVhfTVNHX3F1ZXVlICpxOwoJaW50IHJjID0gSE1YX09LOwoJdW5zaWduZWQgbG9uZyBwcmlvID0gMDsKCXN0cnVjdCB0aW1lc3BlYyB0aW1lbzsKCXN0cnVjdCB0aW1lc3BlYyBjdXJfdGltZTsKCWxvbmcgbG9uZyBleHBfbnNlYzsKCglQcmludEVudGVyKCk7CgoJaWYgKHRpbWVvdXQgPT0gMHhGRkZGRkZGRikKCXsKCQlyZXR1cm4gSE1YX01TR19TZW5kVXJnZW50KHFfaWQsIG1zZywgc2l6ZSk7Cgl9CgoJcSA9IChzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqKXFfaWQ7CgoJaWYoc2l6ZSA+IHEtPm1zZ19zaXplXykKCXsKCSAgICBQcmludEVycm9yKCIlc1slZF0gOiBzaXplICVsZCBFcnJvclxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgc2l6ZSk7CgkgICAgcmV0dXJuIEhNWF9FUlJPUjsKCX0KCglyYyA9IFBfTVNHX0NoZWNrKHEsIHFfaWQpOwoJaWYgKEhNWF9PSyAhPSByYykKCXsKI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHKQoJCVByaW50RXJyb3IoIiVzKCVkKSA6IFBfTVNHX0NoZWNrIDogSE1YX01TR19GVUxMISEgcXVldWUgbmFtZSglcylcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcS0+bmFtZSk7CiNlbmRpZgoJCXJldHVybiByYzsKCX0KCglpZihITVhfU1VTUEVORFRZUEVfUFJJT1JJVFkgPT0gcS0+c3VzcGVuZF90eXBlXykKCXsKCSAgICBwcmlvID0gTVNHX1BSSU9SSVRZX01BWC0xOyAvL7ChwOUgs/TAuiC/7LyxvPjAp7fOILq4s7202S4KCX0KCWVsc2UKCXsKCSAgICBwcmlvID0gTVNHX1BSSU9SSVRZMDsKCX0KCgljbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmY3VyX3RpbWUpOwoJZXhwX25zZWMgPSAobG9uZyBsb25nKWN1cl90aW1lLnR2X3NlYyAqIDEwMDAgKiAxMDAwICogMTAwMCArIGN1cl90aW1lLnR2X25zZWM7CglpZiAodGltZW91dCAhPSAwKQoJCWV4cF9uc2VjICs9ICh0aW1lb3V0ICogMTAwMCAtIDk5OSkgKiAxMDAwOwoJdGltZW8udHZfc2VjID0gZXhwX25zZWMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKTsKCXRpbWVvLnR2X25zZWMgPSBleHBfbnNlYyAlICgxMDAwICogMTAwMCAqIDEwMDApOwoKCSh2b2lkKXB0aHJlYWRfbXV0ZXhfbG9jaygmcS0+cV9sb2NrXyk7CgoJcmMgPSBsaXN0X2luc19uZXh0KHEsIHByaW8sIG1zZywgc2l6ZSwgVFJVRSwgJnRpbWVvKTsKCglpZihITVhfT0sgIT0gcmMpCgl7CgkgICAgKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOwoKCSAgICBpZihFVElNRURPVVQgPT0gcmMpCgkgICAgewoJICAgICAgICBQcmludERlYnVnKCIlcyA6IGxpc3RfaW5zX25leHQoKSByY1slZF0gSE1YX1RJTUVPVVQhIVxuIiwgX19GVU5DVElPTl9fLCByYyk7CgkgICAgICAgIHJldHVybiBITVhfVElNRU9VVDsKCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCSAgICAgICAgUHJpbnRFcnJvcigiJXMgOiBsaXN0X2luc19uZXh0KCkgcmNbJWRdIEVycm9yISFcbiIsIF9fRlVOQ1RJT05fXywgcmMpOwoJICAgICAgICByZXR1cm4gSE1YX0VSUk9SOwoJICAgIH0KCX0KCiNpZmRlZiBERUJVR19NU0dfTElTVF9QUklOVAoJcHJpbnRfbGlzdChxKTsKI2VuZGlmCgoJKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOwoKCVByaW50RXhpdCgpOwoKCXJldHVybiBITVhfT0s7Cn0KCiNpZiBkZWZpbmVkKEhNWF9NU0dfREVCVUcpICYmIGRlZmluZWQoVktfVEFTS19ERUJVRykKI2RlZmluZSBITVhfTVNHX0NSSVRJQ0FMX0RFTEFZX1RJQ0sJMjAKI2RlZmluZSBITVhfTVNHX05PUk1BTF9ERUxBWV9USUNLCTIwMAojZW5kaWYKLyoKICAgIEhNWF9NU0dfUmVjZWl2ZQogICAguN68vMH2uKYgud60wrTZLgoqLwppbnQgSE1YX01TR19SZWNlaXZlKHVuc2lnbmVkIGxvbmcgcV9pZCwgdm9pZCAqbXNnLCB1bnNpZ25lZCBsb25nIHNpemUpCnsKICAgIHN0cnVjdCBITVhfTVNHX3F1ZXVlICAgICAgICAgICAgICAgKnE7Ci8vICB1bnNpZ25lZCBsb25nIHByaW87CiAgICBpbnQgcmMgPSBITVhfT0s7CgogICAgUHJpbnRFbnRlcigpOwoKCUhNWF9UQVNLX0NoZWNrQ2FsbGJhY2soKTsKCiAgICBxID0gKHN0cnVjdCBITVhfTVNHX3F1ZXVlICopcV9pZDsKCiAgICBpZihzaXplID4gcS0+bXNnX3NpemVfKQogICAgewogICAgICAgIFByaW50RXJyb3IoIiVzIDogc2l6ZSAlbGQgRXJyb3IhIVxuIiwgX19GVU5DVElPTl9fLCBzaXplKTsKICAgICAgICByZXR1cm4gSE1YX0VSUk9SOwogICAgfQoKICAgICh2b2lkKXB0aHJlYWRfbXV0ZXhfbG9jaygmcS0+cV9sb2NrXyk7CgojaWYgZGVmaW5lZChITVhfTVNHX0RFQlVHKSAmJiBkZWZpbmVkKFZLX1RBU0tfREVCVUcpCglxLT5yZWNlaXZlVGljayA9IFZLX1RJTUVSX0dldFN5c3RlbVRpY2soKTsKCWlmIChxLT5sYXN0UmVjZWl2ZVRpY2sgIT0gMCAmJiAocS0+cmVjZWl2ZVRpY2sgLSBxLT5sYXN0UmVjZWl2ZVRpY2sgPiBITVhfTVNHX05PUk1BTF9ERUxBWV9USUNLKSkKCXsKCQlpZiAoKHEtPnJlY2VpdmVUaWNrIC0gdGlja0ZvclZrRGVidWcpID4gSE1YX01TR19DUklUSUNBTF9ERUxBWV9USUNLKQoJCXsKCQkJUHJpbnRFcnJvcigiSE1YX01TR19SZWNlaXZlIDogSXQgaGFzIGV4Y3V0ZWQgdG9vIGxvbmcgdGltZSAoJWQpIHF1ZXVlKCVzKVxuIiwgcS0+cmVjZWl2ZVRpY2sgLSBxLT5sYXN0UmVjZWl2ZVRpY2ssIHEtPm5hbWUpOwoJCX0KCX0KI2VuZGlmCiAgICByYyA9IGxpc3RfcmVtX25leHQocSwgbXNnLCBzaXplLCBGQUxTRSwgTlVMTCk7CiNpZiBkZWZpbmVkKEhNWF9NU0dfREVCVUcpICYmIGRlZmluZWQoVktfVEFTS19ERUJVRykKCXEtPmxhc3RSZWNlaXZlVGljayA9IHRpY2tGb3JWa0RlYnVnID0gVktfVElNRVJfR2V0U3lzdGVtVGljaygpOwojZW5kaWYKICAgIGlmKEhNWF9PSyAhPSByYykKICAgIHsKICAgICAgICBQcmludEVycm9yKCIlcyA6IGxpc3RfcmVtX25leHQoKSByY1slZF0gRXJyb3IhIVxuIiwgX19GVU5DVElPTl9fLCByYyk7CiAgICAgICAgKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOwogICAgICAgIHJldHVybiByYzsKICAgIH0KCiNpZmRlZiBERUJVR19NU0dfTElTVF9QUklOVAogICAgcHJpbnRfbGlzdChxKTsKI2VuZGlmCiAgICAodm9pZClwdGhyZWFkX211dGV4X3VubG9jaygmcS0+cV9sb2NrXyk7CgogICAgUHJpbnRFeGl0KCk7CiAgICByZXR1cm4gSE1YX09LOwp9CgovKgogICAgSE1YX01TR19SZWNlaXZlVGltZW91dAogICAguN68vMH2uKYgVGltZW91dLO7v6Egud60wrTZLgoqLwppbnQgSE1YX01TR19SZWNlaXZlVGltZW91dCh1bnNpZ25lZCBsb25nIHFfaWQsIHZvaWQgKm1zZywgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCnsKCXN0cnVjdCBITVhfTVNHX3F1ZXVlICAgICAgICAgICAgICAgKnE7CglpbnQgcmMgPSBITVhfT0s7CgkvLyAgICBzdHJ1Y3QgdGltZXNwZWMgY3VyX3RpbWU7Cglsb25nIGxvbmcgZXhwX25zZWM7CglzdHJ1Y3QgdGltZXNwZWMgdGltZW8sIGN1cl90aW1lOwoKCVByaW50RW50ZXIoKTsKCWlmICh0aW1lb3V0ICE9IDApCgl7CgkJSE1YX1RBU0tfQ2hlY2tDYWxsYmFjaygpOwoJfQoKCWlmICh0aW1lb3V0ID09IDB4RkZGRkZGRkYpCgl7CgkJcmV0dXJuIEhNWF9NU0dfUmVjZWl2ZShxX2lkLCBtc2csIHNpemUpOwoJfQoKCXEgPSAoc3RydWN0IEhNWF9NU0dfcXVldWUgKilxX2lkOwoKCWlmKHNpemUgPiBxLT5tc2dfc2l6ZV8pCgl7CgkJUHJpbnRFcnJvcigiJXMgOiBzaXplICVsZCBFcnJvciEhXG4iLCBfX0ZVTkNUSU9OX18sIHNpemUpOwoJCXJldHVybiBITVhfRVJST1I7Cgl9CgoJY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJmN1cl90aW1lKTsKCWV4cF9uc2VjID0gKGxvbmcgbG9uZyljdXJfdGltZS50dl9zZWMgKiAobG9uZyBsb25nKTEwMDAgKiAobG9uZyBsb25nKTEwMDAgKiAobG9uZyBsb25nKTEwMDAgKyAobG9uZyBsb25nKWN1cl90aW1lLnR2X25zZWM7CglpZiAodGltZW91dCAhPSAwKQoJCWV4cF9uc2VjICs9IChsb25nIGxvbmcpKHRpbWVvdXQgKiAobG9uZyBsb25nKTEwMDAgLSA5OTkpICogKGxvbmcgbG9uZykxMDAwOwoJdGltZW8udHZfc2VjID0gZXhwX25zZWMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKTsKCXRpbWVvLnR2X25zZWMgPSBleHBfbnNlYyAlICgxMDAwICogMTAwMCAqIDEwMDApOwoKCSh2b2lkKXB0aHJlYWRfbXV0ZXhfbG9jaygmcS0+cV9sb2NrXyk7CiNpZiBkZWZpbmVkKEhNWF9NU0dfREVCVUcpICYmIGRlZmluZWQoVktfVEFTS19ERUJVRykKCXEtPnJlY2VpdmVUaWNrID0gVktfVElNRVJfR2V0U3lzdGVtVGljaygpOwoJaWYgKHEtPmxhc3RSZWNlaXZlVGljayAhPSAwICYmIChxLT5yZWNlaXZlVGljayAtIHEtPmxhc3RSZWNlaXZlVGljayA+IEhNWF9NU0dfTk9STUFMX0RFTEFZX1RJQ0spKQoJewoJCWlmICgocS0+cmVjZWl2ZVRpY2sgLSB0aWNrRm9yVmtEZWJ1ZykgPiBITVhfTVNHX0NSSVRJQ0FMX0RFTEFZX1RJQ0spCgkJewoJCQlQcmludEVycm9yKCJITVhfTVNHX1JlY2VpdmVUaW1lb3V0IDogSXQgaGFzIGV4Y3V0ZWQgdG9vIGxvbmcgdGltZSAoJWQpIHF1ZXVlKCVzKVxuIiwgcS0+cmVjZWl2ZVRpY2sgLSBxLT5sYXN0UmVjZWl2ZVRpY2ssIHEtPm5hbWUpOwoJCX0KCX0KI2VuZGlmCgoJcmMgPSBsaXN0X3JlbV9uZXh0KHEsIG1zZywgc2l6ZSwgVFJVRSwgJnRpbWVvKTsKI2lmIGRlZmluZWQoSE1YX01TR19ERUJVRykgJiYgZGVmaW5lZChWS19UQVNLX0RFQlVHKQoJcS0+bGFzdFJlY2VpdmVUaWNrID0gdGlja0ZvclZrRGVidWcgPSBWS19USU1FUl9HZXRTeXN0ZW1UaWNrKCk7CiNlbmRpZgoJaWYoSE1YX09LICE9IHJjKQoJewogICAgICAgICh2b2lkKXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxLT5xX2xvY2tfKTsKCiAgICAgICAgaWYoRVRJTUVET1VUID09IHJjKQogICAgICAgIHsKICAgICAgICAgICAgUHJpbnREZWJ1ZygiJXMgOiBsaXN0X3JlbV9uZXh0KCkgcmNbJWRdIEhNWF9USU1FT1VUISFcbiIsIF9fRlVOQ1RJT05fXywgcmMpOwogICAgICAgICAgICByZXR1cm4gSE1YX1RJTUVPVVQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIFByaW50RXJyb3IoIiVzIDogbGlzdF9yZW1fbmV4dCgpIHJjWyVkXSBFcnJvciEhXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKICAgICAgICAgICAgcmV0dXJuIEhNWF9FUlJPUjsKICAgICAgICB9Cgl9CgojaWZkZWYgREVCVUdfTVNHX0xJU1RfUFJJTlQKCXByaW50X2xpc3QocSk7CiNlbmRpZgoKCSh2b2lkKXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxLT5xX2xvY2tfKTsKCglQcmludEV4aXQoKTsKCXJldHVybiBITVhfT0s7Cn0KCmludAlITVhfTVNHX0dldE1lc3NhZ2VDb3VudCh1bnNpZ25lZCBsb25nIHFfaWQsIHVuc2lnbmVkIGxvbmcgKnB1bE1zZ0NvdW50LCB1bnNpZ25lZCBsb25nICpwdWxNYXhNc2dDb3VudCkKewogICAgc3RydWN0IEhNWF9NU0dfcXVldWUgKnE7CgogICAgUHJpbnRFbnRlcigpOwoKICAgIHEgPSAoc3RydWN0IEhNWF9NU0dfcXVldWUgKilxX2lkOwoKCSh2b2lkKXB0aHJlYWRfbXV0ZXhfbG9jaygmcS0+cV9sb2NrXyk7CgkqcHVsTXNnQ291bnQgPSBxLT5jdXJyX21zZ19jb3VudF87CgkqcHVsTWF4TXNnQ291bnQgPSBxLT5tc2dfY291bnRfOwoJKHZvaWQpcHRocmVhZF9tdXRleF91bmxvY2soJnEtPnFfbG9ja18pOwoKCVByaW50RXhpdCgpOwoJcmV0dXJuIEhNWF9PSzsKfQoKc3RhdGljIGludCBQX01TR19DaGVjayhzdHJ1Y3QgSE1YX01TR19xdWV1ZSAqcSwgdW5zaWduZWQgbG9uZyBxX2lkKQp7Cgl1bnNpZ25lZCBsb25nIHVsTmVhcmx5RnVsbENvdW50OwojaWYgIWRlZmluZWQoQ09ORklHX0RFQlVHKQoJVU5VU0VEKHFfaWQpOwojZW5kaWYKCgl1bE5lYXJseUZ1bGxDb3VudCA9IChxLT5tc2dfY291bnRfICogMyk7Cgl1bE5lYXJseUZ1bGxDb3VudCA9IHVsTmVhcmx5RnVsbENvdW50LzQ7CgoJaWYocS0+bXNnX2NvdW50XyA9PSBxLT5jdXJyX21zZ19jb3VudF8pCgl7CiNpZiBkZWZpbmVkKENPTkZJR19ERUJVRykKCQlpZiAoVktfVElNRVJfR2V0U3lzdGVtVGljaygpIC0gdGlja0ZvclZrRGVidWcgPiA1MDAwKQoJCXsKCQkJdGlja0ZvclZrRGVidWcgPSBWS19USU1FUl9HZXRTeXN0ZW1UaWNrKCk7CgkJCS8vIHF1ZXVlIGlzIGZ1bGwuCiNpZiBkZWZpbmVkKENPTkZJR19ERUJVRykKCQkJUHJpbnRFcnJvcigiXG4hIVxuISEhICVzKCk6IFdBUk5JTkc6IHF1ZXVlX2lkIDB4JVgsIG5hbWU6JXMgZnVsbCAhISElY1xuISEhXG4iLCBfX0ZVTkNUSU9OX18sIHFfaWQsIHEtPm5hbWUsIDcpOwoJI2lmIGRlZmluZWQoVktfVEFTS19ERUJVRykKCQkJVktfVEFTS19QcmludFRhc2tMaXN0KCk7CgkjZW5kaWYKCSNpZiBkZWZpbmVkKEhNWF9NU0dfREVCVUcpCgkJCUhNWF9NU0dfUHJpbnRNc2dRTGlzdCgpOwoJI2VuZGlmCgkjaWYgZGVmaW5lZChWS19TRU1fREVCVUcpCgkJCVZLX1NFTV9QcmludFNlbUxpc3QoKTsKCSNlbmRpZgojZWxzZQoJCQlQcmludEVycm9yKCJcbiEhXG4hISEgJXMoKTogV0FSTklORzogcXVldWVfaWQgMHglWCwgZnVsbCAhISElY1xuISEhXG4iLCBfX0ZVTkNUSU9OX18sIHFfaWQsIDcpOwojZW5kaWYKCQl9CiNlbmRpZgoJCXJldHVybiBITVhfTVNHX0ZVTEw7Cgl9CgllbHNlIGlmKCBxLT5jdXJyX21zZ19jb3VudF8gPiB1bE5lYXJseUZ1bGxDb3VudCApCgl7CiNpZiBkZWZpbmVkKENPTkZJR19ERUJVRykKCQlQcmludEVycm9yKCJbSE1YX01TR19TZW5kXSBNc2dRdWUgaXMgbmVhcmx5IGZ1bGwgLSBTZW5kVGFzazolZCwgUXVlSWQ6MHglWCwgKCVsZCwgJWxkKSwgbmFtZTolc1xyXG4iLAoJCQkJcHRocmVhZF9zZWxmKCksIHFfaWQsIHEtPm1zZ19jb3VudF8sIHEtPmN1cnJfbXNnX2NvdW50XywgcS0+bmFtZSk7CiNlbmRpZgoJfQoKCXJldHVybiBITVhfT0s7Cn0KCgovKgogICAgSE1YX01TR19QcmludE1zZ1FMaXN0CiAgICC43ry8wfbFpSDBpLq4uKYgw+K3wsfRtNkuCiovCiNpZiBkZWZpbmVkKEhNWF9NU0dfREVCVUcpCnZvaWQgSE1YX01TR19QcmludE1zZ1FMaXN0KHZvaWQpCnsKCUhJTlQzMgl1bENudD0wOwoJc3RydWN0IEhNWF9NU0dfcXVldWUgKnBNc2dROwoKICAgIFByaW50RGVidWcoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOwogICAgUHJpbnREZWJ1ZygiICAgICAgICAgICAgICAgIE5hbWUgUWlkICAgICAgICBTaXplIENvdW50IEN1cl9Db3VudCBUeXBlXG4iKTsKICAgIGZvciAocE1zZ1EgPSBtc2dfcV9saXN0X2hlYWQudHFoX2ZpcnN0OyBwTXNnUSAhPSBOVUxMOyBwTXNnUSA9IHBNc2dRLT5lbnRyaWVzLnRxZV9uZXh0KQogICAgewogICAgICAgIFByaW50RGVidWcoIlslMDNkXSUyMHMgMHglMDhYICUwNGQgJTA1ZCAlMDlkICUwNGRcbiIsdWxDbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1zZ1EtPm5hbWUsICh1bnNpZ25lZCBsb25nKXBNc2dRLCBwTXNnUS0+bXNnX3NpemVfLCBwTXNnUS0+bXNnX2NvdW50XywgcE1zZ1EtPmN1cnJfbXNnX2NvdW50XywgcE1zZ1EtPnN1c3BlbmRfdHlwZV8pOwogICAgICAgIHVsQ250Kys7CiAgICB9CiAgICBQcmludERlYnVnKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKfQojZW5kaWYKCgovKkB9Ki8K