LyoKICogIHdpbmJvbmQtY2lyLmMgLSBEcml2ZXIgZm9yIHRoZSBDb25zdW1lciBJUiBmdW5jdGlvbmFsaXR5IG9mIFdpbmJvbmQKICogICAgICAgICAgICAgICAgICBTdXBlckkvTyBjaGlwcy4KICoKICogIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgV2luYm9uZCBXUENEMzc2aSBjaGlwIChQTlAgaWQgV0VDMTAyMiksIGJ1dAogKiAgY291bGQgcHJvYmFibHkgc3VwcG9ydCBvdGhlcnMgKFdpbmJvbmQgV0VDMTAyWCwgTmF0U2VtaSwgZXRjKQogKiAgd2l0aCBtaW5vciBtb2RpZmljYXRpb25zLgogKgogKiAgT3JpZ2luYWwgQXV0aG9yOiBEYXZpZCBI5HJkZW1hbiA8ZGF2aWRAaGFyZGVtYW4ubnU+CiAqICAgICBDb3B5cmlnaHQgKEMpIDIwMDkgLSAyMDEwIERhdmlkIEjkcmRlbWFuIDxkYXZpZEBoYXJkZW1hbi5udT4KICoKICogIERlZGljYXRlZCB0byBteSBkYXVnaHRlciBNYXRpbGRhLCB3aXRob3V0IHdob3NlIGxvdmluZyBhdHRlbnRpb24gdGhpcwogKiAgZHJpdmVyIHdvdWxkIGhhdmUgYmVlbiBmaW5pc2hlZCBpbiBoYWxmIHRoZSB0aW1lIGFuZCB3aXRoIGEgZnJhY3Rpb24KICogIG9mIHRoZSBidWdzLgogKgogKiAgV3JpdHRlbiB1c2luZzoKICogICAgbyBXaW5ib25kIFdQQ0QzNzZJIGRhdGFzaGVldCBoZWxwZnVsbHkgcHJvdmlkZWQgYnkgSmVzc2UgQmFybmVzIGF0IEludGVsCiAqICAgIG8gTmF0U2VtaSBQQzg3MzM4L1BDOTczMzggZGF0YXNoZWV0IChmb3IgdGhlIHNlcmlhbCBwb3J0IHN0dWZmKQogKiAgICBvIERTRFQgZHVtcHMKICoKICogIFN1cHBvcnRlZCBmZWF0dXJlczoKICogICAgbyBXYWtlLU9uLUNJUiBmdW5jdGlvbmFsaXR5CiAqCiAqICBUbyBkbzoKICogICAgbyBMZWFybmluZwogKiAgICBvIElSIFRyYW5zbWl0CiAqCiAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvcG5wLmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgojaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgojaW5jbHVkZSA8bGludXgvaW8uaD4KI2luY2x1ZGUgPGxpbnV4L2JpdHJldi5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bWVkaWEvcmMtY29yZS5oPgoKI2RlZmluZSBEUlZOQU1FICJ3aW5ib25kLWNpciIKCi8qIENFSVIgV2FrZS1VcCBSZWdpc3RlcnMsIHJlbGF0aXZlIHRvIGRhdGEtPndiYXNlICAgICAgICAgICAgICAgICAgICAgICovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0NUTAkweDAzIC8qIENFSVIgUmVjZWl2ZXIgQ29udHJvbAkJKi8KI2RlZmluZSBXQkNJUl9SRUdfV0NFSVJfU1RTCTB4MDQgLyogQ0VJUiBSZWNlaXZlciBTdGF0dXMJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0VWX0VOCTB4MDUgLyogQ0VJUiBSZWNlaXZlciBFdmVudCBFbmFibGUJKi8KI2RlZmluZSBXQkNJUl9SRUdfV0NFSVJfQ05UTAkweDA2IC8qIENFSVIgUmVjZWl2ZXIgQ291bnRlciBMb3cJKi8KI2RlZmluZSBXQkNJUl9SRUdfV0NFSVJfQ05USAkweDA3IC8qIENFSVIgUmVjZWl2ZXIgQ291bnRlciBIaWdoCSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0lOREVYCTB4MDggLyogQ0VJUiBSZWNlaXZlciBJbmRleAkJKi8KI2RlZmluZSBXQkNJUl9SRUdfV0NFSVJfREFUQQkweDA5IC8qIENFSVIgUmVjZWl2ZXIgRGF0YQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfV0NFSVJfQ1NMCTB4MEEgLyogQ0VJUiBSZS4gQ29tcGFyZSBTdHJsZW4JCSovCiNkZWZpbmUgV0JDSVJfUkVHX1dDRUlSX0NGRzEJMHgwQiAvKiBDRUlSIFJlLiBDb25maWd1cmF0aW9uIDEJKi8KI2RlZmluZSBXQkNJUl9SRUdfV0NFSVJfQ0ZHMgkweDBDIC8qIENFSVIgUmUuIENvbmZpZ3VyYXRpb24gMgkqLwoKLyogQ0VJUiBFbmhhbmNlZCBGdW5jdGlvbmFsaXR5IFJlZ2lzdGVycywgcmVsYXRpdmUgdG8gZGF0YS0+ZWJhc2UgICAgICAgKi8KI2RlZmluZSBXQkNJUl9SRUdfRUNFSVJfQ1RTCTB4MDAgLyogRW5oYW5jZWQgSVIgQ29udHJvbCBTdGF0dXMJKi8KI2RlZmluZSBXQkNJUl9SRUdfRUNFSVJfQ0NUTAkweDAxIC8qIEluZnJhcmVkIENvdW50ZXIgQ29udHJvbAkqLwojZGVmaW5lIFdCQ0lSX1JFR19FQ0VJUl9DTlRfTE8JMHgwMiAvKiBJbmZyYXJlZCBDb3VudGVyIExTQgkJKi8KI2RlZmluZSBXQkNJUl9SRUdfRUNFSVJfQ05UX0hJCTB4MDMgLyogSW5mcmFyZWQgQ291bnRlciBNU0IJCSovCiNkZWZpbmUgV0JDSVJfUkVHX0VDRUlSX0lSRU0JMHgwNCAvKiBJbmZyYXJlZCBFbWl0dGVyIFN0YXR1cwkJKi8KCi8qIFNQMyBCYW5rZWQgUmVnaXN0ZXJzLCByZWxhdGl2ZSB0byBkYXRhLT5zYmFzZSAgICAgICAgICAgICAgICAgICAgICAgICovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19CU1IJMHgwMyAvKiBCYW5rIFNlbGVjdCwgYWxsIGJhbmtzCQkqLwoJCQkJICAgICAgLyogQmFuayAwCQkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19SWERBVEEJMHgwMCAvKiBGSUZPIFJYIGRhdGEgKHIpCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfVFhEQVRBCTB4MDAgLyogRklGTyBUWCBkYXRhICh3KQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lFUgkweDAxIC8qIEludGVycnVwdCBFbmFibGUJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19FSVIJMHgwMiAvKiBFdmVudCBJZGVudGlmaWNhdGlvbiAocikJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0ZDUgkweDAyIC8qIEZJRk8gQ29udHJvbCAodykJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19NQ1IJMHgwNCAvKiBNb2RlIENvbnRyb2wJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfTFNSCTB4MDUgLyogTGluayBTdGF0dXMJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfTVNSCTB4MDYgLyogTW9kZW0gU3RhdHVzCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0FTQ1IJMHgwNyAvKiBBdXggU3RhdHVzIGFuZCBDb250cm9sCQkqLwoJCQkJICAgICAgLyogQmFuayAyCQkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19CR0RMCTB4MDAgLyogQmF1ZCBEaXZpc29yIExTQgkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0JHREgJMHgwMSAvKiBCYXVkIERpdmlzb3IgTVNCCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfRVhDUjEJMHgwMiAvKiBFeHRlbmRlZCBDb250cm9sIDEJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19FWENSMgkweDA0IC8qIEV4dGVuZGVkIENvbnRyb2wgMgkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX1RYRkxWCTB4MDYgLyogVFggRklGTyBMZXZlbAkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19SWEZMVgkweDA3IC8qIFJYIEZJRk8gTGV2ZWwJCQkqLwoJCQkJICAgICAgLyogQmFuayAzCQkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19NUklECTB4MDAgLyogTW9kdWxlIElkZW50aWZpY2F0aW9uCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfU0hfTENSCTB4MDEgLyogTENSIFNoYWRvdwkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19TSF9GQ1IJMHgwMiAvKiBGQ1IgU2hhZG93CQkJKi8KCQkJCSAgICAgIC8qIEJhbmsgNAkJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfSVJDUjEJMHgwMiAvKiBJbmZyYXJlZCBDb250cm9sIDEJCSovCgkJCQkgICAgICAvKiBCYW5rIDUJCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lSQ1IyCTB4MDQgLyogSW5mcmFyZWQgQ29udHJvbCAyCQkqLwoJCQkJICAgICAgLyogQmFuayA2CQkJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19JUkNSMwkweDAwIC8qIEluZnJhcmVkIENvbnRyb2wgMwkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX1NJUl9QVwkweDAyIC8qIFNJUiBQdWxzZSBXaWR0aAkJCSovCgkJCQkgICAgICAvKiBCYW5rIDcJCQkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX0lSUlhEQwkweDAwIC8qIElSIFJYIERlbW9kIENvbnRyb2wJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19JUlRYTUMJMHgwMSAvKiBJUiBUWCBNb2QgQ29udHJvbAkJKi8KI2RlZmluZSBXQkNJUl9SRUdfU1AzX1JDQ0ZHCTB4MDIgLyogQ0VJUiBDb25maWcJCQkqLwojZGVmaW5lIFdCQ0lSX1JFR19TUDNfSVJDRkcxCTB4MDQgLyogSW5mcmFyZWQgQ29uZmlnIDEJCSovCiNkZWZpbmUgV0JDSVJfUkVHX1NQM19JUkNGRzQJMHgwNyAvKiBJbmZyYXJlZCBDb25maWcgNAkJKi8KCi8qCiAqIE1hZ2ljIHZhbHVlcyBmb2xsb3cKICovCgovKiBObyBpbnRlcnJ1cHRzIGZvciBXQkNJUl9SRUdfU1AzX0lFUiBhbmQgV0JDSVJfUkVHX1NQM19FSVIgKi8KI2RlZmluZSBXQkNJUl9JUlFfTk9ORQkJMHgwMAovKiBSWCBkYXRhIGJpdCBmb3IgV0JDSVJfUkVHX1NQM19JRVIgYW5kIFdCQ0lSX1JFR19TUDNfRUlSICovCiNkZWZpbmUgV0JDSVJfSVJRX1JYCQkweDAxCi8qIE92ZXIvVW5kZXItZmxvdyBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfSUVSIGFuZCBXQkNJUl9SRUdfU1AzX0VJUiAqLwojZGVmaW5lIFdCQ0lSX0lSUV9FUlIJCTB4MDQKLyogTGVkIGVuYWJsZS9kaXNhYmxlIGJpdCBmb3IgV0JDSVJfUkVHX0VDRUlSX0NUUyAqLwojZGVmaW5lIFdCQ0lSX0xFRF9FTkFCTEUJMHg4MAovKiBSWCBkYXRhIGF2YWlsYWJsZSBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfTFNSICovCiNkZWZpbmUgV0JDSVJfUlhfQVZBSUwJCTB4MDEKLyogUlggZGlzYWJsZSBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfQVNDUiAqLwojZGVmaW5lIFdCQ0lSX1JYX0RJU0FCTEUJMHgyMAovKiBFeHRlbmRlZCBtb2RlIGVuYWJsZSBiaXQgZm9yIFdCQ0lSX1JFR19TUDNfRVhDUjEgKi8KI2RlZmluZSBXQkNJUl9FWFRfRU5BQkxFCTB4MDEKLyogU2VsZWN0IGNvbXBhcmUgcmVnaXN0ZXIgaW4gV0JDSVJfUkVHX1dDRUlSX0lOREVYIChiaXRzIDUgJiA2KSAqLwojZGVmaW5lIFdCQ0lSX1JFR1NFTF9DT01QQVJFCTB4MTAKLyogU2VsZWN0IG1hc2sgcmVnaXN0ZXIgaW4gV0JDSVJfUkVHX1dDRUlSX0lOREVYIChiaXRzIDUgJiA2KSAqLwojZGVmaW5lIFdCQ0lSX1JFR1NFTF9NQVNLCTB4MjAKLyogU3RhcnRpbmcgYWRkcmVzcyBvZiBzZWxlY3RlZCByZWdpc3RlciBpbiBXQkNJUl9SRUdfV0NFSVJfSU5ERVggKi8KI2RlZmluZSBXQkNJUl9SRUdfQUREUjAJCTB4MDAKCi8qIFZhbGlkIGJhbmtzIGZvciB0aGUgU1AzIFVBUlQgKi8KZW51bSB3YmNpcl9iYW5rIHsKCVdCQ0lSX0JBTktfMCAgICAgICAgICA9IDB4MDAsCglXQkNJUl9CQU5LXzEgICAgICAgICAgPSAweDgwLAoJV0JDSVJfQkFOS18yICAgICAgICAgID0gMHhFMCwKCVdCQ0lSX0JBTktfMyAgICAgICAgICA9IDB4RTQsCglXQkNJUl9CQU5LXzQgICAgICAgICAgPSAweEU4LAoJV0JDSVJfQkFOS181ICAgICAgICAgID0gMHhFQywKCVdCQ0lSX0JBTktfNiAgICAgICAgICA9IDB4RjAsCglXQkNJUl9CQU5LXzcgICAgICAgICAgPSAweEY0LAp9OwoKLyogU3VwcG9ydGVkIHBvd2VyLW9uIElSIFByb3RvY29scyAqLwplbnVtIHdiY2lyX3Byb3RvY29sIHsKCUlSX1BST1RPQ09MX1JDNSAgICAgICAgICA9IDB4MCwKCUlSX1BST1RPQ09MX05FQyAgICAgICAgICA9IDB4MSwKCUlSX1BST1RPQ09MX1JDNiAgICAgICAgICA9IDB4MiwKfTsKCi8qIE1pc2MgKi8KI2RlZmluZSBXQkNJUl9OQU1FCSJXaW5ib25kIENJUiIKI2RlZmluZSBXQkNJUl9JRF9GQU1JTFkgICAgICAgICAgMHhGMSAvKiBGYW1pbHkgSUQgZm9yIHRoZSBXUENEMzc2SQkqLwojZGVmaW5lCVdCQ0lSX0lEX0NISVAgICAgICAgICAgICAweDA0IC8qIENoaXAgSUQgZm9yIHRoZSBXUENEMzc2SQkqLwojZGVmaW5lIElOVkFMSURfU0NBTkNPREUgICAweDdGRkZGRkZGIC8qIEludmFsaWQgd2l0aCBhbGwgcHJvdG9zCSovCiNkZWZpbmUgV0FLRVVQX0lPTUVNX0xFTiAgICAgICAgIDB4MTAgLyogV2FrZS1VcCBJL08gUmVnIExlbgkJKi8KI2RlZmluZSBFSEZVTkNfSU9NRU1fTEVOICAgICAgICAgMHgxMCAvKiBFbmhhbmNlZCBGdW5jIEkvTyBSZWcgTGVuCSovCiNkZWZpbmUgU1BfSU9NRU1fTEVOICAgICAgICAgICAgIDB4MDggLyogU2VyaWFsIFBvcnQgMyAoSVIpIFJlZyBMZW4JKi8KCi8qIFBlci1kZXZpY2UgZGF0YSAqLwpzdHJ1Y3Qgd2JjaXJfZGF0YSB7CglzcGlubG9ja190IHNwaW5sb2NrOwoKCXVuc2lnbmVkIGxvbmcgd2Jhc2U7ICAgICAgICAvKiBXYWtlLVVwIEJhc2VhZGRyCQkqLwoJdW5zaWduZWQgbG9uZyBlYmFzZTsgICAgICAgIC8qIEVuaGFuY2VkIEZ1bmMuIEJhc2VhZGRyCSovCgl1bnNpZ25lZCBsb25nIHNiYXNlOyAgICAgICAgLyogU2VyaWFsIFBvcnQgQmFzZWFkZHIJKi8KCXVuc2lnbmVkIGludCAgaXJxOyAgICAgICAgICAvKiBTZXJpYWwgUG9ydCBJUlEJCSovCgoJc3RydWN0IHJjX2RldiAqZGV2OwoKCXN0cnVjdCBsZWRfdHJpZ2dlciAqcnh0cmlnZ2VyOwoJc3RydWN0IGxlZF90cmlnZ2VyICp0eHRyaWdnZXI7CglzdHJ1Y3QgbGVkX2NsYXNzZGV2IGxlZDsKCgkvKiBSWCBpcmRhdGEgc3RhdGUgKi8KCWJvb2wgaXJkYXRhX2FjdGl2ZTsKCWJvb2wgaXJkYXRhX2Vycm9yOwoJc3RydWN0IGlyX3Jhd19ldmVudCBldjsKfTsKCnN0YXRpYyBlbnVtIHdiY2lyX3Byb3RvY29sIHByb3RvY29sID0gSVJfUFJPVE9DT0xfUkM2Owptb2R1bGVfcGFyYW0ocHJvdG9jb2wsIHVpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHByb3RvY29sLCAiSVIgcHJvdG9jb2wgdG8gdXNlIGZvciB0aGUgcG93ZXItb24gY29tbWFuZCAiCgkJICIoMCA9IFJDNSwgMSA9IE5FQywgMiA9IFJDNkEsIGRlZmF1bHQpIik7CgpzdGF0aWMgaW50IGludmVydDsgLyogZGVmYXVsdCA9IDAgKi8KbW9kdWxlX3BhcmFtKGludmVydCwgYm9vbCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoaW52ZXJ0LCAiSW52ZXJ0IHRoZSBzaWduYWwgZnJvbSB0aGUgSVIgcmVjZWl2ZXIiKTsKCnN0YXRpYyB1bnNpZ25lZCBpbnQgd2FrZV9zYyA9IDB4ODAwRjA0MEM7Cm1vZHVsZV9wYXJhbSh3YWtlX3NjLCB1aW50LCAwNjQ0KTsKTU9EVUxFX1BBUk1fREVTQyh3YWtlX3NjLCAiU2NhbmNvZGUgb2YgdGhlIHBvd2VyLW9uIElSIGNvbW1hbmQiKTsKCnN0YXRpYyB1bnNpZ25lZCBpbnQgd2FrZV9yYzZtb2RlID0gNjsKbW9kdWxlX3BhcmFtKHdha2VfcmM2bW9kZSwgdWludCwgMDY0NCk7Ck1PRFVMRV9QQVJNX0RFU0Mod2FrZV9yYzZtb2RlLCAiUkM2IG1vZGUgZm9yIHRoZSBwb3dlci1vbiBjb21tYW5kICIKCQkgIigwID0gMCwgNiA9IDZBLCBkZWZhdWx0KSIpOwoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogVVRJTElUWSBGVU5DVElPTlMKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogQ2FsbGVyIG5lZWRzIHRvIGhvbGQgd2JjaXJfbG9jayAqLwpzdGF0aWMgdm9pZAp3YmNpcl9zZXRfYml0cyh1bnNpZ25lZCBsb25nIGFkZHIsIHU4IGJpdHMsIHU4IG1hc2spCnsKCXU4IHZhbDsKCgl2YWwgPSBpbmIoYWRkcik7Cgl2YWwgPSAoKHZhbCAmIH5tYXNrKSB8IChiaXRzICYgbWFzaykpOwoJb3V0Yih2YWwsIGFkZHIpOwp9CgovKiBTZWxlY3RzIHRoZSByZWdpc3RlciBiYW5rIGZvciB0aGUgc2VyaWFsIHBvcnQgKi8Kc3RhdGljIGlubGluZSB2b2lkCndiY2lyX3NlbGVjdF9iYW5rKHN0cnVjdCB3YmNpcl9kYXRhICpkYXRhLCBlbnVtIHdiY2lyX2JhbmsgYmFuaykKewoJb3V0YihiYW5rLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQlNSKTsKfQoKc3RhdGljIGVudW0gbGVkX2JyaWdodG5lc3MKd2JjaXJfbGVkX2JyaWdodG5lc3NfZ2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KQp7CglzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSA9IGNvbnRhaW5lcl9vZihsZWRfY2RldiwKCQkJCQkgICAgICAgc3RydWN0IHdiY2lyX2RhdGEsCgkJCQkJICAgICAgIGxlZCk7CgoJaWYgKGluYihkYXRhLT5lYmFzZSArIFdCQ0lSX1JFR19FQ0VJUl9DVFMpICYgV0JDSVJfTEVEX0VOQUJMRSkKCQlyZXR1cm4gTEVEX0ZVTEw7CgllbHNlCgkJcmV0dXJuIExFRF9PRkY7Cn0KCnN0YXRpYyB2b2lkCndiY2lyX2xlZF9icmlnaHRuZXNzX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKCQkJIGVudW0gbGVkX2JyaWdodG5lc3MgYnJpZ2h0bmVzcykKewoJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEgPSBjb250YWluZXJfb2YobGVkX2NkZXYsCgkJCQkJICAgICAgIHN0cnVjdCB3YmNpcl9kYXRhLAoJCQkJCSAgICAgICBsZWQpOwoKCXdiY2lyX3NldF9iaXRzKGRhdGEtPmViYXNlICsgV0JDSVJfUkVHX0VDRUlSX0NUUywKCQkgICAgICAgYnJpZ2h0bmVzcyA9PSBMRURfT0ZGID8gMHgwMCA6IFdCQ0lSX0xFRF9FTkFCTEUsCgkJICAgICAgIFdCQ0lSX0xFRF9FTkFCTEUpOwp9CgovKiBNYW5jaGVzdGVyIGVuY29kZXMgYml0cyB0byBSQzYgbWVzc2FnZSBjZWxscyAoc2VlIHdiY2lyX3NodXRkb3duKSAqLwpzdGF0aWMgdTgKd2JjaXJfdG9fcmM2Y2VsbHModTggdmFsKQp7Cgl1OCBjb2RlZCA9IDB4MDA7CglpbnQgaTsKCgl2YWwgJj0gMHgwRjsKCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKCQlpZiAodmFsICYgMHgwMSkKCQkJY29kZWQgfD0gMHgwMiA8PCAoaSAqIDIpOwoJCWVsc2UKCQkJY29kZWQgfD0gMHgwMSA8PCAoaSAqIDIpOwoJCXZhbCA+Pj0gMTsKCX0KCglyZXR1cm4gY29kZWQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBJTlRFUlJVUFQgRlVOQ1RJT05TCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBpcnFyZXR1cm5fdAp3YmNpcl9pcnFfaGFuZGxlcihpbnQgaXJxbm8sIHZvaWQgKmNvb2tpZSkKewoJc3RydWN0IHBucF9kZXYgKmRldmljZSA9IGNvb2tpZTsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gcG5wX2dldF9kcnZkYXRhKGRldmljZSk7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdTggaXJkYXRhWzhdOwoJdTggZGlzYWJsZSA9IHRydWU7Cgl1OCBzdGF0dXM7CglpbnQgaTsKCglzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzApOwoKCXN0YXR1cyA9IGluYihkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfRUlSKTsKCglpZiAoIShzdGF0dXMgJiAoV0JDSVJfSVJRX1JYIHwgV0JDSVJfSVJRX0VSUikpKSB7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKCQlyZXR1cm4gSVJRX05PTkU7Cgl9CgoJLyogQ2hlY2sgZm9yIGUuZy4gYnVmZmVyIG92ZXJmbG93ICovCglpZiAoc3RhdHVzICYgV0JDSVJfSVJRX0VSUikgewoJCWRhdGEtPmlyZGF0YV9lcnJvciA9IHRydWU7CgkJaXJfcmF3X2V2ZW50X3Jlc2V0KGRhdGEtPmRldik7Cgl9CgoJaWYgKCEoc3RhdHVzICYgV0JDSVJfSVJRX1JYKSkKCQlnb3RvIG91dDsKCglpZiAoIWRhdGEtPmlyZGF0YV9hY3RpdmUpIHsKCQlkYXRhLT5pcmRhdGFfYWN0aXZlID0gdHJ1ZTsKCQlsZWRfdHJpZ2dlcl9ldmVudChkYXRhLT5yeHRyaWdnZXIsIExFRF9GVUxMKTsKCX0KCgkvKiBTaW5jZSBSWEhETEVWIGlzIHNldCwgYXQgbGVhc3QgOCBieXRlcyBhcmUgaW4gdGhlIEZJRk8gKi8KCWluc2IoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX1JYREFUQSwgJmlyZGF0YVswXSwgOCk7CgoJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewoJCXU4IHB1bHNlOwoJCXUzMiBkdXJhdGlvbjsKCgkJaWYgKGlyZGF0YVtpXSAhPSAweEZGICYmIGlyZGF0YVtpXSAhPSAweDAwKQoJCQlkaXNhYmxlID0gZmFsc2U7CgoJCWlmIChkYXRhLT5pcmRhdGFfZXJyb3IpCgkJCWNvbnRpbnVlOwoKCQlwdWxzZSA9IGlyZGF0YVtpXSAmIDB4ODAgPyBmYWxzZSA6IHRydWU7CgkJZHVyYXRpb24gPSAoaXJkYXRhW2ldICYgMHg3RikgKiAxMDAwMDsgLyogbnMgKi8KCgkJaWYgKGRhdGEtPmV2LnB1bHNlICE9IHB1bHNlKSB7CgkJCWlmIChkYXRhLT5ldi5kdXJhdGlvbiAhPSAwKSB7CgkJCQlpcl9yYXdfZXZlbnRfc3RvcmUoZGF0YS0+ZGV2LCAmZGF0YS0+ZXYpOwoJCQkJZGF0YS0+ZXYuZHVyYXRpb24gPSAwOwoJCQl9CgoJCQlkYXRhLT5ldi5wdWxzZSA9IHB1bHNlOwoJCX0KCgkJZGF0YS0+ZXYuZHVyYXRpb24gKz0gZHVyYXRpb247Cgl9CgoJaWYgKGRpc2FibGUpIHsKCQlpZiAoZGF0YS0+ZXYuZHVyYXRpb24gIT0gMCAmJiAhZGF0YS0+aXJkYXRhX2Vycm9yKSB7CgkJCWlyX3Jhd19ldmVudF9zdG9yZShkYXRhLT5kZXYsICZkYXRhLT5ldik7CgkJCWRhdGEtPmV2LmR1cmF0aW9uID0gMDsKCQl9CgoJCS8qIFNldCBSWElOQUNUSVZFICovCgkJb3V0YihXQkNJUl9SWF9ESVNBQkxFLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQVNDUik7CgoJCS8qIERyYWluIHRoZSBGSUZPICovCgkJd2hpbGUgKGluYihkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfTFNSKSAmIFdCQ0lSX1JYX0FWQUlMKQoJCQlpbmIoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX1JYREFUQSk7CgoJCWlyX3Jhd19ldmVudF9yZXNldChkYXRhLT5kZXYpOwoJCWRhdGEtPmlyZGF0YV9lcnJvciA9IGZhbHNlOwoJCWRhdGEtPmlyZGF0YV9hY3RpdmUgPSBmYWxzZTsKCQlsZWRfdHJpZ2dlcl9ldmVudChkYXRhLT5yeHRyaWdnZXIsIExFRF9PRkYpOwoJfQoKCWlyX3Jhd19ldmVudF9oYW5kbGUoZGF0YS0+ZGV2KTsKCm91dDoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhdGEtPnNwaW5sb2NrLCBmbGFncyk7CglyZXR1cm4gSVJRX0hBTkRMRUQ7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIFNFVFVQL0lOSVQvU1VTUEVORC9SRVNVTUUgRlVOQ1RJT05TCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkCndiY2lyX3NodXRkb3duKHN0cnVjdCBwbnBfZGV2ICpkZXZpY2UpCnsKCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkZXZpY2UtPmRldjsKCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gcG5wX2dldF9kcnZkYXRhKGRldmljZSk7Cglib29sIGRvX3dha2UgPSB0cnVlOwoJdTggbWF0Y2hbMTFdOwoJdTggbWFza1sxMV07Cgl1OCByYzZfY3NsID0gMDsKCWludCBpOwoKCW1lbXNldChtYXRjaCwgMCwgc2l6ZW9mKG1hdGNoKSk7CgltZW1zZXQobWFzaywgMCwgc2l6ZW9mKG1hc2spKTsKCglpZiAod2FrZV9zYyA9PSBJTlZBTElEX1NDQU5DT0RFIHx8ICFkZXZpY2VfbWF5X3dha2V1cChkZXYpKSB7CgkJZG9fd2FrZSA9IGZhbHNlOwoJCWdvdG8gZmluaXNoOwoJfQoKCXN3aXRjaCAocHJvdG9jb2wpIHsKCWNhc2UgSVJfUFJPVE9DT0xfUkM1OgoJCWlmICh3YWtlX3NjID4gMHhGRkYpIHsKCQkJZG9fd2FrZSA9IGZhbHNlOwoJCQlkZXZfZXJyKGRldiwgIlJDNSAtIEludmFsaWQgd2FrZSBzY2FuY29kZVxuIik7CgkJCWJyZWFrOwoJCX0KCgkJLyogTWFzayA9IDEzIGJpdHMsIGV4IHRvZ2dsZSAqLwoJCW1hc2tbMF0gPSAweEZGOwoJCW1hc2tbMV0gPSAweDE3OwoKCQltYXRjaFswXSAgPSAod2FrZV9zYyAmIDB4MDAzRik7ICAgICAgLyogNiBjb21tYW5kIGJpdHMgKi8KCQltYXRjaFswXSB8PSAod2FrZV9zYyAmIDB4MDE4MCkgPj4gMTsgLyogMiBhZGRyZXNzIGJpdHMgKi8KCQltYXRjaFsxXSAgPSAod2FrZV9zYyAmIDB4MEUwMCkgPj4gOTsgLyogMyBhZGRyZXNzIGJpdHMgKi8KCQlpZiAoISh3YWtlX3NjICYgMHgwMDQwKSkgICAgICAgICAgICAgLyogMm5kIHN0YXJ0IGJpdCAgKi8KCQkJbWF0Y2hbMV0gfD0gMHgxMDsKCgkJYnJlYWs7CgoJY2FzZSBJUl9QUk9UT0NPTF9ORUM6CgkJaWYgKHdha2Vfc2MgPiAweEZGRkZGRikgewoJCQlkb193YWtlID0gZmFsc2U7CgkJCWRldl9lcnIoZGV2LCAiTkVDIC0gSW52YWxpZCB3YWtlIHNjYW5jb2RlXG4iKTsKCQkJYnJlYWs7CgkJfQoKCQltYXNrWzBdID0gbWFza1sxXSA9IG1hc2tbMl0gPSBtYXNrWzNdID0gMHhGRjsKCgkJbWF0Y2hbMV0gPSBiaXRyZXY4KCh3YWtlX3NjICYgMHhGRikpOwoJCW1hdGNoWzBdID0gfm1hdGNoWzFdOwoKCQltYXRjaFszXSA9IGJpdHJldjgoKHdha2Vfc2MgJiAweEZGMDApID4+IDgpOwoJCWlmICh3YWtlX3NjID4gMHhGRkZGKQoJCQltYXRjaFsyXSA9IGJpdHJldjgoKHdha2Vfc2MgJiAweEZGMDAwMCkgPj4gMTYpOwoJCWVsc2UKCQkJbWF0Y2hbMl0gPSB+bWF0Y2hbM107CgoJCWJyZWFrOwoKCWNhc2UgSVJfUFJPVE9DT0xfUkM2OgoKCQlpZiAod2FrZV9yYzZtb2RlID09IDApIHsKCQkJaWYgKHdha2Vfc2MgPiAweEZGRkYpIHsKCQkJCWRvX3dha2UgPSBmYWxzZTsKCQkJCWRldl9lcnIoZGV2LCAiUkM2IC0gSW52YWxpZCB3YWtlIHNjYW5jb2RlXG4iKTsKCQkJCWJyZWFrOwoJCQl9CgoJCQkvKiBDb21tYW5kICovCgkJCW1hdGNoWzBdID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAgMCk7CgkJCW1hc2tbMF0gID0gMHhGRjsKCQkJbWF0Y2hbMV0gPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+ICA0KTsKCQkJbWFza1sxXSAgPSAweEZGOwoKCQkJLyogQWRkcmVzcyAqLwoJCQltYXRjaFsyXSA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gIDgpOwoJCQltYXNrWzJdICA9IDB4RkY7CgkJCW1hdGNoWzNdID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAxMik7CgkJCW1hc2tbM10gID0gMHhGRjsKCgkJCS8qIEhlYWRlciAqLwoJCQltYXRjaFs0XSA9IDB4NTA7IC8qIG1vZGUxID0gbW9kZTAgPSAwLCBpZ25vcmUgdG9nZ2xlICovCgkJCW1hc2tbNF0gID0gMHhGMDsKCQkJbWF0Y2hbNV0gPSAweDA5OyAvKiBzdGFydCBiaXQgPSAxLCBtb2RlMiA9IDAgKi8KCQkJbWFza1s1XSAgPSAweDBGOwoKCQkJcmM2X2NzbCA9IDQ0OwoKCQl9IGVsc2UgaWYgKHdha2VfcmM2bW9kZSA9PSA2KSB7CgkJCWkgPSAwOwoKCQkJLyogQ29tbWFuZCAqLwoJCQltYXRjaFtpXSAgPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+ICAwKTsKCQkJbWFza1tpKytdID0gMHhGRjsKCQkJbWF0Y2hbaV0gID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAgNCk7CgkJCW1hc2tbaSsrXSA9IDB4RkY7CgoJCQkvKiBBZGRyZXNzICsgVG9nZ2xlICovCgkJCW1hdGNoW2ldICA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gIDgpOwoJCQltYXNrW2krK10gPSAweEZGOwoJCQltYXRjaFtpXSAgPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+IDEyKTsKCQkJbWFza1tpKytdID0gMHgzRjsKCgkJCS8qIEN1c3RvbWVyIGJpdHMgNyAtIDAgKi8KCQkJbWF0Y2hbaV0gID0gd2JjaXJfdG9fcmM2Y2VsbHMod2FrZV9zYyA+PiAxNik7CgkJCW1hc2tbaSsrXSA9IDB4RkY7CgkJCW1hdGNoW2ldICA9IHdiY2lyX3RvX3JjNmNlbGxzKHdha2Vfc2MgPj4gMjApOwoJCQltYXNrW2krK10gPSAweEZGOwoKCQkJaWYgKHdha2Vfc2MgJiAweDgwMDAwMDAwKSB7CgkJCQkvKiBDdXN0b21lciByYW5nZSBiaXQgYW5kIGJpdHMgMTUgLSA4ICovCgkJCQltYXRjaFtpXSAgPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+IDI0KTsKCQkJCW1hc2tbaSsrXSA9IDB4RkY7CgkJCQltYXRjaFtpXSAgPSB3YmNpcl90b19yYzZjZWxscyh3YWtlX3NjID4+IDI4KTsKCQkJCW1hc2tbaSsrXSA9IDB4RkY7CgkJCQlyYzZfY3NsID0gNzY7CgkJCX0gZWxzZSBpZiAod2FrZV9zYyA8PSAweDAwN0ZGRkZGKSB7CgkJCQlyYzZfY3NsID0gNjA7CgkJCX0gZWxzZSB7CgkJCQlkb193YWtlID0gZmFsc2U7CgkJCQlkZXZfZXJyKGRldiwgIlJDNiAtIEludmFsaWQgd2FrZSBzY2FuY29kZVxuIik7CgkJCQlicmVhazsKCQkJfQoKCQkJLyogSGVhZGVyICovCgkJCW1hdGNoW2ldICA9IDB4OTM7IC8qIG1vZGUxID0gbW9kZTAgPSAxLCBzdWJtb2RlID0gMCAqLwoJCQltYXNrW2krK10gPSAweEZGOwoJCQltYXRjaFtpXSAgPSAweDBBOyAvKiBzdGFydCBiaXQgPSAxLCBtb2RlMiA9IDEgKi8KCQkJbWFza1tpKytdID0gMHgwRjsKCgkJfSBlbHNlIHsKCQkJZG9fd2FrZSA9IGZhbHNlOwoJCQlkZXZfZXJyKGRldiwgIlJDNiAtIEludmFsaWQgd2FrZSBtb2RlXG4iKTsKCQl9CgoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJZG9fd2FrZSA9IGZhbHNlOwoJCWJyZWFrOwoJfQoKZmluaXNoOgoJaWYgKGRvX3dha2UpIHsKCQkvKiBTZXQgY29tcGFyZSBhbmQgY29tcGFyZSBtYXNrICovCgkJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfSU5ERVgsCgkJCSAgICAgICBXQkNJUl9SRUdTRUxfQ09NUEFSRSB8IFdCQ0lSX1JFR19BRERSMCwKCQkJICAgICAgIDB4M0YpOwoJCW91dHNiKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0RBVEEsIG1hdGNoLCAxMSk7CgkJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfSU5ERVgsCgkJCSAgICAgICBXQkNJUl9SRUdTRUxfTUFTSyB8IFdCQ0lSX1JFR19BRERSMCwKCQkJICAgICAgIDB4M0YpOwoJCW91dHNiKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0RBVEEsIG1hc2ssIDExKTsKCgkJLyogUkM2IENvbXBhcmUgU3RyaW5nIExlbiAqLwoJCW91dGIocmM2X2NzbCwgZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfQ1NMKTsKCgkJLyogQ2xlYXIgc3RhdHVzIGJpdHMgTkVDX1JFUCwgQlVGRiwgTVNHX0VORCwgTUFUQ0ggKi8KCQl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9TVFMsIDB4MTcsIDB4MTcpOwoKCQkvKiBDbGVhciBCVUZGX0VOLCBDbGVhciBFTkRfRU4sIFNldCBNQVRDSF9FTiAqLwoJCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0VWX0VOLCAweDAxLCAweDA3KTsKCgkJLyogU2V0IENFSVJfRU4gKi8KCQl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9DVEwsIDB4MDEsIDB4MDEpOwoKCX0gZWxzZSB7CgkJLyogQ2xlYXIgQlVGRl9FTiwgQ2xlYXIgRU5EX0VOLCBDbGVhciBNQVRDSF9FTiAqLwoJCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0VWX0VOLCAweDAwLCAweDA3KTsKCgkJLyogQ2xlYXIgQ0VJUl9FTiAqLwoJCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0NUTCwgMHgwMCwgMHgwMSk7Cgl9CgoJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzApOwoJb3V0YihXQkNJUl9JUlFfTk9ORSwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lFUik7CgoJLyogRGlzYWJsZSBMRUQgKi8KCWRhdGEtPmlyZGF0YV9hY3RpdmUgPSBmYWxzZTsKCWxlZF90cmlnZ2VyX2V2ZW50KGRhdGEtPnJ4dHJpZ2dlciwgTEVEX09GRik7CgoJLyoKCSAqIEFDUEkgd2lsbCBzZXQgdGhlIEhXIGRpc2FibGUgYml0IGZvciBTUDMgd2hpY2ggbWVhbnMgdGhhdCB0aGUKCSAqIG91dHB1dCBzaWduYWxzIGFyZSBsZWZ0IGluIGFuIHVuZGVmaW5lZCBzdGF0ZSB3aGljaCBtYXkgY2F1c2UKCSAqIHNwdXJpb3VzIGludGVycnVwdHMgd2hpY2ggd2UgbmVlZCB0byBpZ25vcmUgdW50aWwgdGhlIGhhcmR3YXJlCgkgKiBpcyByZWluaXRpYWxpemVkLgoJICovCglkaXNhYmxlX2lycShkYXRhLT5pcnEpOwp9CgpzdGF0aWMgaW50CndiY2lyX3N1c3BlbmQoc3RydWN0IHBucF9kZXYgKmRldmljZSwgcG1fbWVzc2FnZV90IHN0YXRlKQp7Cgl3YmNpcl9zaHV0ZG93bihkZXZpY2UpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCndiY2lyX2luaXRfaHcoc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEpCnsKCXU4IHRtcDsKCgkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfMCk7CglvdXRiKFdCQ0lSX0lSUV9OT05FLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSUVSKTsKCgkvKiBTZXQgUFJPVF9TRUwsIFJYX0lOViwgQ2xlYXIgQ0VJUl9FTiAobmVlZGVkIGZvciB0aGUgbGVkKSAqLwoJdG1wID0gcHJvdG9jb2wgPDwgNDsKCWlmIChpbnZlcnQpCgkJdG1wIHw9IDB4MDg7CglvdXRiKHRtcCwgZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfQ1RMKTsKCgkvKiBDbGVhciBzdGF0dXMgYml0cyBORUNfUkVQLCBCVUZGLCBNU0dfRU5ELCBNQVRDSCAqLwoJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfU1RTLCAweDE3LCAweDE3KTsKCgkvKiBDbGVhciBCVUZGX0VOLCBDbGVhciBFTkRfRU4sIENsZWFyIE1BVENIX0VOICovCgl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9FVl9FTiwgMHgwMCwgMHgwNyk7CgoJLyogU2V0IFJDNSBjZWxsIHRpbWUgdG8gY29ycmVzcG9uZCB0byAzNiBrSHogKi8KCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX0NGRzEsIDB4NEEsIDB4N0YpOwoKCS8qIFNldCBJUlRYX0lOViAqLwoJaWYgKGludmVydCkKCQlvdXRiKDB4MDQsIGRhdGEtPmViYXNlICsgV0JDSVJfUkVHX0VDRUlSX0NDVEwpOwoJZWxzZQoJCW91dGIoMHgwMCwgZGF0YS0+ZWJhc2UgKyBXQkNJUl9SRUdfRUNFSVJfQ0NUTCk7CgoJLyoKCSAqIENsZWFyIElSIExFRCwgc2V0IFNQMyBjbG9jayB0byAyNE1oegoJICogc2V0IFNQM19JUlJYX1NXIHRvIGJpbmFyeSAwMSwgaGVscGZ1bGx5IG5vdCBkb2N1bWVudGVkCgkgKi8KCW91dGIoMHgxMCwgZGF0YS0+ZWJhc2UgKyBXQkNJUl9SRUdfRUNFSVJfQ1RTKTsKCgkvKiBFbmFibGUgZXh0ZW5kZWQgbW9kZSAqLwoJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS18yKTsKCW91dGIoV0JDSVJfRVhUX0VOQUJMRSwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0VYQ1IxKTsKCgkvKgoJICogQ29uZmlndXJlIGJhdWQgZ2VuZXJhdG9yLCBJUiBkYXRhIHdpbGwgYmUgc2FtcGxlZCBhdAoJICogYSBiaXRyYXRlIG9mOiAoMjRNaHogKiBwcmVzY2FsZXIpIC8gKGRpdmlzb3IgKiAxNikuCgkgKgoJICogVGhlIEVDSVIgcmVnaXN0ZXJzIGluY2x1ZGUgYSBmbGFnIHRvIGNoYW5nZSB0aGUKCSAqIDI0TWh6IGNsb2NrIGZyZXEgdG8gNDhNaHouCgkgKgoJICogSXQncyBub3QgZG9jdW1lbnRlZCBpbiB0aGUgc3BlY3MsIGJ1dCBmaWZvIGxldmVscwoJICogb3RoZXIgdGhhbiAxNiBzZWVtcyB0byBiZSB1bnN1cHBvcnRlZC4KCSAqLwoKCS8qIHByZXNjYWxlciAxLjAsIHR4L3J4IGZpZm8gbHZsIDE2ICovCglvdXRiKDB4MzAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19FWENSMik7CgoJLyogU2V0IGJhdWQgZGl2aXNvciB0byBnZW5lcmF0ZSBvbmUgYnl0ZSBwZXIgYml0L2NlbGwgKi8KCXN3aXRjaCAocHJvdG9jb2wpIHsKCWNhc2UgSVJfUFJPVE9DT0xfUkM1OgoJCW91dGIoMHhBNywgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0JHREwpOwoJCWJyZWFrOwoJY2FzZSBJUl9QUk9UT0NPTF9SQzY6CgkJb3V0YigweDUzLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQkdETCk7CgkJYnJlYWs7CgljYXNlIElSX1BST1RPQ09MX05FQzoKCQlvdXRiKDB4NjksIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19CR0RMKTsKCQlicmVhazsKCX0KCW91dGIoMHgwMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0JHREgpOwoKCS8qIFNldCBDRUlSIG1vZGUgKi8KCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfMCk7CglvdXRiKDB4QzAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19NQ1IpOwoJaW5iKGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19MU1IpOyAvKiBDbGVhciBMU1IgKi8KCWluYihkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfTVNSKTsgLyogQ2xlYXIgTVNSICovCgoJLyogRGlzYWJsZSBSWCBkZW1vZCwgcnVuLWxlbmd0aCBlbmNvZGluZy9kZWNvZGluZywgc2V0IGZyZXEgc3BhbiAqLwoJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS183KTsKCW91dGIoMHgxMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX1JDQ0ZHKTsKCgkvKiBEaXNhYmxlIHRpbWVyICovCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzQpOwoJb3V0YigweDAwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSVJDUjEpOwoKCS8qIEVuYWJsZSBNU1IgaW50ZXJydXB0LCBDbGVhciBBVVhfSVJYICovCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzUpOwoJb3V0YigweDAwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSVJDUjIpOwoKCS8qIERpc2FibGUgQ1JDICovCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzYpOwoJb3V0YigweDIwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSVJDUjMpOwoKCS8qIFNldCBSWC9UWCAoZGUpbW9kdWxhdGlvbiBmcmVxLCBub3QgcmVhbGx5IHVzZWQgKi8KCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfNyk7CglvdXRiKDB4RjIsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19JUlJYREMpOwoJb3V0YigweDY5LCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSVJUWE1DKTsKCgkvKiBTZXQgaW52ZXJ0IGFuZCBwaW4gZGlyZWN0aW9uICovCglpZiAoaW52ZXJ0KQoJCW91dGIoMHgxMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0lSQ0ZHNCk7CgllbHNlCgkJb3V0YigweDAwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSVJDRkc0KTsKCgkvKiBTZXQgRklGTyB0aHJlc2hvbGRzIChSWCA9IDgsIFRYID0gMyksIHJlc2V0IFJYL1RYICovCgl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzApOwoJb3V0YigweDk3LCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfRkNSKTsKCgkvKiBDbGVhciBBVVggc3RhdHVzIGJpdHMgKi8KCW91dGIoMHhFMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0FTQ1IpOwoKCS8qIENsZWFyIElSIGRlY29kaW5nIHN0YXRlICovCglkYXRhLT5pcmRhdGFfYWN0aXZlID0gZmFsc2U7CglsZWRfdHJpZ2dlcl9ldmVudChkYXRhLT5yeHRyaWdnZXIsIExFRF9PRkYpOwoJZGF0YS0+aXJkYXRhX2Vycm9yID0gZmFsc2U7CglkYXRhLT5ldi5kdXJhdGlvbiA9IDA7Cglpcl9yYXdfZXZlbnRfcmVzZXQoZGF0YS0+ZGV2KTsKCWlyX3Jhd19ldmVudF9oYW5kbGUoZGF0YS0+ZGV2KTsKCgkvKiBFbmFibGUgaW50ZXJydXB0cyAqLwoJb3V0YihXQkNJUl9JUlFfUlggfCBXQkNJUl9JUlFfRVJSLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSUVSKTsKfQoKc3RhdGljIGludAp3YmNpcl9yZXN1bWUoc3RydWN0IHBucF9kZXYgKmRldmljZSkKewoJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEgPSBwbnBfZ2V0X2RydmRhdGEoZGV2aWNlKTsKCgl3YmNpcl9pbml0X2h3KGRhdGEpOwoJZW5hYmxlX2lycShkYXRhLT5pcnEpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IF9fZGV2aW5pdAp3YmNpcl9wcm9iZShzdHJ1Y3QgcG5wX2RldiAqZGV2aWNlLCBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCAqZGV2X2lkKQp7CglzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZGV2aWNlLT5kZXY7CglzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YTsKCWludCBlcnI7CgoJaWYgKCEocG5wX3BvcnRfbGVuKGRldmljZSwgMCkgPT0gRUhGVU5DX0lPTUVNX0xFTiAmJgoJICAgICAgcG5wX3BvcnRfbGVuKGRldmljZSwgMSkgPT0gV0FLRVVQX0lPTUVNX0xFTiAmJgoJICAgICAgcG5wX3BvcnRfbGVuKGRldmljZSwgMikgPT0gU1BfSU9NRU1fTEVOKSkgewoJCWRldl9lcnIoZGV2LCAiSW52YWxpZCByZXNvdXJjZXNcbiIpOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCWRhdGEgPSBremFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOwoJaWYgKCFkYXRhKSB7CgkJZXJyID0gLUVOT01FTTsKCQlnb3RvIGV4aXQ7Cgl9CgoJcG5wX3NldF9kcnZkYXRhKGRldmljZSwgZGF0YSk7CgoJc3Bpbl9sb2NrX2luaXQoJmRhdGEtPnNwaW5sb2NrKTsKCWRhdGEtPmViYXNlID0gcG5wX3BvcnRfc3RhcnQoZGV2aWNlLCAwKTsKCWRhdGEtPndiYXNlID0gcG5wX3BvcnRfc3RhcnQoZGV2aWNlLCAxKTsKCWRhdGEtPnNiYXNlID0gcG5wX3BvcnRfc3RhcnQoZGV2aWNlLCAyKTsKCWRhdGEtPmlycSA9IHBucF9pcnEoZGV2aWNlLCAwKTsKCglpZiAoZGF0YS0+d2Jhc2UgPT0gMCB8fCBkYXRhLT5lYmFzZSA9PSAwIHx8CgkgICAgZGF0YS0+c2Jhc2UgPT0gMCB8fCBkYXRhLT5pcnEgPT0gMCkgewoJCWVyciA9IC1FTk9ERVY7CgkJZGV2X2VycihkZXYsICJJbnZhbGlkIHJlc291cmNlc1xuIik7CgkJZ290byBleGl0X2ZyZWVfZGF0YTsKCX0KCglkZXZfZGJnKCZkZXZpY2UtPmRldiwgIkZvdW5kIGRldmljZSAiCgkJIih3OiAweCVsWCwgZTogMHglbFgsIHM6IDB4JWxYLCBpOiAldSlcbiIsCgkJZGF0YS0+d2Jhc2UsIGRhdGEtPmViYXNlLCBkYXRhLT5zYmFzZSwgZGF0YS0+aXJxKTsKCglpZiAoIXJlcXVlc3RfcmVnaW9uKGRhdGEtPndiYXNlLCBXQUtFVVBfSU9NRU1fTEVOLCBEUlZOQU1FKSkgewoJCWRldl9lcnIoZGV2LCAiUmVnaW9uIDB4JWx4LTB4JWx4IGFscmVhZHkgaW4gdXNlIVxuIiwKCQkJZGF0YS0+d2Jhc2UsIGRhdGEtPndiYXNlICsgV0FLRVVQX0lPTUVNX0xFTiAtIDEpOwoJCWVyciA9IC1FQlVTWTsKCQlnb3RvIGV4aXRfZnJlZV9kYXRhOwoJfQoKCWlmICghcmVxdWVzdF9yZWdpb24oZGF0YS0+ZWJhc2UsIEVIRlVOQ19JT01FTV9MRU4sIERSVk5BTUUpKSB7CgkJZGV2X2VycihkZXYsICJSZWdpb24gMHglbHgtMHglbHggYWxyZWFkeSBpbiB1c2UhXG4iLAoJCQlkYXRhLT5lYmFzZSwgZGF0YS0+ZWJhc2UgKyBFSEZVTkNfSU9NRU1fTEVOIC0gMSk7CgkJZXJyID0gLUVCVVNZOwoJCWdvdG8gZXhpdF9yZWxlYXNlX3diYXNlOwoJfQoKCWlmICghcmVxdWVzdF9yZWdpb24oZGF0YS0+c2Jhc2UsIFNQX0lPTUVNX0xFTiwgRFJWTkFNRSkpIHsKCQlkZXZfZXJyKGRldiwgIlJlZ2lvbiAweCVseC0weCVseCBhbHJlYWR5IGluIHVzZSFcbiIsCgkJCWRhdGEtPnNiYXNlLCBkYXRhLT5zYmFzZSArIFNQX0lPTUVNX0xFTiAtIDEpOwoJCWVyciA9IC1FQlVTWTsKCQlnb3RvIGV4aXRfcmVsZWFzZV9lYmFzZTsKCX0KCgllcnIgPSByZXF1ZXN0X2lycShkYXRhLT5pcnEsIHdiY2lyX2lycV9oYW5kbGVyLAoJCQkgIElSUUZfRElTQUJMRUQsIERSVk5BTUUsIGRldmljZSk7CglpZiAoZXJyKSB7CgkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gY2xhaW0gSVJRICV1XG4iLCBkYXRhLT5pcnEpOwoJCWVyciA9IC1FQlVTWTsKCQlnb3RvIGV4aXRfcmVsZWFzZV9zYmFzZTsKCX0KCglsZWRfdHJpZ2dlcl9yZWdpc3Rlcl9zaW1wbGUoImNpci10eCIsICZkYXRhLT50eHRyaWdnZXIpOwoJaWYgKCFkYXRhLT50eHRyaWdnZXIpIHsKCQllcnIgPSAtRU5PTUVNOwoJCWdvdG8gZXhpdF9mcmVlX2lycTsKCX0KCglsZWRfdHJpZ2dlcl9yZWdpc3Rlcl9zaW1wbGUoImNpci1yeCIsICZkYXRhLT5yeHRyaWdnZXIpOwoJaWYgKCFkYXRhLT5yeHRyaWdnZXIpIHsKCQllcnIgPSAtRU5PTUVNOwoJCWdvdG8gZXhpdF91bnJlZ2lzdGVyX3R4dHJpZ2dlcjsKCX0KCglkYXRhLT5sZWQubmFtZSA9ICJjaXI6OmFjdGl2aXR5IjsKCWRhdGEtPmxlZC5kZWZhdWx0X3RyaWdnZXIgPSAiY2lyLXJ4IjsKCWRhdGEtPmxlZC5icmlnaHRuZXNzX3NldCA9IHdiY2lyX2xlZF9icmlnaHRuZXNzX3NldDsKCWRhdGEtPmxlZC5icmlnaHRuZXNzX2dldCA9IHdiY2lyX2xlZF9icmlnaHRuZXNzX2dldDsKCWVyciA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmZGV2aWNlLT5kZXYsICZkYXRhLT5sZWQpOwoJaWYgKGVycikKCQlnb3RvIGV4aXRfdW5yZWdpc3Rlcl9yeHRyaWdnZXI7CgoJZGF0YS0+ZGV2ID0gcmNfYWxsb2NhdGVfZGV2aWNlKCk7CglpZiAoIWRhdGEtPmRldikgewoJCWVyciA9IC1FTk9NRU07CgkJZ290byBleGl0X3VucmVnaXN0ZXJfbGVkOwoJfQoKCWRhdGEtPmRldi0+ZHJpdmVyX25hbWUgPSBXQkNJUl9OQU1FOwoJZGF0YS0+ZGV2LT5pbnB1dF9uYW1lID0gV0JDSVJfTkFNRTsKCWRhdGEtPmRldi0+aW5wdXRfcGh5cyA9ICJ3YmNpci9jaXIwIjsKCWRhdGEtPmRldi0+aW5wdXRfaWQuYnVzdHlwZSA9IEJVU19IT1NUOwoJZGF0YS0+ZGV2LT5pbnB1dF9pZC52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX1dJTkJPTkQ7CglkYXRhLT5kZXYtPmlucHV0X2lkLnByb2R1Y3QgPSBXQkNJUl9JRF9GQU1JTFk7CglkYXRhLT5kZXYtPmlucHV0X2lkLnZlcnNpb24gPSBXQkNJUl9JRF9DSElQOwoJZGF0YS0+ZGV2LT5wcml2ID0gZGF0YTsKCWRhdGEtPmRldi0+ZGV2LnBhcmVudCA9ICZkZXZpY2UtPmRldjsKCgllcnIgPSByY19yZWdpc3Rlcl9kZXZpY2UoZGF0YS0+ZGV2KTsKCWlmIChlcnIpCgkJZ290byBleGl0X2ZyZWVfcmM7CgoJZGV2aWNlX2luaXRfd2FrZXVwKCZkZXZpY2UtPmRldiwgMSk7CgoJd2JjaXJfaW5pdF9odyhkYXRhKTsKCglyZXR1cm4gMDsKCmV4aXRfZnJlZV9yYzoKCXJjX2ZyZWVfZGV2aWNlKGRhdGEtPmRldik7CmV4aXRfdW5yZWdpc3Rlcl9sZWQ6CglsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmZGF0YS0+bGVkKTsKZXhpdF91bnJlZ2lzdGVyX3J4dHJpZ2dlcjoKCWxlZF90cmlnZ2VyX3VucmVnaXN0ZXJfc2ltcGxlKGRhdGEtPnJ4dHJpZ2dlcik7CmV4aXRfdW5yZWdpc3Rlcl90eHRyaWdnZXI6CglsZWRfdHJpZ2dlcl91bnJlZ2lzdGVyX3NpbXBsZShkYXRhLT50eHRyaWdnZXIpOwpleGl0X2ZyZWVfaXJxOgoJZnJlZV9pcnEoZGF0YS0+aXJxLCBkZXZpY2UpOwpleGl0X3JlbGVhc2Vfc2Jhc2U6CglyZWxlYXNlX3JlZ2lvbihkYXRhLT5zYmFzZSwgU1BfSU9NRU1fTEVOKTsKZXhpdF9yZWxlYXNlX2ViYXNlOgoJcmVsZWFzZV9yZWdpb24oZGF0YS0+ZWJhc2UsIEVIRlVOQ19JT01FTV9MRU4pOwpleGl0X3JlbGVhc2Vfd2Jhc2U6CglyZWxlYXNlX3JlZ2lvbihkYXRhLT53YmFzZSwgV0FLRVVQX0lPTUVNX0xFTik7CmV4aXRfZnJlZV9kYXRhOgoJa2ZyZWUoZGF0YSk7CglwbnBfc2V0X2RydmRhdGEoZGV2aWNlLCBOVUxMKTsKZXhpdDoKCXJldHVybiBlcnI7Cn0KCnN0YXRpYyB2b2lkIF9fZGV2ZXhpdAp3YmNpcl9yZW1vdmUoc3RydWN0IHBucF9kZXYgKmRldmljZSkKewoJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEgPSBwbnBfZ2V0X2RydmRhdGEoZGV2aWNlKTsKCgkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfMCk7CglvdXRiKFdCQ0lSX0lSUV9OT05FLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfSUVSKTsKCglmcmVlX2lycShkYXRhLT5pcnEsIGRldmljZSk7CgoJLyogQ2xlYXIgc3RhdHVzIGJpdHMgTkVDX1JFUCwgQlVGRiwgTVNHX0VORCwgTUFUQ0ggKi8KCXdiY2lyX3NldF9iaXRzKGRhdGEtPndiYXNlICsgV0JDSVJfUkVHX1dDRUlSX1NUUywgMHgxNywgMHgxNyk7CgoJLyogQ2xlYXIgQ0VJUl9FTiAqLwoJd2JjaXJfc2V0X2JpdHMoZGF0YS0+d2Jhc2UgKyBXQkNJUl9SRUdfV0NFSVJfQ1RMLCAweDAwLCAweDAxKTsKCgkvKiBDbGVhciBCVUZGX0VOLCBFTkRfRU4sIE1BVENIX0VOICovCgl3YmNpcl9zZXRfYml0cyhkYXRhLT53YmFzZSArIFdCQ0lSX1JFR19XQ0VJUl9FVl9FTiwgMHgwMCwgMHgwNyk7CgoJcmNfdW5yZWdpc3Rlcl9kZXZpY2UoZGF0YS0+ZGV2KTsKCglsZWRfdHJpZ2dlcl91bnJlZ2lzdGVyX3NpbXBsZShkYXRhLT5yeHRyaWdnZXIpOwoJbGVkX3RyaWdnZXJfdW5yZWdpc3Rlcl9zaW1wbGUoZGF0YS0+dHh0cmlnZ2VyKTsKCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZkYXRhLT5sZWQpOwoKCS8qIFRoaXMgaXMgb2sgc2luY2UgJmRhdGEtPmxlZCBpc24ndCBhY3R1YWxseSB1c2VkICovCgl3YmNpcl9sZWRfYnJpZ2h0bmVzc19zZXQoJmRhdGEtPmxlZCwgTEVEX09GRik7CgoJcmVsZWFzZV9yZWdpb24oZGF0YS0+d2Jhc2UsIFdBS0VVUF9JT01FTV9MRU4pOwoJcmVsZWFzZV9yZWdpb24oZGF0YS0+ZWJhc2UsIEVIRlVOQ19JT01FTV9MRU4pOwoJcmVsZWFzZV9yZWdpb24oZGF0YS0+c2Jhc2UsIFNQX0lPTUVNX0xFTik7CgoJa2ZyZWUoZGF0YSk7CgoJcG5wX3NldF9kcnZkYXRhKGRldmljZSwgTlVMTCk7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCB3YmNpcl9pZHNbXSA9IHsKCXsgIldFQzEwMjIiLCAwIH0sCgl7ICIiLCAwIH0KfTsKTU9EVUxFX0RFVklDRV9UQUJMRShwbnAsIHdiY2lyX2lkcyk7CgpzdGF0aWMgc3RydWN0IHBucF9kcml2ZXIgd2JjaXJfZHJpdmVyID0gewoJLm5hbWUgICAgID0gV0JDSVJfTkFNRSwKCS5pZF90YWJsZSA9IHdiY2lyX2lkcywKCS5wcm9iZSAgICA9IHdiY2lyX3Byb2JlLAoJLnJlbW92ZSAgID0gX19kZXZleGl0X3Aod2JjaXJfcmVtb3ZlKSwKCS5zdXNwZW5kICA9IHdiY2lyX3N1c3BlbmQsCgkucmVzdW1lICAgPSB3YmNpcl9yZXN1bWUsCgkuc2h1dGRvd24gPSB3YmNpcl9zaHV0ZG93bgp9OwoKc3RhdGljIGludCBfX2luaXQKd2JjaXJfaW5pdCh2b2lkKQp7CglpbnQgcmV0OwoKCXN3aXRjaCAocHJvdG9jb2wpIHsKCWNhc2UgSVJfUFJPVE9DT0xfUkM1OgoJY2FzZSBJUl9QUk9UT0NPTF9ORUM6CgljYXNlIElSX1BST1RPQ09MX1JDNjoKCQlicmVhazsKCWRlZmF1bHQ6CgkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogSW52YWxpZCBwb3dlci1vbiBwcm90b2NvbFxuIik7Cgl9CgoJcmV0ID0gcG5wX3JlZ2lzdGVyX2RyaXZlcigmd2JjaXJfZHJpdmVyKTsKCWlmIChyZXQpCgkJcHJpbnRrKEtFUk5fRVJSIERSVk5BTUUgIjogVW5hYmxlIHRvIHJlZ2lzdGVyIGRyaXZlclxuIik7CgoJcmV0dXJuIHJldDsKfQoKc3RhdGljIHZvaWQgX19leGl0CndiY2lyX2V4aXQodm9pZCkKewoJcG5wX3VucmVnaXN0ZXJfZHJpdmVyKCZ3YmNpcl9kcml2ZXIpOwp9Cgptb2R1bGVfaW5pdCh3YmNpcl9pbml0KTsKbW9kdWxlX2V4aXQod2JjaXJfZXhpdCk7CgpNT0RVTEVfQVVUSE9SKCJEYXZpZCBI5HJkZW1hbiA8ZGF2aWRAaGFyZGVtYW4ubnU+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiV2luYm9uZCBTdXBlckkvTyBDb25zdW1lciBJUiBEcml2ZXIiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo=