ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYWExMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnCkBAIC0wLDAgKzEsMzY1IEBACisjCisjIFdpcmVsZXNzIExBTiBkZXZpY2UgY29uZmlndXJhdGlvbgorIworCittZW51ICJXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykiCisJZGVwZW5kcyBvbiBORVRERVZJQ0VTCisKK2NvbmZpZyBORVRfUkFESU8KKwlib29sICJXaXJlbGVzcyBMQU4gZHJpdmVycyAobm9uLWhhbXJhZGlvKSAmIFdpcmVsZXNzIEV4dGVuc2lvbnMiCisJLS0taGVscC0tLQorCSAgU3VwcG9ydCBmb3Igd2lyZWxlc3MgTEFOcyBhbmQgZXZlcnl0aGluZyBoYXZpbmcgdG8gZG8gd2l0aCByYWRpbywKKwkgIGJ1dCBub3Qgd2l0aCBhbWF0ZXVyIHJhZGlvIG9yIEZNIGJyb2FkY2FzdGluZy4KKworCSAgU2F5aW5nIFkgaGVyZSBhbHNvIGVuYWJsZXMgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbnMgKGNyZWF0ZXMKKwkgIC9wcm9jL25ldC93aXJlbGVzcyBhbmQgZW5hYmxlcyBpd2NvbmZpZyBhY2Nlc3MpLiBUaGUgV2lyZWxlc3MKKwkgIEV4dGVuc2lvbiBpcyBhIGdlbmVyaWMgQVBJIGFsbG93aW5nIGEgZHJpdmVyIHRvIGV4cG9zZSB0byB0aGUgdXNlcgorCSAgc3BhY2UgY29uZmlndXJhdGlvbiBhbmQgc3RhdGlzdGljcyBzcGVjaWZpYyB0byBjb21tb24gV2lyZWxlc3MgTEFOcy4KKwkgIFRoZSBiZWF1dHkgb2YgaXQgaXMgdGhhdCBhIHNpbmdsZSBzZXQgb2YgdG9vbCBjYW4gc3VwcG9ydCBhbGwgdGhlCisJICB2YXJpYXRpb25zIG9mIFdpcmVsZXNzIExBTnMsIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgdHlwZSAoYXMgbG9uZyBhcworCSAgdGhlIGRyaXZlciBzdXBwb3J0cyBXaXJlbGVzcyBFeHRlbnNpb24pLiBBbm90aGVyIGFkdmFudGFnZSBpcyB0aGF0CisJICB0aGVzZSBwYXJhbWV0ZXJzIG1heSBiZSBjaGFuZ2VkIG9uIHRoZSBmbHkgd2l0aG91dCByZXN0YXJ0aW5nIHRoZQorCSAgZHJpdmVyIChvciBMaW51eCkuIElmIHlvdSB3aXNoIHRvIHVzZSBXaXJlbGVzcyBFeHRlbnNpb25zIHdpdGgKKwkgIHdpcmVsZXNzIFBDTUNJQSAoUEMtKSBjYXJkcywgeW91IG5lZWQgdG8gc2F5IFkgaGVyZTsgeW91IGNhbiBmZXRjaAorCSAgdGhlIHRvb2xzIGZyb20KKwkgIDxodHRwOi8vd3d3LmhwbC5ocC5jb20vcGVyc29uYWwvSmVhbl9Ub3VycmlsaGVzL0xpbnV4L1Rvb2xzLmh0bWw+LgorCisJICBTb21lIHVzZXItbGV2ZWwgZHJpdmVycyBmb3Igc2NhcmFiIGRldmljZXMgd2hpY2ggZG9uJ3QgcmVxdWlyZQorCSAgc3BlY2lhbCBrZXJuZWwgc3VwcG9ydCBhcmUgYXZhaWxhYmxlIGZyb20KKwkgIDxmdHA6Ly9zaGFkb3cuY2FiaS5uZXQvcHViL0xpbnV4Lz4uCisKKyMgTm90ZSA6IHRoZSBjYXJkcyBhcmUgb2Jzb2xldGUgKGNhbid0IGJ1eSB0aGVtIGFueW1vcmUpLCBidXQgdGhlIGRyaXZlcnMKKyMgYXJlIG5vdCwgYXMgcGVvcGxlIGFyZSBzdGlsbCB1c2luZyB0aGVtLi4uCitjb21tZW50ICJPYnNvbGV0ZSBXaXJlbGVzcyBjYXJkcyBzdXBwb3J0IChwcmUtODAyLjExKSIKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiAoSU5FVCB8fCBJU0EgfHwgUENNQ0lBKQorCitjb25maWcgU1RSSVAKKwl0cmlzdGF0ZSAiU1RSSVAgKE1ldHJpY29tIHN0YXJtb2RlIHJhZGlvIElQKSIKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBJTkVUCisJLS0taGVscC0tLQorCSAgU2F5IFkgaWYgeW91IGhhdmUgYSBNZXRyaWNvbSByYWRpbyBhbmQgaW50ZW5kIHRvIHVzZSBTdGFybW9kZSBSYWRpbworCSAgSVAuIFNUUklQIGlzIGEgcmFkaW8gcHJvdG9jb2wgZGV2ZWxvcGVkIGZvciB0aGUgTW9zcXVpdG9OZXQgcHJvamVjdAorCSAgKG9uIHRoZSBXV1cgYXQgPGh0dHA6Ly9tb3NxdWl0b25ldC5zdGFuZm9yZC5lZHUvPikgdG8gc2VuZCBJbnRlcm5ldAorCSAgdHJhZmZpYyB1c2luZyBNZXRyaWNvbSByYWRpb3MuICBNZXRyaWNvbSByYWRpb3MgYXJlIHNtYWxsLCBiYXR0ZXJ5CisJICBwb3dlcmVkLCAxMDBrYml0L3NlYyBwYWNrZXQgcmFkaW8gdHJhbnNjZWl2ZXJzLCBhYm91dCB0aGUgc2l6ZSBhbmQKKwkgIHdlaWdodCBvZiBhIGNlbGx1bGFyIHRlbGVwaG9uZS4gKFlvdSBtYXkgYWxzbyBoYXZlIGhlYXJkIHRoZW0gY2FsbGVkCisJICAiTWV0cmljb20gbW9kZW1zIiBidXQgd2UgYXZvaWQgdGhlIHRlcm0gIm1vZGVtIiBiZWNhdXNlIGl0IG1pc2xlYWRzCisJICBtYW55IHBlb3BsZSBpbnRvIHRoaW5raW5nIHRoYXQgeW91IGNhbiBwbHVnIGEgTWV0cmljb20gbW9kZW0gaW50byBhCisJICBwaG9uZSBsaW5lIGFuZCB1c2UgaXQgYXMgYSBtb2RlbS4pCisKKwkgIFlvdSBjYW4gdXNlIFNUUklQIG9uIGFueSBMaW51eCBtYWNoaW5lIHdpdGggYSBzZXJpYWwgcG9ydCwgYWx0aG91Z2gKKwkgIGl0IGlzIG9idmlvdXNseSBtb3N0IHVzZWZ1bCBmb3IgcGVvcGxlIHdpdGggbGFwdG9wIGNvbXB1dGVycy4gSWYgeW91CisJICB0aGluayB5b3UgbWlnaHQgZ2V0IGEgTWV0cmljb20gcmFkaW8gaW4gdGhlIGZ1dHVyZSwgdGhlcmUgaXMgbm8gaGFybQorCSAgaW4gc2F5aW5nIFkgdG8gU1RSSVAgbm93LCBleGNlcHQgdGhhdCBpdCBtYWtlcyB0aGUga2VybmVsIGEgYml0CisJICBiaWdnZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgc3RyaXAuCisKK2NvbmZpZyBBUkxBTgorCXRyaXN0YXRlICJBaXJvbmV0IEFybGFuIDY1NSAmIElDMjIwMCBEUyBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIElTQSAmJiAhNjRCSVQKKwktLS1oZWxwLS0tCisJICBBaXJvbmV0IG1ha2VzIEFybGFuLCBhIGNsYXNzIG9mIHdpcmVsZXNzIExBTiBhZGFwdGVycy4gVGhlc2UgdXNlIHRoZQorCSAgd3d3LlRlbHhvbi5jb20gY2hpcCwgd2hpY2ggaXMgYWxzbyB1c2VkIG9uIHNldmVyYWwgc2ltaWxhciBjYXJkcy4KKwkgIFRoaXMgZHJpdmVyIGlzIHRlc3RlZCBvbiB0aGUgNjU1IGFuZCBJQzIyMDAgc2VyaWVzIGNhcmRzLiBMb29rIGF0CisJICA8aHR0cDovL3d3dy55bGVudXJtZS5lZS9+ZWxtZXIvNjU1Lz4gZm9yIHRoZSBsYXRlc3QgaW5mb3JtYXRpb24uCisKKwkgIFRoZSBkcml2ZXIgaXMgYnVpbHQgYXMgdHdvIG1vZHVsZXMsIGFybGFuIGFuZCBhcmxhbi1wcm9jLiBUaGUgbGF0dGVyCisJICBpcyB0aGUgL3Byb2MgaW50ZXJmYWNlIGFuZCBpcyBub3QgbmVlZGVkIG1vc3Qgb2YgdGltZS4KKworCSAgT24gc29tZSBjb21wdXRlcnMgdGhlIGNhcmQgZW5kcyB1cCBpbiBub24tdmFsaWQgc3RhdGUgYWZ0ZXIgc29tZQorCSAgdGltZS4gVXNlIGEgcGluZy1yZXNldCBzY3JpcHQgdG8gY2xlYXIgaXQuCisKK2NvbmZpZyBXQVZFTEFOCisJdHJpc3RhdGUgIkFUJlQvTHVjZW50IG9sZCBXYXZlTEFOICYgREVDIFJvYW1BYm91dCBEUyBJU0Egc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBJU0EKKwktLS1oZWxwLS0tCisJICBUaGUgTHVjZW50IFdhdmVMQU4gKGZvcm1lcmx5IE5DUiBhbmQgQVQmVDsgb3IgREVDIFJvYW1BYm91dCBEUykgaXMKKwkgIGEgUmFkaW8gTEFOICh3aXJlbGVzcyBFdGhlcm5ldC1saWtlIExvY2FsIEFyZWEgTmV0d29yaykgdXNpbmcgdGhlCisJICByYWRpbyBmcmVxdWVuY2llcyA5MDAgTUh6IGFuZCAyLjQgR0h6LgorCisJICBUaGlzIGRyaXZlciBzdXBwb3J0IHRoZSBJU0EgdmVyc2lvbiBvZiB0aGUgV2F2ZUxBTiBjYXJkLiAgQSBzZXBhcmF0ZQorCSAgZHJpdmVyIGZvciB0aGUgUENNQ0lBIChQQy1jYXJkKSBoYXJkd2FyZSBpcyBhdmFpbGFibGUgaW4gRGF2aWQKKwkgIEhpbmRzJyBwY21jaWEtY3MgcGFja2FnZSAoc2VlIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vQ2hhbmdlcz4KKwkgIGZvciBsb2NhdGlvbikuCisKKwkgIElmIHlvdSB3YW50IHRvIHVzZSBhbiBJU0EgV2F2ZUxBTiBjYXJkIHVuZGVyIExpbnV4LCBzYXkgWSBhbmQgcmVhZAorCSAgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gU29tZSBtb3JlIHNwZWNpZmljCisJICBpbmZvcm1hdGlvbiBpcyBjb250YWluZWQgaW4KKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy93YXZlbGFuLnR4dD4gYW5kIGluIHRoZSBzb3VyY2UgY29kZQorCSAgPGZpbGU6ZHJpdmVycy9uZXQvd2F2ZWxhbi5wLmg+LgorCisJICBZb3Ugd2lsbCBhbHNvIG5lZWQgdGhlIHdpcmVsZXNzIHRvb2xzIHBhY2thZ2UgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LmhwbC5ocC5jb20vcGVyc29uYWwvSmVhbl9Ub3VycmlsaGVzL0xpbnV4L1Rvb2xzLmh0bWw+LgorCSAgUGxlYXNlIHJlYWQgdGhlIG1hbiBwYWdlcyBjb250YWluZWQgdGhlcmVpbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgd2F2ZWxhbi4KKworY29uZmlnIFBDTUNJQV9XQVZFTEFOCisJdHJpc3RhdGUgIkFUJlQvTHVjZW50IG9sZCBXYXZlTEFOIFBjbWNpYSB3aXJlbGVzcyBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFBDTUNJQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggYW4gQVQmVC9MdWNlbnQgV2F2ZWxhbiBQQ01DSUEKKwkgIChQQy1jYXJkKSB3aXJlbGVzcyBFdGhlcm5ldCBuZXR3b3JraW5nIGNhcmQgdG8geW91ciBjb21wdXRlci4gIFRoaXMKKwkgIGRyaXZlciBpcyBmb3IgdGhlIG5vbi1JRUVFLTgwMi4xMSBXYXZlbGFuIGNhcmRzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCB3YXZlbGFuX2NzLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFBDTUNJQV9ORVRXQVZFCisJdHJpc3RhdGUgIlhpcmNvbSBOZXR3YXZlIEFpclN1cmZlciBQY21jaWEgd2lyZWxlc3Mgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBQQ01DSUEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIHRoaXMgdHlwZSBvZiBQQ01DSUEgKFBDLWNhcmQpCisJICB3aXJlbGVzcyBFdGhlcm5ldCBuZXR3b3JraW5nIGNhcmQgdG8geW91ciBjb21wdXRlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgbmV0d2F2ZV9jcy4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbW1lbnQgIldpcmVsZXNzIDgwMi4xMSBGcmVxdWVuY3kgSG9wcGluZyBjYXJkcyBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFBDTUNJQQorCitjb25maWcgUENNQ0lBX1JBWUNTCisJdHJpc3RhdGUgIkF2aWF0b3IvUmF5dGhlb24gMi40TUh6IHdpcmVsZXNzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgUENNQ0lBCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIGF0dGFjaCBhbiBBdmlhdG9yL1JheXRoZW9uIFBDTUNJQQorCSAgKFBDLWNhcmQpIHdpcmVsZXNzIEV0aGVybmV0IG5ldHdvcmtpbmcgY2FyZCB0byB5b3VyIGNvbXB1dGVyLgorCSAgUGxlYXNlIHJlYWQgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3JheV9jcy50eHQ+IGZvcgorCSAgZGV0YWlscy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgcmF5X2NzLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29tbWVudCAiV2lyZWxlc3MgODAyLjExYiBJU0EvUENJIGNhcmRzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgKElTQSB8fCBQQ0kgfHwgUFBDX1BNQUMgfHwgUENNQ0lBKQorCitjb25maWcgQUlSTworCXRyaXN0YXRlICJDaXNjby9BaXJvbmV0IDM0WC8zNVgvNDUwMC80ODAwIElTQSBhbmQgUENJIGNhcmRzIgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIElTQSAmJiAoUENJIHx8IEJST0tFTikKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSBzdGFuZGFyZCBMaW51eCBkcml2ZXIgdG8gc3VwcG9ydCBDaXNjby9BaXJvbmV0IElTQSBhbmQKKwkgIFBDSSA4MDIuMTEgd2lyZWxlc3MgY2FyZHMuCisJICBJdCBzdXBwb3J0cyB0aGUgbmV3IDgwMi4xMWIgY2FyZHMgZnJvbSBDaXNjbyAoQ2lzY28gMzRYLCBDaXNjbyAzNVgKKwkgIC0gd2l0aCBvciB3aXRob3V0IGVuY3J5cHRpb24pIGFzIHdlbGwgYXMgY2FyZCBiZWZvcmUgdGhlIENpc2NvCisJICBhcXVpc2l0aW9uIChBaXJvbmV0IDQ1MDAsIEFpcm9uZXQgNDgwMCwgQWlyb25ldCA0ODAwQikuCisKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnQgYm90aCB0aGUgc3RhbmRhcmQgTGludXggV2lyZWxlc3MgRXh0ZW5zaW9ucworCSAgYW5kIENpc2NvIHByb3ByaWV0YXJ5IEFQSSwgc28gYm90aCB0aGUgTGludXggV2lyZWxlc3MgVG9vbHMgYW5kIHRoZQorCSAgQ2lzY28gTGludXggdXRpbGl0aWVzIGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgY2FyZC4KKworCSAgVGhlIGRyaXZlciBjYW4gYmUgY29tcGlsZWQgYXMgYSBtb2R1bGUgYW5kIHdpbGwgYmUgbmFtZWQgImFpcm8iLgorCitjb25maWcgSEVSTUVTCisJdHJpc3RhdGUgIkhlcm1lcyBjaGlwc2V0IDgwMi4xMWIgc3VwcG9ydCAoT3Jpbm9jby9QcmlzbTIvU3ltYm9sKSIKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiAoUFBDX1BNQUMgfHwgUENJIHx8IFBDTUNJQSkKKwktLS1oZWxwLS0tCisJICBBIGRyaXZlciBmb3IgODAyLjExYiB3aXJlbGVzcyBjYXJkcyBiYXNlZCBiYXNlZCBvbiB0aGUgIkhlcm1lcyIgb3IKKwkgIEludGVyc2lsIEhGQTM4NHggKFByaXNtIDIpIE1BQyBjb250cm9sbGVyLiAgVGhpcyBpbmNsdWRlcyB0aGUgdmFzdAorCSAgbWFqb3JpdHkgb2YgdGhlIFBDTUNJQSA4MDIuMTFiIGNhcmRzICh3aGljaCBhcmUgbmVhcmx5IGFsbCByZWJhZGdlcykKKwkgIC0gZXhjZXB0IGZvciB0aGUgQ2lzY28vQWlyb25ldCBjYXJkcy4gIENhcmRzIHN1cHBvcnRlZCBpbmNsdWRlIHRoZQorCSAgQXBwbGUgQWlycG9ydCAobm90IGEgUENNQ0lBIGNhcmQpLCBXYXZlbGFuSUVFRS9Pcmlub2NvLAorCSAgQ2FibGV0cm9uL0VudGVyYVN5cyBSb2FtYWJvdXQsIEVMU0EgQWlyTGFuY2VyLCBNRUxDTyBCdWZmYWxvLCBBdmF5YSwKKwkgIElCTSBIaWdoIFJhdGUgV2lyZWxlc3MsIEZhcnJhbG9uIFN5eWxpbmUsIFNhbXN1bmcgTWFnaWNMQU4sIE5ldGdlYXIKKwkgIE1BNDAxLCBMaW5rU3lzIFdQQy0xMSwgRC1MaW5rIERXTC02NTAsIDNDb20gQWlyQ29ubmVjdCwgSW50ZWwKKwkgIFBSTy9XaXJlbGVzcywgYW5kIFN5bWJvbCBTcGVjdHJ1bTI0IEhpZ2ggUmF0ZSBhbW9uZ3N0IG90aGVycy4KKworCSAgVGhpcyBvcHRpb24gaW5jbHVkZXMgdGhlIGd1dHMgb2YgdGhlIGRyaXZlciwgYnV0IGluIG9yZGVyIHRvCisJICBhY3R1YWxseSB1c2UgYSBjYXJkIHlvdSB3aWxsIGFsc28gbmVlZCB0byBlbmFibGUgc3VwcG9ydCBmb3IgUENNQ0lBCisJICBIZXJtZXMgY2FyZHMsIFBMWDkwNTIgYmFzZWQgUENJIGFkYXB0b3JzIG9yIHRoZSBBcHBsZSBBaXJwb3J0IGJlbG93LgorCisJICBZb3Ugd2lsbCBhbHNvIHZlcnkgbGlrZWx5IGFsc28gbmVlZCB0aGUgV2lyZWxlc3MgVG9vbHMgaW4gb3JkZXIgdG8KKwkgIGNvbmZpZ3VyZSB5b3VyIGNhcmQgYW5kIHRoYXQgL2V0Yy9wY21jaWEvd2lyZWxlc3Mub3B0cyB3b3JrcyA6CisJICA8aHR0cDovL3d3dy5ocGwuaHAuY29tL3BlcnNvbmFsL0plYW5fVG91cnJpbGhlcy9MaW51eC9Ub29scy5odG1sPgorCitjb25maWcgQVBQTEVfQUlSUE9SVAorCXRyaXN0YXRlICJBcHBsZSBBaXJwb3J0IHN1cHBvcnQgKGJ1aWx0LWluKSIKKwlkZXBlbmRzIG9uIFBQQ19QTUFDICYmIEhFUk1FUworCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgQWlycG9ydCA4MDIuMTFiIHdpcmVsZXNzIEV0aGVybmV0IGhhcmR3YXJlCisJICBidWlsdCBpbnRvIHRoZSBNYWNpbnRvc2ggaUJvb2sgYW5kIG90aGVyIHJlY2VudCBQb3dlclBDLWJhc2VkCisJICBNYWNpbnRvc2ggbWFjaGluZXMuIFRoaXMgaXMgZXNzZW50aWFsbHkgYSBMdWNlbnQgT3Jpbm9jbyBjYXJkIHdpdGggCisJICBhIG5vbi1zdGFuZGFyZCBpbnRlcmZhY2UKKworY29uZmlnIFBMWF9IRVJNRVMKKwl0cmlzdGF0ZSAiSGVybWVzIGluIFBMWDkwNTIgYmFzZWQgUENJIGFkYXB0b3Igc3VwcG9ydCAoTmV0Z2VhciBNQTMwMSBldGMuKSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFBDSSAmJiBIRVJNRVMgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIFBDTUNJQSBjYXJkcyBzdXBwb3J0ZWQgYnkgdGhlICJIZXJtZXMiIChha2EKKwkgIG9yaW5vY28pIGRyaXZlciB3aGVuIHVzZWQgaW4gUExYOTA1MiBiYXNlZCBQQ0kgYWRhcHRvcnMuICBUaGVzZQorCSAgYWRhcHRvcnMgYXJlIG5vdCBhIGZ1bGwgUENNQ0lBIGNvbnRyb2xsZXIgYnV0IGFjdCBhcyBhIG1vcmUgbGltaXRlZAorCSAgUENJIDwtPiBQQ01DSUEgYnJpZGdlLiAgU2V2ZXJhbCB2ZW5kb3JzIHNlbGwgc3VjaCBhZGFwdG9ycyBzbyB0aGF0CisJICA4MDIuMTFiIFBDTUNJQSBjYXJkcyBjYW4gYmUgdXNlZCBpbiBkZXNrdG9wIG1hY2hpbmVzLiAgVGhlIE5ldGdlYXIKKwkgIE1BMzAxIGlzIHN1Y2ggYW4gYWRhcHRvci4KKworCSAgU3VwcG9ydCBmb3IgdGhlc2UgYWRhcHRvcnMgaXMgc28gZmFyIHN0aWxsIGluY29tcGxldGUgYW5kIGJ1Z2d5LgorCSAgWW91IGhhdmUgYmVlbiB3YXJuZWQuCisKK2NvbmZpZyBUTURfSEVSTUVTCisJdHJpc3RhdGUgIkhlcm1lcyBpbiBUTUQ3MTYwIGJhc2VkIFBDSSBhZGFwdG9yIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBQQ0kgJiYgSEVSTUVTICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBQQ01DSUEgY2FyZHMgc3VwcG9ydGVkIGJ5IHRoZSAiSGVybWVzIiAoYWthCisJICBvcmlub2NvKSBkcml2ZXIgd2hlbiB1c2VkIGluIFRNRDcxNjAgYmFzZWQgUENJIGFkYXB0b3JzLiAgVGhlc2UKKwkgIGFkYXB0b3JzIGFyZSBub3QgYSBmdWxsIFBDTUNJQSBjb250cm9sbGVyIGJ1dCBhY3QgYXMgYSBtb3JlIGxpbWl0ZWQKKwkgIFBDSSA8LT4gUENNQ0lBIGJyaWRnZS4gIFNldmVyYWwgdmVuZG9ycyBzZWxsIHN1Y2ggYWRhcHRvcnMgc28gdGhhdAorCSAgODAyLjExYiBQQ01DSUEgY2FyZHMgY2FuIGJlIHVzZWQgaW4gZGVza3RvcCBtYWNoaW5lcy4KKworCSAgU3VwcG9ydCBmb3IgdGhlc2UgYWRhcHRvcnMgaXMgc28gZmFyIHN0aWxsIGluY29tcGxldGUgYW5kIGJ1Z2d5LgorCSAgWW91IGhhdmUgYmVlbiB3YXJuZWQuCisKK2NvbmZpZyBQQ0lfSEVSTUVTCisJdHJpc3RhdGUgIlByaXNtIDIuNSBQQ0kgODAyLjExYiBhZGFwdG9yIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBQQ0kgJiYgSEVSTUVTICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBQQ0kgYW5kIG1pbmktUENJIDgwMi4xMWIgd2lyZWxlc3MgTklDcyBiYXNlZCBvbgorCSAgdGhlIFByaXNtIDIuNSBjaGlwc2V0LiAgVGhlc2UgYXJlIHRydWUgUENJIGNhcmRzLCBub3QgdGhlIDgwMi4xMWIKKwkgIFBDTUNJQSBjYXJkcyBidW5kbGVkIHdpdGggUENJPC0+UENNQ0lBIGFkYXB0b3JzIHdoaWNoIGFyZSBhbHNvCisJICBjb21tb24uICBTb21lIG9mIHRoZSBidWlsdC1pbiB3aXJlbGVzcyBhZGFwdG9ycyBpbiBsYXB0b3BzIGFyZSBvZgorCSAgdGhpcyB2YXJpZXR5LgorCitjb25maWcgQVRNRUwKKyAgICAgIHRyaXN0YXRlICJBdG1lbCBhdDc2YzUweCBjaGlwc2V0ICA4MDIuMTFiIHN1cHBvcnQiCisgICAgICBkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBFWFBFUklNRU5UQUwKKyAgICAgIHNlbGVjdCBGV19MT0FERVIKKyAgICAgIHNlbGVjdCBDUkMzMgorICAgICAgIC0tLWhlbHAtLS0KKyAgICAgICAgQSBkcml2ZXIgODAyLjExYiB3aXJlbGVzcyBjYXJkcyBiYXNlZCBvbiB0aGUgQXRtZWwgZmFzdC12bmV0CisgICAgICAgIGNoaXBzLiBUaGlzIGRyaXZlciBzdXBwb3J0cyBzdGFuZGFyZCBMaW51eCB3aXJlbGVzcyBleHRlbnNpb25zLiAKKyAKKyAgICAgICAgTWFueSAgY2FyZHMgYmFzZWQgb24gdGhpcyBjaGlwc2V0IGRvIG5vdCBoYXZlIGZsYXNoIG1lbW9yeQorICAgICAgICBhbmQgbmVlZCB0aGVpciBmaXJtd2FyZSBsb2FkZWQgYXQgc3RhcnQtdXAuIElmIHlvdXJzIGlzIAorICAgICAgICBvbmUgb2YgdGhlc2UsIHlvdSB3aWxsIG5lZWQgdG8gcHJvdmlkZSBhIGZpcm13YXJlIGltYWdlCisgICAgICAgIHRvIGJlIGxvYWRlZCBpbnRvIHRoZSBjYXJkIGJ5IHRoZSBkcml2ZXIuIFRoZSBBdG1lbAorICAgICAgICBmaXJtd2FyZSBwYWNrYWdlIGNhbiBiZSBkb3dubG9hZGVkIGZyb20KKyAgICAgICAgPGh0dHA6Ly93d3cudGhla2VsbGV5cy5vcmcudWsvYXRtZWw+CisKK2NvbmZpZyBQQ0lfQVRNRUwKKyAgICAgIHRyaXN0YXRlICJBdG1lbCBhdDc2YzUwNiBQQ0kgY2FyZHMiCisgICAgICBkZXBlbmRzIG9uIEFUTUVMICYmIFBDSQorICAgICAgIC0tLWhlbHAtLS0KKyAgICAgICAgRW5hYmxlIHN1cHBvcnQgZm9yIFBDSSBhbmQgbWluaS1QQ0kgY2FyZHMgY29udGFpbmluZyB0aGUKKyAgICAgICAgQXRtZWwgYXQ3NmM1MDYgY2hpcC4KKworIyBJZiBQY21jaWEgaXMgY29tcGlsZWQgaW4sIG9mZmVyIFBjbWNpYSBjYXJkcy4uLgorY29tbWVudCAiV2lyZWxlc3MgODAyLjExYiBQY21jaWEvQ2FyZGJ1cyBjYXJkcyBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFBDTUNJQQorCitjb25maWcgUENNQ0lBX0hFUk1FUworCXRyaXN0YXRlICJIZXJtZXMgUENNQ0lBIGNhcmQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBQQ01DSUEgJiYgSEVSTUVTCisJLS0taGVscC0tLQorCSAgQSBkcml2ZXIgZm9yICJIZXJtZXMiIGNoaXBzZXQgYmFzZWQgUENNQ0lBIHdpcmVsZXNzIGFkYXB0b3JzLCBzdWNoCisJICBhcyB0aGUgTHVjZW50IFdhdmVsYW5JRUVFL09yaW5vY28gY2FyZHMgYW5kIHRoZWlyIE9FTSAoQ2FibGV0cm9uLworCSAgRW50ZXJhU3lzIFJvYW1BYm91dCA4MDIuMTEsIEVMU0EgQWlybGFuY2VyLCBNZWxjbyBCdWZmYWxvIGFuZAorCSAgb3RoZXJzKS4gIEl0IHNob3VsZCBhbHNvIGJlIHVzYWJsZSBvbiB2YXJpb3VzIFByaXNtIElJIGJhc2VkIGNhcmRzCisJICBzdWNoIGFzIHRoZSBMaW5rc3lzLCBELUxpbmsgYW5kIEZhcmFsbG9uIFNreWxpbmUuICBJdCBzaG91bGQgYWxzbworCSAgd29yayBvbiBTeW1ib2wgY2FyZHMgc3VjaCBhcyB0aGUgM0NvbSBBaXJDb25uZWN0IGFuZCBFcmljc3NvbiBXTEFOLgorCisJICBUbyB1c2UgeW91ciBQQy1jYXJkcywgeW91IHdpbGwgbmVlZCBzdXBwb3J0aW5nIHNvZnR3YXJlIGZyb20gRGF2aWQKKwkgIEhpbmRzJyBwY21jaWEtY3MgcGFja2FnZSAoc2VlIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vQ2hhbmdlcz4KKwkgIGZvciBsb2NhdGlvbikuICBZb3UgYWxzbyB3YW50IHRvIGNoZWNrIG91dCB0aGUgUENNQ0lBLUhPV1RPLAorCSAgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgWW91IHdpbGwgYWxzbyB2ZXJ5IGxpa2VseSBhbHNvIG5lZWQgdGhlIFdpcmVsZXNzIFRvb2xzIGluIG9yZGVyIHRvCisJICBjb25maWd1cmUgeW91ciBjYXJkIGFuZCB0aGF0IC9ldGMvcGNtY2lhL3dpcmVsZXNzLm9wdHMgd29ya3M6CisJICA8aHR0cDovL3d3dy5ocGwuaHAuY29tL3BlcnNvbmFsL0plYW5fVG91cnJpbGhlcy9MaW51eC9Ub29scy5odG1sPi4KKworY29uZmlnIEFJUk9fQ1MKKwl0cmlzdGF0ZSAiQ2lzY28vQWlyb25ldCAzNFgvMzVYLzQ1MDAvNDgwMCBQQ01DSUEgY2FyZHMiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgUENNQ0lBCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgc3RhbmRhcmQgTGludXggZHJpdmVyIHRvIHN1cHBvcnQgQ2lzY28vQWlyb25ldCBQQ01DSUEKKwkgIDgwMi4xMSB3aXJlbGVzcyBjYXJkcy4gIFRoaXMgZHJpdmVyIGlzIHRoZSBzYW1lIGFzIHRoZSBBaXJvbmV0CisJICBkcml2ZXIgcGFydCBvZiB0aGUgTGludXggUGNtY2lhIHBhY2thZ2UuCisJICBJdCBzdXBwb3J0cyB0aGUgbmV3IDgwMi4xMWIgY2FyZHMgZnJvbSBDaXNjbyAoQ2lzY28gMzRYLCBDaXNjbyAzNVgKKwkgIC0gd2l0aCBvciB3aXRob3V0IGVuY3J5cHRpb24pIGFzIHdlbGwgYXMgY2FyZCBiZWZvcmUgdGhlIENpc2NvCisJICBhcXVpc2l0aW9uIChBaXJvbmV0IDQ1MDAsIEFpcm9uZXQgNDgwMCwgQWlyb25ldCA0ODAwQikuIEl0IGFsc28KKwkgIHN1cHBvcnRzIE9FTSBvZiBDaXNjbyBzdWNoIGFzIHRoZSBERUxMIFRydWVNb2JpbGUgNDgwMCBhbmQgWGlyY29tCisJICA4MDIuMTFiIGNhcmRzLgorCisJICBUaGlzIGRyaXZlciBzdXBwb3J0IGJvdGggdGhlIHN0YW5kYXJkIExpbnV4IFdpcmVsZXNzIEV4dGVuc2lvbnMKKwkgIGFuZCBDaXNjbyBwcm9wcmlldGFyeSBBUEksIHNvIGJvdGggdGhlIExpbnV4IFdpcmVsZXNzIFRvb2xzIGFuZCB0aGUKKwkgIENpc2NvIExpbnV4IHV0aWxpdGllcyBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIGNhcmQuCisKKwkgIFRvIHVzZSB5b3VyIFBDLWNhcmRzLCB5b3Ugd2lsbCBuZWVkIHN1cHBvcnRpbmcgc29mdHdhcmUgZnJvbSBEYXZpZAorCSAgSGluZHMnIHBjbWNpYS1jcyBwYWNrYWdlIChzZWUgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9DaGFuZ2VzPgorCSAgZm9yIGxvY2F0aW9uKS4gIFlvdSBhbHNvIHdhbnQgdG8gY2hlY2sgb3V0IHRoZSBQQ01DSUEtSE9XVE8sCisJICBhdmFpbGFibGUgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCitjb25maWcgUENNQ0lBX0FUTUVMCisJdHJpc3RhdGUgIkF0bWVsIGF0NzZjNTAyL2F0NzZjNTA0IFBDTUNJQSBjYXJkcyIKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBBVE1FTCAmJiBQQ01DSUEKKwlzZWxlY3QgRldfTE9BREVSCisJc2VsZWN0IENSQzMyCisJLS0taGVscC0tLQorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIFBDTUNJQSBjYXJkcyBjb250YWluaW5nIHRoZQorCSAgQXRtZWwgYXQ3NmM1MDIgYW5kIGF0NzZjNTA0IGNoaXBzLgorCitjb25maWcgUENNQ0lBX1dMMzUwMQorICAgICAgdHJpc3RhdGUgIlBsYW5ldCBXTDM1MDEgUENNQ0lBIGNhcmRzIgorICAgICAgZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgRVhQRVJJTUVOVEFMICYmIFBDTUNJQQorICAgICAgIC0tLWhlbHAtLS0KKyAgICAgICAgIEEgZHJpdmVyIGZvciBXTDM1MDEgUENNQ0lBIDgwMi4xMSB3aXJlbGVzcyBjYXJkcyBtYWRlIGJ5IFBsYW5ldC4KKwkgSXQgaGFzIGJhc2ljIHN1cHBvcnQgZm9yIExpbnV4IHdpcmVsZXNzIGV4dGVuc2lvbnMgYW5kIGluaXRpYWwKKwkgbWljcm8gc3VwcG9ydCBmb3IgZXRodG9vbC4KKworY29tbWVudCAiUHJpc20gR1QvRHVldHRlIDgwMi4xMShhL2IvZykgUENJL0NhcmRidXMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBQQ0kKK2NvbmZpZyBQUklTTTU0CisJdHJpc3RhdGUgJ0ludGVyc2lsIFByaXNtIEdUL0R1ZXR0ZS9JbmRpZ28gUENJL0NhcmRidXMnIAorCWRlcGVuZHMgb24gUENJICYmIE5FVF9SQURJTyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgRldfTE9BREVSCisJLS0taGVscC0tLQorCSAgRW5hYmxlIFBDSSBhbmQgQ2FyZGJ1cyBzdXBwb3J0IGZvciB0aGUgZm9sbG93aW5nIGNoaXBzZXQgYmFzZWQgY2FyZHM6CisKKwkgIElTTDM4ODAgLSBQcmlzbSBHVCAgICAgICAgICAgIDgwMi4xMSBiL2cKKwkgIElTTDM4NzcgLSBQcmlzbSBJbmRpZ28gICAgICAgIDgwMi4xMSBhCisJICBJU0wzODkwIC0gUHJpc20gRHVldHRlICAgICAgICA4MDIuMTEgYS9iL2cKKwkgIAorCSAgRm9yIGEgY29tcGxldGUgbGlzdCBvZiBzdXBwb3J0ZWQgY2FyZHMgdmlzaXQgPGh0dHA6Ly9wcmlzbTU0Lm9yZz4uCisJICBIZXJlIGlzIHRoZSBsYXRlc3QgY29uZmlybWVkIGxpc3Qgb2Ygc3VwcG9ydGVkIGNhcmRzOgorCisJICAzY29tIE9mZmljZUNvbm5lY3QgMTFnIENhcmRidXMgQ2FyZCBha2EgM0NSV0UxNTRHNzIKKwkgIEFsbG5ldCBBTEwwMjcxIFBDSSBDYXJkCisJICBDb21wZXggV0w1NEcgQ2FyZGJ1cyBDYXJkCisJICBDb3JlZ2EgQ0ctV0xDQjU0R1QgQ2FyZGJ1cyBDYXJkCisJICBELUxpbmsgQWlyIFBsdXMgWHRyZW1lIEcgQTEgQ2FyZGJ1cyBDYXJkIGFrYSBEV0wtZzY1MAorCSAgSS1PIERhdGEgV04tRzU0L0NCIENhcmRidXMgQ2FyZAorCSAgS29iaXNoaSBYRy0zMDAgYWthIFotQ29tIENhcmRidXMgQ2FyZAorCSAgTmV0Z2VhciBXRzUxMSBDYXJkYnVzIENhcmQKKwkgIE92aXNsaW5rIFdMLTU0MDBQQ0kgUENJIENhcmQKKwkgIFBlYWJpcmQgV0xHLVBDSSBQQ0kgQ2FyZAorCSAgU2l0ZWNvbSBXTC0xMDBpIENhcmRidXMgQ2FyZAorCSAgU2l0ZWNvbSBXTC0xMTBpIFBDSSBDYXJkCisJICBTTUMyODAyVyAtICAgIEVaIENvbm5lY3QgZyAyLjRHSHogNTQgTWJwcyBXaXJlbGVzcyBQQ0kgQ2FyZAorCSAgU01DMjgzNVcgLSAgICBFWiBDb25uZWN0IGcgMi40R0h6IDU0IE1icHMgV2lyZWxlc3MgQ2FyZGJ1cyBDYXJkCisJICBTTUMyODM1Vy1WMiAtIEVaIENvbm5lY3QgZyAyLjRHSHogNTQgTWJwcyBXaXJlbGVzcyBDYXJkYnVzIENhcmQKKwkgIFotQ29tIFhHLTkwMCBQQ0kgQ2FyZAorCSAgWnl4ZWwgRy0xMDAgQ2FyZGJ1cyBDYXJkCisKKwkgIElmIHlvdSBlbmFibGUgdGhpcyB5b3Ugd2lsbCBuZWVkIGEgZmlybXdhcmUgZmlsZSBhcyB3ZWxsLgorCSAgWW91IHdpbGwgbmVlZCB0byBjb3B5IHRoaXMgdG8gL3Vzci9saWIvaG90cGx1Zy9maXJtd2FyZS9pc2wzODkwLgorCSAgWW91IGNhbiBnZXQgdGhpcyBub24tR1BMJ2QgZmlybXdhcmUgZmlsZSBmcm9tIHRoZSBQcmlzbTU0IHByb2plY3QgcGFnZToKKwkgIDxodHRwOi8vcHJpc201NC5vcmc+CisJICBZb3Ugd2lsbCBhbHNvIG5lZWQgdGhlIC9ldGMvaG90cGx1Zy9maXJtd2FyZS5hZ2VudCBzY3JpcHQgZnJvbQorCSAgYSBjdXJyZW50IGhvdHBsdWcgcGFja2FnZS4KKworCSAgTm90ZTogWW91IG5lZWQgYSBtb3RoZXJib2FyZCB3aXRoIERNQSBzdXBwb3J0IHRvIHVzZSBhbnkgb2YgdGhlc2UgY2FyZHMgCisJICAKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgdGhlIGRyaXZlciBhcyBhIG1vZHVsZSAoID0gY29kZSB3aGljaCBjYW4gYmUKKwkgIGluc2VydGVkIGluIGFuZCByZW1vdmVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdSB3YW50KSwKKwkgIHNheSBNIGhlcmUgYW5kIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBwcmlzbTU0LmtvLgorCisjIHllcywgdGhpcyB3b3JrcyBldmVuIHdoZW4gbm8gZHJpdmVycyBhcmUgc2VsZWN0ZWQKK2NvbmZpZyBORVRfV0lSRUxFU1MKKwlib29sCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgKElTQSB8fCBQQ0kgfHwgUFBDX1BNQUMgfHwgUENNQ0lBKQorCWRlZmF1bHQgeQorCitlbmRtZW51CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4Nzg0MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL01ha2VmaWxlCkBAIC0wLDAgKzEsMzMgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBXaXJlbGVzcyBuZXR3b3JrIGRldmljZSBkcml2ZXJzLgorIworCitvYmotJChDT05GSUdfU1RSSVApICs9IHN0cmlwLm8KK29iai0kKENPTkZJR19BUkxBTikgKz0gYXJsYW4ubyAKKworYXJsYW4tb2JqcyA6PSBhcmxhbi1tYWluLm8gYXJsYW4tcHJvYy5vCisKKyMgT2Jzb2xldGUgY2FyZHMKK29iai0kKENPTkZJR19XQVZFTEFOKQkJKz0gd2F2ZWxhbi5vCitvYmotJChDT05GSUdfUENNQ0lBX05FVFdBVkUpCSs9IG5ldHdhdmVfY3Mubworb2JqLSQoQ09ORklHX1BDTUNJQV9XQVZFTEFOKQkrPSB3YXZlbGFuX2NzLm8KKworb2JqLSQoQ09ORklHX0hFUk1FUykJCSs9IG9yaW5vY28ubyBoZXJtZXMubworb2JqLSQoQ09ORklHX1BDTUNJQV9IRVJNRVMpCSs9IG9yaW5vY29fY3Mubworb2JqLSQoQ09ORklHX0FQUExFX0FJUlBPUlQpCSs9IGFpcnBvcnQubworb2JqLSQoQ09ORklHX1BMWF9IRVJNRVMpCSs9IG9yaW5vY29fcGx4Lm8KK29iai0kKENPTkZJR19QQ0lfSEVSTUVTKQkrPSBvcmlub2NvX3BjaS5vCitvYmotJChDT05GSUdfVE1EX0hFUk1FUykJKz0gb3Jpbm9jb190bWQubworCitvYmotJChDT05GSUdfQUlSTykJCSs9IGFpcm8ubworb2JqLSQoQ09ORklHX0FJUk9fQ1MpCQkrPSBhaXJvX2NzLm8gYWlyby5vCisKK29iai0kKENPTkZJR19BVE1FTCkgICAgICAgICAgICAgKz0gYXRtZWwubworb2JqLSQoQ09ORklHX1BDSV9BVE1FTCkgICAgICAgICArPSBhdG1lbF9wY2kubyAKK29iai0kKENPTkZJR19QQ01DSUFfQVRNRUwpICAgICAgKz0gYXRtZWxfY3MubworCitvYmotJChDT05GSUdfUFJJU001NCkJCSs9IHByaXNtNTQvCisKKyMgMTYtYml0IHdpcmVsZXNzIFBDTUNJQSBjbGllbnQgZHJpdmVycworb2JqLSQoQ09ORklHX1BDTUNJQV9SQVlDUykJKz0gcmF5X2NzLm8KK29iai0kKENPTkZJR19QQ01DSUFfV0wzNTAxKQkrPSB3bDM1MDFfY3MubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvUkVBRE1FIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMjc0YmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9SRUFETUUKQEAgLTAsMCArMSwyNSBAQAorCVJFQURNRQorCS0tLS0tLQorCisJVGhpcyBkaXJlY3RvcnkgaXMgbW9zdGx5IGZvciBXaXJlbGVzcyBMQU4gZHJpdmVycywgaW4gdGhlaXIKK3ZhcmlvdXMgaW5jYXJuYXRpb25zIChJU0EsIFBDSSwgUGNtY2lhLi4uKS4KKwlUaGlzIHNlcGFyYXRlIGRpcmVjdG9yeSBpcyBuZWVkZWQgYmVjYXVzZSBhIGxvdCBvZiBkcml2ZXIgd29yaworb24gZGlmZmVyZW50IGJ1cyAodHlwaWNhbGx5IFBDSSArIFBjbWNpYSkgYW5kIHNoYXJlIDk1JSBvZiB0aGUKK2NvZGUuIFRoaXMgYWxsb3cgdGhlIGNvZGUgYW5kIHRoZSBjb25maWcgb3B0aW9ucyB0byBiZSBpbiBvbmUgc2luZ2xlCitwbGFjZSBpbnN0ZWFkIG9mIHNjYXR0ZXJlZCBhbGwgb3ZlciB0aGUgZHJpdmVyIHRyZWUsIHdoaWNoIGlzIG5ldmVyCisxMDAlIHNhdGlzZmFjdG9yeS4KKworCU5vdGUgOiBpZiB5b3Ugd2FudCBtb3JlIGluZm8gb24gdGhlIHRvcGljIG9mIFdpcmVsZXNzIExBTnMsCit5b3UgYXJlIGtpbmRseSBpbnZpdGVkIHRvIGhhdmUgYSBsb29rIGF0IHRoZSBXaXJlbGVzcyBIb3d0byA6CisJCWh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvCisJU29tZSBXaXJlbGVzcyBMQU4gZHJpdmVycywgbGlrZSBvcmlub2NvX2NzLCByZXF1aXJlIHRoZSB1c2Ugb2YKK1dpcmVsZXNzIFRvb2xzIHRvIGJlIGNvbmZpZ3VyZWQgOgorCQlodHRwOi8vd3d3LmhwbC5ocC5jb20vcGVyc29uYWwvSmVhbl9Ub3VycmlsaGVzL0xpbnV4L1Rvb2xzLmh0bWwKKworCVNwZWNpYWwgbm90ZXMgZm9yIGRpc3RyaWJ1dGlvbiBtYWludGFpbmVycyA6CisJMSkgd3ZsYW5fY3Mgd2lsbCBiZSBkaXNjb250aW51ZWQgc29vbiBpbiBmYXZvciBvZiBvcmlub2NvX2NzCisJMikgUGxlYXNlIGFkZCBXaXJlbGVzcyBUb29scyBzdXBwb3J0IGluIHlvdXIgc2NyaXB0cworCisJSGF2ZSBmdW4uLi4KKworCUplYW4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODk5MTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCkBAIC0wLDAgKzEsNzY2NyBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBBaXJvbmV0IGRyaXZlciBmb3IgNDUwMCBhbmQgNDgwMCBzZXJpZXMgY2FyZHMKKworICAgIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciBib3RoIHRoZSBHUEwgdmVyc2lvbiAyIGFuZCBCU0QgbGljZW5zZXMuCisgICAgRWl0aGVyIGxpY2Vuc2UgbWF5IGJlIHVzZWQuICBUaGUgcmVzcGVjdGl2ZSBsaWNlbnNlcyBhcmUgZm91bmQgYXQKKyAgICB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KKworICAgIFRoaXMgY29kZSB3YXMgZGV2ZWxvcGVkIGJ5IEJlbmphbWluIFJlZWQgPGJyZWVkQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAgICBpbmNsdWRpbmcgcG9ydGlvbnMgb2Ygd2hpY2ggY29tZSBmcm9tIHRoZSBBaXJvbmV0IFBDNDUwMAorICAgIERldmVsb3BlcidzIFJlZmVyZW5jZSBNYW51YWwgYW5kIHVzZWQgd2l0aCBwZXJtaXNzaW9uLiAgQ29weXJpZ2h0CisgICAgKEMpIDE5OTkgQmVuamFtaW4gUmVlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICBQZXJtaXNzaW9uIHRvIHVzZQorICAgIGNvZGUgaW4gdGhlIERldmVsb3BlcidzIG1hbnVhbCB3YXMgZ3JhbnRlZCBmb3IgdGhpcyBkcml2ZXIgYnkKKyAgICBBaXJvbmV0LiAgTWFqb3IgY29kZSBjb250cmlidXRpb25zIHdlcmUgcmVjZWl2ZWQgZnJvbSBKYXZpZXIgQWNoaXJpY2EKKyAgICA8YWNoaXJpY2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PiBhbmQgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPi4KKyAgICBDb2RlIHdhcyBhbHNvIGludGVncmF0ZWQgZnJvbSB0aGUgQ2lzY28gQWlyb25ldCBkcml2ZXIgZm9yIExpbnV4LgorICAgIFN1cHBvcnQgZm9yIE1QSTM1MCBjYXJkcyB3YXMgYWRkZWQgYnkgRmFicmljZSBCZWxsZXQKKyAgICA8ZmFicmljZUBiZWxsZXQuaW5mbz4uCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGNhcmRfaWRzW10gPSB7CisJeyAweDE0YjksIDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyAweDE0YjksIDB4NDUwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCXsgMHgxNGI5LCAweDQ4MDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyAweDE0YjksIDB4MDM0MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IDB4MTRiOSwgMHgwMzUwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgMHgxNGI5LCAweDUwMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyAweDE0YjksIDB4YTUwNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IDAsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY2FyZF9pZHMpOworCitzdGF0aWMgaW50IGFpcm9fcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICosIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICopOworc3RhdGljIHZvaWQgYWlyb19wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICopOworc3RhdGljIGludCBhaXJvX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgc3RhdGUpOworc3RhdGljIGludCBhaXJvX3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYWlyb19kcml2ZXIgPSB7CisJLm5hbWUgICAgID0gImFpcm8iLAorCS5pZF90YWJsZSA9IGNhcmRfaWRzLAorCS5wcm9iZSAgICA9IGFpcm9fcGNpX3Byb2JlLAorCS5yZW1vdmUgICA9IF9fZGV2ZXhpdF9wKGFpcm9fcGNpX3JlbW92ZSksCisJLnN1c3BlbmQgID0gYWlyb19wY2lfc3VzcGVuZCwKKwkucmVzdW1lICAgPSBhaXJvX3BjaV9yZXN1bWUsCit9OworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKworLyogSW5jbHVkZSBXaXJlbGVzcyBFeHRlbnNpb24gZGVmaW5pdGlvbiBhbmQgY2hlY2sgdmVyc2lvbiAtIEplYW4gSUkgKi8KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2RlZmluZSBXSVJFTEVTU19TUFkJCS8vIGVuYWJsZSBpd3NweSBzdXBwb3J0CisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4JLy8gTmV3IGRyaXZlciBBUEkKKworI2RlZmluZSBDSVNDT19FWFQJCS8vIGVuYWJsZSBDaXNjbyBleHRlbnNpb25zCisjaWZkZWYgQ0lTQ09fRVhUCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNlbmRpZgorCisvKiBTdXBwb3J0IENpc2NvIE1JQyBmZWF0dXJlICovCisjZGVmaW5lIE1JQ1NVUFBPUlQKKworI2lmIGRlZmluZWQoTUlDU1VQUE9SVCkgJiYgIWRlZmluZWQoQ09ORklHX0NSWVBUTykKKyN3YXJuaW5nIE1JQyBzdXBwb3J0IHJlcXVpcmVzIENyeXB0byBBUEkKKyN1bmRlZiBNSUNTVVBQT1JUCisjZW5kaWYKKworLyogSGFjayB0byBkbyBzb21lIHBvd2VyIHNhdmluZyAqLworI2RlZmluZSBQT1dFUl9PTl9ET1dOCisKKy8qIEFzIHlvdSBjYW4gc2VlIHRoaXMgbGlzdCBpcyBIVUdIIQorICAgSSByZWFsbHkgZG9uJ3Qga25vdyB3aGF0IGEgbG90IG9mIHRoZXNlIGNvdW50cyBhcmUgYWJvdXQsIGJ1dCB0aGV5CisgICBhcmUgYWxsIGhlcmUgZm9yIGNvbXBsZXRlbmVzcy4gIElmIHRoZSBJR05MQUJFTCBtYWNybyBpcyBwdXQgaW4KKyAgIGluZnJvbnQgb2YgdGhlIGxhYmVsLCB0aGF0IHN0YXRpc3RpYyB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdAorICAgb2Ygc3RhdGlzdGljcyBpbiB0aGUgL3Byb2MgZmlsZXN5c3RlbSAqLworCisjZGVmaW5lIElHTkxBQkVMKGNvbW1lbnQpIE5VTEwKK3N0YXRpYyBjaGFyICpzdGF0c0xhYmVsc1tdID0geworCSJSeE92ZXJydW4iLAorCUlHTkxBQkVMKCJSeFBsY3BDcmNFcnIiKSwKKwlJR05MQUJFTCgiUnhQbGNwRm9ybWF0RXJyIiksCisJSUdOTEFCRUwoIlJ4UGxjcExlbmd0aEVyciIpLAorCSJSeE1hY0NyY0VyciIsCisJIlJ4TWFjQ3JjT2siLAorCSJSeFdlcEVyciIsCisJIlJ4V2VwT2siLAorCSJSZXRyeUxvbmciLAorCSJSZXRyeVNob3J0IiwKKwkiTWF4UmV0cmllcyIsCisJIk5vQWNrIiwKKwkiTm9DdHMiLAorCSJSeEFjayIsCisJIlJ4Q3RzIiwKKwkiVHhBY2siLAorCSJUeFJ0cyIsCisJIlR4Q3RzIiwKKwkiVHhNYyIsCisJIlR4QmMiLAorCSJUeFVjRnJhZ3MiLAorCSJUeFVjUGFja2V0cyIsCisJIlR4QmVhY29uIiwKKwkiUnhCZWFjb24iLAorCSJUeFNpbkNvbGwiLAorCSJUeE11bENvbGwiLAorCSJEZWZlcnNObyIsCisJIkRlZmVyc1Byb3QiLAorCSJEZWZlcnNFbmd5IiwKKwkiRHVwRnJhbSIsCisJIlJ4RnJhZ0Rpc2MiLAorCSJUeEFnZWQiLAorCSJSeEFnZWQiLAorCSJMb3N0U3luYy1NYXhSZXRyeSIsCisJIkxvc3RTeW5jLU1pc3NlZEJlYWNvbnMiLAorCSJMb3N0U3luYy1BcmxFeGNlZWRlZCIsCisJIkxvc3RTeW5jLURlYXV0aCIsCisJIkxvc3RTeW5jLURpc2Fzc29jZWQiLAorCSJMb3N0U3luYy1Uc2ZUaW1pbmciLAorCSJIb3N0VHhNYyIsCisJIkhvc3RUeEJjIiwKKwkiSG9zdFR4VWMiLAorCSJIb3N0VHhGYWlsIiwKKwkiSG9zdFJ4TWMiLAorCSJIb3N0UnhCYyIsCisJIkhvc3RSeFVjIiwKKwkiSG9zdFJ4RGlzY2FyZCIsCisJSUdOTEFCRUwoIkhtYWNUeE1jIiksCisJSUdOTEFCRUwoIkhtYWNUeEJjIiksCisJSUdOTEFCRUwoIkhtYWNUeFVjIiksCisJSUdOTEFCRUwoIkhtYWNUeEZhaWwiKSwKKwlJR05MQUJFTCgiSG1hY1J4TWMiKSwKKwlJR05MQUJFTCgiSG1hY1J4QmMiKSwKKwlJR05MQUJFTCgiSG1hY1J4VWMiKSwKKwlJR05MQUJFTCgiSG1hY1J4RGlzY2FyZCIpLAorCUlHTkxBQkVMKCJIbWFjUnhBY2NlcHRlZCIpLAorCSJTc2lkTWlzbWF0Y2giLAorCSJBcE1pc21hdGNoIiwKKwkiUmF0ZXNNaXNtYXRjaCIsCisJIkF1dGhSZWplY3QiLAorCSJBdXRoVGltZW91dCIsCisJIkFzc29jUmVqZWN0IiwKKwkiQXNzb2NUaW1lb3V0IiwKKwlJR05MQUJFTCgiUmVhc29uT3V0c2lkZVRhYmxlIiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czEiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMiIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXMzIiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czQiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzNSIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXM2IiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czciKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzOCIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXM5IiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czEwIiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czExIiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czEyIiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czEzIiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czE0IiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czE1IiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czE2IiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czE3IiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czE4IiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czE5IiksCisJIlJ4TWFuIiwKKwkiVHhNYW4iLAorCSJSeFJlZnJlc2giLAorCSJUeFJlZnJlc2giLAorCSJSeFBvbGwiLAorCSJUeFBvbGwiLAorCSJIb3N0UmV0cmllcyIsCisJIkxvc3RTeW5jLUhvc3RSZXEiLAorCSJIb3N0VHhCeXRlcyIsCisJIkhvc3RSeEJ5dGVzIiwKKwkiRWxhcHNlZFVzZWMiLAorCSJFbGFwc2VkU2VjIiwKKwkiTG9zdFN5bmNCZXR0ZXJBUCIsCisJIlByaXZhY3lNaXNtYXRjaCIsCisJIkphbW1lZCIsCisJIkRpc2NSeE5vdFdlcHBlZCIsCisJIlBoeUVsZU1pc21hdGNoIiwKKwkoY2hhciopLTEgfTsKKyNpZm5kZWYgUlVOX0FUCisjZGVmaW5lIFJVTl9BVCh4KSAoamlmZmllcysoeCkpCisjZW5kaWYKKworCisvKiBUaGVzZSB2YXJpYWJsZXMgYXJlIGZvciBpbnNtb2QsIHNpbmNlIGl0IHNlZW1zIHRoYXQgdGhlIHJhdGVzCisgICBjYW4gb25seSBiZSBzZXQgaW4gc2V0dXBfY2FyZC4gIFJhdGVzIHNob3VsZCBiZSBhIGNvbW1hIHNlcGFyYXRlZAorICAgKG5vIHNwYWNlcykgbGlzdCBvZiByYXRlcyAodXAgdG8gOCkuICovCisKK3N0YXRpYyBpbnQgcmF0ZXNbOF07CitzdGF0aWMgaW50IGJhc2ljX3JhdGU7CitzdGF0aWMgY2hhciAqc3NpZHNbM107CisKK3N0YXRpYyBpbnQgaW9bNF07CitzdGF0aWMgaW50IGlycVs0XTsKKworc3RhdGljCitpbnQgbWF4ZW5jcnlwdCAvKiA9IDAgKi87IC8qIFRoZSBoaWdoZXN0IHJhdGUgdGhhdCB0aGUgY2FyZCBjYW4gZW5jcnlwdCBhdC4KKwkJICAgICAgIDAgbWVhbnMgbm8gbGltaXQuICBGb3Igb2xkIGNhcmRzIHRoaXMgd2FzIDQgKi8KKworc3RhdGljIGludCBhdXRvX3dlcCAvKiA9IDAgKi87IC8qIElmIHNldCwgaXQgdHJpZXMgdG8gZmlndXJlIG91dCB0aGUgd2VwIG1vZGUgKi8KK3N0YXRpYyBpbnQgYXV4X2JhcCAvKiA9IDAgKi87IC8qIENoZWNrcyB0byBzZWUgaWYgdGhlIGF1eCBwb3J0cyBhcmUgbmVlZGVkIHRvIHJlYWQKKwkJICAgIHRoZSBiYXAsIG5lZWRlZCBvbiBzb21lIG9sZGVyIGNhcmRzIGFuZCBidXNlcy4gKi8KK3N0YXRpYyBpbnQgYWRob2M7CisKK3N0YXRpYyBpbnQgcHJvYmUgPSAxOworCitzdGF0aWMgaW50IHByb2NfdWlkIC8qID0gMCAqLzsKKworc3RhdGljIGludCBwcm9jX2dpZCAvKiA9IDAgKi87CisKK3N0YXRpYyBpbnQgYWlyb19wZXJtID0gMDU1NTsKKworc3RhdGljIGludCBwcm9jX3Blcm0gPSAwNjQ0OworCitNT0RVTEVfQVVUSE9SKCJCZW5qYW1pbiBSZWVkIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN1cHBvcnQgZm9yIENpc2NvL0Fpcm9uZXQgODAyLjExIHdpcmVsZXNzIGV0aGVybmV0IFwKKyAgICAgICAgICAgICAgICAgICBjYXJkcy4gIERpcmVjdCBzdXBwb3J0IGZvciBJU0EvUENJL01QSSBjYXJkcyBhbmQgc3VwcG9ydCBcCisJCSAgIGZvciBQQ01DSUEgd2hlbiB1c2VkIHdpdGggYWlyb19jcy4iKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJBaXJvbmV0IDQ1MDAsIDQ4MDAgYW5kIENpc2NvIDM0MC8zNTAiKTsKK21vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0oYmFzaWNfcmF0ZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShyYXRlcywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShzc2lkcywgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKGF1dG9fd2VwLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhhdXRvX3dlcCwgIklmIG5vbi16ZXJvLCB0aGUgZHJpdmVyIHdpbGwga2VlcCBsb29waW5nIHRocm91Z2ggXAordGhlIGF1dGhlbnRpY2F0aW9uIG9wdGlvbnMgdW50aWwgYW4gYXNzb2NpYXRpb24gaXMgbWFkZS4gIFRoZSB2YWx1ZSBvZiBcCithdXRvX3dlcCBpcyBudW1iZXIgb2YgdGhlIHdlcCBrZXlzIHRvIGNoZWNrLiAgQSB2YWx1ZSBvZiAyIHdpbGwgdHJ5IHVzaW5nIFwKK3RoZSBrZXkgYXQgaW5kZXggMCBhbmQgaW5kZXggMS4iKTsKK21vZHVsZV9wYXJhbShhdXhfYmFwLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhhdXhfYmFwLCAiSWYgbm9uLXplcm8sIHRoZSBkcml2ZXIgd2lsbCBzd2l0Y2ggaW50byBhIG1vZGUgXAordGhhbiBzZWVtcyB0byB3b3JrIGJldHRlciBmb3Igb2xkZXIgY2FyZHMgd2l0aCBzb21lIG9sZGVyIGJ1c2VzLiAgQmVmb3JlIFwKK3N3aXRjaGluZyBpdCBjaGVja3MgdGhhdCB0aGUgc3dpdGNoIGlzIG5lZWRlZC4iKTsKK21vZHVsZV9wYXJhbShtYXhlbmNyeXB0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhlbmNyeXB0LCAiVGhlIG1heGltdW0gc3BlZWQgdGhhdCB0aGUgY2FyZCBjYW4gZG8gXAorZW5jcnlwdGlvbi4gIFVuaXRzIGFyZSBpbiA1MTJrYnMuICBaZXJvIChkZWZhdWx0KSBtZWFucyB0aGVyZSBpcyBubyBsaW1pdC4gXAorT2xkZXIgY2FyZHMgdXNlZCB0byBiZSBsaW1pdGVkIHRvIDJtYnMgKDQpLiIpOworbW9kdWxlX3BhcmFtKGFkaG9jLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhhZGhvYywgIklmIG5vbi16ZXJvLCB0aGUgY2FyZCB3aWxsIHN0YXJ0IGluIGFkaG9jIG1vZGUuIik7Cittb2R1bGVfcGFyYW0ocHJvYmUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHByb2JlLCAiSWYgemVybywgdGhlIGRyaXZlciB3b24ndCBzdGFydCB0aGUgY2FyZC4iKTsKKworbW9kdWxlX3BhcmFtKHByb2NfdWlkLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwcm9jX3VpZCwgIlRoZSB1aWQgdGhhdCB0aGUgL3Byb2MgZmlsZXMgd2lsbCBiZWxvbmcgdG8uIik7Cittb2R1bGVfcGFyYW0ocHJvY19naWQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHByb2NfZ2lkLCAiVGhlIGdpZCB0aGF0IHRoZSAvcHJvYyBmaWxlcyB3aWxsIGJlbG9uZyB0by4iKTsKK21vZHVsZV9wYXJhbShhaXJvX3Blcm0sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGFpcm9fcGVybSwgIlRoZSBwZXJtaXNzaW9uIGJpdHMgb2YgL3Byb2MvW2RyaXZlci9dYWlyb25ldC4iKTsKK21vZHVsZV9wYXJhbShwcm9jX3Blcm0sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHByb2NfcGVybSwgIlRoZSBwZXJtaXNzaW9uIGJpdHMgb2YgdGhlIGZpbGVzIGluIC9wcm9jIik7CisKKy8qIFRoaXMgaXMgYSBraW5kIG9mIHNsb3BweSBoYWNrIHRvIGdldCB0aGlzIGluZm9ybWF0aW9uIHRvIE9VVDQ1MDAgYW5kCisgICBJTjQ1MDAuICBJIHdvdWxkIGJlIGV4dHJlbWVseSBpbnRlcmVzdGVkIGluIHRoZSBzaXR1YXRpb24gd2hlcmUgdGhpcworICAgZG9lc24ndCB3b3JrIHRob3VnaCEhISAqLworc3RhdGljIGludCBkbzhiaXRJTyA9IDA7CisKKy8qIFJldHVybiBjb2RlcyAqLworI2RlZmluZSBTVUNDRVNTIDAKKyNkZWZpbmUgRVJST1IgLTEKKyNkZWZpbmUgTk9fUEFDS0VUIC0yCisKKy8qIENvbW1hbmRzICovCisjZGVmaW5lIE5PUDIJCTB4MDAwMAorI2RlZmluZSBNQUNfRU5BQkxFCTB4MDAwMQorI2RlZmluZSBNQUNfRElTQUJMRQkweDAwMDIKKyNkZWZpbmUgQ01EX0xPU0VfU1lOQwkweDAwMDMgLyogTm90IHN1cmUgd2hhdCB0aGlzIGRvZXMuLi4gKi8KKyNkZWZpbmUgQ01EX1NPRlRSRVNFVAkweDAwMDQKKyNkZWZpbmUgSE9TVFNMRUVQCTB4MDAwNQorI2RlZmluZSBDTURfTUFHSUNfUEtUCTB4MDAwNgorI2RlZmluZSBDTURfU0VUV0FLRU1BU0sJMHgwMDA3CisjZGVmaW5lIENNRF9SRUFEQ0ZHCTB4MDAwOAorI2RlZmluZSBDTURfU0VUTU9ERQkweDAwMDkKKyNkZWZpbmUgQ01EX0FMTE9DQVRFVFgJMHgwMDBhCisjZGVmaW5lIENNRF9UUkFOU01JVAkweDAwMGIKKyNkZWZpbmUgQ01EX0RFQUxMT0NBVEVUWCAweDAwMGMKKyNkZWZpbmUgTk9QCQkweDAwMTAKKyNkZWZpbmUgQ01EX1dPUktBUk9VTkQJMHgwMDExCisjZGVmaW5lIENNRF9BTExPQ0FURUFVWCAweDAwMjAKKyNkZWZpbmUgQ01EX0FDQ0VTUwkweDAwMjEKKyNkZWZpbmUgQ01EX1BDSUJBUAkweDAwMjIKKyNkZWZpbmUgQ01EX1BDSUFVWAkweDAwMjMKKyNkZWZpbmUgQ01EX0FMTE9DQlVGCTB4MDAyOAorI2RlZmluZSBDTURfR0VUVExWCTB4MDAyOQorI2RlZmluZSBDTURfUFVUVExWCTB4MDAyYQorI2RlZmluZSBDTURfREVMVExWCTB4MDAyYgorI2RlZmluZSBDTURfRklORE5FWFRUTFYJMHgwMDJjCisjZGVmaW5lIENNRF9QU1BOT0RFUwkweDAwMzAKKyNkZWZpbmUgQ01EX1NFVENXCTB4MDAzMSAgICAKKyNkZWZpbmUgQ01EX1NFVFBDRgkweDAwMzIgICAgCisjZGVmaW5lIENNRF9TRVRQSFlSRUcJMHgwMDNlCisjZGVmaW5lIENNRF9UWFRFU1QJMHgwMDNmCisjZGVmaW5lIE1BQ19FTkFCTEVUWAkweDAxMDEKKyNkZWZpbmUgQ01EX0xJU1RCU1MJMHgwMTAzCisjZGVmaW5lIENNRF9TQVZFQ0ZHCTB4MDEwOAorI2RlZmluZSBDTURfRU5BQkxFQVVYCTB4MDExMQorI2RlZmluZSBDTURfV1JJVEVSSUQJMHgwMTIxCisjZGVmaW5lIENNRF9VU0VQU1BOT0RFUwkweDAxMzAKKyNkZWZpbmUgTUFDX0VOQUJMRVJYCTB4MDIwMQorCisvKiBDb21tYW5kIGVycm9ycyAqLworI2RlZmluZSBFUlJPUl9RVUFMSUYgMHgwMAorI2RlZmluZSBFUlJPUl9JTExDTUQgMHgwMQorI2RlZmluZSBFUlJPUl9JTExGTVQgMHgwMgorI2RlZmluZSBFUlJPUl9JTlZGSUQgMHgwMworI2RlZmluZSBFUlJPUl9JTlZSSUQgMHgwNAorI2RlZmluZSBFUlJPUl9MQVJHRSAweDA1CisjZGVmaW5lIEVSUk9SX05ESVNBQkwgMHgwNgorI2RlZmluZSBFUlJPUl9BTExPQ0JTWSAweDA3CisjZGVmaW5lIEVSUk9SX05PUkQgMHgwQgorI2RlZmluZSBFUlJPUl9OT1dSIDB4MEMKKyNkZWZpbmUgRVJST1JfSU5WRklEVFggMHgwRAorI2RlZmluZSBFUlJPUl9URVNUQUNUIDB4MEUKKyNkZWZpbmUgRVJST1JfVEFHTkZORCAweDEyCisjZGVmaW5lIEVSUk9SX0RFQ09ERSAweDIwCisjZGVmaW5lIEVSUk9SX0RFU0NVTkFWIDB4MjEKKyNkZWZpbmUgRVJST1JfQkFETEVOIDB4MjIKKyNkZWZpbmUgRVJST1JfTU9ERSAweDgwCisjZGVmaW5lIEVSUk9SX0hPUCAweDgxCisjZGVmaW5lIEVSUk9SX0JJTlRFUiAweDgyCisjZGVmaW5lIEVSUk9SX1JYTU9ERSAweDgzCisjZGVmaW5lIEVSUk9SX01BQ0FERFIgMHg4NAorI2RlZmluZSBFUlJPUl9SQVRFUyAweDg1CisjZGVmaW5lIEVSUk9SX09SREVSIDB4ODYKKyNkZWZpbmUgRVJST1JfU0NBTiAweDg3CisjZGVmaW5lIEVSUk9SX0FVVEggMHg4OAorI2RlZmluZSBFUlJPUl9QU01PREUgMHg4OQorI2RlZmluZSBFUlJPUl9SVFlQRSAweDhBCisjZGVmaW5lIEVSUk9SX0RJVkVSIDB4OEIKKyNkZWZpbmUgRVJST1JfU1NJRCAweDhDCisjZGVmaW5lIEVSUk9SX0FQTElTVCAweDhECisjZGVmaW5lIEVSUk9SX0FVVE9XQUtFIDB4OEUKKyNkZWZpbmUgRVJST1JfTEVBUCAweDhGCisKKy8qIFJlZ2lzdGVycyAqLworI2RlZmluZSBDT01NQU5EIDB4MDAKKyNkZWZpbmUgUEFSQU0wIDB4MDIKKyNkZWZpbmUgUEFSQU0xIDB4MDQKKyNkZWZpbmUgUEFSQU0yIDB4MDYKKyNkZWZpbmUgU1RBVFVTIDB4MDgKKyNkZWZpbmUgUkVTUDAgMHgwYQorI2RlZmluZSBSRVNQMSAweDBjCisjZGVmaW5lIFJFU1AyIDB4MGUKKyNkZWZpbmUgTElOS1NUQVQgMHgxMAorI2RlZmluZSBTRUxFQ1QwIDB4MTgKKyNkZWZpbmUgT0ZGU0VUMCAweDFjCisjZGVmaW5lIFJYRklEIDB4MjAKKyNkZWZpbmUgVFhBTExPQ0ZJRCAweDIyCisjZGVmaW5lIFRYQ09NUExGSUQgMHgyNAorI2RlZmluZSBEQVRBMCAweDM2CisjZGVmaW5lIEVWU1RBVCAweDMwCisjZGVmaW5lIEVWSU5URU4gMHgzMgorI2RlZmluZSBFVkFDSyAweDM0CisjZGVmaW5lIFNXUzAgMHgyOAorI2RlZmluZSBTV1MxIDB4MmEKKyNkZWZpbmUgU1dTMiAweDJjCisjZGVmaW5lIFNXUzMgMHgyZQorI2RlZmluZSBBVVhQQUdFIDB4M0EKKyNkZWZpbmUgQVVYT0ZGIDB4M0MKKyNkZWZpbmUgQVVYREFUQSAweDNFCisKKyNkZWZpbmUgRklEX1RYIDEKKyNkZWZpbmUgRklEX1JYIDIKKy8qIE9mZnNldCBpbnRvIGF1eCBtZW1vcnkgZm9yIGRlc2NyaXB0b3JzICovCisjZGVmaW5lIEFVWF9PRkZTRVQgMHg4MDAKKy8qIFNpemUgb2YgYWxsb2NhdGVkIHBhY2tldHMgKi8KKyNkZWZpbmUgUEtUU0laRSAxODQwCisjZGVmaW5lIFJJRFNJWkUgMjA0OAorLyogU2l6ZSBvZiB0aGUgdHJhbnNtaXQgcXVldWUgKi8KKyNkZWZpbmUgTUFYVFhRIDY0CisKKy8qIEJBUCBzZWxlY3RvcnMgKi8KKyNkZWZpbmUgQkFQMCAwIC8vIFVzZWQgZm9yIHJlY2VpdmluZyBwYWNrZXRzCisjZGVmaW5lIEJBUDEgMiAvLyBVc2VkIGZvciB4bWl0aW5nIHBhY2tldHMgYW5kIHdvcmtpbmcgd2l0aCBSSURTCisKKy8qIEZsYWdzICovCisjZGVmaW5lIENPTU1BTkRfQlVTWSAweDgwMDAKKworI2RlZmluZSBCQVBfQlVTWSAweDgwMDAKKyNkZWZpbmUgQkFQX0VSUiAweDQwMDAKKyNkZWZpbmUgQkFQX0RPTkUgMHgyMDAwCisKKyNkZWZpbmUgUFJPTUlTQyAweGZmZmYKKyNkZWZpbmUgTk9QUk9NSVNDIDB4MDAwMAorCisjZGVmaW5lIEVWX0NNRCAweDEwCisjZGVmaW5lIEVWX0NMRUFSQ09NTUFOREJVU1kgMHg0MDAwCisjZGVmaW5lIEVWX1JYIDB4MDEKKyNkZWZpbmUgRVZfVFggMHgwMgorI2RlZmluZSBFVl9UWEVYQyAweDA0CisjZGVmaW5lIEVWX0FMTE9DIDB4MDgKKyNkZWZpbmUgRVZfTElOSyAweDgwCisjZGVmaW5lIEVWX0FXQUtFIDB4MTAwCisjZGVmaW5lIEVWX1RYQ1BZIDB4NDAwCisjZGVmaW5lIEVWX1VOS05PV04gMHg4MDAKKyNkZWZpbmUgRVZfTUlDIDB4MTAwMCAvKiBNZXNzYWdlIEludGVncml0eSBDaGVjayBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgRVZfQVdBS0VOIDB4MjAwMAorI2RlZmluZSBTVEFUVVNfSU5UUyAoRVZfQVdBS0V8RVZfTElOS3xFVl9UWEVYQ3xFVl9UWHxFVl9UWENQWXxFVl9SWHxFVl9NSUMpCisKKyNpZmRlZiBDSEVDS19VTktOT1dOX0lOVFMKKyNkZWZpbmUgSUdOT1JFX0lOVFMgKCBFVl9DTUQgfCBFVl9VTktOT1dOKQorI2Vsc2UKKyNkZWZpbmUgSUdOT1JFX0lOVFMgKH5TVEFUVVNfSU5UUykKKyNlbmRpZgorCisvKiBSSUQgVFlQRVMgKi8KKyNkZWZpbmUgUklEX1JXIDB4MjAKKworLyogVGhlIFJJRHMgKi8KKyNkZWZpbmUgUklEX0NBUEFCSUxJVElFUyAweEZGMDAKKyNkZWZpbmUgUklEX0FQSU5GTyAgICAgMHhGRjAxCisjZGVmaW5lIFJJRF9SQURJT0lORk8gIDB4RkYwMgorI2RlZmluZSBSSURfVU5LTk9XTjMgICAweEZGMDMKKyNkZWZpbmUgUklEX1JTU0kgICAgICAgMHhGRjA0CisjZGVmaW5lIFJJRF9DT05GSUcgICAgIDB4RkYxMAorI2RlZmluZSBSSURfU1NJRCAgICAgICAweEZGMTEKKyNkZWZpbmUgUklEX0FQTElTVCAgICAgMHhGRjEyCisjZGVmaW5lIFJJRF9EUlZOQU1FICAgIDB4RkYxMworI2RlZmluZSBSSURfRVRIRVJFTkNBUCAweEZGMTQKKyNkZWZpbmUgUklEX1dFUF9URU1QICAgMHhGRjE1CisjZGVmaW5lIFJJRF9XRVBfUEVSTSAgIDB4RkYxNgorI2RlZmluZSBSSURfTU9EVUxBVElPTiAweEZGMTcKKyNkZWZpbmUgUklEX09QVElPTlMgICAgMHhGRjE4CisjZGVmaW5lIFJJRF9BQ1RVQUxDT05GSUcgMHhGRjIwIC8qcmVhZG9ubHkqLworI2RlZmluZSBSSURfRkFDVE9SWUNPTkZJRyAweEZGMjEKKyNkZWZpbmUgUklEX1VOS05PV04yMiAgMHhGRjIyCisjZGVmaW5lIFJJRF9MRUFQVVNFUk5BTUUgMHhGRjIzCisjZGVmaW5lIFJJRF9MRUFQUEFTU1dPUkQgMHhGRjI0CisjZGVmaW5lIFJJRF9TVEFUVVMgICAgIDB4RkY1MAorI2RlZmluZSBSSURfQkVBQ09OX0hTVCAweEZGNTEKKyNkZWZpbmUgUklEX0JVU1lfSFNUICAgMHhGRjUyCisjZGVmaW5lIFJJRF9SRVRSSUVTX0hTVCAweEZGNTMKKyNkZWZpbmUgUklEX1VOS05PV041NCAgMHhGRjU0CisjZGVmaW5lIFJJRF9VTktOT1dONTUgIDB4RkY1NQorI2RlZmluZSBSSURfVU5LTk9XTjU2ICAweEZGNTYKKyNkZWZpbmUgUklEX01JQyAgICAgICAgMHhGRjU3CisjZGVmaW5lIFJJRF9TVEFUUzE2ICAgIDB4RkY2MAorI2RlZmluZSBSSURfU1RBVFMxNkRFTFRBIDB4RkY2MQorI2RlZmluZSBSSURfU1RBVFMxNkRFTFRBQ0xFQVIgMHhGRjYyCisjZGVmaW5lIFJJRF9TVEFUUyAgICAgIDB4RkY2OAorI2RlZmluZSBSSURfU1RBVFNERUxUQSAweEZGNjkKKyNkZWZpbmUgUklEX1NUQVRTREVMVEFDTEVBUiAweEZGNkEKKyNkZWZpbmUgUklEX0VDSE9URVNUX1JJRCAweEZGNzAKKyNkZWZpbmUgUklEX0VDSE9URVNUX1JFU1VMVFMgMHhGRjcxCisjZGVmaW5lIFJJRF9CU1NMSVNURklSU1QgMHhGRjcyCisjZGVmaW5lIFJJRF9CU1NMSVNUTkVYVCAgMHhGRjczCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgY21kOworCXUxNiBwYXJtMDsKKwl1MTYgcGFybTE7CisJdTE2IHBhcm0yOworfSBDbWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgc3RhdHVzOworCXUxNiByc3AwOworCXUxNiByc3AxOworCXUxNiByc3AyOworfSBSZXNwOworCisvKgorICogUmlkcyBhbmQgZW5kaWFuLW5lc3M6ICBUaGUgUmlkcyB3aWxsIGFsd2F5cyBiZSBpbiBjcHUgZW5kaWFuLCBzaW5jZQorICogdGhpcyBhbGwgdGhlIHBhdGNoZXMgZnJvbSB0aGUgYmlnLWVuZGlhbiBndXlzIGVuZCB1cCBkb2luZyB0aGF0LgorICogc28gYWxsIHJpZCBhY2Nlc3Mgc2hvdWxkIHVzZSB0aGUgcmVhZC93cml0ZVhYWFJpZCByb3V0aW5lcy4KKyAqLworCisvKiBUaGlzIGlzIHJlZHVuZGFudCBmb3IgeDg2IGFyY2hzLCBidXQgaXQgc2VlbXMgbmVjZXNzYXJ5IGZvciBBUk0gKi8KKyNwcmFnbWEgcGFjaygxKQorCisvKiBUaGlzIHN0cnVjdHVyZSBjYW1lIGZyb20gYW4gZW1haWwgc2VudCB0byBtZSBmcm9tIGFuIGVuZ2luZWVyIGF0CisgICBhaXJvbmV0IGZvciBpbmNsdXNpb24gaW50byB0aGlzIGRyaXZlciAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBsZW47CisJdTE2IGtpbmRleDsKKwl1OCBtYWNbRVRIX0FMRU5dOworCXUxNiBrbGVuOworCXU4IGtleVsxNl07Cit9IFdlcEtleVJpZDsKKworLyogVGhlc2Ugc3RydWN0dXJlcyBhcmUgZnJvbSB0aGUgQWlyb25ldCdzIFBDNDUwMCBEZXZlbG9wZXJzIE1hbnVhbCAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBsZW47CisJdTggc3NpZFszMl07Cit9IFNzaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgbGVuOworCVNzaWQgc3NpZHNbM107Cit9IFNzaWRSaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgdTE2IGxlbjsKKyAgICAgICAgdTE2IG1vZHVsYXRpb247CisjZGVmaW5lIE1PRF9ERUZBVUxUIDAKKyNkZWZpbmUgTU9EX0NDSyAxCisjZGVmaW5lIE1PRF9NT0sgMgorfSBNb2R1bGF0aW9uUmlkOworCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IGxlbjsgLyogc2l6ZW9mKENvbmZpZ1JpZCkgKi8KKwl1MTYgb3Btb2RlOyAvKiBvcGVyYXRpbmcgbW9kZSAqLworI2RlZmluZSBNT0RFX1NUQV9JQlNTIDAKKyNkZWZpbmUgTU9ERV9TVEFfRVNTIDEKKyNkZWZpbmUgTU9ERV9BUCAyCisjZGVmaW5lIE1PREVfQVBfUlBUUiAzCisjZGVmaW5lIE1PREVfRVRIRVJORVRfSE9TVCAoMDw8OCkgLyogcnggcGF5bG9hZHMgY29udmVydGVkICovCisjZGVmaW5lIE1PREVfTExDX0hPU1QgKDE8PDgpIC8qIHJ4IHBheWxvYWRzIGxlZnQgYXMgaXMgKi8KKyNkZWZpbmUgTU9ERV9BSVJPTkVUX0VYVEVORCAoMTw8OSkgLyogZW5hYmxlIEFpcm9uZXQgZXh0ZW5zdGlvbnMgKi8KKyNkZWZpbmUgTU9ERV9BUF9JTlRFUkZBQ0UgKDE8PDEwKSAvKiBlbmFibGUgYXAgaW50ZXJmYWNlIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgTU9ERV9BTlRFTk5BX0FMSUdOICgxPDwxMSkgLyogZW5hYmxlIGFudGVubmEgYWxpZ25tZW50ICovCisjZGVmaW5lIE1PREVfRVRIRVJfTExDICgxPDwxMikgLyogZW5hYmxlIGV0aGVybmV0IExMQyAqLworI2RlZmluZSBNT0RFX0xFQUZfTk9ERSAoMTw8MTMpIC8qIGVuYWJsZSBsZWFmIG5vZGUgYnJpZGdlICovCisjZGVmaW5lIE1PREVfQ0ZfUE9MTEFCTEUgKDE8PDE0KSAvKiBlbmFibGUgQ0YgcG9sbGFibGUgKi8KKyNkZWZpbmUgTU9ERV9NSUMgKDE8PDE1KSAvKiBlbmFibGUgTUlDICovCisJdTE2IHJtb2RlOyAvKiByZWNlaXZlIG1vZGUgKi8KKyNkZWZpbmUgUlhNT0RFX0JDX01DX0FERFIgMAorI2RlZmluZSBSWE1PREVfQkNfQUREUiAxIC8qIGlnbm9yZSBtdWx0aWNhc3RzICovCisjZGVmaW5lIFJYTU9ERV9BRERSIDIgLyogaWdub3JlIG11bHRpY2FzdCBhbmQgYnJvYWRjYXN0ICovCisjZGVmaW5lIFJYTU9ERV9SRk1PTiAzIC8qIHdpcmVsZXNzIG1vbml0b3IgbW9kZSAqLworI2RlZmluZSBSWE1PREVfUkZNT05fQU5ZQlNTIDQKKyNkZWZpbmUgUlhNT0RFX0xBTk1PTiA1IC8qIGxhbiBzdHlsZSBtb25pdG9yIC0tIGRhdGEgcGFja2V0cyBvbmx5ICovCisjZGVmaW5lIFJYTU9ERV9ESVNBQkxFXzgwMl8zX0hFQURFUiAoMTw8OCkgLyogZGlzYWJsZXMgODAyLjMgaGVhZGVyIG9uIHJ4ICovCisjZGVmaW5lIFJYTU9ERV9OT1JNQUxJWkVEX1JTU0kgKDE8PDkpIC8qIHJldHVybiBub3JtYWxpemVkIFJTU0kgKi8KKwl1MTYgZnJhZ1RocmVzaDsKKwl1MTYgcnRzVGhyZXM7CisJdTggbWFjQWRkcltFVEhfQUxFTl07CisJdTggcmF0ZXNbOF07CisJdTE2IHNob3J0UmV0cnlMaW1pdDsKKwl1MTYgbG9uZ1JldHJ5TGltaXQ7CisJdTE2IHR4TGlmZXRpbWU7IC8qIGluIGt1c2VjICovCisJdTE2IHJ4TGlmZXRpbWU7IC8qIGluIGt1c2VjICovCisJdTE2IHN0YXRpb25hcnk7CisJdTE2IG9yZGVyaW5nOworCXUxNiB1MTZkZXZpY2VUeXBlOyAvKiBmb3Igb3ZlcnJpZGluZyBkZXZpY2UgdHlwZSAqLworCXUxNiBjZnBSYXRlOworCXUxNiBjZnBEdXJhdGlvbjsKKwl1MTYgX3Jlc2VydmVkMVszXTsKKwkvKi0tLS0tLS0tLS0gU2Nhbm5pbmcvQXNzb2NpYXRpbmcgLS0tLS0tLS0tLSovCisJdTE2IHNjYW5Nb2RlOworI2RlZmluZSBTQ0FOTU9ERV9BQ1RJVkUgMAorI2RlZmluZSBTQ0FOTU9ERV9QQVNTSVZFIDEKKyNkZWZpbmUgU0NBTk1PREVfQUlST1NDQU4gMgorCXUxNiBwcm9iZURlbGF5OyAvKiBpbiBrdXNlYyAqLworCXUxNiBwcm9iZUVuZXJneVRpbWVvdXQ7IC8qIGluIGt1c2VjICovCisgICAgICAgIHUxNiBwcm9iZVJlc3BvbnNlVGltZW91dDsKKwl1MTYgYmVhY29uTGlzdGVuVGltZW91dDsKKwl1MTYgam9pbk5ldFRpbWVvdXQ7CisJdTE2IGF1dGhUaW1lb3V0OworCXUxNiBhdXRoVHlwZTsKKyNkZWZpbmUgQVVUSF9PUEVOIDB4MQorI2RlZmluZSBBVVRIX0VOQ1JZUFQgMHgxMDEKKyNkZWZpbmUgQVVUSF9TSEFSRURLRVkgMHgxMDIKKyNkZWZpbmUgQVVUSF9BTExPV19VTkVOQ1JZUFRFRCAweDIwMAorCXUxNiBhc3NvY2lhdGlvblRpbWVvdXQ7CisJdTE2IHNwZWNpZmllZEFwVGltZW91dDsKKwl1MTYgb2ZmbGluZVNjYW5JbnRlcnZhbDsKKwl1MTYgb2ZmbGluZVNjYW5EdXJhdGlvbjsKKwl1MTYgbGlua0xvc3NEZWxheTsKKwl1MTYgbWF4QmVhY29uTG9zdFRpbWU7CisJdTE2IHJlZnJlc2hJbnRlcnZhbDsKKyNkZWZpbmUgRElTQUJMRV9SRUZSRVNIIDB4RkZGRgorCXUxNiBfcmVzZXJ2ZWQxYVsxXTsKKwkvKi0tLS0tLS0tLS0gUG93ZXIgc2F2ZSBvcGVyYXRpb24gLS0tLS0tLS0tLSovCisJdTE2IHBvd2VyU2F2ZU1vZGU7CisjZGVmaW5lIFBPV0VSU0FWRV9DQU0gMAorI2RlZmluZSBQT1dFUlNBVkVfUFNQIDEKKyNkZWZpbmUgUE9XRVJTQVZFX1BTUENBTSAyCisJdTE2IHNsZWVwRm9yRHRpbXM7CisJdTE2IGxpc3RlbkludGVydmFsOworCXUxNiBmYXN0TGlzdGVuSW50ZXJ2YWw7CisJdTE2IGxpc3RlbkRlY2F5OworCXUxNiBmYXN0TGlzdGVuRGVsYXk7CisJdTE2IF9yZXNlcnZlZDJbMl07CisJLyotLS0tLS0tLS0tIEFwL0lic3MgY29uZmlnIGl0ZW1zIC0tLS0tLS0tLS0qLworCXUxNiBiZWFjb25QZXJpb2Q7CisJdTE2IGF0aW1EdXJhdGlvbjsKKwl1MTYgaG9wUGVyaW9kOworCXUxNiBjaGFubmVsU2V0OworCXUxNiBjaGFubmVsOworCXUxNiBkdGltUGVyaW9kOworCXUxNiBicmlkZ2VEaXN0YW5jZTsKKwl1MTYgcmFkaW9JRDsKKwkvKi0tLS0tLS0tLS0gUmFkaW8gY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tKi8KKwl1MTYgcmFkaW9UeXBlOworI2RlZmluZSBSQURJT1RZUEVfREVGQVVMVCAwCisjZGVmaW5lIFJBRElPVFlQRV84MDJfMTEgMQorI2RlZmluZSBSQURJT1RZUEVfTEVHQUNZIDIKKwl1OCByeERpdmVyc2l0eTsKKwl1OCB0eERpdmVyc2l0eTsKKwl1MTYgdHhQb3dlcjsKKyNkZWZpbmUgVFhQT1dFUl9ERUZBVUxUIDAKKwl1MTYgcnNzaVRocmVzaG9sZDsKKyNkZWZpbmUgUlNTSV9ERUZBVUxUIDAKKyAgICAgICAgdTE2IG1vZHVsYXRpb247CisjZGVmaW5lIFBSRUFNQkxFX0FVVE8gMAorI2RlZmluZSBQUkVBTUJMRV9MT05HIDEKKyNkZWZpbmUgUFJFQU1CTEVfU0hPUlQgMgorCXUxNiBwcmVhbWJsZTsKKwl1MTYgaG9tZVByb2R1Y3Q7CisJdTE2IHJhZGlvU3BlY2lmaWM7CisJLyotLS0tLS0tLS0tIEFpcm9uZXQgRXh0ZW5zaW9ucyAtLS0tLS0tLS0tKi8KKwl1OCBub2RlTmFtZVsxNl07CisJdTE2IGFybFRocmVzaG9sZDsKKwl1MTYgYXJsRGVjYXk7CisJdTE2IGFybERlbGF5OworCXUxNiBfcmVzZXJ2ZWQ0WzFdOworCS8qLS0tLS0tLS0tLSBBaXJvbmV0IEV4dGVuc2lvbnMgLS0tLS0tLS0tLSovCisJdTggbWFnaWNBY3Rpb247CisjZGVmaW5lIE1BR0lDX0FDVElPTl9TVFNDSEcgMQorI2RlZmluZSBNQUdJQ19BQ1RJT05fUkVTVU1FIDIKKyNkZWZpbmUgTUFHSUNfSUdOT1JFX01DQVNUICgxPDw4KQorI2RlZmluZSBNQUdJQ19JR05PUkVfQkNBU1QgKDE8PDkpCisjZGVmaW5lIE1BR0lDX1NXSVRDSF9UT19QU1AgKDA8PDEwKQorI2RlZmluZSBNQUdJQ19TVEFZX0lOX0NBTSAoMTw8MTApCisJdTggbWFnaWNDb250cm9sOworCXUxNiBhdXRvV2FrZTsKK30gQ29uZmlnUmlkOworCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IGxlbjsKKwl1OCBtYWNbRVRIX0FMRU5dOworCXUxNiBtb2RlOworCXUxNiBlcnJvckNvZGU7CisJdTE2IHNpZ1F1YWxpdHk7CisJdTE2IFNTSURsZW47CisJY2hhciBTU0lEWzMyXTsKKwljaGFyIGFwTmFtZVsxNl07CisJdTggYnNzaWRbNF1bRVRIX0FMRU5dOworCXUxNiBiZWFjb25QZXJpb2Q7CisJdTE2IGRpbVBlcmlvZDsKKwl1MTYgYXRpbUR1cmF0aW9uOworCXUxNiBob3BQZXJpb2Q7CisJdTE2IGNoYW5uZWxTZXQ7CisJdTE2IGNoYW5uZWw7CisJdTE2IGhvcHNUb0JhY2tib25lOworCXUxNiBhcFRvdGFsTG9hZDsKKwl1MTYgZ2VuZXJhdGVkTG9hZDsKKwl1MTYgYWNjdW11bGF0ZWRBcmw7CisJdTE2IHNpZ25hbFF1YWxpdHk7CisJdTE2IGN1cnJlbnRYbWl0UmF0ZTsKKwl1MTYgYXBEZXZFeHRlbnNpb25zOworCXUxNiBub3JtYWxpemVkU2lnbmFsU3RyZW5ndGg7CisJdTE2IHNob3J0UHJlYW1ibGU7CisJdTggYXBJUFs0XTsKKwl1OCBub2lzZVBlcmNlbnQ7IC8qIE5vaXNlIHBlcmNlbnQgaW4gbGFzdCBzZWNvbmQgKi8KKwl1OCBub2lzZWRCbTsgLyogTm9pc2UgZEJtIGluIGxhc3Qgc2Vjb25kICovCisJdTggbm9pc2VBdmVQZXJjZW50OyAvKiBOb2lzZSBwZXJjZW50IGluIGxhc3QgbWludXRlICovCisJdTggbm9pc2VBdmVkQm07IC8qIE5vaXNlIGRCbSBpbiBsYXN0IG1pbnV0ZSAqLworCXU4IG5vaXNlTWF4UGVyY2VudDsgLyogSGlnaGVzdCBub2lzZSBwZXJjZW50IGluIGxhc3QgbWludXRlICovCisJdTggbm9pc2VNYXhkQm07IC8qIEhpZ2hlc3Qgbm9pc2UgZGJtIGluIGxhc3QgbWludXRlICovCisJdTE2IGxvYWQ7CisJdTggY2Fycmllcls0XTsKKwl1MTYgYXNzb2NTdGF0dXM7CisjZGVmaW5lIFNUQVRfTk9QQUNLRVRTIDAKKyNkZWZpbmUgU1RBVF9OT0NBUlJJRVJTRVQgMTAKKyNkZWZpbmUgU1RBVF9HT1RDQVJSSUVSU0VUIDExCisjZGVmaW5lIFNUQVRfV1JPTkdTU0lEIDIwCisjZGVmaW5lIFNUQVRfQkFEQ0hBTk5FTCAyNQorI2RlZmluZSBTVEFUX0JBREJJVFJBVEVTIDMwCisjZGVmaW5lIFNUQVRfQkFEUFJJVkFDWSAzNQorI2RlZmluZSBTVEFUX0FQRk9VTkQgNDAKKyNkZWZpbmUgU1RBVF9BUFJFSkVDVEVEIDUwCisjZGVmaW5lIFNUQVRfQVVUSEVOVElDQVRJTkcgNjAKKyNkZWZpbmUgU1RBVF9ERUFVVEhFTlRJQ0FURUQgNjEKKyNkZWZpbmUgU1RBVF9BVVRIVElNRU9VVCA2MgorI2RlZmluZSBTVEFUX0FTU09DSUFUSU5HIDcwCisjZGVmaW5lIFNUQVRfREVBU1NPQ0lBVEVEIDcxCisjZGVmaW5lIFNUQVRfQVNTT0NUSU1FT1VUIDcyCisjZGVmaW5lIFNUQVRfTk9UQUlST0FQIDczCisjZGVmaW5lIFNUQVRfQVNTT0NJQVRFRCA4MAorI2RlZmluZSBTVEFUX0xFQVBJTkcgOTAKKyNkZWZpbmUgU1RBVF9MRUFQRkFJTEVEIDkxCisjZGVmaW5lIFNUQVRfTEVBUFRJTUVET1VUIDkyCisjZGVmaW5lIFNUQVRfTEVBUENPTVBMRVRFIDkzCit9IFN0YXR1c1JpZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBsZW47CisJdTE2IHNwYWNlcjsKKwl1MzIgdmFsc1sxMDBdOworfSBTdGF0c1JpZDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IGxlbjsKKwl1OCBhcFs0XVtFVEhfQUxFTl07Cit9IEFQTGlzdFJpZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBsZW47CisJY2hhciBvdWlbM107CisJY2hhciB6ZXJvOworCXUxNiBwcm9kTnVtOworCWNoYXIgbWFuTmFtZVszMl07CisJY2hhciBwcm9kTmFtZVsxNl07CisJY2hhciBwcm9kVmVyWzhdOworCWNoYXIgZmFjdG9yeUFkZHJbRVRIX0FMRU5dOworCWNoYXIgYWlyb25ldEFkZHJbRVRIX0FMRU5dOworCXUxNiByYWRpb1R5cGU7CisJdTE2IGNvdW50cnk7CisJY2hhciBjYWxsaWRbRVRIX0FMRU5dOworCWNoYXIgc3VwcG9ydGVkUmF0ZXNbOF07CisJY2hhciByeERpdmVyc2l0eTsKKwljaGFyIHR4RGl2ZXJzaXR5OworCXUxNiB0eFBvd2VyTGV2ZWxzWzhdOworCXUxNiBoYXJkVmVyOworCXUxNiBoYXJkQ2FwOworCXUxNiB0ZW1wUmFuZ2U7CisJdTE2IHNvZnRWZXI7CisJdTE2IHNvZnRTdWJWZXI7CisJdTE2IGludGVyZmFjZVZlcjsKKwl1MTYgc29mdENhcDsKKwl1MTYgYm9vdEJsb2NrVmVyOworCXUxNiByZXF1aXJlZEhhcmQ7CisJdTE2IGV4dFNvZnRDYXA7Cit9IENhcGFiaWxpdHlSaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdTE2IGxlbjsKKyAgdTE2IGluZGV4OyAvKiBGaXJzdCBpcyAwIGFuZCAweGZmZmYgbWVhbnMgZW5kIG9mIGxpc3QgKi8KKyNkZWZpbmUgUkFESU9fRkggMSAvKiBGcmVxdWVuY3kgaG9wcGluZyByYWRpbyB0eXBlICovCisjZGVmaW5lIFJBRElPX0RTIDIgLyogRGlyZWN0IHNlcXVlbmNlIHJhZGlvIHR5cGUgKi8KKyNkZWZpbmUgUkFESU9fVE1BIDQgLyogUHJvcHJpZXRhcnkgcmFkaW8gdXNlZCBpbiBvbGQgY2FyZHMgKDI1MDApICovCisgIHUxNiByYWRpb1R5cGU7CisgIHU4IGJzc2lkW0VUSF9BTEVOXTsgLyogTWFjIGFkZHJlc3Mgb2YgdGhlIEJTUyAqLworICB1OCB6ZXJvOworICB1OCBzc2lkTGVuOworICB1OCBzc2lkWzMyXTsKKyAgdTE2IHJzc2k7CisjZGVmaW5lIENBUF9FU1MgKDE8PDApCisjZGVmaW5lIENBUF9JQlNTICgxPDwxKQorI2RlZmluZSBDQVBfUFJJVkFDWSAoMTw8NCkKKyNkZWZpbmUgQ0FQX1NIT1JUSERSICgxPDw1KQorICB1MTYgY2FwOworICB1MTYgYmVhY29uSW50ZXJ2YWw7CisgIHU4IHJhdGVzWzhdOyAvKiBTYW1lIGFzIHJhdGVzIGZvciBjb25maWcgcmlkICovCisgIHN0cnVjdCB7IC8qIEZvciBmcmVxdWVuY3kgaG9wcGluZyBvbmx5ICovCisgICAgdTE2IGR3ZWxsOworICAgIHU4IGhvcFNldDsKKyAgICB1OCBob3BQYXR0ZXJuOworICAgIHU4IGhvcEluZGV4OworICAgIHU4IGZpbGw7CisgIH0gZmg7CisgIHUxNiBkc0NoYW5uZWw7CisgIHUxNiBhdGltV2luZG93OworfSBCU1NMaXN0UmlkOworCit0eXBlZGVmIHN0cnVjdCB7CisgIHU4IHJzc2lwY3Q7CisgIHU4IHJzc2lkQm07Cit9IHRkc1Jzc2lFbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1MTYgbGVuOworICB0ZHNSc3NpRW50cnkgeFsyNTZdOworfSB0ZHNSc3NpUmlkOworCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IGxlbjsKKwl1MTYgc3RhdGU7CisJdTE2IG11bHRpY2FzdFZhbGlkOworCXU4ICBtdWx0aWNhc3RbMTZdOworCXUxNiB1bmljYXN0VmFsaWQ7CisJdTggIHVuaWNhc3RbMTZdOworfSBNSUNSaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgdHlwZWxlbjsKKworCXVuaW9uIHsKKwkgICAgdTggc25hcFs4XTsKKwkgICAgc3RydWN0IHsKKwkJdTggZHNhcDsKKwkJdTggc3NhcDsKKwkJdTggY29udHJvbDsKKwkJdTggb3JnY29kZVszXTsKKwkJdTggZmllbGR0eXBlWzJdOworCSAgICB9IGxsYzsKKwl9IHU7CisJdTMyIG1pYzsKKwl1MzIgc2VxOworfSBNSUNCdWZmZXI7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1OCBkYVtFVEhfQUxFTl07CisJdTggc2FbRVRIX0FMRU5dOworfSBldGhlckhlYWQ7CisKKyNwcmFnbWEgcGFjaygpCisKKyNkZWZpbmUgVFhDVExfVFhPSyAoMTw8MSkgLyogcmVwb3J0IGlmIHR4IGlzIG9rICovCisjZGVmaW5lIFRYQ1RMX1RYRVggKDE8PDIpIC8qIHJlcG9ydCBpZiB0eCBmYWlscyAqLworI2RlZmluZSBUWENUTF84MDJfMyAoMDw8MykgLyogODAyLjMgcGFja2V0ICovCisjZGVmaW5lIFRYQ1RMXzgwMl8xMSAoMTw8MykgLyogODAyLjExIG1hYyBwYWNrZXQgKi8KKyNkZWZpbmUgVFhDVExfRVRIRVJORVQgKDA8PDQpIC8qIHBheWxvYWQgaGFzIGV0aGVydHlwZSAqLworI2RlZmluZSBUWENUTF9MTEMgKDE8PDQpIC8qIHBheWxvYWQgaXMgbGxjICovCisjZGVmaW5lIFRYQ1RMX1JFTEVBU0UgKDA8PDUpIC8qIHJlbGVhc2UgYWZ0ZXIgY29tcGxldGlvbiAqLworI2RlZmluZSBUWENUTF9OT1JFTEVBU0UgKDE8PDUpIC8qIG9uIGNvbXBsZXRpb24gcmV0dXJucyB0byBob3N0ICovCisKKyNkZWZpbmUgQlVTWV9GSUQgMHgxMDAwMAorCisjaWZkZWYgQ0lTQ09fRVhUCisjZGVmaW5lIEFJUk9NQUdJQwkweGE1NWEKKy8qIFdhcm5pbmcgOiBTSU9DREVWUFJJVkFURSBtYXkgZGlzYXBlYXIgZHVyaW5nIDIuNS5YIC0gSmVhbiBJSSAqLworI2lmZGVmIFNJT0NJV0ZJUlNUUFJJVgorI2lmZGVmIFNJT0NERVZQUklWQVRFCisjZGVmaW5lIEFJUk9PTERJT0NUTAlTSU9DREVWUFJJVkFURQorI2RlZmluZSBBSVJPT0xESURJRkMgCUFJUk9PTERJT0NUTCArIDEKKyNlbmRpZiAvKiBTSU9DREVWUFJJVkFURSAqLworI2Vsc2UgLyogU0lPQ0lXRklSU1RQUklWICovCisjZGVmaW5lIFNJT0NJV0ZJUlNUUFJJViBTSU9DREVWUFJJVkFURQorI2VuZGlmIC8qIFNJT0NJV0ZJUlNUUFJJViAqLworLyogVGhpcyBtYXkgYmUgd3JvbmcuIFdoZW4gdXNpbmcgdGhlIG5ldyBTSU9DSVdGSVJTVFBSSVYgcmFuZ2UsIHdlIHByb2JhYmx5CisgKiBzaG91bGQgdXNlIG9ubHkgIkdFVCIgaW9jdGxzIChsYXN0IGJpdCBzZXQgdG8gMSkuICJTRVQiIGlvY3RscyBhcmUgcm9vdAorICogb25seSBhbmQgZG9uJ3QgcmV0dXJuIHRoZSBtb2RpZmllZCBzdHJ1Y3QgaWZyZXEgdG8gdGhlIGFwcGxpY2F0aW9uIHdoaWNoCisgKiBpcyB1c3VhbGx5IGEgcHJvYmxlbS4gLSBKZWFuIElJICovCisjZGVmaW5lIEFJUk9JT0NUTAlTSU9DSVdGSVJTVFBSSVYKKyNkZWZpbmUgQUlST0lESUZDIAlBSVJPSU9DVEwgKyAxCisKKy8qIElvY3RsIGNvbnN0YW50cyB0byBiZSB1c2VkIGluIGFpcm9faW9jdGwuY29tbWFuZCAqLworCisjZGVmaW5lCUFJUk9HQ0FQICAJCTAJLy8gQ2FwYWJpbGl0eSByaWQKKyNkZWZpbmUgQUlST0dDRkcJCTEgICAgICAgLy8gVVNFRCBBIExPVAorI2RlZmluZSBBSVJPR1NMSVNUCQkyCS8vIFN5c3RlbSBJRCBsaXN0CisjZGVmaW5lIEFJUk9HVkxJU1QJCTMgICAgICAgLy8gTGlzdCBvZiBzcGVjaWZpZWQgQVAncworI2RlZmluZSBBSVJPR0RSVk5BTQkJNAkvLyAgTk9UVVNFRAorI2RlZmluZSBBSVJPR0VIVEVOQwkJNQkvLyBOT1RVU0VECisjZGVmaW5lIEFJUk9HV0VQS1RNUAkJNgorI2RlZmluZSBBSVJPR1dFUEtOVgkJNworI2RlZmluZSBBSVJPR1NUQVQJCTgKKyNkZWZpbmUgQUlST0dTVEFUU0MzMgkJOQorI2RlZmluZSBBSVJPR1NUQVRTRDMyCQkxMAorI2RlZmluZSBBSVJPR01JQ1JJRAkJMTEKKyNkZWZpbmUgQUlST0dNSUNTVEFUUwkJMTIKKyNkZWZpbmUgQUlST0dGTEFHUwkJMTMKKyNkZWZpbmUgQUlST0dJRAkJCTE0CisjZGVmaW5lIEFJUk9SUklECQkxNQorI2RlZmluZSBBSVJPUlNXVkVSU0lPTgkJMTcKKworLyogTGVhdmUgZ2FwIG9mIDQwIGNvbW1hbmRzIGFmdGVyIEFJUk9HU1RBVFNEMzIgZm9yIGZ1dHVyZSAqLworCisjZGVmaW5lIEFJUk9QQ0FQICAgICAgICAgICAgICAgCUFJUk9HU1RBVFNEMzIgKyA0MAorI2RlZmluZSBBSVJPUFZMSVNUICAgICAgICAgICAgICBBSVJPUENBUCAgICAgICsgMQorI2RlZmluZSBBSVJPUFNMSVNUCQlBSVJPUFZMSVNUICAgICsgMQorI2RlZmluZSBBSVJPUENGRwkJQUlST1BTTElTVCAgICArIDEKKyNkZWZpbmUgQUlST1BTSURTCQlBSVJPUENGRyAgICAgICsgMQorI2RlZmluZSBBSVJPUEFQTElTVAkJQUlST1BTSURTICAgICArIDEKKyNkZWZpbmUgQUlST1BNQUNPTgkJQUlST1BBUExJU1QgICArIDEJLyogRW5hYmxlIG1hYyAgKi8KKyNkZWZpbmUgQUlST1BNQUNPRkYJCUFJUk9QTUFDT04gICAgKyAxIAkvKiBEaXNhYmxlIG1hYyAqLworI2RlZmluZSBBSVJPUFNUQ0xSCQlBSVJPUE1BQ09GRiAgICsgMQorI2RlZmluZSBBSVJPUFdFUEtFWQkJQUlST1BTVENMUiAgICArIDEKKyNkZWZpbmUgQUlST1BXRVBLRVlOVgkJQUlST1BXRVBLRVkgICArIDEKKyNkZWZpbmUgQUlST1BMRUFQUFdEICAgICAgICAgICAgQUlST1BXRVBLRVlOViArIDEKKyNkZWZpbmUgQUlST1BMRUFQVVNSICAgICAgICAgICAgQUlST1BMRUFQUFdEICArIDEKKworLyogRmxhc2ggY29kZXMgKi8KKworI2RlZmluZSBBSVJPRkxTSFJTVAkgICAgICAgQUlST1BXRVBLRVlOViAgKyA0MAorI2RlZmluZSBBSVJPRkxTSEdDSFIgICAgICAgICAgIEFJUk9GTFNIUlNUICAgICsgMQorI2RlZmluZSBBSVJPRkxTSFNURkwgICAgICAgICAgIEFJUk9GTFNIR0NIUiAgICsgMQorI2RlZmluZSBBSVJPRkxTSFBDSFIgICAgICAgICAgIEFJUk9GTFNIU1RGTCAgICsgMQorI2RlZmluZSBBSVJPRkxQVVRCVUYgICAgICAgICAgIEFJUk9GTFNIUENIUiAgICsgMQorI2RlZmluZSBBSVJPUkVTVEFSVCAgICAgICAgICAgIEFJUk9GTFBVVEJVRiAgICsgMQorCisjZGVmaW5lIEZMQVNIU0laRQkzMjc2OAorI2RlZmluZSBBVVhNRU1TSVpFCSgyNTYgKiAxMDI0KQorCit0eXBlZGVmIHN0cnVjdCBhaXJvbmV0X2lvY3RsIHsKKwl1bnNpZ25lZCBzaG9ydCBjb21tYW5kOwkJLy8gV2hhdCB0byBkbworCXVuc2lnbmVkIHNob3J0IGxlbjsJCS8vIExlbiBvZiBkYXRhCisJdW5zaWduZWQgc2hvcnQgcmlkbnVtOwkJLy8gcmlkIG51bWJlcgorCXVuc2lnbmVkIGNoYXIgX191c2VyICpkYXRhOwkvLyBkLWRhdGEKK30gYWlyb25ldF9pb2N0bDsKKworc3RhdGljIGNoYXIgKnN3dmVyc2lvbiA9ICIyLjEiOworI2VuZGlmIC8qIENJU0NPX0VYVCAqLworCisjZGVmaW5lIE5VTV9NT0RVTEVTICAgICAgIDIKKyNkZWZpbmUgTUlDX01TR0xFTl9NQVggICAgMjQwMAorI2RlZmluZSBFTU1IMzJfTVNHTEVOX01BWCBNSUNfTVNHTEVOX01BWAorCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyICAgc2l6ZTsgICAgICAgICAgICAvLyBzaXplCisJdTggICAgZW5hYmxlZDsgICAgICAgICAvLyBNSUMgZW5hYmxlZCBvciBub3QKKwl1MzIgICByeFN1Y2Nlc3M7ICAgICAgIC8vIHN1Y2Nlc3NmdWwgcGFja2V0cyByZWNlaXZlZAorCXUzMiAgIHJ4SW5jb3JyZWN0TUlDOyAgLy8gcGt0cyBkcm9wcGVkIGR1ZSB0byBpbmNvcnJlY3QgTUlDIGNvbXBhcmlzb24KKwl1MzIgICByeE5vdE1JQ2VkOyAgICAgIC8vIHBrdHMgZHJvcHBlZCBkdWUgdG8gbm90IGJlaW5nIE1JQydkCisJdTMyICAgcnhNSUNQbHVtbWVkOyAgICAvLyBwa3RzIGRyb3BwZWQgZHVlIHRvIG5vdCBoYXZpbmcgYSBNSUMgcGx1bW1lZAorCXUzMiAgIHJ4V3JvbmdTZXF1ZW5jZTsgLy8gcGt0cyBkcm9wcGVkIGR1ZSB0byBzZXF1ZW5jZSBudW1iZXIgdmlvbGF0aW9uCisJdTMyICAgcmVzZXJ2ZVszMl07Cit9IG1pY19zdGF0aXN0aWNzOworCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyIGNvZWZmWygoRU1NSDMyX01TR0xFTl9NQVgpKzMpPj4yXTsKKwl1NjQgYWNjdW07CS8vIGFjY3VtdWxhdGVkIG1pYywgcmVkdWNlZCB0byB1MzIgaW4gZmluYWwoKQorCWludCBwb3NpdGlvbjsJLy8gY3VycmVudCBwb3NpdGlvbiAoYnl0ZSBvZmZzZXQpIGluIG1lc3NhZ2UKKwl1bmlvbiB7CisJCXU4ICBkOFs0XTsKKwkJdTMyIGQzMjsKKwl9IHBhcnQ7CS8vIHNhdmVzIHBhcnRpYWwgbWVzc2FnZSB3b3JkIGFjcm9zcyB1cGRhdGUoKSBjYWxscworfSBlbW1oMzJfY29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWVtbWgzMl9jb250ZXh0IHNlZWQ7CSAgICAvLyBDb250ZXh0IC0gdGhlIHNlZWQKKwl1MzIJCSByeDsJICAgIC8vIFJlY2VpdmVkIHNlcXVlbmNlIG51bWJlcgorCXUzMgkJIHR4OwkgICAgLy8gVHggc2VxdWVuY2UgbnVtYmVyCisJdTMyCQkgd2luZG93OyAgICAvLyBTdGFydCBvZiB3aW5kb3cKKwl1OAkJIHZhbGlkOwkgICAgLy8gRmxhZyB0byBzYXkgaWYgY29udGV4dCBpcyB2YWxpZCBvciBub3QKKwl1OAkJIGtleVsxNl07Cit9IG1pY2NudHg7CisKK3R5cGVkZWYgc3RydWN0IHsKKwltaWNjbnR4IG1DdHg7CQkvLyBNdWx0aWNhc3QgY29udGV4dAorCW1pY2NudHggdUN0eDsJCS8vIFVuaWNhc3QgY29udGV4dAorfSBtaWNfbW9kdWxlOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50ICByaWQ6IDE2OworCXVuc2lnbmVkIGludCAgbGVuOiAxNTsKKwl1bnNpZ25lZCBpbnQgIHZhbGlkOiAxOworCWRtYV9hZGRyX3QgaG9zdF9hZGRyOworfSBSaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgIG9mZnNldDogMTU7CisJdW5zaWduZWQgaW50ICBlb2M6IDE7CisJdW5zaWduZWQgaW50ICBsZW46IDE1OworCXVuc2lnbmVkIGludCAgdmFsaWQ6IDE7CisJZG1hX2FkZHJfdCBob3N0X2FkZHI7Cit9IFR4RmlkOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50ICBjdGw6IDE1OworCXVuc2lnbmVkIGludCAgcmR5OiAxOworCXVuc2lnbmVkIGludCAgbGVuOiAxNTsKKwl1bnNpZ25lZCBpbnQgIHZhbGlkOiAxOworCWRtYV9hZGRyX3QgaG9zdF9hZGRyOworfSBSeEZpZDsKKworLyoKKyAqIEhvc3QgcmVjZWl2ZSBkZXNjcmlwdG9yCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIF9faW9tZW0gKmNhcmRfcmFtX29mZjsgLyogb2Zmc2V0IGludG8gY2FyZCBtZW1vcnkgb2YgdGhlCisJCQkJCQlkZXNjICovCisJUnhGaWQgICAgICAgICByeF9kZXNjOwkJICAgICAvKiBjYXJkIHJlY2VpdmUgZGVzY3JpcHRvciAqLworCWNoYXIgICAgICAgICAgKnZpcnR1YWxfaG9zdF9hZGRyOyAgICAvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgaG9zdCByZWNlaXZlCisJCQkJCSAgICAgICAgYnVmZmVyICovCisJaW50ICAgICAgICAgICBwZW5kaW5nOworfSBIb3N0UnhEZXNjOworCisvKgorICogSG9zdCB0cmFuc21pdCBkZXNjcmlwdG9yCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIF9faW9tZW0gKmNhcmRfcmFtX29mZjsJICAgICAvKiBvZmZzZXQgaW50byBjYXJkIG1lbW9yeSBvZiB0aGUKKwkJCQkJCWRlc2MgKi8KKwlUeEZpZCAgICAgICAgIHR4X2Rlc2M7CQkgICAgIC8qIGNhcmQgdHJhbnNtaXQgZGVzY3JpcHRvciAqLworCWNoYXIgICAgICAgICAgKnZpcnR1YWxfaG9zdF9hZGRyOyAgICAvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgaG9zdCByZWNlaXZlCisJCQkJCSAgICAgICAgYnVmZmVyICovCisJaW50ICAgICAgICAgICBwZW5kaW5nOworfSBIb3N0VHhEZXNjOworCisvKgorICogSG9zdCBSSUQgZGVzY3JpcHRvcgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBfX2lvbWVtICpjYXJkX3JhbV9vZmY7ICAgICAgLyogb2Zmc2V0IGludG8gY2FyZCBtZW1vcnkgb2YgdGhlCisJCQkJCSAgICAgZGVzY3JpcHRvciAqLworCVJpZCAgICAgICAgICAgcmlkX2Rlc2M7CQkgIC8qIGNhcmQgUklEIGRlc2NyaXB0b3IgKi8KKwljaGFyICAgICAgICAgICp2aXJ0dWFsX2hvc3RfYWRkcjsgLyogdmlydHVhbCBhZGRyZXNzIG9mIGhvc3QgcmVjZWl2ZQorCQkJCQkgICAgIGJ1ZmZlciAqLworfSBIb3N0UmlkRGVzYzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBzdzA7CisJdTE2IHN3MTsKKwl1MTYgc3RhdHVzOworCXUxNiBsZW47CisjZGVmaW5lIEhPU1RfU0VUICgxIDw8IDApCisjZGVmaW5lIEhPU1RfSU5UX1RYICgxIDw8IDEpIC8qIEludGVycnVwdCBvbiBzdWNjZXNzZnVsIFRYICovCisjZGVmaW5lIEhPU1RfSU5UX1RYRVJSICgxIDw8IDIpIC8qIEludGVycnVwdCBvbiB1bnNlY2Nlc3NmdWwgVFggKi8KKyNkZWZpbmUgSE9TVF9MQ0NfUEFZTE9BRCAoMSA8PCA0KSAvKiBMTEMgcGF5bG9hZCwgMCA9IEV0aGVydHlwZSAqLworI2RlZmluZSBIT1NUX0RPTlRfUkxTRSAoMSA8PCA1KSAvKiBEb24ndCByZWxlYXNlIGJ1ZmZlciB3aGVuIGRvbmUgKi8KKyNkZWZpbmUgSE9TVF9ET05UX1JFVFJZICgxIDw8IDYpIC8qIERvbid0IHJldHJ5IHRyYXNtaXQgKi8KKyNkZWZpbmUgSE9TVF9DTFJfQUlEICgxIDw8IDcpIC8qIGNsZWFyIEFJRCBmYWlsdXJlICovCisjZGVmaW5lIEhPU1RfUlRTICgxIDw8IDkpIC8qIEZvcmNlIFJUUyB1c2UgKi8KKyNkZWZpbmUgSE9TVF9TSE9SVCAoMSA8PCAxMCkgLyogRG8gc2hvcnQgcHJlYW1ibGUgKi8KKwl1MTYgY3RsOworCXUxNiBhaWQ7CisJdTE2IHJldHJpZXM7CisJdTE2IGZpbGw7Cit9IFR4Q3RsSGRyOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIHUxNiBjdGw7CisgICAgICAgIHUxNiBkdXJhdGlvbjsKKyAgICAgICAgY2hhciBhZGRyMVs2XTsKKyAgICAgICAgY2hhciBhZGRyMls2XTsKKyAgICAgICAgY2hhciBhZGRyM1s2XTsKKyAgICAgICAgdTE2IHNlcTsKKyAgICAgICAgY2hhciBhZGRyNFs2XTsKK30gV2lmaUhkcjsKKworCit0eXBlZGVmIHN0cnVjdCB7CisJVHhDdGxIZHIgY3RsaGRyOworCXUxNiBmaWxsMTsKKwl1MTYgZmlsbDI7CisJV2lmaUhkciB3aWZpaGRyOworCXUxNiBnYXBsZW47CisJdTE2IHN0YXR1czsKK30gV2lmaUN0bEhkcjsKKworV2lmaUN0bEhkciB3aWZpY3RsaGRyODAyMyA9IHsKKwkuY3RsaGRyID0geworCQkuY3RsCT0gSE9TVF9ET05UX1JMU0UsCisJfQorfTsKKworI2lmZGVmIFdJUkVMRVNTX0VYVAorLy8gRnJlcXVlbmN5IGxpc3QgKG1hcCBjaGFubmVscyB0byBmcmVxdWVuY2llcykKK3N0YXRpYyBjb25zdCBsb25nIGZyZXF1ZW5jeV9saXN0W10gPSB7IDI0MTIsIDI0MTcsIDI0MjIsIDI0MjcsIDI0MzIsIDI0MzcsIDI0NDIsCisJCQkJMjQ0NywgMjQ1MiwgMjQ1NywgMjQ2MiwgMjQ2NywgMjQ3MiwgMjQ4NCB9OworCisvLyBBIGZldyBkZXRhaWxzIG5lZWRlZCBmb3IgV0VQIChXaXJlbGVzcyBFcXVpdmFsZW50IFByaXZhY3kpCisjZGVmaW5lIE1BWF9LRVlfU0laRSAxMwkJCS8vIDEyOCAoPykgYml0cworI2RlZmluZSBNSU5fS0VZX1NJWkUgIDUJCQkvLyA0MCBiaXRzIFJDNCAtIFdFUAordHlwZWRlZiBzdHJ1Y3Qgd2VwX2tleV90IHsKKwl1MTYJbGVuOworCXU4CWtleVsxNl07CS8qIDQwLWJpdCBhbmQgMTA0LWJpdCBrZXlzICovCit9IHdlcF9rZXlfdDsKKworLyogQmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworI2lmbmRlZiBJV19FTkNPREVfTk9LRVkKKyNkZWZpbmUgSVdfRU5DT0RFX05PS0VZICAgICAgICAgMHgwODAwICAvKiBLZXkgaXMgd3JpdGUgb25seSwgc28gbm90IHByZXNlbnQgKi8KKyNkZWZpbmUgSVdfRU5DT0RFX01PREUgIChJV19FTkNPREVfRElTQUJMRUQgfCBJV19FTkNPREVfUkVTVFJJQ1RFRCB8IElXX0VOQ09ERV9PUEVOKQorI2VuZGlmIC8qIElXX0VOQ09ERV9OT0tFWSAqLworCisvKiBMaXN0IG9mIFdpcmVsZXNzIEhhbmRsZXJzIChuZXcgQVBJKSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZglhaXJvX2hhbmRsZXJfZGVmOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCAqLworCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPSAiYWlyby5jIDAuNiAoQmVuIFJlZWQgJiBKYXZpZXIgQWNoaXJpY2EpIjsKKworc3RydWN0IGFpcm9faW5mbzsKKworc3RhdGljIGludCBnZXRfZGVjX3UxNiggY2hhciAqYnVmZmVyLCBpbnQgKnN0YXJ0LCBpbnQgbGltaXQgKTsKK3N0YXRpYyB2b2lkIE9VVDQ1MDAoIHN0cnVjdCBhaXJvX2luZm8gKiwgdTE2IHJlZ2lzdGVyLCB1MTYgdmFsdWUgKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBJTjQ1MDAoIHN0cnVjdCBhaXJvX2luZm8gKiwgdTE2IHJlZ2lzdGVyICk7CitzdGF0aWMgdTE2IHNldHVwX2NhcmQoc3RydWN0IGFpcm9faW5mbyosIHU4ICptYWMsIGludCBsb2NrKTsKK3N0YXRpYyBpbnQgZW5hYmxlX01BQyggc3RydWN0IGFpcm9faW5mbyAqYWksIFJlc3AgKnJzcCwgaW50IGxvY2sgKTsKK3N0YXRpYyB2b2lkIGRpc2FibGVfTUFDKHN0cnVjdCBhaXJvX2luZm8gKmFpLCBpbnQgbG9jayk7CitzdGF0aWMgdm9pZCBlbmFibGVfaW50ZXJydXB0cyhzdHJ1Y3QgYWlyb19pbmZvKik7CitzdGF0aWMgdm9pZCBkaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IGFpcm9faW5mbyopOworc3RhdGljIHUxNiBpc3N1ZWNvbW1hbmQoc3RydWN0IGFpcm9faW5mbyosIENtZCAqcENtZCwgUmVzcCAqcFJzcCk7CitzdGF0aWMgaW50IGJhcF9zZXR1cChzdHJ1Y3QgYWlyb19pbmZvKiwgdTE2IHJpZCwgdTE2IG9mZnNldCwgaW50IHdoaWNoYmFwKTsKK3N0YXRpYyBpbnQgYXV4X2JhcF9yZWFkKHN0cnVjdCBhaXJvX2luZm8qLCB1MTYgKnB1MTZEc3QsIGludCBieXRlbGVuLAorCQkJaW50IHdoaWNoYmFwKTsKK3N0YXRpYyBpbnQgZmFzdF9iYXBfcmVhZChzdHJ1Y3QgYWlyb19pbmZvKiwgdTE2ICpwdTE2RHN0LCBpbnQgYnl0ZWxlbiwKKwkJCSBpbnQgd2hpY2hiYXApOworc3RhdGljIGludCBiYXBfd3JpdGUoc3RydWN0IGFpcm9faW5mbyosIGNvbnN0IHUxNiAqcHUxNlNyYywgaW50IGJ5dGVsZW4sCisJCSAgICAgaW50IHdoaWNoYmFwKTsKK3N0YXRpYyBpbnQgUEM0NTAwX2FjY2Vzc3JpZChzdHJ1Y3QgYWlyb19pbmZvKiwgdTE2IHJpZCwgdTE2IGFjY21kKTsKK3N0YXRpYyBpbnQgUEM0NTAwX3JlYWRyaWQoc3RydWN0IGFpcm9faW5mbyosIHUxNiByaWQsIHZvaWQgKnBCdWYsIGludCBsZW4sIGludCBsb2NrKTsKK3N0YXRpYyBpbnQgUEM0NTAwX3dyaXRlcmlkKHN0cnVjdCBhaXJvX2luZm8qLCB1MTYgcmlkLCBjb25zdCB2b2lkCisJCQkgICAqcEJ1ZiwgaW50IGxlbiwgaW50IGxvY2spOworc3RhdGljIGludCBkb193cml0ZXJpZCggc3RydWN0IGFpcm9faW5mbyosIHUxNiByaWQsIGNvbnN0IHZvaWQgKnJpZF9kYXRhLAorCQkJaW50IGxlbiwgaW50IGR1bW15ICk7CitzdGF0aWMgdTE2IHRyYW5zbWl0X2FsbG9jYXRlKHN0cnVjdCBhaXJvX2luZm8qLCBpbnQgbGVuUGF5bG9hZCwgaW50IHJhdyk7CitzdGF0aWMgaW50IHRyYW5zbWl0XzgwMl8zX3BhY2tldChzdHJ1Y3QgYWlyb19pbmZvKiwgaW50IGxlbiwgY2hhciAqcFBhY2tldCk7CitzdGF0aWMgaW50IHRyYW5zbWl0XzgwMl8xMV9wYWNrZXQoc3RydWN0IGFpcm9faW5mbyosIGludCBsZW4sIGNoYXIgKnBQYWNrZXQpOworCitzdGF0aWMgaW50IG1waV9zZW5kX3BhY2tldCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBtcGlfdW5tYXBfY2FyZChzdHJ1Y3QgcGNpX2RldiAqcGNpKTsKK3N0YXRpYyB2b2lkIG1waV9yZWNlaXZlXzgwMl8zKHN0cnVjdCBhaXJvX2luZm8gKmFpKTsKK3N0YXRpYyB2b2lkIG1waV9yZWNlaXZlXzgwMl8xMShzdHJ1Y3QgYWlyb19pbmZvICphaSk7CitzdGF0aWMgaW50IHdhaXRidXN5IChzdHJ1Y3QgYWlyb19pbmZvICphaSk7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhaXJvX2ludGVycnVwdCggaW50IGlycSwgdm9pZCogZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncworCQkJICAgICpyZWdzKTsKK3N0YXRpYyBpbnQgYWlyb190aHJlYWQodm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCB0aW1lcl9mdW5jKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CitzdGF0aWMgaW50IGFpcm9faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CisjaWZkZWYgV0lSRUxFU1NfRVhUCitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqYWlyb19nZXRfd2lyZWxlc3Nfc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYWlyb19yZWFkX3dpcmVsZXNzX3N0YXRzIChzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCk7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUICovCisjaWZkZWYgQ0lTQ09fRVhUCitzdGF0aWMgaW50IHJlYWRyaWRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGFpcm9uZXRfaW9jdGwgKmNvbXApOworc3RhdGljIGludCB3cml0ZXJpZHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYWlyb25ldF9pb2N0bCAqY29tcCk7CitpbnQgZmxhc2hjYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGFpcm9uZXRfaW9jdGwgKmNvbXApOworI2VuZGlmIC8qIENJU0NPX0VYVCAqLworI2lmZGVmIE1JQ1NVUFBPUlQKK3N0YXRpYyB2b2lkIG1pY2luaXQoc3RydWN0IGFpcm9faW5mbyAqYWkpOworc3RhdGljIGludCBtaWNzZXR1cChzdHJ1Y3QgYWlyb19pbmZvICphaSk7CitzdGF0aWMgaW50IGVuY2Fwc3VsYXRlKHN0cnVjdCBhaXJvX2luZm8gKmFpLCBldGhlckhlYWQgKnBQYWNrZXQsIE1JQ0J1ZmZlciAqYnVmZmVyLCBpbnQgbGVuKTsKK3N0YXRpYyBpbnQgZGVjYXBzdWxhdGUoc3RydWN0IGFpcm9faW5mbyAqYWksIE1JQ0J1ZmZlciAqbWljLCBldGhlckhlYWQgKnBQYWNrZXQsIHUxNiBwYXlMZW4pOworCisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjZW5kaWYKKworc3RydWN0IGFpcm9faW5mbyB7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CisJc3RydWN0IG5ldF9kZXZpY2UgICAgICAgICAgICAgKmRldjsKKwkvKiBOb3RlLCB3ZSBjYW4gaGF2ZSBNQVhfRklEUyBvdXRzdGFuZGluZy4gIEZJRHMgYXJlIDE2LWJpdHMsIHNvIHdlCisJICAgdXNlIHRoZSBoaWdoIGJpdCB0byBtYXJrIHdoZXRoZXIgaXQgaXMgaW4gdXNlLiAqLworI2RlZmluZSBNQVhfRklEUyA2CisjZGVmaW5lIE1QSV9NQVhfRklEUyAxCisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlkc1tNQVhfRklEU107CisJQ29uZmlnUmlkIGNvbmZpZzsKKwljaGFyIGtleWluZGV4OyAvLyBVc2VkIHdpdGggYXV0byB3ZXAKKwljaGFyIGRlZmluZGV4OyAvLyBVc2VkIHdpdGggYXV0byB3ZXAKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfZW50cnk7CisgICAgICAgIHNwaW5sb2NrX3QgYXV4X2xvY2s7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjZGVmaW5lIEZMQUdfUFJPTUlTQwk4CS8qIElGRl9QUk9NSVNDIDB4MTAwIC0gaW5jbHVkZS9saW51eC9pZi5oICovCisjZGVmaW5lIEZMQUdfUkFESU9fT0ZGCTAJLyogVXNlciBkaXNhYmxpbmcgb2YgTUFDICovCisjZGVmaW5lIEZMQUdfUkFESU9fRE9XTgkxCS8qIGlmdXAvaWZkb3duIGRpc2FibGluZyBvZiBNQUMgKi8KKyNkZWZpbmUgRkxBR19SQURJT19NQVNLIDB4MDMKKyNkZWZpbmUgRkxBR19FTkFCTEVECTIKKyNkZWZpbmUgRkxBR19BREhPQwkzCS8qIE5lZWRlZCBieSBNSUMgKi8KKyNkZWZpbmUgRkxBR19NSUNfQ0FQQUJMRSA0CisjZGVmaW5lIEZMQUdfVVBEQVRFX01VTFRJIDUKKyNkZWZpbmUgRkxBR19VUERBVEVfVU5JIDYKKyNkZWZpbmUgRkxBR184MDJfMTEJNworI2RlZmluZSBGTEFHX1BFTkRJTkdfWE1JVCA5CisjZGVmaW5lIEZMQUdfUEVORElOR19YTUlUMTEgMTAKKyNkZWZpbmUgRkxBR19NUEkJMTEKKyNkZWZpbmUgRkxBR19SRUdJU1RFUkVECTEyCisjZGVmaW5lIEZMQUdfQ09NTUlUCTEzCisjZGVmaW5lIEZMQUdfUkVTRVQJMTQKKyNkZWZpbmUgRkxBR19GTEFTSElORwkxNQorI2RlZmluZSBKT0JfTUFTSwkweDFmZjAwMDAKKyNkZWZpbmUgSk9CX0RJRQkJMTYKKyNkZWZpbmUgSk9CX1hNSVQJMTcKKyNkZWZpbmUgSk9CX1hNSVQxMQkxOAorI2RlZmluZSBKT0JfU1RBVFMJMTkKKyNkZWZpbmUgSk9CX1BST01JU0MJMjAKKyNkZWZpbmUgSk9CX01JQwkJMjEKKyNkZWZpbmUgSk9CX0VWRU5UCTIyCisjZGVmaW5lIEpPQl9BVVRPV0VQCTIzCisjZGVmaW5lIEpPQl9XU1RBVFMJMjQKKwlpbnQgKCpiYXBfcmVhZCkoc3RydWN0IGFpcm9faW5mbyosIHUxNiAqcHUxNkRzdCwgaW50IGJ5dGVsZW4sCisJCQlpbnQgd2hpY2hiYXApOworCXVuc2lnbmVkIHNob3J0ICpmbGFzaDsKKwl0ZHNSc3NpRW50cnkgKnJzc2k7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworCXBpZF90IHRocl9waWQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgdGhyX3dhaXQ7CisJc3RydWN0IGNvbXBsZXRpb24gdGhyX2V4aXRlZDsKKwl1bnNpZ25lZCBsb25nIGV4cGlyZXM7CisJc3RydWN0IHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJaW50IGZpZDsKKwl9IHhtaXQsIHhtaXQxMTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqd2lmaWRldjsKKyNpZmRlZiBXSVJFTEVTU19FWFQKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcwl3c3RhdHM7CQkvLyB3aXJlbGVzcyBzdGF0cworCXVuc2lnbmVkIGxvbmcJCXNjYW5fdGltZXN0YW1wOwkvKiBUaW1lIHN0YXJ0ZWQgdG8gc2NhbiAqLworCXN0cnVjdCBpd19zcHlfZGF0YQlzcHlfZGF0YTsKKwlzdHJ1Y3QgaXdfcHVibGljX2RhdGEJd2lyZWxlc3NfZGF0YTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgKi8KKyNpZmRlZiBNSUNTVVBQT1JUCisJLyogTUlDIHN0dWZmICovCisJc3RydWN0IGNyeXB0b190Zm0JKnRmbTsKKwltaWNfbW9kdWxlCQltb2RbMl07CisJbWljX3N0YXRpc3RpY3MJCW1pY3N0YXRzOworI2VuZGlmCisJSG9zdFJ4RGVzYyByeGZpZHNbTVBJX01BWF9GSURTXTsgLy8gcngvdHgvY29uZmlnIE1QSTM1MCBkZXNjcmlwdG9ycworCUhvc3RUeERlc2MgdHhmaWRzW01QSV9NQVhfRklEU107CisJSG9zdFJpZERlc2MgY29uZmlnX2Rlc2M7CisJdW5zaWduZWQgbG9uZyByaWRidXM7IC8vIHBoeXMgYWRkciBvZiBjb25maWdfZGVzYworCXN0cnVjdCBza19idWZmX2hlYWQgdHhxOy8vIHR4IHF1ZXVlIHVzZWQgYnkgbXBpMzUwIGNvZGUKKwlzdHJ1Y3QgcGNpX2RldiAgICAgICAgICAqcGNpOworCXVuc2lnbmVkIGNoYXIJCV9faW9tZW0gKnBjaW1lbTsKKwl1bnNpZ25lZCBjaGFyCQlfX2lvbWVtICpwY2lhdXg7CisJdW5zaWduZWQgY2hhcgkJKnNoYXJlZDsKKwlkbWFfYWRkcl90CQlzaGFyZWRfZG1hOworCWludAkJCXBvd2VyOworCVNzaWRSaWQJCQkqU1NJRDsKKwlBUExpc3RSaWQJCSpBUExpc3Q7CisjZGVmaW5lCVBDSV9TSEFSRURfTEVOCQkyKk1QSV9NQVhfRklEUypQS1RTSVpFK1JJRFNJWkUKKwljaGFyCQkJcHJvY19uYW1lW0lGTkFNU0laXTsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGJhcF9yZWFkKHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MTYgKnB1MTZEc3QsIGludCBieXRlbGVuLAorCQkJICAgaW50IHdoaWNoYmFwKSB7CisJcmV0dXJuIGFpLT5iYXBfcmVhZChhaSwgcHUxNkRzdCwgYnl0ZWxlbiwgd2hpY2hiYXApOworfQorCitzdGF0aWMgaW50IHNldHVwX3Byb2NfZW50cnkoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBhaXJvX2luZm8gKmFwcml2ICk7CitzdGF0aWMgaW50IHRha2Vkb3duX3Byb2NfZW50cnkoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGFpcm9faW5mbyAqYXByaXYgKTsKKworI2lmZGVmIE1JQ1NVUFBPUlQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSUMgUk9VVElORVMgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitzdGF0aWMgaW50IFJ4U2VxVmFsaWQgKHN0cnVjdCBhaXJvX2luZm8gKmFpLG1pY2NudHggKmNvbnRleHQsaW50IG1jYXN0LHUzMiBtaWNTZXEpOworc3RhdGljIHZvaWQgTW92ZVdpbmRvdyhtaWNjbnR4ICpjb250ZXh0LCB1MzIgbWljU2VxKTsKK3ZvaWQgZW1taDMyX3NldHNlZWQoZW1taDMyX2NvbnRleHQgKmNvbnRleHQsIHU4ICpwa2V5LCBpbnQga2V5bGVuLCBzdHJ1Y3QgY3J5cHRvX3RmbSAqKTsKK3ZvaWQgZW1taDMyX2luaXQoZW1taDMyX2NvbnRleHQgKmNvbnRleHQpOwordm9pZCBlbW1oMzJfdXBkYXRlKGVtbWgzMl9jb250ZXh0ICpjb250ZXh0LCB1OCAqcE9jdGV0cywgaW50IGxlbik7Cit2b2lkIGVtbWgzMl9maW5hbChlbW1oMzJfY29udGV4dCAqY29udGV4dCwgdTggZGlnZXN0WzRdKTsKKworLyogbWljaW5pdCAtIEluaXRpYWxpemUgbWljIHNlZWQgKi8KKworc3RhdGljIHZvaWQgbWljaW5pdChzdHJ1Y3QgYWlyb19pbmZvICphaSkKK3sKKwlNSUNSaWQgbWljX3JpZDsKKworCWNsZWFyX2JpdChKT0JfTUlDLCAmYWktPmZsYWdzKTsKKwlQQzQ1MDBfcmVhZHJpZChhaSwgUklEX01JQywgJm1pY19yaWQsIHNpemVvZihtaWNfcmlkKSwgMCk7CisJdXAoJmFpLT5zZW0pOworCisJYWktPm1pY3N0YXRzLmVuYWJsZWQgPSAobWljX3JpZC5zdGF0ZSAmIDB4MDBGRikgPyAxIDogMDsKKworCWlmIChhaS0+bWljc3RhdHMuZW5hYmxlZCkgeworCQkvKiBLZXkgbXVzdCBiZSB2YWxpZCBhbmQgZGlmZmVyZW50ICovCisJCWlmIChtaWNfcmlkLm11bHRpY2FzdFZhbGlkICYmICghYWktPm1vZFswXS5tQ3R4LnZhbGlkIHx8CisJCSAgICAobWVtY21wIChhaS0+bW9kWzBdLm1DdHgua2V5LCBtaWNfcmlkLm11bHRpY2FzdCwKKwkJCSAgICAgc2l6ZW9mKGFpLT5tb2RbMF0ubUN0eC5rZXkpKSAhPSAwKSkpIHsKKwkJCS8qIEFnZSBjdXJyZW50IG1pYyBDb250ZXh0ICovCisJCQltZW1jcHkoJmFpLT5tb2RbMV0ubUN0eCwmYWktPm1vZFswXS5tQ3R4LHNpemVvZihtaWNjbnR4KSk7CisJCQkvKiBJbml0aWFsaXplIG5ldyBjb250ZXh0ICovCisJCQltZW1jcHkoJmFpLT5tb2RbMF0ubUN0eC5rZXksbWljX3JpZC5tdWx0aWNhc3Qsc2l6ZW9mKG1pY19yaWQubXVsdGljYXN0KSk7CisJCQlhaS0+bW9kWzBdLm1DdHgud2luZG93ICA9IDMzOyAvL1dpbmRvdyBhbHdheXMgcG9pbnRzIHRvIHRoZSBtaWRkbGUKKwkJCWFpLT5tb2RbMF0ubUN0eC5yeCAgICAgID0gMDsgIC8vUnggU2VxdWVuY2UgbnVtYmVycworCQkJYWktPm1vZFswXS5tQ3R4LnR4ICAgICAgPSAwOyAgLy9UeCBzZXF1ZW5jZSBudW1iZXJzCisJCQlhaS0+bW9kWzBdLm1DdHgudmFsaWQgICA9IDE7ICAvL0tleSBpcyBub3cgdmFsaWQKKyAgCisJCQkvKiBHaXZlIGtleSB0byBtaWMgc2VlZCAqLworCQkJZW1taDMyX3NldHNlZWQoJmFpLT5tb2RbMF0ubUN0eC5zZWVkLG1pY19yaWQubXVsdGljYXN0LHNpemVvZihtaWNfcmlkLm11bHRpY2FzdCksIGFpLT50Zm0pOworCQl9CisKKwkJLyogS2V5IG11c3QgYmUgdmFsaWQgYW5kIGRpZmZlcmVudCAqLworCQlpZiAobWljX3JpZC51bmljYXN0VmFsaWQgJiYgKCFhaS0+bW9kWzBdLnVDdHgudmFsaWQgfHwgCisJCSAgICAobWVtY21wKGFpLT5tb2RbMF0udUN0eC5rZXksIG1pY19yaWQudW5pY2FzdCwKKwkJCSAgICBzaXplb2YoYWktPm1vZFswXS51Q3R4LmtleSkpICE9IDApKSkgeworCQkJLyogQWdlIGN1cnJlbnQgbWljIENvbnRleHQgKi8KKwkJCW1lbWNweSgmYWktPm1vZFsxXS51Q3R4LCZhaS0+bW9kWzBdLnVDdHgsc2l6ZW9mKG1pY2NudHgpKTsKKwkJCS8qIEluaXRpYWxpemUgbmV3IGNvbnRleHQgKi8KKwkJCW1lbWNweSgmYWktPm1vZFswXS51Q3R4LmtleSxtaWNfcmlkLnVuaWNhc3Qsc2l6ZW9mKG1pY19yaWQudW5pY2FzdCkpOworCQorCQkJYWktPm1vZFswXS51Q3R4LndpbmRvdyAgPSAzMzsgLy9XaW5kb3cgYWx3YXlzIHBvaW50cyB0byB0aGUgbWlkZGxlCisJCQlhaS0+bW9kWzBdLnVDdHgucnggICAgICA9IDA7ICAvL1J4IFNlcXVlbmNlIG51bWJlcnMKKwkJCWFpLT5tb2RbMF0udUN0eC50eCAgICAgID0gMDsgIC8vVHggc2VxdWVuY2UgbnVtYmVycworCQkJYWktPm1vZFswXS51Q3R4LnZhbGlkICAgPSAxOyAgLy9LZXkgaXMgbm93IHZhbGlkCisJCisJCQkvL0dpdmUga2V5IHRvIG1pYyBzZWVkCisJCQllbW1oMzJfc2V0c2VlZCgmYWktPm1vZFswXS51Q3R4LnNlZWQsIG1pY19yaWQudW5pY2FzdCwgc2l6ZW9mKG1pY19yaWQudW5pY2FzdCksIGFpLT50Zm0pOworCQl9CisJfSBlbHNlIHsKKyAgICAgIC8qIFNvIG5leHQgdGltZSB3ZSBoYXZlIGEgdmFsaWQga2V5IGFuZCBtaWMgaXMgZW5hYmxlZCwgd2Ugd2lsbCB1cGRhdGUKKyAgICAgICAqIHRoZSBzZXF1ZW5jZSBudW1iZXIgaWYgdGhlIGtleSBpcyB0aGUgc2FtZSBhcyBiZWZvcmUuCisgICAgICAgKi8KKwkJYWktPm1vZFswXS51Q3R4LnZhbGlkID0gMDsKKwkJYWktPm1vZFswXS5tQ3R4LnZhbGlkID0gMDsKKwl9Cit9CisKKy8qIG1pY3NldHVwIC0gR2V0IHJlYWR5IGZvciBidXNpbmVzcyAqLworCitzdGF0aWMgaW50IG1pY3NldHVwKHN0cnVjdCBhaXJvX2luZm8gKmFpKSB7CisJaW50IGk7CisKKwlpZiAoYWktPnRmbSA9PSBOVUxMKQorCSAgICAgICAgYWktPnRmbSA9IGNyeXB0b19hbGxvY190Zm0oImFlcyIsIDApOworCisgICAgICAgIGlmIChhaS0+dGZtID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImFpcm86IGZhaWxlZCB0byBsb2FkIHRyYW5zZm9ybSBmb3IgQUVTXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1I7CisgICAgICAgIH0KKworCWZvciAoaT0wOyBpIDwgTlVNX01PRFVMRVM7IGkrKykgeworCQltZW1zZXQoJmFpLT5tb2RbaV0ubUN0eCwwLHNpemVvZihtaWNjbnR4KSk7CisJCW1lbXNldCgmYWktPm1vZFtpXS51Q3R4LDAsc2l6ZW9mKG1pY2NudHgpKTsKKwl9CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK2NoYXIgbWljc25hcFtdPSB7MHhBQSwweEFBLDB4MDMsMHgwMCwweDQwLDB4OTYsMHgwMCwweDAyfTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERlc2NyaXB0aW9uOiBNaWMgYSBwYWNrZXQKKyAqICAgIAorICogICAgICBJbnB1dHM6IGV0aGVySGVhZCAqIHBvaW50ZXIgdG8gYW4gODAyLjMgZnJhbWUKKyAqICAgIAorICogICAgIFJldHVybnM6IEJPT0xFQU4gaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGZhbHNlLgorICogICAgICAgICAgICAgUGFja2V0VHhMZW4gd2lsbCBiZSB1cGRhdGVkIHdpdGggdGhlIG1pYydkIHBhY2tldHMgc2l6ZS4KKyAqCisgKiAgICBDYXZlYXRzOiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZyYW1lIGJ1ZmZlciB3aWxsIGFscmVhZHkKKyAqICAgICAgICAgICAgIGJlIGJpZyBlbm91Z2ggdG8gaG9sZCB0aGUgbGFyZ2V0cyBtaWMgbWVzc2FnZSBwb3NzaWJsZS4KKyAqICAgICAgICAgICAgKE5vIG1lbW9yeSBhbGxvY2F0aW9uIGlzIGRvbmUgaGVyZSkuCisgKiAgCisgKiAgICBBdXRob3I6IHNicmFuZWt5ICgxMC8xNS8wMSkKKyAqICAgIE1lcmNpbGVzcyBoYWNrcyBieSByd2lsY2hlciAoMS8xNC8wMikKKyAqLworCitzdGF0aWMgaW50IGVuY2Fwc3VsYXRlKHN0cnVjdCBhaXJvX2luZm8gKmFpICxldGhlckhlYWQgKmZyYW1lLCBNSUNCdWZmZXIgKm1pYywgaW50IHBheUxlbikKK3sKKwltaWNjbnR4ICAgKmNvbnRleHQ7CisKKwkvLyBEZXRlcm1pbmUgY29ycmVjdCBjb250ZXh0CisJLy8gSWYgbm90IGFkaG9jLCBhbHdheXMgdXNlIHVuaWNhc3Qga2V5CisKKwlpZiAodGVzdF9iaXQoRkxBR19BREhPQywgJmFpLT5mbGFncykgJiYgKGZyYW1lLT5kYVswXSAmIDB4MSkpCisJCWNvbnRleHQgPSAmYWktPm1vZFswXS5tQ3R4OworCWVsc2UKKwkJY29udGV4dCA9ICZhaS0+bW9kWzBdLnVDdHg7CisgIAorCWlmICghY29udGV4dC0+dmFsaWQpCisJCXJldHVybiBFUlJPUjsKKworCW1pYy0+dHlwZWxlbiA9IGh0b25zKHBheUxlbiArIDE2KTsgLy9MZW5ndGggb2YgTWljJ2QgcGFja2V0CisKKwltZW1jcHkoJm1pYy0+dS5zbmFwLCBtaWNzbmFwLCBzaXplb2YobWljc25hcCkpOyAvLyBBZGQgU25hcAorCisJLy8gQWRkIFR4IHNlcXVlbmNlCisJbWljLT5zZXEgPSBodG9ubChjb250ZXh0LT50eCk7CisJY29udGV4dC0+dHggKz0gMjsKKworCWVtbWgzMl9pbml0KCZjb250ZXh0LT5zZWVkKTsgLy8gTWljIHRoZSBwYWNrZXQKKwllbW1oMzJfdXBkYXRlKCZjb250ZXh0LT5zZWVkLGZyYW1lLT5kYSxFVEhfQUxFTiAqIDIpOyAvLyBEQSxTQQorCWVtbWgzMl91cGRhdGUoJmNvbnRleHQtPnNlZWQsKHU4KikmbWljLT50eXBlbGVuLDEwKTsgLy8gVHlwZS9MZW5ndGggYW5kIFNuYXAKKwllbW1oMzJfdXBkYXRlKCZjb250ZXh0LT5zZWVkLCh1OCopJm1pYy0+c2VxLHNpemVvZihtaWMtPnNlcSkpOyAvL1NFUQorCWVtbWgzMl91cGRhdGUoJmNvbnRleHQtPnNlZWQsZnJhbWUtPmRhICsgRVRIX0FMRU4gKiAyLHBheUxlbik7IC8vcGF5bG9hZAorCWVtbWgzMl9maW5hbCgmY29udGV4dC0+c2VlZCwgKHU4KikmbWljLT5taWMpOworCisJLyogICAgTmV3IFR5cGUvbGVuZ3RoID8/Pz8/Pz8/Pz8gKi8KKwltaWMtPnR5cGVsZW4gPSAwOyAvL0xldCBOSUMga25vdyBpdCBjb3VsZCBiZSBhbiBvdmVyc2l6ZWQgcGFja2V0CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3R5cGVkZWYgZW51bSB7CisgICAgTk9ORSwKKyAgICBOT01JQywKKyAgICBOT01JQ1BMVU1NRUQsCisgICAgU0VRVUVOQ0UsCisgICAgSU5DT1JSRUNUTUlDLAorfSBtaWNfZXJyb3I7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgRGVzY3JpcHRpb246IERlY2Fwc3VsYXRlcyBhIE1JQydkIHBhY2tldCBhbmQgcmV0dXJucyB0aGUgODAyLjMgcGFja2V0CisgKiAgICAgICAgICAgICAgIChyZW1vdmVzIHRoZSBNSUMgc3R1ZmYpIGlmIHBhY2tldCBpcyBhIHZhbGlkIHBhY2tldC4KKyAqICAgICAgCisgKiAgICAgICBJbnB1dHM6IGV0aGVySGVhZCAgcG9pbnRlciB0byB0aGUgODAyLjMgcGFja2V0ICAgICAgICAgICAgIAorICogICAgIAorICogICAgICBSZXR1cm5zOiBCT09MRUFOIC0gVFJVRSBpZiBwYWNrZXQgc2hvdWxkIGJlIGRyb3BwZWQgb3RoZXJ3aXNlIEZBTFNFCisgKiAgICAgCisgKiAgICAgIEF1dGhvcjogc2JyYW5la3kgKDEwLzE1LzAxKQorICogICAgTWVyY2lsZXNzIGhhY2tzIGJ5IHJ3aWxjaGVyICgxLzE0LzAyKQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitzdGF0aWMgaW50IGRlY2Fwc3VsYXRlKHN0cnVjdCBhaXJvX2luZm8gKmFpLCBNSUNCdWZmZXIgKm1pYywgZXRoZXJIZWFkICpldGgsIHUxNiBwYXlMZW4pCit7CisJaW50ICAgICAgaTsKKwl1MzIgICAgICBtaWNTRVE7CisJbWljY250eCAgKmNvbnRleHQ7CisJdTggICAgICAgZGlnZXN0WzRdOworCW1pY19lcnJvciBtaWNFcnJvciA9IE5PTkU7CisKKwkvLyBDaGVjayBpZiB0aGUgcGFja2V0IGlzIGEgTWljJ2QgcGFja2V0CisKKwlpZiAoIWFpLT5taWNzdGF0cy5lbmFibGVkKSB7CisJCS8vTm8gTWljIHNldCBvciBNaWMgT0ZGIGJ1dCB3ZSByZWNlaXZlZCBhIE1JQydkIHBhY2tldC4KKwkJaWYgKG1lbWNtcCAoKHU4KilldGggKyAxNCwgbWljc25hcCwgc2l6ZW9mKG1pY3NuYXApKSA9PSAwKSB7CisJCQlhaS0+bWljc3RhdHMucnhNSUNQbHVtbWVkKys7CisJCQlyZXR1cm4gRVJST1I7CisJCX0KKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorCisJaWYgKG50b2hzKG1pYy0+dHlwZWxlbikgPT0gMHg4ODhFKQorCQlyZXR1cm4gU1VDQ0VTUzsKKworCWlmIChtZW1jbXAgKG1pYy0+dS5zbmFwLCBtaWNzbmFwLCBzaXplb2YobWljc25hcCkpICE9IDApIHsKKwkgICAgLy8gTWljIGVuYWJsZWQgYnV0IHBhY2tldCBpc24ndCBNaWMnZAorCQlhaS0+bWljc3RhdHMucnhNSUNQbHVtbWVkKys7CisJICAgIAlyZXR1cm4gRVJST1I7CisJfQorCisJbWljU0VRID0gbnRvaGwobWljLT5zZXEpOyAgICAgICAgICAgIC8vc3RvcmUgU0VRIGFzIENQVSBvcmRlcgorCisJLy9BdCB0aGlzIHBvaW50IHdlIGEgaGF2ZSBhIG1pYydkIHBhY2tldCBhbmQgbWljIGlzIGVuYWJsZWQKKwkvL05vdyBkbyB0aGUgbWljIGVycm9yIGNoZWNraW5nLgorCisJLy9SZWNlaXZlIHNlcSBtdXN0IGJlIG9kZAorCWlmICggKG1pY1NFUSAmIDEpID09IDAgKSB7CisJCWFpLT5taWNzdGF0cy5yeFdyb25nU2VxdWVuY2UrKzsKKwkJcmV0dXJuIEVSUk9SOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBOVU1fTU9EVUxFUzsgaSsrKSB7CisJCWludCBtY2FzdCA9IGV0aC0+ZGFbMF0gJiAxOworCQkvL0RldGVybWluZSBwcm9wZXIgY29udGV4dCAKKwkJY29udGV4dCA9IG1jYXN0ID8gJmFpLT5tb2RbaV0ubUN0eCA6ICZhaS0+bW9kW2ldLnVDdHg7CisJCisJCS8vTWFrZSBzdXJlIGNvbnRleHQgaXMgdmFsaWQKKwkJaWYgKCFjb250ZXh0LT52YWxpZCkgeworCQkJaWYgKGkgPT0gMCkKKwkJCQltaWNFcnJvciA9IE5PTUlDUExVTU1FRDsKKwkJCWNvbnRpbnVlOyAgICAgICAgICAgICAgICAKKwkJfQorCSAgICAgICAJLy9EZU1pYyBpdCAKKworCQlpZiAoIW1pYy0+dHlwZWxlbikKKwkJCW1pYy0+dHlwZWxlbiA9IGh0b25zKHBheUxlbiArIHNpemVvZihNSUNCdWZmZXIpIC0gMik7CisJCisJCWVtbWgzMl9pbml0KCZjb250ZXh0LT5zZWVkKTsKKwkJZW1taDMyX3VwZGF0ZSgmY29udGV4dC0+c2VlZCwgZXRoLT5kYSwgRVRIX0FMRU4qMik7IAorCQllbW1oMzJfdXBkYXRlKCZjb250ZXh0LT5zZWVkLCAodTggKikmbWljLT50eXBlbGVuLCBzaXplb2YobWljLT50eXBlbGVuKStzaXplb2YobWljLT51LnNuYXApKTsgCisJCWVtbWgzMl91cGRhdGUoJmNvbnRleHQtPnNlZWQsICh1OCAqKSZtaWMtPnNlcSxzaXplb2YobWljLT5zZXEpKTsJCisJCWVtbWgzMl91cGRhdGUoJmNvbnRleHQtPnNlZWQsIGV0aC0+ZGEgKyBFVEhfQUxFTioyLHBheUxlbik7CQorCQkvL0NhbGN1bGF0ZSBNSUMKKwkJZW1taDMyX2ZpbmFsKCZjb250ZXh0LT5zZWVkLCBkaWdlc3QpOworCQorCQlpZiAobWVtY21wKGRpZ2VzdCwgJm1pYy0+bWljLCA0KSkgeyAvL01ha2Ugc3VyZSB0aGUgbWljcyBtYXRjaAorCQkgIC8vSW52YWxpZCBNaWMKKwkJCWlmIChpID09IDApCisJCQkJbWljRXJyb3IgPSBJTkNPUlJFQ1RNSUM7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8vQ2hlY2sgU2VxdWVuY2UgbnVtYmVyIGlmIG1pY3MgcGFzcworCQlpZiAoUnhTZXFWYWxpZChhaSwgY29udGV4dCwgbWNhc3QsIG1pY1NFUSkgPT0gU1VDQ0VTUykgeworCQkJYWktPm1pY3N0YXRzLnJ4U3VjY2VzcysrOworCQkJcmV0dXJuIFNVQ0NFU1M7CisJCX0KKwkJaWYgKGkgPT0gMCkKKwkJCW1pY0Vycm9yID0gU0VRVUVOQ0U7CisJfQorCisJLy8gVXBkYXRlIHN0YXRpc3RpY3MKKwlzd2l0Y2ggKG1pY0Vycm9yKSB7CisJCWNhc2UgTk9NSUNQTFVNTUVEOiBhaS0+bWljc3RhdHMucnhNSUNQbHVtbWVkKys7ICAgYnJlYWs7CisJCWNhc2UgU0VRVUVOQ0U6ICAgIGFpLT5taWNzdGF0cy5yeFdyb25nU2VxdWVuY2UrKzsgYnJlYWs7CisJCWNhc2UgSU5DT1JSRUNUTUlDOiBhaS0+bWljc3RhdHMucnhJbmNvcnJlY3RNSUMrKzsgYnJlYWs7CisJCWNhc2UgTk9ORTogIGJyZWFrOworCQljYXNlIE5PTUlDOiBicmVhazsKKwl9CisJcmV0dXJuIEVSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGVzY3JpcHRpb246ICBDaGVja3MgdGhlIFJ4IFNlcSBudW1iZXIgdG8gbWFrZSBzdXJlIGl0IGlzIHZhbGlkCisgKiAgICAgICAgICAgICAgIGFuZCBoYXNuJ3QgYWxyZWFkeSBiZWVuIHJlY2VpdmVkCisgKiAgIAorICogICAgIElucHV0czogbWljY250eCAtIG1pYyBjb250ZXh0IHRvIGNoZWNrIHNlcSBhZ2FpbnN0CisgKiAgICAgICAgICAgICBtaWNTZXEgIC0gdGhlIE1pYyBzZXEgbnVtYmVyCisgKiAgIAorICogICAgUmV0dXJuczogVFJVRSBpZiB2YWxpZCBvdGhlcndpc2UgRkFMU0UuIAorICoKKyAqICAgIEF1dGhvcjogc2JyYW5la3kgKDEwLzE1LzAxKQorICogICAgTWVyY2lsZXNzIGhhY2tzIGJ5IHJ3aWxjaGVyICgxLzE0LzAyKQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitzdGF0aWMgaW50IFJ4U2VxVmFsaWQgKHN0cnVjdCBhaXJvX2luZm8gKmFpLG1pY2NudHggKmNvbnRleHQsaW50IG1jYXN0LHUzMiBtaWNTZXEpCit7CisJdTMyIHNlcSxpbmRleDsKKworCS8vQWxsb3cgZm9yIHRoZSBhcCBiZWluZyByZWJvb3RlZCAtIGlmIGl0IGlzIHRoZW4gdXNlIHRoZSBuZXh0IAorCS8vc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHNlcXVlbmNlIG51bWJlciAtIG1pZ2h0IGdvIGJhY2t3YXJkcworCisJaWYgKG1jYXN0KSB7CisJCWlmICh0ZXN0X2JpdChGTEFHX1VQREFURV9NVUxUSSwgJmFpLT5mbGFncykpIHsKKwkJCWNsZWFyX2JpdCAoRkxBR19VUERBVEVfTVVMVEksICZhaS0+ZmxhZ3MpOworCQkJY29udGV4dC0+d2luZG93ID0gKG1pY1NlcSA+IDMzKSA/IG1pY1NlcSA6IDMzOworCQkJY29udGV4dC0+cnggICAgID0gMDsgICAgICAgIC8vIFJlc2V0IHJ4CisJCX0KKwl9IGVsc2UgaWYgKHRlc3RfYml0KEZMQUdfVVBEQVRFX1VOSSwgJmFpLT5mbGFncykpIHsKKwkJY2xlYXJfYml0IChGTEFHX1VQREFURV9VTkksICZhaS0+ZmxhZ3MpOworCQljb250ZXh0LT53aW5kb3cgPSAobWljU2VxID4gMzMpID8gbWljU2VxIDogMzM7IC8vIE1vdmUgd2luZG93CisJCWNvbnRleHQtPnJ4ICAgICA9IDA7ICAgICAgICAvLyBSZXNldCByeAorCX0KKworCS8vTWFrZSBzZXF1ZW5jZSBudW1iZXIgcmVsYXRpdmUgdG8gU1RBUlQgb2Ygd2luZG93CisJc2VxID0gbWljU2VxIC0gKGNvbnRleHQtPndpbmRvdyAtIDMzKTsKKworCS8vVG9vIG9sZCBvZiBhIFNFUSBudW1iZXIgdG8gY2hlY2suCisJaWYgKChzMzIpc2VxIDwgMCkKKwkJcmV0dXJuIEVSUk9SOworICAgIAorCWlmICggc2VxID4gNjQgKSB7CisJCS8vV2luZG93IGlzIGluZmluaXRlIGZvcndhcmQKKwkJTW92ZVdpbmRvdyhjb250ZXh0LG1pY1NlcSk7CisJCXJldHVybiBTVUNDRVNTOworCX0KKworCS8vIFdlIGFyZSBpbiB0aGUgd2luZG93LiBOb3cgY2hlY2sgdGhlIGNvbnRleHQgcnggYml0IHRvIHNlZSBpZiBpdCB3YXMgYWxyZWFkeSBzZW50CisJc2VxID4+PSAxOyAgICAgICAgIC8vZGl2aWRlIGJ5IDIgYmVjYXVzZSB3ZSBvbmx5IGhhdmUgb2RkIG51bWJlcnMKKwlpbmRleCA9IDEgPDwgc2VxOyAgLy9HZXQgYW4gaW5kZXggbnVtYmVyCisKKwlpZiAoIShjb250ZXh0LT5yeCAmIGluZGV4KSkgeworCQkvL21pY1NFUSBmYWxscyBpbnNpZGUgdGhlIHdpbmRvdy4KKwkJLy9BZGQgc2VxZW5jZSBudW1iZXIgdG8gdGhlIGxpc3Qgb2YgcmVjZWl2ZWQgbnVtYmVycy4KKwkJY29udGV4dC0+cnggfD0gaW5kZXg7CisKKwkJTW92ZVdpbmRvdyhjb250ZXh0LG1pY1NlcSk7CisKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorCXJldHVybiBFUlJPUjsKK30KKworc3RhdGljIHZvaWQgTW92ZVdpbmRvdyhtaWNjbnR4ICpjb250ZXh0LCB1MzIgbWljU2VxKQoreworCXUzMiBzaGlmdDsKKworCS8vTW92ZSB3aW5kb3cgaWYgc2VxIGdyZWF0ZXIgdGhhbiB0aGUgbWlkZGxlIG9mIHRoZSB3aW5kb3cKKwlpZiAobWljU2VxID4gY29udGV4dC0+d2luZG93KSB7CisJCXNoaWZ0ID0gKG1pY1NlcSAtIGNvbnRleHQtPndpbmRvdykgPj4gMTsKKyAgICAKKwkJICAgIC8vU2hpZnQgb3V0IG9sZAorCQlpZiAoc2hpZnQgPCAzMikKKwkJCWNvbnRleHQtPnJ4ID4+PSBzaGlmdDsKKwkJZWxzZQorCQkJY29udGV4dC0+cnggPSAwOworCisJCWNvbnRleHQtPndpbmRvdyA9IG1pY1NlcTsgICAgICAvL01vdmUgd2luZG93CisJfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyo9PT09PT09PT09IEVNTUggUk9VVElORVMgID09PT09PT09PT09PT09PT09PT09Ki8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIG1pYyBhY2N1bXVsYXRlICovCisjZGVmaW5lIE1JQ19BQ0NVTSh2YWwpCVwKKwljb250ZXh0LT5hY2N1bSArPSAodTY0KSh2YWwpICogY29udGV4dC0+Y29lZmZbY29lZmZfcG9zaXRpb24rK107CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFlc19jb3VudGVyWzE2XTsKKworLyogZXhwYW5kIHRoZSBrZXkgdG8gZmlsbCB0aGUgTU1IIGNvZWZmaWNpZW50IGFycmF5ICovCit2b2lkIGVtbWgzMl9zZXRzZWVkKGVtbWgzMl9jb250ZXh0ICpjb250ZXh0LCB1OCAqcGtleSwgaW50IGtleWxlbiwgc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKyAgLyogdGFrZSB0aGUga2V5aW5nIG1hdGVyaWFsLCBleHBhbmQgaWYgbmVjZXNzYXJ5LCB0cnVuY2F0ZSBhdCAxNi1ieXRlcyAqLworICAvKiBydW4gdGhyb3VnaCBBRVMgY291bnRlciBtb2RlIHRvIGdlbmVyYXRlIGNvbnRleHQtPmNvZWZmW10gKi8KKyAgCisJaW50IGksajsKKwl1MzIgY291bnRlcjsKKwl1OCAqY2lwaGVyLCBwbGFpblsxNl07CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzFdOworCisJY3J5cHRvX2NpcGhlcl9zZXRrZXkodGZtLCBwa2V5LCAxNik7CisJY291bnRlciA9IDA7CisJZm9yIChpID0gMDsgaSA8IChzaXplb2YoY29udGV4dC0+Y29lZmYpL3NpemVvZihjb250ZXh0LT5jb2VmZlswXSkpOyApIHsKKwkJYWVzX2NvdW50ZXJbMTVdID0gKHU4KShjb3VudGVyID4+IDApOworCQlhZXNfY291bnRlclsxNF0gPSAodTgpKGNvdW50ZXIgPj4gOCk7CisJCWFlc19jb3VudGVyWzEzXSA9ICh1OCkoY291bnRlciA+PiAxNik7CisJCWFlc19jb3VudGVyWzEyXSA9ICh1OCkoY291bnRlciA+PiAyNCk7CisJCWNvdW50ZXIrKzsKKwkJbWVtY3B5IChwbGFpbiwgYWVzX2NvdW50ZXIsIDE2KTsKKwkJc2dbMF0ucGFnZSA9IHZpcnRfdG9fcGFnZShwbGFpbik7CisJCXNnWzBdLm9mZnNldCA9ICgobG9uZykgcGxhaW4gJiB+UEFHRV9NQVNLKTsKKwkJc2dbMF0ubGVuZ3RoID0gMTY7CisJCWNyeXB0b19jaXBoZXJfZW5jcnlwdCh0Zm0sIHNnLCBzZywgMTYpOworCQljaXBoZXIgPSBrbWFwKHNnWzBdLnBhZ2UpICsgc2dbMF0ub2Zmc2V0OworCQlmb3IgKGo9MDsgKGo8MTYpICYmIChpPCAoc2l6ZW9mKGNvbnRleHQtPmNvZWZmKS9zaXplb2YoY29udGV4dC0+Y29lZmZbMF0pKSk7ICkgeworCQkJY29udGV4dC0+Y29lZmZbaSsrXSA9IG50b2hsKCoodTMyICopJmNpcGhlcltqXSk7CisJCQlqICs9IDQ7CisJCX0KKwl9Cit9CisKKy8qIHByZXBhcmUgZm9yIGNhbGN1bGF0aW9uIG9mIGEgbmV3IG1pYyAqLwordm9pZCBlbW1oMzJfaW5pdChlbW1oMzJfY29udGV4dCAqY29udGV4dCkKK3sKKwkvKiBwcmVwYXJlIGZvciBuZXcgbWljIGNhbGN1bGF0aW9uICovCisJY29udGV4dC0+YWNjdW0gPSAwOworCWNvbnRleHQtPnBvc2l0aW9uID0gMDsKK30KKworLyogYWRkIHNvbWUgYnl0ZXMgdG8gdGhlIG1pYyBjYWxjdWxhdGlvbiAqLwordm9pZCBlbW1oMzJfdXBkYXRlKGVtbWgzMl9jb250ZXh0ICpjb250ZXh0LCB1OCAqcE9jdGV0cywgaW50IGxlbikKK3sKKwlpbnQJY29lZmZfcG9zaXRpb24sIGJ5dGVfcG9zaXRpb247CisgIAorCWlmIChsZW4gPT0gMCkgcmV0dXJuOworICAKKwljb2VmZl9wb3NpdGlvbiA9IGNvbnRleHQtPnBvc2l0aW9uID4+IDI7CisgIAorCS8qIGRlYWwgd2l0aCBwYXJ0aWFsIDMyLWJpdCB3b3JkIGxlZnQgb3ZlciBmcm9tIGxhc3QgdXBkYXRlICovCisJYnl0ZV9wb3NpdGlvbiA9IGNvbnRleHQtPnBvc2l0aW9uICYgMzsKKwlpZiAoYnl0ZV9wb3NpdGlvbikgeworCQkvKiBoYXZlIGEgcGFydGlhbCB3b3JkIGluIHBhcnQgdG8gZGVhbCB3aXRoICovCisJCWRvIHsKKwkJCWlmIChsZW4gPT0gMCkgcmV0dXJuOworCQkJY29udGV4dC0+cGFydC5kOFtieXRlX3Bvc2l0aW9uKytdID0gKnBPY3RldHMrKzsKKwkJCWNvbnRleHQtPnBvc2l0aW9uKys7CisJCQlsZW4tLTsKKwkJfSB3aGlsZSAoYnl0ZV9wb3NpdGlvbiA8IDQpOworCQlNSUNfQUNDVU0oaHRvbmwoY29udGV4dC0+cGFydC5kMzIpKTsKKwl9CisKKwkvKiBkZWFsIHdpdGggZnVsbCAzMi1iaXQgd29yZHMgKi8KKwl3aGlsZSAobGVuID49IDQpIHsKKwkJTUlDX0FDQ1VNKGh0b25sKCoodTMyICopcE9jdGV0cykpOworCQljb250ZXh0LT5wb3NpdGlvbiArPSA0OworCQlwT2N0ZXRzICs9IDQ7CisJCWxlbiAtPSA0OworCX0KKworCS8qIGRlYWwgd2l0aCBwYXJ0aWFsIDMyLWJpdCB3b3JkIHRoYXQgd2lsbCBiZSBsZWZ0IG92ZXIgZnJvbSB0aGlzIHVwZGF0ZSAqLworCWJ5dGVfcG9zaXRpb24gPSAwOworCXdoaWxlIChsZW4gPiAwKSB7CisJCWNvbnRleHQtPnBhcnQuZDhbYnl0ZV9wb3NpdGlvbisrXSA9ICpwT2N0ZXRzKys7CisJCWNvbnRleHQtPnBvc2l0aW9uKys7CisJCWxlbi0tOworCX0KK30KKworLyogbWFzayB1c2VkIHRvIHplcm8gZW1wdHkgYnl0ZXMgZm9yIGZpbmFsIHBhcnRpYWwgd29yZCAqLworc3RhdGljIHUzMiBtYXNrMzJbNF0gPSB7IDB4MDAwMDAwMDBMLCAweEZGMDAwMDAwTCwgMHhGRkZGMDAwMEwsIDB4RkZGRkZGMDBMIH07CisKKy8qIGNhbGN1bGF0ZSB0aGUgbWljICovCit2b2lkIGVtbWgzMl9maW5hbChlbW1oMzJfY29udGV4dCAqY29udGV4dCwgdTggZGlnZXN0WzRdKQoreworCWludAljb2VmZl9wb3NpdGlvbiwgYnl0ZV9wb3NpdGlvbjsKKwl1MzIJdmFsOworICAKKwl1NjQgc3VtLCB1dG1wOworCXM2NCBzdG1wOworCisJY29lZmZfcG9zaXRpb24gPSBjb250ZXh0LT5wb3NpdGlvbiA+PiAyOworICAKKwkvKiBkZWFsIHdpdGggcGFydGlhbCAzMi1iaXQgd29yZCBsZWZ0IG92ZXIgZnJvbSBsYXN0IHVwZGF0ZSAqLworCWJ5dGVfcG9zaXRpb24gPSBjb250ZXh0LT5wb3NpdGlvbiAmIDM7CisJaWYgKGJ5dGVfcG9zaXRpb24pIHsKKwkJLyogaGF2ZSBhIHBhcnRpYWwgd29yZCBpbiBwYXJ0IHRvIGRlYWwgd2l0aCAqLworCQl2YWwgPSBodG9ubChjb250ZXh0LT5wYXJ0LmQzMik7CisJCU1JQ19BQ0NVTSh2YWwgJiBtYXNrMzJbYnl0ZV9wb3NpdGlvbl0pOwkvKiB6ZXJvIGVtcHR5IGJ5dGVzICovCisJfQorCisJLyogcmVkdWNlIHRoZSBhY2N1bXVsYXRlZCB1NjQgdG8gYSAzMi1iaXQgTUlDICovCisJc3VtID0gY29udGV4dC0+YWNjdW07CisJc3RtcCA9IChzdW0gICYgMHhmZmZmZmZmZkxMKSAtICgoc3VtID4+IDMyKSAgKiAxNSk7CisJdXRtcCA9IChzdG1wICYgMHhmZmZmZmZmZkxMKSAtICgoc3RtcCA+PiAzMikgKiAxNSk7CisJc3VtID0gdXRtcCAmIDB4ZmZmZmZmZmZMTDsKKwlpZiAodXRtcCA+IDB4MTAwMDAwMDBmTEwpCisJCXN1bSAtPSAxNTsKKworCXZhbCA9ICh1MzIpc3VtOworCWRpZ2VzdFswXSA9ICh2YWw+PjI0KSAmIDB4RkY7CisJZGlnZXN0WzFdID0gKHZhbD4+MTYpICYgMHhGRjsKKwlkaWdlc3RbMl0gPSAodmFsPj44KSAmIDB4RkY7CisJZGlnZXN0WzNdID0gdmFsICYgMHhGRjsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHJlYWRCU1NMaXN0UmlkKHN0cnVjdCBhaXJvX2luZm8gKmFpLCBpbnQgZmlyc3QsCisJCSAgICAgIEJTU0xpc3RSaWQgKmxpc3QpIHsKKwlpbnQgcmM7CisJCQlDbWQgY21kOworCQkJUmVzcCByc3A7CisKKwlpZiAoZmlyc3QgPT0gMSkgeworCQkJaWYgKGFpLT5mbGFncyAmIEZMQUdfUkFESU9fTUFTSykgcmV0dXJuIC1FTkVURE9XTjsKKwkJCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJCQljbWQuY21kPUNNRF9MSVNUQlNTOworCQkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYWktPnNlbSkpCisJCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJCWlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCk7CisJCQl1cCgmYWktPnNlbSk7CisJCQkvKiBMZXQgdGhlIGNvbW1hbmQgdGFrZSBlZmZlY3QgKi8KKwkJCWFpLT50YXNrID0gY3VycmVudDsKKwkJCXNzbGVlcCgzKTsKKwkJCWFpLT50YXNrID0gTlVMTDsKKwkJfQorCXJjID0gUEM0NTAwX3JlYWRyaWQoYWksIGZpcnN0ID8gUklEX0JTU0xJU1RGSVJTVCA6IFJJRF9CU1NMSVNUTkVYVCwKKwkJCSAgICBsaXN0LCBzaXplb2YoKmxpc3QpLCAxKTsKKworCWxpc3QtPmxlbiA9IGxlMTZfdG9fY3B1KGxpc3QtPmxlbik7CisJbGlzdC0+aW5kZXggPSBsZTE2X3RvX2NwdShsaXN0LT5pbmRleCk7CisJbGlzdC0+cmFkaW9UeXBlID0gbGUxNl90b19jcHUobGlzdC0+cmFkaW9UeXBlKTsKKwlsaXN0LT5jYXAgPSBsZTE2X3RvX2NwdShsaXN0LT5jYXApOworCWxpc3QtPmJlYWNvbkludGVydmFsID0gbGUxNl90b19jcHUobGlzdC0+YmVhY29uSW50ZXJ2YWwpOworCWxpc3QtPmZoLmR3ZWxsID0gbGUxNl90b19jcHUobGlzdC0+ZmguZHdlbGwpOworCWxpc3QtPmRzQ2hhbm5lbCA9IGxlMTZfdG9fY3B1KGxpc3QtPmRzQ2hhbm5lbCk7CisJbGlzdC0+YXRpbVdpbmRvdyA9IGxlMTZfdG9fY3B1KGxpc3QtPmF0aW1XaW5kb3cpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCByZWFkV2VwS2V5UmlkKHN0cnVjdCBhaXJvX2luZm8qYWksIFdlcEtleVJpZCAqd2tyLCBpbnQgdGVtcCwgaW50IGxvY2spIHsKKwlpbnQgcmMgPSBQQzQ1MDBfcmVhZHJpZChhaSwgdGVtcCA/IFJJRF9XRVBfVEVNUCA6IFJJRF9XRVBfUEVSTSwKKwkJCQl3a3IsIHNpemVvZigqd2tyKSwgbG9jayk7CisKKwl3a3ItPmxlbiA9IGxlMTZfdG9fY3B1KHdrci0+bGVuKTsKKwl3a3ItPmtpbmRleCA9IGxlMTZfdG9fY3B1KHdrci0+a2luZGV4KTsKKwl3a3ItPmtsZW4gPSBsZTE2X3RvX2NwdSh3a3ItPmtsZW4pOworCXJldHVybiByYzsKK30KKy8qIEluIHRoZSB3cml0ZVhYWFJpZCByb3V0aW5lcyB3ZSBjb3B5IHRoZSByaWRzIHNvIHRoYXQgd2UgZG9uJ3Qgc2NyZXd1cAorICogdGhlIG9yaWdpbmFscyB3aGVuIHdlIGVuZGlhbiB0aGVtLi4uICovCitzdGF0aWMgaW50IHdyaXRlV2VwS2V5UmlkKHN0cnVjdCBhaXJvX2luZm8qYWksIFdlcEtleVJpZCAqcHdrciwgaW50IHBlcm0sIGludCBsb2NrKSB7CisJaW50IHJjOworCVdlcEtleVJpZCB3a3IgPSAqcHdrcjsKKworCXdrci5sZW4gPSBjcHVfdG9fbGUxNih3a3IubGVuKTsKKwl3a3Iua2luZGV4ID0gY3B1X3RvX2xlMTYod2tyLmtpbmRleCk7CisJd2tyLmtsZW4gPSBjcHVfdG9fbGUxNih3a3Iua2xlbik7CisJcmMgPSBQQzQ1MDBfd3JpdGVyaWQoYWksIFJJRF9XRVBfVEVNUCwgJndrciwgc2l6ZW9mKHdrciksIGxvY2spOworCWlmIChyYyE9U1VDQ0VTUykgcHJpbnRrKEtFUk5fRVJSICJhaXJvOiAgV0VQX1RFTVAgc2V0ICV4XG4iLCByYyk7CisJaWYgKHBlcm0pIHsKKwkJcmMgPSBQQzQ1MDBfd3JpdGVyaWQoYWksIFJJRF9XRVBfUEVSTSwgJndrciwgc2l6ZW9mKHdrciksIGxvY2spOworCQlpZiAocmMhPVNVQ0NFU1MpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYWlybzogIFdFUF9QRVJNIHNldCAleFxuIiwgcmMpOworCQl9CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCByZWFkU3NpZFJpZChzdHJ1Y3QgYWlyb19pbmZvKmFpLCBTc2lkUmlkICpzc2lkcikgeworCWludCBpOworCWludCByYyA9IFBDNDUwMF9yZWFkcmlkKGFpLCBSSURfU1NJRCwgc3NpZHIsIHNpemVvZigqc3NpZHIpLCAxKTsKKworCXNzaWRyLT5sZW4gPSBsZTE2X3RvX2NwdShzc2lkci0+bGVuKTsKKwlmb3IoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJc3NpZHItPnNzaWRzW2ldLmxlbiA9IGxlMTZfdG9fY3B1KHNzaWRyLT5zc2lkc1tpXS5sZW4pOworCX0KKwlyZXR1cm4gcmM7Cit9CitzdGF0aWMgaW50IHdyaXRlU3NpZFJpZChzdHJ1Y3QgYWlyb19pbmZvKmFpLCBTc2lkUmlkICpwc3NpZHIsIGludCBsb2NrKSB7CisJaW50IHJjOworCWludCBpOworCVNzaWRSaWQgc3NpZHIgPSAqcHNzaWRyOworCisJc3NpZHIubGVuID0gY3B1X3RvX2xlMTYoc3NpZHIubGVuKTsKKwlmb3IoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJc3NpZHIuc3NpZHNbaV0ubGVuID0gY3B1X3RvX2xlMTYoc3NpZHIuc3NpZHNbaV0ubGVuKTsKKwl9CisJcmMgPSBQQzQ1MDBfd3JpdGVyaWQoYWksIFJJRF9TU0lELCAmc3NpZHIsIHNpemVvZihzc2lkciksIGxvY2spOworCXJldHVybiByYzsKK30KK3N0YXRpYyBpbnQgcmVhZENvbmZpZ1JpZChzdHJ1Y3QgYWlyb19pbmZvKmFpLCBpbnQgbG9jaykgeworCWludCByYzsKKwl1MTYgKnM7CisJQ29uZmlnUmlkIGNmZzsKKworCWlmIChhaS0+Y29uZmlnLmxlbikKKwkJcmV0dXJuIFNVQ0NFU1M7CisKKwlyYyA9IFBDNDUwMF9yZWFkcmlkKGFpLCBSSURfQUNUVUFMQ09ORklHLCAmY2ZnLCBzaXplb2YoY2ZnKSwgbG9jayk7CisJaWYgKHJjICE9IFNVQ0NFU1MpCisJCXJldHVybiByYzsKKworCWZvcihzID0gJmNmZy5sZW47IHMgPD0gJmNmZy5ydHNUaHJlczsgcysrKSAqcyA9IGxlMTZfdG9fY3B1KCpzKTsKKworCWZvcihzID0gJmNmZy5zaG9ydFJldHJ5TGltaXQ7IHMgPD0gJmNmZy5yYWRpb1R5cGU7IHMrKykKKwkJKnMgPSBsZTE2X3RvX2NwdSgqcyk7CisKKwlmb3IocyA9ICZjZmcudHhQb3dlcjsgcyA8PSAmY2ZnLnJhZGlvU3BlY2lmaWM7IHMrKykKKwkJKnMgPSBsZTE2X3RvX2NwdSgqcyk7CisKKwlmb3IocyA9ICZjZmcuYXJsVGhyZXNob2xkOyBzIDw9ICZjZmcuX3Jlc2VydmVkNFswXTsgcysrKQorCQkqcyA9IGNwdV90b19sZTE2KCpzKTsKKworCWZvcihzID0gJmNmZy5hdXRvV2FrZTsgcyA8PSAmY2ZnLmF1dG9XYWtlOyBzKyspCisJCSpzID0gY3B1X3RvX2xlMTYoKnMpOworCisJYWktPmNvbmZpZyA9IGNmZzsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja1Rocm90dGxlKHN0cnVjdCBhaXJvX2luZm8gKmFpKSB7CisJaW50IGk7CisvKiBPbGQgaGFyZHdhcmUgaGFkIGEgbGltaXQgb24gZW5jcnlwdGlvbiBzcGVlZCAqLworCWlmIChhaS0+Y29uZmlnLmF1dGhUeXBlICE9IEFVVEhfT1BFTiAmJiBtYXhlbmNyeXB0KSB7CisJCWZvcihpPTA7IGk8ODsgaSsrKSB7CisJCQlpZiAoYWktPmNvbmZpZy5yYXRlc1tpXSA+IG1heGVuY3J5cHQpIHsKKwkJCQlhaS0+Y29uZmlnLnJhdGVzW2ldID0gMDsKKwkJCX0KKwkJfQorCX0KK30KK3N0YXRpYyBpbnQgd3JpdGVDb25maWdSaWQoc3RydWN0IGFpcm9faW5mbyphaSwgaW50IGxvY2spIHsKKwl1MTYgKnM7CisJQ29uZmlnUmlkIGNmZ3I7CisKKwlpZiAoIXRlc3RfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncykpCisJCXJldHVybiBTVUNDRVNTOworCisJY2xlYXJfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJY2xlYXJfYml0IChGTEFHX1JFU0VULCAmYWktPmZsYWdzKTsKKwljaGVja1Rocm90dGxlKGFpKTsKKwljZmdyID0gYWktPmNvbmZpZzsKKworCWlmICgoY2Znci5vcG1vZGUgJiAweEZGKSA9PSBNT0RFX1NUQV9JQlNTKQorCQlzZXRfYml0KEZMQUdfQURIT0MsICZhaS0+ZmxhZ3MpOworCWVsc2UKKwkJY2xlYXJfYml0KEZMQUdfQURIT0MsICZhaS0+ZmxhZ3MpOworCisJZm9yKHMgPSAmY2Znci5sZW47IHMgPD0gJmNmZ3IucnRzVGhyZXM7IHMrKykgKnMgPSBjcHVfdG9fbGUxNigqcyk7CisKKwlmb3IocyA9ICZjZmdyLnNob3J0UmV0cnlMaW1pdDsgcyA8PSAmY2Znci5yYWRpb1R5cGU7IHMrKykKKwkJKnMgPSBjcHVfdG9fbGUxNigqcyk7CisKKwlmb3IocyA9ICZjZmdyLnR4UG93ZXI7IHMgPD0gJmNmZ3IucmFkaW9TcGVjaWZpYzsgcysrKQorCQkqcyA9IGNwdV90b19sZTE2KCpzKTsKKworCWZvcihzID0gJmNmZ3IuYXJsVGhyZXNob2xkOyBzIDw9ICZjZmdyLl9yZXNlcnZlZDRbMF07IHMrKykKKwkJKnMgPSBjcHVfdG9fbGUxNigqcyk7CisKKwlmb3IocyA9ICZjZmdyLmF1dG9XYWtlOyBzIDw9ICZjZmdyLmF1dG9XYWtlOyBzKyspCisJCSpzID0gY3B1X3RvX2xlMTYoKnMpOworCisJcmV0dXJuIFBDNDUwMF93cml0ZXJpZCggYWksIFJJRF9DT05GSUcsICZjZmdyLCBzaXplb2YoY2ZnciksIGxvY2spOworfQorc3RhdGljIGludCByZWFkU3RhdHVzUmlkKHN0cnVjdCBhaXJvX2luZm8qYWksIFN0YXR1c1JpZCAqc3RhdHIsIGludCBsb2NrKSB7CisJaW50IHJjID0gUEM0NTAwX3JlYWRyaWQoYWksIFJJRF9TVEFUVVMsIHN0YXRyLCBzaXplb2YoKnN0YXRyKSwgbG9jayk7CisJdTE2ICpzOworCisJc3RhdHItPmxlbiA9IGxlMTZfdG9fY3B1KHN0YXRyLT5sZW4pOworCWZvcihzID0gJnN0YXRyLT5tb2RlOyBzIDw9ICZzdGF0ci0+U1NJRGxlbjsgcysrKSAqcyA9IGxlMTZfdG9fY3B1KCpzKTsKKworCWZvcihzID0gJnN0YXRyLT5iZWFjb25QZXJpb2Q7IHMgPD0gJnN0YXRyLT5zaG9ydFByZWFtYmxlOyBzKyspCisJCSpzID0gbGUxNl90b19jcHUoKnMpOworCXN0YXRyLT5sb2FkID0gbGUxNl90b19jcHUoc3RhdHItPmxvYWQpOworCXN0YXRyLT5hc3NvY1N0YXR1cyA9IGxlMTZfdG9fY3B1KHN0YXRyLT5hc3NvY1N0YXR1cyk7CisJcmV0dXJuIHJjOworfQorc3RhdGljIGludCByZWFkQVBMaXN0UmlkKHN0cnVjdCBhaXJvX2luZm8qYWksIEFQTGlzdFJpZCAqYXBscikgeworCWludCByYyA9ICBQQzQ1MDBfcmVhZHJpZChhaSwgUklEX0FQTElTVCwgYXBsciwgc2l6ZW9mKCphcGxyKSwgMSk7CisJYXBsci0+bGVuID0gbGUxNl90b19jcHUoYXBsci0+bGVuKTsKKwlyZXR1cm4gcmM7Cit9CitzdGF0aWMgaW50IHdyaXRlQVBMaXN0UmlkKHN0cnVjdCBhaXJvX2luZm8qYWksIEFQTGlzdFJpZCAqYXBsciwgaW50IGxvY2spIHsKKwlpbnQgcmM7CisJYXBsci0+bGVuID0gY3B1X3RvX2xlMTYoYXBsci0+bGVuKTsKKwlyYyA9IFBDNDUwMF93cml0ZXJpZChhaSwgUklEX0FQTElTVCwgYXBsciwgc2l6ZW9mKCphcGxyKSwgbG9jayk7CisJcmV0dXJuIHJjOworfQorc3RhdGljIGludCByZWFkQ2FwYWJpbGl0eVJpZChzdHJ1Y3QgYWlyb19pbmZvKmFpLCBDYXBhYmlsaXR5UmlkICpjYXByLCBpbnQgbG9jaykgeworCWludCByYyA9IFBDNDUwMF9yZWFkcmlkKGFpLCBSSURfQ0FQQUJJTElUSUVTLCBjYXByLCBzaXplb2YoKmNhcHIpLCBsb2NrKTsKKwl1MTYgKnM7CisKKwljYXByLT5sZW4gPSBsZTE2X3RvX2NwdShjYXByLT5sZW4pOworCWNhcHItPnByb2ROdW0gPSBsZTE2X3RvX2NwdShjYXByLT5wcm9kTnVtKTsKKwljYXByLT5yYWRpb1R5cGUgPSBsZTE2X3RvX2NwdShjYXByLT5yYWRpb1R5cGUpOworCWNhcHItPmNvdW50cnkgPSBsZTE2X3RvX2NwdShjYXByLT5jb3VudHJ5KTsKKwlmb3IocyA9ICZjYXByLT50eFBvd2VyTGV2ZWxzWzBdOyBzIDw9ICZjYXByLT5yZXF1aXJlZEhhcmQ7IHMrKykKKwkJKnMgPSBsZTE2X3RvX2NwdSgqcyk7CisJcmV0dXJuIHJjOworfQorc3RhdGljIGludCByZWFkU3RhdHNSaWQoc3RydWN0IGFpcm9faW5mbyphaSwgU3RhdHNSaWQgKnNyLCBpbnQgcmlkLCBpbnQgbG9jaykgeworCWludCByYyA9IFBDNDUwMF9yZWFkcmlkKGFpLCByaWQsIHNyLCBzaXplb2YoKnNyKSwgbG9jayk7CisJdTMyICppOworCisJc3ItPmxlbiA9IGxlMTZfdG9fY3B1KHNyLT5sZW4pOworCWZvcihpID0gJnNyLT52YWxzWzBdOyBpIDw9ICZzci0+dmFsc1s5OV07IGkrKykgKmkgPSBsZTMyX3RvX2NwdSgqaSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGFpcm9fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IGFpcm9faW5mbyAqaW5mbyA9IGRldi0+cHJpdjsKKwlSZXNwIHJzcDsKKworCWlmICh0ZXN0X2JpdChGTEFHX0ZMQVNISU5HLCAmaW5mby0+ZmxhZ3MpKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIE1ha2Ugc3VyZSB0aGUgY2FyZCBpcyBjb25maWd1cmVkLgorCSAqIFdpcmVsZXNzIEV4dGVuc2lvbnMgbWF5IHBvc3Rwb25lIGNvbmZpZyBjaGFuZ2VzIHVudGlsIHRoZSBjYXJkCisJICogaXMgb3BlbiAodG8gcGlwZWxpbmUgY2hhbmdlcyBhbmQgc3BlZWQtdXAgY2FyZCBzZXR1cCkuIElmCisJICogdGhvc2UgY2hhbmdlcyBhcmUgbm90IHlldCBjb21taXRlZCwgZG8gaXQgbm93IC0gSmVhbiBJSSAqLworCWlmICh0ZXN0X2JpdCAoRkxBR19DT01NSVQsICZpbmZvLT5mbGFncykpIHsKKwkJZGlzYWJsZV9NQUMoaW5mbywgMSk7CisJCXdyaXRlQ29uZmlnUmlkKGluZm8sIDEpOworCX0KKworCWlmIChpbmZvLT53aWZpZGV2ICE9IGRldikgeworCQkvKiBQb3dlciBvbiB0aGUgTUFDIGNvbnRyb2xsZXIgKHdoaWNoIG1heSBoYXZlIGJlZW4gZGlzYWJsZWQpICovCisJCWNsZWFyX2JpdChGTEFHX1JBRElPX0RPV04sICZpbmZvLT5mbGFncyk7CisJCWVuYWJsZV9pbnRlcnJ1cHRzKGluZm8pOworCX0KKwllbmFibGVfTUFDKGluZm8sICZyc3AsIDEpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGlfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJaW50IG5wYWNrcywgcGVuZGluZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCisJaWYgKCFza2IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiAlczogc2tiPT1OVUxMXG4iLF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAwOworCX0KKwlucGFja3MgPSBza2JfcXVldWVfbGVuICgmYWktPnR4cSk7CisKKwlpZiAobnBhY2tzID49IE1BWFRYUSAtIDEpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKwkJaWYgKG5wYWNrcyA+IE1BWFRYUSkgeworCQkJYWktPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlza2JfcXVldWVfdGFpbCAoJmFpLT50eHEsIHNrYik7CisJCXJldHVybiAwOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZhaS0+YXV4X2xvY2ssIGZsYWdzKTsKKwlza2JfcXVldWVfdGFpbCAoJmFpLT50eHEsIHNrYik7CisJcGVuZGluZyA9IHRlc3RfYml0KEZMQUdfUEVORElOR19YTUlULCAmYWktPmZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhaS0+YXV4X2xvY2ssZmxhZ3MpOworCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisKKwlpZiAocGVuZGluZyA9PSAwKSB7CisJCXNldF9iaXQoRkxBR19QRU5ESU5HX1hNSVQsICZhaS0+ZmxhZ3MpOworCQltcGlfc2VuZF9wYWNrZXQgKGRldik7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogQG1waV9zZW5kX3BhY2tldAorICoKKyAqIEF0dGVtcHQgdG8gdHJhbnNtaXQgYSBwYWNrZXQuIENhbiBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQKKyAqIG9yIHRyYW5zbWl0IC4gcmV0dXJuIG51bWJlciBvZiBwYWNrZXRzIHdlIHRyaWVkIHRvIHNlbmQKKyAqLworCitzdGF0aWMgaW50IG1waV9zZW5kX3BhY2tldCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKwlzMTYgbGVuLCAqcGF5bG9hZExlbjsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwl1OCAqc2VuZGJ1ZjsKKworCS8qIGdldCBhIHBhY2tldCB0byBzZW5kICovCisKKwlpZiAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZhaS0+dHhxKSkgPT0gMCkgeworCQlwcmludGsgKEtFUk5fRVJSCisJCQkiYWlybzogJXM6IERlcXVldWUnZCB6ZXJvIGluIHNlbmRfcGFja2V0KClcbiIsCisJCQlfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBjaGVjayBtaW4gbGVuZ3RoKi8KKwlsZW4gPSBFVEhfWkxFTiA8IHNrYi0+bGVuID8gc2tiLT5sZW4gOiBFVEhfWkxFTjsKKwlidWZmZXIgPSBza2ItPmRhdGE7CisKKwlhaS0+dHhmaWRzWzBdLnR4X2Rlc2Mub2Zmc2V0ID0gMDsKKwlhaS0+dHhmaWRzWzBdLnR4X2Rlc2MudmFsaWQgPSAxOworCWFpLT50eGZpZHNbMF0udHhfZGVzYy5lb2MgPSAxOworCWFpLT50eGZpZHNbMF0udHhfZGVzYy5sZW4gPWxlbitzaXplb2YoV2lmaUhkcik7CisKKy8qCisgKiBNYWdpYywgdGhlIGNhcmRzIGZpcm13YXJlIG5lZWRzIGEgbGVuZ3RoIGNvdW50ICgyIGJ5dGVzKSBpbiB0aGUgaG9zdCBidWZmZXIKKyAqIHJpZ2h0IGFmdGVyICBUWEZJRF9IRFIuVGhlIFRYRklEX0hEUiBjb250YWlucyB0aGUgc3RhdHVzIHNob3J0IHNvIHBheWxvYWRsZW4KKyAqIGlzIGltbWVkaWF0bHkgYWZ0ZXIgaXQuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICAgICAgICAgICAgICAgICAgICAgfFRYRklESERSK1NUQVRVU3xQQVlMT0FETEVOfDgwMi4zSERSfFBBQ0tFVERBVEF8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisJbWVtY3B5KChjaGFyICopYWktPnR4Zmlkc1swXS52aXJ0dWFsX2hvc3RfYWRkciwKKwkJKGNoYXIgKikmd2lmaWN0bGhkcjgwMjMsIHNpemVvZih3aWZpY3RsaGRyODAyMykpOworCisJcGF5bG9hZExlbiA9IChzMTYgKikoYWktPnR4Zmlkc1swXS52aXJ0dWFsX2hvc3RfYWRkciArCisJCXNpemVvZih3aWZpY3RsaGRyODAyMykpOworCXNlbmRidWYgPSBhaS0+dHhmaWRzWzBdLnZpcnR1YWxfaG9zdF9hZGRyICsKKwkJc2l6ZW9mKHdpZmljdGxoZHI4MDIzKSArIDIgOworCisJLyoKKwkgKiBGaXJtd2FyZSBhdXRvbWF0aWNseSBwdXRzIDgwMiBoZWFkZXIgb24gc28KKwkgKiB3ZSBkb24ndCBuZWVkIHRvIGFjY291bnQgZm9yIGl0IGluIHRoZSBsZW5ndGgKKwkgKi8KKyNpZmRlZiBNSUNTVVBQT1JUCisJaWYgKHRlc3RfYml0KEZMQUdfTUlDX0NBUEFCTEUsICZhaS0+ZmxhZ3MpICYmIGFpLT5taWNzdGF0cy5lbmFibGVkICYmCisJCShudG9ocygoKHUxNiAqKWJ1ZmZlcilbNl0pICE9IDB4ODg4RSkpIHsKKwkJTUlDQnVmZmVyIHBNaWM7CisKKwkJaWYgKGVuY2Fwc3VsYXRlKGFpLCAoZXRoZXJIZWFkICopYnVmZmVyLCAmcE1pYywgbGVuIC0gc2l6ZW9mKGV0aGVySGVhZCkpICE9IFNVQ0NFU1MpCisJCQlyZXR1cm4gRVJST1I7CisKKwkJKnBheWxvYWRMZW4gPSBjcHVfdG9fbGUxNihsZW4tc2l6ZW9mKGV0aGVySGVhZCkrc2l6ZW9mKHBNaWMpKTsKKwkJYWktPnR4Zmlkc1swXS50eF9kZXNjLmxlbiArPSBzaXplb2YocE1pYyk7CisJCS8qIGNvcHkgZGF0YSBpbnRvIGFpcm8gZG1hIGJ1ZmZlciAqLworCQltZW1jcHkgKHNlbmRidWYsIGJ1ZmZlciwgc2l6ZW9mKGV0aGVySGVhZCkpOworCQlidWZmZXIgKz0gc2l6ZW9mKGV0aGVySGVhZCk7CisJCXNlbmRidWYgKz0gc2l6ZW9mKGV0aGVySGVhZCk7CisJCW1lbWNweSAoc2VuZGJ1ZiwgJnBNaWMsIHNpemVvZihwTWljKSk7CisJCXNlbmRidWYgKz0gc2l6ZW9mKHBNaWMpOworCQltZW1jcHkgKHNlbmRidWYsIGJ1ZmZlciwgbGVuIC0gc2l6ZW9mKGV0aGVySGVhZCkpOworCX0gZWxzZQorI2VuZGlmCisJeworCQkqcGF5bG9hZExlbiA9IGNwdV90b19sZTE2KGxlbiAtIHNpemVvZihldGhlckhlYWQpKTsKKworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCQkvKiBjb3B5IGRhdGEgaW50byBhaXJvIGRtYSBidWZmZXIgKi8KKwkJbWVtY3B5KHNlbmRidWYsIGJ1ZmZlciwgbGVuKTsKKwl9CisKKwltZW1jcHlfdG9pbyhhaS0+dHhmaWRzWzBdLmNhcmRfcmFtX29mZiwKKwkJJmFpLT50eGZpZHNbMF0udHhfZGVzYywgc2l6ZW9mKFR4RmlkKSk7CisKKwlPVVQ0NTAwKGFpLCBFVkFDSywgOCk7CisKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBnZXRfdHhfZXJyb3Ioc3RydWN0IGFpcm9faW5mbyAqYWksIHUzMiBmaWQpCit7CisJdTE2IHN0YXR1czsKKworCWlmIChmaWQgPCAwKQorCQlzdGF0dXMgPSAoKFdpZmlDdGxIZHIgKilhaS0+dHhmaWRzWzBdLnZpcnR1YWxfaG9zdF9hZGRyKS0+Y3RsaGRyLnN0YXR1czsKKwllbHNlIHsKKwkJaWYgKGJhcF9zZXR1cChhaSwgYWktPmZpZHNbZmlkXSAmIDB4ZmZmZiwgNCwgQkFQMCkgIT0gU1VDQ0VTUykKKwkJCXJldHVybjsKKwkJYmFwX3JlYWQoYWksICZzdGF0dXMsIDIsIEJBUDApOworCX0KKwlpZiAobGUxNl90b19jcHUoc3RhdHVzKSAmIDIpIC8qIFRvbyBtYW55IHJldHJpZXMgKi8KKwkJYWktPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJaWYgKGxlMTZfdG9fY3B1KHN0YXR1cykgJiA0KSAvKiBUcmFuc21pdCBsaWZldGltZSBleGNlZWRlZCAqLworCQlhaS0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycysrOworCWlmIChsZTE2X3RvX2NwdShzdGF0dXMpICYgOCkgLyogQWlkIGZhaWwgKi8KKwkJeyB9CisJaWYgKGxlMTZfdG9fY3B1KHN0YXR1cykgJiAweDEwKSAvKiBNQUMgZGlzYWJsZWQgKi8KKwkJYWktPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJaWYgKGxlMTZfdG9fY3B1KHN0YXR1cykgJiAweDIwKSAvKiBBc3NvY2lhdGlvbiBsb3N0ICovCisJCXsgfQorCS8qIFdlIHByb2R1Y2UgYSBUWERST1AgZXZlbnQgb25seSBmb3IgcmV0cnkgb3IgbGlmZXRpbWUKKwkgKiBleGNlZWRlZCwgYmVjYXVzZSB0aGF0J3MgdGhlIG9ubHkgc3RhdHVzIHRoYXQgcmVhbGx5IG1lYW4KKwkgKiB0aGF0IHRoaXMgcGFydGljdWxhciBub2RlIHdlbnQgYXdheS4KKwkgKiBPdGhlciBlcnJvcnMgbWVhbnMgdGhhdCAqd2UqIHNjcmV3ZWQgdXAuIC0gSmVhbiBJSSAqLworCWlmICgobGUxNl90b19jcHUoc3RhdHVzKSAmIDIpIHx8CisJICAgICAobGUxNl90b19jcHUoc3RhdHVzKSAmIDQpKSB7CisJCXVuaW9uIGl3cmVxX2RhdGEJd3JxdTsKKwkJY2hhciBqdW5rWzB4MThdOworCisJCS8qIEZhc3RlciB0byBza2lwIG92ZXIgdXNlbGVzcyBkYXRhIHRoYW4gdG8gZG8KKwkJICogYW5vdGhlciBiYXBfc2V0dXAoKS4gV2UgYXJlIGF0IG9mZnNldCAweDYgYW5kCisJCSAqIG5lZWQgdG8gZ28gdG8gMHgxOCBhbmQgcmVhZCA2IGJ5dGVzIC0gSmVhbiBJSSAqLworCQliYXBfcmVhZChhaSwgKHUxNiAqKSBqdW5rLCAweDE4LCBCQVAwKTsKKworCQkvKiBDb3B5IDgwMi4xMSBkZXN0IGFkZHJlc3MuCisJCSAqIFdlIHVzZSB0aGUgODAyLjExIGhlYWRlciBiZWNhdXNlIHRoZSBmcmFtZSBtYXkKKwkJICogbm90IGJlIDgwMi4zIG9yIG1heSBiZSBtYW5nbGVkLi4uCisJCSAqIEluIEFkLUhvYyBtb2RlLCBpdCB3aWxsIGJlIHRoZSBub2RlIGFkZHJlc3MuCisJCSAqIEluIG1hbmFnZWQgbW9kZSwgaXQgd2lsbCBiZSBtb3N0IGxpa2VseSB0aGUgQVAgYWRkcgorCQkgKiBVc2VyIHNwYWNlIHdpbGwgZmlndXJlIG91dCBob3cgdG8gY29udmVydCBpdCB0bworCQkgKiB3aGF0ZXZlciBpdCBuZWVkcyAoSVAgYWRkcmVzcyBvciBlbHNlKS4KKwkJICogLSBKZWFuIElJICovCisJCW1lbWNweSh3cnF1LmFkZHIuc2FfZGF0YSwganVuayArIDB4MTIsIEVUSF9BTEVOKTsKKwkJd3JxdS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKworCQkvKiBTZW5kIGV2ZW50IHRvIHVzZXIgc3BhY2UgKi8KKwkJd2lyZWxlc3Nfc2VuZF9ldmVudChhaS0+ZGV2LCBJV0VWVFhEUk9QLCAmd3JxdSwgTlVMTCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhaXJvX2VuZF94bWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwl1MTYgc3RhdHVzOworCWludCBpOworCXN0cnVjdCBhaXJvX2luZm8gKnByaXYgPSBkZXYtPnByaXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByaXYtPnhtaXQuc2tiOworCWludCBmaWQgPSBwcml2LT54bWl0LmZpZDsKKwl1MzIgKmZpZHMgPSBwcml2LT5maWRzOworCisJY2xlYXJfYml0KEpPQl9YTUlULCAmcHJpdi0+ZmxhZ3MpOworCWNsZWFyX2JpdChGTEFHX1BFTkRJTkdfWE1JVCwgJnByaXYtPmZsYWdzKTsKKwlzdGF0dXMgPSB0cmFuc21pdF84MDJfM19wYWNrZXQgKHByaXYsIGZpZHNbZmlkXSwgc2tiLT5kYXRhKTsKKwl1cCgmcHJpdi0+c2VtKTsKKworCWkgPSAwOworCWlmICggc3RhdHVzID09IFNVQ0NFU1MgKSB7CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlmb3IgKDsgaSA8IE1BWF9GSURTIC8gMiAmJiAocHJpdi0+Zmlkc1tpXSAmIDB4ZmZmZjAwMDApOyBpKyspOworCX0gZWxzZSB7CisJCXByaXYtPmZpZHNbZmlkXSAmPSAweGZmZmY7CisJCXByaXYtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwl9CisJaWYgKGkgPCBNQVhfRklEUyAvIDIpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisKK3N0YXRpYyBpbnQgYWlyb19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzMTYgbGVuOworCWludCBpLCBqOworCXN0cnVjdCBhaXJvX2luZm8gKnByaXYgPSBkZXYtPnByaXY7CisJdTMyICpmaWRzID0gcHJpdi0+ZmlkczsKKworCWlmICggc2tiID09IE5VTEwgKSB7CisJCXByaW50ayggS0VSTl9FUlIgImFpcm86ICBza2IgPT0gTlVMTCEhIVxuIiApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBGaW5kIGEgdmFjYW50IEZJRCAqLworCWZvciggaSA9IDA7IGkgPCBNQVhfRklEUyAvIDIgJiYgKGZpZHNbaV0gJiAweGZmZmYwMDAwKTsgaSsrICk7CisJZm9yKCBqID0gaSArIDE7IGogPCBNQVhfRklEUyAvIDIgJiYgKGZpZHNbal0gJiAweGZmZmYwMDAwKTsgaisrICk7CisKKwlpZiAoIGogPj0gTUFYX0ZJRFMgLyAyICkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkJaWYgKGkgPT0gTUFYX0ZJRFMgLyAyKSB7CisJCQlwcml2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJLyogY2hlY2sgbWluIGxlbmd0aCovCisJbGVuID0gRVRIX1pMRU4gPCBza2ItPmxlbiA/IHNrYi0+bGVuIDogRVRIX1pMRU47CisgICAgICAgIC8qIE1hcmsgZmlkIGFzIHVzZWQgJiBzYXZlIGxlbmd0aCBmb3IgbGF0ZXIgKi8KKwlmaWRzW2ldIHw9IChsZW4gPDwgMTYpOworCXByaXYtPnhtaXQuc2tiID0gc2tiOworCXByaXYtPnhtaXQuZmlkID0gaTsKKwlpZiAoZG93bl90cnlsb2NrKCZwcml2LT5zZW0pICE9IDApIHsKKwkJc2V0X2JpdChGTEFHX1BFTkRJTkdfWE1JVCwgJnByaXYtPmZsYWdzKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlzZXRfYml0KEpPQl9YTUlULCAmcHJpdi0+ZmxhZ3MpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPnRocl93YWl0KTsKKwl9IGVsc2UKKwkJYWlyb19lbmRfeG1pdChkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhaXJvX2VuZF94bWl0MTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXUxNiBzdGF0dXM7CisJaW50IGk7CisJc3RydWN0IGFpcm9faW5mbyAqcHJpdiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJpdi0+eG1pdDExLnNrYjsKKwlpbnQgZmlkID0gcHJpdi0+eG1pdDExLmZpZDsKKwl1MzIgKmZpZHMgPSBwcml2LT5maWRzOworCisJY2xlYXJfYml0KEpPQl9YTUlUMTEsICZwcml2LT5mbGFncyk7CisJY2xlYXJfYml0KEZMQUdfUEVORElOR19YTUlUMTEsICZwcml2LT5mbGFncyk7CisJc3RhdHVzID0gdHJhbnNtaXRfODAyXzExX3BhY2tldCAocHJpdiwgZmlkc1tmaWRdLCBza2ItPmRhdGEpOworCXVwKCZwcml2LT5zZW0pOworCisJaSA9IE1BWF9GSURTIC8gMjsKKwlpZiAoIHN0YXR1cyA9PSBTVUNDRVNTICkgeworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJZm9yICg7IGkgPCBNQVhfRklEUyAmJiAocHJpdi0+Zmlkc1tpXSAmIDB4ZmZmZjAwMDApOyBpKyspOworCX0gZWxzZSB7CisJCXByaXYtPmZpZHNbZmlkXSAmPSAweGZmZmY7CisJCXByaXYtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwl9CisJaWYgKGkgPCBNQVhfRklEUykKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCWRldl9rZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIGludCBhaXJvX3N0YXJ0X3htaXQxMShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJczE2IGxlbjsKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgYWlyb19pbmZvICpwcml2ID0gZGV2LT5wcml2OworCXUzMiAqZmlkcyA9IHByaXYtPmZpZHM7CisKKwlpZiAodGVzdF9iaXQoRkxBR19NUEksICZwcml2LT5mbGFncykpIHsKKwkJLyogTm90IGltcGxlbWVudGVkIHlldCBmb3IgTVBJMzUwICovCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CisKKwlpZiAoIHNrYiA9PSBOVUxMICkgeworCQlwcmludGsoIEtFUk5fRVJSICJhaXJvOiAgc2tiID09IE5VTEwhISFcbiIgKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogRmluZCBhIHZhY2FudCBGSUQgKi8KKwlmb3IoIGkgPSBNQVhfRklEUyAvIDI7IGkgPCBNQVhfRklEUyAmJiAoZmlkc1tpXSAmIDB4ZmZmZjAwMDApOyBpKysgKTsKKwlmb3IoIGogPSBpICsgMTsgaiA8IE1BWF9GSURTICYmIChmaWRzW2pdICYgMHhmZmZmMDAwMCk7IGorKyApOworCisJaWYgKCBqID49IE1BWF9GSURTICkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkJaWYgKGkgPT0gTUFYX0ZJRFMpIHsKKwkJCXByaXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwkvKiBjaGVjayBtaW4gbGVuZ3RoKi8KKwlsZW4gPSBFVEhfWkxFTiA8IHNrYi0+bGVuID8gc2tiLT5sZW4gOiBFVEhfWkxFTjsKKyAgICAgICAgLyogTWFyayBmaWQgYXMgdXNlZCAmIHNhdmUgbGVuZ3RoIGZvciBsYXRlciAqLworCWZpZHNbaV0gfD0gKGxlbiA8PCAxNik7CisJcHJpdi0+eG1pdDExLnNrYiA9IHNrYjsKKwlwcml2LT54bWl0MTEuZmlkID0gaTsKKwlpZiAoZG93bl90cnlsb2NrKCZwcml2LT5zZW0pICE9IDApIHsKKwkJc2V0X2JpdChGTEFHX1BFTkRJTkdfWE1JVDExLCAmcHJpdi0+ZmxhZ3MpOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXNldF9iaXQoSk9CX1hNSVQxMSwgJnByaXYtPmZsYWdzKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT50aHJfd2FpdCk7CisJfSBlbHNlCisJCWFpcm9fZW5kX3htaXQxMShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhaXJvX3JlYWRfc3RhdHMoc3RydWN0IGFpcm9faW5mbyAqYWkpIHsKKwlTdGF0c1JpZCBzdGF0c19yaWQ7CisJdTMyICp2YWxzID0gc3RhdHNfcmlkLnZhbHM7CisKKwljbGVhcl9iaXQoSk9CX1NUQVRTLCAmYWktPmZsYWdzKTsKKwlpZiAoYWktPnBvd2VyKSB7CisJCXVwKCZhaS0+c2VtKTsKKwkJcmV0dXJuOworCX0KKwlyZWFkU3RhdHNSaWQoYWksICZzdGF0c19yaWQsIFJJRF9TVEFUUywgMCk7CisJdXAoJmFpLT5zZW0pOworCisJYWktPnN0YXRzLnJ4X3BhY2tldHMgPSB2YWxzWzQzXSArIHZhbHNbNDRdICsgdmFsc1s0NV07CisJYWktPnN0YXRzLnR4X3BhY2tldHMgPSB2YWxzWzM5XSArIHZhbHNbNDBdICsgdmFsc1s0MV07CisJYWktPnN0YXRzLnJ4X2J5dGVzID0gdmFsc1s5Ml07CisJYWktPnN0YXRzLnR4X2J5dGVzID0gdmFsc1s5MV07CisJYWktPnN0YXRzLnJ4X2Vycm9ycyA9IHZhbHNbMF0gKyB2YWxzWzJdICsgdmFsc1szXSArIHZhbHNbNF07CisJYWktPnN0YXRzLnR4X2Vycm9ycyA9IHZhbHNbNDJdICsgYWktPnN0YXRzLnR4X2ZpZm9fZXJyb3JzOworCWFpLT5zdGF0cy5tdWx0aWNhc3QgPSB2YWxzWzQzXTsKKwlhaS0+c3RhdHMuY29sbGlzaW9ucyA9IHZhbHNbODldOworCisJLyogZGV0YWlsZWQgcnhfZXJyb3JzOiAqLworCWFpLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gdmFsc1szXTsKKwlhaS0+c3RhdHMucnhfY3JjX2Vycm9ycyA9IHZhbHNbNF07CisJYWktPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IHZhbHNbMl07CisJYWktPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzID0gdmFsc1swXTsKK30KKworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmFpcm9fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSAgZGV2LT5wcml2OworCisJaWYgKCF0ZXN0X2JpdChKT0JfU1RBVFMsICZsb2NhbC0+ZmxhZ3MpKSB7CisJCS8qIEdldCBzdGF0cyBvdXQgb2YgdGhlIGNhcmQgaWYgYXZhaWxhYmxlICovCisJCWlmIChkb3duX3RyeWxvY2soJmxvY2FsLT5zZW0pICE9IDApIHsKKwkJCXNldF9iaXQoSk9CX1NUQVRTLCAmbG9jYWwtPmZsYWdzKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbG9jYWwtPnRocl93YWl0KTsKKwkJfSBlbHNlCisJCQlhaXJvX3JlYWRfc3RhdHMobG9jYWwpOworCX0KKworCXJldHVybiAmbG9jYWwtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCBhaXJvX3NldF9wcm9taXNjKHN0cnVjdCBhaXJvX2luZm8gKmFpKSB7CisJQ21kIGNtZDsKKwlSZXNwIHJzcDsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLmNtZD1DTURfU0VUTU9ERTsKKwljbGVhcl9iaXQoSk9CX1BST01JU0MsICZhaS0+ZmxhZ3MpOworCWNtZC5wYXJtMD0oYWktPmZsYWdzJklGRl9QUk9NSVNDKSA/IFBST01JU0MgOiBOT1BST01JU0M7CisJaXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKTsKKwl1cCgmYWktPnNlbSk7Cit9CisKK3N0YXRpYyB2b2lkIGFpcm9fc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKworCWlmICgoZGV2LT5mbGFncyBeIGFpLT5mbGFncykgJiBJRkZfUFJPTUlTQykgeworCQljaGFuZ2VfYml0KEZMQUdfUFJPTUlTQywgJmFpLT5mbGFncyk7CisJCWlmIChkb3duX3RyeWxvY2soJmFpLT5zZW0pICE9IDApIHsKKwkJCXNldF9iaXQoSk9CX1BST01JU0MsICZhaS0+ZmxhZ3MpOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhaS0+dGhyX3dhaXQpOworCQl9IGVsc2UKKwkJCWFpcm9fc2V0X3Byb21pc2MoYWkpOworCX0KKworCWlmICgoZGV2LT5mbGFncyZJRkZfQUxMTVVMVEkpfHxkZXYtPm1jX2NvdW50PjApIHsKKwkJLyogVHVybiBvbiBtdWx0aWNhc3QuICAoU2hvdWxkIGJlIGFscmVhZHkgc2V0dXAuLi4pICovCisJfQorfQorCitzdGF0aWMgaW50IGFpcm9fc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCit7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKKwlSZXNwIHJzcDsKKworCXJlYWRDb25maWdSaWQoYWksIDEpOworCW1lbWNweSAoYWktPmNvbmZpZy5tYWNBZGRyLCBhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKKwlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJZGlzYWJsZV9NQUMoYWksIDEpOworCXdyaXRlQ29uZmlnUmlkIChhaSwgMSk7CisJZW5hYmxlX01BQyhhaSwgJnJzcCwgMSk7CisJbWVtY3B5IChhaS0+ZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisJaWYgKGFpLT53aWZpZGV2KQorCQltZW1jcHkgKGFpLT53aWZpZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWlyb19jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCWlmICgobmV3X210dSA8IDY4KSB8fCAobmV3X210dSA+IDI0MDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZXYtPm10dSA9IG5ld19tdHU7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBhaXJvX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmIChhaS0+d2lmaWRldiAhPSBkZXYpIHsKKyNpZmRlZiBQT1dFUl9PTl9ET1dOCisJCS8qIFNodXQgcG93ZXIgdG8gdGhlIGNhcmQuIFRoZSBpZGVhIGlzIHRoYXQgdGhlIHVzZXIgY2FuIHNhdmUKKwkJICogcG93ZXIgd2hlbiBoZSBkb2Vzbid0IG5lZWQgdGhlIGNhcmQgd2l0aCAiaWZjb25maWcgZG93biIuCisJCSAqIFRoYXQncyB0aGUgbWV0aG9kIHRoYXQgaXMgbW9zdCBmcmllbmRseSB0b3dhcmRzIHRoZSBuZXR3b3JrCisJCSAqIHN0YWNrIChpLmUuIHRoZSBuZXR3b3JrIHN0YWNrIHdvbid0IHRyeSB0byBicm9hZGNhc3QKKwkJICogYW55dGhpbmcgb24gdGhlIGludGVyZmFjZSBhbmQgcm91dGVzIGFyZSBnb25lLiBKZWFuIElJICovCisJCXNldF9iaXQoRkxBR19SQURJT19ET1dOLCAmYWktPmZsYWdzKTsKKwkJZGlzYWJsZV9NQUMoYWksIDEpOworI2VuZGlmCisJCWRpc2FibGVfaW50ZXJydXB0cyggYWkgKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlbF9haXJvX2Rldiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCit2b2lkIHN0b3BfYWlyb19jYXJkKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZnJlZXJlcyApCit7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisKKwlzZXRfYml0KEZMQUdfUkFESU9fRE9XTiwgJmFpLT5mbGFncyk7CisJZGlzYWJsZV9NQUMoYWksIDEpOworCWRpc2FibGVfaW50ZXJydXB0cyhhaSk7CisJZnJlZV9pcnEoIGRldi0+aXJxLCBkZXYgKTsKKwl0YWtlZG93bl9wcm9jX2VudHJ5KCBkZXYsIGFpICk7CisJaWYgKHRlc3RfYml0KEZMQUdfUkVHSVNURVJFRCwgJmFpLT5mbGFncykpIHsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoIGRldiApOworCQlpZiAoYWktPndpZmlkZXYpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGFpLT53aWZpZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGFpLT53aWZpZGV2KTsKKwkJCWFpLT53aWZpZGV2ID0gTlVMTDsKKwkJfQorCQljbGVhcl9iaXQoRkxBR19SRUdJU1RFUkVELCAmYWktPmZsYWdzKTsKKwl9CisJc2V0X2JpdChKT0JfRElFLCAmYWktPmZsYWdzKTsKKwlraWxsX3Byb2MoYWktPnRocl9waWQsIFNJR1RFUk0sIDEpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFpLT50aHJfZXhpdGVkKTsKKworCS8qCisJICogQ2xlYW4gb3V0IHR4IHF1ZXVlCisJICovCisJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCAmYWktPmZsYWdzKSAmJiBza2JfcXVldWVfbGVuICgmYWktPnR4cSkgPiAwKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCQlmb3IgKDsoc2tiID0gc2tiX2RlcXVldWUoJmFpLT50eHEpKTspCisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfQorCisJaWYgKGFpLT5mbGFzaCkKKwkJa2ZyZWUoYWktPmZsYXNoKTsKKwlpZiAoYWktPnJzc2kpCisJCWtmcmVlKGFpLT5yc3NpKTsKKwlpZiAoYWktPkFQTGlzdCkKKwkJa2ZyZWUoYWktPkFQTGlzdCk7CisJaWYgKGFpLT5TU0lEKQorCQlrZnJlZShhaS0+U1NJRCk7CisJaWYgKGZyZWVyZXMpIHsKKwkJLyogUENNQ0lBIGZyZWVzIHRoaXMgc3R1ZmYsIHNvIG9ubHkgZm9yIFBDSSBhbmQgSVNBICovCisJICAgICAgICByZWxlYXNlX3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIDY0ICk7CisJCWlmICh0ZXN0X2JpdChGTEFHX01QSSwgJmFpLT5mbGFncykpIHsKKwkJCWlmIChhaS0+cGNpKQorCQkJCW1waV91bm1hcF9jYXJkKGFpLT5wY2kpOworCQkJaWYgKGFpLT5wY2ltZW0pCisJCQkJaW91bm1hcChhaS0+cGNpbWVtKTsKKwkJCWlmIChhaS0+cGNpYXV4KQorCQkJCWlvdW5tYXAoYWktPnBjaWF1eCk7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFpLT5wY2ksIFBDSV9TSEFSRURfTEVOLAorCQkJCWFpLT5zaGFyZWQsIGFpLT5zaGFyZWRfZG1hKTsKKwkJfQorICAgICAgICB9CisjaWZkZWYgTUlDU1VQUE9SVAorCWlmIChhaS0+dGZtKQorCQljcnlwdG9fZnJlZV90Zm0oYWktPnRmbSk7CisjZW5kaWYKKwlkZWxfYWlyb19kZXYoIGRldiApOworCWZyZWVfbmV0ZGV2KCBkZXYgKTsKK30KKworRVhQT1JUX1NZTUJPTChzdG9wX2Fpcm9fY2FyZCk7CisKK3N0YXRpYyBpbnQgYWRkX2Fpcm9fZGV2KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK2ludCB3bGxfaGVhZGVyX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGNoYXIgKmhhZGRyKQoreworCW1lbWNweShoYWRkciwgc2tiLT5tYWMucmF3ICsgMTAsIEVUSF9BTEVOKTsKKwlyZXR1cm4gRVRIX0FMRU47Cit9CisKK3N0YXRpYyB2b2lkIG1waV91bm1hcF9jYXJkKHN0cnVjdCBwY2lfZGV2ICpwY2kpCit7CisJdW5zaWduZWQgbG9uZyBtZW1fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAxKTsKKwl1bnNpZ25lZCBsb25nIG1lbV9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBjaSwgMSk7CisJdW5zaWduZWQgbG9uZyBhdXhfc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAyKTsKKwl1bnNpZ25lZCBsb25nIGF1eF9sZW4gPSBBVVhNRU1TSVpFOworCisJcmVsZWFzZV9tZW1fcmVnaW9uKGF1eF9zdGFydCwgYXV4X2xlbik7CisJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbV9zdGFydCwgbWVtX2xlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCBkZXNjcmlwdG9ycyBoYXZlIGJlZW4gc2V0dXAgLgorICogIFJ1biBhdCBpbnNtb2QgdGltZSBvciBhZnRlciByZXNldCAgd2hlbiB0aGUgZGVjcmlwdG9ycworICogIGhhdmUgYmVlbiBpbml0aWFsaXplZCAuIFJldHVybnMgMCBpZiBhbGwgaXMgd2VsbCBuegorICogIG90aGVyd2lzZSAuIERvZXMgbm90IGFsbG9jYXRlIG1lbW9yeSBidXQgc2V0cyB1cCBjYXJkCisgKiAgdXNpbmcgcHJldmlvdXNseSBhbGxvY2F0ZWQgZGVzY3JpcHRvcnMuCisgKi8KK3N0YXRpYyBpbnQgbXBpX2luaXRfZGVzY3JpcHRvcnMgKHN0cnVjdCBhaXJvX2luZm8gKmFpKQoreworCUNtZCBjbWQ7CisJUmVzcCByc3A7CisJaW50IGk7CisJaW50IHJjID0gU1VDQ0VTUzsKKworCS8qIEFsbG9jICBjYXJkIFJYIGRlc2NyaXB0b3JzICovCisJbmV0aWZfc3RvcF9xdWV1ZShhaS0+ZGV2KTsKKworCW1lbXNldCgmcnNwLDAsc2l6ZW9mKHJzcCkpOworCW1lbXNldCgmY21kLDAsc2l6ZW9mKGNtZCkpOworCisJY21kLmNtZCA9IENNRF9BTExPQ0FURUFVWDsKKwljbWQucGFybTAgPSBGSURfUlg7CisJY21kLnBhcm0xID0gKGFpLT5yeGZpZHNbMF0uY2FyZF9yYW1fb2ZmIC0gYWktPnBjaWF1eCk7CisJY21kLnBhcm0yID0gTVBJX01BWF9GSURTOworCXJjPWlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCk7CisJaWYgKHJjICE9IFNVQ0NFU1MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiAgQ291bGRuJ3QgYWxsb2NhdGUgUlggRklEXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWZvciAoaT0wOyBpPE1QSV9NQVhfRklEUzsgaSsrKSB7CisJCW1lbWNweV90b2lvKGFpLT5yeGZpZHNbaV0uY2FyZF9yYW1fb2ZmLAorCQkJJmFpLT5yeGZpZHNbaV0ucnhfZGVzYywgc2l6ZW9mKFJ4RmlkKSk7CisJfQorCisJLyogQWxsb2MgY2FyZCBUWCBkZXNjcmlwdG9ycyAqLworCisJbWVtc2V0KCZyc3AsMCxzaXplb2YocnNwKSk7CisJbWVtc2V0KCZjbWQsMCxzaXplb2YoY21kKSk7CisKKwljbWQuY21kID0gQ01EX0FMTE9DQVRFQVVYOworCWNtZC5wYXJtMCA9IEZJRF9UWDsKKwljbWQucGFybTEgPSAoYWktPnR4Zmlkc1swXS5jYXJkX3JhbV9vZmYgLSBhaS0+cGNpYXV4KTsKKwljbWQucGFybTIgPSBNUElfTUFYX0ZJRFM7CisKKwlmb3IgKGk9MDsgaTxNUElfTUFYX0ZJRFM7IGkrKykgeworCQlhaS0+dHhmaWRzW2ldLnR4X2Rlc2MudmFsaWQgPSAxOworCQltZW1jcHlfdG9pbyhhaS0+dHhmaWRzW2ldLmNhcmRfcmFtX29mZiwKKwkJCSZhaS0+dHhmaWRzW2ldLnR4X2Rlc2MsIHNpemVvZihUeEZpZCkpOworCX0KKwlhaS0+dHhmaWRzW2ktMV0udHhfZGVzYy5lb2MgPSAxOyAvKiBMYXN0IGRlc2NyaXB0b3IgaGFzIEVPQyBzZXQgKi8KKworCXJjPWlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCk7CisJaWYgKHJjICE9IFNVQ0NFU1MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiAgQ291bGRuJ3QgYWxsb2NhdGUgVFggRklEXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIEFsbG9jIGNhcmQgUmlkIGRlc2NyaXB0b3IgKi8KKwltZW1zZXQoJnJzcCwwLHNpemVvZihyc3ApKTsKKwltZW1zZXQoJmNtZCwwLHNpemVvZihjbWQpKTsKKworCWNtZC5jbWQgPSBDTURfQUxMT0NBVEVBVVg7CisJY21kLnBhcm0wID0gUklEX1JXOworCWNtZC5wYXJtMSA9IChhaS0+Y29uZmlnX2Rlc2MuY2FyZF9yYW1fb2ZmIC0gYWktPnBjaWF1eCk7CisJY21kLnBhcm0yID0gMTsgLyogTWFnaWMgbnVtYmVyLi4uICovCisJcmM9aXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKTsKKwlpZiAocmMgIT0gU1VDQ0VTUykgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm86ICBDb3VsZG4ndCBhbGxvY2F0ZSBSSURcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJbWVtY3B5X3RvaW8oYWktPmNvbmZpZ19kZXNjLmNhcmRfcmFtX29mZiwKKwkJJmFpLT5jb25maWdfZGVzYy5yaWRfZGVzYywgc2l6ZW9mKFJpZCkpOworCisJcmV0dXJuIHJjOworfQorCisvKgorICogV2UgYXJlIHNldHRpbmcgdXAgdGhyZWUgdGhpbmdzIGhlcmU6CisgKiAxKSBNYXAgQVVYIG1lbW9yeSBmb3IgZGVzY3JpcHRvcnM6IFJpZCwgVHhGaWQsIG9yIFJ4RmlkLgorICogMikgTWFwIFBDSSBtZW1vcnkgZm9yIGlzc3VlaW5nIGNvbW1hbmRzLgorICogMykgQWxsb2NhdGUgbWVtb3J5IChzaGFyZWQpIHRvIHNlbmQgYW5kIHJlY2VpdmUgZXRoZXJuZXQgZnJhbWVzLgorICovCitzdGF0aWMgaW50IG1waV9tYXBfY2FyZChzdHJ1Y3QgYWlyb19pbmZvICphaSwgc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgbG9uZyBtZW1fc3RhcnQsIG1lbV9sZW4sIGF1eF9zdGFydCwgYXV4X2xlbjsKKwlpbnQgcmMgPSAtMTsKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyICpidXNhZGRyb2ZmLCp2cGFja29mZjsKKwl1bnNpZ25lZCBjaGFyIF9faW9tZW0gKnBjaWFkZHJvZmY7CisKKwltZW1fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAxKTsKKwltZW1fbGVuID0gcGNpX3Jlc291cmNlX2xlbihwY2ksIDEpOworCWF1eF9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDIpOworCWF1eF9sZW4gPSBBVVhNRU1TSVpFOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24obWVtX3N0YXJ0LCBtZW1fbGVuLCBuYW1lKSkgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm86IENvdWxkbid0IGdldCByZWdpb24gJXhbJXhdIGZvciAlc1xuIiwKKwkJICAgICAgIChpbnQpbWVtX3N0YXJ0LCAoaW50KW1lbV9sZW4sIG5hbWUpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oYXV4X3N0YXJ0LCBhdXhfbGVuLCBuYW1lKSkgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm86IENvdWxkbid0IGdldCByZWdpb24gJXhbJXhdIGZvciAlc1xuIiwKKwkJICAgICAgIChpbnQpYXV4X3N0YXJ0LCAoaW50KWF1eF9sZW4sIG5hbWUpOworCQlnb3RvIGZyZWVfcmVnaW9uMTsKKwl9CisKKwlhaS0+cGNpbWVtID0gaW9yZW1hcChtZW1fc3RhcnQsIG1lbV9sZW4pOworCWlmICghYWktPnBjaW1lbSkgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm86IENvdWxkbid0IG1hcCByZWdpb24gJXhbJXhdIGZvciAlc1xuIiwKKwkJICAgICAgIChpbnQpbWVtX3N0YXJ0LCAoaW50KW1lbV9sZW4sIG5hbWUpOworCQlnb3RvIGZyZWVfcmVnaW9uMjsKKwl9CisJYWktPnBjaWF1eCA9IGlvcmVtYXAoYXV4X3N0YXJ0LCBhdXhfbGVuKTsKKwlpZiAoIWFpLT5wY2lhdXgpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiBDb3VsZG4ndCBtYXAgcmVnaW9uICV4WyV4XSBmb3IgJXNcbiIsCisJCSAgICAgICAoaW50KWF1eF9zdGFydCwgKGludClhdXhfbGVuLCBuYW1lKTsKKwkJZ290byBmcmVlX21lbW1hcDsKKwl9CisKKwkvKiBSZXNlcnZlIFBLVFNJWkUgZm9yIGVhY2ggZmlkIGFuZCAySyBmb3IgdGhlIFJpZHMgKi8KKwlhaS0+c2hhcmVkID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpLCBQQ0lfU0hBUkVEX0xFTiwgJmFpLT5zaGFyZWRfZG1hKTsKKwlpZiAoIWFpLT5zaGFyZWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiBDb3VsZG4ndCBhbGxvY19jb25zaXN0ZW50ICVkXG4iLAorCQkgICAgICAgUENJX1NIQVJFRF9MRU4pOworCQlnb3RvIGZyZWVfYXV4bWFwOworCX0KKworCS8qCisJICogU2V0dXAgZGVzY3JpcHRvciBSWCwgVFgsIENPTkZJRworCSAqLworCWJ1c2FkZHJvZmYgPSAodW5zaWduZWQgY2hhciAqKWFpLT5zaGFyZWRfZG1hOworCXBjaWFkZHJvZmYgPSBhaS0+cGNpYXV4ICsgQVVYX09GRlNFVDsKKwl2cGFja29mZiAgID0gYWktPnNoYXJlZDsKKworCS8qIFJYIGRlc2NyaXB0b3Igc2V0dXAgKi8KKwlmb3IoaSA9IDA7IGkgPCBNUElfTUFYX0ZJRFM7IGkrKykgeworCQlhaS0+cnhmaWRzW2ldLnBlbmRpbmcgPSAwOworCQlhaS0+cnhmaWRzW2ldLmNhcmRfcmFtX29mZiA9IHBjaWFkZHJvZmY7CisJCWFpLT5yeGZpZHNbaV0udmlydHVhbF9ob3N0X2FkZHIgPSB2cGFja29mZjsKKwkJYWktPnJ4Zmlkc1tpXS5yeF9kZXNjLmhvc3RfYWRkciA9IChkbWFfYWRkcl90KSBidXNhZGRyb2ZmOworCQlhaS0+cnhmaWRzW2ldLnJ4X2Rlc2MudmFsaWQgPSAxOworCQlhaS0+cnhmaWRzW2ldLnJ4X2Rlc2MubGVuID0gUEtUU0laRTsKKwkJYWktPnJ4Zmlkc1tpXS5yeF9kZXNjLnJkeSA9IDA7CisKKwkJcGNpYWRkcm9mZiArPSBzaXplb2YoUnhGaWQpOworCQlidXNhZGRyb2ZmICs9IFBLVFNJWkU7CisJCXZwYWNrb2ZmICAgKz0gUEtUU0laRTsKKwl9CisKKwkvKiBUWCBkZXNjcmlwdG9yIHNldHVwICovCisJZm9yKGkgPSAwOyBpIDwgTVBJX01BWF9GSURTOyBpKyspIHsKKwkJYWktPnR4Zmlkc1tpXS5jYXJkX3JhbV9vZmYgPSBwY2lhZGRyb2ZmOworCQlhaS0+dHhmaWRzW2ldLnZpcnR1YWxfaG9zdF9hZGRyID0gdnBhY2tvZmY7CisJCWFpLT50eGZpZHNbaV0udHhfZGVzYy52YWxpZCA9IDE7CisJCWFpLT50eGZpZHNbaV0udHhfZGVzYy5ob3N0X2FkZHIgPSAoZG1hX2FkZHJfdCkgYnVzYWRkcm9mZjsKKwkJbWVtY3B5KGFpLT50eGZpZHNbaV0udmlydHVhbF9ob3N0X2FkZHIsCisJCQkmd2lmaWN0bGhkcjgwMjMsIHNpemVvZih3aWZpY3RsaGRyODAyMykpOworCisJCXBjaWFkZHJvZmYgKz0gc2l6ZW9mKFR4RmlkKTsKKwkJYnVzYWRkcm9mZiArPSBQS1RTSVpFOworCQl2cGFja29mZiAgICs9IFBLVFNJWkU7CisJfQorCWFpLT50eGZpZHNbaS0xXS50eF9kZXNjLmVvYyA9IDE7IC8qIExhc3QgZGVzY3JpcHRvciBoYXMgRU9DIHNldCAqLworCisJLyogUmlkIGRlc2NyaXB0b3Igc2V0dXAgKi8KKwlhaS0+Y29uZmlnX2Rlc2MuY2FyZF9yYW1fb2ZmID0gcGNpYWRkcm9mZjsKKwlhaS0+Y29uZmlnX2Rlc2MudmlydHVhbF9ob3N0X2FkZHIgPSB2cGFja29mZjsKKwlhaS0+Y29uZmlnX2Rlc2MucmlkX2Rlc2MuaG9zdF9hZGRyID0gKGRtYV9hZGRyX3QpIGJ1c2FkZHJvZmY7CisJYWktPnJpZGJ1cyA9IChkbWFfYWRkcl90KWJ1c2FkZHJvZmY7CisJYWktPmNvbmZpZ19kZXNjLnJpZF9kZXNjLnJpZCA9IDA7CisJYWktPmNvbmZpZ19kZXNjLnJpZF9kZXNjLmxlbiA9IFJJRFNJWkU7CisJYWktPmNvbmZpZ19kZXNjLnJpZF9kZXNjLnZhbGlkID0gMTsKKwlwY2lhZGRyb2ZmICs9IHNpemVvZihSaWQpOworCWJ1c2FkZHJvZmYgKz0gUklEU0laRTsKKwl2cGFja29mZiAgICs9IFJJRFNJWkU7CisKKwkvKiBUZWxsIGNhcmQgYWJvdXQgZGVzY3JpcHRvcnMgKi8KKwlpZiAobXBpX2luaXRfZGVzY3JpcHRvcnMgKGFpKSAhPSBTVUNDRVNTKQorCQlnb3RvIGZyZWVfc2hhcmVkOworCisJcmV0dXJuIDA7CisgZnJlZV9zaGFyZWQ6CisJcGNpX2ZyZWVfY29uc2lzdGVudChwY2ksIFBDSV9TSEFSRURfTEVOLCBhaS0+c2hhcmVkLCBhaS0+c2hhcmVkX2RtYSk7CisgZnJlZV9hdXhtYXA6CisJaW91bm1hcChhaS0+cGNpYXV4KTsKKyBmcmVlX21lbW1hcDoKKwlpb3VubWFwKGFpLT5wY2ltZW0pOworIGZyZWVfcmVnaW9uMjoKKwlyZWxlYXNlX21lbV9yZWdpb24oYXV4X3N0YXJ0LCBhdXhfbGVuKTsKKyBmcmVlX3JlZ2lvbjE6CisJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbV9zdGFydCwgbWVtX2xlbik7Cisgb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgd2lmaV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRldi0+aGFyZF9oZWFkZXIgICAgICAgID0gTlVMTDsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyICAgICA9IE5VTEw7CisJZGV2LT5oYXJkX2hlYWRlcl9jYWNoZSAgPSBOVUxMOworCWRldi0+aGVhZGVyX2NhY2hlX3VwZGF0ZT0gTlVMTDsKKworCWRldi0+aGFyZF9oZWFkZXJfcGFyc2UgID0gd2xsX2hlYWRlcl9wYXJzZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZhaXJvX3N0YXJ0X3htaXQxMTsKKwlkZXYtPmdldF9zdGF0cyA9ICZhaXJvX2dldF9zdGF0czsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9ICZhaXJvX3NldF9tYWNfYWRkcmVzczsKKwlkZXYtPmRvX2lvY3RsID0gJmFpcm9faW9jdGw7CisjaWZkZWYgV0lSRUxFU1NfRVhUCisJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZhaXJvX2hhbmRsZXJfZGVmOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCAqLworCWRldi0+Y2hhbmdlX210dSA9ICZhaXJvX2NoYW5nZV9tdHU7CisJZGV2LT5vcGVuID0gJmFpcm9fb3BlbjsKKwlkZXYtPnN0b3AgPSAmYWlyb19jbG9zZTsKKworCWRldi0+dHlwZSAgICAgICAgICAgICAgID0gQVJQSFJEX0lFRUU4MDIxMTsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiAgICA9IEVUSF9ITEVOOworCWRldi0+bXR1ICAgICAgICAgICAgICAgID0gMjMxMjsKKwlkZXYtPmFkZHJfbGVuICAgICAgICAgICA9IEVUSF9BTEVOOworCWRldi0+dHhfcXVldWVfbGVuICAgICAgID0gMTAwOyAKKworCW1lbXNldChkZXYtPmJyb2FkY2FzdCwweEZGLCBFVEhfQUxFTik7CisKKwlkZXYtPmZsYWdzICAgICAgICAgICAgICA9IElGRl9CUk9BRENBU1R8SUZGX01VTFRJQ0FTVDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICppbml0X3dpZmlkZXYoc3RydWN0IGFpcm9faW5mbyAqYWksCisJCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpldGhkZXYpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfbmV0ZGV2KDAsICJ3aWZpJWQiLCB3aWZpX3NldHVwKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIE5VTEw7CisJZGV2LT5wcml2ID0gZXRoZGV2LT5wcml2OworCWRldi0+aXJxID0gZXRoZGV2LT5pcnE7CisJZGV2LT5iYXNlX2FkZHIgPSBldGhkZXYtPmJhc2VfYWRkcjsKKyNpZmRlZiBXSVJFTEVTU19FWFQKKwlkZXYtPndpcmVsZXNzX2RhdGEgPSBldGhkZXYtPndpcmVsZXNzX2RhdGE7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUICovCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGV0aGRldi0+ZGV2X2FkZHIsIGRldi0+YWRkcl9sZW4pOworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnI8MCkgeworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGRldjsKK30KKworaW50IHJlc2V0X2NhcmQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgLCBpbnQgbG9jaykgeworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCisJaWYgKGxvY2sgJiYgZG93bl9pbnRlcnJ1cHRpYmxlKCZhaS0+c2VtKSkKKwkJcmV0dXJuIC0xOworCXdhaXRidXN5IChhaSk7CisJT1VUNDUwMChhaSxDT01NQU5ELENNRF9TT0ZUUkVTRVQpOworCW1zbGVlcCgyMDApOworCXdhaXRidXN5IChhaSk7CisJbXNsZWVwKDIwMCk7CisJaWYgKGxvY2spCisJCXVwKCZhaS0+c2VtKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IG5ldF9kZXZpY2UgKl9pbml0X2Fpcm9fY2FyZCggdW5zaWduZWQgc2hvcnQgaXJxLCBpbnQgcG9ydCwKKwkJCQkgICAgaW50IGlzX3BjbWNpYSwgc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJCQkgICAgc3RydWN0IGRldmljZSAqZG1kZXYgKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGFpcm9faW5mbyAqYWk7CisJaW50IGksIHJjOworCisJLyogQ3JlYXRlIHRoZSBuZXR3b3JrIGRldmljZSBvYmplY3QuICovCisgICAgICAgIGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqYWkpKTsKKyAgICAgICAgaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiAgQ291bGRuJ3QgYWxsb2NfZXRoZXJkZXZcbiIpOworCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCWlmIChkZXZfYWxsb2NfbmFtZShkZXYsIGRldi0+bmFtZSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlybzogIENvdWxkbid0IGdldCBuYW1lIVxuIik7CisJCWdvdG8gZXJyX291dF9mcmVlOworCX0KKworCWFpID0gZGV2LT5wcml2OworCWFpLT53aWZpZGV2ID0gTlVMTDsKKwlhaS0+ZmxhZ3MgPSAwOworCWlmIChwY2kgJiYgKHBjaS0+ZGV2aWNlID09IDB4NTAwMCB8fCBwY2ktPmRldmljZSA9PSAweGE1MDQpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJhaXJvOiBGb3VuZCBhbiBNUEkzNTAgY2FyZFxuIik7CisJCXNldF9iaXQoRkxBR19NUEksICZhaS0+ZmxhZ3MpOworCX0KKyAgICAgICAgYWktPmRldiA9IGRldjsKKwlzcGluX2xvY2tfaW5pdCgmYWktPmF1eF9sb2NrKTsKKwlzZW1hX2luaXQoJmFpLT5zZW0sIDEpOworCWFpLT5jb25maWcubGVuID0gMDsKKwlhaS0+cGNpID0gcGNpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQgKCZhaS0+dGhyX3dhaXQpOworCWluaXRfY29tcGxldGlvbiAoJmFpLT50aHJfZXhpdGVkKTsKKwlhaS0+dGhyX3BpZCA9IGtlcm5lbF90aHJlYWQoYWlyb190aHJlYWQsIGRldiwgQ0xPTkVfRlMgfCBDTE9ORV9GSUxFUyk7CisJaWYgKGFpLT50aHJfcGlkIDwgMCkKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisjaWZkZWYgTUlDU1VQUE9SVAorCWFpLT50Zm0gPSBOVUxMOworI2VuZGlmCisJcmMgPSBhZGRfYWlyb19kZXYoIGRldiApOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X3RocjsKKworCS8qIFRoZSBBaXJvLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCZhaS0+ZmxhZ3MpKSB7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQgKCZhaS0+dHhxKTsKKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmbXBpX3N0YXJ0X3htaXQ7CisJfSBlbHNlCisJCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmFpcm9fc3RhcnRfeG1pdDsKKwlkZXYtPmdldF9zdGF0cyA9ICZhaXJvX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZhaXJvX3NldF9tdWx0aWNhc3RfbGlzdDsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9ICZhaXJvX3NldF9tYWNfYWRkcmVzczsKKwlkZXYtPmRvX2lvY3RsID0gJmFpcm9faW9jdGw7CisjaWZkZWYgV0lSRUxFU1NfRVhUCisJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZhaXJvX2hhbmRsZXJfZGVmOworCWFpLT53aXJlbGVzc19kYXRhLnNweV9kYXRhID0gJmFpLT5zcHlfZGF0YTsKKwlkZXYtPndpcmVsZXNzX2RhdGEgPSAmYWktPndpcmVsZXNzX2RhdGE7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUICovCisJZGV2LT5jaGFuZ2VfbXR1ID0gJmFpcm9fY2hhbmdlX210dTsKKwlkZXYtPm9wZW4gPSAmYWlyb19vcGVuOworCWRldi0+c3RvcCA9ICZhaXJvX2Nsb3NlOworCWRldi0+aXJxID0gaXJxOworCWRldi0+YmFzZV9hZGRyID0gcG9ydDsKKworCVNFVF9ORVRERVZfREVWKGRldiwgZG1kZXYpOworCisKKwlpZiAodGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpCisJCXJlc2V0X2NhcmQgKGRldiwgMSk7CisKKwlyYyA9IHJlcXVlc3RfaXJxKCBkZXYtPmlycSwgYWlyb19pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldiApOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm86IHJlZ2lzdGVyIGludGVycnVwdCAlZCBmYWlsZWQsIHJjICVkXG4iLCBpcnEsIHJjICk7CisJCWdvdG8gZXJyX291dF91bmxpbms7CisJfQorCWlmICghaXNfcGNtY2lhKSB7CisJCWlmICghcmVxdWVzdF9yZWdpb24oIGRldi0+YmFzZV9hZGRyLCA2NCwgZGV2LT5uYW1lICkpIHsKKwkJCXJjID0gLUVCVVNZOworCQkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiBDb3VsZG4ndCByZXF1ZXN0IHJlZ2lvblxuIik7CisJCQlnb3RvIGVycl9vdXRfaXJxOworCQl9CisJfQorCisJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCZhaS0+ZmxhZ3MpKSB7CisJCWlmIChtcGlfbWFwX2NhcmQoYWksIHBjaSwgZGV2LT5uYW1lKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiBDb3VsZCBub3QgbWFwIG1lbW9yeVxuIik7CisJCQlnb3RvIGVycl9vdXRfcmVzOworCQl9CisJfQorCisJaWYgKHByb2JlKSB7CisJCWlmICggc2V0dXBfY2FyZCggYWksIGRldi0+ZGV2X2FkZHIsIDEgKSAhPSBTVUNDRVNTICkgeworCQkJcHJpbnRrKCBLRVJOX0VSUiAiYWlybzogTUFDIGNvdWxkIG5vdCBiZSBlbmFibGVkXG4iICk7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIGVycl9vdXRfbWFwOworCQl9CisJfSBlbHNlIGlmICghdGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpIHsKKwkJYWktPmJhcF9yZWFkID0gZmFzdF9iYXBfcmVhZDsKKwkJc2V0X2JpdChGTEFHX0ZMQVNISU5HLCAmYWktPmZsYWdzKTsKKwl9CisKKwlyYyA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm86IENvdWxkbid0IHJlZ2lzdGVyX25ldGRldlxuIik7CisJCWdvdG8gZXJyX291dF9tYXA7CisJfQorCWFpLT53aWZpZGV2ID0gaW5pdF93aWZpZGV2KGFpLCBkZXYpOworCisJc2V0X2JpdChGTEFHX1JFR0lTVEVSRUQsJmFpLT5mbGFncyk7CisJcHJpbnRrKCBLRVJOX0lORk8gImFpcm86IE1BQyBlbmFibGVkICVzICV4OiV4OiV4OiV4OiV4OiV4XG4iLAorCQlkZXYtPm5hbWUsCisJCWRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sIGRldi0+ZGV2X2FkZHJbMl0sCisJCWRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0gKTsKKworCS8qIEFsbG9jYXRlIHRoZSB0cmFuc21pdCBidWZmZXJzICovCisJaWYgKHByb2JlICYmICF0ZXN0X2JpdChGTEFHX01QSSwmYWktPmZsYWdzKSkKKwkJZm9yKCBpID0gMDsgaSA8IE1BWF9GSURTOyBpKysgKQorCQkJYWktPmZpZHNbaV0gPSB0cmFuc21pdF9hbGxvY2F0ZShhaSwyMzEyLGk+PU1BWF9GSURTLzIpOworCisJc2V0dXBfcHJvY19lbnRyeSggZGV2LCBkZXYtPnByaXYgKTsgLyogWFhYIGNoZWNrIGZvciBmYWlsdXJlICovCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJcmV0dXJuIGRldjsKKworZXJyX291dF9tYXA6CisJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCZhaS0+ZmxhZ3MpICYmIHBjaSkgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBjaSwgUENJX1NIQVJFRF9MRU4sIGFpLT5zaGFyZWQsIGFpLT5zaGFyZWRfZG1hKTsKKwkJaW91bm1hcChhaS0+cGNpYXV4KTsKKwkJaW91bm1hcChhaS0+cGNpbWVtKTsKKwkJbXBpX3VubWFwX2NhcmQoYWktPnBjaSk7CisJfQorZXJyX291dF9yZXM6CisJaWYgKCFpc19wY21jaWEpCisJICAgICAgICByZWxlYXNlX3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIDY0ICk7CitlcnJfb3V0X2lycToKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKK2Vycl9vdXRfdW5saW5rOgorCWRlbF9haXJvX2RldihkZXYpOworZXJyX291dF90aHI6CisJc2V0X2JpdChKT0JfRElFLCAmYWktPmZsYWdzKTsKKwlraWxsX3Byb2MoYWktPnRocl9waWQsIFNJR1RFUk0sIDEpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFpLT50aHJfZXhpdGVkKTsKK2Vycl9vdXRfZnJlZToKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqaW5pdF9haXJvX2NhcmQoIHVuc2lnbmVkIHNob3J0IGlycSwgaW50IHBvcnQsIGludCBpc19wY21jaWEsCisJCQkJICBzdHJ1Y3QgZGV2aWNlICpkbWRldikKK3sKKwlyZXR1cm4gX2luaXRfYWlyb19jYXJkICggaXJxLCBwb3J0LCBpc19wY21jaWEsIE5VTEwsIGRtZGV2KTsKK30KKworRVhQT1JUX1NZTUJPTChpbml0X2Fpcm9fY2FyZCk7CisKK3N0YXRpYyBpbnQgd2FpdGJ1c3kgKHN0cnVjdCBhaXJvX2luZm8gKmFpKSB7CisJaW50IGRlbGF5ID0gMDsKKwl3aGlsZSAoKElONDUwMCAoYWksIENPTU1BTkQpICYgQ09NTUFORF9CVVNZKSAmIChkZWxheSA8IDEwMDAwKSkgeworCQl1ZGVsYXkgKDEwKTsKKwkJaWYgKCgrK2RlbGF5ICUgMjApID09IDApCisJCQlPVVQ0NTAwKGFpLCBFVkFDSywgRVZfQ0xFQVJDT01NQU5EQlVTWSk7CisJfQorCXJldHVybiBkZWxheSA8IDEwMDAwOworfQorCitpbnQgcmVzZXRfYWlyb19jYXJkKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKworCWlmIChyZXNldF9jYXJkIChkZXYsIDEpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIHNldHVwX2NhcmQoYWksIGRldi0+ZGV2X2FkZHIsIDEgKSAhPSBTVUNDRVNTICkgeworCQlwcmludGsoIEtFUk5fRVJSICJhaXJvOiBNQUMgY291bGQgbm90IGJlIGVuYWJsZWRcbiIgKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwcmludGsoIEtFUk5fSU5GTyAiYWlybzogTUFDIGVuYWJsZWQgJXMgJXg6JXg6JXg6JXg6JXg6JXhcbiIsIGRldi0+bmFtZSwKKwkJCWRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sIGRldi0+ZGV2X2FkZHJbMl0sCisJCQlkZXYtPmRldl9hZGRyWzNdLCBkZXYtPmRldl9hZGRyWzRdLCBkZXYtPmRldl9hZGRyWzVdKTsKKwkvKiBBbGxvY2F0ZSB0aGUgdHJhbnNtaXQgYnVmZmVycyBpZiBuZWVkZWQgKi8KKwlpZiAoIXRlc3RfYml0KEZMQUdfTVBJLCZhaS0+ZmxhZ3MpKQorCQlmb3IoIGkgPSAwOyBpIDwgTUFYX0ZJRFM7IGkrKyApCisJCQlhaS0+Zmlkc1tpXSA9IHRyYW5zbWl0X2FsbG9jYXRlIChhaSwyMzEyLGk+PU1BWF9GSURTLzIpOworCisJZW5hYmxlX2ludGVycnVwdHMoIGFpICk7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHJlc2V0X2Fpcm9fY2FyZCk7CisKK3N0YXRpYyB2b2lkIGFpcm9fc2VuZF9ldmVudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCVN0YXR1c1JpZCBzdGF0dXNfcmlkOworCisJY2xlYXJfYml0KEpPQl9FVkVOVCwgJmFpLT5mbGFncyk7CisJUEM0NTAwX3JlYWRyaWQoYWksIFJJRF9TVEFUVVMsICZzdGF0dXNfcmlkLCBzaXplb2Yoc3RhdHVzX3JpZCksIDApOworCXVwKCZhaS0+c2VtKTsKKwl3cnF1LmRhdGEubGVuZ3RoID0gMDsKKwl3cnF1LmRhdGEuZmxhZ3MgPSAwOworCW1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgc3RhdHVzX3JpZC5ic3NpZFswXSwgRVRIX0FMRU4pOworCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisKKwkvKiBTZW5kIGV2ZW50IHRvIHVzZXIgc3BhY2UgKi8KKwl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgYWlyb190aHJlYWQodm9pZCAqZGF0YSkgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCWludCBsb2NrZWQ7CisJCisJZGFlbW9uaXplKCIlcyIsIGRldi0+bmFtZSk7CisJYWxsb3dfc2lnbmFsKFNJR1RFUk0pOworCisJd2hpbGUoMSkgeworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOworCisJCS8qIG1ha2Ugc3dzdXNwIGhhcHB5IHdpdGggb3VyIHRocmVhZCAqLworCQl0cnlfdG9fZnJlZXplKFBGX0ZSRUVaRSk7CisKKwkJaWYgKHRlc3RfYml0KEpPQl9ESUUsICZhaS0+ZmxhZ3MpKQorCQkJYnJlYWs7CisKKwkJaWYgKGFpLT5mbGFncyAmIEpPQl9NQVNLKSB7CisJCQlsb2NrZWQgPSBkb3duX2ludGVycnVwdGlibGUoJmFpLT5zZW0pOworCQl9IGVsc2UgeworCQkJd2FpdF9xdWV1ZV90IHdhaXQ7CisKKwkJCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKKwkJCWFkZF93YWl0X3F1ZXVlKCZhaS0+dGhyX3dhaXQsICZ3YWl0KTsKKwkJCWZvciAoOzspIHsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJCWlmIChhaS0+ZmxhZ3MgJiBKT0JfTUFTSykKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGFpLT5leHBpcmVzKSB7CisJCQkJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsYWktPmV4cGlyZXMpKXsKKwkJCQkJCXNldF9iaXQoSk9CX0FVVE9XRVAsJmFpLT5mbGFncyk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJCQlzY2hlZHVsZV90aW1lb3V0KGFpLT5leHBpcmVzIC0gamlmZmllcyk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJCXNjaGVkdWxlKCk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmFpLT50aHJfd2FpdCwgJndhaXQpOworCQkJbG9ja2VkID0gMTsKKwkJfQorCisJCWlmIChsb2NrZWQpCisJCQljb250aW51ZTsKKworCQlpZiAodGVzdF9iaXQoSk9CX0RJRSwgJmFpLT5mbGFncykpIHsKKwkJCXVwKCZhaS0+c2VtKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGFpLT5wb3dlciB8fCB0ZXN0X2JpdChGTEFHX0ZMQVNISU5HLCAmYWktPmZsYWdzKSkgeworCQkJdXAoJmFpLT5zZW0pOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAodGVzdF9iaXQoSk9CX1hNSVQsICZhaS0+ZmxhZ3MpKQorCQkJYWlyb19lbmRfeG1pdChkZXYpOworCQllbHNlIGlmICh0ZXN0X2JpdChKT0JfWE1JVDExLCAmYWktPmZsYWdzKSkKKwkJCWFpcm9fZW5kX3htaXQxMShkZXYpOworCQllbHNlIGlmICh0ZXN0X2JpdChKT0JfU1RBVFMsICZhaS0+ZmxhZ3MpKQorCQkJYWlyb19yZWFkX3N0YXRzKGFpKTsKKwkJZWxzZSBpZiAodGVzdF9iaXQoSk9CX1dTVEFUUywgJmFpLT5mbGFncykpCisJCQlhaXJvX3JlYWRfd2lyZWxlc3Nfc3RhdHMoYWkpOworCQllbHNlIGlmICh0ZXN0X2JpdChKT0JfUFJPTUlTQywgJmFpLT5mbGFncykpCisJCQlhaXJvX3NldF9wcm9taXNjKGFpKTsKKyNpZmRlZiBNSUNTVVBQT1JUCisJCWVsc2UgaWYgKHRlc3RfYml0KEpPQl9NSUMsICZhaS0+ZmxhZ3MpKQorCQkJbWljaW5pdChhaSk7CisjZW5kaWYKKwkJZWxzZSBpZiAodGVzdF9iaXQoSk9CX0VWRU5ULCAmYWktPmZsYWdzKSkKKwkJCWFpcm9fc2VuZF9ldmVudChkZXYpOworCQllbHNlIGlmICh0ZXN0X2JpdChKT0JfQVVUT1dFUCwgJmFpLT5mbGFncykpCisJCQl0aW1lcl9mdW5jKGRldik7CisJfQorCWNvbXBsZXRlX2FuZF9leGl0ICgmYWktPnRocl9leGl0ZWQsIDApOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYWlyb19pbnRlcnJ1cHQgKCBpbnQgaXJxLCB2b2lkKiBkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKwl1MTYgc3RhdHVzOworCXUxNiBmaWQ7CisJc3RydWN0IGFpcm9faW5mbyAqYXByaXYgPSBkZXYtPnByaXY7CisJdTE2IHNhdmVkSW50ZXJydXB0cyA9IDA7CisJaW50IGhhbmRsZWQgPSAwOworCisJaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlmb3IgKDs7KSB7CisJCXN0YXR1cyA9IElONDUwMCggYXByaXYsIEVWU1RBVCApOworCQlpZiAoICEoc3RhdHVzICYgU1RBVFVTX0lOVFMpIHx8IHN0YXR1cyA9PSAweGZmZmYgKSBicmVhazsKKworCQloYW5kbGVkID0gMTsKKworCQlpZiAoIHN0YXR1cyAmIEVWX0FXQUtFICkgeworCQkJT1VUNDUwMCggYXByaXYsIEVWQUNLLCBFVl9BV0FLRSApOworCQkJT1VUNDUwMCggYXByaXYsIEVWQUNLLCBFVl9BV0FLRSApOworCQl9CisKKwkJaWYgKCFzYXZlZEludGVycnVwdHMpIHsKKwkJCXNhdmVkSW50ZXJydXB0cyA9IElONDUwMCggYXByaXYsIEVWSU5URU4gKTsKKwkJCU9VVDQ1MDAoIGFwcml2LCBFVklOVEVOLCAwICk7CisJCX0KKworCQlpZiAoIHN0YXR1cyAmIEVWX01JQyApIHsKKwkJCU9VVDQ1MDAoIGFwcml2LCBFVkFDSywgRVZfTUlDICk7CisjaWZkZWYgTUlDU1VQUE9SVAorCQkJaWYgKHRlc3RfYml0KEZMQUdfTUlDX0NBUEFCTEUsICZhcHJpdi0+ZmxhZ3MpKSB7CisJCQkJc2V0X2JpdChKT0JfTUlDLCAmYXByaXYtPmZsYWdzKTsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFwcml2LT50aHJfd2FpdCk7CisJCQl9CisjZW5kaWYKKwkJfQorCQlpZiAoIHN0YXR1cyAmIEVWX0xJTksgKSB7CisJCQl1bmlvbiBpd3JlcV9kYXRhCXdycXU7CisJCQkvKiBUaGUgbGluayBzdGF0dXMgaGFzIGNoYW5nZWQsIGlmIHlvdSB3YW50IHRvIHB1dCBhCisJCQkgICBtb25pdG9yIGhvb2sgaW4sIGRvIGl0IGhlcmUuICAoUmVtZW1iZXIgdGhhdAorCQkJICAgaW50ZXJydXB0cyBhcmUgc3RpbGwgZGlzYWJsZWQhKQorCQkJKi8KKwkJCXUxNiBuZXdTdGF0dXMgPSBJTjQ1MDAoYXByaXYsIExJTktTVEFUKTsKKwkJCU9VVDQ1MDAoIGFwcml2LCBFVkFDSywgRVZfTElOSyk7CisJCQkvKiBIZXJlIGlzIHdoYXQgbmV3U3RhdHVzIG1lYW5zOiAqLworI2RlZmluZSBOT0JFQUNPTiAweDgwMDAgLyogTG9zcyBvZiBzeW5jIC0gbWlzc2VkIGJlYWNvbnMgKi8KKyNkZWZpbmUgTUFYUkVUUklFUyAweDgwMDEgLyogTG9zcyBvZiBzeW5jIC0gbWF4IHJldHJpZXMgKi8KKyNkZWZpbmUgTUFYQVJMIDB4ODAwMiAvKiBMb3NzIG9mIHN5bmMgLSBhdmVyYWdlIHJldHJ5IGxldmVsIGV4Y2VlZGVkKi8KKyNkZWZpbmUgRk9SQ0VMT1NTIDB4ODAwMyAvKiBMb3NzIG9mIHN5bmMgLSBob3N0IHJlcXVlc3QgKi8KKyNkZWZpbmUgVFNGU1lOQyAweDgwMDQgLyogTG9zcyBvZiBzeW5jIC0gVFNGIHN5bmNocm9uaXphdGlvbiAqLworI2RlZmluZSBERUFVVEggMHg4MTAwIC8qIERlYXV0aGVudGljYXRpb24gKGxvdyBieXRlIGlzIHJlYXNvbiBjb2RlKSAqLworI2RlZmluZSBESVNBU1MgMHg4MjAwIC8qIERpc2Fzc29jaWF0aW9uIChsb3cgYnl0ZSBpcyByZWFzb24gY29kZSkgKi8KKyNkZWZpbmUgQVNTRkFJTCAweDg0MDAgLyogQXNzb2NpYXRpb24gZmFpbHVyZSAobG93IGJ5dGUgaXMgcmVhc29uCisJCQkgIGNvZGUpICovCisjZGVmaW5lIEFVVEhGQUlMIDB4MDMwMCAvKiBBdXRoZW50aWNhdGlvbiBmYWlsdXJlIChsb3cgYnl0ZSBpcyByZWFzb24KKwkJCSAgIGNvZGUpICovCisjZGVmaW5lIEFTU09DSUFURUQgMHgwNDAwIC8qIEFzc29jYXRpZWQgKi8KKyNkZWZpbmUgUkNfUkVTRVJWRUQgMCAvKiBSZXNlcnZlZCByZXR1cm4gY29kZSAqLworI2RlZmluZSBSQ19OT1JFQVNPTiAxIC8qIFVuc3BlY2lmaWVkIHJlYXNvbiAqLworI2RlZmluZSBSQ19BVVRISU5WIDIgLyogUHJldmlvdXMgYXV0aGVudGljYXRpb24gaW52YWxpZCAqLworI2RlZmluZSBSQ19ERUFVVEggMyAvKiBEZWF1dGhlbnRpY2F0ZWQgYmVjYXVzZSBzZW5kaW5nIHN0YXRpb24gaXMKKwkJICAgICAgIGxlYXZpbmcgKi8KKyNkZWZpbmUgUkNfTk9BQ1QgNCAvKiBEaXNhc3NvY2lhdGVkIGR1ZSB0byBpbmFjdGl2aXR5ICovCisjZGVmaW5lIFJDX01BWExPQUQgNSAvKiBEaXNhc3NvY2lhdGVkIGJlY2F1c2UgQVAgaXMgdW5hYmxlIHRvIGhhbmRsZQorCQkJYWxsIGN1cnJlbnRseSBhc3NvY2lhdGVkIHN0YXRpb25zICovCisjZGVmaW5lIFJDX0JBRENMQVNTMiA2IC8qIENsYXNzIDIgZnJhbWUgcmVjZWl2ZWQgZnJvbQorCQkJICBub24tQXV0aGVudGljYXRlZCBzdGF0aW9uICovCisjZGVmaW5lIFJDX0JBRENMQVNTMyA3IC8qIENsYXNzIDMgZnJhbWUgcmVjZWl2ZWQgZnJvbQorCQkJICBub24tQXNzb2NpYXRlZCBzdGF0aW9uICovCisjZGVmaW5lIFJDX1NUQVRMRUFWRSA4IC8qIERpc2Fzc29jaWF0ZWQgYmVjYXVzZSBzZW5kaW5nIHN0YXRpb24gaXMKKwkJCSAgbGVhdmluZyBCU1MgKi8KKyNkZWZpbmUgUkNfTk9BVVRIIDkgLyogU3RhdGlvbiByZXF1ZXN0aW5nIChSZSlBc3NvY2lhdGlvbiBpcyBub3QKKwkJICAgICAgIEF1dGhlbnRpY2F0ZWQgd2l0aCB0aGUgcmVzcG9uZGluZyBzdGF0aW9uICovCisJCQlpZiAobmV3U3RhdHVzICE9IEFTU09DSUFURUQpIHsKKwkJCQlpZiAoYXV0b193ZXAgJiYgIWFwcml2LT5leHBpcmVzKSB7CisJCQkJCWFwcml2LT5leHBpcmVzID0gUlVOX0FUKDMqSFopOworCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFwcml2LT50aHJfd2FpdCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBhcHJpdi0+dGFzazsKKwkJCQlpZiAoYXV0b193ZXApCisJCQkJCWFwcml2LT5leHBpcmVzID0gMDsKKwkJCQlpZiAodGFzaykKKwkJCQkJd2FrZV91cF9wcm9jZXNzICh0YXNrKTsKKwkJCQlzZXRfYml0KEZMQUdfVVBEQVRFX1VOSSwgJmFwcml2LT5mbGFncyk7CisJCQkJc2V0X2JpdChGTEFHX1VQREFURV9NVUxUSSwgJmFwcml2LT5mbGFncyk7CisJCQl9CisJCQkvKiBRdWVzdGlvbiA6IGlzIEFTU09DSUFURUQgdGhlIG9ubHkgc3RhdHVzCisJCQkgKiB0aGF0IGlzIHZhbGlkID8gV2Ugd2FudCB0byBjYXRjaCBoYW5kb3ZlcgorCQkJICogYW5kIHJlYXNzb2NpYXRpb25zIGFzIHZhbGlkIHN0YXR1cworCQkJICogSmVhbiBJSSAqLworCQkJaWYobmV3U3RhdHVzID09IEFTU09DSUFURUQpIHsKKwkJCQlpZiAoYXByaXYtPnNjYW5fdGltZXN0YW1wKSB7CisJCQkJCS8qIFNlbmQgYW4gZW1wdHkgZXZlbnQgdG8gdXNlciBzcGFjZS4KKwkJCQkJICogV2UgZG9uJ3Qgc2VuZCB0aGUgcmVjZWl2ZWQgZGF0YSBvbgorCQkJCQkgKiB0aGUgZXZlbnQgYmVjYXVzZSBpdCB3b3VsZCByZXF1aXJlCisJCQkJCSAqIHVzIHRvIGRvIGNvbXBsZXggdHJhbnNjb2RpbmcsIGFuZAorCQkJCQkgKiB3ZSB3YW50IHRvIG1pbmltaXNlIHRoZSB3b3JrIGRvbmUgaW4KKwkJCQkJICogdGhlIGlycSBoYW5kbGVyLiBVc2UgYSByZXF1ZXN0IHRvCisJCQkJCSAqIGV4dHJhY3QgdGhlIGRhdGEgLSBKZWFuIElJICovCisJCQkJCXdycXUuZGF0YS5sZW5ndGggPSAwOworCQkJCQl3cnF1LmRhdGEuZmxhZ3MgPSAwOworCQkJCQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgU0lPQ0dJV1NDQU4sICZ3cnF1LCBOVUxMKTsKKwkJCQkJYXByaXYtPnNjYW5fdGltZXN0YW1wID0gMDsKKwkJCQl9CisJCQkJaWYgKGRvd25fdHJ5bG9jaygmYXByaXYtPnNlbSkgIT0gMCkgeworCQkJCQlzZXRfYml0KEpPQl9FVkVOVCwgJmFwcml2LT5mbGFncyk7CisJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYXByaXYtPnRocl93YWl0KTsKKwkJCQl9IGVsc2UKKwkJCQkJYWlyb19zZW5kX2V2ZW50KGRldik7CisJCQl9IGVsc2UgeworCQkJCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgJ1wwJywgRVRIX0FMRU4pOworCQkJCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisKKwkJCQkvKiBTZW5kIGV2ZW50IHRvIHVzZXIgc3BhY2UgKi8KKwkJCQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgU0lPQ0dJV0FQLCAmd3JxdSxOVUxMKTsKKwkJCX0KKwkJfQorCisJCS8qIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdG8gcmVjZWl2ZSAqLworCQlpZiAoIHN0YXR1cyAmIEVWX1JYICApIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCQkJdTE2IGZjLCBsZW4sIGhkcmxlbiA9IDA7CisjcHJhZ21hIHBhY2soMSkKKwkJCXN0cnVjdCB7CisJCQkJdTE2IHN0YXR1cywgbGVuOworCQkJCXU4IHJzc2lbMl07CisJCQkJdTggcmF0ZTsKKwkJCQl1OCBmcmVxOworCQkJCXUxNiB0bXBbNF07CisJCQl9IGhkcjsKKyNwcmFnbWEgcGFjaygpCisJCQl1MTYgZ2FwOworCQkJdTE2IHRtcGJ1Zls0XTsKKwkJCXUxNiAqYnVmZmVyOworCisJCQlpZiAodGVzdF9iaXQoRkxBR19NUEksJmFwcml2LT5mbGFncykpIHsKKwkJCQlpZiAodGVzdF9iaXQoRkxBR184MDJfMTEsICZhcHJpdi0+ZmxhZ3MpKQorCQkJCQltcGlfcmVjZWl2ZV84MDJfMTEoYXByaXYpOworCQkJCWVsc2UKKwkJCQkJbXBpX3JlY2VpdmVfODAyXzMoYXByaXYpOworCQkJCU9VVDQ1MDAoYXByaXYsIEVWQUNLLCBFVl9SWCk7CisJCQkJZ290byBleGl0cng7CisJCQl9CisKKwkJCWZpZCA9IElONDUwMCggYXByaXYsIFJYRklEICk7CisKKwkJCS8qIEdldCB0aGUgcGFja2V0IGxlbmd0aCAqLworCQkJaWYgKHRlc3RfYml0KEZMQUdfODAyXzExLCAmYXByaXYtPmZsYWdzKSkgeworCQkJCWJhcF9zZXR1cCAoYXByaXYsIGZpZCwgNCwgQkFQMCk7CisJCQkJYmFwX3JlYWQgKGFwcml2LCAodTE2KikmaGRyLCBzaXplb2YoaGRyKSwgQkFQMCk7CisJCQkJLyogQmFkIENSQy4gSWdub3JlIHBhY2tldCAqLworCQkJCWlmIChsZTE2X3RvX2NwdShoZHIuc3RhdHVzKSAmIDIpCisJCQkJCWhkci5sZW4gPSAwOworCQkJCWlmIChhcHJpdi0+d2lmaWRldiA9PSBOVUxMKQorCQkJCQloZHIubGVuID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJYmFwX3NldHVwIChhcHJpdiwgZmlkLCAweDM2LCBCQVAwKTsKKwkJCQliYXBfcmVhZCAoYXByaXYsICh1MTYqKSZoZHIubGVuLCAyLCBCQVAwKTsKKwkJCX0KKwkJCWxlbiA9IGxlMTZfdG9fY3B1KGhkci5sZW4pOworCisJCQlpZiAobGVuID4gMjMxMikgeworCQkJCXByaW50ayggS0VSTl9FUlIgImFpcm86IEJhZCBzaXplICVkXG4iLCBsZW4gKTsKKwkJCQlnb3RvIGJhZHJ4OworCQkJfQorCQkJaWYgKGxlbiA9PSAwKQorCQkJCWdvdG8gYmFkcng7CisKKwkJCWlmICh0ZXN0X2JpdChGTEFHXzgwMl8xMSwgJmFwcml2LT5mbGFncykpIHsKKwkJCQliYXBfcmVhZCAoYXByaXYsICh1MTYqKSZmYywgc2l6ZW9mKGZjKSwgQkFQMCk7CisJCQkJZmMgPSBsZTE2X3RvX2NwdShmYyk7CisJCQkJc3dpdGNoIChmYyAmIDB4YykgeworCQkJCQljYXNlIDQ6CisJCQkJCQlpZiAoKGZjICYgMHhlMCkgPT0gMHhjMCkKKwkJCQkJCQloZHJsZW4gPSAxMDsKKwkJCQkJCWVsc2UKKwkJCQkJCQloZHJsZW4gPSAxNjsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDg6CisJCQkJCQlpZiAoKGZjJjB4MzAwKT09MHgzMDApeworCQkJCQkJCWhkcmxlbiA9IDMwOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQlkZWZhdWx0OgorCQkJCQkJaGRybGVuID0gMjQ7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJaGRybGVuID0gRVRIX0FMRU4gKiAyOworCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKCBsZW4gKyBoZHJsZW4gKyAyICsgMiApOworCQkJaWYgKCAhc2tiICkgeworCQkJCWFwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJZ290byBiYWRyeDsKKwkJCX0KKwkJCXNrYl9yZXNlcnZlKHNrYiwgMik7IC8qIFRoaXMgd2F5IHRoZSBJUCBoZWFkZXIgaXMgYWxpZ25lZCAqLworCQkJYnVmZmVyID0gKHUxNiopc2tiX3B1dCAoc2tiLCBsZW4gKyBoZHJsZW4pOworCQkJaWYgKHRlc3RfYml0KEZMQUdfODAyXzExLCAmYXByaXYtPmZsYWdzKSkgeworCQkJCWJ1ZmZlclswXSA9IGZjOworCQkJCWJhcF9yZWFkIChhcHJpdiwgYnVmZmVyICsgMSwgaGRybGVuIC0gMiwgQkFQMCk7CisJCQkJaWYgKGhkcmxlbiA9PSAyNCkKKwkJCQkJYmFwX3JlYWQgKGFwcml2LCB0bXBidWYsIDYsIEJBUDApOworCisJCQkJYmFwX3JlYWQgKGFwcml2LCAmZ2FwLCBzaXplb2YoZ2FwKSwgQkFQMCk7CisJCQkJZ2FwID0gbGUxNl90b19jcHUoZ2FwKTsKKwkJCQlpZiAoZ2FwKSB7CisJCQkJCWlmIChnYXAgPD0gOCkKKwkJCQkJCWJhcF9yZWFkIChhcHJpdiwgdG1wYnVmLCBnYXAsIEJBUDApOworCQkJCQllbHNlCisJCQkJCQlwcmludGsoS0VSTl9FUlIgImFpcm86IGdhcGxlbiB0b28gYmlnLiBQcm9ibGVtcyB3aWxsIGZvbGxvdy4uLlxuIik7CisJCQkJfQorCQkJCWJhcF9yZWFkIChhcHJpdiwgYnVmZmVyICsgaGRybGVuLzIsIGxlbiwgQkFQMCk7CisJCQl9IGVsc2UgeworI2lmZGVmIE1JQ1NVUFBPUlQKKwkJCQlNSUNCdWZmZXIgbWljYnVmOworI2VuZGlmCisJCQkJYmFwX3JlYWQgKGFwcml2LCBidWZmZXIsIEVUSF9BTEVOKjIsIEJBUDApOworI2lmZGVmIE1JQ1NVUFBPUlQKKwkJCQlpZiAoYXByaXYtPm1pY3N0YXRzLmVuYWJsZWQpIHsKKwkJCQkJYmFwX3JlYWQgKGFwcml2LCh1MTYqKSZtaWNidWYsc2l6ZW9mKG1pY2J1ZiksQkFQMCk7CisJCQkJCWlmIChudG9ocyhtaWNidWYudHlwZWxlbikgPiAweDA1REMpCisJCQkJCQliYXBfc2V0dXAgKGFwcml2LCBmaWQsIDB4NDQsIEJBUDApOworCQkJCQllbHNlIHsKKwkJCQkJCWlmIChsZW4gPD0gc2l6ZW9mKG1pY2J1ZikpCisJCQkJCQkJZ290byBiYWRtaWM7CisKKwkJCQkJCWxlbiAtPSBzaXplb2YobWljYnVmKTsKKwkJCQkJCXNrYl90cmltIChza2IsIGxlbiArIGhkcmxlbik7CisJCQkJCX0KKwkJCQl9CisjZW5kaWYKKwkJCQliYXBfcmVhZChhcHJpdixidWZmZXIrRVRIX0FMRU4sbGVuLEJBUDApOworI2lmZGVmIE1JQ1NVUFBPUlQKKwkJCQlpZiAoZGVjYXBzdWxhdGUoYXByaXYsJm1pY2J1ZiwoZXRoZXJIZWFkKilidWZmZXIsbGVuKSkgeworYmFkbWljOgorCQkJCQlkZXZfa2ZyZWVfc2tiX2lycSAoc2tiKTsKKyNlbHNlCisJCQkJaWYgKDApIHsKKyNlbmRpZgorYmFkcng6CisJCQkJCU9VVDQ1MDAoIGFwcml2LCBFVkFDSywgRVZfUlgpOworCQkJCQlnb3RvIGV4aXRyeDsKKwkJCQl9CisJCQl9CisjaWZkZWYgV0lSRUxFU1NfU1BZCisJCQlpZiAoYXByaXYtPnNweV9kYXRhLnNweV9udW1iZXIgPiAwKSB7CisJCQkJY2hhciAqc2E7CisJCQkJc3RydWN0IGl3X3F1YWxpdHkgd3N0YXRzOworCQkJCS8qIFByZXBhcmUgc3B5IGRhdGEgOiBhZGRyICsgcXVhbCAqLworCQkJCWlmICghdGVzdF9iaXQoRkxBR184MDJfMTEsICZhcHJpdi0+ZmxhZ3MpKSB7CisJCQkJCXNhID0gKGNoYXIqKWJ1ZmZlciArIDY7CisJCQkJCWJhcF9zZXR1cCAoYXByaXYsIGZpZCwgOCwgQkFQMCk7CisJCQkJCWJhcF9yZWFkIChhcHJpdiwgKHUxNiopaGRyLnJzc2ksIDIsIEJBUDApOworCQkJCX0gZWxzZQorCQkJCQlzYSA9IChjaGFyKilidWZmZXIgKyAxMDsKKwkJCQl3c3RhdHMucXVhbCA9IGhkci5yc3NpWzBdOworCQkJCWlmIChhcHJpdi0+cnNzaSkKKwkJCQkJd3N0YXRzLmxldmVsID0gMHgxMDAgLSBhcHJpdi0+cnNzaVtoZHIucnNzaVsxXV0ucnNzaWRCbTsKKwkJCQllbHNlCisJCQkJCXdzdGF0cy5sZXZlbCA9IChoZHIucnNzaVsxXSArIDMyMSkgLyAyOworCQkJCXdzdGF0cy51cGRhdGVkID0gMzsJCisJCQkJLyogVXBkYXRlIHNweSByZWNvcmRzICovCisJCQkJd2lyZWxlc3Nfc3B5X3VwZGF0ZShkZXYsIHNhLCAmd3N0YXRzKTsKKwkJCX0KKyNlbmRpZiAvKiBXSVJFTEVTU19TUFkgKi8KKwkJCU9VVDQ1MDAoIGFwcml2LCBFVkFDSywgRVZfUlgpOworCisJCQlpZiAodGVzdF9iaXQoRkxBR184MDJfMTEsICZhcHJpdi0+ZmxhZ3MpKSB7CisJCQkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCQkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOworCQkJCXNrYi0+ZGV2ID0gYXByaXYtPndpZmlkZXY7CisJCQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMl8yKTsKKwkJCX0gZWxzZSB7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCQkJfQorCQkJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCisJCQluZXRpZl9yeCggc2tiICk7CisJCX0KK2V4aXRyeDoKKworCQkvKiBDaGVjayB0byBzZWUgaWYgYSBwYWNrZXQgaGFzIGJlZW4gdHJhbnNtaXR0ZWQgKi8KKwkJaWYgKCAgc3RhdHVzICYgKCBFVl9UWHxFVl9UWENQWXxFVl9UWEVYQyApICkgeworCQkJaW50IGk7CisJCQlpbnQgbGVuID0gMDsKKwkJCWludCBpbmRleCA9IC0xOworCisJCQlpZiAodGVzdF9iaXQoRkxBR19NUEksJmFwcml2LT5mbGFncykpIHsKKwkJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCQkJaWYgKHN0YXR1cyAmIEVWX1RYRVhDKQorCQkJCQlnZXRfdHhfZXJyb3IoYXByaXYsIC0xKTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXByaXYtPmF1eF9sb2NrLCBmbGFncyk7CisJCQkJaWYgKHNrYl9xdWV1ZV9sZW4gKCZhcHJpdi0+dHhxKSkgeworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcHJpdi0+YXV4X2xvY2ssZmxhZ3MpOworCQkJCQltcGlfc2VuZF9wYWNrZXQgKGRldik7CisJCQkJfSBlbHNlIHsKKwkJCQkJY2xlYXJfYml0KEZMQUdfUEVORElOR19YTUlULCAmYXByaXYtPmZsYWdzKTsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXByaXYtPmF1eF9sb2NrLGZsYWdzKTsKKwkJCQkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwkJCQl9CisJCQkJT1VUNDUwMCggYXByaXYsIEVWQUNLLAorCQkJCQlzdGF0dXMgJiAoRVZfVFh8RVZfVFhDUFl8RVZfVFhFWEMpKTsKKwkJCQlnb3RvIGV4aXR0eDsKKwkJCX0KKworCQkJZmlkID0gSU40NTAwKGFwcml2LCBUWENPTVBMRklEKTsKKworCQkJZm9yKCBpID0gMDsgaSA8IE1BWF9GSURTOyBpKysgKSB7CisJCQkJaWYgKCAoIGFwcml2LT5maWRzW2ldICYgMHhmZmZmICkgPT0gZmlkICkgeworCQkJCQlsZW4gPSBhcHJpdi0+Zmlkc1tpXSA+PiAxNjsKKwkJCQkJaW5kZXggPSBpOworCQkJCX0KKwkJCX0KKwkJCWlmIChpbmRleCAhPSAtMSkgeworCQkJCWlmIChzdGF0dXMgJiBFVl9UWEVYQykKKwkJCQkJZ2V0X3R4X2Vycm9yKGFwcml2LCBpbmRleCk7CisJCQkJT1VUNDUwMCggYXByaXYsIEVWQUNLLCBzdGF0dXMgJiAoRVZfVFggfCBFVl9UWEVYQykpOworCQkJCS8qIFNldCB1cCB0byBiZSB1c2VkIGFnYWluICovCisJCQkJYXByaXYtPmZpZHNbaW5kZXhdICY9IDB4ZmZmZjsKKwkJCQlpZiAoaW5kZXggPCBNQVhfRklEUyAvIDIpIHsKKwkJCQkJaWYgKCF0ZXN0X2JpdChGTEFHX1BFTkRJTkdfWE1JVCwgJmFwcml2LT5mbGFncykpCisJCQkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCF0ZXN0X2JpdChGTEFHX1BFTkRJTkdfWE1JVDExLCAmYXByaXYtPmZsYWdzKSkKKwkJCQkJCW5ldGlmX3dha2VfcXVldWUoYXByaXYtPndpZmlkZXYpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJT1VUNDUwMCggYXByaXYsIEVWQUNLLCBzdGF0dXMgJiAoRVZfVFggfCBFVl9UWENQWSB8IEVWX1RYRVhDKSk7CisJCQkJcHJpbnRrKCBLRVJOX0VSUiAiYWlybzogVW5hbGxvY2F0ZWQgRklEIHdhcyB1c2VkIHRvIHhtaXRcbiIgKTsKKwkJCX0KKwkJfQorZXhpdHR4OgorCQlpZiAoIHN0YXR1cyAmIH5TVEFUVVNfSU5UUyAmIH5JR05PUkVfSU5UUyApCisJCQlwcmludGsoIEtFUk5fV0FSTklORyAiYWlybzogR290IHdlaXJkIHN0YXR1cyAleFxuIiwKKwkJCQlzdGF0dXMgJiB+U1RBVFVTX0lOVFMgJiB+SUdOT1JFX0lOVFMgKTsKKwl9CisKKwlpZiAoc2F2ZWRJbnRlcnJ1cHRzKQorCQlPVVQ0NTAwKCBhcHJpdiwgRVZJTlRFTiwgc2F2ZWRJbnRlcnJ1cHRzICk7CisKKwkvKiBkb25lLi4gKi8KKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworLyoKKyAqICBSb3V0aW5lcyB0byB0YWxrIHRvIHRoZSBjYXJkCisgKi8KKworLyoKKyAqICBUaGlzIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gZm9yIHRoZSA0NTAwLCBoZW5jZSB0aGUgbmFtZQorICogIE5PVEU6ICBJZiB1c2Ugd2l0aCA4Yml0IG1vZGUgYW5kIFNNUCBiYWQgdGhpbmdzIHdpbGwgaGFwcGVuIQorICogICAgICAgICBXaHkgd291bGQgc29tZSBvbmUgZG8gOCBiaXQgSU8gaW4gYW4gU01QIG1hY2hpbmU/IT8KKyAqLworc3RhdGljIHZvaWQgT1VUNDUwMCggc3RydWN0IGFpcm9faW5mbyAqYWksIHUxNiByZWcsIHUxNiB2YWwgKSB7CisJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCZhaS0+ZmxhZ3MpKQorCQlyZWcgPDw9IDE7CisJaWYgKCAhZG84Yml0SU8gKQorCQlvdXR3KCB2YWwsIGFpLT5kZXYtPmJhc2VfYWRkciArIHJlZyApOworCWVsc2UgeworCQlvdXRiKCB2YWwgJiAweGZmLCBhaS0+ZGV2LT5iYXNlX2FkZHIgKyByZWcgKTsKKwkJb3V0YiggdmFsID4+IDgsIGFpLT5kZXYtPmJhc2VfYWRkciArIHJlZyArIDEgKTsKKwl9Cit9CisKK3N0YXRpYyB1MTYgSU40NTAwKCBzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTE2IHJlZyApIHsKKwl1bnNpZ25lZCBzaG9ydCByYzsKKworCWlmICh0ZXN0X2JpdChGTEFHX01QSSwmYWktPmZsYWdzKSkKKwkJcmVnIDw8PSAxOworCWlmICggIWRvOGJpdElPICkKKwkJcmMgPSBpbncoIGFpLT5kZXYtPmJhc2VfYWRkciArIHJlZyApOworCWVsc2UgeworCQlyYyA9IGluYiggYWktPmRldi0+YmFzZV9hZGRyICsgcmVnICk7CisJCXJjICs9ICgoaW50KWluYiggYWktPmRldi0+YmFzZV9hZGRyICsgcmVnICsgMSApKSA8PCA4OworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZW5hYmxlX01BQyggc3RydWN0IGFpcm9faW5mbyAqYWksIFJlc3AgKnJzcCwgaW50IGxvY2sgKSB7CisJaW50IHJjOworICAgICAgICBDbWQgY21kOworCisJLyogRkxBR19SQURJT19PRkYgOiBSYWRpbyBkaXNhYmxlZCB2aWEgL3Byb2Mgb3IgV2lyZWxlc3MgRXh0ZW5zaW9ucworCSAqIEZMQUdfUkFESU9fRE9XTiA6IFJhZGlvIGRpc2FibGVkIHZpYSAiaWZjb25maWcgZXRoWCBkb3duIgorCSAqIE5vdGUgOiB3ZSBjb3VsZCB0cnkgdG8gdXNlICFuZXRpZl9ydW5uaW5nKGRldikgaW4gZW5hYmxlX01BQygpCisJICogaW5zdGVhZCBvZiB0aGlzIGZsYWcsIGJ1dCBJIGRvbid0IHRydXN0IGl0ICp3aXRoaW4qIHRoZQorCSAqIG9wZW4vY2xvc2UgZnVuY3Rpb25zLCBhbmQgdGVzdGluZyBib3RoIGZsYWdzIHRvZ2V0aGVyIGlzCisJICogImNoZWFwZXIiIC0gSmVhbiBJSSAqLworCWlmIChhaS0+ZmxhZ3MgJiBGTEFHX1JBRElPX01BU0spIHJldHVybiBTVUNDRVNTOworCisJaWYgKGxvY2sgJiYgZG93bl9pbnRlcnJ1cHRpYmxlKCZhaS0+c2VtKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWlmICghdGVzdF9iaXQoRkxBR19FTkFCTEVELCAmYWktPmZsYWdzKSkgeworCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCQljbWQuY21kID0gTUFDX0VOQUJMRTsKKwkJcmMgPSBpc3N1ZWNvbW1hbmQoYWksICZjbWQsIHJzcCk7CisJCWlmIChyYyA9PSBTVUNDRVNTKQorCQkJc2V0X2JpdChGTEFHX0VOQUJMRUQsICZhaS0+ZmxhZ3MpOworCX0gZWxzZQorCQlyYyA9IFNVQ0NFU1M7CisKKwlpZiAobG9jaykKKwkgICAgdXAoJmFpLT5zZW0pOworCisJaWYgKHJjKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3QgZW5hYmxlIE1BQywgZXJyPSVkXG4iLAorCQkJX19GVU5DVElPTl9fLHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVfTUFDKCBzdHJ1Y3QgYWlyb19pbmZvICphaSwgaW50IGxvY2sgKSB7CisgICAgICAgIENtZCBjbWQ7CisJUmVzcCByc3A7CisKKwlpZiAobG9jayAmJiBkb3duX2ludGVycnVwdGlibGUoJmFpLT5zZW0pKQorCQlyZXR1cm47CisKKwlpZiAodGVzdF9iaXQoRkxBR19FTkFCTEVELCAmYWktPmZsYWdzKSkgeworCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCQljbWQuY21kID0gTUFDX0RJU0FCTEU7IC8vIGRpc2FibGUgaW4gY2FzZSBhbHJlYWR5IGVuYWJsZWQKKwkJaXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKTsKKwkJY2xlYXJfYml0KEZMQUdfRU5BQkxFRCwgJmFpLT5mbGFncyk7CisJfQorCWlmIChsb2NrKQorCQl1cCgmYWktPnNlbSk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9pbnRlcnJ1cHRzKCBzdHJ1Y3QgYWlyb19pbmZvICphaSApIHsKKwkvKiBFbmFibGUgdGhlIGludGVycnVwdHMgKi8KKwlPVVQ0NTAwKCBhaSwgRVZJTlRFTiwgU1RBVFVTX0lOVFMgKTsKK30KKworc3RhdGljIHZvaWQgZGlzYWJsZV9pbnRlcnJ1cHRzKCBzdHJ1Y3QgYWlyb19pbmZvICphaSApIHsKKwlPVVQ0NTAwKCBhaSwgRVZJTlRFTiwgMCApOworfQorCitzdGF0aWMgdm9pZCBtcGlfcmVjZWl2ZV84MDJfMyhzdHJ1Y3QgYWlyb19pbmZvICphaSkKK3sKKwlSeEZpZCByeGQ7CisJaW50IGxlbiA9IDA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwljaGFyICpidWZmZXI7CisjaWZkZWYgTUlDU1VQUE9SVAorCWludCBvZmYgPSAwOworCU1JQ0J1ZmZlciBtaWNidWY7CisjZW5kaWYKKworCW1lbWNweV9mcm9taW8oJnJ4ZCwgYWktPnJ4Zmlkc1swXS5jYXJkX3JhbV9vZmYsIHNpemVvZihyeGQpKTsKKwkvKiBNYWtlIHN1cmUgd2UgZ290IHNvbWV0aGluZyAqLworCWlmIChyeGQucmR5ICYmIHJ4ZC52YWxpZCA9PSAwKSB7CisJCWxlbiA9IHJ4ZC5sZW4gKyAxMjsKKwkJaWYgKGxlbiA8IDEyIHx8IGxlbiA+IDIwNDgpCisJCQlnb3RvIGJhZHJ4OworCisJCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKwkJaWYgKCFza2IpIHsKKwkJCWFpLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQlnb3RvIGJhZHJ4OworCQl9CisJCWJ1ZmZlciA9IHNrYl9wdXQoc2tiLGxlbik7CisjaWZkZWYgTUlDU1VQUE9SVAorCQltZW1jcHkoYnVmZmVyLCBhaS0+cnhmaWRzWzBdLnZpcnR1YWxfaG9zdF9hZGRyLCBFVEhfQUxFTiAqIDIpOworCQlpZiAoYWktPm1pY3N0YXRzLmVuYWJsZWQpIHsKKwkJCW1lbWNweSgmbWljYnVmLAorCQkJCWFpLT5yeGZpZHNbMF0udmlydHVhbF9ob3N0X2FkZHIgKyBFVEhfQUxFTiAqIDIsCisJCQkJc2l6ZW9mKG1pY2J1ZikpOworCQkJaWYgKG50b2hzKG1pY2J1Zi50eXBlbGVuKSA8PSAweDA1REMpIHsKKwkJCQlpZiAobGVuIDw9IHNpemVvZihtaWNidWYpICsgRVRIX0FMRU4gKiAyKQorCQkJCQlnb3RvIGJhZG1pYzsKKworCQkJCW9mZiA9IHNpemVvZihtaWNidWYpOworCQkJCXNrYl90cmltIChza2IsIGxlbiAtIG9mZik7CisJCQl9CisJCX0KKwkJbWVtY3B5KGJ1ZmZlciArIEVUSF9BTEVOICogMiwKKwkJCWFpLT5yeGZpZHNbMF0udmlydHVhbF9ob3N0X2FkZHIgKyBFVEhfQUxFTiAqIDIgKyBvZmYsCisJCQlsZW4gLSBFVEhfQUxFTiAqIDIgLSBvZmYpOworCQlpZiAoZGVjYXBzdWxhdGUgKGFpLCAmbWljYnVmLCAoZXRoZXJIZWFkKilidWZmZXIsIGxlbiAtIG9mZiAtIEVUSF9BTEVOICogMikpIHsKK2JhZG1pYzoKKwkJCWRldl9rZnJlZV9za2JfaXJxIChza2IpOworCQkJZ290byBiYWRyeDsKKwkJfQorI2Vsc2UKKwkJbWVtY3B5KGJ1ZmZlciwgYWktPnJ4Zmlkc1swXS52aXJ0dWFsX2hvc3RfYWRkciwgbGVuKTsKKyNlbmRpZgorI2lmZGVmIFdJUkVMRVNTX1NQWQorCQlpZiAoYWktPnNweV9kYXRhLnNweV9udW1iZXIgPiAwKSB7CisJCQljaGFyICpzYTsKKwkJCXN0cnVjdCBpd19xdWFsaXR5IHdzdGF0czsKKwkJCS8qIFByZXBhcmUgc3B5IGRhdGEgOiBhZGRyICsgcXVhbCAqLworCQkJc2EgPSBidWZmZXIgKyBFVEhfQUxFTjsKKwkJCXdzdGF0cy5xdWFsID0gMDsgLyogWFhYIFdoZXJlIGRvIEkgZ2V0IHRoYXQgaW5mbyBmcm9tID8/PyAqLworCQkJd3N0YXRzLmxldmVsID0gMDsKKwkJCXdzdGF0cy51cGRhdGVkID0gMDsKKwkJCS8qIFVwZGF0ZSBzcHkgcmVjb3JkcyAqLworCQkJd2lyZWxlc3Nfc3B5X3VwZGF0ZShhaS0+ZGV2LCBzYSwgJndzdGF0cyk7CisJCX0KKyNlbmRpZiAvKiBXSVJFTEVTU19TUFkgKi8KKworCQlza2ItPmRldiA9IGFpLT5kZXY7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgYWktPmRldik7CisJCXNrYi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJbmV0aWZfcngoc2tiKTsKKwl9CitiYWRyeDoKKwlpZiAocnhkLnZhbGlkID09IDApIHsKKwkJcnhkLnZhbGlkID0gMTsKKwkJcnhkLnJkeSA9IDA7CisJCXJ4ZC5sZW4gPSBQS1RTSVpFOworCQltZW1jcHlfdG9pbyhhaS0+cnhmaWRzWzBdLmNhcmRfcmFtX29mZiwgJnJ4ZCwgc2l6ZW9mKHJ4ZCkpOworCX0KK30KKwordm9pZCBtcGlfcmVjZWl2ZV84MDJfMTEgKHN0cnVjdCBhaXJvX2luZm8gKmFpKQoreworCVJ4RmlkIHJ4ZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwl1MTYgZmMsIGxlbiwgaGRybGVuID0gMDsKKyNwcmFnbWEgcGFjaygxKQorCXN0cnVjdCB7CisJCXUxNiBzdGF0dXMsIGxlbjsKKwkJdTggcnNzaVsyXTsKKwkJdTggcmF0ZTsKKwkJdTggZnJlcTsKKwkJdTE2IHRtcFs0XTsKKwl9IGhkcjsKKyNwcmFnbWEgcGFjaygpCisJdTE2IGdhcDsKKwl1MTYgKmJ1ZmZlcjsKKwljaGFyICpwdHIgPSBhaS0+cnhmaWRzWzBdLnZpcnR1YWxfaG9zdF9hZGRyKzQ7CisKKwltZW1jcHlfZnJvbWlvKCZyeGQsIGFpLT5yeGZpZHNbMF0uY2FyZF9yYW1fb2ZmLCBzaXplb2YocnhkKSk7CisJbWVtY3B5ICgoY2hhciAqKSZoZHIsIHB0ciwgc2l6ZW9mKGhkcikpOworCXB0ciArPSBzaXplb2YoaGRyKTsKKwkvKiBCYWQgQ1JDLiBJZ25vcmUgcGFja2V0ICovCisJaWYgKGxlMTZfdG9fY3B1KGhkci5zdGF0dXMpICYgMikKKwkJaGRyLmxlbiA9IDA7CisJaWYgKGFpLT53aWZpZGV2ID09IE5VTEwpCisJCWhkci5sZW4gPSAwOworCWxlbiA9IGxlMTZfdG9fY3B1KGhkci5sZW4pOworCWlmIChsZW4gPiAyMzEyKSB7CisJCXByaW50ayggS0VSTl9FUlIgImFpcm86IEJhZCBzaXplICVkXG4iLCBsZW4gKTsKKwkJZ290byBiYWRyeDsKKwl9CisJaWYgKGxlbiA9PSAwKQorCQlnb3RvIGJhZHJ4OworCisJbWVtY3B5ICgoY2hhciAqKSZmYywgcHRyLCBzaXplb2YoZmMpKTsKKwlmYyA9IGxlMTZfdG9fY3B1KGZjKTsKKwlzd2l0Y2ggKGZjICYgMHhjKSB7CisJCWNhc2UgNDoKKwkJCWlmICgoZmMgJiAweGUwKSA9PSAweGMwKQorCQkJCWhkcmxlbiA9IDEwOworCQkJZWxzZQorCQkJCWhkcmxlbiA9IDE2OworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCWlmICgoZmMmMHgzMDApPT0weDMwMCl7CisJCQkJaGRybGVuID0gMzA7CisJCQkJYnJlYWs7CisJCQl9CisJCWRlZmF1bHQ6CisJCQloZHJsZW4gPSAyNDsKKwl9CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKCBsZW4gKyBoZHJsZW4gKyAyICk7CisJaWYgKCAhc2tiICkgeworCQlhaS0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlnb3RvIGJhZHJ4OworCX0KKwlidWZmZXIgPSAodTE2Kilza2JfcHV0IChza2IsIGxlbiArIGhkcmxlbik7CisJbWVtY3B5ICgoY2hhciAqKWJ1ZmZlciwgcHRyLCBoZHJsZW4pOworCXB0ciArPSBoZHJsZW47CisJaWYgKGhkcmxlbiA9PSAyNCkKKwkJcHRyICs9IDY7CisJbWVtY3B5ICgoY2hhciAqKSZnYXAsIHB0ciwgc2l6ZW9mKGdhcCkpOworCXB0ciArPSBzaXplb2YoZ2FwKTsKKwlnYXAgPSBsZTE2X3RvX2NwdShnYXApOworCWlmIChnYXApIHsKKwkJaWYgKGdhcCA8PSA4KQorCQkJcHRyICs9IGdhcDsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgImFpcm86IGdhcGxlbiB0b28gYmlnLiBQcm9ibGVtcyB3aWxsIGZvbGxvdy4uLlxuIik7CisJfQorCW1lbWNweSAoKGNoYXIgKilidWZmZXIgKyBoZHJsZW4sIHB0ciwgbGVuKTsKKwlwdHIgKz0gbGVuOworI2lmZGVmIElXX1dJUkVMRVNTX1NQWQkgIC8qIGRlZmluZWQgaW4gaXdfaGFuZGxlci5oICovCisJaWYgKGFpLT5zcHlfZGF0YS5zcHlfbnVtYmVyID4gMCkgeworCQljaGFyICpzYTsKKwkJc3RydWN0IGl3X3F1YWxpdHkgd3N0YXRzOworCQkvKiBQcmVwYXJlIHNweSBkYXRhIDogYWRkciArIHF1YWwgKi8KKwkJc2EgPSAoY2hhciopYnVmZmVyICsgMTA7CisJCXdzdGF0cy5xdWFsID0gaGRyLnJzc2lbMF07CisJCWlmIChhaS0+cnNzaSkKKwkJCXdzdGF0cy5sZXZlbCA9IDB4MTAwIC0gYWktPnJzc2lbaGRyLnJzc2lbMV1dLnJzc2lkQm07CisJCWVsc2UKKwkJCXdzdGF0cy5sZXZlbCA9IChoZHIucnNzaVsxXSArIDMyMSkgLyAyOworCQl3c3RhdHMudXBkYXRlZCA9IDM7CisJCS8qIFVwZGF0ZSBzcHkgcmVjb3JkcyAqLworCQl3aXJlbGVzc19zcHlfdXBkYXRlKGFpLT5kZXYsIHNhLCAmd3N0YXRzKTsKKwl9CisjZW5kaWYgLyogSVdfV0lSRUxFU1NfU1BZICovCisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOworCXNrYi0+ZGV2ID0gYWktPndpZmlkZXY7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMl8yKTsKKwlza2ItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCW5ldGlmX3J4KCBza2IgKTsKK2JhZHJ4OgorCWlmIChyeGQudmFsaWQgPT0gMCkgeworCQlyeGQudmFsaWQgPSAxOworCQlyeGQucmR5ID0gMDsKKwkJcnhkLmxlbiA9IFBLVFNJWkU7CisJCW1lbWNweV90b2lvKGFpLT5yeGZpZHNbMF0uY2FyZF9yYW1fb2ZmLCAmcnhkLCBzaXplb2YocnhkKSk7CisJfQorfQorCitzdGF0aWMgdTE2IHNldHVwX2NhcmQoc3RydWN0IGFpcm9faW5mbyAqYWksIHU4ICptYWMsIGludCBsb2NrKQoreworCUNtZCBjbWQ7CisJUmVzcCByc3A7CisJaW50IHN0YXR1czsKKwlpbnQgaTsKKwlTc2lkUmlkIG15U3NpZDsKKwl1MTYgbGFzdGluZGV4OworCVdlcEtleVJpZCB3a3I7CisJaW50IHJjOworCisJbWVtc2V0KCAmbXlTc2lkLCAwLCBzaXplb2YoIG15U3NpZCApICk7CisJaWYgKGFpLT5mbGFzaCkgeworCQlrZnJlZSAoYWktPmZsYXNoKTsKKwkJYWktPmZsYXNoID0gTlVMTDsKKwl9CisKKwkvKiBUaGUgTk9QIGlzIHRoZSBmaXJzdCBzdGVwIGluIGdldHRpbmcgdGhlIGNhcmQgZ29pbmcgKi8KKwljbWQuY21kID0gTk9QOworCWNtZC5wYXJtMCA9IGNtZC5wYXJtMSA9IGNtZC5wYXJtMiA9IDA7CisJaWYgKGxvY2sgJiYgZG93bl9pbnRlcnJ1cHRpYmxlKCZhaS0+c2VtKSkKKwkJcmV0dXJuIEVSUk9SOworCWlmICggaXNzdWVjb21tYW5kKCBhaSwgJmNtZCwgJnJzcCApICE9IFNVQ0NFU1MgKSB7CisJCWlmIChsb2NrKQorCQkJdXAoJmFpLT5zZW0pOworCQlyZXR1cm4gRVJST1I7CisJfQorCWRpc2FibGVfTUFDKCBhaSwgMCk7CisKKwkvLyBMZXQncyBmaWd1cmUgb3V0IGlmIHdlIG5lZWQgdG8gdXNlIHRoZSBBVVggcG9ydAorCWlmICghdGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpIHsKKwkJY21kLmNtZCA9IENNRF9FTkFCTEVBVVg7CisJCWlmIChpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApICE9IFNVQ0NFU1MpIHsKKwkJCWlmIChsb2NrKQorCQkJCXVwKCZhaS0+c2VtKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiYWlybzogRXJyb3IgY2hlY2tpbmcgZm9yIEFVWCBwb3J0XG4iKTsKKwkJCXJldHVybiBFUlJPUjsKKwkJfQorCQlpZiAoIWF1eF9iYXAgfHwgcnNwLnN0YXR1cyAmIDB4ZmYwMCkgeworCQkJYWktPmJhcF9yZWFkID0gZmFzdF9iYXBfcmVhZDsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJhaXJvOiBEb2luZyBmYXN0IGJhcF9yZWFkc1xuIik7CisJCX0gZWxzZSB7CisJCQlhaS0+YmFwX3JlYWQgPSBhdXhfYmFwX3JlYWQ7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiYWlybzogRG9pbmcgQVVYIGJhcF9yZWFkc1xuIik7CisJCX0KKwl9CisJaWYgKGxvY2spCisJCXVwKCZhaS0+c2VtKTsKKwlpZiAoYWktPmNvbmZpZy5sZW4gPT0gMCkgeworCQl0ZHNSc3NpUmlkIHJzc2lfcmlkOworCQlDYXBhYmlsaXR5UmlkIGNhcF9yaWQ7CisKKwkJaWYgKGFpLT5BUExpc3QpIHsKKwkJCWtmcmVlKGFpLT5BUExpc3QpOworCQkJYWktPkFQTGlzdCA9IE5VTEw7CisJCX0KKwkJaWYgKGFpLT5TU0lEKSB7CisJCQlrZnJlZShhaS0+U1NJRCk7CisJCQlhaS0+U1NJRCA9IE5VTEw7CisJCX0KKwkJLy8gZ2VuZXJhbCBjb25maWd1cmF0aW9uIChyZWFkL21vZGlmeS93cml0ZSkKKwkJc3RhdHVzID0gcmVhZENvbmZpZ1JpZChhaSwgbG9jayk7CisJCWlmICggc3RhdHVzICE9IFNVQ0NFU1MgKSByZXR1cm4gRVJST1I7CisKKwkJc3RhdHVzID0gcmVhZENhcGFiaWxpdHlSaWQoYWksICZjYXBfcmlkLCBsb2NrKTsKKwkJaWYgKCBzdGF0dXMgIT0gU1VDQ0VTUyApIHJldHVybiBFUlJPUjsKKworCQlzdGF0dXMgPSBQQzQ1MDBfcmVhZHJpZChhaSxSSURfUlNTSSwmcnNzaV9yaWQsc2l6ZW9mKHJzc2lfcmlkKSxsb2NrKTsKKwkJaWYgKCBzdGF0dXMgPT0gU1VDQ0VTUyApIHsKKwkJCWlmIChhaS0+cnNzaSB8fCAoYWktPnJzc2kgPSBrbWFsbG9jKDUxMiwgR0ZQX0tFUk5FTCkpICE9IE5VTEwpCisJCQkJbWVtY3B5KGFpLT5yc3NpLCAodTgqKSZyc3NpX3JpZCArIDIsIDUxMik7CisJCX0KKwkJZWxzZSB7CisJCQlpZiAoYWktPnJzc2kpIHsKKwkJCQlrZnJlZShhaS0+cnNzaSk7CisJCQkJYWktPnJzc2kgPSBOVUxMOworCQkJfQorCQkJaWYgKGNhcF9yaWQuc29mdENhcCAmIDgpCisJCQkJYWktPmNvbmZpZy5ybW9kZSB8PSBSWE1PREVfTk9STUFMSVpFRF9SU1NJOworCQkJZWxzZQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFpcm86IHVua25vd24gcmVjZWl2ZWQgc2lnbmFsIGxldmVsIHNjYWxlXG4iKTsKKwkJfQorCQlhaS0+Y29uZmlnLm9wbW9kZSA9IGFkaG9jID8gTU9ERV9TVEFfSUJTUyA6IE1PREVfU1RBX0VTUzsKKwkJYWktPmNvbmZpZy5hdXRoVHlwZSA9IEFVVEhfT1BFTjsKKwkJYWktPmNvbmZpZy5tb2R1bGF0aW9uID0gTU9EX0NDSzsKKworI2lmZGVmIE1JQ1NVUFBPUlQKKwkJaWYgKChjYXBfcmlkLmxlbj49c2l6ZW9mKGNhcF9yaWQpKSAmJiAoY2FwX3JpZC5leHRTb2Z0Q2FwJjEpICYmCisJCSAgICAobWljc2V0dXAoYWkpID09IFNVQ0NFU1MpKSB7CisJCQlhaS0+Y29uZmlnLm9wbW9kZSB8PSBNT0RFX01JQzsKKwkJCXNldF9iaXQoRkxBR19NSUNfQ0FQQUJMRSwgJmFpLT5mbGFncyk7CisJCX0KKyNlbmRpZgorCisJCS8qIFNhdmUgb2ZmIHRoZSBNQUMgKi8KKwkJZm9yKCBpID0gMDsgaSA8IEVUSF9BTEVOOyBpKysgKSB7CisJCQltYWNbaV0gPSBhaS0+Y29uZmlnLm1hY0FkZHJbaV07CisJCX0KKworCQkvKiBDaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBpbnNtb2QgY29uZmlndXJlZAorCQkgICByYXRlcyB0byBhZGQgKi8KKwkJaWYgKCByYXRlc1swXSApIHsKKwkJCWludCBpID0gMDsKKwkJCW1lbXNldChhaS0+Y29uZmlnLnJhdGVzLDAsc2l6ZW9mKGFpLT5jb25maWcucmF0ZXMpKTsKKwkJCWZvciggaSA9IDA7IGkgPCA4ICYmIHJhdGVzW2ldOyBpKysgKSB7CisJCQkJYWktPmNvbmZpZy5yYXRlc1tpXSA9IHJhdGVzW2ldOworCQkJfQorCQl9CisJCWlmICggYmFzaWNfcmF0ZSA+IDAgKSB7CisJCQlpbnQgaTsKKwkJCWZvciggaSA9IDA7IGkgPCA4OyBpKysgKSB7CisJCQkJaWYgKCBhaS0+Y29uZmlnLnJhdGVzW2ldID09IGJhc2ljX3JhdGUgfHwKKwkJCQkgICAgICFhaS0+Y29uZmlnLnJhdGVzICkgeworCQkJCQlhaS0+Y29uZmlnLnJhdGVzW2ldID0gYmFzaWNfcmF0ZSB8IDB4ODA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJfQorCisJLyogU2V0dXAgdGhlIFNTSURzIGlmIHByZXNlbnQgKi8KKwlpZiAoIHNzaWRzWzBdICkgeworCQlpbnQgaTsKKwkJZm9yKCBpID0gMDsgaSA8IDMgJiYgc3NpZHNbaV07IGkrKyApIHsKKwkJCW15U3NpZC5zc2lkc1tpXS5sZW4gPSBzdHJsZW4oc3NpZHNbaV0pOworCQkJaWYgKCBteVNzaWQuc3NpZHNbaV0ubGVuID4gMzIgKQorCQkJCW15U3NpZC5zc2lkc1tpXS5sZW4gPSAzMjsKKwkJCW1lbWNweShteVNzaWQuc3NpZHNbaV0uc3NpZCwgc3NpZHNbaV0sCisJCQkgICAgICAgbXlTc2lkLnNzaWRzW2ldLmxlbik7CisJCX0KKwkJbXlTc2lkLmxlbiA9IHNpemVvZihteVNzaWQpOworCX0KKworCXN0YXR1cyA9IHdyaXRlQ29uZmlnUmlkKGFpLCBsb2NrKTsKKwlpZiAoIHN0YXR1cyAhPSBTVUNDRVNTICkgcmV0dXJuIEVSUk9SOworCisJLyogU2V0IHVwIHRoZSBTU0lEIGxpc3QgKi8KKwlpZiAoIHNzaWRzWzBdICkgeworCQlzdGF0dXMgPSB3cml0ZVNzaWRSaWQoYWksICZteVNzaWQsIGxvY2spOworCQlpZiAoIHN0YXR1cyAhPSBTVUNDRVNTICkgcmV0dXJuIEVSUk9SOworCX0KKworCXN0YXR1cyA9IGVuYWJsZV9NQUMoYWksICZyc3AsIGxvY2spOworCWlmICggc3RhdHVzICE9IFNVQ0NFU1MgfHwgKHJzcC5zdGF0dXMgJiAweEZGMDApICE9IDApIHsKKwkJcHJpbnRrKCBLRVJOX0VSUiAiYWlybzogQmFkIE1BQyBlbmFibGUgcmVhc29uID0gJXgsIHJpZCA9ICV4LCBvZmZzZXQgPSAlZFxuIiwgcnNwLnJzcDAsIHJzcC5yc3AxLCByc3AucnNwMiApOworCQlyZXR1cm4gRVJST1I7CisJfQorCisJLyogR3JhYiB0aGUgaW5pdGlhbCB3ZXAga2V5LCB3ZSBnb3R0YSBzYXZlIGl0IGZvciBhdXRvX3dlcCAqLworCXJjID0gcmVhZFdlcEtleVJpZChhaSwgJndrciwgMSwgbG9jayk7CisJaWYgKHJjID09IFNVQ0NFU1MpIGRvIHsKKwkJbGFzdGluZGV4ID0gd2tyLmtpbmRleDsKKwkJaWYgKHdrci5raW5kZXggPT0gMHhmZmZmKSB7CisJCQlhaS0+ZGVmaW5kZXggPSB3a3IubWFjWzBdOworCQl9CisJCXJjID0gcmVhZFdlcEtleVJpZChhaSwgJndrciwgMCwgbG9jayk7CisJfSB3aGlsZShsYXN0aW5kZXggIT0gd2tyLmtpbmRleCk7CisKKwlpZiAoYXV0b193ZXApIHsKKwkJYWktPmV4cGlyZXMgPSBSVU5fQVQoMypIWik7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYWktPnRocl93YWl0KTsKKwl9CisKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIHUxNiBpc3N1ZWNvbW1hbmQoc3RydWN0IGFpcm9faW5mbyAqYWksIENtZCAqcENtZCwgUmVzcCAqcFJzcCkgeworICAgICAgICAvLyBJbSByZWFsbHkgcGFyYW5vaWQgYWJvdXQgbGV0dGluZyBpdCBydW4gZm9yZXZlciEKKwlpbnQgbWF4X3RyaWVzID0gNjAwMDAwOworCisJaWYgKElONDUwMChhaSwgRVZTVEFUKSAmIEVWX0NNRCkKKwkJT1VUNDUwMChhaSwgRVZBQ0ssIEVWX0NNRCk7CisKKwlPVVQ0NTAwKGFpLCBQQVJBTTAsIHBDbWQtPnBhcm0wKTsKKwlPVVQ0NTAwKGFpLCBQQVJBTTEsIHBDbWQtPnBhcm0xKTsKKwlPVVQ0NTAwKGFpLCBQQVJBTTIsIHBDbWQtPnBhcm0yKTsKKwlPVVQ0NTAwKGFpLCBDT01NQU5ELCBwQ21kLT5jbWQpOworCisJd2hpbGUgKG1heF90cmllcy0tICYmIChJTjQ1MDAoYWksIEVWU1RBVCkgJiBFVl9DTUQpID09IDApIHsKKwkJaWYgKChJTjQ1MDAoYWksIENPTU1BTkQpKSA9PSBwQ21kLT5jbWQpCisJCQkvLyBQQzQ1MDAgZGlkbid0IG5vdGljZSBjb21tYW5kLCB0cnkgYWdhaW4KKwkJCU9VVDQ1MDAoYWksIENPTU1BTkQsIHBDbWQtPmNtZCk7CisJCWlmICghaW5fYXRvbWljKCkgJiYgKG1heF90cmllcyAmIDI1NSkgPT0gMCkKKwkJCXNjaGVkdWxlKCk7CisJfQorCisJaWYgKCBtYXhfdHJpZXMgPT0gLTEgKSB7CisJCXByaW50ayggS0VSTl9FUlIKKwkJCSJhaXJvOiBNYXggdHJpZXMgZXhjZWVkZWQgd2hlbiBpc3N1ZWluZyBjb21tYW5kXG4iICk7CisJCWlmIChJTjQ1MDAoYWksIENPTU1BTkQpICYgQ09NTUFORF9CVVNZKQorCQkJT1VUNDUwMChhaSwgRVZBQ0ssIEVWX0NMRUFSQ09NTUFOREJVU1kpOworCQlyZXR1cm4gRVJST1I7CisJfQorCisJLy8gY29tbWFuZCBjb21wbGV0ZWQKKwlwUnNwLT5zdGF0dXMgPSBJTjQ1MDAoYWksIFNUQVRVUyk7CisJcFJzcC0+cnNwMCA9IElONDUwMChhaSwgUkVTUDApOworCXBSc3AtPnJzcDEgPSBJTjQ1MDAoYWksIFJFU1AxKTsKKwlwUnNwLT5yc3AyID0gSU40NTAwKGFpLCBSRVNQMik7CisJaWYgKChwUnNwLT5zdGF0dXMgJiAweGZmMDApIT0wICYmIHBDbWQtPmNtZCAhPSBDTURfU09GVFJFU0VUKSB7CisJCXByaW50ayAoS0VSTl9FUlIgImFpcm86IGNtZD0gJXhcbiIsIHBDbWQtPmNtZCk7CisJCXByaW50ayAoS0VSTl9FUlIgImFpcm86IHN0YXR1cz0gJXhcbiIsIHBSc3AtPnN0YXR1cyk7CisJCXByaW50ayAoS0VSTl9FUlIgImFpcm86IFJzcDA9ICV4XG4iLCBwUnNwLT5yc3AwKTsKKwkJcHJpbnRrIChLRVJOX0VSUiAiYWlybzogUnNwMT0gJXhcbiIsIHBSc3AtPnJzcDEpOworCQlwcmludGsgKEtFUk5fRVJSICJhaXJvOiBSc3AyPSAleFxuIiwgcFJzcC0+cnNwMik7CisJfQorCisJLy8gY2xlYXIgc3R1Y2sgY29tbWFuZCBidXN5IGlmIG5lY2Vzc2FyeQorCWlmIChJTjQ1MDAoYWksIENPTU1BTkQpICYgQ09NTUFORF9CVVNZKSB7CisJCU9VVDQ1MDAoYWksIEVWQUNLLCBFVl9DTEVBUkNPTU1BTkRCVVNZKTsKKwl9CisJLy8gYWNrbm93bGVkZ2UgcHJvY2Vzc2luZyB0aGUgc3RhdHVzL3Jlc3BvbnNlCisJT1VUNDUwMChhaSwgRVZBQ0ssIEVWX0NNRCk7CisKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyogU2V0cyB1cCB0aGUgYmFwIHRvIHN0YXJ0IGV4Y2hhbmdlIGRhdGEuICB3aGljaGJhcCBzaG91bGQKKyAqIGJlIG9uZSBvZiB0aGUgQkFQMCBvciBCQVAxIGRlZmluZXMuICBMb2NrcyBzaG91bGQgYmUgaGVsZCBiZWZvcmUKKyAqIGNhbGxpbmchICovCitzdGF0aWMgaW50IGJhcF9zZXR1cChzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTE2IHJpZCwgdTE2IG9mZnNldCwgaW50IHdoaWNoYmFwICkKK3sKKwlpbnQgdGltZW91dCA9IDUwOworCWludCBtYXhfdHJpZXMgPSAzOworCisJT1VUNDUwMChhaSwgU0VMRUNUMCt3aGljaGJhcCwgcmlkKTsKKwlPVVQ0NTAwKGFpLCBPRkZTRVQwK3doaWNoYmFwLCBvZmZzZXQpOworCXdoaWxlICgxKSB7CisJCWludCBzdGF0dXMgPSBJTjQ1MDAoYWksIE9GRlNFVDArd2hpY2hiYXApOworCQlpZiAoc3RhdHVzICYgQkFQX0JVU1kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXNuJ3QgcmVhbGx5IGEgdGltZW91dCwgYnV0IGl0cyBraW5kYQorCQkJICAgY2xvc2UgKi8KKwkJCWlmICh0aW1lb3V0LS0pIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfSBlbHNlIGlmICggc3RhdHVzICYgQkFQX0VSUiApIHsKKwkJCS8qIGludmFsaWQgcmlkIG9yIG9mZnNldCAqLworCQkJcHJpbnRrKCBLRVJOX0VSUiAiYWlybzogQkFQIGVycm9yICV4ICVkXG4iLAorCQkJCXN0YXR1cywgd2hpY2hiYXAgKTsKKwkJCXJldHVybiBFUlJPUjsKKwkJfSBlbHNlIGlmIChzdGF0dXMgJiBCQVBfRE9ORSkgeyAvLyBzdWNjZXNzCisJCQlyZXR1cm4gU1VDQ0VTUzsKKwkJfQorCQlpZiAoICEobWF4X3RyaWVzLS0pICkgeworCQkJcHJpbnRrKCBLRVJOX0VSUgorCQkJCSJhaXJvOiBCQVAgc2V0dXAgZXJyb3IgdG9vIG1hbnkgcmV0cmllc1xuIiApOworCQkJcmV0dXJuIEVSUk9SOworCQl9CisJCS8vIC0tIFBDNDUwMCBtaXNzZWQgaXQsIHRyeSBhZ2FpbgorCQlPVVQ0NTAwKGFpLCBTRUxFQ1QwK3doaWNoYmFwLCByaWQpOworCQlPVVQ0NTAwKGFpLCBPRkZTRVQwK3doaWNoYmFwLCBvZmZzZXQpOworCQl0aW1lb3V0ID0gNTA7CisJfQorfQorCisvKiBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgYXV4X2JhcF9yZWFkLiAgVGhpcyBhdXggZnVuY3Rpb24gYW5kIHRoZQorICAgZm9sbG93aW5nIHVzZSBjb25jZXB0cyBub3QgZG9jdW1lbnRlZCBpbiB0aGUgZGV2ZWxvcGVycyBndWlkZS4gIEkKKyAgIGdvdCB0aGVtIGZyb20gYSBwYXRjaCBnaXZlbiB0byBteSBieSBBaXJvbmV0ICovCitzdGF0aWMgdTE2IGF1eF9zZXR1cChzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTE2IHBhZ2UsCisJCSAgICAgdTE2IG9mZnNldCwgdTE2ICpsZW4pCit7CisJdTE2IG5leHQ7CisKKwlPVVQ0NTAwKGFpLCBBVVhQQUdFLCBwYWdlKTsKKwlPVVQ0NTAwKGFpLCBBVVhPRkYsIDApOworCW5leHQgPSBJTjQ1MDAoYWksIEFVWERBVEEpOworCSpsZW4gPSBJTjQ1MDAoYWksIEFVWERBVEEpJjB4ZmY7CisJaWYgKG9mZnNldCAhPSA0KSBPVVQ0NTAwKGFpLCBBVVhPRkYsIG9mZnNldCk7CisJcmV0dXJuIG5leHQ7Cit9CisKKy8qIHJlcXVpcmVzIGNhbGwgdG8gYmFwX3NldHVwKCkgZmlyc3QgKi8KK3N0YXRpYyBpbnQgYXV4X2JhcF9yZWFkKHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MTYgKnB1MTZEc3QsCisJCQlpbnQgYnl0ZWxlbiwgaW50IHdoaWNoYmFwKQoreworCXUxNiBsZW47CisJdTE2IHBhZ2U7CisJdTE2IG9mZnNldDsKKwl1MTYgbmV4dDsKKwlpbnQgd29yZHM7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhaS0+YXV4X2xvY2ssIGZsYWdzKTsKKwlwYWdlID0gSU40NTAwKGFpLCBTV1MwK3doaWNoYmFwKTsKKwlvZmZzZXQgPSBJTjQ1MDAoYWksIFNXUzIrd2hpY2hiYXApOworCW5leHQgPSBhdXhfc2V0dXAoYWksIHBhZ2UsIG9mZnNldCwgJmxlbik7CisJd29yZHMgPSAoYnl0ZWxlbisxKT4+MTsKKworCWZvciAoaT0wOyBpPHdvcmRzOykgeworCQlpbnQgY291bnQ7CisJCWNvdW50ID0gKGxlbj4+MSkgPCAod29yZHMtaSkgPyAobGVuPj4xKSA6ICh3b3Jkcy1pKTsKKwkJaWYgKCAhZG84Yml0SU8gKQorCQkJaW5zdyggYWktPmRldi0+YmFzZV9hZGRyK0RBVEEwK3doaWNoYmFwLAorCQkJICAgICAgcHUxNkRzdCtpLGNvdW50ICk7CisJCWVsc2UKKwkJCWluc2IoIGFpLT5kZXYtPmJhc2VfYWRkcitEQVRBMCt3aGljaGJhcCwKKwkJCSAgICAgIHB1MTZEc3QraSwgY291bnQgPDwgMSApOworCQlpICs9IGNvdW50OworCQlpZiAoaTx3b3JkcykgeworCQkJbmV4dCA9IGF1eF9zZXR1cChhaSwgbmV4dCwgNCwgJmxlbik7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWktPmF1eF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKworLyogcmVxdWlyZXMgY2FsbCB0byBiYXBfc2V0dXAoKSBmaXJzdCAqLworc3RhdGljIGludCBmYXN0X2JhcF9yZWFkKHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MTYgKnB1MTZEc3QsCisJCQkgaW50IGJ5dGVsZW4sIGludCB3aGljaGJhcCkKK3sKKwlieXRlbGVuID0gKGJ5dGVsZW4gKyAxKSAmICh+MSk7IC8vIHJvdW5kIHVwIHRvIGV2ZW4gdmFsdWUKKwlpZiAoICFkbzhiaXRJTyApCisJCWluc3coIGFpLT5kZXYtPmJhc2VfYWRkcitEQVRBMCt3aGljaGJhcCwgcHUxNkRzdCwgYnl0ZWxlbj4+MSApOworCWVsc2UKKwkJaW5zYiggYWktPmRldi0+YmFzZV9hZGRyK0RBVEEwK3doaWNoYmFwLCBwdTE2RHN0LCBieXRlbGVuICk7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qIHJlcXVpcmVzIGNhbGwgdG8gYmFwX3NldHVwKCkgZmlyc3QgKi8KK3N0YXRpYyBpbnQgYmFwX3dyaXRlKHN0cnVjdCBhaXJvX2luZm8gKmFpLCBjb25zdCB1MTYgKnB1MTZTcmMsCisJCSAgICAgaW50IGJ5dGVsZW4sIGludCB3aGljaGJhcCkKK3sKKwlieXRlbGVuID0gKGJ5dGVsZW4gKyAxKSAmICh+MSk7IC8vIHJvdW5kIHVwIHRvIGV2ZW4gdmFsdWUKKwlpZiAoICFkbzhiaXRJTyApCisJCW91dHN3KCBhaS0+ZGV2LT5iYXNlX2FkZHIrREFUQTArd2hpY2hiYXAsCisJCSAgICAgICBwdTE2U3JjLCBieXRlbGVuPj4xICk7CisJZWxzZQorCQlvdXRzYiggYWktPmRldi0+YmFzZV9hZGRyK0RBVEEwK3doaWNoYmFwLCBwdTE2U3JjLCBieXRlbGVuICk7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgUEM0NTAwX2FjY2Vzc3JpZChzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTE2IHJpZCwgdTE2IGFjY21kKQoreworCUNtZCBjbWQ7IC8qIGZvciBpc3N1aW5nIGNvbW1hbmRzICovCisJUmVzcCByc3A7IC8qIHJlc3BvbnNlIGZyb20gY29tbWFuZHMgKi8KKwl1MTYgc3RhdHVzOworCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwljbWQuY21kID0gYWNjbWQ7CisJY21kLnBhcm0wID0gcmlkOworCXN0YXR1cyA9IGlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCk7CisJaWYgKHN0YXR1cyAhPSAwKSByZXR1cm4gc3RhdHVzOworCWlmICggKHJzcC5zdGF0dXMgJiAweDdGMDApICE9IDApIHsKKwkJcmV0dXJuIChhY2NtZCA8PCA4KSArIChyc3AucnNwMCAmIDB4RkYpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogIE5vdGUsIHRoYXQgd2UgYXJlIHVzaW5nIEJBUDEgd2hpY2ggaXMgYWxzbyB1c2VkIGJ5IHRyYW5zbWl0LCBzbworICogIHdlIG11c3QgZ2V0IGEgbG9jay4gKi8KK3N0YXRpYyBpbnQgUEM0NTAwX3JlYWRyaWQoc3RydWN0IGFpcm9faW5mbyAqYWksIHUxNiByaWQsIHZvaWQgKnBCdWYsIGludCBsZW4sIGludCBsb2NrKQoreworCXUxNiBzdGF0dXM7CisgICAgICAgIGludCByYyA9IFNVQ0NFU1M7CisKKwlpZiAobG9jaykgeworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhaS0+c2VtKSkKKwkJCXJldHVybiBFUlJPUjsKKwl9CisJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCZhaS0+ZmxhZ3MpKSB7CisJCUNtZCBjbWQ7CisJCVJlc3AgcnNwOworCisJCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJCW1lbXNldCgmcnNwLCAwLCBzaXplb2YocnNwKSk7CisJCWFpLT5jb25maWdfZGVzYy5yaWRfZGVzYy52YWxpZCA9IDE7CisJCWFpLT5jb25maWdfZGVzYy5yaWRfZGVzYy5sZW4gPSBSSURTSVpFOworCQlhaS0+Y29uZmlnX2Rlc2MucmlkX2Rlc2MucmlkID0gMDsKKwkJYWktPmNvbmZpZ19kZXNjLnJpZF9kZXNjLmhvc3RfYWRkciA9IGFpLT5yaWRidXM7CisKKwkJY21kLmNtZCA9IENNRF9BQ0NFU1M7CisJCWNtZC5wYXJtMCA9IHJpZDsKKworCQltZW1jcHlfdG9pbyhhaS0+Y29uZmlnX2Rlc2MuY2FyZF9yYW1fb2ZmLAorCQkJJmFpLT5jb25maWdfZGVzYy5yaWRfZGVzYywgc2l6ZW9mKFJpZCkpOworCisJCXJjID0gaXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKTsKKworCQlpZiAocnNwLnN0YXR1cyAmIDB4N2YwMCkKKwkJCXJjID0gcnNwLnJzcDA7CisJCWlmICghcmMpCisJCQltZW1jcHkocEJ1ZiwgYWktPmNvbmZpZ19kZXNjLnZpcnR1YWxfaG9zdF9hZGRyLCBsZW4pOworCQlnb3RvIGRvbmU7CisJfSBlbHNlIHsKKwkJaWYgKChzdGF0dXMgPSBQQzQ1MDBfYWNjZXNzcmlkKGFpLCByaWQsIENNRF9BQ0NFU1MpKSE9U1VDQ0VTUykgeworCSAgICAgICAgICAgICAgICByYyA9IHN0YXR1czsKKwkgICAgICAgICAgICAgICAgZ290byBkb25lOworCSAgICAgICAgfQorCQlpZiAoYmFwX3NldHVwKGFpLCByaWQsIDAsIEJBUDEpICE9IFNVQ0NFU1MpIHsKKwkJCXJjID0gRVJST1I7CisJICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKwkgICAgICAgIH0KKwkJLy8gcmVhZCB0aGUgcmlkIGxlbmd0aCBmaWVsZAorCQliYXBfcmVhZChhaSwgcEJ1ZiwgMiwgQkFQMSk7CisJCS8vIGxlbmd0aCBmb3IgcmVtYWluaW5nIHBhcnQgb2YgcmlkCisJCWxlbiA9IG1pbihsZW4sIChpbnQpbGUxNl90b19jcHUoKih1MTYqKXBCdWYpKSAtIDI7CisKKwkJaWYgKCBsZW4gPD0gMiApIHsKKwkJCXByaW50ayggS0VSTl9FUlIKKwkJCSJhaXJvOiBSaWQgJXggaGFzIGEgbGVuZ3RoIG9mICVkIHdoaWNoIGlzIHRvbyBzaG9ydFxuIiwKKwkJCQkoaW50KXJpZCwgKGludClsZW4gKTsKKwkJCXJjID0gRVJST1I7CisJICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKwkJfQorCQkvLyByZWFkIHJlbWFpbmRlciBvZiB0aGUgcmlkCisJCXJjID0gYmFwX3JlYWQoYWksICgodTE2KilwQnVmKSsxLCBsZW4sIEJBUDEpOworCX0KK2RvbmU6CisJaWYgKGxvY2spCisJCXVwKCZhaS0+c2VtKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qICBOb3RlLCB0aGF0IHdlIGFyZSB1c2luZyBCQVAxIHdoaWNoIGlzIGFsc28gdXNlZCBieSB0cmFuc21pdCwgc28KKyAqICBtYWtlIHN1cmUgdGhpcyBpc250IGNhbGxlZCB3aGVuIGEgdHJhbnNtaXQgaXMgaGFwcGVuaW5nICovCitzdGF0aWMgaW50IFBDNDUwMF93cml0ZXJpZChzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTE2IHJpZCwKKwkJCSAgIGNvbnN0IHZvaWQgKnBCdWYsIGludCBsZW4sIGludCBsb2NrKQoreworCXUxNiBzdGF0dXM7CisJaW50IHJjID0gU1VDQ0VTUzsKKworCSoodTE2KilwQnVmID0gY3B1X3RvX2xlMTYoKHUxNilsZW4pOworCisJaWYgKGxvY2spIHsKKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYWktPnNlbSkpCisJCQlyZXR1cm4gRVJST1I7CisJfQorCWlmICh0ZXN0X2JpdChGTEFHX01QSSwmYWktPmZsYWdzKSkgeworCQlDbWQgY21kOworCQlSZXNwIHJzcDsKKworCQlpZiAodGVzdF9iaXQoRkxBR19FTkFCTEVELCAmYWktPmZsYWdzKSkKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSIlczogTUFDIHNob3VsZCBiZSBkaXNhYmxlZCAocmlkPSUwNHgpXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgcmlkKTsKKwkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwkJbWVtc2V0KCZyc3AsIDAsIHNpemVvZihyc3ApKTsKKworCQlhaS0+Y29uZmlnX2Rlc2MucmlkX2Rlc2MudmFsaWQgPSAxOworCQlhaS0+Y29uZmlnX2Rlc2MucmlkX2Rlc2MubGVuID0gKigodTE2ICopcEJ1Zik7CisJCWFpLT5jb25maWdfZGVzYy5yaWRfZGVzYy5yaWQgPSAwOworCisJCWNtZC5jbWQgPSBDTURfV1JJVEVSSUQ7CisJCWNtZC5wYXJtMCA9IHJpZDsKKworCQltZW1jcHlfdG9pbyhhaS0+Y29uZmlnX2Rlc2MuY2FyZF9yYW1fb2ZmLAorCQkJJmFpLT5jb25maWdfZGVzYy5yaWRfZGVzYywgc2l6ZW9mKFJpZCkpOworCisJCWlmIChsZW4gPCA0IHx8IGxlbiA+IDIwNDcpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGxlbj0lZFxuIixfX0ZVTkNUSU9OX18sbGVuKTsKKwkJCXJjID0gLTE7CisJCX0gZWxzZSB7CisJCQltZW1jcHkoKGNoYXIgKilhaS0+Y29uZmlnX2Rlc2MudmlydHVhbF9ob3N0X2FkZHIsCisJCQkJcEJ1ZiwgbGVuKTsKKworCQkJcmMgPSBpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApOworCQkJaWYgKChyYyAmIDB4ZmYwMCkgIT0gMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFdyaXRlIHJpZCBFcnJvciAlZFxuIiwKKwkJCQkJX19GVU5DVElPTl9fLHJjKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDbWQ9JTA0eFxuIiwKKwkJCQkJCV9fRlVOQ1RJT05fXyxjbWQuY21kKTsKKwkJCX0KKworCQkJaWYgKChyc3Auc3RhdHVzICYgMHg3ZjAwKSkKKwkJCQlyYyA9IHJzcC5yc3AwOworCQl9CisJfSBlbHNlIHsKKwkJLy8gLS0tIGZpcnN0IGFjY2VzcyBzbyB0aGF0IHdlIGNhbiB3cml0ZSB0aGUgcmlkIGRhdGEKKwkJaWYgKCAoc3RhdHVzID0gUEM0NTAwX2FjY2Vzc3JpZChhaSwgcmlkLCBDTURfQUNDRVNTKSkgIT0gMCkgeworCSAgICAgICAgICAgICAgICByYyA9IHN0YXR1czsKKwkgICAgICAgICAgICAgICAgZ290byBkb25lOworCSAgICAgICAgfQorCQkvLyAtLS0gbm93IHdyaXRlIHRoZSByaWQgZGF0YQorCQlpZiAoYmFwX3NldHVwKGFpLCByaWQsIDAsIEJBUDEpICE9IFNVQ0NFU1MpIHsKKwkgICAgICAgICAgICAgICAgcmMgPSBFUlJPUjsKKwkgICAgICAgICAgICAgICAgZ290byBkb25lOworCSAgICAgICAgfQorCQliYXBfd3JpdGUoYWksIHBCdWYsIGxlbiwgQkFQMSk7CisJCS8vIC0tLW5vdyBjb21taXQgdGhlIHJpZCBkYXRhCisJCXJjID0gUEM0NTAwX2FjY2Vzc3JpZChhaSwgcmlkLCAweDEwMHxDTURfQUNDRVNTKTsKKwl9Citkb25lOgorCWlmIChsb2NrKQorCQl1cCgmYWktPnNlbSk7CisgICAgICAgIHJldHVybiByYzsKK30KKworLyogQWxsb2NhdGVzIGEgRklEIHRvIGJlIHVzZWQgZm9yIHRyYW5zbWl0dGluZyBwYWNrZXRzLiAgV2Ugb25seSB1c2UKKyAgIG9uZSBmb3Igbm93LiAqLworc3RhdGljIHUxNiB0cmFuc21pdF9hbGxvY2F0ZShzdHJ1Y3QgYWlyb19pbmZvICphaSwgaW50IGxlblBheWxvYWQsIGludCByYXcpCit7CisJdW5zaWduZWQgaW50IGxvb3AgPSAzMDAwOworCUNtZCBjbWQ7CisJUmVzcCByc3A7CisJdTE2IHR4RmlkOworCXUxNiB0eENvbnRyb2w7CisKKwljbWQuY21kID0gQ01EX0FMTE9DQVRFVFg7CisJY21kLnBhcm0wID0gbGVuUGF5bG9hZDsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhaS0+c2VtKSkKKwkJcmV0dXJuIEVSUk9SOworCWlmIChpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApICE9IFNVQ0NFU1MpIHsKKwkJdHhGaWQgPSBFUlJPUjsKKwkJZ290byBkb25lOworCX0KKwlpZiAoIChyc3Auc3RhdHVzICYgMHhGRjAwKSAhPSAwKSB7CisJCXR4RmlkID0gRVJST1I7CisJCWdvdG8gZG9uZTsKKwl9CisJLyogd2FpdCBmb3IgdGhlIGFsbG9jYXRlIGV2ZW50L2luZGljYXRpb24KKwkgKiBJdCBtYWtlcyBtZSBraW5kIG9mIG5lcnZvdXMgdGhhdCB0aGlzIGNhbiBqdXN0IHNpdCBoZXJlIGFuZCBzcGluLAorCSAqIGJ1dCBpbiBwcmFjdGljZSBpdCBvbmx5IGxvb3BzIGxpa2UgZm91ciB0aW1lcy4gKi8KKwl3aGlsZSAoKChJTjQ1MDAoYWksIEVWU1RBVCkgJiBFVl9BTExPQykgPT0gMCkgJiYgLS1sb29wKTsKKwlpZiAoIWxvb3ApIHsKKwkJdHhGaWQgPSBFUlJPUjsKKwkJZ290byBkb25lOworCX0KKworCS8vIGdldCB0aGUgYWxsb2NhdGVkIGZpZCBhbmQgYWNrbm93bGVkZ2UKKwl0eEZpZCA9IElONDUwMChhaSwgVFhBTExPQ0ZJRCk7CisJT1VUNDUwMChhaSwgRVZBQ0ssIEVWX0FMTE9DKTsKKworCS8qICBUaGUgQ0FSRCBpcyBwcmV0dHkgY29vbCBzaW5jZSBpdCBjb252ZXJ0cyB0aGUgZXRoZXJuZXQgcGFja2V0CisJICogIGludG8gODAyLjExLiAgQWxzbyBub3RlIHRoYXQgd2UgZG9uJ3QgcmVsZWFzZSB0aGUgRklEIHNpbmNlIHdlCisJICogIHdpbGwgYmUgdXNpbmcgdGhlIHNhbWUgb25lIG92ZXIgYW5kIG92ZXIgYWdhaW4uICovCisJLyogIFdlIG9ubHkgaGF2ZSB0byBzZXR1cCB0aGUgY29udHJvbCBvbmNlIHNpbmNlIHdlIGFyZSBub3QKKwkgKiAgcmVsZWFzaW5nIHRoZSBmaWQuICovCisJaWYgKHJhdykKKwkJdHhDb250cm9sID0gY3B1X3RvX2xlMTYoVFhDVExfVFhPSyB8IFRYQ1RMX1RYRVggfCBUWENUTF84MDJfMTEKKwkJCXwgVFhDVExfRVRIRVJORVQgfCBUWENUTF9OT1JFTEVBU0UpOworCWVsc2UKKwkJdHhDb250cm9sID0gY3B1X3RvX2xlMTYoVFhDVExfVFhPSyB8IFRYQ1RMX1RYRVggfCBUWENUTF84MDJfMworCQkJfCBUWENUTF9FVEhFUk5FVCB8IFRYQ1RMX05PUkVMRUFTRSk7CisJaWYgKGJhcF9zZXR1cChhaSwgdHhGaWQsIDB4MDAwOCwgQkFQMSkgIT0gU1VDQ0VTUykKKwkJdHhGaWQgPSBFUlJPUjsKKwllbHNlCisJCWJhcF93cml0ZShhaSwgJnR4Q29udHJvbCwgc2l6ZW9mKHR4Q29udHJvbCksIEJBUDEpOworCitkb25lOgorCXVwKCZhaS0+c2VtKTsKKworCXJldHVybiB0eEZpZDsKK30KKworLyogSW4gZ2VuZXJhbCBCQVAxIGlzIGRlZGljYXRlZCB0byB0cmFuc21pdGluZyBwYWNrZXRzLiAgSG93ZXZlciwKKyAgIHNpbmNlIHdlIG5lZWQgYSBCQVAgd2hlbiBhY2Nlc3NpbmcgUklEcywgd2UgYWxzbyB1c2UgQkFQMSBmb3IgdGhhdC4KKyAgIE1ha2Ugc3VyZSB0aGUgQkFQMSBzcGlubG9jayBpcyBoZWxkIHdoZW4gdGhpcyBpcyBjYWxsZWQuICovCitzdGF0aWMgaW50IHRyYW5zbWl0XzgwMl8zX3BhY2tldChzdHJ1Y3QgYWlyb19pbmZvICphaSwgaW50IGxlbiwgY2hhciAqcFBhY2tldCkKK3sKKwl1MTYgcGF5bG9hZExlbjsKKwlDbWQgY21kOworCVJlc3AgcnNwOworCWludCBtaWNsZW4gPSAwOworCXUxNiB0eEZpZCA9IGxlbjsKKwlNSUNCdWZmZXIgcE1pYzsKKworCWxlbiA+Pj0gMTY7CisKKwlpZiAobGVuIDw9IEVUSF9BTEVOICogMikgeworCQlwcmludGsoIEtFUk5fV0FSTklORyAiU2hvcnQgcGFja2V0ICVkXG4iLCBsZW4gKTsKKwkJcmV0dXJuIEVSUk9SOworCX0KKwlsZW4gLT0gRVRIX0FMRU4gKiAyOworCisjaWZkZWYgTUlDU1VQUE9SVAorCWlmICh0ZXN0X2JpdChGTEFHX01JQ19DQVBBQkxFLCAmYWktPmZsYWdzKSAmJiBhaS0+bWljc3RhdHMuZW5hYmxlZCAmJiAKKwkgICAgKG50b2hzKCgodTE2ICopcFBhY2tldClbNl0pICE9IDB4ODg4RSkpIHsKKwkJaWYgKGVuY2Fwc3VsYXRlKGFpLChldGhlckhlYWQgKilwUGFja2V0LCZwTWljLGxlbikgIT0gU1VDQ0VTUykKKwkJCXJldHVybiBFUlJPUjsKKwkJbWljbGVuID0gc2l6ZW9mKHBNaWMpOworCX0KKyNlbmRpZgorCisJLy8gcGFja2V0IGlzIGRlc3RpbmF0aW9uWzZdLCBzb3VyY2VbNl0sIHBheWxvYWRbbGVuLTEyXQorCS8vIHdyaXRlIHRoZSBwYXlsb2FkIGxlbmd0aCBhbmQgZHN0L3NyYy9wYXlsb2FkCisJaWYgKGJhcF9zZXR1cChhaSwgdHhGaWQsIDB4MDAzNiwgQkFQMSkgIT0gU1VDQ0VTUykgcmV0dXJuIEVSUk9SOworCS8qIFRoZSBoYXJkd2FyZSBhZGRyZXNzZXMgYXJlbid0IGNvdW50ZWQgYXMgcGFydCBvZiB0aGUgcGF5bG9hZCwgc28KKwkgKiB3ZSBoYXZlIHRvIHN1YnRyYWN0IHRoZSAxMiBieXRlcyBmb3IgdGhlIGFkZHJlc3NlcyBvZmYgKi8KKwlwYXlsb2FkTGVuID0gY3B1X3RvX2xlMTYobGVuICsgbWljbGVuKTsKKwliYXBfd3JpdGUoYWksICZwYXlsb2FkTGVuLCBzaXplb2YocGF5bG9hZExlbiksQkFQMSk7CisJYmFwX3dyaXRlKGFpLCAoY29uc3QgdTE2KilwUGFja2V0LCBzaXplb2YoZXRoZXJIZWFkKSwgQkFQMSk7CisJaWYgKG1pY2xlbikKKwkJYmFwX3dyaXRlKGFpLCAoY29uc3QgdTE2KikmcE1pYywgbWljbGVuLCBCQVAxKTsKKwliYXBfd3JpdGUoYWksIChjb25zdCB1MTYqKShwUGFja2V0ICsgc2l6ZW9mKGV0aGVySGVhZCkpLCBsZW4sIEJBUDEpOworCS8vIGlzc3VlIHRoZSB0cmFuc21pdCBjb21tYW5kCisJbWVtc2V0KCAmY21kLCAwLCBzaXplb2YoIGNtZCApICk7CisJY21kLmNtZCA9IENNRF9UUkFOU01JVDsKKwljbWQucGFybTAgPSB0eEZpZDsKKwlpZiAoaXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKSAhPSBTVUNDRVNTKSByZXR1cm4gRVJST1I7CisJaWYgKCAocnNwLnN0YXR1cyAmIDB4RkYwMCkgIT0gMCkgcmV0dXJuIEVSUk9SOworCXJldHVybiBTVUNDRVNTOworfQorCitzdGF0aWMgaW50IHRyYW5zbWl0XzgwMl8xMV9wYWNrZXQoc3RydWN0IGFpcm9faW5mbyAqYWksIGludCBsZW4sIGNoYXIgKnBQYWNrZXQpCit7CisJdTE2IGZjLCBwYXlsb2FkTGVuOworCUNtZCBjbWQ7CisJUmVzcCByc3A7CisJaW50IGhkcmxlbjsKKwlzdHJ1Y3QgeworCQl1OCBhZGRyNFtFVEhfQUxFTl07CisJCXUxNiBnYXBsZW47CisJCXU4IGdhcFs2XTsKKwl9IGdhcDsKKwl1MTYgdHhGaWQgPSBsZW47CisJbGVuID4+PSAxNjsKKwlnYXAuZ2FwbGVuID0gNjsKKworCWZjID0gbGUxNl90b19jcHUoKihjb25zdCB1MTYqKXBQYWNrZXQpOworCXN3aXRjaCAoZmMgJiAweGMpIHsKKwkJY2FzZSA0OgorCQkJaWYgKChmYyAmIDB4ZTApID09IDB4YzApCisJCQkJaGRybGVuID0gMTA7CisJCQllbHNlCisJCQkJaGRybGVuID0gMTY7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJaWYgKChmYyYweDMwMCk9PTB4MzAwKXsKKwkJCQloZHJsZW4gPSAzMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCWhkcmxlbiA9IDI0OworCX0KKworCWlmIChsZW4gPCBoZHJsZW4pIHsKKwkJcHJpbnRrKCBLRVJOX1dBUk5JTkcgIlNob3J0IHBhY2tldCAlZFxuIiwgbGVuICk7CisJCXJldHVybiBFUlJPUjsKKwl9CisKKwkvKiBwYWNrZXQgaXMgODAyLjExIGhlYWRlciArICBwYXlsb2FkCisJICogd3JpdGUgdGhlIHBheWxvYWQgbGVuZ3RoIGFuZCBkc3Qvc3JjL3BheWxvYWQgKi8KKwlpZiAoYmFwX3NldHVwKGFpLCB0eEZpZCwgNiwgQkFQMSkgIT0gU1VDQ0VTUykgcmV0dXJuIEVSUk9SOworCS8qIFRoZSA4MDIuMTEgaGVhZGVyIGFyZW4ndCBjb3VudGVkIGFzIHBhcnQgb2YgdGhlIHBheWxvYWQsIHNvCisJICogd2UgaGF2ZSB0byBzdWJ0cmFjdCB0aGUgaGVhZGVyIGJ5dGVzIG9mZiAqLworCXBheWxvYWRMZW4gPSBjcHVfdG9fbGUxNihsZW4taGRybGVuKTsKKwliYXBfd3JpdGUoYWksICZwYXlsb2FkTGVuLCBzaXplb2YocGF5bG9hZExlbiksQkFQMSk7CisJaWYgKGJhcF9zZXR1cChhaSwgdHhGaWQsIDB4MDAxNCwgQkFQMSkgIT0gU1VDQ0VTUykgcmV0dXJuIEVSUk9SOworCWJhcF93cml0ZShhaSwgKGNvbnN0IHUxNiopcFBhY2tldCwgaGRybGVuLCBCQVAxKTsKKwliYXBfd3JpdGUoYWksIGhkcmxlbiA9PSAzMCA/CisJCShjb25zdCB1MTYqKSZnYXAuZ2FwbGVuIDogKGNvbnN0IHUxNiopJmdhcCwgMzggLSBoZHJsZW4sIEJBUDEpOworCisJYmFwX3dyaXRlKGFpLCAoY29uc3QgdTE2KikocFBhY2tldCArIGhkcmxlbiksIGxlbiAtIGhkcmxlbiwgQkFQMSk7CisJLy8gaXNzdWUgdGhlIHRyYW5zbWl0IGNvbW1hbmQKKwltZW1zZXQoICZjbWQsIDAsIHNpemVvZiggY21kICkgKTsKKwljbWQuY21kID0gQ01EX1RSQU5TTUlUOworCWNtZC5wYXJtMCA9IHR4RmlkOworCWlmIChpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApICE9IFNVQ0NFU1MpIHJldHVybiBFUlJPUjsKKwlpZiAoIChyc3Auc3RhdHVzICYgMHhGRjAwKSAhPSAwKSByZXR1cm4gRVJST1I7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qCisgKiAgVGhpcyBpcyB0aGUgcHJvY19mcyByb3V0aW5lcy4gIEl0IGlzIGEgYml0IG1lc3NpZXIgdGhhbiBJIHdvdWxkCisgKiAgbGlrZSEgIEZlZWwgZnJlZSB0byBjbGVhbiBpdCB1cCEKKyAqLworCitzdGF0aWMgc3NpemVfdCBwcm9jX3JlYWQoIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICBzaXplX3QgbGVuLAorCQkJICBsb2ZmX3QgKm9mZnNldCk7CisKK3N0YXRpYyBzc2l6ZV90IHByb2Nfd3JpdGUoIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgIHNpemVfdCBsZW4sCisJCQkgICBsb2ZmX3QgKm9mZnNldCApOworc3RhdGljIGludCBwcm9jX2Nsb3NlKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApOworCitzdGF0aWMgaW50IHByb2Nfc3RhdHNfb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKTsKK3N0YXRpYyBpbnQgcHJvY19zdGF0c2RlbHRhX29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICk7CitzdGF0aWMgaW50IHByb2Nfc3RhdHVzX29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICk7CitzdGF0aWMgaW50IHByb2NfU1NJRF9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApOworc3RhdGljIGludCBwcm9jX0FQTGlzdF9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApOworc3RhdGljIGludCBwcm9jX0JTU0xpc3Rfb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKTsKK3N0YXRpYyBpbnQgcHJvY19jb25maWdfb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKTsKK3N0YXRpYyBpbnQgcHJvY193ZXBrZXlfb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19zdGF0c2RlbHRhX29wcyA9IHsKKwkucmVhZAkJPSBwcm9jX3JlYWQsCisJLm9wZW4JCT0gcHJvY19zdGF0c2RlbHRhX29wZW4sCisJLnJlbGVhc2UJPSBwcm9jX2Nsb3NlCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3N0YXRzX29wcyA9IHsKKwkucmVhZAkJPSBwcm9jX3JlYWQsCisJLm9wZW4JCT0gcHJvY19zdGF0c19vcGVuLAorCS5yZWxlYXNlCT0gcHJvY19jbG9zZQorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19zdGF0dXNfb3BzID0geworCS5yZWFkCQk9IHByb2NfcmVhZCwKKwkub3BlbgkJPSBwcm9jX3N0YXR1c19vcGVuLAorCS5yZWxlYXNlCT0gcHJvY19jbG9zZQorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19TU0lEX29wcyA9IHsKKwkucmVhZAkJPSBwcm9jX3JlYWQsCisJLndyaXRlCQk9IHByb2Nfd3JpdGUsCisJLm9wZW4JCT0gcHJvY19TU0lEX29wZW4sCisJLnJlbGVhc2UJPSBwcm9jX2Nsb3NlCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX0JTU0xpc3Rfb3BzID0geworCS5yZWFkCQk9IHByb2NfcmVhZCwKKwkud3JpdGUJCT0gcHJvY193cml0ZSwKKwkub3BlbgkJPSBwcm9jX0JTU0xpc3Rfb3BlbiwKKwkucmVsZWFzZQk9IHByb2NfY2xvc2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfQVBMaXN0X29wcyA9IHsKKwkucmVhZAkJPSBwcm9jX3JlYWQsCisJLndyaXRlCQk9IHByb2Nfd3JpdGUsCisJLm9wZW4JCT0gcHJvY19BUExpc3Rfb3BlbiwKKwkucmVsZWFzZQk9IHByb2NfY2xvc2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfY29uZmlnX29wcyA9IHsKKwkucmVhZAkJPSBwcm9jX3JlYWQsCisJLndyaXRlCQk9IHByb2Nfd3JpdGUsCisJLm9wZW4JCT0gcHJvY19jb25maWdfb3BlbiwKKwkucmVsZWFzZQk9IHByb2NfY2xvc2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfd2Vwa2V5X29wcyA9IHsKKwkucmVhZAkJPSBwcm9jX3JlYWQsCisJLndyaXRlCQk9IHByb2Nfd3JpdGUsCisJLm9wZW4JCT0gcHJvY193ZXBrZXlfb3BlbiwKKwkucmVsZWFzZQk9IHByb2NfY2xvc2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFpcm9fZW50cnk7CisKK3N0cnVjdCBwcm9jX2RhdGEgeworCWludCByZWxlYXNlX2J1ZmZlcjsKKwlpbnQgcmVhZGxlbjsKKwljaGFyICpyYnVmZmVyOworCWludCB3cml0ZWxlbjsKKwlpbnQgbWF4d3JpdGVsZW47CisJY2hhciAqd2J1ZmZlcjsKKwl2b2lkICgqb25fY2xvc2UpIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7Cit9OworCisjaWZuZGVmIFNFVFBST0NfT1BTCisjZGVmaW5lIFNFVFBST0NfT1BTKGVudHJ5LCBvcHMpIChlbnRyeSktPnByb2NfZm9wcyA9ICYob3BzKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgc2V0dXBfcHJvY19lbnRyeSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGFpcm9faW5mbyAqYXByaXYgKSB7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKKwkvKiBGaXJzdCBzZXR1cCB0aGUgZGV2aWNlIGRpcmVjdG9yeSAqLworCXN0cmNweShhcHJpdi0+cHJvY19uYW1lLGRldi0+bmFtZSk7CisJYXByaXYtPnByb2NfZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShhcHJpdi0+cHJvY19uYW1lLAorCQkJCQkgICAgICBTX0lGRElSfGFpcm9fcGVybSwKKwkJCQkJICAgICAgYWlyb19lbnRyeSk7CisgICAgICAgIGFwcml2LT5wcm9jX2VudHJ5LT51aWQgPSBwcm9jX3VpZDsKKyAgICAgICAgYXByaXYtPnByb2NfZW50cnktPmdpZCA9IHByb2NfZ2lkOworICAgICAgICBhcHJpdi0+cHJvY19lbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCS8qIFNldHVwIHRoZSBTdGF0c0RlbHRhICovCisJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiU3RhdHNEZWx0YSIsCisJCQkJICBTX0lGUkVHIHwgKFNfSVJVR08mcHJvY19wZXJtKSwKKwkJCQkgIGFwcml2LT5wcm9jX2VudHJ5KTsKKyAgICAgICAgZW50cnktPnVpZCA9IHByb2NfdWlkOworICAgICAgICBlbnRyeS0+Z2lkID0gcHJvY19naWQ7CisJZW50cnktPmRhdGEgPSBkZXY7CisgICAgICAgIGVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCVNFVFBST0NfT1BTKGVudHJ5LCBwcm9jX3N0YXRzZGVsdGFfb3BzKTsKKworCS8qIFNldHVwIHRoZSBTdGF0cyAqLworCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoIlN0YXRzIiwKKwkJCQkgIFNfSUZSRUcgfCAoU19JUlVHTyZwcm9jX3Blcm0pLAorCQkJCSAgYXByaXYtPnByb2NfZW50cnkpOworICAgICAgICBlbnRyeS0+dWlkID0gcHJvY191aWQ7CisgICAgICAgIGVudHJ5LT5naWQgPSBwcm9jX2dpZDsKKwllbnRyeS0+ZGF0YSA9IGRldjsKKyAgICAgICAgZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJU0VUUFJPQ19PUFMoZW50cnksIHByb2Nfc3RhdHNfb3BzKTsKKworCS8qIFNldHVwIHRoZSBTdGF0dXMgKi8KKwllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJTdGF0dXMiLAorCQkJCSAgU19JRlJFRyB8IChTX0lSVUdPJnByb2NfcGVybSksCisJCQkJICBhcHJpdi0+cHJvY19lbnRyeSk7CisgICAgICAgIGVudHJ5LT51aWQgPSBwcm9jX3VpZDsKKyAgICAgICAgZW50cnktPmdpZCA9IHByb2NfZ2lkOworCWVudHJ5LT5kYXRhID0gZGV2OworICAgICAgICBlbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlTRVRQUk9DX09QUyhlbnRyeSwgcHJvY19zdGF0dXNfb3BzKTsKKworCS8qIFNldHVwIHRoZSBDb25maWcgKi8KKwllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJDb25maWciLAorCQkJCSAgU19JRlJFRyB8IHByb2NfcGVybSwKKwkJCQkgIGFwcml2LT5wcm9jX2VudHJ5KTsKKyAgICAgICAgZW50cnktPnVpZCA9IHByb2NfdWlkOworICAgICAgICBlbnRyeS0+Z2lkID0gcHJvY19naWQ7CisJZW50cnktPmRhdGEgPSBkZXY7CisgICAgICAgIGVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCVNFVFBST0NfT1BTKGVudHJ5LCBwcm9jX2NvbmZpZ19vcHMpOworCisJLyogU2V0dXAgdGhlIFNTSUQgKi8KKwllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJTU0lEIiwKKwkJCQkgIFNfSUZSRUcgfCBwcm9jX3Blcm0sCisJCQkJICBhcHJpdi0+cHJvY19lbnRyeSk7CisgICAgICAgIGVudHJ5LT51aWQgPSBwcm9jX3VpZDsKKyAgICAgICAgZW50cnktPmdpZCA9IHByb2NfZ2lkOworCWVudHJ5LT5kYXRhID0gZGV2OworICAgICAgICBlbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlTRVRQUk9DX09QUyhlbnRyeSwgcHJvY19TU0lEX29wcyk7CisKKwkvKiBTZXR1cCB0aGUgQVBMaXN0ICovCisJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiQVBMaXN0IiwKKwkJCQkgIFNfSUZSRUcgfCBwcm9jX3Blcm0sCisJCQkJICBhcHJpdi0+cHJvY19lbnRyeSk7CisgICAgICAgIGVudHJ5LT51aWQgPSBwcm9jX3VpZDsKKyAgICAgICAgZW50cnktPmdpZCA9IHByb2NfZ2lkOworCWVudHJ5LT5kYXRhID0gZGV2OworICAgICAgICBlbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlTRVRQUk9DX09QUyhlbnRyeSwgcHJvY19BUExpc3Rfb3BzKTsKKworCS8qIFNldHVwIHRoZSBCU1NMaXN0ICovCisJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiQlNTTGlzdCIsCisJCQkJICBTX0lGUkVHIHwgcHJvY19wZXJtLAorCQkJCSAgYXByaXYtPnByb2NfZW50cnkpOworCWVudHJ5LT51aWQgPSBwcm9jX3VpZDsKKwllbnRyeS0+Z2lkID0gcHJvY19naWQ7CisJZW50cnktPmRhdGEgPSBkZXY7CisgICAgICAgIGVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCVNFVFBST0NfT1BTKGVudHJ5LCBwcm9jX0JTU0xpc3Rfb3BzKTsKKworCS8qIFNldHVwIHRoZSBXZXBLZXkgKi8KKwllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJXZXBLZXkiLAorCQkJCSAgU19JRlJFRyB8IHByb2NfcGVybSwKKwkJCQkgIGFwcml2LT5wcm9jX2VudHJ5KTsKKyAgICAgICAgZW50cnktPnVpZCA9IHByb2NfdWlkOworICAgICAgICBlbnRyeS0+Z2lkID0gcHJvY19naWQ7CisJZW50cnktPmRhdGEgPSBkZXY7CisgICAgICAgIGVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCVNFVFBST0NfT1BTKGVudHJ5LCBwcm9jX3dlcGtleV9vcHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFrZWRvd25fcHJvY19lbnRyeSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgYWlyb19pbmZvICphcHJpdiApIHsKKwlpZiAoICFhcHJpdi0+cHJvY19lbnRyeS0+bmFtZWxlbiApIHJldHVybiAwOworCXJlbW92ZV9wcm9jX2VudHJ5KCJTdGF0cyIsYXByaXYtPnByb2NfZW50cnkpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJTdGF0c0RlbHRhIixhcHJpdi0+cHJvY19lbnRyeSk7CisJcmVtb3ZlX3Byb2NfZW50cnkoIlN0YXR1cyIsYXByaXYtPnByb2NfZW50cnkpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJDb25maWciLGFwcml2LT5wcm9jX2VudHJ5KTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiU1NJRCIsYXByaXYtPnByb2NfZW50cnkpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJBUExpc3QiLGFwcml2LT5wcm9jX2VudHJ5KTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiQlNTTGlzdCIsYXByaXYtPnByb2NfZW50cnkpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJXZXBLZXkiLGFwcml2LT5wcm9jX2VudHJ5KTsKKwlyZW1vdmVfcHJvY19lbnRyeShhcHJpdi0+cHJvY19uYW1lLGFpcm9fZW50cnkpOworCXJldHVybiAwOworfQorCisvKgorICogIFdoYXQgd2Ugd2FudCBmcm9tIHRoZSBwcm9jX2ZzIGlzIHRvIGJlIGFibGUgdG8gZWZmaWNpZW50bHkgcmVhZAorICogIGFuZCB3cml0ZSB0aGUgY29uZmlndXJhdGlvbi4gIFRvIGRvIHRoaXMsIHdlIHdhbnQgdG8gcmVhZCB0aGUKKyAqICBjb25maWd1cmF0aW9uIHdoZW4gdGhlIGZpbGUgaXMgb3BlbmVkIGFuZCB3cml0ZSBpdCB3aGVuIHRoZSBmaWxlIGlzCisgKiAgY2xvc2VkLiAgU28gYmFzaWNhbGx5IHdlIGFsbG9jYXRlIGEgcmVhZCBidWZmZXIgYXQgb3BlbiBhbmQgZmlsbCBpdAorICogIHdpdGggZGF0YSwgYW5kIGFsbG9jYXRlIGEgd3JpdGUgYnVmZmVyIGFuZCByZWFkIGl0IGF0IGNsb3NlLgorICovCisKKy8qCisgKiAgVGhlIHJlYWQgcm91dGluZSBpcyBnZW5lcmljLCBpdCByZWxpZXMgb24gdGhlIHByZWFsbG9jYXRlZCByYnVmZmVyCisgKiAgdG8gc3VwcGx5IHRoZSBkYXRhLgorICovCitzdGF0aWMgc3NpemVfdCBwcm9jX3JlYWQoIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICBzaXplX3QgbGVuLAorCQkJICBsb2ZmX3QgKm9mZnNldCApCit7CisJbG9mZl90IHBvcyA9ICpvZmZzZXQ7CisJc3RydWN0IHByb2NfZGF0YSAqcHJpdiA9IChzdHJ1Y3QgcHJvY19kYXRhKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIXByaXYtPnJidWZmZXIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBvcyA8IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChwb3MgPj0gcHJpdi0+cmVhZGxlbikKKwkJcmV0dXJuIDA7CisJaWYgKGxlbiA+IHByaXYtPnJlYWRsZW4gLSBwb3MpCisJCWxlbiA9IHByaXYtPnJlYWRsZW4gLSBwb3M7CisJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIHByaXYtPnJidWZmZXIgKyBwb3MsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCSpvZmZzZXQgPSBwb3MgKyBsZW47CisJcmV0dXJuIGxlbjsKK30KKworLyoKKyAqICBUaGUgd3JpdGUgcm91dGluZSBpcyBnZW5lcmljLCBpdCBmaWxscyBpbiBhIHByZWFsbG9jYXRlZCByYnVmZmVyCisgKiAgdG8gc3VwcGx5IHRoZSBkYXRhLgorICovCitzdGF0aWMgc3NpemVfdCBwcm9jX3dyaXRlKCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICBzaXplX3QgbGVuLAorCQkJICAgbG9mZl90ICpvZmZzZXQgKQoreworCWxvZmZfdCBwb3MgPSAqb2Zmc2V0OworCXN0cnVjdCBwcm9jX2RhdGEgKnByaXYgPSAoc3RydWN0IHByb2NfZGF0YSopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFwcml2LT53YnVmZmVyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwb3MgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocG9zID49IHByaXYtPm1heHdyaXRlbGVuKQorCQlyZXR1cm4gMDsKKwlpZiAobGVuID4gcHJpdi0+bWF4d3JpdGVsZW4gLSBwb3MpCisJCWxlbiA9IHByaXYtPm1heHdyaXRlbGVuIC0gcG9zOworCWlmIChjb3B5X2Zyb21fdXNlcihwcml2LT53YnVmZmVyICsgcG9zLCBidWZmZXIsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCWlmICggcG9zICsgbGVuID4gcHJpdi0+d3JpdGVsZW4gKQorCQlwcml2LT53cml0ZWxlbiA9IGxlbiArIGZpbGUtPmZfcG9zOworCSpvZmZzZXQgPSBwb3MgKyBsZW47CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBwcm9jX3N0YXR1c19vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApIHsKKwlzdHJ1Y3QgcHJvY19kYXRhICpkYXRhOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vZGUpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcC0+ZGF0YTsKKwlzdHJ1Y3QgYWlyb19pbmZvICphcHJpdiA9IGRldi0+cHJpdjsKKwlDYXBhYmlsaXR5UmlkIGNhcF9yaWQ7CisJU3RhdHVzUmlkIHN0YXR1c19yaWQ7CisJaW50IGk7CisKKwlpZiAoKGZpbGUtPnByaXZhdGVfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9jX2RhdGEgKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChmaWxlLT5wcml2YXRlX2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhKSk7CisJZGF0YSA9IChzdHJ1Y3QgcHJvY19kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICgoZGF0YS0+cmJ1ZmZlciA9IGttYWxsb2MoIDIwNDgsIEdGUF9LRVJORUwgKSkgPT0gTlVMTCkgeworCQlrZnJlZSAoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmVhZFN0YXR1c1JpZChhcHJpdiwgJnN0YXR1c19yaWQsIDEpOworCXJlYWRDYXBhYmlsaXR5UmlkKGFwcml2LCAmY2FwX3JpZCwgMSk7CisKKyAgICAgICAgaSA9IHNwcmludGYoZGF0YS0+cmJ1ZmZlciwgIlN0YXR1czogJXMlcyVzJXMlcyVzJXMlcyVzXG4iLAorICAgICAgICAgICAgICAgICAgICBzdGF0dXNfcmlkLm1vZGUgJiAxID8gIkNGRyAiOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3JpZC5tb2RlICYgMiA/ICJBQ1QgIjogIiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c19yaWQubW9kZSAmIDB4MTAgPyAiU1lOICI6ICIiLAorICAgICAgICAgICAgICAgICAgICBzdGF0dXNfcmlkLm1vZGUgJiAweDIwID8gIkxOSyAiOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3JpZC5tb2RlICYgMHg0MCA/ICJMRUFQICI6ICIiLAorICAgICAgICAgICAgICAgICAgICBzdGF0dXNfcmlkLm1vZGUgJiAweDgwID8gIlBSSVYgIjogIiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c19yaWQubW9kZSAmIDB4MTAwID8gIktFWSAiOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3JpZC5tb2RlICYgMHgyMDAgPyAiV0VQICI6ICIiLAorICAgICAgICAgICAgICAgICAgICBzdGF0dXNfcmlkLm1vZGUgJiAweDgwMDAgPyAiRVJSICI6ICIiKTsKKwlzcHJpbnRmKCBkYXRhLT5yYnVmZmVyK2ksICJNb2RlOiAleFxuIgorCQkgIlNpZ25hbCBTdHJlbmd0aDogJWRcbiIKKwkJICJTaWduYWwgUXVhbGl0eTogJWRcbiIKKwkJICJTU0lEOiAlLS4qc1xuIgorCQkgIkFQOiAlLS4xNnNcbiIKKwkJICJGcmVxOiAlZFxuIgorCQkgIkJpdFJhdGU6ICVkbWJzXG4iCisJCSAiRHJpdmVyIFZlcnNpb246ICVzXG4iCisJCSAiRGV2aWNlOiAlc1xuTWFudWZhY3R1cmVyOiAlc1xuRmlybXdhcmUgVmVyc2lvbjogJXNcbiIKKwkJICJSYWRpbyB0eXBlOiAleFxuQ291bnRyeTogJXhcbkhhcmR3YXJlIFZlcnNpb246ICV4XG4iCisJCSAiU29mdHdhcmUgVmVyc2lvbjogJXhcblNvZnR3YXJlIFN1YnZlcnNpb246ICV4XG4iCisJCSAiQm9vdCBibG9jayB2ZXJzaW9uOiAleFxuIiwKKwkJIChpbnQpc3RhdHVzX3JpZC5tb2RlLAorCQkgKGludClzdGF0dXNfcmlkLm5vcm1hbGl6ZWRTaWduYWxTdHJlbmd0aCwKKwkJIChpbnQpc3RhdHVzX3JpZC5zaWduYWxRdWFsaXR5LAorCQkgKGludClzdGF0dXNfcmlkLlNTSURsZW4sCisJCSBzdGF0dXNfcmlkLlNTSUQsCisJCSBzdGF0dXNfcmlkLmFwTmFtZSwKKwkJIChpbnQpc3RhdHVzX3JpZC5jaGFubmVsLAorCQkgKGludClzdGF0dXNfcmlkLmN1cnJlbnRYbWl0UmF0ZS8yLAorCQkgdmVyc2lvbiwKKwkJIGNhcF9yaWQucHJvZE5hbWUsCisJCSBjYXBfcmlkLm1hbk5hbWUsCisJCSBjYXBfcmlkLnByb2RWZXIsCisJCSBjYXBfcmlkLnJhZGlvVHlwZSwKKwkJIGNhcF9yaWQuY291bnRyeSwKKwkJIGNhcF9yaWQuaGFyZFZlciwKKwkJIChpbnQpY2FwX3JpZC5zb2Z0VmVyLAorCQkgKGludCljYXBfcmlkLnNvZnRTdWJWZXIsCisJCSAoaW50KWNhcF9yaWQuYm9vdEJsb2NrVmVyICk7CisJZGF0YS0+cmVhZGxlbiA9IHN0cmxlbiggZGF0YS0+cmJ1ZmZlciApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nfc3RhdHNfcmlkX29wZW4oc3RydWN0IGlub2RlKiwgc3RydWN0IGZpbGUqLCB1MTYpOworc3RhdGljIGludCBwcm9jX3N0YXRzZGVsdGFfb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgc3RydWN0IGZpbGUgKmZpbGUgKSB7CisJaWYgKGZpbGUtPmZfbW9kZSZGTU9ERV9XUklURSkgeworCQlyZXR1cm4gcHJvY19zdGF0c19yaWRfb3Blbihpbm9kZSwgZmlsZSwgUklEX1NUQVRTREVMVEFDTEVBUik7CisJfQorCXJldHVybiBwcm9jX3N0YXRzX3JpZF9vcGVuKGlub2RlLCBmaWxlLCBSSURfU1RBVFNERUxUQSk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19zdGF0c19vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApIHsKKwlyZXR1cm4gcHJvY19zdGF0c19yaWRfb3Blbihpbm9kZSwgZmlsZSwgUklEX1NUQVRTKTsKK30KKworc3RhdGljIGludCBwcm9jX3N0YXRzX3JpZF9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCXN0cnVjdCBmaWxlICpmaWxlLAorCQkJCXUxNiByaWQgKSB7CisJc3RydWN0IHByb2NfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGlub2RlKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHAtPmRhdGE7CisJc3RydWN0IGFpcm9faW5mbyAqYXByaXYgPSBkZXYtPnByaXY7CisJU3RhdHNSaWQgc3RhdHM7CisJaW50IGksIGo7CisJdTMyICp2YWxzID0gc3RhdHMudmFsczsKKworCWlmICgoZmlsZS0+cHJpdmF0ZV9kYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHByb2NfZGF0YSApLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGZpbGUtPnByaXZhdGVfZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBwcm9jX2RhdGEpKTsKKwlkYXRhID0gKHN0cnVjdCBwcm9jX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKChkYXRhLT5yYnVmZmVyID0ga21hbGxvYyggNDA5NiwgR0ZQX0tFUk5FTCApKSA9PSBOVUxMKSB7CisJCWtmcmVlIChmaWxlLT5wcml2YXRlX2RhdGEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZWFkU3RhdHNSaWQoYXByaXYsICZzdGF0cywgcmlkLCAxKTsKKworICAgICAgICBqID0gMDsKKwlmb3IoaT0wOyBzdGF0c0xhYmVsc1tpXSE9KGNoYXIgKiktMSAmJgorCQkgICAgaSo0PHN0YXRzLmxlbjsgaSsrKXsKKwkJaWYgKCFzdGF0c0xhYmVsc1tpXSkgY29udGludWU7CisJCWlmIChqK3N0cmxlbihzdGF0c0xhYmVsc1tpXSkrMTY+NDA5NikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJhaXJvOiBQb3RlbnRpYWxseSBkaXNhc3Rlcm91cyBidWZmZXIgb3ZlcmZsb3cgYXZlcnRlZCFcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJais9c3ByaW50ZihkYXRhLT5yYnVmZmVyK2osICIlczogJXVcbiIsIHN0YXRzTGFiZWxzW2ldLCB2YWxzW2ldKTsKKwl9CisJaWYgKGkqND49c3RhdHMubGVuKXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgImFpcm86IEdvdCBhIHNob3J0IHJpZFxuIik7CisJfQorCWRhdGEtPnJlYWRsZW4gPSBqOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9kZWNfdTE2KCBjaGFyICpidWZmZXIsIGludCAqc3RhcnQsIGludCBsaW1pdCApIHsKKwl1MTYgdmFsdWU7CisJaW50IHZhbGlkID0gMDsKKwlmb3IoIHZhbHVlID0gMDsgYnVmZmVyWypzdGFydF0gPj0gJzAnICYmCisJCSAgICAgYnVmZmVyWypzdGFydF0gPD0gJzknICYmCisJCSAgICAgKnN0YXJ0IDwgbGltaXQ7ICgqc3RhcnQpKysgKSB7CisJCXZhbGlkID0gMTsKKwkJdmFsdWUgKj0gMTA7CisJCXZhbHVlICs9IGJ1ZmZlclsqc3RhcnRdIC0gJzAnOworCX0KKwlpZiAoICF2YWxpZCApIHJldHVybiAtMTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgYWlyb19jb25maWdfY29tbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCB2b2lkICp6d3JxLAorCQkJICAgICAgY2hhciAqZXh0cmEpOworCitzdGF0aWMgdm9pZCBwcm9jX2NvbmZpZ19vbl9jbG9zZSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKSB7CisJc3RydWN0IHByb2NfZGF0YSAqZGF0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGlub2RlKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHAtPmRhdGE7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJY2hhciAqbGluZTsKKworCWlmICggIWRhdGEtPndyaXRlbGVuICkgcmV0dXJuOworCisJcmVhZENvbmZpZ1JpZChhaSwgMSk7CisJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCisJbGluZSA9IGRhdGEtPndidWZmZXI7CisJd2hpbGUoIGxpbmVbMF0gKSB7CisvKioqIE1vZGUgcHJvY2Vzc2luZyAqLworCQlpZiAoICFzdHJuY21wKCBsaW5lLCAiTW9kZTogIiwgNiApICkgeworCQkJbGluZSArPSA2OworCQkJaWYgKChhaS0+Y29uZmlnLnJtb2RlICYgMHhmZikgPj0gUlhNT0RFX1JGTU9OKQorCQkJCQlzZXRfYml0IChGTEFHX1JFU0VULCAmYWktPmZsYWdzKTsKKwkJCWFpLT5jb25maWcucm1vZGUgJj0gMHhmZTAwOworCQkJY2xlYXJfYml0IChGTEFHXzgwMl8xMSwgJmFpLT5mbGFncyk7CisJCQlhaS0+Y29uZmlnLm9wbW9kZSAmPSAweEZGMDA7CisJCQlhaS0+Y29uZmlnLnNjYW5Nb2RlID0gU0NBTk1PREVfQUNUSVZFOworCQkJaWYgKCBsaW5lWzBdID09ICdhJyApIHsKKwkJCQlhaS0+Y29uZmlnLm9wbW9kZSB8PSAwOworCQkJfSBlbHNlIHsKKwkJCQlhaS0+Y29uZmlnLm9wbW9kZSB8PSAxOworCQkJCWlmICggbGluZVswXSA9PSAncicgKSB7CisJCQkJCWFpLT5jb25maWcucm1vZGUgfD0gUlhNT0RFX1JGTU9OIHwgUlhNT0RFX0RJU0FCTEVfODAyXzNfSEVBREVSOworCQkJCQlhaS0+Y29uZmlnLnNjYW5Nb2RlID0gU0NBTk1PREVfUEFTU0lWRTsKKwkJCQkJc2V0X2JpdCAoRkxBR184MDJfMTEsICZhaS0+ZmxhZ3MpOworCQkJCX0gZWxzZSBpZiAoIGxpbmVbMF0gPT0gJ3knICkgeworCQkJCQlhaS0+Y29uZmlnLnJtb2RlIHw9IFJYTU9ERV9SRk1PTl9BTllCU1MgfCBSWE1PREVfRElTQUJMRV84MDJfM19IRUFERVI7CisJCQkJCWFpLT5jb25maWcuc2Nhbk1vZGUgPSBTQ0FOTU9ERV9QQVNTSVZFOworCQkJCQlzZXRfYml0IChGTEFHXzgwMl8xMSwgJmFpLT5mbGFncyk7CisJCQkJfSBlbHNlIGlmICggbGluZVswXSA9PSAnbCcgKQorCQkJCQlhaS0+Y29uZmlnLnJtb2RlIHw9IFJYTU9ERV9MQU5NT047CisJCQl9CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJCX0KKworLyoqKiBSYWRpbyBzdGF0dXMgKi8KKwkJZWxzZSBpZiAoIXN0cm5jbXAobGluZSwiUmFkaW86ICIsIDcpKSB7CisJCQlsaW5lICs9IDc7CisJCQlpZiAoIXN0cm5jbXAobGluZSwib2ZmIiwzKSkgeworCQkJCXNldF9iaXQgKEZMQUdfUkFESU9fT0ZGLCAmYWktPmZsYWdzKTsKKwkJCX0gZWxzZSB7CisJCQkJY2xlYXJfYml0IChGTEFHX1JBRElPX09GRiwgJmFpLT5mbGFncyk7CisJCQl9CisJCX0KKy8qKiogTm9kZU5hbWUgcHJvY2Vzc2luZyAqLworCQllbHNlIGlmICggIXN0cm5jbXAoIGxpbmUsICJOb2RlTmFtZTogIiwgMTAgKSApIHsKKwkJCWludCBqOworCisJCQlsaW5lICs9IDEwOworCQkJbWVtc2V0KCBhaS0+Y29uZmlnLm5vZGVOYW1lLCAwLCAxNiApOworLyogRG8gdGhlIG5hbWUsIGFzc3VtZSBhIHNwYWNlIGJldHdlZW4gdGhlIG1vZGUgYW5kIG5vZGUgbmFtZSAqLworCQkJZm9yKCBqID0gMDsgaiA8IDE2ICYmIGxpbmVbal0gIT0gJ1xuJzsgaisrICkgeworCQkJCWFpLT5jb25maWcubm9kZU5hbWVbal0gPSBsaW5lW2pdOworCQkJfQorCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQl9CisKKy8qKiogUG93ZXJNb2RlIHByb2Nlc3NpbmcgKi8KKwkJZWxzZSBpZiAoICFzdHJuY21wKCBsaW5lLCAiUG93ZXJNb2RlOiAiLCAxMSApICkgeworCQkJbGluZSArPSAxMTsKKwkJCWlmICggIXN0cm5jbXAoIGxpbmUsICJQU1BDQU0iLCA2ICkgKSB7CisJCQkJYWktPmNvbmZpZy5wb3dlclNhdmVNb2RlID0gUE9XRVJTQVZFX1BTUENBTTsKKwkJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJCQl9IGVsc2UgaWYgKCAhc3RybmNtcCggbGluZSwgIlBTUCIsIDMgKSApIHsKKwkJCQlhaS0+Y29uZmlnLnBvd2VyU2F2ZU1vZGUgPSBQT1dFUlNBVkVfUFNQOworCQkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJCX0gZWxzZSB7CisJCQkJYWktPmNvbmZpZy5wb3dlclNhdmVNb2RlID0gUE9XRVJTQVZFX0NBTTsKKwkJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJCQl9CisJCX0gZWxzZSBpZiAoICFzdHJuY21wKCBsaW5lLCAiRGF0YVJhdGVzOiAiLCAxMSApICkgeworCQkJaW50IHYsIGkgPSAwLCBrID0gMDsgLyogaSBpcyBpbmRleCBpbnRvIGxpbmUsCisJCQkJCQlrIGlzIGluZGV4IHRvIHJhdGVzICovCisKKwkJCWxpbmUgKz0gMTE7CisJCQl3aGlsZSgodiA9IGdldF9kZWNfdTE2KGxpbmUsICZpLCAzKSkhPS0xKSB7CisJCQkJYWktPmNvbmZpZy5yYXRlc1trKytdID0gKHU4KXY7CisJCQkJbGluZSArPSBpICsgMTsKKwkJCQlpID0gMDsKKwkJCX0KKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJfSBlbHNlIGlmICggIXN0cm5jbXAoIGxpbmUsICJDaGFubmVsOiAiLCA5ICkgKSB7CisJCQlpbnQgdiwgaSA9IDA7CisJCQlsaW5lICs9IDk7CisJCQl2ID0gZ2V0X2RlY191MTYobGluZSwgJmksIGkrMyk7CisJCQlpZiAoIHYgIT0gLTEgKSB7CisJCQkJYWktPmNvbmZpZy5jaGFubmVsU2V0ID0gKHUxNil2OworCQkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJCX0KKwkJfSBlbHNlIGlmICggIXN0cm5jbXAoIGxpbmUsICJYbWl0UG93ZXI6ICIsIDExICkgKSB7CisJCQlpbnQgdiwgaSA9IDA7CisJCQlsaW5lICs9IDExOworCQkJdiA9IGdldF9kZWNfdTE2KGxpbmUsICZpLCBpKzMpOworCQkJaWYgKCB2ICE9IC0xICkgeworCQkJCWFpLT5jb25maWcudHhQb3dlciA9ICh1MTYpdjsKKwkJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJCQl9CisJCX0gZWxzZSBpZiAoICFzdHJuY21wKCBsaW5lLCAiV0VQOiAiLCA1ICkgKSB7CisJCQlsaW5lICs9IDU7CisJCQlzd2l0Y2goIGxpbmVbMF0gKSB7CisJCQljYXNlICdzJzoKKwkJCQlhaS0+Y29uZmlnLmF1dGhUeXBlID0gKHUxNilBVVRIX1NIQVJFREtFWTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2UnOgorCQkJCWFpLT5jb25maWcuYXV0aFR5cGUgPSAodTE2KUFVVEhfRU5DUllQVDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYWktPmNvbmZpZy5hdXRoVHlwZSA9ICh1MTYpQVVUSF9PUEVOOworCQkJCWJyZWFrOworCQkJfQorCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQl9IGVsc2UgaWYgKCAhc3RybmNtcCggbGluZSwgIkxvbmdSZXRyeUxpbWl0OiAiLCAxNiApICkgeworCQkJaW50IHYsIGkgPSAwOworCisJCQlsaW5lICs9IDE2OworCQkJdiA9IGdldF9kZWNfdTE2KGxpbmUsICZpLCAzKTsKKwkJCXYgPSAodjwwKSA/IDAgOiAoKHY+MjU1KSA/IDI1NSA6IHYpOworCQkJYWktPmNvbmZpZy5sb25nUmV0cnlMaW1pdCA9ICh1MTYpdjsKKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJfSBlbHNlIGlmICggIXN0cm5jbXAoIGxpbmUsICJTaG9ydFJldHJ5TGltaXQ6ICIsIDE3ICkgKSB7CisJCQlpbnQgdiwgaSA9IDA7CisKKwkJCWxpbmUgKz0gMTc7CisJCQl2ID0gZ2V0X2RlY191MTYobGluZSwgJmksIDMpOworCQkJdiA9ICh2PDApID8gMCA6ICgodj4yNTUpID8gMjU1IDogdik7CisJCQlhaS0+Y29uZmlnLnNob3J0UmV0cnlMaW1pdCA9ICh1MTYpdjsKKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJfSBlbHNlIGlmICggIXN0cm5jbXAoIGxpbmUsICJSVFNUaHJlc2hvbGQ6ICIsIDE0ICkgKSB7CisJCQlpbnQgdiwgaSA9IDA7CisKKwkJCWxpbmUgKz0gMTQ7CisJCQl2ID0gZ2V0X2RlY191MTYobGluZSwgJmksIDQpOworCQkJdiA9ICh2PDApID8gMCA6ICgodj4yMzEyKSA/IDIzMTIgOiB2KTsKKwkJCWFpLT5jb25maWcucnRzVGhyZXMgPSAodTE2KXY7CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJCX0gZWxzZSBpZiAoICFzdHJuY21wKCBsaW5lLCAiVFhNU0RVTGlmZXRpbWU6ICIsIDE2ICkgKSB7CisJCQlpbnQgdiwgaSA9IDA7CisKKwkJCWxpbmUgKz0gMTY7CisJCQl2ID0gZ2V0X2RlY191MTYobGluZSwgJmksIDUpOworCQkJdiA9ICh2PDApID8gMCA6IHY7CisJCQlhaS0+Y29uZmlnLnR4TGlmZXRpbWUgPSAodTE2KXY7CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJCX0gZWxzZSBpZiAoICFzdHJuY21wKCBsaW5lLCAiUlhNU0RVTGlmZXRpbWU6ICIsIDE2ICkgKSB7CisJCQlpbnQgdiwgaSA9IDA7CisKKwkJCWxpbmUgKz0gMTY7CisJCQl2ID0gZ2V0X2RlY191MTYobGluZSwgJmksIDUpOworCQkJdiA9ICh2PDApID8gMCA6IHY7CisJCQlhaS0+Y29uZmlnLnJ4TGlmZXRpbWUgPSAodTE2KXY7CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJCX0gZWxzZSBpZiAoICFzdHJuY21wKCBsaW5lLCAiVFhEaXZlcnNpdHk6ICIsIDEzICkgKSB7CisJCQlhaS0+Y29uZmlnLnR4RGl2ZXJzaXR5ID0KKwkJCQkobGluZVsxM109PSdsJykgPyAxIDoKKwkJCQkoKGxpbmVbMTNdPT0ncicpPyAyOiAzKTsKKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJfSBlbHNlIGlmICggIXN0cm5jbXAoIGxpbmUsICJSWERpdmVyc2l0eTogIiwgMTMgKSApIHsKKwkJCWFpLT5jb25maWcucnhEaXZlcnNpdHkgPQorCQkJCShsaW5lWzEzXT09J2wnKSA/IDEgOgorCQkJCSgobGluZVsxM109PSdyJyk/IDI6IDMpOworCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQl9IGVsc2UgaWYgKCAhc3RybmNtcCggbGluZSwgIkZyYWdUaHJlc2hvbGQ6ICIsIDE1ICkgKSB7CisJCQlpbnQgdiwgaSA9IDA7CisKKwkJCWxpbmUgKz0gMTU7CisJCQl2ID0gZ2V0X2RlY191MTYobGluZSwgJmksIDQpOworCQkJdiA9ICh2PDI1NikgPyAyNTYgOiAoKHY+MjMxMikgPyAyMzEyIDogdik7CisJCQl2ID0gdiAmIDB4ZmZmZTsgLyogTWFrZSBzdXJlIGl0cyBldmVuICovCisJCQlhaS0+Y29uZmlnLmZyYWdUaHJlc2ggPSAodTE2KXY7CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAobGluZSwgIk1vZHVsYXRpb246ICIsIDEyKSkgeworCQkJbGluZSArPSAxMjsKKwkJCXN3aXRjaCgqbGluZSkgeworCQkJY2FzZSAnZCc6ICBhaS0+Y29uZmlnLm1vZHVsYXRpb249TU9EX0RFRkFVTFQ7IHNldF9iaXQoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOyBicmVhazsKKwkJCWNhc2UgJ2MnOiAgYWktPmNvbmZpZy5tb2R1bGF0aW9uPU1PRF9DQ0s7IHNldF9iaXQoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOyBicmVhazsKKwkJCWNhc2UgJ20nOiAgYWktPmNvbmZpZy5tb2R1bGF0aW9uPU1PRF9NT0s7IHNldF9iaXQoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOyBicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKCBLRVJOX1dBUk5JTkcgImFpcm86IFVua25vd24gbW9kdWxhdGlvblxuIiApOworCQkJfQorCQl9IGVsc2UgaWYgKCFzdHJuY21wKGxpbmUsICJQcmVhbWJsZTogIiwgMTApKSB7CisJCQlsaW5lICs9IDEwOworCQkJc3dpdGNoKCpsaW5lKSB7CisJCQljYXNlICdhJzogYWktPmNvbmZpZy5wcmVhbWJsZT1QUkVBTUJMRV9BVVRPOyBzZXRfYml0KEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsgYnJlYWs7CisJCQljYXNlICdsJzogYWktPmNvbmZpZy5wcmVhbWJsZT1QUkVBTUJMRV9MT05HOyBzZXRfYml0KEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsgYnJlYWs7CisJCQljYXNlICdzJzogYWktPmNvbmZpZy5wcmVhbWJsZT1QUkVBTUJMRV9TSE9SVDsgc2V0X2JpdChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7IGJyZWFrOworCQkgICAgICAgIGRlZmF1bHQ6IHByaW50ayhLRVJOX1dBUk5JTkcgImFpcm86IFVua25vd24gcHJlYW1ibGVcbiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJpbnRrKCBLRVJOX1dBUk5JTkcgIkNvdWxkbid0IGZpZ3VyZSBvdXQgJXNcbiIsIGxpbmUgKTsKKwkJfQorCQl3aGlsZSggbGluZVswXSAmJiBsaW5lWzBdICE9ICdcbicgKSBsaW5lKys7CisJCWlmICggbGluZVswXSApIGxpbmUrKzsKKwl9CisJYWlyb19jb25maWdfY29tbWl0KGRldiwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK3N0YXRpYyBjaGFyICpnZXRfcm1vZGUodTE2IG1vZGUpIHsKKyAgICAgICAgc3dpdGNoKG1vZGUmMHhmZikgeworICAgICAgICBjYXNlIFJYTU9ERV9SRk1PTjogIHJldHVybiAicmZtb24iOworICAgICAgICBjYXNlIFJYTU9ERV9SRk1PTl9BTllCU1M6ICByZXR1cm4gInluYSAoYW55KSBic3MgcmZtb24iOworICAgICAgICBjYXNlIFJYTU9ERV9MQU5NT046ICByZXR1cm4gImxhbm1vbiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICJFU1MiOworfQorCitzdGF0aWMgaW50IHByb2NfY29uZmlnX29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICkgeworCXN0cnVjdCBwcm9jX2RhdGEgKmRhdGE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShpbm9kZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRwLT5kYXRhOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCWludCBpOworCisJaWYgKChmaWxlLT5wcml2YXRlX2RhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhICksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZmlsZS0+cHJpdmF0ZV9kYXRhLCAwLCBzaXplb2Yoc3RydWN0IHByb2NfZGF0YSkpOworCWRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoKGRhdGEtPnJidWZmZXIgPSBrbWFsbG9jKCAyMDQ4LCBHRlBfS0VSTkVMICkpID09IE5VTEwpIHsKKwkJa2ZyZWUgKGZpbGUtPnByaXZhdGVfZGF0YSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpZiAoKGRhdGEtPndidWZmZXIgPSBrbWFsbG9jKCAyMDQ4LCBHRlBfS0VSTkVMICkpID09IE5VTEwpIHsKKwkJa2ZyZWUgKGRhdGEtPnJidWZmZXIpOworCQlrZnJlZSAoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCggZGF0YS0+d2J1ZmZlciwgMCwgMjA0OCApOworCWRhdGEtPm1heHdyaXRlbGVuID0gMjA0ODsKKwlkYXRhLT5vbl9jbG9zZSA9IHByb2NfY29uZmlnX29uX2Nsb3NlOworCisJcmVhZENvbmZpZ1JpZChhaSwgMSk7CisKKwlpID0gc3ByaW50ZiggZGF0YS0+cmJ1ZmZlciwKKwkJICAgICAiTW9kZTogJXNcbiIKKwkJICAgICAiUmFkaW86ICVzXG4iCisJCSAgICAgIk5vZGVOYW1lOiAlLTE2c1xuIgorCQkgICAgICJQb3dlck1vZGU6ICVzXG4iCisJCSAgICAgIkRhdGFSYXRlczogJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWRcbiIKKwkJICAgICAiQ2hhbm5lbDogJWRcbiIKKwkJICAgICAiWG1pdFBvd2VyOiAlZFxuIiwKKwkJICAgICAoYWktPmNvbmZpZy5vcG1vZGUgJiAweEZGKSA9PSAwID8gImFkaG9jIiA6CisJCSAgICAgKGFpLT5jb25maWcub3Btb2RlICYgMHhGRikgPT0gMSA/IGdldF9ybW9kZShhaS0+Y29uZmlnLnJtb2RlKToKKwkJICAgICAoYWktPmNvbmZpZy5vcG1vZGUgJiAweEZGKSA9PSAyID8gIkFQIiA6CisJCSAgICAgKGFpLT5jb25maWcub3Btb2RlICYgMHhGRikgPT0gMyA/ICJBUCBSUFRSIiA6ICJFcnJvciIsCisJCSAgICAgdGVzdF9iaXQoRkxBR19SQURJT19PRkYsICZhaS0+ZmxhZ3MpID8gIm9mZiIgOiAib24iLAorCQkgICAgIGFpLT5jb25maWcubm9kZU5hbWUsCisJCSAgICAgYWktPmNvbmZpZy5wb3dlclNhdmVNb2RlID09IDAgPyAiQ0FNIiA6CisJCSAgICAgYWktPmNvbmZpZy5wb3dlclNhdmVNb2RlID09IDEgPyAiUFNQIiA6CisJCSAgICAgYWktPmNvbmZpZy5wb3dlclNhdmVNb2RlID09IDIgPyAiUFNQQ0FNIiA6ICJFcnJvciIsCisJCSAgICAgKGludClhaS0+Y29uZmlnLnJhdGVzWzBdLAorCQkgICAgIChpbnQpYWktPmNvbmZpZy5yYXRlc1sxXSwKKwkJICAgICAoaW50KWFpLT5jb25maWcucmF0ZXNbMl0sCisJCSAgICAgKGludClhaS0+Y29uZmlnLnJhdGVzWzNdLAorCQkgICAgIChpbnQpYWktPmNvbmZpZy5yYXRlc1s0XSwKKwkJICAgICAoaW50KWFpLT5jb25maWcucmF0ZXNbNV0sCisJCSAgICAgKGludClhaS0+Y29uZmlnLnJhdGVzWzZdLAorCQkgICAgIChpbnQpYWktPmNvbmZpZy5yYXRlc1s3XSwKKwkJICAgICAoaW50KWFpLT5jb25maWcuY2hhbm5lbFNldCwKKwkJICAgICAoaW50KWFpLT5jb25maWcudHhQb3dlcgorCQkpOworCXNwcmludGYoIGRhdGEtPnJidWZmZXIgKyBpLAorCQkgIkxvbmdSZXRyeUxpbWl0OiAlZFxuIgorCQkgIlNob3J0UmV0cnlMaW1pdDogJWRcbiIKKwkJICJSVFNUaHJlc2hvbGQ6ICVkXG4iCisJCSAiVFhNU0RVTGlmZXRpbWU6ICVkXG4iCisJCSAiUlhNU0RVTGlmZXRpbWU6ICVkXG4iCisJCSAiVFhEaXZlcnNpdHk6ICVzXG4iCisJCSAiUlhEaXZlcnNpdHk6ICVzXG4iCisJCSAiRnJhZ1RocmVzaG9sZDogJWRcbiIKKwkJICJXRVA6ICVzXG4iCisJCSAiTW9kdWxhdGlvbjogJXNcbiIKKwkJICJQcmVhbWJsZTogJXNcbiIsCisJCSAoaW50KWFpLT5jb25maWcubG9uZ1JldHJ5TGltaXQsCisJCSAoaW50KWFpLT5jb25maWcuc2hvcnRSZXRyeUxpbWl0LAorCQkgKGludClhaS0+Y29uZmlnLnJ0c1RocmVzLAorCQkgKGludClhaS0+Y29uZmlnLnR4TGlmZXRpbWUsCisJCSAoaW50KWFpLT5jb25maWcucnhMaWZldGltZSwKKwkJIGFpLT5jb25maWcudHhEaXZlcnNpdHkgPT0gMSA/ICJsZWZ0IiA6CisJCSBhaS0+Y29uZmlnLnR4RGl2ZXJzaXR5ID09IDIgPyAicmlnaHQiIDogImJvdGgiLAorCQkgYWktPmNvbmZpZy5yeERpdmVyc2l0eSA9PSAxID8gImxlZnQiIDoKKwkJIGFpLT5jb25maWcucnhEaXZlcnNpdHkgPT0gMiA/ICJyaWdodCIgOiAiYm90aCIsCisJCSAoaW50KWFpLT5jb25maWcuZnJhZ1RocmVzaCwKKwkJIGFpLT5jb25maWcuYXV0aFR5cGUgPT0gQVVUSF9FTkNSWVBUID8gImVuY3J5cHQiIDoKKwkJIGFpLT5jb25maWcuYXV0aFR5cGUgPT0gQVVUSF9TSEFSRURLRVkgPyAic2hhcmVkIiA6ICJvcGVuIiwKKwkJIGFpLT5jb25maWcubW9kdWxhdGlvbiA9PSAwID8gImRlZmF1bHQiIDoKKwkJIGFpLT5jb25maWcubW9kdWxhdGlvbiA9PSBNT0RfQ0NLID8gImNjayIgOgorCQkgYWktPmNvbmZpZy5tb2R1bGF0aW9uID09IE1PRF9NT0sgPyAibW9rIiA6ICJlcnJvciIsCisJCSBhaS0+Y29uZmlnLnByZWFtYmxlID09IFBSRUFNQkxFX0FVVE8gPyAiYXV0byIgOgorCQkgYWktPmNvbmZpZy5wcmVhbWJsZSA9PSBQUkVBTUJMRV9MT05HID8gImxvbmciIDoKKwkJIGFpLT5jb25maWcucHJlYW1ibGUgPT0gUFJFQU1CTEVfU0hPUlQgPyAic2hvcnQiIDogImVycm9yIgorCQkpOworCWRhdGEtPnJlYWRsZW4gPSBzdHJsZW4oIGRhdGEtPnJidWZmZXIgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJvY19TU0lEX29uX2Nsb3NlKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApIHsKKwlzdHJ1Y3QgcHJvY19kYXRhICpkYXRhID0gKHN0cnVjdCBwcm9jX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShpbm9kZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRwLT5kYXRhOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCVNzaWRSaWQgU1NJRF9yaWQ7CisJUmVzcCByc3A7CisJaW50IGk7CisJaW50IG9mZnNldCA9IDA7CisKKwlpZiAoICFkYXRhLT53cml0ZWxlbiApIHJldHVybjsKKworCW1lbXNldCggJlNTSURfcmlkLCAwLCBzaXplb2YoIFNTSURfcmlkICkgKTsKKworCWZvciggaSA9IDA7IGkgPCAzOyBpKysgKSB7CisJCWludCBqOworCQlmb3IoIGogPSAwOyBqK29mZnNldCA8IGRhdGEtPndyaXRlbGVuICYmIGogPCAzMiAmJgorCQkJICAgICBkYXRhLT53YnVmZmVyW29mZnNldCtqXSAhPSAnXG4nOyBqKysgKSB7CisJCQlTU0lEX3JpZC5zc2lkc1tpXS5zc2lkW2pdID0gZGF0YS0+d2J1ZmZlcltvZmZzZXQral07CisJCX0KKwkJaWYgKCBqID09IDAgKSBicmVhazsKKwkJU1NJRF9yaWQuc3NpZHNbaV0ubGVuID0gajsKKwkJb2Zmc2V0ICs9IGo7CisJCXdoaWxlKCBkYXRhLT53YnVmZmVyW29mZnNldF0gIT0gJ1xuJyAmJgorCQkgICAgICAgb2Zmc2V0IDwgZGF0YS0+d3JpdGVsZW4gKSBvZmZzZXQrKzsKKwkJb2Zmc2V0Kys7CisJfQorCWlmIChpKQorCQlTU0lEX3JpZC5sZW4gPSBzaXplb2YoU1NJRF9yaWQpOworCWRpc2FibGVfTUFDKGFpLCAxKTsKKwl3cml0ZVNzaWRSaWQoYWksICZTU0lEX3JpZCwgMSk7CisJZW5hYmxlX01BQyhhaSwgJnJzcCwgMSk7Cit9CisKK2lubGluZSBzdGF0aWMgdTggaGV4VmFsKGNoYXIgYykgeworCWlmIChjPj0nMCcgJiYgYzw9JzknKSByZXR1cm4gYyAtPSAnMCc7CisJaWYgKGM+PSdhJyAmJiBjPD0nZicpIHJldHVybiBjIC09ICdhJy0xMDsKKwlpZiAoYz49J0EnICYmIGM8PSdGJykgcmV0dXJuIGMgLT0gJ0EnLTEwOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcm9jX0FQTGlzdF9vbl9jbG9zZSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKSB7CisJc3RydWN0IHByb2NfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgcHJvY19kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vZGUpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcC0+ZGF0YTsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlBUExpc3RSaWQgQVBMaXN0X3JpZDsKKwlSZXNwIHJzcDsKKwlpbnQgaTsKKworCWlmICggIWRhdGEtPndyaXRlbGVuICkgcmV0dXJuOworCisJbWVtc2V0KCAmQVBMaXN0X3JpZCwgMCwgc2l6ZW9mKEFQTGlzdF9yaWQpICk7CisJQVBMaXN0X3JpZC5sZW4gPSBzaXplb2YoQVBMaXN0X3JpZCk7CisKKwlmb3IoIGkgPSAwOyBpIDwgNCAmJiBkYXRhLT53cml0ZWxlbiA+PSAoaSsxKSo2KjM7IGkrKyApIHsKKwkJaW50IGo7CisJCWZvciggaiA9IDA7IGogPCA2KjMgJiYgZGF0YS0+d2J1ZmZlcltqK2kqNiozXTsgaisrICkgeworCQkJc3dpdGNoKGolMykgeworCQkJY2FzZSAwOgorCQkJCUFQTGlzdF9yaWQuYXBbaV1bai8zXT0KKwkJCQkJaGV4VmFsKGRhdGEtPndidWZmZXJbaitpKjYqM10pPDw0OworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCUFQTGlzdF9yaWQuYXBbaV1bai8zXXw9CisJCQkJCWhleFZhbChkYXRhLT53YnVmZmVyW2oraSo2KjNdKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlkaXNhYmxlX01BQyhhaSwgMSk7CisJd3JpdGVBUExpc3RSaWQoYWksICZBUExpc3RfcmlkLCAxKTsKKwllbmFibGVfTUFDKGFpLCAmcnNwLCAxKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiB3cmFwcyBQQzQ1MDBfd3JpdGVyaWQgd2l0aCBhIE1BQyBkaXNhYmxlICovCitzdGF0aWMgaW50IGRvX3dyaXRlcmlkKCBzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTE2IHJpZCwgY29uc3Qgdm9pZCAqcmlkX2RhdGEsCisJCQlpbnQgbGVuLCBpbnQgZHVtbXkgKSB7CisJaW50IHJjOworCVJlc3AgcnNwOworCisJZGlzYWJsZV9NQUMoYWksIDEpOworCXJjID0gUEM0NTAwX3dyaXRlcmlkKGFpLCByaWQsIHJpZF9kYXRhLCBsZW4sIDEpOworCWVuYWJsZV9NQUMoYWksICZyc3AsIDEpOworCXJldHVybiByYzsKK30KKworLyogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBrZXkgYXQgdGhlIGluZGV4LiAgSWYgaW5kZXggPT0gMHhmZmZmCisgKiB0aGUgaW5kZXggb2YgdGhlIHRyYW5zbWl0IGtleSBpcyByZXR1cm5lZC4gIElmIHRoZSBrZXkgZG9lc24ndCBleGlzdCwKKyAqIC0xIHdpbGwgYmUgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X3dlcF9rZXkoc3RydWN0IGFpcm9faW5mbyAqYWksIHUxNiBpbmRleCkgeworCVdlcEtleVJpZCB3a3I7CisJaW50IHJjOworCXUxNiBsYXN0aW5kZXg7CisKKwlyYyA9IHJlYWRXZXBLZXlSaWQoYWksICZ3a3IsIDEsIDEpOworCWlmIChyYyA9PSBTVUNDRVNTKSBkbyB7CisJCWxhc3RpbmRleCA9IHdrci5raW5kZXg7CisJCWlmICh3a3Iua2luZGV4ID09IGluZGV4KSB7CisJCQlpZiAoaW5kZXggPT0gMHhmZmZmKSB7CisJCQkJcmV0dXJuIHdrci5tYWNbMF07CisJCQl9CisJCQlyZXR1cm4gd2tyLmtsZW47CisJCX0KKwkJcmVhZFdlcEtleVJpZChhaSwgJndrciwgMCwgMSk7CisJfSB3aGlsZShsYXN0aW5kZXggIT0gd2tyLmtpbmRleCk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHNldF93ZXBfa2V5KHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MTYgaW5kZXgsCisJCSAgICAgICBjb25zdCBjaGFyICprZXksIHUxNiBrZXlsZW4sIGludCBwZXJtLCBpbnQgbG9jayApIHsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtYWNhZGRyW0VUSF9BTEVOXSA9IHsgMHgwMSwgMCwgMCwgMCwgMCwgMCB9OworCVdlcEtleVJpZCB3a3I7CisJUmVzcCByc3A7CisKKwltZW1zZXQoJndrciwgMCwgc2l6ZW9mKHdrcikpOworCWlmIChrZXlsZW4gPT0gMCkgeworLy8gV2UgYXJlIHNlbGVjdGluZyB3aGljaCBrZXkgdG8gdXNlCisJCXdrci5sZW4gPSBzaXplb2Yod2tyKTsKKwkJd2tyLmtpbmRleCA9IDB4ZmZmZjsKKwkJd2tyLm1hY1swXSA9IChjaGFyKWluZGV4OworCQlpZiAocGVybSkgcHJpbnRrKEtFUk5fSU5GTyAiU2V0dGluZyB0cmFuc21pdCBrZXkgdG8gJWRcbiIsIGluZGV4KTsKKwkJaWYgKHBlcm0pIGFpLT5kZWZpbmRleCA9IChjaGFyKWluZGV4OworCX0gZWxzZSB7CisvLyBXZSBhcmUgYWN0dWFsbHkgc2V0dGluZyB0aGUga2V5CisJCXdrci5sZW4gPSBzaXplb2Yod2tyKTsKKwkJd2tyLmtpbmRleCA9IGluZGV4OworCQl3a3Iua2xlbiA9IGtleWxlbjsKKwkJbWVtY3B5KCB3a3Iua2V5LCBrZXksIGtleWxlbiApOworCQltZW1jcHkoIHdrci5tYWMsIG1hY2FkZHIsIEVUSF9BTEVOICk7CisJCXByaW50ayhLRVJOX0lORk8gIlNldHRpbmcga2V5ICVkXG4iLCBpbmRleCk7CisJfQorCisJZGlzYWJsZV9NQUMoYWksIGxvY2spOworCXdyaXRlV2VwS2V5UmlkKGFpLCAmd2tyLCBwZXJtLCBsb2NrKTsKKwllbmFibGVfTUFDKGFpLCAmcnNwLCBsb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJvY193ZXBrZXlfb25fY2xvc2UoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICkgeworCXN0cnVjdCBwcm9jX2RhdGEgKmRhdGE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShpbm9kZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRwLT5kYXRhOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCWludCBpOworCWNoYXIga2V5WzE2XTsKKwl1MTYgaW5kZXggPSAwOworCWludCBqID0gMDsKKworCW1lbXNldChrZXksIDAsIHNpemVvZihrZXkpKTsKKworCWRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoICFkYXRhLT53cml0ZWxlbiApIHJldHVybjsKKworCWlmIChkYXRhLT53YnVmZmVyWzBdID49ICcwJyAmJiBkYXRhLT53YnVmZmVyWzBdIDw9ICczJyAmJgorCSAgICAoZGF0YS0+d2J1ZmZlclsxXSA9PSAnICcgfHwgZGF0YS0+d2J1ZmZlclsxXSA9PSAnXG4nKSkgeworCQlpbmRleCA9IGRhdGEtPndidWZmZXJbMF0gLSAnMCc7CisJCWlmIChkYXRhLT53YnVmZmVyWzFdID09ICdcbicpIHsKKwkJCXNldF93ZXBfa2V5KGFpLCBpbmRleCwgTlVMTCwgMCwgMSwgMSk7CisJCQlyZXR1cm47CisJCX0KKwkJaiA9IDI7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiAgV2VwS2V5IHBhc3NlZCBpbnZhbGlkIGtleSBpbmRleFxuIik7CisJCXJldHVybjsKKwl9CisKKwlmb3IoIGkgPSAwOyBpIDwgMTYqMyAmJiBkYXRhLT53YnVmZmVyW2kral07IGkrKyApIHsKKwkJc3dpdGNoKGklMykgeworCQljYXNlIDA6CisJCQlrZXlbaS8zXSA9IGhleFZhbChkYXRhLT53YnVmZmVyW2kral0pPDw0OworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWtleVtpLzNdIHw9IGhleFZhbChkYXRhLT53YnVmZmVyW2kral0pOworCQkJYnJlYWs7CisJCX0KKwl9CisJc2V0X3dlcF9rZXkoYWksIGluZGV4LCBrZXksIGkvMywgMSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY193ZXBrZXlfb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKSB7CisJc3RydWN0IHByb2NfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGlub2RlKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHAtPmRhdGE7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJY2hhciAqcHRyOworCVdlcEtleVJpZCB3a3I7CisJdTE2IGxhc3RpbmRleDsKKwlpbnQgaj0wOworCWludCByYzsKKworCWlmICgoZmlsZS0+cHJpdmF0ZV9kYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHByb2NfZGF0YSApLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGZpbGUtPnByaXZhdGVfZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBwcm9jX2RhdGEpKTsKKwltZW1zZXQoJndrciwgMCwgc2l6ZW9mKHdrcikpOworCWRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoKGRhdGEtPnJidWZmZXIgPSBrbWFsbG9jKCAxODAsIEdGUF9LRVJORUwgKSkgPT0gTlVMTCkgeworCQlrZnJlZSAoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChkYXRhLT5yYnVmZmVyLCAwLCAxODApOworCWRhdGEtPndyaXRlbGVuID0gMDsKKwlkYXRhLT5tYXh3cml0ZWxlbiA9IDgwOworCWlmICgoZGF0YS0+d2J1ZmZlciA9IGttYWxsb2MoIDgwLCBHRlBfS0VSTkVMICkpID09IE5VTEwpIHsKKwkJa2ZyZWUgKGRhdGEtPnJidWZmZXIpOworCQlrZnJlZSAoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCggZGF0YS0+d2J1ZmZlciwgMCwgODAgKTsKKwlkYXRhLT5vbl9jbG9zZSA9IHByb2Nfd2Vwa2V5X29uX2Nsb3NlOworCisJcHRyID0gZGF0YS0+cmJ1ZmZlcjsKKwlzdHJjcHkocHRyLCAiTm8gd2VwIGtleXNcbiIpOworCXJjID0gcmVhZFdlcEtleVJpZChhaSwgJndrciwgMSwgMSk7CisJaWYgKHJjID09IFNVQ0NFU1MpIGRvIHsKKwkJbGFzdGluZGV4ID0gd2tyLmtpbmRleDsKKwkJaWYgKHdrci5raW5kZXggPT0gMHhmZmZmKSB7CisJCQlqICs9IHNwcmludGYocHRyK2osICJUeCBrZXkgPSAlZFxuIiwKKwkJCQkgICAgIChpbnQpd2tyLm1hY1swXSk7CisJCX0gZWxzZSB7CisJCQlqICs9IHNwcmludGYocHRyK2osICJLZXkgJWQgc2V0IHdpdGggbGVuZ3RoID0gJWRcbiIsCisJCQkJICAgICAoaW50KXdrci5raW5kZXgsIChpbnQpd2tyLmtsZW4pOworCQl9CisJCXJlYWRXZXBLZXlSaWQoYWksICZ3a3IsIDAsIDEpOworCX0gd2hpbGUoKGxhc3RpbmRleCAhPSB3a3Iua2luZGV4KSAmJiAoaiA8IDE4MC0zMCkpOworCisJZGF0YS0+cmVhZGxlbiA9IHN0cmxlbiggZGF0YS0+cmJ1ZmZlciApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2NfU1NJRF9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApIHsKKwlzdHJ1Y3QgcHJvY19kYXRhICpkYXRhOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vZGUpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcC0+ZGF0YTsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKwljaGFyICpwdHI7CisJU3NpZFJpZCBTU0lEX3JpZDsKKworCWlmICgoZmlsZS0+cHJpdmF0ZV9kYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHByb2NfZGF0YSApLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGZpbGUtPnByaXZhdGVfZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBwcm9jX2RhdGEpKTsKKwlkYXRhID0gKHN0cnVjdCBwcm9jX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKChkYXRhLT5yYnVmZmVyID0ga21hbGxvYyggMTA0LCBHRlBfS0VSTkVMICkpID09IE5VTEwpIHsKKwkJa2ZyZWUgKGZpbGUtPnByaXZhdGVfZGF0YSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlkYXRhLT53cml0ZWxlbiA9IDA7CisJZGF0YS0+bWF4d3JpdGVsZW4gPSAzMyozOworCWlmICgoZGF0YS0+d2J1ZmZlciA9IGttYWxsb2MoIDMzKjMsIEdGUF9LRVJORUwgKSkgPT0gTlVMTCkgeworCQlrZnJlZSAoZGF0YS0+cmJ1ZmZlcik7CisJCWtmcmVlIChmaWxlLT5wcml2YXRlX2RhdGEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KCBkYXRhLT53YnVmZmVyLCAwLCAzMyozICk7CisJZGF0YS0+b25fY2xvc2UgPSBwcm9jX1NTSURfb25fY2xvc2U7CisKKwlyZWFkU3NpZFJpZChhaSwgJlNTSURfcmlkKTsKKwlwdHIgPSBkYXRhLT5yYnVmZmVyOworCWZvciggaSA9IDA7IGkgPCAzOyBpKysgKSB7CisJCWludCBqOworCQlpZiAoICFTU0lEX3JpZC5zc2lkc1tpXS5sZW4gKSBicmVhazsKKwkJZm9yKCBqID0gMDsgaiA8IDMyICYmCisJCQkgICAgIGogPCBTU0lEX3JpZC5zc2lkc1tpXS5sZW4gJiYKKwkJCSAgICAgU1NJRF9yaWQuc3NpZHNbaV0uc3NpZFtqXTsgaisrICkgeworCQkJKnB0cisrID0gU1NJRF9yaWQuc3NpZHNbaV0uc3NpZFtqXTsKKwkJfQorCQkqcHRyKysgPSAnXG4nOworCX0KKwkqcHRyID0gJ1wwJzsKKwlkYXRhLT5yZWFkbGVuID0gc3RybGVuKCBkYXRhLT5yYnVmZmVyICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19BUExpc3Rfb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKSB7CisJc3RydWN0IHByb2NfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGlub2RlKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHAtPmRhdGE7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJaW50IGk7CisJY2hhciAqcHRyOworCUFQTGlzdFJpZCBBUExpc3RfcmlkOworCisJaWYgKChmaWxlLT5wcml2YXRlX2RhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhICksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZmlsZS0+cHJpdmF0ZV9kYXRhLCAwLCBzaXplb2Yoc3RydWN0IHByb2NfZGF0YSkpOworCWRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoKGRhdGEtPnJidWZmZXIgPSBrbWFsbG9jKCAxMDQsIEdGUF9LRVJORUwgKSkgPT0gTlVMTCkgeworCQlrZnJlZSAoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWRhdGEtPndyaXRlbGVuID0gMDsKKwlkYXRhLT5tYXh3cml0ZWxlbiA9IDQqNiozOworCWlmICgoZGF0YS0+d2J1ZmZlciA9IGttYWxsb2MoIGRhdGEtPm1heHdyaXRlbGVuLCBHRlBfS0VSTkVMICkpID09IE5VTEwpIHsKKwkJa2ZyZWUgKGRhdGEtPnJidWZmZXIpOworCQlrZnJlZSAoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCggZGF0YS0+d2J1ZmZlciwgMCwgZGF0YS0+bWF4d3JpdGVsZW4gKTsKKwlkYXRhLT5vbl9jbG9zZSA9IHByb2NfQVBMaXN0X29uX2Nsb3NlOworCisJcmVhZEFQTGlzdFJpZChhaSwgJkFQTGlzdF9yaWQpOworCXB0ciA9IGRhdGEtPnJidWZmZXI7CisJZm9yKCBpID0gMDsgaSA8IDQ7IGkrKyApIHsKKy8vIFdlIGVuZCB3aGVuIHdlIGZpbmQgYSB6ZXJvIE1BQworCQlpZiAoICEqKGludCopQVBMaXN0X3JpZC5hcFtpXSAmJgorCQkgICAgICEqKGludCopJkFQTGlzdF9yaWQuYXBbaV1bMl0pIGJyZWFrOworCQlwdHIgKz0gc3ByaW50ZihwdHIsICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCSAgICAgICAoaW50KUFQTGlzdF9yaWQuYXBbaV1bMF0sCisJCQkgICAgICAgKGludClBUExpc3RfcmlkLmFwW2ldWzFdLAorCQkJICAgICAgIChpbnQpQVBMaXN0X3JpZC5hcFtpXVsyXSwKKwkJCSAgICAgICAoaW50KUFQTGlzdF9yaWQuYXBbaV1bM10sCisJCQkgICAgICAgKGludClBUExpc3RfcmlkLmFwW2ldWzRdLAorCQkJICAgICAgIChpbnQpQVBMaXN0X3JpZC5hcFtpXVs1XSk7CisJfQorCWlmIChpPT0wKSBwdHIgKz0gc3ByaW50ZihwdHIsICJOb3QgdXNpbmcgc3BlY2lmaWMgQVBzXG4iKTsKKworCSpwdHIgPSAnXDAnOworCWRhdGEtPnJlYWRsZW4gPSBzdHJsZW4oIGRhdGEtPnJidWZmZXIgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jX0JTU0xpc3Rfb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKSB7CisJc3RydWN0IHByb2NfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGlub2RlKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHAtPmRhdGE7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJY2hhciAqcHRyOworCUJTU0xpc3RSaWQgQlNTTGlzdF9yaWQ7CisJaW50IHJjOworCS8qIElmIGRvTG9zZVN5bmMgaXMgbm90IDEsIHdlIHdvbid0IGRvIGEgTG9zZSBTeW5jICovCisJaW50IGRvTG9zZVN5bmMgPSAtMTsKKworCWlmICgoZmlsZS0+cHJpdmF0ZV9kYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHByb2NfZGF0YSApLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGZpbGUtPnByaXZhdGVfZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBwcm9jX2RhdGEpKTsKKwlkYXRhID0gKHN0cnVjdCBwcm9jX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKChkYXRhLT5yYnVmZmVyID0ga21hbGxvYyggMTAyNCwgR0ZQX0tFUk5FTCApKSA9PSBOVUxMKSB7CisJCWtmcmVlIChmaWxlLT5wcml2YXRlX2RhdGEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZGF0YS0+d3JpdGVsZW4gPSAwOworCWRhdGEtPm1heHdyaXRlbGVuID0gMDsKKwlkYXRhLT53YnVmZmVyID0gTlVMTDsKKwlkYXRhLT5vbl9jbG9zZSA9IE5VTEw7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKKwkJCUNtZCBjbWQ7CisJCQlSZXNwIHJzcDsKKworCQkJaWYgKGFpLT5mbGFncyAmIEZMQUdfUkFESU9fTUFTSykgcmV0dXJuIC1FTkVURE9XTjsKKwkJCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJCQljbWQuY21kPUNNRF9MSVNUQlNTOworCQkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYWktPnNlbSkpCisJCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJCWlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCk7CisJCQl1cCgmYWktPnNlbSk7CisJCQlkYXRhLT5yZWFkbGVuID0gMDsKKwkJCXJldHVybiAwOworCQl9CisJCWRvTG9zZVN5bmMgPSAxOworCX0KKwlwdHIgPSBkYXRhLT5yYnVmZmVyOworCS8qIFRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gaGVyZSBpZiB0aGVyZSBhcmUgY29uY3VycmVudCBvcGVucy4KKyAgICAgICAgICAgU2luY2UgaXQgaXMgYSByYXJlIGNvbmRpdGlvbiwgd2UnbGwganVzdCBsaXZlIHdpdGggaXQsIG90aGVyd2lzZQorICAgICAgICAgICB3ZSBoYXZlIHRvIGFkZCBhIHNwaW4gbG9jay4uLiAqLworCXJjID0gcmVhZEJTU0xpc3RSaWQoYWksIGRvTG9zZVN5bmMsICZCU1NMaXN0X3JpZCk7CisJd2hpbGUocmMgPT0gMCAmJiBCU1NMaXN0X3JpZC5pbmRleCAhPSAweGZmZmYpIHsKKwkJcHRyICs9IHNwcmludGYocHRyLCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggJSpzIHJzc2kgPSAlZCIsCisJCQkJKGludClCU1NMaXN0X3JpZC5ic3NpZFswXSwKKwkJCQkoaW50KUJTU0xpc3RfcmlkLmJzc2lkWzFdLAorCQkJCShpbnQpQlNTTGlzdF9yaWQuYnNzaWRbMl0sCisJCQkJKGludClCU1NMaXN0X3JpZC5ic3NpZFszXSwKKwkJCQkoaW50KUJTU0xpc3RfcmlkLmJzc2lkWzRdLAorCQkJCShpbnQpQlNTTGlzdF9yaWQuYnNzaWRbNV0sCisJCQkJKGludClCU1NMaXN0X3JpZC5zc2lkTGVuLAorCQkJCUJTU0xpc3RfcmlkLnNzaWQsCisJCQkJKGludClCU1NMaXN0X3JpZC5yc3NpKTsKKwkJcHRyICs9IHNwcmludGYocHRyLCAiIGNoYW5uZWwgPSAlZCAlcyAlcyAlcyAlc1xuIiwKKwkJCQkoaW50KUJTU0xpc3RfcmlkLmRzQ2hhbm5lbCwKKwkJCQlCU1NMaXN0X3JpZC5jYXAgJiBDQVBfRVNTID8gIkVTUyIgOiAiIiwKKwkJCQlCU1NMaXN0X3JpZC5jYXAgJiBDQVBfSUJTUyA/ICJhZGhvYyIgOiAiIiwKKwkJCQlCU1NMaXN0X3JpZC5jYXAgJiBDQVBfUFJJVkFDWSA/ICJ3ZXAiIDogIiIsCisJCQkJQlNTTGlzdF9yaWQuY2FwICYgQ0FQX1NIT1JUSERSID8gInNob3J0aGRyIiA6ICIiKTsKKwkJcmMgPSByZWFkQlNTTGlzdFJpZChhaSwgMCwgJkJTU0xpc3RfcmlkKTsKKwl9CisJKnB0ciA9ICdcMCc7CisJZGF0YS0+cmVhZGxlbiA9IHN0cmxlbiggZGF0YS0+cmJ1ZmZlciApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2NfY2xvc2UoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICkKK3sKKwlzdHJ1Y3QgcHJvY19kYXRhICpkYXRhID0gKHN0cnVjdCBwcm9jX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKCBkYXRhLT5vbl9jbG9zZSAhPSBOVUxMICkgZGF0YS0+b25fY2xvc2UoIGlub2RlLCBmaWxlICk7CisJaWYgKCBkYXRhLT5yYnVmZmVyICkga2ZyZWUoIGRhdGEtPnJidWZmZXIgKTsKKwlpZiAoIGRhdGEtPndidWZmZXIgKSBrZnJlZSggZGF0YS0+d2J1ZmZlciApOworCWtmcmVlKCBkYXRhICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9saXN0IHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX2xpc3QgKm5leHQ7Cit9ICphaXJvX2RldmljZXM7CisKKy8qIFNpbmNlIHRoZSBjYXJkIGRvZXNuJ3QgYXV0b21hdGljYWxseSBzd2l0Y2ggdG8gdGhlIHJpZ2h0IFdFUCBtb2RlLAorICAgd2Ugd2lsbCBtYWtlIGl0IGRvIGl0LiAgSWYgdGhlIGNhcmQgaXNuJ3QgYXNzb2NpYXRlZCwgZXZlcnkgc2VjcyB3ZQorICAgd2lsbCBzd2l0Y2ggV0VQIG1vZGVzIHRvIHNlZSBpZiB0aGF0IHdpbGwgaGVscC4gIElmIHRoZSBjYXJkIGlzCisgICBhc3NvY2lhdGVkIHdlIHdpbGwgY2hlY2sgZXZlcnkgbWludXRlIHRvIHNlZSBpZiBhbnl0aGluZyBoYXMKKyAgIGNoYW5nZWQuICovCitzdGF0aWMgdm9pZCB0aW1lcl9mdW5jKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkgeworCXN0cnVjdCBhaXJvX2luZm8gKmFwcml2ID0gZGV2LT5wcml2OworCVJlc3AgcnNwOworCisvKiBXZSBkb24ndCBoYXZlIGEgbGluayBzbyB0cnkgY2hhbmdpbmcgdGhlIGF1dGh0eXBlICovCisJcmVhZENvbmZpZ1JpZChhcHJpdiwgMCk7CisJZGlzYWJsZV9NQUMoYXByaXYsIDApOworCXN3aXRjaChhcHJpdi0+Y29uZmlnLmF1dGhUeXBlKSB7CisJCWNhc2UgQVVUSF9FTkNSWVBUOgorLyogU28gZHJvcCB0byBPUEVOICovCisJCQlhcHJpdi0+Y29uZmlnLmF1dGhUeXBlID0gQVVUSF9PUEVOOworCQkJYnJlYWs7CisJCWNhc2UgQVVUSF9TSEFSRURLRVk6CisJCQlpZiAoYXByaXYtPmtleWluZGV4IDwgYXV0b193ZXApIHsKKwkJCQlzZXRfd2VwX2tleShhcHJpdiwgYXByaXYtPmtleWluZGV4LCBOVUxMLCAwLCAwLCAwKTsKKwkJCQlhcHJpdi0+Y29uZmlnLmF1dGhUeXBlID0gQVVUSF9TSEFSRURLRVk7CisJCQkJYXByaXYtPmtleWluZGV4Kys7CisJCQl9IGVsc2UgeworCQkJICAgICAgICAvKiBEcm9wIHRvIEVOQ1JZUFQgKi8KKwkJCQlhcHJpdi0+a2V5aW5kZXggPSAwOworCQkJCXNldF93ZXBfa2V5KGFwcml2LCBhcHJpdi0+ZGVmaW5kZXgsIE5VTEwsIDAsIDAsIDApOworCQkJCWFwcml2LT5jb25maWcuYXV0aFR5cGUgPSBBVVRIX0VOQ1JZUFQ7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDogIC8qIFdlJ2xsIGVzY2FsYXRlIHRvIFNIQVJFREtFWSAqLworCQkJYXByaXYtPmNvbmZpZy5hdXRoVHlwZSA9IEFVVEhfU0hBUkVES0VZOworCX0KKwlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFwcml2LT5mbGFncyk7CisJd3JpdGVDb25maWdSaWQoYXByaXYsIDApOworCWVuYWJsZV9NQUMoYXByaXYsICZyc3AsIDApOworCXVwKCZhcHJpdi0+c2VtKTsKKworLyogU2NoZWR1bGUgY2hlY2sgdG8gc2VlIGlmIHRoZSBjaGFuZ2Ugd29ya2VkICovCisJY2xlYXJfYml0KEpPQl9BVVRPV0VQLCAmYXByaXYtPmZsYWdzKTsKKwlhcHJpdi0+ZXhwaXJlcyA9IFJVTl9BVChIWiozKTsKK30KKworc3RhdGljIGludCBhZGRfYWlyb19kZXYoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKSB7CisJc3RydWN0IG5ldF9kZXZpY2VfbGlzdCAqbm9kZSA9IGttYWxsb2MoIHNpemVvZiggKm5vZGUgKSwgR0ZQX0tFUk5FTCApOworCWlmICggIW5vZGUgKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5vZGUtPmRldiA9IGRldjsKKwlub2RlLT5uZXh0ID0gYWlyb19kZXZpY2VzOworCWFpcm9fZGV2aWNlcyA9IG5vZGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVsX2Fpcm9fZGV2KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkgeworCXN0cnVjdCBuZXRfZGV2aWNlX2xpc3QgKipwID0gJmFpcm9fZGV2aWNlczsKKwl3aGlsZSggKnAgJiYgKCAoKnApLT5kZXYgIT0gZGV2ICkgKQorCQlwID0gJigqcCktPm5leHQ7CisJaWYgKCAqcCAmJiAoKnApLT5kZXYgPT0gZGV2ICkKKwkJKnAgPSAoKnApLT5uZXh0OworfQorCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGludCBfX2RldmluaXQgYWlyb19wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCXJldHVybiAtRU5PREVWOworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJaWYgKHBkZXYtPmRldmljZSA9PSAweDUwMDAgfHwgcGRldi0+ZGV2aWNlID09IDB4YTUwNCkKKwkJCWRldiA9IF9pbml0X2Fpcm9fY2FyZChwZGV2LT5pcnEsIHBkZXYtPnJlc291cmNlWzBdLnN0YXJ0LCAwLCBwZGV2LCAmcGRldi0+ZGV2KTsKKwllbHNlCisJCQlkZXYgPSBfaW5pdF9haXJvX2NhcmQocGRldi0+aXJxLCBwZGV2LT5yZXNvdXJjZVsyXS5zdGFydCwgMCwgcGRldiwgJnBkZXYtPmRldik7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhaXJvX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7Cit9CisKK3N0YXRpYyBpbnQgYWlyb19wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJQ21kIGNtZDsKKwlSZXNwIHJzcDsKKworCWlmICgoYWktPkFQTGlzdCA9PSBOVUxMKSAmJgorCQkoYWktPkFQTGlzdCA9IGttYWxsb2Moc2l6ZW9mKEFQTGlzdFJpZCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoKGFpLT5TU0lEID09IE5VTEwpICYmCisJCShhaS0+U1NJRCA9IGttYWxsb2Moc2l6ZW9mKFNzaWRSaWQpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmVhZEFQTGlzdFJpZChhaSwgYWktPkFQTGlzdCk7CisJcmVhZFNzaWRSaWQoYWksIGFpLT5TU0lEKTsKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCS8qIHRoZSBsb2NrIHdpbGwgYmUgcmVsZWFzZWQgYXQgdGhlIGVuZCBvZiB0aGUgcmVzdW1lIGNhbGxiYWNrICovCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYWktPnNlbSkpCisJCXJldHVybiAtRUFHQUlOOworCWRpc2FibGVfTUFDKGFpLCAwKTsKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJYWktPnBvd2VyID0gc3RhdGU7CisJY21kLmNtZD1IT1NUU0xFRVA7CisJaXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKTsKKworCXBjaV9lbmFibGVfd2FrZShwZGV2LCBzdGF0ZSwgMSk7CisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJcmV0dXJuIHBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgc3RhdGUpOworfQorCitzdGF0aWMgaW50IGFpcm9fcGNpX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCVJlc3AgcnNwOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCAwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgYWktPnBvd2VyLCAwKTsKKworCWlmIChhaS0+cG93ZXIgPiAxKSB7CisJCXJlc2V0X2NhcmQoZGV2LCAwKTsKKwkJbXBpX2luaXRfZGVzY3JpcHRvcnMoYWkpOworCQlzZXR1cF9jYXJkKGFpLCBkZXYtPmRldl9hZGRyLCAwKTsKKwkJY2xlYXJfYml0KEZMQUdfUkFESU9fT0ZGLCAmYWktPmZsYWdzKTsKKwkJY2xlYXJfYml0KEZMQUdfUEVORElOR19YTUlULCAmYWktPmZsYWdzKTsKKwl9IGVsc2UgeworCQlPVVQ0NTAwKGFpLCBFVkFDSywgRVZfQVdBS0VOKTsKKwkJT1VUNDUwMChhaSwgRVZBQ0ssIEVWX0FXQUtFTik7CisJCW1zbGVlcCgxMDApOworCX0KKworCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwlkaXNhYmxlX01BQyhhaSwgMCk7CisgICAgICAgIG1zbGVlcCgyMDApOworCWlmIChhaS0+U1NJRCkgeworCQl3cml0ZVNzaWRSaWQoYWksIGFpLT5TU0lELCAwKTsKKwkJa2ZyZWUoYWktPlNTSUQpOworCQlhaS0+U1NJRCA9IE5VTEw7CisJfQorCWlmIChhaS0+QVBMaXN0KSB7CisJCXdyaXRlQVBMaXN0UmlkKGFpLCBhaS0+QVBMaXN0LCAwKTsKKwkJa2ZyZWUoYWktPkFQTGlzdCk7CisJCWFpLT5BUExpc3QgPSBOVUxMOworCX0KKwl3cml0ZUNvbmZpZ1JpZChhaSwgMCk7CisJZW5hYmxlX01BQyhhaSwgJnJzcCwgMCk7CisJYWktPnBvd2VyID0gMDsKKwluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCWVuYWJsZV9pbnRlcnJ1cHRzKGFpKTsKKwl1cCgmYWktPnNlbSk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgYWlyb19pbml0X21vZHVsZSggdm9pZCApCit7CisJaW50IGksIGhhdmVfaXNhX2RldiA9IDA7CisKKwlhaXJvX2VudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoImFpcm9uZXQiLAorCQkJCSAgICAgICBTX0lGRElSIHwgYWlyb19wZXJtLAorCQkJCSAgICAgICBwcm9jX3Jvb3RfZHJpdmVyKTsKKyAgICAgICAgYWlyb19lbnRyeS0+dWlkID0gcHJvY191aWQ7CisgICAgICAgIGFpcm9fZW50cnktPmdpZCA9IHByb2NfZ2lkOworCisJZm9yKCBpID0gMDsgaSA8IDQgJiYgaW9baV0gJiYgaXJxW2ldOyBpKysgKSB7CisJCXByaW50ayggS0VSTl9JTkZPCisJCQkiYWlybzogIFRyeWluZyB0byBjb25maWd1cmUgSVNBIGFkYXB0ZXIgYXQgaXJxPSVkIGlvPTB4JXhcbiIsCisJCQlpcnFbaV0sIGlvW2ldICk7CisJCWlmIChpbml0X2Fpcm9fY2FyZCggaXJxW2ldLCBpb1tpXSwgMCwgTlVMTCApKQorCQkJaGF2ZV9pc2FfZGV2ID0gMTsKKwl9CisKKyNpZmRlZiBDT05GSUdfUENJCisJcHJpbnRrKCBLRVJOX0lORk8gImFpcm86ICBQcm9iaW5nIGZvciBQQ0kgYWRhcHRlcnNcbiIgKTsKKwlwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhaXJvX2RyaXZlcik7CisJcHJpbnRrKCBLRVJOX0lORk8gImFpcm86ICBGaW5pc2hlZCBwcm9iaW5nIGZvciBQQ0kgYWRhcHRlcnNcbiIgKTsKKyNlbmRpZgorCisJLyogQWx3YXlzIGV4aXQgd2l0aCBzdWNjZXNzLCBhcyB3ZSBhcmUgYSBsaWJyYXJ5IG1vZHVsZQorCSAqIGFzIHdlbGwgYXMgYSBkcml2ZXIgbW9kdWxlCisJICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhaXJvX2NsZWFudXBfbW9kdWxlKCB2b2lkICkKK3sKKwl3aGlsZSggYWlyb19kZXZpY2VzICkgeworCQlwcmludGsoIEtFUk5fSU5GTyAiYWlybzogVW5yZWdpc3RlcmluZyAlc1xuIiwgYWlyb19kZXZpY2VzLT5kZXYtPm5hbWUgKTsKKwkJc3RvcF9haXJvX2NhcmQoIGFpcm9fZGV2aWNlcy0+ZGV2LCAxICk7CisJfQorI2lmZGVmIENPTkZJR19QQ0kKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFpcm9fZHJpdmVyKTsKKyNlbmRpZgorCXJlbW92ZV9wcm9jX2VudHJ5KCJhaXJvbmV0IiwgcHJvY19yb290X2RyaXZlcik7Cit9CisKKyNpZmRlZiBXSVJFTEVTU19FWFQKKy8qCisgKiBJbml0aWFsIFdpcmVsZXNzIEV4dGVuc2lvbiBjb2RlIGZvciBBaXJvbmV0IGRyaXZlciBieSA6CisgKglKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+IC0gSFBMIC0gMTcgTm92ZW1iZXIgMDAKKyAqIENvbnZlcnNpb24gdG8gbmV3IGRyaXZlciBBUEkgYnkgOgorICoJSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPiAtIEhQTCAtIDI2IE1hcmNoIDAyCisgKiBKYXZpZXIgYWxzbyBkaWQgYSBnb29kIGFtb3VudCBvZiB3b3JrIGhlcmUsIGFkZGluZyBzb21lIG5ldyBleHRlbnNpb25zCisgKiBhbmQgZml4aW5nIG15IGNvZGUuIExldCdzIGp1c3Qgc2F5IHRoYXQgd2l0aG91dCBoaW0gdGhpcyBjb2RlIGp1c3QKKyAqIHdvdWxkIG5vdCB3b3JrIGF0IGFsbC4uLiAtIEplYW4gSUkKKyAqLworCitzdGF0aWMgaW50IGFpcm9fZ2V0X3F1YWxpdHkgKFN0YXR1c1JpZCAqc3RhdHVzX3JpZCwgQ2FwYWJpbGl0eVJpZCAqY2FwX3JpZCkKK3sKKwlpbnQgcXVhbGl0eSA9IDA7CisKKwlpZiAoKHN0YXR1c19yaWQtPm1vZGUgJiAweDNmKSA9PSAweDNmICYmIChjYXBfcmlkLT5oYXJkQ2FwICYgOCkpIHsKKwkJaWYgKG1lbWNtcChjYXBfcmlkLT5wcm9kTmFtZSwgIjM1MCIsIDMpKQorCQkJaWYgKHN0YXR1c19yaWQtPnNpZ25hbFF1YWxpdHkgPiAweDIwKQorCQkJCXF1YWxpdHkgPSAwOworCQkJZWxzZQorCQkJCXF1YWxpdHkgPSAweDIwIC0gc3RhdHVzX3JpZC0+c2lnbmFsUXVhbGl0eTsKKwkJZWxzZQorCQkJaWYgKHN0YXR1c19yaWQtPnNpZ25hbFF1YWxpdHkgPiAweGIwKQorCQkJCXF1YWxpdHkgPSAwOworCQkJZWxzZSBpZiAoc3RhdHVzX3JpZC0+c2lnbmFsUXVhbGl0eSA8IDB4MTApCisJCQkJcXVhbGl0eSA9IDB4YTA7CisJCQllbHNlCisJCQkJcXVhbGl0eSA9IDB4YjAgLSBzdGF0dXNfcmlkLT5zaWduYWxRdWFsaXR5OworCX0KKwlyZXR1cm4gcXVhbGl0eTsKK30KKworI2RlZmluZSBhaXJvX2dldF9tYXhfcXVhbGl0eShjYXBfcmlkKSAobWVtY21wKChjYXBfcmlkKS0+cHJvZE5hbWUsICIzNTAiLCAzKSA/IDB4MjAgOiAweGEwKQorI2RlZmluZSBhaXJvX2dldF9hdmdfcXVhbGl0eShjYXBfcmlkKSAobWVtY21wKChjYXBfcmlkKS0+cHJvZE5hbWUsICIzNTAiLCAzKSA/IDB4MTAgOiAweDUwKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgcHJvdG9jb2wgbmFtZQorICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIGNoYXIgKmN3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RyY3B5KGN3cnEsICJJRUVFIDgwMi4xMS1EUyIpOworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBmcmVxdWVuY3kKKyAqLworc3RhdGljIGludCBhaXJvX3NldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfZnJlcSAqZndycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlpbnQgcmMgPSAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCisKKwkvKiBJZiBzZXR0aW5nIGJ5IGZyZXF1ZW5jeSwgY29udmVydCB0byBhIGNoYW5uZWwgKi8KKwlpZigoZndycS0+ZSA9PSAxKSAmJgorCSAgIChmd3JxLT5tID49IChpbnQpIDIuNDEyZTgpICYmCisJICAgKGZ3cnEtPm0gPD0gKGludCkgMi40ODdlOCkpIHsKKwkJaW50IGYgPSBmd3JxLT5tIC8gMTAwMDAwOworCQlpbnQgYyA9IDA7CisJCXdoaWxlKChjIDwgMTQpICYmIChmICE9IGZyZXF1ZW5jeV9saXN0W2NdKSkKKwkJCWMrKzsKKwkJLyogSGFjayB0byBmYWxsIHRocm91Z2guLi4gKi8KKwkJZndycS0+ZSA9IDA7CisJCWZ3cnEtPm0gPSBjICsgMTsKKwl9CisJLyogU2V0dGluZyBieSBjaGFubmVsIG51bWJlciAqLworCWlmKChmd3JxLT5tID4gMTAwMCkgfHwgKGZ3cnEtPmUgPiAwKSkKKwkJcmMgPSAtRU9QTk9UU1VQUDsKKwllbHNlIHsKKwkJaW50IGNoYW5uZWwgPSBmd3JxLT5tOworCQkvKiBXZSBzaG91bGQgZG8gYSBiZXR0ZXIgY2hlY2sgdGhhbiB0aGF0LAorCQkgKiBiYXNlZCBvbiB0aGUgY2FyZCBjYXBhYmlsaXR5ICEhISAqLworCQlpZigoY2hhbm5lbCA8IDEpIHx8IChjaGFubmVsID4gMTYpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE5ldyBjaGFubmVsIHZhbHVlIG9mICVkIGlzIGludmFsaWQhXG4iLCBkZXYtPm5hbWUsIGZ3cnEtPm0pOworCQkJcmMgPSAtRUlOVkFMOworCQl9IGVsc2UgeworCQkJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJCQkvKiBZZXMgISBXZSBjYW4gc2V0IGl0ICEhISAqLworCQkJbG9jYWwtPmNvbmZpZy5jaGFubmVsU2V0ID0gKHUxNikoY2hhbm5lbCAtIDEpOworCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCQl9CisJfQorCXJldHVybiByYzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgZnJlcXVlbmN5CisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X2ZyZXEgKmZ3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJU3RhdHVzUmlkIHN0YXR1c19yaWQ7CQkvKiBDYXJkIHN0YXR1cyBpbmZvICovCisKKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwlpZiAoKGxvY2FsLT5jb25maWcub3Btb2RlICYgMHhGRikgPT0gTU9ERV9TVEFfRVNTKQorCQlzdGF0dXNfcmlkLmNoYW5uZWwgPSBsb2NhbC0+Y29uZmlnLmNoYW5uZWxTZXQ7CisJZWxzZQorCQlyZWFkU3RhdHVzUmlkKGxvY2FsLCAmc3RhdHVzX3JpZCwgMSk7CisKKyNpZmRlZiBXRVhUX1VTRUNIQU5ORUxTCisJZndycS0+bSA9ICgoaW50KXN0YXR1c19yaWQuY2hhbm5lbCkgKyAxOworCWZ3cnEtPmUgPSAwOworI2Vsc2UKKwl7CisJCWludCBmID0gKGludClzdGF0dXNfcmlkLmNoYW5uZWw7CisJCWZ3cnEtPm0gPSBmcmVxdWVuY3lfbGlzdFtmXSAqIDEwMDAwMDsKKwkJZndycS0+ZSA9IDE7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgRVNTSUQKKyAqLworc3RhdGljIGludCBhaXJvX3NldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCVJlc3AgcnNwOworCVNzaWRSaWQgU1NJRF9yaWQ7CQkvKiBTU0lEcyAqLworCisJLyogUmVsb2FkIHRoZSBsaXN0IG9mIGN1cnJlbnQgU1NJRCAqLworCXJlYWRTc2lkUmlkKGxvY2FsLCAmU1NJRF9yaWQpOworCisJLyogQ2hlY2sgaWYgd2UgYXNrZWQgZm9yIGBhbnknICovCisJaWYoZHdycS0+ZmxhZ3MgPT0gMCkgeworCQkvKiBKdXN0IHNlbmQgYW4gZW1wdHkgU1NJRCBsaXN0ICovCisJCW1lbXNldCgmU1NJRF9yaWQsIDAsIHNpemVvZihTU0lEX3JpZCkpOworCX0gZWxzZSB7CisJCWludAlpbmRleCA9IChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCisJCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgKi8KKwkJaWYoZHdycS0+bGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUrMSkgeworCQkJcmV0dXJuIC1FMkJJRyA7CisJCX0KKwkJLyogQ2hlY2sgaWYgaW5kZXggaXMgdmFsaWQgKi8KKwkJaWYoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49IDQpKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIFNldCB0aGUgU1NJRCAqLworCQltZW1zZXQoU1NJRF9yaWQuc3NpZHNbaW5kZXhdLnNzaWQsIDAsCisJCSAgICAgICBzaXplb2YoU1NJRF9yaWQuc3NpZHNbaW5kZXhdLnNzaWQpKTsKKwkJbWVtY3B5KFNTSURfcmlkLnNzaWRzW2luZGV4XS5zc2lkLCBleHRyYSwgZHdycS0+bGVuZ3RoKTsKKwkJU1NJRF9yaWQuc3NpZHNbaW5kZXhdLmxlbiA9IGR3cnEtPmxlbmd0aCAtIDE7CisJfQorCVNTSURfcmlkLmxlbiA9IHNpemVvZihTU0lEX3JpZCk7CisJLyogV3JpdGUgaXQgdG8gdGhlIGNhcmQgKi8KKwlkaXNhYmxlX01BQyhsb2NhbCwgMSk7CisJd3JpdGVTc2lkUmlkKGxvY2FsLCAmU1NJRF9yaWQsIDEpOworCWVuYWJsZV9NQUMobG9jYWwsICZyc3AsIDEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IEVTU0lECisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlTdGF0dXNSaWQgc3RhdHVzX3JpZDsJCS8qIENhcmQgc3RhdHVzIGluZm8gKi8KKworCXJlYWRTdGF0dXNSaWQobG9jYWwsICZzdGF0dXNfcmlkLCAxKTsKKworCS8qIE5vdGUgOiBpZiBkd3JxLT5mbGFncyAhPSAwLCB3ZSBzaG91bGQKKwkgKiBnZXQgdGhlIHJlbGV2YW50IFNTSUQgZnJvbSB0aGUgU1NJRCBsaXN0Li4uICovCisKKwkvKiBHZXQgdGhlIGN1cnJlbnQgU1NJRCAqLworCW1lbWNweShleHRyYSwgc3RhdHVzX3JpZC5TU0lELCBzdGF0dXNfcmlkLlNTSURsZW4pOworCWV4dHJhW3N0YXR1c19yaWQuU1NJRGxlbl0gPSAnXDAnOworCS8qIElmIG5vbmUsIHdlIG1heSB3YW50IHRvIGdldCB0aGUgb25lIHRoYXQgd2FzIHNldCAqLworCisJLyogUHVzaCBpdCBvdXQgISAqLworCWR3cnEtPmxlbmd0aCA9IHN0YXR1c19yaWQuU1NJRGxlbiArIDE7CisJZHdycS0+ZmxhZ3MgPSAxOyAvKiBhY3RpdmUgKi8KKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBBUCBhZGRyZXNzCisgKi8KK3N0YXRpYyBpbnQgYWlyb19zZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IHNvY2thZGRyICphd3JxLAorCQkJY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJQ21kIGNtZDsKKwlSZXNwIHJzcDsKKwlBUExpc3RSaWQgQVBMaXN0X3JpZDsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBiY2FzdFtFVEhfQUxFTl0gPSB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfTsKKworCWlmIChhd3JxLT5zYV9mYW1pbHkgIT0gQVJQSFJEX0VUSEVSKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlIGlmICghbWVtY21wKGJjYXN0LCBhd3JxLT5zYV9kYXRhLCBFVEhfQUxFTikpIHsKKwkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwkJY21kLmNtZD1DTURfTE9TRV9TWU5DOworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZsb2NhbC0+c2VtKSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCWlzc3VlY29tbWFuZChsb2NhbCwgJmNtZCwgJnJzcCk7CisJCXVwKCZsb2NhbC0+c2VtKTsKKwl9IGVsc2UgeworCQltZW1zZXQoJkFQTGlzdF9yaWQsIDAsIHNpemVvZihBUExpc3RfcmlkKSk7CisJCUFQTGlzdF9yaWQubGVuID0gc2l6ZW9mKEFQTGlzdF9yaWQpOworCQltZW1jcHkoQVBMaXN0X3JpZC5hcFswXSwgYXdycS0+c2FfZGF0YSwgRVRIX0FMRU4pOworCQlkaXNhYmxlX01BQyhsb2NhbCwgMSk7CisJCXdyaXRlQVBMaXN0UmlkKGxvY2FsLCAmQVBMaXN0X3JpZCwgMSk7CisJCWVuYWJsZV9NQUMobG9jYWwsICZyc3AsIDEpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgQVAgYWRkcmVzcworICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBzb2NrYWRkciAqYXdycSwKKwkJCWNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCVN0YXR1c1JpZCBzdGF0dXNfcmlkOwkJLyogQ2FyZCBzdGF0dXMgaW5mbyAqLworCisJcmVhZFN0YXR1c1JpZChsb2NhbCwgJnN0YXR1c19yaWQsIDEpOworCisJLyogVGVudGF0aXZlLiBUaGlzIHNlZW1zIHRvIHdvcmssIHdvdywgSSdtIGx1Y2t5ICEhISAqLworCW1lbWNweShhd3JxLT5zYV9kYXRhLCBzdGF0dXNfcmlkLmJzc2lkWzBdLCBFVEhfQUxFTik7CisJYXdycS0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IE5pY2tuYW1lCisgKi8KK3N0YXRpYyBpbnQgYWlyb19zZXRfbmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCisJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIHN0cmluZyAqLworCWlmKGR3cnEtPmxlbmd0aCA+IDE2ICsgMSkgeworCQlyZXR1cm4gLUUyQklHOworCX0KKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwltZW1zZXQobG9jYWwtPmNvbmZpZy5ub2RlTmFtZSwgMCwgc2l6ZW9mKGxvY2FsLT5jb25maWcubm9kZU5hbWUpKTsKKwltZW1jcHkobG9jYWwtPmNvbmZpZy5ub2RlTmFtZSwgZXh0cmEsIGR3cnEtPmxlbmd0aCk7CisJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCisJcmV0dXJuIC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgTmlja25hbWUKKyAqLworc3RhdGljIGludCBhaXJvX2dldF9uaWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisKKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwlzdHJuY3B5KGV4dHJhLCBsb2NhbC0+Y29uZmlnLm5vZGVOYW1lLCAxNik7CisJZXh0cmFbMTZdID0gJ1wwJzsKKwlkd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBCaXQtUmF0ZQorICovCitzdGF0aWMgaW50IGFpcm9fc2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlDYXBhYmlsaXR5UmlkIGNhcF9yaWQ7CQkvKiBDYXJkIGNhcGFiaWxpdHkgaW5mbyAqLworCXU4CWJyYXRlID0gMDsKKwlpbnQJaTsKKworCS8qIEZpcnN0IDogZ2V0IGEgdmFsaWQgYml0IHJhdGUgdmFsdWUgKi8KKwlyZWFkQ2FwYWJpbGl0eVJpZChsb2NhbCwgJmNhcF9yaWQsIDEpOworCisJLyogV2hpY2ggdHlwZSBvZiB2YWx1ZSA/ICovCisJaWYoKHZ3cnEtPnZhbHVlIDwgOCkgJiYgKHZ3cnEtPnZhbHVlID49IDApKSB7CisJCS8qIFNldHRpbmcgYnkgcmF0ZSBpbmRleCAqLworCQkvKiBGaW5kIHZhbHVlIGluIHRoZSBtYWdpYyByYXRlIHRhYmxlICovCisJCWJyYXRlID0gY2FwX3JpZC5zdXBwb3J0ZWRSYXRlc1t2d3JxLT52YWx1ZV07CisJfSBlbHNlIHsKKwkJLyogU2V0dGluZyBieSBmcmVxdWVuY3kgdmFsdWUgKi8KKwkJdTgJbm9ybXZhbHVlID0gKHU4KSAodndycS0+dmFsdWUvNTAwMDAwKTsKKworCQkvKiBDaGVjayBpZiByYXRlIGlzIHZhbGlkICovCisJCWZvcihpID0gMCA7IGkgPCA4IDsgaSsrKSB7CisJCQlpZihub3JtdmFsdWUgPT0gY2FwX3JpZC5zdXBwb3J0ZWRSYXRlc1tpXSkgeworCQkJCWJyYXRlID0gbm9ybXZhbHVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCS8qIC0xIGRlc2lnbmVkIHRoZSBtYXggcmF0ZSAobW9zdGx5IGF1dG8gbW9kZSkgKi8KKwlpZih2d3JxLT52YWx1ZSA9PSAtMSkgeworCQkvKiBHZXQgdGhlIGhpZ2hlc3QgYXZhaWxhYmxlIHJhdGUgKi8KKwkJZm9yKGkgPSAwIDsgaSA8IDggOyBpKyspIHsKKwkJCWlmKGNhcF9yaWQuc3VwcG9ydGVkUmF0ZXNbaV0gPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCQlpZihpICE9IDApCisJCQlicmF0ZSA9IGNhcF9yaWQuc3VwcG9ydGVkUmF0ZXNbaSAtIDFdOworCX0KKwkvKiBDaGVjayB0aGF0IGl0IGlzIHZhbGlkICovCisJaWYoYnJhdGUgPT0gMCkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwkvKiBOb3csIGNoZWNrIGlmIHdlIHdhbnQgYSBmaXhlZCBvciBhdXRvIHZhbHVlICovCisJaWYodndycS0+Zml4ZWQgPT0gMCkgeworCQkvKiBGaWxsIGFsbCB0aGUgcmF0ZXMgdXAgdG8gdGhpcyBtYXggcmF0ZSAqLworCQltZW1zZXQobG9jYWwtPmNvbmZpZy5yYXRlcywgMCwgOCk7CisJCWZvcihpID0gMCA7IGkgPCA4IDsgaSsrKSB7CisJCQlsb2NhbC0+Y29uZmlnLnJhdGVzW2ldID0gY2FwX3JpZC5zdXBwb3J0ZWRSYXRlc1tpXTsKKwkJCWlmKGxvY2FsLT5jb25maWcucmF0ZXNbaV0gPT0gYnJhdGUpCisJCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQkvKiBGaXhlZCBtb2RlICovCisJCS8qIE9uZSByYXRlLCBmaXhlZCAqLworCQltZW1zZXQobG9jYWwtPmNvbmZpZy5yYXRlcywgMCwgOCk7CisJCWxvY2FsLT5jb25maWcucmF0ZXNbMF0gPSBicmF0ZTsKKwl9CisJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCisJcmV0dXJuIC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgQml0LVJhdGUKKyAqLworc3RhdGljIGludCBhaXJvX2dldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJU3RhdHVzUmlkIHN0YXR1c19yaWQ7CQkvKiBDYXJkIHN0YXR1cyBpbmZvICovCisKKwlyZWFkU3RhdHVzUmlkKGxvY2FsLCAmc3RhdHVzX3JpZCwgMSk7CisKKwl2d3JxLT52YWx1ZSA9IHN0YXR1c19yaWQuY3VycmVudFhtaXRSYXRlICogNTAwMDAwOworCS8qIElmIG1vcmUgdGhhbiBvbmUgcmF0ZSwgc2V0IGF1dG8gKi8KKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwl2d3JxLT5maXhlZCA9IChsb2NhbC0+Y29uZmlnLnJhdGVzWzFdID09IDApOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IFJUUyB0aHJlc2hvbGQKKyAqLworc3RhdGljIGludCBhaXJvX3NldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQljaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlpbnQgcnRociA9IHZ3cnEtPnZhbHVlOworCisJaWYodndycS0+ZGlzYWJsZWQpCisJCXJ0aHIgPSAyMzEyOworCWlmKChydGhyIDwgMCkgfHwgKHJ0aHIgPiAyMzEyKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJbG9jYWwtPmNvbmZpZy5ydHNUaHJlcyA9IHJ0aHI7CisJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCisJcmV0dXJuIC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgUlRTIHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCWNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJdndycS0+dmFsdWUgPSBsb2NhbC0+Y29uZmlnLnJ0c1RocmVzOworCXZ3cnEtPmRpc2FibGVkID0gKHZ3cnEtPnZhbHVlID49IDIzMTIpOworCXZ3cnEtPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBGcmFnbWVudGF0aW9uIHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IGFpcm9fc2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlpbnQgZnRociA9IHZ3cnEtPnZhbHVlOworCisJaWYodndycS0+ZGlzYWJsZWQpCisJCWZ0aHIgPSAyMzEyOworCWlmKChmdGhyIDwgMjU2KSB8fCAoZnRociA+IDIzMTIpKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlmdGhyICY9IH4weDE7CS8qIEdldCBhbiBldmVuIHZhbHVlIC0gaXMgaXQgcmVhbGx5IG5lZWRlZCA/Pz8gKi8KKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwlsb2NhbC0+Y29uZmlnLmZyYWdUaHJlc2ggPSAodTE2KWZ0aHI7CisJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCisJcmV0dXJuIC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgRnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQKKyAqLworc3RhdGljIGludCBhaXJvX2dldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisKKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwl2d3JxLT52YWx1ZSA9IGxvY2FsLT5jb25maWcuZnJhZ1RocmVzaDsKKwl2d3JxLT5kaXNhYmxlZCA9ICh2d3JxLT52YWx1ZSA+PSAyMzEyKTsKKwl2d3JxLT5maXhlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgTW9kZSBvZiBPcGVyYXRpb24KKyAqLworc3RhdGljIGludCBhaXJvX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBfX3UzMiAqdXdycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlpbnQgcmVzZXQgPSAwOworCisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJaWYgKChsb2NhbC0+Y29uZmlnLnJtb2RlICYgMHhmZikgPj0gUlhNT0RFX1JGTU9OKQorCQlyZXNldCA9IDE7CisKKwlzd2l0Y2goKnV3cnEpIHsKKwkJY2FzZSBJV19NT0RFX0FESE9DOgorCQkJbG9jYWwtPmNvbmZpZy5vcG1vZGUgJj0gMHhGRjAwOworCQkJbG9jYWwtPmNvbmZpZy5vcG1vZGUgfD0gTU9ERV9TVEFfSUJTUzsKKwkJCWxvY2FsLT5jb25maWcucm1vZGUgJj0gMHhmZTAwOworCQkJbG9jYWwtPmNvbmZpZy5zY2FuTW9kZSA9IFNDQU5NT0RFX0FDVElWRTsKKwkJCWNsZWFyX2JpdCAoRkxBR184MDJfMTEsICZsb2NhbC0+ZmxhZ3MpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJCWxvY2FsLT5jb25maWcub3Btb2RlICY9IDB4RkYwMDsKKwkJCWxvY2FsLT5jb25maWcub3Btb2RlIHw9IE1PREVfU1RBX0VTUzsKKwkJCWxvY2FsLT5jb25maWcucm1vZGUgJj0gMHhmZTAwOworCQkJbG9jYWwtPmNvbmZpZy5zY2FuTW9kZSA9IFNDQU5NT0RFX0FDVElWRTsKKwkJCWNsZWFyX2JpdCAoRkxBR184MDJfMTEsICZsb2NhbC0+ZmxhZ3MpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfTU9ERV9NQVNURVI6CisJCQlsb2NhbC0+Y29uZmlnLm9wbW9kZSAmPSAweEZGMDA7CisJCQlsb2NhbC0+Y29uZmlnLm9wbW9kZSB8PSBNT0RFX0FQOworCQkJbG9jYWwtPmNvbmZpZy5ybW9kZSAmPSAweGZlMDA7CisJCQlsb2NhbC0+Y29uZmlnLnNjYW5Nb2RlID0gU0NBTk1PREVfQUNUSVZFOworCQkJY2xlYXJfYml0IChGTEFHXzgwMl8xMSwgJmxvY2FsLT5mbGFncyk7CisJCQlicmVhazsKKwkJY2FzZSBJV19NT0RFX1JFUEVBVDoKKwkJCWxvY2FsLT5jb25maWcub3Btb2RlICY9IDB4RkYwMDsKKwkJCWxvY2FsLT5jb25maWcub3Btb2RlIHw9IE1PREVfQVBfUlBUUjsKKwkJCWxvY2FsLT5jb25maWcucm1vZGUgJj0gMHhmZTAwOworCQkJbG9jYWwtPmNvbmZpZy5zY2FuTW9kZSA9IFNDQU5NT0RFX0FDVElWRTsKKwkJCWNsZWFyX2JpdCAoRkxBR184MDJfMTEsICZsb2NhbC0+ZmxhZ3MpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfTU9ERV9NT05JVE9SOgorCQkJbG9jYWwtPmNvbmZpZy5vcG1vZGUgJj0gMHhGRjAwOworCQkJbG9jYWwtPmNvbmZpZy5vcG1vZGUgfD0gTU9ERV9TVEFfRVNTOworCQkJbG9jYWwtPmNvbmZpZy5ybW9kZSAmPSAweGZlMDA7CisJCQlsb2NhbC0+Y29uZmlnLnJtb2RlIHw9IFJYTU9ERV9SRk1PTiB8IFJYTU9ERV9ESVNBQkxFXzgwMl8zX0hFQURFUjsKKwkJCWxvY2FsLT5jb25maWcuc2Nhbk1vZGUgPSBTQ0FOTU9ERV9QQVNTSVZFOworCQkJc2V0X2JpdCAoRkxBR184MDJfMTEsICZsb2NhbC0+ZmxhZ3MpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHJlc2V0KQorCQlzZXRfYml0IChGTEFHX1JFU0VULCAmbG9jYWwtPmZsYWdzKTsKKwlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBNb2RlIG9mIE9wZXJhdGlvbgorICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIF9fdTMyICp1d3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJLyogSWYgbm90IG1hbmFnZWQsIGFzc3VtZSBpdCdzIGFkLWhvYyAqLworCXN3aXRjaCAobG9jYWwtPmNvbmZpZy5vcG1vZGUgJiAweEZGKSB7CisJCWNhc2UgTU9ERV9TVEFfRVNTOgorCQkJKnV3cnEgPSBJV19NT0RFX0lORlJBOworCQkJYnJlYWs7CisJCWNhc2UgTU9ERV9BUDoKKwkJCSp1d3JxID0gSVdfTU9ERV9NQVNURVI7CisJCQlicmVhazsKKwkJY2FzZSBNT0RFX0FQX1JQVFI6CisJCQkqdXdycSA9IElXX01PREVfUkVQRUFUOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkqdXdycSA9IElXX01PREVfQURIT0M7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IEVuY3J5cHRpb24gS2V5CisgKi8KK3N0YXRpYyBpbnQgYWlyb19zZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJQ2FwYWJpbGl0eVJpZCBjYXBfcmlkOwkJLyogQ2FyZCBjYXBhYmlsaXR5IGluZm8gKi8KKworCS8qIElzIFdFUCBzdXBwb3J0ZWQgPyAqLworCXJlYWRDYXBhYmlsaXR5UmlkKGxvY2FsLCAmY2FwX3JpZCwgMSk7CisJLyogT2xkZXIgZmlybXdhcmUgZG9lc24ndCBzdXBwb3J0IHRoaXMuLi4KKwlpZighKGNhcF9yaWQuc29mdENhcCAmIDIpKSB7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9ICovCisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisKKwkvKiBCYXNpYyBjaGVja2luZzogZG8gd2UgaGF2ZSBhIGtleSB0byBzZXQgPworCSAqIE5vdGUgOiB3aXRoIHRoZSBuZXcgQVBJLCBpdCdzIGltcG9zc2libGUgdG8gZ2V0IGEgTlVMTCBwb2ludGVyLgorCSAqIFRoZXJlZm9yZSwgd2UgbmVlZCB0byBjaGVjayBhIGtleSBzaXplID09IDAgaW5zdGVhZC4KKwkgKiBOZXcgdmVyc2lvbiBvZiBpd2NvbmZpZyBwcm9wZXJseSBzZXQgdGhlIElXX0VOQ09ERV9OT0tFWSBmbGFnCisJICogd2hlbiBubyBrZXkgaXMgcHJlc2VudCAob25seSBjaGFuZ2UgZmxhZ3MpLCBidXQgb2xkZXIgdmVyc2lvbnMKKwkgKiBkb24ndCBkbyBpdC4gLSBKZWFuIElJICovCisJaWYgKGR3cnEtPmxlbmd0aCA+IDApIHsKKwkJd2VwX2tleV90IGtleTsKKwkJaW50IGluZGV4ID0gKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJCWludCBjdXJyZW50X2luZGV4ID0gZ2V0X3dlcF9rZXkobG9jYWwsIDB4ZmZmZik7CisJCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBrZXkgKi8KKwkJaWYgKGR3cnEtPmxlbmd0aCA+IE1BWF9LRVlfU0laRSkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyogQ2hlY2sgdGhlIGluZGV4IChub25lIC0+IHVzZSBjdXJyZW50KSAqLworCQlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49ICgoY2FwX3JpZC5zb2Z0Q2FwICYgMHg4MCkgPyA0OjEpKSkKKwkJCWluZGV4ID0gY3VycmVudF9pbmRleDsKKwkJLyogU2V0IHRoZSBsZW5ndGggKi8KKwkJaWYgKGR3cnEtPmxlbmd0aCA+IE1JTl9LRVlfU0laRSkKKwkJCWtleS5sZW4gPSBNQVhfS0VZX1NJWkU7CisJCWVsc2UKKwkJCWlmIChkd3JxLT5sZW5ndGggPiAwKQorCQkJCWtleS5sZW4gPSBNSU5fS0VZX1NJWkU7CisJCQllbHNlCisJCQkJLyogRGlzYWJsZSB0aGUga2V5ICovCisJCQkJa2V5LmxlbiA9IDA7CisJCS8qIENoZWNrIGlmIHRoZSBrZXkgaXMgbm90IG1hcmtlZCBhcyBpbnZhbGlkICovCisJCWlmKCEoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfTk9LRVkpKSB7CisJCQkvKiBDbGVhbnVwICovCisJCQltZW1zZXQoa2V5LmtleSwgMCwgTUFYX0tFWV9TSVpFKTsKKwkJCS8qIENvcHkgdGhlIGtleSBpbiB0aGUgZHJpdmVyICovCisJCQltZW1jcHkoa2V5LmtleSwgZXh0cmEsIGR3cnEtPmxlbmd0aCk7CisJCQkvKiBTZW5kIHRoZSBrZXkgdG8gdGhlIGNhcmQgKi8KKwkJCXNldF93ZXBfa2V5KGxvY2FsLCBpbmRleCwga2V5LmtleSwga2V5LmxlbiwgMSwgMSk7CisJCX0KKwkJLyogV0Ugc3BlY2lmeSB0aGF0IGlmIGEgdmFsaWQga2V5IGlzIHNldCwgZW5jcnlwdGlvbgorCQkgKiBzaG91bGQgYmUgZW5hYmxlZCAodXNlciBtYXkgdHVybiBpdCBvZmYgbGF0ZXIpCisJCSAqIFRoaXMgaXMgYWxzbyBob3cgIml3Y29uZmlnIGV0aFgga2V5IG9uIiB3b3JrcyAqLworCQlpZigoaW5kZXggPT0gY3VycmVudF9pbmRleCkgJiYgKGtleS5sZW4gPiAwKSAmJgorCQkgICAobG9jYWwtPmNvbmZpZy5hdXRoVHlwZSA9PSBBVVRIX09QRU4pKSB7CisJCQlsb2NhbC0+Y29uZmlnLmF1dGhUeXBlID0gQVVUSF9FTkNSWVBUOworCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCQl9CisJfSBlbHNlIHsKKwkJLyogRG8gd2Ugd2FudCB0byBqdXN0IHNldCB0aGUgdHJhbnNtaXQga2V5IGluZGV4ID8gKi8KKwkJaW50IGluZGV4ID0gKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJCWlmICgoaW5kZXggPj0gMCkgJiYgKGluZGV4IDwgKChjYXBfcmlkLnNvZnRDYXAgJiAweDgwKT80OjEpKSkgeworCQkJc2V0X3dlcF9rZXkobG9jYWwsIGluZGV4LCBOVUxMLCAwLCAxLCAxKTsKKwkJfSBlbHNlCisJCQkvKiBEb24ndCBjb21wbGFpbiBpZiBvbmx5IGNoYW5nZSB0aGUgbW9kZSAqLworCQkJaWYoIWR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX01PREUpIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwl9CisJLyogUmVhZCB0aGUgZmxhZ3MgKi8KKwlpZihkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkKKwkJbG9jYWwtPmNvbmZpZy5hdXRoVHlwZSA9IEFVVEhfT1BFTjsJLy8gZGlzYWJsZSBlbmNyeXB0aW9uCisJaWYoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCkKKwkJbG9jYWwtPmNvbmZpZy5hdXRoVHlwZSA9IEFVVEhfU0hBUkVES0VZOwkvLyBPbmx5IEJvdGgKKwlpZihkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKQorCQlsb2NhbC0+Y29uZmlnLmF1dGhUeXBlID0gQVVUSF9FTkNSWVBUOwkvLyBPbmx5IFdlcAorCS8qIENvbW1pdCB0aGUgY2hhbmdlcyB0byBmbGFncyBpZiBuZWVkZWQgKi8KKwlpZihkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9NT0RFKQorCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisJcmV0dXJuIC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgRW5jcnlwdGlvbiBLZXkKKyAqLworc3RhdGljIGludCBhaXJvX2dldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlpbnQgaW5kZXggPSAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwlDYXBhYmlsaXR5UmlkIGNhcF9yaWQ7CQkvKiBDYXJkIGNhcGFiaWxpdHkgaW5mbyAqLworCisJLyogSXMgaXQgc3VwcG9ydGVkID8gKi8KKwlyZWFkQ2FwYWJpbGl0eVJpZChsb2NhbCwgJmNhcF9yaWQsIDEpOworCWlmKCEoY2FwX3JpZC5zb2Z0Q2FwICYgMikpIHsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwkvKiBDaGVjayBlbmNyeXB0aW9uIG1vZGUgKi8KKwlzd2l0Y2gobG9jYWwtPmNvbmZpZy5hdXRoVHlwZSkJeworCQljYXNlIEFVVEhfRU5DUllQVDoKKwkJCWR3cnEtPmZsYWdzID0gSVdfRU5DT0RFX09QRU47CisJCQlicmVhazsKKwkJY2FzZSBBVVRIX1NIQVJFREtFWToKKwkJCWR3cnEtPmZsYWdzID0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJY2FzZSBBVVRIX09QRU46CisJCQlkd3JxLT5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJCWJyZWFrOworCX0KKwkvKiBXZSBjYW4ndCByZXR1cm4gdGhlIGtleSwgc28gc2V0IHRoZSBwcm9wZXIgZmxhZyBhbmQgcmV0dXJuIHplcm8gKi8KKwlkd3JxLT5mbGFncyB8PSBJV19FTkNPREVfTk9LRVk7CisJbWVtc2V0KGV4dHJhLCAwLCAxNik7CisKKwkvKiBXaGljaCBrZXkgZG8gd2Ugd2FudCA/IC0xIC0+IHR4IGluZGV4ICovCisJaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+PSAoKGNhcF9yaWQuc29mdENhcCAmIDB4ODApID8gNCA6IDEpKSkKKwkJaW5kZXggPSBnZXRfd2VwX2tleShsb2NhbCwgMHhmZmZmKTsKKwlkd3JxLT5mbGFncyB8PSBpbmRleCArIDE7CisJLyogQ29weSB0aGUga2V5IHRvIHRoZSB1c2VyIGJ1ZmZlciAqLworCWR3cnEtPmxlbmd0aCA9IGdldF93ZXBfa2V5KGxvY2FsLCBpbmRleCk7CisJaWYgKGR3cnEtPmxlbmd0aCA+IDE2KSB7CisJCWR3cnEtPmxlbmd0aD0wOworCX0KKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgVHgtUG93ZXIKKyAqLworc3RhdGljIGludCBhaXJvX3NldF90eHBvdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCUNhcGFiaWxpdHlSaWQgY2FwX3JpZDsJCS8qIENhcmQgY2FwYWJpbGl0eSBpbmZvICovCisJaW50IGk7CisJaW50IHJjID0gLUVJTlZBTDsKKworCXJlYWRDYXBhYmlsaXR5UmlkKGxvY2FsLCAmY2FwX3JpZCwgMSk7CisKKwlpZiAodndycS0+ZGlzYWJsZWQpIHsKKwkJc2V0X2JpdCAoRkxBR19SQURJT19PRkYsICZsb2NhbC0+ZmxhZ3MpOworCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisJCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCisJfQorCWlmICh2d3JxLT5mbGFncyAhPSBJV19UWFBPV19NV0FUVCkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJY2xlYXJfYml0IChGTEFHX1JBRElPX09GRiwgJmxvY2FsLT5mbGFncyk7CisJZm9yIChpID0gMDsgY2FwX3JpZC50eFBvd2VyTGV2ZWxzW2ldICYmIChpIDwgOCk7IGkrKykKKwkJaWYgKCh2d3JxLT52YWx1ZT09Y2FwX3JpZC50eFBvd2VyTGV2ZWxzW2ldKSkgeworCQkJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJCQlsb2NhbC0+Y29uZmlnLnR4UG93ZXIgPSB2d3JxLT52YWx1ZTsKKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKwkJCXJjID0gLUVJTlBST0dSRVNTOwkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCisJCQlicmVhazsKKwkJfQorCXJldHVybiByYzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgVHgtUG93ZXIKKyAqLworc3RhdGljIGludCBhaXJvX2dldF90eHBvdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJdndycS0+dmFsdWUgPSBsb2NhbC0+Y29uZmlnLnR4UG93ZXI7CisJdndycS0+Zml4ZWQgPSAxOwkvKiBObyBwb3dlciBjb250cm9sICovCisJdndycS0+ZGlzYWJsZWQgPSB0ZXN0X2JpdChGTEFHX1JBRElPX09GRiwgJmxvY2FsLT5mbGFncyk7CisJdndycS0+ZmxhZ3MgPSBJV19UWFBPV19NV0FUVDsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBSZXRyeSBsaW1pdHMKKyAqLworc3RhdGljIGludCBhaXJvX3NldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCWludCByYyA9IC1FSU5WQUw7CisKKwlpZih2d3JxLT5kaXNhYmxlZCkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJaWYodndycS0+ZmxhZ3MgJiBJV19SRVRSWV9MSU1JVCkgeworCQlpZih2d3JxLT5mbGFncyAmIElXX1JFVFJZX01BWCkKKwkJCWxvY2FsLT5jb25maWcubG9uZ1JldHJ5TGltaXQgPSB2d3JxLT52YWx1ZTsKKwkJZWxzZSBpZiAodndycS0+ZmxhZ3MgJiBJV19SRVRSWV9NSU4pCisJCQlsb2NhbC0+Y29uZmlnLnNob3J0UmV0cnlMaW1pdCA9IHZ3cnEtPnZhbHVlOworCQllbHNlIHsKKwkJCS8qIE5vIG1vZGlmaWVyIDogc2V0IGJvdGggKi8KKwkJCWxvY2FsLT5jb25maWcubG9uZ1JldHJ5TGltaXQgPSB2d3JxLT52YWx1ZTsKKwkJCWxvY2FsLT5jb25maWcuc2hvcnRSZXRyeUxpbWl0ID0gdndycS0+dmFsdWU7CisJCX0KKwkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCQlyYyA9IC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KKwl9CisJaWYodndycS0+ZmxhZ3MgJiBJV19SRVRSWV9MSUZFVElNRSkgeworCQlsb2NhbC0+Y29uZmlnLnR4TGlmZXRpbWUgPSB2d3JxLT52YWx1ZSAvIDEwMjQ7CisJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKwkJcmMgPSAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCisJfQorCXJldHVybiByYzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgUmV0cnkgbGltaXRzCisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfcmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKworCXZ3cnEtPmRpc2FibGVkID0gMDsgICAgICAvKiBDYW4ndCBiZSBkaXNhYmxlZCAqLworCisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJLyogTm90ZSA6IGJ5IGRlZmF1bHQsIGRpc3BsYXkgdGhlIG1pbiByZXRyeSBudW1iZXIgKi8KKwlpZigodndycS0+ZmxhZ3MgJiBJV19SRVRSWV9UWVBFKSA9PSBJV19SRVRSWV9MSUZFVElNRSkgeworCQl2d3JxLT5mbGFncyA9IElXX1JFVFJZX0xJRkVUSU1FOworCQl2d3JxLT52YWx1ZSA9IChpbnQpbG9jYWwtPmNvbmZpZy50eExpZmV0aW1lICogMTAyNDsKKwl9IGVsc2UgaWYoKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTUFYKSkgeworCQl2d3JxLT5mbGFncyA9IElXX1JFVFJZX0xJTUlUIHwgSVdfUkVUUllfTUFYOworCQl2d3JxLT52YWx1ZSA9IChpbnQpbG9jYWwtPmNvbmZpZy5sb25nUmV0cnlMaW1pdDsKKwl9IGVsc2UgeworCQl2d3JxLT5mbGFncyA9IElXX1JFVFJZX0xJTUlUOworCQl2d3JxLT52YWx1ZSA9IChpbnQpbG9jYWwtPmNvbmZpZy5zaG9ydFJldHJ5TGltaXQ7CisJCWlmKChpbnQpbG9jYWwtPmNvbmZpZy5zaG9ydFJldHJ5TGltaXQgIT0gKGludClsb2NhbC0+Y29uZmlnLmxvbmdSZXRyeUxpbWl0KQorCQkJdndycS0+ZmxhZ3MgfD0gSVdfUkVUUllfTUlOOworCX0KKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCByYW5nZSBpbmZvCisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfcmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKKwlDYXBhYmlsaXR5UmlkIGNhcF9yaWQ7CQkvKiBDYXJkIGNhcGFiaWxpdHkgaW5mbyAqLworCWludAkJaTsKKwlpbnQJCWs7CisKKwlyZWFkQ2FwYWJpbGl0eVJpZChsb2NhbCwgJmNhcF9yaWQsIDEpOworCisJZHdycS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7CisJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2YoKnJhbmdlKSk7CisJcmFuZ2UtPm1pbl9ud2lkID0gMHgwMDAwOworCXJhbmdlLT5tYXhfbndpZCA9IDB4MDAwMDsKKwlyYW5nZS0+bnVtX2NoYW5uZWxzID0gMTQ7CisJLyogU2hvdWxkIGJlIGJhc2VkIG9uIGNhcF9yaWQuY291bnRyeSB0byBnaXZlIG9ubHkKKwkgKiB3aGF0IHRoZSBjdXJyZW50IGNhcmQgc3VwcG9ydCAqLworCWsgPSAwOworCWZvcihpID0gMDsgaSA8IDE0OyBpKyspIHsKKwkJcmFuZ2UtPmZyZXFba10uaSA9IGkgKyAxOyAvKiBMaXN0IGluZGV4ICovCisJCXJhbmdlLT5mcmVxW2tdLm0gPSBmcmVxdWVuY3lfbGlzdFtpXSAqIDEwMDAwMDsKKwkJcmFuZ2UtPmZyZXFbaysrXS5lID0gMTsJLyogVmFsdWVzIGluIHRhYmxlIGluIE1IeiAtPiAqIDEwXjUgKiAxMCAqLworCX0KKwlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IGs7CisKKwkvKiBIdW0uLi4gU2hvdWxkIHB1dCB0aGUgcmlnaHQgdmFsdWVzIHRoZXJlICovCisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSBhaXJvX2dldF9tYXhfcXVhbGl0eSgmY2FwX3JpZCk7CisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMHgxMDAgLSAxMjA7CS8qIC0xMjAgZEJtICovCisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMDsKKwlyYW5nZS0+c2Vuc2l0aXZpdHkgPSA2NTUzNTsKKworCWZvcihpID0gMCA7IGkgPCA4IDsgaSsrKSB7CisJCXJhbmdlLT5iaXRyYXRlW2ldID0gY2FwX3JpZC5zdXBwb3J0ZWRSYXRlc1tpXSAqIDUwMDAwMDsKKwkJaWYocmFuZ2UtPmJpdHJhdGVbaV0gPT0gMCkKKwkJCWJyZWFrOworCX0KKwlyYW5nZS0+bnVtX2JpdHJhdGVzID0gaTsKKworCS8qIFNldCBhbiBpbmRpY2F0aW9uIG9mIHRoZSBtYXggVENQIHRocm91Z2hwdXQKKwkgKiBpbiBiaXQvcyB0aGF0IHdlIGNhbiBleHBlY3QgdXNpbmcgdGhpcyBpbnRlcmZhY2UuCisJICogTWF5IGJlIHVzZSBmb3IgUW9TIHN0dWZmLi4uIEplYW4gSUkgKi8KKwlpZihpID4gMikKKwkJcmFuZ2UtPnRocm91Z2hwdXQgPSA1MDAwICogMTAwMDsKKwllbHNlCisJCXJhbmdlLT50aHJvdWdocHV0ID0gMTUwMCAqIDEwMDA7CisKKwlyYW5nZS0+bWluX3J0cyA9IDA7CisJcmFuZ2UtPm1heF9ydHMgPSAyMzEyOworCXJhbmdlLT5taW5fZnJhZyA9IDI1NjsKKwlyYW5nZS0+bWF4X2ZyYWcgPSAyMzEyOworCisJaWYoY2FwX3JpZC5zb2Z0Q2FwICYgMikgeworCQkvLyBXRVA6IFJDNCA0MCBiaXRzCisJCXJhbmdlLT5lbmNvZGluZ19zaXplWzBdID0gNTsKKwkJLy8gUkM0IH4xMjggYml0cworCQlpZiAoY2FwX3JpZC5zb2Z0Q2FwICYgMHgxMDApIHsKKwkJCXJhbmdlLT5lbmNvZGluZ19zaXplWzFdID0gMTM7CisJCQlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMjsKKwkJfSBlbHNlCisJCQlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMTsKKwkJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSAoY2FwX3JpZC5zb2Z0Q2FwICYgMHg4MCkgPyA0IDogMTsKKwl9IGVsc2UgeworCQlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMDsKKwkJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSAwOworCX0KKwlyYW5nZS0+bWluX3BtcCA9IDA7CisJcmFuZ2UtPm1heF9wbXAgPSA1MDAwMDAwOwkvKiA1IHNlY3MgKi8KKwlyYW5nZS0+bWluX3BtdCA9IDA7CisJcmFuZ2UtPm1heF9wbXQgPSA2NTUzNSAqIDEwMjQ7CS8qID8/PyAqLworCXJhbmdlLT5wbXBfZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0Q7CisJcmFuZ2UtPnBtdF9mbGFncyA9IElXX1BPV0VSX1RJTUVPVVQ7CisJcmFuZ2UtPnBtX2NhcGEgPSBJV19QT1dFUl9QRVJJT0QgfCBJV19QT1dFUl9USU1FT1VUIHwgSVdfUE9XRVJfQUxMX1I7CisKKwkvKiBUcmFuc21pdCBQb3dlciAtIHZhbHVlcyBhcmUgaW4gbVcgKi8KKwlmb3IoaSA9IDAgOyBpIDwgOCA7IGkrKykgeworCQlyYW5nZS0+dHhwb3dlcltpXSA9IGNhcF9yaWQudHhQb3dlckxldmVsc1tpXTsKKwkJaWYocmFuZ2UtPnR4cG93ZXJbaV0gPT0gMCkKKwkJCWJyZWFrOworCX0KKwlyYW5nZS0+bnVtX3R4cG93ZXIgPSBpOworCXJhbmdlLT50eHBvd2VyX2NhcGEgPSBJV19UWFBPV19NV0FUVDsKKwlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSAxMjsKKwlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS0+cmV0cnlfY2FwYSA9IElXX1JFVFJZX0xJTUlUIHwgSVdfUkVUUllfTElGRVRJTUU7CisJcmFuZ2UtPnJldHJ5X2ZsYWdzID0gSVdfUkVUUllfTElNSVQ7CisJcmFuZ2UtPnJfdGltZV9mbGFncyA9IElXX1JFVFJZX0xJRkVUSU1FOworCXJhbmdlLT5taW5fcmV0cnkgPSAxOworCXJhbmdlLT5tYXhfcmV0cnkgPSA2NTUzNTsKKwlyYW5nZS0+bWluX3JfdGltZSA9IDEwMjQ7CisJcmFuZ2UtPm1heF9yX3RpbWUgPSA2NTUzNSAqIDEwMjQ7CisJLyogRXhwZXJpbWVudGFsIG1lYXN1cmVtZW50cyAtIGJvdW5kYXJ5IDExLzUuNSBNYi9zICovCisJLyogTm90ZSA6IHdpdGggb3Igd2l0aG91dCB0aGUgKGxvY2FsLT5yc3NpKSwgcmVzdWx0cworCSAqIGFyZSBzb21ld2hhdCBkaWZmZXJlbnQuIC0gSmVhbiBJSSAqLworCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gYWlyb19nZXRfYXZnX3F1YWxpdHkoJmNhcF9yaWQpOworCWlmIChsb2NhbC0+cnNzaSkKKwkJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gMTg2OwkvKiAtNzAgZEJtICovCisJZWxzZQorCQlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAxNzY7CS8qIC04MCBkQm0gKi8KKwlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAwOworCisJLyogRXZlbnQgY2FwYWJpbGl0eSAoa2VybmVsICsgZHJpdmVyKSAqLworCXJhbmdlLT5ldmVudF9jYXBhWzBdID0gKElXX0VWRU5UX0NBUEFfS18wIHwKKwkJCQlJV19FVkVOVF9DQVBBX01BU0soU0lPQ0dJV1RIUlNQWSkgfAorCQkJCUlXX0VWRU5UX0NBUEFfTUFTSyhTSU9DR0lXQVApIHwKKwkJCQlJV19FVkVOVF9DQVBBX01BU0soU0lPQ0dJV1NDQU4pKTsKKwlyYW5nZS0+ZXZlbnRfY2FwYVsxXSA9IElXX0VWRU5UX0NBUEFfS18xOworCXJhbmdlLT5ldmVudF9jYXBhWzRdID0gSVdfRVZFTlRfQ0FQQV9NQVNLKElXRVZUWERST1ApOworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBQb3dlciBNYW5hZ2VtZW50CisgKi8KK3N0YXRpYyBpbnQgYWlyb19zZXRfcG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCWlmICh2d3JxLT5kaXNhYmxlZCkgeworCQlpZiAoKGxvY2FsLT5jb25maWcucm1vZGUgJiAweEZGKSA+PSBSWE1PREVfUkZNT04pIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWxvY2FsLT5jb25maWcucG93ZXJTYXZlTW9kZSA9IFBPV0VSU0FWRV9DQU07CisJCWxvY2FsLT5jb25maWcucm1vZGUgJj0gMHhGRjAwOworCQlsb2NhbC0+Y29uZmlnLnJtb2RlIHw9IFJYTU9ERV9CQ19NQ19BRERSOworCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisJCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCisJfQorCWlmICgodndycS0+ZmxhZ3MgJiBJV19QT1dFUl9UWVBFKSA9PSBJV19QT1dFUl9USU1FT1VUKSB7CisJCWxvY2FsLT5jb25maWcuZmFzdExpc3RlbkRlbGF5ID0gKHZ3cnEtPnZhbHVlICsgNTAwKSAvIDEwMjQ7CisJCWxvY2FsLT5jb25maWcucG93ZXJTYXZlTW9kZSA9IFBPV0VSU0FWRV9QU1BDQU07CisJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKwl9IGVsc2UgaWYgKCh2d3JxLT5mbGFncyAmIElXX1BPV0VSX1RZUEUpID09IElXX1BPV0VSX1BFUklPRCkgeworCQlsb2NhbC0+Y29uZmlnLmZhc3RMaXN0ZW5JbnRlcnZhbCA9IGxvY2FsLT5jb25maWcubGlzdGVuSW50ZXJ2YWwgPSAodndycS0+dmFsdWUgKyA1MDApIC8gMTAyNDsKKwkJbG9jYWwtPmNvbmZpZy5wb3dlclNhdmVNb2RlID0gUE9XRVJTQVZFX1BTUENBTTsKKwkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCX0KKwlzd2l0Y2ggKHZ3cnEtPmZsYWdzICYgSVdfUE9XRVJfTU9ERSkgeworCQljYXNlIElXX1BPV0VSX1VOSUNBU1RfUjoKKwkJCWlmICgobG9jYWwtPmNvbmZpZy5ybW9kZSAmIDB4RkYpID49IFJYTU9ERV9SRk1PTikgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJbG9jYWwtPmNvbmZpZy5ybW9kZSAmPSAweEZGMDA7CisJCQlsb2NhbC0+Y29uZmlnLnJtb2RlIHw9IFJYTU9ERV9BRERSOworCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCQkJYnJlYWs7CisJCWNhc2UgSVdfUE9XRVJfQUxMX1I6CisJCQlpZiAoKGxvY2FsLT5jb25maWcucm1vZGUgJiAweEZGKSA+PSBSWE1PREVfUkZNT04pIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWxvY2FsLT5jb25maWcucm1vZGUgJj0gMHhGRjAwOworCQkJbG9jYWwtPmNvbmZpZy5ybW9kZSB8PSBSWE1PREVfQkNfTUNfQUREUjsKKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKwkJY2FzZSBJV19QT1dFUl9PTjoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8vIE5vdGUgOiB3ZSBtYXkgd2FudCB0byBmYWN0b3IgbG9jYWwtPm5lZWRfY29tbWl0IGhlcmUKKwkvLyBOb3RlMiA6IG1heSBhbHNvIHdhbnQgdG8gZmFjdG9yIFJYTU9ERV9SRk1PTiB0ZXN0CisJcmV0dXJuIC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgUG93ZXIgTWFuYWdlbWVudAorICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJaW50IG1vZGU7CisKKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwltb2RlID0gbG9jYWwtPmNvbmZpZy5wb3dlclNhdmVNb2RlOworCWlmICgodndycS0+ZGlzYWJsZWQgPSAobW9kZSA9PSBQT1dFUlNBVkVfQ0FNKSkpCisJCXJldHVybiAwOworCWlmICgodndycS0+ZmxhZ3MgJiBJV19QT1dFUl9UWVBFKSA9PSBJV19QT1dFUl9USU1FT1VUKSB7CisJCXZ3cnEtPnZhbHVlID0gKGludClsb2NhbC0+Y29uZmlnLmZhc3RMaXN0ZW5EZWxheSAqIDEwMjQ7CisJCXZ3cnEtPmZsYWdzID0gSVdfUE9XRVJfVElNRU9VVDsKKwl9IGVsc2UgeworCQl2d3JxLT52YWx1ZSA9IChpbnQpbG9jYWwtPmNvbmZpZy5mYXN0TGlzdGVuSW50ZXJ2YWwgKiAxMDI0OworCQl2d3JxLT5mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKKwl9CisJaWYgKChsb2NhbC0+Y29uZmlnLnJtb2RlICYgMHhGRikgPT0gUlhNT0RFX0FERFIpCisJCXZ3cnEtPmZsYWdzIHw9IElXX1BPV0VSX1VOSUNBU1RfUjsKKwllbHNlCisJCXZ3cnEtPmZsYWdzIHw9IElXX1BPV0VSX0FMTF9SOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IFNlbnNpdGl2aXR5CisgKi8KK3N0YXRpYyBpbnQgYWlyb19zZXRfc2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJbG9jYWwtPmNvbmZpZy5yc3NpVGhyZXNob2xkID0gdndycS0+ZGlzYWJsZWQgPyBSU1NJX0RFRkFVTFQgOiB2d3JxLT52YWx1ZTsKKwlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBTZW5zaXRpdml0eQorICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCXZ3cnEtPnZhbHVlID0gbG9jYWwtPmNvbmZpZy5yc3NpVGhyZXNob2xkOworCXZ3cnEtPmRpc2FibGVkID0gKHZ3cnEtPnZhbHVlID09IDApOworCXZ3cnEtPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBBUCBMaXN0CisgKiBOb3RlIDogdGhpcyBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIElXU0NBTgorICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X2FwbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCXN0cnVjdCBzb2NrYWRkciAqYWRkcmVzcyA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgZXh0cmE7CisJc3RydWN0IGl3X3F1YWxpdHkgcXVhbFtJV19NQVhfQVBdOworCUJTU0xpc3RSaWQgQlNTTGlzdDsKKwlpbnQgaTsKKwlpbnQgbG9zZVN5bmMgPSBjYXBhYmxlKENBUF9ORVRfQURNSU4pID8gMTogLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgSVdfTUFYX0FQOyBpKyspIHsKKwkJaWYgKHJlYWRCU1NMaXN0UmlkKGxvY2FsLCBsb3NlU3luYywgJkJTU0xpc3QpKQorCQkJYnJlYWs7CisJCWxvc2VTeW5jID0gMDsKKwkJbWVtY3B5KGFkZHJlc3NbaV0uc2FfZGF0YSwgQlNTTGlzdC5ic3NpZCwgRVRIX0FMRU4pOworCQlhZGRyZXNzW2ldLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJaWYgKGxvY2FsLT5yc3NpKQorCQkJcXVhbFtpXS5sZXZlbCA9IDB4MTAwIC0gbG9jYWwtPnJzc2lbQlNTTGlzdC5yc3NpXS5yc3NpZEJtOworCQllbHNlCisJCQlxdWFsW2ldLmxldmVsID0gKEJTU0xpc3QucnNzaSArIDMyMSkgLyAyOworCQlxdWFsW2ldLnF1YWwgPSBxdWFsW2ldLm5vaXNlID0gMDsKKwkJcXVhbFtpXS51cGRhdGVkID0gMjsKKwkJaWYgKEJTU0xpc3QuaW5kZXggPT0gMHhmZmZmKQorCQkJYnJlYWs7CisJfQorCWlmICghaSkgeworCQlTdGF0dXNSaWQgc3RhdHVzX3JpZDsJCS8qIENhcmQgc3RhdHVzIGluZm8gKi8KKwkJcmVhZFN0YXR1c1JpZChsb2NhbCwgJnN0YXR1c19yaWQsIDEpOworCQlmb3IgKGkgPSAwOworCQkgICAgIGkgPCBtaW4oSVdfTUFYX0FQLCA0KSAmJgorCQkJICAgICAoc3RhdHVzX3JpZC5ic3NpZFtpXVswXQorCQkJICAgICAgJiBzdGF0dXNfcmlkLmJzc2lkW2ldWzFdCisJCQkgICAgICAmIHN0YXR1c19yaWQuYnNzaWRbaV1bMl0KKwkJCSAgICAgICYgc3RhdHVzX3JpZC5ic3NpZFtpXVszXQorCQkJICAgICAgJiBzdGF0dXNfcmlkLmJzc2lkW2ldWzRdCisJCQkgICAgICAmIHN0YXR1c19yaWQuYnNzaWRbaV1bNV0pIT0weGZmICYmCisJCQkgICAgIChzdGF0dXNfcmlkLmJzc2lkW2ldWzBdCisJCQkgICAgICB8IHN0YXR1c19yaWQuYnNzaWRbaV1bMV0KKwkJCSAgICAgIHwgc3RhdHVzX3JpZC5ic3NpZFtpXVsyXQorCQkJICAgICAgfCBzdGF0dXNfcmlkLmJzc2lkW2ldWzNdCisJCQkgICAgICB8IHN0YXR1c19yaWQuYnNzaWRbaV1bNF0KKwkJCSAgICAgIHwgc3RhdHVzX3JpZC5ic3NpZFtpXVs1XSk7CisJCSAgICAgaSsrKSB7CisJCQltZW1jcHkoYWRkcmVzc1tpXS5zYV9kYXRhLAorCQkJICAgICAgIHN0YXR1c19yaWQuYnNzaWRbaV0sIEVUSF9BTEVOKTsKKwkJCWFkZHJlc3NbaV0uc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQl9CisJfSBlbHNlIHsKKwkJZHdycS0+ZmxhZ3MgPSAxOyAvKiBTaG91bGQgYmUgZGVmaW5lJ2QgKi8KKwkJbWVtY3B5KGV4dHJhICsgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikqaSwKKwkJICAgICAgICZxdWFsLCAgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSppKTsKKwl9CisJZHdycS0+bGVuZ3RoID0gaTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IEluaXRpYXRlIFNjYW4KKyAqLworc3RhdGljIGludCBhaXJvX3NldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJQ21kIGNtZDsKKwlSZXNwIHJzcDsKKworCS8qIE5vdGUgOiB5b3UgbWF5IGhhdmUgcmVhbGlzZWQgdGhhdCwgYXMgdGhpcyBpcyBhIFNFVCBvcGVyYXRpb24sCisJICogdGhpcyBpcyBwcml2aWxlZ2VkIGFuZCB0aGVyZWZvcmUgYSBub3JtYWwgdXNlciBjYW4ndAorCSAqIHBlcmZvcm0gc2Nhbm5pbmcuCisJICogVGhpcyBpcyBub3QgYW4gZXJyb3IsIHdoaWxlIHRoZSBkZXZpY2UgcGVyZm9ybSBzY2FubmluZywKKwkgKiB0cmFmZmljIGRvZXNuJ3QgZmxvdywgc28gaXQncyBhIHBlcmZlY3QgRG9TLi4uCisJICogSmVhbiBJSSAqLworCWlmIChhaS0+ZmxhZ3MgJiBGTEFHX1JBRElPX01BU0spIHJldHVybiAtRU5FVERPV047CisKKwkvKiBJbml0aWF0ZSBhIHNjYW4gY29tbWFuZCAqLworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLmNtZD1DTURfTElTVEJTUzsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhaS0+c2VtKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApOworCWFpLT5zY2FuX3RpbWVzdGFtcCA9IGppZmZpZXM7CisJdXAoJmFpLT5zZW0pOworCisJLyogQXQgdGhpcyBwb2ludCwganVzdCByZXR1cm4gdG8gdGhlIHVzZXIuICovCisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRyYW5zbGF0ZSBzY2FuIGRhdGEgcmV0dXJuZWQgZnJvbSB0aGUgY2FyZCB0byBhIGNhcmQgaW5kZXBlbmRlbnQKKyAqIGZvcm1hdCB0aGF0IHRoZSBXaXJlbGVzcyBUb29scyB3aWxsIHVuZGVyc3RhbmQgLSBKZWFuIElJCisgKi8KK3N0YXRpYyBpbmxpbmUgY2hhciAqYWlyb190cmFuc2xhdGVfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQljaGFyICpjdXJyZW50X2V2LAorCQkJCQljaGFyICplbmRfYnVmLAorCQkJCQlCU1NMaXN0UmlkICpsaXN0KQoreworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCXN0cnVjdCBpd19ldmVudAkJaXdlOwkJLyogVGVtcG9yYXJ5IGJ1ZmZlciAqLworCXUxNgkJCWNhcGFiaWxpdGllczsKKwljaGFyICoJCQljdXJyZW50X3ZhbDsJLyogRm9yIHJhdGVzICovCisJaW50CQkJaTsKKworCS8qIEZpcnN0IGVudHJ5ICpNVVNUKiBiZSB0aGUgQVAgTUFDIGFkZHJlc3MgKi8KKwlpd2UuY21kID0gU0lPQ0dJV0FQOworCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsIGxpc3QtPmJzc2lkLCBFVEhfQUxFTik7CisJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKKworCS8qIE90aGVyIGVudHJpZXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIG9yZGVyIHdlIGdpdmUgdGhlbSAqLworCisJLyogQWRkIHRoZSBFU1NJRCAqLworCWl3ZS51LmRhdGEubGVuZ3RoID0gbGlzdC0+c3NpZExlbjsKKwlpZihpd2UudS5kYXRhLmxlbmd0aCA+IDMyKQorCQlpd2UudS5kYXRhLmxlbmd0aCA9IDMyOworCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CisJaXdlLnUuZGF0YS5mbGFncyA9IDE7CisJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGxpc3QtPnNzaWQpOworCisJLyogQWRkIG1vZGUgKi8KKwlpd2UuY21kID0gU0lPQ0dJV01PREU7CisJY2FwYWJpbGl0aWVzID0gbGUxNl90b19jcHUobGlzdC0+Y2FwKTsKKwlpZihjYXBhYmlsaXRpZXMgJiAoQ0FQX0VTUyB8IENBUF9JQlNTKSkgeworCQlpZihjYXBhYmlsaXRpZXMgJiBDQVBfRVNTKQorCQkJaXdlLnUubW9kZSA9IElXX01PREVfTUFTVEVSOworCQllbHNlCisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9BREhPQzsKKwkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX1VJTlRfTEVOKTsKKwl9CisKKwkvKiBBZGQgZnJlcXVlbmN5ICovCisJaXdlLmNtZCA9IFNJT0NHSVdGUkVROworCWl3ZS51LmZyZXEubSA9IGxlMTZfdG9fY3B1KGxpc3QtPmRzQ2hhbm5lbCk7CisJaXdlLnUuZnJlcS5tID0gZnJlcXVlbmN5X2xpc3RbaXdlLnUuZnJlcS5tXSAqIDEwMDAwMDsKKwlpd2UudS5mcmVxLmUgPSAxOworCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9GUkVRX0xFTik7CisKKwkvKiBBZGQgcXVhbGl0eSBzdGF0aXN0aWNzICovCisJaXdlLmNtZCA9IElXRVZRVUFMOworCWlmIChhaS0+cnNzaSkKKwkJaXdlLnUucXVhbC5sZXZlbCA9IDB4MTAwIC0gYWktPnJzc2lbbGlzdC0+cnNzaV0ucnNzaWRCbTsKKwllbHNlCisJCWl3ZS51LnF1YWwubGV2ZWwgPSAobGlzdC0+cnNzaSArIDMyMSkgLyAyOworCWl3ZS51LnF1YWwubm9pc2UgPSAwOworCWl3ZS51LnF1YWwucXVhbCA9IDA7CisJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX1FVQUxfTEVOKTsKKworCS8qIEFkZCBlbmNyeXB0aW9uIGNhcGFiaWxpdHkgKi8KKwlpd2UuY21kID0gU0lPQ0dJV0VOQ09ERTsKKwlpZihjYXBhYmlsaXRpZXMgJiBDQVBfUFJJVkFDWSkKKwkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOworCWVsc2UKKwkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwlpd2UudS5kYXRhLmxlbmd0aCA9IDA7CisJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGxpc3QtPnNzaWQpOworCisJLyogUmF0ZSA6IHN0dWZmaW5nIG11bHRpcGxlIHZhbHVlcyBpbiBhIHNpbmdsZSBldmVudCByZXF1aXJlIGEgYml0CisJICogbW9yZSBvZiBtYWdpYyAtIEplYW4gSUkgKi8KKwljdXJyZW50X3ZhbCA9IGN1cnJlbnRfZXYgKyBJV19FVl9MQ1BfTEVOOworCisJaXdlLmNtZCA9IFNJT0NHSVdSQVRFOworCS8qIFRob3NlIHR3byBmbGFncyBhcmUgaWdub3JlZC4uLiAqLworCWl3ZS51LmJpdHJhdGUuZml4ZWQgPSBpd2UudS5iaXRyYXRlLmRpc2FibGVkID0gMDsKKwkvKiBNYXggOCB2YWx1ZXMgKi8KKwlmb3IoaSA9IDAgOyBpIDwgOCA7IGkrKykgeworCQkvKiBOVUxMIHRlcm1pbmF0ZWQgKi8KKwkJaWYobGlzdC0+cmF0ZXNbaV0gPT0gMCkKKwkJCWJyZWFrOworCQkvKiBCaXQgcmF0ZSBnaXZlbiBpbiA1MDAga2IvcyB1bml0cyAoKyAweDgwKSAqLworCQlpd2UudS5iaXRyYXRlLnZhbHVlID0gKChsaXN0LT5yYXRlc1tpXSAmIDB4N2YpICogNTAwMDAwKTsKKwkJLyogQWRkIG5ldyB2YWx1ZSB0byBldmVudCAqLworCQljdXJyZW50X3ZhbCA9IGl3ZV9zdHJlYW1fYWRkX3ZhbHVlKGN1cnJlbnRfZXYsIGN1cnJlbnRfdmFsLCBlbmRfYnVmLCAmaXdlLCBJV19FVl9QQVJBTV9MRU4pOworCX0KKwkvKiBDaGVjayBpZiB3ZSBhZGRlZCBhbnkgZXZlbnQgKi8KKwlpZigoY3VycmVudF92YWwgLSBjdXJyZW50X2V2KSA+IElXX0VWX0xDUF9MRU4pCisJCWN1cnJlbnRfZXYgPSBjdXJyZW50X3ZhbDsKKworCS8qIFRoZSBvdGhlciBkYXRhIGluIHRoZSBzY2FuIHJlc3VsdCBhcmUgbm90IHJlYWxseQorCSAqIGludGVyZXN0aW5nLCBzbyBmb3Igbm93IGRyb3AgaXQgLSBKZWFuIElJICovCisJcmV0dXJuIGN1cnJlbnRfZXY7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogUmVhZCBTY2FuIFJlc3VsdHMKKyAqLworc3RhdGljIGludCBhaXJvX2dldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJQlNTTGlzdFJpZCBCU1NMaXN0OworCWludCByYzsKKwljaGFyICpjdXJyZW50X2V2ID0gZXh0cmE7CisKKwkvKiBXaGVuIHdlIGFyZSBhc3NvY2lhdGVkIGFnYWluLCB0aGUgc2NhbiBoYXMgc3VyZWx5IGZpbmlzaGVkLgorCSAqIEp1c3QgaW4gY2FzZSwgbGV0J3MgbWFrZSBzdXJlIGVub3VnaCB0aW1lIGhhcyBlbGFwc2VkIHNpbmNlCisJICogd2Ugc3RhcnRlZCB0aGUgc2Nhbi4gLSBKYXZpZXIgKi8KKwlpZihhaS0+c2Nhbl90aW1lc3RhbXAgJiYgdGltZV9iZWZvcmUoamlmZmllcyxhaS0+c2Nhbl90aW1lc3RhbXArMypIWikpIHsKKwkJLyogSW1wb3J0YW50IG5vdGUgOiB3ZSBkb24ndCB3YW50IHRvIGJsb2NrIHRoZSBjYWxsZXIKKwkJICogdW50aWwgcmVzdWx0cyBhcmUgcmVhZHkgZm9yIHZhcmlvdXMgcmVhc29ucy4KKwkJICogRmlyc3QsIG1hbmFnaW5nIHdhaXQgcXVldWVzIGlzIGNvbXBsZXggYW5kIHJhY3kKKwkJICogKHRoZXJlIG1heSBiZSBtdWx0aXBsZSBzaW11bHRhbmVvdXMgY2FsbGVycykuCisJCSAqIFNlY29uZCwgd2UgZ3JhYiBzb21lIHJ0bmV0bGluayBsb2NrIGJlZm9yZSBjb21taW5nCisJCSAqIGhlcmUgKGluIGRldl9pb2N0bCgpKS4KKwkJICogVGhpcmQsIHRoZSBjYWxsZXIgY2FuIHdhaXQgb24gdGhlIFdpcmVsZXNzIEV2ZW50CisJCSAqIC0gSmVhbiBJSSAqLworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJYWktPnNjYW5fdGltZXN0YW1wID0gMDsKKworCS8qIFRoZXJlJ3Mgb25seSBhIHJhY2Ugd2l0aCBwcm9jX0JTU0xpc3Rfb3BlbigpLCBidXQgaXRzCisJICogY29uc2VxdWVuY2VzIGFyZSBiZWduaWduLiBTbyBJIGRvbid0IGJvdGhlciBmaXhpbmcgaXQgLSBKYXZpZXIgKi8KKworCS8qIFRyeSB0byByZWFkIHRoZSBmaXJzdCBlbnRyeSBvZiB0aGUgc2NhbiByZXN1bHQgKi8KKwlyYyA9IFBDNDUwMF9yZWFkcmlkKGFpLCBSSURfQlNTTElTVEZJUlNULCAmQlNTTGlzdCwgc2l6ZW9mKEJTU0xpc3QpLCAxKTsKKwlpZigocmMpIHx8IChCU1NMaXN0LmluZGV4ID09IDB4ZmZmZikpIHsKKwkJLyogQ2xpZW50IGVycm9yLCBubyBzY2FuIHJlc3VsdHMuLi4KKwkJICogVGhlIGNhbGxlciBuZWVkIHRvIHJlc3RhcnQgdGhlIHNjYW4uICovCisJCXJldHVybiAtRU5PREFUQTsKKwl9CisKKwkvKiBSZWFkIGFuZCBwYXJzZSBhbGwgZW50cmllcyAqLworCXdoaWxlKCghcmMpICYmIChCU1NMaXN0LmluZGV4ICE9IDB4ZmZmZikpIHsKKwkJLyogVHJhbnNsYXRlIHRvIFdFIGZvcm1hdCB0aGlzIGVudHJ5ICovCisJCWN1cnJlbnRfZXYgPSBhaXJvX3RyYW5zbGF0ZV9zY2FuKGRldiwgY3VycmVudF9ldiwKKwkJCQkJCSBleHRyYSArIGR3cnEtPmxlbmd0aCwKKwkJCQkJCSAmQlNTTGlzdCk7CisKKwkJLyogQ2hlY2sgaWYgdGhlcmUgaXMgc3BhY2UgZm9yIG9uZSBtb3JlIGVudHJ5ICovCisJCWlmKChleHRyYSArIGR3cnEtPmxlbmd0aCAtIGN1cnJlbnRfZXYpIDw9IElXX0VWX0FERFJfTEVOKSB7CisJCQkvKiBBc2sgdXNlciBzcGFjZSB0byB0cnkgYWdhaW4gd2l0aCBhIGJpZ2dlciBidWZmZXIgKi8KKwkJCXJldHVybiAtRTJCSUc7CisJCX0KKworCQkvKiBSZWFkIG5leHQgZW50cnkgKi8KKwkJcmMgPSBQQzQ1MDBfcmVhZHJpZChhaSwgUklEX0JTU0xJU1RORVhULAorCQkJCSAgICAmQlNTTGlzdCwgc2l6ZW9mKEJTU0xpc3QpLCAxKTsKKwl9CisJLyogTGVuZ3RoIG9mIGRhdGEgKi8KKwlkd3JxLT5sZW5ndGggPSAoY3VycmVudF9ldiAtIGV4dHJhKTsKKwlkd3JxLT5mbGFncyA9IDA7CS8qIHRvZG8gKi8KKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ29tbWl0IGhhbmRsZXIgOiBjYWxsZWQgYWZ0ZXIgYSBidW5jaCBvZiBTRVQgb3BlcmF0aW9ucworICovCitzdGF0aWMgaW50IGFpcm9fY29uZmlnX2NvbW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywJLyogTlVMTCAqLworCQkJICAgICAgdm9pZCAqendycSwJCQkvKiBOVUxMICovCisJCQkgICAgICBjaGFyICpleHRyYSkJCQkvKiBOVUxMICovCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJUmVzcCByc3A7CisKKwlpZiAoIXRlc3RfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncykpCisJCXJldHVybiAwOworCisJLyogU29tZSBvZiB0aGUgIlNFVCIgZnVuY3Rpb24gbWF5IGhhdmUgbW9kaWZpZWQgc29tZSBvZiB0aGUKKwkgKiBwYXJhbWV0ZXJzLiBJdCdzIG5vdyB0aW1lIHRvIGNvbW1pdCB0aGVtIGluIHRoZSBjYXJkICovCisJZGlzYWJsZV9NQUMobG9jYWwsIDEpOworCWlmICh0ZXN0X2JpdCAoRkxBR19SRVNFVCwgJmxvY2FsLT5mbGFncykpIHsKKwkJQVBMaXN0UmlkIEFQTGlzdF9yaWQ7CisJCVNzaWRSaWQgU1NJRF9yaWQ7CisKKwkJcmVhZEFQTGlzdFJpZChsb2NhbCwgJkFQTGlzdF9yaWQpOworCQlyZWFkU3NpZFJpZChsb2NhbCwgJlNTSURfcmlkKTsKKwkJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCZsb2NhbC0+ZmxhZ3MpKQorCQkJc2V0dXBfY2FyZChsb2NhbCwgZGV2LT5kZXZfYWRkciwgMSApOworCQllbHNlCisJCQlyZXNldF9haXJvX2NhcmQoZGV2KTsKKwkJZGlzYWJsZV9NQUMobG9jYWwsIDEpOworCQl3cml0ZVNzaWRSaWQobG9jYWwsICZTU0lEX3JpZCwgMSk7CisJCXdyaXRlQVBMaXN0UmlkKGxvY2FsLCAmQVBMaXN0X3JpZCwgMSk7CisJfQorCWlmIChkb3duX2ludGVycnVwdGlibGUoJmxvY2FsLT5zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCXdyaXRlQ29uZmlnUmlkKGxvY2FsLCAwKTsKKwllbmFibGVfTUFDKGxvY2FsLCAmcnNwLCAwKTsKKwlpZiAodGVzdF9iaXQgKEZMQUdfUkVTRVQsICZsb2NhbC0+ZmxhZ3MpKQorCQlhaXJvX3NldF9wcm9taXNjKGxvY2FsKTsKKwllbHNlCisJCXVwKCZsb2NhbC0+c2VtKTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU3RydWN0dXJlcyB0byBleHBvcnQgdGhlIFdpcmVsZXNzIEhhbmRsZXJzCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3MgYWlyb19wcml2YXRlX2FyZ3NbXSA9IHsKKy8qeyBjbWQsICAgICAgICAgc2V0X2FyZ3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9hcmdzLCBuYW1lIH0gKi8KKyAgeyBBSVJPSU9DVEwsIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgc2l6ZW9mIChhaXJvbmV0X2lvY3RsKSwKKyAgICBJV19QUklWX1RZUEVfQllURSB8IDIwNDcsICJhaXJvaW9jdGwiIH0sCisgIHsgQUlST0lESUZDLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IHNpemVvZiAoYWlyb25ldF9pb2N0bCksCisgICAgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJhaXJvaWRpZmMiIH0sCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlcgkJYWlyb19oYW5kbGVyW10gPQoreworCShpd19oYW5kbGVyKSBhaXJvX2NvbmZpZ19jb21taXQsCS8qIFNJT0NTSVdDT01NSVQgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfbmFtZSwJCS8qIFNJT0NHSVdOQU1FICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ1NJV05XSUQgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiBTSU9DR0lXTldJRCAqLworCShpd19oYW5kbGVyKSBhaXJvX3NldF9mcmVxLAkJLyogU0lPQ1NJV0ZSRVEgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfZnJlcSwJCS8qIFNJT0NHSVdGUkVRICovCisJKGl3X2hhbmRsZXIpIGFpcm9fc2V0X21vZGUsCQkvKiBTSU9DU0lXTU9ERSAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF9tb2RlLAkJLyogU0lPQ0dJV01PREUgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19zZXRfc2VucywJCS8qIFNJT0NTSVdTRU5TICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X3NlbnMsCQkvKiBTSU9DR0lXU0VOUyAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NTSVdSQU5HRSAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF9yYW5nZSwJCS8qIFNJT0NHSVdSQU5HRSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NTSVdQUklWICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ0dJV1BSSVYgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiBTSU9DU0lXU1RBVFMgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiBTSU9DR0lXU1RBVFMgKi8KKwlpd19oYW5kbGVyX3NldF9zcHksCQkJLyogU0lPQ1NJV1NQWSAqLworCWl3X2hhbmRsZXJfZ2V0X3NweSwJCQkvKiBTSU9DR0lXU1BZICovCisJaXdfaGFuZGxlcl9zZXRfdGhyc3B5LAkJCS8qIFNJT0NTSVdUSFJTUFkgKi8KKwlpd19oYW5kbGVyX2dldF90aHJzcHksCQkJLyogU0lPQ0dJV1RIUlNQWSAqLworCShpd19oYW5kbGVyKSBhaXJvX3NldF93YXAsCQkvKiBTSU9DU0lXQVAgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfd2FwLAkJLyogU0lPQ0dJV0FQICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF9hcGxpc3QsCQkvKiBTSU9DR0lXQVBMSVNUICovCisJKGl3X2hhbmRsZXIpIGFpcm9fc2V0X3NjYW4sCQkvKiBTSU9DU0lXU0NBTiAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF9zY2FuLAkJLyogU0lPQ0dJV1NDQU4gKi8KKwkoaXdfaGFuZGxlcikgYWlyb19zZXRfZXNzaWQsCQkvKiBTSU9DU0lXRVNTSUQgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfZXNzaWQsCQkvKiBTSU9DR0lXRVNTSUQgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19zZXRfbmljaywJCS8qIFNJT0NTSVdOSUNLTiAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF9uaWNrLAkJLyogU0lPQ0dJV05JQ0tOICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgYWlyb19zZXRfcmF0ZSwJCS8qIFNJT0NTSVdSQVRFICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X3JhdGUsCQkvKiBTSU9DR0lXUkFURSAqLworCShpd19oYW5kbGVyKSBhaXJvX3NldF9ydHMsCQkvKiBTSU9DU0lXUlRTICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X3J0cywJCS8qIFNJT0NHSVdSVFMgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19zZXRfZnJhZywJCS8qIFNJT0NTSVdGUkFHICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X2ZyYWcsCQkvKiBTSU9DR0lXRlJBRyAqLworCShpd19oYW5kbGVyKSBhaXJvX3NldF90eHBvdywJCS8qIFNJT0NTSVdUWFBPVyAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF90eHBvdywJCS8qIFNJT0NHSVdUWFBPVyAqLworCShpd19oYW5kbGVyKSBhaXJvX3NldF9yZXRyeSwJCS8qIFNJT0NTSVdSRVRSWSAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF9yZXRyeSwJCS8qIFNJT0NHSVdSRVRSWSAqLworCShpd19oYW5kbGVyKSBhaXJvX3NldF9lbmNvZGUsCQkvKiBTSU9DU0lXRU5DT0RFICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X2VuY29kZSwJCS8qIFNJT0NHSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19zZXRfcG93ZXIsCQkvKiBTSU9DU0lXUE9XRVIgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfcG93ZXIsCQkvKiBTSU9DR0lXUE9XRVIgKi8KK307CisKKy8qIE5vdGUgOiBkb24ndCBkZXNjcmliZSBBSVJPSURJRkMgYW5kIEFJUk9PTERJRElGQyBpbiBoZXJlLgorICogV2Ugd2FudCB0byBmb3JjZSB0aGUgdXNlIG9mIHRoZSBpb2N0bCBjb2RlLCBiZWNhdXNlIHRob3NlIGNhbid0IGJlCisgKiB3b24ndCB3b3JrIHRoZSBpd19oYW5kbGVyIGNvZGUgKGJlY2F1c2UgdGhleSBzaW11bHRhbmVvdXNseSByZWFkCisgKiBhbmQgd3JpdGUgZGF0YSBhbmQgaXdfaGFuZGxlciBjYW4ndCBkbyB0aGF0KS4KKyAqIE5vdGUgdGhhdCBpdCdzIHBlcmZlY3RseSBsZWdhbCB0byByZWFkL3dyaXRlIG9uIGEgc2luZ2xlIGlvY3RsIGNvbW1hbmQsCisgKiB5b3UganVzdCBjYW4ndCB1c2UgaXdwcml2IGFuZCBuZWVkIHRvIGZvcmNlIGl0IHZpYSB0aGUgaW9jdGwgaGFuZGxlci4KKyAqIEplYW4gSUkgKi8KK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyCQlhaXJvX3ByaXZhdGVfaGFuZGxlcltdID0KK3sKKwlOVUxMLAkJCQkvKiBTSU9DSVdGSVJTVFBSSVYgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYJYWlyb19oYW5kbGVyX2RlZiA9Cit7CisJLm51bV9zdGFuZGFyZAk9IHNpemVvZihhaXJvX2hhbmRsZXIpL3NpemVvZihpd19oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGUJPSBzaXplb2YoYWlyb19wcml2YXRlX2hhbmRsZXIpL3NpemVvZihpd19oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGVfYXJncyA9IHNpemVvZihhaXJvX3ByaXZhdGVfYXJncykvc2l6ZW9mKHN0cnVjdCBpd19wcml2X2FyZ3MpLAorCS5zdGFuZGFyZAk9IGFpcm9faGFuZGxlciwKKwkucHJpdmF0ZQk9IGFpcm9fcHJpdmF0ZV9oYW5kbGVyLAorCS5wcml2YXRlX2FyZ3MJPSBhaXJvX3ByaXZhdGVfYXJncywKKwkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gYWlyb19nZXRfd2lyZWxlc3Nfc3RhdHMsCit9OworCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUICovCisKKy8qCisgKiBUaGlzIGRlZmluZXMgdGhlIGNvbmZpZ3VyYXRpb24gcGFydCBvZiB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9ucworICogTm90ZSA6IGlycSBhbmQgc3BpbmxvY2sgcHJvdGVjdGlvbiB3aWxsIG9jY3VyIGluIHRoZSBzdWJyb3V0aW5lcworICoKKyAqIFRPRE8gOgorICoJbyBDaGVjayBpbnB1dCB2YWx1ZSBtb3JlIGNhcmVmdWxseSBhbmQgZmlsbCBjb3JyZWN0IHZhbHVlcyBpbiByYW5nZQorICoJbyBUZXN0IGFuZCBzaGFrZW91dCB0aGUgYnVncyAoaWYgYW55KQorICoKKyAqIEplYW4gSUkKKyAqCisgKiBKYXZpZXIgQWNoaXJpY2EgZGlkIGEgZ3JlYXQgam9iIG9mIG1lcmdpbmcgY29kZSBmcm9tIHRoZSB1bm5hbWVkIENJU0NPCisgKiBkZXZlbG9wZXIgdGhhdCBhZGRlZCBzdXBwb3J0IGZvciBmbGFzaGluZyB0aGUgY2FyZC4KKyAqLworc3RhdGljIGludCBhaXJvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IChzdHJ1Y3QgYWlyb19pbmZvICopZGV2LT5wcml2OworCisJaWYgKGFpLT5wb3dlcikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGNtZCkgeworI2lmZGVmIENJU0NPX0VYVAorCWNhc2UgQUlST0lESUZDOgorI2lmZGVmIEFJUk9PTERJRElGQworCWNhc2UgQUlST09MRElESUZDOgorI2VuZGlmCisJeworCQlpbnQgdmFsID0gQUlST01BR0lDOworCQlhaXJvbmV0X2lvY3RsIGNvbTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjb20scnEtPmlmcl9kYXRhLHNpemVvZihjb20pKSkKKwkJCXJjID0gLUVGQVVMVDsKKwkJZWxzZSBpZiAoY29weV90b191c2VyKGNvbS5kYXRhLChjaGFyICopJnZhbCxzaXplb2YodmFsKSkpCisJCQlyYyA9IC1FRkFVTFQ7CisJfQorCWJyZWFrOworCisJY2FzZSBBSVJPSU9DVEw6CisjaWZkZWYgQUlST09MRElPQ1RMCisJY2FzZSBBSVJPT0xESU9DVEw6CisjZW5kaWYKKwkJLyogR2V0IHRoZSBjb21tYW5kIHN0cnVjdCBhbmQgaGFuZCBpdCBvZmYgZm9yIGV2YWx1YXRpb24gYnkKKwkJICogdGhlIHByb3BlciBzdWJmdW5jdGlvbgorCQkgKi8KKwl7CisJCWFpcm9uZXRfaW9jdGwgY29tOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbSxycS0+aWZyX2RhdGEsc2l6ZW9mKGNvbSkpKSB7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFNlcGFyYXRlIFIvVyBmdW5jdGlvbnMgYnJhY2tldCBsZWdhbGl0eSBoZXJlCisJCSAqLworCQlpZiAoIGNvbS5jb21tYW5kID09IEFJUk9SU1dWRVJTSU9OICkgeworCQkJaWYgKGNvcHlfdG9fdXNlcihjb20uZGF0YSwgc3d2ZXJzaW9uLCBzaXplb2Yoc3d2ZXJzaW9uKSkpCisJCQkJcmMgPSAtRUZBVUxUOworCQkJZWxzZQorCQkJCXJjID0gMDsKKwkJfQorCQllbHNlIGlmICggY29tLmNvbW1hbmQgPD0gQUlST1JSSUQpCisJCQlyYyA9IHJlYWRyaWRzKGRldiwmY29tKTsKKwkJZWxzZSBpZiAoIGNvbS5jb21tYW5kID49IEFJUk9QQ0FQICYmIGNvbS5jb21tYW5kIDw9IChBSVJPUExFQVBVU1IrMikgKQorCQkJcmMgPSB3cml0ZXJpZHMoZGV2LCZjb20pOworCQllbHNlIGlmICggY29tLmNvbW1hbmQgPj0gQUlST0ZMU0hSU1QgJiYgY29tLmNvbW1hbmQgPD0gQUlST1JFU1RBUlQgKQorCQkJcmMgPSBmbGFzaGNhcmQoZGV2LCZjb20pOworCQllbHNlCisJCQlyYyA9IC1FSU5WQUw7ICAgICAgLyogQmFkIGNvbW1hbmQgaW4gaW9jdGwgKi8KKwl9CisJYnJlYWs7CisjZW5kaWYgLyogQ0lTQ09fRVhUICovCisKKwkvLyBBbGwgb3RoZXIgY2FsbHMgYXJlIGN1cnJlbnRseSB1bnN1cHBvcnRlZAorCWRlZmF1bHQ6CisJCXJjID0gLUVPUE5PVFNVUFA7CisJfQorCXJldHVybiByYzsKK30KKworI2lmZGVmIFdJUkVMRVNTX0VYVAorLyoKKyAqIEdldCB0aGUgV2lyZWxlc3Mgc3RhdHMgb3V0IG9mIHRoZSBkcml2ZXIKKyAqIE5vdGUgOiBpcnEgYW5kIHNwaW5sb2NrIHByb3RlY3Rpb24gd2lsbCBvY2N1ciBpbiB0aGUgc3Vicm91dGluZXMKKyAqCisgKiBUT0RPIDoKKyAqCW8gQ2hlY2sgaWYgd29yayBpbiBBZC1Ib2MgbW9kZSAob3RoZXJ3aXNlLCB1c2UgU1BZLCBhcyBpbiB3dmxhbl9jcykKKyAqCisgKiBKZWFuCisgKi8KK3N0YXRpYyB2b2lkIGFpcm9fcmVhZF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCkKK3sKKwlTdGF0dXNSaWQgc3RhdHVzX3JpZDsKKwlTdGF0c1JpZCBzdGF0c19yaWQ7CisJQ2FwYWJpbGl0eVJpZCBjYXBfcmlkOworCXUzMiAqdmFscyA9IHN0YXRzX3JpZC52YWxzOworCisJLyogR2V0IHN0YXRzIG91dCBvZiB0aGUgY2FyZCAqLworCWNsZWFyX2JpdChKT0JfV1NUQVRTLCAmbG9jYWwtPmZsYWdzKTsKKwlpZiAobG9jYWwtPnBvd2VyKSB7CisJCXVwKCZsb2NhbC0+c2VtKTsKKwkJcmV0dXJuOworCX0KKwlyZWFkQ2FwYWJpbGl0eVJpZChsb2NhbCwgJmNhcF9yaWQsIDApOworCXJlYWRTdGF0dXNSaWQobG9jYWwsICZzdGF0dXNfcmlkLCAwKTsKKwlyZWFkU3RhdHNSaWQobG9jYWwsICZzdGF0c19yaWQsIFJJRF9TVEFUUywgMCk7CisJdXAoJmxvY2FsLT5zZW0pOworCisJLyogVGhlIHN0YXR1cyAqLworCWxvY2FsLT53c3RhdHMuc3RhdHVzID0gc3RhdHVzX3JpZC5tb2RlOworCisJLyogU2lnbmFsIHF1YWxpdHkgYW5kIGNvLiBCdXQgd2hlcmUgaXMgdGhlIG5vaXNlIGxldmVsID8/PyAqLworCWxvY2FsLT53c3RhdHMucXVhbC5xdWFsID0gYWlyb19nZXRfcXVhbGl0eSgmc3RhdHVzX3JpZCwgJmNhcF9yaWQpOworCWlmIChsb2NhbC0+cnNzaSkKKwkJbG9jYWwtPndzdGF0cy5xdWFsLmxldmVsID0gMHgxMDAgLSBsb2NhbC0+cnNzaVtzdGF0dXNfcmlkLnNpZ1F1YWxpdHldLnJzc2lkQm07CisJZWxzZQorCQlsb2NhbC0+d3N0YXRzLnF1YWwubGV2ZWwgPSAoc3RhdHVzX3JpZC5ub3JtYWxpemVkU2lnbmFsU3RyZW5ndGggKyAzMjEpIC8gMjsKKwlpZiAoc3RhdHVzX3JpZC5sZW4gPj0gMTI0KSB7CisJCWxvY2FsLT53c3RhdHMucXVhbC5ub2lzZSA9IDI1NiAtIHN0YXR1c19yaWQubm9pc2VkQm07CisJCWxvY2FsLT53c3RhdHMucXVhbC51cGRhdGVkID0gNzsKKwl9IGVsc2UgeworCQlsb2NhbC0+d3N0YXRzLnF1YWwubm9pc2UgPSAwOworCQlsb2NhbC0+d3N0YXRzLnF1YWwudXBkYXRlZCA9IDM7CisJfQorCisJLyogUGFja2V0cyBkaXNjYXJkZWQgaW4gdGhlIHdpcmVsZXNzIGFkYXB0ZXIgZHVlIHRvIHdpcmVsZXNzCisJICogc3BlY2lmaWMgcHJvYmxlbXMgKi8KKwlsb2NhbC0+d3N0YXRzLmRpc2NhcmQubndpZCA9IHZhbHNbNTZdICsgdmFsc1s1N10gKyB2YWxzWzU4XTsvKiBTU0lEIE1pc21hdGNoICovCisJbG9jYWwtPndzdGF0cy5kaXNjYXJkLmNvZGUgPSB2YWxzWzZdOy8qIFJ4V2VwRXJyICovCisJbG9jYWwtPndzdGF0cy5kaXNjYXJkLmZyYWdtZW50ID0gdmFsc1szMF07CisJbG9jYWwtPndzdGF0cy5kaXNjYXJkLnJldHJpZXMgPSB2YWxzWzEwXTsKKwlsb2NhbC0+d3N0YXRzLmRpc2NhcmQubWlzYyA9IHZhbHNbMV0gKyB2YWxzWzMyXTsKKwlsb2NhbC0+d3N0YXRzLm1pc3MuYmVhY29uID0gdmFsc1szNF07Cit9CisKK3N0cnVjdCBpd19zdGF0aXN0aWNzICphaXJvX2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gIGRldi0+cHJpdjsKKworCWlmICghdGVzdF9iaXQoSk9CX1dTVEFUUywgJmxvY2FsLT5mbGFncykpIHsKKwkJLyogR2V0IHN0YXRzIG91dCBvZiB0aGUgY2FyZCBpZiBhdmFpbGFibGUgKi8KKwkJaWYgKGRvd25fdHJ5bG9jaygmbG9jYWwtPnNlbSkgIT0gMCkgeworCQkJc2V0X2JpdChKT0JfV1NUQVRTLCAmbG9jYWwtPmZsYWdzKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbG9jYWwtPnRocl93YWl0KTsKKwkJfSBlbHNlCisJCQlhaXJvX3JlYWRfd2lyZWxlc3Nfc3RhdHMobG9jYWwpOworCX0KKworCXJldHVybiAmbG9jYWwtPndzdGF0czsKK30KKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgKi8KKworI2lmZGVmIENJU0NPX0VYVAorLyoKKyAqIFRoaXMganVzdCB0cmFuc2xhdGVzIGZyb20gZHJpdmVyIElPQ1RMIGNvZGVzIHRvIHRoZSBjb21tYW5kIGNvZGVzIHRvCisgKiBmZWVkIHRvIHRoZSByYWRpbydzIGhvc3QgaW50ZXJmYWNlLiBUaGluZ3MgY2FuIGJlIGFkZGVkL2RlbGV0ZWQKKyAqIGFzIG5lZWRlZC4gIFRoaXMgcmVwcmVzZW50cyB0aGUgUkVBRCBzaWRlIG9mIGNvbnRyb2wgSS9PIHRvCisgKiB0aGUgY2FyZAorICovCitzdGF0aWMgaW50IHJlYWRyaWRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGFpcm9uZXRfaW9jdGwgKmNvbXApIHsKKwl1bnNpZ25lZCBzaG9ydCByaWRjb2RlOworCXVuc2lnbmVkIGNoYXIgKmlvYnVmOworCWludCBsZW47CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJUmVzcCByc3A7CisKKwlpZiAodGVzdF9iaXQoRkxBR19GTEFTSElORywgJmFpLT5mbGFncykpCisJCXJldHVybiAtRUlPOworCisJc3dpdGNoKGNvbXAtPmNvbW1hbmQpCisJeworCWNhc2UgQUlST0dDQVA6ICAgICAgcmlkY29kZSA9IFJJRF9DQVBBQklMSVRJRVM7IGJyZWFrOworCWNhc2UgQUlST0dDRkc6ICAgICAgcmlkY29kZSA9IFJJRF9DT05GSUc7CisJCWlmICh0ZXN0X2JpdChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncykpIHsKKwkJCWRpc2FibGVfTUFDIChhaSwgMSk7CisJCQl3cml0ZUNvbmZpZ1JpZCAoYWksIDEpOworCQkJZW5hYmxlX01BQyAoYWksICZyc3AsIDEpOworCQl9CisJCWJyZWFrOworCWNhc2UgQUlST0dTTElTVDogICAgcmlkY29kZSA9IFJJRF9TU0lEOyAgICAgICAgIGJyZWFrOworCWNhc2UgQUlST0dWTElTVDogICAgcmlkY29kZSA9IFJJRF9BUExJU1Q7ICAgICAgIGJyZWFrOworCWNhc2UgQUlST0dEUlZOQU06ICAgcmlkY29kZSA9IFJJRF9EUlZOQU1FOyAgICAgIGJyZWFrOworCWNhc2UgQUlST0dFSFRFTkM6ICAgcmlkY29kZSA9IFJJRF9FVEhFUkVOQ0FQOyAgIGJyZWFrOworCWNhc2UgQUlST0dXRVBLVE1QOiAgcmlkY29kZSA9IFJJRF9XRVBfVEVNUDsKKwkJLyogT25seSBzdXBlci11c2VyIGNhbiByZWFkIFdFUCBrZXlzICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWJyZWFrOworCWNhc2UgQUlST0dXRVBLTlY6ICAgcmlkY29kZSA9IFJJRF9XRVBfUEVSTTsKKwkJLyogT25seSBzdXBlci11c2VyIGNhbiByZWFkIFdFUCBrZXlzICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWJyZWFrOworCWNhc2UgQUlST0dTVEFUOiAgICAgcmlkY29kZSA9IFJJRF9TVEFUVVM7ICAgICAgIGJyZWFrOworCWNhc2UgQUlST0dTVEFUU0QzMjogcmlkY29kZSA9IFJJRF9TVEFUU0RFTFRBOyAgIGJyZWFrOworCWNhc2UgQUlST0dTVEFUU0MzMjogcmlkY29kZSA9IFJJRF9TVEFUUzsgICAgICAgIGJyZWFrOworI2lmZGVmIE1JQ1NVUFBPUlQKKwljYXNlIEFJUk9HTUlDU1RBVFM6CisJCWlmIChjb3B5X3RvX3VzZXIoY29tcC0+ZGF0YSwgJmFpLT5taWNzdGF0cywKKwkJCQkgbWluKChpbnQpY29tcC0+bGVuLChpbnQpc2l6ZW9mKGFpLT5taWNzdGF0cykpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKyNlbmRpZgorCWNhc2UgQUlST1JSSUQ6ICAgICAgcmlkY29kZSA9IGNvbXAtPnJpZG51bTsgICAgIGJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlpZiAoKGlvYnVmID0ga21hbGxvYyhSSURTSVpFLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlQQzQ1MDBfcmVhZHJpZChhaSxyaWRjb2RlLGlvYnVmLFJJRFNJWkUsIDEpOworCS8qIGdldCB0aGUgY291bnQgb2YgYnl0ZXMgaW4gdGhlIHJpZCAgZG9jcyBzYXkgMXN0IDIgYnl0ZXMgaXMgaXQuCisJICogdGhlbiByZXR1cm4gaXQgdG8gdGhlIHVzZXIKKwkgKiA5LzIyLzIwMDAgSG9ub3IgdXNlciBnaXZlbiBsZW5ndGgKKwkgKi8KKwlsZW4gPSBjb21wLT5sZW47CisKKwlpZiAoY29weV90b191c2VyKGNvbXAtPmRhdGEsIGlvYnVmLCBtaW4obGVuLCAoaW50KVJJRFNJWkUpKSkgeworCQlrZnJlZSAoaW9idWYpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJa2ZyZWUgKGlvYnVmKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERhbmdlciBXaWxsIFJvYmluc29uIHdyaXRlIHRoZSByaWRzIGhlcmUKKyAqLworCitzdGF0aWMgaW50IHdyaXRlcmlkcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBhaXJvbmV0X2lvY3RsICpjb21wKSB7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJaW50ICByaWRjb2RlOworI2lmZGVmIE1JQ1NVUFBPUlQKKyAgICAgICAgaW50ICBlbmFibGVkOworI2VuZGlmCisJUmVzcCAgICAgIHJzcDsKKwlzdGF0aWMgaW50ICgqIHdyaXRlcikoc3RydWN0IGFpcm9faW5mbyAqLCB1MTYgcmlkLCBjb25zdCB2b2lkICosIGludCwgaW50KTsKKwl1bnNpZ25lZCBjaGFyICppb2J1ZjsKKworCS8qIE9ubHkgc3VwZXItdXNlciBjYW4gd3JpdGUgUklEcyAqLworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmICh0ZXN0X2JpdChGTEFHX0ZMQVNISU5HLCAmYWktPmZsYWdzKSkKKwkJcmV0dXJuIC1FSU87CisKKwlyaWRjb2RlID0gMDsKKwl3cml0ZXIgPSBkb193cml0ZXJpZDsKKworCXN3aXRjaChjb21wLT5jb21tYW5kKQorCXsKKwljYXNlIEFJUk9QU0lEUzogICAgIHJpZGNvZGUgPSBSSURfU1NJRDsgICAgICAgICBicmVhazsKKwljYXNlIEFJUk9QQ0FQOiAgICAgIHJpZGNvZGUgPSBSSURfQ0FQQUJJTElUSUVTOyBicmVhazsKKwljYXNlIEFJUk9QQVBMSVNUOiAgIHJpZGNvZGUgPSBSSURfQVBMSVNUOyAgICAgICBicmVhazsKKwljYXNlIEFJUk9QQ0ZHOiBhaS0+Y29uZmlnLmxlbiA9IDA7CisJCQkgICAgY2xlYXJfYml0KEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJCSAgICByaWRjb2RlID0gUklEX0NPTkZJRzsgICAgICAgYnJlYWs7CisJY2FzZSBBSVJPUFdFUEtFWU5WOiByaWRjb2RlID0gUklEX1dFUF9QRVJNOyAgICAgYnJlYWs7CisJY2FzZSBBSVJPUExFQVBVU1I6ICByaWRjb2RlID0gUklEX0xFQVBVU0VSTkFNRTsgYnJlYWs7CisJY2FzZSBBSVJPUExFQVBQV0Q6ICByaWRjb2RlID0gUklEX0xFQVBQQVNTV09SRDsgYnJlYWs7CisJY2FzZSBBSVJPUFdFUEtFWTogICByaWRjb2RlID0gUklEX1dFUF9URU1QOyB3cml0ZXIgPSBQQzQ1MDBfd3JpdGVyaWQ7CisJCWJyZWFrOworCWNhc2UgQUlST1BMRUFQVVNSKzE6IHJpZGNvZGUgPSAweEZGMkE7ICAgICAgICAgIGJyZWFrOworCWNhc2UgQUlST1BMRUFQVVNSKzI6IHJpZGNvZGUgPSAweEZGMkI7ICAgICAgICAgIGJyZWFrOworCisJCS8qIHRoaXMgaXMgbm90IHJlYWxseSBhIHJpZCBidXQgYSBjb21tYW5kIGdpdmVuIHRvIHRoZSBjYXJkCisJCSAqIHNhbWUgd2l0aCBNQUMgb2ZmCisJCSAqLworCWNhc2UgQUlST1BNQUNPTjoKKwkJaWYgKGVuYWJsZV9NQUMoYWksICZyc3AsIDEpICE9IDApCisJCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIDA7CisKKwkJLyoKKwkJICogRXZpZGVudGx5IHRoaXMgY29kZSBpbiB0aGUgYWlybyBkcml2ZXIgZG9lcyBub3QgZ2V0IGEgc3ltYm9sCisJCSAqIGFzIGRpc2FibGVfTUFDLiBpdCdzIHByb2JhYmx5IHNvIHNob3J0IHRoZSBjb21waWxlciBkb2VzIG5vdCBnZW4gb25lLgorCQkgKi8KKwljYXNlIEFJUk9QTUFDT0ZGOgorCQlkaXNhYmxlX01BQyhhaSwgMSk7CisJCXJldHVybiAwOworCisJCS8qIFRoaXMgY29tbWFuZCBtZXJlbHkgY2xlYXJzIHRoZSBjb3VudHMgZG9lcyBub3QgYWN0dWFsbHkgc3RvcmUgYW55IGRhdGEKKwkJICogb25seSByZWFkcyByaWQuIEJ1dCBhcyBpdCBjaGFuZ2VzIHRoZSBjYXJkcyBzdGF0ZSwgSSBwdXQgaXQgaW4gdGhlCisJCSAqIHdyaXRlcmlkIHJvdXRpbmVzLgorCQkgKi8KKwljYXNlIEFJUk9QU1RDTFI6CisJCWlmICgoaW9idWYgPSBrbWFsbG9jKFJJRFNJWkUsIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJUEM0NTAwX3JlYWRyaWQoYWksUklEX1NUQVRTREVMVEFDTEVBUixpb2J1ZixSSURTSVpFLCAxKTsKKworI2lmZGVmIE1JQ1NVUFBPUlQKKwkJZW5hYmxlZCA9IGFpLT5taWNzdGF0cy5lbmFibGVkOworCQltZW1zZXQoJmFpLT5taWNzdGF0cywwLHNpemVvZihhaS0+bWljc3RhdHMpKTsKKwkJYWktPm1pY3N0YXRzLmVuYWJsZWQgPSBlbmFibGVkOworI2VuZGlmCisKKwkJaWYgKGNvcHlfdG9fdXNlcihjb21wLT5kYXRhLCBpb2J1ZiwKKwkJCQkgbWluKChpbnQpY29tcC0+bGVuLCAoaW50KVJJRFNJWkUpKSkgeworCQkJa2ZyZWUgKGlvYnVmKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWtmcmVlIChpb2J1Zik7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwkvKiBCbGFyZyEgKi8KKwl9CisJaWYoY29tcC0+bGVuID4gUklEU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKGlvYnVmID0ga21hbGxvYyhSSURTSVpFLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY29weV9mcm9tX3VzZXIoaW9idWYsY29tcC0+ZGF0YSxjb21wLT5sZW4pKSB7CisJCWtmcmVlIChpb2J1Zik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChjb21wLT5jb21tYW5kID09IEFJUk9QQ0ZHKSB7CisJCUNvbmZpZ1JpZCAqY2ZnID0gKENvbmZpZ1JpZCAqKWlvYnVmOworCisJCWlmICh0ZXN0X2JpdChGTEFHX01JQ19DQVBBQkxFLCAmYWktPmZsYWdzKSkKKwkJCWNmZy0+b3Btb2RlIHw9IE1PREVfTUlDOworCisJCWlmICgoY2ZnLT5vcG1vZGUgJiAweEZGKSA9PSBNT0RFX1NUQV9JQlNTKQorCQkJc2V0X2JpdCAoRkxBR19BREhPQywgJmFpLT5mbGFncyk7CisJCWVsc2UKKwkJCWNsZWFyX2JpdCAoRkxBR19BREhPQywgJmFpLT5mbGFncyk7CisJfQorCisJaWYoKCp3cml0ZXIpKGFpLCByaWRjb2RlLCBpb2J1Zixjb21wLT5sZW4sMSkpIHsKKwkJa2ZyZWUgKGlvYnVmKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWtmcmVlIChpb2J1Zik7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQW5jaWxsYXJ5IGZsYXNoIC8gbW9kIGZ1bmN0aW9ucyBtdWNoIGJsYWNrIG1hZ2ljIGx1cmtlcyBoZXJlICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKgorICogRmxhc2ggY29tbWFuZCBzd2l0Y2ggdGFibGUKKyAqLworCitpbnQgZmxhc2hjYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGFpcm9uZXRfaW9jdGwgKmNvbXApIHsKKwlpbnQgejsKKwlpbnQgY21kcmVzZXQoc3RydWN0IGFpcm9faW5mbyAqKTsKKwlpbnQgc2V0Zmxhc2htb2RlKHN0cnVjdCBhaXJvX2luZm8gKik7CisJaW50IGZsYXNoZ2NoYXIoc3RydWN0IGFpcm9faW5mbyAqLGludCxpbnQpOworCWludCBmbGFzaHBjaGFyKHN0cnVjdCBhaXJvX2luZm8gKixpbnQsaW50KTsKKwlpbnQgZmxhc2hwdXRidWYoc3RydWN0IGFpcm9faW5mbyAqKTsKKwlpbnQgZmxhc2hyZXN0YXJ0KHN0cnVjdCBhaXJvX2luZm8gKixzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKworCS8qIE9ubHkgc3VwZXItdXNlciBjYW4gbW9kaWZ5IGZsYXNoICovCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJc3dpdGNoKGNvbXAtPmNvbW1hbmQpCisJeworCWNhc2UgQUlST0ZMU0hSU1Q6CisJCXJldHVybiBjbWRyZXNldCgoc3RydWN0IGFpcm9faW5mbyAqKWRldi0+cHJpdik7CisKKwljYXNlIEFJUk9GTFNIU1RGTDoKKwkJaWYgKCEoKHN0cnVjdCBhaXJvX2luZm8gKilkZXYtPnByaXYpLT5mbGFzaCAmJgorCQkJKCgoc3RydWN0IGFpcm9faW5mbyAqKWRldi0+cHJpdiktPmZsYXNoID0ga21hbGxvYyAoRkxBU0hTSVpFLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gc2V0Zmxhc2htb2RlKChzdHJ1Y3QgYWlyb19pbmZvICopZGV2LT5wcml2KTsKKworCWNhc2UgQUlST0ZMU0hHQ0hSOiAvKiBHZXQgY2hhciBmcm9tIGF1eCAqLworCQlpZihjb21wLT5sZW4gIT0gc2l6ZW9mKGludCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ6LGNvbXAtPmRhdGEsY29tcC0+bGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gZmxhc2hnY2hhcigoc3RydWN0IGFpcm9faW5mbyAqKWRldi0+cHJpdix6LDgwMDApOworCisJY2FzZSBBSVJPRkxTSFBDSFI6IC8qIFNlbmQgY2hhciB0byBjYXJkLiAqLworCQlpZihjb21wLT5sZW4gIT0gc2l6ZW9mKGludCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ6LGNvbXAtPmRhdGEsY29tcC0+bGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gZmxhc2hwY2hhcigoc3RydWN0IGFpcm9faW5mbyAqKWRldi0+cHJpdix6LDgwMDApOworCisJY2FzZSBBSVJPRkxQVVRCVUY6IC8qIFNlbmQgMzJrIHRvIGNhcmQgKi8KKwkJaWYgKCEoKHN0cnVjdCBhaXJvX2luZm8gKilkZXYtPnByaXYpLT5mbGFzaCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlpZihjb21wLT5sZW4gPiBGTEFTSFNJWkUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYoY29weV9mcm9tX3VzZXIoKChzdHJ1Y3QgYWlyb19pbmZvICopZGV2LT5wcml2KS0+Zmxhc2gsY29tcC0+ZGF0YSxjb21wLT5sZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJZmxhc2hwdXRidWYoKHN0cnVjdCBhaXJvX2luZm8gKilkZXYtPnByaXYpOworCQlyZXR1cm4gMDsKKworCWNhc2UgQUlST1JFU1RBUlQ6CisJCWlmKGZsYXNocmVzdGFydCgoc3RydWN0IGFpcm9faW5mbyAqKWRldi0+cHJpdixkZXYpKQorCQkJcmV0dXJuIC1FSU87CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworI2RlZmluZSBGTEFTSF9DT01NQU5EICAweDdlN2UKKworLyoKKyAqIFNURVAgMSkKKyAqIERpc2FibGUgTUFDIGFuZCBkbyBzb2Z0IHJlc2V0IG9uCisgKiBjYXJkLgorICovCisKK2ludCBjbWRyZXNldChzdHJ1Y3QgYWlyb19pbmZvICphaSkgeworCWRpc2FibGVfTUFDKGFpLCAxKTsKKworCWlmKCF3YWl0YnVzeSAoYWkpKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiV2FpdGJ1c3kgaGFuZyBiZWZvcmUgUkVTRVRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCU9VVDQ1MDAoYWksQ09NTUFORCxDTURfU09GVFJFU0VUKTsKKworCXNzbGVlcCgxKTsJCQkvKiBXQVMgNjAwIDEyLzcvMDAgKi8KKworCWlmKCF3YWl0YnVzeSAoYWkpKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiV2FpdGJ1c3kgaGFuZyBBRlRFUiBSRVNFVFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXJldHVybiAwOworfQorCisvKiBTVEVQIDIpCisgKiBQdXQgdGhlIGNhcmQgaW4gbGVnZW5kYXJ5IGZsYXNoCisgKiBtb2RlCisgKi8KKworaW50IHNldGZsYXNobW9kZSAoc3RydWN0IGFpcm9faW5mbyAqYWkpIHsKKwlzZXRfYml0IChGTEFHX0ZMQVNISU5HLCAmYWktPmZsYWdzKTsKKworCU9VVDQ1MDAoYWksIFNXUzAsIEZMQVNIX0NPTU1BTkQpOworCU9VVDQ1MDAoYWksIFNXUzEsIEZMQVNIX0NPTU1BTkQpOworCWlmIChwcm9iZSkgeworCQlPVVQ0NTAwKGFpLCBTV1MwLCBGTEFTSF9DT01NQU5EKTsKKwkJT1VUNDUwMChhaSwgQ09NTUFORCwweDEwKTsKKwl9IGVsc2UgeworCQlPVVQ0NTAwKGFpLCBTV1MyLCBGTEFTSF9DT01NQU5EKTsKKwkJT1VUNDUwMChhaSwgU1dTMywgRkxBU0hfQ09NTUFORCk7CisJCU9VVDQ1MDAoYWksIENPTU1BTkQsMCk7CisJfQorCW1zbGVlcCg1MDApOwkJLyogNTAwbXMgZGVsYXkgKi8KKworCWlmKCF3YWl0YnVzeShhaSkpIHsKKwkJY2xlYXJfYml0IChGTEFHX0ZMQVNISU5HLCAmYWktPmZsYWdzKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiV2FpdGJ1c3kgaGFuZyBhZnRlciBzZXRmbGFzaCBtb2RlXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCisvKiBQdXQgY2hhcmFjdGVyIHRvIFNXUzAgd2FpdCBmb3IgZHdlbGx0aW1lCisgKiB4IDUwdXMgZm9yICBlY2hvIC4KKyAqLworCitpbnQgZmxhc2hwY2hhcihzdHJ1Y3QgYWlyb19pbmZvICphaSxpbnQgYnl0ZSxpbnQgZHdlbGx0aW1lKSB7CisJaW50IGVjaG87CisJaW50IHdhaXR0aW1lOworCisJYnl0ZSB8PSAweDgwMDA7CisKKwlpZihkd2VsbHRpbWUgPT0gMCApCisJCWR3ZWxsdGltZSA9IDIwMDsKKworCXdhaXR0aW1lPWR3ZWxsdGltZTsKKworCS8qIFdhaXQgZm9yIGJ1c3kgYml0IGQxNSB0byBnbyBmYWxzZSBpbmRpY2F0aW5nIGJ1ZmZlciBlbXB0eSAqLworCXdoaWxlICgoSU40NTAwIChhaSwgU1dTMCkgJiAweDgwMDApICYmIHdhaXR0aW1lID4gMCkgeworCQl1ZGVsYXkgKDUwKTsKKwkJd2FpdHRpbWUgLT0gNTA7CisJfQorCisJLyogdGltZW91dCBmb3IgYnVzeSBjbGVhciB3YWl0ICovCisJaWYod2FpdHRpbWUgPD0gMCApeworCQlwcmludGsoS0VSTl9JTkZPICJmbGFzaCBwdXRjaGFyIGJ1c3l3YWl0IHRpbWVvdXQhIFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogUG9ydCBpcyBjbGVhciBub3cgd3JpdGUgYnl0ZSBhbmQgd2FpdCBmb3IgaXQgdG8gZWNobyBiYWNrICovCisJZG8geworCQlPVVQ0NTAwKGFpLFNXUzAsYnl0ZSk7CisJCXVkZWxheSg1MCk7CisJCWR3ZWxsdGltZSAtPSA1MDsKKwkJZWNobyA9IElONDUwMChhaSxTV1MxKTsKKwl9IHdoaWxlIChkd2VsbHRpbWUgPj0gMCAmJiBlY2hvICE9IGJ5dGUpOworCisJT1VUNDUwMChhaSxTV1MxLDApOworCisJcmV0dXJuIChlY2hvID09IGJ5dGUpID8gMCA6IC1FSU87Cit9CisKKy8qCisgKiBHZXQgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgY2FyZCBtYXRjaGluZyBtYXRjaGJ5dGUKKyAqIFN0ZXAgMykKKyAqLworaW50IGZsYXNoZ2NoYXIoc3RydWN0IGFpcm9faW5mbyAqYWksaW50IG1hdGNoYnl0ZSxpbnQgZHdlbGx0aW1lKXsKKwlpbnQgICAgICAgICAgIHJjaGFyOworCXVuc2lnbmVkIGNoYXIgcmJ5dGU9MDsKKworCWRvIHsKKwkJcmNoYXIgPSBJTjQ1MDAoYWksU1dTMSk7CisKKwkJaWYoZHdlbGx0aW1lICYmICEoMHg4MDAwICYgcmNoYXIpKXsKKwkJCWR3ZWxsdGltZSAtPSAxMDsKKwkJCW1kZWxheSgxMCk7CisJCQljb250aW51ZTsKKwkJfQorCQlyYnl0ZSA9IDB4ZmYgJiByY2hhcjsKKworCQlpZiggKHJieXRlID09IG1hdGNoYnl0ZSkgJiYgKDB4ODAwMCAmIHJjaGFyKSApeworCQkJT1VUNDUwMChhaSxTV1MxLDApOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYoIHJieXRlID09IDB4ODEgfHwgcmJ5dGUgPT0gMHg4MiB8fCByYnl0ZSA9PSAweDgzIHx8IHJieXRlID09IDB4MWEgfHwgMHhmZmZmID09IHJjaGFyKQorCQkJYnJlYWs7CisJCU9VVDQ1MDAoYWksU1dTMSwwKTsKKworCX13aGlsZShkd2VsbHRpbWUgPiAwKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqIFRyYW5zZmVyIDMyayBvZiBmaXJtd2FyZSBkYXRhIGZyb20gdXNlciBidWZmZXIgdG8gb3VyIGJ1ZmZlciBhbmQKKyAqIHNlbmQgdG8gdGhlIGNhcmQKKyAqLworCitpbnQgZmxhc2hwdXRidWYoc3RydWN0IGFpcm9faW5mbyAqYWkpeworCWludCAgICAgICAgICAgIG53b3JkczsKKworCS8qIFdyaXRlIHN0dWZmICovCisJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCZhaS0+ZmxhZ3MpKQorCQltZW1jcHlfdG9pbyhhaS0+cGNpYXV4ICsgMHg4MDAwLCBhaS0+Zmxhc2gsIEZMQVNIU0laRSk7CisJZWxzZSB7CisJCU9VVDQ1MDAoYWksQVVYUEFHRSwweDEwMCk7CisJCU9VVDQ1MDAoYWksQVVYT0ZGLDApOworCisJCWZvcihud29yZHM9MDtud29yZHMgIT0gRkxBU0hTSVpFIC8gMjtud29yZHMrKyl7CisJCQlPVVQ0NTAwKGFpLEFVWERBVEEsYWktPmZsYXNoW253b3Jkc10gJiAweGZmZmYpOworCQl9CisJfQorCU9VVDQ1MDAoYWksU1dTMCwweDgwMDApOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgorICovCitpbnQgZmxhc2hyZXN0YXJ0KHN0cnVjdCBhaXJvX2luZm8gKmFpLHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpeworCWludCAgICBpLHN0YXR1czsKKworCXNzbGVlcCgxKTsJCQkvKiBBZGRlZCAxMi83LzAwICovCisJY2xlYXJfYml0IChGTEFHX0ZMQVNISU5HLCAmYWktPmZsYWdzKTsKKwlpZiAodGVzdF9iaXQoRkxBR19NUEksICZhaS0+ZmxhZ3MpKSB7CisJCXN0YXR1cyA9IG1waV9pbml0X2Rlc2NyaXB0b3JzKGFpKTsKKwkJaWYgKHN0YXR1cyAhPSBTVUNDRVNTKQorCQkJcmV0dXJuIHN0YXR1czsKKwl9CisJc3RhdHVzID0gc2V0dXBfY2FyZChhaSwgZGV2LT5kZXZfYWRkciwgMSk7CisKKwlpZiAoIXRlc3RfYml0KEZMQUdfTVBJLCZhaS0+ZmxhZ3MpKQorCQlmb3IoIGkgPSAwOyBpIDwgTUFYX0ZJRFM7IGkrKyApIHsKKwkJCWFpLT5maWRzW2ldID0gdHJhbnNtaXRfYWxsb2NhdGUKKwkJCQkoIGFpLCAyMzEyLCBpID49IE1BWF9GSURTIC8gMiApOworCQl9CisKKwlzc2xlZXAoMSk7CQkJLyogQWRkZWQgMTIvNy8wMCAqLworCXJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogQ0lTQ09fRVhUICovCisKKy8qCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAgICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBJbiBhZGRpdGlvbjoKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICAgIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgICAgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgICAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICAgIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAgIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICAgIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAgICBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAgICBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKK21vZHVsZV9pbml0KGFpcm9faW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoYWlyb19jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvX2NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmNTNhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm9fY3MuYwpAQCAtMCwwICsxLDYyMiBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBBaXJvbmV0IGRyaXZlciBmb3IgNDUwMCBhbmQgNDgwMCBzZXJpZXMgY2FyZHMKKworICAgIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciBib3RoIHRoZSBHUEwgdmVyc2lvbiAyIGFuZCBCU0QgbGljZW5zZXMuCisgICAgRWl0aGVyIGxpY2Vuc2UgbWF5IGJlIHVzZWQuICBUaGUgcmVzcGVjdGl2ZSBsaWNlbnNlcyBhcmUgZm91bmQgYXQKKyAgICB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KKworICAgIFRoaXMgY29kZSB3YXMgZGV2ZWxvcGVkIGJ5IEJlbmphbWluIFJlZWQgPGJyZWVkQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAgICBpbmNsdWRpbmcgcG9ydGlvbnMgb2Ygd2hpY2ggY29tZSBmcm9tIHRoZSBBaXJvbmV0IFBDNDUwMAorICAgIERldmVsb3BlcidzIFJlZmVyZW5jZSBNYW51YWwgYW5kIHVzZWQgd2l0aCBwZXJtaXNzaW9uLiAgQ29weXJpZ2h0CisgICAgKEMpIDE5OTkgQmVuamFtaW4gUmVlZC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICBQZXJtaXNzaW9uIHRvIHVzZQorICAgIGNvZGUgaW4gdGhlIERldmVsb3BlcidzIG1hbnVhbCB3YXMgZ3JhbnRlZCBmb3IgdGhpcyBkcml2ZXIgYnkKKyAgICBBaXJvbmV0LgorCisgICAgSW4gYWRkaXRpb24gdGhpcyBtb2R1bGUgd2FzIGRlcml2ZWQgZnJvbSBkdW1teV9jcy4KKyAgICBUaGUgaW5pdGlhbCBkZXZlbG9wZXIgb2YgZHVtbXlfY3MgaXMgRGF2aWQgQS4gSGluZHMKKyAgICA8ZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+LiAgUG9ydGlvbnMgY3JlYXRlZCBieSBEYXZpZCBBLiBIaW5kcworICAgIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgQS4gSGluZHMuICBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAKKyAgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaWZkZWYgX19JTl9QQ01DSUFfUEFDS0FHRV9fCisjaW5jbHVkZSA8cGNtY2lhL2tfY29tcGF0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKy8qCisgICBBbGwgdGhlIFBDTUNJQSBtb2R1bGVzIHVzZSBQQ01DSUFfREVCVUcgdG8gY29udHJvbCBkZWJ1Z2dpbmcuICBJZgorICAgeW91IGRvIG5vdCBkZWZpbmUgUENNQ0lBX0RFQlVHIGF0IGFsbCwgYWxsIHRoZSBkZWJ1ZyBjb2RlIHdpbGwgYmUKKyAgIGxlZnQgb3V0LiAgSWYgeW91IGNvbXBpbGUgd2l0aCBQQ01DSUFfREVCVUc9MCwgdGhlIGRlYnVnIGNvZGUgd2lsbAorICAgYmUgcHJlc2VudCBidXQgZGlzYWJsZWQgLS0gYnV0IGl0IGNhbiB0aGVuIGJlIGVuYWJsZWQgZm9yIHNwZWNpZmljCisgICBtb2R1bGVzIGF0IGxvYWQgdGltZSB3aXRoIGEgJ3BjX2RlYnVnPSMnIG9wdGlvbiB0byBpbnNtb2QuCisqLworI2lmZGVmIFBDTUNJQV9ERUJVRworc3RhdGljIGludCBwY19kZWJ1ZyA9IFBDTUNJQV9ERUJVRzsKK21vZHVsZV9wYXJhbShwY19kZWJ1ZywgaW50LCAwKTsKK3N0YXRpYyBjaGFyICp2ZXJzaW9uID0gIiRSZXZpc2lvbjogMS4yICQiOworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBpZiAocGNfZGVidWc+KG4pKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKTsKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK01PRFVMRV9BVVRIT1IoIkJlbmphbWluIFJlZWQiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VwcG9ydCBmb3IgQ2lzY28vQWlyb25ldCA4MDIuMTEgd2lyZWxlc3MgZXRoZXJuZXQgXAorICAgICAgICAgICAgICAgICAgIGNhcmRzLiAgVGhpcyBpcyB0aGUgbW9kdWxlIHRoYXQgbGlua3MgdGhlIFBDTUNJQSBjYXJkIFwKKwkJICAgd2l0aCB0aGUgYWlybyBtb2R1bGUuIik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiQWlyb25ldCA0NTAwLCA0ODAwIGFuZCBDaXNjbyAzNDAgUENNQ0lBIGNhcmRzIik7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICAgVGhlIGV2ZW50KCkgZnVuY3Rpb24gaXMgdGhpcyBkcml2ZXIncyBDYXJkIFNlcnZpY2VzIGV2ZW50IGhhbmRsZXIuCisgICBJdCB3aWxsIGJlIGNhbGxlZCBieSBDYXJkIFNlcnZpY2VzIHdoZW4gYW4gYXBwcm9wcmlhdGUgY2FyZCBzdGF0dXMKKyAgIGV2ZW50IGlzIHJlY2VpdmVkLiAgVGhlIGNvbmZpZygpIGFuZCByZWxlYXNlKCkgZW50cnkgcG9pbnRzIGFyZQorICAgdXNlZCB0byBjb25maWd1cmUgb3IgcmVsZWFzZSBhIHNvY2tldCwgaW4gcmVzcG9uc2UgdG8gY2FyZAorICAgaW5zZXJ0aW9uIGFuZCBlamVjdGlvbiBldmVudHMuICBUaGV5IGFyZSBpbnZva2VkIGZyb20gdGhlIGFpcm9fY3MKKyAgIGV2ZW50IGhhbmRsZXIuIAorKi8KKworc3RydWN0IG5ldF9kZXZpY2UgKmluaXRfYWlyb19jYXJkKCBpbnQsIGludCwgaW50LCBzdHJ1Y3QgZGV2aWNlICogKTsKK3ZvaWQgc3RvcF9haXJvX2NhcmQoIHN0cnVjdCBuZXRfZGV2aWNlICosIGludCApOworaW50IHJlc2V0X2Fpcm9fY2FyZCggc3RydWN0IG5ldF9kZXZpY2UgKiApOworCitzdGF0aWMgdm9pZCBhaXJvX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyB2b2lkIGFpcm9fcmVsZWFzZShkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyBpbnQgYWlyb19ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCSAgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpOworCisvKgorICAgVGhlIGF0dGFjaCgpIGFuZCBkZXRhY2goKSBlbnRyeSBwb2ludHMgYXJlIHVzZWQgdG8gY3JlYXRlIGFuZCBkZXN0cm95CisgICAiaW5zdGFuY2VzIiBvZiB0aGUgZHJpdmVyLCB3aGVyZSBlYWNoIGluc3RhbmNlIHJlcHJlc2VudHMgZXZlcnl0aGluZworICAgbmVlZGVkIHRvIG1hbmFnZSBvbmUgYWN0dWFsIFBDTUNJQSBjYXJkLgorKi8KKworc3RhdGljIGRldl9saW5rX3QgKmFpcm9fYXR0YWNoKHZvaWQpOworc3RhdGljIHZvaWQgYWlyb19kZXRhY2goZGV2X2xpbmtfdCAqKTsKKworLyoKKyAgIFlvdSdsbCBhbHNvIG5lZWQgdG8gcHJvdG90eXBlIGFsbCB0aGUgZnVuY3Rpb25zIHRoYXQgd2lsbCBhY3R1YWxseQorICAgYmUgdXNlZCB0byB0YWxrIHRvIHlvdXIgZGV2aWNlLiAgU2VlICdwY21lbV9jcycgZm9yIGEgZ29vZCBleGFtcGxlCisgICBvZiBhIGZ1bGx5IHNlbGYtc3VmZmljaWVudCBkcml2ZXI7IHRoZSBvdGhlciBkcml2ZXJzIHJlbHkgbW9yZSBvcgorICAgbGVzcyBvbiBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsLgorKi8KKworLyoKKyAgIFRoZSBkZXZfaW5mbyB2YXJpYWJsZSBpcyB0aGUgImtleSIgdGhhdCBpcyB1c2VkIHRvIG1hdGNoIHVwIHRoaXMKKyAgIGRldmljZSBkcml2ZXIgd2l0aCBhcHByb3ByaWF0ZSBjYXJkcywgdGhyb3VnaCB0aGUgY2FyZCBjb25maWd1cmF0aW9uCisgICBkYXRhYmFzZS4KKyovCisKK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvID0gImFpcm9fY3MiOworCisvKgorICAgQSBsaW5rZWQgbGlzdCBvZiAiaW5zdGFuY2VzIiBvZiB0aGUgIGFpcm9uZXQgZGV2aWNlLiAgRWFjaCBhY3R1YWwKKyAgIFBDTUNJQSBjYXJkIGNvcnJlc3BvbmRzIHRvIG9uZSBkZXZpY2UgaW5zdGFuY2UsIGFuZCBpcyBkZXNjcmliZWQKKyAgIGJ5IG9uZSBkZXZfbGlua190IHN0cnVjdHVyZSAoZGVmaW5lZCBpbiBkcy5oKS4KKworICAgWW91IG1heSBub3Qgd2FudCB0byB1c2UgYSBsaW5rZWQgbGlzdCBmb3IgdGhpcyAtLSBmb3IgZXhhbXBsZSwgdGhlCisgICBtZW1vcnkgY2FyZCBkcml2ZXIgdXNlcyBhbiBhcnJheSBvZiBkZXZfbGlua190IHBvaW50ZXJzLCB3aGVyZSBtaW5vcgorICAgZGV2aWNlIG51bWJlcnMgYXJlIHVzZWQgdG8gZGVyaXZlIHRoZSBjb3JyZXNwb25kaW5nIGFycmF5IGluZGV4LgorKi8KKworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0ID0gTlVMTDsKKworLyoKKyAgIEEgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgaGFzIGZpZWxkcyBmb3IgbW9zdCB0aGluZ3MgdGhhdCBhcmUgbmVlZGVkCisgICB0byBrZWVwIHRyYWNrIG9mIGEgc29ja2V0LCBidXQgdGhlcmUgd2lsbCB1c3VhbGx5IGJlIHNvbWUgZGV2aWNlCisgICBzcGVjaWZpYyBpbmZvcm1hdGlvbiB0aGF0IGFsc28gbmVlZHMgdG8gYmUga2VwdCB0cmFjayBvZi4gIFRoZQorICAgJ3ByaXYnIHBvaW50ZXIgaW4gYSBkZXZfbGlua190IHN0cnVjdHVyZSBjYW4gYmUgdXNlZCB0byBwb2ludCB0bworICAgYSBkZXZpY2Utc3BlY2lmaWMgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSwgbGlrZSB0aGlzLgorCisgICBBIGRyaXZlciBuZWVkcyB0byBwcm92aWRlIGEgZGV2X25vZGVfdCBzdHJ1Y3R1cmUgZm9yIGVhY2ggZGV2aWNlCisgICBvbiBhIGNhcmQuICBJbiBzb21lIGNhc2VzLCB0aGVyZSBpcyBvbmx5IG9uZSBkZXZpY2UgcGVyIGNhcmQgKGZvcgorICAgZXhhbXBsZSwgZXRoZXJuZXQgY2FyZHMsIG1vZGVtcykuICBJbiBvdGhlciBjYXNlcywgdGhlcmUgbWF5IGJlCisgICBtYW55IGFjdHVhbCBvciBsb2dpY2FsIGRldmljZXMgKFNDU0kgYWRhcHRlcnMsIG1lbW9yeSBjYXJkcyB3aXRoCisgICBtdWx0aXBsZSBwYXJ0aXRpb25zKS4gIFRoZSBkZXZfbm9kZV90IHN0cnVjdHVyZXMgbmVlZCB0byBiZSBrZXB0CisgICBpbiBhIGxpbmtlZCBsaXN0IHN0YXJ0aW5nIGF0IHRoZSAnZGV2JyBmaWVsZCBvZiBhIGRldl9saW5rX3QKKyAgIHN0cnVjdHVyZS4gIFdlIGFsbG9jYXRlIHRoZW0gaW4gdGhlIGNhcmQncyBwcml2YXRlIGRhdGEgc3RydWN0dXJlLAorICAgYmVjYXVzZSB0aGV5IGdlbmVyYWxseSBzaG91bGRuJ3QgYmUgYWxsb2NhdGVkIGR5bmFtaWNhbGx5LgorCisgICBJbiB0aGlzIGNhc2UsIHdlIGFsc28gcHJvdmlkZSBhIGZsYWcgdG8gaW5kaWNhdGUgaWYgYSBkZXZpY2UgaXMKKyAgICJzdG9wcGVkIiBkdWUgdG8gYSBwb3dlciBtYW5hZ2VtZW50IGV2ZW50LCBvciBjYXJkIGVqZWN0aW9uLiAgVGhlCisgICBkZXZpY2UgSU8gcm91dGluZXMgY2FuIHVzZSBhIGZsYWcgbGlrZSB0aGlzIHRvIHRocm90dGxlIElPIHRvIGEKKyAgIGNhcmQgdGhhdCBpcyBub3QgcmVhZHkgdG8gYWNjZXB0IGl0LgorKi8KKyAgIAordHlwZWRlZiBzdHJ1Y3QgbG9jYWxfaW5mb190IHsKKwlkZXZfbm9kZV90CW5vZGU7CisJc3RydWN0IG5ldF9kZXZpY2UgKmV0aF9kZXY7Cit9IGxvY2FsX2luZm9fdDsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBhaXJvX2F0dGFjaCgpIGNyZWF0ZXMgYW4gImluc3RhbmNlIiBvZiB0aGUgZHJpdmVyLCBhbGxvY2F0aW5nCisgIGxvY2FsIGRhdGEgc3RydWN0dXJlcyBmb3Igb25lIGRldmljZS4gIFRoZSBkZXZpY2UgaXMgcmVnaXN0ZXJlZAorICB3aXRoIENhcmQgU2VydmljZXMuCisgIAorICBUaGUgZGV2X2xpbmsgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkKKyAgY29uZmlndXJlIHRoZSBjYXJkIGF0IHRoaXMgcG9pbnQgLS0gd2Ugd2FpdCB1bnRpbCB3ZSByZWNlaXZlIGEKKyAgY2FyZCBpbnNlcnRpb24gZXZlbnQuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGRldl9saW5rX3QgKmFpcm9fYXR0YWNoKHZvaWQpCit7CisJY2xpZW50X3JlZ190IGNsaWVudF9yZWc7CisJZGV2X2xpbmtfdCAqbGluazsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCWludCByZXQ7CisJCisJREVCVUcoMCwgImFpcm9fYXR0YWNoKClcbiIpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgKi8KKwlsaW5rID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRldl9saW5rX3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxpbmspIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaXJvX2NzOiBubyBtZW1vcnkgZm9yIG5ldyBkZXZpY2VcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KGxpbmssIDAsIHNpemVvZihzdHJ1Y3QgZGV2X2xpbmtfdCkpOworCQorCS8qIEludGVycnVwdCBzZXR1cCAqLworCWxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFOworCWxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKKwlsaW5rLT5pcnEuSGFuZGxlciA9IE5VTEw7CisJCisJLyoKKwkgIEdlbmVyYWwgc29ja2V0IGNvbmZpZ3VyYXRpb24gZGVmYXVsdHMgY2FuIGdvIGhlcmUuICBJbiB0aGlzCisJICBjbGllbnQsIHdlIGFzc3VtZSB2ZXJ5IGxpdHRsZSwgYW5kIHJlbHkgb24gdGhlIENJUyBmb3IgYWxtb3N0CisJICBldmVyeXRoaW5nLiAgSW4gbW9zdCBjbGllbnRzLCBtYW55IGRldGFpbHMgKGkuZS4sIG51bWJlciwgc2l6ZXMsCisJICBhbmQgYXR0cmlidXRlcyBvZiBJTyB3aW5kb3dzKSBhcmUgZml4ZWQgYnkgdGhlIG5hdHVyZSBvZiB0aGUKKwkgIGRldmljZSwgYW5kIGNhbiBiZSBoYXJkLXdpcmVkIGhlcmUuCisJKi8KKwlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSAwOworCWxpbmstPmNvbmYuVmNjID0gNTA7CisJbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisJCisJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHByaXZhdGUgZGV2aWNlLXNwZWNpZmljIGRhdGEgKi8KKwlsb2NhbCA9IGttYWxsb2Moc2l6ZW9mKGxvY2FsX2luZm9fdCksIEdGUF9LRVJORUwpOworCWlmICghbG9jYWwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaXJvX2NzOiBubyBtZW1vcnkgZm9yIG5ldyBkZXZpY2VcbiIpOworCQlrZnJlZSAobGluayk7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQobG9jYWwsIDAsIHNpemVvZihsb2NhbF9pbmZvX3QpKTsKKwlsaW5rLT5wcml2ID0gbG9jYWw7CisJCisJLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisJbGluay0+bmV4dCA9IGRldl9saXN0OworCWRldl9saXN0ID0gbGluazsKKwljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworCWNsaWVudF9yZWcuRXZlbnRNYXNrID0KKwkJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorCQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAorCQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZhaXJvX2V2ZW50OworCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKKwljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworCXJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOworCWlmIChyZXQgIT0gMCkgeworCQljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworCQlhaXJvX2RldGFjaChsaW5rKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCQorCXJldHVybiBsaW5rOworfSAvKiBhaXJvX2F0dGFjaCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkCisgIHdpdGggQ2FyZCBTZXJ2aWNlcy4gIElmIGl0IGhhcyBiZWVuIHJlbGVhc2VkLCBhbGwgbG9jYWwgZGF0YQorICBzdHJ1Y3R1cmVzIGFyZSBmcmVlZC4gIE90aGVyd2lzZSwgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZSBmcmVlZAorICB3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgYWlyb19kZXRhY2goZGV2X2xpbmtfdCAqbGluaykKK3sKKwlkZXZfbGlua190ICoqbGlua3A7CisJCisJREVCVUcoMCwgImFpcm9fZGV0YWNoKDB4JXApXG4iLCBsaW5rKTsKKwkKKwkvKiBMb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworCWZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJCWlmICgqbGlua3AgPT0gbGluaykgYnJlYWs7CisJaWYgKCpsaW5rcCA9PSBOVUxMKQorCQlyZXR1cm47CisJCisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkJYWlyb19yZWxlYXNlKGxpbmspOworCQorCWlmICggKChsb2NhbF9pbmZvX3QqKWxpbmstPnByaXYpLT5ldGhfZGV2ICkgeworCQlzdG9wX2Fpcm9fY2FyZCggKChsb2NhbF9pbmZvX3QqKWxpbmstPnByaXYpLT5ldGhfZGV2LCAwICk7CisJfQorCSgobG9jYWxfaW5mb190KilsaW5rLT5wcml2KS0+ZXRoX2RldiA9IE5VTEw7ICAgCisJCisJLyogQnJlYWsgdGhlIGxpbmsgd2l0aCBDYXJkIFNlcnZpY2VzICovCisJaWYgKGxpbmstPmhhbmRsZSkKKwkJcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGxpbmstPmhhbmRsZSk7CisJCisJCisJCisJLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGZyZWUgcGllY2VzICovCisJKmxpbmtwID0gbGluay0+bmV4dDsKKwlpZiAobGluay0+cHJpdikgeworCQlrZnJlZShsaW5rLT5wcml2KTsKKwl9CisJa2ZyZWUobGluayk7CisJCit9IC8qIGFpcm9fZGV0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgYWlyb19jb25maWcoKSBpcyBzY2hlZHVsZWQgdG8gcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gZXZlbnQKKyAgaXMgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlCisgIGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKK2RvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIGFpcm9fY29uZmlnKGRldl9saW5rX3QgKmxpbmspCit7CisJY2xpZW50X2hhbmRsZV90IGhhbmRsZTsKKwl0dXBsZV90IHR1cGxlOworCWNpc3BhcnNlX3QgcGFyc2U7CisJbG9jYWxfaW5mb190ICpkZXY7CisJaW50IGxhc3RfZm4sIGxhc3RfcmV0OworCXVfY2hhciBidWZbNjRdOworCXdpbl9yZXFfdCByZXE7CisJbWVtcmVxX3QgbWFwOworCQorCWhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKwlkZXYgPSBsaW5rLT5wcml2OworCisJREVCVUcoMCwgImFpcm9fY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKKwkKKwkvKgorCSAgVGhpcyByZWFkcyB0aGUgY2FyZCdzIENPTkZJRyB0dXBsZSB0byBmaW5kIGl0cyBjb25maWd1cmF0aW9uCisJICByZWdpc3RlcnMuCisJKi8KKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworCXR1cGxlLkF0dHJpYnV0ZXMgPSAwOworCXR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKKwl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKKwl0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisJQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKwlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKwlsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CisJCisJLyogQ29uZmlndXJlIGNhcmQgKi8KKwlsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworCQorCS8qCisJICBJbiB0aGlzIGxvb3AsIHdlIHNjYW4gdGhlIENJUyBmb3IgY29uZmlndXJhdGlvbiB0YWJsZSBlbnRyaWVzLAorCSAgZWFjaCBvZiB3aGljaCBkZXNjcmliZXMgYSB2YWxpZCBjYXJkIGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZworCSAgdm9sdGFnZSwgSU8gd2luZG93LCBtZW1vcnkgd2luZG93LCBhbmQgaW50ZXJydXB0IHNldHRpbmdzLgorCSAgCisJICBXZSBtYWtlIG5vIGFzc3VtcHRpb25zIGFib3V0IHRoZSBjYXJkIHRvIGJlIGNvbmZpZ3VyZWQ6IHdlIHVzZQorCSAganVzdCB0aGUgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGluIHRoZSBDSVMuICBJbiBhbiBpZGVhbCB3b3JsZCwKKwkgIHRoaXMgd291bGQgd29yayBmb3IgYW55IFBDTUNJQSBjYXJkLCBidXQgaXQgcmVxdWlyZXMgYSBjb21wbGV0ZQorCSAgYW5kIGFjY3VyYXRlIENJUy4gIEluIHByYWN0aWNlLCBhIGRyaXZlciB1c3VhbGx5ICJrbm93cyIgbW9zdCBvZgorCSAgdGhlc2UgdGhpbmdzIHdpdGhvdXQgY29uc3VsdGluZyB0aGUgQ0lTLCBhbmQgbW9zdCBjbGllbnQgZHJpdmVycworCSAgd2lsbCBvbmx5IHVzZSB0aGUgQ0lTIHRvIGZpbGwgaW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZCBkZXRhaWxzLgorCSovCisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CisJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworCXdoaWxlICgxKSB7CisJCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgZGZsdCA9IHsgMCB9OworCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcgPSAmKHBhcnNlLmNmdGFibGVfZW50cnkpOworCQlpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSAhPSAwIHx8CisJCQkJcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpICE9IDApCisJCQlnb3RvIG5leHRfZW50cnk7CisJCQorCQlpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0RFRkFVTFQpIGRmbHQgPSAqY2ZnOworCQlpZiAoY2ZnLT5pbmRleCA9PSAwKSBnb3RvIG5leHRfZW50cnk7CisJCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZmctPmluZGV4OworCQkKKwkJLyogRG9lcyB0aGlzIGNhcmQgbmVlZCBhdWRpbyBvdXRwdXQ/ICovCisJCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfQVVESU8pIHsKKwkJCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9TUEtSOworCQkJbGluay0+Y29uZi5TdGF0dXMgPSBDQ1NSX0FVRElPX0VOQTsKKwkJfQorCQkKKwkJLyogVXNlIHBvd2VyIHNldHRpbmdzIGZvciBWY2MgYW5kIFZwcCBpZiBwcmVzZW50ICovCisJCS8qICBOb3RlIHRoYXQgdGhlIENJUyB2YWx1ZXMgbmVlZCB0byBiZSByZXNjYWxlZCAqLworCQlpZiAoY2ZnLT52Y2MucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpCisJCQlsaW5rLT5jb25mLlZjYyA9IGNmZy0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMDsKKwkJZWxzZSBpZiAoZGZsdC52Y2MucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpCisJCQlsaW5rLT5jb25mLlZjYyA9IGRmbHQudmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMDsKKwkJCisJCWlmIChjZmctPnZwcDEucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpCisJCQlsaW5rLT5jb25mLlZwcDEgPSBsaW5rLT5jb25mLlZwcDIgPQorCQkJCWNmZy0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDA7CisJCWVsc2UgaWYgKGRmbHQudnBwMS5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJCWxpbmstPmNvbmYuVnBwMSA9IGxpbmstPmNvbmYuVnBwMiA9CisJCQkJZGZsdC52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMDsKKwkJCisJCS8qIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gaW50ZXJydXB0PyAqLworCQlpZiAoY2ZnLT5pcnEuSVJRSW5mbzEgfHwgZGZsdC5pcnEuSVJRSW5mbzEpCisJCQlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROworCQkKKwkJLyogSU8gd2luZG93IHNldHRpbmdzICovCisJCWxpbmstPmlvLk51bVBvcnRzMSA9IGxpbmstPmlvLk51bVBvcnRzMiA9IDA7CisJCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQuaW8ubndpbiA+IDApKSB7CisJCQljaXN0cGxfaW9fdCAqaW8gPSAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJmRmbHQuaW87CisJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQorCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OworCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKKwkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OworCQkJbGluay0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOworCQkJbGluay0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47CisJCQlpZiAoaW8tPm53aW4gPiAxKSB7CisJCQkJbGluay0+aW8uQXR0cmlidXRlczIgPSBsaW5rLT5pby5BdHRyaWJ1dGVzMTsKKwkJCQlsaW5rLT5pby5CYXNlUG9ydDIgPSBpby0+d2luWzFdLmJhc2U7CisJCQkJbGluay0+aW8uTnVtUG9ydHMyID0gaW8tPndpblsxXS5sZW47CisJCQl9CisJCX0KKwkJCisJCS8qIFRoaXMgcmVzZXJ2ZXMgSU8gc3BhY2UgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgZW5hYmxlIGl0ICovCisJCWlmIChwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbykgIT0gMCkKKwkJCWdvdG8gbmV4dF9lbnRyeTsKKwkJCisJCS8qCisJCSAgTm93IHNldCB1cCBhIGNvbW1vbiBtZW1vcnkgd2luZG93LCBpZiBuZWVkZWQuICBUaGVyZSBpcyByb29tCisJCSAgaW4gdGhlIGRldl9saW5rX3Qgc3RydWN0dXJlIGZvciBvbmUgbWVtb3J5IHdpbmRvdyBoYW5kbGUsCisJCSAgYnV0IGlmIHRoZSBiYXNlIGFkZHJlc3NlcyBuZWVkIHRvIGJlIHNhdmVkLCBvciBpZiBtdWx0aXBsZQorCQkgIHdpbmRvd3MgYXJlIG5lZWRlZCwgdGhlIGluZm8gc2hvdWxkIGdvIGluIHRoZSBwcml2YXRlIGRhdGEKKwkJICBzdHJ1Y3R1cmUgZm9yIHRoaXMgZGV2aWNlLgorCQkgIAorCQkgIE5vdGUgdGhhdCB0aGUgbWVtb3J5IHdpbmRvdyBiYXNlIGlzIGEgcGh5c2ljYWwgYWRkcmVzcywgYW5kCisJCSAgbmVlZHMgdG8gYmUgbWFwcGVkIHRvIHZpcnR1YWwgc3BhY2Ugd2l0aCBpb3JlbWFwKCkgYmVmb3JlIGl0CisJCSAgaXMgdXNlZC4KKwkJKi8KKwkJaWYgKChjZmctPm1lbS5ud2luID4gMCkgfHwgKGRmbHQubWVtLm53aW4gPiAwKSkgeworCQkJY2lzdHBsX21lbV90ICptZW0gPQorCQkJCShjZmctPm1lbS5ud2luKSA/ICZjZmctPm1lbSA6ICZkZmx0Lm1lbTsKKwkJCXJlcS5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfMTZ8V0lOX01FTU9SWV9UWVBFX0NNOworCQkJcmVxLkJhc2UgPSBtZW0tPndpblswXS5ob3N0X2FkZHI7CisJCQlyZXEuU2l6ZSA9IG1lbS0+d2luWzBdLmxlbjsKKwkJCXJlcS5BY2Nlc3NTcGVlZCA9IDA7CisJCQlpZiAocGNtY2lhX3JlcXVlc3Rfd2luZG93KCZsaW5rLT5oYW5kbGUsICZyZXEsICZsaW5rLT53aW4pICE9IDApCisJCQkJZ290byBuZXh0X2VudHJ5OworCQkJbWFwLlBhZ2UgPSAwOyBtYXAuQ2FyZE9mZnNldCA9IG1lbS0+d2luWzBdLmNhcmRfYWRkcjsKKwkJCWlmIChwY21jaWFfbWFwX21lbV9wYWdlKGxpbmstPndpbiwgJm1hcCkgIT0gMCkKKwkJCQlnb3RvIG5leHRfZW50cnk7CisJCX0KKwkJLyogSWYgd2UgZ290IHRoaXMgZmFyLCB3ZSdyZSBjb29sISAqLworCQlicmVhazsKKwkJCisJbmV4dF9lbnRyeToKKwkJQ1NfQ0hFQ0soR2V0TmV4dFR1cGxlLCBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwl9CisJCisgICAgLyoKKyAgICAgIEFsbG9jYXRlIGFuIGludGVycnVwdCBsaW5lLiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgYXNzaWduIGEKKyAgICAgIGhhbmRsZXIgdG8gdGhlIGludGVycnVwdCwgdW5sZXNzIHRoZSAnSGFuZGxlcicgbWVtYmVyIG9mIHRoZQorICAgICAgaXJxIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZC4KKyAgICAqLworCWlmIChsaW5rLT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpCisJCUNTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpKTsKKwkKKwkvKgorCSAgVGhpcyBhY3R1YWxseSBjb25maWd1cmVzIHRoZSBQQ01DSUEgc29ja2V0IC0tIHNldHRpbmcgdXAKKwkgIHRoZSBJL08gd2luZG93cyBhbmQgdGhlIGludGVycnVwdCBtYXBwaW5nLCBhbmQgcHV0dGluZyB0aGUKKwkgIGNhcmQgYW5kIGhvc3QgaW50ZXJmYWNlIGludG8gIk1lbW9yeSBhbmQgSU8iIG1vZGUuCisJKi8KKwlDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKSk7CisJKChsb2NhbF9pbmZvX3QqKWxpbmstPnByaXYpLT5ldGhfZGV2ID0gCisJCWluaXRfYWlyb19jYXJkKCBsaW5rLT5pcnEuQXNzaWduZWRJUlEsCisJCQkJbGluay0+aW8uQmFzZVBvcnQxLCAxLCAmaGFuZGxlX3RvX2RldihoYW5kbGUpICk7CisJaWYgKCEoKGxvY2FsX2luZm9fdCopbGluay0+cHJpdiktPmV0aF9kZXYpIGdvdG8gY3NfZmFpbGVkOworCQorCS8qCisJICBBdCB0aGlzIHBvaW50LCB0aGUgZGV2X25vZGVfdCBzdHJ1Y3R1cmUocykgbmVlZCB0byBiZQorCSAgaW5pdGlhbGl6ZWQgYW5kIGFycmFuZ2VkIGluIGEgbGlua2VkIGxpc3QgYXQgbGluay0+ZGV2LgorCSovCisJc3RyY3B5KGRldi0+bm9kZS5kZXZfbmFtZSwgKChsb2NhbF9pbmZvX3QqKWxpbmstPnByaXYpLT5ldGhfZGV2LT5uYW1lICk7CisJZGV2LT5ub2RlLm1ham9yID0gZGV2LT5ub2RlLm1pbm9yID0gMDsKKwlsaW5rLT5kZXYgPSAmZGV2LT5ub2RlOworCQorCS8qIEZpbmFsbHksIHJlcG9ydCB3aGF0IHdlJ3ZlIGRvbmUgKi8KKwlwcmludGsoS0VSTl9JTkZPICIlczogaW5kZXggMHglMDJ4OiBWY2MgJWQuJWQiLAorCSAgICAgICBkZXYtPm5vZGUuZGV2X25hbWUsIGxpbmstPmNvbmYuQ29uZmlnSW5kZXgsCisJICAgICAgIGxpbmstPmNvbmYuVmNjLzEwLCBsaW5rLT5jb25mLlZjYyUxMCk7CisJaWYgKGxpbmstPmNvbmYuVnBwMSkKKwkJcHJpbnRrKCIsIFZwcCAlZC4lZCIsIGxpbmstPmNvbmYuVnBwMS8xMCwgbGluay0+Y29uZi5WcHAxJTEwKTsKKwlpZiAobGluay0+Y29uZi5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfSVJRKQorCQlwcmludGsoIiwgaXJxICVkIiwgbGluay0+aXJxLkFzc2lnbmVkSVJRKTsKKwlpZiAobGluay0+aW8uTnVtUG9ydHMxKQorCQlwcmludGsoIiwgaW8gMHglMDR4LTB4JTA0eCIsIGxpbmstPmlvLkJhc2VQb3J0MSwKKwkJICAgICAgIGxpbmstPmlvLkJhc2VQb3J0MStsaW5rLT5pby5OdW1Qb3J0czEtMSk7CisJaWYgKGxpbmstPmlvLk51bVBvcnRzMikKKwkJcHJpbnRrKCIgJiAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQyLAorCQkgICAgICAgbGluay0+aW8uQmFzZVBvcnQyK2xpbmstPmlvLk51bVBvcnRzMi0xKTsKKwlpZiAobGluay0+d2luKQorCQlwcmludGsoIiwgbWVtIDB4JTA2bHgtMHglMDZseCIsIHJlcS5CYXNlLAorCQkgICAgICAgcmVxLkJhc2UrcmVxLlNpemUtMSk7CisJcHJpbnRrKCJcbiIpOworCQorCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisJcmV0dXJuOworCQorIGNzX2ZhaWxlZDoKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKKwlhaXJvX3JlbGVhc2UobGluayk7CisJCit9IC8qIGFpcm9fY29uZmlnICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIGFpcm9fcmVsZWFzZSgpIHdpbGwgdW5yZWdpc3RlciB0aGUKKyAgZGV2aWNlLCBhbmQgcmVsZWFzZSB0aGUgUENNQ0lBIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgZGV2aWNlIGlzCisgIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGFpcm9fcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworCURFQlVHKDAsICJhaXJvX3JlbGVhc2UoMHglcClcbiIsIGxpbmspOworCQorCS8qIFVubGluayB0aGUgZGV2aWNlIGNoYWluICovCisJbGluay0+ZGV2ID0gTlVMTDsKKwkKKwkvKgorCSAgSW4gYSBub3JtYWwgZHJpdmVyLCBhZGRpdGlvbmFsIGNvZGUgbWF5IGJlIG5lZWRlZCB0byByZWxlYXNlCisJICBvdGhlciBrZXJuZWwgZGF0YSBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRldmljZS4gCisJKi8KKwkKKwkvKiBEb24ndCBib3RoZXIgY2hlY2tpbmcgdG8gc2VlIGlmIHRoZXNlIHN1Y2NlZWQgb3Igbm90ICovCisJaWYgKGxpbmstPndpbikKKwkJcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxpbmstPndpbik7CisJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCWlmIChsaW5rLT5pby5OdW1Qb3J0czEpCisJCXBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwlpZiAobGluay0+aXJxLkFzc2lnbmVkSVJRKQorCQlwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gIE1vc3RseSwgdGhpcyBzY2hlZHVsZXMgb3RoZXIKKyAgc3R1ZmYgdG8gcnVuIGFmdGVyIGFuIGV2ZW50IGlzIHJlY2VpdmVkLgorCisgIFdoZW4gYSBDQVJEX1JFTU9WQUwgZXZlbnQgaXMgcmVjZWl2ZWQsIHdlIGltbWVkaWF0ZWx5IHNldCBhCisgIHByaXZhdGUgZmxhZyB0byBibG9jayBmdXR1cmUgYWNjZXNzZXMgdG8gdGhpcyBkZXZpY2UuICBBbGwgdGhlCisgIGZ1bmN0aW9ucyB0aGF0IGFjdHVhbGx5IGFjY2VzcyB0aGUgZGV2aWNlIHNob3VsZCBjaGVjayB0aGlzIGZsYWcKKyAgdG8gbWFrZSBzdXJlIHRoZSBjYXJkIGlzIHN0aWxsIHByZXNlbnQuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBhaXJvX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworCWRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gbGluay0+cHJpdjsKKwkKKwlERUJVRygxLCAiYWlyb19ldmVudCgweCUwNngpXG4iLCBldmVudCk7CisJCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgorCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1BSRVNFTlQ7CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCW5ldGlmX2RldmljZV9kZXRhY2gobG9jYWwtPmV0aF9kZXYpOworCQkJYWlyb19yZWxlYXNlKGxpbmspOworCQl9CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisJCWxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOworCQlhaXJvX2NvbmZpZyhsaW5rKTsKKwkJYnJlYWs7CisJY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgorCQlsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKwkJLyogRmFsbCB0aHJvdWdoLi4uICovCisJY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJbmV0aWZfZGV2aWNlX2RldGFjaChsb2NhbC0+ZXRoX2Rldik7CisJCQlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisJCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkJLyogRmFsbCB0aHJvdWdoLi4uICovCisJY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQlwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworCQkJcmVzZXRfYWlyb19jYXJkKGxvY2FsLT5ldGhfZGV2KTsKKwkJCW5ldGlmX2RldmljZV9hdHRhY2gobG9jYWwtPmV0aF9kZXYpOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30gLyogYWlyb19ldmVudCAqLworCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgYWlyb19kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICJhaXJvX2NzIiwKKwl9LAorCS5hdHRhY2gJCT0gYWlyb19hdHRhY2gsCisJLmRldGFjaAkJPSBhaXJvX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgYWlyb19jc19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJmFpcm9fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgYWlyb19jc19jbGVhbnVwKHZvaWQpCit7CisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZhaXJvX2RyaXZlcik7CisJQlVHX09OKGRldl9saXN0ICE9IE5VTEwpOworfQorCisvKgorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgICAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgSW4gYWRkaXRpb246CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAgICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICAgIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICAgIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAgICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAgICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgICBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAgICBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgICAgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgICAgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuICAgIAorKi8KKworbW9kdWxlX2luaXQoYWlyb19jc19pbml0KTsKK21vZHVsZV9leGl0KGFpcm9fY3NfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJwb3J0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFkYzJhMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpcnBvcnQuYwpAQCAtMCwwICsxLDMwNCBAQAorLyogYWlycG9ydC5jCisgKgorICogQSBkcml2ZXIgZm9yICJIZXJtZXMiIGNoaXBzZXQgYmFzZWQgQXBwbGUgQWlycG9ydCB3aXJlbGVzcworICogY2FyZC4KKyAqCisgKiBDb3B5cmlnaHQgbm90aWNlICYgcmVsZWFzZSBub3RlcyBpbiBmaWxlIG9yaW5vY28uYworICogCisgKiBOb3RlIHNwZWNpZmljIHRvIGFpcnBvcnQgc3R1YjoKKyAqIAorICogIDAuMDUgOiBmaXJzdCB2ZXJzaW9uIG9mIHRoZSBuZXcgc3BsaXQgZHJpdmVyCisgKiAgMC4wNiA6IGZpeCBwb3NzaWJsZSBoYW5nIG9uIHBvd2VydXAsIGFkZCBzbGVlcCBzdXBwb3J0CisgKi8KKworI2RlZmluZSBEUklWRVJfTkFNRSAiYWlycG9ydCIKKyNkZWZpbmUgUEZYIERSSVZFUl9OQU1FICI6ICIKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vY3VycmVudC5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vcG1hY19mZWF0dXJlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJvcmlub2NvLmgiCisKKyNkZWZpbmUgQUlSUE9SVF9JT19MRU4JKDB4MTAwMCkJLyogb25lIHBhZ2UgKi8KKworc3RydWN0IGFpcnBvcnQgeworCXN0cnVjdCBtYWNpb19kZXYgKm1kZXY7CisJdm9pZCBfX2lvbWVtICp2YWRkcjsKKwlpbnQgaXJxX3JlcXVlc3RlZDsKKwlpbnQgbmRldl9yZWdpc3RlcmVkOworfTsKKworc3RhdGljIGludAorYWlycG9ydF9zdXNwZW5kKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIHUzMiBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZtZGV2LT5vZmRldi5kZXYpOworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVycjsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogQWlycG9ydCBlbnRlcmluZyBzbGVlcCBtb2RlXG4iLCBkZXYtPm5hbWUpOworCisJZXJyID0gb3Jpbm9jb19sb2NrKHByaXYsICZmbGFncyk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBod191bmF2YWlsYWJsZSBvbiBQQk9PS19TTEVFUF9OT1dcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwllcnIgPSBfX29yaW5vY29fZG93bihkZXYpOworCWlmIChlcnIpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQQk9PS19TTEVFUF9OT1c6IEVycm9yICVkIGRvd25pbmcgaW50ZXJmYWNlXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCisJcHJpdi0+aHdfdW5hdmFpbGFibGUrKzsKKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfQUlSUE9SVF9FTkFCTEUsIG1hY2lvX2dldF9vZl9ub2RlKG1kZXYpLCAwLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CithaXJwb3J0X3Jlc3VtZShzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoJm1kZXYtPm9mZGV2LmRldik7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBBaXJwb3J0IHdha2luZyB1cFxuIiwgZGV2LT5uYW1lKTsKKworCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX0FJUlBPUlRfRU5BQkxFLCBtYWNpb19nZXRfb2Zfbm9kZShtZGV2KSwgMCwgMSk7CisJbXNsZWVwKDIwMCk7CisKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKKworCWVyciA9IG9yaW5vY29fcmVpbml0X2Zpcm13YXJlKGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCByZS1pbml0aWFsaXppbmcgZmlybXdhcmUgb24gUEJPT0tfV0FLRVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKworCXByaXYtPmh3X3VuYXZhaWxhYmxlLS07CisKKwlpZiAocHJpdi0+b3BlbiAmJiAoISBwcml2LT5od191bmF2YWlsYWJsZSkpIHsKKwkJZXJyID0gX19vcmlub2NvX3VwKGRldik7CisJCWlmIChlcnIpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCByZXN0YXJ0aW5nIGNhcmQgb24gUEJPT0tfV0FLRVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJfQorCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYWlycG9ydF9kZXRhY2goc3RydWN0IG1hY2lvX2RldiAqbWRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZtZGV2LT5vZmRldi5kZXYpOworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhaXJwb3J0ICpjYXJkID0gcHJpdi0+Y2FyZDsKKworCWlmIChjYXJkLT5uZGV2X3JlZ2lzdGVyZWQpCisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJY2FyZC0+bmRldl9yZWdpc3RlcmVkID0gMDsKKworCWlmIChjYXJkLT5pcnFfcmVxdWVzdGVkKQorCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwljYXJkLT5pcnFfcmVxdWVzdGVkID0gMDsKKworCWlmIChjYXJkLT52YWRkcikKKwkJaW91bm1hcChjYXJkLT52YWRkcik7CisJY2FyZC0+dmFkZHIgPSBOVUxMOworCisJbWFjaW9fcmVsZWFzZV9yZXNvdXJjZShtZGV2LCAwKTsKKworCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX0FJUlBPUlRfRU5BQkxFLCBtYWNpb19nZXRfb2Zfbm9kZShtZGV2KSwgMCwgMCk7CisJc3NsZWVwKDEpOworCisJbWFjaW9fc2V0X2RydmRhdGEobWRldiwgTlVMTCk7CisJZnJlZV9vcmlub2NvZGV2KGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaXJwb3J0X2hhcmRfcmVzZXQoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdikKK3sKKwkvKiBJdCB3b3VsZCBiZSBuaWNlIHRvIHBvd2VyIGN5Y2xlIHRoZSBBaXJwb3J0IGZvciBhIHJlYWwgaGFyZAorCSAqIHJlc2V0LCBidXQgZm9yIHNvbWUgcmVhc29uIGFsdGhvdWdoIGl0IGFwcGVhcnMgdG8KKwkgKiByZS1pbml0aWFsaXplIHByb3Blcmx5LCBpdCBmYWxscyBpbiBhIHNjcmVhbWluZyBoZWFwCisJICogc2hvcnRseSBhZnRlcndhcmRzLiAqLworI2lmIDAKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+bmRldjsKKwlzdHJ1Y3QgYWlycG9ydCAqY2FyZCA9IHByaXYtPmNhcmQ7CisKKwkvKiBWaXRhbGx5IGltcG9ydGFudC4gIElmIHdlIGRvbid0IGRvIHRoaXMgaXQgc2VlbXMgd2UgZ2V0IGFuCisJICogaW50ZXJydXB0IHNvbWV3aGVyZSBkdXJpbmcgdGhlIHBvd2VyIGN5Y2xlLCBzaW5jZQorCSAqIGh3X3VuYXZhaWxhYmxlIGlzIGFscmVhZHkgc2V0IGl0IGRvZXNuJ3QgZ2V0IEFDS2VkLCB3ZSBnZXQKKwkgKiBpbnRvIGFuIGludGVycnVwdCBsb29wIGFuZCB0aGUgdGhlIFBNVSBkZWNpZGVzIHRvIHR1cm4gdXMKKwkgKiBvZmYuICovCisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCisJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfQUlSUE9SVF9FTkFCTEUsIG1hY2lvX2dldF9vZl9ub2RlKGNhcmQtPm1kZXYpLCAwLCAwKTsKKwlzc2xlZXAoMSk7CisJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfQUlSUE9SVF9FTkFCTEUsIG1hY2lvX2dldF9vZl9ub2RlKGNhcmQtPm1kZXYpLCAwLCAxKTsKKwlzc2xlZXAoMSk7CisKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKKwlzc2xlZXAoMSk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CithaXJwb3J0X2F0dGFjaChzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYWlycG9ydCAqY2FyZDsKKwl1bnNpZ25lZCBsb25nIHBoeXNfYWRkcjsKKwloZXJtZXNfdCAqaHc7CisKKwlpZiAobWFjaW9fcmVzb3VyY2VfY291bnQobWRldikgPCAxIHx8IG1hY2lvX2lycV9jb3VudChtZGV2KSA8IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiV3JvbmcgaW50ZXJydXB0L2FkZHJlc3NlcyBpbiBPRiB0cmVlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHByaXZhdGUgZGV2aWNlLXNwZWNpZmljIGRhdGEgKi8KKwlkZXYgPSBhbGxvY19vcmlub2NvZGV2KHNpemVvZigqY2FyZCksIGFpcnBvcnRfaGFyZF9yZXNldCk7CisJaWYgKCEgZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBhbGxvY2F0ZSBuZXR3b3JrIGRldmljZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljYXJkID0gcHJpdi0+Y2FyZDsKKworCWh3ID0gJnByaXYtPmh3OworCWNhcmQtPm1kZXYgPSBtZGV2OworCisJaWYgKG1hY2lvX3JlcXVlc3RfcmVzb3VyY2UobWRldiwgMCwgImFpcnBvcnQiKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW4ndCByZXF1ZXN0IElPIHJlc291cmNlICFcbiIpOworCQlmcmVlX29yaW5vY29kZXYoZGV2KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmbWRldi0+b2ZkZXYuZGV2KTsKKworCW1hY2lvX3NldF9kcnZkYXRhKG1kZXYsIGRldik7CisKKwkvKiBTZXR1cCBpbnRlcnJ1cHRzICYgYmFzZSBhZGRyZXNzICovCisJZGV2LT5pcnEgPSBtYWNpb19pcnEobWRldiwgMCk7CisJcGh5c19hZGRyID0gbWFjaW9fcmVzb3VyY2Vfc3RhcnQobWRldiwgMCk7ICAvKiBQaHlzaWNhbCBhZGRyZXNzICovCisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJQaHlzaWNhbCBhZGRyZXNzICVseFxuIiwgcGh5c19hZGRyKTsKKwlkZXYtPmJhc2VfYWRkciA9IHBoeXNfYWRkcjsKKwljYXJkLT52YWRkciA9IGlvcmVtYXAocGh5c19hZGRyLCBBSVJQT1JUX0lPX0xFTik7CisJaWYgKCFjYXJkLT52YWRkcikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJpb3JlbWFwKCkgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJaGVybWVzX3N0cnVjdF9pbml0KGh3LCBjYXJkLT52YWRkciwgSEVSTUVTXzE2QklUX1JFR1NQQUNJTkcpOworCQkKKwkvKiBQb3dlciB1cCBjYXJkICovCisJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfQUlSUE9SVF9FTkFCTEUsIG1hY2lvX2dldF9vZl9ub2RlKG1kZXYpLCAwLCAxKTsKKwlzc2xlZXAoMSk7CisKKwkvKiBSZXNldCBpdCBiZWZvcmUgd2UgZ2V0IHRoZSBpbnRlcnJ1cHQgKi8KKwloZXJtZXNfaW5pdChodyk7CisKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIG9yaW5vY29faW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ291bGRuJ3QgZ2V0IElSUSAlZFxuIiwgZGV2LT5pcnEpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJY2FyZC0+aXJxX3JlcXVlc3RlZCA9IDE7CisKKwkvKiBUZWxsIHRoZSBzdGFjayB3ZSBleGlzdCAqLworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbGVkOworCX0KKwlwcmludGsoS0VSTl9ERUJVRyBQRlggIkNhcmQgcmVnaXN0ZXJlZCBmb3IgaW50ZXJmYWNlICVzXG4iLCBkZXYtPm5hbWUpOworCWNhcmQtPm5kZXZfcmVnaXN0ZXJlZCA9IDE7CisJcmV0dXJuIDA7CisgZmFpbGVkOgorCWFpcnBvcnRfZGV0YWNoKG1kZXYpOworCXJldHVybiAtRU5PREVWOworfQkJCQkvKiBhaXJwb3J0X2F0dGFjaCAqLworCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0gRFJJVkVSX05BTUUgIiAiIERSSVZFUl9WRVJTSU9OCisJIiAoQmVuamFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPikiOworTU9EVUxFX0FVVEhPUigiQmVuamFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIHRoZSBBcHBsZSBBaXJwb3J0IHdpcmVsZXNzIGNhcmQuIik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBNUEwvR1BMIik7CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfbWF0Y2ggYWlycG9ydF9tYXRjaFtdID0gCit7CisJeworCS5uYW1lIAkJPSAicmFkaW8iLAorCS50eXBlCQk9IE9GX0FOWV9NQVRDSCwKKwkuY29tcGF0aWJsZQk9IE9GX0FOWV9NQVRDSAorCX0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IG1hY2lvX2RyaXZlciBhaXJwb3J0X2RyaXZlciA9IAoreworCS5uYW1lIAkJPSBEUklWRVJfTkFNRSwKKwkubWF0Y2hfdGFibGUJPSBhaXJwb3J0X21hdGNoLAorCS5wcm9iZQkJPSBhaXJwb3J0X2F0dGFjaCwKKwkucmVtb3ZlCQk9IGFpcnBvcnRfZGV0YWNoLAorCS5zdXNwZW5kCT0gYWlycG9ydF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYWlycG9ydF9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdAoraW5pdF9haXJwb3J0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCB2ZXJzaW9uKTsKKworCXJldHVybiBtYWNpb19yZWdpc3Rlcl9kcml2ZXIoJmFpcnBvcnRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitleGl0X2FpcnBvcnQodm9pZCkKK3sKKwlyZXR1cm4gbWFjaW9fdW5yZWdpc3Rlcl9kcml2ZXIoJmFpcnBvcnRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9haXJwb3J0KTsKK21vZHVsZV9leGl0KGV4aXRfYWlycG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hcmxhbi1tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hcmxhbi1tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYzMDRjNmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hcmxhbi1tYWluLmMKQEAgLTAsMCArMSwxODk2IEBACisvKgorICogIENvcHlyaWdodCAoQykgMTk5NyBDdWxsZW4gSmVubmluZ3MKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTggRWxtZXIgSm9hbmRpdSwgZWxtZXJAeWxlbnVybWUuZWUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzCisgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgQXJsYW4gNjU1IGNhcmQgbWFkZSBieSBBaXJvbmV0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgImFybGFuLmgiCisKKyNpZiBCSVRTX1BFUl9MT05HICE9IDMyCisjICBlcnJvciBGSVhNRTogdGhpcyBkcml2ZXIgcmVxdWlyZXMgYSAzMi1iaXQgcGxhdGZvcm0KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciAqYXJsYW5fdmVyc2lvbiA9ICJDLkplbm5pZ3MgOTcgJiBFbG1lci5Kb2FuZGlAdXQuZWUgIE9jdCc5OCwgaHR0cDovL3d3dy55bGVudXJtZS5lZS9+ZWxtZXIvNjU1LyI7CisKK3N0cnVjdCBuZXRfZGV2aWNlICphcmxhbl9kZXZpY2VbTUFYX0FSTEFOU107CisKK3N0YXRpYyBpbnQgU0lEID0gU0lEVU5LTk9XTjsKK3N0YXRpYyBpbnQgcmFkaW9Ob2RlSWQgPSByYWRpb05vZGVJZFVOS05PV047CitzdGF0aWMgY2hhciBlbmNyeXB0aW9uS2V5WzEyXSA9IHsnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJ307CitpbnQgYXJsYW5fZGVidWcgPSBkZWJ1Z1VOS05PV047CitzdGF0aWMgaW50IHNwcmVhZGluZ0NvZGUgPSBzcHJlYWRpbmdDb2RlVU5LTk9XTjsKK3N0YXRpYyBpbnQgY2hhbm5lbE51bWJlciA9IGNoYW5uZWxOdW1iZXJVTktOT1dOOworc3RhdGljIGludCBjaGFubmVsU2V0ID0gY2hhbm5lbFNldFVOS05PV047CitzdGF0aWMgaW50IHN5c3RlbUlkID0gc3lzdGVtSWRVTktOT1dOOworc3RhdGljIGludCByZWdpc3RyYXRpb25Nb2RlID0gcmVnaXN0cmF0aW9uTW9kZVVOS05PV047CitzdGF0aWMgaW50IGtleVN0YXJ0Oworc3RhdGljIGludCB0eF9kZWxheV9tczsKK3N0YXRpYyBpbnQgcmV0cmllcyA9IDU7CitzdGF0aWMgaW50IHR4X3F1ZXVlX2xlbiA9IDE7CitzdGF0aWMgaW50IGFybGFuX0VFUFJPTV9iYWQ7CisKKyNpZmRlZiBBUkxBTl9ERUJVR0dJTkcKKworc3RhdGljIGludCBhcmxhbl9lbnRyeV9kZWJ1ZzsKK3N0YXRpYyBpbnQgYXJsYW5fZXhpdF9kZWJ1ZzsKK3N0YXRpYyBpbnQgdGVzdE1lbW9yeSA9IHRlc3RNZW1vcnlVTktOT1dOOworc3RhdGljIGludCBpcnEgPSBpcnFVTktOT1dOOworc3RhdGljIGludCB0eFNjcmFtYmxlZCA9IDE7CitzdGF0aWMgaW50IG1kZWJ1ZzsKKworbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShtZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0odGVzdE1lbW9yeSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShhcmxhbl9lbnRyeV9kZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShhcmxhbl9leGl0X2RlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHR4U2NyYW1ibGVkLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICIodW51c2VkKSIpOworTU9EVUxFX1BBUk1fREVTQyh0ZXN0TWVtb3J5LCAiKHVudXNlZCkiKTsKK01PRFVMRV9QQVJNX0RFU0MobWRlYnVnLCAiQXJsYW4gbXVsdGljYXN0IGRlYnVnZ2luZyAoMC0xKSIpOworI2VuZGlmCisKK21vZHVsZV9wYXJhbShhcmxhbl9kZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShzcHJlYWRpbmdDb2RlLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGNoYW5uZWxOdW1iZXIsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY2hhbm5lbFNldCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShzeXN0ZW1JZCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyZWdpc3RyYXRpb25Nb2RlLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJhZGlvTm9kZUlkLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKFNJRCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShrZXlTdGFydCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh0eF9kZWxheV9tcywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyZXRyaWVzLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHR4X3F1ZXVlX2xlbiwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShhcmxhbl9FRVBST01fYmFkLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhhcmxhbl9kZWJ1ZywgIkFybGFuIGRlYnVnIGVuYWJsZSAoMC0xKSIpOworTU9EVUxFX1BBUk1fREVTQyhyZXRyaWVzLCAiQXJsYW4gbWF4aW11bSBwYWNrZXQgcmV0cmFuc21pc2lvbnMiKTsKKyNpZmRlZiBBUkxBTl9FTlRSWV9FWElUX0RFQlVHR0lORworTU9EVUxFX1BBUk1fREVTQyhhcmxhbl9lbnRyeV9kZWJ1ZywgIkFybGFuIGRyaXZlciBmdW5jdGlvbiBlbnRyeSBkZWJ1Z2dpbmciKTsKK01PRFVMRV9QQVJNX0RFU0MoYXJsYW5fZXhpdF9kZWJ1ZywgIkFybGFuIGRyaXZlciBmdW5jdGlvbiBleGl0IGRlYnVnZ2luZyIpOworTU9EVUxFX1BBUk1fREVTQyhhcmxhbl9lbnRyeV9hbmRfZXhpdF9kZWJ1ZywgIkFybGFuIGRyaXZlciBmdW5jdGlvbiBlbnRyeSBhbmQgZXhpdCBkZWJ1Z2dpbmciKTsKKyNlbHNlCitNT0RVTEVfUEFSTV9ERVNDKGFybGFuX2VudHJ5X2RlYnVnLCAiKGlnbm9yZWQpIik7CitNT0RVTEVfUEFSTV9ERVNDKGFybGFuX2V4aXRfZGVidWcsICIoaWdub3JlZCkiKTsKK01PRFVMRV9QQVJNX0RFU0MoYXJsYW5fZW50cnlfYW5kX2V4aXRfZGVidWcsICIoaWdub3JlZCkiKTsKKyNlbmRpZgorCitzdHJ1Y3QgYXJsYW5fY29uZl9zdHJ1IGFybGFuX2NvbmZbTUFYX0FSTEFOU107CitzdGF0aWMgaW50IGFybGFuc19mb3VuZDsKKworc3RhdGljICBpbnQgCWFybGFuX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgIGludCAJYXJsYW5fdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgIGlycXJldHVybl90IGFybGFuX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyAgaW50IAlhcmxhbl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgorCQlhcmxhbl9zdGF0aXN0aWNzCQkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgIHZvaWQgCWFybGFuX3NldF9tdWx0aWNhc3QJCShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyAgaW50IAlhcmxhbl9od190eAkJCShzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBjaGFyICpidWYsIGludCBsZW5ndGggKTsKK3N0YXRpYyAgaW50CWFybGFuX2h3X2NvbmZpZwkJCShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldik7CitzdGF0aWMgIHZvaWQgCWFybGFuX3R4X2RvbmVfaW50ZXJydXB0CQkoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGludCBzdGF0dXMpOworc3RhdGljICB2b2lkCWFybGFuX3J4X2ludGVycnVwdAkJKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCB1X2NoYXIgcnhTdGF0dXMsIHVfc2hvcnQsIHVfc2hvcnQpOworc3RhdGljICB2b2lkCWFybGFuX3Byb2Nlc3NfaW50ZXJydXB0CQkoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpOworc3RhdGljCXZvaWQJYXJsYW5fdHhfdGltZW91dAkJKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgaW5saW5lIGxvbmcgdXMydGlja3MoaW50IHVzKQoreworCXJldHVybiB1cyAqICgxMDAwMDAwIC8gSFopOworfQorCisKKyNpZmRlZiBBUkxBTl9FTlRSWV9FWElUX0RFQlVHR0lORworI2RlZmluZSBBUkxBTl9ERUJVR19FTlRSWShuYW1lKSBcCisJe1wKKwlzdHJ1Y3QgdGltZXZhbCB0aW1ldjtcCisJZG9fZ2V0dGltZW9mZGF5KCZ0aW1ldik7XAorCQlpZiAoYXJsYW5fZW50cnlfZGVidWcgfHwgYXJsYW5fZW50cnlfYW5kX2V4aXRfZGVidWcpXAorCQkJcHJpbnRrKCItLS0+Pj4iIG5hbWUgIiAlbGQgIiAiXG4iLCgobG9uZyBpbnQpIHRpbWV2LnR2X3NlYyAqIDEwMDAwMDAgKyB0aW1ldi50dl91c2VjKSk7XAorCX0KKyNkZWZpbmUgQVJMQU5fREVCVUdfRVhJVChuYW1lKSBcCisJe1wKKwlzdHJ1Y3QgdGltZXZhbCB0aW1ldjtcCisJZG9fZ2V0dGltZW9mZGF5KCZ0aW1ldik7XAorCQlpZiAoYXJsYW5fZXhpdF9kZWJ1ZyB8fCBhcmxhbl9lbnRyeV9hbmRfZXhpdF9kZWJ1ZylcCisJCQlwcmludGsoIjw8PC0tLSIgbmFtZSAiICVsZCAiICJcbiIsKChsb25nIGludCkgdGltZXYudHZfc2VjICogMTAwMDAwMCArIHRpbWV2LnR2X3VzZWMpICk7XAorCX0KKyNlbHNlCisjZGVmaW5lIEFSTEFOX0RFQlVHX0VOVFJZKG5hbWUpCisjZGVmaW5lIEFSTEFOX0RFQlVHX0VYSVQobmFtZSkKKyNlbmRpZgorCisKKyNkZWZpbmUgYXJsYW5faW50ZXJydXB0X2FjayhkZXYpXAorICAgICAgICBjbGVhckNsZWFySW50ZXJydXB0KGRldik7XAorICAgICAgICBzZXRDbGVhckludGVycnVwdChkZXYpOworCitzdGF0aWMgaW5saW5lIGludCBhcmxhbl9kcm9wX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcHJpdi0+c3RhdHMudHhfZXJyb3JzKys7CisJaWYgKHByaXYtPkNvbmYtPnR4X2RlbGF5X21zKQorCXsKKwkJcHJpdi0+dHhfZG9uZV9kZWxheWVkID0gamlmZmllcyArIHByaXYtPkNvbmYtPnR4X2RlbGF5X21zICogSFogLyAxMDAwICsgMTsKKwl9CisJZWxzZQorCXsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfVFg7CisJCVRYSEVBRChkZXYpLm9mZnNldCA9IDA7CisJCVRYVEFJTChkZXYpLm9mZnNldCA9IDA7CisJCXByaXYtPnR4TGFzdCA9IDA7CisJCXByaXYtPmJhZCA9IDA7CisJCWlmICghcHJpdi0+dW5kZXJfcmVzZXQgJiYgIXByaXYtPnVuZGVyX2NvbmZpZykKKwkJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJfQorCXJldHVybiAxOworfQorCisKK2ludCBhcmxhbl9jb21tYW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb21tYW5kX3ApCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBhcmxhbl9zaG1lbSBfX2lvbWVtICphcmxhbiA9IHByaXYtPmNhcmQ7CisJc3RydWN0IGFybGFuX2NvbmZfc3RydSAqY29uZiA9IHByaXYtPkNvbmY7CisJaW50IHVkZWxheWVkID0gMDsKKwlpbnQgaSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9jb21tYW5kIik7CisKKwlpZiAocHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsKQorCQlwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPSAxOworCisJaWYgKGFybGFuX2RlYnVnICYgQVJMQU5fREVCVUdfQ0hBSU5fTE9DS1MpCisJCXByaW50ayhLRVJOX0RFQlVHICJhcmxhbl9jb21tYW5kLCAlbHggY29tbWFuZEJ5dGUgJXggd2FpdGluZyAlbHggaW5jb21pbmcgJXggXG4iLAorCQlqaWZmaWVzLCBSRUFEU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUpLAorCQkgICAgICAgcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2ssIGNvbW1hbmRfcCk7CisKKwlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayB8PSBjb21tYW5kX3A7CisKKwlpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX1JFU0VUKQorCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBwcml2LT5sYXN0UmVzZXQgKyA1ICogSFopKQorCQkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfUkVTRVQ7CisKKwlpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX0lOVF9BQ0spCisJeworCQlhcmxhbl9pbnRlcnJ1cHRfYWNrKGRldik7CisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX0lOVF9BQ0s7CisJfQorCWlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfSU5UX0VOQUJMRSkKKwl7CisJCXNldEludGVycnVwdEVuYWJsZShkZXYpOworCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9JTlRfRU5BQkxFOworCX0KKworCS8qIENhcmQgYWNjZXNzIHNlcmlhbGl6aW5nIGxvY2sgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgY2FyZHMgc3RhdHVzIGFuZCB3YWl0aW5nICovCisKKwlpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiAoQVJMQU5fQ09NTUFORF9MT05HX1dBSVRfTk9XIHwgQVJMQU5fQ09NTUFORF9XQUlUX05PVykpCisJeworCQl3aGlsZSAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiAoQVJMQU5fQ09NTUFORF9MT05HX1dBSVRfTk9XIHwgQVJMQU5fQ09NTUFORF9XQUlUX05PVykpCisJCXsKKwkJCWlmIChSRUFEU0hNQihhcmxhbi0+cmVzZXRGbGFnKSB8fAorCQkJCVJFQURTSE1CKGFybGFuLT5jb21tYW5kQnl0ZSkpCS8qIHx8IAorCQkJCQkJCQkgICAocmVhZENvbnRyb2xSZWdpc3RlcihkZXYpICYgQVJMQU5fQUNDRVNTKSkKKwkJCQkJCQkJICovCisJCQkJdWRlbGF5KDQwKTsKKwkJCWVsc2UKKwkJCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+KEFSTEFOX0NPTU1BTkRfTE9OR19XQUlUX05PVyB8IEFSTEFOX0NPTU1BTkRfV0FJVF9OT1cpOworCisJCQl1ZGVsYXllZCsrOworCisJCQlpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX0xPTkdfV0FJVF9OT1cpCisJCQl7CisJCQkJaWYgKHVkZWxheWVkICogNDAgPiAxMDAwMDAwKQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICIlcyBsb25nIHdhaXQgdG9vIGxvbmcgXG4iLCBkZXYtPm5hbWUpOworCQkJCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayB8PSBBUkxBTl9DT01NQU5EX1JFU0VUOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfV0FJVF9OT1cpCisJCQl7CisJCQkJaWYgKHVkZWxheWVkICogNDAgPiAxMDAwKQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICIlcyBzaG9ydCB3YWl0IHRvbyBsb25nIFxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJZ290byBiYWRfZW5kOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlpID0gMDsKKwkJd2hpbGUgKChSRUFEU0hNQihhcmxhbi0+cmVzZXRGbGFnKSB8fAorCQkJUkVBRFNITUIoYXJsYW4tPmNvbW1hbmRCeXRlKSkgJiYKKwkJCWNvbmYtPnByZV9Db21tYW5kX1dhaXQgPiAoaSsrKSAqIDEwKQorCQkJdWRlbGF5KDEwKTsKKworCisJCWlmICgoUkVBRFNITUIoYXJsYW4tPnJlc2V0RmxhZykgfHwKKwkJCVJFQURTSE1CKGFybGFuLT5jb21tYW5kQnl0ZSkpICYmCisJCQkhKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9SRVNFVCkpCisJCXsKKwkJCWdvdG8gY2FyZF9idXN5X2VuZDsKKwkJfQorCX0KKwlpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX1JFU0VUKQorCQlwcml2LT51bmRlcl9yZXNldCA9IDE7CisJaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9DT05GKQorCQlwcml2LT51bmRlcl9jb25maWcgPSAxOworCisJLyogSXNzdWluZyBjb21tYW5kICovCisJYXJsYW5fbG9ja19jYXJkX2FjY2VzcyhkZXYpOworCWlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfUE9XRVJVUCkKKwl7CisJLy8gICAgIGlmIChyZWFkQ29udHJvbFJlZ2lzdGVyKGRldikgJiAoQVJMQU5fQUNDRVNTICYmIEFSTEFOX1BPV0VSKSkKKwkJc2V0UG93ZXJPbihkZXYpOworCQlhcmxhbl9pbnRlcnJ1cHRfbGFuY3B1KGRldik7CisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX1BPV0VSVVA7CisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrIHw9IEFSTEFOX0NPTU1BTkRfUkVTRVQ7CisJCXByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA9IEhaIC8gMTA7CisJfQorCWVsc2UgaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9BQ1RJVkFURSkKKwl7CisJCVdSSVRFU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUsIEFSTEFOX0NPTV9BQ1RJVkFURSk7CisJCWFybGFuX2ludGVycnVwdF9sYW5jcHUoZGV2KTsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfQUNUSVZBVEU7CisJCXByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA9IEhaIC8gMTA7CisJfQorCWVsc2UgaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9SWF9BQk9SVCkKKwl7CisJCWlmIChwcml2LT5yeF9jb21tYW5kX2dpdmVuKQorCQl7CisJCQlXUklURVNITUIoYXJsYW4tPmNvbW1hbmRCeXRlLCBBUkxBTl9DT01fUlhfQUJPUlQpOworCQkJYXJsYW5faW50ZXJydXB0X2xhbmNwdShkZXYpOworCQkJcHJpdi0+cnhfY29tbWFuZF9naXZlbiA9IDA7CisJCX0KKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfUlhfQUJPUlQ7CisJCXByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA9IDE7CisJfQorCWVsc2UgaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9UWF9BQk9SVCkKKwl7CisJCWlmIChwcml2LT50eF9jb21tYW5kX2dpdmVuKQorCQl7CisJCQlXUklURVNITUIoYXJsYW4tPmNvbW1hbmRCeXRlLCBBUkxBTl9DT01fVFhfQUJPUlQpOworCQkJYXJsYW5faW50ZXJydXB0X2xhbmNwdShkZXYpOworCQkJcHJpdi0+dHhfY29tbWFuZF9naXZlbiA9IDA7CisJCX0KKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfVFhfQUJPUlQ7CisJCXByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA9IDE7CisJfQorCWVsc2UgaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9SRVNFVCkKKwl7CisJCXByaXYtPnVuZGVyX3Jlc2V0PTE7CisJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisKKwkJYXJsYW5fZHJvcF90eChkZXYpOworCQlpZiAocHJpdi0+dHhfY29tbWFuZF9naXZlbiB8fCBwcml2LT5yeF9jb21tYW5kX2dpdmVuKQorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSZXNldCB1bmRlciB0eCBvciByeCBjb21tYW5kIFxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCQluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCQlpZiAoYXJsYW5fZGVidWcgJiBBUkxBTl9ERUJVR19SRVNFVCkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IERvaW5nIGNoaXAgcmVzZXRcbiIsIGRldi0+bmFtZSk7CisJCXByaXYtPmxhc3RSZXNldCA9IGppZmZpZXM7CisJCVdSSVRFU0hNKGFybGFuLT5jb21tYW5kQnl0ZSwgMCwgdV9jaGFyKTsKKwkJLyogaG9sZCBjYXJkIGluIHJlc2V0IHN0YXRlICovCisJCXNldEhhcmR3YXJlUmVzZXQoZGV2KTsKKwkJLyogc2V0IHJlc2V0IGZsYWcgYW5kIHRoZW4gcmVsZWFzZSByZXNldCAqLworCQlXUklURVNITShhcmxhbi0+cmVzZXRGbGFnLCAweGZmLCB1X2NoYXIpOworCQljbGVhckNoYW5uZWxBdHRlbnRpb24oZGV2KTsKKwkJY2xlYXJIYXJkd2FyZVJlc2V0KGRldik7CisJCXByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA9IEhaIC8gNDsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfUkVTRVQ7CisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrIHw9IEFSTEFOX0NPTU1BTkRfSU5UX1JBQ0s7CisvLwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgfD0gQVJMQU5fQ09NTUFORF9JTlRfUkVOQUJMRTsgCisvLwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgfD0gQVJMQU5fQ09NTUFORF9SWDsKKwl9CisJZWxzZSBpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX0lOVF9SQUNLKQorCXsKKwkJY2xlYXJIYXJkd2FyZVJlc2V0KGRldik7CisJCWNsZWFyQ2xlYXJJbnRlcnJ1cHQoZGV2KTsKKwkJc2V0Q2xlYXJJbnRlcnJ1cHQoZGV2KTsKKwkJc2V0SW50ZXJydXB0RW5hYmxlKGRldik7CisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX0lOVF9SQUNLOworCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayB8PSBBUkxBTl9DT01NQU5EX0NPTkY7CisJCXByaXYtPnVuZGVyX2NvbmZpZyA9IDE7CisJCXByaXYtPnVuZGVyX3Jlc2V0ID0gMDsKKwl9CisJZWxzZSBpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX0lOVF9SRU5BQkxFKQorCXsKKwkJc2V0SW50ZXJydXB0RW5hYmxlKGRldik7CisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX0lOVF9SRU5BQkxFOworCX0KKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfQ09ORikKKwl7CisJCWlmIChwcml2LT50eF9jb21tYW5kX2dpdmVuIHx8IHByaXYtPnJ4X2NvbW1hbmRfZ2l2ZW4pCisJCXsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJlc2V0IHVuZGVyIHR4IG9yIHJ4IGNvbW1hbmQgXG4iLCBkZXYtPm5hbWUpOworCQl9CisJCWFybGFuX2Ryb3BfdHgoZGV2KTsKKwkJc2V0SW50ZXJydXB0RW5hYmxlKGRldik7CisJCWFybGFuX2h3X2NvbmZpZyhkZXYpOworCQlhcmxhbl9pbnRlcnJ1cHRfbGFuY3B1KGRldik7CisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX0NPTkY7CisJCXByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA9IEhaIC8gMTA7CisvLwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgfD0gQVJMQU5fQ09NTUFORF9JTlRfUkFDSzsgICAKKy8vCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayB8PSBBUkxBTl9DT01NQU5EX0lOVF9FTkFCTEU7IAorCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayB8PSBBUkxBTl9DT01NQU5EX0NPTkZfV0FJVDsKKwl9CisJZWxzZSBpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX0NPTkZfV0FJVCkKKwl7CisJCWlmIChSRUFEU0hNQihhcmxhbi0+Y29uZmlndXJlZFN0YXR1c0ZsYWcpICE9IDAgJiYKKwkJCVJFQURTSE1CKGFybGFuLT5kaWFnbm9zdGljSW5mbykgPT0gMHhmZikKKwkJeworCQkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfQ09ORl9XQUlUOworCQkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgfD0gQVJMQU5fQ09NTUFORF9SWDsKKwkJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrIHw9IEFSTEFOX0NPTU1BTkRfVEJVU1lfQ0xFQVI7CisJCQlwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPSBIWiAvIDEwOworCQkJcHJpdi0+dHhfY29tbWFuZF9naXZlbiA9IDA7CisJCQlwcml2LT51bmRlcl9jb25maWcgPSAwOworCQl9CisJCWVsc2UKKwkJeworCQkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gMTsKKwkJCWlmIChhcmxhbl9kZWJ1ZyAmIEFSTEFOX0RFQlVHX1RJTUlORykKKwkJCQlwcmludGsoS0VSTl9FUlIgImNvbmZpZ3VyZSBkZWxheWVkIFxuIik7CisJCX0KKwl9CisJZWxzZSBpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX1JYKQorCXsKKwkJaWYgKCFyZWdpc3RyYXRpb25CYWQoZGV2KSkKKwkJeworCQkJc2V0SW50ZXJydXB0RW5hYmxlKGRldik7CisJCQltZW1zZXRfaW8oYXJsYW4tPmNvbW1hbmRQYXJhbWV0ZXIsIDAsIDB4Zik7CisJCQlXUklURVNITUIoYXJsYW4tPmNvbW1hbmRCeXRlLCBBUkxBTl9DT01fSU5UIHwgQVJMQU5fQ09NX1JYX0VOQUJMRSk7CisJCQlXUklURVNITUIoYXJsYW4tPmNvbW1hbmRQYXJhbWV0ZXJbMF0sIGNvbmYtPnJ4UGFyYW1ldGVyKTsKKwkJCWFybGFuX2ludGVycnVwdF9sYW5jcHUoZGV2KTsKKwkJCXByaXYtPnJ4X2NvbW1hbmRfZ2l2ZW4gPSAwOyAvLyBtbmphaCwgYmFkCisJCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9SWDsKKwkJCXByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA9IDE7CisJCX0KKwkJZWxzZQorCQkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gMjsKKwl9CisJZWxzZSBpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX1RCVVNZX0NMRUFSKQorCXsKKwkJaWYgKCAhcmVnaXN0cmF0aW9uQmFkKGRldikgJiYKKwkJICAgICAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpIHx8ICFuZXRpZl9ydW5uaW5nKGRldikpICkKKwkJCXsKKwkJCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9UQlVTWV9DTEVBUjsKKwkJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCQkJfQorCX0KKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfVFgpCisJeworCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoMCwgKHZvaWQgKikgJnByaXYtPnR4X2NvbW1hbmRfZ2l2ZW4pKQorCQl7CisJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCAKKwkJCQkgICAgICAgcHJpdi0+dHhfbGFzdF9zZW50ICsgdXMydGlja3MoY29uZi0+cnhfdHdlYWsxKSkKKwkJCSAgICB8fCB0aW1lX2JlZm9yZShqaWZmaWVzLAorCQkJCQkgICBwcml2LT5sYXN0X3J4X2ludF9hY2tfdGltZSArIHVzMnRpY2tzKGNvbmYtPnJ4X3R3ZWFrMikpKQorCQkJeworCQkJCXNldEludGVycnVwdEVuYWJsZShkZXYpOworCQkJCW1lbXNldF9pbyhhcmxhbi0+Y29tbWFuZFBhcmFtZXRlciwgMCwgMHhmKTsKKwkJCQlXUklURVNITUIoYXJsYW4tPmNvbW1hbmRCeXRlLCBBUkxBTl9DT01fVFhfRU5BQkxFIHwgQVJMQU5fQ09NX0lOVCk7CisJCQkJbWVtY3B5X3RvaW8oYXJsYW4tPmNvbW1hbmRQYXJhbWV0ZXIsICZUWExBU1QoZGV2KSwgMTQpOworLy8JCQkJZm9yICggaT0xIDsgaSA8IDE1IDsgaSsrKSBwcmludGsoIiUwMng6IixSRUFEU0hNQihhcmxhbi0+Y29tbWFuZFBhcmFtZXRlcltpXSkpOworCQkJCXByaXYtPnR4X2xhc3Rfc2VudCA9IGppZmZpZXM7CisJCQkJYXJsYW5faW50ZXJydXB0X2xhbmNwdShkZXYpOworCQkJCXByaXYtPnR4X2NvbW1hbmRfZ2l2ZW4gPSAxOworCQkJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX1RYOworCQkJCXByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA9IDE7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcHJpdi0+dHhfY29tbWFuZF9naXZlbiA9IDA7CisJCQkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gMTsKKwkJCX0KKwkJfSAKKwkJZWxzZSBpZiAoYXJsYW5fZGVidWcgJiBBUkxBTl9ERUJVR19DSEFJTl9MT0NLUykKKwkJCXByaW50ayhLRVJOX0VSUiAidHggY29tbWFuZCB3aGVuIHR4IGNoYWluIGxvY2tlZCBcbiIpOworCX0KKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfTk9PUElOVCkKKwl7CisJCXsKKwkJCVdSSVRFU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUsIEFSTEFOX0NPTV9OT1AgfCBBUkxBTl9DT01fSU5UKTsKKwkJfQorCQlhcmxhbl9pbnRlcnJ1cHRfbGFuY3B1KGRldik7CisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX05PT1BJTlQ7CisJCXByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA9IEhaIC8gMzsKKwl9CisJZWxzZSBpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX05PT1ApCisJeworCQlXUklURVNITUIoYXJsYW4tPmNvbW1hbmRCeXRlLCBBUkxBTl9DT01fTk9QKTsKKwkJYXJsYW5faW50ZXJydXB0X2xhbmNwdShkZXYpOworCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9OT09QOworCQlwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPSBIWiAvIDM7CisJfQorCWVsc2UgaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9TTE9XX1BPTEwpCisJeworCQlXUklURVNITUIoYXJsYW4tPmNvbW1hbmRCeXRlLCBBUkxBTl9DT01fR09UT19TTE9XX1BPTEwpOworCQlhcmxhbl9pbnRlcnJ1cHRfbGFuY3B1KGRldik7CisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX1NMT1dfUE9MTDsKKwkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gSFogLyAzOworCX0gCisJZWxzZSBpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX1BPV0VSRE9XTikKKwl7CisJCXNldFBvd2VyT2ZmKGRldik7CisJCWlmIChhcmxhbl9kZWJ1ZyAmIEFSTEFOX0RFQlVHX0NBUkRfU1RBVEUpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQXJsYW4gR29pbmcgU3RhbmRieVxuIiwgZGV2LT5uYW1lKTsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfUE9XRVJET1dOOworCQlwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPSAzICogSFo7CisJfQorCWFybGFuX3VubG9ja19jYXJkX2FjY2VzcyhkZXYpOworCWZvciAoaSA9IDA7IFJFQURTSE1CKGFybGFuLT5jb21tYW5kQnl0ZSkgJiYgaSA8IDIwOyBpKyspCisJCXVkZWxheSgxMCk7CisJaWYgKFJFQURTSE1CKGFybGFuLT5jb21tYW5kQnl0ZSkpCisJCWlmIChhcmxhbl9kZWJ1ZyAmIEFSTEFOX0RFQlVHX0NBUkRfU1RBVEUpCisJCQlwcmludGsoS0VSTl9FUlIgImNhcmQgYnVzeSBsZWF2aW5nIGNvbW1hbmQgJWx4XG4iLCBwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fY29tbWFuZCIpOworCXByaXYtPmxhc3RfY29tbWFuZF9idWZmX2ZyZWVfdGltZSA9IGppZmZpZXM7CisJcmV0dXJuIDA7CisKK2NhcmRfYnVzeV9lbmQ6CisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgcHJpdi0+bGFzdF9jb21tYW5kX2J1ZmZfZnJlZV90aW1lICsgSFopKQorCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayB8PSBBUkxBTl9DT01NQU5EX0NMRUFOX0FORF9SRVNFVDsKKworCWlmIChhcmxhbl9kZWJ1ZyAmIEFSTEFOX0RFQlVHX0NBUkRfU1RBVEUpCisJCXByaW50ayhLRVJOX0VSUiAiJXMgYXJsYW5fY29tbWFuZCBjYXJkIGJ1c3kgZW5kIFxuIiwgZGV2LT5uYW1lKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fY29tbWFuZCIpOworCXJldHVybiAxOworCitiYWRfZW5kOgorCXByaW50ayhLRVJOX0VSUiAiJXMgYXJsYW5fY29tbWFuZCBiYWQgZW5kIFxuIiwgZGV2LT5uYW1lKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9jb21tYW5kIik7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmxhbl9jb21tYW5kX3Byb2Nlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlpbnQgdGltZXMgPSAwOworCXdoaWxlIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmJiB0aW1lcyA8IDgpCisJeworCQlpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2spCisJCXsKKwkJCWlmIChhcmxhbl9jb21tYW5kKGRldiwgMCkpCisJCQkJYnJlYWs7CisJCQl0aW1lcysrOworCQl9CisJCS8qIGlmIGxvbmcgY29tbWFuZCwgd2Ugd29uJ3QgcmVwZWF0IHRyeWluZyAqLyA7CisJCWlmIChwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPiAxKQorCQkJYnJlYWs7CisJCXRpbWVzKys7CisJfQorfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmxhbl9yZXRyYW5zbWl0X25vdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX3JldHJhbnNtaXRfbm93Iik7CisJaWYgKFRYTEFTVChkZXYpLm9mZnNldCA9PSAwKQorCXsKKwkJaWYgKFRYSEVBRChkZXYpLm9mZnNldCkKKwkJeworCQkJcHJpdi0+dHhMYXN0ID0gMDsKKwkJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pIHByaW50ayhLRVJOX0RFQlVHICJUWCBidWZmIHN3aXRjaCB0byBoZWFkIFxuIik7CisKKwkJfQorCQllbHNlIGlmIChUWFRBSUwoZGV2KS5vZmZzZXQpCisJCXsKKwkJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pIHByaW50ayhLRVJOX0RFQlVHICJUWCBidWZmIHN3aXRjaCB0byB0YWlsIFxuIik7CisJCQlwcml2LT50eExhc3QgPSAxOworCQl9CisJCWVsc2UKKwkJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pIHByaW50ayhLRVJOX0VSUiAiUmVUcmFuc21pdCBidWZmIGVtcHR5Iik7CisJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJCXJldHVybjsKKworCX0KKwlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9UWCk7CisKKwlwcml2LT5Db25mLT5kcml2ZXJSZXRyYW5zbWlzc2lvbnMrKzsKKwlwcml2LT5yZXRyYW5zbWlzc2lvbnMrKzsKKworCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pIHByaW50aygiUmV0cmFuc21pdCAlZCBieXRlcyBcbiIsIFRYTEFTVChkZXYpLmxlbmd0aCk7CisKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9yZXRyYW5zbWl0X25vdyIpOworfQorCisKKworc3RhdGljIHZvaWQgYXJsYW5fcmVnaXN0cmF0aW9uX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBiaF9tYXJrX25lZWRlZCA9IDA7CisJaW50IG5leHRfdGljayA9IDE7CisJbG9uZyBsb3N0VGltZSA9ICgobG9uZylqaWZmaWVzIC0gKGxvbmcpcHJpdi0+cmVnaXN0cmF0aW9uTGFzdFNlZW4pCisJCQkqICgxMDAwL0haKTsKKworCWlmIChyZWdpc3RyYXRpb25CYWQoZGV2KSkKKwl7CisJCXByaXYtPnJlZ2lzdHJhdGlvbkxvc3RDb3VudCsrOworCQlpZiAobG9zdFRpbWUgPiA3MDAwICYmIGxvc3RUaW1lIDwgNzIwMCkKKwkJeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyByZWdpc3RyYXRpb24gTG9zdCBcbiIsIGRldi0+bmFtZSk7CisJCX0KKwkJaWYgKGxvc3RUaW1lIC8gcHJpdi0+cmVSZWdpc3RlckV4cCA+IDIwMDApCisJCQlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9DTEVBTl9BTkRfQ09ORik7CisJCWlmIChsb3N0VGltZSAvIChwcml2LT5yZVJlZ2lzdGVyRXhwKSA+IDM1MDApCisJCQlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9DTEVBTl9BTkRfUkVTRVQpOworCQlpZiAocHJpdi0+cmVSZWdpc3RlckV4cCA8IDQwMCkKKwkJCXByaXYtPnJlUmVnaXN0ZXJFeHAgKz0gMjsKKwkJaWYgKGxvc3RUaW1lID4gNzIwMCkKKwkJeworCQkJbmV4dF90aWNrID0gSFo7CisJCQlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9DTEVBTl9BTkRfUkVTRVQpOworCQl9CisJfQorCWVsc2UKKwl7CisJCWlmIChwcml2LT5Db25mLT5yZWdpc3RyYXRpb25Nb2RlICYmIGxvc3RUaW1lID4gMTAwMDAgJiYKKwkJCXByaXYtPnJlZ2lzdHJhdGlvbkxvc3RDb3VudCkKKwkJeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyByZWdpc3RyYXRpb24gaXMgYmFjayBhZnRlciAlbGQgbWlsbGlzZWNvbmRzXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgbG9zdFRpbWUpOworCQl9CisJCXByaXYtPnJlZ2lzdHJhdGlvbkxhc3RTZWVuID0gamlmZmllczsKKwkJcHJpdi0+cmVnaXN0cmF0aW9uTG9zdENvdW50ID0gMDsKKwkJcHJpdi0+cmVSZWdpc3RlckV4cCA9IDE7CisJCWlmICghbmV0aWZfcnVubmluZyhkZXYpICkKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJaWYgKHRpbWVfYWZ0ZXIocHJpdi0+dHhfbGFzdF9zZW50LHByaXYtPnR4X2xhc3RfY2xlYXJlZCkgJiYKKwkJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgcHJpdi0+dHhfbGFzdF9zZW50ICogNSpIWikgKXsKKwkJCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX0NMRUFOX0FORF9SRVNFVCk7CQkKKwkJCXByaXYtPnR4X2xhc3RfY2xlYXJlZCA9IGppZmZpZXM7CisJCX0KKwl9CisKKworCWlmICghcmVnaXN0cmF0aW9uQmFkKGRldikgJiYgcHJpdi0+UmVUcmFuc21pdFJlcXVlc3RlZCkKKwl7CisJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pCisJCQlwcmludGsoS0VSTl9FUlIgIlJldHJhbnNtaXQgZnJvbSB0aW1lciBcbiIpOworCQlwcml2LT5SZVRyYW5zbWl0UmVxdWVzdGVkID0gMDsKKwkJYXJsYW5fcmV0cmFuc21pdF9ub3coZGV2KTsKKwl9CisJaWYgKCFyZWdpc3RyYXRpb25CYWQoZGV2KSAmJgorCQl0aW1lX2FmdGVyKGppZmZpZXMsIHByaXYtPnR4X2RvbmVfZGVsYXllZCkgJiYKKwkJcHJpdi0+dHhfZG9uZV9kZWxheWVkICE9IDApCisJeworCQlUWExBU1QoZGV2KS5vZmZzZXQgPSAwOworCQlpZiAocHJpdi0+dHhMYXN0KQorCQkJcHJpdi0+dHhMYXN0ID0gMDsKKwkJZWxzZSBpZiAoVFhUQUlMKGRldikub2Zmc2V0KQorCQkJcHJpdi0+dHhMYXN0ID0gMTsKKwkJaWYgKFRYTEFTVChkZXYpLm9mZnNldCkKKwkJeworCQkJYXJsYW5fcmV0cmFuc21pdF9ub3coZGV2KTsKKwkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQl9CisJCWlmICghKFRYSEVBRChkZXYpLm9mZnNldCAmJiBUWFRBSUwoZGV2KS5vZmZzZXQpKQorCQl7CisJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCQl9CisJCXByaXYtPnR4X2RvbmVfZGVsYXllZCA9IDA7CisJCWJoX21hcmtfbmVlZGVkID0gMTsKKwl9CisJaWYgKGJoX21hcmtfbmVlZGVkKQorCXsKKwkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwl9CisJYXJsYW5fcHJvY2Vzc19pbnRlcnJ1cHQoZGV2KTsKKworCWlmIChuZXh0X3RpY2sgPCBwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwpCisJCW5leHRfdGljayA9IHByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbDsKKworCXByaXYtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbmV4dF90aWNrOworCisJYWRkX3RpbWVyKCZwcml2LT50aW1lcik7Cit9CisKKworI2lmZGVmIEFSTEFOX0RFQlVHR0lORworCitzdGF0aWMgdm9pZCBhcmxhbl9wcmludF9yZWdpc3RlcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGxpbmUpCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBhcmxhbl9zaG1lbSAqYXJsYW4gPSBwcml2LT5jYXJkOworCisJdV9jaGFyIGhvc3RjcHVMb2NrLCBsYW5jcHVMb2NrLCBjb250cm9sUmVnaXN0ZXIsIGNudHJsUmVnSW1hZ2UsCisJCXR4U3RhdHVzLCByeFN0YXR1cywgaW50ZXJydXB0SW5Qcm9ncmVzcywgY29tbWFuZEJ5dGU7CisKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9wcmludF9yZWdpc3RlcnMiKTsKKwlSRUFEU0hNKGludGVycnVwdEluUHJvZ3Jlc3MsIGFybGFuLT5pbnRlcnJ1cHRJblByb2dyZXNzLCB1X2NoYXIpOworCVJFQURTSE0oaG9zdGNwdUxvY2ssIGFybGFuLT5ob3N0Y3B1TG9jaywgdV9jaGFyKTsKKwlSRUFEU0hNKGxhbmNwdUxvY2ssIGFybGFuLT5sYW5jcHVMb2NrLCB1X2NoYXIpOworCVJFQURTSE0oY29udHJvbFJlZ2lzdGVyLCBhcmxhbi0+Y29udHJvbFJlZ2lzdGVyLCB1X2NoYXIpOworCVJFQURTSE0oY250cmxSZWdJbWFnZSwgYXJsYW4tPmNudHJsUmVnSW1hZ2UsIHVfY2hhcik7CisJUkVBRFNITSh0eFN0YXR1cywgYXJsYW4tPnR4U3RhdHVzLCB1X2NoYXIpOworCVJFQURTSE0ocnhTdGF0dXMsIGFybGFuLT5yeFN0YXR1cywgdV9jaGFyKTsKKwlSRUFEU0hNKGNvbW1hbmRCeXRlLCBhcmxhbi0+Y29tbWFuZEJ5dGUsIHVfY2hhcik7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJsaW5lICUwNGQgSVAgJTAyeCBITCAlMDJ4IExMICUwMnggQ0IgJTAyeCBDUiAlMDJ4IENSSSAlMDJ4IFRYICUwMnggUlggJTAyeFxuIiwKKwkJbGluZSwgaW50ZXJydXB0SW5Qcm9ncmVzcywgaG9zdGNwdUxvY2ssIGxhbmNwdUxvY2ssIGNvbW1hbmRCeXRlLAorCQljb250cm9sUmVnaXN0ZXIsIGNudHJsUmVnSW1hZ2UsIHR4U3RhdHVzLCByeFN0YXR1cyk7CisKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9wcmludF9yZWdpc3RlcnMiKTsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgYXJsYW5faHdfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbGVuZ3RoKQoreworCWludCBpOworCisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBhcmxhbl9zaG1lbSBfX2lvbWVtICphcmxhbiA9IHByaXYtPmNhcmQ7CisJc3RydWN0IGFybGFuX2NvbmZfc3RydSAqY29uZiA9IHByaXYtPkNvbmY7CisKKwlpbnQgdGFpbFN0YXJ0cyA9IDB4ODAwOworCWludCBoZWFkRW5kcyA9IDB4MDsKKworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX2h3X3R4Iik7CisJaWYgKFRYSEVBRChkZXYpLm9mZnNldCkKKwkJaGVhZEVuZHMgPSAoKChUWEhFQUQoZGV2KS5vZmZzZXQgKyBUWEhFQUQoZGV2KS5sZW5ndGggLSBvZmZzZXRvZihzdHJ1Y3QgYXJsYW5fc2htZW0sIHR4QnVmZmVyKSkgLyA2NCkgKyAxKSAqIDY0OworCWlmIChUWFRBSUwoZGV2KS5vZmZzZXQpCisJCXRhaWxTdGFydHMgPSAweDgwMCAtICgoKFRYVEFJTChkZXYpLm9mZnNldCAtIG9mZnNldG9mKHN0cnVjdCBhcmxhbl9zaG1lbSwgdHhCdWZmZXIpKSAvIDY0KSArIDIpICogNjQ7CisKKworCWlmICghVFhIRUFEKGRldikub2Zmc2V0ICYmIGxlbmd0aCA8IHRhaWxTdGFydHMpCisJeworCQlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKQorCQkJcHJpbnRrKEtFUk5fRVJSICJUWEhFQUQgaW5zZXJ0LCB0YWlsU3RhcnQgJWRcbiIsIHRhaWxTdGFydHMpOworCisJCVRYSEVBRChkZXYpLm9mZnNldCA9CisJCQlvZmZzZXRvZihzdHJ1Y3QgYXJsYW5fc2htZW0sIHR4QnVmZmVyKTsKKwkJVFhIRUFEKGRldikubGVuZ3RoID0gbGVuZ3RoIC0gQVJMQU5fRkFLRV9IRFJfTEVOOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJVFhIRUFEKGRldikuZGVzdFtpXSA9IGJ1ZltpXTsKKwkJVFhIRUFEKGRldikuY2xlYXIgPSBjb25mLT50eENsZWFyOworCQlUWEhFQUQoZGV2KS5yZXRyaWVzID0gY29uZi0+dHhSZXRyaWVzOwkvKiAwIGlzIHVzZSBkZWZhdWx0ICovCisJCVRYSEVBRChkZXYpLnJvdXRpbmcgPSBjb25mLT50eFJvdXRpbmc7CisJCVRYSEVBRChkZXYpLnNjcmFtYmxlZCA9IGNvbmYtPnR4U2NyYW1ibGVkOworCQltZW1jcHlfdG9pbygoY2hhciBfX2lvbWVtICopYXJsYW4gKyBUWEhFQUQoZGV2KS5vZmZzZXQsIGJ1ZiArIEFSTEFOX0ZBS0VfSERSX0xFTiwgVFhIRUFEKGRldikubGVuZ3RoKTsKKwl9CisJZWxzZSBpZiAoIVRYVEFJTChkZXYpLm9mZnNldCAmJiBsZW5ndGggPCAoMHg4MDAgLSBoZWFkRW5kcykpCisJeworCQlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKQorCQkJcHJpbnRrKEtFUk5fRVJSICJUWFRBSUwgaW5zZXJ0LCBoZWFkRW5kICVkXG4iLCBoZWFkRW5kcyk7CisKKwkJVFhUQUlMKGRldikub2Zmc2V0ID0KKwkJCW9mZnNldG9mKHN0cnVjdCBhcmxhbl9zaG1lbSwgdHhCdWZmZXIpICsgMHg4MDAgLSAobGVuZ3RoIC8gNjQgKyAyKSAqIDY0OworCQlUWFRBSUwoZGV2KS5sZW5ndGggPSBsZW5ndGggLSBBUkxBTl9GQUtFX0hEUl9MRU47CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlUWFRBSUwoZGV2KS5kZXN0W2ldID0gYnVmW2ldOworCQlUWFRBSUwoZGV2KS5jbGVhciA9IGNvbmYtPnR4Q2xlYXI7CisJCVRYVEFJTChkZXYpLnJldHJpZXMgPSBjb25mLT50eFJldHJpZXM7CisJCVRYVEFJTChkZXYpLnJvdXRpbmcgPSBjb25mLT50eFJvdXRpbmc7CisJCVRYVEFJTChkZXYpLnNjcmFtYmxlZCA9IGNvbmYtPnR4U2NyYW1ibGVkOworCQltZW1jcHlfdG9pbygoKGNoYXIgX19pb21lbSAqKWFybGFuICsgVFhUQUlMKGRldikub2Zmc2V0KSwgYnVmICsgQVJMQU5fRkFLRV9IRFJfTEVOLCBUWFRBSUwoZGV2KS5sZW5ndGgpOworCX0KKwllbHNlCisJeworCQluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCQlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKQorCQkJcHJpbnRrKEtFUk5fRVJSICJUWCBUQUlMICYgSEVBRCBmdWxsLCByZXR1cm4sIHRhaWxTdGFydCAlZCBoZWFkRW5kICVkXG4iLCB0YWlsU3RhcnRzLCBoZWFkRW5kcyk7CisJCXJldHVybiAtMTsKKwl9CisJcHJpdi0+b3V0X2J5dGVzICs9IGxlbmd0aDsKKwlwcml2LT5vdXRfYnl0ZXMxMCArPSBsZW5ndGg7CisJaWYgKGNvbmYtPm1lYXN1cmVfcmF0ZSA8IDEpCisJCWNvbmYtPm1lYXN1cmVfcmF0ZSA9IDE7CisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgcHJpdi0+b3V0X3RpbWUgKyBjb25mLT5tZWFzdXJlX3JhdGUgKiBIWikpCisJeworCQljb25mLT5vdXRfc3BlZWQgPSBwcml2LT5vdXRfYnl0ZXMgLyBjb25mLT5tZWFzdXJlX3JhdGU7CisJCXByaXYtPm91dF9ieXRlcyA9IDA7CisJCXByaXYtPm91dF90aW1lID0gamlmZmllczsKKwl9CisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgcHJpdi0+b3V0X3RpbWUxMCArIGNvbmYtPm1lYXN1cmVfcmF0ZSAqIDEwKkhaKSkKKwl7CisJCWNvbmYtPm91dF9zcGVlZDEwID0gcHJpdi0+b3V0X2J5dGVzMTAgLyAoMTAgKiBjb25mLT5tZWFzdXJlX3JhdGUpOworCQlwcml2LT5vdXRfYnl0ZXMxMCA9IDA7CisJCXByaXYtPm91dF90aW1lMTAgPSBqaWZmaWVzOworCX0KKwlpZiAoVFhIRUFEKGRldikub2Zmc2V0ICYmIFRYVEFJTChkZXYpLm9mZnNldCkKKwl7CisJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisJCXJldHVybiAwOworCX0KKwllbHNlCisJCW5ldGlmX3N0YXJ0X3F1ZXVlIChkZXYpOworCisKKwlJRkRFQlVHKEFSTEFOX0RFQlVHX0hFQURFUl9EVU1QKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyBUcmFuc21pdCB0ICUyeDolMng6JTJ4OiUyeDolMng6JTJ4IGYgJTJ4OiUyeDolMng6JTJ4OiUyeDolMnggXG4iLCBkZXYtPm5hbWUsCisJCSAgICh1bnNpZ25lZCBjaGFyKSBidWZbMF0sICh1bnNpZ25lZCBjaGFyKSBidWZbMV0sICh1bnNpZ25lZCBjaGFyKSBidWZbMl0sICh1bnNpZ25lZCBjaGFyKSBidWZbM10sCisJCSAgICh1bnNpZ25lZCBjaGFyKSBidWZbNF0sICh1bnNpZ25lZCBjaGFyKSBidWZbNV0sICh1bnNpZ25lZCBjaGFyKSBidWZbNl0sICh1bnNpZ25lZCBjaGFyKSBidWZbN10sCisJCSAgICh1bnNpZ25lZCBjaGFyKSBidWZbOF0sICh1bnNpZ25lZCBjaGFyKSBidWZbOV0sICh1bnNpZ25lZCBjaGFyKSBidWZbMTBdLCAodW5zaWduZWQgY2hhcikgYnVmWzExXSk7CisKKwlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKSBwcmludGsoS0VSTl9FUlIgIlRYIGNvbW1hbmQgcHJlcGFyZSBmb3IgYnVmZmVyICVkXG4iLCBwcml2LT50eExhc3QpOworCisJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfVFgpOworCisJcHJpdi0+dHhfbGFzdF9zZW50ID0gamlmZmllczsKKworCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pIHByaW50aygiJXMgVFggUXVlZCAlZCBieXRlcyBcbiIsIGRldi0+bmFtZSwgbGVuZ3RoKTsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX2h3X3R4Iik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFybGFuX2h3X2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYXJsYW5fc2htZW0gX19pb21lbSAqYXJsYW4gPSBwcml2LT5jYXJkOworCXN0cnVjdCBhcmxhbl9jb25mX3N0cnUgKmNvbmYgPSBwcml2LT5Db25mOworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX2h3X2NvbmZpZyIpOworCisJcHJpbnRrKEtFUk5fTk9USUNFICIlcyBhcmxhbiBjb25maWd1cmUgY2FsbGVkIFxuIiwgZGV2LT5uYW1lKTsKKwlpZiAoYXJsYW5fRUVQUk9NX2JhZCkKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJhcmxhbiBjb25maWd1cmUgd2l0aCBlZXByb20gYmFkIG9wdGlvbiBcbiIpOworCisKKwlXUklURVNITShhcmxhbi0+c3ByZWFkaW5nQ29kZSwgY29uZi0+c3ByZWFkaW5nQ29kZSwgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+Y2hhbm5lbFNldCwgY29uZi0+Y2hhbm5lbFNldCwgdV9jaGFyKTsKKworCWlmIChhcmxhbl9FRVBST01fYmFkKQorCQlXUklURVNITShhcmxhbi0+ZGVmYXVsdENoYW5uZWxTZXQsIGNvbmYtPmNoYW5uZWxTZXQsIHVfY2hhcik7CisKKwlXUklURVNITShhcmxhbi0+Y2hhbm5lbE51bWJlciwgY29uZi0+Y2hhbm5lbE51bWJlciwgdV9jaGFyKTsKKworCVdSSVRFU0hNKGFybGFuLT5zY3JhbWJsaW5nRGlzYWJsZSwgY29uZi0+c2NyYW1ibGluZ0Rpc2FibGUsIHVfY2hhcik7CisJV1JJVEVTSE0oYXJsYW4tPnR4QXR0ZW51YXRpb24sIGNvbmYtPnR4QXR0ZW51YXRpb24sIHVfY2hhcik7CisKKwlXUklURVNITShhcmxhbi0+c3lzdGVtSWQsIGNvbmYtPnN5c3RlbUlkLCB1X2ludCk7CisKKwlXUklURVNITShhcmxhbi0+bWF4UmV0cmllcywgY29uZi0+bWF4UmV0cmllcywgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+cmVjZWl2ZU1vZGUsIGNvbmYtPnJlY2VpdmVNb2RlLCB1X2NoYXIpOworCVdSSVRFU0hNKGFybGFuLT5wcmlvcml0eSwgY29uZi0+cHJpb3JpdHksIHVfY2hhcik7CisJV1JJVEVTSE0oYXJsYW4tPnJvb3RPclJlcGVhdGVyLCBjb25mLT5yb290T3JSZXBlYXRlciwgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+U0lELCBjb25mLT5TSUQsIHVfaW50KTsKKworCVdSSVRFU0hNKGFybGFuLT5yZWdpc3RyYXRpb25Nb2RlLCBjb25mLT5yZWdpc3RyYXRpb25Nb2RlLCB1X2NoYXIpOworCisJV1JJVEVTSE0oYXJsYW4tPnJlZ2lzdHJhdGlvbkZpbGwsIGNvbmYtPnJlZ2lzdHJhdGlvbkZpbGwsIHVfY2hhcik7CisJV1JJVEVTSE0oYXJsYW4tPmxvY2FsVGFsa0FkZHJlc3MsIGNvbmYtPmxvY2FsVGFsa0FkZHJlc3MsIHVfY2hhcik7CisJV1JJVEVTSE0oYXJsYW4tPmNvZGVGb3JtYXQsIGNvbmYtPmNvZGVGb3JtYXQsIHVfY2hhcik7CisJV1JJVEVTSE0oYXJsYW4tPm51bUNoYW5uZWxzLCBjb25mLT5udW1DaGFubmVscywgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+Y2hhbm5lbDEsIGNvbmYtPmNoYW5uZWwxLCB1X2NoYXIpOworCVdSSVRFU0hNKGFybGFuLT5jaGFubmVsMiwgY29uZi0+Y2hhbm5lbDIsIHVfY2hhcik7CisJV1JJVEVTSE0oYXJsYW4tPmNoYW5uZWwzLCBjb25mLT5jaGFubmVsMywgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+Y2hhbm5lbDQsIGNvbmYtPmNoYW5uZWw0LCB1X2NoYXIpOworCVdSSVRFU0hNKGFybGFuLT5yYWRpb05vZGVJZCwgY29uZi0+cmFkaW9Ob2RlSWQsIHVfc2hvcnQpOworCVdSSVRFU0hNKGFybGFuLT5TSUQsIGNvbmYtPlNJRCwgdV9pbnQpOworCVdSSVRFU0hNKGFybGFuLT53YWl0VGltZSwgY29uZi0+d2FpdFRpbWUsIHVfc2hvcnQpOworCVdSSVRFU0hNKGFybGFuLT5sUGFyYW1ldGVyLCBjb25mLT5sUGFyYW1ldGVyLCB1X3Nob3J0KTsKKwltZW1jcHlfdG9pbygmKGFybGFuLT5fMTUpLCAmKGNvbmYtPl8xNSksIDMpOworCVdSSVRFU0hNKGFybGFuLT5fMTUsIGNvbmYtPl8xNSwgdV9zaG9ydCk7CisJV1JJVEVTSE0oYXJsYW4tPmhlYWRlclNpemUsIGNvbmYtPmhlYWRlclNpemUsIHVfc2hvcnQpOworCWlmIChhcmxhbl9FRVBST01fYmFkKQorCQlXUklURVNITShhcmxhbi0+aGFyZHdhcmVUeXBlLCBjb25mLT5oYXJkd2FyZVR5cGUsIHVfY2hhcik7CisJV1JJVEVTSE0oYXJsYW4tPnJhZGlvVHlwZSwgY29uZi0+cmFkaW9UeXBlLCB1X2NoYXIpOworCWlmIChhcmxhbl9FRVBST01fYmFkKQorCQlXUklURVNITShhcmxhbi0+cmFkaW9Nb2R1bGUsIGNvbmYtPnJhZGlvVHlwZSwgdV9jaGFyKTsKKworCW1lbWNweV90b2lvKGFybGFuLT5lbmNyeXB0aW9uS2V5ICsga2V5U3RhcnQsIGVuY3J5cHRpb25LZXksIDgpOworCW1lbWNweV90b2lvKGFybGFuLT5uYW1lLCBjb25mLT5zaXRlTmFtZSwgMTYpOworCisJV1JJVEVTSE1CKGFybGFuLT5jb21tYW5kQnl0ZSwgQVJMQU5fQ09NX0lOVCB8IEFSTEFOX0NPTV9DT05GKTsJLyogZG8gY29uZmlndXJlICovCisJbWVtc2V0X2lvKGFybGFuLT5jb21tYW5kUGFyYW1ldGVyLCAwLCAweGYpOwkvKiAweGYgKi8KKwltZW1zZXRfaW8oYXJsYW4tPmNvbW1hbmRQYXJhbWV0ZXIgKyAxLCAwLCAyKTsKKwlpZiAoY29uZi0+d3JpdGVFRVBST00pCisJeworCQkgIG1lbXNldF9pbyhhcmxhbi0+Y29tbWFuZFBhcmFtZXRlciwgY29uZi0+d3JpdGVFRVBST00sIDEpOworLy8JCWNvbmYtPndyaXRlRUVQUk9NPTA7CisJfQorCWlmIChjb25mLT5yZWdpc3RyYXRpb25Nb2RlICYmIGNvbmYtPnJlZ2lzdHJhdGlvbkludGVycnVwdHMpCisJCW1lbXNldF9pbyhhcmxhbi0+Y29tbWFuZFBhcmFtZXRlciArIDMsIDEsIDEpOworCWVsc2UKKwkJbWVtc2V0X2lvKGFybGFuLT5jb21tYW5kUGFyYW1ldGVyICsgMywgMCwgMSk7CisKKwlwcml2LT5pcnFfdGVzdF9kb25lID0gMDsKKworCWlmIChjb25mLT50eF9xdWV1ZV9sZW4pCisJCWRldi0+dHhfcXVldWVfbGVuID0gY29uZi0+dHhfcXVldWVfbGVuOworCXVkZWxheSgxMDApOworCisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5faHdfY29uZmlnIik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBhcmxhbl9yZWFkX2NhcmRfY29uZmlndXJhdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVfY2hhciB0bHg0MTU7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBhcmxhbl9zaG1lbSBfX2lvbWVtICphcmxhbiA9IHByaXYtPmNhcmQ7CisJc3RydWN0IGFybGFuX2NvbmZfc3RydSAqY29uZiA9IHByaXYtPkNvbmY7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fcmVhZF9jYXJkX2NvbmZpZ3VyYXRpb24iKTsKKworCWlmIChyYWRpb05vZGVJZCA9PSByYWRpb05vZGVJZFVOS05PV04pCisJeworCQlSRUFEU0hNKGNvbmYtPnJhZGlvTm9kZUlkLCBhcmxhbi0+cmFkaW9Ob2RlSWQsIHVfc2hvcnQpOworCX0KKwllbHNlCisJCWNvbmYtPnJhZGlvTm9kZUlkID0gcmFkaW9Ob2RlSWQ7CisJCQorCWlmIChTSUQgPT0gU0lEVU5LTk9XTikKKwl7CisJCVJFQURTSE0oY29uZi0+U0lELCBhcmxhbi0+U0lELCB1X2ludCk7CisJfQorCWVsc2UgY29uZi0+U0lEID0gU0lEOworCQkKKwlpZiAoc3ByZWFkaW5nQ29kZSA9PSBzcHJlYWRpbmdDb2RlVU5LTk9XTikKKwl7CisJCSAgUkVBRFNITShjb25mLT5zcHJlYWRpbmdDb2RlLCBhcmxhbi0+c3ByZWFkaW5nQ29kZSwgdV9jaGFyKTsKKwl9CisJZWxzZQorCQljb25mLT5zcHJlYWRpbmdDb2RlID0gc3ByZWFkaW5nQ29kZTsKKwkJCisJaWYgKGNoYW5uZWxTZXQgPT0gY2hhbm5lbFNldFVOS05PV04pCisJeworCQlSRUFEU0hNKGNvbmYtPmNoYW5uZWxTZXQsIGFybGFuLT5jaGFubmVsU2V0LCB1X2NoYXIpOworCX0KKwllbHNlIGNvbmYtPmNoYW5uZWxTZXQgPSBjaGFubmVsU2V0OworCisJaWYgKGNoYW5uZWxOdW1iZXIgPT0gY2hhbm5lbE51bWJlclVOS05PV04pCisJeworCQlSRUFEU0hNKGNvbmYtPmNoYW5uZWxOdW1iZXIsIGFybGFuLT5jaGFubmVsTnVtYmVyLCB1X2NoYXIpOworCX0KKwllbHNlIGNvbmYtPmNoYW5uZWxOdW1iZXIgPSBjaGFubmVsTnVtYmVyOworCQorCVJFQURTSE0oY29uZi0+c2NyYW1ibGluZ0Rpc2FibGUsIGFybGFuLT5zY3JhbWJsaW5nRGlzYWJsZSwgdV9jaGFyKTsKKwlSRUFEU0hNKGNvbmYtPnR4QXR0ZW51YXRpb24sIGFybGFuLT50eEF0dGVudWF0aW9uLCB1X2NoYXIpOworCQorCWlmIChzeXN0ZW1JZCA9PSBzeXN0ZW1JZFVOS05PV04pCisJeworCQlSRUFEU0hNKGNvbmYtPnN5c3RlbUlkLCBhcmxhbi0+c3lzdGVtSWQsIHVfaW50KTsKKwl9IAorCWVsc2UgY29uZi0+c3lzdGVtSWQgPSBzeXN0ZW1JZDsKKwkKKwlSRUFEU0hNKGNvbmYtPm1heERhdGFncmFtU2l6ZSwgYXJsYW4tPm1heERhdGFncmFtU2l6ZSwgdV9zaG9ydCk7CisJUkVBRFNITShjb25mLT5tYXhGcmFtZVNpemUsIGFybGFuLT5tYXhGcmFtZVNpemUsIHVfc2hvcnQpOworCVJFQURTSE0oY29uZi0+bWF4UmV0cmllcywgYXJsYW4tPm1heFJldHJpZXMsIHVfY2hhcik7CisJUkVBRFNITShjb25mLT5yZWNlaXZlTW9kZSwgYXJsYW4tPnJlY2VpdmVNb2RlLCB1X2NoYXIpOworCVJFQURTSE0oY29uZi0+cHJpb3JpdHksIGFybGFuLT5wcmlvcml0eSwgdV9jaGFyKTsKKwlSRUFEU0hNKGNvbmYtPnJvb3RPclJlcGVhdGVyLCBhcmxhbi0+cm9vdE9yUmVwZWF0ZXIsIHVfY2hhcik7CisKKwlpZiAoU0lEID09IFNJRFVOS05PV04pCisJeworCQkgIFJFQURTSE0oY29uZi0+U0lELCBhcmxhbi0+U0lELCB1X2ludCk7CisJfQorCWVsc2UgY29uZi0+U0lEID0gU0lEOworCQorCWlmIChyZWdpc3RyYXRpb25Nb2RlID09IHJlZ2lzdHJhdGlvbk1vZGVVTktOT1dOKQorCXsKKwkJICBSRUFEU0hNKGNvbmYtPnJlZ2lzdHJhdGlvbk1vZGUsIGFybGFuLT5yZWdpc3RyYXRpb25Nb2RlLCB1X2NoYXIpOworCX0KKwllbHNlIGNvbmYtPnJlZ2lzdHJhdGlvbk1vZGUgPSByZWdpc3RyYXRpb25Nb2RlOworCQorCVJFQURTSE0oY29uZi0+cmVnaXN0cmF0aW9uRmlsbCwgYXJsYW4tPnJlZ2lzdHJhdGlvbkZpbGwsIHVfY2hhcik7CisJUkVBRFNITShjb25mLT5sb2NhbFRhbGtBZGRyZXNzLCBhcmxhbi0+bG9jYWxUYWxrQWRkcmVzcywgdV9jaGFyKTsKKwlSRUFEU0hNKGNvbmYtPmNvZGVGb3JtYXQsIGFybGFuLT5jb2RlRm9ybWF0LCB1X2NoYXIpOworCVJFQURTSE0oY29uZi0+bnVtQ2hhbm5lbHMsIGFybGFuLT5udW1DaGFubmVscywgdV9jaGFyKTsKKwlSRUFEU0hNKGNvbmYtPmNoYW5uZWwxLCBhcmxhbi0+Y2hhbm5lbDEsIHVfY2hhcik7CisJUkVBRFNITShjb25mLT5jaGFubmVsMiwgYXJsYW4tPmNoYW5uZWwyLCB1X2NoYXIpOworCVJFQURTSE0oY29uZi0+Y2hhbm5lbDMsIGFybGFuLT5jaGFubmVsMywgdV9jaGFyKTsKKwlSRUFEU0hNKGNvbmYtPmNoYW5uZWw0LCBhcmxhbi0+Y2hhbm5lbDQsIHVfY2hhcik7CisJUkVBRFNITShjb25mLT53YWl0VGltZSwgYXJsYW4tPndhaXRUaW1lLCB1X3Nob3J0KTsKKwlSRUFEU0hNKGNvbmYtPmxQYXJhbWV0ZXIsIGFybGFuLT5sUGFyYW1ldGVyLCB1X3Nob3J0KTsKKwlSRUFEU0hNKGNvbmYtPl8xNSwgYXJsYW4tPl8xNSwgdV9zaG9ydCk7CisJUkVBRFNITShjb25mLT5oZWFkZXJTaXplLCBhcmxhbi0+aGVhZGVyU2l6ZSwgdV9zaG9ydCk7CisJUkVBRFNITShjb25mLT5oYXJkd2FyZVR5cGUsIGFybGFuLT5oYXJkd2FyZVR5cGUsIHVfY2hhcik7CisJUkVBRFNITShjb25mLT5yYWRpb1R5cGUsIGFybGFuLT5yYWRpb01vZHVsZSwgdV9jaGFyKTsKKwkKKwlpZiAoY29uZi0+cmFkaW9UeXBlID09IDApCisJCWNvbmYtPnJhZGlvVHlwZSA9IDB4YzsKKworCVdSSVRFU0hNKGFybGFuLT5jb25maWdTdGF0dXMsIDB4QTUsIHVfY2hhcik7CisJUkVBRFNITSh0bHg0MTUsIGFybGFuLT5jb25maWdTdGF0dXMsIHVfY2hhcik7CisJCisJaWYgKHRseDQxNSAhPSAweEE1KQorCQlwcmludGsoS0VSTl9JTkZPICIlcyB0bHg0MTUgY2hpcCBcbiIsIGRldi0+bmFtZSk7CisJCisJY29uZi0+dHhDbGVhciA9IDA7CisJY29uZi0+dHhSZXRyaWVzID0gMTsKKwljb25mLT50eFJvdXRpbmcgPSAxOworCWNvbmYtPnR4U2NyYW1ibGVkID0gMDsKKwljb25mLT5yeFBhcmFtZXRlciA9IDE7CisJY29uZi0+dHhUaW1lb3V0TXMgPSA0MDAwOworCWNvbmYtPndhaXRDYXJkVGltZW91dCA9IDEwMDAwMDsKKwljb25mLT5yZWNlaXZlTW9kZSA9IEFSTEFOX1JDVl9DTEVBTjsKKwltZW1jcHlfZnJvbWlvKGNvbmYtPnNpdGVOYW1lLCBhcmxhbi0+bmFtZSwgMTYpOworCWNvbmYtPnNpdGVOYW1lWzE2XSA9ICdcMCc7CisJY29uZi0+cmV0cmllcyA9IHJldHJpZXM7CisJY29uZi0+dHhfZGVsYXlfbXMgPSB0eF9kZWxheV9tczsKKwljb25mLT5SZVRyYW5zbWl0UGFja2V0TWF4U2l6ZSA9IDIwMDsKKwljb25mLT53YWl0UmVUcmFuc21pdFBhY2tldE1heFNpemUgPSAyMDA7CisJY29uZi0+dHhBY2tUaW1lb3V0TXMgPSA5MDA7CisJY29uZi0+ZmFzdFJlVHJhbnNDb3VudCA9IDM7CisKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9yZWFkX2NhcmRfY29uZmlndXJhdGlvbiIpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBsYXN0Rm91bmRBdCA9IDB4YmUwMDA7CisKKworLyoKKyAqIFRoaXMgaXMgdGhlIHJlYWwgcHJvYmUgcm91dGluZS4gTGludXggaGFzIGEgaGlzdG9yeSBvZiBmcmllbmRseSBkZXZpY2UKKyAqIHByb2JlcyBvbiB0aGUgSVNBIGJ1cy4gQSBnb29kIGRldmljZSBwcm9iZXMgYXZvaWRzIGRvaW5nIHdyaXRlcywgYW5kCisgKiB2ZXJpZmllcyB0aGF0IHRoZSBjb3JyZWN0IGRldmljZSBleGlzdHMgYW5kIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZSBBUkxBTl9TSE1FTV9TSVpFCTB4MjAwMAorc3RhdGljIGludCBfX2luaXQgYXJsYW5fY2hlY2tfZmluZ2VycHJpbnQodW5zaWduZWQgbG9uZyBtZW1hZGRyKQoreworCXN0YXRpYyBjb25zdCBjaGFyIHByb2JlVGV4dFtdID0gIlRFTEVTWVNURU0gU0xXIElOQy4gICAgQVJMQU4gXDAiOworCXZvbGF0aWxlIHN0cnVjdCBhcmxhbl9zaG1lbSBfX2lvbWVtICphcmxhbiA9IChzdHJ1Y3QgYXJsYW5fc2htZW0gKikgbWVtYWRkcjsKKwl1bnNpZ25lZCBsb25nIHBhZGRyID0gdmlydF90b19waHlzKCh2b2lkICopIG1lbWFkZHIpOworCWNoYXIgdGVtcEJ1Zls0OV07CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fY2hlY2tfZmluZ2VycHJpbnQiKTsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBhZGRyLCBBUkxBTl9TSE1FTV9TSVpFLCAiYXJsYW4iKSkgeworCQkvLyBwcmludGsoS0VSTl9XQVJOSU5HICJhcmxhbjogbWVtb3J5IHJlZ2lvbiAlbHggZXhjbHVkZWQgZnJvbSBwcm9iaW5nIFxuIixwYWRkcik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW1lbWNweV9mcm9taW8odGVtcEJ1ZiwgYXJsYW4tPnRleHRSZWdpb24sIDI5KTsKKwl0ZW1wQnVmWzMwXSA9IDA7CisKKwkvKiBjaGVjayBmb3IgY2FyZCBhdCB0aGlzIGFkZHJlc3MgKi8KKwlpZiAoMCAhPSBzdHJuY21wKHRlbXBCdWYsIHByb2JlVGV4dCwgMjkpKXsKKyAJCXJlbGVhc2VfbWVtX3JlZ2lvbihwYWRkciwgQVJMQU5fU0hNRU1fU0laRSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworLy8gICBwcmludGsoS0VSTl9JTkZPICJhcmxhbiBmb3VuZCBhdCAweCV4IFxuIixtZW1hZGRyKTsKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9jaGVja19maW5nZXJwcmludCIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJsYW5fY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFybGFuX2NvbmZfc3RydSAqY29uZiA9IHByaXYtPkNvbmY7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fY2hhbmdlX210dSIpOworCWlmIChuZXdfbXR1ID4gMjAzMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGV2LT5tdHUgPSBuZXdfbXR1OworCWlmIChuZXdfbXR1IDwgMjU2KQorCQluZXdfbXR1ID0gMjU2OwkvKiBjYXJkcyBib29rIHN1Z2dlc3RzIDE2MDAgKi8KKwljb25mLT5tYXhEYXRhZ3JhbVNpemUgPSBuZXdfbXR1OworCWNvbmYtPm1heEZyYW1lU2l6ZSA9IG5ld19tdHUgKyA0ODsKKworCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX0NMRUFOX0FORF9DT05GKTsKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIG10dSBjaGFuZ2VkIHRvICVkIFxuIiwgZGV2LT5uYW1lLCBuZXdfbXR1KTsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX2NoYW5nZV9tdHUiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFybGFuX21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCit7CisJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKKworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX21hY19hZGRyIik7CisJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FQlVTWTsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9tYWNfYWRkciIpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCBfX2luaXQgYXJsYW5fc2V0dXBfZGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBudW0pCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyOworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX3NldHVwX2RldmljZSIpOworCisJYXAtPmNvbmYgPSAoc3RydWN0IGFybGFuX3NobWVtICopKGFwKzEpOworCisJZGV2LT50eF9xdWV1ZV9sZW4gPSB0eF9xdWV1ZV9sZW47CisJZGV2LT5vcGVuID0gYXJsYW5fb3BlbjsKKwlkZXYtPnN0b3AgPSBhcmxhbl9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGFybGFuX3R4OworCWRldi0+Z2V0X3N0YXRzID0gYXJsYW5fc3RhdGlzdGljczsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGFybGFuX3NldF9tdWx0aWNhc3Q7CisJZGV2LT5jaGFuZ2VfbXR1ID0gYXJsYW5fY2hhbmdlX210dTsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGFybGFuX21hY19hZGRyOworCWRldi0+dHhfdGltZW91dCA9IGFybGFuX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IDMqSFo7CisJCisJYXAtPmlycV90ZXN0X2RvbmUgPSAwOworCWFwLT5Db25mID0gJmFybGFuX2NvbmZbbnVtXTsKKworCWFwLT5Db25mLT5wcmVfQ29tbWFuZF9XYWl0ID0gNDA7CisJYXAtPkNvbmYtPnJ4X3R3ZWFrMSA9IDMwOworCWFwLT5Db25mLT5yeF90d2VhazIgPSAwOworCisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbih2aXJ0X3RvX3BoeXMoKHZvaWQgKikgZGV2LT5tZW1fc3RhcnQpLCAKKwkJCSAgIEFSTEFOX1NITUVNX1NJWkUpOworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gZXJyOworCX0KKwlhcmxhbl9kZXZpY2VbbnVtXSA9IGRldjsKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9zZXR1cF9kZXZpY2UiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgYXJsYW5fcHJvYmVfaGVyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCAKKwkJCQkgICB1bnNpZ25lZCBsb25nIG1lbWFkZHIpCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9wcm9iZV9oZXJlIik7CisKKwlpZiAoYXJsYW5fY2hlY2tfZmluZ2VycHJpbnQobWVtYWRkcikpCisJCXJldHVybiAtRU5PREVWOworCisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogQXJsYW4gZm91bmQgYXQgJXgsIFxuICIsIGRldi0+bmFtZSwgCisJICAgICAgIChpbnQpIHZpcnRfdG9fcGh5cygodm9pZCopbWVtYWRkcikpOworCisJYXAtPmNhcmQgPSAodm9pZCAqKSBtZW1hZGRyOworCWRldi0+bWVtX3N0YXJ0ID0gbWVtYWRkcjsKKwlkZXYtPm1lbV9lbmQgPSBtZW1hZGRyICsgQVJMQU5fU0hNRU1fU0laRS0xOworCisJaWYgKGRldi0+aXJxIDwgMikKKwl7CisJCVJFQURTSE0oZGV2LT5pcnEsIGFwLT5jYXJkLT5pcnFMZXZlbCwgdV9jaGFyKTsKKwl9IGVsc2UgaWYgKGRldi0+aXJxID09IDIpCisJCWRldi0+aXJxID0gOTsKKworCWFybGFuX3JlYWRfY2FyZF9jb25maWd1cmF0aW9uKGRldik7CisKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9wcm9iZV9oZXJlIik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBhcmxhbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBhcmxhbl9zaG1lbSBfX2lvbWVtICphcmxhbiA9IHByaXYtPmNhcmQ7CisJaW50IHJldCA9IDA7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fb3BlbiIpOworCisJcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZhcmxhbl9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocmV0KQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGdldCBJUlEgJWQgLlxuIiwKKwkJCWRldi0+bmFtZSwgZGV2LT5pcnEpOworCQlyZXR1cm4gcmV0OworCX0KKworCisJcHJpdi0+YmFkID0gMDsKKwlwcml2LT5sYXN0UmVzZXQgPSAwOworCXByaXYtPnJlc2V0ID0gMDsKKwltZW1jcHlfZnJvbWlvKGRldi0+ZGV2X2FkZHIsIGFybGFuLT5sYW5DYXJkTm9kZUlkLCA2KTsKKwltZW1zZXQoZGV2LT5icm9hZGNhc3QsIDB4ZmYsIDYpOworCWRldi0+dHhfcXVldWVfbGVuID0gdHhfcXVldWVfbGVuOworCXByaXYtPmludGVycnVwdF9wcm9jZXNzaW5nX2FjdGl2ZSA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOworCisJbmV0aWZfc3RhcnRfcXVldWUgKGRldik7CisKKwlwcml2LT5yZWdpc3RyYXRpb25Mb3N0Q291bnQgPSAwOworCXByaXYtPnJlZ2lzdHJhdGlvbkxhc3RTZWVuID0gamlmZmllczsKKwlwcml2LT50eExhc3QgPSAwOworCXByaXYtPnR4X2NvbW1hbmRfZ2l2ZW4gPSAwOworCXByaXYtPnJ4X2NvbW1hbmRfZ2l2ZW4gPSAwOworCQorCXByaXYtPnJlUmVnaXN0ZXJFeHAgPSAxOworCXByaXYtPnR4X2xhc3Rfc2VudCA9IGppZmZpZXMgLSAxOworCXByaXYtPnR4X2xhc3RfY2xlYXJlZCA9IGppZmZpZXM7CisJcHJpdi0+Q29uZi0+d3JpdGVFRVBST00gPSAwOworCXByaXYtPkNvbmYtPnJlZ2lzdHJhdGlvbkludGVycnVwdHMgPSAxOworCisJaW5pdF90aW1lcigmcHJpdi0+dGltZXIpOworCXByaXYtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLyAxMDsKKwlwcml2LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKwlwcml2LT50aW1lci5mdW5jdGlvbiA9ICZhcmxhbl9yZWdpc3RyYXRpb25fdGltZXI7CS8qIHRpbWVyIGhhbmRsZXIgKi8KKworCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX1BPV0VSVVAgfCBBUkxBTl9DT01NQU5EX0xPTkdfV0FJVF9OT1cpOworCW1kZWxheSgyMDApOworCWFkZF90aW1lcigmcHJpdi0+dGltZXIpOworCisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fb3BlbiIpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGFybGFuX3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcHJpbnRrKEtFUk5fRVJSICIlczogYXJsYW4gdHJhbnNtaXQgdGltZWQgb3V0LCBrZXJuZWwgZGVjaWRlZFxuIiwgZGV2LT5uYW1lKTsKKwkvKiBUcnkgdG8gcmVzdGFydCB0aGUgYWRhcHRvci4gKi8KKwlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9DTEVBTl9BTkRfUkVTRVQpOworCS8vIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCS8vIG5ldGlmX3N0YXJ0X3F1ZXVlIChkZXYpOworfQorCisKK3N0YXRpYyBpbnQgYXJsYW5fdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzaG9ydCBsZW5ndGg7CisJdW5zaWduZWQgY2hhciAqYnVmOworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX3R4Iik7CisJCisJbGVuZ3RoID0gRVRIX1pMRU4gPCBza2ItPmxlbiA/IHNrYi0+bGVuIDogRVRIX1pMRU47CisJYnVmID0gc2tiLT5kYXRhOworCisJaWYgKGxlbmd0aCArIDB4MTIgPiAweDgwMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlRYIFJJTkcgb3ZlcmZsb3cgXG4iKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKwl9CisKKwlpZiAoYXJsYW5faHdfdHgoZGV2LCBidWYsIGxlbmd0aCkgPT0gLTEpCisJCWdvdG8gYmFkX2VuZDsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJZGV2X2tmcmVlX3NrYihza2IpOworCisJYXJsYW5fcHJvY2Vzc19pbnRlcnJ1cHQoZGV2KTsKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl90eCIpOworCXJldHVybiAwOworCitiYWRfZW5kOgorCWFybGFuX3Byb2Nlc3NfaW50ZXJydXB0KGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl90eCIpOworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IERvTm90UmVUcmFuc21pdENyYXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoVFhMQVNUKGRldikubGVuZ3RoIDwgcHJpdi0+Q29uZi0+UmVUcmFuc21pdFBhY2tldE1heFNpemUpCisJCXJldHVybiAxOworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbmxpbmUgaW50IERvTm90V2FpdFJlVHJhbnNtaXRDcmFwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKFRYTEFTVChkZXYpLmxlbmd0aCA8IHByaXYtPkNvbmYtPndhaXRSZVRyYW5zbWl0UGFja2V0TWF4U2l6ZSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmxhbl9xdWV1ZV9yZXRyYW5zbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX3F1ZXVlX3JldHJhbnNtaXQiKTsKKworCWlmIChEb05vdFdhaXRSZVRyYW5zbWl0Q3JhcChkZXYpKQorCXsKKwkJICBhcmxhbl9kcm9wX3R4KGRldik7CisJfSBlbHNlCisJCXByaXYtPlJlVHJhbnNtaXRSZXF1ZXN0ZWQrKzsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3F1ZXVlX3JldHJhbnNtaXQiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIFJldHJ5T3JGYWlsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJQVJMQU5fREVCVUdfRU5UUlkoIlJldHJ5T3JGYWlsIik7CisKKwlpZiAocHJpdi0+cmV0cmFuc21pc3Npb25zID4gcHJpdi0+Q29uZi0+cmV0cmllcyB8fAorCSAgICBEb05vdFJlVHJhbnNtaXRDcmFwKGRldikpCisJeworCQlhcmxhbl9kcm9wX3R4KGRldik7CisJfQorCWVsc2UgaWYgKHByaXYtPmJhZCA8PSBwcml2LT5Db25mLT5mYXN0UmVUcmFuc0NvdW50KQorCXsKKwkJYXJsYW5fcmV0cmFuc21pdF9ub3coZGV2KTsKKwl9CisJZWxzZSBhcmxhbl9xdWV1ZV9yZXRyYW5zbWl0KGRldik7CisKKwlBUkxBTl9ERUJVR19FWElUKCJSZXRyeU9yRmFpbCIpOworfQorCisKK3N0YXRpYyB2b2lkIGFybGFuX3R4X2RvbmVfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdGF0dXMpCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX3R4X2RvbmVfaW50ZXJydXB0Iik7CisKKwlwcml2LT50eF9sYXN0X2NsZWFyZWQgPSBqaWZmaWVzOworCXByaXYtPnR4X2NvbW1hbmRfZ2l2ZW4gPSAwOworCXN3aXRjaCAoc3RhdHVzKQorCXsKKwkJY2FzZSAxOgorCQl7CisJCQlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKQorCQkJCXByaW50aygiYXJsYW4gaW50cjogdHJhbnNtaXQgT0tcbiIpOworCQkJcHJpdi0+c3RhdHMudHhfcGFja2V0cysrOworCQkJcHJpdi0+YmFkID0gMDsKKwkJCXByaXYtPnJlc2V0ID0gMDsKKwkJCXByaXYtPnJldHJhbnNtaXNzaW9ucyA9IDA7CisJCQlpZiAocHJpdi0+Q29uZi0+dHhfZGVsYXlfbXMpCisJCQl7CisJCQkJcHJpdi0+dHhfZG9uZV9kZWxheWVkID0gamlmZmllcyArIChwcml2LT5Db25mLT50eF9kZWxheV9tcyAqIEhaKSAvIDEwMDAgKyAxOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCVRYTEFTVChkZXYpLm9mZnNldCA9IDA7CisJCQkJaWYgKHByaXYtPnR4TGFzdCkKKwkJCQkJcHJpdi0+dHhMYXN0ID0gMDsKKwkJCQllbHNlIGlmIChUWFRBSUwoZGV2KS5vZmZzZXQpCisJCQkJCXByaXYtPnR4TGFzdCA9IDE7CisJCQkJaWYgKFRYTEFTVChkZXYpLm9mZnNldCkKKwkJCQl7CisJCQkJCWFybGFuX3JldHJhbnNtaXRfbm93KGRldik7CisJCQkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJCX0KKwkJCQlpZiAoIVRYSEVBRChkZXYpLm9mZnNldCB8fCAhVFhUQUlMKGRldikub2Zmc2V0KQorCQkJCXsKKwkJCQkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisJCQorCQljYXNlIDI6CisJCXsKKwkJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pCisJCQkJcHJpbnRrKCJhcmxhbiBpbnRyOiB0cmFuc21pdCB0aW1lZCBvdXRcbiIpOworCQkJcHJpdi0+YmFkICs9IDE7CisJCQkvL2FybGFuX3F1ZXVlX3JldHJhbnNtaXQoZGV2KTsKKwkJCVJldHJ5T3JGYWlsKGRldik7CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSAzOgorCQl7CisJCQlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKQorCQkJCXByaW50aygiYXJsYW4gaW50cjogdHJhbnNtaXQgbWF4IHJldHJpZXNcbiIpOworCQkJcHJpdi0+YmFkICs9IDE7CisJCQlwcml2LT5yZXNldCA9IDA7CisJCQkvL2FybGFuX3F1ZXVlX3JldHJhbnNtaXQoZGV2KTsKKwkJCVJldHJ5T3JGYWlsKGRldik7CisJCX0KKwkJYnJlYWs7CisJCQorCQljYXNlIDQ6CisJCXsKKwkJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pCisJCQkJcHJpbnRrKCJhcmxhbiBpbnRyOiB0cmFuc21pdCBhYm9ydGVkXG4iKTsKKwkJCXByaXYtPmJhZCArPSAxOworCQkJYXJsYW5fcXVldWVfcmV0cmFuc21pdChkZXYpOworCQkJLy9SZXRyeU9yRmFpbChkZXYpOworCQl9CisJCWJyZWFrOworCisJCWNhc2UgNToKKwkJeworCQkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikKKwkJCQlwcmludGsoImFybGFuIGludHI6IHRyYW5zbWl0IG5vdCByZWdpc3RlcmVkXG4iKTsKKwkJCXByaXYtPmJhZCArPSAxOworCQkJLy9kZWJ1Zz0xMDE7CisJCQlhcmxhbl9xdWV1ZV9yZXRyYW5zbWl0KGRldik7CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSA2OgorCQl7CisJCQlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKSAKKwkJCQlwcmludGsoImFybGFuIGludHI6IHRyYW5zbWl0IGRlc3RpbmF0aW9uIGZ1bGxcbiIpOworCQkJcHJpdi0+YmFkICs9IDE7CisJCQlwcml2LT5yZXNldCA9IDA7CisJCQkvL2FybGFuX2Ryb3BfdHgoZGV2KTsKKwkJCWFybGFuX3F1ZXVlX3JldHJhbnNtaXQoZGV2KTsKKwkJfQorCQlicmVhazsKKworCQljYXNlIDc6CisJCXsKKwkJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pCisJCQkJcHJpbnRrKCJhcmxhbiBpbnRyOiB0cmFuc21pdCB1bmtub3duIGFja1xuIik7CisJCQlwcml2LT5iYWQgKz0gMTsKKwkJCXByaXYtPnJlc2V0ID0gMDsKKwkJCWFybGFuX3F1ZXVlX3JldHJhbnNtaXQoZGV2KTsKKwkJfQorCQlicmVhazsKKwkJCisJCWNhc2UgODoKKwkJeworCQkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikKKwkJCQlwcmludGsoImFybGFuIGludHI6IHRyYW5zbWl0IGRlc3QgbWFpbCBib3ggZnVsbFxuIik7CisJCQlwcml2LT5iYWQgKz0gMTsKKwkJCXByaXYtPnJlc2V0ID0gMDsKKwkJCS8vYXJsYW5fZHJvcF90eChkZXYpOworCQkJYXJsYW5fcXVldWVfcmV0cmFuc21pdChkZXYpOworCQl9CisJCWJyZWFrOworCisJCWNhc2UgOToKKwkJeworCQkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikKKwkJCQlwcmludGsoImFybGFuIGludHI6IHRyYW5zbWl0IHJvb3QgZGVzdCBub3QgcmVnLlxuIik7CisJCQlwcml2LT5iYWQgKz0gMTsKKwkJCXByaXYtPnJlc2V0ID0gMTsKKwkJCS8vYXJsYW5fZHJvcF90eChkZXYpOworCQkJYXJsYW5fcXVldWVfcmV0cmFuc21pdChkZXYpOworCQl9CisJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCXsKKwkJCXByaW50ayhLRVJOX0VSUiAiYXJsYW4gaW50cjogdHJhbnNtaXQgc3RhdHVzIHVua25vd25cbiIpOworCQkJcHJpdi0+YmFkICs9IDE7CisJCQlwcml2LT5yZXNldCA9IDE7CisJCQlhcmxhbl9kcm9wX3R4KGRldik7CisJCX0KKwl9CisKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl90eF9kb25lX2ludGVycnVwdCIpOworfQorCisKK3N0YXRpYyB2b2lkIGFybGFuX3J4X2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgcnhTdGF0dXMsIHVfc2hvcnQgcnhPZmZzZXQsIHVfc2hvcnQgcGt0X2xlbikKK3sKKwljaGFyICpza2J0bXA7CisJaW50IGkgPSAwOworCisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBhcmxhbl9zaG1lbSBfX2lvbWVtICphcmxhbiA9IHByaXYtPmNhcmQ7CisJc3RydWN0IGFybGFuX2NvbmZfc3RydSAqY29uZiA9IHByaXYtPkNvbmY7CisKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9yeF9pbnRlcnJ1cHQiKTsKKwkvLyBieSBzcGVjLCAgIG5vdCAgICAgICAgICAgICAgICBXUklURVNITUIoYXJsYW4tPnJ4U3RhdHVzLDB4MDApOworCS8vIHByb2hpYml0ZWQgaGVyZSAgICAgICAgICAgICAgYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfUlgpOworCisJaWYgKHBrdF9sZW4gPCAxMCB8fCBwa3RfbGVuID4gMjA0OCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBnb3QgdG9vIHNob3J0IG9yIGxvbmcgcGFja2V0LCBsZW4gJWQgXG4iLCBkZXYtPm5hbWUsIHBrdF9sZW4pOworCQlyZXR1cm47CisJfQorCWlmIChyeE9mZnNldCArIHBrdF9sZW4gPiAweDIwMDApCisJeworCQlwcmludGsoIiVzOiBnb3QgdG9vIGxvbmcgcGFja2V0LCBsZW4gJWQgb2Zmc2V0ICV4XG4iLCBkZXYtPm5hbWUsIHBrdF9sZW4sIHJ4T2Zmc2V0KTsKKwkJcmV0dXJuOworCX0KKwlwcml2LT5pbl9ieXRlcyArPSBwa3RfbGVuOworCXByaXYtPmluX2J5dGVzMTAgKz0gcGt0X2xlbjsKKwlpZiAoY29uZi0+bWVhc3VyZV9yYXRlIDwgMSkKKwkJY29uZi0+bWVhc3VyZV9yYXRlID0gMTsKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBwcml2LT5pbl90aW1lICsgY29uZi0+bWVhc3VyZV9yYXRlICogSFopKQorCXsKKwkJY29uZi0+aW5fc3BlZWQgPSBwcml2LT5pbl9ieXRlcyAvIGNvbmYtPm1lYXN1cmVfcmF0ZTsKKwkJcHJpdi0+aW5fYnl0ZXMgPSAwOworCQlwcml2LT5pbl90aW1lID0gamlmZmllczsKKwl9CisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgcHJpdi0+aW5fdGltZTEwICsgY29uZi0+bWVhc3VyZV9yYXRlICogMTAqSFopKQorCXsKKwkJY29uZi0+aW5fc3BlZWQxMCA9IHByaXYtPmluX2J5dGVzMTAgLyAoMTAgKiBjb25mLT5tZWFzdXJlX3JhdGUpOworCQlwcml2LT5pbl9ieXRlczEwID0gMDsKKwkJcHJpdi0+aW5fdGltZTEwID0gamlmZmllczsKKwl9CisJREVCVUdTSE0oMSwgImFybGFuIHJjdiBwa3QgcnhTdGF0dXM9ICVkICIsIGFybGFuLT5yeFN0YXR1cywgdV9jaGFyKTsKKwlzd2l0Y2ggKHJ4U3RhdHVzKQorCXsKKwkJY2FzZSAxOgorCQljYXNlIDI6CisJCWNhc2UgMzoKKwkJeworCQkJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuICovCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlERUJVR1NITSg1MCwgImFybGFuIHJlY3YgcGt0IG9mZnM9JWRcbiIsIGFybGFuLT5yeE9mZnNldCwgdV9zaG9ydCk7CisJCQlERUJVR1NITSgxLCAiYXJsYW4gcnhGcm1UeXBlID0gJWQgXG4iLCBhcmxhbi0+cnhGcm1UeXBlLCB1X2NoYXIpOworCQkJREVCVUdTSE0oMSwgS0VSTl9JTkZPICJhcmxhbiByeCBzY3JhbWJsZWQgPSAlZCBcbiIsIGFybGFuLT5zY3JhbWJsZWQsIHVfY2hhcik7CisKKwkJCS8qIGhlcmUgd2UgZG8gbXVsdGljYXN0IGZpbHRlcmluZyB0byBhdm9pZCBzbG93IDgtYml0IG1lbWNvcHkgKi8KKyNpZmRlZiBBUkxBTl9NVUxUSUNBU1QKKwkJCWlmICghKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpICYmCisJCQkJIShkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpICYmCisJCQkJZGV2LT5tY19saXN0KQorCQkJeworCQkJCWNoYXIgaHdfZHN0X2FkZHJbNl07CisJCQkJc3RydWN0IGRldl9tY19saXN0ICpkbWkgPSBkZXYtPm1jX2xpc3Q7CisJCQkJaW50IGk7CisKKwkJCQltZW1jcHlfZnJvbWlvKGh3X2RzdF9hZGRyLCBhcmxhbi0+dWx0aW1hdGVEZXN0QWRkcmVzcywgNik7CisJCQkJaWYgKGh3X2RzdF9hZGRyWzBdID09IDB4MDEpCisJCQkJeworCQkJCQlpZiAobWRlYnVnKQorCQkJCQkJaWYgKGh3X2RzdF9hZGRyWzFdID09IDB4MDApCisJCQkJCQkJcHJpbnRrKEtFUk5fRVJSICIlcyBtY2FzdCAweDAxMDAgXG4iLCBkZXYtPm5hbWUpOworCQkJCQkJZWxzZSBpZiAoaHdfZHN0X2FkZHJbMV0gPT0gMHg0MCkKKwkJCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzIG0vYmNhc3QgMHgwMTQwIFxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJd2hpbGUgKGRtaSkKKwkJCQkJewkJCQkJCQlpZiAoZG1pLT5kbWlfYWRkcmxlbiA9PSA2KQorCQkJCQkJeworCQkJCQkJCWlmIChhcmxhbl9kZWJ1ZyAmIEFSTEFOX0RFQlVHX0hFQURFUl9EVU1QKQorCQkJCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzIG1jbCAlMng6JTJ4OiUyeDolMng6JTJ4OiUyeCBcbiIsIGRldi0+bmFtZSwKKwkJCQkJCQkJCQkgZG1pLT5kbWlfYWRkclswXSwgZG1pLT5kbWlfYWRkclsxXSwgZG1pLT5kbWlfYWRkclsyXSwKKwkJCQkJCQkJCQkgZG1pLT5kbWlfYWRkclszXSwgZG1pLT5kbWlfYWRkcls0XSwgZG1pLT5kbWlfYWRkcls1XSk7CisJCQkJCQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCQkJCQkJaWYgKGRtaS0+ZG1pX2FkZHJbaV0gIT0gaHdfZHN0X2FkZHJbaV0pCisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQlpZiAoaSA9PSA2KQorCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbnZhbGlkIG11bHRpY2FzdCBhZGRyZXNzIGxlbmd0aCBnaXZlbi5cbiIsIGRldi0+bmFtZSk7CisJCQkJCQlkbWkgPSBkbWktPm5leHQ7CisJCQkJCX0KKwkJCQkJLyogd2UgcmVhY2ggaGVyZSBpZiBtdWx0aWNhc3QgZmlsdGVyaW5nIGlzIG9uIGFuZCBwYWNrZXQgCisJCQkJCSAqIGlzIG11bHRpY2FzdCBhbmQgbm90IGZvciByZWNlaXZlICovCisJCQkJCWdvdG8gZW5kX29mX2ludGVycnVwdDsKKwkJCQl9CisJCQl9CisjZW5kaWYJCQkJLy8gQVJMQU5fTVVMVElDQVNUCisJCQkvKiBtdWx0aWNhc3QgZmlsdGVyaW5nIGVuZHMgaGVyZSAqLworCQkJcGt0X2xlbiArPSBBUkxBTl9GQUtFX0hEUl9MRU47CisKKwkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDQpOworCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCQkJCXByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJCQlza2ItPmRldiA9IGRldjsKKwkJCXNrYnRtcCA9IHNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKworCQkJbWVtY3B5X2Zyb21pbyhza2J0bXAgKyBBUkxBTl9GQUtFX0hEUl9MRU4sICgoY2hhciBfX2lvbWVtICopIGFybGFuKSArIHJ4T2Zmc2V0LCBwa3RfbGVuIC0gQVJMQU5fRkFLRV9IRFJfTEVOKTsKKwkJCW1lbWNweV9mcm9taW8oc2tidG1wLCBhcmxhbi0+dWx0aW1hdGVEZXN0QWRkcmVzcywgNik7CisJCQltZW1jcHlfZnJvbWlvKHNrYnRtcCArIDYsIGFybGFuLT5yeFNyYywgNik7CisJCQlXUklURVNITUIoYXJsYW4tPnJ4U3RhdHVzLCAweDAwKTsKKwkJCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX1JYKTsKKworCQkJSUZERUJVRyhBUkxBTl9ERUJVR19IRUFERVJfRFVNUCkKKwkJCXsKKwkJCQljaGFyIGltbWVkRGVzdEFkZHJlc3NbNl07CisJCQkJY2hhciBpbW1lZFNyY0FkZHJlc3NbNl07CisJCQkJbWVtY3B5X2Zyb21pbyhpbW1lZERlc3RBZGRyZXNzLCBhcmxhbi0+aW1tZWREZXN0QWRkcmVzcywgNik7CisJCQkJbWVtY3B5X2Zyb21pbyhpbW1lZFNyY0FkZHJlc3MsIGFybGFuLT5pbW1lZFNyY0FkZHJlc3MsIDYpOworCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgdCAlMng6JTJ4OiUyeDolMng6JTJ4OiUyeCBmICUyeDolMng6JTJ4OiUyeDolMng6JTJ4IGltZCAlMng6JTJ4OiUyeDolMng6JTJ4OiUyeCBpbXMgJTJ4OiUyeDolMng6JTJ4OiUyeDolMnhcbiIsIGRldi0+bmFtZSwKKwkJCQkJKHVuc2lnbmVkIGNoYXIpIHNrYnRtcFswXSwgKHVuc2lnbmVkIGNoYXIpIHNrYnRtcFsxXSwgKHVuc2lnbmVkIGNoYXIpIHNrYnRtcFsyXSwgKHVuc2lnbmVkIGNoYXIpIHNrYnRtcFszXSwKKwkJCQkJKHVuc2lnbmVkIGNoYXIpIHNrYnRtcFs0XSwgKHVuc2lnbmVkIGNoYXIpIHNrYnRtcFs1XSwgKHVuc2lnbmVkIGNoYXIpIHNrYnRtcFs2XSwgKHVuc2lnbmVkIGNoYXIpIHNrYnRtcFs3XSwKKwkJCQkJKHVuc2lnbmVkIGNoYXIpIHNrYnRtcFs4XSwgKHVuc2lnbmVkIGNoYXIpIHNrYnRtcFs5XSwgKHVuc2lnbmVkIGNoYXIpIHNrYnRtcFsxMF0sICh1bnNpZ25lZCBjaGFyKSBza2J0bXBbMTFdLAorCQkJCQlpbW1lZERlc3RBZGRyZXNzWzBdLCBpbW1lZERlc3RBZGRyZXNzWzFdLCBpbW1lZERlc3RBZGRyZXNzWzJdLAorCQkJCQlpbW1lZERlc3RBZGRyZXNzWzNdLCBpbW1lZERlc3RBZGRyZXNzWzRdLCBpbW1lZERlc3RBZGRyZXNzWzVdLAorCQkJCQlpbW1lZFNyY0FkZHJlc3NbMF0sIGltbWVkU3JjQWRkcmVzc1sxXSwgaW1tZWRTcmNBZGRyZXNzWzJdLAorCQkJCQlpbW1lZFNyY0FkZHJlc3NbM10sIGltbWVkU3JjQWRkcmVzc1s0XSwgaW1tZWRTcmNBZGRyZXNzWzVdKTsKKwkJCX0KKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQlJRkRFQlVHKEFSTEFOX0RFQlVHX0hFQURFUl9EVU1QKQorCQkJCWlmIChza2ItPnByb3RvY29sICE9IDB4NjA4ICYmIHNrYi0+cHJvdG9jb2wgIT0gMHg4KQorCQkJCXsKKwkJCQkJZm9yIChpID0gMDsgaSA8PSAyMjsgaSsrKQorCQkJCQkJcHJpbnRrKCIlMDJ4OiIsICh1X2NoYXIpIHNrYnRtcFtpICsgMTJdKTsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJcbiIpOworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhcmxhbiBrZXJuZWwgcGt0IHR5cGUgdHJhbnMgJXggXG4iLCBza2ItPnByb3RvY29sKTsKKwkJCQl9CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCX0KKwkJYnJlYWs7CisJCQorCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJhcmxhbiBpbnRyOiByZWNlaXZlZCB1bmtub3duIHN0YXR1c1xuIik7CisJCQlwcml2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlicmVhazsKKwl9CisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fcnhfaW50ZXJydXB0Iik7Cit9CisKK3N0YXRpYyB2b2lkIGFybGFuX3Byb2Nlc3NfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBhcmxhbl9zaG1lbSBfX2lvbWVtICphcmxhbiA9IHByaXYtPmNhcmQ7CisJdV9jaGFyIHJ4U3RhdHVzID0gUkVBRFNITUIoYXJsYW4tPnJ4U3RhdHVzKTsKKwl1X2NoYXIgdHhTdGF0dXMgPSBSRUFEU0hNQihhcmxhbi0+dHhTdGF0dXMpOworCXVfc2hvcnQgcnhPZmZzZXQgPSBSRUFEU0hNUyhhcmxhbi0+cnhPZmZzZXQpOworCXVfc2hvcnQgcGt0X2xlbiA9IFJFQURTSE1TKGFybGFuLT5yeExlbmd0aCk7CisJaW50IGludGVycnVwdF9jb3VudCA9IDA7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fcHJvY2Vzc19pbnRlcnJ1cHQiKTsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICh2b2lkICopICZwcml2LT5pbnRlcnJ1cHRfcHJvY2Vzc2luZ19hY3RpdmUpKQorCXsKKwkJaWYgKGFybGFuX2RlYnVnICYgQVJMQU5fREVCVUdfQ0hBSU5fTE9DS1MpCisJCQlwcmludGsoS0VSTl9FUlIgImludGVycnVwdCBjaGFpbiByZWVudGVyaW5nIFxuIik7CisJCWdvdG8gZW5kX2ludF9wcm9jZXNzOworCX0KKwl3aGlsZSAoKHJ4U3RhdHVzIHx8IHR4U3RhdHVzIHx8IHByaXYtPmludGVycnVwdF9hY2tfcmVxdWVzdGVkKQorCQkJJiYgKGludGVycnVwdF9jb3VudCA8IDUpKQorCXsKKwkJaWYgKHJ4U3RhdHVzKQorCQkJcHJpdi0+bGFzdF9yeF9pbnRfYWNrX3RpbWUgPSBqaWZmaWVzOworCisJCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX0lOVF9BQ0spOworCQlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9JTlRfRU5BQkxFKTsKKwkJCisJCUlGREVCVUcoQVJMQU5fREVCVUdfSU5URVJSVVBUKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogIGdvdCBJUlEgcnggJXggdHggJXggY29tbSAleCByeE9mZiAleCByeExlbiAleCBcbiIsCisJCQkJCWRldi0+bmFtZSwgcnhTdGF0dXMsIHR4U3RhdHVzLCBSRUFEU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUpLAorCQkJCQlyeE9mZnNldCwgcGt0X2xlbik7CisKKwkJaWYgKHJ4U3RhdHVzID09IDAgJiYgdHhTdGF0dXMgPT0gMCkKKwkJeworCQkJaWYgKHByaXYtPmlycV90ZXN0X2RvbmUpCisJCQl7CisJCQkJaWYgKCFyZWdpc3RyYXRpb25CYWQoZGV2KSkKKwkJCQkJSUZERUJVRyhBUkxBTl9ERUJVR19JTlRFUlJVUFQpIHByaW50ayhLRVJOX0VSUiAiJXMgdW5rbm93biBpbnRlcnJ1cHQobm9wPyByZWdMb3N0ID8pIHJlYXNvbiB0eCAlZCByeCAlZCAiLAorCQkJCQkJCQkJCSAgICBkZXYtPm5hbWUsIHR4U3RhdHVzLCByeFN0YXR1cyk7CisJCQl9IGVsc2UgeworCQkJCUlGREVCVUcoQVJMQU5fREVCVUdfSU5URVJSVVBUKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlcyBpcnEgJCVkIHRlc3QgT0sgXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKworCQkJfQorCQkJcHJpdi0+aW50ZXJydXB0X2Fja19yZXF1ZXN0ZWQgPSAwOworCQkJZ290byBlbmRzOworCQl9CisJCWlmICh0eFN0YXR1cyAhPSAwKQorCQl7CisJCQlXUklURVNITUIoYXJsYW4tPnR4U3RhdHVzLCAweDAwKTsKKwkJCWFybGFuX3R4X2RvbmVfaW50ZXJydXB0KGRldiwgdHhTdGF0dXMpOworCQkJZ290byBlbmRzOworCQl9CisJCWlmIChyeFN0YXR1cyA9PSAxIHx8IHJ4U3RhdHVzID09IDIpCisJCXsJCS8qIGEgcGFja2V0IHdhaXRpbmcgKi8KKwkJCWFybGFuX3J4X2ludGVycnVwdChkZXYsIHJ4U3RhdHVzLCByeE9mZnNldCwgcGt0X2xlbik7CisJCQlnb3RvIGVuZHM7CisJCX0KKwkJaWYgKHJ4U3RhdHVzID4gMiAmJiByeFN0YXR1cyA8IDB4ZmYpCisJCXsKKwkJCVdSSVRFU0hNQihhcmxhbi0+cnhTdGF0dXMsIDB4MDApOworCQkJcHJpbnRrKEtFUk5fRVJSICIlcyB1bmtub3duIHJ4U3RhdHVzIHJlYXNvbiB0eCAlZCByeCAlZCAiLAorCQkJCWRldi0+bmFtZSwgdHhTdGF0dXMsIHJ4U3RhdHVzKTsKKwkJCWdvdG8gZW5kczsKKwkJfQorCQlpZiAocnhTdGF0dXMgPT0gMHhmZikKKwkJeworCQkJV1JJVEVTSE1CKGFybGFuLT5yeFN0YXR1cywgMHgwMCk7CisJCQlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9SWCk7CisJCQlpZiAocmVnaXN0cmF0aW9uQmFkKGRldikpCisJCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQkJaWYgKCFyZWdpc3RyYXRpb25CYWQoZGV2KSkKKwkJCXsKKwkJCQlwcml2LT5yZWdpc3RyYXRpb25MYXN0U2VlbiA9IGppZmZpZXM7CisJCQkJaWYgKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYgIXByaXYtPnVuZGVyX3Jlc2V0ICYmICFwcml2LT51bmRlcl9jb25maWcpCisJCQkJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJCQl9CisJCQlnb3RvIGVuZHM7CisJCX0KK2VuZHM6CisKKwkJYXJsYW5fY29tbWFuZF9wcm9jZXNzKGRldik7CisKKwkJcnhTdGF0dXMgPSBSRUFEU0hNQihhcmxhbi0+cnhTdGF0dXMpOworCQl0eFN0YXR1cyA9IFJFQURTSE1CKGFybGFuLT50eFN0YXR1cyk7CisJCXJ4T2Zmc2V0ID0gUkVBRFNITVMoYXJsYW4tPnJ4T2Zmc2V0KTsKKwkJcGt0X2xlbiA9IFJFQURTSE1TKGFybGFuLT5yeExlbmd0aCk7CisKKworCQlwcml2LT5pcnFfdGVzdF9kb25lID0gMTsKKworCQlpbnRlcnJ1cHRfY291bnQrKzsKKwl9CisJcHJpdi0+aW50ZXJydXB0X3Byb2Nlc3NpbmdfYWN0aXZlID0gMDsKKworZW5kX2ludF9wcm9jZXNzOgorCWFybGFuX2NvbW1hbmRfcHJvY2VzcyhkZXYpOworCisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fcHJvY2Vzc19pbnRlcnJ1cHQiKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhcmxhbl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYXJsYW5fc2htZW0gX19pb21lbSAqYXJsYW4gPSBwcml2LT5jYXJkOworCXVfY2hhciByeFN0YXR1cyA9IFJFQURTSE1CKGFybGFuLT5yeFN0YXR1cyk7CisJdV9jaGFyIHR4U3RhdHVzID0gUkVBRFNITUIoYXJsYW4tPnR4U3RhdHVzKTsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9pbnRlcnJ1cHQiKTsKKworCisJaWYgKCFyeFN0YXR1cyAmJiAhdHhTdGF0dXMpCisJCXByaXYtPmludGVycnVwdF9hY2tfcmVxdWVzdGVkKys7CisKKwlhcmxhbl9wcm9jZXNzX2ludGVycnVwdChkZXYpOworCQorCXByaXYtPmlycV90ZXN0X2RvbmUgPSAxOworCisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5faW50ZXJydXB0Iik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworCit9CisKKworc3RhdGljIGludCBhcmxhbl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9jbG9zZSIpOworCisJZGVsX3RpbWVyX3N5bmMoJnByaXYtPnRpbWVyKTsKKworCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX1BPV0VSRE9XTik7CisKKwlJRkRFQlVHKEFSTEFOX0RFQlVHX1NUQVJUVVApCisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IENsb3NpbmcgZGV2aWNlXG4iLCBkZXYtPm5hbWUpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fY2xvc2UiKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIEFSTEFOX0RFQlVHR0lORworc3RhdGljIGxvbmcgYWxpZ25Mb25nKHZvbGF0aWxlIHVfY2hhciAqIHB0cikKK3sKKwlsb25nIHJldDsKKwltZW1jcHlfZnJvbWlvKCZyZXQsICh2b2lkICopIHB0ciwgNCk7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisvKgorICogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCisgKiBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY2FyZCBvcGVuIG9yIGNsb3NlZC4KKyAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmFybGFuX3N0YXRpc3RpY3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX3N0YXRpc3RpY3MiKTsKKworCS8qIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyBmcm9tIHRoZSBkZXZpY2UgcmVnaXN0ZXJzLiAqLworCisJUkVBRFNITShwcml2LT5zdGF0cy5jb2xsaXNpb25zLCBhcmxhbi0+bnVtUmVUcmFuc21pc3Npb25zLCB1X2ludCk7CisJUkVBRFNITShwcml2LT5zdGF0cy5yeF9jcmNfZXJyb3JzLCBhcmxhbi0+bnVtQ1JDRXJyb3JzLCB1X2ludCk7CisJUkVBRFNITShwcml2LT5zdGF0cy5yeF9kcm9wcGVkLCBhcmxhbi0+bnVtRnJhbWVzRGlzY2FyZGVkLCB1X2ludCk7CisJUkVBRFNITShwcml2LT5zdGF0cy5yeF9maWZvX2Vycm9ycywgYXJsYW4tPm51bVJYQnVmZmVyT3ZlcmZsb3dzLCB1X2ludCk7CisJUkVBRFNITShwcml2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMsIGFybGFuLT5udW1SZWNlaXZlRnJhbWVzTG9zdCwgdV9pbnQpOworCVJFQURTSE0ocHJpdi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMsIGFybGFuLT5udW1SWE92ZXJydW5zLCB1X2ludCk7CisJUkVBRFNITShwcml2LT5zdGF0cy5yeF9wYWNrZXRzLCBhcmxhbi0+bnVtRGF0YWdyYW1zUmVjZWl2ZWQsIHVfaW50KTsKKwlSRUFEU0hNKHByaXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzLCBhcmxhbi0+bnVtQWJvcnRFcnJvcnMsIHVfaW50KTsKKwlSRUFEU0hNKHByaXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzLCBhcmxhbi0+bnVtU3RhdHVzVGltZW91dHMsIHVfaW50KTsKKwlSRUFEU0hNKHByaXYtPnN0YXRzLnR4X2Ryb3BwZWQsIGFybGFuLT5udW1EYXRhZ3JhbXNEaXNjYXJkZWQsIHVfaW50KTsKKwlSRUFEU0hNKHByaXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzLCBhcmxhbi0+bnVtVFhVbmRlcnJ1bnMsIHVfaW50KTsKKwlSRUFEU0hNKHByaXYtPnN0YXRzLnR4X3BhY2tldHMsIGFybGFuLT5udW1EYXRhZ3JhbXNUcmFuc21pdHRlZCwgdV9pbnQpOworCVJFQURTSE0ocHJpdi0+c3RhdHMudHhfd2luZG93X2Vycm9ycywgYXJsYW4tPm51bUhvbGRPZmZzLCB1X2ludCk7CisKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9zdGF0aXN0aWNzIik7CisKKwlyZXR1cm4gJnByaXYtPnN0YXRzOworfQorCisKK3N0YXRpYyB2b2lkIGFybGFuX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKwlzdHJ1Y3QgYXJsYW5fY29uZl9zdHJ1ICpjb25mID0gcHJpdi0+Q29uZjsKKwlpbnQgYm9hcmRfY29uZl9uZWVkZWQgPSAwOworCisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fc2V0X211bHRpY2FzdCIpOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwl7CisJCXVuc2lnbmVkIGNoYXIgcmVjTW9kZTsKKwkJUkVBRFNITShyZWNNb2RlLCBhcmxhbi0+cmVjZWl2ZU1vZGUsIHVfY2hhcik7CisJCWNvbmYtPnJlY2VpdmVNb2RlID0gKEFSTEFOX1JDVl9QUk9NSVNDIHwgQVJMQU5fUkNWX0NPTlRST0wpOworCQlpZiAoY29uZi0+cmVjZWl2ZU1vZGUgIT0gcmVjTW9kZSkKKwkJCWJvYXJkX2NvbmZfbmVlZGVkID0gMTsKKwl9CisJZWxzZQorCXsKKwkJLyogdHVybiBvZmYgcHJvbWlzY3VvdXMgbW9kZSAgKi8KKwkJdW5zaWduZWQgY2hhciByZWNNb2RlOworCQlSRUFEU0hNKHJlY01vZGUsIGFybGFuLT5yZWNlaXZlTW9kZSwgdV9jaGFyKTsKKwkJY29uZi0+cmVjZWl2ZU1vZGUgPSBBUkxBTl9SQ1ZfQ0xFQU4gfCBBUkxBTl9SQ1ZfQ09OVFJPTDsKKwkJaWYgKGNvbmYtPnJlY2VpdmVNb2RlICE9IHJlY01vZGUpCisJCQlib2FyZF9jb25mX25lZWRlZCA9IDE7CisJfQorCWlmIChib2FyZF9jb25mX25lZWRlZCkKKwkJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfQ09ORik7CisKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9zZXRfbXVsdGljYXN0Iik7Cit9CisKKworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgYXJsYW5fcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgZXJyOworCWludCBtOworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX3Byb2JlIik7CisKKwlpZiAoYXJsYW5zX2ZvdW5kID09IE1BWF9BUkxBTlMpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisJLyogCisJICogUmVzZXJ2ZSBzcGFjZSBmb3IgbG9jYWwgZGF0YSBhbmQgYSBjb3B5IG9mIHRoZSBzaGFyZWQgbWVtb3J5CisJICogdGhhdCBpcyB1c2VkIGJ5IHRoZSAvcHJvYyBpbnRlcmZhY2UuCisJICovCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBhcmxhbl9wcml2YXRlKQorCQkJICAgICArIHNpemVvZihzdHJ1Y3QgYXJsYW5fc2htZW0pKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwkJCisJCWlmIChkZXYtPm1lbV9zdGFydCkgeworCQkJaWYgKGFybGFuX3Byb2JlX2hlcmUoZGV2LCBkZXYtPm1lbV9zdGFydCkgPT0gMCkKKwkJCQlnb3RvIGZvdW5kOworCQkJZ290byBub3RfZm91bmQ7CisJCX0KKwkJCQorCX0KKworCisJZm9yIChtID0gKGludClwaHlzX3RvX3ZpcnQobGFzdEZvdW5kQXQpICsgQVJMQU5fU0hNRU1fU0laRTsgCisJICAgICBtIDw9IChpbnQpcGh5c190b192aXJ0KDB4REUwMDApOyAKKwkgICAgIG0gKz0gQVJMQU5fU0hNRU1fU0laRSkKKwl7CisJCWlmIChhcmxhbl9wcm9iZV9oZXJlKGRldiwgbSkgPT0gMCkKKwkJeworCQkJbGFzdEZvdW5kQXQgPSAoaW50KXZpcnRfdG9fcGh5cygodm9pZCopbSk7CisJCQlnb3RvIGZvdW5kOworCQl9CisJfQorCisJaWYgKGxhc3RGb3VuZEF0ID09IDB4YmUwMDApCisJCXByaW50ayhLRVJOX0VSUiAiYXJsYW46IE5vIEFybGFuIGRldmljZXMgZm91bmQgXG4iKTsKKworIG5vdF9mb3VuZDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisgZm91bmQ6CisJZXJyID0gYXJsYW5fc2V0dXBfZGV2aWNlKGRldiwgYXJsYW5zX2ZvdW5kKTsKKwlpZiAoZXJyKQorCQlkZXYgPSBFUlJfUFRSKGVycik7CisJZWxzZSBpZiAoIWFybGFuc19mb3VuZCsrKQorCQlwcmludGsoS0VSTl9JTkZPICJBcmxhbiBkcml2ZXIgJXNcbiIsIGFybGFuX3ZlcnNpb24pOworCisJcmV0dXJuIGRldjsKK30KKworI2lmZGVmICBNT0RVTEUKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWludCBpID0gMDsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJpbml0X21vZHVsZSIpOworCisJaWYgKGNoYW5uZWxTZXQgIT0gY2hhbm5lbFNldFVOS05PV04gfHwgY2hhbm5lbE51bWJlciAhPSBjaGFubmVsTnVtYmVyVU5LTk9XTiB8fCBzeXN0ZW1JZCAhPSBzeXN0ZW1JZFVOS05PV04pCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9BUkxBTlM7IGkrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYXJsYW5fcHJvYmUoaSk7CisKKwkJaWYgKElTX0VSUihkZXYpKSAKKwkJCXJldHVybiBQVFJfRVJSKGRldik7CisJfQorCWluaXRfYXJsYW5fcHJvYygpOworCXByaW50ayhLRVJOX0lORk8gIkFybGFuIGRyaXZlciAlc1xuIiwgYXJsYW5fdmVyc2lvbik7CisJQVJMQU5fREVCVUdfRVhJVCgiaW5pdF9tb2R1bGUiKTsKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IGkgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiY2xlYW51cF9tb2R1bGUiKTsKKworCUlGREVCVUcoQVJMQU5fREVCVUdfU0hVVERPV04pCisJCXByaW50ayhLRVJOX0lORk8gImFybGFuOiB1bmxvYWRpbmcgbW9kdWxlXG4iKTsKKworCWNsZWFudXBfYXJsYW5fcHJvYygpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9BUkxBTlM7IGkrKykKKwl7CisJCWRldiA9IGFybGFuX2RldmljZVtpXTsKKwkJaWYgKGRldikgeworCQkJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfUE9XRVJET1dOICk7CisKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQlyZWxlYXNlX21lbV9yZWdpb24odmlydF90b19waHlzKCh2b2lkICopIGRldi0+bWVtX3N0YXJ0KSwgCisJCQkJCSAgIEFSTEFOX1NITUVNX1NJWkUpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCWFybGFuX2RldmljZVtpXSA9IE5VTEw7CisJCX0KKwl9CisKKwlBUkxBTl9ERUJVR19FWElUKCJjbGVhbnVwX21vZHVsZSIpOworfQorCisKKyNlbmRpZgorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXJsYW4tcHJvYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXJsYW4tcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyY2NhNTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hcmxhbi1wcm9jLmMKQEAgLTAsMCArMSwxMjYyIEBACisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSAiYXJsYW4uaCIKKworI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworLyogdm9pZCBlbmFibGVSZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworKi8KKworCisKKyNkZWZpbmUgQVJMQU5fU1RSX1NJWkUgCTB4MmZmMAorI2RlZmluZSBERVZfQVJMQU5fSU5GTyAJMQorI2RlZmluZSBERVZfQVJMQU4gCTEKKyNkZWZpbmUgU0FSTEcodHlwZSx2YXIpIHtcCisJcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbytwb3MsICIlc1x0PVx0MHgleFxuIiwgI3ZhciwgUkVBRFNITUIocHJpdmEtPmNhcmQtPnZhcikpOwlcCisJfQorCisjZGVmaW5lIFNBUkxCTih0eXBlLHZhcixubikge1wKKwlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvK3BvcywgIiVzXHQ9XHQweCIsI3Zhcik7XAorCWZvciAoaT0wOyBpIDwgbm47IGkrKyApIHBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8rcG9zLCAiJTAyeCIsUkVBRFNITUIocHJpdmEtPmNhcmQtPnZhcltpXSkpO1wKKwlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvK3BvcywgIlxuIik7CVwKKwl9CisKKyNkZWZpbmUgU0FSTEJOcGxuKHR5cGUsdmFyLG5uKSB7XAorCWZvciAoaT0wOyBpIDwgbm47IGkrKyApIHBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8rcG9zLCAiJTAyeCIsUkVBRFNITUIocHJpdmEtPmNhcmQtPnZhcltpXSkpO1wKKwl9CisKKyNkZWZpbmUgU0FSTFNUUih2YXIsbm4pIHtcCisJY2hhciB0bXBTdHJbNDAwXTtcCisJaW50ICB0bXBMbiA9IG5uO1wKKwlpZiAobm4gPiAzOTkgKSB0bXBMbiA9IDM5OTsgXAorCW1lbWNweSh0bXBTdHIsKGNoYXIgKikgcHJpdmEtPmNvbmYtPnZhcix0bXBMbik7XAorCXRtcFN0clt0bXBMbl0gPSAwOyBcCisJcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbytwb3MsICIlc1x0PVx0JXMgXG4iLCN2YXIscHJpdmEtPmNvbmYtPnZhcik7XAorCX0KKworI2RlZmluZSBTQVJMVUModmFyKSAgCVNBUkxHKHVfY2hhciwgdmFyKQorI2RlZmluZSBTQVJMVUNOKHZhcixubikgU0FSTEJOKHVfY2hhcix2YXIsIG5uKQorI2RlZmluZSBTQVJMVVModmFyKQlTQVJMRyh1X3Nob3J0LCB2YXIpCisjZGVmaW5lIFNBUkxVU04odmFyLG5uKQlTQVJMQk4odV9zaG9ydCx2YXIsIG5uKQorI2RlZmluZSBTQVJMVUkodmFyKQlTQVJMRyh1X2ludCwgdmFyKQorCisjZGVmaW5lIFNBUkxVU0EodmFyKSB7XAorCXVfc2hvcnQgdG1wVmFyO1wKKwltZW1jcHkoJnRtcFZhciwgKHNob3J0ICopIHByaXZhLT5jb25mLT52YXIsMik7IFwKKwlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvK3BvcywgIiVzXHQ9XHQweCV4XG4iLCN2YXIsIHRtcFZhcik7XAorfQorCisjZGVmaW5lIFNBUkxVSUEodmFyKSB7XAorCXVfaW50IHRtcFZhcjtcCisJbWVtY3B5KCZ0bXBWYXIsIChpbnQqIClwcml2YS0+Y29uZi0+dmFyLDQpOyBcCisJcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbytwb3MsICIlc1x0PVx0MHgleFxuIiwjdmFyLCB0bXBWYXIpO1wKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqYXJsYW5fZGlhZ25vc3RpY19pbmZvX3N0cmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBhcmxhbl9zaG1lbSBfX2lvbWVtICphcmxhbiA9IHByaXYtPmNhcmQ7CisJdV9jaGFyIGRpYWdub3N0aWNJbmZvOworCisJUkVBRFNITShkaWFnbm9zdGljSW5mbywgYXJsYW4tPmRpYWdub3N0aWNJbmZvLCB1X2NoYXIpOworCisJc3dpdGNoIChkaWFnbm9zdGljSW5mbykKKwl7CisJCWNhc2UgMHhGRjoKKwkJCXJldHVybiAiRGlhZ25vc3RpYyBpbmZvIGlzIE9LIjsKKwkJY2FzZSAweEZFOgorCQkJcmV0dXJuICJFUlJPUiBFUFJPTSBDaGVja3N1bSBlcnJvciAiOworCQljYXNlIDB4RkQ6CisJCQlyZXR1cm4gIkVSUk9SIExvY2FsIFJhbSBUZXN0IEZhaWxlZCAiOworCQljYXNlIDB4RkM6CisJCQlyZXR1cm4gIkVSUk9SIFNDQyBmYWlsdXJlICI7CisJCWNhc2UgMHhGQjoKKwkJCXJldHVybiAiRVJST1IgQmFja0JvbmUgZmFpbHVyZSAiOworCQljYXNlIDB4RkE6CisJCQlyZXR1cm4gIkVSUk9SIHRyYW5zY2VpdmVyIG5vdCBmb3VuZCAiOworCQljYXNlIDB4Rjk6CisJCQlyZXR1cm4gIkVSUk9SIG5vIG1vcmUgYWRkcmVzcyBzcGFjZSAiOworCQljYXNlIDB4Rjg6CisJCQlyZXR1cm4gIkVSUk9SIENoZWNrc3VtIGVycm9yICAiOworCQljYXNlIDB4Rjc6CisJCQlyZXR1cm4gIkVSUk9SIE1pc3NpbmcgU1MgQ29kZSI7CisJCWNhc2UgMHhGNjoKKwkJCXJldHVybiAiRVJST1IgSW52YWxpZCBjb25maWcgZm9ybWF0IjsKKwkJY2FzZSAweEY1OgorCQkJcmV0dXJuICJFUlJPUiBSZXNlcnZlZCBlcnJvcmNvZGUgRjUiOworCQljYXNlIDB4RjQ6CisJCQlyZXR1cm4gIkVSUk9SIEludmFsaWQgc3ByZWFkaW5nIGNvZGUvY2hhbm5lbCBudW1iZXIiOworCQljYXNlIDB4RjM6CisJCQlyZXR1cm4gIkVSUk9SIExvYWQgQ29kZSBFcnJvciI7CisJCWNhc2UgMHhGMjoKKwkJCXJldHVybiAiRVJST1IgUmVzZXJ2ZXIgZXJyb3Jjb2RlIEYyICI7CisJCWNhc2UgMHhGMToKKwkJCXJldHVybiAiRVJST1IgSW52YWxpZCBjb21tYW5kIHJlY2VpdmVjIGJ5IExBTiBjYXJkICI7CisJCWNhc2UgMHhGMDoKKwkJCXJldHVybiAiRVJST1IgSW52YWxpZCBwYXJhbWV0ZXIgZm91bmQgaW4gY29tbWFuZCAiOworCQljYXNlIDB4RUY6CisJCQlyZXR1cm4gIkVSUk9SIE9uLWNoaXAgdGltZXIgZmFpbHVyZSAiOworCQljYXNlIDB4RUU6CisJCQlyZXR1cm4gIkVSUk9SIFQ0MTAgdGltZXIgZmFpbHVyZSAiOworCQljYXNlIDB4RUQ6CisJCQlyZXR1cm4gIkVSUk9SIFRvbyBNYW55IFR4RW5hYmxlIGNvbW1hbmRzICI7CisJCWNhc2UgMHhFQzoKKwkJCXJldHVybiAiRVJST1IgRUVQUk9NIGVycm9yIG9uIHJhZGlvIG1vZHVsZSAiOworCQlkZWZhdWx0OgorCQkJcmV0dXJuICJFUlJPUiB1bmtub3duIERpYWdub3N0aWMgaW5mbyByZXBseSBjb2RlICI7CisJICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICphcmxhbl9oYXJkd2FyZV90eXBlX3N0cmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVfY2hhciBoYXJkd2FyZVR5cGU7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBhcmxhbl9zaG1lbSBfX2lvbWVtICphcmxhbiA9IHByaXYtPmNhcmQ7CisKKwlSRUFEU0hNKGhhcmR3YXJlVHlwZSwgYXJsYW4tPmhhcmR3YXJlVHlwZSwgdV9jaGFyKTsKKwlzd2l0Y2ggKGhhcmR3YXJlVHlwZSkKKwl7CisJCWNhc2UgMHgwMDoKKwkJCXJldHVybiAidHlwZSBBNDUwIjsKKwkJY2FzZSAweDAxOgorCQkJcmV0dXJuICJ0eXBlIEE2NTAgIjsKKwkJY2FzZSAweDA0OgorCQkJcmV0dXJuICJ0eXBlIFRNQSBjb3Byb2MiOworCQljYXNlIDB4MEQ6CisJCQlyZXR1cm4gInR5cGUgQTY1MEUgIjsKKwkJY2FzZSAweDE4OgorCQkJcmV0dXJuICJ0eXBlIFRNQSBjb3Byb2MgQXVzdHJhbGlhbiI7CisJCWNhc2UgMHgxOToKKwkJCXJldHVybiAidHlwZSBBNjUwQSAiOworCQljYXNlIDB4MjY6CisJCQlyZXR1cm4gInR5cGUgVE1BIGNvcHJvYyBFdXJvcGVhbiI7CisJCWNhc2UgMHgyRToKKwkJCXJldHVybiAidHlwZSBBNjU1ICI7CisJCWNhc2UgMHgyRjoKKwkJCXJldHVybiAidHlwZSBBNjU1QSAiOworCQljYXNlIDB4MzA6CisJCQlyZXR1cm4gInR5cGUgQTY1NUUgIjsKKwkJY2FzZSAweDBCOgorCQkJcmV0dXJuICJ0eXBlIEE2NzAgIjsKKwkJY2FzZSAweDBDOgorCQkJcmV0dXJuICJ0eXBlIEE2NzBFICI7CisJCWNhc2UgMHgyRDoKKwkJCXJldHVybiAidHlwZSBBNjcwQSAiOworCQljYXNlIDB4MEY6CisJCQlyZXR1cm4gInR5cGUgQTQxMVQiOworCQljYXNlIDB4MTY6CisJCQlyZXR1cm4gInR5cGUgQTQxMVRBIjsKKwkJY2FzZSAweDFCOgorCQkJcmV0dXJuICJ0eXBlIEE0NDBUIjsKKwkJY2FzZSAweDFDOgorCQkJcmV0dXJuICJ0eXBlIEE0MTJUIjsKKwkJY2FzZSAweDFFOgorCQkJcmV0dXJuICJ0eXBlIEE0MTJUQSI7CisJCWNhc2UgMHgyMjoKKwkJCXJldHVybiAidHlwZSBBNDExVEUiOworCQljYXNlIDB4MjQ6CisJCQlyZXR1cm4gInR5cGUgQTQxMlRFIjsKKwkJY2FzZSAweDI3OgorCQkJcmV0dXJuICJ0eXBlIEE2NzFUICI7CisJCWNhc2UgMHgyOToKKwkJCXJldHVybiAidHlwZSBBNjcxVEEgIjsKKwkJY2FzZSAweDJCOgorCQkJcmV0dXJuICJ0eXBlIEE2NzFURSAiOworCQljYXNlIDB4MzE6CisJCQlyZXR1cm4gInR5cGUgQTQxNVQgIjsKKwkJY2FzZSAweDMzOgorCQkJcmV0dXJuICJ0eXBlIEE0MTVUQSAiOworCQljYXNlIDB4MzU6CisJCQlyZXR1cm4gInR5cGUgQTQxNVRFICI7CisJCWNhc2UgMHgzNzoKKwkJCXJldHVybiAidHlwZSBBNjcyIjsKKwkJY2FzZSAweDM5OgorCQkJcmV0dXJuICJ0eXBlIEE2NzJBICI7CisJCWNhc2UgMHgzQjoKKwkJCXJldHVybiAidHlwZSBBNjcyVCI7CisJCWNhc2UgMHg2QjoKKwkJCXJldHVybiAidHlwZSBJQzIyMDAiOworCQlkZWZhdWx0OgorCQkJcmV0dXJuICJ0eXBlIEE2NzJUIjsKKwl9Cit9CisjaWZkZWYgQVJMQU5fREVCVUdHSU5HCitzdGF0aWMgdm9pZCBhcmxhbl9wcmludF9kaWFnbm9zdGljX2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwl1X2NoYXIgZGlhZ25vc3RpY0luZm87CisJdV9zaG9ydCBkaWFnbm9zdGljT2Zmc2V0OworCXVfY2hhciBoYXJkd2FyZVR5cGU7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBhcmxhbl9zaG1lbSBfX2lvbWVtICphcmxhbiA9IHByaXYtPmNhcmQ7CisKKwkvLyAgQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX3ByaW50X2RpYWdub3N0aWNfaW5mbyIpOworCisJaWYgKFJFQURTSE1CKGFybGFuLT5jb25maWd1cmVkU3RhdHVzRmxhZykgPT0gMCkKKwkJcHJpbnRrKCJBcmxhbjogQ2FyZCBOT1QgY29uZmlndXJlZFxuIik7CisJZWxzZQorCQlwcmludGsoIkFybGFuOiBDYXJkIGlzIGNvbmZpZ3VyZWRcbiIpOworCisJUkVBRFNITShkaWFnbm9zdGljSW5mbywgYXJsYW4tPmRpYWdub3N0aWNJbmZvLCB1X2NoYXIpOworCVJFQURTSE0oZGlhZ25vc3RpY09mZnNldCwgYXJsYW4tPmRpYWdub3N0aWNPZmZzZXQsIHVfc2hvcnQpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIGFybGFuX2RpYWdub3N0aWNfaW5mb19zdHJpbmcoZGV2KSk7CisKKwlpZiAoZGlhZ25vc3RpY0luZm8gIT0gMHhmZikKKwkJcHJpbnRrKCIlcyBhcmxhbjogRGlhZ25vc3RpYyBPZmZzZXQgJWQgXG4iLCBkZXYtPm5hbWUsIGRpYWdub3N0aWNPZmZzZXQpOworCisJcHJpbnRrKCJhcmxhbjogTEFOIENPREUgSUQgPSAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlERUJVR1NITSgxLCAiJTAzZDoiLCBhcmxhbi0+bGFuQ2FyZE5vZGVJZFtpXSwgdV9jaGFyKTsKKwlwcmludGsoIlxuIik7CisKKwlwcmludGsoImFybGFuOiBBcmxhbiBCcm9hZENhc3QgYWRkcmVzcyAgPSAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlERUJVR1NITSgxLCAiJTAzZDoiLCBhcmxhbi0+YnJvYWRjYXN0QWRkcmVzc1tpXSwgdV9jaGFyKTsKKwlwcmludGsoIlxuIik7CisKKwlSRUFEU0hNKGhhcmR3YXJlVHlwZSwgYXJsYW4tPmhhcmR3YXJlVHlwZSwgdV9jaGFyKTsKKwlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgYXJsYW5faGFyZHdhcmVfdHlwZV9zdHJpbmcoZGV2KSk7CisKKworCURFQlVHU0hNKDEsICJhcmxhbjogY2hhbm5lbE51bWJlcj0lZFxuIiwgYXJsYW4tPmNoYW5uZWxOdW1iZXIsIHVfY2hhcik7CisJREVCVUdTSE0oMSwgImFybGFuOiBjaGFubmVsU2V0PSVkXG4iLCBhcmxhbi0+Y2hhbm5lbFNldCwgdV9jaGFyKTsKKwlERUJVR1NITSgxLCAiYXJsYW46IHNwcmVhZGluZ0NvZGU9JWRcbiIsIGFybGFuLT5zcHJlYWRpbmdDb2RlLCB1X2NoYXIpOworCURFQlVHU0hNKDEsICJhcmxhbjogcmFkaW9Ob2RlSWQ9JWRcbiIsIGFybGFuLT5yYWRpb05vZGVJZCwgdV9zaG9ydCk7CisJREVCVUdTSE0oMSwgImFybGFuOiBTSUQJPSVkXG4iLCBhcmxhbi0+U0lELCB1X3Nob3J0KTsKKwlERUJVR1NITSgxLCAiYXJsYW46IHJ4T2Zmc2V0PSVkXG4iLCBhcmxhbi0+cnhPZmZzZXQsIHVfc2hvcnQpOworCisJREVCVUdTSE0oMSwgImFybGFuOiByZWdpc3RyYXRpb24gbW9kZSBpcyAlZFxuIiwgYXJsYW4tPnJlZ2lzdHJhdGlvbk1vZGUsIHVfY2hhcik7CisKKwlwcmludGsoImFybGFuOiBuYW1lPSAiKTsKKwlJRkRFQlVHKDEpCisJCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJeworCQljaGFyIGM7CisJCVJFQURTSE0oYywgYXJsYW4tPm5hbWVbaV0sIGNoYXIpOworCQlpZiAoYykKKwkJCXByaW50aygiJWMiLCBjKTsKKwl9CisJcHJpbnRrKCJcbiIpOworCisvLyAgIEFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3ByaW50X2RpYWdub3N0aWNfaW5mbyIpOworCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgkJVEVTVCAJTUVNT1JZCSoqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGFybGFuX2h3X3Rlc3RfbWVtb3J5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdV9jaGFyICpwdHI7CisJaW50IGk7CisJaW50IG1lbWxlbiA9IHNpemVvZihzdHJ1Y3QgYXJsYW5fc2htZW0pIC0gMHhGOwkvKiBhdm9pZCBjb250cm9sIHJlZ2lzdGVyICovCisJdm9sYXRpbGUgY2hhciAqYXJsYW5fbWVtID0gKGNoYXIgKikgKGRldi0+bWVtX3N0YXJ0KTsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKwljaGFyIHBhdHRlcm47CisKKwlwdHIgPSBOVUxMOworCisJLyogaG9sZCBjYXJkIGluIHJlc2V0IHN0YXRlICovCisJc2V0SGFyZHdhcmVSZXNldChkZXYpOworCisJLyogdGVzdCBtZW1vcnkgKi8KKwlwYXR0ZXJuID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbWVtbGVuOyBpKyspCisJCVdSSVRFU0hNKGFybGFuX21lbVtpXSwgKCh1X2NoYXIpIHBhdHRlcm4rKyksIHVfY2hhcik7CisKKwlwYXR0ZXJuID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbWVtbGVuOyBpKyspCisJeworCQljaGFyIHJlczsKKwkJUkVBRFNITShyZXMsIGFybGFuX21lbVtpXSwgY2hhcik7CisJCWlmIChyZXMgIT0gcGF0dGVybisrKQorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgIkFybGFuIGRyaXZlciBtZW1vcnkgdGVzdCAxIGZhaWxlZCBcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJcGF0dGVybiA9IDA7CisJZm9yIChpID0gMDsgaSA8IG1lbWxlbjsgaSsrKQorCQlXUklURVNITShhcmxhbl9tZW1baV0sIH4ocGF0dGVybisrKSwgY2hhcik7CisKKwlwYXR0ZXJuID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbWVtbGVuOyBpKyspCisJeworCQljaGFyIHJlczsKKwkJUkVBRFNITShyZXMsIGFybGFuX21lbVtpXSwgY2hhcik7CisJCWlmIChyZXMgIT0gfihwYXR0ZXJuKyspKQorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgIkFybGFuIGRyaXZlciBtZW1vcnkgdGVzdCAyIGZhaWxlZCBcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJLyogemVybyBtZW1vcnkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbWVtbGVuOyBpKyspCisJCVdSSVRFU0hNKGFybGFuX21lbVtpXSwgMHgwMCwgY2hhcik7CisKKwlJRkRFQlVHKDEpIHByaW50ayhLRVJOX0lORk8gIkFybGFuOiBtZW1vcnkgdGVzdHMgb2tcbiIpOworCisJLyogc2V0IHJlc2V0IGZsYWcgYW5kIHRoZW4gcmVsZWFzZSByZXNldCAqLworCVdSSVRFU0hNKGFybGFuLT5yZXNldEZsYWcsIDB4ZmYsIHVfY2hhcik7CisKKwljbGVhckNoYW5uZWxBdHRlbnRpb24oZGV2KTsKKwljbGVhckhhcmR3YXJlUmVzZXQoZGV2KTsKKworCS8qIHdhaXQgZm9yIHJlc2V0IGZsYWcgdG8gYmVjb21lIHplcm8sIHdlJ2xsIHdhaXQgZm9yIHR3byBzZWNvbmRzICovCisJaWYgKGFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX0xPTkdfV0FJVF9OT1cpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyBhcmxhbjogZmFpbGVkIHRvIGNvbWUgYmFjayBmcm9tIG1lbW9yeSB0ZXN0XG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFybGFuX3NldHVwX2NhcmRfYnlfYm9vayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVfY2hhciBpcnFMZXZlbCwgY29uZmlndXJlZFN0YXR1c0ZsYWc7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBhcmxhbl9zaG1lbSBfX2lvbWVtICphcmxhbiA9IHByaXYtPmNhcmQ7CisKKy8vCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9zZXR1cF9jYXJkIik7CisKKwlSRUFEU0hNKGNvbmZpZ3VyZWRTdGF0dXNGbGFnLCBhcmxhbi0+Y29uZmlndXJlZFN0YXR1c0ZsYWcsIHVfY2hhcik7CisKKwlJRkRFQlVHKDEwKQorCWlmIChjb25maWd1cmVkU3RhdHVzRmxhZyAhPSAwKQorCQlJRkRFQlVHKDEwKSBwcmludGsoImFybGFuOiBDQVJEIElTIENPTkZJR1VSRURcbiIpOworCWVsc2UKKwkJSUZERUJVRygxMCkgcHJpbnRrKCJhcmxhbjogY2FyZCBpcyBOT1QgY29uZmlndXJlZFxuIik7CisKKwlpZiAodGVzdE1lbW9yeSB8fCAoUkVBRFNITUIoYXJsYW4tPmRpYWdub3N0aWNJbmZvKSAhPSAweGZmKSkKKwkJaWYgKGFybGFuX2h3X3Rlc3RfbWVtb3J5KGRldikpCisJCQlyZXR1cm4gLTE7CisKKwlERUJVR1NITSg0LCAiYXJsYW4gY29uZmlndXJlZFN0YXR1cyA9ICVkIFxuIiwgYXJsYW4tPmNvbmZpZ3VyZWRTdGF0dXNGbGFnLCB1X2NoYXIpOworCURFQlVHU0hNKDQsICJhcmxhbiBkcml2ZXIgZGlhZ25vc3RpYzogMHglMnhcbiIsIGFybGFuLT5kaWFnbm9zdGljSW5mbywgdV9jaGFyKTsKKworCS8qIGlzc3VlIG5vcCBjb21tYW5kIC0gbm8gaW50ZXJydXB0ICovCisJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfTk9PUCk7CisJaWYgKGFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX1dBSVRfTk9XKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwlJRkRFQlVHKDUwKSBwcmludGsoIjFzdCBOb29wIHN1Y2Nlc3NmdWxseSBleGVjdXRlZCAhIVxuIik7CisKKwkvKiB0cnkgdG8gdHVybiBvbiB0aGUgYXJsYW4gaW50ZXJydXB0cyAqLworCWNsZWFyQ2xlYXJJbnRlcnJ1cHQoZGV2KTsKKwlzZXRDbGVhckludGVycnVwdChkZXYpOworCXNldEludGVycnVwdEVuYWJsZShkZXYpOworCisJLyogaXNzdWUgbm9wIGNvbW1hbmQgLSB3aXRoIGludGVycnVwdCAqLworCisJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfTk9PUElOVCk7CisJaWYgKGFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX1dBSVRfTk9XKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKworCUlGREVCVUcoNTApIHByaW50aygiMm5kIE5vb3Agc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkICEhXG4iKTsKKworCVJFQURTSE0oaXJxTGV2ZWwsIGFybGFuLT5pcnFMZXZlbCwgdV9jaGFyKQorCQorCWlmIChpcnFMZXZlbCAhPSBkZXYtPmlycSkKKwl7CisJCUlGREVCVUcoMSkgcHJpbnRrKEtFUk5fV0FSTklORyAiYXJsYW4gZGlwIHN3aXRjaGVzIHNldCBpcnEgdG8gJWRcbiIsIGlycUxldmVsKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZGV2aWNlIGRyaXZlciBpcnEgc2V0IHRvICVkIC0gZG9lcyBub3QgbWF0Y2hcbiIsIGRldi0+aXJxKTsKKwkJZGV2LT5pcnEgPSBpcnFMZXZlbDsKKwl9CisJZWxzZQorCQlJRkRFQlVHKDIpIHByaW50aygiaXJxIGxldmVsIGlzIE9LXG4iKTsKKworCisJSUZERUJVRygzKSBhcmxhbl9wcmludF9kaWFnbm9zdGljX2luZm8oZGV2KTsKKworCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX0NPTkYpOworCisJUkVBRFNITShjb25maWd1cmVkU3RhdHVzRmxhZywgYXJsYW4tPmNvbmZpZ3VyZWRTdGF0dXNGbGFnLCB1X2NoYXIpOworCWlmIChjb25maWd1cmVkU3RhdHVzRmxhZyA9PSAwKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXJsYW4gY29uZmlndXJlIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfTE9OR19XQUlUX05PVyk7CisJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfUlgpOworCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX0xPTkdfV0FJVF9OT1cpOworCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGFybGFuIGRyaXZlciB2ZXJzaW9uICVzIGxvYWRlZFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBhcmxhbl92ZXJzaW9uKTsKKworLy8JQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fc2V0dXBfY2FyZCIpOworCisJcmV0dXJuIDA7CQkvKiBubyBlcnJvcnMgKi8KK30KKyNlbmRpZgorCisjaWZkZWYgQVJMQU5fUFJPQ19JTlRFUkZBQ0UKKyNpZmRlZiBBUkxBTl9QUk9DX1NITV9EVU1QCisKK3N0YXRpYyBjaGFyIGFybGFuX2RyaXZlX2luZm9bQVJMQU5fU1RSX1NJWkVdID0gIkE2NTVcblwwIjsKKworc3RhdGljIGludCBhcmxhbl9zeXNjdGxfaW5mbyhjdGxfdGFibGUgKiBjdGwsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqIGxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgaTsKKwlpbnQgcmV0diwgcG9zLCBkZXZudW07CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXZhID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXBvcyA9IDA7CisJaWYgKHdyaXRlKQorCXsKKwkJcHJpbnRrKCJ3cmlydGU6ICIpOworCQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspCisJCQlwcmludGsoImFkaSAleCBcbiIsIGFybGFuX2RyaXZlX2luZm9baV0pOworCX0KKwlpZiAoY3RsLT5wcm9jbmFtZSA9PSBOVUxMIHx8IGFybGFuX2RyaXZlX2luZm8gPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiBwcm9jbmFtZSBpcyBOVUxMIGluIHN5c2N0bF90YWJsZSBvciBhcmxhbl9kcml2ZV9pbmZvIGlzIE5VTEwgXG4gYXQgYXJsYW4gbW9kdWxlXG4gIik7CisJCXJldHVybiAtMTsKKwl9CisJZGV2bnVtID0gY3RsLT5wcm9jbmFtZVs1XSAtICcwJzsKKwlpZiAoZGV2bnVtIDwgMCB8fCBkZXZudW0gPiBNQVhfQVJMQU5TIC0gMSkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInRvbyBzdHJhbmdlIGRldm51bSBpbiBwcm9jZnMgcGFyc2VcbiAiKTsKKwkJcmV0dXJuIC0xOworCX0KKwllbHNlIGlmIChhcmxhbl9kZXZpY2VbZGV2bnVtXSA9PSBOVUxMKQorCXsKKwkJaWYgKGN0bC0+cHJvY25hbWUpCisJCQlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvICsgcG9zLCAiXHQlc1xuXG4iLCBjdGwtPnByb2NuYW1lKTsKKwkJcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbyArIHBvcywgIk5vIGRldmljZSBmb3VuZCBoZXJlIFxuIik7CisJCWdvdG8gZmluYWw7CisJfQorCWVsc2UKKwkJcHJpdmEgPSBhcmxhbl9kZXZpY2VbZGV2bnVtXS0+cHJpdjsKKworCWlmIChwcml2YSA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiIENvdWxkIG5vdCBmaW5kIHRoZSBkZXZpY2UgcHJpdmF0ZSBpbiBhcmxhbiBwcm9jc3lzLCBiYWRcbiAiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkZXYgPSBhcmxhbl9kZXZpY2VbZGV2bnVtXTsKKworCW1lbWNweV9mcm9taW8ocHJpdmEtPmNvbmYsIHByaXZhLT5jYXJkLCBzaXplb2Yoc3RydWN0IGFybGFuX3NobWVtKSk7CisKKwlwb3MgPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8sICJBcmxhbiAgaW5mbyBcbiIpOworCS8qIEhlYWRlciBTaWduYXR1cmUgKi8KKwlTQVJMU1RSKHRleHRSZWdpb24sIDQ4KTsKKwlTQVJMVUMocmVzZXRGbGFnKTsKKwlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvICsgcG9zLCAiZGlhZ25vc3RpY0luZm9cdD1cdCVzIFxuIiwgYXJsYW5fZGlhZ25vc3RpY19pbmZvX3N0cmluZyhkZXYpKTsKKwlTQVJMVUMoZGlhZ25vc3RpY0luZm8pOworCVNBUkxVUyhkaWFnbm9zdGljT2Zmc2V0KTsKKwlTQVJMVUNOKF8xLCAxMik7CisJU0FSTFVDTihsYW5DYXJkTm9kZUlkLCA2KTsKKwlTQVJMVUNOKGJyb2FkY2FzdEFkZHJlc3MsIDYpOworCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8gKyBwb3MsICJoYXJkd2FyZVR5cGUgPVx0ICAlcyBcbiIsIGFybGFuX2hhcmR3YXJlX3R5cGVfc3RyaW5nKGRldikpOworCVNBUkxVQyhoYXJkd2FyZVR5cGUpOworCVNBUkxVQyhtYWpvckhhcmR3YXJlVmVyc2lvbik7CisJU0FSTFVDKG1pbm9ySGFyZHdhcmVWZXJzaW9uKTsKKwlTQVJMVUMocmFkaW9Nb2R1bGUpOworCVNBUkxVQyhkZWZhdWx0Q2hhbm5lbFNldCk7CisJU0FSTFVDTihfMiwgNDcpOworCisJLyogQ29udHJvbC9TdGF0dXMgQmxvY2sgLSAweDAwODAgKi8KKwlTQVJMVUMoaW50ZXJydXB0SW5Qcm9ncmVzcyk7CisJU0FSTFVDKGNudHJsUmVnSW1hZ2UpOworCisJU0FSTFVDTihfMywgMTQpOworCVNBUkxVQyhjb21tYW5kQnl0ZSk7CisJU0FSTFVDTihjb21tYW5kUGFyYW1ldGVyLCAxNSk7CisKKwkvKiBSZWNlaXZlIFN0YXR1cyAtIDB4MDBhMCAqLworCVNBUkxVQyhyeFN0YXR1cyk7CisJU0FSTFVDKHJ4RnJtVHlwZSk7CisJU0FSTFVTKHJ4T2Zmc2V0KTsKKwlTQVJMVVMocnhMZW5ndGgpOworCVNBUkxVQ04ocnhTcmMsIDYpOworCVNBUkxVQyhyeEJyb2FkY2FzdEZsYWcpOworCVNBUkxVQyhyeFF1YWxpdHkpOworCVNBUkxVQyhzY3JhbWJsZWQpOworCVNBUkxVQ04oXzQsIDEpOworCisJLyogVHJhbnNtaXQgU3RhdHVzIC0gMHgwMGIwICovCisJU0FSTFVDKHR4U3RhdHVzKTsKKwlTQVJMVUModHhBY2tRdWFsaXR5KTsKKwlTQVJMVUMobnVtUmV0cmllcyk7CisJU0FSTFVDTihfNSwgMTQpOworCVNBUkxVQ04ocmVnaXN0ZXJlZFJvdXRlciwgNik7CisJU0FSTFVDTihiYWNrYm9uZVJvdXRlciwgNik7CisJU0FSTFVDKHJlZ2lzdHJhdGlvblN0YXR1cyk7CisJU0FSTFVDKGNvbmZpZ3VyZWRTdGF0dXNGbGFnKTsKKwlTQVJMVUNOKF82LCAxKTsKKwlTQVJMVUNOKHVsdGltYXRlRGVzdEFkZHJlc3MsIDYpOworCVNBUkxVQ04oaW1tZWREZXN0QWRkcmVzcywgNik7CisJU0FSTFVDTihpbW1lZFNyY0FkZHJlc3MsIDYpOworCVNBUkxVUyhyeFNlcXVlbmNlTnVtYmVyKTsKKwlTQVJMVUMoYXNzaWduZWRMb2NhbHRhbGtBZGRyZXNzKTsKKwlTQVJMVUNOKF83LCAyNyk7CisKKwkvKiBTeXN0ZW0gUGFyYW1ldGVyIEJsb2NrICovCisKKwkvKiAtIERyaXZlciBQYXJhbWV0ZXJzIChOb3ZlbGwgU3BlY2lmaWMpICovCisKKwlTQVJMVVModHhUaW1lb3V0KTsKKwlTQVJMVVModHJhbnNwb3J0VGltZSk7CisJU0FSTFVDTihfOCwgNCk7CisKKwkvKiAtIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVycyAqLworCVNBUkxVQyhpcnFMZXZlbCk7CisJU0FSTFVDKHNwcmVhZGluZ0NvZGUpOworCVNBUkxVQyhjaGFubmVsU2V0KTsKKwlTQVJMVUMoY2hhbm5lbE51bWJlcik7CisJU0FSTFVTKHJhZGlvTm9kZUlkKTsKKwlTQVJMVUNOKF85LCAyKTsKKwlTQVJMVUMoc2NyYW1ibGluZ0Rpc2FibGUpOworCVNBUkxVQyhyYWRpb1R5cGUpOworCVNBUkxVUyhyb3V0ZXJJZCk7CisJU0FSTFVDTihfMTAsIDkpOworCVNBUkxVQyh0eEF0dGVudWF0aW9uKTsKKwlTQVJMVUlBKHN5c3RlbUlkKTsKKwlTQVJMVVMoZ2xvYmFsQ2hlY2tzdW0pOworCVNBUkxVQ04oXzExLCA0KTsKKwlTQVJMVVMobWF4RGF0YWdyYW1TaXplKTsKKwlTQVJMVVMobWF4RnJhbWVTaXplKTsKKwlTQVJMVUMobWF4UmV0cmllcyk7CisJU0FSTFVDKHJlY2VpdmVNb2RlKTsKKwlTQVJMVUMocHJpb3JpdHkpOworCVNBUkxVQyhyb290T3JSZXBlYXRlcik7CisJU0FSTFVDTihzcGVjaWZpZWRSb3V0ZXIsIDYpOworCVNBUkxVUyhmYXN0UG9sbFBlcmlvZCk7CisJU0FSTFVDKHBvbGxEZWNheSk7CisJU0FSTFVTQShmYXN0UG9sbERlbGF5KTsKKwlTQVJMVUMoYXJsVGhyZXNob2xkKTsKKwlTQVJMVUMoYXJsRGVjYXkpOworCVNBUkxVQ04oXzEyLCAxKTsKKwlTQVJMVVMoc3BlY1JvdXRlclRpbWVvdXQpOworCVNBUkxVQ04oXzEzLCA1KTsKKworCS8qIFNjcmFtYmxlZCBBcmVhICovCisJU0FSTFVJQShTSUQpOworCVNBUkxVQ04oZW5jcnlwdGlvbktleSwgMTIpOworCVNBUkxVSUEoXzE0KTsKKwlTQVJMVVNBKHdhaXRUaW1lKTsKKwlTQVJMVVNBKGxQYXJhbWV0ZXIpOworCVNBUkxVQ04oXzE1LCAzKTsKKwlTQVJMVVMoaGVhZGVyU2l6ZSk7CisJU0FSTFVTKHNlY3Rpb25DaGVja3N1bSk7CisKKwlTQVJMVUMocmVnaXN0cmF0aW9uTW9kZSk7CisJU0FSTFVDKHJlZ2lzdHJhdGlvbkZpbGwpOworCVNBUkxVUyhwb2xsUGVyaW9kKTsKKwlTQVJMVVMocmVmcmVzaFBlcmlvZCk7CisJU0FSTFNUUihuYW1lLCAxNik7CisJU0FSTFVDTihOSUQsIDYpOworCVNBUkxVQyhsb2NhbFRhbGtBZGRyZXNzKTsKKwlTQVJMVUMoY29kZUZvcm1hdCk7CisJU0FSTFVDKG51bUNoYW5uZWxzKTsKKwlTQVJMVUMoY2hhbm5lbDEpOworCVNBUkxVQyhjaGFubmVsMik7CisJU0FSTFVDKGNoYW5uZWwzKTsKKwlTQVJMVUMoY2hhbm5lbDQpOworCVNBUkxVQ04oU1NDb2RlLCA1OSk7CisKKy8qICAgICAgU0FSTFVDTiggXzE2LCAweDE0MCk7CisgKi8KKwkvKiBTdGF0aXN0aWNzIEJsb2NrIC0gMHgwMzAwICovCisJU0FSTFVDKGhvc3RjcHVMb2NrKTsKKwlTQVJMVUMobGFuY3B1TG9jayk7CisJU0FSTFVDTihyZXNldFRpbWUsIDE4KTsKKwlTQVJMVUlBKG51bURhdGFncmFtc1RyYW5zbWl0dGVkKTsKKwlTQVJMVUlBKG51bVJlVHJhbnNtaXNzaW9ucyk7CisJU0FSTFVJQShudW1GcmFtZXNEaXNjYXJkZWQpOworCVNBUkxVSUEobnVtRGF0YWdyYW1zUmVjZWl2ZWQpOworCVNBUkxVSUEobnVtRHVwbGljYXRlUmVjZWl2ZWRGcmFtZXMpOworCVNBUkxVSUEobnVtRGF0YWdyYW1zRGlzY2FyZGVkKTsKKwlTQVJMVVMobWF4TnVtUmVUcmFuc21pdERhdGFncmFtKTsKKwlTQVJMVVMobWF4TnVtUmVUcmFuc21pdEZyYW1lcyk7CisJU0FSTFVTKG1heE51bUNvbnNlY3V0aXZlRHVwbGljYXRlRnJhbWVzKTsKKwkvKiBtaXNhbGlnbmVkIGhlcmUgc28gd2UgaGF2ZSB0byBnbyB0byBjaGFyYWN0ZXJzICovCisJU0FSTFVJQShudW1CeXRlc1RyYW5zbWl0dGVkKTsKKwlTQVJMVUlBKG51bUJ5dGVzUmVjZWl2ZWQpOworCVNBUkxVSUEobnVtQ1JDRXJyb3JzKTsKKwlTQVJMVUlBKG51bUxlbmd0aEVycm9ycyk7CisJU0FSTFVJQShudW1BYm9ydEVycm9ycyk7CisJU0FSTFVJQShudW1UWFVuZGVycnVucyk7CisJU0FSTFVJQShudW1SWE92ZXJydW5zKTsKKwlTQVJMVUlBKG51bUhvbGRPZmZzKTsKKwlTQVJMVUlBKG51bUZyYW1lc1RyYW5zbWl0dGVkKTsKKwlTQVJMVUlBKG51bUZyYW1lc1JlY2VpdmVkKTsKKwlTQVJMVUlBKG51bVJlY2VpdmVGcmFtZXNMb3N0KTsKKwlTQVJMVUlBKG51bVJYQnVmZmVyT3ZlcmZsb3dzKTsKKwlTQVJMVUlBKG51bUZyYW1lc0Rpc2NhcmRlZEFkZHJNaXNtYXRjaCk7CisJU0FSTFVJQShudW1GcmFtZXNEaXNjYXJkZWRTSURNaXNtYXRjaCk7CisJU0FSTFVJQShudW1Qb2xsc1RyYW5zbWlzdHRlZCk7CisJU0FSTFVJQShudW1Qb2xsQWNrbm93bGVkZ2VzKTsKKwlTQVJMVUlBKG51bVN0YXR1c1RpbWVvdXRzKTsKKwlTQVJMVUlBKG51bU5BQ0tSZWNlaXZlZCk7CisJU0FSTFVTKGF1eENtZCk7CisJU0FSTFVDTihkdW1wUHRyLCA0KTsKKwlTQVJMVUMoZHVtcFZhbCk7CisJU0FSTFVDKHdpcmVUZXN0KTsKKwkKKwkvKiBuZXh0IDQgc2VlbXMgdG9vIGxvbmcgZm9yIHByb2Nmcywgb3ZlciBzaW5nbGUgcGFnZSA/CisJU0FSTFVDTiggXzE3LCAweDg2KTsKKwlTQVJMVUNOKCB0eEJ1ZmZlciwgMHg4MDApOworCVNBUkxVQ04oIHJ4QnVmZmVyLCAgMHg4MDApOyAKKwlTQVJMVUNOKCBfMTgsIDB4MGJmZik7CisJICovCisKKwlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvICsgcG9zLCAicnhSaW5nXHQ9XHQweCIpOworCWZvciAoaSA9IDA7IGkgPCAweDUwOyBpKyspCisJCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8gKyBwb3MsICIlMDJ4IiwgKChjaGFyICopIHByaXZhLT5jb25mKVtwcml2YS0+Y29uZi0+cnhPZmZzZXQgKyBpXSk7CisJcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbyArIHBvcywgIlxuIik7CisKKwlTQVJMVUMoY29uZmlnU3RhdHVzKTsKKwlTQVJMVUMoXzIyKTsKKwlTQVJMVUMocHJvZ0lPQ3RybCk7CisJU0FSTFVDKHNoYXJlTUJhc2UpOworCVNBUkxVQyhjb250cm9sUmVnaXN0ZXIpOworCisJcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbyArIHBvcywgIiB0b3RhbCAlZCBjaGFyc1xuIiwgcG9zKTsKKwlpZiAoY3RsKQorCQlpZiAoY3RsLT5wcm9jbmFtZSkKKwkJCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8gKyBwb3MsICIgZHJpdmVyIG5hbWUgOiAlc1xuIiwgY3RsLT5wcm9jbmFtZSk7CitmaW5hbDoKKwkqbGVucCA9IHBvczsKKworCWlmICghd3JpdGUpCisJCXJldHYgPSBwcm9jX2Rvc3RyaW5nKGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJZWxzZQorCXsKKwkJKmxlbnAgPSAwOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiByZXR2OworfQorCisKK3N0YXRpYyBpbnQgYXJsYW5fc3lzY3RsX2luZm8xNjE3MTkoY3RsX3RhYmxlICogY3RsLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqIGxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgaTsKKwlpbnQgcmV0diwgcG9zLCBkZXZudW07CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXZhID0gTlVMTDsKKworCXBvcyA9IDA7CisJZGV2bnVtID0gY3RsLT5wcm9jbmFtZVs1XSAtICcwJzsKKwlpZiAoYXJsYW5fZGV2aWNlW2Rldm51bV0gPT0gTlVMTCkKKwl7CisJCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8gKyBwb3MsICJObyBkZXZpY2UgZm91bmQgaGVyZSBcbiIpOworCQlnb3RvIGZpbmFsOworCX0KKwllbHNlCisJCXByaXZhID0gYXJsYW5fZGV2aWNlW2Rldm51bV0tPnByaXY7CisJaWYgKHByaXZhID09IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIgQ291bGQgbm90IGZpbmQgdGhlIGRldmljZSBwcml2YXRlIGluIGFybGFuIHByb2NzeXMsIGJhZFxuICIpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbWNweV9mcm9taW8ocHJpdmEtPmNvbmYsIHByaXZhLT5jYXJkLCBzaXplb2Yoc3RydWN0IGFybGFuX3NobWVtKSk7CisJU0FSTFVDTihfMTYsIDB4QzApOworCVNBUkxVQ04oXzE3LCAweDZBKTsKKwlTQVJMVUNOKF8xOCwgMTQpOworCVNBUkxVQ04oXzE5LCAweDg2KTsKKwlTQVJMVUNOKF8yMSwgMHgzZmQpOworCitmaW5hbDoKKwkqbGVucCA9IHBvczsKKwlyZXR2ID0gcHJvY19kb3N0cmluZyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCXJldHVybiByZXR2OworfQorCitzdGF0aWMgaW50IGFybGFuX3N5c2N0bF9pbmZvdHhSaW5nKGN0bF90YWJsZSAqIGN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKiBsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IGk7CisJaW50IHJldHYsIHBvcywgZGV2bnVtOworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2YSA9IE5VTEw7CisKKwlwb3MgPSAwOworCWRldm51bSA9IGN0bC0+cHJvY25hbWVbNV0gLSAnMCc7CisJaWYgKGFybGFuX2RldmljZVtkZXZudW1dID09IE5VTEwpCisJeworCQkgIHBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8gKyBwb3MsICJObyBkZXZpY2UgZm91bmQgaGVyZSBcbiIpOworCQkgIGdvdG8gZmluYWw7CisJfQorCWVsc2UKKwkJcHJpdmEgPSBhcmxhbl9kZXZpY2VbZGV2bnVtXS0+cHJpdjsKKwlpZiAocHJpdmEgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiBDb3VsZCBub3QgZmluZCB0aGUgZGV2aWNlIHByaXZhdGUgaW4gYXJsYW4gcHJvY3N5cywgYmFkXG4gIik7CisJCXJldHVybiAtMTsKKwl9CisJbWVtY3B5X2Zyb21pbyhwcml2YS0+Y29uZiwgcHJpdmEtPmNhcmQsIHNpemVvZihzdHJ1Y3QgYXJsYW5fc2htZW0pKTsKKwlTQVJMQk5wbG4odV9jaGFyLCB0eEJ1ZmZlciwgMHg4MDApOworZmluYWw6CisJKmxlbnAgPSBwb3M7CisJcmV0diA9IHByb2NfZG9zdHJpbmcoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlyZXR1cm4gcmV0djsKK30KKworc3RhdGljIGludCBhcmxhbl9zeXNjdGxfaW5mb3J4UmluZyhjdGxfdGFibGUgKiBjdGwsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICogbGVucCwgbG9mZl90ICpwcG9zKQoreworCWludCBpOworCWludCByZXR2LCBwb3MsIGRldm51bTsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdmEgPSBOVUxMOworCisJcG9zID0gMDsKKwlkZXZudW0gPSBjdGwtPnByb2NuYW1lWzVdIC0gJzAnOworCWlmIChhcmxhbl9kZXZpY2VbZGV2bnVtXSA9PSBOVUxMKQorCXsKKwkJICBwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvICsgcG9zLCAiTm8gZGV2aWNlIGZvdW5kIGhlcmUgXG4iKTsKKwkJICBnb3RvIGZpbmFsOworCX0gZWxzZQorCQlwcml2YSA9IGFybGFuX2RldmljZVtkZXZudW1dLT5wcml2OworCWlmIChwcml2YSA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiIENvdWxkIG5vdCBmaW5kIHRoZSBkZXZpY2UgcHJpdmF0ZSBpbiBhcmxhbiBwcm9jc3lzLCBiYWRcbiAiKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1jcHlfZnJvbWlvKHByaXZhLT5jb25mLCBwcml2YS0+Y2FyZCwgc2l6ZW9mKHN0cnVjdCBhcmxhbl9zaG1lbSkpOworCVNBUkxCTnBsbih1X2NoYXIsIHJ4QnVmZmVyLCAweDgwMCk7CitmaW5hbDoKKwkqbGVucCA9IHBvczsKKwlyZXR2ID0gcHJvY19kb3N0cmluZyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCXJldHVybiByZXR2OworfQorCitzdGF0aWMgaW50IGFybGFuX3N5c2N0bF9pbmZvMTgoY3RsX3RhYmxlICogY3RsLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICogbGVucCwgbG9mZl90ICpwcG9zKQoreworCWludCBpOworCWludCByZXR2LCBwb3MsIGRldm51bTsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdmEgPSBOVUxMOworCisJcG9zID0gMDsKKwlkZXZudW0gPSBjdGwtPnByb2NuYW1lWzVdIC0gJzAnOworCWlmIChhcmxhbl9kZXZpY2VbZGV2bnVtXSA9PSBOVUxMKQorCXsKKwkJcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbyArIHBvcywgIk5vIGRldmljZSBmb3VuZCBoZXJlIFxuIik7CisJCWdvdG8gZmluYWw7CisJfQorCWVsc2UKKwkJcHJpdmEgPSBhcmxhbl9kZXZpY2VbZGV2bnVtXS0+cHJpdjsKKwlpZiAocHJpdmEgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiBDb3VsZCBub3QgZmluZCB0aGUgZGV2aWNlIHByaXZhdGUgaW4gYXJsYW4gcHJvY3N5cywgYmFkXG4gIik7CisJCXJldHVybiAtMTsKKwl9CisJbWVtY3B5X2Zyb21pbyhwcml2YS0+Y29uZiwgcHJpdmEtPmNhcmQsIHNpemVvZihzdHJ1Y3QgYXJsYW5fc2htZW0pKTsKKwlTQVJMQk5wbG4odV9jaGFyLCBfMTgsIDB4ODAwKTsKKworZmluYWw6CisJKmxlbnAgPSBwb3M7CisJcmV0diA9IHByb2NfZG9zdHJpbmcoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlyZXR1cm4gcmV0djsKK30KKworCisjZW5kaWYJCQkJLyogI2lmZGVmIEFSTEFOX1BST0NfU0hNX0RVTVAgKi8KKworCitzdGF0aWMgY2hhciBjb25mX3Jlc2V0X3Jlc3VsdFsyMDBdOworCitzdGF0aWMgaW50IGFybGFuX2NvbmZpZ3VyZShjdGxfdGFibGUgKiBjdGwsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKiBsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IHBvcyA9IDA7CisJaW50IGRldm51bSA9IGN0bC0+cHJvY25hbWVbNl0gLSAnMCc7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXY7CisKKwlpZiAoZGV2bnVtIDwgMCB8fCBkZXZudW0gPiBNQVhfQVJMQU5TIC0gMSkKKwl7CisJCSAgcHJpbnRrKEtFUk5fV0FSTklORyAidG9vIHN0cmFuZ2UgZGV2bnVtIGluIHByb2NmcyBwYXJzZVxuICIpOworCQkgIHJldHVybiAtMTsKKwl9CisJZWxzZSBpZiAoYXJsYW5fZGV2aWNlW2Rldm51bV0gIT0gTlVMTCkKKwl7CisJCSAgcHJpdiA9IGFybGFuX2RldmljZVtkZXZudW1dLT5wcml2OworCisJCSAgYXJsYW5fY29tbWFuZChhcmxhbl9kZXZpY2VbZGV2bnVtXSwgQVJMQU5fQ09NTUFORF9DTEVBTl9BTkRfQ09ORik7CisJfQorCWVsc2UKKwkJcmV0dXJuIC0xOworCisJKmxlbnAgPSBwb3M7CisJcmV0dXJuIHByb2NfZG9zdHJpbmcoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKK30KKworc3RhdGljIGludCBhcmxhbl9zeXNjdGxfcmVzZXQoY3RsX3RhYmxlICogY3RsLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICogbGVucCwgbG9mZl90ICpwcG9zKQoreworCWludCBwb3MgPSAwOworCWludCBkZXZudW0gPSBjdGwtPnByb2NuYW1lWzVdIC0gJzAnOworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2OworCisJaWYgKGRldm51bSA8IDAgfHwgZGV2bnVtID4gTUFYX0FSTEFOUyAtIDEpCisJeworCQkgIHByaW50ayhLRVJOX1dBUk5JTkcgInRvbyBzdHJhbmdlIGRldm51bSBpbiBwcm9jZnMgcGFyc2VcbiAiKTsKKwkJICByZXR1cm4gLTE7CisJfQorCWVsc2UgaWYgKGFybGFuX2RldmljZVtkZXZudW1dICE9IE5VTEwpCisJeworCQlwcml2ID0gYXJsYW5fZGV2aWNlW2Rldm51bV0tPnByaXY7CisJCWFybGFuX2NvbW1hbmQoYXJsYW5fZGV2aWNlW2Rldm51bV0sIEFSTEFOX0NPTU1BTkRfQ0xFQU5fQU5EX1JFU0VUKTsKKworCX0gZWxzZQorCQlyZXR1cm4gLTE7CisJKmxlbnAgPSBwb3MgKyAzOworCXJldHVybiBwcm9jX2Rvc3RyaW5nKGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7Cit9CisKKworLyogUGxhY2UgZmlsZXMgaW4gL3Byb2Mvc3lzL2Rldi9hcmxhbiAqLworI2RlZmluZSBDVEJMTihudW0sY2FyZCxuYW0pIFwKKyAgICAgICAgeyAuY3RsX25hbWUgPSBudW0sXAorICAgICAgICAgIC5wcm9jbmFtZSA9ICNuYW0sXAorICAgICAgICAgIC5kYXRhID0gJihhcmxhbl9jb25mW2NhcmRdLm5hbSksXAorICAgICAgICAgIC5tYXhsZW4gPSBzaXplb2YoaW50KSwgLm1vZGUgPSAwNjAwLCAucHJvY19oYW5kbGVyID0gJnByb2NfZG9pbnR2ZWN9CisjaWZkZWYgQVJMQU5fREVCVUdHSU5HCisKKyNkZWZpbmUgQVJMQU5fUFJPQ19ERUJVR19FTlRSSUVTIFwKKyAgICAgICAgeyAuY3RsX25hbWUgPSA0OCwgLnByb2NuYW1lID0gImVudHJ5X2V4aXRfZGVidWciLFwKKyAgICAgICAgICAuZGF0YSA9ICZhcmxhbl9lbnRyeV9hbmRfZXhpdF9kZWJ1ZyxcCisgICAgICAgICAgLm1heGxlbiA9IHNpemVvZihpbnQpLCAubW9kZSA9IDA2MDAsIC5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2ludHZlY30sXAorCXsgLmN0bF9uYW1lID0gNDksIC5wcm9jbmFtZSA9ICJkZWJ1ZyIsIC5kYXRhID0gJmFybGFuX2RlYnVnLFwKKyAgICAgICAgICAubWF4bGVuID0gc2l6ZW9mKGludCksIC5tb2RlID0gMDYwMCwgLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjfSwKKyNlbHNlIAorI2RlZmluZSBBUkxBTl9QUk9DX0RFQlVHX0VOVFJJRVMKKyNlbmRpZgorCisjZGVmaW5lIEFSTEFOX1NZU0NUTF9UQUJMRV9UT1RBTChjYXJkTm8pXAorCUNUQkxOKDEsY2FyZE5vLHNwcmVhZGluZ0NvZGUpLFwKKwlDVEJMTigyLGNhcmRObywgY2hhbm5lbE51bWJlciksXAorCUNUQkxOKDMsY2FyZE5vLCBzY3JhbWJsaW5nRGlzYWJsZSksXAorCUNUQkxOKDQsY2FyZE5vLCB0eEF0dGVudWF0aW9uKSxcCisJQ1RCTE4oNSxjYXJkTm8sIHN5c3RlbUlkKSwgXAorCUNUQkxOKDYsY2FyZE5vLCBtYXhEYXRhZ3JhbVNpemUpLFwKKwlDVEJMTig3LGNhcmRObywgbWF4RnJhbWVTaXplKSxcCisJQ1RCTE4oOCxjYXJkTm8sIG1heFJldHJpZXMpLFwKKwlDVEJMTig5LGNhcmRObywgcmVjZWl2ZU1vZGUpLFwKKwlDVEJMTigxMCxjYXJkTm8sIHByaW9yaXR5KSxcCisJQ1RCTE4oMTEsY2FyZE5vLCByb290T3JSZXBlYXRlciksXAorCUNUQkxOKDEyLGNhcmRObywgU0lEKSxcCisJQ1RCTE4oMTMsY2FyZE5vLCByZWdpc3RyYXRpb25Nb2RlKSxcCisJQ1RCTE4oMTQsY2FyZE5vLCByZWdpc3RyYXRpb25GaWxsKSxcCisJQ1RCTE4oMTUsY2FyZE5vLCBsb2NhbFRhbGtBZGRyZXNzKSxcCisJQ1RCTE4oMTYsY2FyZE5vLCBjb2RlRm9ybWF0KSxcCisJQ1RCTE4oMTcsY2FyZE5vLCBudW1DaGFubmVscyksXAorCUNUQkxOKDE4LGNhcmRObywgY2hhbm5lbDEpLFwKKwlDVEJMTigxOSxjYXJkTm8sIGNoYW5uZWwyKSxcCisJQ1RCTE4oMjAsY2FyZE5vLCBjaGFubmVsMyksXAorCUNUQkxOKDIxLGNhcmRObywgY2hhbm5lbDQpLFwKKwlDVEJMTigyMixjYXJkTm8sIHR4Q2xlYXIpLFwKKwlDVEJMTigyMyxjYXJkTm8sIHR4UmV0cmllcyksXAorCUNUQkxOKDI0LGNhcmRObywgdHhSb3V0aW5nKSxcCisJQ1RCTE4oMjUsY2FyZE5vLCB0eFNjcmFtYmxlZCksXAorCUNUQkxOKDI2LGNhcmRObywgcnhQYXJhbWV0ZXIpLFwKKwlDVEJMTigyNyxjYXJkTm8sIHR4VGltZW91dE1zKSxcCisJQ1RCTE4oMjgsY2FyZE5vLCB3YWl0Q2FyZFRpbWVvdXQpLFwKKwlDVEJMTigyOSxjYXJkTm8sIGNoYW5uZWxTZXQpLCBcCisJey5jdGxfbmFtZSA9IDMwLCAucHJvY25hbWUgPSAibmFtZSIsXAorCSAuZGF0YSA9IGFybGFuX2NvbmZbY2FyZE5vXS5zaXRlTmFtZSxcCisJIC5tYXhsZW4gPSAxNiwgLm1vZGUgPSAwNjAwLCAucHJvY19oYW5kbGVyID0gJnByb2NfZG9zdHJpbmd9LFwKKwlDVEJMTigzMSxjYXJkTm8sd2FpdFRpbWUpLFwKKwlDVEJMTigzMixjYXJkTm8sbFBhcmFtZXRlciksXAorCUNUQkxOKDMzLGNhcmRObyxfMTUpLFwKKwlDVEJMTigzNCxjYXJkTm8saGVhZGVyU2l6ZSksXAorCUNUQkxOKDM2LGNhcmRObyx0eF9kZWxheV9tcyksXAorCUNUQkxOKDM3LGNhcmRObyxyZXRyaWVzKSxcCisJQ1RCTE4oMzgsY2FyZE5vLFJlVHJhbnNtaXRQYWNrZXRNYXhTaXplKSxcCisJQ1RCTE4oMzksY2FyZE5vLHdhaXRSZVRyYW5zbWl0UGFja2V0TWF4U2l6ZSksXAorCUNUQkxOKDQwLGNhcmRObyxmYXN0UmVUcmFuc0NvdW50KSxcCisJQ1RCTE4oNDEsY2FyZE5vLGRyaXZlclJldHJhbnNtaXNzaW9ucyksXAorCUNUQkxOKDQyLGNhcmRObyx0eEFja1RpbWVvdXRNcyksXAorCUNUQkxOKDQzLGNhcmRObyxyZWdpc3RyYXRpb25JbnRlcnJ1cHRzKSxcCisJQ1RCTE4oNDQsY2FyZE5vLGhhcmR3YXJlVHlwZSksXAorCUNUQkxOKDQ1LGNhcmRObyxyYWRpb1R5cGUpLFwKKwlDVEJMTig0NixjYXJkTm8sd3JpdGVFRVBST00pLFwKKwlDVEJMTig0NyxjYXJkTm8sd3JpdGVSYWRpb1R5cGUpLFwKKwlBUkxBTl9QUk9DX0RFQlVHX0VOVFJJRVNcCisJQ1RCTE4oNTAsY2FyZE5vLGluX3NwZWVkKSxcCisJQ1RCTE4oNTEsY2FyZE5vLG91dF9zcGVlZCksXAorCUNUQkxOKDUyLGNhcmRObyxpbl9zcGVlZDEwKSxcCisJQ1RCTE4oNTMsY2FyZE5vLG91dF9zcGVlZDEwKSxcCisJQ1RCTE4oNTQsY2FyZE5vLGluX3NwZWVkX21heCksXAorCUNUQkxOKDU1LGNhcmRObyxvdXRfc3BlZWRfbWF4KSxcCisJQ1RCTE4oNTYsY2FyZE5vLG1lYXN1cmVfcmF0ZSksXAorCUNUQkxOKDU3LGNhcmRObyxwcmVfQ29tbWFuZF9XYWl0KSxcCisJQ1RCTE4oNTgsY2FyZE5vLHJ4X3R3ZWFrMSksXAorCUNUQkxOKDU5LGNhcmRObyxyeF90d2VhazIpLFwKKwlDVEJMTig2MCxjYXJkTm8sdHhfcXVldWVfbGVuKSxcCisKKworCitzdGF0aWMgY3RsX3RhYmxlIGFybGFuX2NvbmZfdGFibGUwW10gPQoreworCUFSTEFOX1NZU0NUTF9UQUJMRV9UT1RBTCgwKQorCisjaWZkZWYgQVJMQU5fUFJPQ19TSE1fRFVNUAorCXsKKwkJLmN0bF9uYW1lCT0gMTUwLAorCQkucHJvY25hbWUJPSAiYXJsYW4wLXR4UmluZyIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvdHhSaW5nLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTEsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjAtcnhSaW5nIiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm9yeFJpbmcsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1MiwKKwkJLnByb2NuYW1lCT0gImFybGFuMC0xOCIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvMTgsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1MywKKwkJLnByb2NuYW1lCT0gImFybGFuMC1yaW5nIiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm8xNjE3MTksCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1NCwKKwkJLnByb2NuYW1lCT0gImFybGFuMC1zaG0tY3B5IiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm8sCisJfSwKKyNlbmRpZgorCXsKKwkJLmN0bF9uYW1lCT0gMTU1LAorCQkucHJvY25hbWUJPSAiY29uZmlnMCIsCisJCS5kYXRhCQk9ICZjb25mX3Jlc2V0X3Jlc3VsdCwKKwkJLm1heGxlbgkJPSAxMDAsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fY29uZmlndXJlCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1NiwKKwkJLnByb2NuYW1lCT0gInJlc2V0MCIsCisJCS5kYXRhCQk9ICZjb25mX3Jlc2V0X3Jlc3VsdCwKKwkJLm1heGxlbgkJPSAxMDAsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX3Jlc2V0LAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgYXJsYW5fY29uZl90YWJsZTFbXSA9Cit7CisKKwlBUkxBTl9TWVNDVExfVEFCTEVfVE9UQUwoMSkKKworI2lmZGVmIEFSTEFOX1BST0NfU0hNX0RVTVAKKwl7CisJCS5jdGxfbmFtZQk9IDE1MCwKKwkJLnByb2NuYW1lCT0gImFybGFuMS10eFJpbmciLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mb3R4UmluZywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTUxLAorCQkucHJvY25hbWUJPSAiYXJsYW4xLXJ4UmluZyIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvcnhSaW5nLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTIsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjEtMTgiLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mbzE4LAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTMsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjEtcmluZyIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvMTYxNzE5LAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTQsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjEtc2htLWNweSIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvLAorCX0sCisjZW5kaWYKKwl7CisJCS5jdGxfbmFtZQk9IDE1NSwKKwkJLnByb2NuYW1lCT0gImNvbmZpZzEiLAorCQkuZGF0YQkJPSAmY29uZl9yZXNldF9yZXN1bHQsCisJCS5tYXhsZW4JCT0gMTAwLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX2NvbmZpZ3VyZSwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTU2LAorCQkucHJvY25hbWUJPSAicmVzZXQxIiwKKwkJLmRhdGEJCT0gJmNvbmZfcmVzZXRfcmVzdWx0LAorCQkubWF4bGVuCQk9IDEwMCwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfcmVzZXQsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSBhcmxhbl9jb25mX3RhYmxlMltdID0KK3sKKworCUFSTEFOX1NZU0NUTF9UQUJMRV9UT1RBTCgyKQorCisjaWZkZWYgQVJMQU5fUFJPQ19TSE1fRFVNUAorCXsKKwkJLmN0bF9uYW1lCT0gMTUwLAorCQkucHJvY25hbWUJPSAiYXJsYW4yLXR4UmluZyIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvdHhSaW5nLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTEsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjItcnhSaW5nIiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm9yeFJpbmcsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1MiwKKwkJLnByb2NuYW1lCT0gImFybGFuMi0xOCIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvMTgsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1MywKKwkJLnByb2NuYW1lCT0gImFybGFuMi1yaW5nIiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm8xNjE3MTksCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1NCwKKwkJLnByb2NuYW1lCT0gImFybGFuMi1zaG0tY3B5IiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm8sCisJfSwKKyNlbmRpZgorCXsKKwkJLmN0bF9uYW1lCT0gMTU1LAorCQkucHJvY25hbWUJPSAiY29uZmlnMiIsCisJCS5kYXRhCQk9ICZjb25mX3Jlc2V0X3Jlc3VsdCwKKwkJLm1heGxlbgkJPSAxMDAsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fY29uZmlndXJlLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTYsCisJCS5wcm9jbmFtZQk9ICJyZXNldDIiLAorCQkuZGF0YQkJPSAmY29uZl9yZXNldF9yZXN1bHQsCisJCS5tYXhsZW4JCT0gMTAwLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9yZXNldCwKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIGFybGFuX2NvbmZfdGFibGUzW10gPQoreworCisJQVJMQU5fU1lTQ1RMX1RBQkxFX1RPVEFMKDMpCisKKyNpZmRlZiBBUkxBTl9QUk9DX1NITV9EVU1QCisJeworCQkuY3RsX25hbWUJPSAxNTAsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjMtdHhSaW5nIiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm90eFJpbmcsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1MSwKKwkJLnByb2NuYW1lCT0gImFybGFuMy1yeFJpbmciLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mb3J4UmluZywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTUyLAorCQkucHJvY25hbWUJPSAiYXJsYW4zLTE4IiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm8xOCwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTUzLAorCQkucHJvY25hbWUJPSAiYXJsYW4zLXJpbmciLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mbzE2MTcxOSwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTU0LAorCQkucHJvY25hbWUJPSAiYXJsYW4zLXNobS1jcHkiLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mbywKKwl9LAorI2VuZGlmCisJeworCQkuY3RsX25hbWUJPSAxNTUsCisJCS5wcm9jbmFtZQk9ICJjb25maWczIiwKKwkJLmRhdGEJCT0gJmNvbmZfcmVzZXRfcmVzdWx0LAorCQkubWF4bGVuCQk9IDEwMCwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9jb25maWd1cmUsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1NiwKKwkJLnByb2NuYW1lCT0gInJlc2V0MyIsCisJCS5kYXRhCQk9ICZjb25mX3Jlc2V0X3Jlc3VsdCwKKwkJLm1heGxlbgkJPSAxMDAsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX3Jlc2V0LAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKKworCitzdGF0aWMgY3RsX3RhYmxlIGFybGFuX3RhYmxlW10gPQoreworCXsKKwkJLmN0bF9uYW1lCT0gMCwKKwkJLnByb2NuYW1lCT0gImFybGFuMCIsCisJCS5tYXhsZW4JCT0gMCwKKwkJLm1vZGUJCT0gMDYwMCwKKwkJLmNoaWxkCQk9IGFybGFuX2NvbmZfdGFibGUwLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAwLAorCQkucHJvY25hbWUJPSAiYXJsYW4xIiwKKwkJLm1heGxlbgkJPSAwLAorCQkubW9kZQkJPSAwNjAwLAorCQkuY2hpbGQJCT0gYXJsYW5fY29uZl90YWJsZTEsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDAsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjIiLAorCQkubWF4bGVuCQk9IDAsCisJCS5tb2RlCQk9IDA2MDAsCisJCS5jaGlsZAkJPSBhcmxhbl9jb25mX3RhYmxlMiwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMCwKKwkJLnByb2NuYW1lCT0gImFybGFuMyIsCisJCS5tYXhsZW4JCT0gMCwKKwkJLm1vZGUJCT0gMDYwMCwKKwkJLmNoaWxkCQk9IGFybGFuX2NvbmZfdGFibGUzLAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKKyNlbHNlCisKK3N0YXRpYyBjdGxfdGFibGUgYXJsYW5fdGFibGVbTUFYX0FSTEFOUyArIDFdID0KK3sKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKyNlbmRpZgorI2Vsc2UKKworc3RhdGljIGN0bF90YWJsZSBhcmxhbl90YWJsZVtNQVhfQVJMQU5TICsgMV0gPQoreworCXsgLmN0bF9uYW1lID0gMCB9Cit9OworI2VuZGlmCisKKworLy8gc3RhdGljIGludCBtbXR1ID0gMTIzNDsKKworc3RhdGljIGN0bF90YWJsZSBhcmxhbl9yb290X3RhYmxlW10gPQoreworCXsKKwkJLmN0bF9uYW1lCT0gMjU0LAorCQkucHJvY25hbWUJPSAiYXJsYW4iLAorCQkubWF4bGVuCQk9IDAsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBhcmxhbl90YWJsZSwKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCisvKiBNYWtlIHN1cmUgdGhhdCAvcHJvYy9zeXMvZGV2IGlzIHRoZXJlICovCisvL3N0YXRpYyBjdGxfdGFibGUgYXJsYW5fZGV2aWNlX3Jvb3RfdGFibGVbXSA9CisvL3sKKy8vCXtDVExfREVWLCAiZGV2IiwgTlVMTCwgMCwgMDU1NSwgYXJsYW5fcm9vdF90YWJsZX0sCisvLwl7MH0KKy8vfTsKKworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqYXJsYW5fZGV2aWNlX3N5c2N0bF9oZWFkZXI7CisKK2ludCBfX2luaXQgaW5pdF9hcmxhbl9wcm9jKHZvaWQpCit7CisKKwlpbnQgaSA9IDA7CisJaWYgKGFybGFuX2RldmljZV9zeXNjdGxfaGVhZGVyKQorCQlyZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0FSTEFOUyAmJiBhcmxhbl9kZXZpY2VbaV07IGkrKykKKwkJYXJsYW5fdGFibGVbaV0uY3RsX25hbWUgPSBpICsgMTsKKwlhcmxhbl9kZXZpY2Vfc3lzY3RsX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShhcmxhbl9yb290X3RhYmxlLCAwKTsKKwlpZiAoIWFybGFuX2RldmljZV9zeXNjdGxfaGVhZGVyKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKKworfQorCit2b2lkIF9fZXhpdCBjbGVhbnVwX2FybGFuX3Byb2Modm9pZCkKK3sKKwl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShhcmxhbl9kZXZpY2Vfc3lzY3RsX2hlYWRlcik7CisJYXJsYW5fZGV2aWNlX3N5c2N0bF9oZWFkZXIgPSBOVUxMOworCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FybGFuLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hcmxhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYTZkN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hcmxhbi5oCkBAIC0wLDAgKzEsNTQxIEBACisvKgorICogIENvcHlyaWdodCAoQykgMTk5NyBDdWxsZW4gSmVubmluZ3MKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTggRWxtZXIuSm9hbmRpQHV0LmVlLCArMzctMjU1LTEzNTAwCQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgkvKiBGb3IgdGhlIHN0YXRpc3RpY3Mgc3RydWN0dXJlLiAqLworI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgkvKiBGb3IgQVJQSFJEX0VUSEVSICovCisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKKworLy8jZGVmaW5lIEFSTEFOX0RFQlVHR0lORyAxCisKKyNkZWZpbmUgQVJMQU5fUFJPQ19JTlRFUkZBQ0UKKyNkZWZpbmUgTUFYX0FSTEFOUyA0IC8qIG5vdCBtb3JlIHRoYW4gNCAhICovCisjZGVmaW5lIEFSTEFOX1BST0NfU0hNX0RVTVAgLyogc2hvd3MgYWxsIGNhcmQgcmVnaXN0ZXJzLCBtYWtlcyBkcml2ZXIgd2F5IGxhcmdlciAqLworCisjZGVmaW5lIEFSTEFOX01BWF9NVUxUSUNBU1RfQUREUlMgMTYKKyNkZWZpbmUgQVJMQU5fUkNWX0NMRUFOIAkwCisjZGVmaW5lIEFSTEFOX1JDVl9QUk9NSVNDIDEKKyNkZWZpbmUgQVJMQU5fUkNWX0NPTlRST0wgMgorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK2V4dGVybiBpbnQgaW5pdF9hcmxhbl9wcm9jKHZvaWQpOworZXh0ZXJuIHZvaWQgY2xlYW51cF9hcmxhbl9wcm9jKHZvaWQpOworI2Vsc2UKKyNkZWZpbmUgaW5pdF9hcmxhbl9wcm9jKCkJKHsgMDsgfSkKKyNkZWZpbmUgY2xlYW51cF9hcmxhbl9wcm9jKCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqYXJsYW5fZGV2aWNlW01BWF9BUkxBTlNdOworZXh0ZXJuIGludAlhcmxhbl9kZWJ1ZzsKK2V4dGVybiBpbnQJYXJsYW5fZW50cnlfZGVidWc7CitleHRlcm4gaW50CWFybGFuX2V4aXRfZGVidWc7CitleHRlcm4gaW50CXRlc3RNZW1vcnk7CitleHRlcm4gaW50ICAgICBhcmxhbl9jb21tYW5kKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCBpbnQgY29tbWFuZCk7CisgCisjZGVmaW5lIFNJRFVOS05PV04gLTEKKyNkZWZpbmUgcmFkaW9Ob2RlSWRVTktOT1dOIC0xCisjZGVmaW5lIGlycVVOS05PV04gMAorI2RlZmluZSBkZWJ1Z1VOS05PV04gMAorI2RlZmluZSB0ZXN0TWVtb3J5VU5LTk9XTiAxCisjZGVmaW5lIHNwcmVhZGluZ0NvZGVVTktOT1dOIDAKKyNkZWZpbmUgY2hhbm5lbE51bWJlclVOS05PV04gMAorI2RlZmluZSBjaGFubmVsU2V0VU5LTk9XTiAwCisjZGVmaW5lIHN5c3RlbUlkVU5LTk9XTiAtMQorI2RlZmluZSByZWdpc3RyYXRpb25Nb2RlVU5LTk9XTiAtMQorCisKKyNkZWZpbmUgSUZERUJVRyggTCApIGlmICggKEwpICYgYXJsYW5fZGVidWcgKSAKKyNkZWZpbmUgQVJMQU5fRkFLRV9IRFJfTEVOIDEyIAorCisjaWZkZWYgQVJMQU5fREVCVUdHSU5HCisJI2RlZmluZSBERUJVRyAxCisJI2RlZmluZSBBUkxBTl9FTlRSWV9FWElUX0RFQlVHR0lORyAxCisJI2RlZmluZSBBUkxBTl9ERUJVRyhhLGIpIHByaW50ayhLRVJOX0RFQlVHIGEsIGIpCisjZWxzZQorCSNkZWZpbmUgQVJMQU5fREVCVUcoYSxiKSAKKyNlbmRpZgorCisjZGVmaW5lIEFSTEFOX1NITUVNX1NJWkUJMHgyMDAwCisKK3N0cnVjdCBhcmxhbl9zaG1lbQoreworICAgICAgLyogSGVhZGVyIFNpZ25hdHVyZSAqLyAKKyAgICAgIHZvbGF0aWxlCWNoYXIgdGV4dFJlZ2lvbls0OF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgcmVzZXRGbGFnOworICAgICAgdm9sYXRpbGUJdV9jaGFyICBkaWFnbm9zdGljSW5mbzsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgZGlhZ25vc3RpY09mZnNldDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfMVsxMl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbGFuQ2FyZE5vZGVJZFs2XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBicm9hZGNhc3RBZGRyZXNzWzZdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGhhcmR3YXJlVHlwZTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBtYWpvckhhcmR3YXJlVmVyc2lvbjsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBtaW5vckhhcmR3YXJlVmVyc2lvbjsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciByYWRpb01vZHVsZTsvLyBzaG93cyBFRVBST00sIGNhbiBiZSBvdmVycmlkZGVuIGF0IDB4MTExCisgICAgICB2b2xhdGlsZQl1X2NoYXIgZGVmYXVsdENoYW5uZWxTZXQ7IC8vIHNob3dzIEVFUHJvbSwgY2FuIGJlIG92ZXJyaWlkZW4gYXQgMHgxMEEKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfMls0N107CisgICAgICAKKyAgICAgIC8qIENvbnRyb2wvU3RhdHVzIEJsb2NrIC0gMHgwMDgwICovCisgICAgICB2b2xhdGlsZQl1X2NoYXIgaW50ZXJydXB0SW5Qcm9ncmVzczsgLyogbm90IHVzZWQgYnkgbGFuY3B1ICovCisgICAgICB2b2xhdGlsZQl1X2NoYXIgY250cmxSZWdJbWFnZTsgLyogbm90IHVzZWQgYnkgbGFuY3B1ICovCisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzNbMTNdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGR1bXBCeXRlOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGNvbW1hbmRCeXRlOyAvKiBub24temVybyA9IGFjdGl2ZSAqLworICAgICAgdm9sYXRpbGUJdV9jaGFyIGNvbW1hbmRQYXJhbWV0ZXJbMTVdOworCisgICAgICAvKiBSZWNlaXZlIFN0YXR1cyAtIDB4MDBhMCAqLworICAgICAgdm9sYXRpbGUJdV9jaGFyIHJ4U3RhdHVzOyAvKiAxLSBkYXRhLCAyLWNvbnRyb2wsIDB4ZmYgLSByZWdpc3RyIGNoYW5nZSAqLworICAgICAgdm9sYXRpbGUJdV9jaGFyIHJ4RnJtVHlwZTsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgcnhPZmZzZXQ7CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IHJ4TGVuZ3RoOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHJ4U3JjWzZdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHJ4QnJvYWRjYXN0RmxhZzsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciByeFF1YWxpdHk7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgc2NyYW1ibGVkOworICAgICAgdm9sYXRpbGUJdV9jaGFyIF80WzFdOworICAgICAgCisgICAgICAvKiBUcmFuc21pdCBTdGF0dXMgLSAweDAwYjAgKi8KKyAgICAgIHZvbGF0aWxlCXVfY2hhciB0eFN0YXR1czsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciB0eEFja1F1YWxpdHk7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtUmV0cmllczsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfNVsxNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgcmVnaXN0ZXJlZFJvdXRlcls2XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBiYWNrYm9uZVJvdXRlcls2XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciByZWdpc3RyYXRpb25TdGF0dXM7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgY29uZmlndXJlZFN0YXR1c0ZsYWc7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzZbMV07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgdWx0aW1hdGVEZXN0QWRkcmVzc1s2XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBpbW1lZERlc3RBZGRyZXNzWzZdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGltbWVkU3JjQWRkcmVzc1s2XTsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgcnhTZXF1ZW5jZU51bWJlcjsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBhc3NpZ25lZExvY2FsdGFsa0FkZHJlc3M7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzdbMjddOworCisgICAgICAvKiBTeXN0ZW0gUGFyYW1ldGVyIEJsb2NrICovCisKKyAgICAgIC8qIC0gRHJpdmVyIFBhcmFtZXRlcnMgKE5vdmVsbCBTcGVjaWZpYykgKi8KKworICAgICAgdm9sYXRpbGUJdV9zaG9ydCB0eFRpbWVvdXQ7CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IHRyYW5zcG9ydFRpbWU7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzhbNF07CisKKyAgICAgIC8qIC0gQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXJzICovCisgICAgICB2b2xhdGlsZQl1X2NoYXIgaXJxTGV2ZWw7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgc3ByZWFkaW5nQ29kZTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBjaGFubmVsU2V0OworICAgICAgdm9sYXRpbGUJdV9jaGFyIGNoYW5uZWxOdW1iZXI7CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IHJhZGlvTm9kZUlkOworICAgICAgdm9sYXRpbGUJdV9jaGFyIF85WzJdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHNjcmFtYmxpbmdEaXNhYmxlOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHJhZGlvVHlwZTsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgcm91dGVySWQ7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzEwWzldOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHR4QXR0ZW51YXRpb247CisgICAgICB2b2xhdGlsZQl1X2NoYXIgc3lzdGVtSWRbNF07IAorICAgICAgdm9sYXRpbGUJdV9zaG9ydCBnbG9iYWxDaGVja3N1bTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfMTFbNF07CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IG1heERhdGFncmFtU2l6ZTsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgbWF4RnJhbWVTaXplOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG1heFJldHJpZXM7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgcmVjZWl2ZU1vZGU7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgcHJpb3JpdHk7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgcm9vdE9yUmVwZWF0ZXI7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgc3BlY2lmaWVkUm91dGVyWzZdOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCBmYXN0UG9sbFBlcmlvZDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBwb2xsRGVjYXk7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgZmFzdFBvbGxEZWxheVsyXTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBhcmxUaHJlc2hvbGQ7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgYXJsRGVjYXk7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzEyWzFdOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCBzcGVjUm91dGVyVGltZW91dDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfMTNbNV07CisKKyAgICAgIC8qIFNjcmFtYmxlZCBBcmVhICovCisgICAgICB2b2xhdGlsZQl1X2NoYXIgU0lEWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGVuY3J5cHRpb25LZXlbMTJdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIF8xNFsyXTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciB3YWl0VGltZVsyXTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBsUGFyYW1ldGVyWzJdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIF8xNVszXTsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgaGVhZGVyU2l6ZTsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgc2VjdGlvbkNoZWNrc3VtOworCisgICAgICB2b2xhdGlsZQl1X2NoYXIgcmVnaXN0cmF0aW9uTW9kZTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciByZWdpc3RyYXRpb25GaWxsOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCBwb2xsUGVyaW9kOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCByZWZyZXNoUGVyaW9kOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG5hbWVbMTZdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIE5JRFs2XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBsb2NhbFRhbGtBZGRyZXNzOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGNvZGVGb3JtYXQ7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtQ2hhbm5lbHM7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgY2hhbm5lbDE7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgY2hhbm5lbDI7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgY2hhbm5lbDM7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgY2hhbm5lbDQ7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgU1NDb2RlWzU5XTsKKworICAgICAgdm9sYXRpbGUJdV9jaGFyIF8xNlsweEMwXTsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgYXV4Q21kOworICAgICAgdm9sYXRpbGUJdV9jaGFyICBkdW1wUHRyWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGR1bXBWYWw7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzE3WzB4NkFdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHdpcmVUZXN0OworICAgICAgdm9sYXRpbGUJdV9jaGFyIF8xOFsxNF07CisKKyAgICAgIC8qIFN0YXRpc3RpY3MgQmxvY2sgLSAweDAzMDAgKi8KKyAgICAgIHZvbGF0aWxlCXVfY2hhciBob3N0Y3B1TG9jazsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBsYW5jcHVMb2NrOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHJlc2V0VGltZVsxOF07CisgICAgICAKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1EYXRhZ3JhbXNUcmFuc21pdHRlZFs0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1SZVRyYW5zbWlzc2lvbnNbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtRnJhbWVzRGlzY2FyZGVkWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bURhdGFncmFtc1JlY2VpdmVkWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bUR1cGxpY2F0ZVJlY2VpdmVkRnJhbWVzWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bURhdGFncmFtc0Rpc2NhcmRlZFs0XTsKKyAgICAgIAorICAgICAgdm9sYXRpbGUJdV9zaG9ydCBtYXhOdW1SZVRyYW5zbWl0RGF0YWdyYW07CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IG1heE51bVJlVHJhbnNtaXRGcmFtZXM7CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IG1heE51bUNvbnNlY3V0aXZlRHVwbGljYXRlRnJhbWVzOworICAgICAgLyogbWlzYWxpZ25lZCBoZXJlIHNvIHdlIGhhdmUgdG8gZ28gdG8gY2hhcmFjdGVycyAqLworICAgICAKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1CeXRlc1RyYW5zbWl0dGVkWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bUJ5dGVzUmVjZWl2ZWRbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtQ1JDRXJyb3JzWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bUxlbmd0aEVycm9yc1s0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1BYm9ydEVycm9yc1s0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1UWFVuZGVycnVuc1s0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1SWE92ZXJydW5zWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bUhvbGRPZmZzWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bUZyYW1lc1RyYW5zbWl0dGVkWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bUZyYW1lc1JlY2VpdmVkWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bVJlY2VpdmVGcmFtZXNMb3N0WzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bVJYQnVmZmVyT3ZlcmZsb3dzWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bUZyYW1lc0Rpc2NhcmRlZEFkZHJNaXNtYXRjaFs0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1GcmFtZXNEaXNjYXJkZWRTSURNaXNtYXRjaFs0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1Qb2xsc1RyYW5zbWlzdHRlZFs0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1Qb2xsQWNrbm93bGVkZ2VzWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bVN0YXR1c1RpbWVvdXRzWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bU5BQ0tSZWNlaXZlZFs0XTsKKworICAgICAgdm9sYXRpbGUJdV9jaGFyIF8xOVsweDg2XTsKKworICAgICAgdm9sYXRpbGUJdV9jaGFyIHR4QnVmZmVyWzB4ODAwXTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciByeEJ1ZmZlclsweDgwMF07CisKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfMjBbMHg4MDBdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIF8yMVsweDNmYl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgY29uZmlnU3RhdHVzOworICAgICAgdm9sYXRpbGUJdV9jaGFyIF8yMjsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBwcm9nSU9DdHJsOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHNoYXJlTUJhc2U7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgY29udHJvbFJlZ2lzdGVyOworfTsKKworc3RydWN0IGFybGFuX2NvbmZfc3RydSB7CisgICAgICBpbnQgc3ByZWFkaW5nQ29kZTsKKyAgICAgIGludCBjaGFubmVsU2V0OworICAgICAgaW50IGNoYW5uZWxOdW1iZXI7CisgICAgICBpbnQgc2NyYW1ibGluZ0Rpc2FibGU7CisgICAgICBpbnQgdHhBdHRlbnVhdGlvbjsKKyAgICAgIGludCBzeXN0ZW1JZDsgCisgICAgICBpbnQgbWF4RGF0YWdyYW1TaXplOworICAgICAgaW50IG1heEZyYW1lU2l6ZTsKKyAgICAgIGludCBtYXhSZXRyaWVzOworICAgICAgaW50IHJlY2VpdmVNb2RlOworICAgICAgaW50IHByaW9yaXR5OworICAgICAgaW50IHJvb3RPclJlcGVhdGVyOworICAgICAgaW50IFNJRDsKKyAgICAgIGludCByYWRpb05vZGVJZDsKKyAgICAgIGludCByZWdpc3RyYXRpb25Nb2RlOworICAgICAgaW50IHJlZ2lzdHJhdGlvbkZpbGw7CisgICAgICBpbnQgbG9jYWxUYWxrQWRkcmVzczsKKyAgICAgIGludCBjb2RlRm9ybWF0OworICAgICAgaW50IG51bUNoYW5uZWxzOworICAgICAgaW50IGNoYW5uZWwxOworICAgICAgaW50IGNoYW5uZWwyOworICAgICAgaW50IGNoYW5uZWwzOworICAgICAgaW50IGNoYW5uZWw0OworICAgICAgaW50IHR4Q2xlYXI7CisgICAgICBpbnQgdHhSZXRyaWVzOworICAgICAgaW50IHR4Um91dGluZzsKKyAgICAgIGludCB0eFNjcmFtYmxlZDsKKyAgICAgIGludCByeFBhcmFtZXRlcjsKKyAgICAgIGludCB0eFRpbWVvdXRNczsKKyAgICAgIGludCB0eEFja1RpbWVvdXRNczsKKyAgICAgIGludCB3YWl0Q2FyZFRpbWVvdXQ7CisgICAgICBpbnQJd2FpdFRpbWU7CisgICAgICBpbnQJbFBhcmFtZXRlcjsKKyAgICAgIGludAlfMTU7CisgICAgICBpbnQJaGVhZGVyU2l6ZTsKKyAgICAgIGludCByZXRyaWVzOworICAgICAgaW50IHR4X2RlbGF5X21zOworICAgICAgaW50IHdhaXRSZVRyYW5zbWl0UGFja2V0TWF4U2l6ZTsKKyAgICAgIGludCBSZVRyYW5zbWl0UGFja2V0TWF4U2l6ZTsKKyAgICAgIGludCBmYXN0UmVUcmFuc0NvdW50OworICAgICAgaW50IGRyaXZlclJldHJhbnNtaXNzaW9uczsKKyAgICAgIGludCByZWdpc3RyYXRpb25JbnRlcnJ1cHRzOworICAgICAgaW50IGhhcmR3YXJlVHlwZTsKKyAgICAgIGludCByYWRpb1R5cGU7CisgICAgICBpbnQgd3JpdGVSYWRpb1R5cGU7CisgICAgICBpbnQgd3JpdGVFRVBST007CisgICAgICBjaGFyIHNpdGVOYW1lWzE3XTsKKyAgICAgIGludCBtZWFzdXJlX3JhdGU7CisgICAgICBpbnQgaW5fc3BlZWQ7CisgICAgICBpbnQgb3V0X3NwZWVkOworICAgICAgaW50IGluX3NwZWVkMTA7CisgICAgICBpbnQgb3V0X3NwZWVkMTA7CisgICAgICBpbnQgaW5fc3BlZWRfbWF4OworICAgICAgaW50IG91dF9zcGVlZF9tYXg7CisgICAgICBpbnQgcHJlX0NvbW1hbmRfV2FpdDsKKyAgICAgIGludCByeF90d2VhazE7CisgICAgICBpbnQgcnhfdHdlYWsyOworICAgICAgaW50IHR4X3F1ZXVlX2xlbjsKK307CisKK2V4dGVybiBzdHJ1Y3QgYXJsYW5fY29uZl9zdHJ1IGFybGFuX2NvbmZbTUFYX0FSTEFOU107CisKK3N0cnVjdCBUeFBhcmFtCit7CisgICAgICB2b2xhdGlsZQlzaG9ydCAJCW9mZnNldDsKKyAgICAgIHZvbGF0aWxlIAlzaG9ydCAJCWxlbmd0aDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciAJCWRlc3RbNl07CisgICAgICB2b2xhdGlsZQl1bnNpZ25lZAljaGFyIGNsZWFyOworICAgICAgdm9sYXRpbGUJdW5zaWduZWQJY2hhciByZXRyaWVzOworICAgICAgdm9sYXRpbGUJdW5zaWduZWQJY2hhciByb3V0aW5nOworICAgICAgdm9sYXRpbGUJdW5zaWduZWQJY2hhciBzY3JhbWJsZWQ7Cit9OworCisjZGVmaW5lIFRYX1JJTkdfU0laRSAyCisvKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4gKi8KK3N0cnVjdCBhcmxhbl9wcml2YXRlIHsKKyAgICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworICAgICAgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKiBjYXJkOworICAgICAgc3RydWN0IGFybGFuX3NobWVtICogY29uZjsKKworICAgICAgc3RydWN0IGFybGFuX2NvbmZfc3RydSAqIENvbmY7CSAgICAgCisgICAgICBpbnQJYmFkOworICAgICAgaW50IAlyZXNldDsKKyAgICAgIHVuc2lnbmVkIGxvbmcgbGFzdFJlc2V0OworICAgICAgc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisgICAgICBzdHJ1Y3QgdGltZXJfbGlzdCB0eF9kZWxheV90aW1lcjsKKyAgICAgIHN0cnVjdCB0aW1lcl9saXN0IHR4X3JldHJ5X3RpbWVyOworICAgICAgc3RydWN0IHRpbWVyX2xpc3QgcnhfY2hlY2tfdGltZXI7CisKKyAgICAgIGludCByZWdpc3RyYXRpb25Mb3N0Q291bnQ7CisgICAgICBpbnQgcmVSZWdpc3RlckV4cDsKKyAgICAgIGludCBpcnFfdGVzdF9kb25lOworCisgICAgICBzdHJ1Y3QgVHhQYXJhbSB0eFJpbmdbVFhfUklOR19TSVpFXTsKKyAgICAgIGNoYXIgcmVUcmFuc21pdEJ1ZmZbMHg4MDBdOworICAgICAgaW50IHR4TGFzdDsKKyAgICAgIHVuc2lnbmVkIFJlVHJhbnNtaXRSZXF1ZXN0ZWQ7CisgICAgICB1bnNpZ25lZCBsb25nIHR4X2RvbmVfZGVsYXllZDsKKyAgICAgIHVuc2lnbmVkIGxvbmcgcmVnaXN0cmF0aW9uTGFzdFNlZW47CisKKyAgICAgIHVuc2lnbmVkIGxvbmcJdHhfbGFzdF9zZW50OworICAgICAgdW5zaWduZWQgbG9uZwl0eF9sYXN0X2NsZWFyZWQ7CisgICAgICB1bnNpZ25lZCBsb25nCXJldHJhbnNtaXNzaW9uczsKKyAgICAgIHVuc2lnbmVkIGxvbmcgCWludGVycnVwdF9hY2tfcmVxdWVzdGVkOworICAgICAgc3BpbmxvY2tfdAlsb2NrOworICAgICAgdW5zaWduZWQgbG9uZwl3YWl0aW5nX2NvbW1hbmRfbWFzazsKKyAgICAgIHVuc2lnbmVkIGxvbmcgCWNhcmRfcG9sbGluZ19pbnRlcnZhbDsKKyAgICAgIHVuc2lnbmVkIGxvbmcgCWxhc3RfY29tbWFuZF9idWZmX2ZyZWVfdGltZTsKKworICAgICAgaW50IAkJdW5kZXJfcmVzZXQ7CisgICAgICBpbnQgCQl1bmRlcl9jb25maWc7CisgICAgICBpbnQgCQlyeF9jb21tYW5kX2dpdmVuOworICAgICAgaW50CSAJdHhfY29tbWFuZF9naXZlbjsKKyAgICAgIHVuc2lnbmVkICBsb25nCWludGVycnVwdF9wcm9jZXNzaW5nX2FjdGl2ZTsKKyAgICAgIHVuc2lnbmVkIGxvbmcJbGFzdF9yeF9pbnRfYWNrX3RpbWU7CisgICAgICB1bnNpZ25lZCBsb25nCWluX2J5dGVzOworICAgICAgdW5zaWduZWQgbG9uZyAJb3V0X2J5dGVzOworICAgICAgdW5zaWduZWQgbG9uZwlpbl90aW1lOworICAgICAgdW5zaWduZWQgbG9uZwlvdXRfdGltZTsKKyAgICAgIHVuc2lnbmVkIGxvbmcJaW5fdGltZTEwOworICAgICAgdW5zaWduZWQgbG9uZwlvdXRfdGltZTEwOworICAgICAgdW5zaWduZWQgbG9uZwlpbl9ieXRlczEwOworICAgICAgdW5zaWduZWQgbG9uZyAJb3V0X2J5dGVzMTA7CisgICAgICBpbnQJaW5pdF9ldGhlcmRldl9hbGxvYzsKK307CisKKworCisjZGVmaW5lIEFSTEFOX0NMRUFSCQkweDAwCisjZGVmaW5lIEFSTEFOX1JFU0VUIAkJMHgwMQorI2RlZmluZSBBUkxBTl9DSEFOTkVMX0FUVEVOVElPTiAweDAyCisjZGVmaW5lIEFSTEFOX0lOVEVSUlVQVF9FTkFCTEUgCTB4MDQKKyNkZWZpbmUgQVJMQU5fQ0xFQVJfSU5URVJSVVBUIAkweDA4CisjZGVmaW5lIEFSTEFOX1BPV0VSIAkJMHg0MAorI2RlZmluZSBBUkxBTl9BQ0NFU1MJCTB4ODAKKworI2RlZmluZSBBUkxBTl9DT01fQ09ORiAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEFSTEFOX0NPTV9SWF9FTkFCTEUgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgQVJMQU5fQ09NX1JYX0FCT1JUICAgICAgICAgICAgMHgwNAorI2RlZmluZSBBUkxBTl9DT01fVFhfRU5BQkxFICAgICAgICAgICAweDA1CisjZGVmaW5lIEFSTEFOX0NPTV9UWF9BQk9SVCAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgQVJMQU5fQ09NX05PUAkJICAgICAgMHgwNworI2RlZmluZSBBUkxBTl9DT01fU1RBTkRCWSAgICAgICAgICAgICAweDA4CisjZGVmaW5lIEFSTEFOX0NPTV9BQ1RJVkFURSAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgQVJMQU5fQ09NX0dPVE9fU0xPV19QT0xMICAgICAgMHgwYQorI2RlZmluZSBBUkxBTl9DT01fSU5UICAgICAgICAgICAgICAgICAweDgwCisKKworI2RlZmluZSBUWExBU1QoZGV2KSAoKChzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqKW5ldGRldl9wcml2KGRldikpLT50eFJpbmdbKChzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqKW5ldGRldl9wcml2KGRldikpLT50eExhc3RdKQorI2RlZmluZSBUWEhFQUQoZGV2KSAoKChzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqKW5ldGRldl9wcml2KGRldikpLT50eFJpbmdbMF0pCisjZGVmaW5lIFRYVEFJTChkZXYpICgoKHN0cnVjdCBhcmxhbl9wcml2YXRlICopbmV0ZGV2X3ByaXYoZGV2KSktPnR4UmluZ1sxXSkKKworI2RlZmluZSBUWEJ1ZmZTdGFydChkZXYpIG9mZnNldG9mKHN0cnVjdCBhcmxhbl9zaG1lbSwgdHhCdWZmZXIpCisjZGVmaW5lIFRYQnVmZkVuZChkZXYpIG9mZnNldG9mKHN0cnVjdCBhcmxhbl9zaG1lbSwgeHhCdWZmZXIpCisgCisjZGVmaW5lIFJFQURTSE0odG8sZnJvbSxhdHlwZSkge1wKKwlhdHlwZSB0bXA7XAorCW1lbWNweV9mcm9taW8oJih0bXApLCYoZnJvbSksc2l6ZW9mKGF0eXBlKSk7XAorCXRvID0gdG1wO1wKKwl9CisKKyNkZWZpbmUgUkVBRFNITUVNKGZyb20sYXR5cGUpXAorCWF0eXBlIGZyb207IFwKKwlSRUFEU0hNKGZyb20sIGFybGFuLT5mcm9tLCBhdHlwZSk7CisKKyNkZWZpbmUgV1JJVEVTSE0odG8sZnJvbSxhdHlwZSkgXAorCXsgYXR5cGUgdG1wU0hNID0gZnJvbTtcCisJbWVtY3B5X3RvaW8oJih0byksJnRtcFNITSxzaXplb2YoYXR5cGUpKTtcCisJfQorCisjZGVmaW5lIERFQlVHU0hNKGxldmVsU0hNLHN0cmluZ1NITSxzdHVmZixhdHlwZSkgXAorCXsJYXR5cGUgdG1wU0hNOyBcCisJCW1lbWNweV9mcm9taW8oJnRtcFNITSwmKHN0dWZmKSxzaXplb2YoYXR5cGUpKTtcCisJCUlGREVCVUcobGV2ZWxTSE0pIHByaW50ayhzdHJpbmdTSE0sdG1wU0hNKTtcCisJfQorCisjZGVmaW5lIFdSSVRFU0hNQih0bywgdmFsKSBcCisJd3JpdGViKHZhbCwmKHRvKSkKKyNkZWZpbmUgUkVBRFNITUIodG8pIFwKKwlyZWFkYigmKHRvKSkKKyNkZWZpbmUgV1JJVEVTSE1TKHRvLCB2YWwpIFwKKwl3cml0ZXcodmFsLCYodG8pKQorI2RlZmluZSBSRUFEU0hNUyh0bykgXAorCXJlYWR3KCYodG8pKQorI2RlZmluZSBXUklURVNITUkodG8sIHZhbCkgXAorCXdyaXRlbCh2YWwsJih0bykpCisjZGVmaW5lIFJFQURTSE1JKHRvKSBcCisJcmVhZGwoJih0bykpCisKKworCisKKworI2RlZmluZSByZWdpc3RyYXRpb25CYWQoZGV2KVwKKyAgICggKCAgIFJFQURTSE1CKCgoc3RydWN0IGFybGFuX3ByaXZhdGUgKiluZXRkZXZfcHJpdihkZXYpKS0+Y2FyZC0+cmVnaXN0cmF0aW9uTW9kZSkgICAgPiAwKSAmJiBcCisgICAgICggICBSRUFEU0hNQigoKHN0cnVjdCBhcmxhbl9wcml2YXRlICopbmV0ZGV2X3ByaXYoZGV2KSktPmNhcmQtPnJlZ2lzdHJhdGlvblN0YXR1cykgPT0gMCkgICAgKQorCisKKyNkZWZpbmUgcmVhZENvbnRyb2xSZWdpc3RlcihkZXYpXAorIAlSRUFEU0hNQigoKHN0cnVjdCBhcmxhbl9wcml2YXRlICopbmV0ZGV2X3ByaXYoZGV2KSktPmNhcmQtPmNudHJsUmVnSW1hZ2UpCisKKyNkZWZpbmUgd3JpdGVDb250cm9sUmVnaXN0ZXIoZGV2LCB2KXtcCisgICBXUklURVNITUIoKChzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqKW5ldGRldl9wcml2KGRldikpLT5jYXJkLT5jbnRybFJlZ0ltYWdlCSwoKHYpICYweEYpICk7XAorICAgV1JJVEVTSE1CKCgoc3RydWN0IGFybGFuX3ByaXZhdGUgKiluZXRkZXZfcHJpdihkZXYpKS0+Y2FyZC0+Y29udHJvbFJlZ2lzdGVyCSwodikgCSk7fQorCisKKyNkZWZpbmUgYXJsYW5faW50ZXJydXB0X2xhbmNwdShkZXYpIHtcCisgICBpbnQgY3I7ICAgXAorICAgXAorICAgY3IgPSByZWFkQ29udHJvbFJlZ2lzdGVyKGRldik7XAorICAgaWYgKGNyICYgQVJMQU5fQ0hBTk5FTF9BVFRFTlRJT04peyBcCisgICAgICB3cml0ZUNvbnRyb2xSZWdpc3RlcihkZXYsIChjciAmIH5BUkxBTl9DSEFOTkVMX0FUVEVOVElPTikpO1wKKyAgIH1lbHNlICBcCisgICAgICB3cml0ZUNvbnRyb2xSZWdpc3RlcihkZXYsIChjciB8IEFSTEFOX0NIQU5ORUxfQVRURU5USU9OKSk7XAorfQorCisjZGVmaW5lIGNsZWFyQ2hhbm5lbEF0dGVudGlvbihkZXYpeyBcCisgICB3cml0ZUNvbnRyb2xSZWdpc3RlcihkZXYscmVhZENvbnRyb2xSZWdpc3RlcihkZXYpICYgfkFSTEFOX0NIQU5ORUxfQVRURU5USU9OKTt9CisjZGVmaW5lIHNldEhhcmR3YXJlUmVzZXQoZGV2KSB7XAorICAgd3JpdGVDb250cm9sUmVnaXN0ZXIoZGV2LHJlYWRDb250cm9sUmVnaXN0ZXIoZGV2KSB8IEFSTEFOX1JFU0VUKTt9CisjZGVmaW5lIGNsZWFySGFyZHdhcmVSZXNldChkZXYpIHtcCisgICB3cml0ZUNvbnRyb2xSZWdpc3RlcihkZXYscmVhZENvbnRyb2xSZWdpc3RlcihkZXYpICYgfkFSTEFOX1JFU0VUKTt9CisjZGVmaW5lIHNldEludGVycnVwdEVuYWJsZShkZXYpe1wKKyAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldixyZWFkQ29udHJvbFJlZ2lzdGVyKGRldikgfCBBUkxBTl9JTlRFUlJVUFRfRU5BQkxFKSAgO30KKyNkZWZpbmUgY2xlYXJJbnRlcnJ1cHRFbmFibGUoZGV2KXtcCisgICB3cml0ZUNvbnRyb2xSZWdpc3RlcihkZXYscmVhZENvbnRyb2xSZWdpc3RlcihkZXYpICYgfkFSTEFOX0lOVEVSUlVQVF9FTkFCTEUpICA7fQorI2RlZmluZSBzZXRDbGVhckludGVycnVwdChkZXYpe1wKKyAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldixyZWFkQ29udHJvbFJlZ2lzdGVyKGRldikgfCBBUkxBTl9DTEVBUl9JTlRFUlJVUFQpICAgO30KKyNkZWZpbmUgY2xlYXJDbGVhckludGVycnVwdChkZXYpe1wKKyAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldixyZWFkQ29udHJvbFJlZ2lzdGVyKGRldikgJiB+QVJMQU5fQ0xFQVJfSU5URVJSVVBUKTt9CisjZGVmaW5lIHNldFBvd2VyT2ZmKGRldil7XAorICAgd3JpdGVDb250cm9sUmVnaXN0ZXIoZGV2LHJlYWRDb250cm9sUmVnaXN0ZXIoZGV2KSB8IChBUkxBTl9QT1dFUiAmJiBBUkxBTl9BQ0NFU1MpKTtcCisgICB3cml0ZUNvbnRyb2xSZWdpc3RlcihkZXYscmVhZENvbnRyb2xSZWdpc3RlcihkZXYpICYgfkFSTEFOX0FDQ0VTUyk7fQorI2RlZmluZSBzZXRQb3dlck9uKGRldil7XAorICAgd3JpdGVDb250cm9sUmVnaXN0ZXIoZGV2LHJlYWRDb250cm9sUmVnaXN0ZXIoZGV2KSAmIH4oQVJMQU5fUE9XRVIpKTsgICB9CisjZGVmaW5lIGFybGFuX2xvY2tfY2FyZF9hY2Nlc3MoZGV2KXtcCisgICB3cml0ZUNvbnRyb2xSZWdpc3RlcihkZXYscmVhZENvbnRyb2xSZWdpc3RlcihkZXYpICYgfkFSTEFOX0FDQ0VTUyk7fQorI2RlZmluZSBhcmxhbl91bmxvY2tfY2FyZF9hY2Nlc3MoZGV2KXtcCisgICB3cml0ZUNvbnRyb2xSZWdpc3RlcihkZXYscmVhZENvbnRyb2xSZWdpc3RlcihkZXYpIHwgQVJMQU5fQUNDRVNTICk7IH0gIAorCisKKworCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfUlgJCTB4MDAwMDAxCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfTk9PUAkJMHgwMDAwMDIKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9OT09QSU5UCQkweDAwMDAwNAorI2RlZmluZSBBUkxBTl9DT01NQU5EX1RYCQkweDAwMDAwOAorI2RlZmluZSBBUkxBTl9DT01NQU5EX0NPTkYJCTB4MDAwMDEwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfUkVTRVQJCTB4MDAwMDIwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfVFhfQUJPUlQJCTB4MDAwMDQwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfUlhfQUJPUlQJCTB4MDAwMDgwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfUE9XRVJET1dOCQkweDAwMDEwMAorI2RlZmluZSBBUkxBTl9DT01NQU5EX1BPV0VSVVAJCTB4MDAwMjAwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfU0xPV19QT0xMIAkweDAwMDQwMAorI2RlZmluZSBBUkxBTl9DT01NQU5EX0FDVElWQVRFIAkJMHgwMDA4MDAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9JTlRfQUNLCQkweDAwMTAwMAorI2RlZmluZSBBUkxBTl9DT01NQU5EX0lOVF9FTkFCTEUJMHgwMDIwMDAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9XQUlUX05PVwkJMHgwMDQwMDAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9MT05HX1dBSVRfTk9XCTB4MDA4MDAwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfU1RBTkRCWQkJMHgwMTAwMDAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9JTlRfUkFDSwkJMHgwMjAwMDAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9JTlRfUkVOQUJMRQkweDA0MDAwMAorI2RlZmluZSBBUkxBTl9DT01NQU5EX0NPTkZfV0FJVAkJMHgwODAwMDAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9UQlVTWV9DTEVBUgkweDEwMDAwMAorI2RlZmluZSBBUkxBTl9DT01NQU5EX0NMRUFOX0FORF9DT05GCShBUkxBTl9DT01NQU5EX1RYX0FCT1JUXAorCQkJCQl8IEFSTEFOX0NPTU1BTkRfUlhfQUJPUlRcCisJCQkJCXwgQVJMQU5fQ09NTUFORF9DT05GKQorI2RlZmluZSBBUkxBTl9DT01NQU5EX0NMRUFOX0FORF9SRVNFVCAgIChBUkxBTl9DT01NQU5EX1RYX0FCT1JUXAorCQkJCQl8IEFSTEFOX0NPTU1BTkRfUlhfQUJPUlRcCisJCQkJCXwgQVJMQU5fQ09NTUFORF9SRVNFVCkKKworCisgCisjZGVmaW5lIEFSTEFOX0RFQlVHX0NIQUlOX0xPQ0tTCQkweDAwMDAxCisjZGVmaW5lIEFSTEFOX0RFQlVHX1JFU0VUCQkweDAwMDAyCisjZGVmaW5lIEFSTEFOX0RFQlVHX1RJTUlORwkJMHgwMDAwNAorI2RlZmluZSBBUkxBTl9ERUJVR19DQVJEX1NUQVRFCQkweDAwMDA4CisjZGVmaW5lIEFSTEFOX0RFQlVHX1RYX0NIQUlOCQkweDAwMDEwCisjZGVmaW5lIEFSTEFOX0RFQlVHX01VTFRJQ0FTVAkJMHgwMDAyMAorI2RlZmluZSBBUkxBTl9ERUJVR19IRUFERVJfRFVNUAkJMHgwMDA0MAorI2RlZmluZSBBUkxBTl9ERUJVR19JTlRFUlJVUFQJCTB4MDAwODAKKyNkZWZpbmUgQVJMQU5fREVCVUdfU1RBUlRVUAkJMHgwMDEwMAorI2RlZmluZSBBUkxBTl9ERUJVR19TSFVURE9XTgkJMHgwMDIwMAorIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhN2QzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMKQEAgLTAsMCArMSw0MjcyIEBACisvKioqIC0qLSBsaW51eC1jIC0qLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgRHJpdmVyIGZvciBBdG1lbCBhdDc2YzUwMiBhdDc2YzUwNCBhbmQgYXQ3NmM1MDYgd2lyZWxlc3MgY2FyZHMuCisKKyAgICAgICAgQ29weXJpZ2h0IDIwMDAtMjAwMSBBVE1FTCBDb3Jwb3JhdGlvbi4KKyAgICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNCBTaW1vbiBLZWxsZXkuCisKKyAgICBUaGlzIGNvZGUgd2FzIGRldmVsb3BlZCBmcm9tIHZlcnNpb24gMi4xLjEgb2YgdGhlIEF0bWVsIGRyaXZlcnMsIAorICAgIHJlbGVhc2VkIGJ5IEF0bWVsIGNvcnAuIHVuZGVyIHRoZSBHUEwgaW4gRGVjZW1iZXIgMjAwMi4gSXQgYWxzbyAKKyAgICBpbmNsdWRlcyBjb2RlIGZyb20gdGhlIExpbnV4IGFpcm9uZXQgZHJpdmVycyAoQykgQmVuamFtaW4gUmVlZCwgCisgICAgYW5kIHRoZSBMaW51eCBQQ01DSUEgcGFja2FnZSwgKEMpIERhdmlkIEhpbmRzIGFuZCB0aGUgTGludXggd2lyZWxlc3MKKyAgICBleHRlbnNpb25zLCAoQykgSmVhbiBUb3VycmlsaGVzLgorCisgICAgVGhlIGZpcm13YXJlIG1vZHVsZSBmb3IgcmVhZGluZyB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIGNhcmQgY29tZXMgZnJvbQorICAgIG5ldC5ydXNzb3R0by5BdG1lbE1BQ0ZXLCB3cml0dGVuIGJ5IE1hdHRoZXcgVC4gUnVzc290dG8gYW5kIGNvcHlyaWdodAorICAgIGJ5IGhpbS4gbmV0LnJ1c3NvdHRvLkF0bWVsTUFDRlcgaXMgdXNlZCB1bmRlciB0aGUgR1BMIGxpY2Vuc2UgdmVyc2lvbiAyLgorICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbW9kdWxlIGluIGJpbmFyeSBmb3JtIGFuZCwgdW5kZXIgdGhlIHRlcm1zCisgICAgb2YgdGhlIEdQTCwgaW4gc291cmNlIGZvcm0uIFRoZSBzb3VyY2UgaXMgbG9jYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIEF0bWVsIHdpcmVsZXNzIGxhbiBkcml2ZXJzOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICAgRm9yIGFsbCBxdWVyaWVzIGFib3V0IHRoaXMgY29kZSwgcGxlYXNlIGNvbnRhY3QgdGhlIGN1cnJlbnQgYXV0aG9yLCAKKyAgICBTaW1vbiBLZWxsZXkgPHNpbW9uQHRoZWtlbGxleXMub3JnLnVrPiBhbmQgbm90IEF0bWVsIENvcnBvcmF0aW9uLgorCisgICAgQ3JlZGl0IGlzIGR1ZSB0byBIUCBVSyBhbmQgQ2FtYnJpZGdlIE9ubGluZSBTeXN0ZW1zIEx0ZCBmb3Igc3VwcGx5aW5nCisgICAgaGFyZHdhcmUgdXNlZCBkdXJpbmcgZGV2ZWxvcG1lbnQgb2YgdGhpcyBkcml2ZXIuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSAiaWVlZTgwMl8xMS5oIgorI2luY2x1ZGUgImF0bWVsLmgiCisKKyNkZWZpbmUgRFJJVkVSX01BSk9SIDAKKyNkZWZpbmUgRFJJVkVSX01JTk9SIDk2CisKK01PRFVMRV9BVVRIT1IoIlNpbW9uIEtlbGxleSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBwb3J0IGZvciBBdG1lbCBhdDc2YzUweCA4MDIuMTEgd2lyZWxlc3MgZXRoZXJuZXQgY2FyZHMuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiQXRtZWwgYXQ3NmM1MHggd2lyZWxlc3MgY2FyZHMiKTsKKworLyogVGhlIG5hbWUgb2YgdGhlIGZpcm13YXJlIGZpbGUgdG8gYmUgbG9hZGVkIAorICAgb3Zlci1yaWRlcyBhbnkgYXV0b21hdGljIHNlbGVjdGlvbiAqLworc3RhdGljIGNoYXIgKmZpcm13YXJlID0gTlVMTDsKK21vZHVsZV9wYXJhbShmaXJtd2FyZSwgY2hhcnAsIDApOworCisvKiB0YWJsZSBvZiBmaXJtd2FyZSBmaWxlIG5hbWVzICovCitzdGF0aWMgc3RydWN0IHsgCisJQXRtZWxGV1R5cGUgZndfdHlwZTsKKwljb25zdCBjaGFyICpmd19maWxlOworCWNvbnN0IGNoYXIgKmZ3X2ZpbGVfZXh0OworfSBmd190YWJsZVtdID0geworCXsgQVRNRUxfRldfVFlQRV81MDIsICAgICAgImF0bWVsX2F0NzZjNTAyIiwgICAgICAiYmluIiB9LAorCXsgQVRNRUxfRldfVFlQRV81MDJELCAgICAgImF0bWVsX2F0NzZjNTAyZCIsICAgICAiYmluIiB9LAorCXsgQVRNRUxfRldfVFlQRV81MDJFLCAgICAgImF0bWVsX2F0NzZjNTAyZSIsICAgICAiYmluIiB9LAorCXsgQVRNRUxfRldfVFlQRV81MDJfM0NPTSwgImF0bWVsX2F0NzZjNTAyXzNjb20iLCAiYmluIiB9LAorCXsgQVRNRUxfRldfVFlQRV81MDQsICAgICAgImF0bWVsX2F0NzZjNTA0IiwgICAgICAiYmluIiB9LAorCXsgQVRNRUxfRldfVFlQRV81MDRfMjk1OCwgImF0bWVsX2F0NzZjNTA0XzI5NTgiLCAiYmluIiB9LAorCXsgQVRNRUxfRldfVFlQRV81MDRBXzI5NTgsImF0bWVsX2F0NzZjNTA0YV8yOTU4IiwiYmluIiB9LAorCXsgQVRNRUxfRldfVFlQRV81MDYsICAgICAgImF0bWVsX2F0NzZjNTA2IiwgICAgICAiYmluIiB9LAorCXsgQVRNRUxfRldfVFlQRV9OT05FLCAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgTlVMTCB9Cit9OworCisjZGVmaW5lIE1BWF9TU0lEX0xFTkdUSCAzMgorI2RlZmluZSBNR01UX0pJRkZJRVMgKDI1NiAqIEhaIC8gMTAwKQorCisjZGVmaW5lIE1BWF9CU1NfRU5UUklFUwk2NAkKKworLyogcmVnaXN0ZXJzICovCisjZGVmaW5lIEdDUiAgMHgwMCAgICAvLyAgICAgIChTSVIwKSAgR2VuZXJhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAgICAgICAKKyNkZWZpbmUgQlNSICAweDAyICAgIC8vICAgICAgKFNJUjEpICBCYW5rIFN3aXRjaGluZyBTZWxlY3QgUmVnaXN0ZXIgCisjZGVmaW5lIEFSICAgMHgwNAorI2RlZmluZSBEUiAgIDB4MDgKKyNkZWZpbmUgTVIxICAweDEyICAgIC8vICAgICAgTWlycm9yIFJlZ2lzdGVyIDEgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgTVIyICAweDE0ICAgIC8vICAgICAgTWlycm9yIFJlZ2lzdGVyIDIgIAorI2RlZmluZSBNUjMgIDB4MTYgICAgLy8gICAgICBNaXJyb3IgUmVnaXN0ZXIgMyAgCisjZGVmaW5lIE1SNCAgMHgxOCAgICAvLyAgICAgIE1pcnJvciBSZWdpc3RlciA0ICAgCisKKyNkZWZpbmUgR1BSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjCisjZGVmaW5lIEdQUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZQorI2RlZmluZSBHUFIzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKy8vCisvLyBDb25zdGFudHMgZm9yIHRoZSBHQ1IgcmVnaXN0ZXIuCisvLworI2RlZmluZSBHQ1JfUkVNQVAgICAgIDB4MDQwMCAgICAgICAgICAvLyBSZW1hcCBpbnRlcm5hbCBTUkFNIHRvIDAKKyNkZWZpbmUgR0NSX1NXUkVTICAgICAweDAwODAgICAgICAgICAgLy8gQklVIHJlc2V0IChBUk0gYW5kIFBBSSBhcmUgTk9UIHJlc2V0KSAKKyNkZWZpbmUgR0NSX0NPUkVTICAgICAweDAwNjAgICAgICAgICAgLy8gQ29yZSBSZXNldCAoQVJNIGFuZCBQQUkgYXJlIHJlc2V0KQorI2RlZmluZSBHQ1JfRU5JTlQgICAgIDB4MDAwMiAgICAgICAgICAvLyBFbmFibGUgSW50ZXJydXB0cyAgICAKKyNkZWZpbmUgR0NSX0FDS0lOVCAgICAweDAwMDggICAgICAgICAgLy8gQWNrbm93bGVkZ2UgSW50ZXJydXB0cworCisjZGVmaW5lIEJTU19TUkFNICAgICAgMHgwMjAwICAgICAgICAgIC8vIEFNQkEgbW9kdWxlIHNlbGVjdGlvbiAtLT4gU1JBTQorI2RlZmluZSBCU1NfSVJBTSAgICAgIDB4MDEwMCAgICAgICAgICAvLyBBTUJBIG1vZHVsZSBzZWxlY3Rpb24gLS0+IElSQU0KKy8vCisvLyBDb25zdGFudHMgZm9yIHRoZSBNUiByZWdpc3RlcnMuCisvLworI2RlZmluZSBNQUNfSU5JVF9DT01QTEVURSAgICAgICAweDAwMDEgICAgICAgIC8vIE1BQyBpbml0IGhhcyBiZWVuIGNvbXBsZXRlZAorI2RlZmluZSBNQUNfQk9PVF9DT01QTEVURSAgICAgICAweDAwMTAgICAgICAgIC8vIE1BQyBib290IGhhcyBiZWVuIGNvbXBsZXRlZAorI2RlZmluZSBNQUNfSU5JVF9PSyAgICAgICAgICAgICAweDAwMDIgICAgICAgIC8vIE1BQyBib290IGhhcyBiZWVuIGNvbXBsZXRlZAorCisjZGVmaW5lIEM4MDIxMV9TVUJUWVBFX01HTVRfQVNTX1JFUVVFU1QgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQzgwMjExX1NVQlRZUEVfTUdNVF9BU1NfUkVTUE9OU0UgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBDODAyMTFfU1VCVFlQRV9NR01UX1JFQVNTX1JFUVVFU1QgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIEM4MDIxMV9TVUJUWVBFX01HTVRfUkVBU1NfUkVTUE9OU0UgICAgICAgICAgICAgIDB4MzAKKyNkZWZpbmUgQzgwMjExX1NVQlRZUEVfTUdNVF9Qcm9iZVJlcXVlc3QgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBDODAyMTFfU1VCVFlQRV9NR01UX1Byb2JlUmVzcG9uc2UgICAgICAgICAgICAgICAweDUwCisjZGVmaW5lIEM4MDIxMV9TVUJUWVBFX01HTVRfQkVBQ09OICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgQzgwMjExX1NVQlRZUEVfTUdNVF9BVElNICAgICAgICAgICAgICAgICAgICAgICAgMHg5MAorI2RlZmluZSBDODAyMTFfU1VCVFlQRV9NR01UX0RJU0FTU09TSUFUSU9OICAgICAgICAgICAgICAweEEwCisjZGVmaW5lIEM4MDIxMV9TVUJUWVBFX01HTVRfQXV0aGVudGljYXRpb24gICAgICAgICAgICAgIDB4QjAKKyNkZWZpbmUgQzgwMjExX1NVQlRZUEVfTUdNVF9EZWF1dGhlbnRpY2F0aW9uICAgIDB4QzAKKworI2RlZmluZSBDODAyMTFfTUdNVF9BQU5fT1BFTlNZU1RFTSAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEM4MDIxMV9NR01UX0FBTl9TSEFSRURLRVkgICAgICAgICAgICAgICAweDAwMDEKKworI2RlZmluZSBDODAyMTFfTUdNVF9DQVBBQklMSVRZX0VTUyAgICAgICAgICAgICAgMHgwMDAxICAvLyBzZWUgODAyLjExIHAuNTgKKyNkZWZpbmUgQzgwMjExX01HTVRfQ0FQQUJJTElUWV9JQlNTICAgICAgICAgICAgIDB4MDAwMiAgLy8gICAgICAtICIgLQorI2RlZmluZSBDODAyMTFfTUdNVF9DQVBBQklMSVRZX0NGUG9sbGFibGUgICAgICAgMHgwMDA0ICAvLyAgICAgIC0gIiAtCisjZGVmaW5lIEM4MDIxMV9NR01UX0NBUEFCSUxJVFlfQ0ZQb2xsUmVxdWVzdCAgICAweDAwMDggIC8vICAgICAgLSAiIC0KKyNkZWZpbmUgQzgwMjExX01HTVRfQ0FQQUJJTElUWV9Qcml2YWN5ICAgICAgICAgIDB4MDAxMCAgLy8gICAgICAtICIgLQorCisjZGVmaW5lIEM4MDIxMV9NR01UX1NDX1N1Y2Nlc3MgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEM4MDIxMV9NR01UX1NDX1Vuc3BlY2lmaWVkICAgICAgICAgICAgICAxCisjZGVmaW5lIEM4MDIxMV9NR01UX1NDX1N1cHBvcnRDYXBhYmlsaXRpZXMgICAgICAxMAorI2RlZmluZSBDODAyMTFfTUdNVF9TQ19SZWFzc0RlbmllZCAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgQzgwMjExX01HTVRfU0NfQXNzRGVuaWVkICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIEM4MDIxMV9NR01UX1NDX0F1dGhBbGdOb3RTdXBwb3J0ZWQgICAgICAxMworI2RlZmluZSBDODAyMTFfTUdNVF9TQ19BdXRoVHJhbnNTZXFOdW1FcnJvciAgICAgMTQKKyNkZWZpbmUgQzgwMjExX01HTVRfU0NfQXV0aFJlamVjdENoYWxsZW5nZSAgICAgIDE1CisjZGVmaW5lIEM4MDIxMV9NR01UX1NDX0F1dGhSZWplY3RUaW1lb3V0ICAgICAgICAxNgorI2RlZmluZSBDODAyMTFfTUdNVF9TQ19Bc3NEZW5pZWRIYW5kbGVBUCAgICAgICAgMTcKKyNkZWZpbmUgQzgwMjExX01HTVRfU0NfQXNzRGVuaWVkQlNTUmF0ZSAgICAgICAgIDE4CisKKyNkZWZpbmUgQzgwMjExX01HTVRfRWxlbWVudElEX1NTSUQgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQzgwMjExX01HTVRfRWxlbWVudElEX1N1cHBvcnRlZFJhdGVzICAgIDEKKyNkZWZpbmUgQzgwMjExX01HTVRfRWxlbWVudElEX0NoYWxsZW5nZVRleHQgICAgIDE2CisjZGVmaW5lIEM4MDIxMV9NR01UX0NBUEFCSUxJVFlfU2hvcnRQcmVhbWJsZSAgICAweDAwMjAKKworI2RlZmluZSBNSUJfTUFYX0RBVEFfQllURVMgICAgMjEyCisjZGVmaW5lIE1JQl9IRUFERVJfU0laRSAgICAgICA0ICAgIC8qIGZpcnN0IGZvdXIgZmllbGRzICovCisKK3N0cnVjdCBnZXRfc2V0X21pYiB7CisgICAgICAgIHU4IHR5cGU7CisgICAgICAgIHU4IHNpemU7CisgICAgICAgIHU4IGluZGV4OworICAgICAgICB1OCByZXNlcnZlZDsKKyAgICAgICAgdTggZGF0YVtNSUJfTUFYX0RBVEFfQllURVNdOworfTsKKworc3RydWN0IHJ4X2Rlc2MgeworICAgICAgICB1MzIgICAgICAgICAgTmV4dDsKKyAgICAgICAgdTE2ICAgICAgICAgIE1zZHVQb3M7CisgICAgICAgIHUxNiAgICAgICAgICBNc2R1U2l6ZTsKKwkKKyAgICAgICAgdTggICAgICAgICAgIFN0YXRlOworICAgICAgICB1OCAgICAgICAgICAgU3RhdHVzOworICAgICAgICB1OCAgICAgICAgICAgUmF0ZTsKKyAgICAgICAgdTggICAgICAgICAgIFJzc2k7CisgICAgICAgIHU4ICAgICAgICAgICBMaW5rUXVhbGl0eTsKKyAgICAgICAgdTggICAgICAgICAgIFByZWFtYmxlVHlwZTsKKyAgICAgICAgdTE2ICAgICAgICAgIER1cmF0aW9uOworICAgICAgICB1MzIgICAgICAgICAgUnhUaW1lOworCit9OworCisjZGVmaW5lIFJYX0RFU0NfRkxBR19WQUxJRCAgICAgICAweDgwCisjZGVmaW5lIFJYX0RFU0NfRkxBR19DT05TVU1FRCAgICAweDQwCisjZGVmaW5lIFJYX0RFU0NfRkxBR19JRExFICAgICAgICAweDAwCisKKyNkZWZpbmUgUlhfU1RBVFVTX1NVQ0NFU1MgICAgICAgIDB4MDAKKworI2RlZmluZSBSWF9ERVNDX01TRFVfUE9TX09GRlNFVCAgICAgIDQKKyNkZWZpbmUgUlhfREVTQ19NU0RVX1NJWkVfT0ZGU0VUICAgICA2CisjZGVmaW5lIFJYX0RFU0NfRkxBR1NfT0ZGU0VUICAgICAgICAgOAorI2RlZmluZSBSWF9ERVNDX1NUQVRVU19PRkZTRVQgICAgICAgIDkKKyNkZWZpbmUgUlhfREVTQ19SU1NJX09GRlNFVCAgICAgICAgICAxMQorI2RlZmluZSBSWF9ERVNDX0xJTktfUVVBTElUWV9PRkZTRVQgIDEyCisjZGVmaW5lIFJYX0RFU0NfUFJFQU1CTEVfVFlQRV9PRkZTRVQgMTMKKyNkZWZpbmUgUlhfREVTQ19EVVJBVElPTl9PRkZTRVQgICAgICAxNAorI2RlZmluZSBSWF9ERVNDX1JYX1RJTUVfT0ZGU0VUICAgICAgIDE2CisKKworc3RydWN0IHR4X2Rlc2MgeworCXUzMiAgICAgICBOZXh0RGVzY3JpcHRvcjsKKwl1MTYgICAgICAgVHhTdGFydE9mRnJhbWU7CisJdTE2ICAgICAgIFR4TGVuZ3RoOworCQorCXU4ICAgICAgICBUeFN0YXRlOworCXU4ICAgICAgICBUeFN0YXR1czsKKwl1OCAgICAgICAgUmV0cnlDb3VudDsKKwkKKwl1OCAgICAgICAgVHhSYXRlOworCisJdTggICAgICAgIEtleUluZGV4OworCXU4ICAgICAgICBDaGlwZXJUeXBlOworCXU4ICAgICAgICBDaGlwcmVMZW5ndGg7CisgICAgICAgIHU4ICAgICAgICBSZXNlcnZlZDE7CisKKwl1OCAgICAgICAgUmVzZXJ2ZWQ7CisJdTggICAgICAgIFBhY2tldFR5cGU7CisJdTE2ICAgICAgIEhvc3RUeExlbmd0aDsKKwkKK307CisKKworI2RlZmluZSBUWF9ERVNDX05FWFRfT0ZGU0VUICAgICAgICAgIDAKKyNkZWZpbmUgVFhfREVTQ19QT1NfT0ZGU0VUICAgICAgICAgICA0CisjZGVmaW5lIFRYX0RFU0NfU0laRV9PRkZTRVQgICAgICAgICAgNgorI2RlZmluZSBUWF9ERVNDX0ZMQUdTX09GRlNFVCAgICAgICAgIDgKKyNkZWZpbmUgVFhfREVTQ19TVEFUVVNfT0ZGU0VUICAgICAgICA5CisjZGVmaW5lIFRYX0RFU0NfUkVUUllfT0ZGU0VUICAgICAgICAgMTAKKyNkZWZpbmUgVFhfREVTQ19SQVRFX09GRlNFVCAgICAgICAgICAxMQorI2RlZmluZSBUWF9ERVNDX0tFWV9JTkRFWF9PRkZTRVQgICAgIDEyCisjZGVmaW5lIFRYX0RFU0NfQ0lQSEVSX1RZUEVfT0ZGU0VUICAgMTMKKyNkZWZpbmUgVFhfREVTQ19DSVBIRVJfTEVOR1RIX09GRlNFVCAxNAorI2RlZmluZSBUWF9ERVNDX1BBQ0tFVF9UWVBFX09GRlNFVCAgIDE3CisjZGVmaW5lIFRYX0RFU0NfSE9TVF9MRU5HVEhfT0ZGU0VUICAgMTgKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEhvc3QtTUFDIGludGVyZmFjZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIFRYX1NUQVRVU19TVUNDRVNTICAgICAgIDB4MDAKKworI2RlZmluZSBUWF9GSVJNX09XTiAgICAgICAgICAgICAweDgwCisjZGVmaW5lIFRYX0RPTkUgICAgICAgICAgICAgICAgIDB4NDAKKworCisjZGVmaW5lIFRYX0VSUk9SICAgICAgICAgICAgICAgIDB4MDEKKworI2RlZmluZSBUWF9QQUNLRVRfVFlQRV9EQVRBICAgICAweDAxCisjZGVmaW5lIFRYX1BBQ0tFVF9UWVBFX01HTVQgICAgIDB4MDIKKworI2RlZmluZSBJU1JfRU1QVFkgICAgICAgICAgICAgICAweDAwICAgICAgICAvLyBubyBiaXRzIHNldCBpbiBJU1IKKyNkZWZpbmUgSVNSX1R4Q09NUExFVEUgICAgICAgICAgMHgwMSAgICAgICAgLy8gcGFja2V0IHRyYW5zbWl0dGVkCisjZGVmaW5lIElTUl9SeENPTVBMRVRFICAgICAgICAgIDB4MDIgICAgICAgIC8vIHBhY2tldCByZWNlaXZlZAorI2RlZmluZSBJU1JfUnhGUkFNRUxPU1QgICAgICAgICAweDA0ICAgICAgICAvLyBSeCBGcmFtZSBsb3N0CisjZGVmaW5lIElTUl9GQVRBTF9FUlJPUiAgICAgICAgIDB4MDggICAgICAgIC8vIEZhdGFsIGVycm9yCisjZGVmaW5lIElTUl9DT01NQU5EX0NPTVBMRVRFICAgIDB4MTAgICAgICAgIC8vIGNvbW1hbmQgY29tcGxldGVkCisjZGVmaW5lIElTUl9PVVRfT0ZfUkFOR0UgICAgICAgIDB4MjAgICAgICAgIC8vIGNvbW1hbmQgY29tcGxldGVkCisjZGVmaW5lIElTUl9JQlNTX01FUkdFICAgICAgICAgIDB4NDAgICAgICAgIC8vICg0LjEuMi4zMCk6IElCU1MgbWVyZ2UKKyNkZWZpbmUgSVNSX0dFTkVSSUNfSVJRICAgICAgICAgMHg4MCAgICAgICAgICAgICAgICAKKworCisjZGVmaW5lIExvY2FsX01pYl9UeXBlICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTWFjX0FkZHJlc3NfTWliX1R5cGUgICAgMHgwMgorI2RlZmluZSBNYWNfTWliX1R5cGUgICAgICAgICAgICAweDAzCisjZGVmaW5lIFN0YXRpc3RpY3NfTWliX1R5cGUgICAgIDB4MDQKKyNkZWZpbmUgTWFjX01nbXRfTWliX1R5cGUgICAgICAgMHgwNQorI2RlZmluZSBNYWNfV2VwX01pYl9UeXBlICAgICAgICAweDA2CisjZGVmaW5lIFBoeV9NaWJfVHlwZSAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgTXVsdGlfRG9tYWluX01JQiAgICAgICAgMHgwOAorCisjZGVmaW5lIE1BQ19NR01UX01JQl9DVVJfQlNTSURfUE9TICAgICAgICAgICAgMTQKKyNkZWZpbmUgTUFDX01JQl9GUkFHX1RIUkVTSE9MRF9QT1MgICAgICAgICAgICA4CisjZGVmaW5lIE1BQ19NSUJfUlRTX1RIUkVTSE9MRF9QT1MgICAgICAgICAgICAgMTAKKyNkZWZpbmUgTUFDX01JQl9TSE9SVF9SRVRSWV9QT1MgICAgICAgICAgICAgICAxNgorI2RlZmluZSBNQUNfTUlCX0xPTkdfUkVUUllfUE9TICAgICAgICAgICAgICAgIDE3CisjZGVmaW5lIE1BQ19NSUJfU0hPUlRfUkVUUllfTElNSVRfUE9TICAgICAgICAgMTYKKyNkZWZpbmUgTUFDX01HTVRfTUlCX0JFQUNPTl9QRVJfUE9TICAgICAgICAgICAwCisjZGVmaW5lIE1BQ19NR01UX01JQl9TVEFUSU9OX0lEX1BPUyAgICAgICAgICAgNgorI2RlZmluZSBNQUNfTUdNVF9NSUJfQ1VSX1BSSVZBQ1lfUE9TICAgICAgICAgIDExCisjZGVmaW5lIE1BQ19NR01UX01JQl9DVVJfQlNTSURfUE9TICAgICAgICAgICAgMTQKKyNkZWZpbmUgTUFDX01HTVRfTUlCX1BTX01PREVfUE9TICAgICAgICAgICAgICA1MworI2RlZmluZSBNQUNfTUdNVF9NSUJfTElTVEVOX0lOVEVSVkFMX1BPUyAgICAgIDU0CisjZGVmaW5lIE1BQ19NR01UX01JQl9NVUxUSV9ET01BSU5fSU1QTEVNRU5URUQgNTYKKyNkZWZpbmUgTUFDX01HTVRfTUlCX01VTFRJX0RPTUFJTl9FTkFCTEVEICAgICA1NworI2RlZmluZSBQSFlfTUlCX0NIQU5ORUxfUE9TICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFBIWV9NSUJfUkFURV9TRVRfUE9TICAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgUEhZX01JQl9SRUdfRE9NQUlOX1BPUyAgICAgICAgICAgICAgICAyNgorI2RlZmluZSBMT0NBTF9NSUJfQVVUT19UWF9SQVRFX1BPUyAgICAgICAgICAgIDMKKyNkZWZpbmUgTE9DQUxfTUlCX1NTSURfU0laRSAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIExPQ0FMX01JQl9UWF9QUk9NSVNDVU9VU19QT1MgICAgICAgICAgNgorI2RlZmluZSBMT0NBTF9NSUJfVFhfTUdNVF9SQVRFX1BPUyAgICAgICAgICAgIDcKKyNkZWZpbmUgTE9DQUxfTUlCX1RYX0NPTlRST0xfUkFURV9QT1MgICAgICAgICA4CisjZGVmaW5lIExPQ0FMX01JQl9QUkVBTUJMRV9UWVBFICAgICAgICAgICAgICAgOQorI2RlZmluZSBNQUNfQUREUl9NSUJfTUFDX0FERFJfUE9TICAgICAgICAgICAgIDAKKworCisjZGVmaW5lICAgICAgICAgQ01EX1NldF9NSUJfVmFycyAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSAgICAgICAgIENNRF9HZXRfTUlCX1ZhcnMgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgICAgICAgICBDTURfU2NhbiAgICAgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lICAgICAgICAgQ01EX0pvaW4gICAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSAgICAgICAgIENNRF9TdGFydCAgICAgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgICAgICAgICBDTURfRW5hYmxlUmFkaW8gICAgICAgICAgICAgICAweDA2CisjZGVmaW5lICAgICAgICAgQ01EX0Rpc2FibGVSYWRpbyAgICAgICAgICAgICAgMHgwNworI2RlZmluZSAgICAgICAgIENNRF9TaXRlU3VydmV5ICAgICAgICAgICAgICAgIDB4MEIKKworI2RlZmluZSAgICAgICAgIENNRF9TVEFUVVNfSURMRSAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lICAgICAgICAgQ01EX1NUQVRVU19DT01QTEVURSAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgICAgICAgICBDTURfU1RBVFVTX1VOS05PV04gICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSAgICAgICAgIENNRF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIgICAgICAweDAzCisjZGVmaW5lICAgICAgICAgQ01EX1NUQVRVU19GVU5DVElPTl9OT1RfU1VQUE9SVEVEIDB4MDQKKyNkZWZpbmUgICAgICAgICBDTURfU1RBVFVTX1RJTUVfT1VUICAgICAgICAgICAgICAgMHgwNworI2RlZmluZSAgICAgICAgIENNRF9TVEFUVVNfSU5fUFJPR1JFU1MgICAgICAgICAgICAweDA4CisjZGVmaW5lICAgICAgICAgQ01EX1NUQVRVU19SRUpFQ1RFRF9SQURJT19PRkYgICAgIDB4MDkKKyNkZWZpbmUgICAgICAgICBDTURfU1RBVFVTX0hPU1RfRVJST1IgICAgICAgICAgICAgMHhGRgorI2RlZmluZSAgICAgICAgIENNRF9TVEFUVVNfQlVTWSAgICAgICAgICAgICAgICAgICAweEZFCisKKworI2RlZmluZSBDTURfQkxPQ0tfQ09NTUFORF9PRkZTRVQgICAgICAgIDAKKyNkZWZpbmUgQ01EX0JMT0NLX1NUQVRVU19PRkZTRVQgICAgICAgICAxCisjZGVmaW5lIENNRF9CTE9DS19QQVJBTUVURVJTX09GRlNFVCAgICAgNAorCisjZGVmaW5lIFNDQU5fT1BUSU9OU19TSVRFX1NVUlZFWSAgICAgICAgMHg4MAorCisjZGVmaW5lIE1HTVRfRlJBTUVfQk9EWV9PRkZTRVQJCTI0CisjZGVmaW5lIE1BWF9BVVRIRU5USUNBVElPTl9SRVRSSUVTCTMKKyNkZWZpbmUgTUFYX0FTU09DSUFUSU9OX1JFVFJJRVMgCTMKKworI2RlZmluZSBBVVRIRU5USUNBVElPTl9SRVNQT05TRV9USU1FX09VVCAgMTAwMAorCisjZGVmaW5lIE1BWF9XSVJFTEVTU19CT0RZICAyMzE2IC8qIG10dSBpcyAyMzEyLCBDUkMgaXMgNCAqLworI2RlZmluZSBMT09QX1JFVFJZX0xJTUlUICAgNTAwMDAwCisKKyNkZWZpbmUgQUNUSVZFX01PREUgCTEKKyNkZWZpbmUgUFNfTU9ERSAJMgorCisjZGVmaW5lIE1BWF9FTkNSWVBUSU9OX0tFWVMgNAorI2RlZmluZSBNQVhfRU5DUllQVElPTl9LRVlfU0laRSA0MAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIDgwMi4xMSByZWxhdGVkIGRlZmluaXRpb25zCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8KKy8vIFJlZ3VsYXRvcnkgRG9tYWlucworLy8KKworI2RlZmluZSBSRUdfRE9NQUlOX0ZDQwkJMHgxMAkvL0NoYW5uZWxzCTEtMTEJVVNBCisjZGVmaW5lIFJFR19ET01BSU5fRE9DCQkweDIwCS8vQ2hhbm5lbAkxLTExCUNhbmFkYQorI2RlZmluZSBSRUdfRE9NQUlOX0VUU0kJCTB4MzAJLy9DaGFubmVsCTEtMTMJRXVyb3BlIChleCBTcGFpbi9GcmFuY2UpCisjZGVmaW5lIFJFR19ET01BSU5fU1BBSU4JMHgzMQkvL0NoYW5uZWwJMTAtMTEJU3BhaW4KKyNkZWZpbmUgUkVHX0RPTUFJTl9GUkFOQ0UJMHgzMgkvL0NoYW5uZWwJMTAtMTMJRnJhbmNlCisjZGVmaW5lIFJFR19ET01BSU5fTUtLCQkweDQwCS8vQ2hhbm5lbAkxNAlKYXBhbgorI2RlZmluZSBSRUdfRE9NQUlOX01LSzEJCTB4NDEJLy9DaGFubmVsCTEtMTQJSmFwYW4oTUtLMSkKKyNkZWZpbmUgUkVHX0RPTUFJTl9JU1JBRUwJMHg1MAkvL0NoYW5uZWwJMy05CUlTUkFFTAorCisjZGVmaW5lIEJTU19UWVBFX0FEX0hPQyAJMQorI2RlZmluZSBCU1NfVFlQRV9JTkZSQVNUUlVDVFVSRSAyCisKKyNkZWZpbmUgU0NBTl9UWVBFX0FDVElWRQkwCisjZGVmaW5lIFNDQU5fVFlQRV9QQVNTSVZFCTEKKworI2RlZmluZSBMT05HX1BSRUFNQkxFCQkwCisjZGVmaW5lIFNIT1JUX1BSRUFNQkxFCQkxCisjZGVmaW5lIEFVVE9fUFJFQU1CTEUJCTIKKworI2RlZmluZSBEQVRBX0ZSQU1FX1dTX0hFQURFUl9TSVpFICAgMzAKKworLyogcHJvbWlzY3VvdXMgbW9kZSBjb250cm9sICovIAorI2RlZmluZSBQUk9NX01PREVfT0ZGCQkJMHgwCisjZGVmaW5lIFBST01fTU9ERV9VTktOT1dOCQkweDEKKyNkZWZpbmUgUFJPTV9NT0RFX0NSQ19GQUlMRUQJCTB4MgorI2RlZmluZSBQUk9NX01PREVfRFVQTElDQVRFRAkJMHg0CisjZGVmaW5lIFBST01fTU9ERV9NR01UCQkJMHg4CisjZGVmaW5lIFBST01fTU9ERV9DVFJMCQkJMHgxMAorI2RlZmluZSBQUk9NX01PREVfQkFEX1BST1RPQ09MCQkweDIwCisKKworI2RlZmluZSBJRkFDRV9JTlRfU1RBVFVTX09GRlNFVCAJMAorI2RlZmluZSBJRkFDRV9JTlRfTUFTS19PRkZTRVQJCTEKKyNkZWZpbmUgSUZBQ0VfTE9DS09VVF9IT1NUX09GRlNFVAkyCisjZGVmaW5lIElGQUNFX0xPQ0tPVVRfTUFDX09GRlNFVAkzCisjZGVmaW5lIElGQUNFX0ZVTkNfQ1RSTF9PRkZTRVQJCTI4CisjZGVmaW5lIElGQUNFX01BQ19TVEFUX09GRlNFVAkJMzAKKyNkZWZpbmUgSUZBQ0VfR0VORVJJQ19JTlRfVFlQRV9PRkZTRVQJMzIKKworI2RlZmluZSBDSVBIRVJfU1VJVEVfTk9ORSAgICAgMCAKKyNkZWZpbmUgQ0lQSEVSX1NVSVRFX1dFUF82NCAgIDEKKyNkZWZpbmUgQ0lQSEVSX1NVSVRFX1RLSVAgICAgIDIKKyNkZWZpbmUgQ0lQSEVSX1NVSVRFX0FFUyAgICAgIDMKKyNkZWZpbmUgQ0lQSEVSX1NVSVRFX0NDWCAgICAgIDQKKyNkZWZpbmUgQ0lQSEVSX1NVSVRFX1dFUF8xMjggIDUKKworLy8KKy8vIElGQUNFIE1BQ1JPUyAmIGRlZmluaXRpb25zCisvLworLy8KKworLy8gRnVuY0N0cmwgZmllbGQ6IAorLy8KKyNkZWZpbmUgRlVOQ19DVFJMX1R4RU5BQkxFCQkweDEwCisjZGVmaW5lIEZVTkNfQ1RSTF9SeEVOQUJMRQkJMHgyMAorI2RlZmluZSBGVU5DX0NUUkxfSU5JVF9DT01QTEVURSAJMHgwMQorCisvKiBBIHN0dWIgZmlybXdhcmUgaW1hZ2Ugd2hpY2ggcmVhZHMgdGhlIE1BQyBhZGRyZXNzIGZyb20gTlZSQU0gb24gdGhlIGNhcmQuCisgICBGb3IgY29weXJpZ2h0IGluZm9ybWF0aW9uIGFuZCBzb3VyY2Ugc2VlIHRoZSBlbmQgb2YgdGhpcyBmaWxlLiAqLworc3RhdGljIHU4IG1hY19yZWFkZXJbXSA9IHsKKwkweDA2LDB4MDAsMHgwMCwweGVhLDB4MDQsMHgwMCwweDAwLDB4ZWEsMHgwMywweDAwLDB4MDAsMHhlYSwweDAyLDB4MDAsMHgwMCwweGVhLAorCTB4MDEsMHgwMCwweDAwLDB4ZWEsMHgwMCwweDAwLDB4MDAsMHhlYSwweGZmLDB4ZmYsMHhmZiwweGVhLDB4ZmUsMHhmZiwweGZmLDB4ZWEsCisJMHhkMywweDAwLDB4YTAsMHhlMywweDAwLDB4ZjAsMHgyMSwweGUxLDB4MGUsMHgwNCwweGEwLDB4ZTMsMHgwMCwweDEwLDB4YTAsMHhlMywKKwkweDgxLDB4MTEsMHhhMCwweGUxLDB4MDAsMHgxMCwweDgxLDB4ZTMsMHgwMCwweDEwLDB4ODAsMHhlNSwweDFjLDB4MTAsMHg5MCwweGU1LAorCTB4MTAsMHgxMCwweGMxLDB4ZTMsMHgxYywweDEwLDB4ODAsMHhlNSwweDAxLDB4MTAsMHhhMCwweGUzLDB4MDgsMHgxMCwweDgwLDB4ZTUsCisJMHgwMiwweDAzLDB4YTAsMHhlMywweDAwLDB4MTAsMHhhMCwweGUzLDB4YjAsMHgxMCwweGMwLDB4ZTEsMHhiNCwweDEwLDB4YzAsMHhlMSwKKwkweGI4LDB4MTAsMHhjMCwweGUxLDB4YmMsMHgxMCwweGMwLDB4ZTEsMHg1NiwweGRjLDB4YTAsMHhlMywweDIxLDB4MDAsMHgwMCwweGViLAorCTB4MGEsMHgwMCwweGEwLDB4ZTMsMHgxYSwweDAwLDB4MDAsMHhlYiwweDEwLDB4MDAsMHgwMCwweGViLDB4MDcsMHgwMCwweDAwLDB4ZWIsCisJMHgwMiwweDAzLDB4YTAsMHhlMywweDAyLDB4MTQsMHhhMCwweGUzLDB4YjQsMHgxMCwweGMwLDB4ZTEsMHg0YywweDEwLDB4OWYsMHhlNSwKKwkweGJjLDB4MTAsMHhjMCwweGUxLDB4MTAsMHgxMCwweGEwLDB4ZTMsMHhiOCwweDEwLDB4YzAsMHhlMSwweGZlLDB4ZmYsMHhmZiwweGVhLAorCTB4MDAsMHg0MCwweDJkLDB4ZTksMHgwMCwweDIwLDB4YTAsMHhlMywweDAyLDB4M2MsMHhhMCwweGUzLDB4MDAsMHgxMCwweGEwLDB4ZTMsCisJMHgyOCwweDAwLDB4OWYsMHhlNSwweDM3LDB4MDAsMHgwMCwweGViLDB4MDAsMHg0MCwweGJkLDB4ZTgsMHgxZSwweGZmLDB4MmYsMHhlMSwKKwkweDAwLDB4NDAsMHgyZCwweGU5LDB4MTIsMHgyZSwweGEwLDB4ZTMsMHgwNiwweDMwLDB4YTAsMHhlMywweDAwLDB4MTAsMHhhMCwweGUzLAorCTB4MDIsMHgwNCwweGEwLDB4ZTMsMHgyZiwweDAwLDB4MDAsMHhlYiwweDAwLDB4NDAsMHhiZCwweGU4LDB4MWUsMHhmZiwweDJmLDB4ZTEsCisJMHgwMCwweDAyLDB4MDAsMHgwMiwweDgwLDB4MDEsMHg5MCwweGUwLDB4MDEsMHgwMCwweDAwLDB4MGEsMHgwMSwweDAwLDB4NTAsMHhlMiwKKwkweGZjLDB4ZmYsMHhmZiwweGVhLDB4MWUsMHhmZiwweDJmLDB4ZTEsMHg4MCwweDEwLDB4YTAsMHhlMywweGYzLDB4MDYsMHhhMCwweGUzLAorCTB4MDAsMHgxMCwweDgwLDB4ZTUsMHgwMCwweDEwLDB4YTAsMHhlMywweDAwLDB4MTAsMHg4MCwweGU1LDB4MDEsMHgxMCwweGEwLDB4ZTMsCisJMHgwNCwweDEwLDB4ODAsMHhlNSwweDAwLDB4MTAsMHg4MCwweGU1LDB4MGUsMHgzNCwweGEwLDB4ZTMsMHgxYywweDEwLDB4OTMsMHhlNSwKKwkweDAyLDB4MWEsMHg4MSwweGUzLDB4MWMsMHgxMCwweDgzLDB4ZTUsMHg1OCwweDExLDB4OWYsMHhlNSwweDMwLDB4MTAsMHg4MCwweGU1LAorCTB4NTQsMHgxMSwweDlmLDB4ZTUsMHgzNCwweDEwLDB4ODAsMHhlNSwweDM4LDB4MTAsMHg4MCwweGU1LDB4M2MsMHgxMCwweDgwLDB4ZTUsCisJMHgxMCwweDEwLDB4OTAsMHhlNSwweDA4LDB4MDAsMHg5MCwweGU1LDB4MWUsMHhmZiwweDJmLDB4ZTEsMHhmMywweDE2LDB4YTAsMHhlMywKKwkweDA4LDB4MDAsMHg5MSwweGU1LDB4MDUsMHgwMCwweGEwLDB4ZTMsMHgwYywweDAwLDB4ODEsMHhlNSwweDEwLDB4MDAsMHg5MSwweGU1LAorCTB4MDIsMHgwMCwweDEwLDB4ZTMsMHhmYywweGZmLDB4ZmYsMHgwYSwweGZmLDB4MDAsMHhhMCwweGUzLDB4MGMsMHgwMCwweDgxLDB4ZTUsCisJMHgxMCwweDAwLDB4OTEsMHhlNSwweDAyLDB4MDAsMHgxMCwweGUzLDB4ZmMsMHhmZiwweGZmLDB4MGEsMHgwOCwweDAwLDB4OTEsMHhlNSwKKwkweDEwLDB4MDAsMHg5MSwweGU1LDB4MDEsMHgwMCwweDEwLDB4ZTMsMHhmYywweGZmLDB4ZmYsMHgwYSwweDA4LDB4MDAsMHg5MSwweGU1LAorCTB4ZmYsMHgwMCwweDAwLDB4ZTIsMHgxZSwweGZmLDB4MmYsMHhlMSwweDMwLDB4NDAsMHgyZCwweGU5LDB4MDAsMHg1MCwweGEwLDB4ZTEsCisJMHgwMywweDQwLDB4YTAsMHhlMSwweGEyLDB4MDIsMHhhMCwweGUxLDB4MDgsMHgwMCwweDAwLDB4ZTIsMHgwMywweDAwLDB4ODAsMHhlMiwKKwkweGQ4LDB4MTAsMHg5ZiwweGU1LDB4MDAsMHgwMCwweGMxLDB4ZTUsMHgwMSwweDIwLDB4YzEsMHhlNSwweGUyLDB4ZmYsMHhmZiwweGViLAorCTB4MDEsMHgwMCwweDEwLDB4ZTMsMHhmYywweGZmLDB4ZmYsMHgxYSwweDE0LDB4MDAsMHhhMCwweGUzLDB4YzQsMHhmZiwweGZmLDB4ZWIsCisJMHgwNCwweDIwLDB4YTAsMHhlMSwweDA1LDB4MTAsMHhhMCwweGUxLDB4MDIsMHgwMCwweGEwLDB4ZTMsMHgwMSwweDAwLDB4MDAsMHhlYiwKKwkweDMwLDB4NDAsMHhiZCwweGU4LDB4MWUsMHhmZiwweDJmLDB4ZTEsMHg3MCwweDQwLDB4MmQsMHhlOSwweGYzLDB4NDYsMHhhMCwweGUzLAorCTB4MDAsMHgzMCwweGEwLDB4ZTMsMHgwMCwweDAwLDB4NTAsMHhlMywweDA4LDB4MDAsMHgwMCwweDlhLDB4OGMsMHg1MCwweDlmLDB4ZTUsCisJMHgwMywweDYwLDB4ZDUsMHhlNywweDBjLDB4NjAsMHg4NCwweGU1LDB4MTAsMHg2MCwweDk0LDB4ZTUsMHgwMiwweDAwLDB4MTYsMHhlMywKKwkweGZjLDB4ZmYsMHhmZiwweDBhLDB4MDEsMHgzMCwweDgzLDB4ZTIsMHgwMCwweDAwLDB4NTMsMHhlMSwweGY3LDB4ZmYsMHhmZiwweDNhLAorCTB4ZmYsMHgzMCwweGEwLDB4ZTMsMHgwYywweDMwLDB4ODQsMHhlNSwweDA4LDB4MDAsMHg5NCwweGU1LDB4MTAsMHgwMCwweDk0LDB4ZTUsCisJMHgwMSwweDAwLDB4MTAsMHhlMywweGZjLDB4ZmYsMHhmZiwweDBhLDB4MDgsMHgwMCwweDk0LDB4ZTUsMHgwMCwweDAwLDB4YTAsMHhlMywKKwkweDAwLDB4MDAsMHg1MiwweGUzLDB4MGIsMHgwMCwweDAwLDB4OWEsMHgxMCwweDUwLDB4OTQsMHhlNSwweDAyLDB4MDAsMHgxNSwweGUzLAorCTB4ZmMsMHhmZiwweGZmLDB4MGEsMHgwYywweDMwLDB4ODQsMHhlNSwweDEwLDB4NTAsMHg5NCwweGU1LDB4MDEsMHgwMCwweDE1LDB4ZTMsCisJMHhmYywweGZmLDB4ZmYsMHgwYSwweDA4LDB4NTAsMHg5NCwweGU1LDB4MDEsMHg1MCwweGMxLDB4ZTQsMHgwMSwweDAwLDB4ODAsMHhlMiwKKwkweDAyLDB4MDAsMHg1MCwweGUxLDB4ZjMsMHhmZiwweGZmLDB4M2EsMHhjOCwweDAwLDB4YTAsMHhlMywweDk4LDB4ZmYsMHhmZiwweGViLAorCTB4NzAsMHg0MCwweGJkLDB4ZTgsMHgxZSwweGZmLDB4MmYsMHhlMSwweDAxLDB4MGMsMHgwMCwweDAyLDB4MDEsMHgwMiwweDAwLDB4MDIsCisJMHgwMCwweDAxLDB4MDAsMHgwMgorfTsKKworc3RydWN0IGF0bWVsX3ByaXZhdGUgeworCXZvaWQgKmNhcmQ7IC8qIEJ1cyBkZXBlbmRlbnQgc3R1Y3R1cmUgdmFyaWVzIGZvciBQQ2NhcmQgKi8KKwlpbnQgKCpwcmVzZW50X2NhbGxiYWNrKSh2b2lkICopOyAvKiBBbmQgY2FsbGJhY2sgd2hpY2ggdXNlcyBpdCAqLworCWNoYXIgZmlybXdhcmVfaWRbMzJdOworCUF0bWVsRldUeXBlIGZpcm13YXJlX3R5cGU7CisJdTggKmZpcm13YXJlOworCWludCBmaXJtd2FyZV9sZW5ndGg7CisJc3RydWN0IHRpbWVyX2xpc3QgbWFuYWdlbWVudF90aW1lcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBkZXZpY2UgKnN5c19kZXY7CisJc3RydWN0IGl3X3N0YXRpc3RpY3Mgd3N0YXRzOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOwkvLyBkZXZpY2Ugc3RhdHMKKwlzcGlubG9ja190IGlycWxvY2ssIHRpbWVybG9jazsJLy8gc3BpbmxvY2tzCisJZW51bSB7IEJVU19UWVBFX1BDQ0FSRCwgQlVTX1RZUEVfUENJIH0gYnVzX3R5cGU7CisJZW51bSB7IAorCQlDQVJEX1RZUEVfUEFSQUxMRUxfRkxBU0gsIAorCQlDQVJEX1RZUEVfU1BJX0ZMQVNILAorCQlDQVJEX1RZUEVfRUVQUk9NIAorCX0gY2FyZF90eXBlOworCWludCBkb19yeF9jcmM7IC8qIElmIHdlIG5lZWQgdG8gQ1JDIGluY29taW5nIHBhY2tldHMgKi8KKwlpbnQgcHJvYmVfY3JjOyAvKiBzZXQgaWYgd2UgZG9uJ3QgeWV0IGtub3cgKi8KKwlpbnQgY3JjX29rX2NudCwgY3JjX2tvX2NudDsgLyogY291bnRlcnMgZm9yIHByb2JpbmcgKi8KKwl1MTYgcnhfZGVzY19oZWFkOworCXUxNiB0eF9kZXNjX2ZyZWUsIHR4X2Rlc2NfaGVhZCwgdHhfZGVzY190YWlsLCB0eF9kZXNjX3ByZXZpb3VzOworCXUxNiB0eF9mcmVlX21lbSwgdHhfYnVmZl9oZWFkLCB0eF9idWZmX3RhaWw7CisJCisJdTE2IGZyYWdfc2VxLCBmcmFnX2xlbiwgZnJhZ19ubzsKKwl1OCBmcmFnX3NvdXJjZVs2XTsgCisJCisJdTggd2VwX2lzX29uLCBkZWZhdWx0X2tleSwgZXhjbHVkZV91bmVuY3J5cHRlZCwgZW5jcnlwdGlvbl9sZXZlbDsKKwl1OCBncm91cF9jaXBoZXJfc3VpdGUsIHBhaXJ3aXNlX2NpcGhlcl9zdWl0ZTsKKwl1OCB3ZXBfa2V5c1tNQVhfRU5DUllQVElPTl9LRVlTXVtNQVhfRU5DUllQVElPTl9LRVlfU0laRV07CisJaW50IHdlcF9rZXlfbGVuW01BWF9FTkNSWVBUSU9OX0tFWVNdOyAKKwlpbnQgdXNlX3dwYSwgcmFkaW9fb25fYnJva2VuOyAvKiBmaXJtd2FyZSBkZXBlbmRlbnQgc3R1ZmYuICovCisKKwl1MTYgaG9zdF9pbmZvX2Jhc2U7CisJc3RydWN0IGhvc3RfaW5mb19zdHJ1Y3QgeyAKKwkJLyogTkIgdGhpcyBpcyBtYXRjaGVkIHRvIHRoZSBoYXJkd2FyZSwgZG9uJ3QgY2hhbmdlLiAqLworCQl1OCB2b2xhdGlsZSBpbnRfc3RhdHVzOworCQl1OCB2b2xhdGlsZSBpbnRfbWFzazsKKwkJdTggdm9sYXRpbGUgbG9ja291dF9ob3N0OworCQl1OCB2b2xhdGlsZSBsb2Nrb3V0X21hYzsKKworCQl1MTYgdHhfYnVmZl9wb3M7CisJCXUxNiB0eF9idWZmX3NpemU7CisJCXUxNiB0eF9kZXNjX3BvczsKKwkJdTE2IHR4X2Rlc2NfY291bnQ7CisKKwkJdTE2IHJ4X2J1ZmZfcG9zOworCQl1MTYgcnhfYnVmZl9zaXplOworCQl1MTYgcnhfZGVzY19wb3M7CisJCXUxNiByeF9kZXNjX2NvdW50OworCQkKKwkJdTE2IGJ1aWxkX3ZlcnNpb247CisJCXUxNiBjb21tYW5kX3BvczsgCQorCQkKKwkJdTE2IG1ham9yX3ZlcnNpb247CisJCXUxNiBtaW5vcl92ZXJzaW9uOworCQkKKwkJdTE2IGZ1bmNfY3RybDsKKwkJdTE2IG1hY19zdGF0dXM7CisJCXUxNiBnZW5lcmljX0lSUV90eXBlOworCQl1OCAgcmVzZXJ2ZWRbMl07CisJfSBob3N0X2luZm87CisKKwllbnVtIHsgCisJCVNUQVRJT05fU1RBVEVfU0NBTk5JTkcsCisJCVNUQVRJT05fU1RBVEVfSk9JTk5JTkcsCisJCVNUQVRJT05fU1RBVEVfQVVUSEVOVElDQVRJTkcsCisJCVNUQVRJT05fU1RBVEVfQVNTT0NJQVRJTkcsCisJCVNUQVRJT05fU1RBVEVfUkVBRFksCisJCVNUQVRJT05fU1RBVEVfUkVBU1NPQ0lBVElORywKKwkJU1RBVElPTl9TVEFURV9ET1dOLAorCQlTVEFUSU9OX1NUQVRFX01HTVRfRVJST1IKKwl9IHN0YXRpb25fc3RhdGU7CisJCisJaW50IG9wZXJhdGluZ19tb2RlLCBwb3dlcl9tb2RlOworCXRpbWVfdCBsYXN0X3F1YWw7CisJaW50IGJlYWNvbnNfdGhpc19zZWM7CisJaW50IGNoYW5uZWw7CisJaW50IHJlZ19kb21haW4sIGNvbmZpZ19yZWdfZG9tYWluOworCWludCB0eF9yYXRlOworCWludCBhdXRvX3R4X3JhdGU7CisJaW50IHJ0c190aHJlc2hvbGQ7CisJaW50IGZyYWdfdGhyZXNob2xkOworCWludCBsb25nX3JldHJ5LCBzaG9ydF9yZXRyeTsKKwlpbnQgcHJlYW1ibGU7CisJaW50IGRlZmF1bHRfYmVhY29uX3BlcmlvZCwgYmVhY29uX3BlcmlvZCwgbGlzdGVuX2ludGVydmFsOworCWludCBDdXJyZW50QXV0aGVudFRyYW5zYWN0aW9uU2VxTnVtLCBFeHBlY3RlZEF1dGhlbnRUcmFuc2FjdGlvblNlcU51bTsJCisJaW50IEF1dGhlbnRpY2F0aW9uUmVxdWVzdFJldHJ5Q250LCBBc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCwgUmVBc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudDsKKwllbnVtIHsKKwkJU0lURV9TVVJWRVlfSURMRSwKKwkJU0lURV9TVVJWRVlfSU5fUFJPR1JFU1MsCisJCVNJVEVfU1VSVkVZX0NPTVBMRVRFRCAKKwl9IHNpdGVfc3VydmV5X3N0YXRlOworCXRpbWVfdCBsYXN0X3N1cnZleTsKKworCWludCBzdGF0aW9uX3dhc19hc3NvY2lhdGVkLCBzdGF0aW9uX2lzX2Fzc29jaWF0ZWQ7CisJaW50IGZhc3Rfc2NhbjsKKwkJCQkKKwlzdHJ1Y3QgYnNzX2luZm8geworCQlpbnQgY2hhbm5lbDsKKwkJaW50IFNTSURzaXplOworCQlpbnQgUlNTSTsKKwkJaW50IFVzaW5nV0VQOworCQlpbnQgcHJlYW1ibGU7CisJCWludCBiZWFjb25fcGVyaW9kOworCQlpbnQgQlNTdHlwZTsKKwkJdTggQlNTSURbNl07CisJCXU4IFNTSURbTUFYX1NTSURfTEVOR1RIXTsKKwl9IEJTU2luZm9bTUFYX0JTU19FTlRSSUVTXTsKKwlpbnQgQlNTX2xpc3RfZW50cmllcywgY3VycmVudF9CU1M7CisJaW50IGNvbm5lY3RfdG9fYW55X0JTUzsgCisJaW50IFNTSURfc2l6ZSwgbmV3X1NTSURfc2l6ZTsKKwl1OCBDdXJyZW50QlNTSURbNl0sIEJTU0lEWzZdOworCXU4IFNTSURbTUFYX1NTSURfTEVOR1RIXSwgbmV3X1NTSURbTUFYX1NTSURfTEVOR1RIXTsKKwl1NjQgbGFzdF9iZWFjb25fdGltZXN0YW1wOworCXU4IHJ4X2J1ZltNQVhfV0lSRUxFU1NfQk9EWV07CisJCit9OworCitzdGF0aWMgdTggYXRtZWxfYmFzaWNfcmF0ZXNbNF0gPSB7MHg4MiwweDg0LDB4MGIsMHgxNn07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWludCByZWdfZG9tYWluOworCWludCBtaW4sIG1heDsKKwljaGFyICpuYW1lOyAKK30gY2hhbm5lbF90YWJsZVtdID0geyB7IFJFR19ET01BSU5fRkNDLCAxLCAxMSwgIlVTQSIgfSwKKwkJICAgICAgeyBSRUdfRE9NQUlOX0RPQywgMSwgMTEsICJDYW5hZGEiIH0sCisJCSAgICAgIHsgUkVHX0RPTUFJTl9FVFNJLCAxLCAxMywgIkV1cm9wZSIgfSwKKwkJICAgICAgeyBSRUdfRE9NQUlOX1NQQUlOLCAxMCwgMTEsICJTcGFpbiIgfSwKKwkJICAgICAgeyBSRUdfRE9NQUlOX0ZSQU5DRSwgMTAsIDEzLCAiRnJhbmNlIiB9LCAKKwkJICAgICAgeyBSRUdfRE9NQUlOX01LSywgMTQsIDE0LCAiTUtLIiB9LAorCQkgICAgICB7IFJFR19ET01BSU5fTUtLMSwgMSwgMTQsICJNS0sxIiB9LAorCQkgICAgICB7IFJFR19ET01BSU5fSVNSQUVMLCAzLCA5LCAiSXNyYWVsIn0gfTsKKworc3RhdGljIHZvaWQgYnVpbGRfd3BhX21pYihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdik7CitzdGF0aWMgaW50IGF0bWVsX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIHZvaWQgYXRtZWxfY29weV90b19jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBkZXN0LCB1bnNpZ25lZCBjaGFyICpzcmMsIHUxNiBsZW4pOworc3RhdGljIHZvaWQgYXRtZWxfY29weV90b19ob3N0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIHUxNiBzcmMsIHUxNiBsZW4pOworc3RhdGljIHZvaWQgYXRtZWxfc2V0X2djcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgbWFzayk7CitzdGF0aWMgdm9pZCBhdG1lbF9jbGVhcl9nY3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IG1hc2spOworc3RhdGljIGludCBhdG1lbF9sb2NrX21hYyhzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdik7CitzdGF0aWMgdm9pZCBhdG1lbF93bWVtMzIoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHUxNiBwb3MsIHUzMiBkYXRhKTsKK3N0YXRpYyB2b2lkIGF0bWVsX2NvbW1hbmRfaXJxKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KTsKK3N0YXRpYyBpbnQgYXRtZWxfdmFsaWRhdGVfY2hhbm5lbChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IGNoYW5uZWwpOworc3RhdGljIHZvaWQgYXRtZWxfbWFuYWdlbWVudF9mcmFtZShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IGllZWU4MDJfMTFfaGRyICpoZWFkZXIsIAorCQkJCSAgIHUxNiBmcmFtZV9sZW4sIHU4IHJzc2kpOworc3RhdGljIHZvaWQgYXRtZWxfbWFuYWdlbWVudF90aW1lcih1X2xvbmcgYSk7CitzdGF0aWMgdm9pZCBhdG1lbF9zZW5kX2NvbW1hbmQoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIGludCBjb21tYW5kLCB2b2lkICpjbWQsIGludCBjbWRfc2l6ZSk7CitzdGF0aWMgaW50IGF0bWVsX3NlbmRfY29tbWFuZF93YWl0KHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgY29tbWFuZCwgdm9pZCAqY21kLCBpbnQgY21kX3NpemUpOworc3RhdGljIHZvaWQgYXRtZWxfdHJhbnNtaXRfbWFuYWdlbWVudF9mcmFtZShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IGllZWU4MDJfMTFfaGRyICpoZWFkZXIsCisJCQkJCSAgICB1OCAqYm9keSwgaW50IGJvZHlfbGVuKTsKKworc3RhdGljIHU4IGF0bWVsX2dldF9taWI4KHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1OCB0eXBlLCB1OCBpbmRleCk7CitzdGF0aWMgdm9pZCBhdG1lbF9zZXRfbWliOChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTggdHlwZSwgdTggaW5kZXgsIHU4IGRhdGEpOworc3RhdGljIHZvaWQgYXRtZWxfc2V0X21pYjE2KHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1OCB0eXBlLCB1OCBpbmRleCwgdTE2IGRhdGEpOworc3RhdGljIHZvaWQgYXRtZWxfc2V0X21pYihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTggdHlwZSwgdTggaW5kZXgsIHU4ICpkYXRhLCBpbnQgZGF0YV9sZW4pOworc3RhdGljIHZvaWQgYXRtZWxfZ2V0X21pYihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTggdHlwZSwgdTggaW5kZXgsIHU4ICpkYXRhLCBpbnQgZGF0YV9sZW4pOworc3RhdGljIHZvaWQgYXRtZWxfc2NhbihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IHNwZWNpZmljX3NzaWQpOworc3RhdGljIHZvaWQgYXRtZWxfam9pbl9ic3Moc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIGludCBic3NfaW5kZXgpOworc3RhdGljIHZvaWQgYXRtZWxfc21vb3RoX3F1YWwoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYpOworc3RhdGljIHZvaWQgYXRtZWxfd3JpdGVBUihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgZGF0YSk7CitzdGF0aWMgaW50IHByb2JlX2F0bWVsX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHJlc2V0X2F0bWVsX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworc3RhdGljIHZvaWQgYXRtZWxfZW50ZXJfc3RhdGUoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIGludCBuZXdfc3RhdGUpOworaW50IGF0bWVsX29wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgaW5saW5lIHUxNiBhdG1lbF9oaShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IG9mZnNldCkKK3sKKwlyZXR1cm4gcHJpdi0+aG9zdF9pbmZvX2Jhc2UgKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGF0bWVsX2NvKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1MTYgb2Zmc2V0KQoreworCXJldHVybiBwcml2LT5ob3N0X2luZm8uY29tbWFuZF9wb3MgKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGF0bWVsX3J4KHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1MTYgb2Zmc2V0LCB1MTYgIGRlc2MpCit7CisJcmV0dXJuIHByaXYtPmhvc3RfaW5mby5yeF9kZXNjX3BvcyArIChzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpICogZGVzYykgKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGF0bWVsX3R4KHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1MTYgb2Zmc2V0LCB1MTYgIGRlc2MpCit7CisJcmV0dXJuIHByaXYtPmhvc3RfaW5mby50eF9kZXNjX3BvcyArIChzaXplb2Yoc3RydWN0IHR4X2Rlc2MpICogZGVzYykgKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggYXRtZWxfcmVhZDgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IG9mZnNldCkKK3sKKwlyZXR1cm4gaW5iKGRldi0+YmFzZV9hZGRyICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0bWVsX3dyaXRlOChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgb2Zmc2V0LCB1OCBkYXRhKQoreworCW91dGIoZGF0YSwgZGV2LT5iYXNlX2FkZHIgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBhdG1lbF9yZWFkMTYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IG9mZnNldCkKK3sKKwlyZXR1cm4gaW53KGRldi0+YmFzZV9hZGRyICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0bWVsX3dyaXRlMTYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IG9mZnNldCwgdTE2IGRhdGEpCit7CisJb3V0dyhkYXRhLCBkZXYtPmJhc2VfYWRkciArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggYXRtZWxfcm1lbTgoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHUxNiBwb3MpCit7CisJYXRtZWxfd3JpdGVBUihwcml2LT5kZXYsIHBvcyk7CQorCXJldHVybiBhdG1lbF9yZWFkOChwcml2LT5kZXYsIERSKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0bWVsX3dtZW04KHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1MTYgcG9zLCB1MTYgZGF0YSkKK3sKKwlhdG1lbF93cml0ZUFSKHByaXYtPmRldiwgcG9zKTsJCisJYXRtZWxfd3JpdGU4KHByaXYtPmRldiwgRFIsIGRhdGEpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBhdG1lbF9ybWVtMTYoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHUxNiBwb3MpCit7CisgICAgICAgCWF0bWVsX3dyaXRlQVIocHJpdi0+ZGV2LCBwb3MpOwkKKwlyZXR1cm4gYXRtZWxfcmVhZDE2KHByaXYtPmRldiwgRFIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRtZWxfd21lbTE2KHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1MTYgcG9zLCB1MTYgZGF0YSkKK3sKKyAgICAgICAJYXRtZWxfd3JpdGVBUihwcml2LT5kZXYsIHBvcyk7CQorCWF0bWVsX3dyaXRlMTYocHJpdi0+ZGV2LCBEUiwgZGF0YSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgYXRtZWxfaGFuZGxlcl9kZWY7CisKK3N0YXRpYyB2b2lkIHR4X2RvbmVfaXJxKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgCisJICAgICBhdG1lbF9ybWVtOChwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX0ZMQUdTX09GRlNFVCwgcHJpdi0+dHhfZGVzY19oZWFkKSkgPT0gVFhfRE9ORSAmJgorCQkgICAgIGkgPCBwcml2LT5ob3N0X2luZm8udHhfZGVzY19jb3VudDsKKwkgICAgIGkrKykgeworCQkKKwkJdTggc3RhdHVzID0gYXRtZWxfcm1lbTgocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19TVEFUVVNfT0ZGU0VULCBwcml2LT50eF9kZXNjX2hlYWQpKTsKKwkJdTE2IG1zZHVfc2l6ZSA9IGF0bWVsX3JtZW0xNihwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX1NJWkVfT0ZGU0VULCBwcml2LT50eF9kZXNjX2hlYWQpKTsKKwkJdTggdHlwZSA9IGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfUEFDS0VUX1RZUEVfT0ZGU0VULCBwcml2LT50eF9kZXNjX2hlYWQpKTsKKworCQlhdG1lbF93bWVtOChwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX0ZMQUdTX09GRlNFVCwgcHJpdi0+dHhfZGVzY19oZWFkKSwgMCk7CisKKwkJcHJpdi0+dHhfZnJlZV9tZW0gKz0gbXNkdV9zaXplOworCQlwcml2LT50eF9kZXNjX2ZyZWUrKzsKKworCQlpZiAocHJpdi0+dHhfYnVmZl9oZWFkICsgbXNkdV9zaXplID4gKHByaXYtPmhvc3RfaW5mby50eF9idWZmX3BvcyArIHByaXYtPmhvc3RfaW5mby50eF9idWZmX3NpemUpKQorCQkJcHJpdi0+dHhfYnVmZl9oZWFkID0gMDsKKwkJZWxzZQorCQkJcHJpdi0+dHhfYnVmZl9oZWFkICs9IG1zZHVfc2l6ZTsKKwkJCQorCQlpZiAocHJpdi0+dHhfZGVzY19oZWFkIDwgKHByaXYtPmhvc3RfaW5mby50eF9kZXNjX2NvdW50IC0gMSkpCisJCQlwcml2LT50eF9kZXNjX2hlYWQrKyA7CQkJCQkKKwkJZWxzZQorCQkJcHJpdi0+dHhfZGVzY19oZWFkID0gMDsKKwkJCisJCWlmICh0eXBlID09IFRYX1BBQ0tFVF9UWVBFX0RBVEEpIHsKKwkJCWlmIChzdGF0dXMgPT0gVFhfU1RBVFVTX1NVQ0NFU1MpCisJCQkJcHJpdi0+c3RhdHMudHhfcGFja2V0cysrOworCQkJZWxzZSAKKwkJCQlwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCW5ldGlmX3dha2VfcXVldWUocHJpdi0+ZGV2KTsKKwkJfQorCX0KK30KKworc3RhdGljIHUxNiBmaW5kX3R4X2J1ZmYoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHUxNiBsZW4pCit7CisJdTE2IGJvdHRvbV9mcmVlID0gcHJpdi0+aG9zdF9pbmZvLnR4X2J1ZmZfc2l6ZSAtIHByaXYtPnR4X2J1ZmZfdGFpbDsKKworCWlmIChwcml2LT50eF9kZXNjX2ZyZWUgPT0gMyB8fCBwcml2LT50eF9mcmVlX21lbSA8IGxlbikgCisJCXJldHVybiAwOworCQorCWlmIChib3R0b21fZnJlZSA+PSBsZW4pCisJCXJldHVybiBwcml2LT5ob3N0X2luZm8udHhfYnVmZl9wb3MgKyBwcml2LT50eF9idWZmX3RhaWw7CisJCisJaWYgKHByaXYtPnR4X2ZyZWVfbWVtIC0gYm90dG9tX2ZyZWUgPj0gbGVuKSB7CisJCXByaXYtPnR4X2J1ZmZfdGFpbCA9IDA7CisJCXJldHVybiBwcml2LT5ob3N0X2luZm8udHhfYnVmZl9wb3M7CisJfQorCQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0eF91cGRhdGVfZGVzY3JpcHRvcihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IGlzX2JjYXN0LCB1MTYgbGVuLCB1MTYgYnVmZiwgdTggdHlwZSkKK3sKKwlhdG1lbF93bWVtMTYocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19QT1NfT0ZGU0VULCBwcml2LT50eF9kZXNjX3RhaWwpLCBidWZmKTsKKwlhdG1lbF93bWVtMTYocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19TSVpFX09GRlNFVCwgcHJpdi0+dHhfZGVzY190YWlsKSwgbGVuKTsKKwlpZiAoIXByaXYtPnVzZV93cGEpCisJCWF0bWVsX3dtZW0xNihwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX0hPU1RfTEVOR1RIX09GRlNFVCwgcHJpdi0+dHhfZGVzY190YWlsKSwgbGVuKTsKKwlhdG1lbF93bWVtOChwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX1BBQ0tFVF9UWVBFX09GRlNFVCwgcHJpdi0+dHhfZGVzY190YWlsKSwgdHlwZSk7CisJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19SQVRFX09GRlNFVCwgcHJpdi0+dHhfZGVzY190YWlsKSwgcHJpdi0+dHhfcmF0ZSk7CisJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19SRVRSWV9PRkZTRVQsIHByaXYtPnR4X2Rlc2NfdGFpbCksIDApOworCWlmIChwcml2LT51c2Vfd3BhKSB7CisJCWludCBjaXBoZXJfdHlwZSwgY2lwaGVyX2xlbmd0aDsKKwkJaWYgKGlzX2JjYXN0KSB7CisJCQljaXBoZXJfdHlwZSA9IHByaXYtPmdyb3VwX2NpcGhlcl9zdWl0ZTsKKwkJCWlmIChjaXBoZXJfdHlwZSA9PSBDSVBIRVJfU1VJVEVfV0VQXzY0IHx8IAorCQkJICAgIGNpcGhlcl90eXBlID09IENJUEhFUl9TVUlURV9XRVBfMTI4ICkKKwkJCQljaXBoZXJfbGVuZ3RoID0gODsKKwkJCWVsc2UgaWYgKGNpcGhlcl90eXBlID09IENJUEhFUl9TVUlURV9US0lQKQorCQkJCWNpcGhlcl9sZW5ndGggPSAxMjsKKwkJCWVsc2UgaWYgKHByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZSA9PSBDSVBIRVJfU1VJVEVfV0VQXzY0IHx8CisJCQkJIHByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZSA9PSBDSVBIRVJfU1VJVEVfV0VQXzEyOCkgeworCQkJCWNpcGhlcl90eXBlID0gcHJpdi0+cGFpcndpc2VfY2lwaGVyX3N1aXRlOworCQkJCWNpcGhlcl9sZW5ndGggPSA4OworCQkJfSBlbHNlIHsKKwkJCQljaXBoZXJfdHlwZSA9IENJUEhFUl9TVUlURV9OT05FOworCQkJCWNpcGhlcl9sZW5ndGggPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJY2lwaGVyX3R5cGUgPSBwcml2LT5wYWlyd2lzZV9jaXBoZXJfc3VpdGU7CisJCQlpZiAoY2lwaGVyX3R5cGUgPT0gQ0lQSEVSX1NVSVRFX1dFUF82NCB8fCAKKwkJCSAgICBjaXBoZXJfdHlwZSA9PSBDSVBIRVJfU1VJVEVfV0VQXzEyOCApCisJCQkJY2lwaGVyX2xlbmd0aCA9IDg7CisJCQllbHNlIGlmIChjaXBoZXJfdHlwZSA9PSBDSVBIRVJfU1VJVEVfVEtJUCkKKwkJCQljaXBoZXJfbGVuZ3RoID0gMTI7CisJCQllbHNlIGlmIChwcml2LT5ncm91cF9jaXBoZXJfc3VpdGUgPT0gQ0lQSEVSX1NVSVRFX1dFUF82NCB8fAorCQkJCSBwcml2LT5ncm91cF9jaXBoZXJfc3VpdGUgPT0gQ0lQSEVSX1NVSVRFX1dFUF8xMjgpIHsKKwkJCQljaXBoZXJfdHlwZSA9IHByaXYtPmdyb3VwX2NpcGhlcl9zdWl0ZTsKKwkJCQljaXBoZXJfbGVuZ3RoID0gODsKKwkJCX0gZWxzZSB7CisJCQkJY2lwaGVyX3R5cGUgPSBDSVBIRVJfU1VJVEVfTk9ORTsKKwkJCQljaXBoZXJfbGVuZ3RoID0gMDsKKwkJCX0KKwkJfQorCQkKKwkJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19DSVBIRVJfVFlQRV9PRkZTRVQsIHByaXYtPnR4X2Rlc2NfdGFpbCksCisJCQkgICAgY2lwaGVyX3R5cGUpOwkKKwkJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19DSVBIRVJfTEVOR1RIX09GRlNFVCwgcHJpdi0+dHhfZGVzY190YWlsKSwKKwkJCSAgICBjaXBoZXJfbGVuZ3RoKTsKKwl9CisJYXRtZWxfd21lbTMyKHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfTkVYVF9PRkZTRVQsIHByaXYtPnR4X2Rlc2NfdGFpbCksIDB4ODAwMDAwMDBMKTsKKwlhdG1lbF93bWVtOChwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX0ZMQUdTX09GRlNFVCwgcHJpdi0+dHhfZGVzY190YWlsKSwgVFhfRklSTV9PV04pOworCWlmIChwcml2LT50eF9kZXNjX3ByZXZpb3VzICE9IHByaXYtPnR4X2Rlc2NfdGFpbCkKKwkJYXRtZWxfd21lbTMyKHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfTkVYVF9PRkZTRVQsIHByaXYtPnR4X2Rlc2NfcHJldmlvdXMpLCAwKTsKKwlwcml2LT50eF9kZXNjX3ByZXZpb3VzID0gcHJpdi0+dHhfZGVzY190YWlsOworCWlmIChwcml2LT50eF9kZXNjX3RhaWwgPCAocHJpdi0+aG9zdF9pbmZvLnR4X2Rlc2NfY291bnQgLTEgKSkKKwkJcHJpdi0+dHhfZGVzY190YWlsKys7CisJZWxzZQorCQlwcml2LT50eF9kZXNjX3RhaWwgPSAwOworCXByaXYtPnR4X2Rlc2NfZnJlZS0tOworCXByaXYtPnR4X2ZyZWVfbWVtIC09IGxlbjsKKworfQorCitzdGF0aWMgaW50IHN0YXJ0X3R4IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIgaGVhZGVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTE2IGJ1ZmYsIGZyYW1lX2N0bCwgbGVuID0gKEVUSF9aTEVOIDwgc2tiLT5sZW4pID8gc2tiLT5sZW4gOiBFVEhfWkxFTjsKKwl1OCBTTkFQX1JGQzEwMjRbNl0gPSB7MHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMH07CisgCisJaWYgKHByaXYtPmNhcmQgJiYgcHJpdi0+cHJlc2VudF9jYWxsYmFjayAmJiAKKwkgICAgISgqcHJpdi0+cHJlc2VudF9jYWxsYmFjaykocHJpdi0+Y2FyZCkpIHsKKwkJcHJpdi0+c3RhdHMudHhfZXJyb3JzKys7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCWlmIChwcml2LT5zdGF0aW9uX3N0YXRlICE9IFNUQVRJT05fU1RBVEVfUkVBRFkpIHsKKwkJcHJpdi0+c3RhdHMudHhfZXJyb3JzKys7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCS8qIGZpcnN0IGVuc3VyZSB0aGUgdGltZXIgZnVuYyBjYW5ub3QgcnVuICovCisJc3Bpbl9sb2NrX2JoKCZwcml2LT50aW1lcmxvY2spOyAKKwkvKiB0aGVuIHN0b3AgdGhlIGhhcmR3YXJlIElTUiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5pcnFsb2NrLCBmbGFncyk7IAorCS8qIG5iIGRvaW5nIHRoZSBhYm92ZSBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIgd2lsbCBkZWFkbG9jayAqLworCQorCS8qIFRoZSBXaXJlbGVzcyBIZWFkZXIgaXMgMzAgYnl0ZXMuIEluIHRoZSBFdGhlcm5ldCBwYWNrZXQgd2UgImN1dCIgdGhlCisJICAgMTIgZmlyc3QgYnl0ZXMgKGNvbnRhaW5pbmcgREEvU0EpIGFuZCBwdXQgdGhlbSBpbiB0aGUgYXBwcm9wcmlhdGUgZmllbGRzIG9mCisJICAgdGhlIFdpcmVsZXNzIEhlYWRlci4gVGh1cyB0aGUgcGFja2V0IGxlbmd0aCBpcyB0aGVuIHRoZSBpbml0aWFsICsgMTggKCszMC0xMikgKi8KKwkKKwlpZiAoIShidWZmID0gZmluZF90eF9idWZmKHByaXYsIGxlbiArIDE4KSkpIHsKKwkJcHJpdi0+c3RhdHMudHhfZHJvcHBlZCsrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFsb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT50aW1lcmxvY2spOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXJldHVybiAxOworCX0KKwkKKwlmcmFtZV9jdGwgPSBJRUVFODAyXzExX0ZUWVBFX0RBVEE7CisJaGVhZGVyLmR1cmF0aW9uX2lkID0gMDsKKwloZWFkZXIuc2VxX2N0bCA9IDA7CisJaWYgKHByaXYtPndlcF9pc19vbikKKwkJZnJhbWVfY3RsIHw9IElFRUU4MDJfMTFfRkNUTF9XRVA7CisJaWYgKHByaXYtPm9wZXJhdGluZ19tb2RlID09IElXX01PREVfQURIT0MpIHsKKwkJbWVtY3B5KCZoZWFkZXIuYWRkcjEsIHNrYi0+ZGF0YSwgNik7CisJCW1lbWNweSgmaGVhZGVyLmFkZHIyLCBkZXYtPmRldl9hZGRyLCA2KTsKKwkJbWVtY3B5KCZoZWFkZXIuYWRkcjMsIHByaXYtPkJTU0lELCA2KTsKKwl9IGVsc2UgeworCQlmcmFtZV9jdGwgfD0gSUVFRTgwMl8xMV9GQ1RMX1RPRFM7CisJCW1lbWNweSgmaGVhZGVyLmFkZHIxLCBwcml2LT5DdXJyZW50QlNTSUQsIDYpOworCQltZW1jcHkoJmhlYWRlci5hZGRyMiwgZGV2LT5kZXZfYWRkciwgNik7CisJCW1lbWNweSgmaGVhZGVyLmFkZHIzLCBza2ItPmRhdGEsIDYpOworCX0KKwkKKwlpZiAocHJpdi0+dXNlX3dwYSkKKwkJbWVtY3B5KCZoZWFkZXIuYWRkcjQsIFNOQVBfUkZDMTAyNCwgNik7CisKKwloZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoZnJhbWVfY3RsKTsKKwkvKiBDb3B5IHRoZSB3aXJlbGVzcyBoZWFkZXIgaW50byB0aGUgY2FyZCAqLworCWF0bWVsX2NvcHlfdG9fY2FyZChkZXYsIGJ1ZmYsICh1bnNpZ25lZCBjaGFyICopJmhlYWRlciwgREFUQV9GUkFNRV9XU19IRUFERVJfU0laRSk7CisJLyogQ29weSB0aGUgcGFja2V0IHNhbnMgaXRzIDgwMi4zIGhlYWRlciBhZGRyZXNzZXMgd2hpY2ggaGF2ZSBiZWVuIHJlcGxhY2VkICovCisJYXRtZWxfY29weV90b19jYXJkKGRldiwgYnVmZiArIERBVEFfRlJBTUVfV1NfSEVBREVSX1NJWkUsIHNrYi0+ZGF0YSArIDEyLCBsZW4gLSAxMik7CisJcHJpdi0+dHhfYnVmZl90YWlsICs9IGxlbiAtIDEyICsgREFUQV9GUkFNRV9XU19IRUFERVJfU0laRTsKKwkKKwkvKiBsb3cgYml0IG9mIGZpcnN0IGJ5dGUgb2YgZGVzdGluYXRpb24gdGVsbHMgdXMgaWYgYnJvYWRjYXN0ICovCisJdHhfdXBkYXRlX2Rlc2NyaXB0b3IocHJpdiwgKihza2ItPmRhdGEpICYgMHgwMSwgbGVuICsgMTgsIGJ1ZmYsIFRYX1BBQ0tFVF9UWVBFX0RBVEEpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXByaXYtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFsb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPnRpbWVybG9jayk7CisJZGV2X2tmcmVlX3NrYihza2IpOworCQorCXJldHVybiAwOwkKK30KKworc3RhdGljIHZvaWQgYXRtZWxfdHJhbnNtaXRfbWFuYWdlbWVudF9mcmFtZShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgCisJCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIgKmhlYWRlciwKKwkJCQkJICAgIHU4ICpib2R5LCBpbnQgYm9keV9sZW4pCit7CisJdTE2IGJ1ZmY7CisJaW50IGxlbiA9ICBNR01UX0ZSQU1FX0JPRFlfT0ZGU0VUICsgYm9keV9sZW47CisJCisJaWYgKCEoYnVmZiA9IGZpbmRfdHhfYnVmZihwcml2LCBsZW4pKSkgCisJCXJldHVybjsKKworCWF0bWVsX2NvcHlfdG9fY2FyZChwcml2LT5kZXYsIGJ1ZmYsICh1OCAqKWhlYWRlciwgTUdNVF9GUkFNRV9CT0RZX09GRlNFVCk7CisJYXRtZWxfY29weV90b19jYXJkKHByaXYtPmRldiwgYnVmZiArIE1HTVRfRlJBTUVfQk9EWV9PRkZTRVQsIGJvZHksIGJvZHlfbGVuKTsKKwlwcml2LT50eF9idWZmX3RhaWwgKz0gbGVuOworCXR4X3VwZGF0ZV9kZXNjcmlwdG9yKHByaXYsIGhlYWRlci0+YWRkcjFbMF0gJiAweDAxLCBsZW4sIGJ1ZmYsIFRYX1BBQ0tFVF9UWVBFX01HTVQpOworfQorCQorc3RhdGljIHZvaWQgZmFzdF9yeF9wYXRoKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIgKmhlYWRlciwgCisJCQkgdTE2IG1zZHVfc2l6ZSwgdTE2IHJ4X3BhY2tldF9sb2MsIHUzMiBjcmMpCit7CisJLyogZmFzdCBwYXRoOiB1bmZyYWdtZW50ZWQgcGFja2V0IGNvcHkgZGlyZWN0bHkgaW50byBza2J1ZiAqLworCXU4IG1hYzRbNl07IAorCXN0cnVjdCBza19idWZmIAkqc2tiOworCXVuc2lnbmVkIGNoYXIgKnNrYnA7CisJCisJLyogZ2V0IHRoZSBmaW5hbCwgbWFjIDQgaGVhZGVyIGZpZWxkLCB0aGlzIHRlbGxzIHVzIGVuY2Fwc3VsYXRpb24gKi8KKwlhdG1lbF9jb3B5X3RvX2hvc3QocHJpdi0+ZGV2LCBtYWM0LCByeF9wYWNrZXRfbG9jICsgMjQsIDYpOworCW1zZHVfc2l6ZSAtPSA2OworCQorCWlmIChwcml2LT5kb19yeF9jcmMpIHsKKwkJY3JjID0gY3JjMzJfbGUoY3JjLCBtYWM0LCA2KTsKKwkJbXNkdV9zaXplIC09IDQ7CisJfQorCQorCWlmICghKHNrYiA9IGRldl9hbGxvY19za2IobXNkdV9zaXplICsgMTQpKSkgeworCQlwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXJldHVybjsKKwl9CisKKwlza2JfcmVzZXJ2ZShza2IsIDIpOworCXNrYnAgPSBza2JfcHV0KHNrYiwgbXNkdV9zaXplICsgMTIpOworCWF0bWVsX2NvcHlfdG9faG9zdChwcml2LT5kZXYsIHNrYnAgKyAxMiwgcnhfcGFja2V0X2xvYyArIDMwLCBtc2R1X3NpemUpOworCQorCWlmIChwcml2LT5kb19yeF9jcmMpIHsKKwkJdTMyIG5ldGNyYzsKKwkJY3JjID0gY3JjMzJfbGUoY3JjLCBza2JwICsgMTIsIG1zZHVfc2l6ZSk7CisJCWF0bWVsX2NvcHlfdG9faG9zdChwcml2LT5kZXYsICh2b2lkICopJm5ldGNyYywgcnhfcGFja2V0X2xvYyArIDMwICsgbXNkdV9zaXplLCA0KTsKKwkJaWYgKChjcmMgXiAweGZmZmZmZmZmKSAhPSBuZXRjcmMpIHsKKwkJCXByaXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkKKwltZW1jcHkoc2ticCwgaGVhZGVyLT5hZGRyMSwgNik7IC8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlpZiAobGUxNl90b19jcHUoaGVhZGVyLT5mcmFtZV9jdGwpICYgSUVFRTgwMl8xMV9GQ1RMX0ZST01EUykgCisJCW1lbWNweSgmc2ticFs2XSwgaGVhZGVyLT5hZGRyMywgNik7CisJZWxzZQorCQltZW1jcHkoJnNrYnBbNl0sIGhlYWRlci0+YWRkcjIsIDYpOyAvKiBzb3VyY2UgYWRkcmVzcyAqLworCQorCXByaXYtPmRldi0+bGFzdF9yeD1qaWZmaWVzOworCXNrYi0+ZGV2ID0gcHJpdi0+ZGV2OworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHByaXYtPmRldik7CisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwkKKwluZXRpZl9yeChza2IpOworCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IDEyICsgbXNkdV9zaXplOworCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKK30KKworLyogVGVzdCB0byBzZWUgaWYgdGhlIHBhY2tldCBpbiBjYXJkIG1lbW9yeSBhdCBwYWNrZXRfbG9jIGhhcyBhIHZhbGlkIENSQworICAgSXQgZG9lc24ndCBtYXR0ZXIgdGhhdCB0aGlzIGlzIHNsb3c6IGl0IGlzIG9ubHkgdXNlZCB0byBwcm9ibGUgdGhlIGZpcnN0IGZldyBwYWNrZXRzLiAqLworc3RhdGljIGludCBwcm9iZV9jcmMoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHUxNiBwYWNrZXRfbG9jLCB1MTYgbXNkdV9zaXplKQoreworCWludCBpID0gbXNkdV9zaXplIC0gNDsKKwl1MzIgbmV0Y3JjLCBjcmMgPSAweGZmZmZmZmZmOworCisJaWYgKG1zZHVfc2l6ZSA8IDQpCisJCXJldHVybiAwOworCisJYXRtZWxfY29weV90b19ob3N0KHByaXYtPmRldiwgKHZvaWQgKikmbmV0Y3JjLCBwYWNrZXRfbG9jICsgaSwgNCk7CisJCisJYXRtZWxfd3JpdGVBUihwcml2LT5kZXYsIHBhY2tldF9sb2MpOworCXdoaWxlIChpLS0pIHsKKwkJdTggb2N0ZXQgPSBhdG1lbF9yZWFkOChwcml2LT5kZXYsIERSKTsKKwkJY3JjID0gY3JjMzJfbGUoY3JjLCAmb2N0ZXQsIDEpOworCX0KKworCXJldHVybiAoY3JjIF4gMHhmZmZmZmZmZikgPT0gbmV0Y3JjOworfQorCitzdGF0aWMgdm9pZCBmcmFnX3J4X3BhdGgoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBpZWVlODAyXzExX2hkciAqaGVhZGVyLCAKKwkJCSB1MTYgbXNkdV9zaXplLCB1MTYgcnhfcGFja2V0X2xvYywgdTMyIGNyYywgdTE2IHNlcV9ubywgdTggZnJhZ19ubywgaW50IG1vcmVfZnJhZ3MpCit7CisJdTggbWFjNFs2XTsgCisJdTggc291cmNlWzZdOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlpZiAobGUxNl90b19jcHUoaGVhZGVyLT5mcmFtZV9jdGwpICYgSUVFRTgwMl8xMV9GQ1RMX0ZST01EUykgCisJCW1lbWNweShzb3VyY2UsIGhlYWRlci0+YWRkcjMsIDYpOworCWVsc2UKKwkJbWVtY3B5KHNvdXJjZSwgaGVhZGVyLT5hZGRyMiwgNik7IAorCQorCXJ4X3BhY2tldF9sb2MgKz0gMjQ7IC8qIHNraXAgaGVhZGVyICovCisJCisJaWYgKHByaXYtPmRvX3J4X2NyYykKKwkJbXNkdV9zaXplIC09IDQ7CisKKwlpZiAoZnJhZ19ubyA9PSAwKSB7IC8qIGZpcnN0IGZyYWdtZW50ICovCisJCWF0bWVsX2NvcHlfdG9faG9zdChwcml2LT5kZXYsIG1hYzQsIHJ4X3BhY2tldF9sb2MsIDYpOworCQltc2R1X3NpemUgLT0gNjsKKwkJcnhfcGFja2V0X2xvYyArPSA2OworCisJCWlmIChwcml2LT5kb19yeF9jcmMpIAorCQkJY3JjID0gY3JjMzJfbGUoY3JjLCBtYWM0LCA2KTsKKwkgICAgICAgCisJCXByaXYtPmZyYWdfc2VxID0gc2VxX25vOworCQlwcml2LT5mcmFnX25vID0gMTsKKwkJcHJpdi0+ZnJhZ19sZW4gPSBtc2R1X3NpemU7CisJCW1lbWNweShwcml2LT5mcmFnX3NvdXJjZSwgc291cmNlLCA2KTsgCisJCW1lbWNweSgmcHJpdi0+cnhfYnVmWzZdLCBzb3VyY2UsIDYpOworCQltZW1jcHkocHJpdi0+cnhfYnVmLCBoZWFkZXItPmFkZHIxLCA2KTsKKwkJCQkKKwkJYXRtZWxfY29weV90b19ob3N0KHByaXYtPmRldiwgJnByaXYtPnJ4X2J1ZlsxMl0sIHJ4X3BhY2tldF9sb2MsIG1zZHVfc2l6ZSk7CisKKwkJaWYgKHByaXYtPmRvX3J4X2NyYykgeworCQkJdTMyIG5ldGNyYzsKKwkJCWNyYyA9IGNyYzMyX2xlKGNyYywgJnByaXYtPnJ4X2J1ZlsxMl0sIG1zZHVfc2l6ZSk7CisJCQlhdG1lbF9jb3B5X3RvX2hvc3QocHJpdi0+ZGV2LCAodm9pZCAqKSZuZXRjcmMsIHJ4X3BhY2tldF9sb2MgKyBtc2R1X3NpemUsIDQpOworCQkJaWYgKChjcmMgXiAweGZmZmZmZmZmKSAhPSBuZXRjcmMpIHsKKwkJCQlwcml2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkJbWVtc2V0KHByaXYtPmZyYWdfc291cmNlLCAweGZmLCA2KTsKKwkJCX0KKwkJfQorCQkKKwl9IGVsc2UgaWYgKHByaXYtPmZyYWdfbm8gPT0gZnJhZ19ubyAmJgorCQkgICBwcml2LT5mcmFnX3NlcSA9PSBzZXFfbm8gJiYKKwkJICAgbWVtY21wKHByaXYtPmZyYWdfc291cmNlLCBzb3VyY2UsIDYpID09IDApIHsKKwkJCisJCWF0bWVsX2NvcHlfdG9faG9zdChwcml2LT5kZXYsICZwcml2LT5yeF9idWZbMTIgKyBwcml2LT5mcmFnX2xlbl0sIAorCQkJCSAgIHJ4X3BhY2tldF9sb2MsIG1zZHVfc2l6ZSk7CisJCWlmIChwcml2LT5kb19yeF9jcmMpIHsKKwkJCXUzMiBuZXRjcmM7CisJCQljcmMgPSBjcmMzMl9sZShjcmMsIAorCQkJCSAgICAgICAmcHJpdi0+cnhfYnVmWzEyICsgcHJpdi0+ZnJhZ19sZW5dLCAKKwkJCQkgICAgICAgbXNkdV9zaXplKTsKKwkJCWF0bWVsX2NvcHlfdG9faG9zdChwcml2LT5kZXYsICh2b2lkICopJm5ldGNyYywgcnhfcGFja2V0X2xvYyArIG1zZHVfc2l6ZSwgNCk7CisJCQlpZiAoKGNyYyBeIDB4ZmZmZmZmZmYpICE9IG5ldGNyYykgeworCQkJCXByaXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQltZW1zZXQocHJpdi0+ZnJhZ19zb3VyY2UsIDB4ZmYsIDYpOworCQkJCW1vcmVfZnJhZ3MgPSAxOyAvKiBkb24ndCBzZW5kIGJyb2tlbiBhc3NlbWJseSAqLworCQkJfQorCQl9CisJCQorCQlwcml2LT5mcmFnX2xlbiArPSBtc2R1X3NpemU7CisJCXByaXYtPmZyYWdfbm8rKzsKKworCQlpZiAoIW1vcmVfZnJhZ3MpIHsgLyogbGFzdCBvbmUgKi8KKwkJCW1lbXNldChwcml2LT5mcmFnX3NvdXJjZSwgMHhmZiwgNik7CisJCQlpZiAoIShza2IgPSBkZXZfYWxsb2Nfc2tiKHByaXYtPmZyYWdfbGVuICsgMTQpKSkgeworCQkJCXByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCX0gZWxzZSB7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkJCQltZW1jcHkoc2tiX3B1dChza2IsIHByaXYtPmZyYWdfbGVuICsgMTIpLCAKKwkJCQkgICAgICAgcHJpdi0+cnhfYnVmLAorCQkJCSAgICAgICBwcml2LT5mcmFnX2xlbiArIDEyKTsKKwkJCQlwcml2LT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCXNrYi0+ZGV2ID0gcHJpdi0+ZGV2OworCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHByaXYtPmRldik7CisJCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwkKKwkJCQluZXRpZl9yeChza2IpOworCQkJCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IHByaXYtPmZyYWdfbGVuICsgMTI7CisJCQkJcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJfQorCQl9CisJCQorCX0gZWxzZQorCQlwcml2LT53c3RhdHMuZGlzY2FyZC5mcmFnbWVudCsrOworfQorCQkKK3N0YXRpYyB2b2lkIHJ4X2RvbmVfaXJxKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KQoreworCWludCBpOworCXN0cnVjdCBpZWVlODAyXzExX2hkciBoZWFkZXI7CisJCisJZm9yIChpID0gMDsgCisJICAgICBhdG1lbF9ybWVtOChwcml2LCBhdG1lbF9yeChwcml2LCBSWF9ERVNDX0ZMQUdTX09GRlNFVCwgcHJpdi0+cnhfZGVzY19oZWFkKSkgPT0gUlhfREVTQ19GTEFHX1ZBTElEICYmCisJCSAgICAgaSA8IHByaXYtPmhvc3RfaW5mby5yeF9kZXNjX2NvdW50OworCSAgICAgaSsrKSB7CisJCQkJCisJCXUxNiBtc2R1X3NpemUsIHJ4X3BhY2tldF9sb2MsIGZyYW1lX2N0bCwgc2VxX2NvbnRyb2w7CisJCXU4IHN0YXR1cyA9IGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX3J4KHByaXYsIFJYX0RFU0NfU1RBVFVTX09GRlNFVCwgcHJpdi0+cnhfZGVzY19oZWFkKSk7CisJCXUzMiBjcmMgPSAweGZmZmZmZmZmOworCQkKKwkJaWYgKHN0YXR1cyAhPSBSWF9TVEFUVVNfU1VDQ0VTUykgeworCQkJaWYgKHN0YXR1cyA9PSAweGMxKSAvKiBkZXRlcm1pbmVkIGJ5IGV4cGVyaW1lbnQgKi8KKwkJCQlwcml2LT53c3RhdHMuZGlzY2FyZC5ud2lkKys7CisJCQllbHNlCisJCQkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7IAorCQkJZ290byBuZXh0OworCQl9CisKKwkJbXNkdV9zaXplID0gYXRtZWxfcm1lbTE2KHByaXYsIGF0bWVsX3J4KHByaXYsIFJYX0RFU0NfTVNEVV9TSVpFX09GRlNFVCwgcHJpdi0+cnhfZGVzY19oZWFkKSk7CisJCXJ4X3BhY2tldF9sb2MgPSBhdG1lbF9ybWVtMTYocHJpdiwgYXRtZWxfcngocHJpdiwgUlhfREVTQ19NU0RVX1BPU19PRkZTRVQsIHByaXYtPnJ4X2Rlc2NfaGVhZCkpOworCQkKKwkJaWYgKG1zZHVfc2l6ZSA8IDMwKSB7CisJCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsgCisJCQlnb3RvIG5leHQ7CisJCX0KKwkJCisJCS8qIEdldCBoZWFkZXIgYXMgZmFyIGFzIGVuZCBvZiBzZXFfY3RsICovCisJCWF0bWVsX2NvcHlfdG9faG9zdChwcml2LT5kZXYsIChjaGFyICopJmhlYWRlciwgcnhfcGFja2V0X2xvYywgMjQpOworCQlmcmFtZV9jdGwgPSBsZTE2X3RvX2NwdShoZWFkZXIuZnJhbWVfY3RsKTsKKwkJc2VxX2NvbnRyb2wgPSBsZTE2X3RvX2NwdShoZWFkZXIuc2VxX2N0bCk7CisKKwkJLyogcHJvYmUgZm9yIENSQyB1c2UgaGVyZSBpZiBuZWVkZWQgIG9uY2UgZml2ZSBwYWNrZXRzIGhhdmUgYXJyaXZlZCB3aXRoCisJCSAgIHRoZSBzYW1lIGNyYyBzdGF0dXMsIHdlIGFzc3VtZSB3ZSBrbm93IHdoYXQncyBoYXBwZW5pbmcgYW5kIHN0b3AgcHJvYmluZyAqLworCQlpZiAocHJpdi0+cHJvYmVfY3JjKSB7CisJCQlpZiAoIXByaXYtPndlcF9pc19vbiB8fCAhKGZyYW1lX2N0bCAmIElFRUU4MDJfMTFfRkNUTF9XRVApKSB7CisJCQkJcHJpdi0+ZG9fcnhfY3JjID0gcHJvYmVfY3JjKHByaXYsIHJ4X3BhY2tldF9sb2MsIG1zZHVfc2l6ZSk7CisJCQl9IGVsc2UgeworCQkJCXByaXYtPmRvX3J4X2NyYyA9IHByb2JlX2NyYyhwcml2LCByeF9wYWNrZXRfbG9jICsgMjQsIG1zZHVfc2l6ZSAtIDI0KTsKKwkJCX0KKwkJCWlmIChwcml2LT5kb19yeF9jcmMpIHsKKwkJCQlpZiAocHJpdi0+Y3JjX29rX2NudCsrID4gNSkKKwkJCQkJcHJpdi0+cHJvYmVfY3JjID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHByaXYtPmNyY19rb19jbnQrKyA+IDUpCisJCQkJCXByaXYtPnByb2JlX2NyYyA9IDA7CisJCQl9CisJCX0KKwkJICAgIAorCQkvKiBkb24ndCBDUkMgaGVhZGVyIHdoZW4gV0VQIGluIHVzZSAqLworCQlpZiAocHJpdi0+ZG9fcnhfY3JjICYmICghcHJpdi0+d2VwX2lzX29uIHx8ICEoZnJhbWVfY3RsICYgSUVFRTgwMl8xMV9GQ1RMX1dFUCkpKSB7CisJCQljcmMgPSBjcmMzMl9sZSgweGZmZmZmZmZmLCAodW5zaWduZWQgY2hhciAqKSZoZWFkZXIsIDI0KTsKKwkJfQorCQltc2R1X3NpemUgLT0gMjQ7IC8qIGhlYWRlciAqLworCisJCWlmICgoZnJhbWVfY3RsICYgSUVFRTgwMl8xMV9GQ1RMX0ZUWVBFKSA9PSBJRUVFODAyXzExX0ZUWVBFX0RBVEEpIHsgCisJCQkKKwkJCWludCBtb3JlX2ZyYWdtZW50cyA9IGZyYW1lX2N0bCAmIElFRUU4MDJfMTFfRkNUTF9NT1JFRlJBR1M7CisJCQl1OCBwYWNrZXRfZnJhZ21lbnRfbm8gPSBzZXFfY29udHJvbCAmIElFRUU4MDJfMTFfU0NUTF9GUkFHOworCQkJdTE2IHBhY2tldF9zZXF1ZW5jZV9ubyA9IChzZXFfY29udHJvbCAmIElFRUU4MDJfMTFfU0NUTF9TRVEpID4+IDQ7CisJCQkKKwkJCWlmICghbW9yZV9mcmFnbWVudHMgJiYgcGFja2V0X2ZyYWdtZW50X25vID09IDAgKSB7CisJCQkJZmFzdF9yeF9wYXRoKHByaXYsICZoZWFkZXIsIG1zZHVfc2l6ZSwgcnhfcGFja2V0X2xvYywgY3JjKTsKKwkJCX0gZWxzZSB7CisJCQkJZnJhZ19yeF9wYXRoKHByaXYsICZoZWFkZXIsIG1zZHVfc2l6ZSwgcnhfcGFja2V0X2xvYywgY3JjLAorCQkJCQkgICAgIHBhY2tldF9zZXF1ZW5jZV9ubywgcGFja2V0X2ZyYWdtZW50X25vLCBtb3JlX2ZyYWdtZW50cyk7CisJCQl9CisJCX0KKwkJCisJCWlmICgoZnJhbWVfY3RsICYgSUVFRTgwMl8xMV9GQ1RMX0ZUWVBFKSA9PSBJRUVFODAyXzExX0ZUWVBFX01HTVQpIHsKKwkJCS8qIGNvcHkgcmVzdCBvZiBwYWNrZXQgaW50byBidWZmZXIgKi8KKwkJCWF0bWVsX2NvcHlfdG9faG9zdChwcml2LT5kZXYsICh1bnNpZ25lZCBjaGFyICopJnByaXYtPnJ4X2J1ZiwgcnhfcGFja2V0X2xvYyArIDI0LCBtc2R1X3NpemUpOworCQkJCisJCQkvKiB3ZSB1c2UgdGhlIHNhbWUgYnVmZmVyIGZvciBmcmFnIHJlYXNzZW1ibHkgYW5kIGNvbnRyb2wgcGFja2V0cyAqLworCQkJbWVtc2V0KHByaXYtPmZyYWdfc291cmNlLCAweGZmLCA2KTsKKwkJCQorCQkJaWYgKHByaXYtPmRvX3J4X2NyYykgeworCQkJCS8qIGxhc3QgNCBvY3RldHMgaXMgY3JjICovCisJCQkJbXNkdV9zaXplIC09IDQ7CisJCQkJY3JjID0gY3JjMzJfbGUoY3JjLCAodW5zaWduZWQgY2hhciAqKSZwcml2LT5yeF9idWYsIG1zZHVfc2l6ZSk7CisJCQkJaWYgKChjcmMgXiAweGZmZmZmZmZmKSAhPSAoKigodTMyICopJnByaXYtPnJ4X2J1Zlttc2R1X3NpemVdKSkpIHsKKwkJCQkJcHJpdi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCisJCQlhdG1lbF9tYW5hZ2VtZW50X2ZyYW1lKHByaXYsICZoZWFkZXIsIG1zZHVfc2l6ZSwKKwkJCQkJICAgICAgIGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX3J4KHByaXYsIFJYX0RFU0NfUlNTSV9PRkZTRVQsIHByaXYtPnJ4X2Rlc2NfaGVhZCkpKTsKKwkJfSAKKworCW5leHQ6CisJCS8qIHJlbGVhc2UgZGVzY3JpcHRvciAqLworCQlhdG1lbF93bWVtOChwcml2LCBhdG1lbF9yeChwcml2LCBSWF9ERVNDX0ZMQUdTX09GRlNFVCwgcHJpdi0+cnhfZGVzY19oZWFkKSwgUlhfREVTQ19GTEFHX0NPTlNVTUVEKTsgIAorCQkKKwkJaWYgKHByaXYtPnJ4X2Rlc2NfaGVhZCA8IChwcml2LT5ob3N0X2luZm8ucnhfZGVzY19jb3VudCAtIDEpKQorCQkJcHJpdi0+cnhfZGVzY19oZWFkKys7CQkJCQkKKwkJZWxzZQorCQkJcHJpdi0+cnhfZGVzY19oZWFkID0gMDsKKwl9Cit9CQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2VydmljZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTggaXNyOworCWludCBpID0gLTE7CisJc3RhdGljIHU4IGlycV9vcmRlcltdID0geyAKKwkJSVNSX09VVF9PRl9SQU5HRSwKKwkJSVNSX1J4Q09NUExFVEUsCisJCUlTUl9UeENPTVBMRVRFLAorCQlJU1JfUnhGUkFNRUxPU1QsCisJCUlTUl9GQVRBTF9FUlJPUiwKKwkJSVNSX0NPTU1BTkRfQ09NUExFVEUsCisJCUlTUl9JQlNTX01FUkdFLAorCQlJU1JfR0VORVJJQ19JUlEKKwl9OworCQkKKworCWlmIChwcml2LT5jYXJkICYmIHByaXYtPnByZXNlbnRfY2FsbGJhY2sgJiYgCisJICAgICEoKnByaXYtPnByZXNlbnRfY2FsbGJhY2spKHByaXYtPmNhcmQpKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwkvKiBJbiB0aGlzIHN0YXRlIHVwcGVyLWxldmVsIGNvZGUgYXNzdW1lcyBpdCBjYW4gbWVzcyB3aXRoCisJICAgdGhlIGNhcmQgdW5oYW1wZXJlZCBieSBpbnRlcnJ1cHRzIHdoaWNoIG1heSBjaGFuZ2UgcmVnaXN0ZXIgc3RhdGUuCisJICAgTm90ZSB0aGF0IGV2ZW4gdGhvdWdoIHRoZSBjYXJkIHNob3VsZG4ndCBnZW5lcmF0ZSBpbnRlcnJ1cHRzCisJICAgdGhlIGludHVycnVwdCBsaW5lIG1heSBiZSBzaGFyZWQuIFRoaXMgYWxsb3dzIGNhcmQgc2V0dXAgCisJICAgdG8gZ28gb24gd2l0aG91dCBkaXNhYmxpbmcgaW50ZXJydXB0cyBmb3IgYSBsb25nIHRpbWUuICovCisJaWYgKHByaXYtPnN0YXRpb25fc3RhdGUgPT0gU1RBVElPTl9TVEFURV9ET1dOKQorCQlyZXR1cm4gSVJRX05PTkU7CisgICAgIAkKKwlhdG1lbF9jbGVhcl9nY3IoZGV2LCBHQ1JfRU5JTlQpOyAvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKworCXdoaWxlICgxKSB7CisJCWlmICghYXRtZWxfbG9ja19tYWMocHJpdikpIHsKKwkJCS8qIGZhaWxlZCB0byBjb250YWN0IGNhcmQgKi8KKwkJCXByaW50ayhLRVJOX0FMRVJUICIlczogZmFpbGVkIHRvIGNvbnRhY3QgTUFDLlxuIiwgZGV2LT5uYW1lKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCQkKKwkJaXNyID0gYXRtZWxfcm1lbTgocHJpdiwgYXRtZWxfaGkocHJpdiwgSUZBQ0VfSU5UX1NUQVRVU19PRkZTRVQpKTsKKwkJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfaGkocHJpdiwgSUZBQ0VfTE9DS09VVF9NQUNfT0ZGU0VUKSwgMCk7CisJCQorCQlpZiAoIWlzcikgeworCQkJYXRtZWxfc2V0X2djcihkZXYsIEdDUl9FTklOVCk7IC8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJCQlyZXR1cm4gaSA9PSAtMSA/IElSUV9OT05FIDogSVJRX0hBTkRMRUQ7CisJCX0KKwkJCisJCWF0bWVsX3NldF9nY3IoZGV2LCBHQ1JfQUNLSU5UKTsgLyogYWNrbm93bGVkZ2UgaW50ZXJydXB0ICovCisJCQorCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGlycV9vcmRlcikvc2l6ZW9mKHU4KTsgaSsrKQorCQkJaWYgKGlzciAmIGlycV9vcmRlcltpXSkKKwkJCQlicmVhazsKKwkJCisJCWlmICghYXRtZWxfbG9ja19tYWMocHJpdikpIHsKKwkJCS8qIGZhaWxlZCB0byBjb250YWN0IGNhcmQgKi8KKwkJCXByaW50ayhLRVJOX0FMRVJUICIlczogZmFpbGVkIHRvIGNvbnRhY3QgTUFDLlxuIiwgZGV2LT5uYW1lKTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCQkKKwkJaXNyID0gYXRtZWxfcm1lbTgocHJpdiwgYXRtZWxfaGkocHJpdiwgSUZBQ0VfSU5UX1NUQVRVU19PRkZTRVQpKTsKKwkJaXNyIF49IGlycV9vcmRlcltpXTsKKwkJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfaGkocHJpdiwgSUZBQ0VfSU5UX1NUQVRVU19PRkZTRVQpLCBpc3IpOworCQlhdG1lbF93bWVtOChwcml2LCBhdG1lbF9oaShwcml2LCBJRkFDRV9MT0NLT1VUX01BQ19PRkZTRVQpLCAwKTsKKwkJCisJCXN3aXRjaCAoaXJxX29yZGVyW2ldKSB7CisJCQkKKwkJY2FzZSBJU1JfT1VUX09GX1JBTkdFOiAKKwkJCWlmIChwcml2LT5vcGVyYXRpbmdfbW9kZSA9PSBJV19NT0RFX0lORlJBICYmIAorCQkJICAgIHByaXYtPnN0YXRpb25fc3RhdGUgPT0gU1RBVElPTl9TVEFURV9SRUFEWSkgeworCQkJCXByaXYtPnN0YXRpb25faXNfYXNzb2NpYXRlZCA9IDA7CisJCQkJYXRtZWxfc2Nhbihwcml2LCAxKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgSVNSX1J4RlJBTUVMT1NUOgorCQkJcHJpdi0+d3N0YXRzLmRpc2NhcmQubWlzYysrOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgSVNSX1J4Q09NUExFVEU6CisJCQlyeF9kb25lX2lycShwcml2KTsgCisJCQlicmVhazsKKwkJCQorCQljYXNlIElTUl9UeENPTVBMRVRFOgorCQkJdHhfZG9uZV9pcnEocHJpdik7IAorCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBJU1JfRkFUQUxfRVJST1I6CisJCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6ICoqKiBGQVRBTCBlcnJvciBpbnRlcnJ1cHQgKioqXG4iLCBkZXYtPm5hbWUpOworCQkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9NR01UX0VSUk9SKTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgSVNSX0NPTU1BTkRfQ09NUExFVEU6IAorCQkJYXRtZWxfY29tbWFuZF9pcnEocHJpdik7CisJCQlicmVhazsKKworCQljYXNlIElTUl9JQlNTX01FUkdFOgorCQkJYXRtZWxfZ2V0X21pYihwcml2LCBNYWNfTWdtdF9NaWJfVHlwZSwgTUFDX01HTVRfTUlCX0NVUl9CU1NJRF9QT1MsIAorCQkJCSAgICAgIHByaXYtPkN1cnJlbnRCU1NJRCwgNik7CisJCQkvKiBUaGUgV1BBIHN0dWZmIGNhcmVzIGFib3V0IHRoZSBjdXJyZW50IEFQIGFkZHJlc3MgKi8KKwkJCWlmIChwcml2LT51c2Vfd3BhKQorCQkJCWJ1aWxkX3dwYV9taWIocHJpdik7CisJCQlicmVhazsKKwkJY2FzZSBJU1JfR0VORVJJQ19JUlE6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogR2VuZXJpY19pcnEgcmVjZWl2ZWQuXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKwl9CQorfQorCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYXRtZWxfZ2V0X3N0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gJnByaXYtPnN0YXRzOworfQorCitzdGF0aWMgc3RydWN0IGl3X3N0YXRpc3RpY3MgKmF0bWVsX2dldF93aXJlbGVzc19zdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiB1cGRhdGUgdGhlIGxpbmsgcXVhbGl0eSBoZXJlIGluIGNhc2Ugd2UgYXJlIHNlZWluZyBubyBiZWFjb25zIAorCSAgIGF0IGFsbCB0byBkcml2ZSB0aGUgcHJvY2VzcyAqLworCWF0bWVsX3Ntb290aF9xdWFsKHByaXYpOworCQorCXByaXYtPndzdGF0cy5zdGF0dXMgPSBwcml2LT5zdGF0aW9uX3N0YXRlOworCisJaWYgKHByaXYtPm9wZXJhdGluZ19tb2RlID09IElXX01PREVfSU5GUkEpIHsKKwkJaWYgKHByaXYtPnN0YXRpb25fc3RhdGUgIT0gU1RBVElPTl9TVEFURV9SRUFEWSkgeworCQkJcHJpdi0+d3N0YXRzLnF1YWwucXVhbCA9IDA7CisJCQlwcml2LT53c3RhdHMucXVhbC5sZXZlbCA9IDA7CisJCQlwcml2LT53c3RhdHMucXVhbC51cGRhdGVkID0gKElXX1FVQUxfUVVBTF9JTlZBTElECisJCQkJCXwgSVdfUVVBTF9MRVZFTF9JTlZBTElEKTsKKwkJfQorCQlwcml2LT53c3RhdHMucXVhbC5ub2lzZSA9IDA7CisJCXByaXYtPndzdGF0cy5xdWFsLnVwZGF0ZWQgfD0gSVdfUVVBTF9OT0lTRV9JTlZBTElEOworCX0gZWxzZSB7CisJCS8qIFF1YWxpdHkgbGV2ZWxzIGNhbm5vdCBiZSBkZXRlcm1pbmVkIGluIGFkLWhvYyBtb2RlLAorCQkgICBiZWNhdXNlIHdlIGNhbiAnaGVhcicgbW9yZSB0aGF0IG9uZSByZW1vdGUgc3RhdGlvbi4gKi8KKwkJcHJpdi0+d3N0YXRzLnF1YWwucXVhbCA9IDA7CisJCXByaXYtPndzdGF0cy5xdWFsLmxldmVsCT0gMDsKKwkJcHJpdi0+d3N0YXRzLnF1YWwubm9pc2UJPSAwOworCQlwcml2LT53c3RhdHMucXVhbC51cGRhdGVkID0gSVdfUVVBTF9RVUFMX0lOVkFMSUQKKwkJCQkJfCBJV19RVUFMX0xFVkVMX0lOVkFMSUQKKwkJCQkJfCBJV19RVUFMX05PSVNFX0lOVkFMSUQ7CisJCXByaXYtPndzdGF0cy5taXNzLmJlYWNvbiA9IDA7CisJfQorCQorCXJldHVybiAoJnByaXYtPndzdGF0cyk7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKyAgICAgICAgaWYgKChuZXdfbXR1IDwgNjgpIHx8IChuZXdfbXR1ID4gMjMxMikpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIGRldi0+bXR1ID0gbmV3X210dTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCit7CisJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKKyAgICAgICAgCisgICAgICAgIG1lbWNweSAoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisJcmV0dXJuIGF0bWVsX29wZW4oZGV2KTsKK30KKworRVhQT1JUX1NZTUJPTChhdG1lbF9vcGVuKTsKKworaW50IGF0bWVsX29wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpLCBjaGFubmVsOworCisJLyogYW55IHNjaGVkdWxlZCB0aW1lciBpcyBubyBsb25nZXIgbmVlZGVkIGFuZCBtaWdodCBzY3JldyB0aGluZ3MgdXAuLiAqLworCWRlbF90aW1lcl9zeW5jKCZwcml2LT5tYW5hZ2VtZW50X3RpbWVyKTsKKwkKKwkvKiBJbnRlcnJ1cHRzIHdpbGwgbm90IHRvdWNoIHRoZSBjYXJkIG9uY2UgaW4gdGhpcyBzdGF0ZS4uLiAqLworCXByaXYtPnN0YXRpb25fc3RhdGUgPSBTVEFUSU9OX1NUQVRFX0RPV047CisKKwlpZiAocHJpdi0+bmV3X1NTSURfc2l6ZSkgeworCQltZW1jcHkocHJpdi0+U1NJRCwgcHJpdi0+bmV3X1NTSUQsIHByaXYtPm5ld19TU0lEX3NpemUpOworCQlwcml2LT5TU0lEX3NpemUgPSBwcml2LT5uZXdfU1NJRF9zaXplOworCQlwcml2LT5uZXdfU1NJRF9zaXplID0gMDsKKwl9CisJcHJpdi0+QlNTX2xpc3RfZW50cmllcyA9IDA7CisKKwlwcml2LT5BdXRoZW50aWNhdGlvblJlcXVlc3RSZXRyeUNudCA9IDA7CisJcHJpdi0+QXNzb2NpYXRpb25SZXF1ZXN0UmV0cnlDbnQgPSAwOworCXByaXYtPlJlQXNzb2NpYXRpb25SZXF1ZXN0UmV0cnlDbnQgPSAwOworCXByaXYtPkN1cnJlbnRBdXRoZW50VHJhbnNhY3Rpb25TZXFOdW0gPSAweDAwMDE7CisJcHJpdi0+RXhwZWN0ZWRBdXRoZW50VHJhbnNhY3Rpb25TZXFOdW0gPSAweDAwMDI7CisKKwlwcml2LT5zaXRlX3N1cnZleV9zdGF0ZSA9IFNJVEVfU1VSVkVZX0lETEU7CisJcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkID0gMDsKKworCWlmICghcmVzZXRfYXRtZWxfY2FyZChkZXYpKSAKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlpZiAocHJpdi0+Y29uZmlnX3JlZ19kb21haW4pIHsKKwkJcHJpdi0+cmVnX2RvbWFpbiA9IHByaXYtPmNvbmZpZ19yZWdfZG9tYWluOworCQlhdG1lbF9zZXRfbWliOChwcml2LCBQaHlfTWliX1R5cGUsIFBIWV9NSUJfUkVHX0RPTUFJTl9QT1MsIHByaXYtPnJlZ19kb21haW4pOworCX0gZWxzZSB7CisJCXByaXYtPnJlZ19kb21haW4gPSBhdG1lbF9nZXRfbWliOChwcml2LCBQaHlfTWliX1R5cGUsIFBIWV9NSUJfUkVHX0RPTUFJTl9QT1MpOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGNoYW5uZWxfdGFibGUpL3NpemVvZihjaGFubmVsX3RhYmxlWzBdKTsgaSsrKQorCQkJaWYgKHByaXYtPnJlZ19kb21haW4gPT0gY2hhbm5lbF90YWJsZVtpXS5yZWdfZG9tYWluKQorCQkJCWJyZWFrOworCQlpZiAoaSA9PSBzaXplb2YoY2hhbm5lbF90YWJsZSkvc2l6ZW9mKGNoYW5uZWxfdGFibGVbMF0pKSB7CisJCQlwcml2LT5yZWdfZG9tYWluID0gUkVHX0RPTUFJTl9NS0sxOworCQkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBmYWlsZWQgdG8gZ2V0IHJlZ3VsYXRvcnkgZG9tYWluOiBhc3N1bWluZyBNS0sxLlxuIiwgZGV2LT5uYW1lKTsKKwkJfSAKKwl9CisJCisJaWYgKChjaGFubmVsID0gYXRtZWxfdmFsaWRhdGVfY2hhbm5lbChwcml2LCBwcml2LT5jaGFubmVsKSkpCisJCXByaXYtPmNoYW5uZWwgPSBjaGFubmVsOworCisJLyogdGhpcyBtb3ZlcyBzdGF0aW9uX3N0YXRlIG9uLi4uLiAqLyAKKwlhdG1lbF9zY2FuKHByaXYsIDEpOwkKKworCWF0bWVsX3NldF9nY3IocHJpdi0+ZGV2LCBHQ1JfRU5JTlQpOyAvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX2Nsb3NlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJCisJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9ET1dOKTsKKwkKKwlpZiAocHJpdi0+YnVzX3R5cGUgPT0gQlVTX1RZUEVfUENDQVJEKSAKKwkJYXRtZWxfd3JpdGUxNihkZXYsIEdDUiwgMHgwMDYwKTsKKwlhdG1lbF93cml0ZTE2KGRldiwgR0NSLCAweDAwNDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX3ZhbGlkYXRlX2NoYW5uZWwoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIGludCBjaGFubmVsKQoreworCS8qIGNoZWNrIHRoYXQgY2hhbm5lbCBpcyBPSywgaWYgc28gcmV0dXJuIHplcm8sCisJICAgZWxzZSByZXR1cm4gc3VpdGFibGUgZGVmYXVsdCBjaGFubmVsICovCisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGNoYW5uZWxfdGFibGUpL3NpemVvZihjaGFubmVsX3RhYmxlWzBdKTsgaSsrKQorCQlpZiAocHJpdi0+cmVnX2RvbWFpbiA9PSBjaGFubmVsX3RhYmxlW2ldLnJlZ19kb21haW4pIHsKKwkJCWlmIChjaGFubmVsID49IGNoYW5uZWxfdGFibGVbaV0ubWluICYmCisJCQkgICAgY2hhbm5lbCA8PSBjaGFubmVsX3RhYmxlW2ldLm1heCkKKwkJCQlyZXR1cm4gMDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gY2hhbm5lbF90YWJsZVtpXS5taW47CisJCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9wcm9jX291dHB1dCAoY2hhciAqYnVmLCBzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdikKK3sKKwlpbnQgaTsKKwljaGFyICpwID0gYnVmOworCWNoYXIgKnMsICpyLCAqYzsKKwkKKwlwICs9IHNwcmludGYocCwgIkRyaXZlciB2ZXJzaW9uOlx0XHQlZC4lZFxuIiwgRFJJVkVSX01BSk9SLCBEUklWRVJfTUlOT1IpOworCQorCWlmIChwcml2LT5zdGF0aW9uX3N0YXRlICE9IFNUQVRJT05fU1RBVEVfRE9XTikgeworCQlwICs9IHNwcmludGYocCwgIkZpcm13YXJlIHZlcnNpb246XHQlZC4lZCBidWlsZCAlZFxuRmlybXdhcmUgbG9jYXRpb246XHQiLCAKKwkJCSAgICAgcHJpdi0+aG9zdF9pbmZvLm1ham9yX3ZlcnNpb24sCisJCQkgICAgIHByaXYtPmhvc3RfaW5mby5taW5vcl92ZXJzaW9uLAorCQkJICAgICBwcml2LT5ob3N0X2luZm8uYnVpbGRfdmVyc2lvbik7CisJCQorCQlpZiAocHJpdi0+Y2FyZF90eXBlICE9IENBUkRfVFlQRV9FRVBST00pIAorCQkJcCArPSBzcHJpbnRmKHAsICJvbiBjYXJkXG4iKTsKKwkJZWxzZSBpZiAocHJpdi0+ZmlybXdhcmUpIAorCQkJcCArPSBzcHJpbnRmKHAsICIlcyBsb2FkZWQgYnkgaG9zdFxuIiwgcHJpdi0+ZmlybXdhcmVfaWQpOworCQllbHNlCisJCQlwICs9IHNwcmludGYocCwgIiVzIGxvYWRlZCBieSBob3RwbHVnXG4iLCBwcml2LT5maXJtd2FyZV9pZCk7CisJCQorCQlzd2l0Y2gocHJpdi0+Y2FyZF90eXBlKSB7CisJCWNhc2UgQ0FSRF9UWVBFX1BBUkFMTEVMX0ZMQVNIOiBjID0gIlBhcmFsbGVsIGZsYXNoIjsgYnJlYWs7CisJCWNhc2UgQ0FSRF9UWVBFX1NQSV9GTEFTSDogYyA9ICJTUEkgZmxhc2hcbiI7IGJyZWFrOworCQljYXNlIENBUkRfVFlQRV9FRVBST006IGMgPSAiRUVQUk9NIjsgYnJlYWs7CisJCWRlZmF1bHQ6IGMgPSAiPHVua25vd24+IjsKKwkJfQorCisJCQorCQlyID0gIjx1bmtub3duPiI7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoY2hhbm5lbF90YWJsZSkvc2l6ZW9mKGNoYW5uZWxfdGFibGVbMF0pOyBpKyspCisJCQlpZiAocHJpdi0+cmVnX2RvbWFpbiA9PSBjaGFubmVsX3RhYmxlW2ldLnJlZ19kb21haW4pCisJCQkJciA9IGNoYW5uZWxfdGFibGVbaV0ubmFtZTsKKwkJCisJCXAgKz0gc3ByaW50ZihwLCAiTUFDIG1lbW9yeSB0eXBlOlx0JXNcbiIsIGMpOworCQlwICs9IHNwcmludGYocCwgIlJlZ3VsYXRvcnkgZG9tYWluOlx0JXNcbiIsIHIpOworCQlwICs9IHNwcmludGYocCwgIkhvc3QgQ1JDIGNoZWNraW5nOlx0JXNcbiIsIAorCQkJICAgICBwcml2LT5kb19yeF9jcmMgPyAiT24iIDogIk9mZiIpOworCQlwICs9IHNwcmludGYocCwgIldQQS1jYXBhYmxlIGZpcm13YXJlOlx0JXNcbiIsCisJCQkgICAgIHByaXYtPnVzZV93cGEgPyAiWWVzIiA6ICJObyIpOworCX0KKwkKKwlzd2l0Y2gocHJpdi0+c3RhdGlvbl9zdGF0ZSkgeworCWNhc2UgU1RBVElPTl9TVEFURV9TQ0FOTklORzogcyA9ICJTY2FubmluZyI7IGJyZWFrOworCWNhc2UgU1RBVElPTl9TVEFURV9KT0lOTklORzogcyA9ICJKb2luaW5nIjsgYnJlYWs7CisJY2FzZSBTVEFUSU9OX1NUQVRFX0FVVEhFTlRJQ0FUSU5HOiBzID0gIkF1dGhlbnRpY2F0aW5nIjsgYnJlYWs7CisJY2FzZSBTVEFUSU9OX1NUQVRFX0FTU09DSUFUSU5HOiBzID0gIkFzc29jaWF0aW5nIjsgYnJlYWs7CisJY2FzZSBTVEFUSU9OX1NUQVRFX1JFQURZOiBzID0gIlJlYWR5IjsgYnJlYWs7CisJY2FzZSBTVEFUSU9OX1NUQVRFX1JFQVNTT0NJQVRJTkc6IHMgPSAiUmVhc3NvY2lhdGluZyI7IGJyZWFrOworCWNhc2UgU1RBVElPTl9TVEFURV9NR01UX0VSUk9SOiBzID0gIk1hbmFnZW1lbnQgZXJyb3IiOyBicmVhazsKKwljYXNlIFNUQVRJT05fU1RBVEVfRE9XTjogcyA9ICJEb3duIjsgYnJlYWs7CisJZGVmYXVsdDogcyA9ICI8dW5rbm93bj4iOworCX0KKyAgICAgIAorCXAgKz0gc3ByaW50ZihwLCAiQ3VycmVudCBzdGF0ZTpcdFx0JXNcbiIsIHMpOworCXJldHVybiAgcCAtIGJ1ZjsKK30KKworc3RhdGljIGludCBhdG1lbF9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworICAgICAgICBzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IGRhdGE7CisJaW50IGxlbiA9IGF0bWVsX3Byb2Nfb3V0cHV0IChwYWdlLCBwcml2KTsKKyAgICAgICAgaWYgKGxlbiA8PSBvZmYrY291bnQpICplb2YgPSAxOworICAgICAgICAqc3RhcnQgPSBwYWdlICsgb2ZmOworICAgICAgICBsZW4gLT0gb2ZmOworICAgICAgICBpZiAobGVuPmNvdW50KSBsZW4gPSBjb3VudDsKKyAgICAgICAgaWYgKGxlbjwwKSBsZW4gPSAwOworICAgICAgICByZXR1cm4gbGVuOworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqaW5pdF9hdG1lbF9jYXJkKCB1bnNpZ25lZCBzaG9ydCBpcnEsIGludCBwb3J0LCBjb25zdCBBdG1lbEZXVHlwZSBmd190eXBlLCAgCisJCQkJICAgIHN0cnVjdCBkZXZpY2UgKnN5c19kZXYsIGludCAoKmNhcmRfcHJlc2VudCkodm9pZCAqKSwgdm9pZCAqY2FyZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2OworCWludCByYzsKKworCS8qIENyZWF0ZSB0aGUgbmV0d29yayBkZXZpY2Ugb2JqZWN0LiAqLworICAgICAgICBkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKnByaXYpKTsKKyAgICAgICAgaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhdG1lbDogIENvdWxkbid0IGFsbG9jX2V0aGVyZGV2XG4iKTsKKwkJcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKwlpZiAoZGV2X2FsbG9jX25hbWUoZGV2LCBkZXYtPm5hbWUpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImF0bWVsOiAgQ291bGRuJ3QgZ2V0IG5hbWUhXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisJfQorCisJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcHJpdi0+ZGV2ID0gZGV2OworCXByaXYtPnN5c19kZXYgPSBzeXNfZGV2OworCXByaXYtPnByZXNlbnRfY2FsbGJhY2sgPSBjYXJkX3ByZXNlbnQ7CisJcHJpdi0+Y2FyZCA9IGNhcmQ7CisJcHJpdi0+ZmlybXdhcmUgPSBOVUxMOworCXByaXYtPmZpcm13YXJlX2lkWzBdID0gJ1wwJzsKKwlwcml2LT5maXJtd2FyZV90eXBlID0gZndfdHlwZTsKKwlpZiAoZmlybXdhcmUpIC8qIG1vZHVsZSBwYXJhbWV0ZXIgKi8KKwkJc3RyY3B5KHByaXYtPmZpcm13YXJlX2lkLCBmaXJtd2FyZSk7CisJcHJpdi0+YnVzX3R5cGUgPSBjYXJkX3ByZXNlbnQgPyBCVVNfVFlQRV9QQ0NBUkQgOiBCVVNfVFlQRV9QQ0k7CisJcHJpdi0+c3RhdGlvbl9zdGF0ZSA9IFNUQVRJT05fU1RBVEVfRE9XTjsKKwlwcml2LT5kb19yeF9jcmMgPSAwOworCS8qIEZvciBQQ01DSUEgY2FyZHMsIHNvbWUgY2hpcHMgbmVlZCBDUkMsIHNvbWUgZG9uJ3QKKwkgICBzbyB3ZSBoYXZlIHRvIHByb2JlLiAqLworCWlmIChwcml2LT5idXNfdHlwZSA9PSBCVVNfVFlQRV9QQ0NBUkQpIHsKKwkJcHJpdi0+cHJvYmVfY3JjID0gMTsKKwkJcHJpdi0+Y3JjX29rX2NudCA9IHByaXYtPmNyY19rb19jbnQgPSAwOworCX0gZWxzZQorCQlwcml2LT5wcm9iZV9jcmMgPSAwOworCW1lbXNldCgmcHJpdi0+c3RhdHMsIDAsIHNpemVvZihwcml2LT5zdGF0cykpOworCW1lbXNldCgmcHJpdi0+d3N0YXRzLCAwLCBzaXplb2YocHJpdi0+d3N0YXRzKSk7CisJcHJpdi0+bGFzdF9xdWFsID0gamlmZmllczsKKwlwcml2LT5sYXN0X2JlYWNvbl90aW1lc3RhbXAgPSAwOworCW1lbXNldChwcml2LT5mcmFnX3NvdXJjZSwgMHhmZiwgc2l6ZW9mKHByaXYtPmZyYWdfc291cmNlKSk7CisJbWVtc2V0KHByaXYtPkJTU0lELCAwLCA2KTsKKwlwcml2LT5DdXJyZW50QlNTSURbMF0gPSAweEZGOyAvKiBJbml0aWFsaXplIHRvIHNvbWV0aGluZyBpbnZhbGlkLi4uLiAqLworCXByaXYtPnN0YXRpb25fd2FzX2Fzc29jaWF0ZWQgPSAwOworCQorCXByaXYtPmxhc3Rfc3VydmV5ID0gamlmZmllczsKKwlwcml2LT5wcmVhbWJsZSA9IExPTkdfUFJFQU1CTEU7CisJcHJpdi0+b3BlcmF0aW5nX21vZGUgPSBJV19NT0RFX0lORlJBOworCXByaXYtPmNvbm5lY3RfdG9fYW55X0JTUyA9IDA7CisJcHJpdi0+Y29uZmlnX3JlZ19kb21haW4gPSAwOworCXByaXYtPnJlZ19kb21haW4gPSAwOworCXByaXYtPnR4X3JhdGUgPSAzOworCXByaXYtPmF1dG9fdHhfcmF0ZSA9IDE7CisJcHJpdi0+Y2hhbm5lbCA9IDQ7CisJcHJpdi0+cG93ZXJfbW9kZSA9IDA7CisJcHJpdi0+U1NJRFswXSA9ICdcMCc7CisJcHJpdi0+U1NJRF9zaXplID0gMDsKKwlwcml2LT5uZXdfU1NJRF9zaXplID0gMDsKKwlwcml2LT5mcmFnX3RocmVzaG9sZCA9IDIzNDY7CisJcHJpdi0+cnRzX3RocmVzaG9sZCA9IDIzNDc7CisJcHJpdi0+c2hvcnRfcmV0cnkgPSA3OworCXByaXYtPmxvbmdfcmV0cnkgPSA0OworCisJcHJpdi0+d2VwX2lzX29uID0gMDsKKwlwcml2LT5kZWZhdWx0X2tleSA9IDA7CisJcHJpdi0+ZW5jcnlwdGlvbl9sZXZlbCA9IDA7CisJcHJpdi0+ZXhjbHVkZV91bmVuY3J5cHRlZCA9IDA7CisJcHJpdi0+Z3JvdXBfY2lwaGVyX3N1aXRlID0gcHJpdi0+cGFpcndpc2VfY2lwaGVyX3N1aXRlID0gQ0lQSEVSX1NVSVRFX05PTkU7CisJcHJpdi0+dXNlX3dwYSA9IDA7CisJbWVtc2V0KHByaXYtPndlcF9rZXlzLCAwLCBzaXplb2YocHJpdi0+d2VwX2tleXMpKTsKKwltZW1zZXQocHJpdi0+d2VwX2tleV9sZW4sIDAsIHNpemVvZihwcml2LT53ZXBfa2V5X2xlbikpOworCisJcHJpdi0+ZGVmYXVsdF9iZWFjb25fcGVyaW9kID0gcHJpdi0+YmVhY29uX3BlcmlvZCA9IDEwMDsKKwlwcml2LT5saXN0ZW5faW50ZXJ2YWwgPSAxOworCisJaW5pdF90aW1lcigmcHJpdi0+bWFuYWdlbWVudF90aW1lcik7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmlycWxvY2spOworCXNwaW5fbG9ja19pbml0KCZwcml2LT50aW1lcmxvY2spOworCXByaXYtPm1hbmFnZW1lbnRfdGltZXIuZnVuY3Rpb24gPSBhdG1lbF9tYW5hZ2VtZW50X3RpbWVyOworCXByaXYtPm1hbmFnZW1lbnRfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisJCisJZGV2LT5vcGVuID0gYXRtZWxfb3BlbjsKKwlkZXYtPnN0b3AgPSBhdG1lbF9jbG9zZTsKKwlkZXYtPmNoYW5nZV9tdHUgPSBhdG1lbF9jaGFuZ2VfbXR1OworCWRldi0+c2V0X21hY19hZGRyZXNzID0gYXRtZWxfc2V0X21hY19hZGRyZXNzOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gc3RhcnRfdHg7CisJZGV2LT5nZXRfc3RhdHMgPSBhdG1lbF9nZXRfc3RhdHM7CisJZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBhdG1lbF9nZXRfd2lyZWxlc3Nfc3RhdHM7CisJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikmYXRtZWxfaGFuZGxlcl9kZWY7CisJZGV2LT5kb19pb2N0bCA9IGF0bWVsX2lvY3RsOworCWRldi0+aXJxID0gaXJxOworCWRldi0+YmFzZV9hZGRyID0gcG9ydDsKKwkKKwlTRVRfTkVUREVWX0RFVihkZXYsIHN5c19kZXYpOworCQorCWlmICgocmMgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgc2VydmljZV9pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldikpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlZ2lzdGVyIGludGVycnVwdCAlZCBmYWlsZWQsIHJjICVkXG4iLCBkZXYtPm5hbWUsIGlycSwgcmMgKTsKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisJfQorCisJaWYgKHByaXYtPmJ1c190eXBlID09IEJVU19UWVBFX1BDSSAmJgorCSAgICAhcmVxdWVzdF9yZWdpb24oIGRldi0+YmFzZV9hZGRyLCA2NCwgZGV2LT5uYW1lICkpIHsKKwkJZ290byBlcnJfb3V0X2lycTsKKwl9CisJCisJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKQorCQlnb3RvIGVycl9vdXRfcmVzOworCQorCWlmICghcHJvYmVfYXRtZWxfY2FyZChkZXYpKXsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJZ290byBlcnJfb3V0X3JlczsKKwl9CisJCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkKKwljcmVhdGVfcHJvY19yZWFkX2VudHJ5ICgiZHJpdmVyL2F0bWVsIiwgMCwgTlVMTCwgYXRtZWxfcmVhZF9wcm9jLCBwcml2KTsJCisJCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEF0bWVsIGF0NzZjNTB4IHdpcmVsZXNzLiBWZXJzaW9uICVkLiVkIHNpbW9uQHRoZWtlbGxleXMub3JnLnVrXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIERSSVZFUl9NQUpPUiwgRFJJVkVSX01JTk9SKTsKKwkKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJcmV0dXJuIGRldjsKKwkKKyBlcnJfb3V0X3JlczoKKwlpZiAocHJpdi0+YnVzX3R5cGUgPT0gQlVTX1RZUEVfUENJKQorCSAgICAgICAgcmVsZWFzZV9yZWdpb24oIGRldi0+YmFzZV9hZGRyLCA2NCApOworIGVycl9vdXRfaXJxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworIGVycl9vdXRfZnJlZToKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBOVUxMOworfQorCitFWFBPUlRfU1lNQk9MKGluaXRfYXRtZWxfY2FyZCk7CisKK3ZvaWQgc3RvcF9hdG1lbF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBmcmVlcmVzKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJCisJLyogcHV0IGEgYnJpY2sgb24gaXQuLi4gKi8KKwlpZiAocHJpdi0+YnVzX3R5cGUgPT0gQlVTX1RZUEVfUENDQVJEKSAKKwkJYXRtZWxfd3JpdGUxNihkZXYsIEdDUiwgMHgwMDYwKTsKKwlhdG1lbF93cml0ZTE2KGRldiwgR0NSLCAweDAwNDApOworCQorCWRlbF90aW1lcl9zeW5jKCZwcml2LT5tYW5hZ2VtZW50X3RpbWVyKTsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJkcml2ZXIvYXRtZWwiLCBOVUxMKTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlpZiAocHJpdi0+ZmlybXdhcmUpCisJCWtmcmVlKHByaXYtPmZpcm13YXJlKTsKKwlpZiAoZnJlZXJlcykgeworCQkvKiBQQ01DSUEgZnJlZXMgdGhpcyBzdHVmZiwgc28gb25seSBmb3IgUENJICovCisJICAgICAgICByZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgNjQpOworICAgICAgICB9CisJZnJlZV9uZXRkZXYoZGV2KTsKK30KKworRVhQT1JUX1NZTUJPTChzdG9wX2F0bWVsX2NhcmQpOworCitzdGF0aWMgaW50IGF0bWVsX3NldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIENoZWNrIGlmIHdlIGFza2VkIGZvciBgYW55JyAqLworCWlmKGR3cnEtPmZsYWdzID09IDApIHsKKwkJcHJpdi0+Y29ubmVjdF90b19hbnlfQlNTID0gMTsKKwl9IGVsc2UgeworCQlpbnQgaW5kZXggPSAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKworCQlwcml2LT5jb25uZWN0X3RvX2FueV9CU1MgPSAwOworCQkKKwkJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIHN0cmluZyAqLworCQlpZiAoZHdycS0+bGVuZ3RoID4gTUFYX1NTSURfTEVOR1RIICsgMSkKKwkJCSByZXR1cm4gLUUyQklHIDsKKwkJaWYgKGluZGV4ICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCisJCW1lbWNweShwcml2LT5uZXdfU1NJRCwgZXh0cmEsIGR3cnEtPmxlbmd0aCAtIDEpOworCQlwcml2LT5uZXdfU1NJRF9zaXplID0gZHdycS0+bGVuZ3RoIC0gMTsKKwl9CisKKwlyZXR1cm4gLUVJTlBST0dSRVNTOworfQorCitzdGF0aWMgaW50IGF0bWVsX2dldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIEdldCB0aGUgY3VycmVudCBTU0lEICovCisJaWYgKHByaXYtPm5ld19TU0lEX3NpemUgIT0gMCkgeworCQltZW1jcHkoZXh0cmEsIHByaXYtPm5ld19TU0lELCBwcml2LT5uZXdfU1NJRF9zaXplKTsKKwkJZXh0cmFbcHJpdi0+bmV3X1NTSURfc2l6ZV0gPSAnXDAnOworCQlkd3JxLT5sZW5ndGggPSBwcml2LT5uZXdfU1NJRF9zaXplICsgMTsKKwl9IGVsc2UgeworCQltZW1jcHkoZXh0cmEsIHByaXYtPlNTSUQsIHByaXYtPlNTSURfc2l6ZSk7CisJCWV4dHJhW3ByaXYtPlNTSURfc2l6ZV0gPSAnXDAnOworCQlkd3JxLT5sZW5ndGggPSBwcml2LT5TU0lEX3NpemUgKyAxOworCX0KKwkKKwlkd3JxLT5mbGFncyA9ICFwcml2LT5jb25uZWN0X3RvX2FueV9CU1M7IC8qIGFjdGl2ZSAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfZ2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IHNvY2thZGRyICphd3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwltZW1jcHkoYXdycS0+c2FfZGF0YSwgcHJpdi0+Q3VycmVudEJTU0lELCA2KTsKKwlhd3JxLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9zZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogQmFzaWMgY2hlY2tpbmc6IGRvIHdlIGhhdmUgYSBrZXkgdG8gc2V0ID8KKwkgKiBOb3RlIDogd2l0aCB0aGUgbmV3IEFQSSwgaXQncyBpbXBvc3NpYmxlIHRvIGdldCBhIE5VTEwgcG9pbnRlci4KKwkgKiBUaGVyZWZvcmUsIHdlIG5lZWQgdG8gY2hlY2sgYSBrZXkgc2l6ZSA9PSAwIGluc3RlYWQuCisJICogTmV3IHZlcnNpb24gb2YgaXdjb25maWcgcHJvcGVybHkgc2V0IHRoZSBJV19FTkNPREVfTk9LRVkgZmxhZworCSAqIHdoZW4gbm8ga2V5IGlzIHByZXNlbnQgKG9ubHkgY2hhbmdlIGZsYWdzKSwgYnV0IG9sZGVyIHZlcnNpb25zCisJICogZG9uJ3QgZG8gaXQuIC0gSmVhbiBJSSAqLworCWlmIChkd3JxLT5sZW5ndGggPiAwKSB7CisJCWludCBpbmRleCA9IChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCQlpbnQgY3VycmVudF9pbmRleCA9IHByaXYtPmRlZmF1bHRfa2V5OworCQkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUga2V5ICovCisJCWlmIChkd3JxLT5sZW5ndGggPiAxMykgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyogQ2hlY2sgdGhlIGluZGV4IChub25lIC0+IHVzZSBjdXJyZW50KSAqLworCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IDQpCisJCQlpbmRleCA9IGN1cnJlbnRfaW5kZXg7CisJCWVsc2UKKwkJCXByaXYtPmRlZmF1bHRfa2V5ID0gaW5kZXg7CisJCS8qIFNldCB0aGUgbGVuZ3RoICovCisJCWlmIChkd3JxLT5sZW5ndGggPiA1KQorCQkJcHJpdi0+d2VwX2tleV9sZW5baW5kZXhdID0gMTM7CisJCWVsc2UKKwkJCWlmIChkd3JxLT5sZW5ndGggPiAwKQorCQkJCXByaXYtPndlcF9rZXlfbGVuW2luZGV4XSA9IDU7CisJCQllbHNlCisJCQkJLyogRGlzYWJsZSB0aGUga2V5ICovCisJCQkJcHJpdi0+d2VwX2tleV9sZW5baW5kZXhdID0gMDsKKwkJLyogQ2hlY2sgaWYgdGhlIGtleSBpcyBub3QgbWFya2VkIGFzIGludmFsaWQgKi8KKwkJaWYoIShkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkpIHsKKwkJCS8qIENsZWFudXAgKi8KKwkJCW1lbXNldChwcml2LT53ZXBfa2V5c1tpbmRleF0sIDAsIDEzKTsKKwkJCS8qIENvcHkgdGhlIGtleSBpbiB0aGUgZHJpdmVyICovCisJCQltZW1jcHkocHJpdi0+d2VwX2tleXNbaW5kZXhdLCBleHRyYSwgZHdycS0+bGVuZ3RoKTsKKwkJfQorCQkvKiBXRSBzcGVjaWZ5IHRoYXQgaWYgYSB2YWxpZCBrZXkgaXMgc2V0LCBlbmNyeXB0aW9uCisJCSAqIHNob3VsZCBiZSBlbmFibGVkICh1c2VyIG1heSB0dXJuIGl0IG9mZiBsYXRlcikKKwkJICogVGhpcyBpcyBhbHNvIGhvdyAiaXdjb25maWcgZXRoWCBrZXkgb24iIHdvcmtzICovCisJCWlmIChpbmRleCA9PSBjdXJyZW50X2luZGV4ICYmIAorCQkgICAgcHJpdi0+d2VwX2tleV9sZW5baW5kZXhdID4gMCkgeworCQkJcHJpdi0+d2VwX2lzX29uID0gMTsKKwkJCXByaXYtPmV4Y2x1ZGVfdW5lbmNyeXB0ZWQgPSAxOworCQkJaWYgKHByaXYtPndlcF9rZXlfbGVuW2luZGV4XSA+IDUpIHsKKwkJCQlwcml2LT5wYWlyd2lzZV9jaXBoZXJfc3VpdGUgPSBDSVBIRVJfU1VJVEVfV0VQXzY0OworCQkJCXByaXYtPmVuY3J5cHRpb25fbGV2ZWwgPSAyOworCQkJfSBlbHNlIHsKKwkJCQlwcml2LT5wYWlyd2lzZV9jaXBoZXJfc3VpdGUgPSBDSVBIRVJfU1VJVEVfV0VQXzEyODsKKwkJCQlwcml2LT5lbmNyeXB0aW9uX2xldmVsID0gMTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8qIERvIHdlIHdhbnQgdG8ganVzdCBzZXQgdGhlIHRyYW5zbWl0IGtleSBpbmRleCA/ICovCisJCWludCBpbmRleCA9IChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCQlpZiAoIGluZGV4Pj0wICYmIGluZGV4IDwgNCApIHsKKwkJCXByaXYtPmRlZmF1bHRfa2V5ID0gaW5kZXg7CisJCX0gZWxzZQorCQkJLyogRG9uJ3QgY29tcGxhaW4gaWYgb25seSBjaGFuZ2UgdGhlIG1vZGUgKi8KKwkJCWlmKCFkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9NT0RFKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJfQorCS8qIFJlYWQgdGhlIGZsYWdzICovCisJaWYoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKKwkJcHJpdi0+d2VwX2lzX29uID0gMDsKKwkJcHJpdi0+ZW5jcnlwdGlvbl9sZXZlbCA9IDA7IAkKKwkJcHJpdi0+cGFpcndpc2VfY2lwaGVyX3N1aXRlID0gQ0lQSEVSX1NVSVRFX05PTkU7CisJfSBlbHNlIHsKKwkJcHJpdi0+d2VwX2lzX29uID0gMTsKKwkJaWYgKHByaXYtPndlcF9rZXlfbGVuW3ByaXYtPmRlZmF1bHRfa2V5XSA+IDUpIHsKKwkJCXByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZSA9IENJUEhFUl9TVUlURV9XRVBfMTI4OworCQkJcHJpdi0+ZW5jcnlwdGlvbl9sZXZlbCA9IDI7CisJCX0gZWxzZSB7CisJCQlwcml2LT5wYWlyd2lzZV9jaXBoZXJfc3VpdGUgPSBDSVBIRVJfU1VJVEVfV0VQXzY0OworCQkJcHJpdi0+ZW5jcnlwdGlvbl9sZXZlbCA9IDE7CisJCX0KKwl9CisJaWYoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCkKKwkJcHJpdi0+ZXhjbHVkZV91bmVuY3J5cHRlZCA9IDE7CisJaWYoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfT1BFTikKKwkJcHJpdi0+ZXhjbHVkZV91bmVuY3J5cHRlZCA9IDA7CisJCisJcmV0dXJuIC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KK30KKworCitzdGF0aWMgaW50IGF0bWVsX2dldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGluZGV4ID0gKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJCisJaWYgKCFwcml2LT53ZXBfaXNfb24pCisJCWR3cnEtPmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCWVsc2UgaWYgKHByaXYtPmV4Y2x1ZGVfdW5lbmNyeXB0ZWQpCisJCWR3cnEtPmZsYWdzID0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CisJZWxzZQorCQlkd3JxLT5mbGFncyA9IElXX0VOQ09ERV9PUEVOOworCQkKKwkJLyogV2hpY2gga2V5IGRvIHdlIHdhbnQgPyAtMSAtPiB0eCBpbmRleCAqLworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gNCkKKwkJaW5kZXggPSBwcml2LT5kZWZhdWx0X2tleTsKKwlkd3JxLT5mbGFncyB8PSBpbmRleCArIDE7CisJLyogQ29weSB0aGUga2V5IHRvIHRoZSB1c2VyIGJ1ZmZlciAqLworCWR3cnEtPmxlbmd0aCA9IHByaXYtPndlcF9rZXlfbGVuW2luZGV4XTsKKwlpZiAoZHdycS0+bGVuZ3RoID4gMTYpIHsKKwkJZHdycS0+bGVuZ3RoPTA7CisJfSBlbHNlIHsKKwkJbWVtc2V0KGV4dHJhLCAwLCAxNik7CisJCW1lbWNweShleHRyYSwgcHJpdi0+d2VwX2tleXNbaW5kZXhdLCBkd3JxLT5sZW5ndGgpOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBjaGFyICpjd3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJjcHkoY3dycSwgIklFRUUgODAyLjExLURTIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfc2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJCisJaWYgKHZ3cnEtPmZpeGVkID09IDApIHsKKwkJcHJpdi0+dHhfcmF0ZSA9IDM7CisJCXByaXYtPmF1dG9fdHhfcmF0ZSA9IDE7CisJfSBlbHNlIHsKKwkJcHJpdi0+YXV0b190eF9yYXRlID0gMDsKKwkJCisJCS8qIFdoaWNoIHR5cGUgb2YgdmFsdWUgPyAqLworCQlpZigodndycS0+dmFsdWUgPCA0KSAmJiAodndycS0+dmFsdWUgPj0gMCkpIHsKKwkJCS8qIFNldHRpbmcgYnkgcmF0ZSBpbmRleCAqLworCQlwcml2LT50eF9yYXRlID0gdndycS0+dmFsdWU7CisJCX0gZWxzZSB7CisJCS8qIFNldHRpbmcgYnkgZnJlcXVlbmN5IHZhbHVlICovCisJCQlzd2l0Y2ggKHZ3cnEtPnZhbHVlKSB7CisJCQljYXNlICAxMDAwMDAwOiBwcml2LT50eF9yYXRlID0gMDsgYnJlYWs7CisJCQljYXNlICAyMDAwMDAwOiBwcml2LT50eF9yYXRlID0gMTsgYnJlYWs7CisJCQljYXNlICA1NTAwMDAwOiBwcml2LT50eF9yYXRlID0gMjsgYnJlYWs7CisJCQljYXNlIDExMDAwMDAwOiBwcml2LT50eF9yYXRlID0gMzsgYnJlYWs7CisJCQlkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAtRUlOUFJPR1JFU1M7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgX191MzIgKnV3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICgqdXdycSAhPSBJV19NT0RFX0FESE9DICYmICp1d3JxICE9IElXX01PREVfSU5GUkEpCisJCXJldHVybiAtRUlOVkFMOworCisJcHJpdi0+b3BlcmF0aW5nX21vZGUgPSAqdXdycTsKKwlyZXR1cm4gLUVJTlBST0dSRVNTOyAgCit9CisKK3N0YXRpYyBpbnQgYXRtZWxfZ2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgX191MzIgKnV3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwkqdXdycSA9IHByaXYtPm9wZXJhdGluZ19tb2RlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX2dldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKHByaXYtPmF1dG9fdHhfcmF0ZSkgeworCQl2d3JxLT5maXhlZCA9IDA7CisJCXZ3cnEtPnZhbHVlID0gMTEwMDAwMDA7CisJfSBlbHNlIHsKKwkJdndycS0+Zml4ZWQgPSAxOworCQlzd2l0Y2gocHJpdi0+dHhfcmF0ZSkgeworCQljYXNlIDA6IHZ3cnEtPnZhbHVlID0gIDEwMDAwMDA7IGJyZWFrOworCQljYXNlIDE6IHZ3cnEtPnZhbHVlID0gIDIwMDAwMDA7IGJyZWFrOworCQljYXNlIDI6IHZ3cnEtPnZhbHVlID0gIDU1MDAwMDA7IGJyZWFrOworCQljYXNlIDM6IHZ3cnEtPnZhbHVlID0gMTEwMDAwMDA7IGJyZWFrOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX3NldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwcml2LT5wb3dlcl9tb2RlID0gdndycS0+ZGlzYWJsZWQgPyAwIDogMTsKKwlyZXR1cm4gLUVJTlBST0dSRVNTOworfQorCitzdGF0aWMgaW50IGF0bWVsX2dldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2d3JxLT5kaXNhYmxlZCA9IHByaXYtPnBvd2VyX21vZGUgPyAwIDogMTsKKwl2d3JxLT5mbGFncyA9IElXX1BPV0VSX09OOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX3NldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwlpZighdndycS0+ZGlzYWJsZWQgJiYgKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTElNSVQpKSB7CisJCWlmKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTUFYKQorCQkJcHJpdi0+bG9uZ19yZXRyeSA9IHZ3cnEtPnZhbHVlOworCQllbHNlIGlmICh2d3JxLT5mbGFncyAmIElXX1JFVFJZX01JTikKKwkJCXByaXYtPnNob3J0X3JldHJ5ID0gdndycS0+dmFsdWU7CisJCWVsc2UgeworCQkJLyogTm8gbW9kaWZpZXIgOiBzZXQgYm90aCAqLworCQkJcHJpdi0+bG9uZ19yZXRyeSA9IHZ3cnEtPnZhbHVlOworCQkJcHJpdi0+c2hvcnRfcmV0cnkgPSB2d3JxLT52YWx1ZTsKKwkJfQorCQlyZXR1cm4gLUVJTlBST0dSRVNTOwkJCisJfQorCSAgIAorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGF0bWVsX2dldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXZ3cnEtPmRpc2FibGVkID0gMDsgICAgICAvKiBDYW4ndCBiZSBkaXNhYmxlZCAqLworCisJLyogTm90ZSA6IGJ5IGRlZmF1bHQsIGRpc3BsYXkgdGhlIG1pbiByZXRyeSBudW1iZXIgKi8KKwlpZigodndycS0+ZmxhZ3MgJiBJV19SRVRSWV9NQVgpKSB7CisJCXZ3cnEtPmZsYWdzID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9NQVg7CisJCXZ3cnEtPnZhbHVlID0gcHJpdi0+bG9uZ19yZXRyeTsKKwl9IGVsc2UgeworCQl2d3JxLT5mbGFncyA9IElXX1JFVFJZX0xJTUlUOworCQl2d3JxLT52YWx1ZSA9IHByaXYtPnNob3J0X3JldHJ5OworCQlpZihwcml2LT5sb25nX3JldHJ5ICE9IHByaXYtPnNob3J0X3JldHJ5KQorCQkJdndycS0+ZmxhZ3MgfD0gSVdfUkVUUllfTUlOOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX3NldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJ0aHIgPSB2d3JxLT52YWx1ZTsKKworCWlmKHZ3cnEtPmRpc2FibGVkKQorCQlydGhyID0gMjM0NzsKKwlpZigocnRociA8IDApIHx8IChydGhyID4gMjM0NykpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXByaXYtPnJ0c190aHJlc2hvbGQgPSBydGhyOworCQorCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCit9CisKK3N0YXRpYyBpbnQgYXRtZWxfZ2V0X3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwl2d3JxLT52YWx1ZSA9IHByaXYtPnJ0c190aHJlc2hvbGQ7CisJdndycS0+ZGlzYWJsZWQgPSAodndycS0+dmFsdWUgPj0gMjM0Nyk7CisJdndycS0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfc2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGZ0aHIgPSB2d3JxLT52YWx1ZTsKKworCWlmKHZ3cnEtPmRpc2FibGVkKQorCQlmdGhyID0gMjM0NjsKKwlpZigoZnRociA8IDI1NikgfHwgKGZ0aHIgPiAyMzQ2KSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZnRociAmPSB+MHgxOwkvKiBHZXQgYW4gZXZlbiB2YWx1ZSAtIGlzIGl0IHJlYWxseSBuZWVkZWQgPz8/ICovCisJcHJpdi0+ZnJhZ190aHJlc2hvbGQgPSBmdGhyOworCQorCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCit9CisKK3N0YXRpYyBpbnQgYXRtZWxfZ2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwl2d3JxLT52YWx1ZSA9IHByaXYtPmZyYWdfdGhyZXNob2xkOworCXZ3cnEtPmRpc2FibGVkID0gKHZ3cnEtPnZhbHVlID49IDIzNDYpOworCXZ3cnEtPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgbG9uZyBmcmVxdWVuY3lfbGlzdFtdID0geyAyNDEyLCAyNDE3LCAyNDIyLCAyNDI3LCAyNDMyLCAyNDM3LCAyNDQyLAorCQkJCTI0NDcsIDI0NTIsIDI0NTcsIDI0NjIsIDI0NjcsIDI0NzIsIDI0ODQgfTsKKworc3RhdGljIGludCBhdG1lbF9zZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfZnJlcSAqZndycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByYyA9IC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KKwkKKwkvKiBJZiBzZXR0aW5nIGJ5IGZyZXF1ZW5jeSwgY29udmVydCB0byBhIGNoYW5uZWwgKi8KKwlpZigoZndycS0+ZSA9PSAxKSAmJgorCSAgIChmd3JxLT5tID49IChpbnQpIDI0MTIwMDAwMCkgJiYKKwkgICAoZndycS0+bSA8PSAoaW50KSAyNDg3MDAwMDApKSB7CisJCWludCBmID0gZndycS0+bSAvIDEwMDAwMDsKKwkJaW50IGMgPSAwOworCQl3aGlsZSgoYyA8IDE0KSAmJiAoZiAhPSBmcmVxdWVuY3lfbGlzdFtjXSkpCisJCQljKys7CisJCS8qIEhhY2sgdG8gZmFsbCB0aHJvdWdoLi4uICovCisJCWZ3cnEtPmUgPSAwOworCQlmd3JxLT5tID0gYyArIDE7CisJfQorCS8qIFNldHRpbmcgYnkgY2hhbm5lbCBudW1iZXIgKi8KKwlpZigoZndycS0+bSA+IDEwMDApIHx8IChmd3JxLT5lID4gMCkpCisJCXJjID0gLUVPUE5PVFNVUFA7CisJZWxzZSB7CisJCWludCBjaGFubmVsID0gZndycS0+bTsKKwkJaWYgKGF0bWVsX3ZhbGlkYXRlX2NoYW5uZWwocHJpdiwgY2hhbm5lbCkgPT0gMCkgeworCQkJcHJpdi0+Y2hhbm5lbCA9IGNoYW5uZWw7CisJCX0gZWxzZSB7CisJCQlyYyA9IC1FSU5WQUw7CisJCX0gCisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBhdG1lbF9nZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfZnJlcSAqZndycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZndycS0+bSA9IHByaXYtPmNoYW5uZWw7CisJZndycS0+ZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIE5vdGUgOiB5b3UgbWF5IGhhdmUgcmVhbGlzZWQgdGhhdCwgYXMgdGhpcyBpcyBhIFNFVCBvcGVyYXRpb24sCisJICogdGhpcyBpcyBwcml2aWxlZ2VkIGFuZCB0aGVyZWZvcmUgYSBub3JtYWwgdXNlciBjYW4ndAorCSAqIHBlcmZvcm0gc2Nhbm5pbmcuCisJICogVGhpcyBpcyBub3QgYW4gZXJyb3IsIHdoaWxlIHRoZSBkZXZpY2UgcGVyZm9ybSBzY2FubmluZywKKwkgKiB0cmFmZmljIGRvZXNuJ3QgZmxvdywgc28gaXQncyBhIHBlcmZlY3QgRG9TLi4uCisJICogSmVhbiBJSSAqLworCQorCWlmIChwcml2LT5zdGF0aW9uX3N0YXRlID09IFNUQVRJT05fU1RBVEVfRE9XTikKKwkJcmV0dXJuIC1FQUdBSU47CisKKwkvKiBUaW1lb3V0IG9sZCBzdXJ2ZXlzLiAqLworCWlmICgoamlmZmllcyAtIHByaXYtPmxhc3Rfc3VydmV5KSA+ICgyMCAqIEhaKSkKKwkJcHJpdi0+c2l0ZV9zdXJ2ZXlfc3RhdGUgPSBTSVRFX1NVUlZFWV9JRExFOworCXByaXYtPmxhc3Rfc3VydmV5ID0gamlmZmllczsKKworCS8qIEluaXRpYXRlIGEgc2NhbiBjb21tYW5kICovCisJaWYgKHByaXYtPnNpdGVfc3VydmV5X3N0YXRlID09IFNJVEVfU1VSVkVZX0lOX1BST0dSRVNTKQorCQlyZXR1cm4gLUVCVVNZOworCQkKKwlkZWxfdGltZXJfc3luYygmcHJpdi0+bWFuYWdlbWVudF90aW1lcik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycWxvY2ssIGZsYWdzKTsKKwkKKwlwcml2LT5zaXRlX3N1cnZleV9zdGF0ZSA9IFNJVEVfU1VSVkVZX0lOX1BST0dSRVNTOworCXByaXYtPmZhc3Rfc2NhbiA9IDA7CisJYXRtZWxfc2Nhbihwcml2LCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFsb2NrLCBmbGFncyk7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfZ2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisJY2hhciAqY3VycmVudF9ldiA9IGV4dHJhOworCXN0cnVjdCBpd19ldmVudAlpd2U7CisJCisJaWYgKHByaXYtPnNpdGVfc3VydmV5X3N0YXRlICE9IFNJVEVfU1VSVkVZX0NPTVBMRVRFRCkKKwkJcmV0dXJuIC1FQUdBSU47CisJCisJZm9yKGk9MDsgaTxwcml2LT5CU1NfbGlzdF9lbnRyaWVzOyBpKyspIHsgCisJCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CisJCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCBwcml2LT5CU1NpbmZvW2ldLkJTU0lELCA2KTsKKwkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwgJml3ZSwgSVdfRVZfQUREUl9MRU4pOworCisJCWl3ZS51LmRhdGEubGVuZ3RoID0gIHByaXYtPkJTU2luZm9baV0uU1NJRHNpemU7CisJCWlmIChpd2UudS5kYXRhLmxlbmd0aCA+IDMyKQorCQkJaXdlLnUuZGF0YS5sZW5ndGggPSAzMjsKKwkJaXdlLmNtZCA9IFNJT0NHSVdFU1NJRDsKKwkJaXdlLnUuZGF0YS5mbGFncyA9IDE7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChjdXJyZW50X2V2LCBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsICZpd2UsIHByaXYtPkJTU2luZm9baV0uU1NJRCk7CisJCQorCQlpd2UuY21kID0gU0lPQ0dJV01PREU7CisJCWl3ZS51Lm1vZGUgPSBwcml2LT5CU1NpbmZvW2ldLkJTU3R5cGU7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsICZpd2UsIElXX0VWX1VJTlRfTEVOKTsKKwkKKwkJaXdlLmNtZCA9IFNJT0NHSVdGUkVROworCQlpd2UudS5mcmVxLm0gPSBwcml2LT5CU1NpbmZvW2ldLmNoYW5uZWw7CisJCWl3ZS51LmZyZXEuZSA9IDA7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKKwkJCisJCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOworCQlpZiAocHJpdi0+QlNTaW5mb1tpXS5Vc2luZ1dFUCkKKwkJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKKwkJZWxzZQorCQkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSAwOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwgZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLCAmaXdlLCBOVUxMKTsKKwkJCisJfQorCisJLyogTGVuZ3RoIG9mIGRhdGEgKi8KKwlkd3JxLT5sZW5ndGggPSAoY3VycmVudF9ldiAtIGV4dHJhKTsKKwlkd3JxLT5mbGFncyA9IDA7ICAgCisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfZ2V0X3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOworCWludCBrLGksajsKKworCWR3cnEtPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpOworCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKHJhbmdlKSk7CisJcmFuZ2UtPm1pbl9ud2lkID0gMHgwMDAwOworCXJhbmdlLT5tYXhfbndpZCA9IDB4MDAwMDsKKwlyYW5nZS0+bnVtX2NoYW5uZWxzID0gMDsKKwlmb3IgKGogPSAwOyBqIDwgc2l6ZW9mKGNoYW5uZWxfdGFibGUpL3NpemVvZihjaGFubmVsX3RhYmxlWzBdKTsgaisrKQorCQlpZiAocHJpdi0+cmVnX2RvbWFpbiA9PSBjaGFubmVsX3RhYmxlW2pdLnJlZ19kb21haW4pIHsKKwkJCXJhbmdlLT5udW1fY2hhbm5lbHMgPSBjaGFubmVsX3RhYmxlW2pdLm1heCAtIGNoYW5uZWxfdGFibGVbal0ubWluICsgMTsKKwkJCWJyZWFrOworCQl9CisJaWYgKHJhbmdlLT5udW1fY2hhbm5lbHMgIT0gMCkgeworCQlmb3IoayA9IDAsIGkgPSBjaGFubmVsX3RhYmxlW2pdLm1pbjsgaSA8PSBjaGFubmVsX3RhYmxlW2pdLm1heDsgaSsrKSB7CisJCQlyYW5nZS0+ZnJlcVtrXS5pID0gaTsgLyogTGlzdCBpbmRleCAqLworCQkJcmFuZ2UtPmZyZXFba10ubSA9IGZyZXF1ZW5jeV9saXN0W2ktMV0gKiAxMDAwMDA7CisJCQlyYW5nZS0+ZnJlcVtrKytdLmUgPSAxOwkvKiBWYWx1ZXMgaW4gdGFibGUgaW4gTUh6IC0+ICogMTBeNSAqIDEwICovCisJCX0KKwkJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSBrOworCX0KKwkKKwlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDEwMDsKKwlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAxMDA7CisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMDsKKwlyYW5nZS0+bWF4X3F1YWwudXBkYXRlZCA9IElXX1FVQUxfTk9JU0VfSU5WQUxJRDsKKworCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gNTA7CisJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gNTA7CisJcmFuZ2UtPmF2Z19xdWFsLm5vaXNlID0gMDsKKwlyYW5nZS0+YXZnX3F1YWwudXBkYXRlZCA9IElXX1FVQUxfTk9JU0VfSU5WQUxJRDsKKworCXJhbmdlLT5zZW5zaXRpdml0eSA9IDA7CisKKwlyYW5nZS0+Yml0cmF0ZVswXSA9ICAxMDAwMDAwOworCXJhbmdlLT5iaXRyYXRlWzFdID0gIDIwMDAwMDA7CisJcmFuZ2UtPmJpdHJhdGVbMl0gPSAgNTUwMDAwMDsKKwlyYW5nZS0+Yml0cmF0ZVszXSA9IDExMDAwMDAwOworCXJhbmdlLT5udW1fYml0cmF0ZXMgPSA0OworCisJcmFuZ2UtPm1pbl9ydHMgPSAwOworCXJhbmdlLT5tYXhfcnRzID0gMjM0NzsKKwlyYW5nZS0+bWluX2ZyYWcgPSAyNTY7CisJcmFuZ2UtPm1heF9mcmFnID0gMjM0NjsKKworCXJhbmdlLT5lbmNvZGluZ19zaXplWzBdID0gNTsKKwlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVsxXSA9IDEzOworCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAyOworCXJhbmdlLT5tYXhfZW5jb2RpbmdfdG9rZW5zID0gNDsKKwkKKwlyYW5nZS0+cG1wX2ZsYWdzID0gSVdfUE9XRVJfT047CisJcmFuZ2UtPnBtdF9mbGFncyA9IElXX1BPV0VSX09OOworCXJhbmdlLT5wbV9jYXBhID0gMDsKKwkKKwlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPnJldHJ5X2NhcGEgPSBJV19SRVRSWV9MSU1JVCA7CisJcmFuZ2UtPnJldHJ5X2ZsYWdzID0gSVdfUkVUUllfTElNSVQ7CisJcmFuZ2UtPnJfdGltZV9mbGFncyA9IDA7CisJcmFuZ2UtPm1pbl9yZXRyeSA9IDE7CisJcmFuZ2UtPm1heF9yZXRyeSA9IDY1NTM1OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfc2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IHNvY2thZGRyICphd3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwlzdGF0aWMgY29uc3QgdTggYmNhc3RbXSA9IHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoYXdycS0+c2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUikKKwkJcmV0dXJuIC1FSU5WQUw7CisJCisJaWYgKG1lbWNtcChiY2FzdCwgYXdycS0+c2FfZGF0YSwgNikgPT0gMCkgeworCQlkZWxfdGltZXJfc3luYygmcHJpdi0+bWFuYWdlbWVudF90aW1lcik7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5pcnFsb2NrLCBmbGFncyk7CisJCWF0bWVsX3NjYW4ocHJpdiwgMSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycWxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCWZvcihpPTA7IGk8cHJpdi0+QlNTX2xpc3RfZW50cmllczsgaSsrKSB7CisJCWlmIChtZW1jbXAocHJpdi0+QlNTaW5mb1tpXS5CU1NJRCwgYXdycS0+c2FfZGF0YSwgNikgPT0gMCkgeworCQkJaWYgKCFwcml2LT53ZXBfaXNfb24gJiYgcHJpdi0+QlNTaW5mb1tpXS5Vc2luZ1dFUCkgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfSBlbHNlIGlmICAocHJpdi0+d2VwX2lzX29uICYmICFwcml2LT5CU1NpbmZvW2ldLlVzaW5nV0VQKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9IGVsc2UgeworCQkJCWRlbF90aW1lcl9zeW5jKCZwcml2LT5tYW5hZ2VtZW50X3RpbWVyKTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aXJxbG9jaywgZmxhZ3MpOworCQkJCWF0bWVsX2pvaW5fYnNzKHByaXYsIGkpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycWxvY2ssIGZsYWdzKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwkJCisJcmV0dXJuIC1FSU5WQUw7Cit9CisJCitzdGF0aWMgaW50IGF0bWVsX2NvbmZpZ19jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAkvKiBOVUxMICovCisJCQkgICAgICAgdm9pZCAqendycSwJCQkvKiBOVUxMICovCisJCQkgICAgICAgY2hhciAqZXh0cmEpCQkJLyogTlVMTCAqLworeworCXJldHVybiBhdG1lbF9vcGVuKGRldik7Cit9CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyCQlhdG1lbF9oYW5kbGVyW10gPQoreworCShpd19oYW5kbGVyKSBhdG1lbF9jb25maWdfY29tbWl0LAkvKiBTSU9DU0lXQ09NTUlUICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX2dldF9uYW1lLCAgICAJLyogU0lPQ0dJV05BTUUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiBTSU9DU0lXTldJRCAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NHSVdOV0lEICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX3NldF9mcmVxLAkJLyogU0lPQ1NJV0ZSRVEgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfZ2V0X2ZyZXEsCQkvKiBTSU9DR0lXRlJFUSAqLworCShpd19oYW5kbGVyKSBhdG1lbF9zZXRfbW9kZSwJCS8qIFNJT0NTSVdNT0RFICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX2dldF9tb2RlLAkJLyogU0lPQ0dJV01PREUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAJLyogU0lPQ1NJV1NFTlMgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgIAkJLyogU0lPQ0dJV1NFTlMgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiBTSU9DU0lXUkFOR0UgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfZ2V0X3JhbmdlLCAgICAgICAgICAgLyogU0lPQ0dJV1JBTkdFICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ1NJV1BSSVYgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiBTSU9DR0lXUFJJViAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NTSVdTVEFUUyAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NHSVdTVEFUUyAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NTSVdTUFkgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiBTSU9DR0lXU1BZICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfc2V0X3dhcCwJCS8qIFNJT0NTSVdBUCAqLworCShpd19oYW5kbGVyKSBhdG1lbF9nZXRfd2FwLAkJLyogU0lPQ0dJV0FQICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgICAJCS8qIFNJT0NHSVdBUExJU1QgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfc2V0X3NjYW4sCQkvKiBTSU9DU0lXU0NBTiAqLworCShpd19oYW5kbGVyKSBhdG1lbF9nZXRfc2NhbiwJCS8qIFNJT0NHSVdTQ0FOICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX3NldF9lc3NpZCwJCS8qIFNJT0NTSVdFU1NJRCAqLworCShpd19oYW5kbGVyKSBhdG1lbF9nZXRfZXNzaWQsCQkvKiBTSU9DR0lXRVNTSUQgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAJCS8qIFNJT0NTSVdOSUNLTiAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAJCS8qIFNJT0NHSVdOSUNLTiAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX3NldF9yYXRlLAkJLyogU0lPQ1NJV1JBVEUgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfZ2V0X3JhdGUsCQkvKiBTSU9DR0lXUkFURSAqLworCShpd19oYW5kbGVyKSBhdG1lbF9zZXRfcnRzLAkJLyogU0lPQ1NJV1JUUyAqLworCShpd19oYW5kbGVyKSBhdG1lbF9nZXRfcnRzLAkJLyogU0lPQ0dJV1JUUyAqLworCShpd19oYW5kbGVyKSBhdG1lbF9zZXRfZnJhZywJCS8qIFNJT0NTSVdGUkFHICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX2dldF9mcmFnLAkJLyogU0lPQ0dJV0ZSQUcgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAJCS8qIFNJT0NTSVdUWFBPVyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAJCS8qIFNJT0NHSVdUWFBPVyAqLworCShpd19oYW5kbGVyKSBhdG1lbF9zZXRfcmV0cnksCQkvKiBTSU9DU0lXUkVUUlkgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfZ2V0X3JldHJ5LAkJLyogU0lPQ0dJV1JFVFJZICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX3NldF9lbmNvZGUsCQkvKiBTSU9DU0lXRU5DT0RFICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX2dldF9lbmNvZGUsCQkvKiBTSU9DR0lXRU5DT0RFICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX3NldF9wb3dlciwJCS8qIFNJT0NTSVdQT1dFUiAqLworCShpd19oYW5kbGVyKSBhdG1lbF9nZXRfcG93ZXIsCQkvKiBTSU9DR0lXUE9XRVIgKi8KK307CisKKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJCWF0bWVsX3ByaXZhdGVfaGFuZGxlcltdID0KK3sKKwlOVUxMLAkJCQkvKiBTSU9DSVdGSVJTVFBSSVYgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IGF0bWVsX3ByaXZfaW9jdGwgeworCWNoYXIgaWRbMzJdOworCXVuc2lnbmVkIGNoYXIgX191c2VyICpkYXRhOwkJCisJdW5zaWduZWQgc2hvcnQgbGVuOwkJCit9IGF0bWVsX3ByaXZfaW9jdGw7CisKKwkKKyNkZWZpbmUgQVRNRUxGV0wgU0lPQ0lXRklSU1RQUklWCisjZGVmaW5lIEFUTUVMSURJRkMgQVRNRUxGV0wgKyAxCisjZGVmaW5lIEFUTUVMUkQgQVRNRUxGV0wgKyAyCisjZGVmaW5lIEFUTUVMTUFHSUMgMHg1MTgwNyAKKyNkZWZpbmUgUkVHRE9NQUlOU1ogMjAKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3MgYXRtZWxfcHJpdmF0ZV9hcmdzW10gPSB7CisvKnsgY21kLCAgICAgICAgIHNldF9hcmdzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYXJncywgbmFtZSB9ICovCisgIHsgQVRNRUxGV0wsIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgc2l6ZW9mIChhdG1lbF9wcml2X2lvY3RsKSwgSVdfUFJJVl9UWVBFX05PTkUsICJhdG1lbGZ3bCIgfSwKKyAgeyBBVE1FTElESUZDLCBJV19QUklWX1RZUEVfTk9ORSwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJhdG1lbGlkaWZjIiB9LAorICB7IEFUTUVMUkQsIElXX1BSSVZfVFlQRV9DSEFSIHwgUkVHRE9NQUlOU1osIElXX1BSSVZfVFlQRV9OT05FLCAicmVnZG9tYWluIiB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZglhdG1lbF9oYW5kbGVyX2RlZiA9Cit7CisJLm51bV9zdGFuZGFyZAk9IHNpemVvZihhdG1lbF9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlCT0gc2l6ZW9mKGF0bWVsX3ByaXZhdGVfaGFuZGxlcikvc2l6ZW9mKGl3X2hhbmRsZXIpLCAKKwkubnVtX3ByaXZhdGVfYXJncyA9IHNpemVvZihhdG1lbF9wcml2YXRlX2FyZ3MpL3NpemVvZihzdHJ1Y3QgaXdfcHJpdl9hcmdzKSwgCisJLnN0YW5kYXJkCT0gKGl3X2hhbmRsZXIgKikgYXRtZWxfaGFuZGxlciwKKwkucHJpdmF0ZQk9IChpd19oYW5kbGVyICopIGF0bWVsX3ByaXZhdGVfaGFuZGxlciwgCisJLnByaXZhdGVfYXJncwk9IChzdHJ1Y3QgaXdfcHJpdl9hcmdzICopIGF0bWVsX3ByaXZhdGVfYXJncworfTsKKworc3RhdGljIGludCBhdG1lbF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCWludCBpLCByYyA9IDA7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWF0bWVsX3ByaXZfaW9jdGwgY29tOworCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKKwl1bnNpZ25lZCBjaGFyICpuZXdfZmlybXdhcmU7CisJY2hhciBkb21haW5bUkVHRE9NQUlOU1orMV07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0dJV1BSSVY6CisJCWlmKHdycS0+dS5kYXRhLnBvaW50ZXIpIHsKKwkJCS8qIFNldCB0aGUgbnVtYmVyIG9mIGlvY3RsIGF2YWlsYWJsZSAqLworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKGF0bWVsX3ByaXZhdGVfYXJncykgLyBzaXplb2YoYXRtZWxfcHJpdmF0ZV9hcmdzWzBdKTsKKwkJCQorCQkJLyogQ29weSBzdHJ1Y3R1cmUgdG8gdGhlIHVzZXIgYnVmZmVyICovCisJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkJCSAodV9jaGFyICopIGF0bWVsX3ByaXZhdGVfYXJncywKKwkJCQkJIHNpemVvZihhdG1lbF9wcml2YXRlX2FyZ3MpKSkKKwkJCQlyYyA9IC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFUTUVMSURJRkM6CisJCXdycS0+dS5wYXJhbS52YWx1ZSA9IEFUTUVMTUFHSUM7CQkKKwkJYnJlYWs7CisJCisJY2FzZSBBVE1FTEZXTDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjb20sIHJxLT5pZnJfZGF0YSwgc2l6ZW9mKGNvbSkpKSB7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJcmMgPSAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCisJCWlmICghKG5ld19maXJtd2FyZSA9IGttYWxsb2MoY29tLmxlbiwgR0ZQX0tFUk5FTCkpKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlicmVhazsKKwkJfQorCisJCWlmIChjb3B5X2Zyb21fdXNlcihuZXdfZmlybXdhcmUsIGNvbS5kYXRhLCBjb20ubGVuKSkgeworCQkJa2ZyZWUobmV3X2Zpcm13YXJlKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHByaXYtPmZpcm13YXJlKQorCQkJa2ZyZWUocHJpdi0+ZmlybXdhcmUpOworCQkKKwkJcHJpdi0+ZmlybXdhcmUgPSBuZXdfZmlybXdhcmU7CisJCXByaXYtPmZpcm13YXJlX2xlbmd0aCA9IGNvbS5sZW47CisJCXN0cm5jcHkocHJpdi0+ZmlybXdhcmVfaWQsIGNvbS5pZCwgMzEpOworCQlwcml2LT5maXJtd2FyZV9pZFszMV0gPSAnXDAnOworCQlicmVhazsKKworCWNhc2UgQVRNRUxSRDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGRvbWFpbiwgcnEtPmlmcl9kYXRhLCBSRUdET01BSU5TWikpIHsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCQorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXJjID0gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKworCQlkb21haW5bUkVHRE9NQUlOU1pdID0gMDsKKwkJcmMgPSAtRUlOVkFMOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGNoYW5uZWxfdGFibGUpL3NpemVvZihjaGFubmVsX3RhYmxlWzBdKTsgaSsrKSB7CisJCQkvKiBzdHJjYXNlY21wIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIGxpYnJhcnkgKi8KKwkJCWNoYXIgKmEgPSBjaGFubmVsX3RhYmxlW2ldLm5hbWU7CisJCQljaGFyICpiID0gZG9tYWluOworCQkJd2hpbGUgKCphKSB7CisJCQkJY2hhciBjMSA9ICphKys7CisJCQkJY2hhciBjMiA9ICpiKys7CisJCQkJaWYgKHRvbG93ZXIoYzEpICE9IHRvbG93ZXIoYzIpKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghKmEgJiYgISpiKSB7CisJCQkJcHJpdi0+Y29uZmlnX3JlZ19kb21haW4gPSBjaGFubmVsX3RhYmxlW2ldLnJlZ19kb21haW47CisJCQkJcmMgPSAwOworCQkJfQorCQl9CisJCQorCQlpZiAocmMgPT0gMCAmJiAgcHJpdi0+c3RhdGlvbl9zdGF0ZSAhPSBTVEFUSU9OX1NUQVRFX0RPV04pCisJCQlyYyA9IGF0bWVsX29wZW4oZGV2KTsKKwkJYnJlYWs7CisJCQorCWRlZmF1bHQ6CisJCXJjID0gLUVPUE5PVFNVUFA7CisJfQorCQorCXJldHVybiByYzsKK30KKworc3RydWN0IGF1dGhfYm9keSB7CisJdTE2IGFsZzsKKwl1MTYgdHJhbnNfc2VxOworCXUxNiBzdGF0dXM7CisJdTggZWxfaWQ7CisJdTggY2hhbGxfdGV4dF9sZW47CisJdTggY2hhbGxfdGV4dFsyNTNdOworfTsgCisKK3N0YXRpYyB2b2lkIGF0bWVsX2VudGVyX3N0YXRlKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgbmV3X3N0YXRlKQoreworCWludCBvbGRfc3RhdGUgPSBwcml2LT5zdGF0aW9uX3N0YXRlOworCQkKKwlpZiAobmV3X3N0YXRlID09IG9sZF9zdGF0ZSkKKwkJcmV0dXJuOworCQorCXByaXYtPnN0YXRpb25fc3RhdGUgPSBuZXdfc3RhdGU7CisJCQorCWlmIChuZXdfc3RhdGUgPT0gU1RBVElPTl9TVEFURV9SRUFEWSkgeworCQluZXRpZl9zdGFydF9xdWV1ZShwcml2LT5kZXYpOworCQluZXRpZl9jYXJyaWVyX29uKHByaXYtPmRldik7CisJfQorCisJaWYgKG9sZF9zdGF0ZSA9PSBTVEFUSU9OX1NUQVRFX1JFQURZKSB7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPmRldik7CisJCWlmIChuZXRpZl9ydW5uaW5nKHByaXYtPmRldikpCisJCQluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPmRldik7CisJCXByaXYtPmxhc3RfYmVhY29uX3RpbWVzdGFtcCA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBhdG1lbF9zY2FuKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgc3BlY2lmaWNfc3NpZCkKK3sKKwlzdHJ1Y3QgeworCQl1OCBCU1NJRFs2XTsKKwkJdTggU1NJRFtNQVhfU1NJRF9MRU5HVEhdOworCQl1OCBzY2FuX3R5cGU7CisJCXU4IGNoYW5uZWw7CisJCXUxNiBCU1NfdHlwZTsKKwkJdTE2IG1pbl9jaGFubmVsX3RpbWU7CisJCXUxNiBtYXhfY2hhbm5lbF90aW1lOworCQl1OCBvcHRpb25zOworCQl1OCBTU0lEX3NpemU7CisJfSBjbWQ7CisJCisJbWVtc2V0KGNtZC5CU1NJRCwgMHhmZiwgNik7CisKKwlpZiAocHJpdi0+ZmFzdF9zY2FuKSB7CisJCWNtZC5TU0lEX3NpemUgPSBwcml2LT5TU0lEX3NpemU7CisJCW1lbWNweShjbWQuU1NJRCwgcHJpdi0+U1NJRCwgcHJpdi0+U1NJRF9zaXplKTsKKwkJY21kLm1pbl9jaGFubmVsX3RpbWUgPSBjcHVfdG9fbGUxNigxMCk7CisJCWNtZC5tYXhfY2hhbm5lbF90aW1lID0gY3B1X3RvX2xlMTYoNTApOworCX0gZWxzZSB7CisJCXByaXYtPkJTU19saXN0X2VudHJpZXMgPSAwOworCQljbWQuU1NJRF9zaXplID0gMDsKKwkJY21kLm1pbl9jaGFubmVsX3RpbWUgPSBjcHVfdG9fbGUxNigxMCk7CisJCWNtZC5tYXhfY2hhbm5lbF90aW1lID0gY3B1X3RvX2xlMTYoMTIwKTsKKwl9CisJCisJY21kLm9wdGlvbnMgPSAwOworCQorCWlmICghc3BlY2lmaWNfc3NpZCkKKwkJY21kLm9wdGlvbnMgfD0gU0NBTl9PUFRJT05TX1NJVEVfU1VSVkVZOworCQorCWNtZC5jaGFubmVsID0gKHByaXYtPmNoYW5uZWwgJiAweDdmKTsgCisJY21kLnNjYW5fdHlwZSA9IFNDQU5fVFlQRV9BQ1RJVkU7CisJY21kLkJTU190eXBlID0gY3B1X3RvX2xlMTYocHJpdi0+b3BlcmF0aW5nX21vZGUgPT0gSVdfTU9ERV9BREhPQyA/IAorCQlCU1NfVFlQRV9BRF9IT0MgOiBCU1NfVFlQRV9JTkZSQVNUUlVDVFVSRSk7CisJCisJYXRtZWxfc2VuZF9jb21tYW5kKHByaXYsIENNRF9TY2FuLCAmY21kLCBzaXplb2YoY21kKSk7CisKKwkvKiBUaGlzIG11c3QgY29tZSBhZnRlciBhbGwgaGFyZHdhcmUgYWNjZXNzIHRvIGF2b2lkIGJlaW5nIG1lc3NlZCB1cAorCSAgIGJ5IHN0dWZmIGhhcHBlbmluZyBpbiBpbnRlcnJ1cHQgY29udGV4dCBhZnRlciB3ZSBsZWF2ZSBTVEFURV9ET1dOICovCisJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9TQ0FOTklORyk7Cit9CisKK3N0YXRpYyB2b2lkIGpvaW4oc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIGludCB0eXBlKQoreworCXN0cnVjdCB7CisJCXU4IEJTU0lEWzZdOworCQl1OCBTU0lEW01BWF9TU0lEX0xFTkdUSF07CisJCXU4IEJTU190eXBlOyAvKiB0aGlzIGlzIGEgc2hvcnQgaW4gYSBzY2FuIGNvbW1hbmQgLSB3ZWlyZCAqLworCQl1OCBjaGFubmVsOworCQl1MTYgdGltZW91dDsKKwkJdTggU1NJRF9zaXplOworCQl1OCByZXNlcnZlZDsKKwl9IGNtZDsKKworCWNtZC5TU0lEX3NpemUgPSBwcml2LT5TU0lEX3NpemU7CisJbWVtY3B5KGNtZC5TU0lELCBwcml2LT5TU0lELCBwcml2LT5TU0lEX3NpemUpOworCW1lbWNweShjbWQuQlNTSUQsIHByaXYtPkN1cnJlbnRCU1NJRCwgNik7CisJY21kLmNoYW5uZWwgPSAocHJpdi0+Y2hhbm5lbCAmIDB4N2YpOworCWNtZC5CU1NfdHlwZSA9IHR5cGU7CisJY21kLnRpbWVvdXQgPSBjcHVfdG9fbGUxNigyMDAwKTsKKworIAlhdG1lbF9zZW5kX2NvbW1hbmQocHJpdiwgQ01EX0pvaW4sICZjbWQsIHNpemVvZihjbWQpKTsKK30KKworCitzdGF0aWMgdm9pZCBzdGFydChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IHR5cGUpCit7CisJc3RydWN0IHsKKwkJdTggQlNTSURbNl07CisJCXU4IFNTSURbTUFYX1NTSURfTEVOR1RIXTsKKwkJdTggQlNTX3R5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJdTggY2hhbm5lbDsKKwkJdTggU1NJRF9zaXplOworCQl1OCByZXNlcnZlZFszXTsKKwl9IGNtZDsKKworCWNtZC5TU0lEX3NpemUgPSBwcml2LT5TU0lEX3NpemU7CisJbWVtY3B5KGNtZC5TU0lELCBwcml2LT5TU0lELCBwcml2LT5TU0lEX3NpemUpOworCW1lbWNweShjbWQuQlNTSUQsIHByaXYtPkJTU0lELCA2KTsKKwljbWQuQlNTX3R5cGUgPSB0eXBlOworCWNtZC5jaGFubmVsID0gKHByaXYtPmNoYW5uZWwgJiAweDdmKTsKKworCWF0bWVsX3NlbmRfY29tbWFuZChwcml2LCBDTURfU3RhcnQsICZjbWQsIHNpemVvZihjbWQpKTsgCit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9iZWFjb25fcHJvYmUoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHUxNiBjYXBhYmlsaXR5LCB1OCBjaGFubmVsKQoreworCWludCByZWpvaW4gPSAwOworCWludCBuZXcgPSBjYXBhYmlsaXR5ICAmIEM4MDIxMV9NR01UX0NBUEFCSUxJVFlfU2hvcnRQcmVhbWJsZSA/IAorCQlTSE9SVF9QUkVBTUJMRSA6IExPTkdfUFJFQU1CTEU7CisKKwlpZiAocHJpdi0+cHJlYW1ibGUgIT0gbmV3KSB7CisJCXByaXYtPnByZWFtYmxlID0gbmV3OworCQlyZWpvaW4gPSAxOworCQlhdG1lbF9zZXRfbWliOChwcml2LCBMb2NhbF9NaWJfVHlwZSwgTE9DQUxfTUlCX1BSRUFNQkxFX1RZUEUsIG5ldyk7CisJfQorCQkKKwlpZiAocHJpdi0+Y2hhbm5lbCAhPSBjaGFubmVsKSB7CisJCXByaXYtPmNoYW5uZWwgPSBjaGFubmVsOworCQlyZWpvaW4gPSAxOworCQlhdG1lbF9zZXRfbWliOChwcml2LCBQaHlfTWliX1R5cGUsIFBIWV9NSUJfQ0hBTk5FTF9QT1MsIGNoYW5uZWwpOworCX0KKwkKKwlpZiAocmVqb2luKSB7CisJCXByaXYtPnN0YXRpb25faXNfYXNzb2NpYXRlZCA9IDA7CisJCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfSk9JTk5JTkcpOworCQkKKwkJaWYgKHByaXYtPm9wZXJhdGluZ19tb2RlID09IElXX01PREVfSU5GUkEpCisJCQlqb2luKHByaXYsIEJTU19UWVBFX0lORlJBU1RSVUNUVVJFKTsKKwkJZWxzZSAKKwkJCWpvaW4ocHJpdiwgQlNTX1RZUEVfQURfSE9DKTsKKwl9IAorfQorCisgCitzdGF0aWMgdm9pZCBzZW5kX2F1dGhlbnRpY2F0aW9uX3JlcXVlc3Qoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHU4ICpjaGFsbGVuZ2UsIGludCBjaGFsbGVuZ2VfbGVuKQoreworCXN0cnVjdCBpZWVlODAyXzExX2hkciBoZWFkZXI7CisJc3RydWN0IGF1dGhfYm9keSBhdXRoOworCQorCWhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyXzExX0ZUWVBFX01HTVQgfCBJRUVFODAyXzExX1NUWVBFX0FVVEgpOyAKKwloZWFkZXIuZHVyYXRpb25faWQJPSBjcHVfdG9fbGUxNigweDgwMDApOwkKKwloZWFkZXIuc2VxX2N0bCA9IDA7CisJbWVtY3B5KGhlYWRlci5hZGRyMSwgcHJpdi0+Q3VycmVudEJTU0lELCA2KTsKKwltZW1jcHkoaGVhZGVyLmFkZHIyLCBwcml2LT5kZXYtPmRldl9hZGRyLCA2KTsKKwltZW1jcHkoaGVhZGVyLmFkZHIzLCBwcml2LT5DdXJyZW50QlNTSUQsIDYpOworCQorCWlmIChwcml2LT53ZXBfaXNfb24pIHsKKwkJYXV0aC5hbGcgPSBjcHVfdG9fbGUxNihDODAyMTFfTUdNVF9BQU5fU0hBUkVES0VZKTsgCisJCS8qIG5vIFdFUCBmb3IgYXV0aGVudGljYXRpb24gZnJhbWVzIHdpdGggVHJTZXFObyAxICovCisJCWlmIChwcml2LT5DdXJyZW50QXV0aGVudFRyYW5zYWN0aW9uU2VxTnVtICE9IDEpCisJCQloZWFkZXIuZnJhbWVfY3RsIHw9ICBjcHVfdG9fbGUxNihJRUVFODAyXzExX0ZDVExfV0VQKTsgCisJfSBlbHNlIHsKKwkJYXV0aC5hbGcgPSBjcHVfdG9fbGUxNihDODAyMTFfTUdNVF9BQU5fT1BFTlNZU1RFTSk7CisJfQorCisJYXV0aC5zdGF0dXMgPSAwOworCWF1dGgudHJhbnNfc2VxID0gY3B1X3RvX2xlMTYocHJpdi0+Q3VycmVudEF1dGhlbnRUcmFuc2FjdGlvblNlcU51bSk7CisJcHJpdi0+RXhwZWN0ZWRBdXRoZW50VHJhbnNhY3Rpb25TZXFOdW0gPSBwcml2LT5DdXJyZW50QXV0aGVudFRyYW5zYWN0aW9uU2VxTnVtKzE7IAorCXByaXYtPkN1cnJlbnRBdXRoZW50VHJhbnNhY3Rpb25TZXFOdW0gKz0gMjsKKwkKKwlpZiAoY2hhbGxlbmdlX2xlbiAhPSAwKQl7CisJCWF1dGguZWxfaWQgPSAxNjsgLyogY2hhbGxlbmdlX3RleHQgKi8KKwkJYXV0aC5jaGFsbF90ZXh0X2xlbiA9IGNoYWxsZW5nZV9sZW47CisJCW1lbWNweShhdXRoLmNoYWxsX3RleHQsIGNoYWxsZW5nZSwgY2hhbGxlbmdlX2xlbik7CisJCWF0bWVsX3RyYW5zbWl0X21hbmFnZW1lbnRfZnJhbWUocHJpdiwgJmhlYWRlciwgKHU4ICopJmF1dGgsIDggKyBjaGFsbGVuZ2VfbGVuKTsKKwl9IGVsc2UgeworCQlhdG1lbF90cmFuc21pdF9tYW5hZ2VtZW50X2ZyYW1lKHByaXYsICZoZWFkZXIsICh1OCAqKSZhdXRoLCA2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfYXNzb2NpYXRpb25fcmVxdWVzdChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IGlzX3JlYXNzb2MpCit7CisJdTggKnNzaWRfZWxfcDsKKwlpbnQgYm9keXNpemU7CisJc3RydWN0IGllZWU4MDJfMTFfaGRyIGhlYWRlcjsKKwlzdHJ1Y3QgYXNzX3JlcV9mb3JtYXQgeworCQl1MTYgY2FwYWJpbGl0eTsKKwkJdTE2IGxpc3Rlbl9pbnRlcnZhbDsgCisJCXU4IGFwWzZdOyAvKiBub3RoaW5nIGFmdGVyIGhlcmUgZGlyZWN0bHkgYWNjZXNzaWJsZSAqLworCQl1OCBzc2lkX2VsX2lkOworCQl1OCBzc2lkX2xlbjsKKwkJdTggc3NpZFtNQVhfU1NJRF9MRU5HVEhdOworCQl1OCBzdXBfcmF0ZXNfZWxfaWQ7CisJCXU4IHN1cF9yYXRlc19sZW47CisJCXU4IHJhdGVzWzRdOworCX0gYm9keTsKKwkJCisJaGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDJfMTFfRlRZUEVfTUdNVCB8IAorCQkoaXNfcmVhc3NvYyA/IElFRUU4MDJfMTFfU1RZUEVfUkVBU1NPQ19SRVEgOiBJRUVFODAyXzExX1NUWVBFX0FTU09DX1JFUSkpOworCWhlYWRlci5kdXJhdGlvbl9pZCA9IGNwdV90b19sZTE2KDB4ODAwMCk7CisJaGVhZGVyLnNlcV9jdGwgPSAwOworCisJbWVtY3B5KGhlYWRlci5hZGRyMSwgcHJpdi0+Q3VycmVudEJTU0lELCA2KTsgCisJbWVtY3B5KGhlYWRlci5hZGRyMiwgcHJpdi0+ZGV2LT5kZXZfYWRkciwgNik7CisJbWVtY3B5KGhlYWRlci5hZGRyMywgcHJpdi0+Q3VycmVudEJTU0lELCA2KTsgCisKKwlib2R5LmNhcGFiaWxpdHkgPSBjcHVfdG9fbGUxNihDODAyMTFfTUdNVF9DQVBBQklMSVRZX0VTUyk7CisJaWYgKHByaXYtPndlcF9pc19vbikKKwkJYm9keS5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KEM4MDIxMV9NR01UX0NBUEFCSUxJVFlfUHJpdmFjeSk7CisJaWYgKHByaXYtPnByZWFtYmxlID09IFNIT1JUX1BSRUFNQkxFKQorCQlib2R5LmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoQzgwMjExX01HTVRfQ0FQQUJJTElUWV9TaG9ydFByZWFtYmxlKTsKKworCWJvZHkubGlzdGVuX2ludGVydmFsID0gY3B1X3RvX2xlMTYocHJpdi0+bGlzdGVuX2ludGVydmFsICogcHJpdi0+YmVhY29uX3BlcmlvZCk7CisJCisJLyogY3VycmVudCBBUCBhZGRyZXNzIC0gb25seSBpbiByZWFzc29jIGZyYW1lICovCisJaWYgKGlzX3JlYXNzb2MpIHsKKwkJbWVtY3B5KGJvZHkuYXAsICBwcml2LT5DdXJyZW50QlNTSUQsIDYpOworCQlzc2lkX2VsX3AgPSAodTggKikmYm9keS5zc2lkX2VsX2lkOworCQlib2R5c2l6ZSA9IDE4ICsgcHJpdi0+U1NJRF9zaXplOworCX0gZWxzZSB7CisJCXNzaWRfZWxfcCA9ICh1OCAqKSZib2R5LmFwWzBdOworCQlib2R5c2l6ZSA9IDEyICsgcHJpdi0+U1NJRF9zaXplOworCX0KKwkJCisJc3NpZF9lbF9wWzBdPSBDODAyMTFfTUdNVF9FbGVtZW50SURfU1NJRDsKKwlzc2lkX2VsX3BbMV0gPSBwcml2LT5TU0lEX3NpemU7CisJbWVtY3B5KHNzaWRfZWxfcCArIDIsIHByaXYtPlNTSUQsIHByaXYtPlNTSURfc2l6ZSk7CisJc3NpZF9lbF9wWzIgKyBwcml2LT5TU0lEX3NpemVdID0gQzgwMjExX01HTVRfRWxlbWVudElEX1N1cHBvcnRlZFJhdGVzOworCXNzaWRfZWxfcFszICsgcHJpdi0+U1NJRF9zaXplXSA9IDQ7IC8qIGxlbiBvZiBzdXBvcnRlZCByYXRlcyAqLworCW1lbWNweShzc2lkX2VsX3AgKyA0ICsgcHJpdi0+U1NJRF9zaXplLCBhdG1lbF9iYXNpY19yYXRlcywgNCk7CisKKwlhdG1lbF90cmFuc21pdF9tYW5hZ2VtZW50X2ZyYW1lKHByaXYsICZoZWFkZXIsICh2b2lkICopJmJvZHksIGJvZHlzaXplKTsKK30KKworc3RhdGljIGludCBpc19mcmFtZV9mcm9tX2N1cnJlbnRfYnNzKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIgKmhlYWRlcikKK3sKKwlpZiAobGUxNl90b19jcHUoaGVhZGVyLT5mcmFtZV9jdGwpICYgSUVFRTgwMl8xMV9GQ1RMX0ZST01EUykKKwkJcmV0dXJuIG1lbWNtcChoZWFkZXItPmFkZHIzLCBwcml2LT5DdXJyZW50QlNTSUQsIDYpID09IDA7CisJZWxzZQorCQlyZXR1cm4gbWVtY21wKGhlYWRlci0+YWRkcjIsIHByaXYtPkN1cnJlbnRCU1NJRCwgNikgPT0gMDsKK30KKworc3RhdGljIGludCByZXRyaWV2ZV9ic3Moc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYpCit7CisJaW50IGk7CisJaW50IG1heF9yc3NpID0gLTEyODsKKwlpbnQgbWF4X2luZGV4ID0gLTE7CisJCisJaWYgKHByaXYtPkJTU19saXN0X2VudHJpZXMgPT0gMCkKKwkJcmV0dXJuIC0xOworCQkJCisJaWYgKHByaXYtPmNvbm5lY3RfdG9fYW55X0JTUykgeworCQkvKiBTZWxlY3QgYSBCU1Mgd2l0aCB0aGUgbWF4LVJTU0kgYnV0IG9mIHRoZSBzYW1lIHR5cGUgYW5kIG9mIHRoZSBzYW1lIFdFUCBtb2RlCisJCSAgIGFuZCB0aGF0IGl0IGlzIG5vdCBtYXJrZWQgYXMgJ2JhZCcgKGkuZS4gd2UgaGFkIHByZXZpb3VzbHkgZmFpbGVkIHRvIGNvbm5lY3QgdG8KKwkJICAgdGhpcyBCU1Mgd2l0aCB0aGUgc2V0dGluZ3MgdGhhdCB3ZSBjdXJyZW50bHkgdXNlKSAqLworCQlwcml2LT5jdXJyZW50X0JTUyA9IDA7CisJCWZvcihpPTA7IGk8cHJpdi0+QlNTX2xpc3RfZW50cmllczsgaSsrKSB7IAorCQkJaWYgKHByaXYtPm9wZXJhdGluZ19tb2RlID09IHByaXYtPkJTU2luZm9baV0uQlNTdHlwZSAmJgorCQkJICAgICgoIXByaXYtPndlcF9pc19vbiAmJiAhcHJpdi0+QlNTaW5mb1tpXS5Vc2luZ1dFUCkgfHwgCisJCQkgICAgIChwcml2LT53ZXBfaXNfb24gJiYgcHJpdi0+QlNTaW5mb1tpXS5Vc2luZ1dFUCkpICYmCisJCQkgICAgIShwcml2LT5CU1NpbmZvW2ldLmNoYW5uZWwgJiAweDgwKSkgeworCQkJCW1heF9yc3NpID0gcHJpdi0+QlNTaW5mb1tpXS5SU1NJOworCQkJCXByaXYtPmN1cnJlbnRfQlNTID0gbWF4X2luZGV4ID0gaTsKKwkJCX0KKwkJCQorCQl9CisJCXJldHVybiBtYXhfaW5kZXg7CisJfQorCQkKKwlmb3IoaT0wOyBpPHByaXYtPkJTU19saXN0X2VudHJpZXM7IGkrKykgeworCQlpZiAocHJpdi0+U1NJRF9zaXplID09IHByaXYtPkJTU2luZm9baV0uU1NJRHNpemUgJiYKKwkJICAgIG1lbWNtcChwcml2LT5TU0lELCBwcml2LT5CU1NpbmZvW2ldLlNTSUQsIHByaXYtPlNTSURfc2l6ZSkgPT0gMCAmJgorCQkgICAgcHJpdi0+b3BlcmF0aW5nX21vZGUgPT0gcHJpdi0+QlNTaW5mb1tpXS5CU1N0eXBlICYmCisJCSAgICBhdG1lbF92YWxpZGF0ZV9jaGFubmVsKHByaXYsIHByaXYtPkJTU2luZm9baV0uY2hhbm5lbCkgPT0gMCkgeworCQkJaWYgKHByaXYtPkJTU2luZm9baV0uUlNTSSA+PSBtYXhfcnNzaSkgeworCQkJCW1heF9yc3NpID0gcHJpdi0+QlNTaW5mb1tpXS5SU1NJOworCQkJCW1heF9pbmRleCA9IGk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIG1heF9pbmRleDsKK30KKworCitzdGF0aWMgdm9pZCBzdG9yZV9ic3NfaW5mbyhzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IGllZWU4MDJfMTFfaGRyICpoZWFkZXIsCisJCQkgICB1MTYgY2FwYWJpbGl0eSwgdTE2IGJlYWNvbl9wZXJpb2QsIHU4IGNoYW5uZWwsIHU4IHJzc2ksIAorCQkJICAgdTggc3NpZF9sZW4sIHU4ICpzc2lkLCBpbnQgaXNfYmVhY29uKQoreworCXU4ICpic3MgPSBjYXBhYmlsaXR5ICYgQzgwMjExX01HTVRfQ0FQQUJJTElUWV9FU1MgPyBoZWFkZXItPmFkZHIyIDogaGVhZGVyLT5hZGRyMzsKKwlpbnQgaSwgaW5kZXg7CisJCQorCWZvciAoaW5kZXggPSAtMSwgaSA9IDA7IGkgPCBwcml2LT5CU1NfbGlzdF9lbnRyaWVzOyBpKyspIAorCQlpZiAobWVtY21wKGJzcywgcHJpdi0+QlNTaW5mb1tpXS5CU1NJRCwgNikgPT0gMCkgCisJCQlpbmRleCA9IGk7CisKKyAgICAgICAgLyogSWYgd2UgcHJvY2VzcyBhIHByb2JlIGFuZCBhbiBlbnRyeSBmcm9tIHRoaXMgQlNTIGV4aXN0cyAKKwkgICB3ZSB3aWxsIHVwZGF0ZSB0aGUgQlNTIGVudHJ5IHdpdGggdGhlIGluZm8gZnJvbSB0aGlzIEJTUy4KKwkgICBJZiB3ZSBwcm9jZXNzIGEgYmVhY29uIHdlIHdpbGwgb25seSB1cGRhdGUgUlNTSSAqLworCisJaWYgKGluZGV4ID09IC0xKSB7CisJCWlmIChwcml2LT5CU1NfbGlzdF9lbnRyaWVzID09IE1BWF9CU1NfRU5UUklFUykKKwkJCXJldHVybjsKKwkJaW5kZXggPSBwcml2LT5CU1NfbGlzdF9lbnRyaWVzKys7CisJCW1lbWNweShwcml2LT5CU1NpbmZvW2luZGV4XS5CU1NJRCwgYnNzLCA2KTsKKwkJcHJpdi0+QlNTaW5mb1tpbmRleF0uUlNTSSA9IHJzc2k7CisJfSBlbHNlIHsKKwkJaWYgKHJzc2kgPiBwcml2LT5CU1NpbmZvW2luZGV4XS5SU1NJKQorCQkJcHJpdi0+QlNTaW5mb1tpbmRleF0uUlNTSSA9IHJzc2k7CisJCWlmIChpc19iZWFjb24pCisJCQlyZXR1cm47CisJfQorCisJcHJpdi0+QlNTaW5mb1tpbmRleF0uY2hhbm5lbCA9IGNoYW5uZWw7CisJcHJpdi0+QlNTaW5mb1tpbmRleF0uYmVhY29uX3BlcmlvZCA9IGJlYWNvbl9wZXJpb2Q7CisJcHJpdi0+QlNTaW5mb1tpbmRleF0uVXNpbmdXRVAgPSBjYXBhYmlsaXR5ICYgQzgwMjExX01HTVRfQ0FQQUJJTElUWV9Qcml2YWN5OworCW1lbWNweShwcml2LT5CU1NpbmZvW2luZGV4XS5TU0lELCBzc2lkLCBzc2lkX2xlbik7CisJcHJpdi0+QlNTaW5mb1tpbmRleF0uU1NJRHNpemUgPSBzc2lkX2xlbjsKKworCWlmIChjYXBhYmlsaXR5ICYgQzgwMjExX01HTVRfQ0FQQUJJTElUWV9JQlNTKQorCQlwcml2LT5CU1NpbmZvW2luZGV4XS5CU1N0eXBlID0gSVdfTU9ERV9BREhPQzsKKwllbHNlIGlmIChjYXBhYmlsaXR5ICYgQzgwMjExX01HTVRfQ0FQQUJJTElUWV9FU1MpCisJCXByaXYtPkJTU2luZm9baW5kZXhdLkJTU3R5cGUgPUlXX01PREVfSU5GUkE7CisJCisJcHJpdi0+QlNTaW5mb1tpbmRleF0ucHJlYW1ibGUgPSBjYXBhYmlsaXR5ICAmIEM4MDIxMV9NR01UX0NBUEFCSUxJVFlfU2hvcnRQcmVhbWJsZSA/IAorCQlTSE9SVF9QUkVBTUJMRSA6IExPTkdfUFJFQU1CTEU7Cit9CisKK3N0YXRpYyB2b2lkIGF1dGhlbnRpY2F0ZShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IGZyYW1lX2xlbikKK3sKKwlzdHJ1Y3QgYXV0aF9ib2R5ICphdXRoID0gKHN0cnVjdCBhdXRoX2JvZHkgKilwcml2LT5yeF9idWY7CisJdTE2IHN0YXR1cyA9IGxlMTZfdG9fY3B1KGF1dGgtPnN0YXR1cyk7CisJdTE2IHRyYW5zX3NlcV9ubyA9IGxlMTZfdG9fY3B1KGF1dGgtPnRyYW5zX3NlcSk7CisJCisJaWYgKHN0YXR1cyA9PSBDODAyMTFfTUdNVF9TQ19TdWNjZXNzICYmICFwcml2LT53ZXBfaXNfb24pIHsgCisJCS8qIG5vIFdFUCAqLworCQlpZiAocHJpdi0+c3RhdGlvbl93YXNfYXNzb2NpYXRlZCkgeworCQkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9SRUFTU09DSUFUSU5HKTsKKwkJCXNlbmRfYXNzb2NpYXRpb25fcmVxdWVzdChwcml2LCAxKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfQVNTT0NJQVRJTkcpOworCQkJc2VuZF9hc3NvY2lhdGlvbl9yZXF1ZXN0KHByaXYsIDApOworCQkJcmV0dXJuOworCQl9IAorCX0KKwkJCisJaWYgKHN0YXR1cyA9PSBDODAyMTFfTUdNVF9TQ19TdWNjZXNzICYmIHByaXYtPndlcF9pc19vbikgeyAKKwkJLyogV0VQICovCisJCWlmICh0cmFuc19zZXFfbm8gIT0gcHJpdi0+RXhwZWN0ZWRBdXRoZW50VHJhbnNhY3Rpb25TZXFOdW0pCisJCQlyZXR1cm47CisJCQkJCisJCWlmICh0cmFuc19zZXFfbm8gPT0gMHgwMDAyICYmCisJCSAgICBhdXRoLT5lbF9pZCA9PSBDODAyMTFfTUdNVF9FbGVtZW50SURfQ2hhbGxlbmdlVGV4dCkgeworCQkJc2VuZF9hdXRoZW50aWNhdGlvbl9yZXF1ZXN0KHByaXYsIGF1dGgtPmNoYWxsX3RleHQsIGF1dGgtPmNoYWxsX3RleHRfbGVuKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKHRyYW5zX3NlcV9ubyA9PSAweDAwMDQpIHsKKwkJCWlmKHByaXYtPnN0YXRpb25fd2FzX2Fzc29jaWF0ZWQpIHsKKwkJCQlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX1JFQVNTT0NJQVRJTkcpOworCQkJCXNlbmRfYXNzb2NpYXRpb25fcmVxdWVzdChwcml2LCAxKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfQVNTT0NJQVRJTkcpOworCQkJCXNlbmRfYXNzb2NpYXRpb25fcmVxdWVzdChwcml2LCAwKTsKKwkJCQlyZXR1cm47CisJCQl9IAorCQl9CisJfQkJCQorCQorCWlmIChzdGF0dXMgPT0gQzgwMjExX01HTVRfU0NfQXV0aEFsZ05vdFN1cHBvcnRlZCAmJiBwcml2LT5jb25uZWN0X3RvX2FueV9CU1MpIHsKKwkJaW50IGJzc19pbmRleDsKKwkJCisJCXByaXYtPkJTU2luZm9bKGludCkocHJpdi0+Y3VycmVudF9CU1MpXS5jaGFubmVsIHw9IDB4ODA7CisJCQorCQlpZiAoKGJzc19pbmRleCAgPSByZXRyaWV2ZV9ic3MocHJpdikpICE9IC0xKSB7CisJCQlhdG1lbF9qb2luX2Jzcyhwcml2LCBic3NfaW5kZXgpOworCQkJcmV0dXJuOworCQl9CisJfQorCQorCQorCXByaXYtPkF1dGhlbnRpY2F0aW9uUmVxdWVzdFJldHJ5Q250ID0gMDsKKwlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCAgU1RBVElPTl9TVEFURV9NR01UX0VSUk9SKTsKKwlwcml2LT5zdGF0aW9uX2lzX2Fzc29jaWF0ZWQgPSAwOworfQorCitzdGF0aWMgdm9pZCBhc3NvY2lhdGUoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHUxNiBmcmFtZV9sZW4sIHUxNiBzdWJ0eXBlKQoreworCXN0cnVjdCBhc3NfcmVzcF9mb3JtYXQgeworCQl1MTYgY2FwYWJpbGl0eTsKKwkJdTE2IHN0YXR1czsKKwkJdTE2IGFzc19pZDsKKwkJdTggZWxfaWQ7CisJCXU4IGxlbmd0aDsKKwkJdTggcmF0ZXNbNF07CisJfSAqYXNzX3Jlc3AgPSAoc3RydWN0IGFzc19yZXNwX2Zvcm1hdCAqKXByaXYtPnJ4X2J1ZjsKKwkKKyAgICAgICAJdTE2IHN0YXR1cyA9IGxlMTZfdG9fY3B1KGFzc19yZXNwLT5zdGF0dXMpOworCXUxNiBhc3NfaWQgPSBsZTE2X3RvX2NwdShhc3NfcmVzcC0+YXNzX2lkKTsKKyAgIAl1MTYgcmF0ZXNfbGVuID0gYXNzX3Jlc3AtPmxlbmd0aCA+IDQgPyA0IDogYXNzX3Jlc3AtPmxlbmd0aDsKKwkKKwlpZiAoZnJhbWVfbGVuIDwgOCArIHJhdGVzX2xlbikKKwkJcmV0dXJuOworCQorCWlmIChzdGF0dXMgPT0gQzgwMjExX01HTVRfU0NfU3VjY2VzcykgeworCQlpZiAoc3VidHlwZSA9PSBDODAyMTFfU1VCVFlQRV9NR01UX0FTU19SRVNQT05TRSkKKwkJCXByaXYtPkFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250ID0gMDsKKwkJZWxzZQorCQkJcHJpdi0+UmVBc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCA9IDA7CisJCQorCQlhdG1lbF9zZXRfbWliMTYocHJpdiwgTWFjX01nbXRfTWliX1R5cGUsIE1BQ19NR01UX01JQl9TVEFUSU9OX0lEX1BPUywgYXNzX2lkICYgMHgzZmZmKTsKKwkJYXRtZWxfc2V0X21pYihwcml2LCBQaHlfTWliX1R5cGUsIFBIWV9NSUJfUkFURV9TRVRfUE9TLCBhc3NfcmVzcC0+cmF0ZXMsIHJhdGVzX2xlbik7CisJCWlmIChwcml2LT5wb3dlcl9tb2RlID09IDApIHsKKwkJCXByaXYtPmxpc3Rlbl9pbnRlcnZhbCA9IDE7CisJCQlhdG1lbF9zZXRfbWliOChwcml2LCBNYWNfTWdtdF9NaWJfVHlwZSwgTUFDX01HTVRfTUlCX1BTX01PREVfUE9TLCAgQUNUSVZFX01PREUpOworCQkJYXRtZWxfc2V0X21pYjE2KHByaXYsIE1hY19NZ210X01pYl9UeXBlLCBNQUNfTUdNVF9NSUJfTElTVEVOX0lOVEVSVkFMX1BPUywgMSk7CisJCX0gZWxzZSB7CisJCQlwcml2LT5saXN0ZW5faW50ZXJ2YWwgPSAyOworCQkJYXRtZWxfc2V0X21pYjgocHJpdiwgTWFjX01nbXRfTWliX1R5cGUsIE1BQ19NR01UX01JQl9QU19NT0RFX1BPUywgIFBTX01PREUpOworCQkJYXRtZWxfc2V0X21pYjE2KHByaXYsIE1hY19NZ210X01pYl9UeXBlLCBNQUNfTUdNVF9NSUJfTElTVEVOX0lOVEVSVkFMX1BPUywgMik7CisJCX0KKwkJCisJCXByaXYtPnN0YXRpb25faXNfYXNzb2NpYXRlZCA9IDE7CisJCXByaXYtPnN0YXRpb25fd2FzX2Fzc29jaWF0ZWQgPSAxOworCQlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX1JFQURZKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoc3VidHlwZSA9PSBDODAyMTFfU1VCVFlQRV9NR01UX0FTU19SRVNQT05TRSAmJgorCSAgICBzdGF0dXMgIT0gQzgwMjExX01HTVRfU0NfQXNzRGVuaWVkQlNTUmF0ZSAmJgorCSAgICBzdGF0dXMgIT0gQzgwMjExX01HTVRfU0NfU3VwcG9ydENhcGFiaWxpdGllcyAmJgorCSAgICBwcml2LT5Bc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCA8IE1BWF9BU1NPQ0lBVElPTl9SRVRSSUVTKSB7CisJCW1vZF90aW1lcigmcHJpdi0+bWFuYWdlbWVudF90aW1lciwgamlmZmllcyArIE1HTVRfSklGRklFUyk7CisJCXByaXYtPkFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250Kys7CisJCXNlbmRfYXNzb2NpYXRpb25fcmVxdWVzdChwcml2LCAwKTsKKwkJcmV0dXJuOworCX0KKwkJCisJaWYgKHN1YnR5cGUgPT0gQzgwMjExX1NVQlRZUEVfTUdNVF9SRUFTU19SRVNQT05TRSAmJgorCSAgICBzdGF0dXMgIT0gQzgwMjExX01HTVRfU0NfQXNzRGVuaWVkQlNTUmF0ZSAmJgorCSAgICBzdGF0dXMgIT0gQzgwMjExX01HTVRfU0NfU3VwcG9ydENhcGFiaWxpdGllcyAmJgorCSAgICBwcml2LT5Bc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCA8IE1BWF9BU1NPQ0lBVElPTl9SRVRSSUVTKSB7CisJCW1vZF90aW1lcigmcHJpdi0+bWFuYWdlbWVudF90aW1lciwgamlmZmllcyArIE1HTVRfSklGRklFUyk7CisJCXByaXYtPlJlQXNzb2NpYXRpb25SZXF1ZXN0UmV0cnlDbnQrKzsKKwkJc2VuZF9hc3NvY2lhdGlvbl9yZXF1ZXN0KHByaXYsIDEpOworCQlyZXR1cm47CisJfQorCQorCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsICBTVEFUSU9OX1NUQVRFX01HTVRfRVJST1IpOworCXByaXYtPnN0YXRpb25faXNfYXNzb2NpYXRlZCA9IDA7CisJCisJaWYocHJpdi0+Y29ubmVjdF90b19hbnlfQlNTKSB7CisJCWludCBic3NfaW5kZXg7CisJCXByaXYtPkJTU2luZm9bKGludCkocHJpdi0+Y3VycmVudF9CU1MpXS5jaGFubmVsIHw9IDB4ODA7CisJCQorCQlpZiAoKGJzc19pbmRleCA9IHJldHJpZXZlX2Jzcyhwcml2KSkgIT0gLTEpIAorCQkJYXRtZWxfam9pbl9ic3MocHJpdiwgYnNzX2luZGV4KTsKKwkJCisJfQorfQorCit2b2lkIGF0bWVsX2pvaW5fYnNzKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgYnNzX2luZGV4KQoreworCXN0cnVjdCBic3NfaW5mbyAqYnNzID0gICZwcml2LT5CU1NpbmZvW2Jzc19pbmRleF07CisKKwltZW1jcHkocHJpdi0+Q3VycmVudEJTU0lELCBic3MtPkJTU0lELCA2KTsKKwltZW1jcHkocHJpdi0+U1NJRCwgYnNzLT5TU0lELCBwcml2LT5TU0lEX3NpemUgPSBic3MtPlNTSURzaXplKTsKKworCS8qIFRoZSBXUEEgc3R1ZmYgY2FyZXMgYWJvdXQgdGhlIGN1cnJlbnQgQVAgYWRkcmVzcyAqLworCWlmIChwcml2LT51c2Vfd3BhKQorCQlidWlsZF93cGFfbWliKHByaXYpOworCQorCS8qIFdoZW4gc3dpdGNoaW5nIHRvIEFkSG9jIHR1cm4gT0ZGIFBvd2VyIFNhdmUgaWYgbmVlZGVkICovCisKKwlpZiAoYnNzLT5CU1N0eXBlID09IElXX01PREVfQURIT0MgJiYKKwkgICAgcHJpdi0+b3BlcmF0aW5nX21vZGUgIT0gSVdfTU9ERV9BREhPQyAmJgorCSAgICBwcml2LT5wb3dlcl9tb2RlKSB7CisJCXByaXYtPnBvd2VyX21vZGUgPSAwOworCQlwcml2LT5saXN0ZW5faW50ZXJ2YWwgPSAxOworCQlhdG1lbF9zZXRfbWliOChwcml2LCBNYWNfTWdtdF9NaWJfVHlwZSwgTUFDX01HTVRfTUlCX1BTX01PREVfUE9TLCAgQUNUSVZFX01PREUpOworCQlhdG1lbF9zZXRfbWliMTYocHJpdiwgTWFjX01nbXRfTWliX1R5cGUsIE1BQ19NR01UX01JQl9MSVNURU5fSU5URVJWQUxfUE9TLCAxKTsKKwl9CisJCQorCXByaXYtPm9wZXJhdGluZ19tb2RlID0gYnNzLT5CU1N0eXBlOworCXByaXYtPmNoYW5uZWwgPSBic3MtPmNoYW5uZWwgJiAweDdmOyAJCisJcHJpdi0+YmVhY29uX3BlcmlvZCA9IGJzcy0+YmVhY29uX3BlcmlvZDsKKwkKKwlpZiAocHJpdi0+cHJlYW1ibGUgIT0gYnNzLT5wcmVhbWJsZSkgeworCQlwcml2LT5wcmVhbWJsZSA9IGJzcy0+cHJlYW1ibGU7CisJCWF0bWVsX3NldF9taWI4KHByaXYsIExvY2FsX01pYl9UeXBlLCBMT0NBTF9NSUJfUFJFQU1CTEVfVFlQRSwgYnNzLT5wcmVhbWJsZSk7CisJfQorCQorCWlmICghcHJpdi0+d2VwX2lzX29uICYmIGJzcy0+VXNpbmdXRVApIHsKKwkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9NR01UX0VSUk9SKTsKKwkJcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkID0gMDsKKwkJcmV0dXJuOworCX0KKwkJCisJaWYgKHByaXYtPndlcF9pc19vbiAmJiAhYnNzLT5Vc2luZ1dFUCkgeworCQlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX01HTVRfRVJST1IpOworCQlwcml2LT5zdGF0aW9uX2lzX2Fzc29jaWF0ZWQgPSAwOworCQlyZXR1cm47CisJfQorCisJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9KT0lOTklORyk7CisJCisJaWYgKHByaXYtPm9wZXJhdGluZ19tb2RlID09IElXX01PREVfSU5GUkEpCisJCWpvaW4ocHJpdiwgQlNTX1RZUEVfSU5GUkFTVFJVQ1RVUkUpOworCWVsc2UgCisJCWpvaW4ocHJpdiwgQlNTX1RZUEVfQURfSE9DKTsKK30KKworCitzdGF0aWMgdm9pZCByZXN0YXJ0X3NlYXJjaChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdikKK3sKKwlpbnQgYnNzX2luZGV4OworCQorCWlmICghcHJpdi0+Y29ubmVjdF90b19hbnlfQlNTKSB7CisJCWF0bWVsX3NjYW4ocHJpdiwgMSk7CisJfSBlbHNlIHsKKwkJcHJpdi0+QlNTaW5mb1soaW50KShwcml2LT5jdXJyZW50X0JTUyldLmNoYW5uZWwgfD0gMHg4MDsKKwkJCisJCWlmICgoYnNzX2luZGV4ID0gcmV0cmlldmVfYnNzKHByaXYpKSAhPSAtMSkgCisJCQlhdG1lbF9qb2luX2Jzcyhwcml2LCBic3NfaW5kZXgpOworCQllbHNlCisJCQlhdG1lbF9zY2FuKHByaXYsIDApOworCQkKKwl9IAorfQkKKworc3RhdGljIHZvaWQgc21vb3RoX3Jzc2koc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHU4IHJzc2kpCit7CisJdTggb2xkID0gcHJpdi0+d3N0YXRzLnF1YWwubGV2ZWw7CisJdTggbWF4X3Jzc2kgPSA0MjsgLyogNTAyLXJtZmQtcmV2ZCBtYXggYnkgZXhwZXJpbWVudCwgZGVmYXVsdCBmb3Igbm93ICovCisKKwlzd2l0Y2ggKHByaXYtPmZpcm13YXJlX3R5cGUpIHsKKwkJY2FzZSBBVE1FTF9GV19UWVBFXzUwMkU6CisJCQltYXhfcnNzaSA9IDYzOyAvKiA1MDItcm1mZC1yZXZlIG1heCBieSBleHBlcmltZW50ICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCXJzc2kgPSByc3NpICogMTAwIC8gbWF4X3Jzc2k7CisJaWYoKHJzc2kgKyBvbGQpICUgMikKKwkJcHJpdi0+d3N0YXRzLnF1YWwubGV2ZWwgPSAgKChyc3NpICsgb2xkKS8yKSArIDE7CisJZWxzZQorCQlwcml2LT53c3RhdHMucXVhbC5sZXZlbCA9ICAoKHJzc2kgKyBvbGQpLzIpOwkJCisJcHJpdi0+d3N0YXRzLnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX0xFVkVMX1VQREFURUQ7CisJcHJpdi0+d3N0YXRzLnF1YWwudXBkYXRlZCAmPSB+SVdfUVVBTF9MRVZFTF9JTlZBTElEOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF9zbW9vdGhfcXVhbChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdikKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVfZGlmZiA9IChqaWZmaWVzIC0gcHJpdi0+bGFzdF9xdWFsKS9IWjsKKwl3aGlsZSAodGltZV9kaWZmLS0pIHsKKwkJcHJpdi0+bGFzdF9xdWFsICs9IEhaOworCQlwcml2LT53c3RhdHMucXVhbC5xdWFsID0gcHJpdi0+d3N0YXRzLnF1YWwucXVhbC8yOworCQlwcml2LT53c3RhdHMucXVhbC5xdWFsICs9IAorCQkJcHJpdi0+YmVhY29uc190aGlzX3NlYyAqIHByaXYtPmJlYWNvbl9wZXJpb2QgKiAocHJpdi0+d3N0YXRzLnF1YWwubGV2ZWwgKyAxMDApIC8gNDAwMDsKKwkJcHJpdi0+YmVhY29uc190aGlzX3NlYyA9IDA7CisJfQorCXByaXYtPndzdGF0cy5xdWFsLnVwZGF0ZWQgfD0gSVdfUVVBTF9RVUFMX1VQREFURUQ7CisJcHJpdi0+d3N0YXRzLnF1YWwudXBkYXRlZCAmPSB+SVdfUVVBTF9RVUFMX0lOVkFMSUQ7Cit9CisKKy8qIGRlYWxzIHdpdGggaW5jb21pbmcgbWFuYWdtZW50IGZyYW1lcy4gKi8KK3N0YXRpYyB2b2lkIGF0bWVsX21hbmFnZW1lbnRfZnJhbWUoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBpZWVlODAyXzExX2hkciAqaGVhZGVyLCAKKwkJICAgICAgdTE2IGZyYW1lX2xlbiwgdTggcnNzaSkKK3sKKwl1MTYgc3VidHlwZTsKKwkKKwlzd2l0Y2ggKHN1YnR5cGUgPSBsZTE2X3RvX2NwdShoZWFkZXItPmZyYW1lX2N0bCkgJiBJRUVFODAyXzExX0ZDVExfU1RZUEUpIHsKKwljYXNlIEM4MDIxMV9TVUJUWVBFX01HTVRfQkVBQ09OIDoKKwljYXNlIEM4MDIxMV9TVUJUWVBFX01HTVRfUHJvYmVSZXNwb25zZToKKwkJCisJCS8qIGJlYWNvbiBmcmFtZSBoYXMgbXVsdGlwbGUgdmFyaWFibGUtbGVuZ3RoIGZpZWxkcyAtCisJCSAgIG5ldmVyIGxldCBhbiBlbmdpbmVlciBsb29zZSB3aXRoIGEgZGF0YSBzdHJ1Y3R1cmUgZGVzaWduLiAqLworCQl7CisJCQlzdHJ1Y3QgYmVhY29uX2Zvcm1hdCB7CisJCQkJdTY0IHRpbWVzdGFtcDsKKwkJCQl1MTYgaW50ZXJ2YWw7CisJCQkJdTE2IGNhcGFiaWxpdHk7CisJCQkJdTggc3NpZF9lbF9pZDsKKwkJCQl1OCBzc2lkX2xlbmd0aDsKKwkJCQkvKiBzc2lkIGhlcmUgKi8KKwkJCQl1OCByYXRlc19lbF9pZDsKKwkJCQl1OCByYXRlc19sZW5ndGg7CisJCQkJLyogcmF0ZXMgaGVyZSAqLworCQkJCXU4IGRzX2VsX2lkOworCQkJCXU4IGRzX2xlbmd0aDsKKwkJCQkvKiBkcyBoZXJlICovCisJCQl9ICpiZWFjb24gPSAoc3RydWN0IGJlYWNvbl9mb3JtYXQgKilwcml2LT5yeF9idWY7CisJCQkKKwkJCXU4IGNoYW5uZWwsIHJhdGVzX2xlbmd0aCwgc3NpZF9sZW5ndGg7CisJCQl1NjQgdGltZXN0YW1wID0gbGU2NF90b19jcHUoYmVhY29uLT50aW1lc3RhbXApOworCQkJdTE2IGJlYWNvbl9pbnRlcnZhbCA9IGxlMTZfdG9fY3B1KGJlYWNvbi0+aW50ZXJ2YWwpOworCQkJdTE2IGNhcGFiaWxpdHkgPSBsZTE2X3RvX2NwdShiZWFjb24tPmNhcGFiaWxpdHkpOworCQkJdTggKmJlYWNvbnAgPSBwcml2LT5yeF9idWY7CisJCQlzc2lkX2xlbmd0aCA9IGJlYWNvbi0+c3NpZF9sZW5ndGg7CisJCQkvKiB0aGlzIGJsb3dzIGNodW5rcy4gKi8KKwkJCWlmIChmcmFtZV9sZW4gPCAxNCB8fCBmcmFtZV9sZW4gPCBzc2lkX2xlbmd0aCArIDE1KSAKKwkJCQlyZXR1cm47CisJCQlyYXRlc19sZW5ndGggPSBiZWFjb25wW2JlYWNvbi0+c3NpZF9sZW5ndGggKyAxNV07CisJCQlpZiAoZnJhbWVfbGVuIDwgc3NpZF9sZW5ndGggKyByYXRlc19sZW5ndGggKyAxOCkKKwkJCQlyZXR1cm47CisJCQlpZiAoc3NpZF9sZW5ndGggPiAgTUFYX1NTSURfTEVOR1RIKQorCQkJCXJldHVybjsKKwkJCWNoYW5uZWwgPSBiZWFjb25wW3NzaWRfbGVuZ3RoICsgcmF0ZXNfbGVuZ3RoICsgMThdOworCQkgICAgICAgCisJCQlpZiAocHJpdi0+c3RhdGlvbl9zdGF0ZSA9PSBTVEFUSU9OX1NUQVRFX1JFQURZKSB7CisJCQkJc21vb3RoX3Jzc2kocHJpdiwgcnNzaSk7CisJCQkJaWYgKGlzX2ZyYW1lX2Zyb21fY3VycmVudF9ic3MocHJpdiwgaGVhZGVyKSkgeyAKKwkJCQkJcHJpdi0+YmVhY29uc190aGlzX3NlYysrOworCQkJCQlhdG1lbF9zbW9vdGhfcXVhbChwcml2KTsKKwkJCQkJaWYgKHByaXYtPmxhc3RfYmVhY29uX3RpbWVzdGFtcCkgeworCQkJCQkJLyogTm90ZSB0cnVuY2F0ZSB0aGlzIHRvIDMyIGJpdHMgLSBrZXJuZWwgY2FuJ3QgZGl2aWRlIGEgbG9uZyBsb25nICovCisJCQkJCQl1MzIgYmVhY29uX2RlbGF5ID0gdGltZXN0YW1wIC0gcHJpdi0+bGFzdF9iZWFjb25fdGltZXN0YW1wOworCQkJCQkJaW50IGJlYWNvbnMgPSBiZWFjb25fZGVsYXkgLyAoYmVhY29uX2ludGVydmFsICogMTAwMCk7CisJCQkJCQlpZiAoYmVhY29ucyA+IDEpCisJCQkJCQkJcHJpdi0+d3N0YXRzLm1pc3MuYmVhY29uICs9IGJlYWNvbnMgLSAxOworCQkJCQl9CisJCQkJCXByaXYtPmxhc3RfYmVhY29uX3RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwkJCQkJaGFuZGxlX2JlYWNvbl9wcm9iZShwcml2LCBjYXBhYmlsaXR5LCBjaGFubmVsKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCWlmIChwcml2LT5zdGF0aW9uX3N0YXRlID09IFNUQVRJT05fU1RBVEVfU0NBTk5JTkcgKSAKKwkJCQlzdG9yZV9ic3NfaW5mbyhwcml2LCBoZWFkZXIsIGNhcGFiaWxpdHksIGJlYWNvbl9pbnRlcnZhbCwgY2hhbm5lbCwKKwkJCQkJICAgICAgIHJzc2ksIHNzaWRfbGVuZ3RoLCAmYmVhY29uLT5yYXRlc19lbF9pZCwKKwkJCQkJICAgICAgIHN1YnR5cGUgPT0gQzgwMjExX1NVQlRZUEVfTUdNVF9CRUFDT04pIDsKKwkJfQorCQlicmVhazsKKwkJCisJY2FzZSBDODAyMTFfU1VCVFlQRV9NR01UX0F1dGhlbnRpY2F0aW9uOgorCisJCWlmIChwcml2LT5zdGF0aW9uX3N0YXRlID09IFNUQVRJT05fU1RBVEVfQVVUSEVOVElDQVRJTkcpCisJCQlhdXRoZW50aWNhdGUocHJpdiwgZnJhbWVfbGVuKTsKKwkKKwkJYnJlYWs7CisJCQorCWNhc2UgQzgwMjExX1NVQlRZUEVfTUdNVF9BU1NfUkVTUE9OU0U6CisJY2FzZSBDODAyMTFfU1VCVFlQRV9NR01UX1JFQVNTX1JFU1BPTlNFOgorCQkKKwkJaWYgKHByaXYtPnN0YXRpb25fc3RhdGUgPT0gU1RBVElPTl9TVEFURV9BU1NPQ0lBVElORyB8fCAKKwkJICAgIHByaXYtPnN0YXRpb25fc3RhdGUgPT0gU1RBVElPTl9TVEFURV9SRUFTU09DSUFUSU5HKQorCQkJYXNzb2NpYXRlKHByaXYsIGZyYW1lX2xlbiwgc3VidHlwZSk7CisJCQorCQlicmVhazsKKworCWNhc2UgQzgwMjExX1NVQlRZUEVfTUdNVF9ESVNBU1NPU0lBVElPTjoKKwkJaWYgKHByaXYtPnN0YXRpb25faXNfYXNzb2NpYXRlZCAmJiAKKwkJICAgIHByaXYtPm9wZXJhdGluZ19tb2RlID09IElXX01PREVfSU5GUkEgJiYgCisJCSAgICBpc19mcmFtZV9mcm9tX2N1cnJlbnRfYnNzKHByaXYsIGhlYWRlcikpIHsKKwkJCXByaXYtPnN0YXRpb25fd2FzX2Fzc29jaWF0ZWQgPSAwOworCQkJcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkID0gMDsKKwkJCQorCQkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9KT0lOTklORyk7CisJCQlqb2luKHByaXYsIEJTU19UWVBFX0lORlJBU1RSVUNUVVJFKTsKKwkJfQorCQkKKwkJYnJlYWs7CisKKwljYXNlIEM4MDIxMV9TVUJUWVBFX01HTVRfRGVhdXRoZW50aWNhdGlvbjoKKwkJaWYgKHByaXYtPm9wZXJhdGluZ19tb2RlID09IElXX01PREVfSU5GUkEgJiYKKwkJICAgIGlzX2ZyYW1lX2Zyb21fY3VycmVudF9ic3MocHJpdiwgaGVhZGVyKSkgeworCQkJcHJpdi0+c3RhdGlvbl93YXNfYXNzb2NpYXRlZCA9IDA7CisKKwkJCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfSk9JTk5JTkcpOworCQkJam9pbihwcml2LCBCU1NfVFlQRV9JTkZSQVNUUlVDVFVSRSk7CisJCX0KKwkJCisJCWJyZWFrOworCX0KK30KKworLyogcnVuIHdoZW4gdGltZXIgZXhwaXJlcyAqLworc3RhdGljIHZvaWQgYXRtZWxfbWFuYWdlbWVudF90aW1lcih1X2xvbmcgYSkKK3sKKyAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBhOworICBzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgIAorICAvKiBDaGVjayBpZiB0aGUgY2FyZCBoYXMgYmVlbiB5YW5rZWQuICovCisgIGlmIChwcml2LT5jYXJkICYmIHByaXYtPnByZXNlbnRfY2FsbGJhY2sgJiYgCisgICAgICAhKCpwcml2LT5wcmVzZW50X2NhbGxiYWNrKShwcml2LT5jYXJkKSkKKwkgIHJldHVybjsKKyAgCisgIHNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5pcnFsb2NrLCBmbGFncyk7CisKKyAgc3dpdGNoIChwcml2LT5zdGF0aW9uX3N0YXRlKSB7CisJICAKKyAgY2FzZSBTVEFUSU9OX1NUQVRFX0FVVEhFTlRJQ0FUSU5HOgorCSAgaWYgKHByaXYtPkF1dGhlbnRpY2F0aW9uUmVxdWVzdFJldHJ5Q250ID49IE1BWF9BVVRIRU5USUNBVElPTl9SRVRSSUVTKSB7CisJCSAgYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9NR01UX0VSUk9SKTsKKwkJICBwcml2LT5zdGF0aW9uX2lzX2Fzc29jaWF0ZWQgPSAwOworCQkgIHByaXYtPkF1dGhlbnRpY2F0aW9uUmVxdWVzdFJldHJ5Q250ID0gMDsKKwkJICByZXN0YXJ0X3NlYXJjaChwcml2KTsKKwkgIH0gZWxzZSB7CisJCSAgcHJpdi0+QXV0aGVudGljYXRpb25SZXF1ZXN0UmV0cnlDbnQrKzsKKwkJICBwcml2LT5DdXJyZW50QXV0aGVudFRyYW5zYWN0aW9uU2VxTnVtID0gMHgwMDAxOworCQkgIG1vZF90aW1lcigmcHJpdi0+bWFuYWdlbWVudF90aW1lciwgamlmZmllcyArIE1HTVRfSklGRklFUyk7CisJCSAgc2VuZF9hdXRoZW50aWNhdGlvbl9yZXF1ZXN0KHByaXYsIE5VTEwsIDApOworCSAgfQorCSAgCisJICBicmVhazsKKworICBjYXNlIFNUQVRJT05fU1RBVEVfQVNTT0NJQVRJTkc6CisJICBpZiAocHJpdi0+QXNzb2NpYXRpb25SZXF1ZXN0UmV0cnlDbnQgPT0gTUFYX0FTU09DSUFUSU9OX1JFVFJJRVMpIHsKKwkJICBhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX01HTVRfRVJST1IpOworCQkgIHByaXYtPnN0YXRpb25faXNfYXNzb2NpYXRlZCA9IDA7CisJCSAgcHJpdi0+QXNzb2NpYXRpb25SZXF1ZXN0UmV0cnlDbnQgPSAwOworCQkgIHJlc3RhcnRfc2VhcmNoKHByaXYpOworCSAgfSBlbHNlIHsKKwkJICBwcml2LT5Bc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCsrOworCQkgIG1vZF90aW1lcigmcHJpdi0+bWFuYWdlbWVudF90aW1lciwgamlmZmllcyArIE1HTVRfSklGRklFUyk7CisJCSAgc2VuZF9hc3NvY2lhdGlvbl9yZXF1ZXN0KHByaXYsIDApOworCSAgfQorCisJICBicmVhazsKKwkJICAKKyAgY2FzZSBTVEFUSU9OX1NUQVRFX1JFQVNTT0NJQVRJTkc6CQorCSAgaWYgKHByaXYtPlJlQXNzb2NpYXRpb25SZXF1ZXN0UmV0cnlDbnQgPT0gTUFYX0FTU09DSUFUSU9OX1JFVFJJRVMpIHsKKwkJICBhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX01HTVRfRVJST1IpOworCQkgIHByaXYtPnN0YXRpb25faXNfYXNzb2NpYXRlZCA9IDA7CisJCSAgcHJpdi0+UmVBc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCA9IDA7CisJCSAgcmVzdGFydF9zZWFyY2gocHJpdik7CisJICB9IGVsc2UgeworCQkgIHByaXYtPlJlQXNzb2NpYXRpb25SZXF1ZXN0UmV0cnlDbnQrKzsKKwkJICBtb2RfdGltZXIoJnByaXYtPm1hbmFnZW1lbnRfdGltZXIsIGppZmZpZXMgKyBNR01UX0pJRkZJRVMpOworCQkgIHNlbmRfYXNzb2NpYXRpb25fcmVxdWVzdChwcml2LCAxKTsKKwkgIH0KKworCSAgYnJlYWs7CisgIAorICBkZWZhdWx0OgorCSAgYnJlYWs7CisgIH0KKyAgCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycWxvY2ssIGZsYWdzKTsKK30KKyAgCitzdGF0aWMgdm9pZCBhdG1lbF9jb21tYW5kX2lycShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdikKK3sKKwl1OCBzdGF0dXMgPSBhdG1lbF9ybWVtOChwcml2LCBhdG1lbF9jbyhwcml2LCBDTURfQkxPQ0tfU1RBVFVTX09GRlNFVCkpOworCXU4IGNvbW1hbmQgPSBhdG1lbF9ybWVtOChwcml2LCBhdG1lbF9jbyhwcml2LCBDTURfQkxPQ0tfQ09NTUFORF9PRkZTRVQpKTsKKwlpbnQgZmFzdF9zY2FuOworCQorCWlmIChzdGF0dXMgPT0gQ01EX1NUQVRVU19JRExFIHx8IAorCSAgICBzdGF0dXMgPT0gQ01EX1NUQVRVU19JTl9QUk9HUkVTUykKKwkJcmV0dXJuOworCisJc3dpdGNoIChjb21tYW5kKXsKKworCWNhc2UgQ01EX1N0YXJ0OgorCQlpZiAoc3RhdHVzID09IENNRF9TVEFUVVNfQ09NUExFVEUpIHsKKwkJCXByaXYtPnN0YXRpb25fd2FzX2Fzc29jaWF0ZWQgPSBwcml2LT5zdGF0aW9uX2lzX2Fzc29jaWF0ZWQ7CisJCQlhdG1lbF9nZXRfbWliKHByaXYsIE1hY19NZ210X01pYl9UeXBlLCBNQUNfTUdNVF9NSUJfQ1VSX0JTU0lEX1BPUywKKwkJCQkgICAgICAodTggKilwcml2LT5DdXJyZW50QlNTSUQsIDYpOworCQkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9SRUFEWSk7CisJCX0JCQkKKwkJYnJlYWs7CisJCQorCWNhc2UgQ01EX1NjYW46CisJCWZhc3Rfc2NhbiA9IHByaXYtPmZhc3Rfc2NhbjsKKwkJcHJpdi0+ZmFzdF9zY2FuID0gMDsKKwkJCisJCWlmIChzdGF0dXMgIT0gQ01EX1NUQVRVU19DT01QTEVURSkgeworCQkJYXRtZWxfc2Nhbihwcml2LCAxKTsKKwkJfSBlbHNlIHsKKwkJCWludCBic3NfaW5kZXggPSByZXRyaWV2ZV9ic3MocHJpdik7CisJCQlpZiAoYnNzX2luZGV4ICE9IC0xKSB7CisJCQkJYXRtZWxfam9pbl9ic3MocHJpdiwgYnNzX2luZGV4KTsKKwkJCX0gZWxzZSBpZiAocHJpdi0+b3BlcmF0aW5nX21vZGUgPT0gSVdfTU9ERV9BREhPQyAmJiAKKwkJCQkgICBwcml2LT5TU0lEX3NpemUgIT0gMCkgeworCQkJCXN0YXJ0KHByaXYsIEJTU19UWVBFX0FEX0hPQyk7CisJCQl9IGVsc2UgeworCQkJCXByaXYtPmZhc3Rfc2NhbiA9ICFmYXN0X3NjYW47CisJCQkJYXRtZWxfc2Nhbihwcml2LCAxKTsKKwkJCX0KKwkJCXByaXYtPnNpdGVfc3VydmV5X3N0YXRlID0gU0lURV9TVVJWRVlfQ09NUExFVEVEOworCQl9CisJCWJyZWFrOworCQkKKwljYXNlIENNRF9TaXRlU3VydmV5OgorCQlwcml2LT5mYXN0X3NjYW4gPSAwOworCQkKKwkJaWYgKHN0YXR1cyAhPSBDTURfU1RBVFVTX0NPTVBMRVRFKQorCQkJcmV0dXJuOworCQkKKwkJcHJpdi0+c2l0ZV9zdXJ2ZXlfc3RhdGUgPSBTSVRFX1NVUlZFWV9DT01QTEVURUQ7CisJCWlmIChwcml2LT5zdGF0aW9uX2lzX2Fzc29jaWF0ZWQpIHsKKwkJCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfUkVBRFkpOwkJCQkKKwkJfSBlbHNlIHsKKwkJCWF0bWVsX3NjYW4ocHJpdiwgMSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIENNRF9Kb2luOgorCQlpZiAoc3RhdHVzID09IENNRF9TVEFUVVNfQ09NUExFVEUpIHsKKwkJCWlmIChwcml2LT5vcGVyYXRpbmdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7CisJCQkJcHJpdi0+c3RhdGlvbl93YXNfYXNzb2NpYXRlZCA9IHByaXYtPnN0YXRpb25faXNfYXNzb2NpYXRlZDsKKwkJCQlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX1JFQURZKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpdi0+QXV0aGVudGljYXRpb25SZXF1ZXN0UmV0cnlDbnQgPSAwOworCQkJCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfQVVUSEVOVElDQVRJTkcpOworCQkJCQorCQkJCW1vZF90aW1lcigmcHJpdi0+bWFuYWdlbWVudF90aW1lciwgamlmZmllcyArIE1HTVRfSklGRklFUyk7CisJCQkJcHJpdi0+Q3VycmVudEF1dGhlbnRUcmFuc2FjdGlvblNlcU51bSA9IDB4MDAwMTsKKwkJCQlzZW5kX2F1dGhlbnRpY2F0aW9uX3JlcXVlc3QocHJpdiwgTlVMTCwgMCk7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWF0bWVsX3NjYW4ocHJpdiwgMSk7CisJCQorCX0KK30KKworc3RhdGljIGludCBhdG1lbF93YWtldXBfZmlybXdhcmUoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYpCit7CisJc3RydWN0IGhvc3RfaW5mb19zdHJ1Y3QgKmlmYWNlID0gJnByaXYtPmhvc3RfaW5mbzsKKwl1MTYgbXIxLCBtcjM7CisJaW50IGk7CisKKwlpZiAocHJpdi0+Y2FyZF90eXBlID09IENBUkRfVFlQRV9TUElfRkxBU0gpCisJCWF0bWVsX3NldF9nY3IocHJpdi0+ZGV2LCBHQ1JfUkVNQVApOworCQorCS8qIHdha2UgdXAgb24tYm9hcmQgcHJvY2Vzc29yICovCisJYXRtZWxfY2xlYXJfZ2NyKHByaXYtPmRldiwgMHgwMDQwKTsKKwlhdG1lbF93cml0ZTE2KHByaXYtPmRldiwgQlNSLCBCU1NfU1JBTSk7CisJCisJaWYgKHByaXYtPmNhcmRfdHlwZSA9PSBDQVJEX1RZUEVfU1BJX0ZMQVNIKQorCQltZGVsYXkoMTAwKTsKKworCS8qIGFuZCB3YWl0IGZvciBpdCAqLworCWZvciAoaSA9ICBMT09QX1JFVFJZX0xJTUlUOyBpOyBpLS0pIHsKKwkJbXIxID0gYXRtZWxfcmVhZDE2KHByaXYtPmRldiwgTVIxKTsKKwkJbXIzID0gYXRtZWxfcmVhZDE2KHByaXYtPmRldiwgTVIzKTsKKwkJCisJCWlmIChtcjMgJiBNQUNfQk9PVF9DT01QTEVURSkgCisJCQlicmVhazsKKwkJaWYgKG1yMSAmIE1BQ19CT09UX0NPTVBMRVRFICYmCisJCSAgICBwcml2LT5idXNfdHlwZSA9PSBCVVNfVFlQRV9QQ0NBUkQpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0FMRVJUICIlczogTUFDIGZhaWxlZCB0byBib290LlxuIiwgcHJpdi0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCQkKKwlpZiAoKHByaXYtPmhvc3RfaW5mb19iYXNlID0gYXRtZWxfcmVhZDE2KHByaXYtPmRldiwgTVIyKSkgPT0gMHhmZmZmKSB7CisJCXByaW50ayhLRVJOX0FMRVJUICIlczogY2FyZCBtaXNzaW5nLlxuIiwgcHJpdi0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCS8qIG5vdyBjaGVjayBmb3IgY29tcGxldGlvbiBvZiBNQUMgaW5pdGlhbGl6YXRpb24gdGhyb3VnaCAgCisJICAgdGhlIEZ1bkN0cmwgZmllbGQgb2YgdGhlIElGQUNFLCBwb2xsIE1SMSB0byBkZXRlY3QgY29tcGxldGlvbiBvZgkgIAorCSAgIE1BQyBpbml0aWFsaXphdGlvbiwgY2hlY2sgY29tcGxldGlvbiBzdGF0dXMsIHNldCBpbnRlcnJ1cHQgbWFzaywgIAorCSAgIGVuYWJsZXMgaW50ZXJydXB0cyBhbmQgY2FsbHMgVHggYW5kIFJ4IGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyAqLyAgCisJCisJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfaGkocHJpdiwgSUZBQ0VfRlVOQ19DVFJMX09GRlNFVCksIEZVTkNfQ1RSTF9JTklUX0NPTVBMRVRFKTsKKwkKKwlmb3IgKGkgPSAgTE9PUF9SRVRSWV9MSU1JVDsgaTsgaS0tKSB7CisJCW1yMSA9IGF0bWVsX3JlYWQxNihwcml2LT5kZXYsIE1SMSk7CisJCW1yMyA9IGF0bWVsX3JlYWQxNihwcml2LT5kZXYsIE1SMyk7CisJCQorCQlpZiAobXIzICYgTUFDX0lOSVRfQ09NUExFVEUpIAorCQkJYnJlYWs7CisJCWlmIChtcjEgJiBNQUNfSU5JVF9DT01QTEVURSAmJgorCQkgICAgcHJpdi0+YnVzX3R5cGUgPT0gQlVTX1RZUEVfUENDQVJEKQorCQkJYnJlYWs7CisJfQorCQorCWlmIChpID09IDApIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBNQUMgZmFpbGVkIHRvIGluaXRpYWxpc2UuXG4iLCBwcml2LT5kZXYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJCisJLyogQ2hlY2sgZm9yIE1BQ19JTklUX09LIG9ubHkgb24gdGhlIHJlZ2lzdGVyIHRoYXQgdGhlIE1BQ19JTklUX09LIHdhcyBzZXQgKi8KKwlpZiAoKG1yMyAmIE1BQ19JTklUX0NPTVBMRVRFKSAmJgorCSAgICAhKGF0bWVsX3JlYWQxNihwcml2LT5kZXYsIE1SMykgJiBNQUNfSU5JVF9PSykpIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBNQUMgZmFpbGVkIE1SMyBzZWxmLXRlc3QuXG4iLCBwcml2LT5kZXYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKChtcjEgJiBNQUNfSU5JVF9DT01QTEVURSkgJiYKKwkgICAgIShhdG1lbF9yZWFkMTYocHJpdi0+ZGV2LCBNUjEpICYgTUFDX0lOSVRfT0spKSB7CisJCXByaW50ayhLRVJOX0FMRVJUICIlczogTUFDIGZhaWxlZCBNUjEgc2VsZi10ZXN0LlxuIiwgcHJpdi0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYXRtZWxfY29weV90b19ob3N0KHByaXYtPmRldiwgKHVuc2lnbmVkIGNoYXIgKilpZmFjZSwgCisJCQkgICBwcml2LT5ob3N0X2luZm9fYmFzZSwgc2l6ZW9mKCppZmFjZSkpOworICAgICAgICAKKwlpZmFjZS0+dHhfYnVmZl9wb3MgPSBsZTE2X3RvX2NwdShpZmFjZS0+dHhfYnVmZl9wb3MpOworCWlmYWNlLT50eF9idWZmX3NpemUgPSBsZTE2X3RvX2NwdShpZmFjZS0+dHhfYnVmZl9zaXplKTsKKwlpZmFjZS0+dHhfZGVzY19wb3MgPSBsZTE2X3RvX2NwdShpZmFjZS0+dHhfZGVzY19wb3MpOworCWlmYWNlLT50eF9kZXNjX2NvdW50ID0gbGUxNl90b19jcHUoaWZhY2UtPnR4X2Rlc2NfY291bnQpOworCWlmYWNlLT5yeF9idWZmX3BvcyA9IGxlMTZfdG9fY3B1KGlmYWNlLT5yeF9idWZmX3Bvcyk7CisJaWZhY2UtPnJ4X2J1ZmZfc2l6ZSA9IGxlMTZfdG9fY3B1KGlmYWNlLT5yeF9idWZmX3NpemUpOworCWlmYWNlLT5yeF9kZXNjX3BvcyA9IGxlMTZfdG9fY3B1KGlmYWNlLT5yeF9kZXNjX3Bvcyk7CisJaWZhY2UtPnJ4X2Rlc2NfY291bnQgPSBsZTE2X3RvX2NwdShpZmFjZS0+cnhfZGVzY19jb3VudCk7CisJaWZhY2UtPmJ1aWxkX3ZlcnNpb24gPSBsZTE2X3RvX2NwdShpZmFjZS0+YnVpbGRfdmVyc2lvbik7CisJaWZhY2UtPmNvbW1hbmRfcG9zID0gbGUxNl90b19jcHUoaWZhY2UtPmNvbW1hbmRfcG9zKTsKKwlpZmFjZS0+bWFqb3JfdmVyc2lvbiA9IGxlMTZfdG9fY3B1KGlmYWNlLT5tYWpvcl92ZXJzaW9uKTsKKwlpZmFjZS0+bWlub3JfdmVyc2lvbiA9IGxlMTZfdG9fY3B1KGlmYWNlLT5taW5vcl92ZXJzaW9uKTsKKwlpZmFjZS0+ZnVuY19jdHJsID0gbGUxNl90b19jcHUoaWZhY2UtPmZ1bmNfY3RybCk7CisJaWZhY2UtPm1hY19zdGF0dXMgPSBsZTE2X3RvX2NwdShpZmFjZS0+bWFjX3N0YXR1cyk7CisKKwlyZXR1cm4gMTsKK30KKworLyogZGV0ZXJtaW5lIHR5cGUgb2YgbWVtb3J5IGFuZCBNQUMgYWRkcmVzcyAqLworc3RhdGljIGludCBwcm9iZV9hdG1lbF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJIAorCS8qIHJlc2V0IHBjY2FyZCAqLworCWlmIChwcml2LT5idXNfdHlwZSA9PSBCVVNfVFlQRV9QQ0NBUkQpIAorCQlhdG1lbF93cml0ZTE2KGRldiwgR0NSLCAweDAwNjApOworCQorCWF0bWVsX3dyaXRlMTYoZGV2LCBHQ1IsIDB4MDA0MCk7CisJbWRlbGF5KDUwMCk7CisJCisJaWYgKGF0bWVsX3JlYWQxNihkZXYsIE1SMikgPT0gMCkgeworCQkvKiBObyBzdG9yZWQgZmlybXdhcmUgc28gbG9hZCBhIHNtYWxsIHN0dWIgd2hpY2gganVzdCAKKwkJICAgdGVsbHMgdXMgdGhlIE1BQyBhZGRyZXNzICovCisJCWludCBpOworCQlwcml2LT5jYXJkX3R5cGUgPSBDQVJEX1RZUEVfRUVQUk9NOworCQlhdG1lbF93cml0ZTE2KGRldiwgQlNSLCBCU1NfSVJBTSk7CisJCWF0bWVsX2NvcHlfdG9fY2FyZChkZXYsIDAsIG1hY19yZWFkZXIsIHNpemVvZihtYWNfcmVhZGVyKSk7CisJCWF0bWVsX3NldF9nY3IoZGV2LCBHQ1JfUkVNQVApOworCQlhdG1lbF9jbGVhcl9nY3IocHJpdi0+ZGV2LCAweDAwNDApOworCQlhdG1lbF93cml0ZTE2KGRldiwgQlNSLCBCU1NfU1JBTSk7CisJCWZvciAoaSA9ICBMT09QX1JFVFJZX0xJTUlUOyBpOyBpLS0pIAorCQkJaWYgKGF0bWVsX3JlYWQxNihkZXYsIE1SMykgJiBNQUNfQk9PVF9DT01QTEVURSkKKwkJCQlicmVhazsKKwkJaWYgKGkgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBNQUMgZmFpbGVkIHRvIGJvb3QgTUFDIGFkZHJlc3MgcmVhZGVyLlxuIiwgZGV2LT5uYW1lKTsKKwkJfSBlbHNlIHsKKwkJCWF0bWVsX2NvcHlfdG9faG9zdChkZXYsIGRldi0+ZGV2X2FkZHIsIGF0bWVsX3JlYWQxNihkZXYsIE1SMiksIDYpOworCQkJLyogZ290IGFkZHJlc3MsIG5vdyBzcXVhc2ggaXQgYWdhaW4gdW50aWwgdGhlIG5ldHdvcmsKKwkJCSAgIGludGVyZmFjZSBpcyBvcGVuZWQgKi8KKwkJCWlmIChwcml2LT5idXNfdHlwZSA9PSBCVVNfVFlQRV9QQ0NBUkQpIAorCQkJCWF0bWVsX3dyaXRlMTYoZGV2LCBHQ1IsIDB4MDA2MCk7CisJCQlhdG1lbF93cml0ZTE2KGRldiwgR0NSLCAweDAwNDApOworCQkJcmMgPSAxOworCQl9CisJfSBlbHNlIGlmIChhdG1lbF9yZWFkMTYoZGV2LCBNUjQpID09IDApIHsKKwkJLyogTWFjIGFkZHJlc3MgZWFzeSBpbiB0aGlzIGNhc2UuICovCisJCXByaXYtPmNhcmRfdHlwZSA9IENBUkRfVFlQRV9QQVJBTExFTF9GTEFTSDsKKwkJYXRtZWxfd3JpdGUxNihkZXYsICBCU1IsIDEpOwkKKwkJYXRtZWxfY29weV90b19ob3N0KGRldiwgZGV2LT5kZXZfYWRkciwgMHhjMDAwLCA2KTsKKwkJYXRtZWxfd3JpdGUxNihkZXYsICBCU1IsIDB4MjAwKTsKKwkJcmMgPSAxOworCX0gZWxzZSB7CisJCS8qIFN0YW5kYXJkIGZpcm13YXJlIGluIGZsYXNoLCBib290IGl0IHVwIGFuZCBhc2sKKwkJICAgZm9yIHRoZSBNYWMgQWRkcmVzcyAqLworCQlwcml2LT5jYXJkX3R5cGUgPSBDQVJEX1RZUEVfU1BJX0ZMQVNIOworCQlpZiAoYXRtZWxfd2FrZXVwX2Zpcm13YXJlKHByaXYpKSB7CisJCQlhdG1lbF9nZXRfbWliKHByaXYsIE1hY19BZGRyZXNzX01pYl9UeXBlLCAwLCBkZXYtPmRldl9hZGRyLCA2KTsKKwkJCQorCQkJLyogZ290IGFkZHJlc3MsIG5vdyBzcXVhc2ggaXQgYWdhaW4gdW50aWwgdGhlIG5ldHdvcmsKKwkJCSAgIGludGVyZmFjZSBpcyBvcGVuZWQgKi8KKwkJCWlmIChwcml2LT5idXNfdHlwZSA9PSBCVVNfVFlQRV9QQ0NBUkQpIAorCQkJCWF0bWVsX3dyaXRlMTYoZGV2LCBHQ1IsIDB4MDA2MCk7CisJCQlhdG1lbF93cml0ZTE2KGRldiwgR0NSLCAweDAwNDApOworCQkJcmMgPSAxOworCQl9CisJfQorCQorCWlmIChyYykgeworCQlpZiAoZGV2LT5kZXZfYWRkclswXSA9PSAweEZGKSB7CisJCQl1OCBkZWZhdWx0X21hY1tdID0gezB4MDAsMHgwNCwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMH07CisJCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6ICoqKiBJbnZhbGlkIE1BQyBhZGRyZXNzLiBVUEdSQURFIEZpcm13YXJlICoqKipcbiIsIGRldi0+bmFtZSk7CisJCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgZGVmYXVsdF9tYWMsIDYpOworCQl9CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNQUMgYWRkcmVzcyAlLjJ4OiUuMng6JS4yeDolLjJ4OiUuMng6JS4yeFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwKKwkJICAgICAgIGRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sIGRldi0+ZGV2X2FkZHJbMl0sCisJCSAgICAgICBkZXYtPmRldl9hZGRyWzNdLCBkZXYtPmRldl9hZGRyWzRdLCBkZXYtPmRldl9hZGRyWzVdICk7CisJCQorCX0KKwkKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX3dlcF9taWIoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYpCisvKiBNb3ZlIHRoZSBlbmN5cHRpb24gaW5mb3JtYXRpb24gb24gdGhlIE1JQiBzdHJ1Y3R1cmUuCisgICBUaGlzIHJvdXRpbmUgaXMgZm9yIHRoZSBwcmUtV1BBIGZpcm13YXJlOiBsYXRlciBmaXJtd2FyZSBoYXMKKyAgIGEgZGlmZmVyZW50IGZvcm1hdCBNSUIgYW5kIGEgZGlmZmVyZW50IHJvdXRpbmUuICovCit7CisJc3RydWN0IHsgLyogTkIgdGhpcyBpcyBtYXRjaGVkIHRvIHRoZSBoYXJkd2FyZSwgZG9uJ3QgY2hhbmdlLiAqLworCQl1OCB3ZXBfaXNfb247ICAgICAgICAgICAgICAgICAKKwkJdTggZGVmYXVsdF9rZXk7IC8qIDAuLjMgKi8KKwkJdTggcmVzZXJ2ZWQ7CisJCXU4IGV4Y2x1ZGVfdW5lbmNyeXB0ZWQ7CisJCQorCQl1MzIgV0VQSUNWX2Vycm9yX2NvdW50OworCQl1MzIgV0VQX2V4Y2x1ZGVkX2NvdW50OworCQkKKwkJdTggd2VwX2tleXNbTUFYX0VOQ1JZUFRJT05fS0VZU11bMTNdOworIAkJdTggZW5jcnlwdGlvbl9sZXZlbDsgLyogMCwgMSwgMiAqLworCQl1OCByZXNlcnZlZDJbM107IAorCX0gbWliOworCWludCBpOworCisJbWliLndlcF9pc19vbiA9IHByaXYtPndlcF9pc19vbjsKKwlpZiAocHJpdi0+d2VwX2lzX29uKSB7CisJCWlmIChwcml2LT53ZXBfa2V5X2xlbltwcml2LT5kZWZhdWx0X2tleV0gPiA1KQorCQkJbWliLmVuY3J5cHRpb25fbGV2ZWwgPSAyOworCQllbHNlCisJCQltaWIuZW5jcnlwdGlvbl9sZXZlbCA9IDE7CQorCX0gZWxzZSB7CisJCW1pYi5lbmNyeXB0aW9uX2xldmVsID0gMDsKKwl9CisKKwltaWIuZGVmYXVsdF9rZXkgPSBwcml2LT5kZWZhdWx0X2tleTsKKwltaWIuZXhjbHVkZV91bmVuY3J5cHRlZCA9IHByaXYtPmV4Y2x1ZGVfdW5lbmNyeXB0ZWQ7CisJCisJZm9yKGkgPSAwOyBpIDwgTUFYX0VOQ1JZUFRJT05fS0VZUzsgIGkrKykKKwkJbWVtY3B5KG1pYi53ZXBfa2V5c1tpXSwgcHJpdi0+d2VwX2tleXNbaV0sIDEzKTsKKwkJCisJYXRtZWxfc2V0X21pYihwcml2LCBNYWNfV2VwX01pYl9UeXBlLCAwLCAodTggKikmbWliLCBzaXplb2YobWliKSk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX3dwYV9taWIoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYpCit7CisJLyogVGhpcyBpcyBmb3IgdGhlIGxhdGVyIChXUEEgZW5hYmxlZCkgZmlybXdhcmUuICovCSAgIAorCisJc3RydWN0IHsgLyogTkIgdGhpcyBpcyBtYXRjaGVkIHRvIHRoZSBoYXJkd2FyZSwgZG9uJ3QgY2hhbmdlLiAqLworCQl1OCBjaXBoZXJfZGVmYXVsdF9rZXlfdmFsdWVbTUFYX0VOQ1JZUFRJT05fS0VZU11bTUFYX0VOQ1JZUFRJT05fS0VZX1NJWkVdOworCQl1OCByZWNlaXZlcl9hZGRyZXNzWzZdOworCQl1OCB3ZXBfaXNfb247ICAgICAgICAgICAgICAgICAKKwkJdTggZGVmYXVsdF9rZXk7IC8qIDAuLjMgKi8KKwkJdTggZ3JvdXBfa2V5OworCQl1OCBleGNsdWRlX3VuZW5jcnlwdGVkOworCQl1OCBlbmNyeXB0aW9uX3R5cGU7CisJCXU4IHJlc2VydmVkOworCQkKKwkJdTMyIFdFUElDVl9lcnJvcl9jb3VudDsKKwkJdTMyIFdFUF9leGNsdWRlZF9jb3VudDsKKwkJCisJCXU4IGtleV9SU0NbNF1bOF07CisJfSBtaWI7CisJCisJaW50IGk7CisKKwltaWIud2VwX2lzX29uID0gcHJpdi0+d2VwX2lzX29uOworCW1pYi5leGNsdWRlX3VuZW5jcnlwdGVkID0gcHJpdi0+ZXhjbHVkZV91bmVuY3J5cHRlZDsKKwltZW1jcHkobWliLnJlY2VpdmVyX2FkZHJlc3MsIHByaXYtPkN1cnJlbnRCU1NJRCwgNik7CisJCisJLyogemVybyBhbGwgdGhlIGtleXMgYmVmb3JlIGFkZGluZyBpbiB2YWxpZCBvbmVzLiAqLworCW1lbXNldChtaWIuY2lwaGVyX2RlZmF1bHRfa2V5X3ZhbHVlLCAwLCBzaXplb2YobWliLmNpcGhlcl9kZWZhdWx0X2tleV92YWx1ZSkpOworCQorCWlmIChwcml2LT53ZXBfaXNfb24pIHsKKwkJLyogVGhlcmUncyBhIGNvbW1lbnQgaW4gdGhlIEF0bWVsIGNvZGUgdG8gdGhlIGVmZmVjdCB0aGF0IHRoaXMgaXMgb25seSB2YWxpZAorCQkgICB3aGVuIHN0aWxsIHVzaW5nIFdFUCwgaXQgbWF5IG5lZWQgdG8gYmUgc2V0IHRvIHNvbWV0aGluZyB0byB1c2UgV1BBICovCisJCW1lbXNldChtaWIua2V5X1JTQywgMCwgc2l6ZW9mKG1pYi5rZXlfUlNDKSk7CisJCQorCQltaWIuZGVmYXVsdF9rZXkgPSBtaWIuZ3JvdXBfa2V5ID0gMjU1OworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0VOQ1JZUFRJT05fS0VZUzsgaSsrKSB7CisJCQlpZiAocHJpdi0+d2VwX2tleV9sZW5baV0gPiAwKSB7CisJCQkJbWVtY3B5KG1pYi5jaXBoZXJfZGVmYXVsdF9rZXlfdmFsdWVbaV0sIHByaXYtPndlcF9rZXlzW2ldLCBNQVhfRU5DUllQVElPTl9LRVlfU0laRSk7CisJCQkJaWYgKGkgPT0gcHJpdi0+ZGVmYXVsdF9rZXkpIHsKKwkJCQkJbWliLmRlZmF1bHRfa2V5ID0gaTsKKwkJCQkJbWliLmNpcGhlcl9kZWZhdWx0X2tleV92YWx1ZVtpXVtNQVhfRU5DUllQVElPTl9LRVlfU0laRS0xXSA9IDc7CisJCQkJCW1pYi5jaXBoZXJfZGVmYXVsdF9rZXlfdmFsdWVbaV1bTUFYX0VOQ1JZUFRJT05fS0VZX1NJWkUtMl0gPSBwcml2LT5wYWlyd2lzZV9jaXBoZXJfc3VpdGU7IAorCQkJCX0gZWxzZSB7CisJCQkJCW1pYi5ncm91cF9rZXkgPSBpOworCQkJCQlwcml2LT5ncm91cF9jaXBoZXJfc3VpdGUgPSBwcml2LT5wYWlyd2lzZV9jaXBoZXJfc3VpdGU7CisJCQkJICAgICAgICBtaWIuY2lwaGVyX2RlZmF1bHRfa2V5X3ZhbHVlW2ldW01BWF9FTkNSWVBUSU9OX0tFWV9TSVpFLTFdID0gMTsKKwkJCQkJbWliLmNpcGhlcl9kZWZhdWx0X2tleV92YWx1ZVtpXVtNQVhfRU5DUllQVElPTl9LRVlfU0laRS0yXSA9IHByaXYtPmdyb3VwX2NpcGhlcl9zdWl0ZTsJCisJCQkJfQorCQkJfQorCQl9CisJCWlmIChtaWIuZGVmYXVsdF9rZXkgPT0gMjU1KQorCQkJbWliLmRlZmF1bHRfa2V5ID0gbWliLmdyb3VwX2tleSAhPSAyNTUgPyBtaWIuZ3JvdXBfa2V5IDogMDsKKwkJaWYgKG1pYi5ncm91cF9rZXkgPT0gMjU1KQorCQkJbWliLmdyb3VwX2tleSA9IG1pYi5kZWZhdWx0X2tleTsKKwkJCisJfQorCQorCWF0bWVsX3NldF9taWIocHJpdiwgTWFjX1dlcF9NaWJfVHlwZSwgMCwgKHU4ICopJm1pYiwgc2l6ZW9mKG1pYikpOworfQorCQkJCQkKK3N0YXRpYyBpbnQgcmVzZXRfYXRtZWxfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwkvKiBkbyBldmVyeXRoaW5nIG5lY2Vzc2FyeSB0byB3YWtlIHVwIHRoZSBoYXJkd2FyZSwgaW5jbHVkaW5nCisJICAgd2FpdGluZyBmb3IgdGhlIGxpZ2h0bmluZyBzdHJpa2UgYW5kIHRocm93aW5nIHRoZSBrbmlmZSBzd2l0Y2guLi4uCisKKwkgICBzZXQgYWxsIHRoZSBNaWIgdmFsdWVzIHdoaWNoIG1hdHRlciBpbiB0aGUgY2FyZCB0byBtYXRjaCAKKwkgICB0aGVpciBzZXR0aW5ncyBpbiB0aGUgYXRtZWxfcHJpdmF0ZSBzdHJ1Y3R1cmUuIFNvbWUgb2YgdGhlc2UKKwkgICBjYW4gYmUgYWx0ZXJlZCBvbiB0aGUgZmx5LCBidXQgbWFueSAoV0VQLCBpbmZyYXN0dWN0dXJlIG9yIGFkLWhvYykKKwkgICBjYW4gb25seSBiZSBjaGFuZ2VkIGJ5IHRlYXJpbmcgZG93biB0aGUgd29ybGQgYW5kIGNvbWluZyBiYWNrIHRocm91Z2gKKwkgICBoZXJlLgorCisJICAgVGhpcyByb3V0aW5lIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGluaXRpYWxpc2luZyBzb21lIAorCSAgIGhhcmR3YXJlLXNwZWNpZmljIGZpZWxkcyBpbiB0aGUgYXRtZWxfcHJpdmF0ZSBzdHJ1Y3R1cmUsIAorCSAgIGluY2x1ZGluZyBhIGNvcHkgb2YgdGhlIGZpcm13YXJlJ3MgaG9zdGluZm8gc3R1Y3R1cmUKKwkgICB3aGljaCBpcyB0aGUgcm91dGUgaW50byB0aGUgcmVzdCBvZiB0aGUgZmlybWFyZSBkYXRhc3RydWN0dXJlcy4gKi8KKworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1OCBjb25maWd1cmF0aW9uOworCQorCS8qIGRhdGEgdG8gYWRkIHRvIHRoZSBmaXJtd2FyZSBuYW1lcywgaW4gcHJpb3JpdHkgb3JkZXIKKwkgICB0aGlzIGltcGxlbWVuZW50cyBmaXJtd2FyZSB2ZXJzaW9uaW5nICovCisJCisJc3RhdGljIGNoYXIgKmZpcm13YXJlX21vZGlmaWVyW10gPSB7CisJCSItd3BhIiwKKwkJIiIsCisJCU5VTEwKKwl9OworCQkKKwkvKiByZXNldCBwY2NhcmQgKi8KKwlpZiAocHJpdi0+YnVzX3R5cGUgPT0gQlVTX1RZUEVfUENDQVJEKSAKKwkJYXRtZWxfd3JpdGUxNihwcml2LT5kZXYsIEdDUiwgMHgwMDYwKTsKKwkJCisJLyogc3RvcCBjYXJkICwgZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJYXRtZWxfd3JpdGUxNihwcml2LT5kZXYsIEdDUiwgMHgwMDQwKTsKKwkJCisJaWYgKHByaXYtPmNhcmRfdHlwZSA9PSBDQVJEX1RZUEVfRUVQUk9NKSB7CisJCS8qIGNvcHkgaW4gZmlybXdhcmUgaWYgbmVlZGVkICovCisJCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnkgPSBOVUxMOworCQl1bnNpZ25lZCBjaGFyICpmdzsKKwkJaW50IGxlbiA9IHByaXYtPmZpcm13YXJlX2xlbmd0aDsKKwkJaWYgKCEoZncgPSBwcml2LT5maXJtd2FyZSkpIHsKKwkJCWlmIChwcml2LT5maXJtd2FyZV90eXBlID09IEFUTUVMX0ZXX1RZUEVfTk9ORSkgeworCQkJCWlmIChzdHJsZW4ocHJpdi0+ZmlybXdhcmVfaWQpID09IDApIHsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkgICAgICAgIiVzOiBjYXJkIHR5cGUgaXMgdW5rbm93bjogYXNzdW1pbmcgYXQ3NmM1MDIgZmlybXdhcmUgaXMgT0suXG4iLAorCQkJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkgICAgICAgIiVzOiBpZiBub3QsIHVzZSB0aGUgZmlybXdhcmU9IG1vZHVsZSBwYXJhbWV0ZXIuXG4iLCAKKwkJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJCXN0cmNweShwcml2LT5maXJtd2FyZV9pZCwgImF0bWVsX2F0NzZjNTAyLmJpbiIpOworCQkJCX0KKwkJCQlpZiAocmVxdWVzdF9maXJtd2FyZSgmZndfZW50cnksIHByaXYtPmZpcm13YXJlX2lkLCBwcml2LT5zeXNfZGV2KSAhPSAwKSB7CisJCQkJCXByaW50ayhLRVJOX0FMRVJUIAorCQkJCQkgICAgICAgIiVzOiBmaXJtd2FyZSAlcyBpcyBtaXNzaW5nLCBjYW5ub3QgY29udGludWUuXG4iLCAKKwkJCQkJICAgICAgIGRldi0+bmFtZSwgcHJpdi0+ZmlybXdhcmVfaWQpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWludCBmd19pbmRleCA9IDA7CisJCQkJaW50IHN1Y2Nlc3MgPSAwOworCisJCQkJLyogZ2V0IGZpcm13YXJlIGZpbGVuYW1lIGVudHJ5IGJhc2VkIG9uIGZpcm13YXJlIHR5cGUgSUQgKi8KKwkJCQl3aGlsZSAoZndfdGFibGVbZndfaW5kZXhdLmZ3X3R5cGUgIT0gcHJpdi0+ZmlybXdhcmVfdHlwZQorCQkJCQkJJiYgZndfdGFibGVbZndfaW5kZXhdLmZ3X3R5cGUgIT0gQVRNRUxfRldfVFlQRV9OT05FKQorCQkJCQlmd19pbmRleCsrOworCQkJCQorCQkJCS8qIGNvbnN0cnVjdCB0aGUgYWN0dWFsIGZpcm13YXJlIGZpbGUgbmFtZSAqLworCQkJCWlmIChmd190YWJsZVtmd19pbmRleF0uZndfdHlwZSAhPSBBVE1FTF9GV19UWVBFX05PTkUpIHsKKwkJCQkJaW50IGk7CisJCQkJCWZvciAoaSA9IDA7IGZpcm13YXJlX21vZGlmaWVyW2ldOyBpKyspIHsKKwkJCQkJCXNucHJpbnRmKHByaXYtPmZpcm13YXJlX2lkLCAzMiwgIiVzJXMuJXMiLCBmd190YWJsZVtmd19pbmRleF0uZndfZmlsZSwKKwkJCQkJCQlmaXJtd2FyZV9tb2RpZmllcltpXSwgZndfdGFibGVbZndfaW5kZXhdLmZ3X2ZpbGVfZXh0KTsKKwkJCQkJCXByaXYtPmZpcm13YXJlX2lkWzMxXSA9ICdcMCc7CisJCQkJCQlpZiAocmVxdWVzdF9maXJtd2FyZSgmZndfZW50cnksIHByaXYtPmZpcm13YXJlX2lkLCBwcml2LT5zeXNfZGV2KSA9PSAwKSB7CisJCQkJCQkJc3VjY2VzcyA9IDE7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCFzdWNjZXNzKSB7CisJCQkJCXByaW50ayhLRVJOX0FMRVJUIAorCQkJCQkgICAgICAgIiVzOiBmaXJtd2FyZSAlcyBpcyBtaXNzaW5nLCBjYW5ub3Qgc3RhcnQuXG4iLCAKKwkJCQkJICAgICAgIGRldi0+bmFtZSwgcHJpdi0+ZmlybXdhcmVfaWQpOworCQkJCQlwcml2LT5maXJtd2FyZV9pZFswXSA9ICdcMCc7CisJCQkJCXJldHVybiAwOwkKKwkJCQl9CisJCQl9CisJCQkKKwkJCWZ3ID0gZndfZW50cnktPmRhdGE7CisJCQlsZW4gPSBmd19lbnRyeS0+c2l6ZTsKKwkJfQorCQkKKwkgICAgICAgIGlmIChsZW4gPD0gMHg2MDAwKSB7CisJCQlhdG1lbF93cml0ZTE2KHByaXYtPmRldiwgQlNSLCBCU1NfSVJBTSk7CisJCQlhdG1lbF9jb3B5X3RvX2NhcmQocHJpdi0+ZGV2LCAwLCBmdywgbGVuKTsKKwkJCWF0bWVsX3NldF9nY3IocHJpdi0+ZGV2LCBHQ1JfUkVNQVApOworCQl9IGVsc2UgeworCQkJLyogUmVtYXAgKi8gCisJCQlhdG1lbF9zZXRfZ2NyKHByaXYtPmRldiwgR0NSX1JFTUFQKTsKKwkJCWF0bWVsX3dyaXRlMTYocHJpdi0+ZGV2LCBCU1IsIEJTU19JUkFNKTsKKwkJCWF0bWVsX2NvcHlfdG9fY2FyZChwcml2LT5kZXYsIDAsIGZ3LCAweDYwMDApOworCQkJYXRtZWxfd3JpdGUxNihwcml2LT5kZXYsIEJTUiwgMHgyZmYpOworCQkJYXRtZWxfY29weV90b19jYXJkKHByaXYtPmRldiwgMHg4MDAwLCAmZndbMHg2MDAwXSwgbGVuIC0gMHg2MDAwKTsKKwkJfQorCisJCWlmIChmd19lbnRyeSkKKwkJCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOworCX0KKworCWlmICghYXRtZWxfd2FrZXVwX2Zpcm13YXJlKHByaXYpKQorCQlyZXR1cm4gMDsKKworCS8qIENoZWNrIHRoZSB2ZXJzaW9uIGFuZCBzZXQgdGhlIGNvcnJlY3QgZmxhZyBmb3Igd3BhIHN0dWZmLAorCSAgIG9sZCBhbmQgbmV3IGZpcm13YXJlIGlzIGluY29tcGF0aWJsZS4KKwkgICBUaGUgcHJlLXdwYSAzY29tIGZpcm13YXJlIHJlcG9ydHMgbWFqb3IgdmVyc2lvbiA1LAorCSAgIHRoZSB3cGEgM2NvbSBmaXJtd2FyZSBpcyBtYWpvciB2ZXJzaW9uIDQgYW5kIGRvZXNuJ3QgbmVlZAorCSAgIHRoZSAzY29tIGJyb2tlbi1uZXNzIGZpbHRlci4gKi8KKwlwcml2LT51c2Vfd3BhID0gKHByaXYtPmhvc3RfaW5mby5tYWpvcl92ZXJzaW9uID09IDQpOworCXByaXYtPnJhZGlvX29uX2Jyb2tlbiA9IChwcml2LT5ob3N0X2luZm8ubWFqb3JfdmVyc2lvbiA9PSA1KTsKKwkKKyAgICAgICAgLyogdW5tYXNrIGFsbCBpcnEgc291cmNlcyAqLworCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX2hpKHByaXYsIElGQUNFX0lOVF9NQVNLX09GRlNFVCksIDB4ZmYpOworCQorCS8qIGludCBUeCBzeXN0ZW0gYW5kIGVuYWJsZSBUeCAqLworCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfRkxBR1NfT0ZGU0VULCAwKSwgMCk7CisJYXRtZWxfd21lbTMyKHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfTkVYVF9PRkZTRVQsIDApLCAweDgwMDAwMDAwTCk7CisJYXRtZWxfd21lbTE2KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfUE9TX09GRlNFVCwgMCksIDApOworCWF0bWVsX3dtZW0xNihwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX1NJWkVfT0ZGU0VULCAwKSwgMCk7CisKKwlwcml2LT50eF9kZXNjX2ZyZWUgPSBwcml2LT5ob3N0X2luZm8udHhfZGVzY19jb3VudDsJCQorCXByaXYtPnR4X2Rlc2NfaGVhZCA9IDA7CQkJCQkJCQkJCisJcHJpdi0+dHhfZGVzY190YWlsID0gMDsJCQkJCQkJCQkKKwlwcml2LT50eF9kZXNjX3ByZXZpb3VzID0gMDsKKwlwcml2LT50eF9mcmVlX21lbSA9IHByaXYtPmhvc3RfaW5mby50eF9idWZmX3NpemU7CisJcHJpdi0+dHhfYnVmZl9oZWFkID0gMDsJCisJcHJpdi0+dHhfYnVmZl90YWlsID0gMDsJCisJCQorCWNvbmZpZ3VyYXRpb24gPSBhdG1lbF9ybWVtOChwcml2LCBhdG1lbF9oaShwcml2LCBJRkFDRV9GVU5DX0NUUkxfT0ZGU0VUKSk7IAorCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX2hpKHByaXYsIElGQUNFX0ZVTkNfQ1RSTF9PRkZTRVQpLCAKKwkJCQkgICBjb25maWd1cmF0aW9uIHwgRlVOQ19DVFJMX1R4RU5BQkxFKTsKKworCS8qIGluaXQgUnggc3lzdGVtIGFuZCBlbmFibGUgKi8KKwlwcml2LT5yeF9kZXNjX2hlYWQgPSAwOworCQorCWNvbmZpZ3VyYXRpb24gPSBhdG1lbF9ybWVtOChwcml2LCBhdG1lbF9oaShwcml2LCBJRkFDRV9GVU5DX0NUUkxfT0ZGU0VUKSk7IAorCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX2hpKHByaXYsIElGQUNFX0ZVTkNfQ1RSTF9PRkZTRVQpLCAKKwkJCQkgICBjb25maWd1cmF0aW9uIHwgRlVOQ19DVFJMX1J4RU5BQkxFKTsKKwkJCQorCWlmICghcHJpdi0+cmFkaW9fb25fYnJva2VuKSB7CisJCWlmIChhdG1lbF9zZW5kX2NvbW1hbmRfd2FpdChwcml2LCBDTURfRW5hYmxlUmFkaW8sIE5VTEwsIDApID09IAorCQkgICAgQ01EX1NUQVRVU19SRUpFQ1RFRF9SQURJT19PRkYpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gCisJCQkgICAgICAgIiVzOiBjYW5ub3QgdHVybiB0aGUgcmFkaW8gb24uIChIZXkgcmFkaW8sIHlvdSdyZSBiZWF1dGlmdWwhKVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJCX0KKwl9CisJCisJLyogc2V0IHVwIGVub3VnaCBNSUIgdmFsdWVzIHRvIHJ1bi4gKi8KKwlhdG1lbF9zZXRfbWliOChwcml2LCBMb2NhbF9NaWJfVHlwZSwgTE9DQUxfTUlCX0FVVE9fVFhfUkFURV9QT1MsIHByaXYtPmF1dG9fdHhfcmF0ZSk7CisJYXRtZWxfc2V0X21pYjgocHJpdiwgTG9jYWxfTWliX1R5cGUsICBMT0NBTF9NSUJfVFhfUFJPTUlTQ1VPVVNfUE9TLCAgUFJPTV9NT0RFX09GRik7CisJYXRtZWxfc2V0X21pYjE2KHByaXYsIE1hY19NaWJfVHlwZSwgTUFDX01JQl9SVFNfVEhSRVNIT0xEX1BPUywgcHJpdi0+cnRzX3RocmVzaG9sZCk7CisJYXRtZWxfc2V0X21pYjE2KHByaXYsIE1hY19NaWJfVHlwZSwgTUFDX01JQl9GUkFHX1RIUkVTSE9MRF9QT1MsIHByaXYtPmZyYWdfdGhyZXNob2xkKTsKKwlhdG1lbF9zZXRfbWliOChwcml2LCBNYWNfTWliX1R5cGUsIE1BQ19NSUJfU0hPUlRfUkVUUllfUE9TLCBwcml2LT5zaG9ydF9yZXRyeSk7CisJYXRtZWxfc2V0X21pYjgocHJpdiwgTWFjX01pYl9UeXBlLCBNQUNfTUlCX0xPTkdfUkVUUllfUE9TLCBwcml2LT5sb25nX3JldHJ5KTsKKwlhdG1lbF9zZXRfbWliOChwcml2LCBMb2NhbF9NaWJfVHlwZSwgTE9DQUxfTUlCX1BSRUFNQkxFX1RZUEUsIHByaXYtPnByZWFtYmxlKTsKKwlhdG1lbF9zZXRfbWliKHByaXYsIE1hY19BZGRyZXNzX01pYl9UeXBlLCBNQUNfQUREUl9NSUJfTUFDX0FERFJfUE9TLCAKKwkJICAgICAgcHJpdi0+ZGV2LT5kZXZfYWRkciwgNik7CisJYXRtZWxfc2V0X21pYjgocHJpdiwgTWFjX01nbXRfTWliX1R5cGUsIE1BQ19NR01UX01JQl9QU19NT0RFX1BPUywgQUNUSVZFX01PREUpOworCWF0bWVsX3NldF9taWIxNihwcml2LCBNYWNfTWdtdF9NaWJfVHlwZSwgTUFDX01HTVRfTUlCX0xJU1RFTl9JTlRFUlZBTF9QT1MsIDEpOworCWF0bWVsX3NldF9taWIxNihwcml2LCBNYWNfTWdtdF9NaWJfVHlwZSwgTUFDX01HTVRfTUlCX0JFQUNPTl9QRVJfUE9TLCBwcml2LT5kZWZhdWx0X2JlYWNvbl9wZXJpb2QpOworCWF0bWVsX3NldF9taWIocHJpdiwgUGh5X01pYl9UeXBlLCBQSFlfTUlCX1JBVEVfU0VUX1BPUywgYXRtZWxfYmFzaWNfcmF0ZXMsIDQpOworCWF0bWVsX3NldF9taWI4KHByaXYsIE1hY19NZ210X01pYl9UeXBlLCBNQUNfTUdNVF9NSUJfQ1VSX1BSSVZBQ1lfUE9TLCBwcml2LT53ZXBfaXNfb24pOworCWlmIChwcml2LT51c2Vfd3BhKQorCQlidWlsZF93cGFfbWliKHByaXYpOworCWVsc2UKKwkJYnVpbGRfd2VwX21pYihwcml2KTsKKwkKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgYXRtZWxfc2VuZF9jb21tYW5kKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgY29tbWFuZCwgdm9pZCAqY21kLCBpbnQgY21kX3NpemUpCit7CisJaWYgKGNtZCkKKwkJYXRtZWxfY29weV90b19jYXJkKHByaXYtPmRldiwgYXRtZWxfY28ocHJpdiwgQ01EX0JMT0NLX1BBUkFNRVRFUlNfT0ZGU0VUKSwgCisJCQkJICAgY21kLCBjbWRfc2l6ZSk7CisJCisJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfY28ocHJpdiwgQ01EX0JMT0NLX0NPTU1BTkRfT0ZGU0VUKSwgY29tbWFuZCk7CisJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfY28ocHJpdiwgQ01EX0JMT0NLX1NUQVRVU19PRkZTRVQpLCAwKTsKK30KKwkKK3N0YXRpYyBpbnQgYXRtZWxfc2VuZF9jb21tYW5kX3dhaXQoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIGludCBjb21tYW5kLCB2b2lkICpjbWQsIGludCBjbWRfc2l6ZSkKK3sKKwlpbnQgaSwgc3RhdHVzOworCQorCWF0bWVsX3NlbmRfY29tbWFuZChwcml2LCBjb21tYW5kLCBjbWQsIGNtZF9zaXplKTsKKwkKKwlmb3IgKGkgPSA1MDAwOyBpOyBpLS0pIHsKKwkJc3RhdHVzID0gYXRtZWxfcm1lbTgocHJpdiwgYXRtZWxfY28ocHJpdiwgQ01EX0JMT0NLX1NUQVRVU19PRkZTRVQpKTsKKwkJaWYgKHN0YXR1cyAhPSBDTURfU1RBVFVTX0lETEUgJiYgCisJCSAgICBzdGF0dXMgIT0gQ01EX1NUQVRVU19JTl9QUk9HUkVTUykKKwkJCWJyZWFrOworCQl1ZGVsYXkoMjApOworCX0KKwkKKwlpZiAoaSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0FMRVJUICIlczogZmFpbGVkIHRvIGNvbnRhY3QgTUFDLlxuIiwgcHJpdi0+ZGV2LT5uYW1lKTsKKwkJc3RhdHVzID0gIENNRF9TVEFUVVNfSE9TVF9FUlJPUjsKKwl9IGVsc2UgeyAKKwkJaWYgKGNvbW1hbmQgIT0gQ01EX0VuYWJsZVJhZGlvKQorCQkJc3RhdHVzID0gQ01EX1NUQVRVU19DT01QTEVURTsKKwl9CisJCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHU4IGF0bWVsX2dldF9taWI4KHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1OCB0eXBlLCB1OCBpbmRleCkKK3sKKwlzdHJ1Y3QgZ2V0X3NldF9taWIgbTsKKwltLnR5cGUgPSB0eXBlOworCW0uc2l6ZSA9IDE7CisJbS5pbmRleCA9IGluZGV4OworCisJYXRtZWxfc2VuZF9jb21tYW5kX3dhaXQocHJpdiwgQ01EX0dldF9NSUJfVmFycywgJm0sIE1JQl9IRUFERVJfU0laRSArIDEpOworCXJldHVybiBhdG1lbF9ybWVtOChwcml2LCBhdG1lbF9jbyhwcml2LCBDTURfQkxPQ0tfUEFSQU1FVEVSU19PRkZTRVQgKyBNSUJfSEVBREVSX1NJWkUpKTsKK30KKworc3RhdGljIHZvaWQgYXRtZWxfc2V0X21pYjgoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHU4IHR5cGUsIHU4IGluZGV4LCB1OCBkYXRhKQoreworCXN0cnVjdCBnZXRfc2V0X21pYiBtOworCW0udHlwZSA9IHR5cGU7CisJbS5zaXplID0gMTsKKwltLmluZGV4ID0gaW5kZXg7CisJbS5kYXRhWzBdID0gZGF0YTsKKworCWF0bWVsX3NlbmRfY29tbWFuZF93YWl0KHByaXYsIENNRF9TZXRfTUlCX1ZhcnMsICZtLCBNSUJfSEVBREVSX1NJWkUgKyAxKTsKK30KKworc3RhdGljIHZvaWQgYXRtZWxfc2V0X21pYjE2KHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1OCB0eXBlLCB1OCBpbmRleCwgdTE2IGRhdGEpCit7CisJc3RydWN0IGdldF9zZXRfbWliIG07CisJbS50eXBlID0gdHlwZTsKKwltLnNpemUgPSAyOworCW0uaW5kZXggPSBpbmRleDsKKwltLmRhdGFbMF0gPSBkYXRhOworCW0uZGF0YVsxXSA9IGRhdGEgPj4gODsKKworCWF0bWVsX3NlbmRfY29tbWFuZF93YWl0KHByaXYsIENNRF9TZXRfTUlCX1ZhcnMsICZtLCBNSUJfSEVBREVSX1NJWkUgKyAyKTsKK30KKworc3RhdGljIHZvaWQgYXRtZWxfc2V0X21pYihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTggdHlwZSwgdTggaW5kZXgsIHU4ICpkYXRhLCBpbnQgZGF0YV9sZW4pCit7CisJc3RydWN0IGdldF9zZXRfbWliIG07CisJbS50eXBlID0gdHlwZTsKKwltLnNpemUgPSBkYXRhX2xlbjsKKwltLmluZGV4ID0gaW5kZXg7CisKKwlpZiAoZGF0YV9sZW4gPiBNSUJfTUFYX0RBVEFfQllURVMpCisJCXByaW50ayhLRVJOX0FMRVJUICIlczogTUlCIGJ1ZmZlciB0b28gc21hbGwuXG4iLCBwcml2LT5kZXYtPm5hbWUpOworCQorCW1lbWNweShtLmRhdGEsIGRhdGEsIGRhdGFfbGVuKTsKKwlhdG1lbF9zZW5kX2NvbW1hbmRfd2FpdChwcml2LCBDTURfU2V0X01JQl9WYXJzLCAmbSwgTUlCX0hFQURFUl9TSVpFICsgZGF0YV9sZW4pOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF9nZXRfbWliKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1OCB0eXBlLCB1OCBpbmRleCwgdTggKmRhdGEsIGludCBkYXRhX2xlbikKK3sKKwlzdHJ1Y3QgZ2V0X3NldF9taWIgbTsKKwltLnR5cGUgPSB0eXBlOworCW0uc2l6ZSA9IGRhdGFfbGVuOworCW0uaW5kZXggPSBpbmRleDsKKwkKKwlpZiAoZGF0YV9sZW4gPiBNSUJfTUFYX0RBVEFfQllURVMpCisJCXByaW50ayhLRVJOX0FMRVJUICIlczogTUlCIGJ1ZmZlciB0b28gc21hbGwuXG4iLCBwcml2LT5kZXYtPm5hbWUpOworCQorCWF0bWVsX3NlbmRfY29tbWFuZF93YWl0KHByaXYsIENNRF9HZXRfTUlCX1ZhcnMsICZtLCBNSUJfSEVBREVSX1NJWkUgKyBkYXRhX2xlbik7CisJYXRtZWxfY29weV90b19ob3N0KHByaXYtPmRldiwgZGF0YSwgCisJCQkgICBhdG1lbF9jbyhwcml2LCBDTURfQkxPQ0tfUEFSQU1FVEVSU19PRkZTRVQgKyBNSUJfSEVBREVSX1NJWkUpLCBkYXRhX2xlbik7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX3dyaXRlQVIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGRhdGEpCit7CisJaW50IGk7CisJb3V0dyhkYXRhLCBkZXYtPmJhc2VfYWRkciArIEFSKTsKKwkvKiBBZGRyZXNzIHJlZ2lzdGVyIGFwcGVhcnMgdG8gbmVlZCBzb21lIGNvbnZpbmNpbmcuLi4uLiAqLworCWZvciAoaSA9IDA7IGRhdGEgIT0gaW53KGRldi0+YmFzZV9hZGRyICsgQVIpICYmIGk8MTA7IGkrKykKKwkJb3V0dyhkYXRhLCBkZXYtPmJhc2VfYWRkciArIEFSKTsKK30KKworc3RhdGljIHZvaWQgYXRtZWxfY29weV90b19jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBkZXN0LCB1bnNpZ25lZCBjaGFyICpzcmMsIHUxNiBsZW4pCit7CisJaW50IGk7CisJYXRtZWxfd3JpdGVBUihkZXYsIGRlc3QpOworCWlmIChkZXN0ICUgMikgeworCQlhdG1lbF93cml0ZTgoZGV2LCBEUiwgKnNyYyk7CisJCXNyYysrOyBsZW4tLTsKKwl9CisJZm9yIChpID0gbGVuOyBpID4gMSA7IGkgLT0gMikgeworCQl1OCBsYiA9ICpzcmMrKzsKKwkJdTggaGIgPSAqc3JjKys7CisJCWF0bWVsX3dyaXRlMTYoZGV2LCBEUiwgbGIgfCAoaGIgPDwgOCkpOworCX0KKwlpZiAoaSkKKwkJYXRtZWxfd3JpdGU4KGRldiwgRFIsICpzcmMpOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF9jb3B5X3RvX2hvc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciAqZGVzdCwgdTE2IHNyYywgdTE2IGxlbikKK3sKKwlpbnQgaTsKKwlhdG1lbF93cml0ZUFSKGRldiwgc3JjKTsKKwlpZiAoc3JjICUgMikgeworCQkqZGVzdCA9IGF0bWVsX3JlYWQ4KGRldiwgRFIpOworCQlkZXN0Kys7IGxlbi0tOworCX0KKwlmb3IgKGkgPSBsZW47IGkgPiAxIDsgaSAtPSAyKSB7CisJCXUxNiBodyA9IGF0bWVsX3JlYWQxNihkZXYsIERSKTsKKwkJKmRlc3QrKyA9IGh3OworCQkqZGVzdCsrID0gaHcgPj4gODsKKwl9CisJaWYgKGkpCisJCSpkZXN0ID0gYXRtZWxfcmVhZDgoZGV2LCBEUik7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX3NldF9nY3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IG1hc2spCit7CisJb3V0dyhpbncoZGV2LT5iYXNlX2FkZHIgKyBHQ1IpIHwgbWFzaywgZGV2LT5iYXNlX2FkZHIgKyBHQ1IpOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF9jbGVhcl9nY3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IG1hc2spCit7CisJb3V0dyhpbncoZGV2LT5iYXNlX2FkZHIgKyBHQ1IpICYgfm1hc2ssIGRldi0+YmFzZV9hZGRyICsgR0NSKTsKK30KKworc3RhdGljIGludCBhdG1lbF9sb2NrX21hYyhzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdikKK3sKKwlpbnQgaSwgaiA9IDIwOworIHJldHJ5OgorCWZvciAoaSA9IDUwMDA7IGk7IGktLSkgeworCQlpZiAoIWF0bWVsX3JtZW04KHByaXYsIGF0bWVsX2hpKHByaXYsIElGQUNFX0xPQ0tPVVRfSE9TVF9PRkZTRVQpKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMjApOworCX0KKwkKKwlpZiAoIWkpIHJldHVybiAwOyAvKiB0aW1lZCBvdXQgKi8KKwkKKwlhdG1lbF93bWVtOChwcml2LCBhdG1lbF9oaShwcml2LCBJRkFDRV9MT0NLT1VUX01BQ19PRkZTRVQpLCAxKTsKKwlpZiAoYXRtZWxfcm1lbTgocHJpdiwgYXRtZWxfaGkocHJpdiwgSUZBQ0VfTE9DS09VVF9IT1NUX09GRlNFVCkpKSB7CisJCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX2hpKHByaXYsIElGQUNFX0xPQ0tPVVRfTUFDX09GRlNFVCksIDApOworCQlpZiAoIWotLSkgcmV0dXJuIDA7IC8qIHRpbWVkIG91dCAqLworCQlnb3RvIHJldHJ5OworCX0KKwkKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgYXRtZWxfd21lbTMyKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1MTYgcG9zLCB1MzIgZGF0YSkKK3sKKyAgICAgICAJYXRtZWxfd3JpdGVBUihwcml2LT5kZXYsIHBvcyk7CQorCWF0bWVsX3dyaXRlMTYocHJpdi0+ZGV2LCBEUiwgZGF0YSk7IC8qIGNhcmQgaXMgbGl0dGxlLWVuZGlhbiAqLworCWF0bWVsX3dyaXRlMTYocHJpdi0+ZGV2LCBEUiwgZGF0YSA+PiAxNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaGVyZSBmb2xsb3dzIHRoZSBzb3VyY2UgZm9ybSBvZiB0aGUgTUFDIGFkZHJlc3MgcmVhZGluZyBmaXJtd2FyZSAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAwCisKKy8qIENvcHlyaWdodCAyMDAzIE1hdHRoZXcgVC4gUnVzc290dG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCdXQgZGVyaXZlZCBmcm9tIHRoZSBBdG1lbCA3NkM1MDIgZmlybXdhcmUgd3JpdHRlbiBieSBBdG1lbCBhbmQgICAgICAgICAqLworLyogaW5jbHVkZWQgaW4gImF0bWVsIHdpcmVsZXNzIGxhbiBkcml2ZXJzIiBwYWNrYWdlICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKgorICAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG5ldC5ydXNzb3R0by5BdG1lbE1BQ0ZXLCBoZXJldG8gcmVmZXJyZWQgdG8KKyAgICBhcyBBdG1lbE1BQ0ZXCisKKyAgICBBdG1lbE1BQ0ZXIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgICAgQXRtZWxNQUNGVyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggQXRtZWxNQUNGVzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoaXMgZmlybXdhcmUgc2hvdWxkIHdvcmsgb24gdGhlIDc2QzUwMiBSRk1ELCBSRk1EX0QsIGFuZCBSRk1EX0UgICAgICAgICovCisvKiBJdCB3aWxsIHByb2JhYmx5IHdvcmsgb24gdGhlIDc2QzUwNCBhbmQgNzZDNTAyIFJGTURfM0NPTSAgICAgICAgICAgICAgICAqLworLyogSXQgb25seSB3b3JrcyBvbiBTUEkgRUVQUk9NIHZlcnNpb25zIG9mIHRoZSBjYXJkLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogVGhpcyBmaXJtd2FyZSBpbml0aWFsaXplcyB0aGUgU1BJIGNvbnRyb2xsZXIgYW5kIGNsb2NrLCByZWFkcyB0aGUgTUFDICAgKi8KKy8qIGFkZHJlc3MgZnJvbSB0aGUgRUVQUk9NIGludG8gU1JBTSwgYW5kIHB1dHMgdGhlIFNSQU0gb2Zmc2V0IG9mIHRoZSBNQUMgICovCisvKiBhZGRyZXNzIGluIE1SMiwgYW5kIHNldHMgTVIzIHRvIDB4MTAgdG8gaW5kaWNhdGUgaXQgaXMgZG9uZSAgICAgICAgICAgICAqLworLyogSXQgYWxzbyBwdXRzIGEgY29tcGxldGUgY29weSBvZiB0aGUgRUVQUk9NIGluIFNSQU0gd2l0aCB0aGUgb2Zmc2V0IGluICAgKi8KKy8qIE1SNCwgZm9yIGludmVzdGlnYXRpb25hbCBwdXJwb3NlcyAobWF5YmUgd2UgY2FuIGRldGVybWluZSBjaGlwIHR5cGUgICAgICovCisvKiBmcm9tIHRoYXQ/KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJLm9yZyAwCisgICAgLnNldCBNUkJBU0UsIDB4ODAwMDAwMAorCS5zZXQgQ1BTUl9JTklUSUFMLCAweEQzIC8qIElSUS9GSVEgZGlzYWJsZWQsIEFSTSBtb2RlLCBTdXBlcnZpc29yIHN0YXRlICovCisJLnNldCBDUFNSX1VTRVIsIDB4RDEgLyogSVJRL0ZJUSBkaXNhYmxlZCwgQVJNIG1vZGUsIFVTRVIgc3RhdGUgKi8KKwkuc2V0IFNSQU1fQkFTRSwgIDB4MDIwMDAwMDAKKwkuc2V0IFNQX0JBU0UsICAgIDB4MEYzMDAwMDAKKwkuc2V0IFVOS19CQVNFLCAgIDB4MEYwMDAwMDAgLyogU29tZSBpbnRlcm5hbCBkZXZpY2UsIGJ1dCB3aGljaCBvbmU/ICovCisJLnNldCBTUElfQ0dFTl9CQVNFLCAgMHgwRTAwMDAwMCAvKiBTb21lIGludGVybmFsIGRldmljZSwgYnV0IHdoaWNoIG9uZT8gKi8KKwkuc2V0IFVOSzNfQkFTRSwgIDB4MDIwMTQwMDAgLyogU29tZSBpbnRlcm5hbCBkZXZpY2UsIGJ1dCB3aGljaCBvbmU/ICovCisJLnNldCBTVEFDS19CQVNFLCAweDU2MDAKKwkuc2V0IFNQX1NSLCAweDEwCisJLnNldCBTUF9URFJFLCAyIC8qIHN0YXR1cyByZWdpc3RlciBiaXQgLS0gVERSIGVtcHR5ICovCisJLnNldCBTUF9SRFJGLCAxIC8qIHN0YXR1cyByZWdpc3RlciBiaXQgLS0gUkRSIGZ1bGwgKi8KKwkuc2V0IFNQX1NXUlNULCAweDgwCisJLnNldCBTUF9TUElFTiwgMHgxCisJLnNldCBTUF9DUiwgMCAgIC8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkuc2V0IFNQX01SLCA0ICAgLyogbW9kZSByZWdpc3RlciAqLworCS5zZXQgU1BfUkRSLCAweDA4IC8qIFJlYWQgRGF0YSBSZWdpc3RlciAqLworCS5zZXQgU1BfVERSLCAweDBDIC8qIFRyYW5zbWl0IERhdGEgUmVnaXN0ZXIgKi8KKwkuc2V0IFNQX0NTUjAsIDB4MzAgLyogY2hpcCBzZWxlY3QgcmVnaXN0ZXJzICovCisJLnNldCBTUF9DU1IxLCAweDM0CisJLnNldCBTUF9DU1IyLCAweDM4CisJLnNldCBTUF9DU1IzLCAweDNDCisJLnNldCBOVlJBTV9DTURfUkRTUiwgNSAvKiByZWFkIHN0YXR1cyByZWdpc3RlciAqLworCS5zZXQgTlZSQU1fQ01EX1JFQUQsIDMgLyogcmVhZCBkYXRhICovCisJLnNldCBOVlJBTV9TUl9SRFksIDEgLyogUkRZIGJpdC4gIFRoaXMgYml0IGlzIGludmVydGVkICovCisJLnNldCBTUElfOENMT0NLUywgMHhGRiAvKiBXcml0aW5nIHRoaXMgdG8gdGhlIFREUiBkb2Vzbid0IGRvIGFueXRoaW5nIHRvIHRoZQorCQkJCSAgc2VyaWFsIG91dHB1dCwgc2luY2UgU08gaXMgbm9ybWFsbHkgaGlnaC4gIEJ1dCBpdAorCQkJCSAgZG9lcyBjYXVzZSA4IGNsb2NrIGN5Y2xlcyBhbmQgdGh1cyA4IGJpdHMgdG8gYmUKKwkJCQkgIGNsb2NrZWQgaW4gdG8gdGhlIGNoaXAuICBTZWUgQXRtZWwncyBTUEkKKwkJCQkgIGNvbnRyb2xsZXIgKGUuZy4gQVQ5MU01NTgwMCkgdGltaW5nIGFuZCA0SyAKKwkJCQkgIFNQSSBFRVBST00gbWFudWFscyAqLworCQkJCSAKKwkuc2V0IE5WUkFNX1NDUkFUQ0gsIDB4MDIwMDAxMDAgIC8qIGFyYml0cmFyeSBhcmVhIGZvciBzY3JhdGNocGFkIG1lbW9yeSAqLworCS5zZXQgTlZSQU1fSU1BR0UsIDB4MDIwMDAyMDAKKwkuc2V0IE5WUkFNX0xFTkdUSCwgMHgwMjAwCisJLnNldCBNQUNfQUREUkVTU19NSUIsIFNSQU1fQkFTRQorCS5zZXQgTUFDX0FERFJFU1NfTEVOR1RILCA2CisgICAgICAgIC5zZXQgTUFDX0JPT1RfRkxBRywgMHgxMAorCS5zZXQgTVIxLCAwCisJLnNldCBNUjIsIDQKKwkuc2V0IE1SMywgOAorCS5zZXQgTVI0LCAweEMKK1JFU0VUX1ZFQ1RPUjoKKyAgICAgICAgYiBSRVNFVF9IQU5ETEVSCitVTkRFRl9WRUNUT1I6ICAKKyAgICAgICAgYiBIQUxUMQorU1dJX1ZFQ1RPUjogICAgICAgICAgICAKKyAgICAgICAgYiBIQUxUMQorSUFCT1JUX1ZFQ1RPUjogCisgICAgICAgIGIgSEFMVDEKK0RBQk9SVF9WRUNUT1I6ICAgICAgICAgCitSRVNFUlZFRF9WRUNUT1I6ICAgIAorICAgICAgICBiIEhBTFQxCitJUlFfVkVDVE9SOiAgICAKKyAgICAgICAgYiBIQUxUMQorRklRX1ZFQ1RPUjogICAgCisJYiBIQUxUMQorSEFMVDE6CWIgSEFMVDEKK1JFU0VUX0hBTkRMRVI6CisJbW92ICAgICByMCwgI0NQU1JfSU5JVElBTAorCW1zcglDUFNSX2MsIHIwCS8qIFRoaXMgaXMgcHJvYmFibHkgdW5uZWNlc3NhcnkgKi8KKwkJCQorLyogSSdtIGd1ZXNzaW5nIHRoaXMgaXMgaW5pdGlhbGl6aW5nIGNsb2NrIGdlbmVyYXRvciBlbGVjdHJvbmljcyBmb3IgU1BJICovCisJbGRyCXIwLCA9U1BJX0NHRU5fQkFTRQorCW1vdglyMSwgIzAKKwltb3YJcjEsIHIxLCBsc2wgIzMKKwlvcnIJcjEscjEsICMwCisJc3RyCXIxLCBbcjBdCisJbGRyCXIxLCBbcjAsICMyOF0KKwliaWMJcjEsIHIxLCAjMTYKKwlzdHIJcjEsIFtyMCwgIzI4XQorCW1vdglyMSwgIzEKKwlzdHIJcjEsIFtyMCwgIzhdCisJCisJbGRyCXIwLCA9TVJCQVNFCisJbW92CXIxLCAjMAorCXN0cmgJcjEsIFtyMCwgI01SMV0KKwlzdHJoCXIxLCBbcjAsICNNUjJdCisJc3RyaAlyMSwgW3IwLCAjTVIzXQorCXN0cmgJcjEsIFtyMCwgI01SNF0KKworCW1vdglzcCwgI1NUQUNLX0JBU0UKKwlibAlTUF9JTklUCisJbW92CXIwLCAjMTAKKwlibAlERUxBWTkKKwlibAlHRVRfTUFDX0FERFIKKwlibAlHRVRfV0hPTEVfTlZSQU0KKwlsZHIJcjAsID1NUkJBU0UKKwlsZHIJcjEsID1NQUNfQUREUkVTU19NSUIKKwlzdHJoCXIxLCBbcjAsICNNUjJdCisJbGRyCXIxLCA9TlZSQU1fSU1BR0UKKwlzdHJoCXIxLCBbcjAsICNNUjRdCisJbW92CXIxLCAjTUFDX0JPT1RfRkxBRworCXN0cmgJcjEsIFtyMCwgI01SM10KK0hBTFQyOgliIEhBTFQyCisuZnVuYyBHZXRfV2hvbGVfTlZSQU0sIEdFVF9XSE9MRV9OVlJBTQorR0VUX1dIT0xFX05WUkFNOgorCXN0bWRiCXNwISwge2xyfQorCW1vdglyMiwgIzAgLyogMHRoIGJ5dGVzIG9mIE5WUkFNICovCisJbW92CXIzLCAjTlZSQU1fTEVOR1RICisJbW92CXIxLCAjMAkJLyogbm90IHVzZWQgaW4gcm91dGluZSAqLworCWxkcglyMCwgPU5WUkFNX0lNQUdFCisJYmwJTlZSQU1fWEZFUgorCWxkbWlhCXNwISwge2xyfQorCWJ4CWxyCisuZW5kZnVuYworCQorLmZ1bmMgR2V0X01BQ19BZGRyLCBHRVRfTUFDX0FERFIKK0dFVF9NQUNfQUREUjoKKwlzdG1kYglzcCEsIHtscn0KKwltb3YJcjIsICMweDEyMAkvKiBhZGRyZXNzIG9mIE1BQyBBZGRyZXNzIHdpdGhpbiBOVlJBTSAqLworCW1vdglyMywgI01BQ19BRERSRVNTX0xFTkdUSAorCW1vdglyMSwgIzAJCS8qIG5vdCB1c2VkIGluIHJvdXRpbmUgKi8KKwlsZHIJcjAsID1NQUNfQUREUkVTU19NSUIKKwlibAlOVlJBTV9YRkVSCisJbGRtaWEJc3AhLCB7bHJ9CisJYngJbHIKKy5lbmRmdW5jCisubHRvcmcKKy5mdW5jIERlbGF5OSwgREVMQVk5CitERUxBWTk6CisJYWRkcwlyMCwgcjAsIHIwLCBMU0wgIzMgICAvKiByMCA9IHIwICogOSAqLworREVMQVlMT09QOgkKKwliZXEJREVMQVk5X2RvbmUKKwlzdWJzCXIwLCByMCwgIzEKKwliCURFTEFZTE9PUAorREVMQVk5X2RvbmU6CQorCWJ4CWxyCisuZW5kZnVuYwkKKworLmZ1bmMgU1BfSW5pdCwgU1BfSU5JVAorU1BfSU5JVDoKKwltb3YJcjEsICNTUF9TV1JTVAorCWxkcglyMCwgPVNQX0JBU0UKKwlzdHIJcjEsIFtyMCwgI1NQX0NSXSAvKiByZXNldCB0aGUgU1BJICovCisJbW92CXIxLCAjMAorCXN0cglyMSwgW3IwLCAjU1BfQ1JdIC8qIHJlbGVhc2UgU1BJIGZyb20gcmVzZXQgc3RhdGUgKi8KKwltb3YJcjEsICNTUF9TUElFTgorCXN0cglyMSwgW3IwLCAjU1BfTVJdIC8qIHNldCB0aGUgU1BJIHRvIE1BU1RFUiBtb2RlKi8KKwlzdHIJcjEsIFtyMCwgI1NQX0NSXSAvKiBlbmFibGUgdGhlIFNQSSAqLworCisvKiAgTXkgZ3Vlc3Mgd291bGQgYmUgdGhpcyB0dXJucyBvbiB0aGUgU1BJIGNsb2NrICovCisJbGRyCXIzLCA9U1BJX0NHRU5fQkFTRQorCWxkcglyMSwgW3IzLCAjMjhdCisJb3JyCXIxLCByMSwgIzB4MjAwMAorCXN0cglyMSwgW3IzLCAjMjhdCisKKwlsZHIJcjEsID0weDIwMDBjMDEKKwlzdHIJcjEsIFtyMCwgI1NQX0NTUjBdCisJbGRyCXIxLCA9MHgyMDAwMjAxCisJc3RyCXIxLCBbcjAsICNTUF9DU1IxXQorCXN0cglyMSwgW3IwLCAjU1BfQ1NSMl0KKwlzdHIJcjEsIFtyMCwgI1NQX0NTUjNdCisJbGRyCXIxLCBbcjAsICNTUF9TUl0KKwlsZHIJcjAsIFtyMCwgI1NQX1JEUl0KKwlieAlscgorLmVuZGZ1bmMKKy5mdW5jIE5WUkFNX0luaXQsIE5WUkFNX0lOSVQJCitOVlJBTV9JTklUOgorCWxkcglyMSwgPVNQX0JBU0UKKwlsZHIJcjAsIFtyMSwgI1NQX1JEUl0KKwltb3YJcjAsICNOVlJBTV9DTURfUkRTUgorCXN0cglyMCwgW3IxLCAjU1BfVERSXQorU1BfbG9vcDE6CQorCWxkcglyMCwgW3IxLCAjU1BfU1JdCisJdHN0CXIwLCAjU1BfVERSRQorCWJlcQlTUF9sb29wMQorCisJbW92CXIwLCAjU1BJXzhDTE9DS1MKKwlzdHIJcjAsIFtyMSwgI1NQX1REUl0gCitTUF9sb29wMjoJCisJbGRyCXIwLCBbcjEsICNTUF9TUl0KKwl0c3QJcjAsICNTUF9URFJFCisJYmVxCVNQX2xvb3AyCisKKwlsZHIJcjAsIFtyMSwgI1NQX1JEUl0KK1NQX2xvb3AzOgkKKwlsZHIJcjAsIFtyMSwgI1NQX1NSXQorCXRzdAlyMCwgI1NQX1JEUkYKKwliZXEJU1BfbG9vcDMKKworCWxkcglyMCwgW3IxLCAjU1BfUkRSXQorCWFuZAlyMCwgcjAsICMyNTUKKwlieAlscgorLmVuZGZ1bmMKKwkKKy5mdW5jIE5WUkFNX1hmZXIsIE5WUkFNX1hGRVIKKwkvKiByMCA9IGRlc3QgYWRkcmVzcyAqLworCS8qIHIxID0gbm90IHVzZWQgKi8KKwkvKiByMiA9IHNyYyBhZGRyZXNzIHdpdGhpbiBOVlJBTSAqLworCS8qIHIzID0gbGVuZ3RoICovCitOVlJBTV9YRkVSOgorCXN0bWRiCXNwISwge3I0LCByNSwgbHJ9CisJbW92CXI1LCByMAkJLyogc2F2ZSByMCAoZGVzdCBhZGRyZXNzKSAqLworCW1vdglyNCwgcjMJCS8qIHNhdmUgcjMgKGxlbmd0aCkgKi8KKwltb3YJcjAsIHIyLCBMU1IgIzUgLyogIFNQSSBtZW1vcmllcyBwdXQgQTggaW4gdGhlIGNvbW1hbmQgZmllbGQgKi8KKwlhbmQJcjAsIHIwLCAjOAorCWFkZAlyMCwgcjAsICNOVlJBTV9DTURfUkVBRCAKKwlsZHIJcjEsID1OVlJBTV9TQ1JBVENICisJc3RyYglyMCwgW3IxLCAjMF0JLyogc2F2ZSBjb21tYW5kIGluIE5WUkFNX1NDUkFUQ0hbMF0gKi8KKwlzdHJiCXIyLCBbcjEsICMxXSAgICAvKiBzYXZlIGxvdyBieXRlIG9mIHNvdXJjZSBhZGRyZXNzIGluIE5WUkFNX1NDUkFUQ0hbMV0gKi8KK19sb2NhbDE6CQorCWJsCU5WUkFNX0lOSVQKKwl0c3QJcjAsICNOVlJBTV9TUl9SRFkKKwlibmUJX2xvY2FsMQorCW1vdglyMCwgIzIwCisJYmwJREVMQVk5CisJbW92CXIyLCByNAkJLyogbGVuZ3RoICovCisJbW92CXIxLCByNQkJLyogZGVzdCBhZGRyZXNzICovCisJbW92CXIwLCAjMgkJLyogYnl0ZXMgdG8gdHJhbnNmZXIgaW4gY29tbWFuZCAqLworCWJsCU5WUkFNX1hGRVIyCisJbGRtaWEJc3AhLCB7cjQsIHI1LCBscn0KKwlieAlscgorLmVuZGZ1bmMKKworLmZ1bmMgTlZSQU1fWGZlcjIsIE5WUkFNX1hGRVIyCitOVlJBTV9YRkVSMjoKKwlzdG1kYglzcCEsIHtyNCwgcjUsIHI2LCBscn0KKwlsZHIJcjQsID1TUF9CQVNFCisJbW92CXIzLCAjMAorCWNtcAlyMCwgIzAKKwlibHMJX2xvY2FsMgorCWxkcglyNSwgPU5WUkFNX1NDUkFUQ0gKK19sb2NhbDQ6CQorCWxkcmIJcjYsIFtyNSwgcjNdCisJc3RyCXI2LCBbcjQsICNTUF9URFJdCitfbG9jYWwzOgorCWxkcglyNiwgW3I0LCAjU1BfU1JdCisJdHN0CXI2LCAjU1BfVERSRQorCWJlcQlfbG9jYWwzCisJYWRkCXIzLCByMywgIzEKKwljbXAJcjMsIHIwIC8qIHIwIGlzICMgb2YgYnl0ZXMgdG8gc2VuZCBvdXQgKGNvbW1hbmQrYWRkcikgKi8KKwlibG8JX2xvY2FsNAorX2xvY2FsMjoKKwltb3YJcjMsICNTUElfOENMT0NLUworCXN0cglyMywgW3I0LCAjU1BfVERSXQorCWxkcglyMCwgW3I0LCAjU1BfUkRSXQorX2xvY2FsNToJCisJbGRyCXIwLCBbcjQsICNTUF9TUl0KKwl0c3QJcjAsICNTUF9SRFJGCisJYmVxCV9sb2NhbDUKKwlsZHIJcjAsIFtyNCwgI1NQX1JEUl0gLyogd2hhdCdzIHRoaXMgYnl0ZT8gIEl0J3MgdGhlIGJ5dGUgcmVhZCB3aGlsZSB3cml0aW5nIHRoZSBURFIgLS0gbm9uc2Vuc2UsIGJlY2F1c2UgdGhlIE5WUkFNIGRvZXNuJ3QgcmVhZCBhbmQgd3JpdGUgYXQgdGhlIHNhbWUgdGltZSAqLworCW1vdglyMCwgIzAKKwljbXAJcjIsICMwICAvKiByMiBpcyAjIG9mIGJ5dGVzIHRvIGNvcHkgaW4gKi8KKwlibHMJX2xvY2FsNgorX2xvY2FsNzoJCisJbGRyCXI1LCBbcjQsICNTUF9TUl0KKwl0c3QJcjUsICNTUF9URFJFCisJYmVxCV9sb2NhbDcKKwlzdHIJcjMsIFtyNCwgI1NQX1REUl0gIC8qIHIzIGhhcyBTUElfOENMT0NLUyAqLworX2xvY2FsODoJCisJbGRyCXI1LCBbcjQsICNTUF9TUl0KKwl0c3QJcjUsICNTUF9SRFJGCisJYmVxCV9sb2NhbDgKKwlsZHIJcjUsIFtyNCwgI1NQX1JEUl0gLyogYnV0IGRpZG4ndCB3ZSByZWFkIHRoaXMgYnl0ZSBhYm92ZT8gKi8KKwlzdHJiCXI1LCBbcjFdLCAjMSAvKiBwb3N0aW5kZXhlZCAqLworCWFkZAlyMCwgcjAsICMxCisJY21wCXIwLCByMgorCWJsbwlfbG9jYWw3IC8qIHNpbmNlIHdlIGRvbid0IHNlbmQgYW5vdGhlciBhZGRyZXNzLCB0aGUgTlZSQU0gbXVzdCBiZSBjYXBhYmxlIG9mIHNlcXVlbnRpYWwgcmVhZHMgKi8KK19sb2NhbDY6CisJbW92CXIwLCAjMjAwCisJYmwJREVMQVk5CisJbGRtaWEJc3AhLCB7cjQsIHI1LCByNiwgbHJ9CisJYngJbHIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI1MDAwZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmgKQEAgLTAsMCArMSw0MyBAQAorLyoqKiAtKi0gbGludXgtYyAtKi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgIERyaXZlciBmb3IgQXRtZWwgYXQ3NmM1MDIgYXQ3NmM1MDQgYW5kIGF0NzZjNTA2IHdpcmVsZXNzIGNhcmRzLgorCisgICAgICAgICBDb3B5cmlnaHQgMjAwNSBEYW4gV2lsbGlhbXMgYW5kIFJlZCBIYXQsIEluYy4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCBBdG1lbCB3aXJlbGVzcyBsYW4gZHJpdmVyczsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9BVE1FTF9ICisjZGVmaW5lIF9BVE1FTF9ICisKK3R5cGVkZWYgZW51bSB7CisJQVRNRUxfRldfVFlQRV9OT05FID0gMCwKKwlBVE1FTF9GV19UWVBFXzUwMiwKKwlBVE1FTF9GV19UWVBFXzUwMkQsCisJQVRNRUxfRldfVFlQRV81MDJFLAorCUFUTUVMX0ZXX1RZUEVfNTAyXzNDT00sCisJQVRNRUxfRldfVFlQRV81MDQsCisJQVRNRUxfRldfVFlQRV81MDRfMjk1OCwKKwlBVE1FTF9GV19UWVBFXzUwNEFfMjk1OCwKKwlBVE1FTF9GV19UWVBFXzUwNgorfSBBdG1lbEZXVHlwZTsKKworc3RydWN0IG5ldF9kZXZpY2UgKmluaXRfYXRtZWxfY2FyZCh1bnNpZ25lZCBzaG9ydCwgaW50LCBjb25zdCBBdG1lbEZXVHlwZSwgc3RydWN0IGRldmljZSAqLCAKKwkJCQkgICAgaW50ICgqcHJlc2VudF9mdW5jKSh2b2lkICopLCB2b2lkICogKTsKK3ZvaWQgc3RvcF9hdG1lbF9jYXJkKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQgKTsKK2ludCBhdG1lbF9vcGVuKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX2NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxYjUwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX2NzLmMKQEAgLTAsMCArMSw3MDggQEAKKy8qKiogLSotIGxpbnV4LWMgLSotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICBEcml2ZXIgZm9yIEF0bWVsIGF0NzZjNTAyIGF0NzZjNTA0IGFuZCBhdDc2YzUwNiB3aXJlbGVzcyBjYXJkcy4KKworICAgICAgICBDb3B5cmlnaHQgMjAwMC0yMDAxIEFUTUVMIENvcnBvcmF0aW9uLgorICAgICAgICBDb3B5cmlnaHQgMjAwMyBTaW1vbiBLZWxsZXkuCisKKyAgICBUaGlzIGNvZGUgd2FzIGRldmVsb3BlZCBmcm9tIHZlcnNpb24gMi4xLjEgb2YgdGhlIEF0bWVsIGRyaXZlcnMsIAorICAgIHJlbGVhc2VkIGJ5IEF0bWVsIGNvcnAuIHVuZGVyIHRoZSBHUEwgaW4gRGVjZW1iZXIgMjAwMi4gSXQgYWxzbyAKKyAgICBpbmNsdWRlcyBjb2RlIGZyb20gdGhlIExpbnV4IGFpcm9uZXQgZHJpdmVycyAoQykgQmVuamFtaW4gUmVlZCwgCisgICAgYW5kIHRoZSBMaW51eCBQQ01DSUEgcGFja2FnZSwgKEMpIERhdmlkIEhpbmRzLiAKKworICAgIEZvciBhbGwgcXVlcmllcyBhYm91dCB0aGlzIGNvZGUsIHBsZWFzZSBjb250YWN0IHRoZSBjdXJyZW50IGF1dGhvciwgCisgICAgU2ltb24gS2VsbGV5IDxzaW1vbkB0aGVrZWxsZXlzLm9yZy51az4gYW5kIG5vdCBBdG1lbCBDb3Jwb3JhdGlvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCBBdG1lbCB3aXJlbGVzcyBsYW4gZHJpdmVyczsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaWZkZWYgX19JTl9QQ01DSUFfUEFDS0FHRV9fCisjaW5jbHVkZSA8cGNtY2lhL2tfY29tcGF0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorCisjaW5jbHVkZSAiYXRtZWwuaCIKKworLyoKKyAgIEFsbCB0aGUgUENNQ0lBIG1vZHVsZXMgdXNlIFBDTUNJQV9ERUJVRyB0byBjb250cm9sIGRlYnVnZ2luZy4gIElmCisgICB5b3UgZG8gbm90IGRlZmluZSBQQ01DSUFfREVCVUcgYXQgYWxsLCBhbGwgdGhlIGRlYnVnIGNvZGUgd2lsbCBiZQorICAgbGVmdCBvdXQuICBJZiB5b3UgY29tcGlsZSB3aXRoIFBDTUNJQV9ERUJVRz0wLCB0aGUgZGVidWcgY29kZSB3aWxsCisgICBiZSBwcmVzZW50IGJ1dCBkaXNhYmxlZCAtLSBidXQgaXQgY2FuIHRoZW4gYmUgZW5hYmxlZCBmb3Igc3BlY2lmaWMKKyAgIG1vZHVsZXMgYXQgbG9hZCB0aW1lIHdpdGggYSAncGNfZGVidWc9Iycgb3B0aW9uIHRvIGluc21vZC4KKyovCisjaWZkZWYgUENNQ0lBX0RFQlVHCitzdGF0aWMgaW50IHBjX2RlYnVnID0gUENNQ0lBX0RFQlVHOworbW9kdWxlX3BhcmFtKHBjX2RlYnVnLCBpbnQsIDApOworc3RhdGljIGNoYXIgKnZlcnNpb24gPSAiJFJldmlzaW9uOiAxLjIgJCI7CisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpOworI2Vsc2UKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworTU9EVUxFX0FVVEhPUigiU2ltb24gS2VsbGV5Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN1cHBvcnQgZm9yIEF0bWVsIGF0NzZjNTB4IDgwMi4xMSB3aXJlbGVzcyBldGhlcm5ldCBjYXJkcy4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJBdG1lbCBhdDc2YzUweCBQQ01DSUEgY2FyZHMiKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgICBUaGUgZXZlbnQoKSBmdW5jdGlvbiBpcyB0aGlzIGRyaXZlcidzIENhcmQgU2VydmljZXMgZXZlbnQgaGFuZGxlci4KKyAgIEl0IHdpbGwgYmUgY2FsbGVkIGJ5IENhcmQgU2VydmljZXMgd2hlbiBhbiBhcHByb3ByaWF0ZSBjYXJkIHN0YXR1cworICAgZXZlbnQgaXMgcmVjZWl2ZWQuICBUaGUgY29uZmlnKCkgYW5kIHJlbGVhc2UoKSBlbnRyeSBwb2ludHMgYXJlCisgICB1c2VkIHRvIGNvbmZpZ3VyZSBvciByZWxlYXNlIGEgc29ja2V0LCBpbiByZXNwb25zZSB0byBjYXJkCisgICBpbnNlcnRpb24gYW5kIGVqZWN0aW9uIGV2ZW50cy4gIFRoZXkgYXJlIGludm9rZWQgZnJvbSB0aGUgYXRtZWxfY3MKKyAgIGV2ZW50IGhhbmRsZXIuIAorKi8KKworc3RhdGljIHZvaWQgYXRtZWxfY29uZmlnKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIHZvaWQgYXRtZWxfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyBpbnQgYXRtZWxfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkgICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKTsKKworLyoKKyAgIFRoZSBhdHRhY2goKSBhbmQgZGV0YWNoKCkgZW50cnkgcG9pbnRzIGFyZSB1c2VkIHRvIGNyZWF0ZSBhbmQgZGVzdHJveQorICAgImluc3RhbmNlcyIgb2YgdGhlIGRyaXZlciwgd2hlcmUgZWFjaCBpbnN0YW5jZSByZXByZXNlbnRzIGV2ZXJ5dGhpbmcKKyAgIG5lZWRlZCB0byBtYW5hZ2Ugb25lIGFjdHVhbCBQQ01DSUEgY2FyZC4KKyovCisKK3N0YXRpYyBkZXZfbGlua190ICphdG1lbF9hdHRhY2godm9pZCk7CitzdGF0aWMgdm9pZCBhdG1lbF9kZXRhY2goZGV2X2xpbmtfdCAqKTsKKworLyoKKyAgIFlvdSdsbCBhbHNvIG5lZWQgdG8gcHJvdG90eXBlIGFsbCB0aGUgZnVuY3Rpb25zIHRoYXQgd2lsbCBhY3R1YWxseQorICAgYmUgdXNlZCB0byB0YWxrIHRvIHlvdXIgZGV2aWNlLiAgU2VlICdwY21lbV9jcycgZm9yIGEgZ29vZCBleGFtcGxlCisgICBvZiBhIGZ1bGx5IHNlbGYtc3VmZmljaWVudCBkcml2ZXI7IHRoZSBvdGhlciBkcml2ZXJzIHJlbHkgbW9yZSBvcgorICAgbGVzcyBvbiBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsLgorKi8KKworLyoKKyAgIFRoZSBkZXZfaW5mbyB2YXJpYWJsZSBpcyB0aGUgImtleSIgdGhhdCBpcyB1c2VkIHRvIG1hdGNoIHVwIHRoaXMKKyAgIGRldmljZSBkcml2ZXIgd2l0aCBhcHByb3ByaWF0ZSBjYXJkcywgdGhyb3VnaCB0aGUgY2FyZCBjb25maWd1cmF0aW9uCisgICBkYXRhYmFzZS4KKyovCisKK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvID0gImF0bWVsX2NzIjsKKworLyoKKyAgIEEgbGlua2VkIGxpc3Qgb2YgImluc3RhbmNlcyIgb2YgdGhlICBhdG1lbG5ldCBkZXZpY2UuICBFYWNoIGFjdHVhbAorICAgUENNQ0lBIGNhcmQgY29ycmVzcG9uZHMgdG8gb25lIGRldmljZSBpbnN0YW5jZSwgYW5kIGlzIGRlc2NyaWJlZAorICAgYnkgb25lIGRldl9saW5rX3Qgc3RydWN0dXJlIChkZWZpbmVkIGluIGRzLmgpLgorCisgICBZb3UgbWF5IG5vdCB3YW50IHRvIHVzZSBhIGxpbmtlZCBsaXN0IGZvciB0aGlzIC0tIGZvciBleGFtcGxlLCB0aGUKKyAgIG1lbW9yeSBjYXJkIGRyaXZlciB1c2VzIGFuIGFycmF5IG9mIGRldl9saW5rX3QgcG9pbnRlcnMsIHdoZXJlIG1pbm9yCisgICBkZXZpY2UgbnVtYmVycyBhcmUgdXNlZCB0byBkZXJpdmUgdGhlIGNvcnJlc3BvbmRpbmcgYXJyYXkgaW5kZXguCisqLworCitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3QgPSBOVUxMOworCisvKgorICAgQSBkZXZfbGlua190IHN0cnVjdHVyZSBoYXMgZmllbGRzIGZvciBtb3N0IHRoaW5ncyB0aGF0IGFyZSBuZWVkZWQKKyAgIHRvIGtlZXAgdHJhY2sgb2YgYSBzb2NrZXQsIGJ1dCB0aGVyZSB3aWxsIHVzdWFsbHkgYmUgc29tZSBkZXZpY2UKKyAgIHNwZWNpZmljIGluZm9ybWF0aW9uIHRoYXQgYWxzbyBuZWVkcyB0byBiZSBrZXB0IHRyYWNrIG9mLiAgVGhlCisgICAncHJpdicgcG9pbnRlciBpbiBhIGRldl9saW5rX3Qgc3RydWN0dXJlIGNhbiBiZSB1c2VkIHRvIHBvaW50IHRvCisgICBhIGRldmljZS1zcGVjaWZpYyBwcml2YXRlIGRhdGEgc3RydWN0dXJlLCBsaWtlIHRoaXMuCisKKyAgIEEgZHJpdmVyIG5lZWRzIHRvIHByb3ZpZGUgYSBkZXZfbm9kZV90IHN0cnVjdHVyZSBmb3IgZWFjaCBkZXZpY2UKKyAgIG9uIGEgY2FyZC4gIEluIHNvbWUgY2FzZXMsIHRoZXJlIGlzIG9ubHkgb25lIGRldmljZSBwZXIgY2FyZCAoZm9yCisgICBleGFtcGxlLCBldGhlcm5ldCBjYXJkcywgbW9kZW1zKS4gIEluIG90aGVyIGNhc2VzLCB0aGVyZSBtYXkgYmUKKyAgIG1hbnkgYWN0dWFsIG9yIGxvZ2ljYWwgZGV2aWNlcyAoU0NTSSBhZGFwdGVycywgbWVtb3J5IGNhcmRzIHdpdGgKKyAgIG11bHRpcGxlIHBhcnRpdGlvbnMpLiAgVGhlIGRldl9ub2RlX3Qgc3RydWN0dXJlcyBuZWVkIHRvIGJlIGtlcHQKKyAgIGluIGEgbGlua2VkIGxpc3Qgc3RhcnRpbmcgYXQgdGhlICdkZXYnIGZpZWxkIG9mIGEgZGV2X2xpbmtfdAorICAgc3RydWN0dXJlLiAgV2UgYWxsb2NhdGUgdGhlbSBpbiB0aGUgY2FyZCdzIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUsCisgICBiZWNhdXNlIHRoZXkgZ2VuZXJhbGx5IHNob3VsZG4ndCBiZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHkuCisKKyAgIEluIHRoaXMgY2FzZSwgd2UgYWxzbyBwcm92aWRlIGEgZmxhZyB0byBpbmRpY2F0ZSBpZiBhIGRldmljZSBpcworICAgInN0b3BwZWQiIGR1ZSB0byBhIHBvd2VyIG1hbmFnZW1lbnQgZXZlbnQsIG9yIGNhcmQgZWplY3Rpb24uICBUaGUKKyAgIGRldmljZSBJTyByb3V0aW5lcyBjYW4gdXNlIGEgZmxhZyBsaWtlIHRoaXMgdG8gdGhyb3R0bGUgSU8gdG8gYQorICAgY2FyZCB0aGF0IGlzIG5vdCByZWFkeSB0byBhY2NlcHQgaXQuCisqLworICAgCit0eXBlZGVmIHN0cnVjdCBsb2NhbF9pbmZvX3QgeworCWRldl9ub2RlX3QJbm9kZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZXRoX2RldjsKK30gbG9jYWxfaW5mb190OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIGF0bWVsX2F0dGFjaCgpIGNyZWF0ZXMgYW4gImluc3RhbmNlIiBvZiB0aGUgZHJpdmVyLCBhbGxvY2F0aW5nCisgIGxvY2FsIGRhdGEgc3RydWN0dXJlcyBmb3Igb25lIGRldmljZS4gIFRoZSBkZXZpY2UgaXMgcmVnaXN0ZXJlZAorICB3aXRoIENhcmQgU2VydmljZXMuCisgIAorICBUaGUgZGV2X2xpbmsgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkKKyAgY29uZmlndXJlIHRoZSBjYXJkIGF0IHRoaXMgcG9pbnQgLS0gd2Ugd2FpdCB1bnRpbCB3ZSByZWNlaXZlIGEKKyAgY2FyZCBpbnNlcnRpb24gZXZlbnQuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGRldl9saW5rX3QgKmF0bWVsX2F0dGFjaCh2b2lkKQoreworCWNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworCWRldl9saW5rX3QgKmxpbms7CisJbG9jYWxfaW5mb190ICpsb2NhbDsKKwlpbnQgcmV0OworCQorCURFQlVHKDAsICJhdG1lbF9hdHRhY2goKVxuIik7CisKKwkvKiBJbml0aWFsaXplIHRoZSBkZXZfbGlua190IHN0cnVjdHVyZSAqLworCWxpbmsgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGV2X2xpbmtfdCksIEdGUF9LRVJORUwpOworCWlmICghbGluaykgeworCQlwcmludGsoS0VSTl9FUlIgImF0bWVsX2NzOiBubyBtZW1vcnkgZm9yIG5ldyBkZXZpY2VcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KGxpbmssIDAsIHNpemVvZihzdHJ1Y3QgZGV2X2xpbmtfdCkpOworCQorCS8qIEludGVycnVwdCBzZXR1cCAqLworCWxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFOworCWxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKKwlsaW5rLT5pcnEuSGFuZGxlciA9IE5VTEw7CisJCisJLyoKKwkgIEdlbmVyYWwgc29ja2V0IGNvbmZpZ3VyYXRpb24gZGVmYXVsdHMgY2FuIGdvIGhlcmUuICBJbiB0aGlzCisJICBjbGllbnQsIHdlIGFzc3VtZSB2ZXJ5IGxpdHRsZSwgYW5kIHJlbHkgb24gdGhlIENJUyBmb3IgYWxtb3N0CisJICBldmVyeXRoaW5nLiAgSW4gbW9zdCBjbGllbnRzLCBtYW55IGRldGFpbHMgKGkuZS4sIG51bWJlciwgc2l6ZXMsCisJICBhbmQgYXR0cmlidXRlcyBvZiBJTyB3aW5kb3dzKSBhcmUgZml4ZWQgYnkgdGhlIG5hdHVyZSBvZiB0aGUKKwkgIGRldmljZSwgYW5kIGNhbiBiZSBoYXJkLXdpcmVkIGhlcmUuCisJKi8KKwlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSAwOworCWxpbmstPmNvbmYuVmNjID0gNTA7CisJbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisJCisJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHByaXZhdGUgZGV2aWNlLXNwZWNpZmljIGRhdGEgKi8KKwlsb2NhbCA9IGttYWxsb2Moc2l6ZW9mKGxvY2FsX2luZm9fdCksIEdGUF9LRVJORUwpOworCWlmICghbG9jYWwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhdG1lbF9jczogbm8gbWVtb3J5IGZvciBuZXcgZGV2aWNlXG4iKTsKKwkJa2ZyZWUgKGxpbmspOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KGxvY2FsLCAwLCBzaXplb2YobG9jYWxfaW5mb190KSk7CisJbGluay0+cHJpdiA9IGxvY2FsOworCQorCS8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworCWxpbmstPm5leHQgPSBkZXZfbGlzdDsKKwlkZXZfbGlzdCA9IGxpbms7CisJY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKKwljbGllbnRfcmVnLkV2ZW50TWFzayA9CisJCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKwkJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKwkJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKKwljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmYXRtZWxfZXZlbnQ7CisJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisJaWYgKHJldCAhPSAwKSB7CisJCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisJCWF0bWVsX2RldGFjaChsaW5rKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCQorCXJldHVybiBsaW5rOworfSAvKiBhdG1lbF9hdHRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBUaGlzIGRlbGV0ZXMgYSBkcml2ZXIgImluc3RhbmNlIi4gIFRoZSBkZXZpY2UgaXMgZGUtcmVnaXN0ZXJlZAorICB3aXRoIENhcmQgU2VydmljZXMuICBJZiBpdCBoYXMgYmVlbiByZWxlYXNlZCwgYWxsIGxvY2FsIGRhdGEKKyAgc3RydWN0dXJlcyBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQKKyAgd2hlbiB0aGUgZGV2aWNlIGlzIHJlbGVhc2VkLgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGF0bWVsX2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworCWRldl9saW5rX3QgKipsaW5rcDsKKwkKKwlERUJVRygwLCAiYXRtZWxfZGV0YWNoKDB4JXApXG4iLCBsaW5rKTsKKwkKKwkvKiBMb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworCWZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJCWlmICgqbGlua3AgPT0gbGluaykgYnJlYWs7CisJaWYgKCpsaW5rcCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCQlhdG1lbF9yZWxlYXNlKGxpbmspOworCQkKKwkvKiBCcmVhayB0aGUgbGluayB3aXRoIENhcmQgU2VydmljZXMgKi8KKwlpZiAobGluay0+aGFuZGxlKQorCQlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKworCS8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIHBpZWNlcyAqLworCSpsaW5rcCA9IGxpbmstPm5leHQ7CisJaWYgKGxpbmstPnByaXYpCisJCWtmcmVlKGxpbmstPnByaXYpOworCWtmcmVlKGxpbmspOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIGF0bWVsX2NvbmZpZygpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudAorICBpcyByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUKKyAgZGV2aWNlIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtLgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKworLyogQ2FsbC1iYWNrIGZ1bmN0aW9uIHRvIGludGVycm9nYXRlIFBDTUNJQS1zcGVjaWZpYyBpbmZvcm1hdGlvbgorICAgYWJvdXQgdGhlIGN1cnJlbnQgZXhpc3RhbmNlIG9mIHRoZSBjYXJkICovCitzdGF0aWMgaW50IGNhcmRfcHJlc2VudCh2b2lkICphcmcpCit7IAorCWRldl9saW5rX3QgKmxpbmsgPSAoZGV2X2xpbmtfdCAqKWFyZzsKKwlpZiAobGluay0+c3RhdGUgJiBERVZfU1VTUEVORCkKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkKKwkJcmV0dXJuIDE7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIGxpc3Qgb2YgY2FyZHMgd2Uga25vdyBhYm91dCBhbmQgdGhlaXIgZmlybXdhcmUgcmVxdWlyZW1lbnRzLgorICAgR28gZWl0aGVyIGJ5IE1hbmZpZCBvciB2ZXJzaW9uIHN0cmluZ3MuCisgICBDYXJkcyBub3QgaW4gdGhpcyBsaXN0IHdpbGwgbmVlZCBhIGZpcm13YXJlIHBhcmFtZXRlciB0byB0aGUgbW9kdWxlCisgICBpbiBhbGwgcHJvYmFiaWxpdHkuIE5vdGUgdGhhdCB0aGUgU01DIDI2MzIgVjIgYW5kIFYzIGhhdmUgdGhlIHNhbWUKKyAgIG1hbmZpZHMsIHNvIHdlIGlnbm9yZSB0aG9zZSBhbmQgdXNlIHRoZSB2ZXJzaW9uMSBzdHJpbmdzLiAqLworCitzdGF0aWMgc3RydWN0IHsgCisJaW50IG1hbmYsIGNhcmQ7CisJY2hhciAqdmVyMTsKKwlBdG1lbEZXVHlwZSBmaXJtd2FyZTsKKwljaGFyICpuYW1lOworfSBjYXJkX3RhYmxlW10gPSB7CisJeyAwLCAwLCAiV0xBTi84MDIuMTFiIFBDIENBUkQiLCBBVE1FTF9GV19UWVBFXzUwMkQsICJBY3Rpb250ZWMgODAyQ0FUMSIgfSwgIAorCXsgMCwgMCwgIkFUTUVML0FUNzZDNTAyQVIiLCBBVE1FTF9GV19UWVBFXzUwMiwgIk5vTmFtZS1SRk1EIiB9LCAKKwl7IDAsIDAsICJBVE1FTC9BVDc2QzUwMkFSX0QiLCBBVE1FTF9GV19UWVBFXzUwMkQsICJOb05hbWUtcmV2RCIgfSwgCisJeyAwLCAwLCAiQVRNRUwvQVQ3NkM1MDJBUl9FIiwgQVRNRUxfRldfVFlQRV81MDJFLCAiTm9OYW1lLXJldkUiIH0sCisJeyAwLCAwLCAiQVRNRUwvQVQ3NkM1MDQiLCBBVE1FTF9GV19UWVBFXzUwNCwgIk5vTmFtZS01MDQiIH0sCisJeyAwLCAwLCAiQVRNRUwvQVQ3NkM1MDRBIiwgQVRNRUxfRldfVFlQRV81MDRBXzI5NTgsICJOb05hbWUtNTA0YS0yOTU4IiB9LAorCXsgMCwgMCwgIkFUTUVML0FUNzZDNTA0X1IiLCBBVE1FTF9GV19UWVBFXzUwNF8yOTU4LCAiTm9OYW1lLTUwNC0yOTU4IiB9LAorCXsgTUFORklEXzNDT00sIDB4MDYyMCwgTlVMTCwgQVRNRUxfRldfVFlQRV81MDJfM0NPTSwgIjNjb20gM0NSV0U2MjA5MkIiIH0sIAorCXsgTUFORklEXzNDT00sIDB4MDY5NiwgTlVMTCwgQVRNRUxfRldfVFlQRV81MDJfM0NPTSwgIjNjb20gM0NSU0hQVzE5NiIgfSwgCisJeyAwLCAwLCAiU01DLzI2MzJXLVYyIiwgQVRNRUxfRldfVFlQRV81MDIsICJTTUMgMjYzMlctVjIiIH0sCisJeyAwLCAwLCAiU01DLzI2MzJXIiwgQVRNRUxfRldfVFlQRV81MDJELCAiU01DIDI2MzJXLVYzIiB9LAorCXsgMHhkNjAxLCAweDAwMDcsIE5VTEwsIEFUTUVMX0ZXX1RZUEVfNTAyLCAiU2l0ZWNvbSBXTEFOLTAxMSIgfSwgCisJeyAweDAxYmYsIDB4MzMwMiwgTlVMTCwgQVRNRUxfRldfVFlQRV81MDJFLCAiQmVsa2luIEY1RDYwMjAtVjIiIH0sIAorCXsgMCwgMCwgIkJUL1ZveWFnZXIgMTAyMCBMYXB0b3AgQWRhcHRlciIsIEFUTUVMX0ZXX1RZUEVfNTAyLCAiQlQgVm95YWdlciAxMDIwIiB9LAorCXsgMCwgMCwgIklFRUUgODAyLjExYi9XaXJlbGVzcyBMQU4gUEMgQ2FyZCIsIEFUTUVMX0ZXX1RZUEVfNTAyLCAiU2llbWVucyBHaWdhc2V0IFBDIENhcmQgSUkiIH0sCisJeyAwLCAwLCAiQ05ldC9DTldMQyAxMU1icHMgV2lyZWxlc3MgUEMgQ2FyZCBWLTUiLCBBVE1FTF9GV19UWVBFXzUwMkUsICJDTmV0IENOV0xDLTgxMUFSTCIgfSwKKwl7IDAsIDAsICJXaXJlbGVzcy9QQ19DQVJEIiwgQVRNRUxfRldfVFlQRV81MDJELCAiUGxhbmV0IFdMLTM1NTIiIH0sCisJeyAwLCAwLCAiT0VNLzExTWJwcyBXaXJlbGVzcyBMQU4gUEMgQ2FyZCBWLTMiLCBBVE1FTF9GV19UWVBFXzUwMiwgIk9FTSAxMU1icHMgV0xBTiBQQ01DSUEgQ2FyZCIgfSwKKwl7IDAsIDAsICIxMVdBVkUvMTFXUDYxMUFMLUUiLCBBVE1FTF9GV19UWVBFXzUwMkUsICIxMVdBVkUgV2F2ZUJ1ZGR5IiB9LAorCXsgMCwgMCwgIkxHL0xXMjEwME4iLCBBVE1FTF9GV19UWVBFXzUwMkUsICJMRyBMVzIxMDBOIDExTWJwcyBXTEFOIFBDTUNJQSBDYXJkIiB9LAorfTsKKworc3RhdGljIHZvaWQgYXRtZWxfY29uZmlnKGRldl9saW5rX3QgKmxpbmspCit7CisJY2xpZW50X2hhbmRsZV90IGhhbmRsZTsKKwl0dXBsZV90IHR1cGxlOworCWNpc3BhcnNlX3QgcGFyc2U7CisJbG9jYWxfaW5mb190ICpkZXY7CisJaW50IGxhc3RfZm4sIGxhc3RfcmV0OworCXVfY2hhciBidWZbNjRdOworCWludCBjYXJkX2luZGV4ID0gLTEsIGRvbmUgPSAwOworCQorCWhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKwlkZXYgPSBsaW5rLT5wcml2OworCisJREVCVUcoMCwgImF0bWVsX2NvbmZpZygweCVwKVxuIiwgbGluayk7CisJCisJdHVwbGUuQXR0cmlidXRlcyA9IDA7CisJdHVwbGUuVHVwbGVEYXRhID0gYnVmOworCXR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOworCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKwkKKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfTUFORklEOworCWlmIChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSA9PSAwKSB7CisJCWludCBpOworCQljaXN0cGxfbWFuZmlkX3QgKm1hbmZpZDsKKwkJQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKwkJQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKwkJbWFuZmlkID0gJihwYXJzZS5tYW5maWQpOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGNhcmRfdGFibGUpL3NpemVvZihjYXJkX3RhYmxlWzBdKTsgaSsrKSB7CisJCQlpZiAoIWNhcmRfdGFibGVbaV0udmVyMSAmJgorCQkJICAgIG1hbmZpZC0+bWFuZiA9PSBjYXJkX3RhYmxlW2ldLm1hbmYgJiYKKwkJCSAgICBtYW5maWQtPmNhcmQgPT0gY2FyZF90YWJsZVtpXS5jYXJkKSB7CisJCQkJY2FyZF9pbmRleCA9IGk7CisJCQkJZG9uZSA9IDE7CisJCQl9CisJCX0KKwl9CisKKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfVkVSU18xOworCWlmICghZG9uZSAmJiAocGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkgPT0gMCkpIHsKKwkJaW50IGksIGosIGs7CisJCWNpc3RwbF92ZXJzXzFfdCAqdmVyMTsKKwkJQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKwkJQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKwkJdmVyMSA9ICYocGFyc2UudmVyc2lvbl8xKTsKKwkJCisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoY2FyZF90YWJsZSkvc2l6ZW9mKGNhcmRfdGFibGVbMF0pOyBpKyspIHsKKwkJCWZvciAoaiA9IDA7IGogPCB2ZXIxLT5uczsgaisrKSB7CisJCQkJY2hhciAqcCA9IGNhcmRfdGFibGVbaV0udmVyMTsKKwkJCQljaGFyICpxID0gJnZlcjEtPnN0clt2ZXIxLT5vZnNbal1dOworCQkJCWlmICghcCkKKwkJCQkJZ290byBtaXNtYXRjaDsKKwkJCQlmb3IgKGsgPSAwOyBrIDwgajsgaysrKSB7CisJCQkJCXdoaWxlICgoKnAgIT0gJ1wwJykgJiYgKCpwICE9ICcvJykpIHArKzsKKwkJCQkJaWYgKCpwID09ICdcMCcpIHsKKwkJCQkJCWlmICgqcSAhPSAnXDAnKQorCQkJCQkJCWdvdG8gbWlzbWF0Y2g7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwKys7CisJCQkJCX0KKwkJCQl9CisJCQkJd2hpbGUoKCpxICE9ICdcMCcpICYmICgqcCAhPSAnXDAnKSAmJiAKKwkJCQkgICAgICAoKnAgIT0gJy8nKSAmJiAoKnAgPT0gKnEpKSBwKyssIHErKzsKKwkJCQlpZiAoKCgqcCAhPSAnXDAnKSAmJiAqcCAhPSAnLycpIHx8ICpxICE9ICdcMCcpCisJCQkJCWdvdG8gbWlzbWF0Y2g7CisJCQl9CisJCQljYXJkX2luZGV4ID0gaTsKKwkJCWJyZWFrOwkvKiBkb25lICovCisJCQkKKwkJbWlzbWF0Y2g6CisJCQlqID0gMDsgLyogZHVtbXkgc3RtdCB0byBzaHV0IHVwIGNvbXBpbGVyICovCisJCX0KKwl9CQkKKworCS8qCisJICBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24KKwkgIHJlZ2lzdGVycy4KKwkqLworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisJQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKwlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKwlsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CisJCisJLyogQ29uZmlndXJlIGNhcmQgKi8KKwlsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworCQorCS8qCisJICBJbiB0aGlzIGxvb3AsIHdlIHNjYW4gdGhlIENJUyBmb3IgY29uZmlndXJhdGlvbiB0YWJsZSBlbnRyaWVzLAorCSAgZWFjaCBvZiB3aGljaCBkZXNjcmliZXMgYSB2YWxpZCBjYXJkIGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZworCSAgdm9sdGFnZSwgSU8gd2luZG93LCBtZW1vcnkgd2luZG93LCBhbmQgaW50ZXJydXB0IHNldHRpbmdzLgorCSAgCisJICBXZSBtYWtlIG5vIGFzc3VtcHRpb25zIGFib3V0IHRoZSBjYXJkIHRvIGJlIGNvbmZpZ3VyZWQ6IHdlIHVzZQorCSAganVzdCB0aGUgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGluIHRoZSBDSVMuICBJbiBhbiBpZGVhbCB3b3JsZCwKKwkgIHRoaXMgd291bGQgd29yayBmb3IgYW55IFBDTUNJQSBjYXJkLCBidXQgaXQgcmVxdWlyZXMgYSBjb21wbGV0ZQorCSAgYW5kIGFjY3VyYXRlIENJUy4gIEluIHByYWN0aWNlLCBhIGRyaXZlciB1c3VhbGx5ICJrbm93cyIgbW9zdCBvZgorCSAgdGhlc2UgdGhpbmdzIHdpdGhvdXQgY29uc3VsdGluZyB0aGUgQ0lTLCBhbmQgbW9zdCBjbGllbnQgZHJpdmVycworCSAgd2lsbCBvbmx5IHVzZSB0aGUgQ0lTIHRvIGZpbGwgaW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZCBkZXRhaWxzLgorCSovCisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CisJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworCXdoaWxlICgxKSB7CisJCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgZGZsdCA9IHsgMCB9OworCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcgPSAmKHBhcnNlLmNmdGFibGVfZW50cnkpOworCQlpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSAhPSAwIHx8CisJCQkJcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpICE9IDApCisJCQlnb3RvIG5leHRfZW50cnk7CisJCQorCQlpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0RFRkFVTFQpIGRmbHQgPSAqY2ZnOworCQlpZiAoY2ZnLT5pbmRleCA9PSAwKSBnb3RvIG5leHRfZW50cnk7CisJCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZmctPmluZGV4OworCQkKKwkJLyogRG9lcyB0aGlzIGNhcmQgbmVlZCBhdWRpbyBvdXRwdXQ/ICovCisJCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfQVVESU8pIHsKKwkJCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9TUEtSOworCQkJbGluay0+Y29uZi5TdGF0dXMgPSBDQ1NSX0FVRElPX0VOQTsKKwkJfQorCQkKKwkJLyogVXNlIHBvd2VyIHNldHRpbmdzIGZvciBWY2MgYW5kIFZwcCBpZiBwcmVzZW50ICovCisJCS8qICBOb3RlIHRoYXQgdGhlIENJUyB2YWx1ZXMgbmVlZCB0byBiZSByZXNjYWxlZCAqLworCQlpZiAoY2ZnLT52Y2MucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpCisJCQlsaW5rLT5jb25mLlZjYyA9IGNmZy0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMDsKKwkJZWxzZSBpZiAoZGZsdC52Y2MucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpCisJCQlsaW5rLT5jb25mLlZjYyA9IGRmbHQudmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMDsKKwkJCisJCWlmIChjZmctPnZwcDEucHJlc2VudCAmICgxPDxDSVNUUExfUE9XRVJfVk5PTSkpCisJCQlsaW5rLT5jb25mLlZwcDEgPSBsaW5rLT5jb25mLlZwcDIgPQorCQkJCWNmZy0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0vMTAwMDA7CisJCWVsc2UgaWYgKGRmbHQudnBwMS5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJCWxpbmstPmNvbmYuVnBwMSA9IGxpbmstPmNvbmYuVnBwMiA9CisJCQkJZGZsdC52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMDsKKwkJCisJCS8qIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gaW50ZXJydXB0PyAqLworCQlpZiAoY2ZnLT5pcnEuSVJRSW5mbzEgfHwgZGZsdC5pcnEuSVJRSW5mbzEpCisJCQlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROworCQkKKwkJLyogSU8gd2luZG93IHNldHRpbmdzICovCisJCWxpbmstPmlvLk51bVBvcnRzMSA9IGxpbmstPmlvLk51bVBvcnRzMiA9IDA7CisJCWlmICgoY2ZnLT5pby5ud2luID4gMCkgfHwgKGRmbHQuaW8ubndpbiA+IDApKSB7CisJCQljaXN0cGxfaW9fdCAqaW8gPSAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJmRmbHQuaW87CisJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQorCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OworCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKKwkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OworCQkJbGluay0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOworCQkJbGluay0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47CisJCQlpZiAoaW8tPm53aW4gPiAxKSB7CisJCQkJbGluay0+aW8uQXR0cmlidXRlczIgPSBsaW5rLT5pby5BdHRyaWJ1dGVzMTsKKwkJCQlsaW5rLT5pby5CYXNlUG9ydDIgPSBpby0+d2luWzFdLmJhc2U7CisJCQkJbGluay0+aW8uTnVtUG9ydHMyID0gaW8tPndpblsxXS5sZW47CisJCQl9CisJCX0KKwkJCisJCS8qIFRoaXMgcmVzZXJ2ZXMgSU8gc3BhY2UgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgZW5hYmxlIGl0ICovCisJCWlmIChwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbykgIT0gMCkKKwkJCWdvdG8gbmV4dF9lbnRyeTsKKworCQkvKiBJZiB3ZSBnb3QgdGhpcyBmYXIsIHdlJ3JlIGNvb2whICovCisJCWJyZWFrOworCQkKKwluZXh0X2VudHJ5OgorCQlDU19DSEVDSyhHZXROZXh0VHVwbGUsIHBjbWNpYV9nZXRfbmV4dF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworCX0KKwkKKwkvKgorCSAgQWxsb2NhdGUgYW4gaW50ZXJydXB0IGxpbmUuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhc3NpZ24gYQorCSAgaGFuZGxlciB0byB0aGUgaW50ZXJydXB0LCB1bmxlc3MgdGhlICdIYW5kbGVyJyBtZW1iZXIgb2YgdGhlCisJICBpcnEgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLgorCSovCisJaWYgKGxpbmstPmNvbmYuQXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkKKwkJQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSkpOworCQorCS8qCisJICBUaGlzIGFjdHVhbGx5IGNvbmZpZ3VyZXMgdGhlIFBDTUNJQSBzb2NrZXQgLS0gc2V0dGluZyB1cAorCSAgdGhlIEkvTyB3aW5kb3dzIGFuZCB0aGUgaW50ZXJydXB0IG1hcHBpbmcsIGFuZCBwdXR0aW5nIHRoZQorCSAgY2FyZCBhbmQgaG9zdCBpbnRlcmZhY2UgaW50byAiTWVtb3J5IGFuZCBJTyIgbW9kZS4KKwkqLworCUNTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKwkKKwlpZiAobGluay0+aXJxLkFzc2lnbmVkSVJRID09IDApIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgCisJCSAgICAgICAiYXRtZWw6IGNhbm5vdCBhc3NpZ24gSVJROiBjaGVjayB0aGF0IENPTkZJR19JU0EgaXMgc2V0IGluIGtlcm5lbCBjb25maWcuIik7CisJCWdvdG8gY3NfZmFpbGVkOworCX0KKyAgICAgICAKKwkoKGxvY2FsX2luZm9fdCopbGluay0+cHJpdiktPmV0aF9kZXYgPSAKKwkJaW5pdF9hdG1lbF9jYXJkKGxpbmstPmlycS5Bc3NpZ25lZElSUSwKKwkJCQlsaW5rLT5pby5CYXNlUG9ydDEsCisJCQkJY2FyZF9pbmRleCA9PSAtMSA/IEFUTUVMX0ZXX1RZUEVfTk9ORSA6ICBjYXJkX3RhYmxlW2NhcmRfaW5kZXhdLmZpcm13YXJlLAorCQkJCSZoYW5kbGVfdG9fZGV2KGhhbmRsZSksCisJCQkJY2FyZF9wcmVzZW50LCAKKwkJCQlsaW5rKTsKKwlpZiAoISgobG9jYWxfaW5mb190KilsaW5rLT5wcml2KS0+ZXRoX2RldikgCisJCWdvdG8gY3NfZmFpbGVkOworCQorCS8qCisJICBBdCB0aGlzIHBvaW50LCB0aGUgZGV2X25vZGVfdCBzdHJ1Y3R1cmUocykgbmVlZCB0byBiZQorCSAgaW5pdGlhbGl6ZWQgYW5kIGFycmFuZ2VkIGluIGEgbGlua2VkIGxpc3QgYXQgbGluay0+ZGV2LgorCSovCisJc3RyY3B5KGRldi0+bm9kZS5kZXZfbmFtZSwgKChsb2NhbF9pbmZvX3QqKWxpbmstPnByaXYpLT5ldGhfZGV2LT5uYW1lICk7CisJZGV2LT5ub2RlLm1ham9yID0gZGV2LT5ub2RlLm1pbm9yID0gMDsKKwlsaW5rLT5kZXYgPSAmZGV2LT5ub2RlOworCQorCS8qIEZpbmFsbHksIHJlcG9ydCB3aGF0IHdlJ3ZlIGRvbmUgKi8KKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMlc2luZGV4IDB4JTAyeDogVmNjICVkLiVkIiwKKwkgICAgICAgZGV2LT5ub2RlLmRldl9uYW1lLAorCSAgICAgICBjYXJkX2luZGV4ID09IC0xID8gIiIgOiAgY2FyZF90YWJsZVtjYXJkX2luZGV4XS5uYW1lLAorCSAgICAgICBjYXJkX2luZGV4ID09IC0xID8gIiIgOiAiICIsCisJICAgICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXgsCisJICAgICAgIGxpbmstPmNvbmYuVmNjLzEwLCBsaW5rLT5jb25mLlZjYyUxMCk7CisJaWYgKGxpbmstPmNvbmYuVnBwMSkKKwkJcHJpbnRrKCIsIFZwcCAlZC4lZCIsIGxpbmstPmNvbmYuVnBwMS8xMCwgbGluay0+Y29uZi5WcHAxJTEwKTsKKwlpZiAobGluay0+Y29uZi5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfSVJRKQorCQlwcmludGsoIiwgaXJxICVkIiwgbGluay0+aXJxLkFzc2lnbmVkSVJRKTsKKwlpZiAobGluay0+aW8uTnVtUG9ydHMxKQorCQlwcmludGsoIiwgaW8gMHglMDR4LTB4JTA0eCIsIGxpbmstPmlvLkJhc2VQb3J0MSwKKwkJICAgICAgIGxpbmstPmlvLkJhc2VQb3J0MStsaW5rLT5pby5OdW1Qb3J0czEtMSk7CisJaWYgKGxpbmstPmlvLk51bVBvcnRzMikKKwkJcHJpbnRrKCIgJiAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQyLAorCQkgICAgICAgbGluay0+aW8uQmFzZVBvcnQyK2xpbmstPmlvLk51bVBvcnRzMi0xKTsKKwlwcmludGsoIlxuIik7CisJCisJbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKwlyZXR1cm47CisJCisgY3NfZmFpbGVkOgorCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworCWF0bWVsX3JlbGVhc2UobGluayk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIGF0bWVsX3JlbGVhc2UoKSB3aWxsIHVucmVnaXN0ZXIgdGhlCisgIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICBzdGlsbCBvcGVuLCB0aGlzIHdpbGwgYmUgcG9zdHBvbmVkIHVudGlsIGl0IGlzIGNsb3NlZC4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBhdG1lbF9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9ICgobG9jYWxfaW5mb190KilsaW5rLT5wcml2KS0+ZXRoX2RldjsKKwkJCisJREVCVUcoMCwgImF0bWVsX3JlbGVhc2UoMHglcClcbiIsIGxpbmspOworCQorCS8qIFVubGluayB0aGUgZGV2aWNlIGNoYWluICovCisJbGluay0+ZGV2ID0gTlVMTDsKKwkKKwlpZiAoZGV2KSAKKwkJc3RvcF9hdG1lbF9jYXJkKGRldiwgMCk7CisJKChsb2NhbF9pbmZvX3QqKWxpbmstPnByaXYpLT5ldGhfZGV2ID0gTlVMTDsgCisJCisJLyogRG9uJ3QgYm90aGVyIGNoZWNraW5nIHRvIHNlZSBpZiB0aGVzZSBzdWNjZWVkIG9yIG5vdCAqLworCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwlpZiAobGluay0+aW8uTnVtUG9ydHMxKQorCQlwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJaWYgKGxpbmstPmlycS5Bc3NpZ25lZElSUSkKKwkJcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisJbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgVGhlIGNhcmQgc3RhdHVzIGV2ZW50IGhhbmRsZXIuICBNb3N0bHksIHRoaXMgc2NoZWR1bGVzIG90aGVyCisgIHN0dWZmIHRvIHJ1biBhZnRlciBhbiBldmVudCBpcyByZWNlaXZlZC4KKworICBXaGVuIGEgQ0FSRF9SRU1PVkFMIGV2ZW50IGlzIHJlY2VpdmVkLCB3ZSBpbW1lZGlhdGVseSBzZXQgYQorICBwcml2YXRlIGZsYWcgdG8gYmxvY2sgZnV0dXJlIGFjY2Vzc2VzIHRvIHRoaXMgZGV2aWNlLiAgQWxsIHRoZQorICBmdW5jdGlvbnMgdGhhdCBhY3R1YWxseSBhY2Nlc3MgdGhlIGRldmljZSBzaG91bGQgY2hlY2sgdGhpcyBmbGFnCisgIHRvIG1ha2Ugc3VyZSB0aGUgY2FyZCBpcyBzdGlsbCBwcmVzZW50LgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgYXRtZWxfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCit7CisJZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworCWxvY2FsX2luZm9fdCAqbG9jYWwgPSBsaW5rLT5wcml2OworCQorCURFQlVHKDEsICJhdG1lbF9ldmVudCgweCUwNngpXG4iLCBldmVudCk7CisJCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgorCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1BSRVNFTlQ7CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCW5ldGlmX2RldmljZV9kZXRhY2gobG9jYWwtPmV0aF9kZXYpOworCQkJYXRtZWxfcmVsZWFzZShsaW5rKTsKKwkJfQorCQlicmVhazsKKwljYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorCQlsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKKwkJYXRtZWxfY29uZmlnKGxpbmspOworCQlicmVhazsKKwljYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisJCWxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOworCQkvKiBGYWxsIHRocm91Z2guLi4gKi8KKwljYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQluZXRpZl9kZXZpY2VfZGV0YWNoKGxvY2FsLT5ldGhfZGV2KTsKKwkJCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwkJfQorCQlicmVhazsKKwljYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKwkJbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworCQkvKiBGYWxsIHRocm91Z2guLi4gKi8KKwljYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCXBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisJCQlhdG1lbF9vcGVuKGxvY2FsLT5ldGhfZGV2KTsKKwkJCW5ldGlmX2RldmljZV9hdHRhY2gobG9jYWwtPmV0aF9kZXYpOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30gLyogYXRtZWxfZXZlbnQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgYXRtZWxfZHJpdmVyID0geworICAgICAgICAub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKKyAgICAgICAgLmRydiAgICAgICAgICAgID0geworICAgICAgICAgICAgICAgIC5uYW1lICAgPSAiYXRtZWxfY3MiLAorICAgICAgICB9LAorICAgICAgICAuYXR0YWNoICAgICAgICAgPSBhdG1lbF9hdHRhY2gsCisgICAgICAgIC5kZXRhY2ggICAgICAgICA9IGF0bWVsX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgYXRtZWxfY3NfaW5pdCh2b2lkKQoreworICAgICAgICByZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmYXRtZWxfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgYXRtZWxfY3NfY2xlYW51cCh2b2lkKQoreworICAgICAgICBwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJmF0bWVsX2RyaXZlcik7CisJQlVHX09OKGRldl9saXN0ICE9IE5VTEwpOworfQorCisvKgorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgICAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgSW4gYWRkaXRpb246CisKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICBhcmUgbWV0OgorCisgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAgICAgICBwZXJtaXNzaW9uLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAgICBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICAgIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICAgIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAgICBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAgICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAgICBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAgICBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgICAgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgICAgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgICAgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuICAgIAorKi8KKworbW9kdWxlX2luaXQoYXRtZWxfY3NfaW5pdCk7Cittb2R1bGVfZXhpdChhdG1lbF9jc19jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX3BjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViMDBhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX3BjaS5jCkBAIC0wLDAgKzEsODkgQEAKKy8qKiogLSotIGxpbnV4LWMgLSotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICBEcml2ZXIgZm9yIEF0bWVsIGF0NzZjNTAyIGF0NzZjNTA0IGFuZCBhdDc2YzUwNiB3aXJlbGVzcyBjYXJkcy4KKworICAgICAgICAgQ29weXJpZ2h0IDIwMDQgU2ltb24gS2VsbGV5LgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIEF0bWVsIHdpcmVsZXNzIGxhbiBkcml2ZXJzOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgImF0bWVsLmgiCisKK01PRFVMRV9BVVRIT1IoIlNpbW9uIEtlbGxleSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBwb3J0IGZvciBBdG1lbCBhdDc2YzUweCA4MDIuMTEgd2lyZWxlc3MgZXRoZXJuZXQgY2FyZHMuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiQXRtZWwgYXQ3NmM1MDYgUENJIHdpcmVsZXNzIGNhcmRzIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjYXJkX2lkc1tdID0geworCXsgMHgxMTE0LCAweDA1MDYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjYXJkX2lkcyk7CisKK3N0YXRpYyBpbnQgYXRtZWxfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICosIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICopOworc3RhdGljIHZvaWQgYXRtZWxfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGF0bWVsX2RyaXZlciA9IHsKKwkubmFtZSAgICAgPSAiYXRtZWwiLAorCS5pZF90YWJsZSA9IGNhcmRfaWRzLAorCS5wcm9iZSAgICA9IGF0bWVsX3BjaV9wcm9iZSwKKwkucmVtb3ZlICAgPSBfX2RldmV4aXRfcChhdG1lbF9wY2lfcmVtb3ZlKSwKK307CisKKworc3RhdGljIGludCBfX2RldmluaXQgYXRtZWxfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBlbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwkJCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwkKKwlkZXYgPSBpbml0X2F0bWVsX2NhcmQocGRldi0+aXJxLCBwZGV2LT5yZXNvdXJjZVsxXS5zdGFydCwgCisJCQkgICAgICBBVE1FTF9GV19UWVBFXzUwNiwKKwkJCSAgICAgICZwZGV2LT5kZXYsIE5VTEwsIE5VTEwpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKwkKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGF0bWVsX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RvcF9hdG1lbF9jYXJkKHBjaV9nZXRfZHJ2ZGF0YShwZGV2KSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGF0bWVsX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmYXRtZWxfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGF0bWVsX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhdG1lbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhdG1lbF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChhdG1lbF9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9oZXJtZXMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYzNkMGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9oZXJtZXMuYwpAQCAtMCwwICsxLDU1NCBAQAorLyogaGVybWVzLmMKKyAqCisgKiBEcml2ZXIgY29yZSBmb3IgdGhlICJIZXJtZXMiIHdpcmVsZXNzIE1BQyBjb250cm9sbGVyLCBhcyB1c2VkIGluCisgKiB0aGUgTHVjZW50IE9yaW5vY28gYW5kIENhYmxldHJvbiBSb2FtQWJvdXQgY2FyZHMuIEl0IHNob3VsZCBhbHNvCisgKiB3b3JrIG9uIHRoZSBoZmEzODQxIGFuZCBoZmEzODQyIE1BQyBjb250cm9sbGVyIGNoaXBzIHVzZWQgaW4gdGhlCisgKiBQcmlzbSBJSSBjaGlwc2V0cy4KKyAqCisgKiBUaGlzIGlzIG5vdCBhIGNvbXBsZXRlIGRyaXZlciwganVzdCBsb3ctbGV2ZWwgYWNjZXNzIHJvdXRpbmVzIGZvcgorICogdGhlIE1BQyBjb250cm9sbGVyIGl0c2VsZi4KKyAqCisgKiBCYXNlZCBvbiB0aGUgcHJpc20yIGRyaXZlciBmcm9tIEFic29sdXRlIFZhbHVlIFN5c3RlbXMnIGxpbnV4LXdsYW4KKyAqIHByb2plY3QsIHRoZSBMaW51eCB3dmxhbl9jcyBkcml2ZXIsIEx1Y2VudCdzIEhDRi1MaWdodAorICogKHd2bGFuX2hjZi5jKSBsaWJyYXJ5LCBhbmQgdGhlIE5ldEJTRCB3aXJlbGVzcyBkcml2ZXIgKGluIG5vCisgKiBwYXJ0aWN1bGFyIG9yZGVyKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsIERhdmlkIEdpYnNvbiwgTGludXhjYXJlIEF1c3RyYWxpYS4KKyAqIChDKSBDb3B5cmlnaHQgRGF2aWQgR2lic29uLCBJQk0gQ29ycC4gMjAwMS0yMDAzLgorICogCisgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluCisgKiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZQorICogYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCisgKgorICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIgorICogYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZQorICogdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluCisgKiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUKKyAqIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCisgKiBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyCisgKiB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5CisgKiBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQKKyAqIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZQorICogcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCisgKiB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorCisjaW5jbHVkZSAiaGVybWVzLmgiCisKK01PRFVMRV9ERVNDUklQVElPTigiTG93LWxldmVsIGRyaXZlciBoZWxwZXIgZm9yIEx1Y2VudCBIZXJtZXMgY2hpcHNldCBhbmQgUHJpc20gSUkgSEZBMzg0eCB3aXJlbGVzcyBNQUMgY29udHJvbGxlciIpOworTU9EVUxFX0FVVEhPUigiUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4iCisJIiAmIERhdmlkIEdpYnNvbiA8aGVybWVzQGdpYnNvbi5kcm9wYmVhci5pZC5hdT4iKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIE1QTC9HUEwiKTsKKworLyogVGhlc2UgYXJlIG1heGltdW0gdGltZW91dHMuIE1vc3Qgb2Z0ZW4sIGNhcmQgd2lsIHJlYWN0IG11Y2ggZmFzdGVyICovCisjZGVmaW5lIENNRF9CVVNZX1RJTUVPVVQgKDEwMCkgLyogSW4gaXRlcmF0aW9ucyBvZiB+MXVzICovCisjZGVmaW5lIENNRF9JTklUX1RJTUVPVVQgKDUwMDAwKSAvKiBpbiBpdGVyYXRpb25zIG9mIH4xMHVzICovCisjZGVmaW5lIENNRF9DT01QTF9USU1FT1VUICgyMDAwMCkgLyogaW4gaXRlcmF0aW9ucyBvZiB+MTB1cyAqLworI2RlZmluZSBBTExPQ19DT01QTF9USU1FT1VUICgxMDAwKSAvKiBpbiBpdGVyYXRpb25zIG9mIH4xMHVzICovCisKKy8qCisgKiBEZWJ1Z2dpbmcgaGVscGVycworICovCisKKyNkZWZpbmUgRE1TRyhzdHVmZi4uLikgZG8ge3ByaW50ayhLRVJOX0RFQlVHICJoZXJtZXMgQCAlcDogIiAsIGh3LT5pb2Jhc2UpOyBcCisJCQlwcmludGsoc3R1ZmYpO30gd2hpbGUgKDApCisKKyN1bmRlZiBIRVJNRVNfREVCVUcKKyNpZmRlZiBIRVJNRVNfREVCVUcKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2RlZmluZSBERUJVRyhsdmwsIHN0dWZmLi4uKSBpZiAoIChsdmwpIDw9IEhFUk1FU19ERUJVRykgRE1TRyhzdHVmZikKKworI2Vsc2UgLyogISBIRVJNRVNfREVCVUcgKi8KKworI2RlZmluZSBERUJVRyhsdmwsIHN0dWZmLi4uKSBkbyB7IH0gd2hpbGUgKDApCisKKyNlbmRpZiAvKiAhIEhFUk1FU19ERUJVRyAqLworCisKKy8qCisgKiBJbnRlcm5hbCBmdW5jdGlvbnMKKyAqLworCisvKiBJc3N1ZSBhIGNvbW1hbmQgdG8gdGhlIGNoaXAuIFdhaXRpbmcgZm9yIGl0IHRvIGNvbXBsZXRlIGlzIHRoZSBjYWxsZXIncworICAgcHJvYmxlbS4KKworICAgUmV0dXJucyAtRUJVU1kgaWYgdGhlIGNvbW1hbmQgcmVnaXN0ZXIgaXMgYnVzeSwgMCBvbiBzdWNjZXNzLgorCisgICBDYWxsYWJsZSBmcm9tIGFueSBjb250ZXh0LgorKi8KK3N0YXRpYyBpbnQgaGVybWVzX2lzc3VlX2NtZChoZXJtZXNfdCAqaHcsIHUxNiBjbWQsIHUxNiBwYXJhbTApCit7CisJaW50IGsgPSBDTURfQlVTWV9USU1FT1VUOworCXUxNiByZWc7CisKKwkvKiBGaXJzdCB3YWl0IGZvciB0aGUgY29tbWFuZCByZWdpc3RlciB0byB1bmJ1c3kgKi8KKwlyZWcgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBDTUQpOworCXdoaWxlICggKHJlZyAmIEhFUk1FU19DTURfQlVTWSkgJiYgayApIHsKKwkJay0tOworCQl1ZGVsYXkoMSk7CisJCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIENNRCk7CisJfQorCWlmIChyZWcgJiBIRVJNRVNfQ01EX0JVU1kpIHsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwloZXJtZXNfd3JpdGVfcmVnbihodywgUEFSQU0yLCAwKTsKKwloZXJtZXNfd3JpdGVfcmVnbihodywgUEFSQU0xLCAwKTsKKwloZXJtZXNfd3JpdGVfcmVnbihodywgUEFSQU0wLCBwYXJhbTApOworCWhlcm1lc193cml0ZV9yZWduKGh3LCBDTUQsIGNtZCk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBkZWZpbml0aW9ucworICovCisKK3ZvaWQgaGVybWVzX3N0cnVjdF9pbml0KGhlcm1lc190ICpodywgdm9pZCBfX2lvbWVtICphZGRyZXNzLCBpbnQgcmVnX3NwYWNpbmcpCit7CisJaHctPmlvYmFzZSA9IGFkZHJlc3M7CisJaHctPnJlZ19zcGFjaW5nID0gcmVnX3NwYWNpbmc7CisJaHctPmludGVuID0gMHgwOworCisjaWZkZWYgSEVSTUVTX0RFQlVHX0JVRkZFUgorCWh3LT5kYnVmcCA9IDA7CisJbWVtc2V0KCZody0+ZGJ1ZiwgMHhmZiwgc2l6ZW9mKGh3LT5kYnVmKSk7CisJbWVtc2V0KCZody0+cHJvZmlsZSwgMCwgc2l6ZW9mKGh3LT5wcm9maWxlKSk7CisjZW5kaWYKK30KKworaW50IGhlcm1lc19pbml0KGhlcm1lc190ICpodykKK3sKKwl1MTYgc3RhdHVzLCByZWc7CisJaW50IGVyciA9IDA7CisJaW50IGs7CisKKwkvKiBXZSBkb24ndCB3YW50IHRvIGJlIGludGVycnVwdGVkIHdoaWxlIHJlc2V0dGluZyB0aGUgY2hpcHNldCAqLworCWh3LT5pbnRlbiA9IDB4MDsKKwloZXJtZXNfd3JpdGVfcmVnbihodywgSU5URU4sIDApOworCWhlcm1lc193cml0ZV9yZWduKGh3LCBFVkFDSywgMHhmZmZmKTsKKworCS8qIE5vcm1hbGx5IGl0J3MgYSAiY2FuJ3QgaGFwcGVuIiBmb3IgdGhlIGNvbW1hbmQgcmVnaXN0ZXIgdG8KKyAgICAgICAgICAgYmUgYnVzeSB3aGVuIHdlIGdvIHRvIGlzc3VlIGEgY29tbWFuZCBiZWNhdXNlIHdlIGFyZQorICAgICAgICAgICBzZXJpYWxpemluZyBhbGwgY29tbWFuZHMuICBIb3dldmVyIHdlIHdhbnQgdG8gaGF2ZSBzb21lCisgICAgICAgICAgIGNoYW5jZSBvZiByZXNldHRpbmcgdGhlIGNhcmQgZXZlbiBpZiBpdCBnZXRzIGludG8gYSBzdHVwaWQKKyAgICAgICAgICAgc3RhdGUsIHNvIHdlIGFjdHVhbGx5IHdhaXQgdG8gc2VlIGlmIHRoZSBjb21tYW5kIHJlZ2lzdGVyCisgICAgICAgICAgIHdpbGwgdW5idXN5IGl0c2VsZiBoZXJlLiAqLworCWsgPSBDTURfQlVTWV9USU1FT1VUOworCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIENNRCk7CisJd2hpbGUgKGsgJiYgKHJlZyAmIEhFUk1FU19DTURfQlVTWSkpIHsKKwkJaWYgKHJlZyA9PSAweGZmZmYpIC8qIFNwZWNpYWwgY2FzZSAtIHRoZSBjYXJkIGhhcyBwcm9iYWJseSBiZWVuIHJlbW92ZWQsCisJCQkJICAgICAgc28gZG9uJ3Qgd2FpdCBmb3IgdGhlIHRpbWVvdXQgKi8KKwkJCXJldHVybiAtRU5PREVWOworCisJCWstLTsKKwkJdWRlbGF5KDEpOworCQlyZWcgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBDTUQpOworCX0KKwkKKwkvKiBObyBuZWVkIHRvIGV4cGxpY2l0bHkgaGFuZGxlIHRoZSB0aW1lb3V0IC0gaWYgd2UndmUgdGltZWQKKwkgICBvdXQgaGVybWVzX2lzc3VlX2NtZCgpIHdpbGwgcHJvYmFibHkgcmV0dXJuIC1FQlVTWSBiZWxvdyAqLworCisJLyogQWNjb3JkaW5nIHRvIHRoZSBkb2N1bWVudGF0aW9uLCBFVlNUQVQgbWF5IGNvbnRhaW4KKwkgICBvYnNvbGV0ZSBldmVudCBvY2N1cnJlbmNlIGluZm9ybWF0aW9uLiAgV2UgaGF2ZSB0byBhY2tub3dsZWRnZQorCSAgIGl0IGJ5IHdyaXRpbmcgRVZBQ0suICovCisJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgRVZTVEFUKTsKKwloZXJtZXNfd3JpdGVfcmVnbihodywgRVZBQ0ssIHJlZyk7CisKKwkvKiBXZSBkb24ndCB1c2UgaGVybWVzX2RvY21kX3dhaXQgaGVyZSwgYmVjYXVzZSB0aGUgcmVzZXQgd2lwZXMKKwkgICB0aGUgbWFnaWMgY29uc3RhbnQgaW4gU1dTVVBQT1JUMCBhd2F5LCBhbmQgaXQgZ2V0cyBjb25mdXNlZCAqLworCWVyciA9IGhlcm1lc19pc3N1ZV9jbWQoaHcsIEhFUk1FU19DTURfSU5JVCwgMCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIEVWU1RBVCk7CisJayA9IENNRF9JTklUX1RJTUVPVVQ7CisJd2hpbGUgKCAoISAocmVnICYgSEVSTUVTX0VWX0NNRCkpICYmIGspIHsKKwkJay0tOworCQl1ZGVsYXkoMTApOworCQlyZWcgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBFVlNUQVQpOworCX0KKworCWhlcm1lc193cml0ZV9yZWduKGh3LCBTV1NVUFBPUlQwLCBIRVJNRVNfTUFHSUMpOworCisJaWYgKCEgaGVybWVzX3ByZXNlbnQoaHcpKSB7CisJCURFQlVHKDAsICJoZXJtZXMgQCAweCV4OiBDYXJkIHJlbW92ZWQgZHVyaW5nIHJlc2V0LlxuIiwKKwkJICAgICAgIGh3LT5pb2Jhc2UpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisJCQorCWlmICghIChyZWcgJiBIRVJNRVNfRVZfQ01EKSkgeworCQlwcmludGsoS0VSTl9FUlIgImhlcm1lcyBAICVwOiAiIAorCQkgICAgICAgIlRpbWVvdXQgd2FpdGluZyBmb3IgY2FyZCB0byByZXNldCAocmVnPTB4JTA0eCkhXG4iLAorCQkgICAgICAgaHctPmlvYmFzZSwgcmVnKTsKKwkJZXJyID0gLUVUSU1FRE9VVDsKKwkJZ290byBvdXQ7CisJfQorCisJc3RhdHVzID0gaGVybWVzX3JlYWRfcmVnbihodywgU1RBVFVTKTsKKworCWhlcm1lc193cml0ZV9yZWduKGh3LCBFVkFDSywgSEVSTUVTX0VWX0NNRCk7CisKKwlpZiAoc3RhdHVzICYgSEVSTUVTX1NUQVRVU19SRVNVTFQpCisJCWVyciA9IC1FSU87CisKKyBvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyogSXNzdWUgYSBjb21tYW5kIHRvIHRoZSBjaGlwLCBhbmQgKGJ1c3khKSB3YWl0IGZvciBpdCB0bworICogY29tcGxldGUuCisgKgorICogUmV0dXJuczogPCAwIG9uIGludGVybmFsIGVycm9yLCAwIG9uIHN1Y2Nlc3MsID4gMCBvbiBlcnJvciByZXR1cm5lZCBieSB0aGUgZmlybXdhcmUKKyAqCisgKiBDYWxsYWJsZSBmcm9tIGFueSBjb250ZXh0LCBidXQgbG9ja2luZyBpcyB5b3VyIHByb2JsZW0uICovCitpbnQgaGVybWVzX2RvY21kX3dhaXQoaGVybWVzX3QgKmh3LCB1MTYgY21kLCB1MTYgcGFybTAsCisJCSAgICAgIHN0cnVjdCBoZXJtZXNfcmVzcG9uc2UgKnJlc3ApCit7CisJaW50IGVycjsKKwlpbnQgazsKKwl1MTYgcmVnOworCXUxNiBzdGF0dXM7CisKKwllcnIgPSBoZXJtZXNfaXNzdWVfY21kKGh3LCBjbWQsIHBhcm0wKTsKKwlpZiAoZXJyKSB7CisJCWlmICghIGhlcm1lc19wcmVzZW50KGh3KSkgeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZXJtZXMgQCAlcDogIgorCQkJCSAgICAgICAiQ2FyZCByZW1vdmVkIHdoaWxlIGlzc3VpbmcgY29tbWFuZCAiCisJCQkJICAgICAgICIweCUwNHguXG4iLCBody0+aW9iYXNlLCBjbWQpOworCQkJZXJyID0gLUVOT0RFVjsKKwkJfSBlbHNlIAorCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlwcmludGsoS0VSTl9FUlIgImhlcm1lcyBAICVwOiAiCisJCQkJICAgICAgICJFcnJvciAlZCBpc3N1aW5nIGNvbW1hbmQgMHglMDR4LlxuIiwKKwkJCQkgICAgICAgaHctPmlvYmFzZSwgZXJyLCBjbWQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZWcgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBFVlNUQVQpOworCWsgPSBDTURfQ09NUExfVElNRU9VVDsKKwl3aGlsZSAoICghIChyZWcgJiBIRVJNRVNfRVZfQ01EKSkgJiYgaykgeworCQlrLS07CisJCXVkZWxheSgxMCk7CisJCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIEVWU1RBVCk7CisJfQorCisJaWYgKCEgaGVybWVzX3ByZXNlbnQoaHcpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImhlcm1lcyBAICVwOiBDYXJkIHJlbW92ZWQgIgorCQkgICAgICAgIndoaWxlIHdhaXRpbmcgZm9yIGNvbW1hbmQgMHglMDR4IGNvbXBsZXRpb24uXG4iLAorCQkgICAgICAgaHctPmlvYmFzZSwgY21kKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCQkKKwlpZiAoISAocmVnICYgSEVSTUVTX0VWX0NNRCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoZXJtZXMgQCAlcDogVGltZW91dCB3YWl0aW5nIGZvciAiCisJCSAgICAgICAiY29tbWFuZCAweCUwNHggY29tcGxldGlvbi5cbiIsIGh3LT5pb2Jhc2UsIGNtZCk7CisJCWVyciA9IC1FVElNRURPVVQ7CisJCWdvdG8gb3V0OworCX0KKworCXN0YXR1cyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIFNUQVRVUyk7CisJaWYgKHJlc3ApIHsKKwkJcmVzcC0+c3RhdHVzID0gc3RhdHVzOworCQlyZXNwLT5yZXNwMCA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIFJFU1AwKTsKKwkJcmVzcC0+cmVzcDEgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBSRVNQMSk7CisJCXJlc3AtPnJlc3AyID0gaGVybWVzX3JlYWRfcmVnbihodywgUkVTUDIpOworCX0KKworCWhlcm1lc193cml0ZV9yZWduKGh3LCBFVkFDSywgSEVSTUVTX0VWX0NNRCk7CisKKwlpZiAoc3RhdHVzICYgSEVSTUVTX1NUQVRVU19SRVNVTFQpCisJCWVyciA9IC1FSU87CisKKyBvdXQ6CisJcmV0dXJuIGVycjsKK30KKworaW50IGhlcm1lc19hbGxvY2F0ZShoZXJtZXNfdCAqaHcsIHUxNiBzaXplLCB1MTYgKmZpZCkKK3sKKwlpbnQgZXJyID0gMDsKKwlpbnQgazsKKwl1MTYgcmVnOworCQorCWlmICggKHNpemUgPCBIRVJNRVNfQUxMT0NfTEVOX01JTikgfHwgKHNpemUgPiBIRVJNRVNfQUxMT0NfTEVOX01BWCkgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IGhlcm1lc19kb2NtZF93YWl0KGh3LCBIRVJNRVNfQ01EX0FMTE9DLCBzaXplLCBOVUxMKTsKKwlpZiAoZXJyKSB7CisJCXJldHVybiBlcnI7CisJfQorCisJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgRVZTVEFUKTsKKwlrID0gQUxMT0NfQ09NUExfVElNRU9VVDsKKwl3aGlsZSAoICghIChyZWcgJiBIRVJNRVNfRVZfQUxMT0MpKSAmJiBrKSB7CisJCWstLTsKKwkJdWRlbGF5KDEwKTsKKwkJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgRVZTVEFUKTsKKwl9CisJCisJaWYgKCEgaGVybWVzX3ByZXNlbnQoaHcpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImhlcm1lcyBAICVwOiAiCisJCSAgICAgICAiQ2FyZCByZW1vdmVkIHdhaXRpbmcgZm9yIGZyYW1lIGFsbG9jYXRpb24uXG4iLAorCQkgICAgICAgaHctPmlvYmFzZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkJCisJaWYgKCEgKHJlZyAmIEhFUk1FU19FVl9BTExPQykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoZXJtZXMgQCAlcDogIgorCQkgICAgICAgIlRpbWVvdXQgd2FpdGluZyBmb3IgZnJhbWUgYWxsb2NhdGlvblxuIiwKKwkJICAgICAgIGh3LT5pb2Jhc2UpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwkqZmlkID0gaGVybWVzX3JlYWRfcmVnbihodywgQUxMT0NGSUQpOworCWhlcm1lc193cml0ZV9yZWduKGh3LCBFVkFDSywgSEVSTUVTX0VWX0FMTE9DKTsKKwkKKwlyZXR1cm4gMDsKK30KKworCisvKiBTZXQgdXAgYSBCQVAgdG8gcmVhZCBhIHBhcnRpY3VsYXIgY2h1bmsgb2YgZGF0YSBmcm9tIGNhcmQncyBpbnRlcm5hbCBidWZmZXIuCisgKgorICogUmV0dXJuczogPCAwIG9uIGludGVybmFsIGZhaWx1cmUgKGVycm5vKSwgMCBvbiBzdWNjZXNzLCA+MCBvbiBlcnJvcgorICogZnJvbSBmaXJtd2FyZQorICoKKyAqIENhbGxhYmxlIGZyb20gYW55IGNvbnRleHQgKi8KK3N0YXRpYyBpbnQgaGVybWVzX2JhcF9zZWVrKGhlcm1lc190ICpodywgaW50IGJhcCwgdTE2IGlkLCB1MTYgb2Zmc2V0KQoreworCWludCBzcmVnID0gYmFwID8gSEVSTUVTX1NFTEVDVDEgOiBIRVJNRVNfU0VMRUNUMDsKKwlpbnQgb3JlZyA9IGJhcCA/IEhFUk1FU19PRkZTRVQxIDogSEVSTUVTX09GRlNFVDA7CisJaW50IGs7CisJdTE2IHJlZzsKKworCS8qIFBhcmFub2lhLi4gKi8KKwlpZiAoIChvZmZzZXQgPiBIRVJNRVNfQkFQX09GRlNFVF9NQVgpIHx8IChvZmZzZXQgJSAyKSApCisJCXJldHVybiAtRUlOVkFMOworCisJayA9IEhFUk1FU19CQVBfQlVTWV9USU1FT1VUOworCXJlZyA9IGhlcm1lc19yZWFkX3JlZyhodywgb3JlZyk7CisJd2hpbGUgKChyZWcgJiBIRVJNRVNfT0ZGU0VUX0JVU1kpICYmIGspIHsKKwkJay0tOworCQl1ZGVsYXkoMSk7CisJCXJlZyA9IGhlcm1lc19yZWFkX3JlZyhodywgb3JlZyk7CisJfQorCisjaWZkZWYgSEVSTUVTX0RFQlVHX0JVRkZFUgorCWh3LT5wcm9maWxlW0hFUk1FU19CQVBfQlVTWV9USU1FT1VUIC0ga10rKzsKKworCWlmIChrIDwgSEVSTUVTX0JBUF9CVVNZX1RJTUVPVVQpIHsKKwkJc3RydWN0IGhlcm1lc19kZWJ1Z19lbnRyeSAqZSA9IAorCQkJJmh3LT5kYnVmWyhody0+ZGJ1ZnArKykgJSBIRVJNRVNfREVCVUdfQlVGU0laRV07CisJCWUtPmJhcCA9IGJhcDsKKwkJZS0+aWQgPSBpZDsKKwkJZS0+b2Zmc2V0ID0gb2Zmc2V0OworCQllLT5jeWNsZXMgPSBIRVJNRVNfQkFQX0JVU1lfVElNRU9VVCAtIGs7CisJfQorI2VuZGlmCisKKwlpZiAocmVnICYgSEVSTUVTX09GRlNFVF9CVVNZKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCS8qIE5vdyB3ZSBhY3R1YWxseSBzZXQgdXAgdGhlIHRyYW5zZmVyICovCisJaGVybWVzX3dyaXRlX3JlZyhodywgc3JlZywgaWQpOworCWhlcm1lc193cml0ZV9yZWcoaHcsIG9yZWcsIG9mZnNldCk7CisKKwkvKiBXYWl0IGZvciB0aGUgQkFQIHRvIGJlIHJlYWR5ICovCisJayA9IEhFUk1FU19CQVBfQlVTWV9USU1FT1VUOworCXJlZyA9IGhlcm1lc19yZWFkX3JlZyhodywgb3JlZyk7CisJd2hpbGUgKCAocmVnICYgKEhFUk1FU19PRkZTRVRfQlVTWSB8IEhFUk1FU19PRkZTRVRfRVJSKSkgJiYgaykgeworCQlrLS07CisJCXVkZWxheSgxKTsKKwkJcmVnID0gaGVybWVzX3JlYWRfcmVnKGh3LCBvcmVnKTsKKwl9CisKKwlpZiAocmVnICE9IG9mZnNldCkgeworCQlwcmludGsoS0VSTl9FUlIgImhlcm1lcyBAICVwOiBCQVAlZCBvZmZzZXQgJXM6ICIKKwkJICAgICAgICJyZWc9MHgleCBpZD0weCV4IG9mZnNldD0weCV4XG4iLCBody0+aW9iYXNlLCBiYXAsCisJCSAgICAgICAocmVnICYgSEVSTUVTX09GRlNFVF9CVVNZKSA/ICJ0aW1lb3V0IiA6ICJlcnJvciIsCisJCSAgICAgICByZWcsIGlkLCBvZmZzZXQpOworCisJCWlmIChyZWcgJiBIRVJNRVNfT0ZGU0VUX0JVU1kpIHsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisKKwkJcmV0dXJuIC1FSU87CQkvKiBlcnJvciBvciB3cm9uZyBvZmZzZXQgKi8KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVhZCBhIGJsb2NrIG9mIGRhdGEgZnJvbSB0aGUgY2hpcCdzIGJ1ZmZlciwgdmlhIHRoZQorICogQkFQLiBTeW5jaHJvbml6YXRpb24vc2VyaWFsaXphdGlvbiBpcyB0aGUgY2FsbGVyJ3MgcHJvYmxlbS4gIGxlbgorICogbXVzdCBiZSBldmVuLgorICoKKyAqIFJldHVybnM6IDwgMCBvbiBpbnRlcm5hbCBmYWlsdXJlIChlcnJubyksIDAgb24gc3VjY2VzcywgPiAwIG9uIGVycm9yIGZyb20gZmlybXdhcmUKKyAqLworaW50IGhlcm1lc19iYXBfcHJlYWQoaGVybWVzX3QgKmh3LCBpbnQgYmFwLCB2b2lkICpidWYsIHVuc2lnbmVkIGxlbiwKKwkJICAgICB1MTYgaWQsIHUxNiBvZmZzZXQpCit7CisJaW50IGRyZWcgPSBiYXAgPyBIRVJNRVNfREFUQTEgOiBIRVJNRVNfREFUQTA7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIChsZW4gPCAwKSB8fCAobGVuICUgMikgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IGhlcm1lc19iYXBfc2VlayhodywgYmFwLCBpZCwgb2Zmc2V0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCS8qIEFjdHVhbGx5IGRvIHRoZSB0cmFuc2ZlciAqLworCWhlcm1lc19yZWFkX3dvcmRzKGh3LCBkcmVnLCBidWYsIGxlbi8yKTsKKworIG91dDoKKwlyZXR1cm4gZXJyOworfQorCisvKiBXcml0ZSBhIGJsb2NrIG9mIGRhdGEgdG8gdGhlIGNoaXAncyBidWZmZXIsIHZpYSB0aGUKKyAqIEJBUC4gU3luY2hyb25pemF0aW9uL3NlcmlhbGl6YXRpb24gaXMgdGhlIGNhbGxlcidzIHByb2JsZW0uIGxlbgorICogbXVzdCBiZSBldmVuLgorICoKKyAqIFJldHVybnM6IDwgMCBvbiBpbnRlcm5hbCBmYWlsdXJlIChlcnJubyksIDAgb24gc3VjY2VzcywgPiAwIG9uIGVycm9yIGZyb20gZmlybXdhcmUKKyAqLworaW50IGhlcm1lc19iYXBfcHdyaXRlKGhlcm1lc190ICpodywgaW50IGJhcCwgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsZW4sCisJCSAgICAgIHUxNiBpZCwgdTE2IG9mZnNldCkKK3sKKwlpbnQgZHJlZyA9IGJhcCA/IEhFUk1FU19EQVRBMSA6IEhFUk1FU19EQVRBMDsKKwlpbnQgZXJyID0gMDsKKworCWlmICggKGxlbiA8IDApIHx8IChsZW4gJSAyKSApCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gaGVybWVzX2JhcF9zZWVrKGh3LCBiYXAsIGlkLCBvZmZzZXQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCQorCS8qIEFjdHVhbGx5IGRvIHRoZSB0cmFuc2ZlciAqLworCWhlcm1lc193cml0ZV93b3JkcyhodywgZHJlZywgYnVmLCBsZW4vMik7CisKKyBvdXQ6CQorCXJldHVybiBlcnI7Cit9CisKKy8qIFJlYWQgYSBMZW5ndGgtVHlwZS1WYWx1ZSByZWNvcmQgZnJvbSB0aGUgY2FyZC4KKyAqCisgKiBJZiBsZW5ndGggaXMgTlVMTCwgd2UgaWdub3JlIHRoZSBsZW5ndGggcmVhZCBmcm9tIHRoZSBjYXJkLCBhbmQKKyAqIHJlYWQgdGhlIGVudGlyZSBidWZmZXIgcmVnYXJkbGVzcy4gVGhpcyBpcyB1c2VmdWwgYmVjYXVzZSBzb21lIG9mCisgKiB0aGUgY29uZmlndXJhdGlvbiByZWNvcmRzIGFwcGVhciB0byBoYXZlIGluY29ycmVjdCBsZW5ndGhzIGluCisgKiBwcmFjdGljZS4KKyAqCisgKiBDYWxsYWJsZSBmcm9tIHVzZXIgb3IgYmggY29udGV4dC4gICovCitpbnQgaGVybWVzX3JlYWRfbHR2KGhlcm1lc190ICpodywgaW50IGJhcCwgdTE2IHJpZCwgdW5zaWduZWQgYnVmc2l6ZSwKKwkJICAgIHUxNiAqbGVuZ3RoLCB2b2lkICpidWYpCit7CisJaW50IGVyciA9IDA7CisJaW50IGRyZWcgPSBiYXAgPyBIRVJNRVNfREFUQTEgOiBIRVJNRVNfREFUQTA7CisJdTE2IHJsZW5ndGgsIHJ0eXBlOworCXVuc2lnbmVkIG53b3JkczsKKworCWlmICggKGJ1ZnNpemUgPCAwKSB8fCAoYnVmc2l6ZSAlIDIpICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBoZXJtZXNfZG9jbWRfd2FpdChodywgSEVSTUVTX0NNRF9BQ0NFU1MsIHJpZCwgTlVMTCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGhlcm1lc19iYXBfc2VlayhodywgYmFwLCByaWQsIDApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlybGVuZ3RoID0gaGVybWVzX3JlYWRfcmVnKGh3LCBkcmVnKTsKKworCWlmICghIHJsZW5ndGgpCisJCXJldHVybiAtRU5PREFUQTsKKworCXJ0eXBlID0gaGVybWVzX3JlYWRfcmVnKGh3LCBkcmVnKTsKKworCWlmIChsZW5ndGgpCisJCSpsZW5ndGggPSBybGVuZ3RoOworCisJaWYgKHJ0eXBlICE9IHJpZCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGVybWVzIEAgJXA6ICVzKCk6ICIKKwkJICAgICAgICJyaWQgKDB4JTA0eCkgZG9lcyBub3QgbWF0Y2ggdHlwZSAoMHglMDR4KVxuIiwKKwkJICAgICAgIGh3LT5pb2Jhc2UsIF9fRlVOQ1RJT05fXywgcmlkLCBydHlwZSk7CisJaWYgKEhFUk1FU19SRUNMRU5fVE9fQllURVMocmxlbmd0aCkgPiBidWZzaXplKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZXJtZXMgQCAlcDogIgorCQkgICAgICAgIlRydW5jYXRpbmcgTFRWIHJlY29yZCBmcm9tICVkIHRvICVkIGJ5dGVzLiAiCisJCSAgICAgICAiKHJpZD0weCUwNHgsIGxlbj0weCUwNHgpXG4iLCBody0+aW9iYXNlLAorCQkgICAgICAgSEVSTUVTX1JFQ0xFTl9UT19CWVRFUyhybGVuZ3RoKSwgYnVmc2l6ZSwgcmlkLCBybGVuZ3RoKTsKKworCW53b3JkcyA9IG1pbigodW5zaWduZWQpcmxlbmd0aCAtIDEsIGJ1ZnNpemUgLyAyKTsKKwloZXJtZXNfcmVhZF93b3JkcyhodywgZHJlZywgYnVmLCBud29yZHMpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBoZXJtZXNfd3JpdGVfbHR2KGhlcm1lc190ICpodywgaW50IGJhcCwgdTE2IHJpZCwgCisJCSAgICAgdTE2IGxlbmd0aCwgY29uc3Qgdm9pZCAqdmFsdWUpCit7CisJaW50IGRyZWcgPSBiYXAgPyBIRVJNRVNfREFUQTEgOiBIRVJNRVNfREFUQTA7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgY291bnQ7CisKKwlpZiAobGVuZ3RoID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gaGVybWVzX2JhcF9zZWVrKGh3LCBiYXAsIHJpZCwgMCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWhlcm1lc193cml0ZV9yZWcoaHcsIGRyZWcsIGxlbmd0aCk7CisJaGVybWVzX3dyaXRlX3JlZyhodywgZHJlZywgcmlkKTsKKworCWNvdW50ID0gbGVuZ3RoIC0gMTsKKworCWhlcm1lc193cml0ZV93b3JkcyhodywgZHJlZywgdmFsdWUsIGNvdW50KTsKKworCWVyciA9IGhlcm1lc19kb2NtZF93YWl0KGh3LCBIRVJNRVNfQ01EX0FDQ0VTUyB8IEhFUk1FU19DTURfV1JJVEUsIAorCQkJCXJpZCwgTlVMTCk7CisKKwlyZXR1cm4gZXJyOworfQorCitFWFBPUlRfU1lNQk9MKGhlcm1lc19zdHJ1Y3RfaW5pdCk7CitFWFBPUlRfU1lNQk9MKGhlcm1lc19pbml0KTsKK0VYUE9SVF9TWU1CT0woaGVybWVzX2RvY21kX3dhaXQpOworRVhQT1JUX1NZTUJPTChoZXJtZXNfYWxsb2NhdGUpOworCitFWFBPUlRfU1lNQk9MKGhlcm1lc19iYXBfcHJlYWQpOworRVhQT1JUX1NZTUJPTChoZXJtZXNfYmFwX3B3cml0ZSk7CitFWFBPUlRfU1lNQk9MKGhlcm1lc19yZWFkX2x0dik7CitFWFBPUlRfU1lNQk9MKGhlcm1lc193cml0ZV9sdHYpOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2hlcm1lcyh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9oZXJtZXModm9pZCkKK3sKK30KKworbW9kdWxlX2luaXQoaW5pdF9oZXJtZXMpOworbW9kdWxlX2V4aXQoZXhpdF9oZXJtZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaGVybWVzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9oZXJtZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzllODc0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaGVybWVzLmgKQEAgLTAsMCArMSw0ODEgQEAKKy8qIGhlcm1lcy5oCisgKgorICogRHJpdmVyIGNvcmUgZm9yIHRoZSAiSGVybWVzIiB3aXJlbGVzcyBNQUMgY29udHJvbGxlciwgYXMgdXNlZCBpbgorICogdGhlIEx1Y2VudCBPcmlub2NvIGFuZCBDYWJsZXRyb24gUm9hbUFib3V0IGNhcmRzLiBJdCBzaG91bGQgYWxzbworICogd29yayBvbiB0aGUgaGZhMzg0MSBhbmQgaGZhMzg0MiBNQUMgY29udHJvbGxlciBjaGlwcyB1c2VkIGluIHRoZQorICogUHJpc20gSSAmIElJIGNoaXBzZXRzLgorICoKKyAqIFRoaXMgaXMgbm90IGEgY29tcGxldGUgZHJpdmVyLCBqdXN0IGxvdy1sZXZlbCBhY2Nlc3Mgcm91dGluZXMgZm9yCisgKiB0aGUgTUFDIGNvbnRyb2xsZXIgaXRzZWxmLgorICoKKyAqIEJhc2VkIG9uIHRoZSBwcmlzbTIgZHJpdmVyIGZyb20gQWJzb2x1dGUgVmFsdWUgU3lzdGVtcycgbGludXgtd2xhbgorICogcHJvamVjdCwgdGhlIExpbnV4IHd2bGFuX2NzIGRyaXZlciwgTHVjZW50J3MgSENGLUxpZ2h0CisgKiAod3ZsYW5faGNmLmMpIGxpYnJhcnksIGFuZCB0aGUgTmV0QlNEIHdpcmVsZXNzIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsIERhdmlkIEdpYnNvbiwgTGludXhjYXJlIEF1c3RyYWxpYS4KKyAqIChDKSBDb3B5cmlnaHQgRGF2aWQgR2lic29uLCBJQk0gQ29ycC4gMjAwMS0yMDAzLgorICoKKyAqIFBvcnRpb25zIHRha2VuIGZyb20gaGZhMzg0eC5oLCBDb3B5cmlnaHQgKEMpIDE5OTkgQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHUEwsIHZlcnNpb24gMi4KKyAqLworCisjaWZuZGVmIF9IRVJNRVNfSAorI2RlZmluZSBfSEVSTUVTX0gKKworLyogTm90ZXMgb24gbG9ja2luZzoKKyAqCisgKiBBcyBhIG1vZHVsZSBvZiBsb3cgbGV2ZWwgaGFyZHdhcmUgYWNjZXNzIHJvdXRpbmVzLCB0aGVyZSBpcyBubworICogbG9ja2luZy4gVXNlcnMgb2YgdGhpcyBtb2R1bGUgc2hvdWxkIGVuc3VyZSB0aGF0IHRoZXkgc2VyaWFsaXplCisgKiBhY2Nlc3MgdG8gdGhlIGhlcm1lc190IHN0cnVjdHVyZSwgYW5kIHRvIHRoZSBoYXJkd2FyZQorKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKy8qCisgKiBMaW1pdHMgYW5kIGNvbnN0YW50cworICovCisjZGVmaW5lCQlIRVJNRVNfQUxMT0NfTEVOX01JTgkJKDQpCisjZGVmaW5lCQlIRVJNRVNfQUxMT0NfTEVOX01BWAkJKDI0MDApCisjZGVmaW5lCQlIRVJNRVNfTFRWX0xFTl9NQVgJCSgzNCkKKyNkZWZpbmUJCUhFUk1FU19CQVBfREFUQUxFTl9NQVgJCSg0MDk2KQorI2RlZmluZQkJSEVSTUVTX0JBUF9PRkZTRVRfTUFYCQkoNDA5NikKKyNkZWZpbmUJCUhFUk1FU19QT1JUSURfTUFYCQkoNykKKyNkZWZpbmUJCUhFUk1FU19OVU1QT1JUU19NQVgJCShIRVJNRVNfUE9SVElEX01BWCsxKQorI2RlZmluZQkJSEVSTUVTX1BEUl9MRU5fTUFYCQkoMjYwKQkvKiBpbiBieXRlcywgZnJvbSBFSyAqLworI2RlZmluZQkJSEVSTUVTX1BEQV9SRUNTX01BWAkJKDIwMCkJLyogYSBndWVzcyAqLworI2RlZmluZQkJSEVSTUVTX1BEQV9MRU5fTUFYCQkoMTAyNCkJLyogaW4gYnl0ZXMsIGZyb20gRUsgKi8KKyNkZWZpbmUJCUhFUk1FU19TQ0FOUkVTVUxUX01BWAkJKDM1KQorI2RlZmluZQkJSEVSTUVTX0NISU5GT1JFU1VMVF9NQVgJCSg4KQorI2RlZmluZQkJSEVSTUVTX01BWF9NVUxUSUNBU1QJCSgxNikKKyNkZWZpbmUJCUhFUk1FU19NQUdJQwkJCSgweDdkMWYpCisKKy8qCisgKiBIZXJtZXMgcmVnaXN0ZXIgb2Zmc2V0cworICovCisjZGVmaW5lCQlIRVJNRVNfQ01ECQkJKDB4MDApCisjZGVmaW5lCQlIRVJNRVNfUEFSQU0wCQkJKDB4MDIpCisjZGVmaW5lCQlIRVJNRVNfUEFSQU0xCQkJKDB4MDQpCisjZGVmaW5lCQlIRVJNRVNfUEFSQU0yCQkJKDB4MDYpCisjZGVmaW5lCQlIRVJNRVNfU1RBVFVTCQkJKDB4MDgpCisjZGVmaW5lCQlIRVJNRVNfUkVTUDAJCQkoMHgwQSkKKyNkZWZpbmUJCUhFUk1FU19SRVNQMQkJCSgweDBDKQorI2RlZmluZQkJSEVSTUVTX1JFU1AyCQkJKDB4MEUpCisjZGVmaW5lCQlIRVJNRVNfSU5GT0ZJRAkJCSgweDEwKQorI2RlZmluZQkJSEVSTUVTX1JYRklECQkJKDB4MjApCisjZGVmaW5lCQlIRVJNRVNfQUxMT0NGSUQJCQkoMHgyMikKKyNkZWZpbmUJCUhFUk1FU19UWENPTVBMRklECQkoMHgyNCkKKyNkZWZpbmUJCUhFUk1FU19TRUxFQ1QwCQkJKDB4MTgpCisjZGVmaW5lCQlIRVJNRVNfT0ZGU0VUMAkJCSgweDFDKQorI2RlZmluZQkJSEVSTUVTX0RBVEEwCQkJKDB4MzYpCisjZGVmaW5lCQlIRVJNRVNfU0VMRUNUMQkJCSgweDFBKQorI2RlZmluZQkJSEVSTUVTX09GRlNFVDEJCQkoMHgxRSkKKyNkZWZpbmUJCUhFUk1FU19EQVRBMQkJCSgweDM4KQorI2RlZmluZQkJSEVSTUVTX0VWU1RBVAkJCSgweDMwKQorI2RlZmluZQkJSEVSTUVTX0lOVEVOCQkJKDB4MzIpCisjZGVmaW5lCQlIRVJNRVNfRVZBQ0sJCQkoMHgzNCkKKyNkZWZpbmUJCUhFUk1FU19DT05UUk9MCQkJKDB4MTQpCisjZGVmaW5lCQlIRVJNRVNfU1dTVVBQT1JUMAkJKDB4MjgpCisjZGVmaW5lCQlIRVJNRVNfU1dTVVBQT1JUMQkJKDB4MkEpCisjZGVmaW5lCQlIRVJNRVNfU1dTVVBQT1JUMgkJKDB4MkMpCisjZGVmaW5lCQlIRVJNRVNfQVVYUEFHRQkJCSgweDNBKQorI2RlZmluZQkJSEVSTUVTX0FVWE9GRlNFVAkJKDB4M0MpCisjZGVmaW5lCQlIRVJNRVNfQVVYREFUQQkJCSgweDNFKQorCisvKgorICogQ01EIHJlZ2lzdGVyIGJpdG1hc2tzCisgKi8KKyNkZWZpbmUJCUhFUk1FU19DTURfQlVTWQkJCSgweDgwMDApCisjZGVmaW5lCQlIRVJNRVNfQ01EX0FJTkZPCQkoMHg3ZjAwKQorI2RlZmluZQkJSEVSTUVTX0NNRF9NQUNQT1JUCQkoMHgwNzAwKQorI2RlZmluZQkJSEVSTUVTX0NNRF9SRUNMCQkJKDB4MDEwMCkKKyNkZWZpbmUJCUhFUk1FU19DTURfV1JJVEUJCSgweDAxMDApCisjZGVmaW5lCQlIRVJNRVNfQ01EX1BST0dNT0RFCQkoMHgwMzAwKQorI2RlZmluZQkJSEVSTUVTX0NNRF9DTURDT0RFCQkoMHgwMDNmKQorCisvKgorICogU1RBVFVTIHJlZ2lzdGVyIGJpdG1hc2tzCisgKi8KKyNkZWZpbmUJCUhFUk1FU19TVEFUVVNfUkVTVUxUCQkoMHg3ZjAwKQorI2RlZmluZQkJSEVSTUVTX1NUQVRVU19DTURDT0RFCQkoMHgwMDNmKQorCisvKgorICogT0ZGU0VUIHJlZ2lzdGVyIGJpdG1hc2tzCisgKi8KKyNkZWZpbmUJCUhFUk1FU19PRkZTRVRfQlVTWQkJKDB4ODAwMCkKKyNkZWZpbmUJCUhFUk1FU19PRkZTRVRfRVJSCQkoMHg0MDAwKQorI2RlZmluZQkJSEVSTUVTX09GRlNFVF9EQVRBT0ZGCQkoMHgwZmZlKQorCisvKgorICogRXZlbnQgcmVnaXN0ZXIgYml0bWFza3MgKElOVEVOLCBFVlNUQVQsIEVWQUNLKQorICovCisjZGVmaW5lCQlIRVJNRVNfRVZfVElDSwkJCSgweDgwMDApCisjZGVmaW5lCQlIRVJNRVNfRVZfV1RFUlIJCQkoMHg0MDAwKQorI2RlZmluZQkJSEVSTUVTX0VWX0lORkRST1AJCSgweDIwMDApCisjZGVmaW5lCQlIRVJNRVNfRVZfSU5GTwkJCSgweDAwODApCisjZGVmaW5lCQlIRVJNRVNfRVZfRFRJTQkJCSgweDAwMjApCisjZGVmaW5lCQlIRVJNRVNfRVZfQ01ECQkJKDB4MDAxMCkKKyNkZWZpbmUJCUhFUk1FU19FVl9BTExPQwkJCSgweDAwMDgpCisjZGVmaW5lCQlIRVJNRVNfRVZfVFhFWEMJCQkoMHgwMDA0KQorI2RlZmluZQkJSEVSTUVTX0VWX1RYCQkJKDB4MDAwMikKKyNkZWZpbmUJCUhFUk1FU19FVl9SWAkJCSgweDAwMDEpCisKKy8qCisgKiBDb21tYW5kIGNvZGVzCisgKi8KKy8qLS0tIENvbnRyb2xsZXIgQ29tbWFuZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRVJNRVNfQ01EX0lOSVQJCQkoMHgwMDAwKQorI2RlZmluZQkJSEVSTUVTX0NNRF9FTkFCTEUJCSgweDAwMDEpCisjZGVmaW5lCQlIRVJNRVNfQ01EX0RJU0FCTEUJCSgweDAwMDIpCisjZGVmaW5lCQlIRVJNRVNfQ01EX0RJQUcJCQkoMHgwMDAzKQorCisvKi0tLSBCdWZmZXIgTWdtdCBDb21tYW5kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZQkJSEVSTUVTX0NNRF9BTExPQwkJKDB4MDAwQSkKKyNkZWZpbmUJCUhFUk1FU19DTURfVFgJCQkoMHgwMDBCKQorCisvKi0tLSBSZWd1bGF0ZSBDb21tYW5kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZQkJSEVSTUVTX0NNRF9OT1RJRlkJCSgweDAwMTApCisjZGVmaW5lCQlIRVJNRVNfQ01EX0lOUVVJUkUJCSgweDAwMTEpCisKKy8qLS0tIENvbmZpZ3VyZSBDb21tYW5kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRVJNRVNfQ01EX0FDQ0VTUwkJKDB4MDAyMSkKKyNkZWZpbmUJCUhFUk1FU19DTURfRE9XTkxECQkoMHgwMDIyKQorCisvKi0tLSBTZXJpYWwgSS9PIENvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZQkJSEVSTUVTX0NNRF9SRUFETUlGCQkoMHgwMDMwKQorI2RlZmluZQkJSEVSTUVTX0NNRF9XUklURU1JRgkJKDB4MDAzMSkKKworLyotLS0gRGVidWdnaW5nIENvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgCUhFUk1FU19DTURfVEVTVAkJCSgweDAwMzgpCisKKworLyogVGVzdCBjb21tYW5kIGFyZ3VtZW50cyAqLworI2RlZmluZQkJSEVSTUVTX1RFU1RfU0VUX0NIQU5ORUwJCTB4MDgwMAorI2RlZmluZQkJSEVSTUVTX1RFU1RfTU9OSVRPUgkJMHgwYjAwCisjZGVmaW5lCQlIRVJNRVNfVEVTVF9TVE9QCQkweDBmMDAKKworLyogQXV0aGVudGljYXRpb24gYWxnb3JpdGhtcyAqLworI2RlZmluZQkJSEVSTUVTX0FVVEhfT1BFTgkJMQorI2RlZmluZQkJSEVSTUVTX0FVVEhfU0hBUkVEX0tFWQkJMgorCisvKiBXRVAgc2V0dGluZ3MgKi8KKyNkZWZpbmUJCUhFUk1FU19XRVBfUFJJVkFDWV9JTlZPS0VECTB4MDAwMQorI2RlZmluZQkJSEVSTUVTX1dFUF9FWENMX1VORU5DUllQVEVECTB4MDAwMgorI2RlZmluZQkJSEVSTUVTX1dFUF9IT1NUX0VOQ1JZUFQJCTB4MDAxMAorI2RlZmluZQkJSEVSTUVTX1dFUF9IT1NUX0RFQ1JZUFQJCTB4MDA4MAorCisvKiBTeW1ib2wgaG9zdHNjYW4gb3B0aW9ucyAqLworI2RlZmluZQkJSEVSTUVTX0hPU1RTQ0FOX1NZTUJPTF81U0VDCTB4MDAwMQorI2RlZmluZQkJSEVSTUVTX0hPU1RTQ0FOX1NZTUJPTF9PTkNFCTB4MDAwMgorI2RlZmluZQkJSEVSTUVTX0hPU1RTQ0FOX1NZTUJPTF9QQVNTSVZFCTB4MDA0MAorI2RlZmluZQkJSEVSTUVTX0hPU1RTQ0FOX1NZTUJPTF9CQ0FTVAkweDAwODAKKworLyoKKyAqIEZyYW1lIHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cworICovCisKKyNkZWZpbmUgSEVSTUVTX0RFU0NSSVBUT1JfT0ZGU0VUCTAKKyNkZWZpbmUgSEVSTUVTXzgwMl8xMV9PRkZTRVQJCSgxNCkKKyNkZWZpbmUgSEVSTUVTXzgwMl8zX09GRlNFVAkJKDE0KzMyKQorI2RlZmluZSBIRVJNRVNfODAyXzJfT0ZGU0VUCQkoMTQrMzIrMTQpCisKKyNkZWZpbmUgSEVSTUVTX1JYU1RBVF9FUlIJCSgweDAwMDMpCisjZGVmaW5lCUhFUk1FU19SWFNUQVRfQkFEQ1JDCQkoMHgwMDAxKQorI2RlZmluZQlIRVJNRVNfUlhTVEFUX1VOREVDUllQVEFCTEUJKDB4MDAwMikKKyNkZWZpbmUJSEVSTUVTX1JYU1RBVF9NQUNQT1JUCQkoMHgwNzAwKQorI2RlZmluZSBIRVJNRVNfUlhTVEFUX1BDRgkJKDB4MTAwMCkJLyogRnJhbWUgd2FzIHJlY2VpdmVkIGluIENGIHBlcmlvZCAqLworI2RlZmluZQlIRVJNRVNfUlhTVEFUX01TR1RZUEUJCSgweEUwMDApCisjZGVmaW5lCUhFUk1FU19SWFNUQVRfMTA0MgkJKDB4MjAwMCkJLyogUkZDLTEwNDIgZnJhbWUgKi8KKyNkZWZpbmUJSEVSTUVTX1JYU1RBVF9UVU5ORUwJCSgweDQwMDApCS8qIGJyaWRnZS10dW5uZWwgZW5jb2RlZCBmcmFtZSAqLworI2RlZmluZQlIRVJNRVNfUlhTVEFUX1dNUAkJKDB4NjAwMCkJLyogV2F2ZWxhbi1JSSBNYW5hZ2VtZW50IFByb3RvY29sIGZyYW1lICovCisKK3N0cnVjdCBoZXJtZXNfdHhfZGVzY3JpcHRvciB7CisJdTE2IHN0YXR1czsKKwl1MTYgcmVzZXJ2ZWQxOworCXUxNiByZXNlcnZlZDI7CisJdTMyIHN3X3N1cHBvcnQ7CisJdTggcmV0cnlfY291bnQ7CisJdTggdHhfcmF0ZTsKKwl1MTYgdHhfY29udHJvbDsJCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBIRVJNRVNfVFhTVEFUX1JFVFJZRVJSCQkoMHgwMDAxKQorI2RlZmluZSBIRVJNRVNfVFhTVEFUX0FHRURFUlIJCSgweDAwMDIpCisjZGVmaW5lIEhFUk1FU19UWFNUQVRfRElTQ09OCQkoMHgwMDA0KQorI2RlZmluZSBIRVJNRVNfVFhTVEFUX0ZPUk1FUlIJCSgweDAwMDgpCisKKyNkZWZpbmUgSEVSTUVTX1RYQ1RSTF9UWF9PSwkJKDB4MDAwMikJLyogPz8gaW50ZXJydXB0IG9uIFR4IGNvbXBsZXRlICovCisjZGVmaW5lIEhFUk1FU19UWENUUkxfVFhfRVgJCSgweDAwMDQpCS8qID8/IGludGVycnVwdCBvbiBUeCBleGNlcHRpb24gKi8KKyNkZWZpbmUgSEVSTUVTX1RYQ1RSTF84MDJfMTEJCSgweDAwMDgpCS8qIFdlIHN1cHBseSA4MDIuMTEgaGVhZGVyICovCisjZGVmaW5lIEhFUk1FU19UWENUUkxfQUxUX1JUUlkJCSgweDAwMjApCisKKy8qIElucXVpcnkgY29uc3RhbnRzIGFuZCBkYXRhIHR5cGVzICovCisKKyNkZWZpbmUgSEVSTUVTX0lOUV9UQUxMSUVTCQkoMHhGMTAwKQorI2RlZmluZSBIRVJNRVNfSU5RX1NDQU4JCQkoMHhGMTAxKQorI2RlZmluZSBIRVJNRVNfSU5RX0NIQU5ORUxJTkZPCQkoMHhGMTAyKQorI2RlZmluZSBIRVJNRVNfSU5RX0hPU1RTQ0FOCQkoMHhGMTAzKQorI2RlZmluZSBIRVJNRVNfSU5RX0hPU1RTQ0FOX1NZTUJPTAkoMHhGMTA0KQorI2RlZmluZSBIRVJNRVNfSU5RX0xJTktTVEFUVVMJCSgweEYyMDApCisjZGVmaW5lIEhFUk1FU19JTlFfU0VDX1NUQVRfQUdFUkUJKDB4RjIwMikKKworc3RydWN0IGhlcm1lc190YWxsaWVzX2ZyYW1lIHsKKwl1MTYgVHhVbmljYXN0RnJhbWVzOworCXUxNiBUeE11bHRpY2FzdEZyYW1lczsKKwl1MTYgVHhGcmFnbWVudHM7CisJdTE2IFR4VW5pY2FzdE9jdGV0czsKKwl1MTYgVHhNdWx0aWNhc3RPY3RldHM7CisJdTE2IFR4RGVmZXJyZWRUcmFuc21pc3Npb25zOworCXUxNiBUeFNpbmdsZVJldHJ5RnJhbWVzOworCXUxNiBUeE11bHRpcGxlUmV0cnlGcmFtZXM7CisJdTE2IFR4UmV0cnlMaW1pdEV4Y2VlZGVkOworCXUxNiBUeERpc2NhcmRzOworCXUxNiBSeFVuaWNhc3RGcmFtZXM7CisJdTE2IFJ4TXVsdGljYXN0RnJhbWVzOworCXUxNiBSeEZyYWdtZW50czsKKwl1MTYgUnhVbmljYXN0T2N0ZXRzOworCXUxNiBSeE11bHRpY2FzdE9jdGV0czsKKwl1MTYgUnhGQ1NFcnJvcnM7CisJdTE2IFJ4RGlzY2FyZHNfTm9CdWZmZXI7CisJdTE2IFR4RGlzY2FyZHNXcm9uZ1NBOworCXUxNiBSeFdFUFVuZGVjcnlwdGFibGU7CisJdTE2IFJ4TXNnSW5Nc2dGcmFnbWVudHM7CisJdTE2IFJ4TXNnSW5CYWRNc2dGcmFnbWVudHM7CisJLyogVGhvc2UgbGFzdCBhcmUgcHJvYmFibHkgbm90IGF2YWlsYWJsZSBpbiB2ZXJ5IG9sZCBmaXJtd2FyZXMgKi8KKwl1MTYgUnhEaXNjYXJkc19XRVBJQ1ZFcnJvcjsKKwl1MTYgUnhEaXNjYXJkc19XRVBFeGNsdWRlZDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBHcmFiYmVkIGZyb20gd2xhbi1uZyAtIFRoYW5rcyBNYXJrLi4uIC0gSmVhbiBJSQorICogVGhpcyBpcyB0aGUgcmVzdWx0IG9mIGEgc2NhbiBpbnF1aXJ5IGNvbW1hbmQgKi8KKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIGluZm8gYWJvdXQgYW4gQWNjZXNzIFBvaW50ICovCitzdHJ1Y3QgcHJpc20yX3NjYW5fYXBpbmZvIHsKKwl1MTYgY2hhbm5lbDsJCS8qIENoYW5uZWwgd2hlcmUgdGhlIEFQIHNpdHMgKi8KKwl1MTYgbm9pc2U7CQkvKiBOb2lzZSBsZXZlbCAqLworCXUxNiBsZXZlbDsJCS8qIFNpZ25hbCBsZXZlbCAqLworCXU4IGJzc2lkW0VUSF9BTEVOXTsJLyogTUFDIGFkZHJlc3Mgb2YgdGhlIEFjY2VzcyBQb2ludCAqLworCXUxNiBiZWFjb25faW50ZXJ2OwkvKiBCZWFjb24gaW50ZXJ2YWwgKi8KKwl1MTYgY2FwYWJpbGl0aWVzOwkvKiBDYXBhYmlsaXRpZXMgKi8KKwl1MTYgZXNzaWRfbGVuOwkJLyogRVNTSUQgbGVuZ3RoICovCisJdTggZXNzaWRbMzJdOwkJLyogRVNTSUQgb2YgdGhlIG5ldHdvcmsgKi8KKwl1OCByYXRlc1sxMF07CQkvKiBCaXQgcmF0ZSBzdXBwb3J0ZWQgKi8KKwl1MTYgcHJvYmVyZXNwX3JhdGU7CS8qIERhdGEgcmF0ZSBvZiB0aGUgcmVzcG9uc2UgZnJhbWUgKi8KKwl1MTYgYXRpbTsJCS8qIEFUSU0gd2luZG93IHRpbWUsIEt1cyAoaG9zdHNjYW4gb25seSkgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTYW1lIHN0dWZmIGZvciB0aGUgTHVjZW50L0FnZXJlIGNhcmQuCisgKiBUaGFua3MgdG8gaDFrYXJpIDxoMWthcmkgQVQgZGFjaGIwZGVuLmNvbT4gLSBKZWFuIElJICovCitzdHJ1Y3QgYWdlcmVfc2Nhbl9hcGluZm8geworCXUxNiBjaGFubmVsOwkJLyogQ2hhbm5lbCB3aGVyZSB0aGUgQVAgc2l0cyAqLworCXUxNiBub2lzZTsJCS8qIE5vaXNlIGxldmVsICovCisJdTE2IGxldmVsOwkJLyogU2lnbmFsIGxldmVsICovCisJdTggYnNzaWRbRVRIX0FMRU5dOwkvKiBNQUMgYWRkcmVzcyBvZiB0aGUgQWNjZXNzIFBvaW50ICovCisJdTE2IGJlYWNvbl9pbnRlcnY7CS8qIEJlYWNvbiBpbnRlcnZhbCAqLworCXUxNiBjYXBhYmlsaXRpZXM7CS8qIENhcGFiaWxpdGllcyAqLworCS8qIGJpdHM6IDAtZXNzLCAxLWlic3MsIDQtcHJpdmFjeSBbd2VwXSAqLworCXUxNiBlc3NpZF9sZW47CQkvKiBFU1NJRCBsZW5ndGggKi8KKwl1OCBlc3NpZFszMl07CQkvKiBFU1NJRCBvZiB0aGUgbmV0d29yayAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIE1vdXN0YWZhOiBTY2FuIHN0cnVjdHVyZSBmb3IgU3ltYm9sIGNhcmRzICovCitzdHJ1Y3Qgc3ltYm9sX3NjYW5fYXBpbmZvIHsKKwl1OCBjaGFubmVsOwkJLyogQ2hhbm5lbCB3aGVyZSB0aGUgQVAgc2l0cyAqLworCXU4IHVua25vd24xOwkJLyogOCBpbiAyLjl4IGFuZCAzLjl4IGYvdywgMCBvdGhlcndpc2UgKi8KKwl1MTYgbm9pc2U7CQkvKiBOb2lzZSBsZXZlbCAqLworCXUxNiBsZXZlbDsJCS8qIFNpZ25hbCBsZXZlbCAqLworCXU4IGJzc2lkW0VUSF9BTEVOXTsJLyogTUFDIGFkZHJlc3Mgb2YgdGhlIEFjY2VzcyBQb2ludCAqLworCXUxNiBiZWFjb25faW50ZXJ2OwkvKiBCZWFjb24gaW50ZXJ2YWwgKi8KKwl1MTYgY2FwYWJpbGl0aWVzOwkvKiBDYXBhYmlsaXRpZXMgKi8KKwkvKiBiaXRzOiAwLWVzcywgMS1pYnNzLCA0LXByaXZhY3kgW3dlcF0gKi8KKwl1MTYgZXNzaWRfbGVuOwkJLyogRVNTSUQgbGVuZ3RoICovCisJdTggZXNzaWRbMzJdOwkJLyogRVNTSUQgb2YgdGhlIG5ldHdvcmsgKi8KKyAgICAJdTE2IHJhdGVzWzVdOwkJLyogQml0IHJhdGUgc3VwcG9ydGVkICovCisJdTE2IGJhc2ljX3JhdGVzOwkvKiBCYXNpYyByYXRlcyBiaXRtYXNrICovCisJdTggdW5rbm93bjJbNl07CQkvKiBBbHdheXMgRkY6RkY6RkY6RkY6MDA6MDAgKi8KKwl1OCB1bmtub3duM1s4XTsJCS8qIEFsd2F5cyAwLCBhcHBlYXJlZCBpbiBmL3cgMy45MS02OCAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3VuaW9uIGhlcm1lc19zY2FuX2luZm8geworCXN0cnVjdCBhZ2VyZV9zY2FuX2FwaW5mbwlhOworCXN0cnVjdCBwcmlzbTJfc2Nhbl9hcGluZm8JcDsKKwlzdHJ1Y3Qgc3ltYm9sX3NjYW5fYXBpbmZvCXM7Cit9OworCisjZGVmaW5lIEhFUk1FU19MSU5LU1RBVFVTX05PVF9DT05ORUNURUQgICAoMHgwMDAwKSAgCisjZGVmaW5lIEhFUk1FU19MSU5LU1RBVFVTX0NPTk5FQ1RFRCAgICAgICAoMHgwMDAxKQorI2RlZmluZSBIRVJNRVNfTElOS1NUQVRVU19ESVNDT05ORUNURUQgICAgKDB4MDAwMikKKyNkZWZpbmUgSEVSTUVTX0xJTktTVEFUVVNfQVBfQ0hBTkdFICAgICAgICgweDAwMDMpCisjZGVmaW5lIEhFUk1FU19MSU5LU1RBVFVTX0FQX09VVF9PRl9SQU5HRSAoMHgwMDA0KQorI2RlZmluZSBIRVJNRVNfTElOS1NUQVRVU19BUF9JTl9SQU5HRSAgICAgKDB4MDAwNSkKKyNkZWZpbmUgSEVSTUVTX0xJTktTVEFUVVNfQVNTT0NfRkFJTEVEICAgICgweDAwMDYpCisgIAorc3RydWN0IGhlcm1lc19saW5rc3RhdHVzIHsKKwl1MTYgbGlua3N0YXR1czsgICAgICAgICAvKiBMaW5rIHN0YXR1cyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBoZXJtZXNfcmVzcG9uc2UgeworCXUxNiBzdGF0dXMsIHJlc3AwLCByZXNwMSwgcmVzcDI7Cit9OworCisvKiAiSUQiIHN0cnVjdHVyZSAtIHVzZWQgZm9yIEVTU0lEIGFuZCBzdGF0aW9uIG5pY2tuYW1lICovCitzdHJ1Y3QgaGVybWVzX2lkc3RyaW5nIHsKKwl1MTYgbGVuOworCXUxNiB2YWxbMTZdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBoZXJtZXNfbXVsdGljYXN0IHsKKwl1OCBhZGRyW0hFUk1FU19NQVhfTVVMVElDQVNUXVtFVEhfQUxFTl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLy8gI2RlZmluZSBIRVJNRVNfREVCVUdfQlVGRkVSIDEKKyNkZWZpbmUgSEVSTUVTX0RFQlVHX0JVRlNJWkUgNDA5Ngorc3RydWN0IGhlcm1lc19kZWJ1Z19lbnRyeSB7CisJaW50IGJhcDsKKwl1MTYgaWQsIG9mZnNldDsKKwlpbnQgY3ljbGVzOworfTsKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyogVGltZW91dHMgKi8KKyNkZWZpbmUgSEVSTUVTX0JBUF9CVVNZX1RJTUVPVVQgKDEwMDAwKSAvKiBJbiBpdGVyYXRpb25zIG9mIH4xdXMgKi8KKworLyogQmFzaWMgY29udHJvbCBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IGhlcm1lcyB7CisJdm9pZCBfX2lvbWVtICppb2Jhc2U7CisJaW50IHJlZ19zcGFjaW5nOworI2RlZmluZSBIRVJNRVNfMTZCSVRfUkVHU1BBQ0lORwkwCisjZGVmaW5lIEhFUk1FU18zMkJJVF9SRUdTUEFDSU5HCTEKKworCXUxNiBpbnRlbjsgLyogV2hpY2ggaW50ZXJydXB0cyBzaG91bGQgYmUgZW5hYmxlZD8gKi8KKworI2lmZGVmIEhFUk1FU19ERUJVR19CVUZGRVIKKwlzdHJ1Y3QgaGVybWVzX2RlYnVnX2VudHJ5IGRidWZbSEVSTUVTX0RFQlVHX0JVRlNJWkVdOworCXVuc2lnbmVkIGxvbmcgZGJ1ZnA7CisJdW5zaWduZWQgbG9uZyBwcm9maWxlW0hFUk1FU19CQVBfQlVTWV9USU1FT1VUKzFdOworI2VuZGlmCit9IGhlcm1lc190OworCisvKiBSZWdpc3RlciBhY2Nlc3MgY29udmVuaWVuY2UgbWFjcm9zICovCisjZGVmaW5lIGhlcm1lc19yZWFkX3JlZyhodywgb2ZmKSBcCisJKGlvcmVhZDE2KChodyktPmlvYmFzZSArICggKG9mZikgPDwgKGh3KS0+cmVnX3NwYWNpbmcgKSkpCisjZGVmaW5lIGhlcm1lc193cml0ZV9yZWcoaHcsIG9mZiwgdmFsKSBcCisJKGlvd3JpdGUxNigodmFsKSwgKGh3KS0+aW9iYXNlICsgKChvZmYpIDw8IChodyktPnJlZ19zcGFjaW5nKSkpCisjZGVmaW5lIGhlcm1lc19yZWFkX3JlZ24oaHcsIG5hbWUpIGhlcm1lc19yZWFkX3JlZygoaHcpLCBIRVJNRVNfIyNuYW1lKQorI2RlZmluZSBoZXJtZXNfd3JpdGVfcmVnbihodywgbmFtZSwgdmFsKSBoZXJtZXNfd3JpdGVfcmVnKChodyksIEhFUk1FU18jI25hbWUsICh2YWwpKQorCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCit2b2lkIGhlcm1lc19zdHJ1Y3RfaW5pdChoZXJtZXNfdCAqaHcsIHZvaWQgX19pb21lbSAqYWRkcmVzcywgaW50IHJlZ19zcGFjaW5nKTsKK2ludCBoZXJtZXNfaW5pdChoZXJtZXNfdCAqaHcpOworaW50IGhlcm1lc19kb2NtZF93YWl0KGhlcm1lc190ICpodywgdTE2IGNtZCwgdTE2IHBhcm0wLAorCQkgICAgICBzdHJ1Y3QgaGVybWVzX3Jlc3BvbnNlICpyZXNwKTsKK2ludCBoZXJtZXNfYWxsb2NhdGUoaGVybWVzX3QgKmh3LCB1MTYgc2l6ZSwgdTE2ICpmaWQpOworCitpbnQgaGVybWVzX2JhcF9wcmVhZChoZXJtZXNfdCAqaHcsIGludCBiYXAsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgbGVuLAorCQkgICAgICAgdTE2IGlkLCB1MTYgb2Zmc2V0KTsKK2ludCBoZXJtZXNfYmFwX3B3cml0ZShoZXJtZXNfdCAqaHcsIGludCBiYXAsIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbGVuLAorCQkJdTE2IGlkLCB1MTYgb2Zmc2V0KTsKK2ludCBoZXJtZXNfcmVhZF9sdHYoaGVybWVzX3QgKmh3LCBpbnQgYmFwLCB1MTYgcmlkLCB1bnNpZ25lZCBidWZsZW4sCisJCSAgICB1MTYgKmxlbmd0aCwgdm9pZCAqYnVmKTsKK2ludCBoZXJtZXNfd3JpdGVfbHR2KGhlcm1lc190ICpodywgaW50IGJhcCwgdTE2IHJpZCwKKwkJICAgICAgdTE2IGxlbmd0aCwgY29uc3Qgdm9pZCAqdmFsdWUpOworCisvKiBJbmxpbmUgZnVuY3Rpb25zICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGhlcm1lc19wcmVzZW50KGhlcm1lc190ICpodykKK3sKKwlyZXR1cm4gaGVybWVzX3JlYWRfcmVnbihodywgU1dTVVBQT1JUMCkgPT0gSEVSTUVTX01BR0lDOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGVybWVzX3NldF9pcnFtYXNrKGhlcm1lc190ICpodywgdTE2IGV2ZW50cykKK3sKKwlody0+aW50ZW4gPSBldmVudHM7CisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIElOVEVOLCBldmVudHMpOworfQorCitzdGF0aWMgaW5saW5lIGludCBoZXJtZXNfZW5hYmxlX3BvcnQoaGVybWVzX3QgKmh3LCBpbnQgcG9ydCkKK3sKKwlyZXR1cm4gaGVybWVzX2RvY21kX3dhaXQoaHcsIEhFUk1FU19DTURfRU5BQkxFIHwgKHBvcnQgPDwgOCksCisJCQkJIDAsIE5VTEwpOworfQorCitzdGF0aWMgaW5saW5lIGludCBoZXJtZXNfZGlzYWJsZV9wb3J0KGhlcm1lc190ICpodywgaW50IHBvcnQpCit7CisJcmV0dXJuIGhlcm1lc19kb2NtZF93YWl0KGh3LCBIRVJNRVNfQ01EX0RJU0FCTEUgfCAocG9ydCA8PCA4KSwgCisJCQkJIDAsIE5VTEwpOworfQorCisvKiBJbml0aWF0ZSBhbiBJTlFVSVJFIGNvbW1hbmQgKHRhbGxpZXMgb3Igc2NhbikuICBUaGUgcmVzdWx0IHdpbGwgY29tZSBhcyBhbgorICogaW5mb3JtYXRpb24gZnJhbWUgaW4gX19vcmlub2NvX2V2X2luZm8oKSAqLworc3RhdGljIGlubGluZSBpbnQgaGVybWVzX2lucXVpcmUoaGVybWVzX3QgKmh3LCB1MTYgcmlkKQoreworCXJldHVybiBoZXJtZXNfZG9jbWRfd2FpdChodywgSEVSTUVTX0NNRF9JTlFVSVJFLCByaWQsIE5VTEwpOworfQorCisjZGVmaW5lIEhFUk1FU19CWVRFU19UT19SRUNMRU4obikgKCAoKChuKSsxKS8yKSArIDEgKQorI2RlZmluZSBIRVJNRVNfUkVDTEVOX1RPX0JZVEVTKG4pICggKChuKS0xKSAqIDIgKQorCisvKiBOb3RlIHRoYXQgZm9yIHRoZSBuZXh0IHR3bywgdGhlIGNvdW50IGlzIGluIDE2LWJpdCB3b3Jkcywgbm90IGJ5dGVzICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGVybWVzX3JlYWRfd29yZHMoc3RydWN0IGhlcm1lcyAqaHcsIGludCBvZmYsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgY291bnQpCit7CisJb2ZmID0gb2ZmIDw8IGh3LT5yZWdfc3BhY2luZzsKKwlpb3JlYWQxNl9yZXAoaHctPmlvYmFzZSArIG9mZiwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZXJtZXNfd3JpdGVfd29yZHMoc3RydWN0IGhlcm1lcyAqaHcsIGludCBvZmYsIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgY291bnQpCit7CisJb2ZmID0gb2ZmIDw8IGh3LT5yZWdfc3BhY2luZzsKKwlpb3dyaXRlMTZfcmVwKGh3LT5pb2Jhc2UgKyBvZmYsIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGVybWVzX2NsZWFyX3dvcmRzKHN0cnVjdCBoZXJtZXMgKmh3LCBpbnQgb2ZmLCB1bnNpZ25lZCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpOworCisJb2ZmID0gb2ZmIDw8IGh3LT5yZWdfc3BhY2luZzsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQlpb3dyaXRlMTYoMCwgaHctPmlvYmFzZSArIG9mZik7Cit9CisKKyNkZWZpbmUgSEVSTUVTX1JFQURfUkVDT1JEKGh3LCBiYXAsIHJpZCwgYnVmKSBcCisJKGhlcm1lc19yZWFkX2x0digoaHcpLChiYXApLChyaWQpLCBzaXplb2YoKmJ1ZiksIE5VTEwsIChidWYpKSkKKyNkZWZpbmUgSEVSTUVTX1dSSVRFX1JFQ09SRChodywgYmFwLCByaWQsIGJ1ZikgXAorCShoZXJtZXNfd3JpdGVfbHR2KChodyksKGJhcCksKHJpZCksSEVSTUVTX0JZVEVTX1RPX1JFQ0xFTihzaXplb2YoKmJ1ZikpLChidWYpKSkKKworc3RhdGljIGlubGluZSBpbnQgaGVybWVzX3JlYWRfd29yZHJlYyhoZXJtZXNfdCAqaHcsIGludCBiYXAsIHUxNiByaWQsIHUxNiAqd29yZCkKK3sKKwl1MTYgcmVjOworCWludCBlcnI7CisKKwllcnIgPSBIRVJNRVNfUkVBRF9SRUNPUkQoaHcsIGJhcCwgcmlkLCAmcmVjKTsKKwkqd29yZCA9IGxlMTZfdG9fY3B1KHJlYyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGVybWVzX3dyaXRlX3dvcmRyZWMoaGVybWVzX3QgKmh3LCBpbnQgYmFwLCB1MTYgcmlkLCB1MTYgd29yZCkKK3sKKwl1MTYgcmVjID0gY3B1X3RvX2xlMTYod29yZCk7CisJcmV0dXJuIEhFUk1FU19XUklURV9SRUNPUkQoaHcsIGJhcCwgcmlkLCAmcmVjKTsKK30KKworI2Vsc2UgLyogISBfX0tFUk5FTF9fICovCisKKy8qIFRoZXNlIGFyZSBwcm92aWRlZCBmb3IgdGhlIGJlbmVmaXQgb2YgdXNlcnNwYWNlIGRyaXZlcnMgYW5kIHRlc3RpbmcgcHJvZ3JhbXMKKyAgIHdoaWNoIHVzZSBpb3Blcm0oKSBvciBpb3BsKCkgKi8KKworI2RlZmluZSBoZXJtZXNfcmVhZF9yZWcoYmFzZSwgb2ZmKSAoaW53KChiYXNlKSArIChvZmYpKSkKKyNkZWZpbmUgaGVybWVzX3dyaXRlX3JlZyhiYXNlLCBvZmYsIHZhbCkgKG91dHcoKHZhbCksIChiYXNlKSArIChvZmYpKSkKKworI2RlZmluZSBoZXJtZXNfcmVhZF9yZWduKGJhc2UsIG5hbWUpIChoZXJtZXNfcmVhZF9yZWcoKGJhc2UpLCBIRVJNRVNfIyNuYW1lKSkKKyNkZWZpbmUgaGVybWVzX3dyaXRlX3JlZ24oYmFzZSwgbmFtZSwgdmFsKSAoaGVybWVzX3dyaXRlX3JlZygoYmFzZSksIEhFUk1FU18jI25hbWUsICh2YWwpKSkKKworLyogTm90ZSB0aGF0IGZvciB0aGUgbmV4dCB0d28sIHRoZSBjb3VudCBpcyBpbiAxNi1iaXQgd29yZHMsIG5vdCBieXRlcyAqLworI2RlZmluZSBoZXJtZXNfcmVhZF9kYXRhKGJhc2UsIG9mZiwgYnVmLCBjb3VudCkgKGluc3coKGJhc2UpICsgKG9mZiksIChidWYpLCAoY291bnQpKSkKKyNkZWZpbmUgaGVybWVzX3dyaXRlX2RhdGEoYmFzZSwgb2ZmLCBidWYsIGNvdW50KSAob3V0c3coKGJhc2UpICsgKG9mZiksIChidWYpLCAoY291bnQpKSkKKworI2VuZGlmIC8qICEgX19LRVJORUxfXyAqLworCisjZW5kaWYgIC8qIF9IRVJNRVNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaGVybWVzX3JpZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaGVybWVzX3JpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNDZiNDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9oZXJtZXNfcmlkLmgKQEAgLTAsMCArMSwxNDggQEAKKyNpZm5kZWYgX0hFUk1FU19SSURfSAorI2RlZmluZSBfSEVSTUVTX1JJRF9ICisKKy8qCisgKiBDb25maWd1cmF0aW9uIFJJRHMKKyAqLworI2RlZmluZSBIRVJNRVNfUklEX0NORlBPUlRUWVBFCQkJMHhGQzAwCisjZGVmaW5lIEhFUk1FU19SSURfQ05GT1dOTUFDQUREUgkJMHhGQzAxCisjZGVmaW5lIEhFUk1FU19SSURfQ05GREVTSVJFRFNTSUQJCTB4RkMwMgorI2RlZmluZSBIRVJNRVNfUklEX0NORk9XTkNIQU5ORUwJCTB4RkMwMworI2RlZmluZSBIRVJNRVNfUklEX0NORk9XTlNTSUQJCQkweEZDMDQKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZPV05BVElNV0lORE9XCQkweEZDMDUKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZTWVNURU1TQ0FMRQkJMHhGQzA2CisjZGVmaW5lIEhFUk1FU19SSURfQ05GTUFYREFUQUxFTgkJMHhGQzA3CisjZGVmaW5lIEhFUk1FU19SSURfQ05GV0RTQUREUkVTUwkJMHhGQzA4CisjZGVmaW5lIEhFUk1FU19SSURfQ05GUE1FTkFCTEVECQkJMHhGQzA5CisjZGVmaW5lIEhFUk1FU19SSURfQ05GUE1FUFMJCQkweEZDMEEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZNVUxUSUNBU1RSRUNFSVZFCQkweEZDMEIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZNQVhTTEVFUERVUkFUSU9OCQkweEZDMEMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZQTUhPTERPVkVSRFVSQVRJT04JMHhGQzBECisjZGVmaW5lIEhFUk1FU19SSURfQ05GT1dOTkFNRQkJCTB4RkMwRQorI2RlZmluZSBIRVJNRVNfUklEX0NORk9XTkRUSU1QRVJJT0QJCTB4RkMxMAorI2RlZmluZSBIRVJNRVNfUklEX0NORldEU0FERFJFU1MxCQkweEZDMTEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZXRFNBRERSRVNTMgkJMHhGQzEyCisjZGVmaW5lIEhFUk1FU19SSURfQ05GV0RTQUREUkVTUzMJCTB4RkMxMworI2RlZmluZSBIRVJNRVNfUklEX0NORldEU0FERFJFU1M0CQkweEZDMTQKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZXRFNBRERSRVNTNQkJMHhGQzE1CisjZGVmaW5lIEhFUk1FU19SSURfQ05GV0RTQUREUkVTUzYJCTB4RkMxNgorI2RlZmluZSBIRVJNRVNfUklEX0NORk1VTFRJQ0FTVFBNQlVGRkVSSU5HCTB4RkMxNworI2RlZmluZSBIRVJNRVNfUklEX0NORldFUEVOQUJMRURfQUdFUkUJCTB4RkMyMAorI2RlZmluZSBIRVJNRVNfUklEX0NORkFVVEhFTlRJQ0FUSU9OX0FHRVJFCTB4RkMyMQorI2RlZmluZSBIRVJNRVNfUklEX0NORk1BTkRBVE9SWUJTU0lEX1NZTUJPTAkweEZDMjEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZXRVBERUZBVUxUS0VZSUQJCTB4RkMyMworI2RlZmluZSBIRVJNRVNfUklEX0NORkRFRkFVTFRLRVkwCQkweEZDMjQKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZERUZBVUxUS0VZMQkJMHhGQzI1CisjZGVmaW5lIEhFUk1FU19SSURfQ05GTVdPUk9CVVNUX0FHRVJFCQkweEZDMjUKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZERUZBVUxUS0VZMgkJMHhGQzI2CisjZGVmaW5lIEhFUk1FU19SSURfQ05GREVGQVVMVEtFWTMJCTB4RkMyNworI2RlZmluZSBIRVJNRVNfUklEX0NORldFUEZMQUdTX0lOVEVSU0lMCQkweEZDMjgKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZXRVBLRVlNQVBQSU5HVEFCTEUJMHhGQzI5CisjZGVmaW5lIEhFUk1FU19SSURfQ05GQVVUSEVOVElDQVRJT04JCTB4RkMyQQorI2RlZmluZSBIRVJNRVNfUklEX0NORk1BWEFTU09DU1RBCQkweEZDMkIKKyNkZWZpbmUJSEVSTUVTX1JJRF9DTkZLRVlMRU5HVEhfU1lNQk9MCQkweEZDMkIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZUWENPTlRST0wJCQkweEZDMkMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZST0FNSU5HTU9ERQkJMHhGQzJECisjZGVmaW5lIEhFUk1FU19SSURfQ05GSE9TVEFVVEhFTlRJQ0FUSU9OCTB4RkMyRQorI2RlZmluZSBIRVJNRVNfUklEX0NORlJDVkNSQ0VSUk9SCQkweEZDMzAKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZNTUxJRkUJCQkweEZDMzEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZBTFRSRVRSWUNPVU5UCQkweEZDMzIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZCRUFDT05JTlQJCQkweEZDMzMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZBUFBDRklORk8JCQkweEZDMzQKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZTVEFQQ0ZJTkZPCQkweEZDMzUKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZQUklPUklUWVFVU0FHRQkJMHhGQzM3CisjZGVmaW5lIEhFUk1FU19SSURfQ05GVElNQ1RSTAkJCTB4RkM0MAorI2RlZmluZSBIRVJNRVNfUklEX0NORlRISVJUWTJUQUxMWQkJMHhGQzQyCisjZGVmaW5lIEhFUk1FU19SSURfQ05GRU5IU0VDVVJJVFkJCTB4RkM0MworI2RlZmluZSBIRVJNRVNfUklEX0NORkdST1VQQUREUkVTU0VTCQkweEZDODAKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZDUkVBVEVJQlNTCQkweEZDODEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZGUkFHTUVOVEFUSU9OVEhSRVNIT0xECTB4RkM4MgorI2RlZmluZSBIRVJNRVNfUklEX0NORlJUU1RIUkVTSE9MRAkJMHhGQzgzCisjZGVmaW5lIEhFUk1FU19SSURfQ05GVFhSQVRFQ09OVFJPTAkJMHhGQzg0CisjZGVmaW5lIEhFUk1FU19SSURfQ05GUFJPTUlTQ1VPVVNNT0RFCQkweEZDODUKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZCQVNJQ1JBVEVTX1NZTUJPTAkJMHhGQzhBCisjZGVmaW5lIEhFUk1FU19SSURfQ05GUFJFQU1CTEVfU1lNQk9MCQkweEZDOEMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZGUkFHTUVOVEFUSU9OVEhSRVNIT0xEMAkweEZDOTAKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZGUkFHTUVOVEFUSU9OVEhSRVNIT0xEMQkweEZDOTEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZGUkFHTUVOVEFUSU9OVEhSRVNIT0xEMgkweEZDOTIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZGUkFHTUVOVEFUSU9OVEhSRVNIT0xEMwkweEZDOTMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZGUkFHTUVOVEFUSU9OVEhSRVNIT0xENAkweEZDOTQKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZGUkFHTUVOVEFUSU9OVEhSRVNIT0xENQkweEZDOTUKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZGUkFHTUVOVEFUSU9OVEhSRVNIT0xENgkweEZDOTYKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZSVFNUSFJFU0hPTEQwCQkweEZDOTcKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZSVFNUSFJFU0hPTEQxCQkweEZDOTgKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZSVFNUSFJFU0hPTEQyCQkweEZDOTkKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZSVFNUSFJFU0hPTEQzCQkweEZDOUEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZSVFNUSFJFU0hPTEQ0CQkweEZDOUIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZSVFNUSFJFU0hPTEQ1CQkweEZDOUMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZSVFNUSFJFU0hPTEQ2CQkweEZDOUQKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZIT1NUU0NBTl9TWU1CT0wJCTB4RkNBQgorI2RlZmluZSBIRVJNRVNfUklEX0NORlNIT1JUUFJFQU1CTEUJCTB4RkNCMAorI2RlZmluZSBIRVJNRVNfUklEX0NORldFUEtFWVNfQUdFUkUJCTB4RkNCMAorI2RlZmluZSBIRVJNRVNfUklEX0NORkVYQ0xVREVMT05HUFJFQU1CTEUJMHhGQ0IxCisjZGVmaW5lIEhFUk1FU19SSURfQ05GVFhLRVlfQUdFUkUJCTB4RkNCMQorI2RlZmluZSBIRVJNRVNfUklEX0NORkFVVEhFTlRJQ0FUSU9OUlNQVE8JMHhGQ0IyCisjZGVmaW5lIEhFUk1FU19SSURfQ05GU0NBTlNTSURfQUdFUkUJCTB4RkNCMgorI2RlZmluZSBIRVJNRVNfUklEX0NORkJBU0lDUkFURVMJCTB4RkNCMworI2RlZmluZSBIRVJNRVNfUklEX0NORlNVUFBPUlRFRFJBVEVTCQkweEZDQjQKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZUSUNLVElNRQkJCTB4RkNFMAorI2RlZmluZSBIRVJNRVNfUklEX0NORlNDQU5SRVFVRVNUCQkweEZDRTEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZKT0lOUkVRVUVTVAkJMHhGQ0UyCisjZGVmaW5lIEhFUk1FU19SSURfQ05GQVVUSEVOVElDQVRFU1RBVElPTgkweEZDRTMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZDSEFOTkVMSU5GT1JFUVVFU1QJMHhGQ0U0CisjZGVmaW5lIEhFUk1FU19SSURfQ05GSE9TVFNDQU4JCQkweEZDRTUKKworLyoKKyAqIEluZm9ybWF0aW9uIFJJRHMKKyAqLworI2RlZmluZSBIRVJNRVNfUklEX01BWExPQURUSU1FCQkJMHhGRDAwCisjZGVmaW5lIEhFUk1FU19SSURfRE9XTkxPQURCVUZGRVIJCTB4RkQwMQorI2RlZmluZSBIRVJNRVNfUklEX1BSSUlECQkJMHhGRDAyCisjZGVmaW5lIEhFUk1FU19SSURfUFJJU1VQUkFOR0UJCQkweEZEMDMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DRklBQ1RSQU5HRVMJCQkweEZEMDQKKyNkZWZpbmUgSEVSTUVTX1JJRF9OSUNTRVJOVU0JCQkweEZEMEEKKyNkZWZpbmUgSEVSTUVTX1JJRF9OSUNJRAkJCTB4RkQwQgorI2RlZmluZSBIRVJNRVNfUklEX01GSVNVUFJBTkdFCQkJMHhGRDBDCisjZGVmaW5lIEhFUk1FU19SSURfQ0ZJU1VQUkFOR0UJCQkweEZEMEQKKyNkZWZpbmUgSEVSTUVTX1JJRF9DSEFOTkVMTElTVAkJCTB4RkQxMAorI2RlZmluZSBIRVJNRVNfUklEX1JFR1VMQVRPUllET01BSU5TCQkweEZEMTEKKyNkZWZpbmUgSEVSTUVTX1JJRF9URU1QVFlQRQkJCTB4RkQxMgorI2RlZmluZSBIRVJNRVNfUklEX0NJUwkJCQkweEZEMTMKKyNkZWZpbmUgSEVSTUVTX1JJRF9TVEFJRAkJCTB4RkQyMAorI2RlZmluZSBIRVJNRVNfUklEX1NUQVNVUFJBTkdFCQkJMHhGRDIxCisjZGVmaW5lIEhFUk1FU19SSURfTUZJQUNUUkFOR0VTCQkJMHhGRDIyCisjZGVmaW5lIEhFUk1FU19SSURfQ0ZJQUNUUkFOR0VTMgkJMHhGRDIzCisjZGVmaW5lIEhFUk1FU19SSURfU0VDT05EQVJZVkVSU0lPTl9TWU1CT0wJMHhGRDI0CisjZGVmaW5lIEhFUk1FU19SSURfUE9SVFNUQVRVUwkJCTB4RkQ0MAorI2RlZmluZSBIRVJNRVNfUklEX0NVUlJFTlRTU0lECQkJMHhGRDQxCisjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVEJTU0lECQkJMHhGRDQyCisjZGVmaW5lIEhFUk1FU19SSURfQ09NTVNRVUFMSVRZCQkJMHhGRDQzCisjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVFRYUkFURQkJMHhGRDQ0CisjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVEJFQUNPTklOVEVSVkFMCTB4RkQ0NQorI2RlZmluZSBIRVJNRVNfUklEX0NVUlJFTlRTQ0FMRVRIUkVTSE9MRFMJMHhGRDQ2CisjZGVmaW5lIEhFUk1FU19SSURfUFJPVE9DT0xSU1BUSU1FCQkweEZENDcKKyNkZWZpbmUgSEVSTUVTX1JJRF9TSE9SVFJFVFJZTElNSVQJCTB4RkQ0OAorI2RlZmluZSBIRVJNRVNfUklEX0xPTkdSRVRSWUxJTUlUCQkweEZENDkKKyNkZWZpbmUgSEVSTUVTX1JJRF9NQVhUUkFOU01JVExJRkVUSU1FCQkweEZENEEKKyNkZWZpbmUgSEVSTUVTX1JJRF9NQVhSRUNFSVZFTElGRVRJTUUJCTB4RkQ0QgorI2RlZmluZSBIRVJNRVNfUklEX0NGUE9MTEFCTEUJCQkweEZENEMKKyNkZWZpbmUgSEVSTUVTX1JJRF9BVVRIRU5USUNBVElPTkFMR09SSVRITVMJMHhGRDRECisjZGVmaW5lIEhFUk1FU19SSURfUFJJVkFDWU9QVElPTklNUExFTUVOVEVECTB4RkQ0RgorI2RlZmluZSBIRVJNRVNfUklEX0RCTUNPTU1TUVVBTElUWV9JTlRFUlNJTAkweEZENTEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DVVJSRU5UVFhSQVRFMQkJMHhGRDgwCisjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVFRYUkFURTIJCTB4RkQ4MQorI2RlZmluZSBIRVJNRVNfUklEX0NVUlJFTlRUWFJBVEUzCQkweEZEODIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DVVJSRU5UVFhSQVRFNAkJMHhGRDgzCisjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVFRYUkFURTUJCTB4RkQ4NAorI2RlZmluZSBIRVJNRVNfUklEX0NVUlJFTlRUWFJBVEU2CQkweEZEODUKKyNkZWZpbmUgSEVSTUVTX1JJRF9PV05NQUNBRERSCQkJMHhGRDg2CisjZGVmaW5lIEhFUk1FU19SSURfU0NBTlJFU1VMVFNUQUJMRQkJMHhGRDg4CisjZGVmaW5lIEhFUk1FU19SSURfUEhZVFlQRQkJCTB4RkRDMAorI2RlZmluZSBIRVJNRVNfUklEX0NVUlJFTlRDSEFOTkVMCQkweEZEQzEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DVVJSRU5UUE9XRVJTVEFURQkJMHhGREMyCisjZGVmaW5lIEhFUk1FU19SSURfQ0NBTU9ERQkJCTB4RkRDMworI2RlZmluZSBIRVJNRVNfUklEX1NVUFBPUlRFRERBVEFSQVRFUwkJMHhGREM2CisjZGVmaW5lIEhFUk1FU19SSURfQlVJTERTRVEJCQkweEZGRkUKKyNkZWZpbmUgSEVSTUVTX1JJRF9GV0lECQkJCTB4RkZGRgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2k4MjU4Ni5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaTgyNTg2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY2NWIyNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2k4MjU4Ni5oCkBAIC0wLDAgKzEsNDEzIEBACisvKgorICogSW50ZWwgODI1ODYgSUVFRSA4MDIuMyBFdGhlcm5ldCBMQU4gQ29wcm9jZXNzb3IuCisgKgorICogU2VlOgorICoJSW50ZWwgTWljcm9jb21tdW5pY2F0aW9ucyAxOTkxCisgKglwMS0xIHRvIHAxLTM3CisgKglJbnRlbCBvcmRlciBOby4gMjMxNjU4CisgKglJU0JOIDEtNTU1MTItMTE5LTUKKyAqCisgKiAgICAgVW5mb3J0dW5hdGVseSwgdGhlIGFib3ZlIGNoYXB0ZXIgbWVudGlvbnMgbmVpdGhlcgorICogdGhlIFN5c3RlbSBDb25maWd1cmF0aW9uIFBvaW50ZXIgKFNDUCkgbm9yIHRoZQorICogSW50ZXJtZWRpYXRlIFN5c3RlbSBDb25maWd1cmF0aW9uIFBvaW50ZXIgKElTQ1ApLAorICogc28gd2UgcHJvYmFibHkgbmVlZCB0byBsb29rIGVsc2V3aGVyZSBmb3IgdGhlCisgKiB3aG9sZSBzdG9yeSAtLSBzb21lIHJlY29tbWVuZCB0aGUgIkludGVsIExBTgorICogQ29tcG9uZW50cyBtYW51YWwiIGJ1dCBJIGhhdmUgbmVpdGhlciBhIGNvcHkKKyAqIG5vciBhIGZ1bGwgcmVmZXJlbmNlLiAgQnV0ICJlbHNld2hlcmUiIG1heSBiZQorICogaW4gdGhlIHNhbWUgcHVibGljYXRpb24uLi4KKyAqICAgICBUaGUgZGVzY3JpcHRpb24gb2YgYSBsYXRlciBkZXZpY2UsIHRoZQorICogIjgyNTk2Q0EgSGlnaC1QZXJmb3JtYW5jZSAzMi1CaXQgTG9jYWwgQXJlYSBOZXR3b3JrCisgKiBDb3Byb2Nlc3NvciIsIChpYmlkLiBwMS0zOCB0byBwMS0xMDkpIGRvZXMgbWVudGlvbgorICogdGhlIFNDUCBhbmQgSVNDUCBhbmQgYWxzbyBoYXMgYW4gaTgyNTg2IGNvbXBhdGliaWxpdHkKKyAqIG1vZGUuICBFdmVuIG1vcmUgdXNlZnVsIGlzICJBUC0yMzUgQW4gODI1ODYgRGF0YSBMaW5rCisgKiBEcml2ZXIiIChpYmlkLiBwMS0zMzcgdG8gcDEtNDE3KS4KKyAqLworCisjZGVmaW5lCUk4MjU4Nl9NRU1aCSg2NCAqIDEwMjQpCisKKyNkZWZpbmUJSTgyNTg2X1NDUF9BRERSCShJODI1ODZfTUVNWiAtIHNpemVvZihzY3BfdCkpCisKKyNkZWZpbmUJQUREUl9MRU4JNgorI2RlZmluZQlJODI1ODZOVUxMCTB4RkZGRgorCisjZGVmaW5lCXRvZmYodCxwLGYpIAkodW5zaWduZWQgc2hvcnQpKCh2b2lkICopKCYoKHQgKikoKHZvaWQgKikwICsgKHApKSktPmYpIC0gKHZvaWQgKikwKQorCisvKgorICogU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciAoU0NQKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc2NwX3QJc2NwX3Q7CitzdHJ1Y3Qgc2NwX3QKK3sKKwl1bnNpZ25lZCBzaG9ydAlzY3Bfc3lzYnVzOwkvKiA4MjU4NiBidXMgd2lkdGg6CSovCisjZGVmaW5lCQlTQ1BfU1lfMTZCQlVTCSgweDAgPDwgMCkJLyogMTYgYml0cyAqLworI2RlZmluZQkJU0NQX1NZXzhCQlVTCSgweDEgPDwgMCkJLyogIDggYml0cy4gKi8KKwl1bnNpZ25lZCBzaG9ydAlzY3BfanVua1syXTsJLyogVW51c2VkICovCisJdW5zaWduZWQgc2hvcnQJc2NwX2lzY3BsOwkvKiBsb3dlciAxNiBiaXRzIG9mIElTQ1BfQUREUiAqLworCXVuc2lnbmVkIHNob3J0CXNjcF9pc2NwaDsJLyogdXBwZXIgMTYgYml0cyBvZiBJU0NQX0FERFIgKi8KK307CisKKy8qCisgKiBJbnRlcm1lZGlhdGUgU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciAoSVNDUCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IGlzY3BfdAlpc2NwX3Q7CitzdHJ1Y3QgaXNjcF90Cit7CisJdW5zaWduZWQgc2hvcnQJaXNjcF9idXN5OwkvKiBzZXQgYnkgQ1BVIGJlZm9yZSBmaXJzdCBDQSwJKi8KKwkJCQkJLyogY2xlYXJlZCBieSA4MjU4NiBhZnRlciByZWFkLgkqLworCXVuc2lnbmVkIHNob3J0CWlzY3Bfb2Zmc2V0OwkvKiBvZmZzZXQgb2YgU0NCCQkqLworCXVuc2lnbmVkIHNob3J0CWlzY3BfYmFzZWw7CS8qIGJhc2Ugb2YgU0NCCQkJKi8KKwl1bnNpZ25lZCBzaG9ydAlpc2NwX2Jhc2VoOwkvKiAgIgkJCQkqLworfTsKKworLyoKKyAqIFN5c3RlbSBDb250cm9sIEJsb2NrIChTQ0IpLgorICoJVGhlIDgyNTg2IHdyaXRlcyBpdHMgc3RhdHVzIHRvIHNjYl9zdGF0dXMgYW5kIHRoZW4KKyAqCXJhaXNlcyBhbiBpbnRlcnJ1cHQgdG8gYWxlcnQgdGhlIENQVS4KKyAqCVRoZSBDUFUgd3JpdGVzIGEgY29tbWFuZCB0byBzY2JfY29tbWFuZCBhbmQKKyAqCXRoZW4gaXNzdWVzIGEgQ2hhbm5lbCBBdHRlbnRpb24gKENBKSB0byBhbGVydCB0aGUgODI1ODYuCisgKi8KK3R5cGVkZWYgc3RydWN0IHNjYl90CXNjYl90Oworc3RydWN0IHNjYl90Cit7CisJdW5zaWduZWQgc2hvcnQJc2NiX3N0YXR1czsJLyogU3RhdHVzIG9mIDgyNTg2CQkqLworI2RlZmluZQkJU0NCX1NUX0lOVAkoMHhGIDw8IDEyKQkvKiBTb21lIG9mOgkJKi8KKyNkZWZpbmUJCVNDQl9TVF9DWAkoMHgxIDw8IDE1KQkvKiBDbWQgY29tcGxldGVkCSovCisjZGVmaW5lCQlTQ0JfU1RfRlIJKDB4MSA8PCAxNCkJLyogRnJhbWUgcmVjZWl2ZWQJKi8KKyNkZWZpbmUJCVNDQl9TVF9DTkEJKDB4MSA8PCAxMykJLyogQ21kIHVuaXQgbm90IGFjdGl2ZQkqLworI2RlZmluZQkJU0NCX1NUX1JOUgkoMHgxIDw8IDEyKQkvKiBSY3YgdW5pdCBub3QgcmVhZHkJKi8KKyNkZWZpbmUJCVNDQl9TVF9KVU5LMAkoMHgxIDw8IDExKQkvKiAwCQkJKi8KKyNkZWZpbmUJCVNDQl9TVF9DVVMJKDB4NyA8PCAgOCkJLyogQ21kIHVuaXQgc3RhdHVzCSovCisjZGVmaW5lCQkJU0NCX1NUX0NVU19JRExFCSgwIDw8IDgpCS8qIElkbGUJCSovCisjZGVmaW5lCQkJU0NCX1NUX0NVU19TVVNQCSgxIDw8IDgpCS8qIFN1c3BlbmRlZAkqLworI2RlZmluZQkJCVNDQl9TVF9DVVNfQUNUVgkoMiA8PCA4KQkvKiBBY3RpdmUJKi8KKyNkZWZpbmUJCVNDQl9TVF9KVU5LMQkoMHgxIDw8ICA3KQkvKiAwCQkJKi8KKyNkZWZpbmUJCVNDQl9TVF9SVVMJKDB4NyA8PCAgNCkJLyogUmN2IHVuaXQgc3RhdHVzCSovCisjZGVmaW5lCQkJU0NCX1NUX1JVU19JRExFCSgwIDw8IDQpCS8qIElkbGUJCSovCisjZGVmaW5lCQkJU0NCX1NUX1JVU19TVVNQCSgxIDw8IDQpCS8qIFN1c3BlbmRlZAkqLworI2RlZmluZQkJCVNDQl9TVF9SVVNfTlJFUwkoMiA8PCA0KQkvKiBObyByZXNvdXJjZXMJKi8KKyNkZWZpbmUJCQlTQ0JfU1RfUlVTX1JEWQkoNCA8PCA0KQkvKiBSZWFkeQkqLworCXVuc2lnbmVkIHNob3J0CXNjYl9jb21tYW5kOwkvKiBOZXh0IGNvbW1hbmQJCQkqLworI2RlZmluZQkJU0NCX0NNRF9BQ0tfQ1gJKDB4MSA8PCAxNSkJLyogQWNrIGNtZCBjb21wbGV0aW9uCSovCisjZGVmaW5lCQlTQ0JfQ01EX0FDS19GUgkoMHgxIDw8IDE0KQkvKiBBY2sgZnJhbWUgcmVjZWl2ZWQJKi8KKyNkZWZpbmUJCVNDQl9DTURfQUNLX0NOQQkoMHgxIDw8IDEzKQkvKiBBY2sgQ1Ugbm90IGFjdGl2ZQkqLworI2RlZmluZQkJU0NCX0NNRF9BQ0tfUk5SCSgweDEgPDwgMTIpCS8qIEFjayBSVSBub3QgcmVhZHkJKi8KKyNkZWZpbmUJCVNDQl9DTURfSlVOS1gJKDB4MSA8PCAxMSkJLyogVW51c2VkCQkqLworI2RlZmluZQkJU0NCX0NNRF9DVUMJKDB4NyA8PCAgOCkJLyogQ29tbWFuZCBVbml0IGNvbW1hbmQJKi8KKyNkZWZpbmUJCQlTQ0JfQ01EX0NVQ19OT1AJKDAgPDwgOCkJLyogTm9wCQkqLworI2RlZmluZQkJCVNDQl9DTURfQ1VDX0dPCSgxIDw8IDgpCS8qIFN0YXJ0IGNibF9vZmZzZXQgKi8KKyNkZWZpbmUJCQlTQ0JfQ01EX0NVQ19SRVMJKDIgPDwgOCkJLyogUmVzdW1lIGV4ZWN1dGlvbiAqLworI2RlZmluZQkJCVNDQl9DTURfQ1VDX1NVUwkoMyA8PCA4KQkvKiBTdXNwZW5kICAgIgkqLworI2RlZmluZQkJCVNDQl9DTURfQ1VDX0FCVAkoNCA8PCA4KQkvKiBBYm9ydCAgICAgIgkqLworI2RlZmluZQkJU0NCX0NNRF9SRVNFVAkoMHgxIDw8ICA3KQkvKiBSZXNldCBjaGlwIChoYXJkd2FyZSkgKi8KKyNkZWZpbmUJCVNDQl9DTURfUlVDCSgweDcgPDwgIDQpCS8qIFJlY2VpdmUgVW5pdCBjb21tYW5kCSovCisjZGVmaW5lCQkJU0NCX0NNRF9SVUNfTk9QCSgwIDw8IDQpCS8qIE5vcAkJKi8KKyNkZWZpbmUJCQlTQ0JfQ01EX1JVQ19HTwkoMSA8PCA0KQkvKiBTdGFydCByZmFfb2Zmc2V0ICovCisjZGVmaW5lCQkJU0NCX0NNRF9SVUNfUkVTCSgyIDw8IDQpCS8qIFJlc3VtZSByZWNlcHRpb24gKi8KKyNkZWZpbmUJCQlTQ0JfQ01EX1JVQ19TVVMJKDMgPDwgNCkJLyogU3VzcGVuZCAgICIJKi8KKyNkZWZpbmUJCQlTQ0JfQ01EX1JVQ19BQlQJKDQgPDwgNCkJLyogQWJvcnQgICAgICIJKi8KKwl1bnNpZ25lZCBzaG9ydAlzY2JfY2JsX29mZnNldDsJLyogT2Zmc2V0IG9mIGZpcnN0IGNvbW1hbmQgdW5pdAkqLworCQkJCQkvKiBBY3Rpb24gQ29tbWFuZAkJKi8KKwl1bnNpZ25lZCBzaG9ydAlzY2JfcmZhX29mZnNldDsJLyogT2Zmc2V0IG9mIGZpcnN0IFJlY2VpdmUJKi8KKwkJCQkJLyogRnJhbWUgRGVzY3JpcHRvciBpbiB0aGUJKi8KKwkJCQkJLyogUmVjZWl2ZSBGcmFtZSBBcmVhCQkqLworCXVuc2lnbmVkIHNob3J0CXNjYl9jcmNlcnJzOwkvKiBQcm9wZXJseSBhbGlnbmVkIGZyYW1lcwkqLworCQkJCQkvKiByZWNlaXZlZCB3aXRoIGEgQ1JDIGVycm9yCSovCisJdW5zaWduZWQgc2hvcnQJc2NiX2FsbmVycnM7CS8qIE1pc2FsaWduZWQgZnJhbWVzIHJlY2VpdmVkCSovCisJCQkJCS8qIHdpdGggYSBDUkMgZXJyb3IJCSovCisJdW5zaWduZWQgc2hvcnQJc2NiX3JzY2VycnM7CS8qIEZyYW1lcyBsb3N0IGR1ZSB0byBubyBzcGFjZQkqLworCXVuc2lnbmVkIHNob3J0CXNjYl9vdnJuZXJyczsJLyogRnJhbWVzIGxvc3QgZHVlIHRvIHNsb3cgYnVzCSovCit9OworCisjZGVmaW5lCXNjYm9mZihwLGYpIAl0b2ZmKHNjYl90LCBwLCBmKQorCisvKgorICogVGhlIGVpZ2h0IEFjdGlvbiBDb21tYW5kcy4KKyAqLwordHlwZWRlZiBlbnVtIGFjbWRfZQlhY21kX2U7CitlbnVtIGFjbWRfZQoreworCWFjbWRfbm9wCT0gMCwJLyogRG8gbm90aGluZwkJCQkqLworCWFjbWRfaWFfc2V0dXAJPSAxLAkvKiBMb2FkIGFuIChldGhlcm5ldCkgYWRkcmVzcyBpbnRvIHRoZQkqLworCQkJCS8qIDgyNTg2CQkJCSovCisJYWNtZF9jb25maWd1cmUJPSAyLAkvKiBVcGRhdGUgdGhlIDgyNTg2IG9wZXJhdGluZyBwYXJhbWV0ZXJzICovCisJYWNtZF9tY19zZXR1cAk9IDMsCS8qIExvYWQgYSBsaXN0IG9mIChldGhlcm5ldCkgbXVsdGljYXN0CSovCisJCQkJLyogYWRkcmVzc2VzIGludG8gdGhlIDgyNTg2CQkqLworCWFjbWRfdHJhbnNtaXQJPSA0LAkvKiBUcmFuc21pdCBhIGZyYW1lCQkJKi8KKwlhY21kX3Rkcgk9IDUsCS8qIFBlcmZvcm0gYSBUaW1lIERvbWFpbiBSZWZsZWN0b21ldGVyCSovCisJCQkJLyogdGVzdCBvbiB0aGUgc2VyaWFsIGxpbmsJCSovCisJYWNtZF9kdW1wCT0gNiwJLyogQ29weSA4MjU4NiByZWdpc3RlcnMgdG8gbWVtb3J5CSovCisJYWNtZF9kaWFnbm9zZQk9IDcsCS8qIFJ1biBhbiBpbnRlcm5hbCBzZWxmIHRlc3QJCSovCit9OworCisvKgorICogR2VuZXJpYyBBY3Rpb24gQ29tbWFuZCBoZWFkZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFjaF90CWFjaF90Oworc3RydWN0IGFjaF90Cit7CisJdW5zaWduZWQgc2hvcnQJYWNfc3RhdHVzOwkJLyogQ29tbWFuZCBzdGF0dXM6CSovCisjZGVmaW5lCQlBQ19TRkxEX0MJKDB4MSA8PCAxNSkJLyogQ29tbWFuZCBjb21wbGV0ZWQJKi8KKyNkZWZpbmUJCUFDX1NGTERfQgkoMHgxIDw8IDE0KQkvKiBCdXN5IGV4ZWN1dGluZwkqLworI2RlZmluZQkJQUNfU0ZMRF9PSwkoMHgxIDw8IDEzKQkvKiBDb21wbGV0ZWQgZXJyb3IgZnJlZQkqLworI2RlZmluZQkJQUNfU0ZMRF9BCSgweDEgPDwgMTIpCS8qIENvbW1hbmQgYWJvcnRlZAkqLworI2RlZmluZQkJQUNfU0ZMRF9GQUlMCSgweDEgPDwgMTEpCS8qIFNlbGZ0ZXN0IGZhaWxlZAkqLworI2RlZmluZQkJQUNfU0ZMRF9TMTAJKDB4MSA8PCAxMCkJLyogTm8gY2FycmllciBzZW5zZQkqLworCQkJCQkJLyogZHVyaW5nIHRyYW5zbWlzc2lvbgkqLworI2RlZmluZQkJQUNfU0ZMRF9TOQkoMHgxIDw8ICA5KQkvKiBUeCB1bnN1Y2Nlc3NmdWw6CSovCisJCQkJCQkvKiAoc3RvcHBlZCkgbG9zdCBDVFMJKi8KKyNkZWZpbmUJCUFDX1NGTERfUzgJKDB4MSA8PCAgOCkJLyogVHggdW5zdWNjZXNzZnVsOgkqLworCQkJCQkJLyogKHN0b3BwZWQpIHNsb3cgRE1BCSovCisjZGVmaW5lCQlBQ19TRkxEX1M3CSgweDEgPDwgIDcpCS8qIFR4IGRlZmVycmVkOgkJKi8KKwkJCQkJCS8qIG90aGVyIGxpbmsgdHJhZmZpYwkqLworI2RlZmluZQkJQUNfU0ZMRF9TNgkoMHgxIDw8ICA2KQkvKiBIZWFydCBCZWF0OiBjb2xsaXNpb24gKi8KKwkJCQkJCS8qIGRldGVjdCBhZnRlciBsYXN0IHR4CSovCisjZGVmaW5lCQlBQ19TRkxEX1M1CSgweDEgPDwgIDUpCS8qIFR4IHN0b3BwZWQ6CQkqLworCQkJCQkJLyogZXhjZXNzaXZlIGNvbGxpc2lvbnMJKi8KKyNkZWZpbmUJCUFDX1NGTERfTUFYQ09MCSgweEYgPDwgIDApCS8qIENvbGxpc2lvbiBjb3VudCAgCSovCisJdW5zaWduZWQgc2hvcnQJYWNfY29tbWFuZDsJCS8qIENvbW1hbmQgc3BlY2lmaWVyOgkqLworI2RlZmluZQkJQUNfQ0ZMRF9FTAkoMHgxIDw8IDE1KQkvKiBFbmQgb2YgY29tbWFuZCBsaXN0CSovCisjZGVmaW5lCQlBQ19DRkxEX1MJKDB4MSA8PCAxNCkJLyogU3VzcGVuZCBvbiBjb21wbGV0aW9uICovCisjZGVmaW5lCQlBQ19DRkxEX0kJKDB4MSA8PCAxMykJLyogSW50ZXJydXB0IG9uIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUJCUFDX0NGTERfQ01ECSgweDcgPDwgIDApCS8qIGFjbWRfZQkJKi8KKwl1bnNpZ25lZCBzaG9ydAlhY19saW5rOwkJLyogTmV4dCBBY3Rpb24gQ29tbWFuZAkqLworfTsKKworI2RlZmluZQlhY29mZihwLGYpIAl0b2ZmKGFjaF90LCBwLCBmKQorCisvKgorICogVGhlIE5vcCBBY3Rpb24gQ29tbWFuZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYWNfbm9wX3QJYWNfbm9wX3Q7CitzdHJ1Y3QgYWNfbm9wX3QKK3sKKwlhY2hfdAlub3BfaDsKK307CisKKy8qCisgKiBUaGUgSUEtU2V0dXAgQWN0aW9uIENvbW1hbmQuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFjX2lhc190CWFjX2lhc190Oworc3RydWN0IGFjX2lhc190Cit7CisJYWNoX3QJCWlhc19oOworCXVuc2lnbmVkIGNoYXIJaWFzX2FkZHJbQUREUl9MRU5dOyAvKiBUaGUgKGV0aGVybmV0KSBhZGRyZXNzCSovCit9OworCisvKgorICogVGhlIENvbmZpZ3VyZSBBY3Rpb24gQ29tbWFuZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYWNfY2ZnX3QJYWNfY2ZnX3Q7CitzdHJ1Y3QgYWNfY2ZnX3QKK3sKKwlhY2hfdAkJY2ZnX2g7CisJdW5zaWduZWQgY2hhcgljZmdfYnl0ZV9jbnQ7CS8qIFNpemUgZm9sbCBkYXRhOiA0LTEyCSovCisjZGVmaW5lCUFDX0NGR19CWVRFX0NOVCh2KQkoKCh2KSAmIDB4RikgPDwgMCkKKwl1bnNpZ25lZCBjaGFyCWNmZ19maWZvbGltOwkvKiBGSUZPIHRocmVzaG9sZAkqLworI2RlZmluZQlBQ19DRkdfRklGT0xJTSh2KQkoKCh2KSAmIDB4RikgPDwgMCkKKwl1bnNpZ25lZCBjaGFyCWNmZ19ieXRlODsKKyNkZWZpbmUJQUNfQ0ZHX1NBVl9CRih2KSAJKCgodikgJiAweDEpIDw8IDcpCS8qIFNhdmUgcnhkIGJhZCBmcmFtZXMJKi8KKyNkZWZpbmUJQUNfQ0ZHX1NSRFkodikgCQkoKCh2KSAmIDB4MSkgPDwgNikJLyogU1JEWS9BUkRZIHBpbiBtZWFucwkqLworCQkJCQkJCS8qIGV4dGVybmFsIHN5bmMuCSovCisJdW5zaWduZWQgY2hhcgljZmdfYnl0ZTk7CisjZGVmaW5lCUFDX0NGR19FTFBCQ0sodikJKCgodikgJiAweDEpIDw8IDcpCS8qIEV4dGVybmFsIGxvb3BiYWNrCSovCisjZGVmaW5lCUFDX0NGR19JTFBCQ0sodikJKCgodikgJiAweDEpIDw8IDYpCS8qIEludGVybmFsIGxvb3BiYWNrCSovCisjZGVmaW5lCUFDX0NGR19QUkVMRU4odikJKCgodikgJiAweDMpIDw8IDQpCS8qIFByZWFtYmxlIGxlbmd0aAkqLworI2RlZmluZQkJQUNfQ0ZHX1BMRU5fMgkJMAkJLyogIDIgYnl0ZXMJKi8KKyNkZWZpbmUJCUFDX0NGR19QTEVOXzQJCTEJCS8qICA0IGJ5dGVzCSovCisjZGVmaW5lCQlBQ19DRkdfUExFTl84CQkyCQkvKiAgOCBieXRlcwkqLworI2RlZmluZQkJQUNfQ0ZHX1BMRU5fMTYJCTMJCS8qIDE2IGJ5dGVzCSovCisjZGVmaW5lCUFDX0NGR19BTE9DKHYpCQkoKCh2KSAmIDB4MSkgPDwgMykJLyogQWRkci9sZW4gZGF0YSBpcwkqLworCQkJCQkJCS8qIGV4cGxpY2l0IGluIGJ1ZmZlcnMJKi8KKyNkZWZpbmUJQUNfQ0ZHX0FERFJMRU4odikJKCgodikgJiAweDcpIDw8IDApCS8qIEJ5dGVzIHBlciBhZGRyZXNzCSovCisJdW5zaWduZWQgY2hhcgljZmdfYnl0ZTEwOworI2RlZmluZQlBQ19DRkdfQk9GTUVUKHYpCSgoKHYpICYgMHgxKSA8PCA3KQkvKiBVc2UgYWx0ZXJuYXRlIGV4cG8uCSovCisJCQkJCQkJLyogYmFja29mZiBtZXRob2QJKi8KKyNkZWZpbmUJQUNfQ0ZHX0FDUih2KQkJKCgodikgJiAweDcpIDw8IDQpCS8qIEFjY2VsZXJhdGVkIGNvbnQuIHJlcy4gKi8KKyNkZWZpbmUJQUNfQ0ZHX0xJTlBSSU8odikJKCgodikgJiAweDcpIDw8IDApCS8qIExpbmVhciBwcmlvcml0eQkqLworCXVuc2lnbmVkIGNoYXIJY2ZnX2lmczsJLyogSW50ZXJmcmFtZSBzcGFjaW5nCQkqLworCXVuc2lnbmVkIGNoYXIJY2ZnX3Nsb3RsOwkvKiBTbG90IHRpbWUgKGxvdyBieXRlKQkJKi8KKwl1bnNpZ25lZCBjaGFyCWNmZ19ieXRlMTM7CisjZGVmaW5lCUFDX0NGR19SRVRSWU5VTSh2KQkoKCh2KSAmIDB4RikgPDwgNCkJLyogTWF4LiBjb2xsaXNpb24gcmV0cnkJKi8KKyNkZWZpbmUJQUNfQ0ZHX1NMVFRNSEkodikJKCgodikgJiAweDcpIDw8IDApCS8qIFNsb3QgdGltZSAoaGlnaCBiaXRzKSAqLworCXVuc2lnbmVkIGNoYXIJY2ZnX2J5dGUxNDsKKyNkZWZpbmUJQUNfQ0ZHX0ZMR1BBRCh2KQkoKCh2KSAmIDB4MSkgPDwgNykJLyogUGFkIHdpdGggSERMQyBmbGFncwkqLworI2RlZmluZQlBQ19DRkdfQlRTVEYodikJCSgoKHYpICYgMHgxKSA8PCA2KQkvKiBEbyBIRExDIGJpdHN0dWZmaW5nCSovCisjZGVmaW5lCUFDX0NGR19DUkMxNih2KQkJKCgodikgJiAweDEpIDw8IDUpCS8qIDE2IGJpdCBDQ0lUVCBDUkMJKi8KKyNkZWZpbmUJQUNfQ0ZHX05DUkModikJCSgoKHYpICYgMHgxKSA8PCA0KQkvKiBJbnNlcnQgbm8gQ1JDCSovCisjZGVmaW5lCUFDX0NGR19UTkNSUyh2KQkJKCgodikgJiAweDEpIDw8IDMpCS8qIFR4IGV2ZW4gaWYgbm8gY2FycmllciAqLworI2RlZmluZQlBQ19DRkdfTUFOQ0godikJCSgoKHYpICYgMHgxKSA8PCAyKQkvKiBNYW5jaGVzdGVyIGNvZGluZwkqLworI2RlZmluZQlBQ19DRkdfQkNESVModikJCSgoKHYpICYgMHgxKSA8PCAxKQkvKiBEaXNhYmxlIGJyb2FkY2FzdAkqLworI2RlZmluZQlBQ19DRkdfUFJNKHYpCQkoKCh2KSAmIDB4MSkgPDwgMCkJLyogUHJvbWlzY3VvdXMgbW9kZQkqLworCXVuc2lnbmVkIGNoYXIJY2ZnX2J5dGUxNTsKKyNkZWZpbmUJQUNfQ0ZHX0lDRFModikJCSgoKHYpICYgMHgxKSA8PCA3KQkvKiBJbnRlcm5hbCBjb2xsaXNpb24JKi8KKwkJCQkJCQkvKiBkZXRlY3Qgc291cmNlCSovCisjZGVmaW5lCUFDX0NGR19DRFRGKHYpCQkoKCh2KSAmIDB4NykgPDwgNCkJLyogQ29sbGlzaW9uIGRldGVjdAkqLworCQkJCQkJCS8qIGZpbHRlciBpbiBiaXQgdGltZXMJKi8KKyNkZWZpbmUJQUNfQ0ZHX0lDU1ModikJCSgoKHYpICYgMHgxKSA8PCAzKQkvKiBJbnRlcm5hbCBjYXJyaWVyCSovCisJCQkJCQkJLyogc2Vuc2Ugc291cmNlCQkqLworI2RlZmluZQlBQ19DRkdfQ1NURih2KQkJKCgodikgJiAweDcpIDw8IDApCS8qIENhcnJpZXIgc2Vuc2UJKi8KKwkJCQkJCQkvKiBmaWx0ZXIgaW4gYml0IHRpbWVzCSovCisJdW5zaWduZWQgc2hvcnQJY2ZnX21pbl9mcm1fbGVuOworI2RlZmluZQlBQ19DRkdfTU5GUk0odikJCSgoKHYpICYgMHhGRikgPDwgMCkJLyogTWluLiBieXRlcy9mcmFtZSAoPD0gMjU1KSAqLworfTsKKworLyoKKyAqIFRoZSBNQy1TZXR1cCBBY3Rpb24gQ29tbWFuZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYWNfbWNzX3QJYWNfbWNzX3Q7CitzdHJ1Y3QgYWNfbWNzX3QKK3sKKwlhY2hfdAkJbWNzX2g7CisJdW5zaWduZWQgc2hvcnQJbWNzX2NudDsJLyogTm8uIG9mIGJ5dGVzIG9mIE1DIGFkZHJlc3NlcwkqLworI2lmIDAKKwl1bnNpZ25lZCBjaGFyCW1jc19kYXRhW0FERFJfTEVOXTsgLyogVGhlIGZpcnN0IE1DIGFkZHJlc3MgLi4JKi8KKwkuLi4KKyNlbmRpZgorfTsKKworI2RlZmluZSBJODI1ODZfTUFYX01VTFRJQ0FTVF9BRERSRVNTRVMJMTI4CS8qIEhhcmR3YXJlIGhhc2hlZCBmaWx0ZXIgKi8KKworLyoKKyAqIFRoZSBUcmFuc21pdCBBY3Rpb24gQ29tbWFuZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYWNfdHhfdAlhY190eF90Oworc3RydWN0IGFjX3R4X3QKK3sKKwlhY2hfdAkJdHhfaDsKKwl1bnNpZ25lZCBzaG9ydAl0eF90YmRfb2Zmc2V0OwkvKiBBZGRyZXNzIG9mIGxpc3Qgb2YgYnVmZmVycy4JKi8KKyNpZgkwCitMaW51eCBwYWNrZXRzIGFyZSBwYXNzZWQgZG93biB3aXRoIHRoZSBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcworYW5kIGxlbmd0aC90eXBlIGZpZWxkIGFscmVhZHkgcHJlcGVuZGVkIHRvIHRoZSBkYXRhLAorc28gd2UgZG8gbm90IG5lZWQgdG8gaW5zZXJ0IGl0LiAgQ29uc2lzdGVudCB3aXRoIHRoaXMKK3dlIG11c3QgYWxzbyBzZXQgdGhlIEFDX0NGR19BTE9DKC4uKSBmbGFnIGR1cmluZyB0aGUKK2FjX2NmZ190IGFjdGlvbiBjb21tYW5kLgorCXVuc2lnbmVkIGNoYXIJdHhfYWRkcltBRERSX0xFTl07IC8qIFRoZSBmcmFtZSBkZXN0LiBhZGRyZXNzCSovCisJdW5zaWduZWQgc2hvcnQJdHhfbGVuZ3RoOwkvKiBUaGUgZnJhbWUgbGVuZ3RoCQkqLworI2VuZGlmCS8qIDAgKi8KK307CisKKy8qCisgKiBUaGUgVGltZSBEb21haW4gUmVmbGVjdG9tZXRlciBBY3Rpb24gQ29tbWFuZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYWNfdGRyX3QJYWNfdGRyX3Q7CitzdHJ1Y3QgYWNfdGRyX3QKK3sKKwlhY2hfdAkJdGRyX2g7CisJdW5zaWduZWQgc2hvcnQJdGRyX3Jlc3VsdDsJLyogUmVzdWx0LgkqLworI2RlZmluZQkJQUNfVERSX0xOS19PSwkoMHgxIDw8IDE1KQkvKiBObyBsaW5rIHByb2JsZW0JKi8KKyNkZWZpbmUJCUFDX1REUl9YQ1ZSX1BSQgkoMHgxIDw8IDE0KQkvKiBUeGN2ciBjYWJsZSBwcm9ibGVtCSovCisjZGVmaW5lCQlBQ19URFJfRVRfT1BOCSgweDEgPDwgMTMpCS8qIE9wZW4gb24gdGhlIGxpbmsJKi8KKyNkZWZpbmUJCUFDX1REUl9FVF9TUlQJKDB4MSA8PCAxMikJLyogU2hvcnQgb24gdGhlIGxpbmsJKi8KKyNkZWZpbmUJCUFDX1REUl9USU1FCSgweDdGRiA8PCAwKQkvKiBEaXN0YW5jZSB0byBwcm9ibGVtCSovCisJCQkJCQkvKiBzaXRlCWluIHRyYW5zbWl0CSovCisJCQkJCQkvKiBjbG9jayBjeWNsZXMJCSovCit9OworCisvKgorICogVGhlIER1bXAgQWN0aW9uIENvbW1hbmQuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFjX2RtcF90CWFjX2RtcF90Oworc3RydWN0IGFjX2RtcF90Cit7CisJYWNoX3QJCWRtcF9oOworCXVuc2lnbmVkIHNob3J0CWRtcF9vZmZzZXQ7CS8qIFJlc3VsdC4JKi8KK307CisKKy8qCisgKiBTaXplIG9mIHRoZSByZXN1bHQgb2YgdGhlIGR1bXAgY29tbWFuZC4KKyAqLworI2RlZmluZQlEVU1QQllURVMJMTcwCisKKy8qCisgKiBUaGUgRGlhZ25vc2UgQWN0aW9uIENvbW1hbmQuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFjX2Rnbl90CWFjX2Rnbl90Oworc3RydWN0IGFjX2Rnbl90Cit7CisJYWNoX3QJCWRnbl9oOworfTsKKworLyoKKyAqIFRyYW5zbWl0IEJ1ZmZlciBEZXNjcmlwdG9yIChUQkQpLgorICovCit0eXBlZGVmIHN0cnVjdCB0YmRfdAl0YmRfdDsKK3N0cnVjdCB0YmRfdAoreworCXVuc2lnbmVkIHNob3J0CXRiZF9zdGF0dXM7CQkvKiBXcml0dGVuIGJ5IHRoZSBDUFUJKi8KKyNkZWZpbmUJCVRCRF9TVEFUVVNfRU9GCSgweDEgPDwgMTUpCS8qIFRoaXMgVEJEIGlzIHRoZQkqLworCQkJCQkJLyogbGFzdCBmb3IgdGhpcyBmcmFtZQkqLworI2RlZmluZQkJVEJEX1NUQVRVU19BQ05UCSgweDNGRkYgPDwgMCkJLyogQWN0dWFsIGNvdW50IG9mIGRhdGEJKi8KKwkJCQkJCS8qIGJ5dGVzIGluIHRoaXMgYnVmZmVyCSovCisJdW5zaWduZWQgc2hvcnQJdGJkX25leHRfYmRfb2Zmc2V0OwkvKiBOZXh0IGluIGxpc3QJCSovCisJdW5zaWduZWQgc2hvcnQJdGJkX2J1Zmw7CQkvKiBCdWZmZXIgYWRkcmVzcyAobG93KQkqLworCXVuc2lnbmVkIHNob3J0CXRiZF9idWZoOwkJLyogICAgIgkgICAgICIJKGhpZ2gpCSovCit9OworCisvKgorICogUmVjZWl2ZSBCdWZmZXIgRGVzY3JpcHRvciAoUkJEKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgcmJkX3QJcmJkX3Q7CitzdHJ1Y3QgcmJkX3QKK3sKKwl1bnNpZ25lZCBzaG9ydAlyYmRfc3RhdHVzOwkJLyogV3JpdHRlbiBieSB0aGUgODI1ODYJKi8KKyNkZWZpbmUJCVJCRF9TVEFUVVNfRU9GCSgweDEgPDwgMTUpCS8qIFRoaXMgUkJEIGlzIHRoZQkqLworCQkJCQkJLyogbGFzdCBmb3IgdGhpcyBmcmFtZQkqLworI2RlZmluZQkJUkJEX1NUQVRVU19GCSgweDEgPDwgMTQpCS8qIEFDTlQgZmllbGQgaXMgdmFsaWQJKi8KKyNkZWZpbmUJCVJCRF9TVEFUVVNfQUNOVAkoMHgzRkZGIDw8IDApCS8qIEFjdHVhbCBuby4gb2YgZGF0YQkqLworCQkJCQkJLyogYnl0ZXMgaW4gdGhpcyBidWZmZXIJKi8KKwl1bnNpZ25lZCBzaG9ydAlyYmRfbmV4dF9yYmRfb2Zmc2V0OwkvKiBOZXh0IHJiZCBpbiBsaXN0CSovCisJdW5zaWduZWQgc2hvcnQJcmJkX2J1Zmw7CQkvKiBEYXRhIHBvaW50ZXIgKGxvdykJKi8KKwl1bnNpZ25lZCBzaG9ydAlyYmRfYnVmaDsJCS8qICAiCSAgICIgICAgKGhpZ2gpCSovCisJdW5zaWduZWQgc2hvcnQJcmJkX2VsX3NpemU7CQkvKiBFTCtEYXRhIGJ1Zi4gc2l6ZQkqLworI2RlZmluZQkJUkJEX0VMCSgweDEgPDwgMTUpCQkvKiBUaGlzIEJEIGlzIHRoZQkqLworCQkJCQkJLyogbGFzdCBpbiB0aGUgbGlzdAkqLworI2RlZmluZQkJUkJEX1NJWkUgKDB4M0ZGRiA8PCAwKQkJLyogTm8uIG9mIGJ5dGVzIHRoZQkqLworCQkJCQkJLyogYnVmZmVyIGNhbiBob2xkCSovCit9OworCisjZGVmaW5lCXJiZG9mZihwLGYpIAl0b2ZmKHJiZF90LCBwLCBmKQorCisvKgorICogRnJhbWUgRGVzY3JpcHRvciAoRkQpLgorICovCit0eXBlZGVmIHN0cnVjdCBmZF90CWZkX3Q7CitzdHJ1Y3QgZmRfdAoreworCXVuc2lnbmVkIHNob3J0CWZkX3N0YXR1czsJCS8qIFdyaXR0ZW4gYnkgdGhlIDgyNTg2CSovCisjZGVmaW5lCQlGRF9TVEFUVVNfQwkoMHgxIDw8IDE1KQkvKiBDb21wbGV0ZWQgc3RvcmluZyBmcmFtZSAqLworI2RlZmluZQkJRkRfU1RBVFVTX0IJKDB4MSA8PCAxNCkJLyogRkQgd2FzIGNvbnN1bWVkIGJ5IFJVICovCisjZGVmaW5lCQlGRF9TVEFUVVNfT0sJKDB4MSA8PCAxMykJLyogRnJhbWUgcnhkIHN1Y2Nlc3NmdWxseSAqLworI2RlZmluZQkJRkRfU1RBVFVTX1MxMQkoMHgxIDw8IDExKQkvKiBDUkMgZXJyb3IJCSovCisjZGVmaW5lCQlGRF9TVEFUVVNfUzEwCSgweDEgPDwgMTApCS8qIEFsaWdubWVudCBlcnJvcgkqLworI2RlZmluZQkJRkRfU1RBVFVTX1M5CSgweDEgPDwgIDkpCS8qIFJhbiBvdXQgb2YgcmVzb3VyY2VzCSovCisjZGVmaW5lCQlGRF9TVEFUVVNfUzgJKDB4MSA8PCAgOCkJLyogUnggRE1BIG92ZXJydW4JKi8KKyNkZWZpbmUJCUZEX1NUQVRVU19TNwkoMHgxIDw8ICA3KQkvKiBGcmFtZSB0b28gc2hvcnQJKi8KKyNkZWZpbmUJCUZEX1NUQVRVU19TNgkoMHgxIDw8ICA2KQkvKiBObyBFT0YgZmxhZwkJKi8KKwl1bnNpZ25lZCBzaG9ydAlmZF9jb21tYW5kOwkJLyogQ29tbWFuZAkJKi8KKyNkZWZpbmUJCUZEX0NPTU1BTkRfRUwJKDB4MSA8PCAxNSkJLyogTGFzdCBGRCBpbiBsaXN0CSovCisjZGVmaW5lCQlGRF9DT01NQU5EX1MJKDB4MSA8PCAxNCkJLyogU3VzcGVuZCBSVSBhZnRlciByeAkqLworCXVuc2lnbmVkIHNob3J0CWZkX2xpbmtfb2Zmc2V0OwkJLyogTmV4dCBGRAkJKi8KKwl1bnNpZ25lZCBzaG9ydAlmZF9yYmRfb2Zmc2V0OwkJLyogRmlyc3QgUkJEIChkYXRhKQkqLworCQkJCQkJLyogUHJlcGFyZWQgYnkgQ1BVLAkqLworCQkJCQkJLyogdXBkYXRlZCBieSA4MjU4NgkqLworI2lmCTAKK0kgdGhpbmsgdGhlIHJlc3QgaXMgdW51c2VkIHNpbmNlIHdlCitoYXZlIHNldCBBQ19DRkdfQUxPQyguLikuICBIb3dldmVyLCBqdXN0CitpbiBjYXNlLCB3ZSBsZWF2ZSB0aGUgc3BhY2UuCisjZW5kaWYJLyogMCAqLworCXVuc2lnbmVkIGNoYXIJZmRfZGVzdFtBRERSX0xFTl07CS8qIERlc3RpbmF0aW9uIGFkZHJlc3MJKi8KKwkJCQkJCS8qIFdyaXR0ZW4gYnkgODI1ODYJKi8KKwl1bnNpZ25lZCBjaGFyCWZkX3NyY1tBRERSX0xFTl07CS8qIFNvdXJjZSBhZGRyZXNzCSovCisJCQkJCQkvKiBXcml0dGVuIGJ5IDgyNTg2CSovCisJdW5zaWduZWQgc2hvcnQJZmRfbGVuZ3RoOwkJLyogRnJhbWUgbGVuZ3RoIG9yIHR5cGUJKi8KKwkJCQkJCS8qIFdyaXR0ZW4gYnkgODI1ODYJKi8KK307CisKKyNkZWZpbmUJZmRvZmYocCxmKSAJdG9mZihmZF90LCBwLCBmKQorCisvKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgb25seSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZAorICogYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogRm9yIG1vcmUgZGV0YWlscywgc2VlIHdhdmVsYW4uYy4KKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaTgyNTkzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pODI1OTMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2FjYjhhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaTgyNTkzLmgKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgSW50ZWwgODI1OTMgQ1NNQS9DRCBDb3JlIExBTiBDb250cm9sbGVyCisgKiBUaGUgZGVmaW5pdGlvbnMgYXJlIHRha2VuIGZyb20gdGhlIDE5OTIgdXNlcnMgbWFudWFsIHdpdGggSW50ZWwKKyAqIG9yZGVyIG51bWJlciAyOTcxMjUtMDAxLgorICoKKyAqIC91c3Ivc3JjL3BjL1JDUy9pODI1OTMuaCx2IDEuMSAxOTk2LzA3LzE3IDE1OjIzOjEyIHJvb3QgRXhwCisgKgorICogQ29weXJpZ2h0IDE5OTQsIEFuZGVycyBLbGVtZXRzIDxrbGVtZXRzQGl0Lmt0aC5zZT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQgZm9yIG5vbmNvbW1lcmNpYWwgcHVycG9zZXMKKyAqIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcmV0YWluZWQuCisgKiAKKyAqIEhJU1RPUlkKKyAqIGk4MjU5My5oLHYKKyAqIFJldmlzaW9uIDEuMSAgMTk5Ni8wNy8xNyAxNToyMzoxMiAgcm9vdAorICogSW5pdGlhbCByZXZpc2lvbgorICoKKyAqIFJldmlzaW9uIDEuMyAgMTk5NS8wNC8wNSAgMTU6MTM6NTggIGFkagorICogSW5pdGlhbCBhbHBoYSByZWxlYXNlCisgKgorICogUmV2aXNpb24gMS4yICAxOTk0LzA2LzE2ICAyMzo1NzozMSAga2xlbWV0cworICogTWlycm9yZWQgYWxsIHRoZSBmaWVsZHMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gYmxvY2suCisgKgorICogUmV2aXNpb24gMS4xICAxOTk0LzA2LzAyICAyMDoyNTozNCAga2xlbWV0cworICogSW5pdGlhbCByZXZpc2lvbgorICoKKyAqCisgKi8KKyNpZm5kZWYJX0k4MjU5M19ICisjZGVmaW5lCV9JODI1OTNfSAorCisvKiBJbnRlbCA4MjU5MyBDU01BL0NEIENvcmUgTEFOIENvbnRyb2xsZXIgKi8KKworLyogUG9ydCAwIENvbW1hbmQgUmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKworLyogRXhlY3V0aW9uIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgT1AwX05PUAkJCTAJLyogQ0hOTCA9IDAgKi8KKyNkZWZpbmUgT1AwX1NXSVRfVE9fUE9SVF8xCTAJLyogQ0hOTCA9IDEgKi8KKyNkZWZpbmUgT1AwX0lBX1NFVFVQCQkxCisjZGVmaW5lIE9QMF9DT05GSUdVUkUJCTIKKyNkZWZpbmUgT1AwX01DX1NFVFVQCQkzCisjZGVmaW5lIE9QMF9UUkFOU01JVAkJNAorI2RlZmluZSBPUDBfVERSCQkJNQorI2RlZmluZSBPUDBfRFVNUAkJNgorI2RlZmluZSBPUDBfRElBR05PU0UJCTcKKyNkZWZpbmUgT1AwX1RSQU5TTUlUX05PX0NSQwk5CisjZGVmaW5lIE9QMF9SRVRSQU5TTUlUCQkxMgorI2RlZmluZSBPUDBfQUJPUlQJCTEzCisvKiBSZWNlcHRpb24gb3BlcmF0aW9ucyAqLworI2RlZmluZSBPUDBfUkNWX0VOQUJMRQkJOAorI2RlZmluZSBPUDBfUkNWX0RJU0FCTEUJCTEwCisjZGVmaW5lIE9QMF9TVE9QX1JDVgkJMTEKKy8qIFN0YXR1cyBwb2ludGVyIGNvbnRyb2wgb3BlcmF0aW9ucyAqLworI2RlZmluZSBPUDBfRklYX1BUUgkJMTUJLyogQ0hOTCA9IDEgKi8KKyNkZWZpbmUgT1AwX1JMU19QVFIJCTE1CS8qIENITkwgPSAwICovCisjZGVmaW5lIE9QMF9SRVNFVAkJMTQKKworI2RlZmluZSBDUjBfQ0hOTAkJKDEgPDwgNCkJLyogMD1DaGFubmVsIDAsIDE9Q2hhbm5lbCAxICovCisjZGVmaW5lIENSMF9TVEFUVVNfMAkJMHgwMAorI2RlZmluZSBDUjBfU1RBVFVTXzEJCTB4MjAKKyNkZWZpbmUgQ1IwX1NUQVRVU18yCQkweDQwCisjZGVmaW5lIENSMF9TVEFUVVNfMwkJMHg2MAorI2RlZmluZSBDUjBfSU5UX0FDSwkJKDEgPDwgNykJLyogMD1ObyBhY2ssIDE9YWNrbm93bGVkZ2UgKi8KKworLyogUG9ydCAwIFN0YXR1cyBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIFNSMF9OT19SRVNVTFQJCTAJCS8qIGR1bW15ICovCisjZGVmaW5lIFNSMF9FVkVOVF9NQVNLCQkweDBmCisjZGVmaW5lIFNSMF9JQV9TRVRVUF9ET05FCTEKKyNkZWZpbmUgU1IwX0NPTkZJR1VSRV9ET05FCTIKKyNkZWZpbmUgU1IwX01DX1NFVFVQX0RPTkUJMworI2RlZmluZSBTUjBfVFJBTlNNSVRfRE9ORQk0CisjZGVmaW5lIFNSMF9URFJfRE9ORQkJNQorI2RlZmluZSBTUjBfRFVNUF9ET05FCQk2CisjZGVmaW5lIFNSMF9ESUFHTk9TRV9QQVNTRUQJNworI2RlZmluZSBTUjBfVFJBTlNNSVRfTk9fQ1JDX0RPTkUgOQorI2RlZmluZSBTUjBfUkVUUkFOU01JVF9ET05FCTEyCisjZGVmaW5lIFNSMF9FWEVDVVRJT05fQUJPUlRFRAkxMworI2RlZmluZSBTUjBfRU5EX09GX0ZSQU1FCTgKKyNkZWZpbmUgU1IwX1JFQ0VQVElPTl9BQk9SVEVECTEwCisjZGVmaW5lIFNSMF9ESUFHTk9TRV9GQUlMRUQJMTUKKyNkZWZpbmUgU1IwX1NUT1BfUkVHX0hJVAkxMQorCisjZGVmaW5lIFNSMF9DSE5MCQkoMSA8PCA0KQorI2RlZmluZSBTUjBfRVhFQ1VUSU9OCQkoMSA8PCA1KQorI2RlZmluZSBTUjBfUkVDRVBUSU9OCQkoMSA8PCA2KQorI2RlZmluZSBTUjBfSU5URVJSVVBUCQkoMSA8PCA3KQorI2RlZmluZSBTUjBfQk9USF9SWF9UWAkJKFNSMF9FWEVDVVRJT04gfCBTUjBfUkVDRVBUSU9OKQorCisjZGVmaW5lIFNSM19FWEVDX1NUQVRFX01BU0sJMHgwMworI2RlZmluZSBTUjNfRVhFQ19JRExFCQkwCisjZGVmaW5lIFNSM19UWF9BQk9SVF9JTl9QUk9HUkVTUyAxCisjZGVmaW5lIFNSM19FWEVDX0FDVElWRQkJMgorI2RlZmluZSBTUjNfQUJPUlRfSU5fUFJPR1JFU1MJMworI2RlZmluZSBTUjNfRVhFQ19DSE5MCQkoMSA8PCAyKQorI2RlZmluZSBTUjNfU1RQX09OX05PX1JTUkMJKDEgPDwgMykKKyNkZWZpbmUgU1IzX1JDVklOR19OT19SU1JDCSgxIDw8IDQpCisjZGVmaW5lIFNSM19SQ1ZfU1RBVEVfTUFTSwkweDYwCisjZGVmaW5lIFNSM19SQ1ZfSURMRQkJMHgwMAorI2RlZmluZSBTUjNfUkNWX1JFQURZCQkweDIwCisjZGVmaW5lIFNSM19SQ1ZfQUNUSVZFCQkweDQwCisjZGVmaW5lIFNSM19SQ1ZfU1RPUF9JTl9QUk9HCTB4NjAKKyNkZWZpbmUgU1IzX1JDVl9DSE5MCQkoMSA8PCA3KQorCisvKiBQb3J0IDEgQ29tbWFuZCBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIE9QMV9OT1AJCQkwCisjZGVmaW5lIE9QMV9TV0lUX1RPX1BPUlRfMAkxCisjZGVmaW5lIE9QMV9JTlRfRElTQUJMRQkJMgorI2RlZmluZSBPUDFfSU5UX0VOQUJMRQkJMworI2RlZmluZSBPUDFfU0VUX1RTCQk1CisjZGVmaW5lIE9QMV9SU1RfVFMJCTcKKyNkZWZpbmUgT1AxX1BPV0VSX0RPV04JCTgKKyNkZWZpbmUgT1AxX1JFU0VUX1JJTkdfTU5HTVQJMTEKKyNkZWZpbmUgT1AxX1JFU0VUCQkxNAorI2RlZmluZSBPUDFfU0VMX1JTVAkJMTUKKworI2RlZmluZSBDUjFfU1RBVFVTXzQJCTB4MDAKKyNkZWZpbmUgQ1IxX1NUQVRVU181CQkweDIwCisjZGVmaW5lIENSMV9TVEFUVVNfNgkJMHg0MAorI2RlZmluZSBDUjFfU1RPUF9SRUdfVVBEQVRFCSgxIDw8IDcpCisKKy8qIFJlY2VpdmUgZnJhbWUgc3RhdHVzIGJpdHMgKi8KKworI2RlZmluZQlSWF9SQ0xECQkJKDEgPDwgMCkKKyNkZWZpbmUgUlhfSUFfTUFUQ0gJCSgxIDw8IDEpCisjZGVmaW5lCVJYX05PX0FEX01BVENICQkoMSA8PCAyKQorI2RlZmluZSBSWF9OT19TRkQJCSgxIDw8IDMpCisjZGVmaW5lIFJYX1NSVF9GUk0JCSgxIDw8IDcpCisjZGVmaW5lIFJYX09WUlJVTgkJKDEgPDwgOCkKKyNkZWZpbmUgUlhfQUxHX0VSUgkJKDEgPDwgMTApCisjZGVmaW5lIFJYX0NSQ19FUlIJCSgxIDw8IDExKQorI2RlZmluZSBSWF9MRU5fRVJSCQkoMSA8PCAxMikKKyNkZWZpbmUgUlhfUkNWX09LCQkoMSA8PCAxMykKKyNkZWZpbmUgUlhfVFlQX0xFTgkJKDEgPDwgMTUpCisKKy8qIFRyYW5zbWl0IHN0YXR1cyBiaXRzICovCisKKyNkZWZpbmUgVFhfTkNPTF9NQVNLCQkweDBmCisjZGVmaW5lIFRYX0ZSVEwJCQkoMSA8PCA0KQorI2RlZmluZSBUWF9NQVhfQ09MCQkoMSA8PCA1KQorI2RlZmluZSBUWF9IUlRfQkVBVAkJKDEgPDwgNikKKyNkZWZpbmUgVFhfREVGRVIJCSgxIDw8IDcpCisjZGVmaW5lIFRYX1VORF9SVU4JCSgxIDw8IDgpCisjZGVmaW5lIFRYX0xPU1RfQ1RTCQkoMSA8PCA5KQorI2RlZmluZSBUWF9MT1NUX0NSUwkJKDEgPDwgMTApCisjZGVmaW5lIFRYX0xUQ09MCQkoMSA8PCAxMSkKKyNkZWZpbmUgVFhfT0sJCQkoMSA8PCAxMykKKyNkZWZpbmUgVFhfQ09MTAkJCSgxIDw8IDE1KQorCitzdHJ1Y3QgaTgyNTkzX2NvbmZfYmxvY2sgeworICB1X2NoYXIgZmlmb19saW1pdCA6IDQsCisgIAkgZm9yZ25lc2kgICA6IDEsCisgIAkgZmlmb18zMiAgICA6IDEsCisgIAkgZDZtb2QgICAgICA6IDEsCisgIAkgdGhyb3R0bGVfZW5iIDogMTsKKyAgdV9jaGFyIHRocm90dGxlICAgOiA2LAorCSBjbnRyeGludCAgIDogMSwKKwkgY29udGluCSAgICA6IDE7CisgIHVfY2hhciBhZGRyX2xlbiAgIDogMywKKyAgCSBhY2xvYyAJICAgIDogMSwKKyAJIHByZWFtYl9sZW4gOiAyLAorICAJIGxvb3BiYWNrICAgOiAyOworICB1X2NoYXIgbGluX3ByaW8gICA6IDMsCisJIHRib2ZzdG9wICAgOiAxLAorCSBleHBfcHJpbyAgIDogMywKKwkgYm9mX21ldCAgICA6IDE7CisgIHVfY2hhcgkgICAgOiA0LAorCSBpZnJtX3NwYyAgIDogNDsKKyAgdV9jaGFyCSAgICA6IDUsCisJIHNsb3R0aW1fbG93IDogMzsKKyAgdV9jaGFyIHNsb3R0aW1faGkgOiAzLAorCQkgICAgOiAxLAorCSBtYXhfcmV0ciAgIDogNDsKKyAgdV9jaGFyIHBybWlzYyAgICAgOiAxLAorCSBiY19kaXMgICAgIDogMSwKKyAgCQkgICAgOiAxLAorCSBjcnNfMQkgICAgOiAxLAorCSBub2NyY19pbnMgIDogMSwKKwkgY3JjXzE2MzIgICA6IDEsCisgIAkgCSAgICA6IDEsCisgIAkgY3JzX2NkdCAgICA6IDE7CisgIHVfY2hhciBjc19maWx0ZXIgIDogMywKKwkgY3JzX3NyYyAgICA6IDEsCisJIGNkX2ZpbHRlciAgOiAzLAorCQkgICAgOiAxOworICB1X2NoYXIJICAgIDogMiwKKyAgCSBtaW5fZnJfbGVuIDogNjsKKyAgdV9jaGFyIGxuZ190eXAgICAgOiAxLAorCSBsbmdfZmxkICAgIDogMSwKKwkgcnhjcmNfeGYgICA6IDEsCisJIGFydHgJICAgIDogMSwKKwkgc2FyZWMJICAgIDogMSwKKwkgdHhfamFiYmVyICA6IDEsCS8qIHdoeSBpcyB0aGlzIGNhbGxlZCBtYXhfbGVuIGluIHRoZSBtYW51YWw/ICovCisJIGhhc2hfMQkgICAgOiAxLAorICAJIGxicGtwb2wgICAgOiAxOworICB1X2NoYXIJICAgIDogNiwKKyAgCSBmZHgJICAgIDogMSwKKyAgCSAgCSAgICA6IDE7CisgIHVfY2hhciBkdW1teV82ICAgIDogNiwJLyogc3VwcG9zZWQgdG8gYmUgb25lcyAqLworICAJIG11bHRfaWEgICAgOiAxLAorICAJIGRpc19ib2YgICAgOiAxOworICB1X2NoYXIgZHVtbXlfMSAgICA6IDEsCS8qIHN1cHBvc2VkIHRvIGJlIG9uZSAqLworCSB0eF9pZnNfcmV0cmlnIDogMiwKKwkgbWNfYWxsICAgICA6IDEsCisJIHJjdl9tb24gICAgOiAyLAorCSBmcmFnX2FjcHQgIDogMSwKKyAgCSB0c3RydHRycyAgIDogMTsKKyAgdV9jaGFyIGZyZXR4CSAgICA6IDEsCisJIHJ1bnRfZW9wICAgOiAxLAorCSBod19zd19waW4gIDogMSwKKwkgYmlnX2VuZG4gICA6IDEsCisJIHN5bmNycXMgICAgOiAxLAorCSBzdHRsZW4gICAgIDogMSwKKwkgdHhfZW9wICAgICA6IDEsCisgIAkgcnhfZW9wCSAgICA6IDE7CisgIHVfY2hhciByYnVmX3NpemUgIDogNSwKKwkgcmN2c3RvcCAgICA6IDEsCisgIAkgCSAgICA6IDI7Cit9OworCisjZGVmaW5lIEk4MjU5M19NQVhfTVVMVElDQVNUX0FERFJFU1NFUwkxMjgJLyogSGFyZHdhcmUgaGFzaGVkIGZpbHRlciAqLworCisjZW5kaWYgLyogX0k4MjU5M19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pZWVlODAyXzExLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pZWVlODAyXzExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNkZDUyNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2llZWU4MDJfMTEuaApAQCAtMCwwICsxLDc4IEBACisjaWZuZGVmIF9JRUVFODAyXzExX0gKKyNkZWZpbmUgX0lFRUU4MDJfMTFfSAorCisjZGVmaW5lIElFRUU4MDJfMTFfREFUQV9MRU4JCTIzMDQKKy8qIE1heGltdW0gc2l6ZSBmb3IgdGhlIE1BLVVOSVREQVRBIHByaW1pdGl2ZSwgODAyLjExIHN0YW5kYXJkIHNlY3Rpb24KKyAgIDYuMi4xLjEuMi4KKworICAgVGhlIGZpZ3VyZSBpbiBzZWN0aW9uIDcuMS4yIHN1Z2dlc3RzIGEgYm9keSBzaXplIG9mIHVwIHRvIDIzMTIKKyAgIGJ5dGVzIGlzIGFsbG93ZWQsIHdoaWNoIGlzIGEgYml0IGNvbmZ1c2luZywgSSBzdXNwZWN0IHRoaXMKKyAgIHJlcHJlc2VudHMgdGhlIDIzMDQgYnl0ZXMgb2YgcmVhbCBkYXRhLCBwbHVzIGEgcG9zc2libGUgOCBieXRlcyBvZgorICAgV0VQIElWIGFuZCBJQ1YuICh0aGlzIGludGVycHJldGF0aW9uIHN1Z2dlc3RlZCBieSBSYW1pcm8gQmFycmVpcm8pICovCisKKworI2RlZmluZSBJRUVFODAyXzExX0hMRU4JCQkzMAorI2RlZmluZSBJRUVFODAyXzExX0ZSQU1FX0xFTgkJKElFRUU4MDJfMTFfREFUQV9MRU4gKyBJRUVFODAyXzExX0hMRU4pCisKK3N0cnVjdCBpZWVlODAyXzExX2hkciB7CisJdTE2IGZyYW1lX2N0bDsKKwl1MTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJdTE2IHNlcV9jdGw7CisJdTggYWRkcjRbRVRIX0FMRU5dOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEZyYW1lIGNvbnRyb2wgZmllbGQgY29uc3RhbnRzICovCisjZGVmaW5lIElFRUU4MDJfMTFfRkNUTF9WRVJTCQkweDAwMDIKKyNkZWZpbmUgSUVFRTgwMl8xMV9GQ1RMX0ZUWVBFCQkweDAwMGMKKyNkZWZpbmUgSUVFRTgwMl8xMV9GQ1RMX1NUWVBFCQkweDAwZjAKKyNkZWZpbmUgSUVFRTgwMl8xMV9GQ1RMX1RPRFMJCTB4MDEwMAorI2RlZmluZSBJRUVFODAyXzExX0ZDVExfRlJPTURTCQkweDAyMDAKKyNkZWZpbmUgSUVFRTgwMl8xMV9GQ1RMX01PUkVGUkFHUwkweDA0MDAKKyNkZWZpbmUgSUVFRTgwMl8xMV9GQ1RMX1JFVFJZCQkweDA4MDAKKyNkZWZpbmUgSUVFRTgwMl8xMV9GQ1RMX1BNCQkweDEwMDAKKyNkZWZpbmUgSUVFRTgwMl8xMV9GQ1RMX01PUkVEQVRBCTB4MjAwMAorI2RlZmluZSBJRUVFODAyXzExX0ZDVExfV0VQCQkweDQwMDAKKyNkZWZpbmUgSUVFRTgwMl8xMV9GQ1RMX09SREVSCQkweDgwMDAKKworI2RlZmluZSBJRUVFODAyXzExX0ZUWVBFX01HTVQJCTB4MDAwMAorI2RlZmluZSBJRUVFODAyXzExX0ZUWVBFX0NUTAkJMHgwMDA0CisjZGVmaW5lIElFRUU4MDJfMTFfRlRZUEVfREFUQQkJMHgwMDA4CisKKy8qIG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9BU1NPQ19SRVEJMHgwMDAwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfQVNTT0NfUkVTUCAJMHgwMDEwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfUkVBU1NPQ19SRVEJMHgwMDIwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfUkVBU1NPQ19SRVNQCTB4MDAzMAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX1BST0JFX1JFUQkweDAwNDAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9QUk9CRV9SRVNQCTB4MDA1MAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0JFQUNPTgkJMHgwMDgwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfQVRJTQkJMHgwMDkwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfRElTQVNTT0MJMHgwMEEwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfQVVUSAkJMHgwMEIwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfREVBVVRICQkweDAwQzAKKworLyogY29udHJvbCAqLworI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX1BTUE9MTAkJMHgwMEEwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfUlRTCQkweDAwQjAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9DVFMJCTB4MDBDMAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0FDSwkJMHgwMEQwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfQ0ZFTkQJCTB4MDBFMAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0NGRU5EQUNLCTB4MDBGMAorCisvKiBkYXRhICovCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfREFUQQkJMHgwMDAwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfREFUQV9DRkFDSwkweDAwMTAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9EQVRBX0NGUE9MTAkweDAwMjAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9EQVRBX0NGQUNLUE9MTAkweDAwMzAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9OVUxMRlVOQwkweDAwNDAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9DRkFDSwkJMHgwMDUwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfQ0ZQT0xMCQkweDAwNjAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9DRkFDS1BPTEwJMHgwMDcwCisKKyNkZWZpbmUgSUVFRTgwMl8xMV9TQ1RMX0ZSQUcJCTB4MDAwRgorI2RlZmluZSBJRUVFODAyXzExX1NDVExfU0VRCQkweEZGRjAKKworI2VuZGlmIC8qIF9JRUVFODAyXzExX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL25ldHdhdmVfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL25ldHdhdmVfY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODIyNDFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbmV0d2F2ZV9jcy5jCkBAIC0wLDAgKzEsMTczNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBuZXR3YXZlX2NzLmMKKyAqIFZlcnNpb246ICAgICAgIDAuNC4xCisgKiBEZXNjcmlwdGlvbjogICBOZXR3YXZlIEFpclN1cmZlciBXaXJlbGVzcyBMQU4gUEMgQ2FyZCBkcml2ZXIKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcnM6ICAgICAgIEpvaG4gTWFya3VzIEJq+HJuZGFsZW4gPGpvaG5tQGNzLnVpdC5ubz4KKyAqICAgICAgICAgICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqICAgICAgICAgICAgICAgIERhdmlkIEhpbmRzIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqIENyZWF0ZWQgYXQ6ICAgIEEgbG9uZyB0aW1lIGFnbyEKKyAqIE1vZGlmaWVkIGF0OiAgIE1vbiBOb3YgMTAgMTE6NTQ6MzcgMTk5NworICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk3IFVuaXZlcnNpdHkgb2YgVHJvbXP4LCBOb3J3YXkKKyAqCisgKiBSZXZpc2lvbiBIaXN0b3J5OgorICoKKyAqICAgMDgtTm92LTk3IDE1OjE0OjQ3ICAgSm9obiBNYXJrdXMgQmr4cm5kYWxlbiA8am9obm1AY3MudWl0Lm5vPgorICogICAgLSBGaXhlZCBzb21lIGJ1Z3MgaW4gbmV0d2F2ZV9yeCBhbmQgY2xlYW5lZCBpdCB1cCBhIGJpdC4gCisgKiAgICAgIChPbmUgb2YgdGhlIGJ1Z3Mgd291bGQgaGF2ZSBkZXN0cm95ZWQgcGFja2V0cyB3aGVuIHJlY2VpdmluZworICogICAgICBtdWx0aXBsZSBwYWNrZXRzIHBlciBpbnRlcnJ1cHQpLiAKKyAqICAgIC0gQ2xlYW5lZCB1cCBwYXJ0cyBvZiBuZXdhdmVfaHdfeG1pdC4gCisgKiAgICAtIEEgZmV3IGdlbmVyYWwgY2xlYW51cHMuIAorICogICAyNC1PY3QtOTcgMTM6MTc6MzYgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAgICAtIEZpeGVkIG5ldHdhdmVfcnggcmVjZWl2ZSBmdW5jdGlvbiAoZ290IHVwZGF0ZWQgZG9jcykKKyAqICAgT3RoZXJzOgorICogICAgLSBDaGFuZ2VkIG5hbWUgZnJvbSB4aXJjbncgdG8gbmV0d2F2ZSwgdGFrZSBhIGxvb2sgYXQgCisgKiAgICAgIGh0dHA6Ly93d3cubmV0d2F2ZS13aXJlbGVzcy5jb20KKyAqICAgIC0gU29tZSByZW9yZ2FuaXppbmcgb2YgdGhlIGNvZGUKKyAqICAgIC0gUmVtb3ZlZCBwb3NzaWJsZSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIGludGVycnVwdCBoYW5kbGVyIGFuZCB0cmFuc21pdAorICogICAgICBmdW5jdGlvbgorICogICAgLSBTdGFydGVkIHRvIGFkZCB3aXJlbGVzcyBleHRlbnNpb25zLCBidXQgc3RpbGwgbmVlZHMgc29tZSBjb2RpbmcKKyAqICAgIC0gQWRkZWQgd2F0Y2hkb2cgZm9yIGJldHRlciBoYW5kbGluZyBvZiB0cmFuc21pc3Npb24gdGltZW91dHMgCisgKiAgICAgIChob3BlZnVsbHkgdGhpcyB3b3JrcyBiZXR0ZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRvIGhhdmUgc3RhdGlzdGljcyAoanVzdCBwYWNrZXRzIHNlbnQpIGRlZmluZSB0aGlzICovCisjdW5kZWYgTkVUV0FWRV9TVEFUUworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpZmRlZiBDT05GSUdfTkVUX1JBRElPCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpZiBXSVJFTEVTU19FWFQgPiAxMgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjZW5kaWYJLyogV0lSRUxFU1NfRVhUID4gMTIgKi8KKyNlbmRpZgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9tZW1fb3AuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNkZWZpbmUgTkVUV0FWRV9SRUdPRkYgICAgICAgICAweDgwMDAKKy8qIFRoZSBOZXR3YXZlIElPIHJlZ2lzdGVycywgb2Zmc2V0cyB0byBpb2Jhc2UgKi8KKyNkZWZpbmUgTkVUV0FWRV9SRUdfQ09SICAgICAgICAweDAKKyNkZWZpbmUgTkVUV0FWRV9SRUdfQ0NTUiAgICAgICAweDIKKyNkZWZpbmUgTkVUV0FWRV9SRUdfQVNSICAgICAgICAweDQKKyNkZWZpbmUgTkVUV0FWRV9SRUdfSU1SICAgICAgICAweGEKKyNkZWZpbmUgTkVUV0FWRV9SRUdfUE1SICAgICAgICAweGMKKyNkZWZpbmUgTkVUV0FWRV9SRUdfSU9MT1cgICAgICAweDYKKyNkZWZpbmUgTkVUV0FWRV9SRUdfSU9ISSAgICAgICAweDcKKyNkZWZpbmUgTkVUV0FWRV9SRUdfSU9DT05UUk9MICAweDgKKyNkZWZpbmUgTkVUV0FWRV9SRUdfREFUQSAgICAgICAweGYKKy8qIFRoZSBOZXR3YXZlIEV4dGVuZGVkIElPIHJlZ2lzdGVycywgb2Zmc2V0cyB0byBSYW1CYXNlICovCisjZGVmaW5lIE5FVFdBVkVfRVJFR19BU0NDICAgICAgMHgxMTQKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX1JTRVIgICAgICAweDEyMAorI2RlZmluZSBORVRXQVZFX0VSRUdfUlNFUlcgICAgIDB4MTI0CisjZGVmaW5lIE5FVFdBVkVfRVJFR19UU0VSICAgICAgMHgxMzAKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX1RTRVJXICAgICAweDEzNAorI2RlZmluZSBORVRXQVZFX0VSRUdfQ0IgICAgICAgIDB4MTAwCisjZGVmaW5lIE5FVFdBVkVfRVJFR19TUENRICAgICAgMHgxNTQKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX1NQVSAgICAgICAweDE1NQorI2RlZmluZSBORVRXQVZFX0VSRUdfTElGICAgICAgIDB4MTRlCisjZGVmaW5lIE5FVFdBVkVfRVJFR19JU1BMUSAgICAgMHgxNTYKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX0hIQyAgICAgICAweDE1OAorI2RlZmluZSBORVRXQVZFX0VSRUdfTkkgICAgICAgIDB4MTZlCisjZGVmaW5lIE5FVFdBVkVfRVJFR19NSFMgICAgICAgMHgxNmIKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX1REUCAgICAgICAweDE0MAorI2RlZmluZSBORVRXQVZFX0VSRUdfUkRQICAgICAgIDB4MTUwCisjZGVmaW5lIE5FVFdBVkVfRVJFR19QQSAgICAgICAgMHgxNjAKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX0VDICAgICAgICAweDE4MAorI2RlZmluZSBORVRXQVZFX0VSRUdfQ1JCUCAgICAgIDB4MTdhCisjZGVmaW5lIE5FVFdBVkVfRVJFR19BUlcgICAgICAgMHgxNjYKKworLyoKKyAqIENvbW1hbmRzIHVzZWQgaW4gdGhlIGV4dGVuZGVkIGNvbW1hbmQgYnVmZmVyCisgKiBORVRXQVZFX0VSRUdfQ0IgKDB4MTAwLTB4MTBGKSAKKyAqLworI2RlZmluZSBORVRXQVZFX0NNRF9OT1AgICAgICAgIDB4MDAKKyNkZWZpbmUgTkVUV0FWRV9DTURfU1JDICAgICAgICAweDAxCisjZGVmaW5lIE5FVFdBVkVfQ01EX1NUQyAgICAgICAgMHgwMgorI2RlZmluZSBORVRXQVZFX0NNRF9BTUEgICAgICAgIDB4MDMKKyNkZWZpbmUgTkVUV0FWRV9DTURfRE1BICAgICAgICAweDA0CisjZGVmaW5lIE5FVFdBVkVfQ01EX1NBTUEgICAgICAgMHgwNQorI2RlZmluZSBORVRXQVZFX0NNRF9FUiAgICAgICAgIDB4MDYKKyNkZWZpbmUgTkVUV0FWRV9DTURfRFIgICAgICAgICAweDA3CisjZGVmaW5lIE5FVFdBVkVfQ01EX1RMICAgICAgICAgMHgwOAorI2RlZmluZSBORVRXQVZFX0NNRF9TUlAgICAgICAgIDB4MDkKKyNkZWZpbmUgTkVUV0FWRV9DTURfU1NLICAgICAgICAweDBhCisjZGVmaW5lIE5FVFdBVkVfQ01EX1NNRCAgICAgICAgMHgwYgorI2RlZmluZSBORVRXQVZFX0NNRF9TQVBEICAgICAgIDB4MGMKKyNkZWZpbmUgTkVUV0FWRV9DTURfU1NTICAgICAgICAweDExCisvKiBFbmQgb2YgQ29tbWFuZCBtYXJrZXIgKi8KKyNkZWZpbmUgTkVUV0FWRV9DTURfRU9DICAgICAgICAweDAwCisKKy8qIEFTUiByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIE5FVFdBVkVfQVNSX1JYUkRZICAgMHg4MAorI2RlZmluZSBORVRXQVZFX0FTUl9UWEJBICAgIDB4MDEKKworI2RlZmluZSBUWF9USU1FT1VUCQkoKDMyKkhaKS8xMDApCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaW1yQ29uZlJGVTEgPSAweDEwOyAvKiBSRlUgaW50ZXJydXB0IG1hc2ssIGtlZXAgaGlnaCAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpbXJDb25mSUVOQSA9IDB4MDI7IC8qIEludGVycnVwdCBlbmFibGUgKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjb3JDb25mSUVOQSAgID0gMHgwMTsgLyogSW50ZXJydXB0IGVuYWJsZSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjb3JDb25mTFZMUkVRID0gMHg0MDsgLyogS2VlcCBoaWdoICovCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcnhDb25mUnhFbmEgID0gMHg4MDsgLyogUmVjZWl2ZSBFbmFibGUgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcnhDb25mTUFDICAgID0gMHgyMDsgLyogTUFDIGhvc3QgcmVjZWl2ZSBtb2RlKi8gCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJ4Q29uZlBybyAgICA9IDB4MTA7IC8qIFByb21pc2N1b3VzICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJ4Q29uZkFNUCAgICA9IDB4MDg7IC8qIEFjY2VwdCBNdWx0aWNhc3QgUGFja2V0cyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByeENvbmZCY2FzdCAgPSAweDA0OyAvKiBBY2NlcHQgQnJvYWRjYXN0IFBhY2tldHMgKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0eENvbmZUeEVuYSAgPSAweDgwOyAvKiBUcmFuc21pdCBFbmFibGUgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdHhDb25mTUFDICAgID0gMHgyMDsgLyogSG9zdCBzZW5kcyBNQUMgbW9kZSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0eENvbmZFVUQgICAgPSAweDEwOyAvKiBFbmFibGUgVW5pLURhdGEgcGFja2V0cyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0eENvbmZLZXkgICAgPSAweDAyOyAvKiBTY3JhbWJsZSBkYXRhIHBhY2tldHMgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdHhDb25mTG9vcCAgID0gMHgwMTsgLyogTG9vcGJhY2sgbW9kZSAqLworCisvKgorICAgQWxsIHRoZSBQQ01DSUEgbW9kdWxlcyB1c2UgUENNQ0lBX0RFQlVHIHRvIGNvbnRyb2wgZGVidWdnaW5nLiAgSWYKKyAgIHlvdSBkbyBub3QgZGVmaW5lIFBDTUNJQV9ERUJVRyBhdCBhbGwsIGFsbCB0aGUgZGVidWcgY29kZSB3aWxsIGJlCisgICBsZWZ0IG91dC4gIElmIHlvdSBjb21waWxlIHdpdGggUENNQ0lBX0RFQlVHPTAsIHRoZSBkZWJ1ZyBjb2RlIHdpbGwKKyAgIGJlIHByZXNlbnQgYnV0IGRpc2FibGVkIC0tIGJ1dCBpdCBjYW4gdGhlbiBiZSBlbmFibGVkIGZvciBzcGVjaWZpYworICAgbW9kdWxlcyBhdCBsb2FkIHRpbWUgd2l0aCBhICdwY19kZWJ1Zz0jJyBvcHRpb24gdG8gaW5zbW9kLgorKi8KKworI2lmZGVmIFBDTUNJQV9ERUJVRworc3RhdGljIGludCBwY19kZWJ1ZyA9IFBDTUNJQV9ERUJVRzsKK21vZHVsZV9wYXJhbShwY19kZWJ1ZywgaW50LCAwKTsKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgaWYgKHBjX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncykKK3N0YXRpYyBjaGFyICp2ZXJzaW9uID0KKyJuZXR3YXZlX2NzLmMgMC4zLjAgVGh1IEp1bCAxNyAxNDozNjowMiAxOTk3IChKb2huIE1hcmt1cyBCavhybmRhbGVuKVxuIjsKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCisjZW5kaWYKKworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAibmV0d2F2ZV9jcyI7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCB3aXRoICdpbnNtb2QnICovCisKKy8qIENob29zZSB0aGUgZG9tYWluLCBkZWZhdWx0IGlzIDB4MTAwICovCitzdGF0aWMgdV9pbnQgIGRvbWFpbiA9IDB4MTAwOworCisvKiBTY3JhbWJsZSBrZXksIHJhbmdlIGZyb20gMHgwIHRvIDB4ZmZmZi4gIAorICogMHgwIGlzIG5vIHNjcmFtYmxpbmcuIAorICovCitzdGF0aWMgdV9pbnQgIHNjcmFtYmxlX2tleSA9IDB4MDsKKworLyogU2hhcmVkIG1lbW9yeSBzcGVlZCwgaW4gbnMuIFRoZSBkb2N1bWVudGF0aW9uIHN0YXRlcyB0aGF0IAorICogdGhlIGNhcmQgc2hvdWxkIG5vdCBiZSByZWFkIGZhc3RlciB0aGFuIGV2ZXJ5IDQwMG5zLiAKKyAqIFRoaXMgdGltaW5nIHNob3VsZCBiZSBwcm92aWRlZCBieSB0aGUgSEJBLiBJZiBpdCBiZWNvbWVzIGEgCisgKiBwcm9ibGVtLCB0cnkgc2V0dGluZyBtZW1fc3BlZWQgdG8gNDAwLiAKKyAqLworc3RhdGljIGludCBtZW1fc3BlZWQ7CisKK21vZHVsZV9wYXJhbShkb21haW4sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oc2NyYW1ibGVfa2V5LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1lbV9zcGVlZCwgaW50LCAwKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIFBDTUNJQSAoQ2FyZCBTZXJ2aWNlcykgcmVsYXRlZCBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIG5ldHdhdmVfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKTsgICAgIC8qIENhcmQgcmVtb3ZhbCAqLworc3RhdGljIGludCAgbmV0d2F2ZV9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksIAorCQkJCQkgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpOworc3RhdGljIHZvaWQgbmV0d2F2ZV9wY21jaWFfY29uZmlnKGRldl9saW5rX3QgKmFyZyk7IC8qIFJ1bnMgYWZ0ZXIgY2FyZCAKKwkJCQkJCQkJCQkJCQkgICBpbnNlcnRpb24gKi8KK3N0YXRpYyBkZXZfbGlua190ICpuZXR3YXZlX2F0dGFjaCh2b2lkKTsgICAgIC8qIENyZWF0ZSBpbnN0YW5jZSAqLworc3RhdGljIHZvaWQgbmV0d2F2ZV9kZXRhY2goZGV2X2xpbmtfdCAqKTsgICAgLyogRGVzdHJveSBpbnN0YW5jZSAqLworCisvKiBIYXJkd2FyZSBjb25maWd1cmF0aW9uICovCitzdGF0aWMgdm9pZCBuZXR3YXZlX2RvcmVzZXQoa2lvX2FkZHJfdCBpb2Jhc2UsIHVfY2hhciBfX2lvbWVtICpyYW1CYXNlKTsKK3N0YXRpYyB2b2lkIG5ldHdhdmVfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIE1pc2MgZGV2aWNlIHN0dWZmICovCitzdGF0aWMgaW50IG5ldHdhdmVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsgIC8qIE9wZW4gdGhlIGRldmljZSAqLworc3RhdGljIGludCBuZXR3YXZlX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOyAvKiBDbG9zZSB0aGUgZGV2aWNlICovCisKKy8qIFBhY2tldCB0cmFuc21pc3Npb24gYW5kIFBhY2tldCByZWNlcHRpb24gKi8KK3N0YXRpYyBpbnQgbmV0d2F2ZV9zdGFydF94bWl0KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbmV0d2F2ZV9yeCggc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIEludGVycnVwdCByb3V0aW5lcyAqLworc3RhdGljIGlycXJldHVybl90IG5ldHdhdmVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgbmV0d2F2ZV93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKworLyogU3RhdGlzdGljcyAqLworc3RhdGljIHZvaWQgdXBkYXRlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXR3YXZlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogV2lyZWxlc3MgZXh0ZW5zaW9ucyAqLworI2lmZGVmIFdJUkVMRVNTX0VYVAorc3RhdGljIHN0cnVjdCBpd19zdGF0aXN0aWNzKiBuZXR3YXZlX2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorc3RhdGljIGludCBuZXR3YXZlX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBpZnJlcSAqLCBpbnQpOworCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qCisgICBBIGxpbmtlZCBsaXN0IG9mICJpbnN0YW5jZXMiIG9mIHRoZSBza2VsZXRvbiBkZXZpY2UuICBFYWNoIGFjdHVhbAorICAgUENNQ0lBIGNhcmQgY29ycmVzcG9uZHMgdG8gb25lIGRldmljZSBpbnN0YW5jZSwgYW5kIGlzIGRlc2NyaWJlZAorICAgYnkgb25lIGRldl9saW5rX3Qgc3RydWN0dXJlIChkZWZpbmVkIGluIGRzLmgpLgorCisgICBZb3UgbWF5IG5vdCB3YW50IHRvIHVzZSBhIGxpbmtlZCBsaXN0IGZvciB0aGlzIC0tIGZvciBleGFtcGxlLCB0aGUKKyAgIG1lbW9yeSBjYXJkIGRyaXZlciB1c2VzIGFuIGFycmF5IG9mIGRldl9saW5rX3QgcG9pbnRlcnMsIHdoZXJlIG1pbm9yCisgICBkZXZpY2UgbnVtYmVycyBhcmUgdXNlZCB0byBkZXJpdmUgdGhlIGNvcnJlc3BvbmRpbmcgYXJyYXkgaW5kZXguCisqLworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0OworCisvKgorICAgQSBkZXZfbGlua190IHN0cnVjdHVyZSBoYXMgZmllbGRzIGZvciBtb3N0IHRoaW5ncyB0aGF0IGFyZSBuZWVkZWQKKyAgIHRvIGtlZXAgdHJhY2sgb2YgYSBzb2NrZXQsIGJ1dCB0aGVyZSB3aWxsIHVzdWFsbHkgYmUgc29tZSBkZXZpY2UKKyAgIHNwZWNpZmljIGluZm9ybWF0aW9uIHRoYXQgYWxzbyBuZWVkcyB0byBiZSBrZXB0IHRyYWNrIG9mLiAgVGhlCisgICAncHJpdicgcG9pbnRlciBpbiBhIGRldl9saW5rX3Qgc3RydWN0dXJlIGNhbiBiZSB1c2VkIHRvIHBvaW50IHRvCisgICBhIGRldmljZS1zcGVjaWZpYyBwcml2YXRlIGRhdGEgc3RydWN0dXJlLCBsaWtlIHRoaXMuCisKKyAgIEEgZHJpdmVyIG5lZWRzIHRvIHByb3ZpZGUgYSBkZXZfbm9kZV90IHN0cnVjdHVyZSBmb3IgZWFjaCBkZXZpY2UKKyAgIG9uIGEgY2FyZC4gIEluIHNvbWUgY2FzZXMsIHRoZXJlIGlzIG9ubHkgb25lIGRldmljZSBwZXIgY2FyZCAoZm9yCisgICBleGFtcGxlLCBldGhlcm5ldCBjYXJkcywgbW9kZW1zKS4gIEluIG90aGVyIGNhc2VzLCB0aGVyZSBtYXkgYmUKKyAgIG1hbnkgYWN0dWFsIG9yIGxvZ2ljYWwgZGV2aWNlcyAoU0NTSSBhZGFwdGVycywgbWVtb3J5IGNhcmRzIHdpdGgKKyAgIG11bHRpcGxlIHBhcnRpdGlvbnMpLiAgVGhlIGRldl9ub2RlX3Qgc3RydWN0dXJlcyBuZWVkIHRvIGJlIGtlcHQKKyAgIGluIGEgbGlua2VkIGxpc3Qgc3RhcnRpbmcgYXQgdGhlICdkZXYnIGZpZWxkIG9mIGEgZGV2X2xpbmtfdAorICAgc3RydWN0dXJlLiAgV2UgYWxsb2NhdGUgdGhlbSBpbiB0aGUgY2FyZCdzIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUsCisgICBiZWNhdXNlIHRoZXkgZ2VuZXJhbGx5IGNhbid0IGJlIGFsbG9jYXRlZCBkeW5hbWljYWxseS4KKyovCisKKyNpZiBXSVJFTEVTU19FWFQgPD0gMTIKKy8qIFdpcmVsZXNzIGV4dGVuc2lvbnMgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworCisvKiBQYXJ0IG9mIGl3X2hhbmRsZXIgcHJvdG90eXBlIHdlIG5lZWQgKi8KK3N0cnVjdCBpd19yZXF1ZXN0X2luZm8KK3sKKwlfX3UxNgkJY21kOwkJLyogV2lyZWxlc3MgRXh0ZW5zaW9uIGNvbW1hbmQgKi8KKwlfX3UxNgkJZmxhZ3M7CQkvKiBNb3JlIHRvIGNvbWUgOy0pICovCit9OworCisvKiBXaXJlbGVzcyBFeHRlbnNpb24gQmFja3dhcmQgY29tcGF0aWJpbGl0eSAtIEplYW4gSUkKKyAqIElmIHRoZSBuZXcgd2lyZWxlc3MgZGV2aWNlIHByaXZhdGUgaW9jdGwgcmFuZ2UgaXMgbm90IGRlZmluZWQsCisgKiBkZWZhdWx0IHRvIHN0YW5kYXJkIGRldmljZSBwcml2YXRlIGlvY3RsIHJhbmdlICovCisjaWZuZGVmIFNJT0NJV0ZJUlNUUFJJVgorI2RlZmluZSBTSU9DSVdGSVJTVFBSSVYJU0lPQ0RFVlBSSVZBVEUKKyNlbmRpZiAvKiBTSU9DSVdGSVJTVFBSSVYgKi8KKworI2Vsc2UJLyogV0lSRUxFU1NfRVhUIDw9IDEyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmCW5ldHdhdmVfaGFuZGxlcl9kZWY7CisjZW5kaWYJLyogV0lSRUxFU1NfRVhUIDw9IDEyICovCisKKyNkZWZpbmUgU0lPQ0dJUFNOQVAJU0lPQ0lXRklSU1RQUklWCSsgMQkvKiBTaXRlIFN1cnZleSBTbmFwc2hvdCAqLworCisjZGVmaW5lIE1BWF9FU0EgMTAKKwordHlwZWRlZiBzdHJ1Y3QgbmV0X2FkZHIgeworICAgIHVfY2hhciBhZGRyNDhbNl07Cit9IG5ldF9hZGRyOworCitzdHJ1Y3Qgc2l0ZV9zdXJ2ZXkgeworICAgIHVfc2hvcnQgbGVuZ3RoOworICAgIHVfY2hhciAgc3RydWN0X3JldmlzaW9uOworICAgIHVfY2hhciAgcm9hbWluZ19zdGF0ZTsKKwkKKyAgICB1X2NoYXIgIHNwX2V4aXN0c0ZsYWc7CisgICAgdV9jaGFyICBzcF9saW5rX3F1YWxpdHk7CisgICAgdV9jaGFyICBzcF9tYXhfbGlua19xdWFsaXR5OworICAgIHVfY2hhciAgbGlua1F1YWxpdHlHb29kRmFpckJvdW5kYXJ5OworICAgIHVfY2hhciAgbGlua1F1YWxpdHlGYWlyUG9vckJvdW5kYXJ5OworICAgIHVfY2hhciAgc3BfdXRpbGl6YXRpb247CisgICAgdV9jaGFyICBzcF9nb29kbmVzczsKKyAgICB1X2NoYXIgIHNwX2hvdGhlYWRjb3VudDsKKyAgICB1X2NoYXIgIHJvYW1pbmdfY29uZGl0aW9uOworCQorICAgIG5ldF9hZGRyIHNwOworICAgIHVfY2hhciAgIG51bUFQczsKKyAgICBuZXRfYWRkciBuZWFyQnlBY2Nlc3NQb2ludHNbTUFYX0VTQV07Cit9OwkKKyAgIAordHlwZWRlZiBzdHJ1Y3QgbmV0d2F2ZV9wcml2YXRlIHsKKyAgICBkZXZfbGlua190IGxpbms7CisgICAgc3BpbmxvY2tfdAlzcGlubG9jazsJLyogU2VyaWFsaXplIGFjY2VzcyB0byB0aGUgaGFyZHdhcmUgKFNNUCkgKi8KKyAgICBkZXZfbm9kZV90IG5vZGU7CisgICAgdV9jaGFyICAgICBfX2lvbWVtICpyYW1CYXNlOworICAgIGludCAgICAgICAgdGltZW91dENvdW50ZXI7CisgICAgaW50ICAgICAgICBsYXN0RXhlYzsKKyAgICBzdHJ1Y3QgdGltZXJfbGlzdCAgICAgIHdhdGNoZG9nOwkvKiBUbyBhdm9pZCBibG9ja2luZyBzdGF0ZSAqLworICAgIHN0cnVjdCBzaXRlX3N1cnZleSAgICAgbnNzOworICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworI2lmZGVmIFdJUkVMRVNTX0VYVAorICAgIHN0cnVjdCBpd19zdGF0aXN0aWNzICAgaXdfc3RhdHM7ICAgIC8qIFdpcmVsZXNzIHN0YXRzICovCisjZW5kaWYKK30gbmV0d2F2ZV9wcml2YXRlOworCisjaWZkZWYgTkVUV0FWRV9TVEFUUworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXR3YXZlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorCisvKgorICogVGhlIE5ldHdhdmUgY2FyZCBpcyBsaXR0bGUtZW5kaWFuLCBzbyB3b24ndCB3b3JrIGZvciBiaWcgZW5kaWFuCisgKiBzeXN0ZW1zLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGdldF91aW50MTYodV9jaGFyIF9faW9tZW0gKnN0YWRkcikgCit7CisgICAgcmV0dXJuIHJlYWR3KHN0YWRkcik7IC8qIFJldHVybiBvbmx5IDE2IGJpdHMgKi8KK30KKworc3RhdGljIGlubGluZSBzaG9ydCBnZXRfaW50MTYodV9jaGFyIF9faW9tZW0gKiBzdGFkZHIpCit7CisgICAgcmV0dXJuIHJlYWR3KHN0YWRkcik7Cit9CisKKy8qIAorICogV2FpdCB1bnRpbCB0aGUgV09DIChXcml0ZSBPcGVyYXRpb24gQ29tcGxldGUpIGJpdCBpbiB0aGUgCisgKiBBU1IgKEFkYXB0ZXIgU3RhdHVzIFJlZ2lzdGVyKSBpcyBhc3NlcnRlZC4gCisgKiBUaGlzIHNob3VsZCBoYXZlIGFib3J0ZWQgaWYgaXQgdGFrZXMgdG9vIGxvbmcgdGltZS4gCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3YWl0X1dPQyh1bnNpZ25lZCBpbnQgaW9iYXNlKQoreworICAgIC8qIFNwaW4gbG9jayAqLworICAgIHdoaWxlICgoaW5iKGlvYmFzZSArIE5FVFdBVkVfUkVHX0FTUikgJiAweDgpICE9IDB4OCkgOyAKK30KKworI2lmZGVmIFdJUkVMRVNTX0VYVAorc3RhdGljIHZvaWQgbmV0d2F2ZV9zbmFwc2hvdChuZXR3YXZlX3ByaXZhdGUgKnByaXYsIHVfY2hhciBfX2lvbWVtICpyYW1CYXNlLCAKKwkJCSAgICAga2lvX2FkZHJfdCBpb2Jhc2UpIHsKKyAgICB1X3Nob3J0IHJlc3VsdEJ1ZmZlcjsKKworICAgIC8qIGlmIHRpbWUgc2luY2UgbGFzdCBzbmFwc2hvdCBpcyA+IDEgc2VjLiAoMTAwIGppZmZpZXM/KSAgdGhlbiB0YWtlIAorICAgICAqIG5ldyBzbmFwc2hvdCwgZWxzZSByZXR1cm4gY2FjaGVkIGRhdGEuIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIHJhdGUuICAKKyAgICAgKi8KKyAgICBpZiAoIGppZmZpZXMgLSBwcml2LT5sYXN0RXhlYyA+IDEwMCkgeyAKKwkvKiBUYWtlIHNpdGUgc3VydmV5ICBzbmFwc2hvdCAqLyAKKwkvKnByaW50ayggS0VSTl9ERUJVRyAiVGFraW5nIG5ldyBzbmFwc2hvdC4gJWxkXG4iLCBqaWZmaWVzIC0KKwkgIHByaXYtPmxhc3RFeGVjKTsgKi8KKwl3YWl0X1dPQyhpb2Jhc2UpOyAKKwl3cml0ZWIoTkVUV0FWRV9DTURfU1NTLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7IAorCXdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsgCisJd2FpdF9XT0MoaW9iYXNlKTsgCisKKwkvKiBHZXQgcmVzdWx0IGFuZCBjb3B5IHRvIGNhY2ggKi8gCisJcmVzdWx0QnVmZmVyID0gcmVhZHcocmFtQmFzZSArIE5FVFdBVkVfRVJFR19DUkJQKTsgCisJY29weV9mcm9tX3BjKCAmcHJpdi0+bnNzLCByYW1CYXNlK3Jlc3VsdEJ1ZmZlciwgCisJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc2l0ZV9zdXJ2ZXkpKTsgCisgICAgfSAKK30KKyNlbmRpZgorCisjaWZkZWYgV0lSRUxFU1NfRVhUCisvKgorICogRnVuY3Rpb24gbmV0d2F2ZV9nZXRfd2lyZWxlc3Nfc3RhdHMgKGRldikKKyAqCisgKiAgICBXaXJlbGVzcyBleHRlbnNpb25zIHN0YXRpc3RpY3MKKyAqCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqbmV0d2F2ZV9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sJCisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBraW9fYWRkcl90IGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9jaGFyIF9faW9tZW0gKnJhbUJhc2UgPSBwcml2LT5yYW1CYXNlOworICAgIHN0cnVjdCBpd19zdGF0aXN0aWNzKiB3c3RhdHM7CisJCisgICAgd3N0YXRzID0gJnByaXYtPml3X3N0YXRzOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CisJCisgICAgbmV0d2F2ZV9zbmFwc2hvdCggcHJpdiwgcmFtQmFzZSwgaW9iYXNlKTsKKworICAgIHdzdGF0cy0+c3RhdHVzID0gcHJpdi0+bnNzLnJvYW1pbmdfc3RhdGU7CisgICAgd3N0YXRzLT5xdWFsLnF1YWwgPSByZWFkYiggcmFtQmFzZSArIE5FVFdBVkVfRVJFR19TUENRKTsgCisgICAgd3N0YXRzLT5xdWFsLmxldmVsID0gcmVhZGIoIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfSVNQTFEpOworICAgIHdzdGF0cy0+cXVhbC5ub2lzZSA9IHJlYWRiKCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX1NQVSkgJiAweDNmOworICAgIHdzdGF0cy0+ZGlzY2FyZC5ud2lkID0gMEw7CisgICAgd3N0YXRzLT5kaXNjYXJkLmNvZGUgPSAwTDsKKyAgICB3c3RhdHMtPmRpc2NhcmQubWlzYyA9IDBMOworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgICAKKyAgICByZXR1cm4gJnByaXYtPml3X3N0YXRzOworfQorI2VuZGlmCisKKy8qCisgKiBGdW5jdGlvbiBuZXR3YXZlX2F0dGFjaCAodm9pZCkKKyAqCisgKiAgICAgQ3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcgbG9jYWwgZGF0YSAKKyAqICAgICBzdHJ1Y3R1cmVzIGZvciBvbmUgZGV2aWNlLiAgVGhlIGRldmljZSBpcyByZWdpc3RlcmVkIHdpdGggQ2FyZCAKKyAqICAgICBTZXJ2aWNlcy4KKyAqCisgKiAgICAgVGhlIGRldl9saW5rIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCwgYnV0IHdlIGRvbid0IGFjdHVhbGx5CisgKiAgICAgY29uZmlndXJlIHRoZSBjYXJkIGF0IHRoaXMgcG9pbnQgLS0gd2Ugd2FpdCB1bnRpbCB3ZSByZWNlaXZlIGEKKyAqICAgICBjYXJkIGluc2VydGlvbiBldmVudC4KKyAqLworc3RhdGljIGRldl9saW5rX3QgKm5ldHdhdmVfYXR0YWNoKHZvaWQpCit7CisgICAgY2xpZW50X3JlZ190IGNsaWVudF9yZWc7CisgICAgZGV2X2xpbmtfdCAqbGluazsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdjsKKyAgICBpbnQgcmV0OworICAgIAorICAgIERFQlVHKDAsICJuZXR3YXZlX2F0dGFjaCgpXG4iKTsKKyAgICAKKyAgICAvKiBJbml0aWFsaXplIHRoZSBkZXZfbGlua190IHN0cnVjdHVyZSAqLworICAgIGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihuZXR3YXZlX3ByaXZhdGUpKTsKKyAgICBpZiAoIWRldikKKwlyZXR1cm4gTlVMTDsKKyAgICBwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBsaW5rID0gJnByaXYtPmxpbms7CisgICAgbGluay0+cHJpdiA9IGRldjsKKworICAgIC8qIFRoZSBpbyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIElPIHBvcnQgbWFwcGluZyAqLworICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDE2OworICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OworICAgIC8qIGxpbmstPmlvLk51bVBvcnRzMiA9IDE2OyAKKyAgICAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsgKi8KKyAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDU7CisgICAgCisgICAgLyogSW50ZXJydXB0IHNldHVwICovCisgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfSEFORExFX1BSRVNFTlQ7CisgICAgbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOworICAgIGxpbmstPmlycS5IYW5kbGVyID0gJm5ldHdhdmVfaW50ZXJydXB0OworICAgIAorICAgIC8qIEdlbmVyYWwgc29ja2V0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CisgICAgbGluay0+Y29uZi5WY2MgPSA1MDsKKyAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMTsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBQUkVTRU5UX09QVElPTjsKKworICAgIC8qIE5ldHdhdmUgcHJpdmF0ZSBzdHJ1Y3QgaW5pdC4gbGluay9kZXYvbm9kZSBhbHJlYWR5IHRha2VuIGNhcmUgb2YsCisgICAgICogb3RoZXIgc3R1ZmYgemVybydkIC0gSmVhbiBJSSAqLworICAgIHNwaW5fbG9ja19pbml0KCZwcml2LT5zcGlubG9jayk7CisKKyAgICAvKiBOZXR3YXZlIHNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKyAgICBTRVRfTU9EVUxFX09XTkVSKGRldik7CisgICAgZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmbmV0d2F2ZV9zdGFydF94bWl0OworICAgIGRldi0+Z2V0X3N0YXRzICA9ICZuZXR3YXZlX2dldF9zdGF0czsKKyAgICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7CisgICAgLyogd2lyZWxlc3MgZXh0ZW5zaW9ucyAqLworI2lmZGVmIFdJUkVMRVNTX0VYVAorICAgIGRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID0gJm5ldHdhdmVfZ2V0X3dpcmVsZXNzX3N0YXRzOworI2lmIFdJUkVMRVNTX0VYVCA+IDEyCisgICAgZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikmbmV0d2F2ZV9oYW5kbGVyX2RlZjsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMiAqLworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCAqLworICAgIGRldi0+ZG9faW9jdGwgPSAmbmV0d2F2ZV9pb2N0bDsKKworICAgIGRldi0+dHhfdGltZW91dCA9ICZuZXR3YXZlX3dhdGNoZG9nOworICAgIGRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCisgICAgZGV2LT5vcGVuID0gJm5ldHdhdmVfb3BlbjsKKyAgICBkZXYtPnN0b3AgPSAmbmV0d2F2ZV9jbG9zZTsKKyAgICBsaW5rLT5pcnEuSW5zdGFuY2UgPSBkZXY7CisgICAgCisgICAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgbGluay0+bmV4dCA9IGRldl9saXN0OworICAgIGRldl9saXN0ID0gbGluazsKKyAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KKwlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKwlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZuZXR3YXZlX2V2ZW50OworICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKKyAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOworICAgIGlmIChyZXQgIT0gMCkgeworCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisJbmV0d2F2ZV9kZXRhY2gobGluayk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGxpbms7Cit9IC8qIG5ldHdhdmVfYXR0YWNoICovCisKKy8qCisgKiBGdW5jdGlvbiBuZXR3YXZlX2RldGFjaCAobGluaykKKyAqCisgKiAgICBUaGlzIGRlbGV0ZXMgYSBkcml2ZXIgImluc3RhbmNlIi4gIFRoZSBkZXZpY2UgaXMgZGUtcmVnaXN0ZXJlZAorICogICAgd2l0aCBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCisgKiAgICBzdHJ1Y3R1cmVzIGFyZSBmcmVlZC4gIE90aGVyd2lzZSwgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZSBmcmVlZAorICogICAgd2hlbiB0aGUgZGV2aWNlIGlzIHJlbGVhc2VkLgorICovCitzdGF0aWMgdm9pZCBuZXR3YXZlX2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGRldl9saW5rX3QgKipsaW5rcDsKKworICAgIERFQlVHKDAsICJuZXR3YXZlX2RldGFjaCgweCVwKVxuIiwgbGluayk7CisgIAorICAgIC8qCisJICBJZiB0aGUgZGV2aWNlIGlzIGN1cnJlbnRseSBjb25maWd1cmVkIGFuZCBhY3RpdmUsIHdlIHdvbid0CisJICBhY3R1YWxseSBkZWxldGUgaXQgeWV0LiAgSW5zdGVhZCwgaXQgaXMgbWFya2VkIHNvIHRoYXQgd2hlbgorCSAgdGhlIHJlbGVhc2UoKSBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoYXQgd2lsbCB0cmlnZ2VyIGEgcHJvcGVyCisJICBkZXRhY2goKS4KKwkqLworICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJbmV0d2F2ZV9yZWxlYXNlKGxpbmspOworCQorICAgIC8qIEJyZWFrIHRoZSBsaW5rIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworICAgIGlmIChsaW5rLT5oYW5kbGUpCisJcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGxpbmstPmhhbmRsZSk7CisgICAgCisgICAgLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKyAgICBmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorCWlmICgqbGlua3AgPT0gbGluaykgYnJlYWs7CisgICAgaWYgKCpsaW5rcCA9PSBOVUxMKQorICAgICAgeworCURFQlVHKDEsICJuZXR3YXZlX2NzOiBkZXRhY2ggZmFpbCwgJyVzJyBub3QgaW4gbGlzdFxuIiwKKwkgICAgICBsaW5rLT5kZXYtPmRldl9uYW1lKTsKKwlyZXR1cm47CisgICAgICB9CisKKyAgICAvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBwaWVjZXMgKi8KKyAgICAqbGlua3AgPSBsaW5rLT5uZXh0OworICAgIGlmIChsaW5rLT5kZXYpIAorCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisgICAgZnJlZV9uZXRkZXYoZGV2KTsKKyAgICAKK30gLyogbmV0d2F2ZV9kZXRhY2ggKi8KKworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgcHJvdG9jb2wgbmFtZQorICovCitzdGF0aWMgaW50IG5ldHdhdmVfZ2V0X25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJc3RyY3B5KHdycXUtPm5hbWUsICJOZXR3YXZlIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IE5ldHdvcmsgSUQKKyAqLworc3RhdGljIGludCBuZXR3YXZlX3NldF9ud2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJa2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVfY2hhciBfX2lvbWVtICpyYW1CYXNlID0gcHJpdi0+cmFtQmFzZTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAmIHNhdmUgZmxhZ3MgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKKworI2lmIFdJUkVMRVNTX0VYVCA+IDgKKwlpZighd3JxdS0+bndpZC5kaXNhYmxlZCkgeworCSAgICBkb21haW4gPSB3cnF1LT5ud2lkLnZhbHVlOworI2Vsc2UJLyogV0lSRUxFU1NfRVhUID4gOCAqLworCWlmKHdycXUtPm53aWQub24pIHsKKwkgICAgZG9tYWluID0gd3JxdS0+bndpZC5ud2lkOworI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKwkgICAgcHJpbnRrKCBLRVJOX0RFQlVHICJTZXR0aW5nIGRvbWFpbiB0byAweCV4JTAyeFxuIiwgCisJCSAgICAoZG9tYWluID4+IDgpICYgMHgwMSwgZG9tYWluICYgMHhmZik7CisJICAgIHdhaXRfV09DKGlvYmFzZSk7CisJICAgIHdyaXRlYihORVRXQVZFX0NNRF9TTUQsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKKwkgICAgd3JpdGViKCBkb21haW4gJiAweGZmLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CisJICAgIHdyaXRlYigoZG9tYWluID4+OCApICYgMHgwMSxyYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCKzIpOworCSAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMyk7CisJfQorCisJLyogUmVFbmFibGUgaW50ZXJydXB0cyAmIHJlc3RvcmUgZmxhZ3MgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOworICAgIAorCXJldHVybiAwOworfQorCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBOZXR3b3JrIElECisgKi8KK3N0YXRpYyBpbnQgbmV0d2F2ZV9nZXRfbndpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKyNpZiBXSVJFTEVTU19FWFQgPiA4CisJd3JxdS0+bndpZC52YWx1ZSA9IGRvbWFpbjsKKwl3cnF1LT5ud2lkLmRpc2FibGVkID0gMDsKKwl3cnF1LT5ud2lkLmZpeGVkID0gMTsKKyNlbHNlCS8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKwl3cnF1LT5ud2lkLm53aWQgPSBkb21haW47CisJd3JxdS0+bndpZC5vbiA9IDE7CisjZW5kaWYJLyogV0lSRUxFU1NfRVhUID4gOCAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IHNjcmFtYmxlIGtleQorICovCitzdGF0aWMgaW50IG5ldHdhdmVfc2V0X3NjcmFtYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJCWNoYXIgKmtleSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWtpb19hZGRyX3QgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgJiBzYXZlIGZsYWdzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlzY3JhbWJsZV9rZXkgPSAoa2V5WzBdIDw8IDgpIHwga2V5WzFdOworCXdhaXRfV09DKGlvYmFzZSk7CisJd3JpdGViKE5FVFdBVkVfQ01EX1NTSywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOworCXdyaXRlYihzY3JhbWJsZV9rZXkgJiAweGZmLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CisJd3JpdGViKChzY3JhbWJsZV9rZXk+PjgpICYgMHhmZiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDIpOworCXdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAzKTsKKworCS8qIFJlRW5hYmxlIGludGVycnVwdHMgJiByZXN0b3JlIGZsYWdzICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgICAKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgc2NyYW1ibGUga2V5CisgKi8KK3N0YXRpYyBpbnQgbmV0d2F2ZV9nZXRfc2NyYW1ibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkJY2hhciAqa2V5KQoreworCWtleVsxXSA9IHNjcmFtYmxlX2tleSAmIDB4ZmY7CisJa2V5WzBdID0gKHNjcmFtYmxlX2tleT4+OCkgJiAweGZmOworI2lmIFdJUkVMRVNTX0VYVCA+IDgKKwl3cnF1LT5lbmNvZGluZy5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEOworCXdycXUtPmVuY29kaW5nLmxlbmd0aCA9IDI7CisjZWxzZSAvKiBXSVJFTEVTU19FWFQgPiA4ICovCisJd3JxdS0+ZW5jb2RpbmcubWV0aG9kID0gMTsKKyNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiA4ICovCisKKwlyZXR1cm4gMDsKK30KKworI2lmIFdJUkVMRVNTX0VYVCA+IDgKKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IG1vZGUKKyAqLworc3RhdGljIGludCBuZXR3YXZlX2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCWlmKGRvbWFpbiAmIDB4MTAwKQorCQl3cnF1LT5tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwllbHNlCisJCXdycXUtPm1vZGUgPSBJV19NT0RFX0FESE9DOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYJLyogV0lSRUxFU1NfRVhUID4gOCAqLworCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCByYW5nZSBpbmZvCisgKi8KK3N0YXRpYyBpbnQgbmV0d2F2ZV9nZXRfcmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKikgZXh0cmE7CisJaW50IHJldCA9IDA7CisKKwkvKiBTZXQgdGhlIGxlbmd0aCAodmVyeSBpbXBvcnRhbnQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpICovCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKKworCS8qIFNldCBhbGwgdGhlIGluZm8gd2UgZG9uJ3QgY2FyZSBvciBkb24ndCBrbm93IGFib3V0IHRvIHplcm8gKi8KKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKKworI2lmIFdJUkVMRVNTX0VYVCA+IDEwCisJLyogU2V0IHRoZSBXaXJlbGVzcyBFeHRlbnNpb24gdmVyc2lvbnMgKi8KKwlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSA5OwkvKiBOb3RoaW5nIGZvciB1cyBpbiB2MTAgYW5kIHYxMSAqLworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEwICovCisJCSAgIAorCS8qIFNldCBpbmZvcm1hdGlvbiBpbiB0aGUgcmFuZ2Ugc3RydWN0ICovCisJcmFuZ2UtPnRocm91Z2hwdXQgPSA0NTAgKiAxMDAwOwkvKiBkb24ndCBhcmd1ZSBvbiB0aGlzICEgKi8KKwlyYW5nZS0+bWluX253aWQgPSAweDAwMDA7CisJcmFuZ2UtPm1heF9ud2lkID0gMHgwMUZGOworCisJcmFuZ2UtPm51bV9jaGFubmVscyA9IHJhbmdlLT5udW1fZnJlcXVlbmN5ID0gMDsKKwkJICAgCisJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMHgzRjsKKwlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDI1NTsKKwlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAyNTU7CisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMDsKKwkJICAgCisjaWYgV0lSRUxFU1NfRVhUID4gNworCXJhbmdlLT5udW1fYml0cmF0ZXMgPSAxOworCXJhbmdlLT5iaXRyYXRlWzBdID0gMTAwMDAwMDsJLyogMSBNYi9zICovCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gNyAqLworCisjaWYgV0lSRUxFU1NfRVhUID4gOAorCXJhbmdlLT5lbmNvZGluZ19zaXplWzBdID0gMjsJCS8qIDE2IGJpdHMgc2NyYW1ibGluZyAqLworCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAxOworCXJhbmdlLT5tYXhfZW5jb2RpbmdfdG9rZW5zID0gMTsJLyogT25seSBvbmUga2V5IHBvc3NpYmxlICovCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gOCAqLworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IGdldCBzbmFwc2hvdAorICovCitzdGF0aWMgaW50IG5ldHdhdmVfZ2V0X3NuYXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlraW9fYWRkcl90IGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCW5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdV9jaGFyIF9faW9tZW0gKnJhbUJhc2UgPSBwcml2LT5yYW1CYXNlOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICYgc2F2ZSBmbGFncyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOworCisJLyogVGFrZSBzbmFwc2hvdCBvZiBlbnZpcm9ubWVudCAqLworCW5ldHdhdmVfc25hcHNob3QoIHByaXYsIHJhbUJhc2UsIGlvYmFzZSk7CisJd3JxdS0+ZGF0YS5sZW5ndGggPSBwcml2LT5uc3MubGVuZ3RoOworCW1lbWNweShleHRyYSwgKHVfY2hhciAqKSAmcHJpdi0+bnNzLCBzaXplb2YoIHN0cnVjdCBzaXRlX3N1cnZleSkpOworCisJcHJpdi0+bGFzdEV4ZWMgPSBqaWZmaWVzOworCisJLyogUmVFbmFibGUgaW50ZXJydXB0cyAmIHJlc3RvcmUgZmxhZ3MgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOworICAgIAorCXJldHVybigwKTsKK30KKworLyoKKyAqIFN0cnVjdHVyZXMgdG8gZXhwb3J0IHRoZSBXaXJlbGVzcyBIYW5kbGVycworICogICAgIFRoaXMgaXMgdGhlIHN0dWZmIHRoYXQgYXJlIHRyZWF0ZWQgdGhlIHdpcmVsZXNzIGV4dGVuc2lvbnMgKGl3Y29uZmlnKQorICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzIG5ldHdhdmVfcHJpdmF0ZV9hcmdzW10gPSB7CisvKnsgY21kLCAgICAgICAgIHNldF9hcmdzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYXJncywgbmFtZSB9ICovCisgIHsgU0lPQ0dJUFNOQVAsIDAsIAorICAgIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgc2l6ZW9mKHN0cnVjdCBzaXRlX3N1cnZleSksIAorICAgICJnZXRzaXRlc3VydmV5IiB9LAorfTsKKworI2lmIFdJUkVMRVNTX0VYVCA+IDEyCisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyCQluZXR3YXZlX2hhbmRsZXJbXSA9Cit7CisJTlVMTCwJCQkJLyogU0lPQ1NJV05BTUUgKi8KKwluZXR3YXZlX2dldF9uYW1lLAkJLyogU0lPQ0dJV05BTUUgKi8KKwluZXR3YXZlX3NldF9ud2lkLAkJLyogU0lPQ1NJV05XSUQgKi8KKwluZXR3YXZlX2dldF9ud2lkLAkJLyogU0lPQ0dJV05XSUQgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXRlJFUSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdGUkVRICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV01PREUgKi8KKwluZXR3YXZlX2dldF9tb2RlLAkJLyogU0lPQ0dJV01PREUgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXU0VOUyAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdTRU5TICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1JBTkdFICovCisJbmV0d2F2ZV9nZXRfcmFuZ2UsCQkvKiBTSU9DR0lXUkFOR0UgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXUFJJViAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdQUklWICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1NUQVRTICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV1NUQVRTICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1NQWSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdTUFkgKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdBUCAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdBUCAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXQVBMSVNUICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXRVNTSUQgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXRVNTSUQgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXTklDS04gKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXTklDS04gKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSQVRFICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV1JBVEUgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXUlRTICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV1JUUyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdGUkFHICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV0ZSQUcgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXVFhQT1cgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXVFhQT1cgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXUkVUUlkgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUkVUUlkgKi8KKwluZXR3YXZlX3NldF9zY3JhbWJsZSwJCS8qIFNJT0NTSVdFTkNPREUgKi8KKwluZXR3YXZlX2dldF9zY3JhbWJsZSwJCS8qIFNJT0NHSVdFTkNPREUgKi8KK307CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyCQluZXR3YXZlX3ByaXZhdGVfaGFuZGxlcltdID0KK3sKKwlOVUxMLAkJCQkvKiBTSU9DSVdGSVJTVFBSSVYgKi8KKwluZXR3YXZlX2dldF9zbmFwLAkJLyogU0lPQ0lXRklSU1RQUklWICsgMSAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZgluZXR3YXZlX2hhbmRsZXJfZGVmID0KK3sKKwkubnVtX3N0YW5kYXJkCT0gc2l6ZW9mKG5ldHdhdmVfaGFuZGxlcikvc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5udW1fcHJpdmF0ZQk9IHNpemVvZihuZXR3YXZlX3ByaXZhdGVfaGFuZGxlcikvc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5udW1fcHJpdmF0ZV9hcmdzID0gc2l6ZW9mKG5ldHdhdmVfcHJpdmF0ZV9hcmdzKS9zaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncyksCisJLnN0YW5kYXJkCT0gKGl3X2hhbmRsZXIgKikgbmV0d2F2ZV9oYW5kbGVyLAorCS5wcml2YXRlCT0gKGl3X2hhbmRsZXIgKikgbmV0d2F2ZV9wcml2YXRlX2hhbmRsZXIsCisJLnByaXZhdGVfYXJncwk9IChzdHJ1Y3QgaXdfcHJpdl9hcmdzICopIG5ldHdhdmVfcHJpdmF0ZV9hcmdzLAorfTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMiAqLworCisvKgorICogRnVuY3Rpb24gbmV0d2F2ZV9pb2N0bCAoZGV2LCBycSwgY21kKQorICoKKyAqICAgICBQZXJmb3JtIGlvY3RsIDogY29uZmlnICYgaW5mbyBzdHVmZgorICogICAgIFRoaXMgaXMgdGhlIHN0dWZmIHRoYXQgYXJlIHRyZWF0ZWQgdGhlIHdpcmVsZXNzIGV4dGVuc2lvbnMgKGl3Y29uZmlnKQorICoKKyAqLworc3RhdGljIGludCBuZXR3YXZlX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIC8qIGlvY3RsIGRldmljZSAqLworCQkJIHN0cnVjdCBpZnJlcSAqcnEsCSAvKiBEYXRhIHBhc3NlZCAqLworCQkJIGludAljbWQpCSAgICAgLyogSW9jdGwgbnVtYmVyICovCit7CisgICAgaW50CQkJcmV0ID0gMDsKKyNpZmRlZiBXSVJFTEVTU19FWFQKKyNpZiBXSVJFTEVTU19FWFQgPD0gMTIKKyAgICBzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7CisjZW5kaWYKKyNlbmRpZgorCQorICAgIERFQlVHKDAsICIlczogLT5uZXR3YXZlX2lvY3RsKGNtZD0weCVYKVxuIiwgZGV2LT5uYW1lLCBjbWQpOworCQorICAgIC8qIExvb2sgd2hhdCBpcyB0aGUgcmVxdWVzdCAqLworICAgIHN3aXRjaChjbWQpIHsKKwkvKiAtLS0tLS0tLS0tLS0tLS0gV0lSRUxFU1MgRVhURU5TSU9OUyAtLS0tLS0tLS0tLS0tLS0gKi8KKyNpZmRlZiBXSVJFTEVTU19FWFQKKyNpZiBXSVJFTEVTU19FWFQgPD0gMTIKKyAgICBjYXNlIFNJT0NHSVdOQU1FOgorCW5ldHdhdmVfZ2V0X25hbWUoZGV2LCBOVUxMLCAmKHdycS0+dSksIE5VTEwpOworCWJyZWFrOworICAgIGNhc2UgU0lPQ1NJV05XSUQ6CisJcmV0ID0gbmV0d2F2ZV9zZXRfbndpZChkZXYsIE5VTEwsICYod3JxLT51KSwgTlVMTCk7CisJYnJlYWs7CisgICAgY2FzZSBTSU9DR0lXTldJRDoKKwlyZXQgPSBuZXR3YXZlX2dldF9ud2lkKGRldiwgTlVMTCwgJih3cnEtPnUpLCBOVUxMKTsKKwlicmVhazsKKyNpZiBXSVJFTEVTU19FWFQgPiA4CS8qIE5vdGUgOiBUaGUgQVBJIGRpZCBjaGFuZ2UuLi4gKi8KKyAgICBjYXNlIFNJT0NHSVdFTkNPREU6CisJLyogR2V0IHNjcmFtYmxlIGtleSAqLworCWlmKHdycS0+dS5lbmNvZGluZy5wb2ludGVyICE9IChjYWRkcl90KSAwKQorCSAgeworCSAgICBjaGFyCWtleVsyXTsKKwkgICAgcmV0ID0gbmV0d2F2ZV9nZXRfc2NyYW1ibGUoZGV2LCBOVUxMLCAmKHdycS0+dSksIGtleSk7CisJICAgIGlmKGNvcHlfdG9fdXNlcih3cnEtPnUuZW5jb2RpbmcucG9pbnRlciwga2V5LCAyKSkKKwkgICAgICByZXQgPSAtRUZBVUxUOworCSAgfQorCWJyZWFrOworICAgIGNhc2UgU0lPQ1NJV0VOQ09ERToKKwkvKiBTZXQgIHNjcmFtYmxlIGtleSAqLworCWlmKHdycS0+dS5lbmNvZGluZy5wb2ludGVyICE9IChjYWRkcl90KSAwKQorCSAgeworCSAgICBjaGFyCWtleVsyXTsKKwkgICAgaWYoY29weV9mcm9tX3VzZXIoa2V5LCB3cnEtPnUuZW5jb2RpbmcucG9pbnRlciwgMikpCisJICAgICAgeworCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKKwkgICAgICB9CisJICAgIHJldCA9IG5ldHdhdmVfc2V0X3NjcmFtYmxlKGRldiwgTlVMTCwgJih3cnEtPnUpLCBrZXkpOworCSAgfQorCWJyZWFrOworICAgIGNhc2UgU0lPQ0dJV01PREU6CisJLyogTW9kZSBvZiBvcGVyYXRpb24gKi8KKwlyZXQgPSBuZXR3YXZlX2dldF9tb2RlKGRldiwgTlVMTCwgJih3cnEtPnUpLCBOVUxMKTsKKwlicmVhazsKKyNlbHNlIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKyAgICBjYXNlIFNJT0NHSVdFTkNPREU6CisJLyogR2V0IHNjcmFtYmxlIGtleSAqLworCXJldCA9IG5ldHdhdmVfZ2V0X3NjcmFtYmxlKGRldiwgTlVMTCwgJih3cnEtPnUpLAorCQkJCSAgIChjaGFyICopICZ3cnEtPnUuZW5jb2RpbmcuY29kZSk7CisJYnJlYWs7CisgICAgY2FzZSBTSU9DU0lXRU5DT0RFOgorCS8qIFNldCAgc2NyYW1ibGUga2V5ICovCisJcmV0ID0gbmV0d2F2ZV9zZXRfc2NyYW1ibGUoZGV2LCBOVUxMLCAmKHdycS0+dSksCisJCQkJICAgKGNoYXIgKikgJndycS0+dS5lbmNvZGluZy5jb2RlKTsKKwlicmVhazsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA4ICovCisgICBjYXNlIFNJT0NHSVdSQU5HRToKKyAgICAgICAvKiBCYXNpYyBjaGVja2luZy4uLiAqLworICAgICAgIGlmKHdycS0+dS5kYXRhLnBvaW50ZXIgIT0gKGNhZGRyX3QpIDApIHsKKyAgICAgICAgICAgc3RydWN0IGl3X3JhbmdlIHJhbmdlOworCSAgIHJldCA9IG5ldHdhdmVfZ2V0X3JhbmdlKGRldiwgTlVMTCwgJih3cnEtPnUpLCAoY2hhciAqKSAmcmFuZ2UpOworCSAgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnJhbmdlLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKSkKKwkgICAgICAgcmV0ID0gLUVGQVVMVDsKKyAgICAgICB9CisgICAgICAgYnJlYWs7CisgICAgY2FzZSBTSU9DR0lXUFJJVjoKKwkvKiBCYXNpYyBjaGVja2luZy4uLiAqLworCWlmKHdycS0+dS5kYXRhLnBvaW50ZXIgIT0gKGNhZGRyX3QpIDApIHsKKwkgICAgLyogU2V0IHRoZSBudW1iZXIgb2YgaW9jdGwgYXZhaWxhYmxlICovCisJICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihuZXR3YXZlX3ByaXZhdGVfYXJncykgLyBzaXplb2YobmV0d2F2ZV9wcml2YXRlX2FyZ3NbMF0pOworCQkJCisJICAgIC8qIENvcHkgc3RydWN0dXJlIHRvIHRoZSB1c2VyIGJ1ZmZlciAqLworCSAgICBpZihjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwKKwkJCSAgICAodV9jaGFyICopIG5ldHdhdmVfcHJpdmF0ZV9hcmdzLAorCQkJICAgIHNpemVvZihuZXR3YXZlX3ByaXZhdGVfYXJncykpKQorCSAgICAgIHJldCA9IC1FRkFVTFQ7CisJfSAKKwlicmVhazsKKyAgICBjYXNlIFNJT0NHSVBTTkFQOgorCWlmKHdycS0+dS5kYXRhLnBvaW50ZXIgIT0gKGNhZGRyX3QpIDApIHsKKwkgICAgY2hhciBidWZmZXJbc2l6ZW9mKCBzdHJ1Y3Qgc2l0ZV9zdXJ2ZXkpXTsKKwkgICAgcmV0ID0gbmV0d2F2ZV9nZXRfc25hcChkZXYsIE5VTEwsICYod3JxLT51KSwgYnVmZmVyKTsKKwkgICAgLyogQ29weSBzdHJ1Y3R1cmUgdG8gdGhlIHVzZXIgYnVmZmVyICovCisJICAgIGlmKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAKKwkJCSAgICBidWZmZXIsCisJCQkgICAgc2l6ZW9mKCBzdHJ1Y3Qgc2l0ZV9zdXJ2ZXkpKSkKKwkgICAgICB7CisJCXByaW50ayhLRVJOX0RFQlVHICJCYWQgYnVmZmVyIVxuIik7CisJCWJyZWFrOworCSAgICAgIH0KKwl9CisJYnJlYWs7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUIDw9IDEyICovCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUICovCisgICAgZGVmYXVsdDoKKwlyZXQgPSAtRU9QTk9UU1VQUDsKKyAgICB9CisJCisgICAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5ldHdhdmVfcGNtY2lhX2NvbmZpZyAobGluaykKKyAqCisgKiAgICAgbmV0d2F2ZV9wY21jaWFfY29uZmlnKCkgaXMgc2NoZWR1bGVkIHRvIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OIAorICogICAgIGV2ZW50IGlzIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZQorICogICAgIGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4gCisgKgorICovCisKKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgbmV0d2F2ZV9wY21jaWFfY29uZmlnKGRldl9saW5rX3QgKmxpbmspIHsKKyAgICBjbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICBjaXNwYXJzZV90IHBhcnNlOworICAgIGludCBpLCBqLCBsYXN0X3JldCwgbGFzdF9mbjsKKyAgICB1X2NoYXIgYnVmWzY0XTsKKyAgICB3aW5fcmVxX3QgcmVxOworICAgIG1lbXJlcV90IG1lbTsKKyAgICB1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IE5VTEw7CisKKyAgICBERUJVRygwLCAibmV0d2F2ZV9wY21jaWFfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKKworICAgIC8qCisgICAgICBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24KKyAgICAgIHJlZ2lzdGVycy4KKyAgICAqLworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOworICAgIHR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKikgYnVmOworICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OworICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisgICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CisgICAgbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOworCisgICAgLyogQ29uZmlndXJlIGNhcmQgKi8KKyAgICBsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworCisgICAgLyoKKyAgICAgKiAgVHJ5IGFsbG9jYXRpbmcgSU8gcG9ydHMuICBUaGlzIHRyaWVzIGEgZmV3IGZpeGVkIGFkZHJlc3Nlcy4KKyAgICAgKiAgSWYgeW91IHdhbnQsIHlvdSBjYW4gYWxzbyByZWFkIHRoZSBjYXJkJ3MgY29uZmlnIHRhYmxlIHRvCisgICAgICogIHBpY2sgYWRkcmVzc2VzIC0tIHNlZSB0aGUgc2VyaWFsIGRyaXZlciBmb3IgYW4gZXhhbXBsZS4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSBqID0gMHgwOyBqIDwgMHg0MDA7IGogKz0gMHgyMCkgeworCWxpbmstPmlvLkJhc2VQb3J0MSA9IGogXiAweDMwMDsKKwlpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCWlmIChpID09IENTX1NVQ0NFU1MpIGJyZWFrOworICAgIH0KKyAgICBpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0SU8sIGkpOworCWdvdG8gZmFpbGVkOworICAgIH0KKworICAgIC8qCisgICAgICogIE5vdyBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90CisgICAgICogIGFjdHVhbGx5IGFzc2lnbiBhIGhhbmRsZXIgdG8gdGhlIGludGVycnVwdC4KKyAgICAgKi8KKyAgICBDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEoaGFuZGxlLCAmbGluay0+aXJxKSk7CisKKyAgICAvKgorICAgICAqICBUaGlzIGFjdHVhbGx5IGNvbmZpZ3VyZXMgdGhlIFBDTUNJQSBzb2NrZXQgLS0gc2V0dGluZyB1cAorICAgICAqICB0aGUgSS9PIHdpbmRvd3MgYW5kIHRoZSBpbnRlcnJ1cHQgbWFwcGluZy4KKyAgICAgKi8KKyAgICBDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihoYW5kbGUsICZsaW5rLT5jb25mKSk7CisKKyAgICAvKgorICAgICAqICBBbGxvY2F0ZSBhIDMySyBtZW1vcnkgd2luZG93LiAgTm90ZSB0aGF0IHRoZSBkZXZfbGlua190CisgICAgICogIHN0cnVjdHVyZSBwcm92aWRlcyBzcGFjZSBmb3Igb25lIHdpbmRvdyBoYW5kbGUgLS0gaWYgeW91cgorICAgICAqICBkZXZpY2UgbmVlZHMgc2V2ZXJhbCB3aW5kb3dzLCB5b3UnbGwgbmVlZCB0byBrZWVwIHRyYWNrIG9mCisgICAgICogIHRoZSBoYW5kbGVzIGluIHlvdXIgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSwgZGV2LT5wcml2LgorICAgICAqLworICAgIERFQlVHKDEsICJTZXR0aW5nIG1lbSBzcGVlZCBvZiAlZFxuIiwgbWVtX3NwZWVkKTsKKworICAgIHJlcS5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfOHxXSU5fTUVNT1JZX1RZUEVfQ018V0lOX0VOQUJMRTsKKyAgICByZXEuQmFzZSA9IDA7IHJlcS5TaXplID0gMHg4MDAwOworICAgIHJlcS5BY2Nlc3NTcGVlZCA9IG1lbV9zcGVlZDsKKyAgICBDU19DSEVDSyhSZXF1ZXN0V2luZG93LCBwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmstPmhhbmRsZSwgJnJlcSwgJmxpbmstPndpbikpOworICAgIG1lbS5DYXJkT2Zmc2V0ID0gMHgyMDAwMDsgbWVtLlBhZ2UgPSAwOyAKKyAgICBDU19DSEVDSyhNYXBNZW1QYWdlLCBwY21jaWFfbWFwX21lbV9wYWdlKGxpbmstPndpbiwgJm1lbSkpOworCisgICAgLyogU3RvcmUgYmFzZSBhZGRyZXNzIG9mIHRoZSBjb21tb24gd2luZG93IGZyYW1lICovCisgICAgcmFtQmFzZSA9IGlvcmVtYXAocmVxLkJhc2UsIDB4ODAwMCk7CisgICAgcHJpdi0+cmFtQmFzZSA9IHJhbUJhc2U7CisKKyAgICBkZXYtPmlycSA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKKyAgICBkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKyAgICBTRVRfTkVUREVWX0RFVihkZXYsICZoYW5kbGVfdG9fZGV2KGhhbmRsZSkpOworCisgICAgaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpICE9IDApIHsKKwlwcmludGsoS0VSTl9ERUJVRyAibmV0d2F2ZV9jczogcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKKwlnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgICBzdHJjcHkocHJpdi0+bm9kZS5kZXZfbmFtZSwgZGV2LT5uYW1lKTsKKyAgICBsaW5rLT5kZXYgPSAmcHJpdi0+bm9kZTsKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworCisgICAgLyogUmVzZXQgY2FyZCBiZWZvcmUgcmVhZGluZyBwaHlzaWNhbCBhZGRyZXNzICovCisgICAgbmV0d2F2ZV9kb3Jlc2V0KGRldi0+YmFzZV9hZGRyLCByYW1CYXNlKTsKKworICAgIC8qIFJlYWQgdGhlIGV0aGVybmV0IGFkZHJlc3MgYW5kIGZpbGwgaW4gdGhlIE5ldHdhdmUgcmVnaXN0ZXJzLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIAorCWRldi0+ZGV2X2FkZHJbaV0gPSByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1BBICsgaSk7CisKKyAgICBwcmludGsoS0VSTl9JTkZPICIlczogTmV0d2F2ZTogcG9ydCAlIzNseCwgaXJxICVkLCBtZW0gJWx4IGlkICIKKwkgICAiJWMlYywgaHdfYWRkciAiLCBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwKKwkgICAodV9sb25nKSByYW1CYXNlLCAoaW50KSByZWFkYihyYW1CYXNlK05FVFdBVkVfRVJFR19OSSksCisJICAgKGludCkgcmVhZGIocmFtQmFzZStORVRXQVZFX0VSRUdfTkkrMSkpOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJcHJpbnRrKCIlMDJYJXMiLCBkZXYtPmRldl9hZGRyW2ldLCAoKGk8NSkgPyAiOiIgOiAiXG4iKSk7CisKKyAgICAvKiBnZXQgcmV2aXNpb24gd29yZHMgKi8KKyAgICBwcmludGsoS0VSTl9ERUJVRyAiTmV0d2F2ZV9yZXNldDogcmV2aXNpb24gJTA0eCAlMDR4XG4iLCAKKwkgICBnZXRfdWludDE2KHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQVJXKSwKKwkgICBnZXRfdWludDE2KHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQVJXKzIpKTsKKyAgICByZXR1cm47CisKK2NzX2ZhaWxlZDoKKyAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKK2ZhaWxlZDoKKyAgICBuZXR3YXZlX3JlbGVhc2UobGluayk7Cit9IC8qIG5ldHdhdmVfcGNtY2lhX2NvbmZpZyAqLworCisvKgorICogRnVuY3Rpb24gbmV0d2F2ZV9yZWxlYXNlIChhcmcpCisgKgorICogICAgQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIG5ldHdhdmVfcmVsZWFzZSgpIHdpbGwgdW5yZWdpc3RlciB0aGUgbmV0CisgKiAgICBkZXZpY2UsIGFuZCByZWxlYXNlIHRoZSBQQ01DSUEgY29uZmlndXJhdGlvbi4gIElmIHRoZSBkZXZpY2UgaXMKKyAqICAgIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgorICovCitzdGF0aWMgdm9pZCBuZXR3YXZlX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgREVCVUcoMCwgIm5ldHdhdmVfcmVsZWFzZSgweCVwKVxuIiwgbGluayk7CisKKyAgICAvKiBEb24ndCBib3RoZXIgY2hlY2tpbmcgdG8gc2VlIGlmIHRoZXNlIHN1Y2NlZWQgb3Igbm90ICovCisgICAgaWYgKGxpbmstPndpbikgeworCWlvdW5tYXAocHJpdi0+cmFtQmFzZSk7CisJcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxpbmstPndpbik7CisgICAgfQorICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKyAgICBwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisgICAgcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5ldHdhdmVfZXZlbnQgKGV2ZW50LCBwcmlvcml0eSwgYXJncykKKyAqCisgKiAgICBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gIE1vc3RseSwgdGhpcyBzY2hlZHVsZXMgb3RoZXIKKyAqICAgIHN0dWZmIHRvIHJ1biBhZnRlciBhbiBldmVudCBpcyByZWNlaXZlZC4gIEEgQ0FSRF9SRU1PVkFMIGV2ZW50CisgKiAgICBhbHNvIHNldHMgc29tZSBmbGFncyB0byBkaXNjb3VyYWdlIHRoZSBuZXQgZHJpdmVycyBmcm9tIHRyeWluZworICogICAgdG8gdGFsayB0byB0aGUgY2FyZCBhbnkgbW9yZS4KKyAqCisgKiAgICBXaGVuIGEgQ0FSRF9SRU1PVkFMIGV2ZW50IGlzIHJlY2VpdmVkLCB3ZSBpbW1lZGlhdGVseSBzZXQgYSBmbGFnCisgKiAgICB0byBibG9jayBmdXR1cmUgYWNjZXNzZXMgdG8gdGhpcyBkZXZpY2UuICBBbGwgdGhlIGZ1bmN0aW9ucyB0aGF0CisgKiAgICBhY3R1YWxseSBhY2Nlc3MgdGhlIGRldmljZSBzaG91bGQgY2hlY2sgdGhpcyBmbGFnIHRvIG1ha2Ugc3VyZQorICogICAgdGhlIGNhcmQgaXMgc3RpbGwgcHJlc2VudC4KKyAqCisgKi8KK3N0YXRpYyBpbnQgbmV0d2F2ZV9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCQkgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworICAgIGRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKwkKKyAgICBERUJVRygxLCAibmV0d2F2ZV9ldmVudCgweCUwNngpXG4iLCBldmVudCk7CisgIAorICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICBjYXNlIENTX0VWRU5UX1JFR0lTVFJBVElPTl9DT01QTEVURToKKwlERUJVRygwLCAibmV0d2F2ZV9jczogcmVnaXN0cmF0aW9uIGNvbXBsZXRlXG4iKTsKKwlicmVhazsKKworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgorCWxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIG5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwkgICAgbmV0d2F2ZV9yZWxlYXNlKGxpbmspOworCX0KKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorCWxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOworCW5ldHdhdmVfcGNtY2lhX2NvbmZpZyggbGluayk7CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgorCWxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOworCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCSAgICBpZiAobGluay0+b3BlbikKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCSAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJfQorCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCSAgICBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworCSAgICBpZiAobGluay0+b3BlbikgeworCQluZXR3YXZlX3Jlc2V0KGRldik7CisJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwkgICAgfQorCX0KKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9IC8qIG5ldHdhdmVfZXZlbnQgKi8KKworLyoKKyAqIEZ1bmN0aW9uIG5ldHdhdmVfZG9yZXNldCAoaW9CYXNlLCByYW1CYXNlKQorICoKKyAqICAgIFByb3BlciBoYXJkd2FyZSByZXNldCBvZiB0aGUgY2FyZC4KKyAqLworc3RhdGljIHZvaWQgbmV0d2F2ZV9kb3Jlc2V0KGtpb19hZGRyX3QgaW9CYXNlLCB1X2NoYXIgX19pb21lbSAqcmFtQmFzZSkKK3sKKyAgICAvKiBSZXNldCBjYXJkICovCisgICAgd2FpdF9XT0MoaW9CYXNlKTsKKyAgICBvdXRiKDB4ODAsIGlvQmFzZSArIE5FVFdBVkVfUkVHX1BNUik7CisgICAgd3JpdGViKDB4MDgsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQVNDQyk7IC8qIEJpdCAzIGlzIFdPQyAqLworICAgIG91dGIoMHgwLCBpb0Jhc2UgKyBORVRXQVZFX1JFR19QTVIpOyAvKiByZWxlYXNlIHJlc2V0ICovCit9CisKKy8qCisgKiBGdW5jdGlvbiBuZXR3YXZlX3Jlc2V0IChkZXYpCisgKgorICogICAgUmVzZXQgYW5kIHJlc3RvcmUgYWxsIG9mIHRoZSBuZXR3YXZlIHJlZ2lzdGVycyAKKyAqLworc3RhdGljIHZvaWQgbmV0d2F2ZV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisgICAgLyogdV9jaGFyIHN0YXRlOyAqLworICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9jaGFyIF9faW9tZW0gKnJhbUJhc2UgPSBwcml2LT5yYW1CYXNlOworICAgIGtpb19hZGRyX3QgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBERUJVRygwLCAibmV0d2F2ZV9yZXNldDogRG9uZSB3aXRoIGhhcmR3YXJlIHJlc2V0XG4iKTsKKworICAgIHByaXYtPnRpbWVvdXRDb3VudGVyID0gMDsKKworICAgIC8qIFJlc2V0IGNhcmQgKi8KKyAgICBuZXR3YXZlX2RvcmVzZXQoaW9iYXNlLCByYW1CYXNlKTsKKyAgICBwcmludGsoS0VSTl9ERUJVRyAibmV0d2F2ZV9yZXNldDogRG9uZSB3aXRoIGhhcmR3YXJlIHJlc2V0XG4iKTsKKwkKKyAgICAvKiBXcml0ZSBhIE5PUCB0byBjaGVjayB0aGUgY2FyZCAqLworICAgIHdhaXRfV09DKGlvYmFzZSk7CisgICAgd3JpdGViKE5FVFdBVkVfQ01EX05PUCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKKwkKKyAgICAvKiBTZXQgcmVjZWl2ZSBjb25mICovCisgICAgd2FpdF9XT0MoaW9iYXNlKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfU1JDLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CisgICAgd3JpdGViKHJ4Q29uZlJ4RW5hICsgcnhDb25mQmNhc3QsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMik7CisgICAgCisgICAgLyogU2V0IHRyYW5zbWl0IGNvbmYgKi8KKyAgICB3YWl0X1dPQyhpb2Jhc2UpOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9TVEMsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKKyAgICB3cml0ZWIodHhDb25mVHhFbmEsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMik7CisgICAgCisgICAgLyogTm93IHNldCB0aGUgTVUgRG9tYWluICovCisgICAgcHJpbnRrKEtFUk5fREVCVUcgIlNldHRpbmcgZG9tYWluIHRvIDB4JXglMDJ4XG4iLCAoZG9tYWluID4+IDgpICYgMHgwMSwgZG9tYWluICYgMHhmZik7CisgICAgd2FpdF9XT0MoaW9iYXNlKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfU01ELCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CisgICAgd3JpdGViKGRvbWFpbiAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKKyAgICB3cml0ZWIoKGRvbWFpbj4+OCkgJiAweDAxLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMik7CisgICAgd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDMpOworCQorICAgIC8qIFNldCBzY3JhbWJsZSBrZXkgKi8KKyAgICBwcmludGsoS0VSTl9ERUJVRyAiU2V0dGluZyBzY3JhbWJsZSBrZXkgdG8gMHgleFxuIiwgc2NyYW1ibGVfa2V5KTsKKyAgICB3YWl0X1dPQyhpb2Jhc2UpOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9TU0ssIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKKyAgICB3cml0ZWIoc2NyYW1ibGVfa2V5ICYgMHhmZiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOworICAgIHdyaXRlYigoc2NyYW1ibGVfa2V5Pj44KSAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAyKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMyk7CisKKyAgICAvKiBFbmFibGUgaW50ZXJydXB0cywgYml0IDQgaGlnaCB0byBrZWVwIHVudXNlZAorICAgICAqIHNvdXJjZSBmcm9tIGludGVycnVwdGluZyB1cywgYml0IDIgaGlnaCB0byAKKyAgICAgKiBzZXQgaW50ZXJydXB0IGVuYWJsZSwgNTY3IHRvIGVuYWJsZSBUeEROLCAKKyAgICAgKiBSeEVyciBhbmQgUnhSZHkKKyAgICAgKi8KKyAgICB3YWl0X1dPQyhpb2Jhc2UpOworICAgIG91dGIoaW1yQ29uZklFTkEraW1yQ29uZlJGVTEsIGlvYmFzZSArIE5FVFdBVkVfUkVHX0lNUik7CisKKyAgICAvKiBIZW50IDQgYnl0ZXMgZnJhIDB4MTcwLiBTa2FsIHZhZXJlIDBhLDI5LDg4LDM2CisgICAgICogd2FpdFdPQworICAgICAqIHNrcml2IDgwIHRpbCBkMDAwOjM2ODgKKyAgICAgKiBzamVrayBvbSBkZXQgYmxlIDgwCisgICAgICovCisgICAgCisgICAgLyogRW5hYmxlIFJlY2VpdmVyICovCisgICAgd2FpdF9XT0MoaW9iYXNlKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfRVIsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CisJCisgICAgLyogU2V0IHRoZSBJRU5BIGJpdCBpbiBDT1IgKi8KKyAgICB3YWl0X1dPQyhpb2Jhc2UpOworICAgIG91dGIoY29yQ29uZklFTkEgKyBjb3JDb25mTFZMUkVRLCBpb2Jhc2UgKyBORVRXQVZFX1JFR19DT1IpOworfQorCisvKgorICogRnVuY3Rpb24gbmV0d2F2ZV9od194bWl0IChkYXRhLCBsZW4sIGRldikgICAgCisgKi8KK3N0YXRpYyBpbnQgbmV0d2F2ZV9od194bWl0KHVuc2lnbmVkIGNoYXIqIGRhdGEsIGludCBsZW4sCisJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSogZGV2KSB7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICB1bnNpZ25lZCBpbnQgVHhGcmVlTGlzdCwKKwkgICAgICAgICBjdXJCdWZmLAorCSAgICAgICAgIE1heERhdGEsIAorICAgICAgICAgICAgICAgICBEYXRhT2Zmc2V0OworICAgIGludCB0bXBjb3VudDsgCisJCisgICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgX19pb21lbSAqIHJhbUJhc2UgPSBwcml2LT5yYW1CYXNlOworICAgIGtpb19hZGRyX3QgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICAvKiBEaXNhYmxlIGludGVycnVwdHMgJiBzYXZlIGZsYWdzICovCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgICAvKiBDaGVjayBpZiB0aGVyZSBhcmUgdHJhbnNtaXQgYnVmZmVycyBhdmFpbGFibGUgKi8KKyAgICB3YWl0X1dPQyhpb2Jhc2UpOworICAgIGlmICgoaW5iKGlvYmFzZStORVRXQVZFX1JFR19BU1IpICYgTkVUV0FWRV9BU1JfVFhCQSkgPT0gMCkgeworCS8qIE5vIGJ1ZmZlcnMgYXZhaWxhYmxlICovCisJcHJpbnRrKEtFUk5fREVCVUcgIm5ldHdhdmVfaHdfeG1pdDogJXMgLSBubyB4bWl0IGJ1ZmZlcnMgYXZhaWxhYmxlLlxuIiwKKwkgICAgICAgZGV2LT5uYW1lKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOworCXJldHVybiAxOworICAgIH0KKworICAgIHByaXYtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKworICAgIERFQlVHKDMsICJUcmFuc21pdHRpbmcgd2l0aCBTUENRICV4IFNQVSAleCBMSUYgJXggSVNQTFEgJXhcbiIsCisJICByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1NQQ1EpLAorCSAgcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19TUFUpLAorCSAgcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19MSUYpLAorCSAgcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19JU1BMUSkpOworCisgICAgLyogTm93IHRyeSB0byBpbnNlcnQgaXQgaW50byB0aGUgYWRhcHRlcnMgZnJlZSBtZW1vcnkgKi8KKyAgICB3YWl0X1dPQyhpb2Jhc2UpOworICAgIFR4RnJlZUxpc3QgPSBnZXRfdWludDE2KHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfVERQKTsKKyAgICBNYXhEYXRhICAgID0gZ2V0X3VpbnQxNihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1REUCsyKTsKKyAgICBEYXRhT2Zmc2V0ID0gZ2V0X3VpbnQxNihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1REUCs0KTsKKwkKKyAgICBERUJVRygzLCAiVHhGcmVlTGlzdCAleCwgTWF4RGF0YSAleCwgRGF0YU9mZnNldCAleFxuIiwKKwkgIFR4RnJlZUxpc3QsIE1heERhdGEsIERhdGFPZmZzZXQpOworCisgICAgLyogQ29weSBwYWNrZXQgdG8gdGhlIGFkYXB0ZXIgZnJhZ21lbnQgYnVmZmVycyAqLworICAgIGN1ckJ1ZmYgPSBUeEZyZWVMaXN0OyAKKyAgICB0bXBjb3VudCA9IDA7IAorICAgIHdoaWxlICh0bXBjb3VudCA8IGxlbikgeworCWludCB0bXBsZW4gPSBsZW4gLSB0bXBjb3VudDsgCisJY29weV90b19wYyhyYW1CYXNlICsgY3VyQnVmZiArIERhdGFPZmZzZXQsIGRhdGEgKyB0bXBjb3VudCwgCisJCSAgICh0bXBsZW4gPCBNYXhEYXRhKSA/IHRtcGxlbiA6IE1heERhdGEpOworCXRtcGNvdW50ICs9IE1heERhdGE7CisJCQkKKwkvKiBBZHZhbmNlIHRvIG5leHQgYnVmZmVyICovCisJY3VyQnVmZiA9IGdldF91aW50MTYocmFtQmFzZSArIGN1ckJ1ZmYpOworICAgIH0KKyAgICAKKyAgICAvKiBOb3cgaXNzdWUgdHJhbnNtaXQgbGlzdCAqLworICAgIHdhaXRfV09DKGlvYmFzZSk7CisgICAgd3JpdGViKE5FVFdBVkVfQ01EX1RMLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CisgICAgd3JpdGViKGxlbiAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKKyAgICB3cml0ZWIoKGxlbj4+OCkgJiAweGZmLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMik7CisgICAgd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDMpOworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXR3YXZlX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCS8qIFRoaXMgZmxhZyBpbmRpY2F0ZSB0aGF0IHRoZSBoYXJkd2FyZSBjYW4ndCBwZXJmb3JtIGEgdHJhbnNtaXNzaW9uLgorCSAqIFRoZW9yaXRpY2FsbHksIE5FVDMgY2hlY2sgaXQgYmVmb3JlIHNlbmRpbmcgYSBwYWNrZXQgdG8gdGhlIGRyaXZlciwKKwkgKiBidXQgaW4gZmFjdCBpdCBuZXZlciBkbyB0aGF0IGFuZCBwb29sIGNvbnRpbnVvdXNseS4KKwkgKiBBcyB0aGUgd2F0Y2hkb2cgd2lsbCBhYm9ydCB0b28gbG9uZyB0cmFuc21pc3Npb25zLCB3ZSBhcmUgcXVpdGUgc2FmZS4uLgorCSAqLworCisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgICAgeworCXNob3J0IGxlbmd0aCA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOworCXVuc2lnbmVkIGNoYXIqIGJ1ZiA9IHNrYi0+ZGF0YTsKKwkKKwlpZiAobmV0d2F2ZV9od194bWl0KCBidWYsIGxlbmd0aCwgZGV2KSA9PSAxKSB7CisJICAgIC8qIFNvbWUgZXJyb3IsIGxldCdzIG1ha2UgdGhlbSBjYWxsIHVzIGFub3RoZXIgdGltZT8gKi8KKwkgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwl9CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisgICAgfQorICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKKyAgICAKKyAgICByZXR1cm4gMDsKK30gLyogbmV0d2F2ZV9zdGFydF94bWl0ICovCisKKy8qCisgKiBGdW5jdGlvbiBuZXR3YXZlX2ludGVycnVwdCAoaXJxLCBkZXZfaWQsIHJlZ3MpCisgKgorICogICAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBOZXR3YXZlIGNhcmQuIFRoaXMKKyAqICAgIHJvdXRpbmUgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXI6IAorICoJICAxLiBBIHBhY2tldCBpcyByZWNlaXZlZC4KKyAqCSAgMi4gQSBwYWNrZXQgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHRyYW5zZmVycmVkIGFuZCB0aGUgdW5pdCBpcworICoJICAgICByZWFkeSB0byB0cmFuc21pdCBhbm90aGVyIHBhY2tldC4KKyAqCSAgMy4gQSBjb21tYW5kIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbmV0d2F2ZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCogZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICBraW9fYWRkcl90IGlvYmFzZTsKKyAgICB1X2NoYXIgX19pb21lbSAqcmFtQmFzZTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworICAgIHN0cnVjdCBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGRldl9saW5rX3QgKmxpbmsgPSAmcHJpdi0+bGluazsKKyAgICBpbnQgaTsKKyAgICAKKyAgICBpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJcmV0dXJuIElSUV9OT05FOworICAgIAorICAgIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIHJhbUJhc2UgPSBwcml2LT5yYW1CYXNlOworCQorICAgIC8qIE5vdyBmaW5kIHdoYXQgY2F1c2VkIHRoZSBpbnRlcnJ1cHQsIGNoZWNrIHdoaWxlIGludGVycnVwdHMgcmVhZHkgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCXVfY2hhciBzdGF0dXM7CisJCQorCXdhaXRfV09DKGlvYmFzZSk7CQorCWlmICghKGluYihpb2Jhc2UrTkVUV0FWRV9SRUdfQ0NTUikgJiAweDAyKSkKKwkgICAgYnJlYWs7IC8qIE5vbmUgb2YgdGhlIGludGVycnVwdCBzb3VyY2VzIGFzc2VydGVkIChub3JtYWwgZXhpdCkgKi8KKwkKKyAgICAgICAgc3RhdHVzID0gaW5iKGlvYmFzZSArIE5FVFdBVkVfUkVHX0FTUik7CisJCQorCWlmICghREVWX09LKGxpbmspKSB7CisJICAgIERFQlVHKDEsICJuZXR3YXZlX2ludGVycnVwdDogSW50ZXJydXB0IHdpdGggc3RhdHVzIDB4JXggIgorCQkgICJmcm9tIHJlbW92ZWQgb3Igc3VzcGVuZGVkIGNhcmQhXG4iLCBzdGF0dXMpOworCSAgICBicmVhazsKKwl9CisJCQorCS8qIFJ4UmR5ICovCisJaWYgKHN0YXR1cyAmIDB4ODApIHsKKwkgICAgbmV0d2F2ZV9yeChkZXYpOworCSAgICAvKiB3YWl0X1dPQyhpb2Jhc2UpOyAqLworCSAgICAvKiBSeFJkeSBjYW5ub3QgYmUgcmVzZXQgZGlyZWN0bHkgYnkgdGhlIGhvc3QgKi8KKwl9CisJLyogUnhFcnIgKi8KKwlpZiAoc3RhdHVzICYgMHg0MCkgeworCSAgICB1X2NoYXIgcnNlcjsKKwkJCQorCSAgICByc2VyID0gcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19SU0VSKTsJCQkKKwkgICAgCisJICAgIGlmIChyc2VyICYgMHgwNCkgeworCQkrK3ByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQ7IAorCQkrK3ByaXYtPnN0YXRzLnJ4X2NyY19lcnJvcnM7CisJICAgIH0KKwkgICAgaWYgKHJzZXIgJiAweDAyKQorCQkrK3ByaXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9yczsKKwkJCQorCSAgICAvKiBDbGVhciB0aGUgUnhFcnIgYml0IGluIFJTRVIuIFJTRVIrNCBpcyB0aGUKKwkgICAgICogd3JpdGUgcGFydC4gQWxzbyBjbGVhciB0aGUgUnhDUkMgKDB4MDQpIGFuZCAKKwkgICAgICogUnhCaWcgKDB4MDIpIGJpdHMgaWYgcHJlc2VudCAqLworCSAgICB3YWl0X1dPQyhpb2Jhc2UpOworCSAgICB3cml0ZWIoMHg0MCB8IChyc2VyICYgMHgwNiksIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfUlNFUiArIDQpOworCisJICAgIC8qIFdyaXRlIGJpdCA2IGhpZ2ggdG8gQVNDQyB0byBjbGVhciBSeEVyciBpbiBBU1IsCisJICAgICAqIFdPQyBtdXN0IGJlIHNldCBmaXJzdCEgCisJICAgICAqLworCSAgICB3YWl0X1dPQyhpb2Jhc2UpOworCSAgICB3cml0ZWIoMHg0MCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19BU0NDKTsKKworCSAgICAvKiBSZW1lbWJlciB0byBjb3VudCB1cCBwcml2LT5zdGF0cyBvbiBlcnJvciBwYWNrZXRzICovCisJICAgICsrcHJpdi0+c3RhdHMucnhfZXJyb3JzOworCX0KKwkvKiBUeEROICovCisJaWYgKHN0YXR1cyAmIDB4MjApIHsKKwkgICAgaW50IHR4U3RhdHVzOworCisJICAgIHR4U3RhdHVzID0gcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19UU0VSKTsKKwkgICAgREVCVUcoMywgIlRyYW5zbWl0IGRvbmUuIFRTRVIgPSAleCBpZCAleFxuIiwgCisJCSAgdHhTdGF0dXMsIHJlYWRiKHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfVFNFUiArIDEpKTsKKwkgICAgCisJICAgIGlmICh0eFN0YXR1cyAmIDB4MjApIHsKKwkJLyogVHJhbnNtaXR0aW5nIHdhcyBva2F5LCBjbGVhciBiaXRzICovCisJCXdhaXRfV09DKGlvYmFzZSk7CisJCXdyaXRlYigweDJmLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX1RTRVIgKyA0KTsKKwkJKytwcml2LT5zdGF0cy50eF9wYWNrZXRzOworCSAgICB9CisJCQkKKwkgICAgaWYgKHR4U3RhdHVzICYgMHhkMCkgeworCQlpZiAodHhTdGF0dXMgJiAweDgwKSB7CisJCSAgICArK3ByaXYtPnN0YXRzLmNvbGxpc2lvbnM7IC8qIEJlY2F1c2Ugb2YgL3Byb2MvbmV0L2RldiovCisJCSAgICAvKiArK3ByaXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzOyAqLworCQkgICAgLyogcHJpbnRrKCJDb2xsaXNpb24uICVsZFxuIiwgamlmZmllcyAtIGRldi0+dHJhbnNfc3RhcnQpOyAqLworCQl9CisJCWlmICh0eFN0YXR1cyAmIDB4NDApIAorCQkgICAgKytwcml2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9yczsKKwkJLyogMHg4MCBUeEdVIFRyYW5zbWl0IGdpdmV1cCAtIG5pbmUgdGltZXMgYW5kIG5vIGx1Y2sKKwkJICogMHg0MCBUeE5PQVAgTm8gYWNjZXNzIHBvaW50LiBEaXNjYXJkZWQgcGFja2V0LgorCQkgKiAweDEwIFR4RXJyIFRyYW5zbWl0IGVycm9yLiBBbHdheXMgc2V0IHdoZW4gCisJCSAqICAgICAgVHhHVSBhbmQgVHhOT0FQIGlzIHNldC4gKFRob3NlIGFyZSB0aGUgb25seSBvbmVzCisJCSAqICAgICAgdG8gc2V0IFR4RXJyKS4KKwkJICovCisJCURFQlVHKDMsICJuZXR3YXZlX2ludGVycnVwdDogVHhETiB3aXRoIGVycm9yIHN0YXR1cyAleFxuIiwgCisJCSAgICAgIHR4U3RhdHVzKTsKKwkJCisJCS8qIENsZWFyIG91dCBUeEdVLCBUeE5PQVAsIFR4RXJyIGFuZCBUeFRyeXMgKi8KKwkJd2FpdF9XT0MoaW9iYXNlKTsKKwkJd3JpdGViKDB4ZGYgJiB0eFN0YXR1cywgcmFtQmFzZStORVRXQVZFX0VSRUdfVFNFUis0KTsKKwkJKytwcml2LT5zdGF0cy50eF9lcnJvcnM7CisJICAgIH0KKwkgICAgREVCVUcoMywgIk5ldyBzdGF0dXMgaXMgVFNFUiAleCBBU1IgJXhcbiIsCisJCSAgcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19UU0VSKSwKKwkJICBpbmIoaW9iYXNlICsgTkVUV0FWRV9SRUdfQVNSKSk7CisKKwkgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKwkvKiBUeEJBLCB0aGlzIHdvdWxkIHRyaWdnZXIgb24gYWxsIGVycm9yIHBhY2tldHMgcmVjZWl2ZWQgKi8KKwkvKiBpZiAoc3RhdHVzICYgMHgwMSkgeworCSAgIERFQlVHKDQsICJUcmFuc21pdCBidWZmZXJzIGF2YWlsYWJsZSwgJXhcbiIsIHN0YXR1cyk7CisJICAgfQorCSAgICovCisgICAgfQorICAgIC8qIEhhbmRsZWQgaWYgd2UgbG9vcGVkIGF0IGxlYXN0IG9uZSB0aW1lIC0gSmVhbiBJSSAqLworICAgIHJldHVybiBJUlFfUkVUVkFMKGkpOworfSAvKiBuZXR3YXZlX2ludGVycnVwdCAqLworCisvKgorICogRnVuY3Rpb24gbmV0d2F2ZV93YXRjaGRvZyAoYSkKKyAqCisgKiAgICBXYXRjaGRvZyA6IHdoZW4gd2Ugc3RhcnQgYSB0cmFuc21pc3Npb24sIHdlIHNldCBhIHRpbWVyIGluIHRoZQorICogICAga2VybmVsLiAgSWYgdGhlIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSwgdGhpcyB0aW1lciBpcyBkaXNhYmxlZC4gSWYKKyAqICAgIGl0IGV4cGlyZSwgd2UgcmVzZXQgdGhlIGNhcmQuCisgKgorICovCitzdGF0aWMgdm9pZCBuZXR3YXZlX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKworICAgIERFQlVHKDEsICIlczogbmV0d2F2ZV93YXRjaGRvZzogd2F0Y2hkb2cgdGltZXIgZXhwaXJlZFxuIiwgZGV2LT5uYW1lKTsKKyAgICBuZXR3YXZlX3Jlc2V0KGRldik7CisgICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfSAvKiBuZXR3YXZlX3dhdGNoZG9nICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0d2F2ZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICB1cGRhdGVfc3RhdHMoZGV2KTsKKworICAgIERFQlVHKDIsICJuZXR3YXZlOiBTUENRICV4IFNQVSAleCBMSUYgJXggSVNQTFEgJXggTUhTICV4IHJ4dHggJXgiCisJICAiICV4IHR4ICV4ICV4ICV4ICV4XG4iLCAKKwkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfU1BDUSksCisJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX1NQVSksCisJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX0xJRiksCisJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX0lTUExRKSwKKwkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfTUhTKSwKKwkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfRUMgKyAweGUpLAorCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19FQyArIDB4ZiksCisJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX0VDICsgMHgxOCksCisJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX0VDICsgMHgxOSksCisJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX0VDICsgMHgxYSksCisJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX0VDICsgMHgxYikpOworCisgICAgcmV0dXJuICZwcml2LT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKyAgICAvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisvKiAgICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsgKi8KKworICAgIC8vc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CisKKy8qICAgIHByaXYtPnN0YXRzLnJ4X3BhY2tldHMgPSByZWFkYihwcml2LT5yYW1CYXNlICsgMHgxOGUpOyAKKyAgICBwcml2LT5zdGF0cy50eF9wYWNrZXRzID0gcmVhZGIocHJpdi0+cmFtQmFzZSArIDB4MThmKTsgKi8KKworICAgIC8vc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBuZXR3YXZlX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CisgICAga2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB1X2NoYXIgcnhTdGF0dXM7CisgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisgICAgdW5zaWduZWQgaW50IGN1ckJ1ZmZlciwKKwkJcmN2TGlzdDsKKyAgICBpbnQgcmN2TGVuOworICAgIGludCB0bXBjb3VudCA9IDA7CisgICAgaW50IGRhdGFDb3VudCwgZGF0YU9mZnNldDsKKyAgICBpbnQgaTsKKyAgICB1X2NoYXIgKnB0cjsKKwkKKyAgICBERUJVRygzLCAieGlud19yeDogUmVjZWl2aW5nIC4uLiBcbiIpOworCisgICAgLyogUmVjZWl2ZSBtYXggMTAgcGFja2V0cyBmb3Igbm93LiAqLworICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJLyogQW55IHBhY2tldHM/ICovCisJd2FpdF9XT0MoaW9iYXNlKTsKKwlyeFN0YXR1cyA9IHJlYWRiKHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfUlNFUik7CQkKKwlpZiAoICEoIHJ4U3RhdHVzICYgMHg4MCkpIC8qIE5vIG1vcmUgcGFja2V0cyAqLworCSAgICBicmVhazsKKwkJCisJLyogQ2hlY2sgaWYgbXVsdGljYXN0L2Jyb2FkY2FzdCBvciBvdGhlciAqLworCS8qIG11bHRpY2FzdCA9IChyeFN0YXR1cyAmIDB4MjApOyAgKi8KKwkJCisJLyogVGhlIHJlY2VpdmUgbGlzdCBwb2ludGVyIGFuZCBsZW5ndGggb2YgdGhlIHBhY2tldCAqLworCXdhaXRfV09DKGlvYmFzZSk7CisJcmN2TGVuICA9IGdldF9pbnQxNiggcmFtQmFzZSArIE5FVFdBVkVfRVJFR19SRFApOworCXJjdkxpc3QgPSBnZXRfdWludDE2KCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX1JEUCArIDIpOworCQkKKwlpZiAocmN2TGVuIDwgMCkgeworCSAgICBwcmludGsoS0VSTl9ERUJVRyAibmV0d2F2ZV9yeDogUmVjZWl2ZSBwYWNrZXQgd2l0aCBsZW4gJWRcbiIsIAorCQkgICByY3ZMZW4pOworCSAgICByZXR1cm4gMDsKKwl9CisJCQorCXNrYiA9IGRldl9hbGxvY19za2IocmN2TGVuKzUpOworCWlmIChza2IgPT0gTlVMTCkgeworCSAgICBERUJVRygxLCAibmV0d2F2ZV9yeDogQ291bGQgbm90IGFsbG9jYXRlIGFuIHNrX2J1ZmYgb2YgIgorCQkgICJsZW5ndGggJWRcbiIsIHJjdkxlbik7CisJICAgICsrcHJpdi0+c3RhdHMucnhfZHJvcHBlZDsgCisJICAgIC8qIFRlbGwgdGhlIGFkYXB0ZXIgdG8gc2tpcCB0aGUgcGFja2V0ICovCisJICAgIHdhaXRfV09DKGlvYmFzZSk7CisJICAgIHdyaXRlYihORVRXQVZFX0NNRF9TUlAsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKKwkgICAgd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOworCSAgICByZXR1cm4gMDsKKwl9CisKKwlza2JfcmVzZXJ2ZSggc2tiLCAyKTsgIC8qIEFsaWduIElQIG9uIDE2IGJ5dGUgKi8KKwlza2JfcHV0KCBza2IsIHJjdkxlbik7CisJc2tiLT5kZXYgPSBkZXY7CisKKwkvKiBDb3B5IHBhY2tldCBmcmFnbWVudHMgdG8gdGhlIHNrYiBkYXRhIGFyZWEgKi8KKwlwdHIgPSAodV9jaGFyKikgc2tiLT5kYXRhOworCWN1ckJ1ZmZlciA9IHJjdkxpc3Q7CisJdG1wY291bnQgPSAwOyAKKwl3aGlsZSAoIHRtcGNvdW50IDwgcmN2TGVuKSB7CisJICAgIC8qIEdldCBsZW5ndGggYW5kIG9mZnNldCBvZiBjdXJyZW50IGJ1ZmZlciAqLworCSAgICBkYXRhQ291bnQgID0gZ2V0X3VpbnQxNiggcmFtQmFzZStjdXJCdWZmZXIrMik7CisJICAgIGRhdGFPZmZzZXQgPSBnZXRfdWludDE2KCByYW1CYXNlK2N1ckJ1ZmZlcis0KTsKKwkJCisJICAgIGNvcHlfZnJvbV9wYyggcHRyICsgdG1wY291bnQsCisJCQkgIHJhbUJhc2UrY3VyQnVmZmVyK2RhdGFPZmZzZXQsIGRhdGFDb3VudCk7CisKKwkgICAgdG1wY291bnQgKz0gZGF0YUNvdW50OworCQkKKwkgICAgLyogUG9pbnQgdG8gbmV4dCBidWZmZXIgKi8KKwkgICAgY3VyQnVmZmVyID0gZ2V0X3VpbnQxNihyYW1CYXNlICsgY3VyQnVmZmVyKTsKKwl9CisJCisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCS8qIFF1ZXVlIHBhY2tldCBmb3IgbmV0d29yayBsYXllciAqLworCW5ldGlmX3J4KHNrYik7CisKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlwcml2LT5zdGF0cy5yeF9ieXRlcyArPSByY3ZMZW47CisKKwkvKiBHb3QgdGhlIHBhY2tldCwgdGVsbCB0aGUgYWRhcHRlciB0byBza2lwIGl0ICovCisJd2FpdF9XT0MoaW9iYXNlKTsKKwl3cml0ZWIoTkVUV0FWRV9DTURfU1JQLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CisJd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOworCURFQlVHKDMsICJQYWNrZXQgcmVjZXB0aW9uIG9rXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmV0d2F2ZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKyAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGRldl9saW5rX3QgKmxpbmsgPSAmcHJpdi0+bGluazsKKworICAgIERFQlVHKDEsICJuZXR3YXZlX29wZW46IHN0YXJ0aW5nLlxuIik7CisgICAgCisgICAgaWYgKCFERVZfT0sobGluaykpCisJcmV0dXJuIC1FTk9ERVY7CisKKyAgICBsaW5rLT5vcGVuKys7CisKKyAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworICAgIG5ldHdhdmVfcmVzZXQoZGV2KTsKKwkKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXR3YXZlX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKyAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGRldl9saW5rX3QgKmxpbmsgPSAmcHJpdi0+bGluazsKKworICAgIERFQlVHKDEsICJuZXR3YXZlX2Nsb3NlOiBmaW5pc2hpbmcuXG4iKTsKKworICAgIGxpbmstPm9wZW4tLTsKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIG5ldHdhdmVfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSAibmV0d2F2ZV9jcyIsCisJfSwKKwkuYXR0YWNoCQk9IG5ldHdhdmVfYXR0YWNoLAorCS5kZXRhY2gJCT0gbmV0d2F2ZV9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25ldHdhdmVfY3Modm9pZCkKK3sKKwlyZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmbmV0d2F2ZV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9uZXR3YXZlX2NzKHZvaWQpCit7CisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZuZXR3YXZlX2RyaXZlcik7CisJQlVHX09OKGRldl9saXN0ICE9IE5VTEwpOworfQorCittb2R1bGVfaW5pdChpbml0X25ldHdhdmVfY3MpOworbW9kdWxlX2V4aXQoZXhpdF9uZXR3YXZlX2NzKTsKKworLyogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgICBudW1fYWRkcnMgPT0gLTEJUHJvbWlzY3VvdXMgbW9kZSwgcmVjZWl2ZSBhbGwgcGFja2V0cworICAgbnVtX2FkZHJzID09IDAJTm9ybWFsIG1vZGUsIGNsZWFyIG11bHRpY2FzdCBsaXN0CisgICBudW1fYWRkcnMgPiAwCU11bHRpY2FzdCBtb2RlLCByZWNlaXZlIG5vcm1hbCBhbmQgTUMgcGFja2V0cywgYW5kIGRvCisgICBiZXN0LWVmZm9ydCBmaWx0ZXJpbmcuCisgKi8KK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGtpb19hZGRyX3QgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgX19pb21lbSAqIHJhbUJhc2UgPSBwcml2LT5yYW1CYXNlOworICAgIHVfY2hhciAgcmN2TW9kZSA9IDA7CisgICAKKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgICBpZiAocGNfZGVidWcgPiAyKSB7CisJc3RhdGljIGludCBvbGQ7CisJaWYgKG9sZCAhPSBkZXYtPm1jX2NvdW50KSB7CisJICAgIG9sZCA9IGRldi0+bWNfY291bnQ7CisJICAgIERFQlVHKDAsICIlczogc2V0dGluZyBSeCBtb2RlIHRvICVkIGFkZHJlc3Nlcy5cbiIsCisJCSAgZGV2LT5uYW1lLCBkZXYtPm1jX2NvdW50KTsKKwl9CisgICAgfQorI2VuZGlmCisJCisgICAgaWYgKGRldi0+bWNfY291bnQgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJLyogTXVsdGljYXN0IE1vZGUgKi8KKwlyY3ZNb2RlID0gcnhDb25mUnhFbmEgKyByeENvbmZBTVAgKyByeENvbmZCY2FzdDsKKyAgICB9IGVsc2UgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCS8qIFByb21pc2NvdXMgbW9kZSAqLworCXJjdk1vZGUgPSByeENvbmZSeEVuYSArIHJ4Q29uZlBybyArIHJ4Q29uZkFNUCArIHJ4Q29uZkJjYXN0OworICAgIH0gZWxzZSB7CisJLyogTm9ybWFsIG1vZGUgKi8KKwlyY3ZNb2RlID0gcnhDb25mUnhFbmEgKyByeENvbmZCY2FzdDsKKyAgICB9CisJCisgICAgLyogcHJpbnRrKCJuZXR3YXZlIHNldF9tdWx0aWNhc3RfbGlzdDogcmN2TW9kZSB0byAleFxuIiwgcmN2TW9kZSk7Ki8KKyAgICAvKiBOb3cgc2V0IHJlY2VpdmUgbW9kZSAqLworICAgIHdhaXRfV09DKGlvYmFzZSk7CisgICAgd3JpdGViKE5FVFdBVkVfQ01EX1NSQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOworICAgIHdyaXRlYihyY3ZNb2RlLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CisgICAgd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDIpOworfQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYTMyNDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmMKQEAgLTAsMCArMSw0MjQzIEBACisvKiBvcmlub2NvLmMgLSAoZm9ybWVybHkga25vd24gYXMgZGxkd2RfY3MuYyBhbmQgb3Jpbm9jb19jcy5jKQorICoKKyAqIEEgZHJpdmVyIGZvciBIZXJtZXMgb3IgUHJpc20gMiBjaGlwc2V0IGJhc2VkIFBDTUNJQSB3aXJlbGVzcworICogYWRhcHRvcnMsIHdpdGggTHVjZW50L0FnZXJlLCBJbnRlcnNpbCBvciBTeW1ib2wgZmlybXdhcmUuCisgKgorICogQ3VycmVudCBtYWludGFpbmVycyAoYXMgb2YgMjkgU2VwdGVtYmVyIDIwMDMpIGFyZToKKyAqIAlQYXZlbCBSb3NraW4gPHByb3NraSBBVCBnbnUub3JnPgorICogYW5kCURhdmlkIEdpYnNvbiA8aGVybWVzIEFUIGdpYnNvbi5kcm9wYmVhci5pZC5hdT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IERhdmlkIEdpYnNvbiwgSUJNIENvcnBvcmF0aW9uIDIwMDEtMjAwMy4KKyAqIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBHaWJzb24sIExpbnV4Y2FyZSBBdXN0cmFsaWEuCisgKglXaXRoIHNvbWUgaGVscCBmcm9tIDoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBKZWFuIFRvdXJyaWxoZXMsIEhQIExhYnMKKyAqIENvcHlyaWdodCAoQykgMjAwMSBCZW5qYW1pbiBIZXJyZW5zY2htaWR0CisgKgorICogQmFzZWQgb24gZHVtbXlfY3MuYyAxLjI3IDIwMDAvMDYvMTIgMjE6Mjc6MjUKKyAqCisgKiBQb3J0aW9ucyBiYXNlZCBvbiB3dmxhbl9jcy5jIDEuMC42LCBDb3B5cmlnaHQgQW5kcmVhcyBOZXVoYXVzIDxhbmR5CisgKiBBVCBmYXN0YS5maC1kb3J0bXVuZC5kZT4KKyAqICAgICAgaHR0cDovL3d3dy5zdHVkLmZoLWRvcnRtdW5kLmRlL35hbmR5L3d2bGFuLworICoKKyAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4KKyAqIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlCisgKiBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KKyAqCisgKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiCisgKiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlCisgKiB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBUaGUgaW5pdGlhbCBkZXZlbG9wZXIgb2YgdGhlIG9yaWdpbmFsIGNvZGUgaXMgRGF2aWQgQS4gSGluZHMKKyAqIDxkYWhpbmRzIEFUIHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4uICBQb3J0aW9ucyBjcmVhdGVkIGJ5IERhdmlkCisgKiBBLiBIaW5kcyBhcmUgQ29weXJpZ2h0IChDKSAxOTk5IERhdmlkIEEuIEhpbmRzLiAgQWxsIFJpZ2h0cworICogUmVzZXJ2ZWQuCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluCisgKiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUKKyAqIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCisgKiBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyCisgKiB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5CisgKiBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQKKyAqIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZQorICogcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCisgKiB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLiAgKi8KKworLyoKKyAqIHYwLjAxIC0+IHYwLjAyIC0gMjEvMy8yMDAxIC0gSmVhbiBJSQorICoJbyBBbGxvdyB0byB1c2UgcmVndWxhciBldGhYIGRldmljZSBuYW1lIGluc3RlYWQgb2YgZGxkd2RYCisgKglvIFdhcm5pbmcgb24gSUJTUyB3aXRoIEVTU0lEPWFueSBmb3IgZmlybXdhcmUgNi4wNgorICoJbyBQdXQgcHJvcGVyIHJhbmdlLnRocm91Z2hwdXQgdmFsdWVzIChvcHRpbWlzdGljKQorICoJbyBJV1NQWSBzdXBwb3J0IChJT0NUTCBhbmQgc3RhdCBnYXRoZXIgaW4gUnggcGF0aCkKKyAqCW8gQWxsb3cgc2V0dGluZyBmcmVxdWVuY3kgaW4gQWQtSG9jIG1vZGUKKyAqCW8gRGlzYWJsZSBXRVAgc2V0dGluZyBpZiAhaGFzX3dlcCB0byB3b3JrIG9uIG9sZCBmaXJtd2FyZQorICoJbyBGaXggdHhwb3dlciByYW5nZQorICoJbyBTdGFydCBhZGRpbmcgc3VwcG9ydCBmb3IgU2Ftc3VuZy9Db21wYXEgZmlybXdhcmUKKyAqCisgKiB2MC4wMiAtPiB2MC4wMyAtIDIzLzMvMjAwMSAtIEplYW4gSUkKKyAqCW8gU3RhcnQgYWRkaW5nIFN5bWJvbCBzdXBwb3J0IC0gbmVlZCB0byBjaGVjayBhbGwgdGhhdAorICoJbyBGaXggUHJpc20yL1N5bWJvbCBXRVAgdG8gYWNjZXB0IDEyOCBiaXRzIGtleXMKKyAqCW8gQWRkIFN5bWJvbCBXRVAgKGFkZCBhdXRoZW50aWNhdGlvbiB0eXBlKQorICoJbyBBZGQgUHJpc20yL1N5bWJvbCByYXRlCisgKglvIEFkZCBQTSB0aW1lb3V0IChob2xkb3ZlciBkdXJhdGlvbikKKyAqCW8gRW5hYmxlICJpd2NvbmZpZyBldGgwIGtleSBvZmYiIGFuZCBmcmllbmRzICh0b2dnbGUgZmxhZ3MpCisgKglvIEVuYWJsZSAiaXdjb25maWcgZXRoMCBwb3dlciB1bmljYXN0L2FsbCIgKHRvZ2dsZSBmbGFncykKKyAqCW8gVHJ5IHdpdGggYW4gSW50ZWwgY2FyZC4gSXQgcmVwb3J0IGZpcm13YXJlIDEuMDEsIGJlaGF2ZSBsaWtlCisgKgkgIGFuIGFudGlxdWF0ZWQgZmlybXdhcmUsIGhvd2V2ZXIgb24gd2luZG93cyBpdCBzYXlzIDIuMDAuIFl1Y2sgIQorICoJbyBXb3JrYXJvdW5kIGZpcm13YXJlIGJ1ZyBpbiBhbGxvY2F0ZSBidWZmZXIgKEludGVsIDEuMDEpCisgKglvIEZpbmlzaCBleHRlcm5hbCByZW5hbWluZyB0byBvcmlub2NvLi4uCisgKglvIFRlc3Rpbmcgd2l0aCB2YXJpb3VzIFdhdmVsYW4gZmlybXdhcmVzCisgKgorICogdjAuMDMgLT4gdjAuMDQgLSAzMC8zLzIwMDEgLSBKZWFuIElJCisgKglvIFVwZGF0ZSB0byBXaXJlbGVzcyAxMSAtPiBhZGQgcmV0cnkgbGltaXQvbGlmZXRpbWUgc3VwcG9ydAorICoJbyBUZXN0ZWQgd2l0aCBhIEQtTGluayBEV0wgNjUwIGNhcmQsIGZpbGwgaW4gZmlybXdhcmUgc3VwcG9ydAorICoJbyBXYXJuaW5nIG9uIFZjYyBtaXNtYXRjaCAoRC1MaW5rIDMuM3YgY2FyZCBpbiBMdWNlbnQgNXYgb25seSBzbG90KQorICoJbyBGaXhlZCB0aGUgUHJpc20yIFdFUCBidWdzIHRoYXQgSSBpbnRyb2R1Y2VkIGluIHYwLjAzIDotKAorICoJICBJdCB3b3JrcyBvbiBELUxpbmsgKm9ubHkqIGFmdGVyIGEgdGNwZHVtcC4gV2VpcmQuLi4KKyAqCSAgQW5kIHN0aWxsIGRvZXNuJ3Qgd29yayBvbiBJbnRlbCBjYXJkLiBHcnJyci4uLgorICoJbyBVcGRhdGUgdGhlIG1vZGUgYWZ0ZXIgYSBzZXRwb3J0MworICoJbyBBZGQgcHJlYW1ibGUgc2V0dGluZyBmb3IgU3ltYm9sIGNhcmRzIChub3QgeWV0IGVuYWJsZWQpCisgKglvIERvbid0IGNvbXBsYWluIGFzIG11Y2ggYWJvdXQgU3ltYm9sIGNhcmRzLi4uCisgKgorICogdjAuMDQgLT4gdjAuMDRiIC0gMjIvNC8yMDAxIC0gRGF2aWQgR2lic29uCisgKiAgICAgIG8gUmVtb3ZlZCB0aGUgJ2V0aCcgcGFyYW1ldGVyIC0gYWx3YXlzIHVzZSBldGhYWCBhcyB0aGUKKyAqICAgICAgICBpbnRlcmZhY2UgbmFtZSBpbnN0ZWFkIG9mIGRsZHdkWFguICBUaGUgb3RoZXIgd2FzIHJhY3kKKyAqICAgICAgICBhbnl3YXkuCisgKglvIENsZWFuIHVwIFJJRCBkZWZpbml0aW9ucyBpbiBoZXJtZXMuaCwgb3RoZXIgY2xlYW51cHMKKyAqCisgKiB2MC4wNGIgLT4gdjAuMDRjIC0gMjQvNC8yMDAxIC0gSmVhbiBJSQorICoJbyBUaW0gSHVybGV5IDx0aW1zdGVyIEFUIHNlaWtpLmJsaXp0ZWNoLmNvbT4gcmVwb3J0ZWQgYSBELUxpbmsgY2FyZAorICoJICB3aXRoIHZlbmRvciAwMiBhbmQgZmlybXdhcmUgMC4wOC4gQWRkZWQgaW4gdGhlIGNhcGFiaWxpdGllcy4uLgorICoJbyBUZXN0ZWQgTHVjZW50IGZpcm13YXJlIDcuMjgsIGV2ZXJ5dGhpbmcgd29ya3MuLi4KKyAqCisgKiB2MC4wNGMgLT4gdjAuMDUgLSAzLzUvMjAwMSAtIEJlbmphbWluIEhlcnJlbnNjaG1pZHQKKyAqCW8gU3Bpbi1vZmYgUGNtY2lhIGNvZGUuIFRoaXMgZmlsZSBpcyByZW5hbWVkIG9yaW5vY28uYywKKyAqCSAgYW5kIG9yaW5vY29fY3MuYyBub3cgY29udGFpbnMgb25seSB0aGUgUGNtY2lhIHNwZWNpZmljIHN0dWZmCisgKglvIEFkZCBBaXJwb3J0IGRyaXZlciBzdXBwb3J0IG9uIHRvcCBvZiBvcmlub2NvLmMgKHNlZSBhaXJwb3J0LmMpCisgKgorICogdjAuMDUgLT4gdjAuMDVhIC0gNC81LzIwMDEgLSBKZWFuIElJCisgKglvIFJldmVydCB0byBvbGQgUGNtY2lhIGNvZGUgdG8gZml4IGJyZWFrYWdlIG9mIEJlbidzIGNoYW5nZXMuLi4KKyAqCisgKiB2MC4wNWEgLT4gdjAuMDViIC0gNC81LzIwMDEgLSBKZWFuIElJCisgKglvIGFkZCBtb2R1bGUgcGFyYW1ldGVyICdpZ25vcmVfY2lzX3ZjYycgZm9yIEQtTGluayBAIDVWCisgKglvIEQtTGluayBmaXJtd2FyZSBkb2Vzbid0IHN1cHBvcnQgbXVsdGljYXN0LiBXZSBqdXN0IHByaW50IGEgZmV3CisgKgkgIGVycm9yIG1lc3NhZ2VzLCBidXQgb3RoZXJ3aXNlIGV2ZXJ5dGhpbmcgd29ya3MuLi4KKyAqCW8gRm9yIERhdmlkIDogc2V0L2dldHBvcnQzIHdvcmtzIGZpbmUsIGp1c3QgdXBncmFkZSBpd3ByaXYuLi4KKyAqCisgKiB2MC4wNWIgLT4gdjAuMDVjIC0gNS81LzIwMDEgLSBCZW5qYW1pbiBIZXJyZW5zY2htaWR0CisgKglvIEFkYXB0IGFpcnBvcnQuYyB0byBsYXRlc3QgY2hhbmdlcyBpbiBvcmlub2NvLmMKKyAqCW8gUmVtb3ZlIGRlZmVycmVkIHBvd2VyIGVuYWJsaW5nIGNvZGUKKyAqCisgKiB2MC4wNWMgLT4gdjAuMDVkIC0gNS81LzIwMDEgLSBKZWFuIElJCisgKglvIFdvcmthcm91bmQgdG8gU05BUCBkZWNhcHN1bGF0ZSBmcmFtZSBmcm9tIExpbmtzeXMgQVAKKyAqCSAgb3JpZ2luYWwgcGF0Y2ggZnJvbSA6IERvbmcgTGl1IDxkbGl1IEFUIHJlc2VhcmNoLmJlbGwtbGFicy5jb20+CisgKgkgIChub3RlIDogdGhlIG1lbWNtcCBidWcgd2FzIG1pbmUgLSBmaXhlZCkKKyAqCW8gUmVtb3ZlIHNldF9yZXRyeSBzdHVmZiwgbm8gZmlybXdhcmUgc3VwcG9ydCBpdCAoYmxvYXQtLSkuCisgKgorICogdjAuMDVkIC0+IHYwLjA2IC0gMjUvNS8yMDAxIC0gSmVhbiBJSQorICoJCU9yaWdpbmFsIHBhdGNoIGZyb20gIkhvbmcgTGluIiA8YWxpbiBBVCByZWRoYXQuY29tPiwKKyAqCQkiSWFuIEtpbm5lciIgPGlraW5uZXIgQVQgcmVkaGF0LmNvbT4KKyAqCQlhbmQgIkRhdmlkIFNtaXRoIiA8ZHNtaXRoIEFUIHJlZGhhdC5jb20+CisgKglvIEluaXQgb2YgcHJpdi0+dHhfcmF0ZV9jdHJsIGluIGZpcm13YXJlIHNwZWNpZmljIHNlY3Rpb24uCisgKglvIFByaXNtMi9TeW1ib2wgcmF0ZSwgdXB0byBzaG91bGQgYmUgMHhGIGFuZCBub3QgMHgxNS4gRG9oICEKKyAqCW8gU3BlY3RydW0gY2FyZCBhbHdheXMgbmVlZCBjb3JfcmVzZXQgKGZvciBldmVyeSByZXNldCkKKyAqCW8gRml4IGNvcl9yZXNldCB0byBub3QgbG9zZSBiaXQgNyBpbiB0aGUgcmVnaXN0ZXIKKyAqCW8gZmx1c2hfc3RhbGVfbGlua3MgdG8gcmVtb3ZlIHpvbWJpZSBQY21jaWEgaW5zdGFuY2VzCisgKglvIEFjayBwcmV2aW91cyBoZXJtZXMgZXZlbnQgYmVmb3JlIHJlc2V0CisgKgkJTWUgKHdpdGggbXkgbGl0dGxlIGhhbmRzKQorICoJbyBBbGxvdyBvcmlub2NvLmMgdG8gY2FsbCBjb3JfcmVzZXQgdmlhIHByaXYtPmNhcmRfcmVzZXRfaGFuZGxlcgorICoJbyBBZGQgcHJpdi0+bmVlZF9jYXJkX3Jlc2V0IHRvIHRvZ2dsZSB0aGlzIGZlYXR1cmUKKyAqCW8gRml4IHZhcmlvdXMgYnVnbGV0cyB3aGVuIHNldHRpbmcgV0VQIGluIFN5bWJvbCBmaXJtd2FyZQorICoJICBOb3csIGVuY3J5cHRpb24gaXMgZnVsbHkgZnVuY3Rpb25hbCBvbiBTeW1ib2wgY2FyZHMuIFlvdXBpICEKKyAqCisgKiB2MC4wNiAtPiB2MC4wNmIgLSAyNS81LzIwMDEgLSBKZWFuIElJCisgKglvIElCU1Mgb24gU3ltYm9sIHVzZSBwb3J0X21vZGUgPSA0LiBQbGVhc2UgZG9uJ3QgYXNrLi4uCisgKgorICogdjAuMDZiIC0+IHYwLjA2YyAtIDI5LzUvMjAwMSAtIEplYW4gSUkKKyAqCW8gU2hvdyBmaXJzdCBzcHkgYWRkcmVzcyBpbiAvcHJvYy9uZXQvd2lyZWxlc3MgZm9yIElCU1MgbW9kZSBhcyB3ZWxsCisgKgorICogdjAuMDZjIC0+IHYwLjA2ZCAtIDYvNy8yMDAxIC0gRGF2aWQgR2lic29uCisgKiAgICAgIG8gQ2hhbmdlIGEgYnVuY2ggb2YgS0VSTl9JTkZPIG1lc3NhZ2VzIHRvIEtFUk5fREVCVUcsIGFzIHBlciBMaW51cycKKyAqICAgICAgICB3aXNoZXMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgdW5uZWNlc3NhcnkgbWVzc2FnZXMuCisgKglvIFJlbW92ZWQgYm9ndXMgbWVzc2FnZSBvbiBDUkMgZXJyb3IuCisgKglvIE1lcmdlZCBmaXhlcyBmb3IgdjAuMDggUHJpc20gMiBmaXJtd2FyZSBmcm9tIFdpbGxpYW0gV2FnaG9ybgorICoJICA8d2lsbHdhZ2hvcm4gQVQgeWFob28uY28udWs+CisgKglvIFNsaWdodCBjbGVhbnVwL3JlLWFycmFuZ2VtZW50IG9mIGZpcm13YXJlIGRldGVjdGlvbiBjb2RlLgorICoKKyAqIHYwLjA2ZCAtPiB2MC4wNmUgLSAxLzgvMjAwMSAtIERhdmlkIEdpYnNvbgorICoJbyBSZW1vdmVkIHNvbWUgcmVkdW5kYW50IGdsb2JhbCBpbml0aWFsaXplcnMgKG9yaW5vY29fY3MuYykuCisgKglvIEFkZGVkIHNvbWUgbW9kdWxlIG1ldGFkYXRhCisgKgorICogdjAuMDZlIC0+IHYwLjA2ZiAtIDE0LzgvMjAwMSAtIERhdmlkIEdpYnNvbgorICoJbyBXb3JkaW5nIGZpeCB0byBsaWNlbnNlCisgKglvIEFkZGVkIGEgJ3VzZV9hbHRlcm5hdGVfZW5jYXBzJyBtb2R1bGUgcGFyYW1ldGVyIGZvciBBUHMgd2hpY2ggbmVlZCBhbgorICoJICBvdWkgb2YgMDA6MDA6MDAuICBXZSByZWFsbHkgbmVlZCBhIGJldHRlciB3YXkgb2YgaGFuZGxpbmcgdGhpcywgYnV0CisgKgkgIHRoZSBtb2R1bGUgZmxhZyBpcyBiZXR0ZXIgdGhhbiBub3RoaW5nIGZvciBub3cuCisgKgorICogdjAuMDZmIC0+IHYwLjA3IC0gMjAvOC8yMDAxIC0gRGF2aWQgR2lic29uCisgKglvIFJlbW92ZWQgQkFQIGVycm9yIHJldHJpZXMgZnJvbSBoZXJtZXNfYmFwX3NlZWsoKS4gIEZvciBUeCB3ZSBub3cKKyAqCSAgbGV0IHRoZSB1cHBlciBsYXllcnMgaGFuZGxlIHRoZSByZXRyeSwgd2UgcmV0cnkgZXhwbGljaXRseSBpbiB0aGUKKyAqCSAgUnggcGF0aCwgYnV0IGRvbid0IG1ha2UgYXMgbXVjaCBub2lzZSBhYm91dCBpdC4KKyAqCW8gRmlybXdhcmUgZGV0ZWN0aW9uIGNsZWFudXBzLgorICoKKyAqIHYwLjA3IC0+IHYwLjA3YSAtIDEvMTAvMzAwMSAtIEplYW4gSUkKKyAqCW8gQWRkIGNvZGUgdG8gcmVhZCBTeW1ib2wgZmlybXdhcmUgcmV2aXNpb24sIGluc3BpcmVkIGJ5IGxhdGVzdCBjb2RlCisgKgkgIGluIFNwZWN0cnVtMjQgYnkgTGVlIEpvaG4gS2V5c2VyLUFsbGVuIC0gVGhhbmtzIExlZSAhCisgKglvIFRoYW5rcyB0byBKYXJlZCBWYWxlbnRpbmUgPGhpZGRlbiBBVCB4bWlzc2lvbi5jb20+IGZvciAicHJvdmlkaW5nIiBtZQorICoJICBhIDNDb20gY2FyZCB3aXRoIGEgcmVjZW50IGZpcm13YXJlLCBmaWxsIG91dCBTeW1ib2wgZmlybXdhcmUKKyAqCSAgY2FwYWJpbGl0aWVzIG9mIGxhdGVzdCByZXYgKDIuMjApLCBhcyB3ZWxsIGFzIG9sZGVyIFN5bWJvbCBjYXJkcy4KKyAqCW8gRGlzYWJsZSBQb3dlciBNYW5hZ2VtZW50IGluIG5ld2VyIFN5bWJvbCBmaXJtd2FyZSwgdGhlIEFQSSAKKyAqCSAgaGFzIGNoYW5nZWQgKGRvY3VtZW50YXRpb24gbmVlZGVkKS4KKyAqCisgKiB2MC4wN2EgLT4gdjAuMDggLSAzLzEwLzIwMDEgLSBEYXZpZCBHaWJzb24KKyAqCW8gRml4ZWQgYSBwb3NzaWJsZSBidWZmZXIgb3ZlcnJ1biBmb3VuZCBieSB0aGUgU3RhbmZvcmQgY2hlY2tlciAoaW4KKyAqCSAgZGxkd2RfaW9jdGxfc2V0aXdlbmNvZGUoKSkuICBDYW4gb25seSBiZSBjYWxsZWQgYnkgcm9vdCBhbnl3YXksIHNvIG5vdAorICoJICBhIGJpZyBwcm9ibGVtLgorICoJbyBUdXJuZWQgaGFzX2JpZ193ZXAgb24gZm9yIEludGVyc2lsIGNhcmRzLiAgVGhhdCdzIG5vdCB0cnVlIGZvciBhbGwgb2YKKyAqCSAgdGhlbSBidXQgd2Ugc2hvdWxkIGF0IGxlYXN0IGxldCB0aGUgY2FwYWJsZSBvbmVzIHRyeS4KKyAqCW8gV2FpdCBmb3IgQlVTWSB0byBjbGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIGhlcm1lc19iYXBfc2VlaygpLiAgSQorICoJICByZWFsaXplZCB0aGF0IG15IGFzc3VtcHRpb24gdGhhdCB0aGUgZHJpdmVyJ3Mgc2VyaWFsaXphdGlvbgorICoJICB3b3VsZCBwcmV2ZW50IHRoZSBCQVAgYmVpbmcgYnVzeSBvbiBlbnRyeSB3YXMgcG9zc2libHkgZmFsc2UsIGJlY2F1c2UKKyAqCSAgdGhpbmdzIG90aGVyIHRoYW4gc2Vla3MgbWF5IG1ha2UgdGhlIEJBUCBidXN5LgorICoJbyBVc2UgImFsdGVybmF0ZSIgKG91aSAwMDowMDowMCkgZW5jYXBzdWxhdGlvbiBieSBkZWZhdWx0LgorICoJICBTZXR0aW5nIHVzZV9vbGRfZW5jYXBzIHdpbGwgbWltaWMgdGhlIG9sZCBiZWhhdmlvdXIsIGJ1dCBJIHRoaW5rIHdlCisgKgkgIHdpbGwgYmUgYWJsZSB0byBlbGltaW5hdGUgdGhpcy4KKyAqCW8gRG9uJ3QgdHJ5IHRvIG1ha2UgX19pbml0ZGF0YSBjb25zdCAodGhlIHZlcnNpb24gc3RyaW5nKS4gIFRoaXMgY2FuJ3QKKyAqCSAgd29yayBiZWNhdXNlIG9mIHRoZSB3YXkgdGhlIF9faW5pdGRhdGEgc2VjdGlvbmluZyB3b3Jrcy4KKyAqCW8gQWRkZWQgTU9EVUxFX0xJQ0VOU0UgdGFncy4KKyAqCW8gU3VwcG9ydCBmb3IgUExYICh0cmFuc3BhcmVudCBQQ01DSUEtPlBDSSBicmlkZ2UpIGNhcmRzLgorICoJbyBDaGFuZ2VkIHRvIHVzaW5nIHRoZSBuZXcgdHlwZS1mYXNjaXN0IG1pbi9tYXguCisgKgorICogdjAuMDggLT4gdjAuMDhhIC0gOS8xMC8yMDAxIC0gRGF2aWQgR2lic29uCisgKglvIEluc2VydGVkIHNvbWUgbWlzc2luZyBhY2tub3dsZWRnZW1lbnRzL2luZm8gaW50byB0aGUgQ2hhbmdlbG9nLgorICoJbyBGaXhlZCBzb21lIGJ1Z3MgaW4gdGhlIG5vcm1hbGl6YXRpb24gb2Ygc2lnbmFsIGxldmVsIHJlcG9ydGluZy4KKyAqCW8gRml4ZWQgYmFkIGJ1ZyBpbiBXRVAga2V5IGhhbmRsaW5nIG9uIEludGVyc2lsIGFuZCBTeW1ib2wgZmlybXdhcmUsCisgKgkgIHdoaWNoIGxlZCB0byBhbiBpbnN0YW50IGNyYXNoIG9uIGJpZy1lbmRpYW4gbWFjaGluZXMuCisgKgorICogdjAuMDhhIC0+IHYwLjA4YiAtIDIwLzExLzIwMDEgLSBEYXZpZCBHaWJzb24KKyAqCW8gTG90cyBvZiBjbGVhbnVwIGFuZCBidWdmaXhlcyBpbiBvcmlub2NvX3BseC5jCisgKglvIENsZWFudXAgdG8gaGFuZGxpbmcgb2YgVHggcmF0ZSBzZXR0aW5nLgorICoJbyBSZW1vdmVkIHN1cHBvcnQgZm9yIG9sZCBlbmNhcHN1bGF0aW9uIG1ldGhvZC4KKyAqCW8gUmVtb3ZlZCBvbGQgImRsZHdkIiBuYW1lcy4KKyAqCW8gU3BsaXQgUklEIGNvbnN0YW50cyBpbnRvIGEgbmV3IGZpbGUgaGVybWVzX3JpZC5oCisgKglvIFJlbmFtZWQgUklEIGNvbnN0YW50cyB0byBtYXRjaCBsaW51eC13bGFuLW5nIGFuZCBwcmlzbTIubworICoJbyBCdWdmaXhlcyBpbiBoZXJtZXMuYworICoJbyBQb2tlIHRoZSBQTFgncyBJTlRDU1IgcmVnaXN0ZXIsIHNvIGl0IGFjdHVhbGx5IHN0YXJ0cworICoJICBnZW5lcmF0aW5nIGludGVycnVwdHMuICBUaGVzZSBjYXJkcyBtaWdodCBhY3R1YWxseSB3b3JrIG5vdy4KKyAqCW8gVXBkYXRlIHRvIHdpcmVsZXNzIGV4dGVuc2lvbnMgdjEyIChKZWFuIElJKQorICoJbyBTdXBwb3J0IGZvciB0YWxsaWVzIGFuZCBpbnF1aXJlIGNvbW1hbmQgKEplYW4gSUkpCisgKglvIEFpcnBvcnQgdXBkYXRlcyBmb3IgbmV3ZXIgUFBDIGtlcm5lbHMgKEJlbkgpCisgKgorICogdjAuMDhiIC0+IHYwLjA5IC0gMjEvMTIvMjAwMSAtIERhdmlkIEdpYnNvbgorICoJbyBTb21lIG5ldyBQQ0kgSURzIGZvciBQTFggY2FyZHMuCisgKglvIFJlbW92ZWQgYnJva2VuIGF0dGVtcHQgdG8gZG8gQUxMTVVMVEkgcmVjZXB0aW9uLiAgSnVzdCB1c2UKKyAqCSAgcHJvbWlzY3VvdXMgbW9kZSBpbnN0ZWFkCisgKglvIFByZWxpbWluYXJ5IHdvcmsgZm9yIGxpc3QtQVAgKEplYW4gSUkpCisgKglvIEFpcnBvcnQgdXBkYXRlcyBmcm9tIChCZW5IKQorICoJbyBFbGltaW5hdGVkIHJhY3kgaHdfcmVhZHkgc3R1ZmYKKyAqCW8gRml4ZWQgZ2VuZXJhdGlvbiBvZiBmYWtlIGV2ZW50cyBpbiBpcnEgaGFuZGxlci4gIFRoaXMgc2hvdWxkCisgKgkgIGZpbmFsbHkga2lsbCB0aGUgRUlPIHByb2JsZW1zIChKZWFuIElJICYgZGdpYnNvbikKKyAqCW8gRml4ZWQgYnJlYWthZ2Ugb2YgYml0cmF0ZSBzZXQvZ2V0IG9uIEFnZXJlIGZpcm13YXJlIChKZWFuIElJKQorICoKKyAqIHYwLjA5IC0+IHYwLjA5YSAtIDIvMS8yMDAyIC0gRGF2aWQgR2lic29uCisgKglvIEZpeGVkIHN0dXBpZCBtaXN0YWtlIGluIG11bHRpY2FzdCBsaXN0IGhhbmRsaW5nLCB0cmlnZ2VyaW5nCisgKgkgIGEgQlVHKCkKKyAqCisgKiB2MC4wOWEgLT4gdjAuMDliIC0gMTYvMS8yMDAyIC0gRGF2aWQgR2lic29uCisgKglvIEZpeGVkIGV2ZW4gc3R1cGlkZXIgbWlzdGFrZSBpbiBuZXcgaW50ZXJydXB0IGhhbmRsaW5nLCB3aGljaAorICoJICBzZXJpb3VzbHkgYnJva2UgdGhpbmdzIG9uIGJpZy1lbmRpYW4gbWFjaGluZXMuCisgKglvIFJlbW92ZWQgYSBidW5jaCBvZiByZWR1bmRhbnQgaW5jbHVkZXMgYW5kIGV4cG9ydHMuCisgKglvIFJlbW92ZWQgYSByZWR1bmRhbnQgTU9EX3tJTkMsREVDfV9VU0VfQ09VTlQgcGFpciBpbiBhaXJwb3J0LmMKKyAqCW8gRG9uJ3QgYXR0ZW1wdCB0byBkbyBoYXJkd2FyZSBsZXZlbCBtdWx0aWNhc3QgcmVjZXB0aW9uIG9uCisgKgkgIEludGVyc2lsIGZpcm13YXJlLCBqdXN0IGdvIHByb21pc2MgaW5zdGVhZC4KKyAqCW8gVHlwbyBmaXhlZCBpbiBoZXJtZXNfaXNzdWVfY21kKCkKKyAqCW8gRWxpbWluYXRlZCBXSVJFTEVTU19TUFkgI2lmZGVmcworICoJbyBTdGF0dXMgY29kZSByZXBvcnRlZCBvbiBUeCBleGNlcHRpb25zCisgKglvIE1vdmVkIG5ldGlmX3dha2VfcXVldWUoKSBmcm9tIEFMTE9DIGludGVycnVwdHMgdG8gVFggYW5kIFRYRVhDCisgKgkgIGludGVycnVwdHMsIHdoaWNoIHNob3VsZCBmaXggdGhlIHRpbWVvdXRzIHdlJ3JlIHNlZWluZy4KKyAqCisgKiB2MC4wOWIgLT4gdjAuMTAgLSAyNSBGZWIgMjAwMiAtIERhdmlkIEdpYnNvbgorICoJbyBSZW1vdmVkIG5lc3RlZCBzdHJ1Y3R1cmVzIHVzZWQgZm9yIGhlYWRlciBwYXJzaW5nLCBzbyB0aGUKKyAqCSAgZHJpdmVyIHNob3VsZCBub3cgd29yayB3aXRob3V0IGhhY2tlcnkgb24gQVJNCisgKglvIEZpeCBmb3IgV0VQIGhhbmRsaW5nIG9uIEludGVyc2lsIChIYXdrIE5ld3RvbikKKyAqCW8gRWxpbWluYXRlZCB0aGUgL3Byb2MvaGVybWVzL2V0aFhYL3JlZ3MgZGVidWdnaW5nIGZpbGUuICBJdAorICoJICB3YXMgbmV2ZXIgdmVyeSB1c2VmdWwuCisgKglvIE1ha2UgUnggZXJyb3JzIGxlc3Mgbm9pc3kuCisgKgorICogdjAuMTAgLT4gdjAuMTEgLSA1IEFwciAyMDAyIC0gRGF2aWQgR2lic29uCisgKglvIExhaWQgdGhlIGdyb3VuZHdvcmsgaW4gaGVybWVzLltjaF0gZm9yIGRldmljZXMgd2hpY2ggbWFwCisgKgkgIGludG8gUENJIG1lbW9yeSBzcGFjZSByYXRoZXIgdGhhbiBJTyBzcGFjZS4KKyAqCW8gRml4ZWQgYnVnIGluIG11bHRpY2FzdCBoYW5kbGluZyAoY2xlYXJlZCBtdWx0aWNhc3QgbGlzdCB3aGVuCisgKgkgIGxlYXZpbmcgcHJvbWlzY3VvdXMgbW9kZSkuCisgKglvIFJlbGVnYXRlZCBUeCBlcnJvciBtZXNzYWdlcyB0byBkZWJ1Zy4KKyAqCW8gQ2xlYW5lZCB1cCAvIGNvcnJlY3RlZCBoYW5kbGluZyBvZiBhbGxvY2F0aW9uIGxlbmd0aHMuCisgKglvIFNldCBPV05TU0lEIGluIElCU1MgbW9kZSBmb3IgV2luWFAgaW50ZXJvcGVyYWJpbGl0eSAoamltYykuCisgKglvIENoYW5nZSB0byB1c2luZyBhbGxvY19ldGhlcmRldigpIGZvciBzdHJ1Y3R1cmUgYWxsb2NhdGlvbnMuIAorICoJbyBDaGVjayBmb3IgYW5kIGRyb3AgdW5kZXJzaXplZCBwYWNrZXRzLgorICoJbyBGaXhlZCBhIHJhY2UgaW4gc3RvcHBpbmcvd2FraW5nIHRoZSBxdWV1ZS4gIFRoaXMgc2hvdWxkIGZpeAorICoJICB0aGUgdGltZW91dCBwcm9ibGVtcyAoUGF2ZWwgUm9za2luKQorICoJbyBSZXZlcnRlZCB0byBuZXRpZl93YWtlX3F1ZXVlKCkgb24gdGhlIEFMTE9DIGV2ZW50LgorICoJbyBGaXhlcyBmb3IgcmVjZW50IFN5bWJvbCBmaXJtd2FyZXMgd2hpY2ggbGFjayBBUCBkZW5zaXR5CisgKgkgIChQYXZlbCBSb3NraW4pLgorICoKKyAqIHYwLjExIC0+IHYwLjExYSAtIDI5IEFwciAyMDAyIC0gRGF2aWQgR2lic29uCisgKglvIEhhbmRsZSBkaWZmZXJlbnQgcmVnaXN0ZXIgc3BhY2luZywgbmVjZXNzYXJ5IGZvciBQcmlzbSAyLjUKKyAqCSAgUENJIGFkYXB0b3JzIChTdGV2ZSBIaWxsKS4KKyAqCW8gQ2xlYW5lZCB1cCBpbml0aWFsaXphdGlvbiBvZiBjYXJkIHN0cnVjdHVyZXMgaW4gb3Jpbm9jb19jcworICoJICBhbmQgYWlycG9ydC4gIFJlbW92ZWQgY2FyZC0+cHJpdiBmaWVsZC4KKyAqCW8gTWFrZSByZXNwb25zZSBzdHJ1Y3R1cmUgb3B0aW9uYWwgZm9yIGhlcm1lc19kb2NtZF93YWl0KCkKKyAqCSAgUGF2ZWwgUm9za2luKQorICoJbyBBZGRlZCBQQ0kgaWQgZm9yIE5vcnRlbCBlbW9iaWxpdHkgdG8gb3Jpbm9jb19wbHguYy4KKyAqCW8gQ2xlYW51cCB0byBoYW5kbGluZyBvZiBTeW1ib2wncyBhbGxvY2F0aW9uIGJ1Zy4gKFBhdmVsIFJvc2tpbikKKyAqCW8gQ2xlYW51cHMgdG8gZmlybXdhcmUgY2FwYWJpbGl0eSBkZXRlY3Rpb24uCisgKglvIEFycmFuZ2UgZm9yIG9yaW5vY29fcGNpLmMgdG8gb3ZlcnJpZGUgZmlybXdhcmUgZGV0ZWN0aW9uLgorICoJICBXZSBzaG91bGQgYmUgYWJsZSB0byBzdXBwb3J0IHRoZSBQQ0kgSW50ZXJzaWwgY2FyZHMgbm93LgorICoJbyBDbGVhbnVwIGhhbmRsaW5nIG9mIHJlc2V0X2NvciBhbmQgaGFyZF9yZXNldCAoUGF2ZWwgUm9za2luKS4KKyAqCW8gUmVtb3ZlIGVycm9uZW91cyB1c2Ugb2YgVVNFUl9CQVAgaW4gdGhlIFR4RXhjIGhhbmRsZXIgKEpvdW5pCisgKgkgIE1hbGluZW4pLgorICoJbyBNYWtlZmlsZSBjaGFuZ2VzIGZvciBiZXR0ZXIgaW50ZWdyYXRpb24gaW50byBEYXZpZCBIaW5kcworICoJICBwY21jaWEtY3MgcGFja2FnZS4KKyAqCisgKiB2MC4xMWEgLT4gdjAuMTFiIC0gMSBNYXkgMjAwMiAtIERhdmlkIEdpYnNvbgorICoJbyBCZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIGluIG9yaW5vY29fcGx4X2luaXRfb25lKCkKKyAqCW8gRml4ZWQgbXVsdGlwbGUgYmFkIGtmcmVlKCkgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoZQorICoJICBhbGxvY19vcmlub2NvZGV2KCkgY2hhbmdlcy4KKyAqCisgKiB2MC4xMWIgLT4gdjAuMTIgLSAxOSBKdW4gMjAwMiAtIERhdmlkIEdpYnNvbgorICoJbyBTdXBwb3J0IGNoYW5naW5nIHRoZSBNQUMgYWRkcmVzcy4KKyAqCW8gQ29ycmVjdCBkaXNwbGF5IG9mIEludGVyc2lsIGZpcm13YXJlIHJldmlzaW9uIG51bWJlcnMuCisgKglvIEVudGlyZWx5IHJldmlzZWQgbG9ja2luZyBzY2hlbWUuICBTaG91bGQgYmUgYm90aCBzaW1wbGVyIGFuZAorICoJICAgYmV0dGVyLgorICoJbyBNZXJnZWQgc29tZSBjb21tb24gY29kZSBpbiBvcmlub2NvX3BseCwgb3Jpbm9jb19wY2kgYW5kCisgKgkgIGFpcnBvcnQgYnkgY3JlYXRpbmcgb3Jpbm9jb19kZWZhdWx0X3tvcGVuLHN0b3AscmVzZXR9KCkKKyAqCSAgd2hpY2ggYXJlIHVzZWQgYXMgdGhlIGRldi0+b3BlbiwgZGV2LT5zdG9wLCBwcml2LT5yZXNldAorICoJICBjYWxsYmFja3MgaWYgbm9uZSBhcmUgc3BlY2lmaWVkIHdoZW4gYWxsb2Nfb3Jpbm9jb2RldigpIGlzCisgKgkgIGNhbGxlZC4KKyAqCW8gUmVtb3ZlZCBvcmlub2NvX3BseF9pbnRlcnJ1cHQoKSBhbmQgb3Jpbm9jb19wY2lfaW50ZXJydXB0KCkuCisgKgkgIFRoZXkgZGlkbid0IGRvIGFueXRoaW5nLgorICoKKyAqIHYwLjEyIC0+IHYwLjEyYSAtIDQgSnVsIDIwMDIgLSBEYXZpZCBHaWJzb24KKyAqCW8gU29tZSByZWFycmFuZ2VtZW50IG9mIGNvZGUuCisgKglvIE51bWVyb3VzIGZpeHVwcyB0byBsb2NraW5nIGFuZCByZXN0IGhhbmRsaW5nLCBwYXJ0aWN1bGFybHkKKyAqCSAgZm9yIFBDTUNJQS4KKyAqCW8gVGhpcyBhbGxvd3Mgb3BlbiBhbmQgc3RvcCBuZXRfZGV2aWNlIG1ldGhvZHMgdG8gYmUgaW4KKyAqCSAgb3Jpbm9jby5jIG5vdywgcmF0aGVyIHRoYW4gaW4gdGhlIGluaXQgbW9kdWxlcy4KKyAqCW8gSW4gb3Jpbm9jb19jcy5jIGxpbmstPnByaXYgbm93IHBvaW50cyB0byB0aGUgc3RydWN0CisgKgkgIG5ldF9kZXZpY2Ugbm90IHRvIHRoZSBzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlLgorICoJbyBBZGRlZCBhIGNoZWNrIGZvciB1bmRlcnNpemVkIFNOQVAgZnJhbWVzLCB3aGljaCBjb3VsZCBjYXVzZQorICoJICBjcmFzaGVzLgorICoKKyAqIHYwLjEyYSAtPiB2MC4xMmIgLSAxMSBKdWwgMjAwMiAtIERhdmlkIEdpYnNvbgorICoJbyBGaXggaHctPm51bV9pbml0IHRlc3RpbmcgY29kZSwgc28gbnVtX2luaXQgaXMgYWN0dWFsbHkKKyAqCSAgaW5jcmVtZW50ZWQuCisgKglvIEZpeCB2ZXJ5IHN0dXBpZCBidWcgaW4gb3Jpbm9jb19jcyB3aGljaCBicm9rZSBjb21waWxlIHdpdGgKKyAqCSAgQ09ORklHX1NNUC4KKyAqCW8gU3F1YXNoZWQgYSB3YXJuaW5nLgorICoKKyAqIHYwLjEyYiAtPiB2MC4xMmMgLSAyNiBKdWwgMjAwMiAtIERhdmlkIEdpYnNvbgorICoJbyBDaGFuZ2UgdG8gQzlYIHN0eWxlIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXJzLgorICoJbyBBZGQgc3VwcG9ydCBmb3IgM0NvbSBBaXJDb25uZWN0IFBDSS4KKyAqCW8gTm8gbG9uZ2VyIGlnbm9yZSB0aGUgaGFyZF9yZXNldCBhcmd1bWVudCB0bworICoJICBhbGxvY19vcmlub2NvZGV2KCkuICBPb3BzLgorICoKKyAqIHYwLjEyYyAtPiB2MC4xM2JldGExIC0gMTMgU2VwIDIwMDIgLSBEYXZpZCBHaWJzb24KKyAqCW8gUmV2ZXJ0IHRoZSBicm9rZW4gMC4xMiogbG9ja2luZyBzY2hlbWUgYW5kIGdvIHRvIGEgbmV3IHlldAorICoJICBzaW1wbGVyIHNjaGVtZS4KKyAqCW8gRG8gZmlybXdhcmUgcmVzZXRzIG9ubHkgaW4gb3Jpbm9jb19pbml0KCkgYW5kIHdoZW4gd2FraW5nCisgKgkgIHRoZSBjYXJkIGZyb20gaGFyZCBzbGVlcC4KKyAqCisgKiB2MC4xM2JldGExIC0+IHYwLjEzIC0gMjcgU2VwIDIwMDIgLSBEYXZpZCBHaWJzb24KKyAqCW8gUmUtaW50cm9kdWNlZCBmdWxsIHJlc2V0cyAodmlhIHNjaGVkdWxlX3Rhc2soKSkgb24gVHgKKyAqCSAgdGltZW91dC4KKyAqCisgKiB2MC4xMyAtPiB2MC4xM2EgLSAzMCBTZXAgMjAwMiAtIERhdmlkIEdpYnNvbgorICoJbyBNaW5vciBjbGVhbnVwcyB0byBpbmZvIGZyYW1lIGhhbmRsaW5nLiAgQWRkIGJhc2ljIHN1cHBvcnQKKyAqCSAgZm9yIGxpbmtzdGF0dXMgaW5mbyBmcmFtZXMuCisgKglvIEluY2x1ZGUgcmVxdWlyZWQga2VybmVsIGhlYWRlcnMgaW4gb3Jpbm9jby5oLCB0byBhdm9pZAorICoJICBjb21waWxlIHByb2JsZW1zLgorICoKKyAqIHYwLjEzYSAtPiB2MC4xM2IgLSAxMCBGZWIgMjAwMyAtIERhdmlkIEdpYnNvbgorICoJbyBJbXBsZW1lbnRlZCBoYXJkIHJlc2V0IGZvciBBaXJwb3J0IGNhcmRzCisgKglvIEV4cGVyaW1lbnRhbCBzdXNwZW5kL3Jlc3VtZSBpbXBsZW1lbnRhdGlvbiBmb3Igb3Jpbm9jb19wY2kKKyAqCW8gQWJvbGlzaGVkIC9wcm9jIGRlYnVnZ2luZyBzdXBwb3J0LCByZXBsYWNlZCB3aXRoIGEgZGVidWdnaW5nCisgKgkgIGl3cHJpdi4gIE5vdyBpdCdzIHVnbHkgYW5kIHNpbXBsZSBpbnN0ZWFkIG9mIHVnbHkgYW5kIGNvbXBsZXguCisgKglvIEJ1Z2ZpeCBpbiBoZXJtZXMuYyBpZiB0aGUgZmlybXdhcmUgcmV0dXJuZWQgYSByZWNvcmQgbGVuZ3RoCisgKgkgIG9mIDAsIHdlIGNvdWxkIGdvIGNsb2JiZXJpbmcgbWVtb3J5LgorICoJbyBCdWdmaXggaW4gb3Jpbm9jb19zdG9wKCkgLSBpdCB1c2VkIHRvIGZhaWwgaWYgaHdfdW5hdmFpbGFibGUKKyAqCSAgd2FzIHNldCwgd2hpY2ggd2FzIHVzdWFsbHkgdHJ1ZSBvbiBQQ01DSUEgaG90IHJlbW92ZXMuCisgKiAJbyBUcmFjayBMSU5LU1RBVFVTIG1lc3NhZ2VzLCBzaWxlbnRseSBkcm9wIFR4IHBhY2tldHMgYmVmb3JlCisgKiAJICB3ZSBhcmUgY29ubmVjdGVkIChhdm9pZHMgY29uZnVzaW5nIHRoZSBmaXJtd2FyZSksIGFuZCBvbmx5CisgKiAJICBnaXZlIExJTktTVEFUVVMgcHJpbnRrKClzIGlmIHRoZSBzdGF0dXMgaGFzIGNoYW5nZWQuCisgKgorICogdjAuMTNiIC0+IHYwLjEzYyAtIDExIE1hciAyMDAzIC0gRGF2aWQgR2lic29uCisgKglvIENsZWFudXA6IHVzZSBkZXYgaW5zdGVhZCBvZiBwcml2IGluIHZhcmlvdXMgcGxhY2VzLgorICoJbyBCdWcgZml4OiBEb24ndCBSZWxlYXNlQ29uZmlndXJhdGlvbiBvbiBSRVNFVF9QSFlTSUNBTCBldmVudAorICoJICBpZiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgKGRyaXZlciBpbml0aWF0ZWQpIGhhcmQgcmVzZXQuCisgKglvIEJ1ZyBmaXg6IEVUSF9aTEVOIGlzIHN1cHBvc2VkIHRvIGluY2x1ZGUgdGhlIGhlYWRlcgorICoJICAoRGlvbnlzdXMgQmxhemFraXMgJiBNYW5pc2ggS2FyaXIpCisgKglvIENvbnZlcnQgdG8gdXNpbmcgd29ya3F1ZXVlcyBpbnN0ZWFkIG9mIHRhc2txdWV1ZXMgKGFuZAorICoJICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBtYWNyb3MgZm9yIHByZSAyLjUuNDEga2VybmVscykuCisgKglvIERyb3AgcmVkdW5kYW50IChJIHRoaW5rLi4uKSBNT0Rfe0lOQyxERUN9X1VTRV9DT1VOVCBpbgorICoJICBhaXJwb3J0LmMKKyAqCW8gTmV3IG9yaW5vY29fdG1kLmMgaW5pdCBtb2R1bGUgZnJvbSBKb2VyZyBEb3JjaGFpbiBmb3IKKyAqCSAgVE1ENzE2MCBiYXNlZCBQQ0kgdG8gUENNQ0lBIGJyaWRnZXMgKHNpbWlsYXIgdG8KKyAqCSAgb3Jpbm9jb19wbHguYykuCisgKgorICogdjAuMTNjIC0+IHYwLjEzZCAtIDIyIEFwciAyMDAzIC0gRGF2aWQgR2lic29uCisgKglvIE1ha2UgaHdfdW5hdmFpbGFibGUgYSBjb3VudGVyLCByYXRoZXIgdGhhbiBqdXN0IGEgZmxhZywgdGhpcworICoJICBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgc29tZSByYWNlcyAoc3VjaCBhcyBhIGNhcmQgYmVpbmcKKyAqCSAgcmVtb3ZlZCBpbiB0aGUgbWlkZGxlIG9mIG9yaW5vY29fcmVzZXQoKS4KKyAqCW8gUmVzdG9yZSBSZWxlYXNlL1JlcXVlc3RDb25maWd1cmF0aW9uIGluIHRoZSBQQ01DSUEgZXZlbnQgaGFuZGxlcgorICoJICB3aGVuIGRlYWxpbmcgd2l0aCBhIGRyaXZlciBpbml0aWF0ZWQgaGFyZCByZXNldC4gIFRoaXMgaXMKKyAqCSAgbmVjZXNzYXJ5IHRvIHByZXZlbnQgaGFuZ3MgZHVlIHRvIGEgc3B1cmlvdXMgaW50ZXJydXB0IHdoaWxlCisgKgkgIHRoZSByZXNldCBpcyBpbiBwcm9ncmVzcy4KKyAqCW8gQ2xlYXIgdGhlIDgwMi4xMSBoZWFkZXIgd2hlbiB0cmFuc21pdHRpbmcsIGV2ZW4gdGhvdWdoIHdlCisgKgkgIGRvbid0IHVzZSBpdC4gIFRoaXMgZml4ZXMgYSBsb25nIHN0YW5kaW5nIGJ1ZyBvbiBzb21lCisgKgkgIGZpcm13YXJlcywgd2hpY2ggc2VlbSB0byBnZXQgY29uZnVzZWQgaWYgdGhhdCBpc24ndCBkb25lLgorICoJbyBCZSBsZXNzIGVhZ2VyIHRvIGRlLWVuY2Fwc3VsYXRlIFNOQVAgZnJhbWVzLCBvbmx5IGRvIHNvIGlmCisgKgkgIHRoZSBPVUkgaXMgMDA6MDA6MDAgb3IgMDA6MDA6ZjgsIGxlYXZlIG90aGVycyBhbG9uZS4gIFRoZSBvbGQKKyAqCSAgYmVoYXZpb3VyIGJyb2tlIENEUCAoQ2lzY28gRGlzY292ZXJ5IFByb3RvY29sKS4KKyAqCW8gVXNlIGRldiBpbnN0ZWFkIG9mIHByaXYgZm9yIGZyZWVfaXJxKCkgYXMgd2VsbCBhcworICoJICByZXF1ZXN0X2lycSgpIChvb3BzKS4KKyAqCW8gQXR0ZW1wdCB0byByZXNldCByYXRoZXIgdGhhbiBnaXZpbmcgdXAgaWYgd2UgZ2V0IHRvbyBtYW55CisgKgkgIElSUXMuCisgKglvIENoYW5nZWQgc2VtYW50aWNzIG9mIF9fb3Jpbm9jb19kb3duKCkgc28gaXQgY2FuIGJlIGNhbGxlZAorICoJICBzYWZlbHkgd2l0aCBod191bmF2YWlsYWJsZSBzZXQuICBJdCBhbHNvIG5vdyBjbGVhcnMgdGhlCisgKgkgIGxpbmtzdGF0dXMgKHNpbmNlIHdlJ3JlIGdvaW5nIHRvIGhhdmUgdG8gcmVhc3NvY2lhdGUpLgorICoKKyAqIHYwLjEzZCAtPiB2MC4xM2UgLSAxMiBNYXkgMjAwMyAtIERhdmlkIEdpYnNvbgorICoJbyBTdXBwb3J0IGZvciBwb3N0LTIuNS42OCByZXR1cm4gdmFsdWVzIGZyb20gaXJxIGhhbmRsZXIuCisgKglvIEZpeGVkIGJ1ZyB3aGVyZSB1bmRlcmxlbmd0aCBwYWNrZXRzIHdvdWxkIGJlIGRvdWJsZSBjb3VudGVkCisgKgkgIGluIHRoZSByeF9kcm9wcGVkIHN0YXRpc3RpY3MuCisgKglvIFByb3ZpZGVkIGEgbW9kdWxlIHBhcmFtZXRlciB0byBzdXBwcmVzcyBsaW5rc3RhdHVzIG1lc3NhZ2VzLgorICoKKyAqIHYwLjEzZSAtPiB2MC4xNGFscGhhMSAtIDMwIFNlcCAyMDAzIC0gRGF2aWQgR2lic29uCisgKglvIFJlcGxhY2VkIHByaXYtPmNvbm5lY3RlZCBsb2dpYyB3aXRoIG5ldGlmX2NhcnJpZXJfb24vb2ZmKCkKKyAqCSAgY2FsbHMuCisgKglvIFJlbW92ZSBoYXNfaWJzc19hbnkgYW5kIG5ldmVyIHNldCB0aGUgQ1JFQVRFSUJTUyBSSUQgd2hlbgorICoJICB0aGUgRVNTSUQgaXMgZW1wdHkuICBUb28gbWFueSBmaXJtd2FyZXMgYnJlYWsgaWYgd2UgZG8uCisgKglvIDIuNiBtZXJnZXM6IFJlcGxhY2UgcGRldi0+c2xvdF9uYW1lIHdpdGggcGNpX25hbWUoKSwgcmVtb3ZlCisgKgkgIF9fZGV2aW5pdGRhdGEgZnJvbSBQQ0kgSUQgdGFibGVzLCB1c2UgZnJlZV9uZXRkZXYoKS4KKyAqCW8gRW5hYmxlZCBzaGFyZWQta2V5IGF1dGhlbnRpY2F0aW9uIGZvciBBZ2VyZSBmaXJtd2FyZSAoZnJvbQorICoJICBSb2JlcnQgSi4gTW9vcmUgPFJvYmVydC5KLk1vb3JlIEFUIGFsbGFuYmFuay5jb20+CisgKglvIE1vdmUgbmV0aWZfd2FrZV9xdWV1ZSgpIChiYWNrKSB0byB0aGUgVHggY29tcGxldGlvbiBmcm9tIHRoZQorICoJICBBTExPQyBldmVudC4gIFRoaXMgc2VlbXMgdG8gcHJldmVudC9taXRpZ2F0ZSB0aGUgcm9sbGluZworICoJICBlcnJvciAtMTEwIHByb2JsZW1zIGF0IGxlYXN0IG9uIHNvbWUgSW50ZXJzaWwgZmlybXdhcmVzLgorICoJICBUaGVvcmV0aWNhbGx5IHJlZHVjZXMgcGVyZm9ybWFuY2UsIGJ1dCBJIGNhbid0IG1lYXN1cmUgaXQuCisgKgkgIFBhdGNoIGZyb20gQW5kcmV3IFRyaWRnZWxsIDx0cmlkZ2UgQVQgc2FtYmEub3JnPgorICoKKyAqIHYwLjE0YWxwaGExIC0+IHYwLjE0YWxwaGEyIC0gMjAgT2N0IDIwMDMgLSBEYXZpZCBHaWJzb24KKyAqCW8gQ29ycmVjdGx5IHR1cm4gb2ZmIHNoYXJlZC1rZXkgYXV0aGVudGljYXRpb24gd2hlbiByZXF1ZXN0ZWQKKyAqCSAgKGJ1Z2ZpeCBmcm9tIFJvYmVydCBKLiBNb29yZSkuCisgKglvIENvcnJlY3QgYWlycG9ydCBzbGVlcCBpbnRlcmZhY2VzIGZvciBjdXJyZW50IDIuNiBrZXJuZWxzLgorICoJbyBBZGQgY29kZSBmb3Iga2V5IGNoYW5nZSB3aXRob3V0IGRpc2FibGluZy9lbmFibGluZyB0aGUgTUFDCisgKgkgIHBvcnQuICBUaGlzIGlzIHN1cHBvc2VkIHRvIGFsbG93IDgwMi4xeCB0byB3b3JrIHNhbmVseSwgYnV0CisgKgkgIGRvZXNuJ3Qgc2VlbSB0byB5ZXQuCisgKgorICogVE9ETworICoJbyBOZXcgd2lyZWxlc3MgZXh0ZW5zaW9ucyBBUEkgKHBhdGNoIGZyb20gTW91c3RhZmEKKyAqCSAgWW91c3NlZiwgdXBkYXRlZCBieSBKaW0gQ2FydGVyIGFuZCBQYXZlbCBSb3NraW4pLgorICoJbyBIYW5kbGUgZGUtZW5jYXBzdWxhdGlvbiB3aXRoaW4gbmV0d29yayBsYXllciwgcHJvdmlkZSA4MDIuMTEKKyAqCSAgaGVhZGVycyAocGF0Y2ggZnJvbSBUaG9tYXMgJ0RlbnQnIE1pcmxhY2hlcikKKyAqCW8gUkYgbW9uaXRvciBtb2RlIHN1cHBvcnQKKyAqCW8gRml4IHBvc3NpYmxlIHJhY2VzIGluIFNQWSBoYW5kbGluZy4KKyAqCW8gRGlzY29ubmVjdCB3aXJlbGVzcyBleHRlbnNpb25zIGZyb20gZnVuZGFtZW50YWwgY29uZmlndXJhdGlvbi4KKyAqCW8gKG1heWJlKSBTb2Z0d2FyZSBXRVAgc3VwcG9ydCAocGF0Y2ggZnJvbSBTdGFubyBNZWR1bmEpLgorICoJbyAobWF5YmUpIFVzZSBtdWx0aXBsZSBUeCBidWZmZXJzIC0gZHJpdmVyIGhhbmRsaW5nIHF1ZXVlCisgKgkgIHJhdGhlciB0aGFuIGZpcm13YXJlLgorICovCisKKy8qIExvY2tpbmcgYW5kIHN5bmNocm9uaXphdGlvbjoKKyAqCisgKiBUaGUgYmFzaWMgcHJpbmNpcGxlIGlzIHRoYXQgZXZlcnl0aGluZyBpcyBzZXJpYWxpemVkIHRocm91Z2ggYQorICogc2luZ2xlIHNwaW5sb2NrLCBwcml2LT5sb2NrLiAgVGhlIGxvY2sgaXMgdXNlZCBpbiB1c2VyLCBiaCBhbmQgaXJxCisgKiBjb250ZXh0LCBzbyB3aGVuIHRha2VuIG91dHNpZGUgaGFyZGlycSBjb250ZXh0IGl0IHNob3VsZCBhbHdheXMgYmUKKyAqIHRha2VuIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4gIFRoZSBsb2NrIHByb3RlY3RzIGJvdGggdGhlCisgKiBoYXJkd2FyZSBhbmQgdGhlIHN0cnVjdCBvcmlub2NvX3ByaXZhdGUuCisgKgorICogQW5vdGhlciBmbGFnLCBwcml2LT5od191bmF2YWlsYWJsZSBpbmRpY2F0ZXMgdGhhdCB0aGUgaGFyZHdhcmUgaXMKKyAqIHVuYXZhaWxhYmxlIGZvciBhbiBleHRlbmRlZCBwZXJpb2Qgb2YgdGltZSAoZS5nLiBzdXNwZW5kZWQsIG9yIGluCisgKiB0aGUgbWlkZGxlIG9mIGEgaGFyZCByZXNldCkuICBUaGlzIGZsYWcgaXMgcHJvdGVjdGVkIGJ5IHRoZQorICogc3BpbmxvY2suICBBbGwgY29kZSB3aGljaCB0b3VjaGVzIHRoZSBoYXJkd2FyZSBzaG91bGQgY2hlY2sgdGhlCisgKiBmbGFnIGFmdGVyIHRha2luZyB0aGUgbG9jaywgYW5kIGlmIGl0IGlzIHNldCwgZ2l2ZSB1cCBvbiB3aGF0ZXZlcgorICogdGhleSBhcmUgZG9pbmcgYW5kIGRyb3AgdGhlIGxvY2sgYWdhaW4uICBUaGUgb3Jpbm9jb19sb2NrKCkKKyAqIGZ1bmN0aW9uIGhhbmRsZXMgdGhpcyAoaXQgdW5sb2NrcyBhbmQgcmV0dXJucyAtRUJVU1kgaWYKKyAqIGh3X3VuYXZhaWxhYmxlIGlzIG5vbi16ZXJvKS4KKyAqLworCisjZGVmaW5lIERSSVZFUl9OQU1FICJvcmlub2NvIgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICJoZXJtZXMuaCIKKyNpbmNsdWRlICJoZXJtZXNfcmlkLmgiCisjaW5jbHVkZSAib3Jpbm9jby5oIgorI2luY2x1ZGUgImllZWU4MDJfMTEuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTW9kdWxlIGluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitNT0RVTEVfQVVUSE9SKCJQYXZlbCBSb3NraW4gPHByb3NraUBnbnUub3JnPiAmIERhdmlkIEdpYnNvbiA8aGVybWVzQGdpYnNvbi5kcm9wYmVhci5pZC5hdT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBMdWNlbnQgT3Jpbm9jbywgUHJpc20gSUkgYmFzZWQgYW5kIHNpbWlsYXIgd2lyZWxlc3MgY2FyZHMiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIE1QTC9HUEwiKTsKKworLyogTGV2ZWwgb2YgZGVidWdnaW5nLiBVc2VkIGluIHRoZSBtYWNyb3MgaW4gb3Jpbm9jby5oICovCisjaWZkZWYgT1JJTk9DT19ERUJVRworaW50IG9yaW5vY29fZGVidWcgPSBPUklOT0NPX0RFQlVHOworbW9kdWxlX3BhcmFtKG9yaW5vY29fZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG9yaW5vY29fZGVidWcsICJEZWJ1ZyBsZXZlbCIpOworRVhQT1JUX1NZTUJPTChvcmlub2NvX2RlYnVnKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IHN1cHByZXNzX2xpbmtzdGF0dXM7IC8qID0gMCAqLworbW9kdWxlX3BhcmFtKHN1cHByZXNzX2xpbmtzdGF0dXMsIGJvb2wsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhzdXBwcmVzc19saW5rc3RhdHVzLCAiRG9uJ3QgbG9nIGxpbmsgc3RhdHVzIGNoYW5nZXMiKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ29tcGlsZSB0aW1lIGNvbmZpZ3VyYXRpb24gYW5kIGNvbXBhdGliaWxpdHkgc3R1ZmYgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBXZSBkbyB0aGlzIHRoaXMgd2F5IHRvIGF2b2lkIGlmZGVmcyBpbiB0aGUgYWN0dWFsIGNvZGUgKi8KKyNpZmRlZiBXSVJFTEVTU19TUFkKKyNkZWZpbmUgU1BZX05VTUJFUihwcml2KQkocHJpdi0+c3B5X251bWJlcikKKyNlbHNlCisjZGVmaW5lIFNQWV9OVU1CRVIocHJpdikJMAorI2VuZGlmIC8qIFdJUkVMRVNTX1NQWSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbnRlcm5hbCBjb25zdGFudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgT1JJTk9DT19NSU5fTVRVCQkyNTYKKyNkZWZpbmUgT1JJTk9DT19NQVhfTVRVCQkoSUVFRTgwMl8xMV9EQVRBX0xFTiAtIEVOQ0FQU19PVkVSSEVBRCkKKworI2RlZmluZSBTWU1CT0xfTUFYX1ZFUl9MRU4JKDE0KQorI2RlZmluZSBVU0VSX0JBUAkJMAorI2RlZmluZSBJUlFfQkFQCQkJMQorI2RlZmluZSBNQVhfSVJRTE9PUFNfUEVSX0lSUQkxMAorI2RlZmluZSBNQVhfSVJRTE9PUFNfUEVSX0pJRkZZCSgyMDAwMC9IWikgLyogQmFzZWQgb24gYSBndWVzdGltYXRlIG9mCisJCQkJCSAgICAqIGhvdyBtYW55IGV2ZW50cyB0aGUKKwkJCQkJICAgICogZGV2aWNlIGNvdWxkCisJCQkJCSAgICAqIGxlZ2l0aW1hdGVseSBnZW5lcmF0ZSAqLworI2RlZmluZSBTTUFMTF9LRVlfU0laRQkJNQorI2RlZmluZSBMQVJHRV9LRVlfU0laRQkJMTMKKyNkZWZpbmUgVFhfTklDQlVGX1NJWkVfQlVHCTE1ODUJCS8qIEJ1ZyBpbiBTeW1ib2wgZmlybXdhcmUgKi8KKworI2RlZmluZSBEVU1NWV9GSUQJCTB4RkZGRgorCisvKiNkZWZpbmUgTUFYX01VTFRJQ0FTVChwcml2KQkocHJpdi0+ZmlybXdhcmVfdHlwZSA9PSBGSVJNV0FSRV9UWVBFX0FHRVJFID8gXAorICBIRVJNRVNfTUFYX01VTFRJQ0FTVCA6IDApKi8KKyNkZWZpbmUgTUFYX01VTFRJQ0FTVChwcml2KQkoSEVSTUVTX01BWF9NVUxUSUNBU1QpCisKKyNkZWZpbmUgT1JJTk9DT19JTlRFTgkgCShIRVJNRVNfRVZfUlggfCBIRVJNRVNfRVZfQUxMT0MgXAorCQkJCSB8IEhFUk1FU19FVl9UWCB8IEhFUk1FU19FVl9UWEVYQyBcCisJCQkJIHwgSEVSTUVTX0VWX1dURVJSIHwgSEVSTUVTX0VWX0lORk8gXAorCQkJCSB8IEhFUk1FU19FVl9JTkZEUk9QICkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGF0YSB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgZnJlcXVlbmN5IG9mIGVhY2ggY2hhbm5lbCBpbiBNSHogKi8KK3N0YXRpYyBjb25zdCBsb25nIGNoYW5uZWxfZnJlcXVlbmN5W10gPSB7CisJMjQxMiwgMjQxNywgMjQyMiwgMjQyNywgMjQzMiwgMjQzNywgMjQ0MiwKKwkyNDQ3LCAyNDUyLCAyNDU3LCAyNDYyLCAyNDY3LCAyNDcyLCAyNDg0Cit9OworI2RlZmluZSBOVU1fQ0hBTk5FTFMgQVJSQVlfU0laRShjaGFubmVsX2ZyZXF1ZW5jeSkKKworLyogVGhpcyB0YWJsZXMgZ2l2ZXMgdGhlIGFjdHVhbCBtZWFuaW5ncyBvZiB0aGUgYml0cmF0ZSBJRHMgcmV0dXJuZWQKKyAqIGJ5IHRoZSBmaXJtd2FyZS4gKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWludCBiaXRyYXRlOyAvKiBpbiAxMDBzIG9mIGtpbG9iaXRzICovCisJaW50IGF1dG9tYXRpYzsKKwl1MTYgYWdlcmVfdHhyYXRlY3RybDsKKwl1MTYgaW50ZXJzaWxfdHhyYXRlY3RybDsKK30gYml0cmF0ZV90YWJsZVtdID0geworCXsxMTAsIDEsICAzLCAxNX0sIC8qIEVudHJ5IDAgaXMgdGhlIGRlZmF1bHQgKi8KKwl7MTAsICAwLCAgMSwgIDF9LAorCXsxMCwgIDEsICAxLCAgMX0sCisJezIwLCAgMCwgIDIsICAyfSwKKwl7MjAsICAxLCAgNiwgIDN9LAorCXs1NSwgIDAsICA0LCAgNH0sCisJezU1LCAgMSwgIDcsICA3fSwKKwl7MTEwLCAwLCAgNSwgIDh9LAorfTsKKyNkZWZpbmUgQklUUkFURV9UQUJMRV9TSVpFIEFSUkFZX1NJWkUoYml0cmF0ZV90YWJsZSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGF0YSB0eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgaGVhZGVyX3N0cnVjdCB7CisJLyogODAyLjMgKi8KKwl1OCBkZXN0W0VUSF9BTEVOXTsKKwl1OCBzcmNbRVRIX0FMRU5dOworCXUxNiBsZW47CisJLyogODAyLjIgKi8KKwl1OCBkc2FwOworCXU4IHNzYXA7CisJdTggY3RybDsKKwkvKiBTTkFQICovCisJdTggb3VpWzNdOworCXUxNiBldGhlcnR5cGU7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogODAyLjIgTExDL1NOQVAgaGVhZGVyIHVzZWQgZm9yIEV0aGVybmV0IGVuY2Fwc3VsYXRpb24gb3ZlciA4MDIuMTEgKi8KK3U4IGVuY2Fwc19oZHJbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKKworI2RlZmluZSBFTkNBUFNfT1ZFUkhFQUQJCShzaXplb2YoZW5jYXBzX2hkcikgKyAyKQorCitzdHJ1Y3QgaGVybWVzX3J4X2Rlc2NyaXB0b3IgeworCXUxNiBzdGF0dXM7CisJdTMyIHRpbWU7CisJdTggc2lsZW5jZTsKKwl1OCBzaWduYWw7CisJdTggcmF0ZTsKKwl1OCByeGZsb3c7CisJdTMyIHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIGludCBfX29yaW5vY29fcHJvZ3JhbV9yaWRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgX19vcmlub2NvX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgb3Jpbm9jb19kZWJ1Z19kdW1wX3JlY3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEludGVybmFsIGhlbHBlciBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9wb3J0X3R5cGUoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdikKK3sKKwlzd2l0Y2ggKHByaXYtPml3X21vZGUpIHsKKwljYXNlIElXX01PREVfSU5GUkE6CisJCXByaXYtPnBvcnRfdHlwZSA9IDE7CisJCXByaXYtPmNyZWF0ZWlic3MgPSAwOworCQlicmVhazsKKwljYXNlIElXX01PREVfQURIT0M6CisJCWlmIChwcml2LT5wcmVmZXJfcG9ydDMpIHsKKwkJCXByaXYtPnBvcnRfdHlwZSA9IDM7CisJCQlwcml2LT5jcmVhdGVpYnNzID0gMDsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPnBvcnRfdHlwZSA9IHByaXYtPmlic3NfcG9ydDsKKwkJCXByaXYtPmNyZWF0ZWlic3MgPSAxOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgcHJpdi0+aXdfbW9kZSBpbiBzZXRfcG9ydF90eXBlKClcbiIsCisJCSAgICAgICBwcml2LT5uZGV2LT5uYW1lKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERldmljZSBtZXRob2RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBvcmlub2NvX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWVyciA9IF9fb3Jpbm9jb191cChkZXYpOworCisJaWYgKCEgZXJyKQorCQlwcml2LT5vcGVuID0gMTsKKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitpbnQgb3Jpbm9jb19zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVyciA9IDA7CisKKwkvKiBXZSBtdXN0bid0IHVzZSBvcmlub2NvX2xvY2soKSBoZXJlLCBiZWNhdXNlIHdlIG5lZWQgdG8gYmUKKwkgICBhYmxlIHRvIGNsb3NlIHRoZSBpbnRlcmZhY2UgZXZlbiBpZiBod191bmF2YWlsYWJsZSBpcyBzZXQKKwkgICAoZS5nLiBhcyB3ZSdyZSByZWxlYXNlZCBhZnRlciBhIFBDIENhcmQgcmVtb3ZhbCkgKi8KKwlzcGluX2xvY2tfaXJxKCZwcml2LT5sb2NrKTsKKworCXByaXYtPm9wZW4gPSAwOworCisJZXJyID0gX19vcmlub2NvX2Rvd24oZGV2KTsKKworCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm9yaW5vY29fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJCisJcmV0dXJuICZwcml2LT5zdGF0czsKK30KKworc3RhdGljIHN0cnVjdCBpd19zdGF0aXN0aWNzICpvcmlub2NvX2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqd3N0YXRzID0gJnByaXYtPndzdGF0czsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCEgbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZ2V0X3dpcmVsZXNzX3N0YXRzKCkgY2FsbGVkIHdoaWxlIGRldmljZSBub3QgcHJlc2VudFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiBOVUxMOyAvKiBGSVhNRTogQ2FuIHdlIGRvIGJldHRlciB0aGFuIHRoaXM/ICovCisJfQorCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiBOVUxMOyAgLyogRklYTUU6IEVyZywgd2UndmUgYmVlbiBzaWduYWxsZWQsIGhvdworCQkJICAgICAgICogZG8gd2UgcHJvcGFnYXRlIHRoaXMgYmFjayB1cD8gKi8KKworCWlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKKwkJbWVtc2V0KCZ3c3RhdHMtPnF1YWwsIDAsIHNpemVvZih3c3RhdHMtPnF1YWwpKTsKKwkJLyogSWYgYSBzcHkgYWRkcmVzcyBpcyBkZWZpbmVkLCB3ZSByZXBvcnQgc3RhdHMgb2YgdGhlCisJCSAqIGZpcnN0IHNweSBhZGRyZXNzIC0gSmVhbiBJSSAqLworCQlpZiAoU1BZX05VTUJFUihwcml2KSkgeworCQkJd3N0YXRzLT5xdWFsLnF1YWwgPSBwcml2LT5zcHlfc3RhdFswXS5xdWFsOworCQkJd3N0YXRzLT5xdWFsLmxldmVsID0gcHJpdi0+c3B5X3N0YXRbMF0ubGV2ZWw7CisJCQl3c3RhdHMtPnF1YWwubm9pc2UgPSBwcml2LT5zcHlfc3RhdFswXS5ub2lzZTsKKwkJCXdzdGF0cy0+cXVhbC51cGRhdGVkID0gcHJpdi0+c3B5X3N0YXRbMF0udXBkYXRlZDsKKwkJfQorCX0gZWxzZSB7CisJCXN0cnVjdCB7CisJCQl1MTYgcXVhbCwgc2lnbmFsLCBub2lzZTsKKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgY3E7CisKKwkJZXJyID0gSEVSTUVTX1JFQURfUkVDT1JEKGh3LCBVU0VSX0JBUCwKKwkJCQkJIEhFUk1FU19SSURfQ09NTVNRVUFMSVRZLCAmY3EpOworCQkKKwkJd3N0YXRzLT5xdWFsLnF1YWwgPSAoaW50KWxlMTZfdG9fY3B1KGNxLnF1YWwpOworCQl3c3RhdHMtPnF1YWwubGV2ZWwgPSAoaW50KWxlMTZfdG9fY3B1KGNxLnNpZ25hbCkgLSAweDk1OworCQl3c3RhdHMtPnF1YWwubm9pc2UgPSAoaW50KWxlMTZfdG9fY3B1KGNxLm5vaXNlKSAtIDB4OTU7CisJCXdzdGF0cy0+cXVhbC51cGRhdGVkID0gNzsKKwl9CisKKwkvKiBXZSBjYW4ndCByZWFsbHkgd2FpdCBmb3IgdGhlIHRhbGxpZXMgaW5xdWlyeSBjb21tYW5kIHRvCisJICogY29tcGxldGUsIHNvIHdlIGp1c3QgdXNlIHRoZSBwcmV2aW91cyByZXN1bHRzIGFuZCB0cmlnZ2VyCisJICogYSBuZXcgdGFsbGllcyBpbnF1aXJ5IGNvbW1hbmQgZm9yIG5leHQgdGltZSAtIEplYW4gSUkgKi8KKwkvKiBGSVhNRTogV2UncmUgaW4gdXNlciBjb250ZXh0IChJIHRoaW5rPyksIHNvIHdlIHNob3VsZCBqdXN0CisgICAgICAgICAgIHdhaXQgZm9yIHRoZSB0YWxsaWVzIHRvIGNvbWUgdGhyb3VnaCAqLworCWVyciA9IGhlcm1lc19pbnF1aXJlKGh3LCBIRVJNRVNfSU5RX1RBTExJRVMpOworICAgICAgICAgICAgICAgCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCWlmIChlcnIpCisJCXJldHVybiBOVUxMOworCQkKKwlyZXR1cm4gd3N0YXRzOworfQorCitzdGF0aWMgdm9pZCBvcmlub2NvX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG9yaW5vY29fc2V0X211bHRpY2FzdF9saXN0KCkgIgorCQkgICAgICAgImNhbGxlZCB3aGVuIGh3X3VuYXZhaWxhYmxlXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJX19vcmlub2NvX3NldF9tdWx0aWNhc3RfbGlzdChkZXYpOworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCAobmV3X210dSA8IE9SSU5PQ09fTUlOX01UVSkgfHwgKG5ld19tdHUgPiBPUklOT0NPX01BWF9NVFUpICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIChuZXdfbXR1ICsgRU5DQVBTX09WRVJIRUFEICsgSUVFRTgwMl8xMV9ITEVOKSA+CisJICAgICAocHJpdi0+bmljYnVmX3NpemUgLSBFVEhfSExFTikgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldi0+bXR1ID0gbmV3X210dTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUeCBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgb3Jpbm9jb194bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnByaXYtPnN0YXRzOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKwl1MTYgdHhmaWQgPSBwcml2LT50eGZpZDsKKwljaGFyICpwOworCXN0cnVjdCBldGhoZHIgKmVoOworCWludCBsZW4sIGRhdGFfbGVuLCBkYXRhX29mZjsKKwlzdHJ1Y3QgaGVybWVzX3R4X2Rlc2NyaXB0b3IgZGVzYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJVFJBQ0VfRU5URVIoZGV2LT5uYW1lKTsKKworCWlmICghIG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUeCBvbiBzdG9wcGVkIGRldmljZSFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlUUkFDRV9FWElUKGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKwkKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHggd2hpbGUgdHJhbnNtaXR0ZXIgYnVzeSFcbiIsIAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJVFJBQ0VfRVhJVChkZXYtPm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisJCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogb3Jpbm9jb194bWl0KCkgY2FsbGVkIHdoaWxlIGh3X3VuYXZhaWxhYmxlXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJVFJBQ0VfRVhJVChkZXYtPm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoISBuZXRpZl9jYXJyaWVyX29rKGRldikpIHsKKwkJLyogT29wcywgdGhlIGZpcm13YXJlIGhhc24ndCBlc3RhYmxpc2hlZCBhIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgc2lsZW50bHkgZHJvcCB0aGUgcGFja2V0ICh0aGlzIHNlZW1zIHRvIGJlIHRoZQorICAgICAgICAgICAgICAgICAgIHNhZmVzdCBhcHByb2FjaCkuICovCisJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlUUkFDRV9FWElUKGRldi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIExlbmd0aCBvZiB0aGUgcGFja2V0IGJvZHkgKi8KKwkvKiBGSVhNRTogd2hhdCBpZiB0aGUgc2tiIGlzIHNtYWxsZXIgdGhhbiB0aGlzPyAqLworCWxlbiA9IG1heF90KGludCxza2ItPmxlbiAtIEVUSF9ITEVOLCBFVEhfWkxFTiAtIEVUSF9ITEVOKTsKKworCWVoID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7CisKKwltZW1zZXQoJmRlc2MsIDAsIHNpemVvZihkZXNjKSk7CisgCWRlc2MudHhfY29udHJvbCA9IGNwdV90b19sZTE2KEhFUk1FU19UWENUUkxfVFhfT0sgfCBIRVJNRVNfVFhDVFJMX1RYX0VYKTsKKwllcnIgPSBoZXJtZXNfYmFwX3B3cml0ZShodywgVVNFUl9CQVAsICZkZXNjLCBzaXplb2YoZGVzYyksIHR4ZmlkLCAwKTsKKwlpZiAoZXJyKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCB3cml0aW5nIFR4IGRlc2NyaXB0b3IgIgorCQkJICAgICAgICJ0byBCQVBcbiIsIGRldi0+bmFtZSwgZXJyKTsKKwkJc3RhdHMtPnR4X2Vycm9ycysrOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogQ2xlYXIgdGhlIDgwMi4xMSBoZWFkZXIgYW5kIGRhdGEgbGVuZ3RoIGZpZWxkcyAtIHNvbWUKKwkgKiBmaXJtd2FyZXMgKGUuZy4gTHVjZW50L0FnZXJlIDgueHgpIGFwcGVhciB0byBnZXQgY29uZnVzZWQKKwkgKiBpZiB0aGlzIGlzbid0IGRvbmUuICovCisJaGVybWVzX2NsZWFyX3dvcmRzKGh3LCBIRVJNRVNfREFUQTAsCisJCQkgICBIRVJNRVNfODAyXzNfT0ZGU0VUIC0gSEVSTUVTXzgwMl8xMV9PRkZTRVQpOworCisJLyogRW5jYXBzdWxhdGUgRXRoZXJuZXQtSUkgZnJhbWVzICovCisJaWYgKG50b2hzKGVoLT5oX3Byb3RvKSA+IEVUSF9EQVRBX0xFTikgeyAvKiBFdGhlcm5ldC1JSSBmcmFtZSAqLworCQlzdHJ1Y3QgaGVhZGVyX3N0cnVjdCBoZHI7CisJCWRhdGFfbGVuID0gbGVuOworCQlkYXRhX29mZiA9IEhFUk1FU184MDJfM19PRkZTRVQgKyBzaXplb2YoaGRyKTsKKwkJcCA9IHNrYi0+ZGF0YSArIEVUSF9ITEVOOworCisJCS8qIDgwMi4zIGhlYWRlciAqLworCQltZW1jcHkoaGRyLmRlc3QsIGVoLT5oX2Rlc3QsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGhkci5zcmMsIGVoLT5oX3NvdXJjZSwgRVRIX0FMRU4pOworCQloZHIubGVuID0gaHRvbnMoZGF0YV9sZW4gKyBFTkNBUFNfT1ZFUkhFQUQpOworCQkKKwkJLyogODAyLjIgaGVhZGVyICovCisJCW1lbWNweSgmaGRyLmRzYXAsICZlbmNhcHNfaGRyLCBzaXplb2YoZW5jYXBzX2hkcikpOworCQkJCisJCWhkci5ldGhlcnR5cGUgPSBlaC0+aF9wcm90bzsKKwkJZXJyICA9IGhlcm1lc19iYXBfcHdyaXRlKGh3LCBVU0VSX0JBUCwgJmhkciwgc2l6ZW9mKGhkciksCisJCQkJCSB0eGZpZCwgSEVSTUVTXzgwMl8zX09GRlNFVCk7CisJCWlmIChlcnIpIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgd3JpdGluZyBwYWNrZXQgIgorCQkJCSAgICAgICAiaGVhZGVyIHRvIEJBUFxuIiwgZGV2LT5uYW1lLCBlcnIpOworCQkJc3RhdHMtPnR4X2Vycm9ycysrOworCQkJZ290byBmYWlsOworCQl9CisJfSBlbHNlIHsgLyogSUVFRSA4MDIuMyBmcmFtZSAqLworCQlkYXRhX2xlbiA9IGxlbiArIEVUSF9ITEVOOworCQlkYXRhX29mZiA9IEhFUk1FU184MDJfM19PRkZTRVQ7CisJCXAgPSBza2ItPmRhdGE7CisJfQorCisJLyogUm91bmQgdXAgZm9yIG9kZCBsZW5ndGggcGFja2V0cyAqLworCWVyciA9IGhlcm1lc19iYXBfcHdyaXRlKGh3LCBVU0VSX0JBUCwgcCwgQUxJR04oZGF0YV9sZW4sIDIpLAorCQkJCXR4ZmlkLCBkYXRhX29mZik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCB3cml0aW5nIHBhY2tldCB0byBCQVBcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJZ290byBmYWlsOworCX0KKworCS8qIEZpbmFsbHksIHdlIGFjdHVhbGx5IGluaXRpYXRlIHRoZSBzZW5kICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJZXJyID0gaGVybWVzX2RvY21kX3dhaXQoaHcsIEhFUk1FU19DTURfVFggfCBIRVJNRVNfQ01EX1JFQ0wsCisJCQkJdHhmaWQsIE5VTEwpOworCWlmIChlcnIpIHsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgdHJhbnNtaXR0aW5nIHBhY2tldFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJc3RhdHMtPnR4X2Vycm9ycysrOworCQlnb3RvIGZhaWw7CisJfQorCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJc3RhdHMtPnR4X2J5dGVzICs9IGRhdGFfb2ZmICsgZGF0YV9sZW47CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJZGV2X2tmcmVlX3NrYihza2IpOworCisJVFJBQ0VfRVhJVChkZXYtPm5hbWUpOworCisJcmV0dXJuIDA7CisgZmFpbDoKKwlUUkFDRV9FWElUKGRldi0+bmFtZSk7CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fb3Jpbm9jb19ldl9hbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBoZXJtZXNfdCAqaHcpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTE2IGZpZCA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIEFMTE9DRklEKTsKKworCWlmIChmaWQgIT0gcHJpdi0+dHhmaWQpIHsKKwkJaWYgKGZpZCAhPSBEVU1NWV9GSUQpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWxsb2NhdGUgZXZlbnQgb24gdW5leHBlY3RlZCBmaWQgKCUwNFgpXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZmlkKTsKKwkJcmV0dXJuOworCX0KKworCWhlcm1lc193cml0ZV9yZWduKGh3LCBBTExPQ0ZJRCwgRFVNTVlfRklEKTsKK30KKworc3RhdGljIHZvaWQgX19vcmlub2NvX2V2X3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGhlcm1lc190ICpodykKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmcHJpdi0+c3RhdHM7CisKKwlzdGF0cy0+dHhfcGFja2V0cysrOworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIFRYQ09NUExGSUQsIERVTU1ZX0ZJRCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fb3Jpbm9jb19ldl90eGV4YyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBoZXJtZXNfdCAqaHcpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnByaXYtPnN0YXRzOworCXUxNiBmaWQgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBUWENPTVBMRklEKTsKKwlzdHJ1Y3QgaGVybWVzX3R4X2Rlc2NyaXB0b3IgZGVzYzsKKwlpbnQgZXJyID0gMDsKKworCWlmIChmaWQgPT0gRFVNTVlfRklEKQorCQlyZXR1cm47IC8qIE5vdGhpbmcncyByZWFsbHkgaGFwcGVuZWQgKi8KKworCWVyciA9IGhlcm1lc19iYXBfcHJlYWQoaHcsIElSUV9CQVAsICZkZXNjLCBzaXplb2YoZGVzYyksIGZpZCwgMCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5hYmxlIHRvIHJlYWQgZGVzY3JpcHRvciBvbiBUeCBlcnJvciAiCisJCSAgICAgICAiKEZJRD0lMDRYIGVycm9yICVkKVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZmlkLCBlcnIpOworCX0gZWxzZSB7CisJCURFQlVHKDEsICIlczogVHggZXJyb3IsIHN0YXR1cyAlZFxuIiwKKwkJICAgICAgZGV2LT5uYW1lLCBsZTE2X3RvX2NwdShkZXNjLnN0YXR1cykpOworCX0KKwkKKwlzdGF0cy0+dHhfZXJyb3JzKys7CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIFRYQ09NUExGSUQsIERVTU1ZX0ZJRCk7Cit9CisKK3N0YXRpYyB2b2lkIG9yaW5vY29fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwcml2LT5zdGF0czsKKwlzdHJ1Y3QgaGVybWVzICpodyA9ICZwcml2LT5odzsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUeCB0aW1lb3V0ISAiCisJICAgICAgICJBTExPQ0ZJRD0lMDR4LCBUWENPTVBMRklEPSUwNHgsIEVWU1RBVD0lMDR4XG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGhlcm1lc19yZWFkX3JlZ24oaHcsIEFMTE9DRklEKSwKKwkgICAgICAgaGVybWVzX3JlYWRfcmVnbihodywgVFhDT01QTEZJRCksIGhlcm1lc19yZWFkX3JlZ24oaHcsIEVWU1RBVCkpOworCisJc3RhdHMtPnR4X2Vycm9ycysrOworCisJc2NoZWR1bGVfd29yaygmcHJpdi0+cmVzZXRfd29yayk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJ4IHBhdGggKGRhdGEgZnJhbWVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRG9lcyB0aGUgZnJhbWUgaGF2ZSBhIFNOQVAgaGVhZGVyIGluZGljYXRpbmcgaXQgc2hvdWxkIGJlCisgKiBkZS1lbmNhcHN1bGF0ZWQgdG8gRXRoZXJuZXQtSUk/ICovCitzdGF0aWMgaW5saW5lIGludCBpc19ldGhlcnNuYXAodm9pZCAqX2hkcikKK3sKKwl1OCAqaGRyID0gX2hkcjsKKworCS8qIFdlIGRlLWVuY2Fwc3VsYXRlIGFsbCBwYWNrZXRzIHdoaWNoLCBhKSBoYXZlIFNOQVAgaGVhZGVycworCSAqIChpLmUuIFNTQVA9RFNBUD0weGFhIGFuZCBDVFJMPTB4MyBpbiB0aGUgODAyLjIgTExDIGhlYWRlcgorCSAqIGFuZCB3aGVyZSBiKSB0aGUgT1VJIG9mIHRoZSBTTkFQIGhlYWRlciBpcyAwMDowMDowMCBvcgorCSAqIDAwOjAwOmY4IC0gd2UgbmVlZCBib3RoIGJlY2F1c2UgZGlmZmVyZW50IEFQcyBhcHBlYXIgdG8gdXNlCisJICogZGlmZmVyZW50IE9VSXMgZm9yIHNvbWUgcmVhc29uICovCisJcmV0dXJuIChtZW1jbXAoaGRyLCAmZW5jYXBzX2hkciwgNSkgPT0gMCkKKwkJJiYgKCAoaGRyWzVdID09IDB4MDApIHx8IChoZHJbNV0gPT0gMHhmOCkgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG9yaW5vY29fc3B5X2dhdGhlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgKm1hYywKKwkJCQkgICAgICBpbnQgbGV2ZWwsIGludCBub2lzZSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCS8qIEdhdGhlciB3aXJlbGVzcyBzcHkgc3RhdGlzdGljczogZm9yIGVhY2ggcGFja2V0LCBjb21wYXJlIHRoZQorCSAqIHNvdXJjZSBhZGRyZXNzIHdpdGggb3V0IGxpc3QsIGFuZCBpZiBtYXRjaCwgZ2V0IHRoZSBzdGF0cy4uLiAqLworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5zcHlfbnVtYmVyOyBpKyspCisJCWlmICghbWVtY21wKG1hYywgcHJpdi0+c3B5X2FkZHJlc3NbaV0sIEVUSF9BTEVOKSkgeworCQkJcHJpdi0+c3B5X3N0YXRbaV0ubGV2ZWwgPSBsZXZlbCAtIDB4OTU7CisJCQlwcml2LT5zcHlfc3RhdFtpXS5ub2lzZSA9IG5vaXNlIC0gMHg5NTsKKwkJCXByaXYtPnNweV9zdGF0W2ldLnF1YWwgPSAobGV2ZWwgPiBub2lzZSkgPyAobGV2ZWwgLSBub2lzZSkgOiAwOworCQkJcHJpdi0+c3B5X3N0YXRbaV0udXBkYXRlZCA9IDc7CisJCX0KK30KKworc3RhdGljIHZvaWQgb3Jpbm9jb19zdGF0X2dhdGhlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBza19idWZmICpza2IsCisJCQkJc3RydWN0IGhlcm1lc19yeF9kZXNjcmlwdG9yICpkZXNjKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogVXNpbmcgc3B5IHN1cHBvcnQgd2l0aCBsb3RzIG9mIFJ4IHBhY2tldHMsIGxpa2UgaW4gYW4KKwkgKiBpbmZyYXN0cnVjdHVyZSAoQVApLCB3aWxsIHJlYWxseSBzbG93IGRvd24gZXZlcnl0aGluZywgYmVjYXVzZQorCSAqIHRoZSBNQUMgYWRkcmVzcyBtdXN0IGJlIGNvbXBhcmVkIHRvIGVhY2ggZW50cnkgb2YgdGhlIHNweSBsaXN0LgorCSAqIElmIHRoZSB1c2VyIHJlYWxseSBhc2tzIGZvciBpdCAoc2V0IHNvbWUgYWRkcmVzcyBpbiB0aGUKKwkgKiBzcHkgbGlzdCksIHdlIGRvIGl0LCBidXQgaGUgd2lsbCBwYXkgdGhlIHByaWNlLgorCSAqIE5vdGUgdGhhdCB0byBnZXQgaGVyZSwgeW91IG5lZWQgYm90aCBXSVJFTEVTU19TUFkKKwkgKiBjb21waWxlZCBpbiBBTkQgc29tZSBhZGRyZXNzZXMgaW4gdGhlIGxpc3QgISEhCisJICovCisJLyogTm90ZSA6IGdjYyB3aWxsIG9wdGltaXNlIHRoZSB3aG9sZSBzZWN0aW9uIGF3YXkgaWYKKwkgKiBXSVJFTEVTU19TUFkgaXMgbm90IGRlZmluZWQuLi4gLSBKZWFuIElJICovCisJaWYgKFNQWV9OVU1CRVIocHJpdikpIHsKKwkJb3Jpbm9jb19zcHlfZ2F0aGVyKGRldiwgc2tiLT5tYWMucmF3ICsgRVRIX0FMRU4sCisJCQkJICAgZGVzYy0+c2lnbmFsLCBkZXNjLT5zaWxlbmNlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fb3Jpbm9jb19ldl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBoZXJtZXNfdCAqaHcpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnByaXYtPnN0YXRzOworCXN0cnVjdCBpd19zdGF0aXN0aWNzICp3c3RhdHMgPSAmcHJpdi0+d3N0YXRzOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXUxNiByeGZpZCwgc3RhdHVzOworCWludCBsZW5ndGgsIGRhdGFfbGVuLCBkYXRhX29mZjsKKwljaGFyICpwOworCXN0cnVjdCBoZXJtZXNfcnhfZGVzY3JpcHRvciBkZXNjOworCXN0cnVjdCBoZWFkZXJfc3RydWN0IGhkcjsKKwlzdHJ1Y3QgZXRoaGRyICplaDsKKwlpbnQgZXJyOworCisJcnhmaWQgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBSWEZJRCk7CisKKwllcnIgPSBoZXJtZXNfYmFwX3ByZWFkKGh3LCBJUlFfQkFQLCAmZGVzYywgc2l6ZW9mKGRlc2MpLAorCQkJICAgICAgIHJ4ZmlkLCAwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yICVkIHJlYWRpbmcgUnggZGVzY3JpcHRvci4gIgorCQkgICAgICAgIkZyYW1lIGRyb3BwZWQuXG4iLCBkZXYtPm5hbWUsIGVycik7CisJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJZ290byBkcm9wOworCX0KKworCXN0YXR1cyA9IGxlMTZfdG9fY3B1KGRlc2Muc3RhdHVzKTsKKworCWlmIChzdGF0dXMgJiBIRVJNRVNfUlhTVEFUX0VSUikgeworCQlpZiAoc3RhdHVzICYgSEVSTUVTX1JYU1RBVF9VTkRFQ1JZUFRBQkxFKSB7CisJCQl3c3RhdHMtPmRpc2NhcmQuY29kZSsrOworCQkJREVCVUcoMSwgIiVzOiBVbmRlY3J5cHRhYmxlIGZyYW1lIG9uIFJ4LiBGcmFtZSBkcm9wcGVkLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQl9IGVsc2UgeworCQkJc3RhdHMtPnJ4X2NyY19lcnJvcnMrKzsKKwkJCURFQlVHKDEsICIlczogQmFkIENSQyBvbiBSeC4gRnJhbWUgZHJvcHBlZC5cbiIsIGRldi0+bmFtZSk7CisJCX0KKwkJc3RhdHMtPnJ4X2Vycm9ycysrOworCQlnb3RvIGRyb3A7CisJfQorCisJLyogRm9yIG5vdyB3ZSBpZ25vcmUgdGhlIDgwMi4xMSBoZWFkZXIgY29tcGxldGVseSwgYXNzdW1pbmcKKyAgICAgICAgICAgdGhhdCB0aGUgY2FyZCdzIGZpcm13YXJlIGhhcyBoYW5kbGVkIGFueXRoaW5nIHZpdGFsICovCisKKwllcnIgPSBoZXJtZXNfYmFwX3ByZWFkKGh3LCBJUlFfQkFQLCAmaGRyLCBzaXplb2YoaGRyKSwKKwkJCSAgICAgICByeGZpZCwgSEVSTUVTXzgwMl8zX09GRlNFVCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCByZWFkaW5nIGZyYW1lIGhlYWRlci4gIgorCQkgICAgICAgIkZyYW1lIGRyb3BwZWQuXG4iLCBkZXYtPm5hbWUsIGVycik7CisJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJZ290byBkcm9wOworCX0KKworCWxlbmd0aCA9IG50b2hzKGhkci5sZW4pOworCQorCS8qIFNhbml0eSBjaGVja3MgKi8KKwlpZiAobGVuZ3RoIDwgMykgeyAvKiBObyBmb3IgZXZlbiBhbiA4MDIuMiBMTEMgaGVhZGVyICovCisJCS8qIEF0IGxlYXN0IG9uIFN5bWJvbCBmaXJtd2FyZSB3aXRoIFBDRiB3ZSBnZXQgcXVpdGUgYQorICAgICAgICAgICAgICAgICAgIGxvdCBvZiB0aGVzZSBsZWdpdGltYXRlbHkgLSBQb2xsIGZyYW1lcyB3aXRoIG5vCisgICAgICAgICAgICAgICAgICAgZGF0YS4gKi8KKwkJc3RhdHMtPnJ4X2Ryb3BwZWQrKzsKKwkJZ290byBkcm9wOworCX0KKwlpZiAobGVuZ3RoID4gSUVFRTgwMl8xMV9EQVRBX0xFTikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3ZlcnNpemVkIGZyYW1lIHJlY2VpdmVkICglZCBieXRlcylcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGxlbmd0aCk7CisJCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzKys7CisJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJZ290byBkcm9wOworCX0KKworCS8qIFdlIG5lZWQgc3BhY2UgZm9yIHRoZSBwYWNrZXQgZGF0YSBpdHNlbGYsIHBsdXMgYW4gZXRoZXJuZXQKKwkgICBoZWFkZXIsIHBsdXMgMiBieXRlcyBzbyB3ZSBjYW4gYWxpZ24gdGhlIElQIGhlYWRlciBvbiBhCisJICAgMzJiaXQgYm91bmRhcnksIHBsdXMgMSBieXRlIHNvIHdlIGNhbiByZWFkIGluIG9kZCBsZW5ndGgKKwkgICBwYWNrZXRzIGZyb20gdGhlIGNhcmQsIHdoaWNoIGhhcyBhbiBJTyBncmFudWxhcml0eSBvZiAxNgorCSAgIGJpdHMgKi8gIAorCXNrYiA9IGRldl9hbGxvY19za2IobGVuZ3RoK0VUSF9ITEVOKzIrMSk7CisJaWYgKCFza2IpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENhbid0IGFsbG9jYXRlIHNrYiBmb3IgUnhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIGRyb3A7CisJfQorCisJc2tiX3Jlc2VydmUoc2tiLCAyKTsgLyogVGhpcyB3YXkgdGhlIElQIGhlYWRlciBpcyBhbGlnbmVkICovCisKKwkvKiBIYW5kbGUgZGVjYXBzdWxhdGlvbgorCSAqIEluIG1vc3QgY2FzZXMsIHRoZSBmaXJtd2FyZSB0ZWxsIHVzIGFib3V0IFNOQVAgZnJhbWVzLgorCSAqIEZvciBzb21lIHJlYXNvbiwgdGhlIFNOQVAgZnJhbWVzIHNlbnQgYnkgTGlua1N5cyBBUHMKKwkgKiBhcmUgbm90IHByb3Blcmx5IHJlY29nbmlzZWQgYnkgbW9zdCBmaXJtd2FyZXMuCisJICogU28sIGNoZWNrIG91cnNlbHZlcyAqLworCWlmICgoKHN0YXR1cyAmIEhFUk1FU19SWFNUQVRfTVNHVFlQRSkgPT0gSEVSTUVTX1JYU1RBVF8xMDQyKSB8fAorCSAgICAoKHN0YXR1cyAmIEhFUk1FU19SWFNUQVRfTVNHVFlQRSkgPT0gSEVSTUVTX1JYU1RBVF9UVU5ORUwpIHx8CisJICAgIGlzX2V0aGVyc25hcCgmaGRyKSkgeworCQkvKiBUaGVzZSBpbmRpY2F0ZSBhIFNOQVAgd2l0aGluIDgwMi4yIExMQyB3aXRoaW4KKwkJICAgODAyLjExIGZyYW1lIHdoaWNoIHdlJ2xsIG5lZWQgdG8gZGUtZW5jYXBzdWxhdGUgdG8KKwkJICAgdGhlIG9yaWdpbmFsIEV0aGVybmV0SUkgZnJhbWUuICovCisKKwkJaWYgKGxlbmd0aCA8IEVOQ0FQU19PVkVSSEVBRCkgeyAvKiBObyByb29tIGZvciBmdWxsIExMQytTTkFQICovCisJCQlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycysrOworCQkJZ290byBkcm9wOworCQl9CisKKwkJLyogUmVtb3ZlIFNOQVAgaGVhZGVyLCByZWNvbnN0cnVjdCBFdGhlcm5ldElJIGZyYW1lICovCisJCWRhdGFfbGVuID0gbGVuZ3RoIC0gRU5DQVBTX09WRVJIRUFEOworCQlkYXRhX29mZiA9IEhFUk1FU184MDJfM19PRkZTRVQgKyBzaXplb2YoaGRyKTsKKworCQllaCA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX3B1dChza2IsIEVUSF9ITEVOKTsKKworCQltZW1jcHkoZWgsICZoZHIsIDIgKiBFVEhfQUxFTik7CisJCWVoLT5oX3Byb3RvID0gaGRyLmV0aGVydHlwZTsKKwl9IGVsc2UgeworCQkvKiBBbGwgb3RoZXIgY2FzZXMgaW5kaWNhdGUgYSBnZW51aW5lIDgwMi4zIGZyYW1lLiAgTm8KKwkJICAgZGVjYXBzdWxhdGlvbiBuZWVkZWQuICBXZSBqdXN0IHRocm93IHRoZSB3aG9sZQorCQkgICB0aGluZyBpbiwgYW5kIGhvcGUgdGhlIHByb3RvY29sIGxheWVyIGNhbiBkZWFsIHdpdGgKKwkJICAgaXQgYXMgODAyLjMgKi8KKwkJZGF0YV9sZW4gPSBsZW5ndGg7CisJCWRhdGFfb2ZmID0gSEVSTUVTXzgwMl8zX09GRlNFVDsKKwkJLyogRklYTUU6IHdlIHJlLXJlYWQgZnJvbSB0aGUgY2FyZCBkYXRhIHdlIGFscmVhZHkgcmVhZCBoZXJlICovCisJfQorCisJcCA9IHNrYl9wdXQoc2tiLCBkYXRhX2xlbik7CisJZXJyID0gaGVybWVzX2JhcF9wcmVhZChodywgSVJRX0JBUCwgcCwgQUxJR04oZGF0YV9sZW4sIDIpLAorCQkJICAgICAgIHJ4ZmlkLCBkYXRhX29mZik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCByZWFkaW5nIGZyYW1lLiAiCisJCSAgICAgICAiRnJhbWUgZHJvcHBlZC5cbiIsIGRldi0+bmFtZSwgZXJyKTsKKwkJc3RhdHMtPnJ4X2Vycm9ycysrOworCQlnb3RvIGRyb3A7CisJfQorCisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlza2ItPmRldiA9IGRldjsKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkKKwkvKiBQcm9jZXNzIHRoZSB3aXJlbGVzcyBzdGF0cyBpZiBuZWVkZWQgKi8KKwlvcmlub2NvX3N0YXRfZ2F0aGVyKGRldiwgc2tiLCAmZGVzYyk7CisKKwkvKiBQYXNzIHRoZSBwYWNrZXQgdG8gdGhlIG5ldHdvcmtpbmcgc3RhY2sgKi8KKwluZXRpZl9yeChza2IpOworCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJc3RhdHMtPnJ4X2J5dGVzICs9IGxlbmd0aDsKKworCXJldHVybjsKKworIGRyb3A6CQorCXN0YXRzLT5yeF9kcm9wcGVkKys7CisKKwlpZiAoc2tiKQorCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUnggcGF0aCAoaW5mbyBmcmFtZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBwcmludF9saW5rc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBzdGF0dXMpCit7CisJY2hhciAqIHM7CisKKwlpZiAoc3VwcHJlc3NfbGlua3N0YXR1cykKKwkJcmV0dXJuOworCisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIEhFUk1FU19MSU5LU1RBVFVTX05PVF9DT05ORUNURUQ6CisJCXMgPSAiTm90IENvbm5lY3RlZCI7CisJCWJyZWFrOworCWNhc2UgSEVSTUVTX0xJTktTVEFUVVNfQ09OTkVDVEVEOgorCQlzID0gIkNvbm5lY3RlZCI7CisJCWJyZWFrOworCWNhc2UgSEVSTUVTX0xJTktTVEFUVVNfRElTQ09OTkVDVEVEOgorCQlzID0gIkRpc2Nvbm5lY3RlZCI7CisJCWJyZWFrOworCWNhc2UgSEVSTUVTX0xJTktTVEFUVVNfQVBfQ0hBTkdFOgorCQlzID0gIkFQIENoYW5nZWQiOworCQlicmVhazsKKwljYXNlIEhFUk1FU19MSU5LU1RBVFVTX0FQX09VVF9PRl9SQU5HRToKKwkJcyA9ICJBUCBPdXQgb2YgUmFuZ2UiOworCQlicmVhazsKKwljYXNlIEhFUk1FU19MSU5LU1RBVFVTX0FQX0lOX1JBTkdFOgorCQlzID0gIkFQIEluIFJhbmdlIjsKKwkJYnJlYWs7CisJY2FzZSBIRVJNRVNfTElOS1NUQVRVU19BU1NPQ19GQUlMRUQ6CisJCXMgPSAiQXNzb2NpYXRpb24gRmFpbGVkIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcyA9ICJVTktOT1dOIjsKKwl9CisJCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5ldyBsaW5rIHN0YXR1czogJXMgKCUwNHgpXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHMsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fb3Jpbm9jb19ldl9pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGhlcm1lc190ICpodykKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYgaW5mb2ZpZDsKKwlzdHJ1Y3QgeworCQl1MTYgbGVuOworCQl1MTYgdHlwZTsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBpbmZvOworCWludCBsZW4sIHR5cGU7CisJaW50IGVycjsKKworCS8qIFRoaXMgaXMgYW4gYW5zd2VyIHRvIGFuIElOUVVJUkUgY29tbWFuZCB0aGF0IHdlIGRpZCBlYXJsaWVyLAorCSAqIG9yIGFuIGluZm9ybWF0aW9uICJldmVudCIgZ2VuZXJhdGVkIGJ5IHRoZSBjYXJkCisJICogVGhlIGNvbnRyb2xsZXIgcmV0dXJuIHRvIHVzIGEgcHNldWRvIGZyYW1lIGNvbnRhaW5pbmcKKwkgKiB0aGUgaW5mb3JtYXRpb24gaW4gcXVlc3Rpb24gLSBKZWFuIElJICovCisJaW5mb2ZpZCA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIElORk9GSUQpOworCisJLyogUmVhZCB0aGUgaW5mbyBmcmFtZSBoZWFkZXIgLSBkb24ndCB0cnkgdG9vIGhhcmQgKi8KKwllcnIgPSBoZXJtZXNfYmFwX3ByZWFkKGh3LCBJUlFfQkFQLCAmaW5mbywgc2l6ZW9mKGluZm8pLAorCQkJICAgICAgIGluZm9maWQsIDApOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgJWQgcmVhZGluZyBpbmZvIGZyYW1lLiAiCisJCSAgICAgICAiRnJhbWUgZHJvcHBlZC5cbiIsIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuOworCX0KKwkKKwlsZW4gPSBIRVJNRVNfUkVDTEVOX1RPX0JZVEVTKGxlMTZfdG9fY3B1KGluZm8ubGVuKSk7CisJdHlwZSA9IGxlMTZfdG9fY3B1KGluZm8udHlwZSk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEhFUk1FU19JTlFfVEFMTElFUzogeworCQlzdHJ1Y3QgaGVybWVzX3RhbGxpZXNfZnJhbWUgdGFsbGllczsKKwkJc3RydWN0IGl3X3N0YXRpc3RpY3MgKndzdGF0cyA9ICZwcml2LT53c3RhdHM7CisJCQorCQlpZiAobGVuID4gc2l6ZW9mKHRhbGxpZXMpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVGFsbGllcyBmcmFtZSB0b28gbG9uZyAoJWQgYnl0ZXMpXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgbGVuKTsKKwkJCWxlbiA9IHNpemVvZih0YWxsaWVzKTsKKwkJfQorCQkKKwkJLyogUmVhZCBkaXJlY3RseSB0aGUgZGF0YSAobm8gc2VlaykgKi8KKwkJaGVybWVzX3JlYWRfd29yZHMoaHcsIEhFUk1FU19EQVRBMSwgKHZvaWQgKikgJnRhbGxpZXMsCisJCQkJICBsZW4gLyAyKTsgLyogRklYTUU6IGJsZWNoISAqLworCQkKKwkJLyogSW5jcmVtZW50IG91ciB2YXJpb3VzIGNvdW50ZXJzICovCisJCS8qIHdzdGF0cy0+ZGlzY2FyZC5ud2lkIC0gbm8gd3JvbmcgQlNTSUQgc3R1ZmYgKi8KKwkJd3N0YXRzLT5kaXNjYXJkLmNvZGUgKz0KKwkJCWxlMTZfdG9fY3B1KHRhbGxpZXMuUnhXRVBVbmRlY3J5cHRhYmxlKTsKKwkJaWYgKGxlbiA9PSBzaXplb2YodGFsbGllcykpICAKKwkJCXdzdGF0cy0+ZGlzY2FyZC5jb2RlICs9CisJCQkJbGUxNl90b19jcHUodGFsbGllcy5SeERpc2NhcmRzX1dFUElDVkVycm9yKSArCisJCQkJbGUxNl90b19jcHUodGFsbGllcy5SeERpc2NhcmRzX1dFUEV4Y2x1ZGVkKTsKKwkJd3N0YXRzLT5kaXNjYXJkLm1pc2MgKz0KKwkJCWxlMTZfdG9fY3B1KHRhbGxpZXMuVHhEaXNjYXJkc1dyb25nU0EpOworCQl3c3RhdHMtPmRpc2NhcmQuZnJhZ21lbnQgKz0KKwkJCWxlMTZfdG9fY3B1KHRhbGxpZXMuUnhNc2dJbkJhZE1zZ0ZyYWdtZW50cyk7CisJCXdzdGF0cy0+ZGlzY2FyZC5yZXRyaWVzICs9CisJCQlsZTE2X3RvX2NwdSh0YWxsaWVzLlR4UmV0cnlMaW1pdEV4Y2VlZGVkKTsKKwkJLyogd3N0YXRzLT5taXNzLmJlYWNvbiAtIG5vIG1hdGNoICovCisJfQorCWJyZWFrOworCWNhc2UgSEVSTUVTX0lOUV9MSU5LU1RBVFVTOiB7CisJCXN0cnVjdCBoZXJtZXNfbGlua3N0YXR1cyBsaW5rc3RhdHVzOworCQl1MTYgbmV3c3RhdHVzOworCQlpbnQgY29ubmVjdGVkOworCisJCWlmIChsZW4gIT0gc2l6ZW9mKGxpbmtzdGF0dXMpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5leHBlY3RlZCBzaXplIGZvciBsaW5rc3RhdHVzIGZyYW1lICglZCBieXRlcylcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBsZW4pOworCQkJYnJlYWs7CisJCX0KKworCQloZXJtZXNfcmVhZF93b3JkcyhodywgSEVSTUVTX0RBVEExLCAodm9pZCAqKSAmbGlua3N0YXR1cywKKwkJCQkgIGxlbiAvIDIpOworCQluZXdzdGF0dXMgPSBsZTE2X3RvX2NwdShsaW5rc3RhdHVzLmxpbmtzdGF0dXMpOworCisJCWNvbm5lY3RlZCA9IChuZXdzdGF0dXMgPT0gSEVSTUVTX0xJTktTVEFUVVNfQ09OTkVDVEVEKQorCQkJfHwgKG5ld3N0YXR1cyA9PSBIRVJNRVNfTElOS1NUQVRVU19BUF9DSEFOR0UpCisJCQl8fCAobmV3c3RhdHVzID09IEhFUk1FU19MSU5LU1RBVFVTX0FQX0lOX1JBTkdFKTsKKworCQlpZiAoY29ubmVjdGVkKQorCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQllbHNlCisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJCWlmIChuZXdzdGF0dXMgIT0gcHJpdi0+bGFzdF9saW5rc3RhdHVzKQorCQkJcHJpbnRfbGlua3N0YXR1cyhkZXYsIG5ld3N0YXR1cyk7CisKKwkJcHJpdi0+bGFzdF9saW5rc3RhdHVzID0gbmV3c3RhdHVzOworCX0KKwlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFVua25vd24gaW5mb3JtYXRpb24gZnJhbWUgcmVjZWl2ZWQ6ICIKKwkJICAgICAgICJ0eXBlIDB4JTA0eCwgbGVuZ3RoICVkXG4iLCBkZXYtPm5hbWUsIHR5cGUsIGxlbik7CisJCS8qIFdlIGRvbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nIGFib3V0IGl0ICovCisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgX19vcmlub2NvX2V2X2luZmRyb3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaGVybWVzX3QgKmh3KQoreworCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogSW5mb3JtYXRpb24gZnJhbWUgbG9zdC5cbiIsIGRldi0+bmFtZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEludGVybmFsIGhhcmR3YXJlIGNvbnRyb2wgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IF9fb3Jpbm9jb191cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnI7CisKKwllcnIgPSBfX29yaW5vY29fcHJvZ3JhbV9yaWRzKGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBjb25maWd1cmluZyBjYXJkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIEZpcmUgdGhpbmdzIHVwIGFnYWluICovCisJaGVybWVzX3NldF9pcnFtYXNrKGh3LCBPUklOT0NPX0lOVEVOKTsKKwllcnIgPSBoZXJtZXNfZW5hYmxlX3BvcnQoaHcsIDApOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgZW5hYmxpbmcgTUFDIHBvcnRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCitpbnQgX19vcmlub2NvX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaGVybWVzICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKCEgcHJpdi0+aHdfdW5hdmFpbGFibGUpIHsKKwkJaWYgKCEgcHJpdi0+YnJva2VuX2Rpc2FibGVwb3J0KSB7CisJCQllcnIgPSBoZXJtZXNfZGlzYWJsZV9wb3J0KGh3LCAwKTsKKwkJCWlmIChlcnIpIHsKKwkJCQkvKiBTb21lIGZpcm13YXJlcyAoZS5nLiBJbnRlcnNpbCAxLjMueCkgc2VlbQorCQkJCSAqIHRvIGhhdmUgcHJvYmxlbXMgZGlzYWJsaW5nIHRoZSBwb3J0LCBvaAorCQkJCSAqIHdlbGwsIHRvbyBiYWQuICovCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEVycm9yICVkIGRpc2FibGluZyBNQUMgcG9ydFxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQkJCXByaXYtPmJyb2tlbl9kaXNhYmxlcG9ydCA9IDE7CisJCQl9CisJCX0KKwkJaGVybWVzX3NldF9pcnFtYXNrKGh3LCAwKTsKKwkJaGVybWVzX3dyaXRlX3JlZ24oaHcsIEVWQUNLLCAweGZmZmYpOworCX0KKwkKKwkvKiBmaXJtd2FyZSB3aWxsIGhhdmUgdG8gcmVhc3NvY2lhdGUgKi8KKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCXByaXYtPmxhc3RfbGlua3N0YXR1cyA9IDB4ZmZmZjsKKworCXJldHVybiAwOworfQorCitpbnQgb3Jpbm9jb19yZWluaXRfZmlybXdhcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaGVybWVzICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyOworCisJZXJyID0gaGVybWVzX2luaXQoaHcpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBoZXJtZXNfYWxsb2NhdGUoaHcsIHByaXYtPm5pY2J1Zl9zaXplLCAmcHJpdi0+dHhmaWQpOworCWlmIChlcnIgPT0gLUVJTykgeworCQkvKiBUcnkgd29ya2Fyb3VuZCBmb3Igb2xkIFN5bWJvbCBmaXJtd2FyZSBidWcgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZpcm13YXJlIEFMTE9DIGJ1ZyBkZXRlY3RlZCAiCisJCSAgICAgICAiKG9sZCBTeW1ib2wgZmlybXdhcmU/KS4gVHJ5aW5nIHRvIHdvcmsgYXJvdW5kLi4uICIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQkKKwkJcHJpdi0+bmljYnVmX3NpemUgPSBUWF9OSUNCVUZfU0laRV9CVUc7CisJCWVyciA9IGhlcm1lc19hbGxvY2F0ZShodywgcHJpdi0+bmljYnVmX3NpemUsICZwcml2LT50eGZpZCk7CisJCWlmIChlcnIpCisJCQlwcmludGsoImZhaWxlZCFcbiIpOworCQllbHNlCisJCQlwcmludGsoIm9rLlxuIik7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX29yaW5vY29faHdfc2V0X2JpdHJhdGUoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdikKK3sKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVyciA9IDA7CisKKwlpZiAocHJpdi0+Yml0cmF0ZW1vZGUgPj0gQklUUkFURV9UQUJMRV9TSVpFKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEJVRzogSW52YWxpZCBiaXRyYXRlIG1vZGUgJWRcbiIsCisJCSAgICAgICBwcml2LT5uZGV2LT5uYW1lLCBwcml2LT5iaXRyYXRlbW9kZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAocHJpdi0+ZmlybXdhcmVfdHlwZSkgeworCWNhc2UgRklSTVdBUkVfVFlQRV9BR0VSRToKKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORlRYUkFURUNPTlRST0wsCisJCQkJCSAgIGJpdHJhdGVfdGFibGVbcHJpdi0+Yml0cmF0ZW1vZGVdLmFnZXJlX3R4cmF0ZWN0cmwpOworCQlicmVhazsKKwljYXNlIEZJUk1XQVJFX1RZUEVfSU5URVJTSUw6CisJY2FzZSBGSVJNV0FSRV9UWVBFX1NZTUJPTDoKKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORlRYUkFURUNPTlRST0wsCisJCQkJCSAgIGJpdHJhdGVfdGFibGVbcHJpdi0+Yml0cmF0ZW1vZGVdLmludGVyc2lsX3R4cmF0ZWN0cmwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBDaGFuZ2UgdGhlIFdFUCBrZXlzIGFuZC9vciB0aGUgY3VycmVudCBrZXlzLiAgQ2FuIGJlIGNhbGxlZAorICogZWl0aGVyIGZyb20gX19vcmlub2NvX2h3X3NldHVwX3dlcCgpIG9yIGRpcmVjdGx5IGZyb20KKyAqIG9yaW5vY29faW9jdGxfc2V0aXdlbmNvZGUoKS4gIEluIHRoZSBsYXRlciBjYXNlIHRoZSBhc3NvY2lhdGlvbgorICogd2l0aCB0aGUgQVAgaXMgbm90IGJyb2tlbiAoaWYgdGhlIGZpcm13YXJlIGNhbiBoYW5kbGUgaXQpLAorICogd2hpY2ggaXMgbmVlZGVkIGZvciA4MDIuMXggaW1wbGVtZW50YXRpb25zLiAqLworc3RhdGljIGludCBfX29yaW5vY29faHdfc2V0dXBfd2Vwa2V5cyhzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQoreworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKworCXN3aXRjaCAocHJpdi0+ZmlybXdhcmVfdHlwZSkgeworCWNhc2UgRklSTVdBUkVfVFlQRV9BR0VSRToKKwkJZXJyID0gSEVSTUVTX1dSSVRFX1JFQ09SRChodywgVVNFUl9CQVAsCisJCQkJCSAgSEVSTUVTX1JJRF9DTkZXRVBLRVlTX0FHRVJFLAorCQkJCQkgICZwcml2LT5rZXlzKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICAgSEVSTUVTX1JJRF9DTkZUWEtFWV9BR0VSRSwKKwkJCQkJICAgcHJpdi0+dHhfa2V5KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWJyZWFrOworCWNhc2UgRklSTVdBUkVfVFlQRV9JTlRFUlNJTDoKKwljYXNlIEZJUk1XQVJFX1RZUEVfU1lNQk9MOgorCQl7CisJCQlpbnQga2V5bGVuOworCQkJaW50IGk7CisKKwkJCS8qIEZvcmNlIHVuaWZvcm0ga2V5IGxlbmd0aCB0byB3b3JrIGFyb3VuZCBmaXJtd2FyZSBidWdzICovCisJCQlrZXlsZW4gPSBsZTE2X3RvX2NwdShwcml2LT5rZXlzW3ByaXYtPnR4X2tleV0ubGVuKTsKKwkJCQorCQkJaWYgKGtleWxlbiA+IExBUkdFX0tFWV9TSVpFKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQlVHOiBLZXkgJWQgaGFzIG92ZXJzaXplIGxlbmd0aCAlZC5cbiIsCisJCQkJICAgICAgIHByaXYtPm5kZXYtPm5hbWUsIHByaXYtPnR4X2tleSwga2V5bGVuKTsKKwkJCQlyZXR1cm4gLUUyQklHOworCQkJfQorCisJCQkvKiBXcml0ZSBhbGwgNCBrZXlzICovCisJCQlmb3IoaSA9IDA7IGkgPCBPUklOT0NPX01BWF9LRVlTOyBpKyspIHsKKwkJCQllcnIgPSBoZXJtZXNfd3JpdGVfbHR2KGh3LCBVU0VSX0JBUCwKKwkJCQkJCSAgICAgICBIRVJNRVNfUklEX0NORkRFRkFVTFRLRVkwICsgaSwKKwkJCQkJCSAgICAgICBIRVJNRVNfQllURVNfVE9fUkVDTEVOKGtleWxlbiksCisJCQkJCQkgICAgICAgcHJpdi0+a2V5c1tpXS5kYXRhKTsKKwkJCQlpZiAoZXJyKQorCQkJCQlyZXR1cm4gZXJyOworCQkJfQorCisJCQkvKiBXcml0ZSB0aGUgaW5kZXggb2YgdGhlIGtleSB1c2VkIGluIHRyYW5zbWlzc2lvbiAqLworCQkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkJICAgSEVSTUVTX1JJRF9DTkZXRVBERUZBVUxUS0VZSUQsCisJCQkJCQkgICBwcml2LT50eF9rZXkpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fb3Jpbm9jb19od19zZXR1cF93ZXAoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdikKK3sKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVyciA9IDA7CisJaW50IG1hc3Rlcl93ZXBfZmxhZzsKKwlpbnQgYXV0aF9mbGFnOworCisJaWYgKHByaXYtPndlcF9vbikKKwkJX19vcmlub2NvX2h3X3NldHVwX3dlcGtleXMocHJpdik7CisKKwlpZiAocHJpdi0+d2VwX3Jlc3RyaWN0KQorCQlhdXRoX2ZsYWcgPSBIRVJNRVNfQVVUSF9TSEFSRURfS0VZOworCWVsc2UKKwkJYXV0aF9mbGFnID0gSEVSTUVTX0FVVEhfT1BFTjsKKworCXN3aXRjaCAocHJpdi0+ZmlybXdhcmVfdHlwZSkgeworCWNhc2UgRklSTVdBUkVfVFlQRV9BR0VSRTogLyogQWdlcmUgc3R5bGUgV0VQICovCisJCWlmIChwcml2LT53ZXBfb24pIHsKKwkJCS8qIEVuYWJsZSB0aGUgc2hhcmVkLWtleSBhdXRoZW50aWNhdGlvbi4gKi8KKwkJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJCSAgIEhFUk1FU19SSURfQ05GQVVUSEVOVElDQVRJT05fQUdFUkUsCisJCQkJCQkgICBhdXRoX2ZsYWcpOworCQl9CisJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICAgSEVSTUVTX1JJRF9DTkZXRVBFTkFCTEVEX0FHRVJFLAorCQkJCQkgICBwcml2LT53ZXBfb24pOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CisKKwljYXNlIEZJUk1XQVJFX1RZUEVfSU5URVJTSUw6IC8qIEludGVyc2lsIHN0eWxlIFdFUCAqLworCWNhc2UgRklSTVdBUkVfVFlQRV9TWU1CT0w6IC8qIFN5bWJvbCBzdHlsZSBXRVAgKi8KKwkJaWYgKHByaXYtPndlcF9vbikgeworCQkJaWYgKHByaXYtPndlcF9yZXN0cmljdCB8fAorCQkJICAgIChwcml2LT5maXJtd2FyZV90eXBlID09IEZJUk1XQVJFX1RZUEVfU1lNQk9MKSkKKwkJCQltYXN0ZXJfd2VwX2ZsYWcgPSBIRVJNRVNfV0VQX1BSSVZBQ1lfSU5WT0tFRCB8CisJCQkJCQkgIEhFUk1FU19XRVBfRVhDTF9VTkVOQ1JZUFRFRDsKKwkJCWVsc2UKKwkJCQltYXN0ZXJfd2VwX2ZsYWcgPSBIRVJNRVNfV0VQX1BSSVZBQ1lfSU5WT0tFRDsKKworCQkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkJICAgSEVSTUVTX1JJRF9DTkZBVVRIRU5USUNBVElPTiwKKwkJCQkJCSAgIGF1dGhfZmxhZyk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0gZWxzZQorCQkJbWFzdGVyX3dlcF9mbGFnID0gMDsKKworCQlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCQltYXN0ZXJfd2VwX2ZsYWcgfD0gSEVSTUVTX1dFUF9IT1NUX0RFQ1JZUFQ7CisKKwkJLyogTWFzdGVyIFdFUCBzZXR0aW5nIDogb24vb2ZmICovCisJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICAgSEVSTUVTX1JJRF9DTkZXRVBGTEFHU19JTlRFUlNJTCwKKwkJCQkJICAgbWFzdGVyX3dlcF9mbGFnKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CQorCisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fb3Jpbm9jb19wcm9ncmFtX3JpZHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVycjsKKwlzdHJ1Y3QgaGVybWVzX2lkc3RyaW5nIGlkYnVmOworCisJLyogU2V0IHRoZSBNQUMgYWRkcmVzcyAqLworCWVyciA9IGhlcm1lc193cml0ZV9sdHYoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORk9XTk1BQ0FERFIsCisJCQkgICAgICAgSEVSTUVTX0JZVEVTX1RPX1JFQ0xFTihFVEhfQUxFTiksIGRldi0+ZGV2X2FkZHIpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyBNQUMgYWRkcmVzc1xuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBTZXQgdXAgdGhlIGxpbmsgbW9kZSAqLworCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZQT1JUVFlQRSwKKwkJCQkgICBwcml2LT5wb3J0X3R5cGUpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyBwb3J0IHR5cGVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCS8qIFNldCB0aGUgY2hhbm5lbC9mcmVxdWVuY3kgKi8KKwlpZiAocHJpdi0+Y2hhbm5lbCA9PSAwKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogQ2hhbm5lbCBpcyAwIGluIF9fb3Jpbm9jb19wcm9ncmFtX3JpZHMoKVxuIiwgZGV2LT5uYW1lKTsKKwkJaWYgKHByaXYtPmNyZWF0ZWlic3MpCisJCQlwcml2LT5jaGFubmVsID0gMTA7CisJfQorCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZPV05DSEFOTkVMLAorCQkJCSAgIHByaXYtPmNoYW5uZWwpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyBjaGFubmVsXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChwcml2LT5oYXNfaWJzcykgeworCQl1MTYgY3JlYXRlaWJzczsKKworCQlpZiAoKHN0cmxlbihwcml2LT5kZXNpcmVkX2Vzc2lkKSA9PSAwKSAmJiAocHJpdi0+Y3JlYXRlaWJzcykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUaGlzIGZpcm13YXJlIHJlcXVpcmVzIGFuICIKKwkJCSAgICAgICAiRVNTSUQgaW4gSUJTUy1BZC1Ib2MgbW9kZS5cbiIsIGRldi0+bmFtZSk7CisJCQkvKiBXaXRoIHd2bGFuX2NzLCBpbiB0aGlzIGNhc2UsIHdlIHdvdWxkIGNyYXNoLgorCQkJICogaG9wZWZ1bGx5LCB0aGlzIGRyaXZlciB3aWxsIGJlaGF2ZSBiZXR0ZXIuLi4KKwkJCSAqIEplYW4gSUkgKi8KKwkJCWNyZWF0ZWlic3MgPSAwOworCQl9IGVsc2UgeworCQkJY3JlYXRlaWJzcyA9IHByaXYtPmNyZWF0ZWlic3M7CisJCX0KKwkJCisJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICAgSEVSTUVTX1JJRF9DTkZDUkVBVEVJQlNTLAorCQkJCQkgICBjcmVhdGVpYnNzKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyBDUkVBVEVJQlNTXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwkvKiBTZXQgdGhlIGRlc2lyZWQgRVNTSUQgKi8KKwlpZGJ1Zi5sZW4gPSBjcHVfdG9fbGUxNihzdHJsZW4ocHJpdi0+ZGVzaXJlZF9lc3NpZCkpOworCW1lbWNweSgmaWRidWYudmFsLCBwcml2LT5kZXNpcmVkX2Vzc2lkLCBzaXplb2YoaWRidWYudmFsKSk7CisJLyogV2luWFAgd2FudHMgcGFydG5lciB0byBjb25maWd1cmUgT1dOU1NJRCBldmVuIGluIElCU1MgbW9kZS4gKGppbWMpICovCisJZXJyID0gaGVybWVzX3dyaXRlX2x0dihodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GT1dOU1NJRCwKKwkJCSAgICAgICBIRVJNRVNfQllURVNfVE9fUkVDTEVOKHN0cmxlbihwcml2LT5kZXNpcmVkX2Vzc2lkKSsyKSwKKwkJCSAgICAgICAmaWRidWYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyBPV05TU0lEXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKwllcnIgPSBoZXJtZXNfd3JpdGVfbHR2KGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZERVNJUkVEU1NJRCwKKwkJCSAgICAgICBIRVJNRVNfQllURVNfVE9fUkVDTEVOKHN0cmxlbihwcml2LT5kZXNpcmVkX2Vzc2lkKSsyKSwKKwkJCSAgICAgICAmaWRidWYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyBERVNJUkVEU1NJRFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBTZXQgdGhlIHN0YXRpb24gbmFtZSAqLworCWlkYnVmLmxlbiA9IGNwdV90b19sZTE2KHN0cmxlbihwcml2LT5uaWNrKSk7CisJbWVtY3B5KCZpZGJ1Zi52YWwsIHByaXYtPm5pY2ssIHNpemVvZihpZGJ1Zi52YWwpKTsKKwllcnIgPSBoZXJtZXNfd3JpdGVfbHR2KGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZPV05OQU1FLAorCQkJICAgICAgIEhFUk1FU19CWVRFU19UT19SRUNMRU4oc3RybGVuKHByaXYtPm5pY2spKzIpLAorCQkJICAgICAgICZpZGJ1Zik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIG5pY2tuYW1lXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIFNldCBBUCBkZW5zaXR5ICovCisJaWYgKHByaXYtPmhhc19zZW5zaXRpdml0eSkgeworCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgIEhFUk1FU19SSURfQ05GU1lTVEVNU0NBTEUsCisJCQkJCSAgIHByaXYtPmFwX2RlbnNpdHkpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRXJyb3IgJWQgc2V0dGluZyBTWVNURU1TQ0FMRS4gICIKKwkJCSAgICAgICAiRGlzYWJsaW5nIHNlbnNpdGl2aXR5IGNvbnRyb2xcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCisJCQlwcml2LT5oYXNfc2Vuc2l0aXZpdHkgPSAwOworCQl9CisJfQorCisJLyogU2V0IFJUUyB0aHJlc2hvbGQgKi8KKwllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GUlRTVEhSRVNIT0xELAorCQkJCSAgIHByaXYtPnJ0c190aHJlc2gpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyBSVFMgdGhyZXNob2xkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIFNldCBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCBvciBNV08gcm9idXN0bmVzcyAqLworCWlmIChwcml2LT5oYXNfbXdvKQorCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgIEhFUk1FU19SSURfQ05GTVdPUk9CVVNUX0FHRVJFLAorCQkJCQkgICBwcml2LT5td29fcm9idXN0KTsKKwllbHNlCisJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICAgSEVSTUVTX1JJRF9DTkZGUkFHTUVOVEFUSU9OVEhSRVNIT0xELAorCQkJCQkgICBwcml2LT5mcmFnX3RocmVzaCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIGZyYWdtZW50YXRpb25cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogU2V0IGJpdHJhdGUgKi8KKwllcnIgPSBfX29yaW5vY29faHdfc2V0X2JpdHJhdGUocHJpdik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIGJpdHJhdGVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogU2V0IHBvd2VyIG1hbmFnZW1lbnQgKi8KKwlpZiAocHJpdi0+aGFzX3BtKSB7CisJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICAgSEVSTUVTX1JJRF9DTkZQTUVOQUJMRUQsCisJCQkJCSAgIHByaXYtPnBtX29uKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyB1cCBQTVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORk1VTFRJQ0FTVFJFQ0VJVkUsCisJCQkJCSAgIHByaXYtPnBtX21jYXN0KTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyB1cCBQTVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICAgSEVSTUVTX1JJRF9DTkZNQVhTTEVFUERVUkFUSU9OLAorCQkJCQkgICBwcml2LT5wbV9wZXJpb2QpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIHVwIFBNXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORlBNSE9MRE9WRVJEVVJBVElPTiwKKwkJCQkJICAgcHJpdi0+cG1fdGltZW91dCk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgdXAgUE1cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCS8qIFNldCBwcmVhbWJsZSAtIG9ubHkgZm9yIFN5bWJvbCBzbyBmYXIuLi4gKi8KKwlpZiAocHJpdi0+aGFzX3ByZWFtYmxlKSB7CisJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICAgSEVSTUVTX1JJRF9DTkZQUkVBTUJMRV9TWU1CT0wsCisJCQkJCSAgIHByaXYtPnByZWFtYmxlKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyBwcmVhbWJsZVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJLyogU2V0IHVwIGVuY3J5cHRpb24gKi8KKwlpZiAocHJpdi0+aGFzX3dlcCkgeworCQllcnIgPSBfX29yaW5vY29faHdfc2V0dXBfd2VwKHByaXYpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBhY3RpdmF0aW5nIFdFUFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJLyogU2V0IHByb21pc2N1aXR5IC8gbXVsdGljYXN0Ki8KKwlwcml2LT5wcm9taXNjdW91cyA9IDA7CisJcHJpdi0+bWNfY291bnQgPSAwOworCV9fb3Jpbm9jb19zZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsgLyogRklYTUU6IHdoYXQgYWJvdXQgdGhlIHhtaXRfbG9jayAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qIEZJWE1FOiByZXR1cm4gaW50PyAqLworc3RhdGljIHZvaWQKK19fb3Jpbm9jb19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVyciA9IDA7CisJaW50IHByb21pc2MsIG1jX2NvdW50OworCisJLyogVGhlIEhlcm1lcyBkb2Vzbid0IHNlZW0gdG8gaGF2ZSBhbiBhbGxtdWx0aSBtb2RlLCBzbyB3ZSBnbworCSAqIGludG8gcHJvbWlzY3VvdXMgbW9kZSBhbmQgbGV0IHRoZSB1cHBlciBsZXZlbHMgZGVhbC4gKi8KKwlpZiAoIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHx8IChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fAorCSAgICAgKGRldi0+bWNfY291bnQgPiBNQVhfTVVMVElDQVNUKHByaXYpKSApIHsKKwkJcHJvbWlzYyA9IDE7CisJCW1jX2NvdW50ID0gMDsKKwl9IGVsc2UgeworCQlwcm9taXNjID0gMDsKKwkJbWNfY291bnQgPSBkZXYtPm1jX2NvdW50OworCX0KKworCWlmIChwcm9taXNjICE9IHByaXYtPnByb21pc2N1b3VzKSB7CisJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICAgSEVSTUVTX1JJRF9DTkZQUk9NSVNDVU9VU01PREUsCisJCQkJCSAgIHByb21pc2MpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIFBST01JU0NVT1VTTU9ERSB0byAxLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCX0gZWxzZSAKKwkJCXByaXYtPnByb21pc2N1b3VzID0gcHJvbWlzYzsKKwl9CisKKwlpZiAoISBwcm9taXNjICYmIChtY19jb3VudCB8fCBwcml2LT5tY19jb3VudCkgKSB7CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqcCA9IGRldi0+bWNfbGlzdDsKKwkJc3RydWN0IGhlcm1lc19tdWx0aWNhc3QgbWNsaXN0OworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbWNfY291bnQ7IGkrKykgeworCQkJLyogcGFyYW5vaWE6IGlzIGxpc3Qgc2hvcnRlciB0aGFuIG1jX2NvdW50PyAqLworCQkJQlVHX09OKCEgcCk7CisJCQkvKiBwYXJhbm9pYTogYmFkIGFkZHJlc3Mgc2l6ZSBpbiBsaXN0PyAqLworCQkJQlVHX09OKHAtPmRtaV9hZGRybGVuICE9IEVUSF9BTEVOKTsKKwkJCQorCQkJbWVtY3B5KG1jbGlzdC5hZGRyW2ldLCBwLT5kbWlfYWRkciwgRVRIX0FMRU4pOworCQkJcCA9IHAtPm5leHQ7CisJCX0KKwkJCisJCWlmIChwKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE11bHRpY2FzdCBsaXN0IGlzICIKKwkJCSAgICAgICAibG9uZ2VyIHRoYW4gbWNfY291bnRcbiIsIGRldi0+bmFtZSk7CisKKwkJZXJyID0gaGVybWVzX3dyaXRlX2x0dihodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GR1JPVVBBRERSRVNTRVMsCisJCQkJICAgICAgIEhFUk1FU19CWVRFU19UT19SRUNMRU4ocHJpdi0+bWNfY291bnQgKiBFVEhfQUxFTiksCisJCQkJICAgICAgICZtY2xpc3QpOworCQlpZiAoZXJyKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyBtdWx0aWNhc3QgbGlzdC5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQllbHNlCisJCQlwcml2LT5tY19jb3VudCA9IG1jX2NvdW50OworCX0KKworCS8qIFNpbmNlIHdlIGNhbiBzZXQgdGhlIHByb21pc2N1b3VzIGZsYWcgd2hlbiBpdCB3YXNuJ3QgYXNrZWQKKwkgICBmb3IsIG1ha2Ugc3VyZSB0aGUgbmV0X2RldmljZSBrbm93cyBhYm91dCBpdC4gKi8KKwlpZiAocHJpdi0+cHJvbWlzY3VvdXMpCisJCWRldi0+ZmxhZ3MgfD0gSUZGX1BST01JU0M7CisJZWxzZQorCQlkZXYtPmZsYWdzICY9IH5JRkZfUFJPTUlTQzsKK30KKworc3RhdGljIGludCBvcmlub2NvX3JlY29uZmlndXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyID0gMDsKKworCWlmIChwcml2LT5icm9rZW5fZGlzYWJsZXBvcnQpIHsKKwkJc2NoZWR1bGVfd29yaygmcHJpdi0+cmVzZXRfd29yayk7CisJCXJldHVybiAwOworCX0KKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCQkKKwllcnIgPSBoZXJtZXNfZGlzYWJsZV9wb3J0KGh3LCAwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmFibGUgdG8gZGlzYWJsZSBwb3J0IHdoaWxlIHJlY29uZmlndXJpbmcgY2FyZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXByaXYtPmJyb2tlbl9kaXNhYmxlcG9ydCA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IF9fb3Jpbm9jb19wcm9ncmFtX3JpZHMoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmFibGUgdG8gcmVjb25maWd1cmUgY2FyZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IGhlcm1lc19lbmFibGVfcG9ydChodywgMCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5hYmxlIHRvIGVuYWJsZSBwb3J0IHdoaWxlIHJlY29uZmlndXJpbmcgY2FyZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworIG91dDoKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZXNldHRpbmcgaW5zdGVhZC4uLlxuIiwgZGV2LT5uYW1lKTsKKwkJc2NoZWR1bGVfd29yaygmcHJpdi0+cmVzZXRfd29yayk7CisJCWVyciA9IDA7CisJfQorCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwlyZXR1cm4gZXJyOworCit9CisKKy8qIFRoaXMgbXVzdCBiZSBjYWxsZWQgZnJvbSB1c2VyIGNvbnRleHQsIHdpdGhvdXQgbG9ja3MgaGVsZCAtIHVzZQorICogc2NoZWR1bGVfd29yaygpICovCitzdGF0aWMgdm9pZCBvcmlub2NvX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQkvKiBXaGVuIHRoZSBoYXJkd2FyZSBiZWNvbWVzIGF2YWlsYWJsZSBhZ2Fpbiwgd2hhdGV2ZXIKKwkJICogZGV0ZWN0cyB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciByZS1pbml0aWFsaXppbmcKKwkJICogaXQuIFNvIG5vIG5lZWQgZm9yIGFueXRoaW5nIGZ1cnRoZXIgKi8KKwkJcmV0dXJuOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogU2h1dCBvZmYgaW50ZXJydXB0cy4gIERlcGVuZGluZyBvbiB3aGF0IHN0YXRlIHRoZSBoYXJkd2FyZQorCSAqIGlzIGluLCB0aGlzIG1pZ2h0IG5vdCB3b3JrLCBidXQgd2UnbGwgdHJ5IGFueXdheSAqLworCWhlcm1lc19zZXRfaXJxbWFzayhodywgMCk7CisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIEVWQUNLLCAweGZmZmYpOworCisJcHJpdi0+aHdfdW5hdmFpbGFibGUrKzsKKwlwcml2LT5sYXN0X2xpbmtzdGF0dXMgPSAweGZmZmY7IC8qIGZpcm13YXJlIHdpbGwgaGF2ZSB0byByZWFzc29jaWF0ZSAqLworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJaWYgKHByaXYtPmhhcmRfcmVzZXQpCisJCWVyciA9ICgqcHJpdi0+aGFyZF9yZXNldCkocHJpdik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvcmlub2NvX3Jlc2V0OiBFcnJvciAlZCAiCisJCSAgICAgICAicGVyZm9ybWluZyAgaGFyZCByZXNldFxuIiwgZGV2LT5uYW1lLCBlcnIpOworCQkvKiBGSVhNRTogc2h1dGRvd24gb2Ygc29tZSBzb3J0ICovCisJCXJldHVybjsKKwl9CisKKwllcnIgPSBvcmlub2NvX3JlaW5pdF9maXJtd2FyZShkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogb3Jpbm9jb19yZXNldDogRXJyb3IgJWQgcmUtaW5pdGlhbGl6aW5nIGZpcm13YXJlXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7IC8qIFRoaXMgaGFzIHRvIGJlIGNhbGxlZCBmcm9tIHVzZXIgY29udGV4dCAqLworCisJcHJpdi0+aHdfdW5hdmFpbGFibGUtLTsKKworCS8qIHByaXYtPm9wZW4gb3IgcHJpdi0+aHdfdW5hdmFpbGFibGUgbWlnaHQgaGF2ZSBjaGFuZ2VkIHdoaWxlCisJICogd2UgZHJvcHBlZCB0aGUgbG9jayAqLworCWlmIChwcml2LT5vcGVuICYmICghIHByaXYtPmh3X3VuYXZhaWxhYmxlKSkgeworCQllcnIgPSBfX29yaW5vY29fdXAoZGV2KTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogb3Jpbm9jb19yZXNldDogRXJyb3IgJWQgcmVlbmFibGluZyBjYXJkXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJfSBlbHNlCisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwl9CisKKwlzcGluX3VubG9ja19pcnEoJnByaXYtPmxvY2spOworCisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbnRlcnJ1cHQgaGFuZGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIF9fb3Jpbm9jb19ldl90aWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGhlcm1lc190ICpodykKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRJQ0tcbiIsIGRldi0+bmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fb3Jpbm9jb19ldl93dGVycihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBoZXJtZXNfdCAqaHcpCit7CisJLyogVGhpcyBzZWVtcyB0byBoYXBwZW4gYSBmYWlyIGJpdCB1bmRlciBsb2FkLCBidXQgaWdub3JpbmcgaXQKKwkgICBzZWVtcyB0byB3b3JrIGZpbmUuLi4qLworCXByaW50ayhLRVJOX0RFQlVHICIlczogTUFDIGNvbnRyb2xsZXIgZXJyb3IgKFdURVJSKS4gSWdub3JpbmcuXG4iLAorCSAgICAgICBkZXYtPm5hbWUpOworfQorCitpcnFyZXR1cm5fdCBvcmlub2NvX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBjb3VudCA9IE1BWF9JUlFMT09QU19QRVJfSVJROworCXUxNiBldnN0YXQsIGV2ZW50czsKKwkvKiBUaGVzZSBhcmUgdXNlZCB0byBkZXRlY3QgYSBydW5hd2F5IGludGVycnVwdCBzaXR1YXRpb24gKi8KKwkvKiBJZiB3ZSBnZXQgbW9yZSB0aGFuIE1BWF9JUlFMT09QU19QRVJfSklGRlkgaXRlcmF0aW9ucyBpbiBhIGppZmZ5LAorCSAqIHdlIHBhbmljIGFuZCBzaHV0IGRvd24gdGhlIGhhcmR3YXJlICovCisJc3RhdGljIGludCBsYXN0X2lycV9qaWZmeSA9IDA7IC8qIGppZmZpZXMgdmFsdWUgdGhlIGxhc3QgdGltZQorCQkJCQkqIHdlIHdlcmUgY2FsbGVkICovCisJc3RhdGljIGludCBsb29wc190aGlzX2ppZmZ5ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApIHsKKwkJLyogSWYgaHcgaXMgdW5hdmFpbGFibGUgLSB3ZSBkb24ndCBrbm93IGlmIHRoZSBpcnEgd2FzCisJCSAqIGZvciB1cyBvciBub3QgKi8KKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWV2c3RhdCA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIEVWU1RBVCk7CisJZXZlbnRzID0gZXZzdGF0ICYgaHctPmludGVuOworCWlmICghIGV2ZW50cykgeworCQlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCQorCWlmIChqaWZmaWVzICE9IGxhc3RfaXJxX2ppZmZ5KQorCQlsb29wc190aGlzX2ppZmZ5ID0gMDsKKwlsYXN0X2lycV9qaWZmeSA9IGppZmZpZXM7CisKKwl3aGlsZSAoZXZlbnRzICYmIGNvdW50LS0pIHsKKwkJaWYgKCsrbG9vcHNfdGhpc19qaWZmeSA+IE1BWF9JUlFMT09QU19QRVJfSklGRlkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJUlEgaGFuZGxlciBpcyBsb29waW5nIHRvbyAiCisJCQkgICAgICAgIm11Y2ghIFJlc2V0dGluZy5cbiIsIGRldi0+bmFtZSk7CisJCQkvKiBEaXNhYmxlIGludGVycnVwdHMgZm9yIG5vdyAqLworCQkJaGVybWVzX3NldF9pcnFtYXNrKGh3LCAwKTsKKwkJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJlc2V0X3dvcmspOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBDaGVjayB0aGUgY2FyZCBoYXNuJ3QgYmVlbiByZW1vdmVkICovCisJCWlmICghIGhlcm1lc19wcmVzZW50KGh3KSkgeworCQkJREVCVUcoMCwgIm9yaW5vY29faW50ZXJydXB0KCk6IGNhcmQgcmVtb3ZlZFxuIik7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChldmVudHMgJiBIRVJNRVNfRVZfVElDSykKKwkJCV9fb3Jpbm9jb19ldl90aWNrKGRldiwgaHcpOworCQlpZiAoZXZlbnRzICYgSEVSTUVTX0VWX1dURVJSKQorCQkJX19vcmlub2NvX2V2X3d0ZXJyKGRldiwgaHcpOworCQlpZiAoZXZlbnRzICYgSEVSTUVTX0VWX0lORkRST1ApCisJCQlfX29yaW5vY29fZXZfaW5mZHJvcChkZXYsIGh3KTsKKwkJaWYgKGV2ZW50cyAmIEhFUk1FU19FVl9JTkZPKQorCQkJX19vcmlub2NvX2V2X2luZm8oZGV2LCBodyk7CisJCWlmIChldmVudHMgJiBIRVJNRVNfRVZfUlgpCisJCQlfX29yaW5vY29fZXZfcngoZGV2LCBodyk7CisJCWlmIChldmVudHMgJiBIRVJNRVNfRVZfVFhFWEMpCisJCQlfX29yaW5vY29fZXZfdHhleGMoZGV2LCBodyk7CisJCWlmIChldmVudHMgJiBIRVJNRVNfRVZfVFgpCisJCQlfX29yaW5vY29fZXZfdHgoZGV2LCBodyk7CisJCWlmIChldmVudHMgJiBIRVJNRVNfRVZfQUxMT0MpCisJCQlfX29yaW5vY29fZXZfYWxsb2MoZGV2LCBodyk7CisJCQorCQloZXJtZXNfd3JpdGVfcmVnbihodywgRVZBQ0ssIGV2ZW50cyk7CisKKwkJZXZzdGF0ID0gaGVybWVzX3JlYWRfcmVnbihodywgRVZTVEFUKTsKKwkJZXZlbnRzID0gZXZzdGF0ICYgaHctPmludGVuOworCX07CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW5pdGlhbGl6YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgY29tcF9pZCB7CisJdTE2IGlkLCB2YXJpYW50LCBtYWpvciwgbWlub3I7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RhdGljIGlubGluZSBmd3R5cGVfdCBkZXRlcm1pbmVfZmlybXdhcmVfdHlwZShzdHJ1Y3QgY29tcF9pZCAqbmljX2lkKQoreworCWlmIChuaWNfaWQtPmlkIDwgMHg4MDAwKQorCQlyZXR1cm4gRklSTVdBUkVfVFlQRV9BR0VSRTsKKwllbHNlIGlmIChuaWNfaWQtPmlkID09IDB4ODAwMCAmJiBuaWNfaWQtPm1ham9yID09IDApCisJCXJldHVybiBGSVJNV0FSRV9UWVBFX1NZTUJPTDsKKwllbHNlCisJCXJldHVybiBGSVJNV0FSRV9UWVBFX0lOVEVSU0lMOworfQorCisvKiBTZXQgcHJpdi0+ZmlybXdhcmUgdHlwZSwgZGV0ZXJtaW5lIGZpcm13YXJlIHByb3BlcnRpZXMgKi8KK3N0YXRpYyBpbnQgZGV0ZXJtaW5lX2Zpcm13YXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnI7CisJc3RydWN0IGNvbXBfaWQgbmljX2lkLCBzdGFfaWQ7CisJdW5zaWduZWQgaW50IGZpcm12ZXI7CisJY2hhciB0bXBbU1lNQk9MX01BWF9WRVJfTEVOKzFdOworCisJLyogR2V0IHRoZSBoYXJkd2FyZSB2ZXJzaW9uICovCisJZXJyID0gSEVSTUVTX1JFQURfUkVDT1JEKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9OSUNJRCwgJm5pY19pZCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3QgcmVhZCBoYXJkd2FyZSBpZGVudGl0eTogZXJyb3IgJWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJbGUxNl90b19jcHVzKCZuaWNfaWQuaWQpOworCWxlMTZfdG9fY3B1cygmbmljX2lkLnZhcmlhbnQpOworCWxlMTZfdG9fY3B1cygmbmljX2lkLm1ham9yKTsKKwlsZTE2X3RvX2NwdXMoJm5pY19pZC5taW5vcik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBIYXJkd2FyZSBpZGVudGl0eSAlMDR4OiUwNHg6JTA0eDolMDR4XG4iLAorCSAgICAgICBkZXYtPm5hbWUsIG5pY19pZC5pZCwgbmljX2lkLnZhcmlhbnQsCisJICAgICAgIG5pY19pZC5tYWpvciwgbmljX2lkLm1pbm9yKTsKKworCXByaXYtPmZpcm13YXJlX3R5cGUgPSBkZXRlcm1pbmVfZmlybXdhcmVfdHlwZSgmbmljX2lkKTsKKworCS8qIEdldCB0aGUgZmlybXdhcmUgdmVyc2lvbiAqLworCWVyciA9IEhFUk1FU19SRUFEX1JFQ09SRChodywgVVNFUl9CQVAsIEhFUk1FU19SSURfU1RBSUQsICZzdGFfaWQpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IHJlYWQgc3RhdGlvbiBpZGVudGl0eTogZXJyb3IgJWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJbGUxNl90b19jcHVzKCZzdGFfaWQuaWQpOworCWxlMTZfdG9fY3B1cygmc3RhX2lkLnZhcmlhbnQpOworCWxlMTZfdG9fY3B1cygmc3RhX2lkLm1ham9yKTsKKwlsZTE2X3RvX2NwdXMoJnN0YV9pZC5taW5vcik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTdGF0aW9uIGlkZW50aXR5ICAlMDR4OiUwNHg6JTA0eDolMDR4XG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHN0YV9pZC5pZCwgc3RhX2lkLnZhcmlhbnQsCisJICAgICAgIHN0YV9pZC5tYWpvciwgc3RhX2lkLm1pbm9yKTsKKworCXN3aXRjaCAoc3RhX2lkLmlkKSB7CisJY2FzZSAweDE1OgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQcmltYXJ5IGZpcm13YXJlIGlzIGFjdGl2ZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCWNhc2UgMHgxNGI6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRlcnRpYXJ5IGZpcm13YXJlIGlzIGFjdGl2ZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCWNhc2UgMHgxZjoJLyogSW50ZXJzaWwsIEFnZXJlLCBTeW1ib2wgU3BlY3RydW0yNCAqLworCWNhc2UgMHgyMToJLyogU3ltYm9sIFNwZWN0cnVtMjQgVHJpbG9neSAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBVbmtub3duIHN0YXRpb24gSUQsIHBsZWFzZSByZXBvcnRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlicmVhazsKKwl9CisKKwkvKiBEZWZhdWx0IGNhcGFiaWxpdGllcyAqLworCXByaXYtPmhhc19zZW5zaXRpdml0eSA9IDE7CisJcHJpdi0+aGFzX213byA9IDA7CisJcHJpdi0+aGFzX3ByZWFtYmxlID0gMDsKKwlwcml2LT5oYXNfcG9ydDMgPSAxOworCXByaXYtPmhhc19pYnNzID0gMTsKKwlwcml2LT5oYXNfd2VwID0gMDsKKwlwcml2LT5oYXNfYmlnX3dlcCA9IDA7CisKKwkvKiBEZXRlcm1pbmUgY2FwYWJpbGl0aWVzIGZyb20gdGhlIGZpcm13YXJlIHZlcnNpb24gKi8KKwlzd2l0Y2ggKHByaXYtPmZpcm13YXJlX3R5cGUpIHsKKwljYXNlIEZJUk1XQVJFX1RZUEVfQUdFUkU6CisJCS8qIEx1Y2VudCBXYXZlbGFuIElFRUUsIEx1Y2VudCBPcmlub2NvLCBDYWJsZXRyb24gUm9hbUFib3V0LAorCQkgICBFTFNBLCBNZWxjbywgSFAsIElCTSwgRGVsbCAxMTUwLCBDb21wYXEgMTEwLzIxMCAqLworCQlzbnByaW50Zihwcml2LT5md19uYW1lLCBzaXplb2YocHJpdi0+ZndfbmFtZSkgLSAxLAorCQkJICJMdWNlbnQvQWdlcmUgJWQuJTAyZCIsIHN0YV9pZC5tYWpvciwgc3RhX2lkLm1pbm9yKTsKKworCQlmaXJtdmVyID0gKCh1bnNpZ25lZCBsb25nKXN0YV9pZC5tYWpvciA8PCAxNikgfCBzdGFfaWQubWlub3I7CisKKwkJcHJpdi0+aGFzX2lic3MgPSAoZmlybXZlciA+PSAweDYwMDA2KTsKKwkJcHJpdi0+aGFzX3dlcCA9IChmaXJtdmVyID49IDB4NDAwMjApOworCQlwcml2LT5oYXNfYmlnX3dlcCA9IDE7IC8qIEZJWE1FOiB0aGlzIGlzIHdyb25nIC0gaG93IGRvIHdlIHRlbGwKKwkJCQkJICBHb2xkIGNhcmRzIGZyb20gdGhlIG90aGVycz8gKi8KKwkJcHJpdi0+aGFzX213byA9IChmaXJtdmVyID49IDB4NjAwMDApOworCQlwcml2LT5oYXNfcG0gPSAoZmlybXZlciA+PSAweDQwMDIwKTsgLyogRG9uJ3Qgd29yayBpbiA3LjUyID8gKi8KKwkJcHJpdi0+aWJzc19wb3J0ID0gMTsKKworCQkvKiBUZXN0ZWQgd2l0aCBBZ2VyZSBmaXJtd2FyZSA6CisJCSAqCTEuMTYgOyA0LjA4IDsgNC41MiA7IDYuMDQgOyA2LjE2IDsgNy4yOCA9PiBKZWFuIElJCisJCSAqIFRlc3RlZCBDYWJsZVRyb24gZmlybXdhcmUgOiA0LjMyID0+IEFudG9uICovCisJCWJyZWFrOworCWNhc2UgRklSTVdBUkVfVFlQRV9TWU1CT0w6CisJCS8qIFN5bWJvbCAsIDNDb20gQWlyQ29ubmVjdCwgSW50ZWwsIEVyaWNzc29uIFdMQU4gKi8KKwkJLyogSW50ZWwgTUFDIDogMDA6MDI6QjM6KiAqLworCQkvKiAzQ29tIE1BQyA6IDAwOjUwOkRBOiogKi8KKwkJbWVtc2V0KHRtcCwgMCwgc2l6ZW9mKHRtcCkpOworCQkvKiBHZXQgdGhlIFN5bWJvbCBmaXJtd2FyZSB2ZXJzaW9uICovCisJCWVyciA9IGhlcm1lc19yZWFkX2x0dihodywgVVNFUl9CQVAsCisJCQkJICAgICAgSEVSTUVTX1JJRF9TRUNPTkRBUllWRVJTSU9OX1NZTUJPTCwKKwkJCQkgICAgICBTWU1CT0xfTUFYX1ZFUl9MRU4sIE5VTEwsICZ0bXApOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzOiBFcnJvciAlZCByZWFkaW5nIFN5bWJvbCBmaXJtd2FyZSBpbmZvLiBXaWxkbHkgZ3Vlc3NpbmcgY2FwYWJpbGl0aWVzLi4uXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJCWZpcm12ZXIgPSAwOworCQkJdG1wWzBdID0gJ1wwJzsKKwkJfSBlbHNlIHsKKwkJCS8qIFRoZSBmaXJtd2FyZSByZXZpc2lvbiBpcyBhIHN0cmluZywgdGhlIGZvcm1hdCBpcworCQkJICogc29tZXRoaW5nIGxpa2UgOiAiVjIuMjAtMDEiLgorCQkJICogUXVpY2sgYW5kIGRpcnR5IHBhcnNpbmcuLi4gLSBKZWFuIElJCisJCQkgKi8KKwkJCWZpcm12ZXIgPSAoKHRtcFsxXSAtICcwJykgPDwgMTYpIHwgKCh0bXBbM10gLSAnMCcpIDw8IDEyKQorCQkJCXwgKCh0bXBbNF0gLSAnMCcpIDw8IDgpIHwgKCh0bXBbNl0gLSAnMCcpIDw8IDQpCisJCQkJfCAodG1wWzddIC0gJzAnKTsKKworCQkJdG1wW1NZTUJPTF9NQVhfVkVSX0xFTl0gPSAnXDAnOworCQl9CisKKwkJc25wcmludGYocHJpdi0+ZndfbmFtZSwgc2l6ZW9mKHByaXYtPmZ3X25hbWUpIC0gMSwKKwkJCSAiU3ltYm9sICVzIiwgdG1wKTsKKworCQlwcml2LT5oYXNfaWJzcyA9IChmaXJtdmVyID49IDB4MjAwMDApOworCQlwcml2LT5oYXNfd2VwID0gKGZpcm12ZXIgPj0gMHgxNTAxMik7CisJCXByaXYtPmhhc19iaWdfd2VwID0gKGZpcm12ZXIgPj0gMHgyMDAwMCk7CisJCXByaXYtPmhhc19wbSA9IChmaXJtdmVyID49IDB4MjAwMDAgJiYgZmlybXZlciA8IDB4MjIwMDApIHx8IAorCQkJICAgICAgIChmaXJtdmVyID49IDB4MjkwMDAgJiYgZmlybXZlciA8IDB4MzAwMDApIHx8CisJCQkgICAgICAgZmlybXZlciA+PSAweDMxMDAwOworCQlwcml2LT5oYXNfcHJlYW1ibGUgPSAoZmlybXZlciA+PSAweDIwMDAwKTsKKwkJcHJpdi0+aWJzc19wb3J0ID0gNDsKKwkJLyogVGVzdGVkIHdpdGggSW50ZWwgZmlybXdhcmUgOiAweDIwMDE1ID0+IEplYW4gSUkgKi8KKwkJLyogVGVzdGVkIHdpdGggM0NvbSBmaXJtd2FyZSA6IDB4MTUwMTIgJiAweDIyMDAxID0+IEplYW4gSUkgKi8KKwkJYnJlYWs7CisJY2FzZSBGSVJNV0FSRV9UWVBFX0lOVEVSU0lMOgorCQkvKiBELUxpbmssIExpbmtzeXMsIEFkdHJvbiwgWm9vbUFpciwgYW5kIG1hbnkgb3RoZXJzLi4uCisJCSAqIFNhbXN1bmcsIENvbXBhcSAxMDAvMjAwIGFuZCBQcm94aW0gYXJlIHNsaWdodGx5CisJCSAqIGRpZmZlcmVudCBhbmQgbGVzcyB3ZWxsIHRlc3RlZCAqLworCQkvKiBELUxpbmsgTUFDIDogMDA6NDA6MDU6KiAqLworCQkvKiBBZGR0cm9uIE1BQyA6IDAwOjkwOkQxOiogKi8KKwkJc25wcmludGYocHJpdi0+ZndfbmFtZSwgc2l6ZW9mKHByaXYtPmZ3X25hbWUpIC0gMSwKKwkJCSAiSW50ZXJzaWwgJWQuJWQuJWQiLCBzdGFfaWQubWFqb3IsIHN0YV9pZC5taW5vciwKKwkJCSBzdGFfaWQudmFyaWFudCk7CisKKwkJZmlybXZlciA9ICgodW5zaWduZWQgbG9uZylzdGFfaWQubWFqb3IgPDwgMTYpIHwKKwkJCSgodW5zaWduZWQgbG9uZylzdGFfaWQubWlub3IgPDwgOCkgfCBzdGFfaWQudmFyaWFudDsKKworCQlwcml2LT5oYXNfaWJzcyA9IChmaXJtdmVyID49IDB4MDAwNzAwKTsgLyogRklYTUUgKi8KKwkJcHJpdi0+aGFzX2JpZ193ZXAgPSBwcml2LT5oYXNfd2VwID0gKGZpcm12ZXIgPj0gMHgwMDA4MDApOworCQlwcml2LT5oYXNfcG0gPSAoZmlybXZlciA+PSAweDAwMDcwMCk7CisKKwkJaWYgKGZpcm12ZXIgPj0gMHgwMDA4MDApCisJCQlwcml2LT5pYnNzX3BvcnQgPSAwOworCQllbHNlIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IEludGVyc2lsIGZpcm13YXJlIGVhcmxpZXIgIgorCQkJICAgICAgICJ0aGFuIHYwLjgueCAtIHNldmVyYWwgZmVhdHVyZXMgbm90IHN1cHBvcnRlZFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJcHJpdi0+aWJzc19wb3J0ID0gMTsKKwkJfQorCQlicmVhazsKKwl9CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBGaXJtd2FyZSBkZXRlcm1pbmVkIGFzICVzXG4iLCBkZXYtPm5hbWUsCisJICAgICAgIHByaXYtPmZ3X25hbWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnIgPSAwOworCXN0cnVjdCBoZXJtZXNfaWRzdHJpbmcgbmlja2J1ZjsKKwl1MTYgcmVjbGVuOworCWludCBsZW47CisKKwlUUkFDRV9FTlRFUihkZXYtPm5hbWUpOworCisJLyogTm8gbmVlZCB0byBsb2NrLCB0aGUgaHdfdW5hdmFpbGFibGUgZmxhZyBpcyBhbHJlYWR5IHNldCBpbgorCSAqIGFsbG9jX29yaW5vY29kZXYoKSAqLworCXByaXYtPm5pY2J1Zl9zaXplID0gSUVFRTgwMl8xMV9GUkFNRV9MRU4gKyBFVEhfSExFTjsKKworCS8qIEluaXRpYWxpemUgdGhlIGZpcm13YXJlICovCisJZXJyID0gaGVybWVzX2luaXQoaHcpOworCWlmIChlcnIgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBmaXJtd2FyZSAoZXJyID0gJWQpXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBkZXRlcm1pbmVfZmlybXdhcmUoZGV2KTsKKwlpZiAoZXJyICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW5jb21wYXRpYmxlIGZpcm13YXJlLCBhYm9ydGluZ1xuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChwcml2LT5oYXNfcG9ydDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogQWQtaG9jIGRlbW8gbW9kZSBzdXBwb3J0ZWRcbiIsIGRldi0+bmFtZSk7CisJaWYgKHByaXYtPmhhc19pYnNzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IElFRUUgc3RhbmRhcmQgSUJTUyBhZC1ob2MgbW9kZSBzdXBwb3J0ZWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCWlmIChwcml2LT5oYXNfd2VwKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogV0VQIHN1cHBvcnRlZCwgIiwgZGV2LT5uYW1lKTsKKwkJaWYgKHByaXYtPmhhc19iaWdfd2VwKQorCQkJcHJpbnRrKCIxMDQtYml0IGtleVxuIik7CisJCWVsc2UKKwkJCXByaW50aygiNDAtYml0IGtleVxuIik7CisJfQorCisJLyogR2V0IHRoZSBNQUMgYWRkcmVzcyAqLworCWVyciA9IGhlcm1lc19yZWFkX2x0dihodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GT1dOTUFDQUREUiwKKwkJCSAgICAgIEVUSF9BTEVOLCBOVUxMLCBkZXYtPmRldl9hZGRyKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBmYWlsZWQgdG8gcmVhZCBNQUMgYWRkcmVzcyFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1BQyBhZGRyZXNzICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sCisJICAgICAgIGRldi0+ZGV2X2FkZHJbMl0sIGRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sCisJICAgICAgIGRldi0+ZGV2X2FkZHJbNV0pOworCisJLyogR2V0IHRoZSBzdGF0aW9uIG5hbWUgKi8KKwllcnIgPSBoZXJtZXNfcmVhZF9sdHYoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORk9XTk5BTUUsCisJCQkgICAgICBzaXplb2Yobmlja2J1ZiksICZyZWNsZW4sICZuaWNrYnVmKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZWFkIHN0YXRpb24gbmFtZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAobmlja2J1Zi5sZW4pCisJCWxlbiA9IG1pbihJV19FU1NJRF9NQVhfU0laRSwgKGludClsZTE2X3RvX2NwdShuaWNrYnVmLmxlbikpOworCWVsc2UKKwkJbGVuID0gbWluKElXX0VTU0lEX01BWF9TSVpFLCAyICogcmVjbGVuKTsKKwltZW1jcHkocHJpdi0+bmljaywgJm5pY2tidWYudmFsLCBsZW4pOworCXByaXYtPm5pY2tbbGVuXSA9ICdcMCc7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFN0YXRpb24gbmFtZSBcIiVzXCJcbiIsIGRldi0+bmFtZSwgcHJpdi0+bmljayk7CisKKwkvKiBHZXQgYWxsb3dlZCBjaGFubmVscyAqLworCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NIQU5ORUxMSVNULAorCQkJCSAgJnByaXYtPmNoYW5uZWxfbWFzayk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gcmVhZCBjaGFubmVsIGxpc3QhXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogR2V0IGluaXRpYWwgQVAgZGVuc2l0eSAqLworCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORlNZU1RFTVNDQUxFLAorCQkJCSAgJnByaXYtPmFwX2RlbnNpdHkpOworCWlmIChlcnIgfHwgcHJpdi0+YXBfZGVuc2l0eSA8IDEgfHwgcHJpdi0+YXBfZGVuc2l0eSA+IDMpIHsKKwkJcHJpdi0+aGFzX3NlbnNpdGl2aXR5ID0gMDsKKwl9CisKKwkvKiBHZXQgaW5pdGlhbCBSVFMgdGhyZXNob2xkICovCisJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GUlRTVEhSRVNIT0xELAorCQkJCSAgJnByaXYtPnJ0c190aHJlc2gpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlYWQgUlRTIHRocmVzaG9sZCFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBHZXQgaW5pdGlhbCBmcmFnbWVudGF0aW9uIHNldHRpbmdzICovCisJaWYgKHByaXYtPmhhc19td28pCisJCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgIEhFUk1FU19SSURfQ05GTVdPUk9CVVNUX0FHRVJFLAorCQkJCQkgICZwcml2LT5td29fcm9idXN0KTsKKwllbHNlCisJCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORkZSQUdNRU5UQVRJT05USFJFU0hPTEQsCisJCQkJCSAgJnByaXYtPmZyYWdfdGhyZXNoKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZWFkIGZyYWdtZW50YXRpb24gc2V0dGluZ3MhXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogUG93ZXIgbWFuYWdlbWVudCBzZXR1cCAqLworCWlmIChwcml2LT5oYXNfcG0pIHsKKwkJcHJpdi0+cG1fb24gPSAwOworCQlwcml2LT5wbV9tY2FzdCA9IDE7CisJCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgIEhFUk1FU19SSURfQ05GTUFYU0xFRVBEVVJBVElPTiwKKwkJCQkJICAmcHJpdi0+cG1fcGVyaW9kKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlYWQgcG93ZXIgbWFuYWdlbWVudCBwZXJpb2QhXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICBIRVJNRVNfUklEX0NORlBNSE9MRE9WRVJEVVJBVElPTiwKKwkJCQkJICAmcHJpdi0+cG1fdGltZW91dCk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZWFkIHBvd2VyIG1hbmFnZW1lbnQgdGltZW91dCFcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyogUHJlYW1ibGUgc2V0dXAgKi8KKwlpZiAocHJpdi0+aGFzX3ByZWFtYmxlKSB7CisJCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgIEhFUk1FU19SSURfQ05GUFJFQU1CTEVfU1lNQk9MLAorCQkJCQkgICZwcml2LT5wcmVhbWJsZSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwl9CisJCQorCS8qIFNldCB1cCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uICovCisJcHJpdi0+aXdfbW9kZSA9IElXX01PREVfSU5GUkE7CisJLyogQnkgZGVmYXVsdCB1c2UgSUVFRS9JQlNTIGFkLWhvYyBtb2RlIGlmIHdlIGhhdmUgaXQgKi8KKwlwcml2LT5wcmVmZXJfcG9ydDMgPSBwcml2LT5oYXNfcG9ydDMgJiYgKCEgcHJpdi0+aGFzX2lic3MpOworCXNldF9wb3J0X3R5cGUocHJpdik7CisJcHJpdi0+Y2hhbm5lbCA9IDEwOyAvKiBkZWZhdWx0IGNoYW5uZWwsIG1vcmUtb3ItbGVzcyBhcmJpdHJhcnkgKi8KKworCXByaXYtPnByb21pc2N1b3VzID0gMDsKKwlwcml2LT53ZXBfb24gPSAwOworCXByaXYtPnR4X2tleSA9IDA7CisKKwllcnIgPSBoZXJtZXNfYWxsb2NhdGUoaHcsIHByaXYtPm5pY2J1Zl9zaXplLCAmcHJpdi0+dHhmaWQpOworCWlmIChlcnIgPT0gLUVJTykgeworCQkvKiBUcnkgd29ya2Fyb3VuZCBmb3Igb2xkIFN5bWJvbCBmaXJtd2FyZSBidWcgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZpcm13YXJlIEFMTE9DIGJ1ZyBkZXRlY3RlZCAiCisJCSAgICAgICAiKG9sZCBTeW1ib2wgZmlybXdhcmU/KS4gVHJ5aW5nIHRvIHdvcmsgYXJvdW5kLi4uICIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQkKKwkJcHJpdi0+bmljYnVmX3NpemUgPSBUWF9OSUNCVUZfU0laRV9CVUc7CisJCWVyciA9IGhlcm1lc19hbGxvY2F0ZShodywgcHJpdi0+bmljYnVmX3NpemUsICZwcml2LT50eGZpZCk7CisJCWlmIChlcnIpCisJCQlwcmludGsoImZhaWxlZCFcbiIpOworCQllbHNlCisJCQlwcmludGsoIm9rLlxuIik7CisJfQorCWlmIChlcnIpIHsKKwkJcHJpbnRrKCIlczogRXJyb3IgJWQgYWxsb2NhdGluZyBUeCBidWZmZXJcbiIsIGRldi0+bmFtZSwgZXJyKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogTWFrZSB0aGUgaGFyZHdhcmUgYXZhaWxhYmxlLCBhcyBsb25nIGFzIGl0IGhhc24ndCBiZWVuCisJICogcmVtb3ZlZCBlbHNld2hlcmUgKGUuZy4gYnkgUENNQ0lBIGhvdCB1bnBsdWcpICovCisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7CisJcHJpdi0+aHdfdW5hdmFpbGFibGUtLTsKKwlzcGluX3VubG9ja19pcnEoJnByaXYtPmxvY2spOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZWFkeVxuIiwgZGV2LT5uYW1lKTsKKworIG91dDoKKwlUUkFDRV9FWElUKGRldi0+bmFtZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX29yaW5vY29kZXYoaW50IHNpemVvZl9jYXJkLAorCQkJCSAgICBpbnQgKCpoYXJkX3Jlc2V0KShzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICopKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdjsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlKSArIHNpemVvZl9jYXJkKTsKKwlpZiAoISBkZXYpCisJCXJldHVybiBOVUxMOworCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXByaXYtPm5kZXYgPSBkZXY7CisJaWYgKHNpemVvZl9jYXJkKQorCQlwcml2LT5jYXJkID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpbmV0ZGV2X3ByaXYoZGV2KQorCQkJCSAgICAgICsgc2l6ZW9mKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUpKTsKKwllbHNlCisJCXByaXYtPmNhcmQgPSBOVUxMOworCisJLyogU2V0dXAgLyBvdmVycmlkZSBuZXRfZGV2aWNlIGZpZWxkcyAqLworCWRldi0+aW5pdCA9IG9yaW5vY29faW5pdDsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IG9yaW5vY29feG1pdDsKKwlkZXYtPnR4X3RpbWVvdXQgPSBvcmlub2NvX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IEhaOyAvKiAxIHNlY29uZCB0aW1lb3V0ICovCisJZGV2LT5nZXRfc3RhdHMgPSBvcmlub2NvX2dldF9zdGF0czsKKwlkZXYtPmdldF93aXJlbGVzc19zdGF0cyA9IG9yaW5vY29fZ2V0X3dpcmVsZXNzX3N0YXRzOworCWRldi0+ZG9faW9jdGwgPSBvcmlub2NvX2lvY3RsOworCWRldi0+Y2hhbmdlX210dSA9IG9yaW5vY29fY2hhbmdlX210dTsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IG9yaW5vY29fc2V0X211bHRpY2FzdF9saXN0OworCS8qIHdlIHVzZSB0aGUgZGVmYXVsdCBldGhfbWFjX2FkZHIgZm9yIHNldHRpbmcgdGhlIE1BQyBhZGRyICovCisKKwkvKiBTZXQgdXAgZGVmYXVsdCBjYWxsYmFja3MgKi8KKwlkZXYtPm9wZW4gPSBvcmlub2NvX29wZW47CisJZGV2LT5zdG9wID0gb3Jpbm9jb19zdG9wOworCXByaXYtPmhhcmRfcmVzZXQgPSBoYXJkX3Jlc2V0OworCisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOworCXByaXYtPm9wZW4gPSAwOworCXByaXYtPmh3X3VuYXZhaWxhYmxlID0gMTsgLyogb3Jpbm9jb19pbml0KCkgbXVzdCBjbGVhciB0aGlzCisJCQkJICAgKiBiZWZvcmUgYW55dGhpbmcgZWxzZSB0b3VjaGVzIHRoZQorCQkJCSAgICogaGFyZHdhcmUgKi8KKwlJTklUX1dPUksoJnByaXYtPnJlc2V0X3dvcmssICh2b2lkICgqKSh2b2lkICopKW9yaW5vY29fcmVzZXQsIGRldik7CisKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCXByaXYtPmxhc3RfbGlua3N0YXR1cyA9IDB4ZmZmZjsKKworCXJldHVybiBkZXY7CisKK30KKwordm9pZCBmcmVlX29yaW5vY29kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlmcmVlX25ldGRldihkZXYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBXaXJlbGVzcyBleHRlbnNpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgb3Jpbm9jb19od19nZXRfYnNzaWQoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiwKKwkJCQljaGFyIGJ1ZltFVEhfQUxFTl0pCit7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWVyciA9IGhlcm1lc19yZWFkX2x0dihodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ1VSUkVOVEJTU0lELAorCQkJICAgICAgRVRIX0FMRU4sIE5VTEwsIGJ1Zik7CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvcmlub2NvX2h3X2dldF9lc3NpZChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2LCBpbnQgKmFjdGl2ZSwKKwkJCQljaGFyIGJ1ZltJV19FU1NJRF9NQVhfU0laRSsxXSkKK3sKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGhlcm1lc19pZHN0cmluZyBlc3NpZGJ1ZjsKKwljaGFyICpwID0gKGNoYXIgKikoJmVzc2lkYnVmLnZhbCk7CisJaW50IGxlbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoc3RybGVuKHByaXYtPmRlc2lyZWRfZXNzaWQpID4gMCkgeworCQkvKiBXZSByZWFkIHRoZSBkZXNpcmVkIFNTSUQgZnJvbSB0aGUgaGFyZHdhcmUgcmF0aGVyCisJCSAgIHRoYW4gZnJvbSBwcml2LT5kZXNpcmVkX2Vzc2lkLCBqdXN0IGluIGNhc2UgdGhlCisJCSAgIGZpcm13YXJlIGlzIGFsbG93ZWQgdG8gY2hhbmdlIGl0IG9uIHVzLiBJJ20gbm90CisJCSAgIHN1cmUgYWJvdXQgdGhpcyAqLworCQkvKiBNeSBndWVzcyBpcyB0aGF0IHRoZSBPV05TU0lEIHNob3VsZCBhbHdheXMgYmUgd2hhdGV2ZXIKKwkJICogd2Ugc2V0IHRvIHRoZSBjYXJkLCB3aGVyZWFzIENVUlJFTlRfU1NJRCBpcyB0aGUgb25lIHRoYXQKKwkJICogbWF5IGNoYW5nZS4uLiAtIEplYW4gSUkgKi8KKwkJdTE2IHJpZDsKKworCQkqYWN0aXZlID0gMTsKKworCQlyaWQgPSAocHJpdi0+cG9ydF90eXBlID09IDMpID8gSEVSTUVTX1JJRF9DTkZPV05TU0lEIDoKKwkJCUhFUk1FU19SSURfQ05GREVTSVJFRFNTSUQ7CisJCQorCQllcnIgPSBoZXJtZXNfcmVhZF9sdHYoaHcsIFVTRVJfQkFQLCByaWQsIHNpemVvZihlc3NpZGJ1ZiksCisJCQkJICAgICAgTlVMTCwgJmVzc2lkYnVmKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZmFpbF91bmxvY2s7CisJfSBlbHNlIHsKKwkJKmFjdGl2ZSA9IDA7CisKKwkJZXJyID0gaGVybWVzX3JlYWRfbHR2KGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DVVJSRU5UU1NJRCwKKwkJCQkgICAgICBzaXplb2YoZXNzaWRidWYpLCBOVUxMLCAmZXNzaWRidWYpOworCQlpZiAoZXJyKQorCQkJZ290byBmYWlsX3VubG9jazsKKwl9CisKKwlsZW4gPSBsZTE2X3RvX2NwdShlc3NpZGJ1Zi5sZW4pOworCisJbWVtc2V0KGJ1ZiwgMCwgSVdfRVNTSURfTUFYX1NJWkUrMSk7CisJbWVtY3B5KGJ1ZiwgcCwgbGVuKTsKKwlidWZbbGVuXSA9ICdcMCc7CisKKyBmYWlsX3VubG9jazoKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIGVycjsgICAgICAgCit9CisKK3N0YXRpYyBsb25nIG9yaW5vY29faHdfZ2V0X2ZyZXEoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdikKK3sKKwkKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVyciA9IDA7CisJdTE2IGNoYW5uZWw7CisJbG9uZyBmcmVxID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisJCisJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ1VSUkVOVENIQU5ORUwsICZjaGFubmVsKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCS8qIEludGVyc2lsIGZpcm13YXJlIDEuMy41IHJldHVybnMgMCB3aGVuIHRoZSBpbnRlcmZhY2UgaXMgZG93biAqLworCWlmIChjaGFubmVsID09IDApIHsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIChjaGFubmVsIDwgMSkgfHwgKGNoYW5uZWwgPiBOVU1fQ0hBTk5FTFMpICkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2hhbm5lbCBvdXQgb2YgcmFuZ2UgKCVkKSFcbiIsCisJCSAgICAgICBwcml2LT5uZGV2LT5uYW1lLCBjaGFubmVsKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKworCX0KKwlmcmVxID0gY2hhbm5lbF9mcmVxdWVuY3lbY2hhbm5lbC0xXSAqIDEwMDAwMDsKKworIG91dDoKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJaWYgKGVyciA+IDApCisJCWVyciA9IC1FQlVTWTsKKwlyZXR1cm4gZXJyID8gZXJyIDogZnJlcTsKK30KKworc3RhdGljIGludCBvcmlub2NvX2h3X2dldF9iaXRyYXRlbGlzdChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2LAorCQkJCSAgICAgIGludCAqbnVtcmF0ZXMsIHMzMiAqcmF0ZXMsIGludCBtYXgpCit7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXN0cnVjdCBoZXJtZXNfaWRzdHJpbmcgbGlzdDsKKwl1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKikmbGlzdC52YWw7CisJaW50IGVyciA9IDA7CisJaW50IG51bTsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwllcnIgPSBoZXJtZXNfcmVhZF9sdHYoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX1NVUFBPUlRFRERBVEFSQVRFUywKKwkJCSAgICAgIHNpemVvZihsaXN0KSwgTlVMTCwgJmxpc3QpOworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCQorCW51bSA9IGxlMTZfdG9fY3B1KGxpc3QubGVuKTsKKwkqbnVtcmF0ZXMgPSBudW07CisJbnVtID0gbWluKG51bSwgbWF4KTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlyYXRlc1tpXSA9IChwW2ldICYgMHg3ZikgKiA1MDAwMDA7IC8qIGNvbnZlcnQgdG8gYnBzICovCisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRpd3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqcnJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnIgPSAwOworCWludCBtb2RlOworCXN0cnVjdCBpd19yYW5nZSByYW5nZTsKKwlpbnQgbnVtcmF0ZXM7CisJaW50IGksIGs7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCVRSQUNFX0VOVEVSKGRldi0+bmFtZSk7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJycS0+cG9pbnRlciwgc2l6ZW9mKHJhbmdlKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcnJxLT5sZW5ndGggPSBzaXplb2YocmFuZ2UpOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwltb2RlID0gcHJpdi0+aXdfbW9kZTsKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJbWVtc2V0KCZyYW5nZSwgMCwgc2l6ZW9mKHJhbmdlKSk7CisKKwkvKiBNdWNoIG9mIHRoaXMgc2hhbWVsZXNzbHkgdGFrZW4gZnJvbSB3dmxhbl9jcy5jLiBObyBpZGVhCisJICogd2hhdCBpdCBhbGwgbWVhbnMgLWRnaWJzb24gKi8KKwlyYW5nZS53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCXJhbmdlLndlX3ZlcnNpb25fc291cmNlID0gMTE7CisKKwlyYW5nZS5taW5fbndpZCA9IHJhbmdlLm1heF9ud2lkID0gMDsgLyogV2UgZG9uJ3QgdXNlIG53aWRzICovCisKKwkvKiBTZXQgYXZhaWxhYmxlIGNoYW5uZWxzL2ZyZXF1ZW5jaWVzICovCisJcmFuZ2UubnVtX2NoYW5uZWxzID0gTlVNX0NIQU5ORUxTOworCWsgPSAwOworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ0hBTk5FTFM7IGkrKykgeworCQlpZiAocHJpdi0+Y2hhbm5lbF9tYXNrICYgKDEgPDwgaSkpIHsKKwkJCXJhbmdlLmZyZXFba10uaSA9IGkgKyAxOworCQkJcmFuZ2UuZnJlcVtrXS5tID0gY2hhbm5lbF9mcmVxdWVuY3lbaV0gKiAxMDAwMDA7CisJCQlyYW5nZS5mcmVxW2tdLmUgPSAxOworCQkJaysrOworCQl9CisJCQorCQlpZiAoayA+PSBJV19NQVhfRlJFUVVFTkNJRVMpCisJCQlicmVhazsKKwl9CisJcmFuZ2UubnVtX2ZyZXF1ZW5jeSA9IGs7CisKKwlyYW5nZS5zZW5zaXRpdml0eSA9IDM7CisKKwlpZiAoKG1vZGUgPT0gSVdfTU9ERV9BREhPQykgJiYgKHByaXYtPnNweV9udW1iZXIgPT0gMCkpeworCQkvKiBRdWFsaXR5IHN0YXRzIG1lYW5pbmdsZXNzIGluIGFkLWhvYyBtb2RlICovCisJCXJhbmdlLm1heF9xdWFsLnF1YWwgPSAwOworCQlyYW5nZS5tYXhfcXVhbC5sZXZlbCA9IDA7CisJCXJhbmdlLm1heF9xdWFsLm5vaXNlID0gMDsKKwkJcmFuZ2UuYXZnX3F1YWwucXVhbCA9IDA7CisJCXJhbmdlLmF2Z19xdWFsLmxldmVsID0gMDsKKwkJcmFuZ2UuYXZnX3F1YWwubm9pc2UgPSAwOworCX0gZWxzZSB7CisJCXJhbmdlLm1heF9xdWFsLnF1YWwgPSAweDhiIC0gMHgyZjsKKwkJcmFuZ2UubWF4X3F1YWwubGV2ZWwgPSAweDJmIC0gMHg5NSAtIDE7CisJCXJhbmdlLm1heF9xdWFsLm5vaXNlID0gMHgyZiAtIDB4OTUgLSAxOworCQkvKiBOZWVkIHRvIGdldCBiZXR0ZXIgdmFsdWVzICovCisJCXJhbmdlLmF2Z19xdWFsLnF1YWwgPSAweDI0OworCQlyYW5nZS5hdmdfcXVhbC5sZXZlbCA9IDB4QzI7CisJCXJhbmdlLmF2Z19xdWFsLm5vaXNlID0gMHg5RTsKKwl9CisKKwllcnIgPSBvcmlub2NvX2h3X2dldF9iaXRyYXRlbGlzdChwcml2LCAmbnVtcmF0ZXMsCisJCQkJCSByYW5nZS5iaXRyYXRlLCBJV19NQVhfQklUUkFURVMpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJcmFuZ2UubnVtX2JpdHJhdGVzID0gbnVtcmF0ZXM7CisJCisJLyogU2V0IGFuIGluZGljYXRpb24gb2YgdGhlIG1heCBUQ1AgdGhyb3VnaHB1dCBpbiBiaXQvcyB0aGF0IHdlIGNhbgorCSAqIGV4cGVjdCB1c2luZyB0aGlzIGludGVyZmFjZS4gTWF5IGJlIHVzZSBmb3IgUW9TIHN0dWZmLi4uCisJICogSmVhbiBJSSAqLworCWlmKG51bXJhdGVzID4gMikKKwkJcmFuZ2UudGhyb3VnaHB1dCA9IDUgKiAxMDAwICogMTAwMDsJLyogfjUgTWIvcyAqLworCWVsc2UKKwkJcmFuZ2UudGhyb3VnaHB1dCA9IDEuNSAqIDEwMDAgKiAxMDAwOwkvKiB+MS41IE1iL3MgKi8KKworCXJhbmdlLm1pbl9ydHMgPSAwOworCXJhbmdlLm1heF9ydHMgPSAyMzQ3OworCXJhbmdlLm1pbl9mcmFnID0gMjU2OworCXJhbmdlLm1heF9mcmFnID0gMjM0NjsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCWlmIChwcml2LT5oYXNfd2VwKSB7CisJCXJhbmdlLm1heF9lbmNvZGluZ190b2tlbnMgPSBPUklOT0NPX01BWF9LRVlTOworCisJCXJhbmdlLmVuY29kaW5nX3NpemVbMF0gPSBTTUFMTF9LRVlfU0laRTsKKwkJcmFuZ2UubnVtX2VuY29kaW5nX3NpemVzID0gMTsKKworCQlpZiAocHJpdi0+aGFzX2JpZ193ZXApIHsKKwkJCXJhbmdlLmVuY29kaW5nX3NpemVbMV0gPSBMQVJHRV9LRVlfU0laRTsKKwkJCXJhbmdlLm51bV9lbmNvZGluZ19zaXplcyA9IDI7CisJCX0KKwl9IGVsc2UgeworCQlyYW5nZS5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAwOworCQlyYW5nZS5tYXhfZW5jb2RpbmdfdG9rZW5zID0gMDsKKwl9CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwkJCisJcmFuZ2UubWluX3BtcCA9IDA7CisJcmFuZ2UubWF4X3BtcCA9IDY1NTM1MDAwOworCXJhbmdlLm1pbl9wbXQgPSAwOworCXJhbmdlLm1heF9wbXQgPSA2NTUzNSAqIDEwMDA7CS8qID8/PyAqLworCXJhbmdlLnBtcF9mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKKwlyYW5nZS5wbXRfZmxhZ3MgPSBJV19QT1dFUl9USU1FT1VUOworCXJhbmdlLnBtX2NhcGEgPSBJV19QT1dFUl9QRVJJT0QgfCBJV19QT1dFUl9USU1FT1VUIHwgSVdfUE9XRVJfVU5JQ0FTVF9SOworCisJcmFuZ2UubnVtX3R4cG93ZXIgPSAxOworCXJhbmdlLnR4cG93ZXJbMF0gPSAxNTsgLyogMTVkQm0gKi8KKwlyYW5nZS50eHBvd2VyX2NhcGEgPSBJV19UWFBPV19EQk07CisKKwlyYW5nZS5yZXRyeV9jYXBhID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9MSUZFVElNRTsKKwlyYW5nZS5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUOworCXJhbmdlLnJfdGltZV9mbGFncyA9IElXX1JFVFJZX0xJRkVUSU1FOworCXJhbmdlLm1pbl9yZXRyeSA9IDA7CisJcmFuZ2UubWF4X3JldHJ5ID0gNjU1MzU7CS8qID8/PyAqLworCXJhbmdlLm1pbl9yX3RpbWUgPSAwOworCXJhbmdlLm1heF9yX3RpbWUgPSA2NTUzNSAqIDEwMDA7CS8qID8/PyAqLworCisJaWYgKGNvcHlfdG9fdXNlcihycnEtPnBvaW50ZXIsICZyYW5nZSwgc2l6ZW9mKHJhbmdlKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJVFJBQ0VfRVhJVChkZXYtPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRpd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKmVycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW5kZXggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCWludCBzZXRpbmRleCA9IHByaXYtPnR4X2tleTsKKwlpbnQgZW5hYmxlID0gcHJpdi0+d2VwX29uOworCWludCByZXN0cmljdGVkID0gcHJpdi0+d2VwX3Jlc3RyaWN0OworCXUxNiB4bGVuID0gMDsKKwlpbnQgZXJyID0gMDsKKwljaGFyIGtleWJ1ZltPUklOT0NPX01BWF9LRVlfU0laRV07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghIHByaXYtPmhhc193ZXApCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChlcnEtPnBvaW50ZXIpIHsKKwkJLyogV2UgYWN0dWFsbHkgaGF2ZSBhIGtleSB0byBzZXQgLSBjaGVjayBpdHMgbGVuZ3RoICovCisJCWlmIChlcnEtPmxlbmd0aCA+IExBUkdFX0tFWV9TSVpFKQorCQkJcmV0dXJuIC1FMkJJRzsKKworCQlpZiAoIChlcnEtPmxlbmd0aCA+IFNNQUxMX0tFWV9TSVpFKSAmJiAhcHJpdi0+aGFzX2JpZ193ZXAgKQorCQkJcmV0dXJuIC1FMkJJRzsKKwkJCisJCWlmIChjb3B5X2Zyb21fdXNlcihrZXlidWYsIGVycS0+cG9pbnRlciwgZXJxLT5sZW5ndGgpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoZXJxLT5wb2ludGVyKSB7CisJCWlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gT1JJTk9DT19NQVhfS0VZUykpCisJCQlpbmRleCA9IHByaXYtPnR4X2tleTsKKworCQkvKiBBZGp1c3Qga2V5IGxlbmd0aCB0byBhIHN1cHBvcnRlZCB2YWx1ZSAqLworCQlpZiAoZXJxLT5sZW5ndGggPiBTTUFMTF9LRVlfU0laRSkgeworCQkJeGxlbiA9IExBUkdFX0tFWV9TSVpFOworCQl9IGVsc2UgaWYgKGVycS0+bGVuZ3RoID4gMCkgeworCQkJeGxlbiA9IFNNQUxMX0tFWV9TSVpFOworCQl9IGVsc2UKKwkJCXhsZW4gPSAwOworCisJCS8qIFN3aXRjaCBvbiBXRVAgaWYgb2ZmICovCisJCWlmICgoIWVuYWJsZSkgJiYgKHhsZW4gPiAwKSkgeworCQkJc2V0aW5kZXggPSBpbmRleDsKKwkJCWVuYWJsZSA9IDE7CisJCX0KKwl9IGVsc2UgeworCQkvKiBJbXBvcnRhbnQgbm90ZSA6IGlmIHRoZSB1c2VyIGRvICJpd2NvbmZpZyBldGgwIGVuYyBvZmYiLAorCQkgKiB3ZSB3aWxsIGFycml2ZSB0aGVyZSB3aXRoIGFuIGluZGV4IG9mIC0xLiBUaGlzIGlzIHZhbGlkCisJCSAqIGJ1dCBuZWVkIHRvIGJlIHRha2VuIGNhcmUgb2ZmLi4uIEplYW4gSUkgKi8KKwkJaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+PSBPUklOT0NPX01BWF9LRVlTKSkgeworCQkJaWYoKGluZGV4ICE9IC0xKSB8fCAoZXJxLT5mbGFncyA9PSAwKSkgeworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBTZXQgdGhlIGluZGV4IDogQ2hlY2sgdGhhdCB0aGUga2V5IGlzIHZhbGlkICovCisJCQlpZihwcml2LT5rZXlzW2luZGV4XS5sZW4gPT0gMCkgeworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlzZXRpbmRleCA9IGluZGV4OworCQl9CisJfQorCisJaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpCisJCWVuYWJsZSA9IDA7CisJaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfT1BFTikKKwkJcmVzdHJpY3RlZCA9IDA7CisJaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRCkKKwkJcmVzdHJpY3RlZCA9IDE7CisKKwlpZiAoZXJxLT5wb2ludGVyKSB7CisJCXByaXYtPmtleXNbaW5kZXhdLmxlbiA9IGNwdV90b19sZTE2KHhsZW4pOworCQltZW1zZXQocHJpdi0+a2V5c1tpbmRleF0uZGF0YSwgMCwKKwkJICAgICAgIHNpemVvZihwcml2LT5rZXlzW2luZGV4XS5kYXRhKSk7CisJCW1lbWNweShwcml2LT5rZXlzW2luZGV4XS5kYXRhLCBrZXlidWYsIGVycS0+bGVuZ3RoKTsKKwl9CisJcHJpdi0+dHhfa2V5ID0gc2V0aW5kZXg7CisKKwkvKiBUcnkgZmFzdCBrZXkgY2hhbmdlIGlmIGNvbm5lY3RlZCBhbmQgb25seSBrZXlzIGFyZSBjaGFuZ2VkICovCisJaWYgKHByaXYtPndlcF9vbiAmJiBlbmFibGUgJiYgKHByaXYtPndlcF9yZXN0cmljdCA9PSByZXN0cmljdGVkKSAmJgorCSAgICBuZXRpZl9jYXJyaWVyX29rKGRldikpIHsKKwkJZXJyID0gX19vcmlub2NvX2h3X3NldHVwX3dlcGtleXMocHJpdik7CisJCS8qIE5vIG5lZWQgdG8gY29tbWl0IGlmIHN1Y2Nlc3NmdWwgKi8KKwkJZ290byBvdXQ7CisJfQorCisJcHJpdi0+d2VwX29uID0gZW5hYmxlOworCXByaXYtPndlcF9yZXN0cmljdCA9IHJlc3RyaWN0ZWQ7CisKKyBvdXQ6CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRpd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKmVycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW5kZXggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCXUxNiB4bGVuID0gMDsKKwljaGFyIGtleWJ1ZltPUklOT0NPX01BWF9LRVlfU0laRV07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghIHByaXYtPmhhc193ZXApCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+PSBPUklOT0NPX01BWF9LRVlTKSkKKwkJaW5kZXggPSBwcml2LT50eF9rZXk7CisKKwllcnEtPmZsYWdzID0gMDsKKwlpZiAoISBwcml2LT53ZXBfb24pCisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOworCWVycS0+ZmxhZ3MgfD0gaW5kZXggKyAxOworCisJaWYgKHByaXYtPndlcF9yZXN0cmljdCkKKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsKKwllbHNlCisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CisKKwl4bGVuID0gbGUxNl90b19jcHUocHJpdi0+a2V5c1tpbmRleF0ubGVuKTsKKworCWVycS0+bGVuZ3RoID0geGxlbjsKKworCW1lbWNweShrZXlidWYsIHByaXYtPmtleXNbaW5kZXhdLmRhdGEsIE9SSU5PQ09fTUFYX0tFWV9TSVpFKTsKKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlpZiAoZXJxLT5wb2ludGVyKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoZXJxLT5wb2ludGVyLCBrZXlidWYsIHhsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKmVycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljaGFyIGVzc2lkYnVmW0lXX0VTU0lEX01BWF9TSVpFKzFdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBOb3RlIDogRVNTSUQgaXMgaWdub3JlZCBpbiBBZC1Ib2MgZGVtbyBtb2RlLCBidXQgd2UgY2FuIHNldCBpdAorCSAqIGFueXdheS4uLiAtIEplYW4gSUkgKi8KKworCW1lbXNldCgmZXNzaWRidWYsIDAsIHNpemVvZihlc3NpZGJ1ZikpOworCisJaWYgKGVycS0+ZmxhZ3MpIHsKKwkJaWYgKGVycS0+bGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpCisJCQlyZXR1cm4gLUUyQklHOworCQkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZlc3NpZGJ1ZiwgZXJxLT5wb2ludGVyLCBlcnEtPmxlbmd0aCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQllc3NpZGJ1ZltlcnEtPmxlbmd0aF0gPSAnXDAnOworCX0KKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJbWVtY3B5KHByaXYtPmRlc2lyZWRfZXNzaWQsIGVzc2lkYnVmLCBzaXplb2YocHJpdi0+ZGVzaXJlZF9lc3NpZCkpOworCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICplcnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJY2hhciBlc3NpZGJ1ZltJV19FU1NJRF9NQVhfU0laRSsxXTsKKwlpbnQgYWN0aXZlOworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlUUkFDRV9FTlRFUihkZXYtPm5hbWUpOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQllcnIgPSBvcmlub2NvX2h3X2dldF9lc3NpZChwcml2LCAmYWN0aXZlLCBlc3NpZGJ1Zik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0gZWxzZSB7CisJCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJbWVtY3B5KGVzc2lkYnVmLCBwcml2LT5kZXNpcmVkX2Vzc2lkLCBzaXplb2YoZXNzaWRidWYpKTsKKwkJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwl9CisKKwllcnEtPmZsYWdzID0gMTsKKwllcnEtPmxlbmd0aCA9IHN0cmxlbihlc3NpZGJ1ZikgKyAxOworCWlmIChlcnEtPnBvaW50ZXIpCisJCWlmIChjb3B5X3RvX3VzZXIoZXJxLT5wb2ludGVyLCBlc3NpZGJ1ZiwgZXJxLT5sZW5ndGgpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwlUUkFDRV9FWElUKGRldi0+bmFtZSk7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRuaWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqbnJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWNoYXIgbmlja2J1ZltJV19FU1NJRF9NQVhfU0laRSsxXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG5ycS0+bGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpCisJCXJldHVybiAtRTJCSUc7CisKKwltZW1zZXQobmlja2J1ZiwgMCwgc2l6ZW9mKG5pY2tidWYpKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihuaWNrYnVmLCBucnEtPnBvaW50ZXIsIG5ycS0+bGVuZ3RoKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwluaWNrYnVmW25ycS0+bGVuZ3RoXSA9ICdcMCc7CisJCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwltZW1jcHkocHJpdi0+bmljaywgbmlja2J1Ziwgc2l6ZW9mKHByaXYtPm5pY2spKTsKKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldG5pY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICpucnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJY2hhciBuaWNrYnVmW0lXX0VTU0lEX01BWF9TSVpFKzFdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCW1lbWNweShuaWNrYnVmLCBwcml2LT5uaWNrLCBJV19FU1NJRF9NQVhfU0laRSsxKTsKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJbnJxLT5sZW5ndGggPSBzdHJsZW4obmlja2J1ZikrMTsKKworCWlmIChjb3B5X3RvX3VzZXIobnJxLT5wb2ludGVyLCBuaWNrYnVmLCBzaXplb2Yobmlja2J1ZikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfZnJlcSAqZnJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBjaGFuID0gLTE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFdlIGNhbiBvbmx5IHVzZSB0aGlzIGluIEFkLUhvYyBkZW1vIG1vZGUgdG8gc2V0IHRoZSBvcGVyYXRpbmcKKwkgKiBmcmVxdWVuY3ksIG9yIGluIElCU1MgbW9kZSB0byBzZXQgdGhlIGZyZXF1ZW5jeSB3aGVyZSB0aGUgSUJTUworCSAqIHdpbGwgYmUgY3JlYXRlZCAtIEplYW4gSUkgKi8KKwlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX0FESE9DKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoIChmcnEtPmUgPT0gMCkgJiYgKGZycS0+bSA8PSAxMDAwKSApIHsKKwkJLyogU2V0dGluZyBieSBjaGFubmVsIG51bWJlciAqLworCQljaGFuID0gZnJxLT5tOworCX0gZWxzZSB7CisJCS8qIFNldHRpbmcgYnkgZnJlcXVlbmN5IC0gc2VhcmNoIHRoZSB0YWJsZSAqLworCQlpbnQgbXVsdCA9IDE7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCAoNiAtIGZycS0+ZSk7IGkrKykKKwkJCW11bHQgKj0gMTA7CisKKwkJZm9yIChpID0gMDsgaSA8IE5VTV9DSEFOTkVMUzsgaSsrKQorCQkJaWYgKGZycS0+bSA9PSAoY2hhbm5lbF9mcmVxdWVuY3lbaV0gKiBtdWx0KSkKKwkJCQljaGFuID0gaSsxOworCX0KKworCWlmICggKGNoYW4gPCAxKSB8fCAoY2hhbiA+IE5VTV9DSEFOTkVMUykgfHwKKwkgICAgICEgKHByaXYtPmNoYW5uZWxfbWFzayAmICgxIDw8IChjaGFuLTEpKSApICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKwlwcml2LT5jaGFubmVsID0gY2hhbjsKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wYXJhbSAqc3JxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwl1MTYgdmFsOworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghcHJpdi0+aGFzX3NlbnNpdGl2aXR5KQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKwllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkgIEhFUk1FU19SSURfQ05GU1lTVEVNU0NBTEUsICZ2YWwpOworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJc3JxLT52YWx1ZSA9IHZhbDsKKwlzcnEtPmZpeGVkID0gMDsgLyogYXV0byAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wYXJhbSAqc3JxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCB2YWwgPSBzcnEtPnZhbHVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIXByaXYtPmhhc19zZW5zaXRpdml0eSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCh2YWwgPCAxKSB8fCAodmFsID4gMykpCisJCXJldHVybiAtRUlOVkFMOworCQorCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCXByaXYtPmFwX2RlbnNpdHkgPSB2YWw7CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wYXJhbSAqcnJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCB2YWwgPSBycnEtPnZhbHVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocnJxLT5kaXNhYmxlZCkKKwkJdmFsID0gMjM0NzsKKworCWlmICggKHZhbCA8IDApIHx8ICh2YWwgPiAyMzQ3KSApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlwcml2LT5ydHNfdGhyZXNoID0gdmFsOworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldGZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpmcnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKHByaXYtPmhhc19td28pIHsKKwkJaWYgKGZycS0+ZGlzYWJsZWQpCisJCQlwcml2LT5td29fcm9idXN0ID0gMDsKKwkJZWxzZSB7CisJCQlpZiAoZnJxLT5maXhlZCkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRml4ZWQgZnJhZ21lbnRhdGlvbiBpcyAiCisJCQkJICAgICAgICJub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZmlybXdhcmUuICIKKwkJCQkgICAgICAgIlVzaW5nIE1XTyByb2J1c3QgaW5zdGVhZC5cbiIsIGRldi0+bmFtZSk7CisJCQlwcml2LT5td29fcm9idXN0ID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChmcnEtPmRpc2FibGVkKQorCQkJcHJpdi0+ZnJhZ190aHJlc2ggPSAyMzQ2OworCQllbHNlIHsKKwkJCWlmICggKGZycS0+dmFsdWUgPCAyNTYpIHx8IChmcnEtPnZhbHVlID4gMjM0NikgKQorCQkJCWVyciA9IC1FSU5WQUw7CisJCQllbHNlCisJCQkJcHJpdi0+ZnJhZ190aHJlc2ggPSBmcnEtPnZhbHVlICYgfjB4MTsgLyogbXVzdCBiZSBldmVuICovCisJCX0KKwl9CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldGZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpmcnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnIgPSAwOworCXUxNiB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCQorCWlmIChwcml2LT5oYXNfbXdvKSB7CisJCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgIEhFUk1FU19SSURfQ05GTVdPUk9CVVNUX0FHRVJFLAorCQkJCQkgICZ2YWwpOworCQlpZiAoZXJyKQorCQkJdmFsID0gMDsKKworCQlmcnEtPnZhbHVlID0gdmFsID8gMjM0NyA6IDA7CisJCWZycS0+ZGlzYWJsZWQgPSAhIHZhbDsKKwkJZnJxLT5maXhlZCA9IDA7CisJfSBlbHNlIHsKKwkJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GRlJBR01FTlRBVElPTlRIUkVTSE9MRCwKKwkJCQkJICAmdmFsKTsKKwkJaWYgKGVycikKKwkJCXZhbCA9IDA7CisKKwkJZnJxLT52YWx1ZSA9IHZhbDsKKwkJZnJxLT5kaXNhYmxlZCA9ICh2YWwgPj0gMjM0Nik7CisJCWZycS0+Zml4ZWQgPSAxOworCX0KKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldHJhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpycnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVyciA9IDA7CisJaW50IHJhdGVtb2RlID0gLTE7CisJaW50IGJpdHJhdGU7IC8qIDEwMHMgb2Yga2lsb2JpdHMgKi8KKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCS8qIEFzIHRoZSB1c2VyIHNwYWNlIGRvZXNuJ3Qga25vdyBvdXIgaGlnaGVzdCByYXRlLCBpdCB1c2VzIC0xCisJICogdG8gYXNrIHVzIHRvIHNldCB0aGUgaGlnaGVzdCByYXRlLiAgVGVzdCBpdCB1c2luZyAiaXdjb25maWcKKwkgKiBldGhYIHJhdGUgYXV0byIgLSBKZWFuIElJICovCisJaWYgKHJycS0+dmFsdWUgPT0gLTEpCisJCWJpdHJhdGUgPSAxMTA7CisJZWxzZSB7CisJCWlmIChycnEtPnZhbHVlICUgMTAwMDAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJpdHJhdGUgPSBycnEtPnZhbHVlIC8gMTAwMDAwOworCX0KKworCWlmICggKGJpdHJhdGUgIT0gMTApICYmIChiaXRyYXRlICE9IDIwKSAmJgorCSAgICAgKGJpdHJhdGUgIT0gNTUpICYmIChiaXRyYXRlICE9IDExMCkgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBCSVRSQVRFX1RBQkxFX1NJWkU7IGkrKykKKwkJaWYgKCAoYml0cmF0ZV90YWJsZVtpXS5iaXRyYXRlID09IGJpdHJhdGUpICYmCisJCSAgICAgKGJpdHJhdGVfdGFibGVbaV0uYXV0b21hdGljID09ICEgcnJxLT5maXhlZCkgKSB7CisJCQlyYXRlbW9kZSA9IGk7CisJCQlicmVhazsKKwkJfQorCQorCWlmIChyYXRlbW9kZSA9PSAtMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKwlwcml2LT5iaXRyYXRlbW9kZSA9IHJhdGVtb2RlOworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKnJycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVyciA9IDA7CisJaW50IHJhdGVtb2RlOworCWludCBpOworCXUxNiB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmF0ZW1vZGUgPSBwcml2LT5iaXRyYXRlbW9kZTsKKworCUJVR19PTigocmF0ZW1vZGUgPCAwKSB8fCAocmF0ZW1vZGUgPj0gQklUUkFURV9UQUJMRV9TSVpFKSk7CisKKwlycnEtPnZhbHVlID0gYml0cmF0ZV90YWJsZVtyYXRlbW9kZV0uYml0cmF0ZSAqIDEwMDAwMDsKKwlycnEtPmZpeGVkID0gISBiaXRyYXRlX3RhYmxlW3JhdGVtb2RlXS5hdXRvbWF0aWM7CisJcnJxLT5kaXNhYmxlZCA9IDA7CisKKwkvKiBJZiB0aGUgaW50ZXJmYWNlIGlzIHJ1bm5pbmcgd2UgdHJ5IHRvIGZpbmQgbW9yZSBhYm91dCB0aGUKKwkgICBjdXJyZW50IG1vZGUgKi8KKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgIEhFUk1FU19SSURfQ1VSUkVOVFRYUkFURSwgJnZhbCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJCisJCXN3aXRjaCAocHJpdi0+ZmlybXdhcmVfdHlwZSkgeworCQljYXNlIEZJUk1XQVJFX1RZUEVfQUdFUkU6IC8qIEx1Y2VudCBzdHlsZSByYXRlICovCisJCQkvKiBOb3RlIDogaW4gTHVjZW50IGZpcm13YXJlLCB0aGUgcmV0dXJuIHZhbHVlIG9mCisJCQkgKiBIRVJNRVNfUklEX0NVUlJFTlRUWFJBVEUgaXMgdGhlIGJpdHJhdGUgaW4gTWIvcywKKwkJCSAqIGFuZCB0aGVyZWZvcmUgaXMgdG90YWxseSBkaWZmZXJlbnQgZnJvbSB0aGUKKwkJCSAqIGVuY29kaW5nIG9mIEhFUk1FU19SSURfQ05GVFhSQVRFQ09OVFJPTC4KKwkJCSAqIERvbid0IGZvcmdldCB0aGF0IDZNYi9zIGlzIHJlYWxseSA1LjVNYi9zICovCisJCQlpZiAodmFsID09IDYpCisJCQkJcnJxLT52YWx1ZSA9IDU1MDAwMDA7CisJCQllbHNlCisJCQkJcnJxLT52YWx1ZSA9IHZhbCAqIDEwMDAwMDA7CisJCQlicmVhazsKKwkJY2FzZSBGSVJNV0FSRV9UWVBFX0lOVEVSU0lMOiAvKiBJbnRlcnNpbCBzdHlsZSByYXRlICovCisJCWNhc2UgRklSTVdBUkVfVFlQRV9TWU1CT0w6IC8qIFN5bWJvbCBzdHlsZSByYXRlICovCisJCQlmb3IgKGkgPSAwOyBpIDwgQklUUkFURV9UQUJMRV9TSVpFOyBpKyspCisJCQkJaWYgKGJpdHJhdGVfdGFibGVbaV0uaW50ZXJzaWxfdHhyYXRlY3RybCA9PSB2YWwpIHsKKwkJCQkJcmF0ZW1vZGUgPSBpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQlpZiAoaSA+PSBCSVRSQVRFX1RBQkxFX1NJWkUpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVuYWJsZSB0byBkZXRlcm1pbmUgY3VycmVudCBiaXRyYXRlICgweCUwNGh4KVxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCB2YWwpOworCisJCQlycnEtPnZhbHVlID0gYml0cmF0ZV90YWJsZVtyYXRlbW9kZV0uYml0cmF0ZSAqIDEwMDAwMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCX0KKwl9CisKKyBvdXQ6CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRwb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKnBycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAocHJxLT5kaXNhYmxlZCkgeworCQlwcml2LT5wbV9vbiA9IDA7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChwcnEtPmZsYWdzICYgSVdfUE9XRVJfTU9ERSkgeworCQljYXNlIElXX1BPV0VSX1VOSUNBU1RfUjoKKwkJCXByaXYtPnBtX21jYXN0ID0gMDsKKwkJCXByaXYtPnBtX29uID0gMTsKKwkJCWJyZWFrOworCQljYXNlIElXX1BPV0VSX0FMTF9SOgorCQkJcHJpdi0+cG1fbWNhc3QgPSAxOworCQkJcHJpdi0+cG1fb24gPSAxOworCQkJYnJlYWs7CisJCWNhc2UgSVdfUE9XRVJfT046CisJCQkvKiBObyBmbGFncyA6IGJ1dCB3ZSBtYXkgaGF2ZSBhIHZhbHVlIC0gSmVhbiBJSSAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnIgPSAtRUlOVkFMOworCQl9CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJCisJCWlmIChwcnEtPmZsYWdzICYgSVdfUE9XRVJfVElNRU9VVCkgeworCQkJcHJpdi0+cG1fb24gPSAxOworCQkJcHJpdi0+cG1fdGltZW91dCA9IHBycS0+dmFsdWUgLyAxMDAwOworCQl9CisJCWlmIChwcnEtPmZsYWdzICYgSVdfUE9XRVJfUEVSSU9EKSB7CisJCQlwcml2LT5wbV9vbiA9IDE7CisJCQlwcml2LT5wbV9wZXJpb2QgPSBwcnEtPnZhbHVlIC8gMTAwMDsKKwkJfQorCQkvKiBJdCdzIHZhbGlkIHRvIG5vdCBoYXZlIGEgdmFsdWUgaWYgd2UgYXJlIGp1c3QgdG9nZ2xpbmcKKwkJICogdGhlIGZsYWdzLi4uIEplYW4gSUkgKi8KKwkJaWYoIXByaXYtPnBtX29uKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0JCQkKKwl9CisKKyBvdXQ6CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRwb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKnBycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVyciA9IDA7CisJdTE2IGVuYWJsZSwgcGVyaW9kLCB0aW1lb3V0LCBtY2FzdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisJCisJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GUE1FTkFCTEVELCAmZW5hYmxlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCSAgSEVSTUVTX1JJRF9DTkZNQVhTTEVFUERVUkFUSU9OLCAmcGVyaW9kKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORlBNSE9MRE9WRVJEVVJBVElPTiwgJnRpbWVvdXQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GTVVMVElDQVNUUkVDRUlWRSwgJm1jYXN0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXBycS0+ZGlzYWJsZWQgPSAhZW5hYmxlOworCS8qIE5vdGUgOiBieSBkZWZhdWx0LCBkaXNwbGF5IHRoZSBwZXJpb2QgKi8KKwlpZiAoKHBycS0+ZmxhZ3MgJiBJV19QT1dFUl9UWVBFKSA9PSBJV19QT1dFUl9USU1FT1VUKSB7CisJCXBycS0+ZmxhZ3MgPSBJV19QT1dFUl9USU1FT1VUOworCQlwcnEtPnZhbHVlID0gdGltZW91dCAqIDEwMDA7CisJfSBlbHNlIHsKKwkJcHJxLT5mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKKwkJcHJxLT52YWx1ZSA9IHBlcmlvZCAqIDEwMDA7CisJfQorCWlmIChtY2FzdCkKKwkJcHJxLT5mbGFncyB8PSBJV19QT1dFUl9BTExfUjsKKwllbHNlCisJCXBycS0+ZmxhZ3MgfD0gSVdfUE9XRVJfVU5JQ0FTVF9SOworCisgb3V0OgorCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0cmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpycnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnIgPSAwOworCXUxNiBzaG9ydF9saW1pdCwgbG9uZ19saW1pdCwgbGlmZXRpbWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCQorCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX1NIT1JUUkVUUllMSU1JVCwKKwkJCQkgICZzaG9ydF9saW1pdCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9MT05HUkVUUllMSU1JVCwKKwkJCQkgICZsb25nX2xpbWl0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX01BWFRSQU5TTUlUTElGRVRJTUUsCisJCQkJICAmbGlmZXRpbWUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJcnJxLT5kaXNhYmxlZCA9IDA7CQkvKiBDYW4ndCBiZSBkaXNhYmxlZCAqLworCisJLyogTm90ZSA6IGJ5IGRlZmF1bHQsIGRpc3BsYXkgdGhlIHJldHJ5IG51bWJlciAqLworCWlmICgocnJxLT5mbGFncyAmIElXX1JFVFJZX1RZUEUpID09IElXX1JFVFJZX0xJRkVUSU1FKSB7CisJCXJycS0+ZmxhZ3MgPSBJV19SRVRSWV9MSUZFVElNRTsKKwkJcnJxLT52YWx1ZSA9IGxpZmV0aW1lICogMTAwMDsJLyogPz8/ICovCisJfSBlbHNlIHsKKwkJLyogQnkgZGVmYXVsdCwgZGlzcGxheSB0aGUgbWluIG51bWJlciAqLworCQlpZiAoKHJycS0+ZmxhZ3MgJiBJV19SRVRSWV9NQVgpKSB7CisJCQlycnEtPmZsYWdzID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9NQVg7CisJCQlycnEtPnZhbHVlID0gbG9uZ19saW1pdDsKKwkJfSBlbHNlIHsKKwkJCXJycS0+ZmxhZ3MgPSBJV19SRVRSWV9MSU1JVDsKKwkJCXJycS0+dmFsdWUgPSBzaG9ydF9saW1pdDsKKwkJCWlmKHNob3J0X2xpbWl0ICE9IGxvbmdfbGltaXQpCisJCQkJcnJxLT5mbGFncyB8PSBJV19SRVRSWV9NSU47CisJCX0KKwl9CisKKyBvdXQ6CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRpYnNzcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdyZXEgKndycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgdmFsID0gKiggKGludCAqKSB3cnEtPnUubmFtZSApOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXByaXYtPmlic3NfcG9ydCA9IHZhbCA7CisKKwkvKiBBY3R1YWxseSB1cGRhdGUgdGhlIG1vZGUgd2UgYXJlIHVzaW5nICovCisJc2V0X3BvcnRfdHlwZShwcml2KTsKKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRpYnNzcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdyZXEgKndycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgKnZhbCA9IChpbnQgKil3cnEtPnUubmFtZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwkqdmFsID0gcHJpdi0+aWJzc19wb3J0OworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldHBvcnQzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd3JlcSAqd3JxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCB2YWwgPSAqKCAoaW50ICopIHdycS0+dS5uYW1lICk7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJc3dpdGNoICh2YWwpIHsKKwljYXNlIDA6IC8qIFRyeSB0byBkbyBJRUVFIGFkLWhvYyBtb2RlICovCisJCWlmICghIHByaXYtPmhhc19pYnNzKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJcHJpdi0+cHJlZmVyX3BvcnQzID0gMDsKKwkJCQorCQlicmVhazsKKworCWNhc2UgMTogLyogVHJ5IHRvIGRvIEx1Y2VudCBwcm9wcmlldGFyeSBhZC1ob2MgbW9kZSAqLworCQlpZiAoISBwcml2LT5oYXNfcG9ydDMpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlwcml2LT5wcmVmZXJfcG9ydDMgPSAxOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJfQorCisJaWYgKCEgZXJyKQorCQkvKiBBY3R1YWxseSB1cGRhdGUgdGhlIG1vZGUgd2UgYXJlIHVzaW5nICovCisJCXNldF9wb3J0X3R5cGUocHJpdik7CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldHBvcnQzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd3JlcSAqd3JxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCAqdmFsID0gKGludCAqKXdycS0+dS5uYW1lOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCSp2YWwgPSBwcml2LT5wcmVmZXJfcG9ydDM7CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyogU3B5IGlzIHVzZWQgZm9yIGxpbmsgcXVhbGl0eS9zdHJlbmd0aCBtZWFzdXJlbWVudHMgaW4gQWQtSG9jIG1vZGUKKyAqIEplYW4gSUkgKi8KK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRzcHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICpzcnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNvY2thZGRyIGFkZHJlc3NbSVdfTUFYX1NQWV07CisJaW50IG51bWJlciA9IHNycS0+bGVuZ3RoOworCWludCBpOworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBDaGVjayB0aGUgbnVtYmVyIG9mIGFkZHJlc3NlcyAqLworCWlmIChudW1iZXIgPiBJV19NQVhfU1BZKQorCQlyZXR1cm4gLUUyQklHOworCisJLyogR2V0IHRoZSBkYXRhIGluIHRoZSBkcml2ZXIgKi8KKwlpZiAoc3JxLT5wb2ludGVyKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcihhZGRyZXNzLCBzcnEtPnBvaW50ZXIsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKiBudW1iZXIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogTWFrZSBzdXJlIG5vYm9keSBtZXNzIHdpdGggdGhlIHN0cnVjdHVyZSB3aGlsZSB3ZSBkbyAqLworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogb3Jpbm9jb19sb2NrKCkgZG9lc24ndCBkaXNhYmxlIGludGVycnVwdHMsIHNvIG1ha2Ugc3VyZSB0aGUKKwkgKiBpbnRlcnJ1cHQgcnggcGF0aCBkb24ndCBnZXQgY29uZnVzZWQgd2hpbGUgd2UgY29weSAqLworCXByaXYtPnNweV9udW1iZXIgPSAwOworCisJaWYgKG51bWJlciA+IDApIHsKKwkJLyogRXh0cmFjdCB0aGUgYWRkcmVzc2VzICovCisJCWZvciAoaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKKwkJCW1lbWNweShwcml2LT5zcHlfYWRkcmVzc1tpXSwgYWRkcmVzc1tpXS5zYV9kYXRhLAorCQkJICAgICAgIEVUSF9BTEVOKTsKKwkJLyogUmVzZXQgc3RhdHMgKi8KKwkJbWVtc2V0KHByaXYtPnNweV9zdGF0LCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSAqIElXX01BWF9TUFkpOworCQkvKiBTZXQgbnVtYmVyIG9mIGFkZHJlc3NlcyAqLworCQlwcml2LT5zcHlfbnVtYmVyID0gbnVtYmVyOworCX0KKworCS8qIE5vdywgbGV0IHRoZSBvdGhlcnMgcGxheSAqLworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0c3B5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqc3JxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBzb2NrYWRkciBhZGRyZXNzW0lXX01BWF9TUFldOworCXN0cnVjdCBpd19xdWFsaXR5IHNweV9zdGF0W0lXX01BWF9TUFldOworCWludCBudW1iZXI7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJbnVtYmVyID0gcHJpdi0+c3B5X251bWJlcjsKKwlpZiAoKG51bWJlciA+IDApICYmIChzcnEtPnBvaW50ZXIpKSB7CisJCS8qIENyZWF0ZSBhZGRyZXNzIHN0cnVjdCAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKKwkJCW1lbWNweShhZGRyZXNzW2ldLnNhX2RhdGEsIHByaXYtPnNweV9hZGRyZXNzW2ldLAorCQkJICAgICAgIEVUSF9BTEVOKTsKKwkJCWFkZHJlc3NbaV0uc2FfZmFtaWx5ID0gQUZfVU5JWDsKKwkJfQorCQkvKiBDb3B5IHN0YXRzICovCisJCS8qIEluIHRoZW9yeSwgd2Ugc2hvdWxkIGRpc2FibGUgaXJxcyB3aGlsZSBjb3B5aW5nIHRoZSBzdGF0cworCQkgKiBiZWNhdXNlIHRoZSByeCBwYXRoIG1pZ2h0IHVwZGF0ZSBpdCBpbiB0aGUgbWlkZGxlLi4uCisJCSAqIEJhaCwgd2hvIGNhcmUgPyAtIEplYW4gSUkgKi8KKwkJbWVtY3B5KCZzcHlfc3RhdCwgcHJpdi0+c3B5X3N0YXQsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpICogSVdfTUFYX1NQWSk7CisJCWZvciAoaT0wOyBpIDwgbnVtYmVyOyBpKyspCisJCQlwcml2LT5zcHlfc3RhdFtpXS51cGRhdGVkID0gMDsKKwl9CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJLyogUHVzaCBzdHVmZiB0byB1c2VyIHNwYWNlICovCisJc3JxLT5sZW5ndGggPSBudW1iZXI7CisJaWYoY29weV90b191c2VyKHNycS0+cG9pbnRlciwgYWRkcmVzcywKKwkJCSBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSAqIG51bWJlcikpCisJCXJldHVybiAtRUZBVUxUOworCWlmKGNvcHlfdG9fdXNlcihzcnEtPnBvaW50ZXIgKyAoc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikqbnVtYmVyKSwKKwkJCSZzcHlfc3RhdCwgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSAqIG51bWJlcikpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK29yaW5vY29faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKilycTsKKwlpbnQgZXJyID0gMDsKKwlpbnQgdG1wOworCWludCBjaGFuZ2VkID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJVFJBQ0VfRU5URVIoZGV2LT5uYW1lKTsKKworCS8qIEluIHRoZW9yeSwgd2UgY291bGQgYWxsb3cgbW9zdCBvZiB0aGUgdGhlIFNFVCBzdHVmZiB0byBiZQorCSAqIGRvbmUuIEluIHByYWN0aWNlLCB0aGUgbGFwc2Ugb2YgdGltZSBhdCBzdGFydHVwIHdoZW4gdGhlCisJICogY2FyZCBpcyBub3QgcmVhZHkgaXMgdmVyeSBzaG9ydCwgc28gd2h5IGJvdGhlci4uLiAgTm90ZQorCSAqIHRoYXQgbmV0aWZfZGV2aWNlX3ByZXNlbnQgaXMgZGlmZmVyZW50IGZyb20gdXAvZG93bgorCSAqIChpZmNvbmZpZyksIHdoZW4gdGhlIGRldmljZSBpcyBub3QgeWV0IHVwLCBpdCBpcyB1c3VhbGx5CisJICogYWxyZWFkeSByZWFkeS4uLiAgSmVhbiBJSSAqLworCWlmICghIG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCXJldHVybiAtRU5PREVWOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHSVdOQU1FOgorCQlzdHJjcHkod3JxLT51Lm5hbWUsICJJRUVFIDgwMi4xMS1EUyIpOworCQlicmVhazsKKwkJCisJY2FzZSBTSU9DR0lXQVA6CisJCXdycS0+dS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJZXJyID0gb3Jpbm9jb19od19nZXRfYnNzaWQocHJpdiwgd3JxLT51LmFwX2FkZHIuc2FfZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lXUkFOR0U6CisJCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0aXdyYW5nZShkZXYsICZ3cnEtPnUuZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0lXTU9ERToKKwkJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCQlyZXR1cm4gLUVCVVNZOworCQlzd2l0Y2ggKHdycS0+dS5tb2RlKSB7CisJCWNhc2UgSVdfTU9ERV9BREhPQzoKKwkJCWlmICghIChwcml2LT5oYXNfaWJzcyB8fCBwcml2LT5oYXNfcG9ydDMpICkKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJZWxzZSB7CisJCQkJcHJpdi0+aXdfbW9kZSA9IElXX01PREVfQURIT0M7CisJCQkJY2hhbmdlZCA9IDE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIElXX01PREVfSU5GUkE6CisJCQlwcml2LT5pd19tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwkJCWNoYW5nZWQgPSAxOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlzZXRfcG9ydF90eXBlKHByaXYpOworCQlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dJV01PREU6CisJCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJd3JxLT51Lm1vZGUgPSBwcml2LT5pd19tb2RlOworCQlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgU0lPQ1NJV0VOQ09ERToKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRpd2VuY29kZShkZXYsICZ3cnEtPnUuZW5jb2RpbmcpOworCQlpZiAoISBlcnIpCisJCQljaGFuZ2VkID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHSVdFTkNPREU6CisJCWlmICghIGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCWVyciA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRpd2VuY29kZShkZXYsICZ3cnEtPnUuZW5jb2RpbmcpOworCQlicmVhazsKKworCWNhc2UgU0lPQ1NJV0VTU0lEOgorCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldGVzc2lkKGRldiwgJndycS0+dS5lc3NpZCk7CisJCWlmICghIGVycikKKwkJCWNoYW5nZWQgPSAxOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dJV0VTU0lEOgorCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldGVzc2lkKGRldiwgJndycS0+dS5lc3NpZCk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0lXTklDS046CisJCWVyciA9IG9yaW5vY29faW9jdGxfc2V0bmljayhkZXYsICZ3cnEtPnUuZGF0YSk7CisJCWlmICghIGVycikKKwkJCWNoYW5nZWQgPSAxOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dJV05JQ0tOOgorCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldG5pY2soZGV2LCAmd3JxLT51LmRhdGEpOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dJV0ZSRVE6CisJCXRtcCA9IG9yaW5vY29faHdfZ2V0X2ZyZXEocHJpdik7CisJCWlmICh0bXAgPCAwKSB7CisJCQllcnIgPSB0bXA7CisJCX0gZWxzZSB7CisJCQl3cnEtPnUuZnJlcS5tID0gdG1wOworCQkJd3JxLT51LmZyZXEuZSA9IDE7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTSVdGUkVROgorCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldGZyZXEoZGV2LCAmd3JxLT51LmZyZXEpOworCQlpZiAoISBlcnIpCisJCQljaGFuZ2VkID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHSVdTRU5TOgorCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldHNlbnMoZGV2LCAmd3JxLT51LnNlbnMpOworCQlicmVhazsKKworCWNhc2UgU0lPQ1NJV1NFTlM6CisJCWVyciA9IG9yaW5vY29faW9jdGxfc2V0c2VucyhkZXYsICZ3cnEtPnUuc2Vucyk7CisJCWlmICghIGVycikKKwkJCWNoYW5nZWQgPSAxOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dJV1JUUzoKKwkJd3JxLT51LnJ0cy52YWx1ZSA9IHByaXYtPnJ0c190aHJlc2g7CisJCXdycS0+dS5ydHMuZGlzYWJsZWQgPSAod3JxLT51LnJ0cy52YWx1ZSA9PSAyMzQ3KTsKKwkJd3JxLT51LnJ0cy5maXhlZCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0lXUlRTOgorCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldHJ0cyhkZXYsICZ3cnEtPnUucnRzKTsKKwkJaWYgKCEgZXJyKQorCQkJY2hhbmdlZCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0lXRlJBRzoKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRmcmFnKGRldiwgJndycS0+dS5mcmFnKTsKKwkJaWYgKCEgZXJyKQorCQkJY2hhbmdlZCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lXRlJBRzoKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRmcmFnKGRldiwgJndycS0+dS5mcmFnKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTSVdSQVRFOgorCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldHJhdGUoZGV2LCAmd3JxLT51LmJpdHJhdGUpOworCQlpZiAoISBlcnIpCisJCQljaGFuZ2VkID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHSVdSQVRFOgorCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldHJhdGUoZGV2LCAmd3JxLT51LmJpdHJhdGUpOworCQlicmVhazsKKworCWNhc2UgU0lPQ1NJV1BPV0VSOgorCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldHBvd2VyKGRldiwgJndycS0+dS5wb3dlcik7CisJCWlmICghIGVycikKKwkJCWNoYW5nZWQgPSAxOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dJV1BPV0VSOgorCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldHBvd2VyKGRldiwgJndycS0+dS5wb3dlcik7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lXVFhQT1c6CisJCS8qIFRoZSBjYXJkIG9ubHkgc3VwcG9ydHMgb25lIHR4IHBvd2VyLCBzbyB0aGlzIGlzIGVhc3kgKi8KKwkJd3JxLT51LnR4cG93ZXIudmFsdWUgPSAxNTsgLyogZEJtICovCisJCXdycS0+dS50eHBvd2VyLmZpeGVkID0gMTsKKwkJd3JxLT51LnR4cG93ZXIuZGlzYWJsZWQgPSAwOworCQl3cnEtPnUudHhwb3dlci5mbGFncyA9IElXX1RYUE9XX0RCTTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTSVdSRVRSWToKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lXUkVUUlk6CisJCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0cmV0cnkoZGV2LCAmd3JxLT51LnJldHJ5KTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTSVdTUFk6CisJCWVyciA9IG9yaW5vY29faW9jdGxfc2V0c3B5KGRldiwgJndycS0+dS5kYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHSVdTUFk6CisJCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0c3B5KGRldiwgJndycS0+dS5kYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHSVdQUklWOgorCQlpZiAod3JxLT51LmRhdGEucG9pbnRlcikgeworCQkJc3RydWN0IGl3X3ByaXZfYXJncyBwcml2dGFiW10gPSB7CisJCQkJeyBTSU9DSVdGSVJTVFBSSVYgKyAweDAsIDAsIDAsICJmb3JjZV9yZXNldCIgfSwKKwkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4MSwgMCwgMCwgImNhcmRfcmVzZXQiIH0sCisJCQkJeyBTSU9DSVdGSVJTVFBSSVYgKyAweDIsCisJCQkJICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJCQkgIDAsICJzZXRfcG9ydDMiIH0sCisJCQkJeyBTSU9DSVdGSVJTVFBSSVYgKyAweDMsIDAsCisJCQkJICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJCQkgICJnZXRfcG9ydDMiIH0sCisJCQkJeyBTSU9DSVdGSVJTVFBSSVYgKyAweDQsCisJCQkJICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJCQkgIDAsICJzZXRfcHJlYW1ibGUiIH0sCisJCQkJeyBTSU9DSVdGSVJTVFBSSVYgKyAweDUsIDAsCisJCQkJICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJCQkgICJnZXRfcHJlYW1ibGUiIH0sCisJCQkJeyBTSU9DSVdGSVJTVFBSSVYgKyAweDYsCisJCQkJICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJCQkgIDAsICJzZXRfaWJzc3BvcnQiIH0sCisJCQkJeyBTSU9DSVdGSVJTVFBSSVYgKyAweDcsIDAsCisJCQkJICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkJCQkgICJnZXRfaWJzc3BvcnQiIH0sCisJCQkJeyBTSU9DSVdMQVNUUFJJViwgMCwgMCwgImR1bXBfcmVjcyIgfSwKKwkJCX07CisKKwkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwcml2dGFiKSAvIHNpemVvZihwcml2dGFiWzBdKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcHJpdnRhYiwgc2l6ZW9mKHByaXZ0YWIpKSkKKwkJCQllcnIgPSAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCSAgICAgICAKKwljYXNlIFNJT0NJV0ZJUlNUUFJJViArIDB4MDogLyogZm9yY2VfcmVzZXQgKi8KKwljYXNlIFNJT0NJV0ZJUlNUUFJJViArIDB4MTogLyogY2FyZF9yZXNldCAqLworCQlpZiAoISBjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQllcnIgPSAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCQkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBGb3JjZSBzY2hlZHVsaW5nIHJlc2V0IVxuIiwgZGV2LT5uYW1lKTsKKworCQlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93b3JrKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NJV0ZJUlNUUFJJViArIDB4MjogLyogc2V0X3BvcnQzICovCisJCWlmICghIGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCWVyciA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRwb3J0MyhkZXYsIHdycSk7CisJCWlmICghIGVycikKKwkJCWNoYW5nZWQgPSAxOworCQlicmVhazsKKworCWNhc2UgU0lPQ0lXRklSU1RQUklWICsgMHgzOiAvKiBnZXRfcG9ydDMgKi8KKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRwb3J0MyhkZXYsIHdycSk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DSVdGSVJTVFBSSVYgKyAweDQ6IC8qIHNldF9wcmVhbWJsZSAqLworCQlpZiAoISBjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQllcnIgPSAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCisJCS8qIDgwMi4xMWIgaGFzIHJlY2VudGx5IGRlZmluZWQgc29tZSBzaG9ydCBwcmVhbWJsZS4KKwkJICogQmFzaWNhbGx5LCB0aGUgUGh5IGhlYWRlciBoYXMgYmVlbiByZWR1Y2VkIGluIHNpemUuCisJCSAqIFRoaXMgaW5jcmVhc2UgcGVyZm9ybWFuY2UsIGVzcGVjaWFsbHkgYXQgaGlnaCByYXRlcworCQkgKiAodGhlIHByZWFtYmxlIGlzIHRyYW5zbWl0dGVkIGF0IDFNYi9zKSwgdW5mb3J0dW5hdGVseQorCQkgKiB0aGlzIGdpdmUgY29tcGF0aWJpbGl0eSB0cm91Ymxlcy4uLiAtIEplYW4gSUkgKi8KKwkJaWYocHJpdi0+aGFzX3ByZWFtYmxlKSB7CisJCQlpbnQgdmFsID0gKiggKGludCAqKSB3cnEtPnUubmFtZSApOworCisJCQlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJaWYgKHZhbCkKKwkJCQlwcml2LT5wcmVhbWJsZSA9IDE7CisJCQllbHNlCisJCQkJcHJpdi0+cHJlYW1ibGUgPSAwOworCQkJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwkJCWNoYW5nZWQgPSAxOworCQl9IGVsc2UKKwkJCWVyciA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKKworCWNhc2UgU0lPQ0lXRklSU1RQUklWICsgMHg1OiAvKiBnZXRfcHJlYW1ibGUgKi8KKwkJaWYocHJpdi0+aGFzX3ByZWFtYmxlKSB7CisJCQlpbnQgKnZhbCA9IChpbnQgKil3cnEtPnUubmFtZTsKKworCQkJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCSp2YWwgPSBwcml2LT5wcmVhbWJsZTsKKwkJCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJCX0gZWxzZQorCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCWNhc2UgU0lPQ0lXRklSU1RQUklWICsgMHg2OiAvKiBzZXRfaWJzc3BvcnQgKi8KKwkJaWYgKCEgY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJZXJyID0gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKworCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldGlic3Nwb3J0KGRldiwgd3JxKTsKKwkJaWYgKCEgZXJyKQorCQkJY2hhbmdlZCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTSU9DSVdGSVJTVFBSSVYgKyAweDc6IC8qIGdldF9pYnNzcG9ydCAqLworCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldGlic3Nwb3J0KGRldiwgd3JxKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NJV0xBU1RQUklWOgorCQllcnIgPSBvcmlub2NvX2RlYnVnX2R1bXBfcmVjcyhkZXYpOworCQlpZiAoZXJyKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGR1bXAgcmVjb3JkcyAoJWQpXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJYnJlYWs7CisKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FT1BOT1RTVVBQOworCX0KKwkKKwlpZiAoISBlcnIgJiYgY2hhbmdlZCAmJiBuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJZXJyID0gb3Jpbm9jb19yZWNvbmZpZ3VyZShkZXYpOworCX0JCQorCisJVFJBQ0VfRVhJVChkZXYtPm5hbWUpOworCisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IHsKKwl1MTYgcmlkOworCWNoYXIgKm5hbWU7CisJaW50IGRpc3BsYXl0eXBlOworI2RlZmluZSBESVNQTEFZX1dPUkRTCTAKKyNkZWZpbmUgRElTUExBWV9CWVRFUwkxCisjZGVmaW5lIERJU1BMQVlfU1RSSU5HCTIKKyNkZWZpbmUgRElTUExBWV9YU1RSSU5HCTMKK30gcmVjb3JkX3RhYmxlW10gPSB7CisjZGVmaW5lIERFQlVHX1JFQyhuYW1lLHR5cGUpIHsgSEVSTUVTX1JJRF8jI25hbWUsICNuYW1lLCBESVNQTEFZXyMjdHlwZSB9CisJREVCVUdfUkVDKENORlBPUlRUWVBFLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GT1dOTUFDQUREUixCWVRFUyksCisJREVCVUdfUkVDKENORkRFU0lSRURTU0lELFNUUklORyksCisJREVCVUdfUkVDKENORk9XTkNIQU5ORUwsV09SRFMpLAorCURFQlVHX1JFQyhDTkZPV05TU0lELFNUUklORyksCisJREVCVUdfUkVDKENORk9XTkFUSU1XSU5ET1csV09SRFMpLAorCURFQlVHX1JFQyhDTkZTWVNURU1TQ0FMRSxXT1JEUyksCisJREVCVUdfUkVDKENORk1BWERBVEFMRU4sV09SRFMpLAorCURFQlVHX1JFQyhDTkZQTUVOQUJMRUQsV09SRFMpLAorCURFQlVHX1JFQyhDTkZQTUVQUyxXT1JEUyksCisJREVCVUdfUkVDKENORk1VTFRJQ0FTVFJFQ0VJVkUsV09SRFMpLAorCURFQlVHX1JFQyhDTkZNQVhTTEVFUERVUkFUSU9OLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GUE1IT0xET1ZFUkRVUkFUSU9OLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GT1dOTkFNRSxTVFJJTkcpLAorCURFQlVHX1JFQyhDTkZPV05EVElNUEVSSU9ELFdPUkRTKSwKKwlERUJVR19SRUMoQ05GTVVMVElDQVNUUE1CVUZGRVJJTkcsV09SRFMpLAorCURFQlVHX1JFQyhDTkZXRVBFTkFCTEVEX0FHRVJFLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GTUFOREFUT1JZQlNTSURfU1lNQk9MLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GV0VQREVGQVVMVEtFWUlELFdPUkRTKSwKKwlERUJVR19SRUMoQ05GREVGQVVMVEtFWTAsQllURVMpLAorCURFQlVHX1JFQyhDTkZERUZBVUxUS0VZMSxCWVRFUyksCisJREVCVUdfUkVDKENORk1XT1JPQlVTVF9BR0VSRSxXT1JEUyksCisJREVCVUdfUkVDKENORkRFRkFVTFRLRVkyLEJZVEVTKSwKKwlERUJVR19SRUMoQ05GREVGQVVMVEtFWTMsQllURVMpLAorCURFQlVHX1JFQyhDTkZXRVBGTEFHU19JTlRFUlNJTCxXT1JEUyksCisJREVCVUdfUkVDKENORldFUEtFWU1BUFBJTkdUQUJMRSxXT1JEUyksCisJREVCVUdfUkVDKENORkFVVEhFTlRJQ0FUSU9OLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GTUFYQVNTT0NTVEEsV09SRFMpLAorCURFQlVHX1JFQyhDTkZLRVlMRU5HVEhfU1lNQk9MLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GVFhDT05UUk9MLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GUk9BTUlOR01PREUsV09SRFMpLAorCURFQlVHX1JFQyhDTkZIT1NUQVVUSEVOVElDQVRJT04sV09SRFMpLAorCURFQlVHX1JFQyhDTkZSQ1ZDUkNFUlJPUixXT1JEUyksCisJREVCVUdfUkVDKENORk1NTElGRSxXT1JEUyksCisJREVCVUdfUkVDKENORkFMVFJFVFJZQ09VTlQsV09SRFMpLAorCURFQlVHX1JFQyhDTkZCRUFDT05JTlQsV09SRFMpLAorCURFQlVHX1JFQyhDTkZBUFBDRklORk8sV09SRFMpLAorCURFQlVHX1JFQyhDTkZTVEFQQ0ZJTkZPLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GUFJJT1JJVFlRVVNBR0UsV09SRFMpLAorCURFQlVHX1JFQyhDTkZUSU1DVFJMLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GVEhJUlRZMlRBTExZLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GRU5IU0VDVVJJVFksV09SRFMpLAorCURFQlVHX1JFQyhDTkZHUk9VUEFERFJFU1NFUyxCWVRFUyksCisJREVCVUdfUkVDKENORkNSRUFURUlCU1MsV09SRFMpLAorCURFQlVHX1JFQyhDTkZGUkFHTUVOVEFUSU9OVEhSRVNIT0xELFdPUkRTKSwKKwlERUJVR19SRUMoQ05GUlRTVEhSRVNIT0xELFdPUkRTKSwKKwlERUJVR19SRUMoQ05GVFhSQVRFQ09OVFJPTCxXT1JEUyksCisJREVCVUdfUkVDKENORlBST01JU0NVT1VTTU9ERSxXT1JEUyksCisJREVCVUdfUkVDKENORkJBU0lDUkFURVNfU1lNQk9MLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GUFJFQU1CTEVfU1lNQk9MLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GU0hPUlRQUkVBTUJMRSxXT1JEUyksCisJREVCVUdfUkVDKENORldFUEtFWVNfQUdFUkUsQllURVMpLAorCURFQlVHX1JFQyhDTkZFWENMVURFTE9OR1BSRUFNQkxFLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GVFhLRVlfQUdFUkUsV09SRFMpLAorCURFQlVHX1JFQyhDTkZBVVRIRU5USUNBVElPTlJTUFRPLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GQkFTSUNSQVRFUyxXT1JEUyksCisJREVCVUdfUkVDKENORlNVUFBPUlRFRFJBVEVTLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GVElDS1RJTUUsV09SRFMpLAorCURFQlVHX1JFQyhDTkZTQ0FOUkVRVUVTVCxXT1JEUyksCisJREVCVUdfUkVDKENORkpPSU5SRVFVRVNULFdPUkRTKSwKKwlERUJVR19SRUMoQ05GQVVUSEVOVElDQVRFU1RBVElPTixXT1JEUyksCisJREVCVUdfUkVDKENORkNIQU5ORUxJTkZPUkVRVUVTVCxXT1JEUyksCisJREVCVUdfUkVDKE1BWExPQURUSU1FLFdPUkRTKSwKKwlERUJVR19SRUMoRE9XTkxPQURCVUZGRVIsV09SRFMpLAorCURFQlVHX1JFQyhQUklJRCxXT1JEUyksCisJREVCVUdfUkVDKFBSSVNVUFJBTkdFLFdPUkRTKSwKKwlERUJVR19SRUMoQ0ZJQUNUUkFOR0VTLFdPUkRTKSwKKwlERUJVR19SRUMoTklDU0VSTlVNLFhTVFJJTkcpLAorCURFQlVHX1JFQyhOSUNJRCxXT1JEUyksCisJREVCVUdfUkVDKE1GSVNVUFJBTkdFLFdPUkRTKSwKKwlERUJVR19SRUMoQ0ZJU1VQUkFOR0UsV09SRFMpLAorCURFQlVHX1JFQyhDSEFOTkVMTElTVCxXT1JEUyksCisJREVCVUdfUkVDKFJFR1VMQVRPUllET01BSU5TLFdPUkRTKSwKKwlERUJVR19SRUMoVEVNUFRZUEUsV09SRFMpLAorLyogIAlERUJVR19SRUMoQ0lTLEJZVEVTKSwgKi8KKwlERUJVR19SRUMoU1RBSUQsV09SRFMpLAorCURFQlVHX1JFQyhDVVJSRU5UU1NJRCxTVFJJTkcpLAorCURFQlVHX1JFQyhDVVJSRU5UQlNTSUQsQllURVMpLAorCURFQlVHX1JFQyhDT01NU1FVQUxJVFksV09SRFMpLAorCURFQlVHX1JFQyhDVVJSRU5UVFhSQVRFLFdPUkRTKSwKKwlERUJVR19SRUMoQ1VSUkVOVEJFQUNPTklOVEVSVkFMLFdPUkRTKSwKKwlERUJVR19SRUMoQ1VSUkVOVFNDQUxFVEhSRVNIT0xEUyxXT1JEUyksCisJREVCVUdfUkVDKFBST1RPQ09MUlNQVElNRSxXT1JEUyksCisJREVCVUdfUkVDKFNIT1JUUkVUUllMSU1JVCxXT1JEUyksCisJREVCVUdfUkVDKExPTkdSRVRSWUxJTUlULFdPUkRTKSwKKwlERUJVR19SRUMoTUFYVFJBTlNNSVRMSUZFVElNRSxXT1JEUyksCisJREVCVUdfUkVDKE1BWFJFQ0VJVkVMSUZFVElNRSxXT1JEUyksCisJREVCVUdfUkVDKENGUE9MTEFCTEUsV09SRFMpLAorCURFQlVHX1JFQyhBVVRIRU5USUNBVElPTkFMR09SSVRITVMsV09SRFMpLAorCURFQlVHX1JFQyhQUklWQUNZT1BUSU9OSU1QTEVNRU5URUQsV09SRFMpLAorCURFQlVHX1JFQyhPV05NQUNBRERSLEJZVEVTKSwKKwlERUJVR19SRUMoU0NBTlJFU1VMVFNUQUJMRSxXT1JEUyksCisJREVCVUdfUkVDKFBIWVRZUEUsV09SRFMpLAorCURFQlVHX1JFQyhDVVJSRU5UQ0hBTk5FTCxXT1JEUyksCisJREVCVUdfUkVDKENVUlJFTlRQT1dFUlNUQVRFLFdPUkRTKSwKKwlERUJVR19SRUMoQ0NBTU9ERSxXT1JEUyksCisJREVCVUdfUkVDKFNVUFBPUlRFRERBVEFSQVRFUyxXT1JEUyksCisJREVCVUdfUkVDKEJVSUxEU0VRLEJZVEVTKSwKKwlERUJVR19SRUMoRldJRCxYU1RSSU5HKQorI3VuZGVmIERFQlVHX1JFQworfTsKKworI2RlZmluZSBERUJVR19MVFZfU0laRQkJMTI4CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19kZWJ1Z19kdW1wX3JlY3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJdTggKnZhbDg7CisJdTE2ICp2YWwxNjsKKwlpbnQgaSxqOworCXUxNiBsZW5ndGg7CisJaW50IGVycjsKKworCS8qIEknbSBub3Qgc3VyZTogd2UgbWlnaHQgaGF2ZSBhIGxvY2sgaGVyZSwgc28gd2UnZCBiZXR0ZXIgZ28KKyAgICAgICAgICAgYXRvbWljLCBqdXN0IGluIGNhc2UuICovCisJdmFsOCA9IGttYWxsb2MoREVCVUdfTFRWX1NJWkUgKyAyLCBHRlBfQVRPTUlDKTsKKwlpZiAoISB2YWw4KQorCQlyZXR1cm4gLUVOT01FTTsKKwl2YWwxNiA9ICh1MTYgKil2YWw4OworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmVjb3JkX3RhYmxlKTsgaSsrKSB7CisJCXUxNiByaWQgPSByZWNvcmRfdGFibGVbaV0ucmlkOworCQlpbnQgbGVuOworCisJCW1lbXNldCh2YWw4LCAwLCBERUJVR19MVFZfU0laRSArIDIpOworCisJCWVyciA9IGhlcm1lc19yZWFkX2x0dihodywgVVNFUl9CQVAsIHJpZCwgREVCVUdfTFRWX1NJWkUsCisJCQkJICAgICAgJmxlbmd0aCwgdmFsOCk7CisJCWlmIChlcnIpIHsKKwkJCURFQlVHKDAsICJFcnJvciAlZCByZWFkaW5nIFJJRCAweCUwNHhcbiIsIGVyciwgcmlkKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXZhbDE2ID0gKHUxNiAqKXZhbDg7CisJCWlmIChsZW5ndGggPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXByaW50ayhLRVJOX0RFQlVHICIlLTE1cyAoMHglMDR4KTogbGVuZ3RoPSVkICglZCBieXRlcylcdHZhbHVlPSIsCisJCSAgICAgICByZWNvcmRfdGFibGVbaV0ubmFtZSwKKwkJICAgICAgIHJpZCwgbGVuZ3RoLCAobGVuZ3RoLTEpKjIpOworCQlsZW4gPSBtaW4oKChpbnQpbGVuZ3RoLTEpKjIsIERFQlVHX0xUVl9TSVpFKTsKKworCQlzd2l0Y2ggKHJlY29yZF90YWJsZVtpXS5kaXNwbGF5dHlwZSkgeworCQljYXNlIERJU1BMQVlfV09SRFM6CisJCQlmb3IgKGogPSAwOyBqIDwgbGVuIC8gMjsgaisrKQorCQkJCXByaW50aygiJTA0WC0iLCBsZTE2X3RvX2NwdSh2YWwxNltqXSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBESVNQTEFZX0JZVEVTOgorCQlkZWZhdWx0OgorCQkJZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKQorCQkJCXByaW50aygiJTAyWDoiLCB2YWw4W2pdKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRElTUExBWV9TVFJJTkc6CisJCQlsZW4gPSBtaW4obGVuLCBsZTE2X3RvX2NwdSh2YWwxNlswXSkrMik7CisJCQl2YWw4W2xlbl0gPSAnXDAnOworCQkJcHJpbnRrKCJcIiVzXCIiLCAoY2hhciAqKSZ2YWwxNlsxXSk7CisJCQlicmVhazsKKworCQljYXNlIERJU1BMQVlfWFNUUklORzoKKwkJCXByaW50aygiJyVzJyIsIChjaGFyICopdmFsOCk7CisJCX0KKworCQlwcmludGsoIlxuIik7CisJfQorCisJa2ZyZWUodmFsOCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGVidWdnaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgMAorc3RhdGljIHZvaWQgc2hvd19yeF9mcmFtZShzdHJ1Y3Qgb3Jpbm9jb19yeGZyYW1lX2hkciAqZnJhbWUpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgIlJYIGRlc2NyaXB0b3I6XG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBzdGF0dXMgICAgICA9IDB4JTA0eFxuIiwgZnJhbWUtPmRlc2Muc3RhdHVzKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICB0aW1lICAgICAgICA9IDB4JTA4eFxuIiwgZnJhbWUtPmRlc2MudGltZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgc2lsZW5jZSAgICAgPSAweCUwMnhcbiIsIGZyYW1lLT5kZXNjLnNpbGVuY2UpOworCXByaW50ayhLRVJOX0RFQlVHICIgIHNpZ25hbCAgICAgID0gMHglMDJ4XG4iLCBmcmFtZS0+ZGVzYy5zaWduYWwpOworCXByaW50ayhLRVJOX0RFQlVHICIgIHJhdGUgICAgICAgID0gMHglMDJ4XG4iLCBmcmFtZS0+ZGVzYy5yYXRlKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICByeGZsb3cgICAgICA9IDB4JTAyeFxuIiwgZnJhbWUtPmRlc2MucnhmbG93KTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICByZXNlcnZlZCAgICA9IDB4JTA4eFxuIiwgZnJhbWUtPmRlc2MucmVzZXJ2ZWQpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIklFRUUgODAyLjExIGhlYWRlcjpcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICIgIGZyYW1lX2N0bCAgID0gMHglMDR4XG4iLAorCSAgICAgICBmcmFtZS0+cDgwMjExLmZyYW1lX2N0bCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgZHVyYXRpb25faWQgPSAweCUwNHhcbiIsCisJICAgICAgIGZyYW1lLT5wODAyMTEuZHVyYXRpb25faWQpOworCXByaW50ayhLRVJOX0RFQlVHICIgIGFkZHIxICAgICAgID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJICAgICAgIGZyYW1lLT5wODAyMTEuYWRkcjFbMF0sIGZyYW1lLT5wODAyMTEuYWRkcjFbMV0sCisJICAgICAgIGZyYW1lLT5wODAyMTEuYWRkcjFbMl0sIGZyYW1lLT5wODAyMTEuYWRkcjFbM10sCisJICAgICAgIGZyYW1lLT5wODAyMTEuYWRkcjFbNF0sIGZyYW1lLT5wODAyMTEuYWRkcjFbNV0pOworCXByaW50ayhLRVJOX0RFQlVHICIgIGFkZHIyICAgICAgID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJICAgICAgIGZyYW1lLT5wODAyMTEuYWRkcjJbMF0sIGZyYW1lLT5wODAyMTEuYWRkcjJbMV0sCisJICAgICAgIGZyYW1lLT5wODAyMTEuYWRkcjJbMl0sIGZyYW1lLT5wODAyMTEuYWRkcjJbM10sCisJICAgICAgIGZyYW1lLT5wODAyMTEuYWRkcjJbNF0sIGZyYW1lLT5wODAyMTEuYWRkcjJbNV0pOworCXByaW50ayhLRVJOX0RFQlVHICIgIGFkZHIzICAgICAgID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJICAgICAgIGZyYW1lLT5wODAyMTEuYWRkcjNbMF0sIGZyYW1lLT5wODAyMTEuYWRkcjNbMV0sCisJICAgICAgIGZyYW1lLT5wODAyMTEuYWRkcjNbMl0sIGZyYW1lLT5wODAyMTEuYWRkcjNbM10sCisJICAgICAgIGZyYW1lLT5wODAyMTEuYWRkcjNbNF0sIGZyYW1lLT5wODAyMTEuYWRkcjNbNV0pOworCXByaW50ayhLRVJOX0RFQlVHICIgIHNlcV9jdGwgICAgID0gMHglMDR4XG4iLAorCSAgICAgICBmcmFtZS0+cDgwMjExLnNlcV9jdGwpOworCXByaW50ayhLRVJOX0RFQlVHICIgIGFkZHI0ICAgICAgID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJICAgICAgIGZyYW1lLT5wODAyMTEuYWRkcjRbMF0sIGZyYW1lLT5wODAyMTEuYWRkcjRbMV0sCisJICAgICAgIGZyYW1lLT5wODAyMTEuYWRkcjRbMl0sIGZyYW1lLT5wODAyMTEuYWRkcjRbM10sCisJICAgICAgIGZyYW1lLT5wODAyMTEuYWRkcjRbNF0sIGZyYW1lLT5wODAyMTEuYWRkcjRbNV0pOworCXByaW50ayhLRVJOX0RFQlVHICIgIGRhdGFfbGVuICAgID0gMHglMDR4XG4iLAorCSAgICAgICBmcmFtZS0+cDgwMjExLmRhdGFfbGVuKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJJRUVFIDgwMi4zIGhlYWRlcjpcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICIgIGRlc3QgICAgICAgID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJICAgICAgIGZyYW1lLT5wODAyMy5oX2Rlc3RbMF0sIGZyYW1lLT5wODAyMy5oX2Rlc3RbMV0sCisJICAgICAgIGZyYW1lLT5wODAyMy5oX2Rlc3RbMl0sIGZyYW1lLT5wODAyMy5oX2Rlc3RbM10sCisJICAgICAgIGZyYW1lLT5wODAyMy5oX2Rlc3RbNF0sIGZyYW1lLT5wODAyMy5oX2Rlc3RbNV0pOworCXByaW50ayhLRVJOX0RFQlVHICIgIHNyYyAgICAgICAgID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJICAgICAgIGZyYW1lLT5wODAyMy5oX3NvdXJjZVswXSwgZnJhbWUtPnA4MDIzLmhfc291cmNlWzFdLAorCSAgICAgICBmcmFtZS0+cDgwMjMuaF9zb3VyY2VbMl0sIGZyYW1lLT5wODAyMy5oX3NvdXJjZVszXSwKKwkgICAgICAgZnJhbWUtPnA4MDIzLmhfc291cmNlWzRdLCBmcmFtZS0+cDgwMjMuaF9zb3VyY2VbNV0pOworCXByaW50ayhLRVJOX0RFQlVHICIgIGxlbiAgICAgICAgID0gMHglMDR4XG4iLCBmcmFtZS0+cDgwMjMuaF9wcm90byk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiSUVFRSA4MDIuMiBMTEMvU05BUCBoZWFkZXI6XG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBEU0FQICAgICAgICA9IDB4JTAyeFxuIiwgZnJhbWUtPnA4MDIyLmRzYXApOworCXByaW50ayhLRVJOX0RFQlVHICIgIFNTQVAgICAgICAgID0gMHglMDJ4XG4iLCBmcmFtZS0+cDgwMjIuc3NhcCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgY3RybCAgICAgICAgPSAweCUwMnhcbiIsIGZyYW1lLT5wODAyMi5jdHJsKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBPVUkgICAgICAgICA9ICUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgICBmcmFtZS0+cDgwMjIub3VpWzBdLCBmcmFtZS0+cDgwMjIub3VpWzFdLCBmcmFtZS0+cDgwMjIub3VpWzJdKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBldGhlcnR5cGUgID0gMHglMDR4XG4iLCBmcmFtZS0+ZXRoZXJ0eXBlKTsKK30KKyNlbmRpZiAvKiAwICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1vZHVsZSBpbml0aWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworRVhQT1JUX1NZTUJPTChhbGxvY19vcmlub2NvZGV2KTsKK0VYUE9SVF9TWU1CT0woZnJlZV9vcmlub2NvZGV2KTsKKworRVhQT1JUX1NZTUJPTChfX29yaW5vY29fdXApOworRVhQT1JUX1NZTUJPTChfX29yaW5vY29fZG93bik7CitFWFBPUlRfU1lNQk9MKG9yaW5vY29fc3RvcCk7CitFWFBPUlRfU1lNQk9MKG9yaW5vY29fcmVpbml0X2Zpcm13YXJlKTsKKworRVhQT1JUX1NZTUJPTChvcmlub2NvX2ludGVycnVwdCk7CisKKy8qIENhbid0IGJlIGRlY2xhcmVkICJjb25zdCIgb3IgdGhlIHdob2xlIF9faW5pdGRhdGEgc2VjdGlvbiB3aWxsCisgKiBiZWNvbWUgY29uc3QgKi8KK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0gRFJJVkVSX05BTUUgIiAiIERSSVZFUl9WRVJTSU9OCisJIiAoRGF2aWQgR2lic29uIDxoZXJtZXNAZ2lic29uLmRyb3BiZWFyLmlkLmF1PiwgIgorCSJQYXZlbCBSb3NraW4gPHByb3NraUBnbnUub3JnPiwgZXQgYWwpIjsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9vcmlub2NvKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCB2ZXJzaW9uKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfb3Jpbm9jbyh2b2lkKQoreworfQorCittb2R1bGVfaW5pdChpbml0X29yaW5vY28pOworbW9kdWxlX2V4aXQoZXhpdF9vcmlub2NvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2U0MmMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5oCkBAIC0wLDAgKzEsMTUzIEBACisvKiBvcmlub2NvLmgKKyAqIAorICogQ29tbW9uIGRlZmluaXRpb25zIHRvIGFsbCBwaWVjZXMgb2YgdGhlIHZhcmlvdXMgb3Jpbm9jbworICogZHJpdmVycworICovCisKKyNpZm5kZWYgX09SSU5PQ09fSAorI2RlZmluZSBfT1JJTk9DT19ICisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMTRhbHBoYTIiCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJoZXJtZXMuaCIKKworLyogVG8gZW5hYmxlIGRlYnVnIG1lc3NhZ2VzICovCisvLyNkZWZpbmUgT1JJTk9DT19ERUJVRwkJMworCisjZGVmaW5lIFdJUkVMRVNTX1NQWQkJLy8gZW5hYmxlIGl3c3B5IHN1cHBvcnQKKworI2RlZmluZSBPUklOT0NPX01BWF9LRVlfU0laRQkxNAorI2RlZmluZSBPUklOT0NPX01BWF9LRVlTCTQKKworc3RydWN0IG9yaW5vY29fa2V5IHsKKwl1MTYgbGVuOwkvKiBhbHdheXMgc3RvcmVkIGFzIGxpdHRsZS1lbmRpYW4gKi8KKwljaGFyIGRhdGFbT1JJTk9DT19NQVhfS0VZX1NJWkVdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3R5cGVkZWYgZW51bSB7CisJRklSTVdBUkVfVFlQRV9BR0VSRSwKKwlGSVJNV0FSRV9UWVBFX0lOVEVSU0lMLAorCUZJUk1XQVJFX1RZUEVfU1lNQk9MCit9IGZ3dHlwZV90OworCitzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlIHsKKwl2b2lkICpjYXJkOwkvKiBQb2ludGVyIHRvIGNhcmQgZGVwZW5kZW50IHN0cnVjdHVyZSAqLworCWludCAoKmhhcmRfcmVzZXQpKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKik7CisKKwkvKiBTeW5jaHJvbmlzYXRpb24gc3R1ZmYgKi8KKwlzcGlubG9ja190IGxvY2s7CisJaW50IGh3X3VuYXZhaWxhYmxlOworCXN0cnVjdCB3b3JrX3N0cnVjdCByZXNldF93b3JrOworCisJLyogZHJpdmVyIHN0YXRlICovCisJaW50IG9wZW47CisJdTE2IGxhc3RfbGlua3N0YXR1czsKKworCS8qIE5ldCBkZXZpY2Ugc3R1ZmYgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyB3c3RhdHM7CisKKwkvKiBIYXJkd2FyZSBjb250cm9sIHZhcmlhYmxlcyAqLworCWhlcm1lc190IGh3OworCXUxNiB0eGZpZDsKKworCS8qIENhcGFiaWxpdGllcyBvZiB0aGUgaGFyZHdhcmUvZmlybXdhcmUgKi8KKwlmd3R5cGVfdCBmaXJtd2FyZV90eXBlOworCWNoYXIgZndfbmFtZVszMl07CisJaW50IGlic3NfcG9ydDsKKwlpbnQgbmljYnVmX3NpemU7CisJdTE2IGNoYW5uZWxfbWFzazsKKworCS8qIEJvb2xlYW4gY2FwYWJpbGl0aWVzICovCisJdW5zaWduZWQgaW50IGhhc19pYnNzOjE7CisJdW5zaWduZWQgaW50IGhhc19wb3J0MzoxOworCXVuc2lnbmVkIGludCBoYXNfd2VwOjE7CisJdW5zaWduZWQgaW50IGhhc19iaWdfd2VwOjE7CisJdW5zaWduZWQgaW50IGhhc19td286MTsKKwl1bnNpZ25lZCBpbnQgaGFzX3BtOjE7CisJdW5zaWduZWQgaW50IGhhc19wcmVhbWJsZToxOworCXVuc2lnbmVkIGludCBoYXNfc2Vuc2l0aXZpdHk6MTsKKwl1bnNpZ25lZCBpbnQgYnJva2VuX2Rpc2FibGVwb3J0OjE7CisKKwkvKiBDb25maWd1cmF0aW9uIHBhcmFtYXRlcnMgKi8KKwl1MzIgaXdfbW9kZTsKKwlpbnQgcHJlZmVyX3BvcnQzOworCXUxNiB3ZXBfb24sIHdlcF9yZXN0cmljdCwgdHhfa2V5OworCXN0cnVjdCBvcmlub2NvX2tleSBrZXlzW09SSU5PQ09fTUFYX0tFWVNdOworCWludCBiaXRyYXRlbW9kZTsKKyAJY2hhciBuaWNrW0lXX0VTU0lEX01BWF9TSVpFKzFdOworCWNoYXIgZGVzaXJlZF9lc3NpZFtJV19FU1NJRF9NQVhfU0laRSsxXTsKKwl1MTYgZnJhZ190aHJlc2gsIG13b19yb2J1c3Q7CisJdTE2IGNoYW5uZWw7CisJdTE2IGFwX2RlbnNpdHksIHJ0c190aHJlc2g7CisJdTE2IHBtX29uLCBwbV9tY2FzdCwgcG1fcGVyaW9kLCBwbV90aW1lb3V0OworCXUxNiBwcmVhbWJsZTsKKyNpZmRlZiBXSVJFTEVTU19TUFkKKwlpbnQJCQlzcHlfbnVtYmVyOworCXVfY2hhcgkJCXNweV9hZGRyZXNzW0lXX01BWF9TUFldW0VUSF9BTEVOXTsKKwlzdHJ1Y3QgaXdfcXVhbGl0eQlzcHlfc3RhdFtJV19NQVhfU1BZXTsKKyNlbmRpZgorCisJLyogQ29uZmlndXJhdGlvbiBkZXBlbmRlbnQgdmFyaWFibGVzICovCisJaW50IHBvcnRfdHlwZSwgY3JlYXRlaWJzczsKKwlpbnQgcHJvbWlzY3VvdXMsIG1jX2NvdW50OworfTsKKworI2lmZGVmIE9SSU5PQ09fREVCVUcKK2V4dGVybiBpbnQgb3Jpbm9jb19kZWJ1ZzsKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgZG8geyBpZiAob3Jpbm9jb19kZWJ1Zz4obikpIHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpOyB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYJLyogT1JJTk9DT19ERUJVRyAqLworCisjZGVmaW5lIFRSQUNFX0VOVEVSKGRldm5hbWUpIERFQlVHKDIsICIlczogLT4gJXMoKVxuIiwgZGV2bmFtZSwgX19GVU5DVElPTl9fKTsKKyNkZWZpbmUgVFJBQ0VfRVhJVChkZXZuYW1lKSAgREVCVUcoMiwgIiVzOiA8LSAlcygpXG4iLCBkZXZuYW1lLCBfX0ZVTkNUSU9OX18pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFeHBvcnRlZCBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2Nfb3Jpbm9jb2RldihpbnQgc2l6ZW9mX2NhcmQsCisJCQkJCSAgIGludCAoKmhhcmRfcmVzZXQpKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKikpOworZXh0ZXJuIHZvaWQgZnJlZV9vcmlub2NvZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBfX29yaW5vY29fdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IF9fb3Jpbm9jb19kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBvcmlub2NvX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IG9yaW5vY29fcmVpbml0X2Zpcm13YXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGlycXJldHVybl90IG9yaW5vY29faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKiBkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTG9ja2luZyBhbmQgc3luY2hyb25pemF0aW9uIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGVzZSBmdW5jdGlvbnMgKm11c3QqIGJlIGlubGluZSBvciB0aGV5IHdpbGwgYnJlYWsgaG9ycmlibHkgb24KKyAqIFNQQVJDLCBkdWUgdG8gaXRzIHdlaXJkIHNlbWFudGljcyBmb3Igc2F2ZS9yZXN0b3JlIGZsYWdzLiBleHRlcm4KKyAqIGlubGluZSBzaG91bGQgcHJldmVudCB0aGUga2VybmVsIGZyb20gbGlua2luZyBvciBtb2R1bGUgZnJvbQorICogbG9hZGluZyBpZiB0aGV5IGFyZSBub3QgaW5saW5lZC4gKi8KK2V4dGVybiBpbmxpbmUgaW50IG9yaW5vY29fbG9jayhzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2LAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCAqZmxhZ3MpOworCWlmIChwcml2LT5od191bmF2YWlsYWJsZSkgeworCQlERUJVRygxLCAib3Jpbm9jb19sb2NrKCkgY2FsbGVkIHdpdGggaHdfdW5hdmFpbGFibGUgKGRldj0lcClcbiIsCisJCSAgICAgICBwcml2LT5uZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgKmZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBpbmxpbmUgdm9pZCBvcmlub2NvX3VubG9jayhzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2LAorCQkJCSAgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgKmZsYWdzKTsKK30KKworI2VuZGlmIC8qIF9PUklOT0NPX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGE4MjI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19jcy5jCkBAIC0wLDAgKzEsNjM2IEBACisvKiBvcmlub2NvX2NzLmMgKGZvcm1lcmx5IGtub3duIGFzIGRsZHdkX2NzLmMpCisgKgorICogQSBkcml2ZXIgZm9yICJIZXJtZXMiIGNoaXBzZXQgYmFzZWQgUENNQ0lBIHdpcmVsZXNzIGFkYXB0b3JzLCBzdWNoCisgKiBhcyB0aGUgTHVjZW50IFdhdmVsYW5JRUVFL09yaW5vY28gY2FyZHMgYW5kIHRoZWlyIE9FTSAoQ2FibGV0cm9uLworICogRW50ZXJhU3lzIFJvYW1BYm91dCA4MDIuMTEsIEVMU0EgQWlybGFuY2VyLCBNZWxjbyBCdWZmYWxvIGFuZCBvdGhlcnMpLgorICogSXQgc2hvdWxkIGFsc28gYmUgdXNhYmxlIG9uIHZhcmlvdXMgUHJpc20gSUkgYmFzZWQgY2FyZHMgc3VjaCBhcyB0aGUKKyAqIExpbmtzeXMsIEQtTGluayBhbmQgRmFyYWxsb24gU2t5bGluZS4gSXQgc2hvdWxkIGFsc28gd29yayBvbiBTeW1ib2wKKyAqIGNhcmRzIHN1Y2ggYXMgdGhlIDNDb20gQWlyQ29ubmVjdCBhbmQgRXJpY3Nzb24gV0xBTi4KKyAqIAorICogQ29weXJpZ2h0IG5vdGljZSAmIHJlbGVhc2Ugbm90ZXMgaW4gZmlsZSBvcmlub2NvLmMKKyAqLworCisjZGVmaW5lIERSSVZFUl9OQU1FICJvcmlub2NvX2NzIgorI2RlZmluZSBQRlggRFJJVkVSX05BTUUgIjogIgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaWZkZWYgIF9fSU5fUENNQ0lBX1BBQ0tBR0VfXworI2luY2x1ZGUgPHBjbWNpYS9rX2NvbXBhdC5oPgorI2VuZGlmIC8qIF9fSU5fUENNQ0lBX1BBQ0tBR0VfXyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSAib3Jpbm9jby5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNb2R1bGUgc3R1ZmYJCQkJCQkJICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIEdpYnNvbiA8aGVybWVzQGdpYnNvbi5kcm9wYmVhci5pZC5hdT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBQQ01DSUEgTHVjZW50IE9yaW5vY28sIFByaXNtIElJIGJhc2VkIGFuZCBzaW1pbGFyIHdpcmVsZXNzIGNhcmRzIik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBNUEwvR1BMIik7CisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCisKKy8qIFNvbWUgRC1MaW5rIGNhcmRzIGhhdmUgYnVnZ3kgQ0lTLiBUaGV5IGRvIHdvcmsgYXQgNXYgcHJvcGVybHksIGJ1dAorICogZG9uJ3QgaGF2ZSBhbnkgQ0lTIGVudHJ5IGZvciBpdC4gVGhpcyB3b3JrYXJvdW5kIGl0Li4uICovCitzdGF0aWMgaW50IGlnbm9yZV9jaXNfdmNjOyAvKiA9IDAgKi8KK21vZHVsZV9wYXJhbShpZ25vcmVfY2lzX3ZjYywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaWdub3JlX2Npc192Y2MsICJBbGxvdyB2b2x0YWdlIG1pc21hdGNoIGJldHdlZW4gY2FyZCBhbmQgc29ja2V0Iik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1hZ2ljIGNvbnN0YW50cwkJCQkJCSAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhlIGRldl9pbmZvIHZhcmlhYmxlIGlzIHRoZSAia2V5IiB0aGF0IGlzIHVzZWQgdG8gbWF0Y2ggdXAgdGhpcworICogZGV2aWNlIGRyaXZlciB3aXRoIGFwcHJvcHJpYXRlIGNhcmRzLCB0aHJvdWdoIHRoZSBjYXJkCisgKiBjb25maWd1cmF0aW9uIGRhdGFiYXNlLgorICovCitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9IERSSVZFUl9OQU1FOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEYXRhIHN0cnVjdHVyZXMJCQkJCQkgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUENNQ0lBIHNwZWNpZmljIGRldmljZSBpbmZvcm1hdGlvbiAoZ29lcyBpbiB0aGUgY2FyZCBmaWVsZCBvZgorICogc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqLworc3RydWN0IG9yaW5vY29fcGNjYXJkIHsKKwlkZXZfbGlua190IGxpbms7CisJZGV2X25vZGVfdCBub2RlOworCisJLyogVXNlZCB0byBoYW5kbGUgaGFyZCByZXNldCAqLworCS8qIHl1Y2ssIHdlIG5lZWQgdGhpcyBoYWNrIHRvIHdvcmsgYXJvdW5kIHRoZSBpbnNhbml0eSBvZiB0aGUKKyAgICAgICAgICogUENNQ0lBIGxheWVyICovCisJdW5zaWduZWQgbG9uZyBoYXJkX3Jlc2V0X2luX3Byb2dyZXNzOyAKK307CisKKy8qCisgKiBBIGxpbmtlZCBsaXN0IG9mICJpbnN0YW5jZXMiIG9mIHRoZSBkZXZpY2UuICBFYWNoIGFjdHVhbCBQQ01DSUEKKyAqIGNhcmQgY29ycmVzcG9uZHMgdG8gb25lIGRldmljZSBpbnN0YW5jZSwgYW5kIGlzIGRlc2NyaWJlZCBieSBvbmUKKyAqIGRldl9saW5rX3Qgc3RydWN0dXJlIChkZWZpbmVkIGluIGRzLmgpLgorICovCitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3Q7IC8qID0gTlVMTCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzCQkJCQkJICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGRldmljZSBtZXRob2RzICovCitzdGF0aWMgaW50IG9yaW5vY29fY3NfaGFyZF9yZXNldChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KTsKKworLyogUENNQ0lBIGd1bXBmICovCitzdGF0aWMgdm9pZCBvcmlub2NvX2NzX2NvbmZpZyhkZXZfbGlua190ICogbGluayk7CitzdGF0aWMgdm9pZCBvcmlub2NvX2NzX3JlbGVhc2UoZGV2X2xpbmtfdCAqIGxpbmspOworc3RhdGljIGludCBvcmlub2NvX2NzX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJCSAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKiBhcmdzKTsKKworc3RhdGljIGRldl9saW5rX3QgKm9yaW5vY29fY3NfYXR0YWNoKHZvaWQpOworc3RhdGljIHZvaWQgb3Jpbm9jb19jc19kZXRhY2goZGV2X2xpbmtfdCAqKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGV2aWNlIG1ldGhvZHMgICAgIAkJCQkJCSAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50Citvcmlub2NvX2NzX2hhcmRfcmVzZXQoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wY2NhcmQgKmNhcmQgPSBwcml2LT5jYXJkOworCWRldl9saW5rX3QgKmxpbmsgPSAmY2FyZC0+bGluazsKKwlpbnQgZXJyOworCisJLyogV2UgbmVlZCBhdG9taWMgb3BzIGhlcmUsIGJlY2F1c2Ugd2UncmUgbm90IGhvbGRpbmcgdGhlIGxvY2sgKi8KKwlzZXRfYml0KDAsICZjYXJkLT5oYXJkX3Jlc2V0X2luX3Byb2dyZXNzKTsKKworCWVyciA9IHBjbWNpYV9yZXNldF9jYXJkKGxpbmstPmhhbmRsZSwgTlVMTCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW1zbGVlcCgxMDApOworCWNsZWFyX2JpdCgwLCAmY2FyZC0+aGFyZF9yZXNldF9pbl9wcm9ncmVzcyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUENNQ0lBIHN0dWZmICAgICAJCQkJCQkgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoaXMgY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcgbG9jYWwgZGF0YQorICogc3RydWN0dXJlcyBmb3Igb25lIGRldmljZS4gIFRoZSBkZXZpY2UgaXMgcmVnaXN0ZXJlZCB3aXRoIENhcmQKKyAqIFNlcnZpY2VzLgorICogCisgKiBUaGUgZGV2X2xpbmsgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkKKyAqIGNvbmZpZ3VyZSB0aGUgY2FyZCBhdCB0aGlzIHBvaW50IC0tIHdlIHdhaXQgdW50aWwgd2UgcmVjZWl2ZSBhIGNhcmQKKyAqIGluc2VydGlvbiBldmVudC4gICovCitzdGF0aWMgZGV2X2xpbmtfdCAqCitvcmlub2NvX2NzX2F0dGFjaCh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdjsKKwlzdHJ1Y3Qgb3Jpbm9jb19wY2NhcmQgKmNhcmQ7CisJZGV2X2xpbmtfdCAqbGluazsKKwljbGllbnRfcmVnX3QgY2xpZW50X3JlZzsKKwlpbnQgcmV0OworCisJZGV2ID0gYWxsb2Nfb3Jpbm9jb2RldihzaXplb2YoKmNhcmQpLCBvcmlub2NvX2NzX2hhcmRfcmVzZXQpOworCWlmICghIGRldikKKwkJcmV0dXJuIE5VTEw7CisJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJY2FyZCA9IHByaXYtPmNhcmQ7CisKKwkvKiBMaW5rIGJvdGggc3RydWN0dXJlcyB0b2dldGhlciAqLworCWxpbmsgPSAmY2FyZC0+bGluazsKKwlsaW5rLT5wcml2ID0gZGV2OworCisJLyogSW50ZXJydXB0IHNldHVwICovCisJbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfSEFORExFX1BSRVNFTlQ7CisJbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOworCWxpbmstPmlycS5IYW5kbGVyID0gb3Jpbm9jb19pbnRlcnJ1cHQ7CisJbGluay0+aXJxLkluc3RhbmNlID0gZGV2OyAKKworCS8qIEdlbmVyYWwgc29ja2V0IGNvbmZpZ3VyYXRpb24gZGVmYXVsdHMgY2FuIGdvIGhlcmUuICBJbiB0aGlzCisJICogY2xpZW50LCB3ZSBhc3N1bWUgdmVyeSBsaXR0bGUsIGFuZCByZWx5IG9uIHRoZSBDSVMgZm9yCisJICogYWxtb3N0IGV2ZXJ5dGhpbmcuICBJbiBtb3N0IGNsaWVudHMsIG1hbnkgZGV0YWlscyAoaS5lLiwKKwkgKiBudW1iZXIsIHNpemVzLCBhbmQgYXR0cmlidXRlcyBvZiBJTyB3aW5kb3dzKSBhcmUgZml4ZWQgYnkKKwkgKiB0aGUgbmF0dXJlIG9mIHRoZSBkZXZpY2UsIGFuZCBjYW4gYmUgaGFyZC13aXJlZCBoZXJlLiAqLworCWxpbmstPmNvbmYuQXR0cmlidXRlcyA9IDA7CisJbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisKKwkvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKwkvKiBGSVhNRTogbmVlZCBhIGxvY2s/ICovCisJbGluay0+bmV4dCA9IGRldl9saXN0OworCWRldl9saXN0ID0gbGluazsKKworCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisJY2xpZW50X3JlZy5FdmVudE1hc2sgPQorCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisJCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CisJY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJm9yaW5vY29fY3NfZXZlbnQ7CisJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOyAvKiBGSVhNRTogd2hhdCBkb2VzIHRoaXMgbWVhbj8gKi8KKwljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworCisJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisJaWYgKHJldCAhPSBDU19TVUNDRVNTKSB7CisJCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisJCW9yaW5vY29fY3NfZGV0YWNoKGxpbmspOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gbGluazsKK30JCQkJLyogb3Jpbm9jb19jc19hdHRhY2ggKi8KKworLyoKKyAqIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkIHdpdGgKKyAqIENhcmQgU2VydmljZXMuICBJZiBpdCBoYXMgYmVlbiByZWxlYXNlZCwgYWxsIGxvY2FsIGRhdGEgc3RydWN0dXJlcworICogYXJlIGZyZWVkLiAgT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGZyZWVkIHdoZW4gdGhlIGRldmljZQorICogaXMgcmVsZWFzZWQuCisgKi8KK3N0YXRpYyB2b2lkIG9yaW5vY29fY3NfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisJZGV2X2xpbmtfdCAqKmxpbmtwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCisJLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwlmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorCQlpZiAoKmxpbmtwID09IGxpbmspCisJCQlicmVhazsKKworCUJVR19PTigqbGlua3AgPT0gTlVMTCk7CisKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCQlvcmlub2NvX2NzX3JlbGVhc2UobGluayk7CisKKwkvKiBCcmVhayB0aGUgbGluayB3aXRoIENhcmQgU2VydmljZXMgKi8KKwlpZiAobGluay0+aGFuZGxlKQorCQlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKworCS8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBhbmQgZnJlZSBpdCAqLworCSpsaW5rcCA9IGxpbmstPm5leHQ7CisJREVCVUcoMCwgUEZYICJkZXRhY2g6IGxpbms9JXAgbGluay0+ZGV2PSVwXG4iLCBsaW5rLCBsaW5rLT5kZXYpOworCWlmIChsaW5rLT5kZXYpIHsKKwkJREVCVUcoMCwgUEZYICJBYm91dCB0byB1bnJlZ2lzdGVyIG5ldCBkZXZpY2UgJXBcbiIsCisJCSAgICAgIGRldik7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJfQorCWZyZWVfb3Jpbm9jb2RldihkZXYpOworfQkJCQkvKiBvcmlub2NvX2NzX2RldGFjaCAqLworCisvKgorICogb3Jpbm9jb19jc19jb25maWcoKSBpcyBzY2hlZHVsZWQgdG8gcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04KKyAqIGV2ZW50IGlzIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZQorICogZGV2aWNlIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtLgorICovCisKKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgZG8geyBcCisJCWxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyBcCisJfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQKK29yaW5vY29fY3NfY29uZmlnKGRldl9saW5rX3QgKmxpbmspCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisJY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgb3Jpbm9jb19wY2NhcmQgKmNhcmQgPSBwcml2LT5jYXJkOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgbGFzdF9mbiwgbGFzdF9yZXQ7CisJdV9jaGFyIGJ1Zls2NF07CisJY29uZmlnX2luZm9fdCBjb25mOworCWNpc2luZm9fdCBpbmZvOworCXR1cGxlX3QgdHVwbGU7CisJY2lzcGFyc2VfdCBwYXJzZTsKKwl2b2lkIF9faW9tZW0gKm1lbTsKKworCUNTX0NIRUNLKFZhbGlkYXRlQ0lTLCBwY21jaWFfdmFsaWRhdGVfY2lzKGhhbmRsZSwgJmluZm8pKTsKKworCS8qCisJICogVGhpcyByZWFkcyB0aGUgY2FyZCdzIENPTkZJRyB0dXBsZSB0byBmaW5kIGl0cworCSAqIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLgorCSAqLworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisJdHVwbGUuQXR0cmlidXRlcyA9IDA7CisJdHVwbGUuVHVwbGVEYXRhID0gYnVmOworCXR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOworCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKwlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKwlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOworCWxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKworCS8qIENvbmZpZ3VyZSBjYXJkICovCisJbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKworCS8qIExvb2sgdXAgdGhlIGN1cnJlbnQgVmNjICovCisJQ1NfQ0hFQ0soR2V0Q29uZmlndXJhdGlvbkluZm8sCisJCSBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhoYW5kbGUsICZjb25mKSk7CisJbGluay0+Y29uZi5WY2MgPSBjb25mLlZjYzsKKworCS8qCisJICogSW4gdGhpcyBsb29wLCB3ZSBzY2FuIHRoZSBDSVMgZm9yIGNvbmZpZ3VyYXRpb24gdGFibGUKKwkgKiBlbnRyaWVzLCBlYWNoIG9mIHdoaWNoIGRlc2NyaWJlcyBhIHZhbGlkIGNhcmQKKwkgKiBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcgdm9sdGFnZSwgSU8gd2luZG93LCBtZW1vcnkgd2luZG93LAorCSAqIGFuZCBpbnRlcnJ1cHQgc2V0dGluZ3MuCisJICoKKwkgKiBXZSBtYWtlIG5vIGFzc3VtcHRpb25zIGFib3V0IHRoZSBjYXJkIHRvIGJlIGNvbmZpZ3VyZWQ6IHdlCisJICogdXNlIGp1c3QgdGhlIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBpbiB0aGUgQ0lTLiAgSW4gYW4gaWRlYWwKKwkgKiB3b3JsZCwgdGhpcyB3b3VsZCB3b3JrIGZvciBhbnkgUENNQ0lBIGNhcmQsIGJ1dCBpdCByZXF1aXJlcworCSAqIGEgY29tcGxldGUgYW5kIGFjY3VyYXRlIENJUy4gIEluIHByYWN0aWNlLCBhIGRyaXZlciB1c3VhbGx5CisJICogImtub3dzIiBtb3N0IG9mIHRoZXNlIHRoaW5ncyB3aXRob3V0IGNvbnN1bHRpbmcgdGhlIENJUywKKwkgKiBhbmQgbW9zdCBjbGllbnQgZHJpdmVycyB3aWxsIG9ubHkgdXNlIHRoZSBDSVMgdG8gZmlsbCBpbgorCSAqIGltcGxlbWVudGF0aW9uLWRlZmluZWQgZGV0YWlscy4KKwkgKi8KKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKKwlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJd2hpbGUgKDEpIHsKKwkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2ZnID0gJihwYXJzZS5jZnRhYmxlX2VudHJ5KTsKKwkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCBkZmx0ID0geyAuaW5kZXggPSAwIH07CisKKwkJaWYgKCAocGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSAhPSAwKQorCQkgICAgfHwgKHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSAhPSAwKSkKKwkJCWdvdG8gbmV4dF9lbnRyeTsKKworCQlpZiAoY2ZnLT5mbGFncyAmIENJU1RQTF9DRlRBQkxFX0RFRkFVTFQpCisJCQlkZmx0ID0gKmNmZzsKKwkJaWYgKGNmZy0+aW5kZXggPT0gMCkKKwkJCWdvdG8gbmV4dF9lbnRyeTsKKwkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXg7CisKKwkJLyogRG9lcyB0aGlzIGNhcmQgbmVlZCBhdWRpbyBvdXRwdXQ/ICovCisJCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfQVVESU8pIHsKKwkJCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9TUEtSOworCQkJbGluay0+Y29uZi5TdGF0dXMgPSBDQ1NSX0FVRElPX0VOQTsKKwkJfQorCisJCS8qIFVzZSBwb3dlciBzZXR0aW5ncyBmb3IgVmNjIGFuZCBWcHAgaWYgcHJlc2VudCAqLworCQkvKiBOb3RlIHRoYXQgdGhlIENJUyB2YWx1ZXMgbmVlZCB0byBiZSByZXNjYWxlZCAqLworCQlpZiAoY2ZnLT52Y2MucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkgeworCQkJaWYgKGNvbmYuVmNjICE9IGNmZy0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwKSB7CisJCQkJREVCVUcoMiwgIm9yaW5vY29fY3NfY29uZmlnOiBWY2MgbWlzbWF0Y2ggKGNvbmYuVmNjID0gJWQsIENJUyA9ICVkKVxuIiwgIGNvbmYuVmNjLCBjZmctPnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMCk7CisJCQkJaWYgKCFpZ25vcmVfY2lzX3ZjYykKKwkJCQkJZ290byBuZXh0X2VudHJ5OworCQkJfQorCQl9IGVsc2UgaWYgKGRmbHQudmNjLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpIHsKKwkJCWlmIChjb25mLlZjYyAhPSBkZmx0LnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMCkgeworCQkJCURFQlVHKDIsICJvcmlub2NvX2NzX2NvbmZpZzogVmNjIG1pc21hdGNoIChjb25mLlZjYyA9ICVkLCBDSVMgPSAlZClcbiIsICBjb25mLlZjYywgZGZsdC52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDApOworCQkJCWlmKCFpZ25vcmVfY2lzX3ZjYykKKwkJCQkJZ290byBuZXh0X2VudHJ5OworCQkJfQorCQl9CisKKwkJaWYgKGNmZy0+dnBwMS5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKQorCQkJbGluay0+Y29uZi5WcHAxID0gbGluay0+Y29uZi5WcHAyID0KKwkJCSAgICBjZmctPnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDA7CisJCWVsc2UgaWYgKGRmbHQudnBwMS5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKQorCQkJbGluay0+Y29uZi5WcHAxID0gbGluay0+Y29uZi5WcHAyID0KKwkJCSAgICBkZmx0LnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDA7CisJCQorCQkvKiBEbyB3ZSBuZWVkIHRvIGFsbG9jYXRlIGFuIGludGVycnVwdD8gKi8KKwkJbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKKworCQkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KKwkJbGluay0+aW8uTnVtUG9ydHMxID0gbGluay0+aW8uTnVtUG9ydHMyID0gMDsKKwkJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC5pby5ud2luID4gMCkpIHsKKwkJCWNpc3RwbF9pb190ICppbyA9CisJCQkgICAgKGNmZy0+aW8ubndpbikgPyAmY2ZnLT5pbyA6ICZkZmx0LmlvOworCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKKwkJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT184QklUKSkKKwkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9CisJCQkJICAgIElPX0RBVEFfUEFUSF9XSURUSF8xNjsKKwkJCWlmICghKGlvLT5mbGFncyAmIENJU1RQTF9JT18xNkJJVCkpCisJCQkJbGluay0+aW8uQXR0cmlidXRlczEgPQorCQkJCSAgICBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwkJCWxpbmstPmlvLklPQWRkckxpbmVzID0KKwkJCSAgICBpby0+ZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKKwkJCWxpbmstPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5bMF0uYmFzZTsKKwkJCWxpbmstPmlvLk51bVBvcnRzMSA9IGlvLT53aW5bMF0ubGVuOworCQkJaWYgKGlvLT5ud2luID4gMSkgeworCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMyID0KKwkJCQkgICAgbGluay0+aW8uQXR0cmlidXRlczE7CisJCQkJbGluay0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxXS5iYXNlOworCQkJCWxpbmstPmlvLk51bVBvcnRzMiA9IGlvLT53aW5bMV0ubGVuOworCQkJfQorCisJCQkvKiBUaGlzIHJlc2VydmVzIElPIHNwYWNlIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IGVuYWJsZSBpdCAqLworCQkJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKSAhPSAwKQorCQkJCWdvdG8gbmV4dF9lbnRyeTsKKwkJfQorCisKKwkJLyogSWYgd2UgZ290IHRoaXMgZmFyLCB3ZSdyZSBjb29sISAqLworCisJCWJyZWFrOworCQkKKwluZXh0X2VudHJ5OgorCQlpZiAobGluay0+aW8uTnVtUG9ydHMxKQorCQkJcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCQlsYXN0X3JldCA9IHBjbWNpYV9nZXRfbmV4dF90dXBsZShoYW5kbGUsICZ0dXBsZSk7CisJCWlmIChsYXN0X3JldCAgPT0gQ1NfTk9fTU9SRV9JVEVNUykgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiR2V0TmV4dFR1cGxlKCk6IE5vIG1hdGNoaW5nICIKKwkJCSAgICAgICAiQ0lTIGNvbmZpZ3VyYXRpb24uICBNYXliZSB5b3UgbmVlZCB0aGUgIgorCQkJICAgICAgICJpZ25vcmVfY2lzX3ZjYz0xIHBhcmFtZXRlci5cbiIpOworCQkJZ290byBjc19mYWlsZWQ7CisJCX0KKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIGFuIGludGVycnVwdCBsaW5lLiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgYXNzaWduCisJICogYSBoYW5kbGVyIHRvIHRoZSBpbnRlcnJ1cHQsIHVubGVzcyB0aGUgJ0hhbmRsZXInIG1lbWJlciBvZgorCSAqIHRoZSBpcnEgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLgorCSAqLworCUNTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpKTsKKworCS8qIFdlIGluaXRpYWxpemUgdGhlIGhlcm1lcyBzdHJ1Y3R1cmUgYmVmb3JlIGNvbXBsZXRpbmcgUENNQ0lBCisJICogY29uZmlndXJhdGlvbiBqdXN0IGluIGNhc2UgdGhlIGludGVycnVwdCBoYW5kbGVyIGdldHMKKwkgKiBjYWxsZWQuICovCisJbWVtID0gaW9wb3J0X21hcChsaW5rLT5pby5CYXNlUG9ydDEsIGxpbmstPmlvLk51bVBvcnRzMSk7CisJaWYgKCFtZW0pCisJCWdvdG8gY3NfZmFpbGVkOworCisJaGVybWVzX3N0cnVjdF9pbml0KGh3LCBtZW0sIEhFUk1FU18xNkJJVF9SRUdTUEFDSU5HKTsKKworCS8qCisJICogVGhpcyBhY3R1YWxseSBjb25maWd1cmVzIHRoZSBQQ01DSUEgc29ja2V0IC0tIHNldHRpbmcgdXAKKwkgKiB0aGUgSS9PIHdpbmRvd3MgYW5kIHRoZSBpbnRlcnJ1cHQgbWFwcGluZywgYW5kIHB1dHRpbmcgdGhlCisJICogY2FyZCBhbmQgaG9zdCBpbnRlcmZhY2UgaW50byAiTWVtb3J5IGFuZCBJTyIgbW9kZS4KKwkgKi8KKwlDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwKKwkJIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZikpOworCisJLyogT2ssIHdlIGhhdmUgdGhlIGNvbmZpZ3VyYXRpb24sIHByZXBhcmUgdG8gcmVnaXN0ZXIgdGhlIG5ldGRldiAqLworCWRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworCWRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwljYXJkLT5ub2RlLm1ham9yID0gY2FyZC0+bm9kZS5taW5vciA9IDA7CisKKwlTRVRfTkVUREVWX0RFVihkZXYsICZoYW5kbGVfdG9fZGV2KGhhbmRsZSkpOworCS8qIFRlbGwgdGhlIHN0YWNrIHdlIGV4aXN0ICovCisJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJLyogQXQgdGhpcyBwb2ludCwgdGhlIGRldl9ub2RlX3Qgc3RydWN0dXJlKHMpIG5lZWRzIHRvIGJlCisJICogaW5pdGlhbGl6ZWQgYW5kIGFycmFuZ2VkIGluIGEgbGlua2VkIGxpc3QgYXQgbGluay0+ZGV2LiAqLworCXN0cmNweShjYXJkLT5ub2RlLmRldl9uYW1lLCBkZXYtPm5hbWUpOworCWxpbmstPmRldiA9ICZjYXJkLT5ub2RlOyAvKiBsaW5rLT5kZXYgYmVpbmcgbm9uLU5VTEwgaXMgYWxzbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0X2RldmljZSBoYXMgYmVlbiByZWdpc3RlcmVkICovCisJbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKworCS8qIEZpbmFsbHksIHJlcG9ydCB3aGF0IHdlJ3ZlIGRvbmUgKi8KKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGluZGV4IDB4JTAyeDogVmNjICVkLiVkIiwKKwkgICAgICAgZGV2LT5uYW1lLCBsaW5rLT5jb25mLkNvbmZpZ0luZGV4LAorCSAgICAgICBsaW5rLT5jb25mLlZjYyAvIDEwLCBsaW5rLT5jb25mLlZjYyAlIDEwKTsKKwlpZiAobGluay0+Y29uZi5WcHAxKQorCQlwcmludGsoIiwgVnBwICVkLiVkIiwgbGluay0+Y29uZi5WcHAxIC8gMTAsCisJCSAgICAgICBsaW5rLT5jb25mLlZwcDEgJSAxMCk7CisJcHJpbnRrKCIsIGlycSAlZCIsIGxpbmstPmlycS5Bc3NpZ25lZElSUSk7CisJaWYgKGxpbmstPmlvLk51bVBvcnRzMSkKKwkJcHJpbnRrKCIsIGlvIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDEsCisJCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDEgKyBsaW5rLT5pby5OdW1Qb3J0czEgLSAxKTsKKwlpZiAobGluay0+aW8uTnVtUG9ydHMyKQorCQlwcmludGsoIiAmIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDIsCisJCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDIgKyBsaW5rLT5pby5OdW1Qb3J0czIgLSAxKTsKKwlwcmludGsoIlxuIik7CisKKwlyZXR1cm47CisKKyBjc19mYWlsZWQ6CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBsYXN0X2ZuLCBsYXN0X3JldCk7CisKKyBmYWlsZWQ6CisJb3Jpbm9jb19jc19yZWxlYXNlKGxpbmspOworfQkJCQkvKiBvcmlub2NvX2NzX2NvbmZpZyAqLworCisvKgorICogQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIG9yaW5vY29fY3NfcmVsZWFzZSgpIHdpbGwgdW5yZWdpc3RlciB0aGUKKyAqIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICogc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCisgKi8KK3N0YXRpYyB2b2lkCitvcmlub2NvX2NzX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogV2UncmUgY29tbWl0dGVkIHRvIHRha2luZyB0aGUgZGV2aWNlIGF3YXkgbm93LCBzbyBtYXJrIHRoZQorCSAqIGhhcmR3YXJlIGFzIHVuYXZhaWxhYmxlICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlwcml2LT5od191bmF2YWlsYWJsZSsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCS8qIERvbid0IGJvdGhlciBjaGVja2luZyB0byBzZWUgaWYgdGhlc2Ugc3VjY2VlZCBvciBub3QgKi8KKwlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJaWYgKGxpbmstPmlvLk51bVBvcnRzMSkKKwkJcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCWlmIChsaW5rLT5pcnEuQXNzaWduZWRJUlEpCisJCXBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworCWlmIChwcml2LT5ody5pb2Jhc2UpCisJCWlvcG9ydF91bm1hcChwcml2LT5ody5pb2Jhc2UpOworfQkJCQkvKiBvcmlub2NvX2NzX3JlbGVhc2UgKi8KKworLyoKKyAqIFRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiAgTW9zdGx5LCB0aGlzIHNjaGVkdWxlcyBvdGhlciBzdHVmZgorICogdG8gcnVuIGFmdGVyIGFuIGV2ZW50IGlzIHJlY2VpdmVkLgorICovCitzdGF0aWMgaW50Citvcmlub2NvX2NzX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJICAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqIGFyZ3MpCit7CisJZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBvcmlub2NvX3BjY2FyZCAqY2FyZCA9IHByaXYtPmNhcmQ7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKKwkJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQkJcHJpdi0+aHdfdW5hdmFpbGFibGUrKzsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisJCWxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOworCQlvcmlub2NvX2NzX2NvbmZpZyhsaW5rKTsKKwkJYnJlYWs7CisKKwljYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisJCWxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOworCQkvKiBGYWxsIHRocm91Z2guLi4gKi8KKwljYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorCQkvKiBNYXJrIHRoZSBkZXZpY2UgYXMgc3RvcHBlZCwgdG8gYmxvY2sgSU8gdW50aWwgbGF0ZXIgKi8KKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJLyogVGhpcyBpcyBwcm9iYWJseSByYWN5LCBidXQgSSBjYW4ndCB0aGluayBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBiZXR0ZXIgd2F5LCBzaG9ydCBvZiByZXdyaXRpbmcgdGhlIFBDTUNJQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIgdG8gbm90IHN1Y2sgOi0oICovCisJCQlpZiAoISB0ZXN0X2JpdCgwLCAmY2FyZC0+aGFyZF9yZXNldF9pbl9wcm9ncmVzcykpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJCQkJZXJyID0gX19vcmlub2NvX2Rvd24oZGV2KTsKKwkJCQlpZiAoZXJyKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogJXM6IEVycm9yICVkIGRvd25pbmcgaW50ZXJmYWNlXG4iLAorCQkJCQkgICAgICAgZGV2LT5uYW1lLAorCQkJCQkgICAgICAgZXZlbnQgPT0gQ1NfRVZFTlRfUE1fU1VTUEVORCA/ICJTVVNQRU5EIiA6ICJSRVNFVF9QSFlTSUNBTCIsCisJCQkJCSAgICAgICBlcnIpOworCQkJCQorCQkJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwkJCQlwcml2LT5od191bmF2YWlsYWJsZSsrOworCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQkJfQorCisJCQlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKwkJbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworCQkvKiBGYWxsIHRocm91Z2guLi4gKi8KKwljYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCS8qIEZJWE1FOiBzaG91bGQgd2UgZG91YmxlIGNoZWNrIHRoYXQgdGhpcyBpcworCQkJICogdGhlIHNhbWUgY2FyZCBhcyB3ZSBoYWQgYmVmb3JlICovCisJCQlwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworCisJCQlpZiAoISB0ZXN0X2JpdCgwLCAmY2FyZC0+aGFyZF9yZXNldF9pbl9wcm9ncmVzcykpIHsKKwkJCQllcnIgPSBvcmlub2NvX3JlaW5pdF9maXJtd2FyZShkZXYpOworCQkJCWlmIChlcnIpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgcmUtaW5pdGlhbGl6aW5nIGZpcm13YXJlXG4iLAorCQkJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJCQkKKwkJCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJCQkJcHJpdi0+aHdfdW5hdmFpbGFibGUtLTsKKwkJCQkKKwkJCQlpZiAocHJpdi0+b3BlbiAmJiAhIHByaXYtPmh3X3VuYXZhaWxhYmxlKSB7CisJCQkJCWVyciA9IF9fb3Jpbm9jb191cChkZXYpOworCQkJCQlpZiAoZXJyKQorCQkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgcmVzdGFydGluZyBjYXJkXG4iLAorCQkJCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJCQkJCisJCQkJfQorCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CQkJCS8qIG9yaW5vY29fY3NfZXZlbnQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTW9kdWxlIGluaXRpYWxpemF0aW9uCQkJCQkgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ2FuJ3QgYmUgZGVjbGFyZWQgImNvbnN0IiBvciB0aGUgd2hvbGUgX19pbml0ZGF0YSBzZWN0aW9uIHdpbGwKKyAqIGJlY29tZSBjb25zdCAqLworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPSBEUklWRVJfTkFNRSAiICIgRFJJVkVSX1ZFUlNJT04KKwkiIChEYXZpZCBHaWJzb24gPGhlcm1lc0BnaWJzb24uZHJvcGJlYXIuaWQuYXU+LCAiCisJIlBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+LCBldCBhbCkiOworCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgb3Jpbm9jb19kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9IERSSVZFUl9OQU1FLAorCX0sCisJLmF0dGFjaAkJPSBvcmlub2NvX2NzX2F0dGFjaCwKKwkuZGV0YWNoCQk9IG9yaW5vY29fY3NfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK2luaXRfb3Jpbm9jb19jcyh2b2lkKQoreworCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgdmVyc2lvbik7CisKKwlyZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmb3Jpbm9jb19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2V4aXRfb3Jpbm9jb19jcyh2b2lkKQoreworCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmb3Jpbm9jb19kcml2ZXIpOworCUJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9vcmlub2NvX2NzKTsKK21vZHVsZV9leGl0KGV4aXRfb3Jpbm9jb19jcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3BjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjMwZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19wY2kuYwpAQCAtMCwwICsxLDQxNyBAQAorLyogb3Jpbm9jb19wY2kuYworICogCisgKiBEcml2ZXIgZm9yIFByaXNtIElJIGRldmljZXMgdGhhdCBoYXZlIGEgZGlyZWN0IFBDSSBpbnRlcmZhY2UKKyAqIChpLmUuLCBub3QgaW4gYSBQY21jaWEgb3IgUExYIGJyaWRnZSkKKyAqCisgKiBTcGVjaWZpY2FsbHkgaGVyZSB3ZSdyZSB0YWxraW5nIGFib3V0IHRoZSBMaW5rc3lzIFdNUDExCisgKgorICogQ3VycmVudCBtYWludGFpbmVycyAoYXMgb2YgMjkgU2VwdGVtYmVyIDIwMDMpIGFyZToKKyAqIAlQYXZlbCBSb3NraW4gPHByb3NraSBBVCBnbnUub3JnPgorICogYW5kCURhdmlkIEdpYnNvbiA8aGVybWVzIEFUIGdpYnNvbi5kcm9wYmVhci5pZC5hdT4KKyAqCisgKiBTb21lIG9mIHRoaXMgY29kZSBpcyBib3Jyb3dlZCBmcm9tIG9yaW5vY29fcGx4LmMKKyAqCUNvcHlyaWdodCAoQykgMjAwMSBEYW5pZWwgQmFybG93IDxkYW4gQVQgdGVsZW50Lm5ldD4KKyAqIFNvbWUgb2YgdGhpcyBjb2RlIGlzICJpbnNwaXJlZCIgYnkgbGludXgtd2xhbi1uZy0wLjEuMTAsIGJ1dCBub3RoaW5nCisgKiBoYXMgYmVlbiBjb3BpZWQgZnJvbSBpdC4gbGludXgtd2xhbi1uZy0wLjEuMTAgaXMgb3JpZ2luYWxseSA6CisgKglDb3B5cmlnaHQgKEMpIDE5OTkgQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogVGhpcyBmaWxlIG9yaWdpbmFsbHkgd3JpdHRlbiBieToKKyAqCUNvcHlyaWdodCAoQykgMjAwMSBKZWFuIFRvdXJyaWxoZXMgPGp0IEFUIGhwbC5ocC5jb20+CisgKiBBbmQgaXMgbm93IG1haW50YWluZWQgYnk6CisgKgkoQykgQ29weXJpZ2h0IERhdmlkIEdpYnNvbiwgSUJNIENvcnAuIDIwMDItMjAwMy4KKyAqCisgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluCisgKiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZQorICogYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCisgKgorICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIgorICogYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZQorICogdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluCisgKiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUKKyAqIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCisgKiBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyCisgKiB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5CisgKiBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQKKyAqIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZQorICogcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCisgKiB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLgorICovCisKKy8qCisgKiBUaGVvcnkgb2Ygb3BlcmF0aW9uLi4uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBNYXliZSB5b3UgaGFkIGEgbG9vayBpbiBvcmlub2NvX3BseC4gV2VsbCwgdGhpcyBpcyB0b3RhbGx5IGRpZmZlcmVudC4uLgorICoKKyAqIFRoZSBjYXJkIGNvbnRhaW5zIG9ubHkgb25lIFBDSSByZWdpb24sIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgdXN1YWwKKyAqIGhlcm1lcyByZWdpc3RlcnMuCisgKgorICogVGhlIGRyaXZlciB3aWxsIG1lbW9yeSBtYXAgdGhpcyByZWdpb24gaW4gbm9ybWFsIG1lbW9yeS4gQmVjYXVzZQorICogdGhlIGhlcm1lcyByZWdpc3RlcnMgYXJlIG1hcHBlZCBpbiBub3JtYWwgbWVtb3J5IGFuZCBub3QgaW4gSVNBIEkvTworICogcG9zdCBzcGFjZSwgd2UgY2FuJ3QgdXNlIHRoZSB1c3VhbCBpbncvb3V0dyBtYWNyb3MgYW5kIHdlIG5lZWQgdG8KKyAqIHVzZSByZWFkdy93cml0ZXcuCisgKiBUaGlzIHNsaWdodCBkaWZmZXJlbmNlIGZvcmNlIHVzIHRvIGNvbXBpbGUgb3VyIG93biB2ZXJzaW9uIG9mCisgKiBoZXJtZXMuYyB3aXRoIHRoZSByZWdpc3RlciBhY2Nlc3MgbWFjcm8gY2hhbmdlZC4gVGhhdCdzIGEgYml0CisgKiBoYWNraXNoIGJ1dCB3b3JrcyBmaW5lLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgUENJIHJlZ2lvbiBpcyBwcmV0dHkgYmlnICg0SykuIFRoYXQncyBtdWNoIG1vcmUgdGhhbgorICogdGhlIHVzdWFsIHNldCBvZiBoZXJtZXMgcmVnaXN0ZXIgKDB4MCAtPiAweDNFKS4gSSd2ZSBnb3QgYSBzdHJvbmcKKyAqIHN1c3BpY2lvbiB0aGF0IHRoZSB3aG9sZSBtZW1vcnkgc3BhY2Ugb2YgdGhlIGFkYXB0ZXIgaXMgaW4gZmFjdCBpbgorICogdGhpcyByZWdpb24uIEFjY2Vzc2luZyBkaXJlY3RseSB0aGUgYWRhcHRlciBtZW1vcnkgaW5zdGVhZCBvZiBnb2luZworICogdGhyb3VnaCB0aGUgdXN1YWwgcmVnaXN0ZXIgd291bGQgc3BlZWQgdXAgc2lnbmlmaWNhbnRlbHkgdGhlCisgKiBvcGVyYXRpb25zLi4uCisgKgorICogRmluYWxseSwgdGhlIGNhcmQgbG9va3MgbGlrZSB0aGlzIDoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEJ1cyAgMCwgZGV2aWNlICAxNCwgZnVuY3Rpb24gIDA6CisgICAgTmV0d29yayBjb250cm9sbGVyOiBQQ0kgZGV2aWNlIDEyNjA6Mzg3MyAoSGFycmlzIFNlbWljb25kdWN0b3IpIChyZXYgMSkuCisgICAgICBJUlEgMTEuCisgICAgICBNYXN0ZXIgQ2FwYWJsZS4gIExhdGVuY3k9MjQ4LiAgCisgICAgICBQcmVmZXRjaGFibGUgMzIgYml0IG1lbW9yeSBhdCAweGZmYmNjMDAwIFsweGZmYmNjZmZmXS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswMDowZS4wIE5ldHdvcmsgY29udHJvbGxlcjogSGFycmlzIFNlbWljb25kdWN0b3I6IFVua25vd24gZGV2aWNlIDM4NzMgKHJldiAwMSkKKyAgICAgICAgU3Vic3lzdGVtOiBVbmtub3duIGRldmljZSAxNzM3OjM4NzQKKyAgICAgICAgQ29udHJvbDogSS9PKyBNZW0rIEJ1c01hc3RlcisgU3BlY0N5Y2xlLSBNZW1XSU5WLSBWR0FTbm9vcC0gUGFyRXJyLSBTdGVwcGluZy0gU0VSUi0gRmFzdEIyQi0KKyAgICAgICAgU3RhdHVzOiBDYXArIDY2TWh6LSBVREYtIEZhc3RCMkIrIFBhckVyci0gREVWU0VMPW1lZGl1bSA+VEFib3J0LSA8VEFib3J0LSA8TUFib3J0LSA+U0VSUi0gPFBFUlItCisgICAgICAgIExhdGVuY3k6IDI0OCBzZXQsIGNhY2hlIGxpbmUgc2l6ZSAwOAorICAgICAgICBJbnRlcnJ1cHQ6IHBpbiBBIHJvdXRlZCB0byBJUlEgMTEKKyAgICAgICAgUmVnaW9uIDA6IE1lbW9yeSBhdCBmZmJjYzAwMCAoMzItYml0LCBwcmVmZXRjaGFibGUpIFtzaXplPTRLXQorICAgICAgICBDYXBhYmlsaXRpZXM6IFtkY10gUG93ZXIgTWFuYWdlbWVudCB2ZXJzaW9uIDIKKyAgICAgICAgICAgICAgICBGbGFnczogUE1FQ2xrLSBBdXhQd3ItIERTSS0gRDErIEQyKyBQTUUrCisgICAgICAgICAgICAgICAgU3RhdHVzOiBEMCBQTUUtRW5hYmxlLSBEU2VsPTAgRFNjYWxlPTAgUE1FLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGF0J3MgYWxsLi4KKyAqCisgKiBKZWFuIElJCisgKi8KKworI2RlZmluZSBEUklWRVJfTkFNRSAib3Jpbm9jb19wY2kiCisjZGVmaW5lIFBGWCBEUklWRVJfTkFNRSAiOiAiCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgImhlcm1lcy5oIgorI2luY2x1ZGUgIm9yaW5vY28uaCIKKworLyogQWxsIHRoZSBtYWdpYyB0aGVyZSBpcyBmcm9tIHdsYW4tbmcgKi8KKy8qIE1hZ2ljIG9mZnNldCBvZiB0aGUgcmVzZXQgcmVnaXN0ZXIgb2YgdGhlIFBDSSBjYXJkICovCisjZGVmaW5lIEhFUk1FU19QQ0lfQ09SCQkoMHgyNikKKy8qIE1hZ2ljIGJpdG1hc2sgdG8gcmVzZXQgdGhlIGNhcmQgKi8KKyNkZWZpbmUgSEVSTUVTX1BDSV9DT1JfTUFTSwkoMHgwMDgwKQorLyogTWFnaWMgdGltZW91dHMgZm9yIGRvaW5nIHRoZSByZXNldC4KKyAqIFRob3NlIHRpbWVzIGFyZSBzdHJhaWdodCBmcm9tIHdsYW4tbmcsIGFuZCBpdCBpcyBjbGFpbWVkIHRoYXQgdGhleQorICogYXJlIG5lY2Vzc2FyeS4gQWxhbiB3aWxsIGtpbGwgbWUuIFRha2UgeW91ciB0aW1lIGFuZCBncmFiIGEgY29mZmVlLiAqLworI2RlZmluZSBIRVJNRVNfUENJX0NPUl9PTlQJKDI1MCkJCS8qIG1zICovCisjZGVmaW5lIEhFUk1FU19QQ0lfQ09SX09GRlQJKDUwMCkJCS8qIG1zICovCisjZGVmaW5lIEhFUk1FU19QQ0lfQ09SX0JVU1lUCSg1MDApCQkvKiBtcyAqLworCisvKiBPcmlub2NvIFBDSSBzcGVjaWZpYyBkYXRhICovCitzdHJ1Y3Qgb3Jpbm9jb19wY2lfY2FyZCB7CisJdm9pZCBfX2lvbWVtICpwY2lfaW9hZGRyOworfTsKKworLyoKKyAqIERvIGEgc29mdCByZXNldCBvZiB0aGUgUENJIGNhcmQgdXNpbmcgdGhlIENvbmZpZ3VyYXRpb24gT3B0aW9uIFJlZ2lzdGVyCisgKiBXZSBuZWVkIHRoaXMgdG8gZ2V0IGdvaW5nLi4uCisgKiBUaGlzIGlzIHRoZSBwYXJ0IG9mIHRoZSBjb2RlIHRoYXQgaXMgc3Ryb25nbHkgaW5zcGlyZWQgZnJvbSB3bGFuLW5nCisgKgorICogTm90ZSA6IFRoaXMgY29kZSBpcyBkb25lIHdpdGggaXJxIGVuYWJsZWQuIFRoaXMgbWVhbiB0aGF0IG1hbnkKKyAqIGludGVycnVwdHMgd2lsbCBvY2N1ciB3aGlsZSB3ZSBhcmUgdGhlcmUuIFRoaXMgaXMgd2h5IHdlIHVzZSB0aGUKKyAqIGppZmZpZXMgdG8gcmVndWxhdGUgdGltZSBpbnN0ZWFkIG9mIGEgc3RyYWlnaHQgbWRlbGF5KCkuIFVzdWFsbHkgd2UKKyAqIG5lZWQgb25seSBhcm91bmQgMjQ1IGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCB0byBkbyAyNTAgbXMgZGVsYXkuCisgKgorICogTm90ZSBiaXMgOiBEb24ndCB0cnkgdG8gYWNjZXNzIEhFUk1FU19DTUQgZHVyaW5nIHRoZSByZXNldCBwaGFzZS4KKyAqIEl0IGp1c3Qgd29uJ3Qgd29yayAhCisgKi8KK3N0YXRpYyBpbnQKK29yaW5vY29fcGNpX2Nvcl9yZXNldChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQoreworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwl1bnNpZ25lZCBsb25nCXRpbWVvdXQ7CisJdTE2CXJlZzsKKworCS8qIEFzc2VydCB0aGUgcmVzZXQgdW50aWwgdGhlIGNhcmQgbm90aWNlICovCisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIFBDSV9DT1IsIEhFUk1FU19QQ0lfQ09SX01BU0spOworCW1kZWxheShIRVJNRVNfUENJX0NPUl9PTlQpOworCisJLyogR2l2ZSB0aW1lIGZvciB0aGUgY2FyZCB0byByZWNvdmVyIGZyb20gdGhpcyBoYXJkIGVmZm9ydCAqLworCWhlcm1lc193cml0ZV9yZWduKGh3LCBQQ0lfQ09SLCAweDAwMDApOworCW1kZWxheShIRVJNRVNfUENJX0NPUl9PRkZUKTsKKworCS8qIFRoZSBjYXJkIGlzIHJlYWR5IHdoZW4gaXQncyBubyBsb25nZXIgYnVzeSAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgKEhFUk1FU19QQ0lfQ09SX0JVU1lUICogSFogLyAxMDAwKTsKKwlyZWcgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBDTUQpOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSAmJiAocmVnICYgSEVSTUVTX0NNRF9CVVNZKSkgeworCQltZGVsYXkoMSk7CisJCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIENNRCk7CisJfQorCisJLyogU3RpbGwgYnVzeT8gKi8KKwlpZiAocmVnICYgSEVSTUVTX0NNRF9CVVNZKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkJ1c3kgdGltZW91dFxuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogSW5pdGlhbGlzZSBhIGNhcmQuIE1vc3RseSBzaW1pbGFyIHRvIFBMWCBjb2RlLgorICovCitzdGF0aWMgaW50IG9yaW5vY29fcGNpX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBwY2lfaW9yYW5nZTsKKwl1MTYgX19pb21lbSAqcGNpX2lvYWRkciA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBwY2lfaW9sZW47CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IE5VTEw7CisJc3RydWN0IG9yaW5vY29fcGNpX2NhcmQgKmNhcmQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBlbmFibGUgUENJIGRldmljZVxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUklWRVJfTkFNRSk7CisJaWYgKGVyciAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlc1xuIik7CisJCWdvdG8gZmFpbF9yZXNvdXJjZXM7CisJfQorCisJLyogUmVzb3VyY2UgMCBpcyBtYXBwZWQgdG8gdGhlIGhlcm1lcyByZWdpc3RlcnMgKi8KKwlwY2lfaW9yYW5nZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlwY2lfaW9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOworCXBjaV9pb2FkZHIgPSBpb3JlbWFwKHBjaV9pb3JhbmdlLCBwY2lfaW9sZW4pOworCWlmICghcGNpX2lvcmFuZ2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IHJlbWFwIGhhcmR3YXJlIHJlZ2lzdGVyc1xuIik7CisJCWdvdG8gZmFpbF9tYXA7CisJfQorCisJLyogQWxsb2NhdGUgbmV0d29yayBkZXZpY2UgKi8KKwlkZXYgPSBhbGxvY19vcmlub2NvZGV2KHNpemVvZigqY2FyZCksIG9yaW5vY29fcGNpX2Nvcl9yZXNldCk7CisJaWYgKCEgZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9hbGxvYzsKKwl9CisKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljYXJkID0gcHJpdi0+Y2FyZDsKKwljYXJkLT5wY2lfaW9hZGRyID0gcGNpX2lvYWRkcjsKKwlkZXYtPm1lbV9zdGFydCA9IHBjaV9pb3JhbmdlOworCWRldi0+bWVtX2VuZCA9IHBjaV9pb3JhbmdlICsgcGNpX2lvbGVuIC0gMTsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWhlcm1lc19zdHJ1Y3RfaW5pdCgmcHJpdi0+aHcsIHBjaV9pb2FkZHIsIEhFUk1FU18zMkJJVF9SRUdTUEFDSU5HKTsKKworCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiRGV0ZWN0ZWQgZGV2aWNlICVzLCBtZW06MHglbHgtMHglbHgsIGlycSAlZFxuIiwKKwkgICAgICAgcGNpX25hbWUocGRldiksIGRldi0+bWVtX3N0YXJ0LCBkZXYtPm1lbV9lbmQsIHBkZXYtPmlycSk7CisKKwllcnIgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIG9yaW5vY29faW50ZXJydXB0LCBTQV9TSElSUSwKKwkJCSAgZGV2LT5uYW1lLCBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGFsbG9jYXRlIElSUSAlZFxuIiwgcGRldi0+aXJxKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIGZhaWxfaXJxOworCX0KKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKworCS8qIFBlcmZvcm0gYSBDT1IgcmVzZXQgdG8gc3RhcnQgdGhlIGNhcmQgKi8KKwllcnIgPSBvcmlub2NvX3BjaV9jb3JfcmVzZXQocHJpdik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJJbml0aWFsIHJlc2V0IGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkZhaWxlZCB0byByZWdpc3RlciBuZXQgZGV2aWNlXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJcmV0dXJuIDA7CisKKyBmYWlsOgorCWZyZWVfaXJxKHBkZXYtPmlycSwgZGV2KTsKKworIGZhaWxfaXJxOgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX29yaW5vY29kZXYoZGV2KTsKKworIGZhaWxfYWxsb2M6CisJaW91bm1hcChwY2lfaW9hZGRyKTsKKworIGZhaWxfbWFwOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKKyBmYWlsX3Jlc291cmNlczoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgb3Jpbm9jb19wY2lfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBvcmlub2NvX3BjaV9jYXJkICpjYXJkID0gcHJpdi0+Y2FyZDsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfb3Jpbm9jb2RldihkZXYpOworCWlvdW5tYXAoY2FyZC0+cGNpX2lvYWRkcik7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCQorCXByaW50ayhLRVJOX0RFQlVHICIlczogT3Jpbm9jby1QQ0kgZW50ZXJpbmcgc2xlZXAgbW9kZSAoc3RhdGU9JWQpXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHN0YXRlKTsKKworCWVyciA9IG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaHdfdW5hdmFpbGFibGUgb24gb3Jpbm9jb19wY2lfc3VzcGVuZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gX19vcmlub2NvX2Rvd24oZGV2KTsKKwlpZiAoZXJyKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogb3Jpbm9jb19wY2lfc3VzcGVuZCgpOiBFcnJvciAlZCBkb3duaW5nIGludGVyZmFjZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKwlwcml2LT5od191bmF2YWlsYWJsZSsrOworCQorCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIDMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBPcmlub2NvLVBDSSB3YWtpbmcgdXBcbiIsIGRldi0+bmFtZSk7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJZXJyID0gb3Jpbm9jb19yZWluaXRfZmlybXdhcmUoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHJlLWluaXRpYWxpemluZyBmaXJtd2FyZSBvbiBvcmlub2NvX3BjaV9yZXN1bWUoKVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCisJcHJpdi0+aHdfdW5hdmFpbGFibGUtLTsKKworCWlmIChwcml2LT5vcGVuICYmICghIHByaXYtPmh3X3VuYXZhaWxhYmxlKSkgeworCQllcnIgPSBfX29yaW5vY29fdXAoZGV2KTsKKwkJaWYgKGVycikKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHJlc3RhcnRpbmcgY2FyZCBvbiBvcmlub2NvX3BjaV9yZXN1bWUoKVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJfQorCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgb3Jpbm9jb19wY2lfcGNpX2lkX3RhYmxlW10gPSB7CisJLyogSW50ZXJzaWwgUHJpc20gMyAqLworCXsweDEyNjAsIDB4Mzg3MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAorCS8qIEludGVyc2lsIFByaXNtIDIuNSAqLworCXsweDEyNjAsIDB4Mzg3MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAorCS8qIFNhbXN1bmcgTWFnaWNMQU4gU1dMLTIyMTBQICovCisJezB4MTY3ZCwgMHhhMDAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sCisJezAsfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBvcmlub2NvX3BjaV9wY2lfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgb3Jpbm9jb19wY2lfZHJpdmVyID0geworCS5uYW1lCQk9IERSSVZFUl9OQU1FLAorCS5pZF90YWJsZQk9IG9yaW5vY29fcGNpX3BjaV9pZF90YWJsZSwKKwkucHJvYmUJCT0gb3Jpbm9jb19wY2lfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChvcmlub2NvX3BjaV9yZW1vdmVfb25lKSwKKwkuc3VzcGVuZAk9IG9yaW5vY29fcGNpX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBvcmlub2NvX3BjaV9yZXN1bWUsCit9OworCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9IERSSVZFUl9OQU1FICIgIiBEUklWRVJfVkVSU0lPTgorCSIgKFBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+LCIKKwkiIERhdmlkIEdpYnNvbiA8aGVybWVzQGdpYnNvbi5kcm9wYmVhci5pZC5hdT4gJiIKKwkiIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4pIjsKK01PRFVMRV9BVVRIT1IoIlBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+ICYgRGF2aWQgR2lic29uIDxoZXJtZXNAZ2lic29uLmRyb3BiZWFyLmlkLmF1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIHdpcmVsZXNzIExBTiBjYXJkcyB1c2luZyBkaXJlY3QgUENJIGludGVyZmFjZSIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTVBML0dQTCIpOworCitzdGF0aWMgaW50IF9faW5pdCBvcmlub2NvX3BjaV9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCB2ZXJzaW9uKTsKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZvcmlub2NvX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb3Jpbm9jb19wY2lfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmb3Jpbm9jb19wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQob3Jpbm9jb19wY2lfaW5pdCk7Cittb2R1bGVfZXhpdChvcmlub2NvX3BjaV9leGl0KTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fcGx4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3BseC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYjA1YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3BseC5jCkBAIC0wLDAgKzEsNDE5IEBACisvKiBvcmlub2NvX3BseC5jCisgKgorICogRHJpdmVyIGZvciBQcmlzbSBJSSBkZXZpY2VzIHdoaWNoIHdvdWxkIHVzdWFsbHkgYmUgZHJpdmVuIGJ5IG9yaW5vY29fY3MsCisgKiBidXQgYXJlIGNvbm5lY3RlZCB0byB0aGUgUENJIGJ1cyBieSBhIFBMWDkwNTIuCisgKgorICogQ3VycmVudCBtYWludGFpbmVycyAoYXMgb2YgMjkgU2VwdGVtYmVyIDIwMDMpIGFyZToKKyAqIAlQYXZlbCBSb3NraW4gPHByb3NraSBBVCBnbnUub3JnPgorICogYW5kCURhdmlkIEdpYnNvbiA8aGVybWVzIEFUIGdpYnNvbi5kcm9wYmVhci5pZC5hdT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IERhdmlkIEdpYnNvbiwgSUJNIENvcnAuIDIwMDEtMjAwMy4KKyAqIENvcHlyaWdodCAoQykgMjAwMSBEYW5pZWwgQmFybG93CisgKgorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbgorICogY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworICoKKyAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIKKyAqIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUKKyAqIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpLCBpbgorICogd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlCisgKiBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQorICogb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91cgorICogdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieQorICogZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kCisgKiBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuICBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUKKyAqIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQorICogdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KKworICogQ2F1dGlvbjogdGhpcyBpcyBleHBlcmltZW50YWwgYW5kIHByb2JhYmx5IGJ1Z2d5LiAgRm9yIHN1Y2Nlc3MgYW5kCisgKiBmYWlsdXJlIHJlcG9ydHMgZm9yIGRpZmZlcmVudCBjYXJkcyBhbmQgYWRhcHRvcnMsIHNlZQorICogb3Jpbm9jb19wbHhfcGNpX2lkX3RhYmxlIG5lYXIgdGhlIGVuZCBvZiB0aGUgZmlsZS4gIElmIHlvdSBoYXZlIGEKKyAqIGNhcmQgd2UgZG9uJ3QgaGF2ZSB0aGUgUENJIGlkIGZvciwgYW5kIGxvb2tzIGxpa2UgaXQgc2hvdWxkIHdvcmssCisgKiBkcm9wIG1lIG1haWwgd2l0aCB0aGUgaWQgYW5kICJpdCB3b3JrcyIvIml0IGRvZXNuJ3Qgd29yayIuCisgKgorICogTm90ZTogaWYgZXZlcnl0aGluZyBnZXRzIGRldGVjdGVkIGZpbmUgYnV0IGl0IGRvZXNuJ3QgYWN0dWFsbHkgc2VuZAorICogb3IgcmVjZWl2ZSBwYWNrZXRzLCB5b3VyIGZpcnN0IHBvcnQgb2YgY2FsbCBzaG91bGQgcHJvYmFibHkgYmUgdG8KKyAqIHRyeSBuZXdlciBmaXJtd2FyZSBpbiB0aGUgY2FyZC4gIEVzcGVjaWFsbHkgaWYgeW91J3JlIGRvaW5nIEFkLUhvYworICogbW9kZXMuCisgKgorICogVGhlIGFjdHVhbCBkcml2aW5nIGlzIGRvbmUgYnkgb3Jpbm9jby5jLCB0aGlzIGlzIGp1c3QgcmVzb3VyY2UKKyAqIGFsbG9jYXRpb24gc3R1ZmYuICBUaGUgZXhwbGFuYXRpb24gYmVsb3cgaXMgY291cnRlc3kgb2YgUnlhbiBOaWVtaQorICogb24gdGhlIGxpbnV4LXdsYW4tbmcgbGlzdCBhdAorICogaHR0cDovL2FyY2hpdmVzLm5lb2hhcHNpcy5jb20vYXJjaGl2ZXMvZGV2L2xpbnV4LXdsYW4vMjAwMS1xMS8wMDI2Lmh0bWwKKyAqCisgKiBUaGUgUExYOTA1Mi1iYXNlZCBjYXJkcyAoV0wxMTAwMCBhbmQgc2V2ZXJhbCBvdGhlcnMpIGFyZSBhCisgKiBkaWZmZXJlbnQgYmVhc3QgdGhhbiB0aGUgdXN1YWwgUENNQ0lBLWJhc2VkIFBSSVNNMiBjb25maWd1cmF0aW9uCisgKiBleHBlY3RlZCBieSB3bGFuLW5nLiAgSGVyZSdzIHRoZSBnZW5lcmFsIGRldGFpbHMgb24gaG93IHRoZSBXTDExMDAwCisgKiBQQ0kgYWRhcHRlciB3b3JrczoKKyAqCisgKiAtIFR3byBQQ0kgSS9PIGFkZHJlc3Mgc3BhY2VzLCBvbmUgMHg4MCBsb25nIHdoaWNoIGNvbnRhaW5zIHRoZQorICogUExYOTA1MiByZWdpc3RlcnMsIGFuZCBvbmUgdGhhdCdzIDB4NDAgbG9uZyBtYXBwZWQgdG8gdGhlIFBDTUNJQQorICogc2xvdCBJL08gYWRkcmVzcyBzcGFjZS4KKyAqCisgKiAtIE9uZSBQQ0kgbWVtb3J5IGFkZHJlc3Mgc3BhY2UsIG1hcHBlZCB0byB0aGUgUENNQ0lBIG1lbW9yeSBzcGFjZQorICogKGNvbnRhaW5pbmcgdGhlIENJUykuCisgKgorICogQWZ0ZXIgaWRlbnRpZnlpbmcgdGhlIEkvTyBhbmQgbWVtb3J5IHNwYWNlLCB5b3UgY2FuIHJlYWQgdGhyb3VnaAorICogdGhlIG1lbW9yeSBzcGFjZSB0byBjb25maXJtIHRoZSBDSVMncyBkZXZpY2UgSUQgb3IgbWFudWZhY3R1cmVyIElECisgKiB0byBtYWtlIHN1cmUgaXQncyB0aGUgZXhwZWN0ZWQgY2FyZC4gIHFLZWVwIGluIG1pbmQgdGhhdCB0aGUgUENNQ0lBCisgKiBzcGVjIHNwZWNpZmllcyB0aGUgQ0lTIGFzIHRoZSBsb3dlciA4IGJpdHMgb2YgZWFjaCB3b3JkIHJlYWQgZnJvbQorICogdGhlIENJUywgc28gdG8gcmVhZCB0aGUgYnl0ZXMgb2YgdGhlIENJUywgcmVhZCBldmVyeSBvdGhlciBieXRlCisgKiAoMCwyLDQsLi4uKS4gUGFzc2luZyB0aGF0IHRlc3QsIHlvdSBuZWVkIHRvIGVuYWJsZSB0aGUgSS9PIGFkZHJlc3MKKyAqIHNwYWNlIG9uIHRoZSBQQ01DSUEgY2FyZCB2aWEgdGhlIFBDTUNJQSBDT1IgcmVnaXN0ZXIuIFRoaXMgaXMgdGhlCisgKiBmaXJzdCBieXRlIGZvbGxvd2luZyB0aGUgQ0lTLiBJbiBteSBjYXNlICh3aGljaCBtYXkgbm90IGhhdmUgYW55CisgKiByZWxhdGlvbiB0byB3aGF0J3Mgb24gdGhlIFBSSVNNMiBjYXJkcyksIENPUiB3YXMgYXQgb2Zmc2V0IDB4ODAwCisgKiB3aXRoaW4gdGhlIFBDSSBtZW1vcnkgc3BhY2UuIFdyaXRlIDB4NDEgdG8gdGhlIENPUiByZWdpc3RlciB0bworICogZW5hYmxlIEkvTyBtb2RlIGFuZCB0byBzZWxlY3QgbGV2ZWwgdHJpZ2dlcmVkIGludGVycnVwdHMuIFRvCisgKiBjb25maXJtIHlvdSBhY3R1YWxseSBzdWNjZWVkZWQsIHJlYWQgdGhlIENPUiByZWdpc3RlciBiYWNrIGFuZCBtYWtlCisgKiBzdXJlIGl0IGFjdHVhbGx5IGdvdCBzZXQgdG8gMHg0MSwgaW5jYXNlIHlvdSBoYXZlIGFuIHVuZXhwZWN0ZWQKKyAqIGNhcmQgaW5zZXJ0ZWQuCisgKgorICogRm9sbG93aW5nIHRoYXQsIHlvdSBjYW4gdHJlYXQgdGhlIHNlY29uZCBQQ0kgSS9PIGFkZHJlc3Mgc3BhY2UgKHRoZQorICogb25lIHRoYXQncyBub3QgMHg4MCBpbiBsZW5ndGgpIGFzIHRoZSBQQ01DSUEgSS9PIHNwYWNlLgorICoKKyAqIE5vdGUgdGhhdCBpbiB0aGUgRXVtaXRjb20ncyBzb3VyY2UgZm9yIHRoZWlyIGRyaXZlcnMsIHRoZXkgcmVnaXN0ZXIKKyAqIHRoZSBpbnRlcnJ1cHQgYXMgZWRnZSB0cmlnZ2VyZWQgd2hlbiByZWdpc3RlcmluZyBpdCB3aXRoIHRoZQorICogV2luZG93cyBrZXJuZWwuIEkgZG9uJ3QgcmVjYWxsIGhvdyB0byByZWdpc3RlciBlZGdlIHRyaWdnZXJlZCBvbgorICogTGludXggKGlmIGl0IGNhbiBiZSBkb25lIGF0IGFsbCkuIEJ1dCBpbiBzb21lIGV4cGVyaW1lbnRhdGlvbiwgSQorICogZG9uJ3Qgc2VlIG11Y2ggb3BlcmF0aW9uYWwgZGlmZmVyZW5jZSBiZXR3ZWVuIHVzaW5nIGVpdGhlcgorICogaW50ZXJydXB0IG1vZGUuIERvbid0IG1lc3Mgd2l0aCB0aGUgaW50ZXJydXB0IG1vZGUgaW4gdGhlIENPUgorICogcmVnaXN0ZXIgdGhvdWdoLCBhcyB0aGUgUExYOTA1MiB3YW50cyBsZXZlbCB0cmlnZ2VycyB3aXRoIHRoZSB3YXkKKyAqIHRoZSBzZXJpYWwgRUVQUk9NIGNvbmZpZ3VyZXMgaXQgb24gdGhlIFdMMTEwMDAuCisgKgorICogVGhlcmUncyBzb21lIG90aGVyIGxpdHRsZSBxdWlya3MgcmVsYXRlZCB0byB0aW1pbmcgdGhhdCBJIGJ1bXBlZAorICogaW50bywgYnV0IEkgZG9uJ3QgcmVjYWxsIHJpZ2h0IG5vdy4gQWxzbywgdGhlcmUncyB0d28gdmFyaWFudHMgb2YKKyAqIHRoZSBXTDExMDAwIEkndmUgc2VlbiwgcmV2aXNpb24gQTEgYW5kIFQyLiBUaGVzZSBzZWVtIHRvIGRpZmZlcgorICogc2xpZ2h0bHkgaW4gdGhlIHRpbWluZ3MgY29uZmlndXJlZCBpbiB0aGUgd2FpdC1zdGF0ZSBnZW5lcmF0b3IgaW4KKyAqIHRoZSBQTFg5MDUyLiBUaGVyZSBoYXZlIGFsc28gYmVlbiBzb21lIGNvbW1lbnRzIGZyb20gRXVtaXRjb20gdGhhdAorICogY2FyZHMgc2hvdWxkbid0IGJlIGhvdCBzd2FwcGVkLCBhcHBhcmVudGx5IGR1ZSB0byByaXNrIG9mIGNvb2tpbmcKKyAqIHRoZSBQTFg5MDUyLiBJJ20gdW5zdXJlIHdoeSB0aGV5IGJlbGlldmUgdGhpcywgYXMgSSBjYW4ndCBzZWUKKyAqIGFueXRoaW5nIGluIHRoZSBkZXNpZ24gdGhhdCB3b3VsZCByZWFsbHkgY2F1c2UgYSBwcm9ibGVtLCBleGNlcHQKKyAqIGZvciBjcmFzaGluZyBkcml2ZXJzIG5vdCB3cml0dGVuIHRvIGV4cGVjdCBpdC4gQW5kIGhhdmluZyBkZXZlbG9wZWQKKyAqIGRyaXZlcnMgZm9yIHRoZSBXTDExMDAwLCBJJ2Qgc2F5IGl0J3MgcXVpdGUgdHJpY2t5IHRvIHdyaXRlIGNvZGUKKyAqIHRoYXQgd2lsbCBzdWNjZXNzZnVsbHkgZGVhbCB3aXRoIGEgaG90IHVucGx1Zy4gVmVyeSBvZGQgdGhpbmdzCisgKiBoYXBwZW4gb24gdGhlIEkvTyBzaWRlIG9mIHRoaW5ncy4gQnV0IGFueXdheSwgYmUgd2FybmVkLiBEZXNwaXRlCisgKiB0aGF0LCBJJ3ZlIGhvdC1zd2FwcGVkIGEgbnVtYmVyIG9mIHRpbWVzIGR1cmluZyBkZWJ1Z2dpbmcgYW5kCisgKiBkcml2ZXIgZGV2ZWxvcG1lbnQgZm9yIHZhcmlvdXMgcmVhc29ucyAoc3R1Y2sgV0FJVCMgbGluZSBhZnRlciB0aGUKKyAqIHJhZGlvIGNhcmQncyBmaXJtd2FyZSBsb2NrcyB1cCkuCisgKgorICogSG9wZSB0aGlzIGlzIGVub3VnaCBpbmZvIGZvciBzb21lb25lIHRvIGFkZCBQTFg5MDUyIHN1cHBvcnQgdG8gdGhlCisgKiB3bGFuLW5nIGNhcmQuIEluIHRoZSBjYXNlIG9mIHRoZSBXTDExMDAwLCB0aGUgUENJIElEJ3MgYXJlCisgKiAweDE2MzkvMHgwMjAwLCB3aXRoIG1hdGNoaW5nIHN1YnN5c3RlbSBJRCdzLiBPdGhlciBQTFg5MDUyLWJhc2VkCisgKiBtYW51ZmFjdHVyZXJzIG90aGVyIHRoYW4gRXVtaXRjb20gKG9yIG9uIGNhcmRzIG90aGVyIHRoYW4gdGhlCisgKiBXTDExMDAwKSBtYXkgaGF2ZSBkaWZmZXJlbnQgUENJIElEJ3MuCisgKgorICogSWYgYW55b25lIG5lZWRzIGFueSBtb3JlIHNwZWNpZmljIGluZm8sIGxldCBtZSBrbm93LiBJIGhhdmVuJ3QgaGFkCisgKiB0aW1lIHRvIGltcGxlbWVudCBzdXBwb3J0IG15c2VsZiB5ZXQsIGFuZCB3aXRoIHRoZSB3YXkgdGhpbmdzIGFyZQorICogZ29pbmcsIG1pZ2h0IG5vdCBoYXZlIHRpbWUgZm9yIGEgd2hpbGUuLgorICovCisKKyNkZWZpbmUgRFJJVkVSX05BTUUgIm9yaW5vY29fcGx4IgorI2RlZmluZSBQRlggRFJJVkVSX05BTUUgIjogIgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorCisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorCisjaW5jbHVkZSAiaGVybWVzLmgiCisjaW5jbHVkZSAib3Jpbm9jby5oIgorCisjZGVmaW5lIENPUl9PRkZTRVQJKDB4M2UwKQkvKiBDT1IgYXR0cmlidXRlIG9mZnNldCBvZiBQcmlzbTIgUEMgY2FyZCAqLworI2RlZmluZSBDT1JfVkFMVUUJKENPUl9MRVZFTF9SRVEgfCBDT1JfRlVOQ19FTkEpIC8qIEVuYWJsZSBQQyBjYXJkIHdpdGggaW50ZXJydXB0IGluIGxldmVsIHRyaWdnZXIgKi8KKyNkZWZpbmUgQ09SX1JFU0VUICAgICAoMHg4MCkJLyogcmVzZXQgYml0IGluIHRoZSBDT1IgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUExYX1JFU0VUX1RJTUUJKDUwMCkJLyogbWlsbGlzZWNvbmRzICovCisKKyNkZWZpbmUgUExYX0lOVENTUgkJMHg0YyAvKiBJbnRlcnJ1cHQgQ29udHJvbCAmIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQTFhfSU5UQ1NSX0lOVEVOCSgxPDw2KSAvKiBJbnRlcnJ1cHQgRW5hYmxlIGJpdCAqLworCitzdGF0aWMgY29uc3QgdTggY2lzX21hZ2ljW10gPSB7CisJMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHhmZiwgMHgxNywgMHgwNCwgMHg2NworfTsKKworLyogT3Jpbm9jbyBQTFggc3BlY2lmaWMgZGF0YSAqLworc3RydWN0IG9yaW5vY29fcGx4X2NhcmQgeworCXZvaWQgX19pb21lbSAqYXR0cl9tZW07Cit9OworCisvKgorICogRG8gYSBzb2Z0IHJlc2V0IG9mIHRoZSBjYXJkIHVzaW5nIHRoZSBDb25maWd1cmF0aW9uIE9wdGlvbiBSZWdpc3RlcgorICovCitzdGF0aWMgaW50IG9yaW5vY29fcGx4X2Nvcl9yZXNldChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQoreworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlzdHJ1Y3Qgb3Jpbm9jb19wbHhfY2FyZCAqY2FyZCA9IHByaXYtPmNhcmQ7CisJdTggX19pb21lbSAqYXR0cl9tZW0gPSBjYXJkLT5hdHRyX21lbTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdTE2IHJlZzsKKworCXdyaXRlYihDT1JfVkFMVUUgfCBDT1JfUkVTRVQsIGF0dHJfbWVtICsgQ09SX09GRlNFVCk7CisJbWRlbGF5KDEpOworCisJd3JpdGViKENPUl9WQUxVRSwgYXR0cl9tZW0gKyBDT1JfT0ZGU0VUKTsKKwltZGVsYXkoMSk7CisKKwkvKiBKdXN0IGluIGNhc2UsIHdhaXQgbW9yZSB1bnRpbCB0aGUgY2FyZCBpcyBubyBsb25nZXIgYnVzeSAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgKFBMWF9SRVNFVF9USU1FICogSFogLyAxMDAwKTsKKwlyZWcgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBDTUQpOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSAmJiAocmVnICYgSEVSTUVTX0NNRF9CVVNZKSkgeworCQltZGVsYXkoMSk7CisJCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIENNRCk7CisJfQorCisJLyogRGlkIHdlIHRpbWVvdXQgPyAqLworCWlmIChyZWcgJiBIRVJNRVNfQ01EX0JVU1kpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQnVzeSB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBvcmlub2NvX3BseF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWludCBlcnIgPSAwOworCXU4IF9faW9tZW0gKmF0dHJfbWVtID0gTlVMTDsKKwl1MzIgY3NyX3JlZywgcGx4X2FkZHI7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IE5VTEw7CisJc3RydWN0IG9yaW5vY29fcGx4X2NhcmQgKmNhcmQ7CisJdW5zaWduZWQgbG9uZyBwY2NhcmRfaW9hZGRyID0gMDsKKwl1bnNpZ25lZCBsb25nIHBjY2FyZF9pb2xlbiA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJdm9pZCBfX2lvbWVtICptZW07CisJaW50IGk7CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBlbmFibGUgUENJIGRldmljZVxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUklWRVJfTkFNRSk7CisJaWYgKGVyciAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlc1xuIik7CisJCWdvdG8gZmFpbF9yZXNvdXJjZXM7CisJfQorCisJLyogUmVzb3VyY2UgMSBpcyBtYXBwZWQgdG8gUExYLXNwZWNpZmljIHJlZ2lzdGVycyAqLworCXBseF9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOworCisJLyogUmVzb3VyY2UgMiBpcyBtYXBwZWQgdG8gdGhlIFBDTUNJQSBhdHRyaWJ1dGUgbWVtb3J5ICovCisJYXR0cl9tZW0gPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKSwKKwkJCSAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMikpOworCWlmICghYXR0cl9tZW0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IHJlbWFwIFBDTUNJQSBzcGFjZVxuIik7CisJCWdvdG8gZmFpbF9tYXBfYXR0cjsKKwl9CisKKwkvKiBSZXNvdXJjZSAzIGlzIG1hcHBlZCB0byB0aGUgUENNQ0lBIEkvTyBhZGRyZXNzIHNwYWNlICovCisJcGNjYXJkX2lvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKTsKKwlwY2NhcmRfaW9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDMpOworCisJbWVtID0gcGNpX2lvbWFwKHBkZXYsIDMsIDApOworCWlmICghbWVtKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9tYXBfaW87CisJfQorCisJLyogQWxsb2NhdGUgbmV0d29yayBkZXZpY2UgKi8KKwlkZXYgPSBhbGxvY19vcmlub2NvZGV2KHNpemVvZigqY2FyZCksIG9yaW5vY29fcGx4X2Nvcl9yZXNldCk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmYWlsX2FsbG9jOworCX0KKworCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWNhcmQgPSBwcml2LT5jYXJkOworCWNhcmQtPmF0dHJfbWVtID0gYXR0cl9tZW07CisJZGV2LT5iYXNlX2FkZHIgPSBwY2NhcmRfaW9hZGRyOworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJaGVybWVzX3N0cnVjdF9pbml0KCZwcml2LT5odywgbWVtLCBIRVJNRVNfMTZCSVRfUkVHU1BBQ0lORyk7CisKKwlwcmludGsoS0VSTl9ERUJVRyBQRlggIkRldGVjdGVkIE9yaW5vY28vUHJpc20yIFBMWCBkZXZpY2UgIgorCSAgICAgICAiYXQgJXMgaXJxOiVkLCBpbyBhZGRyOjB4JWx4XG4iLCBwY2lfbmFtZShwZGV2KSwgcGRldi0+aXJxLAorCSAgICAgICBwY2NhcmRfaW9hZGRyKTsKKworCWVyciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgb3Jpbm9jb19pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJICBkZXYtPm5hbWUsIGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgYWxsb2NhdGUgSVJRICVkXG4iLCBwZGV2LT5pcnEpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZmFpbF9pcnE7CisJfQorCWRldi0+aXJxID0gcGRldi0+aXJxOworCisJLyogYmpvZXJuOiBXZSBuZWVkIHRvIHRlbGwgdGhlIGNhcmQgdG8gZW5hYmxlIGludGVycnVwdHMsIGluCisJICAgY2FzZSB0aGUgc2VyaWFsIGVwcm9tIGRpZG4ndCBkbyB0aGlzIGFscmVhZHkuICBTZWUgdGhlCisJICAgUExYOTA1MiBkYXRhIGJvb2ssIHA4LTEgYW5kIDgtMjQgZm9yIHJlZmVyZW5jZS4gKi8KKwljc3JfcmVnID0gaW5sKHBseF9hZGRyICsgUExYX0lOVENTUik7CisJaWYgKCEoY3NyX3JlZyAmIFBMWF9JTlRDU1JfSU5URU4pKSB7CisJCWNzcl9yZWcgfD0gUExYX0lOVENTUl9JTlRFTjsKKwkJb3V0bChjc3JfcmVnLCBwbHhfYWRkciArIFBMWF9JTlRDU1IpOworCQljc3JfcmVnID0gaW5sKHBseF9hZGRyICsgUExYX0lOVENTUik7CisJCWlmICghKGNzcl9yZWcgJiBQTFhfSU5UQ1NSX0lOVEVOKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGVuYWJsZSBpbnRlcnJ1cHRzXG4iKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCWVyciA9IG9yaW5vY29fcGx4X2Nvcl9yZXNldChwcml2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkluaXRpYWwgcmVzZXQgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiQ0lTOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlwcmludGsoIiUwMlg6IiwgcmVhZGIoYXR0cl9tZW0gKyAyKmkpKTsKKwl9CisJcHJpbnRrKCJcbiIpOworCisJLyogVmVyaWZ5IHdoZXRoZXIgYSBzdXBwb3J0ZWQgUEMgY2FyZCBpcyBwcmVzZW50ICovCisJLyogRklYTUU6IHdlIHByb2JhYmx5IG5lZWQgdG8gYmUgc21hcnRlZCBhYm91dCB0aGlzICovCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihjaXNfbWFnaWMpOyBpKyspIHsKKwkJaWYgKGNpc19tYWdpY1tpXSAhPSByZWFkYihhdHRyX21lbSArMippKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVGhlIENJUyB2YWx1ZSBvZiBQcmlzbTIgUEMgIgorCQkJICAgICAgICJjYXJkIGlzIHVuZXhwZWN0ZWRcbiIpOworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IHJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJcmV0dXJuIDA7CisKKyBmYWlsOgorCWZyZWVfaXJxKHBkZXYtPmlycSwgZGV2KTsKKworIGZhaWxfaXJxOgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX29yaW5vY29kZXYoZGV2KTsKKworIGZhaWxfYWxsb2M6CisJcGNpX2lvdW5tYXAocGRldiwgbWVtKTsKKworIGZhaWxfbWFwX2lvOgorCWlvdW5tYXAoYXR0cl9tZW0pOworCisgZmFpbF9tYXBfYXR0cjoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCisgZmFpbF9yZXNvdXJjZXM6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IG9yaW5vY29fcGx4X3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgb3Jpbm9jb19wbHhfY2FyZCAqY2FyZCA9IHByaXYtPmNhcmQ7CisJdTggX19pb21lbSAqYXR0cl9tZW0gPSBjYXJkLT5hdHRyX21lbTsKKworCUJVR19PTighIGRldik7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX29yaW5vY29kZXYoZGV2KTsKKwlwY2lfaW91bm1hcChwZGV2LCBwcml2LT5ody5pb2Jhc2UpOworCWlvdW5tYXAoYXR0cl9tZW0pOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBvcmlub2NvX3BseF9wY2lfaWRfdGFibGVbXSA9IHsKKwl7MHgxMTFhLCAweDEwMjMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwJLyogU2llbWVucyBTcGVlZFN0cmVhbSBTUzEwMjMgKi8KKwl7MHgxMzg1LCAweDQxMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwJLyogTmV0Z2VhciBNQTMwMSAqLworCXsweDE1ZTgsIDB4MDEzMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAkvKiBDb3JyZWdhICAtIGRvZXMgdGhpcyB3b3JrPyAqLworCXsweDE2MzgsIDB4MTEwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAkvKiBTTUMgRVpDb25uZWN0IFNNQzI2MDJXLAorCQkJCQkJCSAgIEV1bWl0Y29tIFBDSSBXTDExMDAwLAorCQkJCQkJCSAgIEFkZHRyb24gQVdBLTEwMCAqLworCXsweDE2YWIsIDB4MTEwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAkvKiBHbG9iYWwgU3VuIFRlY2ggR0wyNDExMFAgKi8KKwl7MHgxNmFiLCAweDExMDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwJLyogUmVwb3J0ZWQgd29ya2luZywgYnV0IHVua25vd24gKi8KKwl7MHgxNmFiLCAweDExMDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwJLyogTGlua3N5cyBXRFQxMSAqLworCXsweDE2ZWMsIDB4MzY4NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAkvKiBVU1IgMjQxNSAqLworCXsweGVjODAsIDB4ZWMwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAkvKiBCZWxraW4gRjVENjAwMCB0ZXN0ZWQgYnkKKwkJCQkJCQkgICBCcmVuZGFuIFcuIE1jQWRhbXMgPHJpdCBBVCBqYWNrZWQtaW4ub3JnPiAqLworCXsweDEwYjcsIDB4Nzc3MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAkvKiAzQ29tIEFpckNvbm5lY3QgUENJIHRlc3RlZCBieQorCQkJCQkJCSAgIERhbWllbiBQZXJzb2huIDxkYW1pZW4gQVQgcGVyc29obi5uZXQ+ICovCisJezAsfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBvcmlub2NvX3BseF9wY2lfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgb3Jpbm9jb19wbHhfZHJpdmVyID0geworCS5uYW1lCQk9IERSSVZFUl9OQU1FLAorCS5pZF90YWJsZQk9IG9yaW5vY29fcGx4X3BjaV9pZF90YWJsZSwKKwkucHJvYmUJCT0gb3Jpbm9jb19wbHhfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChvcmlub2NvX3BseF9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0gRFJJVkVSX05BTUUgIiAiIERSSVZFUl9WRVJTSU9OCisJIiAoUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4sIgorCSIgRGF2aWQgR2lic29uIDxoZXJtZXNAZ2lic29uLmRyb3BiZWFyLmlkLmF1PiwiCisJIiBEYW5pZWwgQmFybG93IDxkYW5AdGVsZW50Lm5ldD4pIjsKK01PRFVMRV9BVVRIT1IoIkRhbmllbCBCYXJsb3cgPGRhbkB0ZWxlbnQubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIHdpcmVsZXNzIExBTiBjYXJkcyB1c2luZyB0aGUgUExYOTA1MiBQQ0kgYnJpZGdlIik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBNUEwvR1BMIik7CisKK3N0YXRpYyBpbnQgX19pbml0IG9yaW5vY29fcGx4X2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIHZlcnNpb24pOworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJm9yaW5vY29fcGx4X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvcmlub2NvX3BseF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZvcmlub2NvX3BseF9kcml2ZXIpOworCXNzbGVlcCgxKTsKK30KKworbW9kdWxlX2luaXQob3Jpbm9jb19wbHhfaW5pdCk7Cittb2R1bGVfZXhpdChvcmlub2NvX3BseF9leGl0KTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fdG1kLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3RtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ODkzZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3RtZC5jCkBAIC0wLDAgKzEsMjc2IEBACisvKiBvcmlub2NvX3RtZC5jCisgKiAKKyAqIERyaXZlciBmb3IgUHJpc20gSUkgZGV2aWNlcyB3aGljaCB3b3VsZCB1c3VhbGx5IGJlIGRyaXZlbiBieSBvcmlub2NvX2NzLAorICogYnV0IGFyZSBjb25uZWN0ZWQgdG8gdGhlIFBDSSBidXMgYnkgYSBUTUQ3MTYwLiAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgSm9lcmcgRG9yY2hhaW4gPGpvZXJnIEFUIGRvcmNoYWluLm5ldD4KKyAqIGJhc2VkIGhlYXZpbHkgdXBvbiBvcmlub2NvX3BseC5jIENvcHlyaWdodCAoQykgMjAwMSBEYW5pZWwgQmFybG93CisgKgorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbgorICogY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworICoKKyAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIKKyAqIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUKKyAqIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpLCBpbgorICogd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlCisgKiBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQorICogb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91cgorICogdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieQorICogZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kCisgKiBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuICBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUKKyAqIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQorICogdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KKworICogQ2F1dGlvbjogdGhpcyBpcyBleHBlcmltZW50YWwgYW5kIHByb2JhYmx5IGJ1Z2d5LiAgRm9yIHN1Y2Nlc3MgYW5kCisgKiBmYWlsdXJlIHJlcG9ydHMgZm9yIGRpZmZlcmVudCBjYXJkcyBhbmQgYWRhcHRvcnMsIHNlZQorICogb3Jpbm9jb190bWRfcGNpX2lkX3RhYmxlIG5lYXIgdGhlIGVuZCBvZiB0aGUgZmlsZS4gIElmIHlvdSBoYXZlIGEKKyAqIGNhcmQgd2UgZG9uJ3QgaGF2ZSB0aGUgUENJIGlkIGZvciwgYW5kIGxvb2tzIGxpa2UgaXQgc2hvdWxkIHdvcmssCisgKiBkcm9wIG1lIG1haWwgd2l0aCB0aGUgaWQgYW5kICJpdCB3b3JrcyIvIml0IGRvZXNuJ3Qgd29yayIuCisgKgorICogTm90ZTogaWYgZXZlcnl0aGluZyBnZXRzIGRldGVjdGVkIGZpbmUgYnV0IGl0IGRvZXNuJ3QgYWN0dWFsbHkgc2VuZAorICogb3IgcmVjZWl2ZSBwYWNrZXRzLCB5b3VyIGZpcnN0IHBvcnQgb2YgY2FsbCBzaG91bGQgcHJvYmFibHkgYmUgdG8gICAKKyAqIHRyeSBuZXdlciBmaXJtd2FyZSBpbiB0aGUgY2FyZC4gIEVzcGVjaWFsbHkgaWYgeW91J3JlIGRvaW5nIEFkLUhvYworICogbW9kZXMKKyAqCisgKiBUaGUgYWN0dWFsIGRyaXZpbmcgaXMgZG9uZSBieSBvcmlub2NvLmMsIHRoaXMgaXMganVzdCByZXNvdXJjZQorICogYWxsb2NhdGlvbiBzdHVmZi4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBtb2RlbGVkIGFmdGVyIHRoZSBvcmlub2NvX3BseCBkcml2ZXIuIFRoZSBtYWluCisgKiBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIFRNRCBjaGlwIGhhcyBvbmx5IElPIHBvcnQgcmFuZ2VzIGFuZCBubworICogbWVtb3J5IHNwYWNlLCBpLmUuICBubyBhY2Nlc3MgdG8gdGhlIENJUy4gQ29tcGFyZWQgdG8gdGhlIFBMWCBjaGlwLAorICogdGhlIGlvIHJhbmdlIGZ1bmN0aW9uYWxpdGllcyBhcmUgZXhjaGFuZ2VkLgorICoKKyAqIFBoZWVjb20gc2VsbHMgY2FyZHMgd2l0aCB0aGUgVE1EIGNoaXAgYXMgIkFTSUMgdmVyc2lvbiIKKyAqLworCisjZGVmaW5lIERSSVZFUl9OQU1FICJvcmlub2NvX3RtZCIKKyNkZWZpbmUgUEZYIERSSVZFUl9OQU1FICI6ICIKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKworI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KKworI2luY2x1ZGUgImhlcm1lcy5oIgorI2luY2x1ZGUgIm9yaW5vY28uaCIKKworI2RlZmluZSBDT1JfVkFMVUUJKENPUl9MRVZFTF9SRVEgfCBDT1JfRlVOQ19FTkEpIC8qIEVuYWJsZSBQQyBjYXJkIHdpdGggaW50ZXJydXB0IGluIGxldmVsIHRyaWdnZXIgKi8KKyNkZWZpbmUgQ09SX1JFU0VUICAgICAoMHg4MCkJLyogcmVzZXQgYml0IGluIHRoZSBDT1IgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVE1EX1JFU0VUX1RJTUUJKDUwMCkJLyogbWlsbGlzZWNvbmRzICovCisKKy8qIE9yaW5vY28gVE1EIHNwZWNpZmljIGRhdGEgKi8KK3N0cnVjdCBvcmlub2NvX3RtZF9jYXJkIHsKKwl1MzIgdG1kX2lvOworfTsKKworCisvKgorICogRG8gYSBzb2Z0IHJlc2V0IG9mIHRoZSBjYXJkIHVzaW5nIHRoZSBDb25maWd1cmF0aW9uIE9wdGlvbiBSZWdpc3RlcgorICovCitzdGF0aWMgaW50IG9yaW5vY29fdG1kX2Nvcl9yZXNldChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQoreworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlzdHJ1Y3Qgb3Jpbm9jb190bWRfY2FyZCAqY2FyZCA9IHByaXYtPmNhcmQ7CisJdTMyIGFkZHIgPSBjYXJkLT50bWRfaW87CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXUxNiByZWc7CisKKwlvdXRiKENPUl9WQUxVRSB8IENPUl9SRVNFVCwgYWRkcik7CisJbWRlbGF5KDEpOworCisJb3V0YihDT1JfVkFMVUUsIGFkZHIpOworCW1kZWxheSgxKTsKKworCS8qIEp1c3QgaW4gY2FzZSwgd2FpdCBtb3JlIHVudGlsIHRoZSBjYXJkIGlzIG5vIGxvbmdlciBidXN5ICovCisJdGltZW91dCA9IGppZmZpZXMgKyAoVE1EX1JFU0VUX1RJTUUgKiBIWiAvIDEwMDApOworCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIENNRCk7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpICYmIChyZWcgJiBIRVJNRVNfQ01EX0JVU1kpKSB7CisJCW1kZWxheSgxKTsKKwkJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgQ01EKTsKKwl9CisKKwkvKiBEaWQgd2UgdGltZW91dCA/ICovCisJaWYgKHJlZyAmIEhFUk1FU19DTURfQlVTWSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJCdXN5IHRpbWVvdXRcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG9yaW5vY29fdG1kX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IE5VTEw7CisJc3RydWN0IG9yaW5vY29fdG1kX2NhcmQgKmNhcmQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJdm9pZCBfX2lvbWVtICptZW07CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBlbmFibGUgUENJIGRldmljZVxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUklWRVJfTkFNRSk7CisJaWYgKGVyciAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlc1xuIik7CisJCWdvdG8gZmFpbF9yZXNvdXJjZXM7CisJfQorCisJbWVtID0gcGNpX2lvbWFwKHBkZXYsIDIsIDApOworCWlmICghIG1lbSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfaW9tYXA7CisJfQorCisJLyogQWxsb2NhdGUgbmV0d29yayBkZXZpY2UgKi8KKwlkZXYgPSBhbGxvY19vcmlub2NvZGV2KHNpemVvZigqY2FyZCksIG9yaW5vY29fdG1kX2Nvcl9yZXNldCk7CisJaWYgKCEgZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBhbGxvY2F0ZSBuZXR3b3JrIGRldmljZVxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9hbGxvYzsKKwl9CisKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljYXJkID0gcHJpdi0+Y2FyZDsKKwljYXJkLT50bWRfaW8gPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisJZGV2LT5iYXNlX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMik7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwloZXJtZXNfc3RydWN0X2luaXQoJnByaXYtPmh3LCBtZW0sIEhFUk1FU18xNkJJVF9SRUdTUEFDSU5HKTsKKworCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiRGV0ZWN0ZWQgT3Jpbm9jby9QcmlzbTIgVE1EIGRldmljZSAiCisJICAgICAgICJhdCAlcyBpcnE6JWQsIGlvIGFkZHI6MHglbHhcbiIsIHBjaV9uYW1lKHBkZXYpLCBwZGV2LT5pcnEsCisJICAgICAgIGRldi0+YmFzZV9hZGRyKTsKKworCWVyciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgb3Jpbm9jb19pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJICBkZXYtPm5hbWUsIGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgYWxsb2NhdGUgSVJRICVkXG4iLCBwZGV2LT5pcnEpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZmFpbF9pcnE7CisJfQorCWRldi0+aXJxID0gcGRldi0+aXJxOworCisJZXJyID0gb3Jpbm9jb190bWRfY29yX3Jlc2V0KHByaXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSW5pdGlhbCByZXNldCBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgcmVnaXN0ZXIgbmV0d29yayBkZXZpY2VcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlyZXR1cm4gMDsKKworIGZhaWw6CisJZnJlZV9pcnEocGRldi0+aXJxLCBkZXYpOworCisgZmFpbF9pcnE6CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfb3Jpbm9jb2RldihkZXYpOworCisgZmFpbF9hbGxvYzoKKwlwY2lfaW91bm1hcChwZGV2LCBtZW0pOworCisgZmFpbF9pb21hcDoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCisgZmFpbF9yZXNvdXJjZXM6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IG9yaW5vY29fdG1kX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCisJQlVHX09OKCEgZGV2KTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfb3Jpbm9jb2RldihkZXYpOworCXBjaV9pb3VubWFwKHBkZXYsIHByaXYtPmh3LmlvYmFzZSk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG9yaW5vY29fdG1kX3BjaV9pZF90YWJsZVtdID0geworCXsweDE1ZTgsIDB4MDEzMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LCAgICAgIC8qIE5EQyBhbmQgT0VNcywgZS5nLiBwaGVlY29tICovCisJezAsfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBvcmlub2NvX3RtZF9wY2lfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgb3Jpbm9jb190bWRfZHJpdmVyID0geworCS5uYW1lCQk9IERSSVZFUl9OQU1FLAorCS5pZF90YWJsZQk9IG9yaW5vY29fdG1kX3BjaV9pZF90YWJsZSwKKwkucHJvYmUJCT0gb3Jpbm9jb190bWRfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChvcmlub2NvX3RtZF9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0gRFJJVkVSX05BTUUgIiAiIERSSVZFUl9WRVJTSU9OCisJIiAoSm9lcmcgRG9yY2hhaW4gPGpvZXJnQGRvcmNoYWluLm5ldD4pIjsKK01PRFVMRV9BVVRIT1IoIkpvZXJnIERvcmNoYWluIDxqb2VyZ0Bkb3JjaGFpbi5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3Igd2lyZWxlc3MgTEFOIGNhcmRzIHVzaW5nIHRoZSBUTUQ3MTYwIFBDSSBicmlkZ2UiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIE1QTC9HUEwiKTsKKworc3RhdGljIGludCBfX2luaXQgb3Jpbm9jb190bWRfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgdmVyc2lvbik7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmb3Jpbm9jb190bWRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG9yaW5vY29fdG1kX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm9yaW5vY29fdG1kX2RyaXZlcik7CisJc3NsZWVwKDEpOworfQorCittb2R1bGVfaW5pdChvcmlub2NvX3RtZF9pbml0KTsKK21vZHVsZV9leGl0KG9yaW5vY29fdG1kX2V4aXQpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFkMzA1YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvTWFrZWZpbGUKQEAgLTAsMCArMSw4IEBACisjICRJZDogTWFrZWZpbGUuazI2LHYgMS43IDIwMDQvMDEvMzAgMTY6MjQ6MDAgYWpmYSBFeHAgJAorCitwcmlzbTU0LW9ianMgOj0gaXNscGNpX2V0aC5vIGlzbHBjaV9tZ3QubyBcCisgICAgICAgICAgICAgICAgaXNsXzM4eHgubyBpc2xfaW9jdGwubyBpc2xwY2lfZGV2Lm8gXAorCQlpc2xwY2lfaG90cGx1Zy5vIG9pZF9tZ3QubworCitvYmotJChDT05GSUdfUFJJU001NCkgKz0gcHJpc201NC5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsXzM4eHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsXzM4eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDgxZWMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfMzh4eC5jCkBAIC0wLDAgKzEsMjYwIEBACisvKgorICogIAorICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTHVpcyBSLiBSb2RyaWd1ZXogPG1jZ3JvZkBydXNsdWcucnV0Z2Vycy5lZHU+XworICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJwcmlzbWNvbXBhdC5oIgorI2luY2x1ZGUgImlzbF8zOHh4LmgiCisjaW5jbHVkZSAiaXNscGNpX2Rldi5oIgorI2luY2x1ZGUgImlzbHBjaV9tZ3QuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIERldmljZSBJbnRlcmZhY2UgJiBDb250cm9sIGZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIGlzbDM4eHhfZGlzYWJsZV9pbnRlcnJ1cHRzIC0gZGlzYWJsZSBhbGwgaW50ZXJydXB0cworICogQGRldmljZTogcGNpIG1lbW9yeSBiYXNlIGFkZHJlc3MKKyAqCisgKiAgSW5zdHJ1Y3RzIHRoZSBkZXZpY2UgdG8gZGlzYWJsZSBhbGwgaW50ZXJydXB0IHJlcG9ydGluZyBieSBhc3NlcnRpbmcgCisgKiAgdGhlIElSUSBsaW5lLiBOZXcgZXZlbnRzIG1heSBzdGlsbCBzaG93IHVwIGluIHRoZSBpbnRlcnJ1cHQgaWRlbnRpZmljYXRpb24KKyAqICByZWdpc3RlciBsb2NhdGVkIGF0IG9mZnNldCAlSVNMMzhYWF9JTlRfSURFTlRfUkVHLgorICovCit2b2lkCitpc2wzOHh4X2Rpc2FibGVfaW50ZXJydXB0cyh2b2lkIF9faW9tZW0gKmRldmljZSkKK3sKKwlpc2wzOHh4X3czMl9mbHVzaChkZXZpY2UsIDB4MDAwMDAwMDAsIElTTDM4WFhfSU5UX0VOX1JFRyk7CisJdWRlbGF5KElTTDM4WFhfV1JJVEVJT19ERUxBWSk7Cit9CisKK3ZvaWQKK2lzbDM4eHhfaGFuZGxlX3NsZWVwX3JlcXVlc3QoaXNsMzh4eF9jb250cm9sX2Jsb2NrICpjb250cm9sX2Jsb2NrLAorCQkJICAgICBpbnQgKnBvd2Vyc3RhdGUsIHZvaWQgX19pb21lbSAqZGV2aWNlX2Jhc2UpCit7CisJLyogZGV2aWNlIHJlcXVlc3RzIHRvIGdvIGludG8gc2xlZXAgbW9kZQorCSAqIGNoZWNrIHdoZXRoZXIgdGhlIHRyYW5zbWl0IHF1ZXVlcyBmb3IgZGF0YSBhbmQgbWFuYWdlbWVudCBhcmUgZW1wdHkgKi8KKwlpZiAoaXNsMzh4eF9pbl9xdWV1ZShjb250cm9sX2Jsb2NrLCBJU0wzOFhYX0NCX1RYX0RBVEFfTFEpKQorCQkvKiBkYXRhIHR4IHF1ZXVlIG5vdCBlbXB0eSAqLworCQlyZXR1cm47CisKKwlpZiAoaXNsMzh4eF9pbl9xdWV1ZShjb250cm9sX2Jsb2NrLCBJU0wzOFhYX0NCX1RYX01HTVRRKSkKKwkJLyogbWFuYWdlbWVudCB0eCBxdWV1ZSBub3QgZW1wdHkgKi8KKwkJcmV0dXJuOworCisJLyogY2hlY2sgYWxzbyB3aGV0aGVyIHJlY2VpdmVkIGZyYW1lcyBhcmUgcGVuZGluZyAqLworCWlmIChpc2wzOHh4X2luX3F1ZXVlKGNvbnRyb2xfYmxvY2ssIElTTDM4WFhfQ0JfUlhfREFUQV9MUSkpCisJCS8qIGRhdGEgcnggcXVldWUgbm90IGVtcHR5ICovCisJCXJldHVybjsKKworCWlmIChpc2wzOHh4X2luX3F1ZXVlKGNvbnRyb2xfYmxvY2ssIElTTDM4WFhfQ0JfUlhfTUdNVFEpKQorCQkvKiBtYW5hZ2VtZW50IHJ4IHF1ZXVlIG5vdCBlbXB0eSAqLworCQlyZXR1cm47CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCURFQlVHKFNIT1dfVFJBQ0lORywgIkRldmljZSBnb2luZyB0byBzbGVlcCBtb2RlXG4iKTsKKyNlbmRpZgorCisJLyogYWxsIHF1ZXVlcyBhcmUgZW1wdHksIGFsbG93IHRoZSBkZXZpY2UgdG8gZ28gaW50byBzbGVlcCBtb2RlICovCisJKnBvd2Vyc3RhdGUgPSBJU0wzOFhYX1BTTV9QT1dFUlNBVkVfU1RBVEU7CisKKwkvKiBhc3NlcnQgdGhlIFNsZWVwIGludGVycnVwdCBpbiB0aGUgRGV2aWNlIEludGVycnVwdCBSZWdpc3RlciAqLworCWlzbDM4eHhfdzMyX2ZsdXNoKGRldmljZV9iYXNlLCBJU0wzOFhYX0RFVl9JTlRfU0xFRVAsCisJCQkgIElTTDM4WFhfREVWX0lOVF9SRUcpOworCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOworfQorCit2b2lkCitpc2wzOHh4X2hhbmRsZV93YWtldXAoaXNsMzh4eF9jb250cm9sX2Jsb2NrICpjb250cm9sX2Jsb2NrLAorCQkgICAgICBpbnQgKnBvd2Vyc3RhdGUsIHZvaWQgX19pb21lbSAqZGV2aWNlX2Jhc2UpCit7CisJLyogZGV2aWNlIGlzIGluIGFjdGl2ZSBzdGF0ZSwgdXBkYXRlIHRoZSBwb3dlcnN0YXRlIGZsYWcgKi8KKwkqcG93ZXJzdGF0ZSA9IElTTDM4WFhfUFNNX0FDVElWRV9TVEFURTsKKworCS8qIG5vdyBjaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBmcmFtZXMgcGVuZGluZyBmb3IgdGhlIGNhcmQgKi8KKwlpZiAoIWlzbDM4eHhfaW5fcXVldWUoY29udHJvbF9ibG9jaywgSVNMMzhYWF9DQl9UWF9EQVRBX0xRKQorCSAgICAmJiAhaXNsMzh4eF9pbl9xdWV1ZShjb250cm9sX2Jsb2NrLCBJU0wzOFhYX0NCX1RYX01HTVRRKSkKKwkJcmV0dXJuOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX0FOWVRISU5HLCAiV2FrZSB1cCBoYW5kbGVyIHRyaWdnZXIgdGhlIGRldmljZVxuIik7CisjZW5kaWYKKworCS8qIGVpdGhlciBkYXRhIG9yIG1hbmFnZW1lbnQgdHJhbnNtaXQgcXVldWUgaGFzIGEgZnJhbWUgcGVuZGluZworCSAqIHRyaWdnZXIgdGhlIGRldmljZSBieSBzZXR0aW5nIHRoZSBVcGRhdGUgYml0IGluIHRoZSBEZXZpY2UgSW50IHJlZyAqLworCWlzbDM4eHhfdzMyX2ZsdXNoKGRldmljZV9iYXNlLCBJU0wzOFhYX0RFVl9JTlRfVVBEQVRFLAorCQkJICBJU0wzOFhYX0RFVl9JTlRfUkVHKTsKKwl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKK30KKwordm9pZAoraXNsMzh4eF90cmlnZ2VyX2RldmljZShpbnQgYXNsZWVwLCB2b2lkIF9faW9tZW0gKmRldmljZV9iYXNlKQoreworCXN0cnVjdCB0aW1ldmFsIGN1cnJlbnRfdGltZTsKKwl1MzIgcmVnLCBjb3VudGVyID0gMDsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJREVCVUcoU0hPV19GVU5DVElPTl9DQUxMUywgImlzbDM4eHggdHJpZ2dlciBkZXZpY2VcbiIpOworI2VuZGlmCisKKwkvKiBjaGVjayB3aGV0aGVyIHRoZSBkZXZpY2UgaXMgaW4gcG93ZXIgc2F2ZSBtb2RlICovCisJaWYgKGFzbGVlcCkgeworCQkvKiBkZXZpY2UgaXMgaW4gcG93ZXJzYXZlLCB0cmlnZ2VyIHRoZSBkZXZpY2UgZm9yIHdha2V1cCAqLworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCWRvX2dldHRpbWVvZmRheSgmY3VycmVudF90aW1lKTsKKwkJREVCVUcoU0hPV19UUkFDSU5HLCAiJTA4bGkuJTA4bGkgRGV2aWNlIHdha2V1cCB0cmlnZ2VyZWRcbiIsCisJCSAgICAgIGN1cnJlbnRfdGltZS50dl9zZWMsIChsb25nKWN1cnJlbnRfdGltZS50dl91c2VjKTsKKyNlbmRpZgorCisJCURFQlVHKFNIT1dfVFJBQ0lORywgIiUwOGxpLiUwOGxpIERldmljZSByZWdpc3RlciByZWFkICUwOHhcbiIsCisJCSAgICAgIGN1cnJlbnRfdGltZS50dl9zZWMsIChsb25nKWN1cnJlbnRfdGltZS50dl91c2VjLAorCQkgICAgICByZWFkbChkZXZpY2VfYmFzZSArIElTTDM4WFhfQ1RSTF9TVEFUX1JFRykpOworCQl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKKworCQlyZWcgPSByZWFkbChkZXZpY2VfYmFzZSArIElTTDM4WFhfSU5UX0lERU5UX1JFRyk7CisJCWlmIChyZWcgPT0gMHhhYmFkZmFjZSkgeworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCQlkb19nZXR0aW1lb2ZkYXkoJmN1cnJlbnRfdGltZSk7CisJCQlERUJVRyhTSE9XX1RSQUNJTkcsCisJCQkgICAgICAiJTA4bGkuJTA4bGkgRGV2aWNlIHJlZ2lzdGVyIGFiYWRmYWNlXG4iLAorCQkJICAgICAgY3VycmVudF90aW1lLnR2X3NlYywgKGxvbmcpY3VycmVudF90aW1lLnR2X3VzZWMpOworI2VuZGlmCisJCQkvKiByZWFkIHRoZSBEZXZpY2UgU3RhdHVzIFJlZ2lzdGVyIHVudGlsIFNsZWVwbW9kZSBiaXQgaXMgc2V0ICovCisJCQl3aGlsZSAocmVnID0gcmVhZGwoZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpLAorCQkJICAgICAgIChyZWcgJiBJU0wzOFhYX0NUUkxfU1RBVF9TTEVFUE1PREUpID09IDApIHsKKwkJCQl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKKwkJCQljb3VudGVyKys7CisJCQl9CisKKwkJCURFQlVHKFNIT1dfVFJBQ0lORywKKwkJCSAgICAgICIlMDhsaS4lMDhsaSBEZXZpY2UgcmVnaXN0ZXIgcmVhZCAlMDh4XG4iLAorCQkJICAgICAgY3VycmVudF90aW1lLnR2X3NlYywgKGxvbmcpY3VycmVudF90aW1lLnR2X3VzZWMsCisJCQkgICAgICByZWFkbChkZXZpY2VfYmFzZSArIElTTDM4WFhfQ1RSTF9TVEFUX1JFRykpOworCQkJdWRlbGF5KElTTDM4WFhfV1JJVEVJT19ERUxBWSk7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQkJZG9fZ2V0dGltZW9mZGF5KCZjdXJyZW50X3RpbWUpOworCQkJREVCVUcoU0hPV19UUkFDSU5HLAorCQkJICAgICAgIiUwOGxpLiUwOGxpIERldmljZSBhc2xlZXAgY291bnRlciAlaVxuIiwKKwkJCSAgICAgIGN1cnJlbnRfdGltZS50dl9zZWMsIChsb25nKWN1cnJlbnRfdGltZS50dl91c2VjLAorCQkJICAgICAgY291bnRlcik7CisjZW5kaWYKKwkJfQorCQkvKiBhc3NlcnQgdGhlIFdha2V1cCBpbnRlcnJ1cHQgaW4gdGhlIERldmljZSBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KKwkJaXNsMzh4eF93MzJfZmx1c2goZGV2aWNlX2Jhc2UsIElTTDM4WFhfREVWX0lOVF9XQUtFVVAsCisJCQkJICBJU0wzOFhYX0RFVl9JTlRfUkVHKTsKKwkJdWRlbGF5KElTTDM4WFhfV1JJVEVJT19ERUxBWSk7CisKKwkJLyogcGVyZm9ybSBhbm90aGVyIHJlYWQgb24gdGhlIERldmljZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKwkJcmVnID0gcmVhZGwoZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpOworCQl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCWRvX2dldHRpbWVvZmRheSgmY3VycmVudF90aW1lKTsKKwkJREVCVUcoU0hPV19UUkFDSU5HLCAiJTA4bGkuJTA4bGkgRGV2aWNlIHJlZ2lzdGVyIHJlYWQgJTA4eFxuIiwKKwkJICAgICAgY3VycmVudF90aW1lLnR2X3NlYywgKGxvbmcpY3VycmVudF90aW1lLnR2X3VzZWMsIHJlZyk7CisjZW5kaWYKKwl9IGVsc2UgeworCQkvKiBkZXZpY2UgaXMgKHN0aWxsKSBhd2FrZSAgKi8KKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQlERUJVRyhTSE9XX1RSQUNJTkcsICJEZXZpY2UgaXMgaW4gYWN0aXZlIHN0YXRlXG4iKTsKKyNlbmRpZgorCQkvKiB0cmlnZ2VyIHRoZSBkZXZpY2UgYnkgc2V0dGluZyB0aGUgVXBkYXRlIGJpdCBpbiB0aGUgRGV2aWNlIEludCByZWcgKi8KKworCQlpc2wzOHh4X3czMl9mbHVzaChkZXZpY2VfYmFzZSwgSVNMMzhYWF9ERVZfSU5UX1VQREFURSwKKwkJCQkgIElTTDM4WFhfREVWX0lOVF9SRUcpOworCQl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKKwl9Cit9CisKK3ZvaWQKK2lzbDM4eHhfaW50ZXJmYWNlX3Jlc2V0KHZvaWQgX19pb21lbSAqZGV2aWNlX2Jhc2UsIGRtYV9hZGRyX3QgaG9zdF9hZGRyZXNzKQoreworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJREVCVUcoU0hPV19GVU5DVElPTl9DQUxMUywgImlzbDM4eHhfaW50ZXJmYWNlX3Jlc2V0XG4iKTsKKyNlbmRpZgorCisJLyogbG9hZCB0aGUgYWRkcmVzcyBvZiB0aGUgY29udHJvbCBibG9jayBpbiB0aGUgZGV2aWNlICovCisJaXNsMzh4eF93MzJfZmx1c2goZGV2aWNlX2Jhc2UsIGhvc3RfYWRkcmVzcywgSVNMMzhYWF9DVFJMX0JMS19CQVNFX1JFRyk7CisJdWRlbGF5KElTTDM4WFhfV1JJVEVJT19ERUxBWSk7CisKKwkvKiBzZXQgdGhlIHJlc2V0IGJpdCBpbiB0aGUgRGV2aWNlIEludGVycnVwdCBSZWdpc3RlciAqLworCWlzbDM4eHhfdzMyX2ZsdXNoKGRldmljZV9iYXNlLCBJU0wzOFhYX0RFVl9JTlRfUkVTRVQsIElTTDM4WFhfREVWX0lOVF9SRUcpOworCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOworCisJLyogZW5hYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIGRldGVjdGluZyBpbml0aWFsaXphdGlvbiAqLworCisJLyogTm90ZTogRG8gbm90IGVuYWJsZSBvdGhlciBpbnRlcnJ1cHRzIGhlcmUuIFdlIHdhbnQgdGhlCisJICogZGV2aWNlIHRvIGhhdmUgY29tZSB1cCBmaXJzdCAxMDAlIGJlZm9yZSBhbGxvd2luZyBhbnkgb3RoZXIgCisJICogaW50ZXJydXB0cy4gKi8KKwlpc2wzOHh4X3czMl9mbHVzaChkZXZpY2VfYmFzZSwgSVNMMzhYWF9JTlRfSURFTlRfSU5JVCwgSVNMMzhYWF9JTlRfRU5fUkVHKTsKKwl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsgIC8qIGFsbG93IGNvbXBsZXRlIGZ1bGwgcmVzZXQgKi8KK30KKwordm9pZAoraXNsMzh4eF9lbmFibGVfY29tbW9uX2ludGVycnVwdHModm9pZCBfX2lvbWVtICpkZXZpY2VfYmFzZSkgeworCXUzMiByZWc7CisJcmVnID0gKCBJU0wzOFhYX0lOVF9JREVOVF9VUERBVEUgfCAKKwkJCUlTTDM4WFhfSU5UX0lERU5UX1NMRUVQIHwgSVNMMzhYWF9JTlRfSURFTlRfV0FLRVVQKTsKKwlpc2wzOHh4X3czMl9mbHVzaChkZXZpY2VfYmFzZSwgcmVnLCBJU0wzOFhYX0lOVF9FTl9SRUcpOworCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOworfQorCitpbnQKK2lzbDM4eHhfaW5fcXVldWUoaXNsMzh4eF9jb250cm9sX2Jsb2NrICpjYiwgaW50IHF1ZXVlKQoreworCWNvbnN0IHMzMiBkZWx0YSA9IChsZTMyX3RvX2NwdShjYi0+ZHJpdmVyX2N1cnJfZnJhZ1txdWV1ZV0pIC0KKwkJCSAgIGxlMzJfdG9fY3B1KGNiLT5kZXZpY2VfY3Vycl9mcmFnW3F1ZXVlXSkpOworCisJLyogZGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgZnJhZ21lbnRzIGluIHRoZSBxdWV1ZSBkZXBlbmRpbmcgb24gdGhlIHR5cGUKKwkgKiBvZiB0aGUgcXVldWUsIGVpdGhlciB0cmFuc21pdCBvciByZWNlaXZlICovCisKKwlCVUdfT04oZGVsdGEgPCAwKTsJLyogZHJpdmVyIHB0ciBtdXN0IGJlIGFoZWFkIG9mIGRldmljZSBwdHIgKi8KKworCXN3aXRjaCAocXVldWUpIHsKKwkJLyogc2VuZCBxdWV1ZXMgKi8KKwljYXNlIElTTDM4WFhfQ0JfVFhfTUdNVFE6CisJCUJVR19PTihkZWx0YSA+IElTTDM4WFhfQ0JfTUdNVF9RU0laRSk7CisJY2FzZSBJU0wzOFhYX0NCX1RYX0RBVEFfTFE6CisJY2FzZSBJU0wzOFhYX0NCX1RYX0RBVEFfSFE6CisJCUJVR19PTihkZWx0YSA+IElTTDM4WFhfQ0JfVFhfUVNJWkUpOworCQlyZXR1cm4gZGVsdGE7CisJCWJyZWFrOworCisJCS8qIHJlY2VpdmUgcXVldWVzICovCisJY2FzZSBJU0wzOFhYX0NCX1JYX01HTVRROgorCQlCVUdfT04oZGVsdGEgPiBJU0wzOFhYX0NCX01HTVRfUVNJWkUpOworCQlyZXR1cm4gSVNMMzhYWF9DQl9NR01UX1FTSVpFIC0gZGVsdGE7CisJCWJyZWFrOworCisJY2FzZSBJU0wzOFhYX0NCX1JYX0RBVEFfTFE6CisJY2FzZSBJU0wzOFhYX0NCX1JYX0RBVEFfSFE6CisJCUJVR19PTihkZWx0YSA+IElTTDM4WFhfQ0JfUlhfUVNJWkUpOworCQlyZXR1cm4gSVNMMzhYWF9DQl9SWF9RU0laRSAtIGRlbHRhOworCQlicmVhazsKKwl9CisJQlVHKCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF8zOHh4LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF8zOHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzZTQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsXzM4eHguaApAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqICAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaWZuZGVmIF9JU0xfMzhYWF9ICisjZGVmaW5lIF9JU0xfMzhYWF9ICisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjZGVmaW5lIElTTDM4WFhfQ0JfUlhfUVNJWkUgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIElTTDM4WFhfQ0JfVFhfUVNJWkUgICAgICAgICAgICAgICAgICAgICAzMgorCisvKiBJU0wzOFhYIEFjY2VzcyBQb2ludCBTcGVjaWZpYyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBJU0wzOFhYX01BWF9XRFNfTElOS1MgICAgICAgICAgICAgICAgICAgOAorCisvKiBJU0wzOHh4IENsaWVudCBTcGVjaWZpYyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBJU0wzOFhYX1BTTV9BQ1RJVkVfU1RBVEUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJU0wzOFhYX1BTTV9QT1dFUlNBVkVfU1RBVEUgICAgICAgICAgICAgMQorCisvKiBJU0wzOFhYIEhvc3QgSW50ZXJmYWNlIERlZmluaXRpb25zICovCisjZGVmaW5lIElTTDM4WFhfUENJX01FTV9TSVpFICAgICAgICAgICAgICAgICAgICAweDAyMDAwCisjZGVmaW5lIElTTDM4WFhfTUVNT1JZX1dJTkRPV19TSVpFICAgICAgICAgICAgICAweDAxMDAwCisjZGVmaW5lIElTTDM4WFhfREVWX0ZJUk1XQVJFX0FERFJFUyAgICAgICAgICAgICAweDIwMDAwCisjZGVmaW5lIElTTDM4WFhfV1JJVEVJT19ERUxBWSAgICAgICAgICAgICAgICAgICAxMAkvKiBpbiB1cyAqLworI2RlZmluZSBJU0wzOFhYX1JFU0VUX0RFTEFZICAgICAgICAgICAgICAgICAgICAgNTAJLyogaW4gbXMgKi8KKyNkZWZpbmUgSVNMMzhYWF9XQUlUX0NZQ0xFICAgICAgICAgICAgICAgICAgICAgIDEwCS8qIGluIDEwbXMgKi8KKyNkZWZpbmUgSVNMMzhYWF9NQVhfV0FJVF9DWUNMRVMgICAgICAgICAgICAgICAgIDEwCisKKy8qIFBDSSBNZW1vcnkgQXJlYSAqLworI2RlZmluZSBJU0wzOFhYX0hBUkRXQVJFX1JFRyAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIElTTDM4WFhfQ0FSREJVU19DSVMgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgSVNMMzhYWF9ESVJFQ1RfTUVNX1dJTiAgICAgICAgICAgICAgICAgIDB4MTAwMAorCisvKiBIYXJkd2FyZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSVNMMzhYWF9ERVZfSU5UX1JFRyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBJU0wzOFhYX0lOVF9JREVOVF9SRUcgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIElTTDM4WFhfSU5UX0FDS19SRUcgICAgICAgICAgICAgICAgICAgICAweDAwMTQKKyNkZWZpbmUgSVNMMzhYWF9JTlRfRU5fUkVHICAgICAgICAgICAgICAgICAgICAgIDB4MDAxOAorI2RlZmluZSBJU0wzOFhYX0dFTl9QVVJQX0NPTV9SRUdfMSAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIElTTDM4WFhfR0VOX1BVUlBfQ09NX1JFR18yICAgICAgICAgICAgICAweDAwMjQKKyNkZWZpbmUgSVNMMzhYWF9DVFJMX0JMS19CQVNFX1JFRyAgICAgICAgICAgICAgIElTTDM4WFhfR0VOX1BVUlBfQ09NX1JFR18xCisjZGVmaW5lIElTTDM4WFhfRElSX01FTV9CQVNFX1JFRyAgICAgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgSVNMMzhYWF9DVFJMX1NUQVRfUkVHICAgICAgICAgICAgICAgICAgIDB4MDA3OAorCisvKiBIaWdoIGVuZCBtb2JvcyBxdWV1ZSB1cCBwY2kgd3JpdGVzLCB0aGUgZm9sbG93aW5nCisgKiBpcyB1c2VkIHRvICJyZWFkIiBmcm9tIGFmdGVyIGEgd3JpdGUgdG8gZm9yY2UgZmx1c2ggKi8KKyNkZWZpbmUgSVNMMzhYWF9QQ0lfUE9TVElOR19GTFVTSAkJSVNMMzhYWF9JTlRfRU5fUkVHCisKKy8qKgorICogaXNsMzh4eF93MzJfZmx1c2ggLSBQQ0kgaW9tZW0gd3JpdGUgaGVscGVyCisgKiBAYmFzZTogKGhvc3QpIG1lbW9yeSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZQorICogQHZhbDogMzJiaXQgdmFsdWUgKGhvc3Qgb3JkZXIpIHRvIHdyaXRlCisgKiBAb2Zmc2V0OiBieXRlIG9mZnNldCBpbnRvIEBiYXNlIHRvIHdyaXRlIHZhbHVlIHRvCisgKiAKKyAqICBUaGlzIGhlbHBlciB0YWtlcyBjYXJlIG9mIHdyaXRpbmcgYSAzMmJpdCBkYXR1bSB0byB0aGUKKyAqICBzcGVjaWZpZWQgb2Zmc2V0IGludG8gdGhlIGRldmljZSdzIHBjaSBtZW1vcnkgc3BhY2UsIGFuZCBtYWtpbmcgc3VyZSAKKyAqICB0aGUgcGNpIG1lbW9yeSBidWZmZXJzIGdldCBmbHVzaGVkIGJ5IHBlcmZvcm1pbmcgb25lIGhhcm1sZXNzIHJlYWQgCisgKiAgZnJvbSB0aGUgJUlTTDM4WFhfUENJX1BPU1RJTkdfRkxVU0ggb2Zmc2V0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2lzbDM4eHhfdzMyX2ZsdXNoKHZvaWQgX19pb21lbSAqYmFzZSwgdTMyIHZhbCwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJd3JpdGVsKHZhbCwgYmFzZSArIG9mZnNldCk7CisJKHZvaWQpIHJlYWRsKGJhc2UgKyBJU0wzOFhYX1BDSV9QT1NUSU5HX0ZMVVNIKTsKK30KKworLyogRGV2aWNlIEludGVycnVwdCByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIElTTDM4WFhfREVWX0lOVF9SRVNFVCAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgSVNMMzhYWF9ERVZfSU5UX1VQREFURSAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBJU0wzOFhYX0RFVl9JTlRfV0FLRVVQICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIElTTDM4WFhfREVWX0lOVF9TTEVFUCAgICAgICAgICAgICAgICAgICAweDAwMTAKKworLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uL0Fja25vd2xlZGdlL0VuYWJsZSByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIElTTDM4WFhfSU5UX0lERU5UX1VQREFURSAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgSVNMMzhYWF9JTlRfSURFTlRfSU5JVCAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBJU0wzOFhYX0lOVF9JREVOVF9XQUtFVVAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIElTTDM4WFhfSU5UX0lERU5UX1NMRUVQICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgSVNMMzhYWF9JTlRfU09VUkNFUyAgICAgICAgICAgICAgICAgICAgIDB4MDAxRQorCisvKiBDb250cm9sL1N0YXR1cyByZWdpc3RlciBiaXRzICovCisvKiBMb29rcyBsaWtlIHRoZXJlIGFyZSBvdGhlciBtZWFuaW5nZnVsIGJpdHMKKyAgICAweDIwMDA0NDAwIHNlZW4gaW4gbm9ybWFsIG9wZXJhdGlvbiwKKyAgICAweDIwMDA0NGRiIGF0ICd0aW1lb3V0IHdhaXRpbmcgZm9yIG1nbXQgcmVzcG9uc2UnCisqLworI2RlZmluZSBJU0wzOFhYX0NUUkxfU1RBVF9TTEVFUE1PREUgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZQlJU0wzOFhYX0NUUkxfU1RBVF9DTEtSVU4JCTB4MDA4MDAwMDAKKyNkZWZpbmUgSVNMMzhYWF9DVFJMX1NUQVRfUkVTRVQgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgSVNMMzhYWF9DVFJMX1NUQVRfUkFNQk9PVCAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgSVNMMzhYWF9DVFJMX1NUQVRfU1RBUlRIQUxURUQgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgSVNMMzhYWF9DVFJMX1NUQVRfSE9TVF9PVkVSUklERSAgICAgICAgIDB4ODAwMDAwMDAKKworLyogQ29udHJvbCBCbG9jayBkZWZpbml0aW9ucyAqLworI2RlZmluZSBJU0wzOFhYX0NCX1JYX0RBVEFfTFEgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJU0wzOFhYX0NCX1RYX0RBVEFfTFEgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJU0wzOFhYX0NCX1JYX0RBVEFfSFEgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBJU0wzOFhYX0NCX1RYX0RBVEFfSFEgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBJU0wzOFhYX0NCX1JYX01HTVRRICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBJU0wzOFhYX0NCX1RYX01HTVRRICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBJU0wzOFhYX0NCX1FDT1VOVCAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBJU0wzOFhYX0NCX01HTVRfUVNJWkUgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBJU0wzOFhYX01JTl9RVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgNAkvKiBmcmFnbWVudHMgKi8KKworLyogTWVtb3J5IE1hbmFnZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgTUdNVF9GUkFNRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgIDE1MDAJLyogPj0gc2l6ZSBzdHJ1Y3Qgb2JqX2Jzc2xpc3QgKi8KKyNkZWZpbmUgTUdNVF9UWF9GUkFNRV9DT1VOVCAgICAgICAgICAgICAgICAgICAgIDI0CS8qIG1heCA0ICsgc3BhcmUgNCArIDggaW5pdCAqLworI2RlZmluZSBNR01UX1JYX0ZSQU1FX0NPVU5UICAgICAgICAgICAgICAgICAgICAgMjQJLyogNCo0ICsgc3BhcmUgOCAqLworI2RlZmluZSBNR01UX0ZSQU1FX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgKE1HTVRfVFhfRlJBTUVfQ09VTlQgKyBNR01UX1JYX0ZSQU1FX0NPVU5UKQorI2RlZmluZSBDT05UUk9MX0JMT0NLX1NJWkUgICAgICAgICAgICAgICAgICAgICAgMTAyNAkvKiBzaG91bGQgYmUgZW5vdWdoICovCisjZGVmaW5lIFBTTV9GUkFNRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAxNTM2CisjZGVmaW5lIFBTTV9NSU5JTUFMX1NUQVRJT05fQ09VTlQgICAgICAgICAgICAgICA2NAorI2RlZmluZSBQU01fRlJBTUVfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgUFNNX01JTklNQUxfU1RBVElPTl9DT1VOVAorI2RlZmluZSBQU01fQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgUFNNX0ZSQU1FX1NJWkUgKiBQU01fRlJBTUVfQ09VTlQKKyNkZWZpbmUgTUFYX1RSQVBfUlhfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgSE9TVF9NRU1fQkxPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRST0xfQkxPQ0tfU0laRSArIFBTTV9CVUZGRVJfU0laRQorCisvKiBGcmFnbWVudCBwYWNrYWdlIGRlZmluaXRpb25zICovCisjZGVmaW5lIEZSQUdNRU5UX0ZMQUdfTUYgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgTUFYX0ZSQUdNRU5UX1NJWkUgICAgICAgICAgICAgICAgICAgICAgIDE1MzYKKworLyogSW4gbW9uaXRvciBtb2RlIGZyYW1lcyBoYXZlIGEgaGVhZGVyLiBJIGRvbid0IGtub3cgZXhhY3RseSBob3cgYmlnIHRob3NlCisgKiBmcmFtZSBjYW4gYmUgYnV0IEkndmUgbmV2ZXIgc2VlbiBhbnkgZnJhbWUgYmlnZ2VyIHRoYW4gMTU4NC4uLiA6CisgKi8KKyNkZWZpbmUgTUFYX0ZSQUdNRU5UX1NJWkVfUlgJICAgICAgICAgICAgICAgIDE2MDAKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBhZGRyZXNzOwkJLyogcGh5c2ljYWwgYWRkcmVzcyBvbiBob3N0ICovCisJdTE2IHNpemU7CQkvKiBwYWNrZXQgc2l6ZSAqLworCXUxNiBmbGFnczsJCS8qIHNldCBvZiBiaXQtd2lzZSBmbGFncyAqLworfSBpc2wzOHh4X2ZyYWdtZW50OworCitzdHJ1Y3QgaXNsMzh4eF9jYiB7CisJdTMyIGRyaXZlcl9jdXJyX2ZyYWdbSVNMMzhYWF9DQl9RQ09VTlRdOworCXUzMiBkZXZpY2VfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfUUNPVU5UXTsKKwlpc2wzOHh4X2ZyYWdtZW50IHJ4X2RhdGFfbG93W0lTTDM4WFhfQ0JfUlhfUVNJWkVdOworCWlzbDM4eHhfZnJhZ21lbnQgdHhfZGF0YV9sb3dbSVNMMzhYWF9DQl9UWF9RU0laRV07CisJaXNsMzh4eF9mcmFnbWVudCByeF9kYXRhX2hpZ2hbSVNMMzhYWF9DQl9SWF9RU0laRV07CisJaXNsMzh4eF9mcmFnbWVudCB0eF9kYXRhX2hpZ2hbSVNMMzhYWF9DQl9UWF9RU0laRV07CisJaXNsMzh4eF9mcmFnbWVudCByeF9kYXRhX21nbXRbSVNMMzhYWF9DQl9NR01UX1FTSVpFXTsKKwlpc2wzOHh4X2ZyYWdtZW50IHR4X2RhdGFfbWdtdFtJU0wzOFhYX0NCX01HTVRfUVNJWkVdOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgaXNsMzh4eF9jYiBpc2wzOHh4X2NvbnRyb2xfYmxvY2s7CisKKy8qIGRldGVybWluZSBudW1iZXIgb2YgZW50cmllcyBjdXJyZW50bHkgaW4gcXVldWUgKi8KK2ludCBpc2wzOHh4X2luX3F1ZXVlKGlzbDM4eHhfY29udHJvbF9ibG9jayAqY2IsIGludCBxdWV1ZSk7CisKK3ZvaWQgaXNsMzh4eF9kaXNhYmxlX2ludGVycnVwdHModm9pZCBfX2lvbWVtICopOwordm9pZCBpc2wzOHh4X2VuYWJsZV9jb21tb25faW50ZXJydXB0cyh2b2lkIF9faW9tZW0gKik7CisKK3ZvaWQgaXNsMzh4eF9oYW5kbGVfc2xlZXBfcmVxdWVzdChpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKiwgaW50ICosCisJCQkJICB2b2lkIF9faW9tZW0gKik7Cit2b2lkIGlzbDM4eHhfaGFuZGxlX3dha2V1cChpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKiwgaW50ICosIHZvaWQgX19pb21lbSAqKTsKK3ZvaWQgaXNsMzh4eF90cmlnZ2VyX2RldmljZShpbnQsIHZvaWQgX19pb21lbSAqKTsKK3ZvaWQgaXNsMzh4eF9pbnRlcmZhY2VfcmVzZXQodm9pZCBfX2lvbWVtICosIGRtYV9hZGRyX3QpOworCisjZW5kaWYJCQkJLyogX0lTTF8zOFhYX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMjlhOWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCkBAIC0wLDAgKzEsMjc1MCBAQAorLyoKKyAqICAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLgorICogICAgICAgICAgICAoQykgMjAwMywyMDA0IEF1cmVsaWVuIEFsbGVhdW1lIDxzbHRzQGZyZWUuZnI+CisgKiAgICAgICAgICAgIChDKSAyMDAzIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBnbnUub3JnPgorICogICAgICAgICAgICAoQykgMjAwMyBMdWlzIFIuIFJvZHJpZ3VleiA8bWNncm9mQHJ1c2x1Zy5ydXRnZXJzLmVkdT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJwcmlzbWNvbXBhdC5oIgorI2luY2x1ZGUgImlzbF9pb2N0bC5oIgorI2luY2x1ZGUgImlzbHBjaV9tZ3QuaCIKKyNpbmNsdWRlICJpc2xfb2lkLmgiCQkvKiBhZGRpdGlvbmFsIHR5cGVzIGFuZCBkZWZzIGZvciBpc2wzOHh4IGZ3ICovCisjaW5jbHVkZSAib2lkX21ndC5oIgorCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4JLyogTmV3IGRyaXZlciBBUEkgKi8KKworCitzdGF0aWMgdm9pZCBwcmlzbTU0X3dwYV9pZV9hZGQoaXNscGNpX3ByaXZhdGUgKnByaXYsIHU4ICpic3NpZCwKKwkJCQl1OCAqd3BhX2llLCBzaXplX3Qgd3BhX2llX2xlbik7CitzdGF0aWMgc2l6ZV90IHByaXNtNTRfd3BhX2llX2dldChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgdTggKmJzc2lkLCB1OCAqd3BhX2llKTsKK3N0YXRpYyBpbnQgcHJpc201NF9zZXRfd3BhKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKiwKKwkJCQlfX3UzMiAqLCBjaGFyICopOworCisKKy8qKgorICogcHJpc201NF9taWJfbW9kZV9oZWxwZXIgLSBNSUIgY2hhbmdlIG1vZGUgaGVscGVyIGZ1bmN0aW9uCisgKiBAbWliOiB0aGUgJnN0cnVjdCBpc2xwY2lfbWliIG9iamVjdCB0byBtb2RpZnkKKyAqIEBpd19tb2RlOiBuZXcgbW9kZSAoJUlXX01PREVfKikKKyAqIAorICogIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24sIGhlbmNlIGl0IGRvZXMgbm90IGxvY2suIE1ha2Ugc3VyZQorICogIGNhbGxlciBkZWFscyB3aXRoIGxvY2tpbmcgKmlmKiBuZWNlc3NhcnkuIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgCisgKiAgbW9kZS1kZXBlbmRlbnQgbWliIHZhbHVlcyBhbmQgZG9lcyB0aGUgbWFwcGluZyBvZiB0aGUgTGludXggCisgKiAgV2lyZWxlc3MgQVBJIG1vZGVzIHRvIERldmljZSBmaXJtd2FyZSBtb2Rlcy4gSXQgYWxzbyBjaGVja3MgZm9yIAorICogIGNvcnJlY3QgdmFsaWQgTGludXggd2lyZWxlc3MgbW9kZXMuIAorICovCitzdGF0aWMgaW50CitwcmlzbTU0X21pYl9tb2RlX2hlbHBlcihpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgdTMyIGl3X21vZGUpCit7CisJdTMyIGNvbmZpZyA9IElOTF9DT05GSUdfTUFOVUFMUlVOOworCXUzMiBtb2RlLCBic3N0eXBlOworCisJLyogRm9yIG5vdywganVzdCBjYXRjaCBlYXJseSB0aGUgUmVwZWF0ZXIgYW5kIFNlY29uZGFyeSBtb2RlcyBoZXJlICovCisJaWYgKGl3X21vZGUgPT0gSVdfTU9ERV9SRVBFQVQgfHwgaXdfbW9kZSA9PSBJV19NT0RFX1NFQ09ORCkgeworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIiVzKCk6IFNvcnJ5LCBSZXBlYXRlciBtb2RlIGFuZCBTZWNvbmRhcnkgbW9kZSAiCisJCSAgICAgICAiYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJpdi0+aXdfbW9kZSA9IGl3X21vZGU7CisKKwlzd2l0Y2ggKGl3X21vZGUpIHsKKwljYXNlIElXX01PREVfQVVUTzoKKwkJbW9kZSA9IElOTF9NT0RFX0NMSUVOVDsKKwkJYnNzdHlwZSA9IERPVDExX0JTU1RZUEVfQU5ZOworCQlicmVhazsKKwljYXNlIElXX01PREVfQURIT0M6CisJCW1vZGUgPSBJTkxfTU9ERV9DTElFTlQ7CisJCWJzc3R5cGUgPSBET1QxMV9CU1NUWVBFX0lCU1M7CisJCWJyZWFrOworCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJbW9kZSA9IElOTF9NT0RFX0NMSUVOVDsKKwkJYnNzdHlwZSA9IERPVDExX0JTU1RZUEVfSU5GUkE7CisJCWJyZWFrOworCWNhc2UgSVdfTU9ERV9NQVNURVI6CisJCW1vZGUgPSBJTkxfTU9ERV9BUDsKKwkJYnNzdHlwZSA9IERPVDExX0JTU1RZUEVfSU5GUkE7CisJCWJyZWFrOworCWNhc2UgSVdfTU9ERV9NT05JVE9SOgorCQltb2RlID0gSU5MX01PREVfUFJPTUlTQ1VPVVM7CisJCWJzc3R5cGUgPSBET1QxMV9CU1NUWVBFX0FOWTsKKwkJY29uZmlnIHw9IElOTF9DT05GSUdfUlhBTk5FWDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGluaXRfd2RzKQorCQljb25maWcgfD0gSU5MX0NPTkZJR19XRFM7CisJbWd0X3NldChwcml2LCBET1QxMV9PSURfQlNTVFlQRSwgJmJzc3R5cGUpOworCW1ndF9zZXQocHJpdiwgT0lEX0lOTF9DT05GSUcsICZjb25maWcpOworCW1ndF9zZXQocHJpdiwgT0lEX0lOTF9NT0RFLCAmbW9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwcmlzbTU0X21pYl9pbml0IC0gZmlsbCBNSUIgY2FjaGUgd2l0aCBkZWZhdWx0cworICoKKyAqICB0aGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBzdHJ1Y3QgZ2l2ZW4gYXMgQG1pYiB3aXRoIGRlZmF1bHRzLAorICogIG9mIHdoaWNoIG1hbnkgYXJlIHJldHJpZXZlZCBmcm9tIHRoZSBnbG9iYWwgbW9kdWxlIHBhcmFtZXRlcgorICogIHZhcmlhYmxlcy4gIAorICovCisKK3ZvaWQKK3ByaXNtNTRfbWliX2luaXQoaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJdTMyIGNoYW5uZWwsIGF1dGhlbiwgd2VwLCBmaWx0ZXIsIGRvdDF4LCBtbG1lLCBjb25mb3JtYW5jZSwgcG93ZXIsIG1vZGU7CisJc3RydWN0IG9ial9idWZmZXIgcHNtX2J1ZmZlciA9IHsKKwkJLnNpemUgPSBQU01fQlVGRkVSX1NJWkUsCisJCS5hZGRyID0gcHJpdi0+ZGV2aWNlX3BzbV9idWZmZXIKKwl9OworCisJY2hhbm5lbCA9IENBUkRfREVGQVVMVF9DSEFOTkVMOworCWF1dGhlbiA9IENBUkRfREVGQVVMVF9BVVRIRU47CisJd2VwID0gQ0FSRF9ERUZBVUxUX1dFUDsKKwlmaWx0ZXIgPSBDQVJEX0RFRkFVTFRfRklMVEVSOyAvKiAoMCkgRG8gbm90IGZpbHRlciB1bi1lbmNyeXB0ZWQgZGF0YSAqLworCWRvdDF4ID0gQ0FSRF9ERUZBVUxUX0RPVDFYOyAKKwltbG1lID0gQ0FSRF9ERUZBVUxUX01MTUVfTU9ERTsKKwljb25mb3JtYW5jZSA9IENBUkRfREVGQVVMVF9DT05GT1JNQU5DRTsKKwlwb3dlciA9IDEyNzsKKwltb2RlID0gQ0FSRF9ERUZBVUxUX0lXX01PREU7CisKKwltZ3Rfc2V0KHByaXYsIERPVDExX09JRF9DSEFOTkVMLCAmY2hhbm5lbCk7CisJbWd0X3NldChwcml2LCBET1QxMV9PSURfQVVUSEVOQUJMRSwgJmF1dGhlbik7CisJbWd0X3NldChwcml2LCBET1QxMV9PSURfUFJJVkFDWUlOVk9LRUQsICZ3ZXApOworCW1ndF9zZXQocHJpdiwgRE9UMTFfT0lEX1BTTUJVRkZFUiwgJnBzbV9idWZmZXIpOworCW1ndF9zZXQocHJpdiwgRE9UMTFfT0lEX0VYVU5FTkNSWVBURUQsICZmaWx0ZXIpOworCW1ndF9zZXQocHJpdiwgRE9UMTFfT0lEX0RPVDFYRU5BQkxFLCAmZG90MXgpOworCW1ndF9zZXQocHJpdiwgRE9UMTFfT0lEX01MTUVBVVRPTEVWRUwsICZtbG1lKTsKKwltZ3Rfc2V0KHByaXYsIE9JRF9JTkxfRE9UMTFEX0NPTkZPUk1BTkNFLCAmY29uZm9ybWFuY2UpOworCW1ndF9zZXQocHJpdiwgT0lEX0lOTF9PVVRQVVRQT1dFUiwgJnBvd2VyKTsKKworCS8qIFRoaXMgc2V0cyBhbGwgb2YgdGhlIG1vZGUtZGVwZW5kZW50IHZhbHVlcyAqLworCXByaXNtNTRfbWliX21vZGVfaGVscGVyKHByaXYsIG1vZGUpOworfQorCisvKiB0aGlzIHdpbGwgYmUgZXhlY3V0ZWQgb3V0c2lkZSBvZiBhdG9taWMgY29udGV4dCB0aGFua3MgdG8KKyAqIHNjaGVkdWxlX3dvcmsoKSwgdGh1cyB3ZSBjYW4gYXMgd2VsbCB1c2Ugc2xlZXBpbmcgc2VtYXBob3JlCisgKiBsb2NraW5nICovCit2b2lkCitwcmlzbTU0X3VwZGF0ZV9zdGF0cyhpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwljaGFyICpkYXRhOworCWludCBqOworCXN0cnVjdCBvYmpfYnNzIGJzcywgKmJzczI7CisJdW5pb24gb2lkX3Jlc190IHI7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZwcml2LT5zdGF0c19zZW0pKQorCQlyZXR1cm47CisKKy8qIE5vaXNlIGZsb29yLgorICogSSdtIG5vdCBzdXJlIGlmIHRoZSB1bml0IGlzIGRCbS4KKyAqIE5vdGUgOiBJZiB3ZSBhcmUgbm90IGNvbm5lY3RlZCwgdGhpcyB2YWx1ZSBzZWVtcyB0byBiZSBpcnJlbGV2YW50LiAqLworCisJbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9OT0lTRUZMT09SLCAwLCBOVUxMLCAmcik7CisJcHJpdi0+bG9jYWxfaXdzdGF0aXN0aWNzLnF1YWwubm9pc2UgPSByLnU7CisKKy8qIEdldCB0aGUgcnNzaSBvZiB0aGUgbGluay4gVG8gZG8gdGhpcyB3ZSBuZWVkIHRvIHJldHJpZXZlIGEgYnNzLiAqLworCisJLyogRmlyc3QgZ2V0IHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgQVAgd2UgYXJlIGFzc29jaWF0ZWQgd2l0aC4gKi8KKwltZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0JTU0lELCAwLCBOVUxMLCAmcik7CisJZGF0YSA9IHIucHRyOworCisJLyogY29weSB0aGlzIE1BQyB0byB0aGUgYnNzICovCisJbWVtY3B5KGJzcy5hZGRyZXNzLCBkYXRhLCA2KTsKKwlrZnJlZShkYXRhKTsKKworCS8qIG5vdyBhc2sgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGJzcyAqLworCWogPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0JTU0ZJTkQsIDAsICh2b2lkICopICZic3MsICZyKTsKKwlic3MyID0gci5wdHI7CisJLyogcmVwb3J0IHRoZSByc3NpIGFuZCB1c2UgaXQgdG8gY2FsY3VsYXRlCisJICogIGxpbmsgcXVhbGl0eSB0aHJvdWdoIGEgc2lnbmFsLW5vaXNlCisJICogIHJhdGlvICovCisJcHJpdi0+bG9jYWxfaXdzdGF0aXN0aWNzLnF1YWwubGV2ZWwgPSBic3MyLT5yc3NpOworCXByaXYtPmxvY2FsX2l3c3RhdGlzdGljcy5xdWFsLnF1YWwgPQorCSAgICBic3MyLT5yc3NpIC0gcHJpdi0+aXdzdGF0aXN0aWNzLnF1YWwubm9pc2U7CisKKwlrZnJlZShic3MyKTsKKworCS8qIHJlcG9ydCB0aGF0IHRoZSBzdGF0cyBhcmUgbmV3ICovCisJcHJpdi0+bG9jYWxfaXdzdGF0aXN0aWNzLnF1YWwudXBkYXRlZCA9IDB4NzsKKworLyogUnggOiB1bmFibGUgdG8gZGVjcnlwdCB0aGUgTVBEVSAqLworCW1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfUFJJVlJYRkFJTEVELCAwLCBOVUxMLCAmcik7CisJcHJpdi0+bG9jYWxfaXdzdGF0aXN0aWNzLmRpc2NhcmQuY29kZSA9IHIudTsKKworLyogVHggOiBNYXggTUFDIHJldHJpZXMgbnVtIHJlYWNoZWQgKi8KKwltZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX01QRFVUWEZBSUxFRCwgMCwgTlVMTCwgJnIpOworCXByaXYtPmxvY2FsX2l3c3RhdGlzdGljcy5kaXNjYXJkLnJldHJpZXMgPSByLnU7CisKKwl1cCgmcHJpdi0+c3RhdHNfc2VtKTsKKworCXJldHVybjsKK30KKworc3RydWN0IGl3X3N0YXRpc3RpY3MgKgorcHJpc201NF9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCS8qIElmIHRoZSBzdGF0cyBhcmUgYmVpbmcgdXBkYXRlZCByZXR1cm4gb2xkIGRhdGEgKi8KKwlpZiAoZG93bl90cnlsb2NrKCZwcml2LT5zdGF0c19zZW0pID09IDApIHsKKwkJbWVtY3B5KCZwcml2LT5pd3N0YXRpc3RpY3MsICZwcml2LT5sb2NhbF9pd3N0YXRpc3RpY3MsCisJCSAgICAgICBzaXplb2YgKHN0cnVjdCBpd19zdGF0aXN0aWNzKSk7CisJCS8qIFRoZXkgd29uJ3QgYmUgbWFya2VkIHVwZGF0ZWQgZm9yIHRoZSBuZXh0IHRpbWUgKi8KKwkJcHJpdi0+bG9jYWxfaXdzdGF0aXN0aWNzLnF1YWwudXBkYXRlZCA9IDA7CisJCXVwKCZwcml2LT5zdGF0c19zZW0pOworCX0gZWxzZQorCQlwcml2LT5pd3N0YXRpc3RpY3MucXVhbC51cGRhdGVkID0gMDsKKworCS8qIFVwZGF0ZSBvdXIgd2lyZWxlc3Mgc3RhdHMsIGJ1dCBkbyBub3Qgc2NoZWR1bGUgdG8gb2Z0ZW4gCisJICogKG1heCAxIEhaKSAqLworCWlmICgocHJpdi0+c3RhdHNfdGltZXN0YW1wID09IDApIHx8CisJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgcHJpdi0+c3RhdHNfdGltZXN0YW1wICsgMSAqIEhaKSkgeworCQlzY2hlZHVsZV93b3JrKCZwcml2LT5zdGF0c193b3JrKTsKKwkJcHJpdi0+c3RhdHNfdGltZXN0YW1wID0gamlmZmllczsKKwl9CisKKwlyZXR1cm4gJnByaXYtPml3c3RhdGlzdGljczsKK30KKworc3RhdGljIGludAorcHJpc201NF9jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJICAgICAgIGNoYXIgKmN3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwkvKiBzaW1wbHkgcmUtc2V0IHRoZSBsYXN0IHNldCBTU0lELCB0aGlzIHNob3VsZCBjb21taXQgbW9zdCBzdHVmZiAqLworCisJLyogQ29tbWl0IGluIE1vbml0b3IgbW9kZSBpcyBub3QgbmVjZXNzYXJ5LCBhbHNvIHNldHRpbmcgZXNzaWQKKwkgKiBpbiBNb25pdG9yIG1vZGUgZG9lcyBub3QgbWFrZSBzZW5zZSBhbmQgaXNuJ3QgYWxsb3dlZCBmb3IgdGhpcworCSAqIGRldmljZSdzIGZpcm13YXJlICovCisJaWYgKHByaXYtPml3X21vZGUgIT0gSVdfTU9ERV9NT05JVE9SKQorCQlyZXR1cm4gbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9TU0lELCAwLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJpc201NF9nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJIGNoYXIgKmN3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJY2hhciAqY2FwYWJpbGl0aWVzOworCXVuaW9uIG9pZF9yZXNfdCByOworCWludCBydmFsdWU7CisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSA8IFBSVl9TVEFURV9JTklUKSB7CisJCXN0cm5jcHkoY3dycSwgIk5PVCBSRUFEWSEiLCBJRk5BTVNJWik7CisJCXJldHVybiAwOworCX0KKwlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgT0lEX0lOTF9QSFlDQVBBQklMSVRJRVMsIDAsIE5VTEwsICZyKTsKKworCXN3aXRjaCAoci51KSB7CisJY2FzZSBJTkxfUEhZQ0FQXzUwMDBNSFo6CisJCWNhcGFiaWxpdGllcyA9ICJJRUVFIDgwMi4xMWEvYi9nIjsKKwkJYnJlYWs7CisJY2FzZSBJTkxfUEhZQ0FQX0ZBQToKKwkJY2FwYWJpbGl0aWVzID0gIklFRUUgODAyLjExYi9nIC0gRkFBIFN1cHBvcnQiOworCQlicmVhazsKKwljYXNlIElOTF9QSFlDQVBfMjQwME1IWjoKKwlkZWZhdWx0OgorCQljYXBhYmlsaXRpZXMgPSAiSUVFRSA4MDIuMTFiL2ciOwkvKiBEZWZhdWx0ICovCisJCWJyZWFrOworCX0KKwlzdHJuY3B5KGN3cnEsIGNhcGFiaWxpdGllcywgSUZOQU1TSVopOworCXJldHVybiBydmFsdWU7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSBzdHJ1Y3QgaXdfZnJlcSAqZndycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpbnQgcnZhbHVlOworCXUzMiBjOworCisJaWYgKGZ3cnEtPm0gPCAxMDAwKQorCQkvKiB3ZSBoYXZlIGEgY2hhbm5lbCBudW1iZXIgKi8KKwkJYyA9IGZ3cnEtPm07CisJZWxzZQorCQljID0gKGZ3cnEtPmUgPT0gMSkgPyBjaGFubmVsX29mX2ZyZXEoZndycS0+bSAvIDEwMDAwMCkgOiAwOworCisJcnZhbHVlID0gYyA/IG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfQ0hBTk5FTCwgMCwgJmMpIDogLUVJTlZBTDsKKworCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KKwlyZXR1cm4gKHJ2YWx1ZSA/IHJ2YWx1ZSA6IC1FSU5QUk9HUkVTUyk7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfZ2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSBzdHJ1Y3QgaXdfZnJlcSAqZndycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1bmlvbiBvaWRfcmVzX3QgcjsKKwlpbnQgcnZhbHVlOworCisJcnZhbHVlID0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9DSEFOTkVMLCAwLCBOVUxMLCAmcik7CisJZndycS0+aSA9IHIudTsKKwlydmFsdWUgfD0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9GUkVRVUVOQ1ksIDAsIE5VTEwsICZyKTsKKwlmd3JxLT5tID0gci51OworCWZ3cnEtPmUgPSAzOworCisJcmV0dXJuIHJ2YWx1ZTsKK30KKworc3RhdGljIGludAorcHJpc201NF9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJIF9fdTMyICogdXdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1MzIgbWxtZWF1dG9sZXZlbCA9IENBUkRfREVGQVVMVF9NTE1FX01PREU7CisKKwkvKiBMZXQncyBzZWUgaWYgdGhlIHVzZXIgcGFzc2VkIGEgdmFsaWQgTGludXggV2lyZWxlc3MgbW9kZSAqLworCWlmICgqdXdycSA+IElXX01PREVfTU9OSVRPUiB8fCAqdXdycSA8IElXX01PREVfQVVUTykgeworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIiVzOiAlcygpIFlvdSBwYXNzZWQgYSBub24tdmFsaWQgaW5pdF9tb2RlLlxuIiwKKwkJICAgICAgIHByaXYtPm5kZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRvd25fd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCisJaWYgKHByaXNtNTRfbWliX21vZGVfaGVscGVyKHByaXYsICp1d3JxKSkgeworCQl1cF93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwkvKiB0aGUgQUNMIGNvZGUgbmVlZHMgYW4gaW50ZXJtZWRpYXRlIG1sbWVhdXRvbGV2ZWwuIFRoZSB3cGEgc3R1ZmYgYW4KKwkgKiBleHRlbmRlZCBvbmUuCisJICovCisJaWYgKCgqdXdycSA9PSBJV19NT0RFX01BU1RFUikgJiYgKHByaXYtPmFjbC5wb2xpY3kgIT0gTUFDX1BPTElDWV9PUEVOKSkKKwkJbWxtZWF1dG9sZXZlbCA9IERPVDExX01MTUVfSU5URVJNRURJQVRFOworCWlmIChwcml2LT53cGEpCisJCW1sbWVhdXRvbGV2ZWwgPSBET1QxMV9NTE1FX0VYVEVOREVEOworCisJbWd0X3NldChwcml2LCBET1QxMV9PSURfTUxNRUFVVE9MRVZFTCwgJm1sbWVhdXRvbGV2ZWwpOworCisJaWYgKG1ndF9jb21taXQocHJpdikpIHsKKwkJdXBfd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcHJpdi0+bmRldi0+dHlwZSA9IChwcml2LT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKKwkgICAgPyBwcml2LT5tb25pdG9yX3R5cGUgOiBBUlBIUkRfRVRIRVI7CisJdXBfd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFVzZSBtaWIgY2FjaGUgKi8KK3N0YXRpYyBpbnQKK3ByaXNtNTRfZ2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSBfX3UzMiAqIHV3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlCVUdfT04oKHByaXYtPml3X21vZGUgPCBJV19NT0RFX0FVVE8pIHx8IChwcml2LT5pd19tb2RlID4KKwkJCQkJCSAgSVdfTU9ERV9NT05JVE9SKSk7CisJKnV3cnEgPSBwcml2LT5pd19tb2RlOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHdlIHVzZSBET1QxMV9PSURfRURUSFJFU0hPTEQuIEZyb20gd2hhdCBJIGd1ZXNzIHRoZSBjYXJkIHdpbGwgbm90IHRyeSB0bworICogZW1pdCBkYXRhIGlmIChzZW5zaXRpdml0eSA+IHJzc2kgLSBub2lzZSkgKGluIGRCbSkuCisgKiBwcmlzbTU0X3NldF9zZW5zIGRvZXMgbm90IHNlZW0gdG8gd29yay4KKyAqLworCitzdGF0aWMgaW50CitwcmlzbTU0X3NldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXUzMiBzZW5zOworCisJLyogYnkgZGVmYXVsdCAgdGhlIGNhcmQgc2V0cyB0aGlzIHRvIDIwLiAqLworCXNlbnMgPSB2d3JxLT5kaXNhYmxlZCA/IDIwIDogdndycS0+dmFsdWU7CisKKwlyZXR1cm4gbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9FRFRIUkVTSE9MRCwgMCwgJnNlbnMpOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXVuaW9uIG9pZF9yZXNfdCByOworCWludCBydmFsdWU7CisKKwlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0VEVEhSRVNIT0xELCAwLCBOVUxMLCAmcik7CisKKwl2d3JxLT52YWx1ZSA9IHIudTsKKwl2d3JxLT5kaXNhYmxlZCA9ICh2d3JxLT52YWx1ZSA9PSAwKTsKKwl2d3JxLT5maXhlZCA9IDE7CisKKwlyZXR1cm4gcnZhbHVlOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJdTggKmRhdGE7CisJaW50IGksIG0sIHJ2YWx1ZTsKKwlzdHJ1Y3Qgb2JqX2ZyZXF1ZW5jaWVzICpmcmVxOworCXVuaW9uIG9pZF9yZXNfdCByOworCisJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2YgKHN0cnVjdCBpd19yYW5nZSkpOworCWR3cnEtPmxlbmd0aCA9IHNpemVvZiAoc3RydWN0IGl3X3JhbmdlKTsKKworCS8qIHNldCB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9uIHZlcnNpb24gbnVtYmVyICovCisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gU1VQUE9SVEVEX1dJUkVMRVNTX0VYVDsKKwlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKworCS8qIE5vdyB0aGUgZW5jb2RpbmcgY2FwYWJpbGl0aWVzICovCisJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDM7CisJLyogNjQoNDApIGJpdHMgV0VQICovCisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSA1OworCS8qIDEyOCgxMDQpIGJpdHMgV0VQICovCisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMV0gPSAxMzsKKwkvKiAyNTYgYml0cyBmb3IgV1BBLVBTSyAqLworCXJhbmdlLT5lbmNvZGluZ19zaXplWzJdID0gMzI7CisJLyogNCBrZXlzIGFyZSBhbGxvd2VkICovCisJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSA0OworCisJLyogd2UgZG9uJ3Qga25vdyB0aGUgcXVhbGl0eSByYW5nZS4uLiAqLworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDA7CisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMDsKKwlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDA7CisJLyogdGhlc2UgdmFsdWUgZGVzY3JpYmUgYW4gYXZlcmFnZSBxdWFsaXR5LiBOZWVkcyBtb3JlIHR3ZWFraW5nLi4uICovCisJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gLTgwOwkvKiAtODAgZEJtICovCisJcmFuZ2UtPmF2Z19xdWFsLm5vaXNlID0gMDsJLyogZG9uJ3Qga25vdyB3aGF0IHRvIHB1dCBoZXJlICovCisJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSAwOworCisJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMjAwOworCisJLyogcmV0cnkgbGltaXQgY2FwYWJpbGl0aWVzICovCisJcmFuZ2UtPnJldHJ5X2NhcGEgPSBJV19SRVRSWV9MSU1JVCB8IElXX1JFVFJZX0xJRkVUSU1FOworCXJhbmdlLT5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUOworCXJhbmdlLT5yX3RpbWVfZmxhZ3MgPSBJV19SRVRSWV9MSUZFVElNRTsKKworCS8qIEkgZG9uJ3Qga25vdyB0aGUgcmFuZ2UuIFB1dCBzdHVwaWQgdGhpbmdzIGhlcmUgKi8KKwlyYW5nZS0+bWluX3JldHJ5ID0gMTsKKwlyYW5nZS0+bWF4X3JldHJ5ID0gNjU1MzU7CisJcmFuZ2UtPm1pbl9yX3RpbWUgPSAxMDI0OworCXJhbmdlLT5tYXhfcl90aW1lID0gNjU1MzUgKiAxMDI0OworCisJLyogdHhwb3dlciBpcyBzdXBwb3J0ZWQgaW4gZEJtJ3MgKi8KKwlyYW5nZS0+dHhwb3dlcl9jYXBhID0gSVdfVFhQT1dfREJNOworCisjaWYgV0lSRUxFU1NfRVhUID4gMTYKKwkvKiBFdmVudCBjYXBhYmlsaXR5IChrZXJuZWwgKyBkcml2ZXIpICovCisJcmFuZ2UtPmV2ZW50X2NhcGFbMF0gPSAoSVdfRVZFTlRfQ0FQQV9LXzAgfAorCUlXX0VWRU5UX0NBUEFfTUFTSyhTSU9DR0lXVEhSU1BZKSB8CisJSVdfRVZFTlRfQ0FQQV9NQVNLKFNJT0NHSVdBUCkpOworCXJhbmdlLT5ldmVudF9jYXBhWzFdID0gSVdfRVZFTlRfQ0FQQV9LXzE7CisJcmFuZ2UtPmV2ZW50X2NhcGFbNF0gPSBJV19FVkVOVF9DQVBBX01BU0soSVdFVkNVU1RPTSk7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTYgKi8KKworCWlmIChpc2xwY2lfZ2V0X3N0YXRlKHByaXYpIDwgUFJWX1NUQVRFX0lOSVQpCisJCXJldHVybiAwOworCisJLyogUmVxdWVzdCB0aGUgZGV2aWNlIGZvciB0aGUgc3VwcG9ydGVkIGZyZXF1ZW5jaWVzCisJICogbm90IHJlYWxseSByZWxldmFudCBzaW5jZSBzb21lIGRldmljZXMgd2lsbCByZXBvcnQgdGhlIDUgR0h6IGJhbmQKKwkgKiBmcmVxdWVuY2llcyBldmVuIGlmIHRoZXkgZG9uJ3Qgc3VwcG9ydCB0aGVtLgorCSAqLworCXJ2YWx1ZSA9CisJICAgIG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfU1VQUE9SVEVERlJFUVVFTkNJRVMsIDAsIE5VTEwsICZyKTsKKwlmcmVxID0gci5wdHI7CisKKwlyYW5nZS0+bnVtX2NoYW5uZWxzID0gZnJlcS0+bnI7CisJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSBmcmVxLT5ucjsKKworCW0gPSBtaW4oSVdfTUFYX0ZSRVFVRU5DSUVTLCAoaW50KSBmcmVxLT5ucik7CisJZm9yIChpID0gMDsgaSA8IG07IGkrKykgeworCQlyYW5nZS0+ZnJlcVtpXS5tID0gZnJlcS0+bWh6W2ldOworCQlyYW5nZS0+ZnJlcVtpXS5lID0gNjsKKwkJcmFuZ2UtPmZyZXFbaV0uaSA9IGNoYW5uZWxfb2ZfZnJlcShmcmVxLT5taHpbaV0pOworCX0KKwlrZnJlZShmcmVxKTsKKworCXJ2YWx1ZSB8PSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1NVUFBPUlRFRFJBVEVTLCAwLCBOVUxMLCAmcik7CisJZGF0YSA9IHIucHRyOworCisJLyogV2UgZ290IGFuIGFycmF5IG9mIGNoYXIuIEl0IGlzIE5VTEwgdGVybWluYXRlZC4gKi8KKwlpID0gMDsKKwl3aGlsZSAoKGkgPCBJV19NQVhfQklUUkFURVMpICYmICgqZGF0YSAhPSAwKSkgeworCQkvKiAgICAgICB0aGUgcmVzdWx0IG11c3QgYmUgaW4gYnBzLiBUaGUgY2FyZCBnaXZlcyB1cyA1MDBLYnBzICovCisJCXJhbmdlLT5iaXRyYXRlW2ldID0gKmRhdGEgKiA1MDAwMDA7CisJCWkrKzsKKwkJZGF0YSsrOworCX0KKwlyYW5nZS0+bnVtX2JpdHJhdGVzID0gaTsKKwlrZnJlZShyLnB0cik7CisKKwlyZXR1cm4gcnZhbHVlOworfQorCisvKiBTZXQgQVAgYWRkcmVzcyovCisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IHNvY2thZGRyICphd3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCWNoYXIgYnNzaWRbNl07CisJaW50IHJ2YWx1ZTsKKworCWlmIChhd3JxLT5zYV9mYW1pbHkgIT0gQVJQSFJEX0VUSEVSKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHByZXBhcmUgdGhlIHN0cnVjdHVyZSBmb3IgdGhlIHNldCBvYmplY3QgKi8KKwltZW1jcHkoJmJzc2lkWzBdLCBhd3JxLT5zYV9kYXRhLCA2KTsKKworCS8qIHNldCB0aGUgYnNzaWQgLS0gZG9lcyB0aGlzIG1ha2Ugc2Vuc2Ugd2hlbiBpbiBBUCBtb2RlPyAqLworCXJ2YWx1ZSA9IG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfQlNTSUQsIDAsICZic3NpZCk7CisKKwlyZXR1cm4gKHJ2YWx1ZSA/IHJ2YWx1ZSA6IC1FSU5QUk9HUkVTUyk7CS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KK30KKworLyogZ2V0IEFQIGFkZHJlc3MqLworCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF93YXAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBzb2NrYWRkciAqYXdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1bmlvbiBvaWRfcmVzX3QgcjsKKwlpbnQgcnZhbHVlOworCisJcnZhbHVlID0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9CU1NJRCwgMCwgTlVMTCwgJnIpOworCW1lbWNweShhd3JxLT5zYV9kYXRhLCByLnB0ciwgNik7CisJYXdycS0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCWtmcmVlKHIucHRyKTsKKworCXJldHVybiBydmFsdWU7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJLyogaGVoZSB0aGUgZGV2aWNlIGRvZXMgdGhpcyBhdXRvbWFnaWNhbHkgKi8KKwlyZXR1cm4gMDsKK30KKworLyogYSBsaXR0bGUgaGVscGVyIHRoYXQgd2lsbCB0cmFuc2xhdGUgb3VyIGRhdGEgaW50byBhIGNhcmQgaW5kZXBlbmRlbnQKKyAqIGZvcm1hdCB0aGF0IHRoZSBXaXJlbGVzcyBUb29scyB3aWxsIHVuZGVyc3RhbmQuIFRoaXMgd2FzIGluc3BpcmVkIGJ5CisgKiB0aGUgIkFpcm9uZXQgZHJpdmVyIGZvciA0NTAwIGFuZCA0ODAwIHNlcmllcyBjYXJkcyIgKEdQTCkKKyAqLworCitzdGF0aWMgY2hhciAqCitwcmlzbTU0X3RyYW5zbGF0ZV9ic3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGNoYXIgKmN1cnJlbnRfZXYsCisJCSAgICAgIGNoYXIgKmVuZF9idWYsIHN0cnVjdCBvYmpfYnNzICpic3MsIGNoYXIgbm9pc2UpCit7CisJc3RydWN0IGl3X2V2ZW50IGl3ZTsJLyogVGVtcG9yYXJ5IGJ1ZmZlciAqLworCXNob3J0IGNhcDsKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJLyogVGhlIGZpcnN0IGVudHJ5IG11c3QgYmUgdGhlIE1BQyBhZGRyZXNzICovCisJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgYnNzLT5hZGRyZXNzLCA2KTsKKwlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwlpd2UuY21kID0gU0lPQ0dJV0FQOworCWN1cnJlbnRfZXYgPQorCSAgICBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9BRERSX0xFTik7CisKKwkvKiBUaGUgZm9sbG93aW5nIGVudHJpZXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHNhbWUgb3JkZXIgd2UgZ2l2ZSB0aGVtICovCisKKwkvKiBUaGUgRVNTSUQuICovCisJaXdlLnUuZGF0YS5sZW5ndGggPSBic3MtPnNzaWQubGVuZ3RoOworCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOworCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CisJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGN1cnJlbnRfZXYsIGVuZF9idWYsCisJCQkJCSAgJml3ZSwgYnNzLT5zc2lkLm9jdGV0cyk7CisKKwkvKiBDYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgQ0FQX0VTUyAweDAxCisjZGVmaW5lIENBUF9JQlNTIDB4MDIKKyNkZWZpbmUgQ0FQX0NSWVBUIDB4MTAKKworCS8qIE1vZGUgKi8KKwljYXAgPSBic3MtPmNhcGluZm87CisJaXdlLnUubW9kZSA9IDA7CisJaWYgKGNhcCAmIENBUF9FU1MpCisJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX01BU1RFUjsKKwllbHNlIGlmIChjYXAgJiBDQVBfSUJTUykKKwkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7CisJaXdlLmNtZCA9IFNJT0NHSVdNT0RFOworCWlmIChpd2UudS5tb2RlKQorCQljdXJyZW50X2V2ID0KKwkJICAgIGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsCisJCQkJCSBJV19FVl9VSU5UX0xFTik7CisKKwkvKiBFbmNyeXB0aW9uIGNhcGFiaWxpdHkgKi8KKwlpZiAoY2FwICYgQ0FQX0NSWVBUKQorCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7CisJZWxzZQorCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCWl3ZS51LmRhdGEubGVuZ3RoID0gMDsKKwlpd2UuY21kID0gU0lPQ0dJV0VOQ09ERTsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgTlVMTCk7CisKKwkvKiBBZGQgZnJlcXVlbmN5LiAoc2hvcnQpIGJzcy0+Y2hhbm5lbCBpcyB0aGUgZnJlcXVlbmN5IGluIE1IeiAqLworCWl3ZS51LmZyZXEubSA9IGJzcy0+Y2hhbm5lbDsKKwlpd2UudS5mcmVxLmUgPSA2OworCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKwljdXJyZW50X2V2ID0KKwkgICAgaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfRlJFUV9MRU4pOworCisJLyogQWRkIHF1YWxpdHkgc3RhdGlzdGljcyAqLworCWl3ZS51LnF1YWwubGV2ZWwgPSBic3MtPnJzc2k7CisJaXdlLnUucXVhbC5ub2lzZSA9IG5vaXNlOworCS8qIGRvIGEgc2ltcGxlIFNOUiBmb3IgcXVhbGl0eSAqLworCWl3ZS51LnF1YWwucXVhbCA9IGJzcy0+cnNzaSAtIG5vaXNlOworCWl3ZS5jbWQgPSBJV0VWUVVBTDsKKwljdXJyZW50X2V2ID0KKwkgICAgaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOworCisJaWYgKHByaXYtPndwYSkgeworCQl1OCB3cGFfaWVbTUFYX1dQQV9JRV9MRU5dOworCQljaGFyICpidWYsICpwOworCQlzaXplX3Qgd3BhX2llX2xlbjsKKwkJaW50IGk7CisKKwkJd3BhX2llX2xlbiA9IHByaXNtNTRfd3BhX2llX2dldChwcml2LCBic3MtPmFkZHJlc3MsIHdwYV9pZSk7CisJCWlmICh3cGFfaWVfbGVuID4gMCAmJgorCQkgICAgKGJ1ZiA9IGttYWxsb2Mod3BhX2llX2xlbiAqIDIgKyAxMCwgR0ZQX0FUT01JQykpKSB7CisJCQlwID0gYnVmOworCQkJcCArPSBzcHJpbnRmKHAsICJ3cGFfaWU9Iik7CisJCQlmb3IgKGkgPSAwOyBpIDwgd3BhX2llX2xlbjsgaSsrKSB7CisJCQkJcCArPSBzcHJpbnRmKHAsICIlMDJ4Iiwgd3BhX2llW2ldKTsKKwkJCX0KKwkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YgKGl3ZSkpOworCQkJaXdlLmNtZCA9IElXRVZDVVNUT007CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOworCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGN1cnJlbnRfZXYsIGVuZF9idWYsCisJCQkJCQkJICAmaXdlLCBidWYpOworCQkJa2ZyZWUoYnVmKTsKKwkJfQorCX0KKwlyZXR1cm4gY3VycmVudF9ldjsKK30KKworc3RhdGljIGludAorcHJpc201NF9nZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpbnQgaSwgcnZhbHVlOworCXN0cnVjdCBvYmpfYnNzbGlzdCAqYnNzbGlzdDsKKwl1MzIgbm9pc2UgPSAwOworCWNoYXIgKmN1cnJlbnRfZXYgPSBleHRyYTsKKwl1bmlvbiBvaWRfcmVzX3QgcjsKKworCWlmIChpc2xwY2lfZ2V0X3N0YXRlKHByaXYpIDwgUFJWX1NUQVRFX0lOSVQpIHsKKwkJLyogZGV2aWNlIGlzIG5vdCByZWFkeSwgZmFpbCBnZW50bHkgKi8KKwkJZHdycS0+bGVuZ3RoID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZmlyc3QgZ2V0IHRoZSBub2lzZSB2YWx1ZS4gV2Ugd2lsbCB1c2UgaXQgdG8gcmVwb3J0IHRoZSBsaW5rIHF1YWxpdHkgKi8KKwlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX05PSVNFRkxPT1IsIDAsIE5VTEwsICZyKTsKKwlub2lzZSA9IHIudTsKKworCS8qIEFzayB0aGUgZGV2aWNlIGZvciBhIGxpc3Qgb2Yga25vd24gYnNzLgorCSogVGhlIG9sZCBBUEksIHVzaW5nIFNJT0NHSVdBUExJU1QsIGhhZCBhIGhhcmQgbGltaXQgb2YgSVdfTUFYX0FQPTY0LgorCSogVGhlIG5ldyBBUEksIHVzaW5nIFNJT0NHSVdTQ0FOLCBpcyBvbmx5IGxpbWl0ZWQgYnkgdGhlIGJ1ZmZlciBzaXplLgorCSogV0UtMTQtPldFLTE2LCB0aGUgYnVmZmVyIGlzIGxpbWl0ZWQgdG8gSVdfU0NBTl9NQVhfREFUQSBieXRlcy4KKwkqIFN0YXJ0aW5nIHdpdGggV0UtMTcsIHRoZSBidWZmZXIgY2FuIGJlIGFzIGJpZyBhcyBuZWVkZWQuCisJKiBCdXQgdGhlIGRldmljZSB3b24ndCByZXBwb3J0IGFueXRoaW5nIGlmIHlvdSBjaGFuZ2UgdGhlIHZhbHVlCisJKiBvZiBJV01BWF9CU1M9MjQuICovCisJCisJcnZhbHVlIHw9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfQlNTTElTVCwgMCwgTlVMTCwgJnIpOworCWJzc2xpc3QgPSByLnB0cjsKKworCS8qIG9rIG5vdywgc2NhbiB0aGUgbGlzdCBhbmQgdHJhbnNsYXRlIGl0cyBpbmZvICovCisJZm9yIChpID0gMDsgaSA8IChpbnQpIGJzc2xpc3QtPm5yOyBpKyspIHsKKwkJY3VycmVudF9ldiA9IHByaXNtNTRfdHJhbnNsYXRlX2JzcyhuZGV2LCBjdXJyZW50X2V2LAorCQkJCQkJICAgZXh0cmEgKyBkd3JxLT5sZW5ndGgsCisJCQkJCQkgICAmKGJzc2xpc3QtPmJzc2xpc3RbaV0pLAorCQkJCQkJICAgbm9pc2UpOworI2lmIFdJUkVMRVNTX0VYVCA+IDE2CisJCS8qIENoZWNrIGlmIHRoZXJlIGlzIHNwYWNlIGZvciBvbmUgbW9yZSBlbnRyeSAqLworCQlpZigoZXh0cmEgKyBkd3JxLT5sZW5ndGggLSBjdXJyZW50X2V2KSA8PSBJV19FVl9BRERSX0xFTikgeworCQkJLyogQXNrIHVzZXIgc3BhY2UgdG8gdHJ5IGFnYWluIHdpdGggYSBiaWdnZXIgYnVmZmVyICovCisJCQlydmFsdWUgPSAtRTJCSUc7CisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDE2ICovCisJfQorCisJa2ZyZWUoYnNzbGlzdCk7CisJZHdycS0+bGVuZ3RoID0gKGN1cnJlbnRfZXYgLSBleHRyYSk7CisJZHdycS0+ZmxhZ3MgPSAwOwkvKiB0b2RvICovCisKKwlyZXR1cm4gcnZhbHVlOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X3NldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IG9ial9zc2lkIGVzc2lkOworCisJbWVtc2V0KGVzc2lkLm9jdGV0cywgMCwgMzMpOworCisJLyogQ2hlY2sgaWYgd2Ugd2VyZSBhc2tlZCBmb3IgYGFueScgKi8KKwlpZiAoZHdycS0+ZmxhZ3MgJiYgZHdycS0+bGVuZ3RoKSB7CisJCWlmIChkd3JxLT5sZW5ndGggPiBtaW4oMzMsIElXX0VTU0lEX01BWF9TSVpFICsgMSkpCisJCQlyZXR1cm4gLUUyQklHOworCQllc3NpZC5sZW5ndGggPSBkd3JxLT5sZW5ndGggLSAxOworCQltZW1jcHkoZXNzaWQub2N0ZXRzLCBleHRyYSwgZHdycS0+bGVuZ3RoKTsKKwl9IGVsc2UKKwkJZXNzaWQubGVuZ3RoID0gMDsKKworCWlmIChwcml2LT5pd19tb2RlICE9IElXX01PREVfTU9OSVRPUikKKwkJcmV0dXJuIG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfU1NJRCwgMCwgJmVzc2lkKTsKKworCS8qIElmIGluIG1vbml0b3IgbW9kZSwganVzdCBzYXZlIHRvIG1pYiAqLworCW1ndF9zZXQocHJpdiwgRE9UMTFfT0lEX1NTSUQsICZlc3NpZCk7CisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludAorcHJpc201NF9nZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBvYmpfc3NpZCAqZXNzaWQ7CisJdW5pb24gb2lkX3Jlc190IHI7CisJaW50IHJ2YWx1ZTsKKworCXJ2YWx1ZSA9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfU1NJRCwgMCwgTlVMTCwgJnIpOworCWVzc2lkID0gci5wdHI7CisKKwlpZiAoZXNzaWQtPmxlbmd0aCkgeworCQlkd3JxLT5mbGFncyA9IDE7CS8qIHNldCBFU1NJRCB0byBPTiBmb3IgV2lyZWxlc3MgRXh0ZW5zaW9ucyAqLworCQkvKiBpZiBpdCBpcyB0byBiaWcsIHRydW5rIGl0ICovCisJCWR3cnEtPmxlbmd0aCA9IG1pbihJV19FU1NJRF9NQVhfU0laRSwgZXNzaWQtPmxlbmd0aCArIDEpOworCX0gZWxzZSB7CisJCWR3cnEtPmZsYWdzID0gMDsKKwkJZHdycS0+bGVuZ3RoID0gMDsKKwl9CisJZXNzaWQtPm9jdGV0c1tlc3NpZC0+bGVuZ3RoXSA9ICdcMCc7CisJbWVtY3B5KGV4dHJhLCBlc3NpZC0+b2N0ZXRzLCBkd3JxLT5sZW5ndGgpOworCWtmcmVlKGVzc2lkKTsKKworCXJldHVybiBydmFsdWU7Cit9CisKKy8qIFByb3ZpZGVzIG5vIGZ1bmN0aW9uYWxpdHksIGp1c3QgY29tcGxldGVzIHRoZSBpb2N0bC4gSW4gZXNzZW5jZSB0aGlzIGlzIGEgCisgKiBqdXN0IGEgY29zbWV0aWMgaW9jdGwuCisgKi8KK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X25pY2soc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlpZiAoZHdycS0+bGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpCisJCXJldHVybiAtRTJCSUc7CisKKwlkb3duX3dyaXRlKCZwcml2LT5taWJfc2VtKTsKKwltZW1zZXQocHJpdi0+bmlja25hbWUsIDAsIHNpemVvZiAocHJpdi0+bmlja25hbWUpKTsKKwltZW1jcHkocHJpdi0+bmlja25hbWUsIGV4dHJhLCBkd3JxLT5sZW5ndGgpOworCXVwX3dyaXRlKCZwcml2LT5taWJfc2VtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF9uaWNrKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJZHdycS0+bGVuZ3RoID0gMDsKKworCWRvd25fcmVhZCgmcHJpdi0+bWliX3NlbSk7CisJZHdycS0+bGVuZ3RoID0gc3RybGVuKHByaXYtPm5pY2tuYW1lKSArIDE7CisJbWVtY3B5KGV4dHJhLCBwcml2LT5uaWNrbmFtZSwgZHdycS0+bGVuZ3RoKTsKKwl1cF9yZWFkKCZwcml2LT5taWJfc2VtKTsKKworCXJldHVybiAwOworfQorCisvKiBTZXQgdGhlIGFsbG93ZWQgQml0cmF0ZXMgKi8KKworc3RhdGljIGludAorcHJpc201NF9zZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQoreworCisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1MzIgcmF0ZSwgcHJvZmlsZTsKKwljaGFyICpkYXRhOworCWludCByZXQsIGk7CisJdW5pb24gb2lkX3Jlc190IHI7CisKKwlpZiAodndycS0+dmFsdWUgPT0gLTEpIHsKKwkJLyogYXV0byBtb2RlLiBObyBsaW1pdC4gKi8KKwkJcHJvZmlsZSA9IDE7CisJCXJldHVybiBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1BST0ZJTEVTLCAwLCAmcHJvZmlsZSk7CisJfQorCisJcmV0ID0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9TVVBQT1JURURSQVRFUywgMCwgTlVMTCwgJnIpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUoci5wdHIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJhdGUgPSAodTMyKSAodndycS0+dmFsdWUgLyA1MDAwMDApOworCWRhdGEgPSByLnB0cjsKKwlpID0gMDsKKworCXdoaWxlIChkYXRhW2ldKSB7CisJCWlmIChyYXRlICYmIChkYXRhW2ldID09IHJhdGUpKSB7CisJCQlicmVhazsKKwkJfQorCQlpZiAodndycS0+dmFsdWUgPT0gaSkgeworCQkJYnJlYWs7CisJCX0KKwkJZGF0YVtpXSB8PSAweDgwOworCQlpKys7CisJfQorCisJaWYgKCFkYXRhW2ldKSB7CisJCWtmcmVlKHIucHRyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGF0YVtpXSB8PSAweDgwOworCWRhdGFbaSArIDFdID0gMDsKKworCS8qIE5vdywgY2hlY2sgaWYgd2Ugd2FudCBhIGZpeGVkIG9yIGF1dG8gdmFsdWUgKi8KKwlpZiAodndycS0+Zml4ZWQpIHsKKwkJZGF0YVswXSA9IGRhdGFbaV07CisJCWRhdGFbMV0gPSAwOworCX0KKworLyoKKwlpID0gMDsKKwlwcmludGsoInByaXNtNTQgcmF0ZTogIik7CisJd2hpbGUoZGF0YVtpXSkgeworCQlwcmludGsoIiV1ICIsIGRhdGFbaV0pOworCQlpKys7CisJfQorCXByaW50aygiMFxuIik7CisqLworCXByb2ZpbGUgPSAtMTsKKwlyZXQgPSBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1BST0ZJTEVTLCAwLCAmcHJvZmlsZSk7CisJcmV0IHw9IG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfRVhURU5ERURSQVRFUywgMCwgZGF0YSk7CisJcmV0IHw9IG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfUkFURVMsIDAsIGRhdGEpOworCisJa2ZyZWUoci5wdHIpOworCisJcmV0dXJuIHJldDsKK30KKworLyogR2V0IHRoZSBjdXJyZW50IGJpdCByYXRlICovCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpbnQgcnZhbHVlOworCWNoYXIgKmRhdGE7CisJdW5pb24gb2lkX3Jlc190IHI7CisKKwkvKiBHZXQgdGhlIGN1cnJlbnQgYml0IHJhdGUgKi8KKwlpZiAoKHJ2YWx1ZSA9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBHRU5fT0lEX0xJTktTVEFURSwgMCwgTlVMTCwgJnIpKSkKKwkJcmV0dXJuIHJ2YWx1ZTsKKwl2d3JxLT52YWx1ZSA9IHIudSAqIDUwMDAwMDsKKworCS8qIHJlcXVlc3QgdGhlIGRldmljZSBmb3IgdGhlIGVuYWJsZWQgcmF0ZXMgKi8KKwlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1JBVEVTLCAwLCBOVUxMLCAmcik7CisJaWYgKHJ2YWx1ZSkgeworCQlrZnJlZShyLnB0cik7CisJCXJldHVybiBydmFsdWU7CisJfQorCWRhdGEgPSByLnB0cjsKKwl2d3JxLT5maXhlZCA9IChkYXRhWzBdICE9IDApICYmIChkYXRhWzFdID09IDApOworCWtmcmVlKHIucHRyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X3NldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCXJldHVybiBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1JUU1RIUkVTSCwgMCwgJnZ3cnEtPnZhbHVlKTsKK30KKworc3RhdGljIGludAorcHJpc201NF9nZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJdW5pb24gb2lkX3Jlc190IHI7CisJaW50IHJ2YWx1ZTsKKworCS8qIGdldCB0aGUgcnRzIHRocmVzaG9sZCAqLworCXJ2YWx1ZSA9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfUlRTVEhSRVNILCAwLCBOVUxMLCAmcik7CisJdndycS0+dmFsdWUgPSByLnU7CisKKwlyZXR1cm4gcnZhbHVlOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X3NldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJcmV0dXJuIG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfRlJBR1RIUkVTSCwgMCwgJnZ3cnEtPnZhbHVlKTsKK30KKworc3RhdGljIGludAorcHJpc201NF9nZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1bmlvbiBvaWRfcmVzX3QgcjsKKwlpbnQgcnZhbHVlOworCisJcnZhbHVlID0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9GUkFHVEhSRVNILCAwLCBOVUxMLCAmcik7CisJdndycS0+dmFsdWUgPSByLnU7CisKKwlyZXR1cm4gcnZhbHVlOworfQorCisvKiBIZXJlIHdlIGhhdmUgKG1pbixtYXgpID0gbWF4IHJldHJpZXMgZm9yIChzbWFsbCBmcmFtZXMsIGJpZyBmcmFtZXMpLiBXaGVyZQorICogYmlnIGZyYW1lIDw9PiAgYmlnZ2VyIHRoYW4gdGhlIHJ0cyB0aHJlc2hvbGQKKyAqIHNtYWxsIGZyYW1lIDw9PiAgc21hbGxlciB0aGFuIHRoZSBydHMgdGhyZXNob2xkCisgKiBUaGlzIGlzIG5vdCByZWFsbHkgdGhlIGJlaGF2aW9yIGV4cGVjdGVkIGJ5IHRoZSB3aXJlbGVzcyB0b29sIGJ1dCBpdCBzZWVtcworICogdG8gYmUgYSBjb21tb24gYmVoYXZpb3IgaW4gb3RoZXIgZHJpdmVycy4KKyAqLworCitzdGF0aWMgaW50CitwcmlzbTU0X3NldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJdTMyIHNsaW1pdCA9IDAsIGxsaW1pdCA9IDA7CS8qIHNob3J0IGFuZCBsb25nIGxpbWl0ICovCisJdTMyIGxpZmV0aW1lID0gMDsKKwlpbnQgcnZhbHVlID0gMDsKKworCWlmICh2d3JxLT5kaXNhYmxlZCkKKwkJLyogd2UgY2Fubm90IGRpc2FibGUgdGhpcyBmZWF0dXJlICovCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTElNSVQpIHsKKwkJaWYgKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTUlOKQorCQkJc2xpbWl0ID0gdndycS0+dmFsdWU7CisJCWVsc2UgaWYgKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTUFYKQorCQkJbGxpbWl0ID0gdndycS0+dmFsdWU7CisJCWVsc2UgeworCQkJLyogd2UgYXJlIGFza2VkIHRvIHNldCBib3RoICovCisJCQlzbGltaXQgPSB2d3JxLT52YWx1ZTsKKwkJCWxsaW1pdCA9IHZ3cnEtPnZhbHVlOworCQl9CisJfQorCWlmICh2d3JxLT5mbGFncyAmIElXX1JFVFJZX0xJRkVUSU1FKQorCQkvKiBXaXJlbGVzcyB0b29scyB1c2UgdXMgdW5pdCB3aGlsZSB0aGUgZGV2aWNlIHVzZXMgMTAyNCB1cyB1bml0ICovCisJCWxpZmV0aW1lID0gdndycS0+dmFsdWUgLyAxMDI0OworCisJLyogbm93IHNldCB3aGF0IGlzIHJlcXVlc3RlZCAqLworCWlmIChzbGltaXQpCisJCXJ2YWx1ZSA9CisJCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1NIT1JUUkVUUklFUywgMCwgJnNsaW1pdCk7CisJaWYgKGxsaW1pdCkKKwkJcnZhbHVlIHw9CisJCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0xPTkdSRVRSSUVTLCAwLCAmbGxpbWl0KTsKKwlpZiAobGlmZXRpbWUpCisJCXJ2YWx1ZSB8PQorCQkgICAgbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9NQVhUWExJRkVUSU1FLCAwLAorCQkJCSAgICAmbGlmZXRpbWUpOworCXJldHVybiBydmFsdWU7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfZ2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1bmlvbiBvaWRfcmVzX3QgcjsKKwlpbnQgcnZhbHVlID0gMDsKKwl2d3JxLT5kaXNhYmxlZCA9IDA7CS8qIEl0IGNhbm5vdCBiZSBkaXNhYmxlZCAqLworCisJaWYgKCh2d3JxLT5mbGFncyAmIElXX1JFVFJZX1RZUEUpID09IElXX1JFVFJZX0xJRkVUSU1FKSB7CisJCS8qIHdlIGFyZSBhc2tlZCBmb3IgdGhlIGxpZmUgdGltZSAqLworCQlydmFsdWUgPQorCQkgICAgbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9NQVhUWExJRkVUSU1FLCAwLCBOVUxMLCAmcik7CisJCXZ3cnEtPnZhbHVlID0gci51ICogMTAyNDsKKwkJdndycS0+ZmxhZ3MgPSBJV19SRVRSWV9MSUZFVElNRTsKKwl9IGVsc2UgaWYgKCh2d3JxLT5mbGFncyAmIElXX1JFVFJZX01BWCkpIHsKKwkJLyogd2UgYXJlIGFza2VkIGZvciB0aGUgbG9uZyByZXRyeSBsaW1pdCAqLworCQlydmFsdWUgfD0KKwkJICAgIG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfTE9OR1JFVFJJRVMsIDAsIE5VTEwsICZyKTsKKwkJdndycS0+dmFsdWUgPSByLnU7CisJCXZ3cnEtPmZsYWdzID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9NQVg7CisJfSBlbHNlIHsKKwkJLyogZGVmYXVsdC4gZ2V0IHRoZSAgc2hvcnQgcmV0cnkgbGltaXQgKi8KKwkJcnZhbHVlIHw9CisJCSAgICBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1NIT1JUUkVUUklFUywgMCwgTlVMTCwgJnIpOworCQl2d3JxLT52YWx1ZSA9IHIudTsKKwkJdndycS0+ZmxhZ3MgPSBJV19SRVRSWV9MSU1JVCB8IElXX1JFVFJZX01JTjsKKwl9CisKKwlyZXR1cm4gcnZhbHVlOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X3NldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpbnQgcnZhbHVlID0gMCwgZm9yY2UgPSAwOworCWludCBhdXRoZW4gPSBET1QxMV9BVVRIX09TLCBpbnZva2UgPSAwLCBleHVuZW5jcnlwdCA9IDA7CisJdW5pb24gb2lkX3Jlc190IHI7CisKKwkvKiB3aXRoIHRoZSBuZXcgQVBJLCBpdCdzIGltcG9zc2libGUgdG8gZ2V0IGEgTlVMTCBwb2ludGVyLgorCSAqIE5ldyB2ZXJzaW9uIG9mIGl3Y29uZmlnIHNldCB0aGUgSVdfRU5DT0RFX05PS0VZIGZsYWcKKwkgKiB3aGVuIG5vIGtleSBpcyBnaXZlbiwgYnV0IG9sZGVyIHZlcnNpb25zIGRvbid0LiAqLworCisJaWYgKGR3cnEtPmxlbmd0aCA+IDApIHsKKwkJLyogd2UgaGF2ZSBhIGtleSB0byBzZXQgKi8KKwkJaW50IGluZGV4ID0gKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJCWludCBjdXJyZW50X2luZGV4OworCQlzdHJ1Y3Qgb2JqX2tleSBrZXkgPSB7IERPVDExX1BSSVZfV0VQLCAwLCAiIiB9OworCisJCS8qIGdldCB0aGUgY3VycmVudCBrZXkgaW5kZXggKi8KKwkJcnZhbHVlID0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9ERUZLRVlJRCwgMCwgTlVMTCwgJnIpOworCQljdXJyZW50X2luZGV4ID0gci51OworCQkvKiBWZXJpZnkgdGhhdCB0aGUga2V5IGlzIG5vdCBtYXJrZWQgYXMgaW52YWxpZCAqLworCQlpZiAoIShkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkpIHsKKwkJCWtleS5sZW5ndGggPSBkd3JxLT5sZW5ndGggPiBzaXplb2YgKGtleS5rZXkpID8KKwkJCSAgICBzaXplb2YgKGtleS5rZXkpIDogZHdycS0+bGVuZ3RoOworCQkJbWVtY3B5KGtleS5rZXksIGV4dHJhLCBrZXkubGVuZ3RoKTsKKwkJCWlmIChrZXkubGVuZ3RoID09IDMyKQorCQkJCS8qIHdlIHdhbnQgV1BBLVBTSyAqLworCQkJCWtleS50eXBlID0gRE9UMTFfUFJJVl9US0lQOworCQkJaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+IDMpKQorCQkJCS8qIG5vIGluZGV4IHByb3ZpZGVkIHVzZSB0aGUgY3VycmVudCBvbmUgKi8KKwkJCQlpbmRleCA9IGN1cnJlbnRfaW5kZXg7CisKKwkJCS8qIG5vdyBzZW5kIHRoZSBrZXkgdG8gdGhlIGNhcmQgICovCisJCQlydmFsdWUgfD0KKwkJCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0RFRktFWVgsIGluZGV4LAorCQkJCQkgICAgJmtleSk7CisJCX0KKwkJLyoKKwkJICogSWYgYSB2YWxpZCBrZXkgaXMgc2V0LCBlbmNyeXB0aW9uIHNob3VsZCBiZSBlbmFibGVkIAorCQkgKiAodXNlciBtYXkgdHVybiBpdCBvZmYgbGF0ZXIpLgorCQkgKiBUaGlzIGlzIGFsc28gaG93ICJpd2NvbmZpZyBldGhYIGtleSBvbiIgd29ya3MKKwkJICovCisJCWlmICgoaW5kZXggPT0gY3VycmVudF9pbmRleCkgJiYgKGtleS5sZW5ndGggPiAwKSkKKwkJCWZvcmNlID0gMTsKKwl9IGVsc2UgeworCQlpbnQgaW5kZXggPSAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJaWYgKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPD0gMykpIHsKKwkJCS8qIHdlIHdhbnQgdG8gc2V0IHRoZSBrZXkgaW5kZXggKi8KKwkJCXJ2YWx1ZSB8PQorCQkJICAgIG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfREVGS0VZSUQsIDAsCisJCQkJCSAgICAmaW5kZXgpOworCQl9IGVsc2UgeworCQkJaWYgKCFkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9NT0RFKSB7CisJCQkJLyogd2UgY2Fubm90IGRvIGFueXRoaW5nLiBDb21wbGFpbi4gKi8KKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKwkvKiBub3cgcmVhZCB0aGUgZmxhZ3MgKi8KKwlpZiAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKKwkJLyogRW5jb2RpbmcgZGlzYWJsZWQsIAorCQkgKiBhdXRoZW4gPSBET1QxMV9BVVRIX09TOworCQkgKiBpbnZva2UgPSAwOworCQkgKiBleHVuZW5jcnlwdCA9IDA7ICovCisJfQorCWlmIChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKQorCQkvKiBFbmNvZGUgYnV0IGFjY2VwdCBub24tZW5jb2RlZCBwYWNrZXRzLiBObyBhdXRoICovCisJCWludm9rZSA9IDE7CisJaWYgKChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKSB8fCBmb3JjZSkgeworCQkvKiBSZWZ1c2Ugbm9uLWVuY29kZWQgcGFja2V0cy4gQXV0aCAqLworCQlhdXRoZW4gPSBET1QxMV9BVVRIX0JPVEg7CisJCWludm9rZSA9IDE7CisJCWV4dW5lbmNyeXB0ID0gMTsKKwl9CisJLyogZG8gdGhlIGNoYW5nZSBpZiByZXF1ZXN0ZWQgICovCisJaWYgKChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9NT0RFKSB8fCBmb3JjZSkgeworCQlydmFsdWUgfD0KKwkJICAgIG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfQVVUSEVOQUJMRSwgMCwgJmF1dGhlbik7CisJCXJ2YWx1ZSB8PQorCQkgICAgbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9QUklWQUNZSU5WT0tFRCwgMCwgJmludm9rZSk7CisJCXJ2YWx1ZSB8PQorCQkgICAgbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9FWFVORU5DUllQVEVELCAwLAorCQkJCSAgICAmZXh1bmVuY3J5cHQpOworCX0KKwlyZXR1cm4gcnZhbHVlOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3Qgb2JqX2tleSAqa2V5OworCXUzMiBkZXZpbmRleCwgaW5kZXggPSAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwl1MzIgYXV0aGVuID0gMCwgaW52b2tlID0gMCwgZXh1bmVuY3J5cHQgPSAwOworCWludCBydmFsdWU7CisJdW5pb24gb2lkX3Jlc190IHI7CisKKwkvKiBmaXJzdCBnZXQgdGhlIGZsYWdzICovCisJcnZhbHVlID0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9BVVRIRU5BQkxFLCAwLCBOVUxMLCAmcik7CisJYXV0aGVuID0gci51OworCXJ2YWx1ZSB8PSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1BSSVZBQ1lJTlZPS0VELCAwLCBOVUxMLCAmcik7CisJaW52b2tlID0gci51OworCXJ2YWx1ZSB8PSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0VYVU5FTkNSWVBURUQsIDAsIE5VTEwsICZyKTsKKwlleHVuZW5jcnlwdCA9IHIudTsKKworCWlmIChpbnZva2UgJiYgKGF1dGhlbiA9PSBET1QxMV9BVVRIX0JPVEgpICYmIGV4dW5lbmNyeXB0KQorCQlkd3JxLT5mbGFncyA9IElXX0VOQ09ERV9SRVNUUklDVEVEOworCWVsc2UgaWYgKChhdXRoZW4gPT0gRE9UMTFfQVVUSF9PUykgJiYgIWV4dW5lbmNyeXB0KSB7CisJCWlmIChpbnZva2UpCisJCQlkd3JxLT5mbGFncyA9IElXX0VOQ09ERV9PUEVOOworCQllbHNlCisJCQlkd3JxLT5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwl9IGVsc2UKKwkJLyogVGhlIGNhcmQgc2hvdWxkIG5vdCB3b3JrIGluIHRoaXMgc3RhdGUgKi8KKwkJZHdycS0+ZmxhZ3MgPSAwOworCisJLyogZ2V0IHRoZSBjdXJyZW50IGRldmljZSBrZXkgaW5kZXggKi8KKwlydmFsdWUgfD0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9ERUZLRVlJRCwgMCwgTlVMTCwgJnIpOworCWRldmluZGV4ID0gci51OworCS8qIE5vdyBnZXQgdGhlIGtleSwgcmV0dXJuIGl0ICovCisJaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+IDMpKQorCQkvKiBubyBpbmRleCBwcm92aWRlZCwgdXNlIHRoZSBjdXJyZW50IG9uZSAqLworCQlpbmRleCA9IGRldmluZGV4OworCXJ2YWx1ZSB8PSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0RFRktFWVgsIGluZGV4LCBOVUxMLCAmcik7CisJa2V5ID0gci5wdHI7CisJZHdycS0+bGVuZ3RoID0ga2V5LT5sZW5ndGg7CisJbWVtY3B5KGV4dHJhLCBrZXktPmtleSwgZHdycS0+bGVuZ3RoKTsKKwlrZnJlZShrZXkpOworCS8qIHJldHVybiB0aGUgdXNlZCBrZXkgaW5kZXggKi8KKwlkd3JxLT5mbGFncyB8PSBkZXZpbmRleCArIDE7CisKKwlyZXR1cm4gcnZhbHVlOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF90eHBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXVuaW9uIG9pZF9yZXNfdCByOworCWludCBydmFsdWU7CisKKwlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgT0lEX0lOTF9PVVRQVVRQT1dFUiwgMCwgTlVMTCwgJnIpOworCS8qIGludGVyc2lsIGZpcm13YXJlIG9wZXJhdGVzIGluIDAuMjUgZEJtICgxLzQgZEJtKSAqLworCXZ3cnEtPnZhbHVlID0gKHMzMikgci51IC8gNDsKKwl2d3JxLT5maXhlZCA9IDE7CisJLyogcmFkaW8gaXMgbm90IHR1cm5lZCBvZgorCSAqIGJ0dzogaG93IGlzIHBvc3NpYmxlIHRvIHR1cm4gb2ZmIG9ubHkgdGhlIHJhZGlvIAorCSAqLworCXZ3cnEtPmRpc2FibGVkID0gMDsKKworCXJldHVybiBydmFsdWU7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X3R4cG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJczMyIHUgPSB2d3JxLT52YWx1ZTsKKworCS8qIGludGVyc2lsIGZpcm13YXJlIG9wZXJhdGVzIGluIDAuMjUgZEJtICgxLzQpICovCisJdSAqPSA0OworCWlmICh2d3JxLT5kaXNhYmxlZCkgeworCQkvKiBkb24ndCBrbm93IGhvdyB0byBkaXNhYmxlIHJhZGlvICovCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6ICVzKCkgZGlzYWJsaW5nIHJhZGlvIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLlxuIiwKKwkJICAgICAgIHByaXYtPm5kZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRU5PVFNVUFA7CisJfSBlbHNlIGlmICh2d3JxLT5maXhlZCkKKwkJLyogY3VycmVudGx5IG9ubHkgZml4ZWQgdmFsdWUgaXMgc3VwcG9ydGVkICovCisJCXJldHVybiBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgT0lEX0lOTF9PVVRQVVRQT1dFUiwgMCwgJnUpOworCWVsc2UgeworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIiVzOiAlcygpIGF1dG8gcG93ZXIgd2lsbCBiZSBpbXBsZW1lbnRlZCBsYXRlci5cbiIsCisJCSAgICAgICBwcml2LT5uZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVOT1RTVVBQOworCX0KK30KKworc3RhdGljIGludAorcHJpc201NF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkgICAgICBfX3UzMiAqIHV3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9yZXNldChuZXRkZXZfcHJpdihuZGV2KSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJpc201NF9nZXRfb2lkKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKQoreworCXVuaW9uIG9pZF9yZXNfdCByOworCWludCBydmFsdWU7CisJZW51bSBvaWRfbnVtX3QgbiA9IGR3cnEtPmZsYWdzOworCisJcnZhbHVlID0gbWd0X2dldF9yZXF1ZXN0KChpc2xwY2lfcHJpdmF0ZSAqKSBuZGV2LT5wcml2LCBuLCAwLCBOVUxMLCAmcik7CisJZHdycS0+bGVuZ3RoID0gbWd0X3Jlc3BvbnNlX3RvX3N0cihuLCAmciwgZXh0cmEpOworCWlmICgoaXNsX29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUpICE9IE9JRF9UWVBFX1UzMikKKwkJa2ZyZWUoci5wdHIpOworCXJldHVybiBydmFsdWU7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X3UzMihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJX191MzIgKiB1d3JxLCBjaGFyICpleHRyYSkKK3sKKwl1MzIgb2lkID0gdXdycVswXSwgdSA9IHV3cnFbMV07CisKKwlyZXR1cm4gbWd0X3NldF9yZXF1ZXN0KChpc2xwY2lfcHJpdmF0ZSAqKSBuZGV2LT5wcml2LCBvaWQsIDAsICZ1KTsKK30KKworc3RhdGljIGludAorcHJpc201NF9zZXRfcmF3KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKQoreworCXUzMiBvaWQgPSBkd3JxLT5mbGFnczsKKworCXJldHVybiBtZ3Rfc2V0X3JlcXVlc3QoKGlzbHBjaV9wcml2YXRlICopIG5kZXYtPnByaXYsIG9pZCwgMCwgZXh0cmEpOworfQorCit2b2lkCitwcmlzbTU0X2FjbF9pbml0KHN0cnVjdCBpc2xwY2lfYWNsICphY2wpCit7CisJc2VtYV9pbml0KCZhY2wtPnNlbSwgMSk7CisJSU5JVF9MSVNUX0hFQUQoJmFjbC0+bWFjX2xpc3QpOworCWFjbC0+c2l6ZSA9IDA7CisJYWNsLT5wb2xpY3kgPSBNQUNfUE9MSUNZX09QRU47Cit9CisKK3N0YXRpYyB2b2lkCitwcmlzbTU0X2NsZWFyX21hYyhzdHJ1Y3QgaXNscGNpX2FjbCAqYWNsKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7CisJc3RydWN0IG1hY19lbnRyeSAqZW50cnk7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhY2wtPnNlbSkpCisJCXJldHVybjsKKworCWlmIChhY2wtPnNpemUgPT0gMCkgeworCQl1cCgmYWNsLT5zZW0pOworCQlyZXR1cm47CisJfQorCisJZm9yIChwdHIgPSBhY2wtPm1hY19saXN0Lm5leHQsIG5leHQgPSBwdHItPm5leHQ7CisJICAgICBwdHIgIT0gJmFjbC0+bWFjX2xpc3Q7IHB0ciA9IG5leHQsIG5leHQgPSBwdHItPm5leHQpIHsKKwkJZW50cnkgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1hY19lbnRyeSwgX2xpc3QpOworCQlsaXN0X2RlbChwdHIpOworCQlrZnJlZShlbnRyeSk7CisJfQorCWFjbC0+c2l6ZSA9IDA7CisJdXAoJmFjbC0+c2VtKTsKK30KKwordm9pZAorcHJpc201NF9hY2xfY2xlYW4oc3RydWN0IGlzbHBjaV9hY2wgKmFjbCkKK3sKKwlwcmlzbTU0X2NsZWFyX21hYyhhY2wpOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2FkZF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBzb2NrYWRkciAqYXdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgaXNscGNpX2FjbCAqYWNsID0gJnByaXYtPmFjbDsKKwlzdHJ1Y3QgbWFjX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopIGV4dHJhOworCisJaWYgKGFkZHItPnNhX2ZhbWlseSAhPSBBUlBIUkRfRVRIRVIpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWVudHJ5ID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCBtYWNfZW50cnkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1jcHkoZW50cnktPmFkZHIsIGFkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFjbC0+c2VtKSkgeworCQlrZnJlZShlbnRyeSk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5fbGlzdCwgJmFjbC0+bWFjX2xpc3QpOworCWFjbC0+c2l6ZSsrOworCXVwKCZhY2wtPnNlbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJpc201NF9kZWxfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3Qgc29ja2FkZHIgKmF3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGlzbHBjaV9hY2wgKmFjbCA9ICZwcml2LT5hY2w7CisJc3RydWN0IG1hY19lbnRyeSAqZW50cnk7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgZXh0cmE7CisKKwlpZiAoYWRkci0+c2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYWNsLT5zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCWZvciAocHRyID0gYWNsLT5tYWNfbGlzdC5uZXh0OyBwdHIgIT0gJmFjbC0+bWFjX2xpc3Q7IHB0ciA9IHB0ci0+bmV4dCkgeworCQllbnRyeSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWFjX2VudHJ5LCBfbGlzdCk7CisKKwkJaWYgKG1lbWNtcChlbnRyeS0+YWRkciwgYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pID09IDApIHsKKwkJCWxpc3RfZGVsKHB0cik7CisJCQlhY2wtPnNpemUtLTsKKwkJCWtmcmVlKGVudHJ5KTsKKwkJCXVwKCZhY2wtPnNlbSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwl1cCgmYWNsLT5zZW0pOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgaXNscGNpX2FjbCAqYWNsID0gJnByaXYtPmFjbDsKKwlzdHJ1Y3QgbWFjX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CisJc3RydWN0IHNvY2thZGRyICpkc3QgPSAoc3RydWN0IHNvY2thZGRyICopIGV4dHJhOworCisJZHdycS0+bGVuZ3RoID0gMDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFjbC0+c2VtKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWZvciAocHRyID0gYWNsLT5tYWNfbGlzdC5uZXh0OyBwdHIgIT0gJmFjbC0+bWFjX2xpc3Q7IHB0ciA9IHB0ci0+bmV4dCkgeworCQllbnRyeSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWFjX2VudHJ5LCBfbGlzdCk7CisKKwkJbWVtY3B5KGRzdC0+c2FfZGF0YSwgZW50cnktPmFkZHIsIEVUSF9BTEVOKTsKKwkJZHN0LT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCWR3cnEtPmxlbmd0aCsrOworCQlkc3QrKzsKKwl9CisJdXAoJmFjbC0+c2VtKTsKKwlyZXR1cm4gMDsKK30KKworLyogU2V0dGluZyBwb2xpY3kgYWxzbyBjbGVhcnMgdGhlIE1BQyBhY2wsIGV2ZW4gaWYgd2UgZG9uJ3QgY2hhbmdlIHRoZSBkZWZhdXQKKyAqIHBvbGljeQorICovCisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X3BvbGljeShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgX191MzIgKiB1d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBpc2xwY2lfYWNsICphY2wgPSAmcHJpdi0+YWNsOworCXUzMiBtbG1lYXV0b2xldmVsOworCisJcHJpc201NF9jbGVhcl9tYWMoYWNsKTsKKworCWlmICgoKnV3cnEgPCBNQUNfUE9MSUNZX09QRU4pIHx8ICgqdXdycSA+IE1BQ19QT0xJQ1lfUkVKRUNUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duX3dyaXRlKCZwcml2LT5taWJfc2VtKTsKKworCWFjbC0+cG9saWN5ID0gKnV3cnE7CisKKwkvKiB0aGUgQUNMIGNvZGUgbmVlZHMgYW4gaW50ZXJtZWRpYXRlIG1sbWVhdXRvbGV2ZWwgKi8KKwlpZiAoKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpICYmCisJICAgIChhY2wtPnBvbGljeSAhPSBNQUNfUE9MSUNZX09QRU4pKQorCQltbG1lYXV0b2xldmVsID0gRE9UMTFfTUxNRV9JTlRFUk1FRElBVEU7CisJZWxzZQorCQltbG1lYXV0b2xldmVsID0gQ0FSRF9ERUZBVUxUX01MTUVfTU9ERTsKKwlpZiAocHJpdi0+d3BhKQorCQltbG1lYXV0b2xldmVsID0gRE9UMTFfTUxNRV9FWFRFTkRFRDsKKwltZ3Rfc2V0KHByaXYsIERPVDExX09JRF9NTE1FQVVUT0xFVkVMLCAmbWxtZWF1dG9sZXZlbCk7CisJLyogcmVzdGFydCB0aGUgY2FyZCB3aXRoIG91ciBuZXcgcG9saWN5ICovCisJaWYgKG1ndF9jb21taXQocHJpdikpIHsKKwkJdXBfd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCQlyZXR1cm4gLUVJTzsKKwl9CisJdXBfd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfZ2V0X3BvbGljeShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgX191MzIgKiB1d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBpc2xwY2lfYWNsICphY2wgPSAmcHJpdi0+YWNsOworCisJKnV3cnEgPSBhY2wtPnBvbGljeTsKKworCXJldHVybiAwOworfQorCisvKiBSZXR1cm4gMSBvbmx5IGlmIGNsaWVudCBzaG91bGQgYmUgYWNjZXB0ZWQuICovCisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfbWFjX2FjY2VwdChzdHJ1Y3QgaXNscGNpX2FjbCAqYWNsLCBjaGFyICptYWMpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyOworCXN0cnVjdCBtYWNfZW50cnkgKmVudHJ5OworCWludCByZXMgPSAwOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYWNsLT5zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJaWYgKGFjbC0+cG9saWN5ID09IE1BQ19QT0xJQ1lfT1BFTikgeworCQl1cCgmYWNsLT5zZW0pOworCQlyZXR1cm4gMTsKKwl9CisKKwlmb3IgKHB0ciA9IGFjbC0+bWFjX2xpc3QubmV4dDsgcHRyICE9ICZhY2wtPm1hY19saXN0OyBwdHIgPSBwdHItPm5leHQpIHsKKwkJZW50cnkgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1hY19lbnRyeSwgX2xpc3QpOworCQlpZiAobWVtY21wKGVudHJ5LT5hZGRyLCBtYWMsIEVUSF9BTEVOKSA9PSAwKSB7CisJCQlyZXMgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmVzID0gKGFjbC0+cG9saWN5ID09IE1BQ19QT0xJQ1lfQUNDRVBUKSA/ICFyZXMgOiByZXM7CisJdXAoJmFjbC0+c2VtKTsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfa2lja19hbGwoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBvYmpfbWxtZSAqbWxtZTsKKwlpbnQgcnZhbHVlOworCisJbWxtZSA9IGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3Qgb2JqX21sbWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAobWxtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFRlbGwgdGhlIGNhcmQgdG8ga2ljayBldmVyeSBjbGllbnQgKi8KKwltbG1lLT5pZCA9IDA7CisJcnZhbHVlID0KKwkgICAgbWd0X3NldF9yZXF1ZXN0KG5ldGRldl9wcml2KG5kZXYpLCBET1QxMV9PSURfRElTQVNTT0NJQVRFLCAwLCBtbG1lKTsKKwlrZnJlZShtbG1lKTsKKworCXJldHVybiBydmFsdWU7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfa2lja19tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSBzdHJ1Y3Qgc29ja2FkZHIgKmF3cnEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBvYmpfbWxtZSAqbWxtZTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopIGV4dHJhOworCWludCBydmFsdWU7CisKKwlpZiAoYWRkci0+c2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJbWxtZSA9IGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3Qgb2JqX21sbWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAobWxtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFRlbGwgdGhlIGNhcmQgdG8gb25seSBraWNrIHRoZSBjb3JyZXNwb25kaW5nIGJhc3RhcmQgKi8KKwltZW1jcHkobWxtZS0+YWRkcmVzcywgYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOworCW1sbWUtPmlkID0gLTE7CisJcnZhbHVlID0KKwkgICAgbWd0X3NldF9yZXF1ZXN0KG5ldGRldl9wcml2KG5kZXYpLCBET1QxMV9PSURfRElTQVNTT0NJQVRFLCAwLCBtbG1lKTsKKworCWtmcmVlKG1sbWUpOworCisJcmV0dXJuIHJ2YWx1ZTsKK30KKworLyogVHJhbnNsYXRlIGEgVFJBUCBvaWQgaW50byBhIHdpcmVsZXNzIGV2ZW50LiBDYWxsZWQgaW4gaXNscGNpX21ndF9yZWNlaXZlLiAqLworCitzdGF0aWMgdm9pZAorZm9ybWF0X2V2ZW50KGlzbHBjaV9wcml2YXRlICpwcml2LCBjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzdHIsCisJICAgICBjb25zdCBzdHJ1Y3Qgb2JqX21sbWUgKm1sbWUsIHUxNiAqbGVuZ3RoLCBpbnQgZXJyb3IpCit7CisJY29uc3QgdTggKmEgPSBtbG1lLT5hZGRyZXNzOworCWludCBuID0gc25wcmludGYoZGVzdCwgSVdfQ1VTVE9NX01BWCwKKwkJCSAiJXMgJXMgJTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg6JTIuMlggJXMgKCUyLjJYKSIsCisJCQkgc3RyLAorCQkJICgocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgPyAiZnJvbSIgOiAidG8iKSwKKwkJCSBhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdLAorCQkJIChlcnJvciA/IChtbG1lLT5jb2RlID8gIiA6IFJFSkVDVEVEICIgOiAiIDogQUNDRVBURUQgIikKKwkJCSAgOiAiIiksIG1sbWUtPmNvZGUpOworCUJVR19PTihuID4gSVdfQ1VTVE9NX01BWCk7CisJKmxlbmd0aCA9IG47Cit9CisKK3N0YXRpYyB2b2lkCitzZW5kX2Zvcm1hdHRlZF9ldmVudChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgY29uc3QgY2hhciAqc3RyLAorCQkgICAgIGNvbnN0IHN0cnVjdCBvYmpfbWxtZSAqbWxtZSwgaW50IGVycm9yKQoreworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwljaGFyICptZW1wdHI7CisKKwltZW1wdHIgPSBrbWFsbG9jKElXX0NVU1RPTV9NQVgsIEdGUF9LRVJORUwpOworCWlmICghbWVtcHRyKQorCQlyZXR1cm47CisJd3JxdS5kYXRhLnBvaW50ZXIgPSBtZW1wdHI7CisJd3JxdS5kYXRhLmxlbmd0aCA9IDA7CisJZm9ybWF0X2V2ZW50KHByaXYsIG1lbXB0ciwgc3RyLCBtbG1lLCAmd3JxdS5kYXRhLmxlbmd0aCwKKwkJICAgICBlcnJvcik7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChwcml2LT5uZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgbWVtcHRyKTsKKwlrZnJlZShtZW1wdHIpOworfQorCitzdGF0aWMgdm9pZAorc2VuZF9zaW1wbGVfZXZlbnQoaXNscGNpX3ByaXZhdGUgKnByaXYsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJY2hhciAqbWVtcHRyOworCWludCBuID0gc3RybGVuKHN0cik7CisKKwltZW1wdHIgPSBrbWFsbG9jKElXX0NVU1RPTV9NQVgsIEdGUF9LRVJORUwpOworCWlmICghbWVtcHRyKQorCQlyZXR1cm47CisJQlVHX09OKG4gPiBJV19DVVNUT01fTUFYKTsKKwl3cnF1LmRhdGEucG9pbnRlciA9IG1lbXB0cjsKKwl3cnF1LmRhdGEubGVuZ3RoID0gbjsKKwlzdHJjcHkobWVtcHRyLCBzdHIpOworCXdpcmVsZXNzX3NlbmRfZXZlbnQocHJpdi0+bmRldiwgSVdFVkNVU1RPTSwgJndycXUsIG1lbXB0cik7CisJa2ZyZWUobWVtcHRyKTsKK30KKworc3RhdGljIHZvaWQKK2xpbmtfY2hhbmdlZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTMyIGJpdHJhdGUpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCWlmIChiaXRyYXRlKSB7CisJCWlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfSU5GUkEpIHsKKwkJCXVuaW9uIGl3cmVxX2RhdGEgdXdycTsKKwkJCXByaXNtNTRfZ2V0X3dhcChuZGV2LCBOVUxMLCAoc3RydWN0IHNvY2thZGRyICopICZ1d3JxLAorCQkJCQlOVUxMKTsKKwkJCXdpcmVsZXNzX3NlbmRfZXZlbnQobmRldiwgU0lPQ0dJV0FQLCAmdXdycSwgTlVMTCk7CisJCX0gZWxzZQorCQkJc2VuZF9zaW1wbGVfZXZlbnQobmV0ZGV2X3ByaXYobmRldiksCisJCQkJCSAgIkxpbmsgZXN0YWJsaXNoZWQiKTsKKwl9IGVsc2UKKwkJc2VuZF9zaW1wbGVfZXZlbnQobmV0ZGV2X3ByaXYobmRldiksICJMaW5rIGxvc3QiKTsKK30KKworLyogQmVhY29uL1Byb2JlUmVzcCBwYXlsb2FkIGhlYWRlciAqLworc3RydWN0IGllZWU4MDIxMV9iZWFjb25fcGhkciB7CisJdTggdGltZXN0YW1wWzhdOworCXUxNiBiZWFjb25faW50OworCXUxNiBjYXBhYl9pbmZvOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgV0xBTl9FSURfR0VORVJJQyAweGRkCitzdGF0aWMgdTggd3BhX29pZFs0XSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMSB9OworCisjZGVmaW5lIE1BQzJTVFIoYSkgKGEpWzBdLCAoYSlbMV0sIChhKVsyXSwgKGEpWzNdLCAoYSlbNF0sIChhKVs1XQorI2RlZmluZSBNQUNTVFIgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IgorCitzdGF0aWMgdm9pZAorcHJpc201NF93cGFfaWVfYWRkKGlzbHBjaV9wcml2YXRlICpwcml2LCB1OCAqYnNzaWQsCisJCSAgIHU4ICp3cGFfaWUsIHNpemVfdCB3cGFfaWVfbGVuKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKKwlzdHJ1Y3QgaXNscGNpX2Jzc193cGFfaWUgKmJzcyA9IE5VTEw7CisKKwlpZiAod3BhX2llX2xlbiA+IE1BWF9XUEFfSUVfTEVOKQorCQl3cGFfaWVfbGVuID0gTUFYX1dQQV9JRV9MRU47CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZwcml2LT53cGFfc2VtKSkKKwkJcmV0dXJuOworCisJLyogdHJ5IHRvIHVzZSBleGlzdGluZyBlbnRyeSAqLworCWxpc3RfZm9yX2VhY2gocHRyLCAmcHJpdi0+YnNzX3dwYV9saXN0KSB7CisJCWJzcyA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgaXNscGNpX2Jzc193cGFfaWUsIGxpc3QpOworCQlpZiAobWVtY21wKGJzcy0+YnNzaWQsIGJzc2lkLCBFVEhfQUxFTikgPT0gMCkgeworCQkJbGlzdF9tb3ZlKCZic3MtPmxpc3QsICZwcml2LT5ic3Nfd3BhX2xpc3QpOworCQkJYnJlYWs7CisJCX0KKwkJYnNzID0gTlVMTDsKKwl9CisKKwlpZiAoYnNzID09IE5VTEwpIHsKKwkJLyogYWRkIGEgbmV3IEJTUyBlbnRyeTsgaWYgbWF4IG51bWJlciBvZiBlbnRyaWVzIGlzIGFscmVhZHkKKwkJICogcmVhY2hlZCwgcmVwbGFjZSB0aGUgbGVhc3QgcmVjZW50bHkgdXBkYXRlZCAqLworCQlpZiAocHJpdi0+bnVtX2Jzc193cGEgPj0gTUFYX0JTU19XUEFfSUVfQ09VTlQpIHsKKwkJCWJzcyA9IGxpc3RfZW50cnkocHJpdi0+YnNzX3dwYV9saXN0LnByZXYsCisJCQkJCSBzdHJ1Y3QgaXNscGNpX2Jzc193cGFfaWUsIGxpc3QpOworCQkJbGlzdF9kZWwoJmJzcy0+bGlzdCk7CisJCX0gZWxzZSB7CisJCQlic3MgPSBrbWFsbG9jKHNpemVvZiAoKmJzcyksIEdGUF9BVE9NSUMpOworCQkJaWYgKGJzcyAhPSBOVUxMKSB7CisJCQkJcHJpdi0+bnVtX2Jzc193cGErKzsKKwkJCQltZW1zZXQoYnNzLCAwLCBzaXplb2YgKCpic3MpKTsKKwkJCX0KKwkJfQorCQlpZiAoYnNzICE9IE5VTEwpIHsKKwkJCW1lbWNweShic3MtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOworCQkJbGlzdF9hZGQoJmJzcy0+bGlzdCwgJnByaXYtPmJzc193cGFfbGlzdCk7CisJCX0KKwl9CisKKwlpZiAoYnNzICE9IE5VTEwpIHsKKwkJbWVtY3B5KGJzcy0+d3BhX2llLCB3cGFfaWUsIHdwYV9pZV9sZW4pOworCQlic3MtPndwYV9pZV9sZW4gPSB3cGFfaWVfbGVuOworCQlic3MtPmxhc3RfdXBkYXRlID0gamlmZmllczsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9ERUJVRyAiRmFpbGVkIHRvIGFkZCBCU1MgV1BBIGVudHJ5IGZvciAiIE1BQ1NUUgorCQkgICAgICAgIlxuIiwgTUFDMlNUUihic3NpZCkpOworCX0KKworCS8qIGV4cGlyZSBvbGQgZW50cmllcyBmcm9tIFdQQSBsaXN0ICovCisJd2hpbGUgKHByaXYtPm51bV9ic3Nfd3BhID4gMCkgeworCQlic3MgPSBsaXN0X2VudHJ5KHByaXYtPmJzc193cGFfbGlzdC5wcmV2LAorCQkJCSBzdHJ1Y3QgaXNscGNpX2Jzc193cGFfaWUsIGxpc3QpOworCQlpZiAoIXRpbWVfYWZ0ZXIoamlmZmllcywgYnNzLT5sYXN0X3VwZGF0ZSArIDYwICogSFopKQorCQkJYnJlYWs7CisKKwkJbGlzdF9kZWwoJmJzcy0+bGlzdCk7CisJCXByaXYtPm51bV9ic3Nfd3BhLS07CisJCWtmcmVlKGJzcyk7CisJfQorCisJdXAoJnByaXYtPndwYV9zZW0pOworfQorCitzdGF0aWMgc2l6ZV90CitwcmlzbTU0X3dwYV9pZV9nZXQoaXNscGNpX3ByaXZhdGUgKnByaXYsIHU4ICpic3NpZCwgdTggKndwYV9pZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CisJc3RydWN0IGlzbHBjaV9ic3Nfd3BhX2llICpic3MgPSBOVUxMOworCXNpemVfdCBsZW4gPSAwOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmcHJpdi0+d3BhX3NlbSkpCisJCXJldHVybiAwOworCisJbGlzdF9mb3JfZWFjaChwdHIsICZwcml2LT5ic3Nfd3BhX2xpc3QpIHsKKwkJYnNzID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBpc2xwY2lfYnNzX3dwYV9pZSwgbGlzdCk7CisJCWlmIChtZW1jbXAoYnNzLT5ic3NpZCwgYnNzaWQsIEVUSF9BTEVOKSA9PSAwKQorCQkJYnJlYWs7CisJCWJzcyA9IE5VTEw7CisJfQorCWlmIChic3MpIHsKKwkJbGVuID0gYnNzLT53cGFfaWVfbGVuOworCQltZW1jcHkod3BhX2llLCBic3MtPndwYV9pZSwgbGVuKTsKKwl9CisJdXAoJnByaXYtPndwYV9zZW0pOworCisJcmV0dXJuIGxlbjsKK30KKwordm9pZAorcHJpc201NF93cGFfaWVfaW5pdChpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+YnNzX3dwYV9saXN0KTsKKwlzZW1hX2luaXQoJnByaXYtPndwYV9zZW0sIDEpOworfQorCit2b2lkCitwcmlzbTU0X3dwYV9pZV9jbGVhbihpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbiwgJnByaXYtPmJzc193cGFfbGlzdCkgeworCQlzdHJ1Y3QgaXNscGNpX2Jzc193cGFfaWUgKmJzczsKKwkJYnNzID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBpc2xwY2lfYnNzX3dwYV9pZSwgbGlzdCk7CisJCWtmcmVlKGJzcyk7CisJfQorfQorCitzdGF0aWMgdm9pZAorcHJpc201NF9wcm9jZXNzX2Jzc19kYXRhKGlzbHBjaV9wcml2YXRlICpwcml2LCB1MzIgb2lkLCB1OCAqYWRkciwKKwkJCSB1OCAqcGF5bG9hZCwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2JlYWNvbl9waGRyICpoZHI7CisJdTggKnBvcywgKmVuZDsKKworCWlmICghcHJpdi0+d3BhKQorCQlyZXR1cm47CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9iZWFjb25fcGhkciAqKSBwYXlsb2FkOworCXBvcyA9ICh1OCAqKSAoaGRyICsgMSk7CisJZW5kID0gcGF5bG9hZCArIGxlbjsKKwl3aGlsZSAocG9zIDwgZW5kKSB7CisJCWlmIChwb3MgKyAyICsgcG9zWzFdID4gZW5kKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiUGFyc2luZyBCZWFjb24vUHJvYmVSZXNwIGZhaWxlZCAiCisJCQkgICAgICAgImZvciAiIE1BQ1NUUiAiXG4iLCBNQUMyU1RSKGFkZHIpKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAocG9zWzBdID09IFdMQU5fRUlEX0dFTkVSSUMgJiYgcG9zWzFdID49IDQgJiYKKwkJICAgIG1lbWNtcChwb3MgKyAyLCB3cGFfb2lkLCA0KSA9PSAwKSB7CisJCQlwcmlzbTU0X3dwYV9pZV9hZGQocHJpdiwgYWRkciwgcG9zLCBwb3NbMV0gKyAyKTsKKwkJCXJldHVybjsKKwkJfQorCQlwb3MgKz0gMiArIHBvc1sxXTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfcmVxdWVzdChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IG9ial9tbG1lICptbG1lLCBlbnVtIG9pZF9udW1fdCBvaWQpCit7CisJaWYgKCgobWxtZS0+c3RhdGUgPT0gRE9UMTFfU1RBVEVfQVVUSElORykgfHwKKwkgICAgIChtbG1lLT5zdGF0ZSA9PSBET1QxMV9TVEFURV9BU1NPQ0lORykpCisJICAgICYmIG1ndF9tbG1lX2Fuc3dlcihwcml2KSkgeworCQkvKiBTb21lb25lIGlzIHJlcXVlc3RpbmcgYXV0aCBhbmQgd2UgbXVzdCByZXNwb25kLiBKdXN0IHNlbmQgYmFjaworCQkgKiB0aGUgdHJhcCB3aXRoIGVycm9yIGNvZGUgc2V0IGFjY29yZGluZ2x5LgorCQkgKi8KKwkJbWxtZS0+Y29kZSA9IHByaXNtNTRfbWFjX2FjY2VwdCgmcHJpdi0+YWNsLAorCQkJCQkJbWxtZS0+YWRkcmVzcykgPyAwIDogMTsKKwkJbWd0X3NldF9yZXF1ZXN0KHByaXYsIG9pZCwgMCwgbWxtZSk7CisJfQorfQorCitzdGF0aWMgaW50CitwcmlzbTU0X3Byb2Nlc3NfdHJhcF9oZWxwZXIoaXNscGNpX3ByaXZhdGUgKnByaXYsIGVudW0gb2lkX251bV90IG9pZCwKKwkJCSAgICBjaGFyICpkYXRhKQoreworCXN0cnVjdCBvYmpfbWxtZSAqbWxtZSA9IChzdHJ1Y3Qgb2JqX21sbWUgKikgZGF0YTsKKwlzdHJ1Y3Qgb2JqX21sbWVleCAqbWxtZWV4ID0gKHN0cnVjdCBvYmpfbWxtZWV4ICopIGRhdGE7CisJc3RydWN0IG9ial9tbG1lZXggKmNvbmZpcm07CisJdTggd3BhX2llW01BWF9XUEFfSUVfTEVOXTsKKwlpbnQgd3BhX2llX2xlbjsKKwlzaXplX3QgbGVuID0gMDsgLyogdTE2LCBiZXR0ZXI/ICovCisJdTggKnBheWxvYWQgPSBOVUxMLCAqcG9zID0gTlVMTDsKKwlpbnQgcmV0OworCisJLyogSSB0aGluayBhbGwgdHJhcGFibGUgb2JqZWN0cyBhcmUgbGlzdGVkIGhlcmUuCisJICogU29tZSBvaWRzIGhhdmUgYSBFWCB2ZXJzaW9uLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZXkgYXJlIGVtaXR0ZWQKKwkgKiBpbiBET1QxMV9NTE1FX0VYVEVOREVEIG1vZGUgKHNldCB3aXRoIERPVDExX09JRF9NTE1FQVVUT0xFVkVMKQorCSAqIHdpdGggbW9yZSBpbmZvLgorCSAqIFRoZSBmZXcgZXZlbnRzIGFscmVhZHkgZGVmaW5lZCBieSB0aGUgd2lyZWxlc3MgdG9vbHMgYXJlIG5vdCByZWFsbHkKKwkgKiBzdWl0ZWQuIFdlIHVzZSB0aGUgbW9yZSBmbGV4aWJsZSBjdXN0b20gZXZlbnQgZmFjaWxpdHkuCisJICovCisKKwlpZiAob2lkID49IERPVDExX09JRF9CRUFDT04pIHsKKwkJbGVuID0gbWxtZWV4LT5zaXplOworCQlwYXlsb2FkID0gcG9zID0gbWxtZWV4LT5kYXRhOworCX0KKworCS8qIEkgZmVhciBwcmlzbTU0X3Byb2Nlc3NfYnNzX2RhdGEgd29uJ3Qgd29yayB3aXRoIGJpZyBlbmRpYW4gZGF0YSAqLworCWlmICgob2lkID09IERPVDExX09JRF9CRUFDT04pIHx8IChvaWQgPT0gRE9UMTFfT0lEX1BST0JFKSkKKwkJcHJpc201NF9wcm9jZXNzX2Jzc19kYXRhKHByaXYsIG9pZCwgbWxtZWV4LT5hZGRyZXNzLAorCQkJCQkgcGF5bG9hZCwgbGVuKTsKKworCW1ndF9sZV90b19jcHUoaXNsX29pZFtvaWRdLmZsYWdzICYgT0lEX0ZMQUdfVFlQRSwgKHZvaWQgKikgbWxtZSk7CisKKwlzd2l0Y2ggKG9pZCkgeworCisJY2FzZSBHRU5fT0lEX0xJTktTVEFURToKKwkJbGlua19jaGFuZ2VkKHByaXYtPm5kZXYsICh1MzIpICpkYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIERPVDExX09JRF9NSUNGQUlMVVJFOgorCQlzZW5kX3NpbXBsZV9ldmVudChwcml2LCAiTWljIGZhaWx1cmUiKTsKKwkJYnJlYWs7CisKKwljYXNlIERPVDExX09JRF9ERUFVVEhFTlRJQ0FURToKKwkJc2VuZF9mb3JtYXR0ZWRfZXZlbnQocHJpdiwgIkRlQXV0aGVudGljYXRlIHJlcXVlc3QiLCBtbG1lLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIERPVDExX09JRF9BVVRIRU5USUNBVEU6CisJCWhhbmRsZV9yZXF1ZXN0KHByaXYsIG1sbWUsIG9pZCk7CisJCXNlbmRfZm9ybWF0dGVkX2V2ZW50KHByaXYsICJBdXRoZW50aWNhdGUgcmVxdWVzdCIsIG1sbWUsIDEpOworCQlicmVhazsKKworCWNhc2UgRE9UMTFfT0lEX0RJU0FTU09DSUFURToKKwkJc2VuZF9mb3JtYXR0ZWRfZXZlbnQocHJpdiwgIkRpc2Fzc29jaWF0ZSByZXF1ZXN0IiwgbWxtZSwgMCk7CisJCWJyZWFrOworCisJY2FzZSBET1QxMV9PSURfQVNTT0NJQVRFOgorCQloYW5kbGVfcmVxdWVzdChwcml2LCBtbG1lLCBvaWQpOworCQlzZW5kX2Zvcm1hdHRlZF9ldmVudChwcml2LCAiQXNzb2NpYXRlIHJlcXVlc3QiLCBtbG1lLCAxKTsKKwkJYnJlYWs7CisKKwljYXNlIERPVDExX09JRF9SRUFTU09DSUFURToKKwkJaGFuZGxlX3JlcXVlc3QocHJpdiwgbWxtZSwgb2lkKTsKKwkJc2VuZF9mb3JtYXR0ZWRfZXZlbnQocHJpdiwgIlJlQXNzb2NpYXRlIHJlcXVlc3QiLCBtbG1lLCAxKTsKKwkJYnJlYWs7CisKKwljYXNlIERPVDExX09JRF9CRUFDT046CisJCXNlbmRfZm9ybWF0dGVkX2V2ZW50KHByaXYsCisJCQkJICAgICAiUmVjZWl2ZWQgYSBiZWFjb24gZnJvbSBhbiB1bmtvd24gQVAiLAorCQkJCSAgICAgbWxtZSwgMCk7CisJCWJyZWFrOworCisJY2FzZSBET1QxMV9PSURfUFJPQkU6CisJCS8qIHdlIHJlY2VpdmVkIGEgcHJvYmUgZnJvbSBhIGNsaWVudC4gKi8KKwkJc2VuZF9mb3JtYXR0ZWRfZXZlbnQocHJpdiwgIlJlY2VpdmVkIGEgcHJvYmUgZnJvbSBjbGllbnQiLCBtbG1lLAorCQkJCSAgICAgMCk7CisJCWJyZWFrOworCisJCS8qIE5vdGUgOiAibWxtZSIgaXMgYWN0dWFsbHkgYSAic3RydWN0IG9ial9tbG1lZXggKiIgaGVyZSwgYnV0IHRoaXMKKwkJICogaXMgYmFja3dhcmQgY29tcGF0aWJsZSBsYXlvdXQtd2lzZSB3aXRoICJzdHJ1Y3Qgb2JqX21sbWUiLgorCQkgKi8KKworCWNhc2UgRE9UMTFfT0lEX0RFQVVUSEVOVElDQVRFRVg6CisJCXNlbmRfZm9ybWF0dGVkX2V2ZW50KHByaXYsICJEZUF1dGhlbnRpY2F0ZSByZXF1ZXN0IiwgbWxtZSwgMCk7CisJCWJyZWFrOworCisJY2FzZSBET1QxMV9PSURfQVVUSEVOVElDQVRFRVg6CisJCWhhbmRsZV9yZXF1ZXN0KHByaXYsIG1sbWUsIG9pZCk7CisJCXNlbmRfZm9ybWF0dGVkX2V2ZW50KHByaXYsICJBdXRoZW50aWNhdGUgcmVxdWVzdCAoZXgpIiwgbWxtZSwgMSk7CisKKwkJaWYgKHByaXYtPml3X21vZGUgIT0gSVdfTU9ERV9NQVNURVIgCisJCQkJJiYgbWxtZWV4LT5zdGF0ZSAhPSBET1QxMV9TVEFURV9BVVRISU5HKQorCQkJYnJlYWs7CisKKwkJY29uZmlybSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvYmpfbWxtZWV4KSArIDYsIEdGUF9BVE9NSUMpOworCisJCWlmICghY29uZmlybSkgCisJCQlicmVhazsKKworCQltZW1jcHkoJmNvbmZpcm0tPmFkZHJlc3MsIG1sbWVleC0+YWRkcmVzcywgRVRIX0FMRU4pOworCQlwcmludGsoS0VSTl9ERUJVRyAiQXV0aGVudGljYXRlIGZyb206IGFkZHJlc3M6XHQlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgCisJCQkJbWxtZWV4LT5hZGRyZXNzWzBdLAorCQkJCW1sbWVleC0+YWRkcmVzc1sxXSwKKwkJCQltbG1lZXgtPmFkZHJlc3NbMl0sCisJCQkJbWxtZWV4LT5hZGRyZXNzWzNdLAorCQkJCW1sbWVleC0+YWRkcmVzc1s0XSwKKwkJCQltbG1lZXgtPmFkZHJlc3NbNV0KKwkJCQkpOworCQljb25maXJtLT5pZCA9IC0xOyAvKiBvciBtbG1lZXgtPmlkID8gKi8KKwkJY29uZmlybS0+c3RhdGUgPSAwOyAvKiBub3QgdXNlZCAqLworCQljb25maXJtLT5jb2RlID0gMDsKKwkJY29uZmlybS0+c2l6ZSA9IDY7CisJCWNvbmZpcm0tPmRhdGFbMF0gPSAweDAwOworCQljb25maXJtLT5kYXRhWzFdID0gMHgwMDsKKwkJY29uZmlybS0+ZGF0YVsyXSA9IDB4MDI7CisJCWNvbmZpcm0tPmRhdGFbM10gPSAweDAwOworCQljb25maXJtLT5kYXRhWzRdID0gMHgwMDsKKwkJY29uZmlybS0+ZGF0YVs1XSA9IDB4MDA7CisKKwkJcmV0ID0gbWd0X3NldF92YXJsZW4ocHJpdiwgRE9UMTFfT0lEX0FTU09DSUFURUVYLCBjb25maXJtLCA2KTsKKworCQlrZnJlZShjb25maXJtKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWJyZWFrOworCisJY2FzZSBET1QxMV9PSURfRElTQVNTT0NJQVRFRVg6CisJCXNlbmRfZm9ybWF0dGVkX2V2ZW50KHByaXYsICJEaXNhc3NvY2lhdGUgcmVxdWVzdCAoZXgpIiwgbWxtZSwgMCk7CisJCWJyZWFrOworCisJY2FzZSBET1QxMV9PSURfQVNTT0NJQVRFRVg6CisJCWhhbmRsZV9yZXF1ZXN0KHByaXYsIG1sbWUsIG9pZCk7CisJCXNlbmRfZm9ybWF0dGVkX2V2ZW50KHByaXYsICJBc3NvY2lhdGUgcmVxdWVzdCAoZXgpIiwgbWxtZSwgMSk7CisKKwkJaWYgKHByaXYtPml3X21vZGUgIT0gSVdfTU9ERV9NQVNURVIgCisJCQkJJiYgbWxtZWV4LT5zdGF0ZSAhPSBET1QxMV9TVEFURV9BVVRISU5HKQorCQkJYnJlYWs7CisJCQorCQljb25maXJtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG9ial9tbG1lZXgpLCBHRlBfQVRPTUlDKTsKKworCQlpZiAoIWNvbmZpcm0pCisJCQlicmVhazsKKworCQltZW1jcHkoJmNvbmZpcm0tPmFkZHJlc3MsIG1sbWVleC0+YWRkcmVzcywgRVRIX0FMRU4pOworCisJCWNvbmZpcm0tPmlkID0gKChzdHJ1Y3Qgb2JqX21sbWVleCAqKW1sbWUpLT5pZDsKKwkJY29uZmlybS0+c3RhdGUgPSAwOyAvKiBub3QgdXNlZCAqLworCQljb25maXJtLT5jb2RlID0gMDsKKworCQl3cGFfaWVfbGVuID0gcHJpc201NF93cGFfaWVfZ2V0KHByaXYsIG1sbWVleC0+YWRkcmVzcywgd3BhX2llKTsKKworCQlpZiAoIXdwYV9pZV9sZW4pIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJObyBXUEEgSUUgZm91bmQgZnJvbSAiCisJCQkJCSJhZGRyZXNzOlx0JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIAorCQkJCW1sbWVleC0+YWRkcmVzc1swXSwKKwkJCQltbG1lZXgtPmFkZHJlc3NbMV0sCisJCQkJbWxtZWV4LT5hZGRyZXNzWzJdLAorCQkJCW1sbWVleC0+YWRkcmVzc1szXSwKKwkJCQltbG1lZXgtPmFkZHJlc3NbNF0sCisJCQkJbWxtZWV4LT5hZGRyZXNzWzVdCisJCQkJKTsKKwkJCWtmcmVlKGNvbmZpcm0pOworCQkJYnJlYWs7CisJCX0KKworCQljb25maXJtLT5zaXplID0gd3BhX2llX2xlbjsKKwkJbWVtY3B5KCZjb25maXJtLT5kYXRhLCB3cGFfaWUsIHdwYV9pZV9sZW4pOworCisJCW1ndF9zZXRfdmFybGVuKHByaXYsIG9pZCwgY29uZmlybSwgd3BhX2llX2xlbik7CisKKwkJa2ZyZWUoY29uZmlybSk7CisJCQorCQlicmVhazsKKworCWNhc2UgRE9UMTFfT0lEX1JFQVNTT0NJQVRFRVg6CisJCWhhbmRsZV9yZXF1ZXN0KHByaXYsIG1sbWUsIG9pZCk7CisJCXNlbmRfZm9ybWF0dGVkX2V2ZW50KHByaXYsICJSZWFzc29jaWF0ZSByZXF1ZXN0IChleCkiLCBtbG1lLCAxKTsKKworCQlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX01BU1RFUiAKKwkJCQkmJiBtbG1lZXgtPnN0YXRlICE9IERPVDExX1NUQVRFX0FTU09DSU5HKQorCQkJYnJlYWs7CisKKwkJY29uZmlybSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvYmpfbWxtZWV4KSwgR0ZQX0FUT01JQyk7CisKKwkJaWYgKCFjb25maXJtKQorCQkJYnJlYWs7CisKKwkJbWVtY3B5KCZjb25maXJtLT5hZGRyZXNzLCBtbG1lZXgtPmFkZHJlc3MsIEVUSF9BTEVOKTsKKworCQljb25maXJtLT5pZCA9IG1sbWVleC0+aWQ7CisJCWNvbmZpcm0tPnN0YXRlID0gMDsgLyogbm90IHVzZWQgKi8KKwkJY29uZmlybS0+Y29kZSA9IDA7CisKKwkJd3BhX2llX2xlbiA9IHByaXNtNTRfd3BhX2llX2dldChwcml2LCBtbG1lZXgtPmFkZHJlc3MsIHdwYV9pZSk7CisKKwkJaWYgKCF3cGFfaWVfbGVuKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiTm8gV1BBIElFIGZvdW5kIGZyb20gIgorCQkJCQkiYWRkcmVzczpcdCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCAKKwkJCQltbG1lZXgtPmFkZHJlc3NbMF0sCisJCQkJbWxtZWV4LT5hZGRyZXNzWzFdLAorCQkJCW1sbWVleC0+YWRkcmVzc1syXSwKKwkJCQltbG1lZXgtPmFkZHJlc3NbM10sCisJCQkJbWxtZWV4LT5hZGRyZXNzWzRdLAorCQkJCW1sbWVleC0+YWRkcmVzc1s1XQorCQkJCSk7CisJCQlrZnJlZShjb25maXJtKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY29uZmlybS0+c2l6ZSA9IHdwYV9pZV9sZW47IAorCQltZW1jcHkoJmNvbmZpcm0tPmRhdGEsIHdwYV9pZSwgd3BhX2llX2xlbik7CisKKwkJbWd0X3NldF92YXJsZW4ocHJpdiwgb2lkLCBjb25maXJtLCB3cGFfaWVfbGVuKTsKKworCQlrZnJlZShjb25maXJtKTsKKwkJCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9jZXNzIGEgZGV2aWNlIHRyYXAuICBUaGlzIGlzIGNhbGxlZCB2aWEgc2NoZWR1bGVfd29yaygpLCBvdXRzaWRlIG9mCisgKiBpbnRlcnJ1cHQgY29udGV4dCwgbm8gbG9ja3MgaGVsZC4KKyAqLwordm9pZAorcHJpc201NF9wcm9jZXNzX3RyYXAodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXNscGNpX21nbXRmcmFtZSAqZnJhbWUgPSBkYXRhOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZnJhbWUtPm5kZXY7CisJZW51bSBvaWRfbnVtX3QgbiA9IG1ndF9vaWR0b251bShmcmFtZS0+aGVhZGVyLT5vaWQpOworCisJaWYgKG4gIT0gT0lEX05VTV9MQVNUKQorCQlwcmlzbTU0X3Byb2Nlc3NfdHJhcF9oZWxwZXIobmV0ZGV2X3ByaXYobmRldiksIG4sIGZyYW1lLT5kYXRhKTsKKwlpc2xwY2lfbWd0X3JlbGVhc2UoZnJhbWUpOworfQorCitpbnQKK3ByaXNtNTRfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICphZGRyKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaW50IHJldDsKKworCWlmIChuZGV2LT5hZGRyX2xlbiAhPSA2KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXQgPSBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgR0VOX09JRF9NQUNBRERSRVNTLCAwLAorCQkJICAgICAgJigoc3RydWN0IHNvY2thZGRyICopIGFkZHIpLT5zYV9kYXRhKTsKKwlpZiAoIXJldCkKKwkJbWVtY3B5KHByaXYtPm5kZXYtPmRldl9hZGRyLAorCQkgICAgICAgJigoc3RydWN0IHNvY2thZGRyICopIGFkZHIpLT5zYV9kYXRhLCA2KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIE5vdGU6IGN1cnJlbnRseSwgdXNlIGhvc3RhcGQgaW9jdGwgZnJvbSB0aGUgSG9zdCBBUCBkcml2ZXIgZm9yIFdQQQorICogc3VwcG9ydC4gVGhpcyBpcyB0byBiZSByZXBsYWNlZCB3aXRoIExpbnV4IHdpcmVsZXNzIGV4dGVuc2lvbnMgb25jZSB0aGV5CisgKiBnZXQgV1BBIHN1cHBvcnQuICovCisKKy8qIE5vdGUgSUk6IHBsZWFzZSBsZWF2ZSBhbGwgdGhpcyB0b2dldGhlciBhcyBpdCB3aWxsIGJlIGVhc2llciB0byByZW1vdmUgbGF0ZXIsCisgKiBvbmNlIHdpcmVsZXNzIGV4dGVuc2lvbnMgYWRkIFdQQSBzdXBwb3J0IC1tY2dyb2YgKi8KKworLyogUFJJU001NF9IT1NUQVBEIGlvY3RsKCkgY21kOiAqLworZW51bSB7CisJUFJJU00yX1NFVF9FTkNSWVBUSU9OID0gNiwKKwlQUklTTTJfSE9TVEFQRF9TRVRfR0VORVJJQ19FTEVNRU5UID0gMTIsCisJUFJJU00yX0hPU1RBUERfTUxNRSA9IDEzLAorCVBSSVNNMl9IT1NUQVBEX1NDQU5fUkVRID0gMTQsCit9OworCisjZGVmaW5lIFBSSVNNNTRfU0VUX1dQQQkJCVNJT0NJV0ZJUlNUUFJJVisxMgorI2RlZmluZSBQUklTTTU0X0hPU1RBUEQJCQlTSU9DSVdGSVJTVFBSSVYrMjUKKyNkZWZpbmUgUFJJU001NF9EUk9QX1VORU5DUllQVEVECVNJT0NJV0ZJUlNUUFJJVisyNgorCisjZGVmaW5lIFBSSVNNMl9IT1NUQVBEX01BWF9CVUZfU0laRSAxMDI0CisjZGVmaW5lIFBSSVNNMl9IT1NUQVBEX0dFTkVSSUNfRUxFTUVOVF9IRFJfTEVOIFwKKygoaW50KSAoJigoc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtICopIDApLT51LmdlbmVyaWNfZWxlbS5kYXRhKSkKKworLyogTWF4aW11bSBsZW5ndGggZm9yIGFsZ29yaXRobSBuYW1lcyAoLTEgZm9yIG51bCB0ZXJtaW5hdGlvbikgCisgKiB1c2VkIGluIGlvY3RsKCkgKi8KKyNkZWZpbmUgSE9TVEFQX0NSWVBUX0FMR19OQU1FX0xFTiAxNgorCQorc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtIHsKKwl1MzIgY21kOworCXU4IHN0YV9hZGRyW0VUSF9BTEVOXTsKKwl1bmlvbiB7CisJICAgICAgIHN0cnVjdCB7CisJCSAgICAgICB1OCBhbGdbSE9TVEFQX0NSWVBUX0FMR19OQU1FX0xFTl07CisJCSAgICAgICB1MzIgZmxhZ3M7CisJCSAgICAgICB1MzIgZXJyOworCQkgICAgICAgdTggaWR4OworCQkgICAgICAgdTggc2VxWzhdOyAvKiBzZXF1ZW5jZSBjb3VudGVyIChzZXQ6IFJYLCBnZXQ6IFRYKSAqLworCQkgICAgICAgdTE2IGtleV9sZW47CisJCSAgICAgICB1OCBrZXlbMF07CisJCSAgICAgICB9IGNyeXB0OworICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgdTggbGVuOworICAgICAgICAgICAgICAgICAgICAgICB1OCBkYXRhWzBdOworICAgICAgICAgICAgICAgfSBnZW5lcmljX2VsZW07CisgICAgICAgICAgICAgICBzdHJ1Y3QgeworI2RlZmluZSBNTE1FX1NUQV9ERUFVVEggMAorI2RlZmluZSBNTE1FX1NUQV9ESVNBU1NPQyAxCisgICAgICAgICAgICAgICAgICAgICAgIHUxNiBjbWQ7CisgICAgICAgICAgICAgICAgICAgICAgIHUxNiByZWFzb25fY29kZTsKKyAgICAgICAgICAgICAgIH0gbWxtZTsKKyAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgIHU4IHNzaWRfbGVuOworICAgICAgICAgICAgICAgICAgICAgICB1OCBzc2lkWzMyXTsKKyAgICAgICAgICAgICAgIH0gc2Nhbl9yZXE7CisgICAgICAgfSB1OworfTsKKworCitzdGF0aWMgaW50CitwcmlzbTJfaW9jdGxfc2V0X2VuY3J5cHRpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKnBhcmFtLAorCWludCBwYXJhbV9sZW4pCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBydmFsdWUgPSAwLCBmb3JjZSA9IDA7CisJaW50IGF1dGhlbiA9IERPVDExX0FVVEhfT1MsIGludm9rZSA9IDAsIGV4dW5lbmNyeXB0ID0gMDsKKwl1bmlvbiBvaWRfcmVzX3QgcjsKKworCS8qIHdpdGggdGhlIG5ldyBBUEksIGl0J3MgaW1wb3NzaWJsZSB0byBnZXQgYSBOVUxMIHBvaW50ZXIuCisJICogTmV3IHZlcnNpb24gb2YgaXdjb25maWcgc2V0IHRoZSBJV19FTkNPREVfTk9LRVkgZmxhZworCSAqIHdoZW4gbm8ga2V5IGlzIGdpdmVuLCBidXQgb2xkZXIgdmVyc2lvbnMgZG9uJ3QuICovCisKKwlpZiAocGFyYW0tPnUuY3J5cHQua2V5X2xlbiA+IDApIHsKKwkJLyogd2UgaGF2ZSBhIGtleSB0byBzZXQgKi8KKwkJaW50IGluZGV4ID0gcGFyYW0tPnUuY3J5cHQuaWR4OworCQlpbnQgY3VycmVudF9pbmRleDsKKwkJc3RydWN0IG9ial9rZXkga2V5ID0geyBET1QxMV9QUklWX1RLSVAsIDAsICIiIH07CisKKwkJLyogZ2V0IHRoZSBjdXJyZW50IGtleSBpbmRleCAqLworCQlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0RFRktFWUlELCAwLCBOVUxMLCAmcik7CisJCWN1cnJlbnRfaW5kZXggPSByLnU7CisJCS8qIFZlcmlmeSB0aGF0IHRoZSBrZXkgaXMgbm90IG1hcmtlZCBhcyBpbnZhbGlkICovCisJCWlmICghKHBhcmFtLT51LmNyeXB0LmZsYWdzICYgSVdfRU5DT0RFX05PS0VZKSkgeworCQkJa2V5Lmxlbmd0aCA9IHBhcmFtLT51LmNyeXB0LmtleV9sZW4gPiBzaXplb2YgKHBhcmFtLT51LmNyeXB0LmtleSkgPworCQkJICAgIHNpemVvZiAocGFyYW0tPnUuY3J5cHQua2V5KSA6IHBhcmFtLT51LmNyeXB0LmtleV9sZW47CisJCQltZW1jcHkoa2V5LmtleSwgcGFyYW0tPnUuY3J5cHQua2V5LCBrZXkubGVuZ3RoKTsKKwkJCWlmIChrZXkubGVuZ3RoID09IDMyKQorCQkJCS8qIHdlIHdhbnQgV1BBLVBTSyAqLworCQkJCWtleS50eXBlID0gRE9UMTFfUFJJVl9US0lQOworCQkJaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+IDMpKQorCQkJCS8qIG5vIGluZGV4IHByb3ZpZGVkIHVzZSB0aGUgY3VycmVudCBvbmUgKi8KKwkJCQlpbmRleCA9IGN1cnJlbnRfaW5kZXg7CisKKwkJCS8qIG5vdyBzZW5kIHRoZSBrZXkgdG8gdGhlIGNhcmQgICovCisJCQlydmFsdWUgfD0KKwkJCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0RFRktFWVgsIGluZGV4LAorCQkJCQkgICAgJmtleSk7CisJCX0KKwkJLyoKKwkJICogSWYgYSB2YWxpZCBrZXkgaXMgc2V0LCBlbmNyeXB0aW9uIHNob3VsZCBiZSBlbmFibGVkIAorCQkgKiAodXNlciBtYXkgdHVybiBpdCBvZmYgbGF0ZXIpLgorCQkgKiBUaGlzIGlzIGFsc28gaG93ICJpd2NvbmZpZyBldGhYIGtleSBvbiIgd29ya3MKKwkJICovCisJCWlmICgoaW5kZXggPT0gY3VycmVudF9pbmRleCkgJiYgKGtleS5sZW5ndGggPiAwKSkKKwkJCWZvcmNlID0gMTsKKwl9IGVsc2UgeworCQlpbnQgaW5kZXggPSAocGFyYW0tPnUuY3J5cHQuZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJaWYgKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPD0gMykpIHsKKwkJCS8qIHdlIHdhbnQgdG8gc2V0IHRoZSBrZXkgaW5kZXggKi8KKwkJCXJ2YWx1ZSB8PQorCQkJICAgIG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfREVGS0VZSUQsIDAsCisJCQkJCSAgICAmaW5kZXgpOworCQl9IGVsc2UgeworCQkJaWYgKCFwYXJhbS0+dS5jcnlwdC5mbGFncyAmIElXX0VOQ09ERV9NT0RFKSB7CisJCQkJLyogd2UgY2Fubm90IGRvIGFueXRoaW5nLiBDb21wbGFpbi4gKi8KKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKwkvKiBub3cgcmVhZCB0aGUgZmxhZ3MgKi8KKwlpZiAocGFyYW0tPnUuY3J5cHQuZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKKwkJLyogRW5jb2RpbmcgZGlzYWJsZWQsIAorCQkgKiBhdXRoZW4gPSBET1QxMV9BVVRIX09TOworCQkgKiBpbnZva2UgPSAwOworCQkgKiBleHVuZW5jcnlwdCA9IDA7ICovCisJfQorCWlmIChwYXJhbS0+dS5jcnlwdC5mbGFncyAmIElXX0VOQ09ERV9PUEVOKQorCQkvKiBFbmNvZGUgYnV0IGFjY2VwdCBub24tZW5jb2RlZCBwYWNrZXRzLiBObyBhdXRoICovCisJCWludm9rZSA9IDE7CisJaWYgKChwYXJhbS0+dS5jcnlwdC5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKSB8fCBmb3JjZSkgeworCQkvKiBSZWZ1c2Ugbm9uLWVuY29kZWQgcGFja2V0cy4gQXV0aCAqLworCQlhdXRoZW4gPSBET1QxMV9BVVRIX0JPVEg7CisJCWludm9rZSA9IDE7CisJCWV4dW5lbmNyeXB0ID0gMTsKKwl9CisJLyogZG8gdGhlIGNoYW5nZSBpZiByZXF1ZXN0ZWQgICovCisJaWYgKChwYXJhbS0+dS5jcnlwdC5mbGFncyAmIElXX0VOQ09ERV9NT0RFKSB8fCBmb3JjZSkgeworCQlydmFsdWUgfD0KKwkJICAgIG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfQVVUSEVOQUJMRSwgMCwgJmF1dGhlbik7CisJCXJ2YWx1ZSB8PQorCQkgICAgbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9QUklWQUNZSU5WT0tFRCwgMCwgJmludm9rZSk7CisJCXJ2YWx1ZSB8PQorCQkgICAgbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9FWFVORU5DUllQVEVELCAwLAorCQkJCSAgICAmZXh1bmVuY3J5cHQpOworCX0KKwlyZXR1cm4gcnZhbHVlOworfQorCitzdGF0aWMgaW50CitwcmlzbTJfaW9jdGxfc2V0X2dlbmVyaWNfZWxlbWVudChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwlzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKnBhcmFtLAorCWludCBwYXJhbV9sZW4pCit7CisgICAgICAgaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKyAgICAgICBpbnQgbWF4X2xlbiwgbGVuLCBhbGVuLCByZXQ9MDsKKyAgICAgICBzdHJ1Y3Qgb2JqX2F0dGFjaG1lbnQgKmF0dGFjaDsKKworICAgICAgIGxlbiA9IHBhcmFtLT51LmdlbmVyaWNfZWxlbS5sZW47CisgICAgICAgbWF4X2xlbiA9IHBhcmFtX2xlbiAtIFBSSVNNMl9IT1NUQVBEX0dFTkVSSUNfRUxFTUVOVF9IRFJfTEVOOworICAgICAgIGlmIChtYXhfbGVuIDwgMCB8fCBtYXhfbGVuIDwgbGVuKQorICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICBhbGVuID0gc2l6ZW9mKCphdHRhY2gpICsgbGVuOworICAgICAgIGF0dGFjaCA9IGttYWxsb2MoYWxlbiwgR0ZQX0tFUk5FTCk7CisgICAgICAgaWYgKGF0dGFjaCA9PSBOVUxMKQorICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisKKyAgICAgICBtZW1zZXQoYXR0YWNoLCAwLCBhbGVuKTsKKyNkZWZpbmUgV0xBTl9GQ19UWVBFX01HTVQgMAorI2RlZmluZSBXTEFOX0ZDX1NUWVBFX0FTU09DX1JFUSAwCisjZGVmaW5lIFdMQU5fRkNfU1RZUEVfUkVBU1NPQ19SRVEgMgorCisgICAgICAgLyogTm90ZTogZW5kaWFubmVzcyBpcyBjb3ZlcmVkIGJ5IG1ndF9zZXRfdmFybGVuICovCisKKyAgICAgICBhdHRhY2gtPnR5cGUgPSAoV0xBTl9GQ19UWVBFX01HTVQgPDwgMikgfAorICAgICAgICAgICAgICAgKFdMQU5fRkNfU1RZUEVfQVNTT0NfUkVRIDw8IDQpOworICAgICAgIGF0dGFjaC0+aWQgPSAtMTsKKyAgICAgICBhdHRhY2gtPnNpemUgPSBsZW47CisgICAgICAgbWVtY3B5KGF0dGFjaC0+ZGF0YSwgcGFyYW0tPnUuZ2VuZXJpY19lbGVtLmRhdGEsIGxlbik7CisKKyAgICAgICByZXQgPSBtZ3Rfc2V0X3Zhcmxlbihwcml2LCBET1QxMV9PSURfQVRUQUNITUVOVCwgYXR0YWNoLCBsZW4pOworCisgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICAgICBhdHRhY2gtPnR5cGUgPSAoV0xBTl9GQ19UWVBFX01HTVQgPDwgMikgfAorICAgICAgICAgICAgICAgICAgICAgICAoV0xBTl9GQ19TVFlQRV9SRUFTU09DX1JFUSA8PCA0KTsKKworCSAgICAgICByZXQgPSBtZ3Rfc2V0X3Zhcmxlbihwcml2LCBET1QxMV9PSURfQVRUQUNITUVOVCwgYXR0YWNoLCBsZW4pOworCisJICAgICAgIGlmIChyZXQgPT0gMCkgCisJCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IFdQQSBJRSBBdHRhY2htZW50IHdhcyBzZXRcbiIsCisJCQkJICAgICAgIG5kZXYtPm5hbWUpOworICAgICAgIH0KKworICAgICAgIGtmcmVlKGF0dGFjaCk7CisgICAgICAgcmV0dXJuIHJldDsKKworfQorCitzdGF0aWMgaW50CitwcmlzbTJfaW9jdGxfbWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKnBhcmFtKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGludAorcHJpc20yX2lvY3RsX3NjYW5fcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtICpwYXJhbSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCWludCBpLCBydmFsdWU7CisJc3RydWN0IG9ial9ic3NsaXN0ICpic3NsaXN0OworCXUzMiBub2lzZSA9IDA7CisJY2hhciAqZXh0cmEgPSAiIjsKKwljaGFyICpjdXJyZW50X2V2ID0gImZvbyI7CisJdW5pb24gb2lkX3Jlc190IHI7CisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSA8IFBSVl9TVEFURV9JTklUKSB7CisJCS8qIGRldmljZSBpcyBub3QgcmVhZHksIGZhaWwgZ2VudGx5ICovCisJCXJldHVybiAwOworCX0KKworCS8qIGZpcnN0IGdldCB0aGUgbm9pc2UgdmFsdWUuIFdlIHdpbGwgdXNlIGl0IHRvIHJlcG9ydCB0aGUgbGluayBxdWFsaXR5ICovCisJcnZhbHVlID0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9OT0lTRUZMT09SLCAwLCBOVUxMLCAmcik7CisJbm9pc2UgPSByLnU7CisKKwkvKiBBc2sgdGhlIGRldmljZSBmb3IgYSBsaXN0IG9mIGtub3duIGJzcy4gV2UgY2FuIHJlcG9ydCBhdCBtb3N0CisJICogSVdfTUFYX0FQPTY0IHRvIHRoZSByYW5nZSBzdHJ1Y3QuIEJ1dCB0aGUgZGV2aWNlIHdvbid0IHJlcHBvcnQgYW55dGhpbmcKKwkgKiBpZiB5b3UgY2hhbmdlIHRoZSB2YWx1ZSBvZiBJV01BWF9CU1M9MjQuCisJICovCisJcnZhbHVlIHw9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfQlNTTElTVCwgMCwgTlVMTCwgJnIpOworCWJzc2xpc3QgPSByLnB0cjsKKworCS8qIG9rIG5vdywgc2NhbiB0aGUgbGlzdCBhbmQgdHJhbnNsYXRlIGl0cyBpbmZvICovCisJZm9yIChpID0gMDsgaSA8IG1pbihJV19NQVhfQVAsIChpbnQpIGJzc2xpc3QtPm5yKTsgaSsrKQorCQljdXJyZW50X2V2ID0gcHJpc201NF90cmFuc2xhdGVfYnNzKG5kZXYsIGN1cnJlbnRfZXYsCisJCQkJCQkgICBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsCisJCQkJCQkgICAmKGJzc2xpc3QtPmJzc2xpc3RbaV0pLAorCQkJCQkJICAgbm9pc2UpOworCWtmcmVlKGJzc2xpc3QpOworCisJcmV0dXJuIHJ2YWx1ZTsKK30KKworc3RhdGljIGludAorcHJpc201NF9ob3N0YXBkKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKnApCit7CisgICAgICAgc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtICpwYXJhbTsKKyAgICAgICBpbnQgcmV0ID0gMDsKKyAgICAgICB1MzIgdXdycTsKKworICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJwcmlzbTU0X2hvc3RhcGQgLSBsZW49JWRcbiIsIHAtPmxlbmd0aCk7CisgICAgICAgaWYgKHAtPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0pIHx8CisgICAgICAgICAgIHAtPmxlbmd0aCA+IFBSSVNNMl9IT1NUQVBEX01BWF9CVUZfU0laRSB8fCAhcC0+cG9pbnRlcikKKyAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgcGFyYW0gPSAoc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtICopIGttYWxsb2MocC0+bGVuZ3RoLCBHRlBfS0VSTkVMKTsKKyAgICAgICBpZiAocGFyYW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworCisgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKHBhcmFtLCBwLT5wb2ludGVyLCBwLT5sZW5ndGgpKSB7CisgICAgICAgICAgICAgICBrZnJlZShwYXJhbSk7CisgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICB9CisKKyAgICAgICBzd2l0Y2ggKHBhcmFtLT5jbWQpIHsKKyAgICAgICBjYXNlIFBSSVNNMl9TRVRfRU5DUllQVElPTjoKKwkgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDYXVnaHQgV1BBIHN1cHBsaWNhbnQgc2V0IGVuY3J5cHRpb24gcmVxdWVzdFxuIiwKKwkJCSAgICAgICBuZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgIHJldCA9IHByaXNtMl9pb2N0bF9zZXRfZW5jcnlwdGlvbihuZGV2LCBwYXJhbSwgcC0+bGVuZ3RoKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgUFJJU00yX0hPU1RBUERfU0VUX0dFTkVSSUNfRUxFTUVOVDoKKwkgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDYXVnaHQgV1BBIHN1cHBsaWNhbnQgc2V0IFdQQSBJRSByZXF1ZXN0XG4iLAorCQkJICAgICAgIG5kZXYtPm5hbWUpOworICAgICAgICAgICAgICAgcmV0ID0gcHJpc20yX2lvY3RsX3NldF9nZW5lcmljX2VsZW1lbnQobmRldiwgcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5sZW5ndGgpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSBQUklTTTJfSE9TVEFQRF9NTE1FOgorCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IENhdWdodCBXUEEgc3VwcGxpY2FudCBNTE1FIHJlcXVlc3RcbiIsCisJCQkgICAgICAgbmRldi0+bmFtZSk7CisgICAgICAgICAgICAgICByZXQgPSBwcmlzbTJfaW9jdGxfbWxtZShuZGV2LCBwYXJhbSk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIFBSSVNNMl9IT1NUQVBEX1NDQU5fUkVROgorCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IENhdWdodCBXUEEgc3VwcGxpY2FudCBzY2FuIHJlcXVlc3RcbiIsCisJCQkgICAgICAgbmRldi0+bmFtZSk7CisgICAgICAgICAgICAgICByZXQgPSBwcmlzbTJfaW9jdGxfc2Nhbl9yZXEobmRldiwgcGFyYW0pOworICAgICAgICAgICAgICAgYnJlYWs7CisJY2FzZSBQUklTTTU0X1NFVF9XUEE6CisJICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogQ2F1Z2h0IFdQQSBzdXBwbGljYW50IHdwYSBpbml0IHJlcXVlc3RcbiIsCisJCQkgICAgICAgbmRldi0+bmFtZSk7CisJICAgICAgIHV3cnEgPSAxOworCSAgICAgICByZXQgPSBwcmlzbTU0X3NldF93cGEobmRldiwgTlVMTCwgJnV3cnEsIE5VTEwpOworCSAgICAgICBicmVhazsKKwljYXNlIFBSSVNNNTRfRFJPUF9VTkVOQ1JZUFRFRDoKKwkgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDYXVnaHQgV1BBIGRyb3AgdW5lbmNyeXB0ZWQgcmVxdWVzdFxuIiwKKwkJCSAgICAgICBuZGV2LT5uYW1lKTsKKyNpZiAwCisJICAgICAgIHV3cnEgPSAweDAxOworCSAgICAgICBtZ3Rfc2V0KHByaXYsIERPVDExX09JRF9FWFVORU5DUllQVEVELCAmdXdycSk7CisJICAgICAgIGRvd25fd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCSAgICAgICBtZ3RfY29tbWl0KHByaXYpOworCSAgICAgICB1cF93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisjZW5kaWYKKwkgICAgICAgLyogTm90IG5lY2Vzc2FyeSwgYXMgc2V0X3dwYSBkb2VzIGl0LCBzaG91bGQgd2UganVzdCBkbyBpdCBoZXJlIHRob3VnaD8gKi8KKwkgICAgICAgcmV0ID0gMDsKKwkgICAgICAgYnJlYWs7CisgICAgICAgZGVmYXVsdDoKKwkgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDYXVnaHQgYSBXUEEgc3VwcGxpY2FudCByZXF1ZXN0IHRoYXQgaXMgbm90IHN1cHBvcnRlZFxuIiwKKwkJCSAgICAgICBuZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgIHJldCA9IC1FT1BOT1RTVVBQOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgfQorCisgICAgICAgaWYgKHJldCA9PSAwICYmIGNvcHlfdG9fdXNlcihwLT5wb2ludGVyLCBwYXJhbSwgcC0+bGVuZ3RoKSkKKyAgICAgICAgICAgICAgIHJldCA9IC1FRkFVTFQ7CisKKyAgICAgICBrZnJlZShwYXJhbSk7CisKKyAgICAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X3NldF93cGEoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCV9fdTMyICogdXdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1MzIgbWxtZSwgYXV0aGVuLCBkb3QxeCwgZmlsdGVyLCB3ZXA7CisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSA8IFBSVl9TVEFURV9JTklUKQorCQlyZXR1cm4gMDsKKworCXdlcCA9IDE7IC8qIEZvciBwcml2YWN5IGludm9rZWQgKi8KKwlmaWx0ZXIgPSAxOyAvKiBGaWx0ZXIgb3V0IGFsbCB1bmVuY3J5cHRlZCBmcmFtZXMgKi8KKwlkb3QxeCA9IDB4MDE7IC8qIFRvIGVuYWJsZSBlYXAgZmlsdGVyICovCisJbWxtZSA9IERPVDExX01MTUVfRVhURU5ERUQ7CisJYXV0aGVuID0gRE9UMTFfQVVUSF9PUzsgLyogT25seSBXRVAgdXNlcyBfU0sgYW5kIF9CT1RIICovCisKKwlkb3duX3dyaXRlKCZwcml2LT5taWJfc2VtKTsKKwlwcml2LT53cGEgPSAqdXdycTsKKworCXN3aXRjaCAocHJpdi0+d3BhKSB7CisJCWRlZmF1bHQ6CisJCWNhc2UgMDogLyogQ2xlYXJzL2Rpc2FibGVzIFdQQSBhbmQgZnJpZW5kcyAqLworCQkJd2VwID0gMDsKKwkJCWZpbHRlciA9IDA7IC8qIERvIG5vdCBmaWx0ZXIgdW4tZW5jcnlwdGVkIGRhdGEgKi8KKwkJCWRvdDF4ID0gMDsKKwkJCW1sbWUgPSBET1QxMV9NTE1FX0FVVE87CisJCQlwcmludGsoIiVzOiBEaXNhYmxpbmcgV1BBXG4iLCBuZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIDI6IAorCQljYXNlIDE6IC8qIFdQQSAqLworCQkJcHJpbnRrKCIlczogRW5hYmxpbmcgV1BBXG4iLCBuZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCX0KKwl1cF93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisKKwltZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0FVVEhFTkFCTEUsIDAsICZhdXRoZW4pOworCW1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfUFJJVkFDWUlOVk9LRUQsIDAsICZ3ZXApOworCW1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfRVhVTkVOQ1JZUFRFRCwgMCwgJmZpbHRlcik7CisJbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9ET1QxWEVOQUJMRSwgMCwgJmRvdDF4KTsKKwltZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX01MTUVBVVRPTEVWRUwsIDAsICZtbG1lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF93cGEoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCV9fdTMyICogdXdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwkqdXdycSA9IHByaXYtPndwYTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJpc201NF9zZXRfcHJpc21oZHIoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgX191MzIgKiB1d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXByaXYtPm1vbml0b3JfdHlwZSA9CisJICAgICgqdXdycSA/IEFSUEhSRF9JRUVFODAyMTFfUFJJU00gOiBBUlBIUkRfSUVFRTgwMjExKTsKKwlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCXByaXYtPm5kZXYtPnR5cGUgPSBwcml2LT5tb25pdG9yX3R5cGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJpc201NF9nZXRfcHJpc21oZHIoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgX191MzIgKiB1d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCSp1d3JxID0gKHByaXYtPm1vbml0b3JfdHlwZSA9PSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJpc201NF9kZWJ1Z19vaWQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgX191MzIgKiB1d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJcHJpdi0+cHJpdl9vaWQgPSAqdXdycTsKKwlwcmludGsoIiVzOiBvaWQgMHglMDhYXG4iLCBuZGV2LT5uYW1lLCAqdXdycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJpc201NF9kZWJ1Z19nZXRfb2lkKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKnJlc3BvbnNlOworCWludCByZXQgPSAtRUlPOworCisJcHJpbnRrKCIlczogZ2V0X29pZCAweCUwOFhcbiIsIG5kZXYtPm5hbWUsIHByaXYtPnByaXZfb2lkKTsKKwlkYXRhLT5sZW5ndGggPSAwOworCisJaWYgKGlzbHBjaV9nZXRfc3RhdGUocHJpdikgPj0gUFJWX1NUQVRFX0lOSVQpIHsKKwkJcmV0ID0KKwkJICAgIGlzbHBjaV9tZ3RfdHJhbnNhY3Rpb24ocHJpdi0+bmRldiwgUElNRk9SX09QX0dFVCwKKwkJCQkJICAgcHJpdi0+cHJpdl9vaWQsIGV4dHJhLCAyNTYsCisJCQkJCSAgICZyZXNwb25zZSk7CisJCXByaW50aygiJXM6IHJldDogJWlcbiIsIG5kZXYtPm5hbWUsIHJldCk7CisJCWlmIChyZXQgfHwgIXJlc3BvbnNlCisJCSAgICB8fCByZXNwb25zZS0+aGVhZGVyLT5vcGVyYXRpb24gPT0gUElNRk9SX09QX0VSUk9SKSB7CisJCQlpZiAocmVzcG9uc2UpIHsKKwkJCQlpc2xwY2lfbWd0X3JlbGVhc2UocmVzcG9uc2UpOworCQkJfQorCQkJcHJpbnRrKCIlczogRUlPXG4iLCBuZGV2LT5uYW1lKTsKKwkJCXJldCA9IC1FSU87CisJCX0KKwkJaWYgKCFyZXQpIHsKKwkJCWRhdGEtPmxlbmd0aCA9IHJlc3BvbnNlLT5oZWFkZXItPmxlbmd0aDsKKwkJCW1lbWNweShleHRyYSwgcmVzcG9uc2UtPmRhdGEsIGRhdGEtPmxlbmd0aCk7CisJCQlpc2xwY2lfbWd0X3JlbGVhc2UocmVzcG9uc2UpOworCQkJcHJpbnRrKCIlczogbGVuOiAlaVxuIiwgbmRldi0+bmFtZSwgZGF0YS0+bGVuZ3RoKTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfZGVidWdfc2V0X29pZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBpc2xwY2lfbWdtdGZyYW1lICpyZXNwb25zZTsKKwlpbnQgcmV0ID0gMCwgcmVzcG9uc2Vfb3AgPSBQSU1GT1JfT1BfRVJST1I7CisKKwlwcmludGsoIiVzOiBzZXRfb2lkIDB4JTA4WFx0bGVuOiAlZFxuIiwgbmRldi0+bmFtZSwgcHJpdi0+cHJpdl9vaWQsCisJICAgICAgIGRhdGEtPmxlbmd0aCk7CisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSA+PSBQUlZfU1RBVEVfSU5JVCkgeworCQlyZXQgPQorCQkgICAgaXNscGNpX21ndF90cmFuc2FjdGlvbihwcml2LT5uZGV2LCBQSU1GT1JfT1BfU0VULAorCQkJCQkgICBwcml2LT5wcml2X29pZCwgZXh0cmEsIGRhdGEtPmxlbmd0aCwKKwkJCQkJICAgJnJlc3BvbnNlKTsKKwkJcHJpbnRrKCIlczogcmV0OiAlaVxuIiwgbmRldi0+bmFtZSwgcmV0KTsKKwkJaWYgKHJldCB8fCAhcmVzcG9uc2UKKwkJICAgIHx8IHJlc3BvbnNlLT5oZWFkZXItPm9wZXJhdGlvbiA9PSBQSU1GT1JfT1BfRVJST1IpIHsKKwkJCWlmIChyZXNwb25zZSkgeworCQkJCWlzbHBjaV9tZ3RfcmVsZWFzZShyZXNwb25zZSk7CisJCQl9CisJCQlwcmludGsoIiVzOiBFSU9cbiIsIG5kZXYtPm5hbWUpOworCQkJcmV0ID0gLUVJTzsKKwkJfQorCQlpZiAoIXJldCkgeworCQkJcmVzcG9uc2Vfb3AgPSByZXNwb25zZS0+aGVhZGVyLT5vcGVyYXRpb247CisJCQlwcmludGsoIiVzOiByZXNwb25zZV9vcDogJWlcbiIsIG5kZXYtPm5hbWUsCisJCQkgICAgICAgcmVzcG9uc2Vfb3ApOworCQkJaXNscGNpX21ndF9yZWxlYXNlKHJlc3BvbnNlKTsKKwkJfQorCX0KKworCXJldHVybiAocmV0ID8gcmV0IDogLUVJTlBST0dSRVNTKTsKK30KKworc3RhdGljIGludAorcHJpc201NF9zZXRfc3B5KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQl1bmlvbiBpd3JlcV9kYXRhICp1d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXUzMiB1LCBvaWQgPSBPSURfSU5MX0NPTkZJRzsKKworCWRvd25fd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCW1ndF9nZXQocHJpdiwgT0lEX0lOTF9DT05GSUcsICZ1KTsKKworCWlmICgodXdycS0+ZGF0YS5sZW5ndGggPT0gMCkgJiYgKHByaXYtPnNweV9kYXRhLnNweV9udW1iZXIgPiAwKSkKKwkJLyogZGlzYWJsZSBzcHkgKi8KKwkJdSAmPSB+SU5MX0NPTkZJR19SWEFOTkVYOworCWVsc2UgaWYgKCh1d3JxLT5kYXRhLmxlbmd0aCA+IDApICYmIChwcml2LT5zcHlfZGF0YS5zcHlfbnVtYmVyID09IDApKQorCQkvKiBlbmFibGUgc3B5ICovCisJCXUgfD0gSU5MX0NPTkZJR19SWEFOTkVYOworCisJbWd0X3NldChwcml2LCBPSURfSU5MX0NPTkZJRywgJnUpOworCW1ndF9jb21taXRfbGlzdChwcml2LCAmb2lkLCAxKTsKKwl1cF93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisKKwlyZXR1cm4gaXdfaGFuZGxlcl9zZXRfc3B5KG5kZXYsIGluZm8sIHV3cnEsIGV4dHJhKTsKK30KKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcHJpc201NF9oYW5kbGVyW10gPSB7CisJKGl3X2hhbmRsZXIpIHByaXNtNTRfY29tbWl0LAkvKiBTSU9DU0lXQ09NTUlUICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X25hbWUsCS8qIFNJT0NHSVdOQU1FICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NTSVdOV0lEICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdOV0lEICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X2ZyZXEsCS8qIFNJT0NTSVdGUkVRICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X2ZyZXEsCS8qIFNJT0NHSVdGUkVRICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X21vZGUsCS8qIFNJT0NTSVdNT0RFICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X21vZGUsCS8qIFNJT0NHSVdNT0RFICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X3NlbnMsCS8qIFNJT0NTSVdTRU5TICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X3NlbnMsCS8qIFNJT0NHSVdTRU5TICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NTSVdSQU5HRSAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X2dldF9yYW5nZSwJLyogU0lPQ0dJV1JBTkdFICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NTSVdQUklWICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdQUklWICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NTSVdTVEFUUyAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DR0lXU1RBVFMgKi8KKwlwcmlzbTU0X3NldF9zcHksCS8qIFNJT0NTSVdTUFkgKi8KKwlpd19oYW5kbGVyX2dldF9zcHksCS8qIFNJT0NHSVdTUFkgKi8KKwlpd19oYW5kbGVyX3NldF90aHJzcHksCS8qIFNJT0NTSVdUSFJTUFkgKi8KKwlpd19oYW5kbGVyX2dldF90aHJzcHksCS8qIFNJT0NHSVdUSFJTUFkgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9zZXRfd2FwLAkvKiBTSU9DU0lXQVAgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfd2FwLAkvKiBTSU9DR0lXQVAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DR0lXQVBMSVNUIGRlcHJlY2lhdGVkICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X3NjYW4sCS8qIFNJT0NTSVdTQ0FOICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X3NjYW4sCS8qIFNJT0NHSVdTQ0FOICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X2Vzc2lkLAkvKiBTSU9DU0lXRVNTSUQgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfZXNzaWQsCS8qIFNJT0NHSVdFU1NJRCAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X3NldF9uaWNrLAkvKiBTSU9DU0lXTklDS04gKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfbmljaywJLyogU0lPQ0dJV05JQ0tOICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X3NldF9yYXRlLAkvKiBTSU9DU0lXUkFURSAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X2dldF9yYXRlLAkvKiBTSU9DR0lXUkFURSAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X3NldF9ydHMsCS8qIFNJT0NTSVdSVFMgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfcnRzLAkvKiBTSU9DR0lXUlRTICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X2ZyYWcsCS8qIFNJT0NTSVdGUkFHICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X2ZyYWcsCS8qIFNJT0NHSVdGUkFHICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X3R4cG93ZXIsCS8qIFNJT0NTSVdUWFBPVyAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X2dldF90eHBvd2VyLAkvKiBTSU9DR0lXVFhQT1cgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9zZXRfcmV0cnksCS8qIFNJT0NTSVdSRVRSWSAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X2dldF9yZXRyeSwJLyogU0lPQ0dJV1JFVFJZICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X2VuY29kZSwJLyogU0lPQ1NJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X2dldF9lbmNvZGUsCS8qIFNJT0NHSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV1BPV0VSICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdQT1dFUiAqLworfTsKKworLyogVGhlIGxvdyBvcmRlciBiaXQgaWRlbnRpZnkgYSBTRVQgKDApIG9yIGEgR0VUICgxKSBpb2N0bC4gICovCisKKyNkZWZpbmUgUFJJU001NF9SRVNFVAkJU0lPQ0lXRklSU1RQUklWCisjZGVmaW5lIFBSSVNNNTRfR0VUX1BPTElDWQlTSU9DSVdGSVJTVFBSSVYrMQorI2RlZmluZSBQUklTTTU0X1NFVF9QT0xJQ1kJU0lPQ0lXRklSU1RQUklWKzIKKyNkZWZpbmUgUFJJU001NF9HRVRfTUFDCQlTSU9DSVdGSVJTVFBSSVYrMworI2RlZmluZSBQUklTTTU0X0FERF9NQUMJCVNJT0NJV0ZJUlNUUFJJVis0CisKKyNkZWZpbmUgUFJJU001NF9ERUxfTUFDCQlTSU9DSVdGSVJTVFBSSVYrNgorCisjZGVmaW5lIFBSSVNNNTRfS0lDS19NQUMJU0lPQ0lXRklSU1RQUklWKzgKKworI2RlZmluZSBQUklTTTU0X0tJQ0tfQUxMCVNJT0NJV0ZJUlNUUFJJVisxMAorCisjZGVmaW5lIFBSSVNNNTRfR0VUX1dQQQkJU0lPQ0lXRklSU1RQUklWKzExCisjZGVmaW5lIFBSSVNNNTRfU0VUX1dQQQkJU0lPQ0lXRklSU1RQUklWKzEyCisKKyNkZWZpbmUgUFJJU001NF9EQkdfT0lECQlTSU9DSVdGSVJTVFBSSVYrMTQKKyNkZWZpbmUgUFJJU001NF9EQkdfR0VUX09JRAlTSU9DSVdGSVJTVFBSSVYrMTUKKyNkZWZpbmUgUFJJU001NF9EQkdfU0VUX09JRAlTSU9DSVdGSVJTVFBSSVYrMTYKKworI2RlZmluZSBQUklTTTU0X0dFVF9PSUQJCVNJT0NJV0ZJUlNUUFJJVisxNworI2RlZmluZSBQUklTTTU0X1NFVF9PSURfVTMyCVNJT0NJV0ZJUlNUUFJJVisxOAorI2RlZmluZQlQUklTTTU0X1NFVF9PSURfU1RSCVNJT0NJV0ZJUlNUUFJJVisyMAorI2RlZmluZQlQUklTTTU0X1NFVF9PSURfQUREUglTSU9DSVdGSVJTVFBSSVYrMjIKKworI2RlZmluZSBQUklTTTU0X0dFVF9QUklTTUhEUglTSU9DSVdGSVJTVFBSSVYrMjMKKyNkZWZpbmUgUFJJU001NF9TRVRfUFJJU01IRFIJU0lPQ0lXRklSU1RQUklWKzI0CisKKyNkZWZpbmUgSVdQUklWX1NFVF9VMzIobix4KQl7IG4sIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic18ieCB9CisjZGVmaW5lIElXUFJJVl9TRVRfU1NJRChuLHgpCXsgbiwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic18ieCB9CisjZGVmaW5lIElXUFJJVl9TRVRfQUREUihuLHgpCXsgbiwgSVdfUFJJVl9UWVBFX0FERFIgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic18ieCB9CisjZGVmaW5lIElXUFJJVl9HRVQobix4KQl7IG4sIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgUFJJVl9TVFJfU0laRSwgImdfInggfQorCisjZGVmaW5lIElXUFJJVl9VMzIobix4KQkJSVdQUklWX1NFVF9VMzIobix4KSwgSVdQUklWX0dFVChuLHgpCisjZGVmaW5lIElXUFJJVl9TU0lEKG4seCkJSVdQUklWX1NFVF9TU0lEKG4seCksIElXUFJJVl9HRVQobix4KQorI2RlZmluZSBJV1BSSVZfQUREUihuLHgpCUlXUFJJVl9TRVRfQUREUihuLHgpLCBJV1BSSVZfR0VUKG4seCkKKworLyogTm90ZSA6IGxpbWl0ZWQgdG8gMTI4IHByaXZhdGUgaW9jdGxzICh3aXJlbGVzcyB0b29scyAyNikgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3MgcHJpc201NF9wcml2YXRlX2FyZ3NbXSA9IHsKKy8qeyBjbWQsIHNldF9hcmdzLCBnZXRfYXJncywgbmFtZSB9ICovCisJe1BSSVNNNTRfUkVTRVQsIDAsIDAsICJyZXNldCJ9LAorCXtQUklTTTU0X0dFVF9QUklTTUhEUiwgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRfcHJpc21oZHIifSwKKwl7UFJJU001NF9TRVRfUFJJU01IRFIsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLAorCSAic2V0X3ByaXNtaGRyIn0sCisJe1BSSVNNNTRfR0VUX1BPTElDWSwgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRQb2xpY3kifSwKKwl7UFJJU001NF9TRVRfUE9MSUNZLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwKKwkgInNldFBvbGljeSJ9LAorCXtQUklTTTU0X0dFVF9NQUMsIDAsIElXX1BSSVZfVFlQRV9BRERSIHwgNjQsICJnZXRNYWMifSwKKwl7UFJJU001NF9BRERfTUFDLCBJV19QUklWX1RZUEVfQUREUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsCisJICJhZGRNYWMifSwKKwl7UFJJU001NF9ERUxfTUFDLCBJV19QUklWX1RZUEVfQUREUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsCisJICJkZWxNYWMifSwKKwl7UFJJU001NF9LSUNLX01BQywgSVdfUFJJVl9UWVBFX0FERFIgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLAorCSAia2lja01hYyJ9LAorCXtQUklTTTU0X0tJQ0tfQUxMLCAwLCAwLCAia2lja0FsbCJ9LAorCXtQUklTTTU0X0dFVF9XUEEsIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0X3dwYSJ9LAorCXtQUklTTTU0X1NFVF9XUEEsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLAorCSAic2V0X3dwYSJ9LAorCXtQUklTTTU0X0RCR19PSUQsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLAorCSAiZGJnX29pZCJ9LAorCXtQUklTTTU0X0RCR19HRVRfT0lELCAwLCBJV19QUklWX1RZUEVfQllURSB8IDI1NiwgImRiZ19nZXRfb2lkIn0sCisJe1BSSVNNNTRfREJHX1NFVF9PSUQsIElXX1BSSVZfVFlQRV9CWVRFIHwgMjU2LCAwLCAiZGJnX3NldF9vaWQifSwKKwkvKiAtLS0gc3ViLWlvY3RscyBoYW5kbGVycyAtLS0gKi8KKwl7UFJJU001NF9HRVRfT0lELAorCSAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IFBSSVZfU1RSX1NJWkUsICIifSwKKwl7UFJJU001NF9TRVRfT0lEX1UzMiwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICIifSwKKwl7UFJJU001NF9TRVRfT0lEX1NUUiwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiIn0sCisJe1BSSVNNNTRfU0VUX09JRF9BRERSLAorCSBJV19QUklWX1RZUEVfQUREUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICIifSwKKwkvKiAtLS0gc3ViLWlvY3RscyBkZWZpbml0aW9ucyAtLS0gKi8KKwlJV1BSSVZfQUREUihHRU5fT0lEX01BQ0FERFJFU1MsICJhZGRyIiksCisJSVdQUklWX0dFVChHRU5fT0lEX0xJTktTVEFURSwgImxpbmtzdGF0ZSIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lEX0JTU1RZUEUsICJic3N0eXBlIiksCisJSVdQUklWX0FERFIoRE9UMTFfT0lEX0JTU0lELCAiYnNzaWQiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9TVEFURSwgInN0YXRlIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfQUlELCAiYWlkIiksCisKKwlJV1BSSVZfU1NJRChET1QxMV9PSURfU1NJRE9WRVJSSURFLCAic3NpZG92ZXJyaWRlIiksCisKKwlJV1BSSVZfVTMyKERPVDExX09JRF9NRURJVU1MSU1JVCwgIm1lZGxpbWl0IiksCisJSVdQUklWX1UzMihET1QxMV9PSURfQkVBQ09OUEVSSU9ELCAiYmVhY29uIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfRFRJTVBFUklPRCwgImR0aW1wZXJpb2QiKSwKKworCUlXUFJJVl9VMzIoRE9UMTFfT0lEX0FVVEhFTkFCTEUsICJhdXRoZW5hYmxlIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfUFJJVkFDWUlOVk9LRUQsICJwcml2aW52b2siKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9FWFVORU5DUllQVEVELCAiZXh1bmVuY3J5cHQiKSwKKworCUlXUFJJVl9VMzIoRE9UMTFfT0lEX1JFS0VZVEhSRVNIT0xELCAicmVrZXl0aHJlc2giKSwKKworCUlXUFJJVl9VMzIoRE9UMTFfT0lEX01BWFRYTElGRVRJTUUsICJtYXh0eGxpZmUiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9NQVhSWExJRkVUSU1FLCAibWF4cnhsaWZlIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfQUxPRlRfRklYRURSQVRFLCAiZml4ZWRyYXRlIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfTUFYRlJBTUVCVVJTVCwgImZyYW1lYnVyc3QiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9QU00sICJwc20iKSwKKworCUlXUFJJVl9VMzIoRE9UMTFfT0lEX0JSSURHRUxPQ0FMLCAiYnJpZGdlIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfQ0xJRU5UUywgImNsaWVudHMiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9DTElFTlRTQVNTT0NJQVRFRCwgImNsaWVudGFzc29jIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfRE9UMVhFTkFCTEUsICJkb3QxeGVuYWJsZSIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lEX0FOVEVOTkFSWCwgInJ4YW50IiksCisJSVdQUklWX1UzMihET1QxMV9PSURfQU5URU5OQVRYLCAidHhhbnQiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9BTlRFTk5BRElWRVJTSVRZLCAiYW50ZGl2ZXJzIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfRURUSFJFU0hPTEQsICJlZHRocmVzaCIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lEX1BSRUFNQkxFU0VUVElOR1MsICJwcmVhbWJsZSIpLAorCUlXUFJJVl9HRVQoRE9UMTFfT0lEX1JBVEVTLCAicmF0ZXMiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9PVVRQVVRQT1dFUiwgIi4xMW91dHBvd2VyIiksCisJSVdQUklWX0dFVChET1QxMV9PSURfU1VQUE9SVEVEUkFURVMsICJzdXBwcmF0ZXMiKSwKKwlJV1BSSVZfR0VUKERPVDExX09JRF9TVVBQT1JURURGUkVRVUVOQ0lFUywgInN1cHBmcmVxIiksCisKKwlJV1BSSVZfVTMyKERPVDExX09JRF9OT0lTRUZMT09SLCAibm9pc2VmbG9vciIpLAorCUlXUFJJVl9HRVQoRE9UMTFfT0lEX0ZSRVFVRU5DWUFDVElWSVRZLCAiZnJlcWFjdGl2aXR5IiksCisJSVdQUklWX1UzMihET1QxMV9PSURfTk9ORVJQUFJPVEVDVElPTiwgIm5vbmVycHByb3RlYyIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lEX1BST0ZJTEVTLCAicHJvZmlsZSIpLAorCUlXUFJJVl9HRVQoRE9UMTFfT0lEX0VYVEVOREVEUkFURVMsICJleHRyYXRlcyIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lEX01MTUVBVVRPTEVWRUwsICJtbG1lbGV2ZWwiKSwKKworCUlXUFJJVl9HRVQoRE9UMTFfT0lEX0JTU1MsICJic3NzIiksCisJSVdQUklWX0dFVChET1QxMV9PSURfQlNTTElTVCwgImJzc2xpc3QiKSwKKwlJV1BSSVZfVTMyKE9JRF9JTkxfTU9ERSwgIm1vZGUiKSwKKwlJV1BSSVZfVTMyKE9JRF9JTkxfQ09ORklHLCAiY29uZmlnIiksCisJSVdQUklWX1UzMihPSURfSU5MX0RPVDExRF9DT05GT1JNQU5DRSwgIi4xMWRjb25mb3JtIiksCisJSVdQUklWX0dFVChPSURfSU5MX1BIWUNBUEFCSUxJVElFUywgInBoeWNhcGEiKSwKKwlJV1BSSVZfVTMyKE9JRF9JTkxfT1VUUFVUUE9XRVIsICJvdXRwb3dlciIpLAorfTsKKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcHJpc201NF9wcml2YXRlX2hhbmRsZXJbXSA9IHsKKwkoaXdfaGFuZGxlcikgcHJpc201NF9yZXNldCwKKwkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfcG9saWN5LAorCShpd19oYW5kbGVyKSBwcmlzbTU0X3NldF9wb2xpY3ksCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X21hYywKKwkoaXdfaGFuZGxlcikgcHJpc201NF9hZGRfbWFjLAorCShpd19oYW5kbGVyKSBOVUxMLAorCShpd19oYW5kbGVyKSBwcmlzbTU0X2RlbF9tYWMsCisJKGl3X2hhbmRsZXIpIE5VTEwsCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfa2lja19tYWMsCisJKGl3X2hhbmRsZXIpIE5VTEwsCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfa2lja19hbGwsCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X3dwYSwKKwkoaXdfaGFuZGxlcikgcHJpc201NF9zZXRfd3BhLAorCShpd19oYW5kbGVyKSBOVUxMLAorCShpd19oYW5kbGVyKSBwcmlzbTU0X2RlYnVnX29pZCwKKwkoaXdfaGFuZGxlcikgcHJpc201NF9kZWJ1Z19nZXRfb2lkLAorCShpd19oYW5kbGVyKSBwcmlzbTU0X2RlYnVnX3NldF9vaWQsCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X29pZCwKKwkoaXdfaGFuZGxlcikgcHJpc201NF9zZXRfdTMyLAorCShpd19oYW5kbGVyKSBOVUxMLAorCShpd19oYW5kbGVyKSBwcmlzbTU0X3NldF9yYXcsCisJKGl3X2hhbmRsZXIpIE5VTEwsCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X3JhdywKKwkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfcHJpc21oZHIsCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X3ByaXNtaGRyLAorfTsKKworY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHByaXNtNTRfaGFuZGxlcl9kZWYgPSB7CisJLm51bV9zdGFuZGFyZCA9IHNpemVvZiAocHJpc201NF9oYW5kbGVyKSAvIHNpemVvZiAoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlID0gc2l6ZW9mIChwcmlzbTU0X3ByaXZhdGVfaGFuZGxlcikgLyBzaXplb2YgKGl3X2hhbmRsZXIpLAorCS5udW1fcHJpdmF0ZV9hcmdzID0KKwkgICAgc2l6ZW9mIChwcmlzbTU0X3ByaXZhdGVfYXJncykgLyBzaXplb2YgKHN0cnVjdCBpd19wcml2X2FyZ3MpLAorCS5zdGFuZGFyZCA9IChpd19oYW5kbGVyICopIHByaXNtNTRfaGFuZGxlciwKKwkucHJpdmF0ZSA9IChpd19oYW5kbGVyICopIHByaXNtNTRfcHJpdmF0ZV9oYW5kbGVyLAorCS5wcml2YXRlX2FyZ3MgPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBwcmlzbTU0X3ByaXZhdGVfYXJncywKKyNpZiBXSVJFTEVTU19FWFQgPT0gMTYKKwkuc3B5X29mZnNldCA9IG9mZnNldG9mKGlzbHBjaV9wcml2YXRlLCBzcHlfZGF0YSksCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID09IDE2ICovCit9OworCisvKiBGb3Igd3BhX3N1cHBsaWNhbnQgKi8KKworaW50CitwcmlzbTU0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKKwlpbnQgcmV0ID0gLTE7CisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBQUklTTTU0X0hPU1RBUEQ6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwkJcmV0ID0gcHJpc201NF9ob3N0YXBkKG5kZXYsICZ3cnEtPnUuZGF0YSk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAtRU9QTk9UU1VQUDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZDVjZGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiAgCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEludGVyc2lsIEFtZXJpY2FzIEluYy4KKyAqICAgICAgICAgICAgKEMpIDIwMDMgQXVyZWxpZW4gQWxsZWF1bWUgPHNsdHNAZnJlZS5mcj4KKyAqICAgICAgICAgICAgKEMpIDIwMDMgTHVpcyBSLiBSb2RyaWd1ZXogPG1jZ3JvZkBydXNsdWcucnV0Z2Vycy5lZHU+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpZm5kZWYgX0lTTF9JT0NUTF9ICisjZGVmaW5lIF9JU0xfSU9DVExfSAorCisjaW5jbHVkZSAiaXNscGNpX21ndC5oIgorI2luY2x1ZGUgImlzbHBjaV9kZXYuaCIKKworI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CS8qIE5ldyBkcml2ZXIgQVBJICovCisKKyNkZWZpbmUgU1VQUE9SVEVEX1dJUkVMRVNTX0VYVCAgICAgICAgICAgICAgICAgIDE2CisKK3ZvaWQgcHJpc201NF9taWJfaW5pdChpc2xwY2lfcHJpdmF0ZSAqKTsKKworc3RydWN0IGl3X3N0YXRpc3RpY3MgKnByaXNtNTRfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICopOwordm9pZCBwcmlzbTU0X3VwZGF0ZV9zdGF0cyhpc2xwY2lfcHJpdmF0ZSAqKTsKKwordm9pZCBwcmlzbTU0X2FjbF9pbml0KHN0cnVjdCBpc2xwY2lfYWNsICopOwordm9pZCBwcmlzbTU0X2FjbF9jbGVhbihzdHJ1Y3QgaXNscGNpX2FjbCAqKTsKKwordm9pZCBwcmlzbTU0X3Byb2Nlc3NfdHJhcCh2b2lkICopOworCit2b2lkIHByaXNtNTRfd3BhX2llX2luaXQoaXNscGNpX3ByaXZhdGUgKnByaXYpOwordm9pZCBwcmlzbTU0X3dwYV9pZV9jbGVhbihpc2xwY2lfcHJpdmF0ZSAqcHJpdik7CisKK2ludCBwcmlzbTU0X3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqLCB2b2lkICopOworCitpbnQgcHJpc201NF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgaWZyZXEgKiwgaW50KTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBwcmlzbTU0X2hhbmRsZXJfZGVmOworCisjZW5kaWYJCQkJLyogX0lTTF9JT0NUTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9vaWQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX29pZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOWVkZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9vaWQuaApAQCAtMCwwICsxLDUwNyBAQAorLyoKKyAqCisgKiAgCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBnbnUub3JnPgorICogIENvcHlyaWdodCAoQykgMjAwNCBMdWlzIFIuIFJvZHJpZ3VleiA8bWNncm9mQHJ1c2x1Zy5ydXRnZXJzLmVkdT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgQXVyZWxpZW4gQWxsZWF1bWUgPHNsdHNAZnJlZS5mcj4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2lmICFkZWZpbmVkKF9JU0xfT0lEX0gpCisjZGVmaW5lIF9JU0xfT0lEX0gKKworLyogCisgKiBNSUIgcmVsYXRlZCBjb25zdGFudCBhbmQgc3RydWN0dXJlIGRlZmluaXRpb25zIGZvciBjb21tdW5pY2F0aW5nCisgKiB3aXRoIHRoZSBkZXZpY2UgZmlybXdhcmUKKyAqLworCitzdHJ1Y3Qgb2JqX3NzaWQgeworCXU4IGxlbmd0aDsKKwljaGFyIG9jdGV0c1szM107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG9ial9rZXkgeworCXU4IHR5cGU7CQkvKiBkb3QxMV9wcml2X3QgKi8KKwl1OCBsZW5ndGg7CisJY2hhciBrZXlbMzJdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBvYmpfbWxtZSB7CisJdTggYWRkcmVzc1s2XTsKKwl1MTYgaWQ7CisJdTE2IHN0YXRlOworCXUxNiBjb2RlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBvYmpfbWxtZWV4IHsKKwl1OCBhZGRyZXNzWzZdOworCXUxNiBpZDsKKwl1MTYgc3RhdGU7CisJdTE2IGNvZGU7CisJdTE2IHNpemU7CisJdTggZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgb2JqX2J1ZmZlciB7CisJdTMyIHNpemU7CisJdTMyIGFkZHI7CQkvKiAzMmJpdCBidXMgYWRkcmVzcyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBvYmpfYnNzIHsKKwl1OCBhZGRyZXNzWzZdOworCWludDoxNjsJCQkvKiBwYWRkaW5nICovCisKKwljaGFyIHN0YXRlOworCWNoYXIgcmVzZXJ2ZWQ7CisJc2hvcnQgYWdlOworCisJY2hhciBxdWFsaXR5OworCWNoYXIgcnNzaTsKKworCXN0cnVjdCBvYmpfc3NpZCBzc2lkOworCXNob3J0IGNoYW5uZWw7CisJY2hhciBiZWFjb25fcGVyaW9kOworCWNoYXIgZHRpbV9wZXJpb2Q7CisJc2hvcnQgY2FwaW5mbzsKKwlzaG9ydCByYXRlczsKKwlzaG9ydCBiYXNpY19yYXRlczsKKwlpbnQ6MTY7CQkJLyogcGFkZGluZyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBvYmpfYnNzbGlzdCB7CisJdTMyIG5yOworCXN0cnVjdCBvYmpfYnNzIGJzc2xpc3RbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG9ial9mcmVxdWVuY2llcyB7CisJdTE2IG5yOworCXUxNiBtaHpbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG9ial9hdHRhY2htZW50IHsKKwljaGFyIHR5cGU7CisJY2hhciByZXNlcnZlZDsKKwlzaG9ydCBpZDsKKwlzaG9ydCBzaXplOworCWNoYXIgZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIAorICogaW4gY2FzZSBldmVyeXRoaW5nJ3Mgb2ssIHRoZSBpbmxpbmVkIGZ1bmN0aW9uIGJlbG93IHdpbGwgYmUKKyAqIG9wdGltaXplZCBhd2F5IGJ5IHRoZSBjb21waWxlci4uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19fYnVnX29uX3dyb25nX3N0cnVjdF9zaXplcyh2b2lkKQoreworCUJVR19PTihzaXplb2YgKHN0cnVjdCBvYmpfc3NpZCkgIT0gMzQpOworCUJVR19PTihzaXplb2YgKHN0cnVjdCBvYmpfa2V5KSAhPSAzNCk7CisJQlVHX09OKHNpemVvZiAoc3RydWN0IG9ial9tbG1lKSAhPSAxMik7CisJQlVHX09OKHNpemVvZiAoc3RydWN0IG9ial9tbG1lZXgpICE9IDE0KTsKKwlCVUdfT04oc2l6ZW9mIChzdHJ1Y3Qgb2JqX2J1ZmZlcikgIT0gOCk7CisJQlVHX09OKHNpemVvZiAoc3RydWN0IG9ial9ic3MpICE9IDYwKTsKKwlCVUdfT04oc2l6ZW9mIChzdHJ1Y3Qgb2JqX2Jzc2xpc3QpICE9IDQpOworCUJVR19PTihzaXplb2YgKHN0cnVjdCBvYmpfZnJlcXVlbmNpZXMpICE9IDIpOworfQorCitlbnVtIGRvdDExX3N0YXRlX3QgeworCURPVDExX1NUQVRFX05PTkUgPSAwLAorCURPVDExX1NUQVRFX0FVVEhJTkcgPSAxLAorCURPVDExX1NUQVRFX0FVVEggPSAyLAorCURPVDExX1NUQVRFX0FTU09DSU5HID0gMywKKworCURPVDExX1NUQVRFX0FTU09DID0gNSwKKwlET1QxMV9TVEFURV9JQlNTID0gNiwKKwlET1QxMV9TVEFURV9XRFMgPSA3Cit9OworCitlbnVtIGRvdDExX2Jzc3R5cGVfdCB7CisJRE9UMTFfQlNTVFlQRV9OT05FID0gMCwKKwlET1QxMV9CU1NUWVBFX0lORlJBID0gMSwKKwlET1QxMV9CU1NUWVBFX0lCU1MgPSAyLAorCURPVDExX0JTU1RZUEVfQU5ZID0gMworfTsKKworZW51bSBkb3QxMV9hdXRoX3QgeworCURPVDExX0FVVEhfTk9ORSA9IDAsCisJRE9UMTFfQVVUSF9PUyA9IDEsCisJRE9UMTFfQVVUSF9TSyA9IDIsCisJRE9UMTFfQVVUSF9CT1RIID0gMworfTsKKworZW51bSBkb3QxMV9tbG1lX3QgeworCURPVDExX01MTUVfQVVUTyA9IDAsCisJRE9UMTFfTUxNRV9JTlRFUk1FRElBVEUgPSAxLAorCURPVDExX01MTUVfRVhURU5ERUQgPSAyCit9OworCitlbnVtIGRvdDExX3ByaXZfdCB7CisJRE9UMTFfUFJJVl9XRVAgPSAwLAorCURPVDExX1BSSVZfVEtJUCA9IDEKK307CisKKy8qIFByaXNtICJOaXRybyIgLyBGcmFtZWJ1cnN0IC8gIlBhY2tldCBGcmFtZSBHcm91cGluZyIKKyAqIFZhbHVlIGlzIGluIG1pY3Jvc2Vjb25kcy4gUmVwcmVzZW50cyB0aGUgIyBtaWNyb3NlY29uZHMKKyAqIHRoZSBmaXJtd2FyZSB3aWxsIHRha2UgdG8gZ3JvdXAgZnJhbWVzIGJlZm9yZSBzZW5kaW5nIG91dCB0aGVuIG91dCAKKyAqIHRvZ2V0aGVyIHdpdGggYSBDU01BIGNvbnRlbnRpb24uIFdpdGhvdXQgdGhpcyBhbGwgZnJhbWVzIGFyZQorICogc2VudCB3aXRoIGEgQ1NNQSBjb250ZW50aW9uLiAKKyAqIEJpYmxpb2dyYXBoeTogCisgKiBodHRwOi8vd3d3LmhwbC5ocC5jb20vcGVyc29uYWwvSmVhbl9Ub3VycmlsaGVzL1BhcGVycy9QYWNrZXQuRnJhbWUuR3JvdXBpbmcuaHRtbAorICovCitlbnVtIGRvdDExX21heGZyYW1lYnVyc3RfdCB7IAorCS8qIFZhbHVlcyBmb3IgRE9UMTFfT0lEX01BWEZSQU1FQlVSU1QgKi8KKwlET1QxMV9NQVhGUkFNRUJVUlNUX09GRiA9IDAsIC8qIENhcmQgZmlybXdhcmUgZGVmYXVsdCAqLworCURPVDExX01BWEZSQU1FQlVSU1RfTUlYRURfU0FGRSA9IDY1MCwgLyogODAyLjExIGEsYixnIHNhZmUgKi8KKwlET1QxMV9NQVhGUkFNRUJVUlNUX0lERUFMID0gMTMwMCwgLyogVGhlb3JldGljYWwgaWRlYWwgbGV2ZWwgKi8KKwlET1QxMV9NQVhGUkFNRUJVUlNUX01BWCA9IDUwMDAsIC8qIFVzZSB0aGlzIGFzIG1heCwKKwkJKiBOb3RlOiBmaXJtd2FyZSBhbGxvd3MgZm9yIGdyZWF0ZXIgdmFsdWVzLiBUaGlzIGlzIGEKKwkJKiByZWNvbW1lbmRlZCBtYXguIEknbGwgdXBkYXRlIHRoaXMgYXMgSSBmaW5kCisJCSogb3V0IHdoYXQgdGhlIHJlYWwgTUFYIGlzLiBBbHNvIG5vdGUgdGhhdCB5b3UgZG9uJ3QgbmVjZXNzYXJpbHkKKwkJKiBnZXQgYmV0dGVyIHJlc3VsdHMgd2l0aCBhIGdyZWF0ZXIgdmFsdWUgaGVyZS4KKwkJKi8KK307CisKKy8qIFN1cHBvcnQgZm9yIDgwMi4xMSBsb25nIGFuZCBzaG9ydCBmcmFtZSBwcmVhbWJsZXMuCisgKiBMb25nCSBwcmVhbWJsZSB1c2VzIDEyOC1iaXQgc3luYyBmaWVsZCwgOC1iaXQgIENSQworICogU2hvcnQgcHJlYW1ibGUgdXNlcyA1Ni1iaXQgIHN5bmMgZmllbGQsIDE2LWJpdCBDUkMKKyAqIAorICogODAyLjExYSAtLSBub3Qgc3VyZSwgYm90aCBvcHRpb25hbGx5ID8KKyAqIDgwMi4xMWIgc3VwcG9ydHMgbG9uZyBhbmQgb3B0aW9uYWxseSBzaG9ydCAKKyAqIDgwMi4xMWcgc3VwcG9ydHMgYm90aCAqLworZW51bSBkb3QxMV9wcmVhbWJsZXNldHRpbmdzX3QgeworCURPVDExX1BSRUFNQkxFU0VUVElOR19MT05HID0gMCwKKwkJLyogQWxsb3dzICpvbmx5KiBsb25nIDgwMi4xMSBwcmVhbWJsZXMgKi8KKwlET1QxMV9QUkVBTUJMRVNFVFRJTkdfU0hPUlQgPSAxLAorCQkvKiBBbGxvd3MgKm9ubHkqIHNob3J0IDgwMi4xMSBwcmVhbWJsZXMgKi8KKwlET1QxMV9QUkVBTUJMRVNFVFRJTkdfRFlOQU1JQyA9IDIKKwkJLyogQXV0b21hdGlHaWNhbGx5IHNldCAqLworfTsKKworLyogU3VwcG9ydCBmb3IgODAyLjExIHNsb3QgdGltaW5nICh0aW1lIGJldHdlZW4gcGFja2V0cykuCisgKgorICogTG9uZyB1c2VzIDgwMi4xMWEgc2xvdCB0aW1pbmcgICg5IHVzZWMgPykKKyAqIFNob3J0IHVzZXMgODAyLjExYiBzbG90IHRpbWluZyAoMjAgdXNlID8pICovCitlbnVtIGRvdDExX3Nsb3RzZXR0aW5nc190IHsKKwlET1QxMV9TTE9UU0VUVElOR1NfTE9ORyA9IDAsIAorCQkvKiBBbGxvd3MgKm9ubHkqIGxvbmcgODAyLjExYiBzbG90IHRpbWluZyAqLworCURPVDExX1NMT1RTRVRUSU5HU19TSE9SVCA9IDEsCisJCS8qIEFsbG93cyAqb25seSogbG9uZyA4MDIuMTFhIHNsb3QgdGltaW5nICovCisJRE9UMTFfU0xPVFNFVFRJTkdTX0RZTkFNSUMgPSAyCisJCS8qIEF1dG9tYXRpR2ljYWxseSBzZXQgKi8KK307CisKKy8qIEFsbCB5b3UgbmVlZCB0byBrbm93LCBFUlAgaXMgIkV4dGVuZGVkIFJhdGUgUEhZIi4KKyAqIEFuIEV4dGVuZGVkIFJhdGUgUEhZIChFUlApIFNUQSBvciBBUCBzaGFsbCBzdXBwb3J0IHRocmVlIGRpZmZlcmVudCAKKyAqIHByZWFtYmxlIGFuZCBoZWFkZXIgZm9ybWF0czoKKyAqIExvbmcgIHByZWFtYmxlIChyZWZlciB0byBhYm92ZSkKKyAqIFNob3J0IHByZWFtYmxlIChyZWZlciB0byBhYm92ZSkKKyAqIE9GRE0gIHByZWFtYmxlICggPyApCisgKgorICogSSdtIGFzc3VtaW5nIGhlcmUgUHJvdGVjdGlvbiB0ZWxscyB0aGUgQVAKKyAqIHRvIGJlIGNhcmVmdWwsIGEgU1RBIHdoaWNoIGNhbm5vdCBoYW5kbGUgdGhlIGxvbmcgcHJlLWFtYmxlCisgKiBoYXMgam9pbmVkLgorICovCitlbnVtIGRvMTFfbm9uZXJwc3RhdHVzX3QgeworCURPVDExX0VSUFNUQVRfTk9ORVBSRVNFTlQgPSAwLAorCURPVDExX0VSUFNUQVRfVVNFUFJPVEVDVElPTiA9IDEKK307CisKKy8qIChFUlAgaXMgIkV4dGVuZGVkIFJhdGUgUEhZIikgV2F5IHRvIHJlYWQgTk9ORVJQIGlzIE5PTi1FUlAtKgorICogVGhlIGtleSBoZXJlIGlzIERPVDExIE5PTiBFUlAgTkVWRVIgcHJvdGVjdHMgYWdhaW5zdAorICogTk9OIEVSUCBTVEEncy4gWW91ICpkb24ndCogd2FudCB0aGlzIHVubGVzcworICogeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLiBJdCBtZWFucyB5b3Ugd2lsbCBvbmx5IAorICogZ2V0IEV4dGVuZGVkIFJhdGUgY2FwYWJpbGl0aWVzICovCitlbnVtIGRvdDExX25vbmVycHByb3RlY3Rpb25fdCB7CisJRE9UMTFfTk9ORVJQX05FVkVSID0gMCwKKwlET1QxMV9OT05FUlBfQUxXQVlTID0gMSwKKwlET1QxMV9OT05FUlBfRFlOQU1JQyA9IDIKK307CisKKy8qIFByZXNldCBPSUQgY29uZmlndXJhdGlvbiBmb3IgODAyLjExIG1vZGVzIAorICogTm90ZTogRE9UMTFfT0lEX0NXW01JTnxNQVhdIGhvbGQgdGhlIHZhbHVlcyBvZiB0aGUgCisgKiBEQ1MgTUlOfE1BWCBiYWNrb2ZmIHVzZWQgKi8KK2VudW0gZG90MTFfcHJvZmlsZV90IHsgLyogQW5kIHNldC9hbGxvd2VkIHZhbHVlcyAqLworCS8qIEFsbG93ZWQgdmFsdWVzIGZvciBET1QxMV9PSURfUFJPRklMRVMgKi8KKwlET1QxMV9QUk9GSUxFX0JfT05MWSA9IDAsCisJCS8qIERPVDExX09JRF9SQVRFUzogMSwgMiwgNS41LCAxMU1icHMgCisJCSAqIERPVDExX09JRF9QUkVBTUJMRVNFVFRJTkdTOiBET1QxMV9QUkVBTUJMRVNFVFRJTkdfRFlOQU1JQworCQkgKiBET1QxMV9PSURfQ1dNSU46IDMxCisJCSAqIERPVDExX09JRF9OT05FUFJPVEVDVElPTjogRE9UMTFfTk9FUlBfRFlOQU1JQworCQkgKiBET1QxMV9PSURfU0xPVFNFVFRJTkdTOiBET1QxMV9TTE9UU0VUVElOR1NfTE9ORworCQkgKi8KKwlET1QxMV9QUk9GSUxFX01JWEVEX0dfV0lGSSA9IDEsCisJCS8qIERPVDExX09JRF9SQVRFUzogMSwgMiwgNS41LCAxMSwgNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NE1icworCQkgKiBET1QxMV9PSURfUFJFQU1CTEVTRVRUSU5HUzogRE9UMTFfUFJFQU1CTEVTRVRUSU5HX0RZTkFNSUMKKwkJICogRE9UMTFfT0lEX0NXTUlOOiAxNQorCQkgKiBET1QxMV9PSURfTk9ORVBST1RFQ1RJT046IERPVDExX05PRVJQX0RZTkFNSUMKKwkJICogRE9UMTFfT0lEX1NMT1RTRVRUSU5HUzogRE9UMTFfU0xPVFNFVFRJTkdTX0RZTkFNSUMKKwkJICovCisJRE9UMTFfUFJPRklMRV9NSVhFRF9MT05HID0gMiwgLyogIkxvbmcgcmFuZ2UiICovCisJCS8qIFNhbWUgYXMgUHJvZmlsZSBNSVhFRF9HX1dJRkkgKi8KKwlET1QxMV9QUk9GSUxFX0dfT05MWSA9IDMsCisJCS8qIFNhbWUgYXMgUHJvZmlsZSBNSVhFRF9HX1dJRkkgKi8KKwlET1QxMV9QUk9GSUxFX1RFU1QgPSA0LAorCQkvKiBTYW1lIGFzIFByb2ZpbGUgTUlYRURfR19XSUZJIGV4Y2VwdDoKKwkJICogRE9UMTFfT0lEX1BSRUFNQkxFU0VUVElOR1M6IERPVDExX1BSRUFNQkxFU0VUVElOR19TSE9SVAorCQkgKiBET1QxMV9PSURfTk9ORVBST1RFQ1RJT046IERPVDExX05PRVJQX05FVkVSCisJCSAqIERPVDExX09JRF9TTE9UU0VUVElOR1M6IERPVDExX1NMT1RTRVRUSU5HU19TSE9SVAorCQkgKi8KKwlET1QxMV9QUk9GSUxFX0JfV0lGSSA9IDUsCisJCS8qIFNhbWUgYXMgUHJvZmlsZSBCX09OTFkgKi8KKwlET1QxMV9QUk9GSUxFX0FfT05MWSA9IDYsCisJCS8qIFNhbWUgYXMgUHJvZmlsZSBNSVhFRF9HX1dJRkkgZXhjZXB0OgorCQkgKiBET1QxMV9PSURfUkFURVM6IDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTRNYnMKKwkJICovCisJRE9UMTFfUFJPRklMRV9NSVhFRF9TSE9SVCA9IDcKKwkJLyogU2FtZSBhcyBNSVhFRF9HX1dJRkkgKi8KK307CisKKworLyogVGhlIGRvdDExZCBjb25mb3JtYW5jZSBsZXZlbCBjb25maWd1cmVzIHRoZSA4MDIuMTFkIGNvbmZvcm1hbmNlIGxldmVscy4KKyAqIFRoZSBmb2xsb3dpbmcgY29uZm9ybWFuY2UgbGV2ZWxzIGV4aXN0OiovCitlbnVtIG9pZF9pbmxfY29uZm9ybWFuY2VfdCB7CisJT0lEX0lOTF9DT05GT1JNQU5DRV9OT05FID0gMCwJLyogUGVyZm9ybSBhY3RpdmUgc2Nhbm5pbmcgKi8KKwlPSURfSU5MX0NPTkZPUk1BTkNFX1NUUklDVCA9IDEsCS8qIFN0cmljdGx5IGFkaGVyZSB0byA4MDIuMTFkICovCisJT0lEX0lOTF9DT05GT1JNQU5DRV9GTEVYSUJMRSA9IDIsCS8qIFVzZSBwYXNzZWQgODAyLjExZCBpbmZvIHRvCisJCSogZGV0ZXJtaW5lIGNoYW5uZWwgQU5EL09SIGp1c3QgbWFrZSBhc3N1bXB0aW9uIHRoYXQgYWN0aXZlIAorCQkqIGNoYW5uZWxzIGFyZSB2YWxpZCAgY2hhbm5lbHMgKi8KK307CisKK2VudW0gb2lkX2lubF9tb2RlX3QgeworCUlOTF9NT0RFX05PTkUgPSAtMSwKKwlJTkxfTU9ERV9QUk9NSVNDVU9VUyA9IDAsCisJSU5MX01PREVfQ0xJRU5UID0gMSwKKwlJTkxfTU9ERV9BUCA9IDIsCisJSU5MX01PREVfU05JRkZFUiA9IDMKK307CisKK2VudW0gb2lkX2lubF9jb25maWdfdCB7CisJSU5MX0NPTkZJR19OT1RISU5HID0gMHgwMCwKKwlJTkxfQ09ORklHX01BTlVBTFJVTiA9IDB4MDEsCisJSU5MX0NPTkZJR19GUkFNRVRSQVAgPSAweDAyLAorCUlOTF9DT05GSUdfUlhBTk5FWCA9IDB4MDQsCisJSU5MX0NPTkZJR19UWEFOTkVYID0gMHgwOCwKKwlJTkxfQ09ORklHX1dEUyA9IDB4MTAKK307CisKK2VudW0gb2lkX2lubF9waHljYXBfdCB7CisJSU5MX1BIWUNBUF8yNDAwTUhaID0gMSwKKwlJTkxfUEhZQ0FQXzUwMDBNSFogPSAyLAorCUlOTF9QSFlDQVBfRkFBID0gMHg4MDAwMDAwMCwJLyogTWVhbnMgY2FyZCBzdXBwb3J0cyB0aGUgRkFBIHN3aXRjaCAqLworfTsKKworCitlbnVtIG9pZF9udW1fdCB7CisJR0VOX09JRF9NQUNBRERSRVNTID0gMCwKKwlHRU5fT0lEX0xJTktTVEFURSwKKwlHRU5fT0lEX1dBVENIRE9HLAorCUdFTl9PSURfTUlCT1AsCisJR0VOX09JRF9PUFRJT05TLAorCUdFTl9PSURfTEVEQ09ORklHLAorCisJLyogODAyLjExICovCisJRE9UMTFfT0lEX0JTU1RZUEUsCisJRE9UMTFfT0lEX0JTU0lELAorCURPVDExX09JRF9TU0lELAorCURPVDExX09JRF9TVEFURSwKKwlET1QxMV9PSURfQUlELAorCURPVDExX09JRF9DT1VOVFJZU1RSSU5HLAorCURPVDExX09JRF9TU0lET1ZFUlJJREUsCisKKwlET1QxMV9PSURfTUVESVVNTElNSVQsCisJRE9UMTFfT0lEX0JFQUNPTlBFUklPRCwKKwlET1QxMV9PSURfRFRJTVBFUklPRCwKKwlET1QxMV9PSURfQVRJTVdJTkRPVywKKwlET1QxMV9PSURfTElTVEVOSU5URVJWQUwsCisJRE9UMTFfT0lEX0NGUFBFUklPRCwKKwlET1QxMV9PSURfQ0ZQRFVSQVRJT04sCisKKwlET1QxMV9PSURfQVVUSEVOQUJMRSwKKwlET1QxMV9PSURfUFJJVkFDWUlOVk9LRUQsCisJRE9UMTFfT0lEX0VYVU5FTkNSWVBURUQsCisJRE9UMTFfT0lEX0RFRktFWUlELAorCURPVDExX09JRF9ERUZLRVlYLAkvKiBET1QxMV9PSURfREVGS0VZMSwuLi5ET1QxMV9PSURfREVGS0VZNCAqLworCURPVDExX09JRF9TVEFLRVksCisJRE9UMTFfT0lEX1JFS0VZVEhSRVNIT0xELAorCURPVDExX09JRF9TVEFTQywKKworCURPVDExX09JRF9QUklWVFhSRUpFQ1RFRCwKKwlET1QxMV9PSURfUFJJVlJYUExBSU4sCisJRE9UMTFfT0lEX1BSSVZSWEZBSUxFRCwKKwlET1QxMV9PSURfUFJJVlJYTk9LRVksCisKKwlET1QxMV9PSURfUlRTVEhSRVNILAorCURPVDExX09JRF9GUkFHVEhSRVNILAorCURPVDExX09JRF9TSE9SVFJFVFJJRVMsCisJRE9UMTFfT0lEX0xPTkdSRVRSSUVTLAorCURPVDExX09JRF9NQVhUWExJRkVUSU1FLAorCURPVDExX09JRF9NQVhSWExJRkVUSU1FLAorCURPVDExX09JRF9BVVRIUkVTUFRJTUVPVVQsCisJRE9UMTFfT0lEX0FTU09DUkVTUFRJTUVPVVQsCisKKwlET1QxMV9PSURfQUxPRlRfVEFCTEUsCisJRE9UMTFfT0lEX0FMT0ZUX0NUUkxfVEFCTEUsCisJRE9UMTFfT0lEX0FMT0ZUX1JFVFJFQVQsCisJRE9UMTFfT0lEX0FMT0ZUX1BST0dSRVNTLAorCURPVDExX09JRF9BTE9GVF9GSVhFRFJBVEUsCisJRE9UMTFfT0lEX0FMT0ZUX1JTU0lHUkFQSCwKKwlET1QxMV9PSURfQUxPRlRfQ09ORklHLAorCisJRE9UMTFfT0lEX1ZEQ0ZYLAorCURPVDExX09JRF9NQVhGUkFNRUJVUlNULAorCisJRE9UMTFfT0lEX1BTTSwKKwlET1QxMV9PSURfQ0FNVElNRU9VVCwKKwlET1QxMV9PSURfUkVDRUlWRURUSU1TLAorCURPVDExX09JRF9ST0FNUFJFRkVSRU5DRSwKKworCURPVDExX09JRF9CUklER0VMT0NBTCwKKwlET1QxMV9PSURfQ0xJRU5UUywKKwlET1QxMV9PSURfQ0xJRU5UU0FTU09DSUFURUQsCisJRE9UMTFfT0lEX0NMSUVOVFgsCS8qIERPVDExX09JRF9DTElFTlRYLC4uLkRPVDExX09JRF9DTElFTlQyMDA3ICovCisKKwlET1QxMV9PSURfQ0xJRU5URklORCwKKwlET1QxMV9PSURfV0RTTElOS0FERCwKKwlET1QxMV9PSURfV0RTTElOS1JFTU9WRSwKKwlET1QxMV9PSURfRUFQQVVUSFNUQSwKKwlET1QxMV9PSURfRUFQVU5BVVRIU1RBLAorCURPVDExX09JRF9ET1QxWEVOQUJMRSwKKwlET1QxMV9PSURfTUlDRkFJTFVSRSwKKwlET1QxMV9PSURfUkVLRVlJTkRJQ0FURSwKKworCURPVDExX09JRF9NUERVVFhTVUNDRVNTRlVMLAorCURPVDExX09JRF9NUERVVFhPTkVSRVRSWSwKKwlET1QxMV9PSURfTVBEVVRYTVVMVElQTEVSRVRSSUVTLAorCURPVDExX09JRF9NUERVVFhGQUlMRUQsCisJRE9UMTFfT0lEX01QRFVSWFNVQ0NFU1NGVUwsCisJRE9UMTFfT0lEX01QRFVSWERVUFMsCisJRE9UMTFfT0lEX1JUU1NVQ0NFU1NGVUwsCisJRE9UMTFfT0lEX1JUU0ZBSUxFRCwKKwlET1QxMV9PSURfQUNLRkFJTEVELAorCURPVDExX09JRF9GUkFNRVJFQ0VJVkVTLAorCURPVDExX09JRF9GUkFNRUVSUk9SUywKKwlET1QxMV9PSURfRlJBTUVBQk9SVFMsCisJRE9UMTFfT0lEX0ZSQU1FQUJPUlRTUEhZLAorCisJRE9UMTFfT0lEX1NMT1RUSU1FLAorCURPVDExX09JRF9DV01JTiwgLyogTUlOIERDUyBiYWNrb2ZmICovCisJRE9UMTFfT0lEX0NXTUFYLCAvKiBNQVggRENTIGJhY2tvZmYgKi8KKwlET1QxMV9PSURfQUNLV0lORE9XLAorCURPVDExX09JRF9BTlRFTk5BUlgsCisJRE9UMTFfT0lEX0FOVEVOTkFUWCwKKwlET1QxMV9PSURfQU5URU5OQURJVkVSU0lUWSwKKwlET1QxMV9PSURfQ0hBTk5FTCwKKwlET1QxMV9PSURfRURUSFJFU0hPTEQsCisJRE9UMTFfT0lEX1BSRUFNQkxFU0VUVElOR1MsCisJRE9UMTFfT0lEX1JBVEVTLAorCURPVDExX09JRF9DQ0FNT0RFU1VQUE9SVEVELAorCURPVDExX09JRF9DQ0FNT0RFLAorCURPVDExX09JRF9SU1NJVkVDVE9SLAorCURPVDExX09JRF9PVVRQVVRQT1dFUlRBQkxFLAorCURPVDExX09JRF9PVVRQVVRQT1dFUiwKKwlET1QxMV9PSURfU1VQUE9SVEVEUkFURVMsCisJRE9UMTFfT0lEX0ZSRVFVRU5DWSwKKwlET1QxMV9PSURfU1VQUE9SVEVERlJFUVVFTkNJRVMsCisJRE9UMTFfT0lEX05PSVNFRkxPT1IsCisJRE9UMTFfT0lEX0ZSRVFVRU5DWUFDVElWSVRZLAorCURPVDExX09JRF9JUUNBTElCUkFUSU9OVEFCTEUsCisJRE9UMTFfT0lEX05PTkVSUFBST1RFQ1RJT04sCisJRE9UMTFfT0lEX1NMT1RTRVRUSU5HUywKKwlET1QxMV9PSURfTk9ORVJQVElNRU9VVCwKKwlET1QxMV9PSURfUFJPRklMRVMsCisJRE9UMTFfT0lEX0VYVEVOREVEUkFURVMsCisKKwlET1QxMV9PSURfREVBVVRIRU5USUNBVEUsCisJRE9UMTFfT0lEX0FVVEhFTlRJQ0FURSwKKwlET1QxMV9PSURfRElTQVNTT0NJQVRFLAorCURPVDExX09JRF9BU1NPQ0lBVEUsCisJRE9UMTFfT0lEX1NDQU4sCisJRE9UMTFfT0lEX0JFQUNPTiwKKwlET1QxMV9PSURfUFJPQkUsCisJRE9UMTFfT0lEX0RFQVVUSEVOVElDQVRFRVgsCisJRE9UMTFfT0lEX0FVVEhFTlRJQ0FURUVYLAorCURPVDExX09JRF9ESVNBU1NPQ0lBVEVFWCwKKwlET1QxMV9PSURfQVNTT0NJQVRFRVgsCisJRE9UMTFfT0lEX1JFQVNTT0NJQVRFLAorCURPVDExX09JRF9SRUFTU09DSUFURUVYLAorCisJRE9UMTFfT0lEX05PTkVSUFNUQVRVUywKKworCURPVDExX09JRF9TVEFUSU1FT1VULAorCURPVDExX09JRF9NTE1FQVVUT0xFVkVMLAorCURPVDExX09JRF9CU1NUSU1FT1VULAorCURPVDExX09JRF9BVFRBQ0hNRU5ULAorCURPVDExX09JRF9QU01CVUZGRVIsCisKKwlET1QxMV9PSURfQlNTUywKKwlET1QxMV9PSURfQlNTWCwJCS8qRE9UMTFfT0lEX0JTUzEsLi4uLERPVDExX09JRF9CU1M2NCAqLworCURPVDExX09JRF9CU1NGSU5ELAorCURPVDExX09JRF9CU1NMSVNULAorCisJT0lEX0lOTF9UVU5ORUwsCisJT0lEX0lOTF9NRU1BRERSLAorCU9JRF9JTkxfTUVNT1JZLAorCU9JRF9JTkxfTU9ERSwKKwlPSURfSU5MX0NPTVBPTkVOVF9OUiwKKwlPSURfSU5MX1ZFUlNJT04sCisJT0lEX0lOTF9JTlRFUkZBQ0VfSUQsCisJT0lEX0lOTF9DT01QT05FTlRfSUQsCisJT0lEX0lOTF9DT05GSUcsCisJT0lEX0lOTF9ET1QxMURfQ09ORk9STUFOQ0UsCisJT0lEX0lOTF9QSFlDQVBBQklMSVRJRVMsCisJT0lEX0lOTF9PVVRQVVRQT1dFUiwKKworCU9JRF9OVU1fTEFTVAorfTsKKworI2RlZmluZSBPSURfRkxBR19DQUNIRUQJCTB4ODAKKyNkZWZpbmUgT0lEX0ZMQUdfVFlQRQkJMHg3ZgorCisjZGVmaW5lIE9JRF9UWVBFX1UzMgkJMHgwMQorI2RlZmluZSBPSURfVFlQRV9TU0lECQkweDAyCisjZGVmaW5lIE9JRF9UWVBFX0tFWQkJMHgwMworI2RlZmluZSBPSURfVFlQRV9CVUZGRVIJCTB4MDQKKyNkZWZpbmUgT0lEX1RZUEVfQlNTCQkweDA1CisjZGVmaW5lIE9JRF9UWVBFX0JTU0xJU1QJMHgwNgorI2RlZmluZSBPSURfVFlQRV9GUkVRVUVOQ0lFUwkweDA3CisjZGVmaW5lIE9JRF9UWVBFX01MTUUJCTB4MDgKKyNkZWZpbmUgT0lEX1RZUEVfTUxNRUVYCQkweDA5CisjZGVmaW5lIE9JRF9UWVBFX0FERFIJCTB4MEEKKyNkZWZpbmUgT0lEX1RZUEVfUkFXCQkweDBCCisjZGVmaW5lIE9JRF9UWVBFX0FUVEFDSAkJMHgwQworCisvKiBPSURfVFlQRV9NTE1FRVggaXMgc3BlY2lhbCBiZWNhdXNlIG9mIGEgdmFyaWFibGUgc2l6ZSBmaWVsZCB3aGVuIHNlbmRpbmcuCisgKiBOb3QgeWV0IGltcGxlbWVudGVkIChub3QgdXNlZCBpbiBkcml2ZXIgYW55d2F5KS4KKyAqLworCitzdHJ1Y3Qgb2lkX3QgeworCWVudW0gb2lkX251bV90IG9pZDsKKwlzaG9ydCByYW5nZTsJCS8qIHRvIGRlZmluZSBhIHJhbmdlIG9mIG9pZCAqLworCXNob3J0IHNpemU7CQkvKiBtYXggc2l6ZSBvZiB0aGUgYXNzb2NpYXRlZCBkYXRhICovCisJY2hhciBmbGFnczsKK307CisKK3VuaW9uIG9pZF9yZXNfdCB7CisJdm9pZCAqcHRyOworCXUzMiB1OworfTsKKworI2RlZmluZQlJV01BWF9CSVRSQVRFUwkyMAorI2RlZmluZQlJV01BWF9CU1MJMjQKKyNkZWZpbmUgSVdNQVhfRlJFUQkzMAorI2RlZmluZSBQUklWX1NUUl9TSVpFCTEwMjQKKworI2VuZGlmCQkJCS8qICFkZWZpbmVkKF9JU0xfT0lEX0gpICovCisvKiBFT0YgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhYjA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5jCkBAIC0wLDAgKzEsOTU2IEBACisvKgorICogIAorICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBnbnUub3JnPgorICogIENvcHlyaWdodCAoQykgMjAwMyBMdWlzIFIuIFJvZHJpZ3VleiA8bWNncm9mQHJ1c2x1Zy5ydXRnZXJzLmVkdT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAicHJpc21jb21wYXQuaCIKKyNpbmNsdWRlICJpc2xfMzh4eC5oIgorI2luY2x1ZGUgImlzbF9pb2N0bC5oIgorI2luY2x1ZGUgImlzbHBjaV9kZXYuaCIKKyNpbmNsdWRlICJpc2xwY2lfbWd0LmgiCisjaW5jbHVkZSAiaXNscGNpX2V0aC5oIgorI2luY2x1ZGUgIm9pZF9tZ3QuaCIKKworI2RlZmluZSBJU0wzODc3X0lNQUdFX0ZJTEUJImlzbDM4NzciCisjZGVmaW5lIElTTDM4ODZfSU1BR0VfRklMRQkiaXNsMzg4NiIKKyNkZWZpbmUgSVNMMzg5MF9JTUFHRV9GSUxFCSJpc2wzODkwIgorCitzdGF0aWMgaW50IHByaXNtNTRfYnJpbmdfZG93bihpc2xwY2lfcHJpdmF0ZSAqKTsKK3N0YXRpYyBpbnQgaXNscGNpX2FsbG9jX21lbW9yeShpc2xwY2lfcHJpdmF0ZSAqKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXNscGNpX3N0YXRpc3RpY3Moc3RydWN0IG5ldF9kZXZpY2UgKik7CisKKy8qIFRlbXBvcmFyeSBkdW1teSBNQUMgYWRkcmVzcyB0byB1c2UgdW50aWwgZmlybXdhcmUgaXMgbG9hZGVkLgorICogVGhlIGlkZWEgdGhlcmUgaXMgdGhhdCBzb21lIHRvb2xzIChzdWNoIGFzIG5hbWVpZikgbWF5IHF1ZXJ5CisgKiB0aGUgTUFDIGFkZHJlc3MgYmVmb3JlIHRoZSBuZXRkZXYgaXMgJ29wZW4nLiBCeSB1c2luZyBhIHZhbGlkCisgKiBPVUkgcHJlZml4LCB0aGV5IGNhbiBwcm9jZXNzIHRoZSBuZXRkZXYgcHJvcGVybHkuCisgKiBPZiBjb3Vyc2UsIHRoaXMgaXMgbm90IHRoZSBmaW5hbC9yZWFsIE1BQyBhZGRyZXNzLiBJdCBkb2Vzbid0CisgKiBtYXR0ZXIsIGFzIHlvdSBhcmUgc3VwcG9zZSB0byBiZSBhYmxlIHRvIGNoYW5nZSBpdCBhbnl0aW1lIHZpYQorICogbmRldi0+c2V0X21hY19hZGRyZXNzLiBKZWFuIElJICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhcglkdW1teV9tYWNbNl0gPSB7IDB4MDAsIDB4MzAsIDB4QjQsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKworc3RhdGljIGludAoraXNsX3VwbG9hZF9maXJtd2FyZShpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwl1MzIgcmVnLCByYzsKKwl2b2lkIF9faW9tZW0gKmRldmljZV9iYXNlID0gcHJpdi0+ZGV2aWNlX2Jhc2U7CisKKwkvKiBjbGVhciB0aGUgUkFNQm9vdCBhbmQgdGhlIFJlc2V0IGJpdCAqLworCXJlZyA9IHJlYWRsKGRldmljZV9iYXNlICsgSVNMMzhYWF9DVFJMX1NUQVRfUkVHKTsKKwlyZWcgJj0gfklTTDM4WFhfQ1RSTF9TVEFUX1JFU0VUOworCXJlZyAmPSB+SVNMMzhYWF9DVFJMX1NUQVRfUkFNQk9PVDsKKwl3cml0ZWwocmVnLCBkZXZpY2VfYmFzZSArIElTTDM4WFhfQ1RSTF9TVEFUX1JFRyk7CisJd21iKCk7CisJdWRlbGF5KElTTDM4WFhfV1JJVEVJT19ERUxBWSk7CisKKwkvKiBzZXQgdGhlIFJlc2V0IGJpdCB3aXRob3V0IHJlYWRpbmcgdGhlIHJlZ2lzdGVyICEgKi8KKwlyZWcgfD0gSVNMMzhYWF9DVFJMX1NUQVRfUkVTRVQ7CisJd3JpdGVsKHJlZywgZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpOworCXdtYigpOworCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOworCisJLyogY2xlYXIgdGhlIFJlc2V0IGJpdCAqLworCXJlZyAmPSB+SVNMMzhYWF9DVFJMX1NUQVRfUkVTRVQ7CisJd3JpdGVsKHJlZywgZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpOworCXdtYigpOworCisJLyogd2FpdCBhIHdoaWxlIGZvciB0aGUgZGV2aWNlIHRvIHJlYm9vdCAqLworCW1kZWxheSg1MCk7CisKKwl7CisJCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnkgPSBOVUxMOworCQlsb25nIGZ3X2xlbjsKKwkJY29uc3QgdTMyICpmd19wdHI7CisKKwkJcmMgPSByZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgcHJpdi0+ZmlybXdhcmUsIFBSSVNNX0ZXX1BERVYpOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICIlczogcmVxdWVzdF9maXJtd2FyZSgpIGZhaWxlZCBmb3IgJyVzJ1xuIiwKKwkJCSAgICAgICAicHJpc201NCIsIHByaXYtPmZpcm13YXJlKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQkvKiBwcmVwYXJlIHRoZSBEaXJlY3QgTWVtb3J5IEJhc2UgcmVnaXN0ZXIgKi8KKwkJcmVnID0gSVNMMzhYWF9ERVZfRklSTVdBUkVfQUREUkVTOworCisJCWZ3X3B0ciA9ICh1MzIgKikgZndfZW50cnktPmRhdGE7CisJCWZ3X2xlbiA9IGZ3X2VudHJ5LT5zaXplOworCisJCWlmIChmd19sZW4gJSA0KSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiJXM6IGZpcm13YXJlICclcycgc2l6ZSBpcyBub3QgbXVsdGlwbGUgb2YgMzJiaXQsIGFib3J0aW5nIVxuIiwKKwkJCSAgICAgICAicHJpc201NCIsIHByaXYtPmZpcm13YXJlKTsKKwkJCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOworCQkJcmV0dXJuIC1FSUxTRVE7IC8qIElsbGVnYWwgYnl0ZSBzZXF1ZW5jZSAgKi87CisJCX0KKworCQl3aGlsZSAoZndfbGVuID4gMCkgeworCQkJbG9uZyBfZndfbGVuID0KKwkJCSAgICAoZndfbGVuID4KKwkJCSAgICAgSVNMMzhYWF9NRU1PUllfV0lORE9XX1NJWkUpID8KKwkJCSAgICBJU0wzOFhYX01FTU9SWV9XSU5ET1dfU0laRSA6IGZ3X2xlbjsKKwkJCXUzMiBfX2lvbWVtICpkZXZfZndfcHRyID0gZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0RJUkVDVF9NRU1fV0lOOworCisJCQkvKiBzZXQgdGhlIGNhcmRzIGJhc2UgYWRkcmVzcyBmb3Igd3JpdHRpbmcgdGhlIGRhdGEgKi8KKwkJCWlzbDM4eHhfdzMyX2ZsdXNoKGRldmljZV9iYXNlLCByZWcsCisJCQkJCSAgSVNMMzhYWF9ESVJfTUVNX0JBU0VfUkVHKTsKKwkJCXdtYigpOwkvKiBiZSBwYXJhbm9pZCAqLworCisJCQkvKiBpbmNyZW1lbnQgdGhlIHdyaXRlIGFkZHJlc3MgZm9yIG5leHQgaXRlcmF0aW9uICovCisJCQlyZWcgKz0gX2Z3X2xlbjsKKwkJCWZ3X2xlbiAtPSBfZndfbGVuOworCisJCQkvKiB3cml0ZSB0aGUgZGF0YSB0byB0aGUgRGlyZWN0IE1lbW9yeSBXaW5kb3cgMzJiaXQtd2lzZSAqLworCQkJLyogbWVtY3B5X3RvaW8oKSBkb2Vzbid0IGd1YXJhbnRlZSAzMmJpdCB3cml0ZXMgOi18ICovCisJCQl3aGlsZSAoX2Z3X2xlbiA+IDApIHsKKwkJCQkvKiB1c2Ugbm9uLXN3YXBwaW5nIHdyaXRlbCgpICovCisJCQkJX19yYXdfd3JpdGVsKCpmd19wdHIsIGRldl9md19wdHIpOworCQkJCWZ3X3B0cisrLCBkZXZfZndfcHRyKys7CisJCQkJX2Z3X2xlbiAtPSA0OworCQkJfQorCisJCQkvKiBmbHVzaCBQQ0kgcG9zdGluZyAqLworCQkJKHZvaWQpIHJlYWRsKGRldmljZV9iYXNlICsgSVNMMzhYWF9QQ0lfUE9TVElOR19GTFVTSCk7CisJCQl3bWIoKTsJLyogYmUgcGFyYW5vaWQgYWdhaW4gKi8KKworCQkJQlVHX09OKF9md19sZW4gIT0gMCk7CisJCX0KKworCQlCVUdfT04oZndfbGVuICE9IDApOworCisJCS8qIEZpcm13YXJlIHZlcnNpb24gaXMgYXQgb2Zmc2V0IDQwIChhbHNvIGZvciAibmV3bWFjIikgKi8KKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmaXJtd2FyZSB2ZXJzaW9uOiAlLjhzXG4iLAorCQkgICAgICAgcHJpdi0+bmRldi0+bmFtZSwgZndfZW50cnktPmRhdGEgKyA0MCk7CisKKwkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CisJfQorCisJLyogbm93IHJlc2V0IHRoZSBkZXZpY2UKKwkgKiBjbGVhciB0aGUgUmVzZXQgJiBDbGtSdW4gYml0LCBzZXQgdGhlIFJBTUJvb3QgYml0ICovCisJcmVnID0gcmVhZGwoZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpOworCXJlZyAmPSB+SVNMMzhYWF9DVFJMX1NUQVRfQ0xLUlVOOworCXJlZyAmPSB+SVNMMzhYWF9DVFJMX1NUQVRfUkVTRVQ7CisJcmVnIHw9IElTTDM4WFhfQ1RSTF9TVEFUX1JBTUJPT1Q7CisJaXNsMzh4eF93MzJfZmx1c2goZGV2aWNlX2Jhc2UsIHJlZywgSVNMMzhYWF9DVFJMX1NUQVRfUkVHKTsKKwl3bWIoKTsKKwl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKKworCS8qIHNldCB0aGUgcmVzZXQgYml0IGxhdGNoZXMgdGhlIGhvc3Qgb3ZlcnJpZGUgYW5kIFJBTUJvb3QgYml0cworCSAqIGludG8gdGhlIGRldmljZSBmb3Igb3BlcmF0aW9uIHdoZW4gdGhlIHJlc2V0IGJpdCBpcyByZXNldCAqLworCXJlZyB8PSBJU0wzOFhYX0NUUkxfU1RBVF9SRVNFVDsKKwl3cml0ZWwocmVnLCBkZXZpY2VfYmFzZSArIElTTDM4WFhfQ1RSTF9TVEFUX1JFRyk7CisJLyogZG9uJ3QgZG8gZmx1c2ggUENJIHBvc3RpbmcgaGVyZSEgKi8KKwl3bWIoKTsKKwl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKKworCS8qIGNsZWFyIHRoZSByZXNldCBiaXQgc2hvdWxkIHN0YXJ0IHRoZSB3aG9sZSBjaXJjdXMgKi8KKwlyZWcgJj0gfklTTDM4WFhfQ1RSTF9TVEFUX1JFU0VUOworCXdyaXRlbChyZWcsIGRldmljZV9iYXNlICsgSVNMMzhYWF9DVFJMX1NUQVRfUkVHKTsKKwkvKiBkb24ndCBkbyBmbHVzaCBQQ0kgcG9zdGluZyBoZXJlISAqLworCXdtYigpOworCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBEZXZpY2UgSW50ZXJydXB0IEhhbmRsZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaXJxcmV0dXJuX3QKK2lzbHBjaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqY29uZmlnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1MzIgcmVnOworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gY29uZmlnOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcHJpdi0+bmRldjsKKwl2b2lkIF9faW9tZW0gKmRldmljZSA9IHByaXYtPmRldmljZV9iYXNlOworCWludCBwb3dlcnN0YXRlID0gSVNMMzhYWF9QU01fUE9XRVJTQVZFX1NUQVRFOworCisJLyogbG9jayB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlzcGluX2xvY2soJnByaXYtPnNsb2NrKTsKKworCS8qIHJlY2VpdmVkIGFuIGludGVycnVwdCByZXF1ZXN0IG9uIGEgc2hhcmVkIElSUSBsaW5lCisJICogZmlyc3QgY2hlY2sgd2hldGhlciB0aGUgZGV2aWNlIGlzIGluIHNsZWVwIG1vZGUgKi8KKwlyZWcgPSByZWFkbChkZXZpY2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpOworCWlmIChyZWcgJiBJU0wzOFhYX0NUUkxfU1RBVF9TTEVFUE1PREUpCisJCS8qIGRldmljZSBpcyBpbiBzbGVlcCBtb2RlLCBJUlEgd2FzIGdlbmVyYXRlZCBieSBzb21lb25lIGVsc2UgKi8KKwl7CisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJREVCVUcoU0hPV19UUkFDSU5HLCAiQXNzdW1pbmcgc29tZW9uZSBlbHNlIGNhbGxlZCB0aGUgSVJRXG4iKTsKKyNlbmRpZgorCQlzcGluX3VubG9jaygmcHJpdi0+c2xvY2spOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisKKwkvKiBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGFueSBzb3VyY2Ugb2YgaW50ZXJydXB0IG9uIHRoZSBkZXZpY2UgKi8KKwlyZWcgPSByZWFkbChkZXZpY2UgKyBJU0wzOFhYX0lOVF9JREVOVF9SRUcpOworCisJLyogYWxzbyBjaGVjayB0aGUgY29udGVudHMgb2YgdGhlIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIsIGJlY2F1c2UgdGhpcworCSAqIHdpbGwgZmlsdGVyIG91dCBpbnRlcnJ1cHQgc291cmNlcyBmcm9tIG90aGVyIGRldmljZXMgb24gdGhlIHNhbWUgaXJxICEgKi8KKwlyZWcgJj0gcmVhZGwoZGV2aWNlICsgSVNMMzhYWF9JTlRfRU5fUkVHKTsKKwlyZWcgJj0gSVNMMzhYWF9JTlRfU09VUkNFUzsKKworCWlmIChyZWcgIT0gMCkgeworCQlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSAhPSBQUlZfU1RBVEVfU0xFRVApCisJCQlwb3dlcnN0YXRlID0gSVNMMzhYWF9QU01fQUNUSVZFX1NUQVRFOworCisJCS8qIHJlc2V0IHRoZSByZXF1ZXN0IGJpdHMgaW4gdGhlIElkZW50aWZpY2F0aW9uIHJlZ2lzdGVyICovCisJCWlzbDM4eHhfdzMyX2ZsdXNoKGRldmljZSwgcmVnLCBJU0wzOFhYX0lOVF9BQ0tfUkVHKTsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCURFQlVHKFNIT1dfRlVOQ1RJT05fQ0FMTFMsCisJCSAgICAgICJJUlE6IElkZW50aWZpY2F0aW9uIHJlZ2lzdGVyIDB4JXAgMHgleCBcbiIsIGRldmljZSwgcmVnKTsKKyNlbmRpZgorCisJCS8qIGNoZWNrIGZvciBlYWNoIGJpdCBpbiB0aGUgcmVnaXN0ZXIgc2VwYXJhdGVseSAqLworCQlpZiAocmVnICYgSVNMMzhYWF9JTlRfSURFTlRfVVBEQVRFKSB7CisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJCS8qIFF1ZXVlIGhhcyBiZWVuIHVwZGF0ZWQgKi8KKwkJCURFQlVHKFNIT1dfVFJBQ0lORywgIklSUTogVXBkYXRlIGZsYWcgXG4iKTsKKworCQkJREVCVUcoU0hPV19RVUVVRV9JTkRFWEVTLAorCQkJICAgICAgIkNCIGRydiBRczogWyVpXVslaV1bJWldWyVpXVslaV1bJWldXG4iLAorCQkJICAgICAgbGUzMl90b19jcHUocHJpdi0+Y29udHJvbF9ibG9jay0+CisJCQkJCSAgZHJpdmVyX2N1cnJfZnJhZ1swXSksCisJCQkgICAgICBsZTMyX3RvX2NwdShwcml2LT5jb250cm9sX2Jsb2NrLT4KKwkJCQkJICBkcml2ZXJfY3Vycl9mcmFnWzFdKSwKKwkJCSAgICAgIGxlMzJfdG9fY3B1KHByaXYtPmNvbnRyb2xfYmxvY2stPgorCQkJCQkgIGRyaXZlcl9jdXJyX2ZyYWdbMl0pLAorCQkJICAgICAgbGUzMl90b19jcHUocHJpdi0+Y29udHJvbF9ibG9jay0+CisJCQkJCSAgZHJpdmVyX2N1cnJfZnJhZ1szXSksCisJCQkgICAgICBsZTMyX3RvX2NwdShwcml2LT5jb250cm9sX2Jsb2NrLT4KKwkJCQkJICBkcml2ZXJfY3Vycl9mcmFnWzRdKSwKKwkJCSAgICAgIGxlMzJfdG9fY3B1KHByaXYtPmNvbnRyb2xfYmxvY2stPgorCQkJCQkgIGRyaXZlcl9jdXJyX2ZyYWdbNV0pCisJCQkgICAgKTsKKworCQkJREVCVUcoU0hPV19RVUVVRV9JTkRFWEVTLAorCQkJICAgICAgIkNCIGRldiBRczogWyVpXVslaV1bJWldWyVpXVslaV1bJWldXG4iLAorCQkJICAgICAgbGUzMl90b19jcHUocHJpdi0+Y29udHJvbF9ibG9jay0+CisJCQkJCSAgZGV2aWNlX2N1cnJfZnJhZ1swXSksCisJCQkgICAgICBsZTMyX3RvX2NwdShwcml2LT5jb250cm9sX2Jsb2NrLT4KKwkJCQkJICBkZXZpY2VfY3Vycl9mcmFnWzFdKSwKKwkJCSAgICAgIGxlMzJfdG9fY3B1KHByaXYtPmNvbnRyb2xfYmxvY2stPgorCQkJCQkgIGRldmljZV9jdXJyX2ZyYWdbMl0pLAorCQkJICAgICAgbGUzMl90b19jcHUocHJpdi0+Y29udHJvbF9ibG9jay0+CisJCQkJCSAgZGV2aWNlX2N1cnJfZnJhZ1szXSksCisJCQkgICAgICBsZTMyX3RvX2NwdShwcml2LT5jb250cm9sX2Jsb2NrLT4KKwkJCQkJICBkZXZpY2VfY3Vycl9mcmFnWzRdKSwKKwkJCSAgICAgIGxlMzJfdG9fY3B1KHByaXYtPmNvbnRyb2xfYmxvY2stPgorCQkJCQkgIGRldmljZV9jdXJyX2ZyYWdbNV0pCisJCQkgICAgKTsKKyNlbmRpZgorCisJCQkvKiBjbGVhbnVwIHRoZSBkYXRhIGxvdyB0cmFuc21pdCBxdWV1ZSAqLworCQkJaXNscGNpX2V0aF9jbGVhbnVwX3RyYW5zbWl0KHByaXYsIHByaXYtPmNvbnRyb2xfYmxvY2spOworCisJCQkvKiBkZXZpY2UgaXMgaW4gYWN0aXZlIHN0YXRlLCB1cGRhdGUgdGhlCisJCQkgKiBwb3dlcnN0YXRlIGZsYWcgaWYgbmVjZXNzYXJ5ICovCisJCQlwb3dlcnN0YXRlID0gSVNMMzhYWF9QU01fQUNUSVZFX1NUQVRFOworCisJCQkvKiBjaGVjayBhbGwgdGhyZWUgcXVldWVzIGluIHByaW9yaXR5IG9yZGVyCisJCQkgKiBjYWxsIHRoZSBQSU1GT1IgcmVjZWl2ZSBmdW5jdGlvbiB1bnRpbCB0aGUKKwkJCSAqIHF1ZXVlIGlzIGVtcHR5ICovCisJCQlpZiAoaXNsMzh4eF9pbl9xdWV1ZShwcml2LT5jb250cm9sX2Jsb2NrLAorCQkJCQkJSVNMMzhYWF9DQl9SWF9NR01UUSkgIT0gMCkgeworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCQkJREVCVUcoU0hPV19UUkFDSU5HLAorCQkJCSAgICAgICJSZWNlaXZlZCBmcmFtZSBpbiBNYW5hZ2VtZW50IFF1ZXVlXG4iKTsKKyNlbmRpZgorCQkJCWlzbHBjaV9tZ3RfcmVjZWl2ZShuZGV2KTsKKworCQkJCWlzbHBjaV9tZ3RfY2xlYW51cF90cmFuc21pdChuZGV2KTsKKworCQkJCS8qIFJlZmlsbCBzbG90cyBpbiByZWNlaXZlIHF1ZXVlICovCisJCQkJaXNscGNpX21nbXRfcnhfZmlsbChuZGV2KTsKKworCQkJCS8qIG5vIG5lZWQgdG8gdHJpZ2dlciB0aGUgZGV2aWNlLCBuZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzbHBjaV9tZ3RfdHJhbnNhY3Rpb24gZG9lcyBpdCAqLworCQkJfQorCisJCQl3aGlsZSAoaXNsMzh4eF9pbl9xdWV1ZShwcml2LT5jb250cm9sX2Jsb2NrLAorCQkJCQkJSVNMMzhYWF9DQl9SWF9EQVRBX0xRKSAhPSAwKSB7CisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJCQlERUJVRyhTSE9XX1RSQUNJTkcsCisJCQkJICAgICAgIlJlY2VpdmVkIGZyYW1lIGluIERhdGEgTG93IFF1ZXVlIFxuIik7CisjZW5kaWYKKwkJCQlpc2xwY2lfZXRoX3JlY2VpdmUocHJpdik7CisJCQl9CisKKwkJCS8qIGNoZWNrIHdoZXRoZXIgdGhlIGRhdGEgdHJhbnNtaXQgcXVldWVzIHdlcmUgZnVsbCAqLworCQkJaWYgKHByaXYtPmRhdGFfbG93X3R4X2Z1bGwpIHsKKwkJCQkvKiBjaGVjayB3aGV0aGVyIHRoZSB0cmFuc21pdCBpcyBub3QgZnVsbCBhbnltb3JlICovCisJCQkJaWYgKElTTDM4WFhfQ0JfVFhfUVNJWkUgLQorCQkJCSAgICBpc2wzOHh4X2luX3F1ZXVlKHByaXYtPmNvbnRyb2xfYmxvY2ssCisJCQkJCQkgICAgIElTTDM4WFhfQ0JfVFhfREFUQV9MUSkgPj0KKwkJCQkgICAgSVNMMzhYWF9NSU5fUVRIUkVTSE9MRCkgeworCQkJCQkvKiBub3BlLCB0aGUgZHJpdmVyIGlzIHJlYWR5IGZvciBtb3JlIG5ldHdvcmsgZnJhbWVzICovCisJCQkJCW5ldGlmX3dha2VfcXVldWUocHJpdi0+bmRldik7CisKKwkJCQkJLyogcmVzZXQgdGhlIGZ1bGwgZmxhZyAqLworCQkJCQlwcml2LT5kYXRhX2xvd190eF9mdWxsID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAocmVnICYgSVNMMzhYWF9JTlRfSURFTlRfSU5JVCkgeworCQkJLyogRGV2aWNlIGhhcyBiZWVuIGluaXRpYWxpemVkICovCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJCURFQlVHKFNIT1dfVFJBQ0lORywKKwkJCSAgICAgICJJUlE6IEluaXQgZmxhZywgZGV2aWNlIGluaXRpYWxpemVkIFxuIik7CisjZW5kaWYKKwkJCXdha2VfdXAoJnByaXYtPnJlc2V0X2RvbmUpOworCQl9CisKKwkJaWYgKHJlZyAmIElTTDM4WFhfSU5UX0lERU5UX1NMRUVQKSB7CisJCQkvKiBEZXZpY2UgaW50ZW5kcyB0byBtb3ZlIHRvIHBvd2Vyc2F2ZSBzdGF0ZSAqLworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCQlERUJVRyhTSE9XX1RSQUNJTkcsICJJUlE6IFNsZWVwIGZsYWcgXG4iKTsKKyNlbmRpZgorCQkJaXNsMzh4eF9oYW5kbGVfc2xlZXBfcmVxdWVzdChwcml2LT5jb250cm9sX2Jsb2NrLAorCQkJCQkJICAgICAmcG93ZXJzdGF0ZSwKKwkJCQkJCSAgICAgcHJpdi0+ZGV2aWNlX2Jhc2UpOworCQl9CisKKwkJaWYgKHJlZyAmIElTTDM4WFhfSU5UX0lERU5UX1dBS0VVUCkgeworCQkJLyogRGV2aWNlIGhhcyBiZWVuIHdva2VuIHVwIHRvIGFjdGl2ZSBzdGF0ZSAqLworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCQlERUJVRyhTSE9XX1RSQUNJTkcsICJJUlE6IFdha2V1cCBmbGFnIFxuIik7CisjZW5kaWYKKworCQkJaXNsMzh4eF9oYW5kbGVfd2FrZXVwKHByaXYtPmNvbnRyb2xfYmxvY2ssCisJCQkJCSAgICAgICZwb3dlcnN0YXRlLCBwcml2LT5kZXZpY2VfYmFzZSk7CisJCX0KKwl9IGVsc2UgeworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCURFQlVHKFNIT1dfVFJBQ0lORywgIkFzc3VtaW5nIHNvbWVvbmUgZWxzZSBjYWxsZWQgdGhlIElSUVxuIik7CisjZW5kaWYKKwkJc3Bpbl91bmxvY2soJnByaXYtPnNsb2NrKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCS8qIHNsZWVwIC0+IHJlYWR5ICovCisJaWYgKGlzbHBjaV9nZXRfc3RhdGUocHJpdikgPT0gUFJWX1NUQVRFX1NMRUVQCisJICAgICYmIHBvd2Vyc3RhdGUgPT0gSVNMMzhYWF9QU01fQUNUSVZFX1NUQVRFKQorCQlpc2xwY2lfc2V0X3N0YXRlKHByaXYsIFBSVl9TVEFURV9SRUFEWSk7CisKKwkvKiAhc2xlZXAgLT4gc2xlZXAgKi8KKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSAhPSBQUlZfU1RBVEVfU0xFRVAKKwkgICAgJiYgcG93ZXJzdGF0ZSA9PSBJU0wzOFhYX1BTTV9QT1dFUlNBVkVfU1RBVEUpCisJCWlzbHBjaV9zZXRfc3RhdGUocHJpdiwgUFJWX1NUQVRFX1NMRUVQKTsKKworCS8qIHVubG9jayB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlzcGluX3VubG9jaygmcHJpdi0+c2xvY2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgTmV0d29yayBJbnRlcmZhY2UgQ29udHJvbCAmIFN0YXRpc3RpY2FsIGZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXNscGNpX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJdTMyIHJjOworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwkvKiByZXNldCBkYXRhIHN0cnVjdHVyZXMsIHVwbG9hZCBmaXJtd2FyZSBhbmQgcmVzZXQgZGV2aWNlICovCisJcmMgPSBpc2xwY2lfcmVzZXQocHJpdiwxKTsKKwlpZiAocmMpIHsKKwkJcHJpc201NF9icmluZ19kb3duKHByaXYpOworCQlyZXR1cm4gcmM7IC8qIFJldHVybnMgaW5mb3JtYXRpdmUgbWVzc2FnZSAqLworCX0KKworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5kZXYpOworLyogICAgICBuZXRpZl9tYXJrX3VwKCBuZGV2ICk7ICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXNscGNpX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlzbHBjaV9jbG9zZSAoKVxuIiwgbmRldi0+bmFtZSk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCisJcmV0dXJuIHByaXNtNTRfYnJpbmdfZG93bihwcml2KTsKK30KKworc3RhdGljIGludAorcHJpc201NF9icmluZ19kb3duKGlzbHBjaV9wcml2YXRlICpwcml2KQoreworCXZvaWQgX19pb21lbSAqZGV2aWNlX2Jhc2UgPSBwcml2LT5kZXZpY2VfYmFzZTsKKwl1MzIgcmVnOworCS8qIHdlIGFyZSBnb2luZyB0byBzaHV0ZG93biB0aGUgZGV2aWNlICovCisJaXNscGNpX3NldF9zdGF0ZShwcml2LCBQUlZfU1RBVEVfUFJFQk9PVCk7CisKKwkvKiBkaXNhYmxlIGFsbCBkZXZpY2UgaW50ZXJydXB0cyBpbiBjYXNlIHRoZXkgd2VyZW4ndCAqLworCWlzbDM4eHhfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYtPmRldmljZV9iYXNlKTsgIAorCisJLyogRm9yIHNhZmV0eSByZWFzb25zLCB3ZSBtYXkgd2FudCB0byBlbnN1cmUgdGhhdCBubyBETUEgdHJhbnNmZXIgaXMKKwkgKiBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MgYnkgZW1wdHlpbmcgdGhlIFRYIGFuZCBSWCBxdWV1ZXMuICovCisKKwkvKiB3YWl0IHVudGlsIGludGVycnVwdHMgaGF2ZSBmaW5pc2hlZCBleGVjdXRpbmcgb24gb3RoZXIgQ1BVcyAqLworCXN5bmNocm9uaXplX2lycShwcml2LT5wZGV2LT5pcnEpOworCisJcmVnID0gcmVhZGwoZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpOworCXJlZyAmPSB+KElTTDM4WFhfQ1RSTF9TVEFUX1JFU0VUIHwgSVNMMzhYWF9DVFJMX1NUQVRfUkFNQk9PVCk7CisJd3JpdGVsKHJlZywgZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpOworCXdtYigpOworCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOworCisJcmVnIHw9IElTTDM4WFhfQ1RSTF9TVEFUX1JFU0VUOworCXdyaXRlbChyZWcsIGRldmljZV9iYXNlICsgSVNMMzhYWF9DVFJMX1NUQVRfUkVHKTsKKwl3bWIoKTsKKwl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKKworCS8qIGNsZWFyIHRoZSBSZXNldCBiaXQgKi8KKwlyZWcgJj0gfklTTDM4WFhfQ1RSTF9TVEFUX1JFU0VUOworCXdyaXRlbChyZWcsIGRldmljZV9iYXNlICsgSVNMMzhYWF9DVFJMX1NUQVRfUkVHKTsKKwl3bWIoKTsKKworCS8qIHdhaXQgYSB3aGlsZSBmb3IgdGhlIGRldmljZSB0byByZXNldCAqLworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlzY2hlZHVsZV90aW1lb3V0KDUwKkhaLzEwMDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lzbHBjaV91cGxvYWRfZncoaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJaXNscGNpX3N0YXRlX3Qgb2xkX3N0YXRlOworCXUzMiByYzsKKworCW9sZF9zdGF0ZSA9IGlzbHBjaV9zZXRfc3RhdGUocHJpdiwgUFJWX1NUQVRFX0JPT1QpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB1cGxvYWRpbmcgZmlybXdhcmUuLi5cbiIsIHByaXYtPm5kZXYtPm5hbWUpOworCisJcmMgPSBpc2xfdXBsb2FkX2Zpcm13YXJlKHByaXYpOworCWlmIChyYykgeworCQkvKiBlcnJvciB1cGxvYWRpbmcgdGhlIGZpcm13YXJlICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCB1cGxvYWQgZmlybXdhcmUgKCclcycpXG4iLAorCQkgICAgICAgcHJpdi0+bmRldi0+bmFtZSwgcHJpdi0+ZmlybXdhcmUpOworCisJCWlzbHBjaV9zZXRfc3RhdGUocHJpdiwgb2xkX3N0YXRlKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICIlczogZmlybXdhcmUgdXBsb2FkIGNvbXBsZXRlXG4iLAorCSAgICAgICBwcml2LT5uZGV2LT5uYW1lKTsKKworCWlzbHBjaV9zZXRfc3RhdGUocHJpdiwgUFJWX1NUQVRFX1BPU1RCT09UKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citpc2xwY2lfcmVzZXRfaWYoaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJbG9uZyByZW1haW5pbmc7CisJaW50IHJlc3VsdCA9IC1FVElNRTsKKwlpbnQgY291bnQ7CisKKwlERUZJTkVfV0FJVCh3YWl0KTsKKwlwcmVwYXJlX3RvX3dhaXQoJnByaXYtPnJlc2V0X2RvbmUsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCisJLyogbm93IHRoZSBsYXN0IHN0ZXAgaXMgdG8gcmVzZXQgdGhlIGludGVyZmFjZSAqLworCWlzbDM4eHhfaW50ZXJmYWNlX3Jlc2V0KHByaXYtPmRldmljZV9iYXNlLCBwcml2LT5kZXZpY2VfaG9zdF9hZGRyZXNzKTsKKwlpc2xwY2lfc2V0X3N0YXRlKHByaXYsIFBSVl9TVEFURV9QUkVJTklUKTsKKworICAgICAgICBmb3IoY291bnQgPSAwOyBjb3VudCA8IDIgJiYgcmVzdWx0OyBjb3VudCsrKSB7CisJCS8qIFRoZSBzb2Z0d2FyZSByZXNldCBhY2tub3dsZWRnZSBuZWVkcyBhYm91dCAyMjAgbXNlYyBoZXJlLgorCQkgKiBCZSBjb25zZXJ2YXRpdmUgYW5kIHdhaXQgZm9yIHVwIHRvIG9uZSBzZWNvbmQuICovCisJCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJcmVtYWluaW5nID0gc2NoZWR1bGVfdGltZW91dChIWik7CisKKwkJaWYocmVtYWluaW5nID4gMCkgeworCQkJcmVzdWx0ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogSWYgd2UncmUgaGVyZSBpdCdzIGJlY2F1c2Ugb3VyIElSUSBoYXNuJ3QgeWV0IGdvbmUgdGhyb3VnaC4gCisJCSAqIFJldHJ5IGEgYml0IG1vcmUuLi4KKwkJICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vICdyZXNldCBjb21wbGV0ZScgSVJRIHNlZW4gLSByZXRyeWluZ1xuIiwKKwkJCXByaXYtPm5kZXYtPm5hbWUpOworCX0KKworCWZpbmlzaF93YWl0KCZwcml2LT5yZXNldF9kb25lLCAmd2FpdCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGludGVyZmFjZSByZXNldCBmYWlsdXJlXG4iLCBwcml2LT5uZGV2LT5uYW1lKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlpc2xwY2lfc2V0X3N0YXRlKHByaXYsIFBSVl9TVEFURV9JTklUKTsKKworCS8qIE5vdyB0aGF0IHRoZSBkZXZpY2UgaXMgMTAwJSB1cCwgbGV0J3MgYWxsb3cKKwkgKiBmb3IgdGhlIG90aGVyIGludGVycnVwdHMgLS0KKwkgKiBOT1RFOiB0aGlzIGlzIG5vdCAqeWV0KiB0cnVlIHNpbmNlIHdlJ3ZlIG9ubHkgYWxsb3dlZCB0aGUgCisJICogSU5JVCBpbnRlcnJ1cHQgb24gdGhlIElSUSBsaW5lLiBXZSBjYW4gcGVyaGFwcyBwb2xsCisJICogdGhlIElSUSBsaW5lIHVudGlsIHdlIGtub3cgZm9yIHN1cmUgdGhlIHJlc2V0IHdlbnQgdGhyb3VnaCAqLworCWlzbDM4eHhfZW5hYmxlX2NvbW1vbl9pbnRlcnJ1cHRzKHByaXYtPmRldmljZV9iYXNlKTsKKworCWRvd25fd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCXJlc3VsdCA9IG1ndF9jb21taXQocHJpdik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbnRlcmZhY2UgcmVzZXQgZmFpbHVyZVxuIiwgcHJpdi0+bmRldi0+bmFtZSk7CisJCXVwX3dyaXRlKCZwcml2LT5taWJfc2VtKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJdXBfd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCisJaXNscGNpX3NldF9zdGF0ZShwcml2LCBQUlZfU1RBVEVfUkVBRFkpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcmZhY2UgcmVzZXQgY29tcGxldGVcbiIsIHByaXYtPm5kZXYtPm5hbWUpOworCXJldHVybiAwOworfQorCitpbnQKK2lzbHBjaV9yZXNldChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgaW50IHJlbG9hZF9maXJtd2FyZSkKK3sKKwlpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKmNiID0gICAgLyogdm9sYXRpbGUgbm90IG5lZWRlZCAqLworCQkoaXNsMzh4eF9jb250cm9sX2Jsb2NrICopIHByaXYtPmNvbnRyb2xfYmxvY2s7CisJdW5zaWduZWQgY291bnRlcjsKKwlpbnQgcmM7CisKKwlpZiAocmVsb2FkX2Zpcm13YXJlKQorCQlpc2xwY2lfc2V0X3N0YXRlKHByaXYsIFBSVl9TVEFURV9QUkVCT09UKTsKKwllbHNlCisJCWlzbHBjaV9zZXRfc3RhdGUocHJpdiwgUFJWX1NUQVRFX1BPU1RCT09UKTsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVzZXR0aW5nIGRldmljZS4uLlxuIiwgcHJpdi0+bmRldi0+bmFtZSk7CisKKwkvKiBkaXNhYmxlIGFsbCBkZXZpY2UgaW50ZXJydXB0cyBpbiBjYXNlIHRoZXkgd2VyZW4ndCAqLworCWlzbDM4eHhfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYtPmRldmljZV9iYXNlKTsKKworCS8qIGZsdXNoIGFsbCBtYW5hZ2VtZW50IHF1ZXVlcyAqLworCXByaXYtPmluZGV4X21nbXRfdHggPSAwOworCXByaXYtPmluZGV4X21nbXRfcnggPSAwOworCisJLyogY2xlYXIgdGhlIGluZGV4ZXMgaW4gdGhlIGZyYW1lIHBvaW50ZXIgKi8KKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgSVNMMzhYWF9DQl9RQ09VTlQ7IGNvdW50ZXIrKykgeworCQljYi0+ZHJpdmVyX2N1cnJfZnJhZ1tjb3VudGVyXSA9IGNwdV90b19sZTMyKDApOworCQljYi0+ZGV2aWNlX2N1cnJfZnJhZ1tjb3VudGVyXSA9IGNwdV90b19sZTMyKDApOworCX0KKworCS8qIHJlc2V0IHRoZSBtZ210IHJlY2VpdmUgcXVldWUgKi8KKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgSVNMMzhYWF9DQl9NR01UX1FTSVpFOyBjb3VudGVyKyspIHsKKwkJaXNsMzh4eF9mcmFnbWVudCAqZnJhZyA9ICZjYi0+cnhfZGF0YV9tZ210W2NvdW50ZXJdOworCQlmcmFnLT5zaXplID0gY3B1X3RvX2xlMTYoTUdNVF9GUkFNRV9TSVpFKTsKKwkJZnJhZy0+ZmxhZ3MgPSAwOworCQlmcmFnLT5hZGRyZXNzID0gY3B1X3RvX2xlMzIocHJpdi0+bWdtdF9yeFtjb3VudGVyXS5wY2lfYWRkcik7CisJfQorCisJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IElTTDM4WFhfQ0JfUlhfUVNJWkU7IGNvdW50ZXIrKykgeworCQljYi0+cnhfZGF0YV9sb3dbY291bnRlcl0uYWRkcmVzcyA9CisJCSAgICBjcHVfdG9fbGUzMigodTMyKSBwcml2LT5wY2lfbWFwX3J4X2FkZHJlc3NbY291bnRlcl0pOworCX0KKworCS8qIHNpbmNlIHRoZSByZWNlaXZlIHF1ZXVlcyBhcmUgZmlsbGVkIHdpdGggZW1wdHkgZnJhZ21lbnRzLCBub3cgd2UgY2FuCisJICogc2V0IHRoZSBjb3JyZXNwb25kaW5nIGluZGV4ZXMgaW4gdGhlIENvbnRyb2wgQmxvY2sgKi8KKwlwcml2LT5jb250cm9sX2Jsb2NrLT5kcml2ZXJfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfUlhfREFUQV9MUV0gPQorCSAgICBjcHVfdG9fbGUzMihJU0wzOFhYX0NCX1JYX1FTSVpFKTsKKwlwcml2LT5jb250cm9sX2Jsb2NrLT5kcml2ZXJfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfUlhfTUdNVFFdID0KKwkgICAgY3B1X3RvX2xlMzIoSVNMMzhYWF9DQl9NR01UX1FTSVpFKTsKKworCS8qIHJlc2V0IHRoZSByZW1haW5pbmcgcmVhbCBpbmRleCByZWdpc3RlcnMgYW5kIGZ1bGwgZmxhZ3MgKi8KKwlwcml2LT5mcmVlX2RhdGFfcnggPSAwOworCXByaXYtPmZyZWVfZGF0YV90eCA9IDA7CisJcHJpdi0+ZGF0YV9sb3dfdHhfZnVsbCA9IDA7CisKKwlpZiAocmVsb2FkX2Zpcm13YXJlKSB7IC8qIFNob3VsZCB3ZSBsb2FkIHRoZSBmaXJtd2FyZSA/ICovCisJLyogbm93IHRoYXQgdGhlIGRhdGEgc3RydWN0dXJlcyBhcmUgY2xlYW5lZCB1cCwgdXBsb2FkCisJICogZmlybXdhcmUgYW5kIHJlc2V0IGludGVyZmFjZSAqLworCQlyYyA9IGlzbHBjaV91cGxvYWRfZncocHJpdik7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogaXNscGNpX3Jlc2V0OiBmYWlsdXJlXG4iLAorCQkJCXByaXYtPm5kZXYtPm5hbWUpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJLyogZmluYWxseSByZXNldCBpbnRlcmZhY2UgKi8KKwlyYyA9IGlzbHBjaV9yZXNldF9pZihwcml2KTsKKwlpZiAocmMpCisJCXByaW50ayhLRVJOX0VSUiAicHJpc201NDogWW91ciBjYXJkL3NvY2tldCBtYXkgYmUgZmF1bHR5LCBvciBJUlEgbGluZSB0b28gYnVzeSA6KFxuIik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgoraXNscGNpX3N0YXRpc3RpY3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJREVCVUcoU0hPV19GVU5DVElPTl9DQUxMUywgImlzbHBjaV9zdGF0aXN0aWNzXG4iKTsKKyNlbmRpZgorCisJcmV0dXJuICZwcml2LT5zdGF0aXN0aWNzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgTmV0d29yayBkZXZpY2UgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lzbHBjaV9hbGxvY19tZW1vcnkoaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJaW50IGNvdW50ZXI7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCXByaW50ayhLRVJOX0RFQlVHICJpc2xwY2lfYWxsb2NfbWVtb3J5XG4iKTsKKyNlbmRpZgorCisJLyogcmVtYXAgdGhlIFBDSSBkZXZpY2UgYmFzZSBhZGRyZXNzIHRvIGFjY2Vzc2FibGUgKi8KKwlpZiAoIShwcml2LT5kZXZpY2VfYmFzZSA9CisJICAgICAgaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocHJpdi0+cGRldiwgMCksCisJCSAgICAgIElTTDM4WFhfUENJX01FTV9TSVpFKSkpIHsKKwkJLyogZXJyb3IgaW4gcmVtYXBwaW5nIHRoZSBQQ0kgZGV2aWNlIG1lbW9yeSBhZGRyZXNzIHJhbmdlICovCisJCXByaW50ayhLRVJOX0VSUiAiUENJIG1lbW9yeSByZW1hcHBpbmcgZmFpbGVkIFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBtZW1vcnkgbGF5b3V0IGZvciBjb25zaXN0ZW50IERNQSByZWdpb246CisJICoKKwkgKiBBcmVhIDE6IENvbnRyb2wgQmxvY2sgZm9yIHRoZSBkZXZpY2UgaW50ZXJmYWNlCisJICogQXJlYSAyOiBQb3dlciBTYXZlIE1vZGUgQnVmZmVyIGZvciB0ZW1wb3JhcnkgZnJhbWUgc3RvcmFnZS4gQmUgYXdhcmUgdGhhdAorCSAqICAgICAgICAgdGhlIG51bWJlciBvZiBzdXBwb3J0ZWQgc3RhdGlvbnMgaW4gdGhlIEFQIGRldGVybWluZXMgdGhlIG1pbmltYWwKKwkgKiAgICAgICAgIHNpemUgb2YgdGhlIGJ1ZmZlciAhCisJICovCisKKwkvKiBwZXJmb3JtIHRoZSBhbGxvY2F0aW9uICovCisJcHJpdi0+ZHJpdmVyX21lbV9hZGRyZXNzID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocHJpdi0+cGRldiwKKwkJCQkJCQlIT1NUX01FTV9CTE9DSywKKwkJCQkJCQkmcHJpdi0+CisJCQkJCQkJZGV2aWNlX2hvc3RfYWRkcmVzcyk7CisKKwlpZiAoIXByaXYtPmRyaXZlcl9tZW1fYWRkcmVzcykgeworCQkvKiBlcnJvciBhbGxvY2F0aW5nIHRoZSBibG9jayBvZiBQQ0kgbWVtb3J5ICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBETUEgbWVtb3J5LCBhYm9ydGluZyEiLAorCQkgICAgICAgInByaXNtNTQiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGFzc2lnbiB0aGUgQ29udHJvbCBCbG9jayB0byB0aGUgZmlyc3QgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIGFyZWEgKi8KKwlwcml2LT5jb250cm9sX2Jsb2NrID0KKwkgICAgKGlzbDM4eHhfY29udHJvbF9ibG9jayAqKSBwcml2LT5kcml2ZXJfbWVtX2FkZHJlc3M7CisKKwkvKiBzZXQgdGhlIFBvd2VyIFNhdmUgQnVmZmVyIHBvaW50ZXIgZGlyZWN0bHkgYmVoaW5kIHRoZSBDQiAqLworCXByaXYtPmRldmljZV9wc21fYnVmZmVyID0KKwkJcHJpdi0+ZGV2aWNlX2hvc3RfYWRkcmVzcyArIENPTlRST0xfQkxPQ0tfU0laRTsKKworCS8qIG1ha2Ugc3VyZSBhbGwgYnVmZmVyIHBvaW50ZXJzIGFyZSBpbml0aWFsaXplZCAqLworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCBJU0wzOFhYX0NCX1FDT1VOVDsgY291bnRlcisrKSB7CisJCXByaXYtPmNvbnRyb2xfYmxvY2stPmRyaXZlcl9jdXJyX2ZyYWdbY291bnRlcl0gPSBjcHVfdG9fbGUzMigwKTsKKwkJcHJpdi0+Y29udHJvbF9ibG9jay0+ZGV2aWNlX2N1cnJfZnJhZ1tjb3VudGVyXSA9IGNwdV90b19sZTMyKDApOworCX0KKworCXByaXYtPmluZGV4X21nbXRfcnggPSAwOworCW1lbXNldChwcml2LT5tZ210X3J4LCAwLCBzaXplb2YocHJpdi0+bWdtdF9yeCkpOworCW1lbXNldChwcml2LT5tZ210X3R4LCAwLCBzaXplb2YocHJpdi0+bWdtdF90eCkpOworCisJLyogYWxsb2NhdGUgcnggcXVldWUgZm9yIG1hbmFnZW1lbnQgZnJhbWVzICovCisJaWYgKGlzbHBjaV9tZ210X3J4X2ZpbGwocHJpdi0+bmRldikgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCisJLyogbm93IGdldCB0aGUgZGF0YSByeCBza2IncyAqLworCW1lbXNldChwcml2LT5kYXRhX2xvd19yeCwgMCwgc2l6ZW9mIChwcml2LT5kYXRhX2xvd19yeCkpOworCW1lbXNldChwcml2LT5wY2lfbWFwX3J4X2FkZHJlc3MsIDAsIHNpemVvZiAocHJpdi0+cGNpX21hcF9yeF9hZGRyZXNzKSk7CisKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgSVNMMzhYWF9DQl9SWF9RU0laRTsgY291bnRlcisrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJLyogYWxsb2NhdGUgYW4gc2tfYnVmZiBmb3IgcmVjZWl2ZWQgZGF0YSBmcmFtZXMgc3RvcmFnZQorCQkgKiBlYWNoIGZyYW1lIG9uIHJlY2VpdmUgc2l6ZSBjb25zaXN0cyBvZiAxIGZyYWdtZW50CisJCSAqIGluY2x1ZGUgYW55IHJlcXVpcmVkIGFsbGlnbm1lbnQgb3BlcmF0aW9ucyAqLworCQlpZiAoIShza2IgPSBkZXZfYWxsb2Nfc2tiKE1BWF9GUkFHTUVOVF9TSVpFX1JYICsgMikpKSB7CisJCQkvKiBlcnJvciBhbGxvY2F0aW5nIGFuIHNrX2J1ZmYgc3RydWN0dXJlIGVsZW1lbnRzICovCisJCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGFsbG9jYXRpbmcgc2tiLlxuIik7CisJCQlza2IgPSBOVUxMOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQlza2JfcmVzZXJ2ZShza2IsICg0IC0gKGxvbmcpIHNrYi0+ZGF0YSkgJiAweDAzKTsKKwkJLyogYWRkIHRoZSBuZXcgYWxsb2NhdGVkIHNrX2J1ZmYgdG8gdGhlIGJ1ZmZlciBhcnJheSAqLworCQlwcml2LT5kYXRhX2xvd19yeFtjb3VudGVyXSA9IHNrYjsKKworCQkvKiBtYXAgdGhlIGFsbG9jYXRlZCBza2IgZGF0YSBhcmVhIHRvIHBjaSAqLworCQlwcml2LT5wY2lfbWFwX3J4X2FkZHJlc3NbY291bnRlcl0gPQorCQkgICAgcGNpX21hcF9zaW5nbGUocHJpdi0+cGRldiwgKHZvaWQgKikgc2tiLT5kYXRhLAorCQkJCSAgIE1BWF9GUkFHTUVOVF9TSVpFX1JYICsgMiwKKwkJCQkgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlpZiAoIXByaXYtPnBjaV9tYXBfcnhfYWRkcmVzc1tjb3VudGVyXSkgeworCQkJLyogZXJyb3IgbWFwcGluZyB0aGUgYnVmZmVyIHRvIGRldmljZQorCQkJICAgYWNjZXNzYWJsZSBtZW1vcnkgYWRkcmVzcyAqLworCQkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gbWFwIHNrYiBETUEnYWJsZVxuIik7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJfQorCisJcHJpc201NF9hY2xfaW5pdCgmcHJpdi0+YWNsKTsKKwlwcmlzbTU0X3dwYV9pZV9pbml0KHByaXYpOworCWlmIChtZ3RfaW5pdChwcml2KSkgCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlyZXR1cm4gMDsKKyBvdXRfZnJlZToKKwlpc2xwY2lfZnJlZV9tZW1vcnkocHJpdik7CisJcmV0dXJuIC0xOworfQorCitpbnQKK2lzbHBjaV9mcmVlX21lbW9yeShpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwlpbnQgY291bnRlcjsKKworCWlmIChwcml2LT5kZXZpY2VfYmFzZSkKKwkJaW91bm1hcChwcml2LT5kZXZpY2VfYmFzZSk7CisJcHJpdi0+ZGV2aWNlX2Jhc2UgPSBOVUxMOworCisJLyogZnJlZSBjb25zaXN0ZW50IERNQSBhcmVhLi4uICovCisJaWYgKHByaXYtPmRyaXZlcl9tZW1fYWRkcmVzcykKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwcml2LT5wZGV2LCBIT1NUX01FTV9CTE9DSywKKwkJCQkgICAgcHJpdi0+ZHJpdmVyX21lbV9hZGRyZXNzLAorCQkJCSAgICBwcml2LT5kZXZpY2VfaG9zdF9hZGRyZXNzKTsKKworCS8qIGNsZWFyIHNvbWUgZGFuZ2xpbmcgcG9pbnRlcnMgKi8KKwlwcml2LT5kcml2ZXJfbWVtX2FkZHJlc3MgPSBOVUxMOworCXByaXYtPmRldmljZV9ob3N0X2FkZHJlc3MgPSAwOworCXByaXYtPmRldmljZV9wc21fYnVmZmVyID0gMDsKKwlwcml2LT5jb250cm9sX2Jsb2NrID0gTlVMTDsKKworICAgICAgICAvKiBjbGVhbiB1cCBtZ210IHJ4IGJ1ZmZlcnMgKi8KKyAgICAgICAgZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IElTTDM4WFhfQ0JfTUdNVF9RU0laRTsgY291bnRlcisrKSB7CisJCXN0cnVjdCBpc2xwY2lfbWVtYnVmICpidWYgPSAmcHJpdi0+bWdtdF9yeFtjb3VudGVyXTsKKwkJaWYgKGJ1Zi0+cGNpX2FkZHIpCisJCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsIGJ1Zi0+cGNpX2FkZHIsCisJCQkJCSBidWYtPnNpemUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCWJ1Zi0+cGNpX2FkZHIgPSAwOworCQlpZiAoYnVmLT5tZW0pCisJCQlrZnJlZShidWYtPm1lbSk7CisJCWJ1Zi0+c2l6ZSA9IDA7CisJCWJ1Zi0+bWVtID0gTlVMTDsKKyAgICAgICAgfQorCisJLyogY2xlYW4gdXAgZGF0YSByeCBidWZmZXJzICovCisJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IElTTDM4WFhfQ0JfUlhfUVNJWkU7IGNvdW50ZXIrKykgeworCQlpZiAocHJpdi0+cGNpX21hcF9yeF9hZGRyZXNzW2NvdW50ZXJdKQorCQkJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wZGV2LAorCQkJCQkgcHJpdi0+cGNpX21hcF9yeF9hZGRyZXNzW2NvdW50ZXJdLAorCQkJCQkgTUFYX0ZSQUdNRU5UX1NJWkVfUlggKyAyLAorCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJcHJpdi0+cGNpX21hcF9yeF9hZGRyZXNzW2NvdW50ZXJdID0gMDsKKworCQlpZiAocHJpdi0+ZGF0YV9sb3dfcnhbY291bnRlcl0pCisJCQlkZXZfa2ZyZWVfc2tiKHByaXYtPmRhdGFfbG93X3J4W2NvdW50ZXJdKTsKKwkJcHJpdi0+ZGF0YV9sb3dfcnhbY291bnRlcl0gPSBOVUxMOworCX0KKworCS8qIEZyZWUgdGhlIGFjY2VzIGNvbnRyb2wgbGlzdCBhbmQgdGhlIFdQQSBsaXN0ICovCisJcHJpc201NF9hY2xfY2xlYW4oJnByaXYtPmFjbCk7CisJcHJpc201NF93cGFfaWVfY2xlYW4ocHJpdik7CisJbWd0X2NsZWFuKHByaXYpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAoraXNscGNpX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIHB1dCBkZXZpY2UgaW50byBwcm9taXNjIG1vZGUgYW5kIGxldCBuZXR3b3JrIGxheWVyIGhhbmRsZSBpdCAqLworfQorI2VuZGlmCisKK3N0cnVjdCBuZXRfZGV2aWNlICoKK2lzbHBjaV9zZXR1cChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZiAoaXNscGNpX3ByaXZhdGUpKTsKKworCWlmICghbmRldikKKwkJcmV0dXJuIG5kZXY7CisKKwlTRVRfTU9EVUxFX09XTkVSKG5kZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBuZGV2KTsKKyNpZiBkZWZpbmVkKFNFVF9ORVRERVZfREVWKQorCVNFVF9ORVRERVZfREVWKG5kZXYsICZwZGV2LT5kZXYpOworI2VuZGlmCisKKwkvKiBzZXR1cCB0aGUgc3RydWN0dXJlIG1lbWJlcnMgKi8KKwluZGV2LT5iYXNlX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJbmRldi0+aXJxID0gcGRldi0+aXJxOworCisJLyogaW5pdGlhbGl6ZSB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKwluZGV2LT5vcGVuID0gJmlzbHBjaV9vcGVuOworCW5kZXYtPnN0b3AgPSAmaXNscGNpX2Nsb3NlOworCW5kZXYtPmdldF9zdGF0cyA9ICZpc2xwY2lfc3RhdGlzdGljczsKKwluZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMgPSAmcHJpc201NF9nZXRfd2lyZWxlc3Nfc3RhdHM7CisJbmRldi0+ZG9faW9jdGwgPSAmcHJpc201NF9pb2N0bDsKKwluZGV2LT53aXJlbGVzc19oYW5kbGVycyA9CisJICAgIChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikgJnByaXNtNTRfaGFuZGxlcl9kZWY7CisKKwluZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmaXNscGNpX2V0aF90cmFuc21pdDsKKwkvKiBuZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmaXNscGNpX3NldF9tdWx0aWNhc3RfbGlzdDsgKi8KKwluZGV2LT5hZGRyX2xlbiA9IEVUSF9BTEVOOworCW5kZXYtPnNldF9tYWNfYWRkcmVzcyA9ICZwcmlzbTU0X3NldF9tYWNfYWRkcmVzczsKKwkvKiBHZXQgYSBub24temVybyBkdW1teSBNQUMgYWRkcmVzcyBmb3IgbmFtZWlmLiBKZWFuIElJICovCisJbWVtY3B5KG5kZXYtPmRldl9hZGRyLCBkdW1teV9tYWMsIDYpOworCisjaWZkZWYgSEFWRV9UWF9USU1FT1VUCisJbmRldi0+d2F0Y2hkb2dfdGltZW8gPSBJU0xQQ0lfVFhfVElNRU9VVDsKKwluZGV2LT50eF90aW1lb3V0ID0gJmlzbHBjaV9ldGhfdHhfdGltZW91dDsKKyNlbmRpZgorCisJLyogYWxsb2NhdGUgYSBwcml2YXRlIGRldmljZSBzdHJ1Y3R1cmUgdG8gdGhlIG5ldHdvcmsgZGV2aWNlICAqLworCXByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlwcml2LT5uZGV2ID0gbmRldjsKKwlwcml2LT5wZGV2ID0gcGRldjsKKwlwcml2LT5tb25pdG9yX3R5cGUgPSBBUlBIUkRfSUVFRTgwMjExOworCXByaXYtPm5kZXYtPnR5cGUgPSAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpID8KKwkJcHJpdi0+bW9uaXRvcl90eXBlIDogQVJQSFJEX0VUSEVSOworCisjaWYgV0lSRUxFU1NfRVhUID4gMTYKKwkvKiBBZGQgcG9pbnRlcnMgdG8gZW5hYmxlIGl3c3B5IHN1cHBvcnQuICovCisJcHJpdi0+d2lyZWxlc3NfZGF0YS5zcHlfZGF0YSA9ICZwcml2LT5zcHlfZGF0YTsKKwluZGV2LT53aXJlbGVzc19kYXRhID0gJnByaXYtPndpcmVsZXNzX2RhdGE7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTYgKi8KKworCS8qIHNhdmUgdGhlIHN0YXJ0IGFuZCBlbmQgYWRkcmVzcyBvZiB0aGUgUENJIG1lbW9yeSBhcmVhICovCisJbmRldi0+bWVtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIHByaXYtPmRldmljZV9iYXNlOworCW5kZXYtPm1lbV9lbmQgPSBuZGV2LT5tZW1fc3RhcnQgKyBJU0wzOFhYX1BDSV9NRU1fU0laRTsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJREVCVUcoU0hPV19UUkFDSU5HLCAiUENJIE1lbW9yeSByZW1hcHBlZCB0byAweCVwXG4iLCBwcml2LT5kZXZpY2VfYmFzZSk7CisjZW5kaWYKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPnJlc2V0X2RvbmUpOworCisJLyogaW5pdCB0aGUgcXVldWUgcmVhZCBsb2NrcywgcHJvY2VzcyB3YWl0IGNvdW50ZXIgKi8KKwlzZW1hX2luaXQoJnByaXYtPm1nbXRfc2VtLCAxKTsKKwlwcml2LT5tZ210X3JlY2VpdmVkID0gTlVMTDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT5tZ210X3dxdWV1ZSk7CisJc2VtYV9pbml0KCZwcml2LT5zdGF0c19zZW0sIDEpOworCXNwaW5fbG9ja19pbml0KCZwcml2LT5zbG9jayk7CisKKwkvKiBpbml0IHN0YXRlIG1hY2hpbmUgd2l0aCBvZmYjMSBzdGF0ZSAqLworCXByaXYtPnN0YXRlID0gUFJWX1NUQVRFX09GRjsKKwlwcml2LT5zdGF0ZV9vZmYgPSAxOworCisJLyogaW5pdGlhbGl6ZSB3b3JrcXVldWUncyAqLworCUlOSVRfV09SSygmcHJpdi0+c3RhdHNfd29yaywKKwkJICAodm9pZCAoKikodm9pZCAqKSkgcHJpc201NF91cGRhdGVfc3RhdHMsIHByaXYpOworCXByaXYtPnN0YXRzX3RpbWVzdGFtcCA9IDA7CisKKwlJTklUX1dPUksoJnByaXYtPnJlc2V0X3Rhc2ssIGlzbHBjaV9kb19yZXNldF9hbmRfd2FrZSwgcHJpdik7CisJcHJpdi0+cmVzZXRfdGFza19wZW5kaW5nID0gMDsKKworCS8qIGFsbG9jYXRlIHZhcmlvdXMgbWVtb3J5IGFyZWFzICovCisJaWYgKGlzbHBjaV9hbGxvY19tZW1vcnkocHJpdikpCisJCWdvdG8gZG9fZnJlZV9uZXRkZXY7CisKKwkvKiBzZWxlY3QgdGhlIGZpcm13YXJlIGZpbGUgZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UgaWQgKi8KKwlzd2l0Y2ggKHBkZXYtPmRldmljZSkgeworCWNhc2UgMHgzODc3OgorCQlzdHJjcHkocHJpdi0+ZmlybXdhcmUsIElTTDM4NzdfSU1BR0VfRklMRSk7CisJCWJyZWFrOworCisJY2FzZSAweDM4ODY6CisJCXN0cmNweShwcml2LT5maXJtd2FyZSwgSVNMMzg4Nl9JTUFHRV9GSUxFKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzdHJjcHkocHJpdi0+ZmlybXdhcmUsIElTTDM4OTBfSU1BR0VfRklMRSk7CisJCWJyZWFrOworCX0KKworCWlmIChyZWdpc3Rlcl9uZXRkZXYobmRldikpIHsKKwkJREVCVUcoU0hPV19FUlJPUl9NRVNTQUdFUywKKwkJICAgICAgIkVSUk9SOiByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWQgXG4iKTsKKwkJZ290byBkb19pc2xwY2lfZnJlZV9tZW1vcnk7CisJfQorCisJcmV0dXJuIG5kZXY7CisKKyAgICAgIGRvX2lzbHBjaV9mcmVlX21lbW9yeToKKwlpc2xwY2lfZnJlZV9tZW1vcnkocHJpdik7CisgICAgICBkb19mcmVlX25ldGRldjoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJZnJlZV9uZXRkZXYobmRldik7CisJcHJpdiA9IE5VTEw7CisJcmV0dXJuIE5VTEw7Cit9CisKK2lzbHBjaV9zdGF0ZV90Citpc2xwY2lfc2V0X3N0YXRlKGlzbHBjaV9wcml2YXRlICpwcml2LCBpc2xwY2lfc3RhdGVfdCBuZXdfc3RhdGUpCit7CisJaXNscGNpX3N0YXRlX3Qgb2xkX3N0YXRlOworCisJLyogbG9jayAqLworCW9sZF9zdGF0ZSA9IHByaXYtPnN0YXRlOworCisJLyogdGhpcyBtZWFucyBlaXRoZXIgYSByYWNlIGNvbmRpdGlvbiBvciBzb21lIHNlcmlvdXMgZXJyb3IgaW4KKwkgKiB0aGUgZHJpdmVyIGNvZGUgKi8KKwlzd2l0Y2ggKG5ld19zdGF0ZSkgeworCWNhc2UgUFJWX1NUQVRFX09GRjoKKwkJcHJpdi0+c3RhdGVfb2ZmKys7CisJZGVmYXVsdDoKKwkJcHJpdi0+c3RhdGUgPSBuZXdfc3RhdGU7CisJCWJyZWFrOworCisJY2FzZSBQUlZfU1RBVEVfUFJFQk9PVDoKKwkJLyogdGhlcmUgYXJlIGFjdHVhbGx5IG1hbnkgb2ZmLXN0YXRlcywgZW51bWVyYXRlZCBieQorCQkgKiBzdGF0ZV9vZmYgKi8KKwkJaWYgKG9sZF9zdGF0ZSA9PSBQUlZfU1RBVEVfT0ZGKQorCQkJcHJpdi0+c3RhdGVfb2ZmLS07CisKKwkJLyogb25seSBpZiBod191bmF2YWlsYWJsZSBpcyB6ZXJvIG5vdyBpdCBtZWFucyB3ZSBlaXRoZXIKKwkJICogd2VyZSBpbiBvZmYjMSBzdGF0ZSwgb3IgY2FtZSBoZXJlIGZyb20KKwkJICogc29tZXdoZXJlIGVsc2UgKi8KKwkJaWYgKCFwcml2LT5zdGF0ZV9vZmYpCisJCQlwcml2LT5zdGF0ZSA9IG5ld19zdGF0ZTsKKwkJYnJlYWs7CisJfTsKKyNpZiAwCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzdGF0ZSB0cmFuc2l0aW9uICVkIC0+ICVkIChvZmYjJWQpXG4iLAorCSAgICAgICBwcml2LT5uZGV2LT5uYW1lLCBvbGRfc3RhdGUsIG5ld19zdGF0ZSwgcHJpdi0+c3RhdGVfb2ZmKTsKKyNlbmRpZgorCisJLyogaW52YXJpYW50cyAqLworCUJVR19PTihwcml2LT5zdGF0ZV9vZmYgPCAwKTsKKwlCVUdfT04ocHJpdi0+c3RhdGVfb2ZmICYmIChwcml2LT5zdGF0ZSAhPSBQUlZfU1RBVEVfT0ZGKSk7CisJQlVHX09OKCFwcml2LT5zdGF0ZV9vZmYgJiYgKHByaXYtPnN0YXRlID09IFBSVl9TVEFURV9PRkYpKTsKKworCS8qIHVubG9jayAqLworCXJldHVybiBvbGRfc3RhdGU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYTEwMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuaApAQCAtMCwwICsxLDIxNiBAQAorLyoKKyAqICAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLiAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgSGVyYmVydCBWYWxlcmlvIFJpZWRlbCA8aHZyQGdudS5vcmc+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEx1aXMgUi4gUm9kcmlndWV6IDxtY2dyb2ZAcnVzbHVnLnJ1dGdlcnMuZWR1PgorICogIENvcHlyaWdodCAoQykgMjAwMyBBdXJlbGllbiBBbGxlYXVtZSA8c2x0c0BmcmVlLmZyPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaWZuZGVmIF9JU0xQQ0lfREVWX0gKKyNkZWZpbmUgX0lTTFBDSV9ERVZfSAorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlICJpc2xfMzh4eC5oIgorI2luY2x1ZGUgImlzbF9vaWQuaCIKKyNpbmNsdWRlICJpc2xwY2lfbWd0LmgiCisKKy8qIHNvbWUgc3RhdGVzIG1pZ2h0IG5vdCBiZSBzdXBlcmZsb3VzIGFuZCBtYXkgYmUgcmVtb3ZlZCB3aGVuCisgICBkZXNpZ24gaXMgZmluYWxpemVkIChodnIpICovCit0eXBlZGVmIGVudW0geworCVBSVl9TVEFURV9PRkYgPSAwLAkvKiB0aGlzIG1lYW5zIGh3X3VuYXZhaWxhYmxlIGlzICE9IDAgKi8KKwlQUlZfU1RBVEVfUFJFQk9PVCwJLyogd2UgYXJlIGluIGEgcHJlLWJvb3Qgc3RhdGUgKGVtcHR5IFJBTSkgKi8KKwlQUlZfU1RBVEVfQk9PVCwJCS8qIGJvb3Qgc3RhdGUgKGZ3IHVwbG9hZCwgcnVuIGZ3KSAqLworCVBSVl9TVEFURV9QT1NUQk9PVCwJLyogYWZ0ZXIgYm9vdCBzdGF0ZSwgbmVlZCByZXNldCBub3cgKi8KKwlQUlZfU1RBVEVfUFJFSU5JVCwJLyogcHJlLWluaXQgc3RhdGUgKi8KKwlQUlZfU1RBVEVfSU5JVCwJCS8qIGluaXQgc3RhdGUgKHJlc3RvcmUgTUlCIGJhY2t1cCB0byBkZXZpY2UpICovCisJUFJWX1NUQVRFX1JFQURZLAkvKiBkcml2ZXImZGV2aWNlIGFyZSBpbiBvcGVyYXRpb25hbCBzdGF0ZSAqLworCVBSVl9TVEFURV9TTEVFUAkJLyogZGV2aWNlIGluIHNsZWVwIG1vZGUgKi8KK30gaXNscGNpX3N0YXRlX3Q7CisKKy8qIEFDTCB1c2luZyBNQUMgYWRkcmVzcyAqLworc3RydWN0IG1hY19lbnRyeSB7CisgICBzdHJ1Y3QgbGlzdF9oZWFkIF9saXN0OworICAgY2hhciBhZGRyW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCBpc2xwY2lfYWNsIHsKKyAgIGVudW0geyBNQUNfUE9MSUNZX09QRU49MCwgTUFDX1BPTElDWV9BQ0NFUFQ9MSwgTUFDX1BPTElDWV9SRUpFQ1Q9MiB9IHBvbGljeTsKKyAgIHN0cnVjdCBsaXN0X2hlYWQgbWFjX2xpc3Q7ICAvKiBhIGxpc3Qgb2YgbWFjX2VudHJ5ICovCisgICBpbnQgc2l6ZTsgICAvKiBzaXplIG9mIHF1ZXVlICovCisgICBzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsgICAvKiBhY2Nlc3NlZCBpbiBpb2N0bHMgYW5kIHRyYXBfd29yayAqLworfTsKKworc3RydWN0IGlzbHBjaV9tZW1idWYgeworCWludCBzaXplOyAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIG1lbW9yeSAqLworCXZvaWQgKm1lbTsgICAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIG9mIG1lbW9yeSBhcyBzZWVuIGJ5IENQVSAqLworCWRtYV9hZGRyX3QgcGNpX2FkZHI7ICAgICAgICAvKiBhZGRyZXNzIG9mIG1lbW9yeSBhcyBzZWVuIGJ5IGRldmljZSAqLworfTsKKworI2RlZmluZSBNQVhfQlNTX1dQQV9JRV9DT1VOVCA2NAorI2RlZmluZSBNQVhfV1BBX0lFX0xFTiA2NAorc3RydWN0IGlzbHBjaV9ic3Nfd3BhX2llIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZTsKKwl1OCBic3NpZFtFVEhfQUxFTl07CisJdTggd3BhX2llW01BWF9XUEFfSUVfTEVOXTsKKwlzaXplX3Qgd3BhX2llX2xlbjsKKwkKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwlzcGlubG9ja190IHNsb2NrOwkvKiBnZW5lcmljIHNwaW5sb2NrOyAqLworCQorCXUzMiBwcml2X29pZDsKKworCS8qIG91ciBtaWIgY2FjaGUgKi8KKwl1MzIgaXdfbW9kZTsKKyAgICAgICAgc3RydWN0IHJ3X3NlbWFwaG9yZSBtaWJfc2VtOworCXZvaWQgKiptaWI7CisJY2hhciBuaWNrbmFtZVtJV19FU1NJRF9NQVhfU0laRSsxXTsKKwkKKwkvKiBUYWtlIGNhcmUgb2YgdGhlIHdpcmVsZXNzIHN0YXRzICovCisJc3RydWN0IHdvcmtfc3RydWN0IHN0YXRzX3dvcms7CisJc3RydWN0IHNlbWFwaG9yZSBzdGF0c19zZW07CisJLyogcmVtZW1iZXIgd2hlbiB3ZSBsYXN0IHVwZGF0ZWQgdGhlIHN0YXRzICovCisJdW5zaWduZWQgbG9uZyBzdGF0c190aW1lc3RhbXA7CisJLyogVGhlIGZpcnN0IGlzIGFjY2Vzc2VkIHVuZGVyIHNlbWFwaG9yZSBsb2NraW5nLgorCSAqIFRoZSBzZWNvbmQgaXMgdGhlIGNsZWFuIG9uZSB3ZSByZXR1cm4gdG8gaXdjb25maWcuCisJICovCisJc3RydWN0IGl3X3N0YXRpc3RpY3MgbG9jYWxfaXdzdGF0aXN0aWNzOworCXN0cnVjdCBpd19zdGF0aXN0aWNzIGl3c3RhdGlzdGljczsKKworCXN0cnVjdCBpd19zcHlfZGF0YSBzcHlfZGF0YTsgLyogaXdzcHkgc3VwcG9ydCAqLworCisjaWYgV0lSRUxFU1NfRVhUID4gMTYKKwlzdHJ1Y3QgaXdfcHVibGljX2RhdGEgd2lyZWxlc3NfZGF0YTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxNiAqLworCisJaW50IG1vbml0b3JfdHlwZTsgLyogQVJQSFJEX0lFRUU4MDIxMSBvciBBUlBIUkRfSUVFRTgwMjExX1BSSVNNICovCisKKwlzdHJ1Y3QgaXNscGNpX2FjbCBhY2w7CisKKwkvKiBQQ0kgYnVzIGFsbG9jYXRpb24gJiBjb25maWd1cmF0aW9uIG1lbWJlcnMgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsJLyogUENJIHN0cnVjdHVyZSBpbmZvcm1hdGlvbiAqLworCWNoYXIgZmlybXdhcmVbMzNdOworCisJdm9pZCBfX2lvbWVtICpkZXZpY2VfYmFzZTsJLyogaW9yZW1hcHBlZCBkZXZpY2UgYmFzZSBhZGRyZXNzICovCisKKwkvKiBjb25zaXN0ZW50IERNQSByZWdpb24gKi8KKwl2b2lkICpkcml2ZXJfbWVtX2FkZHJlc3M7CS8qIGJhc2UgRE1BIGFkZHJlc3MgKi8KKwlkbWFfYWRkcl90IGRldmljZV9ob3N0X2FkZHJlc3M7CS8qIGJhc2UgRE1BIGFkZHJlc3MgKGJ1cyBhZGRyZXNzKSAqLworCWRtYV9hZGRyX3QgZGV2aWNlX3BzbV9idWZmZXI7CS8qIGhvc3QgbWVtb3J5IGZvciBQU00gYnVmZmVyaW5nIChidXMgYWRkcmVzcykgKi8KKworCS8qIG91ciBuZXR3b3JrX2RldmljZSBzdHJ1Y3R1cmUgICovCisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisKKwkvKiBkZXZpY2UgcXVldWUgaW50ZXJmYWNlIG1lbWJlcnMgKi8KKwlzdHJ1Y3QgaXNsMzh4eF9jYiAqY29udHJvbF9ibG9jazsJLyogZGV2aWNlIGNvbnRyb2wgYmxvY2sgCisJCQkJCQkJICAgKD09IGRyaXZlcl9tZW1fYWRkcmVzcyEpICovCisKKwkvKiBFYWNoIHF1ZXVlIGhhcyB0aHJlZSBpbmRleGVzOgorCSAqICAgZnJlZS9pbmRleF9tZ210L2RhdGFfcngvdHggKGNhbGxlZCBpbmRleCwgc2VlIGJlbG93KSwKKwkgKiAgIGRyaXZlcl9jdXJyX2ZyYWcsIGFuZCBkZXZpY2VfY3Vycl9mcmFnIChpbiB0aGUgY29udHJvbCBibG9jaykKKwkgKiBBbGwgaW5kZXhlcyBhcmUgZXZlci1pbmNyZWFzaW5nLCBidXQgaW50ZXJwcmV0ZWQgbW9kdWxvIHRoZQorCSAqIGRldmljZSBxdWV1ZSBzaXplIHdoZW4gdXNlZC4KKwkgKiAgIGluZGV4IDw9IGRldmljZV9jdXJyX2ZyYWcgPD0gZHJpdmVyX2N1cnJfZnJhZyAgYXQgYWxsIHRpbWVzCisJICogRm9yIHJ4IHF1ZXVlcywgW2luZGV4LCBkZXZpY2VfY3Vycl9mcmFnKSBjb250YWlucyBmcmFnbWVudHMKKwkgKiB0aGF0IHRoZSBpbnRlcnJ1cHQgcHJvY2Vzc2luZyBuZWVkcyB0byBoYW5kbGUgKG93bmVkIGJ5IGRyaXZlcikuCisJICogW2RldmljZV9jdXJyX2ZyYWcsIGRyaXZlcl9jdXJyX2ZyYWcpIGlzIHRoZSBmcmVlIHNwYWNlIGluIHRoZQorCSAqIHJ4IHF1ZXVlLCB3YWl0aW5nIGZvciBkYXRhIChvd25lZCBieSBkZXZpY2UpLiAgVGhlIGRyaXZlcgorCSAqIGluY3JlbWVudHMgZHJpdmVyX2N1cnJfZnJhZyB0byBpbmRpY2F0ZSB0byB0aGUgZGV2aWNlIHRoYXQgbW9yZQorCSAqIGJ1ZmZlcnMgYXJlIGF2YWlsYWJsZS4KKwkgKiBJZiBkZXZpY2VfY3Vycl9mcmFnID09IGRyaXZlcl9jdXJyX2ZyYWcsIG5vIG1vcmUgcnggYnVmZmVycyBhcmUKKwkgKiBhdmFpbGFibGUsIGFuZCB0aGUgcnggRE1BIGVuZ2luZSBvZiB0aGUgZGV2aWNlIGlzIGhhbHRlZC4KKwkgKiBGb3IgdHggcXVldWVzLCBbaW5kZXgsIGRldmljZV9jdXJyX2ZyYWcpIGNvbnRhaW5zIGZyYWdtZW50cworCSAqIHdoZXJlIHR4IGlzIGRvbmU7IHRoZXkgbmVlZCB0byBiZSBmcmVlZCAob3duZWQgYnkgZHJpdmVyKS4KKwkgKiBbZGV2aWNlX2N1cnJfZnJhZywgZHJpdmVyX2N1cnJfZnJhZykgY29udGFpbnMgdGhlIGZyYW1lcworCSAqIHRoYXQgYXJlIGJlaW5nIHRyYW5zZmVycmVkIChvd25lZCBieSBkZXZpY2UpLiAgVGhlIGRyaXZlcgorCSAqIGluY3JlbWVudHMgZHJpdmVyX2N1cnJfZnJhZyB0byBpbmRpY2F0ZSB0aGF0IG1vcmUgdHggd29yaworCSAqIG5lZWRzIHRvIGJlIGRvbmUuCisJICovCisJdTMyIGluZGV4X21nbXRfcng7ICAgICAgICAgICAgICAvKiByZWFsIGluZGV4IG1nbXQgcnggcXVldWUgKi8KKwl1MzIgaW5kZXhfbWdtdF90eDsgICAgICAgICAgICAgIC8qIHJlYWQgaW5kZXggbWdtdCB0eCBxdWV1ZSAqLworCXUzMiBmcmVlX2RhdGFfcng7CS8qIGZyZWUgcG9pbnRlciBkYXRhIHJ4IHF1ZXVlICovCisJdTMyIGZyZWVfZGF0YV90eDsJLyogZnJlZSBwb2ludGVyIGRhdGEgdHggcXVldWUgKi8KKwl1MzIgZGF0YV9sb3dfdHhfZnVsbDsJLyogZnVsbCBkZXRlY3RlZCBmbGFnICovCisKKwkvKiBmcmFtZSBtZW1vcnkgYnVmZmVycyBmb3IgdGhlIGRldmljZSBxdWV1ZXMgKi8KKwlzdHJ1Y3QgaXNscGNpX21lbWJ1ZiBtZ210X3R4W0lTTDM4WFhfQ0JfTUdNVF9RU0laRV07CisJc3RydWN0IGlzbHBjaV9tZW1idWYgbWdtdF9yeFtJU0wzOFhYX0NCX01HTVRfUVNJWkVdOworCXN0cnVjdCBza19idWZmICpkYXRhX2xvd190eFtJU0wzOFhYX0NCX1RYX1FTSVpFXTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqZGF0YV9sb3dfcnhbSVNMMzhYWF9DQl9SWF9RU0laRV07CisJZG1hX2FkZHJfdCBwY2lfbWFwX3R4X2FkZHJlc3NbSVNMMzhYWF9DQl9UWF9RU0laRV07CisJZG1hX2FkZHJfdCBwY2lfbWFwX3J4X2FkZHJlc3NbSVNMMzhYWF9DQl9SWF9RU0laRV07CisKKwkvKiBkcml2ZXIgbmV0d29yayBpbnRlcmZhY2UgbWVtYmVycyAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRpc3RpY3M7CisKKwkvKiB3YWl0IGZvciBhIHJlc2V0IGludGVycnVwdCAqLworCXdhaXRfcXVldWVfaGVhZF90IHJlc2V0X2RvbmU7CisKKwkvKiB1c2VkIGJ5IGlzbHBjaV9tZ3RfdHJhbnNhY3Rpb24gKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIG1nbXRfc2VtOyAvKiBzZXJpYWxpemUgYWNjZXNzIHRvIG1haWxib3ggYW5kIHdxdWV1ZSAqLworCXN0cnVjdCBpc2xwY2lfbWdtdGZyYW1lICptZ210X3JlY2VpdmVkOwkgIC8qIG1ib3ggZm9yIGluY29taW5nIGZyYW1lICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgbWdtdF93cXVldWU7ICAgICAgICAgICAgLyogd2FpdHF1ZXVlIGZvciBtYm94ICovCisKKwkvKiBzdGF0ZSBtYWNoaW5lICovCisJaXNscGNpX3N0YXRlX3Qgc3RhdGU7CisJaW50IHN0YXRlX29mZjsJCS8qIGVudW1lcmF0aW9uIG9mIG9mZi1zdGF0ZSwgaWYgMCB0aGVuCisJCQkJICogd2UncmUgbm90IGluIGFueSBvZmYtc3RhdGUgKi8KKworCS8qIFdQQSBzdHVmZiAqLworCWludCB3cGE7IC8qIFdQQSBtb2RlIGVuYWJsZWQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGJzc193cGFfbGlzdDsKKwlpbnQgbnVtX2Jzc193cGE7CisJc3RydWN0IHNlbWFwaG9yZSB3cGFfc2VtOworCisJc3RydWN0IHdvcmtfc3RydWN0IHJlc2V0X3Rhc2s7CisJaW50IHJlc2V0X3Rhc2tfcGVuZGluZzsKK30gaXNscGNpX3ByaXZhdGU7CisKK3N0YXRpYyBpbmxpbmUgaXNscGNpX3N0YXRlX3QKK2lzbHBjaV9nZXRfc3RhdGUoaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJLyogbG9jayAqLworCXJldHVybiBwcml2LT5zdGF0ZTsKKwkvKiB1bmxvY2sgKi8KK30KKworaXNscGNpX3N0YXRlX3QgaXNscGNpX3NldF9zdGF0ZShpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgaXNscGNpX3N0YXRlX3QgbmV3X3N0YXRlKTsKKworI2RlZmluZSBJU0xQQ0lfVFhfVElNRU9VVCAgICAgICAgICAgICAgICgyKkhaKQorCitpcnFyZXR1cm5fdCBpc2xwY2lfaW50ZXJydXB0KGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKKworaW50IHByaXNtNTRfcG9zdF9zZXR1cChpc2xwY2lfcHJpdmF0ZSAqLCBpbnQpOworaW50IGlzbHBjaV9yZXNldChpc2xwY2lfcHJpdmF0ZSAqLCBpbnQpOworCitzdGF0aWMgaW5saW5lIHZvaWQKK2lzbHBjaV90cmlnZ2VyKGlzbHBjaV9wcml2YXRlICpwcml2KQoreworCWlzbDM4eHhfdHJpZ2dlcl9kZXZpY2UoaXNscGNpX2dldF9zdGF0ZShwcml2KSA9PSBQUlZfU1RBVEVfU0xFRVAsCisJCQkgICAgICAgcHJpdi0+ZGV2aWNlX2Jhc2UpOworfQorCitpbnQgaXNscGNpX2ZyZWVfbWVtb3J5KGlzbHBjaV9wcml2YXRlICopOworc3RydWN0IG5ldF9kZXZpY2UgKmlzbHBjaV9zZXR1cChzdHJ1Y3QgcGNpX2RldiAqKTsKKyNlbmRpZgkJCQkvKiBfSVNMUENJX0RFVl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ldGguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NTJlOTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ldGguYwpAQCAtMCwwICsxLDUxOSBAQAorLyoKKyAqICAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLgorICogIENvcHlyaWdodCAoQykgMjAwNCBBdXJlbGllbiBBbGxlYXVtZSA8c2x0c0BmcmVlLmZyPgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisKKyNpbmNsdWRlICJwcmlzbWNvbXBhdC5oIgorI2luY2x1ZGUgImlzbF8zOHh4LmgiCisjaW5jbHVkZSAiaXNscGNpX2V0aC5oIgorI2luY2x1ZGUgImlzbHBjaV9tZ3QuaCIKKyNpbmNsdWRlICJvaWRfbWd0LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBOZXR3b3JrIEludGVyZmFjZSBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2lzbHBjaV9ldGhfY2xlYW51cF90cmFuc21pdChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwKKwkJCSAgICBpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKmNvbnRyb2xfYmxvY2spCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1MzIgaW5kZXg7CisKKwkvKiBjb21wYXJlIHRoZSBjb250cm9sIGJsb2NrIHJlYWQgcG9pbnRlciB3aXRoIHRoZSBmcmVlIHBvaW50ZXIgKi8KKwl3aGlsZSAocHJpdi0+ZnJlZV9kYXRhX3R4ICE9CisJICAgICAgIGxlMzJfdG9fY3B1KGNvbnRyb2xfYmxvY2stPgorCQkJICAgZGV2aWNlX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1RYX0RBVEFfTFFdKSkgeworCQkvKiByZWFkIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZnJhZ21lbnQgdG8gYmUgZnJlZWQgKi8KKwkJaW5kZXggPSBwcml2LT5mcmVlX2RhdGFfdHggJSBJU0wzOFhYX0NCX1RYX1FTSVpFOworCisJCS8qIGNoZWNrIGZvciBob2xlcyBpbiB0aGUgYXJyYXlzIGNhdXNlZCBieSBtdWx0aSBmcmFnbWVudCBmcmFtZXMgCisJCSAqIHNlYXJjaGluZyBmb3IgdGhlIGxhc3QgZnJhZ21lbnQgb2YgYSBmcmFtZSAqLworCQlpZiAocHJpdi0+cGNpX21hcF90eF9hZGRyZXNzW2luZGV4XSAhPSAoZG1hX2FkZHJfdCkgTlVMTCkgeworCQkJLyogZW50cnkgaXMgdGhlIGxhc3QgZnJhZ21lbnQgb2YgYSBmcmFtZQorCQkJICogZnJlZSB0aGUgc2tiIHN0cnVjdHVyZSBhbmQgdW5tYXAgcGNpIG1lbW9yeSAqLworCQkJc2tiID0gcHJpdi0+ZGF0YV9sb3dfdHhbaW5kZXhdOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJCURFQlVHKFNIT1dfVFJBQ0lORywKKwkJCSAgICAgICJjbGVhbnVwIHNrYiAlcCBza2ItPmRhdGEgJXAgc2tiLT5sZW4gJXUgdHJ1ZXNpemUgJXVcbiAiLAorCQkJICAgICAgc2tiLCBza2ItPmRhdGEsIHNrYi0+bGVuLCBza2ItPnRydWVzaXplKTsKKyNlbmRpZgorCisJCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsCisJCQkJCSBwcml2LT5wY2lfbWFwX3R4X2FkZHJlc3NbaW5kZXhdLAorCQkJCQkgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCXNrYiA9IE5VTEw7CisJCX0KKwkJLyogaW5jcmVtZW50IHRoZSBmcmVlIGRhdGEgbG93IHF1ZXVlIHBvaW50ZXIgKi8KKwkJcHJpdi0+ZnJlZV9kYXRhX3R4Kys7CisJfQorfQorCitpbnQKK2lzbHBjaV9ldGhfdHJhbnNtaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKmNiID0gcHJpdi0+Y29udHJvbF9ibG9jazsKKwl1MzIgaW5kZXg7CisJZG1hX2FkZHJfdCBwY2lfbWFwX2FkZHJlc3M7CisJaW50IGZyYW1lX3NpemU7CisJaXNsMzh4eF9mcmFnbWVudCAqZnJhZ21lbnQ7CisJaW50IG9mZnNldDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiOworCWludCBuZXdza2Jfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciB3ZHNfbWFjWzZdOworCXUzMiBjdXJyX2ZyYWc7CisJaW50IGVyciA9IDA7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCURFQlVHKFNIT1dfRlVOQ1RJT05fQ0FMTFMsICJpc2xwY2lfZXRoX3RyYW5zbWl0IFxuIik7CisjZW5kaWYKKworCS8qIGxvY2sgdGhlIGRyaXZlciBjb2RlICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNsb2NrLCBmbGFncyk7CisKKwkvKiBkZXRlcm1pbmUgdGhlIGFtb3VudCBvZiBmcmFnbWVudHMgbmVlZGVkIHRvIHN0b3JlIHRoZSBmcmFtZSAqLworCisJZnJhbWVfc2l6ZSA9IHNrYi0+bGVuIDwgRVRIX1pMRU4gPyBFVEhfWkxFTiA6IHNrYi0+bGVuOworCWlmIChpbml0X3dkcykKKwkJZnJhbWVfc2l6ZSArPSA2OworCisJLyogY2hlY2sgd2hldGhlciB0aGUgZGVzdGluYXRpb24gcXVldWUgaGFzIGVub3VnaCBmcmFnbWVudHMgZm9yIHRoZSBmcmFtZSAqLworCWN1cnJfZnJhZyA9IGxlMzJfdG9fY3B1KGNiLT5kcml2ZXJfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfVFhfREFUQV9MUV0pOworCWlmICh1bmxpa2VseShjdXJyX2ZyYWcgLSBwcml2LT5mcmVlX2RhdGFfdHggPj0gSVNMMzhYWF9DQl9UWF9RU0laRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdHJhbnNtaXQgZGV2aWNlIHF1ZXVlIGZ1bGwgd2hlbiBhd2FrZVxuIiwKKwkJICAgICAgIG5kZXYtPm5hbWUpOworCQluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCisJCS8qIHRyaWdnZXIgdGhlIGRldmljZSAqLworCQlpc2wzOHh4X3czMl9mbHVzaChwcml2LT5kZXZpY2VfYmFzZSwgSVNMMzhYWF9ERVZfSU5UX1VQREFURSwKKwkJCQkgIElTTDM4WFhfREVWX0lOVF9SRUcpOworCQl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKKworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZHJvcF9mcmVlOworCX0KKwkvKiBDaGVjayBhbGlnbm1lbnQgYW5kIFdEUyBmcmFtZSBmb3JtYXR0aW5nLiBUaGUgc3RhcnQgb2YgdGhlIHBhY2tldCBzaG91bGQKKwkgKiBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiBJZiBXRFMgaXMgZW5hYmxlZCBhZGQgYW5vdGhlciA2IGJ5dGVzCisJICogYW5kIGFkZCBXRFMgYWRkcmVzcyBpbmZvcm1hdGlvbiAqLworCWlmIChsaWtlbHkoKChsb25nKSBza2ItPmRhdGEgJiAweDAzKSB8IGluaXRfd2RzKSkgeworCQkvKiBnZXQgdGhlIG51bWJlciBvZiBieXRlcyB0byBhZGQgYW5kIHJlLWFsbGlnbiAqLworCQlvZmZzZXQgPSAoNCAtIChsb25nKSBza2ItPmRhdGEpICYgMHgwMzsKKwkJb2Zmc2V0ICs9IGluaXRfd2RzID8gNiA6IDA7CisKKwkJLyogY2hlY2sgd2hldGhlciB0aGUgY3VycmVudCBza2IgY2FuIGJlIHVzZWQgICovCisJCWlmICghc2tiX2Nsb25lZChza2IpICYmIChza2JfdGFpbHJvb20oc2tiKSA+PSBvZmZzZXQpKSB7CisJCQl1bnNpZ25lZCBjaGFyICpzcmMgPSBza2ItPmRhdGE7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQkJREVCVUcoU0hPV19UUkFDSU5HLCAic2tiIG9mZnNldCAlaSB3ZHMgJWlcbiIsIG9mZnNldCwKKwkJCSAgICAgIGluaXRfd2RzKTsKKyNlbmRpZgorCisJCQkvKiBhbGlnbiB0aGUgYnVmZmVyIG9uIDQtYnl0ZSBib3VuZGFyeSAqLworCQkJc2tiX3Jlc2VydmUoc2tiLCAoNCAtIChsb25nKSBza2ItPmRhdGEpICYgMHgwMyk7CisJCQlpZiAoaW5pdF93ZHMpIHsKKwkJCQkvKiB3ZHMgcmVxdWlyZXMgYW4gYWRkaXRpb25hbCBhZGRyZXNzIGZpZWxkIG9mIDYgYnl0ZXMgKi8KKwkJCQlza2JfcHV0KHNrYiwgNik7CisjaWZkZWYgSVNMUENJX0VUSF9ERUJVRworCQkJCXByaW50aygiaXNscGNpX2V0aF90cmFuc21pdDp3ZHNfbWFjXG4iKTsKKyNlbmRpZgorCQkJCW1lbW1vdmUoc2tiLT5kYXRhICsgNiwgc3JjLCBza2ItPmxlbik7CisJCQkJbWVtY3B5KHNrYi0+ZGF0YSwgd2RzX21hYywgNik7CisJCQl9IGVsc2UgeworCQkJCW1lbW1vdmUoc2tiLT5kYXRhLCBzcmMsIHNrYi0+bGVuKTsKKwkJCX0KKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCQlERUJVRyhTSE9XX1RSQUNJTkcsICJtZW1tb3ZlICVwICVwICVpIFxuIiwgc2tiLT5kYXRhLAorCQkJICAgICAgc3JjLCBza2ItPmxlbik7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCW5ld3NrYiA9CisJCQkgICAgZGV2X2FsbG9jX3NrYihpbml0X3dkcyA/IHNrYi0+bGVuICsgNiA6IHNrYi0+bGVuKTsKKwkJCWlmICh1bmxpa2VseShuZXdza2IgPT0gTlVMTCkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3QgYWxsb2NhdGUgc2tiXG4iLAorCQkJCSAgICAgICBuZGV2LT5uYW1lKTsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCWdvdG8gZHJvcF9mcmVlOworCQkJfQorCQkJbmV3c2tiX29mZnNldCA9ICg0IC0gKGxvbmcpIG5ld3NrYi0+ZGF0YSkgJiAweDAzOworCisJCQkvKiBDaGVjayBpZiBuZXdza2ItPmRhdGEgaXMgYWxpZ25lZCAqLworCQkJaWYgKG5ld3NrYl9vZmZzZXQpCisJCQkJc2tiX3Jlc2VydmUobmV3c2tiLCBuZXdza2Jfb2Zmc2V0KTsKKworCQkJc2tiX3B1dChuZXdza2IsIGluaXRfd2RzID8gc2tiLT5sZW4gKyA2IDogc2tiLT5sZW4pOworCQkJaWYgKGluaXRfd2RzKSB7CisJCQkJbWVtY3B5KG5ld3NrYi0+ZGF0YSArIDYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkJCW1lbWNweShuZXdza2ItPmRhdGEsIHdkc19tYWMsIDYpOworI2lmZGVmIElTTFBDSV9FVEhfREVCVUcKKwkJCQlwcmludGsoImlzbHBjaV9ldGhfdHJhbnNtaXQ6d2RzX21hY1xuIik7CisjZW5kaWYKKwkJCX0gZWxzZQorCQkJCW1lbWNweShuZXdza2ItPmRhdGEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJCURFQlVHKFNIT1dfVFJBQ0lORywgIm1lbWNweSAlcCAlcCAlaSB3ZHMgJWlcbiIsCisJCQkgICAgICBuZXdza2ItPmRhdGEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIGluaXRfd2RzKTsKKyNlbmRpZgorCisJCQluZXdza2ItPmRldiA9IHNrYi0+ZGV2OworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJc2tiID0gbmV3c2tiOworCQl9CisJfQorCS8qIGRpc3BsYXkgdGhlIGJ1ZmZlciBjb250ZW50cyBmb3IgZGVidWdnaW5nICovCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX0JVRkZFUl9DT05URU5UUywgIlxudHggJXAgIiwgc2tiLT5kYXRhKTsKKwlkaXNwbGF5X2J1ZmZlcigoY2hhciAqKSBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKyNlbmRpZgorCisJLyogbWFwIHRoZSBza2IgYnVmZmVyIHRvIHBjaSBtZW1vcnkgZm9yIERNQSBvcGVyYXRpb24gKi8KKwlwY2lfbWFwX2FkZHJlc3MgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wZGV2LAorCQkJCQkgKHZvaWQgKikgc2tiLT5kYXRhLCBza2ItPmxlbiwKKwkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCWlmICh1bmxpa2VseShwY2lfbWFwX2FkZHJlc3MgPT0gMCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNhbm5vdCBtYXAgYnVmZmVyIHRvIFBDSVxuIiwKKwkJICAgICAgIG5kZXYtPm5hbWUpOworCisJCWVyciA9IC1FSU87CisJCWdvdG8gZHJvcF9mcmVlOworCX0KKwkvKiBQbGFjZSB0aGUgZnJhZ21lbnQgaW4gdGhlIGNvbnRyb2wgYmxvY2sgc3RydWN0dXJlLiAqLworCWluZGV4ID0gY3Vycl9mcmFnICUgSVNMMzhYWF9DQl9UWF9RU0laRTsKKwlmcmFnbWVudCA9ICZjYi0+dHhfZGF0YV9sb3dbaW5kZXhdOworCisJcHJpdi0+cGNpX21hcF90eF9hZGRyZXNzW2luZGV4XSA9IHBjaV9tYXBfYWRkcmVzczsKKwkvKiBzdG9yZSB0aGUgc2tiIGFkZHJlc3MgZm9yIGZ1dHVyZSBmcmVlaW5nICAqLworCXByaXYtPmRhdGFfbG93X3R4W2luZGV4XSA9IHNrYjsKKwkvKiBzZXQgdGhlIHByb3BlciBmcmFnbWVudCBzdGFydCBhZGRyZXNzIGFuZCBzaXplIGluZm9ybWF0aW9uICovCisJZnJhZ21lbnQtPnNpemUgPSBjcHVfdG9fbGUxNihmcmFtZV9zaXplKTsKKwlmcmFnbWVudC0+ZmxhZ3MgPSBjcHVfdG9fbGUxNigwKTsJLyogc2V0IHRvIDEgaWYgbW9yZSBmcmFnbWVudHMgKi8KKwlmcmFnbWVudC0+YWRkcmVzcyA9IGNwdV90b19sZTMyKHBjaV9tYXBfYWRkcmVzcyk7CisJY3Vycl9mcmFnKys7CisKKwkvKiBUaGUgZnJhZ21lbnQgYWRkcmVzcyBpbiB0aGUgY29udHJvbCBibG9jayBtdXN0IGhhdmUgYmVlbgorCSAqIHdyaXR0ZW4gYmVmb3JlIGFubm91bmNpbmcgdGhlIGZyYW1lIGJ1ZmZlciB0byBkZXZpY2UuICovCisJd21iKCk7CisJY2ItPmRyaXZlcl9jdXJyX2ZyYWdbSVNMMzhYWF9DQl9UWF9EQVRBX0xRXSA9IGNwdV90b19sZTMyKGN1cnJfZnJhZyk7CisKKwlpZiAoY3Vycl9mcmFnIC0gcHJpdi0+ZnJlZV9kYXRhX3R4ICsgSVNMMzhYWF9NSU5fUVRIUkVTSE9MRAorCSAgICA+IElTTDM4WFhfQ0JfVFhfUVNJWkUpIHsKKwkJLyogc3RvcCBzZW5kcyBmcm9tIHVwcGVyIGxheWVycyAqLworCQluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCisJCS8qIHNldCB0aGUgZnVsbCBmbGFnIGZvciB0aGUgdHJhbnNtaXNzaW9uIHF1ZXVlICovCisJCXByaXYtPmRhdGFfbG93X3R4X2Z1bGwgPSAxOworCX0KKworCS8qIHRyaWdnZXIgdGhlIGRldmljZSAqLworCWlzbHBjaV90cmlnZ2VyKHByaXYpOworCisJLyogdW5sb2NrIHRoZSBkcml2ZXIgY29kZSAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNsb2NrLCBmbGFncyk7CisKKwkvKiBzZXQgdGhlIHRyYW5zbWlzc2lvbiB0aW1lICovCisJbmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXByaXYtPnN0YXRpc3RpY3MudHhfcGFja2V0cysrOworCXByaXYtPnN0YXRpc3RpY3MudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwlyZXR1cm4gMDsKKworICAgICAgZHJvcF9mcmVlOgorCS8qIGZyZWUgdGhlIHNrYnVmIHN0cnVjdHVyZSBiZWZvcmUgYWJvcnRpbmcgKi8KKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJc2tiID0gTlVMTDsKKworCXByaXYtPnN0YXRpc3RpY3MudHhfZHJvcHBlZCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNsb2NrLCBmbGFncyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lzbHBjaV9tb25pdG9yX3J4KGlzbHBjaV9wcml2YXRlICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqKnNrYikKK3sKKwkvKiBUaGUgY2FyZCByZXBvcnRzIGZ1bGwgODAyLjExIHBhY2tldHMgYnV0IHdpdGggYSAyMCBieXRlcworCSAqIGhlYWRlciBhbmQgd2l0aG91dCB0aGUgRkNTLiBCdXQgdGhlcmUgYSBpcyBhIGJpdCB0aGF0CisJICogaW5kaWNhdGVzIGlmIHRoZSBwYWNrZXQgaXMgY29ycnVwdGVkIDotKSAqLworCXN0cnVjdCByZm1vbl9oZWFkZXIgKmhkciA9IChzdHJ1Y3QgcmZtb25faGVhZGVyICopICgqc2tiKS0+ZGF0YTsKKwlpZiAoaGRyLT5mbGFncyAmIDB4MDEpCisJCS8qIFRoaXMgb25lIGlzIGJhZC4gRHJvcCBpdCAhICovCisJCXJldHVybiAtMTsKKwlpZiAocHJpdi0+bmRldi0+dHlwZSA9PSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNKSB7CisJCXN0cnVjdCBhdnNfODAyMTFfMV9oZWFkZXIgKmF2czsKKwkJLyogZXh0cmFjdCB0aGUgcmVsZXZhbnQgZGF0YSBmcm9tIHRoZSBoZWFkZXIgKi8KKwkJdTMyIGNsb2NrID0gbGUzMl90b19jcHUoaGRyLT5jbG9jayk7CisJCXU4IHJhdGUgPSBoZHItPnJhdGU7CisJCXUxNiBmcmVxID0gbGUxNl90b19jcHUoaGRyLT5mcmVxKTsKKwkJdTggcnNzaSA9IGhkci0+cnNzaTsKKworCQlza2JfcHVsbCgqc2tiLCBzaXplb2YgKHN0cnVjdCByZm1vbl9oZWFkZXIpKTsKKworCQlpZiAoc2tiX2hlYWRyb29tKCpza2IpIDwgc2l6ZW9mIChzdHJ1Y3QgYXZzXzgwMjExXzFfaGVhZGVyKSkgeworCQkJc3RydWN0IHNrX2J1ZmYgKm5ld3NrYiA9IHNrYl9jb3B5X2V4cGFuZCgqc2tiLAorCQkJCQkJCQkgc2l6ZW9mIChzdHJ1Y3QKKwkJCQkJCQkJCSBhdnNfODAyMTFfMV9oZWFkZXIpLAorCQkJCQkJCQkgMCwgR0ZQX0FUT01JQyk7CisJCQlpZiAobmV3c2tiKSB7CisJCQkJZGV2X2tmcmVlX3NrYl9pcnEoKnNrYik7CisJCQkJKnNrYiA9IG5ld3NrYjsKKwkJCX0gZWxzZQorCQkJCXJldHVybiAtMTsKKwkJCS8qIFRoaXMgYmVoYXZpb3IgaXMgbm90IHZlcnkgc3VidGlsZS4uLiAqLworCQl9CisKKwkJLyogbWFrZSByb29tIGZvciB0aGUgbmV3IGhlYWRlciBhbmQgZmlsbCBpdC4gKi8KKwkJYXZzID0KKwkJICAgIChzdHJ1Y3QgYXZzXzgwMjExXzFfaGVhZGVyICopIHNrYl9wdXNoKCpza2IsCisJCQkJCQkJICAgc2l6ZW9mIChzdHJ1Y3QKKwkJCQkJCQkJICAgYXZzXzgwMjExXzFfaGVhZGVyKSk7CisJCQorCQlhdnMtPnZlcnNpb24gPSBjcHVfdG9fYmUzMihQODAyMTFDQVBUVVJFX1ZFUlNJT04pOworCQlhdnMtPmxlbmd0aCA9IGNwdV90b19iZTMyKHNpemVvZiAoc3RydWN0IGF2c184MDIxMV8xX2hlYWRlcikpOworCQlhdnMtPm1hY3RpbWUgPSBjcHVfdG9fYmU2NChsZTY0X3RvX2NwdShjbG9jaykpOworCQlhdnMtPmhvc3R0aW1lID0gY3B1X3RvX2JlNjQoamlmZmllcyk7CisJCWF2cy0+cGh5dHlwZSA9IGNwdV90b19iZTMyKDYpOwkvKk9GRE06IDYgZm9yIChnKSwgOCBmb3IgKGEpICovCisJCWF2cy0+Y2hhbm5lbCA9IGNwdV90b19iZTMyKGNoYW5uZWxfb2ZfZnJlcShmcmVxKSk7CisJCWF2cy0+ZGF0YXJhdGUgPSBjcHVfdG9fYmUzMihyYXRlICogNSk7CisJCWF2cy0+YW50ZW5uYSA9IGNwdV90b19iZTMyKDApOwkvKnVua25vd24gKi8KKwkJYXZzLT5wcmlvcml0eSA9IGNwdV90b19iZTMyKDApOwkvKnVua25vd24gKi8KKwkJYXZzLT5zc2lfdHlwZSA9IGNwdV90b19iZTMyKDMpOwkvKjI6IGRCbSwgMzogcmF3IFJTU0kgKi8KKwkJYXZzLT5zc2lfc2lnbmFsID0gY3B1X3RvX2JlMzIocnNzaSAmIDB4N2YpOworCQlhdnMtPnNzaV9ub2lzZSA9IGNwdV90b19iZTMyKHByaXYtPmxvY2FsX2l3c3RhdGlzdGljcy5xdWFsLm5vaXNlKTsJLypiZXR0ZXIgdGhhbiAndW5kZWZpbmVkJywgSSBhc3N1bWUgKi8KKwkJYXZzLT5wcmVhbWJsZSA9IGNwdV90b19iZTMyKDApOwkvKnVua25vd24gKi8KKwkJYXZzLT5lbmNvZGluZyA9IGNwdV90b19iZTMyKDApOwkvKnVua25vd24gKi8KKwl9IGVsc2UKKwkJc2tiX3B1bGwoKnNrYiwgc2l6ZW9mIChzdHJ1Y3QgcmZtb25faGVhZGVyKSk7CisKKwkoKnNrYiktPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyXzIpOworCSgqc2tiKS0+bWFjLnJhdyA9ICgqc2tiKS0+ZGF0YTsKKwkoKnNrYiktPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKKworCXJldHVybiAwOworfQorCitpbnQKK2lzbHBjaV9ldGhfcmVjZWl2ZShpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHByaXYtPm5kZXY7CisJaXNsMzh4eF9jb250cm9sX2Jsb2NrICpjb250cm9sX2Jsb2NrID0gcHJpdi0+Y29udHJvbF9ibG9jazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUxNiBzaXplOworCXUzMiBpbmRleCwgb2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgKnNyYzsKKwlpbnQgZGlzY2FyZCA9IDA7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCURFQlVHKFNIT1dfRlVOQ1RJT05fQ0FMTFMsICJpc2xwY2lfZXRoX3JlY2VpdmUgXG4iKTsKKyNlbmRpZgorCisJLyogdGhlIGRldmljZSBoYXMgd3JpdHRlbiBhbiBFdGhlcm5ldCBmcmFtZSBpbiB0aGUgZGF0YSBhcmVhCisJICogb2YgdGhlIHNrX2J1ZmYgd2l0aG91dCB1cGRhdGluZyB0aGUgc3RydWN0dXJlLCBkbyBpdCBub3cgKi8KKwlpbmRleCA9IHByaXYtPmZyZWVfZGF0YV9yeCAlIElTTDM4WFhfQ0JfUlhfUVNJWkU7CisJc2l6ZSA9IGxlMTZfdG9fY3B1KGNvbnRyb2xfYmxvY2stPnJ4X2RhdGFfbG93W2luZGV4XS5zaXplKTsKKwlza2IgPSBwcml2LT5kYXRhX2xvd19yeFtpbmRleF07CisJb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nKQorCQkgIGxlMzJfdG9fY3B1KGNvbnRyb2xfYmxvY2stPnJ4X2RhdGFfbG93W2luZGV4XS5hZGRyZXNzKSAtCisJCSAgKHVuc2lnbmVkIGxvbmcpIHNrYi0+ZGF0YSkgJiAzOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX1RSQUNJTkcsCisJICAgICAgImZycS0+YWRkciAleCBza2ItPmRhdGEgJXAgc2tiLT5sZW4gJXUgb2Zmc2V0ICV1IHRydWVzaXplICV1XG4gIiwKKwkgICAgICBjb250cm9sX2Jsb2NrLT5yeF9kYXRhX2xvd1twcml2LT5mcmVlX2RhdGFfcnhdLmFkZHJlc3MsIHNrYi0+ZGF0YSwKKwkgICAgICBza2ItPmxlbiwgb2Zmc2V0LCBza2ItPnRydWVzaXplKTsKKyNlbmRpZgorCisJLyogZGVsZXRlIHRoZSBzdHJlYW1pbmcgRE1BIG1hcHBpbmcgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIHNrYiAqLworCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwKKwkJCSBwcml2LT5wY2lfbWFwX3J4X2FkZHJlc3NbaW5kZXhdLAorCQkJIE1BWF9GUkFHTUVOVF9TSVpFX1JYICsgMiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCS8qIHVwZGF0ZSB0aGUgc2tiIHN0cnVjdHVyZSBhbmQgYWxsaWduIHRoZSBidWZmZXIgKi8KKwlza2JfcHV0KHNrYiwgc2l6ZSk7CisJaWYgKG9mZnNldCkgeworCQkvKiBzaGlmdCB0aGUgYnVmZmVyIGFsbG9jYXRpb24gb2Zmc2V0IGJ5dGVzIHRvIGdldCB0aGUgcmlnaHQgZnJhbWUgKi8KKwkJc2tiX3B1bGwoc2tiLCAyKTsKKwkJc2tiX3B1dChza2IsIDIpOworCX0KKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCS8qIGRpc3BsYXkgdGhlIGJ1ZmZlciBjb250ZW50cyBmb3IgZGVidWdnaW5nICovCisJREVCVUcoU0hPV19CVUZGRVJfQ09OVEVOVFMsICJcbnJ4ICVwICIsIHNrYi0+ZGF0YSk7CisJZGlzcGxheV9idWZmZXIoKGNoYXIgKikgc2tiLT5kYXRhLCBza2ItPmxlbik7CisjZW5kaWYKKworCS8qIGNoZWNrIHdoZXRoZXIgV0RTIGlzIGVuYWJsZWQgYW5kIHdoZXRoZXIgdGhlIGRhdGEgZnJhbWUgaXMgYSBXRFMgZnJhbWUgKi8KKworCWlmIChpbml0X3dkcykgeworCQkvKiBXRFMgZW5hYmxlZCwgY2hlY2sgZm9yIHRoZSB3ZHMgYWRkcmVzcyBvbiB0aGUgZmlyc3QgNiBieXRlcyBvZiB0aGUgYnVmZmVyICovCisJCXNyYyA9IHNrYi0+ZGF0YSArIDY7CisJCW1lbW1vdmUoc2tiLT5kYXRhLCBzcmMsIHNrYi0+bGVuIC0gNik7CisJCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSA2KTsKKwl9CisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX1RSQUNJTkcsICJGcmFnbWVudCBzaXplICVpIGluIHNrYiBhdCAlcFxuIiwgc2l6ZSwgc2tiKTsKKwlERUJVRyhTSE9XX1RSQUNJTkcsICJTa2IgZGF0YSBhdCAlcCwgbGVuZ3RoICVpXG4iLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKworCS8qIGRpc3BsYXkgdGhlIGJ1ZmZlciBjb250ZW50cyBmb3IgZGVidWdnaW5nICovCisJREVCVUcoU0hPV19CVUZGRVJfQ09OVEVOVFMsICJcbnJ4ICVwICIsIHNrYi0+ZGF0YSk7CisJZGlzcGxheV9idWZmZXIoKGNoYXIgKikgc2tiLT5kYXRhLCBza2ItPmxlbik7CisjZW5kaWYKKworCS8qIGRvIHNvbWUgYWRkaXRpb25hbCBza19idWZmIGFuZCBuZXR3b3JrIGxheWVyIHBhcmFtZXRlcnMgKi8KKwlza2ItPmRldiA9IG5kZXY7CisKKwkvKiB0YWtlIGNhcmUgb2YgbW9uaXRvciBtb2RlIGFuZCBzcHkgbW9uaXRvcmluZy4gKi8KKwlpZiAodW5saWtlbHkocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpKQorCQlkaXNjYXJkID0gaXNscGNpX21vbml0b3JfcngocHJpdiwgJnNrYik7CisJZWxzZSB7CisJCWlmICh1bmxpa2VseShza2ItPmRhdGFbMiAqIEVUSF9BTEVOXSA9PSAwKSkgeworCQkJLyogVGhlIHBhY2tldCBoYXMgYSByeF9hbm5leC4gUmVhZCBpdCBmb3Igc3B5IG1vbml0b3JpbmcsIFRoZW4KKwkJCSAqIHJlbW92ZSBpdCwgd2hpbGUga2VlcGluZyB0aGUgMiBsZWFkaW5nIE1BQyBhZGRyLgorCQkJICovCisJCQlzdHJ1Y3QgaXdfcXVhbGl0eSB3c3RhdHM7CisJCQlzdHJ1Y3QgcnhfYW5uZXhfaGVhZGVyICphbm5leCA9CisJCQkgICAgKHN0cnVjdCByeF9hbm5leF9oZWFkZXIgKikgc2tiLT5kYXRhOworCQkJd3N0YXRzLmxldmVsID0gYW5uZXgtPnJmbW9uLnJzc2k7CisJCQkvKiBUaGUgbm9pc2UgdmFsdWUgY2FuIGJlIGEgYml0IG91dGRhdGVkIGlmIG5vYm9keSdzIAorCQkJICogcmVhZGluZyB3aXJlbGVzcyBzdGF0cy4uLiAqLworCQkJd3N0YXRzLm5vaXNlID0gcHJpdi0+bG9jYWxfaXdzdGF0aXN0aWNzLnF1YWwubm9pc2U7CisJCQl3c3RhdHMucXVhbCA9IHdzdGF0cy5sZXZlbCAtIHdzdGF0cy5ub2lzZTsKKwkJCXdzdGF0cy51cGRhdGVkID0gMHgwNzsKKwkJCS8qIFVwZGF0ZSBzcHkgcmVjb3JkcyAqLworCQkJd2lyZWxlc3Nfc3B5X3VwZGF0ZShuZGV2LCBhbm5leC0+YWRkcjIsICZ3c3RhdHMpOworCisJCQltZW1jcHkoc2tiLT5kYXRhICsgc2l6ZW9mIChzdHJ1Y3QgcmZtb25faGVhZGVyKSwKKwkJCSAgICAgICBza2ItPmRhdGEsIDIgKiBFVEhfQUxFTik7CisJCQlza2JfcHVsbChza2IsIHNpemVvZiAoc3RydWN0IHJmbW9uX2hlYWRlcikpOworCQl9CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5kZXYpOworCX0KKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJcHJpdi0+c3RhdGlzdGljcy5yeF9wYWNrZXRzKys7CisJcHJpdi0+c3RhdGlzdGljcy5yeF9ieXRlcyArPSBzaXplOworCisJLyogZGVsaXZlciB0aGUgc2tiIHRvIHRoZSBuZXR3b3JrIGxheWVyICovCisjaWZkZWYgSVNMUENJX0VUSF9ERUJVRworCXByaW50aworCSAgICAoImlzbHBjaV9ldGhfcmVjZWl2ZTpuZXRpZl9yeCAlMi4yWCAlMi4yWCAlMi4yWCAlMi4yWCAlMi4yWCAlMi4yWFxuIiwKKwkgICAgIHNrYi0+ZGF0YVswXSwgc2tiLT5kYXRhWzFdLCBza2ItPmRhdGFbMl0sIHNrYi0+ZGF0YVszXSwKKwkgICAgIHNrYi0+ZGF0YVs0XSwgc2tiLT5kYXRhWzVdKTsKKyNlbmRpZgorCWlmICh1bmxpa2VseShkaXNjYXJkKSkgeworCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQlza2IgPSBOVUxMOworCX0gZWxzZQorCQluZXRpZl9yeChza2IpOworCisJLyogaW5jcmVtZW50IHRoZSByZWFkIGluZGV4IGZvciB0aGUgcnggZGF0YSBsb3cgcXVldWUgKi8KKwlwcml2LT5mcmVlX2RhdGFfcngrKzsKKworCS8qIGFkZCBvbmUgb3IgbW9yZSBza19idWZmIHN0cnVjdHVyZXMgKi8KKwl3aGlsZSAoaW5kZXggPQorCSAgICAgICBsZTMyX3RvX2NwdShjb250cm9sX2Jsb2NrLT4KKwkJCSAgIGRyaXZlcl9jdXJyX2ZyYWdbSVNMMzhYWF9DQl9SWF9EQVRBX0xRXSksCisJICAgICAgIGluZGV4IC0gcHJpdi0+ZnJlZV9kYXRhX3J4IDwgSVNMMzhYWF9DQl9SWF9RU0laRSkgeworCQkvKiBhbGxvY2F0ZSBhbiBza19idWZmIGZvciByZWNlaXZlZCBkYXRhIGZyYW1lcyBzdG9yYWdlCisJCSAqIGluY2x1ZGUgYW55IHJlcXVpcmVkIGFsbGlnbm1lbnQgb3BlcmF0aW9ucyAqLworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKE1BWF9GUkFHTUVOVF9TSVpFX1JYICsgMik7CisJCWlmICh1bmxpa2VseShza2IgPT0gTlVMTCkpIHsKKwkJCS8qIGVycm9yIGFsbG9jYXRpbmcgYW4gc2tfYnVmZiBzdHJ1Y3R1cmUgZWxlbWVudHMgKi8KKwkJCURFQlVHKFNIT1dfRVJST1JfTUVTU0FHRVMsICJFcnJvciBhbGxvY2F0aW5nIHNrYiBcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJc2tiX3Jlc2VydmUoc2tiLCAoNCAtIChsb25nKSBza2ItPmRhdGEpICYgMHgwMyk7CisJCS8qIHN0b3JlIHRoZSBuZXcgc2tiIHN0cnVjdHVyZSBwb2ludGVyICovCisJCWluZGV4ID0gaW5kZXggJSBJU0wzOFhYX0NCX1JYX1FTSVpFOworCQlwcml2LT5kYXRhX2xvd19yeFtpbmRleF0gPSBza2I7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQlERUJVRyhTSE9XX1RSQUNJTkcsCisJCSAgICAgICJuZXcgYWxsb2Mgc2tiICVwIHNrYi0+ZGF0YSAlcCBza2ItPmxlbiAldSBpbmRleCAldSB0cnVlc2l6ZSAldVxuICIsCisJCSAgICAgIHNrYiwgc2tiLT5kYXRhLCBza2ItPmxlbiwgaW5kZXgsIHNrYi0+dHJ1ZXNpemUpOworI2VuZGlmCisKKwkJLyogc2V0IHRoZSBzdHJlYW1pbmcgRE1BIG1hcHBpbmcgZm9yIHByb3BlciBQQ0kgYnVzIG9wZXJhdGlvbiAqLworCQlwcml2LT5wY2lfbWFwX3J4X2FkZHJlc3NbaW5kZXhdID0KKwkJICAgIHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsICh2b2lkICopIHNrYi0+ZGF0YSwKKwkJCQkgICBNQVhfRlJBR01FTlRfU0laRV9SWCArIDIsCisJCQkJICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJaWYgKHVubGlrZWx5KHByaXYtPnBjaV9tYXBfcnhfYWRkcmVzc1tpbmRleF0gPT0gKGRtYV9hZGRyX3QpIE5VTEwpKSB7CisJCQkvKiBlcnJvciBtYXBwaW5nIHRoZSBidWZmZXIgdG8gZGV2aWNlIGFjY2Vzc2FibGUgbWVtb3J5IGFkZHJlc3MgKi8KKwkJCURFQlVHKFNIT1dfRVJST1JfTUVTU0FHRVMsCisJCQkgICAgICAiRXJyb3IgbWFwcGluZyBETUEgYWRkcmVzc1xuIik7CisKKwkJCS8qIGZyZWUgdGhlIHNrYnVmIHN0cnVjdHVyZSBiZWZvcmUgYWJvcnRpbmcgKi8KKwkJCWRldl9rZnJlZV9za2JfaXJxKChzdHJ1Y3Qgc2tfYnVmZiAqKSBza2IpOworCQkJc2tiID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCS8qIHVwZGF0ZSB0aGUgZnJhZ21lbnQgYWRkcmVzcyAqLworCQljb250cm9sX2Jsb2NrLT5yeF9kYXRhX2xvd1tpbmRleF0uYWRkcmVzcyA9IGNwdV90b19sZTMyKCh1MzIpCisJCQkJCQkJCQlwcml2LT4KKwkJCQkJCQkJCXBjaV9tYXBfcnhfYWRkcmVzcworCQkJCQkJCQkJW2luZGV4XSk7CisJCXdtYigpOworCisJCS8qIGluY3JlbWVudCB0aGUgZHJpdmVyIHJlYWQgcG9pbnRlciAqLworCQlhZGRfbGUzMnAoKHUzMiAqKSAmY29udHJvbF9ibG9jay0+CisJCQkgIGRyaXZlcl9jdXJyX2ZyYWdbSVNMMzhYWF9DQl9SWF9EQVRBX0xRXSwgMSk7CisJfQorCisJLyogdHJpZ2dlciB0aGUgZGV2aWNlICovCisJaXNscGNpX3RyaWdnZXIocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAoraXNscGNpX2RvX3Jlc2V0X2FuZF93YWtlKHZvaWQgKmRhdGEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSAoaXNscGNpX3ByaXZhdGUgKikgZGF0YTsKKwlpc2xwY2lfcmVzZXQocHJpdiwgMSk7CisJbmV0aWZfd2FrZV9xdWV1ZShwcml2LT5uZGV2KTsKKwlwcml2LT5yZXNldF90YXNrX3BlbmRpbmcgPSAwOworfQorCit2b2lkCitpc2xwY2lfZXRoX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdGlzdGljcyA9ICZwcml2LT5zdGF0aXN0aWNzOworCisJLyogaW5jcmVtZW50IHRoZSB0cmFuc21pdCBlcnJvciBjb3VudGVyICovCisJc3RhdGlzdGljcy0+dHhfZXJyb3JzKys7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHhfdGltZW91dCIsIG5kZXYtPm5hbWUpOworCWlmICghcHJpdi0+cmVzZXRfdGFza19wZW5kaW5nKSB7CisJCXByaXYtPnJlc2V0X3Rhc2tfcGVuZGluZyA9IDE7CisJCXByaW50aygiLCBzY2hlZHVsaW5nIGEgcmVzZXQiKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKwkJc2NoZWR1bGVfd29yaygmcHJpdi0+cmVzZXRfdGFzayk7CisJfQorCXByaW50aygiXG4iKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM5ZDdhNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiAgCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEludGVyc2lsIEFtZXJpY2FzIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfSVNMUENJX0VUSF9ICisjZGVmaW5lIF9JU0xQQ0lfRVRIX0gKKworI2luY2x1ZGUgImlzbF8zOHh4LmgiCisjaW5jbHVkZSAiaXNscGNpX2Rldi5oIgorCitzdHJ1Y3QgcmZtb25faGVhZGVyIHsKKwl1MTYgdW5rMDsJCS8qID0gMHgwMDAwICovCisJdTE2IGxlbmd0aDsJCS8qID0gMHgxNDAwICovCisJdTMyIGNsb2NrOwkJLyogMU1IeiBjbG9jayAqLworCXU4IGZsYWdzOworCXU4IHVuazE7CisJdTggcmF0ZTsKKwl1OCB1bmsyOworCXUxNiBmcmVxOworCXUxNiB1bmszOworCXU4IHJzc2k7CisJdTggcGFkZGluZ1szXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgcnhfYW5uZXhfaGVhZGVyIHsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXN0cnVjdCByZm1vbl9oZWFkZXIgcmZtb247Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogd2xhbi1uZyAoYW5kIGhvcGVmdWxseSBvdGhlcnMpIEFWUyBoZWFkZXIsIHZlcnNpb24gb25lLiAgRmllbGRzIGluCisgKiBuZXR3b3JrIGJ5dGUgb3JkZXIuICovCisjZGVmaW5lIFA4MDIxMUNBUFRVUkVfVkVSU0lPTiAweDgwMjExMDAxCisKK3N0cnVjdCBhdnNfODAyMTFfMV9oZWFkZXIgeworCXVpbnQzMl90IHZlcnNpb247CisJdWludDMyX3QgbGVuZ3RoOworCXVpbnQ2NF90IG1hY3RpbWU7CisJdWludDY0X3QgaG9zdHRpbWU7CisJdWludDMyX3QgcGh5dHlwZTsKKwl1aW50MzJfdCBjaGFubmVsOworCXVpbnQzMl90IGRhdGFyYXRlOworCXVpbnQzMl90IGFudGVubmE7CisJdWludDMyX3QgcHJpb3JpdHk7CisJdWludDMyX3Qgc3NpX3R5cGU7CisJaW50MzJfdCBzc2lfc2lnbmFsOworCWludDMyX3Qgc3NpX25vaXNlOworCXVpbnQzMl90IHByZWFtYmxlOworCXVpbnQzMl90IGVuY29kaW5nOworfTsKKwordm9pZCBpc2xwY2lfZXRoX2NsZWFudXBfdHJhbnNtaXQoaXNscGNpX3ByaXZhdGUgKiwgaXNsMzh4eF9jb250cm9sX2Jsb2NrICopOworaW50IGlzbHBjaV9ldGhfdHJhbnNtaXQoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CitpbnQgaXNscGNpX2V0aF9yZWNlaXZlKGlzbHBjaV9wcml2YXRlICopOwordm9pZCBpc2xwY2lfZXRoX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKik7Cit2b2lkIGlzbHBjaV9kb19yZXNldF9hbmRfd2FrZSh2b2lkICpkYXRhKTsKKworI2VuZGlmCQkJCS8qIF9JU0xfR0VOX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2hvdHBsdWcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2hvdHBsdWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmQ0ZDIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfaG90cGx1Zy5jCkBAIC0wLDAgKzEsMzM5IEBACisvKgorICogIAorICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBnbnUub3JnPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPiAvKiBGb3IgX19pbml0LCBfX2V4aXQgKi8KKworI2luY2x1ZGUgInByaXNtY29tcGF0LmgiCisjaW5jbHVkZSAiaXNscGNpX2Rldi5oIgorI2luY2x1ZGUgImlzbHBjaV9tZ3QuaCIJCS8qIGZvciBwY19kZWJ1ZyAqLworI2luY2x1ZGUgImlzbF9vaWQuaCIKKworI2RlZmluZSBEUlZfTkFNRQkicHJpc201NCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMiIKKworTU9EVUxFX0FVVEhPUigiW0ludGVyc2lsXSBSLkJhc3RpbmdzIGFuZCBXLlRlcm1vcnNodWl6ZW4sIFRoZSBwcmlzbTU0Lm9yZyBEZXZlbG9wbWVudCBUZWFtIDxwcmlzbTU0LWRldmVsQHByaXNtNTQub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUaGUgUHJpc201NCA4MDIuMTEgV2lyZWxlc3MgTEFOIGFkYXB0ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludAlpbml0X3BjaXRtID0gMDsKK21vZHVsZV9wYXJhbShpbml0X3BjaXRtLCBpbnQsIDApOworCisvKiBJbiB0aGlzIG9yZGVyOiB2ZW5kb3IsIGRldmljZSwgc3VidmVuZG9yLCBzdWJkZXZpY2UsIGNsYXNzLCBjbGFzc19tYXNrLAorICogZHJpdmVyX2RhdGEgCisgKiBJZiB5b3UgaGF2ZSBhbiB1cGRhdGUgZm9yIHRoaXMgcGxlYXNlIGNvbnRhY3QgcHJpc201NC1kZXZlbEBwcmlzbTU0Lm9yZyAKKyAqIFRoZSBsYXRlc3QgbGlzdCBjYW4gYmUgZm91bmQgYXQgaHR0cDovL3ByaXNtNTQub3JnL3N1cHBvcnRlZF9jYXJkcy5waHAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwcmlzbTU0X2lkX3RibFtdID0geworCS8qIEludGVyc2lsIFBSSVNNIER1ZXR0ZS9QcmlzbSBHVCBXaXJlbGVzcyBMQU4gYWRhcHRlciAqLworCXsKKwkgMHgxMjYwLCAweDM4OTAsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJIDAsIDAsIDAKKwl9LAorCisJLyogM0NPTSAzQ1JXRTE1NEc3MiBXaXJlbGVzcyBMQU4gYWRhcHRlciAqLworCXsKKwkgMHgxMGI3LCAweDYwMDEsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJIDAsIDAsIDAKKwl9LAorCisJLyogSW50ZXJzaWwgUFJJU00gSW5kaWdvIFdpcmVsZXNzIExBTiBhZGFwdGVyICovCisJeworCSAweDEyNjAsIDB4Mzg3NywKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKKwkgMCwgMCwgMAorCX0sCisKKwkvKiBJbnRlcnNpbCBQUklTTSBKYXZlbGluL1hib3cgV2lyZWxlc3MgTEFOIGFkYXB0ZXIgKi8KKwl7CisJIDB4MTI2MCwgMHgzODg2LAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAorCSAwLCAwLCAwCisJfSwKKworCS8qIEVuZCBvZiBsaXN0ICovCisJezAsMCwwLDAsMCwwLDB9Cit9OworCisvKiByZWdpc3RlciB0aGUgZGV2aWNlIHdpdGggdGhlIEhvdHBsdWcgZmFjaWxpdGllcyBvZiB0aGUga2VybmVsICovCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcHJpc201NF9pZF90YmwpOworCitzdGF0aWMgaW50IHByaXNtNTRfcHJvYmUoc3RydWN0IHBjaV9kZXYgKiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKik7CitzdGF0aWMgdm9pZCBwcmlzbTU0X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqKTsKK3N0YXRpYyBpbnQgcHJpc201NF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICosIHUzMiBzdGF0ZSk7CitzdGF0aWMgaW50IHByaXNtNTRfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICopOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcHJpc201NF9kcml2ZXIgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUgPSBwcmlzbTU0X2lkX3RibCwKKwkucHJvYmUgPSBwcmlzbTU0X3Byb2JlLAorCS5yZW1vdmUgPSBwcmlzbTU0X3JlbW92ZSwKKwkuc3VzcGVuZCA9IHByaXNtNTRfc3VzcGVuZCwKKwkucmVzdW1lID0gcHJpc201NF9yZXN1bWUsCisJLyogLmVuYWJsZV93YWtlIDsgd2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIHlldCAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIE1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50CitwcmlzbTU0X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJdTggbGF0ZW5jeV90bXI7CisJdTMyIG1lbV9hZGRyOworCWlzbHBjaV9wcml2YXRlICpwcml2OworCWludCBydmFsdWU7CisKKwkvKiBFbmFibGUgdGhlIHBjaSBkZXZpY2UgKi8KKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcGNpX2VuYWJsZV9kZXZpY2UoKSBmYWlsZWQuXG4iLCBEUlZfTkFNRSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIGNoZWNrIHdoZXRoZXIgdGhlIGxhdGVuY3kgdGltZXIgaXMgc2V0IGNvcnJlY3RseSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAmbGF0ZW5jeV90bXIpOworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJREVCVUcoU0hPV19UUkFDSU5HLCAibGF0ZW5jeSB0aW1lcjogJXhcbiIsIGxhdGVuY3lfdG1yKTsKKyNlbmRpZgorCWlmIChsYXRlbmN5X3RtciA8IFBDSURFVklDRV9MQVRFTkNZX1RJTUVSX01JTikgeworCQkvKiBzZXQgdGhlIGxhdGVuY3kgdGltZXIgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLAorCQkJCSAgICAgIFBDSURFVklDRV9MQVRFTkNZX1RJTUVSX1ZBTCk7CisJfQorCisJLyogZW5hYmxlIFBDSSBETUEgKi8KKwlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiAzMi1iaXQgUENJIERNQSBub3Qgc3VwcG9ydGVkIiwgRFJWX05BTUUpOworCQlnb3RvIGRvX3BjaV9kaXNhYmxlX2RldmljZTsKKyAgICAgICAgfQorCisJLyogMHg0MCBpcyB0aGUgcHJvZ3JhbW1hYmxlIHRpbWVyIHRvIGNvbmZpZ3VyZSB0aGUgcmVzcG9uc2UgdGltZW91dCAoVFJEWV9USU1FT1VUKQorCSAqIDB4NDEgaXMgdGhlIHByb2dyYW1tYWJsZSB0aW1lciB0byBjb25maWd1cmUgdGhlIHJldHJ5IHRpbWVvdXQgKFJFVFJZX1RJTUVPVVQpCisJICogCVRoZSBSRVRSWV9USU1FT1VUIGlzIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgcmV0cmllcyB0aGF0IHRoZSBjb3JlLCBhcyBhCisJICogCU1hc3Rlciwgd2lsbCBwZXJmb3JtIGJlZm9yZSBhYmFuZG9uaW5nIGEgY3ljbGUuIFRoZSBkZWZhdWx0IHZhbHVlIGZvcgorCSAqIAlSRVRSWV9USU1FT1VUIGlzIDB4ODAsIHdoaWNoIGZhciBleGNlZWRzIHRoZSBQQ0kgMi4xIHJlcXVpcmVtZW50IGZvciBuZXcKKwkgKiAJZGV2aWNlcy4gQSB3cml0ZSBvZiB6ZXJvIHRvIHRoZSBSRVRSWV9USU1FT1VUIHJlZ2lzdGVyIGRpc2FibGVzIHRoaXMKKwkgKiAJZnVuY3Rpb24gdG8gYWxsb3cgdXNlIHdpdGggYW55IG5vbi1jb21wbGlhbnQgbGVnYWN5IGRldmljZXMgdGhhdCBtYXkKKwkgKiAJZXhlY3V0ZSBtb3JlIHJldHJpZXMuCisJICoKKwkgKiAJV3JpdGluZyB6ZXJvIHRvIGJvdGggdGhlc2UgdHdvIHJlZ2lzdGVycyB3aWxsIGRpc2FibGUgYm90aCB0aW1lb3V0cyBhbmQKKwkgKiAJKmNhbiogc29sdmUgcHJvYmxlbXMgY2F1c2VkIGJ5IGRldmljZXMgdGhhdCBhcmUgc2xvdyB0byByZXNwb25kLgorCSAqCU1ha2UgdGhpcyBjb25maWd1cmFibGUgLSBNU1cKKwkgKi8KKwlpZiAoIGluaXRfcGNpdG0gPj0gMCApIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDAsICh1OClpbml0X3BjaXRtKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDEsICh1OClpbml0X3BjaXRtKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJQQ0kgVFJEWS9SRVRSWSB1bmNoYW5nZWRcbiIpOworCX0KKworCS8qIHJlcXVlc3QgdGhlIHBjaSBkZXZpY2UgSS9PIHJlZ2lvbnMgKi8KKwlydmFsdWUgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocnZhbHVlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBjaV9yZXF1ZXN0X3JlZ2lvbnMgZmFpbHVyZSAocmM9JWQpXG4iLAorCQkgICAgICAgRFJWX05BTUUsIHJ2YWx1ZSk7CisJCWdvdG8gZG9fcGNpX2Rpc2FibGVfZGV2aWNlOworCX0KKworCS8qIGNoZWNrIGlmIHRoZSBtZW1vcnkgd2luZG93IGlzIGluZGVlZCBzZXQgKi8KKwlydmFsdWUgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX0JBU0VfQUREUkVTU18wLCAmbWVtX2FkZHIpOworCWlmIChydmFsdWUgfHwgIW1lbV9hZGRyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSBkZXZpY2UgbWVtb3J5IHJlZ2lvbiBub3QgY29uZmlndXJlZDsgZml4IHlvdXIgQklPUyBvciBDYXJkQnVzIGJyaWRnZS9kcml2ZXJzXG4iLAorCQkgICAgICAgRFJWX05BTUUpOworCQlnb3RvIGRvX3BjaV9yZWxlYXNlX3JlZ2lvbnM7CisJfQorCisJLyogZW5hYmxlIFBDSSBidXMtbWFzdGVyaW5nICovCisJREVCVUcoU0hPV19UUkFDSU5HLCAiJXM6IHBjaV9zZXRfbWFzdGVyKHBkZXYpXG4iLCBEUlZfTkFNRSk7CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwkvKiBlbmFibGUgTVdJICovCisJcGNpX3NldF9td2kocGRldik7CisKKwkvKiBzZXR1cCB0aGUgbmV0d29yayBkZXZpY2UgaW50ZXJmYWNlIGFuZCBpdHMgc3RydWN0dXJlICovCisJaWYgKCEobmRldiA9IGlzbHBjaV9zZXR1cChwZGV2KSkpIHsKKwkJLyogZXJyb3IgY29uZmlndXJpbmcgdGhlIGRyaXZlciBhcyBhIG5ldHdvcmsgZGV2aWNlICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBjb25maWd1cmUgbmV0d29yayBkZXZpY2VcbiIsCisJCSAgICAgICBEUlZfTkFNRSk7CisJCWdvdG8gZG9fcGNpX3JlbGVhc2VfcmVnaW9uczsKKwl9CisKKwlwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaXNscGNpX3NldF9zdGF0ZShwcml2LCBQUlZfU1RBVEVfUFJFQk9PVCk7IC8qIHdlIGFyZSBhdHRlbXB0aW5nIHRvIGJvb3QgKi8KKworCS8qIGNhcmQgaXMgaW4gdW5rbm93biBzdGF0ZSB5ZXQsIG1pZ2h0IGhhdmUgc29tZSBpbnRlcnJ1cHRzIHBlbmRpbmcgKi8KKwlpc2wzOHh4X2Rpc2FibGVfaW50ZXJydXB0cyhwcml2LT5kZXZpY2VfYmFzZSk7CisKKwkvKiByZXF1ZXN0IGZvciB0aGUgaW50ZXJydXB0IGJlZm9yZSB1cGxvYWRpbmcgdGhlIGZpcm13YXJlICovCisJcnZhbHVlID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCAmaXNscGNpX2ludGVycnVwdCwKKwkJCSAgICAgU0FfU0hJUlEsIG5kZXYtPm5hbWUsIHByaXYpOworCisJaWYgKHJ2YWx1ZSkgeworCQkvKiBlcnJvciwgY291bGQgbm90IGhvb2sgdGhlIGhhbmRsZXIgdG8gdGhlIGlycSAqLworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZCBub3QgaW5zdGFsbCBJUlEgaGFuZGxlclxuIiwKKwkJICAgICAgIG5kZXYtPm5hbWUpOworCQlnb3RvIGRvX3VucmVnaXN0ZXJfbmV0ZGV2OworCX0KKworCS8qIGZpcm13YXJlIHVwbG9hZCBpcyB0cmlnZ2VyZWQgaW4gaXNscGNpX29wZW4gKi8KKworCXJldHVybiAwOworCisgICAgICBkb191bnJlZ2lzdGVyX25ldGRldjoKKwl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKKwlpc2xwY2lfZnJlZV9tZW1vcnkocHJpdik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfbmV0ZGV2KG5kZXYpOworCXByaXYgPSBOVUxMOworICAgICAgZG9fcGNpX3JlbGVhc2VfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworICAgICAgZG9fcGNpX2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyogc2V0IGJ5IGNsZWFudXBfbW9kdWxlICovCitzdGF0aWMgdm9sYXRpbGUgaW50IF9faW5fY2xlYW51cF9tb2R1bGUgPSAwOworCisvKiB0aGlzIG9uZSByZW1vdmVzIG9uZSghISkgaW5zdGFuY2Ugb25seSAqLwordm9pZAorcHJpc201NF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZGV2ID8gbmV0ZGV2X3ByaXYobmRldikgOiBOVUxMOworCUJVR19PTighcHJpdik7CisKKwlpZiAoIV9faW5fY2xlYW51cF9tb2R1bGUpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBob3QgdW5wbHVnIGRldGVjdGVkXG4iLCBuZGV2LT5uYW1lKTsKKwkJaXNscGNpX3NldF9zdGF0ZShwcml2LCBQUlZfU1RBVEVfT0ZGKTsKKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlbW92aW5nIGRldmljZVxuIiwgbmRldi0+bmFtZSk7CisKKwl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKKworCS8qIGZyZWUgdGhlIGludGVycnVwdCByZXF1ZXN0ICovCisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSAhPSBQUlZfU1RBVEVfT0ZGKSB7CisJCWlzbDM4eHhfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYtPmRldmljZV9iYXNlKTsKKwkJaXNscGNpX3NldF9zdGF0ZShwcml2LCBQUlZfU1RBVEVfT0ZGKTsKKwkJLyogVGhpcyBiZWxsb3cgY2F1c2VzIGEgbG9ja3VwIGF0IHJtbW9kIHRpbWUuIEl0IG1pZ2h0IGJlCisJCSAqIGJlY2F1c2Ugc29tZSBpbnRlcnJ1cHRzIHN0aWxsIGxpbmdlciBhZnRlciBybW1vZCB0aW1lLCAKKwkJICogc2VlIGJ1ZyAjMTcgKi8KKwkJLyogcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCAzKTsqLwkvKiB0cnkgdG8gcG93ZXItb2ZmICovCisJfQorCisJZnJlZV9pcnEocGRldi0+aXJxLCBwcml2KTsKKworCS8qIGZyZWUgdGhlIFBDSSBtZW1vcnkgYW5kIHVubWFwIHRoZSByZW1hcHBlZCBwYWdlICovCisJaXNscGNpX2ZyZWVfbWVtb3J5KHByaXYpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfbmV0ZGV2KG5kZXYpOworCXByaXYgPSBOVUxMOworCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK30KKworaW50CitwcmlzbTU0X3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5kZXYgPyBuZXRkZXZfcHJpdihuZGV2KSA6IE5VTEw7CisJQlVHX09OKCFwcml2KTsKKworCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGdvdCBzdXNwZW5kIHJlcXVlc3QgKHN0YXRlICVkKVxuIiwKKwkgICAgICAgbmRldi0+bmFtZSwgc3RhdGUpOworCisJcGNpX3NhdmVfc3RhdGUocGRldik7CisKKwkvKiB0ZWxsIHRoZSBkZXZpY2Ugbm90IHRvIHRyaWdnZXIgaW50ZXJydXB0cyBmb3Igbm93Li4uICovCisJaXNsMzh4eF9kaXNhYmxlX2ludGVycnVwdHMocHJpdi0+ZGV2aWNlX2Jhc2UpOworCisJLyogZnJvbSBub3cgb24gYXNzdW1lIHRoZSBoYXJkd2FyZSB3YXMgYWxyZWFkeSBwb3dlcmVkIGRvd24KKwkgICBhbmQgZG9uJ3QgdG91Y2ggaXQgYW55bW9yZSAqLworCWlzbHBjaV9zZXRfc3RhdGUocHJpdiwgUFJWX1NUQVRFX09GRik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCW5ldGlmX2RldmljZV9kZXRhY2gobmRldik7CisKKwlyZXR1cm4gMDsKK30KKworaW50CitwcmlzbTU0X3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5kZXYgPyBuZXRkZXZfcHJpdihuZGV2KSA6IE5VTEw7CisJQlVHX09OKCFwcml2KTsKKworCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogZ290IHJlc3VtZSByZXF1ZXN0XG4iLCBuZGV2LT5uYW1lKTsKKworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJLyogYWxyaWdodCBsZXQncyBnbyBpbnRvIHRoZSBQUkVCT09UIHN0YXRlICovCisJaXNscGNpX3Jlc2V0KHByaXYsIDEpOworCisJbmV0aWZfZGV2aWNlX2F0dGFjaChuZGV2KTsKKwluZXRpZl9zdGFydF9xdWV1ZShuZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdAorcHJpc201NF9tb2R1bGVfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIkxvYWRlZCAlcyBkcml2ZXIsIHZlcnNpb24gJXNcbiIsCisJICAgICAgIERSVl9OQU1FLCBEUlZfVkVSU0lPTik7CisKKwlfX2J1Z19vbl93cm9uZ19zdHJ1Y3Rfc2l6ZXMgKCk7CisKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZwcmlzbTU0X2RyaXZlcik7Cit9CisKKy8qIGJ5IHRoZSB0aW1lIHByaXNtNTRfbW9kdWxlX2V4aXQoKSB0ZXJtaW5hdGVzLCBhcyBhIHBvc3Rjb25kaXRpb24KKyAqIGFsbCBpbnN0YW5jZXMgd2lsbCBoYXZlIGJlZW4gZGVzdHJveWVkIGJ5IGNhbGxzIHRvCisgKiBwcmlzbTU0X3JlbW92ZSgpICovCitzdGF0aWMgdm9pZCBfX2V4aXQKK3ByaXNtNTRfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlfX2luX2NsZWFudXBfbW9kdWxlID0gMTsKKworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcHJpc201NF9kcml2ZXIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiVW5sb2FkZWQgJXMgZHJpdmVyXG4iLCBEUlZfTkFNRSk7CisKKwlfX2luX2NsZWFudXBfbW9kdWxlID0gMDsKK30KKworLyogcmVnaXN0ZXIgZW50cnkgcG9pbnRzICovCittb2R1bGVfaW5pdChwcmlzbTU0X21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KHByaXNtNTRfbW9kdWxlX2V4aXQpOworLyogRU9GICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9tZ3QuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZjJlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9tZ3QuYwpAQCAtMCwwICsxLDUxMyBAQAorLyoKKyAqICAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLgorICogIENvcHlyaWdodCAyMDA0IEplbnMgTWF1cmVyIDxKZW5zLk1hdXJlckBnbXgubmV0PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisKKyNpbmNsdWRlICJwcmlzbWNvbXBhdC5oIgorI2luY2x1ZGUgImlzbF8zOHh4LmgiCisjaW5jbHVkZSAiaXNscGNpX21ndC5oIgorI2luY2x1ZGUgImlzbF9vaWQuaCIJCS8qIGFkZGl0aW9uYWwgdHlwZXMgYW5kIGRlZnMgZm9yIGlzbDM4eHggZncgKi8KKyNpbmNsdWRlICJpc2xfaW9jdGwuaCIKKworI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgR2xvYmFsIHZhcmlhYmxlIGRlZmluaXRpb24gc2VjdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHBjX2RlYnVnID0gVkVSQk9TRTsKK21vZHVsZV9wYXJhbShwY19kZWJ1ZywgaW50LCAwKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIERyaXZlciBnZW5lcmFsIGZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCit2b2lkCitkaXNwbGF5X2J1ZmZlcihjaGFyICpidWZmZXIsIGludCBsZW5ndGgpCit7CisJaWYgKChwY19kZWJ1ZyAmIFNIT1dfQlVGRkVSX0NPTlRFTlRTKSA9PSAwKQorCQlyZXR1cm47CisKKwl3aGlsZSAobGVuZ3RoID4gMCkgeworCQlwcmludGsoIlslMDJ4XSIsICpidWZmZXIgJiAyNTUpOworCQlsZW5ndGgtLTsKKwkJYnVmZmVyKys7CisJfQorCisJcHJpbnRrKCJcbiIpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIFF1ZXVlIGhhbmRsaW5nIGZvciBtYW5hZ2VtZW50IGZyYW1lcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIFBJTUZPUiBtYW5hZ2VtZW50IGZyYW1lIGhlYWRlci4KKyAqLworc3RhdGljIHZvaWQKK3BpbWZvcl9lbmNvZGVfaGVhZGVyKGludCBvcGVyYXRpb24sIHUzMiBvaWQsIHUzMiBsZW5ndGgsIHBpbWZvcl9oZWFkZXJfdCAqaCkKK3sKKwloLT52ZXJzaW9uID0gUElNRk9SX1ZFUlNJT047CisJaC0+b3BlcmF0aW9uID0gb3BlcmF0aW9uOworCWgtPmRldmljZV9pZCA9IFBJTUZPUl9ERVZfSURfTUhMSV9NSUI7CisJaC0+ZmxhZ3MgPSAwOworCWgtPm9pZCA9IGNwdV90b19iZTMyKG9pZCk7CisJaC0+bGVuZ3RoID0gY3B1X3RvX2JlMzIobGVuZ3RoKTsKK30KKworLyoKKyAqIEhlbHBlciBmdW5jdGlvbiB0byBhbmFseXplIGEgUElNRk9SIG1hbmFnZW1lbnQgZnJhbWUgaGVhZGVyLgorICovCitzdGF0aWMgcGltZm9yX2hlYWRlcl90ICoKK3BpbWZvcl9kZWNvZGVfaGVhZGVyKHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJcGltZm9yX2hlYWRlcl90ICpoID0gZGF0YTsKKworCXdoaWxlICgodm9pZCAqKSBoIDwgZGF0YSArIGxlbikgeworCQlpZiAoaC0+ZmxhZ3MgJiBQSU1GT1JfRkxBR19MSVRUTEVfRU5ESUFOKSB7CisJCQlsZTMyX3RvX2NwdXMoJmgtPm9pZCk7CisJCQlsZTMyX3RvX2NwdXMoJmgtPmxlbmd0aCk7CisJCX0gZWxzZSB7CisJCQliZTMyX3RvX2NwdXMoJmgtPm9pZCk7CisJCQliZTMyX3RvX2NwdXMoJmgtPmxlbmd0aCk7CisJCX0KKwkJaWYgKGgtPm9pZCAhPSBPSURfSU5MX1RVTk5FTCkKKwkJCXJldHVybiBoOworCQloKys7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogRmlsbCB0aGUgcmVjZWl2ZSBxdWV1ZSBmb3IgbWFuYWdlbWVudCBmcmFtZXMgd2l0aCBmcmVzaCBidWZmZXJzLgorICovCitpbnQKK2lzbHBjaV9tZ210X3J4X2ZpbGwoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKmNiID0JLyogdm9sYXRpbGUgbm90IG5lZWRlZCAqLworCSAgICAoaXNsMzh4eF9jb250cm9sX2Jsb2NrICopIHByaXYtPmNvbnRyb2xfYmxvY2s7CisJdTMyIGN1cnIgPSBsZTMyX3RvX2NwdShjYi0+ZHJpdmVyX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1JYX01HTVRRXSk7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCURFQlVHKFNIT1dfRlVOQ1RJT05fQ0FMTFMsICJpc2xwY2lfbWdtdF9yeF9maWxsIFxuIik7CisjZW5kaWYKKworCXdoaWxlIChjdXJyIC0gcHJpdi0+aW5kZXhfbWdtdF9yeCA8IElTTDM4WFhfQ0JfTUdNVF9RU0laRSkgeworCQl1MzIgaW5kZXggPSBjdXJyICUgSVNMMzhYWF9DQl9NR01UX1FTSVpFOworCQlzdHJ1Y3QgaXNscGNpX21lbWJ1ZiAqYnVmID0gJnByaXYtPm1nbXRfcnhbaW5kZXhdOworCQlpc2wzOHh4X2ZyYWdtZW50ICpmcmFnID0gJmNiLT5yeF9kYXRhX21nbXRbaW5kZXhdOworCisJCWlmIChidWYtPm1lbSA9PSBOVUxMKSB7CisJCQlidWYtPm1lbSA9IGttYWxsb2MoTUdNVF9GUkFNRV9TSVpFLCBHRlBfQVRPTUlDKTsKKwkJCWlmICghYnVmLT5tZW0pIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJFcnJvciBhbGxvY2F0aW5nIG1hbmFnZW1lbnQgZnJhbWUuXG4iKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWJ1Zi0+c2l6ZSA9IE1HTVRfRlJBTUVfU0laRTsKKwkJfQorCQlpZiAoYnVmLT5wY2lfYWRkciA9PSAwKSB7CisJCQlidWYtPnBjaV9hZGRyID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGRldiwgYnVmLT5tZW0sCisJCQkJCQkgICAgICAgTUdNVF9GUkFNRV9TSVpFLAorCQkJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlpZiAoIWJ1Zi0+cGNpX2FkZHIpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJGYWlsZWQgdG8gbWFrZSBtZW1vcnkgRE1BJ2FibGVcbi4iKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJfQorCisJCS8qIGJlIHNhZmU6IGFsd2F5cyByZXNldCBjb250cm9sIGJsb2NrIGluZm9ybWF0aW9uICovCisJCWZyYWctPnNpemUgPSBjcHVfdG9fbGUxNihNR01UX0ZSQU1FX1NJWkUpOworCQlmcmFnLT5mbGFncyA9IDA7CisJCWZyYWctPmFkZHJlc3MgPSBjcHVfdG9fbGUzMihidWYtPnBjaV9hZGRyKTsKKwkJY3VycisrOworCisJCS8qIFRoZSBmcmFnbWVudCBhZGRyZXNzIGluIHRoZSBjb250cm9sIGJsb2NrIG11c3QgaGF2ZQorCQkgKiBiZWVuIHdyaXR0ZW4gYmVmb3JlIGFubm91bmNpbmcgdGhlIGZyYW1lIGJ1ZmZlciB0bworCQkgKiBkZXZpY2UgKi8KKwkJd21iKCk7CisJCWNiLT5kcml2ZXJfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfUlhfTUdNVFFdID0gY3B1X3RvX2xlMzIoY3Vycik7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogQ3JlYXRlIGFuZCB0cmFuc21pdCBhIG1hbmFnZW1lbnQgZnJhbWUgdXNpbmcgIm9wZXJhdGlvbiIgYW5kICJvaWQiLAorICogd2l0aCBhcmd1bWVudHMgZGF0YS9sZW5ndGguCisgKiBXZSBlaXRoZXIgcmV0dXJuIGFuIGVycm9yIGFuZCBmcmVlIHRoZSBmcmFtZSwgb3Igd2UgcmV0dXJuIDAgYW5kCisgKiBpc2xwY2lfbWd0X2NsZWFudXBfdHJhbnNtaXQoKSBmcmVlcyB0aGUgZnJhbWUgaW4gdGhlIHR4LWRvbmUKKyAqIGludGVycnVwdC4KKyAqLworc3RhdGljIGludAoraXNscGNpX21ndF90cmFuc21pdChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgaW50IG9wZXJhdGlvbiwgdW5zaWduZWQgbG9uZyBvaWQsCisJCSAgICB2b2lkICpkYXRhLCBpbnQgbGVuZ3RoKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaXNsMzh4eF9jb250cm9sX2Jsb2NrICpjYiA9CisJICAgIChpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKikgcHJpdi0+Y29udHJvbF9ibG9jazsKKwl2b2lkICpwOworCWludCBlcnIgPSAtRUlOVkFMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaXNsMzh4eF9mcmFnbWVudCAqZnJhZzsKKwlzdHJ1Y3QgaXNscGNpX21lbWJ1ZiBidWY7CisJdTMyIGN1cnJfZnJhZzsKKwlpbnQgaW5kZXg7CisJaW50IGZyYWdfbGVuID0gbGVuZ3RoICsgUElNRk9SX0hFQURFUl9TSVpFOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX0ZVTkNUSU9OX0NBTExTLCAiaXNscGNpX21ndF90cmFuc21pdFxuIik7CisjZW5kaWYKKworCWlmIChmcmFnX2xlbiA+IE1HTVRfRlJBTUVfU0laRSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG1nbXQgZnJhbWUgdG9vIGxhcmdlICVkXG4iLAorCQkgICAgICAgbmRldi0+bmFtZSwgZnJhZ19sZW4pOworCQlnb3RvIGVycm9yOworCX0KKworCWVyciA9IC1FTk9NRU07CisJcCA9IGJ1Zi5tZW0gPSBrbWFsbG9jKGZyYWdfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1Zi5tZW0pIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjYW5ub3QgYWxsb2NhdGUgbWdtdCBmcmFtZVxuIiwKKwkJICAgICAgIG5kZXYtPm5hbWUpOworCQlnb3RvIGVycm9yOworCX0KKwlidWYuc2l6ZSA9IGZyYWdfbGVuOworCisJLyogY3JlYXRlIHRoZSBoZWFkZXIgZGlyZWN0bHkgaW4gdGhlIGZyYWdtZW50IGRhdGEgYXJlYSAqLworCXBpbWZvcl9lbmNvZGVfaGVhZGVyKG9wZXJhdGlvbiwgb2lkLCBsZW5ndGgsIChwaW1mb3JfaGVhZGVyX3QgKikgcCk7CisJcCArPSBQSU1GT1JfSEVBREVSX1NJWkU7CisKKwlpZiAoZGF0YSkKKwkJbWVtY3B5KHAsIGRhdGEsIGxlbmd0aCk7CisJZWxzZQorCQltZW1zZXQocCwgMCwgbGVuZ3RoKTsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJeworCQlwaW1mb3JfaGVhZGVyX3QgKmggPSBidWYubWVtOworCQlERUJVRyhTSE9XX1BJTUZPUl9GUkFNRVMsCisJCSAgICAgICJQSU1GT1I6IG9wICVpLCBvaWQgMHglMDhseCwgZGV2aWNlICVpLCBmbGFncyAweCV4IGxlbmd0aCAweCV4IFxuIiwKKwkJICAgICAgaC0+b3BlcmF0aW9uLCBvaWQsIGgtPmRldmljZV9pZCwgaC0+ZmxhZ3MsIGxlbmd0aCk7CisKKwkJLyogZGlzcGxheSB0aGUgYnVmZmVyIGNvbnRlbnRzIGZvciBkZWJ1Z2dpbmcgKi8KKwkJZGlzcGxheV9idWZmZXIoKGNoYXIgKikgaCwgc2l6ZW9mIChwaW1mb3JfaGVhZGVyX3QpKTsKKwkJZGlzcGxheV9idWZmZXIocCwgbGVuZ3RoKTsKKwl9CisjZW5kaWYKKworCWVyciA9IC1FTk9NRU07CisJYnVmLnBjaV9hZGRyID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGRldiwgYnVmLm1lbSwgZnJhZ19sZW4sCisJCQkJICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisJaWYgKCFidWYucGNpX2FkZHIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNhbm5vdCBtYXAgUENJIG1lbW9yeSBmb3IgbWdtdFxuIiwKKwkJICAgICAgIG5kZXYtPm5hbWUpOworCQlnb3RvIGVycm9yX2ZyZWU7CisJfQorCisJLyogUHJvdGVjdCB0aGUgY29udHJvbCBibG9jayBtb2RpZmljYXRpb25zIGFnYWluc3QgaW50ZXJydXB0cy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c2xvY2ssIGZsYWdzKTsKKwljdXJyX2ZyYWcgPSBsZTMyX3RvX2NwdShjYi0+ZHJpdmVyX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1RYX01HTVRRXSk7CisJaWYgKGN1cnJfZnJhZyAtIHByaXYtPmluZGV4X21nbXRfdHggPj0gSVNMMzhYWF9DQl9NR01UX1FTSVpFKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBtZ210IHR4IHF1ZXVlIGlzIHN0aWxsIGZ1bGxcbiIsCisJCSAgICAgICBuZGV2LT5uYW1lKTsKKwkJZ290byBlcnJvcl91bmxvY2s7CisJfQorCisJLyogY29tbWl0IHRoZSBmcmFtZSB0byB0aGUgdHggZGV2aWNlIHF1ZXVlICovCisJaW5kZXggPSBjdXJyX2ZyYWcgJSBJU0wzOFhYX0NCX01HTVRfUVNJWkU7CisJcHJpdi0+bWdtdF90eFtpbmRleF0gPSBidWY7CisJZnJhZyA9ICZjYi0+dHhfZGF0YV9tZ210W2luZGV4XTsKKwlmcmFnLT5zaXplID0gY3B1X3RvX2xlMTYoZnJhZ19sZW4pOworCWZyYWctPmZsYWdzID0gMDsJLyogZm9yIGFueSBvdGhlciB0aGFuIHRoZSBsYXN0IGZyYWdtZW50LCBzZXQgdG8gMSAqLworCWZyYWctPmFkZHJlc3MgPSBjcHVfdG9fbGUzMihidWYucGNpX2FkZHIpOworCisJLyogVGhlIGZyYWdtZW50IGFkZHJlc3MgaW4gdGhlIGNvbnRyb2wgYmxvY2sgbXVzdCBoYXZlCisJICogYmVlbiB3cml0dGVuIGJlZm9yZSBhbm5vdW5jaW5nIHRoZSBmcmFtZSBidWZmZXIgdG8KKwkgKiBkZXZpY2UgKi8KKwl3bWIoKTsKKwljYi0+ZHJpdmVyX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1RYX01HTVRRXSA9IGNwdV90b19sZTMyKGN1cnJfZnJhZyArIDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNsb2NrLCBmbGFncyk7CisKKwkvKiB0cmlnZ2VyIHRoZSBkZXZpY2UgKi8KKwlpc2xwY2lfdHJpZ2dlcihwcml2KTsKKwlyZXR1cm4gMDsKKworICAgICAgZXJyb3JfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNsb2NrLCBmbGFncyk7CisgICAgICBlcnJvcl9mcmVlOgorCWtmcmVlKGJ1Zi5tZW0pOworICAgICAgZXJyb3I6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFJlY2VpdmUgYSBtYW5hZ2VtZW50IGZyYW1lIGZyb20gdGhlIGRldmljZS4KKyAqIFRoaXMgY2FuIGJlIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgdHJhcHMsIGFuZCBhdCBtb3N0IG9uZSByZXNwb25zZQorICogZnJhbWUgZm9yIGEgcHJldmlvdXMgcmVxdWVzdCBzZW50IHZpYSBpc2xwY2lfbWd0X3RyYW5zbWl0KCkuCisgKi8KK2ludAoraXNscGNpX21ndF9yZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaXNsMzh4eF9jb250cm9sX2Jsb2NrICpjYiA9CisJICAgIChpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKikgcHJpdi0+Y29udHJvbF9ibG9jazsKKwl1MzIgY3Vycl9mcmFnOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX0ZVTkNUSU9OX0NBTExTLCAiaXNscGNpX21ndF9yZWNlaXZlIFxuIik7CisjZW5kaWYKKworCS8qIE9ubHkgb25jZSBwZXIgaW50ZXJydXB0LCBkZXRlcm1pbmUgZnJhZ21lbnQgcmFuZ2UgdG8KKwkgKiBwcm9jZXNzLiAgVGhpcyBhdm9pZHMgYW4gZW5kbGVzcyBsb29wIChpLmUuIGxvY2t1cCkgaWYKKwkgKiBmcmFtZXMgY29tZSBpbiBmYXN0ZXIgdGhhbiB3ZSBjYW4gcHJvY2VzcyB0aGVtLiAqLworCWN1cnJfZnJhZyA9IGxlMzJfdG9fY3B1KGNiLT5kZXZpY2VfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfUlhfTUdNVFFdKTsKKwliYXJyaWVyKCk7CisKKwlmb3IgKDsgcHJpdi0+aW5kZXhfbWdtdF9yeCA8IGN1cnJfZnJhZzsgcHJpdi0+aW5kZXhfbWdtdF9yeCsrKSB7CisJCXBpbWZvcl9oZWFkZXJfdCAqaGVhZGVyOworCQl1MzIgaW5kZXggPSBwcml2LT5pbmRleF9tZ210X3J4ICUgSVNMMzhYWF9DQl9NR01UX1FTSVpFOworCQlzdHJ1Y3QgaXNscGNpX21lbWJ1ZiAqYnVmID0gJnByaXYtPm1nbXRfcnhbaW5kZXhdOworCQl1MTYgZnJhZ19sZW47CisJCWludCBzaXplOworCQlzdHJ1Y3QgaXNscGNpX21nbXRmcmFtZSAqZnJhbWU7CisKKwkJLyogSSBoYXZlIG5vIGlkZWEgKGFuZCBubyBkb2N1bWVudGF0aW9uKSBpZiBmbGFncyAhPSAwCisJCSAqIGlzIHBvc3NpYmxlLiAgRHJvcCB0aGUgZnJhbWUsIHJldXNlIHRoZSBidWZmZXIuICovCisJCWlmIChsZTE2X3RvX2NwdShjYi0+cnhfZGF0YV9tZ210W2luZGV4XS5mbGFncykgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVua25vd24gZmxhZ3MgMHglMDR4XG4iLAorCQkJICAgICAgIG5kZXYtPm5hbWUsCisJCQkgICAgICAgbGUxNl90b19jcHUoY2ItPnJ4X2RhdGFfbWdtdFtpbmRleF0uZmxhZ3MpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogVGhlIGRldmljZSBvbmx5IHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGhlYWRlcihzKSBoZXJlLiAqLworCQlmcmFnX2xlbiA9IGxlMTZfdG9fY3B1KGNiLT5yeF9kYXRhX21nbXRbaW5kZXhdLnNpemUpOworCisJCS8qCisJCSAqIFdlIGFwcGVhciB0byBoYXZlIG5vIHdheSB0byB0ZWxsIHRoZSBkZXZpY2UgdGhlCisJCSAqIHNpemUgb2YgYSByZWNlaXZlIGJ1ZmZlci4gIFRodXMsIGlmIHRoaXMgY2hlY2sKKwkJICogdHJpZ2dlcnMsIHdlIGxpa2VseSBoYXZlIGtlcm5lbCBoZWFwIGNvcnJ1cHRpb24uICovCisJCWlmIChmcmFnX2xlbiA+IE1HTVRfRlJBTUVfU0laRSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSIlczogQm9ndXMgcGFja2V0IHNpemUgb2YgJWQgKCUjeCkuXG4iLAorCQkJCW5kZXYtPm5hbWUsIGZyYWdfbGVuLCBmcmFnX2xlbik7CisJCQlmcmFnX2xlbiA9IE1HTVRfRlJBTUVfU0laRTsKKwkJfQorCisJCS8qIEVuc3VyZSB0aGUgcmVzdWx0cyBvZiBkZXZpY2UgRE1BIGFyZSB2aXNpYmxlIHRvIHRoZSBDUFUuICovCisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShwcml2LT5wZGV2LCBidWYtPnBjaV9hZGRyLAorCQkJCQkgICAgYnVmLT5zaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCS8qIFBlcmZvcm0gZW5kaWFuZXNzIGNvbnZlcnNpb24gZm9yIFBJTUZPUiBoZWFkZXIgaW4tcGxhY2UuICovCisJCWhlYWRlciA9IHBpbWZvcl9kZWNvZGVfaGVhZGVyKGJ1Zi0+bWVtLCBmcmFnX2xlbik7CisJCWlmICghaGVhZGVyKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbm8gUElNRk9SIGhlYWRlciBmb3VuZFxuIiwKKwkJCSAgICAgICBuZGV2LT5uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogVGhlIGRldmljZSBJRCBmcm9tIHRoZSBQSU1GT1IgcGFja2V0IHJlY2VpdmVkIGZyb20KKwkJICogdGhlIE1WQyBpcyBhbHdheXMgMC4gIFdlIGZvcndhcmQgYSBzZW5zaWJsZSBkZXZpY2VfaWQuCisJCSAqIE5vdCB0aGF0IGFueW9uZSB1cHN0cmVhbSB3b3VsZCBjYXJlLi4uICovCisJCWhlYWRlci0+ZGV2aWNlX2lkID0gcHJpdi0+bmRldi0+aWZpbmRleDsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCURFQlVHKFNIT1dfUElNRk9SX0ZSQU1FUywKKwkJICAgICAgIlBJTUZPUjogb3AgJWksIG9pZCAweCUwOHgsIGRldmljZSAlaSwgZmxhZ3MgMHgleCBsZW5ndGggMHgleCBcbiIsCisJCSAgICAgIGhlYWRlci0+b3BlcmF0aW9uLCBoZWFkZXItPm9pZCwgaGVhZGVyLT5kZXZpY2VfaWQsCisJCSAgICAgIGhlYWRlci0+ZmxhZ3MsIGhlYWRlci0+bGVuZ3RoKTsKKworCQkvKiBkaXNwbGF5IHRoZSBidWZmZXIgY29udGVudHMgZm9yIGRlYnVnZ2luZyAqLworCQlkaXNwbGF5X2J1ZmZlcigoY2hhciAqKSBoZWFkZXIsIFBJTUZPUl9IRUFERVJfU0laRSk7CisJCWRpc3BsYXlfYnVmZmVyKChjaGFyICopIGhlYWRlciArIFBJTUZPUl9IRUFERVJfU0laRSwKKwkJCSAgICAgICBoZWFkZXItPmxlbmd0aCk7CisjZW5kaWYKKworCQkvKiBub2JvZHkgc2VuZHMgdGhlc2UgKi8KKwkJaWYgKGhlYWRlci0+ZmxhZ3MgJiBQSU1GT1JfRkxBR19BUFBMSUNfT1JJR0lOKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICIlczogZXJyYW50IFBJTUZPUiBhcHBsaWNhdGlvbiBmcmFtZVxuIiwKKwkJCSAgICAgICBuZGV2LT5uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogRGV0ZXJtaW5lIGZyYW1lIHNpemUsIHNraXBwaW5nIE9JRF9JTkxfVFVOTkVMIGhlYWRlcnMuICovCisJCXNpemUgPSBQSU1GT1JfSEVBREVSX1NJWkUgKyBoZWFkZXItPmxlbmd0aDsKKwkJZnJhbWUgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUpICsgc2l6ZSwKKwkJCQlHRlBfQVRPTUlDKTsKKwkJaWYgKCFmcmFtZSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogT3V0IG9mIG1lbW9yeSwgY2Fubm90IGhhbmRsZSBvaWQgMHglMDh4XG4iLAorCQkJICAgICAgIG5kZXYtPm5hbWUsIGhlYWRlci0+b2lkKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZyYW1lLT5uZGV2ID0gbmRldjsKKwkJbWVtY3B5KCZmcmFtZS0+YnVmLCBoZWFkZXIsIHNpemUpOworCQlmcmFtZS0+aGVhZGVyID0gKHBpbWZvcl9oZWFkZXJfdCAqKSBmcmFtZS0+YnVmOworCQlmcmFtZS0+ZGF0YSA9IGZyYW1lLT5idWYgKyBQSU1GT1JfSEVBREVSX1NJWkU7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQlERUJVRyhTSE9XX1BJTUZPUl9GUkFNRVMsCisJCSAgICAgICJmcmFtZTogaGVhZGVyOiAlcCwgZGF0YTogJXAsIHNpemU6ICVkXG4iLAorCQkgICAgICBmcmFtZS0+aGVhZGVyLCBmcmFtZS0+ZGF0YSwgc2l6ZSk7CisjZW5kaWYKKworCQlpZiAoaGVhZGVyLT5vcGVyYXRpb24gPT0gUElNRk9SX09QX1RSQVApIHsKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCSAgICAgICAiVFJBUDogb2lkIDB4JXgsIGRldmljZSAlaSwgZmxhZ3MgMHgleCBsZW5ndGggJWlcbiIsCisJCQkgICAgICAgaGVhZGVyLT5vaWQsIGhlYWRlci0+ZGV2aWNlX2lkLCBoZWFkZXItPmZsYWdzLAorCQkJICAgICAgIGhlYWRlci0+bGVuZ3RoKTsKKyNlbmRpZgorCisJCQkvKiBDcmVhdGUgd29yayB0byBoYW5kbGUgdHJhcCBvdXQgb2YgaW50ZXJydXB0CisJCQkgKiBjb250ZXh0LiAqLworCQkJSU5JVF9XT1JLKCZmcmFtZS0+d3MsIHByaXNtNTRfcHJvY2Vzc190cmFwLCBmcmFtZSk7CisJCQlzY2hlZHVsZV93b3JrKCZmcmFtZS0+d3MpOworCisJCX0gZWxzZSB7CisJCQkvKiBTaWduYWwgdGhlIG9uZSB3YWl0aW5nIHByb2Nlc3MgdGhhdCBhIHJlc3BvbnNlCisJCQkgKiBoYXMgYmVlbiByZWNlaXZlZC4gKi8KKwkJCWlmICgoZnJhbWUgPSB4Y2hnKCZwcml2LT5tZ210X3JlY2VpdmVkLCBmcmFtZSkpICE9IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICIlczogbWdtdCByZXNwb25zZSBub3QgY29sbGVjdGVkXG4iLAorCQkJCSAgICAgICBuZGV2LT5uYW1lKTsKKwkJCQlrZnJlZShmcmFtZSk7CisJCQl9CisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJCURFQlVHKFNIT1dfVFJBQ0lORywgIldha2UgdXAgTWdtdCBRdWV1ZVxuIik7CisjZW5kaWYKKwkJCXdha2VfdXAoJnByaXYtPm1nbXRfd3F1ZXVlKTsKKwkJfQorCisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDbGVhbnVwIHRoZSB0cmFuc21pdCBxdWV1ZSBieSBmcmVlaW5nIGFsbCBmcmFtZXMgaGFuZGxlZCBieSB0aGUgZGV2aWNlLgorICovCit2b2lkCitpc2xwY2lfbWd0X2NsZWFudXBfdHJhbnNtaXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKmNiID0JLyogdm9sYXRpbGUgbm90IG5lZWRlZCAqLworCSAgICAoaXNsMzh4eF9jb250cm9sX2Jsb2NrICopIHByaXYtPmNvbnRyb2xfYmxvY2s7CisJdTMyIGN1cnJfZnJhZzsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJREVCVUcoU0hPV19GVU5DVElPTl9DQUxMUywgImlzbHBjaV9tZ3RfY2xlYW51cF90cmFuc21pdFxuIik7CisjZW5kaWYKKworCS8qIE9ubHkgb25jZSBwZXIgY2xlYW51cCwgZGV0ZXJtaW5lIGZyYWdtZW50IHJhbmdlIHRvCisJICogcHJvY2Vzcy4gIFRoaXMgYXZvaWRzIGFuIGVuZGxlc3MgbG9vcCAoaS5lLiBsb2NrdXApIGlmCisJICogdGhlIGRldmljZSBiZWNhbWUgY29uZnVzZWQsIGluY3JlbWVudGluZyBkZXZpY2VfY3Vycl9mcmFnCisJICogcmFwaWRseS4gKi8KKwljdXJyX2ZyYWcgPSBsZTMyX3RvX2NwdShjYi0+ZGV2aWNlX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1RYX01HTVRRXSk7CisJYmFycmllcigpOworCisJZm9yICg7IHByaXYtPmluZGV4X21nbXRfdHggPCBjdXJyX2ZyYWc7IHByaXYtPmluZGV4X21nbXRfdHgrKykgeworCQlpbnQgaW5kZXggPSBwcml2LT5pbmRleF9tZ210X3R4ICUgSVNMMzhYWF9DQl9NR01UX1FTSVpFOworCQlzdHJ1Y3QgaXNscGNpX21lbWJ1ZiAqYnVmID0gJnByaXYtPm1nbXRfdHhbaW5kZXhdOworCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsIGJ1Zi0+cGNpX2FkZHIsIGJ1Zi0+c2l6ZSwKKwkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCWJ1Zi0+cGNpX2FkZHIgPSAwOworCQlrZnJlZShidWYtPm1lbSk7CisJCWJ1Zi0+bWVtID0gTlVMTDsKKwkJYnVmLT5zaXplID0gMDsKKwl9Cit9CisKKy8qCisgKiBQZXJmb3JtIG9uZSByZXF1ZXN0LXJlc3BvbnNlIHRyYW5zYWN0aW9uIHRvIHRoZSBkZXZpY2UuCisgKi8KK2ludAoraXNscGNpX21ndF90cmFuc2FjdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJICAgICAgIGludCBvcGVyYXRpb24sIHVuc2lnbmVkIGxvbmcgb2lkLAorCQkgICAgICAgdm9pZCAqc2VuZGRhdGEsIGludCBzZW5kbGVuLAorCQkgICAgICAgc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKipyZWN2ZnJhbWUpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwljb25zdCBsb25nIHdhaXRfY3ljbGVfamlmZmllcyA9IChJU0wzOFhYX1dBSVRfQ1lDTEUgKiAxMCAqIEhaKSAvIDEwMDA7CisJbG9uZyB0aW1lb3V0X2xlZnQgPSBJU0wzOFhYX01BWF9XQUlUX0NZQ0xFUyAqIHdhaXRfY3ljbGVfamlmZmllczsKKwlpbnQgZXJyOworCURFRklORV9XQUlUKHdhaXQpOworCisJKnJlY3ZmcmFtZSA9IE5VTEw7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZwcml2LT5tZ210X3NlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlwcmVwYXJlX3RvX3dhaXQoJnByaXYtPm1nbXRfd3F1ZXVlLCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCWVyciA9IGlzbHBjaV9tZ3RfdHJhbnNtaXQobmRldiwgb3BlcmF0aW9uLCBvaWQsIHNlbmRkYXRhLCBzZW5kbGVuKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IC1FVElNRURPVVQ7CisJd2hpbGUgKHRpbWVvdXRfbGVmdCA+IDApIHsKKwkJaW50IHRpbWVsZWZ0OworCQlzdHJ1Y3QgaXNscGNpX21nbXRmcmFtZSAqZnJhbWU7CisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQl0aW1lbGVmdCA9IHNjaGVkdWxlX3RpbWVvdXQod2FpdF9jeWNsZV9qaWZmaWVzKTsKKwkJZnJhbWUgPSB4Y2hnKCZwcml2LT5tZ210X3JlY2VpdmVkLCBOVUxMKTsKKwkJaWYgKGZyYW1lKSB7CisJCQlpZiAoZnJhbWUtPmhlYWRlci0+b2lkID09IG9pZCkgeworCQkJCSpyZWN2ZnJhbWUgPSBmcmFtZTsKKwkJCQllcnIgPSAwOworCQkJCWdvdG8gb3V0OworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiJXM6IGV4cGVjdGluZyBvaWQgMHgleCwgcmVjZWl2ZWQgMHgleC5cbiIsCisJCQkJICAgICAgIG5kZXYtPm5hbWUsICh1bnNpZ25lZCBpbnQpIG9pZCwKKwkJCQkgICAgICAgZnJhbWUtPmhlYWRlci0+b2lkKTsKKwkJCQlrZnJlZShmcmFtZSk7CisJCQkJZnJhbWUgPSBOVUxMOworCQkJfQorCQl9CisJCWlmICh0aW1lbGVmdCA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSIlczogdGltZW91dCB3YWl0aW5nIGZvciBtZ210IHJlc3BvbnNlICVsdSwgIgorCQkJCSJ0cmlnZ2VyaW5nIGRldmljZVxuIiwKKwkJCQluZGV2LT5uYW1lLCB0aW1lb3V0X2xlZnQpOworCQkJaXNscGNpX3RyaWdnZXIocHJpdik7CisJCX0KKwkJdGltZW91dF9sZWZ0ICs9IHRpbWVsZWZ0IC0gd2FpdF9jeWNsZV9qaWZmaWVzOworCX0KKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdGltZW91dCB3YWl0aW5nIGZvciBtZ210IHJlc3BvbnNlXG4iLAorCSAgICAgICBuZGV2LT5uYW1lKTsKKworCS8qIFRPRE86IHdlIHNob3VsZCByZXNldCB0aGUgZGV2aWNlIGhlcmUgKi8gICAgIAorIG91dDoKKwlmaW5pc2hfd2FpdCgmcHJpdi0+bWdtdF93cXVldWUsICZ3YWl0KTsKKwl1cCgmcHJpdi0+bWdtdF9zZW0pOworCXJldHVybiBlcnI7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfbWd0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk4MmJlMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogIAorICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEx1aXMgUi4gUm9kcmlndWV6IDxtY2dyb2ZAcnVzbHVnLnJ1dGdlcnMuZWR1PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaWZuZGVmIF9JU0xQQ0lfTUdUX0gKKyNkZWZpbmUgX0lTTFBDSV9NR1RfSAorCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworLyoKKyAqICBGdW5jdGlvbiBkZWZpbml0aW9ucworICovCisKKyNkZWZpbmUgS19ERUJVRyhmLCBtLCBhcmdzLi4uKSBkbyB7IGlmKGYgJiBtKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKTsgfSB3aGlsZSgwKQorI2RlZmluZSBERUJVRyhmLCBhcmdzLi4uKSBLX0RFQlVHKGYsIHBjX2RlYnVnLCBhcmdzKQorCitleHRlcm4gaW50IHBjX2RlYnVnOworI2RlZmluZSBpbml0X3dkcyAwCS8qIGhlbHAgY29tcGlsZXIgb3B0aW1pemUgYXdheSBkZWFkIGNvZGUgKi8KKworCisvKiBHZW5lcmFsIGRyaXZlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBQQ0lERVZJQ0VfTEFURU5DWV9USU1FUl9NSU4gCQkweDQwCisjZGVmaW5lIFBDSURFVklDRV9MQVRFTkNZX1RJTUVSX1ZBTCAJCTB4NTAKKworLyogRGVidWdnaW5nIHZlcmJvc2UgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgU0hPV19OT1RISU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAJLyogb3ZlcnJ1bGVzIGV2ZXJ5dGhpbmcgKi8KKyNkZWZpbmUgU0hPV19BTllUSElORyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYKKyNkZWZpbmUgU0hPV19FUlJPUl9NRVNTQUdFUyAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgU0hPV19UUkFQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgU0hPV19GVU5DVElPTl9DQUxMUyAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgU0hPV19UUkFDSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgU0hPV19RVUVVRV9JTkRFWEVTICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgU0hPV19QSU1GT1JfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgU0hPV19CVUZGRVJfQ09OVEVOVFMgICAgICAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgVkVSQk9TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKworLyogRGVmYXVsdCBjYXJkIGRlZmluaXRpb25zICovCisjZGVmaW5lIENBUkRfREVGQVVMVF9DSEFOTkVMICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIENBUkRfREVGQVVMVF9NT0RFICAgICAgICAgICAgICAgICAgICAgICBJTkxfTU9ERV9DTElFTlQKKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX0lXX01PREUJCQlJV19NT0RFX0lORlJBCisjZGVmaW5lIENBUkRfREVGQVVMVF9CU1NUWVBFICAgICAgICAgICAgICAgICAgICBET1QxMV9CU1NUWVBFX0lORlJBCisjZGVmaW5lIENBUkRfREVGQVVMVF9DTElFTlRfU1NJRAkJIiIKKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX0FQX1NTSUQJCQkiZGVmYXVsdCIKKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX0tFWTEgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0X2tleV8xIgorI2RlZmluZSBDQVJEX0RFRkFVTFRfS0VZMiAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHRfa2V5XzIiCisjZGVmaW5lIENBUkRfREVGQVVMVF9LRVkzICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdF9rZXlfMyIKKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX0tFWTQgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0X2tleV80IgorI2RlZmluZSBDQVJEX0RFRkFVTFRfV0VQICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDQVJEX0RFRkFVTFRfRklMVEVSICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDQVJEX0RFRkFVTFRfV0RTICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZQlDQVJEX0RFRkFVTFRfQVVUSEVOICAgICAgICAgICAgICAgICAgICAgRE9UMTFfQVVUSF9PUworI2RlZmluZQlDQVJEX0RFRkFVTFRfRE9UMVgJCQkwCisjZGVmaW5lIENBUkRfREVGQVVMVF9NTE1FX01PREUJCQlET1QxMV9NTE1FX0FVVE8KKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX0NPTkZPUk1BTkNFICAgICAgICAgICAgICAgIE9JRF9JTkxfQ09ORk9STUFOQ0VfTk9ORQorI2RlZmluZSBDQVJEX0RFRkFVTFRfUFJPRklMRQkJCURPVDExX1BST0ZJTEVfTUlYRURfR19XSUZJCisjZGVmaW5lIENBUkRfREVGQVVMVF9NQVhGUkFNRUJVUlNUCQlET1QxMV9NQVhGUkFNRUJVUlNUX01JWEVEX1NBRkUKKworLyogUElNRk9SIHBhY2thZ2UgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgUElNRk9SX0VUSEVSVFlQRSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgyOAorI2RlZmluZSBQSU1GT1JfSEVBREVSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgUElNRk9SX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUElNRk9SX09QX0dFVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUElNRk9SX09QX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUElNRk9SX09QX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUElNRk9SX09QX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUElNRk9SX09QX1RSQVAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgUElNRk9SX09QX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgIDUJLyogdGlsbCAyNTUgKi8KKyNkZWZpbmUgUElNRk9SX0RFVl9JRF9NSExJX01JQiAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUElNRk9SX0ZMQUdfQVBQTElDX09SSUdJTiAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUElNRk9SX0ZMQUdfTElUVExFX0VORElBTiAgICAgICAgICAgICAgIDB4MDIKKworc3RhdGljIGlubGluZSB2b2lkCithZGRfbGUzMnAodTMyICogbGVfbnVtYmVyLCB1MzIgYWRkKQoreworCSpsZV9udW1iZXIgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdXAobGVfbnVtYmVyKSArIGFkZCk7Cit9CisKK3ZvaWQgZGlzcGxheV9idWZmZXIoY2hhciAqLCBpbnQpOworCisvKgorICogIFR5cGUgZGVmaW5pdGlvbiBzZWN0aW9uCisgKgorICogIHRoZSBzdHJ1Y3R1cmUgZGVmaW5lcyBvbmx5IHRoZSBoZWFkZXIgYWxsb3dpbmcgY29weWxlc3MKKyAqICBmcmFtZSBoYW5kbGluZworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTggdmVyc2lvbjsKKwl1OCBvcGVyYXRpb247CisJdTMyIG9pZDsKKwl1OCBkZXZpY2VfaWQ7CisJdTggZmxhZ3M7CisJdTMyIGxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCitwaW1mb3JfaGVhZGVyX3Q7CisKKy8qIEEgcmVjZWl2ZWQgYW5kIGludGVycnVwdC1wcm9jZXNzZWQgbWFuYWdlbWVudCBmcmFtZSwgZWl0aGVyIGZvcgorICogc2NoZWR1bGVfd29yayhwcmlzbTU0X3Byb2Nlc3NfdHJhcCkgb3IgZm9yIHByaXYtPm1nbXRfcmVjZWl2ZWQsCisgKiBwcm9jZXNzZWQgYnkgaXNscGNpX21ndF90cmFuc2FjdGlvbigpLiAqLworc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OyAgICAgIC8qIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2UgKi8KKwlwaW1mb3JfaGVhZGVyX3QgKmhlYWRlcjsgICAgICAvKiBwYXlsb2FkIGhlYWRlciwgcG9pbnRzIGludG8gYnVmICovCisJdm9pZCAqZGF0YTsJCSAgICAgIC8qIHBheWxvYWQgZXggaGVhZGVyLCBwb2ludHMgaW50byBidWYgKi8KKyAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IHdzOwkgICAgICAvKiBhcmd1bWVudCBmb3Igc2NoZWR1bGVfd29yaygpICovCisJY2hhciBidWZbMF07CQkgICAgICAvKiBmcmFnbWVudCBidWZmZXIgKi8KK307CisKK2ludAoraXNscGNpX21ndF9yZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KTsKKworaW50Citpc2xwY2lfbWdtdF9yeF9maWxsKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KTsKKwordm9pZAoraXNscGNpX21ndF9jbGVhbnVwX3RyYW5zbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KTsKKworaW50Citpc2xwY2lfbWd0X3RyYW5zYWN0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3BlcmF0aW9uLCB1bnNpZ25lZCBsb25nIG9pZCwKKwkJICAgICAgIHZvaWQgKnNlbmRkYXRhLCBpbnQgc2VuZGxlbiwKKwkJICAgICAgIHN0cnVjdCBpc2xwY2lfbWdtdGZyYW1lICoqcmVjdmZyYW1lKTsKKworc3RhdGljIGlubGluZSB2b2lkCitpc2xwY2lfbWd0X3JlbGVhc2Uoc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKmZyYW1lKQoreworICAgICAgICBrZnJlZShmcmFtZSk7Cit9CisKKyNlbmRpZgkJCQkvKiBfSVNMUENJX01HVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvb2lkX21ndC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMTIzZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuYwpAQCAtMCwwICsxLDkwNyBAQAorLyogICAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMsMjAwNCBBdXJlbGllbiBBbGxlYXVtZSA8c2x0c0BmcmVlLmZyPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAicHJpc21jb21wYXQuaCIKKyNpbmNsdWRlICJpc2xwY2lfZGV2LmgiCisjaW5jbHVkZSAiaXNscGNpX21ndC5oIgorI2luY2x1ZGUgImlzbF9vaWQuaCIKKyNpbmNsdWRlICJvaWRfbWd0LmgiCisjaW5jbHVkZSAiaXNsX2lvY3RsLmgiCisKKy8qIHRvIGNvbnZlcnQgYmV0d2VlbiBjaGFubmVsIGFuZCBmcmVxICovCitzdGF0aWMgY29uc3QgaW50IGZyZXF1ZW5jeV9saXN0X2JnW10gPSB7IDI0MTIsIDI0MTcsIDI0MjIsIDI0MjcsIDI0MzIsCisJMjQzNywgMjQ0MiwgMjQ0NywgMjQ1MiwgMjQ1NywgMjQ2MiwgMjQ2NywgMjQ3MiwgMjQ4NAorfTsKKworaW50CitjaGFubmVsX29mX2ZyZXEoaW50IGYpCit7CisJaW50IGMgPSAwOworCisJaWYgKChmID49IDI0MTIpICYmIChmIDw9IDI0ODQpKSB7CisJCXdoaWxlICgoYyA8IDE0KSAmJiAoZiAhPSBmcmVxdWVuY3lfbGlzdF9iZ1tjXSkpCisJCQljKys7CisJCXJldHVybiAoYyA+PSAxNCkgPyAwIDogKytjOworCX0gZWxzZSBpZiAoKGYgPj0gKGludCkgNTAwMCkgJiYgKGYgPD0gKGludCkgNjAwMCkpIHsKKwkJcmV0dXJuICggKGYgLSA1MDAwKSAvIDUgKTsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0lEX1NUUlVDVChuYW1lLG9pZCxzLHQpIFtuYW1lXSA9IHtvaWQsIDAsIHNpemVvZihzKSwgdH0KKyNkZWZpbmUgT0lEX1NUUlVDVF9DKG5hbWUsb2lkLHMsdCkgT0lEX1NUUlVDVChuYW1lLG9pZCxzLHQgfCBPSURfRkxBR19DQUNIRUQpCisjZGVmaW5lIE9JRF9VMzIobmFtZSxvaWQpIE9JRF9TVFJVQ1QobmFtZSxvaWQsdTMyLE9JRF9UWVBFX1UzMikKKyNkZWZpbmUgT0lEX1UzMl9DKG5hbWUsb2lkKSBPSURfU1RSVUNUX0MobmFtZSxvaWQsdTMyLE9JRF9UWVBFX1UzMikKKyNkZWZpbmUgT0lEX1NUUlVDVF9NTE1FKG5hbWUsb2lkKSBPSURfU1RSVUNUKG5hbWUsb2lkLHN0cnVjdCBvYmpfbWxtZSxPSURfVFlQRV9NTE1FKQorI2RlZmluZSBPSURfU1RSVUNUX01MTUVFWChuYW1lLG9pZCkgT0lEX1NUUlVDVChuYW1lLG9pZCxzdHJ1Y3Qgb2JqX21sbWVleCxPSURfVFlQRV9NTE1FRVgpCisKKyNkZWZpbmUgT0lEX1VOS05PV04obmFtZSxvaWQpIE9JRF9TVFJVQ1QobmFtZSxvaWQsMCwwKQorCitzdHJ1Y3Qgb2lkX3QgaXNsX29pZFtdID0geworCU9JRF9TVFJVQ1QoR0VOX09JRF9NQUNBRERSRVNTLCAweDAwMDAwMDAwLCB1OFs2XSwgT0lEX1RZUEVfQUREUiksCisJT0lEX1UzMihHRU5fT0lEX0xJTktTVEFURSwgMHgwMDAwMDAwMSksCisJT0lEX1VOS05PV04oR0VOX09JRF9XQVRDSERPRywgMHgwMDAwMDAwMiksCisJT0lEX1VOS05PV04oR0VOX09JRF9NSUJPUCwgMHgwMDAwMDAwMyksCisJT0lEX1VOS05PV04oR0VOX09JRF9PUFRJT05TLCAweDAwMDAwMDA0KSwKKwlPSURfVU5LTk9XTihHRU5fT0lEX0xFRENPTkZJRywgMHgwMDAwMDAwNSksCisKKwkvKiA4MDIuMTEgKi8KKwlPSURfVTMyX0MoRE9UMTFfT0lEX0JTU1RZUEUsIDB4MTAwMDAwMDApLAorCU9JRF9TVFJVQ1RfQyhET1QxMV9PSURfQlNTSUQsIDB4MTAwMDAwMDEsIHU4WzZdLCBPSURfVFlQRV9SQVcpLAorCU9JRF9TVFJVQ1RfQyhET1QxMV9PSURfU1NJRCwgMHgxMDAwMDAwMiwgc3RydWN0IG9ial9zc2lkLAorCQkgICAgIE9JRF9UWVBFX1NTSUQpLAorCU9JRF9VMzIoRE9UMTFfT0lEX1NUQVRFLCAweDEwMDAwMDAzKSwKKwlPSURfVTMyKERPVDExX09JRF9BSUQsIDB4MTAwMDAwMDQpLAorCU9JRF9TVFJVQ1QoRE9UMTFfT0lEX0NPVU5UUllTVFJJTkcsIDB4MTAwMDAwMDUsIHU4WzRdLCBPSURfVFlQRV9SQVcpLAorCU9JRF9TVFJVQ1RfQyhET1QxMV9PSURfU1NJRE9WRVJSSURFLCAweDEwMDAwMDA2LCBzdHJ1Y3Qgb2JqX3NzaWQsCisJCSAgICAgT0lEX1RZUEVfU1NJRCksCisKKwlPSURfVTMyKERPVDExX09JRF9NRURJVU1MSU1JVCwgMHgxMTAwMDAwMCksCisJT0lEX1UzMl9DKERPVDExX09JRF9CRUFDT05QRVJJT0QsIDB4MTEwMDAwMDEpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0RUSU1QRVJJT0QsIDB4MTEwMDAwMDIpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0FUSU1XSU5ET1csIDB4MTEwMDAwMDMpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0xJU1RFTklOVEVSVkFMLCAweDExMDAwMDA0KSwKKwlPSURfVTMyKERPVDExX09JRF9DRlBQRVJJT0QsIDB4MTEwMDAwMDUpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0NGUERVUkFUSU9OLCAweDExMDAwMDA2KSwKKworCU9JRF9VMzJfQyhET1QxMV9PSURfQVVUSEVOQUJMRSwgMHgxMjAwMDAwMCksCisJT0lEX1UzMl9DKERPVDExX09JRF9QUklWQUNZSU5WT0tFRCwgMHgxMjAwMDAwMSksCisJT0lEX1UzMl9DKERPVDExX09JRF9FWFVORU5DUllQVEVELCAweDEyMDAwMDAyKSwKKwlPSURfVTMyX0MoRE9UMTFfT0lEX0RFRktFWUlELCAweDEyMDAwMDAzKSwKKwlbRE9UMTFfT0lEX0RFRktFWVhdID0gezB4MTIwMDAwMDQsIDMsIHNpemVvZiAoc3RydWN0IG9ial9rZXkpLAorCQkJICAgICAgIE9JRF9GTEFHX0NBQ0hFRCB8IE9JRF9UWVBFX0tFWX0sCS8qIERPVDExX09JRF9ERUZLRVkxLC4uLkRPVDExX09JRF9ERUZLRVk0ICovCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX1NUQUtFWSwgMHgxMjAwMDAwOCksCisJT0lEX1UzMihET1QxMV9PSURfUkVLRVlUSFJFU0hPTEQsIDB4MTIwMDAwMDkpLAorCU9JRF9VTktOT1dOKERPVDExX09JRF9TVEFTQywgMHgxMjAwMDAwYSksCisKKwlPSURfVTMyKERPVDExX09JRF9QUklWVFhSRUpFQ1RFRCwgMHgxYTAwMDAwMCksCisJT0lEX1UzMihET1QxMV9PSURfUFJJVlJYUExBSU4sIDB4MWEwMDAwMDEpLAorCU9JRF9VMzIoRE9UMTFfT0lEX1BSSVZSWEZBSUxFRCwgMHgxYTAwMDAwMiksCisJT0lEX1UzMihET1QxMV9PSURfUFJJVlJYTk9LRVksIDB4MWEwMDAwMDMpLAorCisJT0lEX1UzMl9DKERPVDExX09JRF9SVFNUSFJFU0gsIDB4MTMwMDAwMDApLAorCU9JRF9VMzJfQyhET1QxMV9PSURfRlJBR1RIUkVTSCwgMHgxMzAwMDAwMSksCisJT0lEX1UzMl9DKERPVDExX09JRF9TSE9SVFJFVFJJRVMsIDB4MTMwMDAwMDIpLAorCU9JRF9VMzJfQyhET1QxMV9PSURfTE9OR1JFVFJJRVMsIDB4MTMwMDAwMDMpLAorCU9JRF9VMzJfQyhET1QxMV9PSURfTUFYVFhMSUZFVElNRSwgMHgxMzAwMDAwNCksCisJT0lEX1UzMihET1QxMV9PSURfTUFYUlhMSUZFVElNRSwgMHgxMzAwMDAwNSksCisJT0lEX1UzMihET1QxMV9PSURfQVVUSFJFU1BUSU1FT1VULCAweDEzMDAwMDA2KSwKKwlPSURfVTMyKERPVDExX09JRF9BU1NPQ1JFU1BUSU1FT1VULCAweDEzMDAwMDA3KSwKKworCU9JRF9VTktOT1dOKERPVDExX09JRF9BTE9GVF9UQUJMRSwgMHgxZDAwMDAwMCksCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX0FMT0ZUX0NUUkxfVEFCTEUsIDB4MWQwMDAwMDEpLAorCU9JRF9VTktOT1dOKERPVDExX09JRF9BTE9GVF9SRVRSRUFULCAweDFkMDAwMDAyKSwKKwlPSURfVU5LTk9XTihET1QxMV9PSURfQUxPRlRfUFJPR1JFU1MsIDB4MWQwMDAwMDMpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0FMT0ZUX0ZJWEVEUkFURSwgMHgxZDAwMDAwNCksCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX0FMT0ZUX1JTU0lHUkFQSCwgMHgxZDAwMDAwNSksCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX0FMT0ZUX0NPTkZJRywgMHgxZDAwMDAwNiksCisKKwlbRE9UMTFfT0lEX1ZEQ0ZYXSA9IHsweDFiMDAwMDAwLCA3LCAwLCAwfSwKKwlPSURfVTMyKERPVDExX09JRF9NQVhGUkFNRUJVUlNULCAweDFiMDAwMDA4KSwKKworCU9JRF9VMzIoRE9UMTFfT0lEX1BTTSwgMHgxNDAwMDAwMCksCisJT0lEX1UzMihET1QxMV9PSURfQ0FNVElNRU9VVCwgMHgxNDAwMDAwMSksCisJT0lEX1UzMihET1QxMV9PSURfUkVDRUlWRURUSU1TLCAweDE0MDAwMDAyKSwKKwlPSURfVTMyKERPVDExX09JRF9ST0FNUFJFRkVSRU5DRSwgMHgxNDAwMDAwMyksCisKKwlPSURfVTMyKERPVDExX09JRF9CUklER0VMT0NBTCwgMHgxNTAwMDAwMCksCisJT0lEX1UzMihET1QxMV9PSURfQ0xJRU5UUywgMHgxNTAwMDAwMSksCisJT0lEX1UzMihET1QxMV9PSURfQ0xJRU5UU0FTU09DSUFURUQsIDB4MTUwMDAwMDIpLAorCVtET1QxMV9PSURfQ0xJRU5UWF0gPSB7MHgxNTAwMDAwMywgMjAwNiwgMCwgMH0sCS8qIERPVDExX09JRF9DTElFTlRYLC4uLkRPVDExX09JRF9DTElFTlQyMDA3ICovCisKKwlPSURfU1RSVUNUKERPVDExX09JRF9DTElFTlRGSU5ELCAweDE1MDAwN0RCLCB1OFs2XSwgT0lEX1RZUEVfQUREUiksCisJT0lEX1NUUlVDVChET1QxMV9PSURfV0RTTElOS0FERCwgMHgxNTAwMDdEQywgdThbNl0sIE9JRF9UWVBFX0FERFIpLAorCU9JRF9TVFJVQ1QoRE9UMTFfT0lEX1dEU0xJTktSRU1PVkUsIDB4MTUwMDA3REQsIHU4WzZdLCBPSURfVFlQRV9BRERSKSwKKwlPSURfU1RSVUNUKERPVDExX09JRF9FQVBBVVRIU1RBLCAweDE1MDAwN0RFLCB1OFs2XSwgT0lEX1RZUEVfQUREUiksCisJT0lEX1NUUlVDVChET1QxMV9PSURfRUFQVU5BVVRIU1RBLCAweDE1MDAwN0RGLCB1OFs2XSwgT0lEX1RZUEVfQUREUiksCisJT0lEX1UzMl9DKERPVDExX09JRF9ET1QxWEVOQUJMRSwgMHgxNTAwMDdFMCksCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX01JQ0ZBSUxVUkUsIDB4MTUwMDA3RTEpLAorCU9JRF9VTktOT1dOKERPVDExX09JRF9SRUtFWUlORElDQVRFLCAweDE1MDAwN0UyKSwKKworCU9JRF9VMzIoRE9UMTFfT0lEX01QRFVUWFNVQ0NFU1NGVUwsIDB4MTYwMDAwMDApLAorCU9JRF9VMzIoRE9UMTFfT0lEX01QRFVUWE9ORVJFVFJZLCAweDE2MDAwMDAxKSwKKwlPSURfVTMyKERPVDExX09JRF9NUERVVFhNVUxUSVBMRVJFVFJJRVMsIDB4MTYwMDAwMDIpLAorCU9JRF9VMzIoRE9UMTFfT0lEX01QRFVUWEZBSUxFRCwgMHgxNjAwMDAwMyksCisJT0lEX1UzMihET1QxMV9PSURfTVBEVVJYU1VDQ0VTU0ZVTCwgMHgxNjAwMDAwNCksCisJT0lEX1UzMihET1QxMV9PSURfTVBEVVJYRFVQUywgMHgxNjAwMDAwNSksCisJT0lEX1UzMihET1QxMV9PSURfUlRTU1VDQ0VTU0ZVTCwgMHgxNjAwMDAwNiksCisJT0lEX1UzMihET1QxMV9PSURfUlRTRkFJTEVELCAweDE2MDAwMDA3KSwKKwlPSURfVTMyKERPVDExX09JRF9BQ0tGQUlMRUQsIDB4MTYwMDAwMDgpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0ZSQU1FUkVDRUlWRVMsIDB4MTYwMDAwMDkpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0ZSQU1FRVJST1JTLCAweDE2MDAwMDBBKSwKKwlPSURfVTMyKERPVDExX09JRF9GUkFNRUFCT1JUUywgMHgxNjAwMDAwQiksCisJT0lEX1UzMihET1QxMV9PSURfRlJBTUVBQk9SVFNQSFksIDB4MTYwMDAwMEMpLAorCisJT0lEX1UzMihET1QxMV9PSURfU0xPVFRJTUUsIDB4MTcwMDAwMDApLAorCU9JRF9VMzIoRE9UMTFfT0lEX0NXTUlOLCAweDE3MDAwMDAxKSwKKwlPSURfVTMyKERPVDExX09JRF9DV01BWCwgMHgxNzAwMDAwMiksCisJT0lEX1UzMihET1QxMV9PSURfQUNLV0lORE9XLCAweDE3MDAwMDAzKSwKKwlPSURfVTMyKERPVDExX09JRF9BTlRFTk5BUlgsIDB4MTcwMDAwMDQpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0FOVEVOTkFUWCwgMHgxNzAwMDAwNSksCisJT0lEX1UzMihET1QxMV9PSURfQU5URU5OQURJVkVSU0lUWSwgMHgxNzAwMDAwNiksCisJT0lEX1UzMl9DKERPVDExX09JRF9DSEFOTkVMLCAweDE3MDAwMDA3KSwKKwlPSURfVTMyX0MoRE9UMTFfT0lEX0VEVEhSRVNIT0xELCAweDE3MDAwMDA4KSwKKwlPSURfVTMyKERPVDExX09JRF9QUkVBTUJMRVNFVFRJTkdTLCAweDE3MDAwMDA5KSwKKwlPSURfU1RSVUNUKERPVDExX09JRF9SQVRFUywgMHgxNzAwMDAwQSwgdThbSVdNQVhfQklUUkFURVMgKyAxXSwKKwkJICAgT0lEX1RZUEVfUkFXKSwKKwlPSURfVTMyKERPVDExX09JRF9DQ0FNT0RFU1VQUE9SVEVELCAweDE3MDAwMDBCKSwKKwlPSURfVTMyKERPVDExX09JRF9DQ0FNT0RFLCAweDE3MDAwMDBDKSwKKwlPSURfVU5LTk9XTihET1QxMV9PSURfUlNTSVZFQ1RPUiwgMHgxNzAwMDAwRCksCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX09VVFBVVFBPV0VSVEFCTEUsIDB4MTcwMDAwMEUpLAorCU9JRF9VMzIoRE9UMTFfT0lEX09VVFBVVFBPV0VSLCAweDE3MDAwMDBGKSwKKwlPSURfU1RSVUNUKERPVDExX09JRF9TVVBQT1JURURSQVRFUywgMHgxNzAwMDAxMCwKKwkJICAgdThbSVdNQVhfQklUUkFURVMgKyAxXSwgT0lEX1RZUEVfUkFXKSwKKwlPSURfVTMyX0MoRE9UMTFfT0lEX0ZSRVFVRU5DWSwgMHgxNzAwMDAxMSksCisJW0RPVDExX09JRF9TVVBQT1JURURGUkVRVUVOQ0lFU10gPQorCSAgICB7MHgxNzAwMDAxMiwgMCwgc2l6ZW9mIChzdHJ1Y3Qgb2JqX2ZyZXF1ZW5jaWVzKQorCSAgICAgKyBzaXplb2YgKHUxNikgKiBJV01BWF9GUkVRLCBPSURfVFlQRV9GUkVRVUVOQ0lFU30sCisKKwlPSURfVTMyKERPVDExX09JRF9OT0lTRUZMT09SLCAweDE3MDAwMDEzKSwKKwlPSURfU1RSVUNUKERPVDExX09JRF9GUkVRVUVOQ1lBQ1RJVklUWSwgMHgxNzAwMDAxNCwgdThbSVdNQVhfRlJFUSArIDFdLAorCQkgICBPSURfVFlQRV9SQVcpLAorCU9JRF9VTktOT1dOKERPVDExX09JRF9JUUNBTElCUkFUSU9OVEFCTEUsIDB4MTcwMDAwMTUpLAorCU9JRF9VMzIoRE9UMTFfT0lEX05PTkVSUFBST1RFQ1RJT04sIDB4MTcwMDAwMTYpLAorCU9JRF9VMzIoRE9UMTFfT0lEX1NMT1RTRVRUSU5HUywgMHgxNzAwMDAxNyksCisJT0lEX1UzMihET1QxMV9PSURfTk9ORVJQVElNRU9VVCwgMHgxNzAwMDAxOCksCisJT0lEX1UzMihET1QxMV9PSURfUFJPRklMRVMsIDB4MTcwMDAwMTkpLAorCU9JRF9TVFJVQ1QoRE9UMTFfT0lEX0VYVEVOREVEUkFURVMsIDB4MTcwMDAwMjAsCisJCSAgIHU4W0lXTUFYX0JJVFJBVEVTICsgMV0sIE9JRF9UWVBFX1JBVyksCisKKwlPSURfU1RSVUNUX01MTUUoRE9UMTFfT0lEX0RFQVVUSEVOVElDQVRFLCAweDE4MDAwMDAwKSwKKwlPSURfU1RSVUNUX01MTUUoRE9UMTFfT0lEX0FVVEhFTlRJQ0FURSwgMHgxODAwMDAwMSksCisJT0lEX1NUUlVDVF9NTE1FKERPVDExX09JRF9ESVNBU1NPQ0lBVEUsIDB4MTgwMDAwMDIpLAorCU9JRF9TVFJVQ1RfTUxNRShET1QxMV9PSURfQVNTT0NJQVRFLCAweDE4MDAwMDAzKSwKKwlPSURfVU5LTk9XTihET1QxMV9PSURfU0NBTiwgMHgxODAwMDAwNCksCisJT0lEX1NUUlVDVF9NTE1FRVgoRE9UMTFfT0lEX0JFQUNPTiwgMHgxODAwMDAwNSksCisJT0lEX1NUUlVDVF9NTE1FRVgoRE9UMTFfT0lEX1BST0JFLCAweDE4MDAwMDA2KSwKKwlPSURfU1RSVUNUX01MTUVFWChET1QxMV9PSURfREVBVVRIRU5USUNBVEVFWCwgMHgxODAwMDAwNyksCisJT0lEX1NUUlVDVF9NTE1FRVgoRE9UMTFfT0lEX0FVVEhFTlRJQ0FURUVYLCAweDE4MDAwMDA4KSwKKwlPSURfU1RSVUNUX01MTUVFWChET1QxMV9PSURfRElTQVNTT0NJQVRFRVgsIDB4MTgwMDAwMDkpLAorCU9JRF9TVFJVQ1RfTUxNRUVYKERPVDExX09JRF9BU1NPQ0lBVEVFWCwgMHgxODAwMDAwQSksCisJT0lEX1NUUlVDVF9NTE1FRVgoRE9UMTFfT0lEX1JFQVNTT0NJQVRFLCAweDE4MDAwMDBCKSwKKwlPSURfU1RSVUNUX01MTUVFWChET1QxMV9PSURfUkVBU1NPQ0lBVEVFWCwgMHgxODAwMDAwQyksCisKKwlPSURfVTMyKERPVDExX09JRF9OT05FUlBTVEFUVVMsIDB4MUUwMDAwMDApLAorCisJT0lEX1UzMihET1QxMV9PSURfU1RBVElNRU9VVCwgMHgxOTAwMDAwMCksCisJT0lEX1UzMl9DKERPVDExX09JRF9NTE1FQVVUT0xFVkVMLCAweDE5MDAwMDAxKSwKKwlPSURfVTMyKERPVDExX09JRF9CU1NUSU1FT1VULCAweDE5MDAwMDAyKSwKKwlbRE9UMTFfT0lEX0FUVEFDSE1FTlRdID0gezB4MTkwMDAwMDMsIDAsCisJCXNpemVvZihzdHJ1Y3Qgb2JqX2F0dGFjaG1lbnQpLCBPSURfVFlQRV9BVFRBQ0h9LAorCU9JRF9TVFJVQ1RfQyhET1QxMV9PSURfUFNNQlVGRkVSLCAweDE5MDAwMDA0LCBzdHJ1Y3Qgb2JqX2J1ZmZlciwKKwkJICAgICBPSURfVFlQRV9CVUZGRVIpLAorCisJT0lEX1UzMihET1QxMV9PSURfQlNTUywgMHgxQzAwMDAwMCksCisJW0RPVDExX09JRF9CU1NYXSA9IHsweDFDMDAwMDAxLCA2Mywgc2l6ZW9mIChzdHJ1Y3Qgb2JqX2JzcyksCisJCQkgICAgT0lEX1RZUEVfQlNTfSwJLypET1QxMV9PSURfQlNTMSwuLi4sRE9UMTFfT0lEX0JTUzY0ICovCisJT0lEX1NUUlVDVChET1QxMV9PSURfQlNTRklORCwgMHgxQzAwMDA0Miwgc3RydWN0IG9ial9ic3MsIE9JRF9UWVBFX0JTUyksCisJW0RPVDExX09JRF9CU1NMSVNUXSA9IHsweDFDMDAwMDQzLCAwLCBzaXplb2YgKHN0cnVjdAorCQkJCQkJICAgICAgb2JqX2Jzc2xpc3QpICsKKwkJCSAgICAgICBzaXplb2YgKHN0cnVjdCBvYmpfYnNzW0lXTUFYX0JTU10pLAorCQkJICAgICAgIE9JRF9UWVBFX0JTU0xJU1R9LAorCisJT0lEX1VOS05PV04oT0lEX0lOTF9UVU5ORUwsIDB4RkYwMjAwMDApLAorCU9JRF9VTktOT1dOKE9JRF9JTkxfTUVNQUREUiwgMHhGRjAyMDAwMSksCisJT0lEX1VOS05PV04oT0lEX0lOTF9NRU1PUlksIDB4RkYwMjAwMDIpLAorCU9JRF9VMzJfQyhPSURfSU5MX01PREUsIDB4RkYwMjAwMDMpLAorCU9JRF9VTktOT1dOKE9JRF9JTkxfQ09NUE9ORU5UX05SLCAweEZGMDIwMDA0KSwKKwlPSURfU1RSVUNUKE9JRF9JTkxfVkVSU0lPTiwgMHhGRjAyMDAwNSwgdThbOF0sIE9JRF9UWVBFX1JBVyksCisJT0lEX1VOS05PV04oT0lEX0lOTF9JTlRFUkZBQ0VfSUQsIDB4RkYwMjAwMDYpLAorCU9JRF9VTktOT1dOKE9JRF9JTkxfQ09NUE9ORU5UX0lELCAweEZGMDIwMDA3KSwKKwlPSURfVTMyX0MoT0lEX0lOTF9DT05GSUcsIDB4RkYwMjAwMDgpLAorCU9JRF9VMzJfQyhPSURfSU5MX0RPVDExRF9DT05GT1JNQU5DRSwgMHhGRjAyMDAwQyksCisJT0lEX1UzMihPSURfSU5MX1BIWUNBUEFCSUxJVElFUywgMHhGRjAyMDAwRCksCisJT0lEX1UzMl9DKE9JRF9JTkxfT1VUUFVUUE9XRVIsIDB4RkYwMjAwMEYpLAorCit9OworCitpbnQKK21ndF9pbml0KGlzbHBjaV9wcml2YXRlICpwcml2KQoreworCWludCBpOworCisJcHJpdi0+bWliID0ga21hbGxvYyhPSURfTlVNX0xBU1QgKiBzaXplb2YgKHZvaWQgKiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdi0+bWliKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChwcml2LT5taWIsIDAsIE9JRF9OVU1fTEFTVCAqIHNpemVvZiAodm9pZCAqKSk7CisKKwkvKiBBbGxvYyB0aGUgY2FjaGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgT0lEX05VTV9MQVNUOyBpKyspIHsKKwkJaWYgKGlzbF9vaWRbaV0uZmxhZ3MgJiBPSURfRkxBR19DQUNIRUQpIHsKKwkJCXByaXYtPm1pYltpXSA9IGttYWxsb2MoaXNsX29pZFtpXS5zaXplICoKKwkJCQkJICAgICAgIChpc2xfb2lkW2ldLnJhbmdlICsgMSksCisJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwkJCWlmICghcHJpdi0+bWliW2ldKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJbWVtc2V0KHByaXYtPm1pYltpXSwgMCwKKwkJCSAgICAgICBpc2xfb2lkW2ldLnNpemUgKiAoaXNsX29pZFtpXS5yYW5nZSArIDEpKTsKKwkJfSBlbHNlCisJCQlwcml2LT5taWJbaV0gPSBOVUxMOworCX0KKworCWluaXRfcndzZW0oJnByaXYtPm1pYl9zZW0pOworCXByaXNtNTRfbWliX2luaXQocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbWd0X2NsZWFuKGlzbHBjaV9wcml2YXRlICpwcml2KQoreworCWludCBpOworCisJaWYgKCFwcml2LT5taWIpCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgT0lEX05VTV9MQVNUOyBpKyspCisJCWlmIChwcml2LT5taWJbaV0pIHsKKwkJCWtmcmVlKHByaXYtPm1pYltpXSk7CisJCQlwcml2LT5taWJbaV0gPSBOVUxMOworCQl9CisJa2ZyZWUocHJpdi0+bWliKTsKKwlwcml2LT5taWIgPSBOVUxMOworfQorCit2b2lkCittZ3RfbGVfdG9fY3B1KGludCB0eXBlLCB2b2lkICpkYXRhKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgT0lEX1RZUEVfVTMyOgorCQkqKHUzMiAqKSBkYXRhID0gbGUzMl90b19jcHUoKih1MzIgKikgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgT0lEX1RZUEVfQlVGRkVSOnsKKwkJCXN0cnVjdCBvYmpfYnVmZmVyICpidWZmID0gZGF0YTsKKwkJCWJ1ZmYtPnNpemUgPSBsZTMyX3RvX2NwdShidWZmLT5zaXplKTsKKwkJCWJ1ZmYtPmFkZHIgPSBsZTMyX3RvX2NwdShidWZmLT5hZGRyKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBPSURfVFlQRV9CU1M6eworCQkJc3RydWN0IG9ial9ic3MgKmJzcyA9IGRhdGE7CisJCQlic3MtPmFnZSA9IGxlMTZfdG9fY3B1KGJzcy0+YWdlKTsKKwkJCWJzcy0+Y2hhbm5lbCA9IGxlMTZfdG9fY3B1KGJzcy0+Y2hhbm5lbCk7CisJCQlic3MtPmNhcGluZm8gPSBsZTE2X3RvX2NwdShic3MtPmNhcGluZm8pOworCQkJYnNzLT5yYXRlcyA9IGxlMTZfdG9fY3B1KGJzcy0+cmF0ZXMpOworCQkJYnNzLT5iYXNpY19yYXRlcyA9IGxlMTZfdG9fY3B1KGJzcy0+YmFzaWNfcmF0ZXMpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIE9JRF9UWVBFX0JTU0xJU1Q6eworCQkJc3RydWN0IG9ial9ic3NsaXN0ICpsaXN0ID0gZGF0YTsKKwkJCWludCBpOworCQkJbGlzdC0+bnIgPSBsZTMyX3RvX2NwdShsaXN0LT5ucik7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGlzdC0+bnI7IGkrKykKKwkJCQltZ3RfbGVfdG9fY3B1KE9JRF9UWVBFX0JTUywgJmxpc3QtPmJzc2xpc3RbaV0pOworCQkJYnJlYWs7CisJCX0KKwljYXNlIE9JRF9UWVBFX0ZSRVFVRU5DSUVTOnsKKwkJCXN0cnVjdCBvYmpfZnJlcXVlbmNpZXMgKmZyZXEgPSBkYXRhOworCQkJaW50IGk7CisJCQlmcmVxLT5uciA9IGxlMTZfdG9fY3B1KGZyZXEtPm5yKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBmcmVxLT5ucjsgaSsrKQorCQkJCWZyZXEtPm1oeltpXSA9IGxlMTZfdG9fY3B1KGZyZXEtPm1oeltpXSk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgT0lEX1RZUEVfTUxNRTp7CisJCQlzdHJ1Y3Qgb2JqX21sbWUgKm1sbWUgPSBkYXRhOworCQkJbWxtZS0+aWQgPSBsZTE2X3RvX2NwdShtbG1lLT5pZCk7CisJCQltbG1lLT5zdGF0ZSA9IGxlMTZfdG9fY3B1KG1sbWUtPnN0YXRlKTsKKwkJCW1sbWUtPmNvZGUgPSBsZTE2X3RvX2NwdShtbG1lLT5jb2RlKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBPSURfVFlQRV9NTE1FRVg6eworCQkJc3RydWN0IG9ial9tbG1lZXggKm1sbWUgPSBkYXRhOworCQkJbWxtZS0+aWQgPSBsZTE2X3RvX2NwdShtbG1lLT5pZCk7CisJCQltbG1lLT5zdGF0ZSA9IGxlMTZfdG9fY3B1KG1sbWUtPnN0YXRlKTsKKwkJCW1sbWUtPmNvZGUgPSBsZTE2X3RvX2NwdShtbG1lLT5jb2RlKTsKKwkJCW1sbWUtPnNpemUgPSBsZTE2X3RvX2NwdShtbG1lLT5zaXplKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBPSURfVFlQRV9BVFRBQ0g6eworCQkJc3RydWN0IG9ial9hdHRhY2htZW50ICphdHRhY2ggPSBkYXRhOworCQkJYXR0YWNoLT5pZCA9IGxlMTZfdG9fY3B1KGF0dGFjaC0+aWQpOworCQkJYXR0YWNoLT5zaXplID0gbGUxNl90b19jcHUoYXR0YWNoLT5zaXplKTs7IAorCQkJYnJlYWs7CisJfQorCWNhc2UgT0lEX1RZUEVfU1NJRDoKKwljYXNlIE9JRF9UWVBFX0tFWToKKwljYXNlIE9JRF9UWVBFX0FERFI6CisJY2FzZSBPSURfVFlQRV9SQVc6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KK30KKworc3RhdGljIHZvaWQKK21ndF9jcHVfdG9fbGUoaW50IHR5cGUsIHZvaWQgKmRhdGEpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBPSURfVFlQRV9VMzI6CisJCSoodTMyICopIGRhdGEgPSBjcHVfdG9fbGUzMigqKHUzMiAqKSBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBPSURfVFlQRV9CVUZGRVI6eworCQkJc3RydWN0IG9ial9idWZmZXIgKmJ1ZmYgPSBkYXRhOworCQkJYnVmZi0+c2l6ZSA9IGNwdV90b19sZTMyKGJ1ZmYtPnNpemUpOworCQkJYnVmZi0+YWRkciA9IGNwdV90b19sZTMyKGJ1ZmYtPmFkZHIpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIE9JRF9UWVBFX0JTUzp7CisJCQlzdHJ1Y3Qgb2JqX2JzcyAqYnNzID0gZGF0YTsKKwkJCWJzcy0+YWdlID0gY3B1X3RvX2xlMTYoYnNzLT5hZ2UpOworCQkJYnNzLT5jaGFubmVsID0gY3B1X3RvX2xlMTYoYnNzLT5jaGFubmVsKTsKKwkJCWJzcy0+Y2FwaW5mbyA9IGNwdV90b19sZTE2KGJzcy0+Y2FwaW5mbyk7CisJCQlic3MtPnJhdGVzID0gY3B1X3RvX2xlMTYoYnNzLT5yYXRlcyk7CisJCQlic3MtPmJhc2ljX3JhdGVzID0gY3B1X3RvX2xlMTYoYnNzLT5iYXNpY19yYXRlcyk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgT0lEX1RZUEVfQlNTTElTVDp7CisJCQlzdHJ1Y3Qgb2JqX2Jzc2xpc3QgKmxpc3QgPSBkYXRhOworCQkJaW50IGk7CisJCQlsaXN0LT5uciA9IGNwdV90b19sZTMyKGxpc3QtPm5yKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBsaXN0LT5ucjsgaSsrKQorCQkJCW1ndF9jcHVfdG9fbGUoT0lEX1RZUEVfQlNTLCAmbGlzdC0+YnNzbGlzdFtpXSk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgT0lEX1RZUEVfRlJFUVVFTkNJRVM6eworCQkJc3RydWN0IG9ial9mcmVxdWVuY2llcyAqZnJlcSA9IGRhdGE7CisJCQlpbnQgaTsKKwkJCWZyZXEtPm5yID0gY3B1X3RvX2xlMTYoZnJlcS0+bnIpOworCQkJZm9yIChpID0gMDsgaSA8IGZyZXEtPm5yOyBpKyspCisJCQkJZnJlcS0+bWh6W2ldID0gY3B1X3RvX2xlMTYoZnJlcS0+bWh6W2ldKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBPSURfVFlQRV9NTE1FOnsKKwkJCXN0cnVjdCBvYmpfbWxtZSAqbWxtZSA9IGRhdGE7CisJCQltbG1lLT5pZCA9IGNwdV90b19sZTE2KG1sbWUtPmlkKTsKKwkJCW1sbWUtPnN0YXRlID0gY3B1X3RvX2xlMTYobWxtZS0+c3RhdGUpOworCQkJbWxtZS0+Y29kZSA9IGNwdV90b19sZTE2KG1sbWUtPmNvZGUpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIE9JRF9UWVBFX01MTUVFWDp7CisJCQlzdHJ1Y3Qgb2JqX21sbWVleCAqbWxtZSA9IGRhdGE7CisJCQltbG1lLT5pZCA9IGNwdV90b19sZTE2KG1sbWUtPmlkKTsKKwkJCW1sbWUtPnN0YXRlID0gY3B1X3RvX2xlMTYobWxtZS0+c3RhdGUpOworCQkJbWxtZS0+Y29kZSA9IGNwdV90b19sZTE2KG1sbWUtPmNvZGUpOworCQkJbWxtZS0+c2l6ZSA9IGNwdV90b19sZTE2KG1sbWUtPnNpemUpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIE9JRF9UWVBFX0FUVEFDSDp7CisJCQlzdHJ1Y3Qgb2JqX2F0dGFjaG1lbnQgKmF0dGFjaCA9IGRhdGE7CisJCQlhdHRhY2gtPmlkID0gY3B1X3RvX2xlMTYoYXR0YWNoLT5pZCk7CisJCQlhdHRhY2gtPnNpemUgPSBjcHVfdG9fbGUxNihhdHRhY2gtPnNpemUpOzsgCisJCQlicmVhazsKKwl9CisJY2FzZSBPSURfVFlQRV9TU0lEOgorCWNhc2UgT0lEX1RZUEVfS0VZOgorCWNhc2UgT0lEX1RZUEVfQUREUjoKKwljYXNlIE9JRF9UWVBFX1JBVzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCisvKiBOb3RlIDogZGF0YSBpcyBtb2RpZmllZCBkdXJpbmcgdGhpcyBmdW5jdGlvbiAqLworCitpbnQKK21ndF9zZXRfcmVxdWVzdChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgZW51bSBvaWRfbnVtX3QgbiwgaW50IGV4dHJhLCB2b2lkICpkYXRhKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBpc2xwY2lfbWdtdGZyYW1lICpyZXNwb25zZSA9IE5VTEw7CisJaW50IHJlc3BvbnNlX29wID0gUElNRk9SX09QX0VSUk9SOworCWludCBkbGVuOworCXZvaWQgKmNhY2hlLCAqX2RhdGEgPSBkYXRhOworCXUzMiBvaWQ7CisKKwlCVUdfT04oT0lEX05VTV9MQVNUIDw9IG4pOworCUJVR19PTihleHRyYSA+IGlzbF9vaWRbbl0ucmFuZ2UpOworCisJaWYgKCFwcml2LT5taWIpCisJCS8qIG1lbW9yeSBoYXMgYmVlbiBmcmVlZCAqLworCQlyZXR1cm4gLTE7CisKKwlkbGVuID0gaXNsX29pZFtuXS5zaXplOworCWNhY2hlID0gcHJpdi0+bWliW25dOworCWNhY2hlICs9IChjYWNoZSA/IGV4dHJhICogZGxlbiA6IDApOworCW9pZCA9IGlzbF9vaWRbbl0ub2lkICsgZXh0cmE7CisKKwlpZiAoX2RhdGEgPT0gTlVMTCkKKwkJLyogd2UgYXJlIHJlcXVlc3RlZCB0byByZS1zZXQgYSBjYWNoZWQgdmFsdWUgKi8KKwkJX2RhdGEgPSBjYWNoZTsKKwllbHNlCisJCW1ndF9jcHVfdG9fbGUoaXNsX29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUsIF9kYXRhKTsKKwkvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gd3JpdGUgdG8gdGhlIGNhY2hlLCB3ZSBkb24ndCB3YW50IGFueW9uZSB0byByZWFkCisJICogaXQgLT4gYWNxdWlyZSB3cml0ZSBsb2NrLgorCSAqIEVsc2Ugd2UgY291bGQgYWNxdWlyZSBhIHJlYWQgbG9jayB0byBiZSBzdXJlIHdlIGRvbid0IGJvdGhlciB0aGUKKwkgKiBjb21taXQgcHJvY2VzcyAod2hpY2ggdGFrZXMgYSB3cml0ZSBsb2NrKS4gQnV0IEknbSBub3Qgc3VyZSBpZiBpdCdzCisJICogbmVlZGVkLgorCSAqLworCWlmIChjYWNoZSkKKwkJZG93bl93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSA+PSBQUlZfU1RBVEVfUkVBRFkpIHsKKwkJcmV0ID0gaXNscGNpX21ndF90cmFuc2FjdGlvbihwcml2LT5uZGV2LCBQSU1GT1JfT1BfU0VULCBvaWQsCisJCQkJCSAgICAgX2RhdGEsIGRsZW4sICZyZXNwb25zZSk7CisJCWlmICghcmV0KSB7CisJCQlyZXNwb25zZV9vcCA9IHJlc3BvbnNlLT5oZWFkZXItPm9wZXJhdGlvbjsKKwkJCWlzbHBjaV9tZ3RfcmVsZWFzZShyZXNwb25zZSk7CisJCX0KKwkJaWYgKHJldCB8fCByZXNwb25zZV9vcCA9PSBQSU1GT1JfT1BfRVJST1IpCisJCQlyZXQgPSAtRUlPOworCX0gZWxzZSBpZiAoIWNhY2hlKQorCQlyZXQgPSAtRUlPOworCisJaWYgKGNhY2hlKSB7CisJCWlmICghcmV0ICYmIGRhdGEpCisJCQltZW1jcHkoY2FjaGUsIF9kYXRhLCBkbGVuKTsKKwkJdXBfd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCX0KKworCS8qIHJlLXNldCBnaXZlbiBkYXRhIHRvIHdoYXQgaXQgd2FzICovCisJaWYgKGRhdGEpCisJCW1ndF9sZV90b19jcHUoaXNsX29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUsIGRhdGEpOworCisJcmV0dXJuIHJldDsKK30KKworLyogTm9uZSBvZiB0aGVzZSBhcmUgY2FjaGVkICovCitpbnQKK21ndF9zZXRfdmFybGVuKGlzbHBjaV9wcml2YXRlICpwcml2LCBlbnVtIG9pZF9udW1fdCBuLCB2b2lkICpkYXRhLCBpbnQgZXh0cmFfbGVuKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBpc2xwY2lfbWdtdGZyYW1lICpyZXNwb25zZTsKKwlpbnQgcmVzcG9uc2Vfb3AgPSBQSU1GT1JfT1BfRVJST1I7CisJaW50IGRsZW47CisJdTMyIG9pZDsKKworCUJVR19PTihPSURfTlVNX0xBU1QgPD0gbik7CisKKwlkbGVuID0gaXNsX29pZFtuXS5zaXplOworCW9pZCA9IGlzbF9vaWRbbl0ub2lkOworCisJbWd0X2NwdV90b19sZShpc2xfb2lkW25dLmZsYWdzICYgT0lEX0ZMQUdfVFlQRSwgZGF0YSk7CisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSA+PSBQUlZfU1RBVEVfUkVBRFkpIHsKKwkJcmV0ID0gaXNscGNpX21ndF90cmFuc2FjdGlvbihwcml2LT5uZGV2LCBQSU1GT1JfT1BfU0VULCBvaWQsCisJCQkJCSAgICAgZGF0YSwgZGxlbiArIGV4dHJhX2xlbiwgJnJlc3BvbnNlKTsKKwkJaWYgKCFyZXQpIHsKKwkJCXJlc3BvbnNlX29wID0gcmVzcG9uc2UtPmhlYWRlci0+b3BlcmF0aW9uOworCQkJaXNscGNpX21ndF9yZWxlYXNlKHJlc3BvbnNlKTsKKwkJfQorCQlpZiAocmV0IHx8IHJlc3BvbnNlX29wID09IFBJTUZPUl9PUF9FUlJPUikKKwkJCXJldCA9IC1FSU87CisJfSBlbHNlIAorCQlyZXQgPSAtRUlPOworCisJLyogcmUtc2V0IGdpdmVuIGRhdGEgdG8gd2hhdCBpdCB3YXMgKi8KKwlpZiAoZGF0YSkKKwkJbWd0X2xlX3RvX2NwdShpc2xfb2lkW25dLmZsYWdzICYgT0lEX0ZMQUdfVFlQRSwgZGF0YSk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK21ndF9nZXRfcmVxdWVzdChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgZW51bSBvaWRfbnVtX3QgbiwgaW50IGV4dHJhLCB2b2lkICpkYXRhLAorCQl1bmlvbiBvaWRfcmVzX3QgKnJlcykKK3sKKworCWludCByZXQgPSAtRUlPOworCWludCByZXNsZW4gPSAwOworCXN0cnVjdCBpc2xwY2lfbWdtdGZyYW1lICpyZXNwb25zZSA9IE5VTEw7CisKKwlpbnQgZGxlbjsKKwl2b2lkICpjYWNoZSwgKl9yZXMgPSBOVUxMOworCXUzMiBvaWQ7CisKKwlCVUdfT04oT0lEX05VTV9MQVNUIDw9IG4pOworCUJVR19PTihleHRyYSA+IGlzbF9vaWRbbl0ucmFuZ2UpOworCisJcmVzLT5wdHIgPSBOVUxMOworCisJaWYgKCFwcml2LT5taWIpCisJCS8qIG1lbW9yeSBoYXMgYmVlbiBmcmVlZCAqLworCQlyZXR1cm4gLTE7CisKKwlkbGVuID0gaXNsX29pZFtuXS5zaXplOworCWNhY2hlID0gcHJpdi0+bWliW25dOworCWNhY2hlICs9IGNhY2hlID8gZXh0cmEgKiBkbGVuIDogMDsKKwlvaWQgPSBpc2xfb2lkW25dLm9pZCArIGV4dHJhOworCXJlc2xlbiA9IGRsZW47CisKKwlpZiAoY2FjaGUpCisJCWRvd25fcmVhZCgmcHJpdi0+bWliX3NlbSk7CisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSA+PSBQUlZfU1RBVEVfUkVBRFkpIHsKKwkJcmV0ID0gaXNscGNpX21ndF90cmFuc2FjdGlvbihwcml2LT5uZGV2LCBQSU1GT1JfT1BfR0VULAorCQkJCQkgICAgIG9pZCwgZGF0YSwgZGxlbiwgJnJlc3BvbnNlKTsKKwkJaWYgKHJldCB8fCAhcmVzcG9uc2UgfHwKKwkJICAgIHJlc3BvbnNlLT5oZWFkZXItPm9wZXJhdGlvbiA9PSBQSU1GT1JfT1BfRVJST1IpIHsKKwkJCWlmIChyZXNwb25zZSkKKwkJCQlpc2xwY2lfbWd0X3JlbGVhc2UocmVzcG9uc2UpOworCQkJcmV0ID0gLUVJTzsKKwkJfQorCQlpZiAoIXJldCkgeworCQkJX3JlcyA9IHJlc3BvbnNlLT5kYXRhOworCQkJcmVzbGVuID0gcmVzcG9uc2UtPmhlYWRlci0+bGVuZ3RoOworCQl9CisJfSBlbHNlIGlmIChjYWNoZSkgeworCQlfcmVzID0gY2FjaGU7CisJCXJldCA9IDA7CisJfQorCWlmICgoaXNsX29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUpID09IE9JRF9UWVBFX1UzMikKKwkJcmVzLT51ID0gcmV0ID8gMCA6IGxlMzJfdG9fY3B1KCoodTMyICopIF9yZXMpOworCWVsc2UgeworCQlyZXMtPnB0ciA9IGttYWxsb2MocmVzbGVuLCBHRlBfS0VSTkVMKTsKKwkJQlVHX09OKHJlcy0+cHRyID09IE5VTEwpOworCQlpZiAocmV0KQorCQkJbWVtc2V0KHJlcy0+cHRyLCAwLCByZXNsZW4pOworCQllbHNlIHsKKwkJCW1lbWNweShyZXMtPnB0ciwgX3JlcywgcmVzbGVuKTsKKwkJCW1ndF9sZV90b19jcHUoaXNsX29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUsCisJCQkJICAgICAgcmVzLT5wdHIpOworCQl9CisJfQorCWlmIChjYWNoZSkKKwkJdXBfcmVhZCgmcHJpdi0+bWliX3NlbSk7CisKKwlpZiAocmVzcG9uc2UgJiYgIXJldCkKKwkJaXNscGNpX21ndF9yZWxlYXNlKHJlc3BvbnNlKTsKKworCWlmIChyZXNsZW4gPiBpc2xfb2lkW25dLnNpemUpCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAibWd0X2dldF9yZXF1ZXN0KDB4JXgpOiByZWNlaXZlZCBkYXRhIGxlbmd0aCB3YXMgYmlnZ2VyICIKKwkJICAgICAgICJ0aGFuIGV4cGVjdGVkICglZCA+ICVkKS4gTWVtb3J5IGlzIHByb2JhYmx5IGNvcnJ1cHRlZC4uLiIsCisJCSAgICAgICBvaWQsIHJlc2xlbiwgaXNsX29pZFtuXS5zaXplKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIGxvY2sgb3V0c2lkZSAqLworaW50CittZ3RfY29tbWl0X2xpc3QoaXNscGNpX3ByaXZhdGUgKnByaXYsIGVudW0gb2lkX251bV90ICpsLCBpbnQgbikKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKwlzdHJ1Y3QgaXNscGNpX21nbXRmcmFtZSAqcmVzcG9uc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCXN0cnVjdCBvaWRfdCAqdCA9ICYoaXNsX29pZFtsW2ldXSk7CisJCXZvaWQgKmRhdGEgPSBwcml2LT5taWJbbFtpXV07CisJCWludCBqID0gMDsKKwkJdTMyIG9pZCA9IHQtPm9pZDsKKwkJQlVHX09OKGRhdGEgPT0gTlVMTCk7CisJCXdoaWxlIChqIDw9IHQtPnJhbmdlKSB7CisJCQlpbnQgciA9IGlzbHBjaV9tZ3RfdHJhbnNhY3Rpb24ocHJpdi0+bmRldiwgUElNRk9SX09QX1NFVCwKKwkJCQkJCSAgICAgIG9pZCwgZGF0YSwgdC0+c2l6ZSwKKwkJCQkJCSAgICAgICZyZXNwb25zZSk7CisJCQlpZiAocmVzcG9uc2UpIHsKKwkJCQlyIHw9IChyZXNwb25zZS0+aGVhZGVyLT5vcGVyYXRpb24gPT0gUElNRk9SX09QX0VSUk9SKTsKKwkJCQlpc2xwY2lfbWd0X3JlbGVhc2UocmVzcG9uc2UpOworCQkJfQorCQkJaWYgKHIpCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbWd0X2NvbW1pdF9saXN0OiBmYWlsdXJlLiAiCisJCQkJCSJvaWQ9JTA4eCBlcnI9JWRcbiIsCisJCQkJCXByaXYtPm5kZXYtPm5hbWUsIG9pZCwgcik7CisJCQlyZXQgfD0gcjsKKwkJCWorKzsKKwkJCW9pZCsrOworCQkJZGF0YSArPSB0LT5zaXplOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIExvY2sgb3V0c2lkZSAqLworCit2b2lkCittZ3Rfc2V0KGlzbHBjaV9wcml2YXRlICpwcml2LCBlbnVtIG9pZF9udW1fdCBuLCB2b2lkICpkYXRhKQoreworCUJVR19PTihPSURfTlVNX0xBU1QgPD0gbik7CisJQlVHX09OKHByaXYtPm1pYltuXSA9PSBOVUxMKTsKKworCW1lbWNweShwcml2LT5taWJbbl0sIGRhdGEsIGlzbF9vaWRbbl0uc2l6ZSk7CisJbWd0X2NwdV90b19sZShpc2xfb2lkW25dLmZsYWdzICYgT0lEX0ZMQUdfVFlQRSwgcHJpdi0+bWliW25dKTsKK30KKwordm9pZAorbWd0X2dldChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgZW51bSBvaWRfbnVtX3Qgbiwgdm9pZCAqcmVzKQoreworCUJVR19PTihPSURfTlVNX0xBU1QgPD0gbik7CisJQlVHX09OKHByaXYtPm1pYltuXSA9PSBOVUxMKTsKKwlCVUdfT04ocmVzID09IE5VTEwpOworCisJbWVtY3B5KHJlcywgcHJpdi0+bWliW25dLCBpc2xfb2lkW25dLnNpemUpOworCW1ndF9sZV90b19jcHUoaXNsX29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUsIHJlcyk7Cit9CisKKy8qIENvbW1pdHMgdGhlIGNhY2hlLiBMb2NrIG91dHNpZGUuICovCisKK3N0YXRpYyBlbnVtIG9pZF9udW1fdCBjb21taXRfcGFydDFbXSA9IHsKKwlPSURfSU5MX0NPTkZJRywKKwlPSURfSU5MX01PREUsCisJRE9UMTFfT0lEX0JTU1RZUEUsCisJRE9UMTFfT0lEX0NIQU5ORUwsCisJRE9UMTFfT0lEX01MTUVBVVRPTEVWRUwKK307CisKK3N0YXRpYyBlbnVtIG9pZF9udW1fdCBjb21taXRfcGFydDJbXSA9IHsKKwlET1QxMV9PSURfU1NJRCwKKwlET1QxMV9PSURfUFNNQlVGRkVSLAorCURPVDExX09JRF9BVVRIRU5BQkxFLAorCURPVDExX09JRF9QUklWQUNZSU5WT0tFRCwKKwlET1QxMV9PSURfRVhVTkVOQ1JZUFRFRCwKKwlET1QxMV9PSURfREVGS0VZWCwJLyogTVVMVElQTEUgKi8KKwlET1QxMV9PSURfREVGS0VZSUQsCisJRE9UMTFfT0lEX0RPVDFYRU5BQkxFLAorCU9JRF9JTkxfRE9UMTFEX0NPTkZPUk1BTkNFLAorCS8qIERvIG5vdCBpbml0aWFsaXplIHRoaXMgLSBmdyA8IDEuMC40LjMgcmVqZWN0cyBpdAorCU9JRF9JTkxfT1VUUFVUUE9XRVIsCisJKi8KK307CisKKy8qIHVwZGF0ZSB0aGUgTUFDIGFkZHIuICovCitzdGF0aWMgaW50CittZ3RfdXBkYXRlX2FkZHIoaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKnJlczsKKwlpbnQgcmV0OworCisJcmV0ID0gaXNscGNpX21ndF90cmFuc2FjdGlvbihwcml2LT5uZGV2LCBQSU1GT1JfT1BfR0VULAorCQkJCSAgICAgaXNsX29pZFtHRU5fT0lEX01BQ0FERFJFU1NdLm9pZCwgTlVMTCwKKwkJCQkgICAgIGlzbF9vaWRbR0VOX09JRF9NQUNBRERSRVNTXS5zaXplLCAmcmVzKTsKKworCWlmICgocmV0ID09IDApICYmIHJlcyAmJiAocmVzLT5oZWFkZXItPm9wZXJhdGlvbiAhPSBQSU1GT1JfT1BfRVJST1IpKQorCQltZW1jcHkocHJpdi0+bmRldi0+ZGV2X2FkZHIsIHJlcy0+ZGF0YSwgNik7CisJZWxzZQorCQlyZXQgPSAtRUlPOworCWlmIChyZXMpCisJCWlzbHBjaV9tZ3RfcmVsZWFzZShyZXMpOworCisJaWYgKHJldCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogbWd0X3VwZGF0ZV9hZGRyOiBmYWlsdXJlXG4iLCBwcml2LT5uZGV2LT5uYW1lKTsKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFZFQ19TSVpFKGEpIChzaXplb2YoYSkvc2l6ZW9mKGFbMF0pKQorCitpbnQKK21ndF9jb21taXQoaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJaW50IHJ2YWx1ZTsKKwl1MzIgdTsKKworCWlmIChpc2xwY2lfZ2V0X3N0YXRlKHByaXYpIDwgUFJWX1NUQVRFX0lOSVQpCisJCXJldHVybiAwOworCisJcnZhbHVlID0gbWd0X2NvbW1pdF9saXN0KHByaXYsIGNvbW1pdF9wYXJ0MSwgVkVDX1NJWkUoY29tbWl0X3BhcnQxKSk7CisKKwlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX01PTklUT1IpCisJCXJ2YWx1ZSB8PSBtZ3RfY29tbWl0X2xpc3QocHJpdiwgY29tbWl0X3BhcnQyLCBWRUNfU0laRShjb21taXRfcGFydDIpKTsKKworCXUgPSBPSURfSU5MX01PREU7CisJcnZhbHVlIHw9IG1ndF9jb21taXRfbGlzdChwcml2LCAmdSwgMSk7CisJcnZhbHVlIHw9IG1ndF91cGRhdGVfYWRkcihwcml2KTsKKworCWlmIChydmFsdWUpIHsKKwkJLyogc29tZSByZXF1ZXN0IGhhdmUgZmFpbGVkLiBUaGUgZGV2aWNlIG1pZ2h0IGJlIGluIGFuCisJCSAgIGluY29oZXJlbnQgc3RhdGUuIFdlIHNob3VsZCByZXNldCBpdCAhICovCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogbWd0X2NvbW1pdDogZmFpbHVyZVxuIiwgcHJpdi0+bmRldi0+bmFtZSk7CisJfQorCXJldHVybiBydmFsdWU7Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgT0lEcyBuZWVkIHRvIGJlICJ1bmxhdGNoZWQiOgorICoKKyAqIE1FRElVTUxJTUlULEJFQUNPTlBFUklPRCxEVElNUEVSSU9ELEFUSU1XSU5ET1csTElTVEVOSU5URVJWQUwKKyAqIEZSRVFVRU5DWSxFWFRFTkRFRFJBVEVTLgorICoKKyAqIFRoZSB3YXkgdG8gZG8gdGhpcyBpcyB0byBzZXQgRVNTSUQuIE5vdGUgdGhvdWdoIHRoYXQgdGhleSBtYXkgZ2V0IAorICogdW5sYXRjaCBiZWZvcmUgdGhvdWdoIGJ5IHNldHRpbmcgYW5vdGhlciBPSUQuICovCisjaWYgMAordm9pZAorbWd0X3VubGF0Y2hfYWxsKGlzbHBjaV9wcml2YXRlICpwcml2KQoreworCXUzMiB1OworCWludCBydmFsdWUgPSAwOworCisJaWYgKGlzbHBjaV9nZXRfc3RhdGUocHJpdikgPCBQUlZfU1RBVEVfSU5JVCkKKwkJcmV0dXJuOworCisJdSA9IERPVDExX09JRF9TU0lEOworCXJ2YWx1ZSA9IG1ndF9jb21taXRfbGlzdChwcml2LCAmdSwgMSk7CisJLyogTmVjZXNzYXJ5IGlmIGluIE1BTlVBTCBSVU4gbW9kZT8gKi8KKyNpZiAwCisJdSA9IE9JRF9JTkxfTU9ERTsKKwlydmFsdWUgfD0gbWd0X2NvbW1pdF9saXN0KHByaXYsICZ1LCAxKTsKKworCXUgPSBET1QxMV9PSURfTUxNRUFVVE9MRVZFTDsKKwlydmFsdWUgfD0gbWd0X2NvbW1pdF9saXN0KHByaXYsICZ1LCAxKTsKKworCXUgPSBPSURfSU5MX01PREU7CisJcnZhbHVlIHw9IG1ndF9jb21taXRfbGlzdChwcml2LCAmdSwgMSk7CisjZW5kaWYKKworCWlmIChydmFsdWUpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogVW5sYXRjaGluZyBPSURzIGZhaWxlZFxuIiwgcHJpdi0+bmRldi0+bmFtZSk7Cit9CisjZW5kaWYKKworLyogVGhpcyB3aWxsIHRlbGwgeW91IGlmIHlvdSBhcmUgYWxsb3dlZCB0byBhbnN3ZXIgYSBtbG1lKGV4KSByZXF1ZXN0IC4qLworCitpbnQKK21ndF9tbG1lX2Fuc3dlcihpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwl1MzIgbWxtZWF1dG9sZXZlbDsKKwkvKiBBY3F1aXJlIGEgcmVhZCBsb2NrIGJlY2F1c2UgaWYgd2UgYXJlIGluIGEgbW9kZSBjaGFuZ2UsIGl0J3MKKwkgKiBwb3NzaWJsZSB0byBhbnN3ZXIgdHJ1ZSwgd2hpbGUgdGhlIGNhcmQgaXMgbGVhdmluZyBtYXN0ZXIgdG8gbWFuYWdlZAorCSAqIG1vZGUuIEFuc3dlcmluZyB0byBhIG1sbWUgaW4gdGhpcyBzaXR1YXRpb24gY291bGQgaGFuZyB0aGUgY2FyZC4KKwkgKi8KKwlkb3duX3JlYWQoJnByaXYtPm1pYl9zZW0pOworCW1sbWVhdXRvbGV2ZWwgPQorCSAgICBsZTMyX3RvX2NwdSgqKHUzMiAqKSBwcml2LT5taWJbRE9UMTFfT0lEX01MTUVBVVRPTEVWRUxdKTsKKwl1cF9yZWFkKCZwcml2LT5taWJfc2VtKTsKKworCXJldHVybiAoKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpICYmCisJCShtbG1lYXV0b2xldmVsID49IERPVDExX01MTUVfSU5URVJNRURJQVRFKSk7Cit9CisKK2VudW0gb2lkX251bV90CittZ3Rfb2lkdG9udW0odTMyIG9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBPSURfTlVNX0xBU1Q7IGkrKykKKwkJaWYgKGlzbF9vaWRbaV0ub2lkID09IG9pZCkKKwkJCXJldHVybiBpOworCisJcHJpbnRrKEtFUk5fREVCVUcgImxvb2tpbmcgZm9yIGFuIHVua25vd24gb2lkIDB4JXgiLCBvaWQpOworCisJcmV0dXJuIE9JRF9OVU1fTEFTVDsKK30KKworaW50CittZ3RfcmVzcG9uc2VfdG9fc3RyKGVudW0gb2lkX251bV90IG4sIHVuaW9uIG9pZF9yZXNfdCAqciwgY2hhciAqc3RyKQoreworCXN3aXRjaCAoaXNsX29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUpIHsKKwljYXNlIE9JRF9UWVBFX1UzMjoKKwkJcmV0dXJuIHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwgIiV1XG4iLCByLT51KTsKKwkJYnJlYWs7CisJY2FzZSBPSURfVFlQRV9CVUZGRVI6eworCQkJc3RydWN0IG9ial9idWZmZXIgKmJ1ZmYgPSByLT5wdHI7CisJCQlyZXR1cm4gc25wcmludGYoc3RyLCBQUklWX1NUUl9TSVpFLAorCQkJCQkic2l6ZT0ldVxuYWRkcj0weCVYXG4iLCBidWZmLT5zaXplLAorCQkJCQlidWZmLT5hZGRyKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX0JTUzp7CisJCQlzdHJ1Y3Qgb2JqX2JzcyAqYnNzID0gci0+cHRyOworCQkJcmV0dXJuIHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwKKwkJCQkJImFnZT0ldVxuY2hhbm5lbD0ldVxuIgorCQkJCQkiY2FwaW5mbz0weCVYXG5yYXRlcz0weCVYXG4iCisJCQkJCSJiYXNpY19yYXRlcz0weCVYXG4iLCBic3MtPmFnZSwKKwkJCQkJYnNzLT5jaGFubmVsLCBic3MtPmNhcGluZm8sCisJCQkJCWJzcy0+cmF0ZXMsIGJzcy0+YmFzaWNfcmF0ZXMpOworCQl9CisJCWJyZWFrOworCWNhc2UgT0lEX1RZUEVfQlNTTElTVDp7CisJCQlzdHJ1Y3Qgb2JqX2Jzc2xpc3QgKmxpc3QgPSByLT5wdHI7CisJCQlpbnQgaSwgazsKKwkJCWsgPSBzbnByaW50ZihzdHIsIFBSSVZfU1RSX1NJWkUsICJucj0ldVxuIiwgbGlzdC0+bnIpOworCQkJZm9yIChpID0gMDsgaSA8IGxpc3QtPm5yOyBpKyspCisJCQkJayArPSBzbnByaW50ZihzdHIgKyBrLCBQUklWX1NUUl9TSVpFIC0gaywKKwkJCQkJICAgICAgImJzc1sldV0gOiBcbmFnZT0ldVxuY2hhbm5lbD0ldVxuIgorCQkJCQkgICAgICAiY2FwaW5mbz0weCVYXG5yYXRlcz0weCVYXG4iCisJCQkJCSAgICAgICJiYXNpY19yYXRlcz0weCVYXG4iLAorCQkJCQkgICAgICBpLCBsaXN0LT5ic3NsaXN0W2ldLmFnZSwKKwkJCQkJICAgICAgbGlzdC0+YnNzbGlzdFtpXS5jaGFubmVsLAorCQkJCQkgICAgICBsaXN0LT5ic3NsaXN0W2ldLmNhcGluZm8sCisJCQkJCSAgICAgIGxpc3QtPmJzc2xpc3RbaV0ucmF0ZXMsCisJCQkJCSAgICAgIGxpc3QtPmJzc2xpc3RbaV0uYmFzaWNfcmF0ZXMpOworCQkJcmV0dXJuIGs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBPSURfVFlQRV9GUkVRVUVOQ0lFUzp7CisJCQlzdHJ1Y3Qgb2JqX2ZyZXF1ZW5jaWVzICpmcmVxID0gci0+cHRyOworCQkJaW50IGksIHQ7CisJCQlwcmludGsoIm5yIDogJXVcbiIsIGZyZXEtPm5yKTsKKwkJCXQgPSBzbnByaW50ZihzdHIsIFBSSVZfU1RSX1NJWkUsICJucj0ldVxuIiwgZnJlcS0+bnIpOworCQkJZm9yIChpID0gMDsgaSA8IGZyZXEtPm5yOyBpKyspCisJCQkJdCArPSBzbnByaW50ZihzdHIgKyB0LCBQUklWX1NUUl9TSVpFIC0gdCwKKwkJCQkJICAgICAgIm1oelsldV09JXVcbiIsIGksIGZyZXEtPm1oeltpXSk7CisJCQlyZXR1cm4gdDsKKwkJfQorCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX01MTUU6eworCQkJc3RydWN0IG9ial9tbG1lICptbG1lID0gci0+cHRyOworCQkJcmV0dXJuIHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwKKwkJCQkJImlkPTB4JVhcbnN0YXRlPTB4JVhcbmNvZGU9MHglWFxuIiwKKwkJCQkJbWxtZS0+aWQsIG1sbWUtPnN0YXRlLCBtbG1lLT5jb2RlKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX01MTUVFWDp7CisJCQlzdHJ1Y3Qgb2JqX21sbWVleCAqbWxtZSA9IHItPnB0cjsKKwkJCXJldHVybiBzbnByaW50ZihzdHIsIFBSSVZfU1RSX1NJWkUsCisJCQkJCSJpZD0weCVYXG5zdGF0ZT0weCVYXG4iCisJCQkJCSJjb2RlPTB4JVhcbnNpemU9MHglWFxuIiwgbWxtZS0+aWQsCisJCQkJCW1sbWUtPnN0YXRlLCBtbG1lLT5jb2RlLCBtbG1lLT5zaXplKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX0FUVEFDSDp7CisJCQlzdHJ1Y3Qgb2JqX2F0dGFjaG1lbnQgKmF0dGFjaCA9IHItPnB0cjsKKwkJCXJldHVybiBzbnByaW50ZihzdHIsIFBSSVZfU1RSX1NJWkUsCisJCQkJCSJpZD0lZFxuc2l6ZT0lZFxuIiwKKwkJCQkJYXR0YWNoLT5pZCwKKwkJCQkJYXR0YWNoLT5zaXplKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX1NTSUQ6eworCQkJc3RydWN0IG9ial9zc2lkICpzc2lkID0gci0+cHRyOworCQkJcmV0dXJuIHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwKKwkJCQkJImxlbmd0aD0ldVxub2N0ZXRzPSUuKnNcbiIsCisJCQkJCXNzaWQtPmxlbmd0aCwgc3NpZC0+bGVuZ3RoLAorCQkJCQlzc2lkLT5vY3RldHMpOworCQl9CisJCWJyZWFrOworCWNhc2UgT0lEX1RZUEVfS0VZOnsKKwkJCXN0cnVjdCBvYmpfa2V5ICprZXkgPSByLT5wdHI7CisJCQlpbnQgdCwgaTsKKwkJCXQgPSBzbnByaW50ZihzdHIsIFBSSVZfU1RSX1NJWkUsCisJCQkJICAgICAidHlwZT0weCVYXG5sZW5ndGg9MHglWFxua2V5PTB4IiwKKwkJCQkgICAgIGtleS0+dHlwZSwga2V5LT5sZW5ndGgpOworCQkJZm9yIChpID0gMDsgaSA8IGtleS0+bGVuZ3RoOyBpKyspCisJCQkJdCArPSBzbnByaW50ZihzdHIgKyB0LCBQUklWX1NUUl9TSVpFIC0gdCwKKwkJCQkJICAgICAgIiUwMlg6Iiwga2V5LT5rZXlbaV0pOworCQkJdCArPSBzbnByaW50ZihzdHIgKyB0LCBQUklWX1NUUl9TSVpFIC0gdCwgIlxuIik7CisJCQlyZXR1cm4gdDsKKwkJfQorCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX1JBVzoKKwljYXNlIE9JRF9UWVBFX0FERFI6eworCQkJdW5zaWduZWQgY2hhciAqYnVmZiA9IHItPnB0cjsKKwkJCWludCB0LCBpOworCQkJdCA9IHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwgImhleCBkYXRhPSIpOworCQkJZm9yIChpID0gMDsgaSA8IGlzbF9vaWRbbl0uc2l6ZTsgaSsrKQorCQkJCXQgKz0gc25wcmludGYoc3RyICsgdCwgUFJJVl9TVFJfU0laRSAtIHQsCisJCQkJCSAgICAgICIlMDJYOiIsIGJ1ZmZbaV0pOworCQkJdCArPSBzbnByaW50ZihzdHIgKyB0LCBQUklWX1NUUl9TSVpFIC0gdCwgIlxuIik7CisJCQlyZXR1cm4gdDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvb2lkX21ndC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzhhMmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwMyBBdXJlbGllbiBBbGxlYXVtZSA8c2x0c0BmcmVlLmZyPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaWYgIWRlZmluZWQoX09JRF9NR1RfSCkKKyNkZWZpbmUgX09JRF9NR1RfSAorCisjaW5jbHVkZSAiaXNsX29pZC5oIgorI2luY2x1ZGUgImlzbHBjaV9kZXYuaCIKKworZXh0ZXJuIHN0cnVjdCBvaWRfdCBpc2xfb2lkW107CisKK2ludCBtZ3RfaW5pdChpc2xwY2lfcHJpdmF0ZSAqKTsKKwordm9pZCBtZ3RfY2xlYW4oaXNscGNpX3ByaXZhdGUgKik7CisKKy8qIEkgZG9uJ3Qga25vdyB3aGVyZSB0byBwdXQgdGhlc2UgMiAqLworZXh0ZXJuIGNvbnN0IGludCBmcmVxdWVuY3lfbGlzdF9hW107CitpbnQgY2hhbm5lbF9vZl9mcmVxKGludCk7CisKK3ZvaWQgbWd0X2xlX3RvX2NwdShpbnQsIHZvaWQgKik7CisKK2ludCBtZ3Rfc2V0X3JlcXVlc3QoaXNscGNpX3ByaXZhdGUgKiwgZW51bSBvaWRfbnVtX3QsIGludCwgdm9pZCAqKTsKK2ludCBtZ3Rfc2V0X3Zhcmxlbihpc2xwY2lfcHJpdmF0ZSAqLCBlbnVtIG9pZF9udW1fdCwgdm9pZCAqLCBpbnQpOworCisKK2ludCBtZ3RfZ2V0X3JlcXVlc3QoaXNscGNpX3ByaXZhdGUgKiwgZW51bSBvaWRfbnVtX3QsIGludCwgdm9pZCAqLAorCQkgICAgdW5pb24gb2lkX3Jlc190ICopOworCitpbnQgbWd0X2NvbW1pdF9saXN0KGlzbHBjaV9wcml2YXRlICosIGVudW0gb2lkX251bV90ICosIGludCk7CisKK3ZvaWQgbWd0X3NldChpc2xwY2lfcHJpdmF0ZSAqLCBlbnVtIG9pZF9udW1fdCwgdm9pZCAqKTsKKwordm9pZCBtZ3RfZ2V0KGlzbHBjaV9wcml2YXRlICosIGVudW0gb2lkX251bV90LCB2b2lkICopOworCitpbnQgbWd0X2NvbW1pdChpc2xwY2lfcHJpdmF0ZSAqKTsKKworaW50IG1ndF9tbG1lX2Fuc3dlcihpc2xwY2lfcHJpdmF0ZSAqKTsKKworZW51bSBvaWRfbnVtX3QgbWd0X29pZHRvbnVtKHUzMiBvaWQpOworCitpbnQgbWd0X3Jlc3BvbnNlX3RvX3N0cihlbnVtIG9pZF9udW1fdCwgdW5pb24gb2lkX3Jlc190ICosIGNoYXIgKik7CisKKyNlbmRpZgkJCQkvKiAhZGVmaW5lZChfT0lEX01HVF9IKSAqLworLyogRU9GICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L3ByaXNtY29tcGF0LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L3ByaXNtY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1NDFjMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvcHJpc21jb21wYXQuaApAQCAtMCwwICsxLDQ0IEBACisvKiAgCisgKiAgKEMpIDIwMDQgTWFyZ2l0IFNjaHViZXJ0LVdoaWxlIDxtYXJnaXRzd0B0LW9ubGluZS5kZT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworLyogIAorICoJQ29tcGF0aWJpbGl0eSBoZWFkZXIgZmlsZSB0byBhaWQgc3VwcG9ydCBvZiBkaWZmZXJlbnQga2VybmVsIHZlcnNpb25zCisgKi8KKworI2lmZGVmIFBSSVNNNTRfQ09NUEFUMjQKKyNpbmNsdWRlICJwcmlzbWNvbXBhdDI0LmgiCisjZWxzZQkvKiBQUklTTTU0X0NPTVBBVDI0ICovCisKKyNpZm5kZWYgX1BSSVNNX0NPTVBBVF9ICisjZGVmaW5lIF9QUklTTV9DT01QQVRfSAorCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisKKyNpZm5kZWYgX19pb21lbQorI2RlZmluZSBfX2lvbWVtCisjZW5kaWYKKworI2RlZmluZSBQUklTTV9GV19QREVWCQkmcHJpdi0+cGRldi0+ZGV2CisKKyNlbmRpZgkJCQkvKiBfUFJJU01fQ09NUEFUX0ggKi8KKyNlbmRpZgkJCQkvKiBQUklTTTU0X0NPTVBBVDI0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNWJkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYwpAQCAtMCwwICsxLDI5NTcgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBBICBQQ01DSUEgY2xpZW50IGRyaXZlciBmb3IgdGhlIFJheWxpbmsgd2lyZWxlc3MgTEFOIGNhcmQuCisgKiBUaGUgc3RhcnRpbmcgcG9pbnQgZm9yIHRoaXMgbW9kdWxlIHdhcyB0aGUgc2tlbGV0b24uYyBpbiB0aGUKKyAqIFBDTUNJQSAyLjkuMTIgcGFja2FnZSB3cml0dGVuIGJ5IERhdmlkIEhpbmRzLCBkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTggIENvcmV5IFRob21hcyAoY29yZXlAd29ybGQuc3RkLmNvbSkKKyAqCisgKiBUaGlzIGRyaXZlciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9ubHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogSXQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIENoYW5nZXM6CisgKiBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4gLSAwOC8wOC8yMDAwCisgKiAtIHJlb3JnYW5pemUga21hbGxvY3MgaW4gcmF5X2F0dGFjaCwgY2hlY2tpbmcgYWxsIGZvciBmYWlsdXJlCisgKiAgIGFuZCByZWxlYXNpbmcgdGhlIHByZXZpb3VzIGFsbG9jYXRpb25zIGlmIG9uZSBmYWlscworICoKKyAqIERhbmllbGUgQmVsbHVjY2kgPGJlbGx1Y2RhQHRpc2NhbGkuaXQ+IC0gMDcvMTAvMjAwMworICogLSBBdWRpdCBjb3B5X3RvX3VzZXIgaW4gaW9jdGwoU0lPQ0dJV0VTU0lEKQorICogCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9tZW1fb3AuaD4KKworI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qIFdhcm5pbmcgOiB0aGVzZSBzdHVmZiB3aWxsIHNsb3cgZG93biB0aGUgZHJpdmVyLi4uICovCisjZGVmaW5lIFdJUkVMRVNTX1NQWQkJLyogRW5hYmxlIHNweWluZyBhZGRyZXNzZXMgKi8KKy8qIERlZmluaXRpb25zIHdlIG5lZWQgZm9yIHNweSAqLwordHlwZWRlZiBzdHJ1Y3QgaXdfc3RhdGlzdGljcwlpd19zdGF0czsKK3R5cGVkZWYgc3RydWN0IGl3X3F1YWxpdHkJaXdfcXVhbDsKK3R5cGVkZWYgdV9jaGFyCW1hY19hZGRyW0VUSF9BTEVOXTsJLyogSGFyZHdhcmUgYWRkcmVzcyAqLworCisjaW5jbHVkZSAicmF5Y3RsLmgiCisjaW5jbHVkZSAicmF5X2NzLmgiCisKKy8qIEFsbCB0aGUgUENNQ0lBIG1vZHVsZXMgdXNlIFBDTUNJQV9ERUJVRyB0byBjb250cm9sIGRlYnVnZ2luZy4gIElmCisgICB5b3UgZG8gbm90IGRlZmluZSBQQ01DSUFfREVCVUcgYXQgYWxsLCBhbGwgdGhlIGRlYnVnIGNvZGUgd2lsbCBiZQorICAgbGVmdCBvdXQuICBJZiB5b3UgY29tcGlsZSB3aXRoIFBDTUNJQV9ERUJVRz0wLCB0aGUgZGVidWcgY29kZSB3aWxsCisgICBiZSBwcmVzZW50IGJ1dCBkaXNhYmxlZCAtLSBidXQgaXQgY2FuIHRoZW4gYmUgZW5hYmxlZCBmb3Igc3BlY2lmaWMKKyAgIG1vZHVsZXMgYXQgbG9hZCB0aW1lIHdpdGggYSAncGNfZGVidWc9Iycgb3B0aW9uIHRvIGluc21vZC4KKyovCisKKyNpZmRlZiBSQVlMSU5LX0RFQlVHCisjZGVmaW5lIFBDTUNJQV9ERUJVRyBSQVlMSU5LX0RFQlVHCisjZW5kaWYKKyNpZmRlZiBQQ01DSUFfREVCVUcKK3N0YXRpYyBpbnQgcmF5X2RlYnVnOworc3RhdGljIGludCBwY19kZWJ1ZyA9IFBDTUNJQV9ERUJVRzsKK21vZHVsZV9wYXJhbShwY19kZWJ1ZywgaW50LCAwKTsKKy8qICNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgaWYgKHBjX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncyk7ICovCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhhcmdzKTsKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCisjZW5kaWYKKy8qKiBQcm90b3R5cGVzIGJhc2VkIG9uIFBDTUNJQSBza2VsZXRvbiBkcml2ZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHJheV9jb25maWcoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgdm9pZCByYXlfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyBpbnQgcmF5X2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKTsKK3N0YXRpYyBkZXZfbGlua190ICpyYXlfYXR0YWNoKHZvaWQpOworc3RhdGljIHZvaWQgcmF5X2RldGFjaChkZXZfbGlua190ICopOworCisvKioqKiogUHJvdG90eXBlcyBpbmRpY2F0ZWQgYnkgZGV2aWNlIHN0cnVjdHVyZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHJheV9kZXZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHJheV9kZXZfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcmF5X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcmF5X2Rldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCByYXlfZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CisKK3N0YXRpYyBpbnQgcmF5X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHJheV9kZXZfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJheV91cGRhdGVfbXVsdGlfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYWxsKTsKK3N0YXRpYyBpbnQgdHJhbnNsYXRlX2ZyYW1lKHJheV9kZXZfdCAqbG9jYWwsIHN0cnVjdCB0eF9tc2cgX19pb21lbSAqcHR4LAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4pOworc3RhdGljIHZvaWQgcmF5X2J1aWxkX2hlYWRlcihyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgdHhfbXNnIF9faW9tZW0gKnB0eCwgVUNIQVIgbXNnX3R5cGUsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSk7CitzdGF0aWMgdm9pZCB1bnRyYW5zbGF0ZShyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuKTsKKyNpZiBXSVJFTEVTU19FWFQgPiA3CS8qIElmIHdpcmVsZXNzIGV4dGVuc2lvbiBleGlzdCBpbiB0aGUga2VybmVsICovCitzdGF0aWMgaXdfc3RhdHMgKiByYXlfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KTsKKyNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiA3ICovCisKKy8qKioqKiBQcm90b3R5cGVzIGZvciByYXlsaW5rIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgYXNjX3RvX2ludChjaGFyIGEpOworc3RhdGljIHZvaWQgYXV0aGVudGljYXRlKHJheV9kZXZfdCAqbG9jYWwpOworc3RhdGljIGludCBidWlsZF9hdXRoX2ZyYW1lKHJheV9kZXZfdCAqbG9jYWwsIFVDSEFSICpkZXN0LCBpbnQgYXV0aF90eXBlKTsKK3N0YXRpYyB2b2lkIGF1dGhlbnRpY2F0ZV90aW1lb3V0KHVfbG9uZyk7CitzdGF0aWMgaW50IGdldF9mcmVlX2NjcyhyYXlfZGV2X3QgKmxvY2FsKTsKK3N0YXRpYyBpbnQgZ2V0X2ZyZWVfdHhfY2NzKHJheV9kZXZfdCAqbG9jYWwpOworc3RhdGljIHZvaWQgaW5pdF9zdGFydHVwX3BhcmFtcyhyYXlfZGV2X3QgKmxvY2FsKTsKK3N0YXRpYyBpbnQgcGFyc2VfYWRkcihjaGFyICppbl9zdHIsIFVDSEFSICpvdXQpOworc3RhdGljIGludCByYXlfaHdfeG1pdCh1bnNpZ25lZCBjaGFyKiBkYXRhLCBpbnQgbGVuLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBVQ0hBUiB0eXBlKTsKK3N0YXRpYyBpbnQgcmF5X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGludGVycnVwdF9lY2YocmF5X2Rldl90ICpsb2NhbCwgaW50IGNjcyk7CitzdGF0aWMgdm9pZCByYXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCByYXlfdXBkYXRlX3Bhcm0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgVUNIQVIgb2JqaWQsIFVDSEFSICp2YWx1ZSwgaW50IGxlbik7CitzdGF0aWMgdm9pZCB2ZXJpZnlfZGxfc3RhcnR1cCh1X2xvbmcpOworCisvKiBQcm90b3R5cGVzIGZvciBpbnRlcnJwdCB0aW1lIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlycXJldHVybl90IHJheV9pbnRlcnJ1cHQgKGludCByZWcsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgY2xlYXJfaW50ZXJydXB0KHJheV9kZXZfdCAqbG9jYWwpOworc3RhdGljIHZvaWQgcnhfZGVhdXRoZW50aWNhdGUocmF5X2Rldl90ICpsb2NhbCwgc3RydWN0IHJjcyBfX2lvbWVtICpwcmNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBrdF9hZGRyLCBpbnQgcnhfbGVuKTsKK3N0YXRpYyBpbnQgY29weV9mcm9tX3J4X2J1ZmYocmF5X2Rldl90ICpsb2NhbCwgVUNIQVIgKmRlc3QsIGludCBwa3RfYWRkciwgaW50IGxlbik7CitzdGF0aWMgdm9pZCByYXlfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgcmF5X2Rldl90ICpsb2NhbCwgc3RydWN0IHJjcyBfX2lvbWVtICpwcmNzKTsKK3N0YXRpYyB2b2lkIHJlbGVhc2VfZnJhZ19jaGFpbihyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgcmNzIF9faW9tZW0gKnByY3MpOworc3RhdGljIHZvaWQgcnhfYXV0aGVudGljYXRlKHJheV9kZXZfdCAqbG9jYWwsIHN0cnVjdCByY3MgX19pb21lbSAqcHJjcywKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwa3RfYWRkciwgaW50IHJ4X2xlbik7CitzdGF0aWMgdm9pZCByeF9kYXRhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCByY3MgX19pb21lbSAqcHJjcywgdW5zaWduZWQgaW50IHBrdF9hZGRyLCAKKyAgICAgICAgICAgICBpbnQgcnhfbGVuKTsKK3N0YXRpYyB2b2lkIGFzc29jaWF0ZShyYXlfZGV2X3QgKmxvY2FsKTsKKworLyogQ2FyZCBjb21tYW5kIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBkbF9zdGFydHVwX3BhcmFtcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGpvaW5fbmV0KHVfbG9uZyBsb2NhbCk7CitzdGF0aWMgdm9pZCBzdGFydF9uZXQodV9sb25nIGxvY2FsKTsKKy8qIHZvaWQgc3RhcnRfbmV0KHJheV9kZXZfdCAqbG9jYWwpOyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCB3aXRoICdpbnNtb2QnICovCisKKy8qIEFESE9DPTAsIEluZnJhc3RydWN0dXJlPTEgKi8KK3N0YXRpYyBpbnQgbmV0X3R5cGUgPSBBREhPQzsKKworLyogSG9wIGR3ZWxsIHRpbWUgaW4gS3VzICgxMDI0IHVzIHVuaXRzIGRlZmluZWQgYnkgODAyLjExKSAqLworc3RhdGljIGludCBob3BfZHdlbGwgPSAxMjg7CisKKy8qIEJlYWNvbiBwZXJpb2QgaW4gS3VzICovCitzdGF0aWMgaW50IGJlYWNvbl9wZXJpb2QgPSAyNTY7CisKKy8qIHBvd2VyIHNhdmUgbW9kZSAoMCA9IG9mZiwgMSA9IHNhdmUgcG93ZXIpICovCitzdGF0aWMgaW50IHBzbTsKKworLyogU3RyaW5nIGZvciBuZXR3b3JrJ3MgRXh0ZW5kZWQgU2VydmljZSBTZXQgSUQuIDMyIENoYXJhY3RlcnMgbWF4ICovCitzdGF0aWMgY2hhciAqZXNzaWQ7CisKKy8qIERlZmF1bHQgdG8gZW5jYXBzdWxhdGlvbiB1bmxlc3MgdHJhbnNsYXRpb24gcmVxdWVzdGVkICovCitzdGF0aWMgaW50IHRyYW5zbGF0ZSA9IDE7CisKK3N0YXRpYyBpbnQgY291bnRyeSA9IFVTQTsKKworc3RhdGljIGludCBzbmlmZmVyOworCitzdGF0aWMgaW50IGJjOworCisvKiA0OCBiaXQgcGh5c2ljYWwgY2FyZCBhZGRyZXNzIGlmIG92ZXJyaWRpbmcgY2FyZCdzIHJlYWwgcGh5c2ljYWwKKyAqIGFkZHJlc3MgaXMgcmVxdWlyZWQuICBTaW5jZSBJRUVFIDgwMi4xMSBhZGRyZXNzZXMgYXJlIDQ4IGJpdHMKKyAqIGxpa2UgZXRoZXJuZXQsIGFuIGludCBjYW4ndCBiZSB1c2VkLCBzbyBhIHN0cmluZyBpcyB1c2VkLiBUbworICogYWxsb3cgdXNlIG9mIGFkZHJlc3NlcyBzdGFydGluZyB3aXRoIGEgZGVjaW1hbCBkaWdpdCwgdGhlIGZpcnN0CisgKiBjaGFyYWN0ZXIgbXVzdCBiZSBhIGxldHRlciBhbmQgd2lsbCBiZSBpZ25vcmVkLiBUaGlzIGxldHRlciBpcworICogZm9sbG93ZWQgYnkgdXAgdG8gMTIgaGV4IGRpZ2l0cyB3aGljaCBhcmUgdGhlIGFkZHJlc3MuICBJZiBsZXNzCisgKiB0aGFuIDEyIGRpZ2l0cyBhcmUgdXNlZCwgdGhlIGFkZHJlc3Mgd2lsbCBiZSBsZWZ0IGZpbGxlZCB3aXRoIDAncy4KKyAqIE5vdGUgdGhhdCBiaXQgMCBvZiB0aGUgZmlyc3QgYnl0ZSBpcyB0aGUgYnJvYWRjYXN0IGJpdCwgYW5kIGV2aWwKKyAqIHRoaW5ncyB3aWxsIGhhcHBlbiBpZiBpdCBpcyBub3QgMCBpbiBhIGNhcmQgYWRkcmVzcy4KKyAqLworc3RhdGljIGNoYXIgKnBoeV9hZGRyID0gTlVMTDsKKworCisvKiBUaGUgZGV2X2luZm8gdmFyaWFibGUgaXMgdGhlICJrZXkiIHRoYXQgaXMgdXNlZCB0byBtYXRjaCB1cCB0aGlzCisgICBkZXZpY2UgZHJpdmVyIHdpdGggYXBwcm9wcmlhdGUgY2FyZHMsIHRocm91Z2ggdGhlIGNhcmQgY29uZmlndXJhdGlvbgorICAgZGF0YWJhc2UuCisqLworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAicmF5X2NzIjsKKworLyogQSBsaW5rZWQgbGlzdCBvZiAiaW5zdGFuY2VzIiBvZiB0aGUgcmF5IGRldmljZS4gIEVhY2ggYWN0dWFsCisgICBQQ01DSUEgY2FyZCBjb3JyZXNwb25kcyB0byBvbmUgZGV2aWNlIGluc3RhbmNlLCBhbmQgaXMgZGVzY3JpYmVkCisgICBieSBvbmUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgKGRlZmluZWQgaW4gZHMuaCkuCisqLworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0ID0gTlVMTDsKKworLyogQSBkZXZfbGlua190IHN0cnVjdHVyZSBoYXMgZmllbGRzIGZvciBtb3N0IHRoaW5ncyB0aGF0IGFyZSBuZWVkZWQKKyAgIHRvIGtlZXAgdHJhY2sgb2YgYSBzb2NrZXQsIGJ1dCB0aGVyZSB3aWxsIHVzdWFsbHkgYmUgc29tZSBkZXZpY2UKKyAgIHNwZWNpZmljIGluZm9ybWF0aW9uIHRoYXQgYWxzbyBuZWVkcyB0byBiZSBrZXB0IHRyYWNrIG9mLiAgVGhlCisgICAncHJpdicgcG9pbnRlciBpbiBhIGRldl9saW5rX3Qgc3RydWN0dXJlIGNhbiBiZSB1c2VkIHRvIHBvaW50IHRvCisgICBhIGRldmljZS1zcGVjaWZpYyBwcml2YXRlIGRhdGEgc3RydWN0dXJlLCBsaWtlIHRoaXMuCisqLworc3RhdGljIHVuc2lnbmVkIGludCByYXlfbWVtX3NwZWVkID0gNTAwOworCitNT0RVTEVfQVVUSE9SKCJDb3JleSBUaG9tYXMgPGNvcmV5QHdvcmxkLnN0ZC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJheWxpbmsvV2ViR2VhciB3aXJlbGVzcyBMQU4gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShuZXRfdHlwZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShob3BfZHdlbGwsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oYmVhY29uX3BlcmlvZCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShwc20sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZXNzaWQsIGNoYXJwLCAwKTsKK21vZHVsZV9wYXJhbSh0cmFuc2xhdGUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY291bnRyeSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShzbmlmZmVyLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGJjLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHBoeV9hZGRyLCBjaGFycCwgMCk7Cittb2R1bGVfcGFyYW0ocmF5X21lbV9zcGVlZCwgaW50LCAwKTsKKworc3RhdGljIFVDSEFSIGI1X2RlZmF1bHRfc3RhcnR1cF9wYXJtc1tdID0geworICAgIDAsICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRob2Mgc3RhdGlvbiAqLworICAgJ0wnLCdJJywnTicsJ1UnLCdYJywgMCwgIDAsICAwLCAgLyogMzIgY2hhciBFU1NJRCAqLworICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIDEsICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWN0aXZlIHNjYW4sIENBIE1vZGUgKi8KKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAgICAgICAgIC8qIE5vIGRlZmF1bHQgTUFDIGFkZHIgICovCisgICAgMHg3ZiwgMHhmZiwgICAgICAgICAgICAgICAgICAgICAvKiBGcmFnIHRocmVzaG9sZCAqLworICAgIDB4MDAsIDB4ODAsICAgICAgICAgICAgICAgICAgICAgLyogSG9wIHRpbWUgMTI4IEt1cyovCisgICAgMHgwMSwgMHgwMCwgICAgICAgICAgICAgICAgICAgICAvKiBCZWFjb24gcGVyaW9kIDI1NiBLdXMgKi8KKyAgICAweDAxLCAweDA3LCAweGEzLCAgICAgICAgICAgICAgIC8qIERUSU0sIHJldHJpZXMsIGFjayB0aW1lb3V0Ki8KKyAgICAweDFkLCAweDgyLCAweDRlLCAgICAgICAgICAgICAgIC8qIFNJRlMsIERJRlMsIFBJRlMgKi8KKyAgICAweDdmLCAweGZmLCAgICAgICAgICAgICAgICAgICAgIC8qIFJUUyB0aHJlc2hvbGQgKi8KKyAgICAweDA0LCAweGUyLCAweDM4LCAweEE0LCAgICAgICAgIC8qIHNjYW5fZHdlbGwsIG1heF9zY2FuX2R3ZWxsICovCisgICAgMHgwNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhc3NvYyByZXNwIHRpbWVvdXQgdGhyZXNoICovCisgICAgMHgwOCwgMHgwMiwgMHgwOCwgICAgICAgICAgICAgICAvKiBhZGhvYywgaW5mcmEsIHN1cGVyIGN5Y2xlIG1heCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9taXNjdW91cyBtb2RlICovCisgICAgMHgwYywgMHgwYmQsICAgICAgICAgICAgICAgICAgICAvKiBVbmlxdWUgd29yZCAqLworICAgIDB4MzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2xvdCB0aW1lICovCisgICAgMHhmZiwgMHhmZiwgICAgICAgICAgICAgICAgICAgICAvKiByb2FtLWxvdyBzbnIsIGxvdyBzbnIgY291bnQgKi8KKyAgICAweDA1LCAweGZmLCAgICAgICAgICAgICAgICAgICAgIC8qIEluZnJhLCBhZGhvYyBtaXNzZWQgYmNuIHRocmVzaCAqLworICAgIDB4MDEsIDB4MGIsIDB4NGYsICAgICAgICAgICAgICAgLyogVVNBLCBob3AgcGF0dGVybiwgaG9wIHBhdCBsZW5ndGggKi8KKy8qIGI0IC0gYjUgZGlmZmVyZW5jZXMgc3RhcnQgaGVyZSAqLworICAgIDB4MDAsIDB4M2YsICAgICAgICAgICAgICAgICAgICAgLyogQ1cgbWF4ICovCisgICAgMHgwMCwgMHgwZiwgICAgICAgICAgICAgICAgICAgICAvKiBDVyBtaW4gKi8KKyAgICAweDA0LCAweDA4LCAgICAgICAgICAgICAgICAgICAgIC8qIE5vaXNlIGdhaW4sIGxpbWl0IG9mZnNldCAqLworICAgIDB4MjgsIDB4MjgsICAgICAgICAgICAgICAgICAgICAgLyogZGV0IHJzc2ksIG1lZCBidXN5IG9mZnNldHMgKi8KKyAgICA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRldCBzeW5jIHRocmVzaCAqLworICAgIDAsIDIsIDIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVzdCBtb2RlLCBtaW4sIG1heCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxsb3cgYnJvYWRjYXN0IFNTSUQgcHJvYmUgcmVzcCAqLworICAgIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJpdmFjeSBtdXN0IHN0YXJ0LCBjYW4gam9pbiAqLworICAgIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAgICAgICAgICAgLyogYmFzaWMgcmF0ZSBzZXQgKi8KK307CisKK3N0YXRpYyBVQ0hBUiBiNF9kZWZhdWx0X3N0YXJ0dXBfcGFybXNbXSA9IHsKKyAgICAwLCAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkaG9jIHN0YXRpb24gKi8KKyAgICdMJywnSScsJ04nLCdVJywnWCcsIDAsICAwLCAgMCwgIC8qIDMyIGNoYXIgRVNTSUQgKi8KKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAxLCAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFjdGl2ZSBzY2FuLCBDQSBNb2RlICovCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgICAgICAgICAvKiBObyBkZWZhdWx0IE1BQyBhZGRyICAqLworICAgIDB4N2YsIDB4ZmYsICAgICAgICAgICAgICAgICAgICAgLyogRnJhZyB0aHJlc2hvbGQgKi8KKyAgICAweDAyLCAweDAwLCAgICAgICAgICAgICAgICAgICAgIC8qIEhvcCB0aW1lICovCisgICAgMHgwMCwgMHgwMSwgICAgICAgICAgICAgICAgICAgICAvKiBCZWFjb24gcGVyaW9kICovCisgICAgMHgwMSwgMHgwNywgMHhhMywgICAgICAgICAgICAgICAvKiBEVElNLCByZXRyaWVzLCBhY2sgdGltZW91dCovCisgICAgMHgxZCwgMHg4MiwgMHhjZSwgICAgICAgICAgICAgICAvKiBTSUZTLCBESUZTLCBQSUZTICovCisgICAgMHg3ZiwgMHhmZiwgICAgICAgICAgICAgICAgICAgICAvKiBSVFMgdGhyZXNob2xkICovCisgICAgMHhmYiwgMHgxZSwgMHhjNywgMHg1YywgICAgICAgICAvKiBzY2FuX2R3ZWxsLCBtYXhfc2Nhbl9kd2VsbCAqLworICAgIDB4MDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXNzb2MgcmVzcCB0aW1lb3V0IHRocmVzaCAqLworICAgIDB4MDQsIDB4MDIsIDB4NCwgICAgICAgICAgICAgICAgLyogYWRob2MsIGluZnJhLCBzdXBlciBjeWNsZSBtYXgqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvbWlzY3VvdXMgbW9kZSAqLworICAgIDB4MGMsIDB4MGJkLCAgICAgICAgICAgICAgICAgICAgLyogVW5pcXVlIHdvcmQgKi8KKyAgICAweDRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNsb3QgdGltZSAoVEJEIHNlZW1zIHdyb25nKSovCisgICAgMHhmZiwgMHhmZiwgICAgICAgICAgICAgICAgICAgICAvKiByb2FtLWxvdyBzbnIsIGxvdyBzbnIgY291bnQgKi8KKyAgICAweDA1LCAweGZmLCAgICAgICAgICAgICAgICAgICAgIC8qIEluZnJhLCBhZGhvYyBtaXNzZWQgYmNuIHRocmVzaCAqLworICAgIDB4MDEsIDB4MGIsIDB4NGUsICAgICAgICAgICAgICAgLyogVVNBLCBob3AgcGF0dGVybiwgaG9wIHBhdCBsZW5ndGggKi8KKy8qIGI0IC0gYjUgZGlmZmVyZW5jZXMgc3RhcnQgaGVyZSAqLworICAgIDB4M2YsIDB4MGYsICAgICAgICAgICAgICAgICAgICAgLyogQ1cgbWF4LCBtaW4gKi8KKyAgICAweDA0LCAweDA4LCAgICAgICAgICAgICAgICAgICAgIC8qIE5vaXNlIGdhaW4sIGxpbWl0IG9mZnNldCAqLworICAgIDB4MjgsIDB4MjgsICAgICAgICAgICAgICAgICAgICAgLyogZGV0IHJzc2ksIG1lZCBidXN5IG9mZnNldHMgKi8KKyAgICA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRldCBzeW5jIHRocmVzaCAqLworICAgIDAsIDIsIDIgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVzdCBtb2RlLCBtaW4sIG1heCovCit9OworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHVuc2lnbmVkIGNoYXIgZXRoMl9sbGNbXSA9IHsweGFhLCAweGFhLCAzLCAwLCAwLCAwfTsKKworc3RhdGljIGNoYXIgaG9wX3BhdHRlcm5fbGVuZ3RoW10gPSB7IDEsCisJICAgICBVU0FfSE9QX01PRCwgICAgICAgICAgICAgRVVST1BFX0hPUF9NT0QsCisJICAgICBKQVBBTl9IT1BfTU9ELCAgICAgICAgICAgS09SRUFfSE9QX01PRCwKKwkgICAgIFNQQUlOX0hPUF9NT0QsICAgICAgICAgICBGUkFOQ0VfSE9QX01PRCwKKwkgICAgIElTUkFFTF9IT1BfTU9ELCAgICAgICAgICBBVVNUUkFMSUFfSE9QX01PRCwKKwkgICAgIEpBUEFOX1RFU1RfSE9QX01PRAorfTsKKworc3RhdGljIGNoYXIgcmNzaWRbXSA9ICJSYXlsaW5rL1dlYkdlYXIgd2lyZWxlc3MgTEFOIC0gQ29yZXkgPFRob21hcyBjb3JleUB3b3JsZC5zdGQuY29tPiI7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICByYXlfYXR0YWNoKCkgY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcKKyAgICBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQKKyAgICB3aXRoIENhcmQgU2VydmljZXMuCisgICAgVGhlIGRldl9saW5rIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCwgYnV0IHdlIGRvbid0IGFjdHVhbGx5CisgICAgY29uZmlndXJlIHRoZSBjYXJkIGF0IHRoaXMgcG9pbnQgLS0gd2Ugd2FpdCB1bnRpbCB3ZSByZWNlaXZlIGEKKyAgICBjYXJkIGluc2VydGlvbiBldmVudC4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBkZXZfbGlua190ICpyYXlfYXR0YWNoKHZvaWQpCit7CisgICAgY2xpZW50X3JlZ190IGNsaWVudF9yZWc7CisgICAgZGV2X2xpbmtfdCAqbGluazsKKyAgICByYXlfZGV2X3QgKmxvY2FsOworICAgIGludCByZXQ7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICAKKyAgICBERUJVRygxLCAicmF5X2F0dGFjaCgpXG4iKTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIGRldl9saW5rX3Qgc3RydWN0dXJlICovCisgICAgbGluayA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZfbGlua190KSwgR0ZQX0tFUk5FTCk7CisKKyAgICBpZiAoIWxpbmspCisJICAgIHJldHVybiBOVUxMOworCisgICAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHByaXZhdGUgZGV2aWNlLXNwZWNpZmljIGRhdGEgKi8KKyAgICBkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YocmF5X2Rldl90KSk7CisKKyAgICBpZiAoIWRldikKKwkgICAgZ290byBmYWlsX2FsbG9jX2RldjsKKworICAgIGxvY2FsID0gZGV2LT5wcml2OworCisgICAgbWVtc2V0KGxpbmssIDAsIHNpemVvZihzdHJ1Y3QgZGV2X2xpbmtfdCkpOworCisgICAgLyogVGhlIGlvIHN0cnVjdHVyZSBkZXNjcmliZXMgSU8gcG9ydCBtYXBwaW5nLiBOb25lIHVzZWQgaGVyZSAqLworICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDA7CisgICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKyAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDU7CisKKyAgICAvKiBJbnRlcnJ1cHQgc2V0dXAuIEZvciBQQ01DSUEsIGRyaXZlciB0YWtlcyB3aGF0J3MgZ2l2ZW4gKi8KKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKKyAgICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisgICAgbGluay0+aXJxLkhhbmRsZXIgPSAmcmF5X2ludGVycnVwdDsKKworICAgIC8qIEdlbmVyYWwgc29ja2V0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CisgICAgbGluay0+Y29uZi5WY2MgPSA1MDsKKyAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMTsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBQUkVTRU5UX09QVElPTjsKKworICAgIGxpbmstPnByaXYgPSBkZXY7CisgICAgbGluay0+aXJxLkluc3RhbmNlID0gZGV2OworICAgIAorICAgIGxvY2FsLT5maW5kZXIgPSBsaW5rOworICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfSU5TRVJURUQ7CisgICAgbG9jYWwtPmF1dGhlbnRpY2F0aW9uX3N0YXRlID0gVU5BVVRIRU5USUNBVEVEOworICAgIGxvY2FsLT5udW1fbXVsdGkgPSAwOworICAgIERFQlVHKDIsInJheV9hdHRhY2ggbGluayA9ICVwLCAgZGV2ID0gJXAsICBsb2NhbCA9ICVwLCBpbnRyID0gJXBcbiIsCisgICAgICAgICAgbGluayxkZXYsbG9jYWwsJnJheV9pbnRlcnJ1cHQpOworCisgICAgLyogUmF5bGluayBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlICovCisgICAgZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmcmF5X2Rldl9zdGFydF94bWl0OworICAgIGRldi0+c2V0X2NvbmZpZyA9ICZyYXlfZGV2X2NvbmZpZzsKKyAgICBkZXYtPmdldF9zdGF0cyAgPSAmcmF5X2dldF9zdGF0czsKKyAgICBkZXYtPmRvX2lvY3RsID0gJnJheV9kZXZfaW9jdGw7CisgICAgU0VUX0VUSFRPT0xfT1BTKGRldiwgJm5ldGRldl9ldGh0b29sX29wcyk7CisjaWYgV0lSRUxFU1NfRVhUID4gNwkvKiBJZiB3aXJlbGVzcyBleHRlbnNpb24gZXhpc3QgaW4gdGhlIGtlcm5lbCAqLworICAgIGRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID0gcmF5X2dldF93aXJlbGVzc19zdGF0czsKKyNlbmRpZgorCisgICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OworCisgICAgREVCVUcoMiwicmF5X2NzIHJheV9hdHRhY2ggY2FsbGluZyBldGhlcl9zZXR1cC4pXG4iKTsKKyAgICBTRVRfTU9EVUxFX09XTkVSKGRldik7CisgICAgZGV2LT5pbml0ID0gJnJheV9kZXZfaW5pdDsKKyAgICBkZXYtPm9wZW4gPSAmcmF5X29wZW47CisgICAgZGV2LT5zdG9wID0gJnJheV9kZXZfY2xvc2U7CisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgICAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgbGluay0+bmV4dCA9IGRldl9saXN0OworICAgIGRldl9saXN0ID0gbGluazsKKyAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KKyAgICAgICAgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorICAgICAgICBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAorICAgICAgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZyYXlfZXZlbnQ7CisgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisKKyAgICBERUJVRygyLCJyYXlfY3MgcmF5X2F0dGFjaCBjYWxsaW5nIHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoLi4uKVxuIik7CisKKyAgICBpbml0X3RpbWVyKCZsb2NhbC0+dGltZXIpOworCisgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIHByaW50aygicmF5X2NzIHJheV9hdHRhY2ggUmVnaXN0ZXJDbGllbnQgdW5oYXBweSAtIGRldGFjaGluZ1xuIik7CisgICAgICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisgICAgICAgIHJheV9kZXRhY2gobGluayk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBERUJVRygyLCJyYXlfY3MgcmF5X2F0dGFjaCBlbmRpbmdcbiIpOworICAgIHJldHVybiBsaW5rOworCitmYWlsX2FsbG9jX2RldjoKKyAgICBrZnJlZShsaW5rKTsKKyAgICByZXR1cm4gTlVMTDsKK30gLyogcmF5X2F0dGFjaCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkCisgICAgd2l0aCBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCisgICAgc3RydWN0dXJlcyBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQKKyAgICB3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCByYXlfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgZGV2X2xpbmtfdCAqKmxpbmtwOworCisgICAgREVCVUcoMSwgInJheV9kZXRhY2goMHglcClcbiIsIGxpbmspOworICAgIAorICAgIC8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisgICAgZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkKKyAgICAgICAgaWYgKCpsaW5rcCA9PSBsaW5rKSBicmVhazsKKyAgICBpZiAoKmxpbmtwID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIElmIHRoZSBkZXZpY2UgaXMgY3VycmVudGx5IGNvbmZpZ3VyZWQgYW5kIGFjdGl2ZSwgd2Ugd29uJ3QKKyAgICAgIGFjdHVhbGx5IGRlbGV0ZSBpdCB5ZXQuICBJbnN0ZWFkLCBpdCBpcyBtYXJrZWQgc28gdGhhdCB3aGVuCisgICAgICB0aGUgcmVsZWFzZSgpIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhhdCB3aWxsIHRyaWdnZXIgYSBwcm9wZXIKKyAgICAgIGRldGFjaCgpLgorICAgICovCisgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKyAgICAgICAgcmF5X3JlbGVhc2UobGluayk7CisKKyAgICAvKiBCcmVhayB0aGUgbGluayB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBpZiAobGluay0+aGFuZGxlKQorICAgICAgICBwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKyAgICAKKyAgICAvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBwaWVjZXMgKi8KKyAgICAqbGlua3AgPSBsaW5rLT5uZXh0OworICAgIGlmIChsaW5rLT5wcml2KSB7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCWlmIChsaW5rLT5kZXYpIHVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisgICAgICAgIGZyZWVfbmV0ZGV2KGRldik7CisgICAgfQorICAgIGtmcmVlKGxpbmspOworICAgIERFQlVHKDIsInJheV9jcyByYXlfZGV0YWNoIGVuZGluZ1xuIik7Cit9IC8qIHJheV9kZXRhY2ggKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICByYXlfY29uZmlnKCkgaXMgcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gZXZlbnQKKyAgICBpcyByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUKKyAgICBldGhlcm5ldCBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKK2RvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCisjZGVmaW5lIE1BWF9UVVBMRV9TSVpFIDEyOAorc3RhdGljIHZvaWQgcmF5X2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICBjaXNwYXJzZV90IHBhcnNlOworICAgIGludCBsYXN0X2ZuID0gMCwgbGFzdF9yZXQgPSAwOworICAgIGludCBpOworICAgIHVfY2hhciBidWZbTUFYX1RVUExFX1NJWkVdOworICAgIHdpbl9yZXFfdCByZXE7CisgICAgbWVtcmVxX3QgbWVtOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilsaW5rLT5wcml2OworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworCisgICAgREVCVUcoMSwgInJheV9jb25maWcoMHglcClcbiIsIGxpbmspOworCisgICAgLyogVGhpcyByZWFkcyB0aGUgY2FyZCdzIENPTkZJRyB0dXBsZSB0byBmaW5kIGl0cyBjb25maWd1cmF0aW9uIHJlZ3MgKi8KKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gTUFYX1RVUExFX1NJWkU7CisgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CisKKyAgICAvKiBEZXRlcm1pbmUgY2FyZCB0eXBlIGFuZCBmaXJtd2FyZSB2ZXJzaW9uICovCisgICAgYnVmWzBdID0gYnVmW01BWF9UVVBMRV9TSVpFIC0gMV0gPSAwOworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9WRVJTXzE7CisgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICAgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBNQVhfVFVQTEVfU0laRTsKKyAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDI7CisgICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKworICAgIGZvciAoaT0wOyBpPHR1cGxlLlR1cGxlRGF0YUxlbiAtIDQ7IGkrKykgCisgICAgICAgIGlmIChidWZbaV0gPT0gMCkgYnVmW2ldID0gJyAnOworICAgIHByaW50ayhLRVJOX0lORk8gInJheV9jcyBEZXRlY3RlZDogJXNcbiIsYnVmKTsKKworICAgIC8qIENvbmZpZ3VyZSBjYXJkICovCisgICAgbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKworICAgIC8qIE5vdyBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgYXNzaWduIGEgaGFuZGxlciB0byB0aGUgaW50ZXJydXB0LgorICAgICovCisgICAgQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSkpOworICAgIGRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworICAgIAorICAgIC8qIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwCisgICAgICAgdGhlIEkvTyB3aW5kb3dzIGFuZCB0aGUgaW50ZXJydXB0IG1hcHBpbmcuCisgICAgKi8KKyAgICBDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKSk7CisKKy8qKiogU2V0IHVwIDMyayB3aW5kb3cgZm9yIHNoYXJlZCBtZW1vcnkgKHRyYW5zbWl0IGFuZCBjb250cm9sKSAqKioqKioqKioqKiovCisgICAgcmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF84IHwgV0lOX01FTU9SWV9UWVBFX0NNIHwgV0lOX0VOQUJMRSB8IFdJTl9VU0VfV0FJVDsKKyAgICByZXEuQmFzZSA9IDA7CisgICAgcmVxLlNpemUgPSAweDgwMDA7CisgICAgcmVxLkFjY2Vzc1NwZWVkID0gcmF5X21lbV9zcGVlZDsKKyAgICBDU19DSEVDSyhSZXF1ZXN0V2luZG93LCBwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmstPmhhbmRsZSwgJnJlcSwgJmxpbmstPndpbikpOworICAgIG1lbS5DYXJkT2Zmc2V0ID0gMHgwMDAwOyBtZW0uUGFnZSA9IDA7CisgICAgQ1NfQ0hFQ0soTWFwTWVtUGFnZSwgcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLT53aW4sICZtZW0pKTsKKyAgICBsb2NhbC0+c3JhbSA9IGlvcmVtYXAocmVxLkJhc2UscmVxLlNpemUpOworCisvKioqIFNldCB1cCAxNmsgd2luZG93IGZvciBzaGFyZWQgbWVtb3J5IChyZWNlaXZlIGJ1ZmZlcikgKioqKioqKioqKioqKioqLworICAgIHJlcS5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfOCB8IFdJTl9NRU1PUllfVFlQRV9DTSB8IFdJTl9FTkFCTEUgfCBXSU5fVVNFX1dBSVQ7CisgICAgcmVxLkJhc2UgPSAwOworICAgIHJlcS5TaXplID0gMHg0MDAwOworICAgIHJlcS5BY2Nlc3NTcGVlZCA9IHJheV9tZW1fc3BlZWQ7CisgICAgQ1NfQ0hFQ0soUmVxdWVzdFdpbmRvdywgcGNtY2lhX3JlcXVlc3Rfd2luZG93KCZsaW5rLT5oYW5kbGUsICZyZXEsICZsb2NhbC0+cm1lbV9oYW5kbGUpKTsKKyAgICBtZW0uQ2FyZE9mZnNldCA9IDB4ODAwMDsgbWVtLlBhZ2UgPSAwOworICAgIENTX0NIRUNLKE1hcE1lbVBhZ2UsIHBjbWNpYV9tYXBfbWVtX3BhZ2UobG9jYWwtPnJtZW1faGFuZGxlLCAmbWVtKSk7CisgICAgbG9jYWwtPnJtZW0gPSBpb3JlbWFwKHJlcS5CYXNlLHJlcS5TaXplKTsKKworLyoqKiBTZXQgdXAgd2luZG93IGZvciBhdHRyaWJ1dGUgbWVtb3J5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIHJlcS5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfOCB8IFdJTl9NRU1PUllfVFlQRV9BTSB8IFdJTl9FTkFCTEUgfCBXSU5fVVNFX1dBSVQ7CisgICAgcmVxLkJhc2UgPSAwOworICAgIHJlcS5TaXplID0gMHgxMDAwOworICAgIHJlcS5BY2Nlc3NTcGVlZCA9IHJheV9tZW1fc3BlZWQ7CisgICAgQ1NfQ0hFQ0soUmVxdWVzdFdpbmRvdywgcGNtY2lhX3JlcXVlc3Rfd2luZG93KCZsaW5rLT5oYW5kbGUsICZyZXEsICZsb2NhbC0+YW1lbV9oYW5kbGUpKTsKKyAgICBtZW0uQ2FyZE9mZnNldCA9IDB4MDAwMDsgbWVtLlBhZ2UgPSAwOworICAgIENTX0NIRUNLKE1hcE1lbVBhZ2UsIHBjbWNpYV9tYXBfbWVtX3BhZ2UobG9jYWwtPmFtZW1faGFuZGxlLCAmbWVtKSk7CisgICAgbG9jYWwtPmFtZW0gPSBpb3JlbWFwKHJlcS5CYXNlLHJlcS5TaXplKTsKKworICAgIERFQlVHKDMsInJheV9jb25maWcgc3JhbT0lcFxuIixsb2NhbC0+c3JhbSk7CisgICAgREVCVUcoMywicmF5X2NvbmZpZyBybWVtPSVwXG4iLGxvY2FsLT5ybWVtKTsKKyAgICBERUJVRygzLCJyYXlfY29uZmlnIGFtZW09JXBcbiIsbG9jYWwtPmFtZW0pOworICAgIGlmIChyYXlfaW5pdChkZXYpIDwgMCkgeworICAgICAgICByYXlfcmVsZWFzZShsaW5rKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNFVF9ORVRERVZfREVWKGRldiwgJmhhbmRsZV90b19kZXYoaGFuZGxlKSk7CisgICAgaSA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgcHJpbnRrKCJyYXlfY29uZmlnIHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7CisgICAgICAgIHJheV9yZWxlYXNlKGxpbmspOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RyY3B5KGxvY2FsLT5ub2RlLmRldl9uYW1lLCBkZXYtPm5hbWUpOworICAgIGxpbmstPmRldiA9ICZsb2NhbC0+bm9kZTsKKworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJheUxpbmssIGlycSAlZCwgaHdfYWRkciAiLAorICAgICAgIGRldi0+bmFtZSwgZGV2LT5pcnEpOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgcHJpbnRrKCIlMDJYJXMiLCBkZXYtPmRldl9hZGRyW2ldLCAoKGk8NSkgPyAiOiIgOiAiXG4iKSk7CisKKyAgICByZXR1cm47CisKK2NzX2ZhaWxlZDoKKyAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKKworICAgIHJheV9yZWxlYXNlKGxpbmspOworfSAvKiByYXlfY29uZmlnICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNjcyBfX2lvbWVtICpjY3NfYmFzZShyYXlfZGV2X3QgKmRldikKK3sKKwlyZXR1cm4gZGV2LT5zcmFtICsgQ0NTX0JBU0U7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJjcyBfX2lvbWVtICpyY3NfYmFzZShyYXlfZGV2X3QgKmRldikKK3sKKwkvKgorCSAqIFRoaXMgbG9va3Mgbm9uc2Vuc2ljYWwsIHNpbmNlIHRoZXJlIGlzIGEgc2VwYXJhdGUKKwkgKiBSQ1NfQkFTRS4gQnV0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSAic3RydWN0IHJjcyIKKwkgKiBhbmQgYSAic3RydWN0IGNjcyIgZW5kcyB1cCBiZWluZyBpbiB0aGUgX2luZGV4XyBvZmYKKwkgKiB0aGUgYmFzZSwgc28gdGhlIGJhc2UgcG9pbnRlciBpcyB0aGUgc2FtZSBmb3IgYm90aAorCSAqIGNjcy9yY3MuCisJICovCisJcmV0dXJuIGRldi0+c3JhbSArIENDU19CQVNFOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHJheV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgaW50IGk7CisgICAgVUNIQVIgKnA7CisgICAgc3RydWN0IGNjcyBfX2lvbWVtICpwY2NzOworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworICAgIERFQlVHKDEsICJyYXlfaW5pdCgweCVwKVxuIiwgZGV2KTsKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygwLCJyYXlfaW5pdCAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBsb2NhbC0+bmV0X3R5cGUgPSBuZXRfdHlwZTsKKyAgICBsb2NhbC0+c3RhX3R5cGUgPSBUWVBFX1NUQTsKKworICAgIC8qIENvcHkgdGhlIHN0YXJ0dXAgcmVzdWx0cyB0byBsb2NhbCBtZW1vcnkgKi8KKyAgICBtZW1jcHlfZnJvbWlvKCZsb2NhbC0+c3RhcnR1cF9yZXMsIGxvY2FsLT5zcmFtICsgRUNGX1RPX0hPU1RfQkFTRSxcCisgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc3RhcnR1cF9yZXNfNikpOworCisgICAgLyogQ2hlY2sgUG93ZXIgdXAgdGVzdCBzdGF0dXMgYW5kIGdldCBtYWMgYWRkcmVzcyBmcm9tIGNhcmQgKi8KKyAgICBpZiAobG9jYWwtPnN0YXJ0dXBfcmVzLnN0YXJ0dXBfd29yZCAhPSAweDgwKSB7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAicmF5X2luaXQgRVJST1IgY2FyZCBzdGF0dXMgPSAlMnhcbiIsCisgICAgICAgICAgIGxvY2FsLT5zdGFydHVwX3Jlcy5zdGFydHVwX3dvcmQpOworICAgICAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0lOSVRfRVJST1I7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBsb2NhbC0+ZndfdmVyID0gbG9jYWwtPnN0YXJ0dXBfcmVzLmZpcm13YXJlX3ZlcnNpb25bMF07CisgICAgbG9jYWwtPmZ3X2JsZCA9IGxvY2FsLT5zdGFydHVwX3Jlcy5maXJtd2FyZV92ZXJzaW9uWzFdOworICAgIGxvY2FsLT5md192YXIgPSBsb2NhbC0+c3RhcnR1cF9yZXMuZmlybXdhcmVfdmVyc2lvblsyXTsKKyAgICBERUJVRygxLCJyYXlfaW5pdCBmaXJtd2FyZSB2ZXJzaW9uICVkLiVkIFxuIixsb2NhbC0+ZndfdmVyLCBsb2NhbC0+ZndfYmxkKTsKKworICAgIGxvY2FsLT50aWJfbGVuZ3RoID0gMHgyMDsKKyAgICBpZiAoKGxvY2FsLT5md192ZXIgPT0gNSkgJiYgKGxvY2FsLT5md19ibGQgPj0gMzApKQorICAgICAgICBsb2NhbC0+dGliX2xlbmd0aCA9IGxvY2FsLT5zdGFydHVwX3Jlcy50aWJfbGVuZ3RoOworICAgIERFQlVHKDIsInJheV9pbml0IHRpYl9sZW5ndGggPSAweCUwMnhcbiIsIGxvY2FsLT50aWJfbGVuZ3RoKTsKKyAgICAvKiBJbml0aWFsaXplIENDUydzIHRvIGJ1ZmZlciBmcmVlIHN0YXRlICovCisgICAgcGNjcyA9IGNjc19iYXNlKGxvY2FsKTsKKyAgICBmb3IgKGk9MDsgIGk8TlVNQkVSX09GX0NDUzsgIGkrKykgeworICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmKHBjY3MrKyktPmJ1ZmZlcl9zdGF0dXMpOworICAgIH0KKyAgICBpbml0X3N0YXJ0dXBfcGFyYW1zKGxvY2FsKTsKKworICAgIC8qIGNvcHkgbWFjIGFkZHJlc3MgdG8gc3RhcnR1cCBwYXJhbWV0ZXJzICovCisgICAgaWYgKHBhcnNlX2FkZHIocGh5X2FkZHIsIGxvY2FsLT5zcGFybS5iNC5hX21hY19hZGRyKSkKKyAgICB7CisgICAgICAgIHAgPSBsb2NhbC0+c3Bhcm0uYjQuYV9tYWNfYWRkcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbWVtY3B5KCZsb2NhbC0+c3Bhcm0uYjQuYV9tYWNfYWRkciwKKyAgICAgICAgICAgICAgICZsb2NhbC0+c3RhcnR1cF9yZXMuc3RhdGlvbl9hZGRyLCBBRERSTEVOKTsKKyAgICAgICAgcCA9IGxvY2FsLT5zcGFybS5iNC5hX21hY19hZGRyOworICAgIH0KKworICAgIGNsZWFyX2ludGVycnVwdChsb2NhbCk7IC8qIENsZWFyIGFueSBpbnRlcnJ1cHQgZnJvbSB0aGUgY2FyZCAqLworICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfQVdBSVRJTkdfUEFSQU07CisgICAgREVCVUcoMiwicmF5X2luaXQgZW5kaW5nXG4iKTsKKyAgICByZXR1cm4gMDsKK30gLyogcmF5X2luaXQgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIERvd25sb2FkIHN0YXJ0dXAgcGFyYW1ldGVycyB0byB0aGUgY2FyZCBhbmQgY29tbWFuZCBpdCB0byByZWFkIHRoZW0gICAgICAgKi8KK3N0YXRpYyBpbnQgZGxfc3RhcnR1cF9wYXJhbXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBpbnQgY2NzaW5kZXg7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisgICAgc3RydWN0IGNjcyBfX2lvbWVtICpwY2NzOworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworCisgICAgREVCVUcoMSwiZGxfc3RhcnR1cF9wYXJhbXMgZW50ZXJlZFxuIik7CisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2NzIGRsX3N0YXJ0dXBfcGFyYW1zIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAKKyAgICAvKiBDb3B5IHBhcmFtZXRlcnMgdG8gaG9zdCB0byBFQ0YgYXJlYSAqLworICAgIGlmIChsb2NhbC0+ZndfdmVyID09IDB4NTUpIAorICAgICAgICBtZW1jcHlfdG9pbyhsb2NhbC0+c3JhbSArIEhPU1RfVE9fRUNGX0JBU0UsICZsb2NhbC0+c3Bhcm0uYjQsCisgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGI0X3N0YXJ0dXBfcGFyYW1zKSk7CisgICAgZWxzZQorICAgICAgICBtZW1jcHlfdG9pbyhsb2NhbC0+c3JhbSArIEhPU1RfVE9fRUNGX0JBU0UsICZsb2NhbC0+c3Bhcm0uYjUsCisgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGI1X3N0YXJ0dXBfcGFyYW1zKSk7CisKKyAgICAKKyAgICAvKiBGaWxsIGluIHRoZSBDQ1MgZmllbGRzIGZvciB0aGUgRUNGICovCisgICAgaWYgKChjY3NpbmRleCA9IGdldF9mcmVlX2Njcyhsb2NhbCkpIDwgMCkgcmV0dXJuIC0xOworICAgIGxvY2FsLT5kbF9wYXJhbV9jY3MgPSBjY3NpbmRleDsKKyAgICBwY2NzID0gY2NzX2Jhc2UobG9jYWwpICsgY2NzaW5kZXg7CisgICAgd3JpdGViKENDU19ET1dOTE9BRF9TVEFSVFVQX1BBUkFNUywgJnBjY3MtPmNtZCk7CisgICAgREVCVUcoMiwiZGxfc3RhcnR1cF9wYXJhbXMgc3RhcnQgY2NzaW5kZXggPSAlZFxuIiwgbG9jYWwtPmRsX3BhcmFtX2Njcyk7CisgICAgLyogSW50ZXJydXB0IHRoZSBmaXJtd2FyZSB0byBwcm9jZXNzIHRoZSBjb21tYW5kICovCisgICAgaWYgKGludGVycnVwdF9lY2YobG9jYWwsIGNjc2luZGV4KSkgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJyYXkgZGxfc3RhcnR1cF9wYXJhbXMgZmFpbGVkIC0gIgorICAgICAgICAgICAiRUNGIG5vdCByZWFkeSBmb3IgaW50clxuIik7CisgICAgICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfRExfUEFSQU1fRVJST1I7CisgICAgICAgIHdyaXRlYihDQ1NfQlVGRkVSX0ZSRUUsICYocGNjcysrKS0+YnVmZmVyX3N0YXR1cyk7CisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CisgICAgbG9jYWwtPmNhcmRfc3RhdHVzID0gQ0FSRF9ETF9QQVJBTTsKKyAgICAvKiBTdGFydCBrZXJuZWwgdGltZXIgdG8gd2FpdCBmb3IgZGwgc3RhcnR1cCB0byBjb21wbGV0ZS4gKi8KKyAgICBsb2NhbC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWi8yOworICAgIGxvY2FsLT50aW1lci5kYXRhID0gKGxvbmcpbG9jYWw7CisgICAgbG9jYWwtPnRpbWVyLmZ1bmN0aW9uID0gJnZlcmlmeV9kbF9zdGFydHVwOworICAgIGFkZF90aW1lcigmbG9jYWwtPnRpbWVyKTsKKyAgICBERUJVRygyLCJyYXlfY3MgZGxfc3RhcnR1cF9wYXJhbXMgc3RhcnRlZCB0aW1lciBmb3IgdmVyaWZ5X2RsX3N0YXJ0dXBcbiIpOworICAgIHJldHVybiAwOworfSAvKiBkbF9zdGFydHVwX3BhcmFtcyAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgaW5pdF9zdGFydHVwX3BhcmFtcyhyYXlfZGV2X3QgKmxvY2FsKQoreworICAgIGludCBpOyAKKworICAgIGlmIChjb3VudHJ5ID4gSkFQQU5fVEVTVCkgY291bnRyeSA9IFVTQTsKKyAgICBlbHNlCisgICAgICAgIGlmIChjb3VudHJ5IDwgVVNBKSBjb3VudHJ5ID0gVVNBOworICAgIC8qIHN0cnVjdHVyZSBmb3IgaG9wIHRpbWUgYW5kIGJlYWNvbiBwZXJpb2QgaXMgZGVmaW5lZCBoZXJlIHVzaW5nIAorICAgICAqIE5ldyA4MDIuMTFENi4xIGZvcm1hdC4gIENhcmQgZmlybXdhcmUgaXMgc3RpbGwgdXNpbmcgb2xkIGZvcm1hdAorICAgICAqIHVudGlsIHZlcnNpb24gNi4KKyAgICAgKiAgICBCZWZvcmUgICAgICAgICAgICAgICAgICAgIEFmdGVyCisgICAgICogICAgYV9ob3BfdGltZSBtcyBieXRlICAgICAgICBhX2hvcF90aW1lIG1zIGJ5dGUKKyAgICAgKiAgICBhX2hvcF90aW1lIDJzIGJ5dGUgICAgICAgIGFfaG9wX3RpbWUgbHMgYnl0ZQorICAgICAqICAgIGFfaG9wX3RpbWUgbHMgYnl0ZSAgICAgICAgYV9iZWFjb25fcGVyaW9kIG1zIGJ5dGUKKyAgICAgKiAgICBhX2JlYWNvbl9wZXJpb2QgICAgICAgICAgIGFfYmVhY29uX3BlcmlvZCBscyBieXRlCisgICAgICoKKyAgICAgKiAgICBhX2hvcF90aW1lID0gdVMgICAgICAgICAgIGFfaG9wX3RpbWUgPSBLdVMKKyAgICAgKiAgICBhX2JlYWNvbl9wZXJpb2QgPSBob3BzICAgIGFfYmVhY29uX3BlcmlvZCA9IEt1UworICAgICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjRtcyA9IDAxMDAwMCAqLworICAgIGlmIChsb2NhbC0+ZndfdmVyID09IDB4NTUpICB7CisgICAgICAgIG1lbWNweSgoVUNIQVIgKikmbG9jYWwtPnNwYXJtLmI0LCBiNF9kZWZhdWx0X3N0YXJ0dXBfcGFybXMsIAorICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBiNF9zdGFydHVwX3BhcmFtcykpOworICAgICAgICAvKiBUcmFuc2xhdGUgc2FuZSBrdXMgaW5wdXQgdmFsdWVzIHRvIG9sZCBidWlsZCA0LzUgZm9ybWF0ICovCisgICAgICAgIC8qIGkgPSBob3AgdGltZSBpbiB1UyB0cnVuY2F0ZWQgdG8gMyBieXRlcyAqLworICAgICAgICBpID0gKGhvcF9kd2VsbCAqIDEwMjQpICYgMHhmZmZmZmY7CisgICAgICAgIGxvY2FsLT5zcGFybS5iNC5hX2hvcF90aW1lWzBdID0gKGkgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgbG9jYWwtPnNwYXJtLmI0LmFfaG9wX3RpbWVbMV0gPSAoaSA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGxvY2FsLT5zcGFybS5iNC5hX2JlYWNvbl9wZXJpb2RbMF0gPSAwOworICAgICAgICBsb2NhbC0+c3Bhcm0uYjQuYV9iZWFjb25fcGVyaW9kWzFdID0KKyAgICAgICAgICAgICgoYmVhY29uX3BlcmlvZC9ob3BfZHdlbGwpIC0gMSkgJiAweGZmOworICAgICAgICBsb2NhbC0+c3Bhcm0uYjQuYV9jdXJyX2NvdW50cnlfY29kZSA9IGNvdW50cnk7CisgICAgICAgIGxvY2FsLT5zcGFybS5iNC5hX2hvcF9wYXR0ZXJuX2xlbmd0aCA9IAorICAgICAgICAgICAgaG9wX3BhdHRlcm5fbGVuZ3RoWyhpbnQpY291bnRyeV0gLSAxOworICAgICAgICBpZiAoYmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsLT5zcGFybS5iNC5hX2Fja190aW1lb3V0ID0gMHg1MDsKKyAgICAgICAgICAgIGxvY2FsLT5zcGFybS5iNC5hX3NpZnMgPSAweDNmOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeyAgICAvKiBWZXJzaW9uIDUgdXNlcyByZWFsIGt1cyB2YWx1ZXMgKi8KKyAgICAgICAgbWVtY3B5KChVQ0hBUiAqKSZsb2NhbC0+c3Bhcm0uYjUsIGI1X2RlZmF1bHRfc3RhcnR1cF9wYXJtcywgCisgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGI1X3N0YXJ0dXBfcGFyYW1zKSk7CisKKyAgICAgICAgbG9jYWwtPnNwYXJtLmI1LmFfaG9wX3RpbWVbMF0gPSAoaG9wX2R3ZWxsID4+IDgpICYgMHhmZjsKKyAgICAgICAgbG9jYWwtPnNwYXJtLmI1LmFfaG9wX3RpbWVbMV0gPSBob3BfZHdlbGwgJiAweGZmOworICAgICAgICBsb2NhbC0+c3Bhcm0uYjUuYV9iZWFjb25fcGVyaW9kWzBdID0gKGJlYWNvbl9wZXJpb2QgPj4gOCkgJiAweGZmOworICAgICAgICBsb2NhbC0+c3Bhcm0uYjUuYV9iZWFjb25fcGVyaW9kWzFdID0gYmVhY29uX3BlcmlvZCAmIDB4ZmY7CisgICAgICAgIGlmIChwc20pCisgICAgICAgICAgICBsb2NhbC0+c3Bhcm0uYjUuYV9wb3dlcl9tZ3Rfc3RhdGUgPSAxOworICAgICAgICBsb2NhbC0+c3Bhcm0uYjUuYV9jdXJyX2NvdW50cnlfY29kZSA9IGNvdW50cnk7CisgICAgICAgIGxvY2FsLT5zcGFybS5iNS5hX2hvcF9wYXR0ZXJuX2xlbmd0aCA9IAorICAgICAgICAgICAgaG9wX3BhdHRlcm5fbGVuZ3RoWyhpbnQpY291bnRyeV07CisgICAgfQorICAgIAorICAgIGxvY2FsLT5zcGFybS5iNC5hX25ldHdvcmtfdHlwZSA9IG5ldF90eXBlICYgMHgwMTsKKyAgICBsb2NhbC0+c3Bhcm0uYjQuYV9hY3RpbmdfYXNfYXBfc3RhdHVzID0gVFlQRV9TVEE7CisKKyAgICBpZiAoZXNzaWQgIT0gTlVMTCkKKyAgICAgICAgc3RybmNweShsb2NhbC0+c3Bhcm0uYjQuYV9jdXJyZW50X2Vzc19pZCwgZXNzaWQsIEVTU0lEX1NJWkUpOworfSAvKiBpbml0X3N0YXJ0dXBfcGFyYW1zICovIAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgdmVyaWZ5X2RsX3N0YXJ0dXAodV9sb25nIGRhdGEpCit7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkYXRhOworICAgIHN0cnVjdCBjY3MgX19pb21lbSAqcGNjcyA9IGNjc19iYXNlKGxvY2FsKSArIGxvY2FsLT5kbF9wYXJhbV9jY3M7CisgICAgVUNIQVIgc3RhdHVzOworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworCisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2NzIHZlcmlmeV9kbF9zdGFydHVwIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgICBpZiAocGNfZGVidWcgPiAyKSB7CisgICAgaW50IGk7CisgICAgcHJpbnRrKEtFUk5fREVCVUcgInZlcmlmeV9kbF9zdGFydHVwIHBhcmFtZXRlcnMgc2VudCB2aWEgY2NzICVkOlxuIiwKKyAgICAgICAgICAgbG9jYWwtPmRsX3BhcmFtX2Njcyk7CisgICAgICAgIGZvciAoaT0wOyBpPHNpemVvZihzdHJ1Y3QgYjVfc3RhcnR1cF9wYXJhbXMpOyBpKyspIHsKKyAgICAgICAgICAgIHByaW50aygiICUyeCIsICh1bnNpZ25lZCBpbnQpIHJlYWRiKGxvY2FsLT5zcmFtICsgSE9TVF9UT19FQ0ZfQkFTRSArIGkpKTsKKyAgICAgICAgfQorICAgIHByaW50aygiXG4iKTsKKyAgICB9CisjZW5kaWYKKworICAgIHN0YXR1cyA9IHJlYWRiKCZwY2NzLT5idWZmZXJfc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzIT0gQ0NTX0JVRkZFUl9GUkVFKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiRG93bmxvYWQgc3RhcnR1cCBwYXJhbXMgZmFpbGVkLiAgU3RhdHVzID0gJWRcbiIsCisgICAgICAgICAgIHN0YXR1cyk7CisgICAgICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfRExfUEFSQU1fRVJST1I7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGxvY2FsLT5zcGFybS5iNC5hX25ldHdvcmtfdHlwZSA9PSBBREhPQykKKyAgICAgICAgc3RhcnRfbmV0KCh1X2xvbmcpbG9jYWwpOworICAgIGVsc2UKKyAgICAgICAgam9pbl9uZXQoKHVfbG9uZylsb2NhbCk7CisKKyAgICByZXR1cm47Cit9IC8qIGVuZCB2ZXJpZnlfZGxfc3RhcnR1cCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogQ29tbWFuZCBjYXJkIHRvIHN0YXJ0IGEgbmV0d29yayAqLworc3RhdGljIHZvaWQgc3RhcnRfbmV0KHVfbG9uZyBkYXRhKQoreworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGF0YTsKKyAgICBzdHJ1Y3QgY2NzIF9faW9tZW0gKnBjY3M7CisgICAgaW50IGNjc2luZGV4OworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworICAgIGlmICghKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpKSB7CisgICAgICAgIERFQlVHKDIsInJheV9jcyBzdGFydF9uZXQgLSBkZXZpY2Ugbm90IHByZXNlbnRcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIEZpbGwgaW4gdGhlIENDUyBmaWVsZHMgZm9yIHRoZSBFQ0YgKi8KKyAgICBpZiAoKGNjc2luZGV4ID0gZ2V0X2ZyZWVfY2NzKGxvY2FsKSkgPCAwKSByZXR1cm47CisgICAgcGNjcyA9IGNjc19iYXNlKGxvY2FsKSArIGNjc2luZGV4OworICAgIHdyaXRlYihDQ1NfU1RBUlRfTkVUV09SSywgJnBjY3MtPmNtZCk7CisgICAgd3JpdGViKDAsICZwY2NzLT52YXIuc3RhcnRfbmV0d29yay51cGRhdGVfcGFyYW0pOworICAgIC8qIEludGVycnVwdCB0aGUgZmlybXdhcmUgdG8gcHJvY2VzcyB0aGUgY29tbWFuZCAqLworICAgIGlmIChpbnRlcnJ1cHRfZWNmKGxvY2FsLCBjY3NpbmRleCkpIHsKKyAgICAgICAgREVCVUcoMSwicmF5IHN0YXJ0IG5ldCBmYWlsZWQgLSBjYXJkIG5vdCByZWFkeSBmb3IgaW50clxuIik7CisgICAgICAgIHdyaXRlYihDQ1NfQlVGRkVSX0ZSRUUsICYocGNjcysrKS0+YnVmZmVyX3N0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbG9jYWwtPmNhcmRfc3RhdHVzID0gQ0FSRF9ET0lOR19BQ1E7CisgICAgcmV0dXJuOworfSAvKiBlbmQgc3RhcnRfbmV0ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBDb21tYW5kIGNhcmQgdG8gam9pbiBhIG5ldHdvcmsgKi8KK3N0YXRpYyB2b2lkIGpvaW5fbmV0KHVfbG9uZyBkYXRhKQoreworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGF0YTsKKworICAgIHN0cnVjdCBjY3MgX19pb21lbSAqcGNjczsKKyAgICBpbnQgY2NzaW5kZXg7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisgICAgCisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2NzIGpvaW5fbmV0IC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBGaWxsIGluIHRoZSBDQ1MgZmllbGRzIGZvciB0aGUgRUNGICovCisgICAgaWYgKChjY3NpbmRleCA9IGdldF9mcmVlX2Njcyhsb2NhbCkpIDwgMCkgcmV0dXJuOworICAgIHBjY3MgPSBjY3NfYmFzZShsb2NhbCkgKyBjY3NpbmRleDsKKyAgICB3cml0ZWIoQ0NTX0pPSU5fTkVUV09SSywgJnBjY3MtPmNtZCk7CisgICAgd3JpdGViKDAsICZwY2NzLT52YXIuam9pbl9uZXR3b3JrLnVwZGF0ZV9wYXJhbSk7CisgICAgd3JpdGViKDAsICZwY2NzLT52YXIuam9pbl9uZXR3b3JrLm5ldF9pbml0aWF0ZWQpOworICAgIC8qIEludGVycnVwdCB0aGUgZmlybXdhcmUgdG8gcHJvY2VzcyB0aGUgY29tbWFuZCAqLworICAgIGlmIChpbnRlcnJ1cHRfZWNmKGxvY2FsLCBjY3NpbmRleCkpIHsKKyAgICAgICAgREVCVUcoMSwicmF5IGpvaW4gbmV0IGZhaWxlZCAtIGNhcmQgbm90IHJlYWR5IGZvciBpbnRyXG4iKTsKKyAgICAgICAgd3JpdGViKENDU19CVUZGRVJfRlJFRSwgJihwY2NzKyspLT5idWZmZXJfc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0RPSU5HX0FDUTsKKyAgICByZXR1cm47Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgcmF5X3JlbGVhc2UoKSB3aWxsIHVucmVnaXN0ZXIgdGhlIG5ldAorICAgIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICAgIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgcmF5X3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsgCisgICAgcmF5X2Rldl90ICpsb2NhbCA9IGRldi0+cHJpdjsKKyAgICBpbnQgaTsKKyAgICAKKyAgICBERUJVRygxLCAicmF5X3JlbGVhc2UoMHglcClcbiIsIGxpbmspOworCisgICAgZGVsX3RpbWVyKCZsb2NhbC0+dGltZXIpOworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworCisgICAgaW91bm1hcChsb2NhbC0+c3JhbSk7CisgICAgaW91bm1hcChsb2NhbC0+cm1lbSk7CisgICAgaW91bm1hcChsb2NhbC0+YW1lbSk7CisgICAgLyogRG8gYm90aGVyIGNoZWNraW5nIHRvIHNlZSBpZiB0aGVzZSBzdWNjZWVkIG9yIG5vdCAqLworICAgIGkgPSBwY21jaWFfcmVsZWFzZV93aW5kb3cobGluay0+d2luKTsKKyAgICBpZiAoIGkgIT0gQ1NfU1VDQ0VTUyApIERFQlVHKDAsIlJlbGVhc2VXaW5kb3cobGluay0+d2luKSByZXQgPSAleFxuIixpKTsKKyAgICBpID0gcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxvY2FsLT5hbWVtX2hhbmRsZSk7CisgICAgaWYgKCBpICE9IENTX1NVQ0NFU1MgKSBERUJVRygwLCJSZWxlYXNlV2luZG93KGxvY2FsLT5hbWVtKSByZXQgPSAleFxuIixpKTsKKyAgICBpID0gcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxvY2FsLT5ybWVtX2hhbmRsZSk7CisgICAgaWYgKCBpICE9IENTX1NVQ0NFU1MgKSBERUJVRygwLCJSZWxlYXNlV2luZG93KGxvY2FsLT5ybWVtKSByZXQgPSAleFxuIixpKTsKKyAgICBpID0gcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworICAgIGlmICggaSAhPSBDU19TVUNDRVNTICkgREVCVUcoMCwiUmVsZWFzZUNvbmZpZ3VyYXRpb24gcmV0ID0gJXhcbiIsaSk7CisgICAgaSA9IHBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworICAgIGlmICggaSAhPSBDU19TVUNDRVNTICkgREVCVUcoMCwiUmVsZWFzZUlSUSByZXQgPSAleFxuIixpKTsKKworICAgIERFQlVHKDIsInJheV9yZWxlYXNlIGVuZGluZ1xuIik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gIE1vc3RseSwgdGhpcyBzY2hlZHVsZXMgb3RoZXIKKyAgICBzdHVmZiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuICBBIENBUkRfUkVNT1ZBTCBldmVudAorICAgIGFsc28gc2V0cyBzb21lIGZsYWdzIHRvIGRpc2NvdXJhZ2UgdGhlIG5ldCBkcml2ZXJzIGZyb20gdHJ5aW5nCisgICAgdG8gdGFsayB0byB0aGUgY2FyZCBhbnkgbW9yZS4KKworICAgIFdoZW4gYSBDQVJEX1JFTU9WQUwgZXZlbnQgaXMgcmVjZWl2ZWQsIHdlIGltbWVkaWF0ZWx5IHNldCBhIGZsYWcKKyAgICB0byBibG9jayBmdXR1cmUgYWNjZXNzZXMgdG8gdGhpcyBkZXZpY2UuICBBbGwgdGhlIGZ1bmN0aW9ucyB0aGF0CisgICAgYWN0dWFsbHkgYWNjZXNzIHRoZSBkZXZpY2Ugc2hvdWxkIGNoZWNrIHRoaXMgZmxhZyB0byBtYWtlIHN1cmUKKyAgICB0aGUgY2FyZCBpcyBzdGlsbCBwcmVzZW50LgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCByYXlfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworICAgIGRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICByYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKKyAgICBERUJVRygxLCAicmF5X2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKyAgICAKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisgICAgICAgIGxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKyAgICAgICAgbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworICAgICAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIHJheV9yZWxlYXNlKGxpbmspOworICAgICAgICAgICAgZGVsX3RpbWVyKCZsb2NhbC0+dGltZXIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisgICAgICAgIGxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOworICAgICAgICByYXlfY29uZmlnKGxpbmspOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisgICAgICAgIGxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOworICAgICAgICAvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorICAgICAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisgICAgICAgICAgICBpZiAobGluay0+b3BlbikKKyAgICAgICAgICAgIAluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKyAgICAgICAgICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKyAgICAgICAgbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworICAgICAgICAvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisgICAgICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKyAgICAgICAgICAgIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisgICAgICAgICAgICBpZiAobGluay0+b3BlbikgeworICAgICAgICAgICAgICAgIHJheV9yZXNldChkZXYpOworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworICAgIERFQlVHKDIsInJheV9ldmVudCBlbmRpbmdcbiIpOworfSAvKiByYXlfZXZlbnQgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCByYXlfZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZmRlZiBSQVlfSU1NRURJQVRFX0lOSVQKKyAgICBpbnQgaTsKKyNlbmRpZgkvKiBSQVlfSU1NRURJQVRFX0lOSVQgKi8KKyAgICByYXlfZGV2X3QgKmxvY2FsID0gZGV2LT5wcml2OworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworCisgICAgREVCVUcoMSwicmF5X2Rldl9pbml0KGRldj0lcClcbiIsZGV2KTsKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygyLCJyYXlfZGV2X2luaXQgLSBkZXZpY2Ugbm90IHByZXNlbnRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorI2lmZGVmIFJBWV9JTU1FRElBVEVfSU5JVAorICAgIC8qIERvd25sb2FkIHN0YXJ0dXAgcGFyYW1ldGVycyAqLworICAgIGlmICggKGkgPSBkbF9zdGFydHVwX3BhcmFtcyhkZXYpKSA8IDApCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJyYXlfZGV2X2luaXQgZGxfc3RhcnR1cF9wYXJhbXMgZmFpbGVkIC0gIgorICAgICAgICAgICAicmV0dXJucyAweCV4XG4iLGkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorI2Vsc2UJLyogUkFZX0lNTUVESUFURV9JTklUICovCisgICAgLyogUG9zdHBvbmUgdGhlIGNhcmQgaW5pdCBzbyB0aGF0IHdlIGNhbiBzdGlsbCBjb25maWd1cmUgdGhlIGNhcmQsCisgICAgICogZm9yIGV4YW1wbGUgdXNpbmcgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbnMuIFRoZSBpbml0IHdpbGwgaGFwcGVuCisgICAgICogaW4gcmF5X29wZW4oKSAtIEplYW4gSUkgKi8KKyAgICBERUJVRygxLCJyYXlfZGV2X2luaXQ6IHBvc3Rwb25pbmcgY2FyZCBpbml0IHRvIHJheV9vcGVuKCkgOyBTdGF0dXMgPSAlZFxuIiwKKwkgIGxvY2FsLT5jYXJkX3N0YXR1cyk7CisjZW5kaWYJLyogUkFZX0lNTUVESUFURV9JTklUICovCisKKyAgICAvKiBjb3B5IG1hYyBhbmQgYnJvYWRjYXN0IGFkZHJlc3NlcyB0byBsaW51eCBkZXZpY2UgKi8KKyAgICBtZW1jcHkoJmRldi0+ZGV2X2FkZHIsICZsb2NhbC0+c3Bhcm0uYjQuYV9tYWNfYWRkciwgQUREUkxFTik7CisgICAgbWVtc2V0KGRldi0+YnJvYWRjYXN0LCAweGZmLCBFVEhfQUxFTik7CisKKyAgICBERUJVRygyLCJyYXlfZGV2X2luaXQgZW5kaW5nXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQgcmF5X2Rldl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApCit7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IGRldi0+cHJpdjsKKyAgICBkZXZfbGlua190ICpsaW5rID0gbG9jYWwtPmZpbmRlcjsKKyAgICAvKiBEdW1teSByb3V0aW5lIHRvIHNhdGlzZnkgZGV2aWNlIHN0cnVjdHVyZSAqLworICAgIERFQlVHKDEsInJheV9kZXZfY29uZmlnKGRldj0lcCxpZm1hcD0lcClcbiIsZGV2LG1hcCk7CisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2Rldl9jb25maWcgLSBkZXZpY2Ugbm90IHByZXNlbnRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHJheV9kZXZfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHJheV9kZXZfdCAqbG9jYWwgPSBkZXYtPnByaXY7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisgICAgc2hvcnQgbGVuZ3RoID0gc2tiLT5sZW47CisKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygyLCJyYXlfZGV2X3N0YXJ0X3htaXQgLSBkZXZpY2Ugbm90IHByZXNlbnRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIERFQlVHKDMsInJheV9kZXZfc3RhcnRfeG1pdChza2I9JXAsIGRldj0lcClcbiIsc2tiLGRldik7CisgICAgaWYgKGxvY2FsLT5hdXRoZW50aWNhdGlvbl9zdGF0ZSA9PSBORUVEX1RPX0FVVEgpIHsKKyAgICAgICAgREVCVUcoMCwicmF5X2NzIFNlbmRpbmcgYXV0aGVudGljYXRpb24gcmVxdWVzdC5cbiIpOworICAgICAgICBpZiAoIWJ1aWxkX2F1dGhfZnJhbWUgKGxvY2FsLCBsb2NhbC0+YXV0aF9pZCwgT1BFTl9BVVRIX1JFUVVFU1QpKSB7CisgICAgICAgICAgICBsb2NhbC0+YXV0aGVudGljYXRpb25fc3RhdGUgPSBBVVRIRU5USUNBVEVEOworICAgICAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobGVuZ3RoIDwgRVRIX1pMRU4pCisgICAgeworICAgIAlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisgICAgCWlmIChza2IgPT0gTlVMTCkKKyAgICAJCXJldHVybiAwOworICAgIAlsZW5ndGggPSBFVEhfWkxFTjsKKyAgICB9CisgICAgc3dpdGNoIChyYXlfaHdfeG1pdCggc2tiLT5kYXRhLCBsZW5ndGgsIGRldiwgREFUQV9UWVBFKSkgeworICAgICAgICBjYXNlIFhNSVRfTk9fQ0NTOgorICAgICAgICBjYXNlIFhNSVRfTkVFRF9BVVRIOgorCSAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBYTUlUX05PX0lOVFI6CisgICAgICAgIGNhc2UgWE1JVF9NU0dfQkFEOgorICAgICAgICBjYXNlIFhNSVRfT0s6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICAgICAgICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMDsKK30gLyogcmF5X2Rldl9zdGFydF94bWl0ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHJheV9od194bWl0KHVuc2lnbmVkIGNoYXIqIGRhdGEsIGludCBsZW4sIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIAorICAgICAgICAgICAgICAgIFVDSEFSIG1zZ190eXBlKQoreworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworICAgIHN0cnVjdCBjY3MgX19pb21lbSAqcGNjczsKKyAgICBpbnQgY2NzaW5kZXg7CisgICAgaW50IG9mZnNldDsKKyAgICBzdHJ1Y3QgdHhfbXNnIF9faW9tZW0gKnB0eDsgLyogQWRkcmVzcyBvZiB4bWl0IGJ1ZmZlciBpbiBQQyBzcGFjZSAqLworICAgIHNob3J0IGludCBhZGRyOyAgICAgLyogQWRkcmVzcyBvZiB4bWl0IGJ1ZmZlciBpbiBjYXJkIHNwYWNlICovCisgICAgCisgICAgREVCVUcoMywicmF5X2h3X3htaXQoZGF0YT0lcCwgbGVuPSVkLCBkZXY9JXApXG4iLGRhdGEsbGVuLGRldik7CisgICAgaWYgKGxlbiArIFRYX0hFQURFUl9MRU5HVEggPiBUWF9CVUZfU0laRSkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gInJheV9od194bWl0IHBhY2tldCB0b28gbGFyZ2U6ICVkIGJ5dGVzXG4iLGxlbik7CisgICAgICAgIHJldHVybiBYTUlUX01TR19CQUQ7CisgICAgfQorCXN3aXRjaCAoY2NzaW5kZXggPSBnZXRfZnJlZV90eF9jY3MobG9jYWwpKSB7CisJY2FzZSBFQ0NTQlVTWToKKwkJREVCVUcoMiwicmF5X2h3X3htaXQgdHhfY2NzIHRhYmxlIGJ1c3lcbiIpOworCWNhc2UgRUNDU0ZVTEw6CisgICAgICAgIERFQlVHKDIsInJheV9od194bWl0IE5vIGZyZWUgdHggY2NzXG4iKTsKKwljYXNlIEVDQVJER09ORToKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgICAgIHJldHVybiBYTUlUX05PX0NDUzsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisgICAgYWRkciA9IFRYX0JVRl9CQVNFICsgKGNjc2luZGV4IDw8IDExKTsKKworICAgIGlmIChtc2dfdHlwZSA9PSBEQVRBX1RZUEUpIHsKKyAgICAgICAgbG9jYWwtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKyAgICAgICAgbG9jYWwtPnN0YXRzLnR4X3BhY2tldHMrKzsKKyAgICB9CisKKyAgICBwdHggPSBsb2NhbC0+c3JhbSArIGFkZHI7CisKKyAgICByYXlfYnVpbGRfaGVhZGVyKGxvY2FsLCBwdHgsIG1zZ190eXBlLCBkYXRhKTsKKyAgICBpZiAodHJhbnNsYXRlKSB7CisgICAgICAgIG9mZnNldCA9IHRyYW5zbGF0ZV9mcmFtZShsb2NhbCwgcHR4LCBkYXRhLCBsZW4pOworICAgIH0KKyAgICBlbHNlIHsgLyogRW5jYXBzdWxhdGUgZnJhbWUgKi8KKyAgICAgICAgLyogVEJEIFRJQiBsZW5ndGggd2lsbCBtb3ZlIGFkZHJlc3Mgb2YgcHR4LT52YXIgKi8KKyAgICAgICAgbWVtY3B5X3RvaW8oJnB0eC0+dmFyLCBkYXRhLCBsZW4pOworICAgICAgICBvZmZzZXQgPSAwOworICAgIH0KKworICAgIC8qIGZpbGwgaW4gdGhlIENDUyAqLworICAgIHBjY3MgPSBjY3NfYmFzZShsb2NhbCkgKyBjY3NpbmRleDsKKyAgICBsZW4gKz0gVFhfSEVBREVSX0xFTkdUSCArIG9mZnNldDsKKyAgICB3cml0ZWIoQ0NTX1RYX1JFUVVFU1QsICZwY2NzLT5jbWQpOworICAgIHdyaXRlYihhZGRyID4+IDgsICZwY2NzLT52YXIudHhfcmVxdWVzdC50eF9kYXRhX3B0clswXSk7CisgICAgd3JpdGViKGxvY2FsLT50aWJfbGVuZ3RoLCAmcGNjcy0+dmFyLnR4X3JlcXVlc3QudHhfZGF0YV9wdHJbMV0pOworICAgIHdyaXRlYihsZW4gPj4gOCwgJnBjY3MtPnZhci50eF9yZXF1ZXN0LnR4X2RhdGFfbGVuZ3RoWzBdKTsKKyAgICB3cml0ZWIobGVuICYgMHhmZiwgJnBjY3MtPnZhci50eF9yZXF1ZXN0LnR4X2RhdGFfbGVuZ3RoWzFdKTsKKy8qIFRCRCBzdGlsbCBuZWVkIHBzbV9jYW0/ICovCisgICAgd3JpdGViKFBTTV9DQU0sICZwY2NzLT52YXIudHhfcmVxdWVzdC5wb3dfc2F2X21vZGUpOworICAgIHdyaXRlYihsb2NhbC0+bmV0X2RlZmF1bHRfdHhfcmF0ZSwgJnBjY3MtPnZhci50eF9yZXF1ZXN0LnR4X3JhdGUpOworICAgIHdyaXRlYigwLCAmcGNjcy0+dmFyLnR4X3JlcXVlc3QuYW50ZW5uYSk7CisgICAgREVCVUcoMywicmF5X2h3X3htaXQgZGVmYXVsdF90eF9yYXRlID0gMHgleFxuIixcCisgICAgICAgICAgbG9jYWwtPm5ldF9kZWZhdWx0X3R4X3JhdGUpOworCisgICAgLyogSW50ZXJydXB0IHRoZSBmaXJtd2FyZSB0byBwcm9jZXNzIHRoZSBjb21tYW5kICovCisgICAgaWYgKGludGVycnVwdF9lY2YobG9jYWwsIGNjc2luZGV4KSkgeworICAgICAgICBERUJVRygyLCJyYXlfaHdfeG1pdCBmYWlsZWQgLSBFQ0Ygbm90IHJlYWR5IGZvciBpbnRyXG4iKTsKKy8qIFRCRCB2ZXJ5IGluZWZmaWNpZW50IHRvIGNvcHkgcGFja2V0IHRvIGJ1ZmZlciwgYW5kIHRoZW4gbm90CisgICBzZW5kIGl0LCBidXQgdGhlIGFsdGVybmF0aXZlIGlzIHRvIHF1ZXVlIHRoZSBtZXNzYWdlcyBhbmQgdGhhdAorICAgd29uJ3QgYmUgZG9uZSBmb3IgYSB3aGlsZS4gIE1heWJlIHNldCB0YnVzeSB1bnRpbCBhIENDUyBpcyBmcmVlPworKi8KKyAgICAgICAgd3JpdGViKENDU19CVUZGRVJfRlJFRSwgJnBjY3MtPmJ1ZmZlcl9zdGF0dXMpOworICAgICAgICByZXR1cm4gWE1JVF9OT19JTlRSOworICAgIH0KKyAgICByZXR1cm4gWE1JVF9PSzsKK30gLyogZW5kIHJheV9od194bWl0ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHRyYW5zbGF0ZV9mcmFtZShyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgdHhfbXNnIF9faW9tZW0gKnB0eCwgdW5zaWduZWQgY2hhciAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbikKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgcHJvdG8gPSAoKHN0cnVjdCBldGhoZHIgKilkYXRhKS0+aF9wcm90bzsKKyAgICBpZiAobnRvaHMocHJvdG8pID49IDE1MzYpIHsgLyogRElYIElJIGV0aGVybmV0IGZyYW1lICovCisgICAgICAgIERFQlVHKDMsInJheV9jcyB0cmFuc2xhdGVfZnJhbWUgRElYIElJXG4iKTsKKyAgICAgICAgLyogQ29weSBMTEMgaGVhZGVyIHRvIGNhcmQgYnVmZmVyICovCisgICAgICAgIG1lbWNweV90b2lvKCZwdHgtPnZhciwgZXRoMl9sbGMsIHNpemVvZihldGgyX2xsYykpOworICAgICAgICBtZW1jcHlfdG9pbyggKCh2b2lkIF9faW9tZW0gKikmcHR4LT52YXIpICsgc2l6ZW9mKGV0aDJfbGxjKSwgKFVDSEFSICopJnByb3RvLCAyKTsKKyAgICAgICAgaWYgKChwcm90byA9PSAweGYzODApIHx8IChwcm90byA9PSAweDM3ODEpKSB7CisgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBzZWxlY3RpdmUgdHJhbnNsYXRpb24gdGFibGUsIG9ubHkgMiBlbnRyaWVzICovCisgICAgICAgICAgICB3cml0ZWIoMHhmOCwgJigoc3RydWN0IHNuYXBoZHJfdCBfX2lvbWVtICopcHR4LT52YXIpLT5vcmdbM10pOworICAgICAgICB9CisgICAgICAgIC8qIENvcHkgYm9keSBvZiBldGhlcm5ldCBwYWNrZXQgd2l0aG91dCBldGhlcm5ldCBoZWFkZXIgKi8KKyAgICAgICAgbWVtY3B5X3RvaW8oKHZvaWQgX19pb21lbSAqKSZwdHgtPnZhciArIHNpemVvZihzdHJ1Y3Qgc25hcGhkcl90KSwgXAorICAgICAgICAgICAgICAgICAgICBkYXRhICsgRVRIX0hMRU4sICBsZW4gLSBFVEhfSExFTik7CisgICAgICAgIHJldHVybiAoaW50KSBzaXplb2Yoc3RydWN0IHNuYXBoZHJfdCkgLSBFVEhfSExFTjsKKyAgICB9CisgICAgZWxzZSB7IC8qIGFscmVhZHkgIDgwMiB0eXBlLCBhbmQgcHJvdG8gaXMgbGVuZ3RoICovCisgICAgICAgIERFQlVHKDMsInJheV9jcyB0cmFuc2xhdGVfZnJhbWUgODAyXG4iKTsKKyAgICAgICAgaWYgKHByb3RvID09IDB4ZmZmZikgeyAvKiBldmlsIG5ldHdhcmUgSVBYIDgwMi4zIHdpdGhvdXQgTExDICovCisgICAgICAgIERFQlVHKDMsInJheV9jcyB0cmFuc2xhdGVfZnJhbWUgZXZpbCBJUFhcbiIpOworICAgICAgICAgICAgbWVtY3B5X3RvaW8oJnB0eC0+dmFyLCBkYXRhICsgRVRIX0hMRU4sICBsZW4gLSBFVEhfSExFTik7CisgICAgICAgICAgICByZXR1cm4gMCAtIEVUSF9ITEVOOworICAgICAgICB9CisgICAgICAgIG1lbWNweV90b2lvKCZwdHgtPnZhciwgZGF0YSArIEVUSF9ITEVOLCAgbGVuIC0gRVRIX0hMRU4pOworICAgICAgICByZXR1cm4gMCAtIEVUSF9ITEVOOworICAgIH0KKyAgICAvKiBUQkQgZG8gb3RoZXIgZnJhbWUgdHlwZXMgKi8KK30gLyogZW5kIHRyYW5zbGF0ZV9mcmFtZSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgcmF5X2J1aWxkX2hlYWRlcihyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgdHhfbXNnIF9faW9tZW0gKnB0eCwgVUNIQVIgbXNnX3R5cGUsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKyAgICB3cml0ZWIoUFJPVE9DT0xfVkVSIHwgbXNnX3R5cGUsICZwdHgtPm1hYy5mcmFtZV9jdGxfMSk7CisvKioqIElFRUUgODAyLjExIEFkZHJlc3MgZmllbGQgYXNzaWdubWVudHMgKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgIFRPRFMgRlJPTURTICAgYWRkcl8xICAgICBhZGRyXzIgICAgICAgICAgYWRkcl8zICAgYWRkcl80CitBZGhvYyAgICAgICAgICAgMCAgICAwICAgICAgICBkZXN0ICAgICAgIHNyYyAodGVybWluYWwpICBCU1NJRCAgICBOL0EKK0FQIHRvIFRlcm1pbmFsICAwICAgIDEgICAgICAgIGRlc3QgICAgICAgQVAoQlNTSUQpICAgICAgIHNvdXJjZSAgIE4vQQorVGVybWluYWwgdG8gQVAgIDEgICAgMCAgICAgICAgQVAoQlNTSUQpICBzcmMgKHRlcm1pbmFsKSAgZGVzdCAgICAgTi9BCitBUCB0byBBUCAgICAgICAgMSAgICAxICAgICAgICBkZXN0IEFQICAgIHNyYyBBUCAgICAgICAgICBkZXN0ICAgICBzb3VyY2UgICAgICAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKGxvY2FsLT5uZXRfdHlwZSA9PSBBREhPQykgeyAgIAorICAgICAgICB3cml0ZWIoMCwgJnB0eC0+bWFjLmZyYW1lX2N0bF8yKTsKKyAgICAgICAgbWVtY3B5X3RvaW8ocHR4LT5tYWMuYWRkcl8xLCAoKHN0cnVjdCBldGhoZHIgKilkYXRhKS0+aF9kZXN0LCAyICogQUREUkxFTik7CisgICAgICAgIG1lbWNweV90b2lvKHB0eC0+bWFjLmFkZHJfMywgbG9jYWwtPmJzc19pZCwgQUREUkxFTik7CisgICAgfQorICAgIGVsc2UgLyogaW5mcmFzdHJ1Y3R1cmUgKi8KKyAgICB7CisgICAgICAgIGlmIChsb2NhbC0+c3Bhcm0uYjQuYV9hY3RpbmdfYXNfYXBfc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZWIoRkMyX0ZST01fRFMsICZwdHgtPm1hYy5mcmFtZV9jdGxfMik7CisgICAgICAgICAgICBtZW1jcHlfdG9pbyhwdHgtPm1hYy5hZGRyXzEsICgoc3RydWN0IGV0aGhkciAqKWRhdGEpLT5oX2Rlc3QsIEFERFJMRU4pOworICAgICAgICAgICAgbWVtY3B5X3RvaW8ocHR4LT5tYWMuYWRkcl8yLCBsb2NhbC0+YnNzX2lkLCA2KTsKKyAgICAgICAgICAgIG1lbWNweV90b2lvKHB0eC0+bWFjLmFkZHJfMywgKChzdHJ1Y3QgZXRoaGRyICopZGF0YSktPmhfc291cmNlLCBBRERSTEVOKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIFRlcm1pbmFsICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlYihGQzJfVE9fRFMsICZwdHgtPm1hYy5mcmFtZV9jdGxfMik7CisgICAgICAgICAgICBtZW1jcHlfdG9pbyhwdHgtPm1hYy5hZGRyXzEsIGxvY2FsLT5ic3NfaWQsIEFERFJMRU4pOworICAgICAgICAgICAgbWVtY3B5X3RvaW8ocHR4LT5tYWMuYWRkcl8yLCAoKHN0cnVjdCBldGhoZHIgKilkYXRhKS0+aF9zb3VyY2UsIEFERFJMRU4pOworICAgICAgICAgICAgbWVtY3B5X3RvaW8ocHR4LT5tYWMuYWRkcl8zLCAoKHN0cnVjdCBldGhoZHIgKilkYXRhKS0+aF9kZXN0LCBBRERSTEVOKTsKKyAgICAgICAgfQorICAgIH0KK30gLyogZW5kIGVuY2Fwc3VsYXRlX2ZyYW1lICovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmNweShpbmZvLT5kcml2ZXIsICJyYXlfY3MiKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHJheV9kZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisgICAgaW50IGVyciA9IDA7CisjaWYgV0lSRUxFU1NfRVhUID4gNworICAgIHN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBpZnI7CisjZW5kaWYJLyogV0lSRUxFU1NfRVhUID4gNyAqLworI2lmZGVmIFdJUkVMRVNTX1NQWQorICAgIHN0cnVjdCBzb2NrYWRkcglhZGRyZXNzW0lXX01BWF9TUFldOworI2VuZGlmCS8qIFdJUkVMRVNTX1NQWSAqLworCisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2Rldl9pb2N0bCAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgREVCVUcoMiwicmF5X2NzIElPQ1RMIGRldj0lcCwgaWZyPSVwLCBjbWQgPSAweCV4XG4iLGRldixpZnIsY21kKTsKKyAgICAvKiBWYWxpZGF0ZSB0aGUgY29tbWFuZCAqLworICAgIHN3aXRjaCAoY21kKQorICAgIHsKKyNpZiBXSVJFTEVTU19FWFQgPiA3CisgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0gV0lSRUxFU1MgRVhURU5TSU9OUyAtLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgIC8qIEdldCBuYW1lICovCisgICAgY2FzZSBTSU9DR0lXTkFNRToKKyAgICAgIHN0cmNweSh3cnEtPnUubmFtZSwgIklFRUUgODAyLjExLUZIIik7CisgICAgICBicmVhazsKKworICAgICAgLyogR2V0IGZyZXF1ZW5jeS9jaGFubmVsICovCisgICAgY2FzZSBTSU9DR0lXRlJFUToKKyAgICAgIHdycS0+dS5mcmVxLm0gPSBsb2NhbC0+c3Bhcm0uYjUuYV9ob3BfcGF0dGVybjsKKyAgICAgIHdycS0+dS5mcmVxLmUgPSAwOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFNldCBmcmVxdWVuY3kvY2hhbm5lbCAqLworICAgIGNhc2UgU0lPQ1NJV0ZSRVE6CisgICAgICAvKiBSZWplY3QgaWYgY2FyZCBpcyBhbHJlYWR5IGluaXRpYWxpc2VkICovCisgICAgICBpZihsb2NhbC0+Y2FyZF9zdGF0dXMgIT0gQ0FSRF9BV0FJVElOR19QQVJBTSkKKwl7CisJICBlcnIgPSAtRUJVU1k7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIFNldHRpbmcgYnkgY2hhbm5lbCBudW1iZXIgKi8KKyAgICAgIGlmICgod3JxLT51LmZyZXEubSA+IFVTQV9IT1BfTU9EKSB8fCAod3JxLT51LmZyZXEuZSA+IDApKQorCWVyciA9IC1FT1BOT1RTVVBQOworICAgICAgZWxzZQorCSAgbG9jYWwtPnNwYXJtLmI1LmFfaG9wX3BhdHRlcm4gPSB3cnEtPnUuZnJlcS5tOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEdldCBjdXJyZW50IG5ldHdvcmsgbmFtZSAoRVNTSUQpICovCisgICAgY2FzZSBTSU9DR0lXRVNTSUQ6CisgICAgICBpZiAod3JxLT51LmRhdGEucG9pbnRlcikKKwl7CisJICBjaGFyIGVzc2lkW0lXX0VTU0lEX01BWF9TSVpFICsgMV07CisJICAvKiBHZXQgdGhlIGVzc2lkIHRoYXQgd2FzIHNldCAqLworCSAgbWVtY3B5KGVzc2lkLCBsb2NhbC0+c3Bhcm0uYjUuYV9jdXJyZW50X2Vzc19pZCwKKwkJIElXX0VTU0lEX01BWF9TSVpFKTsKKwkgIGVzc2lkW0lXX0VTU0lEX01BWF9TSVpFXSA9ICdcMCc7CisKKwkgIC8qIFB1c2ggaXQgb3V0ICEgKi8KKwkgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihlc3NpZCkgKyAxOworCSAgd3JxLT51LmRhdGEuZmxhZ3MgPSAxOyAvKiBhY3RpdmUgKi8KKwkgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgZXNzaWQsIHNpemVvZihlc3NpZCkpKQorCQkgIGVyciA9IC1FRkFVTFQ7CisJfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFNldCBkZXNpcmVkIG5ldHdvcmsgbmFtZSAoRVNTSUQpICovCisgICAgY2FzZSBTSU9DU0lXRVNTSUQ6CisgICAgICAvKiBSZWplY3QgaWYgY2FyZCBpcyBhbHJlYWR5IGluaXRpYWxpc2VkICovCisgICAgICBpZihsb2NhbC0+Y2FyZF9zdGF0dXMgIT0gQ0FSRF9BV0FJVElOR19QQVJBTSkKKwl7CisJICBlcnIgPSAtRUJVU1k7CisJICBicmVhazsKKwl9CisKKwlpZiAod3JxLT51LmRhdGEucG9pbnRlcikKKwl7CisJICAgIGNoYXIJY2FyZF9lc3NpZFtJV19FU1NJRF9NQVhfU0laRSArIDFdOworCSAgICAKKwkgICAgLyogQ2hlY2sgaWYgd2UgYXNrZWQgZm9yIGBhbnknICovCisJICAgIGlmKHdycS0+dS5kYXRhLmZsYWdzID09IDApCisJICAgIHsKKwkJLyogQ29yZXkgOiBjYW4geW91IGRvIHRoYXQgPyAqLworCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIHN0cmluZyAqLworCQlpZih3cnEtPnUuZGF0YS5sZW5ndGggPgorCQkgICBJV19FU1NJRF9NQVhfU0laRSArIDEpCisJCXsKKwkJICAgIGVyciA9IC1FMkJJRzsKKwkJICAgIGJyZWFrOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcihjYXJkX2Vzc2lkLAorCQkJCSAgIHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkJICAgd3JxLT51LmRhdGEubGVuZ3RoKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWNhcmRfZXNzaWRbSVdfRVNTSURfTUFYX1NJWkVdID0gJ1wwJzsKKworCQkvKiBTZXQgdGhlIEVTU0lEIGluIHRoZSBjYXJkICovCisJCW1lbWNweShsb2NhbC0+c3Bhcm0uYjUuYV9jdXJyZW50X2Vzc19pZCwgY2FyZF9lc3NpZCwKKwkJICAgICAgIElXX0VTU0lEX01BWF9TSVpFKTsKKwkgICAgfQorCX0KKwlicmVhazsKKworICAgICAgLyogR2V0IGN1cnJlbnQgQWNjZXNzIFBvaW50IChCU1NJRCBpbiBvdXIgY2FzZSkgKi8KKyAgICBjYXNlIFNJT0NHSVdBUDoKKyAgICAgIG1lbWNweSh3cnEtPnUuYXBfYWRkci5zYV9kYXRhLCBsb2NhbC0+YnNzX2lkLCBFVEhfQUxFTik7CisgICAgICB3cnEtPnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisgICAgICBicmVhazsKKworICAgICAgLyogR2V0IHRoZSBjdXJyZW50IGJpdC1yYXRlICovCisgICAgY2FzZSBTSU9DR0lXUkFURToKKyAgICAgIGlmKGxvY2FsLT5uZXRfZGVmYXVsdF90eF9yYXRlID09IDMpCisJd3JxLT51LmJpdHJhdGUudmFsdWUgPSAyMDAwMDAwOwkJLyogSHVtLi4uICovCisgICAgICBlbHNlCisJd3JxLT51LmJpdHJhdGUudmFsdWUgPSBsb2NhbC0+bmV0X2RlZmF1bHRfdHhfcmF0ZSAqIDUwMDAwMDsKKyAgICAgIHdycS0+dS5iaXRyYXRlLmZpeGVkID0gMDsJCS8qIFdlIGFyZSBpbiBhdXRvIG1vZGUgKi8KKyAgICAgIGJyZWFrOworCisgICAgICAvKiBTZXQgdGhlIGRlc2lyZWQgYml0LXJhdGUgKi8KKyAgICBjYXNlIFNJT0NTSVdSQVRFOgorICAgICAgLyogQ2hlY2sgaWYgcmF0ZSBpcyBpbiByYW5nZSAqLworICAgICAgaWYoKHdycS0+dS5iaXRyYXRlLnZhbHVlICE9IDEwMDAwMDApICYmCisJICh3cnEtPnUuYml0cmF0ZS52YWx1ZSAhPSAyMDAwMDAwKSkKKwl7CisJICBlcnIgPSAtRUlOVkFMOworCSAgYnJlYWs7CisJfQorICAgICAgLyogSGFjayBmb3IgMS41IE1iL3MgaW5zdGVhZCBvZiAyIE1iL3MgKi8KKyAgICAgIGlmKChsb2NhbC0+ZndfdmVyID09IDB4NTUpICYmCQkvKiBQbGVhc2UgY2hlY2sgKi8KKwkgKHdycS0+dS5iaXRyYXRlLnZhbHVlID09IDIwMDAwMDApKQorCWxvY2FsLT5uZXRfZGVmYXVsdF90eF9yYXRlID0gMzsKKyAgICAgIGVsc2UKKwlsb2NhbC0+bmV0X2RlZmF1bHRfdHhfcmF0ZSA9IHdycS0+dS5iaXRyYXRlLnZhbHVlLzUwMDAwMDsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgUlRTIHRocmVzaG9sZCAqLworICAgIGNhc2UgU0lPQ0dJV1JUUzoKKyAgICAgIHdycS0+dS5ydHMudmFsdWUgPSAobG9jYWwtPnNwYXJtLmI1LmFfcnRzX3RocmVzaG9sZFswXSA8PCA4KQorCSsgbG9jYWwtPnNwYXJtLmI1LmFfcnRzX3RocmVzaG9sZFsxXTsKKyNpZiBXSVJFTEVTU19FWFQgPiA4CisgICAgICB3cnEtPnUucnRzLmRpc2FibGVkID0gKHdycS0+dS5ydHMudmFsdWUgPT0gMzI3NjcpOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKyAgICAgIHdycS0+dS5ydHMuZml4ZWQgPSAxOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFNldCB0aGUgZGVzaXJlZCBSVFMgdGhyZXNob2xkICovCisgICAgY2FzZSBTSU9DU0lXUlRTOgorICAgIHsKKwlpbnQgcnRociA9IHdycS0+dS5ydHMudmFsdWU7CisKKyAgICAgIC8qIFJlamVjdCBpZiBjYXJkIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQgKi8KKyAgICAgIGlmKGxvY2FsLT5jYXJkX3N0YXR1cyAhPSBDQVJEX0FXQUlUSU5HX1BBUkFNKQorCXsKKwkgIGVyciA9IC1FQlVTWTsKKwkgIGJyZWFrOworCX0KKworCS8qIGlmKHdycS0+dS5ydHMuZml4ZWQgPT0gMCkgd2Ugc2hvdWxkIGNvbXBsYWluICovCisjaWYgV0lSRUxFU1NfRVhUID4gOAorCWlmKHdycS0+dS5ydHMuZGlzYWJsZWQpCisJICAgIHJ0aHIgPSAzMjc2NzsKKwllbHNlCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gOCAqLworCSAgICBpZigocnRociA8IDApIHx8IChydGhyID4gMjM0NykpIC8qIFdoYXQncyB0aGUgbWF4IHBhY2tldCBzaXplID8/PyAqLworCSAgICB7CisJCWVyciA9IC1FSU5WQUw7CisJCWJyZWFrOworCSAgICB9CisJbG9jYWwtPnNwYXJtLmI1LmFfcnRzX3RocmVzaG9sZFswXSA9IChydGhyID4+IDgpICYgMHhGRjsKKwlsb2NhbC0+c3Bhcm0uYjUuYV9ydHNfdGhyZXNob2xkWzFdID0gcnRociAmIDB4RkY7CisgICAgfQorICAgIGJyZWFrOworCisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQgKi8KKyAgICBjYXNlIFNJT0NHSVdGUkFHOgorICAgICAgd3JxLT51LmZyYWcudmFsdWUgPSAobG9jYWwtPnNwYXJtLmI1LmFfZnJhZ190aHJlc2hvbGRbMF0gPDwgOCkKKwkrIGxvY2FsLT5zcGFybS5iNS5hX2ZyYWdfdGhyZXNob2xkWzFdOworI2lmIFdJUkVMRVNTX0VYVCA+IDgKKyAgICAgIHdycS0+dS5mcmFnLmRpc2FibGVkID0gKHdycS0+dS5mcmFnLnZhbHVlID09IDMyNzY3KTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA4ICovCisgICAgICB3cnEtPnUuZnJhZy5maXhlZCA9IDE7CisgICAgICBicmVhazsKKworICAgICAgLyogU2V0IHRoZSBkZXNpcmVkIGZyYWdtZW50YXRpb24gdGhyZXNob2xkICovCisgICAgY2FzZSBTSU9DU0lXRlJBRzoKKyAgICB7CisJaW50IGZ0aHIgPSB3cnEtPnUuZnJhZy52YWx1ZTsKKworICAgICAgLyogUmVqZWN0IGlmIGNhcmQgaXMgYWxyZWFkeSBpbml0aWFsaXNlZCAqLworICAgICAgaWYobG9jYWwtPmNhcmRfc3RhdHVzICE9IENBUkRfQVdBSVRJTkdfUEFSQU0pCisJeworCSAgZXJyID0gLUVCVVNZOworCSAgYnJlYWs7CisJfQorCisJLyogaWYod3JxLT51LmZyYWcuZml4ZWQgPT0gMCkgc2hvdWxkIGNvbXBsYWluICovCisjaWYgV0lSRUxFU1NfRVhUID4gOAorCWlmKHdycS0+dS5mcmFnLmRpc2FibGVkKQorCSAgICBmdGhyID0gMzI3Njc7CisJZWxzZQorI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKwkgICAgaWYoKGZ0aHIgPCAyNTYpIHx8IChmdGhyID4gMjM0NykpIC8qIFRvIGNoZWNrIG91dCAhICovCisJICAgIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJICAgIH0KKwlsb2NhbC0+c3Bhcm0uYjUuYV9mcmFnX3RocmVzaG9sZFswXSA9IChmdGhyID4+IDgpICYgMHhGRjsKKwlsb2NhbC0+c3Bhcm0uYjUuYV9mcmFnX3RocmVzaG9sZFsxXSA9IGZ0aHIgJiAweEZGOworICAgIH0KKyAgICBicmVhazsKKworI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCA+IDcgKi8KKyNpZiBXSVJFTEVTU19FWFQgPiA4CisKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCBtb2RlIG9mIG9wZXJhdGlvbiAqLworICAgIGNhc2UgU0lPQ0dJV01PREU6CisgICAgICBpZihsb2NhbC0+c3Bhcm0uYjUuYV9uZXR3b3JrX3R5cGUpCisJd3JxLT51Lm1vZGUgPSBJV19NT0RFX0lORlJBOworICAgICAgZWxzZQorCXdycS0+dS5tb2RlID0gSVdfTU9ERV9BREhPQzsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBTZXQgdGhlIGN1cnJlbnQgbW9kZSBvZiBvcGVyYXRpb24gKi8KKyAgICBjYXNlIFNJT0NTSVdNT0RFOgorICAgIHsKKwljaGFyIGNhcmRfbW9kZSA9IDE7CisJCisgICAgICAvKiBSZWplY3QgaWYgY2FyZCBpcyBhbHJlYWR5IGluaXRpYWxpc2VkICovCisgICAgICBpZihsb2NhbC0+Y2FyZF9zdGF0dXMgIT0gQ0FSRF9BV0FJVElOR19QQVJBTSkKKwl7CisJICBlcnIgPSAtRUJVU1k7CisJICBicmVhazsKKwl9CisKKwlzd2l0Y2ggKHdycS0+dS5tb2RlKQorCXsKKwljYXNlIElXX01PREVfQURIT0M6CisJICAgIGNhcmRfbW9kZSA9IDA7CisJICAgIC8vIEZhbGwgdGhyb3VnaAorCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkgICAgbG9jYWwtPnNwYXJtLmI1LmFfbmV0d29ya190eXBlID0gY2FyZF9tb2RlOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBlcnIgPSAtRUlOVkFMOworCX0KKyAgICB9CisgICAgYnJlYWs7CisKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA4ICovCisjaWYgV0lSRUxFU1NfRVhUID4gNworICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tIElXU1BZIFNVUFBPUlQgLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAvKiBEZWZpbmUgdGhlIHJhbmdlICh2YXJpYXRpb25zKSBvZiBhYm92ZSBwYXJhbWV0ZXJzICovCisgICAgY2FzZSBTSU9DR0lXUkFOR0U6CisgICAgICAvKiBCYXNpYyBjaGVja2luZy4uLiAqLworICAgICAgaWYod3JxLT51LmRhdGEucG9pbnRlciAhPSAoY2FkZHJfdCkgMCkKKwl7CisJICBzdHJ1Y3QgaXdfcmFuZ2UJcmFuZ2U7CisJICBtZW1zZXQoKGNoYXIgKikgJnJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7CisKKwkgIC8qIFNldCB0aGUgbGVuZ3RoICh2ZXJ5IGltcG9ydGFudCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkgKi8KKwkgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpOworCisjaWYgV0lSRUxFU1NfRVhUID4gMTAKKwkgIC8qIFNldCB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9uIHZlcnNpb25zICovCisJICByYW5nZS53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCSAgcmFuZ2Uud2VfdmVyc2lvbl9zb3VyY2UgPSA5OworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEwICovCisKKwkgIC8qIFNldCBpbmZvcm1hdGlvbiBpbiB0aGUgcmFuZ2Ugc3RydWN0ICovCisJICByYW5nZS50aHJvdWdocHV0ID0gMS4xICogMTAwMCAqIDEwMDA7CS8qIFB1dCB0aGUgcmlnaHQgbnVtYmVyIGhlcmUgKi8KKwkgIHJhbmdlLm51bV9jaGFubmVscyA9IGhvcF9wYXR0ZXJuX2xlbmd0aFsoaW50KWNvdW50cnldOyAKKwkgIHJhbmdlLm51bV9mcmVxdWVuY3kgPSAwOworCSAgcmFuZ2UubWF4X3F1YWwucXVhbCA9IDA7CisJICByYW5nZS5tYXhfcXVhbC5sZXZlbCA9IDI1NTsJLyogV2hhdCdzIHRoZSBjb3JyZWN0IHZhbHVlID8gKi8KKwkgIHJhbmdlLm1heF9xdWFsLm5vaXNlID0gMjU1OwkvKiBJZGVtICovCisJICByYW5nZS5udW1fYml0cmF0ZXMgPSAyOworCSAgcmFuZ2UuYml0cmF0ZVswXSA9IDEwMDAwMDA7CS8qIDEgTWIvcyAqLworCSAgcmFuZ2UuYml0cmF0ZVsxXSA9IDIwMDAwMDA7CS8qIDIgTWIvcyAqLworCisJICAvKiBDb3B5IHN0cnVjdHVyZSB0byB0aGUgdXNlciBidWZmZXIgKi8KKwkgIGlmKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcmFuZ2UsCisJCQkgIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKSkKKwkgICAgZXJyID0gLUVGQVVMVDsKKwl9CisgICAgICBicmVhazsKKworI2lmZGVmIFdJUkVMRVNTX1NQWQorICAgICAgLyogU2V0IGFkZHJlc3NlcyB0byBzcHkgKi8KKyAgICBjYXNlIFNJT0NTSVdTUFk6CisgICAgICAvKiBDaGVjayB0aGUgbnVtYmVyIG9mIGFkZHJlc3NlcyAqLworICAgICAgaWYod3JxLT51LmRhdGEubGVuZ3RoID4gSVdfTUFYX1NQWSkKKwl7CisJICBlcnIgPSAtRTJCSUc7CisJICBicmVhazsKKwl9CisgICAgICBsb2NhbC0+c3B5X251bWJlciA9IHdycS0+dS5kYXRhLmxlbmd0aDsKKworICAgICAgLyogSWYgdGhlcmUgaXMgc29tZSBhZGRyZXNzZXMgdG8gY29weSAqLworICAgICAgaWYobG9jYWwtPnNweV9udW1iZXIgPiAwKQorCXsKKwkgIGludAkJCWk7CisKKwkgIC8qIENvcHkgYWRkcmVzc2VzIHRvIHRoZSBkcml2ZXIgKi8KKwkgIGlmKGNvcHlfZnJvbV91c2VyKGFkZHJlc3MsIHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKiBsb2NhbC0+c3B5X251bWJlcikpCisJICAgIHsKKwkgICAgICBlcnIgPSAtRUZBVUxUOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIC8qIENvcHkgYWRkcmVzc2VzIHRvIHRoZSBscCBzdHJ1Y3R1cmUgKi8KKwkgIGZvcihpID0gMDsgaSA8IGxvY2FsLT5zcHlfbnVtYmVyOyBpKyspCisJICAgIG1lbWNweShsb2NhbC0+c3B5X2FkZHJlc3NbaV0sIGFkZHJlc3NbaV0uc2FfZGF0YSwgRVRIX0FMRU4pOworCisJICAvKiBSZXNldCBzdHJ1Y3R1cmUuLi4gKi8KKwkgIG1lbXNldChsb2NhbC0+c3B5X3N0YXQsIDB4MDAsIHNpemVvZihpd19xdWFsKSAqIElXX01BWF9TUFkpOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworCSAgcHJpbnRrKEtFUk5fREVCVUcgIlNldFNweSAtIFNldCBvZiBuZXcgYWRkcmVzc2VzIGlzIDpcbiIpOworCSAgZm9yKGkgPSAwOyBpIDwgbG9jYWwtPnNweV9udW1iZXI7IGkrKykKKwkgICAgcHJpbnRrKEtFUk5fREVCVUcgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCQkgICBsb2NhbC0+c3B5X2FkZHJlc3NbaV1bMF0sCisJCSAgIGxvY2FsLT5zcHlfYWRkcmVzc1tpXVsxXSwKKwkJICAgbG9jYWwtPnNweV9hZGRyZXNzW2ldWzJdLAorCQkgICBsb2NhbC0+c3B5X2FkZHJlc3NbaV1bM10sCisJCSAgIGxvY2FsLT5zcHlfYWRkcmVzc1tpXVs0XSwKKwkJICAgbG9jYWwtPnNweV9hZGRyZXNzW2ldWzVdKTsKKyNlbmRpZgkvKiBERUJVR19JT0NUTF9JTkZPICovCisJfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEdldCB0aGUgc3B5IGxpc3QgYW5kIHNweSBzdGF0cyAqLworICAgIGNhc2UgU0lPQ0dJV1NQWToKKyAgICAgIC8qIFNldCB0aGUgbnVtYmVyIG9mIGFkZHJlc3NlcyAqLworICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gbG9jYWwtPnNweV9udW1iZXI7CisKKyAgICAgIC8qIElmIHRoZSB1c2VyIHdhbnQgdG8gaGF2ZSB0aGUgYWRkcmVzc2VzIGJhY2suLi4gKi8KKyAgICAgIGlmKChsb2NhbC0+c3B5X251bWJlciA+IDApICYmICh3cnEtPnUuZGF0YS5wb2ludGVyICE9IChjYWRkcl90KSAwKSkKKwl7CisJICBpbnQJCQlpOworCisJICAvKiBDb3B5IGFkZHJlc3NlcyBmcm9tIHRoZSBscCBzdHJ1Y3R1cmUgKi8KKwkgIGZvcihpID0gMDsgaSA8IGxvY2FsLT5zcHlfbnVtYmVyOyBpKyspCisJICAgIHsKKwkgICAgICBtZW1jcHkoYWRkcmVzc1tpXS5zYV9kYXRhLCBsb2NhbC0+c3B5X2FkZHJlc3NbaV0sIEVUSF9BTEVOKTsKKwkgICAgICBhZGRyZXNzW2ldLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkgICAgfQorCisJICAvKiBDb3B5IGFkZHJlc3NlcyB0byB0aGUgdXNlciBidWZmZXIgKi8KKwkgIGlmKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBhZGRyZXNzLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKiBsb2NhbC0+c3B5X251bWJlcikpCisJICAgIHsKKwkgICAgICBlcnIgPSAtRUZBVUxUOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIC8qIENvcHkgc3RhdHMgdG8gdGhlIHVzZXIgYnVmZmVyIChqdXN0IGFmdGVyKSAqLworCSAgaWYoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIgKworCQkgICAgICAgKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICogbG9jYWwtPnNweV9udW1iZXIpLAorCQkgICAgICAgbG9jYWwtPnNweV9zdGF0LCBzaXplb2YoaXdfcXVhbCkgKiBsb2NhbC0+c3B5X251bWJlcikpCisJICAgIHsKKwkgICAgICBlcnIgPSAtRUZBVUxUOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIC8qIFJlc2V0IHVwZGF0ZWQgZmxhZ3MgKi8KKwkgIGZvcihpID0gMDsgaSA8IGxvY2FsLT5zcHlfbnVtYmVyOyBpKyspCisJICAgIGxvY2FsLT5zcHlfc3RhdFtpXS51cGRhdGVkID0gMHgwOworCX0JLyogaWYocG9pbnRlciAhPSBOVUxMKSAqLworCisgICAgICBicmVhazsKKyNlbmRpZgkvKiBXSVJFTEVTU19TUFkgKi8KKworICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tIFBSSVZBVEUgSU9DVEwgLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZuZGVmIFNJT0NJV0ZJUlNUUFJJVgorI2RlZmluZSBTSU9DSVdGSVJTVFBSSVYJU0lPQ0RFVlBSSVZBVEUKKyNlbmRpZiAvKiBTSU9DSVdGSVJTVFBSSVYgKi8KKyNkZWZpbmUgU0lPQ1NJUEZSQU1JTkcJU0lPQ0lXRklSU1RQUklWCQkvKiBTZXQgZnJhbWluZyBtb2RlICovCisjZGVmaW5lIFNJT0NHSVBGUkFNSU5HCVNJT0NJV0ZJUlNUUFJJViArIDEJLyogR2V0IGZyYW1pbmcgbW9kZSAqLworI2RlZmluZSBTSU9DR0lQQ09VTlRSWQlTSU9DSVdGSVJTVFBSSVYgKyAzCS8qIEdldCBjb3VudHJ5IGNvZGUgKi8KKyAgICBjYXNlIFNJT0NTSVBGUkFNSU5HOgorICAgICAgaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCS8qIEZvciBwcml2YXRlIElPQ1RMcywgd2UgbmVlZCB0byBjaGVjayBwZXJtaXNzaW9ucyAqLworCXsKKwkgIGVyciA9IC1FUEVSTTsKKwkgIGJyZWFrOworCX0KKyAgICAgIHRyYW5zbGF0ZSA9ICood3JxLT51Lm5hbWUpOwkvKiBTZXQgZnJhbWluZyBtb2RlICovCisgICAgICBicmVhazsKKyAgICBjYXNlIFNJT0NHSVBGUkFNSU5HOgorICAgICAgKih3cnEtPnUubmFtZSkgPSB0cmFuc2xhdGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNJT0NHSVBDT1VOVFJZOgorICAgICAgKih3cnEtPnUubmFtZSkgPSBjb3VudHJ5OworICAgICAgYnJlYWs7CisgICAgY2FzZSBTSU9DR0lXUFJJVjoKKyAgICAgIC8qIEV4cG9ydCBvdXIgInByaXZhdGUiIGludGVyY2FjZSAqLworICAgICAgaWYod3JxLT51LmRhdGEucG9pbnRlciAhPSAoY2FkZHJfdCkgMCkKKwl7CisJICBzdHJ1Y3QgaXdfcHJpdl9hcmdzCXByaXZbXSA9CisJICB7CS8qIGNtZCwJCXNldF9hcmdzLAlnZXRfYXJncywJbmFtZSAqLworCSAgICB7IFNJT0NTSVBGUkFNSU5HLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRfZnJhbWluZyIgfSwKKwkgICAgeyBTSU9DR0lQRlJBTUlORywgMCwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0X2ZyYW1pbmciIH0sCisJICAgIHsgU0lPQ0dJUENPVU5UUlksIDAsIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldF9jb3VudHJ5IiB9LAorCSAgfTsKKwkgIC8qIFNldCB0aGUgbnVtYmVyIG9mIGlvY3RsIGF2YWlsYWJsZSAqLworCSAgd3JxLT51LmRhdGEubGVuZ3RoID0gMzsKKwkgIC8qIENvcHkgc3RydWN0dXJlIHRvIHRoZSB1c2VyIGJ1ZmZlciAqLworCSAgaWYoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICh1X2NoYXIgKikgcHJpdiwKKwkJICAgICAgIHNpemVvZihwcml2KSkpCisJICAgIGVyciA9IC1FRkFVTFQ7CisJfQorICAgICAgYnJlYWs7CisjZW5kaWYJLyogV0lSRUxFU1NfRVhUID4gNyAqLworCisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERFQlVHKDAsInJheV9kZXZfaW9jdGwgY21kID0gMHgleFxuIiwgY21kKTsKKyAgICAgICAgICAgIGVyciA9IC1FT1BOT1RTVVBQOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfSAvKiBlbmQgcmF5X2Rldl9pb2N0bCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmIFdJUkVMRVNTX0VYVCA+IDcJLyogSWYgd2lyZWxlc3MgZXh0ZW5zaW9uIGV4aXN0IGluIHRoZSBrZXJuZWwgKi8KK3N0YXRpYyBpd19zdGF0cyAqIHJheV9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisgIHJheV9kZXZfdCAqCWxvY2FsID0gKHJheV9kZXZfdCAqKSBkZXYtPnByaXY7CisgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworICBzdHJ1Y3Qgc3RhdHVzIF9faW9tZW0gKnAgPSBsb2NhbC0+c3JhbSArIFNUQVRVU19CQVNFOworCisgIGlmKGxvY2FsID09IChyYXlfZGV2X3QgKikgTlVMTCkKKyAgICByZXR1cm4gKGl3X3N0YXRzICopIE5VTEw7CisKKyAgbG9jYWwtPndzdGF0cy5zdGF0dXMgPSBsb2NhbC0+Y2FyZF9zdGF0dXM7CisjaWZkZWYgV0lSRUxFU1NfU1BZCisgIGlmKChsb2NhbC0+c3B5X251bWJlciA+IDApICYmIChsb2NhbC0+c3Bhcm0uYjUuYV9uZXR3b3JrX3R5cGUgPT0gMCkpCisgICAgeworICAgICAgLyogR2V0IGl0IGZyb20gdGhlIGZpcnN0IG5vZGUgaW4gc3B5IGxpc3QgKi8KKyAgICAgIGxvY2FsLT53c3RhdHMucXVhbC5xdWFsID0gbG9jYWwtPnNweV9zdGF0WzBdLnF1YWw7CisgICAgICBsb2NhbC0+d3N0YXRzLnF1YWwubGV2ZWwgPSBsb2NhbC0+c3B5X3N0YXRbMF0ubGV2ZWw7CisgICAgICBsb2NhbC0+d3N0YXRzLnF1YWwubm9pc2UgPSBsb2NhbC0+c3B5X3N0YXRbMF0ubm9pc2U7CisgICAgICBsb2NhbC0+d3N0YXRzLnF1YWwudXBkYXRlZCA9IGxvY2FsLT5zcHlfc3RhdFswXS51cGRhdGVkOworICAgIH0KKyNlbmRpZiAvKiBXSVJFTEVTU19TUFkgKi8KKworICBpZigobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICBsb2NhbC0+d3N0YXRzLnF1YWwubm9pc2UgPSByZWFkYigmcC0+cnhub2lzZSk7CisgICAgbG9jYWwtPndzdGF0cy5xdWFsLnVwZGF0ZWQgfD0gNDsKKyAgfQorCisgIHJldHVybiAmbG9jYWwtPndzdGF0czsKK30gLyogZW5kIHJheV9nZXRfd2lyZWxlc3Nfc3RhdHMgKi8KKyNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiA3ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHJheV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgZGV2X2xpbmtfdCAqbGluazsKKyAgICByYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKKyAgICAKKyAgICBERUJVRygxLCAicmF5X29wZW4oJyVzJylcbiIsIGRldi0+bmFtZSk7CisKKyAgICBmb3IgKGxpbmsgPSBkZXZfbGlzdDsgbGluazsgbGluayA9IGxpbmstPm5leHQpCisgICAgICAgIGlmIChsaW5rLT5wcml2ID09IGRldikgYnJlYWs7CisgICAgaWYgKCFERVZfT0sobGluaykpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgaWYgKGxpbmstPm9wZW4gPT0gMCkgbG9jYWwtPm51bV9tdWx0aSA9IDA7CisgICAgbGluay0+b3BlbisrOworCisgICAgLyogSWYgdGhlIGNhcmQgaXMgbm90IHN0YXJ0ZWQsIHRpbWUgdG8gc3RhcnQgaXQgISAtIEplYW4gSUkgKi8KKyAgICBpZihsb2NhbC0+Y2FyZF9zdGF0dXMgPT0gQ0FSRF9BV0FJVElOR19QQVJBTSkgeworCWludCBpOworCisJREVCVUcoMSwicmF5X29wZW46IGRvaW5nIGluaXQgbm93ICFcbiIpOworCisJLyogRG93bmxvYWQgc3RhcnR1cCBwYXJhbWV0ZXJzICovCisJaWYgKCAoaSA9IGRsX3N0YXJ0dXBfcGFyYW1zKGRldikpIDwgMCkKKwkgIHsKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAicmF5X2Rldl9pbml0IGRsX3N0YXJ0dXBfcGFyYW1zIGZhaWxlZCAtICIKKwkJICAgInJldHVybnMgMHgleFxuIixpKTsKKwkgICAgcmV0dXJuIC0xOworCSAgfQorICAgICB9CisKKyAgICBpZiAoc25pZmZlcikgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworICAgIGVsc2UgICAgICAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisgICAgREVCVUcoMiwicmF5X29wZW4gZW5kaW5nXG4iKTsKKyAgICByZXR1cm4gMDsKK30gLyogZW5kIHJheV9vcGVuICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHJheV9kZXZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBkZXZfbGlua190ICpsaW5rOworCisgICAgREVCVUcoMSwgInJheV9kZXZfY2xvc2UoJyVzJylcbiIsIGRldi0+bmFtZSk7CisKKyAgICBmb3IgKGxpbmsgPSBkZXZfbGlzdDsgbGluazsgbGluayA9IGxpbmstPm5leHQpCisgICAgICAgIGlmIChsaW5rLT5wcml2ID09IGRldikgYnJlYWs7CisgICAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisKKyAgICBsaW5rLT5vcGVuLS07CisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgICAgLyogSW4gaGVyZSwgd2Ugc2hvdWxkIHN0b3AgdGhlIGhhcmR3YXJlIChzdG9wIGNhcmQgZnJvbSBiZWVpbmcgYWN0aXZlKQorICAgICAqIGFuZCBzZXQgbG9jYWwtPmNhcmRfc3RhdHVzIHRvIENBUkRfQVdBSVRJTkdfUEFSQU0sIHNvIHRoYXQgd2hpbGUgdGhlCisgICAgICogY2FyZCBpcyBjbG9zZWQgd2UgY2FuIGNoYWdlIGl0cyBjb25maWd1cmF0aW9uLgorICAgICAqIFByb2JhYmx5IGFsc28gbmVlZCBhIENPUiByZXNldCB0byBnZXQgc2FuZSBzdGF0ZSAtIEplYW4gSUkgKi8KKworICAgIHJldHVybiAwOworfSAvKiBlbmQgcmF5X2Rldl9jbG9zZSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgcmF5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKyAgICBERUJVRygxLCJyYXlfcmVzZXQgZW50ZXJlZFxuIik7CisgICAgcmV0dXJuOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogQ2F1c2UgYSBmaXJtd2FyZSBpbnRlcnJ1cHQgaWYgaXQgaXMgcmVhZHkgZm9yIG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIG5vbnplcm8gaWYgbm90IHJlYWR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIGludCBpbnRlcnJ1cHRfZWNmKHJheV9kZXZfdCAqbG9jYWwsIGludCBjY3MpCit7CisgICAgaW50IGkgPSA1MDsKKyAgICBkZXZfbGlua190ICpsaW5rID0gbG9jYWwtPmZpbmRlcjsKKworICAgIGlmICghKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpKSB7CisgICAgICAgIERFQlVHKDIsInJheV9jcyBpbnRlcnJ1cHRfZWNmIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBERUJVRygyLCJpbnRlcnJ1cHRfZWNmKGxvY2FsPSVwLCBjY3MgPSAweCV4XG4iLGxvY2FsLGNjcyk7CisKKyAgICB3aGlsZSAoIGkgJiYgCisgICAgICAgICAgICAocmVhZGIobG9jYWwtPmFtZW0gKyBDSVNfT0ZGU0VUICsgRUNGX0lOVFJfT0ZGU0VUKSAmIEVDRl9JTlRSX1NFVCkpCisgICAgICAgIGktLTsKKyAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgIERFQlVHKDIsInJheV9jcyBpbnRlcnJ1cHRfZWNmIGNhcmQgbm90IHJlYWR5IGZvciBpbnRlcnJ1cHRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCS8qIEZpbGwgdGhlIG1haWxib3gsIHRoZW4ga2ljayB0aGUgY2FyZCAqLworICAgIHdyaXRlYihjY3MsIGxvY2FsLT5zcmFtICsgU0NCX0JBU0UpOworICAgIHdyaXRlYihFQ0ZfSU5UUl9TRVQsIGxvY2FsLT5hbWVtICsgQ0lTX09GRlNFVCArIEVDRl9JTlRSX09GRlNFVCk7CisgICAgcmV0dXJuIDA7Cit9IC8qIGludGVycnVwdF9lY2YgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIEdldCBuZXh0IGZyZWUgdHJhbnNtaXQgQ0NTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybiAtIGluZGV4IG9mIGN1cnJlbnQgdHggY2NzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0YXRpYyBpbnQgZ2V0X2ZyZWVfdHhfY2NzKHJheV9kZXZfdCAqbG9jYWwpCit7CisgICAgaW50IGk7CisgICAgc3RydWN0IGNjcyBfX2lvbWVtICpwY2NzID0gY2NzX2Jhc2UobG9jYWwpOworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworCisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2NzIGdldF9mcmVlX3R4X2NjcyAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybiBFQ0FSREdPTkU7CisgICAgfQorCisgICAgaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwmbG9jYWwtPnR4X2Njc19sb2NrKSkgeworICAgICAgICBERUJVRygxLCJyYXlfY3MgdHhfY2NzX2xvY2sgYnVzeVxuIik7CisgICAgICAgIHJldHVybiBFQ0NTQlVTWTsKKyAgICB9IAorCisgICAgZm9yIChpPTA7IGkgPCBOVU1CRVJfT0ZfVFhfQ0NTOyBpKyspIHsKKyAgICAgICAgaWYgKHJlYWRiKCYocGNjcytpKS0+YnVmZmVyX3N0YXR1cykgPT0gQ0NTX0JVRkZFUl9GUkVFKSB7CisgICAgICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9CVVNZLCAmKHBjY3MraSktPmJ1ZmZlcl9zdGF0dXMpOworICAgICAgICAgICAgd3JpdGViKENDU19FTkRfTElTVCwgJihwY2NzK2kpLT5saW5rKTsKKwkJCWxvY2FsLT50eF9jY3NfbG9jayA9IDA7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKwlsb2NhbC0+dHhfY2NzX2xvY2sgPSAwOworICAgIERFQlVHKDIsInJheV9jcyBFUlJPUiBubyBmcmVlIHR4IENDUyBmb3IgcmF5bGluayBjYXJkXG4iKTsKKyAgICByZXR1cm4gRUNDU0ZVTEw7Cit9IC8qIGdldF9mcmVlX3R4X2NjcyAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogR2V0IG5leHQgZnJlZSBDQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIC0gaW5kZXggb2YgY3VycmVudCBjY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIGludCBnZXRfZnJlZV9jY3MocmF5X2Rldl90ICpsb2NhbCkKK3sKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgY2NzIF9faW9tZW0gKnBjY3MgPSBjY3NfYmFzZShsb2NhbCk7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygyLCJyYXlfY3MgZ2V0X2ZyZWVfY2NzIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIEVDQVJER09ORTsKKyAgICB9CisgICAgaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwmbG9jYWwtPmNjc19sb2NrKSkgeworICAgICAgICBERUJVRygxLCJyYXlfY3MgY2NzX2xvY2sgYnVzeVxuIik7CisgICAgICAgIHJldHVybiBFQ0NTQlVTWTsKKyAgICB9IAorCisgICAgZm9yIChpID0gTlVNQkVSX09GX1RYX0NDUzsgaSA8IE5VTUJFUl9PRl9DQ1M7IGkrKykgeworICAgICAgICBpZiAocmVhZGIoJihwY2NzK2kpLT5idWZmZXJfc3RhdHVzKSA9PSBDQ1NfQlVGRkVSX0ZSRUUpIHsKKyAgICAgICAgICAgIHdyaXRlYihDQ1NfQlVGRkVSX0JVU1ksICYocGNjcytpKS0+YnVmZmVyX3N0YXR1cyk7CisgICAgICAgICAgICB3cml0ZWIoQ0NTX0VORF9MSVNULCAmKHBjY3MraSktPmxpbmspOworCQkJbG9jYWwtPmNjc19sb2NrID0gMDsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorCWxvY2FsLT5jY3NfbG9jayA9IDA7CisgICAgREVCVUcoMSwicmF5X2NzIEVSUk9SIG5vIGZyZWUgQ0NTIGZvciByYXlsaW5rIGNhcmRcbiIpOworICAgIHJldHVybiBFQ0NTRlVMTDsKK30gLyogZ2V0X2ZyZWVfY2NzICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBhdXRoZW50aWNhdGVfdGltZW91dCh1X2xvbmcgZGF0YSkKK3sKKyAgICByYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRhdGE7CisgICAgZGVsX3RpbWVyKCZsb2NhbC0+dGltZXIpOworICAgIHByaW50ayhLRVJOX0lORk8gInJheV9jcyBBdXRoZW50aWNhdGlvbiB3aXRoIGFjY2VzcyBwb2ludCBmYWlsZWQiCisgICAgICAgIiAtIHRpbWVvdXRcbiIpOworICAgIGpvaW5fbmV0KCh1X2xvbmcpbG9jYWwpOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCBhc2NfdG9faW50KGNoYXIgYSkKK3sKKyAgICBpZiAoYSA8ICcwJykgcmV0dXJuIC0xOworICAgIGlmIChhIDw9ICc5JykgcmV0dXJuIChhIC0gJzAnKTsKKyAgICBpZiAoYSA8ICdBJykgcmV0dXJuIC0xOworICAgIGlmIChhIDw9ICdGJykgcmV0dXJuICgxMCArIGEgLSAnQScpOworICAgIGlmIChhIDwgJ2EnKSByZXR1cm4gLTE7CisgICAgaWYgKGEgPD0gJ2YnKSByZXR1cm4gKDEwICsgYSAtICdhJyk7CisgICAgcmV0dXJuIC0xOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCBwYXJzZV9hZGRyKGNoYXIgKmluX3N0ciwgVUNIQVIgKm91dCkKK3sKKyAgICBpbnQgbGVuOworICAgIGludCBpLGosazsKKyAgICBpbnQgc3RhdHVzOworICAgIAorICAgIGlmIChpbl9zdHIgPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgaWYgKChsZW4gPSBzdHJsZW4oaW5fc3RyKSkgPCAyKSByZXR1cm4gMDsKKyAgICBtZW1zZXQob3V0LCAwLCBBRERSTEVOKTsKKworICAgIHN0YXR1cyA9IDE7CisgICAgaiA9IGxlbiAtIDE7CisgICAgaWYgKGogPiAxMikgaiA9IDEyOworICAgIGkgPSA1OworICAgIAorICAgIHdoaWxlIChqID4gMCkKKyAgICB7CisgICAgICAgIGlmICgoayA9IGFzY190b19pbnQoaW5fc3RyW2otLV0pKSAhPSAtMSkgb3V0W2ldID0gazsKKyAgICAgICAgZWxzZSByZXR1cm4gMDsKKworICAgICAgICBpZiAoaiA9PSAwKSBicmVhazsKKyAgICAgICAgaWYgKChrID0gYXNjX3RvX2ludChpbl9zdHJbai0tXSkpICE9IC0xKSBvdXRbaV0gKz0gayA8PCA0OworICAgICAgICBlbHNlIHJldHVybiAwOworICAgICAgICBpZiAoIWktLSkgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnJheV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICByYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKKyAgICBkZXZfbGlua190ICpsaW5rID0gbG9jYWwtPmZpbmRlcjsKKyAgICBzdHJ1Y3Qgc3RhdHVzIF9faW9tZW0gKnAgPSBsb2NhbC0+c3JhbSArIFNUQVRVU19CQVNFOworICAgIGlmICghKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpKSB7CisgICAgICAgIERFQlVHKDIsInJheV9jcyBuZXRfZGV2aWNlX3N0YXRzIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuICZsb2NhbC0+c3RhdHM7CisgICAgfQorICAgIGlmIChyZWFkYigmcC0+bXJ4X292ZXJmbG93X2Zvcl9ob3N0KSkKKyAgICB7CisgICAgICAgIGxvY2FsLT5zdGF0cy5yeF9vdmVyX2Vycm9ycyArPSBudG9ocyhyZWFkYigmcC0+bXJ4X292ZXJmbG93KSk7CisgICAgICAgIHdyaXRlYigwLCZwLT5tcnhfb3ZlcmZsb3cpOworICAgICAgICB3cml0ZWIoMCwmcC0+bXJ4X292ZXJmbG93X2Zvcl9ob3N0KTsKKyAgICB9CisgICAgaWYgKHJlYWRiKCZwLT5tcnhfY2hlY2tzdW1fZXJyb3JfZm9yX2hvc3QpKQorICAgIHsKKyAgICAgICAgbG9jYWwtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gbnRvaHMocmVhZGIoJnAtPm1yeF9jaGVja3N1bV9lcnJvcikpOworICAgICAgICB3cml0ZWIoMCwmcC0+bXJ4X2NoZWNrc3VtX2Vycm9yKTsKKyAgICAgICAgd3JpdGViKDAsJnAtPm1yeF9jaGVja3N1bV9lcnJvcl9mb3JfaG9zdCk7CisgICAgfQorICAgIGlmIChyZWFkYigmcC0+cnhfaGVjX2Vycm9yX2Zvcl9ob3N0KSkKKyAgICB7CisgICAgICAgIGxvY2FsLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgKz0gbnRvaHMocmVhZGIoJnAtPnJ4X2hlY19lcnJvcikpOworICAgICAgICB3cml0ZWIoMCwmcC0+cnhfaGVjX2Vycm9yKTsKKyAgICAgICAgd3JpdGViKDAsJnAtPnJ4X2hlY19lcnJvcl9mb3JfaG9zdCk7CisgICAgfQorICAgIHJldHVybiAmbG9jYWwtPnN0YXRzOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgcmF5X3VwZGF0ZV9wYXJtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIFVDSEFSIG9iamlkLCBVQ0hBUiAqdmFsdWUsIGludCBsZW4pCit7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisgICAgaW50IGNjc2luZGV4OworICAgIGludCBpOworICAgIHN0cnVjdCBjY3MgX19pb21lbSAqcGNjczsKKworICAgIGlmICghKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpKSB7CisgICAgICAgIERFQlVHKDIsInJheV91cGRhdGVfcGFybSAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKGNjc2luZGV4ID0gZ2V0X2ZyZWVfY2NzKGxvY2FsKSkgPCAwKQorICAgIHsKKyAgICAgICAgREVCVUcoMCwicmF5X3VwZGF0ZV9wYXJtIC0gTm8gZnJlZSBjY3NcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBjY3MgPSBjY3NfYmFzZShsb2NhbCkgKyBjY3NpbmRleDsKKyAgICB3cml0ZWIoQ0NTX1VQREFURV9QQVJBTVMsICZwY2NzLT5jbWQpOworICAgIHdyaXRlYihvYmppZCwgJnBjY3MtPnZhci51cGRhdGVfcGFyYW0ub2JqZWN0X2lkKTsKKyAgICB3cml0ZWIoMSwgJnBjY3MtPnZhci51cGRhdGVfcGFyYW0ubnVtYmVyX29iamVjdHMpOworICAgIHdyaXRlYigwLCAmcGNjcy0+dmFyLnVwZGF0ZV9wYXJhbS5mYWlsdXJlX2NhdXNlKTsKKyAgICBmb3IgKGk9MDsgaTxsZW47IGkrKykgeworICAgICAgICB3cml0ZWIodmFsdWVbaV0sIGxvY2FsLT5zcmFtICsgSE9TVF9UT19FQ0ZfQkFTRSk7CisgICAgfQorICAgIC8qIEludGVycnVwdCB0aGUgZmlybXdhcmUgdG8gcHJvY2VzcyB0aGUgY29tbWFuZCAqLworICAgIGlmIChpbnRlcnJ1cHRfZWNmKGxvY2FsLCBjY3NpbmRleCkpIHsKKyAgICAgICAgREVCVUcoMCwicmF5X2NzIGFzc29jaWF0ZSBmYWlsZWQgLSBFQ0Ygbm90IHJlYWR5IGZvciBpbnRyXG4iKTsKKyAgICAgICAgd3JpdGViKENDU19CVUZGRVJfRlJFRSwgJihwY2NzKyspLT5idWZmZXJfc3RhdHVzKTsKKyAgICB9Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCByYXlfdXBkYXRlX211bHRpX2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFsbCkKK3sKKyAgICBzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSwgKipkbWlwOworICAgIGludCBjY3NpbmRleDsKKyAgICBzdHJ1Y3QgY2NzIF9faW9tZW0gKnBjY3M7CisgICAgaW50IGkgPSAwOworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworICAgIHZvaWQgX19pb21lbSAqcCA9IGxvY2FsLT5zcmFtICsgSE9TVF9UT19FQ0ZfQkFTRTsKKworICAgIGlmICghKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpKSB7CisgICAgICAgIERFQlVHKDIsInJheV91cGRhdGVfbXVsdGlfbGlzdCAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZSAKKyAgICAgICAgREVCVUcoMiwicmF5X3VwZGF0ZV9tdWx0aV9saXN0KCVwKVxuIixkZXYpOworICAgIGlmICgoY2NzaW5kZXggPSBnZXRfZnJlZV9jY3MobG9jYWwpKSA8IDApCisgICAgeworICAgICAgICBERUJVRygxLCJyYXlfdXBkYXRlX211bHRpIC0gTm8gZnJlZSBjY3NcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBjY3MgPSBjY3NfYmFzZShsb2NhbCkgKyBjY3NpbmRleDsKKyAgICB3cml0ZWIoQ0NTX1VQREFURV9NVUxUSUNBU1RfTElTVCwgJnBjY3MtPmNtZCk7CisKKyAgICBpZiAoYWxsKSB7CisgICAgICAgIHdyaXRlYigweGZmLCAmcGNjcy0+dmFyKTsKKyAgICAgICAgbG9jYWwtPm51bV9tdWx0aSA9IDB4ZmY7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBDb3B5IHRoZSBrZXJuZWwncyBsaXN0IG9mIE1DIGFkZHJlc3NlcyB0byBjYXJkICovCisgICAgICAgIGZvciAoZG1pcD0mZGV2LT5tY19saXN0OyAoZG1pPSpkbWlwKSE9TlVMTDsgZG1pcD0mZG1pLT5uZXh0KSB7CisgICAgICAgICAgICBtZW1jcHlfdG9pbyhwLCBkbWktPmRtaV9hZGRyLCBFVEhfQUxFTik7CisgICAgICAgICAgICBERUJVRygxLCJyYXlfdXBkYXRlX211bHRpIGFkZCBhZGRyICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIixkbWktPmRtaV9hZGRyWzBdLGRtaS0+ZG1pX2FkZHJbMV0sZG1pLT5kbWlfYWRkclsyXSxkbWktPmRtaV9hZGRyWzNdLGRtaS0+ZG1pX2FkZHJbNF0sZG1pLT5kbWlfYWRkcls1XSk7CisgICAgICAgICAgICBwICs9IEVUSF9BTEVOOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIGlmIChpID4gMjU2L0FERFJMRU4pIGkgPSAyNTYvQUREUkxFTjsKKyAgICAgICAgd3JpdGViKChVQ0hBUilpLCAmcGNjcy0+dmFyKTsKKyAgICAgICAgREVCVUcoMSwicmF5X2NzIHVwZGF0ZV9tdWx0aSAlZCBhZGRyZXNzZXMgaW4gbGlzdFxuIiwgaSk7CisgICAgICAgIC8qIEludGVycnVwdCB0aGUgZmlybXdhcmUgdG8gcHJvY2VzcyB0aGUgY29tbWFuZCAqLworICAgICAgICBsb2NhbC0+bnVtX211bHRpID0gaTsKKyAgICB9CisgICAgaWYgKGludGVycnVwdF9lY2YobG9jYWwsIGNjc2luZGV4KSkgeworICAgICAgICBERUJVRygxLCJyYXlfY3MgdXBkYXRlX211bHRpIGZhaWxlZCAtIEVDRiBub3QgcmVhZHkgZm9yIGludHJcbiIpOworICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmKHBjY3MrKyktPmJ1ZmZlcl9zdGF0dXMpOworICAgIH0KK30gLyogZW5kIHJheV91cGRhdGVfbXVsdGlfbGlzdCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisgICAgVUNIQVIgcHJvbWlzYzsKKworICAgIERFQlVHKDIsInJheV9jcyBzZXRfbXVsdGljYXN0X2xpc3QoJXApXG4iLGRldik7CisKKyAgICBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorICAgIHsKKyAgICAgICAgaWYgKGxvY2FsLT5zcGFybS5iNS5hX3Byb21pc2N1b3VzX21vZGUgPT0gMCkgeworICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIHNldF9tdWx0aWNhc3RfbGlzdCBwcm9taXNjIG9uXG4iKTsKKyAgICAgICAgICAgIGxvY2FsLT5zcGFybS5iNS5hX3Byb21pc2N1b3VzX21vZGUgPSAxOworICAgICAgICAgICAgcHJvbWlzYyA9IDE7CisgICAgICAgICAgICByYXlfdXBkYXRlX3Bhcm0oZGV2LCAgT0JKSURfcHJvbWlzY3VvdXNfbW9kZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9taXNjLCBzaXplb2YocHJvbWlzYykpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAobG9jYWwtPnNwYXJtLmI1LmFfcHJvbWlzY3VvdXNfbW9kZSA9PSAxKSB7CisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3Mgc2V0X211bHRpY2FzdF9saXN0IHByb21pc2Mgb2ZmXG4iKTsKKyAgICAgICAgICAgIGxvY2FsLT5zcGFybS5iNS5hX3Byb21pc2N1b3VzX21vZGUgPSAwOworICAgICAgICAgICAgcHJvbWlzYyA9IDA7CisgICAgICAgICAgICByYXlfdXBkYXRlX3Bhcm0oZGV2LCAgT0JKSURfcHJvbWlzY3VvdXNfbW9kZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9taXNjLCBzaXplb2YocHJvbWlzYykpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHJheV91cGRhdGVfbXVsdGlfbGlzdChkZXYsIDEpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChsb2NhbC0+bnVtX211bHRpICE9IGRldi0+bWNfY291bnQpIHJheV91cGRhdGVfbXVsdGlfbGlzdChkZXYsIDApOworICAgIH0KK30gLyogZW5kIHNldF9tdWx0aWNhc3RfbGlzdCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQWxsIHJvdXRpbmVzIGJlbG93IGhlcmUgYXJlIHJ1biBhdCBpbnRlcnJ1cHQgdGltZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpcnFyZXR1cm5fdCByYXlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisgICAgZGV2X2xpbmtfdCAqbGluazsKKyAgICByYXlfZGV2X3QgKmxvY2FsOworICAgIHN0cnVjdCBjY3MgX19pb21lbSAqcGNjczsKKyAgICBzdHJ1Y3QgcmNzIF9faW9tZW0gKnByY3M7CisgICAgVUNIQVIgcmNzaW5kZXg7CisgICAgVUNIQVIgdG1wOworICAgIFVDSEFSIGNtZDsKKyAgICBVQ0hBUiBzdGF0dXM7CisKKyAgICBpZiAoZGV2ID09IE5VTEwpIC8qIE5vdGUgdGhhdCB3ZSB3YW50IGludGVycnVwdHMgd2l0aCBkZXYtPnN0YXJ0ID09IDAgKi8KKwlyZXR1cm4gSVJRX05PTkU7CisKKyAgICBERUJVRyg0LCJyYXlfY3M6IGludGVycnVwdCBmb3IgKmRldj0lcFxuIixkZXYpOworCisgICAgbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworICAgIGxpbmsgPSAoZGV2X2xpbmtfdCAqKWxvY2FsLT5maW5kZXI7CisgICAgaWYgKCAhIChsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSB8fCBsaW5rLT5zdGF0ZSAmIERFVl9TVVNQRU5EICkgeworICAgICAgICBERUJVRygyLCJyYXlfY3MgaW50ZXJydXB0IGZyb20gZGV2aWNlIG5vdCBwcmVzZW50IG9yIHN1c3BlbmRlZC5cbiIpOworICAgICAgICByZXR1cm4gSVJRX05PTkU7CisgICAgfQorICAgIHJjc2luZGV4ID0gcmVhZGIoJigoc3RydWN0IHNjYiBfX2lvbWVtICopKGxvY2FsLT5zcmFtKSktPnJjc19pbmRleCk7CisKKyAgICBpZiAocmNzaW5kZXggPj0gKE5VTUJFUl9PRl9DQ1MgKyBOVU1CRVJfT0ZfUkNTKSkKKyAgICB7CisgICAgICAgIERFQlVHKDEsInJheV9jcyBpbnRlcnJ1cHQgYmFkIHJjc2luZGV4ID0gMHgleFxuIixyY3NpbmRleCk7CisgICAgICAgIGNsZWFyX2ludGVycnVwdChsb2NhbCk7CisgICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKKyAgICB9CisgICAgaWYgKHJjc2luZGV4IDwgTlVNQkVSX09GX0NDUykgLyogSWYgaXQncyBhIHJldHVybmVkIENDUyAqLworICAgIHsKKyAgICAgICAgcGNjcyA9IGNjc19iYXNlKGxvY2FsKSArIHJjc2luZGV4OworICAgICAgICBjbWQgPSByZWFkYigmcGNjcy0+Y21kKTsKKyAgICAgICAgc3RhdHVzID0gcmVhZGIoJnBjY3MtPmJ1ZmZlcl9zdGF0dXMpOworICAgICAgICBzd2l0Y2ggKGNtZCkKKyAgICAgICAgeworICAgICAgICBjYXNlIENDU19ET1dOTE9BRF9TVEFSVFVQX1BBUkFNUzogLyogSGFwcGVucyBpbiBmaXJtd2FyZSBzb21lZGF5ICovCisgICAgICAgICAgICBkZWxfdGltZXIoJmxvY2FsLT50aW1lcik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IENDU19DT01NQU5EX0NPTVBMRVRFKSB7CisgICAgICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCBkb3dubG9hZF9zdGFydHVwX3BhcmFtZXRlcnMgT0tcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCBkb3dubG9hZF9zdGFydHVwX3BhcmFtZXRlcnMgZmFpbFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQ1NfVVBEQVRFX1BBUkFNUzoKKyAgICAgICAgICAgIERFQlVHKDEsInJheV9jcyBpbnRlcnJ1cHQgdXBkYXRlIHBhcmFtcyBkb25lXG4iKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQ0NTX0NPTU1BTkRfQ09NUExFVEUpIHsKKyAgICAgICAgICAgICAgICB0bXAgPSByZWFkYigmcGNjcy0+dmFyLnVwZGF0ZV9wYXJhbS5mYWlsdXJlX2NhdXNlKTsKKyAgICAgICAgICAgIERFQlVHKDAsInJheV9jcyBpbnRlcnJ1cHQgdXBkYXRlIHBhcmFtcyBmYWlsZWQgLSByZWFzb24gJWRcbiIsdG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENDU19SRVBPUlRfUEFSQU1TOgorICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCByZXBvcnQgcGFyYW1zIGRvbmVcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0NTX1VQREFURV9NVUxUSUNBU1RfTElTVDogLyogTm90ZSB0aGF0IHRoaXMgQ0NTIGlzbid0IHJldHVybmVkICovCisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgaW50ZXJydXB0IENDUyBVcGRhdGUgTXVsdGljYXN0IExpc3QgZG9uZVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQ1NfVVBEQVRFX1BPV0VSX1NBVklOR1NfTU9ERToKKyAgICAgICAgICAgIERFQlVHKDEsInJheV9jcyBpbnRlcnJ1cHQgdXBkYXRlIHBvd2VyIHNhdmUgbW9kZSBkb25lXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENDU19TVEFSVF9ORVRXT1JLOgorICAgICAgICBjYXNlIENDU19KT0lOX05FVFdPUks6CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IENDU19DT01NQU5EX0NPTVBMRVRFKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlYWRiKCZwY2NzLT52YXIuc3RhcnRfbmV0d29yay5uZXRfaW5pdGlhdGVkKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIERFQlVHKDAsInJheV9jcyBpbnRlcnJ1cHQgbmV0d29yayBcIiVzXCIgc3RhcnRlZFxuIixcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLT5zcGFybS5iNC5hX2N1cnJlbnRfZXNzX2lkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIERFQlVHKDAsInJheV9jcyBpbnRlcnJ1cHQgbmV0d29yayBcIiVzXCIgam9pbmVkXG4iLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwtPnNwYXJtLmI0LmFfY3VycmVudF9lc3NfaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1jcHlfZnJvbWlvKCZsb2NhbC0+YnNzX2lkLHBjY3MtPnZhci5zdGFydF9uZXR3b3JrLmJzc2lkLEFERFJMRU4pOworCisgICAgICAgICAgICAgICAgaWYgKGxvY2FsLT5md192ZXIgPT0gMHg1NSkgbG9jYWwtPm5ldF9kZWZhdWx0X3R4X3JhdGUgPSAzOworICAgICAgICAgICAgICAgIGVsc2UgbG9jYWwtPm5ldF9kZWZhdWx0X3R4X3JhdGUgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWFkYigmcGNjcy0+dmFyLnN0YXJ0X25ldHdvcmsubmV0X2RlZmF1bHRfdHhfcmF0ZSk7CisgICAgICAgICAgICAgICAgbG9jYWwtPmVuY3J5cHRpb24gPSByZWFkYigmcGNjcy0+dmFyLnN0YXJ0X25ldHdvcmsuZW5jcnlwdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKCFzbmlmZmVyICYmIChsb2NhbC0+bmV0X3R5cGUgPT0gSU5GUkEpCisgICAgICAgICAgICAgICAgICAgICYmICEobG9jYWwtPnNwYXJtLmI0LmFfYWN0aW5nX2FzX2FwX3N0YXR1cykpIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRlKGxvY2FsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9jYWwtPmNhcmRfc3RhdHVzID0gQ0FSRF9BQ1FfQ09NUExFVEU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0FDUV9GQUlMRUQ7CisKKyAgICAgICAgICAgICAgICBkZWxfdGltZXIoJmxvY2FsLT50aW1lcik7CisgICAgICAgICAgICAgICAgbG9jYWwtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFoqNTsKKyAgICAgICAgICAgICAgICBsb2NhbC0+dGltZXIuZGF0YSA9IChsb25nKWxvY2FsOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQ0NTX1NUQVJUX05FVFdPUkspIHsKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoMCwicmF5X2NzIGludGVycnVwdCBuZXR3b3JrIFwiJXNcIiBzdGFydCBmYWlsZWRcbiIsXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC0+c3Bhcm0uYjQuYV9jdXJyZW50X2Vzc19pZCk7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsLT50aW1lci5mdW5jdGlvbiA9ICZzdGFydF9uZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBERUJVRygwLCJyYXlfY3MgaW50ZXJydXB0IG5ldHdvcmsgXCIlc1wiIGpvaW4gZmFpbGVkXG4iLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwtPnNwYXJtLmI0LmFfY3VycmVudF9lc3NfaWQpOworICAgICAgICAgICAgICAgICAgICBsb2NhbC0+dGltZXIuZnVuY3Rpb24gPSAmam9pbl9uZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZF90aW1lcigmbG9jYWwtPnRpbWVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENDU19TVEFSVF9BU1NPQ0lBVElPTjoKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQ0NTX0NPTU1BTkRfQ09NUExFVEUpIHsKKyAgICAgICAgICAgICAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0FTU09DX0NPTVBMRVRFOworICAgICAgICAgICAgICAgIERFQlVHKDAsInJheV9jcyBhc3NvY2lhdGlvbiBzdWNjZXNzZnVsXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBERUJVRygwLCJyYXlfY3MgYXNzb2NpYXRpb24gZmFpbGVkLFxuIik7CisgICAgICAgICAgICAgICAgbG9jYWwtPmNhcmRfc3RhdHVzID0gQ0FSRF9BU1NPQ19GQUlMRUQ7CisgICAgICAgICAgICAgICAgam9pbl9uZXQoKHVfbG9uZylsb2NhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQ1NfVFhfUkVRVUVTVDoKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQ0NTX0NPTU1BTkRfQ09NUExFVEUpIHsKKyAgICAgICAgICAgICAgICBERUJVRygzLCJyYXlfY3MgaW50ZXJydXB0IHR4IHJlcXVlc3QgY29tcGxldGVcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCB0eCByZXF1ZXN0IGZhaWxlZFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNuaWZmZXIpIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQ1NfVEVTVF9NRU1PUlk6CisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgaW50ZXJydXB0IG1lbSB0ZXN0IGRvbmVcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0NTX1NIVVRET1dOOgorICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCBVbmV4cGVjdGVkIENDUyByZXR1cm5lZCAtIFNodXRkb3duXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENDU19EVU1QX01FTU9SWToKKyAgICAgICAgICAgIERFQlVHKDEsInJheV9jcyBpbnRlcnJ1cHQgZHVtcCBtZW1vcnkgZG9uZVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQ1NfU1RBUlRfVElNRVI6CisgICAgICAgICAgICBERUJVRygyLCJyYXlfY3MgaW50ZXJydXB0IERJTkcgLSByYXlsaW5rIHRpbWVyIGV4cGlyZWRcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgaW50ZXJydXB0IFVuZXhwZWN0ZWQgQ0NTIDB4JXggcmV0dXJuZWQgMHgleFxuIixcCisgICAgICAgICAgICAgICAgICByY3NpbmRleCwgY21kKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmcGNjcy0+YnVmZmVyX3N0YXR1cyk7CisgICAgfQorICAgIGVsc2UgLyogSXQncyBhbiBSQ1MgKi8KKyAgICB7CisgICAgICAgIHByY3MgPSByY3NfYmFzZShsb2NhbCkgKyByY3NpbmRleDsKKyAgICAKKyAgICAgICAgc3dpdGNoIChyZWFkYigmcHJjcy0+aW50ZXJydXB0X2lkKSkKKyAgICAgICAgeworICAgICAgICBjYXNlIFBST0NFU1NfUlhfUEFDS0VUOgorICAgICAgICAgICAgcmF5X3J4KGRldiwgbG9jYWwsIHByY3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVKT0lOX05FVF9DT01QTEVURToKKyAgICAgICAgICAgIERFQlVHKDEsInJheV9jcyBpbnRlcnJ1cHQgcmVqb2luIG5ldCBjb21wbGV0ZVxuIik7CisgICAgICAgICAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0FDUV9DT01QTEVURTsKKyAgICAgICAgICAgIC8qIGRvIHdlIG5lZWQgdG8gY2xlYXIgdHggYnVmZmVycyBDQ1Mncz8gKi8KKyAgICAgICAgICAgIGlmIChsb2NhbC0+c3Bhcm0uYjQuYV9uZXR3b3JrX3R5cGUgPT0gQURIT0MpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNuaWZmZXIpIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZW1jcHlfZnJvbWlvKCZsb2NhbC0+YnNzX2lkLCBwcmNzLT52YXIucmVqb2luX25ldF9jb21wbGV0ZS5ic3NpZCwgQUREUkxFTik7CisgICAgICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIG5ldyBCU1NJRCA9ICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIixcCisgICAgICAgICAgICAgICAgICAgICAgbG9jYWwtPmJzc19pZFswXSwgbG9jYWwtPmJzc19pZFsxXSwgbG9jYWwtPmJzc19pZFsyXSxcCisgICAgICAgICAgICAgICAgICAgICAgbG9jYWwtPmJzc19pZFszXSwgbG9jYWwtPmJzc19pZFs0XSwgbG9jYWwtPmJzc19pZFs1XSk7CisgICAgICAgICAgICAgICAgaWYgKCFzbmlmZmVyKSBhdXRoZW50aWNhdGUobG9jYWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUk9BTUlOR19JTklUSUFURUQ6CisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgaW50ZXJydXB0IHJvYW1pbmcgaW5pdGlhdGVkXG4iKTsgCisgICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgICAgICAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0RPSU5HX0FDUTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEpBUEFOX0NBTExfU0lHTl9SWEQ6CisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgaW50ZXJydXB0IGphcGFuIGNhbGwgc2lnbiByeFxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERFQlVHKDEsInJheV9jcyBVbmV4cGVjdGVkIGludGVycnVwdCBmb3IgUkNTIDB4JXggY21kID0gMHgleFxuIixcCisgICAgICAgICAgICAgICAgICByY3NpbmRleCwgKHVuc2lnbmVkIGludCkgcmVhZGIoJnByY3MtPmludGVycnVwdF9pZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGViKENDU19CVUZGRVJfRlJFRSwgJnByY3MtPmJ1ZmZlcl9zdGF0dXMpOworICAgIH0KKyAgICBjbGVhcl9pbnRlcnJ1cHQobG9jYWwpOworICAgIHJldHVybiBJUlFfSEFORExFRDsKK30gLyogcmF5X2ludGVycnVwdCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgcmF5X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHJheV9kZXZfdCAqbG9jYWwsIHN0cnVjdCByY3MgX19pb21lbSAqcHJjcykKK3sKKyAgICBpbnQgcnhfbGVuOworICAgIHVuc2lnbmVkIGludCBwa3RfYWRkcjsKKyAgICB2b2lkIF9faW9tZW0gKnBtc2c7CisgICAgREVCVUcoNCwicmF5X3J4IHByb2Nlc3MgcnggcGFja2V0XG4iKTsKKworICAgIC8qIENhbGN1bGF0ZSBhZGRyZXNzIG9mIHBhY2tldCB3aXRoaW4gUnggYnVmZmVyICovCisgICAgcGt0X2FkZHIgPSAoKHJlYWRiKCZwcmNzLT52YXIucnhfcGFja2V0LnJ4X2RhdGFfcHRyWzBdKSA8PCA4KQorICAgICAgICAgICAgICAgICsgcmVhZGIoJnByY3MtPnZhci5yeF9wYWNrZXQucnhfZGF0YV9wdHJbMV0pKSAmIFJYX0JVRkZfRU5EOworICAgIC8qIExlbmd0aCBvZiBmaXJzdCBwYWNrZXQgZnJhZ21lbnQgKi8KKyAgICByeF9sZW4gPSAocmVhZGIoJnByY3MtPnZhci5yeF9wYWNrZXQucnhfZGF0YV9sZW5ndGhbMF0pIDw8IDgpCisgICAgICAgICsgcmVhZGIoJnByY3MtPnZhci5yeF9wYWNrZXQucnhfZGF0YV9sZW5ndGhbMV0pOworCisgICAgbG9jYWwtPmxhc3RfcnNsID0gcmVhZGIoJnByY3MtPnZhci5yeF9wYWNrZXQucnhfc2lnX2xldik7CisgICAgcG1zZyA9IGxvY2FsLT5ybWVtICsgcGt0X2FkZHI7CisgICAgc3dpdGNoKHJlYWRiKHBtc2cpKQorICAgIHsKKyAgICBjYXNlIERBVEFfVFlQRToKKyAgICAgICAgREVCVUcoNCwicmF5X3J4IGRhdGEgdHlwZVxuIik7CisgICAgICAgIHJ4X2RhdGEoZGV2LCBwcmNzLCBwa3RfYWRkciwgcnhfbGVuKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVVRIRU5USUNfVFlQRToKKyAgICAgICAgREVCVUcoNCwicmF5X3J4IGF1dGhlbnRpYyB0eXBlXG4iKTsKKyAgICAgICAgaWYgKHNuaWZmZXIpIHJ4X2RhdGEoZGV2LCBwcmNzLCBwa3RfYWRkciwgcnhfbGVuKTsKKyAgICAgICAgZWxzZSByeF9hdXRoZW50aWNhdGUobG9jYWwsIHByY3MsIHBrdF9hZGRyLCByeF9sZW4pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERFQVVUSEVOVElDX1RZUEU6CisgICAgICAgIERFQlVHKDQsInJheV9yeCBkZWF1dGggdHlwZVxuIik7CisgICAgICAgIGlmIChzbmlmZmVyKSByeF9kYXRhKGRldiwgcHJjcywgcGt0X2FkZHIsIHJ4X2xlbik7CisgICAgICAgIGVsc2UgcnhfZGVhdXRoZW50aWNhdGUobG9jYWwsIHByY3MsIHBrdF9hZGRyLCByeF9sZW4pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5VTExfTVNHX1RZUEU6CisgICAgICAgIERFQlVHKDMsInJheV9jcyByeCBOVUxMIG1zZ1xuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkVBQ09OX1RZUEU6CisgICAgICAgIERFQlVHKDQsInJheV9yeCBiZWFjb24gdHlwZVxuIik7CisgICAgICAgIGlmIChzbmlmZmVyKSByeF9kYXRhKGRldiwgcHJjcywgcGt0X2FkZHIsIHJ4X2xlbik7CisKKyAgICAgICAgY29weV9mcm9tX3J4X2J1ZmYobG9jYWwsIChVQ0hBUiAqKSZsb2NhbC0+bGFzdF9iY24sIHBrdF9hZGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnhfbGVuIDwgc2l6ZW9mKHN0cnVjdCBiZWFjb25fcngpID8gCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4X2xlbiA6IHNpemVvZihzdHJ1Y3QgYmVhY29uX3J4KSk7CisKKwlsb2NhbC0+YmVhY29uX3J4ZWQgPSAxOworICAgICAgICAvKiBHZXQgdGhlIHN0YXRpc3RpY3Mgc28gdGhlIGNhcmQgY291bnRlcnMgbmV2ZXIgb3ZlcmZsb3cgKi8KKyAgICAgICAgcmF5X2dldF9zdGF0cyhkZXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgREVCVUcoMCwicmF5X2NzIHVua25vd24gcGt0IHR5cGUgJTJ4XG4iLCAodW5zaWduZWQgaW50KSByZWFkYihwbXNnKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworfSAvKiBlbmQgcmF5X3J4ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCByeF9kYXRhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCByY3MgX19pb21lbSAqcHJjcywgdW5zaWduZWQgaW50IHBrdF9hZGRyLCAKKyAgICAgICAgICAgICBpbnQgcnhfbGVuKQoreworICAgIHN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworICAgIHN0cnVjdCByY3MgX19pb21lbSAqcHJjc2xpbmsgPSBwcmNzOworICAgIHJheV9kZXZfdCAqbG9jYWwgPSBkZXYtPnByaXY7CisgICAgVUNIQVIgKnJ4X3B0cjsKKyAgICBpbnQgdG90YWxfbGVuOworICAgIGludCB0bXA7CisjaWZkZWYgV0lSRUxFU1NfU1BZCisgICAgaW50IHNpZ2xldiA9IGxvY2FsLT5sYXN0X3JzbDsKKyAgICB1X2NoYXIgbGlua3NyY2FkZHJbRVRIX0FMRU5dOwkvKiBPdGhlciBlbmQgb2YgdGhlIHdpcmVsZXNzIGxpbmsgKi8KKyNlbmRpZgorCisgICAgaWYgKCFzbmlmZmVyKSB7CisgICAgICAgIGlmICh0cmFuc2xhdGUpIHsKKy8qIFRCRCBsZW5ndGggbmVlZHMgZml4aW5nIGZvciB0cmFuc2xhdGVkIGhlYWRlciAqLworICAgICAgICAgICAgaWYgKHJ4X2xlbiA8IChFVEhfSExFTiArIFJYX01BQ19IRUFERVJfTEVOR1RIKSB8fAorICAgICAgICAgICAgICAgIHJ4X2xlbiA+IChkZXYtPm10dSArIFJYX01BQ19IRUFERVJfTEVOR1RIICsgRVRIX0hMRU4gKyBGQ1NfTEVOKSkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREVCVUcoMCwicmF5X2NzIGludmFsaWQgcGFja2V0IGxlbmd0aCAlZCByZWNlaXZlZCBcbiIscnhfbGVuKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBlbmNhcHN1bGF0ZWQgZXRoZXJuZXQgKi8geworICAgICAgICAgICAgaWYgKHJ4X2xlbiA8IChFVEhfSExFTiArIFJYX01BQ19IRUFERVJfTEVOR1RIKSB8fAorICAgICAgICAgICAgICAgIHJ4X2xlbiA+IChkZXYtPm10dSArIFJYX01BQ19IRUFERVJfTEVOR1RIICsgRVRIX0hMRU4gKyBGQ1NfTEVOKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBERUJVRygwLCJyYXlfY3MgaW52YWxpZCBwYWNrZXQgbGVuZ3RoICVkIHJlY2VpdmVkIFxuIixyeF9sZW4pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBERUJVRyg0LCJyYXlfY3MgcnhfZGF0YSBwYWNrZXRcbiIpOworICAgIC8qIElmIGZyYWdtZW50ZWQgcGFja2V0LCB2ZXJpZnkgc2l6ZXMgb2YgZnJhZ21lbnRzIGFkZCB1cCAqLworICAgIGlmIChyZWFkYigmcHJjcy0+dmFyLnJ4X3BhY2tldC5uZXh0X2ZyYWdfcmNzX2luZGV4KSAhPSAweEZGKSB7CisgICAgICAgIERFQlVHKDEsInJheV9jcyByeCdlZCBmcmFnbWVudFxuIik7CisgICAgICAgIHRtcCA9IChyZWFkYigmcHJjcy0+dmFyLnJ4X3BhY2tldC50b3RhbHBhY2tldGxlbmd0aFswXSkgPDwgOCkKKyAgICAgICAgICAgICsgIHJlYWRiKCZwcmNzLT52YXIucnhfcGFja2V0LnRvdGFscGFja2V0bGVuZ3RoWzFdKTsKKyAgICAgICAgdG90YWxfbGVuID0gdG1wOworICAgICAgICBwcmNzbGluayA9IHByY3M7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHRtcCAtPSAocmVhZGIoJnByY3NsaW5rLT52YXIucnhfcGFja2V0LnJ4X2RhdGFfbGVuZ3RoWzBdKSA8PCA4KQorICAgICAgICAgICAgICAgICsgICByZWFkYigmcHJjc2xpbmstPnZhci5yeF9wYWNrZXQucnhfZGF0YV9sZW5ndGhbMV0pOworICAgICAgICAgICAgaWYgKHJlYWRiKCZwcmNzbGluay0+dmFyLnJ4X3BhY2tldC5uZXh0X2ZyYWdfcmNzX2luZGV4KSA9PSAweEZGCisgICAgICAgICAgICAgICAgfHwgdG1wIDwgMCkgYnJlYWs7CisgICAgICAgICAgICBwcmNzbGluayA9IHJjc19iYXNlKGxvY2FsKQorICAgICAgICAgICAgICAgICsgcmVhZGIoJnByY3NsaW5rLT5saW5rX2ZpZWxkKTsKKyAgICAgICAgfSB3aGlsZSAoMSk7CisKKyAgICAgICAgaWYgKHRtcCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIERFQlVHKDAsInJheV9jcyByeF9kYXRhIGZyYWdtZW50IGxlbmd0aHMgZG9uJ3QgYWRkIHVwXG4iKTsKKyAgICAgICAgICAgIGxvY2FsLT5zdGF0cy5yeF9kcm9wcGVkKys7IAorICAgICAgICAgICAgcmVsZWFzZV9mcmFnX2NoYWluKGxvY2FsLCBwcmNzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsgLyogU2luZ2xlIHVuZnJhZ21lbnRlZCBwYWNrZXQgKi8KKyAgICAgICAgdG90YWxfbGVuID0gcnhfbGVuOworICAgIH0KKworICAgIHNrYiA9IGRldl9hbGxvY19za2IoIHRvdGFsX2xlbis1ICk7CisgICAgaWYgKHNrYiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREVCVUcoMCwicmF5X2NzIHJ4X2RhdGEgY291bGQgbm90IGFsbG9jYXRlIHNrYlxuIik7CisgICAgICAgIGxvY2FsLT5zdGF0cy5yeF9kcm9wcGVkKys7IAorICAgICAgICBpZiAocmVhZGIoJnByY3MtPnZhci5yeF9wYWNrZXQubmV4dF9mcmFnX3Jjc19pbmRleCkgIT0gMHhGRikKKyAgICAgICAgICAgIHJlbGVhc2VfZnJhZ19jaGFpbihsb2NhbCwgcHJjcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2tiX3Jlc2VydmUoIHNrYiwgMik7ICAgLyogQWxpZ24gSVAgb24gMTYgYnl0ZSAoVEJEIGNoZWNrIHRoaXMpKi8KKyAgICBza2ItPmRldiA9IGRldjsKKworICAgIERFQlVHKDQsInJheV9jcyByeF9kYXRhIHRvdGFsX2xlbiA9ICV4LCByeF9sZW4gPSAleFxuIix0b3RhbF9sZW4scnhfbGVuKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBSZXNlcnZlIGVub3VnaCByb29tIGZvciB0aGUgd2hvbGUgZGFtbiBwYWNrZXQuICovCisgICAgcnhfcHRyID0gc2tiX3B1dCggc2tiLCB0b3RhbF9sZW4pOworICAgIC8qIENvcHkgdGhlIHdob2xlIHBhY2tldCB0byBza19idWZmICovCisgICAgcnhfcHRyICs9IGNvcHlfZnJvbV9yeF9idWZmKGxvY2FsLCByeF9wdHIsIHBrdF9hZGRyICYgUlhfQlVGRl9FTkQsIHJ4X2xlbik7CisgICAgLyogR2V0IHNvdXJjZSBhZGRyZXNzICovCisjaWZkZWYgV0lSRUxFU1NfU1BZCisgICAgbWVtY3B5KGxpbmtzcmNhZGRyLCAoKHN0cnVjdCBtYWNfaGVhZGVyICopc2tiLT5kYXRhKS0+YWRkcl8yLCBFVEhfQUxFTik7CisjZW5kaWYKKyAgICAvKiBOb3csIGRlYWwgd2l0aCBlbmNhcHN1bGF0aW9uL3RyYW5zbGF0aW9uL3NuaWZmZXIgKi8KKyAgICBpZiAoIXNuaWZmZXIpIHsKKyAgICAgICAgaWYgKCF0cmFuc2xhdGUpIHsgCisgICAgICAgICAgICAvKiBFbmNhcHN1bGF0ZWQgZXRoZXJuZXQsIHNvIGp1c3QgbG9wIG9mZiA4MDIuMTEgTUFDIGhlYWRlciAqLworLyogVEJEIHJlc2VydmUgICAgICAgICAgICBza2JfcmVzZXJ2ZSggc2tiLCBSWF9NQUNfSEVBREVSX0xFTkdUSCk7ICovCisgICAgICAgICAgICBza2JfcHVsbCggc2tiLCBSWF9NQUNfSEVBREVSX0xFTkdUSCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBEbyB0cmFuc2xhdGlvbiAqLworICAgICAgICAgICAgdW50cmFuc2xhdGUobG9jYWwsIHNrYiwgdG90YWxfbGVuKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIAorICAgIHsgIC8qIHNuaWZmZXIgbW9kZSwgc28ganVzdCBwYXNzIHdob2xlIHBhY2tldCAqLyAgfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBOb3cgcGljayB1cCB0aGUgcmVzdCBvZiB0aGUgZnJhZ21lbnRzIGlmIGFueSAqLworICAgIHRtcCA9IDE3OyAKKyAgICBpZiAocmVhZGIoJnByY3MtPnZhci5yeF9wYWNrZXQubmV4dF9mcmFnX3Jjc19pbmRleCkgIT0gMHhGRikgeworICAgICAgICBwcmNzbGluayA9IHByY3M7CisgICAgICAgIERFQlVHKDEsInJheV9jcyByeF9kYXRhIGluIGZyYWdtZW50IGxvb3BcbiIpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBwcmNzbGluayA9IHJjc19iYXNlKGxvY2FsKQorICAgICAgICAgICAgICAgICsgcmVhZGIoJnByY3NsaW5rLT52YXIucnhfcGFja2V0Lm5leHRfZnJhZ19yY3NfaW5kZXgpOworICAgICAgICAgICAgcnhfbGVuID0gKCggcmVhZGIoJnByY3NsaW5rLT52YXIucnhfcGFja2V0LnJ4X2RhdGFfbGVuZ3RoWzBdKSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICsgcmVhZGIoJnByY3NsaW5rLT52YXIucnhfcGFja2V0LnJ4X2RhdGFfbGVuZ3RoWzFdKSkKKyAgICAgICAgICAgICAgICAmIFJYX0JVRkZfRU5EOworICAgICAgICAgICAgcGt0X2FkZHIgPSAoKCByZWFkYigmcHJjc2xpbmstPnZhci5yeF9wYWNrZXQucnhfZGF0YV9wdHJbMF0pIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICArIHJlYWRiKCZwcmNzbGluay0+dmFyLnJ4X3BhY2tldC5yeF9kYXRhX3B0clsxXSkpCisgICAgICAgICAgICAgICAgJiBSWF9CVUZGX0VORDsKKworICAgICAgICAgICAgcnhfcHRyICs9IGNvcHlfZnJvbV9yeF9idWZmKGxvY2FsLCByeF9wdHIsIHBrdF9hZGRyLCByeF9sZW4pOworCisgICAgICAgIH0gd2hpbGUgKHRtcC0tICYmIAorICAgICAgICAgICAgICAgICByZWFkYigmcHJjc2xpbmstPnZhci5yeF9wYWNrZXQubmV4dF9mcmFnX3Jjc19pbmRleCkgIT0gMHhGRik7CisgICAgICAgIHJlbGVhc2VfZnJhZ19jaGFpbihsb2NhbCwgcHJjcyk7CisgICAgfQorCisgICAgc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworICAgIG5ldGlmX3J4KHNrYik7CisgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKyAgICBsb2NhbC0+c3RhdHMucnhfcGFja2V0cysrOworICAgIGxvY2FsLT5zdGF0cy5yeF9ieXRlcyArPSB0b3RhbF9sZW47CisKKyAgICAvKiBHYXRoZXIgc2lnbmFsIHN0cmVuZ3RoIHBlciBhZGRyZXNzICovCisjaWZkZWYgV0lSRUxFU1NfU1BZCisgICAgLyogRm9yIHRoZSBBY2Nlc3MgUG9pbnQgb3IgdGhlIG5vZGUgaGF2aW5nIHN0YXJ0ZWQgdGhlIGFkLWhvYyBuZXQKKyAgICAgKiBub3RlIDogYWQtaG9jIHdvcmsgb25seSBpbiBzb21lIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zLCBidXQgd2UKKyAgICAgKiBrbHVkZ2UgaW4gcmF5X2dldF93aXJlbGVzc19zdGF0cy4uLiAqLworICAgIGlmKCFtZW1jbXAobGlua3NyY2FkZHIsIGxvY2FsLT5ic3NfaWQsIEVUSF9BTEVOKSkKKyAgICAgIHsKKwkvKiBVcGRhdGUgc3RhdGlzdGljcyAqLworCS8qbG9jYWwtPndzdGF0cy5xdWFsLnF1YWwgPSBub25lID8gKi8KKwlsb2NhbC0+d3N0YXRzLnF1YWwubGV2ZWwgPSBzaWdsZXY7CisJLypsb2NhbC0+d3N0YXRzLnF1YWwubm9pc2UgPSBub25lID8gKi8KKwlsb2NhbC0+d3N0YXRzLnF1YWwudXBkYXRlZCA9IDB4MjsKKyAgICAgIH0KKyAgICAvKiBOb3csIGZvciB0aGUgYWRkcmVzc2VzIGluIHRoZSBzcHkgbGlzdCAqLworICAgIHsKKyAgICAgIGludAlpOworICAgICAgLyogTG9vayBhbGwgYWRkcmVzc2VzICovCisgICAgICBmb3IoaSA9IDA7IGkgPCBsb2NhbC0+c3B5X251bWJlcjsgaSsrKQorCS8qIElmIG1hdGNoICovCisJaWYoIW1lbWNtcChsaW5rc3JjYWRkciwgbG9jYWwtPnNweV9hZGRyZXNzW2ldLCBFVEhfQUxFTikpCisJICB7CisJICAgIC8qIFVwZGF0ZSBzdGF0aXN0aWNzICovCisJICAgIC8qbG9jYWwtPnNweV9zdGF0W2ldLnF1YWwgPSBub25lID8gKi8KKwkgICAgbG9jYWwtPnNweV9zdGF0W2ldLmxldmVsID0gc2lnbGV2OworCSAgICAvKmxvY2FsLT5zcHlfc3RhdFtpXS5ub2lzZSA9IG5vbmUgPyAqLworCSAgICBsb2NhbC0+c3B5X3N0YXRbaV0udXBkYXRlZCA9IDB4MjsKKwkgIH0KKyAgICB9CisjZW5kaWYJLyogV0lSRUxFU1NfU1BZICovCit9IC8qIGVuZCByeF9kYXRhICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCB1bnRyYW5zbGF0ZShyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuKQoreworICAgIHNuYXBoZHJfdCAqcHNuYXAgPSAoc25hcGhkcl90ICopKHNrYi0+ZGF0YSArIFJYX01BQ19IRUFERVJfTEVOR1RIKTsKKyAgICBzdHJ1Y3QgbWFjX2hlYWRlciAqcG1hYyA9IChzdHJ1Y3QgbWFjX2hlYWRlciAqKXNrYi0+ZGF0YTsKKyAgICB1bnNpZ25lZCBzaG9ydCB0eXBlID0gKih1bnNpZ25lZCBzaG9ydCAqKXBzbmFwLT5ldGhlcnR5cGU7CisgICAgdW5zaWduZWQgaW50IHhzYXAgPSAqKHVuc2lnbmVkIGludCAqKXBzbmFwICYgMHgwMGZmZmZmZjsKKyAgICB1bnNpZ25lZCBpbnQgb3JnID0gKCoodW5zaWduZWQgaW50ICopcHNuYXAtPm9yZykgJiAweDAwZmZmZmZmOworICAgIGludCBkZWx0YTsKKyAgICBzdHJ1Y3QgZXRoaGRyICpwZXRoOworICAgIFVDSEFSIHNyY2FkZHJbQUREUkxFTl07CisgICAgVUNIQVIgZGVzdGFkZHJbQUREUkxFTl07CisKKyAgICBpZiAocG1hYy0+ZnJhbWVfY3RsXzIgJiBGQzJfRlJPTV9EUykgeworCWlmIChwbWFjLT5mcmFtZV9jdGxfMiAmIEZDMl9UT19EUykgeyAvKiBBUCB0byBBUCAqLworCSAgICBtZW1jcHkoZGVzdGFkZHIsIHBtYWMtPmFkZHJfMywgQUREUkxFTik7CisJICAgIG1lbWNweShzcmNhZGRyLCAoKHVuc2lnbmVkIGNoYXIgKilwbWFjLT5hZGRyXzMpICsgQUREUkxFTiwgQUREUkxFTik7CisJfSBlbHNlIHsgLyogQVAgdG8gdGVybWluYWwgKi8KKwkgICAgbWVtY3B5KGRlc3RhZGRyLCBwbWFjLT5hZGRyXzEsIEFERFJMRU4pOworCSAgICBtZW1jcHkoc3JjYWRkciwgcG1hYy0+YWRkcl8zLCBBRERSTEVOKTsgCisJfQorICAgIH0gZWxzZSB7IC8qIFRlcm1pbmFsIHRvIEFQICovCisJaWYgKHBtYWMtPmZyYW1lX2N0bF8yICYgRkMyX1RPX0RTKSB7CisJICAgIG1lbWNweShkZXN0YWRkciwgcG1hYy0+YWRkcl8zLCBBRERSTEVOKTsKKwkgICAgbWVtY3B5KHNyY2FkZHIsIHBtYWMtPmFkZHJfMiwgQUREUkxFTik7IAorCX0gZWxzZSB7IC8qIEFkaG9jICovCisJICAgIG1lbWNweShkZXN0YWRkciwgcG1hYy0+YWRkcl8xLCBBRERSTEVOKTsKKwkgICAgbWVtY3B5KHNyY2FkZHIsIHBtYWMtPmFkZHJfMiwgQUREUkxFTik7IAorCX0KKyAgICB9CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgICBpZiAocGNfZGVidWcgPiAzKSB7CisgICAgaW50IGk7CisgICAgcHJpbnRrKEtFUk5fREVCVUcgInNrYi0+ZGF0YSBiZWZvcmUgdW50cmFuc2xhdGUiKTsKKyAgICBmb3IgKGk9MDtpPDY0O2krKykgCisgICAgICAgIHByaW50aygiJTAyeCAiLHNrYi0+ZGF0YVtpXSk7CisgICAgcHJpbnRrKCJcbiIgS0VSTl9ERUJVRyAidHlwZSA9ICUwOHgsIHhzYXAgPSAlMDh4LCBvcmcgPSAlMDh4XG4iLAorICAgICAgICAgICB0eXBlLHhzYXAsb3JnKTsKKyAgICBwcmludGsoS0VSTl9ERUJVRyAidW50cmFuc2xhdGUgc2tiLT5kYXRhID0gJXBcbiIsc2tiLT5kYXRhKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICggeHNhcCAhPSBTTkFQX0lEKSB7CisgICAgICAgIC8qIG5vdCBhIHNuYXAgdHlwZSBzbyBsZWF2ZSBpdCBhbG9uZSAqLworICAgICAgICBERUJVRygzLCJyYXlfY3MgdW50cmFuc2xhdGUgTk9UIFNOQVAgJXhcbiIsICoodW5zaWduZWQgaW50ICopcHNuYXAgJiAweDAwZmZmZmZmKTsKKworICAgICAgICBkZWx0YSA9IFJYX01BQ19IRUFERVJfTEVOR1RIIC0gRVRIX0hMRU47CisgICAgICAgIHBldGggPSAoc3RydWN0IGV0aGhkciAqKShza2ItPmRhdGEgKyBkZWx0YSk7CisgICAgICAgIHBldGgtPmhfcHJvdG8gPSBodG9ucyhsZW4gLSBSWF9NQUNfSEVBREVSX0xFTkdUSCk7CisgICAgfQorICAgIGVsc2UgeyAvKiBJdHMgYSBTTkFQICovCisgICAgICAgIGlmIChvcmcgPT0gQlJJREdFX0VOQ0FQKSB7IC8qIEV0aGVySUkgYW5kIG51a2UgdGhlIExMQyAgKi8KKyAgICAgICAgREVCVUcoMywicmF5X2NzIHVudHJhbnNsYXRlIEJyaWRnZSBlbmNhcFxuIik7CisgICAgICAgICAgICBkZWx0YSA9IFJYX01BQ19IRUFERVJfTEVOR1RIIAorICAgICAgICAgICAgICAgICsgc2l6ZW9mKHN0cnVjdCBzbmFwaGRyX3QpIC0gRVRIX0hMRU47CisgICAgICAgICAgICBwZXRoID0gKHN0cnVjdCBldGhoZHIgKikoc2tiLT5kYXRhICsgZGVsdGEpOworICAgICAgICAgICAgcGV0aC0+aF9wcm90byA9IHR5cGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAob3JnID09IFJGQzEwNDJfRU5DQVApIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFJBWV9JUFhfVFlQRToKKyAgICAgICAgICAgICAgICBjYXNlIEFQUExFQVJQX1RZUEU6CisgICAgICAgICAgICAgICAgICAgIERFQlVHKDMsInJheV9jcyB1bnRyYW5zbGF0ZSBSRkMgSVBYL0FBUlBcbiIpOworICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IFJYX01BQ19IRUFERVJfTEVOR1RIIC0gRVRIX0hMRU47CisgICAgICAgICAgICAgICAgICAgIHBldGggPSAoc3RydWN0IGV0aGhkciAqKShza2ItPmRhdGEgKyBkZWx0YSk7CisgICAgICAgICAgICAgICAgICAgIHBldGgtPmhfcHJvdG8gPSBodG9ucyhsZW4gLSBSWF9NQUNfSEVBREVSX0xFTkdUSCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIERFQlVHKDMsInJheV9jcyB1bnRyYW5zbGF0ZSBSRkMgZGVmYXVsdFxuIik7CisgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gUlhfTUFDX0hFQURFUl9MRU5HVEggKyAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc25hcGhkcl90KSAtIEVUSF9ITEVOOworICAgICAgICAgICAgICAgICAgICBwZXRoID0gKHN0cnVjdCBldGhoZHIgKikoc2tiLT5kYXRhICsgZGVsdGEpOworICAgICAgICAgICAgICAgICAgICBwZXRoLT5oX3Byb3RvID0gdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJyYXlfY3MgdW50cmFuc2xhdGUgdmVyeSBjb25mdXNlZCBieSBwYWNrZXRcbiIpOworICAgICAgICAgICAgICAgIGRlbHRhID0gUlhfTUFDX0hFQURFUl9MRU5HVEggLSBFVEhfSExFTjsKKyAgICAgICAgICAgICAgICBwZXRoID0gKHN0cnVjdCBldGhoZHIgKikoc2tiLT5kYXRhICsgZGVsdGEpOworICAgICAgICAgICAgICAgIHBldGgtPmhfcHJvdG8gPSB0eXBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorLyogVEJEIHJlc2VydmUgIHNrYl9yZXNlcnZlKHNrYiwgZGVsdGEpOyAqLworICAgIHNrYl9wdWxsKHNrYiwgZGVsdGEpOworICAgIERFQlVHKDMsInVudHJhbnNsYXRlIGFmdGVyIHNrYl9wdWxsKCVkKSwgc2tiLT5kYXRhID0gJXBcbiIsZGVsdGEsc2tiLT5kYXRhKTsKKyAgICBtZW1jcHkocGV0aC0+aF9kZXN0LCBkZXN0YWRkciwgQUREUkxFTik7CisgICAgbWVtY3B5KHBldGgtPmhfc291cmNlLCBzcmNhZGRyLCBBRERSTEVOKTsKKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgICBpZiAocGNfZGVidWcgPiAzKSB7CisgICAgaW50IGk7CisgICAgcHJpbnRrKEtFUk5fREVCVUcgInNrYi0+ZGF0YSBhZnRlciB1bnRyYW5zbGF0ZToiKTsKKyAgICBmb3IgKGk9MDtpPDY0O2krKykKKyAgICAgICAgcHJpbnRrKCIlMDJ4ICIsc2tiLT5kYXRhW2ldKTsKKyAgICBwcmludGsoIlxuIik7CisgICAgfQorI2VuZGlmCit9IC8qIGVuZCB1bnRyYW5zbGF0ZSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogQ29weSBkYXRhIGZyb20gY2lyY3VsYXIgcmVjZWl2ZSBidWZmZXIgdG8gUEMgbWVtb3J5LgorICogZGVzdCAgICAgPSBkZXN0aW5hdGlvbiBhZGRyZXNzIGluIFBDIG1lbW9yeQorICogcGt0X2FkZHIgPSBzb3VyY2UgYWRkcmVzcyBpbiByZWNlaXZlIGJ1ZmZlcgorICogbGVuICAgICAgPSBsZW5ndGggb2YgcGFja2V0IHRvIGNvcHkKKyAqLworc3RhdGljIGludCBjb3B5X2Zyb21fcnhfYnVmZihyYXlfZGV2X3QgKmxvY2FsLCBVQ0hBUiAqZGVzdCwgaW50IHBrdF9hZGRyLCBpbnQgbGVuZ3RoKQoreworICAgIGludCB3cmFwX2J5dGVzID0gKHBrdF9hZGRyICsgbGVuZ3RoKSAtIChSWF9CVUZGX0VORCArIDEpOworICAgIGlmICh3cmFwX2J5dGVzIDw9IDApCisgICAgeworICAgICAgICBtZW1jcHlfZnJvbWlvKGRlc3QsbG9jYWwtPnJtZW0gKyBwa3RfYWRkcixsZW5ndGgpOworICAgIH0KKyAgICBlbHNlIC8qIFBhY2tldCB3cmFwcGVkIGluIGNpcmN1bGFyIGJ1ZmZlciAqLworICAgIHsKKyAgICAgICAgbWVtY3B5X2Zyb21pbyhkZXN0LGxvY2FsLT5ybWVtK3BrdF9hZGRyLGxlbmd0aCAtIHdyYXBfYnl0ZXMpOworICAgICAgICBtZW1jcHlfZnJvbWlvKGRlc3QgKyBsZW5ndGggLSB3cmFwX2J5dGVzLCBsb2NhbC0+cm1lbSwgd3JhcF9ieXRlcyk7CisgICAgfQorICAgIHJldHVybiBsZW5ndGg7Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCByZWxlYXNlX2ZyYWdfY2hhaW4ocmF5X2Rldl90ICpsb2NhbCwgc3RydWN0IHJjcyBfX2lvbWVtICogcHJjcykKK3sKKyAgICBzdHJ1Y3QgcmNzIF9faW9tZW0gKnByY3NsaW5rID0gcHJjczsKKyAgICBpbnQgdG1wID0gMTc7CisgICAgdW5zaWduZWQgcmNzaW5kZXggPSByZWFkYigmcHJjcy0+dmFyLnJ4X3BhY2tldC5uZXh0X2ZyYWdfcmNzX2luZGV4KTsKKworICAgIHdoaWxlICh0bXAtLSkgeworICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmcHJjc2xpbmstPmJ1ZmZlcl9zdGF0dXMpOworICAgICAgICBpZiAocmNzaW5kZXggPj0gKE5VTUJFUl9PRl9DQ1MgKyBOVU1CRVJfT0ZfUkNTKSkgeworICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCBiYWQgcmNzaW5kZXggPSAweCV4XG4iLHJjc2luZGV4KTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgIAorICAgICAgICB9ICAgCisgICAgICAgIHByY3NsaW5rID0gcmNzX2Jhc2UobG9jYWwpICsgcmNzaW5kZXg7CisgICAgICAgIHJjc2luZGV4ID0gcmVhZGIoJnByY3NsaW5rLT52YXIucnhfcGFja2V0Lm5leHRfZnJhZ19yY3NfaW5kZXgpOworICAgIH0KKyAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmcHJjc2xpbmstPmJ1ZmZlcl9zdGF0dXMpOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgYXV0aGVudGljYXRlKHJheV9kZXZfdCAqbG9jYWwpCit7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisgICAgREVCVUcoMCwicmF5X2NzIFN0YXJ0aW5nIGF1dGhlbnRpY2F0aW9uLlxuIik7CisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2NzIGF1dGhlbnRpY2F0ZSAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkZWxfdGltZXIoJmxvY2FsLT50aW1lcik7CisgICAgaWYgKGJ1aWxkX2F1dGhfZnJhbWUobG9jYWwsIGxvY2FsLT5ic3NfaWQsIE9QRU5fQVVUSF9SRVFVRVNUKSkgeworICAgICAgICBsb2NhbC0+dGltZXIuZnVuY3Rpb24gPSAmam9pbl9uZXQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBsb2NhbC0+dGltZXIuZnVuY3Rpb24gPSAmYXV0aGVudGljYXRlX3RpbWVvdXQ7CisgICAgfQorICAgIGxvY2FsLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaKjI7CisgICAgbG9jYWwtPnRpbWVyLmRhdGEgPSAobG9uZylsb2NhbDsKKyAgICBhZGRfdGltZXIoJmxvY2FsLT50aW1lcik7CisgICAgbG9jYWwtPmF1dGhlbnRpY2F0aW9uX3N0YXRlID0gQVdBSVRJTkdfUkVTUE9OU0U7Cit9IC8qIGVuZCBhdXRoZW50aWNhdGUgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIHJ4X2F1dGhlbnRpY2F0ZShyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgcmNzIF9faW9tZW0gKnByY3MsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGt0X2FkZHIsIGludCByeF9sZW4pCit7CisgICAgVUNIQVIgYnVmZlsyNTZdOworICAgIHN0cnVjdCByeF9tc2cgKm1zZyA9IChzdHJ1Y3QgcnhfbXNnICopYnVmZjsKKyAgICAKKyAgICBkZWxfdGltZXIoJmxvY2FsLT50aW1lcik7CisKKyAgICBjb3B5X2Zyb21fcnhfYnVmZihsb2NhbCwgYnVmZiwgcGt0X2FkZHIsIHJ4X2xlbiAmIDB4ZmYpOworICAgIC8qIGlmIHdlIGFyZSB0cnlpbmcgdG8gZ2V0IGF1dGhlbnRpY2F0ZWQgKi8KKyAgICBpZiAobG9jYWwtPnNwYXJtLmI0LmFfbmV0d29ya190eXBlID09IEFESE9DKSB7CisgICAgICAgIERFQlVHKDEsInJheV9jcyByeF9hdXRoIHZhcj0gJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIG1zZy0+dmFyWzBdLG1zZy0+dmFyWzFdLG1zZy0+dmFyWzJdLG1zZy0+dmFyWzNdLG1zZy0+dmFyWzRdLG1zZy0+dmFyWzVdKTsKKyAgICAgICAgaWYgKG1zZy0+dmFyWzJdID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoMCwicmF5X2NzIFNlbmRpbmcgYXV0aGVudGljYXRpb24gcmVzcG9uc2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFidWlsZF9hdXRoX2ZyYW1lIChsb2NhbCwgbXNnLT5tYWMuYWRkcl8yLCBPUEVOX0FVVEhfUkVTUE9OU0UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC0+YXV0aGVudGljYXRpb25fc3RhdGUgPSBORUVEX1RPX0FVVEg7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkobG9jYWwtPmF1dGhfaWQsIG1zZy0+bWFjLmFkZHJfMiwgQUREUkxFTik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIEluZnJhc3RydWN0dXJlIG5ldHdvcmsgKi8KKyAgICB7CisgICAgICAgIGlmIChsb2NhbC0+YXV0aGVudGljYXRpb25fc3RhdGUgPT0gQVdBSVRJTkdfUkVTUE9OU0UpIHsKKyAgICAgICAgICAgIC8qIFZlcmlmeSBhdXRoZW50aWNhdGlvbiBzZXF1ZW5jZSAjMiBhbmQgc3VjY2VzcyAqLworICAgICAgICAgICAgaWYgKG1zZy0+dmFyWzJdID09IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoKG1zZy0+dmFyWzNdIHwgbXNnLT52YXJbNF0pID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoMSwiQXV0aGVudGljYXRpb24gc3VjY2Vzc2Z1bFxuIik7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfQVVUSF9DT01QTEVURTsKKyAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlKGxvY2FsKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWwtPmF1dGhlbnRpY2F0aW9uX3N0YXRlID0gQVVUSEVOVElDQVRFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIERFQlVHKDAsIkF1dGhlbnRpY2F0aW9uIHJlZnVzZWRcbiIpOworICAgICAgICAgICAgICAgICAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0FVVEhfUkVGVVNFRDsKKyAgICAgICAgICAgICAgICAgICAgam9pbl9uZXQoKHVfbG9uZylsb2NhbCk7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsLT5hdXRoZW50aWNhdGlvbl9zdGF0ZSA9IFVOQVVUSEVOVElDQVRFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30gLyogZW5kIHJ4X2F1dGhlbnRpY2F0ZSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgYXNzb2NpYXRlKHJheV9kZXZfdCAqbG9jYWwpCit7CisgICAgc3RydWN0IGNjcyBfX2lvbWVtICpwY2NzOworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGludCBjY3NpbmRleDsKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygyLCJyYXlfY3MgYXNzb2NpYXRlIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBJZiBubyB0eCBidWZmZXJzIGF2YWlsYWJsZSwgcmV0dXJuKi8KKyAgICBpZiAoKGNjc2luZGV4ID0gZ2V0X2ZyZWVfY2NzKGxvY2FsKSkgPCAwKQorICAgIHsKKy8qIFRCRCBzaG91bGQgbmV2ZXIgYmUgaGVyZSBidXQuLi4gd2hhdCBpZiB3ZSBhcmU/ICovCisgICAgICAgIERFQlVHKDEsInJheV9jcyBhc3NvY2lhdGUgLSBObyBmcmVlIGNjc1xuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgREVCVUcoMSwicmF5X2NzIFN0YXJ0aW5nIGFzc29jaWF0aW9uIHdpdGggYWNjZXNzIHBvaW50XG4iKTsKKyAgICBwY2NzID0gY2NzX2Jhc2UobG9jYWwpICsgY2NzaW5kZXg7CisgICAgLyogZmlsbCBpbiB0aGUgQ0NTICovCisgICAgd3JpdGViKENDU19TVEFSVF9BU1NPQ0lBVElPTiwgJnBjY3MtPmNtZCk7CisgICAgLyogSW50ZXJydXB0IHRoZSBmaXJtd2FyZSB0byBwcm9jZXNzIHRoZSBjb21tYW5kICovCisgICAgaWYgKGludGVycnVwdF9lY2YobG9jYWwsIGNjc2luZGV4KSkgeworICAgICAgICBERUJVRygxLCJyYXlfY3MgYXNzb2NpYXRlIGZhaWxlZCAtIEVDRiBub3QgcmVhZHkgZm9yIGludHJcbiIpOworICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmKHBjY3MrKyktPmJ1ZmZlcl9zdGF0dXMpOworCisgICAgICAgIGRlbF90aW1lcigmbG9jYWwtPnRpbWVyKTsKKyAgICAgICAgbG9jYWwtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFoqMjsKKyAgICAgICAgbG9jYWwtPnRpbWVyLmRhdGEgPSAobG9uZylsb2NhbDsKKyAgICAgICAgbG9jYWwtPnRpbWVyLmZ1bmN0aW9uID0gJmpvaW5fbmV0OworICAgICAgICBhZGRfdGltZXIoJmxvY2FsLT50aW1lcik7CisgICAgICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfQVNTT0NfRkFJTEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghc25pZmZlcikgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworfSAvKiBlbmQgYXNzb2NpYXRlICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCByeF9kZWF1dGhlbnRpY2F0ZShyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgcmNzIF9faW9tZW0gKnByY3MsIAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGt0X2FkZHIsIGludCByeF9sZW4pCit7CisvKiAgVUNIQVIgYnVmZlsyNTZdOworICAgIHN0cnVjdCByeF9tc2cgKm1zZyA9IChzdHJ1Y3QgcnhfbXNnICopYnVmZjsKKyovCisgICAgREVCVUcoMCwiRGVhdXRoZW50aWNhdGlvbiBmcmFtZSByZWNlaXZlZFxuIik7CisgICAgbG9jYWwtPmF1dGhlbnRpY2F0aW9uX3N0YXRlID0gVU5BVVRIRU5USUNBVEVEOworICAgIC8qIE5lZWQgdG8gcmVhdXRoZW50aWNhdGUgb3IgcmVqb2luIGRlcGVuZGluZyBvbiByZWFzb24gY29kZSAqLworLyogIGNvcHlfZnJvbV9yeF9idWZmKGxvY2FsLCBidWZmLCBwa3RfYWRkciwgcnhfbGVuICYgMHhmZik7CisgKi8KK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIGNsZWFyX2ludGVycnVwdChyYXlfZGV2X3QgKmxvY2FsKQoreworICAgIHdyaXRlYigwLCBsb2NhbC0+YW1lbSArIENJU19PRkZTRVQgKyBIQ1NfSU5UUl9PRkZTRVQpOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisjZGVmaW5lIE1BWERBVEEgKFBBR0VfU0laRSAtIDgwKQorCitzdGF0aWMgY2hhciAqY2FyZF9zdGF0dXNbXSA9IHsKKyAgICAiQ2FyZCBpbnNlcnRlZCAtIHVuaW5pdGlhbGl6ZWQiLCAgICAgLyogMCAqLworICAgICJDYXJkIG5vdCBkb3dubG9hZGVkIiwgICAgICAgICAgICAgICAvKiAxICovCisgICAgIldhaXRpbmcgZm9yIGRvd25sb2FkIHBhcmFtZXRlcnMiLCAgIC8qIDIgKi8KKyAgICAiQ2FyZCBkb2luZyBhY3F1aXNpdGlvbiIsICAgICAgICAgICAgLyogMyAqLworICAgICJBY3F1aXNpdGlvbiBjb21wbGV0ZSIsICAgICAgICAgICAgICAvKiA0ICovCisgICAgIkF1dGhlbnRpY2F0aW9uIGNvbXBsZXRlIiwgICAgICAgICAgIC8qIDUgKi8KKyAgICAiQXNzb2NpYXRpb24gY29tcGxldGUiLCAgICAgICAgICAgICAgLyogNiAqLworICAgICI/Pz8iLCAiPz8/IiwgIj8/PyIsICI/Pz8iLCAgICAgICAgICAvKiA3IDggOSAxMCB1bmRlZmluZWQgKi8KKyAgICAiQ2FyZCBpbml0IGVycm9yIiwgICAgICAgICAgICAgICAgICAgLyogMTEgKi8KKyAgICAiRG93bmxvYWQgcGFyYW1ldGVycyBlcnJvciIsICAgICAgICAgLyogMTIgKi8KKyAgICAiPz8/IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTMgKi8KKyAgICAiQWNxdWlzaXRpb24gZmFpbGVkIiwgICAgICAgICAgICAgICAgLyogMTQgKi8KKyAgICAiQXV0aGVudGljYXRpb24gcmVmdXNlZCIsICAgICAgICAgICAgLyogMTUgKi8KKyAgICAiQXNzb2NpYXRpb24gZmFpbGVkIiAgICAgICAgICAgICAgICAgLyogMTYgKi8KK307CisKK3N0YXRpYyBjaGFyICpuZXR0eXBlW10gPSB7IkFkaG9jIiwgIkluZnJhICJ9Oworc3RhdGljIGNoYXIgKmZyYW1pbmdbXSA9IHsiRW5jYXBzdWxhdGlvbiIsICJUcmFuc2xhdGlvbiJ9Cis7CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHJheV9jc19wcm9jX3JlYWQoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbikKK3sKKy8qIFByaW50IGN1cnJlbnQgdmFsdWVzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHZpYSBvdGhlciBtZWFucworICogZWcgaWZjb25maWcgCisgKi8KKyAgICBpbnQgaTsKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgcmF5X2Rldl90ICpsb2NhbDsKKyAgICBVQ0hBUiAqcDsKKyAgICBzdHJ1Y3QgZnJlcV9ob3BfZWxlbWVudCAqcGZoOworICAgIFVDSEFSIGNbMzNdOworCisgICAgbGluayA9IGRldl9saXN0OworICAgIGlmICghbGluaykKKyAgICAJcmV0dXJuIDA7CisgICAgZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopbGluay0+cHJpdjsKKyAgICBpZiAoIWRldikKKyAgICAJcmV0dXJuIDA7CisgICAgbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworICAgIGlmICghbG9jYWwpCisgICAgCXJldHVybiAwOworCisgICAgbGVuID0gMDsKKworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlJheWxpbmsgV2lyZWxlc3MgTEFOIGRyaXZlciBzdGF0dXNcbiIpOworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVzXG4iLCByY3NpZCk7CisgICAgLyogYnVpbGQgNCBkb2VzIG5vdCByZXBvcnQgdmVyc2lvbiwgYW5kIGZpZWxkIGlzIDB4NTUgYWZ0ZXIgbWVtdGVzdCAqLworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkZpcm13YXJlIHZlcnNpb24gICAgID0gIik7CisgICAgaWYgKGxvY2FsLT5md192ZXIgPT0gMHg1NSkKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiNCAtIFVzZSBkdW1wX2NpcyBmb3IgbW9yZSBkZXRhaWxzXG4iKTsKKyAgICBlbHNlCisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiUyZC4lMDJkLiUwMmRcbiIsCisgICAgICAgICAgICAgICAgICAgbG9jYWwtPmZ3X3ZlciwgbG9jYWwtPmZ3X2JsZCwgbG9jYWwtPmZ3X3Zhcik7CisKKyAgICBmb3IgKGk9MDsgaTwzMjsgaSsrKSBjW2ldID0gbG9jYWwtPnNwYXJtLmI1LmFfY3VycmVudF9lc3NfaWRbaV07CisgICAgY1szMl0gPSAwOworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVzIG5ldHdvcmsgRVNTSUQgPSBcIiVzXCJcbiIsIAorICAgICAgICAgICAgICAgICAgIG5ldHR5cGVbbG9jYWwtPnNwYXJtLmI1LmFfbmV0d29ya190eXBlXSwgYyk7CisKKyAgICBwID0gbG9jYWwtPmJzc19pZDsKKyAgICBsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sIAorICAgICAgICAgICAgICAgICAgICJCU1NJRCAgICAgICAgICAgICAgICA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgIHBbMF0scFsxXSxwWzJdLHBbM10scFs0XSxwWzVdKTsKKworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkNvdW50cnkgY29kZSAgICAgICAgID0gJWRcbiIsIAorICAgICAgICAgICAgICAgICAgIGxvY2FsLT5zcGFybS5iNS5hX2N1cnJfY291bnRyeV9jb2RlKTsKKworICAgIGkgPSBsb2NhbC0+Y2FyZF9zdGF0dXM7CisgICAgaWYgKGkgPCAwKSBpID0gMTA7CisgICAgaWYgKGkgPiAxNikgaSA9IDEwOworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkNhcmQgc3RhdHVzICAgICAgICAgID0gJXNcbiIsIGNhcmRfc3RhdHVzW2ldKTsKKworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkZyYW1pbmcgbW9kZSAgICAgICAgID0gJXNcbiIsZnJhbWluZ1t0cmFuc2xhdGVdKTsKKworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkxhc3QgcGt0IHNpZ25hbCBsdmwgID0gJWRcbiIsIGxvY2FsLT5sYXN0X3JzbCk7CisKKyAgICBpZiAobG9jYWwtPmJlYWNvbl9yeGVkKSB7CisJLyogUHVsbCBzb21lIGZpZWxkcyBvdXQgb2YgbGFzdCBiZWFjb24gcmVjZWl2ZWQgKi8KKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJCZWFjb24gSW50ZXJ2YWwgICAgICA9ICVkIEt1c1xuIiwgCisJCSAgICAgICBsb2NhbC0+bGFzdF9iY24uYmVhY29uX2ludHZsWzBdCisJCSAgICAgICArIDI1NiAqIGxvY2FsLT5sYXN0X2Jjbi5iZWFjb25faW50dmxbMV0pOworICAgIAorICAgIHAgPSBsb2NhbC0+bGFzdF9iY24uZWxlbWVudHM7CisgICAgaWYgKHBbMF0gPT0gQ19FU1NJRF9FTEVNRU5UX0lEKSBwICs9IHBbMV0gKyAyOworICAgIGVsc2UgeworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJQYXJzZSBiZWFjb24gZmFpbGVkIGF0IGVzc2lkIGVsZW1lbnQgaWQgPSAlZFxuIixwWzBdKTsKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisKKyAgICBpZiAocFswXSA9PSBDX1NVUFBPUlRFRF9SQVRFU19FTEVNRU5UX0lEKSB7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlN1cHBvcnRlZCByYXRlIGNvZGVzID0gIik7CisgICAgICAgIGZvciAoaT0yOyBpPHBbMV0gKyAyOyBpKyspIAorICAgICAgICAgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiMHglMDJ4ICIsIHBbaV0pOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcbiIpOworICAgICAgICBwICs9IHBbMV0gKyAyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiUGFyc2UgYmVhY29uIGZhaWxlZCBhdCByYXRlcyBlbGVtZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisKKwlpZiAocFswXSA9PSBDX0ZIX1BBUkFNX1NFVF9FTEVNRU5UX0lEKSB7CisJICAgIHBmaCA9IChzdHJ1Y3QgZnJlcV9ob3BfZWxlbWVudCAqKXA7CisJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkhvcCBkd2VsbCAgICAgICAgICAgID0gJWQgS3VzXG4iLAorCQkJICAgcGZoLT5kd2VsbF90aW1lWzBdICsgMjU2ICogcGZoLT5kd2VsbF90aW1lWzFdKTsKKwkgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiSG9wIHNldCAgICAgICAgICAgICAgPSAlZCBcbiIsIHBmaC0+aG9wX3NldCk7CisJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkhvcCBwYXR0ZXJuICAgICAgICAgID0gJWQgXG4iLCBwZmgtPmhvcF9wYXR0ZXJuKTsKKwkgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiSG9wIGluZGV4ICAgICAgICAgICAgPSAlZCBcbiIsIHBmaC0+aG9wX2luZGV4KTsKKwkgICAgcCArPSBwWzFdICsgMjsKKwl9CisJZWxzZSB7CisJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlBhcnNlIGJlYWNvbiBmYWlsZWQgYXQgRkggcGFyYW0gZWxlbWVudFxuIik7CisJICAgIHJldHVybiBsZW47CisJfQorICAgIH0gZWxzZSB7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiTm8gYmVhY29ucyByZWNlaXZlZFxuIik7CisgICAgfQorICAgIHJldHVybiBsZW47Cit9CisKKyNlbmRpZgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCBidWlsZF9hdXRoX2ZyYW1lKHJheV9kZXZfdCAqbG9jYWwsIFVDSEFSICpkZXN0LCBpbnQgYXV0aF90eXBlKQoreworICAgIGludCBhZGRyOworICAgIHN0cnVjdCBjY3MgX19pb21lbSAqcGNjczsKKyAgICBzdHJ1Y3QgdHhfbXNnIF9faW9tZW0gKnB0eDsKKyAgICBpbnQgY2NzaW5kZXg7CisKKyAgICAvKiBJZiBubyB0eCBidWZmZXJzIGF2YWlsYWJsZSwgcmV0dXJuICovCisgICAgaWYgKChjY3NpbmRleCA9IGdldF9mcmVlX3R4X2Njcyhsb2NhbCkpIDwgMCkKKyAgICB7CisgICAgICAgIERFQlVHKDEsInJheV9jcyBzZW5kIGF1dGhlbnRpY2F0ZSAtIE5vIGZyZWUgdHggY2NzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHBjY3MgPSBjY3NfYmFzZShsb2NhbCkgKyBjY3NpbmRleDsKKworICAgIC8qIEFkZHJlc3MgaW4gY2FyZCBzcGFjZSAqLworICAgIGFkZHIgPSBUWF9CVUZfQkFTRSArIChjY3NpbmRleCA8PCAxMSk7CisgICAgLyogZmlsbCBpbiB0aGUgQ0NTICovCisgICAgd3JpdGViKENDU19UWF9SRVFVRVNULCAmcGNjcy0+Y21kKTsKKyAgICB3cml0ZWIoYWRkciA+PiA4LCBwY2NzLT52YXIudHhfcmVxdWVzdC50eF9kYXRhX3B0cik7CisgICAgd3JpdGViKDB4MjAsIHBjY3MtPnZhci50eF9yZXF1ZXN0LnR4X2RhdGFfcHRyICsgMSk7CisgICAgd3JpdGViKFRYX0FVVEhFTlRJQ0FURV9MRU5HVEhfTVNCLCBwY2NzLT52YXIudHhfcmVxdWVzdC50eF9kYXRhX2xlbmd0aCk7CisgICAgd3JpdGViKFRYX0FVVEhFTlRJQ0FURV9MRU5HVEhfTFNCLHBjY3MtPnZhci50eF9yZXF1ZXN0LnR4X2RhdGFfbGVuZ3RoICsgMSk7CisgICAgd3JpdGViKDAsICZwY2NzLT52YXIudHhfcmVxdWVzdC5wb3dfc2F2X21vZGUpOworCisgICAgcHR4ID0gbG9jYWwtPnNyYW0gKyBhZGRyOworICAgIC8qIGZpbGwgaW4gdGhlIG1hYyBoZWFkZXIgKi8KKyAgICB3cml0ZWIoUFJPVE9DT0xfVkVSIHwgQVVUSEVOVElDX1RZUEUsICZwdHgtPm1hYy5mcmFtZV9jdGxfMSk7CisgICAgd3JpdGViKDAsICZwdHgtPm1hYy5mcmFtZV9jdGxfMik7CisKKyAgICBtZW1jcHlfdG9pbyhwdHgtPm1hYy5hZGRyXzEsIGRlc3QsIEFERFJMRU4pOworICAgIG1lbWNweV90b2lvKHB0eC0+bWFjLmFkZHJfMiwgbG9jYWwtPnNwYXJtLmI0LmFfbWFjX2FkZHIsIEFERFJMRU4pOworICAgIG1lbWNweV90b2lvKHB0eC0+bWFjLmFkZHJfMywgbG9jYWwtPmJzc19pZCwgQUREUkxFTik7CisKKyAgICAvKiBGaWxsIGluIG1zZyBib2R5IHdpdGggcHJvdG9jb2wgMDAgMDAsIHNlcXVlbmNlIDAxIDAwICxzdGF0dXMgMDAgMDAgKi8KKyAgICBtZW1zZXRfaW8ocHR4LT52YXIsIDAsIDYpOworICAgIHdyaXRlYihhdXRoX3R5cGUgJiAweGZmLCBwdHgtPnZhciArIDIpOworCisgICAgLyogSW50ZXJydXB0IHRoZSBmaXJtd2FyZSB0byBwcm9jZXNzIHRoZSBjb21tYW5kICovCisgICAgaWYgKGludGVycnVwdF9lY2YobG9jYWwsIGNjc2luZGV4KSkgeworICAgICAgICBERUJVRygxLCJyYXlfY3Mgc2VuZCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGZhaWxlZCAtIEVDRiBub3QgcmVhZHkgZm9yIGludHJcbiIpOworICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmKHBjY3MrKyktPmJ1ZmZlcl9zdGF0dXMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfSAvKiBFbmQgYnVpbGRfYXV0aF9mcmFtZSAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyB2b2lkIHJheWNzX3dyaXRlKGNvbnN0IGNoYXIgKm5hbWUsIHdyaXRlX3Byb2NfdCAqdywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKiBlbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KG5hbWUsIFNfSUZSRUcgfCBTX0lXVVNSLCBOVUxMKTsKKwlpZiAoZW50cnkpIHsKKwkJZW50cnktPndyaXRlX3Byb2MgPSB3OworCQllbnRyeS0+ZGF0YSA9IGRhdGE7CisJfQorfQorCitzdGF0aWMgaW50IHdyaXRlX2Vzc2lkKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworCXN0YXRpYyBjaGFyIHByb2NfZXNzaWRbMzNdOworCWludCBsZW4gPSBjb3VudDsKKworCWlmIChsZW4gPiAzMikKKwkJbGVuID0gMzI7CisJbWVtc2V0KHByb2NfZXNzaWQsIDAsIDMzKTsKKwlpZiAoY29weV9mcm9tX3VzZXIocHJvY19lc3NpZCwgYnVmZmVyLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwllc3NpZCA9IHByb2NfZXNzaWQ7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHdyaXRlX2ludChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwlzdGF0aWMgY2hhciBwcm9jX251bWJlclsxMF07CisJY2hhciAqcDsKKwlpbnQgbnIsIGxlbjsKKworCWlmICghY291bnQpCisJCXJldHVybiAwOworCisJaWYgKGNvdW50ID4gOSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNvcHlfZnJvbV91c2VyKHByb2NfbnVtYmVyLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcCA9IHByb2NfbnVtYmVyOworCW5yID0gMDsKKwlsZW4gPSBjb3VudDsKKwlkbyB7CisJCXVuc2lnbmVkIGludCBjID0gKnAgLSAnMCc7CisJCWlmIChjID4gOSkKKwkJCXJldHVybiAtRUlOVkFMOworCQluciA9IG5yKjEwICsgYzsKKwkJcCsrOworCX0gd2hpbGUgKC0tbGVuKTsKKwkqKGludCAqKWRhdGEgPSBucjsKKwlyZXR1cm4gY291bnQ7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHJheV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICJyYXlfY3MiLAorCX0sCisJLmF0dGFjaAkJPSByYXlfYXR0YWNoLAorCS5kZXRhY2gJCT0gcmF5X2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcmF5X2NzKHZvaWQpCit7CisgICAgaW50IHJjOworICAgIAorICAgIERFQlVHKDEsICIlc1xuIiwgcmNzaWQpOworICAgIHJjID0gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmcmF5X2RyaXZlcik7CisgICAgREVCVUcoMSwgInJheWxpbmsgaW5pdF9tb2R1bGUgcmVnaXN0ZXJfcGNtY2lhX2RyaXZlciByZXR1cm5zIDB4JXhcbiIscmMpOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKyAgICBwcm9jX21rZGlyKCJkcml2ZXIvcmF5X2NzIiwgTlVMTCk7CisKKyAgICBjcmVhdGVfcHJvY19pbmZvX2VudHJ5KCJkcml2ZXIvcmF5X2NzL3JheV9jcyIsIDAsIE5VTEwsICZyYXlfY3NfcHJvY19yZWFkKTsKKyAgICByYXljc193cml0ZSgiZHJpdmVyL3JheV9jcy9lc3NpZCIsIHdyaXRlX2Vzc2lkLCBOVUxMKTsKKyAgICByYXljc193cml0ZSgiZHJpdmVyL3JheV9jcy9uZXRfdHlwZSIsIHdyaXRlX2ludCwgJm5ldF90eXBlKTsKKyAgICByYXljc193cml0ZSgiZHJpdmVyL3JheV9jcy90cmFuc2xhdGUiLCB3cml0ZV9pbnQsICZ0cmFuc2xhdGUpOworI2VuZGlmCisgICAgaWYgKHRyYW5zbGF0ZSAhPSAwKSB0cmFuc2xhdGUgPSAxOworICAgIHJldHVybiAwOworfSAvKiBpbml0X3JheV9jcyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3JheV9jcyh2b2lkKQoreworICAgIERFQlVHKDAsICJyYXlfY3M6IGNsZWFudXBfbW9kdWxlXG4iKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisgICAgcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlci9yYXlfY3MvcmF5X2NzIiwgTlVMTCk7CisgICAgcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlci9yYXlfY3MvZXNzaWQiLCBOVUxMKTsKKyAgICByZW1vdmVfcHJvY19lbnRyeSgiZHJpdmVyL3JheV9jcy9uZXRfdHlwZSIsIE5VTEwpOworICAgIHJlbW92ZV9wcm9jX2VudHJ5KCJkcml2ZXIvcmF5X2NzL3RyYW5zbGF0ZSIsIE5VTEwpOworICAgIHJlbW92ZV9wcm9jX2VudHJ5KCJkcml2ZXIvcmF5X2NzIiwgTlVMTCk7CisjZW5kaWYKKworICAgIHBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmcmF5X2RyaXZlcik7CisgICAgQlVHX09OKGRldl9saXN0ICE9IE5VTEwpOworfSAvKiBleGl0X3JheV9jcyAqLworCittb2R1bGVfaW5pdChpbml0X3JheV9jcyk7Cittb2R1bGVfZXhpdChleGl0X3JheV9jcyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc3YWZhMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5oCkBAIC0wLDAgKzEsNzggQEAKKy8qIFJheXRoZW9uIHdpcmVsZXNzIExBTiBQQ01DSUEgY2FyZCBkcml2ZXIgZm9yIExpbnV4IAorICAgQSAgUENNQ0lBIGNsaWVudCBkcml2ZXIgZm9yIHRoZSBSYXlsaW5rIHdpcmVsZXNzIG5ldHdvcmsgY2FyZAorICAgV3JpdHRlbiBieSBDb3JleSBUaG9tYXMKKyovCisKKyNpZm5kZWYgUkFZTElOS19ICisKK3N0cnVjdCBiZWFjb25fcnggeworICAgIHN0cnVjdCBtYWNfaGVhZGVyIG1hYzsKKyAgICBVQ0hBUiB0aW1lc3RhbXBbOF07CisgICAgVUNIQVIgYmVhY29uX2ludHZsWzJdOworICAgIFVDSEFSIGNhcGFiaWxpdHlbMl07CisgICAgVUNIQVIgZWxlbWVudHNbc2l6ZW9mKHN0cnVjdCBlc3NpZF9lbGVtZW50KSAKKyAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHN0cnVjdCByYXRlc19lbGVtZW50KQorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IGZyZXFfaG9wX2VsZW1lbnQpIAorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IGphcGFuX2NhbGxfc2lnbl9lbGVtZW50KQorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IHRpbV9lbGVtZW50KV07Cit9OworCisvKiBSZXR1cm4gdmFsdWVzIGZvciBnZXRfZnJlZXssX3R4fV9jY3MgKi8KKyNkZWZpbmUgRUNDU0ZVTEwgICgtMSkKKyNkZWZpbmUgRUNDU0JVU1kgICgtMikKKyNkZWZpbmUgRUNBUkRHT05FICgtMykKKwordHlwZWRlZiBzdHJ1Y3QgcmF5X2Rldl90IHsKKyAgICBpbnQgY2FyZF9zdGF0dXM7CisgICAgaW50IGF1dGhlbnRpY2F0aW9uX3N0YXRlOworICAgIGRldl9ub2RlX3QgIG5vZGU7CisgICAgd2luZG93X2hhbmRsZV90IGFtZW1faGFuZGxlOyAgIC8qIGhhbmRsZSB0byB3aW5kb3cgZm9yIGF0dHJpYnV0ZSBtZW1vcnkgICovCisgICAgd2luZG93X2hhbmRsZV90IHJtZW1faGFuZGxlOyAgIC8qIGhhbmRsZSB0byB3aW5kb3cgZm9yIHJ4IGJ1ZmZlciBvbiBjYXJkICovCisgICAgdm9pZCBfX2lvbWVtICpzcmFtOyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYmVnaW5uaW5nIG9mIHNoYXJlZCBSQU0gICAgICovCisgICAgdm9pZCBfX2lvbWVtICphbWVtOyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYXR0cmlidXRlIG1lbSB3aW5kb3cgICAgICAgICovCisgICAgdm9pZCBfX2lvbWVtICpybWVtOyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gcmVjZWl2ZSBidWZmZXIgd2luZG93ICAgICAgICovCisgICAgZGV2X2xpbmtfdCAqZmluZGVyOyAgICAgICAgICAgIC8qIHBvaW50ZXIgYmFjayB0byBkZXZfbGlua190IGZvciBjYXJkICAgICovCisgICAgc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisgICAgbG9uZyB0eF9jY3NfbG9jazsKKyAgICBsb25nIGNjc19sb2NrOworICAgIGludCAgIGRsX3BhcmFtX2NjczsKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCBiNF9zdGFydHVwX3BhcmFtcyBiNDsKKyAgICAgICAgc3RydWN0IGI1X3N0YXJ0dXBfcGFyYW1zIGI1OworICAgIH0gc3Bhcm07CisgICAgaW50IHRpbWVvdXRfZmxhZzsKKyAgICBVQ0hBUiBzdXBwb3J0ZWRfcmF0ZXNbOF07CisgICAgVUNIQVIgamFwYW5fY2FsbF9zaWduWzEyXTsKKyAgICBzdHJ1Y3Qgc3RhcnR1cF9yZXNfNiBzdGFydHVwX3JlczsKKyAgICBpbnQgbnVtX211bHRpOworICAgIC8qIE5ldHdvcmsgcGFyYW1ldGVycyBmcm9tIHN0YXJ0L2pvaW4gKi8KKyAgICBVQ0hBUiBic3NfaWRbNl07CisgICAgVUNIQVIgYXV0aF9pZFs2XTsKKyAgICBVQ0hBUiBuZXRfZGVmYXVsdF90eF9yYXRlOworICAgIFVDSEFSIGVuY3J5cHRpb247CisgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisKKyAgICBVQ0hBUiBuZXRfdHlwZTsKKyAgICBVQ0hBUiBzdGFfdHlwZTsKKyAgICBVQ0hBUiBmd192ZXI7CisgICAgVUNIQVIgZndfYmxkOworICAgIFVDSEFSIGZ3X3ZhcjsKKyAgICBVQ0hBUiBBU0lDX3ZlcnNpb247CisgICAgVUNIQVIgYXNzb2NfaWRbMl07CisgICAgVUNIQVIgdGliX2xlbmd0aDsKKyAgICBVQ0hBUiBsYXN0X3JzbDsKKyAgICBpbnQgYmVhY29uX3J4ZWQ7CisgICAgc3RydWN0IGJlYWNvbl9yeCBsYXN0X2JjbjsKKyNpZmRlZiBXSVJFTEVTU19FWFQKKyAgICBpd19zdGF0cwl3c3RhdHM7CQkvKiBXaXJlbGVzcyBzcGVjaWZpYyBzdGF0cyAqLworI2VuZGlmCisjaWZkZWYgV0lSRUxFU1NfU1BZCisgICAgaW50CQlzcHlfbnVtYmVyOwkJLyogTnVtYmVyIG9mIGFkZHJlc3NlcyB0byBzcHkgKi8KKyAgICBtYWNfYWRkcglzcHlfYWRkcmVzc1tJV19NQVhfU1BZICsgMV07CS8qIFRoZSBhZGRyZXNzZXMgdG8gc3B5ICovCisgICAgaXdfcXVhbAlzcHlfc3RhdFtJV19NQVhfU1BZICsgMV07CS8qIFN0YXRpc3RpY3MgZ2F0aGVyZWQgKi8KKyNlbmRpZgkvKiBXSVJFTEVTU19TUFkgKi8KKworfSByYXlfZGV2X3Q7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNlbmRpZiAvKiBSQVlMSU5LX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheWN0bC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5Y3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlkOWIyNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheWN0bC5oCkBAIC0wLDAgKzEsNzMyIEBACisjaWZuZGVmIFJBWUxJTktfSAorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUNIQVI7CisKKy8qKioqKiogSUVFRSA4MDIuMTEgY29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQUREUkxFTiAgICAgICAgICAgNgorLyogRnJhbWUgY29udHJvbCAxIGJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgUFJPVE9DT0xfVkVSICAgICAgMHgwMAorI2RlZmluZSBEQVRBX1RZUEUgICAgICAgICAweDA4CisjZGVmaW5lIEFTU09DX1JFUV9UWVBFICAgIDB4MDAKKyNkZWZpbmUgQVNTT0NfUkVTUF9UWVBFICAgMHgxMAorI2RlZmluZSBSRUFTU09DX1JFUV9UWVBFICAweDIwCisjZGVmaW5lIFJFQVNTT0NfUkVTUF9UWVBFIDB4MzAKKyNkZWZpbmUgTlVMTF9NU0dfVFlQRSAgICAgMHg0OAorI2RlZmluZSBCRUFDT05fVFlQRSAgICAgICAweDgwCisjZGVmaW5lIERJU0FTU09DX1RZUEUgICAgIDB4QTAKKyNkZWZpbmUgUFNQT0xMX1RZUEUgICAgICAgMHhBNAorI2RlZmluZSBBVVRIRU5USUNfVFlQRSAgICAweEIwCisjZGVmaW5lIERFQVVUSEVOVElDX1RZUEUgIDB4QzAKKy8qIEZyYW1lIGNvbnRyb2wgMiBiaXQgZmllbGRzICovCisjZGVmaW5lIEZDMl9UT19EUyAgICAgICAgIDB4MDEKKyNkZWZpbmUgRkMyX0ZST01fRFMgICAgICAgMHgwMgorI2RlZmluZSBGQzJfTU9SRV9GUkFHICAgICAweDA0CisjZGVmaW5lIEZDMl9SRVRSWSAgICAgICAgIDB4MDgKKyNkZWZpbmUgRkMyX1BTTSAgICAgICAgICAgMHgxMAorI2RlZmluZSBGQzJfTU9SRV9EQVRBICAgICAweDIwCisjZGVmaW5lIEZDMl9XRVAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgRkMyX09SREVSICAgICAgICAgMHg4MAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogODAyLjExIGVsZW1lbnQgSUQncyBhbmQgbGVuZ3RocyAqLworI2RlZmluZSBDX0JQX0NBUEFCSUxJVFlfRVNTICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQ19CUF9DQVBBQklMSVRZX0lCU1MgICAgICAgICAgICAweDAyCisjZGVmaW5lIENfQlBfQ0FQQUJJTElUWV9DRl9QT0xMQUJMRSAgICAgMHgwNAorI2RlZmluZSBDX0JQX0NBUEFCSUxJVFlfQ0ZfUE9MTF9SRVFVRVNUIDB4MDgKKyNkZWZpbmUgQ19CUF9DQVBBQklMSVRZX1BSSVZBQ1kgICAgICAgICAweDEwCisKKyNkZWZpbmUgQ19FU1NJRF9FTEVNRU5UX0lEICAgICAgICAgICAgICAgMAorI2RlZmluZSBDX0VTU0lEX0VMRU1FTlRfTUFYX0xFTkdUSCAgICAgICAzMgorCisjZGVmaW5lIENfU1VQUE9SVEVEX1JBVEVTX0VMRU1FTlRfSUQgICAgIDEKKyNkZWZpbmUgQ19TVVBQT1JURURfUkFURVNfRUxFTUVOVF9MRU5HVEggMgorCisjZGVmaW5lIENfRkhfUEFSQU1fU0VUX0VMRU1FTlRfSUQgICAgICAgIDIKKyNkZWZpbmUgQ19GSF9QQVJBTV9TRVRfRUxFTUVOVF9MTkdUSCAgICAgNQorCisjZGVmaW5lIENfQ0ZfUEFSQU1fU0VUX0VMRU1FTlRfSUQgICAgICAgIDQKKyNkZWZpbmUgQ19DRl9QQVJBTV9TRVRfRUxFTUVOVF9MTkdUSCAgICAgNgorCisjZGVmaW5lIENfVElNX0VMRU1FTlRfSUQgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQ19USU1fQklUTUFQX0xFTkdUSCAgICAgICAgICAgIDI1MQorI2RlZmluZSBDX1RJTV9CTUNBU1RfQklUICAgICAgICAgICAgICAweDAxCisKKyNkZWZpbmUgQ19JQlNTX0VMRU1FTlRfSUQgICAgICAgICAgICAgICAgNgorI2RlZmluZSBDX0lCU1NfRUxFTUVOVF9MRU5HVEggICAgICAgICAgICAyCisKKyNkZWZpbmUgQ19KQVBBTl9DQUxMX1NJR05fRUxFTUVOVF9JRCAgICA1MQorI2RlZmluZSBDX0pBUEFOX0NBTExfU0lHTl9FTEVNRU5UX0xOR1RIIDEyCisKKyNkZWZpbmUgQ19ESVNBU1NPQ19SRUFTT05fQ09ERV9MRU4gICAgICAgMgorI2RlZmluZSBDX0RJU0FTU09DX1JFQVNPTl9DT0RFX0RFRkFVTFQgICA4CisKKyNkZWZpbmUgQ19DUkNfTEVOICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDX05VTV9TVVBQT1JURURfUkFURVMgICAgICAgICAgICA4IAorLyoqKioqKiBJRUVFIDgwMi4xMSBtYWMgaGVhZGVyIGZvciB0eXBlIGRhdGEgcGFja2V0cyAqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IG1hY19oZWFkZXIgeworICBVQ0hBUiBmcmFtZV9jdGxfMTsgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBVQ0hBUiBmcmFtZV9jdGxfMjsKKyAgVUNIQVIgZHVyYXRpb25fbHNiOworICBVQ0hBUiBkdXJhdGlvbl9tc2I7CisgIFVDSEFSIGFkZHJfMVtBRERSTEVOXTsKKyAgVUNIQVIgYWRkcl8yW0FERFJMRU5dOworICBVQ0hBUiBhZGRyXzNbQUREUkxFTl07CisgIFVDSEFSIHNlcV9mcmFnX251bVsyXTsKKy8qICBVQ0hBUiBhZGRyXzRbQUREUkxFTl07ICovLyogb25seSBwcmVzZW50IGZvciBBUCB0byBBUCAoVE8gRFMgYW5kIEZST00gRFMgKi8KK307CisvKioqKioqIElFRUUgODAyLjExIGZyYW1lIGVsZW1lbnQgc3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgZXNzaWRfZWxlbWVudAoreworICBVQ0hBUiBpZDsKKyAgVUNIQVIgbGVuZ3RoOworICBVQ0hBUiB0ZXh0W0NfRVNTSURfRUxFTUVOVF9NQVhfTEVOR1RIXTsKK307CitzdHJ1Y3QgcmF0ZXNfZWxlbWVudAoreworICBVQ0hBUiBpZDsKKyAgVUNIQVIgbGVuZ3RoOworICBVQ0hBUiB2YWx1ZVs4XTsKK307CitzdHJ1Y3QgZnJlcV9ob3BfZWxlbWVudAoreworICBVQ0hBUiBpZDsKKyAgVUNIQVIgbGVuZ3RoOworICBVQ0hBUiBkd2VsbF90aW1lWzJdOworICBVQ0hBUiBob3Bfc2V0OworICBVQ0hBUiBob3BfcGF0dGVybjsKKyAgVUNIQVIgaG9wX2luZGV4OworfTsKK3N0cnVjdCB0aW1fZWxlbWVudAoreworICBVQ0hBUiBpZDsKKyAgVUNIQVIgbGVuZ3RoOworICBVQ0hBUiBkdGltX2NvdW50OworICBVQ0hBUiBkdGltX3BlcmlvZDsgICAgCisgIFVDSEFSIGJpdG1hcF9jb250cm9sOworICBVQ0hBUiB0aW1bQ19USU1fQklUTUFQX0xFTkdUSF07Cit9Oworc3RydWN0IGlic3NfZWxlbWVudAoreworICBVQ0hBUiBpZDsKKyAgVUNIQVIgbGVuZ3RoOworICBVQ0hBUiBhdGltX3dpbmRvd1syXTsKK307CitzdHJ1Y3QgamFwYW5fY2FsbF9zaWduX2VsZW1lbnQKK3sKKyAgVUNIQVIgaWQ7CisgIFVDSEFSIGxlbmd0aDsKKyAgVUNIQVIgY2FsbF9zaWduWzEyXTsKK307CisvKioqKioqIEJlYWNvbiBtZXNzYWdlIHN0cnVjdHVyZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAuZWxlbWVudHMgaXMgYSBsYXJnZSBsdW1wIG9mIG1heCBzaXplIGJlY2F1c2UgZWxlbWVudHMgYXJlIHZhcmlhYmxlIHNpemUgICovCitzdHJ1Y3QgaW5mcmFfYmVhY29uCit7CisgICAgVUNIQVIgdGltZXN0YW1wWzhdOworICAgIFVDSEFSIGJlYWNvbl9pbnR2bFsyXTsKKyAgICBVQ0hBUiBjYXBhYmlsaXR5WzJdOworICAgIFVDSEFSIGVsZW1lbnRzW3NpemVvZihzdHJ1Y3QgZXNzaWRfZWxlbWVudCkgCisgICAgICAgICAgICAgICAgICArIHNpemVvZihzdHJ1Y3QgcmF0ZXNfZWxlbWVudCkKKyAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHN0cnVjdCBmcmVxX2hvcF9lbGVtZW50KSAKKyAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHN0cnVjdCBqYXBhbl9jYWxsX3NpZ25fZWxlbWVudCkKKyAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHN0cnVjdCB0aW1fZWxlbWVudCldOworfTsKK3N0cnVjdCBhZGhvY19iZWFjb24KK3sKKyAgICBVQ0hBUiB0aW1lc3RhbXBbOF07CisgICAgVUNIQVIgYmVhY29uX2ludHZsWzJdOworICAgIFVDSEFSIGNhcGFiaWxpdHlbMl07CisgICAgVUNIQVIgZWxlbWVudHNbc2l6ZW9mKHN0cnVjdCBlc3NpZF9lbGVtZW50KSAKKyAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHN0cnVjdCByYXRlc19lbGVtZW50KQorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IGZyZXFfaG9wX2VsZW1lbnQpIAorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IGphcGFuX2NhbGxfc2lnbl9lbGVtZW50KQorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IGlic3NfZWxlbWVudCldOworfTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICNkZWZpbmUgQ19NQUNfSERSXzJfV0VQIDB4NDAgKi8KKy8qIFRYL1JYIENDUyBjb25zdGFudHMgKi8KKyNkZWZpbmUgVFhfSEVBREVSX0xFTkdUSCAweDFDCisjZGVmaW5lIFJYX01BQ19IRUFERVJfTEVOR1RIIDB4MTgKKyNkZWZpbmUgVFhfQVVUSEVOVElDQVRFX0xFTkdUSCAoVFhfSEVBREVSX0xFTkdUSCArIDYpCisjZGVmaW5lIFRYX0FVVEhFTlRJQ0FURV9MRU5HVEhfTVNCIChUWF9BVVRIRU5USUNBVEVfTEVOR1RIID4+IDgpCisjZGVmaW5lIFRYX0FVVEhFTlRJQ0FURV9MRU5HVEhfTFNCIChUWF9BVVRIRU5USUNBVEVfTEVOR1RIICYgMHhmZikKKyNkZWZpbmUgVFhfREVBVVRIRU5USUNBVEVfTEVOR1RIIChUWF9IRUFERVJfTEVOR1RIICsgMikKKyNkZWZpbmUgVFhfREVBVVRIRU5USUNBVEVfTEVOR1RIX01TQiAoVFhfQVVUSEVOVElDQVRFX0xFTkdUSCA+PiA4KQorI2RlZmluZSBUWF9ERUFVVEhFTlRJQ0FURV9MRU5HVEhfTFNCIChUWF9BVVRIRU5USUNBVEVfTEVOR1RIICYgMHhmZikKKyNkZWZpbmUgRkNTX0xFTiAgICAgICAgICAgNAorCisjZGVmaW5lIEFESE9DICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElORlJBICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgVFlQRV9TVEEgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVFlQRV9BUCAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBQQVNTSVZFX1NDQU4gICAgICAgICAgMQorI2RlZmluZSBBQ1RJVkVfU0NBTiAgICAgICAgICAgMQorCisjZGVmaW5lIFBTTV9DQU0gICAgICAgICAgICAgICAwCisKKy8qIENvdW50cnkgY29kZXMgKi8KKyNkZWZpbmUgVVNBICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRVVST1BFICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgSkFQQU4gICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgS09SRUEgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgU1BBSU4gICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgRlJBTkNFICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgSVNSQUVMICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgQVVTVFJBTElBICAgICAgICAgICAgIDgKKyNkZWZpbmUgSkFQQU5fVEVTVCAgICAgICAgICAgIDkKKworLyogSG9wIHBhdHRlcm4gbGVuZ3RocyAqLworI2RlZmluZSBVU0FfSE9QX01PRCAgICAgICAgICA3OSAKKyNkZWZpbmUgRVVST1BFX0hPUF9NT0QgICAgICAgNzkgCisjZGVmaW5lIEpBUEFOX0hPUF9NT0QgICAgICAgIDIzCisjZGVmaW5lIEtPUkVBX0hPUF9NT0QgICAgICAgIDIzCisjZGVmaW5lIFNQQUlOX0hPUF9NT0QgICAgICAgIDI3CisjZGVmaW5lIEZSQU5DRV9IT1BfTU9EICAgICAgIDM1CisjZGVmaW5lIElTUkFFTF9IT1BfTU9EICAgICAgIDM1CisjZGVmaW5lIEFVU1RSQUxJQV9IT1BfTU9EICAgIDQ3CisjZGVmaW5lIEpBUEFOX1RFU1RfSE9QX01PRCAgIDIzCisKKyNkZWZpbmUgRVNTSURfU0laRSAgICAgICAgICAgMzIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ0lTIFJlZ2lzdGVyIENvbnN0YW50cyAqLworI2RlZmluZSBDSVNfT0ZGU0VUICAgICAgICAgICAgIDB4MGYwMAorLyogQ29uZmlndXJhdGlvbiBPcHRpb24gUmVnaXN0ZXIgKDB4MEYwMCkgKi8KKyNkZWZpbmUgQ09SX09GRlNFVCAgICAgICAgICAgICAweDAwCisjZGVmaW5lIENPUl9TT0ZUX1JFU0VUICAgICAgICAgMHg4MAorI2RlZmluZSBDT1JfTEVWRUxfSVJRICAgICAgICAgIDB4NDAKKyNkZWZpbmUgQ09SX0NPTkZJR19OVU0gICAgICAgICAweDAxCisjZGVmaW5lIENPUl9ERUZBVUxUICAgICAgICAgICAgKENPUl9MRVZFTF9JUlEgfCBDT1JfQ09ORklHX05VTSkKKworLyogQ2FyZCBDb25maWd1cmF0aW9uIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKDB4MEYwMSkgKi8KKyNkZWZpbmUgQ0NTUl9PRkZTRVQgICAgICAgICAgICAweDAxCisjZGVmaW5lIENDU1JfSE9TVF9JTlRSX1BFTkRJTkcgMHgwMQorI2RlZmluZSBDQ1NSX1BPV0VSX0RPV04gICAgICAgIDB4MDQKKworLyogSENTIEludGVycnVwdCBSZWdpc3RlciAoMHgwRjA1KSAqLworI2RlZmluZSBIQ1NfSU5UUl9PRkZTRVQgICAgICAgIDB4MDUKKy8qICNkZWZpbmUgSENTX0lOVFJfT0ZGU0VUICAgICAgICAweDBBICovCisjZGVmaW5lIEhDU19JTlRSX0NMRUFSICAgICAgICAgMHgwMAorCisvKiBFQ0YgSW50ZXJydXB0IFJlZ2lzdGVyICgweDBGMDYpICovCisjZGVmaW5lIEVDRl9JTlRSX09GRlNFVCAgICAgICAgMHgwNgorLyogI2RlZmluZSBFQ0ZfSU5UUl9PRkZTRVQgICAgICAgIDB4MEMgKi8KKyNkZWZpbmUgRUNGX0lOVFJfU0VUICAgICAgICAgICAweDAxCisKKy8qIEF1dGhvcml6YXRpb24gUmVnaXN0ZXIgMCAoMHgwRjA4KSAqLworI2RlZmluZSBBVVRIXzBfT04gICAgICAgICAgICAgIDB4NTcKKworLyogQXV0aG9yaXphdGlvbiBSZWdpc3RlciAxICgweDBGMDkpICovCisjZGVmaW5lIEFVVEhfMV9PTiAgICAgICAgICAgICAgMHg4MgorCisvKiBQcm9ncmFtIE1vZGUgUmVnaXN0ZXIgKDB4MEYwQSkgKi8KKyNkZWZpbmUgUEMyUE0gICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFBDMkNBTCAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBQQzJNTFNFICAgICAgICAgICAgICAgIDB4MjAKKworLyogUEMgVGVzdCBNb2RlIFJlZ2lzdGVyICgweDBGMEIpICovCisjZGVmaW5lIFBDX1RFU1RfTU9ERSAgICAgICAgICAgMHgwOAorCisvKiBGcmVxdWVuY3kgQ29udHJvbCBXb3JkICgweDBGMTApICovCisvKiBSYW5nZSAweDAyIC0gMHhBNiAqLworCisvKiBUZXN0IE1vZGUgQ29udHJvbCAxLTQgKDB4MEYxNCAtIDB4MEYxNykgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFNoYXJlZCBSQU0gQXJlYSAqLworI2RlZmluZSBTQ0JfQkFTRSAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBTVEFUVVNfQkFTRSAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBIT1NUX1RPX0VDRl9CQVNFICAgICAgIDB4MDIwMAorI2RlZmluZSBFQ0ZfVE9fSE9TVF9CQVNFICAgICAgIDB4MDMwMAorI2RlZmluZSBDQ1NfQkFTRSAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBSQ1NfQkFTRSAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBJTkZSQV9USU1fQkFTRSAgICAgICAgIDB4MEMwMAorI2RlZmluZSBTU0lEX0xJU1RfQkFTRSAgICAgICAgIDB4MEQwMAorI2RlZmluZSBUWF9CVUZfQkFTRSAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBSWF9CVUZfQkFTRSAgICAgICAgICAgIDB4ODAwMAorCisjZGVmaW5lIE5VTUJFUl9PRl9DQ1MgICAgNjQKKyNkZWZpbmUgTlVNQkVSX09GX1JDUyAgICA2NAorLyojZGVmaW5lIE5VTUJFUl9PRl9UWF9DQ1MgMTQgKi8KKyNkZWZpbmUgTlVNQkVSX09GX1RYX0NDUyAxNAorCisjZGVmaW5lIFRYX0JVRl9TSVpFICAgICAgKDIwNDggLSBzaXplb2Yoc3RydWN0IHR4X21zZykpCisjZGVmaW5lIFJYX0JVRkZfRU5EICAgICAgMHgzRkZGCisvKiBWYWx1ZXMgZm9yIGJ1ZmZlcl9zdGF0dXMgKi8KKyNkZWZpbmUgQ0NTX0JVRkZFUl9GUkVFICAgICAgIDAKKyNkZWZpbmUgQ0NTX0JVRkZFUl9CVVNZICAgICAgIDEKKyNkZWZpbmUgQ0NTX0NPTU1BTkRfQ09NUExFVEUgIDIKKyNkZWZpbmUgQ0NTX0NPTU1BTkRfRkFJTEVEICAgIDMKKworLyogVmFsdWVzIGZvciBjbWQgKi8KKyNkZWZpbmUgQ0NTX0RPV05MT0FEX1NUQVJUVVBfUEFSQU1TICAgIDEKKyNkZWZpbmUgQ0NTX1VQREFURV9QQVJBTVMgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ0NTX1JFUE9SVF9QQVJBTVMgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQ0NTX1VQREFURV9NVUxUSUNBU1RfTElTVCAgICAgIDQKKyNkZWZpbmUgQ0NTX1VQREFURV9QT1dFUl9TQVZJTkdTX01PREUgIDUKKyNkZWZpbmUgQ0NTX1NUQVJUX05FVFdPUksgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQ0NTX0pPSU5fTkVUV09SSyAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgQ0NTX1NUQVJUX0FTU09DSUFUSU9OICAgICAgICAgIDgKKyNkZWZpbmUgQ0NTX1RYX1JFUVVFU1QgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgQ0NTX1RFU1RfTUVNT1JZICAgICAgICAgICAgICAweGEKKyNkZWZpbmUgQ0NTX1NIVVRET1dOICAgICAgICAgICAgICAgICAweGIKKyNkZWZpbmUgQ0NTX0RVTVBfTUVNT1JZICAgICAgICAgICAgICAweGMKKyNkZWZpbmUgQ0NTX1NUQVJUX1RJTUVSICAgICAgICAgICAgICAweGUKKyNkZWZpbmUgQ0NTX0xBU1RfQ01EICAgICAgICAgICAgICAgICBDQ1NfU1RBUlRfVElNRVIKKworLyogVmFsdWVzIGZvciBsaW5rIGZpZWxkICovCisjZGVmaW5lIENDU19FTkRfTElTVCAgICAgICAgICAgICAgICAgMHhmZgorCisvKiB2YWx1ZXMgZm9yIGJ1ZmZlcl9zdGF0dXMgZmllbGQgKi8KKyNkZWZpbmUgUkNTX0JVRkZFUl9GUkVFICAgICAgIDAKKyNkZWZpbmUgUkNTX0JVRkZFUl9CVVNZICAgICAgIDEKKyNkZWZpbmUgUkNTX0NPTVBMRVRFICAgICAgICAgIDIKKyNkZWZpbmUgUkNTX0ZBSUxFRCAgICAgICAgICAgIDMKKyNkZWZpbmUgUkNTX0JVRkZFUl9SRUxFQVNFICAgIDB4RkYKKworLyogdmFsdWVzIGZvciBpbnRlcnJ1cHRfaWQgZmllbGQgKi8KKyNkZWZpbmUgUFJPQ0VTU19SWF9QQUNLRVQgICAgICAgICAgIDB4ODAgLyogKi8KKyNkZWZpbmUgUkVKT0lOX05FVF9DT01QTEVURSAgICAgICAgIDB4ODEgLyogUkNTIElEOiBSZWpvaW4gTmV0IENvbXBsZXRlICovCisjZGVmaW5lIFJPQU1JTkdfSU5JVElBVEVEICAgICAgICAgICAweDgyIC8qIFJDUyBJRDogUm9hbWluZyBJbml0aWF0ZWQgICAqLworI2RlZmluZSBKQVBBTl9DQUxMX1NJR05fUlhEICAgICAgICAgMHg4MyAvKiBSQ1MgSUQ6IE5ldyBKYXBhbiBDYWxsIFNpZ24gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTWVtb3J5IHR5cGVzIGZvciBkdW1wIG1lbW9yeSBjb21tYW5kICovCisjZGVmaW5lIENfTUVNX1BST0cgIDAKKyNkZWZpbmUgQ19NRU1fWERBVEEgMQorI2RlZmluZSBDX01FTV9TRlIgICAyCisjZGVmaW5lIENfTUVNX0lEQVRBIDMKKworLyoqKiBSZXR1cm4gdmFsdWVzIGZvciBod194bWl0ICoqKioqKioqKiovCisjZGVmaW5lIFhNSVRfT0sgICAgICAgICgwKQorI2RlZmluZSBYTUlUX01TR19CQUQgICAoLTEpCisjZGVmaW5lIFhNSVRfTk9fQ0NTICAgICgtMikKKyNkZWZpbmUgWE1JVF9OT19JTlRSICAgKC0zKQorI2RlZmluZSBYTUlUX05FRURfQVVUSCAoLTQpCisKKy8qKiogVmFsdWVzIGZvciBjYXJkIHN0YXR1cyAqLworI2RlZmluZSBDQVJEX0lOU0VSVEVEICAgICAgICgwKQorCisjZGVmaW5lIENBUkRfQVdBSVRJTkdfUEFSQU0gKDEpCisjZGVmaW5lIENBUkRfSU5JVF9FUlJPUiAgICAgKDExKQorCisjZGVmaW5lIENBUkRfRExfUEFSQU0gICAgICAgKDIpCisjZGVmaW5lIENBUkRfRExfUEFSQU1fRVJST1IgKDEyKQorCisjZGVmaW5lIENBUkRfRE9JTkdfQUNRICAgICAgKDMpCisKKyNkZWZpbmUgQ0FSRF9BQ1FfQ09NUExFVEUgICAoNCkKKyNkZWZpbmUgQ0FSRF9BQ1FfRkFJTEVEICAgICAoMTQpCisKKyNkZWZpbmUgQ0FSRF9BVVRIX0NPTVBMRVRFICAoNSkKKyNkZWZpbmUgQ0FSRF9BVVRIX1JFRlVTRUQgICAoMTUpCisKKyNkZWZpbmUgQ0FSRF9BU1NPQ19DT01QTEVURSAoNikKKyNkZWZpbmUgQ0FSRF9BU1NPQ19GQUlMRUQgICAoMTYpCisKKy8qKiogVmFsdWVzIGZvciBhdXRoZW50aWNhdGlvbl9zdGF0ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVU5BVVRIRU5USUNBVEVEICAgICAoMCkKKyNkZWZpbmUgQVdBSVRJTkdfUkVTUE9OU0UgICAoMSkKKyNkZWZpbmUgQVVUSEVOVElDQVRFRCAgICAgICAoMikKKyNkZWZpbmUgTkVFRF9UT19BVVRIICAgICAgICAoMykKKworLyoqKiBWYWx1ZXMgZm9yIGF1dGhlbnRpY2F0aW9uIHR5cGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBPUEVOX0FVVEhfUkVRVUVTVCAgICgxKQorI2RlZmluZSBPUEVOX0FVVEhfUkVTUE9OU0UgICgyKQorI2RlZmluZSBCUk9BRENBU1RfREVBVVRIICAgICgweGMwKQorLyoqKiBWYWx1ZXMgZm9yIHRpbWVyIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBUT0RPX05PVEhJTkcgICAgICAgICAgICAgICgwKQorI2RlZmluZSBUT0RPX1ZFUklGWV9ETF9TVEFSVCAgICAgICgtMSkKKyNkZWZpbmUgVE9ET19TVEFSVF9ORVQgICAgICAgICAgICAoLTIpCisjZGVmaW5lIFRPRE9fSk9JTl9ORVQgICAgICAgICAgICAgKC0zKQorI2RlZmluZSBUT0RPX0FVVEhFTlRJQ0FURV9USU1FT1VUICgtNCkKKyNkZWZpbmUgVE9ET19TRU5EX0NDUyAgICAgICAgICAgICAoLTUpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQYXJhbWV0ZXIgcGFzc2luZyBzdHJ1Y3R1cmUgZm9yIHVwZGF0ZS9yZXBvcnQgcGFyYW1ldGVyIENDUydzICovCitzdHJ1Y3Qgb2JqZWN0X2lkIHsKKyAgICB2b2lkICAgICAgICAgICpvYmplY3RfYWRkcjsKKyAgICB1bnNpZ25lZCBjaGFyIG9iamVjdF9sZW5ndGg7Cit9OworCisjZGVmaW5lIE9CSklEX25ldHdvcmtfdHlwZSAgICAgICAgICAgIDAKKyNkZWZpbmUgT0JKSURfYWN0aW5nX2FzX2FwX3N0YXR1cyAgICAgMQorI2RlZmluZSBPQkpJRF9jdXJyZW50X2Vzc19pZCAgICAgICAgICAyCisjZGVmaW5lIE9CSklEX3NjYW5uaW5nX21vZGUgICAgICAgICAgIDMKKyNkZWZpbmUgT0JKSURfcG93ZXJfbWd0X3N0YXRlICAgICAgICAgNAorI2RlZmluZSBPQkpJRF9tYWNfYWRkcmVzcyAgICAgICAgICAgICA1CisjZGVmaW5lIE9CSklEX2ZyYWdfdGhyZXNob2xkICAgICAgICAgIDYKKyNkZWZpbmUgT0JKSURfaG9wX3RpbWUgICAgICAgICAgICAgICAgNworI2RlZmluZSBPQkpJRF9iZWFjb25fcGVyaW9kICAgICAgICAgICA4CisjZGVmaW5lIE9CSklEX2R0aW1fcGVyaW9kICAgICAgICAgICAgIDkKKyNkZWZpbmUgT0JKSURfcmV0cnlfbWF4ICAgICAgICAgICAgICAxMAorI2RlZmluZSBPQkpJRF9hY2tfdGltZW91dCAgICAgICAgICAgIDExCisjZGVmaW5lIE9CSklEX3NpZnMgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgT0JKSURfZGlmcyAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBPQkpJRF9waWZzICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIE9CSklEX3J0c190aHJlc2hvbGQgICAgICAgICAgMTUKKyNkZWZpbmUgT0JKSURfc2Nhbl9kd2VsbF90aW1lICAgICAgICAxNgorI2RlZmluZSBPQkpJRF9tYXhfc2Nhbl9kd2VsbF90aW1lICAgIDE3CisjZGVmaW5lIE9CSklEX2Fzc29jX3Jlc3BfdGltZW91dCAgICAgMTgKKyNkZWZpbmUgT0JKSURfYWRob2Nfc2Nhbl9jeWNsZV9tYXggICAxOQorI2RlZmluZSBPQkpJRF9pbmZyYV9zY2FuX2N5Y2xlX21heCAgIDIwCisjZGVmaW5lIE9CSklEX2luZnJhX3N1cGVyX2N5Y2xlX21heCAgMjEKKyNkZWZpbmUgT0JKSURfcHJvbWlzY3VvdXNfbW9kZSAgICAgICAyMgorI2RlZmluZSBPQkpJRF91bmlxdWVfd29yZCAgICAgICAgICAgIDIzCisjZGVmaW5lIE9CSklEX3Nsb3RfdGltZSAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgT0JKSURfcm9hbWluZ19sb3dfc25yICAgICAgICAyNQorI2RlZmluZSBPQkpJRF9sb3dfc25yX2NvdW50X3RocmVzaCAgIDI2CisjZGVmaW5lIE9CSklEX2luZnJhX21pc3NlZF9iY24gICAgICAgMjcKKyNkZWZpbmUgT0JKSURfYWRob2NfbWlzc2VkX2JjbiAgICAgICAyOAorI2RlZmluZSBPQkpJRF9jdXJyX2NvdW50cnlfY29kZSAgICAgIDI5CisjZGVmaW5lIE9CSklEX2hvcF9wYXR0ZXJuICAgICAgICAgICAgMzAKKyNkZWZpbmUgT0JKSURfcmVzZXJ2ZWQgICAgICAgICAgICAgICAzMQorI2RlZmluZSBPQkpJRF9jd19tYXhfbXNiICAgICAgICAgICAgIDMyCisjZGVmaW5lIE9CSklEX2N3X21pbl9tc2IgICAgICAgICAgICAgMzMKKyNkZWZpbmUgT0JKSURfbm9pc2VfZmlsdGVyX2dhaW4gICAgICAzNAorI2RlZmluZSBPQkpJRF9ub2lzZV9saW1pdF9vZmZzZXQgICAgIDM1CisjZGVmaW5lIE9CSklEX2RldF9yc3NpX3RocmVzaF9vZmZzZXQgMzYKKyNkZWZpbmUgT0JKSURfbWVkX2J1c3lfdGhyZXNoX29mZnNldCAzNworI2RlZmluZSBPQkpJRF9kZXRfc3luY190aHJlc2ggICAgICAgIDM4CisjZGVmaW5lIE9CSklEX3Rlc3RfbW9kZSAgICAgICAgICAgICAgMzkKKyNkZWZpbmUgT0JKSURfdGVzdF9taW5fY2hhbl9udW0gICAgICA0MAorI2RlZmluZSBPQkpJRF90ZXN0X21heF9jaGFuX251bSAgICAgIDQxCisjZGVmaW5lIE9CSklEX2FsbG93X2JjYXN0X0lEX3ByYnJzcCAgNDIKKyNkZWZpbmUgT0JKSURfcHJpdmFjeV9tdXN0X3N0YXJ0ICAgICA0MworI2RlZmluZSBPQkpJRF9wcml2YWN5X2Nhbl9qb2luICAgICAgIDQ0CisjZGVmaW5lIE9CSklEX2Jhc2ljX3JhdGVfc2V0ICAgICAgICAgNDUKKworLyoqKiogQ29uZmlndXJhdGlvbi9TdGF0dXMvQ29udHJvbCBBcmVhICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgIFN5c3RlbSBDb250cm9sIEJsb2NrIChTQ0IpIEFyZWEKKyAqICAgIExvY2F0ZWQgYXQgU2hhcmVkIFJBTSBvZmZzZXQgMAorICovCitzdHJ1Y3Qgc2NiIHsKKyAgICBVQ0hBUiBjY3NfaW5kZXg7CisgICAgVUNIQVIgcmNzX2luZGV4OworfTsKKworLyoqKioqKiBTdGF0dXMgYXJlYSBhdCBTaGFyZWQgUkFNIG9mZnNldCAweDAxMDAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHN0YXR1cyB7CisgICAgVUNIQVIgbXJ4X292ZXJmbG93X2Zvcl9ob3N0OyAgICAgICAgIC8qIDA9RUNGIG1heSB3cml0ZSwgMT1ob3N0IG1heSB3cml0ZSovCisgICAgVUNIQVIgbXJ4X2NoZWNrc3VtX2Vycm9yX2Zvcl9ob3N0OyAgIC8qIDA9RUNGIG1heSB3cml0ZSwgMT1ob3N0IG1heSB3cml0ZSovCisgICAgVUNIQVIgcnhfaGVjX2Vycm9yX2Zvcl9ob3N0OyAgICAgICAgIC8qIDA9RUNGIG1heSB3cml0ZSwgMT1ob3N0IG1heSB3cml0ZSovCisgICAgVUNIQVIgcmVzZXJ2ZWQxOworICAgIHNob3J0IG1yeF9vdmVyZmxvdzsgICAgICAgICAgICAgICAgICAvKiBFQ0YgaW5jcmVtZW50cyBvbiByeCBvdmVyZmxvdyAgICAqLworICAgIHNob3J0IG1yeF9jaGVja3N1bV9lcnJvcjsgICAgICAgICAgICAvKiBFQ0YgaW5jcmVtZW50cyBvbiByeCBDUkMgZXJyb3IgICAqLworICAgIHNob3J0IHJ4X2hlY19lcnJvcjsgICAgICAgICAgICAgICAgICAvKiBFQ0YgaW5jcyBvbiBtYWMgaGVhZGVyIENSQyBlcnJvciAqLworICAgIFVDSEFSIHJ4bm9pc2U7ICAgICAgICAgICAgICAgICAgICAgICAvKiBBdmVyYWdlIFJTTCBtZWFzdXJlbWVudCAgICAgICAgICAqLworfTsKKworLyoqKioqKiBIb3N0LXRvLUVDRiBEYXRhIEFyZWEgYXQgU2hhcmVkIFJBTSBvZmZzZXQgMHgyMDAgKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGhvc3RfdG9fZWNmX2FyZWEgeworICAgIAorfTsKKworLyoqKioqKiBFQ0YtdG8tSG9zdCBEYXRhIEFyZWEgYXQgU2hhcmVkIFJBTSBvZmZzZXQgMHgwMzAwICoqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHN0YXJ0dXBfcmVzXzUxOCB7CisgICAgVUNIQVIgc3RhcnR1cF93b3JkOworICAgIFVDSEFSIHN0YXRpb25fYWRkcltBRERSTEVOXTsKKyAgICBVQ0hBUiBjYWxjX3Byb2dfY2hrc3VtOworICAgIFVDSEFSIGNhbGNfY2lzX2Noa3N1bTsKKyAgICBVQ0hBUiBlY2Zfc3BhcmVbN107CisgICAgVUNIQVIgamFwYW5fY2FsbF9zaWduWzEyXTsKK307CisKK3N0cnVjdCBzdGFydHVwX3Jlc182IHsKKyAgICBVQ0hBUiBzdGFydHVwX3dvcmQ7CisgICAgVUNIQVIgc3RhdGlvbl9hZGRyW0FERFJMRU5dOworICAgIFVDSEFSIHJlc2VydmVkOworICAgIFVDSEFSIHN1cHBfcmF0ZXNbOF07CisgICAgVUNIQVIgamFwYW5fY2FsbF9zaWduWzEyXTsKKyAgICBVQ0hBUiBjYWxjX3Byb2dfY2hrc3VtOworICAgIFVDSEFSIGNhbGNfY2lzX2Noa3N1bTsKKyAgICBVQ0hBUiBmaXJtd2FyZV92ZXJzaW9uWzNdOworICAgIFVDSEFSIGFzaWNfdmVyc2lvbjsKKyAgICBVQ0hBUiB0aWJfbGVuZ3RoOworfTsKKworc3RydWN0IHN0YXJ0X2pvaW5fbmV0X3BhcmFtcyB7CisgICAgVUNIQVIgbmV0X3R5cGU7CisgICAgVUNIQVIgc3NpZFtFU1NJRF9TSVpFXTsKKyAgICBVQ0hBUiByZXNlcnZlZDsKKyAgICBVQ0hBUiBwcml2YWN5X2Nhbl9qb2luOworfTsKKworLyoqKioqKiBDb21tYW5kIENvbnRyb2wgU3RydWN0dXJlIGFyZWEgYXQgU2hhcmVkIHJhbSBvZmZzZXQgMHgwNDAwICoqKioqKioqKioqLworLyogU3RydWN0dXJlcyBmb3IgY29tbWFuZCBzcGVjaWZpYyBwYXJhbWV0ZXJzIChjY3MudmFyKSAqLworc3RydWN0IHVwZGF0ZV9wYXJhbV9jbWQgeworICAgIFVDSEFSIG9iamVjdF9pZDsKKyAgICBVQ0hBUiBudW1iZXJfb2JqZWN0czsKKyAgICBVQ0hBUiBmYWlsdXJlX2NhdXNlOworfTsKK3N0cnVjdCByZXBvcnRfcGFyYW1fY21kIHsKKyAgICBVQ0hBUiBvYmplY3RfaWQ7CisgICAgVUNIQVIgbnVtYmVyX29iamVjdHM7CisgICAgVUNIQVIgZmFpbHVyZV9jYXVzZTsKKyAgICBVQ0hBUiBsZW5ndGg7Cit9Oworc3RydWN0IHN0YXJ0X25ldHdvcmtfY21kIHsKKyAgICBVQ0hBUiB1cGRhdGVfcGFyYW07CisgICAgVUNIQVIgYnNzaWRbQUREUkxFTl07CisgICAgVUNIQVIgbmV0X2luaXRpYXRlZDsKKyAgICBVQ0hBUiBuZXRfZGVmYXVsdF90eF9yYXRlOworICAgIFVDSEFSIGVuY3J5cHRpb247Cit9Oworc3RydWN0IGpvaW5fbmV0d29ya19jbWQgeworICAgIFVDSEFSIHVwZGF0ZV9wYXJhbTsKKyAgICBVQ0hBUiBic3NpZFtBRERSTEVOXTsKKyAgICBVQ0hBUiBuZXRfaW5pdGlhdGVkOworICAgIFVDSEFSIG5ldF9kZWZhdWx0X3R4X3JhdGU7CisgICAgVUNIQVIgZW5jcnlwdGlvbjsKK307CitzdHJ1Y3QgdHhfcmVxdWVzdGVkX2NtZCB7CisgCisgICAgVUNIQVIgdHhfZGF0YV9wdHJbMl07CisgICAgVUNIQVIgdHhfZGF0YV9sZW5ndGhbMl07CisgICAgVUNIQVIgaG9zdF9yZXNlcnZlZFsyXTsKKyAgICBVQ0hBUiByZXNlcnZlZFszXTsKKyAgICBVQ0hBUiB0eF9yYXRlOworICAgIFVDSEFSIHBvd19zYXZfbW9kZTsKKyAgICBVQ0hBUiByZXRyaWVzOworICAgIFVDSEFSIGFudGVubmE7Cit9Oworc3RydWN0IHR4X3JlcXVlc3RlZF9jbWRfNCB7CisgCisgICAgVUNIQVIgdHhfZGF0YV9wdHJbMl07CisgICAgVUNIQVIgdHhfZGF0YV9sZW5ndGhbMl07CisgICAgVUNIQVIgZGVzdF9hZGRyW0FERFJMRU5dOworICAgIFVDSEFSIHBvd19zYXZfbW9kZTsKKyAgICBVQ0hBUiByZXRyaWVzOworICAgIFVDSEFSIHN0YXRpb25faWQ7Cit9Oworc3RydWN0IG1lbW9yeV9kdW1wX2NtZCB7CisgICAgVUNIQVIgbWVtb3J5X3R5cGU7CisgICAgVUNIQVIgbWVtb3J5X3B0clsyXTsKKyAgICBVQ0hBUiBsZW5ndGg7Cit9Oworc3RydWN0IHVwZGF0ZV9hc3NvY2lhdGlvbl9jbWQgeworICAgIFVDSEFSIHN0YXR1czsKKyAgICBVQ0hBUiBhaWRbMl07Cit9Oworc3RydWN0IHN0YXJ0X3RpbWVyX2NtZCB7CisgICAgVUNIQVIgZHVyYXRpb25bMl07Cit9OworCitzdHJ1Y3QgY2NzIHsKKyAgICBVQ0hBUiBidWZmZXJfc3RhdHVzOyAgICAgICAgICAgICAgICAgLyogMCA9IGJ1ZmZlciBmcmVlLCAxID0gYnVmZmVyIGJ1c3kgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMiA9IGNvbW1hbmQgY29tcGxldGUsIDMgPSBmYWlsZWQgKi8KKyAgICBVQ0hBUiBjbWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29tbWFuZCB0byBFQ0YgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBsaW5rOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGluayB0byBuZXh0IENDUywgRkY9ZW5kIG9mIGxpc3QgKi8KKyAgICAvKiBjb21tYW5kIHNwZWNpZmljIHBhcmFtZXRlcnMgICAgICAqLworICAgIHVuaW9uIHsKKyAgICAgICAgY2hhciByZXNlcnZlZFsxM107CisgICAgICAgIHN0cnVjdCB1cGRhdGVfcGFyYW1fY21kIHVwZGF0ZV9wYXJhbTsKKyAgICAgICAgc3RydWN0IHJlcG9ydF9wYXJhbV9jbWQgcmVwb3J0X3BhcmFtOworICAgICAgICBVQ0hBUiBudW1tdWx0aWNhc3Q7CisgICAgICAgIFVDSEFSIG1vZGU7CisgICAgICAgIHN0cnVjdCBzdGFydF9uZXR3b3JrX2NtZCBzdGFydF9uZXR3b3JrOworICAgICAgICBzdHJ1Y3Qgam9pbl9uZXR3b3JrX2NtZCBqb2luX25ldHdvcms7CisgICAgICAgIHN0cnVjdCB0eF9yZXF1ZXN0ZWRfY21kIHR4X3JlcXVlc3Q7CisgICAgICAgIHN0cnVjdCBtZW1vcnlfZHVtcF9jbWQgbWVtb3J5X2R1bXA7CisgICAgICAgIHN0cnVjdCB1cGRhdGVfYXNzb2NpYXRpb25fY21kIHVwZGF0ZV9hc3NvYzsKKyAgICAgICAgc3RydWN0IHN0YXJ0X3RpbWVyX2NtZCBzdGFydF90aW1lcjsKKyAgICB9IHZhcjsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRyYW5zbWl0IGJ1ZmZlciBzdHJ1Y3R1cmVzICovCitzdHJ1Y3QgdGliX3N0cnVjdHVyZSB7CisgICAgVUNIQVIgY2NzX2luZGV4OworICAgIFVDSEFSIHBzbTsKKyAgICBVQ0hBUiBwYXNzX2ZhaWw7CisgICAgVUNIQVIgcmV0cnlfY291bnQ7CisgICAgVUNIQVIgbWF4X3JldHJpZXM7CisgICAgVUNIQVIgZnJhZ3NfcmVtYWluaW5nOworICAgIFVDSEFSIG5vX3JiOworICAgIFVDSEFSIHJ0c19yZXFkOworICAgIFVDSEFSIGNzbWFfdHhfY250cmxfMjsKKyAgICBVQ0hBUiBzaWZzX3R4X2NudHJsXzI7CisgICAgVUNIQVIgdHhfZG1hX2FkZHJfMVsyXTsKKyAgICBVQ0hBUiB0eF9kbWFfYWRkcl8yWzJdOworICAgIFVDSEFSIHZhcl9kdXJfMm1oelsyXTsKKyAgICBVQ0hBUiB2YXJfZHVyXzFtaHpbMl07CisgICAgVUNIQVIgbWF4X2R1cl8ybWh6WzJdOworICAgIFVDSEFSIG1heF9kdXJfMW1oelsyXTsKKyAgICBVQ0hBUiBoZHJfbGVuOworICAgIFVDSEFSIG1heF9mcmFnX2xlblsyXTsKKyAgICBVQ0hBUiB2YXJfbGVuWzJdOworICAgIFVDSEFSIHBoeV9oZHJfNDsKKyAgICBVQ0hBUiBtYWNfaGRyXzE7CisgICAgVUNIQVIgbWFjX2hkcl8yOworICAgIFVDSEFSIHNpZFsyXTsKK307CisKK3N0cnVjdCBwaHlfaGVhZGVyIHsKKyAgICBVQ0hBUiBzZmRbMl07CisgICAgVUNIQVIgaGRyXzM7CisgICAgVUNIQVIgaGRyXzQ7Cit9Oworc3RydWN0IHJ4X21zZyB7CisgICAgc3RydWN0IG1hY19oZWFkZXIgbWFjOworICAgIFVDSEFSICB2YXJbMV07Cit9OworCitzdHJ1Y3QgdHhfbXNnIHsKKyAgICBzdHJ1Y3QgdGliX3N0cnVjdHVyZSB0aWI7CisgICAgc3RydWN0IHBoeV9oZWFkZXIgcGh5OworICAgIHN0cnVjdCBtYWNfaGVhZGVyIG1hYzsKKyAgICBVQ0hBUiAgdmFyWzFdOworfTsKKworLyoqKioqKiBFQ0YgUmVjZWl2ZSBDb250cm9sIFN0dWN0dXJlIChSQ1MpIEFyZWEgYXQgU2hhcmVkIFJBTSBvZmZzZXQgMHgwODAwICAqLworLyogU3RydWN0dXJlcyBmb3IgY29tbWFuZCBzcGVjaWZpYyBwYXJhbWV0ZXJzIChyY3MudmFyKSAqLworc3RydWN0IHJ4X3BhY2tldF9jbWQgeworICAgIFVDSEFSIHJ4X2RhdGFfcHRyWzJdOworICAgIFVDSEFSIHJ4X2RhdGFfbGVuZ3RoWzJdOworICAgIFVDSEFSIHJ4X3NpZ19sZXY7CisgICAgVUNIQVIgbmV4dF9mcmFnX3Jjc19pbmRleDsKKyAgICBVQ0hBUiB0b3RhbHBhY2tldGxlbmd0aFsyXTsKK307CitzdHJ1Y3QgcmVqb2luX25ldF9jbXBsdF9jbWQgeworICAgIFVDSEFSIHJlc2VydmVkOworICAgIFVDSEFSIGJzc2lkW0FERFJMRU5dOworfTsKK3N0cnVjdCBqYXBhbl9jYWxsX3NpZ25fcnhkIHsKKyAgICBVQ0hBUiByeGRfY2FsbF9zaWduWzhdOworICAgIFVDSEFSIHJlc2VydmVkWzVdOworfTsKKworc3RydWN0IHJjcyB7CisgICAgVUNIQVIgYnVmZmVyX3N0YXR1czsKKyAgICBVQ0hBUiBpbnRlcnJ1cHRfaWQ7CisgICAgVUNIQVIgbGlua19maWVsZDsKKyAgICAvKiBjb21tYW5kIHNwZWNpZmljIHBhcmFtZXRlcnMgICAgICAqLworICAgIHVuaW9uIHsKKyAgICAgICAgVUNIQVIgcmVzZXJ2ZWRbMTNdOyAKKyAgICAgICAgc3RydWN0IHJ4X3BhY2tldF9jbWQgcnhfcGFja2V0OworICAgICAgICBzdHJ1Y3QgcmVqb2luX25ldF9jbXBsdF9jbWQgcmVqb2luX25ldF9jb21wbGV0ZTsKKyAgICAgICAgc3RydWN0IGphcGFuX2NhbGxfc2lnbl9yeGQgamFwYW5fY2FsbF9zaWduOworICAgIH0gdmFyOworfTsKKworLyoqKioqKiBTdGFydHVwIHBhcmFtZXRlciBzdHJ1Y3R1cmVzIGZvciBib3RoIHZlcnNpb25zIG9mIGZpcm13YXJlICoqKioqKioqKioqLworc3RydWN0IGI0X3N0YXJ0dXBfcGFyYW1zIHsKKyAgICBVQ0hBUiBhX25ldHdvcmtfdHlwZTsgICAgICAgICAgICAgICAgLyogQ19BREhPQywgQ19JTkZSQSAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2FjdGluZ19hc19hcF9zdGF0dXM7ICAgICAgICAgLyogQ19UWVBFX1NUQSwgQ19UWVBFX0FQICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2N1cnJlbnRfZXNzX2lkW0VTU0lEX1NJWkVdOyAgLyogTnVsbCB0ZXJtaW5hdGVkIHVubGVzcyAzMiBsb25nICAgKi8KKyAgICBVQ0hBUiBhX3NjYW5uaW5nX21vZGU7ICAgICAgICAgICAgICAgLyogcGFzc2l2ZSAwLCBhY3RpdmUgMSAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3Bvd2VyX21ndF9zdGF0ZTsgICAgICAgICAgICAgLyogQ0FNIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX21hY19hZGRyW0FERFJMRU5dOyAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2ZyYWdfdGhyZXNob2xkWzJdOyAgICAgICAgICAgLyogNTEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2hvcF90aW1lWzJdOyAgICAgICAgICAgICAgICAgLyogMTZrICogMioqbiwgbj0wLTQgaW4gS3VzICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2JlYWNvbl9wZXJpb2RbMl07ICAgICAgICAgICAgLyogbiAqIGFfaG9wX3RpbWUgIGluIEt1cyAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2R0aW1fcGVyaW9kOyAgICAgICAgICAgICAgICAgLyogaW4gYmVhY29ucyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3JldHJ5X21heDsgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2Fja190aW1lb3V0OyAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3NpZnM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2RpZnM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3BpZnM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3J0c190aHJlc2hvbGRbMl07ICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3NjYW5fZHdlbGxfdGltZVsyXTsgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX21heF9zY2FuX2R3ZWxsX3RpbWVbMl07ICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2Fzc29jX3Jlc3BfdGltZW91dF90aHJlc2g7ICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2FkaG9jX3NjYW5fY3ljbGVfbWF4OyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2luZnJhX3NjYW5fY3ljbGVfbWF4OyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2luZnJhX3N1cGVyX3NjYW5fY3ljbGVfbWF4OyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3Byb21pc2N1b3VzX21vZGU7ICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3VuaXF1ZV93b3JkWzJdOyAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3Nsb3RfdGltZTsgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3JvYW1pbmdfbG93X3Nucl90aHJlc2g7ICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2xvd19zbnJfY291bnRfdGhyZXNoOyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2luZnJhX21pc3NlZF9iY25fdGhyZXNoOyAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2FkaG9jX21pc3NlZF9iY25fdGhyZXNoOyAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2N1cnJfY291bnRyeV9jb2RlOyAgICAgICAgICAgLyogQ19VU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2hvcF9wYXR0ZXJuOyAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2hvcF9wYXR0ZXJuX2xlbmd0aDsgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGI0IC0gYjUgZGlmZmVyZW5jZXMgc3RhcnQgaGVyZSAqLworICAgIFVDSEFSIGFfY3dfbWF4OyAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfY3dfbWluOyAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfbm9pc2VfZmlsdGVyX2dhaW47ICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfbm9pc2VfbGltaXRfb2Zmc2V0OyAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfZGV0X3Jzc2lfdGhyZXNoX29mZnNldDsgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfbWVkX2J1c3lfdGhyZXNoX29mZnNldDsgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfZGV0X3N5bmNfdGhyZXNoOyAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfdGVzdF9tb2RlOyAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfdGVzdF9taW5fY2hhbl9udW07ICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfdGVzdF9tYXhfY2hhbl9udW07ICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfcnhfdHhfZGVsYXk7ICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfY3VycmVudF9ic3NfaWRbQUREUkxFTl07ICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfaG9wX3NldDsgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfTsKK3N0cnVjdCBiNV9zdGFydHVwX3BhcmFtcyB7CisgICAgVUNIQVIgYV9uZXR3b3JrX3R5cGU7ICAgICAgICAgICAgICAgIC8qIENfQURIT0MsIENfSU5GUkEgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9hY3RpbmdfYXNfYXBfc3RhdHVzOyAgICAgICAgIC8qIENfVFlQRV9TVEEsIENfVFlQRV9BUCAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9jdXJyZW50X2Vzc19pZFtFU1NJRF9TSVpFXTsgIC8qIE51bGwgdGVybWluYXRlZCB1bmxlc3MgMzIgbG9uZyAgICovCisgICAgVUNIQVIgYV9zY2FubmluZ19tb2RlOyAgICAgICAgICAgICAgIC8qIHBhc3NpdmUgMCwgYWN0aXZlIDEgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9wb3dlcl9tZ3Rfc3RhdGU7ICAgICAgICAgICAgIC8qIENBTSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9tYWNfYWRkcltBRERSTEVOXTsgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9mcmFnX3RocmVzaG9sZFsyXTsgICAgICAgICAgIC8qIDUxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9ob3BfdGltZVsyXTsgICAgICAgICAgICAgICAgIC8qIDE2ayAqIDIqKm4sIG49MC00IGluIEt1cyAgICAgICAgICovCisgICAgVUNIQVIgYV9iZWFjb25fcGVyaW9kWzJdOyAgICAgICAgICAgIC8qIG4gKiBhX2hvcF90aW1lICBpbiBLdXMgICAgICAgICAgICovCisgICAgVUNIQVIgYV9kdGltX3BlcmlvZDsgICAgICAgICAgICAgICAgIC8qIGluIGJlYWNvbnMgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9yZXRyeV9tYXg7ICAgICAgICAgICAgICAgICAgIC8qIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9hY2tfdGltZW91dDsgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9zaWZzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9kaWZzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9waWZzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9ydHNfdGhyZXNob2xkWzJdOyAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9zY2FuX2R3ZWxsX3RpbWVbMl07ICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9tYXhfc2Nhbl9kd2VsbF90aW1lWzJdOyAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9hc3NvY19yZXNwX3RpbWVvdXRfdGhyZXNoOyAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9hZGhvY19zY2FuX2N5Y2xlX21heDsgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9pbmZyYV9zY2FuX2N5Y2xlX21heDsgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9pbmZyYV9zdXBlcl9zY2FuX2N5Y2xlX21heDsgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9wcm9taXNjdW91c19tb2RlOyAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV91bmlxdWVfd29yZFsyXTsgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9zbG90X3RpbWU7ICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9yb2FtaW5nX2xvd19zbnJfdGhyZXNoOyAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9sb3dfc25yX2NvdW50X3RocmVzaDsgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9pbmZyYV9taXNzZWRfYmNuX3RocmVzaDsgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9hZGhvY19taXNzZWRfYmNuX3RocmVzaDsgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9jdXJyX2NvdW50cnlfY29kZTsgICAgICAgICAgIC8qIENfVVNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9ob3BfcGF0dGVybjsgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9ob3BfcGF0dGVybl9sZW5ndGg7ICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBiNCAtIGI1IGRpZmZlcmVuY2VzIHN0YXJ0IGhlcmUgKi8KKyAgICBVQ0hBUiBhX2N3X21heFsyXTsgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2N3X21pblsyXTsgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX25vaXNlX2ZpbHRlcl9nYWluOyAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX25vaXNlX2xpbWl0X29mZnNldDsgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2RldF9yc3NpX3RocmVzaF9vZmZzZXQ7ICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX21lZF9idXN5X3RocmVzaF9vZmZzZXQ7ICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2RldF9zeW5jX3RocmVzaDsgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3Rlc3RfbW9kZTsgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3Rlc3RfbWluX2NoYW5fbnVtOyAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3Rlc3RfbWF4X2NoYW5fbnVtOyAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2FsbG93X2JjYXN0X1NTSURfcHJvYmVfcnNwOworICAgIFVDSEFSIGFfcHJpdmFjeV9tdXN0X3N0YXJ0OworICAgIFVDSEFSIGFfcHJpdmFjeV9jYW5fam9pbjsKKyAgICBVQ0hBUiBhX2Jhc2ljX3JhdGVfc2V0WzhdOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBSQVlfSU9DR19QQVJNUyAoU0lPQ0RFVlBSSVZBVEUpCisjZGVmaW5lIFJBWV9JT0NTX1BBUk1TIChTSU9DREVWUFJJVkFURSArIDEpCisjZGVmaW5lIFJBWV9ET19DTUQgICAgIChTSU9DREVWUFJJVkFURSArIDIpCisKKy8qKioqKiogZXRoZXJuZXQgPC0+IDgwMi4xMSB0cmFuc2xhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHNuYXBoZHJfdAoreworICBVQ0hBUiAgIGRzYXA7CisgIFVDSEFSICAgc3NhcDsKKyAgVUNIQVIgICBjdHJsOworICBVQ0hBUiAgIG9yZ1szXTsKKyAgVUNIQVIgICBldGhlcnR5cGVbMl07Cit9IHNuYXBoZHJfdDsKKworI2RlZmluZSBCUklER0VfRU5DQVAgIDB4ZjgwMDAwCisjZGVmaW5lIFJGQzEwNDJfRU5DQVAgMAorI2RlZmluZSBTTkFQX0lEICAgICAgIDB4MDAwM2FhYWEKKyNkZWZpbmUgUkFZX0lQWF9UWVBFICAweDgxMzcKKyNkZWZpbmUgQVBQTEVBUlBfVFlQRSAweDgwZjMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZiAvKiAjaWZuZGVmIFJBWUxJTktfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvc3RyaXAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3N0cmlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4Y2YyOWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9zdHJpcC5jCkBAIC0wLDAgKzEsMjg0MyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk2IFRoZSBCb2FyZCBvZiBUcnVzdGVlcyBvZiBUaGUgTGVsYW5kIFN0YW5mb3JkCisgKiBKdW5pb3IgVW5pdmVyc2l0eS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0CisgKiBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLiAgU3RhbmZvcmQgVW5pdmVyc2l0eQorICogbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzCisgKiBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBzdHJpcC5jCVRoaXMgbW9kdWxlIGltcGxlbWVudHMgU3Rhcm1vZGUgUmFkaW8gSVAgKFNUUklQKQorICoJCWZvciBrZXJuZWwtYmFzZWQgZGV2aWNlcyBsaWtlIFRUWS4gIEl0IGludGVyZmFjZXMgYmV0d2VlbiBhCisgKgkJcmF3IFRUWSwgYW5kIHRoZSBrZXJuZWwncyBJTkVUIHByb3RvY29sIGxheWVycyAodmlhIERESSkuCisgKgorICogVmVyc2lvbjoJQCgjKXN0cmlwLmMJMS4zCUp1bHkgMTk5NworICoKKyAqIEF1dGhvcjoJU3R1YXJ0IENoZXNoaXJlIDxjaGVzaGlyZUBjcy5zdGFuZm9yZC5lZHU+CisgKgorICogRml4ZXM6CXYwLjkgMTJ0aCBGZWIgMTk5NiAoU0MpCisgKgkJTmV3IGJ5dGUgc3R1ZmZpbmcgKDIrNiBydW4tbGVuZ3RoIGVuY29kaW5nKQorICoJCU5ldyB3YXRjaGRvZyB0aW1lciB0YXNrCisgKgkJTmV3IFByb3RvY29sIGtleSAoU0lQMCkKKyAqCQkKKyAqCQl2MC45LjEgM3JkIE1hcmNoIDE5OTYgKFNDKQorICoJCUNoYW5nZWQgdG8gZHluYW1pYyBkZXZpY2UgYWxsb2NhdGlvbiAtLSBubyBtb3JlIGNvbXBpbGUKKyAqCQl0aW1lIChvciBib290IHRpbWUpIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgU1RSSVAgZGV2aWNlcy4KKyAqCQkKKyAqCQl2MC45LjIgMTN0aCBNYXJjaCAxOTk2IChTQykKKyAqCQlVc2VzIGFycCBjYWNoZSBsb29rdXBzIChidXQgZG9lc24ndCBzZW5kIGFycCBwYWNrZXRzIHlldCkKKyAqCQkKKyAqCQl2MC45LjMgMTd0aCBBcHJpbCAxOTk2IChTQykKKyAqCQlGaXhlZCBidWcgd2hlcmUgU1RSX0VSUk9SIGZsYWcgd2FzIGdldHRpbmcgc2V0IHVubmVjY2Vzc2FyaWx5CisgKgkJKGNhdXNpbmcgb3RoZXJ3aXNlIGdvb2QgcGFja2V0cyB0byBiZSB1bm5lY2Nlc3NhcmlseSBkcm9wcGVkKQorICoJCQorICoJCXYwLjkuNCAyN3RoIEFwcmlsIDE5OTYgKFNDKQorICoJCUZpcnN0IGF0dGVtcHQgYXQgdXNpbmcgIiZDT01NQU5EIiBTdGFybW9kZSBBVCBjb21tYW5kcworICoJCQorICoJCXYwLjkuNSAyOXRoIE1heSAxOTk2IChTQykKKyAqCQlGaXJzdCBhdHRlbXB0IGF0IHNlbmRpbmcgKHVuaWNhc3QpIEFSUCBwYWNrZXRzCisgKgkJCisgKgkJdjAuOS42IDV0aCBKdW5lIDE5OTYgKEVsbGlvdCkKKyAqCQlQdXQgIm1lc3NhZ2UgbGV2ZWwiIHRhZ3MgaW4gZXZlcnkgInByaW50ayIgc3RhdGVtZW50CisgKgkJCisgKgkJdjAuOS43IDEzdGggSnVuZSAxOTk2IChsYWlrKQorICoJCUFkZGVkIHN1cHBvcnQgZm9yIHRoZSAvcHJvYyBmcworICoKKyAqICAgICAgICAgICAgICB2MC45LjggSnVseSAxOTk2IChNZW1hKQorICogICAgICAgICAgICAgIEFkZGVkIHBhY2tldCBsb2dnaW5nCisgKgorICogICAgICAgICAgICAgIHYxLjAgTm92ZW1iZXIgMTk5NiAoU0MpCisgKiAgICAgICAgICAgICAgRml4ZWQgKHNldmVyZSkgbWVtb3J5IGxlYWtzIGluIHRoZSAvcHJvYyBmcyBjb2RlCisgKiAgICAgICAgICAgICAgRml4ZWQgcmFjZSBjb25kaXRpb25zIGluIHRoZSBsb2dnaW5nIGNvZGUKKyAqCisgKiAgICAgICAgICAgICAgdjEuMSBKYW51YXJ5IDE5OTcgKFNDKQorICogICAgICAgICAgICAgIERlbGV0ZWQgcGFja2V0IGxvZ2dpbmcgKHVzZSB0Y3BkdW1wIGluc3RlYWQpCisgKiAgICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgTWV0cmljb20gRmlybXdhcmUgdjIwNCBmZWF0dXJlcworICogICAgICAgICAgICAgIChsaWtlIG1lc3NhZ2UgY2hlY2tzdW1zKQorICoKKyAqICAgICAgICAgICAgICB2MS4yIEphbnVhcnkgMTk5NyAoU0MpCisgKiAgICAgICAgICAgICAgUHV0IHBvcnRhYmxlcyBsaXN0IGJhY2sgaW4KKyAqCisgKiAgICAgICAgICAgICAgdjEuMyBKdWx5IDE5OTcgKFNDKQorICogICAgICAgICAgICAgIE1hZGUgU1RSSVAgZHJpdmVyIHNldCB0aGUgcmFkaW8ncyBiYXVkIHJhdGUgYXV0b21hdGljYWxseS4KKyAqICAgICAgICAgICAgICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJpbHkgdG8gbWFudWFsbHkgc2V0IHRoZSByYWRpbydzCisgKiAgICAgICAgICAgICAgcmF0ZSBwZXJtYW5lbnRseSB0byAxMTUyMDAgLS0gdGhlIGRyaXZlciBoYW5kbGVzIHNldHRpbmcKKyAqICAgICAgICAgICAgICB0aGUgcmF0ZSBhdXRvbWF0aWNhbGx5LgorICovCisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBjb25zdCBjaGFyIFN0cmlwVmVyc2lvbltdID0gIjEuM0EtU1RVQVJULkNIRVNISVJFLU1PRFVMQVIiOworI2Vsc2UKK3N0YXRpYyBjb25zdCBjaGFyIFN0cmlwVmVyc2lvbltdID0gIjEuM0EtU1RVQVJULkNIRVNISVJFIjsKKyNlbmRpZgorCisjZGVmaW5lIFRJQ0tMRV9USU1FUlMgMAorI2RlZmluZSBFWFRfQ09VTlRFUlMgMQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBIZWFkZXIgZmlsZXMJCQkJCQkJCSovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyMgaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9zdHJpcC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbFAuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBVc2VmdWwgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMJCQkJCSovCisKKy8qCisgKiBBIE1ldHJpY29tS2V5IGlkZW50aWZpZXMgdGhlIHByb3RvY29sIGJlaW5nIGNhcnJpZWQgaW5zaWRlIGEgTWV0cmljb20KKyAqIFN0YXJtb2RlIHBhY2tldC4KKyAqLworCit0eXBlZGVmIHVuaW9uIHsKKwlfX3U4IGNbNF07CisJX191MzIgbDsKK30gTWV0cmljb21LZXk7CisKKy8qCisgKiBBbiBJUCBhZGRyZXNzIGNhbiBiZSB2aWV3ZWQgYXMgZm91ciBieXRlcyBpbiBtZW1vcnkgKHdoaWNoIGlzIHdoYXQgaXQgaXMpIG9yIGFzCisgKiBhIHNpbmdsZSAzMi1iaXQgbG9uZyAod2hpY2ggaXMgY29udmVuaWVudCBmb3IgYXNzaWdubWVudCwgZXF1YWxpdHkgdGVzdGluZyBldGMuKQorICovCisKK3R5cGVkZWYgdW5pb24geworCV9fdTggYls0XTsKKwlfX3UzMiBsOworfSBJUGFkZHI7CisKKy8qCisgKiBBIE1ldHJpY29tQWRkcmVzc1N0cmluZyBpcyB1c2VkIHRvIGhvbGQgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YKKyAqIGEgTWV0cmljb20gYWRkcmVzcy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJX191OCBjWzI0XTsKK30gTWV0cmljb21BZGRyZXNzU3RyaW5nOworCisvKiBFbmNhcHN1bGF0aW9uIGNhbiBleHBhbmQgcGFja2V0IG9mIHNpemUgeCB0byA2NS82NHggKyAxCisgKiBTZW50IHBhY2tldCBsb29rcyBsaWtlICI8Q1I+KjxhZGRyZXNzPio8a2V5PjxlbmNhcHMgcGF5bG9hZD48Q1I+IgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAxIDEgICAxLTE4ICAxICA0ICAgICAgICAgPyAgICAgICAgIDEKKyAqIGVnLiAgICAgICAgICAgICAgICAgICAgIDxDUj4qMDAwMC0xMjM0KlNJUDA8ZW5jYXBzIHBheWxvYWQ+PENSPgorICogV2UgYWxsb3cgMzEgYnl0ZXMgZm9yIHRoZSBzdGFycywgdGhlIGtleSwgdGhlIGFkZHJlc3MgYW5kIHRoZSA8Q1I+cworICovCisjZGVmaW5lIFNUUklQX0VOQ0FQX1NJWkUoWCkgKDMyICsgKFgpKjY1TC82NEwpCisKKy8qCisgKiBBIFNUUklQX0hlYWRlciBpcyBuZXZlciByZWFsbHkgc2VudCBvdmVyIHRoZSByYWRpbywgYnV0IG1ha2luZyBhIGR1bW15CisgKiBoZWFkZXIgZm9yIGludGVybmFsIHVzZSB3aXRoaW4gdGhlIGtlcm5lbCB0aGF0IGxvb2tzIGxpa2UgYW4gRXRoZXJuZXQKKyAqIGhlYWRlciBtYWtlcyBjZXJ0YWluIG90aGVyIHNvZnR3YXJlIGhhcHBpZXIuIEZvciBleGFtcGxlLCB0Y3BkdW1wCisgKiBhbHJlYWR5IHVuZGVyc3RhbmRzIEV0aGVybmV0IGhlYWRlcnMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCU1ldHJpY29tQWRkcmVzcyBkc3RfYWRkcjsJLyogRGVzdGluYXRpb24gYWRkcmVzcywgZS5nLiAiMDAwMC0xMjM0IiAgICovCisJTWV0cmljb21BZGRyZXNzIHNyY19hZGRyOwkvKiBTb3VyY2UgYWRkcmVzcywgZS5nLiAiMDAwMC01Njc4IiAgICAgICAgKi8KKwl1bnNpZ25lZCBzaG9ydCBwcm90b2NvbDsJLyogVGhlIHByb3RvY29sIHR5cGUsIHVzaW5nIEV0aGVybmV0IGNvZGVzICovCit9IFNUUklQX0hlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIgY1s2MF07Cit9IE1ldHJpY29tTm9kZTsKKworI2RlZmluZSBOT0RFX1RBQkxFX1NJWkUgMzIKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lc3RhbXA7CisJaW50IG51bV9ub2RlczsKKwlNZXRyaWNvbU5vZGUgbm9kZVtOT0RFX1RBQkxFX1NJWkVdOworfSBNZXRyaWNvbU5vZGVUYWJsZTsKKworZW51bSB7IEZBTFNFID0gMCwgVFJVRSA9IDEgfTsKKworLyoKKyAqIEhvbGRzIHRoZSByYWRpbydzIGZpcm13YXJlIHZlcnNpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyIGNbNTBdOworfSBGaXJtd2FyZVZlcnNpb247CisKKy8qCisgKiBIb2xkcyB0aGUgcmFkaW8ncyBzZXJpYWwgbnVtYmVyLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJY2hhciBjWzE4XTsKK30gU2VyaWFsTnVtYmVyOworCisvKgorICogSG9sZHMgdGhlIHJhZGlvJ3MgYmF0dGVyeSB2b2x0YWdlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJY2hhciBjWzExXTsKK30gQmF0dGVyeVZvbHRhZ2U7CisKK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyIGNbOF07Cit9IGNoYXI4OworCitlbnVtIHsKKwlOb1N0cnVjdHVyZSA9IDAsCS8qIFJlYWxseSBvbGQgZmlybXdhcmUgKi8KKwlTdHJ1Y3R1cmVkTWVzc2FnZXMgPSAxLAkvKiBQYXJzYWJsZSBBVCByZXNwb25zZSBtc2dzICovCisJQ2hlY2tzdW1tZWRNZXNzYWdlcyA9IDIJLyogUGFyc2FibGUgQVQgcmVzcG9uc2UgbXNncyB3aXRoIGNoZWNrc3VtcyAqLworfSBGaXJtd2FyZUxldmVsOworCitzdHJ1Y3Qgc3RyaXAgeworCWludCBtYWdpYzsKKwkvKgorCSAqIFRoZXNlIGFyZSBwb2ludGVycyB0byB0aGUgbWFsbG9jKCllZCBmcmFtZSBidWZmZXJzLgorCSAqLworCisJdW5zaWduZWQgY2hhciAqcnhfYnVmZjsJLyogYnVmZmVyIGZvciByZWNlaXZlZCBJUCBwYWNrZXQgKi8KKwl1bnNpZ25lZCBjaGFyICpzeF9idWZmOwkvKiBidWZmZXIgZm9yIHJlY2VpdmVkIHNlcmlhbCBkYXRhICovCisJaW50IHN4X2NvdW50OwkJLyogcmVjZWl2ZWQgc2VyaWFsIGRhdGEgY291bnRlciAqLworCWludCBzeF9zaXplOwkJLyogU2VyaWFsIGJ1ZmZlciBzaXplICAgICAgICAgICAqLworCXVuc2lnbmVkIGNoYXIgKnR4X2J1ZmY7CS8qIHRyYW5zbWl0dGVyIGJ1ZmZlciAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyICp0eF9oZWFkOwkvKiBwb2ludGVyIHRvIG5leHQgYnl0ZSB0byBYTUlUICovCisJaW50IHR4X2xlZnQ7CQkvKiBieXRlcyBsZWZ0IGluIFhNSVQgcXVldWUgICAgICovCisJaW50IHR4X3NpemU7CQkvKiBTZXJpYWwgYnVmZmVyIHNpemUgICAgICAgICAgICovCisKKwkvKgorCSAqIFNUUklQIGludGVyZmFjZSBzdGF0aXN0aWNzLgorCSAqLworCisJdW5zaWduZWQgbG9uZyByeF9wYWNrZXRzOwkvKiBpbmJvdW5kIGZyYW1lcyBjb3VudGVyICAgICAgICovCisJdW5zaWduZWQgbG9uZyB0eF9wYWNrZXRzOwkvKiBvdXRib3VuZCBmcmFtZXMgY291bnRlciAgICAgICovCisJdW5zaWduZWQgbG9uZyByeF9lcnJvcnM7CS8qIFBhcml0eSwgZXRjLiBlcnJvcnMgICAgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIHR4X2Vycm9yczsJLyogUGxhbm5lZCBzdHVmZiAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgcnhfZHJvcHBlZDsJLyogTm8gbWVtb3J5IGZvciBza2IgICAgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgdHhfZHJvcHBlZDsJLyogV2hlbiBNVFUgY2hhbmdlICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgcnhfb3Zlcl9lcnJvcnM7CS8qIEZyYW1lIGJpZ2dlciB0aGVuIFNUUklQIGJ1Zi4gKi8KKworCXVuc2lnbmVkIGxvbmcgcHBzX3RpbWVyOwkvKiBUaW1lciB0byBkZXRlcm1pbmUgcHBzICAgICAgICovCisJdW5zaWduZWQgbG9uZyByeF9wcHNfY291bnQ7CS8qIENvdW50ZXIgdG8gZGV0ZXJtaW5lIHBwcyAgICAgKi8KKwl1bnNpZ25lZCBsb25nIHR4X3Bwc19jb3VudDsJLyogQ291bnRlciB0byBkZXRlcm1pbmUgcHBzICAgICAqLworCXVuc2lnbmVkIGxvbmcgc3hfcHBzX2NvdW50OwkvKiBDb3VudGVyIHRvIGRldGVybWluZSBwcHMgICAgICovCisJdW5zaWduZWQgbG9uZyByeF9hdmVyYWdlX3BwczsJLyogcnggcGFja2V0cyBwZXIgc2Vjb25kICogOCAgICAqLworCXVuc2lnbmVkIGxvbmcgdHhfYXZlcmFnZV9wcHM7CS8qIHR4IHBhY2tldHMgcGVyIHNlY29uZCAqIDggICAgKi8KKwl1bnNpZ25lZCBsb25nIHN4X2F2ZXJhZ2VfcHBzOwkvKiBzZW50IHBhY2tldHMgcGVyIHNlY29uZCAqIDggICovCisKKyNpZmRlZiBFWFRfQ09VTlRFUlMKKwl1bnNpZ25lZCBsb25nIHJ4X2J5dGVzOwkJLyogdG90YWwgcmVjZWl2ZWQgYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nIHR4X2J5dGVzOwkJLyogdG90YWwgcmVjZWl2ZWQgYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X3JieXRlczsJLyogYnl0ZXMgdGhydSByYWRpbyBpL2YgKi8KKwl1bnNpZ25lZCBsb25nIHR4X3JieXRlczsJLyogYnl0ZXMgdGhydSByYWRpbyBpL2YgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X3NieXRlczsJLyogdG90IGJ5dGVzIHRocnUgc2VyaWFsIGkvZiAqLworCXVuc2lnbmVkIGxvbmcgdHhfc2J5dGVzOwkvKiB0b3QgYnl0ZXMgdGhydSBzZXJpYWwgaS9mICovCisJdW5zaWduZWQgbG9uZyByeF9lYnl0ZXM7CS8qIHRvdCBzdGF0L2VyciBieXRlcyAqLworCXVuc2lnbmVkIGxvbmcgdHhfZWJ5dGVzOwkvKiB0b3Qgc3RhdC9lcnIgYnl0ZXMgKi8KKyNlbmRpZgorCisJLyoKKwkgKiBJbnRlcm5hbCB2YXJpYWJsZXMuCisJICovCisKKwlzdHJ1Y3QgbGlzdF9oZWFkICBsaXN0OwkJLyogTGlua2VkIGxpc3Qgb2YgZGV2aWNlcyAqLworCisJaW50IGRpc2NhcmQ7CQkJLyogU2V0IGlmIHNlcmlhbCBlcnJvciAgICAgICAgICAqLworCWludCB3b3JraW5nOwkJCS8qIElzIHJhZGlvIHdvcmtpbmcgY29ycmVjdGx5PyAgKi8KKwlpbnQgZmlybXdhcmVfbGV2ZWw7CQkvKiBNZXNzYWdlIHN0cnVjdHVyaW5nIGxldmVsICAgICovCisJaW50IG5leHRfY29tbWFuZDsJCS8qIE5leHQgcGVyaW9kaWMgY29tbWFuZCAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgdXNlcl9iYXVkOwkJLyogVGhlIHVzZXItc2VsZWN0ZWQgYmF1ZCByYXRlICAqLworCWludCBtdHU7CQkJLyogT3VyIG10dSAodG8gc3BvdCBjaGFuZ2VzISkgICAqLworCWxvbmcgd2F0Y2hkb2dfZG9wcm9iZTsJCS8qIE5leHQgdGltZSB0byB0ZXN0IHRoZSByYWRpbyAgKi8KKwlsb25nIHdhdGNoZG9nX2RvcmVzZXQ7CQkvKiBUaW1lIHRvIGRvIG5leHQgcmVzZXQgICAgICAgICovCisJbG9uZyBncmF0dWl0b3VzX2FycDsJCS8qIFRpbWUgdG8gc2VuZCBuZXh0IEFSUCByZWZyZXNoICovCisJbG9uZyBhcnBfaW50ZXJ2YWw7CQkvKiBOZXh0IEFSUCBpbnRlcnZhbCAgICAgICAgICAgICovCisJc3RydWN0IHRpbWVyX2xpc3QgaWRsZV90aW1lcjsJLyogRm9yIHBlcmlvZGljIHdha2V1cCBjYWxscyAgICAqLworCU1ldHJpY29tQWRkcmVzcyB0cnVlX2Rldl9hZGRyOwkvKiBUcnVlIGFkZHJlc3Mgb2YgcmFkaW8gICAgICAgICovCisJaW50IG1hbnVhbF9kZXZfYWRkcjsJCS8qIEhhY2s6IFNlZSBub3RlIGJlbG93ICAgICAgICAgKi8KKworCUZpcm13YXJlVmVyc2lvbiBmaXJtd2FyZV92ZXJzaW9uOwkvKiBUaGUgcmFkaW8ncyBmaXJtd2FyZSB2ZXJzaW9uICovCisJU2VyaWFsTnVtYmVyIHNlcmlhbF9udW1iZXI7CS8qIFRoZSByYWRpbydzIHNlcmlhbCBudW1iZXIgICAgKi8KKwlCYXR0ZXJ5Vm9sdGFnZSBiYXR0ZXJ5X3ZvbHRhZ2U7CS8qIFRoZSByYWRpbydzIGJhdHRlcnkgdm9sdGFnZSAgKi8KKworCS8qCisJICogT3RoZXIgdXNlZnVsIHN0cnVjdHVyZXMuCisJICovCisKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwkJLyogcHRyIHRvIFRUWSBzdHJ1Y3R1cmUgICAgICAgICAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CQkvKiBPdXIgZGV2aWNlIHN0cnVjdHVyZSAgICAgICAgICovCisKKwkvKgorCSAqIE5laWdoYm91ciByYWRpbyByZWNvcmRzCisJICovCisKKwlNZXRyaWNvbU5vZGVUYWJsZSBwb3J0YWJsZXM7CisJTWV0cmljb21Ob2RlVGFibGUgcG9sZXRvcHM7Cit9OworCisvKgorICogTm90ZTogbWFudWFsX2Rldl9hZGRyIGhhY2sKKyAqIAorICogSXQgaXMgbm90IHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgaGFyZHdhcmUgYWRkcmVzcyBvZiBhIE1ldHJpY29tIHJhZGlvLAorICogb3IgdG8gc2VuZCBwYWNrZXRzIHdpdGggYSB1c2VyLXNwZWNpZmllZCBoYXJkd2FyZSBzb3VyY2UgYWRkcmVzcywgdGh1cworICogdHJ5aW5nIHRvIG1hbnVhbGx5IHNldCBhIGhhcmR3YXJlIHNvdXJjZSBhZGRyZXNzIGlzIGEgcXVlc3Rpb25hYmxlCisgKiB0aGluZyB0byBkby4gIEhvd2V2ZXIsIGlmIHRoZSB1c2VyICpkb2VzKiBtYW51YWxseSBzZXQgdGhlIGhhcmR3YXJlCisgKiBzb3VyY2UgYWRkcmVzcyBvZiBhIFNUUklQIGludGVyZmFjZSwgdGhlbiB0aGUga2VybmVsIHdpbGwgYmVsaWV2ZSBpdCwKKyAqIGFuZCB1c2UgaXQgaW4gY2VydGFpbiBwbGFjZXMuIEZvciBleGFtcGxlLCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBsaXN0ZWQKKyAqIGJ5IGlmY29uZmlnIHdpbGwgYmUgdGhlIG1hbnVhbCBhZGRyZXNzLCBub3QgdGhlIHRydWUgb25lLgorICogKEJvdGggYWRkcmVzc2VzIGFyZSBsaXN0ZWQgaW4gL3Byb2MvbmV0L3N0cmlwLikKKyAqIEFsc28sIEFSUCBwYWNrZXRzIHdpbGwgYmUgc2VudCBvdXQgZ2l2aW5nIHRoZSB1c2VyLXNwZWNpZmllZCBhZGRyZXNzIGFzCisgKiB0aGUgc291cmNlIGFkZHJlc3MsIG5vdCB0aGUgcmVhbCBhZGRyZXNzLiBUaGlzIGlzIGRhbmdlcm91cywgYmVjYXVzZQorICogaXQgbWVhbnMgeW91IHdvbid0IHJlY2VpdmUgYW55IHJlcGxpZXMgLS0gdGhlIEFSUCByZXBsaWVzIHdpbGwgZ28gdG8KKyAqIHRoZSBzcGVjaWZpZWQgYWRkcmVzcywgd2hpY2ggd2lsbCBiZSBzb21lIG90aGVyIHJhZGlvLiBUaGUgY2FzZSB3aGVyZQorICogdGhpcyBpcyB1c2VmdWwgaXMgd2hlbiB0aGF0IG90aGVyIHJhZGlvIGlzIGFsc28gY29ubmVjdGVkIHRvIHRoZSBzYW1lCisgKiBtYWNoaW5lLiBUaGlzIGFsbG93cyB5b3UgdG8gY29ubmVjdCBhIHBhaXIgb2YgcmFkaW9zIHRvIG9uZSBtYWNoaW5lLAorICogYW5kIHRvIHVzZSBvbmUgZXhjbHVzaXZlbHkgZm9yIGluYm91bmQgdHJhZmZpYywgYW5kIHRoZSBvdGhlcgorICogZXhjbHVzaXZlbHkgZm9yIG91dGJvdW5kIHRyYWZmaWMuIFByZXR0eSBuZWF0LCBodWg/CisgKiAKKyAqIEhlcmUncyB0aGUgZnVsbCBwcm9jZWR1cmUgdG8gc2V0IHRoaXMgdXA6CisgKiAKKyAqIDEuICJzbGF0dGFjaCIgdHdvIGludGVyZmFjZXMsIGUuZy4gc3QwIGZvciBvdXRnb2luZyBwYWNrZXRzLAorICogICAgYW5kIHN0MSBmb3IgaW5jb21pbmcgcGFja2V0cworICogCisgKiAyLiAiaWZjb25maWciIHN0MCAob3V0Ym91bmQgcmFkaW8pIHRvIGhhdmUgdGhlIGhhcmR3YXJlIGFkZHJlc3MKKyAqICAgIHdoaWNoIGlzIHRoZSByZWFsIGhhcmR3YXJlIGFkZHJlc3Mgb2Ygc3QxIChpbmJvdW5kIHJhZGlvKS4KKyAqICAgIE5vdyB3aGVuIGl0IHNlbmRzIG91dCBwYWNrZXRzLCBpdCB3aWxsIG1hc3F1ZXJhZGUgYXMgc3QxLCBhbmQKKyAqICAgIHJlcGxpZXMgd2lsbCBiZSBzZW50IHRvIHRoYXQgcmFkaW8sIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB3ZSB3YW50LgorICogCisgKiAzLiBTZXQgdGhlIHJvdXRlIHRhYmxlIGVudHJ5ICgicm91dGUgYWRkIGRlZmF1bHQgLi4uIiBvcgorICogICAgInJvdXRlIGFkZCAtbmV0IC4uLiIsIGFzIGFwcHJvcHJpYXRlKSB0byBzZW5kIHBhY2tldHMgdmlhIHRoZSBzdDAKKyAqICAgIGludGVyZmFjZSAob3V0Ym91bmQgcmFkaW8pLiBEbyBub3QgYWRkIGFueSByb3V0ZSB3aGljaCBzZW5kcyBwYWNrZXRzCisgKiAgICBvdXQgdmlhIHRoZSBzdDEgaW50ZXJmYWNlIC0tIHRoYXQgcmFkaW8gaXMgZm9yIGluYm91bmQgdHJhZmZpYyBvbmx5LgorICogCisgKiA0LiAiaWZjb25maWciIHN0MSAoaW5ib3VuZCByYWRpbykgdG8gaGF2ZSBoYXJkd2FyZSBhZGRyZXNzIHplcm8uCisgKiAgICBUaGlzIHRlbGxzIHRoZSBTVFJJUCBkcml2ZXIgdG8gInNodXQgZG93biIgdGhhdCBpbnRlcmZhY2UgYW5kIG5vdAorICogICAgc2VuZCBhbnkgcGFja2V0cyB0aHJvdWdoIGl0LiBJbiBwYXJ0aWN1bGFyLCBpdCBzdG9wcyBzZW5kaW5nIHRoZQorICogICAgcGVyaW9kaWMgZ3JhdHVpdG91cyBBUlAgcGFja2V0cyB0aGF0IGEgU1RSSVAgaW50ZXJmYWNlIG5vcm1hbGx5IHNlbmRzLgorICogICAgQWxzbywgd2hlbiBwYWNrZXRzIGFycml2ZSBvbiB0aGF0IGludGVyZmFjZSwgaXQgd2lsbCBzZWFyY2ggdGhlCisgKiAgICBpbnRlcmZhY2UgbGlzdCB0byBzZWUgaWYgdGhlcmUgaXMgYW5vdGhlciBpbnRlcmZhY2Ugd2hvJ3MgbWFudWFsCisgKiAgICBoYXJkd2FyZSBhZGRyZXNzIG1hdGNoZXMgaXRzIG93biByZWFsIGFkZHJlc3MgKGkuZS4gc3QwIGluIHRoaXMKKyAqICAgIGV4YW1wbGUpIGFuZCBpZiBzbyBpdCB3aWxsIHRyYW5zZmVyIG93bmVyc2hpcCBvZiB0aGUgc2tidWZmIHRvCisgKiAgICB0aGF0IGludGVyZmFjZSwgc28gdGhhdCBpdCBsb29rcyB0byB0aGUga2VybmVsIGFzIGlmIHRoZSBwYWNrZXQKKyAqICAgIGFycml2ZWQgb24gdGhhdCBpbnRlcmZhY2UuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2hlbiB0aGUKKyAqICAgIGtlcm5lbCBzZW5kcyBhbiBBUlAgcGFja2V0IG9uIHN0MCwgaXQgZXhwZWN0cyB0byBnZXQgYSByZXBseSBvbgorICogICAgc3QwLCBhbmQgaWYgaXQgc2VlcyB0aGUgcmVwbHkgY29tZSBmcm9tIHN0MSB0aGVuIGl0IHdpbGwgaWdub3JlCisgKiAgICBpdCAodG8gYmUgYWNjdXJhdGUsIGl0IHB1dHMgdGhlIGVudHJ5IGluIHRoZSBBUlAgdGFibGUsIGJ1dAorICogICAgbGFiZWxsZWQgaW4gc3VjaCBhIHdheSB0aGF0IHN0MCBjYW4ndCB1c2UgaXQpLgorICogCisgKiBUaGFua3MgdG8gUGV0cm9zIE1hbmlhdGlzIGZvciBjb21pbmcgdXAgd2l0aCB0aGUgaWRlYSBvZiBzcGxpdHRpbmcKKyAqIGluYm91bmQgYW5kIG91dGJvdW5kIHRyYWZmaWMgYmV0d2VlbiB0d28gaW50ZXJmYWNlcywgd2hpY2ggdHVybmVkCisgKiBvdXQgdG8gYmUgcmVhbGx5IGVhc3kgdG8gaW1wbGVtZW50LCBldmVuIGlmIGl0IGlzIGEgYml0IG9mIGEgaGFjay4KKyAqIAorICogSGF2aW5nIHNldCBhIG1hbnVhbCBhZGRyZXNzIG9uIGFuIGludGVyZmFjZSwgeW91IGNhbiByZXN0b3JlIGl0CisgKiB0byBhdXRvbWF0aWMgb3BlcmF0aW9uICh3aGVyZSB0aGUgYWRkcmVzcyBpcyBhdXRvbWF0aWNhbGx5IGtlcHQKKyAqIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVhbCBhZGRyZXNzIG9mIHRoZSByYWRpbykgYnkgc2V0dGluZyBhIG1hbnVhbAorICogYWRkcmVzcyBvZiBhbGwgb25lcywgZS5nLiAiaWZjb25maWcgc3QwIGh3IHN0cmlwIEZGRkZGRkZGRkZGRiIKKyAqIFRoaXMgJ3R1cm5zIG9mZicgbWFudWFsIG92ZXJyaWRlIG1vZGUgZm9yIHRoZSBkZXZpY2UgYWRkcmVzcy4KKyAqIAorICogTm90ZTogVGhlIElFRUUgODAyIGhlYWRlcnMgcmVwb3J0ZWQgaW4gdGNwZHVtcCB3aWxsIHNob3cgdGhlICpyZWFsKgorICogcmFkaW8gYWRkcmVzc2VzIHRoZSBwYWNrZXRzIHdlcmUgc2VudCBhbmQgcmVjZWl2ZWQgZnJvbSwgc28gdGhhdCB5b3UKKyAqIGNhbiBzZWUgd2hhdCBpcyByZWFsbHkgZ29pbmcgb24gd2l0aCBwYWNrZXRzLCBhbmQgd2hpY2ggaW50ZXJmYWNlcworICogdGhleSBhcmUgcmVhbGx5IGdvaW5nIHRocm91Z2guCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ29uc3RhbnRzCQkJCQkJCQkqLworCisvKgorICogQ29tbWFuZFN0cmluZzEgd29ya3Mgb24gYWxsIHJhZGlvcworICogT3RoZXIgQ29tbWFuZFN0cmluZ3MgYXJlIG9ubHkgdXNlZCB3aXRoIGZpcm13YXJlIHRoYXQgcHJvdmlkZXMgc3RydWN0dXJlZCByZXNwb25zZXMuCisgKiAKKyAqIGF0czMxOT0xIEVuYWJsZXMgSW5mbyBtZXNzYWdlIGZvciBub2RlIGFkZGl0aW9ucyBhbmQgZGVsZXRpb25zCisgKiBhdHMzMTk9MiBFbmFibGVzIEluZm8gbWVzc2FnZSBmb3IgYSBuZXcgYmVzdCBub2RlCisgKiBhdHMzMTk9NCBFbmFibGVzIGNoZWNrc3VtcworICogYXRzMzE5PTggRW5hYmxlcyBBQ0sgbWVzc2FnZXMKKyAqLworCitzdGF0aWMgY29uc3QgaW50IE1heENvbW1hbmRTdHJpbmdMZW5ndGggPSAzMjsKK3N0YXRpYyBjb25zdCBpbnQgQ29tcGF0aWJpbGl0eUNvbW1hbmQgPSAxOworCitzdGF0aWMgY29uc3QgY2hhciBDb21tYW5kU3RyaW5nMFtdID0gIiomQ09NTUFORCpBVFMzMTk9NyI7CS8qIFR1cm4gb24gY2hlY2tzdW1zICYgaW5mbyBtZXNzYWdlcyAqLworc3RhdGljIGNvbnN0IGNoYXIgQ29tbWFuZFN0cmluZzFbXSA9ICIqJkNPTU1BTkQqQVRTMzA1PyI7CS8qIFF1ZXJ5IHJhZGlvIG5hbWUgKi8KK3N0YXRpYyBjb25zdCBjaGFyIENvbW1hbmRTdHJpbmcyW10gPSAiKiZDT01NQU5EKkFUUzMyNT8iOwkvKiBRdWVyeSBiYXR0ZXJ5IHZvbHRhZ2UgKi8KK3N0YXRpYyBjb25zdCBjaGFyIENvbW1hbmRTdHJpbmczW10gPSAiKiZDT01NQU5EKkFUUzMwMD8iOwkvKiBRdWVyeSB2ZXJzaW9uIGluZm9ybWF0aW9uICovCitzdGF0aWMgY29uc3QgY2hhciBDb21tYW5kU3RyaW5nNFtdID0gIiomQ09NTUFORCpBVFMzMTE/IjsJLyogUXVlcnkgcG9sZXRvcCBsaXN0ICovCitzdGF0aWMgY29uc3QgY2hhciBDb21tYW5kU3RyaW5nNVtdID0gIiomQ09NTUFORCpBVH5MQSI7CQkvKiBRdWVyeSBwb3J0YWJsZXMgbGlzdCAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKnN0cmluZzsKKwlsb25nIGxlbmd0aDsKK30gU3RyaW5nRGVzY3JpcHRvcjsKKworc3RhdGljIGNvbnN0IFN0cmluZ0Rlc2NyaXB0b3IgQ29tbWFuZFN0cmluZ1tdID0geworCXtDb21tYW5kU3RyaW5nMCwgc2l6ZW9mKENvbW1hbmRTdHJpbmcwKSAtIDF9LAorCXtDb21tYW5kU3RyaW5nMSwgc2l6ZW9mKENvbW1hbmRTdHJpbmcxKSAtIDF9LAorCXtDb21tYW5kU3RyaW5nMiwgc2l6ZW9mKENvbW1hbmRTdHJpbmcyKSAtIDF9LAorCXtDb21tYW5kU3RyaW5nMywgc2l6ZW9mKENvbW1hbmRTdHJpbmczKSAtIDF9LAorCXtDb21tYW5kU3RyaW5nNCwgc2l6ZW9mKENvbW1hbmRTdHJpbmc0KSAtIDF9LAorCXtDb21tYW5kU3RyaW5nNSwgc2l6ZW9mKENvbW1hbmRTdHJpbmc1KSAtIDF9Cit9OworCisjZGVmaW5lIEdPVF9BTExfUkFESU9fSU5GTyhTKSAgICAgIFwKKyAgICAoKFMpLT5maXJtd2FyZV92ZXJzaW9uLmNbMF0gJiYgXAorICAgICAoUyktPmJhdHRlcnlfdm9sdGFnZS5jWzBdICAmJiBcCisgICAgIG1lbWNtcCgmKFMpLT50cnVlX2Rldl9hZGRyLCB6ZXJvX2FkZHJlc3MuYywgc2l6ZW9mKHplcm9fYWRkcmVzcykpKQorCitzdGF0aWMgY29uc3QgY2hhciBoZXh0YWJsZVsxNl0gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisKK3N0YXRpYyBjb25zdCBNZXRyaWNvbUFkZHJlc3MgemVyb19hZGRyZXNzOworc3RhdGljIGNvbnN0IE1ldHJpY29tQWRkcmVzcyBicm9hZGNhc3RfYWRkcmVzcyA9CisgICAgeyB7MHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRn0gfTsKKworc3RhdGljIGNvbnN0IE1ldHJpY29tS2V5IFNJUDBLZXkgPSB7ICJTSVAwIiB9Oworc3RhdGljIGNvbnN0IE1ldHJpY29tS2V5IEFSUDBLZXkgPSB7ICJBUlAwIiB9Oworc3RhdGljIGNvbnN0IE1ldHJpY29tS2V5IEFUUl9LZXkgPSB7ICJBVFIgIiB9Oworc3RhdGljIGNvbnN0IE1ldHJpY29tS2V5IEFDS19LZXkgPSB7ICJBQ0tfIiB9Oworc3RhdGljIGNvbnN0IE1ldHJpY29tS2V5IElORl9LZXkgPSB7ICJJTkZfIiB9Oworc3RhdGljIGNvbnN0IE1ldHJpY29tS2V5IEVSUl9LZXkgPSB7ICJFUlJfIiB9OworCitzdGF0aWMgY29uc3QgbG9uZyBNYXhBUlBJbnRlcnZhbCA9IDYwICogSFo7CS8qIE9uZSBtaW51dGUgKi8KKworLyoKKyAqIE1heGltdW0gU3Rhcm1vZGUgcGFja2V0IGxlbmd0aCBpcyAxMTgzIGJ5dGVzLiBBbGxvd2luZyA0IGJ5dGVzIGZvcgorICogcHJvdG9jb2wga2V5LCA0IGJ5dGVzIGZvciBjaGVja3N1bSwgb25lIGJ5dGUgZm9yIENSLCBhbmQgNjUvNjQgZXhwYW5zaW9uCisgKiBmb3IgU1RSSVAgZW5jb2RpbmcsIHRoYXQgdHJhbnNsYXRlcyB0byBhIG1heGltdW0gcGF5bG9hZCBNVFUgb2YgMTE1NS4KKyAqIE5vdGU6IEEgc3RhbmRhcmQgTkZTIDFLIGRhdGEgcGFja2V0IGlzIGEgdG90YWwgb2YgMHg0ODAgKDExNTIpIGJ5dGVzCisgKiBsb25nLCBpbmNsdWRpbmcgSVAgaGVhZGVyLCBVRFAgaGVhZGVyLCBhbmQgTkZTIGhlYWRlci4gU2V0dGluZyB0aGUgU1RSSVAKKyAqIE1UVSB0byAxMTUyIGFsbG93cyB1cyB0byBzZW5kIGRlZmF1bHQgc2l6ZWQgTkZTIHBhY2tldHMgd2l0aG91dCBmcmFnbWVudGF0aW9uLgorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTUFYX1NFTkRfTVRVID0gMTE1MjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNQVhfUkVDVl9NVFUgPSAxNTAwOwkvKiBIb3BpbmcgZm9yIEV0aGVybmV0IHNpemVkIHBhY2tldHMgaW4gdGhlIGZ1dHVyZSEgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBERUZBVUxUX1NUUklQX01UVSA9IDExNTI7CitzdGF0aWMgY29uc3QgaW50IFNUUklQX01BR0lDID0gMHg1MzAzOworc3RhdGljIGNvbnN0IGxvbmcgTG9uZ1RpbWUgPSAweDdGRkZGRkZGOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogR2xvYmFsIHZhcmlhYmxlcwkJCQkJCQkqLworCitzdGF0aWMgTElTVF9IRUFEKHN0cmlwX2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhzdHJpcF9sb2NrKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1hY3JvcwkJCQkJCQkJKi8KKworLyogUmV0dXJucyBUUlVFIGlmIHRleHQgVCBiZWdpbnMgd2l0aCBwcmVmaXggUCAqLworI2RlZmluZSBoYXNfcHJlZml4KFQsTCxQKSAoKChMKSA+PSBzaXplb2YoUCktMSkgJiYgIXN0cm5jbXAoKFQpLCAoUCksIHNpemVvZihQKS0xKSkKKworLyogUmV0dXJucyBUUlVFIGlmIHRleHQgVCBvZiBsZW5ndGggTCBpcyBlcXVhbCB0byBzdHJpbmcgUyAqLworI2RlZmluZSB0ZXh0X2VxdWFsKFQsTCxTKSAoKChMKSA9PSBzaXplb2YoUyktMSkgJiYgIXN0cm5jbXAoKFQpLCAoUyksIHNpemVvZihTKS0xKSkKKworI2RlZmluZSBSRUFESEVYKFgpICgoWCk+PScwJyAmJiAoWCk8PSc5JyA/IChYKS0nMCcgOiAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKFgpPj0nYScgJiYgKFgpPD0nZicgPyAoWCktJ2EnKzEwIDogICBcCisgICAgICAgICAgICAgICAgICAgIChYKT49J0EnICYmIChYKTw9J0YnID8gKFgpLSdBJysxMCA6IDAgKQorCisjZGVmaW5lIFJFQURIRVgxNihYKSAoKF9fdTE2KShSRUFESEVYKFgpKSkKKworI2RlZmluZSBSRUFEREVDKFgpICgoWCk+PScwJyAmJiAoWCk8PSc5JyA/IChYKS0nMCcgOiAwKQorCisjZGVmaW5lIEFSUkFZX0VORChYKSAoJigoWClbQVJSQVlfU0laRShYKV0pKQorCisjZGVmaW5lIEpJRkZJRV9UT19TRUMoWCkgKChYKSAvIEhaKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBVdGlsaXR5IHJvdXRpbmVzCQkJCQkJCSovCisKK3N0YXRpYyBpbnQgYXJwX3F1ZXJ5KHVuc2lnbmVkIGNoYXIgKmhhZGRyLCB1MzIgcGFkZHIsCisJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaGJvcl9lbnRyeTsKKworCW5laWdoYm9yX2VudHJ5ID0gbmVpZ2hfbG9va3VwKCZhcnBfdGJsLCAmcGFkZHIsIGRldik7CisKKwlpZiAobmVpZ2hib3JfZW50cnkgIT0gTlVMTCkgeworCQluZWlnaGJvcl9lbnRyeS0+dXNlZCA9IGppZmZpZXM7CisJCWlmIChuZWlnaGJvcl9lbnRyeS0+bnVkX3N0YXRlICYgTlVEX1ZBTElEKSB7CisJCQltZW1jcHkoaGFkZHIsIG5laWdoYm9yX2VudHJ5LT5oYSwgZGV2LT5hZGRyX2xlbik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgRHVtcERhdGEoY2hhciAqbXNnLCBzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sIF9fdTggKiBwdHIsCisJCSAgICAgX191OCAqIGVuZCkKK3sKKwlzdGF0aWMgY29uc3QgaW50IE1BWF9EdW1wRGF0YSA9IDgwOworCV9fdTggcGt0X3RleHRbTUFYX0R1bXBEYXRhXSwgKnAgPSBwa3RfdGV4dDsKKworCSpwKysgPSAnXCInOworCisJd2hpbGUgKHB0ciA8IGVuZCAmJiBwIDwgJnBrdF90ZXh0W01BWF9EdW1wRGF0YSAtIDRdKSB7CisJCWlmICgqcHRyID09ICdcXCcpIHsKKwkJCSpwKysgPSAnXFwnOworCQkJKnArKyA9ICdcXCc7CisJCX0gZWxzZSB7CisJCQlpZiAoKnB0ciA+PSAzMiAmJiAqcHRyIDw9IDEyNikgeworCQkJCSpwKysgPSAqcHRyOworCQkJfSBlbHNlIHsKKwkJCQlzcHJpbnRmKHAsICJcXCUwMlgiLCAqcHRyKTsKKwkJCQlwICs9IDM7CisJCQl9CisJCX0KKwkJcHRyKys7CisJfQorCisJaWYgKHB0ciA9PSBlbmQpCisJCSpwKysgPSAnXCInOworCSpwKysgPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICUtMTNzJXNcbiIsIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgbXNnLCBwa3RfdGV4dCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEJ5dGUgc3R1ZmZpbmcvdW5zdHVmZmluZyByb3V0aW5lcwkJCQkJKi8KKworLyogU3R1ZmZpbmcgc2NoZW1lOgorICogMDAgICAgVW51c2VkIChyZXNlcnZlZCBjaGFyYWN0ZXIpCisgKiAwMS0zRiBSdW4gb2YgMi02NCBkaWZmZXJlbnQgY2hhcmFjdGVycworICogNDAtN0YgUnVuIG9mIDEtNjQgZGlmZmVyZW50IGNoYXJhY3RlcnMgcGx1cyBhIHNpbmdsZSB6ZXJvIGF0IHRoZSBlbmQKKyAqIDgwLUJGIFJ1biBvZiAxLTY0IG9mIHRoZSBzYW1lIGNoYXJhY3RlcgorICogQzAtRkYgUnVuIG9mIDEtNjQgemVyb2VzIChBU0NJSSAwKQorICovCisKK3R5cGVkZWYgZW51bSB7CisJU3R1ZmZfRGlmZiA9IDB4MDAsCisJU3R1ZmZfRGlmZlplcm8gPSAweDQwLAorCVN0dWZmX1NhbWUgPSAweDgwLAorCVN0dWZmX1plcm8gPSAweEMwLAorCVN0dWZmX05vQ29kZSA9IDB4RkYsCS8qIFNwZWNpYWwgY29kZSwgbWVhbmluZyBubyBjb2RlIHNlbGVjdGVkICovCisKKwlTdHVmZl9Db2RlTWFzayA9IDB4QzAsCisJU3R1ZmZfQ291bnRNYXNrID0gMHgzRiwKKwlTdHVmZl9NYXhDb3VudCA9IDB4M0YsCisJU3R1ZmZfTWFnaWMgPSAweDBECS8qIFRoZSB2YWx1ZSB3ZSBhcmUgZWxpbWluYXRpbmcgKi8KK30gU3R1ZmZpbmdDb2RlOworCisvKiBTdHVmZkRhdGEgZW5jb2RlcyB0aGUgZGF0YSBzdGFydGluZyBhdCAic3JjIiBmb3IgImxlbmd0aCIgYnl0ZXMuCisgKiBJdCB3cml0ZXMgaXQgdG8gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5ICJkc3QiICh3aGljaCBtdXN0IGJlIGF0IGxlYXN0CisgKiBhcyBsb25nIGFzIDEgKyA2NS82NCBvZiB0aGUgaW5wdXQgbGVuZ3RoKS4gVGhlIG91dHB1dCBtYXkgYmUgdXAgdG8gMS42JQorICogbGFyZ2VyIHRoYW4gdGhlIGlucHV0IGZvciBwYXRob2xvZ2ljYWwgaW5wdXQsIGJ1dCB3aWxsIHVzdWFsbHkgYmUgc21hbGxlci4KKyAqIFN0dWZmRGF0YSByZXR1cm5zIHRoZSBuZXcgdmFsdWUgb2YgdGhlIGRzdCBwb2ludGVyIGFzIGl0cyByZXN1bHQuCisgKiAiY29kZV9wdHJfcHRyIiBwb2ludHMgdG8gYSAiX191OCAqIiB3aGljaCBpcyB1c2VkIHRvIGhvbGQgZW5jb2Rpbmcgc3RhdGUKKyAqIGJldHdlZW4gY2FsbHMsIGFsbG93aW5nIGFuIGVuY29kZWQgcGFja2V0IHRvIGJlIGluY3JlbWVudGFsbHkgYnVpbHQgdXAKKyAqIGZyb20gc21hbGwgcGFydHMuIE9uIHRoZSBmaXJzdCBjYWxsLCB0aGUgIl9fdTggKiIgcG9pbnRlZCB0byBzaG91bGQgYmUKKyAqIGluaXRpYWxpemVkIHRvIE5VTEw7IGJldHdlZW4gc3Vic2VxdWVudCBjYWxscyB0aGUgY2FsbGluZyByb3V0aW5lIHNob3VsZAorICogbGVhdmUgdGhlIHZhbHVlIGFsb25lIGFuZCBzaW1wbHkgcGFzcyBpdCBiYWNrIHVuY2hhbmdlZCBzbyB0aGF0IHRoZQorICogZW5jb2RlciBjYW4gcmVjb3ZlciBpdHMgY3VycmVudCBzdGF0ZS4KKyAqLworCisjZGVmaW5lIFN0dWZmRGF0YV9GaW5pc2hCbG9jayhYKSBcCisoKmNvZGVfcHRyID0gKFgpIF4gU3R1ZmZfTWFnaWMsIGNvZGUgPSBTdHVmZl9Ob0NvZGUpCisKK3N0YXRpYyBfX3U4ICpTdHVmZkRhdGEoX191OCAqIHNyYywgX191MzIgbGVuZ3RoLCBfX3U4ICogZHN0LAorCQkgICAgICAgX191OCAqKiBjb2RlX3B0cl9wdHIpCit7CisJX191OCAqZW5kID0gc3JjICsgbGVuZ3RoOworCV9fdTggKmNvZGVfcHRyID0gKmNvZGVfcHRyX3B0cjsKKwlfX3U4IGNvZGUgPSBTdHVmZl9Ob0NvZGUsIGNvdW50ID0gMDsKKworCWlmICghbGVuZ3RoKQorCQlyZXR1cm4gKGRzdCk7CisKKwlpZiAoY29kZV9wdHIpIHsKKwkJLyoKKwkJICogUmVjb3ZlciBzdGF0ZSBmcm9tIGxhc3QgY2FsbCwgaWYgYXBwbGljYWJsZQorCQkgKi8KKwkJY29kZSA9ICgqY29kZV9wdHIgXiBTdHVmZl9NYWdpYykgJiBTdHVmZl9Db2RlTWFzazsKKwkJY291bnQgPSAoKmNvZGVfcHRyIF4gU3R1ZmZfTWFnaWMpICYgU3R1ZmZfQ291bnRNYXNrOworCX0KKworCXdoaWxlIChzcmMgPCBlbmQpIHsKKwkJc3dpdGNoIChjb2RlKSB7CisJCQkvKiBTdHVmZl9Ob0NvZGU6IElmIG5vIGN1cnJlbnQgY29kZSwgc2VsZWN0IG9uZSAqLworCQljYXNlIFN0dWZmX05vQ29kZToKKwkJCS8qIFJlY29yZCB3aGVyZSB3ZSdyZSBnb2luZyB0byBwdXQgdGhpcyBjb2RlICovCisJCQljb2RlX3B0ciA9IGRzdCsrOworCQkJY291bnQgPSAwOwkvKiBSZXNldCB0aGUgY291bnQgKHplcm8gbWVhbnMgb25lIGluc3RhbmNlKSAqLworCQkJLyogVGVudGF0aXZlbHkgc3RhcnQgYSBuZXcgYmxvY2sgKi8KKwkJCWlmICgqc3JjID09IDApIHsKKwkJCQljb2RlID0gU3R1ZmZfWmVybzsKKwkJCQlzcmMrKzsKKwkJCX0gZWxzZSB7CisJCQkJY29kZSA9IFN0dWZmX1NhbWU7CisJCQkJKmRzdCsrID0gKnNyYysrIF4gU3R1ZmZfTWFnaWM7CisJCQl9CisJCQkvKiBOb3RlOiBXZSBvcHRpbWlzdGljYWxseSBhc3N1bWUgcnVuIG9mIHNhbWUgLS0gKi8KKwkJCS8qIHdoaWNoIHdpbGwgYmUgZml4ZWQgbGF0ZXIgaW4gU3R1ZmZfU2FtZSAqLworCQkJLyogaWYgaXQgdHVybnMgb3V0IG5vdCB0byBiZSB0cnVlLiAqLworCQkJYnJlYWs7CisKKwkJCS8qIFN0dWZmX1plcm86IFdlIGFscmVhZHkgaGF2ZSBhdCBsZWFzdCBvbmUgemVybyBlbmNvZGVkICovCisJCWNhc2UgU3R1ZmZfWmVybzoKKwkJCS8qIElmIGFub3RoZXIgemVybywgY291bnQgaXQsIGVsc2UgZmluaXNoIHRoaXMgY29kZSBibG9jayAqLworCQkJaWYgKCpzcmMgPT0gMCkgeworCQkJCWNvdW50Kys7CisJCQkJc3JjKys7CisJCQl9IGVsc2UgeworCQkJCVN0dWZmRGF0YV9GaW5pc2hCbG9jayhTdHVmZl9aZXJvICsgY291bnQpOworCQkJfQorCQkJYnJlYWs7CisKKwkJCS8qIFN0dWZmX1NhbWU6IFdlIGFscmVhZHkgaGF2ZSBhdCBsZWFzdCBvbmUgYnl0ZSBlbmNvZGVkICovCisJCWNhc2UgU3R1ZmZfU2FtZToKKwkJCS8qIElmIGFub3RoZXIgb25lIHRoZSBzYW1lLCBjb3VudCBpdCAqLworCQkJaWYgKCgqc3JjIF4gU3R1ZmZfTWFnaWMpID09IGNvZGVfcHRyWzFdKSB7CisJCQkJY291bnQrKzsKKwkJCQlzcmMrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIGVsc2UsIHRoaXMgYnl0ZSBkb2VzIG5vdCBtYXRjaCB0aGlzIGJsb2NrLiAqLworCQkJLyogSWYgd2UgYWxyZWFkeSBoYXZlIHR3byBvciBtb3JlIGJ5dGVzIGVuY29kZWQsIGZpbmlzaCB0aGlzIGNvZGUgYmxvY2sgKi8KKwkJCWlmIChjb3VudCkgeworCQkJCVN0dWZmRGF0YV9GaW5pc2hCbG9jayhTdHVmZl9TYW1lICsgY291bnQpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZWxzZSwgd2Ugb25seSBoYXZlIG9uZSBzbyBmYXIsIHNvIHN3aXRjaCB0byBTdHVmZl9EaWZmIGNvZGUgKi8KKwkJCWNvZGUgPSBTdHVmZl9EaWZmOworCQkJLyogYW5kIGZhbGwgdGhyb3VnaCB0byBTdHVmZl9EaWZmIGNhc2UgYmVsb3cKKwkJCSAqIE5vdGUgY3VubmluZyBjbGV2ZXJuZXNzIGhlcmU6IGNhc2UgU3R1ZmZfRGlmZiBjb21wYXJlcyAKKwkJCSAqIHRoZSBjdXJyZW50IGNoYXJhY3RlciB3aXRoIHRoZSBwcmV2aW91cyB0d28gdG8gc2VlIGlmIGl0CisJCQkgKiBoYXMgYSBydW4gb2YgdGhyZWUgdGhlIHNhbWUuIFdvbid0IHRoaXMgYmUgYW4gZXJyb3IgaWYKKwkJCSAqIHRoZXJlIGFyZW4ndCB0d28gcHJldmlvdXMgY2hhcmFjdGVycyBzdG9yZWQgdG8gY29tcGFyZSB3aXRoPworCQkJICogTm8uIEJlY2F1c2Ugd2Uga25vdyB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgKm5vdCogdGhlIHNhbWUKKwkJCSAqIGFzIHRoZSBwcmV2aW91cyBvbmUsIHRoZSBmaXJzdCB0ZXN0IGJlbG93IHdpbGwgbmVjZXNzYXJpbHkKKwkJCSAqIGZhaWwgYW5kIHRoZSBzZW5kIGhhbGYgb2YgdGhlICJpZiIgd29uJ3QgYmUgZXhlY3V0ZWQuCisJCQkgKi8KKworCQkJLyogU3R1ZmZfRGlmZjogV2UgaGF2ZSBhdCBsZWFzdCB0d28gKmRpZmZlcmVudCogYnl0ZXMgZW5jb2RlZCAqLworCQljYXNlIFN0dWZmX0RpZmY6CisJCQkvKiBJZiB0aGlzIGlzIGEgemVybywgbXVzdCBlbmNvZGUgYSBTdHVmZl9EaWZmWmVybywgYW5kIGJlZ2luIGEgbmV3IGJsb2NrICovCisJCQlpZiAoKnNyYyA9PSAwKSB7CisJCQkJU3R1ZmZEYXRhX0ZpbmlzaEJsb2NrKFN0dWZmX0RpZmZaZXJvICsKKwkJCQkJCSAgICAgIGNvdW50KTsKKwkJCX0KKwkJCS8qIGVsc2UsIGlmIHdlIGhhdmUgdGhyZWUgaW4gYSByb3csIGl0IGlzIHdvcnRoIHN0YXJ0aW5nIGEgU3R1ZmZfU2FtZSBibG9jayAqLworCQkJZWxzZSBpZiAoKCpzcmMgXiBTdHVmZl9NYWdpYykgPT0gZHN0Wy0xXQorCQkJCSAmJiBkc3RbLTFdID09IGRzdFstMl0pIHsKKwkJCQkvKiBCYWNrIG9mZiB0aGUgbGFzdCB0d28gY2hhcmFjdGVycyB3ZSBlbmNvZGVkICovCisJCQkJY29kZSArPSBjb3VudCAtIDI7CisJCQkJLyogTm90ZTogIlN0dWZmX0RpZmYgKyAwIiBpcyBhbiBpbGxlZ2FsIGNvZGUgKi8KKwkJCQlpZiAoY29kZSA9PSBTdHVmZl9EaWZmICsgMCkgeworCQkJCQljb2RlID0gU3R1ZmZfU2FtZSArIDA7CisJCQkJfQorCQkJCVN0dWZmRGF0YV9GaW5pc2hCbG9jayhjb2RlKTsKKwkJCQljb2RlX3B0ciA9IGRzdCAtIDI7CisJCQkJLyogZHN0Wy0xXSBhbHJlYWR5IGhvbGRzIHRoZSBjb3JyZWN0IHZhbHVlICovCisJCQkJY291bnQgPSAyOwkvKiAyIG1lYW5zIHRocmVlIGJ5dGVzIGVuY29kZWQgKi8KKwkJCQljb2RlID0gU3R1ZmZfU2FtZTsKKwkJCX0KKwkJCS8qIGVsc2UsIGFub3RoZXIgZGlmZmVyZW50IGJ5dGUsIHNvIGFkZCBpdCB0byB0aGUgYmxvY2sgKi8KKwkJCWVsc2UgeworCQkJCSpkc3QrKyA9ICpzcmMgXiBTdHVmZl9NYWdpYzsKKwkJCQljb3VudCsrOworCQkJfQorCQkJc3JjKys7CS8qIENvbnN1bWUgdGhlIGJ5dGUgKi8KKwkJCWJyZWFrOworCQl9CisJCWlmIChjb3VudCA9PSBTdHVmZl9NYXhDb3VudCkgeworCQkJU3R1ZmZEYXRhX0ZpbmlzaEJsb2NrKGNvZGUgKyBjb3VudCk7CisJCX0KKwl9CisJaWYgKGNvZGUgPT0gU3R1ZmZfTm9Db2RlKSB7CisJCSpjb2RlX3B0cl9wdHIgPSBOVUxMOworCX0gZWxzZSB7CisJCSpjb2RlX3B0cl9wdHIgPSBjb2RlX3B0cjsKKwkJU3R1ZmZEYXRhX0ZpbmlzaEJsb2NrKGNvZGUgKyBjb3VudCk7CisJfQorCXJldHVybiAoZHN0KTsKK30KKworLyoKKyAqIFVuU3R1ZmZEYXRhIGRlY29kZXMgdGhlIGRhdGEgYXQgInNyYyIsIHVwIHRvIChidXQgbm90IGluY2x1ZGluZykgImVuZCIuCisgKiBJdCB3cml0ZXMgdGhlIGRlY29kZWQgZGF0YSBpbnRvIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSAiZHN0IiwgdXAgdG8gYQorICogbWF4aW11bSBvZiAiZHN0X2xlbmd0aCIsIGFuZCByZXR1cm5zIHRoZSBuZXcgdmFsdWUgb2YgInNyYyIgc28gdGhhdCBhCisgKiBmb2xsb3ctb24gY2FsbCBjYW4gcmVhZCBtb3JlIGRhdGEsIGNvbnRpbnVpbmcgZnJvbSB3aGVyZSB0aGUgZmlyc3QgbGVmdCBvZmYuCisgKiAKKyAqIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiByZXN1bHRzOgorICogMS4gVGhlIHNvdXJjZSBkYXRhIHJ1bnMgb3V0IGJlZm9yZSBleHRyYWN0aW5nICJkc3RfbGVuZ3RoIiBieXRlczoKKyAqICAgIFVuU3R1ZmZEYXRhIHJldHVybnMgTlVMTCB0byBpbmRpY2F0ZSBmYWlsdXJlLgorICogMi4gVGhlIHNvdXJjZSBkYXRhIHByb2R1Y2VzIGV4YWN0bHkgImRzdF9sZW5ndGgiIGJ5dGVzOgorICogICAgVW5TdHVmZkRhdGEgcmV0dXJucyBuZXdfc3JjID0gZW5kIHRvIGluZGljYXRlIHRoYXQgYWxsIGJ5dGVzIHdlcmUgY29uc3VtZWQuCisgKiAzLiAiZHN0X2xlbmd0aCIgYnl0ZXMgYXJlIGV4dHJhY3RlZCwgd2l0aCBtb3JlIHJlbWFpbmluZy4KKyAqICAgIFVuU3R1ZmZEYXRhIHJldHVybnMgbmV3X3NyYyA8IGVuZCB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIGFyZSBtb3JlIGJ5dGVzCisgKiAgICB0byBiZSByZWFkLgorICogCisgKiBOb3RlOiBUaGUgZGVjb2RpbmcgbWF5IGJlIGRlc3RydWN0aXZlLCBpbiB0aGF0IGl0IG1heSBhbHRlciB0aGUgc291cmNlCisgKiBkYXRhIGluIHRoZSBwcm9jZXNzIG9mIGRlY29kaW5nIGl0ICh0aGlzIGlzIG5lY2Vzc2FyeSB0byBhbGxvdyBhIGZvbGxvdy1vbgorICogY2FsbCB0byByZXN1bWUgY29ycmVjdGx5KS4KKyAqLworCitzdGF0aWMgX191OCAqVW5TdHVmZkRhdGEoX191OCAqIHNyYywgX191OCAqIGVuZCwgX191OCAqIGRzdCwKKwkJCSBfX3UzMiBkc3RfbGVuZ3RoKQoreworCV9fdTggKmRzdF9lbmQgPSBkc3QgKyBkc3RfbGVuZ3RoOworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICghc3JjIHx8ICFlbmQgfHwgIWRzdCB8fCAhZHN0X2xlbmd0aCkKKwkJcmV0dXJuIChOVUxMKTsKKwl3aGlsZSAoc3JjIDwgZW5kICYmIGRzdCA8IGRzdF9lbmQpIHsKKwkJaW50IGNvdW50ID0gKCpzcmMgXiBTdHVmZl9NYWdpYykgJiBTdHVmZl9Db3VudE1hc2s7CisJCXN3aXRjaCAoKCpzcmMgXiBTdHVmZl9NYWdpYykgJiBTdHVmZl9Db2RlTWFzaykgeworCQljYXNlIFN0dWZmX0RpZmY6CisJCQlpZiAoc3JjICsgMSArIGNvdW50ID49IGVuZCkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJZG8geworCQkJCSpkc3QrKyA9ICorK3NyYyBeIFN0dWZmX01hZ2ljOworCQkJfQorCQkJd2hpbGUgKC0tY291bnQgPj0gMCAmJiBkc3QgPCBkc3RfZW5kKTsKKwkJCWlmIChjb3VudCA8IDApCisJCQkJc3JjICs9IDE7CisJCQllbHNlIHsKKwkJCQlpZiAoY291bnQgPT0gMCkKKwkJCQkJKnNyYyA9IFN0dWZmX1NhbWUgXiBTdHVmZl9NYWdpYzsKKwkJCQllbHNlCisJCQkJCSpzcmMgPQorCQkJCQkgICAgKFN0dWZmX0RpZmYgKworCQkJCQkgICAgIGNvdW50KSBeIFN0dWZmX01hZ2ljOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU3R1ZmZfRGlmZlplcm86CisJCQlpZiAoc3JjICsgMSArIGNvdW50ID49IGVuZCkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJZG8geworCQkJCSpkc3QrKyA9ICorK3NyYyBeIFN0dWZmX01hZ2ljOworCQkJfQorCQkJd2hpbGUgKC0tY291bnQgPj0gMCAmJiBkc3QgPCBkc3RfZW5kKTsKKwkJCWlmIChjb3VudCA8IDApCisJCQkJKnNyYyA9IFN0dWZmX1plcm8gXiBTdHVmZl9NYWdpYzsKKwkJCWVsc2UKKwkJCQkqc3JjID0KKwkJCQkgICAgKFN0dWZmX0RpZmZaZXJvICsgY291bnQpIF4gU3R1ZmZfTWFnaWM7CisJCQlicmVhazsKKwkJY2FzZSBTdHVmZl9TYW1lOgorCQkJaWYgKHNyYyArIDEgPj0gZW5kKQorCQkJCXJldHVybiAoTlVMTCk7CisJCQlkbyB7CisJCQkJKmRzdCsrID0gc3JjWzFdIF4gU3R1ZmZfTWFnaWM7CisJCQl9CisJCQl3aGlsZSAoLS1jb3VudCA+PSAwICYmIGRzdCA8IGRzdF9lbmQpOworCQkJaWYgKGNvdW50IDwgMCkKKwkJCQlzcmMgKz0gMjsKKwkJCWVsc2UKKwkJCQkqc3JjID0gKFN0dWZmX1NhbWUgKyBjb3VudCkgXiBTdHVmZl9NYWdpYzsKKwkJCWJyZWFrOworCQljYXNlIFN0dWZmX1plcm86CisJCQlkbyB7CisJCQkJKmRzdCsrID0gMDsKKwkJCX0KKwkJCXdoaWxlICgtLWNvdW50ID49IDAgJiYgZHN0IDwgZHN0X2VuZCk7CisJCQlpZiAoY291bnQgPCAwKQorCQkJCXNyYyArPSAxOworCQkJZWxzZQorCQkJCSpzcmMgPSAoU3R1ZmZfWmVybyArIGNvdW50KSBeIFN0dWZmX01hZ2ljOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGRzdCA8IGRzdF9lbmQpCisJCXJldHVybiAoTlVMTCk7CisJZWxzZQorCQlyZXR1cm4gKHNyYyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEdlbmVyYWwgcm91dGluZXMgZm9yIFNUUklQCQkJCQkJKi8KKworLyoKKyAqIGdldF9iYXVkIHJldHVybnMgdGhlIGN1cnJlbnQgYmF1ZCByYXRlLCBhcyBvbmUgb2YgdGhlIGNvbnN0YW50cyBkZWZpbmVkIGluCisgKiB0ZXJtYml0cy5oCisgKiBJZiB0aGUgdXNlciBoYXMgaXNzdWVkIGEgYmF1ZCByYXRlIG92ZXJyaWRlIHVzaW5nIHRoZSAnc2V0c2VyaWFsJyBjb21tYW5kCisgKiBhbmQgdGhlIGxvZ2ljYWwgY3VycmVudCByYXRlIGlzIHNldCB0byAzOC40LCB0aGVuIHRoZSB0cnVlIGJhdWQgcmF0ZQorICogY3VycmVudGx5IGluIGVmZmVjdCAoNTcuNiBvciAxMTUuMikgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2JhdWQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpZiAoIXR0eSB8fCAhdHR5LT50ZXJtaW9zKQorCQlyZXR1cm4gKDApOworCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpID09IEIzODQwMCAmJiB0dHktPmRyaXZlcl9kYXRhKSB7CisJCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8gPQorCQkgICAgKHN0cnVjdCBhc3luY19zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwkJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfSEkpCisJCQlyZXR1cm4gKEI1NzYwMCk7CisJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1ZISSkKKwkJCXJldHVybiAoQjExNTIwMCk7CisJfQorCXJldHVybiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpOworfQorCisvKgorICogc2V0X2JhdWQgc2V0cyB0aGUgYmF1ZCByYXRlIHRvIHRoZSByYXRlIGRlZmluZWQgYnkgYmF1ZGNvZGUKKyAqIE5vdGU6IFRoZSByYXRlIEIzODQwMCBzaG91bGQgYmUgYXZvaWRlZCwgYmVjYXVzZSB0aGUgdXNlciBtYXkgaGF2ZQorICogaXNzdWVkIGEgJ3NldHNlcmlhbCcgc3BlZWQgb3ZlcnJpZGUgdG8gbWFwIHRoYXQgdG8gYSBkaWZmZXJlbnQgc3BlZWQuCisgKiBXZSBjb3VsZCBhY2hpZXZlIGEgdHJ1ZSByYXRlIG9mIDM4NDAwIGlmIHdlIG5lZWRlZCB0byBieSBjYW5jZWxsaW5nCisgKiBhbnkgdXNlciBzcGVlZCBvdmVycmlkZSB0aGF0IGlzIGluIHBsYWNlLCBidXQgdGhhdCBtaWdodCBhbm5veSB0aGUKKyAqIHVzZXIsIHNvIGl0IGlzIHNpbXBsZXN0IHRvIGp1c3QgYXZvaWQgdXNpbmcgMzg0MDAuCisgKi8KK3N0YXRpYyB2b2lkIHNldF9iYXVkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBiYXVkY29kZSkKK3sKKwlzdHJ1Y3QgdGVybWlvcyBvbGRfdGVybWlvcyA9ICoodHR5LT50ZXJtaW9zKTsKKwl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJj0gfkNCQVVEOwkvKiBDbGVhciB0aGUgb2xkIGJhdWQgc2V0dGluZyAqLworCXR0eS0+dGVybWlvcy0+Y19jZmxhZyB8PSBiYXVkY29kZTsJLyogU2V0IHRoZSBuZXcgYmF1ZCBzZXR0aW5nICovCisJdHR5LT5kcml2ZXItPnNldF90ZXJtaW9zKHR0eSwgJm9sZF90ZXJtaW9zKTsKK30KKworLyoKKyAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBNZXRyaWNvbSBBZGRyZXNzLgorICovCisKKyNkZWZpbmUgSVNfUkFESU9fQUREUkVTUyhwKSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaXNkaWdpdCgocClbMF0pICYmIGlzZGlnaXQoKHApWzFdKSAmJiBpc2RpZ2l0KChwKVsyXSkgJiYgaXNkaWdpdCgocClbM10pICYmIFwKKyAgKHApWzRdID09ICctJyAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaXNkaWdpdCgocClbNV0pICYmIGlzZGlnaXQoKHApWzZdKSAmJiBpc2RpZ2l0KChwKVs3XSkgJiYgaXNkaWdpdCgocClbOF0pICAgICkKKworc3RhdGljIGludCBzdHJpbmdfdG9fcmFkaW9fYWRkcmVzcyhNZXRyaWNvbUFkZHJlc3MgKiBhZGRyLCBfX3U4ICogcCkKK3sKKwlpZiAoIUlTX1JBRElPX0FERFJFU1MocCkpCisJCXJldHVybiAoMSk7CisJYWRkci0+Y1swXSA9IDA7CisJYWRkci0+Y1sxXSA9IDA7CisJYWRkci0+Y1syXSA9IFJFQURIRVgocFswXSkgPDwgNCB8IFJFQURIRVgocFsxXSk7CisJYWRkci0+Y1szXSA9IFJFQURIRVgocFsyXSkgPDwgNCB8IFJFQURIRVgocFszXSk7CisJYWRkci0+Y1s0XSA9IFJFQURIRVgocFs1XSkgPDwgNCB8IFJFQURIRVgocFs2XSk7CisJYWRkci0+Y1s1XSA9IFJFQURIRVgocFs3XSkgPDwgNCB8IFJFQURIRVgocFs4XSk7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIENvbnZlcnQgYSBNZXRyaWNvbSBBZGRyZXNzIHRvIGEgc3RyaW5nLgorICovCisKK3N0YXRpYyBfX3U4ICpyYWRpb19hZGRyZXNzX3RvX3N0cmluZyhjb25zdCBNZXRyaWNvbUFkZHJlc3MgKiBhZGRyLAorCQkJCSAgICAgTWV0cmljb21BZGRyZXNzU3RyaW5nICogcCkKK3sKKwlzcHJpbnRmKHAtPmMsICIlMDJYJTAyWC0lMDJYJTAyWCIsIGFkZHItPmNbMl0sIGFkZHItPmNbM10sCisJCWFkZHItPmNbNF0sIGFkZHItPmNbNV0pOworCXJldHVybiAocC0+Yyk7Cit9CisKKy8qCisgKiBOb3RlOiBNdXN0IG1ha2Ugc3VyZSBzeF9zaXplIGlzIGJpZyBlbm91Z2ggdG8gcmVjZWl2ZSBhIHN0dWZmZWQKKyAqIE1BWF9SRUNWX01UVSBwYWNrZXQuIEFkZGl0aW9uYWxseSwgd2UgYWxzbyB3YW50IHRvIGVuc3VyZSB0aGF0IGl0J3MKKyAqIGJpZyBlbm91Z2ggdG8gcmVjZWl2ZSBhIGxhcmdlIHJhZGlvIG5laWdoYm91ciBsaXN0IChjdXJyZW50bHkgNEspLgorICovCisKK3N0YXRpYyBpbnQgYWxsb2NhdGVfYnVmZmVycyhzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sIGludCBtdHUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHN0cmlwX2luZm8tPmRldjsKKwlpbnQgc3hfc2l6ZSA9IG1heF90KGludCwgU1RSSVBfRU5DQVBfU0laRShNQVhfUkVDVl9NVFUpLCA0MDk2KTsKKwlpbnQgdHhfc2l6ZSA9IFNUUklQX0VOQ0FQX1NJWkUobXR1KSArIE1heENvbW1hbmRTdHJpbmdMZW5ndGg7CisJX191OCAqciA9IGttYWxsb2MoTUFYX1JFQ1ZfTVRVLCBHRlBfQVRPTUlDKTsKKwlfX3U4ICpzID0ga21hbGxvYyhzeF9zaXplLCBHRlBfQVRPTUlDKTsKKwlfX3U4ICp0ID0ga21hbGxvYyh0eF9zaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAociAmJiBzICYmIHQpIHsKKwkJc3RyaXBfaW5mby0+cnhfYnVmZiA9IHI7CisJCXN0cmlwX2luZm8tPnN4X2J1ZmYgPSBzOworCQlzdHJpcF9pbmZvLT50eF9idWZmID0gdDsKKwkJc3RyaXBfaW5mby0+c3hfc2l6ZSA9IHN4X3NpemU7CisJCXN0cmlwX2luZm8tPnR4X3NpemUgPSB0eF9zaXplOworCQlzdHJpcF9pbmZvLT5tdHUgPSBkZXYtPm10dSA9IG10dTsKKwkJcmV0dXJuICgxKTsKKwl9CisJaWYgKHIpCisJCWtmcmVlKHIpOworCWlmIChzKQorCQlrZnJlZShzKTsKKwlpZiAodCkKKwkJa2ZyZWUodCk7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIE1UVSBoYXMgYmVlbiBjaGFuZ2VkIGJ5IHRoZSBJUCBsYXllci4gCisgKiBXZSBjb3VsZCBiZSBpbgorICogYW4gdXBjYWxsIGZyb20gdGhlIHR0eSBkcml2ZXIsIG9yIGluIGFuIGlwIHBhY2tldCBxdWV1ZS4KKyAqLworc3RhdGljIGludCBzdHJpcF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbyA9IG5ldGRldl9wcml2KGRldik7CisJaW50IG9sZF9tdHUgPSBzdHJpcF9pbmZvLT5tdHU7CisJdW5zaWduZWQgY2hhciAqb3JidWZmID0gc3RyaXBfaW5mby0+cnhfYnVmZjsKKwl1bnNpZ25lZCBjaGFyICpvc2J1ZmYgPSBzdHJpcF9pbmZvLT5zeF9idWZmOworCXVuc2lnbmVkIGNoYXIgKm90YnVmZiA9IHN0cmlwX2luZm8tPnR4X2J1ZmY7CisKKwlpZiAobmV3X210dSA+IE1BWF9TRU5EX01UVSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogTVRVIGV4Y2VlZHMgbWF4aW11bSBhbGxvd2FibGUgKCVkKSwgTVRVIGNoYW5nZSBjYW5jZWxsZWQuXG4iLAorCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBNQVhfU0VORF9NVFUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzcGluX2xvY2tfYmgoJnN0cmlwX2xvY2spOworCWlmICghYWxsb2NhdGVfYnVmZmVycyhzdHJpcF9pbmZvLCBuZXdfbXR1KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZ3JvdyBzdHJpcCBidWZmZXJzLCBNVFUgY2hhbmdlIGNhbmNlbGxlZC5cbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCQlzcGluX3VubG9ja19iaCgmc3RyaXBfbG9jayk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChzdHJpcF9pbmZvLT5zeF9jb3VudCkgeworCQlpZiAoc3RyaXBfaW5mby0+c3hfY291bnQgPD0gc3RyaXBfaW5mby0+c3hfc2l6ZSkKKwkJCW1lbWNweShzdHJpcF9pbmZvLT5zeF9idWZmLCBvc2J1ZmYsCisJCQkgICAgICAgc3RyaXBfaW5mby0+c3hfY291bnQpOworCQllbHNlIHsKKwkJCXN0cmlwX2luZm8tPmRpc2NhcmQgPSBzdHJpcF9pbmZvLT5zeF9jb3VudDsKKwkJCXN0cmlwX2luZm8tPnJ4X292ZXJfZXJyb3JzKys7CisJCX0KKwl9CisKKwlpZiAoc3RyaXBfaW5mby0+dHhfbGVmdCkgeworCQlpZiAoc3RyaXBfaW5mby0+dHhfbGVmdCA8PSBzdHJpcF9pbmZvLT50eF9zaXplKQorCQkJbWVtY3B5KHN0cmlwX2luZm8tPnR4X2J1ZmYsIHN0cmlwX2luZm8tPnR4X2hlYWQsCisJCQkgICAgICAgc3RyaXBfaW5mby0+dHhfbGVmdCk7CisJCWVsc2UgeworCQkJc3RyaXBfaW5mby0+dHhfbGVmdCA9IDA7CisJCQlzdHJpcF9pbmZvLT50eF9kcm9wcGVkKys7CisJCX0KKwl9CisJc3RyaXBfaW5mby0+dHhfaGVhZCA9IHN0cmlwX2luZm8tPnR4X2J1ZmY7CisJc3Bpbl91bmxvY2tfYmgoJnN0cmlwX2xvY2spOworCisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogc3RyaXAgTVRVIGNoYW5nZWQgZm9tICVkIHRvICVkLlxuIiwKKwkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBvbGRfbXR1LCBzdHJpcF9pbmZvLT5tdHUpOworCisJaWYgKG9yYnVmZikKKwkJa2ZyZWUob3JidWZmKTsKKwlpZiAob3NidWZmKQorCQlrZnJlZShvc2J1ZmYpOworCWlmIChvdGJ1ZmYpCisJCWtmcmVlKG90YnVmZik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3RyaXBfdW5sb2NrKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbykKK3sKKwkvKgorCSAqIFNldCB0aGUgdGltZXIgdG8gZ28gb2ZmIGluIG9uZSBzZWNvbmQuCisJICovCisJc3RyaXBfaW5mby0+aWRsZV90aW1lci5leHBpcmVzID0gamlmZmllcyArIDEgKiBIWjsKKwlhZGRfdGltZXIoJnN0cmlwX2luZm8tPmlkbGVfdGltZXIpOworCW5ldGlmX3dha2VfcXVldWUoc3RyaXBfaW5mby0+ZGV2KTsKK30KKworCisKKy8qCisgKiBJZiB0aGUgdGltZSBpcyBpbiB0aGUgbmVhciBmdXR1cmUsIHRpbWVfZGVsdGEgcHJpbnRzIHRoZSBudW1iZXIgb2YKKyAqIHNlY29uZHMgdG8gZ28gaW50byB0aGUgYnVmZmVyIGFuZCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBidWZmZXIuCisgKiBJZiB0aGUgdGltZSBpcyBub3QgaW4gdGhlIG5lYXIgZnV0dXJlLCBpdCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZQorICogc3RyaW5nICJOb3Qgc2NoZWR1bGVkIiBUaGUgYnVmZmVyIG11c3QgYmUgbG9uZyBlbm91Z2ggdG8gY29udGFpbiB0aGUKKyAqIGFzY2lpIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBudW1iZXIgcGx1cyA5IGNoYXJhY3RlcyBmb3IgdGhlICIgc2Vjb25kcyIKKyAqIGFuZCB0aGUgbnVsbCBjaGFyYWN0ZXIuCisgKi8KKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGNoYXIgKnRpbWVfZGVsdGEoY2hhciBidWZmZXJbXSwgbG9uZyB0aW1lKQoreworCXRpbWUgLT0gamlmZmllczsKKwlpZiAodGltZSA+IExvbmdUaW1lIC8gMikKKwkJcmV0dXJuICgiTm90IHNjaGVkdWxlZCIpOworCWlmICh0aW1lIDwgMCkKKwkJdGltZSA9IDA7CS8qIERvbid0IHByaW50IG5lZ2F0aXZlIHRpbWVzICovCisJc3ByaW50ZihidWZmZXIsICIlbGQgc2Vjb25kcyIsIHRpbWUgLyBIWik7CisJcmV0dXJuIChidWZmZXIpOworfQorCisvKiBnZXQgTnRoIGVsZW1lbnQgb2YgdGhlIGxpbmtlZCBsaXN0ICovCitzdGF0aWMgc3RydWN0IHN0cmlwICpzdHJpcF9nZXRfaWR4KGxvZmZfdCBwb3MpIAoreworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJaW50IGkgPSAwOworCisJbGlzdF9mb3JfZWFjaF9yY3UobCwgJnN0cmlwX2xpc3QpIHsKKwkJaWYgKHBvcyA9PSBpKQorCQkJcmV0dXJuIGxpc3RfZW50cnkobCwgc3RydWN0IHN0cmlwLCBsaXN0KTsKKwkJKytpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKnN0cmlwX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJcmN1X3JlYWRfbG9jaygpOworCXJldHVybiAqcG9zID8gc3RyaXBfZ2V0X2lkeCgqcG9zIC0gMSkgOiBTRVFfU1RBUlRfVE9LRU47Cit9CisKK3N0YXRpYyB2b2lkICpzdHJpcF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbDsKKwlzdHJ1Y3Qgc3RyaXAgKnM7CisKKwkrKypwb3M7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlyZXR1cm4gc3RyaXBfZ2V0X2lkeCgxKTsKKworCXMgPSB2OworCWwgPSAmcy0+bGlzdDsKKwlsaXN0X2Zvcl9lYWNoX2NvbnRpbnVlX3JjdShsLCAmc3RyaXBfbGlzdCkgeworCQlyZXR1cm4gbGlzdF9lbnRyeShsLCBzdHJ1Y3Qgc3RyaXAsIGxpc3QpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc3RyaXBfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cmlwX3NlcV9uZWlnaGJvdXJzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLAorCQkJICAgY29uc3QgTWV0cmljb21Ob2RlVGFibGUgKiB0YWJsZSwKKwkJCSAgIGNvbnN0IGNoYXIgKnRpdGxlKQoreworCS8qIFdlIHdyYXAgdGhpcyBpbiBhIGRvL3doaWxlIGxvb3AsIHNvIGlmIHRoZSB0YWJsZSBjaGFuZ2VzICovCisJLyogd2hpbGUgd2UncmUgcmVhZGluZyBpdCwgd2UganVzdCBnbyBhcm91bmQgYW5kIHRyeSBhZ2Fpbi4gKi8KKwlzdHJ1Y3QgdGltZXZhbCB0OworCisJZG8geworCQlpbnQgaTsKKwkJdCA9IHRhYmxlLT50aW1lc3RhbXA7CisJCWlmICh0YWJsZS0+bnVtX25vZGVzKQorCQkJc2VxX3ByaW50ZihzZXEsICJcbiAlc1xuIiwgdGl0bGUpOworCQlmb3IgKGkgPSAwOyBpIDwgdGFibGUtPm51bV9ub2RlczsgaSsrKSB7CisJCQlNZXRyaWNvbU5vZGUgbm9kZTsKKworCQkJc3Bpbl9sb2NrX2JoKCZzdHJpcF9sb2NrKTsKKwkJCW5vZGUgPSB0YWJsZS0+bm9kZVtpXTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZzdHJpcF9sb2NrKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiICAlc1xuIiwgbm9kZS5jKTsKKwkJfQorCX0gd2hpbGUgKHRhYmxlLT50aW1lc3RhbXAudHZfc2VjICE9IHQudHZfc2VjCisJCSB8fCB0YWJsZS0+dGltZXN0YW1wLnR2X3VzZWMgIT0gdC50dl91c2VjKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcHJpbnRzIHJhZGlvIHN0YXR1cyBpbmZvcm1hdGlvbiB2aWEgdGhlIHNlcV9maWxlCisgKiBpbnRlcmZhY2UuICBUaGUgaW50ZXJmYWNlIHRha2VzIGNhcmUgb2YgYnVmZmVyIHNpemUgYW5kIG92ZXIKKyAqIHJ1biBpc3N1ZXMuIAorICoKKyAqIFRoZSBidWZmZXIgaW4gc2VxX2ZpbGUgaXMgUEFHRVNJWkUgKDRLKSAKKyAqIHNvIHRoaXMgcm91dGluZSBzaG91bGQgbmV2ZXIgcHJpbnQgbW9yZSBvciBpdCB3aWxsIGdldCB0cnVuY2F0ZWQuCisgKiBXaXRoIHRoZSBtYXhpbXVtIG9mIDMyIHBvcnRhYmxlcyBhbmQgMzIgcG9sZXRvcHMKKyAqIHJlcG9ydGVkLCB0aGUgcm91dGluZSBvdXRwdXRzIDMxMDcgYnl0ZXMgaW50byB0aGUgYnVmZmVyLgorICovCitzdGF0aWMgdm9pZCBzdHJpcF9zZXFfc3RhdHVzX2luZm8oc3RydWN0IHNlcV9maWxlICpzZXEsIAorCQkJCSAgY29uc3Qgc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvKQoreworCWNoYXIgdGVtcFszMl07CisJTWV0cmljb21BZGRyZXNzU3RyaW5nIGFkZHJfc3RyaW5nOworCisJLyogRmlyc3QsIHdlIG11c3QgY29weSBhbGwgb2Ygb3VyIGRhdGEgdG8gYSBzYWZlIHBsYWNlLCAqLworCS8qIGluIGNhc2UgYSBzZXJpYWwgaW50ZXJydXB0IGNvbWVzIGluIGFuZCBjaGFuZ2VzIGl0LiAgKi8KKwlpbnQgdHhfbGVmdCA9IHN0cmlwX2luZm8tPnR4X2xlZnQ7CisJdW5zaWduZWQgbG9uZyByeF9hdmVyYWdlX3BwcyA9IHN0cmlwX2luZm8tPnJ4X2F2ZXJhZ2VfcHBzOworCXVuc2lnbmVkIGxvbmcgdHhfYXZlcmFnZV9wcHMgPSBzdHJpcF9pbmZvLT50eF9hdmVyYWdlX3BwczsKKwl1bnNpZ25lZCBsb25nIHN4X2F2ZXJhZ2VfcHBzID0gc3RyaXBfaW5mby0+c3hfYXZlcmFnZV9wcHM7CisJaW50IHdvcmtpbmcgPSBzdHJpcF9pbmZvLT53b3JraW5nOworCWludCBmaXJtd2FyZV9sZXZlbCA9IHN0cmlwX2luZm8tPmZpcm13YXJlX2xldmVsOworCWxvbmcgd2F0Y2hkb2dfZG9wcm9iZSA9IHN0cmlwX2luZm8tPndhdGNoZG9nX2RvcHJvYmU7CisJbG9uZyB3YXRjaGRvZ19kb3Jlc2V0ID0gc3RyaXBfaW5mby0+d2F0Y2hkb2dfZG9yZXNldDsKKwlsb25nIGdyYXR1aXRvdXNfYXJwID0gc3RyaXBfaW5mby0+Z3JhdHVpdG91c19hcnA7CisJbG9uZyBhcnBfaW50ZXJ2YWwgPSBzdHJpcF9pbmZvLT5hcnBfaW50ZXJ2YWw7CisJRmlybXdhcmVWZXJzaW9uIGZpcm13YXJlX3ZlcnNpb24gPSBzdHJpcF9pbmZvLT5maXJtd2FyZV92ZXJzaW9uOworCVNlcmlhbE51bWJlciBzZXJpYWxfbnVtYmVyID0gc3RyaXBfaW5mby0+c2VyaWFsX251bWJlcjsKKwlCYXR0ZXJ5Vm9sdGFnZSBiYXR0ZXJ5X3ZvbHRhZ2UgPSBzdHJpcF9pbmZvLT5iYXR0ZXJ5X3ZvbHRhZ2U7CisJY2hhciAqaWZfbmFtZSA9IHN0cmlwX2luZm8tPmRldi0+bmFtZTsKKwlNZXRyaWNvbUFkZHJlc3MgdHJ1ZV9kZXZfYWRkciA9IHN0cmlwX2luZm8tPnRydWVfZGV2X2FkZHI7CisJTWV0cmljb21BZGRyZXNzIGRldl9kZXZfYWRkciA9CisJICAgICooTWV0cmljb21BZGRyZXNzICopIHN0cmlwX2luZm8tPmRldi0+ZGV2X2FkZHI7CisJaW50IG1hbnVhbF9kZXZfYWRkciA9IHN0cmlwX2luZm8tPm1hbnVhbF9kZXZfYWRkcjsKKyNpZmRlZiBFWFRfQ09VTlRFUlMKKwl1bnNpZ25lZCBsb25nIHJ4X2J5dGVzID0gc3RyaXBfaW5mby0+cnhfYnl0ZXM7CisJdW5zaWduZWQgbG9uZyB0eF9ieXRlcyA9IHN0cmlwX2luZm8tPnR4X2J5dGVzOworCXVuc2lnbmVkIGxvbmcgcnhfcmJ5dGVzID0gc3RyaXBfaW5mby0+cnhfcmJ5dGVzOworCXVuc2lnbmVkIGxvbmcgdHhfcmJ5dGVzID0gc3RyaXBfaW5mby0+dHhfcmJ5dGVzOworCXVuc2lnbmVkIGxvbmcgcnhfc2J5dGVzID0gc3RyaXBfaW5mby0+cnhfc2J5dGVzOworCXVuc2lnbmVkIGxvbmcgdHhfc2J5dGVzID0gc3RyaXBfaW5mby0+dHhfc2J5dGVzOworCXVuc2lnbmVkIGxvbmcgcnhfZWJ5dGVzID0gc3RyaXBfaW5mby0+cnhfZWJ5dGVzOworCXVuc2lnbmVkIGxvbmcgdHhfZWJ5dGVzID0gc3RyaXBfaW5mby0+dHhfZWJ5dGVzOworI2VuZGlmCisKKwlzZXFfcHJpbnRmKHNlcSwgIlxuSW50ZXJmYWNlIG5hbWVcdFx0JXNcbiIsIGlmX25hbWUpOworCXNlcV9wcmludGYoc2VxLCAiIFJhZGlvIHdvcmtpbmc6XHRcdCVzXG4iLCB3b3JraW5nID8gIlllcyIgOiAiTm8iKTsKKwlyYWRpb19hZGRyZXNzX3RvX3N0cmluZygmdHJ1ZV9kZXZfYWRkciwgJmFkZHJfc3RyaW5nKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiBSYWRpbyBhZGRyZXNzOlx0XHQlc1xuIiwgYWRkcl9zdHJpbmcuYyk7CisJaWYgKG1hbnVhbF9kZXZfYWRkcikgeworCQlyYWRpb19hZGRyZXNzX3RvX3N0cmluZygmZGV2X2Rldl9hZGRyLCAmYWRkcl9zdHJpbmcpOworCQlzZXFfcHJpbnRmKHNlcSwgIiBEZXZpY2UgYWRkcmVzczpcdCVzXG4iLCBhZGRyX3N0cmluZy5jKTsKKwl9CisJc2VxX3ByaW50ZihzZXEsICIgRmlybXdhcmUgdmVyc2lvbjpcdCVzIiwgIXdvcmtpbmcgPyAiVW5rbm93biIgOgorCQkgICAgICFmaXJtd2FyZV9sZXZlbCA/ICJTaG91bGQgYmUgdXBncmFkZWQiIDoKKwkJICAgICBmaXJtd2FyZV92ZXJzaW9uLmMpOworCWlmIChmaXJtd2FyZV9sZXZlbCA+PSBDaGVja3N1bW1lZE1lc3NhZ2VzKQorCQlzZXFfcHJpbnRmKHNlcSwgIiAoQ2hlY2tzdW1zIEVuYWJsZWQpIik7CisJc2VxX3ByaW50ZihzZXEsICJcbiIpOworCXNlcV9wcmludGYoc2VxLCAiIFNlcmlhbCBudW1iZXI6XHRcdCVzXG4iLCBzZXJpYWxfbnVtYmVyLmMpOworCXNlcV9wcmludGYoc2VxLCAiIEJhdHRlcnkgdm9sdGFnZTpcdCVzXG4iLCBiYXR0ZXJ5X3ZvbHRhZ2UuYyk7CisJc2VxX3ByaW50ZihzZXEsICIgVHJhbnNtaXQgcXVldWUgKGJ5dGVzKTolZFxuIiwgdHhfbGVmdCk7CisJc2VxX3ByaW50ZihzZXEsICIgUmVjZWl2ZSBwYWNrZXQgcmF0ZTogICAlbGQgcGFja2V0cyBwZXIgc2Vjb25kXG4iLAorCQkgICAgIHJ4X2F2ZXJhZ2VfcHBzIC8gOCk7CisJc2VxX3ByaW50ZihzZXEsICIgVHJhbnNtaXQgcGFja2V0IHJhdGU6ICAlbGQgcGFja2V0cyBwZXIgc2Vjb25kXG4iLAorCQkgICAgIHR4X2F2ZXJhZ2VfcHBzIC8gOCk7CisJc2VxX3ByaW50ZihzZXEsICIgU2VudCBwYWNrZXQgcmF0ZTogICAgICAlbGQgcGFja2V0cyBwZXIgc2Vjb25kXG4iLAorCQkgICAgIHN4X2F2ZXJhZ2VfcHBzIC8gOCk7CisJc2VxX3ByaW50ZihzZXEsICIgTmV4dCB3YXRjaGRvZyBwcm9iZTpcdCVzXG4iLAorCQkgICAgIHRpbWVfZGVsdGEodGVtcCwgd2F0Y2hkb2dfZG9wcm9iZSkpOworCXNlcV9wcmludGYoc2VxLCAiIE5leHQgd2F0Y2hkb2cgcmVzZXQ6XHQlc1xuIiwKKwkJICAgICB0aW1lX2RlbHRhKHRlbXAsIHdhdGNoZG9nX2RvcmVzZXQpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiBOZXh0IGdyYXR1aXRvdXMgQVJQOlx0Iik7CisKKwlpZiAoIW1lbWNtcAorCSAgICAoc3RyaXBfaW5mby0+ZGV2LT5kZXZfYWRkciwgemVyb19hZGRyZXNzLmMsCisJICAgICBzaXplb2YoemVyb19hZGRyZXNzKSkpCisJCXNlcV9wcmludGYoc2VxLCAiRGlzYWJsZWRcbiIpOworCWVsc2UgeworCQlzZXFfcHJpbnRmKHNlcSwgIiVzXG4iLCB0aW1lX2RlbHRhKHRlbXAsIGdyYXR1aXRvdXNfYXJwKSk7CisJCXNlcV9wcmludGYoc2VxLCAiIE5leHQgQVJQIGludGVydmFsOlx0JWxkIHNlY29uZHNcbiIsCisJCQkgICAgIEpJRkZJRV9UT19TRUMoYXJwX2ludGVydmFsKSk7CisJfQorCisJaWYgKHdvcmtpbmcpIHsKKyNpZmRlZiBFWFRfQ09VTlRFUlMKKwkJc2VxX3ByaW50ZihzZXEsICJcbiIpOworCQlzZXFfcHJpbnRmKHNlcSwKKwkJCSAgICAgIiBUb3RhbCBieXRlczogICAgICAgICBcdHJ4Olx0JWx1XHR0eDpcdCVsdVxuIiwKKwkJCSAgICAgcnhfYnl0ZXMsIHR4X2J5dGVzKTsKKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAgICIgIHRocnUgcmFkaW86ICAgICAgICAgXHRyeDpcdCVsdVx0dHg6XHQlbHVcbiIsCisJCQkgICAgIHJ4X3JieXRlcywgdHhfcmJ5dGVzKTsKKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAgICIgIHRocnUgc2VyaWFsIHBvcnQ6ICAgXHRyeDpcdCVsdVx0dHg6XHQlbHVcbiIsCisJCQkgICAgIHJ4X3NieXRlcywgdHhfc2J5dGVzKTsKKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAgICIgVG90YWwgc3RhdC9lcnIgYnl0ZXM6XHRyeDpcdCVsdVx0dHg6XHQlbHVcbiIsCisJCQkgICAgIHJ4X2VieXRlcywgdHhfZWJ5dGVzKTsKKyNlbmRpZgorCQlzdHJpcF9zZXFfbmVpZ2hib3VycyhzZXEsICZzdHJpcF9pbmZvLT5wb2xldG9wcywKKwkJCQkJIlBvbGV0b3BzOiIpOworCQlzdHJpcF9zZXFfbmVpZ2hib3VycyhzZXEsICZzdHJpcF9pbmZvLT5wb3J0YWJsZXMsCisJCQkJCSJQb3J0YWJsZXM6Iik7CisJfQorfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBleHBvcnRzIHN0YXR1cyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBTVFJJUCBkcml2ZXIgdGhyb3VnaAorICogdGhlIC9wcm9jIGZpbGUgc3lzdGVtLgorICovCitzdGF0aWMgaW50IHN0cmlwX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJc2VxX3ByaW50ZihzZXEsICJzdHJpcF92ZXJzaW9uOiAlc1xuIiwgU3RyaXBWZXJzaW9uKTsKKwllbHNlCisJCXN0cmlwX3NlcV9zdGF0dXNfaW5mbyhzZXEsIChjb25zdCBzdHJ1Y3Qgc3RyaXAgKil2KTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHN0cmlwX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gc3RyaXBfc2VxX3N0YXJ0LAorCS5uZXh0ICA9IHN0cmlwX3NlcV9uZXh0LAorCS5zdG9wICA9IHN0cmlwX3NlcV9zdG9wLAorCS5zaG93ICA9IHN0cmlwX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBzdHJpcF9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJnN0cmlwX3NlcV9vcHMpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzdHJpcF9zZXFfZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSBzdHJpcF9zZXFfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworI2VuZGlmCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU2VuZGluZyByb3V0aW5lcwkJCQkJCQkqLworCitzdGF0aWMgdm9pZCBSZXNldFJhZGlvKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbykKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gc3RyaXBfaW5mby0+dHR5OworCXN0YXRpYyBjb25zdCBjaGFyIGluaXRbXSA9ICJhdGUwcTFkdCoqc3Rhcm1vZGVccioqIjsKKwlTdHJpbmdEZXNjcmlwdG9yIHMgPSB7IGluaXQsIHNpemVvZihpbml0KSAtIDEgfTsKKworCS8qIAorCSAqIElmIHRoZSByYWRpbyBpc24ndCB3b3JraW5nIGFueW1vcmUsCisJICogd2Ugc2hvdWxkIGNsZWFyIHRoZSBvbGQgc3RhdHVzIGluZm9ybWF0aW9uLgorCSAqLworCWlmIChzdHJpcF9pbmZvLT53b3JraW5nKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBObyByZXNwb25zZTogUmVzZXR0aW5nIHJhZGlvLlxuIiwKKwkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSk7CisJCXN0cmlwX2luZm8tPmZpcm13YXJlX3ZlcnNpb24uY1swXSA9ICdcMCc7CisJCXN0cmlwX2luZm8tPnNlcmlhbF9udW1iZXIuY1swXSA9ICdcMCc7CisJCXN0cmlwX2luZm8tPmJhdHRlcnlfdm9sdGFnZS5jWzBdID0gJ1wwJzsKKwkJc3RyaXBfaW5mby0+cG9ydGFibGVzLm51bV9ub2RlcyA9IDA7CisJCWRvX2dldHRpbWVvZmRheSgmc3RyaXBfaW5mby0+cG9ydGFibGVzLnRpbWVzdGFtcCk7CisJCXN0cmlwX2luZm8tPnBvbGV0b3BzLm51bV9ub2RlcyA9IDA7CisJCWRvX2dldHRpbWVvZmRheSgmc3RyaXBfaW5mby0+cG9sZXRvcHMudGltZXN0YW1wKTsKKwl9CisKKwlzdHJpcF9pbmZvLT5wcHNfdGltZXIgPSBqaWZmaWVzOworCXN0cmlwX2luZm8tPnJ4X3Bwc19jb3VudCA9IDA7CisJc3RyaXBfaW5mby0+dHhfcHBzX2NvdW50ID0gMDsKKwlzdHJpcF9pbmZvLT5zeF9wcHNfY291bnQgPSAwOworCXN0cmlwX2luZm8tPnJ4X2F2ZXJhZ2VfcHBzID0gMDsKKwlzdHJpcF9pbmZvLT50eF9hdmVyYWdlX3BwcyA9IDA7CisJc3RyaXBfaW5mby0+c3hfYXZlcmFnZV9wcHMgPSAwOworCisJLyogTWFyayByYWRpbyBhZGRyZXNzIGFzIHVua25vd24gKi8KKwkqKE1ldHJpY29tQWRkcmVzcyAqKSAmIHN0cmlwX2luZm8tPnRydWVfZGV2X2FkZHIgPSB6ZXJvX2FkZHJlc3M7CisJaWYgKCFzdHJpcF9pbmZvLT5tYW51YWxfZGV2X2FkZHIpCisJCSooTWV0cmljb21BZGRyZXNzICopIHN0cmlwX2luZm8tPmRldi0+ZGV2X2FkZHIgPQorCQkgICAgemVyb19hZGRyZXNzOworCXN0cmlwX2luZm8tPndvcmtpbmcgPSBGQUxTRTsKKwlzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA9IE5vU3RydWN0dXJlOworCXN0cmlwX2luZm8tPm5leHRfY29tbWFuZCA9IENvbXBhdGliaWxpdHlDb21tYW5kOworCXN0cmlwX2luZm8tPndhdGNoZG9nX2RvcHJvYmUgPSBqaWZmaWVzICsgMTAgKiBIWjsKKwlzdHJpcF9pbmZvLT53YXRjaGRvZ19kb3Jlc2V0ID0gamlmZmllcyArIDEgKiBIWjsKKworCS8qIElmIHRoZSB1c2VyIGhhcyBzZWxlY3RlZCBhIGJhdWQgcmF0ZSBhYm92ZSAzOC40IHNlZSB3aGF0IG1hZ2ljIHdlIGhhdmUgdG8gZG8gKi8KKwlpZiAoc3RyaXBfaW5mby0+dXNlcl9iYXVkID4gQjM4NDAwKSB7CisJCS8qCisJCSAqIFN1YnRsZSBzdHVmZjogUGF5IGF0dGVudGlvbiA6LSkKKwkJICogSWYgdGhlIHNlcmlhbCBwb3J0IGlzIGN1cnJlbnRseSBhdCB0aGUgdXNlcidzIHNlbGVjdGVkICg+MzguNCkgcmF0ZSwKKwkJICogdGhlbiB3ZSB0ZW1wb3JhcmlseSBzd2l0Y2ggdG8gMTkuMiBhbmQgaXNzdWUgdGhlIEFUUzMwNCBjb21tYW5kCisJCSAqIHRvIHRlbGwgdGhlIHJhZGlvIHRvIHN3aXRjaCB0byB0aGUgdXNlcidzIHNlbGVjdGVkIHJhdGUuCisJCSAqIElmIHRoZSBzZXJpYWwgcG9ydCBpcyBub3QgY3VycmVudGx5IGF0IHRoYXQgcmF0ZSwgdGhhdCBtZWFucyB3ZSBqdXN0CisJCSAqIGlzc3VlZCB0aGUgQVRTMzA0IGNvbW1hbmQgbGFzdCB0aW1lIHRocm91Z2gsIHNvIHRoaXMgdGltZSB3ZSByZXN0b3JlCisJCSAqIHRoZSB1c2VyJ3Mgc2VsZWN0ZWQgcmF0ZSBhbmQgaXNzdWUgdGhlIG5vcm1hbCBzdGFybW9kZSByZXNldCBzdHJpbmcuCisJCSAqLworCQlpZiAoc3RyaXBfaW5mby0+dXNlcl9iYXVkID09IGdldF9iYXVkKHR0eSkpIHsKKwkJCXN0YXRpYyBjb25zdCBjaGFyIGIwW10gPSAiYXRlMHExczMwND01NzYwMFxyIjsKKwkJCXN0YXRpYyBjb25zdCBjaGFyIGIxW10gPSAiYXRlMHExczMwND0xMTUyMDBcciI7CisJCQlzdGF0aWMgY29uc3QgU3RyaW5nRGVzY3JpcHRvciBiYXVkc3RyaW5nWzJdID0KKwkJCSAgICB7IHtiMCwgc2l6ZW9mKGIwKSAtIDF9CisJCQksIHtiMSwgc2l6ZW9mKGIxKSAtIDF9CisJCQl9OworCQkJc2V0X2JhdWQodHR5LCBCMTkyMDApOworCQkJaWYgKHN0cmlwX2luZm8tPnVzZXJfYmF1ZCA9PSBCNTc2MDApCisJCQkJcyA9IGJhdWRzdHJpbmdbMF07CisJCQllbHNlIGlmIChzdHJpcF9pbmZvLT51c2VyX2JhdWQgPT0gQjExNTIwMCkKKwkJCQlzID0gYmF1ZHN0cmluZ1sxXTsKKwkJCWVsc2UKKwkJCQlzID0gYmF1ZHN0cmluZ1sxXTsJLyogRm9yIG5vdyAqLworCQl9IGVsc2UKKwkJCXNldF9iYXVkKHR0eSwgc3RyaXBfaW5mby0+dXNlcl9iYXVkKTsKKwl9CisKKwl0dHktPmRyaXZlci0+d3JpdGUodHR5LCBzLnN0cmluZywgcy5sZW5ndGgpOworI2lmZGVmIEVYVF9DT1VOVEVSUworCXN0cmlwX2luZm8tPnR4X2VieXRlcyArPSBzLmxlbmd0aDsKKyNlbmRpZgorfQorCisvKgorICogQ2FsbGVkIGJ5IHRoZSBkcml2ZXIgd2hlbiB0aGVyZSdzIHJvb20gZm9yIG1vcmUgZGF0YS4gIElmIHdlIGhhdmUKKyAqIG1vcmUgcGFja2V0cyB0byBzZW5kLCB3ZSBzZW5kIHRoZW0gaGVyZS4KKyAqLworCitzdGF0aWMgdm9pZCBzdHJpcF93cml0ZV9zb21lX21vcmUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8gPSAoc3RydWN0IHN0cmlwICopIHR0eS0+ZGlzY19kYXRhOworCisJLyogRmlyc3QgbWFrZSBzdXJlIHdlJ3JlIGNvbm5lY3RlZC4gKi8KKwlpZiAoIXN0cmlwX2luZm8gfHwgc3RyaXBfaW5mby0+bWFnaWMgIT0gU1RSSVBfTUFHSUMgfHwKKwkgICAgIW5ldGlmX3J1bm5pbmcoc3RyaXBfaW5mby0+ZGV2KSkKKwkJcmV0dXJuOworCisJaWYgKHN0cmlwX2luZm8tPnR4X2xlZnQgPiAwKSB7CisJCWludCBudW1fd3JpdHRlbiA9CisJCSAgICB0dHktPmRyaXZlci0+d3JpdGUodHR5LCBzdHJpcF9pbmZvLT50eF9oZWFkLAorCQkJCSAgICAgIHN0cmlwX2luZm8tPnR4X2xlZnQpOworCQlzdHJpcF9pbmZvLT50eF9sZWZ0IC09IG51bV93cml0dGVuOworCQlzdHJpcF9pbmZvLT50eF9oZWFkICs9IG51bV93cml0dGVuOworI2lmZGVmIEVYVF9DT1VOVEVSUworCQlzdHJpcF9pbmZvLT50eF9zYnl0ZXMgKz0gbnVtX3dyaXR0ZW47CisjZW5kaWYKKwl9IGVsc2UgewkJLyogRWxzZSBzdGFydCB0cmFuc21pc3Npb24gb2YgYW5vdGhlciBwYWNrZXQgKi8KKworCQl0dHktPmZsYWdzICY9IH4oMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKwkJc3RyaXBfdW5sb2NrKHN0cmlwX2luZm8pOworCX0KK30KKworc3RhdGljIF9fdTggKmFkZF9jaGVja3N1bShfX3U4ICogYnVmZmVyLCBfX3U4ICogZW5kKQoreworCV9fdTE2IHN1bSA9IDA7CisJX191OCAqcCA9IGJ1ZmZlcjsKKwl3aGlsZSAocCA8IGVuZCkKKwkJc3VtICs9ICpwKys7CisJZW5kWzNdID0gaGV4dGFibGVbc3VtICYgMHhGXTsKKwlzdW0gPj49IDQ7CisJZW5kWzJdID0gaGV4dGFibGVbc3VtICYgMHhGXTsKKwlzdW0gPj49IDQ7CisJZW5kWzFdID0gaGV4dGFibGVbc3VtICYgMHhGXTsKKwlzdW0gPj49IDQ7CisJZW5kWzBdID0gaGV4dGFibGVbc3VtICYgMHhGXTsKKwlyZXR1cm4gKGVuZCArIDQpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqc3RyaXBfbWFrZV9wYWNrZXQodW5zaWduZWQgY2hhciAqYnVmZmVyLAorCQkJCQlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sCisJCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJX191OCAqcHRyID0gYnVmZmVyOworCV9fdTggKnN0dWZmc3RhdGUgPSBOVUxMOworCVNUUklQX0hlYWRlciAqaGVhZGVyID0gKFNUUklQX0hlYWRlciAqKSBza2ItPmRhdGE7CisJTWV0cmljb21BZGRyZXNzIGhhZGRyID0gaGVhZGVyLT5kc3RfYWRkcjsKKwlpbnQgbGVuID0gc2tiLT5sZW4gLSBzaXplb2YoU1RSSVBfSGVhZGVyKTsKKwlNZXRyaWNvbUtleSBrZXk7CisKKwkvKkhleER1bXAoInN0cmlwX21ha2VfcGFja2V0Iiwgc3RyaXBfaW5mbywgc2tiLT5kYXRhLCBza2ItPmRhdGEgKyBza2ItPmxlbik7ICovCisKKwlpZiAoaGVhZGVyLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCisJCWtleSA9IFNJUDBLZXk7CisJZWxzZSBpZiAoaGVhZGVyLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9BUlApKQorCQlrZXkgPSBBUlAwS2V5OworCWVsc2UgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogc3RyaXBfbWFrZV9wYWNrZXQ6IFVua25vd24gcGFja2V0IHR5cGUgMHglMDRYXG4iLAorCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBudG9ocyhoZWFkZXItPnByb3RvY29sKSk7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJaWYgKGxlbiA+IHN0cmlwX2luZm8tPm10dSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogRHJvcHBpbmcgb3ZlcnNpemVkIHRyYW5zbWl0IHBhY2tldDogJWQgYnl0ZXNcbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIGxlbik7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJLyoKKwkgKiBJZiB3ZSdyZSBzZW5kaW5nIHRvIG91cnNlbHZlcywgZGlzY2FyZCB0aGUgcGFja2V0LgorCSAqIChNZXRyaWNvbSByYWRpb3MgY2hva2UgaWYgdGhleSB0cnkgdG8gc2VuZCBhIHBhY2tldCB0byB0aGVpciBvd24gYWRkcmVzcy4pCisJICovCisJaWYgKCFtZW1jbXAoaGFkZHIuYywgc3RyaXBfaW5mby0+dHJ1ZV9kZXZfYWRkci5jLCBzaXplb2YoaGFkZHIpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBEcm9wcGluZyBwYWNrZXQgYWRkcmVzc2VkIHRvIHNlbGZcbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCS8qCisJICogSWYgdGhpcyBpcyBhIGJyb2FkY2FzdCBwYWNrZXQsIHNlbmQgaXQgdG8gb3VyIGRlc2lnbmF0ZWQgTWV0cmljb20KKwkgKiAnYnJvYWRjYXN0IGh1YicgcmFkaW8gKEZpcnN0IGJ5dGUgb2YgYWRkcmVzcyBiZWluZyAweEZGIG1lYW5zIGJyb2FkY2FzdCkKKwkgKi8KKwlpZiAoaGFkZHIuY1swXSA9PSAweEZGKSB7CisJCXUzMiBicmQgPSAwOworCQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisKKwkJcmN1X3JlYWRfbG9jaygpOworCQlpbl9kZXYgPSBfX2luX2Rldl9nZXQoc3RyaXBfaW5mby0+ZGV2KTsKKwkJaWYgKGluX2RldiA9PSBOVUxMKSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChpbl9kZXYtPmlmYV9saXN0KQorCQkJYnJkID0gaW5fZGV2LT5pZmFfbGlzdC0+aWZhX2Jyb2FkY2FzdDsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkJLyogYXJwX3F1ZXJ5IHJldHVybnMgMSBpZiBpdCBzdWNjZWVkcyBpbiBsb29raW5nIHVwIHRoZSBhZGRyZXNzLCAwIGlmIGl0IGZhaWxzICovCisJCWlmICghYXJwX3F1ZXJ5KGhhZGRyLmMsIGJyZCwgc3RyaXBfaW5mby0+ZGV2KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIiVzOiBVbmFibGUgdG8gc2VuZCBwYWNrZXQgKG5vIGJyb2FkY2FzdCBodWIgY29uZmlndXJlZClcbiIsCisJCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKwkJLyoKKwkJICogSWYgd2UgYXJlIHRoZSBicm9hZGNhc3QgaHViLCBkb24ndCBib3RoZXIgc2VuZGluZyB0byBvdXJzZWx2ZXMuCisJCSAqIChNZXRyaWNvbSByYWRpb3MgY2hva2UgaWYgdGhleSB0cnkgdG8gc2VuZCBhIHBhY2tldCB0byB0aGVpciBvd24gYWRkcmVzcy4pCisJCSAqLworCQlpZiAoIW1lbWNtcAorCQkgICAgKGhhZGRyLmMsIHN0cmlwX2luZm8tPnRydWVfZGV2X2FkZHIuYywgc2l6ZW9mKGhhZGRyKSkpCisJCQlyZXR1cm4gKE5VTEwpOworCX0KKworCSpwdHIrKyA9IDB4MEQ7CisJKnB0cisrID0gJyonOworCSpwdHIrKyA9IGhleHRhYmxlW2hhZGRyLmNbMl0gPj4gNF07CisJKnB0cisrID0gaGV4dGFibGVbaGFkZHIuY1syXSAmIDB4Rl07CisJKnB0cisrID0gaGV4dGFibGVbaGFkZHIuY1szXSA+PiA0XTsKKwkqcHRyKysgPSBoZXh0YWJsZVtoYWRkci5jWzNdICYgMHhGXTsKKwkqcHRyKysgPSAnLSc7CisJKnB0cisrID0gaGV4dGFibGVbaGFkZHIuY1s0XSA+PiA0XTsKKwkqcHRyKysgPSBoZXh0YWJsZVtoYWRkci5jWzRdICYgMHhGXTsKKwkqcHRyKysgPSBoZXh0YWJsZVtoYWRkci5jWzVdID4+IDRdOworCSpwdHIrKyA9IGhleHRhYmxlW2hhZGRyLmNbNV0gJiAweEZdOworCSpwdHIrKyA9ICcqJzsKKwkqcHRyKysgPSBrZXkuY1swXTsKKwkqcHRyKysgPSBrZXkuY1sxXTsKKwkqcHRyKysgPSBrZXkuY1syXTsKKwkqcHRyKysgPSBrZXkuY1szXTsKKworCXB0ciA9CisJICAgIFN0dWZmRGF0YShza2ItPmRhdGEgKyBzaXplb2YoU1RSSVBfSGVhZGVyKSwgbGVuLCBwdHIsCisJCSAgICAgICZzdHVmZnN0YXRlKTsKKworCWlmIChzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA+PSBDaGVja3N1bW1lZE1lc3NhZ2VzKQorCQlwdHIgPSBhZGRfY2hlY2tzdW0oYnVmZmVyICsgMSwgcHRyKTsKKworCSpwdHIrKyA9IDB4MEQ7CisJcmV0dXJuIChwdHIpOworfQorCitzdGF0aWMgdm9pZCBzdHJpcF9zZW5kKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlNZXRyaWNvbUFkZHJlc3MgaGFkZHI7CisJdW5zaWduZWQgY2hhciAqcHRyID0gc3RyaXBfaW5mby0+dHhfYnVmZjsKKwlpbnQgZG9yZXNldCA9IChsb25nKSBqaWZmaWVzIC0gc3RyaXBfaW5mby0+d2F0Y2hkb2dfZG9yZXNldCA+PSAwOworCWludCBkb3Byb2JlID0gKGxvbmcpIGppZmZpZXMgLSBzdHJpcF9pbmZvLT53YXRjaGRvZ19kb3Byb2JlID49IDAKKwkgICAgJiYgIWRvcmVzZXQ7CisJdTMyIGFkZHIsIGJyZDsKKworCS8qCisJICogMS4gSWYgd2UgaGF2ZSBhIHBhY2tldCwgZW5jYXBzdWxhdGUgaXQgYW5kIHB1dCBpdCBpbiB0aGUgYnVmZmVyCisJICovCisJaWYgKHNrYikgeworCQljaGFyICpuZXdwdHIgPSBzdHJpcF9tYWtlX3BhY2tldChwdHIsIHN0cmlwX2luZm8sIHNrYik7CisJCXN0cmlwX2luZm8tPnR4X3Bwc19jb3VudCsrOworCQlpZiAoIW5ld3B0cikKKwkJCXN0cmlwX2luZm8tPnR4X2Ryb3BwZWQrKzsKKwkJZWxzZSB7CisJCQlwdHIgPSBuZXdwdHI7CisJCQlzdHJpcF9pbmZvLT5zeF9wcHNfY291bnQrKzsKKwkJCXN0cmlwX2luZm8tPnR4X3BhY2tldHMrKzsJLyogQ291bnQgYW5vdGhlciBzdWNjZXNzZnVsIHBhY2tldCAqLworI2lmZGVmIEVYVF9DT1VOVEVSUworCQkJc3RyaXBfaW5mby0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQlzdHJpcF9pbmZvLT50eF9yYnl0ZXMgKz0gcHRyIC0gc3RyaXBfaW5mby0+dHhfYnVmZjsKKyNlbmRpZgorCQkJLypEdW1wRGF0YSgiU2VuZGluZzoiLCBzdHJpcF9pbmZvLCBzdHJpcF9pbmZvLT50eF9idWZmLCBwdHIpOyAqLworCQkJLypIZXhEdW1wKCJTZW5kaW5nIiwgc3RyaXBfaW5mbywgc3RyaXBfaW5mby0+dHhfYnVmZiwgcHRyKTsgKi8KKwkJfQorCX0KKworCS8qCisJICogMi4gSWYgaXQgaXMgdGltZSBmb3IgYW5vdGhlciB0aWNrbGUsIHRhY2sgaXQgb24sIGFmdGVyIHRoZSBwYWNrZXQKKwkgKi8KKwlpZiAoZG9wcm9iZSkgeworCQlTdHJpbmdEZXNjcmlwdG9yIHRzID0gQ29tbWFuZFN0cmluZ1tzdHJpcF9pbmZvLT5uZXh0X2NvbW1hbmRdOworI2lmIFRJQ0tMRV9USU1FUlMKKwkJeworCQkJc3RydWN0IHRpbWV2YWwgdHY7CisJCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJCXByaW50ayhLRVJOX0lORk8gIioqKiogU2VuZGluZyB0aWNrbGUgc3RyaW5nICVkICAgICAgYXQgJTAyZC4lMDZkXG4iLAorCQkJICAgICAgIHN0cmlwX2luZm8tPm5leHRfY29tbWFuZCwgdHYudHZfc2VjICUgMTAwLAorCQkJICAgICAgIHR2LnR2X3VzZWMpOworCQl9CisjZW5kaWYKKwkJaWYgKHB0ciA9PSBzdHJpcF9pbmZvLT50eF9idWZmKQorCQkJKnB0cisrID0gMHgwRDsKKworCQkqcHRyKysgPSAnKic7CS8qIEZpcnN0IHNlbmQgIioqIiB0byBwcm92b2tlIGFuIGVycm9yIG1lc3NhZ2UgKi8KKwkJKnB0cisrID0gJyonOworCisJCS8qIFRoZW4gYWRkIHRoZSBjb21tYW5kICovCisJCW1lbWNweShwdHIsIHRzLnN0cmluZywgdHMubGVuZ3RoKTsKKworCQkvKiBBZGQgYSBjaGVja3N1bSA/ICovCisJCWlmIChzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA8IENoZWNrc3VtbWVkTWVzc2FnZXMpCisJCQlwdHIgKz0gdHMubGVuZ3RoOworCQllbHNlCisJCQlwdHIgPSBhZGRfY2hlY2tzdW0ocHRyLCBwdHIgKyB0cy5sZW5ndGgpOworCisJCSpwdHIrKyA9IDB4MEQ7CS8qIFRlcm1pbmF0ZSB0aGUgY29tbWFuZCB3aXRoIGEgPENSPiAqLworCisJCS8qIEN5Y2xlIHRvIG5leHQgcGVyaW9kaWMgY29tbWFuZD8gKi8KKwkJaWYgKHN0cmlwX2luZm8tPmZpcm13YXJlX2xldmVsID49IFN0cnVjdHVyZWRNZXNzYWdlcykKKwkJCWlmICgrK3N0cmlwX2luZm8tPm5leHRfY29tbWFuZCA+PQorCQkJICAgIEFSUkFZX1NJWkUoQ29tbWFuZFN0cmluZykpCisJCQkJc3RyaXBfaW5mby0+bmV4dF9jb21tYW5kID0gMDsKKyNpZmRlZiBFWFRfQ09VTlRFUlMKKwkJc3RyaXBfaW5mby0+dHhfZWJ5dGVzICs9IHRzLmxlbmd0aDsKKyNlbmRpZgorCQlzdHJpcF9pbmZvLT53YXRjaGRvZ19kb3Byb2JlID0gamlmZmllcyArIDEwICogSFo7CisJCXN0cmlwX2luZm8tPndhdGNoZG9nX2RvcmVzZXQgPSBqaWZmaWVzICsgMSAqIEhaOworCQkvKnByaW50ayhLRVJOX0lORk8gIiVzOiBSb3V0aW5lIHJhZGlvIHRlc3QuXG4iLCBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOyAqLworCX0KKworCS8qCisJICogMy4gU2V0IHVwIHRoZSBzdHJpcF9pbmZvIHJlYWR5IHRvIHNlbmQgdGhlIGRhdGEgKGlmIGFueSkuCisJICovCisJc3RyaXBfaW5mby0+dHhfaGVhZCA9IHN0cmlwX2luZm8tPnR4X2J1ZmY7CisJc3RyaXBfaW5mby0+dHhfbGVmdCA9IHB0ciAtIHN0cmlwX2luZm8tPnR4X2J1ZmY7CisJc3RyaXBfaW5mby0+dHR5LT5mbGFncyB8PSAoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKworCS8qCisJICogNC4gRGVidWdnaW5nIGNoZWNrIHRvIG1ha2Ugc3VyZSB3ZSdyZSBub3Qgb3ZlcmZsb3dpbmcgdGhlIGJ1ZmZlci4KKwkgKi8KKwlpZiAoc3RyaXBfaW5mby0+dHhfc2l6ZSAtIHN0cmlwX2luZm8tPnR4X2xlZnQgPCAyMCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogU2VuZGluZyU1ZCBieXRlczslNWQgYnl0ZXMgZnJlZS5cbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIHN0cmlwX2luZm8tPnR4X2xlZnQsCisJCSAgICAgICBzdHJpcF9pbmZvLT50eF9zaXplIC0gc3RyaXBfaW5mby0+dHhfbGVmdCk7CisKKwkvKgorCSAqIDUuIElmIHdhdGNoZG9nIGhhcyBleHBpcmVkLCByZXNldCB0aGUgcmFkaW8uIE5vdGU6IGlmIHRoZXJlJ3MgZGF0YSB3YWl0aW5nIGluCisJICogdGhlIGJ1ZmZlciwgc3RyaXBfd3JpdGVfc29tZV9tb3JlIHdpbGwgc2VuZCBpdCBhZnRlciB0aGUgcmVzZXQgaGFzIGZpbmlzaGVkCisJICovCisJaWYgKGRvcmVzZXQpIHsKKwkJUmVzZXRSYWRpbyhzdHJpcF9pbmZvKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgxKSB7CisJCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKworCQlicmQgPSBhZGRyID0gMDsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlpbl9kZXYgPSBfX2luX2Rldl9nZXQoc3RyaXBfaW5mby0+ZGV2KTsKKwkJaWYgKGluX2RldikgeworCQkJaWYgKGluX2Rldi0+aWZhX2xpc3QpIHsKKwkJCQlicmQgPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfYnJvYWRjYXN0OworCQkJCWFkZHIgPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWw7CisJCQl9CisJCX0KKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJfQorCisKKwkvKgorCSAqIDYuIElmIGl0IGlzIHRpbWUgZm9yIGEgcGVyaW9kaWMgQVJQLCBxdWV1ZSBvbmUgdXAgdG8gYmUgc2VudC4KKwkgKiBXZSBvbmx5IGRvIHRoaXMgaWY6CisJICogIDEuIFRoZSByYWRpbyBpcyB3b3JraW5nCisJICogIDIuIEl0J3MgdGltZSB0byBzZW5kIGFub3RoZXIgcGVyaW9kaWMgQVJQCisJICogIDMuIFdlIHJlYWxseSBrbm93IHdoYXQgb3VyIGFkZHJlc3MgaXMgKGFuZCBpdCBpcyBub3QgbWFudWFsbHkgc2V0IHRvIHplcm8pCisJICogIDQuIFdlIGhhdmUgYSBkZXNpZ25hdGVkIGJyb2FkY2FzdCBhZGRyZXNzIGNvbmZpZ3VyZWQKKwkgKiBJZiB3ZSBxdWV1ZSB1cCBhbiBBUlAgcGFja2V0IHdoZW4gd2UgZG9uJ3QgaGF2ZSBhIGRlc2lnbmF0ZWQgYnJvYWRjYXN0CisJICogYWRkcmVzcyBjb25maWd1cmVkLCB0aGVuIHRoZSBwYWNrZXQgd2lsbCBqdXN0IGhhdmUgdG8gYmUgZGlzY2FyZGVkIGluCisJICogc3RyaXBfbWFrZV9wYWNrZXQuIFRoaXMgaXMgbm90IGZhdGFsLCBidXQgaXQgY2F1c2VzIG1pc2xlYWRpbmcgaW5mb3JtYXRpb24KKwkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGNwZHVtcC4gdGNwZHVtcCB3aWxsIHJlcG9ydCB0aGF0IHBlcmlvZGljIEFQUnMgYXJlCisJICogYmVpbmcgc2VudCwgd2hlbiBpbiBmYWN0IHRoZXkgYXJlIG5vdCwgYmVjYXVzZSB0aGV5IGFyZSBhbGwgYmVpbmcgZHJvcHBlZAorCSAqIGluIHRoZSBzdHJpcF9tYWtlX3BhY2tldCByb3V0aW5lLgorCSAqLworCWlmIChzdHJpcF9pbmZvLT53b3JraW5nCisJICAgICYmIChsb25nKSBqaWZmaWVzIC0gc3RyaXBfaW5mby0+Z3JhdHVpdG91c19hcnAgPj0gMAorCSAgICAmJiBtZW1jbXAoc3RyaXBfaW5mby0+ZGV2LT5kZXZfYWRkciwgemVyb19hZGRyZXNzLmMsCisJCSAgICAgIHNpemVvZih6ZXJvX2FkZHJlc3MpKQorCSAgICAmJiBhcnBfcXVlcnkoaGFkZHIuYywgYnJkLCBzdHJpcF9pbmZvLT5kZXYpKSB7CisJCS8qcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNlbmRpbmcgZ3JhdHVpdG91cyBBUlAgd2l0aCBpbnRlcnZhbCAlbGRcbiIsCisJCSAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgc3RyaXBfaW5mby0+YXJwX2ludGVydmFsIC8gSFopOyAqLworCQlzdHJpcF9pbmZvLT5ncmF0dWl0b3VzX2FycCA9CisJCSAgICBqaWZmaWVzICsgc3RyaXBfaW5mby0+YXJwX2ludGVydmFsOworCQlzdHJpcF9pbmZvLT5hcnBfaW50ZXJ2YWwgKj0gMjsKKwkJaWYgKHN0cmlwX2luZm8tPmFycF9pbnRlcnZhbCA+IE1heEFSUEludGVydmFsKQorCQkJc3RyaXBfaW5mby0+YXJwX2ludGVydmFsID0gTWF4QVJQSW50ZXJ2YWw7CisJCWlmIChhZGRyKQorCQkJYXJwX3NlbmQoQVJQT1BfUkVQTFksIEVUSF9QX0FSUCwgYWRkciwJLyogVGFyZ2V0IGFkZHJlc3Mgb2YgQVJQIHBhY2tldCBpcyBvdXIgYWRkcmVzcyAqLworCQkJCSBzdHJpcF9pbmZvLT5kZXYsCS8qIERldmljZSB0byBzZW5kIHBhY2tldCBvbiAqLworCQkJCSBhZGRyLAkvKiBTb3VyY2UgSVAgYWRkcmVzcyB0aGlzIEFSUCBwYWNrZXQgY29tZXMgZnJvbSAqLworCQkJCSBOVUxMLAkvKiBEZXN0aW5hdGlvbiBIVyBhZGRyZXNzIGlzIE5VTEwgKGJyb2FkY2FzdCBpdCkgKi8KKwkJCQkgc3RyaXBfaW5mby0+ZGV2LT5kZXZfYWRkciwJLyogU291cmNlIEhXIGFkZHJlc3MgaXMgb3VyIEhXIGFkZHJlc3MgKi8KKwkJCQkgc3RyaXBfaW5mby0+ZGV2LT5kZXZfYWRkcik7CS8qIFRhcmdldCBIVyBhZGRyZXNzIGlzIG91ciBIVyBhZGRyZXNzIChyZWR1bmRhbnQpICovCisJfQorCisJLyoKKwkgKiA3LiBBbGwgcmVhZHkuIFN0YXJ0IHRoZSB0cmFuc21pc3Npb24KKwkgKi8KKwlzdHJpcF93cml0ZV9zb21lX21vcmUoc3RyaXBfaW5mby0+dHR5KTsKK30KKworLyogRW5jYXBzdWxhdGUgYSBkYXRhZ3JhbSBhbmQga2ljayBpdCBpbnRvIGEgVFRZIHF1ZXVlLiAqLworc3RhdGljIGludCBzdHJpcF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHhtaXQgY2FsbCB3aGVuIGlmYWNlIGlzIGRvd25cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gKDEpOworCX0KKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWRlbF90aW1lcigmc3RyaXBfaW5mby0+aWRsZV90aW1lcik7CisKKworCWlmIChqaWZmaWVzIC0gc3RyaXBfaW5mby0+cHBzX3RpbWVyID4gSFopIHsKKwkJdW5zaWduZWQgbG9uZyB0ID0gamlmZmllcyAtIHN0cmlwX2luZm8tPnBwc190aW1lcjsKKwkJdW5zaWduZWQgbG9uZyByeF9wcHNfY291bnQgPSAoc3RyaXBfaW5mby0+cnhfcHBzX2NvdW50ICogSFogKiA4ICsgdCAvIDIpIC8gdDsKKwkJdW5zaWduZWQgbG9uZyB0eF9wcHNfY291bnQgPSAoc3RyaXBfaW5mby0+dHhfcHBzX2NvdW50ICogSFogKiA4ICsgdCAvIDIpIC8gdDsKKwkJdW5zaWduZWQgbG9uZyBzeF9wcHNfY291bnQgPSAoc3RyaXBfaW5mby0+c3hfcHBzX2NvdW50ICogSFogKiA4ICsgdCAvIDIpIC8gdDsKKworCQlzdHJpcF9pbmZvLT5wcHNfdGltZXIgPSBqaWZmaWVzOworCQlzdHJpcF9pbmZvLT5yeF9wcHNfY291bnQgPSAwOworCQlzdHJpcF9pbmZvLT50eF9wcHNfY291bnQgPSAwOworCQlzdHJpcF9pbmZvLT5zeF9wcHNfY291bnQgPSAwOworCisJCXN0cmlwX2luZm8tPnJ4X2F2ZXJhZ2VfcHBzID0gKHN0cmlwX2luZm8tPnJ4X2F2ZXJhZ2VfcHBzICsgcnhfcHBzX2NvdW50ICsgMSkgLyAyOworCQlzdHJpcF9pbmZvLT50eF9hdmVyYWdlX3BwcyA9IChzdHJpcF9pbmZvLT50eF9hdmVyYWdlX3BwcyArIHR4X3Bwc19jb3VudCArIDEpIC8gMjsKKwkJc3RyaXBfaW5mby0+c3hfYXZlcmFnZV9wcHMgPSAoc3RyaXBfaW5mby0+c3hfYXZlcmFnZV9wcHMgKyBzeF9wcHNfY291bnQgKyAxKSAvIDI7CisKKwkJaWYgKHJ4X3Bwc19jb3VudCAvIDggPj0gMTApCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogV0FSTklORzogUmVjZWl2aW5nICVsZCBwYWNrZXRzIHBlciBzZWNvbmQuXG4iLAorCQkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgcnhfcHBzX2NvdW50IC8gOCk7CisJCWlmICh0eF9wcHNfY291bnQgLyA4ID49IDEwKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFdBUk5JTkc6IFR4ICAgICAgICAlbGQgcGFja2V0cyBwZXIgc2Vjb25kLlxuIiwKKwkJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIHR4X3Bwc19jb3VudCAvIDgpOworCQlpZiAoc3hfcHBzX2NvdW50IC8gOCA+PSAxMCkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBXQVJOSU5HOiBTZW5kaW5nICAgJWxkIHBhY2tldHMgcGVyIHNlY29uZC5cbiIsCisJCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBzeF9wcHNfY291bnQgLyA4KTsKKwl9CisKKwlzcGluX2xvY2tfYmgoJnN0cmlwX2xvY2spOworCisJc3RyaXBfc2VuZChzdHJpcF9pbmZvLCBza2IpOworCisJc3Bpbl91bmxvY2tfYmgoJnN0cmlwX2xvY2spOworCisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCisvKgorICogSWRsZVRhc2sgcGVyaW9kaWNhbGx5IGNhbGxzIHN0cmlwX3htaXQsIHNvIGV2ZW4gd2hlbiB3ZSBoYXZlIG5vIElQIHBhY2tldHMKKyAqIHRvIHNlbmQgZm9yIGFuIGV4dGVuZGVkIHBlcmlvZCBvZiB0aW1lLCB0aGUgd2F0Y2hkb2cgcHJvY2Vzc2luZyBzdGlsbCBnZXRzCisgKiBkb25lIHRvIGVuc3VyZSB0aGF0IHRoZSByYWRpbyBzdGF5cyBpbiBTdGFybW9kZQorICovCisKK3N0YXRpYyB2b2lkIHN0cmlwX0lkbGVUYXNrKHVuc2lnbmVkIGxvbmcgcGFyYW1ldGVyKQoreworCXN0cmlwX3htaXQoTlVMTCwgKHN0cnVjdCBuZXRfZGV2aWNlICopIHBhcmFtZXRlcik7Cit9CisKKy8qCisgKiBDcmVhdGUgdGhlIE1BQyBoZWFkZXIgZm9yIGFuIGFyYml0cmFyeSBwcm90b2NvbCBsYXllcgorICoKKyAqIHNhZGRyIT1OVUxMICAgICAgICBtZWFucyB1c2UgdGhpcyBzcGVjaWZpYyBhZGRyZXNzIChuL2EgZm9yIE1ldHJpY29tKQorICogc2FkZHI9PU5VTEwgICAgICAgIG1lYW5zIHVzZSBkZWZhdWx0IGRldmljZSBzb3VyY2UgYWRkcmVzcworICogZGFkZHIhPU5VTEwgICAgICAgIG1lYW5zIHVzZSB0aGlzIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqIGRhZGRyPT1OVUxMICAgICAgICBtZWFucyBsZWF2ZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGFsb25lCisgKiAgICAgICAgICAgICAgICAgKGUuZy4gdW5yZXNvbHZlZCBhcnAgLS0ga2VybmVsIHdpbGwgY2FsbAorICogICAgICAgICAgICAgICAgIHJlYnVpbGRfaGVhZGVyIGxhdGVyIHRvIGZpbGwgaW4gdGhlIGFkZHJlc3MpCisgKi8KKworc3RhdGljIGludCBzdHJpcF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwKKwkJCXVuc2lnbmVkIGxlbikKK3sKKwlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8gPSBuZXRkZXZfcHJpdihkZXYpOworCVNUUklQX0hlYWRlciAqaGVhZGVyID0gKFNUUklQX0hlYWRlciAqKSBza2JfcHVzaChza2IsIHNpemVvZihTVFJJUF9IZWFkZXIpKTsKKworCS8qcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHN0cmlwX2hlYWRlciAweCUwNFggJXNcbiIsIGRldi0+bmFtZSwgdHlwZSwKKwkgICB0eXBlID09IEVUSF9QX0lQID8gIklQIiA6IHR5cGUgPT0gRVRIX1BfQVJQID8gIkFSUCIgOiAiIik7ICovCisKKwloZWFkZXItPnNyY19hZGRyID0gc3RyaXBfaW5mby0+dHJ1ZV9kZXZfYWRkcjsKKwloZWFkZXItPnByb3RvY29sID0gaHRvbnModHlwZSk7CisKKwkvKkhleER1bXAoInN0cmlwX2hlYWRlciIsIG5ldGRldl9wcml2KGRldiksIHNrYi0+ZGF0YSwgc2tiLT5kYXRhICsgc2tiLT5sZW4pOyAqLworCisJaWYgKCFkYWRkcikKKwkJcmV0dXJuICgtZGV2LT5oYXJkX2hlYWRlcl9sZW4pOworCisJaGVhZGVyLT5kc3RfYWRkciA9ICooTWV0cmljb21BZGRyZXNzICopIGRhZGRyOworCXJldHVybiAoZGV2LT5oYXJkX2hlYWRlcl9sZW4pOworfQorCisvKgorICogUmVidWlsZCB0aGUgTUFDIGhlYWRlci4gVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYW4gQVJQCisgKiAob3IgaW4gZnV0dXJlIG90aGVyIGFkZHJlc3MgcmVzb2x1dGlvbikgaGFzIGNvbXBsZXRlZCBvbiB0aGlzCisgKiBza19idWZmLiBXZSBub3cgbGV0IEFSUCBmaWxsIGluIHRoZSBvdGhlciBmaWVsZHMuCisgKiBJIHRoaW5rIHRoaXMgc2hvdWxkIHJldHVybiB6ZXJvIGlmIHBhY2tldCBpcyByZWFkeSB0byBzZW5kLAorICogb3Igbm9uLXplcm8gaWYgaXQgbmVlZHMgbW9yZSB0aW1lIHRvIGRvIGFuIGFkZHJlc3MgbG9va3VwCisgKi8KKworc3RhdGljIGludCBzdHJpcF9yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworI2lmZGVmIENPTkZJR19JTkVUCisJU1RSSVBfSGVhZGVyICpoZWFkZXIgPSAoU1RSSVBfSGVhZGVyICopIHNrYi0+ZGF0YTsKKworCS8qIEFycCBmaW5kIHJldHVybnMgemVybyBpZiBpZiBrbm93cyB0aGUgYWRkcmVzcywgKi8KKwkvKiBvciBpZiBpdCBkb2Vzbid0IGtub3cgdGhlIGFkZHJlc3MgaXQgc2VuZHMgYW4gQVJQIHBhY2tldCBhbmQgcmV0dXJucyBub24temVybyAqLworCXJldHVybiBhcnBfZmluZChoZWFkZXItPmRzdF9hZGRyLmMsIHNrYikgPyAxIDogMDsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUmVjZWl2aW5nIHJvdXRpbmVzCQkJCQkJCSovCisKK3N0YXRpYyBpbnQgc3RyaXBfcmVjZWl2ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmV0dXJuIDB4MTAwMDA7CQkvKiBXZSBjYW4gaGFuZGxlIGFuIGluZmluaXRlIGFtb3VudCBvZiBkYXRhLiA6LSkgKi8KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSByZXNwb25zZSB0byB0aGUgQVRTMzAwPyBjb21tYW5kLAorICogZXh0cmFjdGluZyB0aGUgcmFkaW8gdmVyc2lvbiBhbmQgc2VyaWFsIG51bWJlci4KKyAqLworc3RhdGljIHZvaWQgZ2V0X3JhZGlvX3ZlcnNpb24oc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvLCBfX3U4ICogcHRyLCBfX3U4ICogZW5kKQoreworCV9fdTggKnAsICp2YWx1ZV9iZWdpbiwgKnZhbHVlX2VuZDsKKwlpbnQgbGVuOworCisJLyogRGV0ZXJtaW5lIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY29uZCBsaW5lIG9mIHRoZSBwYXlsb2FkICovCisJcCA9IHB0cjsKKwl3aGlsZSAocCA8IGVuZCAmJiAqcCAhPSAxMCkKKwkJcCsrOworCWlmIChwID49IGVuZCkKKwkJcmV0dXJuOworCXArKzsKKwl2YWx1ZV9iZWdpbiA9IHA7CisKKwkvKiBEZXRlcm1pbmUgdGhlIGVuZCBvZiBsaW5lICovCisJd2hpbGUgKHAgPCBlbmQgJiYgKnAgIT0gMTApCisJCXArKzsKKwlpZiAocCA+PSBlbmQpCisJCXJldHVybjsKKwl2YWx1ZV9lbmQgPSBwOworCXArKzsKKworCWxlbiA9IHZhbHVlX2VuZCAtIHZhbHVlX2JlZ2luOworCWxlbiA9IG1pbl90KGludCwgbGVuLCBzaXplb2YoRmlybXdhcmVWZXJzaW9uKSAtIDEpOworCWlmIChzdHJpcF9pbmZvLT5maXJtd2FyZV92ZXJzaW9uLmNbMF0gPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJhZGlvIEZpcm13YXJlOiAlLipzXG4iLAorCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBsZW4sIHZhbHVlX2JlZ2luKTsKKwlzcHJpbnRmKHN0cmlwX2luZm8tPmZpcm13YXJlX3ZlcnNpb24uYywgIiUuKnMiLCBsZW4sIHZhbHVlX2JlZ2luKTsKKworCS8qIExvb2sgZm9yIHRoZSBmaXJzdCBjb2xvbiAqLworCXdoaWxlIChwIDwgZW5kICYmICpwICE9ICc6JykKKwkJcCsrOworCWlmIChwID49IGVuZCkKKwkJcmV0dXJuOworCS8qIFNraXAgb3ZlciB0aGUgc3BhY2UgKi8KKwlwICs9IDI7CisJbGVuID0gc2l6ZW9mKFNlcmlhbE51bWJlcikgLSAxOworCWlmIChwICsgbGVuIDw9IGVuZCkgeworCQlzcHJpbnRmKHN0cmlwX2luZm8tPnNlcmlhbF9udW1iZXIuYywgIiUuKnMiLCBsZW4sIHApOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiU1RSSVA6IHJhZGlvIHNlcmlhbCBudW1iZXIgc2hvcnRlciAoJXpkKSB0aGFuIGV4cGVjdGVkICglZClcbiIsCisJCSAgICAgICBlbmQgLSBwLCBsZW4pOworCX0KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSByZXNwb25zZSB0byB0aGUgQVRTMzI1PyBjb21tYW5kLAorICogZXh0cmFjdGluZyB0aGUgcmFkaW8gYmF0dGVyeSB2b2x0YWdlLgorICovCitzdGF0aWMgdm9pZCBnZXRfcmFkaW9fdm9sdGFnZShzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sIF9fdTggKiBwdHIsIF9fdTggKiBlbmQpCit7CisJaW50IGxlbjsKKworCWxlbiA9IHNpemVvZihCYXR0ZXJ5Vm9sdGFnZSkgLSAxOworCWlmIChwdHIgKyBsZW4gPD0gZW5kKSB7CisJCXNwcmludGYoc3RyaXBfaW5mby0+YmF0dGVyeV92b2x0YWdlLmMsICIlLipzIiwgbGVuLCBwdHIpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiU1RSSVA6IHJhZGlvIHZvbHRhZ2Ugc3RyaW5nIHNob3J0ZXIgKCV6ZCkgdGhhbiBleHBlY3RlZCAoJWQpXG4iLAorCQkgICAgICAgZW5kIC0gcHRyLCBsZW4pOworCX0KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSByZXNwb25zZXMgdG8gdGhlIEFUfkxBIGFuZCBBVFMzMTEgY29tbWFuZHMsCisgKiB3aGljaCBsaXN0IHRoZSByYWRpbydzIG5laWdoYm91cnMuCisgKi8KK3N0YXRpYyB2b2lkIGdldF9yYWRpb19uZWlnaGJvdXJzKE1ldHJpY29tTm9kZVRhYmxlICogdGFibGUsIF9fdTggKiBwdHIsIF9fdTggKiBlbmQpCit7CisJdGFibGUtPm51bV9ub2RlcyA9IDA7CisJd2hpbGUgKHB0ciA8IGVuZCAmJiB0YWJsZS0+bnVtX25vZGVzIDwgTk9ERV9UQUJMRV9TSVpFKSB7CisJCU1ldHJpY29tTm9kZSAqbm9kZSA9ICZ0YWJsZS0+bm9kZVt0YWJsZS0+bnVtX25vZGVzKytdOworCQljaGFyICpkc3QgPSBub2RlLT5jLCAqbGltaXQgPSBkc3QgKyBzaXplb2YoKm5vZGUpIC0gMTsKKwkJd2hpbGUgKHB0ciA8IGVuZCAmJiAqcHRyIDw9IDMyKQorCQkJcHRyKys7CisJCXdoaWxlIChwdHIgPCBlbmQgJiYgZHN0IDwgbGltaXQgJiYgKnB0ciAhPSAxMCkKKwkJCSpkc3QrKyA9ICpwdHIrKzsKKwkJKmRzdCsrID0gMDsKKwkJd2hpbGUgKHB0ciA8IGVuZCAmJiBwdHJbLTFdICE9IDEwKQorCQkJcHRyKys7CisJfQorCWRvX2dldHRpbWVvZmRheSgmdGFibGUtPnRpbWVzdGFtcCk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3JhZGlvX2FkZHJlc3Moc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvLCBfX3U4ICogcCkKK3sKKwlNZXRyaWNvbUFkZHJlc3MgYWRkcjsKKworCWlmIChzdHJpbmdfdG9fcmFkaW9fYWRkcmVzcygmYWRkciwgcCkpCisJCXJldHVybiAoMSk7CisKKwkvKiBTZWUgaWYgb3VyIHJhZGlvIGFkZHJlc3MgaGFzIGNoYW5nZWQgKi8KKwlpZiAobWVtY21wKHN0cmlwX2luZm8tPnRydWVfZGV2X2FkZHIuYywgYWRkci5jLCBzaXplb2YoYWRkcikpKSB7CisJCU1ldHJpY29tQWRkcmVzc1N0cmluZyBhZGRyX3N0cmluZzsKKwkJcmFkaW9fYWRkcmVzc190b19zdHJpbmcoJmFkZHIsICZhZGRyX3N0cmluZyk7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSYWRpbyBhZGRyZXNzID0gJXNcbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIGFkZHJfc3RyaW5nLmMpOworCQlzdHJpcF9pbmZvLT50cnVlX2Rldl9hZGRyID0gYWRkcjsKKwkJaWYgKCFzdHJpcF9pbmZvLT5tYW51YWxfZGV2X2FkZHIpCisJCQkqKE1ldHJpY29tQWRkcmVzcyAqKSBzdHJpcF9pbmZvLT5kZXYtPmRldl9hZGRyID0KKwkJCSAgICBhZGRyOworCQkvKiBHaXZlIHRoZSByYWRpbyBhIGZldyBzZWNvbmRzIHRvIGdldCBpdHMgaGVhZCBzdHJhaWdodCwgdGhlbiBzZW5kIGFuIGFycCAqLworCQlzdHJpcF9pbmZvLT5ncmF0dWl0b3VzX2FycCA9IGppZmZpZXMgKyAxNSAqIEhaOworCQlzdHJpcF9pbmZvLT5hcnBfaW50ZXJ2YWwgPSAxICogSFo7CisJfQorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X2NoZWNrc3VtKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbykKK3sKKwlfX3U4ICpwID0gc3RyaXBfaW5mby0+c3hfYnVmZjsKKwlfX3U4ICplbmQgPSBzdHJpcF9pbmZvLT5zeF9idWZmICsgc3RyaXBfaW5mby0+c3hfY291bnQgLSA0OworCXVfc2hvcnQgc3VtID0KKwkgICAgKFJFQURIRVgxNihlbmRbMF0pIDw8IDEyKSB8IChSRUFESEVYMTYoZW5kWzFdKSA8PCA4KSB8CisJICAgIChSRUFESEVYMTYoZW5kWzJdKSA8PCA0KSB8IChSRUFESEVYMTYoZW5kWzNdKSk7CisJd2hpbGUgKHAgPCBlbmQpCisJCXN1bSAtPSAqcCsrOworCWlmIChzdW0gPT0gMCAmJiBzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA9PSBTdHJ1Y3R1cmVkTWVzc2FnZXMpIHsKKwkJc3RyaXBfaW5mby0+ZmlybXdhcmVfbGV2ZWwgPSBDaGVja3N1bW1lZE1lc3NhZ2VzOworCQlwcmludGsoS0VSTl9JTkZPICIlczogUmFkaW8gcHJvdmlkZXMgbWVzc2FnZSBjaGVja3N1bXNcbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCX0KKwlyZXR1cm4gKHN1bSA9PSAwKTsKK30KKworc3RhdGljIHZvaWQgUmVjdkVycihjaGFyICptc2csIHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbykKK3sKKwlfX3U4ICpwdHIgPSBzdHJpcF9pbmZvLT5zeF9idWZmOworCV9fdTggKmVuZCA9IHN0cmlwX2luZm8tPnN4X2J1ZmYgKyBzdHJpcF9pbmZvLT5zeF9jb3VudDsKKwlEdW1wRGF0YShtc2csIHN0cmlwX2luZm8sIHB0ciwgZW5kKTsKKwlzdHJpcF9pbmZvLT5yeF9lcnJvcnMrKzsKK30KKworc3RhdGljIHZvaWQgUmVjdkVycl9NZXNzYWdlKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbywgX191OCAqIHNlbmRlcm5hbWUsCisJCQkgICAgY29uc3QgX191OCAqIG1zZywgdV9sb25nIGxlbikKK3sKKwlpZiAoaGFzX3ByZWZpeChtc2csIGxlbiwgIjAwMSIpKSB7CS8qIE5vdCBpbiBTdGFyTW9kZSEgKi8KKwkJUmVjdkVycigiRXJyb3IgTXNnOiIsIHN0cmlwX2luZm8pOworCQlwcmludGsoS0VSTl9JTkZPICIlczogUmFkaW8gJXMgaXMgbm90IGluIFN0YXJNb2RlXG4iLAorCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBzZW5kZXJuYW1lKTsKKwl9CisKKwllbHNlIGlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiMDAyIikpIHsJLyogUmVtYXAgaGFuZGxlICovCisJCS8qIFdlIGlnbm9yZSAiUmVtYXAgaGFuZGxlIiBtZXNzYWdlcyBmb3Igbm93ICovCisJfQorCisJZWxzZSBpZiAoaGFzX3ByZWZpeChtc2csIGxlbiwgIjAwMyIpKSB7CS8qIENhbid0IHJlc29sdmUgbmFtZSAqLworCQlSZWN2RXJyKCJFcnJvciBNc2c6Iiwgc3RyaXBfaW5mbyk7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBEZXN0aW5hdGlvbiByYWRpbyBuYW1lIGlzIHVua25vd25cbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCX0KKworCWVsc2UgaWYgKGhhc19wcmVmaXgobXNnLCBsZW4sICIwMDQiKSkgewkvKiBOYW1lIHRvbyBzbWFsbCBvciBtaXNzaW5nICovCisJCXN0cmlwX2luZm8tPndhdGNoZG9nX2RvcmVzZXQgPSBqaWZmaWVzICsgTG9uZ1RpbWU7CisjaWYgVElDS0xFX1RJTUVSUworCQl7CisJCQlzdHJ1Y3QgdGltZXZhbCB0djsKKwkJCWRvX2dldHRpbWVvZmRheSgmdHYpOworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICIqKioqIEdvdCBFUlJfMDA0IHJlc3BvbnNlICAgICAgICAgYXQgJTAyZC4lMDZkXG4iLAorCQkJICAgICAgIHR2LnR2X3NlYyAlIDEwMCwgdHYudHZfdXNlYyk7CisJCX0KKyNlbmRpZgorCQlpZiAoIXN0cmlwX2luZm8tPndvcmtpbmcpIHsKKwkJCXN0cmlwX2luZm8tPndvcmtpbmcgPSBUUlVFOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJhZGlvIG5vdyBpbiBzdGFybW9kZVxuIiwKKwkJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCQkJLyoKKwkJCSAqIElmIHRoZSByYWRpbyBoYXMganVzdCBlbnRlcmVkIGEgd29ya2luZyBzdGF0ZSwgd2Ugc2hvdWxkIGRvIG91ciBmaXJzdAorCQkJICogcHJvYmUgQVNBUCwgc28gdGhhdCB3ZSBmaW5kIG91dCBvdXIgcmFkaW8gYWRkcmVzcyBldGMuIHdpdGhvdXQgZGVsYXkuCisJCQkgKi8KKwkJCXN0cmlwX2luZm8tPndhdGNoZG9nX2RvcHJvYmUgPSBqaWZmaWVzOworCQl9CisJCWlmIChzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA9PSBOb1N0cnVjdHVyZSAmJiBzZW5kZXJuYW1lKSB7CisJCQlzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA9IFN0cnVjdHVyZWRNZXNzYWdlczsKKwkJCXN0cmlwX2luZm8tPm5leHRfY29tbWFuZCA9IDA7CS8qIFRyeSB0byBlbmFibGUgY2hlY2tzdW1zIEFTQVAgKi8KKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAiJXM6IFJhZGlvIHByb3ZpZGVzIHN0cnVjdHVyZWQgbWVzc2FnZXNcbiIsCisJCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKwkJfQorCQlpZiAoc3RyaXBfaW5mby0+ZmlybXdhcmVfbGV2ZWwgPj0gU3RydWN0dXJlZE1lc3NhZ2VzKSB7CisJCQkvKgorCQkJICogSWYgdGhpcyBtZXNzYWdlIGhhcyBhIHZhbGlkIGNoZWNrc3VtIG9uIHRoZSBlbmQsIHRoZW4gdGhlIGNhbGwgdG8gdmVyaWZ5X2NoZWNrc3VtCisJCQkgKiB3aWxsIGVsZXZhdGUgdGhlIGZpcm13YXJlX2xldmVsIHRvIENoZWNrc3VtbWVkTWVzc2FnZXMgZm9yIHVzLiAoVGhlIGFjdHVhbCByZXR1cm4KKwkJCSAqIGNvZGUgZnJvbSB2ZXJpZnlfY2hlY2tzdW0gaXMgaWdub3JlZCBoZXJlLikKKwkJCSAqLworCQkJdmVyaWZ5X2NoZWNrc3VtKHN0cmlwX2luZm8pOworCQkJLyoKKwkJCSAqIElmIHRoZSByYWRpbyBoYXMgc3RydWN0dXJlZCBtZXNzYWdlcyBidXQgd2UgZG9uJ3QgeWV0IGhhdmUgYWxsIG91ciBpbmZvcm1hdGlvbiBhYm91dCBpdCwKKwkJCSAqIHdlIHNob3VsZCBkbyBwcm9iZXMgd2l0aG91dCBkZWxheSwgdW50aWwgd2UgaGF2ZSBnYXRoZXJlZCBhbGwgdGhlIGluZm9ybWF0aW9uCisJCQkgKi8KKwkJCWlmICghR09UX0FMTF9SQURJT19JTkZPKHN0cmlwX2luZm8pKQorCQkJCXN0cmlwX2luZm8tPndhdGNoZG9nX2RvcHJvYmUgPSBqaWZmaWVzOworCQl9CisJfQorCisJZWxzZSBpZiAoaGFzX3ByZWZpeChtc2csIGxlbiwgIjAwNSIpKQkvKiBCYWQgY291bnQgc3BlY2lmaWNhdGlvbiAqLworCQlSZWN2RXJyKCJFcnJvciBNc2c6Iiwgc3RyaXBfaW5mbyk7CisKKwllbHNlIGlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiMDA2IikpCS8qIEhlYWRlciB0b28gYmlnICovCisJCVJlY3ZFcnIoIkVycm9yIE1zZzoiLCBzdHJpcF9pbmZvKTsKKworCWVsc2UgaWYgKGhhc19wcmVmaXgobXNnLCBsZW4sICIwMDciKSkgewkvKiBCb2R5IHRvbyBiaWcgKi8KKwkJUmVjdkVycigiRXJyb3IgTXNnOiIsIHN0cmlwX2luZm8pOworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogRXJyb3IhIFBhY2tldCBzaXplIHRvbyBiaWcgZm9yIHJhZGlvLlxuIiwKKwkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSk7CisJfQorCisJZWxzZSBpZiAoaGFzX3ByZWZpeChtc2csIGxlbiwgIjAwOCIpKSB7CS8qIEJhZCBjaGFyYWN0ZXIgaW4gbmFtZSAqLworCQlSZWN2RXJyKCJFcnJvciBNc2c6Iiwgc3RyaXBfaW5mbyk7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBSYWRpbyBuYW1lIGNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVyXG4iLAorCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKwl9CisKKwllbHNlIGlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiMDA5IikpCS8qIE5vIGNvdW50IG9yIGxpbmUgdGVybWluYXRvciAqLworCQlSZWN2RXJyKCJFcnJvciBNc2c6Iiwgc3RyaXBfaW5mbyk7CisKKwllbHNlIGlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiMDEwIikpCS8qIEludmFsaWQgY2hlY2tzdW0gKi8KKwkJUmVjdkVycigiRXJyb3IgTXNnOiIsIHN0cmlwX2luZm8pOworCisJZWxzZSBpZiAoaGFzX3ByZWZpeChtc2csIGxlbiwgIjAxMSIpKQkvKiBDaGVja3N1bSBkaWRuJ3QgbWF0Y2ggKi8KKwkJUmVjdkVycigiRXJyb3IgTXNnOiIsIHN0cmlwX2luZm8pOworCisJZWxzZSBpZiAoaGFzX3ByZWZpeChtc2csIGxlbiwgIjAxMiIpKQkvKiBGYWlsZWQgdG8gdHJhbnNtaXQgcGFja2V0ICovCisJCVJlY3ZFcnIoIkVycm9yIE1zZzoiLCBzdHJpcF9pbmZvKTsKKworCWVsc2UKKwkJUmVjdkVycigiRXJyb3IgTXNnOiIsIHN0cmlwX2luZm8pOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX0FUX3Jlc3BvbnNlKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbywgX191OCAqIHB0ciwKKwkJCQlfX3U4ICogZW5kKQoreworCXVfbG9uZyBsZW47CisJX191OCAqcCA9IHB0cjsKKwl3aGlsZSAocCA8IGVuZCAmJiBwWy0xXSAhPSAxMCkKKwkJcCsrOwkJLyogU2tpcCBwYXN0IGZpcnN0IG5ld2xpbmUgY2hhcmFjdGVyICovCisJLyogTm93IHB0ciBwb2ludHMgdG8gdGhlIEFUIGNvbW1hbmQsIGFuZCBwIHBvaW50cyB0byB0aGUgdGV4dCBvZiB0aGUgcmVzcG9uc2UuICovCisJbGVuID0gcCAtIHB0cjsKKworI2lmIFRJQ0tMRV9USU1FUlMKKwl7CisJCXN0cnVjdCB0aW1ldmFsIHR2OworCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiKioqKiBHb3QgQVQgcmVzcG9uc2UgJS43cyAgICAgIGF0ICUwMmQuJTA2ZFxuIiwKKwkJICAgICAgIHB0ciwgdHYudHZfc2VjICUgMTAwLCB0di50dl91c2VjKTsKKwl9CisjZW5kaWYKKworCWlmIChoYXNfcHJlZml4KHB0ciwgbGVuLCAiQVRTMzAwPyIpKQorCQlnZXRfcmFkaW9fdmVyc2lvbihzdHJpcF9pbmZvLCBwLCBlbmQpOworCWVsc2UgaWYgKGhhc19wcmVmaXgocHRyLCBsZW4sICJBVFMzMDU/IikpCisJCWdldF9yYWRpb19hZGRyZXNzKHN0cmlwX2luZm8sIHApOworCWVsc2UgaWYgKGhhc19wcmVmaXgocHRyLCBsZW4sICJBVFMzMTE/IikpCisJCWdldF9yYWRpb19uZWlnaGJvdXJzKCZzdHJpcF9pbmZvLT5wb2xldG9wcywgcCwgZW5kKTsKKwllbHNlIGlmIChoYXNfcHJlZml4KHB0ciwgbGVuLCAiQVRTMzE5PTciKSkKKwkJdmVyaWZ5X2NoZWNrc3VtKHN0cmlwX2luZm8pOworCWVsc2UgaWYgKGhhc19wcmVmaXgocHRyLCBsZW4sICJBVFMzMjU/IikpCisJCWdldF9yYWRpb192b2x0YWdlKHN0cmlwX2luZm8sIHAsIGVuZCk7CisJZWxzZSBpZiAoaGFzX3ByZWZpeChwdHIsIGxlbiwgIkFUfkxBIikpCisJCWdldF9yYWRpb19uZWlnaGJvdXJzKCZzdHJpcF9pbmZvLT5wb3J0YWJsZXMsIHAsIGVuZCk7CisJZWxzZQorCQlSZWN2RXJyKCJVbmtub3duIEFUIFJlc3BvbnNlOiIsIHN0cmlwX2luZm8pOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX0FDSyhzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sIF9fdTggKiBwdHIsIF9fdTggKiBlbmQpCit7CisJLyogQ3VycmVudGx5IHdlIGRvbid0IGRvIGFueXRoaW5nIHdpdGggQUNLcyBmcm9tIHRoZSByYWRpbyAqLworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX0luZm8oc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvLCBfX3U4ICogcHRyLCBfX3U4ICogZW5kKQoreworCWlmIChwdHIgKyAxNiA+IGVuZCkKKwkJUmVjdkVycigiQmFkIEluZm8gTXNnOiIsIHN0cmlwX2luZm8pOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmdldF9zdHJpcF9kZXYoc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvKQoreworCS8qIElmIG91ciBoYXJkd2FyZSBhZGRyZXNzIGlzICptYW51YWxseSBzZXQqIHRvIHplcm8sIGFuZCB3ZSBrbm93IG91ciAqLworCS8qIHJlYWwgcmFkaW8gaGFyZHdhcmUgYWRkcmVzcywgdHJ5IHRvIGZpbmQgYW5vdGhlciBzdHJpcCBkZXZpY2UgdGhhdCBoYXMgYmVlbiAqLworCS8qIG1hbnVhbGx5IHNldCB0byB0aGF0IGFkZHJlc3MgdGhhdCB3ZSBjYW4gJ3RyYW5zZmVyIG93bmVyc2hpcCcgb2YgdGhpcyBwYWNrZXQgdG8gICovCisJaWYgKHN0cmlwX2luZm8tPm1hbnVhbF9kZXZfYWRkciAmJgorCSAgICAhbWVtY21wKHN0cmlwX2luZm8tPmRldi0+ZGV2X2FkZHIsIHplcm9fYWRkcmVzcy5jLAorCQkgICAgc2l6ZW9mKHplcm9fYWRkcmVzcykpCisJICAgICYmIG1lbWNtcCgmc3RyaXBfaW5mby0+dHJ1ZV9kZXZfYWRkciwgemVyb19hZGRyZXNzLmMsCisJCSAgICAgIHNpemVvZih6ZXJvX2FkZHJlc3MpKSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCQlyZWFkX2xvY2tfYmgoJmRldl9iYXNlX2xvY2spOworCQlkZXYgPSBkZXZfYmFzZTsKKwkJd2hpbGUgKGRldikgeworCQkJaWYgKGRldi0+dHlwZSA9PSBzdHJpcF9pbmZvLT5kZXYtPnR5cGUgJiYKKwkJCSAgICAhbWVtY21wKGRldi0+ZGV2X2FkZHIsCisJCQkJICAgICZzdHJpcF9pbmZvLT50cnVlX2Rldl9hZGRyLAorCQkJCSAgICBzaXplb2YoTWV0cmljb21BZGRyZXNzKSkpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJICAgICAgICIlczogVHJhbnNmZXJyZWQgcGFja2V0IG93bmVyc2hpcCB0byAlcy5cbiIsCisJCQkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgZGV2LT5uYW1lKTsKKwkJCQlyZWFkX3VubG9ja19iaCgmZGV2X2Jhc2VfbG9jayk7CisJCQkJcmV0dXJuIChkZXYpOworCQkJfQorCQkJZGV2ID0gZGV2LT5uZXh0OworCQl9CisJCXJlYWRfdW5sb2NrX2JoKCZkZXZfYmFzZV9sb2NrKTsKKwl9CisJcmV0dXJuIChzdHJpcF9pbmZvLT5kZXYpOworfQorCisvKgorICogU2VuZCBvbmUgY29tcGxldGVseSBkZWNhcHN1bGF0ZWQgZGF0YWdyYW0gdG8gdGhlIG5leHQgbGF5ZXIuCisgKi8KKworc3RhdGljIHZvaWQgZGVsaXZlcl9wYWNrZXQoc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvLCBTVFJJUF9IZWFkZXIgKiBoZWFkZXIsCisJCQkgICBfX3UxNiBwYWNrZXRsZW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKFNUUklQX0hlYWRlcikgKyBwYWNrZXRsZW4pOworCWlmICghc2tiKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLAorCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKwkJc3RyaXBfaW5mby0+cnhfZHJvcHBlZCsrOworCX0gZWxzZSB7CisJCW1lbWNweShza2JfcHV0KHNrYiwgc2l6ZW9mKFNUUklQX0hlYWRlcikpLCBoZWFkZXIsCisJCSAgICAgICBzaXplb2YoU1RSSVBfSGVhZGVyKSk7CisJCW1lbWNweShza2JfcHV0KHNrYiwgcGFja2V0bGVuKSwgc3RyaXBfaW5mby0+cnhfYnVmZiwKKwkJICAgICAgIHBhY2tldGxlbik7CisJCXNrYi0+ZGV2ID0gZ2V0X3N0cmlwX2RldihzdHJpcF9pbmZvKTsKKwkJc2tiLT5wcm90b2NvbCA9IGhlYWRlci0+cHJvdG9jb2w7CisJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKworCQkvKiBIYXZpbmcgcHV0IGEgZmFrZSBoZWFkZXIgb24gdGhlIGZyb250IG9mIHRoZSBza19idWZmIGZvciB0aGUgKi8KKwkJLyogYmVuZWZpdCBvZiB0b29scyBsaWtlIHRjcGR1bXAsIHNrYl9wdWxsIG5vdyAnY29uc3VtZXMnIHRoYXQgICovCisJCS8qIGZha2UgaGVhZGVyIGJlZm9yZSB3ZSBoYW5kIHRoZSBwYWNrZXQgdXAgdG8gdGhlIG5leHQgbGF5ZXIuICAqLworCQlza2JfcHVsbChza2IsIHNpemVvZihTVFJJUF9IZWFkZXIpKTsKKworCQkvKiBGaW5hbGx5LCBoYW5kIHRoZSBwYWNrZXQgdXAgdG8gdGhlIG5leHQgbGF5ZXIgKGUuZy4gSVAgb3IgQVJQLCBldGMuKSAqLworCQlzdHJpcF9pbmZvLT5yeF9wYWNrZXRzKys7CisJCXN0cmlwX2luZm8tPnJ4X3Bwc19jb3VudCsrOworI2lmZGVmIEVYVF9DT1VOVEVSUworCQlzdHJpcF9pbmZvLT5yeF9ieXRlcyArPSBwYWNrZXRsZW47CisjZW5kaWYKKwkJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQluZXRpZl9yeChza2IpOworCX0KK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19JUF9wYWNrZXQoc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvLAorCQkJICAgICAgU1RSSVBfSGVhZGVyICogaGVhZGVyLCBfX3U4ICogcHRyLAorCQkJICAgICAgX191OCAqIGVuZCkKK3sKKwlfX3UxNiBwYWNrZXRsZW47CisKKwkvKiBEZWNvZGUgc3RhcnQgb2YgdGhlIElQIHBhY2tldCBoZWFkZXIgKi8KKwlwdHIgPSBVblN0dWZmRGF0YShwdHIsIGVuZCwgc3RyaXBfaW5mby0+cnhfYnVmZiwgNCk7CisJaWYgKCFwdHIpIHsKKwkJUmVjdkVycigiSVAgUGFja2V0IHRvbyBzaG9ydCIsIHN0cmlwX2luZm8pOworCQlyZXR1cm47CisJfQorCisJcGFja2V0bGVuID0gKChfX3UxNikgc3RyaXBfaW5mby0+cnhfYnVmZlsyXSA8PCA4KSB8IHN0cmlwX2luZm8tPnJ4X2J1ZmZbM107CisKKwlpZiAocGFja2V0bGVuID4gTUFYX1JFQ1ZfTVRVKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBEcm9wcGluZyBvdmVyc2l6ZWQgcmVjZWl2ZWQgSVAgcGFja2V0OiAlZCBieXRlc1xuIiwKKwkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgcGFja2V0bGVuKTsKKwkJc3RyaXBfaW5mby0+cnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCisJLypwcmludGsoS0VSTl9JTkZPICIlczogR290ICVkIGJ5dGUgSVAgcGFja2V0XG4iLCBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIHBhY2tldGxlbik7ICovCisKKwkvKiBEZWNvZGUgcmVtYWluZGVyIG9mIHRoZSBJUCBwYWNrZXQgKi8KKwlwdHIgPQorCSAgICBVblN0dWZmRGF0YShwdHIsIGVuZCwgc3RyaXBfaW5mby0+cnhfYnVmZiArIDQsIHBhY2tldGxlbiAtIDQpOworCWlmICghcHRyKSB7CisJCVJlY3ZFcnIoIklQIFBhY2tldCB0b28gc2hvcnQiLCBzdHJpcF9pbmZvKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwdHIgPCBlbmQpIHsKKwkJUmVjdkVycigiSVAgUGFja2V0IHRvbyBsb25nIiwgc3RyaXBfaW5mbyk7CisJCXJldHVybjsKKwl9CisKKwloZWFkZXItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOworCisJZGVsaXZlcl9wYWNrZXQoc3RyaXBfaW5mbywgaGVhZGVyLCBwYWNrZXRsZW4pOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX0FSUF9wYWNrZXQoc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvLAorCQkJICAgICAgIFNUUklQX0hlYWRlciAqIGhlYWRlciwgX191OCAqIHB0ciwKKwkJCSAgICAgICBfX3U4ICogZW5kKQoreworCV9fdTE2IHBhY2tldGxlbjsKKwlzdHJ1Y3QgYXJwaGRyICphcnBoZHIgPSAoc3RydWN0IGFycGhkciAqKSBzdHJpcF9pbmZvLT5yeF9idWZmOworCisJLyogRGVjb2RlIHN0YXJ0IG9mIHRoZSBBUlAgcGFja2V0ICovCisJcHRyID0gVW5TdHVmZkRhdGEocHRyLCBlbmQsIHN0cmlwX2luZm8tPnJ4X2J1ZmYsIDgpOworCWlmICghcHRyKSB7CisJCVJlY3ZFcnIoIkFSUCBQYWNrZXQgdG9vIHNob3J0Iiwgc3RyaXBfaW5mbyk7CisJCXJldHVybjsKKwl9CisKKwlwYWNrZXRsZW4gPSA4ICsgKGFycGhkci0+YXJfaGxuICsgYXJwaGRyLT5hcl9wbG4pICogMjsKKworCWlmIChwYWNrZXRsZW4gPiBNQVhfUkVDVl9NVFUpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiBEcm9wcGluZyBvdmVyc2l6ZWQgcmVjZWl2ZWQgQVJQIHBhY2tldDogJWQgYnl0ZXNcbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIHBhY2tldGxlbik7CisJCXN0cmlwX2luZm8tPnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKworCS8qcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdvdCAlZCBieXRlIEFSUCAlc1xuIiwKKwkgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIHBhY2tldGxlbiwKKwkgICBudG9ocyhhcnBoZHItPmFyX29wKSA9PSBBUlBPUF9SRVFVRVNUID8gInJlcXVlc3QiIDogInJlcGx5Iik7ICovCisKKwkvKiBEZWNvZGUgcmVtYWluZGVyIG9mIHRoZSBBUlAgcGFja2V0ICovCisJcHRyID0KKwkgICAgVW5TdHVmZkRhdGEocHRyLCBlbmQsIHN0cmlwX2luZm8tPnJ4X2J1ZmYgKyA4LCBwYWNrZXRsZW4gLSA4KTsKKwlpZiAoIXB0cikgeworCQlSZWN2RXJyKCJBUlAgUGFja2V0IHRvbyBzaG9ydCIsIHN0cmlwX2luZm8pOworCQlyZXR1cm47CisJfQorCisJaWYgKHB0ciA8IGVuZCkgeworCQlSZWN2RXJyKCJBUlAgUGFja2V0IHRvbyBsb25nIiwgc3RyaXBfaW5mbyk7CisJCXJldHVybjsKKwl9CisKKwloZWFkZXItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQVJQKTsKKworCWRlbGl2ZXJfcGFja2V0KHN0cmlwX2luZm8sIGhlYWRlciwgcGFja2V0bGVuKTsKK30KKworLyoKKyAqIHByb2Nlc3NfdGV4dF9tZXNzYWdlIHByb2Nlc3NlcyBhIDxDUj4tdGVybWluYXRlZCBibG9jayBvZiBkYXRhIHJlY2VpdmVkCisgKiBmcm9tIHRoZSByYWRpbyB0aGF0IGRvZXNuJ3QgYmVnaW4gd2l0aCBhICcqJyBjaGFyYWN0ZXIuIEFsbCBub3JtYWwKKyAqIFN0YXJtb2RlIGNvbW11bmljYXRpb24gbWVzc2FnZXMgd2l0aCB0aGUgcmFkaW8gYmVnaW4gd2l0aCBhICcqJywKKyAqIHNvIGFueSB0ZXh0IHRoYXQgZG9lcyBub3QgaW5kaWNhdGVzIGEgc2VyaWFsIHBvcnQgZXJyb3IsIGEgcmFkaW8gdGhhdAorICogaXMgaW4gSGF5ZXMgY29tbWFuZCBtb2RlIGluc3RlYWQgb2YgU3Rhcm1vZGUsIG9yIGEgcmFkaW8gd2l0aCByZWFsbHkKKyAqIG9sZCBmaXJtd2FyZSB0aGF0IGRvZXNuJ3QgZnJhbWUgaXRzIFN0YXJtb2RlIHJlc3BvbnNlcyBwcm9wZXJseS4KKyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc190ZXh0X21lc3NhZ2Uoc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvKQoreworCV9fdTggKm1zZyA9IHN0cmlwX2luZm8tPnN4X2J1ZmY7CisJaW50IGxlbiA9IHN0cmlwX2luZm8tPnN4X2NvdW50OworCisJLyogQ2hlY2sgZm9yIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBpdCBtaWdodCBiZSBvdXIgcmFkaW8gbmFtZSAqLworCS8qIChUaGlzIGlzIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGZpcm13YXJlKSAgKi8KKwlpZiAobGVuID09IDkgJiYgZ2V0X3JhZGlvX2FkZHJlc3Moc3RyaXBfaW5mbywgbXNnKSA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAodGV4dF9lcXVhbChtc2csIGxlbiwgIk9LIikpCisJCXJldHVybjsJCS8qIElnbm9yZSAnT0snIHJlc3BvbnNlcyBmcm9tIHByaW9yIGNvbW1hbmRzICovCisJaWYgKHRleHRfZXF1YWwobXNnLCBsZW4sICJFUlJPUiIpKQorCQlyZXR1cm47CQkvKiBJZ25vcmUgJ0VSUk9SJyBtZXNzYWdlcyAqLworCWlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiYXRlMHExIikpCisJCXJldHVybjsJCS8qIElnbm9yZSBjaGFyYWN0ZXIgZWNobyBiYWNrIGZyb20gdGhlIHJhZGlvICovCisKKwkvKiBDYXRjaCBvdGhlciBlcnJvciBtZXNzYWdlcyAqLworCS8qIChUaGlzIGlzIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGZpcm13YXJlKSAqLworCWlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiRVJSXyIpKSB7CisJCVJlY3ZFcnJfTWVzc2FnZShzdHJpcF9pbmZvLCBOVUxMLCAmbXNnWzRdLCBsZW4gLSA0KTsKKwkJcmV0dXJuOworCX0KKworCVJlY3ZFcnIoIk5vIGluaXRpYWwgKiIsIHN0cmlwX2luZm8pOworfQorCisvKgorICogcHJvY2Vzc19tZXNzYWdlIHByb2Nlc3NlcyBhIDxDUj4tdGVybWluYXRlZCBibG9jayBvZiBkYXRhIHJlY2VpdmVkCisgKiBmcm9tIHRoZSByYWRpby4gSWYgdGhlIHJhZGlvIGlzIG5vdCBpbiBTdGFybW9kZSBvciBoYXMgb2xkIGZpcm13YXJlLAorICogaXQgbWF5IGJlIGEgbGluZSBvZiB0ZXh0IGluIHJlc3BvbnNlIHRvIGFuIEFUIGNvbW1hbmQuIElkZWFsbHksIHdpdGgKKyAqIGEgY3VycmVudCByYWRpbyB0aGF0J3MgcHJvcGVybHkgaW4gU3Rhcm1vZGUsIGFsbCBkYXRhIHJlY2VpdmVkIHNob3VsZAorICogYmUgcHJvcGVybHkgZnJhbWVkIGFuZCBjaGVja3N1bW1lZCByYWRpbyBtZXNzYWdlIGJsb2NrcywgY29udGFpbmluZworICogZWl0aGVyIGEgc3Rhcm1vZGUgcGFja2V0LCBvciBhIG90aGVyIGNvbW11bmljYXRpb24gZnJvbSB0aGUgcmFkaW8KKyAqIGZpcm13YXJlLCBsaWtlICJJTkZfIiBJbmZvIG1lc3NhZ2VzIGFuZCAmQ09NTUFORCByZXNwb25zZXMuCisgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3NfbWVzc2FnZShzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8pCit7CisJU1RSSVBfSGVhZGVyIGhlYWRlciA9IHsgemVyb19hZGRyZXNzLCB6ZXJvX2FkZHJlc3MsIDAgfTsKKwlfX3U4ICpwdHIgPSBzdHJpcF9pbmZvLT5zeF9idWZmOworCV9fdTggKmVuZCA9IHN0cmlwX2luZm8tPnN4X2J1ZmYgKyBzdHJpcF9pbmZvLT5zeF9jb3VudDsKKwlfX3U4IHNlbmRlcm5hbWVbMzJdLCAqc3B0ciA9IHNlbmRlcm5hbWU7CisJTWV0cmljb21LZXkga2V5OworCisJLypIZXhEdW1wKCJSZWNlaXZpbmciLCBzdHJpcF9pbmZvLCBwdHIsIGVuZCk7ICovCisKKwkvKiBDaGVjayBmb3Igc3RhcnQgb2YgYWRkcmVzcyBtYXJrZXIsIGFuZCB0aGVuIHNraXAgb3ZlciBpdCAqLworCWlmICgqcHRyID09ICcqJykKKwkJcHRyKys7CisJZWxzZSB7CisJCXByb2Nlc3NfdGV4dF9tZXNzYWdlKHN0cmlwX2luZm8pOworCQlyZXR1cm47CisJfQorCisJLyogQ29weSBvdXQgdGhlIHJldHVybiBhZGRyZXNzICovCisJd2hpbGUgKHB0ciA8IGVuZCAmJiAqcHRyICE9ICcqJworCSAgICAgICAmJiBzcHRyIDwgQVJSQVlfRU5EKHNlbmRlcm5hbWUpIC0gMSkKKwkJKnNwdHIrKyA9ICpwdHIrKzsKKwkqc3B0ciA9IDA7CQkvKiBOdWxsIHRlcm1pbmF0ZSB0aGUgc2VuZGVyIG5hbWUgKi8KKworCS8qIENoZWNrIGZvciBlbmQgb2YgYWRkcmVzcyBtYXJrZXIsIGFuZCBza2lwIG92ZXIgaXQgKi8KKwlpZiAocHRyID49IGVuZCB8fCAqcHRyICE9ICcqJykgeworCQlSZWN2RXJyKCJObyBzZWNvbmQgKiIsIHN0cmlwX2luZm8pOworCQlyZXR1cm47CisJfQorCXB0cisrOwkJCS8qIFNraXAgdGhlIHNlY29uZCAnKicgKi8KKworCS8qIElmIHRoZSBzZW5kZXIgbmFtZSBpcyAiJkNPTU1BTkQiLCBpZ25vcmUgdGhpcyAncGFja2V0JyAgICAgICAqLworCS8qIChUaGlzIGlzIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGZpcm13YXJlKSAqLworCWlmICghc3RyY21wKHNlbmRlcm5hbWUsICImQ09NTUFORCIpKSB7CisJCXN0cmlwX2luZm8tPmZpcm13YXJlX2xldmVsID0gTm9TdHJ1Y3R1cmU7CisJCXN0cmlwX2luZm8tPm5leHRfY29tbWFuZCA9IENvbXBhdGliaWxpdHlDb21tYW5kOworCQlyZXR1cm47CisJfQorCisJaWYgKHB0ciArIDQgPiBlbmQpIHsKKwkJUmVjdkVycigiTm8gcHJvdG8ga2V5Iiwgc3RyaXBfaW5mbyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBHZXQgdGhlIHByb3RvY29sIGtleSBvdXQgb2YgdGhlIGJ1ZmZlciAqLworCWtleS5jWzBdID0gKnB0cisrOworCWtleS5jWzFdID0gKnB0cisrOworCWtleS5jWzJdID0gKnB0cisrOworCWtleS5jWzNdID0gKnB0cisrOworCisJLyogSWYgd2UncmUgdXNpbmcgY2hlY2tzdW1zLCB2ZXJpZnkgdGhlIGNoZWNrc3VtIGF0IHRoZSBlbmQgb2YgdGhlIHBhY2tldCAqLworCWlmIChzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA+PSBDaGVja3N1bW1lZE1lc3NhZ2VzKSB7CisJCWVuZCAtPSA0OwkvKiBDaG9wIHRoZSBsYXN0IGZvdXIgYnl0ZXMgb2ZmIHRoZSBwYWNrZXQgKHRoZXkncmUgdGhlIGNoZWNrc3VtKSAqLworCQlpZiAocHRyID4gZW5kKSB7CisJCQlSZWN2RXJyKCJNaXNzaW5nIENoZWNrc3VtIiwgc3RyaXBfaW5mbyk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCF2ZXJpZnlfY2hlY2tzdW0oc3RyaXBfaW5mbykpIHsKKwkJCVJlY3ZFcnIoIkJhZCBDaGVja3N1bSIsIHN0cmlwX2luZm8pOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLypwcmludGsoS0VSTl9JTkZPICIlczogR290IHBhY2tldCBmcm9tIFwiJXNcIi5cbiIsIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgc2VuZGVybmFtZSk7ICovCisKKwkvKgorCSAqIEZpbGwgaW4gKHBzZXVkbykgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgaW4gdGhlIHBhY2tldC4KKwkgKiBXZSBhc3N1bWUgdGhhdCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyB3YXMgb3VyIGFkZHJlc3MgKHRoZSByYWRpbyBkb2VzIG5vdAorCSAqIHRlbGwgdXMgdGhpcykuIElmIHRoZSByYWRpbyBzdXBwbGllcyBhIHNvdXJjZSBhZGRyZXNzLCB0aGVuIHdlIHVzZSBpdC4KKwkgKi8KKwloZWFkZXIuZHN0X2FkZHIgPSBzdHJpcF9pbmZvLT50cnVlX2Rldl9hZGRyOworCXN0cmluZ190b19yYWRpb19hZGRyZXNzKCZoZWFkZXIuc3JjX2FkZHIsIHNlbmRlcm5hbWUpOworCisjaWZkZWYgRVhUX0NPVU5URVJTCisJaWYgKGtleS5sID09IFNJUDBLZXkubCkgeworCQlzdHJpcF9pbmZvLT5yeF9yYnl0ZXMgKz0gKGVuZCAtIHB0cik7CisJCXByb2Nlc3NfSVBfcGFja2V0KHN0cmlwX2luZm8sICZoZWFkZXIsIHB0ciwgZW5kKTsKKwl9IGVsc2UgaWYgKGtleS5sID09IEFSUDBLZXkubCkgeworCQlzdHJpcF9pbmZvLT5yeF9yYnl0ZXMgKz0gKGVuZCAtIHB0cik7CisJCXByb2Nlc3NfQVJQX3BhY2tldChzdHJpcF9pbmZvLCAmaGVhZGVyLCBwdHIsIGVuZCk7CisJfSBlbHNlIGlmIChrZXkubCA9PSBBVFJfS2V5LmwpIHsKKwkJc3RyaXBfaW5mby0+cnhfZWJ5dGVzICs9IChlbmQgLSBwdHIpOworCQlwcm9jZXNzX0FUX3Jlc3BvbnNlKHN0cmlwX2luZm8sIHB0ciwgZW5kKTsKKwl9IGVsc2UgaWYgKGtleS5sID09IEFDS19LZXkubCkgeworCQlzdHJpcF9pbmZvLT5yeF9lYnl0ZXMgKz0gKGVuZCAtIHB0cik7CisJCXByb2Nlc3NfQUNLKHN0cmlwX2luZm8sIHB0ciwgZW5kKTsKKwl9IGVsc2UgaWYgKGtleS5sID09IElORl9LZXkubCkgeworCQlzdHJpcF9pbmZvLT5yeF9lYnl0ZXMgKz0gKGVuZCAtIHB0cik7CisJCXByb2Nlc3NfSW5mbyhzdHJpcF9pbmZvLCBwdHIsIGVuZCk7CisJfSBlbHNlIGlmIChrZXkubCA9PSBFUlJfS2V5LmwpIHsKKwkJc3RyaXBfaW5mby0+cnhfZWJ5dGVzICs9IChlbmQgLSBwdHIpOworCQlSZWN2RXJyX01lc3NhZ2Uoc3RyaXBfaW5mbywgc2VuZGVybmFtZSwgcHRyLCBlbmQgLSBwdHIpOworCX0gZWxzZQorCQlSZWN2RXJyKCJVbnJlY29nbml6ZWQgcHJvdG9jb2wga2V5Iiwgc3RyaXBfaW5mbyk7CisjZWxzZQorCWlmIChrZXkubCA9PSBTSVAwS2V5LmwpCisJCXByb2Nlc3NfSVBfcGFja2V0KHN0cmlwX2luZm8sICZoZWFkZXIsIHB0ciwgZW5kKTsKKwllbHNlIGlmIChrZXkubCA9PSBBUlAwS2V5LmwpCisJCXByb2Nlc3NfQVJQX3BhY2tldChzdHJpcF9pbmZvLCAmaGVhZGVyLCBwdHIsIGVuZCk7CisJZWxzZSBpZiAoa2V5LmwgPT0gQVRSX0tleS5sKQorCQlwcm9jZXNzX0FUX3Jlc3BvbnNlKHN0cmlwX2luZm8sIHB0ciwgZW5kKTsKKwllbHNlIGlmIChrZXkubCA9PSBBQ0tfS2V5LmwpCisJCXByb2Nlc3NfQUNLKHN0cmlwX2luZm8sIHB0ciwgZW5kKTsKKwllbHNlIGlmIChrZXkubCA9PSBJTkZfS2V5LmwpCisJCXByb2Nlc3NfSW5mbyhzdHJpcF9pbmZvLCBwdHIsIGVuZCk7CisJZWxzZSBpZiAoa2V5LmwgPT0gRVJSX0tleS5sKQorCQlSZWN2RXJyX01lc3NhZ2Uoc3RyaXBfaW5mbywgc2VuZGVybmFtZSwgcHRyLCBlbmQgLSBwdHIpOworCWVsc2UKKwkJUmVjdkVycigiVW5yZWNvZ25pemVkIHByb3RvY29sIGtleSIsIHN0cmlwX2luZm8pOworI2VuZGlmCit9CisKKyNkZWZpbmUgVFRZRVJST1IoWCkgKChYKSA9PSBUVFlfQlJFQUsgICA/ICJCcmVhayIgICAgICAgICAgICA6IFwKKyAgICAgICAgICAgICAgICAgICAgIChYKSA9PSBUVFlfRlJBTUUgICA/ICJGcmFtaW5nIEVycm9yIiAgICA6IFwKKyAgICAgICAgICAgICAgICAgICAgIChYKSA9PSBUVFlfUEFSSVRZICA/ICJQYXJpdHkgRXJyb3IiICAgICA6IFwKKyAgICAgICAgICAgICAgICAgICAgIChYKSA9PSBUVFlfT1ZFUlJVTiA/ICJIYXJkd2FyZSBPdmVycnVuIiA6ICJVbmtub3duIEVycm9yIikKKworLyoKKyAqIEhhbmRsZSB0aGUgJ3JlY2VpdmVyIGRhdGEgcmVhZHknIGludGVycnVwdC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSAndHR5X2lvJyBtb2R1bGUgaW4gdGhlIGtlcm5lbCB3aGVuCisgKiBhIGJsb2NrIG9mIFNUUklQIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQsIHdoaWNoIGNhbiBub3cgYmUgZGVjYXBzdWxhdGVkCisgKiBhbmQgc2VudCBvbiB0byBzb21lIElQIGxheWVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgKi8KKworc3RhdGljIHZvaWQgc3RyaXBfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsCisJCSAgY2hhciAqZnAsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8gPSAoc3RydWN0IHN0cmlwICopIHR0eS0+ZGlzY19kYXRhOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZCA9IGNwICsgY291bnQ7CisKKwlpZiAoIXN0cmlwX2luZm8gfHwgc3RyaXBfaW5mby0+bWFnaWMgIT0gU1RSSVBfTUFHSUMKKwkgICAgfHwgIW5ldGlmX3J1bm5pbmcoc3RyaXBfaW5mby0+ZGV2KSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2JoKCZzdHJpcF9sb2NrKTsKKyNpZiAwCisJeworCQlzdHJ1Y3QgdGltZXZhbCB0djsKKwkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIqKioqIHN0cmlwX3JlY2VpdmVfYnVmOiAlM2QgYnl0ZXMgYXQgJTAyZC4lMDZkXG4iLAorCQkgICAgICAgY291bnQsIHR2LnR2X3NlYyAlIDEwMCwgdHYudHZfdXNlYyk7CisJfQorI2VuZGlmCisKKyNpZmRlZiBFWFRfQ09VTlRFUlMKKwlzdHJpcF9pbmZvLT5yeF9zYnl0ZXMgKz0gY291bnQ7CisjZW5kaWYKKworCS8qIFJlYWQgdGhlIGNoYXJhY3RlcnMgb3V0IG9mIHRoZSBidWZmZXIgKi8KKwl3aGlsZSAoY3AgPCBlbmQpIHsKKwkJaWYgKGZwICYmICpmcCkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBvbiBzZXJpYWwgcG9ydFxuIiwKKwkJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIFRUWUVSUk9SKCpmcCkpOworCQlpZiAoZnAgJiYgKmZwKysgJiYgIXN0cmlwX2luZm8tPmRpc2NhcmQpIHsJLyogSWYgdGhlcmUncyBhIHNlcmlhbCBlcnJvciwgcmVjb3JkIGl0ICovCisJCQkvKiBJZiB3ZSBoYXZlIHNvbWUgY2hhcmFjdGVycyBpbiB0aGUgYnVmZmVyLCBkaXNjYXJkIHRoZW0gKi8KKwkJCXN0cmlwX2luZm8tPmRpc2NhcmQgPSBzdHJpcF9pbmZvLT5zeF9jb3VudDsKKwkJCXN0cmlwX2luZm8tPnJ4X2Vycm9ycysrOworCQl9CisKKwkJLyogTGVhZGluZyBjb250cm9sIGNoYXJhY3RlcnMgKENSLCBOTCwgVGFiLCBldGMuKSBhcmUgaWdub3JlZCAqLworCQlpZiAoc3RyaXBfaW5mby0+c3hfY291bnQgPiAwIHx8ICpjcCA+PSAnICcpIHsKKwkJCWlmICgqY3AgPT0gMHgwRCkgewkvKiBJZiBlbmQgb2YgcGFja2V0LCBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIGl0ICovCisJCQkJaWYgKHN0cmlwX2luZm8tPnN4X2NvdW50ID4gMzAwMCkKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkgICAgICAgIiVzOiBDdXQgYSAlZCBieXRlIHBhY2tldCAoJXpkIGJ5dGVzIHJlbWFpbmluZyklc1xuIiwKKwkJCQkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwKKwkJCQkJICAgICAgIHN0cmlwX2luZm8tPnN4X2NvdW50LAorCQkJCQkgICAgICAgZW5kIC0gY3AgLSAxLAorCQkJCQkgICAgICAgc3RyaXBfaW5mby0+CisJCQkJCSAgICAgICBkaXNjYXJkID8gIiAoZGlzY2FyZGVkKSIgOgorCQkJCQkgICAgICAgIiIpOworCQkJCWlmIChzdHJpcF9pbmZvLT5zeF9jb3VudCA+CisJCQkJICAgIHN0cmlwX2luZm8tPnN4X3NpemUpIHsKKwkJCQkJc3RyaXBfaW5mby0+cnhfb3Zlcl9lcnJvcnMrKzsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkgICAgICAgIiVzOiBzeF9idWZmIG92ZXJmbG93ICglZCBieXRlcyB0b3RhbClcbiIsCisJCQkJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsCisJCQkJCSAgICAgICBzdHJpcF9pbmZvLT5zeF9jb3VudCk7CisJCQkJfSBlbHNlIGlmIChzdHJpcF9pbmZvLT5kaXNjYXJkKQorCQkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCSAgICAgICAiJXM6IERpc2NhcmRpbmcgYmFkIHBhY2tldCAoJWQvJWQpXG4iLAorCQkJCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLAorCQkJCQkgICAgICAgc3RyaXBfaW5mby0+ZGlzY2FyZCwKKwkJCQkJICAgICAgIHN0cmlwX2luZm8tPnN4X2NvdW50KTsKKwkJCQllbHNlCisJCQkJCXByb2Nlc3NfbWVzc2FnZShzdHJpcF9pbmZvKTsKKwkJCQlzdHJpcF9pbmZvLT5kaXNjYXJkID0gMDsKKwkJCQlzdHJpcF9pbmZvLT5zeF9jb3VudCA9IDA7CisJCQl9IGVsc2UgeworCQkJCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHNwYWNlIGluIHRoZSBidWZmZXIgKi8KKwkJCQlpZiAoc3RyaXBfaW5mby0+c3hfY291bnQgPAorCQkJCSAgICBzdHJpcF9pbmZvLT5zeF9zaXplKQorCQkJCQlzdHJpcF9pbmZvLT5zeF9idWZmW3N0cmlwX2luZm8tPgorCQkJCQkJCSAgICBzeF9jb3VudF0gPQorCQkJCQkgICAgKmNwOworCQkJCXN0cmlwX2luZm8tPnN4X2NvdW50Kys7CisJCQl9CisJCX0KKwkJY3ArKzsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnN0cmlwX2xvY2spOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBHZW5lcmFsIGNvbnRyb2wgcm91dGluZXMJCQkJCQkqLworCitzdGF0aWMgaW50IHNldF9tYWNfYWRkcmVzcyhzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sCisJCQkgICBNZXRyaWNvbUFkZHJlc3MgKiBhZGRyKQoreworCS8qCisJICogV2UncmUgdXNpbmcgYSBtYW51YWxseSBzcGVjaWZpZWQgYWRkcmVzcyBpZiB0aGUgYWRkcmVzcyBpcyBzZXQKKwkgKiB0byBhbnl0aGluZyBvdGhlciB0aGFuIGFsbCBvbmVzLiBTZXR0aW5nIHRoZSBhZGRyZXNzIHRvIGFsbCBvbmVzCisJICogZGlzYWJsZXMgbWFudWFsIG1vZGUgYW5kIGdvZXMgYmFjayB0byBhdXRvbWF0aWMgYWRkcmVzcyBkZXRlcm1pbmF0aW9uCisJICogKHRyYWNraW5nIHRoZSB0cnVlIGFkZHJlc3MgdGhhdCB0aGUgcmFkaW8gaGFzKS4KKwkgKi8KKwlzdHJpcF9pbmZvLT5tYW51YWxfZGV2X2FkZHIgPQorCSAgICBtZW1jbXAoYWRkci0+YywgYnJvYWRjYXN0X2FkZHJlc3MuYywKKwkJICAgc2l6ZW9mKGJyb2FkY2FzdF9hZGRyZXNzKSk7CisJaWYgKHN0cmlwX2luZm8tPm1hbnVhbF9kZXZfYWRkcikKKwkJKihNZXRyaWNvbUFkZHJlc3MgKikgc3RyaXBfaW5mby0+ZGV2LT5kZXZfYWRkciA9ICphZGRyOworCWVsc2UKKwkJKihNZXRyaWNvbUFkZHJlc3MgKikgc3RyaXBfaW5mby0+ZGV2LT5kZXZfYWRkciA9CisJCSAgICBzdHJpcF9pbmZvLT50cnVlX2Rldl9hZGRyOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0cmlwX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbyA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNvY2thZGRyICpzYSA9IGFkZHI7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHN0cmlwX3NldF9kZXZfbWFjX2FkZHJlc3MgY2FsbGVkXG4iLCBkZXYtPm5hbWUpOworCXNldF9tYWNfYWRkcmVzcyhzdHJpcF9pbmZvLCAoTWV0cmljb21BZGRyZXNzICopIHNhLT5zYV9kYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdHJpcF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8gPSBuZXRkZXZfcHJpdihkZXYpOworCXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKworCW1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCisJc3RhdHMucnhfcGFja2V0cyA9IHN0cmlwX2luZm8tPnJ4X3BhY2tldHM7CisJc3RhdHMudHhfcGFja2V0cyA9IHN0cmlwX2luZm8tPnR4X3BhY2tldHM7CisJc3RhdHMucnhfZHJvcHBlZCA9IHN0cmlwX2luZm8tPnJ4X2Ryb3BwZWQ7CisJc3RhdHMudHhfZHJvcHBlZCA9IHN0cmlwX2luZm8tPnR4X2Ryb3BwZWQ7CisJc3RhdHMudHhfZXJyb3JzID0gc3RyaXBfaW5mby0+dHhfZXJyb3JzOworCXN0YXRzLnJ4X2Vycm9ycyA9IHN0cmlwX2luZm8tPnJ4X2Vycm9yczsKKwlzdGF0cy5yeF9vdmVyX2Vycm9ycyA9IHN0cmlwX2luZm8tPnJ4X292ZXJfZXJyb3JzOworCXJldHVybiAoJnN0YXRzKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogT3BlbmluZyBhbmQgY2xvc2luZwkJCQkJCQkqLworCisvKgorICogSGVyZSdzIHRoZSBvcmRlciB0aGluZ3MgaGFwcGVuOgorICogV2hlbiB0aGUgdXNlciBydW5zICJzbGF0dGFjaCAtcCBzdHJpcCAuLi4iCisgKiAgMS4gVGhlIFRUWSBtb2R1bGUgY2FsbHMgc3RyaXBfb3BlbgorICogIDIuIHN0cmlwX29wZW4gY2FsbHMgc3RyaXBfYWxsb2MKKyAqICAzLiAgICAgICAgICAgICAgICAgIHN0cmlwX2FsbG9jIGNhbGxzIHJlZ2lzdGVyX25ldGRldgorICogIDQuICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfbmV0ZGV2IGNhbGxzIHN0cmlwX2Rldl9pbml0CisgKiAgNS4gdGhlbiBzdHJpcF9vcGVuIGZpbmlzaGVzIHNldHRpbmcgdXAgdGhlIHN0cmlwX2luZm8KKyAqCisgKiBXaGVuIHRoZSB1c2VyIHJ1bnMgImlmY29uZmlnIHN0PHg+IHVwIGFkZHJlc3MgbmV0bWFzayAuLi4iCisgKiAgNi4gc3RyaXBfb3Blbl9sb3cgZ2V0cyBjYWxsZWQKKyAqCisgKiBXaGVuIHRoZSB1c2VyIHJ1bnMgImlmY29uZmlnIHN0PHg+IGRvd24iCisgKiAgNy4gc3RyaXBfY2xvc2VfbG93IGdldHMgY2FsbGVkCisgKgorICogV2hlbiB0aGUgdXNlciBraWxscyB0aGUgc2xhdHRhY2ggcHJvY2VzcworICogIDguIHN0cmlwX2Nsb3NlIGdldHMgY2FsbGVkCisgKiAgOS4gc3RyaXBfY2xvc2UgY2FsbHMgZGV2X2Nsb3NlCisgKiAxMC4gaWYgdGhlIGRldmljZSBpcyBzdGlsbCB1cCwgdGhlbiBkZXZfY2xvc2UgY2FsbHMgc3RyaXBfY2xvc2VfbG93CisgKiAxMS4gc3RyaXBfY2xvc2UgY2FsbHMgc3RyaXBfZnJlZQorICovCisKKy8qIE9wZW4gdGhlIGxvdy1sZXZlbCBwYXJ0IG9mIHRoZSBTVFJJUCBjaGFubmVsLiBFYXN5ISAqLworCitzdGF0aWMgaW50IHN0cmlwX29wZW5fbG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChzdHJpcF9pbmZvLT50dHkgPT0gTlVMTCkKKwkJcmV0dXJuICgtRU5PREVWKTsKKworCWlmICghYWxsb2NhdGVfYnVmZmVycyhzdHJpcF9pbmZvLCBkZXYtPm10dSkpCisJCXJldHVybiAoLUVOT01FTSk7CisKKwlzdHJpcF9pbmZvLT5zeF9jb3VudCA9IDA7CisJc3RyaXBfaW5mby0+dHhfbGVmdCA9IDA7CisKKwlzdHJpcF9pbmZvLT5kaXNjYXJkID0gMDsKKwlzdHJpcF9pbmZvLT53b3JraW5nID0gRkFMU0U7CisJc3RyaXBfaW5mby0+ZmlybXdhcmVfbGV2ZWwgPSBOb1N0cnVjdHVyZTsKKwlzdHJpcF9pbmZvLT5uZXh0X2NvbW1hbmQgPSBDb21wYXRpYmlsaXR5Q29tbWFuZDsKKwlzdHJpcF9pbmZvLT51c2VyX2JhdWQgPSBnZXRfYmF1ZChzdHJpcF9pbmZvLT50dHkpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEluaXRpYWxpemluZyBSYWRpby5cbiIsCisJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSk7CisJUmVzZXRSYWRpbyhzdHJpcF9pbmZvKTsKKwlzdHJpcF9pbmZvLT5pZGxlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMSAqIEhaOworCWFkZF90aW1lcigmc3RyaXBfaW5mby0+aWRsZV90aW1lcik7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXJldHVybiAoMCk7Cit9CisKKworLyoKKyAqIENsb3NlIHRoZSBsb3ctbGV2ZWwgcGFydCBvZiB0aGUgU1RSSVAgY2hhbm5lbC4gRWFzeSEKKyAqLworCitzdGF0aWMgaW50IHN0cmlwX2Nsb3NlX2xvdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbyA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoc3RyaXBfaW5mby0+dHR5ID09IE5VTEwpCisJCXJldHVybiAtRUJVU1k7CisJc3RyaXBfaW5mby0+dHR5LT5mbGFncyAmPSB+KDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKgorCSAqIEZyZWUgYWxsIFNUUklQIGZyYW1lIGJ1ZmZlcnMuCisJICovCisJaWYgKHN0cmlwX2luZm8tPnJ4X2J1ZmYpIHsKKwkJa2ZyZWUoc3RyaXBfaW5mby0+cnhfYnVmZik7CisJCXN0cmlwX2luZm8tPnJ4X2J1ZmYgPSBOVUxMOworCX0KKwlpZiAoc3RyaXBfaW5mby0+c3hfYnVmZikgeworCQlrZnJlZShzdHJpcF9pbmZvLT5zeF9idWZmKTsKKwkJc3RyaXBfaW5mby0+c3hfYnVmZiA9IE5VTEw7CisJfQorCWlmIChzdHJpcF9pbmZvLT50eF9idWZmKSB7CisJCWtmcmVlKHN0cmlwX2luZm8tPnR4X2J1ZmYpOworCQlzdHJpcF9pbmZvLT50eF9idWZmID0gTlVMTDsKKwl9CisJZGVsX3RpbWVyKCZzdHJpcF9pbmZvLT5pZGxlX3RpbWVyKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgRERJIHdoZW4gdGhlCisgKiAoZHluYW1pY2FsbHkgYXNzaWduZWQpIGRldmljZSBpcyByZWdpc3RlcmVkCisgKi8KKworc3RhdGljIHZvaWQgc3RyaXBfZGV2X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyoKKwkgKiBGaW5pc2ggc2V0dGluZyB1cCB0aGUgREVWSUNFIGluZm8uCisJICovCisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gMDsKKwlkZXYtPmxhc3RfcnggPSAwOworCWRldi0+dHhfcXVldWVfbGVuID0gMzA7CS8qIERyb3AgYWZ0ZXIgMzAgZnJhbWVzIHF1ZXVlZCAqLworCisJZGV2LT5mbGFncyA9IDA7CisJZGV2LT5tdHUgPSBERUZBVUxUX1NUUklQX01UVTsKKwlkZXYtPnR5cGUgPSBBUlBIUkRfTUVUUklDT007CS8qIGR0YW5nICovCisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBzaXplb2YoU1RSSVBfSGVhZGVyKTsKKwkvKgorCSAqICBkZXYtPnByaXYgICAgICAgICAgICAgQWxyZWFkeSBob2xkcyBhIHBvaW50ZXIgdG8gb3VyIHN0cnVjdCBzdHJpcAorCSAqLworCisJKihNZXRyaWNvbUFkZHJlc3MgKikgJiBkZXYtPmJyb2FkY2FzdCA9IGJyb2FkY2FzdF9hZGRyZXNzOworCWRldi0+ZGV2X2FkZHJbMF0gPSAwOworCWRldi0+YWRkcl9sZW4gPSBzaXplb2YoTWV0cmljb21BZGRyZXNzKTsKKworCS8qCisJICogUG9pbnRlcnMgdG8gaW50ZXJmYWNlIHNlcnZpY2Ugcm91dGluZXMuCisJICovCisKKwlkZXYtPm9wZW4gPSBzdHJpcF9vcGVuX2xvdzsKKwlkZXYtPnN0b3AgPSBzdHJpcF9jbG9zZV9sb3c7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBzdHJpcF94bWl0OworCWRldi0+aGFyZF9oZWFkZXIgPSBzdHJpcF9oZWFkZXI7CisJZGV2LT5yZWJ1aWxkX2hlYWRlciA9IHN0cmlwX3JlYnVpbGRfaGVhZGVyOworCWRldi0+c2V0X21hY19hZGRyZXNzID0gc3RyaXBfc2V0X21hY19hZGRyZXNzOworCWRldi0+Z2V0X3N0YXRzID0gc3RyaXBfZ2V0X3N0YXRzOworCWRldi0+Y2hhbmdlX210dSA9IHN0cmlwX2NoYW5nZV9tdHU7Cit9CisKKy8qCisgKiBGcmVlIGEgU1RSSVAgY2hhbm5lbC4KKyAqLworCitzdGF0aWMgdm9pZCBzdHJpcF9mcmVlKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbykKK3sKKwlzcGluX2xvY2tfYmgoJnN0cmlwX2xvY2spOworCWxpc3RfZGVsX3JjdSgmc3RyaXBfaW5mby0+bGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJnN0cmlwX2xvY2spOworCisJc3RyaXBfaW5mby0+bWFnaWMgPSAwOworCisJZnJlZV9uZXRkZXYoc3RyaXBfaW5mby0+ZGV2KTsKK30KKworCisvKgorICogQWxsb2NhdGUgYSBuZXcgZnJlZSBTVFJJUCBjaGFubmVsCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbzsKKworCWRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IHN0cmlwKSwgInN0JWQiLAorCQkJICAgc3RyaXBfZGV2X3NldHVwKTsKKworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsJLyogSWYgbm8gbW9yZSBtZW1vcnksIHJldHVybiAqLworCisKKwlzdHJpcF9pbmZvID0gZGV2LT5wcml2OworCXN0cmlwX2luZm8tPmRldiA9IGRldjsKKworCXN0cmlwX2luZm8tPm1hZ2ljID0gU1RSSVBfTUFHSUM7CisJc3RyaXBfaW5mby0+dHR5ID0gTlVMTDsKKworCXN0cmlwX2luZm8tPmdyYXR1aXRvdXNfYXJwID0gamlmZmllcyArIExvbmdUaW1lOworCXN0cmlwX2luZm8tPmFycF9pbnRlcnZhbCA9IDA7CisJaW5pdF90aW1lcigmc3RyaXBfaW5mby0+aWRsZV90aW1lcik7CisJc3RyaXBfaW5mby0+aWRsZV90aW1lci5kYXRhID0gKGxvbmcpIGRldjsKKwlzdHJpcF9pbmZvLT5pZGxlX3RpbWVyLmZ1bmN0aW9uID0gc3RyaXBfSWRsZVRhc2s7CisKKworCXNwaW5fbG9ja19iaCgmc3RyaXBfbG9jayk7CisgcmVzY2FuOgorCS8qCisJICogU2VhcmNoIHRoZSBsaXN0IHRvIGZpbmQgd2hlcmUgdG8gcHV0IG91ciBuZXcgZW50cnkKKwkgKiAoYW5kIGluIHRoZSBwcm9jZXNzIGRlY2lkZSB3aGF0IGNoYW5uZWwgbnVtYmVyIGl0IGlzCisJICogZ29pbmcgdG8gYmUpCisJICovCisJbGlzdF9mb3JfZWFjaChuLCAmc3RyaXBfbGlzdCkgeworCQlzdHJ1Y3Qgc3RyaXAgKnMgPSBobGlzdF9lbnRyeShuLCBzdHJ1Y3Qgc3RyaXAsIGxpc3QpOworCisJCWlmIChzLT5kZXYtPmJhc2VfYWRkciA9PSBkZXYtPmJhc2VfYWRkcikgeworCQkJKytkZXYtPmJhc2VfYWRkcjsKKwkJCWdvdG8gcmVzY2FuOworCQl9CisJfQorCisJc3ByaW50ZihkZXYtPm5hbWUsICJzdCVsZCIsIGRldi0+YmFzZV9hZGRyKTsKKworCWxpc3RfYWRkX3RhaWxfcmN1KCZzdHJpcF9pbmZvLT5saXN0LCAmc3RyaXBfbGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJnN0cmlwX2xvY2spOworCisJcmV0dXJuIHN0cmlwX2luZm87Cit9CisKKy8qCisgKiBPcGVuIHRoZSBoaWdoLWxldmVsIHBhcnQgb2YgdGhlIFNUUklQIGNoYW5uZWwuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgVFRZIG1vZHVsZSB3aGVuIHRoZQorICogU1RSSVAgbGluZSBkaXNjaXBsaW5lIGlzIGNhbGxlZCBmb3IuICBCZWNhdXNlIHdlIGFyZQorICogc3VyZSB0aGUgdHR5IGxpbmUgZXhpc3RzLCB3ZSBvbmx5IGhhdmUgdG8gbGluayBpdCB0bworICogYSBmcmVlIFNUUklQIGNoYW5uZWwuLi4KKyAqLworCitzdGF0aWMgaW50IHN0cmlwX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8gPSAoc3RydWN0IHN0cmlwICopIHR0eS0+ZGlzY19kYXRhOworCisJLyoKKwkgKiBGaXJzdCBtYWtlIHN1cmUgd2UncmUgbm90IGFscmVhZHkgY29ubmVjdGVkLgorCSAqLworCisJaWYgKHN0cmlwX2luZm8gJiYgc3RyaXBfaW5mby0+bWFnaWMgPT0gU1RSSVBfTUFHSUMpCisJCXJldHVybiAtRUVYSVNUOworCisJLyoKKwkgKiBPSy4gIEZpbmQgYSBmcmVlIFNUUklQIGNoYW5uZWwgdG8gdXNlLgorCSAqLworCWlmICgoc3RyaXBfaW5mbyA9IHN0cmlwX2FsbG9jKCkpID09IE5VTEwpCisJCXJldHVybiAtRU5GSUxFOworCisJLyoKKwkgKiBSZWdpc3RlciBvdXIgbmV3bHkgY3JlYXRlZCBkZXZpY2Ugc28gaXQgY2FuIGJlIGlmY29uZmlnJ2QKKwkgKiBzdHJpcF9kZXZfaW5pdCgpIHdpbGwgYmUgY2FsbGVkIGFzIGEgc2lkZS1lZmZlY3QKKwkgKi8KKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoc3RyaXBfaW5mby0+ZGV2KSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3RyaXA6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZC5cbiIpOworCQlzdHJpcF9mcmVlKHN0cmlwX2luZm8pOworCQlyZXR1cm4gLUVORklMRTsKKwl9CisKKwlzdHJpcF9pbmZvLT50dHkgPSB0dHk7CisJdHR5LT5kaXNjX2RhdGEgPSBzdHJpcF9pbmZvOworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisKKwkvKgorCSAqIFJlc3RvcmUgZGVmYXVsdCBzZXR0aW5ncworCSAqLworCisJc3RyaXBfaW5mby0+ZGV2LT50eXBlID0gQVJQSFJEX01FVFJJQ09NOwkvKiBkdGFuZyAqLworCisJLyoKKwkgKiBTZXQgdHR5IG9wdGlvbnMKKwkgKi8KKworCXR0eS0+dGVybWlvcy0+Y19pZmxhZyB8PSBJR05CUksgfCBJR05QQVI7CS8qIElnbm9yZSBicmVha3MgYW5kIHBhcml0eSBlcnJvcnMuICovCisJdHR5LT50ZXJtaW9zLT5jX2NmbGFnIHw9IENMT0NBTDsJLyogSWdub3JlIG1vZGVtIGNvbnRyb2wgc2lnbmFscy4gKi8KKwl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJj0gfkhVUENMOwkvKiBEb24ndCBjbG9zZSBvbiBodXAgKi8KKworCXByaW50ayhLRVJOX0lORk8gIlNUUklQOiBkZXZpY2UgXCIlc1wiIGFjdGl2YXRlZFxuIiwKKwkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKworCS8qCisJICogRG9uZS4gIFdlIGhhdmUgbGlua2VkIHRoZSBUVFkgbGluZSB0byBhIGNoYW5uZWwuCisJICovCisJcmV0dXJuIChzdHJpcF9pbmZvLT5kZXYtPmJhc2VfYWRkcik7Cit9CisKKy8qCisgKiBDbG9zZSBkb3duIGEgU1RSSVAgY2hhbm5lbC4KKyAqIFRoaXMgbWVhbnMgZmx1c2hpbmcgb3V0IGFueSBwZW5kaW5nIHF1ZXVlcywgYW5kIHRoZW4gcmVzdG9yaW5nIHRoZQorICogVFRZIGxpbmUgZGlzY2lwbGluZSB0byB3aGF0IGl0IHdhcyBiZWZvcmUgaXQgZ290IGhvb2tlZCB0byBTVFJJUAorICogKHdoaWNoIHVzdWFsbHkgaXMgVFRZIGFnYWluKS4KKyAqLworCitzdGF0aWMgdm9pZCBzdHJpcF9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbyA9IChzdHJ1Y3Qgc3RyaXAgKikgdHR5LT5kaXNjX2RhdGE7CisKKwkvKgorCSAqIEZpcnN0IG1ha2Ugc3VyZSB3ZSdyZSBjb25uZWN0ZWQuCisJICovCisKKwlpZiAoIXN0cmlwX2luZm8gfHwgc3RyaXBfaW5mby0+bWFnaWMgIT0gU1RSSVBfTUFHSUMpCisJCXJldHVybjsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KHN0cmlwX2luZm8tPmRldik7CisKKwl0dHktPmRpc2NfZGF0YSA9IE5VTEw7CisJc3RyaXBfaW5mby0+dHR5ID0gTlVMTDsKKwlwcmludGsoS0VSTl9JTkZPICJTVFJJUDogZGV2aWNlIFwiJXNcIiBjbG9zZWQgZG93blxuIiwKKwkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKwlzdHJpcF9mcmVlKHN0cmlwX2luZm8pOworCXR0eS0+ZGlzY19kYXRhID0gTlVMTDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUGVyZm9ybSBJL08gY29udHJvbCBjYWxscyBvbiBhbiBhY3RpdmUgU1RSSVAgY2hhbm5lbC4JCSovCisKK3N0YXRpYyBpbnQgc3RyaXBfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8gPSAoc3RydWN0IHN0cmlwICopIHR0eS0+ZGlzY19kYXRhOworCisJLyoKKwkgKiBGaXJzdCBtYWtlIHN1cmUgd2UncmUgY29ubmVjdGVkLgorCSAqLworCisJaWYgKCFzdHJpcF9pbmZvIHx8IHN0cmlwX2luZm8tPm1hZ2ljICE9IFNUUklQX01BR0lDKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR0lGTkFNRToKKwkJaWYoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSBhcmcsIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgc3RybGVuKHN0cmlwX2luZm8tPmRldi0+bmFtZSkgKyAxKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIFNJT0NTSUZIV0FERFI6CisJeworCQlNZXRyaWNvbUFkZHJlc3MgYWRkcjsKKwkJLy9wcmludGsoS0VSTl9JTkZPICIlczogU0lPQ1NJRkhXQUREUlxuIiwgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKwkJaWYoY29weV9mcm9tX3VzZXIoJmFkZHIsICh2b2lkIF9fdXNlciAqKSBhcmcsIHNpemVvZihNZXRyaWNvbUFkZHJlc3MpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gc2V0X21hY19hZGRyZXNzKHN0cmlwX2luZm8sICZhZGRyKTsKKwl9CisJLyoKKwkgKiBBbGxvdyBzdHR5IHRvIHJlYWQsIGJ1dCBub3Qgc2V0LCB0aGUgc2VyaWFsIHBvcnQKKwkgKi8KKworCWNhc2UgVENHRVRTOgorCWNhc2UgVENHRVRBOgorCQlyZXR1cm4gbl90dHlfaW9jdGwodHR5LCBmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW5pdGlhbGl6YXRpb24JCQkJCQkJKi8KKworc3RhdGljIHN0cnVjdCB0dHlfbGRpc2Mgc3RyaXBfbGRpc2MgPSB7CisJLm1hZ2ljID0gVFRZX0xESVNDX01BR0lDLAorCS5uYW1lID0gInN0cmlwIiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IHN0cmlwX29wZW4sCisJLmNsb3NlID0gc3RyaXBfY2xvc2UsCisJLmlvY3RsID0gc3RyaXBfaW9jdGwsCisJLnJlY2VpdmVfYnVmID0gc3RyaXBfcmVjZWl2ZV9idWYsCisJLnJlY2VpdmVfcm9vbSA9IHN0cmlwX3JlY2VpdmVfcm9vbSwKKwkud3JpdGVfd2FrZXVwID0gc3RyaXBfd3JpdGVfc29tZV9tb3JlLAorfTsKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIFNUUklQIGRyaXZlci4KKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYXQgYm9vdCB0aW1lLCB0byBib290c3RyYXAgdGhlIG11bHRpLWNoYW5uZWwKKyAqIFNUUklQIGRyaXZlcgorICovCisKK3N0YXRpYyBjaGFyIHNpZ25vbltdIF9faW5pdGRhdGEgPQorICAgIEtFUk5fSU5GTyAiU1RSSVA6IFZlcnNpb24gJXMgKHVubGltaXRlZCBjaGFubmVscylcbiI7CisKK3N0YXRpYyBpbnQgX19pbml0IHN0cmlwX2luaXRfZHJpdmVyKHZvaWQpCit7CisJaW50IHN0YXR1czsKKworCXByaW50ayhzaWdub24sIFN0cmlwVmVyc2lvbik7CisKKwkKKwkvKgorCSAqIEZpbGwgaW4gb3VyIGxpbmUgcHJvdG9jb2wgZGlzY2lwbGluZSwgYW5kIHJlZ2lzdGVyIGl0CisJICovCisJaWYgKChzdGF0dXMgPSB0dHlfcmVnaXN0ZXJfbGRpc2MoTl9TVFJJUCwgJnN0cmlwX2xkaXNjKSkpCisJCXByaW50ayhLRVJOX0VSUiAiU1RSSVA6IGNhbid0IHJlZ2lzdGVyIGxpbmUgZGlzY2lwbGluZSAoZXJyID0gJWQpXG4iLAorCQkgICAgICAgc3RhdHVzKTsKKworCS8qCisJICogUmVnaXN0ZXIgdGhlIHN0YXR1cyBmaWxlIHdpdGggL3Byb2MKKwkgKi8KKwlwcm9jX25ldF9mb3BzX2NyZWF0ZSgic3RyaXAiLCBTX0lGUkVHIHwgU19JUlVHTywgJnN0cmlwX3NlcV9mb3BzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK21vZHVsZV9pbml0KHN0cmlwX2luaXRfZHJpdmVyKTsKKworc3RhdGljIGNvbnN0IGNoYXIgc2lnbm9mZltdIF9fZXhpdGRhdGEgPQorICAgIEtFUk5fSU5GTyAiU1RSSVA6IE1vZHVsZSBVbmxvYWRlZFxuIjsKKworc3RhdGljIHZvaWQgX19leGl0IHN0cmlwX2V4aXRfZHJpdmVyKHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwqbjsKKworCS8qIG1vZHVsZSByZWYgY291bnQgcnVsZXMgYXNzdXJlIHRoYXQgYWxsIGVudHJpZXMgYXJlIHVucmVnaXN0ZXJlZCAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmc3RyaXBfbGlzdCkgeworCQlzdHJ1Y3Qgc3RyaXAgKnMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzdHJpcCwgbGlzdCk7CisJCXN0cmlwX2ZyZWUocyk7CisJfQorCisJLyogVW5yZWdpc3RlciB3aXRoIHRoZSAvcHJvYy9uZXQgZmlsZSBoZXJlLiAqLworCXByb2NfbmV0X3JlbW92ZSgic3RyaXAiKTsKKworCWlmICgoaSA9IHR0eV9yZWdpc3Rlcl9sZGlzYyhOX1NUUklQLCBOVUxMKSkpCisJCXByaW50ayhLRVJOX0VSUiAiU1RSSVA6IGNhbid0IHVucmVnaXN0ZXIgbGluZSBkaXNjaXBsaW5lIChlcnIgPSAlZClcbiIsIGkpOworCisJcHJpbnRrKHNpZ25vZmYpOworfQorCittb2R1bGVfZXhpdChzdHJpcF9leGl0X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlN0dWFydCBDaGVzaGlyZSA8Y2hlc2hpcmVAY3Muc3RhbmZvcmQuZWR1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdGFybW9kZSBSYWRpbyBJUCAoU1RSSVApIERldmljZSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKKworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIlN0YXJtb2RlIFJhZGlvIElQIChTVFJJUCkgbW9kZW0iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RvZG8udHh0IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdG9kby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyMzQwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RvZG8udHh0CkBAIC0wLDAgKzEsMTUgQEAKKwlXaXJlbGVzcyBUb2RvCisJLS0tLS0tLS0tLS0tLQorCisxKSBCcmluZyBvdGhlciBrZXJuZWwgV2lyZWxlc3MgTEFOIGRyaXZlcnMgaGVyZQorCUNvbXBsZXRlZAorCisyKSBCcmluZyBuZXcgV2lyZWxlc3MgTEFOIGRyaXZlciBub3QgeWV0IGluIHRoZSBrZXJuZWwgdGhlcmUKKwlTZWUgbXkgd2ViIHBhZ2UgZm9yIGRldGFpbHMKKwlJbiBwYXJ0aWN1bGFyIDogSG9zdEFQCisKKzMpIE1pc2MKKwlvIE1hcmsgd2F2ZWxhbiwgd2F2ZWxhbl9jcywgbmV0d2F2ZV9jcyBkcml2ZXJzIGFzIG9ic29sZXRlCisJbyBNYXliZSBhcmxhbi5jLCByYXlfY3MuYyBhbmQgc3RyaXAuYyBhbHNvIGRlc2VydmUgdG8gYmUgb2Jzb2xldGUKKworCUplYW4gSUkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTVlMjBhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5jCkBAIC0wLDAgKzEsNDQ1MiBAQAorLyoKKyAqCVdhdmVMQU4gSVNBIGRyaXZlcgorICoKKyAqCQlKZWFuIElJIC0gSFBMQiAnOTYKKyAqCisgKiBSZW9yZ2FuaXNhdGlvbiBhbmQgZXh0ZW5zaW9uIG9mIHRoZSBkcml2ZXIuCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgZm9sbG93cyAoYWxzbyBzZWUgdGhlIGVuZCBvZiB0aGlzIGZpbGUpLgorICogU2VlIHdhdmVsYW4ucC5oIGZvciBkZXRhaWxzLgorICoKKyAqCisgKgorICogQVQmVCBHSVMgKG5lZSBOQ1IpIFdhdmVMQU4gY2FyZDoKKyAqCUFuIEV0aGVybmV0LWxpa2UgcmFkaW8gdHJhbnNjZWl2ZXIKKyAqCWNvbnRyb2xsZWQgYnkgYW4gSW50ZWwgODI1ODYgY29wcm9jZXNzb3IuCisgKi8KKworI2luY2x1ZGUgIndhdmVsYW4ucC5oIgkJLyogUHJpdmF0ZSBoZWFkZXIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogTUlTQyBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBTdWJyb3V0aW5lcyB3aGljaCB3b24ndCBmaXQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgY2F0ZWdvcnkKKyAqIChXYXZlTEFOIG1vZGVtIG9yIGk4MjU4NikKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVHJhbnNsYXRlIGlycSBudW1iZXIgdG8gUFNBIGlycSBwYXJhbWV0ZXIKKyAqLworc3RhdGljIHU4IHd2X2lycV90b19wc2EoaW50IGlycSkKK3sKKwlpZiAoaXJxIDwgMCB8fCBpcnEgPj0gTkVMUyhpcnF2YWxzKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gaXJxdmFsc1tpcnFdOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVHJhbnNsYXRlIFBTQSBpcnEgcGFyYW1ldGVyIHRvIGlycSBudW1iZXIgCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHd2X3BzYV90b19pcnEodTggaXJxdmFsKQoreworCWludCBpcnE7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IE5FTFMoaXJxdmFscyk7IGlycSsrKQorCQlpZiAoaXJxdmFsc1tpcnFdID09IGlycXZhbCkKKwkJCXJldHVybiBpcnE7CisKKwlyZXR1cm4gLTE7Cit9CisKKyNpZmRlZiBTVFJVQ1RfQ0hFQ0sKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTYW5pdHkgcm91dGluZSB0byB2ZXJpZnkgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIFdhdmVMQU4gaW50ZXJmYWNlCisgKiBzdHJ1Y3R1cmVzLgorICovCitzdGF0aWMgY2hhciAqd3Zfc3RydWN0X2NoZWNrKHZvaWQpCit7CisjZGVmaW5lCVNDKHQscyxuKQlpZiAoc2l6ZW9mKHQpICE9IHMpIHJldHVybihuKTsKKworCVNDKHBzYV90LCBQU0FfU0laRSwgInBzYV90Iik7CisJU0MobW13X3QsIE1NV19TSVpFLCAibW13X3QiKTsKKwlTQyhtbXJfdCwgTU1SX1NJWkUsICJtbXJfdCIpOworCVNDKGhhX3QsIEhBX1NJWkUsICJoYV90Iik7CisKKyN1bmRlZglTQworCisJcmV0dXJuICgoY2hhciAqKSBOVUxMKTsKK30JCQkJLyogd3Zfc3RydWN0X2NoZWNrICovCisjZW5kaWYJCQkJLyogU1RSVUNUX0NIRUNLICovCisKKy8qKioqKioqKioqKioqKioqKioqKiogSE9TVCBBREFQVEVSIFNVQlJPVVRJTkVTICoqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBVc2VmdWwgc3Vicm91dGluZXMgdG8gbWFuYWdlIHRoZSBXYXZlTEFOIElTQSBpbnRlcmZhY2UKKyAqCisgKiBPbmUgbWFqb3IgZGlmZmVyZW5jZSB3aXRoIHRoZSBQQ01DSUEgaGFyZHdhcmUgKGV4Y2VwdCB0aGUgcG9ydCBtYXBwaW5nKQorICogaXMgdGhhdCB3ZSBoYXZlIHRvIGtlZXAgdGhlIHN0YXRlIG9mIHRoZSBIb3N0IENvbnRyb2wgUmVnaXN0ZXIKKyAqIGJlY2F1c2Ugb2YgdGhlIGludGVycnVwdCBlbmFibGUgJiBidXMgc2l6ZSBmbGFncy4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUmVhZCBmcm9tIGNhcmQncyBIb3N0IEFkYXB0b3IgU3RhdHVzIFJlZ2lzdGVyLgorICovCitzdGF0aWMgaW5saW5lIHUxNiBoYXNyX3JlYWQodW5zaWduZWQgbG9uZyBpb2FkZHIpCit7CisJcmV0dXJuIChpbncoSEFTUihpb2FkZHIpKSk7Cit9CQkJCS8qIGhhc3JfcmVhZCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV3JpdGUgdG8gY2FyZCdzIEhvc3QgQWRhcHRlciBDb21tYW5kIFJlZ2lzdGVyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGFjcl93cml0ZSh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IGhhY3IpCit7CisJb3V0dyhoYWNyLCBIQUNSKGlvYWRkcikpOworfQkJCQkvKiBoYWNyX3dyaXRlICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXcml0ZSB0byBjYXJkJ3MgSG9zdCBBZGFwdGVyIENvbW1hbmQgUmVnaXN0ZXIuIEluY2x1ZGUgYSBkZWxheSBmb3IKKyAqIHRob3NlIHRpbWVzIHdoZW4gaXQgaXMgbmVlZGVkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGFjcl93cml0ZV9zbG93KHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1MTYgaGFjcikKK3sKKwloYWNyX3dyaXRlKGlvYWRkciwgaGFjcik7CisJLyogZGVsYXkgbWlnaHQgb25seSBiZSBuZWVkZWQgc29tZXRpbWVzICovCisJbWRlbGF5KDEpOworfQkJCQkvKiBoYWNyX3dyaXRlX3Nsb3cgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNldCB0aGUgY2hhbm5lbCBhdHRlbnRpb24gYml0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NoYW5fYXR0bih1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IGhhY3IpCit7CisJaGFjcl93cml0ZShpb2FkZHIsIGhhY3IgfCBIQUNSX0NBKTsKK30JCQkJLyogc2V0X2NoYW5fYXR0biAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUmVzZXQsIGFuZCB0aGVuIHNldCBob3N0IGFkYXB0b3IgaW50byBkZWZhdWx0IG1vZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3dl9oYWNyX3Jlc2V0KHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCWhhY3Jfd3JpdGVfc2xvdyhpb2FkZHIsIEhBQ1JfUkVTRVQpOworCWhhY3Jfd3JpdGUoaW9hZGRyLCBIQUNSX0RFRkFVTFQpOworfQkJCQkvKiB3dl9oYWNyX3Jlc2V0ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTZXQgdGhlIEkvTyB0cmFuc2ZlciBvdmVyIHRoZSBJU0EgYnVzIHRvIDgtYml0IG1vZGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHd2XzE2X29mZih1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IGhhY3IpCit7CisJaGFjciAmPSB+SEFDUl8xNkJJVFM7CisJaGFjcl93cml0ZShpb2FkZHIsIGhhY3IpOworfQkJCQkvKiB3dl8xNl9vZmYgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNldCB0aGUgSS9PIHRyYW5zZmVyIG92ZXIgdGhlIElTQSBidXMgdG8gOC1iaXQgbW9kZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3ZfMTZfb24odW5zaWduZWQgbG9uZyBpb2FkZHIsIHUxNiBoYWNyKQoreworCWhhY3IgfD0gSEFDUl8xNkJJVFM7CisJaGFjcl93cml0ZShpb2FkZHIsIGhhY3IpOworfQkJCQkvKiB3dl8xNl9vbiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRGlzYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBXYXZlTEFOIGhhcmR3YXJlLgorICogKGNhbGxlZCBieSB3dl84MjU4Nl9zdG9wKCkpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3dl9pbnRzX29mZihzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwkKKwlscC0+aGFjciAmPSB+SEFDUl9JTlRST047CisJaGFjcl93cml0ZShpb2FkZHIsIGxwLT5oYWNyKTsKK30JCQkJLyogd3ZfaW50c19vZmYgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBXYXZlTEFOIGhhcmR3YXJlLgorICogKGNhbGxlZCBieSB3dl9od19yZXNldCgpKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3ZfaW50c19vbihzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWxwLT5oYWNyIHw9IEhBQ1JfSU5UUk9OOworCWhhY3Jfd3JpdGUoaW9hZGRyLCBscC0+aGFjcik7Cit9CQkJCS8qIHd2X2ludHNfb24gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTU9ERU0gTUFOQUdFTUVOVCBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFVzZWZ1bCBzdWJyb3V0aW5lcyB0byBtYW5hZ2UgdGhlIG1vZGVtIG9mIHRoZSBXYXZlTEFOCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJlYWQgdGhlIFBhcmFtZXRlciBTdG9yYWdlIEFyZWEgZnJvbSB0aGUgV2F2ZUxBTiBjYXJkJ3MgbWVtb3J5CisgKi8KKy8qCisgKiBSZWFkIGJ5dGVzIGZyb20gdGhlIFBTQS4KKyAqLworc3RhdGljIHZvaWQgcHNhX3JlYWQodW5zaWduZWQgbG9uZyBpb2FkZHIsIHUxNiBoYWNyLCBpbnQgbywJLyogb2Zmc2V0IGluIFBTQSAqLworCQkgICAgIHU4ICogYiwJLyogYnVmZmVyIHRvIGZpbGwgKi8KKwkJICAgICBpbnQgbikKK3sJCQkJLyogc2l6ZSB0byByZWFkICovCisJd3ZfMTZfb2ZmKGlvYWRkciwgaGFjcik7CisKKwl3aGlsZSAobi0tID4gMCkgeworCQlvdXR3KG8sIFBJT1IyKGlvYWRkcikpOworCQlvKys7CisJCSpiKysgPSBpbmIoUElPUDIoaW9hZGRyKSk7CisJfQorCisJd3ZfMTZfb24oaW9hZGRyLCBoYWNyKTsKK30JCQkJLyogcHNhX3JlYWQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyaXRlIHRoZSBQYXJhbWV0ZXIgU3RvcmFnZSBBcmVhIHRvIHRoZSBXYXZlTEFOIGNhcmQncyBtZW1vcnkuCisgKi8KK3N0YXRpYyB2b2lkIHBzYV93cml0ZSh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IGhhY3IsIGludCBvLAkvKiBPZmZzZXQgaW4gUFNBICovCisJCSAgICAgIHU4ICogYiwJLyogQnVmZmVyIGluIG1lbW9yeSAqLworCQkgICAgICBpbnQgbikKK3sJCQkJLyogTGVuZ3RoIG9mIGJ1ZmZlciAqLworCWludCBjb3VudCA9IDA7CisKKwl3dl8xNl9vZmYoaW9hZGRyLCBoYWNyKTsKKworCXdoaWxlIChuLS0gPiAwKSB7CisJCW91dHcobywgUElPUjIoaW9hZGRyKSk7CisJCW8rKzsKKworCQlvdXRiKCpiLCBQSU9QMihpb2FkZHIpKTsKKwkJYisrOworCisJCS8qIFdhaXQgZm9yIHRoZSBtZW1vcnkgdG8gZmluaXNoIGl0cyB3cml0ZSBjeWNsZSAqLworCQljb3VudCA9IDA7CisJCXdoaWxlICgoY291bnQrKyA8IDEwMCkgJiYKKwkJICAgICAgIChoYXNyX3JlYWQoaW9hZGRyKSAmIEhBU1JfUFNBX0JVU1kpKSBtZGVsYXkoMSk7CisJfQorCisJd3ZfMTZfb24oaW9hZGRyLCBoYWNyKTsKK30JCQkJLyogcHNhX3dyaXRlICovCisKKyNpZmRlZiBTRVRfUFNBX0NSQworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIENhbGN1bGF0ZSB0aGUgUFNBIENSQworICogVGhhbmtzIHRvIFZhbHN0ZXIsIE5pY28gPE5WQUxTVEVSQHdjbmQubmwubHVjZW50LmNvbT4gZm9yIHRoZSBjb2RlCisgKiBOT1RFOiBCeSBzcGVjaWZ5aW5nIGEgbGVuZ3RoIGluY2x1ZGluZyB0aGUgQ1JDIHBvc2l0aW9uIHRoZQorICogcmV0dXJuZWQgdmFsdWUgc2hvdWxkIGJlIHplcm8uIChpLmUuIGEgY29ycmVjdCBjaGVja3N1bSBpbiB0aGUgUFNBKQorICoKKyAqIFRoZSBXaW5kb3dzIGRyaXZlcnMgZG9uJ3QgdXNlIHRoZSBDUkMsIGJ1dCB0aGUgQVAgYW5kIHRoZSBQdFAgdG9vbAorICogZGVwZW5kIG9uIGl0LgorICovCitzdGF0aWMgaW5saW5lIHUxNiBwc2FfY3JjKHU4ICogcHNhLAkvKiBUaGUgUFNBICovCisJCQkgICAgICBpbnQgc2l6ZSkKK3sJCQkJLyogTnVtYmVyIG9mIHNob3J0IGZvciBDUkMgKi8KKwlpbnQgYnl0ZV9jbnQ7CQkvKiBMb29wIG9uIHRoZSBQU0EgKi8KKwl1MTYgY3JjX2J5dGVzID0gMDsJLyogRGF0YSBpbiB0aGUgUFNBICovCisJaW50IGJpdF9jbnQ7CQkvKiBMb29wIG9uIHRoZSBiaXRzIG9mIHRoZSBzaG9ydCAqLworCisJZm9yIChieXRlX2NudCA9IDA7IGJ5dGVfY250IDwgc2l6ZTsgYnl0ZV9jbnQrKykgeworCQljcmNfYnl0ZXMgXj0gcHNhW2J5dGVfY250XTsJLyogSXRzIGFuIHhvciAqLworCisJCWZvciAoYml0X2NudCA9IDE7IGJpdF9jbnQgPCA5OyBiaXRfY250KyspIHsKKwkJCWlmIChjcmNfYnl0ZXMgJiAweDAwMDEpCisJCQkJY3JjX2J5dGVzID0gKGNyY19ieXRlcyA+PiAxKSBeIDB4QTAwMTsKKwkJCWVsc2UKKwkJCQljcmNfYnl0ZXMgPj49IDE7CisJCX0KKwl9CisKKwlyZXR1cm4gY3JjX2J5dGVzOworfQkJCQkvKiBwc2FfY3JjICovCisjZW5kaWYJCQkJLyogU0VUX1BTQV9DUkMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHVwZGF0ZSB0aGUgY2hlY2tzdW0gZmllbGQgaW4gdGhlIFdhdmVsYW4ncyBQU0EKKyAqLworc3RhdGljIHZvaWQgdXBkYXRlX3BzYV9jaGVja3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgdW5zaWduZWQgbG9uZyBpb2FkZHIsIHUxNiBoYWNyKQoreworI2lmZGVmIFNFVF9QU0FfQ1JDCisJcHNhX3QgcHNhOworCXUxNiBjcmM7CisKKwkvKiByZWFkIHRoZSBwYXJhbWV0ZXIgc3RvcmFnZSBhcmVhICovCisJcHNhX3JlYWQoaW9hZGRyLCBoYWNyLCAwLCAodW5zaWduZWQgY2hhciAqKSAmcHNhLCBzaXplb2YocHNhKSk7CisKKwkvKiB1cGRhdGUgdGhlIGNoZWNrc3VtICovCisJY3JjID0gcHNhX2NyYygodW5zaWduZWQgY2hhciAqKSAmcHNhLAorCQkgICAgICBzaXplb2YocHNhKSAtIHNpemVvZihwc2EucHNhX2NyY1swXSkgLQorCQkgICAgICBzaXplb2YocHNhLnBzYV9jcmNbMV0pCisJCSAgICAgIC0gc2l6ZW9mKHBzYS5wc2FfY3JjX3N0YXR1cykpOworCisJcHNhLnBzYV9jcmNbMF0gPSBjcmMgJiAweEZGOworCXBzYS5wc2FfY3JjWzFdID0gKGNyYyAmIDB4RkYwMCkgPj4gODsKKworCS8qIFdyaXRlIGl0ICEgKi8KKwlwc2Ffd3JpdGUoaW9hZGRyLCBoYWNyLCAoY2hhciAqKSAmcHNhLnBzYV9jcmMgLSAoY2hhciAqKSAmcHNhLAorCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX2NyYywgMik7CisKKyNpZmRlZiBERUJVR19JT0NUTF9JTkZPCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB1cGRhdGVfcHNhX2NoZWNrc3VtKCk6IGNyYyA9IDB4JTAyeCUwMnhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgcHNhLnBzYV9jcmNbMF0sIHBzYS5wc2FfY3JjWzFdKTsKKworCS8qIENoZWNrIGFnYWluIChsdXh1cnkgISkgKi8KKwljcmMgPSBwc2FfY3JjKCh1bnNpZ25lZCBjaGFyICopICZwc2EsCisJCSAgICAgIHNpemVvZihwc2EpIC0gc2l6ZW9mKHBzYS5wc2FfY3JjX3N0YXR1cykpOworCisJaWYgKGNyYyAhPSAwKQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IHVwZGF0ZV9wc2FfY2hlY2tzdW0oKTogQ1JDIGRvZXMgbm90IGFncmVlIHdpdGggUFNBIGRhdGEgKGV2ZW4gYWZ0ZXIgcmVjYWxjdWxhdGluZylcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCQkJCS8qIERFQlVHX0lPQ1RMX0lORk8gKi8KKyNlbmRpZgkJCQkvKiBTRVRfUFNBX0NSQyAqLworfQkJCQkvKiB1cGRhdGVfcHNhX2NoZWNrc3VtICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXcml0ZSAxIGJ5dGUgdG8gdGhlIE1NQy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1tY19vdXQodW5zaWduZWQgbG9uZyBpb2FkZHIsIHUxNiBvLCB1OCBkKQoreworCWludCBjb3VudCA9IDA7CisKKwkvKiBXYWl0IGZvciBNTUMgdG8gZ28gaWRsZSAqLworCXdoaWxlICgoY291bnQrKyA8IDEwMCkgJiYgKGludyhIQVNSKGlvYWRkcikpICYgSEFTUl9NTUNfQlVTWSkpCisJCXVkZWxheSgxMCk7CisKKwlvdXR3KCh1MTYpICgoKHUxNikgZCA8PCA4KSB8IChvIDw8IDEpIHwgMSksIE1NQ1IoaW9hZGRyKSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSb3V0aW5lIHRvIHdyaXRlIGJ5dGVzIHRvIHRoZSBNb2RlbSBNYW5hZ2VtZW50IENvbnRyb2xsZXIuCisgKiBXZSBzdGFydCBhdCB0aGUgZW5kIGJlY2F1c2UgaXQgaXMgdGhlIHdheSBpdCBzaG91bGQgYmUhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtbWNfd3JpdGUodW5zaWduZWQgbG9uZyBpb2FkZHIsIHU4IG8sIHU4ICogYiwgaW50IG4pCit7CisJbyArPSBuOworCWIgKz0gbjsKKworCXdoaWxlIChuLS0gPiAwKQorCQltbWNfb3V0KGlvYWRkciwgLS1vLCAqKC0tYikpOworfQkJCQkvKiBtbWNfd3JpdGUgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJlYWQgYSBieXRlIGZyb20gdGhlIE1NQy4KKyAqIE9wdGltaXNlZCB2ZXJzaW9uIGZvciAxIGJ5dGUsIGF2b2lkIHVzaW5nIG1lbW9yeS4KKyAqLworc3RhdGljIGlubGluZSB1OCBtbWNfaW4odW5zaWduZWQgbG9uZyBpb2FkZHIsIHUxNiBvKQoreworCWludCBjb3VudCA9IDA7CisKKwl3aGlsZSAoKGNvdW50KysgPCAxMDApICYmIChpbncoSEFTUihpb2FkZHIpKSAmIEhBU1JfTU1DX0JVU1kpKQorCQl1ZGVsYXkoMTApOworCW91dHcobyA8PCAxLCBNTUNSKGlvYWRkcikpOworCisJd2hpbGUgKChjb3VudCsrIDwgMTAwKSAmJiAoaW53KEhBU1IoaW9hZGRyKSkgJiBIQVNSX01NQ19CVVNZKSkKKwkJdWRlbGF5KDEwKTsKKwlyZXR1cm4gKHU4KSAoaW53KE1NQ1IoaW9hZGRyKSkgPj4gOCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSb3V0aW5lIHRvIHJlYWQgYnl0ZXMgZnJvbSB0aGUgTW9kZW0gTWFuYWdlbWVudCBDb250cm9sbGVyLgorICogVGhlIGltcGxlbWVudGF0aW9uIGlzIGNvbXBsaWNhdGVkIGJ5IGEgbGFjayBvZiBhZGRyZXNzIGxpbmVzLAorICogd2hpY2ggcHJldmVudHMgZGVjb2Rpbmcgb2YgdGhlIGxvdy1vcmRlciBiaXQuCisgKiAoY29kZSBoYXMganVzdCBiZWVuIG1vdmVkIGluIHRoZSBhYm92ZSBmdW5jdGlvbikKKyAqIFdlIHN0YXJ0IGF0IHRoZSBlbmQgYmVjYXVzZSBpdCBpcyB0aGUgd2F5IGl0IHNob3VsZCBiZSEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1tY19yZWFkKHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1OCBvLCB1OCAqIGIsIGludCBuKQoreworCW8gKz0gbjsKKwliICs9IG47CisKKwl3aGlsZSAobi0tID4gMCkKKwkJKigtLWIpID0gbW1jX2luKGlvYWRkciwgLS1vKTsKK30JCQkJLyogbW1jX3JlYWQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEdldCB0aGUgdHlwZSBvZiBlbmNyeXB0aW9uIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbW1jX2VuY3IodW5zaWduZWQgbG9uZyBpb2FkZHIpCit7CQkJCS8qIEkvTyBwb3J0IG9mIHRoZSBjYXJkICovCisJaW50IHRlbXA7CisKKwl0ZW1wID0gbW1jX2luKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl9kZXNfYXZhaWwpKTsKKwlpZiAoKHRlbXAgIT0gTU1SX0RFU19BVkFJTF9ERVMpICYmICh0ZW1wICE9IE1NUl9ERVNfQVZBSUxfQUVTKSkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gdGVtcDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdhaXQgZm9yIHRoZSBmcmVxdWVuY3kgRUVQUk9NIHRvIGNvbXBsZXRlIGEgY29tbWFuZC4KKyAqIEkgaG9wZSB0aGlzIG9uZSB3aWxsIGJlIG9wdGltYWxseSBpbmxpbmVkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZmVlX3dhaXQodW5zaWduZWQgbG9uZyBpb2FkZHIsCS8qIEkvTyBwb3J0IG9mIHRoZSBjYXJkICovCisJCQkgICAgaW50IGRlbGF5LAkvKiBCYXNlIGRlbGF5IHRvIHdhaXQgZm9yICovCisJCQkgICAgaW50IG51bWJlcikKK3sJCQkJLyogTnVtYmVyIG9mIHRpbWUgdG8gd2FpdCAqLworCWludCBjb3VudCA9IDA7CQkvKiBXYWl0IG9ubHkgYSBsaW1pdGVkIHRpbWUgKi8KKworCXdoaWxlICgoY291bnQrKyA8IG51bWJlcikgJiYKKwkgICAgICAgKG1tY19pbihpb2FkZHIsIG1tcm9mZigwLCBtbXJfZmVlX3N0YXR1cykpICYKKwkJTU1SX0ZFRV9TVEFUVVNfQlVTWSkpIHVkZWxheShkZWxheSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSZWFkIGJ5dGVzIGZyb20gdGhlIEZyZXF1ZW5jeSBFRVBST00gKGZyZXF1ZW5jeSBzZWxlY3QgY2FyZHMpLgorICovCitzdGF0aWMgdm9pZCBmZWVfcmVhZCh1bnNpZ25lZCBsb25nIGlvYWRkciwJLyogSS9PIHBvcnQgb2YgdGhlIGNhcmQgKi8KKwkJICAgICB1MTYgbywJLyogZGVzdGluYXRpb24gb2Zmc2V0ICovCisJCSAgICAgdTE2ICogYiwJLyogZGF0YSBidWZmZXIgKi8KKwkJICAgICBpbnQgbikKK3sJCQkJLyogbnVtYmVyIG9mIHJlZ2lzdGVycyAqLworCWIgKz0gbjsJCQkvKiBQb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBhcmVhICovCisKKwkvKiBXcml0ZSB0aGUgYWRkcmVzcyAqLworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgbyArIG4gLSAxKTsKKworCS8qIExvb3Agb24gYWxsIGJ1ZmZlciAqLworCXdoaWxlIChuLS0gPiAwKSB7CisJCS8qIFdyaXRlIHRoZSByZWFkIGNvbW1hbmQgKi8KKwkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLAorCQkJTU1XX0ZFRV9DVFJMX1JFQUQpOworCisJCS8qIFdhaXQgdW50aWwgRUVQUk9NIGlzIHJlYWR5IChzaG91bGQgYmUgcXVpY2spLiAqLworCQlmZWVfd2FpdChpb2FkZHIsIDEwLCAxMDApOworCisJCS8qIFJlYWQgdGhlIHZhbHVlLiAqLworCQkqLS1iID0gKChtbWNfaW4oaW9hZGRyLCBtbXJvZmYoMCwgbW1yX2ZlZV9kYXRhX2gpKSA8PCA4KSB8CisJCQltbWNfaW4oaW9hZGRyLCBtbXJvZmYoMCwgbW1yX2ZlZV9kYXRhX2wpKSk7CisJfQorfQorCisjaWZkZWYgV0lSRUxFU1NfRVhUCQkvKiBpZiB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9uIGV4aXN0cyBpbiB0aGUga2VybmVsICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXcml0ZSBieXRlcyBmcm9tIHRoZSBGcmVxdWVuY3kgRUVQUk9NIChmcmVxdWVuY3kgc2VsZWN0IGNhcmRzKS4KKyAqIFRoaXMgaXMgYSBiaXQgY29tcGxpY2F0ZWQsIGJlY2F1c2UgdGhlIGZyZXF1ZW5jeSBFRVBST00gaGFzIHRvCisgKiBiZSB1bnByb3RlY3RlZCBhbmQgdGhlIHdyaXRlIGVuYWJsZWQuCisgKiBKZWFuIElJCisgKi8KK3N0YXRpYyB2b2lkIGZlZV93cml0ZSh1bnNpZ25lZCBsb25nIGlvYWRkciwJLyogSS9PIHBvcnQgb2YgdGhlIGNhcmQgKi8KKwkJICAgICAgdTE2IG8sCS8qIGRlc3RpbmF0aW9uIG9mZnNldCAqLworCQkgICAgICB1MTYgKiBiLAkvKiBkYXRhIGJ1ZmZlciAqLworCQkgICAgICBpbnQgbikKK3sJCQkJLyogbnVtYmVyIG9mIHJlZ2lzdGVycyAqLworCWIgKz0gbjsJCQkvKiBQb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBhcmVhLiAqLworCisjaWZkZWYgRUVQUk9NX0lTX1BST1RFQ1RFRAkvKiBkaXNhYmxlZCAqLworI2lmZGVmIERPRVNOVF9TRUVNX1RPX1dPUksJLyogZGlzYWJsZWQgKi8KKwkvKiBBc2sgdG8gcmVhZCB0aGUgcHJvdGVjdGVkIHJlZ2lzdGVyICovCisJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLCBNTVdfRkVFX0NUUkxfUFJSRUFEKTsKKworCWZlZV93YWl0KGlvYWRkciwgMTAsIDEwMCk7CisKKwkvKiBSZWFkIHRoZSBwcm90ZWN0ZWQgcmVnaXN0ZXIuICovCisJcHJpbnRrKCJQcm90ZWN0ZWQgMjogICUwMlgtJTAyWFxuIiwKKwkgICAgICAgbW1jX2luKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl9mZWVfZGF0YV9oKSksCisJICAgICAgIG1tY19pbihpb2FkZHIsIG1tcm9mZigwLCBtbXJfZmVlX2RhdGFfbCkpKTsKKyNlbmRpZgkJCQkvKiBET0VTTlRfU0VFTV9UT19XT1JLICovCisKKwkvKiBFbmFibGUgcHJvdGVjdGVkIHJlZ2lzdGVyLiAqLworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgTU1XX0ZFRV9BRERSX0VOKTsKKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfY3RybCksIE1NV19GRUVfQ1RSTF9QUkVOKTsKKworCWZlZV93YWl0KGlvYWRkciwgMTAsIDEwMCk7CisKKwkvKiBVbnByb3RlY3QgYXJlYS4gKi8KKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIG8gKyBuKTsKKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfY3RybCksIE1NV19GRUVfQ1RSTF9QUldSSVRFKTsKKyNpZmRlZiBET0VTTlRfU0VFTV9UT19XT1JLCS8qIGRpc2FibGVkICovCisJLyogb3IgdXNlOiAqLworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1BSQ0xFQVIpOworI2VuZGlmCQkJCS8qIERPRVNOVF9TRUVNX1RPX1dPUksgKi8KKworCWZlZV93YWl0KGlvYWRkciwgMTAsIDEwMCk7CisjZW5kaWYJCQkJLyogRUVQUk9NX0lTX1BST1RFQ1RFRCAqLworCisJLyogV3JpdGUgZW5hYmxlLiAqLworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgTU1XX0ZFRV9BRERSX0VOKTsKKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfY3RybCksIE1NV19GRUVfQ1RSTF9XUkVOKTsKKworCWZlZV93YWl0KGlvYWRkciwgMTAsIDEwMCk7CisKKwkvKiBXcml0ZSB0aGUgRUVQUk9NIGFkZHJlc3MuICovCisJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2FkZHIpLCBvICsgbiAtIDEpOworCisJLyogTG9vcCBvbiBhbGwgYnVmZmVyICovCisJd2hpbGUgKG4tLSA+IDApIHsKKwkJLyogV3JpdGUgdGhlIHZhbHVlLiAqLworCQltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfZGF0YV9oKSwgKCotLWIpID4+IDgpOworCQltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfZGF0YV9sKSwgKmIgJiAweEZGKTsKKworCQkvKiBXcml0ZSB0aGUgd3JpdGUgY29tbWFuZC4gKi8KKwkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLAorCQkJTU1XX0ZFRV9DVFJMX1dSSVRFKTsKKworCQkvKiBXYXZlTEFOIGRvY3VtZW50YXRpb24gc2F5cyB0byB3YWl0IGF0IGxlYXN0IDEwIG1zIGZvciBFRUJVU1kgPSAwICovCisJCW1kZWxheSgxMCk7CisJCWZlZV93YWl0KGlvYWRkciwgMTAsIDEwMCk7CisJfQorCisJLyogV3JpdGUgZGlzYWJsZS4gKi8KKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIE1NV19GRUVfQUREUl9EUyk7CisJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLCBNTVdfRkVFX0NUUkxfV0RTKTsKKworCWZlZV93YWl0KGlvYWRkciwgMTAsIDEwMCk7CisKKyNpZmRlZiBFRVBST01fSVNfUFJPVEVDVEVECS8qIGRpc2FibGVkICovCisJLyogUmVwcm90ZWN0IEVFUFJPTS4gKi8KKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIDB4MDApOworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1BSV1JJVEUpOworCisJZmVlX3dhaXQoaW9hZGRyLCAxMCwgMTAwKTsKKyNlbmRpZgkJCQkvKiBFRVBST01fSVNfUFJPVEVDVEVEICovCit9CisjZW5kaWYJCQkJLyogV0lSRUxFU1NfRVhUICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogSTgyNTg2IFNVQlJPVVRJTkVTICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVXNlZnVsIHN1YnJvdXRpbmVzIHRvIG1hbmFnZSB0aGUgRXRoZXJuZXQgY29udHJvbGxlcgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSZWFkIGJ5dGVzIGZyb20gdGhlIG9uLWJvYXJkIFJBTS4KKyAqIFdoeSBkb2VzIGlubGluaW5nIHRoaXMgZnVuY3Rpb24gbWFrZSBpdCBmYWlsPworICovCitzdGF0aWMgLyppbmxpbmUgKi8gdm9pZCBvYnJhbV9yZWFkKHVuc2lnbmVkIGxvbmcgaW9hZGRyLAorCQkJCSAgIHUxNiBvLCB1OCAqIGIsIGludCBuKQoreworCW91dHcobywgUElPUjEoaW9hZGRyKSk7CisJaW5zdyhQSU9QMShpb2FkZHIpLCAodW5zaWduZWQgc2hvcnQgKikgYiwgKG4gKyAxKSA+PiAxKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyaXRlIGJ5dGVzIHRvIHRoZSBvbi1ib2FyZCBSQU0uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBvYnJhbV93cml0ZSh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IG8sIHU4ICogYiwgaW50IG4pCit7CisJb3V0dyhvLCBQSU9SMShpb2FkZHIpKTsKKwlvdXRzdyhQSU9QMShpb2FkZHIpLCAodW5zaWduZWQgc2hvcnQgKikgYiwgKG4gKyAxKSA+PiAxKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEFja25vd2xlZGdlIHRoZSByZWFkaW5nIG9mIHRoZSBzdGF0dXMgaXNzdWVkIGJ5IHRoZSBpODI1ODYuCisgKi8KK3N0YXRpYyB2b2lkIHd2X2FjayhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1MTYgc2NiX2NzOworCWludCBpOworCisJb2JyYW1fcmVhZChpb2FkZHIsIHNjYm9mZihPRkZTRVRfU0NCLCBzY2Jfc3RhdHVzKSwKKwkJICAgKHVuc2lnbmVkIGNoYXIgKikgJnNjYl9jcywgc2l6ZW9mKHNjYl9jcykpOworCXNjYl9jcyAmPSBTQ0JfU1RfSU5UOworCisJaWYgKHNjYl9jcyA9PSAwKQorCQlyZXR1cm47CisKKwlvYnJhbV93cml0ZShpb2FkZHIsIHNjYm9mZihPRkZTRVRfU0NCLCBzY2JfY29tbWFuZCksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmc2NiX2NzLCBzaXplb2Yoc2NiX2NzKSk7CisKKwlzZXRfY2hhbl9hdHRuKGlvYWRkciwgbHAtPmhhY3IpOworCisJZm9yIChpID0gMTAwMDsgaSA+IDA7IGktLSkgeworCQlvYnJhbV9yZWFkKGlvYWRkciwgc2Nib2ZmKE9GRlNFVF9TQ0IsIHNjYl9jb21tYW5kKSwKKwkJCSAgICh1bnNpZ25lZCBjaGFyICopICZzY2JfY3MsIHNpemVvZihzY2JfY3MpKTsKKwkJaWYgKHNjYl9jcyA9PSAwKQorCQkJYnJlYWs7CisKKwkJdWRlbGF5KDEwKTsKKwl9CisJdWRlbGF5KDEwMCk7CisKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwlpZiAoaSA8PSAwKQorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHd2X2FjaygpOiBib2FyZCBub3QgYWNjZXB0aW5nIGNvbW1hbmQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU2V0IGNoYW5uZWwgYXR0ZW50aW9uIGJpdCBhbmQgYnVzeSB3YWl0IHVudGlsIGNvbW1hbmQgaGFzCisgKiBjb21wbGV0ZWQsIHRoZW4gYWNrbm93bGVkZ2UgY29tcGxldGlvbiBvZiB0aGUgY29tbWFuZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgd3Zfc3luY2hyb25vdXNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCBjb25zdCBjaGFyICpzdHIpCit7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdTE2IHNjYl9jbWQ7CisJYWNoX3QgY2I7CisJaW50IGk7CisKKwlzY2JfY21kID0gU0NCX0NNRF9DVUMgJiBTQ0JfQ01EX0NVQ19HTzsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHNjYm9mZihPRkZTRVRfU0NCLCBzY2JfY29tbWFuZCksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmc2NiX2NtZCwgc2l6ZW9mKHNjYl9jbWQpKTsKKworCXNldF9jaGFuX2F0dG4oaW9hZGRyLCBscC0+aGFjcik7CisKKwlmb3IgKGkgPSAxMDAwOyBpID4gMDsgaS0tKSB7CisJCW9icmFtX3JlYWQoaW9hZGRyLCBPRkZTRVRfQ1UsICh1bnNpZ25lZCBjaGFyICopICZjYiwKKwkJCSAgIHNpemVvZihjYikpOworCQlpZiAoY2IuYWNfc3RhdHVzICYgQUNfU0ZMRF9DKQorCQkJYnJlYWs7CisKKwkJdWRlbGF5KDEwKTsKKwl9CisJdWRlbGF5KDEwMCk7CisKKwlpZiAoaSA8PSAwIHx8ICEoY2IuYWNfc3RhdHVzICYgQUNfU0ZMRF9PSykpIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGZhaWxlZDsgc3RhdHVzID0gMHgleFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgc3RyLCBjYi5hY19zdGF0dXMpOworI2VuZGlmCisjaWZkZWYgREVCVUdfSTgyNTg2X1NIT1cKKwkJd3Zfc2NiX3Nob3coaW9hZGRyKTsKKyNlbmRpZgorCQlyZXR1cm4gLTE7CisJfQorCisJLyogQWNrIHRoZSBzdGF0dXMgKi8KKwl3dl9hY2soZGV2KTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ29uZmlndXJhdGlvbiBjb21tYW5kcyBjb21wbGV0aW9uIGludGVycnVwdC4KKyAqIENoZWNrIGlmIGRvbmUsIGFuZCBpZiBPSy4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK3d2X2NvbmZpZ19jb21wbGV0ZShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgdW5zaWduZWQgbG9uZyBpb2FkZHIsIG5ldF9sb2NhbCAqIGxwKQoreworCXVuc2lnbmVkIHNob3J0IG1jc19hZGRyOworCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKKwlpbnQgcmV0OworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X2NvbmZpZ19jb21wbGV0ZSgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwltY3NfYWRkciA9IGxwLT50eF9maXJzdF9pbl91c2UgKyBzaXplb2YoYWNfdHhfdCkgKyBzaXplb2YoYWNfbm9wX3QpCisJICAgICsgc2l6ZW9mKHRiZF90KSArIHNpemVvZihhY19jZmdfdCkgKyBzaXplb2YoYWNfaWFzX3QpOworCisJLyogUmVhZCB0aGUgc3RhdHVzIG9mIHRoZSBsYXN0IGNvbW1hbmQgKHNldCBtYyBsaXN0KS4gKi8KKwlvYnJhbV9yZWFkKGlvYWRkciwgYWNvZmYobWNzX2FkZHIsIGFjX3N0YXR1cyksCisJCSAgICh1bnNpZ25lZCBjaGFyICopICZzdGF0dXMsIHNpemVvZihzdGF0dXMpKTsKKworCS8qIElmIG5vdCBjb21wbGV0ZWQgLT4gZXhpdCAqLworCWlmICgoc3RhdHVzICYgQUNfU0ZMRF9DKSA9PSAwKQorCQlyZXQgPSAwOwkvKiBOb3QgcmVhZHkgdG8gYmUgc2NyYXBwZWQgKi8KKwllbHNlIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJdW5zaWduZWQgc2hvcnQgY2ZnX2FkZHI7CisJCXVuc2lnbmVkIHNob3J0IGlhc19hZGRyOworCisJCS8qIENoZWNrIG1jX2NvbmZpZyBjb21tYW5kICovCisJCWlmICgoc3RhdHVzICYgQUNfU0ZMRF9PSykgIT0gQUNfU0ZMRF9PSykKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAiJXM6IHd2X2NvbmZpZ19jb21wbGV0ZSgpOiBzZXRfbXVsdGljYXN0X2FkZHJlc3MgZmFpbGVkOyBzdGF0dXMgPSAweCV4XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKworCQkvKiBjaGVjayBpYS1jb25maWcgY29tbWFuZCAqLworCQlpYXNfYWRkciA9IG1jc19hZGRyIC0gc2l6ZW9mKGFjX2lhc190KTsKKwkJb2JyYW1fcmVhZChpb2FkZHIsIGFjb2ZmKGlhc19hZGRyLCBhY19zdGF0dXMpLAorCQkJICAgKHVuc2lnbmVkIGNoYXIgKikgJnN0YXR1cywgc2l6ZW9mKHN0YXR1cykpOworCQlpZiAoKHN0YXR1cyAmIEFDX1NGTERfT0spICE9IEFDX1NGTERfT0spCisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgIiVzOiB3dl9jb25maWdfY29tcGxldGUoKTogc2V0X01BQ19hZGRyZXNzIGZhaWxlZDsgc3RhdHVzID0gMHgleFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisKKwkJLyogQ2hlY2sgY29uZmlnIGNvbW1hbmQuICovCisJCWNmZ19hZGRyID0gaWFzX2FkZHIgLSBzaXplb2YoYWNfY2ZnX3QpOworCQlvYnJhbV9yZWFkKGlvYWRkciwgYWNvZmYoY2ZnX2FkZHIsIGFjX3N0YXR1cyksCisJCQkgICAodW5zaWduZWQgY2hhciAqKSAmc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSk7CisJCWlmICgoc3RhdHVzICYgQUNfU0ZMRF9PSykgIT0gQUNfU0ZMRF9PSykKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAiJXM6IHd2X2NvbmZpZ19jb21wbGV0ZSgpOiBjb25maWd1cmUgZmFpbGVkOyBzdGF0dXMgPSAweCV4XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKyNlbmRpZgkvKiBERUJVR19DT05GSUdfRVJST1IgKi8KKworCQlyZXQgPSAxOwkvKiBSZWFkeSB0byBiZSBzY3JhcHBlZCAqLworCX0KKworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl9jb25maWdfY29tcGxldGUoKSAtICVkXG4iLCBkZXYtPm5hbWUsCisJICAgICAgIHJldCk7CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ29tbWFuZCBjb21wbGV0aW9uIGludGVycnVwdC4KKyAqIFJlY2xhaW0gYXMgbWFueSBmcmVlZCB0eCBidWZmZXJzIGFzIHdlIGNhbi4KKyAqIChjYWxsZWQgaW4gd2F2ZWxhbl9pbnRlcnJ1cHQoKSkuCisgKiBOb3RlIDogdGhlIHNwaW5sb2NrIGlzIGFscmVhZHkgZ3JhYmJlZCBmb3IgdXMuCisgKi8KK3N0YXRpYyBpbnQgd3ZfY29tcGxldGUoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGxvbmcgaW9hZGRyLCBuZXRfbG9jYWwgKiBscCkKK3sKKwlpbnQgbnJlYXBlZCA9IDA7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfY29tcGxldGUoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogTG9vcCBvbiBhbGwgdGhlIHRyYW5zbWl0IGJ1ZmZlcnMgKi8KKwl3aGlsZSAobHAtPnR4X2ZpcnN0X2luX3VzZSAhPSBJODI1ODZOVUxMKSB7CisJCXVuc2lnbmVkIHNob3J0IHR4X3N0YXR1czsKKworCQkvKiBSZWFkIHRoZSBmaXJzdCB0cmFuc21pdCBidWZmZXIgKi8KKwkJb2JyYW1fcmVhZChpb2FkZHIsIGFjb2ZmKGxwLT50eF9maXJzdF9pbl91c2UsIGFjX3N0YXR1cyksCisJCQkgICAodW5zaWduZWQgY2hhciAqKSAmdHhfc3RhdHVzLAorCQkJICAgc2l6ZW9mKHR4X3N0YXR1cykpOworCisJCS8qIElmIG5vdCBjb21wbGV0ZWQgLT4gZXhpdCAqLworCQlpZiAoKHR4X3N0YXR1cyAmIEFDX1NGTERfQykgPT0gMCkKKwkJCWJyZWFrOworCisJCS8qIEhhY2sgZm9yIHJlY29uZmlndXJhdGlvbiAqLworCQlpZiAodHhfc3RhdHVzID09IDB4RkZGRikKKwkJCWlmICghd3ZfY29uZmlnX2NvbXBsZXRlKGRldiwgaW9hZGRyLCBscCkpCisJCQkJYnJlYWs7CS8qIE5vdCBjb21wbGV0ZWQgKi8KKworCQkvKiBXZSBub3cgcmVtb3ZlIHRoaXMgYnVmZmVyICovCisJCW5yZWFwZWQrKzsKKwkJLS1scC0+dHhfbl9pbl91c2U7CisKKy8qCitpZiAobHAtPnR4X25faW5fdXNlID4gMCkKKwlwcmludGsoIiVjIiwgIjAxMjM0NTY3ODlhYmNkZWZnaGlqayJbbHAtPnR4X25faW5fdXNlXSk7CisqLworCisJCS8qIFdhcyBpdCB0aGUgbGFzdCBvbmU/ICovCisJCWlmIChscC0+dHhfbl9pbl91c2UgPD0gMCkKKwkJCWxwLT50eF9maXJzdF9pbl91c2UgPSBJODI1ODZOVUxMOworCQllbHNlIHsKKwkJCS8qIE5leHQgb25lIGluIHRoZSBjaGFpbiAqLworCQkJbHAtPnR4X2ZpcnN0X2luX3VzZSArPSBUWEJMT0NLWjsKKwkJCWlmIChscC0+dHhfZmlyc3RfaW5fdXNlID49CisJCQkgICAgT0ZGU0VUX0NVICsKKwkJCSAgICBOVFhCTE9DS1MgKiBUWEJMT0NLWikgbHAtPnR4X2ZpcnN0X2luX3VzZSAtPQorCQkJCSAgICBOVFhCTE9DS1MgKiBUWEJMT0NLWjsKKwkJfQorCisJCS8qIEhhY2sgZm9yIHJlY29uZmlndXJhdGlvbiAqLworCQlpZiAodHhfc3RhdHVzID09IDB4RkZGRikKKwkJCWNvbnRpbnVlOworCisJCS8qIE5vdywgY2hlY2sgc3RhdHVzIG9mIHRoZSBmaW5pc2hlZCBjb21tYW5kICovCisJCWlmICh0eF9zdGF0dXMgJiBBQ19TRkxEX09LKSB7CisJCQlpbnQgbmNvbGxpc2lvbnM7CisKKwkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQluY29sbGlzaW9ucyA9IHR4X3N0YXR1cyAmIEFDX1NGTERfTUFYQ09MOworCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gbmNvbGxpc2lvbnM7CisjaWZkZWYgREVCVUdfVFhfSU5GTworCQkJaWYgKG5jb2xsaXNpb25zID4gMCkKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiJXM6IHd2X2NvbXBsZXRlKCk6IHR4IGNvbXBsZXRlZCBhZnRlciAlZCBjb2xsaXNpb25zLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBuY29sbGlzaW9ucyk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmICh0eF9zdGF0dXMgJiBBQ19TRkxEX1MxMCkgeworCQkJCWxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworI2lmZGVmIERFQlVHX1RYX0ZBSUwKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiJXM6IHd2X2NvbXBsZXRlKCk6IHR4IGVycm9yOiBubyBDUy5cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJCX0KKwkJCWlmICh0eF9zdGF0dXMgJiBBQ19TRkxEX1M5KSB7CisJCQkJbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfVFhfRkFJTAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogd3ZfY29tcGxldGUoKTogdHggZXJyb3I6IGxvc3QgQ1RTLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkJfQorCQkJaWYgKHR4X3N0YXR1cyAmIEFDX1NGTERfUzgpIHsKKwkJCQlscC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKyNpZmRlZiBERUJVR19UWF9GQUlMCisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkgICAgICAgIiVzOiB3dl9jb21wbGV0ZSgpOiB0eCBlcnJvcjogc2xvdyBETUEuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQl9CisJCQlpZiAodHhfc3RhdHVzICYgQUNfU0ZMRF9TNikgeworCQkJCWxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfVFhfRkFJTAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogd3ZfY29tcGxldGUoKTogdHggZXJyb3I6IGhlYXJ0IGJlYXQuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQl9CisJCQlpZiAodHhfc3RhdHVzICYgQUNfU0ZMRF9TNSkgeworCQkJCWxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworI2lmZGVmIERFQlVHX1RYX0ZBSUwKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiJXM6IHd2X2NvbXBsZXRlKCk6IHR4IGVycm9yOiB0b28gbWFueSBjb2xsaXNpb25zLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkJfQorCQl9CisKKyNpZmRlZiBERUJVR19UWF9JTkZPCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6IHd2X2NvbXBsZXRlKCk6IHR4IGNvbXBsZXRlZCwgdHhfc3RhdHVzIDB4JTA0eFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgdHhfc3RhdHVzKTsKKyNlbmRpZgorCX0KKworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9JTkZPCisJaWYgKG5yZWFwZWQgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHd2X2NvbXBsZXRlKCk6IHJlYXBlZCAlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbnJlYXBlZCk7CisjZW5kaWYKKworCS8qCisJICogSW5mb3JtIHVwcGVyIGxheWVycy4KKwkgKi8KKwlpZiAobHAtPnR4X25faW5fdXNlIDwgTlRYQkxPQ0tTIC0gMSkgeworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl9jb21wbGV0ZSgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJcmV0dXJuIG5yZWFwZWQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSZWNvbmZpZ3VyZSB0aGUgaTgyNTg2LCBvciBhdCBsZWFzdCBhc2sgZm9yIGl0LgorICogQmVjYXVzZSB3dl84MjU4Nl9jb25maWcgdXNlcyBhIHRyYW5zbWlzc2lvbiBidWZmZXIsIHdlIG11c3QgZG8gaXQKKyAqIHdoZW4gd2UgYXJlIHN1cmUgdGhhdCB0aGVyZSBpcyBvbmUgbGVmdCwgc28gd2UgZG8gaXQgbm93CisgKiBvciBpbiB3YXZlbGFuX3BhY2tldF94bWl0KCkgKEkgY2FuJ3QgZmluZCBhbnkgYmV0dGVyIHBsYWNlLAorICogd2F2ZWxhbl9pbnRlcnJ1cHQgaXMgbm90IGFuIG9wdGlvbiksIHNvIHlvdSBtYXkgZXhwZXJpZW5jZQorICogZGVsYXlzIHNvbWV0aW1lcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHd2XzgyNTg2X3JlY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogQXJtIHRoZSBmbGFnLCB3aWxsIGJlIGNsZWFyZCBpbiB3dl84MjU4Nl9jb25maWcoKSAqLworCWxwLT5yZWNvbmZpZ184MjU4NiA9IDE7CisKKwkvKiBDaGVjayBpZiB3ZSBjYW4gZG8gaXQgbm93ICEgKi8KKwlpZigobmV0aWZfcnVubmluZyhkZXYpKSAmJiAhKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQkvKiBNYXkgZmFpbCAqLworCQl3dl84MjU4Nl9jb25maWcoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJfQorCWVsc2UgeworI2lmZGVmIERFQlVHX0NPTkZJR19JTkZPCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6IHd2XzgyNTg2X3JlY29uZmlnKCk6IGRlbGF5ZWQgKHN0YXRlID0gJWxYKVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGRldi0+c3RhdGUpOworI2VuZGlmCisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqIERFQlVHICYgSU5GTyBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgaW4gdGhlIGNvZGUgdG8gc2hvdyBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nLgorICogTW9zdCBvZiB0aGUgdGltZSwgaXQgZHVtcHMgdGhlIGNvbnRlbnRzIG9mIGhhcmR3YXJlIHN0cnVjdHVyZXMuCisgKi8KKworI2lmZGVmIERFQlVHX1BTQV9TSE9XCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJpbnQgdGhlIGZvcm1hdHRlZCBjb250ZW50cyBvZiB0aGUgUGFyYW1ldGVyIFN0b3JhZ2UgQXJlYS4KKyAqLworc3RhdGljIHZvaWQgd3ZfcHNhX3Nob3cocHNhX3QgKiBwKQoreworCXByaW50ayhLRVJOX0RFQlVHICIjIyMjIyBXYXZlTEFOIFBTQSBjb250ZW50czogIyMjIyNcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJwc2FfaW9fYmFzZV9hZGRyXzE6IDB4JTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkgICAgICAgcC0+cHNhX2lvX2Jhc2VfYWRkcl8xLAorCSAgICAgICBwLT5wc2FfaW9fYmFzZV9hZGRyXzIsCisJICAgICAgIHAtPnBzYV9pb19iYXNlX2FkZHJfMywgcC0+cHNhX2lvX2Jhc2VfYWRkcl80KTsKKwlwcmludGsoS0VSTl9ERUJVRyAicHNhX3JlbV9ib290X2FkZHJfMTogMHglMDJYICUwMlggJTAyWFxuIiwKKwkgICAgICAgcC0+cHNhX3JlbV9ib290X2FkZHJfMSwKKwkgICAgICAgcC0+cHNhX3JlbV9ib290X2FkZHJfMiwgcC0+cHNhX3JlbV9ib290X2FkZHJfMyk7CisJcHJpbnRrKEtFUk5fREVCVUcgInBzYV9ob2xpX3BhcmFtczogMHglMDJ4LCAiLCBwLT5wc2FfaG9saV9wYXJhbXMpOworCXByaW50aygicHNhX2ludF9yZXFfbm86ICVkXG4iLCBwLT5wc2FfaW50X3JlcV9ubyk7CisjaWZkZWYgREVCVUdfU0hPV19VTlVTRUQKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAicHNhX3VudXNlZDBbXTogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkgICAgICAgcC0+cHNhX3VudXNlZDBbMF0sIHAtPnBzYV91bnVzZWQwWzFdLCBwLT5wc2FfdW51c2VkMFsyXSwKKwkgICAgICAgcC0+cHNhX3VudXNlZDBbM10sIHAtPnBzYV91bnVzZWQwWzRdLCBwLT5wc2FfdW51c2VkMFs1XSwKKwkgICAgICAgcC0+cHNhX3VudXNlZDBbNl0pOworI2VuZGlmCQkJCS8qIERFQlVHX1NIT1dfVU5VU0VEICovCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgInBzYV91bml2X21hY19hZGRyW106ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgICBwLT5wc2FfdW5pdl9tYWNfYWRkclswXSwgcC0+cHNhX3VuaXZfbWFjX2FkZHJbMV0sCisJICAgICAgIHAtPnBzYV91bml2X21hY19hZGRyWzJdLCBwLT5wc2FfdW5pdl9tYWNfYWRkclszXSwKKwkgICAgICAgcC0+cHNhX3VuaXZfbWFjX2FkZHJbNF0sIHAtPnBzYV91bml2X21hY19hZGRyWzVdKTsKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAicHNhX2xvY2FsX21hY19hZGRyW106ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgICBwLT5wc2FfbG9jYWxfbWFjX2FkZHJbMF0sIHAtPnBzYV9sb2NhbF9tYWNfYWRkclsxXSwKKwkgICAgICAgcC0+cHNhX2xvY2FsX21hY19hZGRyWzJdLCBwLT5wc2FfbG9jYWxfbWFjX2FkZHJbM10sCisJICAgICAgIHAtPnBzYV9sb2NhbF9tYWNfYWRkcls0XSwgcC0+cHNhX2xvY2FsX21hY19hZGRyWzVdKTsKKwlwcmludGsoS0VSTl9ERUJVRyAicHNhX3VuaXZfbG9jYWxfc2VsOiAlZCwgIiwKKwkgICAgICAgcC0+cHNhX3VuaXZfbG9jYWxfc2VsKTsKKwlwcmludGsoInBzYV9jb21wX251bWJlcjogJWQsICIsIHAtPnBzYV9jb21wX251bWJlcik7CisJcHJpbnRrKCJwc2FfdGhyX3ByZV9zZXQ6IDB4JTAyeFxuIiwgcC0+cHNhX3Rocl9wcmVfc2V0KTsKKwlwcmludGsoS0VSTl9ERUJVRyAicHNhX2ZlYXR1cmVfc2VsZWN0L2RlY2F5X3BybTogMHglMDJ4LCAiLAorCSAgICAgICBwLT5wc2FfZmVhdHVyZV9zZWxlY3QpOworCXByaW50aygicHNhX3N1YmJhbmQvZGVjYXlfdXBkYXRlX3BybTogJWRcbiIsIHAtPnBzYV9zdWJiYW5kKTsKKwlwcmludGsoS0VSTl9ERUJVRyAicHNhX3F1YWxpdHlfdGhyOiAweCUwMngsICIsIHAtPnBzYV9xdWFsaXR5X3Rocik7CisJcHJpbnRrKCJwc2FfbW9kX2RlbGF5OiAweCUwMnhcbiIsIHAtPnBzYV9tb2RfZGVsYXkpOworCXByaW50ayhLRVJOX0RFQlVHICJwc2FfbndpZDogMHglMDJ4JTAyeCwgIiwgcC0+cHNhX253aWRbMF0sCisJICAgICAgIHAtPnBzYV9ud2lkWzFdKTsKKwlwcmludGsoInBzYV9ud2lkX3NlbGVjdDogJWRcbiIsIHAtPnBzYV9ud2lkX3NlbGVjdCk7CisJcHJpbnRrKEtFUk5fREVCVUcgInBzYV9lbmNyeXB0aW9uX3NlbGVjdDogJWQsICIsCisJICAgICAgIHAtPnBzYV9lbmNyeXB0aW9uX3NlbGVjdCk7CisJcHJpbnRrCisJICAgICgicHNhX2VuY3J5cHRpb25fa2V5W106ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgIHAtPnBzYV9lbmNyeXB0aW9uX2tleVswXSwgcC0+cHNhX2VuY3J5cHRpb25fa2V5WzFdLAorCSAgICAgcC0+cHNhX2VuY3J5cHRpb25fa2V5WzJdLCBwLT5wc2FfZW5jcnlwdGlvbl9rZXlbM10sCisJICAgICBwLT5wc2FfZW5jcnlwdGlvbl9rZXlbNF0sIHAtPnBzYV9lbmNyeXB0aW9uX2tleVs1XSwKKwkgICAgIHAtPnBzYV9lbmNyeXB0aW9uX2tleVs2XSwgcC0+cHNhX2VuY3J5cHRpb25fa2V5WzddKTsKKwlwcmludGsoS0VSTl9ERUJVRyAicHNhX2RhdGFidXNfd2lkdGg6ICVkXG4iLCBwLT5wc2FfZGF0YWJ1c193aWR0aCk7CisJcHJpbnRrKEtFUk5fREVCVUcgInBzYV9jYWxsX2NvZGUvYXV0b19zcXVlbGNoOiAweCUwMngsICIsCisJICAgICAgIHAtPnBzYV9jYWxsX2NvZGVbMF0pOworCXByaW50aworCSAgICAoInBzYV9jYWxsX2NvZGVbXTogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCSAgICAgcC0+cHNhX2NhbGxfY29kZVswXSwgcC0+cHNhX2NhbGxfY29kZVsxXSwgcC0+cHNhX2NhbGxfY29kZVsyXSwKKwkgICAgIHAtPnBzYV9jYWxsX2NvZGVbM10sIHAtPnBzYV9jYWxsX2NvZGVbNF0sIHAtPnBzYV9jYWxsX2NvZGVbNV0sCisJICAgICBwLT5wc2FfY2FsbF9jb2RlWzZdLCBwLT5wc2FfY2FsbF9jb2RlWzddKTsKKyNpZmRlZiBERUJVR19TSE9XX1VOVVNFRAorCXByaW50ayhLRVJOX0RFQlVHICJwc2FfcmVzZXJ2ZWRbXTogJTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkgICAgICAgcC0+cHNhX3Jlc2VydmVkWzBdLAorCSAgICAgICBwLT5wc2FfcmVzZXJ2ZWRbMV0sIHAtPnBzYV9yZXNlcnZlZFsyXSwgcC0+cHNhX3Jlc2VydmVkWzNdKTsKKyNlbmRpZgkJCQkvKiBERUJVR19TSE9XX1VOVVNFRCAqLworCXByaW50ayhLRVJOX0RFQlVHICJwc2FfY29uZl9zdGF0dXM6ICVkLCAiLCBwLT5wc2FfY29uZl9zdGF0dXMpOworCXByaW50aygicHNhX2NyYzogMHglMDJ4JTAyeCwgIiwgcC0+cHNhX2NyY1swXSwgcC0+cHNhX2NyY1sxXSk7CisJcHJpbnRrKCJwc2FfY3JjX3N0YXR1czogMHglMDJ4XG4iLCBwLT5wc2FfY3JjX3N0YXR1cyk7Cit9CQkJCS8qIHd2X3BzYV9zaG93ICovCisjZW5kaWYJCQkJLyogREVCVUdfUFNBX1NIT1cgKi8KKworI2lmZGVmIERFQlVHX01NQ19TSE9XCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJpbnQgdGhlIGZvcm1hdHRlZCBzdGF0dXMgb2YgdGhlIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlci4KKyAqIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgY29tcGxldGVkLgorICovCitzdGF0aWMgdm9pZCB3dl9tbWNfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwltbXJfdCBtOworCisJLyogQmFzaWMgY2hlY2sgKi8KKwlpZiAoaGFzcl9yZWFkKGlvYWRkcikgJiBIQVNSX05PX0NMSykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IHd2X21tY19zaG93OiBtb2RlbSBub3QgY29ubmVjdGVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFJlYWQgdGhlIG1tYyAqLworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZyZWV6ZSksIDEpOworCW1tY19yZWFkKGlvYWRkciwgMCwgKHU4ICopICYgbSwgc2l6ZW9mKG0pKTsKKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mcmVlemUpLCAwKTsKKworI2lmZGVmIFdJUkVMRVNTX0VYVAkJLyogaWYgd2lyZWxlc3MgZXh0ZW5zaW9uIGV4aXN0cyBpbiB0aGUga2VybmVsICovCisJLyogRG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSBzdGF0aXN0aWNzICovCisJbHAtPndzdGF0cy5kaXNjYXJkLm53aWQgKz0KKwkgICAgKG0ubW1yX3dyb25nX253aWRfaCA8PCA4KSB8IG0ubW1yX3dyb25nX253aWRfbDsKKyNlbmRpZgkJCQkvKiBXSVJFTEVTU19FWFQgKi8KKworCXByaW50ayhLRVJOX0RFQlVHICIjIyMjIyBXYXZlTEFOIG1vZGVtIHN0YXR1cyByZWdpc3RlcnM6ICMjIyMjXG4iKTsKKyNpZmRlZiBERUJVR19TSE9XX1VOVVNFRAorCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICJtbWNfdW51c2VkMFtdOiAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJICAgICAgIG0ubW1yX3VudXNlZDBbMF0sIG0ubW1yX3VudXNlZDBbMV0sIG0ubW1yX3VudXNlZDBbMl0sCisJICAgICAgIG0ubW1yX3VudXNlZDBbM10sIG0ubW1yX3VudXNlZDBbNF0sIG0ubW1yX3VudXNlZDBbNV0sCisJICAgICAgIG0ubW1yX3VudXNlZDBbNl0sIG0ubW1yX3VudXNlZDBbN10pOworI2VuZGlmCQkJCS8qIERFQlVHX1NIT1dfVU5VU0VEICovCisJcHJpbnRrKEtFUk5fREVCVUcgIkVuY3J5cHRpb24gYWxnb3JpdGhtOiAlMDJYIC0gU3RhdHVzOiAlMDJYXG4iLAorCSAgICAgICBtLm1tcl9kZXNfYXZhaWwsIG0ubW1yX2Rlc19zdGF0dXMpOworI2lmZGVmIERFQlVHX1NIT1dfVU5VU0VECisJcHJpbnRrKEtFUk5fREVCVUcgIm1tY191bnVzZWQxW106ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkgICAgICAgbS5tbXJfdW51c2VkMVswXSwKKwkgICAgICAgbS5tbXJfdW51c2VkMVsxXSwKKwkgICAgICAgbS5tbXJfdW51c2VkMVsyXSwgbS5tbXJfdW51c2VkMVszXSwgbS5tbXJfdW51c2VkMVs0XSk7CisjZW5kaWYJCQkJLyogREVCVUdfU0hPV19VTlVTRUQgKi8KKwlwcmludGsoS0VSTl9ERUJVRyAiZGNlX3N0YXR1czogMHgleCBbJXMlcyVzJXNdXG4iLAorCSAgICAgICBtLm1tcl9kY2Vfc3RhdHVzLAorCSAgICAgICAobS4KKwkJbW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVU19SWF9CVVNZKSA/CisJICAgICAgICJlbmVyZ3kgZGV0ZWN0ZWQsIiA6ICIiLAorCSAgICAgICAobS4KKwkJbW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVU19MT09QVF9JTkQpID8KKwkgICAgICAgImxvb3AgdGVzdCBpbmRpY2F0ZWQsIiA6ICIiLAorCSAgICAgICAobS4KKwkJbW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVU19UWF9CVVNZKSA/CisJICAgICAgICJ0cmFuc21pdHRlciBvbiwiIDogIiIsCisJICAgICAgIChtLgorCQltbXJfZGNlX3N0YXR1cyAmIE1NUl9EQ0VfU1RBVFVTX0pCUl9FWFBJUkVEKSA/CisJICAgICAgICJqYWJiZXIgdGltZXIgZXhwaXJlZCwiIDogIiIpOworCXByaW50ayhLRVJOX0RFQlVHICJEc3AgSUQ6ICUwMlhcbiIsIG0ubW1yX2RzcF9pZCk7CisjaWZkZWYgREVCVUdfU0hPV19VTlVTRUQKKwlwcmludGsoS0VSTl9ERUJVRyAibW1jX3VudXNlZDJbXTogJTAyWDolMDJYXG4iLAorCSAgICAgICBtLm1tcl91bnVzZWQyWzBdLCBtLm1tcl91bnVzZWQyWzFdKTsKKyNlbmRpZgkJCQkvKiBERUJVR19TSE9XX1VOVVNFRCAqLworCXByaW50ayhLRVJOX0RFQlVHICIjIGNvcnJlY3RfbndpZDogJWQsICMgd3JvbmdfbndpZDogJWRcbiIsCisJICAgICAgIChtLm1tcl9jb3JyZWN0X253aWRfaCA8PCA4KSB8IG0ubW1yX2NvcnJlY3RfbndpZF9sLAorCSAgICAgICAobS5tbXJfd3JvbmdfbndpZF9oIDw8IDgpIHwgbS5tbXJfd3JvbmdfbndpZF9sKTsKKwlwcmludGsoS0VSTl9ERUJVRyAidGhyX3ByZV9zZXQ6IDB4JXggW2N1cnJlbnQgc2lnbmFsICVzXVxuIiwKKwkgICAgICAgbS5tbXJfdGhyX3ByZV9zZXQgJiBNTVJfVEhSX1BSRV9TRVQsCisJICAgICAgIChtLgorCQltbXJfdGhyX3ByZV9zZXQgJiBNTVJfVEhSX1BSRV9TRVRfQ1VSKSA/ICJhYm92ZSIgOgorCSAgICAgICAiYmVsb3ciKTsKKwlwcmludGsoS0VSTl9ERUJVRyAic2lnbmFsX2x2bDogJWQgWyVzXSwgIiwKKwkgICAgICAgbS5tbXJfc2lnbmFsX2x2bCAmIE1NUl9TSUdOQUxfTFZMLAorCSAgICAgICAobS4KKwkJbW1yX3NpZ25hbF9sdmwgJiBNTVJfU0lHTkFMX0xWTF9WQUxJRCkgPyAibmV3IG1zZyIgOgorCSAgICAgICAibm8gbmV3IG1zZyIpOworCXByaW50aygic2lsZW5jZV9sdmw6ICVkIFslc10sICIsCisJICAgICAgIG0ubW1yX3NpbGVuY2VfbHZsICYgTU1SX1NJTEVOQ0VfTFZMLAorCSAgICAgICAobS4KKwkJbW1yX3NpbGVuY2VfbHZsICYgTU1SX1NJTEVOQ0VfTFZMX1ZBTElEKSA/ICJ1cGRhdGUgZG9uZSIgOgorCSAgICAgICAibm8gbmV3IHVwZGF0ZSIpOworCXByaW50aygic2dubF9xdWFsOiAweCV4IFslc11cbiIsIG0ubW1yX3NnbmxfcXVhbCAmIE1NUl9TR05MX1FVQUwsCisJICAgICAgIChtLgorCQltbXJfc2dubF9xdWFsICYgTU1SX1NHTkxfUVVBTF9BTlQpID8gIkFudGVubmEgMSIgOgorCSAgICAgICAiQW50ZW5uYSAwIik7CisjaWZkZWYgREVCVUdfU0hPV19VTlVTRUQKKwlwcmludGsoS0VSTl9ERUJVRyAibmV0d19pZF9sOiAleFxuIiwgbS5tbXJfbmV0d19pZF9sKTsKKyNlbmRpZgkJCQkvKiBERUJVR19TSE9XX1VOVVNFRCAqLworfQkJCQkvKiB3dl9tbWNfc2hvdyAqLworI2VuZGlmCQkJCS8qIERFQlVHX01NQ19TSE9XICovCisKKyNpZmRlZiBERUJVR19JODI1ODZfU0hPVworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHRoZSBsYXN0IGJsb2NrIG9mIHRoZSBpODI1ODYgbWVtb3J5LgorICovCitzdGF0aWMgdm9pZCB3dl9zY2Jfc2hvdyh1bnNpZ25lZCBsb25nIGlvYWRkcikKK3sKKwlzY2JfdCBzY2I7CisKKwlvYnJhbV9yZWFkKGlvYWRkciwgT0ZGU0VUX1NDQiwgKHVuc2lnbmVkIGNoYXIgKikgJnNjYiwKKwkJICAgc2l6ZW9mKHNjYikpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiMjIyMjIFdhdmVMQU4gc3lzdGVtIGNvbnRyb2wgYmxvY2s6ICMjIyMjXG4iKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJzdGF0dXM6ICIpOworCXByaW50aygic3RhdCAweCV4WyVzJXMlcyVzXSAiLAorCSAgICAgICAoc2NiLgorCQlzY2Jfc3RhdHVzICYgKFNDQl9TVF9DWCB8IFNDQl9TVF9GUiB8IFNDQl9TVF9DTkEgfAorCQkJICAgICAgU0NCX1NUX1JOUikpID4+IDEyLAorCSAgICAgICAoc2NiLgorCQlzY2Jfc3RhdHVzICYgU0NCX1NUX0NYKSA/ICJjb21tYW5kIGNvbXBsZXRpb24gaW50ZXJydXB0LCIgOgorCSAgICAgICAiIiwgKHNjYi5zY2Jfc3RhdHVzICYgU0NCX1NUX0ZSKSA/ICJmcmFtZSByZWNlaXZlZCwiIDogIiIsCisJICAgICAgIChzY2IuCisJCXNjYl9zdGF0dXMgJiBTQ0JfU1RfQ05BKSA/ICJjb21tYW5kIHVuaXQgbm90IGFjdGl2ZSwiIDogIiIsCisJICAgICAgIChzY2IuCisJCXNjYl9zdGF0dXMgJiBTQ0JfU1RfUk5SKSA/ICJyZWNlaXZpbmcgdW5pdCBub3QgcmVhZHksIiA6CisJICAgICAgICIiKTsKKwlwcmludGsoImN1cyAweCV4WyVzJXMlc10gIiwgKHNjYi5zY2Jfc3RhdHVzICYgU0NCX1NUX0NVUykgPj4gOCwKKwkgICAgICAgKChzY2Iuc2NiX3N0YXR1cyAmIFNDQl9TVF9DVVMpID09CisJCVNDQl9TVF9DVVNfSURMRSkgPyAiaWRsZSIgOiAiIiwKKwkgICAgICAgKChzY2Iuc2NiX3N0YXR1cyAmIFNDQl9TVF9DVVMpID09CisJCVNDQl9TVF9DVVNfU1VTUCkgPyAic3VzcGVuZGVkIiA6ICIiLAorCSAgICAgICAoKHNjYi5zY2Jfc3RhdHVzICYgU0NCX1NUX0NVUykgPT0KKwkJU0NCX1NUX0NVU19BQ1RWKSA/ICJhY3RpdmUiIDogIiIpOworCXByaW50aygicnVzIDB4JXhbJXMlcyVzJXNdXG4iLCAoc2NiLnNjYl9zdGF0dXMgJiBTQ0JfU1RfUlVTKSA+PiA0LAorCSAgICAgICAoKHNjYi5zY2Jfc3RhdHVzICYgU0NCX1NUX1JVUykgPT0KKwkJU0NCX1NUX1JVU19JRExFKSA/ICJpZGxlIiA6ICIiLAorCSAgICAgICAoKHNjYi5zY2Jfc3RhdHVzICYgU0NCX1NUX1JVUykgPT0KKwkJU0NCX1NUX1JVU19TVVNQKSA/ICJzdXNwZW5kZWQiIDogIiIsCisJICAgICAgICgoc2NiLnNjYl9zdGF0dXMgJiBTQ0JfU1RfUlVTKSA9PQorCQlTQ0JfU1RfUlVTX05SRVMpID8gIm5vIHJlc291cmNlcyIgOiAiIiwKKwkgICAgICAgKChzY2Iuc2NiX3N0YXR1cyAmIFNDQl9TVF9SVVMpID09CisJCVNDQl9TVF9SVVNfUkRZKSA/ICJyZWFkeSIgOiAiIik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiY29tbWFuZDogIik7CisJcHJpbnRrKCJhY2sgMHgleFslcyVzJXMlc10gIiwKKwkgICAgICAgKHNjYi4KKwkJc2NiX2NvbW1hbmQgJiAoU0NCX0NNRF9BQ0tfQ1ggfCBTQ0JfQ01EX0FDS19GUiB8CisJCQkgICAgICAgU0NCX0NNRF9BQ0tfQ05BIHwgU0NCX0NNRF9BQ0tfUk5SKSkgPj4gMTIsCisJICAgICAgIChzY2IuCisJCXNjYl9jb21tYW5kICYgU0NCX0NNRF9BQ0tfQ1gpID8gImFjayBjbWQgY29tcGxldGlvbiwiIDogIiIsCisJICAgICAgIChzY2IuCisJCXNjYl9jb21tYW5kICYgU0NCX0NNRF9BQ0tfRlIpID8gImFjayBmcmFtZSByZWNlaXZlZCwiIDogIiIsCisJICAgICAgIChzY2IuCisJCXNjYl9jb21tYW5kICYgU0NCX0NNRF9BQ0tfQ05BKSA/ICJhY2sgQ1Ugbm90IGFjdGl2ZSwiIDogIiIsCisJICAgICAgIChzY2IuCisJCXNjYl9jb21tYW5kICYgU0NCX0NNRF9BQ0tfUk5SKSA/ICJhY2sgUlUgbm90IHJlYWR5LCIgOiAiIik7CisJcHJpbnRrKCJjdWMgMHgleFslcyVzJXMlcyVzXSAiLAorCSAgICAgICAoc2NiLnNjYl9jb21tYW5kICYgU0NCX0NNRF9DVUMpID4+IDgsCisJICAgICAgICgoc2NiLnNjYl9jb21tYW5kICYgU0NCX0NNRF9DVUMpID09CisJCVNDQl9DTURfQ1VDX05PUCkgPyAibm9wIiA6ICIiLAorCSAgICAgICAoKHNjYi5zY2JfY29tbWFuZCAmIFNDQl9DTURfQ1VDKSA9PQorCQlTQ0JfQ01EX0NVQ19HTykgPyAic3RhcnQgY2JsX29mZnNldCIgOiAiIiwKKwkgICAgICAgKChzY2Iuc2NiX2NvbW1hbmQgJiBTQ0JfQ01EX0NVQykgPT0KKwkJU0NCX0NNRF9DVUNfUkVTKSA/ICJyZXN1bWUgZXhlY3V0aW9uIiA6ICIiLAorCSAgICAgICAoKHNjYi5zY2JfY29tbWFuZCAmIFNDQl9DTURfQ1VDKSA9PQorCQlTQ0JfQ01EX0NVQ19TVVMpID8gInN1c3BlbmQgZXhlY3V0aW9uIiA6ICIiLAorCSAgICAgICAoKHNjYi5zY2JfY29tbWFuZCAmIFNDQl9DTURfQ1VDKSA9PQorCQlTQ0JfQ01EX0NVQ19BQlQpID8gImFib3J0IGV4ZWN1dGlvbiIgOiAiIik7CisJcHJpbnRrKCJydWMgMHgleFslcyVzJXMlcyVzXVxuIiwKKwkgICAgICAgKHNjYi5zY2JfY29tbWFuZCAmIFNDQl9DTURfUlVDKSA+PiA0LAorCSAgICAgICAoKHNjYi5zY2JfY29tbWFuZCAmIFNDQl9DTURfUlVDKSA9PQorCQlTQ0JfQ01EX1JVQ19OT1ApID8gIm5vcCIgOiAiIiwKKwkgICAgICAgKChzY2Iuc2NiX2NvbW1hbmQgJiBTQ0JfQ01EX1JVQykgPT0KKwkJU0NCX0NNRF9SVUNfR08pID8gInN0YXJ0IHJmYV9vZmZzZXQiIDogIiIsCisJICAgICAgICgoc2NiLnNjYl9jb21tYW5kICYgU0NCX0NNRF9SVUMpID09CisJCVNDQl9DTURfUlVDX1JFUykgPyAicmVzdW1lIHJlY2VwdGlvbiIgOiAiIiwKKwkgICAgICAgKChzY2Iuc2NiX2NvbW1hbmQgJiBTQ0JfQ01EX1JVQykgPT0KKwkJU0NCX0NNRF9SVUNfU1VTKSA/ICJzdXNwZW5kIHJlY2VwdGlvbiIgOiAiIiwKKwkgICAgICAgKChzY2Iuc2NiX2NvbW1hbmQgJiBTQ0JfQ01EX1JVQykgPT0KKwkJU0NCX0NNRF9SVUNfQUJUKSA/ICJhYm9ydCByZWNlcHRpb24iIDogIiIpOworCisJcHJpbnRrKEtFUk5fREVCVUcgImNibF9vZmZzZXQgMHgleCAiLCBzY2Iuc2NiX2NibF9vZmZzZXQpOworCXByaW50aygicmZhX29mZnNldCAweCV4XG4iLCBzY2Iuc2NiX3JmYV9vZmZzZXQpOworCisJcHJpbnRrKEtFUk5fREVCVUcgImNyY2VycnMgJWQgIiwgc2NiLnNjYl9jcmNlcnJzKTsKKwlwcmludGsoImFsbmVycnMgJWQgIiwgc2NiLnNjYl9hbG5lcnJzKTsKKwlwcmludGsoInJzY2VycnMgJWQgIiwgc2NiLnNjYl9yc2NlcnJzKTsKKwlwcmludGsoIm92cm5lcnJzICVkXG4iLCBzY2Iuc2NiX292cm5lcnJzKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHRoZSBmb3JtYXR0ZWQgc3RhdHVzIG9mIHRoZSBpODI1ODYncyByZWNlaXZlIHVuaXQuCisgKi8KK3N0YXRpYyB2b2lkIHd2X3J1X3Nob3coc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJLyogbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OyAqLworCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgIiMjIyMjIFdhdmVMQU4gaTgyNTg2IHJlY2VpdmVyIHVuaXQgc3RhdHVzOiAjIyMjI1xuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgInJ1OiIpOworCS8qCisJICogTm90IGltcGxlbWVudGVkIHlldAorCSAqLworCXByaW50aygiXG4iKTsKK30JCQkJLyogd3ZfcnVfc2hvdyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRGlzcGxheSBpbmZvIGFib3V0IG9uZSBjb250cm9sIGJsb2NrIG9mIHRoZSBpODI1ODYgbWVtb3J5LgorICovCitzdGF0aWMgdm9pZCB3dl9jdV9zaG93X29uZShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgbmV0X2xvY2FsICogbHAsIGludCBpLCB1MTYgcCkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkcjsKKwlhY190eF90IGFjdHg7CisKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCXByaW50aygiJWQ6IDB4JXg6IiwgaSwgcCk7CisKKwlvYnJhbV9yZWFkKGlvYWRkciwgcCwgKHVuc2lnbmVkIGNoYXIgKikgJmFjdHgsIHNpemVvZihhY3R4KSk7CisJcHJpbnRrKCIgc3RhdHVzPTB4JXgsIiwgYWN0eC50eF9oLmFjX3N0YXR1cyk7CisJcHJpbnRrKCIgY29tbWFuZD0weCV4LCIsIGFjdHgudHhfaC5hY19jb21tYW5kKTsKKworCS8qCisJICAgeworCSAgIHRiZF90ICAgICAgdGJkOworCisJICAgb2JyYW1fcmVhZChpb2FkZHIsIGFjdHgudHhfdGJkX29mZnNldCwgKHVuc2lnbmVkIGNoYXIgKikmdGJkLCBzaXplb2YodGJkKSk7CisJICAgcHJpbnRrKCIgdGJkX3N0YXR1cz0weCV4LCIsIHRiZC50YmRfc3RhdHVzKTsKKwkgICB9CisJICovCisKKwlwcmludGsoInwiKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHN0YXR1cyBvZiB0aGUgY29tbWFuZCB1bml0IG9mIHRoZSBpODI1ODYuCisgKi8KK3N0YXRpYyB2b2lkIHd2X2N1X3Nob3coc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGludCBpOworCXUxNiBwOworCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgIiMjIyMjIFdhdmVMQU4gaTgyNTg2IGNvbW1hbmQgdW5pdCBzdGF0dXM6ICMjIyMjXG4iKTsKKworCXByaW50ayhLRVJOX0RFQlVHKTsKKwlmb3IgKGkgPSAwLCBwID0gbHAtPnR4X2ZpcnN0X2luX3VzZTsgaSA8IE5UWEJMT0NLUzsgaSsrKSB7CisJCXd2X2N1X3Nob3dfb25lKGRldiwgbHAsIGksIHApOworCisJCXAgKz0gVFhCTE9DS1o7CisJCWlmIChwID49IE9GRlNFVF9DVSArIE5UWEJMT0NLUyAqIFRYQkxPQ0taKQorCQkJcCAtPSBOVFhCTE9DS1MgKiBUWEJMT0NLWjsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorI2VuZGlmCQkJCS8qIERFQlVHX0k4MjU4Nl9TSE9XICovCisKKyNpZmRlZiBERUJVR19ERVZJQ0VfU0hPVworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHRoZSBmb3JtYXR0ZWQgc3RhdHVzIG9mIHRoZSBXYXZlTEFOIFBDTUNJQSBkZXZpY2UgZHJpdmVyLgorICovCitzdGF0aWMgdm9pZCB3dl9kZXZfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiZGV2OiIpOworCXByaW50aygiIHN0YXRlPSVsWCwiLCBkZXYtPnN0YXRlKTsKKwlwcmludGsoIiB0cmFuc19zdGFydD0lbGQsIiwgZGV2LT50cmFuc19zdGFydCk7CisJcHJpbnRrKCIgZmxhZ3M9MHgleCwiLCBkZXYtPmZsYWdzKTsKKwlwcmludGsoIlxuIik7Cit9CQkJCS8qIHd2X2Rldl9zaG93ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBQcmludCB0aGUgZm9ybWF0dGVkIHN0YXR1cyBvZiB0aGUgV2F2ZUxBTiBQQ01DSUEgZGV2aWNlIGRyaXZlcidzCisgKiBwcml2YXRlIGluZm9ybWF0aW9uLgorICovCitzdGF0aWMgdm9pZCB3dl9sb2NhbF9zaG93KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHA7CisKKwlscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCisJcHJpbnRrKEtFUk5fREVCVUcgImxvY2FsOiIpOworCXByaW50aygiIHR4X25faW5fdXNlPSVkLCIsIGxwLT50eF9uX2luX3VzZSk7CisJcHJpbnRrKCIgaGFjcj0weCV4LCIsIGxwLT5oYWNyKTsKKwlwcmludGsoIiByeF9oZWFkPTB4JXgsIiwgbHAtPnJ4X2hlYWQpOworCXByaW50aygiIHJ4X2xhc3Q9MHgleCwiLCBscC0+cnhfbGFzdCk7CisJcHJpbnRrKCIgdHhfZmlyc3RfZnJlZT0weCV4LCIsIGxwLT50eF9maXJzdF9mcmVlKTsKKwlwcmludGsoIiB0eF9maXJzdF9pbl91c2U9MHgleCwiLCBscC0+dHhfZmlyc3RfaW5fdXNlKTsKKwlwcmludGsoIlxuIik7Cit9CQkJCS8qIHd2X2xvY2FsX3Nob3cgKi8KKyNlbmRpZgkJCQkvKiBERUJVR19ERVZJQ0VfU0hPVyAqLworCisjaWYgZGVmaW5lZChERUJVR19SWF9JTkZPKSB8fCBkZWZpbmVkKERFQlVHX1RYX0lORk8pCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRHVtcCBwYWNrZXQgaGVhZGVyIChhbmQgY29udGVudCBpZiBuZWNlc3NhcnkpIG9uIHRoZSBzY3JlZW4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHd2X3BhY2tldF9pbmZvKHU4ICogcCwJLyogUGFja2V0IHRvIGR1bXAgKi8KKwkJCQkgIGludCBsZW5ndGgsCS8qIExlbmd0aCBvZiB0aGUgcGFja2V0ICovCisJCQkJICBjaGFyICptc2cxLAkvKiBOYW1lIG9mIHRoZSBkZXZpY2UgKi8KKwkJCQkgIGNoYXIgKm1zZzIpCit7CQkJCS8qIE5hbWUgb2YgdGhlIGZ1bmN0aW9uICovCisJaW50IGk7CisJaW50IG1heGk7CisKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiJXM6ICVzKCk6IGRlc3QgJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgsIGxlbmd0aCAlZFxuIiwKKwkgICAgICAgbXNnMSwgbXNnMiwgcFswXSwgcFsxXSwgcFsyXSwgcFszXSwgcFs0XSwgcFs1XSwgbGVuZ3RoKTsKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiJXM6ICVzKCk6IHNyYyAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCwgdHlwZSAweCUwMlglMDJYXG4iLAorCSAgICAgICBtc2cxLCBtc2cyLCBwWzZdLCBwWzddLCBwWzhdLCBwWzldLCBwWzEwXSwgcFsxMV0sIHBbMTJdLAorCSAgICAgICBwWzEzXSk7CisKKyNpZmRlZiBERUJVR19QQUNLRVRfRFVNUAorCisJcHJpbnRrKEtFUk5fREVCVUcgImRhdGE9XCIiKTsKKworCWlmICgobWF4aSA9IGxlbmd0aCkgPiBERUJVR19QQUNLRVRfRFVNUCkKKwkJbWF4aSA9IERFQlVHX1BBQ0tFVF9EVU1QOworCWZvciAoaSA9IDE0OyBpIDwgbWF4aTsgaSsrKQorCQlpZiAocFtpXSA+PSAnICcgJiYgcFtpXSA8PSAnficpCisJCQlwcmludGsoIiAlYyIsIHBbaV0pOworCQllbHNlCisJCQlwcmludGsoIiUwMlgiLCBwW2ldKTsKKwlpZiAobWF4aSA8IGxlbmd0aCkKKwkJcHJpbnRrKCIuLiIpOworCXByaW50aygiXCJcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOworI2VuZGlmCQkJCS8qIERFQlVHX1BBQ0tFVF9EVU1QICovCit9CisjZW5kaWYJCQkJLyogZGVmaW5lZChERUJVR19SWF9JTkZPKSB8fCBkZWZpbmVkKERFQlVHX1RYX0lORk8pICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIGlzIHRoZSBpbmZvcm1hdGlvbiB3aGljaCBpcyBkaXNwbGF5ZWQgYnkgdGhlIGRyaXZlciBhdCBzdGFydHVwLgorICogVGhlcmUgYXJlIGxvdHMgb2YgZmxhZ3MgZm9yIGNvbmZpZ3VyaW5nIGl0IHRvIHlvdXIgbGlraW5nLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3ZfaW5pdF9pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwlwc2FfdCBwc2E7CisJaW50IGk7CisKKwkvKiBSZWFkIHRoZSBwYXJhbWV0ZXIgc3RvcmFnZSBhcmVhICovCisJcHNhX3JlYWQoaW9hZGRyLCBscC0+aGFjciwgMCwgKHVuc2lnbmVkIGNoYXIgKikgJnBzYSwgc2l6ZW9mKHBzYSkpOworCisjaWZkZWYgREVCVUdfUFNBX1NIT1cKKwl3dl9wc2Ffc2hvdygmcHNhKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHX01NQ19TSE9XCisJd3ZfbW1jX3Nob3coZGV2KTsKKyNlbmRpZgorI2lmZGVmIERFQlVHX0k4MjU4Nl9TSE9XCisJd3ZfY3Vfc2hvdyhkZXYpOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19CQVNJQ19TSE9XCisJLyogTm93LCBsZXQncyBnbyBmb3IgdGhlIGJhc2ljIHN0dWZmLiAqLworCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFdhdmVMQU4gYXQgJSN4LCIsIGRldi0+bmFtZSwgaW9hZGRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgV0FWRUxBTl9BRERSX1NJWkU7IGkrKykKKwkJcHJpbnRrKCIlcyUwMlgiLCAoaSA9PSAwKSA/ICIgIiA6ICI6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCIsIElSUSAlZCIsIGRldi0+aXJxKTsKKworCS8qIFByaW50IGN1cnJlbnQgbmV0d29yayBJRC4gKi8KKwlpZiAocHNhLnBzYV9ud2lkX3NlbGVjdCkKKwkJcHJpbnRrKCIsIG53aWQgMHglMDJYLSUwMlgiLCBwc2EucHNhX253aWRbMF0sCisJCSAgICAgICBwc2EucHNhX253aWRbMV0pOworCWVsc2UKKwkJcHJpbnRrKCIsIG53aWQgb2ZmIik7CisKKwkvKiBJZiAyLjAwIGNhcmQgKi8KKwlpZiAoIShtbWNfaW4oaW9hZGRyLCBtbXJvZmYoMCwgbW1yX2ZlZV9zdGF0dXMpKSAmCisJICAgICAgKE1NUl9GRUVfU1RBVFVTX0RXTEQgfCBNTVJfRkVFX1NUQVRVU19CVVNZKSkpIHsKKwkJdW5zaWduZWQgc2hvcnQgZnJlcTsKKworCQkvKiBBc2sgdGhlIEVFUFJPTSB0byByZWFkIHRoZSBmcmVxdWVuY3kgZnJvbSB0aGUgZmlyc3QgYXJlYS4gKi8KKwkJZmVlX3JlYWQoaW9hZGRyLCAweDAwLCAmZnJlcSwgMSk7CisKKwkJLyogUHJpbnQgZnJlcXVlbmN5ICovCisJCXByaW50aygiLCAyLjAwLCAlbGQiLCAoZnJlcSA+PiA2KSArIDI0MDBMKTsKKworCQkvKiBIYWNrISAqLworCQlpZiAoZnJlcSAmIDB4MjApCisJCQlwcmludGsoIi41Iik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCIsIFBDIik7CisJCXN3aXRjaCAocHNhLnBzYV9jb21wX251bWJlcikgeworCQljYXNlIFBTQV9DT01QX1BDX0FUXzkxNToKKwkJY2FzZSBQU0FfQ09NUF9QQ19BVF8yNDAwOgorCQkJcHJpbnRrKCItQVQiKTsKKwkJCWJyZWFrOworCQljYXNlIFBTQV9DT01QX1BDX01DXzkxNToKKwkJY2FzZSBQU0FfQ09NUF9QQ19NQ18yNDAwOgorCQkJcHJpbnRrKCItTUMiKTsKKwkJCWJyZWFrOworCQljYXNlIFBTQV9DT01QX1BDTUNJQV85MTU6CisJCQlwcmludGsoIk1DSUEiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCI/Iik7CisJCX0KKwkJcHJpbnRrKCIsICIpOworCQlzd2l0Y2ggKHBzYS5wc2Ffc3ViYmFuZCkgeworCQljYXNlIFBTQV9TVUJCQU5EXzkxNToKKwkJCXByaW50aygiOTE1Iik7CisJCQlicmVhazsKKwkJY2FzZSBQU0FfU1VCQkFORF8yNDI1OgorCQkJcHJpbnRrKCIyNDI1Iik7CisJCQlicmVhazsKKwkJY2FzZSBQU0FfU1VCQkFORF8yNDYwOgorCQkJcHJpbnRrKCIyNDYwIik7CisJCQlicmVhazsKKwkJY2FzZSBQU0FfU1VCQkFORF8yNDg0OgorCQkJcHJpbnRrKCIyNDg0Iik7CisJCQlicmVhazsKKwkJY2FzZSBQU0FfU1VCQkFORF8yNDMwXzU6CisJCQlwcmludGsoIjI0MzAuNSIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoIj8iKTsKKwkJfQorCX0KKworCXByaW50aygiIE1IelxuIik7CisjZW5kaWYJCQkJLyogREVCVUdfQkFTSUNfU0hPVyAqLworCisjaWZkZWYgREVCVUdfVkVSU0lPTl9TSE9XCisJLyogUHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworCXByaW50ayhLRVJOX05PVElDRSAiJXMiLCB2ZXJzaW9uKTsKKyNlbmRpZgorfQkJCQkvKiB3dl9pbml0X2luZm8gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiBJT0NUTCwgU1RBVFMgJiBSRUNPTkZJRyAqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogV2UgZm91bmQgaGVyZSByb3V0aW5lcyB0aGF0IGFyZSBjYWxsZWQgYnkgTGludXggb24gZGlmZmVyZW50CisgKiBvY2Nhc2lvbnMgYWZ0ZXIgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIG5vdCBmb3IgdHJhbnNtaXR0aW5nIGRhdGEKKyAqIFRoZXNlIG1heSBiZSBjYWxsZWQgd2hlbiB0aGUgdXNlciB1c2UgaWZjb25maWcsIC9wcm9jL25ldC9kZXYKKyAqIG9yIHdpcmVsZXNzIGV4dGVuc2lvbnMKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2V0IHRoZSBjdXJyZW50IEV0aGVybmV0IHN0YXRpc3RpY3MuIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZQorICogY2FyZCBvcGVuIG9yIGNsb3NlZC4KKyAqIFVzZWQgd2hlbiB0aGUgdXNlciByZWFkIC9wcm9jL25ldC9kZXYKKyAqLworc3RhdGljIGVuX3N0YXRzICp3YXZlbGFuX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKyNpZmRlZiBERUJVR19JT0NUTF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPD53YXZlbGFuX2dldF9zdGF0cygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlyZXR1cm4gKCYoKG5ldF9sb2NhbCAqKSBkZXYtPnByaXYpLT5zdGF0cyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAqIG51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisgKiBudW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKKyAqIG51bV9hZGRycyA+IDAJTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLAorICoJCQlhbmQgZG8gYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgorICovCitzdGF0aWMgdm9pZCB3YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisKKyNpZmRlZiBERUJVR19JT0NUTF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdCgpXG4iLAorCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19JT0NUTF9JTkZPCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgIiVzOiB3YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdCgpOiBzZXR0aW5nIFJ4IG1vZGUgJTAyWCB0byAlZCBhZGRyZXNzZXMuXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGRldi0+ZmxhZ3MsIGRldi0+bWNfY291bnQpOworI2VuZGlmCisKKwkvKiBBcmUgd2UgYXNraW5nIGZvciBwcm9taXNjdW91cyBtb2RlLAorCSAqIG9yIGFsbCBtdWx0aWNhc3QgYWRkcmVzc2VzICh3ZSBkb24ndCBoYXZlIHRoYXQhKQorCSAqIG9yIHRvbyBtYW55IG11bHRpY2FzdCBhZGRyZXNzZXMgZm9yIHRoZSBoYXJkd2FyZSBmaWx0ZXI/ICovCisJaWYgKChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHx8CisJICAgIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fAorCSAgICAoZGV2LT5tY19jb3VudCA+IEk4MjU4Nl9NQVhfTVVMVElDQVNUX0FERFJFU1NFUykpIHsKKwkJLyoKKwkJICogRW5hYmxlIHByb21pc2N1b3VzIG1vZGU6IHJlY2VpdmUgYWxsIHBhY2tldHMuCisJCSAqLworCQlpZiAoIWxwLT5wcm9taXNjdW91cykgeworCQkJbHAtPnByb21pc2N1b3VzID0gMTsKKwkJCWxwLT5tY19jb3VudCA9IDA7CisKKwkJCXd2XzgyNTg2X3JlY29uZmlnKGRldik7CisKKwkJCS8qIFRlbGwgdGhlIGtlcm5lbCB0aGF0IHdlIGFyZSBkb2luZyBhIHJlYWxseSBiYWQgam9iLiAqLworCQkJZGV2LT5mbGFncyB8PSBJRkZfUFJPTUlTQzsKKwkJfQorCX0gZWxzZQorCQkvKiBBcmUgdGhlcmUgbXVsdGljYXN0IGFkZHJlc3NlcyB0byBzZW5kPyAqLworCWlmIChkZXYtPm1jX2xpc3QgIT0gKHN0cnVjdCBkZXZfbWNfbGlzdCAqKSBOVUxMKSB7CisJCS8qCisJCSAqIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSwgYnV0IHJlY2VpdmUgYWxsIHBhY2tldHMKKwkJICogaW4gbXVsdGljYXN0IGxpc3QKKwkJICovCisjaWZkZWYgTVVMVElDQVNUX0FWT0lECisJCWlmIChscC0+cHJvbWlzY3VvdXMgfHwgKGRldi0+bWNfY291bnQgIT0gbHAtPm1jX2NvdW50KSkKKyNlbmRpZgorCQl7CisJCQlscC0+cHJvbWlzY3VvdXMgPSAwOworCQkJbHAtPm1jX2NvdW50ID0gZGV2LT5tY19jb3VudDsKKworCQkJd3ZfODI1ODZfcmVjb25maWcoZGV2KTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIFN3aXRjaCB0byBub3JtYWwgbW9kZTogZGlzYWJsZSBwcm9taXNjdW91cyBtb2RlIGFuZCAKKwkJICogY2xlYXIgdGhlIG11bHRpY2FzdCBsaXN0LgorCQkgKi8KKwkJaWYgKGxwLT5wcm9taXNjdW91cyB8fCBscC0+bWNfY291bnQgPT0gMCkgeworCQkJbHAtPnByb21pc2N1b3VzID0gMDsKKwkJCWxwLT5tY19jb3VudCA9IDA7CisKKwkJCXd2XzgyNTg2X3JlY29uZmlnKGRldik7CisJCX0KKwl9CisjaWZkZWYgREVCVUdfSU9DVExfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd2F2ZWxhbl9zZXRfbXVsdGljYXN0X2xpc3QoKVxuIiwKKwkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGV4aXN0LgorICogKE5vdGUgOiBpdCB3YXMgYSBuaWNlIHdheSB0byB0ZXN0IHRoZSByZWNvbmZpZ3VyZSBzdHVmZi4uLikKKyAqLworI2lmZGVmIFNFVF9NQUNfQUREUkVTUworc3RhdGljIGludCB3YXZlbGFuX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgdm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKm1hYyA9IGFkZHI7CisKKwkvKiBDb3B5IHRoZSBhZGRyZXNzLiAqLworCW1lbWNweShkZXYtPmRldl9hZGRyLCBtYWMtPnNhX2RhdGEsIFdBVkVMQU5fQUREUl9TSVpFKTsKKworCS8qIFJlY29uZmlndXJlIHRoZSBiZWFzdC4gKi8KKwl3dl84MjU4Nl9yZWNvbmZpZyhkZXYpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYJCQkJLyogU0VUX01BQ19BRERSRVNTICovCisKKyNpZmRlZiBXSVJFTEVTU19FWFQJCS8qIGlmIHdpcmVsZXNzIGV4dGVuc2lvbnMgZXhpc3QgaW4gdGhlIGtlcm5lbCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnJlcXVlbmN5IHNldHRpbmcgKGZvciBoYXJkd2FyZSBjYXBhYmxlIG9mIGl0KQorICogSXQncyBhIGJpdCBjb21wbGljYXRlZCBhbmQgeW91IGRvbid0IHJlYWxseSB3YW50IHRvIGxvb2sgaW50byBpdC4KKyAqIChjYWxsZWQgaW4gd2F2ZWxhbl9pb2N0bCkKKyAqLworc3RhdGljIGlubGluZSBpbnQgd3Zfc2V0X2ZyZXF1ZW5jeSh1bnNpZ25lZCBsb25nIGlvYWRkciwJLyogSS9PIHBvcnQgb2YgdGhlIGNhcmQgKi8KKwkJCQkgICBpd19mcmVxICogZnJlcXVlbmN5KQoreworCWNvbnN0IGludCBCQU5EX05VTSA9IDEwOwkvKiBOdW1iZXIgb2YgYmFuZHMgKi8KKwlsb25nIGZyZXEgPSAwTDsJCS8qIG9mZnNldCB0byAyLjQgR0h6IGluIC41IE1IeiAqLworI2lmZGVmIERFQlVHX0lPQ1RMX0lORk8KKwlpbnQgaTsKKyNlbmRpZgorCisJLyogU2V0dGluZyBieSBmcmVxdWVuY3kgKi8KKwkvKiBUaGVvcmV0aWNhbGx5LCB5b3UgbWF5IHNldCBhbnkgZnJlcXVlbmN5IGJldHdlZW4KKwkgKiB0aGUgdHdvIGxpbWl0cyB3aXRoIGEgMC41IE1IeiBwcmVjaXNpb24uIEluIHByYWN0aWNlLAorCSAqIEkgZG9uJ3Qgd2FudCB5b3UgdG8gaGF2ZSB0cm91YmxlIHdpdGggbG9jYWwgcmVndWxhdGlvbnMuCisJICovCisJaWYgKChmcmVxdWVuY3ktPmUgPT0gMSkgJiYKKwkgICAgKGZyZXF1ZW5jeS0+bSA+PSAoaW50KSAyLjQxMmU4KQorCSAgICAmJiAoZnJlcXVlbmN5LT5tIDw9IChpbnQpIDIuNDg3ZTgpKSB7CisJCWZyZXEgPSAoKGZyZXF1ZW5jeS0+bSAvIDEwMDAwKSAtIDI0MDAwTCkgLyA1OworCX0KKworCS8qIFNldHRpbmcgYnkgY2hhbm5lbCAoc2FtZSBhcyB3ZnJlcXNlbCkgKi8KKwkvKiBXYXJuaW5nOiBlYWNoIGNoYW5uZWwgaXMgMjIgTUh6IHdpZGUsIHNvIHNvbWUgb2YgdGhlIGNoYW5uZWxzCisJICogd2lsbCBpbnRlcmZlcmUuICovCisJaWYgKChmcmVxdWVuY3ktPmUgPT0gMCkgJiYgKGZyZXF1ZW5jeS0+bSA8IEJBTkRfTlVNKSkgeworCQkvKiBHZXQgZnJlcXVlbmN5IG9mZnNldC4gKi8KKwkJZnJlcSA9IGNoYW5uZWxfYmFuZHNbZnJlcXVlbmN5LT5tXSA+PiAxOworCX0KKworCS8qIFZlcmlmeSB0aGF0IHRoZSBmcmVxdWVuY3kgaXMgYWxsb3dlZC4gKi8KKwlpZiAoZnJlcSAhPSAwTCkgeworCQl1MTYgdGFibGVbMTBdOwkvKiBBdXRob3JpemVkIGZyZXF1ZW5jeSB0YWJsZSAqLworCisJCS8qIFJlYWQgdGhlIGZyZXF1ZW5jeSB0YWJsZS4gKi8KKwkJZmVlX3JlYWQoaW9hZGRyLCAweDcxLCB0YWJsZSwgMTApOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworCQlwcmludGsoS0VSTl9ERUJVRyAiRnJlcXVlbmN5IHRhYmxlOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJCXByaW50aygiICUwNFgiLCB0YWJsZVtpXSk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKwkJLyogTG9vayBpbiB0aGUgdGFibGUgdG8gc2VlIHdoZXRoZXIgdGhlIGZyZXF1ZW5jeSBpcyBhbGxvd2VkLiAqLworCQlpZiAoISh0YWJsZVs5IC0gKChmcmVxIC0gMjQpIC8gMTYpXSAmCisJCSAgICAgICgxIDw8ICgoZnJlcSAtIDI0KSAlIDE2KSkpKSByZXR1cm4gLUVJTlZBTDsJLyogbm90IGFsbG93ZWQgKi8KKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBpZiB3ZSBnZXQgYSB1c2FibGUgZnJlcXVlbmN5ICovCisJaWYgKGZyZXEgIT0gMEwpIHsKKwkJdW5zaWduZWQgc2hvcnQgYXJlYVsxNl07CisJCXVuc2lnbmVkIHNob3J0IGRhY1syXTsKKwkJdW5zaWduZWQgc2hvcnQgYXJlYV92ZXJpZnlbMTZdOworCQl1bnNpZ25lZCBzaG9ydCBkYWNfdmVyaWZ5WzJdOworCQkvKiBDb3JyZXNwb25kaW5nIGdhaW4gKGluIHRoZSBwb3dlciBhZGp1c3QgdmFsdWUgdGFibGUpCisJCSAqIFNlZSBBVCZUIFdhdmVMQU4gRGF0YSBNYW51YWwsIFJFRiA0MDctMDI0Njg5L0UsIHBhZ2UgMy04CisJCSAqIGFuZCBXQ0lOMDYyRC5ET0MsIHBhZ2UgNi4yLjkuICovCisJCXVuc2lnbmVkIHNob3J0IHBvd2VyX2xpbWl0W10gPSB7IDQwLCA4MCwgMTIwLCAxNjAsIDAgfTsKKwkJaW50IHBvd2VyX2JhbmQgPSAwOwkvKiBTZWxlY3RlZCBiYW5kICovCisJCXVuc2lnbmVkIHNob3J0IHBvd2VyX2FkanVzdDsJLyogQ29ycmVjdCB2YWx1ZSAqLworCisJCS8qIFNlYXJjaCBmb3IgdGhlIGdhaW4uICovCisJCXBvd2VyX2JhbmQgPSAwOworCQl3aGlsZSAoKGZyZXEgPiBwb3dlcl9saW1pdFtwb3dlcl9iYW5kXSkgJiYKKwkJICAgICAgIChwb3dlcl9saW1pdFsrK3Bvd2VyX2JhbmRdICE9IDApKTsKKworCQkvKiBSZWFkIHRoZSBmaXJzdCBhcmVhLiAqLworCQlmZWVfcmVhZChpb2FkZHIsIDB4MDAsIGFyZWEsIDE2KTsKKworCQkvKiBSZWFkIHRoZSBEQUMuICovCisJCWZlZV9yZWFkKGlvYWRkciwgMHg2MCwgZGFjLCAyKTsKKworCQkvKiBSZWFkIHRoZSBuZXcgcG93ZXIgYWRqdXN0IHZhbHVlLiAqLworCQlmZWVfcmVhZChpb2FkZHIsIDB4NkIgLSAocG93ZXJfYmFuZCA+PiAxKSwgJnBvd2VyX2FkanVzdCwKKwkJCSAxKTsKKwkJaWYgKHBvd2VyX2JhbmQgJiAweDEpCisJCQlwb3dlcl9hZGp1c3QgPj49IDg7CisJCWVsc2UKKwkJCXBvd2VyX2FkanVzdCAmPSAweEZGOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworCQlwcmludGsoS0VSTl9ERUJVRyAiV2F2ZUxBTiBFRVBST00gQXJlYSAxOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCXByaW50aygiICUwNFgiLCBhcmVhW2ldKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisKKwkJcHJpbnRrKEtFUk5fREVCVUcgIldhdmVMQU4gRUVQUk9NIERBQzogJTA0WCAlMDRYXG4iLAorCQkgICAgICAgZGFjWzBdLCBkYWNbMV0pOworI2VuZGlmCisKKwkJLyogRnJlcXVlbmN5IG9mZnNldCAoZm9yIGluZm8gb25seSkgKi8KKwkJYXJlYVswXSA9ICgoZnJlcSA8PCA1KSAmIDB4RkZFMCkgfCAoYXJlYVswXSAmIDB4MUYpOworCisJCS8qIFJlY2VpdmVyIFByaW5jaXBsZSBtYWluIGRpdmlkZXIgY29lZmZpY2llbnQgKi8KKwkJYXJlYVszXSA9IChmcmVxID4+IDEpICsgMjQwMEwgLSAzNTJMOworCQlhcmVhWzJdID0gKChmcmVxICYgMHgxKSA8PCA0KSB8IChhcmVhWzJdICYgMHhGRkVGKTsKKworCQkvKiBUcmFuc21pdHRlciBNYWluIGRpdmlkZXIgY29lZmZpY2llbnQgKi8KKwkJYXJlYVsxM10gPSAoZnJlcSA+PiAxKSArIDI0MDBMOworCQlhcmVhWzEyXSA9ICgoZnJlcSAmIDB4MSkgPDwgNCkgfCAoYXJlYVsyXSAmIDB4RkZFRik7CisKKwkJLyogT3RoZXIgcGFydHMgb2YgdGhlIGFyZWEgYXJlIGZsYWdzLCBiaXQgc3RyZWFtcyBvciB1bnVzZWQuICovCisKKwkJLyogU2V0IHRoZSB2YWx1ZSBpbiB0aGUgREFDLiAqLworCQlkYWNbMV0gPSAoKHBvd2VyX2FkanVzdCA+PiAxKSAmIDB4N0YpIHwgKGRhY1sxXSAmIDB4RkY4MCk7CisJCWRhY1swXSA9ICgocG93ZXJfYWRqdXN0ICYgMHgxKSA8PCA0KSB8IChkYWNbMF0gJiAweEZGRUYpOworCisJCS8qIFdyaXRlIHRoZSBmaXJzdCBhcmVhLiAqLworCQlmZWVfd3JpdGUoaW9hZGRyLCAweDAwLCBhcmVhLCAxNik7CisKKwkJLyogV3JpdGUgdGhlIERBQy4gKi8KKwkJZmVlX3dyaXRlKGlvYWRkciwgMHg2MCwgZGFjLCAyKTsKKworCQkvKiBXZSBub3cgc2hvdWxkIHZlcmlmeSBoZXJlIHRoYXQgdGhlIHdyaXRpbmcgb2YgdGhlIEVFUFJPTSB3ZW50IE9LLiAqLworCisJCS8qIFJlcmVhZCB0aGUgZmlyc3QgYXJlYS4gKi8KKwkJZmVlX3JlYWQoaW9hZGRyLCAweDAwLCBhcmVhX3ZlcmlmeSwgMTYpOworCisJCS8qIFJlcmVhZCB0aGUgREFDLiAqLworCQlmZWVfcmVhZChpb2FkZHIsIDB4NjAsIGRhY192ZXJpZnksIDIpOworCisJCS8qIENvbXBhcmUuICovCisJCWlmIChtZW1jbXAoYXJlYSwgYXJlYV92ZXJpZnksIDE2ICogMikgfHwKKwkJICAgIG1lbWNtcChkYWMsIGRhY192ZXJpZnksIDIgKiAyKSkgeworI2lmZGVmIERFQlVHX0lPQ1RMX0VSUk9SCisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgIldhdmVMQU46IHd2X3NldF9mcmVxdWVuY3k6IHVuYWJsZSB0byB3cml0ZSBuZXcgZnJlcXVlbmN5IHRvIEVFUFJPTSg/KS5cbiIpOworI2VuZGlmCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCX0KKworCQkvKiBXZSBtdXN0IGRvd25sb2FkIHRoZSBmcmVxdWVuY3kgcGFyYW1ldGVycyB0byB0aGUKKwkJICogc3ludGhlc2l6ZXJzIChmcm9tIHRoZSBFRVBST00gLSBhcmVhIDEpCisJCSAqIE5vdGU6IGFzIHRoZSBFRVBST00gaXMgYXV0b21hdGljYWxseSBkZWNyZW1lbnRlZCwgd2Ugc2V0IHRoZSBlbmQKKwkJICogaWYgdGhlIGFyZWEuLi4gKi8KKwkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2FkZHIpLCAweDBGKTsKKwkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLAorCQkJTU1XX0ZFRV9DVFJMX1JFQUQgfCBNTVdfRkVFX0NUUkxfRFdMRCk7CisKKwkJLyogV2FpdCB1bnRpbCB0aGUgZG93bmxvYWQgaXMgZmluaXNoZWQuICovCisJCWZlZV93YWl0KGlvYWRkciwgMTAwLCAxMDApOworCisJCS8qIFdlIG11c3Qgbm93IGRvd25sb2FkIHRoZSBwb3dlciBhZGp1c3QgdmFsdWUgKGdhaW4pIHRvCisJCSAqIHRoZSBzeW50aGVzaXplcnMgKGZyb20gdGhlIEVFUFJPTSAtIGFyZWEgNyAtIERBQykuICovCisJCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgMHg2MSk7CisJCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwKKwkJCU1NV19GRUVfQ1RSTF9SRUFEIHwgTU1XX0ZFRV9DVFJMX0RXTEQpOworCisJCS8qIFdhaXQgZm9yIHRoZSBkb3dubG9hZCB0byBmaW5pc2guICovCisJCWZlZV93YWl0KGlvYWRkciwgMTAwLCAxMDApOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworCQkvKiBWZXJpZmljYXRpb24gb2Ygd2hhdCB3ZSBoYXZlIGRvbmUgKi8KKworCQlwcmludGsoS0VSTl9ERUJVRyAiV2F2ZUxBTiBFRVBST00gQXJlYSAxOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCXByaW50aygiICUwNFgiLCBhcmVhX3ZlcmlmeVtpXSk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCisJCXByaW50ayhLRVJOX0RFQlVHICJXYXZlTEFOIEVFUFJPTSBEQUM6ICAlMDRYICUwNFhcbiIsCisJCSAgICAgICBkYWNfdmVyaWZ5WzBdLCBkYWNfdmVyaWZ5WzFdKTsKKyNlbmRpZgorCisJCXJldHVybiAwOworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsJLyogQmFoLCBuZXZlciBnZXQgdGhlcmUuLi4gKi8KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEdpdmUgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGZyZXF1ZW5jaWVzLgorICovCitzdGF0aWMgaW5saW5lIGludCB3dl9mcmVxdWVuY3lfbGlzdCh1bnNpZ25lZCBsb25nIGlvYWRkciwJLyogSS9PIHBvcnQgb2YgdGhlIGNhcmQgKi8KKwkJCQkgICAgaXdfZnJlcSAqIGxpc3QsCS8qIExpc3Qgb2YgZnJlcXVlbmNpZXMgdG8gZmlsbCAqLworCQkJCSAgICBpbnQgbWF4KQorewkJCQkvKiBNYXhpbXVtIG51bWJlciBvZiBmcmVxdWVuY2llcyAqLworCXUxNiB0YWJsZVsxMF07CS8qIEF1dGhvcml6ZWQgZnJlcXVlbmN5IHRhYmxlICovCisJbG9uZyBmcmVxID0gMEw7CQkvKiBvZmZzZXQgdG8gMi40IEdIeiBpbiAuNSBNSHogKyAxMiBNSHogKi8KKwlpbnQgaTsJCQkvKiBpbmRleCBpbiB0aGUgdGFibGUgKi8KKwlpbnQgYyA9IDA7CQkvKiBDaGFubmVsIG51bWJlciAqLworCisJLyogUmVhZCB0aGUgZnJlcXVlbmN5IHRhYmxlLiAqLworCWZlZV9yZWFkKGlvYWRkciwgMHg3MSAvKiBmcmVxdWVuY3kgdGFibGUgKi8gLCB0YWJsZSwgMTApOworCisJLyogQ2hlY2sgYWxsIGZyZXF1ZW5jaWVzLiAqLworCWkgPSAwOworCWZvciAoZnJlcSA9IDA7IGZyZXEgPCAxNTA7IGZyZXErKykKKwkJLyogTG9vayBpbiB0aGUgdGFibGUgaWYgdGhlIGZyZXF1ZW5jeSBpcyBhbGxvd2VkICovCisJCWlmICh0YWJsZVs5IC0gKGZyZXEgLyAxNildICYgKDEgPDwgKGZyZXEgJSAxNikpKSB7CisJCQkvKiBDb21wdXRlIGFwcHJveGltYXRlIGNoYW5uZWwgbnVtYmVyICovCisJCQl3aGlsZSAoKCgoY2hhbm5lbF9iYW5kc1tjXSA+PiAxKSAtIDI0KSA8IGZyZXEpICYmCisJCQkgICAgICAgKGMgPCBORUxTKGNoYW5uZWxfYmFuZHMpKSkKKwkJCQljKys7CisJCQlsaXN0W2ldLmkgPSBjOwkvKiBTZXQgdGhlIGxpc3QgaW5kZXggKi8KKworCQkJLyogcHV0IGluIHRoZSBsaXN0ICovCisJCQlsaXN0W2ldLm0gPSAoKChmcmVxICsgMjQpICogNSkgKyAyNDAwMEwpICogMTAwMDA7CisJCQlsaXN0W2krK10uZSA9IDE7CisKKwkJCS8qIENoZWNrIG51bWJlci4gKi8KKwkJCWlmIChpID49IG1heCkKKwkJCQlyZXR1cm4gKGkpOworCQl9CisKKwlyZXR1cm4gKGkpOworfQorCisjaWZkZWYgSVdfV0lSRUxFU1NfU1BZCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2F0aGVyIHdpcmVsZXNzIHNweSBzdGF0aXN0aWNzOiAgZm9yIGVhY2ggcGFja2V0LCBjb21wYXJlIHRoZSBzb3VyY2UKKyAqIGFkZHJlc3Mgd2l0aCBvdXIgbGlzdCwgYW5kIGlmIHRoZXkgbWF0Y2gsIGdldCB0aGUgc3RhdGlzdGljcy4KKyAqIFNvcnJ5LCBidXQgdGhpcyBmdW5jdGlvbiByZWFsbHkgbmVlZHMgdGhlIHdpcmVsZXNzIGV4dGVuc2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3bF9zcHlfZ2F0aGVyKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LAorCQkJCSB1OCAqCW1hYywJLyogTUFDIGFkZHJlc3MgKi8KKwkJCQkgdTggKglzdGF0cykJLyogU3RhdGlzdGljcyB0byBnYXRoZXIgKi8KK3sKKwlzdHJ1Y3QgaXdfcXVhbGl0eSB3c3RhdHM7CisKKwl3c3RhdHMucXVhbCA9IHN0YXRzWzJdICYgTU1SX1NHTkxfUVVBTDsKKwl3c3RhdHMubGV2ZWwgPSBzdGF0c1swXSAmIE1NUl9TSUdOQUxfTFZMOworCXdzdGF0cy5ub2lzZSA9IHN0YXRzWzFdICYgTU1SX1NJTEVOQ0VfTFZMOworCXdzdGF0cy51cGRhdGVkID0gMHg3OworCisJLyogVXBkYXRlIHNweSByZWNvcmRzICovCisJd2lyZWxlc3Nfc3B5X3VwZGF0ZShkZXYsIG1hYywgJndzdGF0cyk7Cit9CisjZW5kaWYgLyogSVdfV0lSRUxFU1NfU1BZICovCisKKyNpZmRlZiBISVNUT0dSQU0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYSBoaXN0b2dyYW0gb2YgdGhlIHNpZ25hbCBsZXZlbC4KKyAqIEFzIHRoZSBub2lzZSBpcyBxdWl0ZSBjb25zdGFudCwgaXQncyBsaWtlIGRvaW5nIGl0IG9uIHRoZSBTTlIuCisgKiBXZSBoYXZlIGRlZmluZWQgYSBzZXQgb2YgaW50ZXJ2YWwgKGxwLT5oaXNfcmFuZ2UpLCBhbmQgZWFjaCB0aW1lCisgKiB0aGUgbGV2ZWwgZ29lcyBpbiB0aGF0IGludGVydmFsLCB3ZSBpbmNyZW1lbnQgdGhlIGNvdW50IChscC0+aGlzX3N1bSkuCisgKiBXaXRoIHRoaXMgaGlzdG9ncmFtIHlvdSBtYXkgZGV0ZWN0IGlmIG9uZSBXYXZlTEFOIGlzIHJlYWxseSB3ZWFrLAorICogb3IgeW91IG1heSBhbHNvIGNhbGN1bGF0ZSB0aGUgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBsZXZlbC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHdsX2hpc19nYXRoZXIoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIHU4ICogc3RhdHMpCit7CQkJCS8qIFN0YXRpc3RpY3MgdG8gZ2F0aGVyICovCisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXU4IGxldmVsID0gc3RhdHNbMF0gJiBNTVJfU0lHTkFMX0xWTDsKKwlpbnQgaTsKKworCS8qIEZpbmQgdGhlIGNvcnJlY3QgaW50ZXJ2YWwuICovCisJaSA9IDA7CisJd2hpbGUgKChpIDwgKGxwLT5oaXNfbnVtYmVyIC0gMSkpCisJICAgICAgICYmIChsZXZlbCA+PSBscC0+aGlzX3JhbmdlW2krK10pKTsKKworCS8qIEluY3JlbWVudCBpbnRlcnZhbCBjb3VudGVyLiAqLworCShscC0+aGlzX3N1bVtpXSkrKzsKK30KKyNlbmRpZiAvKiBISVNUT0dSQU0gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgcHJvdG9jb2wgbmFtZQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJc3RyY3B5KHdycXUtPm5hbWUsICJXYXZlTEFOIik7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IE5XSUQKKyAqLworc3RhdGljIGludCB3YXZlbGFuX3NldF9ud2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OwkvKiBscCBpcyBub3QgdW51c2VkICovCisJcHNhX3QgcHNhOworCW1tX3QgbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBTZXQgTldJRCBpbiBXYXZlTEFOLiAqLworCWlmICghd3JxdS0+bndpZC5kaXNhYmxlZCkgeworCQkvKiBTZXQgTldJRCBpbiBwc2EgKi8KKwkJcHNhLnBzYV9ud2lkWzBdID0gKHdycXUtPm53aWQudmFsdWUgJiAweEZGMDApID4+IDg7CisJCXBzYS5wc2FfbndpZFsxXSA9IHdycXUtPm53aWQudmFsdWUgJiAweEZGOworCQlwc2EucHNhX253aWRfc2VsZWN0ID0gMHgwMTsKKwkJcHNhX3dyaXRlKGlvYWRkciwgbHAtPmhhY3IsCisJCQkgIChjaGFyICopIHBzYS5wc2FfbndpZCAtIChjaGFyICopICZwc2EsCisJCQkgICh1bnNpZ25lZCBjaGFyICopIHBzYS5wc2FfbndpZCwgMyk7CisKKwkJLyogU2V0IE5XSUQgaW4gbW1jLiAqLworCQltLncubW13X25ldHdfaWRfbCA9IHBzYS5wc2FfbndpZFsxXTsKKwkJbS53Lm1td19uZXR3X2lkX2ggPSBwc2EucHNhX253aWRbMF07CisJCW1tY193cml0ZShpb2FkZHIsCisJCQkgIChjaGFyICopICZtLncubW13X25ldHdfaWRfbCAtCisJCQkgIChjaGFyICopICZtLAorCQkJICAodW5zaWduZWQgY2hhciAqKSAmbS53Lm1td19uZXR3X2lkX2wsIDIpOworCQltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19sb29wdF9zZWwpLCAweDAwKTsKKwl9IGVsc2UgeworCQkvKiBEaXNhYmxlIE5XSUQgaW4gdGhlIHBzYS4gKi8KKwkJcHNhLnBzYV9ud2lkX3NlbGVjdCA9IDB4MDA7CisJCXBzYV93cml0ZShpb2FkZHIsIGxwLT5oYWNyLAorCQkJICAoY2hhciAqKSAmcHNhLnBzYV9ud2lkX3NlbGVjdCAtCisJCQkgIChjaGFyICopICZwc2EsCisJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX253aWRfc2VsZWN0LAorCQkJICAxKTsKKworCQkvKiBEaXNhYmxlIE5XSUQgaW4gdGhlIG1tYyAobm8gZmlsdGVyaW5nKS4gKi8KKwkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfbG9vcHRfc2VsKSwKKwkJCU1NV19MT09QVF9TRUxfRElTX05XSUQpOworCX0KKwkvKiB1cGRhdGUgdGhlIFdhdmVsYW4gY2hlY2tzdW0gKi8KKwl1cGRhdGVfcHNhX2NoZWNrc3VtKGRldiwgaW9hZGRyLCBscC0+aGFjcik7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IE5XSUQgCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfbndpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCXBzYV90IHBzYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBSZWFkIHRoZSBOV0lELiAqLworCXBzYV9yZWFkKGlvYWRkciwgbHAtPmhhY3IsCisJCSAoY2hhciAqKSBwc2EucHNhX253aWQgLSAoY2hhciAqKSAmcHNhLAorCQkgKHVuc2lnbmVkIGNoYXIgKikgcHNhLnBzYV9ud2lkLCAzKTsKKwl3cnF1LT5ud2lkLnZhbHVlID0gKHBzYS5wc2FfbndpZFswXSA8PCA4KSArIHBzYS5wc2FfbndpZFsxXTsKKwl3cnF1LT5ud2lkLmRpc2FibGVkID0gIShwc2EucHNhX253aWRfc2VsZWN0KTsKKwl3cnF1LT5ud2lkLmZpeGVkID0gMTsJLyogU3VwZXJmbHVvdXMgKi8KKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgZnJlcXVlbmN5CisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJLyogQXR0ZW1wdCB0byByZWNvZ25pc2UgMi4wMCBjYXJkcyAoMi40IEdIeiBmcmVxdWVuY3kgc2VsZWN0YWJsZSkuICovCisJaWYgKCEobW1jX2luKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorCSAgICAgIChNTVJfRkVFX1NUQVRVU19EV0xEIHwgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpKQorCQlyZXQgPSB3dl9zZXRfZnJlcXVlbmN5KGlvYWRkciwgJih3cnF1LT5mcmVxKSk7CisJZWxzZQorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgZnJlcXVlbmN5CisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCXBzYV90IHBzYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBBdHRlbXB0IHRvIHJlY29nbmlzZSAyLjAwIGNhcmRzICgyLjQgR0h6IGZyZXF1ZW5jeSBzZWxlY3RhYmxlKS4KKwkgKiBEb2VzIGl0IHdvcmsgZm9yIGV2ZXJ5Ym9keSwgZXNwZWNpYWxseSBvbGQgY2FyZHM/ICovCisJaWYgKCEobW1jX2luKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorCSAgICAgIChNTVJfRkVFX1NUQVRVU19EV0xEIHwgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpKSB7CisJCXVuc2lnbmVkIHNob3J0IGZyZXE7CisKKwkJLyogQXNrIHRoZSBFRVBST00gdG8gcmVhZCB0aGUgZnJlcXVlbmN5IGZyb20gdGhlIGZpcnN0IGFyZWEuICovCisJCWZlZV9yZWFkKGlvYWRkciwgMHgwMCwgJmZyZXEsIDEpOworCQl3cnF1LT5mcmVxLm0gPSAoKGZyZXEgPj4gNSkgKiA1ICsgMjQwMDBMKSAqIDEwMDAwOworCQl3cnF1LT5mcmVxLmUgPSAxOworCX0gZWxzZSB7CisJCXBzYV9yZWFkKGlvYWRkciwgbHAtPmhhY3IsCisJCQkgKGNoYXIgKikgJnBzYS5wc2Ffc3ViYmFuZCAtIChjaGFyICopICZwc2EsCisJCQkgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS5wc2Ffc3ViYmFuZCwgMSk7CisKKwkJaWYgKHBzYS5wc2Ffc3ViYmFuZCA8PSA0KSB7CisJCQl3cnF1LT5mcmVxLm0gPSBmaXhlZF9iYW5kc1twc2EucHNhX3N1YmJhbmRdOworCQkJd3JxdS0+ZnJlcS5lID0gKHBzYS5wc2Ffc3ViYmFuZCAhPSAwKTsKKwkJfSBlbHNlCisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IGxldmVsIHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CS8qIGxwIGlzIG5vdCB1bnVzZWQgKi8KKwlwc2FfdCBwc2E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJLyogU2V0IHRoZSBsZXZlbCB0aHJlc2hvbGQuICovCisJLyogV2Ugc2hvdWxkIGNvbXBsYWluIGxvdWRseSBpZiB3cnF1LT5zZW5zLmZpeGVkID0gMCwgYmVjYXVzZSB3ZQorCSAqIGNhbid0IHNldCBhdXRvIG1vZGUuLi4gKi8KKwlwc2EucHNhX3Rocl9wcmVfc2V0ID0gd3JxdS0+c2Vucy52YWx1ZSAmIDB4M0Y7CisJcHNhX3dyaXRlKGlvYWRkciwgbHAtPmhhY3IsCisJCSAgKGNoYXIgKikgJnBzYS5wc2FfdGhyX3ByZV9zZXQgLSAoY2hhciAqKSAmcHNhLAorCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX3Rocl9wcmVfc2V0LCAxKTsKKwkvKiB1cGRhdGUgdGhlIFdhdmVsYW4gY2hlY2tzdW0gKi8KKwl1cGRhdGVfcHNhX2NoZWNrc3VtKGRldiwgaW9hZGRyLCBscC0+aGFjcik7CisJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfdGhyX3ByZV9zZXQpLAorCQlwc2EucHNhX3Rocl9wcmVfc2V0KTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgbGV2ZWwgdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfc2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCXBzYV90IHBzYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBSZWFkIHRoZSBsZXZlbCB0aHJlc2hvbGQuICovCisJcHNhX3JlYWQoaW9hZGRyLCBscC0+aGFjciwKKwkJIChjaGFyICopICZwc2EucHNhX3Rocl9wcmVfc2V0IC0gKGNoYXIgKikgJnBzYSwKKwkJICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX3Rocl9wcmVfc2V0LCAxKTsKKwl3cnF1LT5zZW5zLnZhbHVlID0gcHNhLnBzYV90aHJfcHJlX3NldCAmIDB4M0Y7CisJd3JxdS0+c2Vucy5maXhlZCA9IDE7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IGVuY3J5cHRpb24ga2V5CisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICAgIGNoYXIgKmV4dHJhKQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OwkvKiBscCBpcyBub3QgdW51c2VkICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlwc2FfdCBwc2E7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgaWYgY2FwYWJsZSBvZiBlbmNyeXB0aW9uICovCisJaWYgKCFtbWNfZW5jcihpb2FkZHIpKSB7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKworCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBrZXkgKi8KKwlpZigod3JxdS0+ZW5jb2RpbmcubGVuZ3RoICE9IDgpICYmICh3cnF1LT5lbmNvZGluZy5sZW5ndGggIT0gMCkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlpZighcmV0KSB7CisJCS8qIEJhc2ljIGNoZWNraW5nLi4uICovCisJCWlmICh3cnF1LT5lbmNvZGluZy5sZW5ndGggPT0gOCkgeworCQkJLyogQ29weSB0aGUga2V5IGluIHRoZSBkcml2ZXIgKi8KKwkJCW1lbWNweShwc2EucHNhX2VuY3J5cHRpb25fa2V5LCBleHRyYSwKKwkJCSAgICAgICB3cnF1LT5lbmNvZGluZy5sZW5ndGgpOworCQkJcHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCA9IDE7CisKKwkJCXBzYV93cml0ZShpb2FkZHIsIGxwLT5oYWNyLAorCQkJCSAgKGNoYXIgKikgJnBzYS5wc2FfZW5jcnlwdGlvbl9zZWxlY3QgLQorCQkJCSAgKGNoYXIgKikgJnBzYSwKKwkJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EuCisJCQkJICBwc2FfZW5jcnlwdGlvbl9zZWxlY3QsIDggKyAxKTsKKworCQkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZW5jcl9lbmFibGUpLAorCQkJCU1NV19FTkNSX0VOQUJMRV9FTiB8IE1NV19FTkNSX0VOQUJMRV9NT0RFKTsKKwkJCW1tY193cml0ZShpb2FkZHIsIG1td29mZigwLCBtbXdfZW5jcl9rZXkpLAorCQkJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS4KKwkJCQkgIHBzYV9lbmNyeXB0aW9uX2tleSwgOCk7CisJCX0KKworCQkvKiBkaXNhYmxlIGVuY3J5cHRpb24gKi8KKwkJaWYgKHdycXUtPmVuY29kaW5nLmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB7CisJCQlwc2EucHNhX2VuY3J5cHRpb25fc2VsZWN0ID0gMDsKKwkJCXBzYV93cml0ZShpb2FkZHIsIGxwLT5oYWNyLAorCQkJCSAgKGNoYXIgKikgJnBzYS5wc2FfZW5jcnlwdGlvbl9zZWxlY3QgLQorCQkJCSAgKGNoYXIgKikgJnBzYSwKKwkJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EuCisJCQkJICBwc2FfZW5jcnlwdGlvbl9zZWxlY3QsIDEpOworCisJCQltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19lbmNyX2VuYWJsZSksIDApOworCQl9CisJCS8qIHVwZGF0ZSB0aGUgV2F2ZWxhbiBjaGVja3N1bSAqLworCQl1cGRhdGVfcHNhX2NoZWNrc3VtKGRldiwgaW9hZGRyLCBscC0+aGFjcik7CisJfQorCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBlbmNyeXB0aW9uIGtleQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCXBzYV90IHBzYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBDaGVjayBpZiBlbmNyeXB0aW9uIGlzIGF2YWlsYWJsZSAqLworCWlmICghbW1jX2VuY3IoaW9hZGRyKSkgeworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9IGVsc2UgeworCQkvKiBSZWFkIHRoZSBlbmNyeXB0aW9uIGtleSAqLworCQlwc2FfcmVhZChpb2FkZHIsIGxwLT5oYWNyLAorCQkJIChjaGFyICopICZwc2EucHNhX2VuY3J5cHRpb25fc2VsZWN0IC0KKwkJCSAoY2hhciAqKSAmcHNhLAorCQkJICh1bnNpZ25lZCBjaGFyICopICZwc2EuCisJCQkgcHNhX2VuY3J5cHRpb25fc2VsZWN0LCAxICsgOCk7CisKKwkJLyogZW5jcnlwdGlvbiBpcyBlbmFibGVkID8gKi8KKwkJaWYgKHBzYS5wc2FfZW5jcnlwdGlvbl9zZWxlY3QpCisJCQl3cnF1LT5lbmNvZGluZy5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEOworCQllbHNlCisJCQl3cnF1LT5lbmNvZGluZy5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJd3JxdS0+ZW5jb2RpbmcuZmxhZ3MgfD0gbW1jX2VuY3IoaW9hZGRyKTsKKworCQkvKiBDb3B5IHRoZSBrZXkgdG8gdGhlIHVzZXIgYnVmZmVyICovCisJCXdycXUtPmVuY29kaW5nLmxlbmd0aCA9IDg7CisJCW1lbWNweShleHRyYSwgcHNhLnBzYV9lbmNyeXB0aW9uX2tleSwgd3JxdS0+ZW5jb2RpbmcubGVuZ3RoKTsKKwl9CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHJhbmdlIGluZm8KKyAqLworc3RhdGljIGludCB3YXZlbGFuX2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBTZXQgdGhlIGxlbmd0aCAodmVyeSBpbXBvcnRhbnQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpICovCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKKworCS8qIFNldCBhbGwgdGhlIGluZm8gd2UgZG9uJ3QgY2FyZSBvciBkb24ndCBrbm93IGFib3V0IHRvIHplcm8gKi8KKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKKworCS8qIFNldCB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9uIHZlcnNpb25zICovCisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gOTsKKworCS8qIFNldCBpbmZvcm1hdGlvbiBpbiB0aGUgcmFuZ2Ugc3RydWN0LiAgKi8KKwlyYW5nZS0+dGhyb3VnaHB1dCA9IDEuNiAqIDEwMDAgKiAxMDAwOwkvKiBkb24ndCBhcmd1ZSBvbiB0aGlzICEgKi8KKwlyYW5nZS0+bWluX253aWQgPSAweDAwMDA7CisJcmFuZ2UtPm1heF9ud2lkID0gMHhGRkZGOworCisJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMHgzRjsKKwlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IE1NUl9TR05MX1FVQUw7CisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gTU1SX1NJR05BTF9MVkw7CisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gTU1SX1NJTEVOQ0VfTFZMOworCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gTU1SX1NHTkxfUVVBTDsgLyogQWx3YXlzIG1heCAqLworCS8qIE5lZWQgdG8gZ2V0IGJldHRlciB2YWx1ZXMgZm9yIHRob3NlIHR3byAqLworCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDMwOworCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IDg7CisKKwlyYW5nZS0+bnVtX2JpdHJhdGVzID0gMTsKKwlyYW5nZS0+Yml0cmF0ZVswXSA9IDIwMDAwMDA7CS8qIDIgTWIvcyAqLworCisJLyogRXZlbnQgY2FwYWJpbGl0eSAoa2VybmVsICsgZHJpdmVyKSAqLworCXJhbmdlLT5ldmVudF9jYXBhWzBdID0gKElXX0VWRU5UX0NBUEFfTUFTSygweDhCMDIpIHwKKwkJCQlJV19FVkVOVF9DQVBBX01BU0soMHg4QjA0KSk7CisJcmFuZ2UtPmV2ZW50X2NhcGFbMV0gPSBJV19FVkVOVF9DQVBBX0tfMTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJLyogQXR0ZW1wdCB0byByZWNvZ25pc2UgMi4wMCBjYXJkcyAoMi40IEdIeiBmcmVxdWVuY3kgc2VsZWN0YWJsZSkuICovCisJaWYgKCEobW1jX2luKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorCSAgICAgIChNTVJfRkVFX1NUQVRVU19EV0xEIHwgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpKSB7CisJCXJhbmdlLT5udW1fY2hhbm5lbHMgPSAxMDsKKwkJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSB3dl9mcmVxdWVuY3lfbGlzdChpb2FkZHIsIHJhbmdlLT5mcmVxLAorCQkJCQkJCUlXX01BWF9GUkVRVUVOQ0lFUyk7CisJfSBlbHNlCisJCXJhbmdlLT5udW1fY2hhbm5lbHMgPSByYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IDA7CisKKwkvKiBFbmNyeXB0aW9uIHN1cHBvcnRlZCA/ICovCisJaWYgKG1tY19lbmNyKGlvYWRkcikpIHsKKwkJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSA4OwkvKiBERVMgPSA2NCBiaXRzIGtleSAqLworCQlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMTsKKwkJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSAxOwkvKiBPbmx5IG9uZSBrZXkgcG9zc2libGUgKi8KKwl9IGVsc2UgeworCQlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMDsKKwkJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSAwOworCX0KKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IHNldCBxdWFsaXR5IHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X3F0aHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CS8qIGxwIGlzIG5vdCB1bnVzZWQgKi8KKwlwc2FfdCBwc2E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJcHNhLnBzYV9xdWFsaXR5X3RociA9ICooZXh0cmEpICYgMHgwRjsKKwlwc2Ffd3JpdGUoaW9hZGRyLCBscC0+aGFjciwKKwkJICAoY2hhciAqKSAmcHNhLnBzYV9xdWFsaXR5X3RociAtIChjaGFyICopICZwc2EsCisJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS5wc2FfcXVhbGl0eV90aHIsIDEpOworCS8qIHVwZGF0ZSB0aGUgV2F2ZWxhbiBjaGVja3N1bSAqLworCXVwZGF0ZV9wc2FfY2hlY2tzdW0oZGV2LCBpb2FkZHIsIGxwLT5oYWNyKTsKKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19xdWFsaXR5X3RociksCisJCXBzYS5wc2FfcXVhbGl0eV90aHIpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IGdldCBxdWFsaXR5IHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X3F0aHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CS8qIGxwIGlzIG5vdCB1bnVzZWQgKi8KKwlwc2FfdCBwc2E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJcHNhX3JlYWQoaW9hZGRyLCBscC0+aGFjciwKKwkJIChjaGFyICopICZwc2EucHNhX3F1YWxpdHlfdGhyIC0gKGNoYXIgKikgJnBzYSwKKwkJICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX3F1YWxpdHlfdGhyLCAxKTsKKwkqKGV4dHJhKSA9IHBzYS5wc2FfcXVhbGl0eV90aHIgJiAweDBGOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIEhJU1RPR1JBTQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IHNldCBoaXN0b2dyYW0KKyAqLworc3RhdGljIGludCB3YXZlbGFuX3NldF9oaXN0byhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgICBjaGFyICpleHRyYSkKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CS8qIGxwIGlzIG5vdCB1bnVzZWQgKi8KKworCS8qIENoZWNrIHRoZSBudW1iZXIgb2YgaW50ZXJ2YWxzLiAqLworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IDE2KSB7CisJCXJldHVybigtRTJCSUcpOworCX0KKworCS8qIERpc2FibGUgaGlzdG8gd2hpbGUgd2UgY29weSB0aGUgYWRkcmVzc2VzLgorCSAqIEFzIHdlIGRvbid0IGRpc2FibGUgaW50ZXJydXB0cywgd2UgbmVlZCB0byBkbyB0aGlzICovCisJbHAtPmhpc19udW1iZXIgPSAwOworCisJLyogQXJlIHRoZXJlIHJhbmdlcyB0byBjb3B5PyAqLworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IDApIHsKKwkJLyogQ29weSBpbnRlcnZhbCByYW5nZXMgdG8gdGhlIGRyaXZlciAqLworCQltZW1jcHkobHAtPmhpc19yYW5nZSwgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKKworCQl7CisJCSAgaW50IGk7CisJCSAgcHJpbnRrKEtFUk5fREVCVUcgIkhpc3RvIDoiKTsKKwkJICBmb3IoaSA9IDA7IGkgPCB3cnF1LT5kYXRhLmxlbmd0aDsgaSsrKQorCQkgICAgcHJpbnRrKCIgJWQiLCBscC0+aGlzX3JhbmdlW2ldKTsKKwkJICBwcmludGsoIlxuIik7CisJCX0KKworCQkvKiBSZXNldCByZXN1bHQgc3RydWN0dXJlLiAqLworCQltZW1zZXQobHAtPmhpc19zdW0sIDB4MDAsIHNpemVvZihsb25nKSAqIDE2KTsKKwl9CisKKwkvKiBOb3cgd2UgY2FuIHNldCB0aGUgbnVtYmVyIG9mIHJhbmdlcyAqLworCWxwLT5oaXNfbnVtYmVyID0gd3JxdS0+ZGF0YS5sZW5ndGg7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBQcml2YXRlIEhhbmRsZXIgOiBnZXQgaGlzdG9ncmFtCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfaGlzdG8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICAgY2hhciAqZXh0cmEpCit7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OwkvKiBscCBpcyBub3QgdW51c2VkICovCisKKwkvKiBTZXQgdGhlIG51bWJlciBvZiBpbnRlcnZhbHMuICovCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBscC0+aGlzX251bWJlcjsKKworCS8qIEdpdmUgYmFjayB0aGUgZGlzdHJpYnV0aW9uIHN0YXRpc3RpY3MgKi8KKwlpZihscC0+aGlzX251bWJlciA+IDApCisJCW1lbWNweShleHRyYSwgbHAtPmhpc19zdW0sIHNpemVvZihsb25nKSAqIGxwLT5oaXNfbnVtYmVyKTsKKworCXJldHVybigwKTsKK30KKyNlbmRpZgkJCS8qIEhJU1RPR1JBTSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU3RydWN0dXJlcyB0byBleHBvcnQgdGhlIFdpcmVsZXNzIEhhbmRsZXJzCisgKi8KKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJCXdhdmVsYW5faGFuZGxlcltdID0KK3sKKwlOVUxMLAkJCQkvKiBTSU9DU0lXTkFNRSAqLworCXdhdmVsYW5fZ2V0X25hbWUsCQkvKiBTSU9DR0lXTkFNRSAqLworCXdhdmVsYW5fc2V0X253aWQsCQkvKiBTSU9DU0lXTldJRCAqLworCXdhdmVsYW5fZ2V0X253aWQsCQkvKiBTSU9DR0lXTldJRCAqLworCXdhdmVsYW5fc2V0X2ZyZXEsCQkvKiBTSU9DU0lXRlJFUSAqLworCXdhdmVsYW5fZ2V0X2ZyZXEsCQkvKiBTSU9DR0lXRlJFUSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdNT0RFICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV01PREUgKi8KKwl3YXZlbGFuX3NldF9zZW5zLAkJLyogU0lPQ1NJV1NFTlMgKi8KKwl3YXZlbGFuX2dldF9zZW5zLAkJLyogU0lPQ0dJV1NFTlMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXUkFOR0UgKi8KKwl3YXZlbGFuX2dldF9yYW5nZSwJCS8qIFNJT0NHSVdSQU5HRSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdQUklWICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV1BSSVYgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXU1RBVFMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXU1RBVFMgKi8KKwlpd19oYW5kbGVyX3NldF9zcHksCQkvKiBTSU9DU0lXU1BZICovCisJaXdfaGFuZGxlcl9nZXRfc3B5LAkJLyogU0lPQ0dJV1NQWSAqLworCWl3X2hhbmRsZXJfc2V0X3RocnNweSwJCS8qIFNJT0NTSVdUSFJTUFkgKi8KKwlpd19oYW5kbGVyX2dldF90aHJzcHksCQkvKiBTSU9DR0lXVEhSU1BZICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV0FQICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV0FQICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdBUExJU1QgKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdFU1NJRCAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdFU1NJRCAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdOSUNLTiAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdOSUNLTiAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1JBVEUgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUkFURSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSVFMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUlRTICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV0ZSQUcgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXRlJBRyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdUWFBPVyAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdUWFBPVyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSRVRSWSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdSRVRSWSAqLworCS8qIEJ1bW1lciAhIFdoeSB0aG9zZSBhcmUgb25seSBhdCB0aGUgZW5kID8/PyAqLworCXdhdmVsYW5fc2V0X2VuY29kZSwJCS8qIFNJT0NTSVdFTkNPREUgKi8KKwl3YXZlbGFuX2dldF9lbmNvZGUsCQkvKiBTSU9DR0lXRU5DT0RFICovCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlcgkJd2F2ZWxhbl9wcml2YXRlX2hhbmRsZXJbXSA9Cit7CisJd2F2ZWxhbl9zZXRfcXRociwJCS8qIFNJT0NJV0ZJUlNUUFJJViAqLworCXdhdmVsYW5fZ2V0X3F0aHIsCQkvKiBTSU9DSVdGSVJTVFBSSVYgKyAxICovCisjaWZkZWYgSElTVE9HUkFNCisJd2F2ZWxhbl9zZXRfaGlzdG8sCQkvKiBTSU9DSVdGSVJTVFBSSVYgKyAyICovCisJd2F2ZWxhbl9nZXRfaGlzdG8sCQkvKiBTSU9DSVdGSVJTVFBSSVYgKyAzICovCisjZW5kaWYJLyogSElTVE9HUkFNICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncyB3YXZlbGFuX3ByaXZhdGVfYXJnc1tdID0geworLyp7IGNtZCwgICAgICAgICBzZXRfYXJncywgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2FyZ3MsIG5hbWUgfSAqLworICB7IFNJT0NTSVBRVEhSLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRxdWFsdGhyIiB9LAorICB7IFNJT0NHSVBRVEhSLCAwLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRxdWFsdGhyIiB9LAorICB7IFNJT0NTSVBISVNUTywgSVdfUFJJVl9UWVBFX0JZVEUgfCAxNiwgICAgICAgICAgICAgICAgICAgIDAsICJzZXRoaXN0byIgfSwKKyAgeyBTSU9DR0lQSElTVE8sIDAsICAgICAgICAgICAgICAgICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LCAiZ2V0aGlzdG8iIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmCXdhdmVsYW5faGFuZGxlcl9kZWYgPQoreworCS5udW1fc3RhbmRhcmQJPSBzaXplb2Yod2F2ZWxhbl9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlCT0gc2l6ZW9mKHdhdmVsYW5fcHJpdmF0ZV9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlX2FyZ3MgPSBzaXplb2Yod2F2ZWxhbl9wcml2YXRlX2FyZ3MpL3NpemVvZihzdHJ1Y3QgaXdfcHJpdl9hcmdzKSwKKwkuc3RhbmRhcmQJPSB3YXZlbGFuX2hhbmRsZXIsCisJLnByaXZhdGUJPSB3YXZlbGFuX3ByaXZhdGVfaGFuZGxlciwKKwkucHJpdmF0ZV9hcmdzCT0gd2F2ZWxhbl9wcml2YXRlX2FyZ3MsCisJLmdldF93aXJlbGVzc19zdGF0cyA9IHdhdmVsYW5fZ2V0X3dpcmVsZXNzX3N0YXRzLAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEdldCB3aXJlbGVzcyBzdGF0aXN0aWNzLgorICogQ2FsbGVkIGJ5IC9wcm9jL25ldC93aXJlbGVzcworICovCitzdGF0aWMgaXdfc3RhdHMgKndhdmVsYW5fZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCW1tcl90IG07CisJaXdfc3RhdHMgKndzdGF0czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgREVCVUdfSU9DVExfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d2F2ZWxhbl9nZXRfd2lyZWxlc3Nfc3RhdHMoKVxuIiwKKwkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogQ2hlY2sgKi8KKwlpZiAobHAgPT0gKG5ldF9sb2NhbCAqKSBOVUxMKQorCQlyZXR1cm4gKGl3X3N0YXRzICopIE5VTEw7CisJCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwl3c3RhdHMgPSAmbHAtPndzdGF0czsKKworCS8qIEdldCBkYXRhIGZyb20gdGhlIG1tYy4gKi8KKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mcmVlemUpLCAxKTsKKworCW1tY19yZWFkKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl9kY2Vfc3RhdHVzKSwgJm0ubW1yX2RjZV9zdGF0dXMsIDEpOworCW1tY19yZWFkKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl93cm9uZ19ud2lkX2wpLCAmbS5tbXJfd3JvbmdfbndpZF9sLAorCQkgMik7CisJbW1jX3JlYWQoaW9hZGRyLCBtbXJvZmYoMCwgbW1yX3Rocl9wcmVfc2V0KSwgJm0ubW1yX3Rocl9wcmVfc2V0LAorCQkgNCk7CisKKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mcmVlemUpLCAwKTsKKworCS8qIENvcHkgZGF0YSB0byB3aXJlbGVzcyBzdHVmZi4gKi8KKwl3c3RhdHMtPnN0YXR1cyA9IG0ubW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVUzsKKwl3c3RhdHMtPnF1YWwucXVhbCA9IG0ubW1yX3NnbmxfcXVhbCAmIE1NUl9TR05MX1FVQUw7CisJd3N0YXRzLT5xdWFsLmxldmVsID0gbS5tbXJfc2lnbmFsX2x2bCAmIE1NUl9TSUdOQUxfTFZMOworCXdzdGF0cy0+cXVhbC5ub2lzZSA9IG0ubW1yX3NpbGVuY2VfbHZsICYgTU1SX1NJTEVOQ0VfTFZMOworCXdzdGF0cy0+cXVhbC51cGRhdGVkID0gKCgobS4gbW1yX3NpZ25hbF9sdmwgJiBNTVJfU0lHTkFMX0xWTF9WQUxJRCkgPj4gNykgCisJCQl8ICgobS5tbXJfc2lnbmFsX2x2bCAmIE1NUl9TSUdOQUxfTFZMX1ZBTElEKSA+PiA2KSAKKwkJCXwgKChtLm1tcl9zaWxlbmNlX2x2bCAmIE1NUl9TSUxFTkNFX0xWTF9WQUxJRCkgPj4gNSkpOworCXdzdGF0cy0+ZGlzY2FyZC5ud2lkICs9IChtLm1tcl93cm9uZ19ud2lkX2ggPDwgOCkgfCBtLm1tcl93cm9uZ19ud2lkX2w7CisJd3N0YXRzLT5kaXNjYXJkLmNvZGUgPSAwTDsKKwl3c3RhdHMtPmRpc2NhcmQubWlzYyA9IDBMOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyNpZmRlZiBERUJVR19JT0NUTF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX2dldF93aXJlbGVzc19zdGF0cygpXG4iLAorCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJcmV0dXJuICZscC0+d3N0YXRzOworfQorI2VuZGlmCQkJCS8qIFdJUkVMRVNTX0VYVCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBQQUNLRVQgUkVDRVBUSU9OICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyBwYXJ0IGRlYWxzIHdpdGggcmVjZWl2aW5nIHRoZSBwYWNrZXRzLgorICogVGhlIGludGVycnVwdCBoYW5kbGVyIGdldHMgYW4gaW50ZXJydXB0IHdoZW4gYSBwYWNrZXQgaGFzIGJlZW4KKyAqIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBhbmQgY2FsbHMgdGhpcyBwYXJ0LgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIHJvdXRpbmUgZG9lcyB0aGUgYWN0dWFsIGNvcHlpbmcgb2YgZGF0YSAoaW5jbHVkaW5nIHRoZSBFdGhlcm5ldAorICogaGVhZGVyIHN0cnVjdHVyZSkgZnJvbSB0aGUgV2F2ZUxBTiBjYXJkIHRvIGFuIHNrX2J1ZmYgY2hhaW4gdGhhdAorICogd2lsbCBiZSBwYXNzZWQgdXAgdG8gdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGxheWVyLiBOT1RFOiB3ZQorICogY3VycmVudGx5IGRvbid0IGhhbmRsZSB0cmFpbGVyIHByb3RvY29scyAobmVpdGhlciBkb2VzIHRoZSByZXN0IG9mCisgKiB0aGUgbmV0d29yayBpbnRlcmZhY2UpLCBzbyBpZiB0aGF0IGlzIG5lZWRlZCwgaXQgd2lsbCAoYXQgbGVhc3QgaW4KKyAqIHBhcnQpIGJlIGFkZGVkIGhlcmUuICBUaGUgY29udGVudHMgb2YgdGhlIHJlY2VpdmUgcmluZyBidWZmZXIgYXJlCisgKiBjb3BpZWQgdG8gYSBtZXNzYWdlIGNoYWluIHRoYXQgaXMgdGhlbiBwYXNzZWQgdG8gdGhlIGtlcm5lbC4KKyAqCisgKiBOb3RlOiBpZiBhbnkgZXJyb3JzIG9jY3VyLCB0aGUgcGFja2V0IGlzICJkcm9wcGVkIG9uIHRoZSBmbG9vciIuCisgKiAoY2FsbGVkIGJ5IHd2X3BhY2tldF9yY3YoKSkKKyAqLworc3RhdGljIGlubGluZSB2b2lkCit3dl9wYWNrZXRfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgdTE2IGJ1Zl9vZmYsIGludCBza3NpemUpCit7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworI2lmZGVmIERFQlVHX1JYX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X3BhY2tldF9yZWFkKDB4JVgsICVkKVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBidWZfb2ZmLCBza3NpemUpOworI2VuZGlmCisKKwkvKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBkYXRhICovCisJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKHNrc2l6ZSkpID09IChzdHJ1Y3Qgc2tfYnVmZiAqKSBOVUxMKSB7CisjaWZkZWYgREVCVUdfUlhfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiB3dl9wYWNrZXRfcmVhZCgpOiBjb3VsZCBub3QgYWxsb2Nfc2tiKCVkLCBHRlBfQVRPTUlDKS5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHNrc2l6ZSk7CisjZW5kaWYKKwkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKworCXNrYi0+ZGV2ID0gZGV2OworCisJLyogQ29weSB0aGUgcGFja2V0IHRvIHRoZSBidWZmZXIuICovCisJb2JyYW1fcmVhZChpb2FkZHIsIGJ1Zl9vZmYsIHNrYl9wdXQoc2tiLCBza3NpemUpLCBza3NpemUpOworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisKKyNpZmRlZiBERUJVR19SWF9JTkZPCisJd3ZfcGFja2V0X2luZm8oc2tiLT5tYWMucmF3LCBza3NpemUsIGRldi0+bmFtZSwgInd2X3BhY2tldF9yZWFkIik7CisjZW5kaWYJCQkJLyogREVCVUdfUlhfSU5GTyAqLworCisJLyogU3RhdGlzdGljcy1nYXRoZXJpbmcgYW5kIGFzc29jaWF0ZWQgc3R1ZmYuCisJICogSXQgc2VlbSBhIGJpdCBtZXNzeSB3aXRoIGFsbCB0aGUgZGVmaW5lLCBidXQgaXQncyByZWFsbHkKKwkgKiBzaW1wbGUuLi4gKi8KKwlpZiAoCisjaWZkZWYgSVdfV0lSRUxFU1NfU1BZCQkvKiBkZWZpbmVkIGluIGl3X2hhbmRsZXIuaCAqLworCQkgICAobHAtPnNweV9kYXRhLnNweV9udW1iZXIgPiAwKSB8fAorI2VuZGlmIC8qIElXX1dJUkVMRVNTX1NQWSAqLworI2lmZGVmIEhJU1RPR1JBTQorCQkgICAobHAtPmhpc19udW1iZXIgPiAwKSB8fAorI2VuZGlmIC8qIEhJU1RPR1JBTSAqLworCQkgICAwKSB7CisJCXU4IHN0YXRzWzNdOwkvKiBzaWduYWwgbGV2ZWwsIG5vaXNlIGxldmVsLCBzaWduYWwgcXVhbGl0eSAqLworCisJCS8qIFJlYWQgc2lnbmFsIGxldmVsLCBzaWxlbmNlIGxldmVsIGFuZCBzaWduYWwgcXVhbGl0eSBieXRlcyAqLworCQkvKiBOb3RlOiBpbiB0aGUgUENNQ0lBIGhhcmR3YXJlLCB0aGVzZSBhcmUgcGFydCBvZiB0aGUgZnJhbWUuCisJCSAqIEl0IHNlZW1zIHRoYXQgZm9yIHRoZSBJU0EgaGFyZHdhcmUsIGl0J3Mgbm93aGVyZSB0byBiZQorCQkgKiBmb3VuZCBpbiB0aGUgZnJhbWUsIHNvIEknbSBvYmxpZ2VkIHRvIGRvIHRoaXMgKGl0IGhhcyBhCisJCSAqIHNpZGUgZWZmZWN0IG9uIC9wcm9jL25ldC93aXJlbGVzcykuCisJCSAqIEFueSBpZGVhcz8KKwkJICovCisJCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZyZWV6ZSksIDEpOworCQltbWNfcmVhZChpb2FkZHIsIG1tcm9mZigwLCBtbXJfc2lnbmFsX2x2bCksIHN0YXRzLCAzKTsKKwkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZnJlZXplKSwgMCk7CisKKyNpZmRlZiBERUJVR19SWF9JTkZPCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6IHd2X3BhY2tldF9yZWFkKCk6IFNpZ25hbCBsZXZlbCAlZC82MywgU2lsZW5jZSBsZXZlbCAlZC82Mywgc2lnbmFsIHF1YWxpdHkgJWQvMTZcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHN0YXRzWzBdICYgMHgzRiwgc3RhdHNbMV0gJiAweDNGLAorCQkgICAgICAgc3RhdHNbMl0gJiAweDBGKTsKKyNlbmRpZgorCisJCS8qIFNweWluZyBzdHVmZiAqLworI2lmZGVmIElXX1dJUkVMRVNTX1NQWQorCQl3bF9zcHlfZ2F0aGVyKGRldiwgc2tiLT5tYWMucmF3ICsgV0FWRUxBTl9BRERSX1NJWkUsCisJCQkgICAgICBzdGF0cyk7CisjZW5kaWYgLyogSVdfV0lSRUxFU1NfU1BZICovCisjaWZkZWYgSElTVE9HUkFNCisJCXdsX2hpc19nYXRoZXIoZGV2LCBzdGF0cyk7CisjZW5kaWYgLyogSElTVE9HUkFNICovCisJfQorCisJLyoKKwkgKiBIYW5kIHRoZSBwYWNrZXQgdG8gdGhlIG5ldHdvcmsgbW9kdWxlLgorCSAqLworCW5ldGlmX3J4KHNrYik7CisKKwkvKiBLZWVwIHN0YXRpc3RpY3MgdXAgdG8gZGF0ZSAqLworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlscC0+c3RhdHMucnhfYnl0ZXMgKz0gc2tzaXplOworCisjaWZkZWYgREVCVUdfUlhfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfcGFja2V0X3JlYWQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVHJhbnNmZXIgYXMgbWFueSBwYWNrZXRzIGFzIHdlIGNhbgorICogZnJvbSB0aGUgZGV2aWNlIFJBTS4KKyAqIChjYWxsZWQgaW4gd2F2ZWxhbl9pbnRlcnJ1cHQoKSkuCisgKiBOb3RlIDogdGhlIHNwaW5sb2NrIGlzIGFscmVhZHkgZ3JhYmJlZCBmb3IgdXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3dl9yZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCWZkX3QgZmQ7CisJcmJkX3QgcmJkOworCWludCBucmVhcGVkID0gMDsKKworI2lmZGVmIERFQlVHX1JYX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X3JlY2VpdmUoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogTG9vcCBvbiBlYWNoIHJlY2VpdmVkIHBhY2tldC4gKi8KKwlmb3IgKDs7KSB7CisJCW9icmFtX3JlYWQoaW9hZGRyLCBscC0+cnhfaGVhZCwgKHVuc2lnbmVkIGNoYXIgKikgJmZkLAorCQkJICAgc2l6ZW9mKGZkKSk7CisKKwkJLyogTm90ZSBhYm91dCB0aGUgc3RhdHVzIDoKKwkJICogSXQgc3RhcnQgdXAgdG8gYmUgMCAodGhlIHZhbHVlIHdlIHNldCkuIFRoZW4sIHdoZW4gdGhlIFJVCisJCSAqIGdyYWIgdGhlIGJ1ZmZlciB0byBwcmVwYXJlIGZvciByZWNlcHRpb24sIGl0IHNldHMgdGhlCisJCSAqIEZEX1NUQVRVU19CIGZsYWcuIFdoZW4gdGhlIFJVIGhhcyBmaW5pc2hlZCByZWNlaXZpbmcgdGhlCisJCSAqIGZyYW1lLCBpdCBjbGVhcnMgRkRfU1RBVFVTX0IsIHNldCBGRF9TVEFUVVNfQyB0byBpbmRpY2F0ZQorCQkgKiBjb21wbGV0aW9uIGFuZCBzZXQgdGhlIG90aGVyIGZsYWdzIHRvIGluZGljYXRlIHRoZSBldmVudHVhbAorCQkgKiBlcnJvcnMuIEZEX1NUQVRVU19PSyBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVjZXB0aW9uIHdhcyBPSy4KKwkJICovCisKKwkJLyogSWYgdGhlIGN1cnJlbnQgZnJhbWUgaXMgbm90IGNvbXBsZXRlLCB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZC4gKi8KKwkJaWYgKChmZC5mZF9zdGF0dXMgJiBGRF9TVEFUVVNfQykgIT0gRkRfU1RBVFVTX0MpCisJCQlicmVhazsJLyogVGhpcyBpcyBob3cgd2UgZXhpdCB0aGUgbG9vcC4gKi8KKworCQlucmVhcGVkKys7CisKKwkJLyogQ2hlY2sgd2hldGhlciBmcmFtZSB3YXMgY29ycmVjdGx5IHJlY2VpdmVkLiAqLworCQlpZiAoKGZkLmZkX3N0YXR1cyAmIEZEX1NUQVRVU19PSykgPT0gRkRfU1RBVFVTX09LKSB7CisJCQkvKiBEb2VzIHRoZSBmcmFtZSBjb250YWluIGEgcG9pbnRlciB0byB0aGUgZGF0YT8gIExldCdzIGNoZWNrLiAqLworCQkJaWYgKGZkLmZkX3JiZF9vZmZzZXQgIT0gSTgyNTg2TlVMTCkgeworCQkJCS8qIFJlYWQgdGhlIHJlY2VpdmUgYnVmZmVyIGRlc2NyaXB0b3IgKi8KKwkJCQlvYnJhbV9yZWFkKGlvYWRkciwgZmQuZmRfcmJkX29mZnNldCwKKwkJCQkJICAgKHVuc2lnbmVkIGNoYXIgKikgJnJiZCwKKwkJCQkJICAgc2l6ZW9mKHJiZCkpOworCisjaWZkZWYgREVCVUdfUlhfRVJST1IKKwkJCQlpZiAoKHJiZC5yYmRfc3RhdHVzICYgUkJEX1NUQVRVU19FT0YpICE9CisJCQkJICAgIFJCRF9TVEFUVVNfRU9GKSBwcmludGsoS0VSTl9JTkZPCisJCQkJCQkJICAgIiVzOiB3dl9yZWNlaXZlKCk6IG1pc3NpbmcgRU9GIGZsYWcuXG4iLAorCQkJCQkJCSAgIGRldi0+bmFtZSk7CisKKwkJCQlpZiAoKHJiZC5yYmRfc3RhdHVzICYgUkJEX1NUQVRVU19GKSAhPQorCQkJCSAgICBSQkRfU1RBVFVTX0YpIHByaW50ayhLRVJOX0lORk8KKwkJCQkJCQkgIiVzOiB3dl9yZWNlaXZlKCk6IG1pc3NpbmcgRiBmbGFnLlxuIiwKKwkJCQkJCQkgZGV2LT5uYW1lKTsKKyNlbmRpZgkJCQkvKiBERUJVR19SWF9FUlJPUiAqLworCisJCQkJLyogUmVhZCB0aGUgcGFja2V0IGFuZCB0cmFuc21pdCB0byBMaW51eCAqLworCQkJCXd2X3BhY2tldF9yZWFkKGRldiwgcmJkLnJiZF9idWZsLAorCQkJCQkgICAgICAgcmJkLgorCQkJCQkgICAgICAgcmJkX3N0YXR1cyAmCisJCQkJCSAgICAgICBSQkRfU1RBVFVTX0FDTlQpOworCQkJfQorI2lmZGVmIERFQlVHX1JYX0VSUk9SCisJCQllbHNlCS8qIGlmIGZyYW1lIGhhcyBubyBkYXRhICovCisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSAgICAgICAiJXM6IHd2X3JlY2VpdmUoKTogZnJhbWUgaGFzIG5vIGRhdGEuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCX0gZWxzZSB7CS8qIElmIHJlY2VwdGlvbiB3YXMgbm8gc3VjY2Vzc2Z1bCAqLworCisJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisKKyNpZmRlZiBERUJVR19SWF9JTkZPCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICIlczogd3ZfcmVjZWl2ZSgpOiBmcmFtZSBub3QgcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5ICglWCkuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZmQuZmRfc3RhdHVzKTsKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfUlhfRVJST1IKKwkJCWlmICgoZmQuZmRfc3RhdHVzICYgRkRfU1RBVFVTX1M2KSAhPSAwKQorCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkgICAgICAgIiVzOiB3dl9yZWNlaXZlKCk6IG5vIEVPRiBmbGFnLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJCQlpZiAoKGZkLmZkX3N0YXR1cyAmIEZEX1NUQVRVU19TNykgIT0gMCkgeworCQkJCWxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfUlhfRkFJTAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogd3ZfcmVjZWl2ZSgpOiBmcmFtZSB0b28gc2hvcnQuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQl9CisKKwkJCWlmICgoZmQuZmRfc3RhdHVzICYgRkRfU1RBVFVTX1M4KSAhPSAwKSB7CisJCQkJbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfUlhfRkFJTAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogd3ZfcmVjZWl2ZSgpOiByeCBETUEgb3ZlcnJ1bi5cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJCX0KKworCQkJaWYgKChmZC5mZF9zdGF0dXMgJiBGRF9TVEFUVVNfUzkpICE9IDApIHsKKwkJCQlscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKyNpZmRlZiBERUJVR19SWF9GQUlMCisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkgICAgICAgIiVzOiB3dl9yZWNlaXZlKCk6IHJhbiBvdXQgb2YgcmVzb3VyY2VzLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkJfQorCisJCQlpZiAoKGZkLmZkX3N0YXR1cyAmIEZEX1NUQVRVU19TMTApICE9IDApIHsKKwkJCQlscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfUlhfRkFJTAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogd3ZfcmVjZWl2ZSgpOiBhbGlnbm1lbnQgZXJyb3IuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQl9CisKKwkJCWlmICgoZmQuZmRfc3RhdHVzICYgRkRfU1RBVFVTX1MxMSkgIT0gMCkgeworCQkJCWxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfUlhfRkFJTAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogd3ZfcmVjZWl2ZSgpOiBDUkMgZXJyb3IuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQl9CisJCX0KKworCQlmZC5mZF9zdGF0dXMgPSAwOworCQlvYnJhbV93cml0ZShpb2FkZHIsIGZkb2ZmKGxwLT5yeF9oZWFkLCBmZF9zdGF0dXMpLAorCQkJICAgICh1bnNpZ25lZCBjaGFyICopICZmZC5mZF9zdGF0dXMsCisJCQkgICAgc2l6ZW9mKGZkLmZkX3N0YXR1cykpOworCisJCWZkLmZkX2NvbW1hbmQgPSBGRF9DT01NQU5EX0VMOworCQlvYnJhbV93cml0ZShpb2FkZHIsIGZkb2ZmKGxwLT5yeF9oZWFkLCBmZF9jb21tYW5kKSwKKwkJCSAgICAodW5zaWduZWQgY2hhciAqKSAmZmQuZmRfY29tbWFuZCwKKwkJCSAgICBzaXplb2YoZmQuZmRfY29tbWFuZCkpOworCisJCWZkLmZkX2NvbW1hbmQgPSAwOworCQlvYnJhbV93cml0ZShpb2FkZHIsIGZkb2ZmKGxwLT5yeF9sYXN0LCBmZF9jb21tYW5kKSwKKwkJCSAgICAodW5zaWduZWQgY2hhciAqKSAmZmQuZmRfY29tbWFuZCwKKwkJCSAgICBzaXplb2YoZmQuZmRfY29tbWFuZCkpOworCisJCWxwLT5yeF9sYXN0ID0gbHAtPnJ4X2hlYWQ7CisJCWxwLT5yeF9oZWFkID0gZmQuZmRfbGlua19vZmZzZXQ7CisJfQkJCS8qIGZvcig7OykgLT4gbG9vcCBvbiBhbGwgZnJhbWVzICovCisKKyNpZmRlZiBERUJVR19SWF9JTkZPCisJaWYgKG5yZWFwZWQgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHd2X3JlY2VpdmUoKTogcmVhcGVkICVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBucmVhcGVkKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHX1JYX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X3JlY2VpdmUoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKiogUEFDS0VUIFRSQU5TTUlTU0lPTiAqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIHBhcnQgZGVhbHMgd2l0aCBzZW5kaW5nIHBhY2tldHMgdGhyb3VnaCB0aGUgV2F2ZUxBTi4KKyAqCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoaXMgcm91dGluZSBmaWxscyBpbiB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXJzIGFuZCBtZW1vcnkKKyAqIGxvY2F0aW9ucyBvbiB0aGUgV2F2ZUxBTiBjYXJkIGFuZCBzdGFydHMgdGhlIGNhcmQgb2ZmIG9uCisgKiB0aGUgdHJhbnNtaXQuCisgKgorICogVGhlIHByaW5jaXBsZToKKyAqIEVhY2ggYmxvY2sgY29udGFpbnMgYSB0cmFuc21pdCBjb21tYW5kLCBhIE5PUCBjb21tYW5kLAorICogYSB0cmFuc21pdCBibG9jayBkZXNjcmlwdG9yIGFuZCBhIGJ1ZmZlci4KKyAqIFRoZSBDVSByZWFkIHRoZSB0cmFuc21pdCBibG9jayB3aGljaCBwb2ludCB0byB0aGUgdGJkLAorICogcmVhZCB0aGUgdGJkIGFuZCB0aGUgY29udGVudCBvZiB0aGUgYnVmZmVyLgorICogV2hlbiBpdCBoYXMgZmluaXNoIHdpdGggaXQsIGl0IGdvZXMgdG8gdGhlIG5leHQgY29tbWFuZAorICogd2hpY2ggaW4gb3VyIGNhc2UgaXMgdGhlIE5PUC4gVGhlIE5PUCBwb2ludHMgb24gaXRzZWxmLAorICogc28gdGhlIENVIHN0b3AgaGVyZS4KKyAqIFdoZW4gd2UgYWRkIHRoZSBuZXh0IGJsb2NrLCB3ZSBtb2RpZnkgdGhlIHByZXZpb3VzIG5vcAorICogdG8gbWFrZSBpdCBwb2ludCBvbiB0aGUgbmV3IHR4IGNvbW1hbmQuCisgKiBTaW1wbGUsIGlzbid0IGl0ID8KKyAqCisgKiAoY2FsbGVkIGluIHdhdmVsYW5fcGFja2V0X3htaXQoKSkKKyAqLworc3RhdGljIGlubGluZSBpbnQgd3ZfcGFja2V0X3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCB2b2lkICpidWYsIHNob3J0IGxlbmd0aCkKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBzaG9ydCB0eGJsb2NrOworCXVuc2lnbmVkIHNob3J0IHR4cHJlZDsKKwl1bnNpZ25lZCBzaG9ydCB0eF9hZGRyOworCXVuc2lnbmVkIHNob3J0IG5vcF9hZGRyOworCXVuc2lnbmVkIHNob3J0IHRiZF9hZGRyOworCXVuc2lnbmVkIHNob3J0IGJ1Zl9hZGRyOworCWFjX3R4X3QgdHg7CisJYWNfbm9wX3Qgbm9wOworCXRiZF90IHRiZDsKKwlpbnQgY2xlbiA9IGxlbmd0aDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgREVCVUdfVFhfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfcGFja2V0X3dyaXRlKCVkKVxuIiwgZGV2LT5uYW1lLAorCSAgICAgICBsZW5ndGgpOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayBub3RoaW5nIGJhZCBoYXMgaGFwcGVuZWQgKi8KKwlpZiAobHAtPnR4X25faW5fdXNlID09IChOVFhCTE9DS1MgLSAxKSkgeworI2lmZGVmIERFQlVHX1RYX0VSUk9SCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiB3dl9wYWNrZXRfd3JpdGUoKTogVHggcXVldWUgZnVsbC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBDYWxjdWxhdGUgYWRkcmVzc2VzIG9mIG5leHQgYmxvY2sgYW5kIHByZXZpb3VzIGJsb2NrLiAqLworCXR4YmxvY2sgPSBscC0+dHhfZmlyc3RfZnJlZTsKKwl0eHByZWQgPSB0eGJsb2NrIC0gVFhCTE9DS1o7CisJaWYgKHR4cHJlZCA8IE9GRlNFVF9DVSkKKwkJdHhwcmVkICs9IE5UWEJMT0NLUyAqIFRYQkxPQ0taOworCWxwLT50eF9maXJzdF9mcmVlICs9IFRYQkxPQ0taOworCWlmIChscC0+dHhfZmlyc3RfZnJlZSA+PSBPRkZTRVRfQ1UgKyBOVFhCTE9DS1MgKiBUWEJMT0NLWikKKwkJbHAtPnR4X2ZpcnN0X2ZyZWUgLT0gTlRYQkxPQ0tTICogVFhCTE9DS1o7CisKKwlscC0+dHhfbl9pbl91c2UrKzsKKworCS8qIENhbGN1bGF0ZSBhZGRyZXNzZXMgb2YgdGhlIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgYmxvY2suICovCisJdHhfYWRkciA9IHR4YmxvY2s7CisJbm9wX2FkZHIgPSB0eF9hZGRyICsgc2l6ZW9mKHR4KTsKKwl0YmRfYWRkciA9IG5vcF9hZGRyICsgc2l6ZW9mKG5vcCk7CisJYnVmX2FkZHIgPSB0YmRfYWRkciArIHNpemVvZih0YmQpOworCisJLyoKKwkgKiBUcmFuc21pdCBjb21tYW5kCisJICovCisJdHgudHhfaC5hY19zdGF0dXMgPSAwOworCW9icmFtX3dyaXRlKGlvYWRkciwgdG9mZihhY190eF90LCB0eF9hZGRyLCB0eF9oLmFjX3N0YXR1cyksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmdHgudHhfaC5hY19zdGF0dXMsCisJCSAgICBzaXplb2YodHgudHhfaC5hY19zdGF0dXMpKTsKKworCS8qCisJICogTk9QIGNvbW1hbmQKKwkgKi8KKwlub3Aubm9wX2guYWNfc3RhdHVzID0gMDsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHRvZmYoYWNfbm9wX3QsIG5vcF9hZGRyLCBub3BfaC5hY19zdGF0dXMpLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJm5vcC5ub3BfaC5hY19zdGF0dXMsCisJCSAgICBzaXplb2Yobm9wLm5vcF9oLmFjX3N0YXR1cykpOworCW5vcC5ub3BfaC5hY19saW5rID0gbm9wX2FkZHI7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCB0b2ZmKGFjX25vcF90LCBub3BfYWRkciwgbm9wX2guYWNfbGluayksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmbm9wLm5vcF9oLmFjX2xpbmssCisJCSAgICBzaXplb2Yobm9wLm5vcF9oLmFjX2xpbmspKTsKKworCS8qCisJICogVHJhbnNtaXQgYnVmZmVyIGRlc2NyaXB0b3IKKwkgKi8KKwl0YmQudGJkX3N0YXR1cyA9IFRCRF9TVEFUVVNfRU9GIHwgKFRCRF9TVEFUVVNfQUNOVCAmIGNsZW4pOworCXRiZC50YmRfbmV4dF9iZF9vZmZzZXQgPSBJODI1ODZOVUxMOworCXRiZC50YmRfYnVmbCA9IGJ1Zl9hZGRyOworCXRiZC50YmRfYnVmaCA9IDA7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCB0YmRfYWRkciwgKHVuc2lnbmVkIGNoYXIgKikgJnRiZCwgc2l6ZW9mKHRiZCkpOworCisJLyoKKwkgKiBEYXRhCisJICovCisJb2JyYW1fd3JpdGUoaW9hZGRyLCBidWZfYWRkciwgYnVmLCBsZW5ndGgpOworCisJLyoKKwkgKiBPdmVyd3JpdGUgdGhlIHByZWRlY2Vzc29yIE5PUCBsaW5rCisJICogc28gdGhhdCBpdCBwb2ludHMgdG8gdGhpcyB0eGJsb2NrLgorCSAqLworCW5vcF9hZGRyID0gdHhwcmVkICsgc2l6ZW9mKHR4KTsKKwlub3Aubm9wX2guYWNfc3RhdHVzID0gMDsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHRvZmYoYWNfbm9wX3QsIG5vcF9hZGRyLCBub3BfaC5hY19zdGF0dXMpLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJm5vcC5ub3BfaC5hY19zdGF0dXMsCisJCSAgICBzaXplb2Yobm9wLm5vcF9oLmFjX3N0YXR1cykpOworCW5vcC5ub3BfaC5hY19saW5rID0gdHhibG9jazsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHRvZmYoYWNfbm9wX3QsIG5vcF9hZGRyLCBub3BfaC5hY19saW5rKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZub3Aubm9wX2guYWNfbGluaywKKwkJICAgIHNpemVvZihub3Aubm9wX2guYWNfbGluaykpOworCisJLyogTWFrZSBzdXJlIHRoZSB3YXRjaGRvZyB3aWxsIGtlZXAgcXVpZXQgZm9yIGEgd2hpbGUgKi8KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIEtlZXAgc3RhdHMgdXAgdG8gZGF0ZS4gKi8KKwlscC0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuZ3RoOworCisJaWYgKGxwLT50eF9maXJzdF9pbl91c2UgPT0gSTgyNTg2TlVMTCkKKwkJbHAtPnR4X2ZpcnN0X2luX3VzZSA9IHR4YmxvY2s7CisKKwlpZiAobHAtPnR4X25faW5fdXNlIDwgTlRYQkxPQ0tTIC0gMSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisjaWZkZWYgREVCVUdfVFhfSU5GTworCXd2X3BhY2tldF9pbmZvKCh1OCAqKSBidWYsIGxlbmd0aCwgZGV2LT5uYW1lLAorCQkgICAgICAgInd2X3BhY2tldF93cml0ZSIpOworI2VuZGlmCQkJCS8qIERFQlVHX1RYX0lORk8gKi8KKworI2lmZGVmIERFQlVHX1RYX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X3BhY2tldF93cml0ZSgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiB3ZSB3YW50IHRvIHNlbmQgYSBwYWNrZXQgKE5FVDMgY2FsbGJhY2spCisgKiBJbiB0aGlzIHJvdXRpbmUsIHdlIGNoZWNrIGlmIHRoZSBoYXJ3YXJlIGlzIHJlYWR5IHRvIGFjY2VwdAorICogdGhlIHBhY2tldC4gIFdlIGFsc28gcHJldmVudCByZWVudHJhbmNlLiAgVGhlbiB3ZSBjYWxsIHRoZSBmdW5jdGlvbgorICogdG8gc2VuZCB0aGUgcGFja2V0LgorICovCitzdGF0aWMgaW50IHdhdmVsYW5fcGFja2V0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBERUJVR19UWF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX3BhY2tldF94bWl0KDB4JVgpXG4iLCBkZXYtPm5hbWUsCisJICAgICAgICh1bnNpZ25lZCkgc2tiKTsKKyNlbmRpZgorCisJLyoKKwkgKiBCbG9jayBhIHRpbWVyLWJhc2VkIHRyYW5zbWl0IGZyb20gb3ZlcmxhcHBpbmcuCisJICogSW4gb3RoZXIgd29yZHMsIHByZXZlbnQgcmVlbnRlcmluZyB0aGlzIHJvdXRpbmUuCisJICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogSWYgc29tZWJvZHkgaGFzIGFza2VkIHRvIHJlY29uZmlndXJlIHRoZSBjb250cm9sbGVyLCAKKwkgKiB3ZSBjYW4gZG8gaXQgbm93LgorCSAqLworCWlmIChscC0+cmVjb25maWdfODI1ODYpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQl3dl84MjU4Nl9jb25maWcoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCS8qIENoZWNrIHRoYXQgd2UgY2FuIGNvbnRpbnVlICovCisJCWlmIChscC0+dHhfbl9pbl91c2UgPT0gKE5UWEJMT0NLUyAtIDEpKQorCQkJcmV0dXJuIDE7CisJfQorI2lmZGVmIERFQlVHX1RYX0VSUk9SCisJaWYgKHNrYi0+bmV4dCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2tiIGhhcyBuZXh0XG4iKTsKKyNlbmRpZgorCisJLyogRG8gd2UgbmVlZCBzb21lIHBhZGRpbmc/ICovCisJLyogTm90ZSA6IG9uIHdpcmVsZXNzIHRoZSBwcm9wYWdhdGlvbiB0aW1lIGlzIGluIHRoZSBvcmRlciBvZiAxdXMsCisJICogYW5kIHdlIGRvbid0IGhhdmUgdGhlIEV0aGVybmV0IHNwZWNpZmljIHJlcXVpcmVtZW50IG9mIGJlZWluZworCSAqIGFibGUgdG8gZGV0ZWN0IGNvbGxpc2lvbnMsIHRoZXJlZm9yZSBpbiB0aGVvcnkgd2UgZG9uJ3QgcmVhbGx5CisJICogbmVlZCB0byBwYWQuIEplYW4gSUkgKi8KKwlpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikgeworCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCX0KKworCS8qIFdyaXRlIHBhY2tldCBvbiB0aGUgY2FyZCAqLworCWlmKHd2X3BhY2tldF93cml0ZShkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pKQorCQlyZXR1cm4gMTsJLyogV2UgZmFpbGVkICovCisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKyNpZmRlZiBERUJVR19UWF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX3BhY2tldF94bWl0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqIEhBUkRXQVJFIENPTkZJR1VSQVRJT04gKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyBwYXJ0IGRvZXMgdGhlIHJlYWwgam9iIG9mIHN0YXJ0aW5nIGFuZCBjb25maWd1cmluZyB0aGUgaGFyZHdhcmUuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUm91dGluZSB0byBpbml0aWFsaXplIHRoZSBNb2RlbSBNYW5hZ2VtZW50IENvbnRyb2xsZXIuCisgKiAoY2FsbGVkIGJ5IHd2X2h3X3Jlc2V0KCkpCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHd2X21tY19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXBzYV90IHBzYTsKKwltbXdfdCBtOworCWludCBjb25maWd1cmVkOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X21tY19pbml0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCS8qIFJlYWQgdGhlIHBhcmFtZXRlciBzdG9yYWdlIGFyZWEuICovCisJcHNhX3JlYWQoaW9hZGRyLCBscC0+aGFjciwgMCwgKHVuc2lnbmVkIGNoYXIgKikgJnBzYSwgc2l6ZW9mKHBzYSkpOworCisjaWZkZWYgVVNFX1BTQV9DT05GSUcKKwljb25maWd1cmVkID0gcHNhLnBzYV9jb25mX3N0YXR1cyAmIDE7CisjZWxzZQorCWNvbmZpZ3VyZWQgPSAwOworI2VuZGlmCisKKwkvKiBJcyB0aGUgUFNBIGlzIG5vdCBjb25maWd1cmVkICovCisJaWYgKCFjb25maWd1cmVkKSB7CisJCS8qIFVzZXIgd2lsbCBiZSBhYmxlIHRvIGNvbmZpZ3VyZSBOV0lEIGxhdGVyICh3aXRoIGl3Y29uZmlnKS4gKi8KKwkJcHNhLnBzYV9ud2lkWzBdID0gMDsKKwkJcHNhLnBzYV9ud2lkWzFdID0gMDsKKworCQkvKiBubyBOV0lEIGNoZWNraW5nIHNpbmNlIE5XSUQgaXMgbm90IHNldCAqLworCQlwc2EucHNhX253aWRfc2VsZWN0ID0gMDsKKworCQkvKiBEaXNhYmxlIGVuY3J5cHRpb24gKi8KKwkJcHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCA9IDA7CisKKwkJLyogU2V0IHRvIHN0YW5kYXJkIHZhbHVlczoKKwkJICogMHgwNCBmb3IgQVQsCisJCSAqIDB4MDEgZm9yIE1DQSwKKwkJICogMHgwNCBmb3IgUENNQ0lBIGFuZCAyLjAwIGNhcmQgKEFUJlQgNDA3LTAyNDY4OS9FIGRvY3VtZW50KQorCQkgKi8KKwkJaWYgKHBzYS5wc2FfY29tcF9udW1iZXIgJiAxKQorCQkJcHNhLnBzYV90aHJfcHJlX3NldCA9IDB4MDE7CisJCWVsc2UKKwkJCXBzYS5wc2FfdGhyX3ByZV9zZXQgPSAweDA0OworCQlwc2EucHNhX3F1YWxpdHlfdGhyID0gMHgwMzsKKworCQkvKiBJdCBpcyBjb25maWd1cmVkICovCisJCXBzYS5wc2FfY29uZl9zdGF0dXMgfD0gMTsKKworI2lmZGVmIFVTRV9QU0FfQ09ORklHCisJCS8qIFdyaXRlIHRoZSBwc2EuICovCisJCXBzYV93cml0ZShpb2FkZHIsIGxwLT5oYWNyLAorCQkJICAoY2hhciAqKSBwc2EucHNhX253aWQgLSAoY2hhciAqKSAmcHNhLAorCQkJICAodW5zaWduZWQgY2hhciAqKSBwc2EucHNhX253aWQsIDQpOworCQlwc2Ffd3JpdGUoaW9hZGRyLCBscC0+aGFjciwKKwkJCSAgKGNoYXIgKikgJnBzYS5wc2FfdGhyX3ByZV9zZXQgLSAoY2hhciAqKSAmcHNhLAorCQkJICAodW5zaWduZWQgY2hhciAqKSAmcHNhLnBzYV90aHJfcHJlX3NldCwgMSk7CisJCXBzYV93cml0ZShpb2FkZHIsIGxwLT5oYWNyLAorCQkJICAoY2hhciAqKSAmcHNhLnBzYV9xdWFsaXR5X3RociAtIChjaGFyICopICZwc2EsCisJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX3F1YWxpdHlfdGhyLCAxKTsKKwkJcHNhX3dyaXRlKGlvYWRkciwgbHAtPmhhY3IsCisJCQkgIChjaGFyICopICZwc2EucHNhX2NvbmZfc3RhdHVzIC0gKGNoYXIgKikgJnBzYSwKKwkJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS5wc2FfY29uZl9zdGF0dXMsIDEpOworCQkvKiB1cGRhdGUgdGhlIFdhdmVsYW4gY2hlY2tzdW0gKi8KKwkJdXBkYXRlX3BzYV9jaGVja3N1bShkZXYsIGlvYWRkciwgbHAtPmhhY3IpOworI2VuZGlmCisJfQorCisJLyogWmVybyB0aGUgbW1jIHN0cnVjdHVyZS4gKi8KKwltZW1zZXQoJm0sIDB4MDAsIHNpemVvZihtKSk7CisKKwkvKiBDb3B5IFBTQSBpbmZvIHRvIHRoZSBtbWMuICovCisJbS5tbXdfbmV0d19pZF9sID0gcHNhLnBzYV9ud2lkWzFdOworCW0ubW13X25ldHdfaWRfaCA9IHBzYS5wc2FfbndpZFswXTsKKworCWlmIChwc2EucHNhX253aWRfc2VsZWN0ICYgMSkKKwkJbS5tbXdfbG9vcHRfc2VsID0gMHgwMDsKKwllbHNlCisJCW0ubW13X2xvb3B0X3NlbCA9IE1NV19MT09QVF9TRUxfRElTX05XSUQ7CisKKwltZW1jcHkoJm0ubW13X2VuY3Jfa2V5LCAmcHNhLnBzYV9lbmNyeXB0aW9uX2tleSwKKwkgICAgICAgc2l6ZW9mKG0ubW13X2VuY3Jfa2V5KSk7CisKKwlpZiAocHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCkKKwkJbS5tbXdfZW5jcl9lbmFibGUgPQorCQkgICAgTU1XX0VOQ1JfRU5BQkxFX0VOIHwgTU1XX0VOQ1JfRU5BQkxFX01PREU7CisJZWxzZQorCQltLm1td19lbmNyX2VuYWJsZSA9IDA7CisKKwltLm1td190aHJfcHJlX3NldCA9IHBzYS5wc2FfdGhyX3ByZV9zZXQgJiAweDNGOworCW0ubW13X3F1YWxpdHlfdGhyID0gcHNhLnBzYV9xdWFsaXR5X3RociAmIDB4MEY7CisKKwkvKgorCSAqIFNldCBkZWZhdWx0IG1vZGVtIGNvbnRyb2wgcGFyYW1ldGVycy4KKwkgKiBTZWUgTkNSIGRvY3VtZW50IDQwNy0wMDI0MzI2IFJldi4gQS4KKwkgKi8KKwltLm1td19qYWJiZXJfZW5hYmxlID0gMHgwMTsKKwltLm1td19mcmVlemUgPSAwOworCW0ubW13X2FudGVuX3NlbCA9IE1NV19BTlRFTl9TRUxfQUxHX0VOOworCW0ubW13X2lmcyA9IDB4MjA7CisJbS5tbXdfbW9kX2RlbGF5ID0gMHgwNDsKKwltLm1td19qYW1fdGltZSA9IDB4Mzg7CisKKwltLm1td19kZXNfaW9faW52ZXJ0ID0gMDsKKwltLm1td19kZWNheV9wcm0gPSAwOworCW0ubW13X2RlY2F5X3VwZGF0X3BybSA9IDA7CisKKwkvKiBXcml0ZSBhbGwgaW5mbyB0byBNTUMuICovCisJbW1jX3dyaXRlKGlvYWRkciwgMCwgKHU4ICopICYgbSwgc2l6ZW9mKG0pKTsKKworCS8qIFRoZSBmb2xsb3dpbmcgY29kZSBzdGFydHMgdGhlIG1vZGVtIG9mIHRoZSAyLjAwIGZyZXF1ZW5jeQorCSAqIHNlbGVjdGFibGUgY2FyZHMgYXQgcG93ZXIgb24uICBJdCdzIG5vdCBzdHJpY3RseSBuZWVkZWQgZm9yIHRoZQorCSAqIGZvbGxvd2luZyBib290cy4KKwkgKiBUaGUgb3JpZ2luYWwgcGF0Y2ggd2FzIGJ5IEpvZSBGaW5uZXkgZm9yIHRoZSBQQ01DSUEgZHJpdmVyLCBidXQKKwkgKiBJJ3ZlIGNsZWFuZWQgaXQgdXAgYSBiaXQgYW5kIGFkZGVkIGRvY3VtZW50YXRpb24uCisJICogVGhhbmtzIHRvIExvZWtlIEJyZWRlcnZlbGQgZnJvbSBMdWNlbnQgZm9yIHRoZSBpbmZvLgorCSAqLworCisJLyogQXR0ZW1wdCB0byByZWNvZ25pc2UgMi4wMCBjYXJkcyAoMi40IEdIeiBmcmVxdWVuY3kgc2VsZWN0YWJsZSkKKwkgKiBEb2VzIGl0IHdvcmsgZm9yIGV2ZXJ5Ym9keSwgZXNwZWNpYWxseSBvbGQgY2FyZHM/ICovCisJLyogTm90ZTogV0ZSRVFTRUwgdmVyaWZpZXMgdGhhdCBpdCBpcyBhYmxlIHRvIHJlYWQgYSBzZW5zaWJsZQorCSAqIGZyZXF1ZW5jeSBmcm9tIEVFUFJPTSAoYWRkcmVzcyAweDAwKSBhbmQgdGhhdCBNTVJfRkVFX1NUQVRVU19JRAorCSAqIGlzIDB4QSAoWGlsaW54IHZlcnNpb24pIG9yIDB4QiAoQXJpYWRuZSB2ZXJzaW9uKS4KKwkgKiBNeSB0ZXN0IGlzIG1vcmUgY3J1ZGUgYnV0IGRvZXMgd29yay4gKi8KKwlpZiAoIShtbWNfaW4oaW9hZGRyLCBtbXJvZmYoMCwgbW1yX2ZlZV9zdGF0dXMpKSAmCisJICAgICAgKE1NUl9GRUVfU1RBVFVTX0RXTEQgfCBNTVJfRkVFX1NUQVRVU19CVVNZKSkpIHsKKwkJLyogV2UgbXVzdCBkb3dubG9hZCB0aGUgZnJlcXVlbmN5IHBhcmFtZXRlcnMgdG8gdGhlCisJCSAqIHN5bnRoZXNpemVycyAoZnJvbSB0aGUgRUVQUk9NIC0gYXJlYSAxKQorCQkgKiBOb3RlOiBhcyB0aGUgRUVQUk9NIGlzIGF1dG9tYXRpY2FsbHkgZGVjcmVtZW50ZWQsIHdlIHNldCB0aGUgZW5kCisJCSAqIGlmIHRoZSBhcmVhLi4uICovCisJCW0ubW13X2ZlZV9hZGRyID0gMHgwRjsKKwkJbS5tbXdfZmVlX2N0cmwgPSBNTVdfRkVFX0NUUkxfUkVBRCB8IE1NV19GRUVfQ1RSTF9EV0xEOworCQltbWNfd3JpdGUoaW9hZGRyLCAoY2hhciAqKSAmbS5tbXdfZmVlX2N0cmwgLSAoY2hhciAqKSAmbSwKKwkJCSAgKHVuc2lnbmVkIGNoYXIgKikgJm0ubW13X2ZlZV9jdHJsLCAyKTsKKworCQkvKiBXYWl0IHVudGlsIHRoZSBkb3dubG9hZCBpcyBmaW5pc2hlZC4gKi8KKwkJZmVlX3dhaXQoaW9hZGRyLCAxMDAsIDEwMCk7CisKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworCQkvKiBUaGUgZnJlcXVlbmN5IHdhcyBpbiB0aGUgbGFzdCB3b3JkIGRvd25sb2FkZWQuICovCisJCW1tY19yZWFkKGlvYWRkciwgKGNoYXIgKikgJm0ubW13X2ZlZV9kYXRhX2wgLSAoY2hhciAqKSAmbSwKKwkJCSAodW5zaWduZWQgY2hhciAqKSAmbS5tbXdfZmVlX2RhdGFfbCwgMik7CisKKwkJLyogUHJpbnQgc29tZSBpbmZvIGZvciB0aGUgdXNlci4gKi8KKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICIlczogV2F2ZUxBTiAyLjAwIHJlY29nbmlzZWQgKGZyZXF1ZW5jeSBzZWxlY3QpLiAgQ3VycmVudCBmcmVxdWVuY3kgPSAlbGRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsCisJCSAgICAgICAoKG0uCisJCQkgbW13X2ZlZV9kYXRhX2ggPDwgNCkgfCAobS5tbXdfZmVlX2RhdGFfbCA+PiA0KSkgKgorCQkgICAgICAgNSAvIDIgKyAyNDAwMEwpOworI2VuZGlmCisKKwkJLyogV2UgbXVzdCBub3cgZG93bmxvYWQgdGhlIHBvd2VyIGFkanVzdCB2YWx1ZSAoZ2FpbikgdG8KKwkJICogdGhlIHN5bnRoZXNpemVycyAoZnJvbSB0aGUgRUVQUk9NIC0gYXJlYSA3IC0gREFDKS4gKi8KKwkJbS5tbXdfZmVlX2FkZHIgPSAweDYxOworCQltLm1td19mZWVfY3RybCA9IE1NV19GRUVfQ1RSTF9SRUFEIHwgTU1XX0ZFRV9DVFJMX0RXTEQ7CisJCW1tY193cml0ZShpb2FkZHIsIChjaGFyICopICZtLm1td19mZWVfY3RybCAtIChjaGFyICopICZtLAorCQkJICAodW5zaWduZWQgY2hhciAqKSAmbS5tbXdfZmVlX2N0cmwsIDIpOworCisJCS8qIFdhaXQgdW50aWwgdGhlIGRvd25sb2FkIGlzIGZpbmlzaGVkLiAqLworCX0KKwkvKiBpZiAyLjAwIGNhcmQgKi8KKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfbW1jX2luaXQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ29uc3RydWN0IHRoZSBmZCBhbmQgcmJkIHN0cnVjdHVyZXMuCisgKiBTdGFydCB0aGUgcmVjZWl2ZSB1bml0LgorICogKGNhbGxlZCBieSB3dl9od19yZXNldCgpKQorICovCitzdGF0aWMgaW5saW5lIGludCB3dl9ydV9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1MTYgc2NiX2NzOworCWZkX3QgZmQ7CisJcmJkX3QgcmJkOworCXUxNiByeDsKKwl1MTYgcnhfbmV4dDsKKwlpbnQgaTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9ydV9zdGFydCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlvYnJhbV9yZWFkKGlvYWRkciwgc2Nib2ZmKE9GRlNFVF9TQ0IsIHNjYl9zdGF0dXMpLAorCQkgICAodW5zaWduZWQgY2hhciAqKSAmc2NiX2NzLCBzaXplb2Yoc2NiX2NzKSk7CisJaWYgKChzY2JfY3MgJiBTQ0JfU1RfUlVTKSA9PSBTQ0JfU1RfUlVTX1JEWSkKKwkJcmV0dXJuIDA7CisKKwlscC0+cnhfaGVhZCA9IE9GRlNFVF9SVTsKKworCWZvciAoaSA9IDAsIHJ4ID0gbHAtPnJ4X2hlYWQ7IGkgPCBOUlhCTE9DS1M7IGkrKywgcnggPSByeF9uZXh0KSB7CisJCXJ4X25leHQgPQorCQkgICAgKGkgPT0gTlJYQkxPQ0tTIC0gMSkgPyBscC0+cnhfaGVhZCA6IHJ4ICsgUlhCTE9DS1o7CisKKwkJZmQuZmRfc3RhdHVzID0gMDsKKwkJZmQuZmRfY29tbWFuZCA9IChpID09IE5SWEJMT0NLUyAtIDEpID8gRkRfQ09NTUFORF9FTCA6IDA7CisJCWZkLmZkX2xpbmtfb2Zmc2V0ID0gcnhfbmV4dDsKKwkJZmQuZmRfcmJkX29mZnNldCA9IHJ4ICsgc2l6ZW9mKGZkKTsKKwkJb2JyYW1fd3JpdGUoaW9hZGRyLCByeCwgKHVuc2lnbmVkIGNoYXIgKikgJmZkLCBzaXplb2YoZmQpKTsKKworCQlyYmQucmJkX3N0YXR1cyA9IDA7CisJCXJiZC5yYmRfbmV4dF9yYmRfb2Zmc2V0ID0gSTgyNTg2TlVMTDsKKwkJcmJkLnJiZF9idWZsID0gcnggKyBzaXplb2YoZmQpICsgc2l6ZW9mKHJiZCk7CisJCXJiZC5yYmRfYnVmaCA9IDA7CisJCXJiZC5yYmRfZWxfc2l6ZSA9IFJCRF9FTCB8IChSQkRfU0laRSAmIE1BWERBVEFaKTsKKwkJb2JyYW1fd3JpdGUoaW9hZGRyLCByeCArIHNpemVvZihmZCksCisJCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJnJiZCwgc2l6ZW9mKHJiZCkpOworCisJCWxwLT5yeF9sYXN0ID0gcng7CisJfQorCisJb2JyYW1fd3JpdGUoaW9hZGRyLCBzY2JvZmYoT0ZGU0VUX1NDQiwgc2NiX3JmYV9vZmZzZXQpLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJmxwLT5yeF9oZWFkLCBzaXplb2YobHAtPnJ4X2hlYWQpKTsKKworCXNjYl9jcyA9IFNDQl9DTURfUlVDX0dPOworCW9icmFtX3dyaXRlKGlvYWRkciwgc2Nib2ZmKE9GRlNFVF9TQ0IsIHNjYl9jb21tYW5kKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZzY2JfY3MsIHNpemVvZihzY2JfY3MpKTsKKworCXNldF9jaGFuX2F0dG4oaW9hZGRyLCBscC0+aGFjcik7CisKKwlmb3IgKGkgPSAxMDAwOyBpID4gMDsgaS0tKSB7CisJCW9icmFtX3JlYWQoaW9hZGRyLCBzY2JvZmYoT0ZGU0VUX1NDQiwgc2NiX2NvbW1hbmQpLAorCQkJICAgKHVuc2lnbmVkIGNoYXIgKikgJnNjYl9jcywgc2l6ZW9mKHNjYl9jcykpOworCQlpZiAoc2NiX2NzID09IDApCisJCQlicmVhazsKKworCQl1ZGVsYXkoMTApOworCX0KKworCWlmIChpIDw9IDApIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiB3YXZlbGFuX3J1X3N0YXJ0KCk6IGJvYXJkIG5vdCBhY2NlcHRpbmcgY29tbWFuZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXJldHVybiAtMTsKKwl9CisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X3J1X3N0YXJ0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEluaXRpYWxpc2UgdGhlIHRyYW5zbWl0IGJsb2Nrcy4KKyAqIFN0YXJ0IHRoZSBjb21tYW5kIHVuaXQgZXhlY3V0aW5nIHRoZSBOT1AKKyAqIHNlbGYtbG9vcCBvZiB0aGUgZmlyc3QgdHJhbnNtaXQgYmxvY2suCisgKgorICogSGVyZSB3ZSBjcmVhdGUgdGhlIGxpc3Qgb2Ygc2VuZCBidWZmZXJzIHVzZWQgdG8gdHJhbnNtaXQgcGFja2V0cworICogYmV0d2VlbiB0aGUgUEMgYW5kIHRoZSBjb21tYW5kIHVuaXQuIEZvciBlYWNoIGJ1ZmZlciwgd2UgY3JlYXRlIGEKKyAqIGJ1ZmZlciBkZXNjcmlwdG9yIChwb2ludGluZyBvbiB0aGUgYnVmZmVyKSwgYSB0cmFuc21pdCBjb21tYW5kCisgKiAocG9pbnRpbmcgdG8gdGhlIGJ1ZmZlciBkZXNjcmlwdG9yKSBhbmQgYSBOT1AgY29tbWFuZC4KKyAqIFRoZSB0cmFuc21pdCBjb21tYW5kIGlzIGxpbmtlZCB0byB0aGUgTk9QLCBhbmQgdGhlIE5PUCB0byBpdHNlbGYuCisgKiBXaGVuIHdlIHdpbGwgaGF2ZSBmaW5pc2hlZCBleGVjdXRpbmcgdGhlIHRyYW5zbWl0IGNvbW1hbmQsIHdlIHdpbGwKKyAqIHRoZW4gbG9vcCBvbiB0aGUgTk9QLiBCeSByZWxlYXNpbmcgdGhlIE5PUCBsaW5rIHRvIGEgbmV3IGNvbW1hbmQsCisgKiB3ZSBtYXkgc2VuZCBhbm90aGVyIGJ1ZmZlci4KKyAqCisgKiAoY2FsbGVkIGJ5IHd2X2h3X3Jlc2V0KCkpCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHd2X2N1X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpOworCXUxNiB0eGJsb2NrOworCXUxNiBmaXJzdF9ub3A7CisJdTE2IHNjYl9jczsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9jdV9zdGFydCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlscC0+dHhfZmlyc3RfZnJlZSA9IE9GRlNFVF9DVTsKKwlscC0+dHhfZmlyc3RfaW5fdXNlID0gSTgyNTg2TlVMTDsKKworCWZvciAoaSA9IDAsIHR4YmxvY2sgPSBPRkZTRVRfQ1U7CisJICAgICBpIDwgTlRYQkxPQ0tTOyBpKyssIHR4YmxvY2sgKz0gVFhCTE9DS1opIHsKKwkJYWNfdHhfdCB0eDsKKwkJYWNfbm9wX3Qgbm9wOworCQl0YmRfdCB0YmQ7CisJCXVuc2lnbmVkIHNob3J0IHR4X2FkZHI7CisJCXVuc2lnbmVkIHNob3J0IG5vcF9hZGRyOworCQl1bnNpZ25lZCBzaG9ydCB0YmRfYWRkcjsKKwkJdW5zaWduZWQgc2hvcnQgYnVmX2FkZHI7CisKKwkJdHhfYWRkciA9IHR4YmxvY2s7CisJCW5vcF9hZGRyID0gdHhfYWRkciArIHNpemVvZih0eCk7CisJCXRiZF9hZGRyID0gbm9wX2FkZHIgKyBzaXplb2Yobm9wKTsKKwkJYnVmX2FkZHIgPSB0YmRfYWRkciArIHNpemVvZih0YmQpOworCisJCXR4LnR4X2guYWNfc3RhdHVzID0gMDsKKwkJdHgudHhfaC5hY19jb21tYW5kID0gYWNtZF90cmFuc21pdCB8IEFDX0NGTERfSTsKKwkJdHgudHhfaC5hY19saW5rID0gbm9wX2FkZHI7CisJCXR4LnR4X3RiZF9vZmZzZXQgPSB0YmRfYWRkcjsKKwkJb2JyYW1fd3JpdGUoaW9hZGRyLCB0eF9hZGRyLCAodW5zaWduZWQgY2hhciAqKSAmdHgsCisJCQkgICAgc2l6ZW9mKHR4KSk7CisKKwkJbm9wLm5vcF9oLmFjX3N0YXR1cyA9IDA7CisJCW5vcC5ub3BfaC5hY19jb21tYW5kID0gYWNtZF9ub3A7CisJCW5vcC5ub3BfaC5hY19saW5rID0gbm9wX2FkZHI7CisJCW9icmFtX3dyaXRlKGlvYWRkciwgbm9wX2FkZHIsICh1bnNpZ25lZCBjaGFyICopICZub3AsCisJCQkgICAgc2l6ZW9mKG5vcCkpOworCisJCXRiZC50YmRfc3RhdHVzID0gVEJEX1NUQVRVU19FT0Y7CisJCXRiZC50YmRfbmV4dF9iZF9vZmZzZXQgPSBJODI1ODZOVUxMOworCQl0YmQudGJkX2J1ZmwgPSBidWZfYWRkcjsKKwkJdGJkLnRiZF9idWZoID0gMDsKKwkJb2JyYW1fd3JpdGUoaW9hZGRyLCB0YmRfYWRkciwgKHVuc2lnbmVkIGNoYXIgKikgJnRiZCwKKwkJCSAgICBzaXplb2YodGJkKSk7CisJfQorCisJZmlyc3Rfbm9wID0KKwkgICAgT0ZGU0VUX0NVICsgKE5UWEJMT0NLUyAtIDEpICogVFhCTE9DS1ogKyBzaXplb2YoYWNfdHhfdCk7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCBzY2JvZmYoT0ZGU0VUX1NDQiwgc2NiX2NibF9vZmZzZXQpLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJmZpcnN0X25vcCwgc2l6ZW9mKGZpcnN0X25vcCkpOworCisJc2NiX2NzID0gU0NCX0NNRF9DVUNfR087CisJb2JyYW1fd3JpdGUoaW9hZGRyLCBzY2JvZmYoT0ZGU0VUX1NDQiwgc2NiX2NvbW1hbmQpLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJnNjYl9jcywgc2l6ZW9mKHNjYl9jcykpOworCisJc2V0X2NoYW5fYXR0bihpb2FkZHIsIGxwLT5oYWNyKTsKKworCWZvciAoaSA9IDEwMDA7IGkgPiAwOyBpLS0pIHsKKwkJb2JyYW1fcmVhZChpb2FkZHIsIHNjYm9mZihPRkZTRVRfU0NCLCBzY2JfY29tbWFuZCksCisJCQkgICAodW5zaWduZWQgY2hhciAqKSAmc2NiX2NzLCBzaXplb2Yoc2NiX2NzKSk7CisJCWlmIChzY2JfY3MgPT0gMCkKKwkJCWJyZWFrOworCisJCXVkZWxheSgxMCk7CisJfQorCisJaWYgKGkgPD0gMCkgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHdhdmVsYW5fY3Vfc3RhcnQoKTogYm9hcmQgbm90IGFjY2VwdGluZyBjb21tYW5kLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJcmV0dXJuIC0xOworCX0KKworCWxwLT50eF9uX2luX3VzZSA9IDA7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfY3Vfc3RhcnQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIGRvZXMgYSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIG9mIHRoZSBXYXZlTEFOIAorICogY29udHJvbGxlciAoaTgyNTg2KS4KKyAqCisgKiBJdCBpbml0aWFsaXNlcyB0aGUgc2NwLCBpc2NwIGFuZCBzY2Igc3RydWN0dXJlCisgKiBUaGUgZmlyc3QgdHdvIGFyZSBqdXN0IHBvaW50ZXJzIHRvIHRoZSBuZXh0LgorICogVGhlIGxhc3Qgb25lIGlzIHVzZWQgZm9yIGJhc2ljIGNvbmZpZ3VyYXRpb24gYW5kIGZvciBiYXNpYworICogY29tbXVuaWNhdGlvbiAoaW50ZXJydXB0IHN0YXR1cykuCisgKgorICogKGNhbGxlZCBieSB3dl9od19yZXNldCgpKQorICovCitzdGF0aWMgaW5saW5lIGludCB3dl84MjU4Nl9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzY3BfdCBzY3A7CQkvKiBzeXN0ZW0gY29uZmlndXJhdGlvbiBwb2ludGVyICovCisJaXNjcF90IGlzY3A7CQkvKiBpbnRlcm1lZGlhdGUgc2NwICovCisJc2NiX3Qgc2NiOwkJLyogc3lzdGVtIGNvbnRyb2wgYmxvY2sgKi8KKwlhY2hfdCBjYjsJCS8qIEFjdGlvbiBjb21tYW5kIGhlYWRlciAqLworCXU4IHplcm9lc1s1MTJdOworCWludCBpOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2XzgyNTg2X3N0YXJ0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCS8qCisJICogQ2xlYXIgdGhlIG9uYm9hcmQgUkFNLgorCSAqLworCW1lbXNldCgmemVyb2VzWzBdLCAweDAwLCBzaXplb2YoemVyb2VzKSk7CisJZm9yIChpID0gMDsgaSA8IEk4MjU4Nl9NRU1aOyBpICs9IHNpemVvZih6ZXJvZXMpKQorCQlvYnJhbV93cml0ZShpb2FkZHIsIGksICZ6ZXJvZXNbMF0sIHNpemVvZih6ZXJvZXMpKTsKKworCS8qCisJICogQ29uc3RydWN0IHRoZSBjb21tYW5kIHVuaXQgc3RydWN0dXJlczoKKwkgKiBzY3AsIGlzY3AsIHNjYiwgY2IuCisJICovCisJbWVtc2V0KCZzY3AsIDB4MDAsIHNpemVvZihzY3ApKTsKKwlzY3Auc2NwX3N5c2J1cyA9IFNDUF9TWV8xNkJCVVM7CisJc2NwLnNjcF9pc2NwbCA9IE9GRlNFVF9JU0NQOworCW9icmFtX3dyaXRlKGlvYWRkciwgT0ZGU0VUX1NDUCwgKHVuc2lnbmVkIGNoYXIgKikgJnNjcCwKKwkJICAgIHNpemVvZihzY3ApKTsKKworCW1lbXNldCgmaXNjcCwgMHgwMCwgc2l6ZW9mKGlzY3ApKTsKKwlpc2NwLmlzY3BfYnVzeSA9IDE7CisJaXNjcC5pc2NwX29mZnNldCA9IE9GRlNFVF9TQ0I7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCBPRkZTRVRfSVNDUCwgKHVuc2lnbmVkIGNoYXIgKikgJmlzY3AsCisJCSAgICBzaXplb2YoaXNjcCkpOworCisJLyogT3VyIGZpcnN0IGNvbW1hbmQgaXMgdG8gcmVzZXQgdGhlIGk4MjU4Ni4gKi8KKwltZW1zZXQoJnNjYiwgMHgwMCwgc2l6ZW9mKHNjYikpOworCXNjYi5zY2JfY29tbWFuZCA9IFNDQl9DTURfUkVTRVQ7CisJc2NiLnNjYl9jYmxfb2Zmc2V0ID0gT0ZGU0VUX0NVOworCXNjYi5zY2JfcmZhX29mZnNldCA9IE9GRlNFVF9SVTsKKwlvYnJhbV93cml0ZShpb2FkZHIsIE9GRlNFVF9TQ0IsICh1bnNpZ25lZCBjaGFyICopICZzY2IsCisJCSAgICBzaXplb2Yoc2NiKSk7CisKKwlzZXRfY2hhbl9hdHRuKGlvYWRkciwgbHAtPmhhY3IpOworCisJLyogV2FpdCBmb3IgY29tbWFuZCB0byBmaW5pc2guICovCisJZm9yIChpID0gMTAwMDsgaSA+IDA7IGktLSkgeworCQlvYnJhbV9yZWFkKGlvYWRkciwgT0ZGU0VUX0lTQ1AsICh1bnNpZ25lZCBjaGFyICopICZpc2NwLAorCQkJICAgc2l6ZW9mKGlzY3ApKTsKKworCQlpZiAoaXNjcC5pc2NwX2J1c3kgPT0gKHVuc2lnbmVkIHNob3J0KSAwKQorCQkJYnJlYWs7CisKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwlpZiAoaSA8PSAwKSB7CisjaWZkZWYgREVCVUdfQ09ORklHX0VSUk9SCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlczogd3ZfODI1ODZfc3RhcnQoKTogaXNjcF9idXN5IHRpbWVvdXQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQlyZXR1cm4gLTE7CisJfQorCisJLyogQ2hlY2sgY29tbWFuZCBjb21wbGV0aW9uLiAqLworCWZvciAoaSA9IDE1OyBpID4gMDsgaS0tKSB7CisJCW9icmFtX3JlYWQoaW9hZGRyLCBPRkZTRVRfU0NCLCAodW5zaWduZWQgY2hhciAqKSAmc2NiLAorCQkJICAgc2l6ZW9mKHNjYikpOworCisJCWlmIChzY2Iuc2NiX3N0YXR1cyA9PSAoU0NCX1NUX0NYIHwgU0NCX1NUX0NOQSkpCisJCQlicmVhazsKKworCQl1ZGVsYXkoMTApOworCX0KKworCWlmIChpIDw9IDApIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiB3dl84MjU4Nl9zdGFydCgpOiBzdGF0dXM6IGV4cGVjdGVkIDB4JTAyeCwgZ290IDB4JTAyeC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIFNDQl9TVF9DWCB8IFNDQl9TVF9DTkEsIHNjYi5zY2Jfc3RhdHVzKTsKKyNlbmRpZgorCQlyZXR1cm4gLTE7CisJfQorCisJd3ZfYWNrKGRldik7CisKKwkvKiBTZXQgdGhlIGFjdGlvbiBjb21tYW5kIGhlYWRlci4gKi8KKwltZW1zZXQoJmNiLCAweDAwLCBzaXplb2YoY2IpKTsKKwljYi5hY19jb21tYW5kID0gQUNfQ0ZMRF9FTCB8IChBQ19DRkxEX0NNRCAmIGFjbWRfZGlhZ25vc2UpOworCWNiLmFjX2xpbmsgPSBPRkZTRVRfQ1U7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCBPRkZTRVRfQ1UsICh1bnNpZ25lZCBjaGFyICopICZjYiwgc2l6ZW9mKGNiKSk7CisKKwlpZiAod3Zfc3luY2hyb25vdXNfY21kKGRldiwgImRpYWcoKSIpID09IC0xKQorCQlyZXR1cm4gLTE7CisKKwlvYnJhbV9yZWFkKGlvYWRkciwgT0ZGU0VUX0NVLCAodW5zaWduZWQgY2hhciAqKSAmY2IsIHNpemVvZihjYikpOworCWlmIChjYi5hY19zdGF0dXMgJiBBQ19TRkxEX0ZBSUwpIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiB3dl84MjU4Nl9zdGFydCgpOiBpODI1ODYgU2VsZiBUZXN0IGZhaWxlZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXJldHVybiAtMTsKKwl9CisjaWZkZWYgREVCVUdfSTgyNTg2X1NIT1cKKwl3dl9zY2Jfc2hvdyhpb2FkZHIpOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfODI1ODZfc3RhcnQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIGRvZXMgYSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIG9mIHRoZSBXYXZlTEFOCisgKiBjb250cm9sbGVyIChpODI1ODYpLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBhIHZpb2xlbnQgaGFjay4gV2UgdXNlIHRoZSBmaXJzdCBmcmVlIHRyYW5zbWl0IGJsb2NrCisgKiB0byBtYWtlIG91ciBjb25maWd1cmF0aW9uLiBJbiB0aGUgYnVmZmVyIGFyZWEsIHdlIGNyZWF0ZSB0aGUgdGhyZWUKKyAqIGNvbmZpZ3VyYXRpb24gY29tbWFuZHMgKGxpbmtlZCkuIFdlIG1ha2UgdGhlIHByZXZpb3VzIE5PUCBwb2ludCB0bworICogdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIGluc3RlYWQgb2YgdGhlIHR4IGNvbW1hbmQuIEFmdGVyLCB3ZSBnbworICogYXMgdXN1YWwgdG8gdGhlIE5PUCBjb21tYW5kLgorICogTm90ZSB0aGF0IG9ubHkgdGhlIGxhc3QgY29tbWFuZCAobWNfc2V0KSB3aWxsIGdlbmVyYXRlIGFuIGludGVycnVwdC4KKyAqCisgKiAoY2FsbGVkIGJ5IHd2X2h3X3Jlc2V0KCksIHd2XzgyNTg2X3JlY29uZmlnKCksIHdhdmVsYW5fcGFja2V0X3htaXQoKSkKKyAqLworc3RhdGljIHZvaWQgd3ZfODI1ODZfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIHNob3J0IHR4YmxvY2s7CisJdW5zaWduZWQgc2hvcnQgdHhwcmVkOworCXVuc2lnbmVkIHNob3J0IHR4X2FkZHI7CisJdW5zaWduZWQgc2hvcnQgbm9wX2FkZHI7CisJdW5zaWduZWQgc2hvcnQgdGJkX2FkZHI7CisJdW5zaWduZWQgc2hvcnQgY2ZnX2FkZHI7CisJdW5zaWduZWQgc2hvcnQgaWFzX2FkZHI7CisJdW5zaWduZWQgc2hvcnQgbWNzX2FkZHI7CisJYWNfdHhfdCB0eDsKKwlhY19ub3BfdCBub3A7CisJYWNfY2ZnX3QgY2ZnOwkJLyogQ29uZmlndXJlIGFjdGlvbiAqLworCWFjX2lhc190IGlhczsJCS8qIElBLXNldHVwIGFjdGlvbiAqLworCWFjX21jc190IG1jczsJCS8qIE11bHRpY2FzdCBzZXR1cCAqLworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2XzgyNTg2X2NvbmZpZygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwkvKiBDaGVjayBub3RoaW5nIGJhZCBoYXMgaGFwcGVuZWQgKi8KKwlpZiAobHAtPnR4X25faW5fdXNlID09IChOVFhCTE9DS1MgLSAxKSkgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPICIlczogd3ZfODI1ODZfY29uZmlnKCk6IFR4IHF1ZXVlIGZ1bGwuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQlyZXR1cm47CisJfQorCisJLyogQ2FsY3VsYXRlIGFkZHJlc3NlcyBvZiBuZXh0IGJsb2NrIGFuZCBwcmV2aW91cyBibG9jay4gKi8KKwl0eGJsb2NrID0gbHAtPnR4X2ZpcnN0X2ZyZWU7CisJdHhwcmVkID0gdHhibG9jayAtIFRYQkxPQ0taOworCWlmICh0eHByZWQgPCBPRkZTRVRfQ1UpCisJCXR4cHJlZCArPSBOVFhCTE9DS1MgKiBUWEJMT0NLWjsKKwlscC0+dHhfZmlyc3RfZnJlZSArPSBUWEJMT0NLWjsKKwlpZiAobHAtPnR4X2ZpcnN0X2ZyZWUgPj0gT0ZGU0VUX0NVICsgTlRYQkxPQ0tTICogVFhCTE9DS1opCisJCWxwLT50eF9maXJzdF9mcmVlIC09IE5UWEJMT0NLUyAqIFRYQkxPQ0taOworCisJbHAtPnR4X25faW5fdXNlKys7CisKKwkvKiBDYWxjdWxhdGUgYWRkcmVzc2VzIG9mIHRoZSBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGJsb2NrLiAqLworCXR4X2FkZHIgPSB0eGJsb2NrOworCW5vcF9hZGRyID0gdHhfYWRkciArIHNpemVvZih0eCk7CisJdGJkX2FkZHIgPSBub3BfYWRkciArIHNpemVvZihub3ApOworCWNmZ19hZGRyID0gdGJkX2FkZHIgKyBzaXplb2YodGJkX3QpOwkvKiBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciAqLworCWlhc19hZGRyID0gY2ZnX2FkZHIgKyBzaXplb2YoY2ZnKTsKKwltY3NfYWRkciA9IGlhc19hZGRyICsgc2l6ZW9mKGlhcyk7CisKKwkvKgorCSAqIFRyYW5zbWl0IGNvbW1hbmQKKwkgKi8KKwl0eC50eF9oLmFjX3N0YXR1cyA9IDB4RkZGRjsJLyogRmFrZSBjb21wbGV0aW9uIHZhbHVlICovCisJb2JyYW1fd3JpdGUoaW9hZGRyLCB0b2ZmKGFjX3R4X3QsIHR4X2FkZHIsIHR4X2guYWNfc3RhdHVzKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZ0eC50eF9oLmFjX3N0YXR1cywKKwkJICAgIHNpemVvZih0eC50eF9oLmFjX3N0YXR1cykpOworCisJLyoKKwkgKiBOT1AgY29tbWFuZAorCSAqLworCW5vcC5ub3BfaC5hY19zdGF0dXMgPSAwOworCW9icmFtX3dyaXRlKGlvYWRkciwgdG9mZihhY19ub3BfdCwgbm9wX2FkZHIsIG5vcF9oLmFjX3N0YXR1cyksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmbm9wLm5vcF9oLmFjX3N0YXR1cywKKwkJICAgIHNpemVvZihub3Aubm9wX2guYWNfc3RhdHVzKSk7CisJbm9wLm5vcF9oLmFjX2xpbmsgPSBub3BfYWRkcjsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHRvZmYoYWNfbm9wX3QsIG5vcF9hZGRyLCBub3BfaC5hY19saW5rKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZub3Aubm9wX2guYWNfbGluaywKKwkJICAgIHNpemVvZihub3Aubm9wX2guYWNfbGluaykpOworCisJLyogQ3JlYXRlIGEgY29uZmlndXJlIGFjdGlvbi4gKi8KKwltZW1zZXQoJmNmZywgMHgwMCwgc2l6ZW9mKGNmZykpOworCisJLyoKKwkgKiBGb3IgTGludXggd2UgaW52ZXJ0IEFDX0NGR19BTE9DKCkgc28gYXMgdG8gY29uZm9ybQorCSAqIHRvIHRoZSB3YXkgdGhhdCBuZXQgcGFja2V0cyByZWFjaCB1cyBmcm9tIGFib3ZlLgorCSAqIChTZWUgYWxzbyBhY190eF90LikKKwkgKgorCSAqIFVwZGF0ZWQgZnJvbSBXYXZlbGFuIE1hbnVhbCBXQ0lOMDg1QgorCSAqLworCWNmZy5jZmdfYnl0ZV9jbnQgPQorCSAgICBBQ19DRkdfQllURV9DTlQoc2l6ZW9mKGFjX2NmZ190KSAtIHNpemVvZihhY2hfdCkpOworCWNmZy5jZmdfZmlmb2xpbSA9IEFDX0NGR19GSUZPTElNKDQpOworCWNmZy5jZmdfYnl0ZTggPSBBQ19DRkdfU0FWX0JGKDEpIHwgQUNfQ0ZHX1NSRFkoMCk7CisJY2ZnLmNmZ19ieXRlOSA9IEFDX0NGR19FTFBCQ0soMCkgfAorCSAgICBBQ19DRkdfSUxQQkNLKDApIHwKKwkgICAgQUNfQ0ZHX1BSRUxFTihBQ19DRkdfUExFTl8yKSB8CisJICAgIEFDX0NGR19BTE9DKDEpIHwgQUNfQ0ZHX0FERFJMRU4oV0FWRUxBTl9BRERSX1NJWkUpOworCWNmZy5jZmdfYnl0ZTEwID0gQUNfQ0ZHX0JPRk1FVCgxKSB8CisJICAgIEFDX0NGR19BQ1IoNikgfCBBQ19DRkdfTElOUFJJTygwKTsKKwljZmcuY2ZnX2lmcyA9IDB4MjA7CisJY2ZnLmNmZ19zbG90bCA9IDB4MEM7CisJY2ZnLmNmZ19ieXRlMTMgPSBBQ19DRkdfUkVUUllOVU0oMTUpIHwgQUNfQ0ZHX1NMVFRNSEkoMCk7CisJY2ZnLmNmZ19ieXRlMTQgPSBBQ19DRkdfRkxHUEFEKDApIHwKKwkgICAgQUNfQ0ZHX0JUU1RGKDApIHwKKwkgICAgQUNfQ0ZHX0NSQzE2KDApIHwKKwkgICAgQUNfQ0ZHX05DUkMoMCkgfAorCSAgICBBQ19DRkdfVE5DUlMoMSkgfAorCSAgICBBQ19DRkdfTUFOQ0goMCkgfAorCSAgICBBQ19DRkdfQkNESVMoMCkgfCBBQ19DRkdfUFJNKGxwLT5wcm9taXNjdW91cyk7CisJY2ZnLmNmZ19ieXRlMTUgPSBBQ19DRkdfSUNEUygwKSB8CisJICAgIEFDX0NGR19DRFRGKDApIHwgQUNfQ0ZHX0lDU1MoMCkgfCBBQ19DRkdfQ1NURigwKTsKKy8qCisgIGNmZy5jZmdfbWluX2ZybV9sZW4gPSBBQ19DRkdfTU5GUk0oNjQpOworKi8KKwljZmcuY2ZnX21pbl9mcm1fbGVuID0gQUNfQ0ZHX01ORlJNKDgpOworCisJY2ZnLmNmZ19oLmFjX2NvbW1hbmQgPSAoQUNfQ0ZMRF9DTUQgJiBhY21kX2NvbmZpZ3VyZSk7CisJY2ZnLmNmZ19oLmFjX2xpbmsgPSBpYXNfYWRkcjsKKwlvYnJhbV93cml0ZShpb2FkZHIsIGNmZ19hZGRyLCAodW5zaWduZWQgY2hhciAqKSAmY2ZnLCBzaXplb2YoY2ZnKSk7CisKKwkvKiBTZXQgdXAgdGhlIE1BQyBhZGRyZXNzICovCisJbWVtc2V0KCZpYXMsIDB4MDAsIHNpemVvZihpYXMpKTsKKwlpYXMuaWFzX2guYWNfY29tbWFuZCA9IChBQ19DRkxEX0NNRCAmIGFjbWRfaWFfc2V0dXApOworCWlhcy5pYXNfaC5hY19saW5rID0gbWNzX2FkZHI7CisJbWVtY3B5KCZpYXMuaWFzX2FkZHJbMF0sICh1bnNpZ25lZCBjaGFyICopICZkZXYtPmRldl9hZGRyWzBdLAorCSAgICAgICBzaXplb2YoaWFzLmlhc19hZGRyKSk7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCBpYXNfYWRkciwgKHVuc2lnbmVkIGNoYXIgKikgJmlhcywgc2l6ZW9mKGlhcykpOworCisJLyogSW5pdGlhbGl6ZSBhZGFwdGVyJ3MgRXRoZXJuZXQgbXVsdGljYXN0IGFkZHJlc3NlcyAqLworCW1lbXNldCgmbWNzLCAweDAwLCBzaXplb2YobWNzKSk7CisJbWNzLm1jc19oLmFjX2NvbW1hbmQgPSBBQ19DRkxEX0kgfCAoQUNfQ0ZMRF9DTUQgJiBhY21kX21jX3NldHVwKTsKKwltY3MubWNzX2guYWNfbGluayA9IG5vcF9hZGRyOworCW1jcy5tY3NfY250ID0gV0FWRUxBTl9BRERSX1NJWkUgKiBscC0+bWNfY291bnQ7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCBtY3NfYWRkciwgKHVuc2lnbmVkIGNoYXIgKikgJm1jcywgc2l6ZW9mKG1jcykpOworCisJLyogQW55IGFkZHJlc3MgdG8gc2V0PyAqLworCWlmIChscC0+bWNfY291bnQpIHsKKwkJZm9yIChkbWkgPSBkZXYtPm1jX2xpc3Q7IGRtaTsgZG1pID0gZG1pLT5uZXh0KQorCQkJb3V0c3coUElPUDEoaW9hZGRyKSwgKHUxNiAqKSBkbWktPmRtaV9hZGRyLAorCQkJICAgICAgV0FWRUxBTl9BRERSX1NJWkUgPj4gMSk7CisKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIiVzOiB3dl84MjU4Nl9jb25maWcoKTogc2V0ICVkIG11bHRpY2FzdCBhZGRyZXNzZXM6XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBscC0+bWNfY291bnQpOworCQlmb3IgKGRtaSA9IGRldi0+bWNfbGlzdDsgZG1pOyBkbWkgPSBkbWktPm5leHQpCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICIgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkgICAgICAgZG1pLT5kbWlfYWRkclswXSwgZG1pLT5kbWlfYWRkclsxXSwKKwkJCSAgICAgICBkbWktPmRtaV9hZGRyWzJdLCBkbWktPmRtaV9hZGRyWzNdLAorCQkJICAgICAgIGRtaS0+ZG1pX2FkZHJbNF0sIGRtaS0+ZG1pX2FkZHJbNV0pOworI2VuZGlmCisJfQorCisJLyoKKwkgKiBPdmVyd3JpdGUgdGhlIHByZWRlY2Vzc29yIE5PUCBsaW5rCisJICogc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGNvbmZpZ3VyZSBhY3Rpb24uCisJICovCisJbm9wX2FkZHIgPSB0eHByZWQgKyBzaXplb2YodHgpOworCW5vcC5ub3BfaC5hY19zdGF0dXMgPSAwOworCW9icmFtX3dyaXRlKGlvYWRkciwgdG9mZihhY19ub3BfdCwgbm9wX2FkZHIsIG5vcF9oLmFjX3N0YXR1cyksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmbm9wLm5vcF9oLmFjX3N0YXR1cywKKwkJICAgIHNpemVvZihub3Aubm9wX2guYWNfc3RhdHVzKSk7CisJbm9wLm5vcF9oLmFjX2xpbmsgPSBjZmdfYWRkcjsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHRvZmYoYWNfbm9wX3QsIG5vcF9hZGRyLCBub3BfaC5hY19saW5rKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZub3Aubm9wX2guYWNfbGluaywKKwkJICAgIHNpemVvZihub3Aubm9wX2guYWNfbGluaykpOworCisJLyogSm9iIGRvbmUsIGNsZWFyIHRoZSBmbGFnICovCisJbHAtPnJlY29uZmlnXzgyNTg2ID0gMDsKKworCWlmIChscC0+dHhfZmlyc3RfaW5fdXNlID09IEk4MjU4Nk5VTEwpCisJCWxwLT50eF9maXJzdF9pbl91c2UgPSB0eGJsb2NrOworCisJaWYgKGxwLT50eF9uX2luX3VzZSA9PSAoTlRYQkxPQ0tTIC0gMSkpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl84MjU4Nl9jb25maWcoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lLCBjYWxsZWQgYnkgd2F2ZWxhbl9jbG9zZSgpLCBncmFjZWZ1bGx5IHN0b3BzIHRoZSAKKyAqIFdhdmVMQU4gY29udHJvbGxlciAoaTgyNTg2KS4KKyAqIChjYWxsZWQgYnkgd2F2ZWxhbl9jbG9zZSgpKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3ZfODI1ODZfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1MTYgc2NiX2NtZDsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl84MjU4Nl9zdG9wKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCS8qIFN1c3BlbmQgYm90aCBjb21tYW5kIHVuaXQgYW5kIHJlY2VpdmUgdW5pdC4gKi8KKwlzY2JfY21kID0KKwkgICAgKFNDQl9DTURfQ1VDICYgU0NCX0NNRF9DVUNfU1VTKSB8IChTQ0JfQ01EX1JVQyAmCisJCQkJCSAgICAgICBTQ0JfQ01EX1JVQ19TVVMpOworCW9icmFtX3dyaXRlKGlvYWRkciwgc2Nib2ZmKE9GRlNFVF9TQ0IsIHNjYl9jb21tYW5kKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZzY2JfY21kLCBzaXplb2Yoc2NiX2NtZCkpOworCXNldF9jaGFuX2F0dG4oaW9hZGRyLCBscC0+aGFjcik7CisKKwkvKiBObyBtb3JlIGludGVycnVwdHMgKi8KKwl3dl9pbnRzX29mZihkZXYpOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2XzgyNTg2X3N0b3AoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVG90YWxseSByZXNldCB0aGUgV2F2ZUxBTiBhbmQgcmVzdGFydCBpdC4KKyAqIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKKyAqCTEuIEEgcG93ZXIgcmVzZXQgKHJlc2V0IERNQSkKKyAqCTIuIEluaXRpYWxpemUgdGhlIHJhZGlvIG1vZGVtICh1c2luZyB3dl9tbWNfaW5pdCkKKyAqCTMuIFJlc2V0ICYgQ29uZmlndXJlIExBTiBjb250cm9sbGVyICh1c2luZyB3dl84MjU4Nl9zdGFydCkKKyAqCTQuIFN0YXJ0IHRoZSBMQU4gY29udHJvbGxlcidzIGNvbW1hbmQgdW5pdAorICoJNS4gU3RhcnQgdGhlIExBTiBjb250cm9sbGVyJ3MgcmVjZWl2ZSB1bml0CisgKiAoY2FsbGVkIGJ5IHdhdmVsYW5faW50ZXJydXB0KCksIHdhdmVsYW5fd2F0Y2hkb2coKSAmIHdhdmVsYW5fb3BlbigpKQorICovCitzdGF0aWMgaW50IHd2X2h3X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X2h3X3Jlc2V0KGRldj0weCV4KVxuIiwgZGV2LT5uYW1lLAorCSAgICAgICAodW5zaWduZWQgaW50KSBkZXYpOworI2VuZGlmCisKKwkvKiBJbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHJlc2V0cyBkb25lLiAqLworCWxwLT5ucmVzZXRzKys7CisKKwl3dl9oYWNyX3Jlc2V0KGlvYWRkcik7CisJbHAtPmhhY3IgPSBIQUNSX0RFRkFVTFQ7CisKKwlpZiAoKHd2X21tY19pbml0KGRldikgPCAwKSB8fCAod3ZfODI1ODZfc3RhcnQoZGV2KSA8IDApKQorCQlyZXR1cm4gLTE7CisKKwkvKiBFbmFibGUgdGhlIGNhcmQgdG8gc2VuZCBpbnRlcnJ1cHRzLiAqLworCXd2X2ludHNfb24oZGV2KTsKKworCS8qIFN0YXJ0IGNhcmQgZnVuY3Rpb25zICovCisJaWYgKHd2X2N1X3N0YXJ0KGRldikgPCAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBTZXR1cCB0aGUgY29udHJvbGxlciBhbmQgcGFyYW1ldGVycyAqLworCXd2XzgyNTg2X2NvbmZpZyhkZXYpOworCisJLyogRmluaXNoIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgcmVjZWl2ZSB1bml0ICovCisJaWYgKHd2X3J1X3N0YXJ0KGRldikgPCAwKQorCQlyZXR1cm4gLTE7CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfaHdfcmVzZXQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ2hlY2sgaWYgdGhlcmUgaXMgYSBXYXZlTEFOIGF0IHRoZSBzcGVjaWZpYyBiYXNlIGFkZHJlc3MuCisgKiBBcyBhIHNpZGUgZWZmZWN0LCB0aGlzIHJlYWRzIHRoZSBNQUMgYWRkcmVzcy4KKyAqIChjYWxsZWQgaW4gd2F2ZWxhbl9wcm9iZSgpIGFuZCBpbml0X21vZHVsZSgpKQorICovCitzdGF0aWMgaW50IHd2X2NoZWNrX2lvYWRkcih1bnNpZ25lZCBsb25nIGlvYWRkciwgdTggKiBtYWMpCit7CisJaW50IGk7CQkJLyogTG9vcCBjb3VudGVyICovCisKKwkvKiBDaGVjayBpZiB0aGUgYmFzZSBhZGRyZXNzIGlmIGF2YWlsYWJsZS4gKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgc2l6ZW9mKGhhX3QpLCAid2F2ZWxhbiBwcm9iZSIpKQorCQlyZXR1cm4gLUVCVVNZOwkJLyogaW9hZGRyIGFscmVhZHkgdXNlZCAqLworCisJLyogUmVzZXQgaG9zdCBpbnRlcmZhY2UgKi8KKwl3dl9oYWNyX3Jlc2V0KGlvYWRkcik7CisKKwkvKiBSZWFkIHRoZSBNQUMgYWRkcmVzcyBmcm9tIHRoZSBwYXJhbWV0ZXIgc3RvcmFnZSBhcmVhLiAqLworCXBzYV9yZWFkKGlvYWRkciwgSEFDUl9ERUZBVUxULCBwc2FvZmYoMCwgcHNhX3VuaXZfbWFjX2FkZHIpLAorCQkgbWFjLCA2KTsKKworCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgc2l6ZW9mKGhhX3QpKTsKKworCS8qCisJICogQ2hlY2sgdGhlIGZpcnN0IHRocmVlIG9jdGV0cyBvZiB0aGUgYWRkcmVzcyBmb3IgdGhlIG1hbnVmYWN0dXJlcidzIGNvZGUuCisJICogTm90ZTogaWYgdGhpcyBjYW4ndCBmaW5kIHlvdXIgV2F2ZUxBTiBjYXJkLCB5b3UndmUgZ290IGEKKwkgKiBub24tTkNSL0FUJlQvTHVjZW50IElTQSBjYXJkLiAgU2VlIHdhdmVsYW4ucC5oIGZvciBkZXRhaWwgb24KKwkgKiBob3cgdG8gY29uZmlndXJlIHlvdXIgY2FyZC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihNQUNfQUREUkVTU0VTKSAvIHNpemVvZihjaGFyKSAvIDMpOyBpKyspCisJCWlmICgobWFjWzBdID09IE1BQ19BRERSRVNTRVNbaV1bMF0pICYmCisJCSAgICAobWFjWzFdID09IE1BQ19BRERSRVNTRVNbaV1bMV0pICYmCisJCSAgICAobWFjWzJdID09IE1BQ19BRERSRVNTRVNbaV1bMl0pKQorCQkJcmV0dXJuIDA7CisKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworCXByaW50ayhLRVJOX1dBUk5JTkcKKwkgICAgICAgIldhdmVMQU4gKDB4JTNYKTogeW91ciBNQUMgYWRkcmVzcyBtaWdodCBiZSAlMDJYOiUwMlg6JTAyWC5cbiIsCisJICAgICAgIGlvYWRkciwgbWFjWzBdLCBtYWNbMV0sIG1hY1syXSk7CisjZW5kaWYKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBJTlRFUlJVUFQgSEFORExJTkcgKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBXYXZlTEFOIGNhcmQuIFRoaXMKKyAqIHJvdXRpbmUgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXI6IAorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2F2ZWxhbl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXVuc2lnbmVkIGxvbmcgaW9hZGRyOworCW5ldF9sb2NhbCAqbHA7CisJdTE2IGhhc3I7CisJdTE2IHN0YXR1czsKKwl1MTYgYWNrX2NtZDsKKworCWRldiA9IGRldl9pZDsKKworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX2ludGVycnVwdCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0lORk8KKwkvKiBDaGVjayBzdGF0ZSBvZiBvdXIgc3BpbmxvY2sgKi8KKwlpZihzcGluX2lzX2xvY2tlZCgmbHAtPnNwaW5sb2NrKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICIlczogd2F2ZWxhbl9pbnRlcnJ1cHQoKTogc3BpbmxvY2sgaXMgYWxyZWFkeSBsb2NrZWQgISEhXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogUHJldmVudCByZWVudHJhbmN5LiBXZSBuZWVkIHRvIGRvIHRoYXQgYmVjYXVzZSB3ZSBtYXkgaGF2ZQorCSAqIG11bHRpcGxlIGludGVycnVwdCBoYW5kbGVyIHJ1bm5pbmcgY29uY3VycmVudGx5LgorCSAqIEl0IGlzIHNhZmUgYmVjYXVzZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBiZWZvcmUgYWNxdWlyaW5nCisJICogdGhlIHNwaW5sb2NrLiAqLworCXNwaW5fbG9jaygmbHAtPnNwaW5sb2NrKTsKKworCS8qIFdlIGFsd2F5cyBoYWQgc3B1cmlvdXMgaW50ZXJydXB0cyBhdCBzdGFydHVwLCBidXQgbGF0ZWx5IEkKKwkgKiBzYXcgdGhlbSBjb21taW5nICpiZXR3ZWVuKiB0aGUgcmVxdWVzdF9pcnEoKSBhbmQgdGhlCisJICogc3Bpbl9sb2NrX2lycXNhdmUoKSBpbiB3YXZlbGFuX29wZW4oKSwgc28gdGhlIHNwaW5sb2NrCisJICogcHJvdGVjdGlvbiBpcyBubyBlbm91Z2guCisJICogU28sIHdlIGFsc28gY2hlY2sgbHAtPmhhY3IgdGhhdCB3aWxsIHRlbGwgdXMgaXMgd2UgZW5hYmxlZAorCSAqIGlycXMgb3Igbm90IChzZWUgd3ZfaW50c19vbigpKS4KKwkgKiBXZSBjYW4ndCB1c2UgbmV0aWZfcnVubmluZyhkZXYpIGJlY2F1c2Ugd2UgZGVwZW5kIG9uIHRoZQorCSAqIHByb3BlciBwcm9jZXNzaW5nIG9mIHRoZSBpcnEgZ2VuZXJhdGVkIGR1cmluZyB0aGUgY29uZmlnLiAqLworCisJLyogV2hpY2ggaW50ZXJydXB0IGl0IGlzID8gKi8KKwloYXNyID0gaGFzcl9yZWFkKGlvYWRkcik7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTworCXByaW50ayhLRVJOX0lORk8KKwkgICAgICAgIiVzOiB3YXZlbGFuX2ludGVycnVwdCgpOiBoYXNyIDB4JTA0eDsgaGFjciAweCUwNHguXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGhhc3IsIGxwLT5oYWNyKTsKKyNlbmRpZgorCisJLyogQ2hlY2sgbW9kZW0gaW50ZXJydXB0ICovCisJaWYgKChoYXNyICYgSEFTUl9NTUNfSU5UUikgJiYgKGxwLT5oYWNyICYgSEFDUl9NTUNfSU5UX0VOQUJMRSkpIHsKKwkJdTggZGNlX3N0YXR1czsKKworCQkvKgorCQkgKiBJbnRlcnJ1cHQgZnJvbSB0aGUgbW9kZW0gbWFuYWdlbWVudCBjb250cm9sbGVyLgorCQkgKiBUaGlzIHdpbGwgY2xlYXIgaXQgLS0gaWdub3JlZCBmb3Igbm93LgorCQkgKi8KKwkJbW1jX3JlYWQoaW9hZGRyLCBtbXJvZmYoMCwgbW1yX2RjZV9zdGF0dXMpLCAmZGNlX3N0YXR1cywKKwkJCSBzaXplb2YoZGNlX3N0YXR1cykpOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0VSUk9SCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlczogd2F2ZWxhbl9pbnRlcnJ1cHQoKTogdW5leHBlY3RlZCBtbWMgaW50ZXJydXB0OiBzdGF0dXMgMHglMDR4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZGNlX3N0YXR1cyk7CisjZW5kaWYKKwl9CisKKwkvKiBDaGVjayBpZiBub3QgY29udHJvbGxlciBpbnRlcnJ1cHQgKi8KKwlpZiAoKChoYXNyICYgSEFTUl84MjU4Nl9JTlRSKSA9PSAwKSB8fAorCSAgICAoKGxwLT5oYWNyICYgSEFDUl84MjU4Nl9JTlRfRU5BQkxFKSA9PSAwKSkgeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHdhdmVsYW5faW50ZXJydXB0KCk6IGludGVycnVwdCBub3QgY29taW5nIGZyb20gaTgyNTg2IC0gaGFzciAweCUwNHguXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBoYXNyKTsKKyNlbmRpZgorCQlzcGluX3VubG9jayAoJmxwLT5zcGlubG9jayk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwkvKiBSZWFkIGludGVycnVwdCBkYXRhLiAqLworCW9icmFtX3JlYWQoaW9hZGRyLCBzY2JvZmYoT0ZGU0VUX1NDQiwgc2NiX3N0YXR1cyksCisJCSAgICh1bnNpZ25lZCBjaGFyICopICZzdGF0dXMsIHNpemVvZihzdGF0dXMpKTsKKworCS8qCisJICogQWNrbm93bGVkZ2UgdGhlIGludGVycnVwdChzKS4KKwkgKi8KKwlhY2tfY21kID0gc3RhdHVzICYgU0NCX1NUX0lOVDsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHNjYm9mZihPRkZTRVRfU0NCLCBzY2JfY29tbWFuZCksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmYWNrX2NtZCwgc2l6ZW9mKGFja19jbWQpKTsKKwlzZXRfY2hhbl9hdHRuKGlvYWRkciwgbHAtPmhhY3IpOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0lORk8KKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHdhdmVsYW5faW50ZXJydXB0KCk6IHN0YXR1cyAweCUwNHguXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisjZW5kaWYKKworCS8qIENvbW1hbmQgY29tcGxldGVkLiAqLworCWlmICgoc3RhdHVzICYgU0NCX1NUX0NYKSA9PSBTQ0JfU1RfQ1gpIHsKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIiVzOiB3YXZlbGFuX2ludGVycnVwdCgpOiBjb21tYW5kIGNvbXBsZXRlZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXd2X2NvbXBsZXRlKGRldiwgaW9hZGRyLCBscCk7CisJfQorCisJLyogRnJhbWUgcmVjZWl2ZWQuICovCisJaWYgKChzdGF0dXMgJiBTQ0JfU1RfRlIpID09IFNDQl9TVF9GUikgeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9JTkZPCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6IHdhdmVsYW5faW50ZXJydXB0KCk6IHJlY2VpdmVkIHBhY2tldC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXd2X3JlY2VpdmUoZGV2KTsKKwl9CisKKwkvKiBDaGVjayB0aGUgc3RhdGUgb2YgdGhlIGNvbW1hbmQgdW5pdC4gKi8KKwlpZiAoKChzdGF0dXMgJiBTQ0JfU1RfQ05BKSA9PSBTQ0JfU1RfQ05BKSB8fAorCSAgICAoKChzdGF0dXMgJiBTQ0JfU1RfQ1VTKSAhPSBTQ0JfU1RfQ1VTX0FDVFYpICYmCisJICAgICAobmV0aWZfcnVubmluZyhkZXYpKSkpIHsKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiB3YXZlbGFuX2ludGVycnVwdCgpOiBDVSBpbmFjdGl2ZSAtLSByZXN0YXJ0aW5nXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQl3dl9od19yZXNldChkZXYpOworCX0KKworCS8qIENoZWNrIHRoZSBzdGF0ZSBvZiB0aGUgY29tbWFuZCB1bml0LiAqLworCWlmICgoKHN0YXR1cyAmIFNDQl9TVF9STlIpID09IFNDQl9TVF9STlIpIHx8CisJICAgICgoKHN0YXR1cyAmIFNDQl9TVF9SVVMpICE9IFNDQl9TVF9SVVNfUkRZKSAmJgorCSAgICAgKG5ldGlmX3J1bm5pbmcoZGV2KSkpKSB7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0VSUk9SCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlczogd2F2ZWxhbl9pbnRlcnJ1cHQoKTogUlUgbm90IHJlYWR5IC0tIHJlc3RhcnRpbmdcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXd2X2h3X3Jlc2V0KGRldik7CisJfQorCisJLyogUmVsZWFzZSBzcGlubG9jayAqLworCXNwaW5fdW5sb2NrICgmbHAtPnNwaW5sb2NrKTsKKworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX2ludGVycnVwdCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2F0Y2hkb2c6IHdoZW4gd2Ugc3RhcnQgYSB0cmFuc21pc3Npb24sIGEgdGltZXIgaXMgc2V0IGZvciB1cyBpbiB0aGUKKyAqIGtlcm5lbC4gIElmIHRoZSB0cmFuc21pc3Npb24gY29tcGxldGVzLCB0aGlzIHRpbWVyIGlzIGRpc2FibGVkLiBJZgorICogdGhlIHRpbWVyIGV4cGlyZXMsIHdlIGFyZSBjYWxsZWQgYW5kIHdlIHRyeSB0byB1bmxvY2sgdGhlIGhhcmR3YXJlLgorICovCitzdGF0aWMgdm9pZCB3YXZlbGFuX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworCW5ldF9sb2NhbCAqCWxwID0gKG5ldF9sb2NhbCAqKWRldi0+cHJpdjsKKwl1X2xvbmcJCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdW5zaWduZWQgaW50CW5yZWFwZWQ7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d2F2ZWxhbl93YXRjaGRvZygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfRVJST1IKKwlwcmludGsoS0VSTl9JTkZPICIlczogd2F2ZWxhbl93YXRjaGRvZzogd2F0Y2hkb2cgdGltZXIgZXhwaXJlZFxuIiwKKwkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogQ2hlY2sgdGhhdCB3ZSBjYW1lIGhlcmUgZm9yIHNvbWV0aGluZyAqLworCWlmIChscC0+dHhfbl9pbl91c2UgPD0gMCkgeworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJLyogVHJ5IHRvIHNlZSBpZiBzb21lIGJ1ZmZlcnMgYXJlIG5vdCBmcmVlIChpbiBjYXNlIHdlIG1pc3NlZAorCSAqIGFuIGludGVycnVwdCAqLworCW5yZWFwZWQgPSB3dl9jb21wbGV0ZShkZXYsIGlvYWRkciwgbHApOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0lORk8KKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiJXM6IHdhdmVsYW5fd2F0Y2hkb2coKTogJWQgcmVhcGVkLCAlZCByZW1haW4uXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIG5yZWFwZWQsIGxwLT50eF9uX2luX3VzZSk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX1BTQV9TSE9XCisJeworCQlwc2FfdCBwc2E7CisJCXBzYV9yZWFkKGRldiwgMCwgKHVuc2lnbmVkIGNoYXIgKikgJnBzYSwgc2l6ZW9mKHBzYSkpOworCQl3dl9wc2Ffc2hvdygmcHNhKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBERUJVR19NTUNfU0hPVworCXd2X21tY19zaG93KGRldik7CisjZW5kaWYKKyNpZmRlZiBERUJVR19JODI1ODZfU0hPVworCXd2X2N1X3Nob3coZGV2KTsKKyNlbmRpZgorCisJLyogSWYgbm8gYnVmZmVyIGhhcyBiZWVuIGZyZWVkICovCisJaWYgKG5yZWFwZWQgPT0gMCkgeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHdhdmVsYW5fd2F0Y2hkb2coKTogY2xlYW51cCBmYWlsZWQsIHRyeWluZyByZXNldFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJd3ZfaHdfcmVzZXQoZGV2KTsKKwl9CisKKwkvKiBBdCB0aGlzIHBvaW50LCB3ZSBzaG91bGQgaGF2ZSBzb21lIGZyZWUgVHggYnVmZmVyIDstKSAqLworCWlmIChscC0+dHhfbl9pbl91c2UgPCBOVFhCTE9DS1MgLSAxKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd2F2ZWxhbl93YXRjaGRvZygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKiogQ09ORklHVVJBVElPTiBDQUxMQkFDS1MgKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEhlcmUgYXJlIHRoZSBmdW5jdGlvbnMgY2FsbGVkIGJ5IHRoZSBMaW51eCBuZXR3b3JraW5nIGNvZGUgKE5FVDMpCisgKiBmb3IgaW5pdGlhbGl6YXRpb24sIGNvbmZpZ3VyYXRpb24gYW5kIGRlaW5zdGFsbGF0aW9ucyBvZiB0aGUgCisgKiBXYXZlTEFOIElTQSBoYXJkd2FyZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ29uZmlndXJlIGFuZCBzdGFydCB1cCB0aGUgV2F2ZUxBTiBQQ01DSUEgYWRhcHRvci4KKyAqIENhbGxlZCBieSBORVQzIHdoZW4gaXQgIm9wZW5zIiB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgaW50IHdhdmVsYW5fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKglscCA9IChuZXRfbG9jYWwgKilkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5fb3BlbihkZXY9MHgleClcbiIsIGRldi0+bmFtZSwKKwkgICAgICAgKHVuc2lnbmVkIGludCkgZGV2KTsKKyNlbmRpZgorCisJLyogQ2hlY2sgaXJxICovCisJaWYgKGRldi0+aXJxID09IDApIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHdhdmVsYW5fb3BlbigpOiBubyBJUlFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXJldHVybiAtRU5YSU87CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmd2F2ZWxhbl9pbnRlcnJ1cHQsIDAsICJXYXZlTEFOIiwgZGV2KSAhPSAwKSAKKwl7CisjaWZkZWYgREVCVUdfQ09ORklHX0VSUk9SCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB3YXZlbGFuX29wZW4oKTogaW52YWxpZCBJUlFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwlpZiAod3ZfaHdfcmVzZXQoZGV2KSAhPSAtMSkgeworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCX0gZWxzZSB7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHdhdmVsYW5fb3BlbigpOiBpbXBvc3NpYmxlIHRvIHN0YXJ0IHRoZSBjYXJkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fb3BlbigpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTaHV0IGRvd24gdGhlIFdhdmVMQU4gSVNBIGNhcmQuCisgKiBDYWxsZWQgYnkgTkVUMyB3aGVuIGl0ICJjbG9zZXMiIHRoZSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5fY2xvc2UoZGV2PTB4JXgpXG4iLCBkZXYtPm5hbWUsCisJICAgICAgICh1bnNpZ25lZCBpbnQpIGRldik7CisjZW5kaWYKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qCisJICogRmx1c2ggdGhlIFR4IGFuZCBkaXNhYmxlIFJ4LgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwl3dl84MjU4Nl9zdG9wKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fY2xvc2UoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJvYmUgYW4gSS9PIGFkZHJlc3MsIGFuZCBpZiB0aGUgV2F2ZUxBTiBpcyB0aGVyZSBjb25maWd1cmUgdGhlCisgKiBkZXZpY2Ugc3RydWN0dXJlCisgKiAoY2FsbGVkIGJ5IHdhdmVsYW5fcHJvYmUoKSBhbmQgdmlhIGluaXRfbW9kdWxlKCkpLgorICovCitzdGF0aWMgaW50IF9faW5pdCB3YXZlbGFuX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCBpb2FkZHIpCit7CisJdTggaXJxX21hc2s7CisJaW50IGlycTsKKwluZXRfbG9jYWwgKmxwOworCW1hY19hZGRyIG1hYzsKKwlpbnQgZXJyOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIHNpemVvZihoYV90KSwgIndhdmVsYW4iKSkKKwkJcmV0dXJuIC1FQUREUklOVVNFOworCisJZXJyID0gd3ZfY2hlY2tfaW9hZGRyKGlvYWRkciwgbWFjKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCW1lbWNweShkZXYtPmRldl9hZGRyLCBtYWMsIDYpOworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisKKyNpZmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX2NvbmZpZyhkZXY9MHgleCwgaW9hZGRyPTB4JWx4KVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCAodW5zaWduZWQgaW50KSBkZXYsIGlvYWRkcik7CisjZW5kaWYKKworCS8qIENoZWNrIElSUSBhcmd1bWVudCBvbiBjb21tYW5kIGxpbmUuICovCisJaWYgKGRldi0+aXJxICE9IDApIHsKKwkJaXJxX21hc2sgPSB3dl9pcnFfdG9fcHNhKGRldi0+aXJxKTsKKworCQlpZiAoaXJxX21hc2sgPT0gMCkgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogd2F2ZWxhbl9jb25maWcoKTogaW52YWxpZCBJUlEgJWQgaWdub3JlZC5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisjZW5kaWYKKwkJCWRldi0+aXJxID0gMDsKKwkJfSBlbHNlIHsKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCSAgICAgICAiJXM6IHdhdmVsYW5fY29uZmlnKCk6IGNoYW5naW5nIElSUSB0byAlZFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKyNlbmRpZgorCQkJcHNhX3dyaXRlKGlvYWRkciwgSEFDUl9ERUZBVUxULAorCQkJCSAgcHNhb2ZmKDAsIHBzYV9pbnRfcmVxX25vKSwgJmlycV9tYXNrLCAxKTsKKwkJCS8qIHVwZGF0ZSB0aGUgV2F2ZWxhbiBjaGVja3N1bSAqLworCQkJdXBkYXRlX3BzYV9jaGVja3N1bShkZXYsIGlvYWRkciwgSEFDUl9ERUZBVUxUKTsKKwkJCXd2X2hhY3JfcmVzZXQoaW9hZGRyKTsKKwkJfQorCX0KKworCXBzYV9yZWFkKGlvYWRkciwgSEFDUl9ERUZBVUxULCBwc2FvZmYoMCwgcHNhX2ludF9yZXFfbm8pLAorCQkgJmlycV9tYXNrLCAxKTsKKwlpZiAoKGlycSA9IHd2X3BzYV90b19pcnEoaXJxX21hc2spKSA9PSAtMSkgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHdhdmVsYW5fY29uZmlnKCk6IGNvdWxkIG5vdCB3YXZlbGFuX21hcF9pcnEoJWQpLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgaXJxX21hc2spOworI2VuZGlmCisJCWVyciA9IC1FQUdBSU47CisJCWdvdG8gb3V0OworCX0KKworCWRldi0+aXJxID0gaXJxOworCisJZGV2LT5tZW1fc3RhcnQgPSAweDAwMDA7CisJZGV2LT5tZW1fZW5kID0gMHgwMDAwOworCWRldi0+aWZfcG9ydCA9IDA7CisKKwkvKiBJbml0aWFsaXplIGRldmljZSBzdHJ1Y3R1cmVzICovCisJbWVtc2V0KGRldi0+cHJpdiwgMCwgc2l6ZW9mKG5ldF9sb2NhbCkpOworCWxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisKKwkvKiBCYWNrIGxpbmsgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJbHAtPmRldiA9IGRldjsKKwkvKiBBZGQgdGhlIGRldmljZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5rZWQgbGlzdC4gKi8KKwlscC0+bmV4dCA9IHdhdmVsYW5fbGlzdDsKKwl3YXZlbGFuX2xpc3QgPSBscDsKKworCWxwLT5oYWNyID0gSEFDUl9ERUZBVUxUOworCisJLyogTXVsdGljYXN0IHN0dWZmICovCisJbHAtPnByb21pc2N1b3VzID0gMDsKKwlscC0+bWNfY291bnQgPSAwOworCisJLyogSW5pdCBzcGlubG9jayAqLworCXNwaW5fbG9ja19pbml0KCZscC0+c3BpbmxvY2spOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWRldi0+b3BlbiA9IHdhdmVsYW5fb3BlbjsKKwlkZXYtPnN0b3AgPSB3YXZlbGFuX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gd2F2ZWxhbl9wYWNrZXRfeG1pdDsKKwlkZXYtPmdldF9zdGF0cyA9IHdhdmVsYW5fZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJndhdmVsYW5fc2V0X211bHRpY2FzdF9saXN0OworICAgICAgICBkZXYtPnR4X3RpbWVvdXQJCT0gJndhdmVsYW5fd2F0Y2hkb2c7CisgICAgICAgIGRldi0+d2F0Y2hkb2dfdGltZW8JPSBXQVRDSERPR19KSUZGSUVTOworI2lmZGVmIFNFVF9NQUNfQUREUkVTUworCWRldi0+c2V0X21hY19hZGRyZXNzID0gJndhdmVsYW5fc2V0X21hY19hZGRyZXNzOworI2VuZGlmCQkJCS8qIFNFVF9NQUNfQUREUkVTUyAqLworCisjaWZkZWYgV0lSRUxFU1NfRVhUCQkvKiBpZiB3aXJlbGVzcyBleHRlbnNpb24gZXhpc3RzIGluIHRoZSBrZXJuZWwgKi8KKwlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJndhdmVsYW5faGFuZGxlcl9kZWY7CisJbHAtPndpcmVsZXNzX2RhdGEuc3B5X2RhdGEgPSAmbHAtPnNweV9kYXRhOworCWRldi0+d2lyZWxlc3NfZGF0YSA9ICZscC0+d2lyZWxlc3NfZGF0YTsKKyNlbmRpZgorCisJZGV2LT5tdHUgPSBXQVZFTEFOX01UVTsKKworCS8qIERpc3BsYXkgbmljZSBpbmZvcm1hdGlvbi4gKi8KKwl3dl9pbml0X2luZm8oZGV2KTsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fY29uZmlnKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK291dDoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIHNpemVvZihoYV90KSk7CisJcmV0dXJuIGVycjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIENoZWNrIGZvciBhIG5ldHdvcmsgYWRhcHRvciBvZiB0aGlzIHR5cGUuICBSZXR1cm4gJzAnIGlmZiBvbmUgCisgKiBleGlzdHMuICBUaGVyZSBzZWVtIHRvIGJlIGRpZmZlcmVudCBpbnRlcnByZXRhdGlvbnMgb2YKKyAqIHRoZSBpbml0aWFsIHZhbHVlIG9mIGRldi0+YmFzZV9hZGRyLgorICogV2UgZm9sbG93IHRoZSBleGFtcGxlIGluIGRyaXZlcnMvbmV0L25lLmMuCisgKiAoY2FsbGVkIGluICJTcGFjZS5jIikKKyAqLworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgd2F2ZWxhbl9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXNob3J0IGJhc2VfYWRkcjsKKwlpbnQgZGVmX2lycTsKKwlpbnQgaTsKKwlpbnQgciA9IDA7CisKKyNpZmRlZglTVFJVQ1RfQ0hFQ0sKKwlpZiAod3Zfc3RydWN0X2NoZWNrKCkgIT0gKGNoYXIgKikgTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IHdhdmVsYW5fcHJvYmUoKTogc3RydWN0dXJlL2NvbXBpbGVyIGJvdGNoOiBcIiVzXCJcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHd2X3N0cnVjdF9jaGVjaygpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorI2VuZGlmCQkJCS8qIFNUUlVDVF9DSEVDSyAqLworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKG5ldF9sb2NhbCkpOworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCWJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWRlZl9pcnEgPSBkZXYtPmlycTsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgIiVzOiAtPndhdmVsYW5fcHJvYmUoZGV2PSVwIChiYXNlX2FkZHI9MHgleCkpXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGRldiwgKHVuc2lnbmVkIGludCkgZGV2LT5iYXNlX2FkZHIpOworI2VuZGlmCisKKwkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJaWYgKGJhc2VfYWRkciA8IDApIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiVzOiB3YXZlbGFuX3Byb2JlKCk6IGludmFsaWQgYmFzZSBhZGRyZXNzXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQlyID0gLUVOWElPOworCX0gZWxzZSBpZiAoYmFzZV9hZGRyID4gMHgxMDApIHsgLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLworCQlyID0gd2F2ZWxhbl9jb25maWcoZGV2LCBiYXNlX2FkZHIpOworI2lmZGVmIERFQlVHX0NPTkZJR19JTkZPCisJCWlmIChyICE9IDApCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICIlczogd2F2ZWxhbl9wcm9iZSgpOiBubyBkZXZpY2UgYXQgc3BlY2lmaWVkIGJhc2UgYWRkcmVzcyAoMHglWCkgb3IgYWRkcmVzcyBhbHJlYWR5IGluIHVzZVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGJhc2VfYWRkcik7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX3Byb2JlKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwl9IGVsc2UgeyAvKiBTY2FuIGFsbCBwb3NzaWJsZSBhZGRyZXNzZXMgb2YgdGhlIFdhdmVMQU4gaGFyZHdhcmUuICovCisJCWZvciAoaSA9IDA7IGkgPCBORUxTKGlvYmFzZSk7IGkrKykgeworCQkJZGV2LT5pcnEgPSBkZWZfaXJxOworCQkJaWYgKHdhdmVsYW5fY29uZmlnKGRldiwgaW9iYXNlW2ldKSA9PSAwKSB7CisjaWZkZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiJXM6IDwtd2F2ZWxhbl9wcm9iZSgpXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGkgPT0gTkVMUyhpb2Jhc2UpKQorCQkJciA9IC1FTk9ERVY7CisJfQorCWlmIChyKSAKKwkJZ290byBvdXQ7CisJciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIHNpemVvZihoYV90KSk7CisJd2F2ZWxhbl9saXN0ID0gd2F2ZWxhbl9saXN0LT5uZXh0Oworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIocik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTU9EVUxFICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBNb2R1bGUgZW50cnkgcG9pbnQ6IGluc2VydGlvbiBhbmQgcmVtb3ZhbAorICovCisKKyNpZmRlZglNT0RVTEUKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBJbnNlcnRpb24gb2YgdGhlIG1vZHVsZQorICogSSdtIG5vdyBxdWl0ZSBwcm91ZCBvZiB0aGUgbXVsdGktZGV2aWNlIHN1cHBvcnQuCisgKi8KK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXQgPSAtRUlPOwkJLyogUmV0dXJuIGVycm9yIGlmIG5vIGNhcmRzIGZvdW5kICovCisJaW50IGk7CisKKyNpZmRlZiBERUJVR19NT0RVTEVfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiLT4gaW5pdF9tb2R1bGUoKVxuIik7CisjZW5kaWYKKworCS8qIElmIHByb2JpbmcgaXMgYXNrZWQgKi8KKwlpZiAoaW9bMF0gPT0gMCkgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiV2F2ZUxBTiBpbml0X21vZHVsZSgpOiBkb2luZyBkZXZpY2UgcHJvYmluZyAoYmFkICEpXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIlNwZWNpZnkgYmFzZSBhZGRyZXNzZXMgd2hpbGUgbG9hZGluZyBtb2R1bGUgdG8gY29ycmVjdCB0aGUgcHJvYmxlbVxuIik7CisjZW5kaWYKKworCQkvKiBDb3B5IHRoZSBiYXNpYyBzZXQgb2YgYWRkcmVzcyB0byBiZSBwcm9iZWQuICovCisJCWZvciAoaSA9IDA7IGkgPCBORUxTKGlvYmFzZSk7IGkrKykKKwkJCWlvW2ldID0gaW9iYXNlW2ldOworCX0KKworCisJLyogTG9vcCBvbiBhbGwgcG9zc2libGUgYmFzZSBhZGRyZXNzZXMuICovCisJaSA9IC0xOworCXdoaWxlICgoaW9bKytpXSAhPSAwKSAmJiAoaSA8IE5FTFMoaW8pKSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKG5ldF9sb2NhbCkpOworCQlpZiAoIWRldikKKwkJCWJyZWFrOworCQlpZiAobmFtZVtpXSkKKwkJCXN0cmNweShkZXYtPm5hbWUsIG5hbWVbaV0pOwkvKiBDb3B5IG5hbWUgKi8KKwkJZGV2LT5iYXNlX2FkZHIgPSBpb1tpXTsKKwkJZGV2LT5pcnEgPSBpcnFbaV07CisKKwkJLyogQ2hlY2sgaWYgdGhlcmUgaXMgc29tZXRoaW5nIGF0IHRoaXMgYmFzZSBhZGRyZXNzLiAqLworCQlpZiAod2F2ZWxhbl9jb25maWcoZGV2LCBpb1tpXSkgPT0gMCkgeworCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpICE9IDApIHsKKwkJCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgc2l6ZW9mKGhhX3QpKTsKKwkJCQl3YXZlbGFuX2xpc3QgPSB3YXZlbGFuX2xpc3QtPm5leHQ7CisJCQl9IGVsc2UgeworCQkJCXJldCA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwl9CisKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwlpZiAoIXdhdmVsYW5fbGlzdCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIldhdmVMQU4gaW5pdF9tb2R1bGUoKTogbm8gZGV2aWNlIGZvdW5kXG4iKTsKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfTU9EVUxFX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIjwtIGluaXRfbW9kdWxlKClcbiIpOworI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJlbW92YWwgb2YgdGhlIG1vZHVsZQorICovCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisjaWZkZWYgREVCVUdfTU9EVUxFX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIi0+IGNsZWFudXBfbW9kdWxlKClcbiIpOworI2VuZGlmCisKKwkvKiBMb29wIG9uIGFsbCBkZXZpY2VzIGFuZCByZWxlYXNlIHRoZW0uICovCisJd2hpbGUgKHdhdmVsYW5fbGlzdCkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2F2ZWxhbl9saXN0LT5kZXY7CisKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIiVzOiBjbGVhbnVwX21vZHVsZSgpOiByZW1vdmluZyBkZXZpY2UgYXQgMHgleFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgKHVuc2lnbmVkIGludCkgZGV2KTsKKyNlbmRpZgorCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBzaXplb2YoaGFfdCkpOworCQl3YXZlbGFuX2xpc3QgPSB3YXZlbGFuX2xpc3QtPm5leHQ7CisKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwl9CisKKyNpZmRlZiBERUJVR19NT0RVTEVfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiPC0gY2xlYW51cF9tb2R1bGUoKVxuIik7CisjZW5kaWYKK30KKyNlbmRpZgkJCQkvKiBNT0RVTEUgKi8KK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQKKyAqIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgd2FzIGRldmVsb3BlZCBhcyBhIGNvbXBvbmVudCBvZiB0aGUKKyAqIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0uCisgKiBJdCBpcyBiYXNlZCBvbiBvdGhlciBkZXZpY2UgZHJpdmVycyBhbmQgaW5mb3JtYXRpb24KKyAqIGVpdGhlciB3cml0dGVuIG9yIHN1cHBsaWVkIGJ5OgorICoJQWpheSBCYWtyZSAoYmFrcmVAcGF1bC5ydXRnZXJzLmVkdSksCisgKglEb25hbGQgQmVja2VyIChiZWNrZXJAc2N5bGQuY29tKSwKKyAqCUxvZWtlIEJyZWRlcnZlbGQgKExvZWtlLkJyZWRlcnZlbGRAVXRyZWNodC5OQ1IuY29tKSwKKyAqCUFuZGVycyBLbGVtZXRzIChrbGVtZXRzQGl0Lmt0aC5zZSksCisgKglWbGFkaW1pciBWLiBLb2xwYWtvdiAod0BzdGllci5rb2VuaWcucnUpLAorICoJTWFyYyBNZWVydGVucyAoTWFyYy5NZWVydGVuc0BVdHJlY2h0Lk5DUi5jb20pLAorICoJUGF1bGluZSBNaWRkZWxpbmsgKG1pZGRlbGluQHBvbHl3YXJlLmlhZi5ubCksCisgKglSb2JlcnQgTW9ycmlzIChydG1AZGFzLmhhcnZhcmQuZWR1KSwKKyAqCUplYW4gVG91cnJpbGhlcyAoanRAaHBsYi5ocGwuaHAuY29tKSwKKyAqCUdpcmlzaCBXZWxsaW5nICh3ZWxsaW5nQHBhdWwucnV0Z2Vycy5lZHUpLAorICoKKyAqIFRoYW5rcyBnbyBhbHNvIHRvOgorICoJSmFtZXMgQXNodG9uIChqYWExMDFAc3lzZW5nLmFudS5lZHUuYXUpLAorICoJQWxhbiBDb3ggKGFsYW5AcmVkaGF0LmNvbSksCisgKglBbGxhbiBDcmVpZ2h0b24gKGFsbGFuY0Bjcy51c3lkLmVkdS5hdSksCisgKglNYXR0aGV3IEdlaWVyIChtYXR0aGV3QGNzLnVzeWQuZWR1LmF1KSwKKyAqCVJlbW8gZGkgR2lvdmFubmkgKHJlbW9AY3MudXN5ZC5lZHUuYXUpLAorICoJRWNraGFyZCBHcmFoIChncmFoQHdyY3MxLnVyei51bmktd3VwcGVydGFsLmRlKSwKKyAqCVZpcHVsIEd1cHRhICh2Z3VwdGFAY3MuYmluZ2hhbXRvbi5lZHUpLAorICoJTWFyayBIYWdhbiAobWhhZ2FuQHd0Y3Bvc3QuZGF5dG9ub2guTkNSLkNPTSksCisgKglUaW0gTmljaG9sc29uICh0aW1AY3MudXN5ZC5lZHUuYXUpLAorICoJSWFuIFBhcmtpbiAoaWFuQGNzLnVzeWQuZWR1LmF1KSwKKyAqCUpvaG4gUm9zZW5iZXJnIChqb2huckBjcy51c3lkLmVkdS5hdSksCisgKglHZW9yZ2UgUm9zc2kgKGdlb3JnZUBwaG0uZ292LmF1KSwKKyAqCUFydGh1ciBTY290dCAoYXJ0aHVyQGNzLnVzeWQuZWR1LmF1KSwKKyAqCVBldGVyIFN0b3JleSwKKyAqIGZvciB0aGVpciBhc3Npc3RhbmNlIGFuZCBhZHZpY2UuCisgKgorICogUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMsIHVwZGF0ZXMsIGNvbW1lbnRzIHRvOgorICoKKyAqIEJydWNlIEphbnNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtYWlsOiAgYnJ1Y2VAY3MudXN5ZC5lZHUuYXUKKyAqIEJhc3NlciBEZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UgICAgICAgICAgIFBob25lOiAgKzYxLTItOTM1MS0zNDIzCisgKiBVbml2ZXJzaXR5IG9mIFN5ZG5leSwgTi5TLlcuLCAyMDA2LCBBVVNUUkFMSUEgICBGYXg6ICAgICs2MS0yLTkzNTEtMzgzOAorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcxNzJjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4uaApAQCAtMCwwICsxLDM3MCBAQAorLyoKKyAqCVdhdmVMQU4gSVNBIGRyaXZlcgorICoKKyAqCQlKZWFuIElJIC0gSFBMQiAnOTYKKyAqCisgKiBSZW9yZ2FuaXNhdGlvbiBhbmQgZXh0ZW5zaW9uIG9mIHRoZSBkcml2ZXIuCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgZm9sbG93cy4gU2VlIHdhdmVsYW4ucC5oIGZvciBkZXRhaWxzLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIGZvciB0aGUgV2F2ZUxBTiBoYXJkd2FyZS4gTm90ZSB0aGF0CisgKiB0aGUgV2F2ZUxBTiBJU0EgaW5jbHVkZXMgYSBpODI1ODYgY29udHJvbGxlciAoc2VlIGRlZmluaXRpb25zIGluCisgKiBmaWxlIGk4MjU4Ni5oKS4KKyAqCisgKiBUaGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIElTQSBoYXJkd2FyZSBhbmQgdGhlIFBDTUNJQSBvbmUgaXMKKyAqIHRoZSBFdGhlcm5ldCBjb250cm9sbGVyIChpODI1ODYgaW5zdGVhZCBvZiBpODI1OTMpLgorICogVGhlIGk4MjU4NiBhbGxvd3MgbXVsdGlwbGUgdHJhbnNtaXQgYnVmZmVycy4gIFRoZSBQU0EgbmVlZHMgdG8gYmUgYWNjZXNzZWQKKyAqIHRocm91Z2ggdGhlIGhvc3QgaW50ZXJmYWNlLgorICovCisKKyNpZm5kZWYgX1dBVkVMQU5fSAorI2RlZmluZQlfV0FWRUxBTl9ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBNQUdJQyBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGV0ZWN0aW9uIG9mIHRoZSBXYXZlTEFOIGNhcmQgaXMgZG9uZSBieSByZWFkaW5nIHRoZSBNQUMKKyAqIGFkZHJlc3MgZnJvbSB0aGUgY2FyZCBhbmQgY2hlY2tpbmcgaXQuICBJZiB5b3UgaGF2ZSBhIG5vbi1BVCZUCisgKiBwcm9kdWN0IChPRU0sIGxpa2UgREVDIFJvYW1BYm91dCwgRGlnaXRhbCBPY2Vhbiwgb3IgRXBzb24pLAorICogeW91IG1pZ2h0IG5lZWQgdG8gbW9kaWZ5IHRoaXMgcGFydCB0byBhY2NvbW1vZGF0ZSB5b3VyIGhhcmR3YXJlLgorICovCitzdGF0aWMgY29uc3QgY2hhcglNQUNfQUREUkVTU0VTW11bM10gPQoreworICB7IDB4MDgsIDB4MDAsIDB4MEUgfSwJCS8qIEFUJlQgV2F2ZUxBTiAoc3RhbmRhcmQpICYgREVDIFJvYW1BYm91dCAqLworICB7IDB4MDgsIDB4MDAsIDB4NkEgfSwJCS8qIEFUJlQgV2F2ZUxBTiAoYWx0ZXJuYXRlKSAqLworICB7IDB4MDAsIDB4MDAsIDB4RTEgfSwJCS8qIEhpdGFjaGkgV2F2ZWxhbiAqLworICB7IDB4MDAsIDB4NjAsIDB4MUQgfQkJLyogTHVjZW50IFdhdmVsYW4gKGFub3RoZXIgb25lKSAqLworICAvKiBBZGQgeW91ciBjYXJkIGhlcmUgYW5kIHNlbmQgbWUgdGhlIHBhdGNoISAqLworfTsKKworI2RlZmluZSBXQVZFTEFOX0FERFJfU0laRQk2CS8qIFNpemUgb2YgYSBNQUMgYWRkcmVzcyAqLworCisjZGVmaW5lIFdBVkVMQU5fTVRVCQkxNTAwCS8qIE1heGltdW0gc2l6ZSBvZiBXYXZlTEFOIHBhY2tldCAqLworCisjZGVmaW5lCU1BWERBVEFaCQkoV0FWRUxBTl9BRERSX1NJWkUgKyBXQVZFTEFOX0FERFJfU0laRSArIDIgKyBXQVZFTEFOX01UVSkKKworLyoKKyAqIENvbnN0YW50cyB1c2VkIHRvIGNvbnZlcnQgY2hhbm5lbHMgdG8gZnJlcXVlbmNpZXMKKyAqLworCisvKiBGcmVxdWVuY3kgYXZhaWxhYmxlIGluIHRoZSAyLjAgbW9kZW0sIGluIHVuaXRzIG9mIDI1MCBrSHoKKyAqIChhcyByZWFkIGluIHRoZSBvZmZzZXQgcmVnaXN0ZXIgb2YgdGhlIGRhYyBhcmVhKS4KKyAqIFVzZWQgdG8gbWFwIGNoYW5uZWwgbnVtYmVycyB1c2VkIGJ5IGB3ZnJlcXNlbCcgdG8gZnJlcXVlbmNpZXMKKyAqLworc3RhdGljIGNvbnN0IHNob3J0CWNoYW5uZWxfYmFuZHNbXSA9IHsgMHgzMCwgMHg1OCwgMHg2NCwgMHg3QSwgMHg4MCwgMHhBOCwKKwkJCQkgICAgMHhEMCwgMHhGMCwgMHhGOCwgMHgxNTAgfTsKKworLyogRnJlcXVlbmNpZXMgb2YgdGhlIDEuMCBtb2RlbSAoZml4ZWQgZnJlcXVlbmNpZXMpLgorICogVXNlIHRvIG1hcCB0aGUgUFNBIGBzdWJiYW5kJyB0byBhIGZyZXF1ZW5jeQorICogTm90ZSA6IGFsbCBmcmVxdWVuY2llcyBhcGFydCBmcm9tIHRoZSBmaXJzdCBvbmUgbmVlZCB0byBiZSBtdWx0aXBsaWVkIGJ5IDEwCisgKi8KK3N0YXRpYyBjb25zdCBpbnQJZml4ZWRfYmFuZHNbXSA9IHsgOTE1ZTYsIDIuNDI1ZTgsIDIuNDZlOCwgMi40ODRlOCwgMi40MzA1ZTggfTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogUEMgSU5URVJGQUNFICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBIb3N0IEFkYXB0b3Igc3RydWN0dXJlLgorICogKGJhc2UgaXMgYm9hcmQgcG9ydCBhZGRyZXNzKS4KKyAqLwordHlwZWRlZiB1bmlvbiBoYWNzX3UJaGFjc191OwordW5pb24gaGFjc191Cit7CisJdW5zaWduZWQgc2hvcnQJaHVfY29tbWFuZDsJCS8qIENvbW1hbmQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUhBQ1JfUkVTRVQJCTB4MDAwMQkvKiBSZXNldCBib2FyZCAqLworI2RlZmluZQkJSEFDUl9DQQkJCTB4MDAwMgkvKiBTZXQgQ2hhbm5lbCBBdHRlbnRpb24gZm9yIDgyNTg2ICovCisjZGVmaW5lCQlIQUNSXzE2QklUUwkJMHgwMDA0CS8qIDE2LWJpdCBvcGVyYXRpb24gKDAgPT4gOGJpdHMpICovCisjZGVmaW5lCQlIQUNSX09VVDAJCTB4MDAwOAkvKiBHZW5lcmFsIHB1cnBvc2Ugb3V0cHV0IHBpbiAwICovCisJCQkJCQkvKiBub3QgdXNlZCAtIG11c3QgYmUgMSAqLworI2RlZmluZQkJSEFDUl9PVVQxCQkweDAwMTAJLyogR2VuZXJhbCBwdXJwb3NlIG91dHB1dCBwaW4gMSAqLworCQkJCQkJLyogbm90IHVzZWQgLSBtdXN0IGJlIDEgKi8KKyNkZWZpbmUJCUhBQ1JfODI1ODZfSU5UX0VOQUJMRQkweDAwMjAJLyogRW5hYmxlIDgyNTg2IGludGVycnVwdHMgKi8KKyNkZWZpbmUJCUhBQ1JfTU1DX0lOVF9FTkFCTEUJMHgwMDQwCS8qIEVuYWJsZSBNTUMgaW50ZXJydXB0cyAqLworI2RlZmluZQkJSEFDUl9JTlRSX0NMUl9FTkFCTEUJMHgwMDgwCS8qIEVuYWJsZSBpbnRlcnJ1cHQgc3RhdHVzIHJlYWQvY2xlYXIgKi8KKwl1bnNpZ25lZCBzaG9ydAlodV9zdGF0dXM7CQkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUhBU1JfODI1ODZfSU5UUgkJMHgwMDAxCS8qIEludGVycnVwdCByZXF1ZXN0IGZyb20gODI1ODYgKi8KKyNkZWZpbmUJCUhBU1JfTU1DX0lOVFIJCTB4MDAwMgkvKiBJbnRlcnJ1cHQgcmVxdWVzdCBmcm9tIE1NQyAqLworI2RlZmluZQkJSEFTUl9NTUNfQlVTWQkJMHgwMDA0CS8qIE1NQyBidXN5IGluZGljYXRpb24gKi8KKyNkZWZpbmUJCUhBU1JfUFNBX0JVU1kJCTB4MDAwOAkvKiBMQU4gcGFyYW1ldGVyIHN0b3JhZ2UgYXJlYSBidXN5ICovCit9OworCit0eXBlZGVmIHN0cnVjdCBoYV90CWhhX3Q7CitzdHJ1Y3QgaGFfdAoreworCWhhY3NfdQkJaGFfY3M7CQkvKiBDb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXJzICovCisjZGVmaW5lIAkJaGFfY29tbWFuZAloYV9jcy5odV9jb21tYW5kCisjZGVmaW5lIAkJaGFfc3RhdHVzCWhhX2NzLmh1X3N0YXR1cworCXVuc2lnbmVkIHNob3J0CWhhX21tY3I7CS8qIE1vZGVtIE1hbmFnZW1lbnQgQ3RybCBSZWdpc3RlciAqLworCXVuc2lnbmVkIHNob3J0CWhhX3Bpb3IwOwkvKiBQcm9ncmFtIEkvTyBBZGRyZXNzIFJlZ2lzdGVyIFBvcnQgMCAqLworCXVuc2lnbmVkIHNob3J0CWhhX3Bpb3AwOwkvKiBQcm9ncmFtIEkvTyBQb3J0IDAgKi8KKwl1bnNpZ25lZCBzaG9ydAloYV9waW9yMTsJLyogUHJvZ3JhbSBJL08gQWRkcmVzcyBSZWdpc3RlciBQb3J0IDEgKi8KKwl1bnNpZ25lZCBzaG9ydAloYV9waW9wMTsJLyogUHJvZ3JhbSBJL08gUG9ydCAxICovCisJdW5zaWduZWQgc2hvcnQJaGFfcGlvcjI7CS8qIFByb2dyYW0gSS9PIEFkZHJlc3MgUmVnaXN0ZXIgUG9ydCAyICovCisJdW5zaWduZWQgc2hvcnQJaGFfcGlvcDI7CS8qIFByb2dyYW0gSS9PIFBvcnQgMiAqLworfTsKKworI2RlZmluZSBIQV9TSVpFCQkxNgorCisjZGVmaW5lCWhvZmYocCxmKSAJKHVuc2lnbmVkIHNob3J0KSgodm9pZCAqKSgmKChoYV90ICopKCh2b2lkICopMCArIChwKSkpLT5mKSAtICh2b2lkICopMCkKKyNkZWZpbmUJSEFDUihwKQkJaG9mZihwLCBoYV9jb21tYW5kKQorI2RlZmluZQlIQVNSKHApCQlob2ZmKHAsIGhhX3N0YXR1cykKKyNkZWZpbmUJTU1DUihwKQkJaG9mZihwLCBoYV9tbWNyKQorI2RlZmluZQlQSU9SMChwKQlob2ZmKHAsIGhhX3Bpb3IwKQorI2RlZmluZQlQSU9QMChwKQlob2ZmKHAsIGhhX3Bpb3AwKQorI2RlZmluZQlQSU9SMShwKQlob2ZmKHAsIGhhX3Bpb3IxKQorI2RlZmluZQlQSU9QMShwKQlob2ZmKHAsIGhhX3Bpb3AxKQorI2RlZmluZQlQSU9SMihwKQlob2ZmKHAsIGhhX3Bpb3IyKQorI2RlZmluZQlQSU9QMihwKQlob2ZmKHAsIGhhX3Bpb3AyKQorCisvKgorICogUHJvZ3JhbSBJL08gTW9kZSBSZWdpc3RlciB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgU1RBVElDX1BJTwkJMAkvKiBNb2RlIDE6IHN0YXRpYyBtb2RlICovCisJCQkJCS8qIFJBTSBhY2Nlc3MgPz8/ICovCisjZGVmaW5lIEFVVE9JTkNSX1BJTwkJMQkvKiBNb2RlIDI6IGF1dG8gaW5jcmVtZW50IG1vZGUgKi8KKwkJCQkJLyogUkFNIGFjY2VzcyA/Pz8gKi8KKyNkZWZpbmUgQVVUT0RFQ1JfUElPCQkyCS8qIE1vZGUgMzogYXV0byBkZWNyZW1lbnQgbW9kZSAqLworCQkJCQkvKiBSQU0gYWNjZXNzID8/PyAqLworI2RlZmluZSBQQVJBTV9BQ0NFU1NfUElPCTMJLyogTW9kZSA0OiBMQU4gcGFyYW1ldGVyIGFjY2VzcyBtb2RlICovCisJCQkJCS8qIFBhcmFtZXRlciBhY2Nlc3MuICovCisjZGVmaW5lIFBJT19NQVNLCQkzCS8qIHJlZ2lzdGVyIG1hc2sgKi8KKyNkZWZpbmUgUElPTShjbWQscGlvbm8pCQkoKHVfc2hvcnQpY21kIDw8IDEwIDw8IChwaW9ubyAqIDIpKQorCisjZGVmaW5lCUhBQ1JfREVGQVVMVAkJKEhBQ1JfT1VUMCB8IEhBQ1JfT1VUMSB8IEhBQ1JfMTZCSVRTIHwgUElPTShTVEFUSUNfUElPLCAwKSB8IFBJT00oQVVUT0lOQ1JfUElPLCAxKSB8IFBJT00oUEFSQU1fQUNDRVNTX1BJTywgMikpCisjZGVmaW5lCUhBQ1JfSU5UUk9OCQkoSEFDUl84MjU4Nl9JTlRfRU5BQkxFIHwgSEFDUl9NTUNfSU5UX0VOQUJMRSB8IEhBQ1JfSU5UUl9DTFJfRU5BQkxFKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogTUVNT1JZIExBWU9VVCAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIE9uYm9hcmQgNjQgayBSQU0gbGF5b3V0LgorICogKE9mZnNldHMgZnJvbSAweDAwMDAuKQorICovCisjZGVmaW5lIE9GRlNFVF9SVQkJMHgwMDAwCQkvKiA3NSUgbWVtb3J5ICovCisjZGVmaW5lIE9GRlNFVF9DVQkJMHhDMDAwCQkvKiAyNSUgbWVtb3J5ICovCisjZGVmaW5lIE9GRlNFVF9TQ0IJCShPRkZTRVRfSVNDUCAtIHNpemVvZihzY2JfdCkpCisjZGVmaW5lIE9GRlNFVF9JU0NQCQkoT0ZGU0VUX1NDUCAtIHNpemVvZihpc2NwX3QpKQorI2RlZmluZSBPRkZTRVRfU0NQCQlJODI1ODZfU0NQX0FERFIKKworI2RlZmluZQlSWEJMT0NLWgkJKHNpemVvZihmZF90KSArIHNpemVvZihyYmRfdCkgKyBNQVhEQVRBWikKKyNkZWZpbmUJVFhCTE9DS1oJCShzaXplb2YoYWNfdHhfdCkgKyBzaXplb2YoYWNfbm9wX3QpICsgc2l6ZW9mKHRiZF90KSArIE1BWERBVEFaKQorCisjZGVmaW5lCU5SWEJMT0NLUwkJKChPRkZTRVRfQ1UgLSBPRkZTRVRfUlUpIC8gUlhCTE9DS1opCisjZGVmaW5lCU5UWEJMT0NLUwkJKChPRkZTRVRfU0NCIC0gT0ZGU0VUX0NVKSAvIFRYQkxPQ0taKQorCisvKioqKioqKioqKioqKioqKioqKioqKiBQQVJBTUVURVIgU1RPUkFHRSBBUkVBICoqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBQYXJhbWV0ZXIgU3RvcmFnZSBBcmVhIChQU0EpLgorICovCit0eXBlZGVmIHN0cnVjdCBwc2FfdAlwc2FfdDsKK3N0cnVjdCBwc2FfdAoreworICB1bnNpZ25lZCBjaGFyCXBzYV9pb19iYXNlX2FkZHJfMTsJLyogWzB4MDBdIEJhc2UgYWRkcmVzcyAxID8/PyAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9pb19iYXNlX2FkZHJfMjsJLyogWzB4MDFdIEJhc2UgYWRkcmVzcyAyICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2lvX2Jhc2VfYWRkcl8zOwkvKiBbMHgwMl0gQmFzZSBhZGRyZXNzIDMgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfaW9fYmFzZV9hZGRyXzQ7CS8qIFsweDAzXSBCYXNlIGFkZHJlc3MgNCAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9yZW1fYm9vdF9hZGRyXzE7CS8qIFsweDA0XSBSZW1vdGUgQm9vdCBBZGRyZXNzIDEgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfcmVtX2Jvb3RfYWRkcl8yOwkvKiBbMHgwNV0gUmVtb3RlIEJvb3QgQWRkcmVzcyAyICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3JlbV9ib290X2FkZHJfMzsJLyogWzB4MDZdIFJlbW90ZSBCb290IEFkZHJlc3MgMyAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9ob2xpX3BhcmFtczsJLyogWzB4MDddIEhPc3QgTGFuIEludGVyZmFjZSAoSE9MSSkgUGFyYW1ldGVycyAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9pbnRfcmVxX25vOwkJLyogWzB4MDhdIEludGVycnVwdCBSZXF1ZXN0IExpbmUgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfdW51c2VkMFs3XTsJCS8qIFsweDA5LTB4MEZdIHVudXNlZCAqLworCisgIHVuc2lnbmVkIGNoYXIJcHNhX3VuaXZfbWFjX2FkZHJbV0FWRUxBTl9BRERSX1NJWkVdOwkvKiBbMHgxMC0weDE1XSBVbml2ZXJzYWwgKGZhY3RvcnkpIE1BQyBBZGRyZXNzICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2xvY2FsX21hY19hZGRyW1dBVkVMQU5fQUREUl9TSVpFXTsJLyogWzB4MTYtMUJdIExvY2FsIE1BQyBBZGRyZXNzICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3VuaXZfbG9jYWxfc2VsOwkvKiBbMHgxQ10gVW5pdmVyc2FsIExvY2FsIFNlbGVjdGlvbiAqLworI2RlZmluZQkJUFNBX1VOSVZFUlNBTAkwCQkvKiBVbml2ZXJzYWwgKGZhY3RvcnkpICovCisjZGVmaW5lCQlQU0FfTE9DQUwJMQkJLyogTG9jYWwgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfY29tcF9udW1iZXI7CS8qIFsweDFEXSBDb21wYXRpYmlsaXR5IE51bWJlcjoJICovCisjZGVmaW5lCQlQU0FfQ09NUF9QQ19BVF85MTUJMCAJLyogUEMtQVQgOTE1IE1IeiAJICovCisjZGVmaW5lCQlQU0FfQ09NUF9QQ19NQ185MTUJMSAJLyogUEMtTUMgOTE1IE1IegkgKi8KKyNkZWZpbmUJCVBTQV9DT01QX1BDX0FUXzI0MDAJMiAJLyogUEMtQVQgMi40IEdIegkgKi8KKyNkZWZpbmUJCVBTQV9DT01QX1BDX01DXzI0MDAJMyAJLyogUEMtTUMgMi40IEdIeiAJICovCisjZGVmaW5lCQlQU0FfQ09NUF9QQ01DSUFfOTE1CTQgCS8qIFBDTUNJQSA5MTUgTUh6IG9yIDIuMCAqLworICB1bnNpZ25lZCBjaGFyCXBzYV90aHJfcHJlX3NldDsJLyogWzB4MUVdIE1vZGVtIFRocmVzaG9sZCBQcmVzZXQgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfZmVhdHVyZV9zZWxlY3Q7CS8qIFsweDFGXSBDYWxsIGNvZGUgcmVxdWlyZWQgKDE9b24pICovCisjZGVmaW5lCQlQU0FfRkVBVFVSRV9DQUxMX0NPREUJMHgwMSAJLyogQ2FsbCBjb2RlIHJlcXVpcmVkIChKYXBhbikgKi8KKyAgdW5zaWduZWQgY2hhcglwc2Ffc3ViYmFuZDsJCS8qIFsweDIwXSBTdWJiYW5kCSAgKi8KKyNkZWZpbmUJCVBTQV9TVUJCQU5EXzkxNQkJMAkvKiA5MTUgTUh6IG9yIDIuMCAqLworI2RlZmluZQkJUFNBX1NVQkJBTkRfMjQyNQkxCS8qIDI0MjUgTUh6CSAgKi8KKyNkZWZpbmUJCVBTQV9TVUJCQU5EXzI0NjAJMgkvKiAyNDYwIE1IegkgICovCisjZGVmaW5lCQlQU0FfU1VCQkFORF8yNDg0CTMJLyogMjQ4NCBNSHoJICAqLworI2RlZmluZQkJUFNBX1NVQkJBTkRfMjQzMF81CTQJLyogMjQzMC41IE1IegkgICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3F1YWxpdHlfdGhyOwkvKiBbMHgyMV0gTW9kZW0gUXVhbGl0eSBUaHJlc2hvbGQgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfbW9kX2RlbGF5OwkJLyogWzB4MjJdIE1vZGVtIERlbGF5ICg/KSAocmVzZXJ2ZWQpICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX253aWRbMl07CQkvKiBbMHgyMy0weDI0XSBOZXR3b3JrIElEICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX253aWRfc2VsZWN0OwkvKiBbMHgyNV0gTmV0d29yayBJRCBTZWxlY3QgT24vT2ZmICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2VuY3J5cHRpb25fc2VsZWN0OwkvKiBbMHgyNl0gRW5jcnlwdGlvbiBPbi9PZmYgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfZW5jcnlwdGlvbl9rZXlbOF07CS8qIFsweDI3LTB4MkVdIEVuY3J5cHRpb24gS2V5ICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2RhdGFidXNfd2lkdGg7CS8qIFsweDJGXSBBVCBidXMgd2lkdGggc2VsZWN0IDgvMTYgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfY2FsbF9jb2RlWzhdOwkvKiBbMHgzMC0weDM3XSAoSmFwYW4pIENhbGwgQ29kZSAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9ud2lkX3ByZWZpeFsyXTsJLyogWzB4MzgtMHgzOV0gUm9hbWluZyBkb21haW4gKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfcmVzZXJ2ZWRbMl07CS8qIFsweDNBLTB4M0JdIFJlc2VydmVkIC0gZml4ZWQgMDAgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfY29uZl9zdGF0dXM7CS8qIFsweDNDXSBDb25mIFN0YXR1cywgYml0IDA9MTpjb25maWcqLworICB1bnNpZ25lZCBjaGFyCXBzYV9jcmNbMl07CQkvKiBbMHgzRF0gQ1JDLTE2IG92ZXIgUFNBICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2NyY19zdGF0dXM7CQkvKiBbMHgzRl0gQ1JDIFZhbGlkIEZsYWcgKi8KK307CisKKyNkZWZpbmUJUFNBX1NJWkUJNjQKKworLyogQ2FsY3VsYXRlIG9mZnNldCBvZiBhIGZpZWxkIGluIHRoZSBhYm92ZSBzdHJ1Y3R1cmUuCisgKiBXYXJuaW5nOiAgb25seSBldmVuIGFkZHJlc3NlcyBhcmUgdXNlZC4gKi8KKyNkZWZpbmUJcHNhb2ZmKHAsZikgCSgodW5zaWduZWQgc2hvcnQpICgodm9pZCAqKSgmKChwc2FfdCAqKSAoKHZvaWQgKikgTlVMTCArIChwKSkpLT5mKSAtICh2b2lkICopIE5VTEwpKQorCisvKioqKioqKioqKioqKioqKioqKiogTU9ERU0gTUFOQUdFTUVOVCBJTlRFUkZBQ0UgKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBNb2RlbSBNYW5hZ2VtZW50IENvbnRyb2xsZXIgKE1NQykgd3JpdGUgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtbXdfdAltbXdfdDsKK3N0cnVjdCBtbXdfdAoreworICB1bnNpZ25lZCBjaGFyCW1td19lbmNyX2tleVs4XTsJLyogZW5jcnlwdGlvbiBrZXkgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfZW5jcl9lbmFibGU7CS8qIEVuYWJsZSBvciBkaXNhYmxlIGVuY3J5cHRpb24uICovCisjZGVmaW5lCU1NV19FTkNSX0VOQUJMRV9NT0RFCTB4MDIJLyogbW9kZSBvZiBzZWN1cml0eSBvcHRpb24gKi8KKyNkZWZpbmUJTU1XX0VOQ1JfRU5BQkxFX0VOCTB4MDEJLyogRW5hYmxlIHNlY3VyaXR5IG9wdGlvbi4gKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfdW51c2VkMFsxXTsJCS8qIHVudXNlZCAqLworICB1bnNpZ25lZCBjaGFyCW1td19kZXNfaW9faW52ZXJ0OwkvKiBlbmNyeXB0aW9uIG9wdGlvbiAqLworI2RlZmluZQlNTVdfREVTX0lPX0lOVkVSVF9SRVMJMHgwRgkvKiByZXNlcnZlZCAqLworI2RlZmluZQlNTVdfREVTX0lPX0lOVkVSVF9DVFJMCTB4RjAJLyogY29udHJvbCAoPykgKHNldCB0byAwKSAqLworICB1bnNpZ25lZCBjaGFyCW1td191bnVzZWQxWzVdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2xvb3B0X3NlbDsJCS8qIGxvb3B0ZXN0IHNlbGVjdGlvbiAqLworI2RlZmluZQlNTVdfTE9PUFRfU0VMX0RJU19OV0lECTB4NDAJLyogRGlzYWJsZSBOV0lEIGZpbHRlcmluZy4gKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9JTlQJMHgyMAkvKiBBY3RpdmF0ZSBBdHRlbnRpb24gUmVxdWVzdC4gKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9MUwkweDEwCS8qIGxvb3B0ZXN0LCBubyBjb2xsaXNpb24gYXZvaWRhbmNlICovCisjZGVmaW5lIE1NV19MT09QVF9TRUxfTFQzQQkweDA4CS8qIGxvb3B0ZXN0IDNhICovCisjZGVmaW5lCU1NV19MT09QVF9TRUxfTFQzQgkweDA0CS8qIGxvb3B0ZXN0IDNiICovCisjZGVmaW5lCU1NV19MT09QVF9TRUxfTFQzQwkweDAyCS8qIGxvb3B0ZXN0IDNjICovCisjZGVmaW5lCU1NV19MT09QVF9TRUxfTFQzRAkweDAxCS8qIGxvb3B0ZXN0IDNkICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2phYmJlcl9lbmFibGU7CS8qIGphYmJlciB0aW1lciBlbmFibGUgKi8KKyAgLyogQWJvcnQgdHJhbnNtaXNzaW9ucyA+IDIwMCBtcyAqLworICB1bnNpZ25lZCBjaGFyCW1td19mcmVlemU7CQkvKiBmcmVlemUgb3IgdW5mcmVlemUgc2lnbmFsIGxldmVsICovCisgIC8qIDAgOiBzaWduYWwgbGV2ZWwgJiBxdWFsIHVwZGF0ZWQgZm9yIGV2ZXJ5IG5ldyBtZXNzYWdlLCAxIDogZnJvemVuICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2FudGVuX3NlbDsJCS8qIGFudGVubmEgc2VsZWN0aW9uICovCisjZGVmaW5lIE1NV19BTlRFTl9TRUxfU0VMCTB4MDEJLyogZGlyZWN0IGFudGVubmEgc2VsZWN0aW9uICovCisjZGVmaW5lCU1NV19BTlRFTl9TRUxfQUxHX0VOCTB4MDIJLyogYW50ZW5uYSBzZWxlY3Rpb24gYWxnby4gZW5hYmxlICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2lmczsJCS8qIGludGVyIGZyYW1lIHNwYWNpbmcgKi8KKyAgLyogbWluIHRpbWUgYmV0d2VlbiB0cmFuc21pc3Npb24gaW4gYml0IHBlcmlvZHMgKC41IHVzKSAtIGJpdCAwIGlnbm9yZWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfbW9kX2RlbGF5OwkgCS8qIG1vZGVtIGRlbGF5IChzeW5jaHJvKSAqLworICB1bnNpZ25lZCBjaGFyCW1td19qYW1fdGltZTsJCS8qIGphbW1pbmcgdGltZSAoYWZ0ZXIgY29sbGlzaW9uKSAqLworICB1bnNpZ25lZCBjaGFyCW1td191bnVzZWQyWzFdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW13X3Rocl9wcmVfc2V0OwkvKiBsZXZlbCB0aHJlc2hvbGQgcHJlc2V0ICovCisgIC8qIERpc2NhcmQgYWxsIHBhY2tldCB3aXRoIHNpZ25hbCA8IHRoaXMgdmFsdWUgKDQpICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2RlY2F5X3BybTsJCS8qIGRlY2F5IHBhcmFtZXRlcnMgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfZGVjYXlfdXBkYXRfcHJtOwkvKiBkZWNheSB1cGRhdGUgcGFyYW1ldGVycyAqLworICB1bnNpZ25lZCBjaGFyCW1td19xdWFsaXR5X3RocjsJLyogcXVhbGl0eSAoei1xdW90aWVudCkgdGhyZXNob2xkICovCisgIC8qIERpc2NhcmQgYWxsIHBhY2tldCB3aXRoIHF1YWxpdHkgPCB0aGlzIHZhbHVlICgzKSAqLworICB1bnNpZ25lZCBjaGFyCW1td19uZXR3X2lkX2w7CQkvKiBOV0lEIGxvdyBvcmRlciBieXRlICovCisgIHVuc2lnbmVkIGNoYXIJbW13X25ldHdfaWRfaDsJCS8qIE5XSUQgaGlnaCBvcmRlciBieXRlICovCisgIC8qIE5ldHdvcmsgSUQgb3IgRG9tYWluIDogY3JlYXRlIHZpcnR1YWwgbmV0IG9uIHRoZSBhaXIgKi8KKworICAvKiAyLjAgSGFyZHdhcmUgZXh0ZW5zaW9uIC0gZnJlcXVlbmN5IHNlbGVjdGlvbiBzdXBwb3J0ICovCisgIHVuc2lnbmVkIGNoYXIJbW13X21vZGVfc2VsZWN0OwkvKiBmb3IgYW5hbG9nIHRlc3RzIChzZXQgdG8gMCkgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfdW51c2VkM1sxXTsJCS8qIHVudXNlZCAqLworICB1bnNpZ25lZCBjaGFyCW1td19mZWVfY3RybDsJCS8qIGZyZXF1ZW5jeSBFRVBST00gY29udHJvbCAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfUFJFCTB4MTAJLyogRW5hYmxlIHByb3RlY3RlZCBpbnN0cnVjdGlvbnMuICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9EV0xECTB4MDgJLyogRG93bmxvYWQgRUVQUk9NIHRvIG1tYy4gKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX0NNRAkweDA3CS8qIEVFUFJPTSBjb21tYW5kczogICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9SRUFECTB4MDYJLyogUmVhZCAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfV1JFTgkweDA0CS8qIFdyaXRlIGVuYWJsZSAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfV1JJVEUJMHgwNQkvKiBXcml0ZSBkYXRhIHRvIGFkZHJlc3MuICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9XUkFMTAkweDA0CS8qIFdyaXRlIGRhdGEgdG8gYWxsIGFkZHJlc3Nlcy4gKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1dEUwkweDA0CS8qIFdyaXRlIGRpc2FibGUgKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1BSUkVBRAkweDE2CS8qIFJlYWQgYWRkciBmcm9tIHByb3RlY3QgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1BSRU4JMHgxNAkvKiBQcm90ZWN0IHJlZ2lzdGVyIGVuYWJsZSAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfUFJDTEVBUgkweDE3CS8qIFVucHJvdGVjdCBhbGwgcmVnaXN0ZXJzLiAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfUFJXUklURQkweDE1CS8qIFdyaXRlIGFkZHJlc3MgaW4gcHJvdGVjdCByZWdpc3RlciAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfUFJEUwkweDE0CS8qIFByb3RlY3QgcmVnaXN0ZXIgZGlzYWJsZSAqLworICAvKiBOZXZlciBpc3N1ZSB0aGUgUFJEUyBjb21tYW5kOiAgaXQncyBpcnJldmVyc2libGUhICovCisKKyAgdW5zaWduZWQgY2hhcgltbXdfZmVlX2FkZHI7CQkvKiBFRVBST00gYWRkcmVzcyAqLworI2RlZmluZQlNTVdfRkVFX0FERFJfQ0hBTk5FTAkweEYwCS8qIFNlbGVjdCB0aGUgY2hhbm5lbC4gKi8KKyNkZWZpbmUJTU1XX0ZFRV9BRERSX09GRlNFVAkweDBGCS8qIE9mZnNldCBpbiBjaGFubmVsIGRhdGEgKi8KKyNkZWZpbmUJTU1XX0ZFRV9BRERSX0VOCQkweEMwCS8qIEZFRV9DVFJMIGVuYWJsZSBvcGVyYXRpb25zICovCisjZGVmaW5lCU1NV19GRUVfQUREUl9EUwkJMHgwMAkvKiBGRUVfQ1RSTCBkaXNhYmxlIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUJTU1XX0ZFRV9BRERSX0FMTAkweDQwCS8qIEZFRV9DVFJMIGFsbCBvcGVyYXRpb25zICovCisjZGVmaW5lCU1NV19GRUVfQUREUl9DTEVBUgkweEZGCS8qIEZFRV9DVFJMIGNsZWFyIG9wZXJhdGlvbnMgKi8KKworICB1bnNpZ25lZCBjaGFyCW1td19mZWVfZGF0YV9sOwkJLyogV3JpdGUgZGF0YSB0byBFRVBST00uICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2ZlZV9kYXRhX2g7CQkvKiBoaWdoIG9jdGV0ICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2V4dF9hbnQ7CQkvKiBTZXR0aW5nIGZvciBleHRlcm5hbCBhbnRlbm5hICovCisjZGVmaW5lCU1NV19FWFRfQU5UX0VYVEFOVAkweDAxCS8qIFNlbGVjdCBleHRlcm5hbCBhbnRlbm5hICovCisjZGVmaW5lCU1NV19FWFRfQU5UX1BPTAkJMHgwMgkvKiBQb2xhcml0eSBvZiB0aGUgYW50ZW5uYSAqLworI2RlZmluZQlNTVdfRVhUX0FOVF9JTlRFUk5BTAkweDAwCS8qIEludGVybmFsIGFudGVubmEgKi8KKyNkZWZpbmUJTU1XX0VYVF9BTlRfRVhURVJOQUwJMHgwMwkvKiBFeHRlcm5hbCBhbnRlbm5hICovCisjZGVmaW5lCU1NV19FWFRfQU5UX0lRX1RFU1QJMHgxQwkvKiBJUSB0ZXN0IHBhdHRlcm4gKHNldCB0byAwKSAqLworfTsKKworI2RlZmluZQlNTVdfU0laRQkzNworCisjZGVmaW5lCW1td29mZihwLGYpIAkodW5zaWduZWQgc2hvcnQpKCh2b2lkICopKCYoKG1td190ICopKCh2b2lkICopMCArIChwKSkpLT5mKSAtICh2b2lkICopMCkKKworLyoKKyAqIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlciAoTU1DKSByZWFkIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbW1yX3QJbW1yX3Q7CitzdHJ1Y3QgbW1yX3QKK3sKKyAgdW5zaWduZWQgY2hhcgltbXJfdW51c2VkMFs4XTsJCS8qIHVudXNlZCAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9kZXNfc3RhdHVzOwkJLyogZW5jcnlwdGlvbiBzdGF0dXMgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZGVzX2F2YWlsOwkJLyogZW5jcnlwdGlvbiBhdmFpbGFibGUgKDB4NTUgcmVhZCkgKi8KKyNkZWZpbmUJTU1SX0RFU19BVkFJTF9ERVMJMHg1NQkJLyogREVTIGF2YWlsYWJsZSAqLworI2RlZmluZQlNTVJfREVTX0FWQUlMX0FFUwkweDMzCQkvKiBBRVMgKEFUJlQpIGF2YWlsYWJsZSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9kZXNfaW9faW52ZXJ0OwkvKiBkZXMgSS9PIGludmVydCByZWdpc3RlciAqLworICB1bnNpZ25lZCBjaGFyCW1tcl91bnVzZWQxWzVdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2RjZV9zdGF0dXM7CQkvKiBEQ0Ugc3RhdHVzICovCisjZGVmaW5lCU1NUl9EQ0VfU1RBVFVTX1JYX0JVU1kJCTB4MDEJLyogcmVjZWl2ZXIgYnVzeSAqLworI2RlZmluZQlNTVJfRENFX1NUQVRVU19MT09QVF9JTkQJMHgwMgkvKiBsb29wIHRlc3QgaW5kaWNhdGVkICovCisjZGVmaW5lCU1NUl9EQ0VfU1RBVFVTX1RYX0JVU1kJCTB4MDQJLyogdHJhbnNtaXR0ZXIgb24gKi8KKyNkZWZpbmUJTU1SX0RDRV9TVEFUVVNfSkJSX0VYUElSRUQJMHgwOAkvKiBqYWJiZXIgdGltZXIgZXhwaXJlZCAqLworI2RlZmluZSBNTVJfRENFX1NUQVRVUwkJCTB4MEYJLyogbWFzayB0byBnZXQgdGhlIGJpdHMgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZHNwX2lkOwkJLyogRFNQIElEIChBQSA9IERhZWRhbHVzIHJldiBBKSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl91bnVzZWQyWzJdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2NvcnJlY3RfbndpZF9sOwkvKiAjIG9mIGNvcnJlY3QgTldJRHMgcnhkIChsb3cpICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2NvcnJlY3RfbndpZF9oOwkvKiAjIG9mIGNvcnJlY3QgTldJRHMgcnhkIChoaWdoKSAqLworICAvKiBXYXJuaW5nOiAgcmVhZCBoaWdoLW9yZGVyIG9jdGV0IGZpcnN0ISAqLworICB1bnNpZ25lZCBjaGFyCW1tcl93cm9uZ19ud2lkX2w7CS8qICMgb2Ygd3JvbmcgTldJRHMgcnhkIChsb3cpICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3dyb25nX253aWRfaDsJLyogIyBvZiB3cm9uZyBOV0lEcyByeGQgKGhpZ2gpICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3Rocl9wcmVfc2V0OwkvKiBsZXZlbCB0aHJlc2hvbGQgcHJlc2V0ICovCisjZGVmaW5lCU1NUl9USFJfUFJFX1NFVAkJMHgzRgkJLyogbGV2ZWwgdGhyZXNob2xkIHByZXNldCAqLworI2RlZmluZQlNTVJfVEhSX1BSRV9TRVRfQ1VSCTB4ODAJCS8qIEN1cnJlbnQgc2lnbmFsIGFib3ZlIGl0ICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3NpZ25hbF9sdmw7CQkvKiBzaWduYWwgbGV2ZWwgKi8KKyNkZWZpbmUJTU1SX1NJR05BTF9MVkwJCTB4M0YJCS8qIHNpZ25hbCBsZXZlbCAqLworI2RlZmluZQlNTVJfU0lHTkFMX0xWTF9WQUxJRAkweDgwCQkvKiBVcGRhdGVkIHNpbmNlIGxhc3QgcmVhZCAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9zaWxlbmNlX2x2bDsJLyogc2lsZW5jZSBsZXZlbCAobm9pc2UpICovCisjZGVmaW5lCU1NUl9TSUxFTkNFX0xWTAkJMHgzRgkJLyogc2lsZW5jZSBsZXZlbCAqLworI2RlZmluZQlNTVJfU0lMRU5DRV9MVkxfVkFMSUQJMHg4MAkJLyogVXBkYXRlZCBzaW5jZSBsYXN0IHJlYWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfc2dubF9xdWFsOwkJLyogc2lnbmFsIHF1YWxpdHkgKi8KKyNkZWZpbmUJTU1SX1NHTkxfUVVBTAkJMHgwRgkJLyogc2lnbmFsIHF1YWxpdHkgKi8KKyNkZWZpbmUJTU1SX1NHTkxfUVVBTF9BTlQJMHg4MAkJLyogY3VycmVudCBhbnRlbm5hIHVzZWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfbmV0d19pZF9sOwkJLyogTldJRCBsb3cgb3JkZXIgYnl0ZSAoPykgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfdW51c2VkM1szXTsJCS8qIHVudXNlZCAqLworCisgIC8qIDIuMCBIYXJkd2FyZSBleHRlbnNpb24gLSBmcmVxdWVuY3kgc2VsZWN0aW9uIHN1cHBvcnQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZmVlX3N0YXR1czsJCS8qIFN0YXR1cyBvZiBmcmVxdWVuY3kgRUVQUk9NICovCisjZGVmaW5lCU1NUl9GRUVfU1RBVFVTX0lECTB4RjAJCS8qIE1vZGVtIHJldmlzaW9uIElEICovCisjZGVmaW5lCU1NUl9GRUVfU1RBVFVTX0RXTEQJMHgwOAkJLyogRG93bmxvYWQgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUJTU1SX0ZFRV9TVEFUVVNfQlVTWQkweDA0CQkvKiBFRVBST00gYnVzeSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl91bnVzZWQ0WzFdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2ZlZV9kYXRhX2w7CQkvKiBSZWFkIGRhdGEgZnJvbSBFRVBST00gKGxvdykgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZmVlX2RhdGFfaDsJCS8qIFJlYWQgZGF0YSBmcm9tIEVFUFJPTSAoaGlnaCkgKi8KK307CisKKyNkZWZpbmUJTU1SX1NJWkUJMzYKKworI2RlZmluZQltbXJvZmYocCxmKSAJKHVuc2lnbmVkIHNob3J0KSgodm9pZCAqKSgmKChtbXJfdCAqKSgodm9pZCAqKTAgKyAocCkpKS0+ZikgLSAodm9pZCAqKTApCisKKy8qIE1ha2UgdGhlIHR3byBhYm92ZSBzdHJ1Y3R1cmVzIG9uZSAqLwordHlwZWRlZiB1bmlvbiBtbV90Cit7CisgIHN0cnVjdCBtbXdfdAl3OwkvKiBXcml0ZSB0byB0aGUgbW1jICovCisgIHN0cnVjdCBtbXJfdAlyOwkvKiBSZWFkIGZyb20gdGhlIG1tYyAqLworfSBtbV90OworCisjZW5kaWYgLyogX1dBVkVMQU5fSCAqLworCisvKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgb25seSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZAorICogYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogRm9yIG1vcmUgZGV0YWlscywgc2VlIHdhdmVsYW4uYy4KKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5wLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDlmZjIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5wLmgKQEAgLTAsMCArMSw3MTYgQEAKKy8qCisgKglXYXZlTEFOIElTQSBkcml2ZXIKKyAqCisgKgkJSmVhbiBJSSAtIEhQTEIgJzk2CisgKgorICogUmVvcmdhbmlzYXRpb24gYW5kIGV4dGVuc2lvbiBvZiB0aGUgZHJpdmVyLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBuZWNlc3NhcnkgZm9yIHRoZQorICogV2F2ZUxBTiBJU0EgZHJpdmVyLiAgVGhpcyBmaWxlIGlzIGEgcHJpdmF0ZSBoZWFkZXIsIHNvIGl0IHNob3VsZAorICogYmUgaW5jbHVkZWQgb25seSBpbiB3YXZlbGFuLmMhCisgKi8KKworI2lmbmRlZiBXQVZFTEFOX1BfSAorI2RlZmluZSBXQVZFTEFOX1BfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogRE9DVU1FTlRBVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyBkcml2ZXIgcHJvdmlkZXMgYSBMaW51eCBpbnRlcmZhY2UgdG8gdGhlIFdhdmVMQU4gSVNBIGhhcmR3YXJlLgorICogVGhlIFdhdmVMQU4gaXMgYSBwcm9kdWN0IG9mIEx1Y2VudCAoaHR0cDovL3d3dy53YXZlbGFuLmNvbS8pLgorICogVGhpcyBkaXZpc2lvbiB3YXMgZm9ybWVybHkgcGFydCBvZiBOQ1IgYW5kIHRoZW4gQVQmVC4KKyAqIFdhdmVMQU5zIGFyZSBhbHNvIGRpc3RyaWJ1dGVkIGJ5IERFQyAoUm9hbUFib3V0IERTKSBhbmQgRGlnaXRhbCBPY2Vhbi4KKyAqCisgKiBUbyBsZWFybiBob3cgdG8gdXNlIHRoaXMgZHJpdmVyLCByZWFkIHRoZSBORVQzIEhPV1RPLgorICogSWYgeW91IHdhbnQgdG8gZXhwbG9pdCB0aGUgbWFueSBvdGhlciBmdW5jdGlvbmFsaXRpZXMsIHJlYWQgdGhlIGNvbW1lbnRzCisgKiBpbiB0aGUgY29kZS4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyB0aGUgcmVzdWx0IG9mIHRoZSBlZmZvcnQgb2YgbWFueSBwZW9wbGUgKHNlZSBiZWxvdykuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQRUNJRklDIE5PVEVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFdlYiBwYWdlCisgKiAtLS0tLS0tLQorICoJSSB0cnkgdG8gbWFpbnRhaW4gYSB3ZWIgcGFnZSB3aXRoIHRoZSBXaXJlbGVzcyBMQU4gSG93dG8gYXQgOgorICoJICAgIGh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvV2F2ZWxhbi5odG1sCisgKgorICogU01QCisgKiAtLS0KKyAqCVdlIG5vdyBhcmUgU01QIGNvbXBsaWFudCAoSSBldmVudHVhbGx5IGZpeGVkIHRoZSByZW1haW5pbmcgYnVncykuCisgKglUaGUgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZCBvbiBhIGR1YWwgUDYtMTUwIGFuZCBzdXJ2aXZlZCBteSB1c3VhbAorICoJc2V0IG9mIHRvcnR1cmUgdGVzdHMuCisgKglBbnl3YXksIEkgc3BlbnQgZW5vdWdoIHRpbWUgY2hhc2luZyBpbnRlcnJ1cHQgcmUtZW50cmFuY3kgZHVyaW5nCisgKgllcnJvcnMgb3IgcmVjb25maWd1cmUsIGFuZCBJIGRlc2lnbmVkIHRoZSBsb2NrZWQvdW5sb2NrZWQgc2VjdGlvbnMKKyAqCW9mIHRoZSBkcml2ZXIgd2l0aCBncmVhdCBjYXJlLCBhbmQgd2l0aCB0aGUgcmVjZW50IGFkZGl0aW9uIG9mCisgKgl0aGUgc3BpbmxvY2sgKHRoYW5rcyB0byB0aGUgbmV3IEFQSSksIHdlIHNob3VsZCBiZSBxdWl0ZSBjbG9zZSB0bworICoJdGhlIHRydXRoLgorICoJVGhlIFNNUC9JUlEgbG9ja2luZyBpcyBxdWl0ZSBjb2Fyc2UgYW5kIGNvbnNlcnZhdGl2ZSAoaS5lLiBub3QgZmFzdCksCisgKglidXQgYmV0dGVyIHNhZmUgdGhhbiBzb3JyeSAoZXNwZWNpYWxseSBhdCAyIE1iL3MgOy0pLgorICoKKyAqCUkgaGF2ZSBhbHNvIGxvb2tlZCBpbnRvIGRpc2FibGluZyBvbmx5IG91ciBpbnRlcnJ1cHQgb24gdGhlIGNhcmQKKyAqCSh2aWEgSEFDUikgaW5zdGVhZCBvZiBhbGwgaW50ZXJydXB0cyBpbiB0aGUgcHJvY2Vzc29yICh2aWEgY2xpKSwKKyAqCXNvIHRoYXQgb3RoZXIgZHJpdmVyIGFyZSBub3QgaW1wYWN0ZWQsIGFuZCBpdCBsb29rIGxpa2UgaXQncworICoJcG9zc2libGUsIGJ1dCBpdCdzIHZlcnkgdHJpY2t5IHRvIGRvIHJpZ2h0IChmdWxsIG9mIHJhY2VzKS4gQXMKKyAqCXRoZSBnYWluIHdvdWxkIGJlIG1vc3RseSBmb3IgU01QIHN5c3RlbXMsIGl0IGNhbiB3YWl0Li4uCisgKgorICogRGVidWdnaW5nIGFuZCBvcHRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCVlvdSB3aWxsIGZpbmQgYmVsb3cgYSBzZXQgb2YgJyNkZWZpbmUiIGFsbG93aW5nIGEgdmVyeSBmaW5lIGNvbnRyb2wKKyAqCW9uIHRoZSBkcml2ZXIgYmVoYXZpb3VyIGFuZCB0aGUgZGVidWcgbWVzc2FnZXMgcHJpbnRlZC4KKyAqCVRoZSBtYWluIG9wdGlvbnMgYXJlIDoKKyAqCW8gU0VUX1BTQV9DUkMsIHRvIGhhdmUgeW91ciBjYXJkIGNvcnJlY3RseSByZWNvZ25pc2VkIGJ5CisgKgkgIGFuIGFjY2VzcyBwb2ludCBhbmQgdGhlIFBvaW50LXRvLVBvaW50IGRpYWdub3N0aWMgdG9vbC4KKyAqCW8gVVNFX1BTQV9DT05GSUcsIHRvIHJlYWQgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBQU0EgKEVFcHJvbSkKKyAqCSAgKG90aGVyd2lzZSB3ZSBhbHdheXMgc3RhcnQgYWZyZXNoIHdpdGggc29tZSBkZWZhdWx0cykKKyAqCisgKiB3YXZlbGFuLm8gaXMgdG9vIGRhcm5lZCBiaWcKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJVGhhdCdzIHRydWUhICBUaGVyZSBpcyBhIHZlcnkgc2ltcGxlIHdheSB0byByZWR1Y2UgdGhlIGRyaXZlcgorICoJb2JqZWN0IGJ5IDMzJSEgIENvbW1lbnQgb3V0IHRoZSBmb2xsb3dpbmcgbGluZToKKyAqCQkjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyAqCU90aGVyIGNvbXBpbGUgb3B0aW9ucyBjYW4gYWxzbyByZWR1Y2UgdGhlIHNpemUgb2YgaXQuLi4KKyAqCisgKiBNQUMgYWRkcmVzcyBhbmQgaGFyZHdhcmUgZGV0ZWN0aW9uOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCVRoZSBkZXRlY3Rpb24gY29kZSBmb3IgdGhlIFdhdmVMQU4gY2hlY2tzIHRoYXQgdGhlIGZpcnN0IHRocmVlCisgKglvY3RldHMgb2YgdGhlIE1BQyBhZGRyZXNzIGZpdCB0aGUgY29tcGFueSBjb2RlLiAgVGhpcyB0eXBlIG9mCisgKglkZXRlY3Rpb24gd29ya3Mgd2VsbCBmb3IgQVQmVCBjYXJkcyAoYmVjYXVzZSB0aGUgQVQmVCBjb2RlIGlzCisgKgloYXJkY29kZWQgaW4gd2F2ZWxhbi5oKSwgYnV0IG9mIGNvdXJzZSB3aWxsIGZhaWwgZm9yIG90aGVyCisgKgltYW51ZmFjdHVyZXJzLgorICoKKyAqCUlmIHlvdSBhcmUgc3VyZSB0aGF0IHlvdXIgY2FyZCBpcyBkZXJpdmVkIGZyb20gdGhlIFdhdmVMQU4sCisgKgloZXJlIGlzIHRoZSB3YXkgdG8gY29uZmlndXJlIGl0OgorICoJMSkgR2V0IHlvdXIgTUFDIGFkZHJlc3MKKyAqCQlhKSBXaXRoIHlvdXIgY2FyZCB1dGlsaXRpZXMgKHdmcmVxc2VsLCBpbnN0Y29uZiwgZXRjLikKKyAqCQliKSBXaXRoIHRoZSBkcml2ZXI6CisgKgkJCW8gY29tcGlsZSB0aGUga2VybmVsIHdpdGggREVCVUdfQ09ORklHX0lORk8gZW5hYmxlZAorICoJCQlvIEJvb3QgYW5kIGxvb2sgdGhlIGNhcmQgbWVzc2FnZXMKKyAqCTIpIFNldCB5b3VyIE1BQyBjb2RlICgzIG9jdGV0cykgaW4gTUFDX0FERFJFU1NFU1tdWzNdICh3YXZlbGFuLmgpCisgKgkzKSBDb21waWxlIGFuZCB2ZXJpZnkKKyAqCTQpIFNlbmQgbWUgdGhlIE1BQyBjb2RlLiAgSSB3aWxsIGluY2x1ZGUgaXQgaW4gdGhlIG5leHQgdmVyc2lvbi4KKyAqCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdJUkVMRVNTIEVYVEVOU0lPTlMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogVGhpcyBkcml2ZXIgaXMgdGhlIGZpcnN0IHRvIHN1cHBvcnQgIndpcmVsZXNzIGV4dGVuc2lvbnMiLgorICogVGhpcyBzZXQgb2YgZXh0ZW5zaW9ucyBwcm92aWRlcyBhIHN0YW5kYXJkIHdheSB0byBjb250cm9sIHRoZSB3aXJlbGVzcworICogY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBoYXJkd2FyZS4gIEFwcGxpY2F0aW9ucyBzdWNoIGFzIG1vYmlsZSBJUCBtYXkKKyAqIHRha2UgYWR2YW50YWdlIG9mIGl0LgorICoKKyAqIFlvdSB3aWxsIG5lZWQgdG8gZW5hYmxlIHRoZSBDT05GSUdfTkVUX1JBRElPIGRlZmluZSBpbiB0aGUga2VybmVsCisgKiBjb25maWd1cmF0aW9uIHRvIGVuYWJsZSB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9ucyAodGhpcyBpcyB0aGUgb25lCisgKiBnaXZpbmcgYWNjZXNzIHRvIHRoZSByYWRpbyBuZXR3b3JrIGRldmljZSBjaG9pY2UpLgorICoKKyAqIEl0IG1pZ2h0IGFsc28gYmUgYSBnb29kIGlkZWEgYXMgd2VsbCB0byBmZXRjaCB0aGUgd2lyZWxlc3MgdG9vbHMgdG8KKyAqIGNvbmZpZ3VyZSB0aGUgZGV2aWNlIGFuZCBwbGF5IGEgYml0LgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRklMRVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIHdhdmVsYW4uYzoJCWFjdHVhbCBjb2RlIGZvciB0aGUgZHJpdmVyOiAgQyBmdW5jdGlvbnMKKyAqCisgKiB3YXZlbGFuLnAuaDoJCXByaXZhdGUgaGVhZGVyOiAgbG9jYWwgdHlwZXMgYW5kIHZhcmlhYmxlcyBmb3IgZHJpdmVyCisgKgorICogd2F2ZWxhbi5oOgkJZGVzY3JpcHRpb24gb2YgdGhlIGhhcmR3YXJlIGludGVyZmFjZSBhbmQgc3RydWN0cworICoKKyAqIGk4MjU4Ni5oOgkJZGVzY3JpcHRpb24gb2YgdGhlIEV0aGVybmV0IGNvbnRyb2xsZXIKKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSElTVE9SWSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBUaGlzIGlzIGJhc2VkIG9uIGluZm9ybWF0aW9uIGluIHRoZSBkcml2ZXJzJyBoZWFkZXJzLiBJdCBtYXkgbm90IGJlCisgKiBhY2N1cmF0ZSwgYW5kIEkgZ3VhcmFudGVlIG9ubHkgbXkgYmVzdCBlZmZvcnQuCisgKgorICogVGhlIGhpc3Rvcnkgb2YgdGhlIFdhdmVMQU4gZHJpdmVycyBpcyBhcyBjb21wbGljYXRlZCBhcyB0aGUgaGlzdG9yeSBvZgorICogdGhlIFdhdmVMQU4gaXRzZWxmIChOQ1IgLT4gQVQmVCAtPiBMdWNlbnQpLgorICoKKyAqIEl0IGFsbCBzdGFydGVkIHdpdGggQW5kZXJzIEtsZW1ldHMgPGtsZW1ldHNAcGF1bC5ydXRnZXJzLmVkdT4KKyAqIHdyaXRpbmcgYSBXYXZlTEFOIElTQSBkcml2ZXIgZm9yIHRoZSBNYWNoIG1pY3Jva2VybmVsLiAgR2lyaXNoCisgKiBXZWxsaW5nIDx3ZWxsaW5nQHBhdWwucnV0Z2Vycy5lZHU+IGhhZCBhbHNvIHdvcmtlZCBvbiBpdC4KKyAqIEtlaXRoIE1vb3JlIG1vZGlmaWVkIHRoaXMgZm9yIHRoZSBQQ01DSUEgaGFyZHdhcmUuCisgKiAKKyAqIFJvYmVydCBNb3JyaXMgPHJ0bUBkYXMuaGFydmFyZC5lZHU+IHBvcnRlZCB0aGVzZSB0d28gZHJpdmVycyB0byBCU0RJCisgKiBhbmQgYWRkZWQgc3BlY2lmaWMgUENNQ0lBIHN1cHBvcnQgKHRoZXJlIGlzIGN1cnJlbnRseSBubyBlcXVpdmFsZW50CisgKiBvZiB0aGUgUENNQ0lBIHBhY2thZ2UgdW5kZXIgQlNEKS4KKyAqCisgKiBKaW0gQmlua2xleSA8anJiQGNzLnBkeC5lZHU+IHBvcnRlZCBib3RoIEJTREkgZHJpdmVycyB0byBGcmVlQlNELgorICoKKyAqIEJydWNlIEphbnNvbiA8YnJ1Y2VAY3MudXN5ZC5lZHUuYXU+IHBvcnRlZCB0aGUgQlNESSBJU0EgZHJpdmVyIHRvIExpbnV4LgorICoKKyAqIEFudGhvbnkgRC4gSm9zZXBoIDxhZGpAbGNzLm1pdC5lZHU+IHN0YXJ0ZWQgdG8gbW9kaWZ5IEJydWNlJ3MgZHJpdmVyCisgKiAod2l0aCBoZWxwIG9mIHRoZSBCU0RJIFBDTUNJQSBkcml2ZXIpIGZvciBQQ01DSUEuCisgKiBZdW56aG91IExpIDx5dW56aG91QHN0cmF0LmlvbC51bmguZWR1PiBmaW5pc2hlZCB0aGlzIHdvcmsuCisgKiBKb2UgRmlubmV5IDxqb2VAY29tcC5sYW5jcy5hYy51az4gcGF0Y2hlZCB0aGUgZHJpdmVyIHRvIHN0YXJ0CisgKiAyLjAwIGNhcmRzIGNvcnJlY3RseSAoMi40IEdIeiB3aXRoIGZyZXF1ZW5jeSBzZWxlY3Rpb24pLgorICogRGF2aWQgSGluZHMgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0PiBpbnRlZ3JhdGVkIHRoZSB3aG9sZSBpbiBoaXMKKyAqIFBDTUNJQSBwYWNrYWdlIChhbmQgYnVnIGNvcnJlY3Rpb25zKS4KKyAqCisgKiBJIChKZWFuIFRvdXJyaWxoZXMgLSBqdEBocGxiLmhwbC5ocC5jb20pIHRoZW4gc3RhcnRlZCB0byBtYWtlIHNvbWUKKyAqIHBhdGNoZXMgdG8gdGhlIFBDTUNJQSBkcml2ZXIuICBMYXRlciwgSSBhZGRlZCBjb2RlIGluIHRoZSBJU0EgZHJpdmVyCisgKiBmb3IgV2lyZWxlc3MgRXh0ZW5zaW9ucyBhbmQgZnVsbCBzdXBwb3J0IG9mIGZyZXF1ZW5jeSBzZWxlY3Rpb24KKyAqIGNhcmRzLiAgVGhlbiwgSSBkaWQgdGhlIHNhbWUgdG8gdGhlIFBDTUNJQSBkcml2ZXIsIGFuZCBkaWQgc29tZQorICogcmVvcmdhbmlzYXRpb24uICBGaW5hbGx5LCBJIGNhbWUgYmFjayB0byB0aGUgSVNBIGRyaXZlciB0bworICogdXBncmFkZSBpdCBhdCB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgUENNQ0lBIG9uZSBhbmQgcmVvcmdhbmlzZQorICogdGhlIGNvZGUuCisgKiBMb2VrZSBCcmVkZXJ2ZWxkIDxsYnJlZGVydkB3YXZlbGFuLmNvbT4gZnJvbSBMdWNlbnQgaGFzIGdpdmVuIG1lCisgKiBtdWNoIG5lZWRlZCBpbmZvcm1hdGlvbiBvbiB0aGUgV2F2ZUxBTiBoYXJkd2FyZS4KKyAqLworCisvKiBUaGUgb3JpZ2luYWwgY29weXJpZ2h0cyBhbmQgbGl0ZXJhdHVyZSBtZW50aW9uIG90aGVycycgbmFtZXMgYW5kCisgKiBjcmVkaXRzLiAgSSBkb24ndCBrbm93IHdoYXQgdGhlaXIgcGFydCBpbiB0aGlzIGRldmVsb3BtZW50IHdhcy4KKyAqLworCisvKiBCeSB0aGUgd2F5LCBmb3IgdGhlIGNvcHlyaWdodCBhbmQgbGVnYWwgc3R1ZmY6CisgKiBhbG1vc3QgZXZlcnlib2R5IHdyb3RlIGNvZGUgdW5kZXIgdGhlIEdOVSBvciBCU0QgbGljZW5zZSAob3Igc2ltaWxhciksCisgKiBhbmQgd2FudCB0aGVpciBvcmlnaW5hbCBjb3B5cmlnaHQgdG8gcmVtYWluIHNvbWV3aGVyZSBpbiB0aGUKKyAqIGNvZGUgKGZvciBteXNlbGYsIEkgZ28gd2l0aCB0aGUgR1BMKS4KKyAqIE5vYm9keSB3YW50cyB0byB0YWtlIHJlc3BvbnNpYmlsaXR5IGZvciBhbnl0aGluZywgZXhjZXB0IHRoZSBmYW1lLgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUkVESVRTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFRoaXMgc29mdHdhcmUgd2FzIGRldmVsb3BlZCBhcyBhIGNvbXBvbmVudCBvZiB0aGUKKyAqIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0uCisgKiBJdCBpcyBiYXNlZCBvbiBvdGhlciBkZXZpY2UgZHJpdmVycyBhbmQgaW5mb3JtYXRpb24KKyAqIGVpdGhlciB3cml0dGVuIG9yIHN1cHBsaWVkIGJ5OgorICoJQWpheSBCYWtyZSA8YmFrcmVAcGF1bC5ydXRnZXJzLmVkdT4sCisgKglEb25hbGQgQmVja2VyIDxiZWNrZXJAY2VzZGlzLmdzZmMubmFzYS5nb3Y+LAorICoJTG9la2UgQnJlZGVydmVsZCA8TG9la2UuQnJlZGVydmVsZEBVdHJlY2h0Lk5DUi5jb20+LAorICoJQnJlbnQgRWxwaGljayA8YmVscGhpY2tAdXdhdGVybG9vLmNhPiwKKyAqCUFuZGVycyBLbGVtZXRzIDxrbGVtZXRzQGl0Lmt0aC5zZT4sCisgKglWbGFkaW1pciBWLiBLb2xwYWtvdiA8d0BzdGllci5rb2VuaWcucnU+LAorICoJTWFyYyBNZWVydGVucyA8TWFyYy5NZWVydGVuc0BVdHJlY2h0Lk5DUi5jb20+LAorICoJUGF1bGluZSBNaWRkZWxpbmsgPG1pZGRlbGluQHBvbHl3YXJlLmlhZi5ubD4sCisgKglSb2JlcnQgTW9ycmlzIDxydG1AZGFzLmhhcnZhcmQuZWR1PiwKKyAqCUplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4sCisgKglHaXJpc2ggV2VsbGluZyA8d2VsbGluZ0BwYXVsLnJ1dGdlcnMuZWR1PiwKKyAqCUNsYXJrIFdvb2R3b3J0aCA8Y2xhcmtAaGl3YXkxLmV4aXQxMDkuY29tPgorICoJWW9uZ2d1YW5nIFpoYW5nIDx5Z3pAaXNsLmhybC5oYWMuY29tPgorICoKKyAqIFRoYW5rcyBnbyBhbHNvIHRvOgorICoJSmFtZXMgQXNodG9uIDxqYWExMDFAc3lzZW5nLmFudS5lZHUuYXU+LAorICoJQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4sCisgKglBbGxhbiBDcmVpZ2h0b24gPGFsbGFuY0Bjcy51c3lkLmVkdS5hdT4sCisgKglNYXR0aGV3IEdlaWVyIDxtYXR0aGV3QGNzLnVzeWQuZWR1LmF1PiwKKyAqCVJlbW8gZGkgR2lvdmFubmkgPHJlbW9AY3MudXN5ZC5lZHUuYXU+LAorICoJRWNraGFyZCBHcmFoIDxncmFoQHdyY3MxLnVyei51bmktd3VwcGVydGFsLmRlPiwKKyAqCVZpcHVsIEd1cHRhIDx2Z3VwdGFAY3MuYmluZ2hhbXRvbi5lZHU+LAorICoJTWFyayBIYWdhbiA8bWhhZ2FuQHd0Y3Bvc3QuZGF5dG9ub2guTkNSLkNPTT4sCisgKglUaW0gTmljaG9sc29uIDx0aW1AY3MudXN5ZC5lZHUuYXU+LAorICoJSWFuIFBhcmtpbiA8aWFuQGNzLnVzeWQuZWR1LmF1PiwKKyAqCUpvaG4gUm9zZW5iZXJnIDxqb2huckBjcy51c3lkLmVkdS5hdT4sCisgKglHZW9yZ2UgUm9zc2kgPGdlb3JnZUBwaG0uZ292LmF1PiwKKyAqCUFydGh1ciBTY290dCA8YXJ0aHVyQGNzLnVzeWQuZWR1LmF1PiwKKyAqCVN0YW5pc2xhdiBTaW55YWdpbiA8c3Rhc0Bpc2YucnU+CisgKglhbmQgUGV0ZXIgU3RvcmV5IGZvciB0aGVpciBhc3Npc3RhbmNlIGFuZCBhZHZpY2UuCisgKgorICogQWRkaXRpb25hbCBDcmVkaXRzOgorICoKKyAqCU15IGRldmVsb3BtZW50IGhhcyBiZWVuIGRvbmUgaW5pdGlhbGx5IHVuZGVyIERlYmlhbiAxLjEgKExpbnV4IDIuMC54KQorICoJYW5kIG5vdwl1bmRlciBEZWJpYW4gMi4yLCBpbml0aWFsbHkgd2l0aCBhbiBIUCBWZWN0cmEgWFAvNjAsIGFuZCBub3cKKyAqCWFuIEhQIFZlY3RyYSBYUC85MC4KKyAqCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJTVBST1ZFTUVOVFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIEkgcHJvdWRseSBwcmVzZW50OgorICoKKyAqIENoYW5nZXMgbWFkZSBpbiBmaXJzdCBwcmUtcmVsZWFzZToKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gcmVvcmdhbmlzYXRpb24gb2YgdGhlIGNvZGUsIGZ1bmN0aW9uIG5hbWUgY2hhbmdlCisgKgktIGNyZWF0aW9uIG9mIHByaXZhdGUgaGVhZGVyICh3YXZlbGFuLnAuaCkKKyAqCS0gcmVvcmdhbmlzZWQgZGVidWcgbWVzc2FnZXMKKyAqCS0gbW9yZSBjb21tZW50cywgaGlzdG9yeSwgZXRjLgorICoJLSBtbWNfaW5pdDogIGNvbmZpZ3VyZSB0aGUgUFNBIGlmIG5vdCBkb25lCisgKgktIG1tY19pbml0OiAgY29ycmVjdCBkZWZhdWx0IHZhbHVlIG9mIGxldmVsIHRocmVzaG9sZCBmb3IgUENNQ0lBCisgKgktIG1tY19pbml0OiAgMi4wMCBkZXRlY3Rpb24gYmV0dGVyIGNvZGUgZm9yIDIuMDAgaW5pdGlhbGl6YXRpb24KKyAqCS0gYmV0dGVyIGluZm8gYXQgc3RhcnR1cAorICoJLSBJUlEgc2V0dGluZyAobm90ZTogIHRoaXMgc2V0dGluZyBpcyBwZXJtYW5lbnQpCisgKgktIHdhdGNoZG9nOiAgY2hhbmdlIHN0cmF0ZWd5IChhbmQgc29sdmUgbW9kdWxlIHJlbW92YWwgcHJvYmxlbXMpCisgKgktIGFkZCB3aXJlbGVzcyBleHRlbnNpb25zIChpb2N0bCBhbmQgZ2V0X3dpcmVsZXNzX3N0YXRzKQorICoJICBnZXQvc2V0IG53aWQvZnJlcXVlbmN5IG9uIGZseSwgaW5mbyBmb3IgL3Byb2MvbmV0L3dpcmVsZXNzCisgKgktIG1vcmUgd2lyZWxlc3MgZXh0ZW5zaW9uczogIFNFVFNQWSBhbmQgR0VUU1BZCisgKgktIG1ha2Ugd2lyZWxlc3MgZXh0ZW5zaW9ucyBvcHRpb25hbAorICoJLSBwcml2YXRlIGlvY3RsIHRvIHNldC9nZXQgcXVhbGl0eSBhbmQgbGV2ZWwgdGhyZXNob2xkLCBoaXN0b2dyYW0KKyAqCS0gcmVtb3ZlIC9wcm9jL25ldC93YXZlbGFuCisgKgktIHN1cHByZXNzIHVzZWxlc3Mgc3R1ZmYgZnJvbSBscCAobmV0X2xvY2FsKQorICoJLSBrZXJuZWwgMi4xIHN1cHBvcnQgKGNvcHlfdG8vZnJvbV91c2VyIGluc3RlYWQgb2YgbWVtY3B5X3RvL2Zyb21mcykKKyAqCS0gYWRkIG1lc3NhZ2UgbGV2ZWwgKGRlYnVnIHN0dWZmIGluIC92YXIvYWRtL2RlYnVnIGFuZCBlcnJvcnMgbm90CisgKgkgIGRpc3BsYXllZCBhdCBjb25zb2xlIGFuZCBzdGlsbCBpbiAvdmFyL2FkbS9tZXNzYWdlcykKKyAqCS0gbXVsdGkgZGV2aWNlIHN1cHBvcnQKKyAqCS0gc3RhcnQgZml4aW5nIHRoZSBwcm9iZSAoaW5pdCBjb2RlKQorICoJLSBtb3JlIGlubGluZXMKKyAqCS0gbWFuIHBhZ2UKKyAqCS0gbWFueSBvdGhlciBtaW5vciBkZXRhaWxzIGFuZCBjbGVhbnVwcworICoKKyAqIENoYW5nZXMgbWFkZSBpbiBzZWNvbmQgcHJlLXJlbGVhc2U6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBjbGVhbiB1cCBpbml0IGNvZGUgKHByb2JlIGFuZCBtb2R1bGUgaW5pdCkKKyAqCS0gYmV0dGVyIG11bHRpcGxlIGRldmljZSBzdXBwb3J0IChtb2R1bGUpCisgKgktIG5hbWUgYXNzaWdubWVudCAobW9kdWxlKQorICoKKyAqIENoYW5nZXMgbWFkZSBpbiB0aGlyZCBwcmUtcmVsZWFzZToKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gYmUgbW9yZSBjb25zZXJ2YXRpdmUgb24gdGltZXJzCisgKgktIHByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIG11bHRpY2FzdCAoSSBzdGlsbCBsYWNrIHNvbWUgZGV0YWlscykKKyAqCisgKiBDaGFuZ2VzIG1hZGUgaW4gZm91cnRoIHByZS1yZWxlYXNlOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gbXVsdGljYXN0IChyZXZpc2l0ZWQgYW5kIGZpbmlzaGVkKQorICoJLSBhdm9pZCByZXNldCBpbiBzZXRfbXVsdGljYXN0X2xpc3QgKGEgcmVhbGx5IGJpZyBoYWNrKQorICoJICBpZiBzb21lYm9keSBjb3VsZCBhcHBseSB0aGlzIGNvZGUgZm9yIG90aGVyIGk4MjU4NiBiYXNlZCBkcml2ZXJzCisgKgktIHNoYXJlIG9uYm9hcmQgbWVtb3J5IDc1JSBSVSBhbmQgMjUlIENVIChpbnN0ZWFkIG9mIDUwLzUwKQorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAyLjEuMTU6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBjaGFuZ2UgdGhlIGRldGVjdGlvbiBjb2RlIGZvciBtdWx0aSBtYW51ZmFjdHVyZXIgY29kZSBzdXBwb3J0CisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuMS4xNzoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIHVwZGF0ZSB0byB3aXJlbGVzcyBleHRlbnNpb25zIGNoYW5nZXMKKyAqCS0gc2lsbHkgYnVnIGluIGNhcmQgaW5pdGlhbCBjb25maWd1cmF0aW9uIChwc2FfY29uZl9zdGF0dXMpCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuMS4yNyAmIDIuMC4zMDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIHNtYWxsIGJ1ZyBpbiBkZWJ1ZyBjb2RlIChwcm9iYWJseSBub3QgdGhlIGxhc3Qgb25lLi4uKQorICoJLSByZW1vdmUgZXh0ZXJuIGtleXdvcmQgZm9yIHdhdmVsYW5fcHJvYmUoKQorICoJLSBsZXZlbCB0aHJlc2hvbGQgaXMgbm93IGEgc3RhbmRhcmQgd2lyZWxlc3MgZXh0ZW5zaW9uICh2ZXJzaW9uIDQgISkKKyAqCS0gbW9kdWxlcyBwYXJhbWV0ZXJzIHR5cGVzIChuZXcgbW9kdWxlIGludGVyZmFjZSkKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMi4xLjM2OgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gYnl0ZSBjb3VudCBzdGF0cyAoY291cnRlc3kgb2YgRGF2aWQgSGluZHMpCisgKgktIHJlbW92ZSBkZXZfdGludCBzdHVmZiAoY291cnRlc3kgb2YgRGF2aWQgSGluZHMpCisgKgktIGVuY3J5cHRpb24gc2V0dGluZyBmcm9tIEJyZW50IEVscGhpY2sgKHRoYW5rcyBhIGxvdCEpCisgKgktICdpb2FkZHInIHRvICd1X2xvbmcnIGZvciB0aGUgQWxwaGEgKHRoYW5rcyB0byBTdGFuaXNsYXYgU2lueWFnaW4pCisgKgorICogT3RoZXIgY2hhbmdlcyAobm90IGJ5IG1lKSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIFNwZWxsaW5nIGFuZCBncmFtYXIgInJlY3RpZmljYXRpb24iLgorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAyLjAuMzcgJiAyLjIuMiA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gQ29ycmVjdCBzdGF0dXMgaW4gL3Byb2MvbmV0L3dpcmVsZXNzCisgKgktIFNldCBQU0EgQ1JDIHRvIG1ha2UgUHRQIGRpYWdub3N0aWMgdG9vbCBoYXBweSAoQm9iIEdyYXkpCisgKgktIE1vZHVsZSBpbml0IGNvZGUgZG9uJ3QgZmFpbCBpZiB3ZSBmb3VuZCBhdCBsZWFzdCBvbmUgY2FyZCBpbgorICoJICB0aGUgYWRkcmVzcyBsaXN0IChLYXJsaXMgUGVpc2VuaWVrcykKKyAqCS0gTWlzc2luZyBwYXJlbnRoZXNpcyAoQ2hyaXN0b3BoZXIgUGV0ZXJzb24pCisgKgktIENvcnJlY3QgaTgyNTg2IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICoJLSBFbmNyeXB0aW9uIGluaXRpYWxpc2F0aW9uIGJ1ZyAoUm9iZXJ0IE1jQ29ybWFjaykKKyAqCS0gTmV3IG1hYyBhZGRyZXNzZXMgZGV0ZWN0ZWQgaW4gdGhlIHByb2JlCisgKgktIEluY3JlYXNlIHdhdGNoZG9nIGZvciBidXN5IGVudmlyb25tZW50cworICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAyLjAuMzggJiAyLjIuNyA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gQ29ycmVjdCB0aGUgcmVjZXB0aW9uIGxvZ2ljIHRvIGJldHRlciByZXBvcnQgZXJyb3JzIGFuZCBhdm9pZAorICoJICBzZW5kaW5nIGJvZ3VzIHBhY2tldCB1cCB0aGUgc3RhY2sKKyAqCS0gRGVsYXkgUlUgY29uZmlnIHRvIGF2b2lkIGNvcnJ1cHRpbmcgZmlyc3QgcmVjZWl2ZWQgcGFja2V0CisgKgktIENoYW5nZSBjb25maWcgY29tcGxldGlvbiBjb2RlICh0byBhY3R1YWxseSBjaGVjayBzb21ldGhpbmcpCisgKgktIEF2b2lkIHJlYWRpbmcgb3V0IG9mIGJvdW5kIGluIHNrYnVmIHRvIHRyYW5zbWl0CisgKgktIFJlY3RpZnkgYSBsb3Qgb2YgKHVzZWxlc3MpIGRlYnVnZ2luZyBjb2RlCisgKgktIENoYW5nZSB0aGUgd2F5IHRvIGAjaWZkZWYgU0VUX1BTQV9DUkMnCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuMi4xMSAmIDIuMy4xMyA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIENoYW5nZSBlLW1haWwgYW5kIHdlYiBwYWdlIGFkZHJlc3NlcworICoJLSBXYXRjaGRvZyB0aW1lciBpcyBub3cgY29ycmVjdGx5IGV4cHJlc3NlZCBpbiBIWiwgbm90IGluIGppZmZpZXMKKyAqCS0gQWRkIGNoYW5uZWwgbnVtYmVyIHRvIHRoZSBsaXN0IG9mIGZyZXF1ZW5jaWVzIGluIHJhbmdlCisgKgktIEFkZCB0aGUgKHNob3J0KSBsaXN0IG9mIGJpdC1yYXRlcyBpbiByYW5nZQorICoJLSBEZXZlbG9wcCBhIG5ldyBzZW5zaXRpdml0eS4uLiAoc2Vucy52YWx1ZSAmIHNlbnMuZml4ZWQpCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuMi4xNCAmIDIuMy4yMyA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIEZpeCBjaGVjayBmb3Igcm9vdCBwZXJtaXNzaW9uIChicmVhayBpbnN0ZWFkIG9mIGV4aXQpCisgKgktIE5ldyBud2lkICYgZW5jb2Rpbmcgc2V0dGluZyAoV2lyZWxlc3MgRXh0ZW5zaW9uIDkpCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuMy40OSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIEluZGVudGF0aW9uIHJlZm9ybWF0aW5nIChBbGFuKQorICoJLSBVcGRhdGUgdG8gbmV3IG5ldHdvcmsgQVBJIChzb2Z0bmV0IC0gMi4zLjQzKSA6CisgKgkJbyByZXBsYWNlIGRldi0+dGJ1c3kgKEFsYW4pCisgKgkJbyByZXBsYWNlIGRldi0+dHN0YXJ0IChBbGFuKQorICoJCW8gcmVtb3ZlIGRldi0+aW50ZXJydXB0IChBbGFuKQorICoJCW8gYWRkIFNNUCBsb2NraW5nIHZpYSBzcGlubG9jayBpbiBzcGx4eCAobWUpCisgKgkJbyBhZGQgc3BpbmxvY2sgaW4gaW50ZXJydXB0IGhhbmRsZXIgKG1lKQorICoJCW8gdXNlIGtlcm5lbCB3YXRjaGRvZyBpbnN0ZWFkIG9mIG91cnMgKG1lKQorICoJCW8gaW5jcmVhc2Ugd2F0Y2hkb2cgdGltZW91dCAoa2VybmVsIGlzIG1vcmUgc2Vuc2l0aXZlKSAobWUpCisgKgkJbyB2ZXJpZnkgdGhhdCBhbGwgdGhlIGNoYW5nZXMgbWFrZSBzZW5zZSBhbmQgd29yayAobWUpCisgKgktIEZpeHVwIGEgcG90ZW50aWFsIGdvdGNoYSB3aGVuIHJlY29uZmlndXJpbmcgYW5kIHRoaWdodGVuIGEgYml0CisgKgkJdGhlIGludGVyYWN0aW9ucyB3aXRoIFR4IHF1ZXVlLgorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAyLjQuMCA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gRml4IHNwaW5sb2NrIHN0dXBpZCBidWdzIHRoYXQgSSBsZWZ0IGluLiBUaGUgZHJpdmVyIGlzIG5vdyBTTVAKKyAqCQljb21wbGlhbnQgYW5kIGRvZXNuJ3QgbG9ja3VwIGF0IHN0YXJ0dXAuCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuNS4yIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBVc2UgbmV3IGRyaXZlciBBUEkgZm9yIFdpcmVsZXNzIEV4dGVuc2lvbnMgOgorICoJCW8gZ290IHJpZCBvZiB3YXZlbGFuX2lvY3RsKCkKKyAqCQlvIHVzZSBhIGJ1bmNoIG9mIGl3X2hhbmRsZXIgaW5zdGVhZAorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAyLjUuMzUgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBTZXQgZGV2LT50cmFuc19zdGFydCB0byBhdm9pZCBmaWxsaW5nIHRoZSBsb2dzCisgKgktIEhhbmRsZSBiZXR0ZXIgc3B1cmlvdXMvYm9ndXMgaW50ZXJydXB0CisgKgktIEF2b2lkIGRlYWRsb2NrcyBpbiBtbWNfb3V0KCkvbW1jX2luKCkKKyAqCisgKiBXaXNoZXMgJiBkcmVhbXM6CisgKiAtLS0tLS0tLS0tLS0tLS0tCisgKgktIHJvYW1pbmcgKHNlZSBQY21jaWEgZHJpdmVyKQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTkNMVURFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUJPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZQk8bGludXgva2VybmVsLmg+CisjaW5jbHVkZQk8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlCTxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUJPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZQk8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZQk8bGludXgvc3RhdC5oPgorI2luY2x1ZGUJPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUJPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUJPGxpbnV4L2luLmg+CisjaW5jbHVkZQk8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZQk8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlCTxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlCTxhc20vc3lzdGVtLmg+CisjaW5jbHVkZQk8YXNtL2lvLmg+CisjaW5jbHVkZQk8YXNtL2RtYS5oPgorI2luY2x1ZGUJPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZQk8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlCTxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlCTxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUJPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUJPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlCTxsaW51eC90aW1lci5oPgorI2luY2x1ZGUJPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CQkvKiBXaXJlbGVzcyBleHRlbnNpb25zICovCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4JCS8qIFdpcmVsZXNzIGhhbmRsZXJzICovCisKKy8qIFdhdmVMQU4gZGVjbGFyYXRpb25zICovCisjaW5jbHVkZQkiaTgyNTg2LmgiCisjaW5jbHVkZQkid2F2ZWxhbi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogRFJJVkVSIE9QVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogYCNkZWZpbmUnIG9yIGAjdW5kZWYnIHRoZSBmb2xsb3dpbmcgY29uc3RhbnQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvdXIKKyAqIG9mIHRoZSBkcml2ZXIuLi4KKyAqLworI3VuZGVmIFNFVF9QU0FfQ1JDCQkvKiBDYWxjdWxhdGUgYW5kIHNldCB0aGUgQ1JDIG9uIFBTQSAoc2xvd2VyKSAqLworI2RlZmluZSBVU0VfUFNBX0NPTkZJRwkJLyogVXNlIGluZm8gZnJvbSB0aGUgUFNBLiAqLworI3VuZGVmIFNUUlVDVF9DSEVDSwkJLyogVmVyaWZ5IHBhZGRpbmcgb2Ygc3RydWN0dXJlcy4gKi8KKyN1bmRlZiBFRVBST01fSVNfUFJPVEVDVEVECS8qIGRvZXNuJ3Qgc2VlbSB0byBiZSBuZWNlc3NhcnkgKi8KKyNkZWZpbmUgTVVMVElDQVNUX0FWT0lECQkvKiBBdm9pZCBleHRyYSBtdWx0aWNhc3QgKEknbSBzY2VwdGljYWwpLiAqLworI3VuZGVmIFNFVF9NQUNfQUREUkVTUwkJLyogRXhwZXJpbWVudGFsICovCisKKyNpZmRlZiBXSVJFTEVTU19FWFQJLyogSWYgd2lyZWxlc3MgZXh0ZW5zaW9ucyBleGlzdCBpbiB0aGUga2VybmVsICovCisvKiBXYXJuaW5nOiAgdGhpcyBzdHVmZiB3aWxsIHNsb3cgZG93biB0aGUgZHJpdmVyLiAqLworI2RlZmluZSBXSVJFTEVTU19TUFkJCS8qIEVuYWJsZSBzcHlpbmcgYWRkcmVzc2VzLiAqLworI3VuZGVmIEhJU1RPR1JBTQkJLyogRW5hYmxlIGhpc3RvZ3JhbSBvZiBzaWduYWwgbGV2ZWwuICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBERUJVRyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyN1bmRlZiBERUJVR19NT0RVTEVfVFJBQ0UJLyogbW9kdWxlIGluc2VydGlvbi9yZW1vdmFsICovCisjdW5kZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UJLyogY2FsbHMgbWFkZSBieSBMaW51eCAqLworI3VuZGVmIERFQlVHX0lOVEVSUlVQVF9UUkFDRQkvKiBjYWxscyB0byBoYW5kbGVyICovCisjdW5kZWYgREVCVUdfSU5URVJSVVBUX0lORk8JLyogdHlwZSBvZiBpbnRlcnJ1cHQgYW5kIHNvIG9uICovCisjZGVmaW5lIERFQlVHX0lOVEVSUlVQVF9FUlJPUgkvKiBwcm9ibGVtcyAqLworI3VuZGVmIERFQlVHX0NPTkZJR19UUkFDRQkvKiBUcmFjZSB0aGUgY29uZmlnIGZ1bmN0aW9ucy4gKi8KKyN1bmRlZiBERUJVR19DT05GSUdfSU5GTwkvKiB3aGF0J3MgZ29pbmcgb24gKi8KKyNkZWZpbmUgREVCVUdfQ09ORklHX0VSUk9SCS8qIGVycm9ycyBvbiBjb25maWd1cmF0aW9uICovCisjdW5kZWYgREVCVUdfVFhfVFJBQ0UJCS8qIHRyYW5zbWlzc2lvbiBjYWxscyAqLworI3VuZGVmIERFQlVHX1RYX0lORk8JCS8qIGhlYWRlciBvZiB0aGUgdHJhbnNtaXR0ZWQgcGFja2V0ICovCisjdW5kZWYgREVCVUdfVFhfRkFJTAkJLyogTm9ybWFsIGZhaWx1cmUgY29uZGl0aW9ucyAqLworI2RlZmluZSBERUJVR19UWF9FUlJPUgkJLyogVW5leHBlY3RlZCBjb25kaXRpb25zICovCisjdW5kZWYgREVCVUdfUlhfVFJBQ0UJCS8qIHRyYW5zbWlzc2lvbiBjYWxscyAqLworI3VuZGVmIERFQlVHX1JYX0lORk8JCS8qIGhlYWRlciBvZiB0aGUgcmVjZWl2ZWQgcGFja2V0ICovCisjdW5kZWYgREVCVUdfUlhfRkFJTAkJLyogTm9ybWFsIGZhaWx1cmUgY29uZGl0aW9ucyAqLworI2RlZmluZSBERUJVR19SWF9FUlJPUgkJLyogVW5leHBlY3RlZCBjb25kaXRpb25zICovCisKKyN1bmRlZiBERUJVR19QQUNLRVRfRFVNUAkvKiBEdW1wIHBhY2tldCBvbiB0aGUgc2NyZWVuIGlmIGRlZmluZWQgdG8gMzIuICovCisjdW5kZWYgREVCVUdfSU9DVExfVFJBQ0UJLyogbWlzYy4gY2FsbCBieSBMaW51eCAqLworI3VuZGVmIERFQlVHX0lPQ1RMX0lORk8JCS8qIHZhcmlvdXMgZGVidWdnaW5nIGluZm8gKi8KKyNkZWZpbmUgREVCVUdfSU9DVExfRVJST1IJLyogd2hhdCdzIGdvaW5nIHdyb25nICovCisjZGVmaW5lIERFQlVHX0JBU0lDX1NIT1cJLyogU2hvdyBiYXNpYyBzdGFydHVwIGluZm8uICovCisjdW5kZWYgREVCVUdfVkVSU0lPTl9TSE9XCS8qIFByaW50IHZlcnNpb24gaW5mby4gKi8KKyN1bmRlZiBERUJVR19QU0FfU0hPVwkJLyogRHVtcCBQU0EgdG8gc2NyZWVuLiAqLworI3VuZGVmIERFQlVHX01NQ19TSE9XCQkvKiBEdW1wIG1tYyB0byBzY3JlZW4uICovCisjdW5kZWYgREVCVUdfU0hPV19VTlVTRUQJLyogU2hvdyB1bnVzZWQgZmllbGRzIHRvby4gKi8KKyN1bmRlZiBERUJVR19JODI1ODZfU0hPVwkvKiBTaG93IGk4MjU4NiBzdGF0dXMuICovCisjdW5kZWYgREVCVUdfREVWSUNFX1NIT1cJLyogU2hvdyBkZXZpY2UgcGFyYW1ldGVycy4gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBDT05TVEFOVFMgJiBNQUNST1MgKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgREVCVUdfVkVSU0lPTl9TSE9XCitzdGF0aWMgY29uc3QgY2hhcgkqdmVyc2lvbgk9ICJ3YXZlbGFuLmMgOiB2MjQgKFNNUCArIHdpcmVsZXNzIGV4dGVuc2lvbnMpIDExLzEyLzAxXG4iOworI2VuZGlmCisKKy8qIFdhdGNoZG9nIHRlbXBvcmlzYXRpb24gKi8KKyNkZWZpbmUJV0FUQ0hET0dfSklGRklFUwkoNTEyKkhaLzEwMCkKKworLyogTWFjcm8gdG8gZ2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYW4gYXJyYXkgKi8KKyNkZWZpbmUJTkVMUyhhKQkJCQkoc2l6ZW9mKGEpIC8gc2l6ZW9mKGFbMF0pKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUFJJVkFURSBJT0NUTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBTSU9DU0lQUVRIUglTSU9DSVdGSVJTVFBSSVYJCS8qIFNldCBxdWFsaXR5IHRocmVzaG9sZCAqLworI2RlZmluZSBTSU9DR0lQUVRIUglTSU9DSVdGSVJTVFBSSVYgKyAxCS8qIEdldCBxdWFsaXR5IHRocmVzaG9sZCAqLworCisjZGVmaW5lIFNJT0NTSVBISVNUTwlTSU9DSVdGSVJTVFBSSVYgKyAyCS8qIFNldCBoaXN0b2dyYW0gcmFuZ2VzICovCisjZGVmaW5lIFNJT0NHSVBISVNUTwlTSU9DSVdGSVJTVFBSSVYgKyAzCS8qIEdldCBoaXN0b2dyYW0gdmFsdWVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVFlQRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTaG9ydGN1dHMgKi8KK3R5cGVkZWYgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJZW5fc3RhdHM7Cit0eXBlZGVmIHN0cnVjdCBpd19zdGF0aXN0aWNzCWl3X3N0YXRzOwordHlwZWRlZiBzdHJ1Y3QgaXdfcXVhbGl0eQlpd19xdWFsOwordHlwZWRlZiBzdHJ1Y3QgaXdfZnJlcQkJaXdfZnJlcTsKK3R5cGVkZWYgc3RydWN0IG5ldF9sb2NhbAluZXRfbG9jYWw7Cit0eXBlZGVmIHN0cnVjdCB0aW1lcl9saXN0CXRpbWVyX2xpc3Q7CisKKy8qIEJhc2ljIHR5cGVzICovCit0eXBlZGVmIHVfY2hhcgkJbWFjX2FkZHJbV0FWRUxBTl9BRERSX1NJWkVdOwkvKiBIYXJkd2FyZSBhZGRyZXNzICovCisKKy8qCisgKiBTdGF0aWMgc3BlY2lmaWMgZGF0YSBmb3IgdGhlIGludGVyZmFjZS4KKyAqCisgKiBGb3IgZWFjaCBuZXR3b3JrIGludGVyZmFjZSwgTGludXgga2VlcHMgZGF0YSBpbiB0d28gc3RydWN0dXJlczogICJkZXZpY2UiCisgKiBrZWVwcyB0aGUgZ2VuZXJpYyBkYXRhIChzYW1lIGZvcm1hdCBmb3IgZXZlcnlib2R5KSBhbmQgIm5ldF9sb2NhbCIga2VlcHMKKyAqIGFkZGl0aW9uYWwgc3BlY2lmaWMgZGF0YS4KKyAqIE5vdGUgdGhhdCBzb21lIG9mIHRoaXMgc3BlY2lmaWMgZGF0YSBpcyBpbiBmYWN0IGdlbmVyaWMgKGVuX3N0YXRzLCBmb3IKKyAqIGV4YW1wbGUpLgorICovCitzdHJ1Y3QgbmV0X2xvY2FsCit7CisgIG5ldF9sb2NhbCAqCW5leHQ7CQkvKiBsaW5rZWQgbGlzdCBvZiB0aGUgZGV2aWNlcyAqLworICBzdHJ1Y3QgbmV0X2RldmljZSAqCWRldjsJCS8qIHJldmVyc2UgbGluayAqLworICBzcGlubG9ja190CXNwaW5sb2NrOwkvKiBTZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBoYXJkd2FyZSAoU01QKSAqLworICBlbl9zdGF0cwlzdGF0czsJCS8qIEV0aGVybmV0IGludGVyZmFjZSBzdGF0aXN0aWNzICovCisgIGludAkJbnJlc2V0czsJLyogbnVtYmVyIG9mIGhhcmR3YXJlIHJlc2V0cyAqLworICB1X2NoYXIJcmVjb25maWdfODI1ODY7CS8qIFdlIG5lZWQgdG8gcmVjb25maWd1cmUgdGhlIGNvbnRyb2xsZXIuICovCisgIHVfY2hhcglwcm9taXNjdW91czsJLyogcHJvbWlzY3VvdXMgbW9kZSAqLworICBpbnQJCW1jX2NvdW50OwkvKiBudW1iZXIgb2YgbXVsdGljYXN0IGFkZHJlc3NlcyAqLworICB1X3Nob3J0CWhhY3I7CQkvKiBjdXJyZW50IGhvc3QgaW50ZXJmYWNlIHN0YXRlICovCisKKyAgaW50CQl0eF9uX2luX3VzZTsKKyAgdV9zaG9ydAlyeF9oZWFkOworICB1X3Nob3J0CXJ4X2xhc3Q7CisgIHVfc2hvcnQJdHhfZmlyc3RfZnJlZTsKKyAgdV9zaG9ydAl0eF9maXJzdF9pbl91c2U7CisKKyNpZmRlZiBXSVJFTEVTU19FWFQKKyAgaXdfc3RhdHMJd3N0YXRzOwkJLyogV2lyZWxlc3Mtc3BlY2lmaWMgc3RhdGlzdGljcyAqLworCisgIHN0cnVjdCBpd19zcHlfZGF0YQlzcHlfZGF0YTsKKyAgc3RydWN0IGl3X3B1YmxpY19kYXRhCXdpcmVsZXNzX2RhdGE7CisjZW5kaWYKKworI2lmZGVmIEhJU1RPR1JBTQorICBpbnQJCWhpc19udW1iZXI7CQkvKiBudW1iZXIgb2YgaW50ZXJ2YWxzICovCisgIHVfY2hhcgloaXNfcmFuZ2VbMTZdOwkJLyogYm91bmRhcmllcyBvZiBpbnRlcnZhbCBdbi0xOyBuXSAqLworICB1X2xvbmcJaGlzX3N1bVsxNl07CQkvKiBzdW0gaW4gaW50ZXJ2YWwgKi8KKyNlbmRpZgkvKiBISVNUT0dSQU0gKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBST1RPVFlQRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTUlTQy4gU1VCUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdV9jaGFyCisJd3ZfaXJxX3RvX3BzYShpbnQpOworc3RhdGljIGludAorCXd2X3BzYV90b19pcnEodV9jaGFyKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gSE9TVCBBREFQVEVSIFNVQlJPVVRJTkVTIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbmxpbmUgdV9zaG9ydAkJLyogZGF0YSAqLworCWhhc3JfcmVhZCh1X2xvbmcpOwkvKiBSZWFkIHRoZSBob3N0IGludGVyZmFjZTogIGJhc2UgYWRkcmVzcyAqLworc3RhdGljIGlubGluZSB2b2lkCisJaGFjcl93cml0ZSh1X2xvbmcsCS8qIFdyaXRlIHRvIGhvc3QgaW50ZXJmYWNlOiAgYmFzZSBhZGRyZXNzICovCisJCSAgIHVfc2hvcnQpLAkvKiBkYXRhICovCisJaGFjcl93cml0ZV9zbG93KHVfbG9uZywKKwkJICAgdV9zaG9ydCksCisJc2V0X2NoYW5fYXR0bih1X2xvbmcsCS8qIGlvYWRkciAqLworCQkgICAgICB1X3Nob3J0KSwJLyogaGFjciAgICovCisJd3ZfaGFjcl9yZXNldCh1X2xvbmcpLAkvKiBpb2FkZHIgKi8KKwl3dl8xNl9vZmYodV9sb25nLAkvKiBpb2FkZHIgKi8KKwkJICB1X3Nob3J0KSwJLyogaGFjciAgICovCisJd3ZfMTZfb24odV9sb25nLAkvKiBpb2FkZHIgKi8KKwkJIHVfc2hvcnQpLAkvKiBoYWNyICAgKi8KKwl3dl9pbnRzX29mZihzdHJ1Y3QgbmV0X2RldmljZSAqKSwKKwl3dl9pbnRzX29uKHN0cnVjdCBuZXRfZGV2aWNlICopOworLyogLS0tLS0tLS0tLS0tLS0tLS0gTU9ERU0gTUFOQUdFTUVOVCBTVUJST1VUSU5FUyAtLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHZvaWQKKwlwc2FfcmVhZCh1X2xvbmcsCS8qIFJlYWQgdGhlIFBhcmFtZXRlciBTdG9yYWdlIEFyZWEuICovCisJCSB1X3Nob3J0LAkvKiBoYWNyICovCisJCSBpbnQsCQkvKiBvZmZzZXQgaW4gUFNBICovCisJCSB1X2NoYXIgKiwJLyogYnVmZmVyIHRvIGZpbGwgKi8KKwkJIGludCksCQkvKiBzaXplIHRvIHJlYWQgKi8KKwlwc2Ffd3JpdGUodV9sb25nLCAJLyogV3JpdGUgdG8gdGhlIFBTQS4gKi8KKwkJICB1X3Nob3J0LAkvKiBoYWNyICovCisJCSAgaW50LAkJLyogb2Zmc2V0IGluIFBTQSAqLworCQkgIHVfY2hhciAqLAkvKiBidWZmZXIgaW4gbWVtb3J5ICovCisJCSAgaW50KTsJCS8qIGxlbmd0aCBvZiBidWZmZXIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorCW1tY19vdXQodV9sb25nLAkJLyogV3JpdGUgMSBieXRlIHRvIHRoZSBNb2RlbSBNYW5hZyBDb250cm9sLiAqLworCQl1X3Nob3J0LAorCQl1X2NoYXIpLAorCW1tY193cml0ZSh1X2xvbmcsCS8qIFdyaXRlIG4gYnl0ZXMgdG8gdGhlIE1NQy4gKi8KKwkJICB1X2NoYXIsCisJCSAgdV9jaGFyICosCisJCSAgaW50KTsKK3N0YXRpYyBpbmxpbmUgdV9jaGFyCQkvKiBSZWFkIDEgYnl0ZSBmcm9tIHRoZSBNTUMuICovCisJbW1jX2luKHVfbG9uZywKKwkgICAgICAgdV9zaG9ydCk7CitzdGF0aWMgaW5saW5lIHZvaWQKKwltbWNfcmVhZCh1X2xvbmcsCS8qIFJlYWQgbiBieXRlcyBmcm9tIHRoZSBNTUMuICovCisJCSB1X2NoYXIsCisJCSB1X2NoYXIgKiwKKwkJIGludCksCisJZmVlX3dhaXQodV9sb25nLAkvKiBXYWl0IGZvciBmcmVxdWVuY3kgRUVQUk9NOiAgYmFzZSBhZGRyZXNzICovCisJCSBpbnQsCQkvKiBiYXNlIGRlbGF5IHRvIHdhaXQgZm9yICovCisJCSBpbnQpOwkJLyogdGltZSB0byB3YWl0ICovCitzdGF0aWMgdm9pZAorCWZlZV9yZWFkKHVfbG9uZywJLyogUmVhZCB0aGUgZnJlcXVlbmN5IEVFUFJPTTogIGJhc2UgYWRkcmVzcyAqLworCQkgdV9zaG9ydCwJLyogZGVzdGluYXRpb24gb2Zmc2V0ICovCisJCSB1X3Nob3J0ICosCS8qIGRhdGEgYnVmZmVyICovCisJCSBpbnQpOwkJLyogbnVtYmVyIG9mIHJlZ2lzdGVycyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJODI1ODYgU1VCUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyAvKmlubGluZSovIHZvaWQKKwlvYnJhbV9yZWFkKHVfbG9uZywJLyogaW9hZGRyICovCisJCSAgIHVfc2hvcnQsCS8qIG8gKi8KKwkJICAgdV9jaGFyICosCS8qIGIgKi8KKwkJICAgaW50KTsJLyogbiAqLworc3RhdGljIGlubGluZSB2b2lkCisJb2JyYW1fd3JpdGUodV9sb25nLAkvKiBpb2FkZHIgKi8KKwkJICAgIHVfc2hvcnQsCS8qIG8gKi8KKwkJICAgIHVfY2hhciAqLAkvKiBiICovCisJCSAgICBpbnQpOwkvKiBuICovCitzdGF0aWMgdm9pZAorCXd2X2FjayhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbmxpbmUgaW50CisJd3Zfc3luY2hyb25vdXNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICosCisJCQkgICBjb25zdCBjaGFyICopLAorCXd2X2NvbmZpZ19jb21wbGV0ZShzdHJ1Y3QgbmV0X2RldmljZSAqLAorCQkJICAgdV9sb25nLAorCQkJICAgbmV0X2xvY2FsICopOworc3RhdGljIGludAorCXd2X2NvbXBsZXRlKHN0cnVjdCBuZXRfZGV2aWNlICosCisJCSAgICB1X2xvbmcsCisJCSAgICBuZXRfbG9jYWwgKik7CitzdGF0aWMgaW5saW5lIHZvaWQKKwl3dl84MjU4Nl9yZWNvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gREVCVUcgJiBJTkZPIFNVQlJPVVRJTkVTIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZmRlZiBERUJVR19JODI1ODZfU0hPVworc3RhdGljIHZvaWQKKwl3dl9zY2Jfc2hvdyh1bnNpZ25lZCBzaG9ydCk7CisjZW5kaWYKK3N0YXRpYyBpbmxpbmUgdm9pZAorCXd2X2luaXRfaW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogZGlzcGxheSBzdGFydHVwIGluZm8gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gSU9DVEwsIFNUQVRTICYgUkVDT05GSUcgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGVuX3N0YXRzCSoKKwl3YXZlbGFuX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogR2l2ZSBzdGF0cyAvcHJvYy9uZXQvZGV2ICovCitzdGF0aWMgaXdfc3RhdHMgKgorCXdhdmVsYW5fZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHZvaWQKKwl3YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBBQ0tFVCBSRUNFUFRJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorCXd2X3BhY2tldF9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICosCS8qIFJlYWQgYSBwYWNrZXQgZnJvbSBhIGZyYW1lLiAqLworCQkgICAgICAgdV9zaG9ydCwKKwkJICAgICAgIGludCksCisJd3ZfcmVjZWl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogUmVhZCBhbGwgcGFja2V0cyB3YWl0aW5nLiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBBQ0tFVCBUUkFOU01JU1NJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW5saW5lIGludAorCXd2X3BhY2tldF93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqLAkvKiBXcml0ZSBhIHBhY2tldCB0byB0aGUgVHggYnVmZmVyLiAqLworCQkJdm9pZCAqLAorCQkJc2hvcnQpOworc3RhdGljIGludAorCXdhdmVsYW5fcGFja2V0X3htaXQoc3RydWN0IHNrX2J1ZmYgKiwJLyogU2VuZCBhIHBhY2tldC4gKi8KKwkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEhBUkRXQVJFIENPTkZJR1VSQVRJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbmxpbmUgaW50CisJd3ZfbW1jX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKiksCS8qIEluaXRpYWxpemUgdGhlIG1vZGVtLiAqLworCXd2X3J1X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICopLAkvKiBTdGFydCB0aGUgaTgyNTg2IHJlY2VpdmVyIHVuaXQuICovCisJd3ZfY3Vfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKiksCS8qIFN0YXJ0IHRoZSBpODI1ODYgY29tbWFuZCB1bml0LiAqLworCXd2XzgyNTg2X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICopOwkvKiBTdGFydCB0aGUgaTgyNTg2LiAqLworc3RhdGljIHZvaWQKKwl3dl84MjU4Nl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIENvbmZpZ3VyZSB0aGUgaTgyNTg2LiAqLworc3RhdGljIGlubGluZSB2b2lkCisJd3ZfODI1ODZfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQKKwl3dl9od19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqKSwJLyogUmVzZXQgdGhlIFdhdmVMQU4gaGFyZHdhcmUuICovCisJd3ZfY2hlY2tfaW9hZGRyKHVfbG9uZywJCS8qIGlvYWRkciAqLworCQkJdV9jaGFyICopOwkvKiBtYWMgYWRkcmVzcyAocmVhZCkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSU5URVJSVVBUIEhBTkRMSU5HIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorCXdhdmVsYW5faW50ZXJydXB0KGludCwJCS8qIGludGVycnVwdCBoYW5kbGVyICovCisJCQkgIHZvaWQgKiwKKwkJCSAgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgdm9pZAorCXdhdmVsYW5fd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIHRyYW5zbWlzc2lvbiB3YXRjaGRvZyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBDT05GSUdVUkFUSU9OIENBTExCQUNLUyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50CisJd2F2ZWxhbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICopLAkvKiBPcGVuIHRoZSBkZXZpY2UuICovCisJd2F2ZWxhbl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqKSwJLyogQ2xvc2UgdGhlIGRldmljZS4gKi8KKwl3YXZlbGFuX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqLCB1bnNpZ25lZCBzaG9ydCk7LyogQ29uZmlndXJlIG9uZSBkZXZpY2UuICovCitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKndhdmVsYW5fcHJvYmUoaW50IHVuaXQpOwkvKiBTZWUgU3BhY2UuYy4gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogVkFSSUFCTEVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIGlzIHRoZSByb290IG9mIHRoZSBsaW5rZWQgbGlzdCBvZiBXYXZlTEFOIGRyaXZlcnMKKyAqIEl0IGlzIHVzZSB0byB2ZXJpZnkgdGhhdCB3ZSBkb24ndCByZXVzZSB0aGUgc2FtZSBiYXNlIGFkZHJlc3MKKyAqIGZvciB0d28gZGlmZmVyZW50IGRyaXZlcnMgYW5kIHRvIGNsZWFuIHVwIHdoZW4gcmVtb3ZpbmcgdGhlIG1vZHVsZS4KKyAqLworc3RhdGljIG5ldF9sb2NhbCAqCXdhdmVsYW5fbGlzdAk9IChuZXRfbG9jYWwgKikgTlVMTDsKKworLyoKKyAqIFRoaXMgdGFibGUgaXMgdXNlZCB0byB0cmFuc2xhdGUgdGhlIFBTQSB2YWx1ZSB0byBJUlEgbnVtYmVyCisgKiBhbmQgdmljZSB2ZXJzYS4KKyAqLworc3RhdGljIHVfY2hhcglpcnF2YWxzW10JPQoreworCSAgIDAsICAgIDAsICAgIDAsIDB4MDEsCisJMHgwMiwgMHgwNCwgICAgMCwgMHgwOCwKKwkgICAwLCAgICAwLCAweDEwLCAweDIwLAorCTB4NDAsICAgIDAsICAgIDAsIDB4ODAsCit9OworCisvKgorICogVGFibGUgb2YgdGhlIGF2YWlsYWJsZSBJL08gYWRkcmVzc2VzIChiYXNlIGFkZHJlc3NlcykgZm9yIFdhdmVMQU4KKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0CWlvYmFzZVtdCT0KK3sKKyNpZgkwCisgIC8qIExlYXZlIG91dCAweDNDMCBmb3Igbm93IC0tIHNlZW1zIHRvIGNsYXNoIHdpdGggc29tZSB2aWRlbworICAgKiBjb250cm9sbGVycy4KKyAgICogTGVhdmUgb3V0IHRoZSBvdGhlcnMgdG9vIC0tIHdlIHdpbGwgYWx3YXlzIHVzZSAweDM5MCBhbmQgbGVhdmUKKyAgICogMHgzMDAgZm9yIHRoZSBFdGhlcm5ldCBkZXZpY2UuCisgICAqIEplYW4gSUk6ICAweDNFMCBpcyBmaW5lIGFzIHdlbGwuCisgICAqLworICAweDMwMCwgMHgzOTAsIDB4M0UwLCAweDNDMAorI2VuZGlmCS8qIDAgKi8KKyAgMHgzOTAsIDB4M0UwCit9OworCisjaWZkZWYJTU9EVUxFCisvKiBQYXJhbWV0ZXJzIHNldCBieSBpbnNtb2QgKi8KK3N0YXRpYyBpbnQJaW9bNF07CitzdGF0aWMgaW50CWlycVs0XTsKK3N0YXRpYyBjaGFyCSpuYW1lWzRdOworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShuYW1lLCBjaGFycCwgTlVMTCwgMCk7CisKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJXYXZlTEFOIEkvTyBiYXNlIGFkZHJlc3MoZXMpLHJlcXVpcmVkIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIldhdmVMQU4gSVJRIG51bWJlcihzKSIpOworTU9EVUxFX1BBUk1fREVTQyhuYW1lLCAiV2F2ZUxBTiBpbnRlcmZhY2UgbmVtZShzKSIpOworI2VuZGlmCS8qIE1PRFVMRSAqLworCisjZW5kaWYJLyogV0FWRUxBTl9QX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzgzMjk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5jCkBAIC0wLDAgKzEsNDkxNCBAQAorLyoKKyAqCVdhdmVsYW4gUGNtY2lhIGRyaXZlcgorICoKKyAqCQlKZWFuIElJIC0gSFBMQiAnOTYKKyAqCisgKiBSZW9yZ2FuaXNhdGlvbiBhbmQgZXh0ZW5zaW9uIG9mIHRoZSBkcml2ZXIuCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgZm9sbG93LiBTZWUgd2F2ZWxhbl9jcy5wLmggZm9yIGRldGFpbHMuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBBbnRob255IEQuIEpvc2VwaCdzIGNvZGUgYW5kIGFsbCB0aGUgY2hhbmdlcyBoZXJlCisgKiBhcmUgYWxzbyB1bmRlciB0aGUgb3JpZ2luYWwgY29weXJpZ2h0IGJlbG93LgorICoKKyAqIFRoaXMgY29kZSBzdXBwb3J0cyB2ZXJzaW9uIDIuMDAgb2YgV2F2ZUxBTi9QQ01DSUEgY2FyZHMgKDIuNEdIeiksIGFuZAorICogY2FuIHdvcmsgb24gTGludXggMi4wLjM2IHdpdGggc3VwcG9ydCBvZiBEYXZpZCBIaW5kcycgUENNQ0lBIENhcmQgU2VydmljZXMKKyAqCisgKiBKb2UgRmlubmV5IChqb2VAY29tcC5sYW5jcy5hYy51aykgYXQgTGFuY2FzdGVyIFVuaXZlcnNpdHkgaW4gVUsgYWRkZWQKKyAqIGNyaXRpY2FsIGNvZGUgaW4gdGhlIHJvdXRpbmUgdG8gaW5pdGlhbGl6ZSB0aGUgTW9kZW0gTWFuYWdlbWVudCBDb250cm9sbGVyLgorICoKKyAqIFRoYW5rcyB0byBBbGFuIENveCBhbmQgQnJ1Y2UgSmFuc29uIGZvciB0aGVpciBhZHZpY2UuCisgKgorICoJLS0gWXVuemhvdSBMaSAoc2NpcDQxNjZAbnVzLnNnKQorICoKKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkcJCisgKiBSb2FtaW5nIHN1cHBvcnQgYWRkZWQgMDcvMjIvOTggYnkgSnVzdGluIFNlZ2VyIChqc2VnZXJAbWVkaWEubWl0LmVkdSkKKyAqIGJhc2VkIG9uIHBhdGNoIGJ5IEpvZSBGaW5uZXkgZnJvbSBMYW5jYXN0ZXIgVW5pdmVyc2l0eS4KKyNlbmRpZgorICoKKyAqIEx1Y2VudCAoZm9ybWVybHkgQVQmVCBHSVMsIGZvcm1lcmx5IE5DUikgV2F2ZUxBTiBQQ01DSUEgY2FyZDogQW4KKyAqIEV0aGVybmV0LWxpa2UgcmFkaW8gdHJhbnNjZWl2ZXIgY29udHJvbGxlZCBieSBhbiBJbnRlbCA4MjU5MyBjb3Byb2Nlc3Nvci4KKyAqCisgKiAgIEEgbm9uLXNoYXJlZCBtZW1vcnkgUENNQ0lBIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXgKKyAqCisgKiBJU0EgdmVyc2lvbiBtb2RpZmllZCB0byBzdXBwb3J0IFBDTUNJQSBieSBBbnRob255IEpvc2VwaCAoYWRqQGxjcy5taXQuZWR1KQorICoKKyAqCisgKiBKb3NlcGggTydTdWxsaXZhbiAmIEpvaG4gTGFuZ2ZvcmQgKGpvc3VsbHZuQGNzLmNtdS5lZHUgJiBqY2xAY3MuY211LmVkdSkKKyAqCisgKiBBcHIgMiAnOTggIG1hZGUgY2hhbmdlcyB0byBicmluZyB0aGUgaTgyNTkzIGNvbnRyb2wvaW50IGhhbmRsaW5nIGluIGxpbmUKKyAqICAgICAgICAgICAgIHdpdGggb2ZmaWNhbCBzcGVjcy4uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIENvcHlyaWdodCAxOTk1CisgKiAgIEFudGhvbnkgRC4gSm9zZXBoCisgKiAgIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgcHJvZ3JhbQorICogICBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZAorICogICB0aGF0IHRoaXMgY29weXJpZ2h0IGFuZCBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgb24gYWxsIGNvcGllcworICogICBhbmQgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCB0aGUgbmFtZSBvZiBNLkkuVC4gbm90IGJlIHVzZWQKKyAqICAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorICogICBwcm9ncmFtIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IgcGVybWlzc2lvbiwgYW5kIG5vdGljZSBiZSBnaXZlbgorICogICBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24gdGhhdCBjb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gaXMKKyAqICAgYnkgcGVybWlzc2lvbiBvZiBNLkkuVC4gIE0uSS5ULiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQKKyAqICAgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvLQorICogICB2aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LiAgICAgICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKi8KKworLyogRG8gKk5PVCogYWRkIG90aGVyIGhlYWRlcnMgaGVyZSwgeW91IGFyZSBndWFyYW50ZWVkIHRvIGJlIHdyb25nIC0gSmVhbiBJSSAqLworI2luY2x1ZGUgIndhdmVsYW5fY3MucC5oIgkJLyogUHJpdmF0ZSBoZWFkZXIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogTUlTQyBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBTdWJyb3V0aW5lcyB3aGljaCB3b24ndCBmaXQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgY2F0ZWdvcnkKKyAqICh3YXZlbGFuIG1vZGVtIG9yIGk4MjU5MykKKyAqLworCisjaWZkZWYgU1RSVUNUX0NIRUNLCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU2FuaXR5IHJvdXRpbmUgdG8gdmVyaWZ5IHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBXYXZlTEFOIGludGVyZmFjZQorICogc3RydWN0dXJlcy4KKyAqLworc3RhdGljIGNoYXIgKgord3Zfc3RydWN0dWN0X2NoZWNrKHZvaWQpCit7CisjZGVmaW5lCVNDKHQscyxuKQlpZiAoc2l6ZW9mKHQpICE9IHMpIHJldHVybihuKTsKKworICBTQyhwc2FfdCwgUFNBX1NJWkUsICJwc2FfdCIpOworICBTQyhtbXdfdCwgTU1XX1NJWkUsICJtbXdfdCIpOworICBTQyhtbXJfdCwgTU1SX1NJWkUsICJtbXJfdCIpOworCisjdW5kZWYJU0MKKworICByZXR1cm4oKGNoYXIgKikgTlVMTCk7Cit9IC8qIHd2X3N0cnVjdHVjdF9jaGVjayAqLworI2VuZGlmCS8qIFNUUlVDVF9DSEVDSyAqLworCisvKioqKioqKioqKioqKioqKioqKiBNT0RFTSBNQU5BR0VNRU5UIFNVQlJPVVRJTkVTICoqKioqKioqKioqKioqKioqKiovCisvKgorICogVXNlZnVsIHN1YnJvdXRpbmVzIHRvIG1hbmFnZSB0aGUgbW9kZW0gb2YgdGhlIHdhdmVsYW4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUmVhZCBmcm9tIGNhcmQncyBIb3N0IEFkYXB0b3IgU3RhdHVzIFJlZ2lzdGVyLgorICovCitzdGF0aWMgaW5saW5lIHVfY2hhcgoraGFzcl9yZWFkKHVfbG9uZwliYXNlKQoreworICByZXR1cm4oaW5iKEhBU1IoYmFzZSkpKTsKK30gLyogaGFzcl9yZWFkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXcml0ZSB0byBjYXJkJ3MgSG9zdCBBZGFwdGVyIENvbW1hbmQgUmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAoraGFjcl93cml0ZSh1X2xvbmcJYmFzZSwKKwkgICB1X2NoYXIJaGFjcikKK3sKKyAgb3V0YihoYWNyLCBIQUNSKGJhc2UpKTsKK30gLyogaGFjcl93cml0ZSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV3JpdGUgdG8gY2FyZCdzIEhvc3QgQWRhcHRlciBDb21tYW5kIFJlZ2lzdGVyLiBJbmNsdWRlIGEgZGVsYXkgZm9yCisgKiB0aG9zZSB0aW1lcyB3aGVuIGl0IGlzIG5lZWRlZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitoYWNyX3dyaXRlX3Nsb3codV9sb25nCWJhc2UsCisJCXVfY2hhcgloYWNyKQoreworICBoYWNyX3dyaXRlKGJhc2UsIGhhY3IpOworICAvKiBkZWxheSBtaWdodCBvbmx5IGJlIG5lZWRlZCBzb21ldGltZXMgKi8KKyAgbWRlbGF5KDEpOworfSAvKiBoYWNyX3dyaXRlX3Nsb3cgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJlYWQgdGhlIFBhcmFtZXRlciBTdG9yYWdlIEFyZWEgZnJvbSB0aGUgV2F2ZUxBTiBjYXJkJ3MgbWVtb3J5CisgKi8KK3N0YXRpYyB2b2lkCitwc2FfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkgaW50CQlvLAkvKiBvZmZzZXQgaW4gUFNBICovCisJIHVfY2hhciAqCWIsCS8qIGJ1ZmZlciB0byBmaWxsICovCisJIGludAkJbikJLyogc2l6ZSB0byByZWFkICovCit7CisgIG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICB1X2NoYXIgX19pb21lbSAqcHRyID0gbHAtPm1lbSArIFBTQV9BRERSICsgKG8gPDwgMSk7CisKKyAgd2hpbGUobi0tID4gMCkKKyAgICB7CisgICAgICAqYisrID0gcmVhZGIocHRyKTsKKyAgICAgIC8qIER1ZSB0byBhIGxhY2sgb2YgYWRkcmVzcyBkZWNvZGUgcGlucywgdGhlIFdhdmVMQU4gUENNQ0lBIGNhcmQKKyAgICAgICAqIG9ubHkgc3VwcG9ydHMgcmVhZGluZyBldmVuIG1lbW9yeSBhZGRyZXNzZXMuIFRoYXQgbWVhbnMgdGhlCisgICAgICAgKiBpbmNyZW1lbnQgaGVyZSBNVVNUIGJlIHR3by4KKyAgICAgICAqIEJlY2F1c2Ugb2YgdGhhdCwgd2UgY2FuJ3QgdXNlIG1lbWNweV9mcm9taW8oKS4uLgorICAgICAgICovCisgICAgICBwdHIgKz0gMjsKKyAgICB9Cit9IC8qIHBzYV9yZWFkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXcml0ZSB0aGUgUGFyYW10ZXIgU3RvcmFnZSBBcmVhIHRvIHRoZSBXYXZlTEFOIGNhcmQncyBtZW1vcnkKKyAqLworc3RhdGljIHZvaWQKK3BzYV93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkgIGludAkJbywJLyogT2Zmc2V0IGluIHBzYSAqLworCSAgdV9jaGFyICoJYiwJLyogQnVmZmVyIGluIG1lbW9yeSAqLworCSAgaW50CQluKQkvKiBMZW5ndGggb2YgYnVmZmVyICovCit7CisgIG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICB1X2NoYXIgX19pb21lbSAqcHRyID0gbHAtPm1lbSArIFBTQV9BRERSICsgKG8gPDwgMSk7CisgIGludAkJY291bnQgPSAwOworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgLyogQXMgdGhlcmUgc2VlbSB0byBoYXZlIG5vIGZsYWcgUFNBX0JVU1kgYXMgaW4gdGhlIElTQSBtb2RlbCwgd2UgYXJlCisgICAqIG9ibGlnZSB0byB2ZXJpZnkgdGhpcyBhZGRyZXNzIHRvIGtub3cgd2hlbiB0aGUgUFNBIGlzIHJlYWR5Li4uICovCisgIHZvbGF0aWxlIHVfY2hhciBfX2lvbWVtICp2ZXJpZnkgPSBscC0+bWVtICsgUFNBX0FERFIgKworICAgIChwc2FvZmYoMCwgcHNhX2NvbXBfbnVtYmVyKSA8PCAxKTsKKworICAvKiBBdXRob3JpemUgd3JpdHRpbmcgdG8gUFNBICovCisgIGhhY3Jfd3JpdGUoYmFzZSwgSEFDUl9QV1JfU1RBVCB8IEhBQ1JfUk9NX1dFTik7CisKKyAgd2hpbGUobi0tID4gMCkKKyAgICB7CisgICAgICAvKiB3cml0ZSB0byBQU0EgKi8KKyAgICAgIHdyaXRlYigqYisrLCBwdHIpOworICAgICAgcHRyICs9IDI7CisKKyAgICAgIC8qIEkgZG9uJ3QgaGF2ZSB0aGUgc3BlYywgc28gSSBkb24ndCBrbm93IHdoYXQgdGhlIGNvcnJlY3QKKyAgICAgICAqIHNlcXVlbmNlIHRvIHdyaXRlIGlzLiBUaGlzIGhhY2sgc2VlbSB0byB3b3JrIGZvciBtZS4uLiAqLworICAgICAgY291bnQgPSAwOworICAgICAgd2hpbGUoKHJlYWRiKHZlcmlmeSkgIT0gUFNBX0NPTVBfUENNQ0lBXzkxNSkgJiYgKGNvdW50KysgPCAxMDApKQorCW1kZWxheSgxKTsKKyAgICB9CisKKyAgLyogUHV0IHRoZSBob3N0IGludGVyZmFjZSBiYWNrIGluIHN0YW5kYXJkIHN0YXRlICovCisgIGhhY3Jfd3JpdGUoYmFzZSwgSEFDUl9ERUZBVUxUKTsKK30gLyogcHNhX3dyaXRlICovCisKKyNpZmRlZiBTRVRfUFNBX0NSQworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIENhbGN1bGF0ZSB0aGUgUFNBIENSQworICogVGhhbmtzIHRvIFZhbHN0ZXIsIE5pY28gPE5WQUxTVEVSQHdjbmQubmwubHVjZW50LmNvbT4gZm9yIHRoZSBjb2RlCisgKiBOT1RFOiBCeSBzcGVjaWZ5aW5nIGEgbGVuZ3RoIGluY2x1ZGluZyB0aGUgQ1JDIHBvc2l0aW9uIHRoZQorICogcmV0dXJuZWQgdmFsdWUgc2hvdWxkIGJlIHplcm8uIChpLmUuIGEgY29ycmVjdCBjaGVja3N1bSBpbiB0aGUgUFNBKQorICoKKyAqIFRoZSBXaW5kb3dzIGRyaXZlcnMgZG9uJ3QgdXNlIHRoZSBDUkMsIGJ1dCB0aGUgQVAgYW5kIHRoZSBQdFAgdG9vbAorICogZGVwZW5kIG9uIGl0LgorICovCitzdGF0aWMgdV9zaG9ydAorcHNhX2NyYyh1bnNpZ25lZCBjaGFyICoJcHNhLAkvKiBUaGUgUFNBICovCisJaW50CQlzaXplKQkvKiBOdW1iZXIgb2Ygc2hvcnQgZm9yIENSQyAqLworeworICBpbnQJCWJ5dGVfY250OwkvKiBMb29wIG9uIHRoZSBQU0EgKi8KKyAgdV9zaG9ydAljcmNfYnl0ZXMgPSAwOwkvKiBEYXRhIGluIHRoZSBQU0EgKi8KKyAgaW50CQliaXRfY250OwkvKiBMb29wIG9uIHRoZSBiaXRzIG9mIHRoZSBzaG9ydCAqLworCisgIGZvcihieXRlX2NudCA9IDA7IGJ5dGVfY250IDwgc2l6ZTsgYnl0ZV9jbnQrKyApCisgICAgeworICAgICAgY3JjX2J5dGVzIF49IHBzYVtieXRlX2NudF07CS8qIEl0cyBhbiB4b3IgKi8KKworICAgICAgZm9yKGJpdF9jbnQgPSAxOyBiaXRfY250IDwgOTsgYml0X2NudCsrICkKKwl7CisJICBpZihjcmNfYnl0ZXMgJiAweDAwMDEpCisJICAgIGNyY19ieXRlcyA9IChjcmNfYnl0ZXMgPj4gMSkgXiAweEEwMDE7CisJICBlbHNlCisJICAgIGNyY19ieXRlcyA+Pj0gMSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIGNyY19ieXRlczsKK30gLyogcHNhX2NyYyAqLworI2VuZGlmCS8qIFNFVF9QU0FfQ1JDICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiB1cGRhdGUgdGhlIGNoZWNrc3VtIGZpZWxkIGluIHRoZSBXYXZlbGFuJ3MgUFNBCisgKi8KK3N0YXRpYyB2b2lkCit1cGRhdGVfcHNhX2NoZWNrc3VtKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworI2lmZGVmIFNFVF9QU0FfQ1JDCisgIHBzYV90CQlwc2E7CisgIHVfc2hvcnQJY3JjOworCisgIC8qIHJlYWQgdGhlIHBhcmFtZXRlciBzdG9yYWdlIGFyZWEgKi8KKyAgcHNhX3JlYWQoZGV2LCAwLCAodW5zaWduZWQgY2hhciAqKSAmcHNhLCBzaXplb2YocHNhKSk7CisKKyAgLyogdXBkYXRlIHRoZSBjaGVja3N1bSAqLworICBjcmMgPSBwc2FfY3JjKCh1bnNpZ25lZCBjaGFyICopICZwc2EsCisJCXNpemVvZihwc2EpIC0gc2l6ZW9mKHBzYS5wc2FfY3JjWzBdKSAtIHNpemVvZihwc2EucHNhX2NyY1sxXSkKKwkJLSBzaXplb2YocHNhLnBzYV9jcmNfc3RhdHVzKSk7CisKKyAgcHNhLnBzYV9jcmNbMF0gPSBjcmMgJiAweEZGOworICBwc2EucHNhX2NyY1sxXSA9IChjcmMgJiAweEZGMDApID4+IDg7CisKKyAgLyogV3JpdGUgaXQgISAqLworICBwc2Ffd3JpdGUoZGV2LCAoY2hhciAqKSZwc2EucHNhX2NyYyAtIChjaGFyICopJnBzYSwKKwkgICAgKHVuc2lnbmVkIGNoYXIgKikmcHNhLnBzYV9jcmMsIDIpOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworICBwcmludGsgKEtFUk5fREVCVUcgIiVzOiB1cGRhdGVfcHNhX2NoZWNrc3VtKCk6IGNyYyA9IDB4JTAyeCUwMnhcbiIsCisgICAgICAgICAgZGV2LT5uYW1lLCBwc2EucHNhX2NyY1swXSwgcHNhLnBzYV9jcmNbMV0pOworCisgIC8qIENoZWNrIGFnYWluIChsdXh1cnkgISkgKi8KKyAgY3JjID0gcHNhX2NyYygodW5zaWduZWQgY2hhciAqKSAmcHNhLAorCQkgc2l6ZW9mKHBzYSkgLSBzaXplb2YocHNhLnBzYV9jcmNfc3RhdHVzKSk7CisKKyAgaWYoY3JjICE9IDApCisgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVwZGF0ZV9wc2FfY2hlY2tzdW0oKTogQ1JDIGRvZXMgbm90IGFncmVlIHdpdGggUFNBIGRhdGEgKGV2ZW4gYWZ0ZXIgcmVjYWxjdWxhdGluZylcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYgLyogREVCVUdfSU9DVExfSU5GTyAqLworI2VuZGlmCS8qIFNFVF9QU0FfQ1JDICovCit9IC8qIHVwZGF0ZV9wc2FfY2hlY2tzdW0gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyaXRlIDEgYnl0ZSB0byB0aGUgTU1DLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK21tY19vdXQodV9sb25nCQliYXNlLAorCXVfc2hvcnQJCW8sCisJdV9jaGFyCQlkKQoreworICBpbnQgY291bnQgPSAwOworCisgIC8qIFdhaXQgZm9yIE1NQyB0byBnbyBpZGxlICovCisgIHdoaWxlKChjb3VudCsrIDwgMTAwKSAmJiAoaW5iKEhBU1IoYmFzZSkpICYgSEFTUl9NTUlfQlVTWSkpCisgICAgdWRlbGF5KDEwKTsKKworICBvdXRiKCh1X2NoYXIpKChvIDw8IDEpIHwgTU1SX01NSV9XUiksIE1NUihiYXNlKSk7CisgIG91dGIoZCwgTU1EKGJhc2UpKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJvdXRpbmUgdG8gd3JpdGUgYnl0ZXMgdG8gdGhlIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlci4KKyAqIFdlIHN0YXJ0IGJ5IHRoZSBlbmQgYmVjYXVzZSBpdCBpcyB0aGUgd2F5IGl0IHNob3VsZCBiZSAhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbW1jX3dyaXRlKHVfbG9uZwliYXNlLAorCSAgdV9jaGFyCW8sCisJICB1X2NoYXIgKgliLAorCSAgaW50CQluKQoreworICBvICs9IG47CisgIGIgKz0gbjsKKworICB3aGlsZShuLS0gPiAwICkKKyAgICBtbWNfb3V0KGJhc2UsIC0tbywgKigtLWIpKTsKK30gLyogbW1jX3dyaXRlICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSZWFkIDEgYnl0ZSBmcm9tIHRoZSBNTUMuCisgKiBPcHRpbWlzZWQgdmVyc2lvbiBmb3IgMSBieXRlLCBhdm9pZCB1c2luZyBtZW1vcnkuLi4KKyAqLworc3RhdGljIGlubGluZSB1X2NoYXIKK21tY19pbih1X2xvbmcJYmFzZSwKKyAgICAgICB1X3Nob3J0CW8pCit7CisgIGludCBjb3VudCA9IDA7CisKKyAgd2hpbGUoKGNvdW50KysgPCAxMDApICYmIChpbmIoSEFTUihiYXNlKSkgJiBIQVNSX01NSV9CVVNZKSkKKyAgICB1ZGVsYXkoMTApOworICBvdXRiKG8gPDwgMSwgTU1SKGJhc2UpKTsJCS8qIFNldCB0aGUgcmVhZCBhZGRyZXNzICovCisKKyAgb3V0YigwLCBNTUQoYmFzZSkpOwkJCS8qIFJlcXVpcmVkIGR1bW15IHdyaXRlICovCisKKyAgd2hpbGUoKGNvdW50KysgPCAxMDApICYmIChpbmIoSEFTUihiYXNlKSkgJiBIQVNSX01NSV9CVVNZKSkKKyAgICB1ZGVsYXkoMTApOworICByZXR1cm4gKHVfY2hhcikgKGluYihNTUQoYmFzZSkpKTsJLyogTm93IGRvIHRoZSBhY3R1YWwgcmVhZCAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUm91dGluZSB0byByZWFkIGJ5dGVzIGZyb20gdGhlIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlci4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBjb21wbGljYXRlZCBieSBhIGxhY2sgb2YgYWRkcmVzcyBsaW5lcywKKyAqIHdoaWNoIHByZXZlbnRzIGRlY29kaW5nIG9mIHRoZSBsb3ctb3JkZXIgYml0LgorICogKGNvZGUgaGFzIGp1c3QgYmVlbiBtb3ZlZCBpbiB0aGUgYWJvdmUgZnVuY3Rpb24pCisgKiBXZSBzdGFydCBieSB0aGUgZW5kIGJlY2F1c2UgaXQgaXMgdGhlIHdheSBpdCBzaG91bGQgYmUgIQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK21tY19yZWFkKHVfbG9uZwkJYmFzZSwKKwkgdV9jaGFyCQlvLAorCSB1X2NoYXIgKgliLAorCSBpbnQJCW4pCit7CisgIG8gKz0gbjsKKyAgYiArPSBuOworCisgIHdoaWxlKG4tLSA+IDApCisgICAgKigtLWIpID0gbW1jX2luKGJhc2UsIC0tbyk7Cit9IC8qIG1tY19yZWFkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBHZXQgdGhlIHR5cGUgb2YgZW5jcnlwdGlvbiBhdmFpbGFibGUuLi4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK21tY19lbmNyKHVfbG9uZwkJYmFzZSkJLyogaS9vIHBvcnQgb2YgdGhlIGNhcmQgKi8KK3sKKyAgaW50CXRlbXA7CisKKyAgdGVtcCA9IG1tY19pbihiYXNlLCBtbXJvZmYoMCwgbW1yX2Rlc19hdmFpbCkpOworICBpZigodGVtcCAhPSBNTVJfREVTX0FWQUlMX0RFUykgJiYgKHRlbXAgIT0gTU1SX0RFU19BVkFJTF9BRVMpKQorICAgIHJldHVybiAwOworICBlbHNlCisgICAgcmV0dXJuIHRlbXA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXYWl0IGZvciB0aGUgZnJlcXVlbmN5IEVFcHJvbSB0byBjb21wbGV0ZSBhIGNvbW1hbmQuLi4KKyAqIEkgaG9wZSB0aGlzIG9uZSB3aWxsIGJlIG9wdGltYWxseSBpbmxpbmVkLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZmVlX3dhaXQodV9sb25nCQliYXNlLAkvKiBpL28gcG9ydCBvZiB0aGUgY2FyZCAqLworCSBpbnQJCWRlbGF5LAkvKiBCYXNlIGRlbGF5IHRvIHdhaXQgZm9yICovCisJIGludAkJbnVtYmVyKQkvKiBOdW1iZXIgb2YgdGltZSB0byB3YWl0ICovCit7CisgIGludAkJY291bnQgPSAwOwkvKiBXYWl0IG9ubHkgYSBsaW1pdGVkIHRpbWUgKi8KKworICB3aGlsZSgoY291bnQrKyA8IG51bWJlcikgJiYKKwkobW1jX2luKGJhc2UsIG1tcm9mZigwLCBtbXJfZmVlX3N0YXR1cykpICYgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpCisgICAgdWRlbGF5KGRlbGF5KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJlYWQgYnl0ZXMgZnJvbSB0aGUgRnJlcXVlbmN5IEVFcHJvbSAoZnJlcXVlbmN5IHNlbGVjdCBjYXJkcykuCisgKi8KK3N0YXRpYyB2b2lkCitmZWVfcmVhZCh1X2xvbmcJCWJhc2UsCS8qIGkvbyBwb3J0IG9mIHRoZSBjYXJkICovCisJIHVfc2hvcnQJbywJLyogZGVzdGluYXRpb24gb2Zmc2V0ICovCisJIHVfc2hvcnQgKgliLAkvKiBkYXRhIGJ1ZmZlciAqLworCSBpbnQJCW4pCS8qIG51bWJlciBvZiByZWdpc3RlcnMgKi8KK3sKKyAgYiArPSBuOwkJLyogUG9zaXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgYXJlYSAqLworCisgIC8qIFdyaXRlIHRoZSBhZGRyZXNzICovCisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIG8gKyBuIC0gMSk7CisKKyAgLyogTG9vcCBvbiBhbGwgYnVmZmVyICovCisgIHdoaWxlKG4tLSA+IDApCisgICAgeworICAgICAgLyogV3JpdGUgdGhlIHJlYWQgY29tbWFuZCAqLworICAgICAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1JFQUQpOworCisgICAgICAvKiBXYWl0IHVudGlsIEVFcHJvbSBpcyByZWFkeSAoc2hvdWxkIGJlIHF1aWNrICEpICovCisgICAgICBmZWVfd2FpdChiYXNlLCAxMCwgMTAwKTsKKworICAgICAgLyogUmVhZCB0aGUgdmFsdWUgKi8KKyAgICAgICotLWIgPSAoKG1tY19pbihiYXNlLCBtbXJvZmYoMCwgbW1yX2ZlZV9kYXRhX2gpKSA8PCA4KSB8CisJICAgICAgbW1jX2luKGJhc2UsIG1tcm9mZigwLCBtbXJfZmVlX2RhdGFfbCkpKTsKKyAgICB9Cit9CisKKyNpZmRlZiBXSVJFTEVTU19FWFQJLyogSWYgd2lyZWxlc3MgZXh0ZW5zaW9uIGV4aXN0IGluIHRoZSBrZXJuZWwgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyaXRlIGJ5dGVzIGZyb20gdGhlIEZyZXF1ZW5jeSBFRXByb20gKGZyZXF1ZW5jeSBzZWxlY3QgY2FyZHMpLgorICogVGhpcyBpcyBhIGJpdCBjb21wbGljYXRlZCwgYmVjYXVzZSB0aGUgZnJlcXVlbmN5IGVlcHJvbSBoYXMgdG8KKyAqIGJlIHVucHJvdGVjdGVkIGFuZCB0aGUgd3JpdGUgZW5hYmxlZC4KKyAqIEplYW4gSUkKKyAqLworc3RhdGljIHZvaWQKK2ZlZV93cml0ZSh1X2xvbmcJYmFzZSwJLyogaS9vIHBvcnQgb2YgdGhlIGNhcmQgKi8KKwkgIHVfc2hvcnQJbywJLyogZGVzdGluYXRpb24gb2Zmc2V0ICovCisJICB1X3Nob3J0ICoJYiwJLyogZGF0YSBidWZmZXIgKi8KKwkgIGludAkJbikJLyogbnVtYmVyIG9mIHJlZ2lzdGVycyAqLworeworICBiICs9IG47CQkvKiBQb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBhcmVhICovCisKKyNpZmRlZiBFRVBST01fSVNfUFJPVEVDVEVECS8qIGRpc2FibGVkICovCisjaWZkZWYgRE9FU05UX1NFRU1fVE9fV09SSwkvKiBkaXNhYmxlZCAqLworICAvKiBBc2sgdG8gcmVhZCB0aGUgcHJvdGVjdGVkIHJlZ2lzdGVyICovCisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfY3RybCksIE1NV19GRUVfQ1RSTF9QUlJFQUQpOworCisgIGZlZV93YWl0KGJhc2UsIDEwLCAxMDApOworCisgIC8qIFJlYWQgdGhlIHByb3RlY3RlZCByZWdpc3RlciAqLworICBwcmludGsoIlByb3RlY3RlZCAyIDogJTAyWC0lMDJYXG4iLAorCSBtbWNfaW4oYmFzZSwgbW1yb2ZmKDAsIG1tcl9mZWVfZGF0YV9oKSksCisJIG1tY19pbihiYXNlLCBtbXJvZmYoMCwgbW1yX2ZlZV9kYXRhX2wpKSk7CisjZW5kaWYJLyogRE9FU05UX1NFRU1fVE9fV09SSyAqLworCisgIC8qIEVuYWJsZSBwcm90ZWN0ZWQgcmVnaXN0ZXIgKi8KKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgTU1XX0ZFRV9BRERSX0VOKTsKKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1BSRU4pOworCisgIGZlZV93YWl0KGJhc2UsIDEwLCAxMDApOworCisgIC8qIFVucHJvdGVjdCBhcmVhICovCisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIG8gKyBuKTsKKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1BSV1JJVEUpOworI2lmZGVmIERPRVNOVF9TRUVNX1RPX1dPUksJLyogZGlzYWJsZWQgKi8KKyAgLyogT3IgdXNlIDogKi8KKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1BSQ0xFQVIpOworI2VuZGlmCS8qIERPRVNOVF9TRUVNX1RPX1dPUksgKi8KKworICBmZWVfd2FpdChiYXNlLCAxMCwgMTAwKTsKKyNlbmRpZgkvKiBFRVBST01fSVNfUFJPVEVDVEVEICovCisKKyAgLyogV3JpdGUgZW5hYmxlICovCisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIE1NV19GRUVfQUREUl9FTik7CisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfY3RybCksIE1NV19GRUVfQ1RSTF9XUkVOKTsKKworICBmZWVfd2FpdChiYXNlLCAxMCwgMTAwKTsKKworICAvKiBXcml0ZSB0aGUgRUVwcm9tIGFkZHJlc3MgKi8KKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgbyArIG4gLSAxKTsKKworICAvKiBMb29wIG9uIGFsbCBidWZmZXIgKi8KKyAgd2hpbGUobi0tID4gMCkKKyAgICB7CisgICAgICAvKiBXcml0ZSB0aGUgdmFsdWUgKi8KKyAgICAgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfZGF0YV9oKSwgKCotLWIpID4+IDgpOworICAgICAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9kYXRhX2wpLCAqYiAmIDB4RkYpOworCisgICAgICAvKiBXcml0ZSB0aGUgd3JpdGUgY29tbWFuZCAqLworICAgICAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1dSSVRFKTsKKworICAgICAgLyogV2F2ZWxhbiBkb2Mgc2F5cyA6IHdhaXQgYXQgbGVhc3QgMTAgbXMgZm9yIEVFQlVTWSA9IDAgKi8KKyAgICAgIG1kZWxheSgxMCk7CisgICAgICBmZWVfd2FpdChiYXNlLCAxMCwgMTAwKTsKKyAgICB9CisKKyAgLyogV3JpdGUgZGlzYWJsZSAqLworICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZmVlX2FkZHIpLCBNTVdfRkVFX0FERFJfRFMpOworICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLCBNTVdfRkVFX0NUUkxfV0RTKTsKKworICBmZWVfd2FpdChiYXNlLCAxMCwgMTAwKTsKKworI2lmZGVmIEVFUFJPTV9JU19QUk9URUNURUQJLyogZGlzYWJsZWQgKi8KKyAgLyogUmVwcm90ZWN0IEVFcHJvbSAqLworICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZmVlX2FkZHIpLCAweDAwKTsKKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1BSV1JJVEUpOworCisgIGZlZV93YWl0KGJhc2UsIDEwLCAxMDApOworI2VuZGlmCS8qIEVFUFJPTV9JU19QUk9URUNURUQgKi8KK30KKyNlbmRpZgkvKiBXSVJFTEVTU19FWFQgKi8KKworLyoqKioqKioqKioqKioqKioqKiogV2F2ZUxBTiBSb2FtaW5nIHJvdXRpbmVzLi4uICoqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCS8qIENvbmRpdGlvbmFsIGNvbXBpbGUsIHNlZSB3YXZlbGFuX2NzLmggKi8KKwordW5zaWduZWQgY2hhciBXQVZFTEFOX0JFQUNPTl9BRERSRVNTW109IHsweDA5LDB4MDAsMHgwZSwweDIwLDB4MDMsMHgwMH07CisgIAordm9pZCB3dl9yb2FtX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgbmV0X2xvY2FsICAqbHA9IG5ldGRldl9wcml2KGRldik7CisKKyAgLyogRG8gbm90IHJlbW92ZSB0aGlzIHVubGVzcyB5b3UgaGF2ZSBhIGdvb2QgcmVhc29uICovCisgIHByaW50ayhLRVJOX05PVElDRSAiJXM6IFdhcm5pbmcsIHlvdSBoYXZlIGVuYWJsZWQgcm9hbWluZyBvbiIKKwkgIiBkZXZpY2UgJXMgIVxuIiwgZGV2LT5uYW1lLCBkZXYtPm5hbWUpOworICBwcmludGsoS0VSTl9OT1RJQ0UgIlJvYW1pbmcgaXMgY3VycmVudGx5IGFuIGV4cGVyaW1lbnRhbCB1bnN1cHBvcnRlZCBmZWF0dXJlIgorCSAiIG9mIHRoZSBXYXZlbGFuIGRyaXZlci5cbiIpOworICBwcmludGsoS0VSTl9OT1RJQ0UgIkl0IG1heSB3b3JrLCBidXQgbWF5IGFsc28gbWFrZSB0aGUgZHJpdmVyIGJlaGF2ZSBpbiIKKwkgIiBlcnJhdGljIHdheXMgb3IgY3Jhc2guXG4iKTsKKworICBscC0+d2F2ZXBvaW50X3RhYmxlLmhlYWQ9TlVMTDsgICAgICAgICAgIC8qIEluaXRpYWxpc2UgV2F2ZVBvaW50IHRhYmxlICovCisgIGxwLT53YXZlcG9pbnRfdGFibGUubnVtX3dhdmVwb2ludHM9MDsKKyAgbHAtPndhdmVwb2ludF90YWJsZS5sb2NrZWQ9MDsKKyAgbHAtPmN1cnJfcG9pbnQ9TlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBkZWZhdWx0IFdhdmVQb2ludCAqLworICBscC0+Y2VsbF9zZWFyY2g9MDsKKyAgCisgIGxwLT5jZWxsX3RpbWVyLmRhdGE9KGxvbmcpbHA7ICAgICAgICAgICAgICAgLyogU3RhcnQgY2VsbCBleHBpcnkgdGltZXIgKi8KKyAgbHAtPmNlbGxfdGltZXIuZnVuY3Rpb249d2xfY2VsbF9leHBpcnk7CisgIGxwLT5jZWxsX3RpbWVyLmV4cGlyZXM9amlmZmllcytDRUxMX1RJTUVPVVQ7CisgIGFkZF90aW1lcigmbHAtPmNlbGxfdGltZXIpOworICAKKyAgd3ZfbndpZF9maWx0ZXIoTldJRF9QUk9NSVNDLGxwKSA7ICAgIC8qIEVudGVyIE5XSUQgcHJvbWlzY3VvdXMgbW9kZSAqLworICAvKiB0byBidWlsZCB1cCBhIGdvb2QgV2F2ZVBvaW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFibGUuLi4gKi8KKyAgcHJpbnRrKEtFUk5fREVCVUcgIldhdmVMQU46IFJvYW1pbmcgZW5hYmxlZCBvbiBkZXZpY2UgJXNcbiIsZGV2LT5uYW1lKTsKK30KKyAKK3ZvaWQgd3Zfcm9hbV9jbGVhbnVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgIHdhdmVwb2ludF9oaXN0b3J5ICpwdHIsKm9sZF9wdHI7CisgIG5ldF9sb2NhbCAqbHA9IG5ldGRldl9wcml2KGRldik7CisgIAorICBwcmludGsoS0VSTl9ERUJVRyAiV2F2ZUxBTjogUm9hbWluZyBEaXNhYmxlZCBvbiBkZXZpY2UgJXNcbiIsZGV2LT5uYW1lKTsKKyAgCisgIC8qIEZpeG1lIDogbWF5YmUgd2Ugc2hvdWxkIGNoZWNrIHRoYXQgdGhlIHRpbWVyIGV4aXN0IGJlZm9yZSBkZWxldGluZyBpdCAqLworICBkZWxfdGltZXIoJmxwLT5jZWxsX3RpbWVyKTsgICAgICAgICAgLyogUmVtb3ZlIGNlbGwgZXhwaXJ5IHRpbWVyICAgICAgICovCisgIHB0cj1scC0+d2F2ZXBvaW50X3RhYmxlLmhlYWQ7ICAgICAgICAvKiBDbGVhciBkZXZpY2UncyBXYXZlUG9pbnQgdGFibGUgKi8KKyAgd2hpbGUocHRyIT1OVUxMKQorICAgIHsKKyAgICAgIG9sZF9wdHI9cHRyOworICAgICAgcHRyPXB0ci0+bmV4dDsJCisgICAgICB3bF9kZWxfd2F2ZXBvaW50KG9sZF9wdHIsbHApOwkKKyAgICB9Cit9CisKKy8qIEVuYWJsZS9EaXNhYmxlIE5XSUQgcHJvbWlzY3VvdXMgbW9kZSBvbiBhIGdpdmVuIGRldmljZSAqLwordm9pZCB3dl9ud2lkX2ZpbHRlcih1bnNpZ25lZCBjaGFyIG1vZGUsIG5ldF9sb2NhbCAqbHApCit7CisgIG1tX3QgICAgICAgICAgICAgICAgICBtOworICB1bnNpZ25lZCBsb25nICAgICAgICAgZmxhZ3M7CisgIAorI2lmZGVmIFdBVkVMQU5fUk9BTUlOR19ERUJVRworICBwcmludGsoS0VSTl9ERUJVRyAiV2F2ZUxBTjogTldJRCBwcm9taXNjICVzLCBkZXZpY2UgJXNcbiIsKG1vZGU9PU5XSURfUFJPTUlTQykgPyAib24iIDogIm9mZiIsIGxwLT5kZXYtPm5hbWUpOworI2VuZGlmCisgIAorICAvKiBEaXNhYmxlIGludGVycnVwdHMgJiBzYXZlIGZsYWdzICovCisgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgCisgIG0udy5tbXdfbG9vcHRfc2VsID0gKG1vZGU9PU5XSURfUFJPTUlTQykgPyBNTVdfTE9PUFRfU0VMX0RJU19OV0lEIDogMHgwMDsKKyAgbW1jX3dyaXRlKGxwLT5kZXYtPmJhc2VfYWRkciwgKGNoYXIgKikmbS53Lm1td19sb29wdF9zZWwgLSAoY2hhciAqKSZtLCAodW5zaWduZWQgY2hhciAqKSZtLncubW13X2xvb3B0X3NlbCwgMSk7CisgIAorICBpZihtb2RlPT1OV0lEX1BST01JU0MpCisgICAgbHAtPmNlbGxfc2VhcmNoPTE7CisgIGVsc2UKKyAgICBscC0+Y2VsbF9zZWFyY2g9MDsKKworICAvKiBSZUVuYWJsZSBpbnRlcnJ1cHRzICYgcmVzdG9yZSBmbGFncyAqLworICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKK30KKworLyogRmluZCBhIHJlY29yZCBpbiB0aGUgV2F2ZVBvaW50IHRhYmxlIG1hdGNoaW5nIGEgZ2l2ZW4gTldJRCAqLword2F2ZXBvaW50X2hpc3RvcnkgKndsX3JvYW1fY2hlY2sodW5zaWduZWQgc2hvcnQgbndpZCwgbmV0X2xvY2FsICpscCkKK3sKKyAgd2F2ZXBvaW50X2hpc3RvcnkJKnB0cj1scC0+d2F2ZXBvaW50X3RhYmxlLmhlYWQ7CisgIAorICB3aGlsZShwdHIhPU5VTEwpeworICAgIGlmKHB0ci0+bndpZD09bndpZCkKKyAgICAgIHJldHVybiBwdHI7CQorICAgIHB0cj1wdHItPm5leHQ7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIENyZWF0ZSBhIG5ldyB3YXZlcG9pbnQgdGFibGUgZW50cnkgKi8KK3dhdmVwb2ludF9oaXN0b3J5ICp3bF9uZXdfd2F2ZXBvaW50KHVuc2lnbmVkIHNob3J0IG53aWQsIHVuc2lnbmVkIGNoYXIgc2VxLCBuZXRfbG9jYWwqIGxwKQoreworICB3YXZlcG9pbnRfaGlzdG9yeSAqbmV3X3dhdmVwb2ludDsKKworI2lmZGVmIFdBVkVMQU5fUk9BTUlOR19ERUJVRwkKKyAgcHJpbnRrKEtFUk5fREVCVUcgIldhdmVMQU46IE5ldyBXYXZlcG9pbnQsIE5XSUQ6JS40WFxuIixud2lkKTsKKyNlbmRpZgorICAKKyAgaWYobHAtPndhdmVwb2ludF90YWJsZS5udW1fd2F2ZXBvaW50cz09TUFYX1dBVkVQT0lOVFMpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBuZXdfd2F2ZXBvaW50PSh3YXZlcG9pbnRfaGlzdG9yeSAqKSBrbWFsbG9jKHNpemVvZih3YXZlcG9pbnRfaGlzdG9yeSksR0ZQX0FUT01JQyk7CisgIGlmKG5ld193YXZlcG9pbnQ9PU5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBuZXdfd2F2ZXBvaW50LT5ud2lkPW53aWQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgV2F2ZVBvaW50cyBOV0lEICovCisgIG5ld193YXZlcG9pbnQtPmF2ZXJhZ2VfZmFzdD0wOyAgICAgICAgICAgICAgICAgICAgLyogUnVubmluZyBBdmVyYWdlcy4uKi8KKyAgbmV3X3dhdmVwb2ludC0+YXZlcmFnZV9zbG93PTA7CisgIG5ld193YXZlcG9pbnQtPnF1YWxwdHI9MDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IG9mIHJpbmdidWZmZXIgKi8KKyAgbmV3X3dhdmVwb2ludC0+bGFzdF9zZXE9c2VxLTE7ICAgICAgICAgICAgICAgIC8qIExhc3Qgc2VxdWVuY2Ugbm8uc2VlbiAqLworICBtZW1zZXQobmV3X3dhdmVwb2ludC0+c2lncXVhbCwwLFdBVkVQT0lOVF9ISVNUT1JZKTsvKiBFbXB0eSByaW5nYnVmZmVyICovCisgIAorICBuZXdfd2F2ZXBvaW50LT5uZXh0PWxwLT53YXZlcG9pbnRfdGFibGUuaGVhZDsvKiBBZGQgdG8gd2F2ZXBvaW50IHRhYmxlICovCisgIG5ld193YXZlcG9pbnQtPnByZXY9TlVMTDsKKyAgCisgIGlmKGxwLT53YXZlcG9pbnRfdGFibGUuaGVhZCE9TlVMTCkKKyAgICBscC0+d2F2ZXBvaW50X3RhYmxlLmhlYWQtPnByZXY9bmV3X3dhdmVwb2ludDsKKyAgCisgIGxwLT53YXZlcG9pbnRfdGFibGUuaGVhZD1uZXdfd2F2ZXBvaW50OworICAKKyAgbHAtPndhdmVwb2ludF90YWJsZS5udW1fd2F2ZXBvaW50cysrOyAgICAgLyogbm8uIG9mIHZpc2libGUgd2F2ZXBvaW50cyAqLworICAKKyAgcmV0dXJuIG5ld193YXZlcG9pbnQ7Cit9CisKKy8qIFJlbW92ZSBhIHdhdmVwb2ludCBlbnRyeSBmcm9tIFdhdmVQb2ludCB0YWJsZSAqLwordm9pZCB3bF9kZWxfd2F2ZXBvaW50KHdhdmVwb2ludF9oaXN0b3J5ICp3YXZlcG9pbnQsIHN0cnVjdCBuZXRfbG9jYWwgKmxwKQoreworICBpZih3YXZlcG9pbnQ9PU5VTEwpCisgICAgcmV0dXJuOworICAKKyAgaWYobHAtPmN1cnJfcG9pbnQ9PXdhdmVwb2ludCkKKyAgICBscC0+Y3Vycl9wb2ludD1OVUxMOworICAKKyAgaWYod2F2ZXBvaW50LT5wcmV2IT1OVUxMKQorICAgIHdhdmVwb2ludC0+cHJldi0+bmV4dD13YXZlcG9pbnQtPm5leHQ7CisgIAorICBpZih3YXZlcG9pbnQtPm5leHQhPU5VTEwpCisgICAgd2F2ZXBvaW50LT5uZXh0LT5wcmV2PXdhdmVwb2ludC0+cHJldjsKKyAgCisgIGlmKGxwLT53YXZlcG9pbnRfdGFibGUuaGVhZD09d2F2ZXBvaW50KQorICAgIGxwLT53YXZlcG9pbnRfdGFibGUuaGVhZD13YXZlcG9pbnQtPm5leHQ7CisgIAorICBscC0+d2F2ZXBvaW50X3RhYmxlLm51bV93YXZlcG9pbnRzLS07CisgIGtmcmVlKHdhdmVwb2ludCk7Cit9CisKKy8qIFRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIC0gY2hlY2tzIFdhdmVQb2ludCB0YWJsZSBmb3Igc3RhbGUgZW50cmllcyAqLyAKK3ZvaWQgd2xfY2VsbF9leHBpcnkodW5zaWduZWQgbG9uZyBkYXRhKQoreworICBuZXRfbG9jYWwgKmxwPShuZXRfbG9jYWwgKilkYXRhOworICB3YXZlcG9pbnRfaGlzdG9yeSAqd2F2ZXBvaW50PWxwLT53YXZlcG9pbnRfdGFibGUuaGVhZCwqb2xkX3BvaW50OworICAKKyNpZiBXQVZFTEFOX1JPQU1JTkdfREVCVUcgPiAxCisgIHByaW50ayhLRVJOX0RFQlVHICJXYXZlTEFOOiBXYXZlcG9pbnQgdGltZW91dCwgZGV2ICVzXG4iLGxwLT5kZXYtPm5hbWUpOworI2VuZGlmCisgIAorICBpZihscC0+d2F2ZXBvaW50X3RhYmxlLmxvY2tlZCkKKyAgICB7CisjaWYgV0FWRUxBTl9ST0FNSU5HX0RFQlVHID4gMQorICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIldhdmVMQU46IFdhdmVwb2ludCB0YWJsZSBsb2NrZWQuLi5cbiIpOworI2VuZGlmCisgICAgICAKKyAgICAgIGxwLT5jZWxsX3RpbWVyLmV4cGlyZXM9amlmZmllcysxOyAvKiBJZiB0YWJsZSBpbiB1c2UsIGNvbWUgYmFjayBsYXRlciAqLworICAgICAgYWRkX3RpbWVyKCZscC0+Y2VsbF90aW1lcik7CisgICAgICByZXR1cm47CisgICAgfQorICAKKyAgd2hpbGUod2F2ZXBvaW50IT1OVUxMKQorICAgIHsKKyAgICAgIGlmKHRpbWVfYWZ0ZXIoamlmZmllcywgd2F2ZXBvaW50LT5sYXN0X3NlZW4gKyBDRUxMX1RJTUVPVVQpKQorCXsKKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkdfREVCVUcKKwkgIHByaW50ayhLRVJOX0RFQlVHICJXYXZlTEFOOiBCeWUgYnllICUuNFhcbiIsd2F2ZXBvaW50LT5ud2lkKTsKKyNlbmRpZgorCSAgCisJICBvbGRfcG9pbnQ9d2F2ZXBvaW50OworCSAgd2F2ZXBvaW50PXdhdmVwb2ludC0+bmV4dDsKKwkgIHdsX2RlbF93YXZlcG9pbnQob2xkX3BvaW50LGxwKTsKKwl9CisgICAgICBlbHNlCisJd2F2ZXBvaW50PXdhdmVwb2ludC0+bmV4dDsKKyAgICB9CisgIGxwLT5jZWxsX3RpbWVyLmV4cGlyZXM9amlmZmllcytDRUxMX1RJTUVPVVQ7CisgIGFkZF90aW1lcigmbHAtPmNlbGxfdGltZXIpOworfQorCisvKiBVcGRhdGUgU05SIGhpc3Rvcnkgb2YgYSB3YXZlcG9pbnQgKi8KK3ZvaWQgd2xfdXBkYXRlX2hpc3Rvcnkod2F2ZXBvaW50X2hpc3RvcnkgKndhdmVwb2ludCwgdW5zaWduZWQgY2hhciBzaWdxdWFsLCB1bnNpZ25lZCBjaGFyIHNlcSkJCit7CisgIGludCBpPTAsbnVtX21pc3NlZD0wLHB0cj0wOworICBpbnQgYXZlcmFnZV9mYXN0PTAsYXZlcmFnZV9zbG93PTA7CisgIAorICBudW1fbWlzc2VkPShzZXEtd2F2ZXBvaW50LT5sYXN0X3NlcSklV0FWRVBPSU5UX0hJU1RPUlk7LyogSGF2ZSB3ZSBtaXNzZWQKKwkJCQkJCQkgICAgYW55IGJlYWNvbnM/ICovCisgIGlmKG51bV9taXNzZWQpCisgICAgZm9yKGk9MDtpPG51bV9taXNzZWQ7aSsrKQorICAgICAgeworCXdhdmVwb2ludC0+c2lncXVhbFt3YXZlcG9pbnQtPnF1YWxwdHIrK109MDsgLyogSWYgc28sIGVudGVyIHRoZW0gYXMgMCdzICovCisJd2F2ZXBvaW50LT5xdWFscHRyICU9V0FWRVBPSU5UX0hJU1RPUlk7ICAgIC8qIGluIHRoZSByaW5nYnVmZmVyLiAqLworICAgICAgfQorICB3YXZlcG9pbnQtPmxhc3Rfc2Vlbj1qaWZmaWVzOyAgICAgICAgICAgICAgICAgLyogQWRkIGJlYWNvbiB0byBoaXN0b3J5ICovCisgIHdhdmVwb2ludC0+bGFzdF9zZXE9c2VxOwkKKyAgd2F2ZXBvaW50LT5zaWdxdWFsW3dhdmVwb2ludC0+cXVhbHB0cisrXT1zaWdxdWFsOyAgICAgICAgICAKKyAgd2F2ZXBvaW50LT5xdWFscHRyICU9V0FWRVBPSU5UX0hJU1RPUlk7CisgIHB0cj0od2F2ZXBvaW50LT5xdWFscHRyLVdBVkVQT0lOVF9GQVNUX0hJU1RPUlkrV0FWRVBPSU5UX0hJU1RPUlkpJVdBVkVQT0lOVF9ISVNUT1JZOworICAKKyAgZm9yKGk9MDtpPFdBVkVQT0lOVF9GQVNUX0hJU1RPUlk7aSsrKSAgICAgICAvKiBVcGRhdGUgcnVubmluZyBhdmVyYWdlcyAqLworICAgIHsKKyAgICAgIGF2ZXJhZ2VfZmFzdCs9d2F2ZXBvaW50LT5zaWdxdWFsW3B0cisrXTsKKyAgICAgIHB0ciAlPVdBVkVQT0lOVF9ISVNUT1JZOworICAgIH0KKyAgCisgIGF2ZXJhZ2Vfc2xvdz1hdmVyYWdlX2Zhc3Q7CisgIGZvcihpPVdBVkVQT0lOVF9GQVNUX0hJU1RPUlk7aTxXQVZFUE9JTlRfSElTVE9SWTtpKyspCisgICAgeworICAgICAgYXZlcmFnZV9zbG93Kz13YXZlcG9pbnQtPnNpZ3F1YWxbcHRyKytdOworICAgICAgcHRyICU9V0FWRVBPSU5UX0hJU1RPUlk7CisgICAgfQorICAKKyAgd2F2ZXBvaW50LT5hdmVyYWdlX2Zhc3Q9YXZlcmFnZV9mYXN0L1dBVkVQT0lOVF9GQVNUX0hJU1RPUlk7CisgIHdhdmVwb2ludC0+YXZlcmFnZV9zbG93PWF2ZXJhZ2Vfc2xvdy9XQVZFUE9JTlRfSElTVE9SWTsJCit9CisKKy8qIFBlcmZvcm0gYSBoYW5kb3ZlciB0byBhIG5ldyBXYXZlUG9pbnQgKi8KK3ZvaWQgd3Zfcm9hbV9oYW5kb3Zlcih3YXZlcG9pbnRfaGlzdG9yeSAqd2F2ZXBvaW50LCBuZXRfbG9jYWwgKmxwKQoreworICBraW9fYWRkcl90CQliYXNlID0gbHAtPmRldi0+YmFzZV9hZGRyOworICBtbV90ICAgICAgICAgICAgICAgICAgbTsKKyAgdW5zaWduZWQgbG9uZyAgICAgICAgIGZsYWdzOworCisgIGlmKHdhdmVwb2ludD09bHAtPmN1cnJfcG9pbnQpICAgICAgICAgIC8qIFNhbml0eSBjaGVjay4uLiAqLworICAgIHsKKyAgICAgIHd2X253aWRfZmlsdGVyKCFOV0lEX1BST01JU0MsbHApOworICAgICAgcmV0dXJuOworICAgIH0KKyAgCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HX0RFQlVHCisgIHByaW50ayhLRVJOX0RFQlVHICJXYXZlTEFOOiBEb2luZyBoYW5kb3ZlciB0byAlLjRYLCBkZXYgJXNcbiIsd2F2ZXBvaW50LT5ud2lkLGxwLT5kZXYtPm5hbWUpOworI2VuZGlmCisgCQorICAvKiBEaXNhYmxlIGludGVycnVwdHMgJiBzYXZlIGZsYWdzICovCisgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworICBtLncubW13X25ldHdfaWRfbCA9IHdhdmVwb2ludC0+bndpZCAmIDB4RkY7CisgIG0udy5tbXdfbmV0d19pZF9oID0gKHdhdmVwb2ludC0+bndpZCAmIDB4RkYwMCkgPj4gODsKKyAgCisgIG1tY193cml0ZShiYXNlLCAoY2hhciAqKSZtLncubW13X25ldHdfaWRfbCAtIChjaGFyICopJm0sICh1bnNpZ25lZCBjaGFyICopJm0udy5tbXdfbmV0d19pZF9sLCAyKTsKKyAgCisgIC8qIFJlRW5hYmxlIGludGVycnVwdHMgJiByZXN0b3JlIGZsYWdzICovCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisgIHd2X253aWRfZmlsdGVyKCFOV0lEX1BST01JU0MsbHApOworICBscC0+Y3Vycl9wb2ludD13YXZlcG9pbnQ7Cit9CisKKy8qIENhbGxlZCB3aGVuIGEgV2F2ZVBvaW50IGJlYWNvbiBpcyByZWNlaXZlZCAqLworc3RhdGljIGlubGluZSB2b2lkIHdsX3JvYW1fZ2F0aGVyKHN0cnVjdCBuZXRfZGV2aWNlICogIGRldiwKKwkJCQkgIHVfY2hhciAqICBoZHIsICAgLyogQmVhY29uIGhlYWRlciAqLworCQkJCSAgdV9jaGFyICogIHN0YXRzKSAvKiBTTlIsIFNpZ25hbCBxdWFsaXR5IAorCQkJCQkJICAgICAgb2YgcGFja2V0ICovCit7CisgIHdhdmVwb2ludF9iZWFjb24gKmJlYWNvbj0gKHdhdmVwb2ludF9iZWFjb24gKiloZHI7IC8qIFJjdmQuIEJlYWNvbiAqLworICB1bnNpZ25lZCBzaG9ydCBud2lkPW50b2hzKGJlYWNvbi0+bndpZCk7ICAKKyAgdW5zaWduZWQgc2hvcnQgc2lncXVhbD1zdGF0c1syXSAmIE1NUl9TR05MX1FVQUw7ICAgLyogU05SIG9mIGJlYWNvbiAqLworICB3YXZlcG9pbnRfaGlzdG9yeSAqd2F2ZXBvaW50PU5VTEw7ICAgICAgICAgICAgICAgIC8qIFdhdmVQb2ludCB0YWJsZSBlbnRyeSAqLworICBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsgICAgICAgICAgICAgIC8qIERldmljZSBpbmZvICovCisKKyNpZmRlZiBJX05FRURfVEhJU19GRUFUVVJFCisgIC8qIFNvbWUgcGVvcGxlIGRvbid0IG5lZWQgdGhpcywgc29tZSBvdGhlciBtYXkgbmVlZCBpdCAqLworICBud2lkPW53aWRebnRvaHMoYmVhY29uLT5kb21haW5faWQpOworI2VuZGlmCisKKyNpZiBXQVZFTEFOX1JPQU1JTkdfREVCVUcgPiAxCisgIHByaW50ayhLRVJOX0RFQlVHICJXYXZlTEFOOiBiZWFjb24sIGRldiAlczpcbiIsZGV2LT5uYW1lKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgIkRvbWFpbjogJS40WCBOV0lEOiAlLjRYIFNpZ1F1YWw9JWRcbiIsbnRvaHMoYmVhY29uLT5kb21haW5faWQpLG53aWQsc2lncXVhbCk7CisjZW5kaWYKKyAgCisgIGxwLT53YXZlcG9pbnRfdGFibGUubG9ja2VkPTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDxNdXRleD4gKi8KKyAgCisgIHdhdmVwb2ludD13bF9yb2FtX2NoZWNrKG53aWQsbHApOyAgICAgICAgICAgIC8qIEZpbmQgV2F2ZVBvaW50IHRhYmxlIGVudHJ5ICovCisgIGlmKHdhdmVwb2ludD09TlVMTCkgICAgICAgICAgICAgICAgICAgIC8qIElmIG5vIGVudHJ5LCBDcmVhdGUgYSBuZXcgb25lLi4uICovCisgICAgeworICAgICAgd2F2ZXBvaW50PXdsX25ld193YXZlcG9pbnQobndpZCxiZWFjb24tPnNlcSxscCk7CisgICAgICBpZih3YXZlcG9pbnQ9PU5VTEwpCisJZ290byBvdXQ7CisgICAgfQorICBpZihscC0+Y3Vycl9wb2ludD09TlVMTCkgICAgICAgICAgICAgLyogSWYgdGhpcyBpcyB0aGUgb25seSBXYXZlUG9pbnQsICovCisgICAgd3Zfcm9hbV9oYW5kb3Zlcih3YXZlcG9pbnQsIGxwKTsJICAgICAgICAgLyogSnVtcCBvbiBpdCEgKi8KKyAgCisgIHdsX3VwZGF0ZV9oaXN0b3J5KHdhdmVwb2ludCwgc2lncXVhbCwgYmVhY29uLT5zZXEpOyAvKiBVcGRhdGUgU05SIGhpc3RvcnkKKwkJCQkJCQkgc3RhdHMuICovCisgIAorICBpZihscC0+Y3Vycl9wb2ludC0+YXZlcmFnZV9zbG93IDwgU0VBUkNIX1RIUkVTSF9MT1cpIC8qIElmIG91ciBjdXJyZW50ICovCisgICAgaWYoIWxwLT5jZWxsX3NlYXJjaCkgICAgICAgICAgICAgICAgICAvKiBXYXZlUG9pbnQgaXMgZ2V0dGluZyBmYWludCwgKi8KKyAgICAgIHd2X253aWRfZmlsdGVyKE5XSURfUFJPTUlTQyxscCk7ICAgIC8qIHN0YXJ0IGxvb2tpbmcgZm9yIGEgbmV3IG9uZSAqLworICAKKyAgaWYod2F2ZXBvaW50LT5hdmVyYWdlX3Nsb3cgPiAKKyAgICAgbHAtPmN1cnJfcG9pbnQtPmF2ZXJhZ2Vfc2xvdyArIFdBVkVMQU5fUk9BTUlOR19ERUxUQSkKKyAgICB3dl9yb2FtX2hhbmRvdmVyKHdhdmVwb2ludCwgbHApOyAgIC8qIEhhbmRvdmVyIHRvIGEgYmV0dGVyIFdhdmVQb2ludCAqLworICAKKyAgaWYobHAtPmN1cnJfcG9pbnQtPmF2ZXJhZ2Vfc2xvdyA+IFNFQVJDSF9USFJFU0hfSElHSCkgLyogSWYgb3VyIFNOUiBpcyAqLworICAgIGlmKGxwLT5jZWxsX3NlYXJjaCkgIC8qIGdldHRpbmcgYmV0dGVyLCBkcm9wIG91dCBvZiBjZWxsIHNlYXJjaCBtb2RlICovCisgICAgICB3dl9ud2lkX2ZpbHRlcighTldJRF9QUk9NSVNDLGxwKTsKKyAgCitvdXQ6CisgIGxwLT53YXZlcG9pbnRfdGFibGUubG9ja2VkPTA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogPC9NVVRFWD4gICA6LSkgKi8KK30KKworLyogVGVzdCB0aGlzIE1BQyBmcmFtZSBhIFdhdmVQb2ludCBiZWFjb24gKi8KK3N0YXRpYyBpbmxpbmUgaW50IFdBVkVMQU5fQkVBQ09OKHVuc2lnbmVkIGNoYXIgKmRhdGEpCit7CisgIHdhdmVwb2ludF9iZWFjb24gKmJlYWNvbj0gKHdhdmVwb2ludF9iZWFjb24gKilkYXRhOworICBzdGF0aWMgd2F2ZXBvaW50X2JlYWNvbiBiZWFjb25fdGVtcGxhdGU9ezB4YWEsMHhhYSwweDAzLDB4MDgsMHgwMCwweDBlLDB4MjAsMHgwMywweDAwfTsKKyAgCisgIGlmKG1lbWNtcChiZWFjb24sJmJlYWNvbl90ZW1wbGF0ZSw5KT09MCkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIEk4MjU5MyBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFVzZWZ1bCBzdWJyb3V0aW5lcyB0byBtYW5hZ2UgdGhlIEV0aGVybmV0IGNvbnRyb2xsZXIKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUm91dGluZSB0byBzeW5jaHJvbm91c2x5IHNlbmQgYSBjb21tYW5kIHRvIHRoZSBpODI1OTMgY2hpcC4gCisgKiBTaG91bGQgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqIChjYWxsZWQgYnkgd3ZfcGFja2V0X3dyaXRlKCksIHd2X3J1X3N0b3AoKSwgd3ZfcnVfc3RhcnQoKSwKKyAqICB3dl84MjU5M19jb25maWcoKSAmIHd2X2RpYWcoKSkKKyAqLworc3RhdGljIGludAord3ZfODI1OTNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAorCSAgICAgY2hhciAqCXN0ciwKKwkgICAgIGludAljbWQsCisJICAgICBpbnQJcmVzdWx0KQoreworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgaW50CQlzdGF0dXM7CisgIGludAkJd2FpdF9jb21wbGV0ZWQ7CisgIGxvbmcJCXNwaW47CisKKyAgLyogU3BpbiB1bnRpbCB0aGUgY2hpcCBmaW5pc2hlcyBleGVjdXRpbmcgaXRzIGN1cnJlbnQgY29tbWFuZCAoaWYgYW55KSAqLworICBzcGluID0gMTAwMDsKKyAgZG8KKyAgICB7CisgICAgICAvKiBUaW1lIGNhbGlicmF0aW9uIG9mIHRoZSBsb29wICovCisgICAgICB1ZGVsYXkoMTApOworCisgICAgICAvKiBSZWFkIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KKyAgICAgIG91dGIoT1AwX05PUCB8IENSMF9TVEFUVVNfMywgTENDUihiYXNlKSk7CisgICAgICBzdGF0dXMgPSBpbmIoTENTUihiYXNlKSk7CisgICAgfQorICB3aGlsZSgoKHN0YXR1cyAmIFNSM19FWEVDX1NUQVRFX01BU0spICE9IFNSM19FWEVDX0lETEUpICYmIChzcGluLS0gPiAwKSk7CisKKyAgLyogSWYgdGhlIGludGVycnVwdCBoYXNuJ3QgYmUgcG9zdGVkICovCisgIGlmKHNwaW4gPD0gMCkKKyAgICB7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0VSUk9SCisgICAgICBwcmludGsoS0VSTl9JTkZPICJ3dl84MjU5M19jbWQ6ICVzIHRpbWVvdXQgKHByZXZpb3VzIGNvbW1hbmQpLCBzdGF0dXMgMHglMDJ4XG4iLAorCSAgICAgc3RyLCBzdGF0dXMpOworI2VuZGlmCisgICAgICByZXR1cm4oRkFMU0UpOworICAgIH0KKworICAvKiBJc3N1ZSB0aGUgY29tbWFuZCB0byB0aGUgY29udHJvbGxlciAqLworICBvdXRiKGNtZCwgTENDUihiYXNlKSk7CisKKyAgLyogSWYgd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGUgcmVzdWx0IG9mIHRoZSBjb21tYW5kCisgICAqIE5vdGUgOiB0aGlzIG1lYW4gdGhhdCB0aGUgaXJxIGhhbmRsZXIgd2lsbCBkZWFsIHdpdGggdGhhdCAqLworICBpZihyZXN1bHQgPT0gU1IwX05PX1JFU1VMVCkKKyAgICByZXR1cm4oVFJVRSk7CisKKyAgLyogV2UgYXJlIHdhaXRpbmcgZm9yIGNvbW1hbmQgY29tcGxldGlvbiAqLworICB3YWl0X2NvbXBsZXRlZCA9IFRSVUU7CisKKyAgLyogQnVzeSB3YWl0IHdoaWxlIHRoZSBMQU4gY29udHJvbGxlciBleGVjdXRlcyB0aGUgY29tbWFuZC4gKi8KKyAgc3BpbiA9IDEwMDA7CisgIGRvCisgICAgeworICAgICAgLyogVGltZSBjYWxpYnJhdGlvbiBvZiB0aGUgbG9vcCAqLworICAgICAgdWRlbGF5KDEwKTsKKworICAgICAgLyogUmVhZCB0aGUgaW50ZXJydXB0IHJlZ2lzdGVyICovCisgICAgICBvdXRiKENSMF9TVEFUVVNfMCB8IE9QMF9OT1AsIExDQ1IoYmFzZSkpOworICAgICAgc3RhdHVzID0gaW5iKExDU1IoYmFzZSkpOworCisgICAgICAvKiBDaGVjayBpZiB0aGVyZSB3YXMgYW4gaW50ZXJydXB0IHBvc3RlZCAqLworICAgICAgaWYoKHN0YXR1cyAmIFNSMF9JTlRFUlJVUFQpKQorCXsKKwkgIC8qIEFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHQgKi8KKwkgIG91dGIoQ1IwX0lOVF9BQ0sgfCBPUDBfTk9QLCBMQ0NSKGJhc2UpKTsKKworCSAgLyogQ2hlY2sgaWYgaW50ZXJydXB0IGlzIGEgY29tbWFuZCBjb21wbGV0aW9uICovCisJICBpZigoKHN0YXR1cyAmIFNSMF9CT1RIX1JYX1RYKSAhPSBTUjBfQk9USF9SWF9UWCkgJiYKKwkgICAgICgoc3RhdHVzICYgU1IwX0JPVEhfUlhfVFgpICE9IDB4MCkgJiYKKwkgICAgICEoc3RhdHVzICYgU1IwX1JFQ0VQVElPTikpCisJICAgIHsKKwkgICAgICAvKiBTaWduYWwgY29tbWFuZCBjb21wbGV0aW9uICovCisJICAgICAgd2FpdF9jb21wbGV0ZWQgPSBGQUxTRTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogTm90ZSA6IFJ4IGludGVycnVwdHMgd2lsbCBiZSBoYW5kbGVkIGxhdGVyLCBiZWNhdXNlIHdlIGNhbgorCSAgICAgICAqIGhhbmRsZSBtdWx0aXBsZSBSeCBwYWNrZXRzIGF0IG9uY2UgKi8KKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTworCSAgICAgIHByaW50ayhLRVJOX0lORk8gInd2XzgyNTkzX2NtZDogbm90IG91ciBpbnRlcnJ1cHRcbiIpOworI2VuZGlmCisJICAgIH0KKwl9CisgICAgfQorICB3aGlsZSh3YWl0X2NvbXBsZXRlZCAmJiAoc3Bpbi0tID4gMCkpOworCisgIC8qIElmIHRoZSBpbnRlcnJ1cHQgaGFzbid0IGJlIHBvc3RlZCAqLworICBpZih3YWl0X2NvbXBsZXRlZCkKKyAgICB7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0VSUk9SCisgICAgICBwcmludGsoS0VSTl9JTkZPICJ3dl84MjU5M19jbWQ6ICVzIHRpbWVvdXQsIHN0YXR1cyAweCUwMnhcbiIsCisJICAgICBzdHIsIHN0YXR1cyk7CisjZW5kaWYKKyAgICAgIHJldHVybihGQUxTRSk7CisgICAgfQorCisgIC8qIENoZWNrIHRoZSByZXR1cm4gY29kZSByZXR1cm5lZCBieSB0aGUgY2FyZCAoc2VlIGFib3ZlKSBhZ2FpbnN0CisgICAqIHRoZSBleHBlY3RlZCByZXR1cm4gY29kZSBwcm92aWRlZCBieSB0aGUgY2FsbGVyICovCisgIGlmKChzdGF0dXMgJiBTUjBfRVZFTlRfTUFTSykgIT0gcmVzdWx0KQorICAgIHsKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfRVJST1IKKyAgICAgIHByaW50ayhLRVJOX0lORk8gInd2XzgyNTkzX2NtZDogJXMgZmFpbGVkLCBzdGF0dXMgPSAweCV4XG4iLAorCSAgICAgc3RyLCBzdGF0dXMpOworI2VuZGlmCisgICAgICByZXR1cm4oRkFMU0UpOworICAgIH0KKworICByZXR1cm4oVFJVRSk7Cit9IC8qIHd2XzgyNTkzX2NtZCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIGRvZXMgYSA1OTMgb3AtY29kZSBudW1iZXIgNywgYW5kIG9idGFpbnMgdGhlIGRpYWdub3NlCisgKiBzdGF0dXMgZm9yIHRoZSBXYXZlTEFOLgorICovCitzdGF0aWMgaW5saW5lIGludAord3ZfZGlhZyhzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAgaW50CQlyZXQgPSBGQUxTRTsKKworICBpZih3dl84MjU5M19jbWQoZGV2LCAid3ZfZGlhZygpOiBkaWFnbm9zZSIsCisJCSAgT1AwX0RJQUdOT1NFLCBTUjBfRElBR05PU0VfUEFTU0VEKSkKKyAgICByZXQgPSBUUlVFOworCisjaWZkZWYgREVCVUdfQ09ORklHX0VSUk9SUworICBwcmludGsoS0VSTl9JTkZPICJ3YXZlbGFuX2NzOiBpODI1OTMgU2VsZiBUZXN0IGZhaWxlZCFcbiIpOworI2VuZGlmCisgIHJldHVybihyZXQpOworfSAvKiB3dl9kaWFnICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSb3V0aW5lIHRvIHJlYWQgbGVuIGJ5dGVzIGZyb20gdGhlIGk4MjU5MydzIHJpbmcgYnVmZmVyLCBzdGFydGluZyBhdAorICogY2hpcCBhZGRyZXNzIGFkZHIuIFRoZSByZXN1bHRzIHJlYWQgZnJvbSB0aGUgY2hpcCBhcmUgc3RvcmVkIGluIGJ1Zi4KKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGFkZHJlc3MgdG8gdXNlIGZvciBuZXh0IHRoZSBjYWxsLgorICovCitzdGF0aWMgaW50CityZWFkX3JpbmdidWYoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCisJICAgICBpbnQJYWRkciwKKwkgICAgIGNoYXIgKglidWYsCisJICAgICBpbnQJbGVuKQoreworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgaW50CQlyaW5nX3B0ciA9IGFkZHI7CisgIGludAkJY2h1bmtfbGVuOworICBjaGFyICoJYnVmX3B0ciA9IGJ1ZjsKKworICAvKiBHZXQgYWxsIHRoZSBidWZmZXIgKi8KKyAgd2hpbGUobGVuID4gMCkKKyAgICB7CisgICAgICAvKiBQb3NpdGlvbiB0aGUgUHJvZ3JhbSBJL08gUmVnaXN0ZXIgYXQgdGhlIHJpbmcgYnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgIG91dGIocmluZ19wdHIgJiAweGZmLCBQSU9STChiYXNlKSk7CisgICAgICBvdXRiKCgocmluZ19wdHIgPj4gOCkgJiBQSU9SSF9NQVNLKSwgUElPUkgoYmFzZSkpOworCisgICAgICAvKiBGaXJzdCwgZGV0ZXJtaW5lIGhvdyBtdWNoIHdlIGNhbiByZWFkIHdpdGhvdXQgd3JhcHBpbmcgYXJvdW5kIHRoZQorCSByaW5nIGJ1ZmZlciAqLworICAgICAgaWYoKGFkZHIgKyBsZW4pIDwgKFJYX0JBU0UgKyBSWF9TSVpFKSkKKwljaHVua19sZW4gPSBsZW47CisgICAgICBlbHNlCisJY2h1bmtfbGVuID0gUlhfQkFTRSArIFJYX1NJWkUgLSBhZGRyOworICAgICAgaW5zYihQSU9QKGJhc2UpLCBidWZfcHRyLCBjaHVua19sZW4pOworICAgICAgYnVmX3B0ciArPSBjaHVua19sZW47CisgICAgICBsZW4gLT0gY2h1bmtfbGVuOworICAgICAgcmluZ19wdHIgPSAocmluZ19wdHIgLSBSWF9CQVNFICsgY2h1bmtfbGVuKSAlIFJYX1NJWkUgKyBSWF9CQVNFOworICAgIH0KKyAgcmV0dXJuKHJpbmdfcHRyKTsKK30gLyogcmVhZF9yaW5nYnVmICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSZWNvbmZpZ3VyZSB0aGUgaTgyNTkzLCBvciBhdCBsZWFzdCBhc2sgZm9yIGl0Li4uCisgKiBCZWNhdXNlIHd2XzgyNTkzX2NvbmZpZyB1c2UgdGhlIHRyYW5zbWlzc2lvbiBidWZmZXIsIHdlIG11c3QgZG8gaXQKKyAqIHdoZW4gd2UgYXJlIHN1cmUgdGhhdCB0aGVyZSBpcyBubyB0cmFuc21pc3Npb24sIHNvIHdlIGRvIGl0IG5vdworICogb3IgaW4gd2F2ZWxhbl9wYWNrZXRfeG1pdCgpIChJIGNhbid0IGZpbmQgYW55IGJldHRlciBwbGFjZSwKKyAqIHdhdmVsYW5faW50ZXJydXB0IGlzIG5vdCBhbiBvcHRpb24uLi4pLCBzbyB5b3UgbWF5IGV4cGVyaWVuY2UKKyAqIHNvbWUgZGVsYXkgc29tZXRpbWUuLi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCit3dl84MjU5M19yZWNvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAgbmV0X2xvY2FsICoJCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgZGV2X2xpbmtfdCAqCQlsaW5rID0gbHAtPmxpbms7CisgIHVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisgIC8qIEFybSB0aGUgZmxhZywgd2lsbCBiZSBjbGVhcmQgaW4gd3ZfODI1OTNfY29uZmlnKCkgKi8KKyAgbHAtPnJlY29uZmlnXzgyNTkzID0gVFJVRTsKKworICAvKiBDaGVjayBpZiB3ZSBjYW4gZG8gaXQgbm93ICEgKi8KKyAgaWYoKGxpbmstPm9wZW4pICYmIChuZXRpZl9ydW5uaW5nKGRldikpICYmICEobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSkKKyAgICB7CisgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICAgICAgd3ZfODI1OTNfY29uZmlnKGRldik7CisgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsJLyogUmUtZW5hYmxlIGludGVycnVwdHMgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworICAgICAgcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICIlczogd3ZfODI1OTNfcmVjb25maWcoKTogZGVsYXllZCAoc3RhdGUgPSAlbFgsIGxpbmsgPSAlZClcbiIsCisJICAgICBkZXYtPm5hbWUsIGRldi0+c3RhdGUsIGxpbmstPm9wZW4pOworI2VuZGlmCisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqIERFQlVHICYgSU5GTyBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyByb3V0aW5lcyBhcmUgdXNlZCBpbiB0aGUgY29kZSB0byBzaG93IGRlYnVnIGluZm9ybWF0aW9ucy4KKyAqIE1vc3Qgb2YgdGhlIHRpbWUsIGl0IGR1bXAgdGhlIGNvbnRlbnQgb2YgaGFyZHdhcmUgc3RydWN0dXJlcy4uLgorICovCisKKyNpZmRlZiBERUJVR19QU0FfU0hPVworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHRoZSBmb3JtYXR0ZWQgY29udGVudHMgb2YgdGhlIFBhcmFtZXRlciBTdG9yYWdlIEFyZWEuCisgKi8KK3N0YXRpYyB2b2lkCit3dl9wc2Ffc2hvdyhwc2FfdCAqCXApCit7CisgIHByaW50ayhLRVJOX0RFQlVHICIjIyMjIyB3YXZlbGFuIHBzYSBjb250ZW50czogIyMjIyNcbiIpOworICBwcmludGsoS0VSTl9ERUJVRyAicHNhX2lvX2Jhc2VfYWRkcl8xOiAweCUwMlggJTAyWCAlMDJYICUwMlhcbiIsCisJIHAtPnBzYV9pb19iYXNlX2FkZHJfMSwKKwkgcC0+cHNhX2lvX2Jhc2VfYWRkcl8yLAorCSBwLT5wc2FfaW9fYmFzZV9hZGRyXzMsCisJIHAtPnBzYV9pb19iYXNlX2FkZHJfNCk7CisgIHByaW50ayhLRVJOX0RFQlVHICJwc2FfcmVtX2Jvb3RfYWRkcl8xOiAweCUwMlggJTAyWCAlMDJYXG4iLAorCSBwLT5wc2FfcmVtX2Jvb3RfYWRkcl8xLAorCSBwLT5wc2FfcmVtX2Jvb3RfYWRkcl8yLAorCSBwLT5wc2FfcmVtX2Jvb3RfYWRkcl8zKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV9ob2xpX3BhcmFtczogMHglMDJ4LCAiLCBwLT5wc2FfaG9saV9wYXJhbXMpOworICBwcmludGsoInBzYV9pbnRfcmVxX25vOiAlZFxuIiwgcC0+cHNhX2ludF9yZXFfbm8pOworI2lmZGVmIERFQlVHX1NIT1dfVU5VU0VECisgIHByaW50ayhLRVJOX0RFQlVHICJwc2FfdW51c2VkMFtdOiAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCSBwLT5wc2FfdW51c2VkMFswXSwKKwkgcC0+cHNhX3VudXNlZDBbMV0sCisJIHAtPnBzYV91bnVzZWQwWzJdLAorCSBwLT5wc2FfdW51c2VkMFszXSwKKwkgcC0+cHNhX3VudXNlZDBbNF0sCisJIHAtPnBzYV91bnVzZWQwWzVdLAorCSBwLT5wc2FfdW51c2VkMFs2XSk7CisjZW5kaWYJLyogREVCVUdfU0hPV19VTlVTRUQgKi8KKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV91bml2X21hY19hZGRyW106ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSBwLT5wc2FfdW5pdl9tYWNfYWRkclswXSwKKwkgcC0+cHNhX3VuaXZfbWFjX2FkZHJbMV0sCisJIHAtPnBzYV91bml2X21hY19hZGRyWzJdLAorCSBwLT5wc2FfdW5pdl9tYWNfYWRkclszXSwKKwkgcC0+cHNhX3VuaXZfbWFjX2FkZHJbNF0sCisJIHAtPnBzYV91bml2X21hY19hZGRyWzVdKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV9sb2NhbF9tYWNfYWRkcltdOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgcC0+cHNhX2xvY2FsX21hY19hZGRyWzBdLAorCSBwLT5wc2FfbG9jYWxfbWFjX2FkZHJbMV0sCisJIHAtPnBzYV9sb2NhbF9tYWNfYWRkclsyXSwKKwkgcC0+cHNhX2xvY2FsX21hY19hZGRyWzNdLAorCSBwLT5wc2FfbG9jYWxfbWFjX2FkZHJbNF0sCisJIHAtPnBzYV9sb2NhbF9tYWNfYWRkcls1XSk7CisgIHByaW50ayhLRVJOX0RFQlVHICJwc2FfdW5pdl9sb2NhbF9zZWw6ICVkLCAiLCBwLT5wc2FfdW5pdl9sb2NhbF9zZWwpOworICBwcmludGsoInBzYV9jb21wX251bWJlcjogJWQsICIsIHAtPnBzYV9jb21wX251bWJlcik7CisgIHByaW50aygicHNhX3Rocl9wcmVfc2V0OiAweCUwMnhcbiIsIHAtPnBzYV90aHJfcHJlX3NldCk7CisgIHByaW50ayhLRVJOX0RFQlVHICJwc2FfZmVhdHVyZV9zZWxlY3QvZGVjYXlfcHJtOiAweCUwMngsICIsCisJIHAtPnBzYV9mZWF0dXJlX3NlbGVjdCk7CisgIHByaW50aygicHNhX3N1YmJhbmQvZGVjYXlfdXBkYXRlX3BybTogJWRcbiIsIHAtPnBzYV9zdWJiYW5kKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV9xdWFsaXR5X3RocjogMHglMDJ4LCAiLCBwLT5wc2FfcXVhbGl0eV90aHIpOworICBwcmludGsoInBzYV9tb2RfZGVsYXk6IDB4JTAyeFxuIiwgcC0+cHNhX21vZF9kZWxheSk7CisgIHByaW50ayhLRVJOX0RFQlVHICJwc2FfbndpZDogMHglMDJ4JTAyeCwgIiwgcC0+cHNhX253aWRbMF0sIHAtPnBzYV9ud2lkWzFdKTsKKyAgcHJpbnRrKCJwc2FfbndpZF9zZWxlY3Q6ICVkXG4iLCBwLT5wc2FfbndpZF9zZWxlY3QpOworICBwcmludGsoS0VSTl9ERUJVRyAicHNhX2VuY3J5cHRpb25fc2VsZWN0OiAlZCwgIiwgcC0+cHNhX2VuY3J5cHRpb25fc2VsZWN0KTsKKyAgcHJpbnRrKCJwc2FfZW5jcnlwdGlvbl9rZXlbXTogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSBwLT5wc2FfZW5jcnlwdGlvbl9rZXlbMF0sCisJIHAtPnBzYV9lbmNyeXB0aW9uX2tleVsxXSwKKwkgcC0+cHNhX2VuY3J5cHRpb25fa2V5WzJdLAorCSBwLT5wc2FfZW5jcnlwdGlvbl9rZXlbM10sCisJIHAtPnBzYV9lbmNyeXB0aW9uX2tleVs0XSwKKwkgcC0+cHNhX2VuY3J5cHRpb25fa2V5WzVdLAorCSBwLT5wc2FfZW5jcnlwdGlvbl9rZXlbNl0sCisJIHAtPnBzYV9lbmNyeXB0aW9uX2tleVs3XSk7CisgIHByaW50ayhLRVJOX0RFQlVHICJwc2FfZGF0YWJ1c193aWR0aDogJWRcbiIsIHAtPnBzYV9kYXRhYnVzX3dpZHRoKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV9jYWxsX2NvZGUvYXV0b19zcXVlbGNoOiAweCUwMngsICIsCisJIHAtPnBzYV9jYWxsX2NvZGVbMF0pOworICBwcmludGsoInBzYV9jYWxsX2NvZGVbXTogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCSBwLT5wc2FfY2FsbF9jb2RlWzBdLAorCSBwLT5wc2FfY2FsbF9jb2RlWzFdLAorCSBwLT5wc2FfY2FsbF9jb2RlWzJdLAorCSBwLT5wc2FfY2FsbF9jb2RlWzNdLAorCSBwLT5wc2FfY2FsbF9jb2RlWzRdLAorCSBwLT5wc2FfY2FsbF9jb2RlWzVdLAorCSBwLT5wc2FfY2FsbF9jb2RlWzZdLAorCSBwLT5wc2FfY2FsbF9jb2RlWzddKTsKKyNpZmRlZiBERUJVR19TSE9XX1VOVVNFRAorICBwcmludGsoS0VSTl9ERUJVRyAicHNhX3Jlc2VydmVkW106ICUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJIHAtPnBzYV9yZXNlcnZlZFswXSwKKwkgcC0+cHNhX3Jlc2VydmVkWzFdLAorCSBwLT5wc2FfcmVzZXJ2ZWRbMl0sCisJIHAtPnBzYV9yZXNlcnZlZFszXSk7CisjZW5kaWYJLyogREVCVUdfU0hPV19VTlVTRUQgKi8KKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV9jb25mX3N0YXR1czogJWQsICIsIHAtPnBzYV9jb25mX3N0YXR1cyk7CisgIHByaW50aygicHNhX2NyYzogMHglMDJ4JTAyeCwgIiwgcC0+cHNhX2NyY1swXSwgcC0+cHNhX2NyY1sxXSk7CisgIHByaW50aygicHNhX2NyY19zdGF0dXM6IDB4JTAyeFxuIiwgcC0+cHNhX2NyY19zdGF0dXMpOworfSAvKiB3dl9wc2Ffc2hvdyAqLworI2VuZGlmCS8qIERFQlVHX1BTQV9TSE9XICovCisKKyNpZmRlZiBERUJVR19NTUNfU0hPVworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHRoZSBmb3JtYXR0ZWQgc3RhdHVzIG9mIHRoZSBNb2RlbSBNYW5hZ2VtZW50IENvbnRyb2xsZXIuCisgKiBUaGlzIGZ1bmN0aW9uIG5lZWQgdG8gYmUgY29tcGxldGVkLi4uCisgKi8KK3N0YXRpYyB2b2lkCit3dl9tbWNfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAga2lvX2FkZHJfdAliYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgIG5ldF9sb2NhbCAqCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgbW1yX3QJCW07CisKKyAgLyogQmFzaWMgY2hlY2sgKi8KKyAgaWYoaGFzcl9yZWFkKGJhc2UpICYgSEFTUl9OT19DTEspCisgICAgeworICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHd2X21tY19zaG93OiBtb2RlbSBub3QgY29ubmVjdGVkXG4iLAorCSAgICAgZGV2LT5uYW1lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisgIC8qIFJlYWQgdGhlIG1tYyAqLworICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZnJlZXplKSwgMSk7CisgIG1tY19yZWFkKGJhc2UsIDAsICh1X2NoYXIgKikmbSwgc2l6ZW9mKG0pKTsKKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZyZWV6ZSksIDApOworCisjaWZkZWYgV0lSRUxFU1NfRVhUCS8qIElmIHdpcmVsZXNzIGV4dGVuc2lvbiBleGlzdCBpbiB0aGUga2VybmVsICovCisgIC8qIERvbid0IGZvcmdldCB0byB1cGRhdGUgc3RhdGlzdGljcyAqLworICBscC0+d3N0YXRzLmRpc2NhcmQubndpZCArPSAobS5tbXJfd3JvbmdfbndpZF9oIDw8IDgpIHwgbS5tbXJfd3JvbmdfbndpZF9sOworI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCAqLworCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisgIHByaW50ayhLRVJOX0RFQlVHICIjIyMjIyB3YXZlbGFuIG1vZGVtIHN0YXR1cyByZWdpc3RlcnM6ICMjIyMjXG4iKTsKKyNpZmRlZiBERUJVR19TSE9XX1VOVVNFRAorICBwcmludGsoS0VSTl9ERUJVRyAibW1jX3VudXNlZDBbXTogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCSBtLm1tcl91bnVzZWQwWzBdLAorCSBtLm1tcl91bnVzZWQwWzFdLAorCSBtLm1tcl91bnVzZWQwWzJdLAorCSBtLm1tcl91bnVzZWQwWzNdLAorCSBtLm1tcl91bnVzZWQwWzRdLAorCSBtLm1tcl91bnVzZWQwWzVdLAorCSBtLm1tcl91bnVzZWQwWzZdLAorCSBtLm1tcl91bnVzZWQwWzddKTsKKyNlbmRpZgkvKiBERUJVR19TSE9XX1VOVVNFRCAqLworICBwcmludGsoS0VSTl9ERUJVRyAiRW5jcnlwdGlvbiBhbGdvcnl0aG06ICUwMlggLSBTdGF0dXM6ICUwMlhcbiIsCisJIG0ubW1yX2Rlc19hdmFpbCwgbS5tbXJfZGVzX3N0YXR1cyk7CisjaWZkZWYgREVCVUdfU0hPV19VTlVTRUQKKyAgcHJpbnRrKEtFUk5fREVCVUcgIm1tY191bnVzZWQxW106ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkgbS5tbXJfdW51c2VkMVswXSwKKwkgbS5tbXJfdW51c2VkMVsxXSwKKwkgbS5tbXJfdW51c2VkMVsyXSwKKwkgbS5tbXJfdW51c2VkMVszXSwKKwkgbS5tbXJfdW51c2VkMVs0XSk7CisjZW5kaWYJLyogREVCVUdfU0hPV19VTlVTRUQgKi8KKyAgcHJpbnRrKEtFUk5fREVCVUcgImRjZV9zdGF0dXM6IDB4JXggWyVzJXMlcyVzXVxuIiwKKwkgbS5tbXJfZGNlX3N0YXR1cywKKwkgKG0ubW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVU19SWF9CVVNZKSA/ICJlbmVyZ3kgZGV0ZWN0ZWQsIjoiIiwKKwkgKG0ubW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVU19MT09QVF9JTkQpID8KKwkgImxvb3AgdGVzdCBpbmRpY2F0ZWQsIiA6ICIiLAorCSAobS5tbXJfZGNlX3N0YXR1cyAmIE1NUl9EQ0VfU1RBVFVTX1RYX0JVU1kpID8gInRyYW5zbWl0dGVyIG9uLCIgOiAiIiwKKwkgKG0ubW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVU19KQlJfRVhQSVJFRCkgPworCSAiamFiYmVyIHRpbWVyIGV4cGlyZWQsIiA6ICIiKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgIkRzcCBJRDogJTAyWFxuIiwKKwkgbS5tbXJfZHNwX2lkKTsKKyNpZmRlZiBERUJVR19TSE9XX1VOVVNFRAorICBwcmludGsoS0VSTl9ERUJVRyAibW1jX3VudXNlZDJbXTogJTAyWDolMDJYXG4iLAorCSBtLm1tcl91bnVzZWQyWzBdLAorCSBtLm1tcl91bnVzZWQyWzFdKTsKKyNlbmRpZgkvKiBERUJVR19TSE9XX1VOVVNFRCAqLworICBwcmludGsoS0VSTl9ERUJVRyAiIyBjb3JyZWN0X253aWQ6ICVkLCAjIHdyb25nX253aWQ6ICVkXG4iLAorCSAobS5tbXJfY29ycmVjdF9ud2lkX2ggPDwgOCkgfCBtLm1tcl9jb3JyZWN0X253aWRfbCwKKwkgKG0ubW1yX3dyb25nX253aWRfaCA8PCA4KSB8IG0ubW1yX3dyb25nX253aWRfbCk7CisgIHByaW50ayhLRVJOX0RFQlVHICJ0aHJfcHJlX3NldDogMHgleCBbY3VycmVudCBzaWduYWwgJXNdXG4iLAorCSBtLm1tcl90aHJfcHJlX3NldCAmIE1NUl9USFJfUFJFX1NFVCwKKwkgKG0ubW1yX3Rocl9wcmVfc2V0ICYgTU1SX1RIUl9QUkVfU0VUX0NVUikgPyAiYWJvdmUiIDogImJlbG93Iik7CisgIHByaW50ayhLRVJOX0RFQlVHICJzaWduYWxfbHZsOiAlZCBbJXNdLCAiLAorCSBtLm1tcl9zaWduYWxfbHZsICYgTU1SX1NJR05BTF9MVkwsCisJIChtLm1tcl9zaWduYWxfbHZsICYgTU1SX1NJR05BTF9MVkxfVkFMSUQpID8gIm5ldyBtc2ciIDogIm5vIG5ldyBtc2ciKTsKKyAgcHJpbnRrKCJzaWxlbmNlX2x2bDogJWQgWyVzXSwgIiwgbS5tbXJfc2lsZW5jZV9sdmwgJiBNTVJfU0lMRU5DRV9MVkwsCisJIChtLm1tcl9zaWxlbmNlX2x2bCAmIE1NUl9TSUxFTkNFX0xWTF9WQUxJRCkgPyAidXBkYXRlIGRvbmUiIDogIm5vIG5ldyB1cGRhdGUiKTsKKyAgcHJpbnRrKCJzZ25sX3F1YWw6IDB4JXggWyVzXVxuIiwgbS5tbXJfc2dubF9xdWFsICYgTU1SX1NHTkxfUVVBTCwKKwkgKG0ubW1yX3NnbmxfcXVhbCAmIE1NUl9TR05MX1FVQUxfQU5UKSA/ICJBbnRlbm5hIDEiIDogIkFudGVubmEgMCIpOworI2lmZGVmIERFQlVHX1NIT1dfVU5VU0VECisgIHByaW50ayhLRVJOX0RFQlVHICJuZXR3X2lkX2w6ICV4XG4iLCBtLm1tcl9uZXR3X2lkX2wpOworI2VuZGlmCS8qIERFQlVHX1NIT1dfVU5VU0VEICovCit9IC8qIHd2X21tY19zaG93ICovCisjZW5kaWYJLyogREVCVUdfTU1DX1NIT1cgKi8KKworI2lmZGVmIERFQlVHX0k4MjU5M19TSE9XCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJpbnQgdGhlIGZvcm1hdHRlZCBzdGF0dXMgb2YgdGhlIGk4MjU5MydzIHJlY2VpdmUgdW5pdC4KKyAqLworc3RhdGljIHZvaWQKK3d2X3J1X3Nob3coc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisgIG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgIHByaW50ayhLRVJOX0RFQlVHICIjIyMjIyB3YXZlbGFuIGk4MjU5MyByZWNlaXZlciBzdGF0dXM6ICMjIyMjXG4iKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInJ1OiByZnAgJWQgc3RvcCAlZCIsIGxwLT5yZnAsIGxwLT5zdG9wKTsKKyAgLyoKKyAgICogTm90IGltcGxlbWVudGVkIHlldC4uLgorICAgKi8KKyAgcHJpbnRrKCJcbiIpOworfSAvKiB3dl9ydV9zaG93ICovCisjZW5kaWYJLyogREVCVUdfSTgyNTkzX1NIT1cgKi8KKworI2lmZGVmIERFQlVHX0RFVklDRV9TSE9XCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJpbnQgdGhlIGZvcm1hdHRlZCBzdGF0dXMgb2YgdGhlIFdhdmVMQU4gUENNQ0lBIGRldmljZSBkcml2ZXIuCisgKi8KK3N0YXRpYyB2b2lkCit3dl9kZXZfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAgcHJpbnRrKEtFUk5fREVCVUcgImRldjoiKTsKKyAgcHJpbnRrKCIgc3RhdGU9JWxYLCIsIGRldi0+c3RhdGUpOworICBwcmludGsoIiB0cmFuc19zdGFydD0lbGQsIiwgZGV2LT50cmFuc19zdGFydCk7CisgIHByaW50aygiIGZsYWdzPTB4JXgsIiwgZGV2LT5mbGFncyk7CisgIHByaW50aygiXG4iKTsKK30gLyogd3ZfZGV2X3Nob3cgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHRoZSBmb3JtYXR0ZWQgc3RhdHVzIG9mIHRoZSBXYXZlTEFOIFBDTUNJQSBkZXZpY2UgZHJpdmVyJ3MKKyAqIHByaXZhdGUgaW5mb3JtYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCit3dl9sb2NhbF9zaG93KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICBwcmludGsoS0VSTl9ERUJVRyAibG9jYWw6Iik7CisgIC8qCisgICAqIE5vdCBpbXBsZW1lbnRlZCB5ZXQuLi4KKyAgICovCisgIHByaW50aygiXG4iKTsKK30gLyogd3ZfbG9jYWxfc2hvdyAqLworI2VuZGlmCS8qIERFQlVHX0RFVklDRV9TSE9XICovCisKKyNpZiBkZWZpbmVkKERFQlVHX1JYX0lORk8pIHx8IGRlZmluZWQoREVCVUdfVFhfSU5GTykKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBEdW1wIHBhY2tldCBoZWFkZXIgKGFuZCBjb250ZW50IGlmIG5lY2Vzc2FyeSkgb24gdGhlIHNjcmVlbgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3d2X3BhY2tldF9pbmZvKHVfY2hhciAqCQlwLAkJLyogUGFja2V0IHRvIGR1bXAgKi8KKwkgICAgICAgaW50CQlsZW5ndGgsCQkvKiBMZW5ndGggb2YgdGhlIHBhY2tldCAqLworCSAgICAgICBjaGFyICoJCW1zZzEsCQkvKiBOYW1lIG9mIHRoZSBkZXZpY2UgKi8KKwkgICAgICAgY2hhciAqCQltc2cyKQkJLyogTmFtZSBvZiB0aGUgZnVuY3Rpb24gKi8KK3sKKyAgaW50CQlpOworICBpbnQJCW1heGk7CisKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcygpOiBkZXN0ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYLCBsZW5ndGggJWRcbiIsCisJIG1zZzEsIG1zZzIsIHBbMF0sIHBbMV0sIHBbMl0sIHBbM10sIHBbNF0sIHBbNV0sIGxlbmd0aCk7CisgIHByaW50ayhLRVJOX0RFQlVHICIlczogJXMoKTogc3JjICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYLCB0eXBlIDB4JTAyWCUwMlhcbiIsCisJIG1zZzEsIG1zZzIsIHBbNl0sIHBbN10sIHBbOF0sIHBbOV0sIHBbMTBdLCBwWzExXSwgcFsxMl0sIHBbMTNdKTsKKworI2lmZGVmIERFQlVHX1BBQ0tFVF9EVU1QCisKKyAgcHJpbnRrKEtFUk5fREVCVUcgImRhdGE9XCIiKTsKKworICBpZigobWF4aSA9IGxlbmd0aCkgPiBERUJVR19QQUNLRVRfRFVNUCkKKyAgICBtYXhpID0gREVCVUdfUEFDS0VUX0RVTVA7CisgIGZvcihpID0gMTQ7IGkgPCBtYXhpOyBpKyspCisgICAgaWYocFtpXSA+PSAnICcgJiYgcFtpXSA8PSAnficpCisgICAgICBwcmludGsoIiAlYyIsIHBbaV0pOworICAgIGVsc2UKKyAgICAgIHByaW50aygiJTAyWCIsIHBbaV0pOworICBpZihtYXhpIDwgbGVuZ3RoKQorICAgIHByaW50aygiLi4iKTsKKyAgcHJpbnRrKCJcIlxuIik7CisgIHByaW50ayhLRVJOX0RFQlVHICJcbiIpOworI2VuZGlmCS8qIERFQlVHX1BBQ0tFVF9EVU1QICovCit9CisjZW5kaWYJLyogZGVmaW5lZChERUJVR19SWF9JTkZPKSB8fCBkZWZpbmVkKERFQlVHX1RYX0lORk8pICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIGlzIHRoZSBpbmZvcm1hdGlvbiB3aGljaCBpcyBkaXNwbGF5ZWQgYnkgdGhlIGRyaXZlciBhdCBzdGFydHVwCisgKiBUaGVyZSAgaXMgYSBsb3Qgb2YgZmxhZyB0byBjb25maWd1cmUgaXQgYXQgeW91ciB3aWxsLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAord3ZfaW5pdF9pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgcHNhX3QJCXBzYTsKKyAgaW50CQlpOworCisgIC8qIFJlYWQgdGhlIHBhcmFtZXRlciBzdG9yYWdlIGFyZWEgKi8KKyAgcHNhX3JlYWQoZGV2LCAwLCAodW5zaWduZWQgY2hhciAqKSAmcHNhLCBzaXplb2YocHNhKSk7CisKKyNpZmRlZiBERUJVR19QU0FfU0hPVworICB3dl9wc2Ffc2hvdygmcHNhKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHX01NQ19TSE9XCisgIHd2X21tY19zaG93KGRldik7CisjZW5kaWYKKyNpZmRlZiBERUJVR19JODI1OTNfU0hPVworICB3dl9ydV9zaG93KGRldik7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0JBU0lDX1NIT1cKKyAgLyogTm93LCBsZXQncyBnbyBmb3IgdGhlIGJhc2ljIHN0dWZmICovCisgIHByaW50ayhLRVJOX05PVElDRSAiJXM6IFdhdmVMQU46IHBvcnQgJSNseCwgaXJxICVkLCBod19hZGRyIiwKKwkgZGV2LT5uYW1lLCBiYXNlLCBkZXYtPmlycSk7CisgIGZvcihpID0gMDsgaSA8IFdBVkVMQU5fQUREUl9TSVpFOyBpKyspCisgICAgcHJpbnRrKCIlcyUwMlgiLCAoaSA9PSAwKSA/ICIgIiA6ICI6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisKKyAgLyogUHJpbnQgY3VycmVudCBuZXR3b3JrIGlkICovCisgIGlmKHBzYS5wc2FfbndpZF9zZWxlY3QpCisgICAgcHJpbnRrKCIsIG53aWQgMHglMDJYLSUwMlgiLCBwc2EucHNhX253aWRbMF0sIHBzYS5wc2FfbndpZFsxXSk7CisgIGVsc2UKKyAgICBwcmludGsoIiwgbndpZCBvZmYiKTsKKworICAvKiBJZiAyLjAwIGNhcmQgKi8KKyAgaWYoIShtbWNfaW4oYmFzZSwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorICAgICAgIChNTVJfRkVFX1NUQVRVU19EV0xEIHwgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIHNob3J0CWZyZXE7CisKKyAgICAgIC8qIEFzayB0aGUgRUVwcm9tIHRvIHJlYWQgdGhlIGZyZXF1ZW5jeSBmcm9tIHRoZSBmaXJzdCBhcmVhICovCisgICAgICBmZWVfcmVhZChiYXNlLCAweDAwIC8qIDFzdCBhcmVhIC0gZnJlcXVlbmN5Li4uICovLAorCSAgICAgICAmZnJlcSwgMSk7CisKKyAgICAgIC8qIFByaW50IGZyZXF1ZW5jeSAqLworICAgICAgcHJpbnRrKCIsIDIuMDAsICVsZCIsIChmcmVxID4+IDYpICsgMjQwMEwpOworCisgICAgICAvKiBIYWNrICEhISAqLworICAgICAgaWYoZnJlcSAmIDB4MjApCisJcHJpbnRrKCIuNSIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50aygiLCBQQ01DSUEsICIpOworICAgICAgc3dpdGNoIChwc2EucHNhX3N1YmJhbmQpCisJeworCWNhc2UgUFNBX1NVQkJBTkRfOTE1OgorCSAgcHJpbnRrKCI5MTUiKTsKKwkgIGJyZWFrOworCWNhc2UgUFNBX1NVQkJBTkRfMjQyNToKKwkgIHByaW50aygiMjQyNSIpOworCSAgYnJlYWs7CisJY2FzZSBQU0FfU1VCQkFORF8yNDYwOgorCSAgcHJpbnRrKCIyNDYwIik7CisJICBicmVhazsKKwljYXNlIFBTQV9TVUJCQU5EXzI0ODQ6CisJICBwcmludGsoIjI0ODQiKTsKKwkgIGJyZWFrOworCWNhc2UgUFNBX1NVQkJBTkRfMjQzMF81OgorCSAgcHJpbnRrKCIyNDMwLjUiKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBwcmludGsoInVua25vd24iKTsKKwl9CisgICAgfQorCisgIHByaW50aygiIE1IelxuIik7CisjZW5kaWYJLyogREVCVUdfQkFTSUNfU0hPVyAqLworCisjaWZkZWYgREVCVUdfVkVSU0lPTl9TSE9XCisgIC8qIFByaW50IHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgcHJpbnRrKEtFUk5fTk9USUNFICIlcyIsIHZlcnNpb24pOworI2VuZGlmCit9IC8qIHd2X2luaXRfaW5mbyAqLworCisvKioqKioqKioqKioqKioqKioqKioqIElPQ1RMLCBTVEFUUyAmIFJFQ09ORklHICoqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBXZSBmb3VuZCBoZXJlIHJvdXRpbmVzIHRoYXQgYXJlIGNhbGxlZCBieSBMaW51eCBvbiBkaWZmZXJlbnRzCisgKiBvY2Nhc2lvbnMgYWZ0ZXIgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIG5vdCBmb3IgdHJhbnNtaXR0aW5nIGRhdGEKKyAqIFRoZXNlIG1heSBiZSBjYWxsZWQgd2hlbiB0aGUgdXNlciB1c2UgaWZjb25maWcsIC9wcm9jL25ldC9kZXYKKyAqIG9yIHdpcmVsZXNzIGV4dGVuc2lvbnMKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2V0IHRoZSBjdXJyZW50IGV0aGVybmV0IHN0YXRpc3RpY3MuIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZQorICogY2FyZCBvcGVuIG9yIGNsb3NlZC4KKyAqIFVzZWQgd2hlbiB0aGUgdXNlciByZWFkIC9wcm9jL25ldC9kZXYKKyAqLworc3RhdGljIGVuX3N0YXRzCSoKK3dhdmVsYW5fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworI2lmZGVmIERFQlVHX0lPQ1RMX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogPD53YXZlbGFuX2dldF9zdGF0cygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKyAgcmV0dXJuKCYoKG5ldF9sb2NhbCAqKW5ldGRldl9wcml2KGRldikpLT5zdGF0cyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAqIG51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisgKiBudW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKKyAqIG51bV9hZGRycyA+IDAJTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLAorICoJCQlhbmQgZG8gYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgorICovCisKK3N0YXRpYyB2b2lkCit3YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAgbmV0X2xvY2FsICoJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisjaWZkZWYgREVCVUdfSU9DVExfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5fc2V0X211bHRpY2FzdF9saXN0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0lPQ1RMX0lORk8KKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdCgpOiBzZXR0aW5nIFJ4IG1vZGUgJTAyWCB0byAlZCBhZGRyZXNzZXMuXG4iLAorCSBkZXYtPm5hbWUsIGRldi0+ZmxhZ3MsIGRldi0+bWNfY291bnQpOworI2VuZGlmCisKKyAgaWYoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBFbmFibGUgcHJvbWlzY3VvdXMgbW9kZTogcmVjZWl2ZSBhbGwgcGFja2V0cy4KKyAgICAgICAqLworICAgICAgaWYoIWxwLT5wcm9taXNjdW91cykKKwl7CisJICBscC0+cHJvbWlzY3VvdXMgPSAxOworCSAgbHAtPmFsbG11bHRpY2FzdCA9IDA7CisJICBscC0+bWNfY291bnQgPSAwOworCisJICB3dl84MjU5M19yZWNvbmZpZyhkZXYpOworCisJICAvKiBUZWxsIHRoZSBrZXJuZWwgdGhhdCB3ZSBhcmUgZG9pbmcgYSByZWFsbHkgYmFkIGpvYi4uLiAqLworCSAgZGV2LT5mbGFncyB8PSBJRkZfUFJPTUlTQzsKKwl9CisgICAgfQorICBlbHNlCisgICAgLyogSWYgYWxsIG11bHRpY2FzdCBhZGRyZXNzZXMKKyAgICAgKiBvciB0b28gbXVjaCBtdWx0aWNhc3QgYWRkcmVzc2VzIGZvciB0aGUgaGFyZHdhcmUgZmlsdGVyICovCisgICAgaWYoKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHx8CisgICAgICAgKGRldi0+bWNfY291bnQgPiBJODI1OTNfTUFYX01VTFRJQ0FTVF9BRERSRVNTRVMpKQorICAgICAgeworCS8qCisJICogRGlzYWJsZSBwcm9taXNjdW91cyBtb2RlLCBidXQgYWN0aXZlIHRoZSBhbGwgbXVsdGljYXN0IG1vZGUKKwkgKi8KKwlpZighbHAtPmFsbG11bHRpY2FzdCkKKwkgIHsKKwkgICAgbHAtPnByb21pc2N1b3VzID0gMDsKKwkgICAgbHAtPmFsbG11bHRpY2FzdCA9IDE7CisJICAgIGxwLT5tY19jb3VudCA9IDA7CisKKwkgICAgd3ZfODI1OTNfcmVjb25maWcoZGV2KTsKKworCSAgICAvKiBUZWxsIHRoZSBrZXJuZWwgdGhhdCB3ZSBhcmUgZG9pbmcgYSByZWFsbHkgYmFkIGpvYi4uLiAqLworCSAgICBkZXYtPmZsYWdzIHw9IElGRl9BTExNVUxUSTsKKwkgIH0KKyAgICAgIH0KKyAgICBlbHNlCisgICAgICAvKiBJZiB0aGVyZSBpcyBzb21lIG11bHRpY2FzdCBhZGRyZXNzZXMgdG8gc2VuZCAqLworICAgICAgaWYoZGV2LT5tY19saXN0ICE9IChzdHJ1Y3QgZGV2X21jX2xpc3QgKikgTlVMTCkKKwl7CisJICAvKgorCSAgICogRGlzYWJsZSBwcm9taXNjdW91cyBtb2RlLCBidXQgcmVjZWl2ZSBhbGwgcGFja2V0cworCSAgICogaW4gbXVsdGljYXN0IGxpc3QKKwkgICAqLworI2lmZGVmIE1VTFRJQ0FTVF9BVk9JRAorCSAgaWYobHAtPnByb21pc2N1b3VzIHx8IGxwLT5hbGxtdWx0aWNhc3QgfHwKKwkgICAgIChkZXYtPm1jX2NvdW50ICE9IGxwLT5tY19jb3VudCkpCisjZW5kaWYKKwkgICAgeworCSAgICAgIGxwLT5wcm9taXNjdW91cyA9IDA7CisJICAgICAgbHAtPmFsbG11bHRpY2FzdCA9IDA7CisJICAgICAgbHAtPm1jX2NvdW50ID0gZGV2LT5tY19jb3VudDsKKworCSAgICAgIHd2XzgyNTkzX3JlY29uZmlnKGRldik7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgLyoKKwkgICAqIFN3aXRjaCB0byBub3JtYWwgbW9kZTogZGlzYWJsZSBwcm9taXNjdW91cyBtb2RlIGFuZCAKKwkgICAqIGNsZWFyIHRoZSBtdWx0aWNhc3QgbGlzdC4KKwkgICAqLworCSAgaWYobHAtPnByb21pc2N1b3VzIHx8IGxwLT5tY19jb3VudCA9PSAwKQorCSAgICB7CisJICAgICAgbHAtPnByb21pc2N1b3VzID0gMDsKKwkgICAgICBscC0+YWxsbXVsdGljYXN0ID0gMDsKKwkgICAgICBscC0+bWNfY291bnQgPSAwOworCisJICAgICAgd3ZfODI1OTNfcmVjb25maWcoZGV2KTsKKwkgICAgfQorCX0KKyNpZmRlZiBERUJVR19JT0NUTF9UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd2F2ZWxhbl9zZXRfbXVsdGljYXN0X2xpc3QoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGV4aXN0Li4uCisgKiAoTm90ZSA6IGl0IHdhcyBhIG5pY2Ugd2F5IHRvIHRlc3QgdGhlIHJlY29uZmlndXJlIHN0dWZmLi4uKQorICovCisjaWZkZWYgU0VUX01BQ19BRERSRVNTCitzdGF0aWMgaW50Cit3YXZlbGFuX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkJCXZvaWQgKgkJYWRkcikKK3sKKyAgc3RydWN0IHNvY2thZGRyICoJbWFjID0gYWRkcjsKKworICAvKiBDb3B5IHRoZSBhZGRyZXNzICovCisgIG1lbWNweShkZXYtPmRldl9hZGRyLCBtYWMtPnNhX2RhdGEsIFdBVkVMQU5fQUREUl9TSVpFKTsKKworICAvKiBSZWNvbmZpZyB0aGUgYmVhc3QgKi8KKyAgd3ZfODI1OTNfcmVjb25maWcoZGV2KTsKKworICByZXR1cm4gMDsKK30KKyNlbmRpZgkvKiBTRVRfTUFDX0FERFJFU1MgKi8KKworI2lmZGVmIFdJUkVMRVNTX0VYVAkvKiBJZiB3aXJlbGVzcyBleHRlbnNpb24gZXhpc3QgaW4gdGhlIGtlcm5lbCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnJlcXVlbmN5IHNldHRpbmcgKGZvciBoYXJkd2FyZSBhYmxlIG9mIGl0KQorICogSXQncyBhIGJpdCBjb21wbGljYXRlZCBhbmQgeW91IGRvbid0IHJlYWxseSB3YW50IHRvIGxvb2sgaW50byBpdC4uLgorICovCitzdGF0aWMgaW5saW5lIGludAord3Zfc2V0X2ZyZXF1ZW5jeSh1X2xvbmcJCWJhc2UsCS8qIGkvbyBwb3J0IG9mIHRoZSBjYXJkICovCisJCSBpd19mcmVxICoJZnJlcXVlbmN5KQoreworICBjb25zdCBpbnQJQkFORF9OVU0gPSAxMDsJLyogTnVtYmVyIG9mIGJhbmRzICovCisgIGxvbmcJCWZyZXEgPSAwTDsJLyogb2Zmc2V0IHRvIDIuNCBHSHogaW4gLjUgTUh6ICovCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworICBpbnQJCWk7CisjZW5kaWYKKworICAvKiBTZXR0aW5nIGJ5IGZyZXF1ZW5jeSAqLworICAvKiBUaGVvcml0aWNhbGx5LCB5b3UgbWF5IHNldCBhbnkgZnJlcXVlbmN5IGJldHdlZW4KKyAgICogdGhlIHR3byBsaW1pdHMgd2l0aCBhIDAuNSBNSHogcHJlY2lzaW9uLiBJbiBwcmFjdGljZSwKKyAgICogSSBkb24ndCB3YW50IHlvdSB0byBoYXZlIHRyb3VibGUgd2l0aCBsb2NhbAorICAgKiByZWd1bGF0aW9ucy4uLiAqLworICBpZigoZnJlcXVlbmN5LT5lID09IDEpICYmCisgICAgIChmcmVxdWVuY3ktPm0gPj0gKGludCkgMi40MTJlOCkgJiYgKGZyZXF1ZW5jeS0+bSA8PSAoaW50KSAyLjQ4N2U4KSkKKyAgICB7CisgICAgICBmcmVxID0gKChmcmVxdWVuY3ktPm0gLyAxMDAwMCkgLSAyNDAwMEwpIC8gNTsKKyAgICB9CisKKyAgLyogU2V0dGluZyBieSBjaGFubmVsIChzYW1lIGFzIHdmcmVxc2VsKSAqLworICAvKiBXYXJuaW5nIDogZWFjaCBjaGFubmVsIGlzIDIyTUh6IHdpZGUsIHNvIHNvbWUgb2YgdGhlIGNoYW5uZWxzCisgICAqIHdpbGwgaW50ZXJmZXJlLi4uICovCisgIGlmKChmcmVxdWVuY3ktPmUgPT0gMCkgJiYKKyAgICAgKGZyZXF1ZW5jeS0+bSA+PSAwKSAmJiAoZnJlcXVlbmN5LT5tIDwgQkFORF9OVU0pKQorICAgIHsKKyAgICAgIC8qIEdldCBmcmVxdWVuY3kgb2Zmc2V0LiAqLworICAgICAgZnJlcSA9IGNoYW5uZWxfYmFuZHNbZnJlcXVlbmN5LT5tXSA+PiAxOworICAgIH0KKworICAvKiBWZXJpZnkgaWYgdGhlIGZyZXF1ZW5jeSBpcyBhbGxvd2VkICovCisgIGlmKGZyZXEgIT0gMEwpCisgICAgeworICAgICAgdV9zaG9ydAl0YWJsZVsxMF07CS8qIEF1dGhvcml6ZWQgZnJlcXVlbmN5IHRhYmxlICovCisKKyAgICAgIC8qIFJlYWQgdGhlIGZyZXF1ZW5jeSB0YWJsZSAqLworICAgICAgZmVlX3JlYWQoYmFzZSwgMHg3MSAvKiBmcmVxdWVuY3kgdGFibGUgKi8sCisJICAgICAgIHRhYmxlLCAxMCk7CisKKyNpZmRlZiBERUJVR19JT0NUTF9JTkZPCisgICAgICBwcmludGsoS0VSTl9ERUJVRyAiRnJlcXVlbmN5IHRhYmxlIDoiKTsKKyAgICAgIGZvcihpID0gMDsgaSA8IDEwOyBpKyspCisJeworCSAgcHJpbnRrKCIgJTA0WCIsCisJCSB0YWJsZVtpXSk7CisJfQorICAgICAgcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKyAgICAgIC8qIExvb2sgaW4gdGhlIHRhYmxlIGlmIHRoZSBmcmVxdWVuY3kgaXMgYWxsb3dlZCAqLworICAgICAgaWYoISh0YWJsZVs5IC0gKChmcmVxIC0gMjQpIC8gMTYpXSAmCisJICAgKDEgPDwgKChmcmVxIC0gMjQpICUgMTYpKSkpCisJcmV0dXJuIC1FSU5WQUw7CQkvKiBub3QgYWxsb3dlZCAqLworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAtRUlOVkFMOworCisgIC8qIElmIHdlIGdldCBhIHVzYWJsZSBmcmVxdWVuY3kgKi8KKyAgaWYoZnJlcSAhPSAwTCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBzaG9ydAlhcmVhWzE2XTsKKyAgICAgIHVuc2lnbmVkIHNob3J0CWRhY1syXTsKKyAgICAgIHVuc2lnbmVkIHNob3J0CWFyZWFfdmVyaWZ5WzE2XTsKKyAgICAgIHVuc2lnbmVkIHNob3J0CWRhY192ZXJpZnlbMl07CisgICAgICAvKiBDb3JyZXNwb25kaW5nIGdhaW4gKGluIHRoZSBwb3dlciBhZGp1c3QgdmFsdWUgdGFibGUpCisgICAgICAgKiBzZWUgQVQmVCBXYXZlbGFuIERhdGEgTWFudWFsLCBSRUYgNDA3LTAyNDY4OS9FLCBwYWdlIDMtOAorICAgICAgICogJiBXQ0lOMDYyRC5ET0MsIHBhZ2UgNi4yLjkgKi8KKyAgICAgIHVuc2lnbmVkIHNob3J0CXBvd2VyX2xpbWl0W10gPSB7IDQwLCA4MCwgMTIwLCAxNjAsIDAgfTsKKyAgICAgIGludAkJcG93ZXJfYmFuZCA9IDA7CQkvKiBTZWxlY3RlZCBiYW5kICovCisgICAgICB1bnNpZ25lZCBzaG9ydAlwb3dlcl9hZGp1c3Q7CQkvKiBDb3JyZWN0IHZhbHVlICovCisKKyAgICAgIC8qIFNlYXJjaCBmb3IgdGhlIGdhaW4gKi8KKyAgICAgIHBvd2VyX2JhbmQgPSAwOworICAgICAgd2hpbGUoKGZyZXEgPiBwb3dlcl9saW1pdFtwb3dlcl9iYW5kXSkgJiYKKwkgICAgKHBvd2VyX2xpbWl0WysrcG93ZXJfYmFuZF0gIT0gMCkpCisJOworCisgICAgICAvKiBSZWFkIHRoZSBmaXJzdCBhcmVhICovCisgICAgICBmZWVfcmVhZChiYXNlLCAweDAwLAorCSAgICAgICBhcmVhLCAxNik7CisKKyAgICAgIC8qIFJlYWQgdGhlIERBQyAqLworICAgICAgZmVlX3JlYWQoYmFzZSwgMHg2MCwKKwkgICAgICAgZGFjLCAyKTsKKworICAgICAgLyogUmVhZCB0aGUgbmV3IHBvd2VyIGFkanVzdCB2YWx1ZSAqLworICAgICAgZmVlX3JlYWQoYmFzZSwgMHg2QiAtIChwb3dlcl9iYW5kID4+IDEpLAorCSAgICAgICAmcG93ZXJfYWRqdXN0LCAxKTsKKyAgICAgIGlmKHBvd2VyX2JhbmQgJiAweDEpCisJcG93ZXJfYWRqdXN0ID4+PSA4OworICAgICAgZWxzZQorCXBvd2VyX2FkanVzdCAmPSAweEZGOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIldhdmVsYW4gRUVwcm9tIEFyZWEgMSA6Iik7CisgICAgICBmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKQorCXsKKwkgIHByaW50aygiICUwNFgiLAorCQkgYXJlYVtpXSk7CisJfQorICAgICAgcHJpbnRrKCJcbiIpOworCisgICAgICBwcmludGsoS0VSTl9ERUJVRyAiV2F2ZWxhbiBFRXByb20gREFDIDogJTA0WCAlMDRYXG4iLAorCSAgICAgZGFjWzBdLCBkYWNbMV0pOworI2VuZGlmCisKKyAgICAgIC8qIEZyZXF1ZW5jeSBvZmZzZXQgKGZvciBpbmZvIG9ubHkuLi4pICovCisgICAgICBhcmVhWzBdID0gKChmcmVxIDw8IDUpICYgMHhGRkUwKSB8IChhcmVhWzBdICYgMHgxRik7CisKKyAgICAgIC8qIFJlY2VpdmVyIFByaW5jaXBsZSBtYWluIGRpdmlkZXIgY29lZmZpY2llbnQgKi8KKyAgICAgIGFyZWFbM10gPSAoZnJlcSA+PiAxKSArIDI0MDBMIC0gMzUyTDsKKyAgICAgIGFyZWFbMl0gPSAoKGZyZXEgJiAweDEpIDw8IDQpIHwgKGFyZWFbMl0gJiAweEZGRUYpOworCisgICAgICAvKiBUcmFuc21pdHRlciBNYWluIGRpdmlkZXIgY29lZmZpY2llbnQgKi8KKyAgICAgIGFyZWFbMTNdID0gKGZyZXEgPj4gMSkgKyAyNDAwTDsKKyAgICAgIGFyZWFbMTJdID0gKChmcmVxICYgMHgxKSA8PCA0KSB8IChhcmVhWzJdICYgMHhGRkVGKTsKKworICAgICAgLyogT3RoZXJzIHBhcnQgb2YgdGhlIGFyZWEgYXJlIGZsYWdzLCBiaXQgc3RyZWFtcyBvciB1bnVzZWQuLi4gKi8KKworICAgICAgLyogU2V0IHRoZSB2YWx1ZSBpbiB0aGUgREFDICovCisgICAgICBkYWNbMV0gPSAoKHBvd2VyX2FkanVzdCA+PiAxKSAmIDB4N0YpIHwgKGRhY1sxXSAmIDB4RkY4MCk7CisgICAgICBkYWNbMF0gPSAoKHBvd2VyX2FkanVzdCAmIDB4MSkgPDwgNCkgfCAoZGFjWzBdICYgMHhGRkVGKTsKKworICAgICAgLyogV3JpdGUgdGhlIGZpcnN0IGFyZWEgKi8KKyAgICAgIGZlZV93cml0ZShiYXNlLCAweDAwLAorCQlhcmVhLCAxNik7CisKKyAgICAgIC8qIFdyaXRlIHRoZSBEQUMgKi8KKyAgICAgIGZlZV93cml0ZShiYXNlLCAweDYwLAorCQlkYWMsIDIpOworCisgICAgICAvKiBXZSBub3cgc2hvdWxkIHZlcmlmeSBoZXJlIHRoYXQgdGhlIEVFcHJvbSB3cml0dGluZyB3YXMgb2sgKi8KKworICAgICAgLyogUmVSZWFkIHRoZSBmaXJzdCBhcmVhICovCisgICAgICBmZWVfcmVhZChiYXNlLCAweDAwLAorCSAgICAgICBhcmVhX3ZlcmlmeSwgMTYpOworCisgICAgICAvKiBSZVJlYWQgdGhlIERBQyAqLworICAgICAgZmVlX3JlYWQoYmFzZSwgMHg2MCwKKwkgICAgICAgZGFjX3ZlcmlmeSwgMik7CisKKyAgICAgIC8qIENvbXBhcmUgKi8KKyAgICAgIGlmKG1lbWNtcChhcmVhLCBhcmVhX3ZlcmlmeSwgMTYgKiAyKSB8fAorCSBtZW1jbXAoZGFjLCBkYWNfdmVyaWZ5LCAyICogMikpCisJeworI2lmZGVmIERFQlVHX0lPQ1RMX0VSUk9SCisJICBwcmludGsoS0VSTl9JTkZPICJXYXZlbGFuOiB3dl9zZXRfZnJlcXVlbmN5IDogdW5hYmxlIHRvIHdyaXRlIG5ldyBmcmVxdWVuY3kgdG8gRUVwcm9tICg/KVxuIik7CisjZW5kaWYKKwkgIHJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKyAgICAgIC8qIFdlIG11c3QgZG93bmxvYWQgdGhlIGZyZXF1ZW5jeSBwYXJhbWV0ZXJzIHRvIHRoZQorICAgICAgICogc3ludGhldGlzZXJzIChmcm9tIHRoZSBFRXByb20gLSBhcmVhIDEpCisgICAgICAgKiBOb3RlIDogYXMgdGhlIEVFcHJvbSBpcyBhdXRvIGRlY3JlbWVudGVkLCB3ZSBzZXQgdGhlIGVuZAorICAgICAgICogaWYgdGhlIGFyZWEuLi4gKi8KKyAgICAgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIDB4MEYpOworICAgICAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwKKwkgICAgICBNTVdfRkVFX0NUUkxfUkVBRCB8IE1NV19GRUVfQ1RSTF9EV0xEKTsKKworICAgICAgLyogV2FpdCB1bnRpbCB0aGUgZG93bmxvYWQgaXMgZmluaXNoZWQgKi8KKyAgICAgIGZlZV93YWl0KGJhc2UsIDEwMCwgMTAwKTsKKworICAgICAgLyogV2UgbXVzdCBub3cgZG93bmxvYWQgdGhlIHBvd2VyIGFkanVzdCB2YWx1ZSAoZ2FpbikgdG8KKyAgICAgICAqIHRoZSBzeW50aGV0aXNlcnMgKGZyb20gdGhlIEVFcHJvbSAtIGFyZWEgNyAtIERBQykgKi8KKyAgICAgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIDB4NjEpOworICAgICAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwKKwkgICAgICBNTVdfRkVFX0NUUkxfUkVBRCB8IE1NV19GRUVfQ1RSTF9EV0xEKTsKKworICAgICAgLyogV2FpdCB1bnRpbCB0aGUgZG93bmxvYWQgaXMgZmluaXNoZWQgKi8KKyAgICAgIGZlZV93YWl0KGJhc2UsIDEwMCwgMTAwKTsKKworI2lmZGVmIERFQlVHX0lPQ1RMX0lORk8KKyAgICAgIC8qIFZlcmlmaWNhdGlvbiBvZiB3aGF0IHdlIGhhdmUgZG9uZS4uLiAqLworCisgICAgICBwcmludGsoS0VSTl9ERUJVRyAiV2F2ZWxhbiBFRXByb20gQXJlYSAxIDoiKTsKKyAgICAgIGZvcihpID0gMDsgaSA8IDE2OyBpKyspCisJeworCSAgcHJpbnRrKCIgJTA0WCIsCisJCSBhcmVhX3ZlcmlmeVtpXSk7CisJfQorICAgICAgcHJpbnRrKCJcbiIpOworCisgICAgICBwcmludGsoS0VSTl9ERUJVRyAiV2F2ZWxhbiBFRXByb20gREFDIDogJTA0WCAlMDRYXG4iLAorCSAgICAgZGFjX3ZlcmlmeVswXSwgZGFjX3ZlcmlmeVsxXSk7CisjZW5kaWYKKworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIC1FSU5WQUw7CQkvKiBCYWgsIG5ldmVyIGdldCB0aGVyZS4uLiAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2l2ZSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgZnJlcXVlbmNpZXMKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3d2X2ZyZXF1ZW5jeV9saXN0KHVfbG9uZwliYXNlLAkvKiBpL28gcG9ydCBvZiB0aGUgY2FyZCAqLworCQkgIGl3X2ZyZXEgKglsaXN0LAkvKiBMaXN0IG9mIGZyZXF1ZW5jeSB0byBmaWxsICovCisJCSAgaW50CQltYXgpCS8qIE1heGltdW0gbnVtYmVyIG9mIGZyZXF1ZW5jaWVzICovCit7CisgIHVfc2hvcnQJdGFibGVbMTBdOwkvKiBBdXRob3JpemVkIGZyZXF1ZW5jeSB0YWJsZSAqLworICBsb25nCQlmcmVxID0gMEw7CS8qIG9mZnNldCB0byAyLjQgR0h6IGluIC41IE1IeiArIDEyIE1IeiAqLworICBpbnQJCWk7CQkvKiBpbmRleCBpbiB0aGUgdGFibGUgKi8KKyAgY29uc3QgaW50CUJBTkRfTlVNID0gMTA7CS8qIE51bWJlciBvZiBiYW5kcyAqLworICBpbnQJCWMgPSAwOwkJLyogQ2hhbm5lbCBudW1iZXIgKi8KKworICAvKiBSZWFkIHRoZSBmcmVxdWVuY3kgdGFibGUgKi8KKyAgZmVlX3JlYWQoYmFzZSwgMHg3MSAvKiBmcmVxdWVuY3kgdGFibGUgKi8sCisJICAgdGFibGUsIDEwKTsKKworICAvKiBMb29rIGFsbCBmcmVxdWVuY2llcyAqLworICBpID0gMDsKKyAgZm9yKGZyZXEgPSAwOyBmcmVxIDwgMTUwOyBmcmVxKyspCisgICAgLyogTG9vayBpbiB0aGUgdGFibGUgaWYgdGhlIGZyZXF1ZW5jeSBpcyBhbGxvd2VkICovCisgICAgaWYodGFibGVbOSAtIChmcmVxIC8gMTYpXSAmICgxIDw8IChmcmVxICUgMTYpKSkKKyAgICAgIHsKKwkvKiBDb21wdXRlIGFwcHJveGltYXRlIGNoYW5uZWwgbnVtYmVyICovCisJd2hpbGUoKCgoY2hhbm5lbF9iYW5kc1tjXSA+PiAxKSAtIDI0KSA8IGZyZXEpICYmCisJICAgICAgKGMgPCBCQU5EX05VTSkpCisJICBjKys7CisJbGlzdFtpXS5pID0gYzsJLyogU2V0IHRoZSBsaXN0IGluZGV4ICovCisKKwkvKiBwdXQgaW4gdGhlIGxpc3QgKi8KKwlsaXN0W2ldLm0gPSAoKChmcmVxICsgMjQpICogNSkgKyAyNDAwMEwpICogMTAwMDA7CisJbGlzdFtpKytdLmUgPSAxOworCisJLyogQ2hlY2sgbnVtYmVyICovCisJaWYoaSA+PSBtYXgpCisJICByZXR1cm4oaSk7CisgICAgICB9CisKKyAgcmV0dXJuKGkpOworfQorCisjaWZkZWYgSVdfV0lSRUxFU1NfU1BZCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2F0aGVyIHdpcmVsZXNzIHNweSBzdGF0aXN0aWNzIDogZm9yIGVhY2ggcGFja2V0LCBjb21wYXJlIHRoZSBzb3VyY2UKKyAqIGFkZHJlc3Mgd2l0aCBvdXQgbGlzdCwgYW5kIGlmIG1hdGNoLCBnZXQgdGhlIHN0YXRzLi4uCisgKiBTb3JyeSwgYnV0IHRoaXMgZnVuY3Rpb24gcmVhbGx5IG5lZWQgd2lyZWxlc3MgZXh0ZW5zaW9ucy4uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3dsX3NweV9nYXRoZXIoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCisJICAgICAgdV9jaGFyICoJbWFjLAkJLyogTUFDIGFkZHJlc3MgKi8KKwkgICAgICB1X2NoYXIgKglzdGF0cykJCS8qIFN0YXRpc3RpY3MgdG8gZ2F0aGVyICovCit7CisgIHN0cnVjdCBpd19xdWFsaXR5IHdzdGF0czsKKworICB3c3RhdHMucXVhbCA9IHN0YXRzWzJdICYgTU1SX1NHTkxfUVVBTDsKKyAgd3N0YXRzLmxldmVsID0gc3RhdHNbMF0gJiBNTVJfU0lHTkFMX0xWTDsKKyAgd3N0YXRzLm5vaXNlID0gc3RhdHNbMV0gJiBNTVJfU0lMRU5DRV9MVkw7CisgIHdzdGF0cy51cGRhdGVkID0gMHg3OworCisgIC8qIFVwZGF0ZSBzcHkgcmVjb3JkcyAqLworICB3aXJlbGVzc19zcHlfdXBkYXRlKGRldiwgbWFjLCAmd3N0YXRzKTsKK30KKyNlbmRpZgkvKiBJV19XSVJFTEVTU19TUFkgKi8KKworI2lmZGVmIEhJU1RPR1JBTQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlIGFuIGhpc3RvZ3JhbSBvbiB0aGUgc2lnbmFsIGxldmVsLgorICogQXMgdGhlIG5vaXNlIGlzIHF1aXRlIGNvbnN0YW50LCBpdCdzIGxpa2UgZG9pbmcgaXQgb24gdGhlIFNOUi4KKyAqIFdlIGhhdmUgZGVmaW5lZCBhIHNldCBvZiBpbnRlcnZhbCAobHAtPmhpc19yYW5nZSksIGFuZCBlYWNoIHRpbWUKKyAqIHRoZSBsZXZlbCBnb2VzIGluIHRoYXQgaW50ZXJ2YWwsIHdlIGluY3JlbWVudCB0aGUgY291bnQgKGxwLT5oaXNfc3VtKS4KKyAqIFdpdGggdGhpcyBoaXN0b2dyYW0geW91IG1heSBkZXRlY3QgaWYgb25lIHdhdmVsYW4gaXMgcmVhbGx5IHdlYWssCisgKiBvciB5b3UgbWF5IGFsc28gY2FsY3VsYXRlIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIGxldmVsLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAord2xfaGlzX2dhdGhlcihzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkgICAgICB1X2NoYXIgKglzdGF0cykJCS8qIFN0YXRpc3RpY3MgdG8gZ2F0aGVyICovCit7CisgIG5ldF9sb2NhbCAqCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgdV9jaGFyCWxldmVsID0gc3RhdHNbMF0gJiBNTVJfU0lHTkFMX0xWTDsKKyAgaW50CQlpOworCisgIC8qIEZpbmQgdGhlIGNvcnJlY3QgaW50ZXJ2YWwgKi8KKyAgaSA9IDA7CisgIHdoaWxlKChpIDwgKGxwLT5oaXNfbnVtYmVyIC0gMSkpICYmIChsZXZlbCA+PSBscC0+aGlzX3JhbmdlW2krK10pKQorICAgIDsKKworICAvKiBJbmNyZW1lbnQgaW50ZXJ2YWwgY291bnRlciAqLworICAobHAtPmhpc19zdW1baV0pKys7Cit9CisjZW5kaWYJLyogSElTVE9HUkFNICovCisKK3N0YXRpYyB2b2lkIHdsX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RybmNweShpbmZvLT5kcml2ZXIsICJ3YXZlbGFuX2NzIiwgc2l6ZW9mKGluZm8tPmRyaXZlciktMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgb3BzID0geworCS5nZXRfZHJ2aW5mbyA9IHdsX2dldF9kcnZpbmZvCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBwcm90b2NvbCBuYW1lCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlzdHJjcHkod3JxdS0+bmFtZSwgIldhdmVMQU4iKTsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgTldJRAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X253aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJa2lvX2FkZHJfdCBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcHNhX3QgcHNhOworCW1tX3QgbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBTZXQgTldJRCBpbiBXYXZlTEFOLiAqLworCWlmICghd3JxdS0+bndpZC5kaXNhYmxlZCkgeworCQkvKiBTZXQgTldJRCBpbiBwc2EgKi8KKwkJcHNhLnBzYV9ud2lkWzBdID0gKHdycXUtPm53aWQudmFsdWUgJiAweEZGMDApID4+IDg7CisJCXBzYS5wc2FfbndpZFsxXSA9IHdycXUtPm53aWQudmFsdWUgJiAweEZGOworCQlwc2EucHNhX253aWRfc2VsZWN0ID0gMHgwMTsKKwkJcHNhX3dyaXRlKGRldiwKKwkJCSAgKGNoYXIgKikgcHNhLnBzYV9ud2lkIC0gKGNoYXIgKikgJnBzYSwKKwkJCSAgKHVuc2lnbmVkIGNoYXIgKikgcHNhLnBzYV9ud2lkLCAzKTsKKworCQkvKiBTZXQgTldJRCBpbiBtbWMuICovCisJCW0udy5tbXdfbmV0d19pZF9sID0gcHNhLnBzYV9ud2lkWzFdOworCQltLncubW13X25ldHdfaWRfaCA9IHBzYS5wc2FfbndpZFswXTsKKwkJbW1jX3dyaXRlKGJhc2UsCisJCQkgIChjaGFyICopICZtLncubW13X25ldHdfaWRfbCAtCisJCQkgIChjaGFyICopICZtLAorCQkJICAodW5zaWduZWQgY2hhciAqKSAmbS53Lm1td19uZXR3X2lkX2wsIDIpOworCQltbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfbG9vcHRfc2VsKSwgMHgwMCk7CisJfSBlbHNlIHsKKwkJLyogRGlzYWJsZSBOV0lEIGluIHRoZSBwc2EuICovCisJCXBzYS5wc2FfbndpZF9zZWxlY3QgPSAweDAwOworCQlwc2Ffd3JpdGUoZGV2LAorCQkJICAoY2hhciAqKSAmcHNhLnBzYV9ud2lkX3NlbGVjdCAtCisJCQkgIChjaGFyICopICZwc2EsCisJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX253aWRfc2VsZWN0LAorCQkJICAxKTsKKworCQkvKiBEaXNhYmxlIE5XSUQgaW4gdGhlIG1tYyAobm8gZmlsdGVyaW5nKS4gKi8KKwkJbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2xvb3B0X3NlbCksCisJCQlNTVdfTE9PUFRfU0VMX0RJU19OV0lEKTsKKwl9CisJLyogdXBkYXRlIHRoZSBXYXZlbGFuIGNoZWNrc3VtICovCisJdXBkYXRlX3BzYV9jaGVja3N1bShkZXYpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBOV0lEIAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X253aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIFJlYWQgdGhlIE5XSUQuICovCisJcHNhX3JlYWQoZGV2LAorCQkgKGNoYXIgKikgcHNhLnBzYV9ud2lkIC0gKGNoYXIgKikgJnBzYSwKKwkJICh1bnNpZ25lZCBjaGFyICopIHBzYS5wc2FfbndpZCwgMyk7CisJd3JxdS0+bndpZC52YWx1ZSA9IChwc2EucHNhX253aWRbMF0gPDwgOCkgKyBwc2EucHNhX253aWRbMV07CisJd3JxdS0+bndpZC5kaXNhYmxlZCA9ICEocHNhLnBzYV9ud2lkX3NlbGVjdCk7CisJd3JxdS0+bndpZC5maXhlZCA9IDE7CS8qIFN1cGVyZmx1b3VzICovCisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IGZyZXF1ZW5jeQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJa2lvX2FkZHJfdCBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBBdHRlbXB0IHRvIHJlY29nbmlzZSAyLjAwIGNhcmRzICgyLjQgR0h6IGZyZXF1ZW5jeSBzZWxlY3RhYmxlKS4gKi8KKwlpZiAoIShtbWNfaW4oYmFzZSwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorCSAgICAgIChNTVJfRkVFX1NUQVRVU19EV0xEIHwgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpKQorCQlyZXQgPSB3dl9zZXRfZnJlcXVlbmN5KGJhc2UsICYod3JxdS0+ZnJlcSkpOworCWVsc2UKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IGZyZXF1ZW5jeQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJa2lvX2FkZHJfdCBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIEF0dGVtcHQgdG8gcmVjb2duaXNlIDIuMDAgY2FyZHMgKDIuNCBHSHogZnJlcXVlbmN5IHNlbGVjdGFibGUpLgorCSAqIERvZXMgaXQgd29yayBmb3IgZXZlcnlib2R5LCBlc3BlY2lhbGx5IG9sZCBjYXJkcz8gKi8KKwlpZiAoIShtbWNfaW4oYmFzZSwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorCSAgICAgIChNTVJfRkVFX1NUQVRVU19EV0xEIHwgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpKSB7CisJCXVuc2lnbmVkIHNob3J0IGZyZXE7CisKKwkJLyogQXNrIHRoZSBFRVBST00gdG8gcmVhZCB0aGUgZnJlcXVlbmN5IGZyb20gdGhlIGZpcnN0IGFyZWEuICovCisJCWZlZV9yZWFkKGJhc2UsIDB4MDAsICZmcmVxLCAxKTsKKwkJd3JxdS0+ZnJlcS5tID0gKChmcmVxID4+IDUpICogNSArIDI0MDAwTCkgKiAxMDAwMDsKKwkJd3JxdS0+ZnJlcS5lID0gMTsKKwl9IGVsc2UgeworCQlwc2FfcmVhZChkZXYsCisJCQkgKGNoYXIgKikgJnBzYS5wc2Ffc3ViYmFuZCAtIChjaGFyICopICZwc2EsCisJCQkgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS5wc2Ffc3ViYmFuZCwgMSk7CisKKwkJaWYgKHBzYS5wc2Ffc3ViYmFuZCA8PSA0KSB7CisJCQl3cnF1LT5mcmVxLm0gPSBmaXhlZF9iYW5kc1twc2EucHNhX3N1YmJhbmRdOworCQkJd3JxdS0+ZnJlcS5lID0gKHBzYS5wc2Ffc3ViYmFuZCAhPSAwKTsKKwkJfSBlbHNlCisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IGxldmVsIHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJa2lvX2FkZHJfdCBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIFNldCB0aGUgbGV2ZWwgdGhyZXNob2xkLiAqLworCS8qIFdlIHNob3VsZCBjb21wbGFpbiBsb3VkbHkgaWYgd3JxdS0+c2Vucy5maXhlZCA9IDAsIGJlY2F1c2Ugd2UKKwkgKiBjYW4ndCBzZXQgYXV0byBtb2RlLi4uICovCisJcHNhLnBzYV90aHJfcHJlX3NldCA9IHdycXUtPnNlbnMudmFsdWUgJiAweDNGOworCXBzYV93cml0ZShkZXYsCisJCSAgKGNoYXIgKikgJnBzYS5wc2FfdGhyX3ByZV9zZXQgLSAoY2hhciAqKSAmcHNhLAorCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX3Rocl9wcmVfc2V0LCAxKTsKKwkvKiB1cGRhdGUgdGhlIFdhdmVsYW4gY2hlY2tzdW0gKi8KKwl1cGRhdGVfcHNhX2NoZWNrc3VtKGRldik7CisJbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X3Rocl9wcmVfc2V0KSwKKwkJcHNhLnBzYV90aHJfcHJlX3NldCk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IGxldmVsIHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIFJlYWQgdGhlIGxldmVsIHRocmVzaG9sZC4gKi8KKwlwc2FfcmVhZChkZXYsCisJCSAoY2hhciAqKSAmcHNhLnBzYV90aHJfcHJlX3NldCAtIChjaGFyICopICZwc2EsCisJCSAodW5zaWduZWQgY2hhciAqKSAmcHNhLnBzYV90aHJfcHJlX3NldCwgMSk7CisJd3JxdS0+c2Vucy52YWx1ZSA9IHBzYS5wc2FfdGhyX3ByZV9zZXQgJiAweDNGOworCXdycXUtPnNlbnMuZml4ZWQgPSAxOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBlbmNyeXB0aW9uIGtleQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgICBjaGFyICpleHRyYSkKK3sKKwlraW9fYWRkcl90IGJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXBzYV90IHBzYTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayBpZiBjYXBhYmxlIG9mIGVuY3J5cHRpb24gKi8KKwlpZiAoIW1tY19lbmNyKGJhc2UpKSB7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKworCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBrZXkgKi8KKwlpZigod3JxdS0+ZW5jb2RpbmcubGVuZ3RoICE9IDgpICYmICh3cnF1LT5lbmNvZGluZy5sZW5ndGggIT0gMCkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlpZighcmV0KSB7CisJCS8qIEJhc2ljIGNoZWNraW5nLi4uICovCisJCWlmICh3cnF1LT5lbmNvZGluZy5sZW5ndGggPT0gOCkgeworCQkJLyogQ29weSB0aGUga2V5IGluIHRoZSBkcml2ZXIgKi8KKwkJCW1lbWNweShwc2EucHNhX2VuY3J5cHRpb25fa2V5LCBleHRyYSwKKwkJCSAgICAgICB3cnF1LT5lbmNvZGluZy5sZW5ndGgpOworCQkJcHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCA9IDE7CisKKwkJCXBzYV93cml0ZShkZXYsCisJCQkJICAoY2hhciAqKSAmcHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCAtCisJCQkJICAoY2hhciAqKSAmcHNhLAorCQkJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS4KKwkJCQkgIHBzYV9lbmNyeXB0aW9uX3NlbGVjdCwgOCArIDEpOworCisJCQltbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZW5jcl9lbmFibGUpLAorCQkJCU1NV19FTkNSX0VOQUJMRV9FTiB8IE1NV19FTkNSX0VOQUJMRV9NT0RFKTsKKwkJCW1tY193cml0ZShiYXNlLCBtbXdvZmYoMCwgbW13X2VuY3Jfa2V5KSwKKwkJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EuCisJCQkJICBwc2FfZW5jcnlwdGlvbl9rZXksIDgpOworCQl9CisKKwkJLyogZGlzYWJsZSBlbmNyeXB0aW9uICovCisJCWlmICh3cnF1LT5lbmNvZGluZy5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgeworCQkJcHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCA9IDA7CisJCQlwc2Ffd3JpdGUoZGV2LAorCQkJCSAgKGNoYXIgKikgJnBzYS5wc2FfZW5jcnlwdGlvbl9zZWxlY3QgLQorCQkJCSAgKGNoYXIgKikgJnBzYSwKKwkJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EuCisJCQkJICBwc2FfZW5jcnlwdGlvbl9zZWxlY3QsIDEpOworCisJCQltbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZW5jcl9lbmFibGUpLCAwKTsKKwkJfQorCQkvKiB1cGRhdGUgdGhlIFdhdmVsYW4gY2hlY2tzdW0gKi8KKwkJdXBkYXRlX3BzYV9jaGVja3N1bShkZXYpOworCX0KKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgZW5jcnlwdGlvbiBrZXkKKyAqLworc3RhdGljIGludCB3YXZlbGFuX2dldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgICAgY2hhciAqZXh0cmEpCit7CisJa2lvX2FkZHJfdCBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIENoZWNrIGlmIGVuY3J5cHRpb24gaXMgYXZhaWxhYmxlICovCisJaWYgKCFtbWNfZW5jcihiYXNlKSkgeworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9IGVsc2UgeworCQkvKiBSZWFkIHRoZSBlbmNyeXB0aW9uIGtleSAqLworCQlwc2FfcmVhZChkZXYsCisJCQkgKGNoYXIgKikgJnBzYS5wc2FfZW5jcnlwdGlvbl9zZWxlY3QgLQorCQkJIChjaGFyICopICZwc2EsCisJCQkgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS4KKwkJCSBwc2FfZW5jcnlwdGlvbl9zZWxlY3QsIDEgKyA4KTsKKworCQkvKiBlbmNyeXB0aW9uIGlzIGVuYWJsZWQgPyAqLworCQlpZiAocHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCkKKwkJCXdycXUtPmVuY29kaW5nLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJCWVsc2UKKwkJCXdycXUtPmVuY29kaW5nLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQl3cnF1LT5lbmNvZGluZy5mbGFncyB8PSBtbWNfZW5jcihiYXNlKTsKKworCQkvKiBDb3B5IHRoZSBrZXkgdG8gdGhlIHVzZXIgYnVmZmVyICovCisJCXdycXUtPmVuY29kaW5nLmxlbmd0aCA9IDg7CisJCW1lbWNweShleHRyYSwgcHNhLnBzYV9lbmNyeXB0aW9uX2tleSwgd3JxdS0+ZW5jb2RpbmcubGVuZ3RoKTsKKwl9CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkdfRVhUCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBFU1NJRCAoZG9tYWluKQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgIGNoYXIgKmV4dHJhKQoreworCW5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIENoZWNrIGlmIGRpc2FibGUgKi8KKwlpZih3cnF1LT5kYXRhLmZsYWdzID09IDApCisJCWxwLT5maWx0ZXJfZG9tYWlucyA9IDA7CisJZWxzZSB7CisJCWNoYXIJZXNzaWRbSVdfRVNTSURfTUFYX1NJWkUgKyAxXTsKKwkJY2hhciAqCWVuZHA7CisKKwkJLyogVGVybWluYXRlIHRoZSBzdHJpbmcgKi8KKwkJbWVtY3B5KGVzc2lkLCBleHRyYSwgd3JxdS0+ZGF0YS5sZW5ndGgpOworCQllc3NpZFtJV19FU1NJRF9NQVhfU0laRV0gPSAnXDAnOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworCQlwcmludGsoS0VSTl9ERUJVRyAiU2V0RXNzaWQgOiBgYCVzJydcbiIsIGVzc2lkKTsKKyNlbmRpZgkvKiBERUJVR19JT0NUTF9JTkZPICovCisKKwkJLyogQ29udmVydCB0byBhIG51bWJlciAobm90ZSA6IFdhdmVsYW4gc3BlY2lmaWMpICovCisJCWxwLT5kb21haW5faWQgPSBzaW1wbGVfc3RydG91bChlc3NpZCwgJmVuZHAsIDE2KTsKKwkJLyogSGFzIGl0IHdvcmtlZCAgPyAqLworCQlpZihlbmRwID4gZXNzaWQpCisJCQlscC0+ZmlsdGVyX2RvbWFpbnMgPSAxOworCQllbHNlIHsKKwkJCWxwLT5maWx0ZXJfZG9tYWlucyA9IDA7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJfQorCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBFU1NJRCAoZG9tYWluKQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgIGNoYXIgKmV4dHJhKQoreworCW5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogSXMgdGhlIGRvbWFpbiBJRCBhY3RpdmUgPyAqLworCXdycXUtPmRhdGEuZmxhZ3MgPSBscC0+ZmlsdGVyX2RvbWFpbnM7CisKKwkvKiBDb3B5IERvbWFpbiBJRCBpbnRvIGEgc3RyaW5nIChXYXZlbGFuIHNwZWNpZmljKSAqLworCS8qIFNvdW5kIGNyYXp5LCBiZSB3ZSBjYW4ndCBoYXZlIGEgc25wcmludGYgaW4gdGhlIGtlcm5lbCAhISEgKi8KKwlzcHJpbnRmKGV4dHJhLCAiJWxYIiwgbHAtPmRvbWFpbl9pZCk7CisJZXh0cmFbSVdfRVNTSURfTUFYX1NJWkVdID0gJ1wwJzsKKworCS8qIFNldCB0aGUgbGVuZ3RoICovCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBBUCBhZGRyZXNzCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworI2lmZGVmIERFQlVHX0lPQ1RMX0lORk8KKwlwcmludGsoS0VSTl9ERUJVRyAiU2V0IEFQIHRvIDogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJICAgICAgIHdycXUtPmFwX2FkZHIuc2FfZGF0YVswXSwKKwkgICAgICAgd3JxdS0+YXBfYWRkci5zYV9kYXRhWzFdLAorCSAgICAgICB3cnF1LT5hcF9hZGRyLnNhX2RhdGFbMl0sCisJICAgICAgIHdycXUtPmFwX2FkZHIuc2FfZGF0YVszXSwKKwkgICAgICAgd3JxdS0+YXBfYWRkci5zYV9kYXRhWzRdLAorCSAgICAgICB3cnF1LT5hcF9hZGRyLnNhX2RhdGFbNV0pOworI2VuZGlmCS8qIERFQlVHX0lPQ1RMX0lORk8gKi8KKworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgQVAgYWRkcmVzcworICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwkvKiBTaG91bGQgZ2V0IHRoZSByZWFsIE1jQ295IGluc3RlYWQgb2Ygb3duIEV0aGVybmV0IGFkZHJlc3MgKi8KKwltZW1jcHkod3JxdS0+YXBfYWRkci5zYV9kYXRhLCBkZXYtPmRldl9hZGRyLCBXQVZFTEFOX0FERFJfU0laRSk7CisJd3JxdS0+YXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HX0VYVCAqLworCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBtb2RlCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIG1vZGUgKi8KKwlzd2l0Y2god3JxdS0+bW9kZSkgeworCWNhc2UgSVdfTU9ERV9BREhPQzoKKwkJaWYoZG9fcm9hbWluZykgeworCQkJd3Zfcm9hbV9jbGVhbnVwKGRldik7CisJCQlkb19yb2FtaW5nID0gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIElXX01PREVfSU5GUkE6CisJCWlmKCFkb19yb2FtaW5nKSB7CisJCQl3dl9yb2FtX2luaXQoZGV2KTsKKwkJCWRvX3JvYW1pbmcgPSAxOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBtb2RlCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlpZihkb19yb2FtaW5nKQorCQl3cnF1LT5tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwllbHNlCisJCXdycXUtPm1vZGUgPSBJV19NT0RFX0FESE9DOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHJhbmdlIGluZm8KKyAqLworc3RhdGljIGludCB3YXZlbGFuX2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgICBjaGFyICpleHRyYSkKK3sKKwlraW9fYWRkcl90IGJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogU2V0IHRoZSBsZW5ndGggKHZlcnkgaW1wb3J0YW50IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KSAqLworCXdycXUtPmRhdGEubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7CisKKwkvKiBTZXQgYWxsIHRoZSBpbmZvIHdlIGRvbid0IGNhcmUgb3IgZG9uJ3Qga25vdyBhYm91dCB0byB6ZXJvICovCisJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7CisKKwkvKiBTZXQgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbiB2ZXJzaW9ucyAqLworCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDk7CisKKwkvKiBTZXQgaW5mb3JtYXRpb24gaW4gdGhlIHJhbmdlIHN0cnVjdC4gICovCisJcmFuZ2UtPnRocm91Z2hwdXQgPSAxLjQgKiAxMDAwICogMTAwMDsJLyogZG9uJ3QgYXJndWUgb24gdGhpcyAhICovCisJcmFuZ2UtPm1pbl9ud2lkID0gMHgwMDAwOworCXJhbmdlLT5tYXhfbndpZCA9IDB4RkZGRjsKKworCXJhbmdlLT5zZW5zaXRpdml0eSA9IDB4M0Y7CisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSBNTVJfU0dOTF9RVUFMOworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IE1NUl9TSUdOQUxfTFZMOworCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IE1NUl9TSUxFTkNFX0xWTDsKKwlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IE1NUl9TR05MX1FVQUw7IC8qIEFsd2F5cyBtYXggKi8KKwkvKiBOZWVkIHRvIGdldCBiZXR0ZXIgdmFsdWVzIGZvciB0aG9zZSB0d28gKi8KKwlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAzMDsKKwlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSA4OworCisJcmFuZ2UtPm51bV9iaXRyYXRlcyA9IDE7CisJcmFuZ2UtPmJpdHJhdGVbMF0gPSAyMDAwMDAwOwkvKiAyIE1iL3MgKi8KKworCS8qIEV2ZW50IGNhcGFiaWxpdHkgKGtlcm5lbCArIGRyaXZlcikgKi8KKwlyYW5nZS0+ZXZlbnRfY2FwYVswXSA9IChJV19FVkVOVF9DQVBBX01BU0soMHg4QjAyKSB8CisJCQkJSVdfRVZFTlRfQ0FQQV9NQVNLKDB4OEIwNCkgfAorCQkJCUlXX0VWRU5UX0NBUEFfTUFTSygweDhCMDYpKTsKKwlyYW5nZS0+ZXZlbnRfY2FwYVsxXSA9IElXX0VWRU5UX0NBUEFfS18xOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBBdHRlbXB0IHRvIHJlY29nbmlzZSAyLjAwIGNhcmRzICgyLjQgR0h6IGZyZXF1ZW5jeSBzZWxlY3RhYmxlKS4gKi8KKwlpZiAoIShtbWNfaW4oYmFzZSwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorCSAgICAgIChNTVJfRkVFX1NUQVRVU19EV0xEIHwgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpKSB7CisJCXJhbmdlLT5udW1fY2hhbm5lbHMgPSAxMDsKKwkJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSB3dl9mcmVxdWVuY3lfbGlzdChiYXNlLCByYW5nZS0+ZnJlcSwKKwkJCQkJCQlJV19NQVhfRlJFUVVFTkNJRVMpOworCX0gZWxzZQorCQlyYW5nZS0+bnVtX2NoYW5uZWxzID0gcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSAwOworCisJLyogRW5jcnlwdGlvbiBzdXBwb3J0ZWQgPyAqLworCWlmIChtbWNfZW5jcihiYXNlKSkgeworCQlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IDg7CS8qIERFUyA9IDY0IGJpdHMga2V5ICovCisJCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAxOworCQlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IDE7CS8qIE9ubHkgb25lIGtleSBwb3NzaWJsZSAqLworCX0gZWxzZSB7CisJCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAwOworCQlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IDA7CisJfQorCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgUHJpdmF0ZSBIYW5kbGVyIDogc2V0IHF1YWxpdHkgdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfcXRocihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlraW9fYWRkcl90IGJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwc2FfdCBwc2E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJcHNhLnBzYV9xdWFsaXR5X3RociA9ICooZXh0cmEpICYgMHgwRjsKKwlwc2Ffd3JpdGUoZGV2LAorCQkgIChjaGFyICopICZwc2EucHNhX3F1YWxpdHlfdGhyIC0gKGNoYXIgKikgJnBzYSwKKwkJICAodW5zaWduZWQgY2hhciAqKSAmcHNhLnBzYV9xdWFsaXR5X3RociwgMSk7CisJLyogdXBkYXRlIHRoZSBXYXZlbGFuIGNoZWNrc3VtICovCisJdXBkYXRlX3BzYV9jaGVja3N1bShkZXYpOworCW1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19xdWFsaXR5X3RociksCisJCXBzYS5wc2FfcXVhbGl0eV90aHIpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IGdldCBxdWFsaXR5IHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X3F0aHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCXBzYV9yZWFkKGRldiwKKwkJIChjaGFyICopICZwc2EucHNhX3F1YWxpdHlfdGhyIC0gKGNoYXIgKikgJnBzYSwKKwkJICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX3F1YWxpdHlfdGhyLCAxKTsKKwkqKGV4dHJhKSA9IHBzYS5wc2FfcXVhbGl0eV90aHIgJiAweDBGOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFdBVkVMQU5fUk9BTUlORworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IHNldCByb2FtaW5nCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfcm9hbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBOb3RlIDogc2hvdWxkIGNoZWNrIGlmIHVzZXIgPT0gcm9vdCAqLworCWlmKGRvX3JvYW1pbmcgJiYgKCpleHRyYSk9PTApCisJCXd2X3JvYW1fY2xlYW51cChkZXYpOworCWVsc2UgaWYoZG9fcm9hbWluZz09MCAmJiAoKmV4dHJhKSE9MCkKKwkJd3Zfcm9hbV9pbml0KGRldik7CisKKwlkb19yb2FtaW5nID0gKCpleHRyYSk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgUHJpdmF0ZSBIYW5kbGVyIDogZ2V0IHF1YWxpdHkgdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfcm9hbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwkqKGV4dHJhKSA9IGRvX3JvYW1pbmc7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkvKiBXQVZFTEFOX1JPQU1JTkcgKi8KKworI2lmZGVmIEhJU1RPR1JBTQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IHNldCBoaXN0b2dyYW0KKyAqLworc3RhdGljIGludCB3YXZlbGFuX3NldF9oaXN0byhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgICBjaGFyICpleHRyYSkKK3sKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIENoZWNrIHRoZSBudW1iZXIgb2YgaW50ZXJ2YWxzLiAqLworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IDE2KSB7CisJCXJldHVybigtRTJCSUcpOworCX0KKworCS8qIERpc2FibGUgaGlzdG8gd2hpbGUgd2UgY29weSB0aGUgYWRkcmVzc2VzLgorCSAqIEFzIHdlIGRvbid0IGRpc2FibGUgaW50ZXJydXB0cywgd2UgbmVlZCB0byBkbyB0aGlzICovCisJbHAtPmhpc19udW1iZXIgPSAwOworCisJLyogQXJlIHRoZXJlIHJhbmdlcyB0byBjb3B5PyAqLworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IDApIHsKKwkJLyogQ29weSBpbnRlcnZhbCByYW5nZXMgdG8gdGhlIGRyaXZlciAqLworCQltZW1jcHkobHAtPmhpc19yYW5nZSwgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKKworCQl7CisJCSAgaW50IGk7CisJCSAgcHJpbnRrKEtFUk5fREVCVUcgIkhpc3RvIDoiKTsKKwkJICBmb3IoaSA9IDA7IGkgPCB3cnF1LT5kYXRhLmxlbmd0aDsgaSsrKQorCQkgICAgcHJpbnRrKCIgJWQiLCBscC0+aGlzX3JhbmdlW2ldKTsKKwkJICBwcmludGsoIlxuIik7CisJCX0KKworCQkvKiBSZXNldCByZXN1bHQgc3RydWN0dXJlLiAqLworCQltZW1zZXQobHAtPmhpc19zdW0sIDB4MDAsIHNpemVvZihsb25nKSAqIDE2KTsKKwl9CisKKwkvKiBOb3cgd2UgY2FuIHNldCB0aGUgbnVtYmVyIG9mIHJhbmdlcyAqLworCWxwLT5oaXNfbnVtYmVyID0gd3JxdS0+ZGF0YS5sZW5ndGg7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBQcml2YXRlIEhhbmRsZXIgOiBnZXQgaGlzdG9ncmFtCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfaGlzdG8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICAgY2hhciAqZXh0cmEpCit7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBTZXQgdGhlIG51bWJlciBvZiBpbnRlcnZhbHMuICovCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBscC0+aGlzX251bWJlcjsKKworCS8qIEdpdmUgYmFjayB0aGUgZGlzdHJpYnV0aW9uIHN0YXRpc3RpY3MgKi8KKwlpZihscC0+aGlzX251bWJlciA+IDApCisJCW1lbWNweShleHRyYSwgbHAtPmhpc19zdW0sIHNpemVvZihsb25nKSAqIGxwLT5oaXNfbnVtYmVyKTsKKworCXJldHVybigwKTsKK30KKyNlbmRpZgkJCS8qIEhJU1RPR1JBTSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU3RydWN0dXJlcyB0byBleHBvcnQgdGhlIFdpcmVsZXNzIEhhbmRsZXJzCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3Mgd2F2ZWxhbl9wcml2YXRlX2FyZ3NbXSA9IHsKKy8qeyBjbWQsICAgICAgICAgc2V0X2FyZ3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9hcmdzLCBuYW1lIH0gKi8KKyAgeyBTSU9DU0lQUVRIUiwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic2V0cXVhbHRociIgfSwKKyAgeyBTSU9DR0lQUVRIUiwgMCwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0cXVhbHRociIgfSwKKyAgeyBTSU9DU0lQUk9BTSwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic2V0cm9hbSIgfSwKKyAgeyBTSU9DR0lQUk9BTSwgMCwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0cm9hbSIgfSwKKyAgeyBTSU9DU0lQSElTVE8sIElXX1BSSVZfVFlQRV9CWVRFIHwgMTYsICAgICAgICAgICAgICAgICAgICAwLCAic2V0aGlzdG8iIH0sCisgIHsgU0lPQ0dJUEhJU1RPLCAwLCAgICAgICAgICAgICAgICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwgImdldGhpc3RvIiB9LAorfTsKKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJCXdhdmVsYW5faGFuZGxlcltdID0KK3sKKwlOVUxMLAkJCQkvKiBTSU9DU0lXTkFNRSAqLworCXdhdmVsYW5fZ2V0X25hbWUsCQkvKiBTSU9DR0lXTkFNRSAqLworCXdhdmVsYW5fc2V0X253aWQsCQkvKiBTSU9DU0lXTldJRCAqLworCXdhdmVsYW5fZ2V0X253aWQsCQkvKiBTSU9DR0lXTldJRCAqLworCXdhdmVsYW5fc2V0X2ZyZXEsCQkvKiBTSU9DU0lXRlJFUSAqLworCXdhdmVsYW5fZ2V0X2ZyZXEsCQkvKiBTSU9DR0lXRlJFUSAqLworI2lmZGVmIFdBVkVMQU5fUk9BTUlORworCXdhdmVsYW5fc2V0X21vZGUsCQkvKiBTSU9DU0lXTU9ERSAqLworCXdhdmVsYW5fZ2V0X21vZGUsCQkvKiBTSU9DR0lXTU9ERSAqLworI2Vsc2UJLyogV0FWRUxBTl9ST0FNSU5HICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV01PREUgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXTU9ERSAqLworI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworCXdhdmVsYW5fc2V0X3NlbnMsCQkvKiBTSU9DU0lXU0VOUyAqLworCXdhdmVsYW5fZ2V0X3NlbnMsCQkvKiBTSU9DR0lXU0VOUyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSQU5HRSAqLworCXdhdmVsYW5fZ2V0X3JhbmdlLAkJLyogU0lPQ0dJV1JBTkdFICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1BSSVYgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUFJJViAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdTVEFUUyAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdTVEFUUyAqLworCWl3X2hhbmRsZXJfc2V0X3NweSwJCS8qIFNJT0NTSVdTUFkgKi8KKwlpd19oYW5kbGVyX2dldF9zcHksCQkvKiBTSU9DR0lXU1BZICovCisJaXdfaGFuZGxlcl9zZXRfdGhyc3B5LAkJLyogU0lPQ1NJV1RIUlNQWSAqLworCWl3X2hhbmRsZXJfZ2V0X3RocnNweSwJCS8qIFNJT0NHSVdUSFJTUFkgKi8KKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkdfRVhUCisJd2F2ZWxhbl9zZXRfd2FwLAkJLyogU0lPQ1NJV0FQICovCisJd2F2ZWxhbl9nZXRfd2FwLAkJLyogU0lPQ0dJV0FQICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdBUExJU1QgKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCXdhdmVsYW5fc2V0X2Vzc2lkLAkJLyogU0lPQ1NJV0VTU0lEICovCisJd2F2ZWxhbl9nZXRfZXNzaWQsCQkvKiBTSU9DR0lXRVNTSUQgKi8KKyNlbHNlCS8qIFdBVkVMQU5fUk9BTUlOR19FWFQgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXQVAgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXQVAgKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV0FQTElTVCAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV0VTU0lEICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV0VTU0lEICovCisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HX0VYVCAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdOSUNLTiAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdOSUNLTiAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1JBVEUgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUkFURSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSVFMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUlRTICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV0ZSQUcgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXRlJBRyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdUWFBPVyAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdUWFBPVyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSRVRSWSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdSRVRSWSAqLworCXdhdmVsYW5fc2V0X2VuY29kZSwJCS8qIFNJT0NTSVdFTkNPREUgKi8KKwl3YXZlbGFuX2dldF9lbmNvZGUsCQkvKiBTSU9DR0lXRU5DT0RFICovCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlcgkJd2F2ZWxhbl9wcml2YXRlX2hhbmRsZXJbXSA9Cit7CisJd2F2ZWxhbl9zZXRfcXRociwJCS8qIFNJT0NJV0ZJUlNUUFJJViAqLworCXdhdmVsYW5fZ2V0X3F0aHIsCQkvKiBTSU9DSVdGSVJTVFBSSVYgKyAxICovCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisJd2F2ZWxhbl9zZXRfcm9hbSwJCS8qIFNJT0NJV0ZJUlNUUFJJViArIDIgKi8KKwl3YXZlbGFuX2dldF9yb2FtLAkJLyogU0lPQ0lXRklSU1RQUklWICsgMyAqLworI2Vsc2UJLyogV0FWRUxBTl9ST0FNSU5HICovCisJTlVMTCwJCQkJLyogU0lPQ0lXRklSU1RQUklWICsgMiAqLworCU5VTEwsCQkJCS8qIFNJT0NJV0ZJUlNUUFJJViArIDMgKi8KKyNlbmRpZgkvKiBXQVZFTEFOX1JPQU1JTkcgKi8KKyNpZmRlZiBISVNUT0dSQU0KKwl3YXZlbGFuX3NldF9oaXN0bywJCS8qIFNJT0NJV0ZJUlNUUFJJViArIDQgKi8KKwl3YXZlbGFuX2dldF9oaXN0bywJCS8qIFNJT0NJV0ZJUlNUUFJJViArIDUgKi8KKyNlbmRpZgkvKiBISVNUT0dSQU0gKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYJd2F2ZWxhbl9oYW5kbGVyX2RlZiA9Cit7CisJLm51bV9zdGFuZGFyZAk9IHNpemVvZih3YXZlbGFuX2hhbmRsZXIpL3NpemVvZihpd19oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGUJPSBzaXplb2Yod2F2ZWxhbl9wcml2YXRlX2hhbmRsZXIpL3NpemVvZihpd19oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGVfYXJncyA9IHNpemVvZih3YXZlbGFuX3ByaXZhdGVfYXJncykvc2l6ZW9mKHN0cnVjdCBpd19wcml2X2FyZ3MpLAorCS5zdGFuZGFyZAk9IHdhdmVsYW5faGFuZGxlciwKKwkucHJpdmF0ZQk9IHdhdmVsYW5fcHJpdmF0ZV9oYW5kbGVyLAorCS5wcml2YXRlX2FyZ3MJPSB3YXZlbGFuX3ByaXZhdGVfYXJncywKKwkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gd2F2ZWxhbl9nZXRfd2lyZWxlc3Nfc3RhdHMsCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2V0IHdpcmVsZXNzIHN0YXRpc3RpY3MKKyAqIENhbGxlZCBieSAvcHJvYy9uZXQvd2lyZWxlc3MuLi4KKyAqLworc3RhdGljIGl3X3N0YXRzICoKK3dhdmVsYW5fZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBraW9fYWRkcl90CQliYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgIG5ldF9sb2NhbCAqCQlscCA9IG5ldGRldl9wcml2KGRldik7CisgIG1tcl90CQkJbTsKKyAgaXdfc3RhdHMgKgkJd3N0YXRzOworICB1bnNpZ25lZCBsb25nCQlmbGFnczsKKworI2lmZGVmIERFQlVHX0lPQ1RMX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX2dldF93aXJlbGVzc19zdGF0cygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKyAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICYgc2F2ZSBmbGFncyAqLworICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgd3N0YXRzID0gJmxwLT53c3RhdHM7CisKKyAgLyogR2V0IGRhdGEgZnJvbSB0aGUgbW1jICovCisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mcmVlemUpLCAxKTsKKworICBtbWNfcmVhZChiYXNlLCBtbXJvZmYoMCwgbW1yX2RjZV9zdGF0dXMpLCAmbS5tbXJfZGNlX3N0YXR1cywgMSk7CisgIG1tY19yZWFkKGJhc2UsIG1tcm9mZigwLCBtbXJfd3JvbmdfbndpZF9sKSwgJm0ubW1yX3dyb25nX253aWRfbCwgMik7CisgIG1tY19yZWFkKGJhc2UsIG1tcm9mZigwLCBtbXJfdGhyX3ByZV9zZXQpLCAmbS5tbXJfdGhyX3ByZV9zZXQsIDQpOworCisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mcmVlemUpLCAwKTsKKworICAvKiBDb3B5IGRhdGEgdG8gd2lyZWxlc3Mgc3R1ZmYgKi8KKyAgd3N0YXRzLT5zdGF0dXMgPSBtLm1tcl9kY2Vfc3RhdHVzICYgTU1SX0RDRV9TVEFUVVM7CisgIHdzdGF0cy0+cXVhbC5xdWFsID0gbS5tbXJfc2dubF9xdWFsICYgTU1SX1NHTkxfUVVBTDsKKyAgd3N0YXRzLT5xdWFsLmxldmVsID0gbS5tbXJfc2lnbmFsX2x2bCAmIE1NUl9TSUdOQUxfTFZMOworICB3c3RhdHMtPnF1YWwubm9pc2UgPSBtLm1tcl9zaWxlbmNlX2x2bCAmIE1NUl9TSUxFTkNFX0xWTDsKKyAgd3N0YXRzLT5xdWFsLnVwZGF0ZWQgPSAoKChtLm1tcl9zaWduYWxfbHZsICYgTU1SX1NJR05BTF9MVkxfVkFMSUQpID4+IDcpIHwKKwkJCSAgKChtLm1tcl9zaWduYWxfbHZsICYgTU1SX1NJR05BTF9MVkxfVkFMSUQpID4+IDYpIHwKKwkJCSAgKChtLm1tcl9zaWxlbmNlX2x2bCAmIE1NUl9TSUxFTkNFX0xWTF9WQUxJRCkgPj4gNSkpOworICB3c3RhdHMtPmRpc2NhcmQubndpZCArPSAobS5tbXJfd3JvbmdfbndpZF9oIDw8IDgpIHwgbS5tbXJfd3JvbmdfbndpZF9sOworICB3c3RhdHMtPmRpc2NhcmQuY29kZSA9IDBMOworICB3c3RhdHMtPmRpc2NhcmQubWlzYyA9IDBMOworCisgIC8qIFJlRW5hYmxlIGludGVycnVwdHMgJiByZXN0b3JlIGZsYWdzICovCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisjaWZkZWYgREVCVUdfSU9DVExfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fZ2V0X3dpcmVsZXNzX3N0YXRzKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKyAgcmV0dXJuICZscC0+d3N0YXRzOworfQorI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBQQUNLRVQgUkVDRVBUSU9OICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyBwYXJ0IGRlYWwgd2l0aCByZWNlaXZpbmcgdGhlIHBhY2tldHMuCisgKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgZ2V0IGFuIGludGVycnVwdCB3aGVuIGEgcGFja2V0IGhhcyBiZWVuCisgKiBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQgYW5kIGNhbGxlZCB0aGlzIHBhcnQuLi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ2FsY3VsYXRlIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBmcmFtZSBwb2ludGVkIHRvIGJ5IHRoZSByZWNlaXZlCisgKiBmcmFtZSBwb2ludGVyIGFuZCB2ZXJpZnkgdGhhdCB0aGUgZnJhbWUgc2VlbSBjb3JyZWN0CisgKiAoY2FsbGVkIGJ5IHd2X3BhY2tldF9yY3YoKSkKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3d2X3N0YXJ0X29mX2ZyYW1lKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAorCQkgIGludAkJcmZwLAkvKiBlbmQgb2YgZnJhbWUgKi8KKwkJICBpbnQJCXdyYXApCS8qIHN0YXJ0IG9mIGJ1ZmZlciAqLworeworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgaW50CQlycDsKKyAgaW50CQlsZW47CisKKyAgcnAgPSAocmZwIC0gNSArIFJYX1NJWkUpICUgUlhfU0laRTsKKyAgb3V0YihycCAmIDB4ZmYsIFBJT1JMKGJhc2UpKTsKKyAgb3V0YigoKHJwID4+IDgpICYgUElPUkhfTUFTSyksIFBJT1JIKGJhc2UpKTsKKyAgbGVuID0gaW5iKFBJT1AoYmFzZSkpOworICBsZW4gfD0gaW5iKFBJT1AoYmFzZSkpIDw8IDg7CisKKyAgLyogU2FuaXR5IGNoZWNrcyBvbiBzaXplICovCisgIC8qIEZyYW1lIHRvbyBiaWcgKi8KKyAgaWYobGVuID4gTUFYREFUQVogKyAxMDApCisgICAgeworI2lmZGVmIERFQlVHX1JYX0VSUk9SCisgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogd3Zfc3RhcnRfb2ZfZnJhbWU6IFJlY2VpdmVkIGZyYW1lIHRvbyBsYXJnZSwgcmZwICVkIGxlbiAweCV4XG4iLAorCSAgICAgZGV2LT5uYW1lLCByZnAsIGxlbik7CisjZW5kaWYKKyAgICAgIHJldHVybigtMSk7CisgICAgfQorICAKKyAgLyogRnJhbWUgdG9vIHNob3J0ICovCisgIGlmKGxlbiA8IDcpCisgICAgeworI2lmZGVmIERFQlVHX1JYX0VSUk9SCisgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogd3Zfc3RhcnRfb2ZfZnJhbWU6IFJlY2VpdmVkIG51bGwgZnJhbWUsIHJmcCAlZCBsZW4gMHgleFxuIiwKKwkgICAgIGRldi0+bmFtZSwgcmZwLCBsZW4pOworI2VuZGlmCisgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgCisgIC8qIFdyYXAgYXJvdW5kIGJ1ZmZlciAqLworICBpZihsZW4gPiAoKHdyYXAgLSAocmZwIC0gbGVuKSArIFJYX1NJWkUpICUgUlhfU0laRSkpCS8qIG1hZ2ljIGZvcm11bGEgISAqLworICAgIHsKKyNpZmRlZiBERUJVR19SWF9FUlJPUgorICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHd2X3N0YXJ0X29mX2ZyYW1lOiB3cmFwIGFyb3VuZCBidWZmZXIsIHdyYXAgJWQgcmZwICVkIGxlbiAweCV4XG4iLAorCSAgICAgZGV2LT5uYW1lLCB3cmFwLCByZnAsIGxlbik7CisjZW5kaWYKKyAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgIHJldHVybigocnAgLSBsZW4gKyBSWF9TSVpFKSAlIFJYX1NJWkUpOworfSAvKiB3dl9zdGFydF9vZl9mcmFtZSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIGRvZXMgdGhlIGFjdHVhbCBjb3B5IG9mIGRhdGEgKGluY2x1ZGluZyB0aGUgZXRoZXJuZXQKKyAqIGhlYWRlciBzdHJ1Y3R1cmUpIGZyb20gdGhlIFdhdmVMQU4gY2FyZCB0byBhbiBza19idWZmIGNoYWluIHRoYXQKKyAqIHdpbGwgYmUgcGFzc2VkIHVwIHRvIHRoZSBuZXR3b3JrIGludGVyZmFjZSBsYXllci4gTk9URTogV2UKKyAqIGN1cnJlbnRseSBkb24ndCBoYW5kbGUgdHJhaWxlciBwcm90b2NvbHMgKG5laXRoZXIgZG9lcyB0aGUgcmVzdCBvZgorICogdGhlIG5ldHdvcmsgaW50ZXJmYWNlKSwgc28gaWYgdGhhdCBpcyBuZWVkZWQsIGl0IHdpbGwgKGF0IGxlYXN0IGluCisgKiBwYXJ0KSBiZSBhZGRlZCBoZXJlLiAgVGhlIGNvbnRlbnRzIG9mIHRoZSByZWNlaXZlIHJpbmcgYnVmZmVyIGFyZQorICogY29waWVkIHRvIGEgbWVzc2FnZSBjaGFpbiB0aGF0IGlzIHRoZW4gcGFzc2VkIHRvIHRoZSBrZXJuZWwuCisgKgorICogTm90ZTogaWYgYW55IGVycm9ycyBvY2N1ciwgdGhlIHBhY2tldCBpcyAiZHJvcHBlZCBvbiB0aGUgZmxvb3IiCisgKiAoY2FsbGVkIGJ5IHd2X3BhY2tldF9yY3YoKSkKKyAqLworc3RhdGljIGlubGluZSB2b2lkCit3dl9wYWNrZXRfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqCQlkZXYsCisJICAgICAgIGludAkJZmRfcCwKKwkgICAgICAgaW50CQlza3NpemUpCit7CisgIG5ldF9sb2NhbCAqCQlscCA9IG5ldGRldl9wcml2KGRldik7CisgIHN0cnVjdCBza19idWZmICoJc2tiOworCisjaWZkZWYgREVCVUdfUlhfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X3BhY2tldF9yZWFkKDB4JVgsICVkKVxuIiwKKwkgZGV2LT5uYW1lLCBmZF9wLCBza3NpemUpOworI2VuZGlmCisKKyAgLyogQWxsb2NhdGUgc29tZSBidWZmZXIgZm9yIHRoZSBuZXcgcGFja2V0ICovCisgIGlmKChza2IgPSBkZXZfYWxsb2Nfc2tiKHNrc2l6ZSsyKSkgPT0gKHN0cnVjdCBza19idWZmICopIE5VTEwpCisgICAgeworI2lmZGVmIERFQlVHX1JYX0VSUk9SCisgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogd3ZfcGFja2V0X3JlYWQoKTogY291bGQgbm90IGFsbG9jX3NrYiglZCwgR0ZQX0FUT01JQylcbiIsCisJICAgICBkZXYtPm5hbWUsIHNrc2l6ZSk7CisjZW5kaWYKKyAgICAgIGxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisgICAgICAvKgorICAgICAgICogTm90IG9ubHkgZG8gd2Ugd2FudCB0byByZXR1cm4gaGVyZSwgYnV0IHdlIGFsc28gbmVlZCB0byBkcm9wIHRoZQorICAgICAgICogcGFja2V0IG9uIHRoZSBmbG9vciB0byBjbGVhciB0aGUgaW50ZXJydXB0LgorICAgICAgICovCisgICAgICByZXR1cm47CisgICAgfQorCisgIHNrYi0+ZGV2ID0gZGV2OworCisgIHNrYl9yZXNlcnZlKHNrYiwgMik7CisgIGZkX3AgPSByZWFkX3JpbmdidWYoZGV2LCBmZF9wLCAoY2hhciAqKSBza2JfcHV0KHNrYiwgc2tzaXplKSwgc2tzaXplKTsKKyAgc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworI2lmZGVmIERFQlVHX1JYX0lORk8KKyAgd3ZfcGFja2V0X2luZm8oc2tiLT5tYWMucmF3LCBza3NpemUsIGRldi0+bmFtZSwgInd2X3BhY2tldF9yZWFkIik7CisjZW5kaWYJLyogREVCVUdfUlhfSU5GTyAqLworICAgICAKKyAgLyogU3RhdGlzdGljcyBnYXRoZXJpbmcgJiBzdHVmZiBhc3NvY2lhdGVkLgorICAgKiBJdCBzZWVtIGEgYml0IG1lc3N5IHdpdGggYWxsIHRoZSBkZWZpbmUsIGJ1dCBpdCdzIHJlYWxseSBzaW1wbGUuLi4gKi8KKyAgaWYoCisjaWZkZWYgSVdfV0lSRUxFU1NfU1BZCisgICAgIChscC0+c3B5X2RhdGEuc3B5X251bWJlciA+IDApIHx8CisjZW5kaWYJLyogSVdfV0lSRUxFU1NfU1BZICovCisjaWZkZWYgSElTVE9HUkFNCisgICAgIChscC0+aGlzX251bWJlciA+IDApIHx8CisjZW5kaWYJLyogSElTVE9HUkFNICovCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisgICAgIChkb19yb2FtaW5nKSB8fAorI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworICAgICAwKQorICAgIHsKKyAgICAgIHVfY2hhcglzdGF0c1szXTsJLyogU2lnbmFsIGxldmVsLCBOb2lzZSBsZXZlbCwgU2lnbmFsIHF1YWxpdHkgKi8KKworICAgICAgLyogcmVhZCBzaWduYWwgbGV2ZWwsIHNpbGVuY2UgbGV2ZWwgYW5kIHNpZ25hbCBxdWFsaXR5IGJ5dGVzICovCisgICAgICBmZF9wID0gcmVhZF9yaW5nYnVmKGRldiwgKGZkX3AgKyA0KSAlIFJYX1NJWkUgKyBSWF9CQVNFLAorCQkJICBzdGF0cywgMyk7CisjaWZkZWYgREVCVUdfUlhfSU5GTworICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3dl9wYWNrZXRfcmVhZCgpOiBTaWduYWwgbGV2ZWwgJWQvNjMsIFNpbGVuY2UgbGV2ZWwgJWQvNjMsIHNpZ25hbCBxdWFsaXR5ICVkLzE2XG4iLAorCSAgICAgZGV2LT5uYW1lLCBzdGF0c1swXSAmIDB4M0YsIHN0YXRzWzFdICYgMHgzRiwgc3RhdHNbMl0gJiAweDBGKTsKKyNlbmRpZgorCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisgICAgICBpZihkb19yb2FtaW5nKQorCWlmKFdBVkVMQU5fQkVBQ09OKHNrYi0+ZGF0YSkpCisJICB3bF9yb2FtX2dhdGhlcihkZXYsIHNrYi0+ZGF0YSwgc3RhdHMpOworI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworCSAgCisjaWZkZWYgV0lSRUxFU1NfU1BZCisgICAgICB3bF9zcHlfZ2F0aGVyKGRldiwgc2tiLT5tYWMucmF3ICsgV0FWRUxBTl9BRERSX1NJWkUsIHN0YXRzKTsKKyNlbmRpZgkvKiBXSVJFTEVTU19TUFkgKi8KKyNpZmRlZiBISVNUT0dSQU0KKyAgICAgIHdsX2hpc19nYXRoZXIoZGV2LCBzdGF0cyk7CisjZW5kaWYJLyogSElTVE9HUkFNICovCisgICAgfQorCisgIC8qCisgICAqIEhhbmQgdGhlIHBhY2tldCB0byB0aGUgTmV0d29yayBNb2R1bGUKKyAgICovCisgIG5ldGlmX3J4KHNrYik7CisKKyAgLyogS2VlcCBzdGF0cyB1cCB0byBkYXRlICovCisgIGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisgIGxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisgIGxwLT5zdGF0cy5yeF9ieXRlcyArPSBza3NpemU7CisKKyNpZmRlZiBERUJVR19SWF9UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfcGFja2V0X3JlYWQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB0byBpbml0aWF0ZSBhCisgKiBwYWNrZXQgdHJhbnNmZXIgZnJvbSB0aGUgY2FyZCB0byB0aGUgbmV0d29yayBpbnRlcmZhY2UgbGF5ZXIgYWJvdmUKKyAqIHRoaXMgZHJpdmVyLiAgVGhpcyByb3V0aW5lIGNoZWNrcyBpZiBhIGJ1ZmZlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkKKyAqIHJlY2VpdmVkIGJ5IHRoZSBXYXZlTEFOIGNhcmQuICBJZiBzbywgdGhlIHJvdXRpbmUgd3ZfcGFja2V0X3JlYWQgaXMKKyAqIGNhbGxlZCB0byBkbyB0aGUgYWN0dWFsIHRyYW5zZmVyIG9mIHRoZSBjYXJkJ3MgZGF0YSBpbmNsdWRpbmcgdGhlCisgKiBldGhlcm5ldCBoZWFkZXIgaW50byBhIHBhY2tldCBjb25zaXN0aW5nIG9mIGFuIHNrX2J1ZmYgY2hhaW4uCisgKiAoY2FsbGVkIGJ5IHdhdmVsYW5faW50ZXJydXB0KCkpCisgKiBOb3RlIDogdGhlIHNwaW5sb2NrIGlzIGFscmVhZHkgZ3JhYmJlZCBmb3IgdXMgYW5kIGlycSBhcmUgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAord3ZfcGFja2V0X3JjdihzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAga2lvX2FkZHJfdAliYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgIG5ldF9sb2NhbCAqCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgaW50CQluZXdyZnA7CisgIGludAkJcnA7CisgIGludAkJbGVuOworICBpbnQJCWZfc3RhcnQ7CisgIGludAkJc3RhdHVzOworICBpbnQJCWk1OTNfcmZwOworICBpbnQJCXN0YXRfcHRyOworICB1X2NoYXIJY1s0XTsKKworI2lmZGVmIERFQlVHX1JYX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9wYWNrZXRfcmN2KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICAvKiBHZXQgdGhlIG5ldyByZWNlaXZlIGZyYW1lIHBvaW50ZXIgZnJvbSB0aGUgaTgyNTkzIGNoaXAgKi8KKyAgb3V0YihDUjBfU1RBVFVTXzIgfCBPUDBfTk9QLCBMQ0NSKGJhc2UpKTsKKyAgaTU5M19yZnAgPSBpbmIoTENTUihiYXNlKSk7CisgIGk1OTNfcmZwIHw9IGluYihMQ1NSKGJhc2UpKSA8PCA4OworICBpNTkzX3JmcCAlPSBSWF9TSVpFOworCisgIC8qIEdldCB0aGUgbmV3IHJlY2VpdmUgZnJhbWUgcG9pbnRlciBmcm9tIHRoZSBXYXZlTEFOIGNhcmQuCisgICAqIEl0IGlzIDMgYnl0ZXMgbW9yZSB0aGFuIHRoZSBpbmNyZW1lbnQgb2YgdGhlIGk4MjU5MyByZWNlaXZlCisgICAqIGZyYW1lIHBvaW50ZXIsIGZvciBlYWNoIHBhY2tldC4gVGhpcyBpcyBiZWNhdXNlIGl0IGluY2x1ZGVzIHRoZQorICAgKiAzIHJvYW1pbmcgYnl0ZXMgYWRkZWQgYnkgdGhlIG1tYy4KKyAgICovCisgIG5ld3JmcCA9IGluYihSUExMKGJhc2UpKTsKKyAgbmV3cmZwIHw9IGluYihSUExIKGJhc2UpKSA8PCA4OworICBuZXdyZnAgJT0gUlhfU0laRTsKKworI2lmZGVmIERFQlVHX1JYX0lORk8KKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3dl9wYWNrZXRfcmN2KCk6IGk1OTNfcmZwICVkIHN0b3AgJWQgbmV3cmZwICVkIGxwLT5yZnAgJWRcbiIsCisJIGRldi0+bmFtZSwgaTU5M19yZnAsIGxwLT5zdG9wLCBuZXdyZnAsIGxwLT5yZnApOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19SWF9FUlJPUgorICAvKiBJZiBubyBuZXcgZnJhbWUgcG9pbnRlci4uLiAqLworICBpZihscC0+b3ZlcnJ1bm5pbmcgfHwgbmV3cmZwID09IGxwLT5yZnApCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHd2X3BhY2tldF9yY3YoKTogbm8gbmV3IGZyYW1lOiBpNTkzX3JmcCAlZCBzdG9wICVkIG5ld3JmcCAlZCBscC0+cmZwICVkXG4iLAorCSAgIGRldi0+bmFtZSwgaTU5M19yZnAsIGxwLT5zdG9wLCBuZXdyZnAsIGxwLT5yZnApOworI2VuZGlmCisKKyAgLyogUmVhZCBhbGwgZnJhbWVzIChwYWNrZXRzKSByZWNlaXZlZCAqLworICB3aGlsZShuZXdyZnAgIT0gbHAtPnJmcCkKKyAgICB7CisgICAgICAvKiBBIGZyYW1lIGlzIGNvbXBvc2VkIG9mIHRoZSBwYWNrZXQsIGZvbGxvd2VkIGJ5IGEgc3RhdHVzIHdvcmQsCisgICAgICAgKiB0aGUgbGVuZ3RoIG9mIHRoZSBmcmFtZSAod29yZCkgYW5kIHRoZSBtbWMgaW5mbyAoU05SICYgcXVhbCkuCisgICAgICAgKiBJdCdzIGJlY2F1c2UgdGhlIGxlbmd0aCBpcyBhdCB0aGUgZW5kIHRoYXQgd2UgY2FuIG9ubHkgc2NhbgorICAgICAgICogZnJhbWVzIGJhY2t3YXJkLiAqLworCisgICAgICAvKiBGaW5kIHRoZSBmaXJzdCBmcmFtZSBieSBza2lwcGluZyBiYWNrd2FyZHMgb3ZlciB0aGUgZnJhbWVzICovCisgICAgICBycCA9IG5ld3JmcDsJLyogRW5kIG9mIGxhc3QgZnJhbWUgKi8KKyAgICAgIHdoaWxlKCgoZl9zdGFydCA9IHd2X3N0YXJ0X29mX2ZyYW1lKGRldiwgcnAsIG5ld3JmcCkpICE9IGxwLT5yZnApICYmCisJICAgIChmX3N0YXJ0ICE9IC0xKSkKKwkgIHJwID0gZl9zdGFydDsKKworICAgICAgLyogSWYgd2UgaGFkIGEgcHJvYmxlbSAqLworICAgICAgaWYoZl9zdGFydCA9PSAtMSkKKwl7CisjaWZkZWYgREVCVUdfUlhfRVJST1IKKwkgIHByaW50ayhLRVJOX0lORk8gIndhdmVsYW5fY3M6IGNhbm5vdCBmaW5kIHN0YXJ0IG9mIGZyYW1lICIpOworCSAgcHJpbnRrKCIgaTU5M19yZnAgJWQgc3RvcCAlZCBuZXdyZnAgJWQgbHAtPnJmcCAlZFxuIiwKKwkJIGk1OTNfcmZwLCBscC0+c3RvcCwgbmV3cmZwLCBscC0+cmZwKTsKKyNlbmRpZgorCSAgbHAtPnJmcCA9IHJwOwkJLyogR2V0IHRvIHRoZSBsYXN0IHVzYWJsZSBmcmFtZSAqLworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBmX3N0YXJ0IHBvaW50IHRvIHRoZSBiZWdnaW5pbmcgb2YgdGhlIGZpcnN0IGZyYW1lIHJlY2VpdmVkCisgICAgICAgKiBhbmQgcnAgdG8gdGhlIGJlZ2dpbmluZyBvZiB0aGUgbmV4dCBvbmUgKi8KKworICAgICAgLyogUmVhZCBzdGF0dXMgJiBsZW5ndGggb2YgdGhlIGZyYW1lICovCisgICAgICBzdGF0X3B0ciA9IChycCAtIDcgKyBSWF9TSVpFKSAlIFJYX1NJWkU7CisgICAgICBzdGF0X3B0ciA9IHJlYWRfcmluZ2J1ZihkZXYsIHN0YXRfcHRyLCBjLCA0KTsKKyAgICAgIHN0YXR1cyA9IGNbMF0gfCAoY1sxXSA8PCA4KTsKKyAgICAgIGxlbiA9IGNbMl0gfCAoY1szXSA8PCA4KTsKKworICAgICAgLyogQ2hlY2sgc3RhdHVzICovCisgICAgICBpZigoc3RhdHVzICYgUlhfUkNWX09LKSAhPSBSWF9SQ1ZfT0spCisJeworCSAgbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCSAgaWYoc3RhdHVzICYgUlhfTk9fU0ZEKQorCSAgICBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJICBpZihzdGF0dXMgJiBSWF9DUkNfRVJSKQorCSAgICBscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCSAgaWYoc3RhdHVzICYgUlhfT1ZSUlVOKQorCSAgICBscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKworI2lmZGVmIERFQlVHX1JYX0ZBSUwKKwkgIHByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfcGFja2V0X3JjdigpOiBwYWNrZXQgbm90IHJlY2VpdmVkIG9rLCBzdGF0dXMgPSAweCV4XG4iLAorCQkgZGV2LT5uYW1lLCBzdGF0dXMpOworI2VuZGlmCisJfQorICAgICAgZWxzZQorCS8qIFJlYWQgdGhlIHBhY2tldCBhbmQgdHJhbnNtaXQgdG8gTGludXggKi8KKwl3dl9wYWNrZXRfcmVhZChkZXYsIGZfc3RhcnQsIGxlbiAtIDIpOworCisgICAgICAvKiBPbmUgZnJhbWUgaGFzIGJlZW4gcHJvY2Vzc2VkLCBza2lwIGl0ICovCisgICAgICBscC0+cmZwID0gcnA7CisgICAgfQorCisgIC8qCisgICAqIFVwZGF0ZSB0aGUgZnJhbWUgc3RvcCByZWdpc3RlciwgYnV0IHNldCBpdCB0byBsZXNzIHRoYW4KKyAgICogdGhlIGZ1bGwgOEsgdG8gYWxsb3cgc3BhY2UgZm9yIDMgYnl0ZXMgb2Ygc2lnbmFsIHN0cmVuZ3RoCisgICAqIHBlciBwYWNrZXQuCisgICAqLworICBscC0+c3RvcCA9IChpNTkzX3JmcCArIFJYX1NJWkUgLSAoKFJYX1NJWkUgLyA2NCkgKiAzKSkgJSBSWF9TSVpFOworICBvdXRiKE9QMF9TV0lUX1RPX1BPUlRfMSB8IENSMF9DSE5MLCBMQ0NSKGJhc2UpKTsKKyAgb3V0YihDUjFfU1RPUF9SRUdfVVBEQVRFIHwgKGxwLT5zdG9wID4+IFJYX1NJWkVfU0hJRlQpLCBMQ0NSKGJhc2UpKTsKKyAgb3V0YihPUDFfU1dJVF9UT19QT1JUXzAsIExDQ1IoYmFzZSkpOworCisjaWZkZWYgREVCVUdfUlhfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X3BhY2tldF9yY3YoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKiogUEFDS0VUIFRSQU5TTUlTU0lPTiAqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIHBhcnQgZGVhbCB3aXRoIHNlbmRpbmcgcGFja2V0IHRocm91Z2ggdGhlIHdhdmVsYW4KKyAqIFdlIGNvcHkgdGhlIHBhY2tldCB0byB0aGUgc2VuZCBidWZmZXIgYW5kIHRoZW4gaXNzdWUgdGhlIHNlbmQKKyAqIGNvbW1hbmQgdG8gdGhlIGk4MjU5My4gVGhlIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbiB3aWxsIGJlCisgKiBjaGVja2VkIGluIHdhdmVsYW5faW50ZXJydXB0KCkKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIGZpbGxzIGluIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlcnMgYW5kIG1lbW9yeQorICogbG9jYXRpb25zIG9uIHRoZSBXYXZlTEFOIGNhcmQgYW5kIHN0YXJ0cyB0aGUgY2FyZCBvZmYgb24KKyAqIHRoZSB0cmFuc21pdC4KKyAqIChjYWxsZWQgaW4gd2F2ZWxhbl9wYWNrZXRfeG1pdCgpKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3d2X3BhY2tldF93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkJdm9pZCAqCQlidWYsCisJCXNob3J0CQlsZW5ndGgpCit7CisgIG5ldF9sb2NhbCAqCQlscCA9IG5ldGRldl9wcml2KGRldik7CisgIGtpb19hZGRyX3QJCWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisgIGludAkJCWNsZW4gPSBsZW5ndGg7CisgIHJlZ2lzdGVyIHVfc2hvcnQJeG10ZGF0YV9iYXNlID0gVFhfQkFTRTsKKworI2lmZGVmIERFQlVHX1RYX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9wYWNrZXRfd3JpdGUoJWQpXG4iLCBkZXYtPm5hbWUsIGxlbmd0aCk7CisjZW5kaWYKKworICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgLyogV3JpdGUgdGhlIGxlbmd0aCBvZiBkYXRhIGJ1ZmZlciBmb2xsb3dlZCBieSB0aGUgYnVmZmVyICovCisgIG91dGIoeG10ZGF0YV9iYXNlICYgMHhmZiwgUElPUkwoYmFzZSkpOworICBvdXRiKCgoeG10ZGF0YV9iYXNlID4+IDgpICYgUElPUkhfTUFTSykgfCBQSU9SSF9TRUxfVFgsIFBJT1JIKGJhc2UpKTsKKyAgb3V0YihjbGVuICYgMHhmZiwgUElPUChiYXNlKSk7CS8qIGxzYiAqLworICBvdXRiKGNsZW4gPj4gOCwgUElPUChiYXNlKSk7ICAJLyogbXNiICovCisKKyAgLyogU2VuZCB0aGUgZGF0YSAqLworICBvdXRzYihQSU9QKGJhc2UpLCBidWYsIGNsZW4pOworCisgIC8qIEluZGljYXRlIGVuZCBvZiB0cmFuc21pdCBjaGFpbiAqLworICBvdXRiKE9QMF9OT1AsIFBJT1AoYmFzZSkpOworICAvKiBqb3N1bGx2bkBjcy5jbXUuZWR1OiBuZWVkIHRvIHNlbmQgYSBzZWNvbmQgTk9QIGZvciBhbGlnbm1lbnQuLi4gKi8KKyAgb3V0YihPUDBfTk9QLCBQSU9QKGJhc2UpKTsKKworICAvKiBSZXNldCB0aGUgdHJhbnNtaXQgRE1BIHBvaW50ZXIgKi8KKyAgaGFjcl93cml0ZV9zbG93KGJhc2UsIEhBQ1JfUFdSX1NUQVQgfCBIQUNSX1RYX0RNQV9SRVNFVCk7CisgIGhhY3Jfd3JpdGUoYmFzZSwgSEFDUl9ERUZBVUxUKTsKKyAgLyogU2VuZCB0aGUgdHJhbnNtaXQgY29tbWFuZCAqLworICB3dl84MjU5M19jbWQoZGV2LCAid3ZfcGFja2V0X3dyaXRlKCk6IHRyYW5zbWl0IiwKKwkgICAgICAgT1AwX1RSQU5TTUlULCBTUjBfTk9fUkVTVUxUKTsKKworICAvKiBNYWtlIHN1cmUgdGhlIHdhdGNoZG9nIHdpbGwga2VlcCBxdWlldCBmb3IgYSB3aGlsZSAqLworICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworICAvKiBLZWVwIHN0YXRzIHVwIHRvIGRhdGUgKi8KKyAgbHAtPnN0YXRzLnR4X2J5dGVzICs9IGxlbmd0aDsKKworICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworI2lmZGVmIERFQlVHX1RYX0lORk8KKyAgd3ZfcGFja2V0X2luZm8oKHVfY2hhciAqKSBidWYsIGxlbmd0aCwgZGV2LT5uYW1lLCAid3ZfcGFja2V0X3dyaXRlIik7CisjZW5kaWYJLyogREVCVUdfVFhfSU5GTyAqLworCisjaWZkZWYgREVCVUdfVFhfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X3BhY2tldF93cml0ZSgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gd2Ugd2FudCB0byBzZW5kIGEgcGFja2V0IChORVQzIGNhbGxiYWNrKQorICogSW4gdGhpcyByb3V0aW5lLCB3ZSBjaGVjayBpZiB0aGUgaGFyd2FyZSBpcyByZWFkeSB0byBhY2NlcHQKKyAqIHRoZSBwYWNrZXQuIFdlIGFsc28gcHJldmVudCByZWVudHJhbmNlLiBUaGVuLCB3ZSBjYWxsIHRoZSBmdW5jdGlvbgorICogdG8gc2VuZCB0aGUgcGFja2V0Li4uCisgKi8KK3N0YXRpYyBpbnQKK3dhdmVsYW5fcGFja2V0X3htaXQoc3RydWN0IHNrX2J1ZmYgKglza2IsCisJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqCQlkZXYpCit7CisgIG5ldF9sb2NhbCAqCQlscCA9IG5ldGRldl9wcml2KGRldik7CisgIHVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisjaWZkZWYgREVCVUdfVFhfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5fcGFja2V0X3htaXQoMHglWClcbiIsIGRldi0+bmFtZSwKKwkgKHVuc2lnbmVkKSBza2IpOworI2VuZGlmCisKKyAgLyoKKyAgICogQmxvY2sgYSB0aW1lci1iYXNlZCB0cmFuc21pdCBmcm9tIG92ZXJsYXBwaW5nIGEgcHJldmlvdXMgdHJhbnNtaXQuCisgICAqIEluIG90aGVyIHdvcmRzLCBwcmV2ZW50IHJlZW50ZXJpbmcgdGhpcyByb3V0aW5lLgorICAgKi8KKyAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgIC8qIElmIHNvbWVib2R5IGhhcyBhc2tlZCB0byByZWNvbmZpZ3VyZSB0aGUgY29udHJvbGxlciwKKyAgICogd2UgY2FuIGRvIGl0IG5vdyAqLworICBpZihscC0+cmVjb25maWdfODI1OTMpCisgICAgeworICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKyAgICAgIHd2XzgyNTkzX2NvbmZpZyhkZXYpOworICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CS8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzICovCisgICAgICAvKiBOb3RlIDogdGhlIGNvbmZpZ3VyZSBwcm9jZWR1cmUgd2FzIHRvdGFsbHkgc3luY2hyb25vdXMsCisgICAgICAgKiBzbyB0aGUgVHggYnVmZmVyIGlzIG5vdyBmcmVlICovCisgICAgfQorCisjaWZkZWYgREVCVUdfVFhfRVJST1IKKwlpZiAoc2tiLT5uZXh0KQorCQlwcmludGsoS0VSTl9JTkZPICJza2IgaGFzIG5leHRcbiIpOworI2VuZGlmCisKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHNvbWUgcGFkZGluZyAqLworCS8qIE5vdGUgOiBvbiB3aXJlbGVzcyB0aGUgcHJvcGFnYXRpb24gdGltZSBpcyBpbiB0aGUgb3JkZXIgb2YgMXVzLAorCSAqIGFuZCB3ZSBkb24ndCBoYXZlIHRoZSBFdGhlcm5ldCBzcGVjaWZpYyByZXF1aXJlbWVudCBvZiBiZWVpbmcKKwkgKiBhYmxlIHRvIGRldGVjdCBjb2xsaXNpb25zLCB0aGVyZWZvcmUgaW4gdGhlb3J5IHdlIGRvbid0IHJlYWxseQorCSAqIG5lZWQgdG8gcGFkLiBKZWFuIElJICovCisJaWYgKHNrYi0+bGVuIDwgRVRIX1pMRU4pIHsKKwkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwl9CisKKyAgd3ZfcGFja2V0X3dyaXRlKGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKyAgZGV2X2tmcmVlX3NrYihza2IpOworCisjaWZkZWYgREVCVUdfVFhfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fcGFja2V0X3htaXQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqIEhBUkRXQVJFIENPTkZJR1VSQVRJT04gKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIHBhcnQgZG8gdGhlIHJlYWwgam9iIG9mIHN0YXJ0aW5nIGFuZCBjb25maWd1cmluZyB0aGUgaGFyZHdhcmUuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJvdXRpbmUgdG8gaW5pdGlhbGl6ZSB0aGUgTW9kZW0gTWFuYWdlbWVudCBDb250cm9sbGVyLgorICogKGNhbGxlZCBieSB3dl9od19jb25maWcoKSkKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3d2X21tY19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgcHNhX3QJCXBzYTsKKyAgbW13X3QJCW07CisgIGludAkJY29uZmlndXJlZDsKKyAgaW50CQlpOwkJLyogTG9vcCBjb3VudGVyICovCisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X21tY19pbml0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICAvKiBSZWFkIHRoZSBwYXJhbWV0ZXIgc3RvcmFnZSBhcmVhICovCisgIHBzYV9yZWFkKGRldiwgMCwgKHVuc2lnbmVkIGNoYXIgKikgJnBzYSwgc2l6ZW9mKHBzYSkpOworCisgIC8qCisgICAqIENoZWNrIHRoZSBmaXJzdCB0aHJlZSBvY3RldHMgb2YgdGhlIE1BQyBhZGRyIGZvciB0aGUgbWFudWZhY3R1cmVyJ3MgY29kZS4KKyAgICogTm90ZTogSWYgeW91IGdldCB0aGUgZXJyb3IgbWVzc2FnZSBiZWxvdywgeW91J3ZlIGdvdCBhCisgICAqIG5vbi1OQ1IvQVQmVC9MdWNlbnQgUENNQ0lBIGNhcmRzLCBzZWUgd2F2ZWxhbl9jcy5oIGZvciBkZXRhaWwgb24KKyAgICogaG93IHRvIGNvbmZpZ3VyZSB5b3VyIGNhcmQuLi4KKyAgICovCisgIGZvcihpID0gMDsgaSA8IChzaXplb2YoTUFDX0FERFJFU1NFUykgLyBzaXplb2YoY2hhcikgLyAzKTsgaSsrKQorICAgIGlmKChwc2EucHNhX3VuaXZfbWFjX2FkZHJbMF0gPT0gTUFDX0FERFJFU1NFU1tpXVswXSkgJiYKKyAgICAgICAocHNhLnBzYV91bml2X21hY19hZGRyWzFdID09IE1BQ19BRERSRVNTRVNbaV1bMV0pICYmCisgICAgICAgKHBzYS5wc2FfdW5pdl9tYWNfYWRkclsyXSA9PSBNQUNfQUREUkVTU0VTW2ldWzJdKSkKKyAgICAgIGJyZWFrOworCisgIC8qIElmIHdlIGhhdmUgbm90IGZvdW5kIGl0Li4uICovCisgIGlmKGkgPT0gKHNpemVvZihNQUNfQUREUkVTU0VTKSAvIHNpemVvZihjaGFyKSAvIDMpKQorICAgIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1JTCisgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogd3ZfbW1jX2luaXQoKTogSW52YWxpZCBNQUMgYWRkcmVzczogJTAyWDolMDJYOiUwMlg6Li4uXG4iLAorCSAgICAgZGV2LT5uYW1lLCBwc2EucHNhX3VuaXZfbWFjX2FkZHJbMF0sCisJICAgICBwc2EucHNhX3VuaXZfbWFjX2FkZHJbMV0sIHBzYS5wc2FfdW5pdl9tYWNfYWRkclsyXSk7CisjZW5kaWYKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogR2V0IHRoZSBNQUMgYWRkcmVzcyAqLworICBtZW1jcHkoJmRldi0+ZGV2X2FkZHJbMF0sICZwc2EucHNhX3VuaXZfbWFjX2FkZHJbMF0sIFdBVkVMQU5fQUREUl9TSVpFKTsKKworI2lmZGVmIFVTRV9QU0FfQ09ORklHCisgIGNvbmZpZ3VyZWQgPSBwc2EucHNhX2NvbmZfc3RhdHVzICYgMTsKKyNlbHNlCisgIGNvbmZpZ3VyZWQgPSAwOworI2VuZGlmCisKKyAgLyogSXMgdGhlIFBTQSBpcyBub3QgY29uZmlndXJlZCAqLworICBpZighY29uZmlndXJlZCkKKyAgICB7CisgICAgICAvKiBVc2VyIHdpbGwgYmUgYWJsZSB0byBjb25maWd1cmUgTldJRCBhZnRlciAod2l0aCBpd2NvbmZpZykgKi8KKyAgICAgIHBzYS5wc2FfbndpZFswXSA9IDA7CisgICAgICBwc2EucHNhX253aWRbMV0gPSAwOworCisgICAgICAvKiBBcyBOV0lEIGlzIG5vdCBzZXQgOiBubyBOV0lEIGNoZWNraW5nICovCisgICAgICBwc2EucHNhX253aWRfc2VsZWN0ID0gMDsKKworICAgICAgLyogRGlzYWJsZSBlbmNyeXB0aW9uICovCisgICAgICBwc2EucHNhX2VuY3J5cHRpb25fc2VsZWN0ID0gMDsKKworICAgICAgLyogU2V0IHRvIHN0YW5kYXJkIHZhbHVlcworICAgICAgICogMHgwNCBmb3IgQVQsCisgICAgICAgKiAweDAxIGZvciBNQ0EsCisgICAgICAgKiAweDA0IGZvciBQQ01DSUEgYW5kIDIuMDAgY2FyZCAoQVQmVCA0MDctMDI0Njg5L0UgZG9jdW1lbnQpCisgICAgICAgKi8KKyAgICAgIGlmIChwc2EucHNhX2NvbXBfbnVtYmVyICYgMSkKKwlwc2EucHNhX3Rocl9wcmVfc2V0ID0gMHgwMTsKKyAgICAgIGVsc2UKKwlwc2EucHNhX3Rocl9wcmVfc2V0ID0gMHgwNDsKKyAgICAgIHBzYS5wc2FfcXVhbGl0eV90aHIgPSAweDAzOworCisgICAgICAvKiBJdCBpcyBjb25maWd1cmVkICovCisgICAgICBwc2EucHNhX2NvbmZfc3RhdHVzIHw9IDE7CisKKyNpZmRlZiBVU0VfUFNBX0NPTkZJRworICAgICAgLyogV3JpdGUgdGhlIHBzYSAqLworICAgICAgcHNhX3dyaXRlKGRldiwgKGNoYXIgKilwc2EucHNhX253aWQgLSAoY2hhciAqKSZwc2EsCisJCSh1bnNpZ25lZCBjaGFyICopcHNhLnBzYV9ud2lkLCA0KTsKKyAgICAgIHBzYV93cml0ZShkZXYsIChjaGFyICopJnBzYS5wc2FfdGhyX3ByZV9zZXQgLSAoY2hhciAqKSZwc2EsCisJCSh1bnNpZ25lZCBjaGFyICopJnBzYS5wc2FfdGhyX3ByZV9zZXQsIDEpOworICAgICAgcHNhX3dyaXRlKGRldiwgKGNoYXIgKikmcHNhLnBzYV9xdWFsaXR5X3RociAtIChjaGFyICopJnBzYSwKKwkJKHVuc2lnbmVkIGNoYXIgKikmcHNhLnBzYV9xdWFsaXR5X3RociwgMSk7CisgICAgICBwc2Ffd3JpdGUoZGV2LCAoY2hhciAqKSZwc2EucHNhX2NvbmZfc3RhdHVzIC0gKGNoYXIgKikmcHNhLAorCQkodW5zaWduZWQgY2hhciAqKSZwc2EucHNhX2NvbmZfc3RhdHVzLCAxKTsKKyAgICAgIC8qIHVwZGF0ZSB0aGUgV2F2ZWxhbiBjaGVja3N1bSAqLworICAgICAgdXBkYXRlX3BzYV9jaGVja3N1bShkZXYpOworI2VuZGlmCS8qIFVTRV9QU0FfQ09ORklHICovCisgICAgfQorCisgIC8qIFplcm8gdGhlIG1tYyBzdHJ1Y3R1cmUgKi8KKyAgbWVtc2V0KCZtLCAweDAwLCBzaXplb2YobSkpOworCisgIC8qIENvcHkgUFNBIGluZm8gdG8gdGhlIG1tYyAqLworICBtLm1td19uZXR3X2lkX2wgPSBwc2EucHNhX253aWRbMV07CisgIG0ubW13X25ldHdfaWRfaCA9IHBzYS5wc2FfbndpZFswXTsKKyAgCisgIGlmKHBzYS5wc2FfbndpZF9zZWxlY3QgJiAxKQorICAgIG0ubW13X2xvb3B0X3NlbCA9IDB4MDA7CisgIGVsc2UKKyAgICBtLm1td19sb29wdF9zZWwgPSBNTVdfTE9PUFRfU0VMX0RJU19OV0lEOworCisgIG1lbWNweSgmbS5tbXdfZW5jcl9rZXksICZwc2EucHNhX2VuY3J5cHRpb25fa2V5LCAKKwkgc2l6ZW9mKG0ubW13X2VuY3Jfa2V5KSk7CisKKyAgaWYocHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCkKKyAgICBtLm1td19lbmNyX2VuYWJsZSA9IE1NV19FTkNSX0VOQUJMRV9FTiB8IE1NV19FTkNSX0VOQUJMRV9NT0RFOworICBlbHNlCisgICAgbS5tbXdfZW5jcl9lbmFibGUgPSAwOworCisgIG0ubW13X3Rocl9wcmVfc2V0ID0gcHNhLnBzYV90aHJfcHJlX3NldCAmIDB4M0Y7CisgIG0ubW13X3F1YWxpdHlfdGhyID0gcHNhLnBzYV9xdWFsaXR5X3RociAmIDB4MEY7CisKKyAgLyoKKyAgICogU2V0IGRlZmF1bHQgbW9kZW0gY29udHJvbCBwYXJhbWV0ZXJzLgorICAgKiBTZWUgTkNSIGRvY3VtZW50IDQwNy0wMDI0MzI2IFJldi4gQS4KKyAgICovCisgIG0ubW13X2phYmJlcl9lbmFibGUgPSAweDAxOworICBtLm1td19hbnRlbl9zZWwgPSBNTVdfQU5URU5fU0VMX0FMR19FTjsKKyAgbS5tbXdfaWZzID0gMHgyMDsKKyAgbS5tbXdfbW9kX2RlbGF5ID0gMHgwNDsKKyAgbS5tbXdfamFtX3RpbWUgPSAweDM4OworCisgIG0ubW13X2Rlc19pb19pbnZlcnQgPSAwOworICBtLm1td19mcmVlemUgPSAwOworICBtLm1td19kZWNheV9wcm0gPSAwOworICBtLm1td19kZWNheV91cGRhdF9wcm0gPSAwOworCisgIC8qIFdyaXRlIGFsbCBpbmZvIHRvIG1tYyAqLworICBtbWNfd3JpdGUoYmFzZSwgMCwgKHVfY2hhciAqKSZtLCBzaXplb2YobSkpOworCisgIC8qIFRoZSBmb2xsb3dpbmcgY29kZSBzdGFydCB0aGUgbW9kZW0gb2YgdGhlIDIuMDAgZnJlcXVlbmN5CisgICAqIHNlbGVjdGFibGUgY2FyZHMgYXQgcG93ZXIgb24uIEl0J3Mgbm90IHN0cmljdGx5IG5lZWRlZCBmb3IgdGhlCisgICAqIGZvbGxvd2luZyBib290cy4uLgorICAgKiBUaGUgb3JpZ2luYWwgcGF0Y2ggd2FzIGJ5IEpvZSBGaW5uZXkgZm9yIHRoZSBQQ01DSUEgZHJpdmVyLCBidXQKKyAgICogSSd2ZSBjbGVhbmVkIGl0IGEgYml0IGFuZCBhZGQgZG9jdW1lbnRhdGlvbi4KKyAgICogVGhhbmtzIHRvIExvZWtlIEJyZWRlcnZlbGQgZnJvbSBMdWNlbnQgZm9yIHRoZSBpbmZvLgorICAgKi8KKworICAvKiBBdHRlbXB0IHRvIHJlY29nbmlzZSAyLjAwIGNhcmRzICgyLjQgR0h6IGZyZXF1ZW5jeSBzZWxlY3RhYmxlKQorICAgKiAoZG9lcyBpdCB3b3JrIGZvciBldmVyeWJvZHkgPyAtIGVzcGVjaWFsbHkgb2xkIGNhcmRzLi4uKSAqLworICAvKiBOb3RlIDogV0ZSRVFTRUwgdmVyaWZ5IHRoYXQgaXQgaXMgYWJsZSB0byByZWFkIGZyb20gRUVwcm9tCisgICAqIGEgc2Vuc2libGUgZnJlcXVlbmN5IChhZGRyZXNzIDB4MDApICsgdGhhdCBNTVJfRkVFX1NUQVRVU19JRAorICAgKiBpcyAweEEgKFhpbGlueCB2ZXJzaW9uKSBvciAweEIgKEFyaWFkbmUgdmVyc2lvbikuCisgICAqIE15IHRlc3QgaXMgbW9yZSBjcnVkZSBidXQgZG8gd29yay4uLiAqLworICBpZighKG1tY19pbihiYXNlLCBtbXJvZmYoMCwgbW1yX2ZlZV9zdGF0dXMpKSAmCisgICAgICAgKE1NUl9GRUVfU1RBVFVTX0RXTEQgfCBNTVJfRkVFX1NUQVRVU19CVVNZKSkpCisgICAgeworICAgICAgLyogV2UgbXVzdCBkb3dubG9hZCB0aGUgZnJlcXVlbmN5IHBhcmFtZXRlcnMgdG8gdGhlCisgICAgICAgKiBzeW50aGV0aXNlcnMgKGZyb20gdGhlIEVFcHJvbSAtIGFyZWEgMSkKKyAgICAgICAqIE5vdGUgOiBhcyB0aGUgRUVwcm9tIGlzIGF1dG8gZGVjcmVtZW50ZWQsIHdlIHNldCB0aGUgZW5kCisgICAgICAgKiBpZiB0aGUgYXJlYS4uLiAqLworICAgICAgbS5tbXdfZmVlX2FkZHIgPSAweDBGOworICAgICAgbS5tbXdfZmVlX2N0cmwgPSBNTVdfRkVFX0NUUkxfUkVBRCB8IE1NV19GRUVfQ1RSTF9EV0xEOworICAgICAgbW1jX3dyaXRlKGJhc2UsIChjaGFyICopJm0ubW13X2ZlZV9jdHJsIC0gKGNoYXIgKikmbSwKKwkJKHVuc2lnbmVkIGNoYXIgKikmbS5tbXdfZmVlX2N0cmwsIDIpOworCisgICAgICAvKiBXYWl0IHVudGlsIHRoZSBkb3dubG9hZCBpcyBmaW5pc2hlZCAqLworICAgICAgZmVlX3dhaXQoYmFzZSwgMTAwLCAxMDApOworCisjaWZkZWYgREVCVUdfQ09ORklHX0lORk8KKyAgICAgIC8qIFRoZSBmcmVxdWVuY3kgd2FzIGluIHRoZSBsYXN0IHdvcmQgZG93bmxvYWRlZC4uLiAqLworICAgICAgbW1jX3JlYWQoYmFzZSwgKGNoYXIgKikmbS5tbXdfZmVlX2RhdGFfbCAtIChjaGFyICopJm0sCisJICAgICAgICh1bnNpZ25lZCBjaGFyICopJm0ubW13X2ZlZV9kYXRhX2wsIDIpOworCisgICAgICAvKiBQcmludCBzb21lIGluZm8gZm9yIHRoZSB1c2VyICovCisgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IFdhdmVsYW4gMi4wMCByZWNvZ25pc2VkIChmcmVxdWVuY3kgc2VsZWN0KSA6IEN1cnJlbnQgZnJlcXVlbmN5ID0gJWxkXG4iLAorCSAgICAgZGV2LT5uYW1lLAorCSAgICAgKChtLm1td19mZWVfZGF0YV9oIDw8IDQpIHwKKwkgICAgICAobS5tbXdfZmVlX2RhdGFfbCA+PiA0KSkgKiA1IC8gMiArIDI0MDAwTCk7CisjZW5kaWYKKworICAgICAgLyogV2UgbXVzdCBub3cgZG93bmxvYWQgdGhlIHBvd2VyIGFkanVzdCB2YWx1ZSAoZ2FpbikgdG8KKyAgICAgICAqIHRoZSBzeW50aGV0aXNlcnMgKGZyb20gdGhlIEVFcHJvbSAtIGFyZWEgNyAtIERBQykgKi8KKyAgICAgIG0ubW13X2ZlZV9hZGRyID0gMHg2MTsKKyAgICAgIG0ubW13X2ZlZV9jdHJsID0gTU1XX0ZFRV9DVFJMX1JFQUQgfCBNTVdfRkVFX0NUUkxfRFdMRDsKKyAgICAgIG1tY193cml0ZShiYXNlLCAoY2hhciAqKSZtLm1td19mZWVfY3RybCAtIChjaGFyICopJm0sCisJCSh1bnNpZ25lZCBjaGFyICopJm0ubW13X2ZlZV9jdHJsLCAyKTsKKworICAgICAgLyogV2FpdCB1bnRpbCB0aGUgZG93bmxvYWQgaXMgZmluaXNoZWQgKi8KKyAgICB9CS8qIGlmIDIuMDAgY2FyZCAqLworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl9tbWNfaW5pdCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisgIHJldHVybiBUUlVFOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUm91dGluZSB0byBncmFjZWZ1bGx5IHR1cm4gb2ZmIHJlY2VwdGlvbiwgYW5kIHdhaXQgZm9yIGFueSBjb21tYW5kcworICogdG8gY29tcGxldGUuCisgKiAoY2FsbGVkIGluIHd2X3J1X3N0YXJ0KCkgYW5kIHdhdmVsYW5fY2xvc2UoKSBhbmQgd2F2ZWxhbl9ldmVudCgpKQorICovCitzdGF0aWMgaW50Cit3dl9ydV9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgbmV0X2xvY2FsICoJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICB1bnNpZ25lZCBsb25nCWZsYWdzOworICBpbnQJCXN0YXR1czsKKyAgaW50CQlzcGluOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9ydV9zdG9wKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgLyogRmlyc3QsIHNlbmQgdGhlIExBTiBjb250cm9sbGVyIGEgc3RvcCByZWNlaXZlIGNvbW1hbmQgKi8KKyAgd3ZfODI1OTNfY21kKGRldiwgInd2X2dyYWNlZnVsX3NodXRkb3duKCk6IHN0b3AtcmN2IiwKKwkgICAgICAgT1AwX1NUT1BfUkNWLCBTUjBfTk9fUkVTVUxUKTsKKworICAvKiBUaGVuLCBzcGluIHVudGlsIHRoZSByZWNlaXZlIHVuaXQgZ29lcyBpZGxlICovCisgIHNwaW4gPSAzMDA7CisgIGRvCisgICAgeworICAgICAgdWRlbGF5KDEwKTsKKyAgICAgIG91dGIoT1AwX05PUCB8IENSMF9TVEFUVVNfMywgTENDUihiYXNlKSk7CisgICAgICBzdGF0dXMgPSBpbmIoTENTUihiYXNlKSk7CisgICAgfQorICB3aGlsZSgoKHN0YXR1cyAmIFNSM19SQ1ZfU1RBVEVfTUFTSykgIT0gU1IzX1JDVl9JRExFKSAmJiAoc3Bpbi0tID4gMCkpOworCisgIC8qIE5vdywgc3BpbiB1bnRpbCB0aGUgY2hpcCBmaW5pc2hlcyBleGVjdXRpbmcgaXRzIGN1cnJlbnQgY29tbWFuZCAqLworICBkbworICAgIHsKKyAgICAgIHVkZWxheSgxMCk7CisgICAgICBvdXRiKE9QMF9OT1AgfCBDUjBfU1RBVFVTXzMsIExDQ1IoYmFzZSkpOworICAgICAgc3RhdHVzID0gaW5iKExDU1IoYmFzZSkpOworICAgIH0KKyAgd2hpbGUoKChzdGF0dXMgJiBTUjNfRVhFQ19TVEFURV9NQVNLKSAhPSBTUjNfRVhFQ19JRExFKSAmJiAoc3Bpbi0tID4gMCkpOworCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisgIC8qIElmIHRoZXJlIHdhcyBhIHByb2JsZW0gKi8KKyAgaWYoc3BpbiA8PSAwKQorICAgIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1JTCisgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogd3ZfcnVfc3RvcCgpOiBUaGUgY2hpcCBkb2Vzbid0IHdhbnQgdG8gc3RvcC4uLlxuIiwKKwkgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X3J1X3N0b3AoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4gVFJVRTsKK30gLyogd3ZfcnVfc3RvcCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIHN0YXJ0cyB0aGUgcmVjZWl2ZSB1bml0IHJ1bm5pbmcuICBGaXJzdCwgaXQgY2hlY2tzIGlmCisgKiB0aGUgY2FyZCBpcyBhY3R1YWxseSByZWFkeS4gVGhlbiB0aGUgY2FyZCBpcyBpbnN0cnVjdGVkIHRvIHJlY2VpdmUKKyAqIHBhY2tldHMgYWdhaW4uCisgKiAoY2FsbGVkIGluIHd2X2h3X3Jlc2V0KCkgJiB3YXZlbGFuX29wZW4oKSkKKyAqLworc3RhdGljIGludAord3ZfcnVfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisgIGtpb19hZGRyX3QJYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICBuZXRfbG9jYWwgKglscCA9IG5ldGRldl9wcml2KGRldik7CisgIHVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X3J1X3N0YXJ0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICAvKgorICAgKiBXZSBuZWVkIHRvIHN0YXJ0IGZyb20gYSBxdWllc2NlbnQgc3RhdGUuIFRvIGRvIHNvLCB3ZSBjb3VsZCBjaGVjaworICAgKiBpZiB0aGUgY2FyZCBpcyBhbHJlYWR5IHJ1bm5pbmcsIGJ1dCBpbnN0ZWFkIHdlIGp1c3QgdHJ5IHRvIHNodXQKKyAgICogaXQgZG93bi4gRmlyc3QsIHdlIGRpc2FibGUgcmVjZXB0aW9uIChpbiBjYXNlIGl0IHdhcyBhbHJlYWR5IGVuYWJsZWQpLgorICAgKi8KKyAgaWYoIXd2X3J1X3N0b3AoZGV2KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisgIC8qIE5vdyB3ZSBrbm93IHRoYXQgbm8gY29tbWFuZCBpcyBiZWluZyBleGVjdXRlZC4gKi8KKworICAvKiBTZXQgdGhlIHJlY2VpdmUgZnJhbWUgcG9pbnRlciBhbmQgc3RvcCBwb2ludGVyICovCisgIGxwLT5yZnAgPSAwOworICBvdXRiKE9QMF9TV0lUX1RPX1BPUlRfMSB8IENSMF9DSE5MLCBMQ0NSKGJhc2UpKTsKKworICAvKiBSZXNldCByaW5nIG1hbmFnZW1lbnQuICBUaGlzIHNldHMgdGhlIHJlY2VpdmUgZnJhbWUgcG9pbnRlciB0byAxICovCisgIG91dGIoT1AxX1JFU0VUX1JJTkdfTU5HTVQsIExDQ1IoYmFzZSkpOworCisjaWYgMAorICAvKiBYWFggdGhlIGk4MjU5MyBtYW51YWwgcGFnZSA2LTQgc2VlbXMgdG8gaW5kaWNhdGUgdGhhdCB0aGUgc3RvcCByZWdpc3RlcgorICAgICBzaG91bGQgYmUgc2V0IGFzIGJlbG93ICovCisgIC8qIG91dGIoQ1IxX1NUT1BfUkVHX1VQREFURXwoKFJYX1NJWkUgLSAweDQwKT4+IFJYX1NJWkVfU0hJRlQpLExDQ1IoYmFzZSkpOyovCisjZWxpZiAwCisgIC8qIGJ1dCBJIHNldCBpdCAwIGluc3RlYWQgKi8KKyAgbHAtPnN0b3AgPSAwOworI2Vsc2UKKyAgLyogYnV0IEkgc2V0IGl0IHRvIDMgYnl0ZXMgcGVyIHBhY2tldCBsZXNzIHRoYW4gOEsgKi8KKyAgbHAtPnN0b3AgPSAoMCArIFJYX1NJWkUgLSAoKFJYX1NJWkUgLyA2NCkgKiAzKSkgJSBSWF9TSVpFOworI2VuZGlmCisgIG91dGIoQ1IxX1NUT1BfUkVHX1VQREFURSB8IChscC0+c3RvcCA+PiBSWF9TSVpFX1NISUZUKSwgTENDUihiYXNlKSk7CisgIG91dGIoT1AxX0lOVF9FTkFCTEUsIExDQ1IoYmFzZSkpOworICBvdXRiKE9QMV9TV0lUX1RPX1BPUlRfMCwgTENDUihiYXNlKSk7CisKKyAgLyogUmVzZXQgcmVjZWl2ZSBETUEgcG9pbnRlciAqLworICBoYWNyX3dyaXRlX3Nsb3coYmFzZSwgSEFDUl9QV1JfU1RBVCB8IEhBQ1JfVFhfRE1BX1JFU0VUKTsKKyAgaGFjcl93cml0ZV9zbG93KGJhc2UsIEhBQ1JfREVGQVVMVCk7CisKKyAgLyogUmVjZWl2ZSBETUEgb24gY2hhbm5lbCAxICovCisgIHd2XzgyNTkzX2NtZChkZXYsICJ3dl9ydV9zdGFydCgpOiByY3YtZW5hYmxlIiwKKwkgICAgICAgQ1IwX0NITkwgfCBPUDBfUkNWX0VOQUJMRSwgU1IwX05PX1JFU1VMVCk7CisKKyNpZmRlZiBERUJVR19JODI1OTNfU0hPVworICB7CisgICAgaW50CXN0YXR1czsKKyAgICBpbnQJb3ByaTsKKyAgICBpbnQJc3BpbiA9IDEwMDAwOworCisgICAgLyogc3BpbiB1bnRpbCB0aGUgY2hpcCBzdGFydHMgcmVjZWl2aW5nICovCisgICAgZG8KKyAgICAgIHsKKwlvdXRiKE9QMF9OT1AgfCBDUjBfU1RBVFVTXzMsIExDQ1IoYmFzZSkpOworCXN0YXR1cyA9IGluYihMQ1NSKGJhc2UpKTsKKwlpZihzcGluLS0gPD0gMCkKKwkgIGJyZWFrOworICAgICAgfQorICAgIHdoaWxlKCgoc3RhdHVzICYgU1IzX1JDVl9TVEFURV9NQVNLKSAhPSBTUjNfUkNWX0FDVElWRSkgJiYKKwkgICgoc3RhdHVzICYgU1IzX1JDVl9TVEFURV9NQVNLKSAhPSBTUjNfUkNWX1JFQURZKSk7CisgICAgcHJpbnRrKEtFUk5fREVCVUcgInJjdiBzdGF0dXMgaXMgMHgleCBbaTolZF1cbiIsCisJICAgKHN0YXR1cyAmIFNSM19SQ1ZfU1RBVEVfTUFTSyksIGkpOworICB9CisjZW5kaWYKKworICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfcnVfc3RhcnQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4gVFJVRTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoaXMgcm91dGluZSBkb2VzIGEgc3RhbmRhcmQgY29uZmlnIG9mIHRoZSBXYXZlTEFOIGNvbnRyb2xsZXIgKGk4MjU5MykuCisgKiBJbiB0aGUgSVNBIGRyaXZlciwgdGhpcyBpcyBpbnRlZ3JhdGVkIGluIHdhdmVsYW5faGFyZHdhcmVfcmVzZXQoKQorICogKGNhbGxlZCBieSB3dl9od19jb25maWcoKSwgd3ZfODI1OTNfcmVjb25maWcoKSAmIHdhdmVsYW5fcGFja2V0X3htaXQoKSkKKyAqLworc3RhdGljIGludAord3ZfODI1OTNfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBraW9fYWRkcl90CQkJYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICBuZXRfbG9jYWwgKgkJCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgc3RydWN0IGk4MjU5M19jb25mX2Jsb2NrCWNmYmxrOworICBpbnQJCQkJcmV0ID0gVFJVRTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfODI1OTNfY29uZmlnKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICAvKiBDcmVhdGUgJiBmaWxsIGk4MjU5MyBjb25maWcgYmxvY2sKKyAgICoKKyAgICogTm93IGNvbmZvcm0gdG8gV2F2ZWxhbiBkb2N1bWVudCBXQ0lOMDg1QgorICAgKi8KKyAgbWVtc2V0KCZjZmJsaywgMHgwMCwgc2l6ZW9mKHN0cnVjdCBpODI1OTNfY29uZl9ibG9jaykpOworICBjZmJsay5kNm1vZCA9IEZBTFNFOyAgCS8qIFJ1biBpbiBpODI1OTMgYWR2YW5jZWQgbW9kZSAqLworICBjZmJsay5maWZvX2xpbWl0ID0gNTsgICAgICAgICAvKiA9IDU2IEIgcnggYW5kIDQwIEIgdHggZmlmbyB0aHJlc2hvbGRzICovCisgIGNmYmxrLmZvcmduZXNpID0gRkFMU0U7ICAgICAgIC8qIDA9ODJDNTAxLCAxPUFNRDc5OTJCIGNvbXBhdGliaWxpdHkgKi8KKyAgY2ZibGsuZmlmb18zMiA9IDE7CisgIGNmYmxrLnRocm90dGxlX2VuYiA9IEZBTFNFOworICBjZmJsay5jb250aW4gPSBUUlVFOyAgICAgICAgICAvKiBlbmFibGUgY29udGludW91cyBtb2RlICovCisgIGNmYmxrLmNudHJ4aW50ID0gRkFMU0U7ICAgICAgIC8qIGVuYWJsZSBjb250aW51b3VzIG1vZGUgcmVjZWl2ZSBpbnRlcnJ1cHRzICovCisgIGNmYmxrLmFkZHJfbGVuID0gV0FWRUxBTl9BRERSX1NJWkU7CisgIGNmYmxrLmFjbG9jID0gVFJVRTsgICAgICAgICAgIC8qIERpc2FibGUgc291cmNlIGFkZHIgaW5zZXJ0aW9uIGJ5IGk4MjU5MyAqLworICBjZmJsay5wcmVhbWJfbGVuID0gMDsgICAgICAgICAvKiAyIGJ5dGVzIHByZWFtYmxlIChTRkQpICovCisgIGNmYmxrLmxvb3BiYWNrID0gRkFMU0U7CisgIGNmYmxrLmxpbl9wcmlvID0gMDsgICAJLyogY29uZm9ybSB0byA4MDIuMyBiYWNrb2ZmIGFsZ29yaXRtICovCisgIGNmYmxrLmV4cF9wcmlvID0gNTsJICAgICAgICAvKiBjb25mb3JtIHRvIDgwMi4zIGJhY2tvZmYgYWxnb3JpdG0gKi8KKyAgY2ZibGsuYm9mX21ldCA9IDE7CSAgICAgICAgLyogY29uZm9ybSB0byA4MDIuMyBiYWNrb2ZmIGFsZ29yaXRtICovCisgIGNmYmxrLmlmcm1fc3BjID0gMHgyMDsJLyogMzIgYml0IHRpbWVzIGludGVyZnJhbWUgc3BhY2luZyAqLworICBjZmJsay5zbG90dGltX2xvdyA9IDB4MjA7CS8qIDMyIGJpdCB0aW1lcyBzbG90IHRpbWUgKi8KKyAgY2ZibGsuc2xvdHRpbV9oaSA9IDB4MDsKKyAgY2ZibGsubWF4X3JldHIgPSAxNTsKKyAgY2ZibGsucHJtaXNjID0gKChscC0+cHJvbWlzY3VvdXMpID8gVFJVRTogRkFMU0UpOwkvKiBQcm9taXNjdW91cyBtb2RlICovCisgIGNmYmxrLmJjX2RpcyA9IEZBTFNFOyAgICAgICAgIC8qIEVuYWJsZSBicm9hZGNhc3QgcmVjZXB0aW9uICovCisgIGNmYmxrLmNyc18xID0gVFJVRTsJCS8qIFRyYW5zbWl0IHdpdGhvdXQgY2FycmllciBzZW5zZSAqLworICBjZmJsay5ub2NyY19pbnMgPSBGQUxTRTsJLyogaTgyNTkzIGdlbmVyYXRlcyBDUkMgKi8JCisgIGNmYmxrLmNyY18xNjMyID0gRkFMU0U7CS8qIDMyLWJpdCBBdXRvZGluLUlJIENSQyAqLworICBjZmJsay5jcnNfY2R0ID0gRkFMU0U7CS8qIENEIG5vdCB0byBiZSBpbnRlcnByZXRlZCBhcyBDUyAqLworICBjZmJsay5jc19maWx0ZXIgPSAwOyAgCS8qIENTIGlzIHJlY29nbml6ZWQgaW1tZWRpYXRlbHkgKi8KKyAgY2ZibGsuY3JzX3NyYyA9IEZBTFNFOwkvKiBFeHRlcm5hbCBjYXJyaWVyIHNlbnNlICovCisgIGNmYmxrLmNkX2ZpbHRlciA9IDA7ICAJLyogQ0QgaXMgcmVjb2duaXplZCBpbW1lZGlhdGVseSAqLworICBjZmJsay5taW5fZnJfbGVuID0gRVRIX1pMRU4gPj4gMjsgICAgIC8qIE1pbmltdW0gZnJhbWUgbGVuZ3RoIDY0IGJ5dGVzICovCisgIGNmYmxrLmxuZ190eXAgPSBGQUxTRTsJLyogTGVuZ3RoIGZpZWxkID4gMTUwMCA9IHR5cGUgZmllbGQgKi8KKyAgY2ZibGsubG5nX2ZsZCA9IFRSVUU7IAkvKiBEaXNhYmxlIDgwMi4zIGxlbmd0aCBmaWVsZCBjaGVjayAqLworICBjZmJsay5yeGNyY194ZiA9IFRSVUU7CS8qIERvbid0IHRyYW5zZmVyIENSQyB0byBtZW1vcnkgKi8KKyAgY2ZibGsuYXJ0eCA9IFRSVUU7CQkvKiBEaXNhYmxlIGF1dG9tYXRpYyByZXRyYW5zbWlzc2lvbiAqLworICBjZmJsay5zYXJlYyA9IFRSVUU7CQkvKiBEaXNhYmxlIHNvdXJjZSBhZGRyIHRyaWcgb2YgQ0QgKi8KKyAgY2ZibGsudHhfamFiYmVyID0gVFJVRTsJLyogRGlzYWJsZSBqYWJiZXIgamFtIHNlcXVlbmNlICovCisgIGNmYmxrLmhhc2hfMSA9IEZBTFNFOyAJLyogVXNlIGJpdHMgMC01IGluIG1jIGFkZHJlc3MgaGFzaCAqLworICBjZmJsay5sYnBrcG9sID0gVFJVRTsgCS8qIExvb3BiYWNrIHBpbiBhY3RpdmUgaGlnaCAqLworICBjZmJsay5mZHggPSBGQUxTRTsJCS8qIERpc2FibGUgZnVsbCBkdXBsZXggb3BlcmF0aW9uICovCisgIGNmYmxrLmR1bW15XzYgPSAweDNmOyAJLyogYWxsIG9uZXMgKi8KKyAgY2ZibGsubXVsdF9pYSA9IEZBTFNFOwkvKiBObyBtdWx0aXBsZSBpbmRpdmlkdWFsIGFkZHJlc3NlcyAqLworICBjZmJsay5kaXNfYm9mID0gRkFMU0U7CS8qIERpc2FibGUgdGhlIGJhY2tvZmYgYWxnb3JpdGhtID8hICovCisgIGNmYmxrLmR1bW15XzEgPSBUUlVFOyAJLyogc2V0IHRvIDEgKi8KKyAgY2ZibGsudHhfaWZzX3JldHJpZyA9IDM7CS8qIEhtbS4uLiBEaXNhYmxlZCAqLworI2lmZGVmIE1VTFRJQ0FTVF9BTEwKKyAgY2ZibGsubWNfYWxsID0gKGxwLT5hbGxtdWx0aWNhc3QgPyBUUlVFOiBGQUxTRSk7CS8qIEFsbG93IGFsbCBtdWx0aWNhc3RzICovCisjZWxzZQorICBjZmJsay5tY19hbGwgPSBGQUxTRTsJCS8qIE5vIG11bHRpY2FzdCBhbGwgbW9kZSAqLworI2VuZGlmCisgIGNmYmxrLnJjdl9tb24gPSAwOwkJLyogTW9uaXRvciBtb2RlIGRpc2FibGVkICovCisgIGNmYmxrLmZyYWdfYWNwdCA9IFRSVUU7CS8qIERvIG5vdCBhY2NlcHQgZnJhZ21lbnRzICovCisgIGNmYmxrLnRzdHJ0dHJzID0gRkFMU0U7CS8qIE5vIHN0YXJ0IHRyYW5zbWlzc2lvbiB0aHJlc2hvbGQgKi8KKyAgY2ZibGsuZnJldHggPSBUUlVFOwkJLyogRklGTyBhdXRvbWF0aWMgcmV0cmFuc21pc3Npb24gKi8KKyAgY2ZibGsuc3luY3JxcyA9IEZBTFNFOyAJLyogU3luY2hyb25vdXMgRFJRIGRlYXNzZXJ0aW9uLi4uICovCisgIGNmYmxrLnN0dGxlbiA9IFRSVUU7ICAJLyogNiBieXRlIHN0YXR1cyByZWdpc3RlcnMgKi8KKyAgY2ZibGsucnhfZW9wID0gVFJVRTsgIAkvKiBTaWduYWwgRU9QIG9uIHBhY2tldCByZWNlcHRpb24gKi8KKyAgY2ZibGsudHhfZW9wID0gVFJVRTsgIAkvKiBTaWduYWwgRU9QIG9uIHBhY2tldCB0cmFuc21pc3Npb24gKi8KKyAgY2ZibGsucmJ1Zl9zaXplID0gUlhfU0laRT4+MTE7CS8qIFNldCByZWNlaXZlIGJ1ZmZlciBzaXplICovCisgIGNmYmxrLnJjdnN0b3AgPSBUUlVFOyAJLyogRW5hYmxlIFJlY2VpdmUgU3RvcCBSZWdpc3RlciAqLworCisjaWZkZWYgREVCVUdfSTgyNTkzX1NIT1cKKyAgeworICAgIHVfY2hhciAqYyA9ICh1X2NoYXIgKikgJmNmYmxrOworICAgIGludCBpOworICAgIHByaW50ayhLRVJOX0RFQlVHICJ3YXZlbGFuX2NzOiBjb25maWcgYmxvY2s6Iik7CisgICAgZm9yKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCBpODI1OTNfY29uZl9ibG9jayk7IGkrKyxjKyspCisgICAgICB7CisJaWYoKGkgJSAxNikgPT0gMCkgcHJpbnRrKCJcbiIgS0VSTl9ERUJVRyk7CisJcHJpbnRrKCIlMDJ4ICIsICpjKTsKKyAgICAgIH0KKyAgICBwcmludGsoIlxuIik7CisgIH0KKyNlbmRpZgorCisgIC8qIENvcHkgdGhlIGNvbmZpZyBibG9jayB0byB0aGUgaTgyNTkzICovCisgIG91dGIoVFhfQkFTRSAmIDB4ZmYsIFBJT1JMKGJhc2UpKTsKKyAgb3V0YigoKFRYX0JBU0UgPj4gOCkgJiBQSU9SSF9NQVNLKSB8IFBJT1JIX1NFTF9UWCwgUElPUkgoYmFzZSkpOworICBvdXRiKHNpemVvZihzdHJ1Y3QgaTgyNTkzX2NvbmZfYmxvY2spICYgMHhmZiwgUElPUChiYXNlKSk7ICAgIC8qIGxzYiAqLworICBvdXRiKHNpemVvZihzdHJ1Y3QgaTgyNTkzX2NvbmZfYmxvY2spID4+IDgsIFBJT1AoYmFzZSkpOwkvKiBtc2IgKi8KKyAgb3V0c2IoUElPUChiYXNlKSwgKGNoYXIgKikgJmNmYmxrLCBzaXplb2Yoc3RydWN0IGk4MjU5M19jb25mX2Jsb2NrKSk7CisKKyAgLyogcmVzZXQgdHJhbnNtaXQgRE1BIHBvaW50ZXIgKi8KKyAgaGFjcl93cml0ZV9zbG93KGJhc2UsIEhBQ1JfUFdSX1NUQVQgfCBIQUNSX1RYX0RNQV9SRVNFVCk7CisgIGhhY3Jfd3JpdGUoYmFzZSwgSEFDUl9ERUZBVUxUKTsKKyAgaWYoIXd2XzgyNTkzX2NtZChkZXYsICJ3dl84MjU5M19jb25maWcoKTogY29uZmlndXJlIiwKKwkJICAgT1AwX0NPTkZJR1VSRSwgU1IwX0NPTkZJR1VSRV9ET05FKSkKKyAgICByZXQgPSBGQUxTRTsKKworICAvKiBJbml0aWFsaXplIGFkYXB0ZXIncyBldGhlcm5ldCBNQUMgYWRkcmVzcyAqLworICBvdXRiKFRYX0JBU0UgJiAweGZmLCBQSU9STChiYXNlKSk7CisgIG91dGIoKChUWF9CQVNFID4+IDgpICYgUElPUkhfTUFTSykgfCBQSU9SSF9TRUxfVFgsIFBJT1JIKGJhc2UpKTsKKyAgb3V0YihXQVZFTEFOX0FERFJfU0laRSwgUElPUChiYXNlKSk7CS8qIGJ5dGUgY291bnQgbHNiICovCisgIG91dGIoMCwgUElPUChiYXNlKSk7CQkJLyogYnl0ZSBjb3VudCBtc2IgKi8KKyAgb3V0c2IoUElPUChiYXNlKSwgJmRldi0+ZGV2X2FkZHJbMF0sIFdBVkVMQU5fQUREUl9TSVpFKTsKKworICAvKiByZXNldCB0cmFuc21pdCBETUEgcG9pbnRlciAqLworICBoYWNyX3dyaXRlX3Nsb3coYmFzZSwgSEFDUl9QV1JfU1RBVCB8IEhBQ1JfVFhfRE1BX1JFU0VUKTsKKyAgaGFjcl93cml0ZShiYXNlLCBIQUNSX0RFRkFVTFQpOworICBpZighd3ZfODI1OTNfY21kKGRldiwgInd2XzgyNTkzX2NvbmZpZygpOiBpYS1zZXR1cCIsCisJCSAgIE9QMF9JQV9TRVRVUCwgU1IwX0lBX1NFVFVQX0RPTkUpKQorICAgIHJldCA9IEZBTFNFOworCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisgICAgLyogSWYgcm9hbWluZyBpcyBlbmFibGVkLCBqb2luIHRoZSAiQmVhY29uIFJlcXVlc3QiIG11bHRpY2FzdCBncm91cC4uLiAqLworICAgIC8qIEJ1dCBvbmx5IGlmIGl0J3Mgbm90IGluIHRoZXJlIGFscmVhZHkhICovCisgIGlmKGRvX3JvYW1pbmcpCisgICAgZGV2X21jX2FkZChkZXYsV0FWRUxBTl9CRUFDT05fQUREUkVTUywgV0FWRUxBTl9BRERSX1NJWkUsIDEpOworI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworCisgIC8qIElmIGFueSBtdWx0aWNhc3QgYWRkcmVzcyB0byBzZXQgKi8KKyAgaWYobHAtPm1jX2NvdW50KQorICAgIHsKKyAgICAgIHN0cnVjdCBkZXZfbWNfbGlzdCAqCWRtaTsKKyAgICAgIGludAkJCWFkZHJzX2xlbiA9IFdBVkVMQU5fQUREUl9TSVpFICogbHAtPm1jX2NvdW50OworCisjaWZkZWYgREVCVUdfQ09ORklHX0lORk8KKyAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfaHdfY29uZmlnKCk6IHNldCAlZCBtdWx0aWNhc3QgYWRkcmVzc2VzOlxuIiwKKwkgICAgIGRldi0+bmFtZSwgbHAtPm1jX2NvdW50KTsKKyAgICAgIGZvcihkbWk9ZGV2LT5tY19saXN0OyBkbWk7IGRtaT1kbWktPm5leHQpCisJcHJpbnRrKEtFUk5fREVCVUcgIiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgICAgZG1pLT5kbWlfYWRkclswXSwgZG1pLT5kbWlfYWRkclsxXSwgZG1pLT5kbWlfYWRkclsyXSwKKwkgICAgICAgZG1pLT5kbWlfYWRkclszXSwgZG1pLT5kbWlfYWRkcls0XSwgZG1pLT5kbWlfYWRkcls1XSApOworI2VuZGlmCisKKyAgICAgIC8qIEluaXRpYWxpemUgYWRhcHRlcidzIGV0aGVybmV0IG11bHRpY2FzdCBhZGRyZXNzZXMgKi8KKyAgICAgIG91dGIoVFhfQkFTRSAmIDB4ZmYsIFBJT1JMKGJhc2UpKTsKKyAgICAgIG91dGIoKChUWF9CQVNFID4+IDgpICYgUElPUkhfTUFTSykgfCBQSU9SSF9TRUxfVFgsIFBJT1JIKGJhc2UpKTsKKyAgICAgIG91dGIoYWRkcnNfbGVuICYgMHhmZiwgUElPUChiYXNlKSk7CS8qIGJ5dGUgY291bnQgbHNiICovCisgICAgICBvdXRiKChhZGRyc19sZW4gPj4gOCksIFBJT1AoYmFzZSkpOwkvKiBieXRlIGNvdW50IG1zYiAqLworICAgICAgZm9yKGRtaT1kZXYtPm1jX2xpc3Q7IGRtaTsgZG1pPWRtaS0+bmV4dCkKKwlvdXRzYihQSU9QKGJhc2UpLCBkbWktPmRtaV9hZGRyLCBkbWktPmRtaV9hZGRybGVuKTsKKworICAgICAgLyogcmVzZXQgdHJhbnNtaXQgRE1BIHBvaW50ZXIgKi8KKyAgICAgIGhhY3Jfd3JpdGVfc2xvdyhiYXNlLCBIQUNSX1BXUl9TVEFUIHwgSEFDUl9UWF9ETUFfUkVTRVQpOworICAgICAgaGFjcl93cml0ZShiYXNlLCBIQUNSX0RFRkFVTFQpOworICAgICAgaWYoIXd2XzgyNTkzX2NtZChkZXYsICJ3dl84MjU5M19jb25maWcoKTogbWMtc2V0dXAiLAorCQkgICAgICAgT1AwX01DX1NFVFVQLCBTUjBfTUNfU0VUVVBfRE9ORSkpCisJcmV0ID0gRkFMU0U7CisgICAgICBscC0+bWNfY291bnQgPSBkZXYtPm1jX2NvdW50OwkvKiByZW1lbWJlciB0byBhdm9pZCByZXBlYXRlZCByZXNldCAqLworICAgIH0KKworICAvKiBKb2IgZG9uZSwgY2xlYXIgdGhlIGZsYWcgKi8KKyAgbHAtPnJlY29uZmlnXzgyNTkzID0gRkFMU0U7CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2XzgyNTkzX2NvbmZpZygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisgIHJldHVybihyZXQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUmVhZCB0aGUgQWNjZXNzIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIsIHBlcmZvcm0gYSBzb2Z0d2FyZSByZXNldCwKKyAqIGFuZCB0aGVuIHJlLWVuYWJsZSB0aGUgY2FyZCdzIHNvZnR3YXJlLgorICoKKyAqIElmIEkgdW5kZXJzdGFuZCBjb3JyZWN0bHkgOiByZXNldCB0aGUgcGNtY2lhIGludGVyZmFjZSBvZiB0aGUKKyAqIHdhdmVsYW4uCisgKiAoY2FsbGVkIGJ5IHd2X2NvbmZpZygpKQorICovCitzdGF0aWMgaW5saW5lIGludAord3ZfcGNtY2lhX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBpbnQJCWk7CisgIGNvbmZfcmVnX3QJcmVnID0geyAwLCBDU19SRUFELCBDSVNSRUdfQ09SLCAwIH07CisgIGRldl9saW5rX3QgKglsaW5rID0gKChuZXRfbG9jYWwgKiluZXRkZXZfcHJpdihkZXYpKS0+bGluazsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfcGNtY2lhX3Jlc2V0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICBpID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGxpbmstPmhhbmRsZSwgJnJlZyk7CisgIGlmKGkgIT0gQ1NfU1VDQ0VTUykKKyAgICB7CisgICAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIEFjY2Vzc0NvbmZpZ3VyYXRpb25SZWdpc3RlciwgaSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgICAgCisjaWZkZWYgREVCVUdfQ09ORklHX0lORk8KKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3YXZlbGFuX3BjbWNpYV9yZXNldCgpOiBDb25maWcgcmVnIGlzIDB4JXhcbiIsCisJIGRldi0+bmFtZSwgKHVfaW50KSByZWcuVmFsdWUpOworI2VuZGlmCisKKyAgcmVnLkFjdGlvbiA9IENTX1dSSVRFOworICByZWcuVmFsdWUgPSByZWcuVmFsdWUgfCBDT1JfU1dfUkVTRVQ7CisgIGkgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIobGluay0+aGFuZGxlLCAmcmVnKTsKKyAgaWYoaSAhPSBDU19TVUNDRVNTKQorICAgIHsKKyAgICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgQWNjZXNzQ29uZmlndXJhdGlvblJlZ2lzdGVyLCBpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgICAKKyAgcmVnLkFjdGlvbiA9IENTX1dSSVRFOworICByZWcuVmFsdWUgPSBDT1JfTEVWRUxfSVJRIHwgQ09SX0NPTkZJRzsKKyAgaSA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihsaW5rLT5oYW5kbGUsICZyZWcpOworICBpZihpICE9IENTX1NVQ0NFU1MpCisgICAgeworICAgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBBY2Nlc3NDb25maWd1cmF0aW9uUmVnaXN0ZXIsIGkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfcGNtY2lhX3Jlc2V0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiB3YXZlbGFuX2h3X2NvbmZpZygpIGlzIGNhbGxlZCBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50IGlzCisgKiByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSB3YXZlbGFuIGhhcmR3YXJlLgorICogTm90ZSB0aGF0IHRoZSByZWNlcHRpb24gd2lsbCBiZSBlbmFibGVkIGluIHdhdmVsYW4tPm9wZW4oKSwgc28gdGhlCisgKiBkZXZpY2UgaXMgY29uZmlndXJlZCBidXQgaWRsZS4uLgorICogUGVyZm9ybXMgdGhlIGZvbGxvd2luZyBhY3Rpb25zOgorICogCTEuIEEgcGNtY2lhIHNvZnR3YXJlIHJlc2V0ICh1c2luZyB3dl9wY21jaWFfcmVzZXQoKSkKKyAqCTIuIEEgcG93ZXIgcmVzZXQgKHJlc2V0IERNQSkKKyAqCTMuIFJlc2V0IHRoZSBMQU4gY29udHJvbGxlcgorICoJNC4gSW5pdGlhbGl6ZSB0aGUgcmFkaW8gbW9kZW0gKHVzaW5nIHd2X21tY19pbml0KQorICoJNS4gQ29uZmlndXJlIExBTiBjb250cm9sbGVyICh1c2luZyB3dl84MjU5M19jb25maWcpCisgKgk2LiBQZXJmb3JtIGEgZGlhZ25vc3RpYyBvbiB0aGUgTEFOIGNvbnRyb2xsZXIKKyAqIChjYWxsZWQgYnkgd2F2ZWxhbl9ldmVudCgpICYgd3ZfaHdfcmVzZXQoKSkKKyAqLworc3RhdGljIGludAord3ZfaHdfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBuZXRfbG9jYWwgKgkJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICBraW9fYWRkcl90CQliYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgIHVuc2lnbmVkIGxvbmcJCWZsYWdzOworICBpbnQJCQlyZXQgPSBGQUxTRTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfaHdfY29uZmlnKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworI2lmZGVmIFNUUlVDVF9DSEVDSworICBpZih3dl9zdHJ1Y3R1Y3RfY2hlY2soKSAhPSAoY2hhciAqKSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB3dl9od19jb25maWc6IHN0cnVjdHVyZS9jb21waWxlciBib3RjaDogXCIlc1wiXG4iLAorCSAgICAgZGV2LT5uYW1lLCB3dl9zdHJ1Y3R1Y3RfY2hlY2soKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorI2VuZGlmCS8qIFNUUlVDVF9DSEVDSyA9PSAxICovCisKKyAgLyogUmVzZXQgdGhlIHBjbWNpYSBpbnRlcmZhY2UgKi8KKyAgaWYod3ZfcGNtY2lhX3Jlc2V0KGRldikgPT0gRkFMU0UpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgLyogRGlzZ3Vpc2VkIGdvdG8gOy0pICovCisgIGRvCisgICAgeworICAgICAgLyogUG93ZXIgVVAgdGhlIG1vZHVsZSArIHJlc2V0IHRoZSBtb2RlbSArIHJlc2V0IGhvc3QgYWRhcHRlcgorICAgICAgICogKGluIGZhY3QsIHJlc2V0IERNQSBjaGFubmVscykgKi8KKyAgICAgIGhhY3Jfd3JpdGVfc2xvdyhiYXNlLCBIQUNSX1JFU0VUKTsKKyAgICAgIGhhY3Jfd3JpdGUoYmFzZSwgSEFDUl9ERUZBVUxUKTsKKworICAgICAgLyogQ2hlY2sgaWYgdGhlIG1vZHVsZSBoYXMgYmVlbiBwb3dlcmVkIHVwLi4uICovCisgICAgICBpZihoYXNyX3JlYWQoYmFzZSkgJiBIQVNSX05PX0NMSykKKwl7CisjaWZkZWYgREVCVUdfQ09ORklHX0VSUk9SUworCSAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHd2X2h3X2NvbmZpZygpOiBtb2RlbSBub3QgY29ubmVjdGVkIG9yIG5vdCBhIHdhdmVsYW4gY2FyZFxuIiwKKwkJIGRldi0+bmFtZSk7CisjZW5kaWYKKwkgIGJyZWFrOworCX0KKworICAgICAgLyogaW5pdGlhbGl6ZSB0aGUgbW9kZW0gKi8KKyAgICAgIGlmKHd2X21tY19pbml0KGRldikgPT0gRkFMU0UpCisJeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUlMKKwkgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB3dl9od19jb25maWcoKTogQ2FuJ3QgY29uZmlndXJlIHRoZSBtb2RlbVxuIiwKKwkJIGRldi0+bmFtZSk7CisjZW5kaWYKKwkgIGJyZWFrOworCX0KKworICAgICAgLyogcmVzZXQgdGhlIExBTiBjb250cm9sbGVyIChpODI1OTMpICovCisgICAgICBvdXRiKE9QMF9SRVNFVCwgTENDUihiYXNlKSk7CisgICAgICBtZGVsYXkoMSk7CS8qIEEgYml0IGNydWRlICEgKi8KKworICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgTEFOIGNvbnRyb2xsZXIgKi8KKyAgICAgIGlmKHd2XzgyNTkzX2NvbmZpZyhkZXYpID09IEZBTFNFKQorCXsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1JTCisJICBwcmludGsoS0VSTl9JTkZPICIlczogd3ZfaHdfY29uZmlnKCk6IGk4MjU5MyBpbml0IGZhaWxlZFxuIiwKKwkJIGRldi0+bmFtZSk7CisjZW5kaWYKKwkgIGJyZWFrOworCX0KKworICAgICAgLyogRGlhZ25vc3RpYyAqLworICAgICAgaWYod3ZfZGlhZyhkZXYpID09IEZBTFNFKQorCXsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1JTCisJICBwcmludGsoS0VSTl9JTkZPICIlczogd3ZfaHdfY29uZmlnKCk6IGk4MjU5MyBkaWFnbm9zdGljIGZhaWxlZFxuIiwKKwkJIGRldi0+bmFtZSk7CisjZW5kaWYKKwkgIGJyZWFrOworCX0KKworICAgICAgLyogCisgICAgICAgKiBpbnNlcnQgY29kZSBmb3IgbG9vcGJhY2sgdGVzdCBoZXJlCisgICAgICAgKi8KKworICAgICAgLyogVGhlIGRldmljZSBpcyBub3cgY29uZmlndXJlZCAqLworICAgICAgbHAtPmNvbmZpZ3VyZWQgPSAxOworICAgICAgcmV0ID0gVFJVRTsKKyAgICB9CisgIHdoaWxlKDApOworCisgIC8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzICovCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl9od19jb25maWcoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4ocmV0KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRvdGFsbHkgcmVzZXQgdGhlIHdhdmVsYW4gYW5kIHJlc3RhcnQgaXQuCisgKiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIGFjdGlvbnM6CisgKiAJMS4gQ2FsbCB3dl9od19jb25maWcoKQorICoJMi4gU3RhcnQgdGhlIExBTiBjb250cm9sbGVyJ3MgcmVjZWl2ZSB1bml0CisgKiAoY2FsbGVkIGJ5IHdhdmVsYW5fZXZlbnQoKSwgd2F2ZWxhbl93YXRjaGRvZygpIGFuZCB3YXZlbGFuX29wZW4oKSkKKyAqLworc3RhdGljIGlubGluZSB2b2lkCit3dl9od19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAgbmV0X2xvY2FsICoJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9od19yZXNldCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKyAgbHAtPm5yZXNldHMrKzsKKyAgbHAtPmNvbmZpZ3VyZWQgPSAwOworICAKKyAgLyogQ2FsbCB3dl9od19jb25maWcoKSBmb3IgbW9zdCBvZiB0aGUgcmVzZXQgJiBpbml0IHN0dWZmICovCisgIGlmKHd2X2h3X2NvbmZpZyhkZXYpID09IEZBTFNFKQorICAgIHJldHVybjsKKworICAvKiBzdGFydCByZWNlaXZlIHVuaXQgKi8KKyAgd3ZfcnVfc3RhcnQoZGV2KTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfaHdfcmVzZXQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogd3ZfcGNtY2lhX2NvbmZpZygpIGlzIGNhbGxlZCBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50IGlzCisgKiByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUgZXRoZXJuZXQKKyAqIGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKyAqIChjYWxsZWQgYnkgd2F2ZWxhbl9ldmVudCgpKQorICovCitzdGF0aWMgaW5saW5lIGludAord3ZfcGNtY2lhX2NvbmZpZyhkZXZfbGlua190ICoJbGluaykKK3sKKyAgY2xpZW50X2hhbmRsZV90CWhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKyAgdHVwbGVfdAkJdHVwbGU7CisgIGNpc3BhcnNlX3QJCXBhcnNlOworICBzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBsaW5rLT5wcml2OworICBpbnQJCQlpOworICB1X2NoYXIJCWJ1Zls2NF07CisgIHdpbl9yZXFfdAkJcmVxOworICBtZW1yZXFfdAkJbWVtOworICBuZXRfbG9jYWwgKgkJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIi0+d3ZfcGNtY2lhX2NvbmZpZygweCVwKVxuIiwgbGluayk7CisjZW5kaWYKKworICAvKgorICAgKiBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24KKyAgICogcmVnaXN0ZXJzLgorICAgKi8KKyAgZG8KKyAgICB7CisgICAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKyAgICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisgICAgICBpID0gcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSk7CisgICAgICBpZihpICE9IENTX1NVQ0NFU1MpCisJYnJlYWs7CisgICAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOworICAgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7CisgICAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgICBpID0gcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKTsKKyAgICAgIGlmKGkgIT0gQ1NfU1VDQ0VTUykKKwlicmVhazsKKyAgICAgIGkgPSBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSk7CisgICAgICBpZihpICE9IENTX1NVQ0NFU1MpCisJYnJlYWs7CisgICAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKyAgICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKyAgICB9CisgIHdoaWxlKDApOworICBpZihpICE9IENTX1NVQ0NFU1MpCisgICAgeworICAgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBQYXJzZVR1cGxlLCBpKTsKKyAgICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIAorICAvKiBDb25maWd1cmUgY2FyZCAqLworICBsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworICBkbworICAgIHsKKyAgICAgIGkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisgICAgICBpZihpICE9IENTX1NVQ0NFU1MpCisJeworCSAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0SU8sIGkpOworCSAgYnJlYWs7CisJfQorCisgICAgICAvKgorICAgICAgICogTm93IGFsbG9jYXRlIGFuIGludGVycnVwdCBsaW5lLiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QKKyAgICAgICAqIGFjdHVhbGx5IGFzc2lnbiBhIGhhbmRsZXIgdG8gdGhlIGludGVycnVwdC4KKyAgICAgICAqLworICAgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworICAgICAgaWYoaSAhPSBDU19TVUNDRVNTKQorCXsKKwkgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVxdWVzdElSUSwgaSk7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qCisgICAgICAgKiBUaGlzIGFjdHVhbGx5IGNvbmZpZ3VyZXMgdGhlIFBDTUNJQSBzb2NrZXQgLS0gc2V0dGluZyB1cAorICAgICAgICogdGhlIEkvTyB3aW5kb3dzIGFuZCB0aGUgaW50ZXJydXB0IG1hcHBpbmcuCisgICAgICAgKi8KKyAgICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAxOworICAgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisgICAgICBpZihpICE9IENTX1NVQ0NFU1MpCisJeworCSAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0Q29uZmlndXJhdGlvbiwgaSk7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qCisgICAgICAgKiBBbGxvY2F0ZSBhIHNtYWxsIG1lbW9yeSB3aW5kb3cuICBOb3RlIHRoYXQgdGhlIGRldl9saW5rX3QKKyAgICAgICAqIHN0cnVjdHVyZSBwcm92aWRlcyBzcGFjZSBmb3Igb25lIHdpbmRvdyBoYW5kbGUgLS0gaWYgeW91cgorICAgICAgICogZGV2aWNlIG5lZWRzIHNldmVyYWwgd2luZG93cywgeW91J2xsIG5lZWQgdG8ga2VlcCB0cmFjayBvZgorICAgICAgICogdGhlIGhhbmRsZXMgaW4geW91ciBwcml2YXRlIGRhdGEgc3RydWN0dXJlLCBsaW5rLT5wcml2LgorICAgICAgICovCisgICAgICByZXEuQXR0cmlidXRlcyA9IFdJTl9EQVRBX1dJRFRIXzh8V0lOX01FTU9SWV9UWVBFX0FNfFdJTl9FTkFCTEU7CisgICAgICByZXEuQmFzZSA9IHJlcS5TaXplID0gMDsKKyAgICAgIHJlcS5BY2Nlc3NTcGVlZCA9IG1lbV9zcGVlZDsKKyAgICAgIGkgPSBwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmstPmhhbmRsZSwgJnJlcSwgJmxpbmstPndpbik7CisgICAgICBpZihpICE9IENTX1NVQ0NFU1MpCisJeworCSAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0V2luZG93LCBpKTsKKwkgIGJyZWFrOworCX0KKworICAgICAgbHAtPm1lbSA9IGlvcmVtYXAocmVxLkJhc2UsIHJlcS5TaXplKTsKKyAgICAgIGRldi0+bWVtX3N0YXJ0ID0gKHVfbG9uZylscC0+bWVtOworICAgICAgZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyByZXEuU2l6ZTsKKworICAgICAgbWVtLkNhcmRPZmZzZXQgPSAwOyBtZW0uUGFnZSA9IDA7CisgICAgICBpID0gcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLT53aW4sICZtZW0pOworICAgICAgaWYoaSAhPSBDU19TVUNDRVNTKQorCXsKKwkgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgTWFwTWVtUGFnZSwgaSk7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIEZlZWQgZGV2aWNlIHdpdGggdGhpcyBpbmZvLi4uICovCisgICAgICBkZXYtPmlycSA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKKyAgICAgIGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworICAgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19JTkZPCisgICAgICBwcmludGsoS0VSTl9ERUJVRyAid3ZfcGNtY2lhX2NvbmZpZzogTUVNU1RBUlQgJXAgSVJRICVkIElPUE9SVCAweCV4XG4iLAorCSAgICAgbHAtPm1lbSwgZGV2LT5pcnEsICh1X2ludCkgZGV2LT5iYXNlX2FkZHIpOworI2VuZGlmCisKKyAgICAgIFNFVF9ORVRERVZfREVWKGRldiwgJmhhbmRsZV90b19kZXYoaGFuZGxlKSk7CisgICAgICBpID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisgICAgICBpZihpICE9IDApCisJeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUlMKKwkgIHByaW50ayhLRVJOX0lORk8gInd2X3BjbWNpYV9jb25maWcoKTogcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKKyNlbmRpZgorCSAgYnJlYWs7CisJfQorICAgIH0KKyAgd2hpbGUoMCk7CQkvKiBIdW1tLi4uIERpc2d1aXNlZCBnb3RvICEhISAqLworCisgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgIC8qIElmIGFueSBzdGVwIGZhaWxlZCwgcmVsZWFzZSBhbnkgcGFydGlhbGx5IGNvbmZpZ3VyZWQgc3RhdGUgKi8KKyAgaWYoaSAhPSAwKQorICAgIHsKKyAgICAgIHd2X3BjbWNpYV9yZWxlYXNlKGxpbmspOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBzdHJjcHkoKChuZXRfbG9jYWwgKikgbmV0ZGV2X3ByaXYoZGV2KSktPm5vZGUuZGV2X25hbWUsIGRldi0+bmFtZSk7CisgIGxpbmstPmRldiA9ICYoKG5ldF9sb2NhbCAqKSBuZXRkZXZfcHJpdihkZXYpKS0+bm9kZTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiPC13dl9wY21jaWFfY29uZmlnKClcbiIpOworI2VuZGlmCisgIHJldHVybiBUUlVFOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIHd2X3BjbWNpYV9yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZSBuZXQKKyAqIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICogc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCisgKi8KK3N0YXRpYyB2b2lkCit3dl9wY21jaWFfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworICBzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBsaW5rLT5wcml2OworICBuZXRfbG9jYWwgKgkJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT4gd3ZfcGNtY2lhX3JlbGVhc2UoMHglcClcbiIsIGRldi0+bmFtZSwgbGluayk7CisjZW5kaWYKKworICAvKiBEb24ndCBib3RoZXIgY2hlY2tpbmcgdG8gc2VlIGlmIHRoZXNlIHN1Y2NlZWQgb3Igbm90ICovCisgIGlvdW5tYXAobHAtPm1lbSk7CisgIHBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOworICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisgIHBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisKKyAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LSB3dl9wY21jaWFfcmVsZWFzZSgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogSU5URVJSVVBUIEhBTkRMSU5HICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgV2F2ZUxBTiBjYXJkLiBUaGlzCisgKiByb3V0aW5lIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyOiAKKyAqCTEuIEEgcGFja2V0IGlzIHJlY2VpdmVkLgorICoJMi4gQSBwYWNrZXQgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHRyYW5zZmVycmVkIGFuZCB0aGUgdW5pdCBpcworICoJICAgcmVhZHkgdG8gdHJhbnNtaXQgYW5vdGhlciBwYWNrZXQuCisgKgkzLiBBIGNvbW1hbmQgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24uCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAord2F2ZWxhbl9pbnRlcnJ1cHQoaW50CQlpcnEsCisJCSAgdm9pZCAqCWRldl9pZCwKKwkJICBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisgIHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2OworICBuZXRfbG9jYWwgKglscDsKKyAga2lvX2FkZHJfdAliYXNlOworICBpbnQJCXN0YXR1czA7CisgIHVfaW50CQl0eF9zdGF0dXM7CisKKyAgaWYgKChkZXYgPSBkZXZfaWQpID09IE5VTEwpCisgICAgeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAid2F2ZWxhbl9pbnRlcnJ1cHQoKTogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsCisJICAgICBpcnEpOworI2VuZGlmCisgICAgICByZXR1cm4gSVJRX05PTkU7CisgICAgfQorCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX2ludGVycnVwdCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKyAgbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTworICAvKiBDaGVjayBzdGF0ZSBvZiBvdXIgc3BpbmxvY2sgKGl0IHNob3VsZCBiZSBjbGVhcmVkKSAqLworICBpZihzcGluX2lzX2xvY2tlZCgmbHAtPnNwaW5sb2NrKSkKKyAgICBwcmludGsoS0VSTl9ERUJVRworCSAgICIlczogd2F2ZWxhbl9pbnRlcnJ1cHQoKTogc3BpbmxvY2sgaXMgYWxyZWFkeSBsb2NrZWQgISEhXG4iLAorCSAgIGRldi0+bmFtZSk7CisjZW5kaWYKKworICAvKiBQcmV2ZW50IHJlZW50cmFuY3kuIFdlIG5lZWQgdG8gZG8gdGhhdCBiZWNhdXNlIHdlIG1heSBoYXZlCisgICAqIG11bHRpcGxlIGludGVycnVwdCBoYW5kbGVyIHJ1bm5pbmcgY29uY3VyZW50bHkuCisgICAqIEl0IGlzIHNhZmUgYmVjYXVzZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBiZWZvcmUgYXF1aXJpbmcKKyAgICogdGhlIHNwaW5sb2NrLiAqLworICBzcGluX2xvY2soJmxwLT5zcGlubG9jayk7CisKKyAgLyogVHJlYXQgYWxsIHBlbmRpbmcgaW50ZXJydXB0cyAqLworICB3aGlsZSgxKQorICAgIHsKKyAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gSU5URVJSVVBUIENIRUNLSU5HIC0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgIC8qCisgICAgICAgKiBMb29rIGZvciB0aGUgaW50ZXJydXB0IGFuZCB2ZXJpZnkgdGhlIHZhbGlkaXR5CisgICAgICAgKi8KKyAgICAgIG91dGIoQ1IwX1NUQVRVU18wIHwgT1AwX05PUCwgTENDUihiYXNlKSk7CisgICAgICBzdGF0dXMwID0gaW5iKExDU1IoYmFzZSkpOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0lORk8KKyAgICAgIHByaW50ayhLRVJOX0RFQlVHICJzdGF0dXMwIDB4JXggWyVzID0+IDB4JXhdIiwgc3RhdHVzMCwgCisJICAgICAoc3RhdHVzMCZTUjBfSU5URVJSVVBUKT8iaW50Ijoibm8gaW50IixzdGF0dXMwJn5TUjBfSU5URVJSVVBUKTsKKyAgICAgIGlmKHN0YXR1czAmU1IwX0lOVEVSUlVQVCkKKwl7CisJICBwcmludGsoIiBbJXMgPT4gJWRdXG4iLCAoc3RhdHVzMCAmIFNSMF9DSE5MKSA/ICJjaG5sIiA6CisJCSAoKHN0YXR1czAgJiBTUjBfRVhFQ1VUSU9OKSA/ICJjbWQiIDoKKwkJICAoKHN0YXR1czAgJiBTUjBfUkVDRVBUSU9OKSA/ICJyZWN2IiA6ICJ1bmtub3duIikpLAorCQkgKHN0YXR1czAgJiBTUjBfRVZFTlRfTUFTSykpOworCX0KKyAgICAgIGVsc2UKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKworICAgICAgLyogUmV0dXJuIGlmIG5vIGFjdHVhbCBpbnRlcnJ1cHQgZnJvbSBpODI1OTMgKG5vcm1hbCBleGl0KSAqLworICAgICAgaWYoIShzdGF0dXMwICYgU1IwX0lOVEVSUlVQVCkpCisJYnJlYWs7CisKKyAgICAgIC8qIElmIGludGVycnVwdCBpcyBib3RoIFJ4IGFuZCBUeCBvciBub25lLi4uCisgICAgICAgKiBUaGlzIGNvZGUgaW4gZmFjdCBpcyB0aGVyZSB0byBjYXRjaCB0aGUgc3B1cmlvdXMgaW50ZXJydXB0CisgICAgICAgKiB3aGVuIHlvdSByZW1vdmUgdGhlIHdhdmVsYW4gcGNtY2lhIGNhcmQgZnJvbSB0aGUgc29ja2V0ICovCisgICAgICBpZigoKHN0YXR1czAgJiBTUjBfQk9USF9SWF9UWCkgPT0gU1IwX0JPVEhfUlhfVFgpIHx8CisJICgoc3RhdHVzMCAmIFNSMF9CT1RIX1JYX1RYKSA9PSAweDApKQorCXsKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTworCSAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHd2X2ludGVycnVwdCgpOiBib2d1cyBpbnRlcnJ1cHQgKG9yIGZyb20gZGVhZCBjYXJkKSA6ICVYXG4iLAorCQkgZGV2LT5uYW1lLCBzdGF0dXMwKTsKKyNlbmRpZgorCSAgLyogQWNrbm93bGVkZ2UgdGhlIGludGVycnVwdCAqLworCSAgb3V0YihDUjBfSU5UX0FDSyB8IE9QMF9OT1AsIExDQ1IoYmFzZSkpOworCSAgYnJlYWs7CisJfQorCisgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLSBSRUNFSVZJTkcgUEFDS0VUIC0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAvKgorICAgICAgICogV2hlbiB0aGUgd2F2ZWxhbiBzaWduYWwgdGhlIHJlY2VwdGlvbiBvZiBhIG5ldyBwYWNrZXQsCisgICAgICAgKiB3ZSBjYWxsIHd2X3BhY2tldF9yY3YoKSB0byBjb3B5IGlmIGZyb20gdGhlIGJ1ZmZlciBhbmQKKyAgICAgICAqIHNlbmQgaXQgdG8gTkVUMworICAgICAgICovCisgICAgICBpZihzdGF0dXMwICYgU1IwX1JFQ0VQVElPTikKKwl7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0lORk8KKwkgIHByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfaW50ZXJydXB0KCk6IHJlY2VpdmVcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCSAgaWYoKHN0YXR1czAgJiBTUjBfRVZFTlRfTUFTSykgPT0gU1IwX1NUT1BfUkVHX0hJVCkKKwkgICAgeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorCSAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiB3dl9pbnRlcnJ1cHQoKTogcmVjZWl2ZSBidWZmZXIgb3ZlcmZsb3dcbiIsCisJCSAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCSAgICAgIGxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCSAgICAgIGxwLT5vdmVycnVubmluZyA9IDE7CisgICAgICAJICAgIH0KKworCSAgLyogR2V0IHRoZSBwYWNrZXQgKi8KKwkgIHd2X3BhY2tldF9yY3YoZGV2KTsKKwkgIGxwLT5vdmVycnVubmluZyA9IDA7CisKKwkgIC8qIEFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHQgKi8KKwkgIG91dGIoQ1IwX0lOVF9BQ0sgfCBPUDBfTk9QLCBMQ0NSKGJhc2UpKTsKKwkgIGNvbnRpbnVlOworICAgIAl9CisKKyAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gQ09NTUFORCBDT01QTEVUSU9OIC0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgIC8qCisgICAgICAgKiBJbnRlcnJ1cHRzIGlzc3VlZCB3aGVuIHRoZSBpODI1OTMgaGFzIGNvbXBsZXRlZCBhIGNvbW1hbmQuCisgICAgICAgKiBNb3N0IGxpa2VseSA6IHRyYW5zbWlzc2lvbiBkb25lCisgICAgICAgKi8KKworICAgICAgLyogSWYgYSB0cmFuc21pc3Npb24gaGFzIGJlZW4gZG9uZSAqLworICAgICAgaWYoKHN0YXR1czAgJiBTUjBfRVZFTlRfTUFTSykgPT0gU1IwX1RSQU5TTUlUX0RPTkUgfHwKKwkgKHN0YXR1czAgJiBTUjBfRVZFTlRfTUFTSykgPT0gU1IwX1JFVFJBTlNNSVRfRE9ORSB8fAorCSAoc3RhdHVzMCAmIFNSMF9FVkVOVF9NQVNLKSA9PSBTUjBfVFJBTlNNSVRfTk9fQ1JDX0RPTkUpCisJeworI2lmZGVmIERFQlVHX1RYX0VSUk9SCisJICBpZigoc3RhdHVzMCAmIFNSMF9FVkVOVF9NQVNLKSA9PSBTUjBfVFJBTlNNSVRfTk9fQ1JDX0RPTkUpCisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiB3dl9pbnRlcnJ1cHQoKTogcGFja2V0IHRyYW5zbWl0dGVkIHdpdGhvdXQgQ1JDLlxuIiwKKwkJICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJICAvKiBHZXQgdHJhbnNtaXNzaW9uIHN0YXR1cyAqLworCSAgdHhfc3RhdHVzID0gaW5iKExDU1IoYmFzZSkpOworCSAgdHhfc3RhdHVzIHw9IChpbmIoTENTUihiYXNlKSkgPDwgOCk7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0lORk8KKwkgIHByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfaW50ZXJydXB0KCk6IHRyYW5zbWlzc2lvbiBkb25lXG4iLAorCQkgZGV2LT5uYW1lKTsKKwkgIHsKKwkgICAgdV9pbnQJcmN2X2J5dGVzOworCSAgICB1X2NoYXIJc3RhdHVzMzsKKwkgICAgcmN2X2J5dGVzID0gaW5iKExDU1IoYmFzZSkpOworCSAgICByY3ZfYnl0ZXMgfD0gKGluYihMQ1NSKGJhc2UpKSA8PCA4KTsKKwkgICAgc3RhdHVzMyA9IGluYihMQ1NSKGJhc2UpKTsKKwkgICAgcHJpbnRrKEtFUk5fREVCVUcgInR4X3N0YXR1cyAweCUwMnggcmN2X2J5dGVzIDB4JTAyeCBzdGF0dXMzIDB4JXhcbiIsCisJCSAgIHR4X3N0YXR1cywgcmN2X2J5dGVzLCAodV9pbnQpIHN0YXR1czMpOworCSAgfQorI2VuZGlmCisJICAvKiBDaGVjayBmb3IgcG9zc2libGUgZXJyb3JzICovCisJICBpZigodHhfc3RhdHVzICYgVFhfT0spICE9IFRYX09LKQorCSAgICB7CisJICAgICAgbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCisJICAgICAgaWYodHhfc3RhdHVzICYgVFhfRlJUTCkKKwkJeworI2lmZGVmIERFQlVHX1RYX0VSUk9SCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHd2X2ludGVycnVwdCgpOiBmcmFtZSB0b28gbG9uZ1xuIiwKKwkJCSBkZXYtPm5hbWUpOworI2VuZGlmCisJCX0KKwkgICAgICBpZih0eF9zdGF0dXMgJiBUWF9VTkRfUlVOKQorCQl7CisjaWZkZWYgREVCVUdfVFhfRkFJTAorCQkgIHByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfaW50ZXJydXB0KCk6IERNQSB1bmRlcnJ1blxuIiwKKwkJCSBkZXYtPm5hbWUpOworI2VuZGlmCisJCSAgbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCX0KKwkgICAgICBpZih0eF9zdGF0dXMgJiBUWF9MT1NUX0NUUykKKwkJeworI2lmZGVmIERFQlVHX1RYX0ZBSUwKKwkJICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHd2X2ludGVycnVwdCgpOiBubyBDVFNcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJICBscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJfQorCSAgICAgIGlmKHR4X3N0YXR1cyAmIFRYX0xPU1RfQ1JTKQorCQl7CisjaWZkZWYgREVCVUdfVFhfRkFJTAorCQkgIHByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfaW50ZXJydXB0KCk6IG5vIGNhcnJpZXJcbiIsCisJCQkgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkgIGxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQl9CisJICAgICAgaWYodHhfc3RhdHVzICYgVFhfSFJUX0JFQVQpCisJCXsKKyNpZmRlZiBERUJVR19UWF9GQUlMCisJCSAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3dl9pbnRlcnJ1cHQoKTogaGVhcnQgYmVhdFxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkgIGxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCX0KKwkgICAgICBpZih0eF9zdGF0dXMgJiBUWF9ERUZFUikKKwkJeworI2lmZGVmIERFQlVHX1RYX0ZBSUwKKwkJICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHd2X2ludGVycnVwdCgpOiBjaGFubmVsIGphbW1lZFxuIiwKKwkJCSBkZXYtPm5hbWUpOworI2VuZGlmCisJCX0KKwkgICAgICAvKiBJZ25vcmUgbGF0ZSBjb2xsaXNpb25zIHNpbmNlIHRoZXkncmUgbW9yZSBsaWtlbHkgdG8gaGFwcGVuCisJICAgICAgICogaGVyZSAodGhlIFdhdmVMQU4gZGVzaWduIHByZXZlbnRzIHRoZSBMQU4gY29udHJvbGxlciBmcm9tCisJICAgICAgICogcmVjZWl2aW5nIHdoaWxlIGl0IGlzIHRyYW5zbWl0dGluZykuIFdlIHRha2UgYWN0aW9uIG9ubHkgd2hlbgorCSAgICAgICAqIHRoZSBtYXhpbXVtIHJldHJhbnNtaXQgYXR0ZW1wdHMgaXMgZXhjZWVkZWQuCisJICAgICAgICovCisJICAgICAgaWYodHhfc3RhdHVzICYgVFhfQ09MTCkKKwkJeworCQkgIGlmKHR4X3N0YXR1cyAmIFRYX01BWF9DT0wpCisJCSAgICB7CisjaWZkZWYgREVCVUdfVFhfRkFJTAorCQkgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHd2X2ludGVycnVwdCgpOiBjaGFubmVsIGNvbmdlc3Rpb25cbiIsCisJCQkgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJICAgICAgaWYoISh0eF9zdGF0dXMgJiBUWF9OQ09MX01BU0spKQorCQkJeworCQkJICBscC0+c3RhdHMuY29sbGlzaW9ucyArPSAweDEwOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0JLyogaWYoISh0eF9zdGF0dXMgJiBUWF9PSykpICovCisKKwkgIGxwLT5zdGF0cy5jb2xsaXNpb25zICs9ICh0eF9zdGF0dXMgJiBUWF9OQ09MX01BU0spOworCSAgbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKworCSAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCSAgb3V0YihDUjBfSU5UX0FDSyB8IE9QMF9OT1AsIExDQ1IoYmFzZSkpOwkvKiBBY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0ICovCisgICAgCX0gCisgICAgICBlbHNlCS8qIGlmIGludGVycnVwdCA9IHRyYW5zbWl0IGRvbmUgb3IgcmV0cmFuc21pdCBkb25lICovCisJeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorCSAgcHJpbnRrKEtFUk5fSU5GTyAid2F2ZWxhbl9jczogdW5rbm93biBpbnRlcnJ1cHQsIHN0YXR1czAgPSAlMDJ4XG4iLAorCQkgc3RhdHVzMCk7CisjZW5kaWYKKwkgIG91dGIoQ1IwX0lOVF9BQ0sgfCBPUDBfTk9QLCBMQ0NSKGJhc2UpKTsJLyogQWNrbm93bGVkZ2UgdGhlIGludGVycnVwdCAqLworICAgIAl9CisgICAgfQkvKiB3aGlsZSgxKSAqLworCisgIHNwaW5fdW5sb2NrKCZscC0+c3BpbmxvY2spOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX2ludGVycnVwdCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKyAgLyogV2UgYWx3YXlzIHJldHVybiBJUlFfSEFORExFRCwgYmVjYXVzZSB3ZSB3aWxsIHJlY2VpdmUgZW1wdHkKKyAgICogaW50ZXJydXB0cyB1bmRlciBub3JtYWwgb3BlcmF0aW9ucy4gQW55d2F5LCBpdCBkb2Vzbid0IG1hdHRlcgorICAgKiBhcyB3ZSBhcmUgZGVhbGluZyB3aXRoIGFuIElTQSBpbnRlcnJ1cHQgdGhhdCBjYW4ndCBiZSBzaGFyZWQuCisgICAqCisgICAqIEV4cGxhbmF0aW9uIDogdW5kZXIgaGVhdnkgcmVjZWl2ZSwgdGhlIGZvbGxvd2luZyBoYXBwZW5zIDoKKyAgICogLT53YXZlbGFuX2ludGVycnVwdCgpCisgICAqICAgIChzdGF0dXMwICYgU1IwX0lOVEVSUlVQVCkgIT0gMAorICAgKiAgICAgICAtPnd2X3BhY2tldF9yY3YoKQorICAgKiAgICAoc3RhdHVzMCAmIFNSMF9JTlRFUlJVUFQpICE9IDAKKyAgICogICAgICAgLT53dl9wYWNrZXRfcmN2KCkKKyAgICogICAgKHN0YXR1czAgJiBTUjBfSU5URVJSVVBUKSA9PSAwCS8vIGkuZS4gbm8gbW9yZSBldmVudAorICAgKiA8LXdhdmVsYW5faW50ZXJydXB0KCkKKyAgICogLT53YXZlbGFuX2ludGVycnVwdCgpCisgICAqICAgIChzdGF0dXMwICYgU1IwX0lOVEVSUlVQVCkgPT0gMAkvLyBpLmUuIGVtcHR5IGludGVycnVwdAorICAgKiA8LXdhdmVsYW5faW50ZXJydXB0KCkKKyAgICogSmVhbiBJSSAqLworICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9IC8qIHd2X2ludGVycnVwdCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2F0Y2hkb2c6IHdoZW4gd2Ugc3RhcnQgYSB0cmFuc21pc3Npb24sIGEgdGltZXIgaXMgc2V0IGZvciB1cyBpbiB0aGUKKyAqIGtlcm5lbC4gIElmIHRoZSB0cmFuc21pc3Npb24gY29tcGxldGVzLCB0aGlzIHRpbWVyIGlzIGRpc2FibGVkLiBJZgorICogdGhlIHRpbWVyIGV4cGlyZXMsIHdlIGFyZSBjYWxsZWQgYW5kIHdlIHRyeSB0byB1bmxvY2sgdGhlIGhhcmR3YXJlLgorICoKKyAqIE5vdGUgOiBUaGlzIHdhdGNoZG9nIGlzIG1vdmUgY2xldmVyIHRoYW4gdGhlIG9uZSBpbiB0aGUgSVNBIGRyaXZlciwKKyAqIGJlY2F1c2UgaXQgdHJ5IHRvIGFib3J0IHRoZSBjdXJyZW50IGNvbW1hbmQgYmVmb3JlIHJlc2V0aW5nCisgKiBldmVyeXRoaW5nLi4uCisgKiBPbiB0aGUgb3RoZXIgaGFuZCwgaXQncyBhIGJpdCBzaW1wbGVyLCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdG8KKyAqIGRlYWwgd2l0aCB0aGUgbXVsdGlwbGUgVHggYnVmZmVycy4uLgorICovCitzdGF0aWMgdm9pZAord2F2ZWxhbl93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAgbmV0X2xvY2FsICoJCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAga2lvX2FkZHJfdAkJYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICB1bnNpZ25lZCBsb25nCQlmbGFnczsKKyAgaW50CQkJYWJvcnRlZCA9IEZBTFNFOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX3dhdGNoZG9nKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorICBwcmludGsoS0VSTl9JTkZPICIlczogd2F2ZWxhbl93YXRjaGRvZzogd2F0Y2hkb2cgdGltZXIgZXhwaXJlZFxuIiwKKwkgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworICAvKiBBc2sgdG8gYWJvcnQgdGhlIGN1cnJlbnQgY29tbWFuZCAqLworICBvdXRiKE9QMF9BQk9SVCwgTENDUihiYXNlKSk7CisKKyAgLyogV2FpdCBmb3IgdGhlIGVuZCBvZiB0aGUgY29tbWFuZCAoYSBiaXQgaGFja2lzaCkgKi8KKyAgaWYod3ZfODI1OTNfY21kKGRldiwgIndhdmVsYW5fd2F0Y2hkb2coKTogYWJvcnQiLAorCQkgIE9QMF9OT1AgfCBDUjBfU1RBVFVTXzMsIFNSMF9FWEVDVVRJT05fQUJPUlRFRCkpCisgICAgYWJvcnRlZCA9IFRSVUU7CisKKyAgLyogUmVsZWFzZSBzcGlubG9jayBoZXJlIHNvIHRoYXQgd3ZfaHdfcmVzZXQoKSBjYW4gZ3JhYiBpdCAqLworICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworICAvKiBDaGVjayBpZiB3ZSB3ZXJlIHN1Y2Nlc3NmdWwgaW4gYWJvcnRpbmcgaXQgKi8KKyAgaWYoIWFib3J0ZWQpCisgICAgeworICAgICAgLyogSXQgc2VlbSB0aGF0IGl0IHdhc24ndCBlbm91Z2ggKi8KKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfRVJST1IKKyAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiB3YXZlbGFuX3dhdGNoZG9nOiBhYm9ydCBmYWlsZWQsIHRyeWluZyByZXNldFxuIiwKKwkgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKyAgICAgIHd2X2h3X3Jlc2V0KGRldik7CisgICAgfQorCisjaWZkZWYgREVCVUdfUFNBX1NIT1cKKyAgeworICAgIHBzYV90CQlwc2E7CisgICAgcHNhX3JlYWQoZGV2LCAwLCAodW5zaWduZWQgY2hhciAqKSAmcHNhLCBzaXplb2YocHNhKSk7CisgICAgd3ZfcHNhX3Nob3coJnBzYSk7CisgIH0KKyNlbmRpZgorI2lmZGVmIERFQlVHX01NQ19TSE9XCisgIHd2X21tY19zaG93KGRldik7CisjZW5kaWYKKyNpZmRlZiBERUJVR19JODI1OTNfU0hPVworICB3dl9ydV9zaG93KGRldik7CisjZW5kaWYKKworICAvKiBXZSBhcmUgbm8gbW9yZSB3YWl0aW5nIGZvciBzb21ldGhpbmcuLi4gKi8KKyAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX3dhdGNoZG9nKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKiBDT05GSUdVUkFUSU9OIENBTExCQUNLUyAqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogSGVyZSBhcmUgdGhlIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhlIHBjbWNpYSBwYWNrYWdlIChjYXJkbWdyKSBhbmQKKyAqIGxpbnV4IG5ldHdvcmtpbmcgKE5FVDMpIGZvciBpbml0aWFsaXphdGlvbiwgY29uZmlndXJhdGlvbiBhbmQKKyAqIGRlaW5zdGFsbGF0aW9ucyBvZiB0aGUgV2F2ZWxhbiBQY21jaWEgSGFyZHdhcmUuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIENvbmZpZ3VyZSBhbmQgc3RhcnQgdXAgdGhlIFdhdmVMQU4gUENNQ0lBIGFkYXB0b3IuCisgKiBDYWxsZWQgYnkgTkVUMyB3aGVuIGl0ICJvcGVuIiB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgaW50Cit3YXZlbGFuX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisgIG5ldF9sb2NhbCAqCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgZGV2X2xpbmtfdCAqCWxpbmsgPSBscC0+bGluazsKKyAga2lvX2FkZHJfdAliYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyNpZmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d2F2ZWxhbl9vcGVuKGRldj0weCV4KVxuIiwgZGV2LT5uYW1lLAorCSAodW5zaWduZWQgaW50KSBkZXYpOworI2VuZGlmCisKKyAgLyogQ2hlY2sgaWYgdGhlIG1vZGVtIGlzIHBvd2VyZWQgdXAgKHdhdmVsYW5fY2xvc2UoKSBwb3dlciBpdCBkb3duICovCisgIGlmKGhhc3JfcmVhZChiYXNlKSAmIEhBU1JfTk9fQ0xLKQorICAgIHsKKyAgICAgIC8qIFBvd2VyIHVwIChwb3dlciB1cCB0aW1lIGlzIDI1MHVzKSAqLworICAgICAgaGFjcl93cml0ZShiYXNlLCBIQUNSX0RFRkFVTFQpOworCisgICAgICAvKiBDaGVjayBpZiB0aGUgbW9kdWxlIGhhcyBiZWVuIHBvd2VyZWQgdXAuLi4gKi8KKyAgICAgIGlmKGhhc3JfcmVhZChiYXNlKSAmIEhBU1JfTk9fQ0xLKQorCXsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1JTCisJICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogd2F2ZWxhbl9vcGVuKCk6IG1vZGVtIG5vdCBjb25uZWN0ZWRcbiIsCisJCSBkZXYtPm5hbWUpOworI2VuZGlmCisJICByZXR1cm4gRkFMU0U7CisJfQorICAgIH0KKworICAvKiBTdGFydCByZWNlcHRpb24gYW5kIGRlY2xhcmUgdGhlIGRyaXZlciByZWFkeSAqLworICBpZighbHAtPmNvbmZpZ3VyZWQpCisgICAgcmV0dXJuIEZBTFNFOworICBpZighd3ZfcnVfc3RhcnQoZGV2KSkKKyAgICB3dl9od19yZXNldChkZXYpOwkJLyogSWYgcHJvYmxlbSA6IHJlc2V0ICovCisgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKyAgLyogTWFyayB0aGUgZGV2aWNlIGFzIHVzZWQgKi8KKyAgbGluay0+b3BlbisrOworCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisgIGlmKGRvX3JvYW1pbmcpCisgICAgd3Zfcm9hbV9pbml0KGRldik7CisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HICovCisKKyNpZmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd2F2ZWxhbl9vcGVuKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTaHV0ZG93biB0aGUgV2F2ZUxBTiBQQ01DSUEgYWRhcHRvci4KKyAqIENhbGxlZCBieSBORVQzIHdoZW4gaXQgImNsb3NlIiB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgaW50Cit3YXZlbGFuX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBkZXZfbGlua190ICoJbGluayA9ICgobmV0X2xvY2FsICopbmV0ZGV2X3ByaXYoZGV2KSktPmxpbms7CisgIGtpb19hZGRyX3QJYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCisjaWZkZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5fY2xvc2UoZGV2PTB4JXgpXG4iLCBkZXYtPm5hbWUsCisJICh1bnNpZ25lZCBpbnQpIGRldik7CisjZW5kaWYKKworICAvKiBJZiB0aGUgZGV2aWNlIGlzbid0IG9wZW4sIHRoZW4gbm90aGluZyB0byBkbyAqLworICBpZighbGluay0+b3BlbikKKyAgICB7CisjaWZkZWYgREVCVUdfQ09ORklHX0lORk8KKyAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogd2F2ZWxhbl9jbG9zZSgpOiBkZXZpY2Ugbm90IG9wZW5cbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKyAgICAgIHJldHVybiAwOworICAgIH0KKworI2lmZGVmIFdBVkVMQU5fUk9BTUlORworICAvKiBDbGVhbnVwIG9mIHJvYW1pbmcgc3R1ZmYuLi4gKi8KKyAgaWYoZG9fcm9hbWluZykKKyAgICB3dl9yb2FtX2NsZWFudXAoZGV2KTsKKyNlbmRpZgkvKiBXQVZFTEFOX1JPQU1JTkcgKi8KKworICBsaW5rLT5vcGVuLS07CisKKyAgLyogSWYgdGhlIGNhcmQgaXMgc3RpbGwgcHJlc2VudCAqLworICBpZihuZXRpZl9ydW5uaW5nKGRldikpCisgICAgeworICAgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgICAgICAvKiBTdG9wIHJlY2VpdmluZyBuZXcgbWVzc2FnZXMgYW5kIHdhaXQgZW5kIG9mIHRyYW5zbWlzc2lvbiAqLworICAgICAgd3ZfcnVfc3RvcChkZXYpOworCisgICAgICAvKiBQb3dlciBkb3duIHRoZSBtb2R1bGUgKi8KKyAgICAgIGhhY3Jfd3JpdGUoYmFzZSwgSEFDUl9ERUZBVUxUICYgKH5IQUNSX1BXUl9TVEFUKSk7CisgICAgfQorCisjaWZkZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fY2xvc2UoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHdhdmVsYW5fYXR0YWNoKCkgY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcKKyAqIGxvY2FsIGRhdGEgc3RydWN0dXJlcyBmb3Igb25lIGRldmljZSAob25lIGludGVyZmFjZSkuICBUaGUgZGV2aWNlCisgKiBpcyByZWdpc3RlcmVkIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKyAqCisgKiBUaGUgZGV2X2xpbmsgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkKKyAqIGNvbmZpZ3VyZSB0aGUgY2FyZCBhdCB0aGlzIHBvaW50IC0tIHdlIHdhaXQgdW50aWwgd2UgcmVjZWl2ZSBhCisgKiBjYXJkIGluc2VydGlvbiBldmVudC4KKyAqLworc3RhdGljIGRldl9saW5rX3QgKgord2F2ZWxhbl9hdHRhY2godm9pZCkKK3sKKyAgY2xpZW50X3JlZ190CWNsaWVudF9yZWc7CS8qIFJlZ2lzdGVyIHdpdGggY2FyZG1nciAqLworICBkZXZfbGlua190ICoJbGluazsJCS8qIEluZm8gZm9yIGNhcmRtZ3IgKi8KKyAgc3RydWN0IG5ldF9kZXZpY2UgKglkZXY7CQkvKiBJbnRlcmZhY2UgZ2VuZXJpYyBkYXRhICovCisgIG5ldF9sb2NhbCAqCWxwOwkJLyogSW50ZXJmYWNlIHNwZWNpZmljIGRhdGEgKi8KKyAgaW50CQlyZXQ7CisKKyNpZmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiLT4gd2F2ZWxhbl9hdHRhY2goKVxuIik7CisjZW5kaWYKKworICAvKiBJbml0aWFsaXplIHRoZSBkZXZfbGlua190IHN0cnVjdHVyZSAqLworICBsaW5rID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRldl9saW5rX3QpLCBHRlBfS0VSTkVMKTsKKyAgaWYgKCFsaW5rKSByZXR1cm4gTlVMTDsKKyAgbWVtc2V0KGxpbmssIDAsIHNpemVvZihzdHJ1Y3QgZGV2X2xpbmtfdCkpOworCisgIC8qIFRoZSBpbyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIElPIHBvcnQgbWFwcGluZyAqLworICBsaW5rLT5pby5OdW1Qb3J0czEgPSA4OworICBsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OworICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDM7CisKKyAgLyogSW50ZXJydXB0IHNldHVwICovCisgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFIHwgSVJRX0hBTkRMRV9QUkVTRU5UOworICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisgIGxpbmstPmlycS5IYW5kbGVyID0gd2F2ZWxhbl9pbnRlcnJ1cHQ7CisKKyAgLyogR2VuZXJhbCBzb2NrZXQgY29uZmlndXJhdGlvbiAqLworICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CisgIGxpbmstPmNvbmYuVmNjID0gNTA7CisgIGxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworCisgIC8qIENoYWluIGRyaXZlcnMgKi8KKyAgbGluay0+bmV4dCA9IGRldl9saXN0OworICBkZXZfbGlzdCA9IGxpbms7CisKKyAgLyogQWxsb2NhdGUgdGhlIGdlbmVyaWMgZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKG5ldF9sb2NhbCkpOworICBpZiAoIWRldikgeworICAgICAga2ZyZWUobGluayk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBsaW5rLT5wcml2ID0gbGluay0+aXJxLkluc3RhbmNlID0gZGV2OworCisgIGxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAvKiBJbml0IHNwZWNpZmljIGRhdGEgKi8KKyAgbHAtPmNvbmZpZ3VyZWQgPSAwOworICBscC0+cmVjb25maWdfODI1OTMgPSBGQUxTRTsKKyAgbHAtPm5yZXNldHMgPSAwOworICAvKiBNdWx0aWNhc3Qgc3R1ZmYgKi8KKyAgbHAtPnByb21pc2N1b3VzID0gMDsKKyAgbHAtPmFsbG11bHRpY2FzdCA9IDA7CisgIGxwLT5tY19jb3VudCA9IDA7CisKKyAgLyogSW5pdCBzcGlubG9jayAqLworICBzcGluX2xvY2tfaW5pdCgmbHAtPnNwaW5sb2NrKTsKKworICAvKiBiYWNrIGxpbmtzICovCisgIGxwLT5saW5rID0gbGluazsKKyAgbHAtPmRldiA9IGRldjsKKworICAvKiB3YXZlbGFuIE5FVDMgY2FsbGJhY2tzICovCisgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgZGV2LT5vcGVuID0gJndhdmVsYW5fb3BlbjsKKyAgZGV2LT5zdG9wID0gJndhdmVsYW5fY2xvc2U7CisgIGRldi0+aGFyZF9zdGFydF94bWl0ID0gJndhdmVsYW5fcGFja2V0X3htaXQ7CisgIGRldi0+Z2V0X3N0YXRzID0gJndhdmVsYW5fZ2V0X3N0YXRzOworICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZ3YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdDsKKyNpZmRlZiBTRVRfTUFDX0FERFJFU1MKKyAgZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSAmd2F2ZWxhbl9zZXRfbWFjX2FkZHJlc3M7CisjZW5kaWYJLyogU0VUX01BQ19BRERSRVNTICovCisKKyAgLyogU2V0IHRoZSB3YXRjaGRvZyB0aW1lciAqLworICBkZXYtPnR4X3RpbWVvdXQJPSAmd2F2ZWxhbl93YXRjaGRvZzsKKyAgZGV2LT53YXRjaGRvZ190aW1lbwk9IFdBVENIRE9HX0pJRkZJRVM7CisgIFNFVF9FVEhUT09MX09QUyhkZXYsICZvcHMpOworCisjaWZkZWYgV0lSRUxFU1NfRVhUCS8qIElmIHdpcmVsZXNzIGV4dGVuc2lvbiBleGlzdCBpbiB0aGUga2VybmVsICovCisgIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmd2F2ZWxhbl9oYW5kbGVyX2RlZjsKKyAgbHAtPndpcmVsZXNzX2RhdGEuc3B5X2RhdGEgPSAmbHAtPnNweV9kYXRhOworICBkZXYtPndpcmVsZXNzX2RhdGEgPSAmbHAtPndpcmVsZXNzX2RhdGE7CisjZW5kaWYKKworICAvKiBPdGhlciBzcGVjaWZpYyBkYXRhICovCisgIGRldi0+bXR1ID0gV0FWRUxBTl9NVFU7CisKKyAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0gCisgICAgQ1NfRVZFTlRfUkVHSVNUUkFUSU9OX0NPTVBMRVRFIHwKKyAgICBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisgICAgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKyAgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmd2F2ZWxhbl9ldmVudDsKKyAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworCisjaWZkZWYgREVCVUdfQ09ORklHX0lORk8KKyAgcHJpbnRrKEtFUk5fREVCVUcgIndhdmVsYW5fYXR0YWNoKCk6IGFsbW9zdCBkb25lLCBjYWxsaW5nIHBjbWNpYV9yZWdpc3Rlcl9jbGllbnRcbiIpOworI2VuZGlmCisKKyAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisgIGlmKHJldCAhPSAwKQorICAgIHsKKyAgICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisgICAgICB3YXZlbGFuX2RldGFjaChsaW5rKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICI8LSB3YXZlbGFuX2F0dGFjaCgpXG4iKTsKKyNlbmRpZgorCisgIHJldHVybiBsaW5rOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQgd2l0aAorICogQ2FyZCBTZXJ2aWNlcy4gIElmIGl0IGhhcyBiZWVuIHJlbGVhc2VkLCBhbGwgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzCisgKiBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQgd2hlbiB0aGUgZGV2aWNlCisgKiBpcyByZWxlYXNlZC4KKyAqLworc3RhdGljIHZvaWQKK3dhdmVsYW5fZGV0YWNoKGRldl9saW5rX3QgKglsaW5rKQoreworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICItPiB3YXZlbGFuX2RldGFjaCgweCVwKVxuIiwgbGluayk7CisjZW5kaWYKKworICAvKgorICAgKiBJZiB0aGUgZGV2aWNlIGlzIGN1cnJlbnRseSBjb25maWd1cmVkIGFuZCBhY3RpdmUsIHdlIHdvbid0CisgICAqIGFjdHVhbGx5IGRlbGV0ZSBpdCB5ZXQuICBJbnN0ZWFkLCBpdCBpcyBtYXJrZWQgc28gdGhhdCB3aGVuIHRoZQorICAgKiByZWxlYXNlKCkgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGF0IHdpbGwgdHJpZ2dlciBhIHByb3BlcgorICAgKiBkZXRhY2goKS4KKyAgICovCisgIGlmKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKyAgICB7CisgICAgICAvKiBTb21lIG90aGVycyBoYXZlbid0IGRvbmUgdGhlaXIgam9iIDogZ2l2ZSB0aGVtIGFub3RoZXIgY2hhbmNlICovCisgICAgICB3dl9wY21jaWFfcmVsZWFzZShsaW5rKTsKKyAgICB9CisKKyAgLyogQnJlYWsgdGhlIGxpbmsgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgIGlmKGxpbmstPmhhbmRsZSkKKyAgICBwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKyAgICAKKyAgLyogUmVtb3ZlIHRoZSBpbnRlcmZhY2UgZGF0YSBmcm9tIHRoZSBsaW5rZWQgbGlzdCAqLworICBpZihkZXZfbGlzdCA9PSBsaW5rKQorICAgIGRldl9saXN0ID0gbGluay0+bmV4dDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGRldl9saW5rX3QgKglwcmV2ID0gZGV2X2xpc3Q7CisKKyAgICAgIHdoaWxlKChwcmV2ICE9IChkZXZfbGlua190ICopIE5VTEwpICYmIChwcmV2LT5uZXh0ICE9IGxpbmspKQorCXByZXYgPSBwcmV2LT5uZXh0OworCisgICAgICBpZihwcmV2ID09IChkZXZfbGlua190ICopIE5VTEwpCisJeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUlMKKwkgIHByaW50ayhLRVJOX1dBUk5JTkcgIndhdmVsYW5fZGV0YWNoIDogQXR0ZW1wdGluZyB0byByZW1vdmUgYSBub25leGlzdGVudCBkZXZpY2UuXG4iKTsKKyNlbmRpZgorCSAgcmV0dXJuOworCX0KKworICAgICAgcHJldi0+bmV4dCA9IGxpbmstPm5leHQ7CisgICAgfQorCisgIC8qIEZyZWUgcGllY2VzICovCisgIGlmKGxpbmstPnByaXYpCisgICAgeworICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKglkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgbGluay0+cHJpdjsKKworICAgICAgLyogUmVtb3ZlIG91cnNlbHZlcyBmcm9tIHRoZSBrZXJuZWwgbGlzdCBvZiBldGhlcm5ldCBkZXZpY2VzICovCisgICAgICAvKiBXYXJuaW5nIDogY2FuJ3QgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0LCB0aW1lciBvciB3YXZlbGFuX2Nsb3NlKCkgKi8KKyAgICAgIGlmIChsaW5rLT5kZXYpCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKyAgICAgIGxpbmstPmRldiA9IE5VTEw7CisgICAgICAoKG5ldF9sb2NhbCAqKW5ldGRldl9wcml2KGRldikpLT5saW5rID0gTlVMTDsKKyAgICAgICgobmV0X2xvY2FsICopbmV0ZGV2X3ByaXYoZGV2KSktPmRldiA9IE5VTEw7CisgICAgICBmcmVlX25ldGRldihkZXYpOworICAgIH0KKyAga2ZyZWUobGluayk7CisKKyNpZmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiPC0gd2F2ZWxhbl9kZXRhY2goKVxuIik7CisjZW5kaWYKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiBNb3N0bHksIHRoaXMgc2NoZWR1bGVzIG90aGVyIHN0dWZmCisgKiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuIEEgQ0FSRF9SRU1PVkFMIGV2ZW50IGFsc28gc2V0cworICogc29tZSBmbGFncyB0byBkaXNjb3VyYWdlIHRoZSBuZXQgZHJpdmVycyBmcm9tIHRyeWluZyB0byB0YWxrIHRvIHRoZQorICogY2FyZCBhbnkgbW9yZS4KKyAqLworc3RhdGljIGludAord2F2ZWxhbl9ldmVudChldmVudF90CQlldmVudCwJCS8qIFRoZSBldmVudCByZWNlaXZlZCAqLworCSAgICAgIGludAkJcHJpb3JpdHksCisJICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICoJYXJncykKK3sKKyAgZGV2X2xpbmtfdCAqCWxpbmsgPSAoZGV2X2xpbmtfdCAqKSBhcmdzLT5jbGllbnRfZGF0YTsKKyAgc3RydWN0IG5ldF9kZXZpY2UgKglkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgbGluay0+cHJpdjsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICItPndhdmVsYW5fZXZlbnQoKTogJXNcbiIsCisJICgoZXZlbnQgPT0gQ1NfRVZFTlRfUkVHSVNUUkFUSU9OX0NPTVBMRVRFKT8icmVnaXN0cmF0aW9uIGNvbXBsZXRlIiA6CisJICAoKGV2ZW50ID09IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCkgPyAiY2FyZCByZW1vdmFsIiA6CisJICAgKChldmVudCA9PSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTikgPyAiY2FyZCBpbnNlcnRpb24iIDoKKwkgICAgKChldmVudCA9PSBDU19FVkVOVF9QTV9TVVNQRU5EKSA/ICJwbSBzdXNwZW5kIiA6CisJICAgICAoKGV2ZW50ID09IENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMKSA/ICJwaHlzaWNhbCByZXNldCIgOgorCSAgICAgICgoZXZlbnQgPT0gQ1NfRVZFTlRfUE1fUkVTVU1FKSA/ICJwbSByZXN1bWUiIDoKKwkgICAgICAgKChldmVudCA9PSBDU19FVkVOVF9DQVJEX1JFU0VUKSA/ICJjYXJkIHJlc2V0IiA6CisJCSJ1bmtub3duIikpKSkpKSkpOworI2VuZGlmCisKKyAgICBzd2l0Y2goZXZlbnQpCisgICAgICB7CisgICAgICBjYXNlIENTX0VWRU5UX1JFR0lTVFJBVElPTl9DT01QTEVURToKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworCXByaW50ayhLRVJOX0RFQlVHICJ3YXZlbGFuX2NzOiByZWdpc3RyYXRpb24gY29tcGxldGVcbiIpOworI2VuZGlmCisJYnJlYWs7CisKKyAgICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgorCS8qIE91cHMgISBUaGUgY2FyZCBpcyBubyBtb3JlIHRoZXJlICovCisJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCWlmKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkgIHsKKwkgICAgLyogQWNjZXB0IG5vIG1vcmUgdHJhbnNtaXNzaW9ucyAqLworCSAgICBuZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKwkgICAgLyogUmVsZWFzZSB0aGUgY2FyZCAqLworCSAgICB3dl9wY21jaWFfcmVsZWFzZShsaW5rKTsKKwkgIH0KKwlicmVhazsKKworICAgICAgY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwkvKiBSZXNldCBhbmQgY29uZmlndXJlIHRoZSBjYXJkICovCisJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJaWYod3ZfcGNtY2lhX2NvbmZpZyhsaW5rKSAmJgorCSAgIHd2X2h3X2NvbmZpZyhkZXYpKQorCSAgd3ZfaW5pdF9pbmZvKGRldik7CisJZWxzZQorCSAgZGV2LT5pcnEgPSAwOworCWJyZWFrOworCisgICAgICBjYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisJLyogTkI6IHdhdmVsYW5fY2xvc2Ugd2lsbCBiZSBjYWxsZWQsIGJ1dCB0b28gbGF0ZSwgc28gd2UgYXJlCisJICogb2JsaWdlZCB0byBjbG9zZSBuaWNlbHkgdGhlIHdhdmVsYW4gaGVyZS4gRGF2aWQsIGNvdWxkIHlvdQorCSAqIGNsb3NlIHRoZSBkZXZpY2UgYmVmb3JlIHN1c3BlbmRpbmcgdGhlbSA/IEFuZCwgYnkgdGhlIHdheSwKKwkgKiBjb3VsZCB5b3UsIG9uIHJlc3VtZSwgYWRkIGEgInJvdXRlIGFkZCAtbmV0IC4uLiIgYWZ0ZXIgdGhlCisJICogaWZjb25maWcgdXAgPyBUaGFua3MuLi4gKi8KKworCS8qIFN0b3AgcmVjZWl2aW5nIG5ldyBtZXNzYWdlcyBhbmQgd2FpdCBlbmQgb2YgdHJhbnNtaXNzaW9uICovCisJd3ZfcnVfc3RvcChkZXYpOworCisJLyogUG93ZXIgZG93biB0aGUgbW9kdWxlICovCisJaGFjcl93cml0ZShkZXYtPmJhc2VfYWRkciwgSEFDUl9ERUZBVUxUICYgKH5IQUNSX1BXUl9TVEFUKSk7CisKKwkvKiBUaGUgY2FyZCBpcyBub3cgc3VzcGVuZGVkICovCisJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgICBjYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorICAgIAlpZihsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJICB7CisgICAgICAJICAgIGlmKGxpbmstPm9wZW4pCisJICAgICAgbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworICAgICAgCSAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJICB9CisJYnJlYWs7CisKKyAgICAgIGNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwlpZihsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJICB7CisgICAgICAJICAgIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisgICAgICAJICAgIGlmKGxpbmstPm9wZW4pCS8qIElmIFJFU0VUIC0+IFRydWUsIElmIFJFU1VNRSAtPiBGYWxzZSA/ICovCisJICAgICAgeworCQl3dl9od19yZXNldChkZXYpOworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJICAgICAgfQorCSAgfQorCWJyZWFrOworICAgIH0KKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICI8LXdhdmVsYW5fZXZlbnQoKVxuIik7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciB3YXZlbGFuX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gIndhdmVsYW5fY3MiLAorCX0sCisJLmF0dGFjaAkJPSB3YXZlbGFuX2F0dGFjaCwKKwkuZGV0YWNoCQk9IHdhdmVsYW5fZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK2luaXRfd2F2ZWxhbl9jcyh2b2lkKQoreworCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZ3YXZlbGFuX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorZXhpdF93YXZlbGFuX2NzKHZvaWQpCit7CisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZ3YXZlbGFuX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfd2F2ZWxhbl9jcyk7Cittb2R1bGVfZXhpdChleGl0X3dhdmVsYW5fY3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5Y2ZmNmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmgKQEAgLTAsMCArMSwzODYgQEAKKy8qCisgKglXYXZlbGFuIFBjbWNpYSBkcml2ZXIKKyAqCisgKgkJSmVhbiBJSSAtIEhQTEIgJzk2CisgKgorICogUmVvcmdhbml6YXRpb24gYW5kIGV4dGVuc2lvbiBvZiB0aGUgZHJpdmVyLgorICogT3JpZ2luYWwgY29weXJpZ2h0IGZvbGxvdy4gU2VlIHdhdmVsYW5fY3MuaCBmb3IgZGV0YWlscy4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbiB0aGUgZGVjbGFyYXRpb25zIG9mIHRoZSBXYXZlbGFuIGhhcmR3YXJlLiBOb3RlIHRoYXQKKyAqIHRoZSBQY21jaWEgV2F2ZWxhbiBpbmNsdWRlIGEgaTgyNTkzIGNvbnRyb2xsZXIgKHNlZSBkZWZpbml0aW9ucyBpbgorICogZmlsZSBpODI1OTMuaCkuCisgKgorICogVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwY21jaWEgaGFyZHdhcmUgYW5kIHRoZSBJU0Egb25lIGlzCisgKiB0aGUgRXRoZXJuZXQgQ29udHJvbGxlciAoaTgyNTkzIGluc3RlYWQgb2YgaTgyNTg2KS4gVGhlIGk4MjU5MyBhbGxvdworICogb25seSBvbmUgc2VuZCBidWZmZXIuIFRoZSBQU0EgKFBhcmFtZXRlciBTdG9yYWdlIEFyZWEgOiBFRXByb20gZm9yCisgKiBwZXJtYW5lbnQgc3RvcmFnZSBvZiB2YXJpb3VzIGluZm8pIGlzIG1lbW9yeSBtYXBwZWQsIGJ1dCBub3QgdGhlCisgKiBNTUkgKE1vZGVtIE1hbmFnZW1lbnQgSW50ZXJmYWNlKS4KKyAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBBVCZUIEdJUyAoZm9ybWVybHkgTkNSKSBXYXZlTEFOIFBDTUNJQSBjYXJkOiAKKyAqICAgQW4gRXRoZXJuZXQtbGlrZSByYWRpbyB0cmFuc2NlaXZlciBjb250cm9sbGVkIGJ5IGFuIEludGVsIDgyNTkzCisgKiAgIGNvcHJvY2Vzc29yLgorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb3B5cmlnaHQgMTk5NQorICogICBBbnRob255IEQuIEpvc2VwaAorICogICBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisgKgorICogICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHByb2dyYW0KKyAqICAgZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQKKyAqICAgdGhhdCB0aGlzIGNvcHlyaWdodCBhbmQgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIG9uIGFsbCBjb3BpZXMKKyAqICAgYW5kIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgdGhlIG5hbWUgb2YgTS5JLlQuIG5vdCBiZSB1c2VkCisgKiAgIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKKyAqICAgcHJvZ3JhbSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHBlcm1pc3Npb24sIGFuZCBub3RpY2UgYmUgZ2l2ZW4KKyAqICAgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uIHRoYXQgY29weWluZyBhbmQgZGlzdHJpYnV0aW9uIGlzCisgKiAgIGJ5IHBlcm1pc3Npb24gb2YgTS5JLlQuICBNLkkuVC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0CisgKiAgIHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByby0KKyAqICAgdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4gICAgICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoKKyAqIENyZWRpdHM6CisgKiAgICAgU3BlY2lhbCB0aGFua3MgdG8gSmFuIEhvb2dlbmRvb3JuIG9mIEFUJlQgR0lTIFV0cmVjaHQgZm9yCisgKiAgICAgICBwcm92aWRpbmcgZXh0cmVtZWx5IHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCBXYXZlTEFOIFBDTUNJQSBoYXJkd2FyZQorICoKKyAqICAgICBUaGlzIGRyaXZlciBpcyBiYXNlZCB1cG9uIHNldmVyYWwgb3RoZXIgZHJpdmVycywgaW4gcGFydGljdWxhcjoKKyAqICAgICAgIERhdmlkIEhpbmRzJyBMaW51eCBkcml2ZXIgZm9yIHRoZSBQQ01DSUEgM2M1ODkgZXRoZXJuZXQgYWRhcHRlcgorICogICAgICAgQnJ1Y2UgSmFuc29uJ3MgTGludXggZHJpdmVyIGZvciB0aGUgQVQtYnVzIFdhdmVMQU4gYWRhcHRlcgorICoJIEFuZGVycyBLbGVtZXRzJyBQQ01DSUEgV2F2ZUxBTiBhZGFwdGVyIGRyaXZlcgorICogICAgICAgUm9iZXJ0IE1vcnJpcycgQlNESSBkcml2ZXIgZm9yIHRoZSBQQ01DSUEgV2F2ZUxBTiBhZGFwdGVyCisgKi8KKworI2lmbmRlZiBfV0FWRUxBTl9DU19ICisjZGVmaW5lCV9XQVZFTEFOX0NTX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIE1BR0lDIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgZGV0ZWN0aW9uIG9mIHRoZSB3YXZlbGFuIGNhcmQgaXMgbWFkZSBieSByZWFkaW5nIHRoZSBNQUMgYWRkcmVzcworICogZnJvbSB0aGUgY2FyZCBhbmQgY2hlY2tpbmcgaXQuIElmIHlvdSBoYXZlIGEgbm9uIEFUJlQgcHJvZHVjdCAoT0VNLAorICogbGlrZSBERUMgUm9hbUFib3V0LCBvciBEaWdpdGFsIE9jZWFuLCBFcHNvbiwgLi4uKSwgeW91IG11c3QgbW9kaWZ5IHRoaXMKKyAqIHBhcnQgdG8gYWNjb21tb2RhdGUgeW91ciBoYXJkd2FyZS4uLgorICovCitjb25zdCB1bnNpZ25lZCBjaGFyCU1BQ19BRERSRVNTRVNbXVszXSA9Cit7CisgIHsgMHgwOCwgMHgwMCwgMHgwRSB9LAkJLyogQVQmVCBXYXZlbGFuIChzdGFuZGFyZCkgJiBERUMgUm9hbUFib3V0ICovCisgIHsgMHgwOCwgMHgwMCwgMHg2QSB9LAkJLyogQVQmVCBXYXZlbGFuIChhbHRlcm5hdGUpICovCisgIHsgMHgwMCwgMHgwMCwgMHhFMSB9LAkJLyogSGl0YWNoaSBXYXZlbGFuICovCisgIHsgMHgwMCwgMHg2MCwgMHgxRCB9CQkvKiBMdWNlbnQgV2F2ZWxhbiAoYW5vdGhlciBvbmUpICovCisgIC8qIEFkZCB5b3VyIGNhcmQgaGVyZSBhbmQgc2VuZCBtZSB0aGUgcGF0Y2ggISAqLworfTsKKworLyoKKyAqIENvbnN0YW50cyB1c2VkIHRvIGNvbnZlcnQgY2hhbm5lbHMgdG8gZnJlcXVlbmNpZXMKKyAqLworCisvKiBGcmVxdWVuY3kgYXZhaWxhYmxlIGluIHRoZSAyLjAgbW9kZW0sIGluIHVuaXRzIG9mIDI1MCBrSHoKKyAqIChhcyByZWFkIGluIHRoZSBvZmZzZXQgcmVnaXN0ZXIgb2YgdGhlIGRhYyBhcmVhKS4KKyAqIFVzZWQgdG8gbWFwIGNoYW5uZWwgbnVtYmVycyB1c2VkIGJ5IGB3ZnJlcXNlbCcgdG8gZnJlcXVlbmNpZXMKKyAqLworY29uc3Qgc2hvcnQJY2hhbm5lbF9iYW5kc1tdID0geyAweDMwLCAweDU4LCAweDY0LCAweDdBLCAweDgwLCAweEE4LAorCQkJCSAgICAweEQwLCAweEYwLCAweEY4LCAweDE1MCB9OworCisvKiBGcmVxdWVuY2llcyBvZiB0aGUgMS4wIG1vZGVtIChmaXhlZCBmcmVxdWVuY2llcykuCisgKiBVc2UgdG8gbWFwIHRoZSBQU0EgYHN1YmJhbmQnIHRvIGEgZnJlcXVlbmN5CisgKiBOb3RlIDogYWxsIGZyZXF1ZW5jaWVzIGFwYXJ0IGZyb20gdGhlIGZpcnN0IG9uZSBuZWVkIHRvIGJlIG11bHRpcGxpZWQgYnkgMTAKKyAqLworY29uc3QgaW50CWZpeGVkX2JhbmRzW10gPSB7IDkxNWU2LCAyLjQyNWU4LCAyLjQ2ZTgsIDIuNDg0ZTgsIDIuNDMwNWU4IH07CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBQQyBJTlRFUkZBQ0UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogV2F2ZUxBTiBob3N0IGludGVyZmFjZSBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lCUxDQ1IoYmFzZSkJKGJhc2UpCQkvKiBMQU4gQ29udHJvbGxlciBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lCUxDU1IoYmFzZSkJKGJhc2UpCQkvKiBMQU4gQ29udHJvbGxlciBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEFDUihiYXNlKQkoYmFzZSsweDEpCS8qIEhvc3QgQWRhcHRlciBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lCUhBU1IoYmFzZSkJKGJhc2UrMHgxKQkvKiBIb3N0IEFkYXB0ZXIgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBJT1JMKGJhc2UpCShiYXNlKzB4MikJLyogUHJvZ3JhbSBJL08gUmVnaXN0ZXIgTG93ICovCisjZGVmaW5lIFJQTEwoYmFzZSkJKGJhc2UrMHgyKQkvKiBSZWNlaXZlIFBvaW50ZXIgTGF0Y2hlZCBMb3cgKi8KKyNkZWZpbmUgUElPUkgoYmFzZSkJKGJhc2UrMHgzKQkvKiBQcm9ncmFtIEkvTyBSZWdpc3RlciBIaWdoICovCisjZGVmaW5lIFJQTEgoYmFzZSkJKGJhc2UrMHgzKQkvKiBSZWNlaXZlIFBvaW50ZXIgTGF0Y2hlZCBIaWdoICovCisjZGVmaW5lIFBJT1AoYmFzZSkJKGJhc2UrMHg0KQkvKiBQcm9ncmFtIEkvTyBQb3J0ICovCisjZGVmaW5lIE1NUihiYXNlKQkoYmFzZSsweDYpCS8qIE1NSSBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1NRChiYXNlKQkoYmFzZSsweDcpCS8qIE1NSSBEYXRhIFJlZ2lzdGVyICovCisKKy8qIEhvc3QgQWRhcHRvciBDb21tYW5kIFJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIEhBQ1JfTE9GCSAgKDEgPDwgMykJLyogTG9jayBPdXQgRmxhZywgdG9nZ2xlIGV2ZXJ5IDI1MG1zICovCisjZGVmaW5lIEhBQ1JfUFdSX1NUQVQJICAoMSA8PCA0KQkvKiBQb3dlciBTdGF0ZSwgMT1hY3RpdmUsIDA9c2xlZXAgKi8KKyNkZWZpbmUgSEFDUl9UWF9ETUFfUkVTRVQgKDEgPDwgNSkJLyogUmVzZXQgdHJhbnNtaXQgRE1BIHB0ciBvbiBoaWdoICovCisjZGVmaW5lIEhBQ1JfUlhfRE1BX1JFU0VUICgxIDw8IDYpCS8qIFJlc2V0IHJlY2VpdmUgRE1BIHB0ciBvbiBoaWdoICovCisjZGVmaW5lIEhBQ1JfUk9NX1dFTgkgICgxIDw8IDcpCS8qIEVFUFJPTSB3cml0ZSBlbmFibGVkIHdoZW4gdHJ1ZSAqLworCisjZGVmaW5lIEhBQ1JfUkVTRVQgICAgICAgICAgICAgIChIQUNSX1RYX0RNQV9SRVNFVCB8IEhBQ1JfUlhfRE1BX1JFU0VUKQorI2RlZmluZQlIQUNSX0RFRkFVTFQJCShIQUNSX1BXUl9TVEFUKQorCisvKiBIb3N0IEFkYXB0ZXIgU3RhdHVzIFJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIEhBU1JfTU1JX0JVU1kJKDEgPDwgMikJLyogTU1JIGlzIGJ1c3kgd2hlbiB0cnVlICovCisjZGVmaW5lIEhBU1JfTE9GCSgxIDw8IDMpCS8qIExvY2sgb3V0IGZsYWcgc3RhdHVzICovCisjZGVmaW5lIEhBU1JfTk9fQ0xLCSgxIDw8IDQpCS8qIGFjdGl2ZSB3aGVuIG1vZGVtIG5vdCBjb25uZWN0ZWQgKi8KKworLyogTWlzY2VsbGFuZW91cyBiaXQgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBQSU9SSF9TRUxfVFgJKDEgPDwgNSkJLyogUElPUiBwb2ludHMgdG8gMD1yeC8xPXR4IGJ1ZmZlciAqLworI2RlZmluZSBNTVJfTU1JX1dSCSgxIDw8IDApCS8qIE5leHQgTU1JIGN5Y2xlIGlzIDA9cmVhZCwgMT13cml0ZSAqLworI2RlZmluZSBQSU9SSF9NQVNLCTB4MWYJCS8qIG9ubHkgbG93IDUgYml0cyBhcmUgc2lnbmlmaWNhbnQgKi8KKyNkZWZpbmUgUlBMSF9NQVNLCTB4MWYJCS8qIG9ubHkgbG93IDUgYml0cyBhcmUgc2lnbmlmaWNhbnQgKi8KKyNkZWZpbmUgTU1JX0FERFJfTUFTSwkweDdlCQkvKiBCaXRzIDEtNiBvZiBNTVIgYXJlIHNpZ25pZmljYW50ICovCisKKy8qIEF0dHJpYnV0ZSBNZW1vcnkgbWFwICovCisKKyNkZWZpbmUgQ0lTX0FERFIJMHgwMDAwCQkvKiBDYXJkIEluZm9ybWF0aW9uIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQU0FfQUREUgkweDBlMDAJCS8qIFBhcmFtZXRlciBTdG9yYWdlIEFyZWEgYWRkcmVzcyAqLworI2RlZmluZSBFRVBST01fQUREUgkweDEwMDAJCS8qIEVFUFJPTSBhZGRyZXNzICh1bnVzZWQgPykgKi8KKyNkZWZpbmUgQ09SX0FERFIJMHg0MDAwCQkvKiBDb25maWd1cmF0aW9uIE9wdGlvbiBSZWdpc3RlciAqLworCisvKiBDb25maWd1cmF0aW9uIE9wdGlvbiBSZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBDT1JfQ09ORklHCSgxIDw8IDApCS8qIENvbmZpZyBJbmRleCwgMCB3aGVuIHVuY29uZmlndXJlZCAqLworI2RlZmluZSBDT1JfU1dfUkVTRVQJKDEgPDwgNykJLyogU29mdHdhcmUgUmVzZXQgb24gdHJ1ZSAqLworI2RlZmluZSBDT1JfTEVWRUxfSVJRCSgxIDw8IDYpCS8qIExldmVsIElSUSAqLworCisvKiBMb2NhbCBNZW1vcnkgbWFwICovCisKKyNkZWZpbmUgUlhfQkFTRQkJMHgwMDAwCQkvKiBSZWNlaXZlIG1lbW9yeSwgOCBrQiAqLworI2RlZmluZSBUWF9CQVNFCQkweDIwMDAJCS8qIFRyYW5zbWl0IG1lbW9yeSwgMiBrQiAqLworI2RlZmluZSBVTlVTRURfQkFTRQkweDI4MDAJCS8qIFVudXNlZCwgMjIga0IgKi8KKyNkZWZpbmUgUlhfU0laRQkJKFRYX0JBU0UtUlhfQkFTRSkJLyogU2l6ZSBvZiByZWNlaXZlIGFyZWEgKi8KKyNkZWZpbmUgUlhfU0laRV9TSElGVAk2CQkvKiBCaXRzIHRvIHNoaWZ0IGluIHN0b3AgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBUUlVFICAxCisjZGVmaW5lIEZBTFNFIDAKKworI2RlZmluZSBNT0RfRU5BTCAxCisjZGVmaW5lIE1PRF9QUk9NIDIKKworLyogU2l6ZSBvZiBhIE1BQyBhZGRyZXNzICovCisjZGVmaW5lIFdBVkVMQU5fQUREUl9TSVpFCTYKKworLyogTWF4aW11bSBzaXplIG9mIFdhdmVsYW4gcGFja2V0ICovCisjZGVmaW5lIFdBVkVMQU5fTVRVCTE1MDAKKworI2RlZmluZQlNQVhEQVRBWgkJKDYgKyA2ICsgMiArIFdBVkVMQU5fTVRVKQorCisvKioqKioqKioqKioqKioqKioqKioqKiBQQVJBTUVURVIgU1RPUkFHRSBBUkVBICoqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBQYXJhbWV0ZXIgU3RvcmFnZSBBcmVhIChQU0EpLgorICovCit0eXBlZGVmIHN0cnVjdCBwc2FfdAlwc2FfdDsKK3N0cnVjdCBwc2FfdAoreworICAvKiBGb3IgdGhlIFBDTUNJQSBBZGFwdGVyLCBsb2NhdGlvbnMgMHgwMC0weDBGIGFyZSB1bnVzZWQgYW5kIGZpeGVkIGF0IDAwICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2lvX2Jhc2VfYWRkcl8xOwkvKiBbMHgwMF0gQmFzZSBhZGRyZXNzIDEgPz8/ICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2lvX2Jhc2VfYWRkcl8yOwkvKiBbMHgwMV0gQmFzZSBhZGRyZXNzIDIgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfaW9fYmFzZV9hZGRyXzM7CS8qIFsweDAyXSBCYXNlIGFkZHJlc3MgMyAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9pb19iYXNlX2FkZHJfNDsJLyogWzB4MDNdIEJhc2UgYWRkcmVzcyA0ICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3JlbV9ib290X2FkZHJfMTsJLyogWzB4MDRdIFJlbW90ZSBCb290IEFkZHJlc3MgMSAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9yZW1fYm9vdF9hZGRyXzI7CS8qIFsweDA1XSBSZW1vdGUgQm9vdCBBZGRyZXNzIDIgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfcmVtX2Jvb3RfYWRkcl8zOwkvKiBbMHgwNl0gUmVtb3RlIEJvb3QgQWRkcmVzcyAzICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2hvbGlfcGFyYW1zOwkvKiBbMHgwN10gSE9zdCBMYW4gSW50ZXJmYWNlIChIT0xJKSBQYXJhbWV0ZXJzICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2ludF9yZXFfbm87CQkvKiBbMHgwOF0gSW50ZXJydXB0IFJlcXVlc3QgTGluZSAqLworICB1bnNpZ25lZCBjaGFyCXBzYV91bnVzZWQwWzddOwkJLyogWzB4MDktMHgwRl0gdW51c2VkICovCisKKyAgdW5zaWduZWQgY2hhcglwc2FfdW5pdl9tYWNfYWRkcltXQVZFTEFOX0FERFJfU0laRV07CS8qIFsweDEwLTB4MTVdIFVuaXZlcnNhbCAoZmFjdG9yeSkgTUFDIEFkZHJlc3MgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfbG9jYWxfbWFjX2FkZHJbV0FWRUxBTl9BRERSX1NJWkVdOwkvKiBbMHgxNi0xQl0gTG9jYWwgTUFDIEFkZHJlc3MgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfdW5pdl9sb2NhbF9zZWw7CS8qIFsweDFDXSBVbml2ZXJzYWwgTG9jYWwgU2VsZWN0aW9uICovCisjZGVmaW5lCQlQU0FfVU5JVkVSU0FMCTAJCS8qIFVuaXZlcnNhbCAoZmFjdG9yeSkgKi8KKyNkZWZpbmUJCVBTQV9MT0NBTAkxCQkvKiBMb2NhbCAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9jb21wX251bWJlcjsJLyogWzB4MURdIENvbXBhdGFiaWxpdHkgTnVtYmVyOiAqLworI2RlZmluZQkJUFNBX0NPTVBfUENfQVRfOTE1CTAgCS8qIFBDLUFUIDkxNSBNSHoJKi8KKyNkZWZpbmUJCVBTQV9DT01QX1BDX01DXzkxNQkxIAkvKiBQQy1NQyA5MTUgTUh6CSovCisjZGVmaW5lCQlQU0FfQ09NUF9QQ19BVF8yNDAwCTIgCS8qIFBDLUFUIDIuNCBHSHoJKi8KKyNkZWZpbmUJCVBTQV9DT01QX1BDX01DXzI0MDAJMyAJLyogUEMtTUMgMi40IEdIegkqLworI2RlZmluZQkJUFNBX0NPTVBfUENNQ0lBXzkxNQk0IAkvKiBQQ01DSUEgOTE1IE1IeiBvciAyLjAgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfdGhyX3ByZV9zZXQ7CS8qIFsweDFFXSBNb2RlbSBUaHJlc2hvbGQgUHJlc2V0ICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2ZlYXR1cmVfc2VsZWN0OwkvKiBbMHgxRl0gQ2FsbCBjb2RlIHJlcXVpcmVkICgxPW9uKSAqLworI2RlZmluZQkJUFNBX0ZFQVRVUkVfQ0FMTF9DT0RFCTB4MDEgCS8qIENhbGwgY29kZSByZXF1aXJlZCAoSmFwYW4pICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3N1YmJhbmQ7CQkvKiBbMHgyMF0gU3ViYmFuZAkqLworI2RlZmluZQkJUFNBX1NVQkJBTkRfOTE1CQkwCS8qIDkxNSBNSHogb3IgMi4wICovCisjZGVmaW5lCQlQU0FfU1VCQkFORF8yNDI1CTEJLyogMjQyNSBNSHoJKi8KKyNkZWZpbmUJCVBTQV9TVUJCQU5EXzI0NjAJMgkvKiAyNDYwIE1IegkqLworI2RlZmluZQkJUFNBX1NVQkJBTkRfMjQ4NAkzCS8qIDI0ODQgTUh6CSovCisjZGVmaW5lCQlQU0FfU1VCQkFORF8yNDMwXzUJNAkvKiAyNDMwLjUgTUh6CSovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3F1YWxpdHlfdGhyOwkvKiBbMHgyMV0gTW9kZW0gUXVhbGl0eSBUaHJlc2hvbGQgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfbW9kX2RlbGF5OwkJLyogWzB4MjJdIE1vZGVtIERlbGF5ID8/PyAocmVzZXJ2ZWQpICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX253aWRbMl07CQkvKiBbMHgyMy0weDI0XSBOZXR3b3JrIElEICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX253aWRfc2VsZWN0OwkvKiBbMHgyNV0gTmV0d29yayBJRCBTZWxlY3QgT24gT2ZmICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2VuY3J5cHRpb25fc2VsZWN0OwkvKiBbMHgyNl0gRW5jcnlwdGlvbiBPbiBPZmYgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfZW5jcnlwdGlvbl9rZXlbOF07CS8qIFsweDI3LTB4MkVdIEVuY3J5cHRpb24gS2V5ICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2RhdGFidXNfd2lkdGg7CS8qIFsweDJGXSBBVCBidXMgd2lkdGggc2VsZWN0IDgvMTYgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfY2FsbF9jb2RlWzhdOwkvKiBbMHgzMC0weDM3XSAoSmFwYW4pIENhbGwgQ29kZSAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9ud2lkX3ByZWZpeFsyXTsJLyogWzB4MzgtMHgzOV0gUm9hbWluZyBkb21haW4gKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfcmVzZXJ2ZWRbMl07CS8qIFsweDNBLTB4M0JdIFJlc2VydmVkIC0gZml4ZWQgMDAgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfY29uZl9zdGF0dXM7CS8qIFsweDNDXSBDb25mIFN0YXR1cywgYml0IDA9MTpjb25maWcqLworICB1bnNpZ25lZCBjaGFyCXBzYV9jcmNbMl07CQkvKiBbMHgzRF0gQ1JDLTE2IG92ZXIgUFNBICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2NyY19zdGF0dXM7CQkvKiBbMHgzRl0gQ1JDIFZhbGlkIEZsYWcgKi8KK307CisKKy8qIFNpemUgZm9yIHN0cnVjdHVyZSBjaGVja2luZyAoaWYgcGFkZGluZyBpcyBjb3JyZWN0KSAqLworI2RlZmluZQlQU0FfU0laRQk2NAorCisvKiBDYWxjdWxhdGUgb2Zmc2V0IG9mIGEgZmllbGQgaW4gdGhlIGFib3ZlIHN0cnVjdHVyZQorICogV2FybmluZyA6IG9ubHkgZXZlbiBhZGRyZXNzZXMgYXJlIHVzZWQgKi8KKyNkZWZpbmUJcHNhb2ZmKHAsZikgCSgodW5zaWduZWQgc2hvcnQpICgodm9pZCAqKSgmKChwc2FfdCAqKSAoKHZvaWQgKikgTlVMTCArIChwKSkpLT5mKSAtICh2b2lkICopIE5VTEwpKQorCisvKioqKioqKioqKioqKioqKioqKiogTU9ERU0gTUFOQUdFTUVOVCBJTlRFUkZBQ0UgKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBNb2RlbSBNYW5hZ2VtZW50IENvbnRyb2xsZXIgKE1NQykgd3JpdGUgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtbXdfdAltbXdfdDsKK3N0cnVjdCBtbXdfdAoreworICB1bnNpZ25lZCBjaGFyCW1td19lbmNyX2tleVs4XTsJLyogZW5jcnlwdGlvbiBrZXkgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfZW5jcl9lbmFibGU7CS8qIGVuYWJsZS9kaXNhYmxlIGVuY3J5cHRpb24gKi8KKyNkZWZpbmUJTU1XX0VOQ1JfRU5BQkxFX01PREUJMHgwMgkvKiBNb2RlIG9mIHNlY3VyaXR5IG9wdGlvbiAqLworI2RlZmluZQlNTVdfRU5DUl9FTkFCTEVfRU4JMHgwMQkvKiBFbmFibGUgc2VjdXJpdHkgb3B0aW9uICovCisgIHVuc2lnbmVkIGNoYXIJbW13X3VudXNlZDBbMV07CQkvKiB1bnVzZWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfZGVzX2lvX2ludmVydDsJLyogRW5jcnlwdGlvbiBvcHRpb24gKi8KKyNkZWZpbmUJTU1XX0RFU19JT19JTlZFUlRfUkVTCTB4MEYJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUJTU1XX0RFU19JT19JTlZFUlRfQ1RSTAkweEYwCS8qIENvbnRyb2wgPz8/IChzZXQgdG8gMCkgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfdW51c2VkMVs1XTsJCS8qIHVudXNlZCAqLworICB1bnNpZ25lZCBjaGFyCW1td19sb29wdF9zZWw7CQkvKiBsb29wdGVzdCBzZWxlY3Rpb24gKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9ESVNfTldJRAkweDQwCS8qIGRpc2FibGUgTldJRCBmaWx0ZXJpbmcgKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9JTlQJMHgyMAkvKiBhY3RpdmF0ZSBBdHRlbnRpb24gUmVxdWVzdCAqLworI2RlZmluZQlNTVdfTE9PUFRfU0VMX0xTCTB4MTAJLyogbG9vcHRlc3Qgdy9vIGNvbGxpc2lvbiBhdm9pZGFuY2UgKi8KKyNkZWZpbmUgTU1XX0xPT1BUX1NFTF9MVDNBCTB4MDgJLyogbG9vcHRlc3QgM2EgKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9MVDNCCTB4MDQJLyogbG9vcHRlc3QgM2IgKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9MVDNDCTB4MDIJLyogbG9vcHRlc3QgM2MgKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9MVDNECTB4MDEJLyogbG9vcHRlc3QgM2QgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfamFiYmVyX2VuYWJsZTsJLyogamFiYmVyIHRpbWVyIGVuYWJsZSAqLworICAvKiBBYm9ydCB0cmFuc21pc3Npb25zID4gMjAwIG1zICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2ZyZWV6ZTsJCS8qIGZyZWV6ZSAvIHVuZnJlZWV6ZSBzaWduYWwgbGV2ZWwgKi8KKyAgLyogMCA6IHNpZ25hbCBsZXZlbCAmIHF1YWwgdXBkYXRlZCBmb3IgZXZlcnkgbmV3IG1lc3NhZ2UsIDEgOiBmcm96ZW4gKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfYW50ZW5fc2VsOwkJLyogYW50ZW5uYSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgTU1XX0FOVEVOX1NFTF9TRUwJMHgwMQkvKiBkaXJlY3QgYW50ZW5uYSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUJTU1XX0FOVEVOX1NFTF9BTEdfRU4JMHgwMgkvKiBhbnRlbm5hIHNlbGVjdGlvbiBhbGdvLiBlbmFibGUgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfaWZzOwkJLyogaW50ZXIgZnJhbWUgc3BhY2luZyAqLworICAvKiBtaW4gdGltZSBiZXR3ZWVuIHRyYW5zbWlzc2lvbiBpbiBiaXQgcGVyaW9kcyAoLjUgdXMpIC0gYml0IDAgaWdub3JlZCAqLworICB1bnNpZ25lZCBjaGFyCW1td19tb2RfZGVsYXk7CSAJLyogbW9kZW0gZGVsYXkgKHN5bmNocm8pICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2phbV90aW1lOwkJLyogamFtbWluZyB0aW1lIChhZnRlciBjb2xsaXNpb24pICovCisgIHVuc2lnbmVkIGNoYXIJbW13X3VudXNlZDJbMV07CQkvKiB1bnVzZWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfdGhyX3ByZV9zZXQ7CS8qIGxldmVsIHRocmVzaG9sZCBwcmVzZXQgKi8KKyAgLyogRGlzY2FyZCBhbGwgcGFja2V0IHdpdGggc2lnbmFsIDwgdGhpcyB2YWx1ZSAoNCkgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfZGVjYXlfcHJtOwkJLyogZGVjYXkgcGFyYW1ldGVycyAqLworICB1bnNpZ25lZCBjaGFyCW1td19kZWNheV91cGRhdF9wcm07CS8qIGRlY2F5IHVwZGF0ZSBwYXJhbWV0ZXJ6ICovCisgIHVuc2lnbmVkIGNoYXIJbW13X3F1YWxpdHlfdGhyOwkvKiBxdWFsaXR5ICh6LXF1b3RpZW50KSB0aHJlc2hvbGQgKi8KKyAgLyogRGlzY2FyZCBhbGwgcGFja2V0IHdpdGggcXVhbGl0eSA8IHRoaXMgdmFsdWUgKDMpICovCisgIHVuc2lnbmVkIGNoYXIJbW13X25ldHdfaWRfbDsJCS8qIE5XSUQgbG93IG9yZGVyIGJ5dGUgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfbmV0d19pZF9oOwkJLyogTldJRCBoaWdoIG9yZGVyIGJ5dGUgKi8KKyAgLyogTmV0d29yayBJRCBvciBEb21haW4gOiBjcmVhdGUgdmlydHVhbCBuZXQgb24gdGhlIGFpciAqLworCisgIC8qIDIuMCBIYXJkd2FyZSBleHRlbnNpb24gLSBmcmVxdWVuY3kgc2VsZWN0aW9uIHN1cHBvcnQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfbW9kZV9zZWxlY3Q7CS8qIGZvciBhbmFsb2cgdGVzdHMgKHNldCB0byAwKSAqLworICB1bnNpZ25lZCBjaGFyCW1td191bnVzZWQzWzFdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2ZlZV9jdHJsOwkJLyogZnJlcXVlbmN5IGVlcHJvbSBjb250cm9sICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9QUkUJMHgxMAkvKiBFbmFibGUgcHJvdGVjdGVkIGluc3RydWN0aW9ucyAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfRFdMRAkweDA4CS8qIERvd25sb2FkIGVlcHJvbSB0byBtbWMgKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX0NNRAkweDA3CS8qIEVFcHJvbSBjb21tYW5kcyA6ICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9SRUFECTB4MDYJLyogUmVhZCAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfV1JFTgkweDA0CS8qIFdyaXRlIGVuYWJsZSAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfV1JJVEUJMHgwNQkvKiBXcml0ZSBkYXRhIHRvIGFkZHJlc3MgKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1dSQUxMCTB4MDQJLyogV3JpdGUgZGF0YSB0byBhbGwgYWRkcmVzc2VzICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9XRFMJMHgwNAkvKiBXcml0ZSBkaXNhYmxlICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9QUlJFQUQJMHgxNgkvKiBSZWFkIGFkZHIgZnJvbSBwcm90ZWN0IHJlZ2lzdGVyICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9QUkVOCTB4MTQJLyogUHJvdGVjdCByZWdpc3RlciBlbmFibGUgKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1BSQ0xFQVIJMHgxNwkvKiBVbnByb3RlY3QgYWxsIHJlZ2lzdGVycyAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfUFJXUklURQkweDE1CS8qIFdyaXRlIGFkZHIgaW4gcHJvdGVjdCByZWdpc3RlciAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfUFJEUwkweDE0CS8qIFByb3RlY3QgcmVnaXN0ZXIgZGlzYWJsZSAqLworICAvKiBOZXZlciBpc3N1ZSB0aGlzIGNvbW1hbmQgKFBSRFMpIDogaXQncyBpcnJldmVyc2libGUgISEhICovCisKKyAgdW5zaWduZWQgY2hhcgltbXdfZmVlX2FkZHI7CQkvKiBFRXByb20gYWRkcmVzcyAqLworI2RlZmluZQlNTVdfRkVFX0FERFJfQ0hBTk5FTAkweEYwCS8qIFNlbGVjdCB0aGUgY2hhbm5lbCAqLworI2RlZmluZQlNTVdfRkVFX0FERFJfT0ZGU0VUCTB4MEYJLyogT2Zmc2V0IGluIGNoYW5uZWwgZGF0YSAqLworI2RlZmluZQlNTVdfRkVFX0FERFJfRU4JCTB4QzAJLyogRkVFX0NUUkwgZW5hYmxlIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUJTU1XX0ZFRV9BRERSX0RTCQkweDAwCS8qIEZFRV9DVFJMIGRpc2FibGUgb3BlcmF0aW9ucyAqLworI2RlZmluZQlNTVdfRkVFX0FERFJfQUxMCTB4NDAJLyogRkVFX0NUUkwgYWxsIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUJTU1XX0ZFRV9BRERSX0NMRUFSCTB4RkYJLyogRkVFX0NUUkwgY2xlYXIgb3BlcmF0aW9ucyAqLworCisgIHVuc2lnbmVkIGNoYXIJbW13X2ZlZV9kYXRhX2w7CQkvKiBXcml0ZSBkYXRhIHRvIEVFcHJvbSAqLworICB1bnNpZ25lZCBjaGFyCW1td19mZWVfZGF0YV9oOwkJLyogaGlnaCBvY3RldCAqLworICB1bnNpZ25lZCBjaGFyCW1td19leHRfYW50OwkJLyogU2V0dGluZyBmb3IgZXh0ZXJuYWwgYW50ZW5uYSAqLworI2RlZmluZQlNTVdfRVhUX0FOVF9FWFRBTlQJMHgwMQkvKiBTZWxlY3QgZXh0ZXJuYWwgYW50ZW5uYSAqLworI2RlZmluZQlNTVdfRVhUX0FOVF9QT0wJCTB4MDIJLyogUG9sYXJpdHkgb2YgdGhlIGFudGVubmEgKi8KKyNkZWZpbmUJTU1XX0VYVF9BTlRfSU5URVJOQUwJMHgwMAkvKiBJbnRlcm5hbCBhbnRlbm5hICovCisjZGVmaW5lCU1NV19FWFRfQU5UX0VYVEVSTkFMCTB4MDMJLyogRXh0ZXJuYWwgYW50ZW5uYSAqLworI2RlZmluZQlNTVdfRVhUX0FOVF9JUV9URVNUCTB4MUMJLyogSVEgdGVzdCBwYXR0ZXJuIChzZXQgdG8gMCkgKi8KK307CisKKy8qIFNpemUgZm9yIHN0cnVjdHVyZSBjaGVja2luZyAoaWYgcGFkZGluZyBpcyBjb3JyZWN0KSAqLworI2RlZmluZQlNTVdfU0laRQkzNworCisvKiBDYWxjdWxhdGUgb2Zmc2V0IG9mIGEgZmllbGQgaW4gdGhlIGFib3ZlIHN0cnVjdHVyZSAqLworI2RlZmluZQltbXdvZmYocCxmKSAJKHVuc2lnbmVkIHNob3J0KSgodm9pZCAqKSgmKChtbXdfdCAqKSgodm9pZCAqKTAgKyAocCkpKS0+ZikgLSAodm9pZCAqKTApCisKKworLyoKKyAqIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlciAoTU1DKSByZWFkIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbW1yX3QJbW1yX3Q7CitzdHJ1Y3QgbW1yX3QKK3sKKyAgdW5zaWduZWQgY2hhcgltbXJfdW51c2VkMFs4XTsJCS8qIHVudXNlZCAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9kZXNfc3RhdHVzOwkJLyogZW5jcnlwdGlvbiBzdGF0dXMgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZGVzX2F2YWlsOwkJLyogZW5jcnlwdGlvbiBhdmFpbGFibGUgKDB4NTUgcmVhZCkgKi8KKyNkZWZpbmUJTU1SX0RFU19BVkFJTF9ERVMJMHg1NQkJLyogREVTIGF2YWlsYWJsZSAqLworI2RlZmluZQlNTVJfREVTX0FWQUlMX0FFUwkweDMzCQkvKiBBRVMgKEFUJlQpIGF2YWlsYWJsZSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9kZXNfaW9faW52ZXJ0OwkvKiBkZXMgSS9PIGludmVydCByZWdpc3RlciAqLworICB1bnNpZ25lZCBjaGFyCW1tcl91bnVzZWQxWzVdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2RjZV9zdGF0dXM7CQkvKiBEQ0Ugc3RhdHVzICovCisjZGVmaW5lCU1NUl9EQ0VfU1RBVFVTX1JYX0JVU1kJCTB4MDEJLyogcmVjZWl2ZXIgYnVzeSAqLworI2RlZmluZQlNTVJfRENFX1NUQVRVU19MT09QVF9JTkQJMHgwMgkvKiBsb29wIHRlc3QgaW5kaWNhdGVkICovCisjZGVmaW5lCU1NUl9EQ0VfU1RBVFVTX1RYX0JVU1kJCTB4MDQJLyogdHJhbnNtaXR0ZXIgb24gKi8KKyNkZWZpbmUJTU1SX0RDRV9TVEFUVVNfSkJSX0VYUElSRUQJMHgwOAkvKiBqYWJiZXIgdGltZXIgZXhwaXJlZCAqLworI2RlZmluZSBNTVJfRENFX1NUQVRVUwkJCTB4MEYJLyogbWFzayB0byBnZXQgdGhlIGJpdHMgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZHNwX2lkOwkJLyogRFNQIGlkIChBQSA9IERhZWRhbHVzIHJldiBBKSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl91bnVzZWQyWzJdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2NvcnJlY3RfbndpZF9sOwkvKiAjIG9mIGNvcnJlY3QgTldJRCdzIHJ4ZCAobG93KSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9jb3JyZWN0X253aWRfaDsJLyogIyBvZiBjb3JyZWN0IE5XSUQncyByeGQgKGhpZ2gpICovCisgIC8qIFdhcm5pbmcgOiBSZWFkIGhpZ2ggb3JkZXIgb2N0ZXQgZmlyc3QgISEhICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3dyb25nX253aWRfbDsJLyogIyBvZiB3cm9uZyBOV0lEJ3MgcnhkIChsb3cpICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3dyb25nX253aWRfaDsJLyogIyBvZiB3cm9uZyBOV0lEJ3MgcnhkIChoaWdoKSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl90aHJfcHJlX3NldDsJLyogbGV2ZWwgdGhyZXNob2xkIHByZXNldCAqLworI2RlZmluZQlNTVJfVEhSX1BSRV9TRVQJCTB4M0YJCS8qIGxldmVsIHRocmVzaG9sZCBwcmVzZXQgKi8KKyNkZWZpbmUJTU1SX1RIUl9QUkVfU0VUX0NVUgkweDgwCQkvKiBDdXJyZW50IHNpZ25hbCBhYm92ZSBpdCAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9zaWduYWxfbHZsOwkJLyogc2lnbmFsIGxldmVsICovCisjZGVmaW5lCU1NUl9TSUdOQUxfTFZMCQkweDNGCQkvKiBzaWduYWwgbGV2ZWwgKi8KKyNkZWZpbmUJTU1SX1NJR05BTF9MVkxfVkFMSUQJMHg4MAkJLyogVXBkYXRlZCBzaW5jZSBsYXN0IHJlYWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfc2lsZW5jZV9sdmw7CS8qIHNpbGVuY2UgbGV2ZWwgKG5vaXNlKSAqLworI2RlZmluZQlNTVJfU0lMRU5DRV9MVkwJCTB4M0YJCS8qIHNpbGVuY2UgbGV2ZWwgKi8KKyNkZWZpbmUJTU1SX1NJTEVOQ0VfTFZMX1ZBTElECTB4ODAJCS8qIFVwZGF0ZWQgc2luY2UgbGFzdCByZWFkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3NnbmxfcXVhbDsJCS8qIHNpZ25hbCBxdWFsaXR5ICovCisjZGVmaW5lCU1NUl9TR05MX1FVQUwJCTB4MEYJCS8qIHNpZ25hbCBxdWFsaXR5ICovCisjZGVmaW5lCU1NUl9TR05MX1FVQUxfQU5UCTB4ODAJCS8qIGN1cnJlbnQgYW50ZW5uYSB1c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX25ldHdfaWRfbDsJCS8qIE5XSUQgbG93IG9yZGVyIGJ5dGUgPz8/ICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3VudXNlZDNbM107CQkvKiB1bnVzZWQgKi8KKworICAvKiAyLjAgSGFyZHdhcmUgZXh0ZW5zaW9uIC0gZnJlcXVlbmN5IHNlbGVjdGlvbiBzdXBwb3J0ICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2ZlZV9zdGF0dXM7CQkvKiBTdGF0dXMgb2YgZnJlcXVlbmN5IGVlcHJvbSAqLworI2RlZmluZQlNTVJfRkVFX1NUQVRVU19JRAkweEYwCQkvKiBNb2RlbSByZXZpc2lvbiBpZCAqLworI2RlZmluZQlNTVJfRkVFX1NUQVRVU19EV0xECTB4MDgJCS8qIERvd25sb2FkIGluIHByb2dyZXNzICovCisjZGVmaW5lCU1NUl9GRUVfU1RBVFVTX0JVU1kJMHgwNAkJLyogRUVwcm9tIGJ1c3kgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfdW51c2VkNFsxXTsJCS8qIHVudXNlZCAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9mZWVfZGF0YV9sOwkJLyogUmVhZCBkYXRhIGZyb20gZWVwcm9tIChsb3cpICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2ZlZV9kYXRhX2g7CQkvKiBSZWFkIGRhdGEgZnJvbSBlZXByb20gKGhpZ2gpICovCit9OworCisvKiBTaXplIGZvciBzdHJ1Y3R1cmUgY2hlY2tpbmcgKGlmIHBhZGRpbmcgaXMgY29ycmVjdCkgKi8KKyNkZWZpbmUJTU1SX1NJWkUJMzYKKworLyogQ2FsY3VsYXRlIG9mZnNldCBvZiBhIGZpZWxkIGluIHRoZSBhYm92ZSBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUJbW1yb2ZmKHAsZikgCSh1bnNpZ25lZCBzaG9ydCkoKHZvaWQgKikoJigobW1yX3QgKikoKHZvaWQgKikwICsgKHApKSktPmYpIC0gKHZvaWQgKikwKQorCisKKy8qIE1ha2UgdGhlIHR3byBhYm92ZSBzdHJ1Y3R1cmVzIG9uZSAqLwordHlwZWRlZiB1bmlvbiBtbV90Cit7CisgIHN0cnVjdCBtbXdfdAl3OwkvKiBXcml0ZSB0byB0aGUgbW1jICovCisgIHN0cnVjdCBtbXJfdAlyOwkvKiBSZWFkIGZyb20gdGhlIG1tYyAqLworfSBtbV90OworCisjZW5kaWYgLyogX1dBVkVMQU5fQ1NfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5wLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTJlZjhkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5wLmgKQEAgLTAsMCArMSw4MTMgQEAKKy8qCisgKglXYXZlbGFuIFBjbWNpYSBkcml2ZXIKKyAqCisgKgkJSmVhbiBJSSAtIEhQTEIgJzk2CisgKgorICogUmVvcmdhbmlzYXRpb24gYW5kIGV4dGVuc2lvbiBvZiB0aGUgZHJpdmVyLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWluIGFsbCBkZWZpbml0aW9uIGFuZCBkZWNsYXJhdGlvbnMgbmVjZXNzYXJ5IGZvciB0aGUKKyAqIHdhdmVsYW4gcGNtY2lhIGRyaXZlci4gVGhpcyBmaWxlIGlzIGEgcHJpdmF0ZSBoZWFkZXIsIHNvIGl0IHNob3VsZAorICogYmUgaW5jbHVkZWQgb25seSBvbiB3YXZlbGFuX2NzLmMgISEhCisgKi8KKworI2lmbmRlZiBXQVZFTEFOX0NTX1BfSAorI2RlZmluZSBXQVZFTEFOX0NTX1BfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogRE9DVU1FTlRBVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIGRyaXZlciBwcm92aWRlIGEgTGludXggaW50ZXJmYWNlIHRvIHRoZSBXYXZlbGFuIFBjbWNpYSBoYXJkd2FyZQorICogVGhlIFdhdmVsYW4gaXMgYSBwcm9kdWN0IG9mIEx1Y2VudCAoaHR0cDovL3d3dy53YXZlbGFuLmNvbS8pLgorICogVGhpcyBkaXZpc2lvbiB3YXMgZm9ybWVybHkgcGFydCBvZiBOQ1IgYW5kIHRoZW4gQVQmVC4KKyAqIFdhdmVsYW4gYXJlIGFsc28gZGlzdHJpYnV0ZWQgYnkgREVDIChSb2FtQWJvdXQgRFMpLi4uCisgKgorICogVG8ga25vdyBob3cgdG8gdXNlIHRoaXMgZHJpdmVyLCByZWFkIHRoZSBQQ01DSUEgSE9XVE8uCisgKiBJZiB5b3Ugd2FudCB0byBleHBsb2l0IHRoZSBtYW55IG90aGVyIGZvbmN0aW9uYWxpdGllcywgbG9vayBjb21tZW50cworICogaW4gdGhlIGNvZGUuLi4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyB0aGUgcmVzdWx0IG9mIHRoZSBlZmZvcnQgb2YgbWFueSBwZW9wbGVzIChzZWUgYmVsb3cpLgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTUEVDSUZJQyBOT1RFUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBXZWIgcGFnZQorICogLS0tLS0tLS0KKyAqCUkgdHJ5IHRvIG1haW50YWluIGEgd2ViIHBhZ2Ugd2l0aCB0aGUgV2lyZWxlc3MgTEFOIEhvd3RvIGF0IDoKKyAqCSAgICBodHRwOi8vd3d3LmhwbC5ocC5jb20vcGVyc29uYWwvSmVhbl9Ub3VycmlsaGVzL0xpbnV4L1dhdmVsYW4uaHRtbAorICoKKyAqIFNNUAorICogLS0tCisgKglXZSBub3cgYXJlIFNNUCBjb21wbGlhbnQgKEkgZXZlbnR1YWxseSBmaXhlZCB0aGUgcmVtYWluaW5nIGJ1Z3MpLgorICoJVGhlIGRyaXZlciBoYXMgYmVlbiB0ZXN0ZWQgb24gYSBkdWFsIFA2LTE1MCBhbmQgc3Vydml2ZWQgbXkgdXN1YWwKKyAqCXNldCBvZiB0b3J0dXJlIHRlc3RzLgorICoJQW55d2F5LCBJIHNwZW50IGVub3VnaCB0aW1lIGNoYXNpbmcgaW50ZXJydXB0IHJlLWVudHJhbmN5IGR1cmluZworICoJZXJyb3JzIG9yIHJlY29uZmlndXJlLCBhbmQgSSBkZXNpZ25lZCB0aGUgbG9ja2VkL3VubG9ja2VkIHNlY3Rpb25zCisgKglvZiB0aGUgZHJpdmVyIHdpdGggZ3JlYXQgY2FyZSwgYW5kIHdpdGggdGhlIHJlY2VudCBhZGRpdGlvbiBvZgorICoJdGhlIHNwaW5sb2NrICh0aGFua3MgdG8gdGhlIG5ldyBBUEkpLCB3ZSBzaG91bGQgYmUgcXVpdGUgY2xvc2UgdG8KKyAqCXRoZSB0cnV0aC4KKyAqCVRoZSBTTVAvSVJRIGxvY2tpbmcgaXMgcXVpdGUgY29hcnNlIGFuZCBjb25zZXJ2YXRpdmUgKGkuZS4gbm90IGZhc3QpLAorICoJYnV0IGJldHRlciBzYWZlIHRoYW4gc29ycnkgKGVzcGVjaWFsbHkgYXQgMiBNYi9zIDstKS4KKyAqCisgKglJIGhhdmUgYWxzbyBsb29rZWQgaW50byBkaXNhYmxpbmcgb25seSBvdXIgaW50ZXJydXB0IG9uIHRoZSBjYXJkCisgKgkodmlhIEhBQ1IpIGluc3RlYWQgb2YgYWxsIGludGVycnVwdHMgaW4gdGhlIHByb2Nlc3NvciAodmlhIGNsaSksCisgKglzbyB0aGF0IG90aGVyIGRyaXZlciBhcmUgbm90IGltcGFjdGVkLCBhbmQgaXQgbG9vayBsaWtlIGl0J3MKKyAqCXBvc3NpYmxlLCBidXQgaXQncyB2ZXJ5IHRyaWNreSB0byBkbyByaWdodCAoZnVsbCBvZiByYWNlcykuIEFzCisgKgl0aGUgZ2FpbiB3b3VsZCBiZSBtb3N0bHkgZm9yIFNNUCBzeXN0ZW1zLCBpdCBjYW4gd2FpdC4uLgorICoKKyAqIERlYnVnZ2luZyBhbmQgb3B0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKglZb3Ugd2lsbCBmaW5kIGJlbG93IGEgc2V0IG9mICcjZGVmaW5lIiBhbGxvd2luZyBhIHZlcnkgZmluZSBjb250cm9sCisgKglvbiB0aGUgZHJpdmVyIGJlaGF2aW91ciBhbmQgdGhlIGRlYnVnIG1lc3NhZ2VzIHByaW50ZWQuCisgKglUaGUgbWFpbiBvcHRpb25zIGFyZSA6CisgKglvIFdBVkVMQU5fUk9BTUlORywgZm9yIHRoZSBleHBlcmltZW50YWwgcm9hbWluZyBzdXBwb3J0LgorICoJbyBTRVRfUFNBX0NSQywgdG8gaGF2ZSB5b3VyIGNhcmQgY29ycmVjdGx5IHJlY29nbmlzZWQgYnkKKyAqCSAgYW4gYWNjZXNzIHBvaW50IGFuZCB0aGUgUG9pbnQtdG8tUG9pbnQgZGlhZ25vc3RpYyB0b29sLgorICoJbyBVU0VfUFNBX0NPTkZJRywgdG8gcmVhZCBjb25maWd1cmF0aW9uIGZyb20gdGhlIFBTQSAoRUVwcm9tKQorICoJICAob3RoZXJ3aXNlIHdlIGFsd2F5cyBzdGFydCBhZnJlc2ggd2l0aCBzb21lIGRlZmF1bHRzKQorICoKKyAqIHdhdmVsYW5fY3MubyBpcyBkYXJuIHRvbyBiaWcKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCVRoYXQncyB0cnVlICEgVGhlcmUgaXMgYSB2ZXJ5IHNpbXBsZSB3YXkgdG8gcmVkdWNlIHRoZSBkcml2ZXIKKyAqCW9iamVjdCBieSAzMyUgKHllcyAhKS4gQ29tbWVudCBvdXQgdGhlIGZvbGxvd2luZyBsaW5lIDoKKyAqCQkjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyAqCU90aGVyIGNvbXBpbGUgb3B0aW9ucyBjYW4gYWxzbyByZWR1Y2UgdGhlIHNpemUgb2YgaXQuLi4KKyAqCisgKiBNQUMgYWRkcmVzcyBhbmQgaGFyZHdhcmUgZGV0ZWN0aW9uIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCVRoZSBkZXRlY3Rpb24gY29kZSBvZiB0aGUgd2F2ZWxhbiBjaGVjaCB0aGF0IHRoZSBmaXJzdCAzCisgKglvY3RldHMgb2YgdGhlIE1BQyBhZGRyZXNzIGZpdCB0aGUgY29tcGFueSBjb2RlLiBUaGlzIHR5cGUgb2YKKyAqCWRldGVjdGlvbiB3b3JrIHdlbGwgZm9yIEFUJlQgY2FyZHMgKGJlY2F1c2UgdGhlIEFUJlQgY29kZSBpcworICoJaGFyZGNvZGVkIGluIHdhdmVsYW5fY3MuaCksIGJ1dCBvZiBjb3Vyc2Ugd2lsbCBmYWlsIGZvciBvdGhlcgorICoJbWFudWZhY3R1cmVyLgorICoKKyAqCUlmIHlvdSBhcmUgc3VyZSB0aGF0IHlvdXIgY2FyZCBpcyBkZXJpdmVkIGZyb20gdGhlIHdhdmVsYW4sCisgKgloZXJlIGlzIHRoZSB3YXkgdG8gY29uZmlndXJlIGl0IDoKKyAqCTEpIEdldCB5b3VyIE1BQyBhZGRyZXNzCisgKgkJYSkgV2l0aCB5b3VyIGNhcmQgdXRpbGl0aWVzICh3ZnJlcXNlbCwgaW5zdGNvbmYsIC4uLikKKyAqCQliKSBXaXRoIHRoZSBkcml2ZXIgOgorICoJCQlvIGNvbXBpbGUgdGhlIGtlcm5lbCB3aXRoIERFQlVHX0NPTkZJR19JTkZPIGVuYWJsZWQKKyAqCQkJbyBCb290IGFuZCBsb29rIHRoZSBjYXJkIG1lc3NhZ2VzCisgKgkyKSBTZXQgeW91ciBNQUMgY29kZSAoMyBvY3RldHMpIGluIE1BQ19BRERSRVNTRVNbXVszXSAod2F2ZWxhbl9jcy5oKQorICoJMykgQ29tcGlsZSAmIHZlcmlmeQorICoJNCkgU2VuZCBtZSB0aGUgTUFDIGNvZGUgLSBJIHdpbGwgaW5jbHVkZSBpdCBpbiB0aGUgbmV4dCB2ZXJzaW9uLi4uCisgKgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXSVJFTEVTUyBFWFRFTlNJT05TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFRoaXMgZHJpdmVyIGlzIHRoZSBmaXJzdCBvbmUgdG8gc3VwcG9ydCAid2lyZWxlc3MgZXh0ZW5zaW9ucyIuCisgKiBUaGlzIHNldCBvZiBleHRlbnNpb25zIHByb3ZpZGUgeW91IHNvbWUgd2F5IHRvIGNvbnRyb2wgdGhlIHdpcmVsZXNzCisgKiBjYXJhY3RlcmlzdGljcyBvZiB0aGUgaGFyZHdhcmUgaW4gYSBzdGFuZGFyZCB3YXkgYW5kIHN1cHBvcnQgZm9yCisgKiBhcHBsaWNhdGlvbnMgZm9yIHRha2luZyBhZHZhbnRhZ2Ugb2YgaXQgKGxpa2UgTW9iaWxlIElQKS4KKyAqCisgKiBZb3Ugd2lsbCBuZWVkIHRvIGVuYWJsZSB0aGUgQ09ORklHX05FVF9SQURJTyBkZWZpbmUgaW4gdGhlIGtlcm5lbAorICogY29uZmlndXJhdGlvbiB0byBlbmFibGUgdGhlIHdpcmVsZXNzIGV4dGVuc2lvbnMgKHRoaXMgaXMgdGhlIG9uZQorICogZ2l2aW5nIGFjY2VzcyB0byB0aGUgcmFkaW8gbmV0d29yayBkZXZpY2UgY2hvaWNlKS4KKyAqCisgKiBJdCBtaWdodCBhbHNvIGJlIGEgZ29vZCBpZGVhIGFzIHdlbGwgdG8gZmV0Y2ggdGhlIHdpcmVsZXNzIHRvb2xzIHRvCisgKiBjb25maWd1cmUgdGhlIGRldmljZSBhbmQgcGxheSBhIGJpdC4KKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZJTEVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiB3YXZlbGFuX2NzLmMgOglUaGUgYWN0dWFsIGNvZGUgZm9yIHRoZSBkcml2ZXIgLSBDIGZ1bmN0aW9ucworICoKKyAqIHdhdmVsYW5fY3MucC5oIDoJUHJpdmF0ZSBoZWFkZXIgOiBsb2NhbCB0eXBlcyAvIHZhcnMgZm9yIHRoZSBkcml2ZXIKKyAqCisgKiB3YXZlbGFuX2NzLmggOglEZXNjcmlwdGlvbiBvZiB0aGUgaGFyZHdhcmUgaW50ZXJmYWNlICYgc3RydWN0cworICoKKyAqIGk4MjU5My5oIDoJCURlc2NyaXB0aW9uIGlmIHRoZSBFdGhlcm5ldCBjb250cm9sbGVyCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhJU1RPUlkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogVGhlIGhpc3Rvcnkgb2YgdGhlIFdhdmVsYW4gZHJpdmVycyBpcyBhcyBjb21wbGljYXRlZCBhcyBoaXN0b3J5IG9mCisgKiB0aGUgV2F2ZWxhbiBpdHNlbGYgKE5DUiAtPiBBVCZUIC0+IEx1Y2VudCkuCisgKgorICogQWxsIHN0YXJ0ZWQgd2l0aCBBbmRlcnMgS2xlbWV0cyA8a2xlbWV0c0BwYXVsLnJ1dGdlcnMuZWR1PiwKKyAqIHdyaXR0aW5nIGEgV2F2ZWxhbiBJU0EgZHJpdmVyIGZvciB0aGUgTUFDSCBtaWNyb2tlcm5lbC4gR2lyaXNoCisgKiBXZWxsaW5nIDx3ZWxsaW5nQHBhdWwucnV0Z2Vycy5lZHU+IGhhZCBhbHNvIHdvcmtlZCBvbiBpdC4KKyAqIEtlaXRoIE1vb3JlIG1vZGlmeSB0aGlzIGZvciB0aGUgUGNtY2lhIGhhcmR3YXJlLgorICogCisgKiBSb2JlcnQgTW9ycmlzIDxydG1AZGFzLmhhcnZhcmQuZWR1PiBwb3J0IHRoZXNlIHR3byBkcml2ZXJzIHRvIEJTREkKKyAqIGFuZCBhZGQgc3BlY2lmaWMgUGNtY2lhIHN1cHBvcnQgKHRoZXJlIGlzIGN1cnJlbnRseSBubyBlcXVpdmFsZW50CisgKiBvZiB0aGUgUENNQ0lBIHBhY2thZ2UgdW5kZXIgQlNELi4uKS4KKyAqCisgKiBKaW0gQmlua2xleSA8anJiQGNzLnBkeC5lZHU+IHBvcnQgYm90aCBCU0RJIGRyaXZlcnMgdG8gRnJlZUJTRC4KKyAqCisgKiBCcnVjZSBKYW5zb24gPGJydWNlQGNzLnVzeWQuZWR1LmF1PiBwb3J0IHRoZSBCU0RJIElTQSBkcml2ZXIgdG8gTGludXguCisgKgorICogQW50aG9ueSBELiBKb3NlcGggPGFkakBsY3MubWl0LmVkdT4gc3RhcnRlZCBtb2RpZnkgQnJ1Y2UgZHJpdmVyCisgKiAod2l0aCBoZWxwIG9mIHRoZSBCU0RJIFBDTUNJQSBkcml2ZXIpIGZvciBQQ01DSUEuCisgKiBZdW56aG91IExpIDx5dW56aG91QHN0cmF0LmlvbC51bmguZWR1PiBmaW5pc2hlZCBpcyB3b3JrLgorICogSm9lIEZpbm5leSA8am9lQGNvbXAubGFuY3MuYWMudWs+IHBhdGNoZWQgdGhlIGRyaXZlciB0byBzdGFydAorICogY29ycmVjdGx5IDIuMDAgY2FyZHMgKDIuNCBHSHogd2l0aCBmcmVxdWVuY3kgc2VsZWN0aW9uKS4KKyAqIERhdmlkIEhpbmRzIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4gaW50ZWdyYXRlZCB0aGUgd2hvbGUgaW4gaGlzCisgKiBQY21jaWEgcGFja2FnZSAoKyBidWcgY29ycmVjdGlvbnMpLgorICoKKyAqIEkgKEplYW4gVG91cnJpbGhlcyAtIGp0QGhwbGIuaHBsLmhwLmNvbSkgdGhlbiBzdGFydGVkIHRvIG1ha2Ugc29tZQorICogcGF0Y2hzIHRvIHRoZSBQY21jaWEgZHJpdmVyLiBBZnRlciwgSSBhZGRlZCBjb2RlIGluIHRoZSBJU0EgZHJpdmVyCisgKiBmb3IgV2lyZWxlc3MgRXh0ZW5zaW9ucyBhbmQgZnVsbCBzdXBwb3J0IG9mIGZyZXF1ZW5jeSBzZWxlY3Rpb24KKyAqIGNhcmRzLiBOb3csIEknbSBkb2luZyB0aGUgc2FtZSB0byB0aGUgUGNtY2lhIGRyaXZlciArIHNvbWUKKyAqIHJlb3JnYW5pc2F0aW9uLgorICogTG9la2UgQnJlZGVydmVsZCA8bGJyZWRlcnZAd2F2ZWxhbi5jb20+IGZyb20gTHVjZW50IGhhcyBnaXZlbiBtZQorICogbXVjaCBuZWVkZWQgaW5mb3JtYXRpb25zIG9uIHRoZSBXYXZlbGFuIGhhcmR3YXJlLgorICovCisKKy8qIEJ5IHRoZSB3YXkgOiBmb3IgdGhlIGNvcHlyaWdodCAmIGxlZ2FsIHN0dWZmIDoKKyAqIEFsbW9zdCBldmVyeWJvZHkgd3JvdGUgY29kZSB1bmRlciBHTlUgb3IgQlNEIGxpY2Vuc2UgKG9yIGFsaWtlKSwKKyAqIGFuZCB3YW50IHRoYXQgdGhlaXIgb3JpZ2luYWwgY29weXJpZ2h0IHJlbWFpbiBzb21ld2hlcmUgaW4gdGhlCisgKiBjb2RlIChmb3IgbXlzZWxmLCBJIGdvIHdpdGggdGhlIEdQTCkuCisgKiBOb2JvZHkgd2FudCB0byB0YWtlIHJlc3BvbnNpYmlsaXR5IGZvciBhbnl0aGluZywgZXhjZXB0IHRoZSBmYW1lLi4uCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENSRURJVFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogQ3JlZGl0czoKKyAqICAgIFNwZWNpYWwgdGhhbmtzIHRvIEphbiBIb29nZW5kb29ybiBvZiBBVCZUIEdJUyBVdHJlY2h0IGFuZAorICoJTG9la2UgQnJlZGVydmVsZCBvZiBMdWNlbnQgZm9yIHByb3ZpZGluZyBleHRyZW1lbHkgdXNlZnVsCisgKglpbmZvcm1hdGlvbiBhYm91dCBXYXZlTEFOIFBDTUNJQSBoYXJkd2FyZQorICoKKyAqICAgIFRoaXMgZHJpdmVyIGlzIGJhc2VkIHVwb24gc2V2ZXJhbCBvdGhlciBkcml2ZXJzLCBpbiBwYXJ0aWN1bGFyOgorICoJRGF2aWQgSGluZHMnIExpbnV4IGRyaXZlciBmb3IgdGhlIFBDTUNJQSAzYzU4OSBldGhlcm5ldCBhZGFwdGVyCisgKglCcnVjZSBKYW5zb24ncyBMaW51eCBkcml2ZXIgZm9yIHRoZSBBVC1idXMgV2F2ZUxBTiBhZGFwdGVyCisgKglBbmRlcnMgS2xlbWV0cycgUENNQ0lBIFdhdmVMQU4gYWRhcHRlciBkcml2ZXIKKyAqCVJvYmVydCBNb3JyaXMnIEJTREkgZHJpdmVyIGZvciB0aGUgUENNQ0lBIFdhdmVMQU4gYWRhcHRlcgorICoKKyAqIEFkZGl0aW9uYWwgQ3JlZGl0czoKKyAqCisgKiAgICBUaGlzIHNvZnR3YXJlIHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZCB1bmRlciBMaW51eCAxLjIuMworICoJKFNsYWNrd2FyZSAyLjAgZGlzdHJpYnV0aW9uKS4KKyAqICAgIEFuZCB0aGVuIHVuZGVyIExpbnV4IDIuMC54IChEZWJpYW4gMS4xIC0+IDIuMiAtIHBjbWNpYSAyLjguMTgrKQorICoJd2l0aCBhbiBIUCBPbW5pQm9vayA0MDAwIGFuZCB0aGVuIGEgNTUwMC4KKyAqCisgKiAgICBJdCBpcyBiYXNlZCBvbiBvdGhlciBkZXZpY2UgZHJpdmVycyBhbmQgaW5mb3JtYXRpb24gZWl0aGVyIHdyaXR0ZW4KKyAqICAgIG9yIHN1cHBsaWVkIGJ5OgorICoJSmFtZXMgQXNodG9uIChqYWExMDFAc3lzZW5nLmFudS5lZHUuYXUpLAorICoJQWpheSBCYWtyZSAoYmFrcmVAcGF1bC5ydXRnZXJzLmVkdSksCisgKglEb25hbGQgQmVja2VyIChiZWNrZXJAc3VwZXIub3JnKSwKKyAqCUppbSBCaW5rbGV5IDxqcmJAY3MucGR4LmVkdT4sCisgKglMb2VrZSBCcmVkZXJ2ZWxkIDxsYnJlZGVydkB3YXZlbGFuLmNvbT4sCisgKglBbGxhbiBDcmVpZ2h0b24gKGFsbGFuY0Bjcy5zdS5vei5hdSksCisgKglCcmVudCBFbHBoaWNrIDxiZWxwaGlja0B1d2F0ZXJsb28uY2E+LAorICoJSm9lIEZpbm5leSA8am9lQGNvbXAubGFuY3MuYWMudWs+LAorICoJTWF0dGhldyBHZWllciAobWF0dGhld0Bjcy5zdS5vei5hdSksCisgKglSZW1vIGRpIEdpb3Zhbm5pIChyZW1vQGNzLnN1Lm96LmF1KSwKKyAqCU1hcmsgSGFnYW4gKG1oYWdhbkB3dGNwb3N0LmRheXRvbm9oLk5DUi5DT00pLAorICoJRGF2aWQgSGluZHMgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0PiwKKyAqCUphbiBIb29nZW5kb29ybiAoYy9vIG1hcnRlaWpuQGx1Y2VudC5jb20pLAorICogICAgICBCcnVjZSBKYW5zb24gPGJydWNlQGNzLnVzeWQuZWR1LmF1PiwKKyAqCUFudGhvbnkgRC4gSm9zZXBoIDxhZGpAbGNzLm1pdC5lZHU+LAorICoJQW5kZXJzIEtsZW1ldHMgKGtsZW1ldHNAcGF1bC5ydXRnZXJzLmVkdSksCisgKglZdW56aG91IExpIDx5dW56aG91QHN0cmF0LmlvbC51bmguZWR1PiwKKyAqCU1hcmMgTWVlcnRlbnMgKG1tZWVydGVuc0BsdWNlbnQuY29tKSwKKyAqCUtlaXRoIE1vb3JlLAorICoJUm9iZXJ0IE1vcnJpcyAocnRtQGRhcy5oYXJ2YXJkLmVkdSksCisgKglJYW4gUGFya2luIChpYW5AY3Muc3Uub3ouYXUpLAorICoJSm9obiBSb3NlbmJlcmcgKGpvaG5yQGNzLnN1Lm96LmF1KSwKKyAqCUdlb3JnZSBSb3NzaSAoZ2VvcmdlQHBobS5nb3YuYXUpLAorICoJQXJ0aHVyIFNjb3R0IChhcnRodXJAY3Muc3Uub3ouYXUpLAorICoJU3RhbmlzbGF2IFNpbnlhZ2luIDxzdGFzQGlzZi5ydT4KKyAqCVBldGVyIFN0b3JleSwKKyAqCUplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4sCisgKglHaXJpc2ggV2VsbGluZyAod2VsbGluZ0BwYXVsLnJ1dGdlcnMuZWR1KQorICoJQ2xhcmsgV29vZHdvcnRoIDxjbGFya0BoaXdheTEuZXhpdDEwOS5jb20+CisgKglZb25nZ3VhbmcgWmhhbmcgPHlnekBpc2wuaHJsLmhhYy5jb20+Li4uCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJTVBST1ZFTUVOVFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIEkgcHJvdWRseSBwcmVzZW50IDoKKyAqCisgKiBDaGFuZ2VzIG1hZGUgaW4gMi44LjIyIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gaW1wcm92ZWQgd3Zfc2V0X211bHRpY2FzdF9saXN0CisgKgktIGNhdGNoIHNwdXJpb3VzIGludGVycnVwdAorICoJLSBjb3JyZWN0IHJlbGVhc2Ugb2YgdGhlIGRldmljZQorICoKKyAqIENoYW5nZXMgbWFkZXMgaW4gcmVsZWFzZSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gUmVvcmdhbmlzYXRpb24gb2YgdGhlIGNvZGUsIGZ1bmN0aW9uIG5hbWUgY2hhbmdlCisgKgktIENyZWF0aW9uIG9mIHByaXZhdGUgaGVhZGVyICh3YXZlbGFuX2NzLmgpCisgKgktIFJlb3JnYW5pc2VkIGRlYnVnIG1lc3NhZ2VzCisgKgktIE1vcmUgY29tbWVudHMsIGhpc3RvcnksIC4uLgorICoJLSBDb25maWd1cmUgZWFybGllciAoaW4gImluc2VydCIgaW5zdGVhZCBvZiAib3BlbiIpCisgKiAgICAgICAgYW5kIGRvIHRoaW5ncyBvbmx5IG9uY2UKKyAqCS0gbW1jX2luaXQgOiBjb25maWd1cmUgdGhlIFBTQSBpZiBub3QgZG9uZQorICoJLSBtbWNfaW5pdCA6IDIuMDAgZGV0ZWN0aW9uIGJldHRlciBjb2RlIGZvciAyLjAwIGluaXQKKyAqCS0gYmV0dGVyIGluZm8gYXQgc3RhcnR1cAorICoJLSBDb3JyZWN0IGEgSFVHRSBidWcgKHZvbGF0aWxlICYgdW5jYWxpYnJhdGVkIGJ1c3kgbG9vcCkKKyAqCSAgaW4gd3ZfODI1OTNfY21kID0+IGNvbmZpZyBzcGVlZHVwCisgKgktIFN0b3AgcmVjZWl2aW5nICYgcG93ZXIgZG93biBvbiBjbG9zZSAoYW5kIHBvd2VyIHVwIG9uIG9wZW4pCisgKgkgIHVzZSAiaWZjb25maWcgZG93biIgJiAiaWZjb25maWcgdXAgOyByb3V0ZSBhZGQgLW5ldCAuLi4iCisgKgktIFNlbmQgcGFja2V0cyA6IGFkZCB3YXRjaGRvZyBpbnN0ZWFkIG9mIHBvb2xpbmcKKyAqCS0gUmVjZWl2ZSA6IGNoZWNrIGZyYW1lIHdyYXAgYXJvdW5kICYgdHJ5IHRvIHJlY292ZXIgc29tZSBmcmFtZXMKKyAqCS0gd2F2ZWxhbl9zZXRfbXVsdGljYXN0X2xpc3QgOiBhdm9pZCByZXNldAorICoJLSBhZGQgd2lyZWxlc3MgZXh0ZW5zaW9ucyAoaW9jdGwgJiBnZXRfd2lyZWxlc3Nfc3RhdHMpCisgKgkgIGdldC9zZXQgbndpZC9mcmVxdWVuY3kgb24gZmx5LCBpbmZvIGZvciAvcHJvYy9uZXQvd2lyZWxlc3MKKyAqCS0gU3VwcHJlc3MgdXNlbGVzcyBzdHVmZiBmcm9tIGxwIChuZXRfbG9jYWwpLCBidXQgYWRkIGxpbmsKKyAqCS0gTW9yZSBpbmxpbmVzCisgKgktIExvdCBvZiBvdGhlcnMgbWlub3IgZGV0YWlscyAmIGNsZWFudXBzCisgKgorICogQ2hhbmdlcyBtYWRlIGluIHNlY29uZCByZWxlYXNlIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBPcHRpbWlzZSB3dl84NTg5M19yZWNvbmZpZyBzdHVmZiwgZml4IHBvdGVudGlhbCBwcm9ibGVtcworICoJLSBDaGFuZ2UgZXJyb3IgdmFsdWVzIGZvciBpb2N0bAorICoJLSBOb24gYmxvY2tpbmcgd3ZfcnVfc3RvcCgpICsgY2FsbCB3dl9yZXNldCgpIGluIGNhc2Ugb2YgcHJvYmxlbXMKKyAqCS0gUmVtb3ZlIGRldmVsb3BtZW50IHByaW50ayBmcm9tIHdhdmVsYW5fd2F0Y2hkb2coKQorICoJLSBSZW1vdmUgb2YgdGhlIHdhdGNoZG9nIHRvIHdhdmVsYW5fY2xvc2UgaW5zdGVhZCBvZiB3YXZlbGFuX3JlbGVhc2UKKyAqCSAgZml4IHBvdGVudGlhbCBwcm9ibGVtcy4uLgorICoJLSBTdGFydCBkZWJ1Z2dpbmcgc3VzcGVuZCBzdHVmZiAoYnV0IGl0J3Mgc3RpbGwgYSBiaXQgd2VpcmQpCisgKgktIERlYnVnICYgb3B0aW1pemUgZHVtcCBoZWFkZXIvcGFja2V0IGluIFJ4ICYgVHggKGRlYnVnKQorICoJLSBVc2UgInJlYWRiIiBhbmQgIndyaXRlYiIgdG8gYmUga2VybmVsIDIuMSBjb21wbGlhbnQKKyAqCS0gQmV0dGVyIGhhbmRsaW5nIG9mIGJvZ3VzIGludGVycnVwdHMKKyAqCS0gV2lyZWxlc3MgZXh0ZW5zaW9uIDogU0VUU1BZIGFuZCBHRVRTUFkKKyAqCS0gUmVtb3ZlIG9sZCBzdHVmZiAoc3RhdHMgLSBmb3IgdGhvc2UgbmVlZGluZyBpdCwganVzdCBhc2sgbWUuLi4pCisgKgktIE1ha2Ugd2lyZWxlc3MgZXh0ZW5zaW9ucyBvcHRpb25hbAorICoKKyAqIENoYW5nZXMgbWFkZSBpbiB0aGlyZCByZWxlYXNlIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIGNsZWFudXBzICYgdHlwb3MKKyAqCS0gbW9kaWYgd2lyZWxlc3MgZXh0IChzcHkgLT4gb25seSBvbmUgcG9pbnRlcikKKyAqCS0gbmV3IHByaXZhdGUgaW9jdGwgdG8gc2V0L2dldCBxdWFsaXR5ICYgbGV2ZWwgdGhyZXNob2xkCisgKgktIEluaXQgOiBjb3JyZWN0IGRlZmF1bHQgdmFsdWUgb2YgbGV2ZWwgdGhyZXNob2xkIGZvciBwY21jaWEKKyAqCS0ga2lsbCB3YXRjaGRvZyBpbiBod19yZXNldAorICoJLSBtb3JlIDIuMSBzdXBwb3J0IChjb3B5X3RvL2Zyb21fdXNlciBpbnN0ZWFkIG9mIG1lbWNweV90by9mcm9tZnMpCisgKgktIEFkZCBtZXNzYWdlIGxldmVsIChkZWJ1ZyBzdHVmZiBpbiAvdmFyL2FkbS9kZWJ1ZyAmIGVycm9ycyBub3QKKyAqCSAgZGlzcGxheWVkIGF0IGNvbnNvbGUgYW5kIHN0aWxsIGluIC92YXIvYWRtL21lc3NhZ2VzKQorICoKKyAqIENoYW5nZXMgbWFkZSBpbiBmb3VydGggcmVsZWFzZSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gbXVsdGljYXN0IHN1cHBvcnQgKHllcyAhKSB0aGFua3MgdG8gWW9uZ2d1YW5nIFpoYW5nLgorICoKKyAqIENoYW5nZXMgbWFkZSBpbiBmaWZ0aCByZWxlYXNlICgyLjkuMCkgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBSZXZpc2l0ZWQgbXVsdGljYXN0IGNvZGUgKGl0IHdhcyBtb3N0bHkgd3JvbmcpLgorICoJLSBwcm90ZWN0IGNvZGUgaW4gd3ZfODI1OTNfcmVjb25maWcgd2l0aCBkZXYtPnRidXN5IChvdXBzICEpCisgKgorICogQ2hhbmdlcyBtYWRlIGluIHNpeHRoIHJlbGVhc2UgKDIuOS4xYSkgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gQ2hhbmdlIHRoZSBkZXRlY3Rpb24gY29kZSBmb3IgbXVsdGkgbWFudWZhY3R1cmVyIGNvZGUgc3VwcG9ydAorICoJLSBDb3JyZWN0IGJ1ZyAoaGFuZyBrZXJuZWwpIGluIGluaXQgd2hlbiB3ZSB3ZXJlICJyZWplY3RpbmciIGEgY2FyZCAKKyAqCisgKiBDaGFuZ2VzIG1hZGUgaW4gc2V2ZW50aCByZWxlYXNlICgyLjkuMWIpIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gVXBkYXRlIHRvIHdpcmVsZXNzIGV4dGVuc2lvbnMgY2hhbmdlcworICoJLSBTaWxseSBidWcgaW4gY2FyZCBpbml0aWFsIGNvbmZpZ3VyYXRpb24gKHBzYV9jb25mX3N0YXR1cykKKyAqCisgKiBDaGFuZ2VzIG1hZGUgaW4gZWlndGggcmVsZWFzZSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBTbWFsbCBidWcgaW4gZGVidWcgY29kZSAocHJvYmFibHkgbm90IHRoZSBsYXN0IG9uZS4uLikKKyAqCS0gMS4yLjEzIHN1cHBvcnQgKHRoYW5rcyB0byBDbGFyayBXb29kd29ydGgpCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuOS4yYiA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIExldmVsIHRocmVzaG9sZCBpcyBub3cgYSBzdGFuZGFyZCB3aXJlbGVzcyBleHRlbnNpb24gKHZlcnNpb24gNCAhKQorICoJLSBtb2R1bGVzIHBhcmFtZXRlcnMgdHlwZXMgZm9yIGtlcm5lbCA+IDIuMS4xNworICoJLSB1cGRhdGVkIG1hbiBwYWdlCisgKgktIE90aGVycyBjbGVhbnVwIGZyb20gRGF2aWQgSGluZHMKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMi45LjUgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIGJ5dGUgY291bnQgc3RhdHMgKGNvdXJ0ZXN5IG9mIERhdmlkIEhpbmRzKQorICoJLSBSZW1vdmUgZGV2X3RpbnQgc3R1ZmYgKGNvdXJ0ZXN5IG9mIERhdmlkIEhpbmRzKQorICoJLSBPdGhlcnMgY2xlYW51cCBmcm9tIERhdmlkIEhpbmRzCisgKgktIEVuY3J5cHRpb24gc2V0dGluZyBmcm9tIEJyZW50IEVscGhpY2sgKHRoYW5rcyBhIGxvdCAhKQorICoJLSAnYmFzZScgdG8gJ3VfbG9uZycgZm9yIHRoZSBBbHBoYSAodGhhbmtzIHRvIFN0YW5pc2xhdiBTaW55YWdpbikKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMi45LjYgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIGZpeCBidWcgOiBubyBsb25ndWVyIGRpc2FibGUgd2F0Y2hkb2cgaW4gY2FzZSBvZiBib2d1cyBpbnRlcnJ1cHQKKyAqCS0gaW5jcmVhc2UgdGltZW91dCBpbiBjb25maWcgY29kZSBmb3IgcGlja3kgaGFyZHdhcmUKKyAqCS0gbWFzayB1bnVzZWQgYml0cyBpbiBzdGF0dXMgKFdpcmVsZXNzIEV4dGVuc2lvbnMpCisgKgorICogQ2hhbmdlcyBpbnRlZ3JhdGVkIGJ5IEp1c3RpbiBTZWdlciA8anNlZ2VyQE1JVC5FRFU+ICYgRGF2aWQgSGluZHMgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gUm9hbWluZyAiaGFjayIgZnJvbSBKb2UgRmlubmV5IDxqb2VAY29tcC5sYW5jcy5hYy51az4KKyAqCS0gUFNBIENSQyBjb2RlIGZyb20gQm9iIEdyYXkgPHJncmF5QGJhbGQuY3MuZGFydG1vdXRoLmVkdT4KKyAqCS0gQmV0dGVyIGluaXRpYWxpc2F0aW9uIG9mIHRoZSBpODI1OTMgY29udHJvbGxlcgorICoJICBmcm9tIEpvc2VwaCBLLiBPJ1N1bGxpdmFuIDxqb3N1bGx2bitAY3MuY211LmVkdT4KKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMy4wLjEwIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gRml4IGVqZWN0ICJoYW5nIiBvZiB0aGUgZHJpdmVyIHVuZGVyIDIuMi5YIDoKKyAqCQlvIGNyZWF0ZSB3dl9mbHVzaF9zdGFsZV9saW5rcygpCisgKgkJbyBSZW5hbWUgd2F2ZWxhbl9yZWxlYXNlIHRvIHd2X3BjbWNpYV9yZWxlYXNlICYgbW92ZSB1cAorICoJCW8gbW92ZSB1bnJlZ2lzdGVyX25ldGRldiB0byB3YXZlbGFuX2RldGFjaCgpCisgKgkJbyB3YXZlbGFuX3JlbGVhc2UoKSBubyBsb25nZXIgY2FsbCB3YXZlbGFuX2RldGFjaCgpCisgKgkJbyBTdXBwcmVzcyAicmVsZWFzZSIgdGltZXIKKyAqCQlvIE90aGVyIGNsZWFudXBzICYgZml4ZXMKKyAqCS0gTmV3IE1BQyBhZGRyZXNzIGluIHRoZSBwcm9iZQorICoJLSBSZW9yZyBQU0FfQ1JDIGNvZGUgKGVuZGlhbiBuZXV0cmFsICYgY2xlYW5lcikKKyAqCS0gQ29ycmVjdCBpbml0aWFsaXNhdGlvbiBvZiB0aGUgaTgyNTkzIGZyb20gTHVjZW50IG1hbnVhbAorICoJLSBQdXQgYmFjayB0aGUgd2F0Y2hkb2csIHdpdGggbGFyZ2VyIHRpbWVvdXQKKyAqCS0gVFJBTlNNSVRfTk9fQ1JDIGlzIGEgIm5vcm1hbCIgZXJyb3IsIHNvIHJlY292ZXIgZnJvbSBpdAorICoJICBmcm9tIERlcnJpY2sgSiBCcmFzaGVhciA8c2hhZG93QGRlbWVudGlhLm9yZz4KKyAqCS0gQmV0dGVyIGhhbmRsaW5nIG9mIFRYIGFuZCBSWCBub3JtYWwgZmFpbHVyZSBjb25kaXRpb25zCisgKgktICNpZmRlZiBvdXQgYWxsIHRoZSByb2FtaW5nIGNvZGUKKyAqCS0gQWRkIEVTU0lEICYgIkFQIGN1cnJlbnQgYWRkcmVzcyIgaW9jdGwgc3R1YnMKKyAqCS0gR2VuZXJhbCBjbGVhbnVwIG9mIHRoZSBjb2RlCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDMuMC4xMyA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIFJlLWVuYWJsZSBjb21waWxhdGlvbiBvZiByb2FtaW5nIGNvZGUgYnkgZGVmYXVsdCwgYnV0IHdpdGgKKyAqCSAgZG9fcm9hbWluZyA9IDAKKyAqCS0gTnVrZSBgbndpZD1ud2lkXm50b2hzKGJlYWNvbi0+ZG9tYWluX2lkKScgaW4gd2xfcm9hbV9nYXRoZXIKKyAqCSAgYXQgdGhlIGRlbWFuZCBvZiBKb2huIENhcm9sIExhbmdmb3JkIDxqY2xAZ3MxNzYuc3AuY3MuY211LmVkdT4KKyAqCS0gSW50cm9kdWNlZCBXQVZFTEFOX1JPQU1JTkdfRVhUIGZvciBpbmNvbXBsZXRlIEVTU0lEIHN0dWZmLgorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAzLjAuMTUgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBDaGFuZ2UgZS1tYWlsIGFuZCB3ZWIgcGFnZSBhZGRyZXNzZXMKKyAqCS0gV2F0Y2hkb2cgdGltZXIgaXMgbm93IGNvcnJlY3RseSBleHByZXNzZWQgaW4gSFosIG5vdCBpbiBqaWZmaWVzCisgKgktIEFkZCBjaGFubmVsIG51bWJlciB0byB0aGUgbGlzdCBvZiBmcmVxdWVuY2llcyBpbiByYW5nZQorICoJLSBBZGQgdGhlIChzaG9ydCkgbGlzdCBvZiBiaXQtcmF0ZXMgaW4gcmFuZ2UKKyAqCS0gRGV2ZWxvcHAgYSBuZXcgc2Vuc2l0aXZpdHkuLi4gKHNlbnMudmFsdWUgJiBzZW5zLmZpeGVkKQorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAzLjEuMiA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gRml4IGNoZWNrIGZvciByb290IHBlcm1pc3Npb24gKGJyZWFrIGluc3RlYWQgb2YgZXhpdCkKKyAqCS0gTmV3IG53aWQgJiBlbmNvZGluZyBzZXR0aW5nIChXaXJlbGVzcyBFeHRlbnNpb24gOSkKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMy4xLjEyIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gcmV3b3JrZWQgd3ZfODI1OTNfY21kIHRvIGF2b2lkIHVzaW5nIHRoZSBJUlEgaGFuZGxlciBhbmQgZG9pbmcKKyAqCSAgdWdseSB0aGluZ3Mgd2l0aCBpbnRlcnJ1cHRzLgorICoJLSBBZGQgSVJRIHByb3RlY3Rpb24gaW4gODI1OTNfY29uZmlnL3J1X3N0YXJ0L3J1X3N0b3Avd2F0Y2hkb2cKKyAqCS0gVXBkYXRlIHRvIG5ldyBuZXR3b3JrIEFQSSAoc29mdG5ldCAtIDIuMy40MykgOgorICoJCW8gcmVwbGFjZSBkZXYtPnRidXN5IChEYXZpZCArIG1lKQorICoJCW8gcmVwbGFjZSBkZXYtPnRzdGFydCAoRGF2aWQgKyBtZSkKKyAqCQlvIHJlbW92ZSBkZXYtPmludGVycnVwdCAoRGF2aWQpCisgKgkJbyBhZGQgU01QIGxvY2tpbmcgdmlhIHNwaW5sb2NrIGluIHNwbHh4IChtZSkKKyAqCQlvIGFkZCBzcGlubG9jayBpbiBpbnRlcnJ1cHQgaGFuZGxlciAobWUpCisgKgkJbyB1c2Uga2VybmVsIHdhdGNoZG9nIGluc3RlYWQgb2Ygb3VycyAobWUpCisgKgkJbyB2ZXJpZnkgdGhhdCBhbGwgdGhlIGNoYW5nZXMgbWFrZSBzZW5zZSBhbmQgd29yayAobWUpCisgKgktIFJlLXN5bmMga2VybmVsL3BjbWNpYSB2ZXJzaW9ucyAobm90IG11Y2ggYWN0dWFsbHkpCisgKgktIEEgZmV3IG90aGVyIGNsZWFudXBzIChEYXZpZCAmIG1lKS4uLgorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAzLjEuMjIgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBDaGVjayB0aGF0IFNNUCB3b3JrcywgcmVtb3ZlIGFubm95aW5nIGxvZyBtZXNzYWdlCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDMuMS4yNCA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIEZpeCB1bmZyZXF1ZW50IGNhcmQgbG9ja3VwIHdoZW4gd2F0Y2hkb2cgd2FzIHJlc2V0aW5nIHRoZSBoYXJkd2FyZSA6CisgKgkJbyBjb250cm9sIGZpcnN0IGJ1c3kgbG9vcCBpbiB3dl84MjU5M19jbWQoKQorICoJCW8gRXh0ZW5kIHNwaW5sb2NrIHByb3RlY3Rpb24gaW4gd3ZfaHdfY29uZmlnKCkKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMy4xLjMzIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gT3B0aW9uYWwgdXNlIG5ldyBkcml2ZXIgQVBJIGZvciBXaXJlbGVzcyBFeHRlbnNpb25zIDoKKyAqCQlvIGdvdCByaWQgb2Ygd2F2ZWxhbl9pb2N0bCgpCisgKgkJbyB1c2UgYSBidW5jaCBvZiBpd19oYW5kbGVyIGluc3RlYWQKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMy4yLjEgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIFNldCBkZXYtPnRyYW5zX3N0YXJ0IHRvIGF2b2lkIGZpbGxpbmcgdGhlIGxvZ3MKKyAqCQkoYW5kIGdlbmVyYXRpbmcgdXNlbGVzcyBhYm9ydCBjb21tYW5kcykKKyAqCS0gQXZvaWQgZGVhZGxvY2tzIGluIG1tY19vdXQoKS9tbWNfaW4oKQorICoKKyAqIFdpc2hlcyAmIGRyZWFtczoKKyAqIC0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gQ2xlYW51cCBhbmQgaW50ZWdyYXRlIHRoZSByb2FtaW5nIGNvZGUKKyAqCSAgKHN0ZCBkZWJ1Zywgc2V0IERvbWFpbklELCBkZWNheSBhdmcgYW5kIGNvLi4uKQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTkNMVURFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTGludXggaGVhZGVycyB0aGF0IHdlIG5lZWQgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisKKyNpZmRlZiBDT05GSUdfTkVUX1JBRElPCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4JCS8qIFdpcmVsZXNzIGV4dGVuc2lvbnMgKi8KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgkJLyogTmV3IGRyaXZlciBBUEkgKi8KKyNlbmRpZgorCisvKiBQY21jaWEgaGVhZGVycyB0aGF0IHdlIG5lZWQgKi8KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisKKy8qIFdhdmVsYW4gZGVjbGFyYXRpb25zICovCisjaW5jbHVkZSAiaTgyNTkzLmgiCS8qIERlZmluaXRpb25zIGZvciB0aGUgSW50ZWwgY2hpcCAqLworCisjaW5jbHVkZSAid2F2ZWxhbl9jcy5oIgkvKiBPdGhlcnMgYml0cyBvZiB0aGUgaGFyZHdhcmUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIERSSVZFUiBPUFRJT05TICoqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGAjZGVmaW5lJyBvciBgI3VuZGVmJyB0aGUgZm9sbG93aW5nIGNvbnN0YW50IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3VyCisgKiBvZiB0aGUgZHJpdmVyLi4uCisgKi8KKyNkZWZpbmUgV0FWRUxBTl9ST0FNSU5HCQkvKiBJbmNsdWRlIGV4cGVyaW1lbnRhbCByb2FtaW5nIGNvZGUgKi8KKyN1bmRlZiBXQVZFTEFOX1JPQU1JTkdfRVhUCS8qIEVuYWJsZSByb2FtaW5nIHdpcmVsZXNzIGV4dGVuc2lvbnMgKi8KKyN1bmRlZiBTRVRfUFNBX0NSQwkJLyogU2V0IHRoZSBDUkMgaW4gUFNBIChzbG93ZXIpICovCisjZGVmaW5lIFVTRV9QU0FfQ09ORklHCQkvKiBVc2UgaW5mbyBmcm9tIHRoZSBQU0EgKi8KKyN1bmRlZiBTVFJVQ1RfQ0hFQ0sJCS8qIFZlcmlmeSBwYWRkaW5nIG9mIHN0cnVjdHVyZXMgKi8KKyN1bmRlZiBFRVBST01fSVNfUFJPVEVDVEVECS8qIERvZXNuJ3Qgc2VlbSB0byBiZSBuZWNlc3NhcnkgKi8KKyNkZWZpbmUgTVVMVElDQVNUX0FWT0lECQkvKiBBdm9pZCBleHRyYSBtdWx0aWNhc3QgKEknbSBzY2VwdGljYWwpICovCisjdW5kZWYgU0VUX01BQ19BRERSRVNTCQkvKiBFeHBlcmltZW50YWwgKi8KKworI2lmZGVmIFdJUkVMRVNTX0VYVAkvKiBJZiB3aXJlbGVzcyBleHRlbnNpb24gZXhpc3QgaW4gdGhlIGtlcm5lbCAqLworLyogV2FybmluZyA6IHRoZXNlIHN0dWZmIHdpbGwgc2xvdyBkb3duIHRoZSBkcml2ZXIuLi4gKi8KKyNkZWZpbmUgV0lSRUxFU1NfU1BZCQkvKiBFbmFibGUgc3B5aW5nIGFkZHJlc3NlcyAqLworI3VuZGVmIEhJU1RPR1JBTQkJLyogRW5hYmxlIGhpc3RvZ3JhbSBvZiBzaWcgbGV2ZWwuLi4gKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERFQlVHICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI3VuZGVmIERFQlVHX01PRFVMRV9UUkFDRQkvKiBNb2R1bGUgaW5zZXJ0aW9uL3JlbW92YWwgKi8KKyN1bmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQkvKiBDYWxscyBtYWRlIGJ5IExpbnV4ICovCisjdW5kZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCS8qIENhbGxzIHRvIGhhbmRsZXIgKi8KKyN1bmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTwkvKiB0eXBlIG9mIGludGVycnVwdCAmIHNvIG9uICovCisjZGVmaW5lIERFQlVHX0lOVEVSUlVQVF9FUlJPUgkvKiBwcm9ibGVtcyAqLworI3VuZGVmIERFQlVHX0NPTkZJR19UUkFDRQkvKiBUcmFjZSB0aGUgY29uZmlnIGZ1bmN0aW9ucyAqLworI3VuZGVmIERFQlVHX0NPTkZJR19JTkZPCS8qIFdoYXQncyBnb2luZyBvbi4uLiAqLworI2RlZmluZSBERUJVR19DT05GSUdfRVJST1JTCS8qIEVycm9ycyBvbiBjb25maWd1cmF0aW9uICovCisjdW5kZWYgREVCVUdfVFhfVFJBQ0UJCS8qIFRyYW5zbWlzc2lvbiBjYWxscyAqLworI3VuZGVmIERFQlVHX1RYX0lORk8JCS8qIEhlYWRlciBvZiB0aGUgdHJhbnNtaXR0ZWQgcGFja2V0ICovCisjdW5kZWYgREVCVUdfVFhfRkFJTAkJLyogTm9ybWFsIGZhaWx1cmUgY29uZGl0aW9ucyAqLworI2RlZmluZSBERUJVR19UWF9FUlJPUgkJLyogVW5leHBlY3RlZCBjb25kaXRpb25zICovCisjdW5kZWYgREVCVUdfUlhfVFJBQ0UJCS8qIFRyYW5zbWlzc2lvbiBjYWxscyAqLworI3VuZGVmIERFQlVHX1JYX0lORk8JCS8qIEhlYWRlciBvZiB0aGUgdHJhbnNtaXR0ZWQgcGFja2V0ICovCisjdW5kZWYgREVCVUdfUlhfRkFJTAkJLyogTm9ybWFsIGZhaWx1cmUgY29uZGl0aW9ucyAqLworI2RlZmluZSBERUJVR19SWF9FUlJPUgkJLyogVW5leHBlY3RlZCBjb25kaXRpb25zICovCisjdW5kZWYgREVCVUdfUEFDS0VUX0RVTVAJLyogRHVtcCBwYWNrZXQgb24gdGhlIHNjcmVlbiAqLworI3VuZGVmIERFQlVHX0lPQ1RMX1RSQUNFCS8qIE1pc2MgY2FsbCBieSBMaW51eCAqLworI3VuZGVmIERFQlVHX0lPQ1RMX0lORk8JCS8qIFZhcmlvdXMgZGVidWcgaW5mbyAqLworI2RlZmluZSBERUJVR19JT0NUTF9FUlJPUgkvKiBXaGF0J3MgZ29pbmcgd3JvbmcgKi8KKyNkZWZpbmUgREVCVUdfQkFTSUNfU0hPVwkvKiBTaG93IGJhc2ljIHN0YXJ0dXAgaW5mbyAqLworI3VuZGVmIERFQlVHX1ZFUlNJT05fU0hPVwkvKiBQcmludCB2ZXJzaW9uIGluZm8gKi8KKyN1bmRlZiBERUJVR19QU0FfU0hPVwkJLyogRHVtcCBwc2EgdG8gc2NyZWVuICovCisjdW5kZWYgREVCVUdfTU1DX1NIT1cJCS8qIER1bXAgbW1jIHRvIHNjcmVlbiAqLworI3VuZGVmIERFQlVHX1NIT1dfVU5VU0VECS8qIFNob3cgYWxzbyB1bnVzZWQgZmllbGRzICovCisjdW5kZWYgREVCVUdfSTgyNTkzX1NIT1cJLyogU2hvdyBpODI1OTMgc3RhdHVzICovCisjdW5kZWYgREVCVUdfREVWSUNFX1NIT1cJLyogU2hvdyBkZXZpY2UgcGFyYW1ldGVycyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIENPTlNUQU5UUyAmIE1BQ1JPUyAqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBERUJVR19WRVJTSU9OX1NIT1cKK3N0YXRpYyBjb25zdCBjaGFyICp2ZXJzaW9uID0gIndhdmVsYW5fY3MuYyA6IHYyNCAoU01QICsgd2lyZWxlc3MgZXh0ZW5zaW9ucykgMTEvMS8wMlxuIjsKKyNlbmRpZgorCisvKiBXYXRjaGRvZyB0ZW1wb3Jpc2F0aW9uICovCisjZGVmaW5lCVdBVENIRE9HX0pJRkZJRVMJKDI1NipIWi8xMDApCisKKy8qIEZpeCBhIGJ1ZyBpbiBzb21lIG9sZCB3aXJlbGVzcyBleHRlbnNpb24gZGVmaW5pdGlvbnMgKi8KKyNpZm5kZWYgSVdfRVNTSURfTUFYX1NJWkUKKyNkZWZpbmUgSVdfRVNTSURfTUFYX1NJWkUJMzIKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUFJJVkFURSBJT0NUTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBTSU9DU0lQUVRIUglTSU9DSVdGSVJTVFBSSVYJCS8qIFNldCBxdWFsaXR5IHRocmVzaG9sZCAqLworI2RlZmluZSBTSU9DR0lQUVRIUglTSU9DSVdGSVJTVFBSSVYgKyAxCS8qIEdldCBxdWFsaXR5IHRocmVzaG9sZCAqLworI2RlZmluZSBTSU9DU0lQUk9BTSAgICAgU0lPQ0lXRklSU1RQUklWICsgMgkvKiBTZXQgcm9hbWluZyBzdGF0ZSAqLworI2RlZmluZSBTSU9DR0lQUk9BTSAgICAgU0lPQ0lXRklSU1RQUklWICsgMwkvKiBHZXQgcm9hbWluZyBzdGF0ZSAqLworCisjZGVmaW5lIFNJT0NTSVBISVNUTwlTSU9DSVdGSVJTVFBSSVYgKyA0CS8qIFNldCBoaXN0b2dyYW0gcmFuZ2VzICovCisjZGVmaW5lIFNJT0NHSVBISVNUTwlTSU9DSVdGSVJTVFBSSVYgKyA1CS8qIEdldCBoaXN0b2dyYW0gdmFsdWVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogV2F2ZUxBTiBSb2FtaW5nICAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkcJCS8qIENvbmRpdGlvbmFsIGNvbXBpbGUsIHNlZSBhYm92ZSBpbiBvcHRpb25zICovCisKKyNkZWZpbmUgV0FWRUxBTl9ST0FNSU5HX0RFQlVHCSAwCS8qIDEgPSBUcmFjZSBvZiBoYW5kb3ZlciBkZWNpc2lvbnMgKi8KKwkJCQkJLyogMiA9IEluZm8gb24gZWFjaCBiZWFjb24gcmN2ZC4uLiAqLworI2RlZmluZSBNQVhfV0FWRVBPSU5UUwkJNwkvKiBNYXggdmlzaWJsZSBhdCBvbmUgdGltZSAqLworI2RlZmluZSBXQVZFUE9JTlRfSElTVE9SWQk1CS8qIFNOUiBzYW1wbGUgaGlzdG9yeSBzbG93IHNlYXJjaCAqLworI2RlZmluZSBXQVZFUE9JTlRfRkFTVF9ISVNUT1JZCTIJLyogU05SIHNhbXBsZSBoaXN0b3J5IGZhc3Qgc2VhcmNoICovCisjZGVmaW5lIFNFQVJDSF9USFJFU0hfTE9XCTEwCS8qIFNOUiB0byBlbnRlciBjZWxsIHNlYXJjaCAqLworI2RlZmluZSBTRUFSQ0hfVEhSRVNIX0hJR0gJMTMJLyogU05SIHRvIGxlYXZlIGNlbGwgc2VhcmNoICovCisjZGVmaW5lIFdBVkVMQU5fUk9BTUlOR19ERUxUQQkxCS8qIEh5c3RlcmVzaXMgdmFsdWUgKCsvLSBTTlIpICovCisjZGVmaW5lIENFTExfVElNRU9VVAkJMipIWgkvKiBpbiBqaWZmaWVzICovCisKKyNkZWZpbmUgRkFTVF9DRUxMX1NFQVJDSAkxCS8qIEJvb2xlYW4gdmFsdWVzLi4uICovCisjZGVmaW5lIE5XSURfUFJPTUlTQwkJMQkvKiBmb3IgY29kZSBjbGFyaXR5LiAqLworCit0eXBlZGVmIHN0cnVjdCB3YXZlcG9pbnRfYmVhY29uCit7CisgIHVuc2lnbmVkIGNoYXIJCWRzYXAsCQkvKiBVbnVzZWQgKi8KKwkJCXNzYXAsCQkvKiBVbnVzZWQgKi8KKwkJCWN0cmwsCQkvKiBVbnVzZWQgKi8KKwkJCU8sVSxJLAkJLyogVW51c2VkICovCisJCQlzcGVjX2lkMSwJLyogVW51c2VkICovCisJCQlzcGVjX2lkMiwJLyogVW51c2VkICovCisJCQlwZHVfdHlwZSwJLyogVW51c2VkICovCisJCQlzZXE7CQkvKiBXYXZlUG9pbnQgYmVhY29uIHNlcXVlbmNlIG51bWJlciAqLworICB1bnNpZ25lZCBzaG9ydAlkb21haW5faWQsCS8qIFdhdmVQb2ludCBEb21haW4gSUQgKi8KKwkJCW53aWQ7CQkvKiBXYXZlUG9pbnQgTldJRCAqLworfSB3YXZlcG9pbnRfYmVhY29uOworCit0eXBlZGVmIHN0cnVjdCB3YXZlcG9pbnRfaGlzdG9yeQoreworICB1bnNpZ25lZCBzaG9ydAlud2lkOwkJLyogV2F2ZVBvaW50J3MgTldJRCAqLworICBpbnQJCQlhdmVyYWdlX3Nsb3c7CS8qIFNOUiBydW5uaW5nIGF2ZXJhZ2UgKi8KKyAgaW50CQkJYXZlcmFnZV9mYXN0OwkvKiBTTlIgcnVubmluZyBhdmVyYWdlICovCisgIHVuc2lnbmVkIGNoYXIJICBzaWdxdWFsW1dBVkVQT0lOVF9ISVNUT1JZXTsgLyogUmluZ2J1ZmZlciBvZiByZWNlbnQgU05SJ3MgKi8KKyAgdW5zaWduZWQgY2hhcgkJcXVhbHB0cjsJLyogSW5kZXggaW50byByaW5nYnVmZmVyICovCisgIHVuc2lnbmVkIGNoYXIJCWxhc3Rfc2VxOwkvKiBMYXN0IHNlcS4gbm8gc2VlbiBmb3IgV2F2ZVBvaW50ICovCisgIHN0cnVjdCB3YXZlcG9pbnRfaGlzdG9yeSAqbmV4dDsJLyogTmV4dCBXYXZlUG9pbnQgaW4gdGFibGUgKi8KKyAgc3RydWN0IHdhdmVwb2ludF9oaXN0b3J5ICpwcmV2OwkvKiBQcmV2aW91cyBXYXZlUG9pbnQgaW4gdGFibGUgKi8KKyAgdW5zaWduZWQgbG9uZwkJbGFzdF9zZWVuOwkvKiBUaW1lIG9mIGxhc3QgYmVhY29uIHJlY3ZkLCBqaWZmaWVzICovCit9IHdhdmVwb2ludF9oaXN0b3J5OworCitzdHJ1Y3Qgd2F2ZXBvaW50X3RhYmxlCit7CisgIHdhdmVwb2ludF9oaXN0b3J5CSpoZWFkOwkJLyogU3RhcnQgb2YgcmluZ2J1ZmZlciAqLworICBpbnQJCQludW1fd2F2ZXBvaW50czsJLyogTm8uIG9mIFdhdmVQb2ludHMgdmlzaWJsZSAqLworICB1bnNpZ25lZCBjaGFyCQlsb2NrZWQ7CQkvKiBUYWJsZSBsb2NrICovCit9OworCisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVFlQRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTaG9ydGN1dHMgKi8KK3R5cGVkZWYgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJZW5fc3RhdHM7Cit0eXBlZGVmIHN0cnVjdCBpd19zdGF0aXN0aWNzCWl3X3N0YXRzOwordHlwZWRlZiBzdHJ1Y3QgaXdfcXVhbGl0eQlpd19xdWFsOwordHlwZWRlZiBzdHJ1Y3QgaXdfZnJlcQkJaXdfZnJlcTsKK3R5cGVkZWYgc3RydWN0IG5ldF9sb2NhbAluZXRfbG9jYWw7Cit0eXBlZGVmIHN0cnVjdCB0aW1lcl9saXN0CXRpbWVyX2xpc3Q7CisKKy8qIEJhc2ljIHR5cGVzICovCit0eXBlZGVmIHVfY2hhcgkJbWFjX2FkZHJbV0FWRUxBTl9BRERSX1NJWkVdOwkvKiBIYXJkd2FyZSBhZGRyZXNzICovCisKKy8qCisgKiBTdGF0aWMgc3BlY2lmaWMgZGF0YSBmb3IgdGhlIGludGVyZmFjZS4KKyAqCisgKiBGb3IgZWFjaCBuZXR3b3JrIGludGVyZmFjZSwgTGludXgga2VlcCBkYXRhIGluIHR3byBzdHJ1Y3R1cmUuICJkZXZpY2UiCisgKiBrZWVwIHRoZSBnZW5lcmljIGRhdGEgKHNhbWUgZm9ybWF0IGZvciBldmVyeWJvZHkpIGFuZCAibmV0X2xvY2FsIiBrZWVwCisgKiB0aGUgYWRkaXRpb25hbCBzcGVjaWZpYyBkYXRhLgorICogTm90ZSB0aGF0IHNvbWUgb2YgdGhpcyBzcGVjaWZpYyBkYXRhIGlzIGluIGZhY3QgZ2VuZXJpYyAoZW5fc3RhdHMsIGZvcgorICogZXhhbXBsZSkuCisgKi8KK3N0cnVjdCBuZXRfbG9jYWwKK3sKKyAgZGV2X25vZGVfdCAJbm9kZTsJCS8qID8/Pz8gV2hhdCBpcyB0aGlzIHN0dWZmID8/Pz8gKi8KKyAgc3RydWN0IG5ldF9kZXZpY2UgKglkZXY7CQkvKiBSZXZlcnNlIGxpbmsuLi4gKi8KKyAgc3BpbmxvY2tfdAlzcGlubG9jazsJLyogU2VyaWFsaXplIGFjY2VzcyB0byB0aGUgaGFyZHdhcmUgKFNNUCkgKi8KKyAgZGV2X2xpbmtfdCAqCWxpbms7CQkvKiBwY21jaWEgc3RydWN0dXJlICovCisgIGVuX3N0YXRzCXN0YXRzOwkJLyogRXRoZXJuZXQgaW50ZXJmYWNlIHN0YXRpc3RpY3MgKi8KKyAgaW50CQlucmVzZXRzOwkvKiBOdW1iZXIgb2YgaHcgcmVzZXRzICovCisgIHVfY2hhcgljb25maWd1cmVkOwkvKiBJZiBpdCBpcyBjb25maWd1cmVkICovCisgIHVfY2hhcglyZWNvbmZpZ184MjU5MzsJLyogTmVlZCB0byByZWNvbmZpZ3VyZSB0aGUgY29udHJvbGxlciAqLworICB1X2NoYXIJcHJvbWlzY3VvdXM7CS8qIFByb21pc2N1b3VzIG1vZGUgKi8KKyAgdV9jaGFyCWFsbG11bHRpY2FzdDsJLyogQWxsIE11bHRpY2FzdCBtb2RlICovCisgIGludAkJbWNfY291bnQ7CS8qIE51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzICovCisKKyAgaW50ICAgCXN0b3A7CQkvKiBDdXJyZW50IGk4MjU5MyBTdG9wIEhpdCBSZWdpc3RlciAqLworICBpbnQgICAJcmZwOwkJLyogTGFzdCBETUEgbWFjaGluZSByZWNlaXZlIHBvaW50ZXIgKi8KKyAgaW50CQlvdmVycnVubmluZzsJLyogUmVjZWl2ZXIgb3ZlcnJ1biBmbGFnICovCisKKyNpZmRlZiBXSVJFTEVTU19FWFQKKyAgaXdfc3RhdHMJd3N0YXRzOwkJLyogV2lyZWxlc3Mgc3BlY2lmaWMgc3RhdHMgKi8KKworICBzdHJ1Y3QgaXdfc3B5X2RhdGEJc3B5X2RhdGE7CisgIHN0cnVjdCBpd19wdWJsaWNfZGF0YQl3aXJlbGVzc19kYXRhOworI2VuZGlmCisKKyNpZmRlZiBISVNUT0dSQU0KKyAgaW50CQloaXNfbnVtYmVyOwkJLyogTnVtYmVyIG9mIGludGVydmFscyAqLworICB1X2NoYXIJaGlzX3JhbmdlWzE2XTsJCS8qIEJvdW5kYXJpZXMgb2YgaW50ZXJ2YWwgXW4tMTsgbl0gKi8KKyAgdV9sb25nCWhpc19zdW1bMTZdOwkJLyogU3VtIGluIGludGVydmFsICovCisjZW5kaWYJLyogSElTVE9HUkFNICovCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisgIHVfbG9uZwlkb21haW5faWQ7CS8qIERvbWFpbiBJRCB3ZSBsb2NrIG9uIGZvciByb2FtaW5nICovCisgIGludAkJZmlsdGVyX2RvbWFpbnM7CS8qIENoZWNrIERvbWFpbiBJRCBvZiBiZWFjb24gZm91bmQgKi8KKyBzdHJ1Y3Qgd2F2ZXBvaW50X3RhYmxlCXdhdmVwb2ludF90YWJsZTsJLyogVGFibGUgb2YgdmlzaWJsZSBXYXZlUG9pbnRzKi8KKyAgd2F2ZXBvaW50X2hpc3RvcnkgKgljdXJyX3BvaW50OwkJLyogQ3VycmVudCB3YXZlcG9pbnQgKi8KKyAgaW50CQkJY2VsbF9zZWFyY2g7CQkvKiBTZWFyY2hpbmcgZm9yIG5ldyBjZWxsPyAqLworICBzdHJ1Y3QgdGltZXJfbGlzdAljZWxsX3RpbWVyOwkJLyogR2FyYmFnZSBjb2xsZWN0aW9uICovCisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HICovCisgIHZvaWQgX19pb21lbSAqbWVtOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogUFJPVE9UWVBFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJPQU1JTkcgU1VCUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit3YXZlcG9pbnRfaGlzdG9yeSAqd2xfcm9hbV9jaGVjayh1bnNpZ25lZCBzaG9ydCBud2lkLCBuZXRfbG9jYWwgKmxwKTsKK3dhdmVwb2ludF9oaXN0b3J5ICp3bF9uZXdfd2F2ZXBvaW50KHVuc2lnbmVkIHNob3J0IG53aWQsIHVuc2lnbmVkIGNoYXIgc2VxLCBuZXRfbG9jYWwgKmxwKTsKK3ZvaWQgd2xfZGVsX3dhdmVwb2ludCh3YXZlcG9pbnRfaGlzdG9yeSAqd2F2ZXBvaW50LCBuZXRfbG9jYWwgKmxwKTsKK3ZvaWQgd2xfY2VsbF9leHBpcnkodW5zaWduZWQgbG9uZyBkYXRhKTsKK3dhdmVwb2ludF9oaXN0b3J5ICp3bF9iZXN0X3NpZ3F1YWwoaW50IGZhc3Rfc2VhcmNoLCBuZXRfbG9jYWwgKmxwKTsKK3ZvaWQgd2xfdXBkYXRlX2hpc3Rvcnkod2F2ZXBvaW50X2hpc3RvcnkgKndhdmVwb2ludCwgdW5zaWduZWQgY2hhciBzaWdxdWFsLCB1bnNpZ25lZCBjaGFyIHNlcSk7Cit2b2lkIHd2X3JvYW1faGFuZG92ZXIod2F2ZXBvaW50X2hpc3RvcnkgKndhdmVwb2ludCwgbmV0X2xvY2FsICpscCk7Cit2b2lkIHd2X253aWRfZmlsdGVyKHVuc2lnbmVkIGNoYXIgbW9kZSwgbmV0X2xvY2FsICpscCk7Cit2b2lkIHd2X3JvYW1faW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgd3Zfcm9hbV9jbGVhbnVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBNT0RFTSBNQU5BR0VNRU5UIFNVQlJPVVRJTkVTIC0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW5saW5lIHVfY2hhcgkJLyogZGF0YSAqLworCWhhc3JfcmVhZCh1X2xvbmcpOwkvKiBSZWFkIHRoZSBob3N0IGludGVyZmFjZSA6IGJhc2UgYWRkcmVzcyAqLworc3RhdGljIGlubGluZSB2b2lkCisJaGFjcl93cml0ZSh1X2xvbmcsCS8qIFdyaXRlIHRvIGhvc3QgaW50ZXJmYWNlIDogYmFzZSBhZGRyZXNzICovCisJCSAgIHVfY2hhciksCS8qIGRhdGEgKi8KKwloYWNyX3dyaXRlX3Nsb3codV9sb25nLAorCQkgICB1X2NoYXIpOworc3RhdGljIHZvaWQKKwlwc2FfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqLAkvKiBSZWFkIHRoZSBQYXJhbWV0ZXIgU3RvcmFnZSBBcmVhICovCisJCSBpbnQsCQkvKiBvZmZzZXQgaW4gUFNBICovCisJCSB1X2NoYXIgKiwJLyogYnVmZmVyIHRvIGZpbGwgKi8KKwkJIGludCksCQkvKiBzaXplIHRvIHJlYWQgKi8KKwlwc2Ffd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKiwJLyogV3JpdGUgdG8gdGhlIFBTQSAqLworCQkgIGludCwJCS8qIE9mZnNldCBpbiBwc2EgKi8KKwkJICB1X2NoYXIgKiwJLyogQnVmZmVyIGluIG1lbW9yeSAqLworCQkgIGludCk7CQkvKiBMZW5ndGggb2YgYnVmZmVyICovCitzdGF0aWMgaW5saW5lIHZvaWQKKwltbWNfb3V0KHVfbG9uZywJCS8qIFdyaXRlIDEgYnl0ZSB0byB0aGUgTW9kZW0gTWFuYWcgQ29udHJvbCAqLworCQl1X3Nob3J0LAorCQl1X2NoYXIpLAorCW1tY193cml0ZSh1X2xvbmcsCS8qIFdyaXRlIG4gYnl0ZXMgdG8gdGhlIE1NQyAqLworCQkgIHVfY2hhciwKKwkJICB1X2NoYXIgKiwKKwkJICBpbnQpOworc3RhdGljIGlubGluZSB1X2NoYXIJCS8qIFJlYWQgMSBieXRlIGZyb20gdGhlIE1NQyAqLworCW1tY19pbih1X2xvbmcsCisJICAgICAgIHVfc2hvcnQpOworc3RhdGljIGlubGluZSB2b2lkCisJbW1jX3JlYWQodV9sb25nLAkvKiBSZWFkIG4gYnl0ZXMgZnJvbSB0aGUgTU1DICovCisJCSB1X2NoYXIsCisJCSB1X2NoYXIgKiwKKwkJIGludCksCisJZmVlX3dhaXQodV9sb25nLAkvKiBXYWl0IGZvciBmcmVxdWVuY3kgRUVwcm9tIDogYmFzZSBhZGRyZXNzICovCisJCSBpbnQsCQkvKiBCYXNlIGRlbGF5IHRvIHdhaXQgZm9yICovCisJCSBpbnQpOwkJLyogTnVtYmVyIG9mIHRpbWUgdG8gd2FpdCAqLworc3RhdGljIHZvaWQKKwlmZWVfcmVhZCh1X2xvbmcsCS8qIFJlYWQgdGhlIGZyZXF1ZW5jeSBFRXByb20gOiBiYXNlIGFkZHJlc3MgKi8KKwkJIHVfc2hvcnQsCS8qIGRlc3RpbmF0aW9uIG9mZnNldCAqLworCQkgdV9zaG9ydCAqLAkvKiBkYXRhIGJ1ZmZlciAqLworCQkgaW50KTsJCS8qIG51bWJlciBvZiByZWdpc3RlcnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTgyNTkzIFNVQlJPVVRJTkVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50CisJd3ZfODI1OTNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICosCS8qIHN5bmNocm9ub3VzbHkgc2VuZCBhIGNvbW1hbmQgdG8gaTgyNTkzICovIAorCQkgICAgIGNoYXIgKiwKKwkJICAgICBpbnQsCisJCSAgICAgaW50KTsKK3N0YXRpYyBpbmxpbmUgaW50CisJd3ZfZGlhZyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogRGlhZ25vc3RpcXVlIHRoZSBpODI1OTMgKi8KK3N0YXRpYyBpbnQKKwlyZWFkX3JpbmdidWYoc3RydWN0IG5ldF9kZXZpY2UgKiwJLyogUmVhZCBhIHJlY2VpdmUgYnVmZmVyICovCisJCSAgICAgaW50LAorCQkgICAgIGNoYXIgKiwKKwkJICAgICBpbnQpOworc3RhdGljIGlubGluZSB2b2lkCisJd3ZfODI1OTNfcmVjb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIFJlY29uZmlndXJlIHRoZSBjb250cm9sbGVyICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIERFQlVHICYgSU5GTyBTVUJST1VUSU5FUyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW5saW5lIHZvaWQKKwl3dl9pbml0X2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIGRpc3BsYXkgc3RhcnR1cCBpbmZvICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIElPQ1RMLCBTVEFUUyAmIFJFQ09ORklHIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBlbl9zdGF0cwkqCisJd2F2ZWxhbl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIEdpdmUgc3RhdHMgL3Byb2MvbmV0L2RldiAqLworc3RhdGljIGl3X3N0YXRzICoKKwl3YXZlbGFuX2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBBQ0tFVCBSRUNFUFRJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbmxpbmUgaW50CisJd3Zfc3RhcnRfb2ZfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKiwJLyogU2VlayBiZWdnaW5pbmcgb2YgY3VycmVudCBmcmFtZSAqLworCQkJICBpbnQsCS8qIGVuZCBvZiBmcmFtZSAqLworCQkJICBpbnQpOwkvKiBzdGFydCBvZiBidWZmZXIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorCXd2X3BhY2tldF9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICosCS8qIFJlYWQgYSBwYWNrZXQgZnJvbSBhIGZyYW1lICovCisJCSAgICAgICBpbnQsCisJCSAgICAgICBpbnQpLAorCXd2X3BhY2tldF9yY3Yoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIFJlYWQgYWxsIHBhY2tldHMgd2FpdGluZyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBBQ0tFVCBUUkFOU01JU1NJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW5saW5lIHZvaWQKKwl3dl9wYWNrZXRfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKiwJLyogV3JpdGUgYSBwYWNrZXQgdG8gdGhlIFR4IGJ1ZmZlciAqLworCQkJdm9pZCAqLAorCQkJc2hvcnQpOworc3RhdGljIGludAorCXdhdmVsYW5fcGFja2V0X3htaXQoc3RydWN0IHNrX2J1ZmYgKiwJLyogU2VuZCBhIHBhY2tldCAqLworCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICopOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gSEFSRFdBUkUgQ09ORklHVVJBVElPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlubGluZSBpbnQKKwl3dl9tbWNfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogSW5pdGlhbGl6ZSB0aGUgbW9kZW0gKi8KK3N0YXRpYyBpbnQKKwl3dl9ydV9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICopLAkvKiBTdG9wIHRoZSBpODI1OTMgcmVjZWl2ZXIgdW5pdCAqLworCXd2X3J1X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICopOwkvKiBTdGFydCB0aGUgaTgyNTkzIHJlY2VpdmVyIHVuaXQgKi8KK3N0YXRpYyBpbnQKKwl3dl84MjU5M19jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIENvbmZpZ3VyZSB0aGUgaTgyNTkzICovCitzdGF0aWMgaW5saW5lIGludAorCXd2X3BjbWNpYV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogUmVzZXQgdGhlIHBjbWNpYSBpbnRlcmZhY2UgKi8KK3N0YXRpYyBpbnQKKwl3dl9od19jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIFJlc2V0ICYgY29uZmlndXJlIHRoZSB3aG9sZSBoYXJkd2FyZSAqLworc3RhdGljIGlubGluZSB2b2lkCisJd3ZfaHdfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIFNhbWUsICsgc3RhcnQgcmVjZWl2ZXIgdW5pdCAqLworc3RhdGljIGlubGluZSBpbnQKKwl3dl9wY21jaWFfY29uZmlnKGRldl9saW5rX3QgKik7CS8qIENvbmZpZ3VyZSB0aGUgcGNtY2lhIGludGVyZmFjZSAqLworc3RhdGljIHZvaWQKKwl3dl9wY21jaWFfcmVsZWFzZShkZXZfbGlua190ICopOy8qIFJlbW92ZSBhIGRldmljZSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJTlRFUlJVUFQgSEFORExJTkcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlycXJldHVybl90CisJd2F2ZWxhbl9pbnRlcnJ1cHQoaW50LAkvKiBJbnRlcnJ1cHQgaGFuZGxlciAqLworCQkJICB2b2lkICosCisJCQkgIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIHZvaWQKKwl3YXZlbGFuX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICopOwkvKiBUcmFuc21pc3Npb24gd2F0Y2hkb2cgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gQ09ORklHVVJBVElPTiBDQUxMQkFDS1MgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludAorCXdhdmVsYW5fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqKSwJCS8qIE9wZW4gdGhlIGRldmljZSAqLworCXdhdmVsYW5fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIENsb3NlIHRoZSBkZXZpY2UgKi8KK3N0YXRpYyBkZXZfbGlua190ICoKKwl3YXZlbGFuX2F0dGFjaCh2b2lkKTsJCS8qIENyZWF0ZSBhIG5ldyBkZXZpY2UgKi8KK3N0YXRpYyB2b2lkCisJd2F2ZWxhbl9kZXRhY2goZGV2X2xpbmtfdCAqKTsJLyogRGVzdHJveSBhIHJlbW92ZWQgZGV2aWNlICovCitzdGF0aWMgaW50CisJd2F2ZWxhbl9ldmVudChldmVudF90LAkJLyogTWFuYWdlIHBjbWNpYSBldmVudHMgKi8KKwkJICAgICAgaW50LAorCQkgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFZBUklBQkxFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJ3YXZlbGFuX2NzIjsKK3N0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdCA9IE5VTEw7CS8qIExpbmtlZCBsaXN0IG9mIGRldmljZXMgKi8KKworLyoKKyAqIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IHdpdGggJ2luc21vZCcKKyAqIFRoZSBleGFjdCBzeW50YXggaXMgJ2luc21vZCB3YXZlbGFuX2NzLm8gPHZhcj49PHZhbHVlPicKKyAqLworCisvKiBTaGFyZWQgbWVtb3J5IHNwZWVkLCBpbiBucyAqLworc3RhdGljIGludAltZW1fc3BlZWQgPSAwOworCisvKiBOZXcgbW9kdWxlIGludGVyZmFjZSAqLworbW9kdWxlX3BhcmFtKG1lbV9zcGVlZCwgaW50LCAwKTsKKworI2lmZGVmIFdBVkVMQU5fUk9BTUlORwkJLyogQ29uZGl0aW9uYWwgY29tcGlsZSwgc2VlIGFib3ZlIGluIG9wdGlvbnMgKi8KKy8qIEVuYWJsZSByb2FtaW5nIG1vZGUgPyBObyAhIFBsZWFzZSBrZWVwIHRoaXMgdG8gMCAqLworc3RhdGljIGludAlkb19yb2FtaW5nID0gMDsKK21vZHVsZV9wYXJhbShkb19yb2FtaW5nLCBib29sLCAwKTsKKyNlbmRpZgkvKiBXQVZFTEFOX1JPQU1JTkcgKi8KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZW5kaWYJLyogV0FWRUxBTl9DU19QX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjM2ZDkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxLmgKQEAgLTAsMCArMSw2MTQgQEAKKyNpZm5kZWYgX19XTDM1MDFfSF9fCisjZGVmaW5lIF9fV0wzNTAxX0hfXworCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJpZWVlODAyXzExLmgiCisKKy8qIGRlZmluZSBmb3IgV0xBIDIuMCAqLworI2RlZmluZSBXTDM1MDFfQkxLU1ogMjU2CisvKgorICogSUQgZm9yIGlucHV0IFNpZ25hbHMgb2YgRFJJVkVSIGJsb2NrCisgKiBiaXRbNy01XSBpcyBibG9jayBJRDogMDAwCisgKiBiaXRbNC0wXSBpcyBzaWduYWwgSUQKKyovCitlbnVtIHdsMzUwMV9zaWduYWxzIHsKKwlXTDM1MDFfU0lHX0FMQVJNLAorCVdMMzUwMV9TSUdfTURfQ09ORklSTSwKKwlXTDM1MDFfU0lHX01EX0lORCwKKwlXTDM1MDFfU0lHX0FTU09DX0NPTkZJUk0sCisJV0wzNTAxX1NJR19BU1NPQ19JTkQsCisJV0wzNTAxX1NJR19BVVRIX0NPTkZJUk0sCisJV0wzNTAxX1NJR19BVVRIX0lORCwKKwlXTDM1MDFfU0lHX0RFQVVUSF9DT05GSVJNLAorCVdMMzUwMV9TSUdfREVBVVRIX0lORCwKKwlXTDM1MDFfU0lHX0RJU0FTU09DX0NPTkZJUk0sCisJV0wzNTAxX1NJR19ESVNBU1NPQ19JTkQsCisJV0wzNTAxX1NJR19HRVRfQ09ORklSTSwKKwlXTDM1MDFfU0lHX0pPSU5fQ09ORklSTSwKKwlXTDM1MDFfU0lHX1BXUl9NR01UX0NPTkZJUk0sCisJV0wzNTAxX1NJR19SRUFTU09DX0NPTkZJUk0sCisJV0wzNTAxX1NJR19SRUFTU09DX0lORCwKKwlXTDM1MDFfU0lHX1NDQU5fQ09ORklSTSwKKwlXTDM1MDFfU0lHX1NFVF9DT05GSVJNLAorCVdMMzUwMV9TSUdfU1RBUlRfQ09ORklSTSwKKwlXTDM1MDFfU0lHX1JFU1lOQ19DT05GSVJNLAorCVdMMzUwMV9TSUdfU0lURV9DT05GSVJNLAorCVdMMzUwMV9TSUdfU0FWRV9DT05GSVJNLAorCVdMMzUwMV9TSUdfUkZURVNUX0NPTkZJUk0sCisvKgorICogSUQgZm9yIGlucHV0IFNpZ25hbHMgb2YgTUxNRSBibG9jaworICogYml0WzctNV0gaXMgYmxvY2sgSUQ6IDAxMAorICogYml0WzQtMF0gaXMgc2lnbmFsIElECisgKi8KKwlXTDM1MDFfU0lHX0FTU09DX1JFUSA9IDB4MjAsCisJV0wzNTAxX1NJR19BVVRIX1JFUSwKKwlXTDM1MDFfU0lHX0RFQVVUSF9SRVEsCisJV0wzNTAxX1NJR19ESVNBU1NPQ19SRVEsCisJV0wzNTAxX1NJR19HRVRfUkVRLAorCVdMMzUwMV9TSUdfSk9JTl9SRVEsCisJV0wzNTAxX1NJR19QV1JfTUdNVF9SRVEsCisJV0wzNTAxX1NJR19SRUFTU09DX1JFUSwKKwlXTDM1MDFfU0lHX1NDQU5fUkVRLAorCVdMMzUwMV9TSUdfU0VUX1JFUSwKKwlXTDM1MDFfU0lHX1NUQVJUX1JFUSwKKwlXTDM1MDFfU0lHX01EX1JFUSwKKwlXTDM1MDFfU0lHX1JFU1lOQ19SRVEsCisJV0wzNTAxX1NJR19TSVRFX1JFUSwKKwlXTDM1MDFfU0lHX1NBVkVfUkVRLAorCVdMMzUwMV9TSUdfUkZfVEVTVF9SRVEsCisJV0wzNTAxX1NJR19NTV9DT05GSVJNID0gMHg2MCwKKwlXTDM1MDFfU0lHX01NX0lORCwKK307CisKK2VudW0gd2wzNTAxX21pYl9hdHRyaWJzIHsKKwlXTDM1MDFfTUlCX0FUVFJfU1RBVElPTl9JRCwKKwlXTDM1MDFfTUlCX0FUVFJfQVVUSF9BTEdPUklUSE1TLAorCVdMMzUwMV9NSUJfQVRUUl9BVVRIX1RZUEUsCisJV0wzNTAxX01JQl9BVFRSX01FRElVTV9PQ0NVUEFOQ1lfTElNSVQsCisJV0wzNTAxX01JQl9BVFRSX0NGX1BPTExBQkxFLAorCVdMMzUwMV9NSUJfQVRUUl9DRlBfUEVSSU9ELAorCVdMMzUwMV9NSUJfQVRUUl9DRlBNQVhfRFVSQVRJT04sCisJV0wzNTAxX01JQl9BVFRSX0FVVEhfUkVTUF9UTU9VVCwKKwlXTDM1MDFfTUlCX0FUVFJfUlhfRFRJTVMsCisJV0wzNTAxX01JQl9BVFRSX1BSSVZfT1BUX0lNUExFTUVOVEVELAorCVdMMzUwMV9NSUJfQVRUUl9QUklWX0lOVk9LRUQsCisJV0wzNTAxX01JQl9BVFRSX1dFUF9ERUZBVUxUX0tFWVMsCisJV0wzNTAxX01JQl9BVFRSX1dFUF9ERUZBVUxUX0tFWV9JRCwKKwlXTDM1MDFfTUlCX0FUVFJfV0VQX0tFWV9NQVBQSU5HUywKKwlXTDM1MDFfTUlCX0FUVFJfV0VQX0tFWV9NQVBQSU5HU19MRU4sCisJV0wzNTAxX01JQl9BVFRSX0VYQ0xVREVfVU5FTkNSWVBURUQsCisJV0wzNTAxX01JQl9BVFRSX1dFUF9JQ1ZfRVJST1JfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX1dFUF9VTkRFQ1JZUFRBQkxFX0NPVU5ULAorCVdMMzUwMV9NSUJfQVRUUl9XRVBfRVhDTFVERURfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX01BQ19BRERSLAorCVdMMzUwMV9NSUJfQVRUUl9HUk9VUF9BRERSUywKKwlXTDM1MDFfTUlCX0FUVFJfUlRTX1RIUkVTSE9MRCwKKwlXTDM1MDFfTUlCX0FUVFJfU0hPUlRfUkVUUllfTElNSVQsCisJV0wzNTAxX01JQl9BVFRSX0xPTkdfUkVUUllfTElNSVQsCisJV0wzNTAxX01JQl9BVFRSX0ZSQUdfVEhSRVNIT0xELAorCVdMMzUwMV9NSUJfQVRUUl9NQVhfVFhfTVNEVV9MSUZFVElNRSwKKwlXTDM1MDFfTUlCX0FUVFJfTUFYX1JYX0xJRkVUSU1FLAorCVdMMzUwMV9NSUJfQVRUUl9NQU5VRkFDVFVSRVJfSUQsCisJV0wzNTAxX01JQl9BVFRSX1BST0RVQ1RfSUQsCisJV0wzNTAxX01JQl9BVFRSX1RYX0ZSQUdfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX01VTFRJQ0FTVF9UWF9GUkFNRV9DT1VOVCwKKwlXTDM1MDFfTUlCX0FUVFJfRkFJTEVEX0NPVU5ULAorCVdMMzUwMV9NSUJfQVRUUl9SWF9GUkFHX0NPVU5ULAorCVdMMzUwMV9NSUJfQVRUUl9NVUxUSUNBU1RfUlhfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX0ZDU19FUlJPUl9DT1VOVCwKKwlXTDM1MDFfTUlCX0FUVFJfUkVUUllfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX01VTFRJUExFX1JFVFJZX0NPVU5ULAorCVdMMzUwMV9NSUJfQVRUUl9SVFNfU1VDQ0VTU19DT1VOVCwKKwlXTDM1MDFfTUlCX0FUVFJfUlRTX0ZBSUxVUkVfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX0FDS19GQUlMVVJFX0NPVU5ULAorCVdMMzUwMV9NSUJfQVRUUl9GUkFNRV9EVVBMSUNBVEVfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX1BIWV9UWVBFLAorCVdMMzUwMV9NSUJfQVRUUl9SRUdfRE9NQUlOU19TVVBQT1JULAorCVdMMzUwMV9NSUJfQVRUUl9DVVJSRU5UX1JFR19ET01BSU4sCisJV0wzNTAxX01JQl9BVFRSX1NMT1RfVElNRSwKKwlXTDM1MDFfTUlCX0FUVFJfQ0NBX1RJTUUsCisJV0wzNTAxX01JQl9BVFRSX1JYX1RYX1RVUk5BUk9VTkRfVElNRSwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUExDUF9ERUxBWSwKKwlXTDM1MDFfTUlCX0FUVFJfUlhfVFhfU1dJVENIX1RJTUUsCisJV0wzNTAxX01JQl9BVFRSX1RYX1JBTVBfT05fVElNRSwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUkZfREVMQVksCisJV0wzNTAxX01JQl9BVFRSX1NJRlNfVElNRSwKKwlXTDM1MDFfTUlCX0FUVFJfUlhfUkZfREVMQVksCisJV0wzNTAxX01JQl9BVFRSX1JYX1BMQ1BfREVMQVksCisJV0wzNTAxX01JQl9BVFRSX01BQ19QUk9DRVNTSU5HX0RFTEFZLAorCVdMMzUwMV9NSUJfQVRUUl9UWF9SQU1QX09GRl9USU1FLAorCVdMMzUwMV9NSUJfQVRUUl9QUkVBTUJMRV9MRU4sCisJV0wzNTAxX01JQl9BVFRSX1BMQ1BfSEVBREVSX0xFTiwKKwlXTDM1MDFfTUlCX0FUVFJfTVBEVV9EVVJBVElPTl9GQUNUT1IsCisJV0wzNTAxX01JQl9BVFRSX0FJUl9QUk9QQUdBVElPTl9USU1FLAorCVdMMzUwMV9NSUJfQVRUUl9URU1QX1RZUEUsCisJV0wzNTAxX01JQl9BVFRSX0NXX01JTiwKKwlXTDM1MDFfTUlCX0FUVFJfQ1dfTUFYLAorCVdMMzUwMV9NSUJfQVRUUl9TVVBQT1JUX0RBVEFfUkFURVNfVFgsCisJV0wzNTAxX01JQl9BVFRSX1NVUFBPUlRfREFUQV9SQVRFU19SWCwKKwlXTDM1MDFfTUlCX0FUVFJfTVBEVV9NQVhfTEVOLAorCVdMMzUwMV9NSUJfQVRUUl9TVVBQT1JUX1RYX0FOVEVOTkFTLAorCVdMMzUwMV9NSUJfQVRUUl9DVVJSRU5UX1RYX0FOVEVOTkEsCisJV0wzNTAxX01JQl9BVFRSX1NVUFBPUlRfUlhfQU5URU5OQVMsCisJV0wzNTAxX01JQl9BVFRSX0RJVkVSU0lUWV9TVVBQT1JULAorCVdMMzUwMV9NSUJfQVRUUl9ESVZFUlNJVFlfU0VMRUNUSU9OX1JTLAorCVdMMzUwMV9NSUJfQVRUUl9OUl9TVVBQT1JURURfUFdSX0xFVkVMUywKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMMSwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMMiwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMMywKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMNCwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMNSwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMNiwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMNywKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMOCwKKwlXTDM1MDFfTUlCX0FUVFJfQ1VSUkVOVF9UWF9QV1JfTEVWRUwsCisJV0wzNTAxX01JQl9BVFRSX0NVUlJFTlRfQ0hBTiwKKwlXTDM1MDFfTUlCX0FUVFJfQ0NBX01PREVfU1VQUE9SVEVELAorCVdMMzUwMV9NSUJfQVRUUl9DVVJSRU5UX0NDQV9NT0RFLAorCVdMMzUwMV9NSUJfQVRUUl9FRF9USFJFU0hPTEQsCisJV0wzNTAxX01JQl9BVFRSX1NJTlRIRVNJWkVSX0xPQ0tFRCwKKwlXTDM1MDFfTUlCX0FUVFJfQ1VSUkVOVF9QV1JfU1RBVEUsCisJV0wzNTAxX01JQl9BVFRSX0RPWkVfVFVSTk9OX1RJTUUsCisJV0wzNTAxX01JQl9BVFRSX1JDUjMzLAorCVdMMzUwMV9NSUJfQVRUUl9ERUZBVUxUX0NIQU4sCisJV0wzNTAxX01JQl9BVFRSX1NTSUQsCisJV0wzNTAxX01JQl9BVFRSX1BXUl9NR01UX0VOQUJMRSwKKwlXTDM1MDFfTUlCX0FUVFJfTkVUX0NBUEFCSUxJVFksCisJV0wzNTAxX01JQl9BVFRSX1JPVVRJTkcsCit9OworCitlbnVtIHdsMzUwMV9uZXRfdHlwZSB7CisJV0wzNTAxX05FVF9UWVBFX0lORlJBLAorCVdMMzUwMV9ORVRfVFlQRV9BREhPQywKKwlXTDM1MDFfTkVUX1RZUEVfQU5ZX0JTUywKK307CisKK2VudW0gd2wzNTAxX3NjYW5fdHlwZSB7CisJV0wzNTAxX1NDQU5fVFlQRV9BQ1RJVkUsCisJV0wzNTAxX1NDQU5fVFlQRV9QQVNTSVZFLAorfTsKKworZW51bSB3bDM1MDFfdHhfcmVzdWx0IHsKKwlXTDM1MDFfVFhfUkVTVUxUX1NVQ0NFU1MsCisJV0wzNTAxX1RYX1JFU1VMVF9OT19CU1MsCisJV0wzNTAxX1RYX1JFU1VMVF9SRVRSWV9MSU1JVCwKK307CisKK2VudW0gd2wzNTAxX3N5c190eXBlIHsKKwlXTDM1MDFfU1lTX1RZUEVfT1BFTiwKKwlXTDM1MDFfU1lTX1RZUEVfU0hBUkVfS0VZLAorfTsKKworZW51bSB3bDM1MDFfc3RhdHVzIHsKKwlXTDM1MDFfU1RBVFVTX1NVQ0NFU1MsCisJV0wzNTAxX1NUQVRVU19JTlZBTElELAorCVdMMzUwMV9TVEFUVVNfVElNRU9VVCwKKwlXTDM1MDFfU1RBVFVTX1JFRlVTRUQsCisJV0wzNTAxX1NUQVRVU19NQU5ZX1JFUSwKKwlXTDM1MDFfU1RBVFVTX0FMUkVBRFlfQlNTLAorfTsKKworI2RlZmluZSBXTDM1MDFfTUdNVF9DQVBBQklMSVRZX0VTUwkJMHgwMDAxICAvKiBzZWUgODAyLjExIHAuNTggKi8KKyNkZWZpbmUgV0wzNTAxX01HTVRfQ0FQQUJJTElUWV9JQlNTCQkweDAwMDIgIC8qICAgICAgLSAiIC0JICAgKi8KKyNkZWZpbmUgV0wzNTAxX01HTVRfQ0FQQUJJTElUWV9DRl9QT0xMQUJMRQkweDAwMDQgIC8qICAgICAgLSAiIC0JICAgKi8KKyNkZWZpbmUgV0wzNTAxX01HTVRfQ0FQQUJJTElUWV9DRl9QT0xMX1JFUVVFU1QJMHgwMDA4ICAvKiAgICAgIC0gIiAtCSAgICovCisjZGVmaW5lIFdMMzUwMV9NR01UX0NBUEFCSUxJVFlfUFJJVkFDWQkJMHgwMDEwICAvKiAgICAgIC0gIiAtCSAgICovCisKKyNkZWZpbmUgSVdfUkVHX0RPTUFJTl9GQ0MJMHgxMAkvKiBDaGFubmVsIDEgdG8gMTEJVVNBICAgICovCisjZGVmaW5lIElXX1JFR19ET01BSU5fRE9DCTB4MjAJLyogQ2hhbm5lbCAxIHRvIDExCUNhbmFkYSAqLworI2RlZmluZSBJV19SRUdfRE9NQUlOX0VUU0kJMHgzMAkvKiBDaGFubmVsIDEgdG8gMTMJRXVyb3BlICovCisjZGVmaW5lIElXX1JFR19ET01BSU5fU1BBSU4JMHgzMQkvKiBDaGFubmVsIDEwIHRvIDExCVNwYWluICAqLworI2RlZmluZSBJV19SRUdfRE9NQUlOX0ZSQU5DRQkweDMyCS8qIENoYW5uZWwgMTAgdG8gMTMJRnJhbmNlICovCisjZGVmaW5lIElXX1JFR19ET01BSU5fTUtLCTB4NDAJLyogQ2hhbm5lbCAxNAkJSmFwYW4gICovCisjZGVmaW5lIElXX1JFR19ET01BSU5fTUtLMQkweDQxCS8qIENoYW5uZWwgMS0xNAkJSmFwYW4gICovCisjZGVmaW5lIElXX1JFR19ET01BSU5fSVNSQUVMCTB4NTAJLyogQ2hhbm5lbCAzIC0gOQlJc3JhZWwgKi8KKworI2RlZmluZSBJV19NR01UX1JBVEVfTEFCRUxfTUFOREFUT1JZIDEyOCAvKiBNU0IgKi8KKworZW51bSBpd19tZ210X3JhdGVfbGFiZWxzIHsKKwlJV19NR01UX1JBVEVfTEFCRUxfMU1CSVQgICA9IDIsCisJSVdfTUdNVF9SQVRFX0xBQkVMXzJNQklUICAgPSA0LAorCUlXX01HTVRfUkFURV9MQUJFTF81XzVNQklUID0gMTEsCisJSVdfTUdNVF9SQVRFX0xBQkVMXzExTUJJVCAgPSAyMiwKK307CisKK2VudW0gaXdfbWdtdF9pbmZvX2VsZW1lbnRfaWRzIHsKKwlJV19NR01UX0lORk9fRUxFTUVOVF9TU0lELAkJICAvKiBTZXJ2aWNlIFNldCBJZGVudGl0eSAqLworCUlXX01HTVRfSU5GT19FTEVNRU5UX1NVUFBPUlRFRF9SQVRFUywKKwlJV19NR01UX0lORk9fRUxFTUVOVF9GSF9QQVJBTUVURVJfU0VULAorCUlXX01HTVRfSU5GT19FTEVNRU5UX0RTX1BBUkFNRVRFUl9TRVQsCisJSVdfTUdNVF9JTkZPX0VMRU1FTlRfQ1NfUEFSQU1FVEVSX1NFVCwKKwlJV19NR01UX0lORk9fRUxFTUVOVF9DU19USU0sCQkgIC8qIFRyYWZmaWMgSW5mb3JtYXRpb24gTWFwICovCisJSVdfTUdNVF9JTkZPX0VMRU1FTlRfSUJTU19QQVJBTUVURVJfU0VULAorCS8qIDctMTU6IFJlc2VydmVkLCB1bnVzZWQgKi8KKwlJV19NR01UX0lORk9fRUxFTUVOVF9DSEFMTEVOR0VfVEVYVCA9IDE2LAorCS8qIDE3LTMxIFJlc2VydmVkIGZvciBjaGFsbGVuZ2UgdGV4dCBleHRlbnNpb24gKi8KKwkvKiAzMi0yNTUgUmVzZXJ2ZWQsIHVudXNlZCAqLworfTsKKworc3RydWN0IGl3X21nbXRfaW5mb19lbGVtZW50IHsKKwl1OCBpZDsgLyogb25lIG9mIGVudW0gaXdfbWdtdF9pbmZvX2VsZW1lbnRfaWRzLAorCQkgIGJ1dCBzaXplb2YoZW51bSkgPiBzaXplb2YodTgpIDotKCAqLworCXU4IGxlbjsKKwl1OCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpd19tZ210X2Vzc2lkX3BzZXQgeworCXN0cnVjdCBpd19tZ210X2luZm9fZWxlbWVudCBlbDsKKwl1OCAJCQkgICAgZXNzaWRbSVdfRVNTSURfTUFYX1NJWkVdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKiBBY2NvcmRpbmcgdG8gODAyLjExIFdpcmVsZXNzIE5ldG93b3JzLCB0aGUgZGVmaW5pdGl2ZSBndWlkZSAtIE8nUmVpbGx5CisgKiBQZyA3NQorICovIAorI2RlZmluZSBJV19EQVRBX1JBVEVfTUFYX0xBQkVMUyA4CisKK3N0cnVjdCBpd19tZ210X2RhdGFfcnNldCB7CisJc3RydWN0IGl3X21nbXRfaW5mb19lbGVtZW50IGVsOworCXU4IAkJCSAgICBkYXRhX3JhdGVfbGFiZWxzW0lXX0RBVEFfUkFURV9NQVhfTEFCRUxTXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaXdfbWdtdF9kc19wc2V0IHsKKwlzdHJ1Y3QgaXdfbWdtdF9pbmZvX2VsZW1lbnQgZWw7CisJdTggCQkJICAgIGNoYW47Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGl3X21nbXRfY2ZfcHNldCB7CisJc3RydWN0IGl3X21nbXRfaW5mb19lbGVtZW50IGVsOworCXU4IAkJCSAgICBjZnBfY291bnQ7CisJdTggCQkJICAgIGNmcF9wZXJpb2Q7CisJdTE2IAkJCSAgICBjZnBfbWF4X2R1cmF0aW9uOworCXUxNiAJCQkgICAgY2ZwX2R1cl9yZW1haW5pbmc7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGl3X21nbXRfaWJzc19wc2V0IHsKKwlzdHJ1Y3QgaXdfbWdtdF9pbmZvX2VsZW1lbnQgZWw7CisJdTE2IAkJCSAgICBhdGltX3dpbmRvdzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgd2wzNTAxX3R4X2hkciB7CisJdTE2CXR4X2NudDsKKwl1OAlzeW5jWzE2XTsKKwl1MTYJc2ZkOworCXU4CXNpZ25hbDsKKwl1OAlzZXJ2aWNlOworCXUxNglsZW47CisJdTE2CWNyYzE2OworCXUxNglmcmFtZV9jdHJsOworCXUxNglkdXJhdGlvbl9pZDsKKwl1OAlhZGRyMVtFVEhfQUxFTl07CisJdTgJYWRkcjJbRVRIX0FMRU5dOworCXU4CWFkZHIzW0VUSF9BTEVOXTsKKwl1MTYJc2VxX2N0cmw7CisJdTgJYWRkcjRbRVRIX0FMRU5dOworfTsKKworc3RydWN0IHdsMzUwMV9yeF9oZHIgeworCXUxNglyeF9uZXh0X2JsazsKKwl1MTYJcmNfbmV4dF9mcmFtZV9ibGs7CisJdTgJcnhfYmxrX2N0cmw7CisJdTgJcnhfbmV4dF9mcmFtZTsKKwl1OAlyeF9uZXh0X2ZyYW1lMTsKKwl1OAlyc3NpOworCWNoYXIJdGltZVs4XTsKKwl1OAlzaWduYWw7CisJdTgJc2VydmljZTsKKwl1MTYJbGVuOworCXUxNgljcmMxNjsKKwl1MTYJZnJhbWVfY3RybDsKKwl1MTYJZHVyYXRpb247CisJdTgJYWRkcjFbRVRIX0FMRU5dOworCXU4CWFkZHIyW0VUSF9BTEVOXTsKKwl1OAlhZGRyM1tFVEhfQUxFTl07CisJdTE2CXNlcTsKKwl1OAlhZGRyNFtFVEhfQUxFTl07Cit9OworCitzdHJ1Y3Qgd2wzNTAxX3N0YXJ0X3JlcSB7CisJdTE2CQkJICAgIG5leHRfYmxrOworCXU4CQkJICAgIHNpZ19pZDsKKwl1OAkJCSAgICBic3NfdHlwZTsKKwl1MTYJCQkgICAgYmVhY29uX3BlcmlvZDsKKwl1MTYJCQkgICAgZHRpbV9wZXJpb2Q7CisJdTE2CQkJICAgIHByb2JlX2RlbGF5OworCXUxNgkJCSAgICBjYXBfaW5mbzsKKwlzdHJ1Y3QgaXdfbWdtdF9lc3NpZF9wc2V0ICAgc3NpZDsKKwlzdHJ1Y3QgaXdfbWdtdF9kYXRhX3JzZXQgICAgYnNzX2Jhc2ljX3JzZXQ7CisJc3RydWN0IGl3X21nbXRfZGF0YV9yc2V0ICAgIG9wZXJhdGlvbmFsX3JzZXQ7CisJc3RydWN0IGl3X21nbXRfY2ZfcHNldAkgICAgY2ZfcHNldDsKKwlzdHJ1Y3QgaXdfbWdtdF9kc19wc2V0CSAgICBkc19wc2V0OworCXN0cnVjdCBpd19tZ210X2lic3NfcHNldCAgICBpYnNzX3BzZXQ7Cit9OworCitzdHJ1Y3Qgd2wzNTAxX2Fzc29jX3JlcSB7CisJdTE2CW5leHRfYmxrOworCXU4CXNpZ19pZDsKKwl1OAlyZXNlcnZlZDsKKwl1MTYJdGltZW91dDsKKwl1MTYJY2FwX2luZm87CisJdTE2CWxpc3Rlbl9pbnRlcnZhbDsKKwl1OAltYWNfYWRkcltFVEhfQUxFTl07Cit9OworCitzdHJ1Y3Qgd2wzNTAxX2Fzc29jX2NvbmZpcm0geworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcmVzZXJ2ZWQ7CisJdTE2CXN0YXR1czsKK307CisKK3N0cnVjdCB3bDM1MDFfYXNzb2NfaW5kIHsKKwl1MTYJbmV4dF9ibGs7CisJdTgJc2lnX2lkOworCXU4CW1hY19hZGRyW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCB3bDM1MDFfYXV0aF9yZXEgeworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcmVzZXJ2ZWQ7CisJdTE2CXR5cGU7CisJdTE2CXRpbWVvdXQ7CisJdTgJbWFjX2FkZHJbRVRIX0FMRU5dOworfTsKKworc3RydWN0IHdsMzUwMV9hdXRoX2NvbmZpcm0geworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcmVzZXJ2ZWQ7CisJdTE2CXR5cGU7CisJdTE2CXN0YXR1czsKKwl1OAltYWNfYWRkcltFVEhfQUxFTl07Cit9OworCitzdHJ1Y3Qgd2wzNTAxX2dldF9yZXEgeworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcmVzZXJ2ZWQ7CisJdTE2CW1pYl9hdHRyaWI7Cit9OworCitzdHJ1Y3Qgd2wzNTAxX2dldF9jb25maXJtIHsKKwl1MTYJbmV4dF9ibGs7CisJdTgJc2lnX2lkOworCXU4CXJlc2VydmVkOworCXUxNgltaWJfc3RhdHVzOworCXUxNgltaWJfYXR0cmliOworCXU4CW1pYl92YWx1ZVsxMDBdOworfTsKKworc3RydWN0IHdsMzUwMV9qb2luX3JlcSB7CisJdTE2CQkJICAgIG5leHRfYmxrOworCXU4CQkJICAgIHNpZ19pZDsKKwl1OAkJCSAgICByZXNlcnZlZDsKKwlzdHJ1Y3QgaXdfbWdtdF9kYXRhX3JzZXQgICAgb3BlcmF0aW9uYWxfcnNldDsKKwl1MTYJCQkgICAgcmVzZXJ2ZWQyOworCXUxNgkJCSAgICB0aW1lb3V0OworCXUxNgkJCSAgICBwcm9iZV9kZWxheTsKKwl1OAkJCSAgICB0aW1lc3RhbXBbOF07CisJdTgJCQkgICAgbG9jYWxfdGltZVs4XTsKKwl1MTYJCQkgICAgYmVhY29uX3BlcmlvZDsKKwl1MTYJCQkgICAgZHRpbV9wZXJpb2Q7CisJdTE2CQkJICAgIGNhcF9pbmZvOworCXU4CQkJICAgIGJzc190eXBlOworCXU4CQkJICAgIGJzc2lkW0VUSF9BTEVOXTsKKwlzdHJ1Y3QgaXdfbWdtdF9lc3NpZF9wc2V0ICAgc3NpZDsKKwlzdHJ1Y3QgaXdfbWdtdF9kc19wc2V0CSAgICBkc19wc2V0OworCXN0cnVjdCBpd19tZ210X2NmX3BzZXQJICAgIGNmX3BzZXQ7CisJc3RydWN0IGl3X21nbXRfaWJzc19wc2V0ICAgIGlic3NfcHNldDsKKwlzdHJ1Y3QgaXdfbWdtdF9kYXRhX3JzZXQgICAgYnNzX2Jhc2ljX3JzZXQ7Cit9OworCitzdHJ1Y3Qgd2wzNTAxX2pvaW5fY29uZmlybSB7CisJdTE2CW5leHRfYmxrOworCXU4CXNpZ19pZDsKKwl1OAlyZXNlcnZlZDsKKwl1MTYJc3RhdHVzOworfTsKKworc3RydWN0IHdsMzUwMV9wd3JfbWdtdF9yZXEgeworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcHdyX3NhdmU7CisJdTgJd2FrZV91cDsKKwl1OAlyZWNlaXZlX2R0aW1zOworfTsKKworc3RydWN0IHdsMzUwMV9wd3JfbWdtdF9jb25maXJtIHsKKwl1MTYJbmV4dF9ibGs7CisJdTgJc2lnX2lkOworCXU4CXJlc2VydmVkOworCXUxNglzdGF0dXM7Cit9OworCitzdHJ1Y3Qgd2wzNTAxX3NjYW5fcmVxIHsKKwl1MTYJCQkgICAgbmV4dF9ibGs7CisJdTgJCQkgICAgc2lnX2lkOworCXU4CQkJICAgIGJzc190eXBlOworCXUxNgkJCSAgICBwcm9iZV9kZWxheTsKKwl1MTYJCQkgICAgbWluX2NoYW5fdGltZTsKKwl1MTYJCQkgICAgbWF4X2NoYW5fdGltZTsKKwl1OAkJCSAgICBjaGFuX2xpc3RbMTRdOworCXU4CQkJICAgIGJzc2lkW0VUSF9BTEVOXTsKKwlzdHJ1Y3QgaXdfbWdtdF9lc3NpZF9wc2V0ICAgc3NpZDsKKwllbnVtIHdsMzUwMV9zY2FuX3R5cGUJICAgIHNjYW5fdHlwZTsKK307CisKK3N0cnVjdCB3bDM1MDFfc2Nhbl9jb25maXJtIHsKKwl1MTYJCQkgICAgbmV4dF9ibGs7CisJdTgJCQkgICAgc2lnX2lkOworCXU4CQkJICAgIHJlc2VydmVkOworCXUxNgkJCSAgICBzdGF0dXM7CisJY2hhcgkJCSAgICB0aW1lc3RhbXBbOF07CisJY2hhcgkJCSAgICBsb2NhbHRpbWVbOF07CisJdTE2CQkJICAgIGJlYWNvbl9wZXJpb2Q7CisJdTE2CQkJICAgIGR0aW1fcGVyaW9kOworCXUxNgkJCSAgICBjYXBfaW5mbzsKKwl1OAkJCSAgICBic3NfdHlwZTsKKwl1OAkJCSAgICBic3NpZFtFVEhfQUxFTl07CisJc3RydWN0IGl3X21nbXRfZXNzaWRfcHNldCAgIHNzaWQ7CisJc3RydWN0IGl3X21nbXRfZHNfcHNldAkgICAgZHNfcHNldDsKKwlzdHJ1Y3QgaXdfbWdtdF9jZl9wc2V0CSAgICBjZl9wc2V0OworCXN0cnVjdCBpd19tZ210X2lic3NfcHNldCAgICBpYnNzX3BzZXQ7CisJc3RydWN0IGl3X21nbXRfZGF0YV9yc2V0ICAgIGJzc19iYXNpY19yc2V0OworCXU4CQkJICAgIHJzc2k7Cit9OworCitzdHJ1Y3Qgd2wzNTAxX3N0YXJ0X2NvbmZpcm0geworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcmVzZXJ2ZWQ7CisJdTE2CXN0YXR1czsKK307CisKK3N0cnVjdCB3bDM1MDFfbWRfcmVxIHsKKwl1MTYJbmV4dF9ibGs7CisJdTgJc2lnX2lkOworCXU4CXJvdXRpbmc7CisJdTE2CWRhdGE7CisJdTE2CXNpemU7CisJdTgJcHJpOworCXU4CXNlcnZpY2VfY2xhc3M7CisJdTgJZGFkZHJbRVRIX0FMRU5dOworCXU4CXNhZGRyW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCB3bDM1MDFfbWRfaW5kIHsKKwl1MTYJbmV4dF9ibGs7CisJdTgJc2lnX2lkOworCXU4CXJvdXRpbmc7CisJdTE2CWRhdGE7CisJdTE2CXNpemU7CisJdTgJcmVjZXB0aW9uOworCXU4CXByaTsKKwl1OAlzZXJ2aWNlX2NsYXNzOworCXU4CWRhZGRyW0VUSF9BTEVOXTsKKwl1OAlzYWRkcltFVEhfQUxFTl07Cit9OworCitzdHJ1Y3Qgd2wzNTAxX21kX2NvbmZpcm0geworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcmVzZXJ2ZWQ7CisJdTE2CWRhdGE7CisJdTgJc3RhdHVzOworCXU4CXByaTsKKwl1OAlzZXJ2aWNlX2NsYXNzOworfTsKKworc3RydWN0IHdsMzUwMV9yZXN5bmNfcmVxIHsKKwl1MTYJbmV4dF9ibGs7CisJdTgJc2lnX2lkOworfTsKKworLyogRGVmaW5pdGlvbnMgZm9yIHN1cHBvcnRpbmcgY2xvbmUgYWRhcHRlcnMuICovCisvKiBTeXN0ZW0gSW50ZXJmYWNlIFJlZ2lzdGVycyAoU0lSIHNwYWNlKSAqLworI2RlZmluZSBXTDM1MDFfTklDX0dDUiAoKHU4KTB4MDApCS8qIFNJUjAgLSBHZW5lcmFsIENvbmYgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgV0wzNTAxX05JQ19CU1MgKCh1OCkweDAxKQkvKiBTSVIxIC0gQmFuayBTd2l0Y2hpbmcgU2VsZWN0IFJlZyAqLworI2RlZmluZSBXTDM1MDFfTklDX0xNQUwgKCh1OCkweDAyKQkvKiBTSVIyIC0gTG9jYWwgTWVtIGFkZHIgUmVnIFs3OjBdICovCisjZGVmaW5lIFdMMzUwMV9OSUNfTE1BSCAoKHU4KTB4MDMpCS8qIFNJUjMgLSBMb2NhbCBNZW0gYWRkciBSZWcgWzE0OjhdICovCisjZGVmaW5lIFdMMzUwMV9OSUNfSU9EUEEgKCh1OCkweDA0KQkvKiBTSVI0IC0gSS9PIERhdGEgUG9ydCBBICovCisjZGVmaW5lIFdMMzUwMV9OSUNfSU9EUEIgKCh1OCkweDA1KQkvKiBTSVI1IC0gSS9PIERhdGEgUG9ydCBCICovCisjZGVmaW5lIFdMMzUwMV9OSUNfSU9EUEMgKCh1OCkweDA2KQkvKiBTSVI2IC0gSS9PIERhdGEgUG9ydCBDICovCisjZGVmaW5lIFdMMzUwMV9OSUNfSU9EUEQgKCh1OCkweDA3KQkvKiBTSVI3IC0gSS9PIERhdGEgUG9ydCBEICovCisKKy8qIEJpdHMgaW4gR0NSICovCisjZGVmaW5lIFdMMzUwMV9HQ1JfU1dSRVNFVCAoKHU4KTB4ODApCisjZGVmaW5lIFdMMzUwMV9HQ1JfQ09SRVNFVCAoKHU4KTB4NDApCisjZGVmaW5lIFdMMzUwMV9HQ1JfRElTUFdETiAoKHU4KTB4MjApCisjZGVmaW5lIFdMMzUwMV9HQ1JfRUNXQUlUICAoKHU4KTB4MTApCisjZGVmaW5lIFdMMzUwMV9HQ1JfRUNJTlQgICAoKHU4KTB4MDgpCisjZGVmaW5lIFdMMzUwMV9HQ1JfSU5UMkVDICAoKHU4KTB4MDQpCisjZGVmaW5lIFdMMzUwMV9HQ1JfRU5FQ0lOVCAoKHU4KTB4MDIpCisjZGVmaW5lIFdMMzUwMV9HQ1JfREFNICAgICAoKHU4KTB4MDEpCisKKy8qIEJpdHMgaW4gQlNTIChCYW5rIFN3aXRjaGluZyBTZWxlY3QgUmVnaXN0ZXIpICovCisjZGVmaW5lIFdMMzUwMV9CU1NfRlBBR0UwICgodTgpMHgyMCkJLyogRmxhc2ggbWVtb3J5IHBhZ2UwICovCisjZGVmaW5lIFdMMzUwMV9CU1NfRlBBR0UxICgodTgpMHgyOCkKKyNkZWZpbmUgV0wzNTAxX0JTU19GUEFHRTIgKCh1OCkweDMwKQorI2RlZmluZSBXTDM1MDFfQlNTX0ZQQUdFMyAoKHU4KTB4MzgpCisjZGVmaW5lIFdMMzUwMV9CU1NfU1BBR0UwICgodTgpMHgwMCkJLyogU1JBTSBwYWdlMCAqLworI2RlZmluZSBXTDM1MDFfQlNTX1NQQUdFMSAoKHU4KTB4MDgpCisjZGVmaW5lIFdMMzUwMV9CU1NfU1BBR0UyICgodTgpMHgxMCkKKyNkZWZpbmUgV0wzNTAxX0JTU19TUEFHRTMgKCh1OCkweDE4KQorCisvKiBEZWZpbmUgRHJpdmVyIEludGVyZmFjZSAqLworLyogUmVmZXIgSUVFRSA4MDIuMTEgKi8KKy8qIFR4IHBhY2tldCBoZWFkZXIsIGluY2x1ZGUgUExDUCBhbmQgTVBEVSAqLworLyogVHggUExDUCBIZWFkZXIgKi8KK3N0cnVjdCB3bDM1MDFfODAyMTFfdHhfcGxjcF9oZHIgeworCXU4CXN5bmNbMTZdOworCXUxNglzZmQ7CisJdTgJc2lnbmFsOworCXU4CXNlcnZpY2U7CisJdTE2CWxlbjsKKwl1MTYJY3JjMTY7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHdsMzUwMV84MDIxMV90eF9oZHIgeworCXN0cnVjdCB3bDM1MDFfODAyMTFfdHhfcGxjcF9oZHIJcGNscF9oZHI7CisJc3RydWN0IGllZWU4MDJfMTFfaGRyCQltYWNfaGRyOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgICBSZXNlcnZlIHRoZSBiZWdpbm5pbmcgVHggc3BhY2UgZm9yIGRlc2NyaXB0b3IgdXNlLgorCisgICBUeEJsb2NrT2Zmc2V0IC0tPgkqLS0tLSotLS0tKi0tLS0qLS0tLSogXAorCShUeEZyZWVEZXNjKQl8ICAwIHwgIDEgfCAgMiB8ICAzIHwgIFwKKwkJCXwgIDQgfCAgNSB8ICA2IHwgIDcgfCAgIHwKKwkJCXwgIDggfCAgOSB8IDEwIHwgMTEgfCAgIFRYX0RFU0MgKiAyMAorCQkJfCAxMiB8IDEzIHwgMTQgfCAxNSB8ICAgfAorCQkJfCAxNiB8IDE3IHwgMTggfCAxOSB8ICAvCisgICBUeEJ1ZmZlckJlZ2luIC0tPgkqLS0tLSotLS0tKi0tLS0qLS0tLSogLworICAgKFR4QnVmZmVySGVhZCkJfCAJCSAgICB8CisgICAoVHhCdWZmZXJUYWlsKQl8IAkJICAgIHwKKwkJCXwgICAgU2VuZCBCdWZmZXIgICAgfAorCQkJfCAJCSAgICB8CisJCQl8CQkgICAgfAorCQkJKi0tLS0tLS0tLS0tLS0tLS0tLS0qCisgICBUeEJ1ZmZlckVuZCAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLworCisqLworCitzdHJ1Y3Qgd2wzNTAxX2NhcmQgeworCWludAkJCQliYXNlX2FkZHI7CisJdTgJCQkJbWFjX2FkZHJbRVRIX0FMRU5dOworCXNwaW5sb2NrX3QJCQlsb2NrOworCXdhaXRfcXVldWVfaGVhZF90CQl3YWl0OworCXN0cnVjdCB3bDM1MDFfZ2V0X2NvbmZpcm0Jc2lnX2dldF9jb25maXJtOworCXN0cnVjdCB3bDM1MDFfcHdyX21nbXRfY29uZmlybQlzaWdfcHdyX21nbXRfY29uZmlybTsKKwl1MTYJCQkJdHhfYnVmZmVyX3NpemU7CisJdTE2CQkJCXR4X2J1ZmZlcl9oZWFkOworCXUxNgkJCQl0eF9idWZmZXJfdGFpbDsKKwl1MTYJCQkJdHhfYnVmZmVyX2NudDsKKwl1MTYJCQkJZXNicV9yZXFfc3RhcnQ7CisJdTE2CQkJCWVzYnFfcmVxX2VuZDsKKwl1MTYJCQkJZXNicV9yZXFfaGVhZDsKKwl1MTYJCQkJZXNicV9yZXFfdGFpbDsKKwl1MTYJCQkJZXNicV9jb25maXJtX3N0YXJ0OworCXUxNgkJCQllc2JxX2NvbmZpcm1fZW5kOworCXUxNgkJCQllc2JxX2NvbmZpcm07CisJc3RydWN0IGl3X21nbXRfZXNzaWRfcHNldCAgCWVzc2lkOworCXN0cnVjdCBpd19tZ210X2Vzc2lkX3BzZXQgIAlrZWVwX2Vzc2lkOworCXU4CQkJCWJzc2lkW0VUSF9BTEVOXTsKKwlpbnQJCQkJbmV0X3R5cGU7CisJY2hhcgkJCQluaWNrWzMyXTsKKwljaGFyCQkJCWNhcmRfbmFtZVszMl07CisJY2hhcgkJCQlmaXJtd2FyZV9kYXRlWzMyXTsKKwl1OAkJCQljaGFuOworCXU4CQkJCWNhcF9pbmZvOworCXUxNgkJCQlzdGFydF9zZWc7CisJdTE2CQkJCWJzc19jbnQ7CisJdTE2CQkJCWpvaW5fc3RhX2JzczsKKwl1OAkJCQlyc3NpOworCXU4CQkJCWFkaG9jX3RpbWVzOworCXU4CQkJCXJlZ19kb21haW47CisJdTgJCQkJdmVyc2lvblsyXTsKKwlzdHJ1Y3Qgd2wzNTAxX3NjYW5fY29uZmlybQlic3Nfc2V0WzIwXTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAJc3RhdHM7CisJc3RydWN0IGl3X3N0YXRpc3RpY3MJCXdzdGF0czsKKwlzdHJ1Y3QgaXdfc3B5X2RhdGEJCXNweV9kYXRhOworCXN0cnVjdCBkZXZfbm9kZV90CQlub2RlOworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDMzZTVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxX2NzLmMKQEAgLTAsMCArMSwyMjcwIEBACisvKgorICogV0wzNTAxIFdpcmVsZXNzIExBTiBQQ01DSUEgQ2FyZCBEcml2ZXIgZm9yIExpbnV4CisgKiBXcml0dGVuIG9yaWdpbmFsbHkgZm9yIExpbnV4IDIuMC4zMCBieSBGb3ggQ2hlbiwgbWhjaGVuQGdvbGYuY2NsLml0cmkub3JnLnR3CisgKiBQb3J0ZWQgdG8gMi4yLCAyLjQgJiAyLjUgYnkgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgKiBXaXJlbGVzcyBleHRlbnNpb25zIGluIDIuNCBieSBHdXN0YXZvIE5pZW1leWVyIDxuaWVtZXllckBjb25lY3RpdmEuY29tPgorICoKKyAqIFJlZmVyZW5jZXMgdXNlZCBieSBGb3ggQ2hlbiB3aGlsZSB3cml0aW5nIHRoZSBvcmlnaW5hbCBkcml2ZXIgZm9yIDIuMC4zMDoKKyAqCisgKiAgIDEuIFdMMjR4eCBwYWNrZXQgZHJpdmVycyAodG9vYXNtLmFzbSkKKyAqICAgMi4gQWNjZXNzIFBvaW50IEZpcm13YXJlIEludGVyZmFjZSBTcGVjaWZpY2F0aW9uIGZvciBJRUVFIDgwMi4xMSBTVVRSTworICogICAzLiBJRUVFIDgwMi4xMQorICogICA0LiBMaW51eCBuZXR3b3JrIGRyaXZlciAoL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQpCisgKiAgIDUuIElTQSBjYXJkIGRyaXZlciAtIHdsMjQuYworICogICA2LiBMaW51eCBQQ01DSUEgc2tlbGV0b24gZHJpdmVyIC0gc2tlbGV0b24uYworICogICA3LiBMaW51eCBQQ01DSUEgM2M1ODkgbmV0d29yayBkcml2ZXIgLSAzYzU4OV9jcy5jCisgKgorICogVGVzdGVkIHdpdGggV0wyNDAwIGZpcm13YXJlIDEuMiwgTGludXggMi4wLjMwLCBhbmQgcGNtY2lhLWNzLTIuOS4xMgorICogICAxLiBQZXJmb3JtYW5jZTogYWJvdXQgMTY1IEtieXRlcy9zZWMgaW4gVENQL0lQIHdpdGggQWQtSG9jIG1vZGUuCisgKiAgICAgIHJzaCAxOTIuMTY4LjEuMyAiZGQgaWY9L2Rldi96ZXJvIGJzPTFrIGNvdW50PTEwMDAiID4gL2Rldi9udWxsCisgKiAgICAgIChTcGVjaWZpY2F0aW9uIDJNIGJpdHMvc2VjLiBpcyBhYm91dCAyNTAgS2J5dGVzL3NlYy4sIGJ1dCB3ZSBtdXN0IGRlZHVjdAorICogICAgICAgRVRIRVIvSVAvVURQL1RDUCBoZWFkZXIsIGFuZCBhY2tub3dsZWRnZW1lbnQgb3ZlcmhlYWQpCisgKgorICogVGVzdGVkIHdpdGggUGxhbmV0IEFQIGluIDIuNC4xNywgMTg0IEtieXRlcy9zIGluIFVEUCBpbiBJbmZyYXN0cnVjdHVyZSBtb2RlLAorICogMTczIEtieXRlcy9zIGluIFRDUC4KKyAqCisgKiBUZXN0ZWQgd2l0aCBQbGFuZXQgQVAgaW4gMi41LjczLWJrLCAyMTYgS2J5dGVzL3MgaW4gSW5mcmFzdHJ1Y3R1cmUgbW9kZQorICogd2l0aCBhIFNNUCBtYWNoaW5lIChkdWFsIHBlbnRpdW0gMTAwKSwgdXNpbmcgcGt0Z2VuLCA0MzIgcHBzIChwa3Rfc2l6ZSA9IDYwKQorICovCisjdW5kZWYgUkVBTExZX1NMT1dfSU8JLyogbW9zdCBzeXN0ZW1zIGNhbiBzYWZlbHkgdW5kZWYgdGhpcyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICJ3bDM1MDEuaCIKKworI2lmbmRlZiBfX2kzODZfXworI2RlZmluZSBzbG93X2Rvd25faW8oKQorI2VuZGlmCisKKy8qIEZvciByb3VnaCBjb25zdGFudCBkZWxheSAqLworI2RlZmluZSBXTDM1MDFfTk9QTE9PUChuKSB7IGludCB4ID0gMDsgd2hpbGUgKHgrKyA8IG4pIHNsb3dfZG93bl9pbygpOyB9CisKKy8qCisgKiBBbGwgdGhlIFBDTUNJQSBtb2R1bGVzIHVzZSBQQ01DSUFfREVCVUcgdG8gY29udHJvbCBkZWJ1Z2dpbmcuICBJZiB5b3UgZG8gbm90CisgKiBkZWZpbmUgUENNQ0lBX0RFQlVHIGF0IGFsbCwgYWxsIHRoZSBkZWJ1ZyBjb2RlIHdpbGwgYmUgbGVmdCBvdXQuICBJZiB5b3UKKyAqIGNvbXBpbGUgd2l0aCBQQ01DSUFfREVCVUc9MCwgdGhlIGRlYnVnIGNvZGUgd2lsbCBiZSBwcmVzZW50IGJ1dCBkaXNhYmxlZCAtLQorICogYnV0IGl0IGNhbiB0aGVuIGJlIGVuYWJsZWQgZm9yIHNwZWNpZmljIG1vZHVsZXMgYXQgbG9hZCB0aW1lIHdpdGggYQorICogJ3BjX2RlYnVnPSMnIG9wdGlvbiB0byBpbnNtb2QuCisgKi8KKyNkZWZpbmUgUENNQ0lBX0RFQlVHIDAKKyNpZmRlZiBQQ01DSUFfREVCVUcKK3N0YXRpYyBpbnQgcGNfZGVidWcgPSBQQ01DSUFfREVCVUc7Cittb2R1bGVfcGFyYW0ocGNfZGVidWcsIGludCwgMCk7CisjZGVmaW5lIGRwcmludGsobiwgZm9ybWF0LCBhcmdzLi4uKSBcCisJeyBpZiAocGNfZGVidWcgPiAobikpIFwKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICIgZm9ybWF0ICJcbiIsIF9fRlVOQ1RJT05fXyAsICMjYXJncyk7IH0KKyNlbHNlCisjZGVmaW5lIGRwcmludGsobiwgZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgd2wzNTAxX291dGIoYSwgYikgeyBvdXRiKGEsIGIpOyBzbG93X2Rvd25faW8oKTsgfQorI2RlZmluZSB3bDM1MDFfb3V0Yl9wKGEsIGIpIHsgb3V0Yl9wKGEsIGIpOyBzbG93X2Rvd25faW8oKTsgfQorI2RlZmluZSB3bDM1MDFfb3V0c2IoYSwgYiwgYykgeyBvdXRzYihhLCBiLCBjKTsgc2xvd19kb3duX2lvKCk7IH0KKworI2RlZmluZSBXTDM1MDFfUkVMRUFTRV9USU1FT1VUICgyNSAqIEhaKQorI2RlZmluZSBXTDM1MDFfTUFYX0FESE9DX1RSSUVTIDE2CisKKyNkZWZpbmUgV0wzNTAxX1JFU1VNRQkwCisjZGVmaW5lIFdMMzUwMV9TVVNQRU5ECTEKKworLyoKKyAqIFRoZSBldmVudCgpIGZ1bmN0aW9uIGlzIHRoaXMgZHJpdmVyJ3MgQ2FyZCBTZXJ2aWNlcyBldmVudCBoYW5kbGVyLiAgSXQgd2lsbAorICogYmUgY2FsbGVkIGJ5IENhcmQgU2VydmljZXMgd2hlbiBhbiBhcHByb3ByaWF0ZSBjYXJkIHN0YXR1cyBldmVudCBpcworICogcmVjZWl2ZWQuIFRoZSBjb25maWcoKSBhbmQgcmVsZWFzZSgpIGVudHJ5IHBvaW50cyBhcmUgdXNlZCB0byBjb25maWd1cmUgb3IKKyAqIHJlbGVhc2UgYSBzb2NrZXQsIGluIHJlc3BvbnNlIHRvIGNhcmQgaW5zZXJ0aW9uIGFuZCBlamVjdGlvbiBldmVudHMuICBUaGV5CisgKiBhcmUgaW52b2tlZCBmcm9tIHRoZSB3bDI0IGV2ZW50IGhhbmRsZXIuCisgKi8KK3N0YXRpYyB2b2lkIHdsMzUwMV9jb25maWcoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgdm9pZCB3bDM1MDFfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyBpbnQgd2wzNTAxX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmksIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CisKKy8qCisgKiBUaGUgZGV2X2luZm8gdmFyaWFibGUgaXMgdGhlICJrZXkiIHRoYXQgaXMgdXNlZCB0byBtYXRjaCB1cCB0aGlzCisgKiBkZXZpY2UgZHJpdmVyIHdpdGggYXBwcm9wcmlhdGUgY2FyZHMsIHRocm91Z2ggdGhlIGNhcmQgY29uZmlndXJhdGlvbgorICogZGF0YWJhc2UuCisgKi8KK3N0YXRpYyBkZXZfaW5mb190IHdsMzUwMV9kZXZfaW5mbyA9ICJ3bDM1MDFfY3MiOworCitzdGF0aWMgaW50IHdsMzUwMV9jaGFuMmZyZXFbXSA9IHsKKwlbMF0gID0gMjQxMiwgWzFdICA9IDI0MTcsIFsyXSAgPSAyNDIyLCBbM10gID0gMjQyNywgWzRdID0gMjQzMiwKKwlbNV0gID0gMjQzNywgWzZdICA9IDI0NDIsIFs3XSAgPSAyNDQ3LCBbOF0gID0gMjQ1MiwgWzldID0gMjQ1NywKKwlbMTBdID0gMjQ2MiwgWzExXSA9IDI0NjcsIFsxMl0gPSAyNDcyLCBbMTNdID0gMjQ3NywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWludCByZWdfZG9tYWluOworCWludCBtaW4sIG1heCwgZGVmbHQ7Cit9IGl3X2NoYW5uZWxfdGFibGVbXSA9IHsKKwl7CisJCS5yZWdfZG9tYWluID0gSVdfUkVHX0RPTUFJTl9GQ0MsCisJCS5taW4JICAgID0gMSwKKwkJLm1heAkgICAgPSAxMSwKKwkJLmRlZmx0CSAgICA9IDEsCisJfSwKKwl7CisJCS5yZWdfZG9tYWluID0gSVdfUkVHX0RPTUFJTl9ET0MsCisJCS5taW4JICAgID0gMSwKKwkJLm1heAkgICAgPSAxMSwKKwkJLmRlZmx0CSAgICA9IDEsCisJfSwKKwl7CisJCS5yZWdfZG9tYWluID0gSVdfUkVHX0RPTUFJTl9FVFNJLAorCQkubWluCSAgICA9IDEsCisJCS5tYXgJICAgID0gMTMsCisJCS5kZWZsdAkgICAgPSAxLAorCX0sCisJeworCQkucmVnX2RvbWFpbiA9IElXX1JFR19ET01BSU5fU1BBSU4sCisJCS5taW4JICAgID0gMTAsCisJCS5tYXgJICAgID0gMTEsCisJCS5kZWZsdAkgICAgPSAxMCwKKwl9LAorCXsKKwkJLnJlZ19kb21haW4gPSBJV19SRUdfRE9NQUlOX0ZSQU5DRSwKKwkJLm1pbgkgICAgPSAxMCwKKwkJLm1heAkgICAgPSAxMywKKwkJLmRlZmx0CSAgICA9IDEwLAorCX0sCisJeworCQkucmVnX2RvbWFpbiA9IElXX1JFR19ET01BSU5fTUtLLAorCQkubWluCSAgICA9IDE0LAorCQkubWF4CSAgICA9IDE0LAorCQkuZGVmbHQJICAgID0gMTQsCisJfSwKKwl7CisJCS5yZWdfZG9tYWluID0gSVdfUkVHX0RPTUFJTl9NS0sxLAorCQkubWluCSAgICA9IDEsCisJCS5tYXgJICAgID0gMTQsCisJCS5kZWZsdAkgICAgPSAxLAorCX0sCisJeworCQkucmVnX2RvbWFpbiA9IElXX1JFR19ET01BSU5fSVNSQUVMLAorCQkubWluCSAgICA9IDMsCisJCS5tYXgJICAgID0gOSwKKwkJLmRlZmx0CSAgICA9IDksCisJfSwKK307CisKKy8qKgorICogaXdfdmFsaWRfY2hhbm5lbCAtIHZhbGlkYXRlIGNoYW5uZWwgaW4gcmVndWxhdG9yeSBkb21haW4KKyAqIEByZWdfY29tYWluIC0gcmVndWxhdG9yeSBkb21haW4KKyAqIEBjaGFubmVsIC0gY2hhbm5lbCB0byB2YWxpZGF0ZQorICoKKyAqIFJldHVybnMgMCBpZiBpbnZhbGlkIGluIHRoZSBzcGVjaWZpZWQgcmVndWxhdG9yeSBkb21haW4sIG5vbi16ZXJvIGlmIHZhbGlkLgorICovCitzdGF0aWMgaW50IGl3X3ZhbGlkX2NoYW5uZWwoaW50IHJlZ19kb21haW4sIGludCBjaGFubmVsKQoreworCWludCBpLCByYyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpd19jaGFubmVsX3RhYmxlKTsgaSsrKQorCQlpZiAocmVnX2RvbWFpbiA9PSBpd19jaGFubmVsX3RhYmxlW2ldLnJlZ19kb21haW4pIHsKKwkJCXJjID0gY2hhbm5lbCA+PSBpd19jaGFubmVsX3RhYmxlW2ldLm1pbiAmJgorCQkJICAgICBjaGFubmVsIDw9IGl3X2NoYW5uZWxfdGFibGVbaV0ubWF4OworCQkJYnJlYWs7CisJCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogaXdfZGVmYXVsdF9jaGFubmVsIC0gZ2V0IGRlZmF1bHQgY2hhbm5lbCBmb3IgYSByZWd1bGF0b3J5IGRvbWFpbgorICogQHJlZ19jb21haW4gLSByZWd1bGF0b3J5IGRvbWFpbgorICoKKyAqIFJldHVybnMgdGhlIGRlZmF1bHQgY2hhbm5lbCBmb3IgYSByZWd1bGF0b3J5IGRvbWFpbgorICovCitzdGF0aWMgaW50IGl3X2RlZmF1bHRfY2hhbm5lbChpbnQgcmVnX2RvbWFpbikKK3sKKwlpbnQgaSwgcmMgPSAxOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXdfY2hhbm5lbF90YWJsZSk7IGkrKykKKwkJaWYgKHJlZ19kb21haW4gPT0gaXdfY2hhbm5lbF90YWJsZVtpXS5yZWdfZG9tYWluKSB7CisJCQlyYyA9IGl3X2NoYW5uZWxfdGFibGVbaV0uZGVmbHQ7CisJCQlicmVhazsKKwkJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgaXdfc2V0X21nbXRfaW5mb19lbGVtZW50KGVudW0gaXdfbWdtdF9pbmZvX2VsZW1lbnRfaWRzIGlkLAorCQkJCSAgICAgc3RydWN0IGl3X21nbXRfaW5mb19lbGVtZW50ICplbCwKKwkJCQkgICAgIHZvaWQgKnZhbHVlLCBpbnQgbGVuKQoreworCWVsLT5pZCAgPSBpZDsKKwllbC0+bGVuID0gbGVuOworCW1lbWNweShlbC0+ZGF0YSwgdmFsdWUsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIGl3X2NvcHlfbWdtdF9pbmZvX2VsZW1lbnQoc3RydWN0IGl3X21nbXRfaW5mb19lbGVtZW50ICp0bywKKwkJCQkgICAgICBzdHJ1Y3QgaXdfbWdtdF9pbmZvX2VsZW1lbnQgKmZyb20pCit7CisJaXdfc2V0X21nbXRfaW5mb19lbGVtZW50KGZyb20tPmlkLCB0bywgZnJvbS0+ZGF0YSwgZnJvbS0+bGVuKTsKK30KKworLyoKKyAqIEEgbGlua2VkIGxpc3Qgb2YgImluc3RhbmNlcyIgb2YgdGhlIHdsMjQgZGV2aWNlLiAgRWFjaCBhY3R1YWwgUENNQ0lBIGNhcmQKKyAqIGNvcnJlc3BvbmRzIHRvIG9uZSBkZXZpY2UgaW5zdGFuY2UsIGFuZCBpcyBkZXNjcmliZWQgYnkgb25lIGRldl9saW5rX3QKKyAqIHN0cnVjdHVyZSAoZGVmaW5lZCBpbiBkcy5oKS4KKyAqCisgKiBZb3UgbWF5IG5vdCB3YW50IHRvIHVzZSBhIGxpbmtlZCBsaXN0IGZvciB0aGlzIC0tIGZvciBleGFtcGxlLCB0aGUgbWVtb3J5CisgKiBjYXJkIGRyaXZlciB1c2VzIGFuIGFycmF5IG9mIGRldl9saW5rX3QgcG9pbnRlcnMsIHdoZXJlIG1pbm9yIGRldmljZSBudW1iZXJzCisgKiBhcmUgdXNlZCB0byBkZXJpdmUgdGhlIGNvcnJlc3BvbmRpbmcgYXJyYXkgaW5kZXguCisgKi8KK3N0YXRpYyBkZXZfbGlua190ICp3bDM1MDFfZGV2X2xpc3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bDM1MDFfc3dpdGNoX3BhZ2Uoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1OCBwYWdlKQoreworCXdsMzUwMV9vdXRiKHBhZ2UsIHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfQlNTKTsKK30KKworLyoKKyAqIEdldCBFdGhlcm5ldCBNQUMgYWRkcmVzc3MuCisgKgorICogV0FSTklORzogV2Ugc3dpdGNoIHRvIEZQQUdFMCBhbmQgc3dpdGMgYmFjayBhZ2Fpbi4KKyAqICAgICAgICAgIE1ha2luZyBzdXJlIHRoZXJlIGlzIG5vIG90aGVyIFdMIGZ1bmN0aW9uIGJlZW5pbmcgY2FsbGVkIGJ5IElTUi4KKyAqLworc3RhdGljIGludCB3bDM1MDFfZ2V0X2ZsYXNoX21hY19hZGRyKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwlpbnQgYmFzZV9hZGRyID0gdGhpcy0+YmFzZV9hZGRyOworCisJLyogZ2V0IE1BQyBhZGRyICovCisJd2wzNTAxX291dGIoV0wzNTAxX0JTU19GUEFHRTMsIGJhc2VfYWRkciArIFdMMzUwMV9OSUNfQlNTKTsgLyogQlNTICovCisJd2wzNTAxX291dGIoMHgwMCwgYmFzZV9hZGRyICsgV0wzNTAxX05JQ19MTUFMKTsJLyogTE1BTCAqLworCXdsMzUwMV9vdXRiKDB4NDAsIGJhc2VfYWRkciArIFdMMzUwMV9OSUNfTE1BSCk7CS8qIExNQUggKi8KKworCS8qIHdhaXQgZm9yIHJlYWRpbmcgRUVQUk9NICovCisJV0wzNTAxX05PUExPT1AoMTAwKTsKKwl0aGlzLT5tYWNfYWRkclswXSA9IGluYihiYXNlX2FkZHIgKyBXTDM1MDFfTklDX0lPRFBBKTsKKwlXTDM1MDFfTk9QTE9PUCgxMDApOworCXRoaXMtPm1hY19hZGRyWzFdID0gaW5iKGJhc2VfYWRkciArIFdMMzUwMV9OSUNfSU9EUEEpOworCVdMMzUwMV9OT1BMT09QKDEwMCk7CisJdGhpcy0+bWFjX2FkZHJbMl0gPSBpbmIoYmFzZV9hZGRyICsgV0wzNTAxX05JQ19JT0RQQSk7CisJV0wzNTAxX05PUExPT1AoMTAwKTsKKwl0aGlzLT5tYWNfYWRkclszXSA9IGluYihiYXNlX2FkZHIgKyBXTDM1MDFfTklDX0lPRFBBKTsKKwlXTDM1MDFfTk9QTE9PUCgxMDApOworCXRoaXMtPm1hY19hZGRyWzRdID0gaW5iKGJhc2VfYWRkciArIFdMMzUwMV9OSUNfSU9EUEEpOworCVdMMzUwMV9OT1BMT09QKDEwMCk7CisJdGhpcy0+bWFjX2FkZHJbNV0gPSBpbmIoYmFzZV9hZGRyICsgV0wzNTAxX05JQ19JT0RQQSk7CisJV0wzNTAxX05PUExPT1AoMTAwKTsKKwl0aGlzLT5yZWdfZG9tYWluID0gaW5iKGJhc2VfYWRkciArIFdMMzUwMV9OSUNfSU9EUEEpOworCVdMMzUwMV9OT1BMT09QKDEwMCk7CisJd2wzNTAxX291dGIoV0wzNTAxX0JTU19GUEFHRTAsIGJhc2VfYWRkciArIFdMMzUwMV9OSUNfQlNTKTsKKwl3bDM1MDFfb3V0YigweDA0LCBiYXNlX2FkZHIgKyBXTDM1MDFfTklDX0xNQUwpOworCXdsMzUwMV9vdXRiKDB4NDAsIGJhc2VfYWRkciArIFdMMzUwMV9OSUNfTE1BSCk7CisJV0wzNTAxX05PUExPT1AoMTAwKTsKKwl0aGlzLT52ZXJzaW9uWzBdID0gaW5iKGJhc2VfYWRkciArIFdMMzUwMV9OSUNfSU9EUEEpOworCVdMMzUwMV9OT1BMT09QKDEwMCk7CisJdGhpcy0+dmVyc2lvblsxXSA9IGluYihiYXNlX2FkZHIgKyBXTDM1MDFfTklDX0lPRFBBKTsKKwkvKiBzd2l0Y2ggdG8gU1JBTSBQYWdlIDAgKGZvciBzYWZldHkpICovCisJd2wzNTAxX3N3aXRjaF9wYWdlKHRoaXMsIFdMMzUwMV9CU1NfU1BBR0UwKTsKKworCS8qIFRoZSBNQUMgYWRkciBzaG91bGQgYmUgMDA6NjA6Li4uICovCisJcmV0dXJuIHRoaXMtPm1hY19hZGRyWzBdID09IDB4MDAgJiYgdGhpcy0+bWFjX2FkZHJbMV0gPT0gMHg2MDsKK30KKworLyoqCisgKiB3bDM1MDFfc2V0X3RvX3dsYSAtIE1vdmUgJ3NpemUnIGJ5dGVzIGZyb20gUEMgdG8gY2FyZAorICogQGRlc3Q6IENhcmQgYWRkcmVzc2luZyBzcGFjZQorICogQHNyYzogUEMgYWRkcmVzc2luZyBzcGFjZQorICogQHNpemU6IEJ5dGVzIHRvIG1vdmUKKyAqCisgKiBNb3ZlICdzaXplJyBieXRlcyBmcm9tIFBDIHRvIGNhcmQuIChTaG91bGRuJ3QgYmUgaW50ZXJydXB0ZWQpCisgKi8KK3ZvaWQgd2wzNTAxX3NldF90b193bGEoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1MTYgZGVzdCwgdm9pZCAqc3JjLCBpbnQgc2l6ZSkKK3sKKwkvKiBzd2l0Y2ggdG8gU1JBTSBQYWdlIDAgKi8KKwl3bDM1MDFfc3dpdGNoX3BhZ2UodGhpcywgKGRlc3QgJiAweDgwMDApID8gV0wzNTAxX0JTU19TUEFHRTEgOgorCQkJCQkJICAgV0wzNTAxX0JTU19TUEFHRTApOworCS8qIHNldCBMTUFMIGFuZCBMTUFIICovCisJd2wzNTAxX291dGIoZGVzdCAmIDB4ZmYsIHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfTE1BTCk7CisJd2wzNTAxX291dGIoKChkZXN0ID4+IDgpICYgMHg3ZiksIHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfTE1BSCk7CisKKwkvKiByZXAgb3V0IHRvIFBvcnQgQSAqLworCXdsMzUwMV9vdXRzYih0aGlzLT5iYXNlX2FkZHIgKyBXTDM1MDFfTklDX0lPRFBBLCBzcmMsIHNpemUpOworfQorCisvKioKKyAqIHdsMzUwMV9nZXRfZnJvbV93bGEgLSBNb3ZlICdzaXplJyBieXRlcyBmcm9tIGNhcmQgdG8gUEMKKyAqIEBzcmM6IENhcmQgYWRkcmVzc2luZyBzcGFjZQorICogQGRlc3Q6IFBDIGFkZHJlc3Npbmcgc3BhY2UKKyAqIEBzaXplOiBCeXRlcyB0byBtb3ZlCisgKgorICogTW92ZSAnc2l6ZScgYnl0ZXMgZnJvbSBjYXJkIHRvIFBDLiAoU2hvdWxkbid0IGJlIGludGVycnVwdGVkKQorICovCit2b2lkIHdsMzUwMV9nZXRfZnJvbV93bGEoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1MTYgc3JjLCB2b2lkICpkZXN0LAorCQkJIGludCBzaXplKQoreworCS8qIHN3aXRjaCB0byBTUkFNIFBhZ2UgMCAqLworCXdsMzUwMV9zd2l0Y2hfcGFnZSh0aGlzLCAoc3JjICYgMHg4MDAwKSA/IFdMMzUwMV9CU1NfU1BBR0UxIDoKKwkJCQkJCSAgV0wzNTAxX0JTU19TUEFHRTApOworCS8qIHNldCBMTUFMIGFuZCBMTUFIICovCisJd2wzNTAxX291dGIoc3JjICYgMHhmZiwgdGhpcy0+YmFzZV9hZGRyICsgV0wzNTAxX05JQ19MTUFMKTsKKwl3bDM1MDFfb3V0Yigoc3JjID4+IDgpICYgMHg3ZiwgdGhpcy0+YmFzZV9hZGRyICsgV0wzNTAxX05JQ19MTUFIKTsKKworCS8qIHJlcCBnZXQgZnJvbSBQb3J0IEEgKi8KKwlpbnNiKHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfSU9EUEEsIGRlc3QsIHNpemUpOworfQorCisvKgorICogR2V0L0FsbG9jYXRlIGEgZnJlZSBUeCBEYXRhIEJ1ZmZlcgorICoKKyAqICAqLS0tLS0tLS0tLS0tLS0qLS0tLS0tLS0tLS0tLS0tLS0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqICB8ICAgIFBMQ1AgICAgICB8ICAgIE1BQyBIZWFkZXIgICB8ICBEU1QgIFNSQyAgICAgICAgIERhdGEgLi4uICAgICAgIHwKKyAqICB8ICAoMjQgYnl0ZXMpICB8ICAgICgzMCBieXRlcykgICB8ICAoNikgICg2KSAgKEV0aGVybmV0IFJvdyBEYXRhKSAgIHwKKyAqICAqLS0tLS0tLS0tLS0tLS0qLS0tLS0tLS0tLS0tLS0tLS0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqICBcICAgICAgICAgICAgICAgXC0gSUVFRSA4MDIuMTEgLS8gXC0tLS0tLS0tLS0tLS0tIGxlbiAtLS0tLS0tLS0tLS0tLS8KKyAqICAgXC1zdHJ1Y3Qgd2wzNTAxXzgwMjExX3R4X2hkci0tLyAgIFwtLS0tLS0tLSBFdGhlcm5ldCBGcmFtZSAtLS0tLS0tLworICoKKyAqIFJldHVybiA9IFBvc3Rpb24gaW4gQ2FyZAorICovCitzdGF0aWMgdTE2IHdsMzUwMV9nZXRfdHhfYnVmZmVyKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywgdTE2IGxlbikKK3sKKwl1MTYgbmV4dCwgYmxrX2NudCA9IDAsIHplcm8gPSAwOworCXUxNiBmdWxsX2xlbiA9IHNpemVvZihzdHJ1Y3Qgd2wzNTAxXzgwMjExX3R4X2hkcikgKyBsZW47CisJdTE2IHJldCA9IDA7CisKKwlpZiAoZnVsbF9sZW4gPiB0aGlzLT50eF9idWZmZXJfY250ICogMjU0KQorCQlnb3RvIG91dDsKKwlyZXQgPSB0aGlzLT50eF9idWZmZXJfaGVhZDsKKwl3aGlsZSAoZnVsbF9sZW4pIHsKKwkJaWYgKGZ1bGxfbGVuIDwgMjU0KQorCQkJZnVsbF9sZW4gPSAwOworCQllbHNlCisJCQlmdWxsX2xlbiAtPSAyNTQ7CisJCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgdGhpcy0+dHhfYnVmZmVyX2hlYWQsICZuZXh0LAorCQkJCSAgICBzaXplb2YobmV4dCkpOworCQlpZiAoIWZ1bGxfbGVuKQorCQkJd2wzNTAxX3NldF90b193bGEodGhpcywgdGhpcy0+dHhfYnVmZmVyX2hlYWQsICZ6ZXJvLAorCQkJCQkgIHNpemVvZih6ZXJvKSk7CisJCXRoaXMtPnR4X2J1ZmZlcl9oZWFkID0gbmV4dDsKKwkJYmxrX2NudCsrOworCQkvKiBpZiBidWZmZXIgaXMgbm90IGVub3VnaCAqLworCQlpZiAoIW5leHQgJiYgZnVsbF9sZW4pIHsKKwkJCXRoaXMtPnR4X2J1ZmZlcl9oZWFkID0gcmV0OworCQkJcmV0ID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCXRoaXMtPnR4X2J1ZmZlcl9jbnQgLT0gYmxrX2NudDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnJlZSBhbiBhbGxvY2F0ZWQgVHggQnVmZmVyLiBwdHIgbXVzdCBiZSBjb3JyZWN0IHBvc2l0aW9uLgorICovCitzdGF0aWMgdm9pZCB3bDM1MDFfZnJlZV90eF9idWZmZXIoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1MTYgcHRyKQoreworCS8qIGNoZWNrIGlmIGFsbCBzcGFjZSBpcyBub3QgZnJlZSAqLworCWlmICghdGhpcy0+dHhfYnVmZmVyX2hlYWQpCisJCXRoaXMtPnR4X2J1ZmZlcl9oZWFkID0gcHRyOworCWVsc2UKKwkJd2wzNTAxX3NldF90b193bGEodGhpcywgdGhpcy0+dHhfYnVmZmVyX3RhaWwsCisJCQkJICAmcHRyLCBzaXplb2YocHRyKSk7CisJd2hpbGUgKHB0cikgeworCQl1MTYgbmV4dDsKKworCQl0aGlzLT50eF9idWZmZXJfY250Kys7CisJCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgcHRyLCAmbmV4dCwgc2l6ZW9mKG5leHQpKTsKKwkJdGhpcy0+dHhfYnVmZmVyX3RhaWwgPSBwdHI7CisJCXB0ciA9IG5leHQ7CisJfQorfQorCitzdGF0aWMgaW50IHdsMzUwMV9lc2JxX3JlcV90ZXN0KHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwl1OCB0bXA7CisKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIHRoaXMtPmVzYnFfcmVxX2hlYWQgKyAzLCAmdG1wLCBzaXplb2YodG1wKSk7CisJcmV0dXJuIHRtcCAmIDB4ODA7Cit9CisKK3N0YXRpYyB2b2lkIHdsMzUwMV9lc2JxX3JlcShzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIHUxNiAqcHRyKQoreworCXUxNiB0bXAgPSAwOworCisJd2wzNTAxX3NldF90b193bGEodGhpcywgdGhpcy0+ZXNicV9yZXFfaGVhZCwgcHRyLCAyKTsKKwl3bDM1MDFfc2V0X3RvX3dsYSh0aGlzLCB0aGlzLT5lc2JxX3JlcV9oZWFkICsgMiwgJnRtcCwgc2l6ZW9mKHRtcCkpOworCXRoaXMtPmVzYnFfcmVxX2hlYWQgKz0gNDsKKwlpZiAodGhpcy0+ZXNicV9yZXFfaGVhZCA+PSB0aGlzLT5lc2JxX3JlcV9lbmQpCisJCXRoaXMtPmVzYnFfcmVxX2hlYWQgPSB0aGlzLT5lc2JxX3JlcV9zdGFydDsKK30KKworc3RhdGljIGludCB3bDM1MDFfZXNicV9leGVjKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywgdm9pZCAqc2lnLCBpbnQgc2lnX3NpemUpCit7CisJaW50IHJjID0gLUVJTzsKKworCWlmICh3bDM1MDFfZXNicV9yZXFfdGVzdCh0aGlzKSkgeworCQl1MTYgcHRyID0gd2wzNTAxX2dldF90eF9idWZmZXIodGhpcywgc2lnX3NpemUpOworCQlpZiAocHRyKSB7CisJCQl3bDM1MDFfc2V0X3RvX3dsYSh0aGlzLCBwdHIsIHNpZywgc2lnX3NpemUpOworCQkJd2wzNTAxX2VzYnFfcmVxKHRoaXMsICZwdHIpOworCQkJcmMgPSAwOworCQl9CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X21pYl92YWx1ZShzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIHU4IGluZGV4LAorCQkJCXZvaWQgKmJmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2dldF9yZXEgc2lnID0geworCQkuc2lnX2lkCSAgICA9IFdMMzUwMV9TSUdfR0VUX1JFUSwKKwkJLm1pYl9hdHRyaWIgPSBpbmRleCwKKwl9OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gLUVJTzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CisJaWYgKHdsMzUwMV9lc2JxX3JlcV90ZXN0KHRoaXMpKSB7CisJCXUxNiBwdHIgPSB3bDM1MDFfZ2V0X3R4X2J1ZmZlcih0aGlzLCBzaXplb2Yoc2lnKSk7CisJCWlmIChwdHIpIHsKKwkJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsIHB0ciwgJnNpZywgc2l6ZW9mKHNpZykpOworCQkJd2wzNTAxX2VzYnFfcmVxKHRoaXMsICZwdHIpOworCQkJdGhpcy0+c2lnX2dldF9jb25maXJtLm1pYl9zdGF0dXMgPSAyNTU7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CisJCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh0aGlzLT53YWl0LAorCQkJCXRoaXMtPnNpZ19nZXRfY29uZmlybS5taWJfc3RhdHVzICE9IDI1NSk7CisJCQlpZiAoIXJjKQorCQkJCW1lbWNweShiZiwgdGhpcy0+c2lnX2dldF9jb25maXJtLm1pYl92YWx1ZSwKKwkJCQkgICAgICAgc2l6ZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9wd3JfbWdtdChzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIGludCBzdXNwZW5kKQoreworCXN0cnVjdCB3bDM1MDFfcHdyX21nbXRfcmVxIHNpZyA9IHsKKwkJLnNpZ19pZAkJPSBXTDM1MDFfU0lHX1BXUl9NR01UX1JFUSwKKwkJLnB3cl9zYXZlCT0gc3VzcGVuZCwKKwkJLndha2VfdXAJPSAhc3VzcGVuZCwKKwkJLnJlY2VpdmVfZHRpbXMJPSAxMCwKKwl9OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gLUVJTzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CisJaWYgKHdsMzUwMV9lc2JxX3JlcV90ZXN0KHRoaXMpKSB7CisJCXUxNiBwdHIgPSB3bDM1MDFfZ2V0X3R4X2J1ZmZlcih0aGlzLCBzaXplb2Yoc2lnKSk7CisJCWlmIChwdHIpIHsKKwkJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsIHB0ciwgJnNpZywgc2l6ZW9mKHNpZykpOworCQkJd2wzNTAxX2VzYnFfcmVxKHRoaXMsICZwdHIpOworCQkJdGhpcy0+c2lnX3B3cl9tZ210X2NvbmZpcm0uc3RhdHVzID0gMjU1OworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhpcy0+bG9jaywgZmxhZ3MpOworCQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUodGhpcy0+d2FpdCwKKwkJCQl0aGlzLT5zaWdfcHdyX21nbXRfY29uZmlybS5zdGF0dXMgIT0gMjU1KTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBzdGF0dXM9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgICBzdXNwZW5kID8gInN1c3BlbmQiIDogInJlc3VtZSIsCisJCQkgICAgICAgdGhpcy0+c2lnX3B3cl9tZ210X2NvbmZpcm0uc3RhdHVzKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogd2wzNTAxX3NlbmRfcGt0IC0gU2VuZCBhIHBhY2tldC4KKyAqIEB0aGlzIC0gY2FyZAorICoKKyAqIFNlbmQgYSBwYWNrZXQuCisgKgorICogZGF0YSA9IEV0aGVybmV0IHJhdyBmcmFtZS4gIChlLmcuIGRhdGFbMF0gLSBkYXRhWzVdIGlzIERlc3QgTUFDIEFkZHIsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVs2XSAtIGRhdGFbMTFdIGlzIFNyYyBNQUMgQWRkcikKKyAqIFJlZjogSUVFRSA4MDIuMTEKKyAqLworc3RhdGljIGludCB3bDM1MDFfc2VuZF9wa3Qoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1OCAqZGF0YSwgdTE2IGxlbikKK3sKKwl1MTYgYmYsIHNpZ19iZiwgbmV4dCwgdG1wbGVuLCBwa3RsZW47CisJc3RydWN0IHdsMzUwMV9tZF9yZXEgc2lnID0geworCQkuc2lnX2lkID0gV0wzNTAxX1NJR19NRF9SRVEsCisJfTsKKwl1OCAqcGRhdGEgPSAoY2hhciAqKWRhdGE7CisJaW50IHJjID0gLUVJTzsKKworCWlmICh3bDM1MDFfZXNicV9yZXFfdGVzdCh0aGlzKSkgeworCQlzaWdfYmYgPSB3bDM1MDFfZ2V0X3R4X2J1ZmZlcih0aGlzLCBzaXplb2Yoc2lnKSk7CisJCXJjID0gLUVOT01FTTsKKwkJaWYgKCFzaWdfYmYpCS8qIE5vIGZyZWUgYnVmZmVyIGF2YWlsYWJsZSAqLworCQkJZ290byBvdXQ7CisJCWJmID0gd2wzNTAxX2dldF90eF9idWZmZXIodGhpcywgbGVuICsgMjYgKyAyNCk7CisJCWlmICghYmYpIHsKKwkJCS8qIE5vIGZyZWUgYnVmZmVyIGF2YWlsYWJsZSAqLworCQkJd2wzNTAxX2ZyZWVfdHhfYnVmZmVyKHRoaXMsIHNpZ19iZik7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyYyA9IDA7CisJCW1lbWNweSgmc2lnLmRhZGRyWzBdLCBwZGF0YSwgMTIpOworCQlwa3RsZW4gPSBsZW4gLSAxMjsKKwkJcGRhdGEgKz0gMTI7CisJCXNpZy5kYXRhID0gYmY7CisJCWlmICgoKCpwZGF0YSkgKiAyNTYgKyAoKihwZGF0YSArIDEpKSkgPiAxNTAwKSB7CisJCQl1OCBhZGRyNFtFVEhfQUxFTl0gPSB7CisJCQkJWzBdID0gMHhBQSwgWzFdID0gMHhBQSwgWzJdID0gMHgwMywgWzRdID0gMHgwMCwKKwkJCX07CisKKwkJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsIGJmICsgMiArCisJCQkJCSAgb2Zmc2V0b2Yoc3RydWN0IHdsMzUwMV90eF9oZHIsIGFkZHI0KSwKKwkJCQkJICBhZGRyNCwgc2l6ZW9mKGFkZHI0KSk7CisJCQlzaWcuc2l6ZSA9IHBrdGxlbiArIDI0ICsgNCArIDY7CisJCQlpZiAocGt0bGVuID4gKDI1NCAtIHNpemVvZihzdHJ1Y3Qgd2wzNTAxX3R4X2hkcikpKSB7CisJCQkJdG1wbGVuID0gMjU0IC0gc2l6ZW9mKHN0cnVjdCB3bDM1MDFfdHhfaGRyKTsKKwkJCQlwa3RsZW4gLT0gdG1wbGVuOworCQkJfSBlbHNlIHsKKwkJCQl0bXBsZW4gPSBwa3RsZW47CisJCQkJcGt0bGVuID0gMDsKKwkJCX0KKwkJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsCisJCQkJCSAgYmYgKyAyICsgc2l6ZW9mKHN0cnVjdCB3bDM1MDFfdHhfaGRyKSwKKwkJCQkJICBwZGF0YSwgdG1wbGVuKTsKKwkJCXBkYXRhICs9IHRtcGxlbjsKKwkJCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYmYsICZuZXh0LCBzaXplb2YobmV4dCkpOworCQkJYmYgPSBuZXh0OworCQl9IGVsc2UgeworCQkJc2lnLnNpemUgPSBwa3RsZW4gKyAyNCArIDQgLSAyOworCQkJcGRhdGEgKz0gMjsKKwkJCXBrdGxlbiAtPSAyOworCQkJaWYgKHBrdGxlbiA+ICgyNTQgLSBzaXplb2Yoc3RydWN0IHdsMzUwMV90eF9oZHIpICsgNikpIHsKKwkJCQl0bXBsZW4gPSAyNTQgLSBzaXplb2Yoc3RydWN0IHdsMzUwMV90eF9oZHIpICsgNjsKKwkJCQlwa3RsZW4gLT0gdG1wbGVuOworCQkJfSBlbHNlIHsKKwkJCQl0bXBsZW4gPSBwa3RsZW47CisJCQkJcGt0bGVuID0gMDsKKwkJCX0KKwkJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsIGJmICsgMiArCisJCQkJCSAgb2Zmc2V0b2Yoc3RydWN0IHdsMzUwMV90eF9oZHIsIGFkZHI0KSwKKwkJCQkJICBwZGF0YSwgdG1wbGVuKTsKKwkJCXBkYXRhICs9IHRtcGxlbjsKKwkJCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYmYsICZuZXh0LCBzaXplb2YobmV4dCkpOworCQkJYmYgPSBuZXh0OworCQl9CisJCXdoaWxlIChwa3RsZW4gPiAwKSB7CisJCQlpZiAocGt0bGVuID4gMjU0KSB7CisJCQkJdG1wbGVuID0gMjU0OworCQkJCXBrdGxlbiAtPSAyNTQ7CisJCQl9IGVsc2UgeworCQkJCXRtcGxlbiA9IHBrdGxlbjsKKwkJCQlwa3RsZW4gPSAwOworCQkJfQorCQkJd2wzNTAxX3NldF90b193bGEodGhpcywgYmYgKyAyLCBwZGF0YSwgdG1wbGVuKTsKKwkJCXBkYXRhICs9IHRtcGxlbjsKKwkJCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYmYsICZuZXh0LCBzaXplb2YobmV4dCkpOworCQkJYmYgPSBuZXh0OworCQl9CisJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsIHNpZ19iZiwgJnNpZywgc2l6ZW9mKHNpZykpOworCQl3bDM1MDFfZXNicV9yZXEodGhpcywgJnNpZ19iZik7CisJfQorb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3bDM1MDFfbWdtdF9yZXN5bmMoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXN0cnVjdCB3bDM1MDFfcmVzeW5jX3JlcSBzaWcgPSB7CisJCS5zaWdfaWQgPSBXTDM1MDFfU0lHX1JFU1lOQ19SRVEsCisJfTsKKworCXJldHVybiB3bDM1MDFfZXNicV9leGVjKHRoaXMsICZzaWcsIHNpemVvZihzaWcpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgd2wzNTAxX2Z3X2Jzc190eXBlKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwlyZXR1cm4gdGhpcy0+bmV0X3R5cGUgPT0gSVdfTU9ERV9JTkZSQSA/IFdMMzUwMV9ORVRfVFlQRV9JTkZSQSA6CisJCQkJCQkgV0wzNTAxX05FVF9UWVBFX0FESE9DOworfQorCitzdGF0aWMgaW5saW5lIGludCB3bDM1MDFfZndfY2FwX2luZm8oc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXJldHVybiB0aGlzLT5uZXRfdHlwZSA9PSBJV19NT0RFX0lORlJBID8gV0wzNTAxX01HTVRfQ0FQQUJJTElUWV9FU1MgOgorCQkJCQkJIFdMMzUwMV9NR01UX0NBUEFCSUxJVFlfSUJTUzsKK30KKworc3RhdGljIGludCB3bDM1MDFfbWdtdF9zY2FuKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywgdTE2IGNoYW5fdGltZSkKK3sKKwlzdHJ1Y3Qgd2wzNTAxX3NjYW5fcmVxIHNpZyA9IHsKKwkJLnNpZ19pZAkJPSBXTDM1MDFfU0lHX1NDQU5fUkVRLAorCQkuc2Nhbl90eXBlCT0gV0wzNTAxX1NDQU5fVFlQRV9BQ1RJVkUsCisJCS5wcm9iZV9kZWxheQk9IDB4MTAsCisJCS5taW5fY2hhbl90aW1lCT0gY2hhbl90aW1lLAorCQkubWF4X2NoYW5fdGltZQk9IGNoYW5fdGltZSwKKwkJLmJzc190eXBlCT0gd2wzNTAxX2Z3X2Jzc190eXBlKHRoaXMpLAorCX07CisKKwl0aGlzLT5ic3NfY250ID0gdGhpcy0+am9pbl9zdGFfYnNzID0gMDsKKwlyZXR1cm4gd2wzNTAxX2VzYnFfZXhlYyh0aGlzLCAmc2lnLCBzaXplb2Yoc2lnKSk7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX21nbXRfam9pbihzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIHUxNiBzdGFzKQoreworCXN0cnVjdCB3bDM1MDFfam9pbl9yZXEgc2lnID0geworCQkuc2lnX2lkCQkgID0gV0wzNTAxX1NJR19KT0lOX1JFUSwKKwkJLnRpbWVvdXQJICA9IDEwLAorCQkuZHNfcHNldCA9IHsKKwkJCS5lbCA9IHsKKwkJCQkuaWQgID0gSVdfTUdNVF9JTkZPX0VMRU1FTlRfRFNfUEFSQU1FVEVSX1NFVCwKKwkJCQkubGVuID0gMSwKKwkJCX0sCisJCQkuY2hhbgk9IHRoaXMtPmNoYW4sCisJCX0sCisJfTsKKworCW1lbWNweSgmc2lnLmJlYWNvbl9wZXJpb2QsICZ0aGlzLT5ic3Nfc2V0W3N0YXNdLmJlYWNvbl9wZXJpb2QsIDcyKTsKKwlyZXR1cm4gd2wzNTAxX2VzYnFfZXhlYyh0aGlzLCAmc2lnLCBzaXplb2Yoc2lnKSk7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX21nbXRfc3RhcnQoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXN0cnVjdCB3bDM1MDFfc3RhcnRfcmVxIHNpZyA9IHsKKwkJLnNpZ19pZAkJCT0gV0wzNTAxX1NJR19TVEFSVF9SRVEsCisJCS5iZWFjb25fcGVyaW9kCQk9IDQwMCwKKwkJLmR0aW1fcGVyaW9kCQk9IDEsCisJCS5kc19wc2V0ID0geworCQkJLmVsID0geworCQkJCS5pZCAgPSBJV19NR01UX0lORk9fRUxFTUVOVF9EU19QQVJBTUVURVJfU0VULAorCQkJCS5sZW4gPSAxLAorCQkJfSwKKwkJCS5jaGFuCT0gdGhpcy0+Y2hhbiwKKwkJfSwKKwkJLmJzc19iYXNpY19yc2V0CT0geworCQkJLmVsID0geworCQkJCS5pZAk9IElXX01HTVRfSU5GT19FTEVNRU5UX1NVUFBPUlRFRF9SQVRFUywKKwkJCQkubGVuID0gMiwKKwkJCX0sCisJCQkuZGF0YV9yYXRlX2xhYmVscyA9IHsKKwkJCQlbMF0gPSBJV19NR01UX1JBVEVfTEFCRUxfTUFOREFUT1JZIHwKKwkJCQkgICAgICBJV19NR01UX1JBVEVfTEFCRUxfMU1CSVQsCisJCQkJWzFdID0gSVdfTUdNVF9SQVRFX0xBQkVMX01BTkRBVE9SWSB8CisJCQkJICAgICAgSVdfTUdNVF9SQVRFX0xBQkVMXzJNQklULAorCQkJfSwKKwkJfSwKKwkJLm9wZXJhdGlvbmFsX3JzZXQJPSB7CisJCQkuZWwgPSB7CisJCQkJLmlkCT0gSVdfTUdNVF9JTkZPX0VMRU1FTlRfU1VQUE9SVEVEX1JBVEVTLAorCQkJCS5sZW4gPSAyLAorCQkJfSwKKwkJCS5kYXRhX3JhdGVfbGFiZWxzID0geworCQkJCVswXSA9IElXX01HTVRfUkFURV9MQUJFTF9NQU5EQVRPUlkgfAorCQkJCSAgICAgIElXX01HTVRfUkFURV9MQUJFTF8xTUJJVCwKKwkJCQlbMV0gPSBJV19NR01UX1JBVEVfTEFCRUxfTUFOREFUT1JZIHwKKwkJCQkgICAgICBJV19NR01UX1JBVEVfTEFCRUxfMk1CSVQsCisJCQl9LAorCQl9LAorCQkuaWJzc19wc2V0CQk9IHsKKwkJCS5lbCA9IHsKKwkJCQkuaWQJID0gSVdfTUdNVF9JTkZPX0VMRU1FTlRfSUJTU19QQVJBTUVURVJfU0VULAorCQkJCS5sZW4gICAgID0gMiwKKwkJCX0sCisJCQkuYXRpbV93aW5kb3cgPSAxMCwKKwkJfSwKKwkJLmJzc190eXBlCQk9IHdsMzUwMV9md19ic3NfdHlwZSh0aGlzKSwKKwkJLmNhcF9pbmZvCQk9IHdsMzUwMV9md19jYXBfaW5mbyh0aGlzKSwKKwl9OworCisJaXdfY29weV9tZ210X2luZm9fZWxlbWVudCgmc2lnLnNzaWQuZWwsICZ0aGlzLT5lc3NpZC5lbCk7CisJaXdfY29weV9tZ210X2luZm9fZWxlbWVudCgmdGhpcy0+a2VlcF9lc3NpZC5lbCwgJnRoaXMtPmVzc2lkLmVsKTsKKwlyZXR1cm4gd2wzNTAxX2VzYnFfZXhlYyh0aGlzLCAmc2lnLCBzaXplb2Yoc2lnKSk7Cit9CisKK3N0YXRpYyB2b2lkIHdsMzUwMV9tZ210X3NjYW5fY29uZmlybShzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIHUxNiBhZGRyKQoreworCXUxNiBpID0gMDsKKwlpbnQgbWF0Y2hmbGFnID0gMDsKKwlzdHJ1Y3Qgd2wzNTAxX3NjYW5fY29uZmlybSBzaWc7CisKKwlkcHJpbnRrKDMsICJlbnRyeSIpOworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYWRkciwgJnNpZywgc2l6ZW9mKHNpZykpOworCWlmIChzaWcuc3RhdHVzID09IFdMMzUwMV9TVEFUVVNfU1VDQ0VTUykgeworCQlkcHJpbnRrKDMsICJzdWNjZXNzIik7CisJCWlmICgodGhpcy0+bmV0X3R5cGUgPT0gSVdfTU9ERV9JTkZSQSAmJgorCQkgICAgIChzaWcuY2FwX2luZm8gJiBXTDM1MDFfTUdNVF9DQVBBQklMSVRZX0VTUykpIHx8CisJCSAgICAodGhpcy0+bmV0X3R5cGUgPT0gSVdfTU9ERV9BREhPQyAmJgorCQkgICAgIChzaWcuY2FwX2luZm8gJiBXTDM1MDFfTUdNVF9DQVBBQklMSVRZX0lCU1MpKSB8fAorCQkgICAgdGhpcy0+bmV0X3R5cGUgPT0gSVdfTU9ERV9BVVRPKSB7CisJCQlpZiAoIXRoaXMtPmVzc2lkLmVsLmxlbikKKwkJCQltYXRjaGZsYWcgPSAxOworCQkJZWxzZSBpZiAodGhpcy0+ZXNzaWQuZWwubGVuID09IDMgJiYKKwkJCQkgIW1lbWNtcCh0aGlzLT5lc3NpZC5lc3NpZCwgIkFOWSIsIDMpKQorCQkJCW1hdGNoZmxhZyA9IDE7CisJCQllbHNlIGlmICh0aGlzLT5lc3NpZC5lbC5sZW4gIT0gc2lnLnNzaWQuZWwubGVuKQorCQkJCW1hdGNoZmxhZyA9IDA7CisJCQllbHNlIGlmIChtZW1jbXAodGhpcy0+ZXNzaWQuZXNzaWQsIHNpZy5zc2lkLmVzc2lkLAorCQkJCQl0aGlzLT5lc3NpZC5lbC5sZW4pKQorCQkJCW1hdGNoZmxhZyA9IDA7CisJCQllbHNlCisJCQkJbWF0Y2hmbGFnID0gMTsKKwkJCWlmIChtYXRjaGZsYWcpIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgdGhpcy0+YnNzX2NudDsgaSsrKSB7CisJCQkJCWlmICghbWVtY21wKHRoaXMtPmJzc19zZXRbaV0uYnNzaWQsCisJCQkJCQkgICAgc2lnLmJzc2lkLCBFVEhfQUxFTikpIHsKKwkJCQkJCW1hdGNoZmxhZyA9IDA7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChtYXRjaGZsYWcgJiYgKGkgPCAyMCkpIHsKKwkJCQltZW1jcHkoJnRoaXMtPmJzc19zZXRbaV0uYmVhY29uX3BlcmlvZCwKKwkJCQkgICAgICAgJnNpZy5iZWFjb25fcGVyaW9kLCA3Myk7CisJCQkJdGhpcy0+YnNzX2NudCsrOworCQkJCXRoaXMtPnJzc2kgPSBzaWcucnNzaTsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoc2lnLnN0YXR1cyA9PSBXTDM1MDFfU1RBVFVTX1RJTUVPVVQpIHsKKwkJZHByaW50aygzLCAidGltZW91dCIpOworCQl0aGlzLT5qb2luX3N0YV9ic3MgPSAwOworCQlmb3IgKGkgPSB0aGlzLT5qb2luX3N0YV9ic3M7IGkgPCB0aGlzLT5ic3NfY250OyBpKyspCisJCQlpZiAoIXdsMzUwMV9tZ210X2pvaW4odGhpcywgaSkpCisJCQkJYnJlYWs7CisJCXRoaXMtPmpvaW5fc3RhX2JzcyA9IGk7CisJCWlmICh0aGlzLT5qb2luX3N0YV9ic3MgPT0gdGhpcy0+YnNzX2NudCkgeworCQkJaWYgKHRoaXMtPm5ldF90eXBlID09IElXX01PREVfSU5GUkEpCisJCQkJd2wzNTAxX21nbXRfc2Nhbih0aGlzLCAxMDApOworCQkJZWxzZSB7CisJCQkJdGhpcy0+YWRob2NfdGltZXMrKzsKKwkJCQlpZiAodGhpcy0+YWRob2NfdGltZXMgPiBXTDM1MDFfTUFYX0FESE9DX1RSSUVTKQorCQkJCQl3bDM1MDFfbWdtdF9zdGFydCh0aGlzKTsKKwkJCQllbHNlCisJCQkJCXdsMzUwMV9tZ210X3NjYW4odGhpcywgMTAwKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqCisgKiB3bDM1MDFfYmxvY2tfaW50ZXJydXB0IC0gTWFzayBpbnRlcnJ1cHQgZnJvbSBTVVRSTworICogQHRoaXMgLSBjYXJkCisgKgorICogTWFzayBpbnRlcnJ1cHQgZnJvbSBTVVRSTy4gKGkuZS4gU1VUUk8gY2Fubm90IGludGVycnVwdCB0aGUgSE9TVCkKKyAqIFJldHVybjogMSBpZiBpbnRlcnJ1cHQgaXMgb3JpZ2luYWxseSBlbmFibGVkCisgKi8KK3N0YXRpYyBpbnQgd2wzNTAxX2Jsb2NrX2ludGVycnVwdChzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMpCit7CisJdTggb2xkID0gaW5iKHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfR0NSKTsKKwl1OCBuZXcgPSBvbGQgJiAofihXTDM1MDFfR0NSX0VDSU5UIHwgV0wzNTAxX0dDUl9JTlQyRUMgfAorCQkJV0wzNTAxX0dDUl9FTkVDSU5UKSk7CisKKwl3bDM1MDFfb3V0YihuZXcsIHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfR0NSKTsKKwlyZXR1cm4gb2xkICYgV0wzNTAxX0dDUl9FTkVDSU5UOworfQorCisvKioKKyAqIHdsMzUwMV91bmJsb2NrX2ludGVycnVwdCAtIEVuYWJsZSBpbnRlcnJ1cHQgZnJvbSBTVVRSTworICogQHRoaXMgLSBjYXJkCisgKgorICogRW5hYmxlIGludGVycnVwdCBmcm9tIFNVVFJPLiAoaS5lLiBTVVRSTyBjYW4gaW50ZXJydXB0IHRoZSBIT1NUKQorICogUmV0dXJuOiAxIGlmIGludGVycnVwdCBpcyBvcmlnaW5hbGx5IGVuYWJsZWQKKyAqLworc3RhdGljIGludCB3bDM1MDFfdW5ibG9ja19pbnRlcnJ1cHQoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXU4IG9sZCA9IGluYih0aGlzLT5iYXNlX2FkZHIgKyBXTDM1MDFfTklDX0dDUik7CisJdTggbmV3ID0gKG9sZCAmIH4oV0wzNTAxX0dDUl9FQ0lOVCB8IFdMMzUwMV9HQ1JfSU5UMkVDKSkgfAorCQkgIFdMMzUwMV9HQ1JfRU5FQ0lOVDsKKworCXdsMzUwMV9vdXRiKG5ldywgdGhpcy0+YmFzZV9hZGRyICsgV0wzNTAxX05JQ19HQ1IpOworCXJldHVybiBvbGQgJiBXTDM1MDFfR0NSX0VORUNJTlQ7Cit9CisKKy8qKgorICogd2wzNTAxX3JlY2VpdmUgLSBSZWNlaXZlIGRhdGEgZnJvbSBSZWNlaXZlIFF1ZXVlLgorICoKKyAqIFJlY2VpdmUgZGF0YSBmcm9tIFJlY2VpdmUgUXVldWUuCisgKgorICogQHRoaXM6IGNhcmQKKyAqIEBiZjogYWRkcmVzcyBvZiBob3N0CisgKiBAc2l6ZTogc2l6ZSBvZiBidWZmZXIuCisgKi8KK3N0YXRpYyB1MTYgd2wzNTAxX3JlY2VpdmUoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1OCAqYmYsIHUxNiBzaXplKQoreworCXUxNiBuZXh0X2FkZHIsIG5leHRfYWRkcjE7CisJdTggKmRhdGEgPSBiZiArIDEyOworCisJc2l6ZSAtPSAxMjsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIHRoaXMtPnN0YXJ0X3NlZyArIDIsCisJCQkgICAgJm5leHRfYWRkciwgc2l6ZW9mKG5leHRfYWRkcikpOworCWlmIChzaXplID4gV0wzNTAxX0JMS1NaIC0gc2l6ZW9mKHN0cnVjdCB3bDM1MDFfcnhfaGRyKSkgeworCQl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsCisJCQkJICAgIHRoaXMtPnN0YXJ0X3NlZyArCisJCQkJCXNpemVvZihzdHJ1Y3Qgd2wzNTAxX3J4X2hkciksIGRhdGEsCisJCQkJICAgIFdMMzUwMV9CTEtTWiAtCisJCQkJCXNpemVvZihzdHJ1Y3Qgd2wzNTAxX3J4X2hkcikpOworCQlzaXplIC09IFdMMzUwMV9CTEtTWiAtIHNpemVvZihzdHJ1Y3Qgd2wzNTAxX3J4X2hkcik7CisJCWRhdGEgKz0gV0wzNTAxX0JMS1NaIC0gc2l6ZW9mKHN0cnVjdCB3bDM1MDFfcnhfaGRyKTsKKwl9IGVsc2UgeworCQl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsCisJCQkJICAgIHRoaXMtPnN0YXJ0X3NlZyArCisJCQkJCXNpemVvZihzdHJ1Y3Qgd2wzNTAxX3J4X2hkciksCisJCQkJICAgIGRhdGEsIHNpemUpOworCQlzaXplID0gMDsKKwl9CisJd2hpbGUgKHNpemUgPiAwKSB7CisJCWlmIChzaXplID4gV0wzNTAxX0JMS1NaIC0gNSkgeworCQkJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCBuZXh0X2FkZHIgKyA1LCBkYXRhLAorCQkJCQkgICAgV0wzNTAxX0JMS1NaIC0gNSk7CisJCQlzaXplIC09IFdMMzUwMV9CTEtTWiAtIDU7CisJCQlkYXRhICs9IFdMMzUwMV9CTEtTWiAtIDU7CisJCQl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIG5leHRfYWRkciArIDIsICZuZXh0X2FkZHIxLAorCQkJCQkgICAgc2l6ZW9mKG5leHRfYWRkcjEpKTsKKwkJCW5leHRfYWRkciA9IG5leHRfYWRkcjE7CisJCX0gZWxzZSB7CisJCQl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIG5leHRfYWRkciArIDUsIGRhdGEsIHNpemUpOworCQkJc2l6ZSA9IDA7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdsMzUwMV9lc2JxX3JlcV9mcmVlKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwl1OCB0bXA7CisJdTE2IGFkZHI7CisKKwlpZiAodGhpcy0+ZXNicV9yZXFfaGVhZCA9PSB0aGlzLT5lc2JxX3JlcV90YWlsKQorCQlnb3RvIG91dDsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIHRoaXMtPmVzYnFfcmVxX3RhaWwgKyAzLCAmdG1wLCBzaXplb2YodG1wKSk7CisJaWYgKCEodG1wICYgMHg4MCkpCisJCWdvdG8gb3V0OworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgdGhpcy0+ZXNicV9yZXFfdGFpbCwgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJd2wzNTAxX2ZyZWVfdHhfYnVmZmVyKHRoaXMsIGFkZHIpOworCXRoaXMtPmVzYnFfcmVxX3RhaWwgKz0gNDsKKwlpZiAodGhpcy0+ZXNicV9yZXFfdGFpbCA+PSB0aGlzLT5lc2JxX3JlcV9lbmQpCisJCXRoaXMtPmVzYnFfcmVxX3RhaWwgPSB0aGlzLT5lc2JxX3JlcV9zdGFydDsKK291dDoKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2VzYnFfY29uZmlybShzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMpCit7CisJdTggdG1wOworCisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCB0aGlzLT5lc2JxX2NvbmZpcm0gKyAzLCAmdG1wLCBzaXplb2YodG1wKSk7CisJcmV0dXJuIHRtcCAmIDB4ODA7Cit9CisKK3N0YXRpYyB2b2lkIHdsMzUwMV9vbmxpbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogV2lyZWxlc3MgTEFOIG9ubGluZS4gQlNTSUQ6ICIKKwkgICAgICAgIiUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYXG4iLCBkZXYtPm5hbWUsCisJICAgICAgIHRoaXMtPmJzc2lkWzBdLCB0aGlzLT5ic3NpZFsxXSwgdGhpcy0+YnNzaWRbMl0sCisJICAgICAgIHRoaXMtPmJzc2lkWzNdLCB0aGlzLT5ic3NpZFs0XSwgdGhpcy0+YnNzaWRbNV0pOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIHZvaWQgd2wzNTAxX2VzYnFfY29uZmlybV9kb25lKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwl1OCB0bXAgPSAwOworCisJd2wzNTAxX3NldF90b193bGEodGhpcywgdGhpcy0+ZXNicV9jb25maXJtICsgMywgJnRtcCwgc2l6ZW9mKHRtcCkpOworCXRoaXMtPmVzYnFfY29uZmlybSArPSA0OworCWlmICh0aGlzLT5lc2JxX2NvbmZpcm0gPj0gdGhpcy0+ZXNicV9jb25maXJtX2VuZCkKKwkJdGhpcy0+ZXNicV9jb25maXJtID0gdGhpcy0+ZXNicV9jb25maXJtX3N0YXJ0OworfQorCitzdGF0aWMgaW50IHdsMzUwMV9tZ210X2F1dGgoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXN0cnVjdCB3bDM1MDFfYXV0aF9yZXEgc2lnID0geworCQkuc2lnX2lkCSA9IFdMMzUwMV9TSUdfQVVUSF9SRVEsCisJCS50eXBlCSA9IFdMMzUwMV9TWVNfVFlQRV9PUEVOLAorCQkudGltZW91dCA9IDEwMDAsCisJfTsKKworCWRwcmludGsoMywgImVudHJ5Iik7CisJbWVtY3B5KHNpZy5tYWNfYWRkciwgdGhpcy0+YnNzaWQsIEVUSF9BTEVOKTsKKwlyZXR1cm4gd2wzNTAxX2VzYnFfZXhlYyh0aGlzLCAmc2lnLCBzaXplb2Yoc2lnKSk7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX21nbXRfYXNzb2NpYXRpb24oc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXN0cnVjdCB3bDM1MDFfYXNzb2NfcmVxIHNpZyA9IHsKKwkJLnNpZ19pZAkJID0gV0wzNTAxX1NJR19BU1NPQ19SRVEsCisJCS50aW1lb3V0CSA9IDEwMDAsCisJCS5saXN0ZW5faW50ZXJ2YWwgPSA1LAorCQkuY2FwX2luZm8JID0gdGhpcy0+Y2FwX2luZm8sCisJfTsKKworCWRwcmludGsoMywgImVudHJ5Iik7CisJbWVtY3B5KHNpZy5tYWNfYWRkciwgdGhpcy0+YnNzaWQsIEVUSF9BTEVOKTsKKwlyZXR1cm4gd2wzNTAxX2VzYnFfZXhlYyh0aGlzLCAmc2lnLCBzaXplb2Yoc2lnKSk7Cit9CisKK3N0YXRpYyB2b2lkIHdsMzUwMV9tZ210X2pvaW5fY29uZmlybShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgYWRkcikKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisJc3RydWN0IHdsMzUwMV9qb2luX2NvbmZpcm0gc2lnOworCisJZHByaW50aygzLCAiZW50cnkiKTsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIGFkZHIsICZzaWcsIHNpemVvZihzaWcpKTsKKwlpZiAoc2lnLnN0YXR1cyA9PSBXTDM1MDFfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaWYgKHRoaXMtPm5ldF90eXBlID09IElXX01PREVfSU5GUkEpIHsKKwkJCWlmICh0aGlzLT5qb2luX3N0YV9ic3MgPCB0aGlzLT5ic3NfY250KSB7CisJCQkJY29uc3QgaW50IGkgPSB0aGlzLT5qb2luX3N0YV9ic3M7CisJCQkJbWVtY3B5KHRoaXMtPmJzc2lkLAorCQkJCSAgICAgICB0aGlzLT5ic3Nfc2V0W2ldLmJzc2lkLCBFVEhfQUxFTik7CisJCQkJdGhpcy0+Y2hhbiA9IHRoaXMtPmJzc19zZXRbaV0uZHNfcHNldC5jaGFuOworCQkJCWl3X2NvcHlfbWdtdF9pbmZvX2VsZW1lbnQoJnRoaXMtPmtlZXBfZXNzaWQuZWwsCisJCQkJCQkgICAgICZ0aGlzLT5ic3Nfc2V0W2ldLnNzaWQuZWwpOworCQkJCXdsMzUwMV9tZ210X2F1dGgodGhpcyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQljb25zdCBpbnQgaSA9IHRoaXMtPmpvaW5fc3RhX2JzczsKKworCQkJbWVtY3B5KCZ0aGlzLT5ic3NpZCwgJnRoaXMtPmJzc19zZXRbaV0uYnNzaWQsIEVUSF9BTEVOKTsKKwkJCXRoaXMtPmNoYW4gPSB0aGlzLT5ic3Nfc2V0W2ldLmRzX3BzZXQuY2hhbjsKKwkJCWl3X2NvcHlfbWdtdF9pbmZvX2VsZW1lbnQoJnRoaXMtPmtlZXBfZXNzaWQuZWwsCisJCQkJCQkgICZ0aGlzLT5ic3Nfc2V0W2ldLnNzaWQuZWwpOworCQkJd2wzNTAxX29ubGluZShkZXYpOworCQl9CisJfSBlbHNlIHsKKwkJaW50IGk7CisJCXRoaXMtPmpvaW5fc3RhX2JzcysrOworCQlmb3IgKGkgPSB0aGlzLT5qb2luX3N0YV9ic3M7IGkgPCB0aGlzLT5ic3NfY250OyBpKyspCisJCQlpZiAoIXdsMzUwMV9tZ210X2pvaW4odGhpcywgaSkpCisJCQkJYnJlYWs7CisJCXRoaXMtPmpvaW5fc3RhX2JzcyA9IGk7CisJCWlmICh0aGlzLT5qb2luX3N0YV9ic3MgPT0gdGhpcy0+YnNzX2NudCkgeworCQkJaWYgKHRoaXMtPm5ldF90eXBlID09IElXX01PREVfSU5GUkEpCisJCQkJd2wzNTAxX21nbXRfc2Nhbih0aGlzLCAxMDApOworCQkJZWxzZSB7CisJCQkJdGhpcy0+YWRob2NfdGltZXMrKzsKKwkJCQlpZiAodGhpcy0+YWRob2NfdGltZXMgPiBXTDM1MDFfTUFYX0FESE9DX1RSSUVTKQorCQkJCQl3bDM1MDFfbWdtdF9zdGFydCh0aGlzKTsKKwkJCQllbHNlCisJCQkJCXdsMzUwMV9tZ210X3NjYW4odGhpcywgMTAwKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHdsMzUwMV9hbGFybV9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICBzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMpCit7CisJaWYgKHRoaXMtPm5ldF90eXBlID09IElXX01PREVfSU5GUkEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiV2lyZWxlc3MgTEFOIG9mZmxpbmVcbiIpOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXdsMzUwMV9tZ210X3Jlc3luYyh0aGlzKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bDM1MDFfbWRfY29uZmlybV9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgIHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywKKwkJCQkJICAgICAgIHUxNiBhZGRyKQoreworCXN0cnVjdCB3bDM1MDFfbWRfY29uZmlybSBzaWc7CisKKwlkcHJpbnRrKDMsICJlbnRyeSIpOworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYWRkciwgJnNpZywgc2l6ZW9mKHNpZykpOworCXdsMzUwMV9mcmVlX3R4X2J1ZmZlcih0aGlzLCBzaWcuZGF0YSk7CisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2wzNTAxX21kX2luZF9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1MTYgYWRkcikKK3sKKwlzdHJ1Y3Qgd2wzNTAxX21kX2luZCBzaWc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1OCByc3NpLCBhZGRyNFtFVEhfQUxFTl07CisJdTE2IHBrdF9sZW47CisKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIGFkZHIsICZzaWcsIHNpemVvZihzaWcpKTsKKwl0aGlzLT5zdGFydF9zZWcgPSBzaWcuZGF0YTsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsCisJCQkgICAgc2lnLmRhdGEgKyBvZmZzZXRvZihzdHJ1Y3Qgd2wzNTAxX3J4X2hkciwgcnNzaSksCisJCQkgICAgJnJzc2ksIHNpemVvZihyc3NpKSk7CisJdGhpcy0+cnNzaSA9IHJzc2kgPD0gNjMgPyAocnNzaSAqIDEwMCkgLyA2NCA6IDI1NTsKKworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywKKwkJCSAgICBzaWcuZGF0YSArCisJCQkJb2Zmc2V0b2Yoc3RydWN0IHdsMzUwMV9yeF9oZHIsIGFkZHI0KSwKKwkJCSAgICAmYWRkcjQsIHNpemVvZihhZGRyNCkpOworCWlmICghKGFkZHI0WzBdID09IDB4QUEgJiYgYWRkcjRbMV0gPT0gMHhBQSAmJgorCSAgICAgIGFkZHI0WzJdID09IDB4MDMgJiYgYWRkcjRbNF0gPT0gMHgwMCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSW5zdXBwb3J0ZWQgcGFja2V0IHR5cGUhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlwa3RfbGVuID0gc2lnLnNpemUgKyAxMiAtIDI0IC0gNCAtIDY7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyA1KTsKKworCWlmICghc2tiKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW4ndCBhbGxvYyBhIHNrX2J1ZmYgb2Ygc2l6ZSAlZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHBrdF9sZW4pOworCQl0aGlzLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJfSBlbHNlIHsKKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYl9yZXNlcnZlKHNrYiwgMik7IC8qIElQIGhlYWRlcnMgb24gMTYgYnl0ZXMgYm91bmRhcmllcyAqLworCQlldGhfY29weV9hbmRfc3VtKHNrYiwgKHVuc2lnbmVkIGNoYXIgKikmc2lnLmRhZGRyLCAxMiwgMCk7CisJCXdsMzUwMV9yZWNlaXZlKHRoaXMsIHNrYi0+ZGF0YSwgcGt0X2xlbik7CisJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKwkJc2tiLT5wcm90b2NvbAk9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJZGV2LT5sYXN0X3J4CT0gamlmZmllczsKKwkJdGhpcy0+c3RhdHMucnhfcGFja2V0cysrOworCQl0aGlzLT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJbmV0aWZfcngoc2tiKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bDM1MDFfZ2V0X2NvbmZpcm1faW50ZXJydXB0KHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywKKwkJCQkJCXUxNiBhZGRyLCB2b2lkICpzaWcsIGludCBzaXplKQoreworCWRwcmludGsoMywgImVudHJ5Iik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCBhZGRyLCAmdGhpcy0+c2lnX2dldF9jb25maXJtLAorCQkJICAgIHNpemVvZih0aGlzLT5zaWdfZ2V0X2NvbmZpcm0pKTsKKwl3YWtlX3VwKCZ0aGlzLT53YWl0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdsMzUwMV9zdGFydF9jb25maXJtX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkJICBzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsCisJCQkJCQkgIHUxNiBhZGRyKQoreworCXN0cnVjdCB3bDM1MDFfc3RhcnRfY29uZmlybSBzaWc7CisKKwlkcHJpbnRrKDMsICJlbnRyeSIpOworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYWRkciwgJnNpZywgc2l6ZW9mKHNpZykpOworCWlmIChzaWcuc3RhdHVzID09IFdMMzUwMV9TVEFUVVNfU1VDQ0VTUykKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2wzNTAxX2Fzc29jX2NvbmZpcm1faW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkgIHUxNiBhZGRyKQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgd2wzNTAxX2Fzc29jX2NvbmZpcm0gc2lnOworCisJZHByaW50aygzLCAiZW50cnkiKTsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIGFkZHIsICZzaWcsIHNpemVvZihzaWcpKTsKKworCWlmIChzaWcuc3RhdHVzID09IFdMMzUwMV9TVEFUVVNfU1VDQ0VTUykKKwkJd2wzNTAxX29ubGluZShkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2wzNTAxX2F1dGhfY29uZmlybV9pbnRlcnJ1cHQoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLAorCQkJCQkJIHUxNiBhZGRyKQoreworCXN0cnVjdCB3bDM1MDFfYXV0aF9jb25maXJtIHNpZzsKKworCWRwcmludGsoMywgImVudHJ5Iik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCBhZGRyLCAmc2lnLCBzaXplb2Yoc2lnKSk7CisKKwlpZiAoc2lnLnN0YXR1cyA9PSBXTDM1MDFfU1RBVFVTX1NVQ0NFU1MpCisJCXdsMzUwMV9tZ210X2Fzc29jaWF0aW9uKHRoaXMpOworCWVsc2UKKwkJd2wzNTAxX21nbXRfcmVzeW5jKHRoaXMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2wzNTAxX3J4X2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBtb3JlcGt0czsKKwl1MTYgYWRkcjsKKwl1OCBzaWdfaWQ7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCisJZHByaW50aygzLCAiZW50cnkiKTsKK2xvb3A6CisJbW9yZXBrdHMgPSAwOworCWlmICghd2wzNTAxX2VzYnFfY29uZmlybSh0aGlzKSkKKwkJZ290byBmcmVlOworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgdGhpcy0+ZXNicV9jb25maXJtLCAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIGFkZHIgKyAyLCAmc2lnX2lkLCBzaXplb2Yoc2lnX2lkKSk7CisKKwlzd2l0Y2ggKHNpZ19pZCkgeworCWNhc2UgV0wzNTAxX1NJR19ERUFVVEhfSU5EOgorCWNhc2UgV0wzNTAxX1NJR19ESVNBU1NPQ19JTkQ6CisJY2FzZSBXTDM1MDFfU0lHX0FMQVJNOgorCQl3bDM1MDFfYWxhcm1faW50ZXJydXB0KGRldiwgdGhpcyk7CisJCWJyZWFrOworCWNhc2UgV0wzNTAxX1NJR19NRF9DT05GSVJNOgorCQl3bDM1MDFfbWRfY29uZmlybV9pbnRlcnJ1cHQoZGV2LCB0aGlzLCBhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTDM1MDFfU0lHX01EX0lORDoKKwkJd2wzNTAxX21kX2luZF9pbnRlcnJ1cHQoZGV2LCB0aGlzLCBhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTDM1MDFfU0lHX0dFVF9DT05GSVJNOgorCQl3bDM1MDFfZ2V0X2NvbmZpcm1faW50ZXJydXB0KHRoaXMsIGFkZHIsCisJCQkJCSAgICAgJnRoaXMtPnNpZ19nZXRfY29uZmlybSwKKwkJCQkJICAgICBzaXplb2YodGhpcy0+c2lnX2dldF9jb25maXJtKSk7CisJCWJyZWFrOworCWNhc2UgV0wzNTAxX1NJR19QV1JfTUdNVF9DT05GSVJNOgorCQl3bDM1MDFfZ2V0X2NvbmZpcm1faW50ZXJydXB0KHRoaXMsIGFkZHIsCisJCQkJCSAgICAgJnRoaXMtPnNpZ19wd3JfbWdtdF9jb25maXJtLAorCQkJCQkgICAgc2l6ZW9mKHRoaXMtPnNpZ19wd3JfbWdtdF9jb25maXJtKSk7CisJCWJyZWFrOworCWNhc2UgV0wzNTAxX1NJR19TVEFSVF9DT05GSVJNOgorCQl3bDM1MDFfc3RhcnRfY29uZmlybV9pbnRlcnJ1cHQoZGV2LCB0aGlzLCBhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTDM1MDFfU0lHX1NDQU5fQ09ORklSTToKKwkJd2wzNTAxX21nbXRfc2Nhbl9jb25maXJtKHRoaXMsIGFkZHIpOworCQlicmVhazsKKwljYXNlIFdMMzUwMV9TSUdfSk9JTl9DT05GSVJNOgorCQl3bDM1MDFfbWdtdF9qb2luX2NvbmZpcm0oZGV2LCBhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTDM1MDFfU0lHX0FTU09DX0NPTkZJUk06CisJCXdsMzUwMV9hc3NvY19jb25maXJtX2ludGVycnVwdChkZXYsIGFkZHIpOworCQlicmVhazsKKwljYXNlIFdMMzUwMV9TSUdfQVVUSF9DT05GSVJNOgorCQl3bDM1MDFfYXV0aF9jb25maXJtX2ludGVycnVwdCh0aGlzLCBhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTDM1MDFfU0lHX1JFU1lOQ19DT05GSVJNOgorCQl3bDM1MDFfbWdtdF9yZXN5bmModGhpcyk7IC8qIEZJWE1FOiBzaG91bGQgYmUgcmVzeW5jX2NvbmZpcm0gKi8KKwkJYnJlYWs7CisJfQorCXdsMzUwMV9lc2JxX2NvbmZpcm1fZG9uZSh0aGlzKTsKKwltb3JlcGt0cyA9IDE7CisJLyogZnJlZSByZXF1ZXN0IGlmIG5lY2Vzc2FyeSAqLworZnJlZToKKwl3bDM1MDFfZXNicV9yZXFfZnJlZSh0aGlzKTsKKwlpZiAobW9yZXBrdHMpCisJCWdvdG8gbG9vcDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdsMzUwMV9hY2tfaW50ZXJydXB0KHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwl3bDM1MDFfb3V0YihXTDM1MDFfR0NSX0VDSU5ULCB0aGlzLT5iYXNlX2FkZHIgKyBXTDM1MDFfTklDX0dDUik7Cit9CisKKy8qKgorICogd2wzNTAxX2ludGVycnVwdCAtIEhhcmR3YXJlIGludGVycnVwdCBmcm9tIGNhcmQuCisgKiBAaXJxIC0gSW50ZXJydXB0IG51bWJlcgorICogQGRldl9pZCAtIG5ldF9kZXZpY2UKKyAqIEByZWdzIC0gcmVnaXN0ZXJzCisgKgorICogV2UgbXVzdCBhY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0IGFzIHNvb24gYXMgcG9zc2libGUsIGFuZCBibG9jayB0aGUKKyAqIGludGVycnVwdCBmcm9tIHRoZSBzYW1lIGNhcmQgaW1tZWRpYXRlbHkgdG8gcHJldmVudCByZS1lbnRyeS4KKyAqCisgKiBCZWZvcmUgYWNjZXNzaW5nIHRoZSBDb250cm9sX1N0YXR1c19CbG9jaywgd2UgbXVzdCBsb2NrIFNVVFJPIGZpcnN0LgorICogT24gdGhlIG90aGVyIGhhbmQsIHRvIHByZXZlbnQgU1VUUk8gZnJvbSBtYWxmdW5jdGlvbmluZywgd2UgbXVzdAorICogdW5sb2NrIHRoZSBTVVRSTyBhcyBzb29uIGFzIHBvc3NpYmxlLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2wzNTAxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzOworCWludCBoYW5kbGVkID0gMTsKKworCWlmICghZGV2KQorCQlnb3RvIHVua25vd247CisJdGhpcyA9IGRldi0+cHJpdjsKKwlzcGluX2xvY2soJnRoaXMtPmxvY2spOworCXdsMzUwMV9hY2tfaW50ZXJydXB0KHRoaXMpOworCXdsMzUwMV9ibG9ja19pbnRlcnJ1cHQodGhpcyk7CisJd2wzNTAxX3J4X2ludGVycnVwdChkZXYpOworCXdsMzUwMV91bmJsb2NrX2ludGVycnVwdCh0aGlzKTsKKwlzcGluX3VubG9jaygmdGhpcy0+bG9jayk7CitvdXQ6CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit1bmtub3duOgorCWhhbmRsZWQgPSAwOworCXByaW50ayhLRVJOX0VSUiAiJXM6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBfX0ZVTkNUSU9OX18sIGlycSk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX3Jlc2V0X2JvYXJkKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwl1OCB0bXAgPSAwOworCWludCBpLCByYyA9IDA7CisKKwkvKiBDb3Jlc2V0ICovCisJd2wzNTAxX291dGJfcChXTDM1MDFfR0NSX0NPUkVTRVQsIHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfR0NSKTsKKwl3bDM1MDFfb3V0Yl9wKDAsIHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfR0NSKTsKKwl3bDM1MDFfb3V0Yl9wKFdMMzUwMV9HQ1JfQ09SRVNFVCwgdGhpcy0+YmFzZV9hZGRyICsgV0wzNTAxX05JQ19HQ1IpOworCisJLyogUmVzZXQgU1JBTSAweDQ4MCB0byB6ZXJvICovCisJd2wzNTAxX3NldF90b193bGEodGhpcywgMHg0ODAsICZ0bXAsIHNpemVvZih0bXApKTsKKworCS8qIFN0YXJ0IHVwICovCisJd2wzNTAxX291dGJfcCgwLCB0aGlzLT5iYXNlX2FkZHIgKyBXTDM1MDFfTklDX0dDUik7CisKKwlXTDM1MDFfTk9QTE9PUCgxMDI0ICogNTApOworCisJd2wzNTAxX3VuYmxvY2tfaW50ZXJydXB0KHRoaXMpOwkvKiBhY21lOiB3YXMgY29tbWVudGVkICovCisKKwkvKiBQb2xsaW5nIFNlbGZfVGVzdF9TdGF0dXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgeworCQl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIDB4NDgwLCAmdG1wLCBzaXplb2YodG1wKSk7CisKKwkJaWYgKHRtcCA9PSAnVycpIHsKKwkJCS8qIGZpcm13YXJlIGNvbXBsZXRlIGFsbCB0ZXN0IHN1Y2Nlc3NmdWxseSAqLworCQkJdG1wID0gJ0EnOworCQkJd2wzNTAxX3NldF90b193bGEodGhpcywgMHg0ODAsICZ0bXAsIHNpemVvZih0bXApKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCVdMMzUwMV9OT1BMT09QKDEwKTsKKwl9CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZhaWxlZCB0byByZXNldCB0aGUgYm9hcmQhXG4iLCBfX0ZVTkNUSU9OX18pOworCXJjID0gLUVOT0RFVjsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2luaXRfZmlybXdhcmUoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXUxNiBwdHIsIG5leHQ7CisJaW50IHJjID0gd2wzNTAxX3Jlc2V0X2JvYXJkKHRoaXMpOworCisJaWYgKHJjKQorCQlnb3RvIGZhaWw7CisJdGhpcy0+Y2FyZF9uYW1lWzBdID0gJ1wwJzsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIDB4MWEwMCwKKwkJCSAgICB0aGlzLT5jYXJkX25hbWUsIHNpemVvZih0aGlzLT5jYXJkX25hbWUpKTsKKwl0aGlzLT5jYXJkX25hbWVbc2l6ZW9mKHRoaXMtPmNhcmRfbmFtZSkgLSAxXSA9ICdcMCc7CisJdGhpcy0+ZmlybXdhcmVfZGF0ZVswXSA9ICdcMCc7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCAweDFhNDAsCisJCQkgICAgdGhpcy0+ZmlybXdhcmVfZGF0ZSwgc2l6ZW9mKHRoaXMtPmZpcm13YXJlX2RhdGUpKTsKKwl0aGlzLT5maXJtd2FyZV9kYXRlW3NpemVvZih0aGlzLT5maXJtd2FyZV9kYXRlKSAtIDFdID0gJ1wwJzsKKwkvKiBTd2l0Y2ggdG8gU1JBTSBQYWdlIDAgKi8KKwl3bDM1MDFfc3dpdGNoX3BhZ2UodGhpcywgV0wzNTAxX0JTU19TUEFHRTApOworCS8qIFJlYWQgcGFyYW1ldGVyIGZyb20gY2FyZCAqLworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgMHg0ODIsICZ0aGlzLT5lc2JxX3JlcV9zdGFydCwgMik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCAweDQ4NiwgJnRoaXMtPmVzYnFfcmVxX2VuZCwgMik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCAweDQ4OCwgJnRoaXMtPmVzYnFfY29uZmlybV9zdGFydCwgMik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCAweDQ4YywgJnRoaXMtPmVzYnFfY29uZmlybV9lbmQsIDIpOworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgMHg0OGUsICZ0aGlzLT50eF9idWZmZXJfaGVhZCwgMik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCAweDQ5MiwgJnRoaXMtPnR4X2J1ZmZlcl9zaXplLCAyKTsKKwl0aGlzLT5lc2JxX3JlcV90YWlsCT0gdGhpcy0+ZXNicV9yZXFfaGVhZCA9IHRoaXMtPmVzYnFfcmVxX3N0YXJ0OworCXRoaXMtPmVzYnFfcmVxX2VuZCAgICAgKz0gdGhpcy0+ZXNicV9yZXFfc3RhcnQ7CisJdGhpcy0+ZXNicV9jb25maXJtCT0gdGhpcy0+ZXNicV9jb25maXJtX3N0YXJ0OworCXRoaXMtPmVzYnFfY29uZmlybV9lbmQgKz0gdGhpcy0+ZXNicV9jb25maXJtX3N0YXJ0OworCS8qIEluaXRpYWwgVHggQnVmZmVyICovCisJdGhpcy0+dHhfYnVmZmVyX2NudCA9IDE7CisJcHRyID0gdGhpcy0+dHhfYnVmZmVyX2hlYWQ7CisJbmV4dCA9IHB0ciArIFdMMzUwMV9CTEtTWjsKKwl3aGlsZSAoKG5leHQgLSB0aGlzLT50eF9idWZmZXJfaGVhZCkgPCB0aGlzLT50eF9idWZmZXJfc2l6ZSkgeworCQl0aGlzLT50eF9idWZmZXJfY250Kys7CisJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsIHB0ciwgJm5leHQsIHNpemVvZihuZXh0KSk7CisJCXB0ciA9IG5leHQ7CisJCW5leHQgPSBwdHIgKyBXTDM1MDFfQkxLU1o7CisJfQorCXJjID0gMDsKKwluZXh0ID0gMDsKKwl3bDM1MDFfc2V0X3RvX3dsYSh0aGlzLCBwdHIsICZuZXh0LCBzaXplb2YobmV4dCkpOworCXRoaXMtPnR4X2J1ZmZlcl90YWlsID0gcHRyOworb3V0OgorCXJldHVybiByYzsKK2ZhaWw6CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCWludCByYyA9IC1FTk9ERVY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlkZXZfbGlua190ICpsaW5rOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwkvKiBDaGVjayBpZiB0aGUgZGV2aWNlIGlzIGluIHdsMzUwMV9kZXZfbGlzdCAqLworCWZvciAobGluayA9IHdsMzUwMV9kZXZfbGlzdDsgbGluazsgbGluayA9IGxpbmstPm5leHQpCisJCWlmIChsaW5rLT5wcml2ID09IGRldikKKwkJCWJyZWFrOworCWlmICghbGluaykKKwkJZ290byBvdXQ7CisJbGluay0+b3Blbi0tOworCisJLyogU3RvcCB3bDM1MDFfaGFyZF9zdGFydF94bWl0KCkgZnJvbSBub3cgb24gKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJd2wzNTAxX2Fja19pbnRlcnJ1cHQodGhpcyk7CisKKwkvKiBNYXNrIGludGVycnVwdHMgZnJvbSB0aGUgU1VUUk8gKi8KKwl3bDM1MDFfYmxvY2tfaW50ZXJydXB0KHRoaXMpOworCisJcmMgPSAwOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBXTDM1MDEgY2xvc2VkXG4iLCBkZXYtPm5hbWUpOworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogd2wzNTAxX3Jlc2V0IC0gUmVzZXQgdGhlIFNVVFJPLgorICogQGRldiAtIG5ldHdvcmsgZGV2aWNlCisgKgorICogSXQgaXMgYWxtb3N0IHRoZSBzYW1lIGFzIHdsMzUwMV9vcGVuKCkuIEluIGZhY3QsIHdlIG1heSBqdXN0IHdsMzUwMV9jbG9zZSgpCisgKiBhbmQgd2wzNTAxX29wZW4oKSBhZ2FpbiwgYnV0IEkgd291bGRuJ3QgbGlrZSB0byBmcmVlX2lycSgpIHdoZW4gdGhlIGRyaXZlcgorICogaXMgcnVubmluZy4gSXQgc2VlbXMgdG8gYmUgZGFuZ2Vyb3VzLgorICovCitzdGF0aWMgaW50IHdsMzUwMV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlpbnQgcmMgPSAtRU5PREVWOworCisJd2wzNTAxX2Jsb2NrX2ludGVycnVwdCh0aGlzKTsKKworCWlmICh3bDM1MDFfaW5pdF9maXJtd2FyZSh0aGlzKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2FuJ3QgaW5pdGlhbGl6ZSBGaXJtd2FyZSFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQkvKiBGcmVlIElSUSwgYW5kIG1hcmsgSVJRIGFzIHVudXNlZCAqLworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBRdWV1ZSBoYXMgdG8gYmUgc3RhcnRlZCBvbmx5IHdoZW4gdGhlIENhcmQgaXMgU3RhcnRlZAorCSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl0aGlzLT5hZGhvY190aW1lcyA9IDA7CisJd2wzNTAxX2Fja19pbnRlcnJ1cHQodGhpcyk7CisJd2wzNTAxX3VuYmxvY2tfaW50ZXJydXB0KHRoaXMpOworCXdsMzUwMV9tZ210X3NjYW4odGhpcywgMTAwKTsKKwlkcHJpbnRrKDEsICIlczogZGV2aWNlIHJlc2V0IiwgZGV2LT5uYW1lKTsKKwlyYyA9IDA7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCB3bDM1MDFfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmdGhpcy0+c3RhdHM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlzdGF0cy0+dHhfZXJyb3JzKys7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwlyYyA9IHdsMzUwMV9yZXNldChkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwlpZiAocmMpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHJlc2V0dGluZyBjYXJkIG9uIFR4IHRpbWVvdXQhXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCByYyk7CisJZWxzZSB7CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorfQorCisvKgorICogUmV0dXJuIDogMCAtIE9LCisgKgkgICAgMSAtIENvdWxkIG5vdCB0cmFuc21pdCAoZGV2X3F1ZXVlX3htaXQgd2lsbCBxdWV1ZSBpdCkKKyAqCQlhbmQgdHJ5IHRvIHNlbnQgaXQgbGF0ZXIKKyAqLworc3RhdGljIGludCB3bDM1MDFfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGVuYWJsZWQsIHJjOworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwllbmFibGVkID0gd2wzNTAxX2Jsb2NrX2ludGVycnVwdCh0aGlzKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlyYyA9IHdsMzUwMV9zZW5kX3BrdCh0aGlzLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlpZiAoZW5hYmxlZCkKKwkJd2wzNTAxX3VuYmxvY2tfaW50ZXJydXB0KHRoaXMpOworCWlmIChyYykgeworCQkrK3RoaXMtPnN0YXRzLnR4X2Ryb3BwZWQ7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl9IGVsc2UgeworCQkrK3RoaXMtPnN0YXRzLnR4X3BhY2tldHM7CisJCXRoaXMtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQlrZnJlZV9za2Ioc2tiKTsKKworCQlpZiAodGhpcy0+dHhfYnVmZmVyX2NudCA8IDIpCisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmMgPSAtRU5PREVWOworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWRldl9saW5rX3QgKmxpbms7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGhpcy0+bG9jaywgZmxhZ3MpOworCS8qIENoZWNrIGlmIHRoZSBkZXZpY2UgaXMgaW4gd2wzNTAxX2Rldl9saXN0ICovCisJZm9yIChsaW5rID0gd2wzNTAxX2Rldl9saXN0OyBsaW5rOyBsaW5rID0gbGluay0+bmV4dCkKKwkJaWYgKGxpbmstPnByaXYgPT0gZGV2KQorCQkJYnJlYWs7CisJaWYgKCFERVZfT0sobGluaykpCisJCWdvdG8gb3V0OworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwlsaW5rLT5vcGVuKys7CisKKwkvKiBJbml0aWFsIFdMMzUwMSBmaXJtd2FyZSAqLworCWRwcmludGsoMSwgIiVzOiBJbml0aWFsaXplIFdMMzUwMSBmaXJtd2FyZS4uLiIsIGRldi0+bmFtZSk7CisJaWYgKHdsMzUwMV9pbml0X2Zpcm13YXJlKHRoaXMpKQorCQlnb3RvIGZhaWw7CisJLyogSW5pdGlhbCBkZXZpY2UgdmFyaWFibGVzICovCisJdGhpcy0+YWRob2NfdGltZXMgPSAwOworCS8qIEFja25vd2xlZGdlIEludGVycnVwdCwgZm9yIGNsZWFuaW5nIGxhc3Qgc3RhdGUgKi8KKwl3bDM1MDFfYWNrX2ludGVycnVwdCh0aGlzKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHQgZnJvbSBjYXJkIGFmdGVyIGFsbCAqLworCXdsMzUwMV91bmJsb2NrX2ludGVycnVwdCh0aGlzKTsKKwl3bDM1MDFfbWdtdF9zY2FuKHRoaXMsIDEwMCk7CisJcmMgPSAwOworCWRwcmludGsoMSwgIiVzOiBXTDM1MDEgb3BlbmVkIiwgZGV2LT5uYW1lKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogQ2FyZCBOYW1lOiAlc1xuIgorCQkJICIlczogRmlybXdhcmUgRGF0ZTogJXNcbiIsCisJCQkgZGV2LT5uYW1lLCB0aGlzLT5jYXJkX25hbWUsCisJCQkgZGV2LT5uYW1lLCB0aGlzLT5maXJtd2FyZV9kYXRlKTsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJjOworZmFpbDoKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2FuJ3QgaW5pdGlhbGl6ZSBmaXJtd2FyZSFcbiIsIGRldi0+bmFtZSk7CisJZ290byBvdXQ7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp3bDM1MDFfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCisJcmV0dXJuICZ0aGlzLT5zdGF0czsKK30KKworc3RydWN0IGl3X3N0YXRpc3RpY3MgKndsMzUwMV9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisJc3RydWN0IGl3X3N0YXRpc3RpY3MgKndzdGF0cyA9ICZ0aGlzLT53c3RhdHM7CisJdTMyIHZhbHVlOyAvKiBzaXplIGNoZWNrZWQ6IGl0IGlzIHUzMiAqLworCisJbWVtc2V0KHdzdGF0cywgMCwgc2l6ZW9mKCp3c3RhdHMpKTsKKwl3c3RhdHMtPnN0YXR1cyA9IG5ldGlmX3J1bm5pbmcoZGV2KTsKKwlpZiAoIXdsMzUwMV9nZXRfbWliX3ZhbHVlKHRoaXMsIFdMMzUwMV9NSUJfQVRUUl9XRVBfSUNWX0VSUk9SX0NPVU5ULAorCQkJCSAgJnZhbHVlLCBzaXplb2YodmFsdWUpKSkKKwkJd3N0YXRzLT5kaXNjYXJkLmNvZGUgKz0gdmFsdWU7CisJaWYgKCF3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLCBXTDM1MDFfTUlCX0FUVFJfV0VQX1VOREVDUllQVEFCTEVfQ09VTlQsCisJCQkJICAmdmFsdWUsIHNpemVvZih2YWx1ZSkpKQorCQl3c3RhdHMtPmRpc2NhcmQuY29kZSArPSB2YWx1ZTsKKwlpZiAoIXdsMzUwMV9nZXRfbWliX3ZhbHVlKHRoaXMsIFdMMzUwMV9NSUJfQVRUUl9XRVBfRVhDTFVERURfQ09VTlQsCisJCQkJICAmdmFsdWUsIHNpemVvZih2YWx1ZSkpKQorCQl3c3RhdHMtPmRpc2NhcmQuY29kZSArPSB2YWx1ZTsKKwlpZiAoIXdsMzUwMV9nZXRfbWliX3ZhbHVlKHRoaXMsIFdMMzUwMV9NSUJfQVRUUl9SRVRSWV9DT1VOVCwKKwkJCQkgICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSkpCisJCXdzdGF0cy0+ZGlzY2FyZC5yZXRyaWVzCT0gdmFsdWU7CisJaWYgKCF3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLCBXTDM1MDFfTUlCX0FUVFJfRkFJTEVEX0NPVU5ULAorCQkJCSAgJnZhbHVlLCBzaXplb2YodmFsdWUpKSkKKwkJd3N0YXRzLT5kaXNjYXJkLm1pc2MgKz0gdmFsdWU7CisJaWYgKCF3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLCBXTDM1MDFfTUlCX0FUVFJfUlRTX0ZBSUxVUkVfQ09VTlQsCisJCQkJICAmdmFsdWUsIHNpemVvZih2YWx1ZSkpKQorCQl3c3RhdHMtPmRpc2NhcmQubWlzYyArPSB2YWx1ZTsKKwlpZiAoIXdsMzUwMV9nZXRfbWliX3ZhbHVlKHRoaXMsIFdMMzUwMV9NSUJfQVRUUl9BQ0tfRkFJTFVSRV9DT1VOVCwKKwkJCQkgICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSkpCisJCXdzdGF0cy0+ZGlzY2FyZC5taXNjICs9IHZhbHVlOworCWlmICghd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywgV0wzNTAxX01JQl9BVFRSX0ZSQU1FX0RVUExJQ0FURV9DT1VOVCwKKwkJCQkgICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSkpCisJCXdzdGF0cy0+ZGlzY2FyZC5taXNjICs9IHZhbHVlOworCXJldHVybiB3c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIHdsMzUwMV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCB3bDM1MDFfZGV2X2luZm8sIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBvcHMgPSB7CisJLmdldF9kcnZpbmZvID0gd2wzNTAxX2dldF9kcnZpbmZvCit9OworCisvKioKKyAqIHdsMzUwMV9kZXRhY2ggLSBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIKKyAqIEBsaW5rIC0gRklMTF9JTgorICoKKyAqIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQgd2l0aCBDYXJkCisgKiBTZXJ2aWNlcy4gSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgYXJlIGZyZWVkLgorICogT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGZyZWVkIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KKyAqLworc3RhdGljIHZvaWQgd2wzNTAxX2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworCWRldl9saW5rX3QgKipsaW5rcDsKKworCS8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisJZm9yIChsaW5rcCA9ICZ3bDM1MDFfZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJCWlmICgqbGlua3AgPT0gbGluaykKKwkJCWJyZWFrOworCWlmICghKmxpbmtwKQorCQlnb3RvIG91dDsKKworCS8qIElmIHRoZSBkZXZpY2UgaXMgY3VycmVudGx5IGNvbmZpZ3VyZWQgYW5kIGFjdGl2ZSwgd2Ugd29uJ3QgYWN0dWFsbHkKKwkgKiBkZWxldGUgaXQgeWV0LiAgSW5zdGVhZCwgaXQgaXMgbWFya2VkIHNvIHRoYXQgd2hlbiB0aGUgcmVsZWFzZSgpCisJICogZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGF0IHdpbGwgdHJpZ2dlciBhIHByb3BlciBkZXRhY2goKS4gKi8KKworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKyNpZmRlZiBQQ01DSUFfREVCVUcKKwkJcHJpbnRrKEtFUk5fREVCVUcgIndsMzUwMV9jczogZGV0YWNoIHBvc3Rwb25lZCwgJyVzJyAiCisJCSAgICAgICAic3RpbGwgbG9ja2VkXG4iLCBsaW5rLT5kZXYtPmRldl9uYW1lKTsKKyNlbmRpZgorCQlnb3RvIG91dDsKKwl9CisKKwkvKiBCcmVhayB0aGUgbGluayB3aXRoIENhcmQgU2VydmljZXMgKi8KKwlpZiAobGluay0+aGFuZGxlKQorCQlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKworCS8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIHBpZWNlcyAqLworCSpsaW5rcCA9IGxpbmstPm5leHQ7CisKKwlpZiAobGluay0+cHJpdikKKwkJZnJlZV9uZXRkZXYobGluay0+cHJpdik7CisJa2ZyZWUobGluayk7CitvdXQ6CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RybGNweSh3cnF1LT5uYW1lLCAiSUVFRSA4MDIuMTEtRFMiLCBzaXplb2Yod3JxdS0+bmFtZSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9zZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCWludCBjaGFubmVsID0gd3JxdS0+ZnJlcS5tOworCWludCByYyA9IC1FSU5WQUw7CisKKwlpZiAoaXdfdmFsaWRfY2hhbm5lbCh0aGlzLT5yZWdfZG9tYWluLCBjaGFubmVsKSkgeworCQl0aGlzLT5jaGFuID0gY2hhbm5lbDsKKwkJcmMgPSB3bDM1MDFfcmVzZXQoZGV2KTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9nZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCisJd3JxdS0+ZnJlcS5tID0gd2wzNTAxX2NoYW4yZnJlcVt0aGlzLT5jaGFuIC0gMV0gKiAxMDAwMDA7CisJd3JxdS0+ZnJlcS5lID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bDM1MDFfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByYyA9IC1FSU5WQUw7CisKKwlpZiAod3JxdS0+bW9kZSA9PSBJV19NT0RFX0lORlJBIHx8CisJICAgIHdycXUtPm1vZGUgPT0gSVdfTU9ERV9BREhPQyB8fAorCSAgICB3cnF1LT5tb2RlID09IElXX01PREVfQVVUTykgeworCQlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisKKwkJdGhpcy0+bmV0X3R5cGUgPSB3cnF1LT5tb2RlOworCQlyYyA9IHdsMzUwMV9yZXNldChkZXYpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisKKwl3cnF1LT5tb2RlID0gdGhpcy0+bmV0X3R5cGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisKKwl3cnF1LT5zZW5zLnZhbHVlID0gdGhpcy0+cnNzaTsKKwl3cnF1LT5zZW5zLmRpc2FibGVkID0gIXdycXUtPnNlbnMudmFsdWU7CisJd3JxdS0+c2Vucy5maXhlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKilleHRyYTsKKworCS8qIFNldCB0aGUgbGVuZ3RoICh2ZXJ5IGltcG9ydGFudCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkgKi8KKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHNpemVvZigqcmFuZ2UpOworCisJLyogU2V0IGFsbCB0aGUgaW5mbyB3ZSBkb24ndCBjYXJlIG9yIGRvbid0IGtub3cgYWJvdXQgdG8gemVybyAqLworCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKCpyYW5nZSkpOworCisJLyogU2V0IHRoZSBXaXJlbGVzcyBFeHRlbnNpb24gdmVyc2lvbnMgKi8KKwlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZAk9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UJPSAxOworCXJhbmdlLT50aHJvdWdocHV0CQk9IDIgKiAxMDAwICogMTAwMDsgICAgIC8qIH4yIE1iL3MgKi8KKwkvKiBGSVhNRTogc3R1ZHkgdGhlIGNvZGUgdG8gZmlsbCBpbiBtb3JlIGZpZWxkcy4uLiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9zZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlzdGF0aWMgY29uc3QgdTggYmNhc3RbRVRIX0FMRU5dID0geyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH07CisJaW50IHJjID0gLUVJTlZBTDsKKworCS8qIEZJWE1FOiB3ZSBzdXBwb3J0IG90aGVyIEFSUEhSRHMuLi4qLworCWlmICh3cnF1LT5hcF9hZGRyLnNhX2ZhbWlseSAhPSBBUlBIUkRfRVRIRVIpCisJCWdvdG8gb3V0OworCWlmICghbWVtY21wKGJjYXN0LCB3cnF1LT5hcF9hZGRyLnNhX2RhdGEsIEVUSF9BTEVOKSkgeworCQkvKiBGSVhNRTogcmVzY2FuPyAqLworCX0gZWxzZQorCQltZW1jcHkodGhpcy0+YnNzaWQsIHdycXUtPmFwX2FkZHIuc2FfZGF0YSwgRVRIX0FMRU4pOworCQkvKiBGSVhNRTogcmVzY2FuPyBkZWFzc29jICYgc2Nhbj8gKi8KKwlyYyA9IDA7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9nZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKworCXdycXUtPmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCW1lbWNweSh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsIHRoaXMtPmJzc2lkLCBFVEhfQUxFTik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX3NldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwkvKgorCSAqIEZJWE1FOiB0cmlnZ2VyIHNjYW5uaW5nIHdpdGggYSByZXNldCwgeWVzLCBJJ20gbGF6eQorCSAqLworCXJldHVybiB3bDM1MDFfcmVzZXQoZGV2KTsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKwljaGFyICpjdXJyZW50X2V2ID0gZXh0cmE7CisJc3RydWN0IGl3X2V2ZW50IGl3ZTsKKworCWZvciAoaSA9IDA7IGkgPCB0aGlzLT5ic3NfY250OyArK2kpIHsKKwkJaXdlLmNtZAkJCT0gU0lPQ0dJV0FQOworCQlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgdGhpcy0+YnNzX3NldFtpXS5ic3NpZCwgRVRIX0FMRU4pOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwKKwkJCQkJCSAgZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLAorCQkJCQkJICAmaXdlLCBJV19FVl9BRERSX0xFTik7CisJCWl3ZS5jbWQJCSAgPSBTSU9DR0lXRVNTSUQ7CisJCWl3ZS51LmRhdGEuZmxhZ3MgID0gMTsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSB0aGlzLT5ic3Nfc2V0W2ldLnNzaWQuZWwubGVuOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwKKwkJCQkJCSAgZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLAorCQkJCQkJICAmaXdlLAorCQkJCQkJICB0aGlzLT5ic3Nfc2V0W2ldLnNzaWQuZXNzaWQpOworCQlpd2UuY21kCSAgID0gU0lPQ0dJV01PREU7CisJCWl3ZS51Lm1vZGUgPSB0aGlzLT5ic3Nfc2V0W2ldLmJzc190eXBlOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwKKwkJCQkJCSAgZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLAorCQkJCQkJICAmaXdlLCBJV19FVl9VSU5UX0xFTik7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKwkJaXdlLnUuZnJlcS5tID0gdGhpcy0+YnNzX3NldFtpXS5kc19wc2V0LmNoYW47CisJCWl3ZS51LmZyZXEuZSA9IDA7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LAorCQkJCQkJICBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsCisJCQkJCQkgICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdFTkNPREU7CisJCWlmICh0aGlzLT5ic3Nfc2V0W2ldLmNhcF9pbmZvICYgV0wzNTAxX01HTVRfQ0FQQUJJTElUWV9QUklWQUNZKQorCQkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOworCQllbHNlCisJCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IDA7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChjdXJyZW50X2V2LAorCQkJCQkJICBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsCisJCQkJCQkgICZpd2UsIE5VTEwpOworCX0KKwkvKiBMZW5ndGggb2YgZGF0YSAqLworCXdycXUtPmRhdGEubGVuZ3RoID0gKGN1cnJlbnRfZXYgLSBleHRyYSk7CisJd3JxdS0+ZGF0YS5mbGFncyA9IDA7IC8qIEZJWE1FOiBzZXQgcHJvcGVybHkgdGhlc2UgZmxhZ3MgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bDM1MDFfc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisKKwlpZiAod3JxdS0+ZGF0YS5mbGFncykgeworCQlpd19zZXRfbWdtdF9pbmZvX2VsZW1lbnQoSVdfTUdNVF9JTkZPX0VMRU1FTlRfU1NJRCwKKwkJCQkJICZ0aGlzLT5lc3NpZC5lbCwKKwkJCQkJIGV4dHJhLCB3cnF1LT5kYXRhLmxlbmd0aCk7CisJfSBlbHNlIHsgLyogV2UgYWNjZXB0IGFueSBFU1NJRCAqLworCQlpd19zZXRfbWdtdF9pbmZvX2VsZW1lbnQoSVdfTUdNVF9JTkZPX0VMRU1FTlRfU1NJRCwKKwkJCQkJICZ0aGlzLT5lc3NpZC5lbCwgIkFOWSIsIDMpOworCX0KKwlyZXR1cm4gd2wzNTAxX3Jlc2V0KGRldik7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGhpcy0+bG9jaywgZmxhZ3MpOworCXdycXUtPmVzc2lkLmZsYWdzICA9IDE7CisJd3JxdS0+ZXNzaWQubGVuZ3RoID0gdGhpcy0+ZXNzaWQuZWwubGVuOworCW1lbWNweShleHRyYSwgdGhpcy0+ZXNzaWQuZXNzaWQsIHRoaXMtPmVzc2lkLmVsLmxlbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhpcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9zZXRfbmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCisJaWYgKHdycXUtPmRhdGEubGVuZ3RoID4gc2l6ZW9mKHRoaXMtPm5pY2spKQorCQlyZXR1cm4gLUUyQklHOworCXN0cmxjcHkodGhpcy0+bmljaywgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X25pY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKworCXN0cmxjcHkoZXh0cmEsIHRoaXMtPm5pY2ssIDMyKTsKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHN0cmxlbihleHRyYSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwkvKgorCSAqIEZJWE1FOiBoYXZlIHRvIHNlZSBmcm9tIHdoZXJlIHRvIGdldCB0aGlzIGluZm8sIHBlcmhhcHMgdGhpcyBjYXJkCisJICogd29ya3MgYXQgMSBNYml0L3MgdG9vLi4uIGZvciBub3cgbGVhdmUgYXQgMiBNYml0L3MgdGhhdCBpcyB0aGUgbW9zdAorCSAqIGNvbW1vbiB3aXRoIHRoZSBQbGFuZXQgQWNjZXNzIFBvaW50cy4gLWFjbWUKKwkgKi8KKwl3cnF1LT5iaXRyYXRlLnZhbHVlID0gMjAwMDAwMDsKKwl3cnF1LT5iaXRyYXRlLmZpeGVkID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X3J0c190aHJlc2hvbGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJdTE2IHRocmVzaG9sZDsgLyogc2l6ZSBjaGVja2VkOiBpdCBpcyB1MTYgKi8KKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisJaW50IHJjID0gd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywgV0wzNTAxX01JQl9BVFRSX1JUU19USFJFU0hPTEQsCisJCQkJICAgICAgJnRocmVzaG9sZCwgc2l6ZW9mKHRocmVzaG9sZCkpOworCWlmICghcmMpIHsKKwkJd3JxdS0+cnRzLnZhbHVlID0gdGhyZXNob2xkOworCQl3cnF1LT5ydHMuZGlzYWJsZWQgPSB0aHJlc2hvbGQgPj0gMjM0NzsKKwkJd3JxdS0+cnRzLmZpeGVkID0gMTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9nZXRfZnJhZ190aHJlc2hvbGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwl1MTYgdGhyZXNob2xkOyAvKiBzaXplIGNoZWNrZWQ6IGl0IGlzIHUxNiAqLworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlpbnQgcmMgPSB3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLCBXTDM1MDFfTUlCX0FUVFJfRlJBR19USFJFU0hPTEQsCisJCQkJICAgICAgJnRocmVzaG9sZCwgc2l6ZW9mKHRocmVzaG9sZCkpOworCWlmICghcmMpIHsKKwkJd3JxdS0+ZnJhZy52YWx1ZSA9IHRocmVzaG9sZDsKKwkJd3JxdS0+ZnJhZy5kaXNhYmxlZCA9IHRocmVzaG9sZCA+PSAyMzQ2OworCQl3cnF1LT5mcmFnLmZpeGVkID0gMTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9nZXRfdHhwb3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXUxNiB0eHBvdzsKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisJaW50IHJjID0gd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywKKwkJCQkgICAgICBXTDM1MDFfTUlCX0FUVFJfQ1VSUkVOVF9UWF9QV1JfTEVWRUwsCisJCQkJICAgICAgJnR4cG93LCBzaXplb2YodHhwb3cpKTsKKwlpZiAoIXJjKSB7CisJCXdycXUtPnR4cG93ZXIudmFsdWUgPSB0eHBvdzsKKwkJd3JxdS0+dHhwb3dlci5kaXNhYmxlZCA9IDA7CisJCS8qCisJCSAqIEZyb20gdGhlIE1JQiB2YWx1ZXMgSSB0aGluayB0aGlzIGNhbiBiZSBjb25maWd1cmFibGUsCisJCSAqIGFzIGl0IGxpc3RzIHNldmVyYWwgdHggcG93ZXIgbGV2ZWxzIC1hY21lCisJCSAqLworCQl3cnF1LT50eHBvd2VyLmZpeGVkID0gMDsKKwkJd3JxdS0+dHhwb3dlci5mbGFncyA9IElXX1RYUE9XX01XQVRUOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJdTggcmV0cnk7IC8qIHNpemUgY2hlY2tlZDogaXQgaXMgdTggKi8KKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisJaW50IHJjID0gd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywKKwkJCQkgICAgICBXTDM1MDFfTUlCX0FUVFJfTE9OR19SRVRSWV9MSU1JVCwKKwkJCQkgICAgICAmcmV0cnksIHNpemVvZihyZXRyeSkpOworCWlmIChyYykKKwkJZ290byBvdXQ7CisJaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTUFYKSB7CisJCXdycXUtPnJldHJ5LmZsYWdzID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9NQVg7CisJCWdvdG8gc2V0X3ZhbHVlOworCX0KKwlyYyA9IHdsMzUwMV9nZXRfbWliX3ZhbHVlKHRoaXMsIFdMMzUwMV9NSUJfQVRUUl9TSE9SVF9SRVRSWV9MSU1JVCwKKwkJCQkgICZyZXRyeSwgc2l6ZW9mKHJldHJ5KSk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwl3cnF1LT5yZXRyeS5mbGFncyA9IElXX1JFVFJZX0xJTUlUIHwgSVdfUkVUUllfTUlOOworc2V0X3ZhbHVlOgorCXdycXUtPnJldHJ5LnZhbHVlID0gcmV0cnk7CisJd3JxdS0+cmV0cnkuZGlzYWJsZWQgPSAwOworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwl1OCBpbXBsZW1lbnRlZCwgcmVzdHJpY3RlZCwga2V5c1sxMDBdLCBsZW5fa2V5cywgdG9jb3B5OworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlpbnQgcmMgPSB3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLAorCQkJCSAgICAgIFdMMzUwMV9NSUJfQVRUUl9QUklWX09QVF9JTVBMRU1FTlRFRCwKKwkJCQkgICAgICAmaW1wbGVtZW50ZWQsIHNpemVvZihpbXBsZW1lbnRlZCkpOworCWlmIChyYykKKwkJZ290byBvdXQ7CisJaWYgKCFpbXBsZW1lbnRlZCkgeworCQl3cnF1LT5lbmNvZGluZy5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJZ290byBvdXQ7CisJfQorCXJjID0gd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywgV0wzNTAxX01JQl9BVFRSX0VYQ0xVREVfVU5FTkNSWVBURUQsCisJCQkJICAmcmVzdHJpY3RlZCwgc2l6ZW9mKHJlc3RyaWN0ZWQpKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCXdycXUtPmVuY29kaW5nLmZsYWdzID0gcmVzdHJpY3RlZCA/IElXX0VOQ09ERV9SRVNUUklDVEVEIDoKKwkJCQkJICAgIElXX0VOQ09ERV9PUEVOOworCXJjID0gd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywgV0wzNTAxX01JQl9BVFRSX1dFUF9LRVlfTUFQUElOR1NfTEVOLAorCQkJCSAgJmxlbl9rZXlzLCBzaXplb2YobGVuX2tleXMpKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCXJjID0gd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywgV0wzNTAxX01JQl9BVFRSX1dFUF9LRVlfTUFQUElOR1MsCisJCQkJICBrZXlzLCBsZW5fa2V5cyk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwl0b2NvcHkgPSBtaW5fdCh1OCwgbGVuX2tleXMsIHdycXUtPmVuY29kaW5nLmxlbmd0aCk7CisJdG9jb3B5ID0gbWluX3QodTgsIHRvY29weSwgMTAwKTsKKwl3cnF1LT5lbmNvZGluZy5sZW5ndGggPSB0b2NvcHk7CisJbWVtc2V0KGV4dHJhLCAwLCB0b2NvcHkpOworCW1lbWNweShleHRyYSwga2V5cywgdG9jb3B5KTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJdTggcHdyX3N0YXRlOworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlpbnQgcmMgPSB3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLAorCQkJCSAgICAgIFdMMzUwMV9NSUJfQVRUUl9DVVJSRU5UX1BXUl9TVEFURSwKKwkJCQkgICAgICAmcHdyX3N0YXRlLCBzaXplb2YocHdyX3N0YXRlKSk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwl3cnF1LT5wb3dlci5kaXNhYmxlZCA9ICFwd3Jfc3RhdGU7CisJd3JxdS0+cG93ZXIuZmxhZ3MgPSBJV19QT1dFUl9PTjsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyCXdsMzUwMV9oYW5kbGVyW10gPSB7CisJW1NJT0NHSVdOQU1FCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX2dldF9uYW1lLAorCVtTSU9DU0lXRlJFUQktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9zZXRfZnJlcSwKKwlbU0lPQ0dJV0ZSRVEJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X2ZyZXEsCisJW1NJT0NTSVdNT0RFCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX3NldF9tb2RlLAorCVtTSU9DR0lXTU9ERQktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9nZXRfbW9kZSwKKwlbU0lPQ0dJV1NFTlMJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X3NlbnMsCisJW1NJT0NHSVdSQU5HRQktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9nZXRfcmFuZ2UsCisJW1NJT0NTSVdTUFkJLSBTSU9DSVdGSVJTVF0gPSBpd19oYW5kbGVyX3NldF9zcHksCisJW1NJT0NHSVdTUFkJLSBTSU9DSVdGSVJTVF0gPSBpd19oYW5kbGVyX2dldF9zcHksCisJW1NJT0NTSVdUSFJTUFkJLSBTSU9DSVdGSVJTVF0gPSBpd19oYW5kbGVyX3NldF90aHJzcHksCisJW1NJT0NHSVdUSFJTUFkJLSBTSU9DSVdGSVJTVF0gPSBpd19oYW5kbGVyX2dldF90aHJzcHksCisJW1NJT0NTSVdBUAktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9zZXRfd2FwLAorCVtTSU9DR0lXQVAJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X3dhcCwKKwlbU0lPQ1NJV1NDQU4JLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfc2V0X3NjYW4sCisJW1NJT0NHSVdTQ0FOCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX2dldF9zY2FuLAorCVtTSU9DU0lXRVNTSUQJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfc2V0X2Vzc2lkLAorCVtTSU9DR0lXRVNTSUQJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X2Vzc2lkLAorCVtTSU9DU0lXTklDS04JLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfc2V0X25pY2ssCisJW1NJT0NHSVdOSUNLTgktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9nZXRfbmljaywKKwlbU0lPQ0dJV1JBVEUJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X3JhdGUsCisJW1NJT0NHSVdSVFMJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X3J0c190aHJlc2hvbGQsCisJW1NJT0NHSVdGUkFHCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX2dldF9mcmFnX3RocmVzaG9sZCwKKwlbU0lPQ0dJV1RYUE9XCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX2dldF90eHBvdywKKwlbU0lPQ0dJV1JFVFJZCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX2dldF9yZXRyeSwKKwlbU0lPQ0dJV0VOQ09ERQktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9nZXRfZW5jb2RlLAorCVtTSU9DR0lXUE9XRVIJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X3Bvd2VyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiB3bDM1MDFfaGFuZGxlcl9kZWYgPSB7CisJLm51bV9zdGFuZGFyZAk9IHNpemVvZih3bDM1MDFfaGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCisJLnN0YW5kYXJkCT0gKGl3X2hhbmRsZXIgKil3bDM1MDFfaGFuZGxlciwKKwkuc3B5X29mZnNldAk9IG9mZnNldG9mKHN0cnVjdCB3bDM1MDFfY2FyZCwgc3B5X2RhdGEpLAorfTsKKworLyoqCisgKiB3bDM1MDFfYXR0YWNoIC0gY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIKKyAqCisgKiBDcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZyBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yCisgKiBvbmUgZGV2aWNlLiAgVGhlIGRldmljZSBpcyByZWdpc3RlcmVkIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKyAqCisgKiBUaGUgZGV2X2xpbmsgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkgY29uZmlndXJlIHRoZQorICogY2FyZCBhdCB0aGlzIHBvaW50IC0tIHdlIHdhaXQgdW50aWwgd2UgcmVjZWl2ZSBhIGNhcmQgaW5zZXJ0aW9uIGV2ZW50LgorICovCitzdGF0aWMgZGV2X2xpbmtfdCAqd2wzNTAxX2F0dGFjaCh2b2lkKQoreworCWNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworCWRldl9saW5rX3QgKmxpbms7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgcmV0OworCisJLyogSW5pdGlhbGl6ZSB0aGUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgKi8KKwlsaW5rID0ga21hbGxvYyhzaXplb2YoKmxpbmspLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxpbmspCisJCWdvdG8gb3V0OworCW1lbXNldChsaW5rLCAwLCBzaXplb2Yoc3RydWN0IGRldl9saW5rX3QpKTsKKworCS8qIFRoZSBpbyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIElPIHBvcnQgbWFwcGluZyAqLworCWxpbmstPmlvLk51bVBvcnRzMQk9IDE2OworCWxpbmstPmlvLkF0dHJpYnV0ZXMxCT0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJbGluay0+aW8uSU9BZGRyTGluZXMJPSA1OworCisJLyogSW50ZXJydXB0IHNldHVwICovCisJbGluay0+aXJxLkF0dHJpYnV0ZXMJPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfSEFORExFX1BSRVNFTlQ7CisJbGluay0+aXJxLklSUUluZm8xCT0gSVJRX0xFVkVMX0lEOworCWxpbmstPmlycS5IYW5kbGVyID0gd2wzNTAxX2ludGVycnVwdDsKKworCS8qIEdlbmVyYWwgc29ja2V0IGNvbmZpZ3VyYXRpb24gKi8KKwlsaW5rLT5jb25mLkF0dHJpYnV0ZXMJPSBDT05GX0VOQUJMRV9JUlE7CisJbGluay0+Y29uZi5WY2MJCT0gNTA7CisJbGluay0+Y29uZi5JbnRUeXBlCT0gSU5UX01FTU9SWV9BTkRfSU87CisJbGluay0+Y29uZi5Db25maWdJbmRleAk9IDE7CisJbGluay0+Y29uZi5QcmVzZW50CT0gUFJFU0VOVF9PUFRJT047CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHdsMzUwMV9jYXJkKSk7CisJaWYgKCFkZXYpCisJCWdvdG8gb3V0X2xpbms7CisJZGV2LT5vcGVuCQk9IHdsMzUwMV9vcGVuOworCWRldi0+c3RvcAkJPSB3bDM1MDFfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSB3bDM1MDFfaGFyZF9zdGFydF94bWl0OworCWRldi0+dHhfdGltZW91dAkJPSB3bDM1MDFfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gNSAqIEhaOworCWRldi0+Z2V0X3N0YXRzCQk9IHdsMzUwMV9nZXRfc3RhdHM7CisJZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMgPSB3bDM1MDFfZ2V0X3dpcmVsZXNzX3N0YXRzOworCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMJPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopJndsMzUwMV9oYW5kbGVyX2RlZjsKKwlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmb3BzKTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJbGluay0+cHJpdiA9IGxpbmstPmlycS5JbnN0YW5jZSA9IGRldjsKKworCS8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworCWxpbmstPm5leHQJCSA9IHdsMzUwMV9kZXZfbGlzdDsKKwl3bDM1MDFfZGV2X2xpc3QJCSA9IGxpbms7CisJY2xpZW50X3JlZy5kZXZfaW5mbwkgPSAmd2wzNTAxX2Rldl9pbmZvOworCWNsaWVudF9yZWcuRXZlbnRNYXNrCSA9IENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwKKwkJCQkgICBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8CisJCQkJICAgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJCQkJICAgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKwkJCQkgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwKKwkJCQkgICBDU19FVkVOVF9QTV9SRVNVTUU7CisJY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gd2wzNTAxX2V2ZW50OworCWNsaWVudF9yZWcuVmVyc2lvbgkgPSAweDAyMTA7CisJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKwlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKwlpZiAocmV0KSB7CisJCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisJCXdsMzUwMV9kZXRhY2gobGluayk7CisJCWxpbmsgPSBOVUxMOworCX0KK291dDoKKwlyZXR1cm4gbGluazsKK291dF9saW5rOgorCWtmcmVlKGxpbmspOworCWxpbmsgPSBOVUxMOworCWdvdG8gb3V0OworfQorCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKK2RvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCisKKy8qKgorICogd2wzNTAxX2NvbmZpZyAtIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCBhbmQgbWFrZSBldGggZGV2aWNlIGF2YWlsYWJsZQorICogQGxpbmsgLSBGSUxMX0lOCisgKgorICogd2wzNTAxX2NvbmZpZygpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudCBpcworICogcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlIGV0aGVybmV0IGRldmljZQorICogYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCisgKi8KK3N0YXRpYyB2b2lkIHdsMzUwMV9jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKwl0dXBsZV90IHR1cGxlOworCWNpc3BhcnNlX3QgcGFyc2U7CisJY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKwlpbnQgaSA9IDAsIGosIGxhc3RfZm4sIGxhc3RfcmV0OworCXVuc2lnbmVkIGNoYXIgYmZbNjRdOworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpczsKKworCS8qIFRoaXMgcmVhZHMgdGhlIGNhcmQncyBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMgY29uZmlnIHJlZ2lzdGVycy4gKi8KKwl0dXBsZS5BdHRyaWJ1dGVzCT0gMDsKKwl0dXBsZS5EZXNpcmVkVHVwbGUJPSBDSVNUUExfQ09ORklHOworCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwl0dXBsZS5UdXBsZURhdGEJCT0gYmY7CisJdHVwbGUuVHVwbGVEYXRhTWF4CT0gc2l6ZW9mKGJmKTsKKwl0dXBsZS5UdXBsZU9mZnNldAk9IDA7CisJQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKwlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworCWxpbmstPmNvbmYuQ29uZmlnQmFzZQk9IHBhcnNlLmNvbmZpZy5iYXNlOworCWxpbmstPmNvbmYuUHJlc2VudAk9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKworCS8qIENvbmZpZ3VyZSBjYXJkICovCisJbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKworCS8qIFRyeSBhbGxvY2F0aW5nIElPIHBvcnRzLiAgVGhpcyB0cmllcyBhIGZldyBmaXhlZCBhZGRyZXNzZXMuICBJZiB5b3UKKwkgKiB3YW50LCB5b3UgY2FuIGFsc28gcmVhZCB0aGUgY2FyZCdzIGNvbmZpZyB0YWJsZSB0byBwaWNrIGFkZHJlc3NlcyAtLQorCSAqIHNlZSB0aGUgc2VyaWFsIGRyaXZlciBmb3IgYW4gZXhhbXBsZS4gKi8KKworCWZvciAoaiA9IDB4MjgwOyBqIDwgMHg0MDA7IGogKz0gMHgyMCkgeworCQkvKiBUaGUgJ14weDMwMCcgaXMgc28gdGhhdCB3ZSBwcm9iZSAweDMwMC0weDNmZiBmaXJzdCwgdGhlbgorCQkgKiAweDIwMC0weDJmZiwgYW5kIHNvIG9uLCBiZWNhdXNlIHRoaXMgc2VlbXMgc2FmZXIgKi8KKwkJbGluay0+aW8uQmFzZVBvcnQxID0gajsKKwkJbGluay0+aW8uQmFzZVBvcnQyID0gbGluay0+aW8uQmFzZVBvcnQxICsgMHgxMDsKKwkJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwkJaWYgKGkgPT0gQ1NfU1VDQ0VTUykKKwkJCWJyZWFrOworCX0KKwlpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisJCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVxdWVzdElPLCBpKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJLyogTm93IGFsbG9jYXRlIGFuIGludGVycnVwdCBsaW5lLiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhY3R1YWxseQorCSAqIGFzc2lnbiBhIGhhbmRsZXIgdG8gdGhlIGludGVycnVwdC4gKi8KKworCUNTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpKTsKKworCS8qIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwIHRoZSBJL08KKwkgKiB3aW5kb3dzIGFuZCB0aGUgaW50ZXJydXB0IG1hcHBpbmcuICAqLworCisJQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZikpOworCisJZGV2LT5pcnEgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CisJZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmaGFuZGxlX3RvX2RldihoYW5kbGUpKTsKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJ3bDM1MDFfY3M6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbGVkOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCXRoaXMgPSBkZXYtPnByaXY7CisJLyoKKwkgKiBBdCB0aGlzIHBvaW50LCB0aGUgZGV2X25vZGVfdCBzdHJ1Y3R1cmUocykgc2hvdWxkIGJlIGluaXRpYWxpemVkIGFuZAorCSAqIGFycmFuZ2VkIGluIGEgbGlua2VkIGxpc3QgYXQgbGluay0+ZGV2LgorCSAqLworCWxpbmstPmRldiA9ICZ0aGlzLT5ub2RlOworCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisKKwl0aGlzLT5iYXNlX2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWlmICghd2wzNTAxX2dldF9mbGFzaF9tYWNfYWRkcih0aGlzKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2FudCByZWFkIE1BQyBhZGRyIGluIGZsYXNoIFJPTT9cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJc3RyY3B5KHRoaXMtPm5vZGUuZGV2X25hbWUsIGRldi0+bmFtZSk7CisKKwkvKiBwcmludCBwcm9iZSBpbmZvcm1hdGlvbiAqLworCXByaW50ayhLRVJOX0lORk8gIiVzOiB3bDM1MDEgQCAweCUzLjN4LCBJUlEgJWQsIE1BQyBhZGRyIGluIGZsYXNoIFJPTToiLAorCSAgICAgICBkZXYtPm5hbWUsIHRoaXMtPmJhc2VfYWRkciwgKGludClkZXYtPmlycSk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlkZXYtPmRldl9hZGRyW2ldID0gKChjaGFyICopJnRoaXMtPm1hY19hZGRyKVtpXTsKKwkJcHJpbnRrKCIlYyUwMngiLCBpID8gJzonIDogJyAnLCBkZXYtPmRldl9hZGRyW2ldKTsKKwl9CisJcHJpbnRrKCJcbiIpOworCS8qCisJICogSW5pdGlhbGl6ZSBjYXJkIHBhcmFtZXRlcnMgLSBhZGRlZCBieSBqc3MKKwkgKi8KKwl0aGlzLT5uZXRfdHlwZQkJPSBJV19NT0RFX0lORlJBOworCXRoaXMtPmJzc19jbnQJCT0gMDsKKwl0aGlzLT5qb2luX3N0YV9ic3MJPSAwOworCXRoaXMtPmFkaG9jX3RpbWVzCT0gMDsKKwlpd19zZXRfbWdtdF9pbmZvX2VsZW1lbnQoSVdfTUdNVF9JTkZPX0VMRU1FTlRfU1NJRCwgJnRoaXMtPmVzc2lkLmVsLAorCQkJCSAiQU5ZIiwgMyk7CisJdGhpcy0+Y2FyZF9uYW1lWzBdCT0gJ1wwJzsKKwl0aGlzLT5maXJtd2FyZV9kYXRlWzBdCT0gJ1wwJzsKKwl0aGlzLT5yc3NpCQk9IDI1NTsKKwl0aGlzLT5jaGFuCQk9IGl3X2RlZmF1bHRfY2hhbm5lbCh0aGlzLT5yZWdfZG9tYWluKTsKKwlzdHJsY3B5KHRoaXMtPm5pY2ssICJQbGFuZXQgV0wzNTAxIiwgc2l6ZW9mKHRoaXMtPm5pY2spKTsKKwlzcGluX2xvY2tfaW5pdCgmdGhpcy0+bG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdGhpcy0+d2FpdCk7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlnb3RvIG91dDsKK2NzX2ZhaWxlZDoKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKK2ZhaWxlZDoKKwl3bDM1MDFfcmVsZWFzZShsaW5rKTsKK291dDoKKwlyZXR1cm47Cit9CisKKy8qKgorICogd2wzNTAxX3JlbGVhc2UgLSB1bnJlZ2lzdGVyIHRoZSBuZXQsIHJlbGVhc2UgUENNQ0lBIGNvbmZpZ3VyYXRpb24KKyAqIEBhcmcgLSBsaW5rCisgKgorICogQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIHdsMzUwMV9yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZSBuZXQgZGV2aWNlLAorICogYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcyBzdGlsbCBvcGVuLCB0aGlzCisgKiB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCisgKi8KK3N0YXRpYyB2b2lkIHdsMzUwMV9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisKKwkvKiBVbmxpbmsgdGhlIGRldmljZSBjaGFpbiAqLworCWlmIChsaW5rLT5kZXYpIHsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJbGluay0+ZGV2ID0gTlVMTDsKKwl9CisKKwkvKiBEb24ndCBib3RoZXIgY2hlY2tpbmcgdG8gc2VlIGlmIHRoZXNlIHN1Y2NlZWQgb3Igbm90ICovCisJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCXBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwlwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKK30KKworLyoqCisgKiB3bDM1MDFfZXZlbnQgLSBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlcgorICogQGV2ZW50IC0gZXZlbnQKKyAqIEBwcmkgLSBwcmlvcml0eQorICogQGFyZ3MgLSBhcmd1bWVudHMgZm9yIHRoaXMgZXZlbnQKKyAqCisgKiBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gTW9zdGx5LCB0aGlzIHNjaGVkdWxlcyBvdGhlciBzdHVmZiB0byBydW4KKyAqIGFmdGVyIGFuIGV2ZW50IGlzIHJlY2VpdmVkLiBBIENBUkRfUkVNT1ZBTCBldmVudCBhbHNvIHNldHMgc29tZSBmbGFncyB0bworICogZGlzY291cmFnZSB0aGUgbmV0IGRyaXZlcnMgZnJvbSB0cnlpbmcgdG8gdGFsayB0byB0aGUgY2FyZCBhbnkgbW9yZS4KKyAqCisgKiBXaGVuIGEgQ0FSRF9SRU1PVkFMIGV2ZW50IGlzIHJlY2VpdmVkLCB3ZSBpbW1lZGlhdGVseSBzZXQgYSBmbGFnIHRvIGJsb2NrCisgKiBmdXR1cmUgYWNjZXNzZXMgdG8gdGhpcyBkZXZpY2UuIEFsbCB0aGUgZnVuY3Rpb25zIHRoYXQgYWN0dWFsbHkgYWNjZXNzIHRoZQorICogZGV2aWNlIHNob3VsZCBjaGVjayB0aGlzIGZsYWcgdG8gbWFrZSBzdXJlIHRoZSBjYXJkIGlzIHN0aWxsIHByZXNlbnQuCisgKi8KK3N0YXRpYyBpbnQgd2wzNTAxX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmksIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncykKK3sKKwlkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJCWxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJd2hpbGUgKGxpbmstPm9wZW4gPiAwKQorCQkJCXdsMzUwMV9jbG9zZShkZXYpOworCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQkJd2wzNTAxX3JlbGVhc2UobGluayk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwkJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJCXdsMzUwMV9jb25maWcobGluayk7CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwkJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJCXdsMzUwMV9wd3JfbWdtdChkZXYtPnByaXYsIFdMMzUwMV9TVVNQRU5EKTsKKwkJLyogRmFsbCB0aHJvdWdoLi4uICovCisJY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJaWYgKGxpbmstPm9wZW4pCisJCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQkJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCQl9CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisJCXdsMzUwMV9wd3JfbWdtdChkZXYtPnByaXYsIFdMMzUwMV9SRVNVTUUpOworCQkvKiBGYWxsIHRocm91Z2guLi4gKi8KKwljYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCXBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisJCQlpZiAobGluay0+b3BlbikgeworCQkJCXdsMzUwMV9yZXNldChkZXYpOworCQkJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciB3bDM1MDFfZHJpdmVyID0geworCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5kcnYgICAgICAgICAgICA9IHsKKwkJLm5hbWUgICA9ICJ3bDM1MDFfY3MiLAorCX0sCisJLmF0dGFjaCAgICAgICAgID0gd2wzNTAxX2F0dGFjaCwKKwkuZGV0YWNoICAgICAgICAgPSB3bDM1MDFfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgd2wzNTAxX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJndsMzUwMV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgd2wzNTAxX2V4aXRfbW9kdWxlKHZvaWQpCit7CisJZHByaW50aygwLCAiOiB1bmxvYWRpbmciKTsKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJndsMzUwMV9kcml2ZXIpOworCUJVR19PTih3bDM1MDFfZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KHdsMzUwMV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdCh3bDM1MDFfZXhpdF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJGb3ggQ2hlbiA8bWhjaGVuQGdvbGYuY2NsLml0cmkub3JnLnR3PiwgIgorCSAgICAgICJBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4sIgorCSAgICAgICJHdXN0YXZvIE5pZW1leWVyIDxuaWVtZXllckBjb25lY3RpdmEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQbGFuZXQgd2wzNTAxIHdpcmVsZXNzIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo=