ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVzc2FnZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2VmNWEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorIworIyBNYWtlZmlsZSBmb3IgTVBUIGJhc2VkIGJsb2NrIGRldmljZXMKKyMKKworb2JqLSQoQ09ORklHX0kyTykJKz0gaTJvLworb2JqLSQoQ09ORklHX0ZVU0lPTikJKz0gZnVzaW9uLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9LY29uZmlnIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MjQxOGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL0tjb25maWcKQEAgLTAsMCArMSw2NiBAQAorCittZW51ICJGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0IgorCitjb25maWcgRlVTSU9OCisJdHJpc3RhdGUgIkZ1c2lvbiBNUFQgKGJhc2UgKyBTY3NpSG9zdCkgZHJpdmVycyIKKwlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJCisJLS0taGVscC0tLQorCSAgTFNJIExvZ2ljIEZ1c2lvbihUTSkgTWVzc2FnZSBQYXNzaW5nIFRlY2hub2xvZ3kgKE1QVCkgZGV2aWNlIHN1cHBvcnQKKwkgIHByb3ZpZGVzIGhpZ2ggcGVyZm9ybWFuY2UgU0NTSSBob3N0IGluaXRpYXRvciwgYW5kIExBTiBbMV0gaW50ZXJmYWNlCisJICBzZXJ2aWNlcyB0byBhIGhvc3Qgc3lzdGVtLiAgVGhlIEZ1c2lvbiBhcmNoaXRlY3R1cmUgaXMgY2FwYWJsZSBvZgorCSAgZHVwbGV4aW5nIHRoZXNlIHByb3RvY29scyBvbiBoaWdoLXNwZWVkIEZpYnJlIENoYW5uZWwKKwkgICh1cCB0byAyIEdIeiB4IDIgcG9ydHMgPSA0IEdIeikgYW5kIHBhcmFsbGVsIFNDU0kgKHVwIHRvIFVsdHJhLTMyMCkKKwkgIHBoeXNpY2FsIG1lZGl1bS4KKworCSAgWzFdIExBTiBpcyBub3Qgc3VwcG9ydGVkIG9uIHBhcmFsbGVsIFNDU0kgbWVkaXVtLgorCitjb25maWcgRlVTSU9OX01BWF9TR0UKKwlpbnQgIk1heGltdW0gbnVtYmVyIG9mIHNjYXR0ZXIgZ2F0aGVyIGVudHJpZXMiCisJZGVwZW5kcyBvbiBGVVNJT04KKwlkZWZhdWx0ICI0MCIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNjYXR0ZXItCisJICBnYXRoZXIgZW50cmllcyBwZXIgSS9PLiBUaGUgZHJpdmVyIGRlZmF1bHRzIHRvIDQwLCBhIHJlYXNvbmFibGUgbnVtYmVyCisJICBmb3IgbW9zdCBzeXN0ZW1zLiBIb3dldmVyLCB0aGUgdXNlciBtYXkgaW5jcmVhc2UgdGhpcyB1cCB0byAxMjguCisJICBJbmNyZWFzaW5nIHRoaXMgcGFyYW1ldGVyIHdpbGwgcmVxdWlyZSBzaWduaWZpY2FudGx5IG1vcmUgbWVtb3J5IAorCSAgb24gYSBwZXIgY29udHJvbGxlciBpbnN0YW5jZS4gSW5jcmVhc2luZyB0aGUgcGFyYW1ldGVyIGlzIG5vdAorCSAgbmVjZXNzYXJ5IChvciByZWNvbW1lbmRlZCkgdW5sZXNzIHRoZSB1c2VyIHdpbGwgYmUgcnVubmluZyAKKwkgIGxhcmdlIEkvTydzIHZpYSB0aGUgcmF3IGludGVyZmFjZS4KKworY29uZmlnIEZVU0lPTl9DVEwKKwl0cmlzdGF0ZSAiRnVzaW9uIE1QVCBtaXNjIGRldmljZSAoaW9jdGwpIGRyaXZlciIKKwlkZXBlbmRzIG9uIEZVU0lPTgorCS0tLWhlbHAtLS0KKwkgIFRoZSBGdXNpb24gTVBUIG1pc2MgZGV2aWNlIGRyaXZlciBwcm92aWRlcyBzcGVjaWFsaXplZCBjb250cm9sCisJICBvZiBNUFQgYWRhcHRlcnMgdmlhIHN5c3RlbSBpb2N0bCBjYWxscy4gIFVzZSBvZiBpb2N0bCBjYWxscyB0bworCSAgdGhlIE1QVCBkcml2ZXIgcmVxdWlyZXMgdGhhdCB5b3UgY3JlYXRlIGFuZCB1c2UgYSBtaXNjIGRldmljZQorCSAgbm9kZSBhbGE6CisJICBta25vZCAvZGV2L21wdGN0bCBjIDEwIDI0MAorCisJICBPbmUgdXNlIG9mIHRoaXMgaW9jdGwgaW50ZXJmYWNlIGlzIHRvIHBlcmZvcm0gYW4gdXBncmFkZSAocmVmbGFzaCkKKwkgIG9mIHRoZSBNUFQgYWRhcHRlciBmaXJtd2FyZS4gIFJlZmVyIHRvIHJlYWRtZSBmaWxlKHMpIGRpc3RyaWJ1dGVkCisJICB3aXRoIHRoZSBGdXNpb24gTVBUIGxpbnV4IGRyaXZlciBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLgorCisJICBJZiBlbmFibGVkIGJ5IHNheWluZyBNIHRvIHRoaXMsIGEgZHJpdmVyIG5hbWVkOiBtcHRjdGwKKwkgIHdpbGwgYmUgY29tcGlsZWQuCisKKwkgIElmIHVuc3VyZSB3aGV0aGVyIHlvdSByZWFsbHkgd2FudCBvciBuZWVkIHRoaXMsIHNheSBOLgorCitjb25maWcgRlVTSU9OX0xBTgorCXRyaXN0YXRlICJGdXNpb24gTVBUIExBTiBkcml2ZXIiCisJZGVwZW5kcyBvbiBGVVNJT04gJiYgTkVUX0ZDCisJLS0taGVscC0tLQorCSAgVGhpcyBtb2R1bGUgc3VwcG9ydHMgTEFOIElQIHRyYWZmaWMgb3ZlciBGaWJyZSBDaGFubmVsIHBvcnQocykKKwkgIG9uIEZ1c2lvbiBNUFQgY29tcGF0aWJsZSBoYXJkd2FyZSAoTFNJRkM5eHggY2hpcHMpLgorCSAgVGhlIHBoeXNpY2FsIGludGVyZmFjZSB1c2VkIGlzIGRlZmluZWQgaW4gUkZDIDI2MjUuCisJICBQbGVhc2UgcmVmZXIgdG8gdGhhdCBkb2N1bWVudCBmb3IgZGV0YWlscy4KKworCSAgSW5zdGFsbGluZyB0aGlzIGRyaXZlciByZXF1aXJlcyB0aGUga25vd2xlZGdlIHRvIGNvbmZpZ3VyZSBhbmQKKwkgIGFjdGl2YXRlIGEgbmV3IG5ldHdvcmsgaW50ZXJmYWNlLCAiZmMwIiwgdXNpbmcgc3RhbmRhcmQgTGludXggdG9vbHMuCisKKwkgIElmIGVuYWJsZWQgYnkgc2F5aW5nIE0gdG8gdGhpcywgYSBkcml2ZXIgbmFtZWQ6IG1wdGxhbgorCSAgd2lsbCBiZSBjb21waWxlZC4KKworCSAgSWYgdW5zdXJlIHdoZXRoZXIgeW91IHJlYWxseSB3YW50IG9yIG5lZWQgdGhpcywgc2F5IE4uCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vTWFrZWZpbGUgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZmRjYWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL01ha2VmaWxlCkBAIC0wLDAgKzEsNTIgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMU0kgTG9naWMgRnVzaW9uIE1QVCAoTWVzc2FnZSBQYXNzaW5nIFRlY2hub2xvZ3kpIGRyaXZlcnMuCisjCisjIE5vdGUhIElmIHlvdSB3YW50IHRvIHR1cm4gb24gdmFyaW91cyBkZWJ1ZyBkZWZpbmVzIGZvciBhbiBleHRlbmRlZCBwZXJpb2Qgb2YKKyMgdGltZSBidXQgZG9uJ3Qgd2FudCB0aGVtIGxpbmdlcmluZyBhcm91bmQgaW4gdGhlIE1ha2VmaWxlIHdoZW4geW91IHBhc3MgaXQgb24KKyMgdG8gc29tZW9uZSBlbHNlLCB1c2UgdGhlIE1QVF9DRkxBR1MgZW52IHZhcmlhYmxlICh0aGFua3MgU3RldmUpLiAtbnJvbWVyCisKKyM9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LXsgTFNJX0xPR0lDCisKKyMgIEFyY2hpdGVjdHVyZS1zcGVjaWZpYy4uLgorIwkJCSMgaW50ZWwKKyNFWFRSQV9DRkxBR1MgKz0gLWcKKyMJCQkjIHNwYXJjNjQKKyNFWFRSQV9DRkxBR1MgKz0gLWdzdGFicysKKworRVhUUkFfQ0ZMQUdTICs9ICR7TVBUX0NGTEFHU30KKworIyBGdXNpb24gTVBUIGRyaXZlcnM7IHJlY29nbml6ZWQgZGVidWcgZGVmaW5lcy4uLgorIyAgTVBUIGdlbmVyYWw6CisjRVhUUkFfQ0ZMQUdTICs9IC1ETVBUX0RFQlVHX1NDU0kKKyNFWFRSQV9DRkxBR1MgKz0gLURNUFRfREVCVUcKKyNFWFRSQV9DRkxBR1MgKz0gLURNUFRfREVCVUdfTVNHX0ZSQU1FCisjRVhUUkFfQ0ZMQUdTICs9IC1ETVBUX0RFQlVHX1NHCisKKyMKKyMgZHJpdmVyL21vZHVsZSBzcGVjaWZpY3MuLi4KKyMKKyMgIEZvciBtcHRiYXNlOgorI0NGTEFHU19tcHRiYXNlLm8gKz0gLURNUFRfREVCVUdfSEFORFNIQUtFCisjQ0ZMQUdTX21wdGJhc2UubyArPSAtRE1QVF9ERUJVR19JUlEKKyMKKyMgIEZvciBtcHRzY3NpaDoKKyNDRkxBR1NfbXB0c2NzaWgubyArPSAtRE1QVF9ERUJVR19TQ0FORFYKKyNDRkxBR1NfbXB0c2NzaWgubyArPSAtRE1QVF9ERUJVR19SRVNFVAorI0NGTEFHU19tcHRzY3NpaC5vICs9IC1ETVBUX0RFQlVHX05FSAorIworIyAgRm9yIG1wdGN0bDoKKyNDRkxBR1NfbXB0Y3RsLm8gKz0gLURNUFRfREVCVUdfSU9DVEwKKyMKKyMgIEZvciBtcHRsYW46CisjQ0ZMQUdTX21wdGxhbi5vICs9IC1ETVBUX0xBTl9JT19ERUJVRworIworIyAgRm9yIGlzZW5zZToKKworIyAgRVhQLi4uCisjI21wdHNjc2loLW9ianMJOj0gc2NzaWhvc3QubyBzY3NpaGVyci5vCisKKyM9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LX0gTFNJX0xPR0lDCisKK29iai0kKENPTkZJR19GVVNJT04pCQkrPSBtcHRiYXNlLm8gbXB0c2NzaWgubworb2JqLSQoQ09ORklHX0ZVU0lPTl9DVEwpCSs9IG1wdGN0bC5vCitvYmotJChDT05GSUdfRlVTSU9OX0xBTikJKz0gbXB0bGFuLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbGludXhfY29tcGF0LmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xpbnV4X2NvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OGI1YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xpbnV4X2NvbXBhdC5oCkBAIC0wLDAgKzEsMTggQEAKKy8qIGRyaXZlcnMvbWVzc2FnZS9mdXNpb24vbGludXhfY29tcGF0LmggKi8KKworI2lmbmRlZiBGVVNJT05fTElOVVhfQ09NUEFUX0gKKyNkZWZpbmUgRlVTSU9OX0xJTlVYX0NPTVBBVF9ICisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiw2KSkKK3N0YXRpYyBpbnQgaW5saW5lIHNjc2lfZGV2aWNlX29ubGluZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJcmV0dXJuIHNkZXYtPm9ubGluZTsKK30KKyNlbmRpZgorCisKKy8qfS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKyNlbmRpZiAvKiBfTElOVVhfQ09NUEFUX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL2ZjX2xvZy5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvZmNfbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5OGQ0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL2ZjX2xvZy5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgTFNJIExvZ2ljIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBOQU1FOiAgICAgICAgICAgZmNfbG9nLmgKKyAqICBTVU1NQVJZOiAgICAgICAgTVBJIElvY0xvZ0luZm8gZGVmaW5pdGlvbnMgZm9yIHRoZSBTWU1GQzl4eCBjaGlwcworICogIERFU0NSSVBUSU9OOiAgICBDb250YWlucyB0aGUgZW51bWVyYXRlZCBsaXN0IG9mIHZhbHVlcyB0aGF0IG1heSBiZSByZXR1cm5lZAorICogICAgICAgICAgICAgICAgICBpbiB0aGUgSU9DTG9nSW5mbyBmaWVsZCBvZiBhIE1QSSBEZWZhdWx0IFJlcGx5IE1lc3NhZ2UuCisgKgorICogIENSRUFUSU9OIERBVEU6ICA2LzAyLzIwMDAKKyAqICBJRDogICAgICAgICAgICAgJElkOiBmY19sb2cuaCx2IDQuNiAyMDAxLzA3LzI2IDE0OjQxOjMzIHNzY2hyZW1tIEV4cCAkCisgKi8KKworCisvKgorICogTXBpSW9jTG9nSW5mb190IGVudW0KKyAqCisgKiBUaGVzZSAzMiBiaXQgdmFsdWVzIGFyZSB1c2VkIGluIHRoZSBJT0NMb2dJbmZvIGZpZWxkIG9mIHRoZSBNUEkgcmVwbHkKKyAqIG1lc3NhZ2VzLgorICogVGhlIHZhbHVlIGlzIDB4YWJjY2NjY2Mgd2hlcmUKKyAqICAgICAgICAgIGEgPSBUaGUgdHlwZSBvZiBsb2cgaW5mbyBhcyBwZXIgdGhlIE1QSSBzcGVjLiBTaW5jZSB0aGVzZSBjb2RlcyBhcmUKKyAqICAgICAgICAgICAgICBhbGwgZm9yIEZpYnJlIENoYW5uZWwgdGhpcyB2YWx1ZSB3aWxsIGFsd2F5cyBiZSAyLgorICogICAgICAgICAgYiA9IFNwZWNpZmllcyBhIHN1YmNsYXNzIG9mIHRoZSBmaXJtd2FyZSB3aGVyZQorICogICAgICAgICAgICAgICAgICAwID0gRkNQIEluaXRpYXRvcgorICogICAgICAgICAgICAgICAgICAxID0gRkNQIFRhcmdldAorICogICAgICAgICAgICAgICAgICAyID0gTEFOCisgKiAgICAgICAgICAgICAgICAgIDMgPSBNUEkgTWVzc2FnZSBMYXllcgorICogICAgICAgICAgICAgICAgICA0ID0gRkMgTGluaworICogICAgICAgICAgICAgICAgICA1ID0gQ29udGV4dCBNYW5hZ2VyCisgKiAgICAgICAgICAgICAgICAgIDYgPSBJbnZhbGlkIEZpZWxkIE9mZnNldAorICogICAgICAgICAgICAgICAgICA3ID0gU3RhdGUgQ2hhbmdlIEluZm8KKyAqICAgICAgICAgICAgICAgICAgYWxsIG90aGVycyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKKyAqICAgICAgICAgIGMgPSBBIHNwZWNpZmljIHZhbHVlIHdpdGhpbiB0aGUgc3ViY2xhc3MuCisgKgorICogTk9URTogQW55IG5ldyB2YWx1ZXMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgZWFjaCBzdWJjbGFzcyBzbyB0aGF0IHRoZQorICogICAgICAgY29kZXMgcmVtYWluIGNvbnNpc3RlbnQgYWNyb3NzIGZpcm13YXJlIHJlbGVhc2VzLgorICovCit0eXBlZGVmIGVudW0gX01waUlvY0xvZ0luZm9GYworeworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0lOSVRfQkFTRSAgICAgICAgICAgICAgICAgICAgID0gMHgyMDAwMDAwMCwKKyAgICBNUElfSU9DTE9HSU5GT19GQ19JTklUX0VSUk9SX09VVF9PRl9PUkRFUl9GUkFNRSA9IDB4MjAwMDAwMDEsIC8qIHJlY2VpdmVkIGFuIG91dCBvZiBvcmRlciBmcmFtZSAtIHVuc3VwcG9ydGVkICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfSU5JVF9FUlJPUl9CQURfU1RBUlRfT0ZfRlJBTUUgPSAweDIwMDAwMDAyLCAvKiBCYWQgUnggRnJhbWUsIGJhZCBzdGFydCBvZiBmcmFtZSBwcmltYXRpdmUgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19JTklUX0VSUk9SX0JBRF9FTkRfT0ZfRlJBTUUgICA9IDB4MjAwMDAwMDMsIC8qIEJhZCBSeCBGcmFtZSwgYmFkIGVuZCBvZiBmcmFtZSBwcmltYXRpdmUgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19JTklUX0VSUk9SX09WRVJfUlVOICAgICAgICAgICA9IDB4MjAwMDAwMDQsIC8qIEJhZCBSeCBGcmFtZSwgb3ZlcnJ1biAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0lOSVRfRVJST1JfUlhfT1RIRVIgICAgICAgICAgID0gMHgyMDAwMDAwNSwgLyogT3RoZXIgZXJyb3JzIGNhdWdodCBieSBJT0Mgd2hpY2ggcmVxdWlyZSByZXRyaWVzICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfSU5JVF9FUlJPUl9TVUJQUk9DX0RFQUQgICAgICAgPSAweDIwMDAwMDA2LCAvKiBNYWluIHByb2Nlc3NvciBjb3VsZCBub3QgaW5pdGlhbGl6ZSBzdWItcHJvY2Vzc29yICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfSU5JVF9FUlJPUl9SWF9PVkVSUlVOICAgICAgICAgPSAweDIwMDAwMDA3LCAvKiBTY2F0dGVyIEdhdGhlciBvdmVycnVuICAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0lOSVRfRVJST1JfUlhfQkFEX1NUQVRVUyAgICAgID0gMHgyMDAwMDAwOCwgLyogUmVjZWl2ZXIgZGV0ZWN0ZWQgY29udGV4dCBtaXNtYXRjaCB2aWEgaW52YWxpZCBoZWFkZXIgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19JTklUX0VSUk9SX1JYX1VORVhQRUNURURfRlJBTUU9IDB4MjAwMDAwMDksIC8qIEN0eE1nciBkZXRlY3RlZCB1bnN1cHBvcnRlZCBmcmFtZSB0eXBlICAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0lOSVRfRVJST1JfTElOS19GQUlMVVJFICAgICAgID0gMHgyMDAwMDAwQSwgLyogTGluayBmYWlsdXJlIG9jY3VycmVkICAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0lOSVRfRVJST1JfVFhfVElNRU9VVCAgICAgICAgID0gMHgyMDAwMDAwQiwgLyogVHJhbnNtaXR0ZXIgdGltZW91dCBlcnJvciAqLworCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfVEFSR0VUX0JBU0UgICAgICAgICAgICAgICAgICAgPSAweDIxMDAwMDAwLAorICAgIE1QSV9JT0NMT0dJTkZPX0ZDX1RBUkdFVF9OT19QRElTQyAgICAgICAgICAgICAgID0gMHgyMTAwMDAwMSwgLyogbm90IHNlbnQgYmVjYXVzZSB3ZSBhcmUgd2FpdGluZyBmb3IgYSBQRElTQyBmcm9tIHRoZSBpbml0aWF0b3IgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19UQVJHRVRfTk9fTE9HSU4gICAgICAgICAgICAgICA9IDB4MjEwMDAwMDIsIC8qIG5vdCBzZW50IGJlY2F1c2Ugd2UgYXJlIG5vdCBsb2dnZWQgaW4gdG8gdGhlIHJlbW90ZSBub2RlICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfVEFSR0VUX0RPQVJfS0lMTEVEX0JZX0xJUCAgICAgPSAweDIxMDAwMDAzLCAvKiBEYXRhIE91dCwgQXV0byBSZXNwb25zZSwgbm90IHNlbnQgZHVlIHRvIGEgTElQICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfVEFSR0VUX0RJQVJfS0lMTEVEX0JZX0xJUCAgICAgPSAweDIxMDAwMDA0LCAvKiBEYXRhIEluLCBBdXRvIFJlc3BvbnNlLCBub3Qgc2VudCBkdWUgdG8gYSBMSVAgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19UQVJHRVRfRElBUl9NSVNTSU5HX0RBVEEgICAgICA9IDB4MjEwMDAwMDUsIC8qIERhdGEgSW4sIEF1dG8gUmVzcG9uc2UsIG1pc3NpbmcgZGF0YSBmcmFtZXMgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19UQVJHRVRfRE9OUl9LSUxMRURfQllfTElQICAgICA9IDB4MjEwMDAwMDYsIC8qIERhdGEgT3V0LCBObyBSZXNwb25zZSwgbm90IHNlbnQgZHVlIHRvIGEgTElQICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfVEFSR0VUX1dSU1BfS0lMTEVEX0JZX0xJUCAgICAgPSAweDIxMDAwMDA3LCAvKiBBdXRvLXJlc3BvbnNlIGFmdGVyIGEgd3JpdGUgbm90IHNlbnQgZHVlIHRvIGEgTElQICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfVEFSR0VUX0RJTlJfS0lMTEVEX0JZX0xJUCAgICAgPSAweDIxMDAwMDA4LCAvKiBEYXRhIEluLCBObyBSZXNwb25zZSwgbm90IGNvbXBsZXRlZCBkdWUgdG8gYSBMSVAgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19UQVJHRVRfRElOUl9NSVNTSU5HX0RBVEEgICAgICA9IDB4MjEwMDAwMDksIC8qIERhdGEgSW4sIE5vIFJlc3BvbnNlLCBtaXNzaW5nIGRhdGEgZnJhbWVzICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfVEFSR0VUX01SU1BfS0lMTEVEX0JZX0xJUCAgICAgPSAweDIxMDAwMDBhLCAvKiBNYW51YWwgUmVzcG9uc2Ugbm90IHNlbnQgZHVlIHRvIGEgTElQICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfVEFSR0VUX05PX0NMQVNTXzMgICAgICAgICAgICAgPSAweDIxMDAwMDBiLCAvKiBub3Qgc2VudCBiZWNhdXNlIHJlbW90ZSBub2RlIGRvZXMgbm90IHN1cHBvcnQgQ2xhc3MgMyAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX1RBUkdFVF9MT0dJTl9OT1RfVkFMSUQgICAgICAgID0gMHgyMTAwMDAwYywgLyogbm90IHNlbnQgYmVjYXVzZSBsb2dpbiB0byByZW1vdGUgbm9kZSBub3QgdmFsaWRhdGVkICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfVEFSR0VUX0ZST01fT1VUQk9VTkQgICAgICAgICAgPSAweDIxMDAwMDBlLCAvKiBjbGVhcmVkIGZyb20gdGhlIG91dGJvdW5kIHF1ZXVlIGFmdGVyIGEgbG9nb3V0ICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfVEFSR0VUX1dBSVRJTkdfRk9SX0RBVEFfSU4gICAgPSAweDIxMDAwMDBmLCAvKiBjbGVhcmVkIHdhaXRpbmcgZm9yIGRhdGEgYWZ0ZXIgYSBsb2dvdXQgKi8KKworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0xBTl9CQVNFICAgICAgICAgICAgICAgICAgICAgID0gMHgyMjAwMDAwMCwKKyAgICBNUElfSU9DTE9HSU5GT19GQ19MQU5fVFJBTlNfU0dMX01JU1NJTkcgICAgICAgICA9IDB4MjIwMDAwMDEsIC8qIFRyYW5zYWN0aW9uIENvbnRleHQgU2dsIE1pc3NpbmcgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19MQU5fVFJBTlNfV1JPTkdfUExBQ0UgICAgICAgICA9IDB4MjIwMDAwMDIsIC8qIFRyYW5zYWN0aW9uIENvbnRleHQgZm91bmQgYmVmb3JlIGFuIEVPQiAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0xBTl9UUkFOU19SRVNfQklUU19TRVQgICAgICAgID0gMHgyMjAwMDAwMywgLyogVHJhbnNhY3Rpb24gQ29udGV4dCB2YWx1ZSBoYXMgcmVzZXJ2ZWQgYml0cyBzZXQgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19MQU5fV1JPTkdfU0dMX0ZMQUcgICAgICAgICAgICA9IDB4MjIwMDAwMDQsIC8qIEludmFsaWQgU0dMIEZsYWdzICovCisKKyAgICBNUElfSU9DTE9HSU5GT19GQ19NU0dfQkFTRSAgICAgICAgICAgICAgICAgICAgICA9IDB4MjMwMDAwMDAsCisKKyAgICBNUElfSU9DTE9HSU5GT19GQ19MSU5LX0JBU0UgICAgICAgICAgICAgICAgICAgICA9IDB4MjQwMDAwMDAsCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfTElOS19MT09QX0lOSVRfVElNRU9VVCAgICAgICAgPSAweDI0MDAwMDAxLCAvKiBMb29wIGluaXRpYWxpemF0aW9uIHRpbWVkIG91dCAqLworICAgIE1QSV9JT0NMT0dJTkZPX0ZDX0xJTktfQUxSRUFEWV9JTklUSUFMSVpFRCAgICAgID0gMHgyNDAwMDAwMiwgLyogQW5vdGhlciBzeXN0ZW0gY29udHJvbGxlciBhbHJlYWR5IGluaXRpYWxpemVkIHRoZSBsb29wICovCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfTElOS19MSU5LX05PVF9FU1RBQkxJU0hFRCAgICAgPSAweDI0MDAwMDAzLCAvKiBOb3Qgc3luY2hyb25pemVkIHRvIHNpZ25hbCBvciBzdGlsbCBuZWdvdGlhdGluZyAocG9zc2libGUgY2FibGUgcHJvYmxlbSkgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19MSU5LX0NSQ19FUlJPUiAgICAgICAgICAgICAgICA9IDB4MjQwMDAwMDQsIC8qIENSQyBjaGVjayBkZXRlY3RlZCBlcnJvciBvbiByZWNlaXZlZCBmcmFtZSAqLworCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfQ1RYX0JBU0UgICAgICAgICAgICAgICAgICAgICAgPSAweDI1MDAwMDAwLAorCisgICAgTVBJX0lPQ0xPR0lORk9fRkNfSU5WQUxJRF9GSUVMRF9CWVRFX09GRlNFVCAgICAgPSAweDI2MDAwMDAwLCAvKiBUaGUgbG93ZXIgMjQgYml0cyBnaXZlIHRoZSBieXRlIG9mZnNldCBvZiB0aGUgZmllbGQgaW4gdGhlIHJlcXVlc3QgbWVzc2FnZSB0aGF0IGlzIGludmFsaWQgKi8KKyAgICBNUElfSU9DTE9HSU5GT19GQ19JTlZBTElEX0ZJRUxEX01BWF9PRkZTRVQgICAgICA9IDB4MjZmZmZmZmYsCisKKyAgICBNUElfSU9DTE9HSU5GT19GQ19TVEFURV9DSEFOR0UgICAgICAgICAgICAgICAgICA9IDB4MjcwMDAwMDAgIC8qIFRoZSBsb3dlciAyNCBiaXRzIGdpdmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBjb25jZXJuaW5nIHN0YXRlIGNoYW5nZSAqLworCit9IE1waUlvY0xvZ0luZm9GY190OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGJiMDYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpLmgKQEAgLTAsMCArMSw3NDYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgTFNJIExvZ2ljIENvcnBvcmF0aW9uLgorICoKKyAqCisgKiAgICAgICAgICAgTmFtZTogIG1waS5oCisgKiAgICAgICAgICBUaXRsZTogIE1QSSBNZXNzYWdlIGluZGVwZW5kZW50IHN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zCisgKiAgQ3JlYXRpb24gRGF0ZTogIEp1bHkgMjcsIDIwMDAKKyAqCisgKiAgICBtcGkuaCBWZXJzaW9uOiAgMDEuMDUueHgKKyAqCisgKiAgVmVyc2lvbiBIaXN0b3J5CisgKiAgLS0tLS0tLS0tLS0tLS0tCisgKgorICogIERhdGUgICAgICBWZXJzaW9uICAgRGVzY3JpcHRpb24KKyAqICAtLS0tLS0tLSAgLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIDA1LTA4LTAwICAwMC4xMC4wMSAgT3JpZ2luYWwgcmVsZWFzZSBmb3IgMC4xMCBzcGVjIGRhdGVkIDQvMjYvMjAwMC4KKyAqICAwNS0yNC0wMCAgMDAuMTAuMDIgIEFkZGVkIE1QSV9JT0NTVEFUVVNfU0NTSV9SRVNJRFVBTF9NSVNNQVRDSCBkZWZpbml0aW9uLgorICogIDA2LTA2LTAwICAwMS4wMC4wMSAgVXBkYXRlIE1QSV9WRVJTSU9OX01BSk9SIGFuZCBNUElfVkVSU0lPTl9NSU5PUi4KKyAqICAwNi0yMi0wMCAgMDEuMDAuMDIgIEFkZGVkIE1QSV9JT0NTVEFUVVNfTEFOXyBkZWZpbml0aW9ucy4KKyAqICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgTEFOX1NVU1BFTkQgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSV9NU0dGTEFHU19DT05USU5VQVRJT05fUkVQTFkgZGVmaW5pdGlvbi4KKyAqICAwNi0zMC0wMCAgMDEuMDAuMDMgIEFkZGVkIE1QSV9DT05URVhUX1JFUExZX1RZUEVfTEFOIGRlZmluaXRpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNUElfR0VUL1NFVF9DT05URVhUX1JFUExZX1RZUEUgbWFjcm9zLgorICogIDA3LTI3LTAwICAwMS4wMC4wNCAgQWRkZWQgTVBJX0ZBVUxUXyBkZWZpbml0aW9ucy4KKyAqICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgTVBJX0lPQ1NUQVRVU19NU0cvREFUQV9YRkVSX0VSUk9SIGRlZmluaXRpb25zLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJX0lPQ1NUQVRVU19JTlRFUk5BTF9FUlJPUiBkZWZpbml0aW9uLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJX0lPQ1NUQVRVU19UQVJHRVRfWEZFUl9DT1VOVF9NSVNNQVRDSC4KKyAqICAxMS0wMi0wMCAgMDEuMDEuMDEgIE9yaWdpbmFsIHJlbGVhc2UgZm9yIHBvc3QgMS4wIHdvcmsuCisgKiAgMTItMDQtMDAgIDAxLjAxLjAyICBBZGRlZCBuZXcgZnVuY3Rpb24gY29kZXMuCisgKiAgMDEtMDktMDEgIDAxLjAxLjAzICBBZGRlZCBtb3JlIGRlZmluaXRpb25zIHRvIHRoZSBzeXN0ZW0gaW50ZXJmYWNlIHNlY3Rpb24KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSV9JT0NTVEFUVVNfVEFSR0VUX1NUU19EQVRBX05PVF9TRU5ULgorICogIDAxLTI1LTAxICAwMS4wMS4wNCAgQ2hhbmdlZCBNUElfVkVSU0lPTl9NSU5PUiBmcm9tIDB4MDAgdG8gMHgwMS4KKyAqICAwMi0yMC0wMSAgMDEuMDEuMDUgIFN0YXJ0ZWQgdXNpbmcgTVBJX1BPSU5URVIuCisgKiAgICAgICAgICAgICAgICAgICAgICBGaXhlZCB2YWx1ZSBmb3IgTVBJX0RJQUdfUldfRU5BQkxFLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgZGVmaW5lcyBmb3IgTVBJX0RJQUdfUFJFVkVOVF9JT0NfQk9PVCBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgIE1QSV9ESUFHX0NMRUFSX0ZMQVNIX0JBRF9TSUcuCisgKiAgICAgICAgICAgICAgICAgICAgICBPYnNvbGV0ZWQgTVBJX0lPQ1NUQVRVU19UQVJHRVRfRkNfIGRlZmluZXMuCisgKiAgMDItMjctMDEgIDAxLjAxLjA2ICBSZW1vdmVkIE1QSV9IT1NUX0lOREVYX1JFR0lTVEVSIGRlZmluZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGZ1bmN0aW9uIGNvZGVzIGZvciBSQUlELgorICogIDA0LTA5LTAxICAwMS4wMS4wNyAgQWRkZWQgYWx0ZXJuYXRlIGRlZmluZSBmb3IgTVBJX0RPT1JCRUxMX0FDVElWRSwKKyAqICAgICAgICAgICAgICAgICAgICAgIE1QSV9ET09SQkVMTF9VU0VELCB0byBiZXR0ZXIgbWF0Y2ggdGhlIHNwZWMuCisgKiAgMDgtMDgtMDEgIDAxLjAyLjAxICBPcmlnaW5hbCByZWxlYXNlIGZvciB2MS4yIHdvcmsuCisgKiAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkIE1QSV9WRVJTSU9OX01JTk9SIGZyb20gMHgwMSB0byAweDAyLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgZGVmaW5lIE1QSV9GVU5DVElPTl9UT09MQk9YLgorICogIDA5LTI4LTAxICAwMS4wMi4wMiAgTmV3IGZ1bmN0aW9uIGNvZGUgTVBJX1NDU0lfRU5DTE9TVVJFX1BST0NFU1NPUi4KKyAqICAxMS0wMS0wMSAgMDEuMDIuMDMgIENoYW5nZWQgbmFtZSB0byBNUElfRlVOQ1RJT05fU0NTSV9FTkNMT1NVUkVfUFJPQ0VTU09SLgorICogIDAzLTE0LTAyICAwMS4wMi4wNCAgQWRkZWQgTVBJX0hFQURFUl9WRVJTSU9OXyBkZWZpbmVzLgorICogIDA1LTMxLTAyICAwMS4wMi4wNSAgQnVtcGVkIE1QSV9IRUFERVJfVkVSU0lPTl9VTklULgorICogIDA3LTEyLTAyICAwMS4wMi4wNiAgQWRkZWQgZGVmaW5lIGZvciBNUElfRlVOQ1RJT05fTUFJTEJPWC4KKyAqICAwOS0xNi0wMiAgMDEuMDIuMDcgIEJ1bXBlZCB2YWx1ZSBmb3IgTVBJX0hFQURFUl9WRVJTSU9OX1VOSVQuCisgKiAgMTEtMTUtMDIgIDAxLjAyLjA4ICBBZGRlZCBkZWZpbmUgTVBJX0lPQ1NUQVRVU19UQVJHRVRfSU5WQUxJRF9JT19JTkRFWCBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgIG9ic29sZXRlZCBkZWZpbmUgTVBJX0lPQ1NUQVRVU19UQVJHRVRfSU5WQUxJRF9JT0NJTkRFWC4KKyAqICAwNC0wMS0wMyAgMDEuMDIuMDkgIE5ldyBJT0NTdGF0dXMgY29kZTogTVBJX0lPQ1NUQVRVU19GQ19FWENIQU5HRV9DQU5DRUxFRAorICogIDA2LTI2LTAzICAwMS4wMi4xMCAgQnVtcGVkIE1QSV9IRUFERVJfVkVSU0lPTl9VTklUIHZhbHVlLgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBNUElfSAorI2RlZmluZSBNUElfSAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgTSBQIEkgICAgViBlIHIgcyBpIG8gbiAgICBEIGUgZiBpIG4gaSB0IGkgbyBuIHMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1QSV9WRVJTSU9OX01BSk9SICAgICAgICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfVkVSU0lPTl9NSU5PUiAgICAgICAgICAgICAgICAgICAoMHgwNSkKKyNkZWZpbmUgTVBJX1ZFUlNJT05fTUFKT1JfTUFTSyAgICAgICAgICAgICAgKDB4RkYwMCkKKyNkZWZpbmUgTVBJX1ZFUlNJT05fTUFKT1JfU0hJRlQgICAgICAgICAgICAgKDgpCisjZGVmaW5lIE1QSV9WRVJTSU9OX01JTk9SX01BU0sgICAgICAgICAgICAgICgweDAwRkYpCisjZGVmaW5lIE1QSV9WRVJTSU9OX01JTk9SX1NISUZUICAgICAgICAgICAgICgwKQorI2RlZmluZSBNUElfVkVSU0lPTiAoKE1QSV9WRVJTSU9OX01BSk9SIDw8IE1QSV9WRVJTSU9OX01BSk9SX1NISUZUKSB8ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUElfVkVSU0lPTl9NSU5PUikKKworI2RlZmluZSBNUElfVkVSU0lPTl8wMV8wMCAgICAgICAgICAgICAgICAgICAoMHgwMTAwKQorI2RlZmluZSBNUElfVkVSU0lPTl8wMV8wMSAgICAgICAgICAgICAgICAgICAoMHgwMTAxKQorI2RlZmluZSBNUElfVkVSU0lPTl8wMV8wMiAgICAgICAgICAgICAgICAgICAoMHgwMTAyKQorI2RlZmluZSBNUElfVkVSU0lPTl8wMV8wMyAgICAgICAgICAgICAgICAgICAoMHgwMTAzKQorI2RlZmluZSBNUElfVkVSU0lPTl8wMV8wNSAgICAgICAgICAgICAgICAgICAoMHgwMTA1KQorLyogTm90ZTogVGhlIG1ham9yIHZlcnNpb25zIG9mIDB4ZTAgdGhyb3VnaCAweGZmIGFyZSByZXNlcnZlZCAqLworCisvKiB2ZXJzaW9uaW5nIGZvciB0aGlzIE1QSSBoZWFkZXIgc2V0ICovCisjZGVmaW5lIE1QSV9IRUFERVJfVkVSU0lPTl9VTklUICAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUElfSEVBREVSX1ZFUlNJT05fREVWICAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX0hFQURFUl9WRVJTSU9OX1VOSVRfTUFTSyAgICAgICAgKDB4RkYwMCkKKyNkZWZpbmUgTVBJX0hFQURFUl9WRVJTSU9OX1VOSVRfU0hJRlQgICAgICAgKDgpCisjZGVmaW5lIE1QSV9IRUFERVJfVkVSU0lPTl9ERVZfTUFTSyAgICAgICAgICgweDAwRkYpCisjZGVmaW5lIE1QSV9IRUFERVJfVkVSU0lPTl9ERVZfU0hJRlQgICAgICAgICgwKQorI2RlZmluZSBNUElfSEVBREVSX1ZFUlNJT04gKChNUElfSEVBREVSX1ZFUlNJT05fVU5JVCA8PCA4KSB8IE1QSV9IRUFERVJfVkVSU0lPTl9ERVYpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgSSBPIEMgICAgUyB0IGEgdCBlICAgIEQgZSBmIGkgbiBpIHQgaSBvIG4gcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVBJX0lPQ19TVEFURV9SRVNFVCAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIE1QSV9JT0NfU1RBVEVfUkVBRFkgICAgICAgICAgICAgICAgICgweDEwMDAwMDAwKQorI2RlZmluZSBNUElfSU9DX1NUQVRFX09QRVJBVElPTkFMICAgICAgICAgICAoMHgyMDAwMDAwMCkKKyNkZWZpbmUgTVBJX0lPQ19TVEFURV9GQVVMVCAgICAgICAgICAgICAgICAgKDB4NDAwMDAwMDApCisKKyNkZWZpbmUgTVBJX0lPQ19TVEFURV9NQVNLICAgICAgICAgICAgICAgICAgKDB4RjAwMDAwMDApCisjZGVmaW5lIE1QSV9JT0NfU1RBVEVfU0hJRlQgICAgICAgICAgICAgICAgICgyOCkKKworLyogRmF1bHQgc3RhdGUgY29kZXMgKHByb2R1Y3QgaW5kZXBlbmRlbnQgcmFuZ2UgMHg4MDAwLTB4RkZGRikgKi8KKworI2RlZmluZSBNUElfRkFVTFRfUkVRVUVTVF9NRVNTQUdFX1BDSV9QQVJJVFlfRVJST1IgICgweDgxMTEpCisjZGVmaW5lIE1QSV9GQVVMVF9SRVFVRVNUX01FU1NBR0VfUENJX0JVU19GQVVMVCAgICAgKDB4ODExMikKKyNkZWZpbmUgTVBJX0ZBVUxUX1JFUExZX01FU1NBR0VfUENJX1BBUklUWV9FUlJPUiAgICAoMHg4MTEzKQorI2RlZmluZSBNUElfRkFVTFRfUkVQTFlfTUVTU0FHRV9QQ0lfQlVTX0ZBVUxUICAgICAgICgweDgxMTQpCisjZGVmaW5lIE1QSV9GQVVMVF9EQVRBX1NFTkRfUENJX1BBUklUWV9FUlJPUiAgICAgICAgKDB4ODExNSkKKyNkZWZpbmUgTVBJX0ZBVUxUX0RBVEFfU0VORF9QQ0lfQlVTX0ZBVUxUICAgICAgICAgICAoMHg4MTE2KQorI2RlZmluZSBNUElfRkFVTFRfREFUQV9SRUNFSVZFX1BDSV9QQVJJVFlfRVJST1IgICAgICgweDgxMTcpCisjZGVmaW5lIE1QSV9GQVVMVF9EQVRBX1JFQ0VJVkVfUENJX0JVU19GQVVMVCAgICAgICAgKDB4ODExOCkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgIFAgQyBJICAgIFMgeSBzIHQgZSBtICAgIEkgbiB0IGUgciBmIGEgYyBlICAgIFIgZSBnIGkgcyB0IGUgciBzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUyB5IHMgdCBlIG0gICAgRCBvIG8gciBiIGUgbCBsICovCisjZGVmaW5lIE1QSV9ET09SQkVMTF9PRkZTRVQgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBNUElfRE9PUkJFTExfQUNUSVZFICAgICAgICAgICAgICAgICAoMHgwODAwMDAwMCkgLyogRG9vcmJlbGxVc2VkICovCisjZGVmaW5lIE1QSV9ET09SQkVMTF9VU0VEICAgICAgICAgICAgICAgICAgIChNUElfRE9PUkJFTExfQUNUSVZFKQorI2RlZmluZSBNUElfRE9PUkJFTExfQUNUSVZFX1NISUZUICAgICAgICAgICAoMjcpCisjZGVmaW5lIE1QSV9ET09SQkVMTF9XSE9fSU5JVF9NQVNLICAgICAgICAgICgweDA3MDAwMDAwKQorI2RlZmluZSBNUElfRE9PUkJFTExfV0hPX0lOSVRfU0hJRlQgICAgICAgICAoMjQpCisjZGVmaW5lIE1QSV9ET09SQkVMTF9GVU5DVElPTl9NQVNLICAgICAgICAgICgweEZGMDAwMDAwKQorI2RlZmluZSBNUElfRE9PUkJFTExfRlVOQ1RJT05fU0hJRlQgICAgICAgICAoMjQpCisjZGVmaW5lIE1QSV9ET09SQkVMTF9BRERfRFdPUkRTX01BU0sgICAgICAgICgweDAwRkYwMDAwKQorI2RlZmluZSBNUElfRE9PUkJFTExfQUREX0RXT1JEU19TSElGVCAgICAgICAoMTYpCisjZGVmaW5lIE1QSV9ET09SQkVMTF9EQVRBX01BU0sgICAgICAgICAgICAgICgweDAwMDBGRkZGKQorCisKKyNkZWZpbmUgTVBJX1dSSVRFX1NFUVVFTkNFX09GRlNFVCAgICAgICAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIE1QSV9XUlNFUV9LRVlfVkFMVUVfTUFTSyAgICAgICAgICAgICgweDAwMDAwMDBGKQorI2RlZmluZSBNUElfV1JTRVFfMVNUX0tFWV9WQUxVRSAgICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTVBJX1dSU0VRXzJORF9LRVlfVkFMVUUgICAgICAgICAgICAgKDB4MEIpCisjZGVmaW5lIE1QSV9XUlNFUV8zUkRfS0VZX1ZBTFVFICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfV1JTRVFfNFRIX0tFWV9WQUxVRSAgICAgICAgICAgICAoMHgwNykKKyNkZWZpbmUgTVBJX1dSU0VRXzVUSF9LRVlfVkFMVUUgICAgICAgICAgICAgKDB4MEQpCisKKyNkZWZpbmUgTVBJX0RJQUdOT1NUSUNfT0ZGU0VUICAgICAgICAgICAgICAgKDB4MDAwMDAwMDgpCisjZGVmaW5lIE1QSV9ESUFHX0NMRUFSX0ZMQVNIX0JBRF9TSUcgICAgICAgICgweDAwMDAwNDAwKQorI2RlZmluZSBNUElfRElBR19QUkVWRU5UX0lPQ19CT09UICAgICAgICAgICAoMHgwMDAwMDIwMCkKKyNkZWZpbmUgTVBJX0RJQUdfRFJXRSAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwODApCisjZGVmaW5lIE1QSV9ESUFHX0ZMQVNIX0JBRF9TSUcgICAgICAgICAgICAgICgweDAwMDAwMDQwKQorI2RlZmluZSBNUElfRElBR19SRVNFVF9ISVNUT1JZICAgICAgICAgICAgICAoMHgwMDAwMDAyMCkKKyNkZWZpbmUgTVBJX0RJQUdfUldfRU5BQkxFICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMTApCisjZGVmaW5lIE1QSV9ESUFHX1JFU0VUX0FEQVBURVIgICAgICAgICAgICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBNUElfRElBR19ESVNBQkxFX0FSTSAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgTVBJX0RJQUdfTUVNX0VOQUJMRSAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDEpCisKKyNkZWZpbmUgTVBJX1RFU1RfQkFTRV9BRERSRVNTX09GRlNFVCAgICAgICAgKDB4MDAwMDAwMEMpCisKKyNkZWZpbmUgTVBJX0RJQUdfUldfREFUQV9PRkZTRVQgICAgICAgICAgICAgKDB4MDAwMDAwMTApCisKKyNkZWZpbmUgTVBJX0RJQUdfUldfQUREUkVTU19PRkZTRVQgICAgICAgICAgKDB4MDAwMDAwMTQpCisKKyNkZWZpbmUgTVBJX0hPU1RfSU5URVJSVVBUX1NUQVRVU19PRkZTRVQgICAgKDB4MDAwMDAwMzApCisjZGVmaW5lIE1QSV9ISVNfSU9QX0RPT1JCRUxMX1NUQVRVUyAgICAgICAgICgweDgwMDAwMDAwKQorI2RlZmluZSBNUElfSElTX1JFUExZX01FU1NBR0VfSU5URVJSVVBUICAgICAoMHgwMDAwMDAwOCkKKyNkZWZpbmUgTVBJX0hJU19ET09SQkVMTF9JTlRFUlJVUFQgICAgICAgICAgKDB4MDAwMDAwMDEpCisKKyNkZWZpbmUgTVBJX0hPU1RfSU5URVJSVVBUX01BU0tfT0ZGU0VUICAgICAgKDB4MDAwMDAwMzQpCisjZGVmaW5lIE1QSV9ISU1fUklNICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBNUElfSElNX0RJTSAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMSkKKworI2RlZmluZSBNUElfUkVRVUVTVF9RVUVVRV9PRkZTRVQgICAgICAgICAgICAoMHgwMDAwMDA0MCkKKyNkZWZpbmUgTVBJX1JFUVVFU1RfUE9TVF9GSUZPX09GRlNFVCAgICAgICAgKDB4MDAwMDAwNDApCisKKyNkZWZpbmUgTVBJX1JFUExZX1FVRVVFX09GRlNFVCAgICAgICAgICAgICAgKDB4MDAwMDAwNDQpCisjZGVmaW5lIE1QSV9SRVBMWV9QT1NUX0ZJRk9fT0ZGU0VUICAgICAgICAgICgweDAwMDAwMDQ0KQorI2RlZmluZSBNUElfUkVQTFlfRlJFRV9GSUZPX09GRlNFVCAgICAgICAgICAoMHgwMDAwMDA0NCkKKworI2RlZmluZSBNUElfSElfUFJJX1JFUVVFU1RfUVVFVUVfT0ZGU0VUICAgICAoMHgwMDAwMDA0OCkKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgTSBlIHMgcyBhIGcgZSAgICBGIHIgYSBtIGUgICAgRCBlIHMgYyByIGkgcCB0IG8gciBzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNUElfUkVRX01GX0RFU0NSSVBUT1JfTkJfTUFTSyAgICAgICAoMHgwMDAwMDAwMykKKyNkZWZpbmUgTVBJX1JFUV9NRl9ERVNDUklQVE9SX0ZfQklUICAgICAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIE1QSV9SRVFfTUZfREVTQ1JJUFRPUl9BRERSRVNTX01BU0sgICgweEZGRkZGRkY4KQorCisjZGVmaW5lIE1QSV9BRERSRVNTX1JFUExZX0FfQklUICAgICAgICAgICAgICgweDgwMDAwMDAwKQorI2RlZmluZSBNUElfQUREUkVTU19SRVBMWV9BRERSRVNTX01BU0sgICAgICAoMHg3RkZGRkZGRikKKworI2RlZmluZSBNUElfQ09OVEVYVF9SRVBMWV9BX0JJVCAgICAgICAgICAgICAoMHg4MDAwMDAwMCkKKyNkZWZpbmUgTVBJX0NPTlRFWFRfUkVQTFlfVFlQRV9NQVNLICAgICAgICAgKDB4NjAwMDAwMDApCisjZGVmaW5lIE1QSV9DT05URVhUX1JFUExZX1RZUEVfU0NTSV9JTklUICAgICgweDAwKQorI2RlZmluZSBNUElfQ09OVEVYVF9SRVBMWV9UWVBFX1NDU0lfVEFSR0VUICAoMHgwMSkKKyNkZWZpbmUgTVBJX0NPTlRFWFRfUkVQTFlfVFlQRV9MQU4gICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9DT05URVhUX1JFUExZX1RZUEVfU0hJRlQgICAgICAgICgyOSkKKyNkZWZpbmUgTVBJX0NPTlRFWFRfUkVQTFlfQ09OVEVYVF9NQVNLICAgICAgKDB4MUZGRkZGRkYpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDb250ZXh0IFJlcGx5IG1hY3JvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1QSV9HRVRfQ09OVEVYVF9SRVBMWV9UWVBFKHgpICAoKCh4KSAmIE1QSV9DT05URVhUX1JFUExZX1RZUEVfTUFTSykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gTVBJX0NPTlRFWFRfUkVQTFlfVFlQRV9TSElGVCkKKworI2RlZmluZSBNUElfU0VUX0NPTlRFWFRfUkVQTFlfVFlQRSh4LCB0eXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICgoeCkgPSAoKHgpICYgfk1QSV9DT05URVhUX1JFUExZX1RZUEVfTUFTSykgfCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodHlwKSA8PCBNUElfQ09OVEVYVF9SRVBMWV9UWVBFX1NISUZUKSAmICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QSV9DT05URVhUX1JFUExZX1RZUEVfTUFTSykpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICBNIGUgcyBzIGEgZyBlICAgIEYgdSBuIGMgdCBpIG8gbiBzCisqICAgICAgICAgICAgICAweDgwIC0+IDB4OEYgcmVzZXJ2ZWQgZm9yIHByaXZhdGUgbWVzc2FnZSB1c2UgcGVyIHByb2R1Y3QKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1QSV9GVU5DVElPTl9TQ1NJX0lPX1JFUVVFU1QgICAgICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSV9GVU5DVElPTl9TQ1NJX1RBU0tfTUdNVCAgICAgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSV9GVU5DVElPTl9JT0NfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9GVU5DVElPTl9JT0NfRkFDVFMgICAgICAgICAgICAgICAgICAgICAgKDB4MDMpCisjZGVmaW5lIE1QSV9GVU5DVElPTl9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9GVU5DVElPTl9QT1JUX0ZBQ1RTICAgICAgICAgICAgICAgICAgICAgKDB4MDUpCisjZGVmaW5lIE1QSV9GVU5DVElPTl9QT1JUX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgKDB4MDYpCisjZGVmaW5lIE1QSV9GVU5DVElPTl9FVkVOVF9OT1RJRklDQVRJT04gICAgICAgICAgICAgKDB4MDcpCisjZGVmaW5lIE1QSV9GVU5DVElPTl9FVkVOVF9BQ0sgICAgICAgICAgICAgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1QSV9GVU5DVElPTl9GV19ET1dOTE9BRCAgICAgICAgICAgICAgICAgICAgKDB4MDkpCisjZGVmaW5lIE1QSV9GVU5DVElPTl9UQVJHRVRfQ01EX0JVRkZFUl9QT1NUICAgICAgICAgKDB4MEEpCisjZGVmaW5lIE1QSV9GVU5DVElPTl9UQVJHRVRfQVNTSVNUICAgICAgICAgICAgICAgICAgKDB4MEIpCisjZGVmaW5lIE1QSV9GVU5DVElPTl9UQVJHRVRfU1RBVFVTX1NFTkQgICAgICAgICAgICAgKDB4MEMpCisjZGVmaW5lIE1QSV9GVU5DVElPTl9UQVJHRVRfTU9ERV9BQk9SVCAgICAgICAgICAgICAgKDB4MEQpCisjZGVmaW5lIE1QSV9GVU5DVElPTl9GQ19MSU5LX1NSVkNfQlVGX1BPU1QgICAgICAgICAgKDB4MEUpCisjZGVmaW5lIE1QSV9GVU5DVElPTl9GQ19MSU5LX1NSVkNfUlNQICAgICAgICAgICAgICAgKDB4MEYpCisjZGVmaW5lIE1QSV9GVU5DVElPTl9GQ19FWF9MSU5LX1NSVkNfU0VORCAgICAgICAgICAgKDB4MTApCisjZGVmaW5lIE1QSV9GVU5DVElPTl9GQ19BQk9SVCAgICAgICAgICAgICAgICAgICAgICAgKDB4MTEpCisjZGVmaW5lIE1QSV9GVU5DVElPTl9GV19VUExPQUQgICAgICAgICAgICAgICAgICAgICAgKDB4MTIpCisjZGVmaW5lIE1QSV9GVU5DVElPTl9GQ19DT01NT05fVFJBTlNQT1JUX1NFTkQgICAgICAgKDB4MTMpCisjZGVmaW5lIE1QSV9GVU5DVElPTl9GQ19QUklNSVRJVkVfU0VORCAgICAgICAgICAgICAgKDB4MTQpCisKKyNkZWZpbmUgTVBJX0ZVTkNUSU9OX1JBSURfQUNUSU9OICAgICAgICAgICAgICAgICAgICAoMHgxNSkKKyNkZWZpbmUgTVBJX0ZVTkNUSU9OX1JBSURfU0NTSV9JT19QQVNTVEhST1VHSCAgICAgICAoMHgxNikKKworI2RlZmluZSBNUElfRlVOQ1RJT05fVE9PTEJPWCAgICAgICAgICAgICAgICAgICAgICAgICgweDE3KQorCisjZGVmaW5lIE1QSV9GVU5DVElPTl9TQ1NJX0VOQ0xPU1VSRV9QUk9DRVNTT1IgICAgICAgKDB4MTgpCisKKyNkZWZpbmUgTVBJX0ZVTkNUSU9OX01BSUxCT1ggICAgICAgICAgICAgICAgICAgICAgICAoMHgxOSkKKworI2RlZmluZSBNUElfRlVOQ1RJT05fU01QX1BBU1NUSFJPVUdIICAgICAgICAgICAgICAgICgweDFBKQorI2RlZmluZSBNUElfRlVOQ1RJT05fU0FTX0lPX1VOSVRfQ09OVFJPTCAgICAgICAgICAgICgweDFCKQorCisjZGVmaW5lIE1QSV9ESUFHX0JVRkZFUl9QT1NUICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUQpCisjZGVmaW5lIE1QSV9ESUFHX1JFTEVBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MUUpCisKKyNkZWZpbmUgTVBJX0ZVTkNUSU9OX1NDU0lfSU9fMzIgICAgICAgICAgICAgICAgICAgICAoMHgxRikKKworI2RlZmluZSBNUElfRlVOQ1RJT05fTEFOX1NFTkQgICAgICAgICAgICAgICAgICAgICAgICgweDIwKQorI2RlZmluZSBNUElfRlVOQ1RJT05fTEFOX1JFQ0VJVkUgICAgICAgICAgICAgICAgICAgICgweDIxKQorI2RlZmluZSBNUElfRlVOQ1RJT05fTEFOX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICgweDIyKQorCisjZGVmaW5lIE1QSV9GVU5DVElPTl9JTkJBTkRfQlVGRkVSX1BPU1QgICAgICAgICAgICAgKDB4MjgpCisjZGVmaW5lIE1QSV9GVU5DVElPTl9JTkJBTkRfU0VORCAgICAgICAgICAgICAgICAgICAgKDB4MjkpCisjZGVmaW5lIE1QSV9GVU5DVElPTl9JTkJBTkRfUlNQICAgICAgICAgICAgICAgICAgICAgKDB4MkEpCisjZGVmaW5lIE1QSV9GVU5DVElPTl9JTkJBTkRfQUJPUlQgICAgICAgICAgICAgICAgICAgKDB4MkIpCisKKyNkZWZpbmUgTVBJX0ZVTkNUSU9OX0lPQ19NRVNTQUdFX1VOSVRfUkVTRVQgICAgICAgICAoMHg0MCkKKyNkZWZpbmUgTVBJX0ZVTkNUSU9OX0lPX1VOSVRfUkVTRVQgICAgICAgICAgICAgICAgICAoMHg0MSkKKyNkZWZpbmUgTVBJX0ZVTkNUSU9OX0hBTkRTSEFLRSAgICAgICAgICAgICAgICAgICAgICAoMHg0MikKKyNkZWZpbmUgTVBJX0ZVTkNUSU9OX1JFUExZX0ZSQU1FX1JFTU9WQUwgICAgICAgICAgICAoMHg0MykKKworCisvKiBzdGFuZGFyZCB2ZXJzaW9uIGZvcm1hdCAqLwordHlwZWRlZiBzdHJ1Y3QgX01QSV9WRVJTSU9OX1NUUlVDVAoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIERldjsgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBVbml0OyAgICAgICAgICAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTWlub3I7ICAgICAgICAgICAgICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1ham9yOyAgICAgICAgICAgICAgICAgICAgICAvKiAwM2ggKi8KK30gTVBJX1ZFUlNJT05fU1RSVUNULCBNUElfUE9JTlRFUiBQVFJfTVBJX1ZFUlNJT05fU1RSVUNULAorICBNcGlWZXJzaW9uU3RydWN0X3QsIE1QSV9QT0lOVEVSIHBNcGlWZXJzaW9uU3RydWN0OworCit0eXBlZGVmIHVuaW9uIF9NUElfVkVSU0lPTl9GT1JNQVQKK3sKKyAgICBNUElfVkVSU0lPTl9TVFJVQ1QgICAgICBTdHJ1Y3Q7CisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgV29yZDsKK30gTVBJX1ZFUlNJT05fRk9STUFULCBNUElfUE9JTlRFUiBQVFJfTVBJX1ZFUlNJT05fRk9STUFULAorICBNcGlWZXJzaW9uRm9ybWF0X3QsIE1QSV9QT0lOVEVSIHBNcGlWZXJzaW9uRm9ybWF0X3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICBTIGMgYSB0IHQgZSByICAgIEcgYSB0IGggZSByICAgIEUgbCBlIG0gZSBuIHQgcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFNpbXBsZSBlbGVtZW50IHN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1NHRV9TSU1QTEUzMgoreworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEZsYWdzTGVuZ3RoOworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3M7Cit9IFNHRV9TSU1QTEUzMiwgTVBJX1BPSU5URVIgUFRSX1NHRV9TSU1QTEUzMiwKKyAgU0dFU2ltcGxlMzJfdCwgTVBJX1BPSU5URVIgcFNHRVNpbXBsZTMyX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9TR0VfU0lNUExFNjQKK3sKKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBGbGFnc0xlbmd0aDsKKyAgICBVNjQgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzOworfSBTR0VfU0lNUExFNjQsIE1QSV9QT0lOVEVSIFBUUl9TR0VfU0lNUExFNjQsCisgIFNHRVNpbXBsZTY0X3QsIE1QSV9QT0lOVEVSIHBTR0VTaW1wbGU2NF90OworCit0eXBlZGVmIHN0cnVjdCBfU0dFX1NJTVBMRV9VTklPTgoreworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEZsYWdzTGVuZ3RoOworICAgIHVuaW9uCisgICAgeworICAgICAgICBVMzIgICAgICAgICAgICAgICAgIEFkZHJlc3MzMjsKKyAgICAgICAgVTY0ICAgICAgICAgICAgICAgICBBZGRyZXNzNjQ7CisgICAgfXU7Cit9IFNHRVNpbXBsZVVuaW9uX3QsIE1QSV9QT0lOVEVSIHBTR0VTaW1wbGVVbmlvbl90LAorICBTR0VfU0lNUExFX1VOSU9OLCBNUElfUE9JTlRFUiBQVFJfU0dFX1NJTVBMRV9VTklPTjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgQ2hhaW4gZWxlbWVudCBzdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfU0dFX0NIQUlOMzIKK3sKKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBMZW5ndGg7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTmV4dENoYWluT2Zmc2V0OworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZsYWdzOworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3M7Cit9IFNHRV9DSEFJTjMyLCBNUElfUE9JTlRFUiBQVFJfU0dFX0NIQUlOMzIsCisgIFNHRUNoYWluMzJfdCwgTVBJX1BPSU5URVIgcFNHRUNoYWluMzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX1NHRV9DSEFJTjY0Cit7CisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoOworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE5leHRDaGFpbk9mZnNldDsKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGbGFnczsKKyAgICBVNjQgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzOworfSBTR0VfQ0hBSU42NCwgTVBJX1BPSU5URVIgUFRSX1NHRV9DSEFJTjY0LAorICBTR0VDaGFpbjY0X3QsIE1QSV9QT0lOVEVSIHBTR0VDaGFpbjY0X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9TR0VfQ0hBSU5fVU5JT04KK3sKKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBMZW5ndGg7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTmV4dENoYWluT2Zmc2V0OworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZsYWdzOworICAgIHVuaW9uCisgICAgeworICAgICAgICBVMzIgICAgICAgICAgICAgICAgIEFkZHJlc3MzMjsKKyAgICAgICAgVTY0ICAgICAgICAgICAgICAgICBBZGRyZXNzNjQ7CisgICAgfXU7Cit9IFNHRV9DSEFJTl9VTklPTiwgTVBJX1BPSU5URVIgUFRSX1NHRV9DSEFJTl9VTklPTiwKKyAgU0dFQ2hhaW5Vbmlvbl90LCBNUElfUE9JTlRFUiBwU0dFQ2hhaW5Vbmlvbl90OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBUcmFuc2FjdGlvbiBDb250ZXh0IGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9TR0VfVFJBTlNBQ1RJT04zMgoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENvbnRleHRTaXplOworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIERldGFpbHNMZW5ndGg7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRmxhZ3M7CisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25Db250ZXh0WzFdOworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uRGV0YWlsc1sxXTsKK30gU0dFX1RSQU5TQUNUSU9OMzIsIE1QSV9QT0lOVEVSIFBUUl9TR0VfVFJBTlNBQ1RJT04zMiwKKyAgU0dFVHJhbnNhY3Rpb24zMl90LCBNUElfUE9JTlRFUiBwU0dFVHJhbnNhY3Rpb24zMl90OworCit0eXBlZGVmIHN0cnVjdCBfU0dFX1RSQU5TQUNUSU9ONjQKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0U2l6ZTsKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBEZXRhaWxzTGVuZ3RoOworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZsYWdzOworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uQ29udGV4dFsyXTsKKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbkRldGFpbHNbMV07Cit9IFNHRV9UUkFOU0FDVElPTjY0LCBNUElfUE9JTlRFUiBQVFJfU0dFX1RSQU5TQUNUSU9ONjQsCisgIFNHRVRyYW5zYWN0aW9uNjRfdCwgTVBJX1BPSU5URVIgcFNHRVRyYW5zYWN0aW9uNjRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX1NHRV9UUkFOU0FDVElPTjk2Cit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ29udGV4dFNpemU7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRGV0YWlsc0xlbmd0aDsKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGbGFnczsKKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbkNvbnRleHRbM107CisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25EZXRhaWxzWzFdOworfSBTR0VfVFJBTlNBQ1RJT045NiwgTVBJX1BPSU5URVIgUFRSX1NHRV9UUkFOU0FDVElPTjk2LAorICBTR0VUcmFuc2FjdGlvbjk2X3QsIE1QSV9QT0lOVEVSIHBTR0VUcmFuc2FjdGlvbjk2X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9TR0VfVFJBTlNBQ1RJT04xMjgKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0U2l6ZTsKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBEZXRhaWxzTGVuZ3RoOworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZsYWdzOworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uQ29udGV4dFs0XTsKKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbkRldGFpbHNbMV07Cit9IFNHRV9UUkFOU0FDVElPTjEyOCwgTVBJX1BPSU5URVIgUFRSX1NHRV9UUkFOU0FDVElPTjEyOCwKKyAgU0dFVHJhbnNhY3Rpb25fdDEyOCwgTVBJX1BPSU5URVIgcFNHRVRyYW5zYWN0aW9uX3QxMjg7CisKK3R5cGVkZWYgc3RydWN0IF9TR0VfVFJBTlNBQ1RJT05fVU5JT04KK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0U2l6ZTsKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBEZXRhaWxzTGVuZ3RoOworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZsYWdzOworICAgIHVuaW9uCisgICAgeworICAgICAgICBVMzIgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uQ29udGV4dDMyWzFdOworICAgICAgICBVMzIgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uQ29udGV4dDY0WzJdOworICAgICAgICBVMzIgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uQ29udGV4dDk2WzNdOworICAgICAgICBVMzIgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uQ29udGV4dDEyOFs0XTsKKyAgICB9dTsKKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbkRldGFpbHNbMV07Cit9IFNHRV9UUkFOU0FDVElPTl9VTklPTiwgTVBJX1BPSU5URVIgUFRSX1NHRV9UUkFOU0FDVElPTl9VTklPTiwKKyAgU0dFVHJhbnNhY3Rpb25Vbmlvbl90LCBNUElfUE9JTlRFUiBwU0dFVHJhbnNhY3Rpb25Vbmlvbl90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFNHRSBJTyB0eXBlcyB1bmlvbiAgZm9yIElPIFNHTCdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1NHRV9JT19VTklPTgoreworICAgIHVuaW9uCisgICAgeworICAgICAgICBTR0VfU0lNUExFX1VOSU9OICAgIFNpbXBsZTsKKyAgICAgICAgU0dFX0NIQUlOX1VOSU9OICAgICBDaGFpbjsKKyAgICB9IHU7Cit9IFNHRV9JT19VTklPTiwgTVBJX1BPSU5URVIgUFRSX1NHRV9JT19VTklPTiwKKyAgU0dFSU9Vbmlvbl90LCBNUElfUE9JTlRFUiBwU0dFSU9Vbmlvbl90OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBTR0UgdW5pb24gZm9yIFNHTCdzIHdpdGggU2ltcGxlIGFuZCBUcmFuc2FjdGlvbiBlbGVtZW50cyAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9TR0VfVFJBTlNfU0lNUExFX1VOSU9OCit7CisgICAgdW5pb24KKyAgICB7CisgICAgICAgIFNHRV9TSU1QTEVfVU5JT04gICAgICAgIFNpbXBsZTsKKyAgICAgICAgU0dFX1RSQU5TQUNUSU9OX1VOSU9OICAgVHJhbnNhY3Rpb247CisgICAgfSB1OworfSBTR0VfVFJBTlNfU0lNUExFX1VOSU9OLCBNUElfUE9JTlRFUiBQVFJfU0dFX1RSQU5TX1NJTVBMRV9VTklPTiwKKyAgU0dFVHJhbnNTaW1wbGVVbmlvbl90LCBNUElfUE9JTlRFUiBwU0dFVHJhbnNTaW1wbGVVbmlvbl90OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBBbGwgU0dFIHR5cGVzIHVuaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9TR0VfTVBJX1VOSU9OCit7CisgICAgdW5pb24KKyAgICB7CisgICAgICAgIFNHRV9TSU1QTEVfVU5JT04gICAgICAgIFNpbXBsZTsKKyAgICAgICAgU0dFX0NIQUlOX1VOSU9OICAgICAgICAgQ2hhaW47CisgICAgICAgIFNHRV9UUkFOU0FDVElPTl9VTklPTiAgIFRyYW5zYWN0aW9uOworICAgIH0gdTsKK30gU0dFX01QSV9VTklPTiwgTVBJX1BPSU5URVIgUFRSX1NHRV9NUElfVU5JT04sCisgIE1QSV9TR0VfVU5JT05fdCwgTVBJX1BPSU5URVIgcE1QSV9TR0VfVU5JT05fdCwKKyAgU0dFQWxsVW5pb25fdCwgTVBJX1BPSU5URVIgcFNHRUFsbFVuaW9uX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgU0dFIGZpZWxkIGRlZmluaXRpb24gYW5kIG1hc2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGbGFncyBmaWVsZCBiaXQgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBNUElfU0dFX0ZMQUdTX0xBU1RfRUxFTUVOVCAgICAgICAgICAgICAgKDB4ODApCisjZGVmaW5lIE1QSV9TR0VfRkxBR1NfRU5EX09GX0JVRkZFUiAgICAgICAgICAgICAoMHg0MCkKKyNkZWZpbmUgTVBJX1NHRV9GTEFHU19FTEVNRU5UX1RZUEVfTUFTSyAgICAgICAgICgweDMwKQorI2RlZmluZSBNUElfU0dFX0ZMQUdTX0xPQ0FMX0FERFJFU1MgICAgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1QSV9TR0VfRkxBR1NfRElSRUNUSU9OICAgICAgICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTVBJX1NHRV9GTEFHU19BRERSRVNTX1NJWkUgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfU0dFX0ZMQUdTX0VORF9PRl9MSVNUICAgICAgICAgICAgICAgKDB4MDEpCisKKyNkZWZpbmUgTVBJX1NHRV9GTEFHU19TSElGVCAgICAgICAgICAgICAgICAgICAgICgyNCkKKworI2RlZmluZSBNUElfU0dFX0xFTkdUSF9NQVNLICAgICAgICAgICAgICAgICAgICAgKDB4MDBGRkZGRkYpCisjZGVmaW5lIE1QSV9TR0VfQ0hBSU5fTEVOR1RIX01BU0sgICAgICAgICAgICAgICAoMHgwMDAwRkZGRikKKworLyogRWxlbWVudCBUeXBlICovCisKKyNkZWZpbmUgTVBJX1NHRV9GTEFHU19UUkFOU0FDVElPTl9FTEVNRU5UICAgICAgICgweDAwKQorI2RlZmluZSBNUElfU0dFX0ZMQUdTX1NJTVBMRV9FTEVNRU5UICAgICAgICAgICAgKDB4MTApCisjZGVmaW5lIE1QSV9TR0VfRkxBR1NfQ0hBSU5fRUxFTUVOVCAgICAgICAgICAgICAoMHgzMCkKKyNkZWZpbmUgTVBJX1NHRV9GTEFHU19FTEVNRU5UX01BU0sgICAgICAgICAgICAgICgweDMwKQorCisvKiBBZGRyZXNzIGxvY2F0aW9uICovCisKKyNkZWZpbmUgTVBJX1NHRV9GTEFHU19TWVNURU1fQUREUkVTUyAgICAgICAgICAgICgweDAwKQorCisvKiBEaXJlY3Rpb24gKi8KKworI2RlZmluZSBNUElfU0dFX0ZMQUdTX0lPQ19UT19IT1NUICAgICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSV9TR0VfRkxBR1NfSE9TVF9UT19JT0MgICAgICAgICAgICAgICAoMHgwNCkKKworLyogQWRkcmVzcyBTaXplICovCisKKyNkZWZpbmUgTVBJX1NHRV9GTEFHU18zMl9CSVRfQUREUkVTU0lORyAgICAgICAgICgweDAwKQorI2RlZmluZSBNUElfU0dFX0ZMQUdTXzY0X0JJVF9BRERSRVNTSU5HICAgICAgICAgKDB4MDIpCisKKy8qIENvbnRleHQgU2l6ZSAqLworCisjZGVmaW5lIE1QSV9TR0VfRkxBR1NfMzJfQklUX0NPTlRFWFQgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX1NHRV9GTEFHU182NF9CSVRfQ09OVEVYVCAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfU0dFX0ZMQUdTXzk2X0JJVF9DT05URVhUICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9TR0VfRkxBR1NfMTI4X0JJVF9DT05URVhUICAgICAgICAgICAoMHgwNikKKworI2RlZmluZSBNUElfU0dFX0NIQUlOX09GRlNFVF9NQVNLICAgICAgICAgICAgICAgKDB4MDBGRjAwMDApCisjZGVmaW5lIE1QSV9TR0VfQ0hBSU5fT0ZGU0VUX1NISUZUICAgICAgICAgICAgICAoMTYpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgU0dFIG9wZXJhdGlvbiBNYWNyb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAvKiBTSU1QTEUgRmxhZ3NMZW5ndGggbWFuaXB1bGF0aW9ucy4uLiAqLworI2RlZmluZSAgTVBJX1NHRV9TRVRfRkxBR1MoZikgICAgICAgICAgICgoVTMyKShmKSA8PCBNUElfU0dFX0ZMQUdTX1NISUZUKQorI2RlZmluZSAgTVBJX1NHRV9HRVRfRkxBR1MoZmwpICAgICAgICAgICgoKGZsKSAmIH5NUElfU0dFX0xFTkdUSF9NQVNLKSA+PiBNUElfU0dFX0ZMQUdTX1NISUZUKQorI2RlZmluZSAgTVBJX1NHRV9MRU5HVEgoZmwpICAgICAgICAgICAgICgoZmwpICYgTVBJX1NHRV9MRU5HVEhfTUFTSykKKyNkZWZpbmUgIE1QSV9TR0VfQ0hBSU5fTEVOR1RIKGZsKSAgICAgICAoKGZsKSAmIE1QSV9TR0VfQ0hBSU5fTEVOR1RIX01BU0spCisKKyNkZWZpbmUgIE1QSV9TR0VfU0VUX0ZMQUdTX0xFTkdUSChmLGwpICAoTVBJX1NHRV9TRVRfRkxBR1MoZikgfCBNUElfU0dFX0xFTkdUSChsKSkKKworI2RlZmluZSAgTVBJX3BTR0VfR0VUX0ZMQUdTKHBzZykgICAgICAgIE1QSV9TR0VfR0VUX0ZMQUdTKChwc2cpLT5GbGFnc0xlbmd0aCkKKyNkZWZpbmUgIE1QSV9wU0dFX0dFVF9MRU5HVEgocHNnKSAgICAgICBNUElfU0dFX0xFTkdUSCgocHNnKS0+RmxhZ3NMZW5ndGgpCisjZGVmaW5lICBNUElfcFNHRV9TRVRfRkxBR1NfTEVOR1RIKHBzZyxmLGwpICAocHNnKS0+RmxhZ3NMZW5ndGggPSBNUElfU0dFX1NFVF9GTEFHU19MRU5HVEgoZixsKQorICAgICAgICAgLyogQ0FVVElPTiAtIFRoZSBmb2xsb3dpbmcgYXJlIFJFQUQtTU9ESUZZLVdSSVRFISAqLworI2RlZmluZSAgTVBJX3BTR0VfU0VUX0ZMQUdTKHBzZyxmKSAgICAgIChwc2cpLT5GbGFnc0xlbmd0aCB8PSBNUElfU0dFX1NFVF9GTEFHUyhmKQorI2RlZmluZSAgTVBJX3BTR0VfU0VUX0xFTkdUSChwc2csbCkgICAgIChwc2cpLT5GbGFnc0xlbmd0aCB8PSBNUElfU0dFX0xFTkdUSChsKQorCisjZGVmaW5lICBNUElfR0VUX0NIQUlOX09GRlNFVCh4KSAoKHgmTVBJX1NHRV9DSEFJTl9PRkZTRVRfTUFTSyk+Pk1QSV9TR0VfQ0hBSU5fT0ZGU0VUX1NISUZUKQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICBTIHQgYSBuIGQgYSByIGQgICAgTSBlIHMgcyBhIGcgZSAgICBTIHQgciB1IGMgdCB1IHIgZSBzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTdGFuZGFyZCBtZXNzYWdlIHJlcXVlc3QgaGVhZGVyIGZvciBhbGwgcmVxdWVzdCBtZXNzYWdlcyAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfTVNHX1JFUVVFU1RfSEVBREVSCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWRbMl07ICAgICAgLyogZnVuY3Rpb24gc3BlY2lmaWMgKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDaGFpbk9mZnNldDsKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDFbM107ICAgICAvKiBmdW5jdGlvbiBzcGVjaWZpYyAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7Cit9IE1TR19SRVFVRVNUX0hFQURFUiwgTVBJX1BPSU5URVIgUFRSX01TR19SRVFVRVNUX0hFQURFUiwKKyAgTVBJSGVhZGVyX3QsIE1QSV9QT0lOVEVSIHBNUElIZWFkZXJfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBEZWZhdWx0IFJlcGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfREVGQVVMVF9SRVBMWQoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkWzJdOyAgICAgIC8qIGZ1bmN0aW9uIHNwZWNpZmljICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnTGVuZ3RoOworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMVszXTsgICAgIC8qIGZ1bmN0aW9uIHNwZWNpZmljICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7CisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDJbMl07ICAgICAvKiBmdW5jdGlvbiBzcGVjaWZpYyAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIElPQ1N0YXR1czsKKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBJT0NMb2dJbmZvOworfSBNU0dfREVGQVVMVF9SRVBMWSwgTVBJX1BPSU5URVIgUFRSX01TR19ERUZBVUxUX1JFUExZLAorICBNUElEZWZhdWx0UmVwbHlfdCwgTVBJX1BPSU5URVIgcE1QSURlZmF1bHRSZXBseV90OworCisKKy8qIE1zZ0ZsYWdzIGRlZmluaXRpb24gZm9yIGFsbCByZXBsaWVzICovCisKKyNkZWZpbmUgTVBJX01TR0ZMQUdTX0NPTlRJTlVBVElPTl9SRVBMWSAgICAgICAgICgweDgwKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgIEkgTyBDICAgIFMgdCBhIHQgdSBzICAgViBhIGwgdSBlIHMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBDb21tb24gSU9DU3RhdHVzIHZhbHVlcyBmb3IgYWxsIHJlcGxpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgICgweDAwMDApCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfSU5WQUxJRF9GVU5DVElPTiAgICAgICAgICAoMHgwMDAxKQorI2RlZmluZSBNUElfSU9DU1RBVFVTX0JVU1kgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMikKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19JTlZBTElEX1NHTCAgICAgICAgICAgICAgICgweDAwMDMpCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfSU5URVJOQUxfRVJST1IgICAgICAgICAgICAoMHgwMDA0KQorI2RlZmluZSBNUElfSU9DU1RBVFVTX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgKDB4MDAwNSkKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTICAgICgweDAwMDYpCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfSU5WQUxJRF9GSUVMRCAgICAgICAgICAgICAoMHgwMDA3KQorI2RlZmluZSBNUElfSU9DU1RBVFVTX0lOVkFMSURfU1RBVEUgICAgICAgICAgICAgKDB4MDAwOCkKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19PUF9TVEFURV9OT1RfU1VQUE9SVEVEICAgICgweDAwMDkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIENvbmZpZyBJT0NTdGF0dXMgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNUElfSU9DU1RBVFVTX0NPTkZJR19JTlZBTElEX0FDVElPTiAgICAgKDB4MDAyMCkKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19DT05GSUdfSU5WQUxJRF9UWVBFICAgICAgICgweDAwMjEpCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfQ09ORklHX0lOVkFMSURfUEFHRSAgICAgICAoMHgwMDIyKQorI2RlZmluZSBNUElfSU9DU1RBVFVTX0NPTkZJR19JTlZBTElEX0RBVEEgICAgICAgKDB4MDAyMykKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19DT05GSUdfTk9fREVGQVVMVFMgICAgICAgICgweDAwMjQpCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfQ09ORklHX0NBTlRfQ09NTUlUICAgICAgICAoMHgwMDI1KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBTQ1NJSU8gUmVwbHkgKFNQSSAmIEZDUCkgaW5pdGlhdG9yIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19TQ1NJX1JFQ09WRVJFRF9FUlJPUiAgICAgICgweDAwNDApCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfU0NTSV9JTlZBTElEX0JVUyAgICAgICAgICAoMHgwMDQxKQorI2RlZmluZSBNUElfSU9DU1RBVFVTX1NDU0lfSU5WQUxJRF9UQVJHRVRJRCAgICAgKDB4MDA0MikKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19TQ1NJX0RFVklDRV9OT1RfVEhFUkUgICAgICgweDAwNDMpCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfU0NTSV9EQVRBX09WRVJSVU4gICAgICAgICAoMHgwMDQ0KQorI2RlZmluZSBNUElfSU9DU1RBVFVTX1NDU0lfREFUQV9VTkRFUlJVTiAgICAgICAgKDB4MDA0NSkKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19TQ1NJX0lPX0RBVEFfRVJST1IgICAgICAgICgweDAwNDYpCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfU0NTSV9QUk9UT0NPTF9FUlJPUiAgICAgICAoMHgwMDQ3KQorI2RlZmluZSBNUElfSU9DU1RBVFVTX1NDU0lfVEFTS19URVJNSU5BVEVEICAgICAgKDB4MDA0OCkKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19TQ1NJX1JFU0lEVUFMX01JU01BVENIICAgICgweDAwNDkpCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfU0NTSV9UQVNLX01HTVRfRkFJTEVEICAgICAoMHgwMDRBKQorI2RlZmluZSBNUElfSU9DU1RBVFVTX1NDU0lfSU9DX1RFUk1JTkFURUQgICAgICAgKDB4MDA0QikKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19TQ1NJX0VYVF9URVJNSU5BVEVEICAgICAgICgweDAwNEMpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIEZvciB1c2UgYnkgU0NTSSBJbml0aWF0b3IgYW5kIFNDU0kgVGFyZ2V0IGVuZC10by1lbmQgZGF0YSBwcm90ZWN0aW9uICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNUElfSU9DU1RBVFVTX0VFRFBfQ1JDX0VSUk9SICAgICAgICAgICAgKDB4MDA0RCkKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19FRURQX0xCQV9UQUdfRVJST1IgICAgICAgICgweDAwNEUpCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfRUVEUF9BUFBfVEFHX0VSUk9SICAgICAgICAoMHgwMDRGKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFNDU0kgKFNQSSAmIEZDUCkgdGFyZ2V0IHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNUElfSU9DU1RBVFVTX1RBUkdFVF9QUklPUklUWV9JTyAgICAgICAgICgweDAwNjApCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfVEFSR0VUX0lOVkFMSURfUE9SVCAgICAgICAgKDB4MDA2MSkKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19UQVJHRVRfSU5WQUxJRF9JT0NJTkRFWCAgICAoMHgwMDYyKSAgIC8qIG9ic29sZXRlICovCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfVEFSR0VUX0lOVkFMSURfSU9fSU5ERVggICAgKDB4MDA2MikKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19UQVJHRVRfQUJPUlRFRCAgICAgICAgICAgICAoMHgwMDYzKQorI2RlZmluZSBNUElfSU9DU1RBVFVTX1RBUkdFVF9OT19DT05OX1JFVFJZQUJMRSAgICgweDAwNjQpCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfVEFSR0VUX05PX0NPTk5FQ1RJT04gICAgICAgKDB4MDA2NSkKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19UQVJHRVRfWEZFUl9DT1VOVF9NSVNNQVRDSCAoMHgwMDZBKQorI2RlZmluZSBNUElfSU9DU1RBVFVTX1RBUkdFVF9TVFNfREFUQV9OT1RfU0VOVCAgICgweDAwNkIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIEFkZGl0aW9uYWwgRkNQIHRhcmdldCB2YWx1ZXMgKG9ic29sZXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNUElfSU9DU1RBVFVTX1RBUkdFVF9GQ19BQk9SVEVEICAgICAgICAgKDB4MDA2NikgICAgLyogb2Jzb2xldGUgKi8KKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19UQVJHRVRfRkNfUlhfSURfSU5WQUxJRCAgICgweDAwNjcpICAgIC8qIG9ic29sZXRlICovCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfVEFSR0VUX0ZDX0RJRF9JTlZBTElEICAgICAoMHgwMDY4KSAgICAvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBNUElfSU9DU1RBVFVTX1RBUkdFVF9GQ19OT0RFX0xPR0dFRF9PVVQgKDB4MDA2OSkgICAgLyogb2Jzb2xldGUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgRmlicmUgQ2hhbm5lbCBEaXJlY3QgQWNjZXNzIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfRkNfQUJPUlRFRCAgICAgICAgICAgICAgICAoMHgwMDY2KQorI2RlZmluZSBNUElfSU9DU1RBVFVTX0ZDX1JYX0lEX0lOVkFMSUQgICAgICAgICAgKDB4MDA2NykKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19GQ19ESURfSU5WQUxJRCAgICAgICAgICAgICgweDAwNjgpCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfRkNfTk9ERV9MT0dHRURfT1VUICAgICAgICAoMHgwMDY5KQorI2RlZmluZSBNUElfSU9DU1RBVFVTX0ZDX0VYQ0hBTkdFX0NBTkNFTEVEICAgICAgKDB4MDA2QykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgTEFOIHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfTEFOX0RFVklDRV9OT1RfRk9VTkQgICAgICAoMHgwMDgwKQorI2RlZmluZSBNUElfSU9DU1RBVFVTX0xBTl9ERVZJQ0VfRkFJTFVSRSAgICAgICAgKDB4MDA4MSkKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19MQU5fVFJBTlNNSVRfRVJST1IgICAgICAgICgweDAwODIpCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfTEFOX1RSQU5TTUlUX0FCT1JURUQgICAgICAoMHgwMDgzKQorI2RlZmluZSBNUElfSU9DU1RBVFVTX0xBTl9SRUNFSVZFX0VSUk9SICAgICAgICAgKDB4MDA4NCkKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19MQU5fUkVDRUlWRV9BQk9SVEVEICAgICAgICgweDAwODUpCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfTEFOX1BBUlRJQUxfUEFDS0VUICAgICAgICAoMHgwMDg2KQorI2RlZmluZSBNUElfSU9DU1RBVFVTX0xBTl9DQU5DRUxFRCAgICAgICAgICAgICAgKDB4MDA4NykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgU2VyaWFsIEF0dGFjaGVkIFNDU0kgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19TQVNfU01QX1JFUVVFU1RfRkFJTEVEICAgICgweDAwOTApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIEluYmFuZCB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNUElfSU9DU1RBVFVTX0lOQkFORF9BQk9SVEVEICAgICAgICAgICAgKDB4MDA5OCkKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19JTkJBTkRfTk9fQ09OTkVDVElPTiAgICAgICgweDAwOTkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIERpYWdub3N0aWMgVG9vbHMgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNUElfSU9DU1RBVFVTX0RJQUdOT1NUSUNfUkVMRUFTRUQgICAgICAgKDB4MDBBMCkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBJT0NTdGF0dXMgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGxvZyBpbmZvIGlzIGF2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVBJX0lPQ1NUQVRVU19GTEFHX0xPR19JTkZPX0FWQUlMQUJMRSAgICgweDgwMDApCisjZGVmaW5lIE1QSV9JT0NTVEFUVVNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAoMHg3RkZGKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBMb2dJbmZvIFR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVBJX0lPQ0xPR0lORk9fVFlQRV9NQVNLICAgICAgICAgICAgICAgICgweEYwMDAwMDAwKQorI2RlZmluZSBNUElfSU9DTE9HSU5GT19UWVBFX1NISUZUICAgICAgICAgICAgICAgKDI4KQorI2RlZmluZSBNUElfSU9DTE9HSU5GT19UWVBFX05PTkUgICAgICAgICAgICAgICAgKDB4MCkKKyNkZWZpbmUgTVBJX0lPQ0xPR0lORk9fVFlQRV9TQ1NJICAgICAgICAgICAgICAgICgweDEpCisjZGVmaW5lIE1QSV9JT0NMT0dJTkZPX1RZUEVfRkMgICAgICAgICAgICAgICAgICAoMHgyKQorI2RlZmluZSBNUElfSU9DTE9HSU5GT19UWVBFX1NBUyAgICAgICAgICAgICAgICAgKDB4MykKKyNkZWZpbmUgTVBJX0lPQ0xPR0lORk9fVFlQRV9JU0NTSSAgICAgICAgICAgICAgICgweDQpCisjZGVmaW5lIE1QSV9JT0NMT0dJTkZPX0xPR19EQVRBX01BU0sgICAgICAgICAgICAoMHgwRkZGRkZGRikKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9jbmZnLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfY25mZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NjgwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfY25mZy5oCkBAIC0wLDAgKzEsMjEwNSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBMU0kgTG9naWMgQ29ycG9yYXRpb24uCisgKgorICoKKyAqICAgICAgICAgICBOYW1lOiAgbXBpX2NuZmcuaAorICogICAgICAgICAgVGl0bGU6ICBNUEkgQ29uZmlnIG1lc3NhZ2UsIHN0cnVjdHVyZXMsIGFuZCBQYWdlcworICogIENyZWF0aW9uIERhdGU6ICBKdWx5IDI3LCAyMDAwCisgKgorICogICAgbXBpX2NuZmcuaCBWZXJzaW9uOiAgMDEuMDUueHgKKyAqCisgKiAgVmVyc2lvbiBIaXN0b3J5CisgKiAgLS0tLS0tLS0tLS0tLS0tCisgKgorICogIERhdGUgICAgICBWZXJzaW9uICAgRGVzY3JpcHRpb24KKyAqICAtLS0tLS0tLSAgLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIDA1LTA4LTAwICAwMC4xMC4wMSAgT3JpZ2luYWwgcmVsZWFzZSBmb3IgMC4xMCBzcGVjIGRhdGVkIDQvMjYvMjAwMC4KKyAqICAwNi0wNi0wMCAgMDEuMDAuMDEgIFVwZGF0ZSB2ZXJzaW9uIG51bWJlciBmb3IgMS4wIHJlbGVhc2UuCisgKiAgMDYtMDgtMDAgIDAxLjAwLjAyICBBZGRlZCBfUEFHRVZFUlNJT04gZGVmaW5pdGlvbnMgZm9yIGFsbCBwYWdlcy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIEZjUGhMb3dlc3RWZXJzaW9uLCBGY1BoSGlnaGVzdFZlcnNpb24sIFJlc2VydmVkMgorICogICAgICAgICAgICAgICAgICAgICAgZmllbGRzIHRvIEZDX0RFVklDRV8wIHBhZ2UsIHVwZGF0ZWQgdGhlIHBhZ2UgdmVyc2lvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWQgX0ZSRUVfUlVOTklOR19DTE9DSyB0byBfUEFDSU5HX1RSQU5TRkVSUyBpbgorICogICAgICAgICAgICAgICAgICAgICAgU0NTSV9QT1JUXzAsIFNDU0lfREVWSUNFXzAgYW5kIFNDU0lfREVWSUNFXzEgcGFnZXMKKyAqICAgICAgICAgICAgICAgICAgICAgIGFuZCB1cGRhdGVkIHRoZSBwYWdlIHZlcnNpb25zLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgX1JFU1BPTlNFX0lEX01BU0sgZGVmaW5pdGlvbiB0byBTQ1NJX1BPUlRfMQorICogICAgICAgICAgICAgICAgICAgICAgcGFnZSBhbmQgdXBkYXRlZCB0aGUgcGFnZSB2ZXJzaW9uLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgSW5mb3JtYXRpb24gZmllbGQgYW5kIF9JTkZPX1BBUkFNU19ORUdPVElBVEVECisgKiAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9udG8gU0NTSV9ERVZJQ0VfMCBwYWdlLgorICogIDA2LTIyLTAwICAwMS4wMC4wMyAgUmVtb3ZlZCBiYXRjaCBjb250cm9scyBmcm9tIExBTl8wIHBhZ2UgYW5kIHVwZGF0ZWQgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBwYWdlIHZlcnNpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBCdWNrZXRzUmVtYWluaW5nIHRvIExBTl8xIHBhZ2UsIHJlZGVmaW5lZCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIHZhbHVlcywgYW5kIHVwZGF0ZWQgdGhlIHBhZ2UgdmVyc2lvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgIFJldmlzZWQgYnVzIHdpZHRoIGRlZmluaXRpb25zIGluIFNDU0lfUE9SVF8wLAorICogICAgICAgICAgICAgICAgICAgICAgU0NTSV9ERVZJQ0VfMCBhbmQgU0NTSV9ERVZJQ0VfMSBwYWdlcy4KKyAqICAwNi0zMC0wMCAgMDEuMDAuMDQgIEFkZGVkIE1heFJlcGx5U2l6ZSB0byBMQU5fMSBwYWdlIGFuZCB1cGRhdGVkIHRoZSBwYWdlCisgKiAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLgorICogICAgICAgICAgICAgICAgICAgICAgTW92ZWQgRkNfREVWSUNFXzAgUGFnZUFkZHJlc3MgZGVzY3JpcHRpb24gdG8gc3BlYy4KKyAqICAwNy0yNy0wMCAgMDEuMDAuMDUgIENvcnJlY3RlZCB0aGUgU3Vic3lzdGVtVmVuZG9ySUQgYW5kIFN1YnN5c3RlbUlEIGZpZWxkCisgKiAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMgaW4gSU9DXzAgcGFnZSBhbmQgdXBkYXRlZCB0aGUgcGFnZSB2ZXJzaW9uLgorICogIDExLTAyLTAwICAwMS4wMS4wMSAgT3JpZ2luYWwgcmVsZWFzZSBmb3IgcG9zdCAxLjAgd29yaworICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTWFudWZhY3R1cmluZyBwYWdlcywgSU8gVW5pdCBQYWdlIDIsIFNDU0kgU1BJCisgKiAgICAgICAgICAgICAgICAgICAgICBQb3J0IFBhZ2UgMiwgRkMgUG9ydCBQYWdlIDQsIEZDIFBvcnQgUGFnZSA1CisgKiAgMTEtMTUtMDAgIDAxLjAxLjAyICBJbnRlcmltIGNoYW5nZXMgdG8gbWF0Y2ggcHJvcG9zYWxzCisgKiAgMTItMDQtMDAgIDAxLjAxLjAzICBDb25maWcgcGFnZSBjaGFuZ2VzIHRvIG1hdGNoIE1QSSByZXYgMS4wMC4wMS4KKyAqICAxMi0wNS0wMCAgMDEuMDEuMDQgIE1vZGlmaWVkIGNvbmZpZyBwYWdlIGFjdGlvbnMuCisgKiAgMDEtMDktMDEgIDAxLjAxLjA1ICBBZGRlZCBkZWZpbmVzIGZvciBwYWdlIGFkZHJlc3MgZm9ybWF0cy4KKyAqICAgICAgICAgICAgICAgICAgICAgIERhdGEgc2l6ZSBmb3IgTWFudWZhY3R1cmluZyBwYWdlcyAyIGFuZCAzIG5vIGxvbmdlcgorICogICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBoZXJlLgorICogICAgICAgICAgICAgICAgICAgICAgSW8gVW5pdCBQYWdlIDIgc2l6ZSBpcyBmaXhlZCBhdCA0IGFkYXB0ZXJzIGFuZCBzb21lCisgKiAgICAgICAgICAgICAgICAgICAgICBmbGFncyB3ZXJlIGNoYW5nZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICBTQ1NJIFBvcnQgUGFnZSAyIERldmljZSBTZXR0aW5ncyBtb2RpZmllZC4KKyAqICAgICAgICAgICAgICAgICAgICAgIE5ldyBmaWVsZHMgYWRkZWQgdG8gRkMgUG9ydCBQYWdlIDAgYW5kIHNvbWUgZmxhZ3MKKyAqICAgICAgICAgICAgICAgICAgICAgIGNsZWFuZWQgdXAuCisgKiAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVkIGltcGVkYW5jZSBmbGFzaCBmcm9tIEZDIFBvcnQgUGFnZSAxLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgRkMgUG9ydCBwYWdlcyA2IGFuZCA3LgorICogIDAxLTI1LTAxICAwMS4wMS4wNiAgQWRkZWQgTWF4SW5pdGlhdG9ycyBmaWVsZCB0byBGY1BvcnRQYWdlMC4KKyAqICAwMS0yOS0wMSAgMDEuMDEuMDcgIENoYW5nZWQgc29tZSBkZWZpbmVzIHRvIG1ha2UgdGhlbSAzMiBjaGFyYWN0ZXIgdW5pcXVlLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgc29tZSBMaW5rVHlwZSBkZWZpbmVzIGZvciBGY1BvcnRQYWdlMC4KKyAqICAwMi0yMC0wMSAgMDEuMDEuMDggIFN0YXJ0ZWQgdXNpbmcgTVBJX1BPSU5URVIuCisgKiAgMDItMjctMDEgIDAxLjAxLjA5ICBSZXBsYWNlZCBNUElfQ09ORklHX1BBR0VUWVBFX1NDU0lfTFVOIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgICAgIE1QSV9DT05GSUdfUEFHRVRZUEVfUkFJRF9WT0xVTUUuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBkZWZpbml0aW9ucyBhbmQgc3RydWN0dXJlcyBmb3IgSU9DIFBhZ2UgMiBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgIFJBSUQgVm9sdW1lIFBhZ2UgMi4KKyAqICAwMy0yNy0wMSAgMDEuMDEuMTAgIEFkZGVkIENPTkZJR19QQUdFX0ZDX1BPUlRfOCBhbmQgQ09ORklHX1BBR0VfRkNfUE9SVF85LgorICogICAgICAgICAgICAgICAgICAgICAgQ09ORklHX1BBR0VfRkNfUE9SVF8zIG5vdyBzdXBwb3J0cyBwZXJzaXN0ZW50IGJ5IERJRC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIFZlbmRvcklkIGFuZCBQcm9kdWN0UmV2TGV2ZWwgZmllbGRzIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICBSQUlEVk9MMl9JTV9QSFlTX0lEIHN0cnVjdC4KKyAqICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWVkIHZhbHVlcyBmb3IgTVBJX0ZDUE9SVFBBR0UwX0ZMQUdTX0FUVEFDSF8KKyAqICAgICAgICAgICAgICAgICAgICAgIGRlZmluZXMgdG8gbWFrZSB0aGVtIGNvbXBhdGlibGUgdG8gTVBJIHZlcnNpb24gMS4wLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgc3RydWN0dXJlIG9mZnNldCBjb21tZW50cy4KKyAqICAwNC0wOS0wMSAgMDEuMDEuMTEgIEFkZGVkIHNvbWUgbmV3IGRlZmluZXMgZm9yIHRoZSBQYWdlQWRkcmVzcyBmaWVsZCBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQgc29tZSBvYnNvbGV0ZSBvbmVzLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgSU8gVW5pdCBQYWdlIDMuCisgKiAgICAgICAgICAgICAgICAgICAgICBNb2RpZmllZCBkZWZpbmVzIGZvciBTY3NpIFBvcnQgUGFnZSAyLgorICogICAgICAgICAgICAgICAgICAgICAgTW9kaWZpZWQgUkFJRCBWb2x1bWUgUGFnZXMuCisgKiAgMDgtMDgtMDEgIDAxLjAyLjAxICBPcmlnaW5hbCByZWxlYXNlIGZvciB2MS4yIHdvcmsuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBTZXBJRCBhbmQgU2VwQnVzIHRvIFJWUDIgSU1QaHlzaWNhbERpc2sgc3RydWN0LgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgZGVmaW5lcyBmb3IgdGhlIFNFUCBiaXRzIGluIFJWUDIgVm9sdW1lU2V0dGluZ3MuCisgKiAgICAgICAgICAgICAgICAgICAgICBNb2RpZmllZCB0aGUgRGV2aWNlU2V0dGluZ3MgZmllbGQgaW4gUlZQMiB0byB1c2UgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBwcm9wZXIgc3RydWN0dXJlLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgZGVmaW5lcyBmb3IgU0VTLCBTQUYtVEUsIGFuZCBjcm9zcyBjaGFubmVsIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgSU9DUGFnZTIgQ2FwYWJpbGl0aWVzRmxhZ3MuCisgKiAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVkIGRlZmluZSBmb3IgTVBJX0lPVU5JVFBBR0UyX0ZMQUdTX1JBSURfRElTQUJMRS4KKyAqICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgZGVmaW5lIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgTVBJX1NDU0lQT1JUUEFHRTJfUE9SVF9GTEFHU19QQVJJVFlfRU5BQkxFLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgZGVmaW5lIGZvciBNUElfQ09ORklHX1BBR0VBVFRSX1JPX1BFUlNJU1RFTlQuCisgKiAgMDgtMjktMDEgMDEuMDIuMDIgICBGaXhlZCB2YWx1ZSBmb3IgTVBJX01BTlVGQUNUUEFHRV9ERVZJRF81M0MxMDM1LgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgZGVmaW5lcyBmb3IgTVBJX0ZDUE9SVFBBR0UxX0ZMQUdTX0hBUkRfQUxQQV9PTkxZCisgKiAgICAgICAgICAgICAgICAgICAgICBhbmQgTVBJX0ZDUE9SVFBBR0UxX0ZMQUdTX0lNTUVESUFURV9FUlJPUl9SRVBMWS4KKyAqICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgTVBJX1NDU0lQT1JUUEFHRTBfQ0FQX1BBQ0lOR19UUkFOU0ZFUlMsCisgKiAgICAgICAgICAgICAgICAgICAgICBNUElfU0NTSURFVlBBR0UwX05QX1BBQ0lOR19UUkFOU0ZFUlMsIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgTVBJX1NDU0lERVZQQUdFMV9SUF9QQUNJTkdfVFJBTlNGRVJTLCBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgIE1QSV9TQ1NJREVWUEFHRTFfQ09ORl9QUFJfQUxMT1dFRC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGRlZmluZXMgZm9yIE1QSV9TQ1NJREVWUEFHRTFfQ09ORl9XRFRSX0RJU0FMTE9XRUQKKyAqICAgICAgICAgICAgICAgICAgICAgIGFuZCBNUElfU0NTSURFVlBBR0UxX0NPTkZfU0RUUl9ESVNBTExPV0VELgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgT25CdXNUaW1lclZhbHVlIHRvIENPTkZJR19QQUdFX1NDU0lfUE9SVF8xLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgcmVqZWN0ZWQgYml0cyB0byBTQ1NJIERldmljZSBQYWdlIDAgSW5mb3JtYXRpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICBJbmNyZWFzZWQgc2l6ZSBvZiBBTFBBIGFycmF5IGluIEZDIFBvcnQgUGFnZSAyIGJ5IG9uZQorICogICAgICAgICAgICAgICAgICAgICAgYW5kIHJlbW92ZWQgYSBvbmUgYnl0ZSByZXNlcnZlZCBmaWVsZC4KKyAqICAwOS0yOC0wMSAwMS4wMi4wMyAgIFN3YXBwZWQgTmVnV2lyZVNwZWVkTG93IGFuZCBOZWdXaXJlU3BlZWRMb3cgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgIENPTkZJR19QQUdFX0xBTl8xIHRvIG1hdGNoIHByZWZlcnJlZCA2NC1iaXQgb3JkZXJpbmcuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBzdHJ1Y3R1cmVzIGZvciBNYW51ZmFjdHVyaW5nIFBhZ2UgNCwgSU8gVW5pdAorICogICAgICAgICAgICAgICAgICAgICAgUGFnZSAzLCBJT0MgUGFnZSAzLCBJT0MgUGFnZSA0LCBSQUlEIFZvbHVtZSBQYWdlIDAsIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgUkFJRCBQaHlzRGlzayBQYWdlIDAuCisgKiAgMTAtMDQtMDEgMDEuMDIuMDQgICBBZGRlZCBkZWZpbmUgZm9yIE1QSV9DT05GSUdfUEFHRVRZUEVfUkFJRF9QSFlTRElTSy4KKyAqICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWVkIHNvbWUgb2YgdGhlIG5ldyBkZWZpbmVzIHRvIG1ha2UgdGhlbSAzMgorICogICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyIHVuaXF1ZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWVkIGhvdyB2YXJpYWJsZSBsZW5ndGggcGFnZXMgKGFycmF5cykgYXJlIGRlZmluZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBnZW5lcmljIGRlZmluZXMgZm9yIGhvdCBzcGFyZSBwb29scyBhbmQgUkFJRAorICogICAgICAgICAgICAgICAgICAgICAgdm9sdW1lIHR5cGVzLgorICogIDExLTAxLTAxIDAxLjAyLjA1ICAgQWRkZWQgZGVmaW5lIGZvciBNUElfSU9VTklUUEFHRTFfRElTQUJMRV9JUi4KKyAqICAwMy0xNC0wMiAwMS4wMi4wNiAgIEFkZGVkIFBDSVNsb3ROdW0gZmllbGQgdG8gQ09ORklHX1BBR0VfSU9DXzEgYWxvbmcgd2l0aAorICogICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZCBkZWZpbmUsIGFuZCBidW1wZWQgdGhlIHBhZ2UgdmVyc2lvbiBkZWZpbmUuCisgKiAgMDUtMzEtMDIgMDEuMDIuMDcgICBBZGRlZCBhIEZsYWdzIGZpZWxkIHRvIENPTkZJR19QQUdFX0lPQ18yX1JBSURfVk9MIGluIGEKKyAqICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkIGJ5dGUgYW5kIGFkZGVkIGEgZGVmaW5lLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgZGVmaW5lIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgTVBJX1JBSURWT0wwX1NUQVRVU19GTEFHX1ZPTFVNRV9JTkFDVElWRS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIG5ldyBjb25maWcgcGFnZTogQ09ORklHX1BBR0VfSU9DXzUuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNYXhBbGlhc2VzLCBNYXhIYXJkQWxpYXNlcywgYW5kIE51bUN1cnJlbnRBbGlhc2VzCisgKiAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMgdG8gQ09ORklHX1BBR0VfRkNfUE9SVF8wLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgQWx0Q29ubmVjdG9yIGFuZCBOdW1SZXF1ZXN0ZWRBbGlhc2VzIGZpZWxkcyB0bworICogICAgICAgICAgICAgICAgICAgICAgQ09ORklHX1BBR0VfRkNfUE9SVF8xLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgbmV3IGNvbmZpZyBwYWdlOiBDT05GSUdfUEFHRV9GQ19QT1JUXzEwLgorICogIDA3LTEyLTAyIDAxLjAyLjA4ICAgQWRkZWQgbW9yZSBNUElfTUFOVUZBQ1RQQUdFX0RFVklEXyBkZWZpbmVzLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgYWRkaXRpb25hbCBNUElfU0NTSURFVlBBR0UwX05QXyBkZWZpbmVzLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgbW9yZSBNUElfU0NTSURFVlBBR0UxX1JQXyBkZWZpbmVzLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgZGVmaW5lIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgTVBJX1NDU0lERVZQQUdFMV9DT05GX0VYVEVOREVEX1BBUkFNU19FTkFCTEUuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBuZXcgY29uZmlnIHBhZ2U6IENPTkZJR19QQUdFX1NDU0lfREVWSUNFXzMuCisgKiAgICAgICAgICAgICAgICAgICAgICBNb2RpZmllZCBNUElfRkNQT1JUUEFHRTVfRkxBR1NfIGRlZmluZXMuCisgKiAgMDktMTYtMDIgMDEuMDIuMDkgICBBZGRlZCBNUElfU0NTSURFVlBBR0UxX0NPTkZfRk9SQ0VfUFBSX01TRyBkZWZpbmUuCisgKiAgMTEtMTUtMDIgMDEuMDIuMTAgICBBZGRlZCBDb25uZWN0ZWRJRCBkZWZpbmVzIGZvciBDT05GSUdfUEFHRV9TQ1NJX1BPUlRfMC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIG1vcmUgRmxhZ3MgZGVmaW5lcyBmb3IgQ09ORklHX1BBR0VfRkNfUE9SVF8xLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgbW9yZSBGbGFncyBkZWZpbmVzIGZvciBDT05GSUdfUEFHRV9GQ19ERVZJQ0VfMC4KKyAqICAwNC0wMS0wMyAwMS4wMi4xMSAgIEFkZGVkIFJSX1RPViBmaWVsZCBhbmQgYWRkaXRpb25hbCBGbGFncyBkZWZpbmVzIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgQ09ORklHX1BBR0VfRkNfUE9SVF8xLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgZGVmaW5lIE1QSV9GQ1BPUlRQQUdFNV9GTEFHU19ESVNBQkxFIHRvIGRpc2FibGUKKyAqICAgICAgICAgICAgICAgICAgICAgIGFuIGFsaWFzLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgbW9yZSBkZXZpY2UgaWQgZGVmaW5lcy4KKyAqICAwNi0yNi0wMyAwMS4wMi4xMiAgIEFkZGVkIE1QSV9JT1VOSVRQQUdFMV9JUl9VU0VfU1RBVElDX1ZPTFVNRV9JRCBkZWZpbmUuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBUYXJnZXRDb25maWcgYW5kIElEQ29uZmlnIGZpZWxkcyB0bworICogICAgICAgICAgICAgICAgICAgICAgQ09ORklHX1BBR0VfU0NTSV9QT1JUXzEuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBtb3JlIFBvcnRGbGFncyBkZWZpbmVzIGZvciBDT05GSUdfUEFHRV9TQ1NJX1BPUlRfMgorICogICAgICAgICAgICAgICAgICAgICAgdG8gY29udHJvbCBEVi4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIG1vcmUgRmxhZ3MgZGVmaW5lcyBmb3IgQ09ORklHX1BBR0VfRkNfUE9SVF8xLgorICogICAgICAgICAgICAgICAgICAgICAgSW4gQ09ORklHX1BBR0VfRkNfREVWSUNFXzAsIHJlcGxhY2VkIFJlc2VydmVkMSBmaWVsZAorICogICAgICAgICAgICAgICAgICAgICAgd2l0aCBBRElTQ0hhcmRBTFBBLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJX0ZDX0RFVklDRV9QQUdFMF9QUk9UX0ZDUF9SRVRSWSBkZWZpbmUuCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIE1QSV9DTkZHX0gKKyNkZWZpbmUgTVBJX0NORkdfSAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICBDIG8gbiBmIGkgZyAgICBNIGUgcyBzIGEgZyBlICAgIGEgbiBkICAgIFMgdCByIHUgYyB0IHUgciBlIHMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfSEVBREVSCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUGFnZVZlcnNpb247ICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFBhZ2VMZW5ndGg7ICAgICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBQYWdlTnVtYmVyOyAgICAgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUGFnZVR5cGU7ICAgICAgICAgICAgICAgICAgIC8qIDAzaCAqLworfSBmQ09ORklHX1BBR0VfSEVBREVSLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfSEVBREVSLAorICBDb25maWdQYWdlSGVhZGVyX3QsIE1QSV9QT0lOVEVSIHBDb25maWdQYWdlSGVhZGVyX3Q7CisKK3R5cGVkZWYgdW5pb24gX0NPTkZJR19QQUdFX0hFQURFUl9VTklPTgoreworICAgQ29uZmlnUGFnZUhlYWRlcl90ICBTdHJ1Y3Q7CisgICBVOCAgICAgICAgICAgICAgICAgIEJ5dGVzWzRdOworICAgVTE2ICAgICAgICAgICAgICAgICBXb3JkMTZbMl07CisgICBVMzIgICAgICAgICAgICAgICAgIFdvcmQzMjsKK30gQ29uZmlnUGFnZUhlYWRlclVuaW9uLCBNUElfUE9JTlRFUiBwQ29uZmlnUGFnZUhlYWRlclVuaW9uLAorICBmQ09ORklHX1BBR0VfSEVBREVSX1VOSU9OLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfSEVBREVSX1VOSU9OOworCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX0VYVEVOREVEX1BBR0VfSEVBREVSCit7CisgICAgVTggICAgICAgICAgICAgICAgICBQYWdlVmVyc2lvbjsgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICBQYWdlTnVtYmVyOyAgICAgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICBQYWdlVHlwZTsgICAgICAgICAgICAgICAgICAgLyogMDNoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICBFeHRQYWdlTGVuZ3RoOyAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICBFeHRQYWdlVHlwZTsgICAgICAgICAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgLyogMDdoICovCit9IGZDT05GSUdfRVhURU5ERURfUEFHRV9IRUFERVIsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfRVhURU5ERURfUEFHRV9IRUFERVIsCisgIENvbmZpZ0V4dGVuZGVkUGFnZUhlYWRlcl90LCBNUElfUE9JTlRFUiBwQ29uZmlnRXh0ZW5kZWRQYWdlSGVhZGVyX3Q7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIFBhZ2VUeXBlIGZpZWxkIHZhbHVlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTVBJX0NPTkZJR19QQUdFQVRUUl9SRUFEX09OTFkgICAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX0NPTkZJR19QQUdFQVRUUl9DSEFOR0VBQkxFICAgICAgICAgICAgICAoMHgxMCkKKyNkZWZpbmUgTVBJX0NPTkZJR19QQUdFQVRUUl9QRVJTSVNURU5UICAgICAgICAgICAgICAoMHgyMCkKKyNkZWZpbmUgTVBJX0NPTkZJR19QQUdFQVRUUl9ST19QRVJTSVNURU5UICAgICAgICAgICAoMHgzMCkKKyNkZWZpbmUgTVBJX0NPTkZJR19QQUdFQVRUUl9NQVNLICAgICAgICAgICAgICAgICAgICAoMHhGMCkKKworI2RlZmluZSBNUElfQ09ORklHX1BBR0VUWVBFX0lPX1VOSVQgICAgICAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUElfQ09ORklHX1BBR0VUWVBFX0lPQyAgICAgICAgICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfQ09ORklHX1BBR0VUWVBFX0JJT1MgICAgICAgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfQ09ORklHX1BBR0VUWVBFX1NDU0lfUE9SVCAgICAgICAgICAgICAgICgweDAzKQorI2RlZmluZSBNUElfQ09ORklHX1BBR0VUWVBFX1NDU0lfREVWSUNFICAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBNUElfQ09ORklHX1BBR0VUWVBFX0ZDX1BPUlQgICAgICAgICAgICAgICAgICgweDA1KQorI2RlZmluZSBNUElfQ09ORklHX1BBR0VUWVBFX0ZDX0RFVklDRSAgICAgICAgICAgICAgICgweDA2KQorI2RlZmluZSBNUElfQ09ORklHX1BBR0VUWVBFX0xBTiAgICAgICAgICAgICAgICAgICAgICgweDA3KQorI2RlZmluZSBNUElfQ09ORklHX1BBR0VUWVBFX1JBSURfVk9MVU1FICAgICAgICAgICAgICgweDA4KQorI2RlZmluZSBNUElfQ09ORklHX1BBR0VUWVBFX01BTlVGQUNUVVJJTkcgICAgICAgICAgICgweDA5KQorI2RlZmluZSBNUElfQ09ORklHX1BBR0VUWVBFX1JBSURfUEhZU0RJU0sgICAgICAgICAgICgweDBBKQorI2RlZmluZSBNUElfQ09ORklHX1BBR0VUWVBFX0lOQkFORCAgICAgICAgICAgICAgICAgICgweDBCKQorI2RlZmluZSBNUElfQ09ORklHX1BBR0VUWVBFX0VYVEVOREVEICAgICAgICAgICAgICAgICgweDBGKQorI2RlZmluZSBNUElfQ09ORklHX1BBR0VUWVBFX01BU0sgICAgICAgICAgICAgICAgICAgICgweDBGKQorCisjZGVmaW5lIE1QSV9DT05GSUdfVFlQRU5VTV9NQVNLICAgICAgICAgICAgICAgICAgICAgKDB4MEZGRikKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIEV4dFBhZ2VUeXBlIGZpZWxkIHZhbHVlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTVBJX0NPTkZJR19FWFRQQUdFVFlQRV9TQVNfSU9fVU5JVCAgICAgICAgICAoMHgxMCkKKyNkZWZpbmUgTVBJX0NPTkZJR19FWFRQQUdFVFlQRV9TQVNfRVhQQU5ERVIgICAgICAgICAoMHgxMSkKKyNkZWZpbmUgTVBJX0NPTkZJR19FWFRQQUdFVFlQRV9TQVNfREVWSUNFICAgICAgICAgICAoMHgxMikKKyNkZWZpbmUgTVBJX0NPTkZJR19FWFRQQUdFVFlQRV9TQVNfUEhZICAgICAgICAgICAgICAoMHgxMykKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIFBhZ2VBZGRyZXNzIGZpZWxkIHZhbHVlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTVBJX1NDU0lfUE9SVF9QR0FEX1BPUlRfTUFTSyAgICAgICAgICAgICAgICAoMHgwMDAwMDBGRikKKworI2RlZmluZSBNUElfU0NTSV9ERVZJQ0VfVEFSR0VUX0lEX01BU0sgICAgICAgICAgICAgICgweDAwMDAwMEZGKQorI2RlZmluZSBNUElfU0NTSV9ERVZJQ0VfVEFSR0VUX0lEX1NISUZUICAgICAgICAgICAgICgwKQorI2RlZmluZSBNUElfU0NTSV9ERVZJQ0VfQlVTX01BU0sgICAgICAgICAgICAgICAgICAgICgweDAwMDBGRjAwKQorI2RlZmluZSBNUElfU0NTSV9ERVZJQ0VfQlVTX1NISUZUICAgICAgICAgICAgICAgICAgICg4KQorCisjZGVmaW5lIE1QSV9GQ19QT1JUX1BHQURfUE9SVF9NQVNLICAgICAgICAgICAgICAgICAgKDB4RjAwMDAwMDApCisjZGVmaW5lIE1QSV9GQ19QT1JUX1BHQURfUE9SVF9TSElGVCAgICAgICAgICAgICAgICAgKDI4KQorI2RlZmluZSBNUElfRkNfUE9SVF9QR0FEX0ZPUk1fTUFTSyAgICAgICAgICAgICAgICAgICgweDBGMDAwMDAwKQorI2RlZmluZSBNUElfRkNfUE9SVF9QR0FEX0ZPUk1fSU5ERVggICAgICAgICAgICAgICAgICgweDAxMDAwMDAwKQorI2RlZmluZSBNUElfRkNfUE9SVF9QR0FEX0lOREVYX01BU0sgICAgICAgICAgICAgICAgICgweDAwMDBGRkZGKQorI2RlZmluZSBNUElfRkNfUE9SVF9QR0FEX0lOREVYX1NISUZUICAgICAgICAgICAgICAgICgwKQorCisjZGVmaW5lIE1QSV9GQ19ERVZJQ0VfUEdBRF9QT1JUX01BU0sgICAgICAgICAgICAgICAgKDB4RjAwMDAwMDApCisjZGVmaW5lIE1QSV9GQ19ERVZJQ0VfUEdBRF9QT1JUX1NISUZUICAgICAgICAgICAgICAgKDI4KQorI2RlZmluZSBNUElfRkNfREVWSUNFX1BHQURfRk9STV9NQVNLICAgICAgICAgICAgICAgICgweDBGMDAwMDAwKQorI2RlZmluZSBNUElfRkNfREVWSUNFX1BHQURfRk9STV9ORVhUX0RJRCAgICAgICAgICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBNUElfRkNfREVWSUNFX1BHQURfTkRfUE9SVF9NQVNLICAgICAgICAgICAgICgweEYwMDAwMDAwKQorI2RlZmluZSBNUElfRkNfREVWSUNFX1BHQURfTkRfUE9SVF9TSElGVCAgICAgICAgICAgICgyOCkKKyNkZWZpbmUgTVBJX0ZDX0RFVklDRV9QR0FEX05EX0RJRF9NQVNLICAgICAgICAgICAgICAoMHgwMEZGRkZGRikKKyNkZWZpbmUgTVBJX0ZDX0RFVklDRV9QR0FEX05EX0RJRF9TSElGVCAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgTVBJX0ZDX0RFVklDRV9QR0FEX0ZPUk1fQlVTX1RJRCAgICAgICAgICAgICAoMHgwMTAwMDAwMCkKKyNkZWZpbmUgTVBJX0ZDX0RFVklDRV9QR0FEX0JUX0JVU19NQVNLICAgICAgICAgICAgICAoMHgwMDAwRkYwMCkKKyNkZWZpbmUgTVBJX0ZDX0RFVklDRV9QR0FEX0JUX0JVU19TSElGVCAgICAgICAgICAgICAoOCkKKyNkZWZpbmUgTVBJX0ZDX0RFVklDRV9QR0FEX0JUX1RJRF9NQVNLICAgICAgICAgICAgICAoMHgwMDAwMDBGRikKKyNkZWZpbmUgTVBJX0ZDX0RFVklDRV9QR0FEX0JUX1RJRF9TSElGVCAgICAgICAgICAgICAoMCkKKworI2RlZmluZSBNUElfUEhZU0RJU0tfUEdBRF9QSFlTRElTS05VTV9NQVNLICAgICAgICAgICgweDAwMDAwMEZGKQorI2RlZmluZSBNUElfUEhZU0RJU0tfUEdBRF9QSFlTRElTS05VTV9TSElGVCAgICAgICAgICgwKQorCisjZGVmaW5lIE1QSV9TQVNfREVWSUNFX1BHQURfRk9STV9NQVNLICAgICAgICAgICAgICAgKDB4RjAwMDAwMDApCisjZGVmaW5lIE1QSV9TQVNfREVWSUNFX1BHQURfRk9STV9TSElGVCAgICAgICAgICAgICAgKDI4KQorI2RlZmluZSBNUElfU0FTX0RFVklDRV9QR0FEX0ZPUk1fR0VUX05FWFRfSEFORExFICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBNUElfU0FTX0RFVklDRV9QR0FEX0ZPUk1fQlVTX1RBUkdFVF9JRCAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBNUElfU0FTX0RFVklDRV9QR0FEX0ZPUk1fSEFORExFICAgICAgICAgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBNUElfU0FTX0RFVklDRV9QR0FEX0dOSF9IQU5ETEVfTUFTSyAgICAgICAgICgweDAwMDBGRkZGKQorI2RlZmluZSBNUElfU0FTX0RFVklDRV9QR0FEX0dOSF9IQU5ETEVfU0hJRlQgICAgICAgICgwKQorI2RlZmluZSBNUElfU0FTX0RFVklDRV9QR0FEX0JUX0JVU19NQVNLICAgICAgICAgICAgICgweDAwMDBGRjAwKQorI2RlZmluZSBNUElfU0FTX0RFVklDRV9QR0FEX0JUX0JVU19TSElGVCAgICAgICAgICAgICg4KQorI2RlZmluZSBNUElfU0FTX0RFVklDRV9QR0FEX0JUX1RJRF9NQVNLICAgICAgICAgICAgICgweDAwMDAwMEZGKQorI2RlZmluZSBNUElfU0FTX0RFVklDRV9QR0FEX0JUX1RJRF9TSElGVCAgICAgICAgICAgICgwKQorI2RlZmluZSBNUElfU0FTX0RFVklDRV9QR0FEX0hfSEFORExFX01BU0sgICAgICAgICAgICgweDAwMDBGRkZGKQorI2RlZmluZSBNUElfU0FTX0RFVklDRV9QR0FEX0hfSEFORExFX1NISUZUICAgICAgICAgICgwKQorCisjZGVmaW5lIE1QSV9TQVNfUEhZX1BHQURfUEhZX05VTUJFUl9NQVNLICAgICAgICAgICAgKDB4MDBGRjAwMDApCisjZGVmaW5lIE1QSV9TQVNfUEhZX1BHQURfUEhZX05VTUJFUl9TSElGVCAgICAgICAgICAgKDE2KQorI2RlZmluZSBNUElfU0FTX1BIWV9QR0FEX0RFVkhBTkRMRV9NQVNLICAgICAgICAgICAgICgweDAwMDBGRkZGKQorI2RlZmluZSBNUElfU0FTX1BIWV9QR0FEX0RFVkhBTkRMRV9TSElGVCAgICAgICAgICAgICgwKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgQ29uZmlnIFJlcXVlc3QgTWVzc2FnZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IF9NU0dfQ09ORklHCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOyAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDaGFpbk9mZnNldDsgICAgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAgICAgICAgIC8qIDAzaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIEV4dFBhZ2VMZW5ndGg7ICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBFeHRQYWdlVHlwZTsgICAgICAgICAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgICAgICAgICAvKiAwOGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDJbOF07ICAgICAgICAgICAgICAgLyogMENoICovCisgICAgZkNPTkZJR19QQUdFX0hFQURFUiAgICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgICAgICAvKiAxNGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBQYWdlQWRkcmVzczsgICAgICAgICAgICAgICAgLyogMThoICovCisgICAgU0dFX0lPX1VOSU9OICAgICAgICAgICAgUGFnZUJ1ZmZlclNHRTsgICAgICAgICAgICAgIC8qIDFDaCAqLworfSBNU0dfQ09ORklHLCBNUElfUE9JTlRFUiBQVFJfTVNHX0NPTkZJRywKKyAgQ29uZmlnX3QsIE1QSV9QT0lOVEVSIHBDb25maWdfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIEFjdGlvbiBmaWVsZCB2YWx1ZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfSEVBREVSICAgICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfUkVBRF9DVVJSRU5UICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfV1JJVEVfQ1VSUkVOVCAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfREVGQVVMVCAgICAgICAgICAgICAgKDB4MDMpCisjZGVmaW5lIE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfV1JJVEVfTlZSQU0gICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfUkVBRF9ERUZBVUxUICAgICAgICAgKDB4MDUpCisjZGVmaW5lIE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfUkVBRF9OVlJBTSAgICAgICAgICAgKDB4MDYpCisKKworLyogQ29uZmlnIFJlcGx5IE1lc3NhZ2UgKi8KK3R5cGVkZWYgc3RydWN0IF9NU0dfQ09ORklHX1JFUExZCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOyAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dMZW5ndGg7ICAgICAgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAgICAgICAgIC8qIDAzaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIEV4dFBhZ2VMZW5ndGg7ICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBFeHRQYWdlVHlwZTsgICAgICAgICAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgICAgICAgICAvKiAwOGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDJbMl07ICAgICAgICAgICAgICAgLyogMENoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSU9DU3RhdHVzOyAgICAgICAgICAgICAgICAgIC8qIDBFaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIElPQ0xvZ0luZm87ICAgICAgICAgICAgICAgICAvKiAxMGggKi8KKyAgICBmQ09ORklHX1BBR0VfSEVBREVSICAgICAgSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgIC8qIDE0aCAqLworfSBNU0dfQ09ORklHX1JFUExZLCBNUElfUE9JTlRFUiBQVFJfTVNHX0NPTkZJR19SRVBMWSwKKyAgQ29uZmlnUmVwbHlfdCwgTVBJX1BPSU5URVIgcENvbmZpZ1JlcGx5X3Q7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICBDIG8gbiBmIGkgZyB1IHIgYSB0IGkgbyBuICAgIFAgYSBnIGUgcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgTWFudWZhY3R1cmluZyBDb25maWcgcGFnZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1QSV9NQU5VRkFDVFBBR0VfVkVORE9SSURfTFNJTE9HSUMgICAgICAgICAgKDB4MTAwMCkKKy8qIEZpYnJlIENoYW5uZWwgKi8KKyNkZWZpbmUgTVBJX01BTlVGQUNUUEFHRV9ERVZJQ0VJRF9GQzkwOSAgICAgICAgICAgICAoMHgwNjIxKQorI2RlZmluZSBNUElfTUFOVUZBQ1RQQUdFX0RFVklDRUlEX0ZDOTE5ICAgICAgICAgICAgICgweDA2MjQpCisjZGVmaW5lIE1QSV9NQU5VRkFDVFBBR0VfREVWSUNFSURfRkM5MjkgICAgICAgICAgICAgKDB4MDYyMikKKyNkZWZpbmUgTVBJX01BTlVGQUNUUEFHRV9ERVZJQ0VJRF9GQzkxOVggICAgICAgICAgICAoMHgwNjI4KQorI2RlZmluZSBNUElfTUFOVUZBQ1RQQUdFX0RFVklDRUlEX0ZDOTI5WCAgICAgICAgICAgICgweDA2MjYpCisvKiBTQ1NJICovCisjZGVmaW5lIE1QSV9NQU5VRkFDVFBBR0VfREVWSURfNTNDMTAzMCAgICAgICAgICAgICAgKDB4MDAzMCkKKyNkZWZpbmUgTVBJX01BTlVGQUNUUEFHRV9ERVZJRF81M0MxMDMwWkMgICAgICAgICAgICAoMHgwMDMxKQorI2RlZmluZSBNUElfTUFOVUZBQ1RQQUdFX0RFVklEXzEwMzBfNTNDMTAzNSAgICAgICAgICgweDAwMzIpCisjZGVmaW5lIE1QSV9NQU5VRkFDVFBBR0VfREVWSURfMTAzMFpDXzUzQzEwMzUgICAgICAgKDB4MDAzMykKKyNkZWZpbmUgTVBJX01BTlVGQUNUUEFHRV9ERVZJRF81M0MxMDM1ICAgICAgICAgICAgICAoMHgwMDQwKQorI2RlZmluZSBNUElfTUFOVUZBQ1RQQUdFX0RFVklEXzUzQzEwMzVaQyAgICAgICAgICAgICgweDAwNDEpCisvKiBTQVMgKi8KKyNkZWZpbmUgTVBJX01BTlVGQUNUUEFHRV9ERVZJRF9TQVMxMDY0ICAgICAgICAgICAgICAoMHgwMDUwKQorCisKK3R5cGVkZWYgc3RydWN0IF9DT05GSUdfUEFHRV9NQU5VRkFDVFVSSU5HXzAKK3sKKyAgICBmQ09ORklHX1BBR0VfSEVBREVSICAgICAgSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENoaXBOYW1lWzE2XTsgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDaGlwUmV2aXNpb25bOF07ICAgICAgICAgICAgLyogMTRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQm9hcmROYW1lWzE2XTsgICAgICAgICAgICAgIC8qIDFDaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEJvYXJkQXNzZW1ibHlbMTZdOyAgICAgICAgICAvKiAyQ2ggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBCb2FyZFRyYWNlck51bWJlclsxNl07ICAgICAgLyogM0NoICovCisKK30gZkNPTkZJR19QQUdFX01BTlVGQUNUVVJJTkdfMCwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX01BTlVGQUNUVVJJTkdfMCwKKyAgTWFudWZhY3R1cmluZ1BhZ2UwX3QsIE1QSV9QT0lOVEVSIHBNYW51ZmFjdHVyaW5nUGFnZTBfdDsKKworI2RlZmluZSBNUElfTUFOVUZBQ1RVUklORzBfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICgweDAwKQorCisKK3R5cGVkZWYgc3RydWN0IF9DT05GSUdfUEFHRV9NQU5VRkFDVFVSSU5HXzEKK3sKKyAgICBmQ09ORklHX1BBR0VfSEVBREVSICAgICAgSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFZQRFsyNTZdOyAgICAgICAgICAgICAgICAgICAvKiAwNGggKi8KK30gZkNPTkZJR19QQUdFX01BTlVGQUNUVVJJTkdfMSwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX01BTlVGQUNUVVJJTkdfMSwKKyAgTWFudWZhY3R1cmluZ1BhZ2UxX3QsIE1QSV9QT0lOVEVSIHBNYW51ZmFjdHVyaW5nUGFnZTFfdDsKKworI2RlZmluZSBNUElfTUFOVUZBQ1RVUklORzFfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICgweDAwKQorCisKK3R5cGVkZWYgc3RydWN0IF9NUElfQ0hJUF9SRVZJU0lPTl9JRAoreworICAgIFUxNiBEZXZpY2VJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgUENJUmV2aXNpb25JRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggIFJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAzaCAqLworfSBNUElfQ0hJUF9SRVZJU0lPTl9JRCwgTVBJX1BPSU5URVIgUFRSX01QSV9DSElQX1JFVklTSU9OX0lELAorICBNcGlDaGlwUmV2aXNpb25JZF90LCBNUElfUE9JTlRFUiBwTXBpQ2hpcFJldmlzaW9uSWRfdDsKKworCisvKgorICogSG9zdCBjb2RlIChkcml2ZXJzLCBCSU9TLCB1dGlsaXRpZXMsIGV0Yy4pIHNob3VsZCBsZWF2ZSB0aGlzIGRlZmluZSBzZXQgdG8KKyAqIG9uZSBhbmQgY2hlY2sgSGVhZGVyLlBhZ2VMZW5ndGggYXQgcnVudGltZS4KKyAqLworI2lmbmRlZiBNUElfTUFOX1BBR0VfMl9IV19TRVRUSU5HU19XT1JEUworI2RlZmluZSBNUElfTUFOX1BBR0VfMl9IV19TRVRUSU5HU19XT1JEUyAgICAoMSkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfTUFOVUZBQ1RVUklOR18yCit7CisgICAgZkNPTkZJR19QQUdFX0hFQURFUiAgICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBNUElfQ0hJUF9SRVZJU0lPTl9JRCAgICBDaGlwSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgSHdTZXR0aW5nc1tNUElfTUFOX1BBR0VfMl9IV19TRVRUSU5HU19XT1JEU107LyogMDhoICovCit9IGZDT05GSUdfUEFHRV9NQU5VRkFDVFVSSU5HXzIsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9NQU5VRkFDVFVSSU5HXzIsCisgIE1hbnVmYWN0dXJpbmdQYWdlMl90LCBNUElfUE9JTlRFUiBwTWFudWZhY3R1cmluZ1BhZ2UyX3Q7CisKKyNkZWZpbmUgTVBJX01BTlVGQUNUVVJJTkcyX1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgKDB4MDApCisKKworLyoKKyAqIEhvc3QgY29kZSAoZHJpdmVycywgQklPUywgdXRpbGl0aWVzLCBldGMuKSBzaG91bGQgbGVhdmUgdGhpcyBkZWZpbmUgc2V0IHRvCisgKiBvbmUgYW5kIGNoZWNrIEhlYWRlci5QYWdlTGVuZ3RoIGF0IHJ1bnRpbWUuCisgKi8KKyNpZm5kZWYgTVBJX01BTl9QQUdFXzNfSU5GT19XT1JEUworI2RlZmluZSBNUElfTUFOX1BBR0VfM19JTkZPX1dPUkRTICAgICAgICAgICAoMSkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfTUFOVUZBQ1RVUklOR18zCit7CisgICAgZkNPTkZJR19QQUdFX0hFQURFUiAgICAgICAgICAgICAgICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBNUElfQ0hJUF9SRVZJU0lPTl9JRCAgICAgICAgICAgICAgICBDaGlwSWQ7ICAgICAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mb1tNUElfTUFOX1BBR0VfM19JTkZPX1dPUkRTXTsvKiAwOGggKi8KK30gZkNPTkZJR19QQUdFX01BTlVGQUNUVVJJTkdfMywgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX01BTlVGQUNUVVJJTkdfMywKKyAgTWFudWZhY3R1cmluZ1BhZ2UzX3QsIE1QSV9QT0lOVEVSIHBNYW51ZmFjdHVyaW5nUGFnZTNfdDsKKworI2RlZmluZSBNUElfTUFOVUZBQ1RVUklORzNfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAoMHgwMCkKKworCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfTUFOVUZBQ1RVUklOR180Cit7CisgICAgZkNPTkZJR19QQUdFX0hFQURFUiAgICAgICAgICAgICAgSGVhZGVyOyAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvT2Zmc2V0MDsgICAgICAgIC8qIDA4aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mb1NpemUwOyAgICAgICAgICAvKiAwOWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm9PZmZzZXQxOyAgICAgICAgLyogMEFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvU2l6ZTE7ICAgICAgICAgIC8qIDBCaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5xdWlyeVNpemU7ICAgICAgICAvKiAwQ2ggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzOyAgICAgICAgICAgICAgLyogMERoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgIC8qIDBFaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5xdWlyeURhdGFbNTZdOyAgICAvKiAxMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTVm9sdW1lU2V0dGluZ3M7ICAgLyogNDhoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUVWb2x1bWVTZXR0aW5nczsgIC8qIDRDaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1Wb2x1bWVTZXR0aW5nczsgICAvKiA1MGggKi8KK30gZkNPTkZJR19QQUdFX01BTlVGQUNUVVJJTkdfNCwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX01BTlVGQUNUVVJJTkdfNCwKKyAgTWFudWZhY3R1cmluZ1BhZ2U0X3QsIE1QSV9QT0lOVEVSIHBNYW51ZmFjdHVyaW5nUGFnZTRfdDsKKworI2RlZmluZSBNUElfTUFOVUZBQ1RVUklORzRfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAoMHgwMSkKKworLyogZGVmaW5lcyBmb3IgdGhlIEZsYWdzIGZpZWxkICovCisjZGVmaW5lIE1QSV9NQU5QQUdFNF9JUl9OT19NSVhfU0FTX1NBVEEgICAgICAgICAgICAgICAgICgweDAxKQorCisKK3R5cGVkZWYgc3RydWN0IF9DT05GSUdfUEFHRV9NQU5VRkFDVFVSSU5HXzUKK3sKKyAgICBmQ09ORklHX1BBR0VfSEVBREVSICAgICAgICAgICAgICBIZWFkZXI7ICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVdXSUQ7ICAgICAgICAgICAvKiAwNGggKi8KK30gZkNPTkZJR19QQUdFX01BTlVGQUNUVVJJTkdfNSwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX01BTlVGQUNUVVJJTkdfNSwKKyAgTWFudWZhY3R1cmluZ1BhZ2U1X3QsIE1QSV9QT0lOVEVSIHBNYW51ZmFjdHVyaW5nUGFnZTVfdDsKKworI2RlZmluZSBNUElfTUFOVUZBQ1RVUklORzVfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAoMHgwMCkKKworCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfTUFOVUZBQ1RVUklOR182Cit7CisgICAgZkNPTkZJR19QQUdFX0hFQURFUiAgICAgICAgICAgICAgSGVhZGVyOyAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2R1Y3RTcGVjaWZpY0luZm87LyogMDRoICovCit9IGZDT05GSUdfUEFHRV9NQU5VRkFDVFVSSU5HXzYsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9NQU5VRkFDVFVSSU5HXzYsCisgIE1hbnVmYWN0dXJpbmdQYWdlNl90LCBNUElfUE9JTlRFUiBwTWFudWZhY3R1cmluZ1BhZ2U2X3Q7CisKKyNkZWZpbmUgTVBJX01BTlVGQUNUVVJJTkc2X1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgKDB4MDApCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBJTyBVbml0IENvbmZpZyBQYWdlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX0NPTkZJR19QQUdFX0lPX1VOSVRfMAoreworICAgIGZDT05GSUdfUEFHRV9IRUFERVIgICAgICBIZWFkZXI7ICAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTY0ICAgICAgICAgICAgICAgICAgICAgVW5pcXVlVmFsdWU7ICAgICAgICAgICAgICAgIC8qIDA0aCAqLworfSBmQ09ORklHX1BBR0VfSU9fVU5JVF8wLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfSU9fVU5JVF8wLAorICBJT1VuaXRQYWdlMF90LCBNUElfUE9JTlRFUiBwSU9Vbml0UGFnZTBfdDsKKworI2RlZmluZSBNUElfSU9VTklUUEFHRTBfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAgICAoMHgwMCkKKworCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfSU9fVU5JVF8xCit7CisgICAgZkNPTkZJR19QQUdFX0hFQURFUiAgICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBGbGFnczsgICAgICAgICAgICAgICAgICAgICAgLyogMDRoICovCit9IGZDT05GSUdfUEFHRV9JT19VTklUXzEsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9JT19VTklUXzEsCisgIElPVW5pdFBhZ2UxX3QsIE1QSV9QT0lOVEVSIHBJT1VuaXRQYWdlMV90OworCisjZGVmaW5lIE1QSV9JT1VOSVRQQUdFMV9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICgweDAxKQorCisvKiBJTyBVbml0IFBhZ2UgMSBGbGFncyBkZWZpbmVzICovCisjZGVmaW5lIE1QSV9JT1VOSVRQQUdFMV9NVUxUSV9GVU5DVElPTiAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBNUElfSU9VTklUUEFHRTFfU0lOR0xFX0ZVTkNUSU9OICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgTVBJX0lPVU5JVFBBR0UxX01VTFRJX1BBVEhJTkcgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIE1QSV9JT1VOSVRQQUdFMV9TSU5HTEVfUEFUSElORyAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBNUElfSU9VTklUUEFHRTFfSVJfVVNFX1NUQVRJQ19WT0xVTUVfSUQgICAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgTVBJX0lPVU5JVFBBR0UxX0RJU0FCTEVfUVVFVUVfRlVMTF9IQU5ETElORyAgICAgKDB4MDAwMDAwMjApCisjZGVmaW5lIE1QSV9JT1VOSVRQQUdFMV9ESVNBQkxFX0lSICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDQwKQorI2RlZmluZSBNUElfSU9VTklUUEFHRTFfRk9SQ0VfMzIgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDA4MCkKKyNkZWZpbmUgTVBJX0lPVU5JVFBBR0UxX05BVElWRV9DT01NQU5EX1FfRElTQUJMRSAgICAgICAgKDB4MDAwMDAxMDApCisKKwordHlwZWRlZiBzdHJ1Y3QgX01QSV9BREFQVEVSX0lORk8KK3sKKyAgICBVOCAgICAgIFBjaUJ1c051bWJlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICBQY2lEZXZpY2VBbmRGdW5jdGlvbk51bWJlcjsgICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFUxNiAgICAgQWRhcHRlckZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMmggKi8KK30gTVBJX0FEQVBURVJfSU5GTywgTVBJX1BPSU5URVIgUFRSX01QSV9BREFQVEVSX0lORk8sCisgIE1waUFkYXB0ZXJJbmZvX3QsIE1QSV9QT0lOVEVSIHBNcGlBZGFwdGVySW5mb190OworCisjZGVmaW5lIE1QSV9BREFQVEVSX0lORk9fRkxBR1NfRU1CRURERUQgICAgICAgICAgICAgICAgICgweDAwMDEpCisjZGVmaW5lIE1QSV9BREFQVEVSX0lORk9fRkxBR1NfSU5JVF9TVEFUVVMgICAgICAgICAgICAgICgweDAwMDIpCisKK3R5cGVkZWYgc3RydWN0IF9DT05GSUdfUEFHRV9JT19VTklUXzIKK3sKKyAgICBmQ09ORklHX1BBR0VfSEVBREVSICAgICAgSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBCaW9zVmVyc2lvbjsgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgTVBJX0FEQVBURVJfSU5GTyAgICAgICAgQWRhcHRlck9yZGVyWzRdOyAgICAgICAgICAgIC8qIDBDaCAqLworfSBmQ09ORklHX1BBR0VfSU9fVU5JVF8yLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfSU9fVU5JVF8yLAorICBJT1VuaXRQYWdlMl90LCBNUElfUE9JTlRFUiBwSU9Vbml0UGFnZTJfdDsKKworI2RlZmluZSBNUElfSU9VTklUUEFHRTJfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAgICAoMHgwMCkKKworI2RlZmluZSBNUElfSU9VTklUUEFHRTJfRkxBR1NfUEFVU0VfT05fRVJST1IgICAgICAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgTVBJX0lPVU5JVFBBR0UyX0ZMQUdTX1ZFUkJPU0VfRU5BQkxFICAgICAgICAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIE1QSV9JT1VOSVRQQUdFMl9GTEFHU19DT0xPUl9WSURFT19ESVNBQkxFICAgICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBNUElfSU9VTklUUEFHRTJfRkxBR1NfRE9OVF9IT09LX0lOVF80MCAgICAgICAgICAoMHgwMDAwMDAxMCkKKworI2RlZmluZSBNUElfSU9VTklUUEFHRTJfRkxBR1NfREVWX0xJU1RfRElTUExBWV9NQVNLICAgICAoMHgwMDAwMDBFMCkKKyNkZWZpbmUgTVBJX0lPVU5JVFBBR0UyX0ZMQUdTX0lOU1RBTExFRF9ERVZfRElTUExBWSAgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIE1QSV9JT1VOSVRQQUdFMl9GTEFHU19BREFQVEVSX0RJU1BMQVkgICAgICAgICAgICgweDAwMDAwMDIwKQorI2RlZmluZSBNUElfSU9VTklUUEFHRTJfRkxBR1NfQURBUFRFUl9ERVZfRElTUExBWSAgICAgICAoMHgwMDAwMDA0MCkKKworCisvKgorICogSG9zdCBjb2RlIChkcml2ZXJzLCBCSU9TLCB1dGlsaXRpZXMsIGV0Yy4pIHNob3VsZCBsZWF2ZSB0aGlzIGRlZmluZSBzZXQgdG8KKyAqIG9uZSBhbmQgY2hlY2sgSGVhZGVyLlBhZ2VMZW5ndGggYXQgcnVudGltZS4KKyAqLworI2lmbmRlZiBNUElfSU9fVU5JVF9QQUdFXzNfR1BJT19WQUxfTUFYCisjZGVmaW5lIE1QSV9JT19VTklUX1BBR0VfM19HUElPX1ZBTF9NQVggICAgICgxKQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IF9DT05GSUdfUEFHRV9JT19VTklUXzMKK3sKKyAgICBmQ09ORklHX1BBR0VfSEVBREVSICAgICAgSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgR1BJT0NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDVoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDZoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgR1BJT1ZhbFtNUElfSU9fVU5JVF9QQUdFXzNfR1BJT19WQUxfTUFYXTsgLyogMDhoICovCit9IGZDT05GSUdfUEFHRV9JT19VTklUXzMsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9JT19VTklUXzMsCisgIElPVW5pdFBhZ2UzX3QsIE1QSV9QT0lOVEVSIHBJT1VuaXRQYWdlM190OworCisjZGVmaW5lIE1QSV9JT1VOSVRQQUdFM19QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICgweDAxKQorCisjZGVmaW5lIE1QSV9JT1VOSVRQQUdFM19HUElPX0ZVTkNUSU9OX01BU0sgICAgICAgICAgICAgICgweEZDKQorI2RlZmluZSBNUElfSU9VTklUUEFHRTNfR1BJT19GVU5DVElPTl9TSElGVCAgICAgICAgICAgICAoMikKKyNkZWZpbmUgTVBJX0lPVU5JVFBBR0UzX0dQSU9fU0VUVElOR19PRkYgICAgICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSV9JT1VOSVRQQUdFM19HUElPX1NFVFRJTkdfT04gICAgICAgICAgICAgICAgICgweDAxKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgSU9DIENvbmZpZyBQYWdlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX0NPTkZJR19QQUdFX0lPQ18wCit7CisgICAgZkNPTkZJR19QQUdFX0hFQURFUiAgICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBUb3RhbE5WU3RvcmU7ICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgRnJlZU5WU3RvcmU7ICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFZlbmRvcklEOyAgICAgICAgICAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBEZXZpY2VJRDsgICAgICAgICAgICAgICAgICAgLyogMEVoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmV2aXNpb25JRDsgICAgICAgICAgICAgICAgIC8qIDEwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkWzNdOyAgICAgICAgICAgICAgICAvKiAxMWggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBDbGFzc0NvZGU7ICAgICAgICAgICAgICAgICAgLyogMTRoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgU3Vic3lzdGVtVmVuZG9ySUQ7ICAgICAgICAgIC8qIDE4aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFN1YnN5c3RlbUlEOyAgICAgICAgICAgICAgICAvKiAxQWggKi8KK30gZkNPTkZJR19QQUdFX0lPQ18wLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfSU9DXzAsCisgIElPQ1BhZ2UwX3QsIE1QSV9QT0lOVEVSIHBJT0NQYWdlMF90OworCisjZGVmaW5lIE1QSV9JT0NQQUdFMF9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICgweDAxKQorCisKK3R5cGVkZWYgc3RydWN0IF9DT05GSUdfUEFHRV9JT0NfMQoreworICAgIGZDT05GSUdfUEFHRV9IRUFERVIgICAgICBIZWFkZXI7ICAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgRmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIENvYWxlc2NpbmdUaW1lb3V0OyAgICAgICAgICAvKiAwOGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDb2FsZXNjaW5nRGVwdGg7ICAgICAgICAgICAgLyogMENoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUENJU2xvdE51bTsgICAgICAgICAgICAgICAgIC8qIDBEaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkWzJdOyAgICAgICAgICAgICAgICAvKiAwRWggKi8KK30gZkNPTkZJR19QQUdFX0lPQ18xLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfSU9DXzEsCisgIElPQ1BhZ2UxX3QsIE1QSV9QT0lOVEVSIHBJT0NQYWdlMV90OworCisjZGVmaW5lIE1QSV9JT0NQQUdFMV9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICgweDAxKQorCisvKiBkZWZpbmVzIGZvciB0aGUgRmxhZ3MgZmllbGQgKi8KKyNkZWZpbmUgTVBJX0lPQ1BBR0UxX0VFRFBfSE9TVF9TVVBQT1JUU19ESUYgICAgICAgICAgICAgKDB4MDgwMDAwMDApCisjZGVmaW5lIE1QSV9JT0NQQUdFMV9FRURQX01PREVfTUFTSyAgICAgICAgICAgICAgICAgICAgICgweDA3MDAwMDAwKQorI2RlZmluZSBNUElfSU9DUEFHRTFfRUVEUF9NT0RFX09GRiAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgTVBJX0lPQ1BBR0UxX0VFRFBfTU9ERV9UMTAgICAgICAgICAgICAgICAgICAgICAgKDB4MDEwMDAwMDApCisjZGVmaW5lIE1QSV9JT0NQQUdFMV9FRURQX01PREVfTFNJXzEgICAgICAgICAgICAgICAgICAgICgweDAyMDAwMDAwKQorI2RlZmluZSBNUElfSU9DUEFHRTFfUkVQTFlfQ09BTEVTQ0lORyAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMSkKKworI2RlZmluZSBNUElfSU9DUEFHRTFfUENJU0xPVE5VTV9VTktOT1dOICAgICAgICAgICAgICAgICAoMHhGRikKKworCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfSU9DXzJfUkFJRF9WT0wKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lSUQ7ICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZUJ1czsgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVJT0M7ICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lUGFnZU51bWJlcjsgICAgICAgLyogMDNoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVR5cGU7ICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnczsgICAgICAgICAgICAgICAgICAvKiAwNWggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAgICAgLyogMDZoICovCit9IGZDT05GSUdfUEFHRV9JT0NfMl9SQUlEX1ZPTCwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX0lPQ18yX1JBSURfVk9MLAorICBDb25maWdQYWdlSW9jMlJhaWRWb2xfdCwgTVBJX1BPSU5URVIgcENvbmZpZ1BhZ2VJb2MyUmFpZFZvbF90OworCisvKiBJT0MgUGFnZSAyIFZvbHVtZSBSQUlEIFR5cGUgdmFsdWVzLCBhbHNvIHVzZWQgaW4gUkFJRCBWb2x1bWUgcGFnZXMgKi8KKworI2RlZmluZSBNUElfUkFJRF9WT0xfVFlQRV9JUyAgICAgICAgICAgICAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUElfUkFJRF9WT0xfVFlQRV9JTUUgICAgICAgICAgICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfUkFJRF9WT0xfVFlQRV9JTSAgICAgICAgICAgICAgICAgICAgICAgICgweDAyKQorCisvKiBJT0MgUGFnZSAyIFZvbHVtZSBGbGFncyB2YWx1ZXMgKi8KKworI2RlZmluZSBNUElfSU9DUEFHRTJfRkxBR19WT0xVTUVfSU5BQ1RJVkUgICAgICAgICAgICgweDA4KQorCisvKgorICogSG9zdCBjb2RlIChkcml2ZXJzLCBCSU9TLCB1dGlsaXRpZXMsIGV0Yy4pIHNob3VsZCBsZWF2ZSB0aGlzIGRlZmluZSBzZXQgdG8KKyAqIG9uZSBhbmQgY2hlY2sgSGVhZGVyLlBhZ2VMZW5ndGggYXQgcnVudGltZS4KKyAqLworI2lmbmRlZiBNUElfSU9DX1BBR0VfMl9SQUlEX1ZPTFVNRV9NQVgKKyNkZWZpbmUgTVBJX0lPQ19QQUdFXzJfUkFJRF9WT0xVTUVfTUFYICAgICAgKDEpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgX0NPTkZJR19QQUdFX0lPQ18yCit7CisgICAgZkNPTkZJR19QQUdFX0hFQURFUiAgICAgICAgICBIZWFkZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIENhcGFiaWxpdGllc0ZsYWdzOyAgICAgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtQWN0aXZlVm9sdW1lczsgICAgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhWb2x1bWVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDloICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIE51bUFjdGl2ZVBoeXNEaXNrczsgICAgICAgICAgICAgICAgICAvKiAwQWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4UGh5c0Rpc2tzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDBCaCAqLworICAgIGZDT05GSUdfUEFHRV9JT0NfMl9SQUlEX1ZPTCAgUmFpZFZvbHVtZVtNUElfSU9DX1BBR0VfMl9SQUlEX1ZPTFVNRV9NQVhdOy8qIDBDaCAqLworfSBmQ09ORklHX1BBR0VfSU9DXzIsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9JT0NfMiwKKyAgSU9DUGFnZTJfdCwgTVBJX1BPSU5URVIgcElPQ1BhZ2UyX3Q7CisKKyNkZWZpbmUgTVBJX0lPQ1BBR0UyX1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDIpCisKKy8qIElPQyBQYWdlIDIgQ2FwYWJpbGl0aWVzIGZsYWdzICovCisKKyNkZWZpbmUgTVBJX0lPQ1BBR0UyX0NBUF9GTEFHU19JU19TVVBQT1JUICAgICAgICAgICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIE1QSV9JT0NQQUdFMl9DQVBfRkxBR1NfSU1FX1NVUFBPUlQgICAgICAgICAgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBNUElfSU9DUEFHRTJfQ0FQX0ZMQUdTX0lNX1NVUFBPUlQgICAgICAgICAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgTVBJX0lPQ1BBR0UyX0NBUF9GTEFHU19TRVNfU1VQUE9SVCAgICAgICAgICAgICAgKDB4MjAwMDAwMDApCisjZGVmaW5lIE1QSV9JT0NQQUdFMl9DQVBfRkxBR1NfU0FGVEVfU1VQUE9SVCAgICAgICAgICAgICgweDQwMDAwMDAwKQorI2RlZmluZSBNUElfSU9DUEFHRTJfQ0FQX0ZMQUdTX0NST1NTX0NIQU5ORUxfU1VQUE9SVCAgICAoMHg4MDAwMDAwMCkKKworCit0eXBlZGVmIHN0cnVjdCBfSU9DXzNfUEhZU19ESVNLCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIFBoeXNEaXNrSUQ7ICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBQaHlzRGlza0J1czsgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgUGh5c0Rpc2tJT0M7ICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIFBoeXNEaXNrTnVtOyAgICAgICAgICAgIC8qIDAzaCAqLworfSBJT0NfM19QSFlTX0RJU0ssIE1QSV9QT0lOVEVSIFBUUl9JT0NfM19QSFlTX0RJU0ssCisgIElvYzNQaHlzRGlza190LCBNUElfUE9JTlRFUiBwSW9jM1BoeXNEaXNrX3Q7CisKKy8qCisgKiBIb3N0IGNvZGUgKGRyaXZlcnMsIEJJT1MsIHV0aWxpdGllcywgZXRjLikgc2hvdWxkIGxlYXZlIHRoaXMgZGVmaW5lIHNldCB0bworICogb25lIGFuZCBjaGVjayBIZWFkZXIuUGFnZUxlbmd0aCBhdCBydW50aW1lLgorICovCisjaWZuZGVmIE1QSV9JT0NfUEFHRV8zX1BIWVNESVNLX01BWAorI2RlZmluZSBNUElfSU9DX1BBR0VfM19QSFlTRElTS19NQVggICAgICAgICAoMSkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfSU9DXzMKK3sKKyAgICBmQ09ORklHX1BBR0VfSEVBREVSICAgICAgICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1QaHlzRGlza3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDVoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA2aCAqLworICAgIElPQ18zX1BIWVNfRElTSyAgICAgICAgICAgICBQaHlzRGlza1tNUElfSU9DX1BBR0VfM19QSFlTRElTS19NQVhdOyAvKiAwOGggKi8KK30gZkNPTkZJR19QQUdFX0lPQ18zLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfSU9DXzMsCisgIElPQ1BhZ2UzX3QsIE1QSV9QT0lOVEVSIHBJT0NQYWdlM190OworCisjZGVmaW5lIE1QSV9JT0NQQUdFM19QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICgweDAwKQorCisKK3R5cGVkZWYgc3RydWN0IF9JT0NfNF9TRVAKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgU0VQVGFyZ2V0SUQ7ICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIFNFUEJ1czsgICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgICAgICAvKiAwMmggKi8KK30gSU9DXzRfU0VQLCBNUElfUE9JTlRFUiBQVFJfSU9DXzRfU0VQLAorICBJb2M0U2VwX3QsIE1QSV9QT0lOVEVSIHBJb2M0U2VwX3Q7CisKKy8qCisgKiBIb3N0IGNvZGUgKGRyaXZlcnMsIEJJT1MsIHV0aWxpdGllcywgZXRjLikgc2hvdWxkIGxlYXZlIHRoaXMgZGVmaW5lIHNldCB0bworICogb25lIGFuZCBjaGVjayBIZWFkZXIuUGFnZUxlbmd0aCBhdCBydW50aW1lLgorICovCisjaWZuZGVmIE1QSV9JT0NfUEFHRV80X1NFUF9NQVgKKyNkZWZpbmUgTVBJX0lPQ19QQUdFXzRfU0VQX01BWCAgICAgICAgICAgICAgKDEpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgX0NPTkZJR19QQUdFX0lPQ180Cit7CisgICAgZkNPTkZJR19QQUdFX0hFQURFUiAgICAgICAgICBIZWFkZXI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBBY3RpdmVTRVA7ICAgICAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhTRVA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA1aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgICAgIC8qIDA2aCAqLworICAgIElPQ180X1NFUCAgICAgICAgICAgICAgICAgICBTRVBbTVBJX0lPQ19QQUdFXzRfU0VQX01BWF07ICAgIC8qIDA4aCAqLworfSBmQ09ORklHX1BBR0VfSU9DXzQsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9JT0NfNCwKKyAgSU9DUGFnZTRfdCwgTVBJX1BPSU5URVIgcElPQ1BhZ2U0X3Q7CisKKyNkZWZpbmUgTVBJX0lPQ1BBR0U0X1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDApCisKKwordHlwZWRlZiBzdHJ1Y3QgX0lPQ181X0hPVF9TUEFSRQoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBQaHlzRGlza051bTsgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIEhvdFNwYXJlUG9vbDsgICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnczsgICAgICAgICAgICAgICAgICAgLyogMDNoICovCit9IElPQ181X0hPVF9TUEFSRSwgTVBJX1BPSU5URVIgUFRSX0lPQ181X0hPVF9TUEFSRSwKKyAgSW9jNUhvdFNwYXJlX3QsIE1QSV9QT0lOVEVSIHBJb2M1SG90U3BhcmVfdDsKKworLyogSU9DIFBhZ2UgNSBIb3RTcGFyZSBGbGFncyAqLworI2RlZmluZSBNUElfSU9DX1BBR0VfNV9IT1RfU1BBUkVfQUNUSVZFICAgICAgICAgICAgICAgICAoMHgwMSkKKworLyoKKyAqIEhvc3QgY29kZSAoZHJpdmVycywgQklPUywgdXRpbGl0aWVzLCBldGMuKSBzaG91bGQgbGVhdmUgdGhpcyBkZWZpbmUgc2V0IHRvCisgKiBvbmUgYW5kIGNoZWNrIEhlYWRlci5QYWdlTGVuZ3RoIGF0IHJ1bnRpbWUuCisgKi8KKyNpZm5kZWYgTVBJX0lPQ19QQUdFXzVfSE9UX1NQQVJFX01BWAorI2RlZmluZSBNUElfSU9DX1BBR0VfNV9IT1RfU1BBUkVfTUFYICAgICAgICAoMSkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfSU9DXzUKK3sKKyAgICBmQ09ORklHX1BBR0VfSEVBREVSICAgICAgICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIE51bUhvdFNwYXJlczsgICAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAgICAgLyogMDloICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgICAgICAgICAgLyogMEFoICovCisgICAgSU9DXzVfSE9UX1NQQVJFICAgICAgICAgICAgIEhvdFNwYXJlW01QSV9JT0NfUEFHRV81X0hPVF9TUEFSRV9NQVhdOyAvKiAwQ2ggKi8KK30gZkNPTkZJR19QQUdFX0lPQ181LCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfSU9DXzUsCisgIElPQ1BhZ2U1X3QsIE1QSV9QT0lOVEVSIHBJT0NQYWdlNV90OworCisjZGVmaW5lIE1QSV9JT0NQQUdFNV9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICgweDAwKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgQklPUyBQb3J0IENvbmZpZyBQYWdlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX0NPTkZJR19QQUdFX0JJT1NfMQoreworICAgIGZDT05GSUdfUEFHRV9IRUFERVIgICAgICBIZWFkZXI7ICAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgQmlvc09wdGlvbnM7ICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIElPQ1NldHRpbmdzOyAgICAgICAgICAgICAgICAvKiAwOGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMENoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgRGV2aWNlU2V0dGluZ3M7ICAgICAgICAgICAgIC8qIDEwaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIE51bWJlck9mRGV2aWNlczsgICAgICAgICAgICAvKiAxNGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgLyogMTZoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSU9UaW1lb3V0QmxvY2tEZXZpY2VzTm9uUk07IC8qIDE4aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIElPVGltZW91dFNlcXVlbnRpYWw7ICAgICAgICAvKiAxQWggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBJT1RpbWVvdXRPdGhlcjsgICAgICAgICAgICAgLyogMUNoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSU9UaW1lb3V0QmxvY2tEZXZpY2VzUk07ICAgIC8qIDFFaCAqLworfSBmQ09ORklHX1BBR0VfQklPU18xLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfQklPU18xLAorICBCSU9TUGFnZTFfdCwgTVBJX1BPSU5URVIgcEJJT1NQYWdlMV90OworCisjZGVmaW5lIE1QSV9CSU9TUEFHRTFfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICgweDAwKQorCisvKiB2YWx1ZXMgZm9yIHRoZSBCaW9zT3B0aW9ucyBmaWVsZCAqLworI2RlZmluZSBNUElfQklPU1BBR0UxX09QVElPTlNfU1BJX0VOQUJMRSAgICAgICAgICAgICAgICAoMHgwMDAwMDQwMCkKKyNkZWZpbmUgTVBJX0JJT1NQQUdFMV9PUFRJT05TX0ZDX0VOQUJMRSAgICAgICAgICAgICAgICAgKDB4MDAwMDAyMDApCisjZGVmaW5lIE1QSV9CSU9TUEFHRTFfT1BUSU9OU19TQVNfRU5BQkxFICAgICAgICAgICAgICAgICgweDAwMDAwMTAwKQorI2RlZmluZSBNUElfQklPU1BBR0UxX09QVElPTlNfRElTQUJMRV9CSU9TICAgICAgICAgICAgICAoMHgwMDAwMDAwMSkKKworLyogdmFsdWVzIGZvciB0aGUgSU9DU2V0dGluZ3MgZmllbGQgKi8KKyNkZWZpbmUgTVBJX0JJT1NQQUdFMV9JT0NTRVRfTUFTS19TUElOVVBfREVMQVkgICAgICAgICAgKDB4MDAwMDBGMDApCisjZGVmaW5lIE1QSV9CSU9TUEFHRTFfSU9DU0VUX1NISUZUX1NQSU5VUF9ERUxBWSAgICAgICAgICg4KQorCisjZGVmaW5lIE1QSV9CSU9TUEFHRTFfSU9DU0VUX01BU0tfUk1fU0VUVElORyAgICAgICAgICAgICgweDAwMDAwMEMwKQorI2RlZmluZSBNUElfQklPU1BBR0UxX0lPQ1NFVF9OT05FX1JNX1NFVFRJTkcgICAgICAgICAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgTVBJX0JJT1NQQUdFMV9JT0NTRVRfQk9PVF9STV9TRVRUSU5HICAgICAgICAgICAgKDB4MDAwMDAwNDApCisjZGVmaW5lIE1QSV9CSU9TUEFHRTFfSU9DU0VUX01FRElBX1JNX1NFVFRJTkcgICAgICAgICAgICgweDAwMDAwMDgwKQorCisjZGVmaW5lIE1QSV9CSU9TUEFHRTFfSU9DU0VUX01BU0tfQURBUFRFUl9TVVBQT1JUICAgICAgICgweDAwMDAwMDMwKQorI2RlZmluZSBNUElfQklPU1BBR0UxX0lPQ1NFVF9OT19TVVBQT1JUICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgTVBJX0JJT1NQQUdFMV9JT0NTRVRfQklPU19TVVBQT1JUICAgICAgICAgICAgICAgKDB4MDAwMDAwMTApCisjZGVmaW5lIE1QSV9CSU9TUEFHRTFfSU9DU0VUX09TX1NVUFBPUlQgICAgICAgICAgICAgICAgICgweDAwMDAwMDIwKQorI2RlZmluZSBNUElfQklPU1BBR0UxX0lPQ1NFVF9BTExfU1VQUE9SVCAgICAgICAgICAgICAgICAoMHgwMDAwMDAzMCkKKworI2RlZmluZSBNUElfQklPU1BBR0UxX0lPQ1NFVF9BTFRFUk5BVEVfQ0hTICAgICAgICAgICAgICAoMHgwMDAwMDAwOCkKKworLyogdmFsdWVzIGZvciB0aGUgRGV2aWNlU2V0dGluZ3MgZmllbGQgKi8KKyNkZWZpbmUgTVBJX0JJT1NQQUdFMV9ERVZTRVRfRElTQUJMRV9TRVFfTFVOICAgICAgICAgICAgKDB4MDAwMDAwMDgpCisjZGVmaW5lIE1QSV9CSU9TUEFHRTFfREVWU0VUX0RJU0FCTEVfUk1fTFVOICAgICAgICAgICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBNUElfQklPU1BBR0UxX0RFVlNFVF9ESVNBQkxFX05PTl9STV9MVU4gICAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgTVBJX0JJT1NQQUdFMV9ERVZTRVRfRElTQUJMRV9PVEhFUl9MVU4gICAgICAgICAgKDB4MDAwMDAwMDEpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBTQ1NJIFBvcnQgQ29uZmlnIFBhZ2VzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfU0NTSV9QT1JUXzAKK3sKKyAgICBmQ09ORklHX1BBR0VfSEVBREVSICAgICAgSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIENhcGFiaWxpdGllczsgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBQaHlzaWNhbEludGVyZmFjZTsgICAgICAgICAgLyogMDhoICovCit9IGZDT05GSUdfUEFHRV9TQ1NJX1BPUlRfMCwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX1NDU0lfUE9SVF8wLAorICBTQ1NJUG9ydFBhZ2UwX3QsIE1QSV9QT0lOVEVSIHBTQ1NJUG9ydFBhZ2UwX3Q7CisKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTBfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAgKDB4MDEpCisKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTBfQ0FQX0lVICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9EVCAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMF9DQVBfUUFTICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTBfQ0FQX01JTl9TWU5DX1BFUklPRF9NQVNLICAgICAgKDB4MDAwMEZGMDApCisjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UwX1NZTkNfQVNZTkMgICAgICAgICAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMF9TWU5DXzUgICAgICAgICAgICAgICAgICAgICAgICAoMHgzMikKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTBfU1lOQ18xMCAgICAgICAgICAgICAgICAgICAgICAgKDB4MTkpCisjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UwX1NZTkNfMjAgICAgICAgICAgICAgICAgICAgICAgICgweDBDKQorI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMF9TWU5DXzMzXzMzICAgICAgICAgICAgICAgICAgICAoMHgwQikKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTBfU1lOQ180MCAgICAgICAgICAgICAgICAgICAgICAgKDB4MEEpCisjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UwX1NZTkNfODAgICAgICAgICAgICAgICAgICAgICAgICgweDA5KQorI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMF9TWU5DXzE2MCAgICAgICAgICAgICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTBfU1lOQ19VTktOT1dOICAgICAgICAgICAgICAgICAgKDB4RkYpCisKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTBfQ0FQX1NISUZUX01JTl9TWU5DX1BFUklPRCAgICAgKDgpCisjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9HRVRfTUlOX1NZTkNfUEVSSU9EKENhcCkgICAgICBcCisgICAgKCAgKChDYXApICYgTVBJX1NDU0lQT1JUUEFHRTBfQ0FQX01BU0tfTUlOX1NZTkNfUEVSSU9EKSBcCisgICAgPj4gTVBJX1NDU0lQT1JUUEFHRTBfQ0FQX1NISUZUX01JTl9TWU5DX1BFUklPRCAgICAgICAgICBcCisgICAgKQorI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMF9DQVBfTUFYX1NZTkNfT0ZGU0VUX01BU0sgICAgICAoMHgwMEZGMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTBfQ0FQX1NISUZUX01BWF9TWU5DX09GRlNFVCAgICAgKDE2KQorI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMF9DQVBfR0VUX01BWF9TWU5DX09GRlNFVChDYXApICAgICAgXAorICAgICggICgoQ2FwKSAmIE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9NQVNLX01BWF9TWU5DX09GRlNFVCkgXAorICAgID4+IE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9TSElGVF9NQVhfU1lOQ19PRkZTRVQgICAgICAgICAgXAorICAgICkKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTBfQ0FQX1dJREUgICAgICAgICAgICAgICAgICAgICAgKDB4MjAwMDAwMDApCisjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9BSVAgICAgICAgICAgICAgICAgICAgICAgICgweDgwMDAwMDAwKQorCisjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UwX1BIWV9TSUdOQUxfVFlQRV9NQVNLICAgICAgICAgICgweDAwMDAwMDAzKQorI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMF9QSFlfU0lHTkFMX0hWRCAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTBfUEhZX1NJR05BTF9TRSAgICAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UwX1BIWV9TSUdOQUxfTFZEICAgICAgICAgICAgICAgICgweDAzKQorI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMF9QSFlfTUFTS19DT05ORUNURURfSUQgICAgICAgICAoMHhGRjAwMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTBfUEhZX1NISUZUX0NPTk5FQ1RFRF9JRCAgICAgICAgKDI0KQorI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMF9QSFlfQlVTX0ZSRUVfQ09OTkVDVEVEX0lEICAgICAoMHhGRSkKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTBfUEhZX1VOS05PV05fQ09OTkVDVEVEX0lEICAgICAgKDB4RkYpCisKKwordHlwZWRlZiBzdHJ1Y3QgX0NPTkZJR19QQUdFX1NDU0lfUE9SVF8xCit7CisgICAgZkNPTkZJR19QQUdFX0hFQURFUiAgICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uOyAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgT25CdXNUaW1lclZhbHVlOyAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFRhcmdldENvbmZpZzsgICAgICAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMERoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSURDb25maWc7ICAgICAgICAgICAgICAgICAgIC8qIDBFaCAqLworfSBmQ09ORklHX1BBR0VfU0NTSV9QT1JUXzEsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9TQ1NJX1BPUlRfMSwKKyAgU0NTSVBvcnRQYWdlMV90LCBNUElfUE9JTlRFUiBwU0NTSVBvcnRQYWdlMV90OworCisjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UxX1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICgweDAzKQorCisvKiBDb25maWd1cmF0aW9uIHZhbHVlcyAqLworI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMV9DRkdfUE9SVF9TQ1NJX0lEX01BU0sgICAgICAgICAoMHgwMDAwMDBGRikKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTFfQ0ZHX1BPUlRfUkVTUE9OU0VfSURfTUFTSyAgICAgKDB4RkZGRjAwMDApCisjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UxX0NGR19TSElGVF9QT1JUX1JFU1BPTlNFX0lEICAgICgxNikKKworLyogVGFyZ2V0Q29uZmlnIHZhbHVlcyAqLworI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMV9UQVJHQ09ORklHX1RBUkdfT05MWSAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UxX1RBUkdDT05GSUdfSU5JVF9UQVJHICAgICAgICAoMHgwMikKKworCit0eXBlZGVmIHN0cnVjdCBfTVBJX0RFVklDRV9JTkZPCit7CisgICAgVTggICAgICBUaW1lb3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgU3luY0ZhY3RvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVMTYgICAgIERldmljZUZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDJoICovCit9IE1QSV9ERVZJQ0VfSU5GTywgTVBJX1BPSU5URVIgUFRSX01QSV9ERVZJQ0VfSU5GTywKKyAgTXBpRGV2aWNlSW5mb190LCBNUElfUE9JTlRFUiBwTXBpRGV2aWNlSW5mb190OworCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfU0NTSV9QT1JUXzIKK3sKKyAgICBmQ09ORklHX1BBR0VfSEVBREVSICBIZWFkZXI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgUG9ydEZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgIFBvcnRTZXR0aW5nczsgICAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgTVBJX0RFVklDRV9JTkZPICAgICBEZXZpY2VTZXR0aW5nc1sxNl07ICAgICAgICAgICAgIC8qIDBDaCAqLworfSBmQ09ORklHX1BBR0VfU0NTSV9QT1JUXzIsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9TQ1NJX1BPUlRfMiwKKyAgU0NTSVBvcnRQYWdlMl90LCBNUElfUE9JTlRFUiBwU0NTSVBvcnRQYWdlMl90OworCisjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UyX1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAoMHgwMikKKworLyogUG9ydEZsYWdzIHZhbHVlcyAqLworI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMl9QT1JUX0ZMQUdTX1NDQU5fSElHSF9UT19MT1cgICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UyX1BPUlRfRkxBR1NfQVZPSURfU0NTSV9SRVNFVCAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTJfUE9SVF9GTEFHU19BTFRFUk5BVEVfQ0hTICAgICAgICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMl9QT1JUX0ZMQUdTX1RFUk1JTkFUSU9OX0RJU0FCTEUgICAgKDB4MDAwMDAwMTApCisKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTJfUE9SVF9GTEFHU19EVl9NQVNLICAgICAgICAgICAgICAgICgweDAwMDAwMDYwKQorI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMl9QT1JUX0ZMQUdTX0ZVTExfRFYgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UyX1BPUlRfRkxBR1NfQkFTSUNfRFZfT05MWSAgICAgICAgICAoMHgwMDAwMDAyMCkKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTJfUE9SVF9GTEFHU19PRkZfRFYgICAgICAgICAgICAgICAgICgweDAwMDAwMDYwKQorCisKKy8qIFBvcnRTZXR0aW5ncyB2YWx1ZXMgKi8KKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTJfUE9SVF9IT1NUX0lEX01BU0sgICAgICAgICAgICAgICAgICgweDAwMDAwMDBGKQorI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMl9QT1JUX01BU0tfSU5JVF9IQkEgICAgICAgICAgICAgICAgKDB4MDAwMDAwMzApCisjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UyX1BPUlRfRElTQUJMRV9JTklUX0hCQSAgICAgICAgICAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTJfUE9SVF9CSU9TX0lOSVRfSEJBICAgICAgICAgICAgICAgICgweDAwMDAwMDEwKQorI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMl9QT1JUX09TX0lOSVRfSEJBICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMjApCisjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UyX1BPUlRfQklPU19PU19JTklUX0hCQSAgICAgICAgICAgICAoMHgwMDAwMDAzMCkKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTJfUE9SVF9SRU1PVkFCTEVfTUVESUEgICAgICAgICAgICAgICgweDAwMDAwMEMwKQorI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMl9QT1JUX1JNX05PTkUgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UyX1BPUlRfUk1fQk9PVF9PTkxZICAgICAgICAgICAgICAgICAoMHgwMDAwMDA0MCkKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTJfUE9SVF9STV9XSVRIX01FRElBICAgICAgICAgICAgICAgICgweDAwMDAwMDgwKQorI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMl9QT1JUX1NQSU5VUF9ERUxBWV9NQVNLICAgICAgICAgICAgKDB4MDAwMDBGMDApCisjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UyX1BPUlRfU0hJRlRfU1BJTlVQX0RFTEFZICAgICAgICAgICAoOCkKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTJfUE9SVF9NQVNLX05FR09fTUFTVEVSX1NFVFRJTkdTICAgICgweDAwMDAzMDAwKQorI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMl9QT1JUX05FR09fTUFTVEVSX1NFVFRJTkdTICAgICAgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UyX1BPUlRfTk9ORV9NQVNURVJfU0VUVElOR1MgICAgICAgICAoMHgwMDAwMTAwMCkKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTJfUE9SVF9BTExfTUFTVEVSX1NFVFRJTkdTICAgICAgICAgICgweDAwMDAzMDAwKQorCisjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UyX0RFVklDRV9ESVNDT05ORUNUX0VOQUJMRSAgICAgICAgICAoMHgwMDAxKQorI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMl9ERVZJQ0VfSURfU0NBTl9FTkFCTEUgICAgICAgICAgICAgKDB4MDAwMikKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTJfREVWSUNFX0xVTl9TQ0FOX0VOQUJMRSAgICAgICAgICAgICgweDAwMDQpCisjZGVmaW5lIE1QSV9TQ1NJUE9SVFBBR0UyX0RFVklDRV9UQUdfUVVFVUVfRU5BQkxFICAgICAgICAgICAoMHgwMDA4KQorI2RlZmluZSBNUElfU0NTSVBPUlRQQUdFMl9ERVZJQ0VfV0lERV9ESVNBQkxFICAgICAgICAgICAgICAgKDB4MDAxMCkKKyNkZWZpbmUgTVBJX1NDU0lQT1JUUEFHRTJfREVWSUNFX0JPT1RfQ0hPSUNFICAgICAgICAgICAgICAgICgweDAwMjApCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBTQ1NJIFRhcmdldCBEZXZpY2UgQ29uZmlnIFBhZ2VzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfU0NTSV9ERVZJQ0VfMAoreworICAgIGZDT05GSUdfUEFHRV9IRUFERVIgICAgICBIZWFkZXI7ICAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTmVnb3RpYXRlZFBhcmFtZXRlcnM7ICAgICAgIC8qIDA0aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uOyAgICAgICAgICAgICAgICAvKiAwOGggKi8KK30gZkNPTkZJR19QQUdFX1NDU0lfREVWSUNFXzAsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9TQ1NJX0RFVklDRV8wLAorICBTQ1NJRGV2aWNlUGFnZTBfdCwgTVBJX1BPSU5URVIgcFNDU0lEZXZpY2VQYWdlMF90OworCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTBfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAgICgweDAzKQorCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTBfTlBfSVUgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBNUElfU0NTSURFVlBBR0UwX05QX0RUICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgTVBJX1NDU0lERVZQQUdFMF9OUF9RQVMgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTBfTlBfSE9MRF9NQ1MgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBNUElfU0NTSURFVlBBR0UwX05QX1dSX0ZMT1cgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAxMCkKKyNkZWZpbmUgTVBJX1NDU0lERVZQQUdFMF9OUF9SRF9TVFJNICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMjApCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTBfTlBfUlRJICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDQwKQorI2RlZmluZSBNUElfU0NTSURFVlBBR0UwX05QX1BDT01QX0VOICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDA4MCkKKyNkZWZpbmUgTVBJX1NDU0lERVZQQUdFMF9OUF9ORUdfU1lOQ19QRVJJT0RfTUFTSyAgICAgICAgKDB4MDAwMEZGMDApCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTBfTlBfU0hJRlRfU1lOQ19QRVJJT0QgICAgICAgICAgICg4KQorI2RlZmluZSBNUElfU0NTSURFVlBBR0UwX05QX05FR19TWU5DX09GRlNFVF9NQVNLICAgICAgICAoMHgwMEZGMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lERVZQQUdFMF9OUF9TSElGVF9TWU5DX09GRlNFVCAgICAgICAgICAgKDE2KQorI2RlZmluZSBNUElfU0NTSURFVlBBR0UwX05QX1dJREUgICAgICAgICAgICAgICAgICAgICAgICAoMHgyMDAwMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lERVZQQUdFMF9OUF9BSVAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ODAwMDAwMDApCisKKyNkZWZpbmUgTVBJX1NDU0lERVZQQUdFMF9JTkZPX1BBUkFNU19ORUdPVElBVEVEICAgICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTBfSU5GT19TRFRSX1JFSkVDVEVEICAgICAgICAgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBNUElfU0NTSURFVlBBR0UwX0lORk9fV0RUUl9SRUpFQ1RFRCAgICAgICAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgTVBJX1NDU0lERVZQQUdFMF9JTkZPX1BQUl9SRUpFQ1RFRCAgICAgICAgICAgICAgKDB4MDAwMDAwMDgpCisKKwordHlwZWRlZiBzdHJ1Y3QgX0NPTkZJR19QQUdFX1NDU0lfREVWSUNFXzEKK3sKKyAgICBmQ09ORklHX1BBR0VfSEVBREVSICAgICAgSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RlZFBhcmFtZXRlcnM7ICAgICAgICAvKiAwNGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbjsgICAgICAgICAgICAgIC8qIDBDaCAqLworfSBmQ09ORklHX1BBR0VfU0NTSV9ERVZJQ0VfMSwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX1NDU0lfREVWSUNFXzEsCisgIFNDU0lEZXZpY2VQYWdlMV90LCBNUElfUE9JTlRFUiBwU0NTSURldmljZVBhZ2UxX3Q7CisKKyNkZWZpbmUgTVBJX1NDU0lERVZQQUdFMV9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgKDB4MDQpCisKKyNkZWZpbmUgTVBJX1NDU0lERVZQQUdFMV9SUF9JVSAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTFfUlBfRFQgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBNUElfU0NTSURFVlBBR0UxX1JQX1FBUyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgTVBJX1NDU0lERVZQQUdFMV9SUF9IT0xEX01DUyAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDgpCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTFfUlBfV1JfRkxPVyAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDEwKQorI2RlZmluZSBNUElfU0NTSURFVlBBR0UxX1JQX1JEX1NUUk0gICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAyMCkKKyNkZWZpbmUgTVBJX1NDU0lERVZQQUdFMV9SUF9SVEkgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwNDApCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTFfUlBfUENPTVBfRU4gICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDgwKQorI2RlZmluZSBNUElfU0NTSURFVlBBR0UxX1JQX01JTl9TWU5DX1BFUklPRF9NQVNLICAgICAgICAoMHgwMDAwRkYwMCkKKyNkZWZpbmUgTVBJX1NDU0lERVZQQUdFMV9SUF9TSElGVF9NSU5fU1lOQ19QRVJJT0QgICAgICAgKDgpCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTFfUlBfTUFYX1NZTkNfT0ZGU0VUX01BU0sgICAgICAgICgweDAwRkYwMDAwKQorI2RlZmluZSBNUElfU0NTSURFVlBBR0UxX1JQX1NISUZUX01BWF9TWU5DX09GRlNFVCAgICAgICAoMTYpCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTFfUlBfV0lERSAgICAgICAgICAgICAgICAgICAgICAgICgweDIwMDAwMDAwKQorI2RlZmluZSBNUElfU0NTSURFVlBBR0UxX1JQX0FJUCAgICAgICAgICAgICAgICAgICAgICAgICAoMHg4MDAwMDAwMCkKKworI2RlZmluZSBNUElfU0NTSURFVlBBR0UxX0NPTkZfV0RUUl9ESVNBTExPV0VEICAgICAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgTVBJX1NDU0lERVZQQUdFMV9DT05GX1NEVFJfRElTQUxMT1dFRCAgICAgICAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTFfQ09ORl9FWFRFTkRFRF9QQVJBTVNfRU5BQkxFICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBNUElfU0NTSURFVlBBR0UxX0NPTkZfRk9SQ0VfUFBSX01TRyAgICAgICAgICAgICAoMHgwMDAwMDAxMCkKKworCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfU0NTSV9ERVZJQ0VfMgoreworICAgIGZDT05GSUdfUEFHRV9IRUFERVIgICAgICBIZWFkZXI7ICAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgRG9tYWluVmFsaWRhdGlvbjsgICAgICAgICAgIC8qIDA0aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFBhcml0eVBpcGVTZWxlY3Q7ICAgICAgICAgICAvKiAwOGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBEYXRhUGlwZVNlbGVjdDsgICAgICAgICAgICAgLyogMENoICovCit9IGZDT05GSUdfUEFHRV9TQ1NJX0RFVklDRV8yLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfU0NTSV9ERVZJQ0VfMiwKKyAgU0NTSURldmljZVBhZ2UyX3QsIE1QSV9QT0lOVEVSIHBTQ1NJRGV2aWNlUGFnZTJfdDsKKworI2RlZmluZSBNUElfU0NTSURFVlBBR0UyX1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICAoMHgwMSkKKworI2RlZmluZSBNUElfU0NTSURFVlBBR0UyX0RWX0lTSV9FTkFCTEUgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAxMCkKKyNkZWZpbmUgTVBJX1NDU0lERVZQQUdFMl9EVl9TRUNPTkRBUllfRFJJVkVSX0VOQUJMRSAgICAgKDB4MDAwMDAwMjApCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTJfRFZfU0xFV19SQVRFX0NUUkwgICAgICAgICAgICAgICgweDAwMDAwMzgwKQorI2RlZmluZSBNUElfU0NTSURFVlBBR0UyX0RWX1BSSU1fRFJJVkVfU1RSX0NUUkwgICAgICAgICAoMHgwMDAwMUMwMCkKKyNkZWZpbmUgTVBJX1NDU0lERVZQQUdFMl9EVl9TRUNPTkRfRFJJVkVfU1RSX0NUUkwgICAgICAgKDB4MDAwMEUwMDApCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTJfRFZfWENMS0hfU1QgICAgICAgICAgICAgICAgICAgICgweDEwMDAwMDAwKQorI2RlZmluZSBNUElfU0NTSURFVlBBR0UyX0RWX1hDTEtTX1NUICAgICAgICAgICAgICAgICAgICAoMHgyMDAwMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lERVZQQUdFMl9EVl9YQ0xLSF9EVCAgICAgICAgICAgICAgICAgICAgKDB4NDAwMDAwMDApCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTJfRFZfWENMS1NfRFQgICAgICAgICAgICAgICAgICAgICgweDgwMDAwMDAwKQorCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTJfUFBTX1BQU19NQVNLICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAzKQorCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTJfRFBTX0JJVF8wX1BMX1NFTEVDVF9NQVNLICAgICAgICgweDAwMDAwMDAzKQorI2RlZmluZSBNUElfU0NTSURFVlBBR0UyX0RQU19CSVRfMV9QTF9TRUxFQ1RfTUFTSyAgICAgICAoMHgwMDAwMDAwQykKKyNkZWZpbmUgTVBJX1NDU0lERVZQQUdFMl9EUFNfQklUXzJfUExfU0VMRUNUX01BU0sgICAgICAgKDB4MDAwMDAwMzApCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTJfRFBTX0JJVF8zX1BMX1NFTEVDVF9NQVNLICAgICAgICgweDAwMDAwMEMwKQorI2RlZmluZSBNUElfU0NTSURFVlBBR0UyX0RQU19CSVRfNF9QTF9TRUxFQ1RfTUFTSyAgICAgICAoMHgwMDAwMDMwMCkKKyNkZWZpbmUgTVBJX1NDU0lERVZQQUdFMl9EUFNfQklUXzVfUExfU0VMRUNUX01BU0sgICAgICAgKDB4MDAwMDBDMDApCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTJfRFBTX0JJVF82X1BMX1NFTEVDVF9NQVNLICAgICAgICgweDAwMDAzMDAwKQorI2RlZmluZSBNUElfU0NTSURFVlBBR0UyX0RQU19CSVRfN19QTF9TRUxFQ1RfTUFTSyAgICAgICAoMHgwMDAwQzAwMCkKKyNkZWZpbmUgTVBJX1NDU0lERVZQQUdFMl9EUFNfQklUXzhfUExfU0VMRUNUX01BU0sgICAgICAgKDB4MDAwMzAwMDApCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTJfRFBTX0JJVF85X1BMX1NFTEVDVF9NQVNLICAgICAgICgweDAwMEMwMDAwKQorI2RlZmluZSBNUElfU0NTSURFVlBBR0UyX0RQU19CSVRfMTBfUExfU0VMRUNUX01BU0sgICAgICAoMHgwMDMwMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lERVZQQUdFMl9EUFNfQklUXzExX1BMX1NFTEVDVF9NQVNLICAgICAgKDB4MDBDMDAwMDApCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTJfRFBTX0JJVF8xMl9QTF9TRUxFQ1RfTUFTSyAgICAgICgweDAzMDAwMDAwKQorI2RlZmluZSBNUElfU0NTSURFVlBBR0UyX0RQU19CSVRfMTNfUExfU0VMRUNUX01BU0sgICAgICAoMHgwQzAwMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lERVZQQUdFMl9EUFNfQklUXzE0X1BMX1NFTEVDVF9NQVNLICAgICAgKDB4MzAwMDAwMDApCisjZGVmaW5lIE1QSV9TQ1NJREVWUEFHRTJfRFBTX0JJVF8xNV9QTF9TRUxFQ1RfTUFTSyAgICAgICgweEMwMDAwMDAwKQorCisKK3R5cGVkZWYgc3RydWN0IF9DT05GSUdfUEFHRV9TQ1NJX0RFVklDRV8zCit7CisgICAgZkNPTkZJR19QQUdFX0hFQURFUiAgICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBNc2dSZWplY3RDb3VudDsgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUGhhc2VFcnJvckNvdW50OyAgICAgICAgICAgIC8qIDA2aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFBhcml0eUVycm9yQ291bnQ7ICAgICAgICAgICAvKiAwOGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgLyogMEFoICovCit9IGZDT05GSUdfUEFHRV9TQ1NJX0RFVklDRV8zLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfU0NTSV9ERVZJQ0VfMywKKyAgU0NTSURldmljZVBhZ2UzX3QsIE1QSV9QT0lOVEVSIHBTQ1NJRGV2aWNlUGFnZTNfdDsKKworI2RlZmluZSBNUElfU0NTSURFVlBBR0UzX1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICAoMHgwMCkKKworI2RlZmluZSBNUElfU0NTSURFVlBBR0UzX01BWF9DT1VOVEVSICAgICAgICAgICAgICAgICAgICAoMHhGRkZFKQorI2RlZmluZSBNUElfU0NTSURFVlBBR0UzX1VOU1VQUE9SVEVEX0NPVU5URVIgICAgICAgICAgICAoMHhGRkZGKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgRkMgUG9ydCBDb25maWcgUGFnZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9DT05GSUdfUEFHRV9GQ19QT1JUXzAKK3sKKyAgICBmQ09ORklHX1BBR0VfSEVBREVSICAgICAgSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNUElQb3J0TnVtYmVyOyAgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTGlua1R5cGU7ICAgICAgICAgICAgICAgICAgIC8qIDA5aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFBvcnRTdGF0ZTsgICAgICAgICAgICAgICAgICAvKiAwQWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgLyogMEJoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUG9ydElkZW50aWZpZXI7ICAgICAgICAgICAgIC8qIDBDaCAqLworICAgIFU2NCAgICAgICAgICAgICAgICAgICAgIFdXTk47ICAgICAgICAgICAgICAgICAgICAgICAvKiAxMGggKi8KKyAgICBVNjQgICAgICAgICAgICAgICAgICAgICBXV1BOOyAgICAgICAgICAgICAgICAgICAgICAgLyogMThoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgU3VwcG9ydGVkU2VydmljZUNsYXNzOyAgICAgIC8qIDIwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFN1cHBvcnRlZFNwZWVkczsgICAgICAgICAgICAvKiAyNGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBDdXJyZW50U3BlZWQ7ICAgICAgICAgICAgICAgLyogMjhoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTWF4RnJhbWVTaXplOyAgICAgICAgICAgICAgIC8qIDJDaCAqLworICAgIFU2NCAgICAgICAgICAgICAgICAgICAgIEZhYnJpY1dXTk47ICAgICAgICAgICAgICAgICAvKiAzMGggKi8KKyAgICBVNjQgICAgICAgICAgICAgICAgICAgICBGYWJyaWNXV1BOOyAgICAgICAgICAgICAgICAgLyogMzhoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgRGlzY292ZXJlZFBvcnRzQ291bnQ7ICAgICAgIC8qIDQwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1heEluaXRpYXRvcnM7ICAgICAgICAgICAgICAvKiA0NGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNYXhBbGlhc2VzU3VwcG9ydGVkOyAgICAgICAgLyogNDhoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTWF4SGFyZEFsaWFzZXNTdXBwb3J0ZWQ7ICAgIC8qIDQ5aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE51bUN1cnJlbnRBbGlhc2VzOyAgICAgICAgICAvKiA0QWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogNEJoICovCit9IGZDT05GSUdfUEFHRV9GQ19QT1JUXzAsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9GQ19QT1JUXzAsCisgIEZDUG9ydFBhZ2UwX3QsIE1QSV9QT0lOVEVSIHBGQ1BvcnRQYWdlMF90OworCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMF9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICgweDAyKQorCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMF9GTEFHU19QUk9UX01BU0sgICAgICAgICAgICAgICAgICgweDAwMDAwMDBGKQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTBfRkxBR1NfUFJPVF9GQ1BfSU5JVCAgICAgICAgICAgICAoTVBJX1BPUlRGQUNUU19QUk9UT0NPTF9JTklUSUFUT1IpCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMF9GTEFHU19QUk9UX0ZDUF9UQVJHICAgICAgICAgICAgIChNUElfUE9SVEZBQ1RTX1BST1RPQ09MX1RBUkdFVCkKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UwX0ZMQUdTX1BST1RfTEFOICAgICAgICAgICAgICAgICAgKE1QSV9QT1JURkFDVFNfUFJPVE9DT0xfTEFOKQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTBfRkxBR1NfUFJPVF9MT0dCVVNBRERSICAgICAgICAgICAoTVBJX1BPUlRGQUNUU19QUk9UT0NPTF9MT0dCVVNBRERSKQorCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMF9GTEFHU19BTElBU19BTFBBX1NVUFBPUlRFRCAgICAgICgweDAwMDAwMDEwKQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTBfRkxBR1NfQUxJQVNfV1dOX1NVUFBPUlRFRCAgICAgICAoMHgwMDAwMDAyMCkKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UwX0ZMQUdTX0ZBQlJJQ19XV05fVkFMSUQgICAgICAgICAgKDB4MDAwMDAwNDApCisKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UwX0ZMQUdTX0FUVEFDSF9UWVBFX01BU0sgICAgICAgICAgKDB4MDAwMDBGMDApCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMF9GTEFHU19BVFRBQ0hfTk9fSU5JVCAgICAgICAgICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTBfRkxBR1NfQVRUQUNIX1BPSU5UX1RPX1BPSU5UICAgICAoMHgwMDAwMDEwMCkKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UwX0ZMQUdTX0FUVEFDSF9QUklWQVRFX0xPT1AgICAgICAgKDB4MDAwMDAyMDApCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMF9GTEFHU19BVFRBQ0hfRkFCUklDX0RJUkVDVCAgICAgICgweDAwMDAwNDAwKQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTBfRkxBR1NfQVRUQUNIX1BVQkxJQ19MT09QICAgICAgICAoMHgwMDAwMDgwMCkKKworI2RlZmluZSBNUElfRkNQT1JUUEFHRTBfTFRZUEVfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UwX0xUWVBFX09USEVSICAgICAgICAgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMF9MVFlQRV9VTktOT1dOICAgICAgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTBfTFRZUEVfQ09QUEVSICAgICAgICAgICAgICAgICAgICAoMHgwMykKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UwX0xUWVBFX1NJTkdMRV8xMzAwICAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMF9MVFlQRV9TSU5HTEVfMTUwMCAgICAgICAgICAgICAgICgweDA1KQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTBfTFRZUEVfNTBfTEFTRVJfTVVMVEkgICAgICAgICAgICAoMHgwNikKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UwX0xUWVBFXzUwX0xFRF9NVUxUSSAgICAgICAgICAgICAgKDB4MDcpCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMF9MVFlQRV82Ml9MQVNFUl9NVUxUSSAgICAgICAgICAgICgweDA4KQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTBfTFRZUEVfNjJfTEVEX01VTFRJICAgICAgICAgICAgICAoMHgwOSkKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UwX0xUWVBFX01VTFRJX0xPTkdfV0FWRSAgICAgICAgICAgKDB4MEEpCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMF9MVFlQRV9NVUxUSV9TSE9SVF9XQVZFICAgICAgICAgICgweDBCKQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTBfTFRZUEVfTEFTRVJfU0hPUlRfV0FWRSAgICAgICAgICAoMHgwQykKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UwX0xUWVBFX0xFRF9TSE9SVF9XQVZFICAgICAgICAgICAgKDB4MEQpCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMF9MVFlQRV8xMzAwX0xPTkdfV0FWRSAgICAgICAgICAgICgweDBFKQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTBfTFRZUEVfMTUwMF9MT05HX1dBVkUgICAgICAgICAgICAoMHgwRikKKworI2RlZmluZSBNUElfRkNQT1JUUEFHRTBfUE9SVFNUQVRFX1VOS05PV04gICAgICAgICAgICAgICAoMHgwMSkgICAgICAvKihTTklBKUhCQV9QT1JUU1RBVEVfVU5LTk9XTiAgICAgICAxIFVua25vd24gKi8KKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UwX1BPUlRTVEFURV9PTkxJTkUgICAgICAgICAgICAgICAgKDB4MDIpICAgICAgLyooU05JQSlIQkFfUE9SVFNUQVRFX09OTElORSAgICAgICAgMiBPcGVyYXRpb25hbCAqLworI2RlZmluZSBNUElfRkNQT1JUUEFHRTBfUE9SVFNUQVRFX09GRkxJTkUgICAgICAgICAgICAgICAoMHgwMykgICAgICAvKihTTklBKUhCQV9QT1JUU1RBVEVfT0ZGTElORSAgICAgICAzIFVzZXIgT2ZmbGluZSAqLworI2RlZmluZSBNUElfRkNQT1JUUEFHRTBfUE9SVFNUQVRFX0JZUEFTU0VEICAgICAgICAgICAgICAoMHgwNCkgICAgICAvKihTTklBKUhCQV9QT1JUU1RBVEVfQllQQVNTRUQgICAgICA0IEJ5cGFzc2VkICovCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMF9QT1JUU1RBVEVfRElBR05PU1QgICAgICAgICAgICAgICgweDA1KSAgICAgIC8qKFNOSUEpSEJBX1BPUlRTVEFURV9ESUFHTk9TVElDUyAgIDUgSW4gZGlhZ25vc3RpY3MgbW9kZSAqLworI2RlZmluZSBNUElfRkNQT1JUUEFHRTBfUE9SVFNUQVRFX0xJTktET1dOICAgICAgICAgICAgICAoMHgwNikgICAgICAvKihTTklBKUhCQV9QT1JUU1RBVEVfTElOS0RPV04gICAgICA2IExpbmsgRG93biAqLworI2RlZmluZSBNUElfRkNQT1JUUEFHRTBfUE9SVFNUQVRFX0VSUk9SICAgICAgICAgICAgICAgICAoMHgwNykgICAgICAvKihTTklBKUhCQV9QT1JUU1RBVEVfRVJST1IgICAgICAgICA3IFBvcnQgRXJyb3IgKi8KKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UwX1BPUlRTVEFURV9MT09QQkFDSyAgICAgICAgICAgICAgKDB4MDgpICAgICAgLyooU05JQSlIQkFfUE9SVFNUQVRFX0xPT1BCQUNLICAgICAgOCBMb29wYmFjayAqLworCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMF9TVVBQT1JUX0NMQVNTXzEgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTBfU1VQUE9SVF9DTEFTU18yICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UwX1NVUFBPUlRfQ0xBU1NfMyAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDQpCisKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UwX1NVUFBPUlRfU1BFRURfVUtOT1dOICAgICAgICAgICAgKDB4MDAwMDAwMDApIC8qIChTTklBKUhCQV9QT1JUU1BFRURfVU5LTk9XTiAwICAgVW5rbm93biAtIHRyYW5zY2VpdmVyIGluY2FwYWJsZSBvZiByZXBvcnRpbmcgKi8KKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UwX1NVUFBPUlRfMUdCSVRfU1BFRUQgICAgICAgICAgICAgKDB4MDAwMDAwMDEpIC8qIChTTklBKUhCQV9QT1JUU1BFRURfMUdCSVQgICAxICAgMSBHQml0L3NlYyAqLworI2RlZmluZSBNUElfRkNQT1JUUEFHRTBfU1VQUE9SVF8yR0JJVF9TUEVFRCAgICAgICAgICAgICAoMHgwMDAwMDAwMikgLyogKFNOSUEpSEJBX1BPUlRTUEVFRF8yR0JJVCAgIDIgICAyIEdCaXQvc2VjICovCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMF9TVVBQT1JUXzEwR0JJVF9TUEVFRCAgICAgICAgICAgICgweDAwMDAwMDA0KSAvKiAoU05JQSlIQkFfUE9SVFNQRUVEXzEwR0JJVCAgNCAgMTAgR0JpdC9zZWMgKi8KKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UwX1NVUFBPUlRfNEdCSVRfU1BFRUQgICAgICAgICAgICAgKDB4MDAwMDAwMDgpIC8qIChTTklBKUhCQV9QT1JUU1BFRURfNEdCSVQgICA4ICAgNCBHQml0L3NlYyAqLworCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMF9DVVJSRU5UX1NQRUVEX1VLTk9XTiAgICAgICAgICAgIE1QSV9GQ1BPUlRQQUdFMF9TVVBQT1JUX1NQRUVEX1VLTk9XTgorI2RlZmluZSBNUElfRkNQT1JUUEFHRTBfQ1VSUkVOVF9TUEVFRF8xR0JJVCAgICAgICAgICAgICBNUElfRkNQT1JUUEFHRTBfU1VQUE9SVF8xR0JJVF9TUEVFRAorI2RlZmluZSBNUElfRkNQT1JUUEFHRTBfQ1VSUkVOVF9TUEVFRF8yR0JJVCAgICAgICAgICAgICBNUElfRkNQT1JUUEFHRTBfU1VQUE9SVF8yR0JJVF9TUEVFRAorI2RlZmluZSBNUElfRkNQT1JUUEFHRTBfQ1VSUkVOVF9TUEVFRF8xMEdCSVQgICAgICAgICAgICBNUElfRkNQT1JUUEFHRTBfU1VQUE9SVF8xMEdCSVRfU1BFRUQKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UwX0NVUlJFTlRfU1BFRURfNEdCSVQgICAgICAgICAgICAgTVBJX0ZDUE9SVFBBR0UwX1NVUFBPUlRfNEdCSVRfU1BFRUQKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UwX0NVUlJFTlRfU1BFRURfTk9UX05FR09USUFURUQgICAgKDB4MDAwMDgwMDApICAgICAgICAvKiAoU05JQSlIQkFfUE9SVFNQRUVEX05PVF9ORUdPVElBVEVEICgxPDwxNSkgU3BlZWQgbm90IGVzdGFibGlzaGVkICovCisKKworCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfRkNfUE9SVF8xCit7CisgICAgZkNPTkZJR19QQUdFX0hFQURFUiAgICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBGbGFnczsgICAgICAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTY0ICAgICAgICAgICAgICAgICAgICAgTm9TRUVQUk9NV1dOTjsgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFU2NCAgICAgICAgICAgICAgICAgICAgIE5vU0VFUFJPTVdXUE47ICAgICAgICAgICAgICAvKiAxMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBIYXJkQUxQQTsgICAgICAgICAgICAgICAgICAgLyogMThoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTGlua0NvbmZpZzsgICAgICAgICAgICAgICAgIC8qIDE5aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFRvcG9sb2d5Q29uZmlnOyAgICAgICAgICAgICAvKiAxQWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBBbHRDb25uZWN0b3I7ICAgICAgICAgICAgICAgLyogMUJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTnVtUmVxdWVzdGVkQWxpYXNlczsgICAgICAgIC8qIDFDaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJSX1RPVjsgICAgICAgICAgICAgICAgICAgICAvKiAxRGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBJbml0aWF0b3JEZXZpY2VUaW1lb3V0OyAgICAgLyogMUVoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgSW5pdGlhdG9ySW9QZW5kVGltZW91dDsgICAgIC8qIDFGaCAqLworfSBmQ09ORklHX1BBR0VfRkNfUE9SVF8xLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfRkNfUE9SVF8xLAorICBGQ1BvcnRQYWdlMV90LCBNUElfUE9JTlRFUiBwRkNQb3J0UGFnZTFfdDsKKworI2RlZmluZSBNUElfRkNQT1JUUEFHRTFfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAgICAoMHgwNikKKworI2RlZmluZSBNUElfRkNQT1JUUEFHRTFfRkxBR1NfRVhUX0ZDUF9TVEFUVVNfRU4gICAgICAgICAoMHgwODAwMDAwMCkKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UxX0ZMQUdTX0lNTUVESUFURV9FUlJPUl9SRVBMWSAgICAgKDB4MDQwMDAwMDApCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMV9GTEFHU19GT1JDRV9VU0VfTk9TRUVQUk9NX1dXTlMgICgweDAyMDAwMDAwKQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTFfRkxBR1NfVkVSQk9TRV9SRVNDQU5fRVZFTlRTICAgICAoMHgwMTAwMDAwMCkKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UxX0ZMQUdTX1RBUkdFVF9NT0RFX09YSUQgICAgICAgICAgKDB4MDA4MDAwMDApCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMV9GTEFHU19QT1JUX09GRkxJTkUgICAgICAgICAgICAgICgweDAwNDAwMDAwKQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTFfRkxBR1NfU09GVF9BTFBBX0ZBTExCQUNLICAgICAgICAoMHgwMDIwMDAwMCkKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UxX0ZMQUdTX01BU0tfUlJfVE9WX1VOSVRTICAgICAgICAgKDB4MDAwMDAwNzApCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMV9GTEFHU19TVVBQUkVTU19QUk9UX1JFRyAgICAgICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTFfRkxBR1NfUExPR0lfT05fTE9HTyAgICAgICAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UxX0ZMQUdTX01BSU5UQUlOX0xPR0lOUyAgICAgICAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMV9GTEFHU19TT1JUX0JZX0RJRCAgICAgICAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTFfRkxBR1NfU09SVF9CWV9XV04gICAgICAgICAgICAgICAoMHgwMDAwMDAwMCkKKworI2RlZmluZSBNUElfRkNQT1JUUEFHRTFfRkxBR1NfUFJPVF9NQVNLICAgICAgICAgICAgICAgICAoMHhGMDAwMDAwMCkKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UxX0ZMQUdTX1BST1RfU0hJRlQgICAgICAgICAgICAgICAgKDI4KQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTFfRkxBR1NfUFJPVF9GQ1BfSU5JVCAgICAgICAgICAgICAoKFUzMilNUElfUE9SVEZBQ1RTX1BST1RPQ09MX0lOSVRJQVRPUiA8PCBNUElfRkNQT1JUUEFHRTFfRkxBR1NfUFJPVF9TSElGVCkKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UxX0ZMQUdTX1BST1RfRkNQX1RBUkcgICAgICAgICAgICAgKChVMzIpTVBJX1BPUlRGQUNUU19QUk9UT0NPTF9UQVJHRVQgPDwgTVBJX0ZDUE9SVFBBR0UxX0ZMQUdTX1BST1RfU0hJRlQpCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMV9GTEFHU19QUk9UX0xBTiAgICAgICAgICAgICAgICAgICgoVTMyKU1QSV9QT1JURkFDVFNfUFJPVE9DT0xfTEFOIDw8IE1QSV9GQ1BPUlRQQUdFMV9GTEFHU19QUk9UX1NISUZUKQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTFfRkxBR1NfUFJPVF9MT0dCVVNBRERSICAgICAgICAgICAoKFUzMilNUElfUE9SVEZBQ1RTX1BST1RPQ09MX0xPR0JVU0FERFIgPDwgTVBJX0ZDUE9SVFBBR0UxX0ZMQUdTX1BST1RfU0hJRlQpCisKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UxX0ZMQUdTX05PTkVfUlJfVE9WX1VOSVRTICAgICAgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMV9GTEFHU19USE9VU0FORFRIX1JSX1RPVl9VTklUUyAgICgweDAwMDAwMDEwKQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTFfRkxBR1NfVEVOVEhfUlJfVE9WX1VOSVRTICAgICAgICAoMHgwMDAwMDAzMCkKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UxX0ZMQUdTX1RFTl9SUl9UT1ZfVU5JVFMgICAgICAgICAgKDB4MDAwMDAwNTApCisKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UxX0hBUkRfQUxQQV9OT1RfVVNFRCAgICAgICAgICAgICAgKDB4RkYpCisKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UxX0xDT05GSUdfU1BFRURfTUFTSyAgICAgICAgICAgICAgKDB4MEYpCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMV9MQ09ORklHX1NQRUVEXzFHSUcgICAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTFfTENPTkZJR19TUEVFRF8yR0lHICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UxX0xDT05GSUdfU1BFRURfNEdJRyAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMV9MQ09ORklHX1NQRUVEXzEwR0lHICAgICAgICAgICAgICgweDAzKQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTFfTENPTkZJR19TUEVFRF9BVVRPICAgICAgICAgICAgICAoMHgwRikKKworI2RlZmluZSBNUElfRkNQT1JUUEFHRTFfVE9QT0xPR1lfTUFTSyAgICAgICAgICAgICAgICAgICAoMHgwRikKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UxX1RPUE9MT0dZX05MUE9SVCAgICAgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMV9UT1BPTE9HWV9OUE9SVCAgICAgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTFfVE9QT0xPR1lfQVVUTyAgICAgICAgICAgICAgICAgICAoMHgwRikKKworI2RlZmluZSBNUElfRkNQT1JUUEFHRTFfQUxUX0NPTk5fVU5LTk9XTiAgICAgICAgICAgICAgICAoMHgwMCkKKworI2RlZmluZSBNUElfRkNQT1JUUEFHRTFfSU5JVElBVE9SX0RFVl9USU1FT1VUX01BU0sgICAgICAoMHg3RikKKworCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfRkNfUE9SVF8yCit7CisgICAgZkNPTkZJR19QQUdFX0hFQURFUiAgICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJBY3RpdmU7ICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQUxQQVsxMjddOyAgICAgICAgICAgICAgICAgIC8qIDA1aCAqLworfSBmQ09ORklHX1BBR0VfRkNfUE9SVF8yLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfRkNfUE9SVF8yLAorICBGQ1BvcnRQYWdlMl90LCBNUElfUE9JTlRFUiBwRkNQb3J0UGFnZTJfdDsKKworI2RlZmluZSBNUElfRkNQT1JUUEFHRTJfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAgICAoMHgwMSkKKworCit0eXBlZGVmIHN0cnVjdCBfV1dOX0ZPUk1BVAoreworICAgIFU2NCAgICAgICAgICAgICAgICAgICAgIFdXTk47ICAgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVNjQgICAgICAgICAgICAgICAgICAgICBXV1BOOyAgICAgICAgICAgICAgICAgICAgICAgLyogMDhoICovCit9IFdXTl9GT1JNQVQsIE1QSV9QT0lOVEVSIFBUUl9XV05fRk9STUFULAorICBXV05Gb3JtYXQsIE1QSV9QT0lOVEVSIHBXV05Gb3JtYXQ7CisKK3R5cGVkZWYgdW5pb24gX0ZDX1BPUlRfUEVSU0lTVEVOVF9QSFlTSUNBTF9JRAoreworICAgIFdXTl9GT1JNQVQgICAgICAgICAgICAgIFdXTjsKKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBEaWQ7Cit9IEZDX1BPUlRfUEVSU0lTVEVOVF9QSFlTSUNBTF9JRCwgTVBJX1BPSU5URVIgUFRSX0ZDX1BPUlRfUEVSU0lTVEVOVF9QSFlTSUNBTF9JRCwKKyAgUGVyc2lzdGVudFBoeXNpY2FsSWRfdCwgTVBJX1BPSU5URVIgcFBlcnNpc3RlbnRQaHlzaWNhbElkX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9GQ19QT1JUX1BFUlNJU1RFTlQKK3sKKyAgICBGQ19QT1JUX1BFUlNJU1RFTlRfUEhZU0lDQUxfSUQgIFBoeXNpY2FsSWRlbnRpZmllcjsgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJRDsgICAgICAgICAgIC8qIDEwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzOyAgICAgICAgICAgICAgICAvKiAxMWggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzOyAgICAgICAgICAgICAgLyogMTJoICovCit9IEZDX1BPUlRfUEVSU0lTVEVOVCwgTVBJX1BPSU5URVIgUFRSX0ZDX1BPUlRfUEVSU0lTVEVOVCwKKyAgUGVyc2lzdGVudERhdGFfdCwgTVBJX1BPSU5URVIgcFBlcnNpc3RlbnREYXRhX3Q7CisKKyNkZWZpbmUgTVBJX1BFUlNJU1RFTlRfRkxBR1NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgKDE2KQorI2RlZmluZSBNUElfUEVSU0lTVEVOVF9GTEFHU19FTlRSWV9WQUxJRCAgICAgICAgICAgICAgICAoMHgwMDAxKQorI2RlZmluZSBNUElfUEVSU0lTVEVOVF9GTEFHU19TQ0FOX0lEICAgICAgICAgICAgICAgICAgICAoMHgwMDAyKQorI2RlZmluZSBNUElfUEVSU0lTVEVOVF9GTEFHU19TQ0FOX0xVTlMgICAgICAgICAgICAgICAgICAoMHgwMDA0KQorI2RlZmluZSBNUElfUEVSU0lTVEVOVF9GTEFHU19CT09UX0RFVklDRSAgICAgICAgICAgICAgICAoMHgwMDA4KQorI2RlZmluZSBNUElfUEVSU0lTVEVOVF9GTEFHU19CWV9ESUQgICAgICAgICAgICAgICAgICAgICAoMHgwMDgwKQorCisvKgorICogSG9zdCBjb2RlIChkcml2ZXJzLCBCSU9TLCB1dGlsaXRpZXMsIGV0Yy4pIHNob3VsZCBsZWF2ZSB0aGlzIGRlZmluZSBzZXQgdG8KKyAqIG9uZSBhbmQgY2hlY2sgSGVhZGVyLlBhZ2VMZW5ndGggYXQgcnVudGltZS4KKyAqLworI2lmbmRlZiBNUElfRkNfUE9SVF9QQUdFXzNfRU5UUllfTUFYCisjZGVmaW5lIE1QSV9GQ19QT1JUX1BBR0VfM19FTlRSWV9NQVggICAgICAgICgxKQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IF9DT05GSUdfUEFHRV9GQ19QT1JUXzMKK3sKKyAgICBmQ09ORklHX1BBR0VfSEVBREVSICAgICAgSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIEZDX1BPUlRfUEVSU0lTVEVOVCAgICAgIEVudHJ5W01QSV9GQ19QT1JUX1BBR0VfM19FTlRSWV9NQVhdOyAgICAvKiAwNGggKi8KK30gZkNPTkZJR19QQUdFX0ZDX1BPUlRfMywgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX0ZDX1BPUlRfMywKKyAgRkNQb3J0UGFnZTNfdCwgTVBJX1BPSU5URVIgcEZDUG9ydFBhZ2UzX3Q7CisKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UzX1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICAgKDB4MDEpCisKKwordHlwZWRlZiBzdHJ1Y3QgX0NPTkZJR19QQUdFX0ZDX1BPUlRfNAoreworICAgIGZDT05GSUdfUEFHRV9IRUFERVIgICAgICBIZWFkZXI7ICAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUG9ydEZsYWdzOyAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFBvcnRTZXR0aW5nczsgICAgICAgICAgICAgICAvKiAwOGggKi8KK30gZkNPTkZJR19QQUdFX0ZDX1BPUlRfNCwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX0ZDX1BPUlRfNCwKKyAgRkNQb3J0UGFnZTRfdCwgTVBJX1BPSU5URVIgcEZDUG9ydFBhZ2U0X3Q7CisKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0U0X1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICAgKDB4MDApCisKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0U0X1BPUlRfRkxBR1NfQUxURVJOQVRFX0NIUyAgICAgICAgKDB4MDAwMDAwMDgpCisKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0U0X1BPUlRfTUFTS19JTklUX0hCQSAgICAgICAgICAgICAgKDB4MDAwMDAwMzApCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFNF9QT1JUX0RJU0FCTEVfSU5JVF9IQkEgICAgICAgICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTRfUE9SVF9CSU9TX0lOSVRfSEJBICAgICAgICAgICAgICAoMHgwMDAwMDAxMCkKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0U0X1BPUlRfT1NfSU5JVF9IQkEgICAgICAgICAgICAgICAgKDB4MDAwMDAwMjApCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFNF9QT1JUX0JJT1NfT1NfSU5JVF9IQkEgICAgICAgICAgICgweDAwMDAwMDMwKQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTRfUE9SVF9SRU1PVkFCTEVfTUVESUEgICAgICAgICAgICAoMHgwMDAwMDBDMCkKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0U0X1BPUlRfU1BJTlVQX0RFTEFZX01BU0sgICAgICAgICAgKDB4MDAwMDBGMDApCisKKwordHlwZWRlZiBzdHJ1Y3QgX0NPTkZJR19QQUdFX0ZDX1BPUlRfNV9BTElBU19JTkZPCit7CisgICAgVTggICAgICBGbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgQWxpYXNBbHBhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVMTYgICAgIFJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTY0ICAgICBBbGlhc1dXTk47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU2NCAgICAgQWxpYXNXV1BOOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwQ2ggKi8KK30gZkNPTkZJR19QQUdFX0ZDX1BPUlRfNV9BTElBU19JTkZPLAorICBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfRkNfUE9SVF81X0FMSUFTX0lORk8sCisgIEZjUG9ydFBhZ2U1QWxpYXNJbmZvX3QsIE1QSV9QT0lOVEVSIHBGY1BvcnRQYWdlNUFsaWFzSW5mb190OworCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfRkNfUE9SVF81Cit7CisgICAgZkNPTkZJR19QQUdFX0hFQURFUiAgICAgICAgICAgICAgICAgIEhlYWRlcjsgICAgICAgICAvKiAwMGggKi8KKyAgICBmQ09ORklHX1BBR0VfRkNfUE9SVF81X0FMSUFTX0lORk8gICAgQWxpYXNJbmZvOyAgICAgIC8qIDA0aCAqLworfSBmQ09ORklHX1BBR0VfRkNfUE9SVF81LCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfRkNfUE9SVF81LAorICBGQ1BvcnRQYWdlNV90LCBNUElfUE9JTlRFUiBwRkNQb3J0UGFnZTVfdDsKKworI2RlZmluZSBNUElfRkNQT1JUUEFHRTVfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAgICAoMHgwMikKKworI2RlZmluZSBNUElfRkNQT1JUUEFHRTVfRkxBR1NfQUxQQV9BQ1FVSVJFRCAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0U1X0ZMQUdTX0hBUkRfQUxQQSAgICAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFNV9GTEFHU19IQVJEX1dXTk4gICAgICAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTVfRkxBR1NfSEFSRF9XV1BOICAgICAgICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0U1X0ZMQUdTX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgKDB4MTApCisKK3R5cGVkZWYgc3RydWN0IF9DT05GSUdfUEFHRV9GQ19QT1JUXzYKK3sKKyAgICBmQ09ORklHX1BBR0VfSEVBREVSICAgICAgSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVNjQgICAgICAgICAgICAgICAgICAgICBUaW1lU2luY2VSZXNldDsgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTY0ICAgICAgICAgICAgICAgICAgICAgVHhGcmFtZXM7ICAgICAgICAgICAgICAgICAgIC8qIDEwaCAqLworICAgIFU2NCAgICAgICAgICAgICAgICAgICAgIFJ4RnJhbWVzOyAgICAgICAgICAgICAgICAgICAvKiAxOGggKi8KKyAgICBVNjQgICAgICAgICAgICAgICAgICAgICBUeFdvcmRzOyAgICAgICAgICAgICAgICAgICAgLyogMjBoICovCisgICAgVTY0ICAgICAgICAgICAgICAgICAgICAgUnhXb3JkczsgICAgICAgICAgICAgICAgICAgIC8qIDI4aCAqLworICAgIFU2NCAgICAgICAgICAgICAgICAgICAgIExpcENvdW50OyAgICAgICAgICAgICAgICAgICAvKiAzMGggKi8KKyAgICBVNjQgICAgICAgICAgICAgICAgICAgICBOb3NDb3VudDsgICAgICAgICAgICAgICAgICAgLyogMzhoICovCisgICAgVTY0ICAgICAgICAgICAgICAgICAgICAgRXJyb3JGcmFtZXM7ICAgICAgICAgICAgICAgIC8qIDQwaCAqLworICAgIFU2NCAgICAgICAgICAgICAgICAgICAgIER1bXBlZEZyYW1lczsgICAgICAgICAgICAgICAvKiA0OGggKi8KKyAgICBVNjQgICAgICAgICAgICAgICAgICAgICBMaW5rRmFpbHVyZUNvdW50OyAgICAgICAgICAgLyogNTBoICovCisgICAgVTY0ICAgICAgICAgICAgICAgICAgICAgTG9zc09mU3luY0NvdW50OyAgICAgICAgICAgIC8qIDU4aCAqLworICAgIFU2NCAgICAgICAgICAgICAgICAgICAgIExvc3NPZlNpZ25hbENvdW50OyAgICAgICAgICAvKiA2MGggKi8KKyAgICBVNjQgICAgICAgICAgICAgICAgICAgICBQcmltYXRpdmVTZXFFcnJDb3VudDsgICAgICAgLyogNjhoICovCisgICAgVTY0ICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFR4V29yZENvdW50OyAgICAgICAgIC8qIDcwaCAqLworICAgIFU2NCAgICAgICAgICAgICAgICAgICAgIEludmFsaWRDcmNDb3VudDsgICAgICAgICAgICAvKiA3OGggKi8KKyAgICBVNjQgICAgICAgICAgICAgICAgICAgICBGY3BJbml0aWF0b3JJb0NvdW50OyAgICAgICAgLyogODBoICovCit9IGZDT05GSUdfUEFHRV9GQ19QT1JUXzYsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9GQ19QT1JUXzYsCisgIEZDUG9ydFBhZ2U2X3QsIE1QSV9QT0lOVEVSIHBGQ1BvcnRQYWdlNl90OworCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFNl9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICgweDAwKQorCisKK3R5cGVkZWYgc3RydWN0IF9DT05GSUdfUEFHRV9GQ19QT1JUXzcKK3sKKyAgICBmQ09ORklHX1BBR0VfSEVBREVSICAgICAgSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBQb3J0U3ltYm9saWNOYW1lWzI1Nl07ICAgICAgLyogMDhoICovCit9IGZDT05GSUdfUEFHRV9GQ19QT1JUXzcsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9GQ19QT1JUXzcsCisgIEZDUG9ydFBhZ2U3X3QsIE1QSV9QT0lOVEVSIHBGQ1BvcnRQYWdlN190OworCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFN19QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICgweDAwKQorCisKK3R5cGVkZWYgc3RydWN0IF9DT05GSUdfUEFHRV9GQ19QT1JUXzgKK3sKKyAgICBmQ09ORklHX1BBR0VfSEVBREVSICAgICAgSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEJpdFZlY3Rvcls4XTsgICAgICAgICAgICAgICAvKiAwNGggKi8KK30gZkNPTkZJR19QQUdFX0ZDX1BPUlRfOCwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX0ZDX1BPUlRfOCwKKyAgRkNQb3J0UGFnZThfdCwgTVBJX1BPSU5URVIgcEZDUG9ydFBhZ2U4X3Q7CisKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0U4X1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICAgKDB4MDApCisKKwordHlwZWRlZiBzdHJ1Y3QgX0NPTkZJR19QQUdFX0ZDX1BPUlRfOQoreworICAgIGZDT05GSUdfUEFHRV9IRUFERVIgICAgICBIZWFkZXI7ICAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU2NCAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFdXUE47ICAgICAgICAgICAgICAgICAvKiAwOGggKi8KKyAgICBVNjQgICAgICAgICAgICAgICAgICAgICBHbG9iYWxXV05OOyAgICAgICAgICAgICAgICAgLyogMTBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgVW5pdFR5cGU7ICAgICAgICAgICAgICAgICAgIC8qIDE4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFBoeXNpY2FsUG9ydE51bWJlcjsgICAgICAgICAvKiAxQ2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBOdW1BdHRhY2hlZE5vZGVzOyAgICAgICAgICAgLyogMjBoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSVBWZXJzaW9uOyAgICAgICAgICAgICAgICAgIC8qIDI0aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFVEUFBvcnROdW1iZXI7ICAgICAgICAgICAgICAvKiAyNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBJUEFkZHJlc3NbMTZdOyAgICAgICAgICAgICAgLyogMjhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgIC8qIDM4aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFRvcG9sb2d5RGlzY292ZXJ5RmxhZ3M7ICAgICAvKiAzQWggKi8KK30gZkNPTkZJR19QQUdFX0ZDX1BPUlRfOSwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX0ZDX1BPUlRfOSwKKyAgRkNQb3J0UGFnZTlfdCwgTVBJX1BPSU5URVIgcEZDUG9ydFBhZ2U5X3Q7CisKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0U5X1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICAgKDB4MDApCisKKwordHlwZWRlZiBzdHJ1Y3QgX0NPTkZJR19QQUdFX0ZDX1BPUlRfMTBfQkFTRV9TRlBfREFUQQoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIElkOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBFeHRJZDsgICAgICAgICAgICAgICAgICAgICAgLyogMTFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdG9yOyAgICAgICAgICAgICAgICAgIC8qIDEyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFRyYW5zY2VpdmVyWzhdOyAgICAgICAgICAgICAvKiAxM2ggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBFbmNvZGluZzsgICAgICAgICAgICAgICAgICAgLyogMUJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQml0UmF0ZV8xMDBtYnM7ICAgICAgICAgICAgIC8qIDFDaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAvKiAxRGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBMZW5ndGg5dV9rbTsgICAgICAgICAgICAgICAgLyogMUVoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoOXVfMTAwbTsgICAgICAgICAgICAgIC8qIDFGaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIExlbmd0aDUwdV8xMG07ICAgICAgICAgICAgICAvKiAyMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBMZW5ndGg2MnA1dV8xMG07ICAgICAgICAgICAgLyogMjFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoQ29wcGVyX207ICAgICAgICAgICAgIC8qIDIyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2V2ZXJ2ZWQyOyAgICAgICAgICAgICAgICAvKiAyMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBWZW5kb3JOYW1lWzE2XTsgICAgICAgICAgICAgLyogMjRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAgICAgICAgIC8qIDM0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFZlbmRvck9VSVszXTsgICAgICAgICAgICAgICAvKiAzNWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBWZW5kb3JQTlsxNl07ICAgICAgICAgICAgICAgLyogMzhoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgVmVuZG9yUmV2WzRdOyAgICAgICAgICAgICAgIC8qIDQ4aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNDsgICAgICAgICAgICAgICAgICAvKiA0Q2ggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDU7ICAgICAgICAgICAgICAgICAgLyogNEVoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ0NfQkFTRTsgICAgICAgICAgICAgICAgICAgIC8qIDRGaCAqLworfSBmQ09ORklHX1BBR0VfRkNfUE9SVF8xMF9CQVNFX1NGUF9EQVRBLAorICBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfRkNfUE9SVF8xMF9CQVNFX1NGUF9EQVRBLAorICBGQ1BvcnRQYWdlMTBCYXNlU2ZwRGF0YV90LCBNUElfUE9JTlRFUiBwRkNQb3J0UGFnZTEwQmFzZVNmcERhdGFfdDsKKworI2RlZmluZSBNUElfRkNQT1JUMTBfQkFTRV9JRF9VTktOT1dOICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX0ZDUE9SVDEwX0JBU0VfSURfR0JJQyAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSV9GQ1BPUlQxMF9CQVNFX0lEX0ZJWEVEICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfRkNQT1JUMTBfQkFTRV9JRF9TRlAgICAgICAgICAgICAoMHgwMykKKyNkZWZpbmUgTVBJX0ZDUE9SVDEwX0JBU0VfSURfU0ZQX01JTiAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9GQ1BPUlQxMF9CQVNFX0lEX1NGUF9NQVggICAgICAgICgweDdGKQorI2RlZmluZSBNUElfRkNQT1JUMTBfQkFTRV9JRF9WRU5EX1NQRUNfTUFTSyAoMHg4MCkKKworI2RlZmluZSBNUElfRkNQT1JUMTBfQkFTRV9FWFRJRF9VTktOT1dOICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX0ZDUE9SVDEwX0JBU0VfRVhUSURfTU9EREVGMSAgICAgKDB4MDEpCisjZGVmaW5lIE1QSV9GQ1BPUlQxMF9CQVNFX0VYVElEX01PRERFRjIgICAgICgweDAyKQorI2RlZmluZSBNUElfRkNQT1JUMTBfQkFTRV9FWFRJRF9NT0RERUYzICAgICAoMHgwMykKKyNkZWZpbmUgTVBJX0ZDUE9SVDEwX0JBU0VfRVhUSURfU0VFUFJPTSAgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9GQ1BPUlQxMF9CQVNFX0VYVElEX01PRERFRjUgICAgICgweDA1KQorI2RlZmluZSBNUElfRkNQT1JUMTBfQkFTRV9FWFRJRF9NT0RERUY2ICAgICAoMHgwNikKKyNkZWZpbmUgTVBJX0ZDUE9SVDEwX0JBU0VfRVhUSURfTU9EREVGNyAgICAgKDB4MDcpCisjZGVmaW5lIE1QSV9GQ1BPUlQxMF9CQVNFX0VYVElEX1ZORFNQQ19NQVNLICgweDgwKQorCisjZGVmaW5lIE1QSV9GQ1BPUlQxMF9CQVNFX0NPTk5fVU5LTk9XTiAgICAgICgweDAwKQorI2RlZmluZSBNUElfRkNQT1JUMTBfQkFTRV9DT05OX1NDICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX0ZDUE9SVDEwX0JBU0VfQ09OTl9DT1BQRVIxICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9GQ1BPUlQxMF9CQVNFX0NPTk5fQ09QUEVSMiAgICAgICgweDAzKQorI2RlZmluZSBNUElfRkNQT1JUMTBfQkFTRV9DT05OX0JOQ19UTkMgICAgICAoMHgwNCkKKyNkZWZpbmUgTVBJX0ZDUE9SVDEwX0JBU0VfQ09OTl9DT0FYSUFMICAgICAgKDB4MDUpCisjZGVmaW5lIE1QSV9GQ1BPUlQxMF9CQVNFX0NPTk5fRklCRVJKQUNLICAgICgweDA2KQorI2RlZmluZSBNUElfRkNQT1JUMTBfQkFTRV9DT05OX0xDICAgICAgICAgICAoMHgwNykKKyNkZWZpbmUgTVBJX0ZDUE9SVDEwX0JBU0VfQ09OTl9NVF9SSiAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1QSV9GQ1BPUlQxMF9CQVNFX0NPTk5fTVUgICAgICAgICAgICgweDA5KQorI2RlZmluZSBNUElfRkNQT1JUMTBfQkFTRV9DT05OX1NHICAgICAgICAgICAoMHgwQSkKKyNkZWZpbmUgTVBJX0ZDUE9SVDEwX0JBU0VfQ09OTl9PUFRfUElHVCAgICAgKDB4MEIpCisjZGVmaW5lIE1QSV9GQ1BPUlQxMF9CQVNFX0NPTk5fUlNWMV9NSU4gICAgICgweDBDKQorI2RlZmluZSBNUElfRkNQT1JUMTBfQkFTRV9DT05OX1JTVjFfTUFYICAgICAoMHgxRikKKyNkZWZpbmUgTVBJX0ZDUE9SVDEwX0JBU0VfQ09OTl9IU1NEQ19JSSAgICAgKDB4MjApCisjZGVmaW5lIE1QSV9GQ1BPUlQxMF9CQVNFX0NPTk5fQ1BSX1BJR1QgICAgICgweDIxKQorI2RlZmluZSBNUElfRkNQT1JUMTBfQkFTRV9DT05OX1JTVjJfTUlOICAgICAoMHgyMikKKyNkZWZpbmUgTVBJX0ZDUE9SVDEwX0JBU0VfQ09OTl9SU1YyX01BWCAgICAgKDB4N0YpCisjZGVmaW5lIE1QSV9GQ1BPUlQxMF9CQVNFX0NPTk5fVk5EU1BDX01BU0sgICgweDgwKQorCisjZGVmaW5lIE1QSV9GQ1BPUlQxMF9CQVNFX0VOQ09ERV9VTlNQRUMgICAgICgweDAwKQorI2RlZmluZSBNUElfRkNQT1JUMTBfQkFTRV9FTkNPREVfOEIxMEIgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX0ZDUE9SVDEwX0JBU0VfRU5DT0RFXzRCNUIgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9GQ1BPUlQxMF9CQVNFX0VOQ09ERV9OUlogICAgICAgICgweDAzKQorI2RlZmluZSBNUElfRkNQT1JUMTBfQkFTRV9FTkNPREVfTUFOQ0hFU1RFUiAoMHgwNCkKKworCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfRkNfUE9SVF8xMF9FWFRFTkRFRF9TRlBfREFUQQoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnNbMl07ICAgICAgICAgICAgICAgICAvKiA1MGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBCaXRSYXRlTWF4OyAgICAgICAgICAgICAgICAgLyogNTJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQml0UmF0ZU1pbjsgICAgICAgICAgICAgICAgIC8qIDUzaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFZlbmRvclNOWzE2XTsgICAgICAgICAgICAgICAvKiA1NGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBEYXRlQ29kZVs4XTsgICAgICAgICAgICAgICAgLyogNjRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ1WzNdOyAgICAgICAgICAgICAgIC8qIDZDaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENDX0VYVDsgICAgICAgICAgICAgICAgICAgICAvKiA2RmggKi8KK30gZkNPTkZJR19QQUdFX0ZDX1BPUlRfMTBfRVhURU5ERURfU0ZQX0RBVEEsCisgIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9GQ19QT1JUXzEwX0VYVEVOREVEX1NGUF9EQVRBLAorICBGQ1BvcnRQYWdlMTBFeHRlbmRlZFNmcERhdGFfdCwgTVBJX1BPSU5URVIgcEZDUG9ydFBhZ2UxMEV4dGVuZGVkU2ZwRGF0YV90OworCisjZGVmaW5lIE1QSV9GQ1BPUlQxMF9FWFRfT1BUSU9OMV9SQVRFU0VMICAgICgweDIwKQorI2RlZmluZSBNUElfRkNQT1JUMTBfRVhUX09QVElPTjFfVFhfRElTQUJMRSAoMHgxMCkKKyNkZWZpbmUgTVBJX0ZDUE9SVDEwX0VYVF9PUFRJT04xX1RYX0ZBVUxUICAgKDB4MDgpCisjZGVmaW5lIE1QSV9GQ1BPUlQxMF9FWFRfT1BUSU9OMV9MT1NfSU5WRVJUICgweDA0KQorI2RlZmluZSBNUElfRkNQT1JUMTBfRVhUX09QVElPTjFfTE9TICAgICAgICAoMHgwMikKKworCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfRkNfUE9SVF8xMAoreworICAgIGZDT05GSUdfUEFHRV9IRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgIEhlYWRlcjsgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnczsgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAvKiAwNWggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgLyogMDZoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBId0NvbmZpZzE7ICAgICAgICAgIC8qIDA4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHdDb25maWcyOyAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBmQ09ORklHX1BBR0VfRkNfUE9SVF8xMF9CQVNFX1NGUF9EQVRBICAgICAgICBCYXNlOyAgICAgICAgICAgICAgIC8qIDEwaCAqLworICAgIGZDT05GSUdfUEFHRV9GQ19QT1JUXzEwX0VYVEVOREVEX1NGUF9EQVRBICAgIEV4dGVuZGVkOyAgICAgICAgICAgLyogNTBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZW5kb3JTcGVjaWZpY1szMl07IC8qIDcwaCAqLworfSBmQ09ORklHX1BBR0VfRkNfUE9SVF8xMCwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX0ZDX1BPUlRfMTAsCisgIEZDUG9ydFBhZ2UxMF90LCBNUElfUE9JTlRFUiBwRkNQb3J0UGFnZTEwX3Q7CisKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UxMF9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgKDB4MDApCisKKy8qIHN0YW5kYXJkIE1PRERFRiBwaW4gZGVmaW5pdGlvbnMgKGZyb20gR0JJQyBzcGVjLikgKi8KKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UxMF9GTEFHU19NT0RERUZfTUFTSyAgICAgICAgICAgICAgKDB4MDAwMDAwMDcpCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMTBfRkxBR1NfTU9EREVGMiAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTEwX0ZMQUdTX01PRERFRjEgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UxMF9GTEFHU19NT0RERUYwICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMTBfRkxBR1NfTU9EREVGX05PR0JJQyAgICAgICAgICAgICgweDAwMDAwMDA3KQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTEwX0ZMQUdTX01PRERFRl9DUFJfSUVFRV9DWCAgICAgICAoMHgwMDAwMDAwNikKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UxMF9GTEFHU19NT0RERUZfQ09QUEVSICAgICAgICAgICAgKDB4MDAwMDAwMDUpCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMTBfRkxBR1NfTU9EREVGX09QVElDQUxfTFcgICAgICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTEwX0ZMQUdTX01PRERFRl9TRUVQUk9NICAgICAgICAgICAoMHgwMDAwMDAwMykKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UxMF9GTEFHU19NT0RERUZfU1dfT1BUSUNBTCAgICAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIE1QSV9GQ1BPUlRQQUdFMTBfRkxBR1NfTU9EREVGX0xYX0lFRUVfT1BUX0xXICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBNUElfRkNQT1JUUEFHRTEwX0ZMQUdTX01PRERFRl9TWF9JRUVFX09QVF9TVyAgICAoMHgwMDAwMDAwMCkKKworI2RlZmluZSBNUElfRkNQT1JUUEFHRTEwX0ZMQUdTX0NDX0JBU0VfT0sgICAgICAgICAgICAgICAoMHgwMDAwMDAxMCkKKyNkZWZpbmUgTVBJX0ZDUE9SVFBBR0UxMF9GTEFHU19DQ19FWFRfT0sgICAgICAgICAgICAgICAgKDB4MDAwMDAwMjApCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBGQyBEZXZpY2UgQ29uZmlnIFBhZ2VzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfRkNfREVWSUNFXzAKK3sKKyAgICBmQ09ORklHX1BBR0VfSEVBREVSICAgICAgSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU2NCAgICAgICAgICAgICAgICAgICAgIFdXTk47ICAgICAgICAgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVNjQgICAgICAgICAgICAgICAgICAgICBXV1BOOyAgICAgICAgICAgICAgICAgICAgICAgLyogMENoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUG9ydElkZW50aWZpZXI7ICAgICAgICAgICAgIC8qIDE0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sOyAgICAgICAgICAgICAgICAgICAvKiAxOGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGbGFnczsgICAgICAgICAgICAgICAgICAgICAgLyogMTloICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgQkJDcmVkaXQ7ICAgICAgICAgICAgICAgICAgIC8qIDFBaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIE1heFJ4RnJhbWVTaXplOyAgICAgICAgICAgICAvKiAxQ2ggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBBRElTQ0hhcmRBTFBBOyAgICAgICAgICAgICAgLyogMUVoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUG9ydE51bWJlcjsgICAgICAgICAgICAgICAgIC8qIDFGaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZjUGhMb3dlc3RWZXJzaW9uOyAgICAgICAgICAvKiAyMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGY1BoSGlnaGVzdFZlcnNpb247ICAgICAgICAgLyogMjFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ3VycmVudFRhcmdldElEOyAgICAgICAgICAgIC8qIDIyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRCdXM7ICAgICAgICAgICAgICAgICAvKiAyM2ggKi8KK30gZkNPTkZJR19QQUdFX0ZDX0RFVklDRV8wLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfRkNfREVWSUNFXzAsCisgIEZDRGV2aWNlUGFnZTBfdCwgTVBJX1BPSU5URVIgcEZDRGV2aWNlUGFnZTBfdDsKKworI2RlZmluZSBNUElfRkNfREVWSUNFX1BBR0UwX1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAoMHgwMykKKworI2RlZmluZSBNUElfRkNfREVWSUNFX1BBR0UwX0ZMQUdTX1RBUkdFVElEX0JVU19WQUxJRCAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX0ZDX0RFVklDRV9QQUdFMF9GTEFHU19QTE9HSV9JTlZBTElEICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9GQ19ERVZJQ0VfUEFHRTBfRkxBR1NfUFJMSV9JTlZBTElEICAgICAgICAgICgweDA0KQorCisjZGVmaW5lIE1QSV9GQ19ERVZJQ0VfUEFHRTBfUFJPVF9JUCAgICAgICAgICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfRkNfREVWSUNFX1BBR0UwX1BST1RfRkNQX1RBUkdFVCAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJX0ZDX0RFVklDRV9QQUdFMF9QUk9UX0ZDUF9JTklUSUFUT1IgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9GQ19ERVZJQ0VfUEFHRTBfUFJPVF9GQ1BfUkVUUlkgICAgICAgICAgICAgICgweDA4KQorCisjZGVmaW5lIE1QSV9GQ19ERVZJQ0VfUEFHRTBfUEdBRF9QT1JUX01BU0sgICAgICAoTVBJX0ZDX0RFVklDRV9QR0FEX1BPUlRfTUFTSykKKyNkZWZpbmUgTVBJX0ZDX0RFVklDRV9QQUdFMF9QR0FEX0ZPUk1fTUFTSyAgICAgIChNUElfRkNfREVWSUNFX1BHQURfRk9STV9NQVNLKQorI2RlZmluZSBNUElfRkNfREVWSUNFX1BBR0UwX1BHQURfRk9STV9ORVhUX0RJRCAgKE1QSV9GQ19ERVZJQ0VfUEdBRF9GT1JNX05FWFRfRElEKQorI2RlZmluZSBNUElfRkNfREVWSUNFX1BBR0UwX1BHQURfRk9STV9CVVNfVElEICAgKE1QSV9GQ19ERVZJQ0VfUEdBRF9GT1JNX0JVU19USUQpCisjZGVmaW5lIE1QSV9GQ19ERVZJQ0VfUEFHRTBfUEdBRF9ESURfTUFTSyAgICAgICAoTVBJX0ZDX0RFVklDRV9QR0FEX05EX0RJRF9NQVNLKQorI2RlZmluZSBNUElfRkNfREVWSUNFX1BBR0UwX1BHQURfQlVTX01BU0sgICAgICAgKE1QSV9GQ19ERVZJQ0VfUEdBRF9CVF9CVVNfTUFTSykKKyNkZWZpbmUgTVBJX0ZDX0RFVklDRV9QQUdFMF9QR0FEX0JVU19TSElGVCAgICAgIChNUElfRkNfREVWSUNFX1BHQURfQlRfQlVTX1NISUZUKQorI2RlZmluZSBNUElfRkNfREVWSUNFX1BBR0UwX1BHQURfVElEX01BU0sgICAgICAgKE1QSV9GQ19ERVZJQ0VfUEdBRF9CVF9USURfTUFTSykKKworI2RlZmluZSBNUElfRkNfREVWSUNFX1BBR0UwX0hBUkRfQUxQQV9VTktOT1dOICAgKDB4RkYpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgUkFJRCBWb2x1bWUgQ29uZmlnIFBhZ2VzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfUkFJRF9WT0wwX1BIWVNfRElTSworeworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgUGh5c0Rpc2tNYXA7ICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIFBoeXNEaXNrTnVtOyAgICAgICAgICAgIC8qIDAzaCAqLworfSBSQUlEX1ZPTDBfUEhZU19ESVNLLCBNUElfUE9JTlRFUiBQVFJfUkFJRF9WT0wwX1BIWVNfRElTSywKKyAgUmFpZFZvbDBQaHlzRGlza190LCBNUElfUE9JTlRFUiBwUmFpZFZvbDBQaHlzRGlza190OworCisjZGVmaW5lIE1QSV9SQUlEVk9MMF9QSFlTRElTS19QUklNQVJZICAgICAgICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfUkFJRFZPTDBfUEhZU0RJU0tfU0VDT05EQVJZICAgICAgICAgICAgICAgICAoMHgwMikKKwordHlwZWRlZiBzdHJ1Y3QgX1JBSURfVk9MMF9TVEFUVVMKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3M7ICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlOyAgICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgICAgICAvKiAwMmggKi8KK30gUkFJRF9WT0wwX1NUQVRVUywgTVBJX1BPSU5URVIgUFRSX1JBSURfVk9MMF9TVEFUVVMsCisgIFJhaWRWb2wwU3RhdHVzX3QsIE1QSV9QT0lOVEVSIHBSYWlkVm9sMFN0YXR1c190OworCisvKiBSQUlEIFZvbHVtZSBQYWdlIDAgVm9sdW1lU3RhdHVzIGRlZmluZXMgKi8KKworI2RlZmluZSBNUElfUkFJRFZPTDBfU1RBVFVTX0ZMQUdfRU5BQkxFRCAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX1JBSURWT0wwX1NUQVRVU19GTEFHX1FVSUVTQ0VEICAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9SQUlEVk9MMF9TVEFUVVNfRkxBR19SRVNZTkNfSU5fUFJPR1JFU1MgICAgICgweDA0KQorI2RlZmluZSBNUElfUkFJRFZPTDBfU1RBVFVTX0ZMQUdfVk9MVU1FX0lOQUNUSVZFICAgICAgICAoMHgwOCkKKworI2RlZmluZSBNUElfUkFJRFZPTDBfU1RBVFVTX1NUQVRFX09QVElNQUwgICAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX1JBSURWT0wwX1NUQVRVU19TVEFURV9ERUdSQURFRCAgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSV9SQUlEVk9MMF9TVEFUVVNfU1RBVEVfRkFJTEVEICAgICAgICAgICAgICAgICgweDAyKQorCit0eXBlZGVmIHN0cnVjdCBfUkFJRF9WT0wwX1NFVFRJTkdTCit7CisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzOyAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgSG90U3BhcmVQb29sOyAgIC8qIDAxaCAqLyAvKiBNUElfUkFJRF9IT1RfU1BBUkVfUE9PTF8gKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7ICAgICAgIC8qIDAyaCAqLworfSBSQUlEX1ZPTDBfU0VUVElOR1MsIE1QSV9QT0lOVEVSIFBUUl9SQUlEX1ZPTDBfU0VUVElOR1MsCisgIFJhaWRWb2wwU2V0dGluZ3MsIE1QSV9QT0lOVEVSIHBSYWlkVm9sMFNldHRpbmdzOworCisvKiBSQUlEIFZvbHVtZSBQYWdlIDAgVm9sdW1lU2V0dGluZ3MgZGVmaW5lcyAqLworCisjZGVmaW5lIE1QSV9SQUlEVk9MMF9TRVRUSU5HX1dSSVRFX0NBQ0hJTkdfRU5BQkxFICAgICAgICgweDAwMDEpCisjZGVmaW5lIE1QSV9SQUlEVk9MMF9TRVRUSU5HX09GRkxJTkVfT05fU01BUlQgICAgICAgICAgICgweDAwMDIpCisjZGVmaW5lIE1QSV9SQUlEVk9MMF9TRVRUSU5HX0FVVE9fQ09ORklHVVJFICAgICAgICAgICAgICgweDAwMDQpCisjZGVmaW5lIE1QSV9SQUlEVk9MMF9TRVRUSU5HX1BSSU9SSVRZX1JFU1lOQyAgICAgICAgICAgICgweDAwMDgpCisjZGVmaW5lIE1QSV9SQUlEVk9MMF9TRVRUSU5HX1VTRV9QUk9EVUNUX0lEX1NVRkZJWCAgICAgICgweDAwMTApCisjZGVmaW5lIE1QSV9SQUlEVk9MMF9TRVRUSU5HX1VTRV9ERUZBVUxUUyAgICAgICAgICAgICAgICgweDgwMDApCisKKy8qIFJBSUQgVm9sdW1lIFBhZ2UgMCBIb3RTcGFyZVBvb2wgZGVmaW5lcywgYWxzbyB1c2VkIGluIFJBSUQgUGh5c2ljYWwgRGlzayAqLworI2RlZmluZSBNUElfUkFJRF9IT1RfU1BBUkVfUE9PTF8wICAgICAgICAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX1JBSURfSE9UX1NQQVJFX1BPT0xfMSAgICAgICAgICAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9SQUlEX0hPVF9TUEFSRV9QT09MXzIgICAgICAgICAgICAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBNUElfUkFJRF9IT1RfU1BBUkVfUE9PTF8zICAgICAgICAgICAgICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTVBJX1JBSURfSE9UX1NQQVJFX1BPT0xfNCAgICAgICAgICAgICAgICAgICAgICAgKDB4MTApCisjZGVmaW5lIE1QSV9SQUlEX0hPVF9TUEFSRV9QT09MXzUgICAgICAgICAgICAgICAgICAgICAgICgweDIwKQorI2RlZmluZSBNUElfUkFJRF9IT1RfU1BBUkVfUE9PTF82ICAgICAgICAgICAgICAgICAgICAgICAoMHg0MCkKKyNkZWZpbmUgTVBJX1JBSURfSE9UX1NQQVJFX1BPT0xfNyAgICAgICAgICAgICAgICAgICAgICAgKDB4ODApCisKKy8qCisgKiBIb3N0IGNvZGUgKGRyaXZlcnMsIEJJT1MsIHV0aWxpdGllcywgZXRjLikgc2hvdWxkIGxlYXZlIHRoaXMgZGVmaW5lIHNldCB0bworICogb25lIGFuZCBjaGVjayBIZWFkZXIuUGFnZUxlbmd0aCBhdCBydW50aW1lLgorICovCisjaWZuZGVmIE1QSV9SQUlEX1ZPTF9QQUdFXzBfUEhZU0RJU0tfTUFYCisjZGVmaW5lIE1QSV9SQUlEX1ZPTF9QQUdFXzBfUEhZU0RJU0tfTUFYICAgICAgICAoMSkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfUkFJRF9WT0xfMAoreworICAgIGZDT05GSUdfUEFHRV9IRUFERVIgICAgICBIZWFkZXI7ICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgVm9sdW1lSUQ7ICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZUJ1czsgICAgICAvKiAwNWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVJT0M7ICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgVm9sdW1lVHlwZTsgICAgIC8qIDA3aCAqLyAvKiBNUElfUkFJRF9WT0xfVFlQRV8gKi8KKyAgICBSQUlEX1ZPTDBfU1RBVFVTICAgICAgICBWb2x1bWVTdGF0dXM7ICAgLyogMDhoICovCisgICAgUkFJRF9WT0wwX1NFVFRJTkdTICAgICAgVm9sdW1lU2V0dGluZ3M7IC8qIDBDaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1heExCQTsgICAgICAgICAvKiAxMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgLyogMTRoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgU3RyaXBlU2l6ZTsgICAgIC8qIDE4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAvKiAxQ2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgLyogMjBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTnVtUGh5c0Rpc2tzOyAgIC8qIDI0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNDsgICAgICAvKiAyNWggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDU7ICAgICAgLyogMjZoICovCisgICAgUkFJRF9WT0wwX1BIWVNfRElTSyAgICAgUGh5c0Rpc2tbTVBJX1JBSURfVk9MX1BBR0VfMF9QSFlTRElTS19NQVhdOy8qIDI4aCAqLworfSBmQ09ORklHX1BBR0VfUkFJRF9WT0xfMCwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX1JBSURfVk9MXzAsCisgIFJhaWRWb2x1bWVQYWdlMF90LCBNUElfUE9JTlRFUiBwUmFpZFZvbHVtZVBhZ2UwX3Q7CisKKyNkZWZpbmUgTVBJX1JBSURWT0xQQUdFMF9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgKDB4MDEpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBSQUlEIFBoeXNpY2FsIERpc2sgQ29uZmlnIFBhZ2VzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfUkFJRF9QSFlTX0RJU0swX0VSUk9SX0RBVEEKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBFcnJvckNkYkJ5dGU7ICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRXJyb3JTZW5zZUtleTsgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBFcnJvckNvdW50OyAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRXJyb3JBU0M7ICAgICAgICAgICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEVycm9yQVNDUTsgICAgICAgICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBTbWFydENvdW50OyAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgU21hcnRBU0M7ICAgICAgICAgICAgICAgICAgIC8qIDBBaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFNtYXJ0QVNDUTsgICAgICAgICAgICAgICAgICAvKiAwQmggKi8KK30gUkFJRF9QSFlTX0RJU0swX0VSUk9SX0RBVEEsIE1QSV9QT0lOVEVSIFBUUl9SQUlEX1BIWVNfRElTSzBfRVJST1JfREFUQSwKKyAgUmFpZFBoeXNEaXNrMEVycm9yRGF0YV90LCBNUElfUE9JTlRFUiBwUmFpZFBoeXNEaXNrMEVycm9yRGF0YV90OworCit0eXBlZGVmIHN0cnVjdCBfUkFJRF9QSFlTX0RJU0tfSU5RVUlSWV9EQVRBCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIFZlbmRvcklEWzhdOyAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9kdWN0SURbMTZdOyAgICAgICAgICAvKiAwOGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdFJldkxldmVsWzRdOyAgICAgLyogMThoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIEluZm9bMzJdOyAgICAgICAgICAgICAgIC8qIDFDaCAqLworfSBSQUlEX1BIWVNfRElTSzBfSU5RVUlSWV9EQVRBLCBNUElfUE9JTlRFUiBQVFJfUkFJRF9QSFlTX0RJU0swX0lOUVVJUllfREFUQSwKKyAgUmFpZFBoeXNEaXNrMElucXVpcnlEYXRhLCBNUElfUE9JTlRFUiBwUmFpZFBoeXNEaXNrMElucXVpcnlEYXRhOworCit0eXBlZGVmIHN0cnVjdCBfUkFJRF9QSFlTX0RJU0swX1NFVFRJTkdTCit7CisgICAgVTggICAgICAgICAgICAgIFNlcElEOyAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgIFNlcEJ1czsgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgIEhvdFNwYXJlUG9vbDsgICAgICAgLyogMDJoICovIC8qIE1QSV9SQUlEX0hPVF9TUEFSRV9QT09MXyAqLworICAgIFU4ICAgICAgICAgICAgICBQaHlzRGlza1NldHRpbmdzOyAgIC8qIDAzaCAqLworfSBSQUlEX1BIWVNfRElTSzBfU0VUVElOR1MsIE1QSV9QT0lOVEVSIFBUUl9SQUlEX1BIWVNfRElTSzBfU0VUVElOR1MsCisgIFJhaWRQaHlzRGlza1NldHRpbmdzX3QsIE1QSV9QT0lOVEVSIHBSYWlkUGh5c0Rpc2tTZXR0aW5nc190OworCit0eXBlZGVmIHN0cnVjdCBfUkFJRF9QSFlTX0RJU0swX1NUQVRVUworeworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3M7ICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlOyAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgIC8qIDAyaCAqLworfSBSQUlEX1BIWVNfRElTSzBfU1RBVFVTLCBNUElfUE9JTlRFUiBQVFJfUkFJRF9QSFlTX0RJU0swX1NUQVRVUywKKyAgUmFpZFBoeXNEaXNrU3RhdHVzX3QsIE1QSV9QT0lOVEVSIHBSYWlkUGh5c0Rpc2tTdGF0dXNfdDsKKworLyogUkFJRCBWb2x1bWUgMiBJTSBQaHlzaWNhbCBEaXNrIERpc2tTdGF0dXMgZmxhZ3MgKi8KKworI2RlZmluZSBNUElfUEhZU0RJU0swX1NUQVRVU19GTEFHX09VVF9PRl9TWU5DICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX1BIWVNESVNLMF9TVEFUVVNfRkxBR19RVUlFU0NFRCAgICAgICAgICAgICAgKDB4MDIpCisKKyNkZWZpbmUgTVBJX1BIWVNESVNLMF9TVEFUVVNfT05MSU5FICAgICAgICAgICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSV9QSFlTRElTSzBfU1RBVFVTX01JU1NJTkcgICAgICAgICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfUEhZU0RJU0swX1NUQVRVU19OT1RfQ09NUEFUSUJMRSAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJX1BIWVNESVNLMF9TVEFUVVNfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgKDB4MDMpCisjZGVmaW5lIE1QSV9QSFlTRElTSzBfU1RBVFVTX0lOSVRJQUxJWklORyAgICAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBNUElfUEhZU0RJU0swX1NUQVRVU19PRkZMSU5FX1JFUVVFU1RFRCAgICAgICAgICAoMHgwNSkKKyNkZWZpbmUgTVBJX1BIWVNESVNLMF9TVEFUVVNfRkFJTEVEX1JFUVVFU1RFRCAgICAgICAgICAgKDB4MDYpCisjZGVmaW5lIE1QSV9QSFlTRElTSzBfU1RBVFVTX09USEVSX09GRkxJTkUgICAgICAgICAgICAgICgweEZGKQorCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfUkFJRF9QSFlTX0RJU0tfMAoreworICAgIGZDT05GSUdfUEFHRV9IRUFERVIgICAgICAgICAgICAgIEhlYWRlcjsgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaHlzRGlza0lEOyAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGh5c0Rpc2tCdXM7ICAgICAgICAvKiAwNWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBoeXNEaXNrSU9DOyAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaHlzRGlza051bTsgICAgICAgIC8qIDA3aCAqLworICAgIFJBSURfUEhZU19ESVNLMF9TRVRUSU5HUyAgICAgICAgUGh5c0Rpc2tTZXR0aW5nczsgICAvKiAwOGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgLyogMENoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgIC8qIDEwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAvKiAxNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2tJZGVudGlmaWVyWzE2XTsgLyogMThoICovCisgICAgUkFJRF9QSFlTX0RJU0swX0lOUVVJUllfREFUQSAgICBJbnF1aXJ5RGF0YTsgICAgICAgIC8qIDI4aCAqLworICAgIFJBSURfUEhZU19ESVNLMF9TVEFUVVMgICAgICAgICAgUGh5c0Rpc2tTdGF0dXM7ICAgICAvKiA2NGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heExCQTsgICAgICAgICAgICAgLyogNjhoICovCisgICAgUkFJRF9QSFlTX0RJU0swX0VSUk9SX0RBVEEgICAgICBFcnJvckRhdGE7ICAgICAgICAgIC8qIDZDaCAqLworfSBmQ09ORklHX1BBR0VfUkFJRF9QSFlTX0RJU0tfMCwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX1JBSURfUEhZU19ESVNLXzAsCisgIFJhaWRQaHlzRGlza1BhZ2UwX3QsIE1QSV9QT0lOVEVSIHBSYWlkUGh5c0Rpc2tQYWdlMF90OworCisjZGVmaW5lIE1QSV9SQUlEUEhZU0RJU0tQQUdFMF9QQUdFVkVSU0lPTiAgICAgICAgICAgKDB4MDApCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBMQU4gQ29uZmlnIFBhZ2VzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfTEFOXzAKK3sKKyAgICBDb25maWdQYWdlSGVhZGVyX3QgICAgICBIZWFkZXI7ICAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgVHhSeE1vZGVzOyAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAvKiAwNmggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBQYWNrZXRQcmVQYWQ7ICAgICAgICAgICAgICAgLyogMDhoICovCit9IGZDT05GSUdfUEFHRV9MQU5fMCwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX0xBTl8wLAorICBMQU5QYWdlMF90LCBNUElfUE9JTlRFUiBwTEFOUGFnZTBfdDsKKworI2RlZmluZSBNUElfTEFOX1BBR0UwX1BBR0VWRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAoMHgwMSkKKworI2RlZmluZSBNUElfTEFOX1BBR0UwX1JFVFVSTl9MT09QQkFDSyAgICAgICAgICAgICAgICAgICAoMHgwMDAwKQorI2RlZmluZSBNUElfTEFOX1BBR0UwX1NVUFBSRVNTX0xPT1BCQUNLICAgICAgICAgICAgICAgICAoMHgwMDAxKQorI2RlZmluZSBNUElfTEFOX1BBR0UwX0xPT1BCQUNLX01BU0sgICAgICAgICAgICAgICAgICAgICAoMHgwMDAxKQorCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfTEFOXzEKK3sKKyAgICBDb25maWdQYWdlSGVhZGVyX3QgICAgICBIZWFkZXI7ICAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnREZXZpY2VTdGF0ZTsgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTWluUGFja2V0U2l6ZTsgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1heFBhY2tldFNpemU7ICAgICAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBIYXJkd2FyZUFkZHJlc3NMb3c7ICAgICAgICAgLyogMTBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgSGFyZHdhcmVBZGRyZXNzSGlnaDsgICAgICAgIC8qIDE0aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1heFdpcmVTcGVlZExvdzsgICAgICAgICAgICAvKiAxOGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNYXhXaXJlU3BlZWRIaWdoOyAgICAgICAgICAgLyogMUNoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgQnVja2V0c1JlbWFpbmluZzsgICAgICAgICAgIC8qIDIwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1heFJlcGx5U2l6ZTsgICAgICAgICAgICAgICAvKiAyNGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBOZWdXaXJlU3BlZWRMb3c7ICAgICAgICAgICAgLyogMjhoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTmVnV2lyZVNwZWVkSGlnaDsgICAgICAgICAgIC8qIDJDaCAqLworfSBmQ09ORklHX1BBR0VfTEFOXzEsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9MQU5fMSwKKyAgTEFOUGFnZTFfdCwgTVBJX1BPSU5URVIgcExBTlBhZ2UxX3Q7CisKKyNkZWZpbmUgTVBJX0xBTl9QQUdFMV9QQUdFVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgKDB4MDMpCisKKyNkZWZpbmUgTVBJX0xBTl9QQUdFMV9ERVZfU1RBVEVfUkVTRVQgICAgICAgICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSV9MQU5fUEFHRTFfREVWX1NUQVRFX09QRVJBVElPTkFMICAgICAgICAgICAgICgweDAxKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgSW5iYW5kIENvbmZpZyBQYWdlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX0NPTkZJR19QQUdFX0lOQkFORF8wCit7CisgICAgZkNPTkZJR19QQUdFX0hFQURFUiAgICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBNUElfVkVSU0lPTl9GT1JNQVQgICAgICBJbmJhbmRWZXJzaW9uOyAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgTWF4aW11bUJ1ZmZlcnM7ICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAvKiAwQWggKi8KK30gZkNPTkZJR19QQUdFX0lOQkFORF8wLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfSU5CQU5EXzAsCisgIEluYmFuZFBhZ2UwX3QsIE1QSV9QT0lOVEVSIHBJbmJhbmRQYWdlMF90OworCisjZGVmaW5lIE1QSV9JTkJBTkRfUEFHRVZFUlNJT04gICAgICAgICAgKDB4MDApCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIFNBUyBJTyBVbml0IENvbmZpZyBQYWdlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX01QSV9TQVNfSU9fVU5JVDBfUEhZX0RBVEEKK3sKKyAgICBVOCAgICAgICAgICBQb3J0OyAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICBQb3J0RmxhZ3M7ICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICBQaHlGbGFnczsgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICBOZWdvdGlhdGVkTGlua1JhdGU7ICAgICAvKiAwM2ggKi8KKyAgICBVMzIgICAgICAgICBDb250cm9sbGVyUGh5RGV2aWNlSW5mbzsvKiAwNGggKi8KKyAgICBVMTYgICAgICAgICBBdHRhY2hlZERldmljZUhhbmRsZTsgICAvKiAwOGggKi8KKyAgICBVMTYgICAgICAgICBDb250cm9sbGVyRGV2SGFuZGxlOyAgICAvKiAwQWggKi8KKyAgICBVMzIgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAvKiAwQ2ggKi8KK30gTVBJX1NBU19JT19VTklUMF9QSFlfREFUQSwgTVBJX1BPSU5URVIgUFRSX01QSV9TQVNfSU9fVU5JVDBfUEhZX0RBVEEsCisgIFNhc0lPVW5pdDBQaHlEYXRhLCBNUElfUE9JTlRFUiBwU2FzSU9Vbml0MFBoeURhdGE7CisKKy8qCisgKiBIb3N0IGNvZGUgKGRyaXZlcnMsIEJJT1MsIHV0aWxpdGllcywgZXRjLikgc2hvdWxkIGxlYXZlIHRoaXMgZGVmaW5lIHNldCB0bworICogb25lIGFuZCBjaGVjayBIZWFkZXIuUGFnZUxlbmd0aCBhdCBydW50aW1lLgorICovCisjaWZuZGVmIE1QSV9TQVNfSU9VTklUMF9QSFlfTUFYCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMF9QSFlfTUFYICAgICAgICAgKDEpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgX0NPTkZJR19QQUdFX1NBU19JT19VTklUXzAKK3sKKyAgICBmQ09ORklHX0VYVEVOREVEX1BBR0VfSEVBREVSICAgICBIZWFkZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtUGh5czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMENoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwRGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDBFaCAqLworICAgIE1QSV9TQVNfSU9fVU5JVDBfUEhZX0RBVEEgICAgICAgUGh5RGF0YVtNUElfU0FTX0lPVU5JVDBfUEhZX01BWF07ICAgLyogMTBoICovCit9IGZDT05GSUdfUEFHRV9TQVNfSU9fVU5JVF8wLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfU0FTX0lPX1VOSVRfMCwKKyAgU2FzSU9Vbml0UGFnZTBfdCwgTVBJX1BPSU5URVIgcFNhc0lPVW5pdFBhZ2UwX3Q7CisKKyNkZWZpbmUgTVBJX1NBU0lPVU5JVFBBR0UwX1BBR0VWRVJTSU9OICAgICAgKDB4MDApCisKKy8qIHZhbHVlcyBmb3IgU0FTIElPIFVuaXQgUGFnZSAwIFBvcnRGbGFncyAqLworI2RlZmluZSBNUElfU0FTX0lPVU5JVDBfUE9SVF9GTEFHU19ESVNDT1ZFUllfSU5fUFJPR1JFU1MgICAgKDB4MDgpCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMF9QT1JUX0ZMQUdTXzBfVEFSR0VUX0lPQ19OVU0gICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQwX1BPUlRfRkxBR1NfMV9UQVJHRVRfSU9DX05VTSAgICAgICAgICgweDA0KQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDBfUE9SVF9GTEFHU19XQUlUX0ZPUl9QT1JURU5BQkxFICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMF9QT1JUX0ZMQUdTX0FVVE9fUE9SVF9DT05GSUcgICAgICAgICAoMHgwMSkKKworLyogdmFsdWVzIGZvciBTQVMgSU8gVW5pdCBQYWdlIDAgUGh5RmxhZ3MgKi8KKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQwX1BIWV9GTEFHU19QSFlfRElTQUJMRUQgICAgICAgICAgICAgICgweDA0KQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDBfUEhZX0ZMQUdTX1RYX0lOVkVSVCAgICAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMF9QSFlfRkxBR1NfUlhfSU5WRVJUICAgICAgICAgICAgICAgICAoMHgwMSkKKworLyogdmFsdWVzIGZvciBTQVMgSU8gVW5pdCBQYWdlIDAgTmVnb3RpYXRlZExpbmtSYXRlICovCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMF9SQVRFX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQwX1JBVEVfUEhZX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDBfUkFURV9GQUlMRURfU1BFRURfTkVHT1RJQVRJT04gICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMF9SQVRFX1NBVEFfT09CX0NPTVBMRVRFICAgICAgICAgICAgICAoMHgwMykKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQwX1JBVEVfMV81ICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDA4KQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDBfUkFURV8zXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDkpCisKKy8qIHNlZSBtcGlfc2FzLmggZm9yIHZhbHVlcyBmb3IgU0FTIElPIFVuaXQgUGFnZSAwIENvbnRyb2xsZXJQaHlEZXZpY2VJbmZvIHZhbHVlcyAqLworCisKK3R5cGVkZWYgc3RydWN0IF9NUElfU0FTX0lPX1VOSVQxX1BIWV9EQVRBCit7CisgICAgVTggICAgICAgICAgUG9ydDsgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgUG9ydEZsYWdzOyAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgUGh5RmxhZ3M7ICAgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgTWF4TWluTGlua1JhdGU7ICAgICAgICAgLyogMDNoICovCisgICAgVTMyICAgICAgICAgQ29udHJvbGxlclBoeURldmljZUluZm87LyogMDRoICovCisgICAgVTMyICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgLyogMDhoICovCit9IE1QSV9TQVNfSU9fVU5JVDFfUEhZX0RBVEEsIE1QSV9QT0lOVEVSIFBUUl9NUElfU0FTX0lPX1VOSVQxX1BIWV9EQVRBLAorICBTYXNJT1VuaXQxUGh5RGF0YSwgTVBJX1BPSU5URVIgcFNhc0lPVW5pdDFQaHlEYXRhOworCisvKgorICogSG9zdCBjb2RlIChkcml2ZXJzLCBCSU9TLCB1dGlsaXRpZXMsIGV0Yy4pIHNob3VsZCBsZWF2ZSB0aGlzIGRlZmluZSBzZXQgdG8KKyAqIG9uZSBhbmQgY2hlY2sgSGVhZGVyLlBhZ2VMZW5ndGggYXQgcnVudGltZS4KKyAqLworI2lmbmRlZiBNUElfU0FTX0lPVU5JVDFfUEhZX01BWAorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfUEhZX01BWCAgICAgICAgICgxKQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IF9DT05GSUdfUEFHRV9TQVNfSU9fVU5JVF8xCit7CisgICAgZkNPTkZJR19FWFRFTkRFRF9QQUdFX0hFQURFUiBIZWFkZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIE51bVBoeXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDBDaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwRGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMEVoICovCisgICAgTVBJX1NBU19JT19VTklUMV9QSFlfREFUQSAgIFBoeURhdGFbTVBJX1NBU19JT1VOSVQxX1BIWV9NQVhdOyAgIC8qIDEwaCAqLworfSBmQ09ORklHX1BBR0VfU0FTX0lPX1VOSVRfMSwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX1NBU19JT19VTklUXzEsCisgIFNhc0lPVW5pdFBhZ2UxX3QsIE1QSV9QT0lOVEVSIHBTYXNJT1VuaXRQYWdlMV90OworCisjZGVmaW5lIE1QSV9TQVNJT1VOSVRQQUdFMV9QQUdFVkVSU0lPTiAgICAgICgweDAwKQorCisvKiB2YWx1ZXMgZm9yIFNBUyBJTyBVbml0IFBhZ2UgMCBQb3J0RmxhZ3MgKi8KKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX1BPUlRfRkxBR1NfMF9UQVJHRVRfSU9DX05VTSAgICAgICAgICgweDAwKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfUE9SVF9GTEFHU18xX1RBUkdFVF9JT0NfTlVNICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9QT1JUX0ZMQUdTX1dBSVRfRk9SX1BPUlRFTkFCTEUgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX1BPUlRfRkxBR1NfQVVUT19QT1JUX0NPTkZJRyAgICAgICAgICgweDAxKQorCisvKiB2YWx1ZXMgZm9yIFNBUyBJTyBVbml0IFBhZ2UgMCBQaHlGbGFncyAqLworI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfUEhZX0ZMQUdTX1BIWV9ESVNBQkxFICAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9QSFlfRkxBR1NfVFhfSU5WRVJUICAgICAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX1BIWV9GTEFHU19SWF9JTlZFUlQgICAgICAgICAgICAgICAgICgweDAxKQorCisvKiB2YWx1ZXMgZm9yIFNBUyBJTyBVbml0IFBhZ2UgMCBNYXhNaW5MaW5rUmF0ZSAqLworI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfTUFYX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgKDB4RjApCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9NQVhfUkFURV8xXzUgICAgICAgICAgICAgICAgICAgICAgICAoMHg4MCkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX01BWF9SQVRFXzNfMCAgICAgICAgICAgICAgICAgICAgICAgICgweDkwKQorI2RlZmluZSBNUElfU0FTX0lPVU5JVDFfTUlOX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgKDB4MEYpCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMV9NSU5fUkFURV8xXzUgICAgICAgICAgICAgICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQxX01JTl9SQVRFXzNfMCAgICAgICAgICAgICAgICAgICAgICAgICgweDA5KQorCisvKiBzZWUgbXBpX3Nhcy5oIGZvciB2YWx1ZXMgZm9yIFNBUyBJTyBVbml0IFBhZ2UgMSBDb250cm9sbGVyUGh5RGV2aWNlSW5mbyB2YWx1ZXMgKi8KKworCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfU0FTX0lPX1VOSVRfMgoreworICAgIGZDT05GSUdfRVhURU5ERURfUEFHRV9IRUFERVIgICAgICAgICBIZWFkZXI7ICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAvKiAwOGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhQZXJzaXN0ZW50SURzOyAgICAgICAvKiAwQ2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1QZXJzaXN0ZW50SURzVXNlZDsgICAvKiAwRWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXM7ICAgICAgICAgICAgICAgICAvKiAxMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFnczsgICAgICAgICAgICAgICAgICAvKiAxMWggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAvKiAxMmggKi8KK30gZkNPTkZJR19QQUdFX1NBU19JT19VTklUXzIsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9TQVNfSU9fVU5JVF8yLAorICBTYXNJT1VuaXRQYWdlMl90LCBNUElfUE9JTlRFUiBwU2FzSU9Vbml0UGFnZTJfdDsKKworI2RlZmluZSBNUElfU0FTSU9VTklUUEFHRTJfUEFHRVZFUlNJT04gICAgICAoMHgwMCkKKworLyogdmFsdWVzIGZvciBTQVMgSU8gVW5pdCBQYWdlIDIgU3RhdHVzIGZpZWxkICovCisjZGVmaW5lIE1QSV9TQVNfSU9VTklUMl9TVEFUVVNfRElTQUJMRURfUEVSU0lTVEVOVF9NQVBQSU5HUyAoMHgwMikKKyNkZWZpbmUgTVBJX1NBU19JT1VOSVQyX1NUQVRVU19GVUxMX1BFUlNJU1RFTlRfTUFQUElOR1MgICAgICgweDAxKQorCisvKiB2YWx1ZXMgZm9yIFNBUyBJTyBVbml0IFBhZ2UgMiBGbGFncyBmaWVsZCAqLworI2RlZmluZSBNUElfU0FTX0lPVU5JVDJfRkxBR1NfRElTQUJMRV9QRVJTSVNURU5UX01BUFBJTkdTICAgKDB4MDEpCisKKwordHlwZWRlZiBzdHJ1Y3QgX0NPTkZJR19QQUdFX1NBU19JT19VTklUXzMKK3sKKyAgICBmQ09ORklHX0VYVEVOREVEX1BBR0VfSEVBREVSIEhlYWRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIE1heEludmFsaWREd29yZENvdW50OyAgICAgICAgICAgLyogMENoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWREd29yZENvdW50VGltZTsgICAgICAgICAgLyogMTBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIE1heFJ1bm5pbmdEaXNwYXJpdHlFcnJvckNvdW50OyAgLyogMTRoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bm5pbmdEaXNwYXJpdHlFcnJvclRpbWU7ICAgICAgLyogMThoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIE1heExvc3NEd29yZFN5bmNoQ291bnQ7ICAgICAgICAgLyogMUNoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIExvc3NEd29yZFN5bmNoQ291bnRUaW1lOyAgICAgICAgLyogMjBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIE1heFBoeVJlc2V0UHJvYmxlbUNvdW50OyAgICAgICAgLyogMjRoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIFBoeVJlc2V0UHJvYmxlbVRpbWU7ICAgICAgICAgICAgLyogMjhoICovCit9IGZDT05GSUdfUEFHRV9TQVNfSU9fVU5JVF8zLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfU0FTX0lPX1VOSVRfMywKKyAgU2FzSU9Vbml0UGFnZTNfdCwgTVBJX1BPSU5URVIgcFNhc0lPVW5pdFBhZ2UzX3Q7CisKKyNkZWZpbmUgTVBJX1NBU0lPVU5JVFBBR0UzX1BBR0VWRVJTSU9OICAgICAgKDB4MDApCisKKwordHlwZWRlZiBzdHJ1Y3QgX0NPTkZJR19QQUdFX1NBU19FWFBBTkRFUl8wCit7CisgICAgZkNPTkZJR19FWFRFTkRFRF9QQUdFX0hFQURFUiAgICAgICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBU0FkZHJlc3M7ICAgICAgICAgICAgIC8qIDBDaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgIC8qIDE0aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldkhhbmRsZTsgICAgICAgICAgICAgIC8qIDE4aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmVudERldkhhbmRsZTsgICAgICAgIC8qIDFBaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuZGVyQ2hhbmdlQ291bnQ7ICAgIC8qIDFDaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuZGVyUm91dGVJbmRleGVzOyAgIC8qIDFFaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVBoeXM7ICAgICAgICAgICAgICAgIC8qIDIwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBU0xldmVsOyAgICAgICAgICAgICAgIC8qIDIxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzOyAgICAgICAgICAgICAgICAgIC8qIDIyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgIC8qIDIzaCAqLworfSBmQ09ORklHX1BBR0VfU0FTX0VYUEFOREVSXzAsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9TQVNfRVhQQU5ERVJfMCwKKyAgU2FzRXhwYW5kZXJQYWdlMF90LCBNUElfUE9JTlRFUiBwU2FzRXhwYW5kZXJQYWdlMF90OworCisjZGVmaW5lIE1QSV9TQVNFWFBBTkRFUjBfUEFHRVZFUlNJT04gICAgICAgICgweDAwKQorCisvKiB2YWx1ZXMgZm9yIFNBUyBFeHBhbmRlciBQYWdlIDAgRmxhZ3MgZmllbGQgKi8KKyNkZWZpbmUgTVBJX1NBU19FWFBBTkRFUjBfRkxBR1NfUk9VVEVfVEFCTEVfQ09ORklHICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9TQVNfRVhQQU5ERVIwX0ZMQUdTX0NPTkZJR19JTl9QUk9HUkVTUyAgICAgICgweDAxKQorCisKK3R5cGVkZWYgc3RydWN0IF9DT05GSUdfUEFHRV9TQVNfREVWSUNFXzAKK3sKKyAgICBmQ09ORklHX0VYVEVOREVEX1BBR0VfSEVBREVSICAgICAgICAgSGVhZGVyOyAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FTQWRkcmVzczsgICAgICAgICAgICAgLyogMENoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgLyogMTRoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2SGFuZGxlOyAgICAgICAgICAgICAgLyogMThoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0SUQ7ICAgICAgICAgICAgICAgLyogMUFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVzOyAgICAgICAgICAgICAgICAgICAgLyogMUJoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlSW5mbzsgICAgICAgICAgICAgLyogMUNoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3M7ICAgICAgICAgICAgICAgICAgLyogMjBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGh5c2ljYWxQb3J0OyAgICAgICAgICAgLyogMjJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAgICAgLyogMjNoICovCit9IGZDT05GSUdfUEFHRV9TQVNfREVWSUNFXzAsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9TQVNfREVWSUNFXzAsCisgIFNhc0RldmljZVBhZ2UwX3QsIE1QSV9QT0lOVEVSIHBTYXNEZXZpY2VQYWdlMF90OworCisjZGVmaW5lIE1QSV9TQVNERVZJQ0UwX1BBR0VWRVJTSU9OICAgICAgICAgICgweDAwKQorCisvKiB2YWx1ZXMgZm9yIFNBUyBEZXZpY2UgUGFnZSAwIEZsYWdzIGZpZWxkICovCisjZGVmaW5lIE1QSV9TQVNfREVWSUNFMF9GTEFHU19NQVBQSU5HX1BFUlNJU1RFTlQgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9TQVNfREVWSUNFMF9GTEFHU19ERVZJQ0VfTUFQUEVEICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9TQVNfREVWSUNFMF9GTEFHU19ERVZJQ0VfUFJFU0VOVCAgICAgICAgKDB4MDEpCisKKy8qIHNlZSBtcGlfc2FzLmggZm9yIHZhbHVlcyBmb3IgU0FTIERldmljZSBQYWdlIDAgRGV2aWNlSW5mbyB2YWx1ZXMgKi8KKworCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfU0FTX0RFVklDRV8xCit7CisgICAgZkNPTkZJR19FWFRFTkRFRF9QQUdFX0hFQURFUiAgICAgICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBU0FkZHJlc3M7ICAgICAgICAgICAgIC8qIDBDaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgIC8qIDE0aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldkhhbmRsZTsgICAgICAgICAgICAgIC8qIDE4aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldElEOyAgICAgICAgICAgICAgIC8qIDFBaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1czsgICAgICAgICAgICAgICAgICAgIC8qIDFCaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXRpYWxSZWdEZXZpY2VGSVNbMjBdOy8qIDFDaCAqLworfSBmQ09ORklHX1BBR0VfU0FTX0RFVklDRV8xLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfU0FTX0RFVklDRV8xLAorICBTYXNEZXZpY2VQYWdlMV90LCBNUElfUE9JTlRFUiBwU2FzRGV2aWNlUGFnZTFfdDsKKworI2RlZmluZSBNUElfU0FTREVWSUNFMV9QQUdFVkVSU0lPTiAgICAgICAgICAoMHgwMCkKKworCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfU0FTX1BIWV8wCit7CisgICAgZkNPTkZJR19FWFRFTkRFRF9QQUdFX0hFQURFUiAgICAgICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBU0FkZHJlc3M7ICAgICAgICAgICAgIC8qIDBDaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaGVkRGV2SGFuZGxlOyAgICAgIC8qIDE0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaGVkUGh5SWRlbnRpZmllcjsgIC8qIDE2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgIC8qIDE3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaGVkRGV2aWNlSW5mbzsgICAgIC8qIDE4aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1tZWRMaW5rUmF0ZTsgICAgIC8qIDIwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh3TGlua1JhdGU7ICAgICAgICAgICAgIC8qIDIxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZUNvdW50OyAgICAgICAgICAgIC8qIDIyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgIC8qIDIzaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBoeUluZm87ICAgICAgICAgICAgICAgIC8qIDI0aCAqLworfSBmQ09ORklHX1BBR0VfU0FTX1BIWV8wLCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfU0FTX1BIWV8wLAorICBTYXNQaHlQYWdlMF90LCBNUElfUE9JTlRFUiBwU2FzUGh5UGFnZTBfdDsKKworI2RlZmluZSBNUElfU0FTUEhZMF9QQUdFVkVSU0lPTiAgICAgICAgICAgICAoMHgwMCkKKworLyogdmFsdWVzIGZvciBTQVMgUEhZIFBhZ2UgMCBQcm9ncmFtbWVkTGlua1JhdGUgZmllbGQgKi8KKyNkZWZpbmUgTVBJX1NBU19QSFkwX1BSQVRFX01BWF9SQVRFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAoMHhGMCkKKyNkZWZpbmUgTVBJX1NBU19QSFkwX1BSQVRFX01BWF9SQVRFX05PVF9QUk9HUkFNTUFCTEUgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX1NBU19QSFkwX1BSQVRFX01BWF9SQVRFXzFfNSAgICAgICAgICAgICAgICAgICAgICAgICAoMHg4MCkKKyNkZWZpbmUgTVBJX1NBU19QSFkwX1BSQVRFX01BWF9SQVRFXzNfMCAgICAgICAgICAgICAgICAgICAgICAgICAoMHg5MCkKKyNkZWZpbmUgTVBJX1NBU19QSFkwX1BSQVRFX01JTl9SQVRFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAoMHgwRikKKyNkZWZpbmUgTVBJX1NBU19QSFkwX1BSQVRFX01JTl9SQVRFX05PVF9QUk9HUkFNTUFCTEUgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX1NBU19QSFkwX1BSQVRFX01JTl9SQVRFXzFfNSAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTVBJX1NBU19QSFkwX1BSQVRFX01JTl9SQVRFXzNfMCAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwOSkKKworLyogdmFsdWVzIGZvciBTQVMgUEhZIFBhZ2UgMCBId0xpbmtSYXRlIGZpZWxkICovCisjZGVmaW5lIE1QSV9TQVNfUEhZMF9IV1JBVEVfTUFYX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgKDB4RjApCisjZGVmaW5lIE1QSV9TQVNfUEhZMF9IV1JBVEVfTUFYX1JBVEVfMV81ICAgICAgICAgICAgICAgICAgICAgICAgKDB4ODApCisjZGVmaW5lIE1QSV9TQVNfUEhZMF9IV1JBVEVfTUFYX1JBVEVfM18wICAgICAgICAgICAgICAgICAgICAgICAgKDB4OTApCisjZGVmaW5lIE1QSV9TQVNfUEhZMF9IV1JBVEVfTUlOX1JBVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgKDB4MEYpCisjZGVmaW5lIE1QSV9TQVNfUEhZMF9IV1JBVEVfTUlOX1JBVEVfMV81ICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIE1QSV9TQVNfUEhZMF9IV1JBVEVfTUlOX1JBVEVfM18wICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDkpCisKKy8qIHZhbHVlcyBmb3IgU0FTIFBIWSBQYWdlIDAgUGh5SW5mbyBmaWVsZCAqLworI2RlZmluZSBNUElfU0FTX1BIWTBfUEhZSU5GT19TQVRBX1BPUlRfQUNUSVZFICAgICAgICAgICAgICAgICAgICgweDAwMDA0MDAwKQorI2RlZmluZSBNUElfU0FTX1BIWTBfUEhZSU5GT19TQVRBX1BPUlRfU0VMRUNUT1IgICAgICAgICAgICAgICAgICgweDAwMDAyMDAwKQorI2RlZmluZSBNUElfU0FTX1BIWTBfUEhZSU5GT19WSVJUVUFMX1BIWSAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAxMDAwKQorCisjZGVmaW5lIE1QSV9TQVNfUEhZMF9QSFlJTkZPX01BU0tfUEFSVElBTF9QQVRIV0FZX1RJTUUgICAgICAgICAgKDB4MDAwMDBGMDApCisjZGVmaW5lIE1QSV9TQVNfUEhZMF9QSFlJTkZPX1NISUZUX1BBUlRJQUxfUEFUSFdBWV9USU1FICAgICAgICAgKDgpCisKKyNkZWZpbmUgTVBJX1NBU19QSFkwX1BIWUlORk9fTUFTS19ST1VUSU5HX0FUVFJJQlVURSAgICAgICAgICAgICAoMHgwMDAwMDBGMCkKKyNkZWZpbmUgTVBJX1NBU19QSFkwX1BIWUlORk9fRElSRUNUX1JPVVRJTkcgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgTVBJX1NBU19QSFkwX1BIWUlORk9fU1VCVFJBQ1RJVkVfUk9VVElORyAgICAgICAgICAgICAgICAoMHgwMDAwMDAxMCkKKyNkZWZpbmUgTVBJX1NBU19QSFkwX1BIWUlORk9fVEFCTEVfUk9VVElORyAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAyMCkKKworI2RlZmluZSBNUElfU0FTX1BIWTBfUEhZSU5GT19NQVNLX0xJTktfUkFURSAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDBGKQorI2RlZmluZSBNUElfU0FTX1BIWTBfUEhZSU5GT19VTktOT1dOX0xJTktfUkFURSAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBNUElfU0FTX1BIWTBfUEhZSU5GT19QSFlfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBNUElfU0FTX1BIWTBfUEhZSU5GT19ORUdPVElBVElPTl9GQUlMRUQgICAgICAgICAgICAgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBNUElfU0FTX1BIWTBfUEhZSU5GT19TQVRBX09PQl9DT01QTEVURSAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAzKQorI2RlZmluZSBNUElfU0FTX1BIWTBfUEhZSU5GT19SQVRFXzFfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDA4KQorI2RlZmluZSBNUElfU0FTX1BIWTBfUEhZSU5GT19SQVRFXzNfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDA5KQorCisKK3R5cGVkZWYgc3RydWN0IF9DT05GSUdfUEFHRV9TQVNfUEhZXzEKK3sKKyAgICBmQ09ORklHX0VYVEVOREVEX1BBR0VfSEVBREVSIEhlYWRlcjsgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkRHdvcmRDb3VudDsgICAgICAgICAgLyogMENoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bm5pbmdEaXNwYXJpdHlFcnJvckNvdW50OyAvKiAxMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgTG9zc0R3b3JkU3luY2hDb3VudDsgICAgICAgIC8qIDE0aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICBQaHlSZXNldFByb2JsZW1Db3VudDsgICAgICAgLyogMThoICovCit9IGZDT05GSUdfUEFHRV9TQVNfUEhZXzEsIE1QSV9QT0lOVEVSIFBUUl9DT05GSUdfUEFHRV9TQVNfUEhZXzEsCisgIFNhc1BoeVBhZ2UxX3QsIE1QSV9QT0lOVEVSIHBTYXNQaHlQYWdlMV90OworCisjZGVmaW5lIE1QSV9TQVNQSFkxX1BBR0VWRVJTSU9OICAgICAgICAgICAgICgweDAwKQorCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfZmMuaCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9mYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMjY2YjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfZmMuaApAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBMU0kgTG9naWMgQ29ycG9yYXRpb24uCisgKgorICoKKyAqICAgICAgICAgICBOYW1lOiAgbXBpX2ZjLmgKKyAqICAgICAgICAgIFRpdGxlOiAgTVBJIEZpYnJlIENoYW5uZWwgbWVzc2FnZXMgYW5kIHN0cnVjdHVyZXMKKyAqICBDcmVhdGlvbiBEYXRlOiAgSnVuZSAxMiwgMjAwMAorICoKKyAqICAgIG1waV9mYy5oIFZlcnNpb246ICAwMS4wNS54eAorICoKKyAqICBWZXJzaW9uIEhpc3RvcnkKKyAqICAtLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgRGF0ZSAgICAgIFZlcnNpb24gICBEZXNjcmlwdGlvbgorICogIC0tLS0tLS0tICAtLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgMDUtMDgtMDAgIDAwLjEwLjAxICBPcmlnaW5hbCByZWxlYXNlIGZvciAwLjEwIHNwZWMgZGF0ZWQgNC8yNi8yMDAwLgorICogIDA2LTA2LTAwICAwMS4wMC4wMSAgVXBkYXRlIHZlcnNpb24gbnVtYmVyIGZvciAxLjAgcmVsZWFzZS4KKyAqICAwNi0xMi0wMCAgMDEuMDAuMDIgIEFkZGVkIF9NU0dfRkNfQUJPUlRfUkVQTFkgc3RydWN0dXJlLgorICogIDExLTAyLTAwICAwMS4wMS4wMSAgT3JpZ2luYWwgcmVsZWFzZSBmb3IgcG9zdCAxLjAgd29yaworICogIDEyLTA0LTAwICAwMS4wMS4wMiAgQWRkZWQgbWVzc2FnZXMgZm9yIENvbW1vbiBUcmFuc3BvcnQgU2VuZCBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgIFByaW1pdGl2ZSBTZW5kLgorICogIDAxLTA5LTAxICAwMS4wMS4wMyAgTW9kaWZlZCBzb21lIG9mIHRoZSBuZXcgZmxhZ3MgdG8gaGF2ZSBhbiBNUEkgcHJlZml4CisgKiAgICAgICAgICAgICAgICAgICAgICBhbmQgbW9kaWZpZWQgdGhlIEZjUHJpbWl0aXZlU2VuZCBmbGFncy4KKyAqICAwMS0yNS0wMSAgMDEuMDEuMDQgIE1vdmUgSW5pdGlhdG9ySW5kZXggaW4gTGlua1NlcnZpY2VSc3AgcmVwbHkgdG8gYSBsYXJnZXIKKyAqICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgRkNfQUJPUlRfVFlQRV9DVF9TRU5EX1JFUVVFU1QgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICBGQ19BQk9SVF9UWVBFX0VYTElOS1NFTkRfUkVRVUVTVCBmb3IgRmNBYm9ydCByZXF1ZXN0LgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJX0ZDX1BSSU1fU0VORF9GTEFHU19TVE9QX1NFTkQuCisgKiAgMDItMjAtMDEgIDAxLjAxLjA1ICBTdGFydGVkIHVzaW5nIE1QSV9QT0lOVEVSLgorICogIDAzLTI3LTAxICAwMS4wMS4wNiAgQWRkZWQgRmxhZ3MgZmllbGQgdG8gTVNHX0xJTktfU0VSVklDRV9CVUZGRVJfUE9TVF9SRVBMWQorICogICAgICAgICAgICAgICAgICAgICAgYW5kIGRlZmluZWQgTVBJX0xTX0JVRl9QT1NUX1JFUExZX0ZMQUdfTk9fUlNQX05FRURFRC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSV9GQ19QUklNX1NFTkRfRkxBR1NfUkVTRVRfTElOSyBkZWZpbmUuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBzdHJ1Y3R1cmUgb2Zmc2V0IGNvbW1lbnRzLgorICogIDA0LTA5LTAxICAwMS4wMS4wNyAgQWRkZWQgUnNwTGVuZ3RoIGZpZWxkIHRvIE1TR19MSU5LX1NFUlZJQ0VfUlNQX1JFUVVFU1QuCisgKiAgMDgtMDgtMDEgIDAxLjAyLjAxICBPcmlnaW5hbCByZWxlYXNlIGZvciB2MS4yIHdvcmsuCisgKiAgMDktMjgtMDEgIDAxLjAyLjAyICBDaGFuZ2UgbmFtZSBvZiByZXNlcnZlZCBmaWVsZCBpbgorICogICAgICAgICAgICAgICAgICAgICAgTVNHX0xJTktfU0VSVklDRV9SU1BfUkVQTFkuCisgKiAgMDUtMzEtMDIgIDAxLjAyLjAzICBBZGRpbmcgQWxpYXNJbmRleCB0byBGQyBEaXJlY3QgQWNjZXNzIHJlcXVlc3RzLgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBNUElfRkNfSAorI2RlZmluZSBNUElfRkNfSAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgRiBDICAgIEQgaSByIGUgYyB0ICAgIEEgYyBjIGUgcyBzICAgICBNIGUgcyBzIGEgZyBlIHMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIExpbmsgU2VydmljZSBCdWZmZXIgUG9zdCBtZXNzYWdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfTElOS19TRVJWSUNFX0JVRkZFUl9QT1NUX1JFUVVFU1QKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJQb3N0RmxhZ3M7ICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckNvdW50OyAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ2hhaW5PZmZzZXQ7ICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgIC8qIDAzaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgLyogMDhoICovCisgICAgU0dFX1RSQU5TX1NJTVBMRV9VTklPTiAgU0dMOworfSBNU0dfTElOS19TRVJWSUNFX0JVRkZFUl9QT1NUX1JFUVVFU1QsCisgTVBJX1BPSU5URVIgUFRSX01TR19MSU5LX1NFUlZJQ0VfQlVGRkVSX1BPU1RfUkVRVUVTVCwKKyAgTGlua1NlcnZpY2VCdWZmZXJQb3N0UmVxdWVzdF90LCBNUElfUE9JTlRFUiBwTGlua1NlcnZpY2VCdWZmZXJQb3N0UmVxdWVzdF90OworCisjZGVmaW5lIExJTktfU0VSVklDRV9CVUZGRVJfUE9TVF9GTEFHU19QT1JUX01BU0sgKDB4MDEpCisKK3R5cGVkZWYgc3RydWN0IF9XV05GT1JNQVQKK3sKKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBQb3J0TmFtZUhpZ2g7ICAgICAgIC8qIDAwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFBvcnROYW1lTG93OyAgICAgICAgLyogMDRoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTm9kZU5hbWVIaWdoOyAgICAgICAvKiAwOGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBOb2RlTmFtZUxvdzsgICAgICAgIC8qIDBDaCAqLworfSBXV05GT1JNQVQsCisgIFd3bkZvcm1hdF90OworCisvKiBMaW5rIFNlcnZpY2UgQnVmZmVyIFBvc3QgUmVwbHkgKi8KK3R5cGVkZWYgc3RydWN0IF9NU0dfTElOS19TRVJWSUNFX0JVRkZFUl9QT1NUX1JFUExZCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRmxhZ3M7ICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0xlbmd0aDsgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFBvcnROdW1iZXI7ICAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgIC8qIDA4aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgLyogMENoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSU9DU3RhdHVzOyAgICAgICAgICAvKiAwRWggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBJT0NMb2dJbmZvOyAgICAgICAgIC8qIDEwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFRyYW5zZmVyTGVuZ3RoOyAgICAgLyogMTRoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25Db250ZXh0OyAvKiAxOGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSY3RsX0RpZDsgICAgICAgICAgIC8qIDFDaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIENzY3RsX1NpZDsgICAgICAgICAgLyogMjBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgVHlwZV9GY3RsOyAgICAgICAgICAvKiAyNGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBTZXFDbnQ7ICAgICAgICAgICAgIC8qIDI4aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIERmY3RsOyAgICAgICAgICAgICAgLyogMkFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgU2VxSWQ7ICAgICAgICAgICAgICAvKiAyQmggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSeGlkOyAgICAgICAgICAgICAgIC8qIDJDaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIE94aWQ7ICAgICAgICAgICAgICAgLyogMkVoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyOyAgICAgICAgICAvKiAzMGggKi8KKyAgICBXV05GT1JNQVQgICAgICAgICAgICAgICBXd247ICAgICAgICAgICAgICAgIC8qIDM0aCAqLworfSBNU0dfTElOS19TRVJWSUNFX0JVRkZFUl9QT1NUX1JFUExZLCBNUElfUE9JTlRFUiBQVFJfTVNHX0xJTktfU0VSVklDRV9CVUZGRVJfUE9TVF9SRVBMWSwKKyAgTGlua1NlcnZpY2VCdWZmZXJQb3N0UmVwbHlfdCwgTVBJX1BPSU5URVIgcExpbmtTZXJ2aWNlQnVmZmVyUG9zdFJlcGx5X3Q7CisKKyNkZWZpbmUgTVBJX0xTX0JVRl9QT1NUX1JFUExZX0ZMQUdfTk9fUlNQX05FRURFRCAgICAoMHg4MCkKKworI2RlZmluZSBNUElfRkNfRElEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwRkZGRkZGKQorI2RlZmluZSBNUElfRkNfRElEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBNUElfRkNfUkNUTF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweEZGMDAwMDAwKQorI2RlZmluZSBNUElfRkNfUkNUTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICgyNCkKKyNkZWZpbmUgTVBJX0ZDX1NJRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMEZGRkZGRikKKyNkZWZpbmUgTVBJX0ZDX1NJRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgTVBJX0ZDX0NTQ1RMX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhGRjAwMDAwMCkKKyNkZWZpbmUgTVBJX0ZDX0NTQ1RMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAoMjQpCisjZGVmaW5lIE1QSV9GQ19GQ1RMX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDBGRkZGRkYpCisjZGVmaW5lIE1QSV9GQ19GQ1RMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIE1QSV9GQ19UWVBFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4RkYwMDAwMDApCisjZGVmaW5lIE1QSV9GQ19UWVBFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgKDI0KQorCisvKiBvYnNvbGV0ZSBuYW1lIGZvciB0aGUgYWJvdmUgKi8KKyNkZWZpbmUgRkNQX1RBUkdFVF9ESURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMEZGRkZGRikKKyNkZWZpbmUgRkNQX1RBUkdFVF9ESURfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgRkNQX1RBUkdFVF9SQ1RMX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAoMHhGRjAwMDAwMCkKKyNkZWZpbmUgRkNQX1RBUkdFVF9SQ1RMX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAoMjQpCisjZGVmaW5lIEZDUF9UQVJHRVRfU0lEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDBGRkZGRkYpCisjZGVmaW5lIEZDUF9UQVJHRVRfU0lEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIEZDUF9UQVJHRVRfQ1NDVExfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgKDB4RkYwMDAwMDApCisjZGVmaW5lIEZDUF9UQVJHRVRfQ1NDVExfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgKDI0KQorI2RlZmluZSBGQ1BfVEFSR0VUX0ZDVExfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICgweDAwRkZGRkZGKQorI2RlZmluZSBGQ1BfVEFSR0VUX0ZDVExfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBGQ1BfVEFSR0VUX1RZUEVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICgweEZGMDAwMDAwKQorI2RlZmluZSBGQ1BfVEFSR0VUX1RZUEVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICgyNCkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIExpbmsgU2VydmljZSBSZXNwb25zZSBtZXNzYWdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfTElOS19TRVJWSUNFX1JTUF9SRVFVRVNUCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUnNwRmxhZ3M7ICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSc3BMZW5ndGg7ICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENoYWluT2Zmc2V0OyAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgIC8qIDA4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJjdGxfRGlkOyAgICAgICAgICAgLyogMENoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgQ3NjdGxfU2lkOyAgICAgICAgICAvKiAxMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBUeXBlX0ZjdGw7ICAgICAgICAgIC8qIDE0aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFNlcUNudDsgICAgICAgICAgICAgLyogMThoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRGZjdGw7ICAgICAgICAgICAgICAvKiAxQWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBTZXFJZDsgICAgICAgICAgICAgIC8qIDFCaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJ4aWQ7ICAgICAgICAgICAgICAgLyogMUNoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgT3hpZDsgICAgICAgICAgICAgICAvKiAxRWggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXI7ICAgICAgICAgIC8qIDIwaCAqLworICAgIFNHRV9TSU1QTEVfVU5JT04gICAgICAgIFNHTDsgICAgICAgICAgICAgICAgLyogMjRoICovCit9IE1TR19MSU5LX1NFUlZJQ0VfUlNQX1JFUVVFU1QsIE1QSV9QT0lOVEVSIFBUUl9NU0dfTElOS19TRVJWSUNFX1JTUF9SRVFVRVNULAorICBMaW5rU2VydmljZVJzcFJlcXVlc3RfdCwgTVBJX1BPSU5URVIgcExpbmtTZXJ2aWNlUnNwUmVxdWVzdF90OworCisjZGVmaW5lIExJTktfU0VSVklDRV9SU1BfRkxBR1NfSU1NRURJQVRFICAgICAgICAoMHg4MCkKKyNkZWZpbmUgTElOS19TRVJWSUNFX1JTUF9GTEFHU19QT1JUX01BU0sgICAgICAgICgweDAxKQorCisKKy8qIExpbmsgU2VydmljZSBSZXNwb25zZSBSZXBseSAgKi8KK3R5cGVkZWYgc3RydWN0IF9NU0dfTElOS19TRVJWSUNFX1JTUF9SRVBMWQoreworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnTGVuZ3RoOyAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgIC8qIDAzaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWRfMDEwMF9Jbml0aWF0b3JJbmRleDsgLyogMDZoICovIC8qIG9ic29sZXRlIEluaXRpYXRvckluZGV4ICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgIC8qIDA4aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgLyogMENoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSU9DU3RhdHVzOyAgICAgICAgICAvKiAwRWggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBJT0NMb2dJbmZvOyAgICAgICAgIC8qIDEwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEluaXRpYXRvckluZGV4OyAgICAgLyogMTRoICovCit9IE1TR19MSU5LX1NFUlZJQ0VfUlNQX1JFUExZLCBNUElfUE9JTlRFUiBQVFJfTVNHX0xJTktfU0VSVklDRV9SU1BfUkVQTFksCisgIExpbmtTZXJ2aWNlUnNwUmVwbHlfdCwgTVBJX1BPSU5URVIgcExpbmtTZXJ2aWNlUnNwUmVwbHlfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEV4dGVuZGVkIExpbmsgU2VydmljZSBTZW5kIG1lc3NhZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfRVhMSU5LX1NFUlZJQ0VfU0VORF9SRVFVRVNUCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgU2VuZEZsYWdzOyAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBBbGlhc0luZGV4OyAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENoYWluT2Zmc2V0OyAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnc19EaWQ7ICAgICAgIC8qIDA0aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgLyogMDhoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgRWxzQ29tbWFuZENvZGU7ICAgICAvKiAwQ2ggKi8KKyAgICBTR0VfU0lNUExFX1VOSU9OICAgICAgICBTR0w7ICAgICAgICAgICAgICAgIC8qIDEwaCAqLworfSBNU0dfRVhMSU5LX1NFUlZJQ0VfU0VORF9SRVFVRVNULCBNUElfUE9JTlRFUiBQVFJfTVNHX0VYTElOS19TRVJWSUNFX1NFTkRfUkVRVUVTVCwKKyAgRXhMaW5rU2VydmljZVNlbmRSZXF1ZXN0X3QsIE1QSV9QT0lOVEVSIHBFeExpbmtTZXJ2aWNlU2VuZFJlcXVlc3RfdDsKKworI2RlZmluZSBFWF9MSU5LX1NFUlZJQ0VfU0VORF9ESURfTUFTSyAgICAgICAgICAgKDB4MDBGRkZGRkYpCisjZGVmaW5lIEVYX0xJTktfU0VSVklDRV9TRU5EX0RJRF9TSElGVCAgICAgICAgICAoMCkKKyNkZWZpbmUgRVhfTElOS19TRVJWSUNFX1NFTkRfTVNHRkxBR1NfTUFTSyAgICAgICgweEZGMDAwMDAwKQorI2RlZmluZSBFWF9MSU5LX1NFUlZJQ0VfU0VORF9NU0dGTEFHU19TSElGVCAgICAgKDI0KQorCisKKy8qIEV4dGVuZGVkIExpbmsgU2VydmljZSBTZW5kIFJlcGx5ICovCit0eXBlZGVmIHN0cnVjdCBfTVNHX0VYTElOS19TRVJWSUNFX1NFTkRfUkVQTFkKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEFsaWFzSW5kZXg7ICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnTGVuZ3RoOyAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgIC8qIDAzaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgLyogMDhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBJT0NTdGF0dXM7ICAgICAgICAgIC8qIDBFaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIElPQ0xvZ0luZm87ICAgICAgICAgLyogMTBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2VMZW5ndGg7ICAgICAvKiAxNGggKi8KK30gTVNHX0VYTElOS19TRVJWSUNFX1NFTkRfUkVQTFksIE1QSV9QT0lOVEVSIFBUUl9NU0dfRVhMSU5LX1NFUlZJQ0VfU0VORF9SRVBMWSwKKyAgRXhMaW5rU2VydmljZVNlbmRSZXBseV90LCBNUElfUE9JTlRFUiBwRXhMaW5rU2VydmljZVNlbmRSZXBseV90OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZDIEFib3J0IG1lc3NhZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfRkNfQUJPUlRfUkVRVUVTVAoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEFib3J0RmxhZ3M7ICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBBYm9ydFR5cGU7ICAgICAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ2hhaW5PZmZzZXQ7ICAgICAgICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25Db250ZXh0VG9BYm9ydDsgIC8qIDBDaCAqLworfSBNU0dfRkNfQUJPUlRfUkVRVUVTVCwgTVBJX1BPSU5URVIgUFRSX01TR19GQ19BQk9SVF9SRVFVRVNULAorICBGY0Fib3J0UmVxdWVzdF90LCBNUElfUE9JTlRFUiBwRmNBYm9ydFJlcXVlc3RfdDsKKworI2RlZmluZSBGQ19BQk9SVF9GTEFHX1BPUlRfTUFTSyAgICAgICAgICAgICAgICAgKDB4MDEpCisKKyNkZWZpbmUgRkNfQUJPUlRfVFlQRV9BTExfRkNfQlVGRkVSUyAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBGQ19BQk9SVF9UWVBFX0VYQUNUX0ZDX0JVRkZFUiAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIEZDX0FCT1JUX1RZUEVfQ1RfU0VORF9SRVFVRVNUICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgRkNfQUJPUlRfVFlQRV9FWExJTktTRU5EX1JFUVVFU1QgICAgICAgICgweDAzKQorCisvKiBGQyBBYm9ydCBSZXBseSAqLwordHlwZWRlZiBzdHJ1Y3QgX01TR19GQ19BQk9SVF9SRVBMWQoreworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnTGVuZ3RoOyAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgIC8qIDAzaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgLyogMDhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBJT0NTdGF0dXM7ICAgICAgICAgIC8qIDBFaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIElPQ0xvZ0luZm87ICAgICAgICAgLyogMTBoICovCit9IE1TR19GQ19BQk9SVF9SRVBMWSwgTVBJX1BPSU5URVIgUFRSX01TR19GQ19BQk9SVF9SRVBMWSwKKyAgRmNBYm9ydFJlcGx5X3QsIE1QSV9QT0lOVEVSIHBGY0Fib3J0UmVwbHlfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZDIENvbW1vbiBUcmFuc3BvcnQgU2VuZCBtZXNzYWdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfRkNfQ09NTU9OX1RSQU5TUE9SVF9TRU5EX1JFUVVFU1QKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBTZW5kRmxhZ3M7ICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEFsaWFzSW5kZXg7ICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ2hhaW5PZmZzZXQ7ICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgIC8qIDAzaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzX0RpZDsgICAgICAgLyogMDRoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAvKiAwOGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBDVENvbW1hbmRDb2RlOyAgICAgIC8qIDBDaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZzVHlwZTsgICAgICAgICAgICAgLyogMEVoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAvKiAwRmggKi8KKyAgICBTR0VfU0lNUExFX1VOSU9OICAgICAgICBTR0w7ICAgICAgICAgICAgICAgIC8qIDEwaCAqLworfSBNU0dfRkNfQ09NTU9OX1RSQU5TUE9SVF9TRU5EX1JFUVVFU1QsCisgTVBJX1BPSU5URVIgUFRSX01TR19GQ19DT01NT05fVFJBTlNQT1JUX1NFTkRfUkVRVUVTVCwKKyAgRmNDb21tb25UcmFuc3BvcnRTZW5kUmVxdWVzdF90LCBNUElfUE9JTlRFUiBwRmNDb21tb25UcmFuc3BvcnRTZW5kUmVxdWVzdF90OworCisjZGVmaW5lIE1QSV9GQ19DVF9TRU5EX0RJRF9NQVNLICAgICAgICAgICAgICAgICAoMHgwMEZGRkZGRikKKyNkZWZpbmUgTVBJX0ZDX0NUX1NFTkRfRElEX1NISUZUICAgICAgICAgICAgICAgICgwKQorI2RlZmluZSBNUElfRkNfQ1RfU0VORF9NU0dGTEFHU19NQVNLICAgICAgICAgICAgKDB4RkYwMDAwMDApCisjZGVmaW5lIE1QSV9GQ19DVF9TRU5EX01TR0ZMQUdTX1NISUZUICAgICAgICAgICAoMjQpCisKKworLyogRkMgQ29tbW9uIFRyYW5zcG9ydCBTZW5kIFJlcGx5ICovCit0eXBlZGVmIHN0cnVjdCBfTVNHX0ZDX0NPTU1PTl9UUkFOU1BPUlRfU0VORF9SRVBMWQoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQWxpYXNJbmRleDsgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dMZW5ndGg7ICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgLyogMDNoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAvKiAwOGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgIC8qIDBDaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIElPQ1N0YXR1czsgICAgICAgICAgLyogMEVoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgSU9DTG9nSW5mbzsgICAgICAgICAvKiAxMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZUxlbmd0aDsgICAgIC8qIDE0aCAqLworfSBNU0dfRkNfQ09NTU9OX1RSQU5TUE9SVF9TRU5EX1JFUExZLCBNUElfUE9JTlRFUiBQVFJfTVNHX0ZDX0NPTU1PTl9UUkFOU1BPUlRfU0VORF9SRVBMWSwKKyAgRmNDb21tb25UcmFuc3BvcnRTZW5kUmVwbHlfdCwgTVBJX1BPSU5URVIgcEZjQ29tbW9uVHJhbnNwb3J0U2VuZFJlcGx5X3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGQyBQcmltaXRpdmUgU2VuZCBtZXNzYWdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfTVNHX0ZDX1BSSU1JVElWRV9TRU5EX1JFUVVFU1QKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBTZW5kRmxhZ3M7ICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ2hhaW5PZmZzZXQ7ICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgIC8qIDAzaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgLyogMDhoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRmNQcmltaXRpdmVbNF07ICAgICAvKiAwQ2ggKi8KK30gTVNHX0ZDX1BSSU1JVElWRV9TRU5EX1JFUVVFU1QsIE1QSV9QT0lOVEVSIFBUUl9NU0dfRkNfUFJJTUlUSVZFX1NFTkRfUkVRVUVTVCwKKyAgRmNQcmltaXRpdmVTZW5kUmVxdWVzdF90LCBNUElfUE9JTlRFUiBwRmNQcmltaXRpdmVTZW5kUmVxdWVzdF90OworCisjZGVmaW5lIE1QSV9GQ19QUklNX1NFTkRfRkxBR1NfUE9SVF9NQVNLICAgICAgICgweDAxKQorI2RlZmluZSBNUElfRkNfUFJJTV9TRU5EX0ZMQUdTX01MX1JFU0VUX0xJTksgICAoMHgwMikKKyNkZWZpbmUgTVBJX0ZDX1BSSU1fU0VORF9GTEFHU19SRVNFVF9MSU5LICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9GQ19QUklNX1NFTkRfRkxBR1NfU1RPUF9TRU5EICAgICAgICgweDA4KQorI2RlZmluZSBNUElfRkNfUFJJTV9TRU5EX0ZMQUdTX1NFTkRfT05DRSAgICAgICAoMHgxMCkKKyNkZWZpbmUgTVBJX0ZDX1BSSU1fU0VORF9GTEFHU19TRU5EX0FST1VORCAgICAgKDB4MjApCisjZGVmaW5lIE1QSV9GQ19QUklNX1NFTkRfRkxBR1NfVU5USUxfRlVMTCAgICAgICgweDQwKQorI2RlZmluZSBNUElfRkNfUFJJTV9TRU5EX0ZMQUdTX0ZPUkVWRVIgICAgICAgICAoMHg4MCkKKworLyogRkMgUHJpbWl0aXZlIFNlbmQgUmVwbHkgKi8KK3R5cGVkZWYgc3RydWN0IF9NU0dfRkNfUFJJTUlUSVZFX1NFTkRfUkVQTFkKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBTZW5kRmxhZ3M7ICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnTGVuZ3RoOyAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgIC8qIDAzaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgLyogMDhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBJT0NTdGF0dXM7ICAgICAgICAgIC8qIDBFaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIElPQ0xvZ0luZm87ICAgICAgICAgLyogMTBoICovCit9IE1TR19GQ19QUklNSVRJVkVfU0VORF9SRVBMWSwgTVBJX1BPSU5URVIgUFRSX01TR19GQ19QUklNSVRJVkVfU0VORF9SRVBMWSwKKyAgRmNQcmltaXRpdmVTZW5kUmVwbHlfdCwgTVBJX1BPSU5URVIgcEZjUHJpbWl0aXZlU2VuZFJlcGx5X3Q7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaGlzdG9yeS50eHQgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaGlzdG9yeS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRlYjc3MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9oaXN0b3J5LnR4dApAQCAtMCwwICsxLDI3NiBAQAorCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgTVBJIEhlYWRlciBGaWxlIENoYW5nZSBIaXN0b3J5CisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBMU0kgTG9naWMgQ29ycG9yYXRpb24uCisKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBIZWFkZXIgU2V0IFJlbGVhc2UgVmVyc2lvbjogICAgMDEuMDEuMTAKKyBIZWFkZXIgU2V0IFJlbGVhc2UgRGF0ZTogICAgICAgMDQtMDktMDEKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIEZpbGVuYW1lICAgICAgICAgICAgICAgQ3VycmVudCB2ZXJzaW9uICAgICBQcmlvciB2ZXJzaW9uCisgLS0tLS0tLS0tLSAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0KKyBtcGkuaCAgICAgICAgICAgICAgICAgIDAxLjAxLjA3ICAgICAgICAgICAgMDEuMDEuMDYKKyBtcGlfaW9jLmggICAgICAgICAgICAgIDAxLjAxLjA3ICAgICAgICAgICAgMDEuMDEuMDYKKyBtcGlfY25mZy5oICAgICAgICAgICAgIDAxLjAxLjExICAgICAgICAgICAgMDEuMDEuMTAKKyBtcGlfaW5pdC5oICAgICAgICAgICAgIDAxLjAxLjA1ICAgICAgICAgICAgMDEuMDEuMDQKKyBtcGlfdGFyZy5oICAgICAgICAgICAgIDAxLjAxLjA0ICAgICAgICAgICAgMDEuMDEuMDQKKyBtcGlfZmMuaCAgICAgICAgICAgICAgIDAxLjAxLjA3ICAgICAgICAgICAgMDEuMDEuMDYKKyBtcGlfbGFuLmggICAgICAgICAgICAgIDAxLjAxLjAzICAgICAgICAgICAgMDEuMDEuMDMKKyBtcGlfcmFpZC5oICAgICAgICAgICAgIDAxLjAxLjAyICAgICAgICAgICAgMDEuMDEuMDIKKyBtcGlfdHlwZS5oICAgICAgICAgICAgIDAxLjAxLjAyICAgICAgICAgICAgMDEuMDEuMDIKKyBtcGlfaGlzdG9yeS50eHQgICAgICAgIDAxLjAxLjA5ICAgICAgICAgICAgMDEuMDEuMDkKKworCisgKiAgRGF0ZSAgICAgIFZlcnNpb24gICBEZXNjcmlwdGlvbgorICogIC0tLS0tLS0tICAtLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK21waS5oCisgKiAgMDUtMDgtMDAgIDAwLjEwLjAxICBPcmlnaW5hbCByZWxlYXNlIGZvciAwLjEwIHNwZWMgZGF0ZWQgNC8yNi8yMDAwLgorICogIDA1LTI0LTAwICAwMC4xMC4wMiAgQWRkZWQgTVBJX0lPQ1NUQVRVU19TQ1NJX1JFU0lEVUFMX01JU01BVENIIGRlZmluaXRpb24uCisgKiAgMDYtMDYtMDAgIDAxLjAwLjAxICBVcGRhdGUgTVBJX1ZFUlNJT05fTUFKT1IgYW5kIE1QSV9WRVJTSU9OX01JTk9SLgorICogIDA2LTIyLTAwICAwMS4wMC4wMiAgQWRkZWQgTVBJX0lPQ1NUQVRVU19MQU5fIGRlZmluaXRpb25zLgorICogICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlZCBMQU5fU1VTUEVORCBmdW5jdGlvbiBkZWZpbml0aW9uLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJX01TR0ZMQUdTX0NPTlRJTlVBVElPTl9SRVBMWSBkZWZpbml0aW9uLgorICogIDA2LTMwLTAwICAwMS4wMC4wMyAgQWRkZWQgTVBJX0NPTlRFWFRfUkVQTFlfVFlQRV9MQU4gZGVmaW5pdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSV9HRVQvU0VUX0NPTlRFWFRfUkVQTFlfVFlQRSBtYWNyb3MuCisgKiAgMDctMjctMDAgIDAxLjAwLjA0ICBBZGRlZCBNUElfRkFVTFRfIGRlZmluaXRpb25zLgorICogICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlZCBNUElfSU9DU1RBVFVTX01TRy9EQVRBX1hGRVJfRVJST1IgZGVmaW5pdGlvbnMuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNUElfSU9DU1RBVFVTX0lOVEVSTkFMX0VSUk9SIGRlZmluaXRpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNUElfSU9DU1RBVFVTX1RBUkdFVF9YRkVSX0NPVU5UX01JU01BVENILgorICogIDExLTAyLTAwICAwMS4wMS4wMSAgT3JpZ2luYWwgcmVsZWFzZSBmb3IgcG9zdCAxLjAgd29yaworICogIDEyLTA0LTAwICAwMS4wMS4wMiAgQWRkZWQgbmV3IGZ1bmN0aW9uIGNvZGVzLgorICogIDAxLTA5LTAxICAwMS4wMS4wMyAgQWRkZWQgbW9yZSBkZWZpbml0aW9ucyB0byB0aGUgc3lzdGVtIGludGVyZmFjZSBzZWN0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNUElfSU9DU1RBVFVTX1RBUkdFVF9TVFNfREFUQV9OT1RfU0VOVC4KKyAqICAwMS0yNS0wMSAgMDEuMDEuMDQgIENoYW5nZWQgTVBJX1ZFUlNJT05fTUlOT1IgZnJvbSAweDAwIHRvIDB4MDEuCisgKiAgMDItMjAtMDEgIDAxLjAxLjA1ICBTdGFydGVkIHVzaW5nIE1QSV9QT0lOVEVSLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgZGVmaW5lcyBmb3IgTVBJX0RJQUdfUFJFVkVOVF9JT0NfQk9PVCBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgIE1QSV9ESUFHX0NMRUFSX0ZMQVNIX0JBRF9TSUcuCisgKiAgICAgICAgICAgICAgICAgICAgICBPYnNvbGV0ZWQgTVBJX0lPQ1NUQVRVU19UQVJHRVRfRkNfIGRlZmluZXMuCisgKiAgMDItMjctMDEgIDAxLjAxLjA2ICBSZW1vdmVkIE1QSV9IT1NUX0lOREVYX1JFR0lTVEVSIGRlZmluZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGZ1bmN0aW9uIGNvZGVzIGZvciBSQUlELgorICogIDA0LTA5LTAxICAwMS4wMS4wNyAgQWRkZWQgYWx0ZXJuYXRlIGRlZmluZSBmb3IgTVBJX0RPT1JCRUxMX0FDVElWRSwKKyAqICAgICAgICAgICAgICAgICAgICAgIE1QSV9ET09SQkVMTF9VU0VELCB0byBiZXR0ZXIgbWF0Y2ggdGhlIHNwZWMuCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbXBpX2lvYy5oCisgKiAgMDUtMDgtMDAgIDAwLjEwLjAxICBPcmlnaW5hbCByZWxlYXNlIGZvciAwLjEwIHNwZWMgZGF0ZWQgNC8yNi8yMDAwLgorICogIDA1LTI0LTAwICAwMC4xMC4wMiAgQWRkZWQgX01TR19JT0NfSU5JVF9SRVBMWSBzdHJ1Y3R1cmUuCisgKiAgMDYtMDYtMDAgIDAxLjAwLjAxICBBZGRlZCBDdXJSZXBseUZyYW1lU2l6ZSBmaWVsZCB0byBfTVNHX0lPQ19GQUNUU19SRVBMWS4KKyAqICAwNi0xMi0wMCAgMDEuMDAuMDIgIEFkZGVkIF9NU0dfUE9SVF9FTkFCTEVfUkVQTFkgc3RydWN0dXJlLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgX01TR19FVkVOVF9BQ0tfUkVQTFkgc3RydWN0dXJlLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgX01TR19GV19ET1dOTE9BRF9SRVBMWSBzdHJ1Y3R1cmUuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBfTVNHX1RPT0xCT1hfUkVQTFkgc3RydWN0dXJlLgorICogIDA2LTMwLTAwICAwMS4wMC4wMyAgQWRkZWQgTWF4TGFuQnVja2V0cyB0byBfUE9SVF9GQUNUX1JFUExZIHN0cnVjdHVyZS4KKyAqICAwNy0yNy0wMCAgMDEuMDAuMDQgIEFkZGVkIF9FVkVOVF9EQVRBIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBmb3IgX1NDU0ksCisgKiAgICAgICAgICAgICAgICAgICAgICBfTElOS19TVEFUVVMsIF9MT09QX1NUQVRFIGFuZCBfTE9HT1VULgorICogIDA4LTExLTAwICAwMS4wMC4wNSAgU3dpdGNoZWQgcG9zaXRpb25zIG9mIE1zZ0xlbmd0aCBhbmQgRnVuY3Rpb24gZmllbGRzIGluCisgKiAgICAgICAgICAgICAgICAgICAgICBfTVNHX0VWRU5UX0FDS19SRVBMWSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggc3BlY2lmaWNhdGlvbi4KKyAqICAxMS0wMi0wMCAgMDEuMDEuMDEgIE9yaWdpbmFsIHJlbGVhc2UgZm9yIHBvc3QgMS4wIHdvcmsKKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGEgdmFsdWUgZm9yIE1hbnVmYWN0dXJlciB0byBXaG9Jbml0CisgKiAgMTItMDQtMDAgIDAxLjAxLjAyICBNb2RpZmllZCBJT0NGYWN0cyByZXBseSwgYWRkZWQgRldVcGxvYWQgbWVzc2FnZXMsIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCB0b29sYm94IG1lc3NhZ2UuCisgKiAgMDEtMDktMDEgIDAxLjAxLjAzICBBZGRlZCBldmVudCBlbmFibGVkIGFuZCBkaXNhYmxlZCBkZWZpbmVzLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgc3RydWN0dXJlcyBmb3IgRndIZWFkZXIgYW5kIERhdGFIZWFkZXIuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBJbWFnZVR5cGUgdG8gRndVcGxvYWQgcmVwbHkuCisgKiAgMDItMjAtMDEgIDAxLjAxLjA0ICBTdGFydGVkIHVzaW5nIE1QSV9QT0lOVEVSLgorICogIDAyLTI3LTAxICAwMS4wMS4wNSAgQWRkZWQgZXZlbnQgZm9yIFJBSUQgc3RhdHVzIGNoYW5nZSBhbmQgaXRzIGV2ZW50IGRhdGEuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBJb2NOdW1iZXIgZmllbGQgdG8gTVNHX0lPQ19GQUNUU19SRVBMWS4KKyAqICAwMy0yNy0wMSAgMDEuMDEuMDYgIEFkZGVkIGRlZmluZXMgZm9yIFByb2R1Y3RJZCBmaWVsZCBvZiBNUElfRldfSEVBREVSLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgc3RydWN0dXJlIG9mZnNldCBjb21tZW50cy4KKyAqICAwNC0wOS0wMSAgMDEuMDEuMDcgIEFkZGVkIHN0cnVjdHVyZSBFVkVOVF9EQVRBX0VWRU5UX0NIQU5HRS4KKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCittcGlfY25mZy5oCisgKiAgMDUtMDgtMDAgIDAwLjEwLjAxICBPcmlnaW5hbCByZWxlYXNlIGZvciAwLjEwIHNwZWMgZGF0ZWQgNC8yNi8yMDAwLgorICogIDA2LTA2LTAwICAwMS4wMC4wMSAgVXBkYXRlIHZlcnNpb24gbnVtYmVyIGZvciAxLjAgcmVsZWFzZS4KKyAqICAwNi0wOC0wMCAgMDEuMDAuMDIgIEFkZGVkIF9QQUdFVkVSU0lPTiBkZWZpbml0aW9ucyBmb3IgYWxsIHBhZ2VzLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgRmNQaExvd2VzdFZlcnNpb24sIEZjUGhIaWdoZXN0VmVyc2lvbiwgUmVzZXJ2ZWQyCisgKiAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMgdG8gRkNfREVWSUNFXzAgcGFnZSwgdXBkYXRlZCB0aGUgcGFnZSB2ZXJzaW9uLgorICogICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlZCBfRlJFRV9SVU5OSU5HX0NMT0NLIHRvIF9QQUNJTkdfVFJBTlNGRVJTIGluCisgKiAgICAgICAgICAgICAgICAgICAgICBTQ1NJX1BPUlRfMCwgU0NTSV9ERVZJQ0VfMCBhbmQgU0NTSV9ERVZJQ0VfMSBwYWdlcworICogICAgICAgICAgICAgICAgICAgICAgYW5kIHVwZGF0ZWQgdGhlIHBhZ2UgdmVyc2lvbnMuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBfUkVTUE9OU0VfSURfTUFTSyBkZWZpbml0aW9uIHRvIFNDU0lfUE9SVF8xCisgKiAgICAgICAgICAgICAgICAgICAgICBwYWdlIGFuZCB1cGRhdGVkIHRoZSBwYWdlIHZlcnNpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBJbmZvcm1hdGlvbiBmaWVsZCBhbmQgX0lORk9fUEFSQU1TX05FR09USUFURUQKKyAqICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb250byBTQ1NJX0RFVklDRV8wIHBhZ2UuCisgKiAgMDYtMjItMDAgIDAxLjAwLjAzICBSZW1vdmVkIGJhdGNoIGNvbnRyb2xzIGZyb20gTEFOXzAgcGFnZSBhbmQgdXBkYXRlZCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgdmVyc2lvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIEJ1Y2tldHNSZW1haW5pbmcgdG8gTEFOXzEgcGFnZSwgcmVkZWZpbmVkIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgc3RhdGUgdmFsdWVzLCBhbmQgdXBkYXRlZCB0aGUgcGFnZSB2ZXJzaW9uLgorICogICAgICAgICAgICAgICAgICAgICAgUmV2aXNlZCBidXMgd2lkdGggZGVmaW5pdGlvbnMgaW4gU0NTSV9QT1JUXzAsCisgKiAgICAgICAgICAgICAgICAgICAgICBTQ1NJX0RFVklDRV8wIGFuZCBTQ1NJX0RFVklDRV8xIHBhZ2VzLgorICogIDA2LTMwLTAwICAwMS4wMC4wNCAgQWRkZWQgTWF4UmVwbHlTaXplIHRvIExBTl8xIHBhZ2UgYW5kIHVwZGF0ZWQgdGhlIHBhZ2UKKyAqICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICBNb3ZlZCBGQ19ERVZJQ0VfMCBQYWdlQWRkcmVzcyBkZXNjcmlwdGlvbiB0byBzcGVjLgorICogIDA3LTI3LTAwICAwMS4wMC4wNSAgQ29ycmVjdGVkIHRoZSBTdWJzeXN0ZW1WZW5kb3JJRCBhbmQgU3Vic3lzdGVtSUQgZmllbGQKKyAqICAgICAgICAgICAgICAgICAgICAgIHdpZHRocyBpbiBJT0NfMCBwYWdlIGFuZCB1cGRhdGVkIHRoZSBwYWdlIHZlcnNpb24uCisgKiAgMTEtMDItMDAgIDAxLjAxLjAxICBPcmlnaW5hbCByZWxlYXNlIGZvciBwb3N0IDEuMCB3b3JrCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNYW51ZmFjdHVyaW5nIHBhZ2VzLCBJTyBVbml0IFBhZ2UgMiwgU0NTSSBTUEkKKyAqICAgICAgICAgICAgICAgICAgICAgIFBvcnQgUGFnZSAyLCBGQyBQb3J0IFBhZ2UgNCwgRkMgUG9ydCBQYWdlIDUKKyAqICAxMi0wNC0wMCAgMDEuMDEuMDMgIENvbmZpZyBwYWdlIGNoYW5nZXMgdG8gbWF0Y2ggTVBJIHJldiAxLjAwLjAxLgorICogIDEyLTA1LTAwICAwMS4wMS4wNCAgTW9kaWZpZWQgY29uZmlnIHBhZ2UgYWN0aW9ucy4KKyAqICAwMS0wOS0wMSAgMDEuMDEuMDUgIEFkZGVkIGRlZmluZXMgZm9yIHBhZ2UgYWRkcmVzcyBmb3JtYXRzLgorICogICAgICAgICAgICAgICAgICAgICAgRGF0YSBzaXplIGZvciBNYW51ZmFjdHVyaW5nIHBhZ2VzIDIgYW5kIDMgbm8gbG9uZ2VyCisgKiAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGhlcmUuCisgKiAgICAgICAgICAgICAgICAgICAgICBJbyBVbml0IFBhZ2UgMiBzaXplIGlzIGZpeGVkIGF0IDQgYWRhcHRlcnMgYW5kIHNvbWUKKyAqICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHdlcmUgY2hhbmdlZC4KKyAqICAgICAgICAgICAgICAgICAgICAgIFNDU0kgUG9ydCBQYWdlIDIgRGV2aWNlIFNldHRpbmdzIG1vZGlmaWVkLgorICogICAgICAgICAgICAgICAgICAgICAgTmV3IGZpZWxkcyBhZGRlZCB0byBGQyBQb3J0IFBhZ2UgMCBhbmQgc29tZSBmbGFncworICogICAgICAgICAgICAgICAgICAgICAgY2xlYW5lZCB1cC4KKyAqICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQgaW1wZWRhbmNlIGZsYXNoIGZyb20gRkMgUG9ydCBQYWdlIDEuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBGQyBQb3J0IHBhZ2VzIDYgYW5kIDcuCisgKiAgMDEtMjUtMDEgIDAxLjAxLjA2ICBBZGRlZCBNYXhJbml0aWF0b3JzIGZpZWxkIHRvIEZjUG9ydFBhZ2UwLgorICogIDAxLTI5LTAxICAwMS4wMS4wNyAgQ2hhbmdlZCBzb21lIGRlZmluZXMgdG8gbWFrZSB0aGVtIDMyIGNoYXJhY3RlciB1bmlxdWUuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBzb21lIExpbmtUeXBlIGRlZmluZXMgZm9yIEZjUG9ydFBhZ2UwLgorICogIDAyLTIwLTAxICAwMS4wMS4wOCAgU3RhcnRlZCB1c2luZyBNUElfUE9JTlRFUi4KKyAqICAwMi0yNy0wMSAgMDEuMDEuMDkgIFJlcGxhY2VkIE1QSV9DT05GSUdfUEFHRVRZUEVfU0NTSV9MVU4gd2l0aAorICogICAgICAgICAgICAgICAgICAgICAgTVBJX0NPTkZJR19QQUdFVFlQRV9SQUlEX1ZPTFVNRS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGRlZmluaXRpb25zIGFuZCBzdHJ1Y3R1cmVzIGZvciBJT0MgUGFnZSAyIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgUkFJRCBWb2x1bWUgUGFnZSAyLgorICogIDAzLTI3LTAxICAwMS4wMS4xMCAgQWRkZWQgQ09ORklHX1BBR0VfRkNfUE9SVF84IGFuZCBDT05GSUdfUEFHRV9GQ19QT1JUXzkuCisgKiAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfUEFHRV9GQ19QT1JUXzMgbm93IHN1cHBvcnRzIHBlcnNpc3RlbnQgYnkgRElELgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgVmVuZG9ySWQgYW5kIFByb2R1Y3RSZXZMZXZlbCBmaWVsZHMgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgIFJBSURWT0wyX0lNX1BIWVNfSUQgc3RydWN0LgorICogICAgICAgICAgICAgICAgICAgICAgTW9kaWZpZWQgdmFsdWVzIGZvciBNUElfRkNQT1JUUEFHRTBfRkxBR1NfQVRUQUNIXworICogICAgICAgICAgICAgICAgICAgICAgZGVmaW5lcyB0byBtYWtlIHRoZW0gY29tcGF0aWJsZSB0byBNUEkgdmVyc2lvbiAxLjAuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBzdHJ1Y3R1cmUgb2Zmc2V0IGNvbW1lbnRzLgorICogIDA0LTA5LTAxICAwMS4wMS4xMSAgQWRkZWQgc29tZSBuZXcgZGVmaW5lcyBmb3IgdGhlIFBhZ2VBZGRyZXNzIGZpZWxkIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCBzb21lIG9ic29sZXRlIG9uZXMuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBJTyBVbml0IFBhZ2UgMy4KKyAqICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWVkIGRlZmluZXMgZm9yIFNjc2kgUG9ydCBQYWdlIDIuCisgKiAgICAgICAgICAgICAgICAgICAgICBNb2RpZmllZCBSQUlEIFZvbHVtZSBQYWdlcy4KKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCittcGlfaW5pdC5oCisgKiAgMDUtMDgtMDAgIDAwLjEwLjAxICBPcmlnaW5hbCByZWxlYXNlIGZvciAwLjEwIHNwZWMgZGF0ZWQgNC8yNi8yMDAwLgorICogIDA1LTI0LTAwICAwMC4xMC4wMiAgQWRkZWQgU2Vuc2VCdWZmZXJMZW5ndGggdG8gX01TR19TQ1NJX0lPX1JFUExZLgorICogIDA2LTA2LTAwICAwMS4wMC4wMSAgVXBkYXRlIHZlcnNpb24gbnVtYmVyIGZvciAxLjAgcmVsZWFzZS4KKyAqICAwNi0wOC0wMCAgMDEuMDAuMDIgIEFkZGVkIE1QSV9TQ1NJX1JTUF9JTkZPXyBkZWZpbml0aW9ucy4KKyAqICAxMS0wMi0wMCAgMDEuMDEuMDEgIE9yaWdpbmFsIHJlbGVhc2UgZm9yIHBvc3QgMS4wIHdvcmsKKyAqICAxMi0wNC0wMCAgMDEuMDEuMDIgIEFkZGVkIE1QSV9TQ1NJSU9fQ09OVFJPTF9OT19ESVNDT05ORUNULgorICogIDAyLTIwLTAxICAwMS4wMS4wMyAgU3RhcnRlZCB1c2luZyBNUElfUE9JTlRFUi4KKyAqICAwMy0yNy0wMSAgMDEuMDEuMDQgIEFkZGVkIHN0cnVjdHVyZSBvZmZzZXQgY29tbWVudHMuCisgKiAgMDQtMTAtMDEgIDAxLjAxLjA1ICBBZGRlZCBuZXcgTXNnRmxhZyBmb3IgTVNHX1NDU0lfVEFTS19NR01ULgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK21waV90YXJnLmgKKyAqICAwNS0wOC0wMCAgMDAuMTAuMDEgIE9yaWdpbmFsIHJlbGVhc2UgZm9yIDAuMTAgc3BlYyBkYXRlZCA0LzI2LzIwMDAuCisgKiAgMDYtMDYtMDAgIDAxLjAwLjAxICBVcGRhdGUgdmVyc2lvbiBudW1iZXIgZm9yIDEuMCByZWxlYXNlLgorICogIDA2LTIyLTAwICAwMS4wMC4wMiAgQWRkZWQgX01TR19UQVJHRVRfQ01EX0JVRkZFUl9QT1NUX1JFUExZIHN0cnVjdHVyZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIENvcnJlY3RlZCBERUNTUklQVE9SIHR5cG8gdG8gREVTQ1JJUFRPUi4KKyAqICAxMS0wMi0wMCAgMDEuMDEuMDEgIE9yaWdpbmFsIHJlbGVhc2UgZm9yIHBvc3QgMS4wIHdvcmsKKyAqICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWVkIHRhcmdldCBtb2RlIHRvIHVzZSBJb0luZGV4IGluc3RlYWQgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgIEhvc3RJbmRleCBhbmQgSW9jSW5kZXguIEFkZGVkIEFsaWFzLgorICogIDAxLTA5LTAxICAwMS4wMS4wMiAgQWRkZWQgZGVmaW5lcyBmb3IgVEFSR0VUX0FTU0lTVF9GTEFHU19SRVBPU1RfQ01EX0JVRkZFUgorICogICAgICAgICAgICAgICAgICAgICAgYW5kIFRBUkdFVF9TVEFUVVNfU0VORF9GTEFHU19SRVBPU1RfQ01EX0JVRkZFUi4KKyAqICAwMi0yMC0wMSAgMDEuMDEuMDMgIFN0YXJ0ZWQgdXNpbmcgTVBJX1BPSU5URVIuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBzdHJ1Y3R1cmVzIGZvciBNUElfVEFSR0VUX1NDU0lfU1BJX0NNRF9CVUZGRVIgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICBNUElfVEFSR0VUX0ZDUF9DTURfQlVGRkVSLgorICogIDAzLTI3LTAxICAwMS4wMS4wNCAgQWRkZWQgc3RydWN0dXJlIG9mZnNldCBjb21tZW50cy4KKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCittcGlfZmMuaAorICogIDA1LTA4LTAwICAwMC4xMC4wMSAgT3JpZ2luYWwgcmVsZWFzZSBmb3IgMC4xMCBzcGVjIGRhdGVkIDQvMjYvMjAwMC4KKyAqICAwNi0wNi0wMCAgMDEuMDAuMDEgIFVwZGF0ZSB2ZXJzaW9uIG51bWJlciBmb3IgMS4wIHJlbGVhc2UuCisgKiAgMDYtMTItMDAgIDAxLjAwLjAyICBBZGRlZCBfTVNHX0ZDX0FCT1JUX1JFUExZIHN0cnVjdHVyZS4KKyAqICAxMS0wMi0wMCAgMDEuMDEuMDEgIE9yaWdpbmFsIHJlbGVhc2UgZm9yIHBvc3QgMS4wIHdvcmsKKyAqICAxMi0wNC0wMCAgMDEuMDEuMDIgIEFkZGVkIG1lc3NhZ2VzIGZvciBDb21tb24gVHJhbnNwb3J0IFNlbmQgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICBQcmltaXRpdmUgU2VuZC4KKyAqICAwMS0wOS0wMSAgMDEuMDEuMDMgIE1vZGlmZWQgc29tZSBvZiB0aGUgbmV3IGZsYWdzIHRvIGhhdmUgYW4gTVBJIHByZWZpeAorICogICAgICAgICAgICAgICAgICAgICAgYW5kIG1vZGlmaWVkIHRoZSBGY1ByaW1pdGl2ZVNlbmQgZmxhZ3MuCisgKiAgMDEtMjUtMDEgIDAxLjAxLjA0ICBNb3ZlIEluaXRpYXRvckluZGV4IGluIExpbmtTZXJ2aWNlUnNwIHJlcGx5IHRvIGEgbGFyZ2VyCisgKiAgICAgICAgICAgICAgICAgICAgICBmaWVsZC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIEZDX0FCT1JUX1RZUEVfQ1RfU0VORF9SRVFVRVNUIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgRkNfQUJPUlRfVFlQRV9FWExJTktTRU5EX1JFUVVFU1QgZm9yIEZjQWJvcnQgcmVxdWVzdC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSV9GQ19QUklNX1NFTkRfRkxBR1NfU1RPUF9TRU5ELgorICogIDAyLTIwLTAxICAwMS4wMS4wNSAgU3RhcnRlZCB1c2luZyBNUElfUE9JTlRFUi4KKyAqICAwMy0yNy0wMSAgMDEuMDEuMDYgIEFkZGVkIEZsYWdzIGZpZWxkIHRvIE1TR19MSU5LX1NFUlZJQ0VfQlVGRkVSX1BPU1RfUkVQTFkKKyAqICAgICAgICAgICAgICAgICAgICAgIGFuZCBkZWZpbmVkIE1QSV9MU19CVUZfUE9TVF9SRVBMWV9GTEFHX05PX1JTUF9ORUVERUQuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBNUElfRkNfUFJJTV9TRU5EX0ZMQUdTX1JFU0VUX0xJTksgZGVmaW5lLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgc3RydWN0dXJlIG9mZnNldCBjb21tZW50cy4KKyAqICAwNC0wOS0wMSAgMDEuMDEuMDcgIEFkZGVkIFJzcExlbmd0aCBmaWVsZCB0byBNU0dfTElOS19TRVJWSUNFX1JTUF9SRVFVRVNULgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK21waV9sYW4uaAorICogIDA1LTA4LTAwICAwMC4xMC4wMSAgT3JpZ2luYWwgcmVsZWFzZSBmb3IgMC4xMCBzcGVjIGRhdGVkIDQvMjYvMjAwMC4KKyAqICAwNS0yNC0wMCAgMDAuMTAuMDIgIEFkZGVkIExBTlN0YXR1cyBmaWVsZCB0byBfTVNHX0xBTl9TRU5EX1JFUExZLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTEFOU3RhdHVzIGZpZWxkIHRvIF9NU0dfTEFOX1JFQ0VJVkVfUE9TVF9SRVBMWS4KKyAqICAgICAgICAgICAgICAgICAgICAgIE1vdmVkIExpc3RDb3VudCBmaWVsZCBpbiBfTVNHX0xBTl9SRUNFSVZFX1BPU1RfUkVQTFkuCisgKiAgMDYtMDYtMDAgIDAxLjAwLjAxICBVcGRhdGUgdmVyc2lvbiBudW1iZXIgZm9yIDEuMCByZWxlYXNlLgorICogIDA2LTEyLTAwICAwMS4wMC4wMiAgQWRkZWQgTVBJXyB0byBCVUNLRVRTVEFUVVNfIGRlZmluaXRpb25zLgorICogIDA2LTIyLTAwICAwMS4wMC4wMyAgTWFqb3IgY2hhbmdlcyB0byBtYXRjaCBuZXcgTEFOIGRlZmluaXRpb24gaW4gMS4wIHNwZWMuCisgKiAgMDYtMzAtMDAgIDAxLjAwLjA0ICBBZGRlZCBDb250ZXh0IFJlcGx5IGRlZmluaXRpb25zIHBlciByZXZpc2VkIHByb3Bvc2FsLgorICogICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlZCB0cmFuc2FjdGlvbiBjb250ZXh0IHVzYWdlIHRvIGJ1Y2tldC9idWZmZXIuCisgKiAgMDctMDUtMDAgIDAxLjAwLjA1ICBSZW1vdmVkIExBTl9SRUNFSVZFX1BPU1RfQlVDS0VUX0NPTlRFWFRfTUFTSyBkZWZpbml0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICB0byBsYW4gcHJpdmF0ZSBoZWFkZXIgZmlsZQorICogIDExLTAyLTAwICAwMS4wMS4wMSAgT3JpZ2luYWwgcmVsZWFzZSBmb3IgcG9zdCAxLjAgd29yaworICogIDAyLTIwLTAxICAwMS4wMS4wMiAgU3RhcnRlZCB1c2luZyBNUElfUE9JTlRFUi4KKyAqICAwMy0yNy0wMSAgMDEuMDEuMDMgIEFkZGVkIHN0cnVjdHVyZSBvZmZzZXQgY29tbWVudHMuCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbXBpX3JhaWQuaAorICogIDAyLTI3LTAxICAwMS4wMS4wMSAgT3JpZ2luYWwgcmVsZWFzZSBmb3IgdGhpcyBmaWxlLgorICogIDAzLTI3LTAxICAwMS4wMS4wMiAgQWRkZWQgc3RydWN0dXJlIG9mZnNldCBjb21tZW50cy4KKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCittcGlfdHlwZS5oCisgKiAgMDUtMDgtMDAgIDAwLjEwLjAxICBPcmlnaW5hbCByZWxlYXNlIGZvciAwLjEwIHNwZWMgZGF0ZWQgNC8yNi8yMDAwLgorICogIDA2LTA2LTAwICAwMS4wMC4wMSAgVXBkYXRlIHZlcnNpb24gbnVtYmVyIGZvciAxLjAgcmVsZWFzZS4KKyAqICAxMS0wMi0wMCAgMDEuMDEuMDEgIE9yaWdpbmFsIHJlbGVhc2UgZm9yIHBvc3QgMS4wIHdvcmsKKyAqICAwMi0yMC0wMSAgMDEuMDEuMDIgIEFkZGVkIGRlZmluZSBhbmQgaWZkZWYgZm9yIE1QSV9QT0lOVEVSLgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK21waV9oaXN0b3J5LnR4dCAgICAgICAgIFBhcnRzIGxpc3QgaGlzdG9yeQorCitGaWxlbmFtZSAgICAwMS4wMS4xMAorLS0tLS0tLS0tLSAgLS0tLS0tLS0KK21waS5oICAgICAgIDAxLjAxLjA3CittcGlfaW9jLmggICAwMS4wMS4wNworbXBpX2NuZmcuaCAgMDEuMDEuMTEKK21waV9pbml0LmggIDAxLjAxLjA1CittcGlfdGFyZy5oICAwMS4wMS4wNAorbXBpX2ZjLmggICAgMDEuMDEuMDcKK21waV9sYW4uaCAgIDAxLjAxLjAzCittcGlfcmFpZC5oICAwMS4wMS4wMgorbXBpX3R5cGUuaCAgMDEuMDEuMDIKKworRmlsZW5hbWUgICAgMDEuMDEuMDkgICAwMS4wMS4wOCAgIDAxLjAxLjA3ICAgMDEuMDEuMDYgICAwMS4wMS4wNSAgIDAxLjAxLjA0CistLS0tLS0tLS0tICAtLS0tLS0tLSAgIC0tLS0tLS0tICAgLS0tLS0tLS0gICAtLS0tLS0tLSAgIC0tLS0tLS0tICAgLS0tLS0tLS0KK21waS5oICAgICAgIDAxLjAxLjA2ICAgMDEuMDEuMDYgICAwMS4wMS4wNSAgIDAxLjAxLjA0ICAgMDEuMDEuMDQgICAwMS4wMS4wMworbXBpX2lvYy5oICAgMDEuMDEuMDYgICAwMS4wMS4wNSAgIDAxLjAxLjA0ICAgMDEuMDEuMDMgICAwMS4wMS4wMyAgIDAxLjAxLjAzCittcGlfY25mZy5oICAwMS4wMS4xMCAgIDAxLjAxLjA5ICAgMDEuMDEuMDggICAwMS4wMS4wNyAgIDAxLjAxLjA2ICAgMDEuMDEuMDUKK21waV9pbml0LmggIDAxLjAxLjA0ICAgMDEuMDEuMDMgICAwMS4wMS4wMyAgIDAxLjAxLjAyICAgMDEuMDEuMDIgICAwMS4wMS4wMgorbXBpX3RhcmcuaCAgMDEuMDEuMDQgICAwMS4wMS4wMyAgIDAxLjAxLjAzICAgMDEuMDEuMDIgICAwMS4wMS4wMiAgIDAxLjAxLjAyCittcGlfZmMuaCAgICAwMS4wMS4wNiAgIDAxLjAxLjA1ICAgMDEuMDEuMDUgICAwMS4wMS4wNCAgIDAxLjAxLjA0ICAgMDEuMDEuMDMKK21waV9sYW4uaCAgIDAxLjAxLjAzICAgMDEuMDEuMDIgICAwMS4wMS4wMiAgIDAxLjAxLjAxICAgMDEuMDEuMDEgICAwMS4wMS4wMQorbXBpX3JhaWQuaCAgMDEuMDEuMDIgICAwMS4wMS4wMQorbXBpX3R5cGUuaCAgMDEuMDEuMDIgICAwMS4wMS4wMiAgIDAxLjAxLjAyICAgMDEuMDEuMDEgICAwMS4wMS4wMSAgIDAxLjAxLjAxCisKK0ZpbGVuYW1lICAgIDAxLjAxLjAzICAgMDEuMDEuMDIgICAwMS4wMS4wMSAgIDAxLjAwLjA3ICAgMDEuMDAuMDYgICAwMS4wMC4wNQorLS0tLS0tLS0tLSAgLS0tLS0tLS0gICAtLS0tLS0tLSAgIC0tLS0tLS0tICAgLS0tLS0tLS0gICAtLS0tLS0tLSAgIC0tLS0tLS0tCittcGkuaCAgICAgICAwMS4wMS4wMiAgIDAxLjAxLjAyICAgMDEuMDEuMDEgICAwMS4wMC4wNCAgIDAxLjAwLjA0ICAgMDEuMDAuMDMKK21waV9pb2MuaCAgIDAxLjAxLjAyICAgMDEuMDEuMDIgICAwMS4wMS4wMSAgIDAxLjAwLjA1ICAgMDEuMDAuMDQgICAwMS4wMC4wMworbXBpX2NuZmcuaCAgMDEuMDEuMDQgICAwMS4wMS4wMyAgIDAxLjAxLjAxICAgMDEuMDAuMDUgICAwMS4wMC4wNSAgIDAxLjAwLjA0CittcGlfaW5pdC5oICAwMS4wMS4wMiAgIDAxLjAxLjAyICAgMDEuMDEuMDEgICAwMS4wMC4wMiAgIDAxLjAwLjAyICAgMDEuMDAuMDIKK21waV90YXJnLmggIDAxLjAxLjAxICAgMDEuMDEuMDEgICAwMS4wMS4wMSAgIDAxLjAwLjAyICAgMDEuMDAuMDIgICAwMS4wMC4wMgorbXBpX2ZjLmggICAgMDEuMDEuMDIgICAwMS4wMS4wMiAgIDAxLjAxLjAxICAgMDEuMDAuMDIgICAwMS4wMC4wMiAgIDAxLjAwLjAyCittcGlfbGFuLmggICAwMS4wMS4wMSAgIDAxLjAxLjAxICAgMDEuMDEuMDEgICAwMS4wMC4wNSAgIDAxLjAwLjA1ICAgMDEuMDAuMDUKK21waV90eXBlLmggIDAxLjAxLjAxICAgMDEuMDEuMDEgICAwMS4wMS4wMSAgIDAxLjAwLjAxICAgMDEuMDAuMDEgICAwMS4wMC4wMQorCitGaWxlbmFtZSAgICAgMDEuMDAuMDQgICAwMS4wMC4wMyAgIDAxLjAwLjAyICAgMDEuMDAuMDEgICAwMC4xMC4wMiAgIDAwLjEwLjAxCistLS0tLS0tLS0tICAgLS0tLS0tLS0gICAtLS0tLS0tLSAgIC0tLS0tLS0tICAgLS0tLS0tLS0gICAtLS0tLS0tLSAgIC0tLS0tLS0tCittcGkuaCAgICAgICAgMDEuMDAuMDIgICAwMS4wMC4wMSAgIDAxLjAwLjAxICAgMDEuMDAuMDEgICAwMC4xMC4wMiAgIDAwLjEwLjAxCittcGlfaW9jLmggICAgMDEuMDAuMDIgICAwMS4wMC4wMiAgIDAxLjAwLjAxICAgMDEuMDAuMDEgICAwMC4xMC4wMiAgIDAwLjEwLjAxCittcGlfY25mZy5oICAgMDEuMDAuMDMgICAwMS4wMC4wMiAgIDAxLjAwLjAyICAgMDEuMDAuMDEgICAwMC4xMC4wMSAgIDAwLjEwLjAxCittcGlfaW5pdC5oICAgMDEuMDAuMDIgICAwMS4wMC4wMiAgIDAxLjAwLjAyICAgMDEuMDAuMDEgICAwMC4xMC4wMiAgIDAwLjEwLjAxCittcGlfdGFyZy5oICAgMDEuMDAuMDIgICAwMS4wMC4wMSAgIDAxLjAwLjAxICAgMDEuMDAuMDEgICAwMC4xMC4wMSAgIDAwLjEwLjAxCittcGlfZmMuaCAgICAgMDEuMDAuMDIgICAwMS4wMC4wMiAgIDAxLjAwLjAxICAgMDEuMDAuMDEgICAwMC4xMC4wMSAgIDAwLjEwLjAxCittcGlfbGFuLmggICAgMDEuMDAuMDMgICAwMS4wMC4wMiAgIDAxLjAwLjAxICAgMDEuMDAuMDEgICAwMC4xMC4wMiAgIDAwLjEwLjAxCittcGlfdHlwZS5oICAgMDEuMDAuMDEgICAwMS4wMC4wMSAgIDAxLjAwLjAxICAgMDEuMDAuMDEgICAwMC4xMC4wMSAgIDAwLjEwLjAxCisKKworICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9pbmIuaCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9pbmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWUyOWZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2luYi5oCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAwMyBMU0kgTG9naWMgQ29ycG9yYXRpb24uCisgKgorICoKKyAqICAgICAgICAgICBOYW1lOiAgbXBpX2luYi5oCisgKiAgICAgICAgICBUaXRsZTogIE1QSSBJbmJhbmQgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMKKyAqICBDcmVhdGlvbiBEYXRlOiAgU2VwdGVtYmVyIDMwLCAyMDAzCisgKgorICogICAgbXBpX2luYi5oIFZlcnNpb246ICAwMS4wMy54eAorICoKKyAqICBWZXJzaW9uIEhpc3RvcnkKKyAqICAtLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgRGF0ZSAgICAgIFZlcnNpb24gICBEZXNjcmlwdGlvbgorICogIC0tLS0tLS0tICAtLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgPz8tPz8tPz8gIDAxLjAzLjAxICBPcmlnaW5hbCByZWxlYXNlLgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBNUElfSU5CX0gKKyNkZWZpbmUgTVBJX0lOQl9ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgIEkgbiBiIGEgbiBkICAgIE0gZSBzIHMgYSBnIGUgcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEluYmFuZCBCdWZmZXIgUG9zdCBSZXF1ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfSU5CQU5EX0JVRkZFUl9QT1NUX1JFUVVFU1QKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckNvdW50OyAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ2hhaW5PZmZzZXQ7ICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgIC8qIDAzaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgLyogMDhoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ0OyAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBTR0VfVFJBTlNfU0lNUExFX1VOSU9OICBTR0w7ICAgICAgICAgICAgICAgIC8qIDEwaCAqLworfSBNU0dfSU5CQU5EX0JVRkZFUl9QT1NUX1JFUVVFU1QsIE1QSV9QT0lOVEVSIFBUUl9NU0dfSU5CQU5EX0JVRkZFUl9QT1NUX1JFUVVFU1QsCisgIE1waUluYmFuZEJ1ZmZlclBvc3RSZXF1ZXN0X3QgLCBNUElfUE9JTlRFUiBwTXBpSW5iYW5kQnVmZmVyUG9zdFJlcXVlc3RfdDsKKworCit0eXBlZGVmIHN0cnVjdCBfV1dOX0ZDX0ZPUk1BVAoreworICAgIFU2NCAgICAgICAgICAgICAgICAgICAgIE5vZGVOYW1lOyAgICAgICAgICAgLyogMDBoICovCisgICAgVTY0ICAgICAgICAgICAgICAgICAgICAgUG9ydE5hbWU7ICAgICAgICAgICAvKiAwOGggKi8KK30gV1dOX0ZDX0ZPUk1BVCwgTVBJX1BPSU5URVIgUFRSX1dXTl9GQ19GT1JNQVQsCisgIFd3bkZjRm9ybWF0X3QsIE1QSV9QT0lOVEVSIHBXd25GY0Zvcm1hdF90OworCit0eXBlZGVmIHN0cnVjdCBfV1dOX1NBU19GT1JNQVQKK3sKKyAgICBVNjQgICAgICAgICAgICAgICAgICAgICBXb3JsZFdpZGVJRDsgICAgICAgIC8qIDAwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgLyogMDhoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAvKiAwQ2ggKi8KK30gV1dOX1NBU19GT1JNQVQsIE1QSV9QT0lOVEVSIFBUUl9XV05fU0FTX0ZPUk1BVCwKKyAgV3duU2FzRm9ybWF0X3QsIE1QSV9QT0lOVEVSIHBXd25TYXNGb3JtYXRfdDsKKwordHlwZWRlZiB1bmlvbiBfV1dOX0lOQkFORF9GT1JNQVQKK3sKKyAgICBXV05fRkNfRk9STUFUICAgICAgICAgICBGYzsKKyAgICBXV05fU0FTX0ZPUk1BVCAgICAgICAgICBTYXM7Cit9IFdXTl9JTkJBTkRfRk9STUFULCBNUElfUE9JTlRFUiBQVFJfV1dOX0lOQkFORF9GT1JNQVQsCisgIFd3bkluYmFuZEZvcm1hdCwgTVBJX1BPSU5URVIgcFd3bkluYmFuZEZvcm1hdDsKKworCisvKiBJbmJhbmQgQnVmZmVyIFBvc3QgcmVwbHkgbWVzc2FnZSAqLworCit0eXBlZGVmIHN0cnVjdCBfTVNHX0lOQkFORF9CVUZGRVJfUE9TVF9SRVBMWQoreworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnTGVuZ3RoOyAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgIC8qIDAzaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgLyogMDhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ0OyAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBJT0NTdGF0dXM7ICAgICAgICAgIC8qIDBFaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIElPQ0xvZ0luZm87ICAgICAgICAgLyogMTBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgVHJhbnNmZXJMZW5ndGg7ICAgICAvKiAxNGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbkNvbnRleHQ7IC8qIDE4aCAqLworICAgIFdXTl9JTkJBTkRfRk9STUFUICAgICAgIFd3bjsgICAgICAgICAgICAgICAgLyogMUNoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgSU9DSWRlbnRpZmllcls0XTsgICAvKiAyQ2ggKi8KK30gTVNHX0lOQkFORF9CVUZGRVJfUE9TVF9SRVBMWSwgTVBJX1BPSU5URVIgUFRSX01TR19JTkJBTkRfQlVGRkVSX1BPU1RfUkVQTFksCisgIE1waUluYmFuZEJ1ZmZlclBvc3RSZXBseV90LCBNUElfUE9JTlRFUiBwTXBpSW5iYW5kQnVmZmVyUG9zdFJlcGx5X3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbmJhbmQgU2VuZCBSZXF1ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfTVNHX0lOQkFORF9TRU5EX1JFUVVFU1QKK3sKKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENoYWluT2Zmc2V0OyAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgIC8qIDA4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNDsgICAgICAgICAgLyogMENoICovCisgICAgV1dOX0lOQkFORF9GT1JNQVQgICAgICAgV3duOyAgICAgICAgICAgICAgICAvKiAxMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDU7ICAgICAgICAgIC8qIDIwaCAqLworICAgIFNHRV9JT19VTklPTiAgICAgICAgICAgIFNHTDsgICAgICAgICAgICAgICAgLyogMjRoICovCit9IE1TR19JTkJBTkRfU0VORF9SRVFVRVNULCBNUElfUE9JTlRFUiBQVFJfTVNHX0lOQkFORF9TRU5EX1JFUVVFU1QsCisgIE1waUluYmFuZFNlbmRSZXF1ZXN0X3QgLCBNUElfUE9JTlRFUiBwTXBpSW5iYW5kU2VuZFJlcXVlc3RfdDsKKworCisvKiBJbmJhbmQgU2VuZCByZXBseSBtZXNzYWdlICovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfSU5CQU5EX1NFTkRfUkVQTFkKK3sKKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0xlbmd0aDsgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgIC8qIDA4aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNDsgICAgICAgICAgLyogMENoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSU9DU3RhdHVzOyAgICAgICAgICAvKiAwRWggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBJT0NMb2dJbmZvOyAgICAgICAgIC8qIDEwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlTGVuZ3RoOyAgICAgLyogMTRoICovCit9IE1TR19JTkJBTkRfU0VORF9SRVBMWSwgTVBJX1BPSU5URVIgUFRSX01TR19JTkJBTkRfU0VORF9SRVBMWSwKKyAgTXBpSW5iYW5kU2VuZFJlcGx5X3QsIE1QSV9QT0lOVEVSIHBNcGlJbmJhbmRTZW5kUmVwbHlfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEluYmFuZCBSZXNwb25zZSBSZXF1ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfSU5CQU5EX1JTUF9SRVFVRVNUCit7CisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDaGFpbk9mZnNldDsgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgLyogMDNoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAvKiAwOGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgIC8qIDBDaCAqLworICAgIFdXTl9JTkJBTkRfRk9STUFUICAgICAgIFd3bjsgICAgICAgICAgICAgICAgLyogMTBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgSU9DSWRlbnRpZmllcls0XTsgICAvKiAyMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZUxlbmd0aDsgICAgIC8qIDMwaCAqLworICAgIFNHRV9JT19VTklPTiAgICAgICAgICAgIFNHTDsgICAgICAgICAgICAgICAgLyogMzRoICovCit9IE1TR19JTkJBTkRfUlNQX1JFUVVFU1QsIE1QSV9QT0lOVEVSIFBUUl9NU0dfSU5CQU5EX1JTUF9SRVFVRVNULAorICBNcGlJbmJhbmRSc3BSZXF1ZXN0X3QgLCBNUElfUE9JTlRFUiBwTXBpSW5iYW5kUnNwUmVxdWVzdF90OworCisKKy8qIEluYmFuZCBSZXNwb25zZSByZXBseSBtZXNzYWdlICovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfSU5CQU5EX1JTUF9SRVBMWQoreworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnTGVuZ3RoOyAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgIC8qIDAzaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgLyogMDhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ0OyAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBJT0NTdGF0dXM7ICAgICAgICAgIC8qIDBFaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIElPQ0xvZ0luZm87ICAgICAgICAgLyogMTBoICovCit9IE1TR19JTkJBTkRfUlNQX1JFUExZLCBNUElfUE9JTlRFUiBQVFJfTVNHX0lOQkFORF9SU1BfUkVQTFksCisgIE1waUluYmFuZFJzcFJlcGx5X3QsIE1QSV9QT0lOVEVSIHBNcGlJbmJhbmRSc3BSZXBseV90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW5iYW5kIEFib3J0IFJlcXVlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX01TR19JTkJBTkRfQUJPUlRfUkVRVUVTVAoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQWJvcnRUeXBlOyAgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDaGFpbk9mZnNldDsgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgLyogMDNoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAvKiAwOGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgIC8qIDBDaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIENvbnRleHRUb0Fib3J0OyAgICAgLyogMTBoICovCit9IE1TR19JTkJBTkRfQUJPUlRfUkVRVUVTVCwgTVBJX1BPSU5URVIgUFRSX01TR19JTkJBTkRfQUJPUlRfUkVRVUVTVCwKKyAgTXBpSW5iYW5kQWJvcnRSZXF1ZXN0X3QgLCBNUElfUE9JTlRFUiBwTXBpSW5iYW5kQWJvcnRSZXF1ZXN0X3Q7CisKKyNkZWZpbmUgTVBJX0lOQkFORF9BQk9SVF9UWVBFX0FMTF9CVUZGRVJTICAgICAgICgweDAwKQorI2RlZmluZSBNUElfSU5CQU5EX0FCT1JUX1RZUEVfRVhBQ1RfQlVGRkVSICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSV9JTkJBTkRfQUJPUlRfVFlQRV9TRU5EX1JFUVVFU1QgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJX0lOQkFORF9BQk9SVF9UWVBFX1JFU1BPTlNFX1JFUVVFU1QgICgweDAzKQorCisKKy8qIEluYmFuZCBBYm9ydCByZXBseSBtZXNzYWdlICovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfSU5CQU5EX0FCT1JUX1JFUExZCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBBYm9ydFR5cGU7ICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0xlbmd0aDsgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgIC8qIDA4aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNDsgICAgICAgICAgLyogMENoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSU9DU3RhdHVzOyAgICAgICAgICAvKiAwRWggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBJT0NMb2dJbmZvOyAgICAgICAgIC8qIDEwaCAqLworfSBNU0dfSU5CQU5EX0FCT1JUX1JFUExZLCBNUElfUE9JTlRFUiBQVFJfTVNHX0lOQkFORF9BQk9SVF9SRVBMWSwKKyAgTXBpSW5iYW5kQWJvcnRSZXBseV90LCBNUElfUE9JTlRFUiBwTXBpSW5iYW5kQWJvcnRSZXBseV90OworCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaW5pdC5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2luaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2M5NWZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2luaXQuaApAQCAtMCwwICsxLDM2MiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBMU0kgTG9naWMgQ29ycG9yYXRpb24uCisgKgorICoKKyAqICAgICAgICAgICBOYW1lOiAgbXBpX2luaXQuaAorICogICAgICAgICAgVGl0bGU6ICBNUEkgaW5pdGlhdG9yIG1vZGUgbWVzc2FnZXMgYW5kIHN0cnVjdHVyZXMKKyAqICBDcmVhdGlvbiBEYXRlOiAgSnVuZSA4LCAyMDAwCisgKgorICogICAgbXBpX2luaXQuaCBWZXJzaW9uOiAgMDEuMDUueHgKKyAqCisgKiAgVmVyc2lvbiBIaXN0b3J5CisgKiAgLS0tLS0tLS0tLS0tLS0tCisgKgorICogIERhdGUgICAgICBWZXJzaW9uICAgRGVzY3JpcHRpb24KKyAqICAtLS0tLS0tLSAgLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIDA1LTA4LTAwICAwMC4xMC4wMSAgT3JpZ2luYWwgcmVsZWFzZSBmb3IgMC4xMCBzcGVjIGRhdGVkIDQvMjYvMjAwMC4KKyAqICAwNS0yNC0wMCAgMDAuMTAuMDIgIEFkZGVkIFNlbnNlQnVmZmVyTGVuZ3RoIHRvIF9NU0dfU0NTSV9JT19SRVBMWS4KKyAqICAwNi0wNi0wMCAgMDEuMDAuMDEgIFVwZGF0ZSB2ZXJzaW9uIG51bWJlciBmb3IgMS4wIHJlbGVhc2UuCisgKiAgMDYtMDgtMDAgIDAxLjAwLjAyICBBZGRlZCBNUElfU0NTSV9SU1BfSU5GT18gZGVmaW5pdGlvbnMuCisgKiAgMTEtMDItMDAgIDAxLjAxLjAxICBPcmlnaW5hbCByZWxlYXNlIGZvciBwb3N0IDEuMCB3b3JrLgorICogIDEyLTA0LTAwICAwMS4wMS4wMiAgQWRkZWQgTVBJX1NDU0lJT19DT05UUk9MX05PX0RJU0NPTk5FQ1QuCisgKiAgMDItMjAtMDEgIDAxLjAxLjAzICBTdGFydGVkIHVzaW5nIE1QSV9QT0lOVEVSLgorICogIDAzLTI3LTAxICAwMS4wMS4wNCAgQWRkZWQgc3RydWN0dXJlIG9mZnNldCBjb21tZW50cy4KKyAqICAwNC0xMC0wMSAgMDEuMDEuMDUgIEFkZGVkIG5ldyBNc2dGbGFnIGZvciBNU0dfU0NTSV9UQVNLX01HTVQuCisgKiAgMDgtMDgtMDEgIDAxLjAyLjAxICBPcmlnaW5hbCByZWxlYXNlIGZvciB2MS4yIHdvcmsuCisgKiAgMDgtMjktMDEgIDAxLjAyLjAyICBBZGRlZCBNUElfU0NTSVRBU0tNR01UX1RBU0tUWVBFX0xPR0lDQUxfVU5JVF9SRVNFVC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSV9TQ1NJX1NUQVRFX1FVRVVFX1RBR19SRUpFQ1RFRCBmb3IKKyAqICAgICAgICAgICAgICAgICAgICAgIE1TR19TQ1NJX0lPX1JFUExZLgorICogIDA5LTI4LTAxICAwMS4wMi4wMyAgQWRkZWQgc3RydWN0dXJlcyBhbmQgZGVmaW5lcyBmb3IgU0NTSSBFbmNsb3N1cmUKKyAqICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NvciBtZXNzYWdlcy4KKyAqICAxMC0wNC0wMSAgMDEuMDIuMDQgIEFkZGVkIGRlZmluZXMgZm9yIFNFUCByZXF1ZXN0IEFjdGlvbiBmaWVsZC4KKyAqICAwNS0zMS0wMiAgMDEuMDIuMDUgIEFkZGVkIE1QSV9TQ1NJSU9fTVNHRkxHU19DTURfREVURVJNSU5FU19EQVRBX0RJUiBkZWZpbmUKKyAqICAgICAgICAgICAgICAgICAgICAgIGZvciBTQ1NJIElPIHJlcXVlc3RzLgorICogIDExLTE1LTAyICAwMS4wMi4wNiAgQWRkZWQgc3BlY2lhbCBleHRlbmRlZCBTQ1NJIFN0YXR1cyBkZWZpbmVzIGZvciBGQ1AuCisgKiAgMDYtMjYtMDMgIDAxLjAyLjA3ICBBZGRlZCBNUElfU0NTSV9TVEFUVVNfRkNQRVhUX1VOQVNTSUdORUQgZGVmaW5lLgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBNUElfSU5JVF9ICisjZGVmaW5lIE1QSV9JTklUX0gKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICBTIEMgUyBJICAgIEkgbiBpIHQgaSBhIHQgbyByICAgIE0gZSBzIHMgYSBnIGUgcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFNDU0kgSU8gbWVzc2FnZXMgYW5kIGFzc29jaWF0ZWQgc3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX01TR19TQ1NJX0lPX1JFUVVFU1QKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJRDsgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEJ1czsgICAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ2hhaW5PZmZzZXQ7ICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgIC8qIDAzaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENEQkxlbmd0aDsgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgU2Vuc2VCdWZmZXJMZW5ndGg7ICAvKiAwNWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAvKiAwOGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBMVU5bOF07ICAgICAgICAgICAgIC8qIDBDaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIENvbnRyb2w7ICAgICAgICAgICAgLyogMTRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ0RCWzE2XTsgICAgICAgICAgICAvKiAxOGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoOyAgICAgICAgIC8qIDI4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFNlbnNlQnVmZmVyTG93QWRkcjsgLyogMkNoICovCisgICAgU0dFX0lPX1VOSU9OICAgICAgICAgICAgU0dMOyAgICAgICAgICAgICAgICAvKiAzMGggKi8KK30gTVNHX1NDU0lfSU9fUkVRVUVTVCwgTVBJX1BPSU5URVIgUFRSX01TR19TQ1NJX0lPX1JFUVVFU1QsCisgIFNDU0lJT1JlcXVlc3RfdCwgTVBJX1BPSU5URVIgcFNDU0lJT1JlcXVlc3RfdDsKKworCisvKiBTQ1NJIElPIE1zZ0ZsYWdzIGJpdHMgKi8KKworI2RlZmluZSBNUElfU0NTSUlPX01TR0ZMR1NfU0VOU0VfV0lEVEggICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfU0NTSUlPX01TR0ZMR1NfU0VOU0VfV0lEVEhfMzIgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUElfU0NTSUlPX01TR0ZMR1NfU0VOU0VfV0lEVEhfNjQgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfU0NTSUlPX01TR0ZMR1NfU0VOU0VfTE9DQVRJT04gICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfU0NTSUlPX01TR0ZMR1NfU0VOU0VfTE9DX0hPU1QgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUElfU0NTSUlPX01TR0ZMR1NfU0VOU0VfTE9DX0lPQyAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfU0NTSUlPX01TR0ZMR1NfQ01EX0RFVEVSTUlORVNfREFUQV9ESVIgICgweDA0KQorI2RlZmluZSBNUElfU0NTSUlPX01TR0ZMR1NfRUVEUF9UWVBFX01BU0sgICAgICAgICAgICgweEUwKQorI2RlZmluZSBNUElfU0NTSUlPX01TR0ZMR1NfRUVEUF9OT05FICAgICAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUElfU0NTSUlPX01TR0ZMR1NfRUVEUF9SRFBST1RFQ1RfVDEwICAgICAgICgweDIwKQorI2RlZmluZSBNUElfU0NTSUlPX01TR0ZMR1NfRUVEUF9WUlBST1RFQ1RfVDEwICAgICAgICgweDQwKQorI2RlZmluZSBNUElfU0NTSUlPX01TR0ZMR1NfRUVEUF9XUlBST1RFQ1RfVDEwICAgICAgICgweDYwKQorI2RlZmluZSBNUElfU0NTSUlPX01TR0ZMR1NfRUVEUF81MjBfUkVBRF9NT0RFMSAgICAgICgweDIwKQorI2RlZmluZSBNUElfU0NTSUlPX01TR0ZMR1NfRUVEUF81MjBfV1JJVEVfTU9ERTEgICAgICgweDQwKQorI2RlZmluZSBNUElfU0NTSUlPX01TR0ZMR1NfRUVEUF84XzlfUkVBRF9NT0RFMSAgICAgICgweDYwKQorI2RlZmluZSBNUElfU0NTSUlPX01TR0ZMR1NfRUVEUF84XzlfV1JJVEVfTU9ERTEgICAgICgweDgwKQorCisKKy8qIFNDU0kgSU8gTFVOIGZpZWxkcyAqLworCisjZGVmaW5lIE1QSV9TQ1NJSU9fTFVOX0ZJUlNUX0xFVkVMX0FERFJFU1NJTkcgICAoMHgwMDAwRkZGRikKKyNkZWZpbmUgTVBJX1NDU0lJT19MVU5fU0VDT05EX0xFVkVMX0FERFJFU1NJTkcgICgweEZGRkYwMDAwKQorI2RlZmluZSBNUElfU0NTSUlPX0xVTl9USElSRF9MRVZFTF9BRERSRVNTSU5HICAgKDB4MDAwMEZGRkYpCisjZGVmaW5lIE1QSV9TQ1NJSU9fTFVOX0ZPVVJUSF9MRVZFTF9BRERSRVNTSU5HICAoMHhGRkZGMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lJT19MVU5fTEVWRUxfMV9XT1JEICAgICAgICAgICAgICgweEZGMDApCisjZGVmaW5lIE1QSV9TQ1NJSU9fTFVOX0xFVkVMXzFfRFdPUkQgICAgICAgICAgICAoMHgwMDAwRkYwMCkKKworLyogU0NTSSBJTyBDb250cm9sIGJpdHMgKi8KKworI2RlZmluZSBNUElfU0NTSUlPX0NPTlRST0xfREFUQURJUkVDVElPTl9NQVNLICAgKDB4MDMwMDAwMDApCisjZGVmaW5lIE1QSV9TQ1NJSU9fQ09OVFJPTF9OT0RBVEFUUkFOU0ZFUiAgICAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lJT19DT05UUk9MX1dSSVRFICAgICAgICAgICAgICAgICgweDAxMDAwMDAwKQorI2RlZmluZSBNUElfU0NTSUlPX0NPTlRST0xfUkVBRCAgICAgICAgICAgICAgICAgKDB4MDIwMDAwMDApCisKKyNkZWZpbmUgTVBJX1NDU0lJT19DT05UUk9MX0FERENEQkxFTl9NQVNLICAgICAgICgweDNDMDAwMDAwKQorI2RlZmluZSBNUElfU0NTSUlPX0NPTlRST0xfQUREQ0RCTEVOX1NISUZUICAgICAgKDI2KQorCisjZGVmaW5lIE1QSV9TQ1NJSU9fQ09OVFJPTF9UQVNLQVRUUklCVVRFX01BU0sgICAoMHgwMDAwMDcwMCkKKyNkZWZpbmUgTVBJX1NDU0lJT19DT05UUk9MX1NJTVBMRVEgICAgICAgICAgICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBNUElfU0NTSUlPX0NPTlRST0xfSEVBRE9GUSAgICAgICAgICAgICAgKDB4MDAwMDAxMDApCisjZGVmaW5lIE1QSV9TQ1NJSU9fQ09OVFJPTF9PUkRFUkVEUSAgICAgICAgICAgICAoMHgwMDAwMDIwMCkKKyNkZWZpbmUgTVBJX1NDU0lJT19DT05UUk9MX0FDQVEgICAgICAgICAgICAgICAgICgweDAwMDAwNDAwKQorI2RlZmluZSBNUElfU0NTSUlPX0NPTlRST0xfVU5UQUdHRUQgICAgICAgICAgICAgKDB4MDAwMDA1MDApCisjZGVmaW5lIE1QSV9TQ1NJSU9fQ09OVFJPTF9OT19ESVNDT05ORUNUICAgICAgICAoMHgwMDAwMDcwMCkKKworI2RlZmluZSBNUElfU0NTSUlPX0NPTlRST0xfVEFTS01BTkFHRV9NQVNLICAgICAgKDB4MDBGRjAwMDApCisjZGVmaW5lIE1QSV9TQ1NJSU9fQ09OVFJPTF9PQlNPTEVURSAgICAgICAgICAgICAoMHgwMDgwMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lJT19DT05UUk9MX0NMRUFSX0FDQV9SU1YgICAgICAgICgweDAwNDAwMDAwKQorI2RlZmluZSBNUElfU0NTSUlPX0NPTlRST0xfVEFSR0VUX1JFU0VUICAgICAgICAgKDB4MDAyMDAwMDApCisjZGVmaW5lIE1QSV9TQ1NJSU9fQ09OVFJPTF9MVU5fUkVTRVRfUlNWICAgICAgICAoMHgwMDEwMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lJT19DT05UUk9MX1JFU0VSVkVEICAgICAgICAgICAgICgweDAwMDgwMDAwKQorI2RlZmluZSBNUElfU0NTSUlPX0NPTlRST0xfQ0xSX1RBU0tfU0VUX1JTViAgICAgKDB4MDAwNDAwMDApCisjZGVmaW5lIE1QSV9TQ1NJSU9fQ09OVFJPTF9BQk9SVF9UQVNLX1NFVCAgICAgICAoMHgwMDAyMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lJT19DT05UUk9MX1JFU0VSVkVEMiAgICAgICAgICAgICgweDAwMDEwMDAwKQorCisKKy8qIFNDU0kgSU8gcmVwbHkgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBfTVNHX1NDU0lfSU9fUkVQTFkKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJRDsgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEJ1czsgICAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnTGVuZ3RoOyAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgIC8qIDAzaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENEQkxlbmd0aDsgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgU2Vuc2VCdWZmZXJMZW5ndGg7ICAvKiAwNWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAvKiAwOGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBTQ1NJU3RhdHVzOyAgICAgICAgIC8qIDBDaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFNDU0lTdGF0ZTsgICAgICAgICAgLyogMERoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSU9DU3RhdHVzOyAgICAgICAgICAvKiAwRWggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBJT0NMb2dJbmZvOyAgICAgICAgIC8qIDEwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFRyYW5zZmVyQ291bnQ7ICAgICAgLyogMTRoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgU2Vuc2VDb3VudDsgICAgICAgICAvKiAxOGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZUluZm87ICAgICAgIC8qIDFDaCAqLworfSBNU0dfU0NTSV9JT19SRVBMWSwgTVBJX1BPSU5URVIgUFRSX01TR19TQ1NJX0lPX1JFUExZLAorICBTQ1NJSU9SZXBseV90LCBNUElfUE9JTlRFUiBwU0NTSUlPUmVwbHlfdDsKKworCisvKiBTQ1NJIElPIFJlcGx5IFNDU0lTdGF0dXMgdmFsdWVzIChTQU0tMiBzdGF0dXMgY29kZXMpICovCisKKyNkZWZpbmUgTVBJX1NDU0lfU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUElfU0NTSV9TVEFUVVNfQ0hFQ0tfQ09ORElUSU9OICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9TQ1NJX1NUQVRVU19DT05ESVRJT05fTUVUICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTVBJX1NDU0lfU1RBVFVTX0JVU1kgICAgICAgICAgICAgICAgICAgICgweDA4KQorI2RlZmluZSBNUElfU0NTSV9TVEFUVVNfSU5URVJNRURJQVRFICAgICAgICAgICAgKDB4MTApCisjZGVmaW5lIE1QSV9TQ1NJX1NUQVRVU19JTlRFUk1FRElBVEVfQ09ORE1FVCAgICAoMHgxNCkKKyNkZWZpbmUgTVBJX1NDU0lfU1RBVFVTX1JFU0VSVkFUSU9OX0NPTkZMSUNUICAgICgweDE4KQorI2RlZmluZSBNUElfU0NTSV9TVEFUVVNfQ09NTUFORF9URVJNSU5BVEVEICAgICAgKDB4MjIpCisjZGVmaW5lIE1QSV9TQ1NJX1NUQVRVU19UQVNLX1NFVF9GVUxMICAgICAgICAgICAoMHgyOCkKKyNkZWZpbmUgTVBJX1NDU0lfU1RBVFVTX0FDQV9BQ1RJVkUgICAgICAgICAgICAgICgweDMwKQorCisjZGVmaW5lIE1QSV9TQ1NJX1NUQVRVU19GQ1BFWFRfREVWSUNFX0xPR0dFRF9PVVQgICAgKDB4ODApCisjZGVmaW5lIE1QSV9TQ1NJX1NUQVRVU19GQ1BFWFRfTk9fTElOSyAgICAgICAgICAgICAgKDB4ODEpCisjZGVmaW5lIE1QSV9TQ1NJX1NUQVRVU19GQ1BFWFRfVU5BU1NJR05FRCAgICAgICAgICAgKDB4ODIpCisKKworLyogU0NTSSBJTyBSZXBseSBTQ1NJU3RhdGUgdmFsdWVzICovCisKKyNkZWZpbmUgTVBJX1NDU0lfU1RBVEVfQVVUT1NFTlNFX1ZBTElEICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfU0NTSV9TVEFURV9BVVRPU0VOU0VfRkFJTEVEICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9TQ1NJX1NUQVRFX05PX1NDU0lfU1RBVFVTICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTVBJX1NDU0lfU1RBVEVfVEVSTUlOQVRFRCAgICAgICAgICAgICAgICgweDA4KQorI2RlZmluZSBNUElfU0NTSV9TVEFURV9SRVNQT05TRV9JTkZPX1ZBTElEICAgICAgKDB4MTApCisjZGVmaW5lIE1QSV9TQ1NJX1NUQVRFX1FVRVVFX1RBR19SRUpFQ1RFRCAgICAgICAoMHgyMCkKKworLyogU0NTSSBJTyBSZXBseSBSZXNwb25zZUluZm8gdmFsdWVzICovCisvKiAoRkNQLTEgUlNQX0NPREUgdmFsdWVzIGFuZCBTUEktMyBQYWNrZXRpemVkIEZhaWx1cmUgY29kZXMpICovCisKKyNkZWZpbmUgTVBJX1NDU0lfUlNQX0lORk9fRlVOQ1RJT05fQ09NUExFVEUgICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBNUElfU0NTSV9SU1BfSU5GT19GQ1BfQlVSU1RfTEVOX0VSUk9SICAgKDB4MDEwMDAwMDApCisjZGVmaW5lIE1QSV9TQ1NJX1JTUF9JTkZPX0NNTkRfRklFTERTX0lOVkFMSUQgICAoMHgwMjAwMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lfUlNQX0lORk9fRkNQX0RBVEFfUk9fRVJST1IgICAgICgweDAzMDAwMDAwKQorI2RlZmluZSBNUElfU0NTSV9SU1BfSU5GT19UQVNLX01HTVRfVU5TVVBQT1JURUQgKDB4MDQwMDAwMDApCisjZGVmaW5lIE1QSV9TQ1NJX1JTUF9JTkZPX1RBU0tfTUdNVF9GQUlMRUQgICAgICAoMHgwNTAwMDAwMCkKKyNkZWZpbmUgTVBJX1NDU0lfUlNQX0lORk9fU1BJX0xRX0lOVkFMSURfVFlQRSAgICgweDA2MDAwMDAwKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFNDU0kgSU8gMzIgUmVxdWVzdCBtZXNzYWdlIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX01TR19TQ1NJX0lPMzJfUkVRVUVTVAoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFRhcmdldElEOyAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQnVzOyAgICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDaGFpbk9mZnNldDsgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgLyogMDNoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ0RCTGVuZ3RoOyAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBTZW5zZUJ1ZmZlckxlbmd0aDsgIC8qIDA1aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgIC8qIDA4aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIExVTls4XTsgICAgICAgICAgICAgLyogMENoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgQ29udHJvbDsgICAgICAgICAgICAvKiAxNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDREJbMzJdOyAgICAgICAgICAgIC8qIDE4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIERhdGFMZW5ndGg7ICAgICAgICAgLyogMzhoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgU2Vuc2VCdWZmZXJMb3dBZGRyOyAvKiAzQ2ggKi8KKyAgICBTR0VfSU9fVU5JT04gICAgICAgICAgICBTR0w7ICAgICAgICAgICAgICAgIC8qIDQwaCAqLworfSBNU0dfU0NTSV9JTzMyX1JFUVVFU1QsIE1QSV9QT0lOVEVSIFBUUl9NU0dfU0NTSV9JTzMyX1JFUVVFU1QsCisgIFNDU0lJTzMyUmVxdWVzdF90LCBNUElfUE9JTlRFUiBwU0NTSUlPMzJSZXF1ZXN0X3Q7CisKKy8qIFNDU0kgSU8gMzIgdXNlcyB0aGUgc2FtZSBkZWZpbmVzIGFzIGFib3ZlIGZvciBTQ1NJIElPICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgU0NTSSBUYXNrIE1hbmFnZW1lbnQgbWVzc2FnZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfTVNHX1NDU0lfVEFTS19NR01UCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0SUQ7ICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBCdXM7ICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENoYWluT2Zmc2V0OyAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFRhc2tUeXBlOyAgICAgICAgICAgLyogMDVoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgLyogMDhoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTFVOWzhdOyAgICAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDJbN107ICAgICAgIC8qIDE0aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFRhc2tNc2dDb250ZXh0OyAgICAgLyogMzBoICovCit9IE1TR19TQ1NJX1RBU0tfTUdNVCwgTVBJX1BPSU5URVIgUFRSX1NDU0lfVEFTS19NR01ULAorICBTQ1NJVGFza01nbXRfdCwgTVBJX1BPSU5URVIgcFNDU0lUYXNrTWdtdF90OworCisvKiBUYXNrVHlwZSB2YWx1ZXMgKi8KKworI2RlZmluZSBNUElfU0NTSVRBU0tNR01UX1RBU0tUWVBFX0FCT1JUX1RBU0sgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9BQlJUX1RBU0tfU0VUICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9TQ1NJVEFTS01HTVRfVEFTS1RZUEVfVEFSR0VUX1JFU0VUICAgICAgICAgICgweDAzKQorI2RlZmluZSBNUElfU0NTSVRBU0tNR01UX1RBU0tUWVBFX1JFU0VUX0JVUyAgICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTVBJX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9MT0dJQ0FMX1VOSVRfUkVTRVQgICAgKDB4MDUpCisjZGVmaW5lIE1QSV9TQ1NJVEFTS01HTVRfVEFTS1RZUEVfQ0xFQVJfVEFTS19TRVQgICAgICAgICgweDA2KQorCisvKiBNc2dGbGFncyBiaXRzICovCisjZGVmaW5lIE1QSV9TQ1NJVEFTS01HTVRfTVNHRkxBR1NfVEFSR0VUX1JFU0VUX09QVElPTiAgICgweDAwKQorI2RlZmluZSBNUElfU0NTSVRBU0tNR01UX01TR0ZMQUdTX0xJUF9SRVNFVF9PUFRJT04gICAgICAoMHgwMikKKyNkZWZpbmUgTVBJX1NDU0lUQVNLTUdNVF9NU0dGTEFHU19MSVBSRVNFVF9SRVNFVF9PUFRJT04gKDB4MDQpCisKKy8qIFNDU0kgVGFzayBNYW5hZ2VtZW50IFJlcGx5ICovCit0eXBlZGVmIHN0cnVjdCBfTVNHX1NDU0lfVEFTS19NR01UX1JFUExZCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0SUQ7ICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBCdXM7ICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0xlbmd0aDsgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFRhc2tUeXBlOyAgICAgICAgICAgLyogMDVoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgLyogMDhoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyWzJdOyAgICAgICAvKiAwQ2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBJT0NTdGF0dXM7ICAgICAgICAgIC8qIDBFaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIElPQ0xvZ0luZm87ICAgICAgICAgLyogMTBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgVGVybWluYXRpb25Db3VudDsgICAvKiAxNGggKi8KK30gTVNHX1NDU0lfVEFTS19NR01UX1JFUExZLCBNUElfUE9JTlRFUiBQVFJfTVNHX1NDU0lfVEFTS19NR01UX1JFUExZLAorICBTQ1NJVGFza01nbXRSZXBseV90LCBNUElfUE9JTlRFUiBwU0NTSVRhc2tNZ210UmVwbHlfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBTQ1NJIEVuY2xvc3VyZSBQcm9jZXNzb3IgbWVzc2FnZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfU0VQX1JFUVVFU1QKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJRDsgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEJ1czsgICAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ2hhaW5PZmZzZXQ7ICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgIC8qIDAzaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjsgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAvKiAwNWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAvKiAwOGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBTbG90U3RhdHVzOyAgICAgICAgIC8qIDBDaCAqLworfSBNU0dfU0VQX1JFUVVFU1QsIE1QSV9QT0lOVEVSIFBUUl9NU0dfU0VQX1JFUVVFU1QsCisgIFNFUFJlcXVlc3RfdCwgTVBJX1BPSU5URVIgcFNFUFJlcXVlc3RfdDsKKworLyogQWN0aW9uIGRlZmluZXMgKi8KKyNkZWZpbmUgTVBJX1NFUF9SRVFfQUNUSU9OX1dSSVRFX1NUQVRVUyAgICAgICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSV9TRVBfUkVRX0FDVElPTl9SRUFEX1NUQVRVUyAgICAgICAgICAgICAgICAgICgweDAxKQorCisvKiBTbG90U3RhdHVzIGJpdHMgZm9yIE1TR19TRVBfUkVRVUVTVCAqLworI2RlZmluZSBNUElfU0VQX1JFUV9TTE9UU1RBVFVTX05PX0VSUk9SICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgTVBJX1NFUF9SRVFfU0xPVFNUQVRVU19ERVZfRkFVTFRZICAgICAgICAgICAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIE1QSV9TRVBfUkVRX1NMT1RTVEFUVVNfREVWX1JFQlVJTERJTkcgICAgICAgICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBNUElfU0VQX1JFUV9TTE9UU1RBVFVTX0lOX0ZBSUxFRF9BUlJBWSAgICAgICAgICAoMHgwMDAwMDAwOCkKKyNkZWZpbmUgTVBJX1NFUF9SRVFfU0xPVFNUQVRVU19JTl9DUklUSUNBTF9BUlJBWSAgICAgICAgKDB4MDAwMDAwMTApCisjZGVmaW5lIE1QSV9TRVBfUkVRX1NMT1RTVEFUVVNfUEFSSVRZX0NIRUNLICAgICAgICAgICAgICgweDAwMDAwMDIwKQorI2RlZmluZSBNUElfU0VQX1JFUV9TTE9UU1RBVFVTX1BSRURJQ1RFRF9GQVVMVCAgICAgICAgICAoMHgwMDAwMDA0MCkKKyNkZWZpbmUgTVBJX1NFUF9SRVFfU0xPVFNUQVRVU19VTkNPTkZJR1VSRUQgICAgICAgICAgICAgKDB4MDAwMDAwODApCisjZGVmaW5lIE1QSV9TRVBfUkVRX1NMT1RTVEFUVVNfSE9UX1NQQVJFICAgICAgICAgICAgICAgICgweDAwMDAwMTAwKQorI2RlZmluZSBNUElfU0VQX1JFUV9TTE9UU1RBVFVTX1JFQlVJTERfU1RPUFBFRCAgICAgICAgICAoMHgwMDAwMDIwMCkKKyNkZWZpbmUgTVBJX1NFUF9SRVFfU0xPVFNUQVRVU19JREVOVElGWV9SRVFVRVNUICAgICAgICAgKDB4MDAwMjAwMDApCisjZGVmaW5lIE1QSV9TRVBfUkVRX1NMT1RTVEFUVVNfUkVRVUVTVF9SRU1PVkUgICAgICAgICAgICgweDAwMDQwMDAwKQorI2RlZmluZSBNUElfU0VQX1JFUV9TTE9UU1RBVFVTX1JFUVVFU1RfSU5TRVJUICAgICAgICAgICAoMHgwMDA4MDAwMCkKKyNkZWZpbmUgTVBJX1NFUF9SRVFfU0xPVFNUQVRVU19ET19OT1RfTU9WRSAgICAgICAgICAgICAgKDB4MDA0MDAwMDApCisjZGVmaW5lIE1QSV9TRVBfUkVRX1NMT1RTVEFUVVNfQl9FTkFCTEVfQllQQVNTICAgICAgICAgICgweDA0MDAwMDAwKQorI2RlZmluZSBNUElfU0VQX1JFUV9TTE9UU1RBVFVTX0FfRU5BQkxFX0JZUEFTUyAgICAgICAgICAoMHgwODAwMDAwMCkKKyNkZWZpbmUgTVBJX1NFUF9SRVFfU0xPVFNUQVRVU19ERVZfT0ZGICAgICAgICAgICAgICAgICAgKDB4MTAwMDAwMDApCisjZGVmaW5lIE1QSV9TRVBfUkVRX1NMT1RTVEFUVVNfU1dBUF9SRVNFVCAgICAgICAgICAgICAgICgweDgwMDAwMDAwKQorCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfU0VQX1JFUExZCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0SUQ7ICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBCdXM7ICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0xlbmd0aDsgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBBY3Rpb247ICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgLyogMDVoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgLyogMDhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBJT0NTdGF0dXM7ICAgICAgICAgIC8qIDBFaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIElPQ0xvZ0luZm87ICAgICAgICAgLyogMTBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgU2xvdFN0YXR1czsgICAgICAgICAvKiAxNGggKi8KK30gTVNHX1NFUF9SRVBMWSwgTVBJX1BPSU5URVIgUFRSX01TR19TRVBfUkVQTFksCisgIFNFUFJlcGx5X3QsIE1QSV9QT0lOVEVSIHBTRVBSZXBseV90OworCisvKiBTbG90U3RhdHVzIGJpdHMgZm9yIE1TR19TRVBfUkVQTFkgKi8KKyNkZWZpbmUgTVBJX1NFUF9SRVBMWV9TTE9UU1RBVFVTX05PX0VSUk9SICAgICAgICAgICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIE1QSV9TRVBfUkVQTFlfU0xPVFNUQVRVU19ERVZfRkFVTFRZICAgICAgICAgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBNUElfU0VQX1JFUExZX1NMT1RTVEFUVVNfREVWX1JFQlVJTERJTkcgICAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgTVBJX1NFUF9SRVBMWV9TTE9UU1RBVFVTX0lOX0ZBSUxFRF9BUlJBWSAgICAgICAgKDB4MDAwMDAwMDgpCisjZGVmaW5lIE1QSV9TRVBfUkVQTFlfU0xPVFNUQVRVU19JTl9DUklUSUNBTF9BUlJBWSAgICAgICgweDAwMDAwMDEwKQorI2RlZmluZSBNUElfU0VQX1JFUExZX1NMT1RTVEFUVVNfUEFSSVRZX0NIRUNLICAgICAgICAgICAoMHgwMDAwMDAyMCkKKyNkZWZpbmUgTVBJX1NFUF9SRVBMWV9TTE9UU1RBVFVTX1BSRURJQ1RFRF9GQVVMVCAgICAgICAgKDB4MDAwMDAwNDApCisjZGVmaW5lIE1QSV9TRVBfUkVQTFlfU0xPVFNUQVRVU19VTkNPTkZJR1VSRUQgICAgICAgICAgICgweDAwMDAwMDgwKQorI2RlZmluZSBNUElfU0VQX1JFUExZX1NMT1RTVEFUVVNfSE9UX1NQQVJFICAgICAgICAgICAgICAoMHgwMDAwMDEwMCkKKyNkZWZpbmUgTVBJX1NFUF9SRVBMWV9TTE9UU1RBVFVTX1JFQlVJTERfU1RPUFBFRCAgICAgICAgKDB4MDAwMDAyMDApCisjZGVmaW5lIE1QSV9TRVBfUkVQTFlfU0xPVFNUQVRVU19SRVBPUlQgICAgICAgICAgICAgICAgICgweDAwMDEwMDAwKQorI2RlZmluZSBNUElfU0VQX1JFUExZX1NMT1RTVEFUVVNfSURFTlRJRllfUkVRVUVTVCAgICAgICAoMHgwMDAyMDAwMCkKKyNkZWZpbmUgTVBJX1NFUF9SRVBMWV9TTE9UU1RBVFVTX1JFTU9WRV9SRUFEWSAgICAgICAgICAgKDB4MDAwNDAwMDApCisjZGVmaW5lIE1QSV9TRVBfUkVQTFlfU0xPVFNUQVRVU19JTlNFUlRfUkVBRFkgICAgICAgICAgICgweDAwMDgwMDAwKQorI2RlZmluZSBNUElfU0VQX1JFUExZX1NMT1RTVEFUVVNfRE9fTk9UX1JFTU9WRSAgICAgICAgICAoMHgwMDQwMDAwMCkKKyNkZWZpbmUgTVBJX1NFUF9SRVBMWV9TTE9UU1RBVFVTX0JfQllQQVNTX0VOQUJMRUQgICAgICAgKDB4MDEwMDAwMDApCisjZGVmaW5lIE1QSV9TRVBfUkVQTFlfU0xPVFNUQVRVU19BX0JZUEFTU19FTkFCTEVEICAgICAgICgweDAyMDAwMDAwKQorI2RlZmluZSBNUElfU0VQX1JFUExZX1NMT1RTVEFUVVNfQl9FTkFCTEVfQllQQVNTICAgICAgICAoMHgwNDAwMDAwMCkKKyNkZWZpbmUgTVBJX1NFUF9SRVBMWV9TTE9UU1RBVFVTX0FfRU5BQkxFX0JZUEFTUyAgICAgICAgKDB4MDgwMDAwMDApCisjZGVmaW5lIE1QSV9TRVBfUkVQTFlfU0xPVFNUQVRVU19ERVZfT0ZGICAgICAgICAgICAgICAgICgweDEwMDAwMDAwKQorI2RlZmluZSBNUElfU0VQX1JFUExZX1NMT1RTVEFUVVNfRkFVTFRfU0VOU0VEICAgICAgICAgICAoMHg0MDAwMDAwMCkKKyNkZWZpbmUgTVBJX1NFUF9SRVBMWV9TTE9UU1RBVFVTX1NXQVBQRUQgICAgICAgICAgICAgICAgKDB4ODAwMDAwMDApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2lvYy5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2lvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNDQ1ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaW9jLmgKQEAgLTAsMCArMSw3NzAgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgTFNJIExvZ2ljIENvcnBvcmF0aW9uLgorICoKKyAqCisgKiAgICAgICAgICAgTmFtZTogIG1waV9pb2MuaAorICogICAgICAgICAgVGl0bGU6ICBNUEkgSU9DLCBQb3J0LCBFdmVudCwgRlcgRG93bmxvYWQsIGFuZCBGVyBVcGxvYWQgbWVzc2FnZXMKKyAqICBDcmVhdGlvbiBEYXRlOiAgQXVndXN0IDExLCAyMDAwCisgKgorICogICAgbXBpX2lvYy5oIFZlcnNpb246ICAwMS4wNS54eAorICoKKyAqICBWZXJzaW9uIEhpc3RvcnkKKyAqICAtLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgRGF0ZSAgICAgIFZlcnNpb24gICBEZXNjcmlwdGlvbgorICogIC0tLS0tLS0tICAtLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgMDUtMDgtMDAgIDAwLjEwLjAxICBPcmlnaW5hbCByZWxlYXNlIGZvciAwLjEwIHNwZWMgZGF0ZWQgNC8yNi8yMDAwLgorICogIDA1LTI0LTAwICAwMC4xMC4wMiAgQWRkZWQgX01TR19JT0NfSU5JVF9SRVBMWSBzdHJ1Y3R1cmUuCisgKiAgMDYtMDYtMDAgIDAxLjAwLjAxICBBZGRlZCBDdXJSZXBseUZyYW1lU2l6ZSBmaWVsZCB0byBfTVNHX0lPQ19GQUNUU19SRVBMWS4KKyAqICAwNi0xMi0wMCAgMDEuMDAuMDIgIEFkZGVkIF9NU0dfUE9SVF9FTkFCTEVfUkVQTFkgc3RydWN0dXJlLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgX01TR19FVkVOVF9BQ0tfUkVQTFkgc3RydWN0dXJlLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgX01TR19GV19ET1dOTE9BRF9SRVBMWSBzdHJ1Y3R1cmUuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBfTVNHX1RPT0xCT1hfUkVQTFkgc3RydWN0dXJlLgorICogIDA2LTMwLTAwICAwMS4wMC4wMyAgQWRkZWQgTWF4TGFuQnVja2V0cyB0byBfUE9SVF9GQUNUX1JFUExZIHN0cnVjdHVyZS4KKyAqICAwNy0yNy0wMCAgMDEuMDAuMDQgIEFkZGVkIF9FVkVOVF9EQVRBIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBmb3IgX1NDU0ksCisgKiAgICAgICAgICAgICAgICAgICAgICBfTElOS19TVEFUVVMsIF9MT09QX1NUQVRFIGFuZCBfTE9HT1VULgorICogIDA4LTExLTAwICAwMS4wMC4wNSAgU3dpdGNoZWQgcG9zaXRpb25zIG9mIE1zZ0xlbmd0aCBhbmQgRnVuY3Rpb24gZmllbGRzIGluCisgKiAgICAgICAgICAgICAgICAgICAgICBfTVNHX0VWRU5UX0FDS19SRVBMWSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggc3BlY2lmaWNhdGlvbi4KKyAqICAxMS0wMi0wMCAgMDEuMDEuMDEgIE9yaWdpbmFsIHJlbGVhc2UgZm9yIHBvc3QgMS4wIHdvcmsuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBhIHZhbHVlIGZvciBNYW51ZmFjdHVyZXIgdG8gV2hvSW5pdC4KKyAqICAxMi0wNC0wMCAgMDEuMDEuMDIgIE1vZGlmaWVkIElPQ0ZhY3RzIHJlcGx5LCBhZGRlZCBGV1VwbG9hZCBtZXNzYWdlcywgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkIHRvb2xib3ggbWVzc2FnZS4KKyAqICAwMS0wOS0wMSAgMDEuMDEuMDMgIEFkZGVkIGV2ZW50IGVuYWJsZWQgYW5kIGRpc2FibGVkIGRlZmluZXMuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBzdHJ1Y3R1cmVzIGZvciBGd0hlYWRlciBhbmQgRGF0YUhlYWRlci4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIEltYWdlVHlwZSB0byBGd1VwbG9hZCByZXBseS4KKyAqICAwMi0yMC0wMSAgMDEuMDEuMDQgIFN0YXJ0ZWQgdXNpbmcgTVBJX1BPSU5URVIuCisgKiAgMDItMjctMDEgIDAxLjAxLjA1ICBBZGRlZCBldmVudCBmb3IgUkFJRCBzdGF0dXMgY2hhbmdlIGFuZCBpdHMgZXZlbnQgZGF0YS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIElvY051bWJlciBmaWVsZCB0byBNU0dfSU9DX0ZBQ1RTX1JFUExZLgorICogIDAzLTI3LTAxICAwMS4wMS4wNiAgQWRkZWQgZGVmaW5lcyBmb3IgUHJvZHVjdElkIGZpZWxkIG9mIE1QSV9GV19IRUFERVIuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBzdHJ1Y3R1cmUgb2Zmc2V0IGNvbW1lbnRzLgorICogIDA0LTA5LTAxICAwMS4wMS4wNyAgQWRkZWQgc3RydWN0dXJlIEVWRU5UX0RBVEFfRVZFTlRfQ0hBTkdFLgorICogIDA4LTA4LTAxICAwMS4wMi4wMSAgT3JpZ2luYWwgcmVsZWFzZSBmb3IgdjEuMiB3b3JrLgorICogICAgICAgICAgICAgICAgICAgICAgTmV3IGZvcm1hdCBmb3IgRldWZXJzaW9uIGFuZCBQcm9kdWN0SWQgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgIE1TR19JT0NfRkFDVFNfUkVQTFkgYW5kIE1QSV9GV19IRUFERVIuCisgKiAgMDgtMzEtMDEgIDAxLjAyLjAyICBBZGRkZWQgZXZlbnQgTVBJX0VWRU5UX1NDU0lfREVWSUNFX1NUQVRVU19DSEFOR0UgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkIHN0cnVjdHVyZSBhbmQgZGVmaW5lcy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGV2ZW50IE1QSV9FVkVOVF9PTl9CVVNfVElNRVJfRVhQSVJFRC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSV9JT0NJTklUX0ZMQUdTX0RJU0NBUkRfRldfSU1BR0UuCisgKiAgICAgICAgICAgICAgICAgICAgICBSZXBsYWNlZCBhIHJlc2VydmVkIGZpZWxkIGluIE1TR19JT0NfRkFDVFNfUkVQTFkgd2l0aAorICogICAgICAgICAgICAgICAgICAgICAgSU9DRXhjZXB0aW9ucyBhbmQgY2hhbmdlZCBEYXRhSW1hZ2VTaXplIHRvIHJlc2VydmVkLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJX0ZXX0RPV05MT0FEX0lUWVBFX05WU1RPUkVfREFUQSBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgIE1QSV9GV19VUExPQURfSVRZUEVfTlZEQVRBLgorICogIDA5LTI4LTAxICAwMS4wMi4wMyAgTW9kaWZpZWQgRXZlbnQgRGF0YSBmb3IgSW50ZWdyYXRlZCBSQUlELgorICogIDExLTAxLTAxICAwMS4wMi4wNCAgQWRkZWQgZGVmaW5lcyBmb3IgTVBJX0VYVF9JTUFHRV9IRUFERVIgSW1hZ2VUeXBlIGZpZWxkLgorICogIDAzLTE0LTAyICAwMS4wMi4wNSAgQWRkZWQgSGVhZGVyVmVyc2lvbiBmaWVsZCB0byBNU0dfSU9DX0ZBQ1RTX1JFUExZLgorICogIDA1LTMxLTAyICAwMS4wMi4wNiAgQWRkZWQgZGVmaW5lIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgTVBJX0lPQ0ZBQ1RTX0VYQ0VQVF9SQUlEX0NPTkZJR19JTlZBTElELgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgQWxpYXNJbmRleCB0byBFVkVOVF9EQVRBX0xPR09VVCBzdHJ1Y3R1cmUuCisgKiAgMDQtMDEtMDMgIDAxLjAyLjA3ICBBZGRlZCBkZWZpbmVzIGZvciBNUElfRldfSEVBREVSX1NJR05BVFVSRV8uCisgKiAgMDYtMjYtMDMgIDAxLjAyLjA4ICBBZGRlZCBuZXcgdmFsdWVzIHRvIHRoZSBwcm9kdWN0IGZhbWlseSBkZWZpbmVzLgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBNUElfSU9DX0gKKyNkZWZpbmUgTVBJX0lPQ19ICisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICAgICAgICAgSSBPIEMgICAgTSBlIHMgcyBhIGcgZSBzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgSU9DSW5pdCBtZXNzYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfTVNHX0lPQ19JTklUCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgV2hvSW5pdDsgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDaGFpbk9mZnNldDsgICAgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAgICAgICAgIC8qIDAzaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNYXhEZXZpY2VzOyAgICAgICAgICAgICAgICAgLyogMDVoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTWF4QnVzZXM7ICAgICAgICAgICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVwbHlGcmFtZVNpemU7ICAgICAgICAgICAgIC8qIDBDaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMVsyXTsgICAgICAgICAgICAgICAvKiAwRWggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBIb3N0TWZhSGlnaEFkZHI7ICAgICAgICAgICAgLyogMTBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgU2Vuc2VCdWZmZXJIaWdoQWRkcjsgICAgICAgIC8qIDE0aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlcGx5Rmlmb0hvc3RTaWduYWxpbmdBZGRyOyAvKiAxOGggKi8KK30gTVNHX0lPQ19JTklULCBNUElfUE9JTlRFUiBQVFJfTVNHX0lPQ19JTklULAorICBJT0NJbml0X3QsIE1QSV9QT0lOVEVSIHBJT0NJbml0X3Q7CisKKy8qIFdob0luaXQgdmFsdWVzICovCisjZGVmaW5lIE1QSV9XSE9JTklUX05PX09ORSAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSV9XSE9JTklUX1NZU1RFTV9CSU9TICAgICAgICAgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSV9XSE9JTklUX1JPTV9CSU9TICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9XSE9JTklUX1BDSV9QRUVSICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDMpCisjZGVmaW5lIE1QSV9XSE9JTklUX0hPU1RfRFJJVkVSICAgICAgICAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9XSE9JTklUX01BTlVGQUNUVVJFUiAgICAgICAgICAgICAgICAgICAgKDB4MDUpCisKKy8qIEZsYWdzIHZhbHVlcyAqLworI2RlZmluZSBNUElfSU9DSU5JVF9GTEFHU19ESVNDQVJEX0ZXX0lNQUdFICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfSU9DSU5JVF9GTEFHU19SRVBMWV9GSUZPX0hPU1RfU0lHTkFMICAgICgweDAyKQorCit0eXBlZGVmIHN0cnVjdCBfTVNHX0lPQ19JTklUX1JFUExZCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgV2hvSW5pdDsgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dMZW5ndGg7ICAgICAgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAgICAgICAgIC8qIDAzaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNYXhEZXZpY2VzOyAgICAgICAgICAgICAgICAgLyogMDVoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTWF4QnVzZXM7ICAgICAgICAgICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgIC8qIDBDaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIElPQ1N0YXR1czsgICAgICAgICAgICAgICAgICAvKiAwRWggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBJT0NMb2dJbmZvOyAgICAgICAgICAgICAgICAgLyogMTBoICovCit9IE1TR19JT0NfSU5JVF9SRVBMWSwgTVBJX1BPSU5URVIgUFRSX01TR19JT0NfSU5JVF9SRVBMWSwKKyAgSU9DSW5pdFJlcGx5X3QsIE1QSV9QT0lOVEVSIHBJT0NJbml0UmVwbHlfdDsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIElPQyBGYWN0cyBtZXNzYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX01TR19JT0NfRkFDVFMKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZFsyXTsgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ2hhaW5PZmZzZXQ7ICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDFbM107ICAgICAgICAgICAgICAgLyogMDNoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgICAgICAgICAvKiAwOGggKi8KK30gTVNHX0lPQ19GQUNUUywgTVBJX1BPSU5URVIgUFRSX0lPQ19GQUNUUywKKyAgSU9DRmFjdHNfdCwgTVBJX1BPSU5URVIgcElPQ0ZhY3RzX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9NUElfRldfVkVSU0lPTl9TVFJVQ1QKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBEZXY7ICAgICAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgVW5pdDsgICAgICAgICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1pbm9yOyAgICAgICAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNYWpvcjsgICAgICAgICAgICAgICAgICAgICAgLyogMDNoICovCit9IE1QSV9GV19WRVJTSU9OX1NUUlVDVDsKKwordHlwZWRlZiB1bmlvbiBfTVBJX0ZXX1ZFUlNJT04KK3sKKyAgICBNUElfRldfVkVSU0lPTl9TVFJVQ1QgICBTdHJ1Y3Q7CisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgV29yZDsKK30gTVBJX0ZXX1ZFUlNJT047CisKKy8qIElPQyBGYWN0cyBSZXBseSAqLwordHlwZWRlZiBzdHJ1Y3QgX01TR19JT0NfRkFDVFNfUkVQTFkKK3sKKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBNc2dWZXJzaW9uOyAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnTGVuZ3RoOyAgICAgICAgICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBIZWFkZXJWZXJzaW9uOyAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgSU9DTnVtYmVyOyAgICAgICAgICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSU9DRXhjZXB0aW9uczsgICAgICAgICAgICAgIC8qIDBDaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIElPQ1N0YXR1czsgICAgICAgICAgICAgICAgICAvKiAwRWggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBJT0NMb2dJbmZvOyAgICAgICAgICAgICAgICAgLyogMTBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTWF4Q2hhaW5EZXB0aDsgICAgICAgICAgICAgIC8qIDE0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFdob0luaXQ7ICAgICAgICAgICAgICAgICAgICAvKiAxNWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBCbG9ja1NpemU7ICAgICAgICAgICAgICAgICAgLyogMTZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qIDE3aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlcGx5UXVldWVEZXB0aDsgICAgICAgICAgICAvKiAxOGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0RnJhbWVTaXplOyAgICAgICAgICAgLyogMUFoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWRfMDEwMV9GV1ZlcnNpb247ICAgIC8qIDFDaCAqLyAvKiBvYnNvbGV0ZSAxNi1iaXQgRldWZXJzaW9uICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdElEOyAgICAgICAgICAgICAgICAgIC8qIDFFaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRIb3N0TWZhSGlnaEFkZHI7ICAgICAvKiAyMGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBHbG9iYWxDcmVkaXRzOyAgICAgICAgICAgICAgLyogMjRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZQb3J0czsgICAgICAgICAgICAgIC8qIDI2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEV2ZW50U3RhdGU7ICAgICAgICAgICAgICAgICAvKiAyN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBDdXJyZW50U2Vuc2VCdWZmZXJIaWdoQWRkcjsgLyogMjhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgQ3VyUmVwbHlGcmFtZVNpemU7ICAgICAgICAgIC8qIDJDaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1heERldmljZXM7ICAgICAgICAgICAgICAgICAvKiAyRWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNYXhCdXNlczsgICAgICAgICAgICAgICAgICAgLyogMkZoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgRldJbWFnZVNpemU7ICAgICAgICAgICAgICAgIC8qIDMwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIElPQ0NhcGFiaWxpdGllczsgICAgICAgICAgICAvKiAzNGggKi8KKyAgICBNUElfRldfVkVSU0lPTiAgICAgICAgICBGV1ZlcnNpb247ICAgICAgICAgICAgICAgICAgLyogMzhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSGlnaFByaW9yaXR5UXVldWVEZXB0aDsgICAgIC8qIDNDaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAzRWggKi8KK30gTVNHX0lPQ19GQUNUU19SRVBMWSwgTVBJX1BPSU5URVIgUFRSX01TR19JT0NfRkFDVFNfUkVQTFksCisgIElPQ0ZhY3RzUmVwbHlfdCwgTVBJX1BPSU5URVIgcElPQ0ZhY3RzUmVwbHlfdDsKKworI2RlZmluZSBNUElfSU9DRkFDVFNfTVNHVkVSU0lPTl9NQUpPUl9NQVNLICAgICAgICAgICgweEZGMDApCisjZGVmaW5lIE1QSV9JT0NGQUNUU19NU0dWRVJTSU9OX01JTk9SX01BU0sgICAgICAgICAgKDB4MDBGRikKKworI2RlZmluZSBNUElfSU9DRkFDVFNfSEVBREVSVkVSU0lPTl9VTklUX01BU0sgICAgICAgICgweEZGMDApCisjZGVmaW5lIE1QSV9JT0NGQUNUU19IRUFERVJWRVJTSU9OX0RFVl9NQVNLICAgICAgICAgKDB4MDBGRikKKworI2RlZmluZSBNUElfSU9DRkFDVFNfRVhDRVBUX0NPTkZJR19DSEVDS1NVTV9GQUlMICAgICgweDAwMDEpCisjZGVmaW5lIE1QSV9JT0NGQUNUU19FWENFUFRfUkFJRF9DT05GSUdfSU5WQUxJRCAgICAgKDB4MDAwMikKKyNkZWZpbmUgTVBJX0lPQ0ZBQ1RTX0VYQ0VQVF9GV19DSEVDS1NVTV9GQUlMICAgICAgICAoMHgwMDA0KQorI2RlZmluZSBNUElfSU9DRkFDVFNfRVhDRVBUX1BFUlNJU1RFTlRfVEFCTEVfRlVMTCAgICgweDAwMDgpCisKKyNkZWZpbmUgTVBJX0lPQ0ZBQ1RTX0ZMQUdTX0ZXX0RPV05MT0FEX0JPT1QgICAgICAgICAoMHgwMSkKKworI2RlZmluZSBNUElfSU9DRkFDVFNfRVZFTlRTVEFURV9ESVNBQkxFRCAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUElfSU9DRkFDVFNfRVZFTlRTVEFURV9FTkFCTEVEICAgICAgICAgICAgICgweDAxKQorCisjZGVmaW5lIE1QSV9JT0NGQUNUU19DQVBBQklMSVRZX0hJR0hfUFJJX1EgICAgICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIE1QSV9JT0NGQUNUU19DQVBBQklMSVRZX1JFUExZX0hPU1RfU0lHTkFMICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIE1QSV9JT0NGQUNUU19DQVBBQklMSVRZX1FVRVVFX0ZVTExfSEFORExJTkcgKDB4MDAwMDAwMDQpCisjZGVmaW5lIE1QSV9JT0NGQUNUU19DQVBBQklMSVRZX0RJQUdfVFJBQ0VfQlVGRkVSICAgKDB4MDAwMDAwMDgpCisjZGVmaW5lIE1QSV9JT0NGQUNUU19DQVBBQklMSVRZX1NOQVBTSE9UX0JVRkZFUiAgICAgKDB4MDAwMDAwMTApCisjZGVmaW5lIE1QSV9JT0NGQUNUU19DQVBBQklMSVRZX0VYVEVOREVEX0JVRkZFUiAgICAgKDB4MDAwMDAwMjApCisjZGVmaW5lIE1QSV9JT0NGQUNUU19DQVBBQklMSVRZX0VFRFAgICAgICAgICAgICAgICAgKDB4MDAwMDAwNDApCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICBQIG8gciB0ICAgIE0gZSBzIHMgYSBnIGUgcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFBvcnQgRmFjdHMgbWVzc2FnZSBhbmQgUmVwbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX01TR19QT1JUX0ZBQ1RTCit7CisgICAgIFU4ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWRbMl07ICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgICBVOCAgICAgICAgICAgICAgICAgICAgIENoYWluT2Zmc2V0OyAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICAgVTggICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgLyogMDNoICovCisgICAgIFU4ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxWzJdOyAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgICBVOCAgICAgICAgICAgICAgICAgICAgIFBvcnROdW1iZXI7ICAgICAgICAgICAgICAgICAvKiAwNmggKi8KKyAgICAgVTggICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgICAgICAgICAgLyogMDdoICovCisgICAgIFUzMiAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworfSBNU0dfUE9SVF9GQUNUUywgTVBJX1BPSU5URVIgUFRSX01TR19QT1JUX0ZBQ1RTLAorICBQb3J0RmFjdHNfdCwgTVBJX1BPSU5URVIgcFBvcnRGYWN0c190OworCit0eXBlZGVmIHN0cnVjdCBfTVNHX1BPUlRfRkFDVFNfUkVQTFkKK3sKKyAgICAgVTE2ICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgIFU4ICAgICAgICAgICAgICAgICAgICAgTXNnTGVuZ3RoOyAgICAgICAgICAgICAgICAgIC8qIDAyaCAqLworICAgICBVOCAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgICAgICAgICAvKiAwM2ggKi8KKyAgICAgVTE2ICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgIFU4ICAgICAgICAgICAgICAgICAgICAgUG9ydE51bWJlcjsgICAgICAgICAgICAgICAgIC8qIDA2aCAqLworICAgICBVOCAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAvKiAwN2ggKi8KKyAgICAgVTMyICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgIFUxNiAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgIC8qIDBDaCAqLworICAgICBVMTYgICAgICAgICAgICAgICAgICAgIElPQ1N0YXR1czsgICAgICAgICAgICAgICAgICAvKiAwRWggKi8KKyAgICAgVTMyICAgICAgICAgICAgICAgICAgICBJT0NMb2dJbmZvOyAgICAgICAgICAgICAgICAgLyogMTBoICovCisgICAgIFU4ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAgICAgICAgIC8qIDE0aCAqLworICAgICBVOCAgICAgICAgICAgICAgICAgICAgIFBvcnRUeXBlOyAgICAgICAgICAgICAgICAgICAvKiAxNWggKi8KKyAgICAgVTE2ICAgICAgICAgICAgICAgICAgICBNYXhEZXZpY2VzOyAgICAgICAgICAgICAgICAgLyogMTZoICovCisgICAgIFUxNiAgICAgICAgICAgICAgICAgICAgUG9ydFNDU0lJRDsgICAgICAgICAgICAgICAgIC8qIDE4aCAqLworICAgICBVMTYgICAgICAgICAgICAgICAgICAgIFByb3RvY29sRmxhZ3M7ICAgICAgICAgICAgICAvKiAxQWggKi8KKyAgICAgVTE2ICAgICAgICAgICAgICAgICAgICBNYXhQb3N0ZWRDbWRCdWZmZXJzOyAgICAgICAgLyogMUNoICovCisgICAgIFUxNiAgICAgICAgICAgICAgICAgICAgTWF4UGVyc2lzdGVudElEczsgICAgICAgICAgIC8qIDFFaCAqLworICAgICBVMTYgICAgICAgICAgICAgICAgICAgIE1heExhbkJ1Y2tldHM7ICAgICAgICAgICAgICAvKiAyMGggKi8KKyAgICAgVTE2ICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgICAgICAgICAgLyogMjJoICovCisgICAgIFUzMiAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ1OyAgICAgICAgICAgICAgICAgIC8qIDI0aCAqLworfSBNU0dfUE9SVF9GQUNUU19SRVBMWSwgTVBJX1BPSU5URVIgUFRSX01TR19QT1JUX0ZBQ1RTX1JFUExZLAorICBQb3J0RmFjdHNSZXBseV90LCBNUElfUE9JTlRFUiBwUG9ydEZhY3RzUmVwbHlfdDsKKworCisvKiBQb3J0VHlwZXMgdmFsdWVzICovCisKKyNkZWZpbmUgTVBJX1BPUlRGQUNUU19QT1JUVFlQRV9JTkFDVElWRSAgICAgICAgICgweDAwKQorI2RlZmluZSBNUElfUE9SVEZBQ1RTX1BPUlRUWVBFX1NDU0kgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSV9QT1JURkFDVFNfUE9SVFRZUEVfRkMgICAgICAgICAgICAgICAoMHgxMCkKKyNkZWZpbmUgTVBJX1BPUlRGQUNUU19QT1JUVFlQRV9JU0NTSSAgICAgICAgICAgICgweDIwKQorI2RlZmluZSBNUElfUE9SVEZBQ1RTX1BPUlRUWVBFX1NBUyAgICAgICAgICAgICAgKDB4MzApCisKKy8qIFByb3RvY29sRmxhZ3MgdmFsdWVzICovCisKKyNkZWZpbmUgTVBJX1BPUlRGQUNUU19QUk9UT0NPTF9MT0dCVVNBRERSICAgICAgICgweDAxKQorI2RlZmluZSBNUElfUE9SVEZBQ1RTX1BST1RPQ09MX0xBTiAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9QT1JURkFDVFNfUFJPVE9DT0xfVEFSR0VUICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTVBJX1BPUlRGQUNUU19QUk9UT0NPTF9JTklUSUFUT1IgICAgICAgICgweDA4KQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFBvcnQgRW5hYmxlIE1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX01TR19QT1JUX0VOQUJMRQoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkWzJdOyAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDaGFpbk9mZnNldDsgICAgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAgICAgICAgIC8qIDAzaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMVsyXTsgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBQb3J0TnVtYmVyOyAgICAgICAgICAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgICAgICAgICAvKiAwOGggKi8KK30gTVNHX1BPUlRfRU5BQkxFLCBNUElfUE9JTlRFUiBQVFJfTVNHX1BPUlRfRU5BQkxFLAorICBQb3J0RW5hYmxlX3QsIE1QSV9QT0lOVEVSIHBQb3J0RW5hYmxlX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9NU0dfUE9SVF9FTkFCTEVfUkVQTFkKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZFsyXTsgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnTGVuZ3RoOyAgICAgICAgICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDFbMl07ICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUG9ydE51bWJlcjsgICAgICAgICAgICAgICAgIC8qIDA1aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgIC8qIDBDaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIElPQ1N0YXR1czsgICAgICAgICAgICAgICAgICAvKiAwRWggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBJT0NMb2dJbmZvOyAgICAgICAgICAgICAgICAgLyogMTBoICovCit9IE1TR19QT1JUX0VOQUJMRV9SRVBMWSwgTVBJX1BPSU5URVIgUFRSX01TR19QT1JUX0VOQUJMRV9SRVBMWSwKKyAgUG9ydEVuYWJsZVJlcGx5X3QsIE1QSV9QT0lOVEVSIHBQb3J0RW5hYmxlUmVwbHlfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICBFIHYgZSBuIHQgICAgTSBlIHMgcyBhIGcgZSBzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgRXZlbnQgTm90aWZpY2F0aW9uIG1lc3NhZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfTVNHX0VWRU5UX05PVElGWQoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaDsgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ2hhaW5PZmZzZXQ7ICAgICAgICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDFbM107ICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgICAgICAgICAvKiAwOGggKi8KK30gTVNHX0VWRU5UX05PVElGWSwgTVBJX1BPSU5URVIgUFRSX01TR19FVkVOVF9OT1RJRlksCisgIEV2ZW50Tm90aWZpY2F0aW9uX3QsIE1QSV9QT0lOVEVSIHBFdmVudE5vdGlmaWNhdGlvbl90OworCisvKiBFdmVudCBOb3RpZmljYXRpb24gUmVwbHkgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX01TR19FVkVOVF9OT1RJRllfUkVQTFkKK3sKKyAgICAgVTE2ICAgICAgICAgICAgICAgICAgICBFdmVudERhdGFMZW5ndGg7ICAgICAgICAgICAgLyogMDBoICovCisgICAgIFU4ICAgICAgICAgICAgICAgICAgICAgTXNnTGVuZ3RoOyAgICAgICAgICAgICAgICAgIC8qIDAyaCAqLworICAgICBVOCAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgICAgICAgICAvKiAwM2ggKi8KKyAgICAgVTggICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDFbMl07ICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgIFU4ICAgICAgICAgICAgICAgICAgICAgQWNrUmVxdWlyZWQ7ICAgICAgICAgICAgICAgIC8qIDA2aCAqLworICAgICBVOCAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAvKiAwN2ggKi8KKyAgICAgVTMyICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgIFU4ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyWzJdOyAgICAgICAgICAgICAgIC8qIDBDaCAqLworICAgICBVMTYgICAgICAgICAgICAgICAgICAgIElPQ1N0YXR1czsgICAgICAgICAgICAgICAgICAvKiAwRWggKi8KKyAgICAgVTMyICAgICAgICAgICAgICAgICAgICBJT0NMb2dJbmZvOyAgICAgICAgICAgICAgICAgLyogMTBoICovCisgICAgIFUzMiAgICAgICAgICAgICAgICAgICAgRXZlbnQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIDE0aCAqLworICAgICBVMzIgICAgICAgICAgICAgICAgICAgIEV2ZW50Q29udGV4dDsgICAgICAgICAgICAgICAvKiAxOGggKi8KKyAgICAgVTMyICAgICAgICAgICAgICAgICAgICBEYXRhWzFdOyAgICAgICAgICAgICAgICAgICAgLyogMUNoICovCit9IE1TR19FVkVOVF9OT1RJRllfUkVQTFksIE1QSV9QT0lOVEVSIFBUUl9NU0dfRVZFTlRfTk9USUZZX1JFUExZLAorICBFdmVudE5vdGlmaWNhdGlvblJlcGx5X3QsIE1QSV9QT0lOVEVSIHBFdmVudE5vdGlmaWNhdGlvblJlcGx5X3Q7CisKKy8qIEV2ZW50IEFja25vd2xlZGdlICovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfRVZFTlRfQUNLCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWRbMl07ICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENoYWluT2Zmc2V0OyAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgLyogMDNoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxWzNdOyAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgRXZlbnQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIDBDaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEV2ZW50Q29udGV4dDsgICAgICAgICAgICAgICAvKiAxMGggKi8KK30gTVNHX0VWRU5UX0FDSywgTVBJX1BPSU5URVIgUFRSX01TR19FVkVOVF9BQ0ssCisgIEV2ZW50QWNrX3QsIE1QSV9QT0lOVEVSIHBFdmVudEFja190OworCit0eXBlZGVmIHN0cnVjdCBfTVNHX0VWRU5UX0FDS19SRVBMWQoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkWzJdOyAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dMZW5ndGg7ICAgICAgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAgICAgICAgIC8qIDAzaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMVszXTsgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBJT0NTdGF0dXM7ICAgICAgICAgICAgICAgICAgLyogMEVoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgSU9DTG9nSW5mbzsgICAgICAgICAgICAgICAgIC8qIDEwaCAqLworfSBNU0dfRVZFTlRfQUNLX1JFUExZLCBNUElfUE9JTlRFUiBQVFJfTVNHX0VWRU5UX0FDS19SRVBMWSwKKyAgRXZlbnRBY2tSZXBseV90LCBNUElfUE9JTlRFUiBwRXZlbnRBY2tSZXBseV90OworCisvKiBTd2l0Y2ggKi8KKworI2RlZmluZSBNUElfRVZFTlRfTk9USUZJQ0FUSU9OX1NXSVRDSF9PRkYgICAoMHgwMCkKKyNkZWZpbmUgTVBJX0VWRU5UX05PVElGSUNBVElPTl9TV0lUQ0hfT04gICAgKDB4MDEpCisKKy8qIEV2ZW50ICovCisKKyNkZWZpbmUgTVBJX0VWRU5UX05PTkUgICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIE1QSV9FVkVOVF9MT0dfREFUQSAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBNUElfRVZFTlRfU1RBVEVfQ0hBTkdFICAgICAgICAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgTVBJX0VWRU5UX1VOSVRfQVRURU5USU9OICAgICAgICAgICAgKDB4MDAwMDAwMDMpCisjZGVmaW5lIE1QSV9FVkVOVF9JT0NfQlVTX1JFU0VUICAgICAgICAgICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBNUElfRVZFTlRfRVhUX0JVU19SRVNFVCAgICAgICAgICAgICAoMHgwMDAwMDAwNSkKKyNkZWZpbmUgTVBJX0VWRU5UX1JFU0NBTiAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDYpCisjZGVmaW5lIE1QSV9FVkVOVF9MSU5LX1NUQVRVU19DSEFOR0UgICAgICAgICgweDAwMDAwMDA3KQorI2RlZmluZSBNUElfRVZFTlRfTE9PUF9TVEFURV9DSEFOR0UgICAgICAgICAoMHgwMDAwMDAwOCkKKyNkZWZpbmUgTVBJX0VWRU5UX0xPR09VVCAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDkpCisjZGVmaW5lIE1QSV9FVkVOVF9FVkVOVF9DSEFOR0UgICAgICAgICAgICAgICgweDAwMDAwMDBBKQorI2RlZmluZSBNUElfRVZFTlRfSU5URUdSQVRFRF9SQUlEICAgICAgICAgICAoMHgwMDAwMDAwQikKKyNkZWZpbmUgTVBJX0VWRU5UX1NDU0lfREVWSUNFX1NUQVRVU19DSEFOR0UgKDB4MDAwMDAwMEMpCisjZGVmaW5lIE1QSV9FVkVOVF9PTl9CVVNfVElNRVJfRVhQSVJFRCAgICAgICgweDAwMDAwMDBEKQorI2RlZmluZSBNUElfRVZFTlRfUVVFVUVfRlVMTCAgICAgICAgICAgICAgICAoMHgwMDAwMDAwRSkKKyNkZWZpbmUgTVBJX0VWRU5UX1NBU19ERVZJQ0VfU1RBVFVTX0NIQU5HRSAgKDB4MDAwMDAwMEYpCisjZGVmaW5lIE1QSV9FVkVOVF9TQVNfU0VTICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDEwKQorI2RlZmluZSBNUElfRVZFTlRfUEVSU0lTVEVOVF9UQUJMRV9GVUxMICAgICAoMHgwMDAwMDAxMSkKKworLyogQWNrUmVxdWlyZWQgZmllbGQgdmFsdWVzICovCisKKyNkZWZpbmUgTVBJX0VWRU5UX05PVElGSUNBVElPTl9BQ0tfTk9UX1JFUVVJUkVEICgweDAwKQorI2RlZmluZSBNUElfRVZFTlRfTk9USUZJQ0FUSU9OX0FDS19SRVFVSVJFRCAgICAgKDB4MDEpCisKKy8qIEV2ZW50Q2hhbmdlIEV2ZW50IGRhdGEgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX0VWRU5UX0RBVEFfRVZFTlRfQ0hBTkdFCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRXZlbnRTdGF0ZTsgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMDJoICovCit9IEVWRU5UX0RBVEFfRVZFTlRfQ0hBTkdFLCBNUElfUE9JTlRFUiBQVFJfRVZFTlRfREFUQV9FVkVOVF9DSEFOR0UsCisgIEV2ZW50RGF0YUV2ZW50Q2hhbmdlX3QsIE1QSV9QT0lOVEVSIHBFdmVudERhdGFFdmVudENoYW5nZV90OworCisvKiBTQ1NJIEV2ZW50IGRhdGEgZm9yIFBvcnQsIEJ1cyBhbmQgRGV2aWNlIGZvcm1zICovCisKK3R5cGVkZWYgc3RydWN0IF9FVkVOVF9EQVRBX1NDU0kKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJRDsgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQnVzUG9ydDsgICAgICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAvKiAwMmggKi8KK30gRVZFTlRfREFUQV9TQ1NJLCBNUElfUE9JTlRFUiBQVFJfRVZFTlRfREFUQV9TQ1NJLAorICBFdmVudERhdGFTY3NpX3QsIE1QSV9QT0lOVEVSIHBFdmVudERhdGFTY3NpX3Q7CisKKy8qIFNDU0kgRGV2aWNlIFN0YXR1cyBDaGFuZ2UgRXZlbnQgZGF0YSAqLworCit0eXBlZGVmIHN0cnVjdCBfRVZFTlRfREFUQV9TQ1NJX0RFVklDRV9TVEFUVVNfQ0hBTkdFCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0SUQ7ICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEJ1czsgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZWFzb25Db2RlOyAgICAgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTFVOOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAzaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEFTQzsgICAgICAgICAgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBBU0NROyAgICAgICAgICAgICAgICAgICAgICAgLyogMDVoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgIC8qIDA2aCAqLworfSBFVkVOVF9EQVRBX1NDU0lfREVWSUNFX1NUQVRVU19DSEFOR0UsCisgIE1QSV9QT0lOVEVSIFBUUl9FVkVOVF9EQVRBX1NDU0lfREVWSUNFX1NUQVRVU19DSEFOR0UsCisgIE1waUV2ZW50RGF0YVNjc2lEZXZpY2VTdGF0dXNDaGFuZ2VfdCwKKyAgTVBJX1BPSU5URVIgcE1waUV2ZW50RGF0YVNjc2lEZXZpY2VTdGF0dXNDaGFuZ2VfdDsKKworLyogTVBJIFNDU0kgRGV2aWNlIFN0YXR1cyBDaGFuZ2UgRXZlbnQgZGF0YSBSZWFzb25Db2RlIHZhbHVlcyAqLworI2RlZmluZSBNUElfRVZFTlRfU0NTSV9ERVZfU1RBVF9SQ19BRERFRCAgICAgICAgICAgICAgICAoMHgwMykKKyNkZWZpbmUgTVBJX0VWRU5UX1NDU0lfREVWX1NUQVRfUkNfTk9UX1JFU1BPTkRJTkcgICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9FVkVOVF9TQ1NJX0RFVl9TVEFUX1JDX1NNQVJUX0RBVEEgICAgICAgICAgICgweDA1KQorCisvKiBTQVMgRGV2aWNlIFN0YXR1cyBDaGFuZ2UgRXZlbnQgZGF0YSAqLworCit0eXBlZGVmIHN0cnVjdCBfRVZFTlRfREFUQV9TQVNfREVWSUNFX1NUQVRVU19DSEFOR0UKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJRDsgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQnVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlYXNvbkNvZGU7ICAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgLyogMDNoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQVNDOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEFTQ1E7ICAgICAgICAgICAgICAgICAgICAgICAvKiAwNWggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBEZXZIYW5kbGU7ICAgICAgICAgICAgICAgICAgLyogMDZoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgRGV2aWNlSW5mbzsgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworfSBFVkVOVF9EQVRBX1NBU19ERVZJQ0VfU1RBVFVTX0NIQU5HRSwKKyAgTVBJX1BPSU5URVIgUFRSX0VWRU5UX0RBVEFfU0FTX0RFVklDRV9TVEFUVVNfQ0hBTkdFLAorICBNcGlFdmVudERhdGFTYXNEZXZpY2VTdGF0dXNDaGFuZ2VfdCwKKyAgTVBJX1BPSU5URVIgcE1waUV2ZW50RGF0YVNhc0RldmljZVN0YXR1c0NoYW5nZV90OworCisvKiBNUEkgU0FTIERldmljZSBTdGF0dXMgQ2hhbmdlIEV2ZW50IGRhdGEgUmVhc29uQ29kZSB2YWx1ZXMgKi8KKyNkZWZpbmUgTVBJX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19BRERFRCAgICAgICAgICAgICAgICAgKDB4MDMpCisjZGVmaW5lIE1QSV9FVkVOVF9TQVNfREVWX1NUQVRfUkNfTk9UX1JFU1BPTkRJTkcgICAgICAgICgweDA0KQorI2RlZmluZSBNUElfRVZFTlRfU0FTX0RFVl9TVEFUX1JDX1NNQVJUX0RBVEEgICAgICAgICAgICAoMHgwNSkKKyNkZWZpbmUgTVBJX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19OT19QRVJTSVNUX0FEREVEICAgICAgKDB4MDYpCisKKy8qIFNDU0kgRXZlbnQgZGF0YSBmb3IgUXVldWUgRnVsbCBldmVudCAqLworCit0eXBlZGVmIHN0cnVjdCBfRVZFTlRfREFUQV9RVUVVRV9GVUxMCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0SUQ7ICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEJ1czsgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBDdXJyZW50RGVwdGg7ICAgICAgICAgICAgICAgLyogMDJoICovCit9IEVWRU5UX0RBVEFfUVVFVUVfRlVMTCwgTVBJX1BPSU5URVIgUFRSX0VWRU5UX0RBVEFfUVVFVUVfRlVMTCwKKyAgRXZlbnREYXRhUXVldWVGdWxsX3QsIE1QSV9QT0lOVEVSIHBFdmVudERhdGFRdWV1ZUZ1bGxfdDsKKworLyogTVBJIExpbmsgU3RhdHVzIENoYW5nZSBFdmVudCBkYXRhICovCisKK3R5cGVkZWYgc3RydWN0IF9FVkVOVF9EQVRBX0xJTktfU1RBVFVTCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgU3RhdGU7ICAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFBvcnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiAwNWggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAgICAgLyogMDZoICovCit9IEVWRU5UX0RBVEFfTElOS19TVEFUVVMsIE1QSV9QT0lOVEVSIFBUUl9FVkVOVF9EQVRBX0xJTktfU1RBVFVTLAorICBFdmVudERhdGFMaW5rU3RhdHVzX3QsIE1QSV9QT0lOVEVSIHBFdmVudERhdGFMaW5rU3RhdHVzX3Q7CisKKyNkZWZpbmUgTVBJX0VWRU5UX0xJTktfU1RBVFVTX0ZBSUxVUkUgICAgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIE1QSV9FVkVOVF9MSU5LX1NUQVRVU19BQ1RJVkUgICAgICAgICgweDAwMDAwMDAxKQorCisvKiBNUEkgTG9vcCBTdGF0ZSBDaGFuZ2UgRXZlbnQgZGF0YSAqLworCit0eXBlZGVmIHN0cnVjdCBfRVZFTlRfREFUQV9MT09QX1NUQVRFCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyNDsgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3RlcjM7ICAgICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBUeXBlOyAgICAgICAgICAgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgIC8qIDAzaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBQb3J0OyAgICAgICAgICAgICAgICAgICAgICAgLyogMDVoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgIC8qIDA2aCAqLworfSBFVkVOVF9EQVRBX0xPT1BfU1RBVEUsIE1QSV9QT0lOVEVSIFBUUl9FVkVOVF9EQVRBX0xPT1BfU1RBVEUsCisgIEV2ZW50RGF0YUxvb3BTdGF0ZV90LCBNUElfUE9JTlRFUiBwRXZlbnREYXRhTG9vcFN0YXRlX3Q7CisKKyNkZWZpbmUgTVBJX0VWRU5UX0xPT1BfU1RBVEVfQ0hBTkdFX0xJUCAgICAgKDB4MDAwMSkKKyNkZWZpbmUgTVBJX0VWRU5UX0xPT1BfU1RBVEVfQ0hBTkdFX0xQRSAgICAgKDB4MDAwMikKKyNkZWZpbmUgTVBJX0VWRU5UX0xPT1BfU1RBVEVfQ0hBTkdFX0xQQiAgICAgKDB4MDAwMykKKworLyogTVBJIExPR09VVCBFdmVudCBkYXRhICovCisKK3R5cGVkZWYgc3RydWN0IF9FVkVOVF9EQVRBX0xPR09VVAoreworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE5Qb3J0SUQ7ICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBBbGlhc0luZGV4OyAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUG9ydDsgICAgICAgICAgICAgICAgICAgICAgIC8qIDA1aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAvKiAwNmggKi8KK30gRVZFTlRfREFUQV9MT0dPVVQsIE1QSV9QT0lOVEVSIFBUUl9FVkVOVF9EQVRBX0xPR09VVCwKKyAgRXZlbnREYXRhTG9nb3V0X3QsIE1QSV9QT0lOVEVSIHBFdmVudERhdGFMb2dvdXRfdDsKKworI2RlZmluZSBNUElfRVZFTlRfTE9HT1VUX0FMTF9BTElBU0VTICAgICAgICAoMHhGRikKKworCisvKiBNUEkgSW50ZWdyYXRlZCBSQUlEIEV2ZW50IGRhdGEgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX0VWRU5UX0RBVEFfUkFJRAoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZUlEOyAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVCdXM7ICAgICAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVhc29uQ29kZTsgICAgICAgICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFBoeXNEaXNrTnVtOyAgICAgICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBBU0M7ICAgICAgICAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQVNDUTsgICAgICAgICAgICAgICAgICAgICAgIC8qIDA1aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAvKiAwNmggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc1N0YXR1czsgICAgICAgICAgICAgLyogMDhoICovCit9IEVWRU5UX0RBVEFfUkFJRCwgTVBJX1BPSU5URVIgUFRSX0VWRU5UX0RBVEFfUkFJRCwKKyAgTXBpRXZlbnREYXRhUmFpZF90LCBNUElfUE9JTlRFUiBwTXBpRXZlbnREYXRhUmFpZF90OworCisvKiBNUEkgSW50ZWdyYXRlZCBSQUlEIEV2ZW50IGRhdGEgUmVhc29uQ29kZSB2YWx1ZXMgKi8KKyNkZWZpbmUgTVBJX0VWRU5UX1JBSURfUkNfVk9MVU1FX0NSRUFURUQgICAgICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSV9FVkVOVF9SQUlEX1JDX1ZPTFVNRV9ERUxFVEVEICAgICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfRVZFTlRfUkFJRF9SQ19WT0xVTUVfU0VUVElOR1NfQ0hBTkdFRCAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJX0VWRU5UX1JBSURfUkNfVk9MVU1FX1NUQVRVU19DSEFOR0VEICAgICAgICAgKDB4MDMpCisjZGVmaW5lIE1QSV9FVkVOVF9SQUlEX1JDX1ZPTFVNRV9QSFlTRElTS19DSEFOR0VEICAgICAgICgweDA0KQorI2RlZmluZSBNUElfRVZFTlRfUkFJRF9SQ19QSFlTRElTS19DUkVBVEVEICAgICAgICAgICAgICAoMHgwNSkKKyNkZWZpbmUgTVBJX0VWRU5UX1JBSURfUkNfUEhZU0RJU0tfREVMRVRFRCAgICAgICAgICAgICAgKDB4MDYpCisjZGVmaW5lIE1QSV9FVkVOVF9SQUlEX1JDX1BIWVNESVNLX1NFVFRJTkdTX0NIQU5HRUQgICAgICgweDA3KQorI2RlZmluZSBNUElfRVZFTlRfUkFJRF9SQ19QSFlTRElTS19TVEFUVVNfQ0hBTkdFRCAgICAgICAoMHgwOCkKKyNkZWZpbmUgTVBJX0VWRU5UX1JBSURfUkNfRE9NQUlOX1ZBTF9ORUVERUQgICAgICAgICAgICAgKDB4MDkpCisjZGVmaW5lIE1QSV9FVkVOVF9SQUlEX1JDX1NNQVJUX0RBVEEgICAgICAgICAgICAgICAgICAgICgweDBBKQorI2RlZmluZSBNUElfRVZFTlRfUkFJRF9SQ19SRVBMQUNFX0FDVElPTl9TVEFSVEVEICAgICAgICAoMHgwQikKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICBGIGkgciBtIHcgYSByIGUgICAgTCBvIGEgZCAgICBNIGUgcyBzIGEgZyBlIHMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBGaXJtd2FyZSBEb3dubG9hZCBtZXNzYWdlIGFuZCBhc3NvY2lhdGVkIHN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfRldfRE9XTkxPQUQKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBJbWFnZVR5cGU7ICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENoYWluT2Zmc2V0OyAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgLyogMDNoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxWzNdOyAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgU0dFX01QSV9VTklPTiAgICAgICAgICAgU0dMOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDBDaCAqLworfSBNU0dfRldfRE9XTkxPQUQsIE1QSV9QT0lOVEVSIFBUUl9NU0dfRldfRE9XTkxPQUQsCisgIEZXRG93bmxvYWRfdCwgTVBJX1BPSU5URVIgcEZXRG93bmxvYWRfdDsKKworI2RlZmluZSBNUElfRldfRE9XTkxPQURfSVRZUEVfUkVTRVJWRUQgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX0ZXX0RPV05MT0FEX0lUWVBFX0ZXICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSV9GV19ET1dOTE9BRF9JVFlQRV9CSU9TICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfRldfRE9XTkxPQURfSVRZUEVfTlZEQVRBICAgICAgICAoMHgwMykKKyNkZWZpbmUgTVBJX0ZXX0RPV05MT0FEX0lUWVBFX0JPT1RMT0FERVIgICAgKDB4MDQpCisKKwordHlwZWRlZiBzdHJ1Y3QgX0ZXRG93bmxvYWRUQ1NHRQoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0U2l6ZTsgICAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRGV0YWlsc0xlbmd0aDsgICAgICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZF8wMTAwX0NoZWNrc3VtOyAgICAgLyogMDRoICovIC8qIG9ic29sZXRlIENoZWNrc3VtICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgSW1hZ2VPZmZzZXQ7ICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEltYWdlU2l6ZTsgICAgICAgICAgICAgICAgICAvKiAwQ2ggKi8KK30gRldfRE9XTkxPQURfVENTR0UsIE1QSV9QT0lOVEVSIFBUUl9GV19ET1dOTE9BRF9UQ1NHRSwKKyAgRldEb3dubG9hZFRDU0dFX3QsIE1QSV9QT0lOVEVSIHBGV0Rvd25sb2FkVENTR0VfdDsKKworLyogRmlybXdhcmUgRG93bmxvYWQgcmVwbHkgKi8KK3R5cGVkZWYgc3RydWN0IF9NU0dfRldfRE9XTkxPQURfUkVQTFkKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBJbWFnZVR5cGU7ICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0xlbmd0aDsgICAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgLyogMDNoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxWzNdOyAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgIC8qIDBDaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIElPQ1N0YXR1czsgICAgICAgICAgICAgICAgICAvKiAwRWggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBJT0NMb2dJbmZvOyAgICAgICAgICAgICAgICAgLyogMTBoICovCit9IE1TR19GV19ET1dOTE9BRF9SRVBMWSwgTVBJX1BPSU5URVIgUFRSX01TR19GV19ET1dOTE9BRF9SRVBMWSwKKyAgRldEb3dubG9hZFJlcGx5X3QsIE1QSV9QT0lOVEVSIHBGV0Rvd25sb2FkUmVwbHlfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBGaXJtd2FyZSBVcGxvYWQgbWVzc2FnZSBhbmQgYXNzb2NpYXRlZCBzdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfRldfVVBMT0FECit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgSW1hZ2VUeXBlOyAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDaGFpbk9mZnNldDsgICAgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAgICAgICAgIC8qIDAzaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMVszXTsgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFNHRV9NUElfVU5JT04gICAgICAgICAgIFNHTDsgICAgICAgICAgICAgICAgICAgICAgICAvKiAwQ2ggKi8KK30gTVNHX0ZXX1VQTE9BRCwgTVBJX1BPSU5URVIgUFRSX01TR19GV19VUExPQUQsCisgIEZXVXBsb2FkX3QsIE1QSV9QT0lOVEVSIHBGV1VwbG9hZF90OworCisjZGVmaW5lIE1QSV9GV19VUExPQURfSVRZUEVfRldfSU9DX01FTSAgICAgICgweDAwKQorI2RlZmluZSBNUElfRldfVVBMT0FEX0lUWVBFX0ZXX0ZMQVNIICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX0ZXX1VQTE9BRF9JVFlQRV9CSU9TX0ZMQVNIICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9GV19VUExPQURfSVRZUEVfTlZEQVRBICAgICAgICAgICgweDAzKQorI2RlZmluZSBNUElfRldfVVBMT0FEX0lUWVBFX0JPT1RMT0FERVIgICAgICAoMHgwNCkKKwordHlwZWRlZiBzdHJ1Y3QgX0ZXVXBsb2FkVENTR0UKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ29udGV4dFNpemU7ICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIERldGFpbHNMZW5ndGg7ICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGbGFnczsgICAgICAgICAgICAgICAgICAgICAgLyogMDNoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEltYWdlT2Zmc2V0OyAgICAgICAgICAgICAgICAvKiAwOGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBJbWFnZVNpemU7ICAgICAgICAgICAgICAgICAgLyogMENoICovCit9IEZXX1VQTE9BRF9UQ1NHRSwgTVBJX1BPSU5URVIgUFRSX0ZXX1VQTE9BRF9UQ1NHRSwKKyAgRldVcGxvYWRUQ1NHRV90LCBNUElfUE9JTlRFUiBwRldVcGxvYWRUQ1NHRV90OworCisvKiBGaXJtd2FyZSBVcGxvYWQgcmVwbHkgKi8KK3R5cGVkZWYgc3RydWN0IF9NU0dfRldfVVBMT0FEX1JFUExZCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgSW1hZ2VUeXBlOyAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dMZW5ndGg7ICAgICAgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAgICAgICAgIC8qIDAzaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMVszXTsgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBJT0NTdGF0dXM7ICAgICAgICAgICAgICAgICAgLyogMEVoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgSU9DTG9nSW5mbzsgICAgICAgICAgICAgICAgIC8qIDEwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEFjdHVhbEltYWdlU2l6ZTsgICAgICAgICAgICAvKiAxNGggKi8KK30gTVNHX0ZXX1VQTE9BRF9SRVBMWSwgTVBJX1BPSU5URVIgUFRSX01TR19GV19VUExPQURfUkVQTFksCisgIEZXVXBsb2FkUmVwbHlfdCwgTVBJX1BPSU5URVIgcEZXVXBsb2FkUmVwbHlfdDsKKworCit0eXBlZGVmIHN0cnVjdCBfTVBJX0ZXX0hFQURFUgoreworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEFybUJyYW5jaEluc3RydWN0aW9uMDsgICAgICAvKiAwMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBTaWduYXR1cmUwOyAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlMTsgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFNpZ25hdHVyZTI7ICAgICAgICAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBBcm1CcmFuY2hJbnN0cnVjdGlvbjE7ICAgICAgLyogMTBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgQXJtQnJhbmNoSW5zdHJ1Y3Rpb24yOyAgICAgIC8qIDE0aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAvKiAxOGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBDaGVja3N1bTsgICAgICAgICAgICAgICAgICAgLyogMUNoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgVmVuZG9ySWQ7ICAgICAgICAgICAgICAgICAgIC8qIDIwaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFByb2R1Y3RJZDsgICAgICAgICAgICAgICAgICAvKiAyMmggKi8KKyAgICBNUElfRldfVkVSU0lPTiAgICAgICAgICBGV1ZlcnNpb247ICAgICAgICAgICAgICAgICAgLyogMjRoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgU2VxQ29kZVZlcnNpb247ICAgICAgICAgICAgIC8qIDI4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEltYWdlU2l6ZTsgICAgICAgICAgICAgICAgICAvKiAyQ2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBOZXh0SW1hZ2VIZWFkZXJPZmZzZXQ7ICAgICAgLyogMzBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTG9hZFN0YXJ0QWRkcmVzczsgICAgICAgICAgIC8qIDM0aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIElvcFJlc2V0VmVjdG9yVmFsdWU7ICAgICAgICAvKiAzOGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBJb3BSZXNldFJlZ0FkZHI7ICAgICAgICAgICAgLyogM0NoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbk5hbWVXaGF0OyAgICAgICAgICAgIC8qIDQwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb25OYW1lWzMyXTsgICAgICAgICAgICAvKiA0NGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBWZW5kb3JOYW1lV2hhdDsgICAgICAgICAgICAgLyogNjRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgVmVuZG9yTmFtZVszMl07ICAgICAgICAgICAgIC8qIDY4aCAqLworfSBNUElfRldfSEVBREVSLCBNUElfUE9JTlRFUiBQVFJfTVBJX0ZXX0hFQURFUiwKKyAgTXBpRndIZWFkZXJfdCwgTVBJX1BPSU5URVIgcE1waUZ3SGVhZGVyX3Q7CisKKyNkZWZpbmUgTVBJX0ZXX0hFQURFUl9XSEFUX1NJR05BVFVSRSAgICAgICAgKDB4MjkyMzI4NDApCisKKy8qIGRlZmluZXMgZm9yIHVzaW5nIHRoZSBQcm9kdWN0SWQgZmllbGQgKi8KKyNkZWZpbmUgTVBJX0ZXX0hFQURFUl9QSURfVFlQRV9NQVNLICAgICAgICAgICAgICgweEYwMDApCisjZGVmaW5lIE1QSV9GV19IRUFERVJfUElEX1RZUEVfU0NTSSAgICAgICAgICAgICAoMHgwMDAwKQorI2RlZmluZSBNUElfRldfSEVBREVSX1BJRF9UWVBFX0ZDICAgICAgICAgICAgICAgKDB4MTAwMCkKKyNkZWZpbmUgTVBJX0ZXX0hFQURFUl9QSURfVFlQRV9TQVMgICAgICAgICAgICAgICgweDIwMDApCisKKyNkZWZpbmUgTVBJX0ZXX0hFQURFUl9TSUdOQVRVUkVfMCAgICAgICAgICAgICAgICgweDVBRUFBNTVBKQorI2RlZmluZSBNUElfRldfSEVBREVSX1NJR05BVFVSRV8xICAgICAgICAgICAgICAgKDB4QTU1QUVBQTUpCisjZGVmaW5lIE1QSV9GV19IRUFERVJfU0lHTkFUVVJFXzIgICAgICAgICAgICAgICAoMHg1QUE1NUFFQSkKKworI2RlZmluZSBNUElfRldfSEVBREVSX1BJRF9QUk9EX01BU0sgICAgICAgICAgICAgICAgICAgICAoMHgwRjAwKQorI2RlZmluZSBNUElfRldfSEVBREVSX1BJRF9QUk9EX0lOSVRJQVRPUl9TQ1NJICAgICAgICAgICAoMHgwMTAwKQorI2RlZmluZSBNUElfRldfSEVBREVSX1BJRF9QUk9EX1RBUkdFVF9JTklUSUFUT1JfU0NTSSAgICAoMHgwMjAwKQorI2RlZmluZSBNUElfRldfSEVBREVSX1BJRF9QUk9EX1RBUkdFVF9TQ1NJICAgICAgICAgICAgICAoMHgwMzAwKQorI2RlZmluZSBNUElfRldfSEVBREVSX1BJRF9QUk9EX0lNX1NDU0kgICAgICAgICAgICAgICAgICAoMHgwNDAwKQorI2RlZmluZSBNUElfRldfSEVBREVSX1BJRF9QUk9EX0lTX1NDU0kgICAgICAgICAgICAgICAgICAoMHgwNTAwKQorI2RlZmluZSBNUElfRldfSEVBREVSX1BJRF9QUk9EX0NUWF9TQ1NJICAgICAgICAgICAgICAgICAoMHgwNjAwKQorCisjZGVmaW5lIE1QSV9GV19IRUFERVJfUElEX0ZBTUlMWV9NQVNLICAgICAgICAgICAoMHgwMEZGKQorLyogU0NTSSAqLworI2RlZmluZSBNUElfRldfSEVBREVSX1BJRF9GQU1JTFlfMTAzMEEwX1NDU0kgICAgKDB4MDAwMSkKKyNkZWZpbmUgTVBJX0ZXX0hFQURFUl9QSURfRkFNSUxZXzEwMzBCMF9TQ1NJICAgICgweDAwMDIpCisjZGVmaW5lIE1QSV9GV19IRUFERVJfUElEX0ZBTUlMWV8xMDMwQjFfU0NTSSAgICAoMHgwMDAzKQorI2RlZmluZSBNUElfRldfSEVBREVSX1BJRF9GQU1JTFlfMTAzMEMwX1NDU0kgICAgKDB4MDAwNCkKKyNkZWZpbmUgTVBJX0ZXX0hFQURFUl9QSURfRkFNSUxZXzEwMjBBMF9TQ1NJICAgICgweDAwMDUpCisjZGVmaW5lIE1QSV9GV19IRUFERVJfUElEX0ZBTUlMWV8xMDIwQjBfU0NTSSAgICAoMHgwMDA2KQorI2RlZmluZSBNUElfRldfSEVBREVSX1BJRF9GQU1JTFlfMTAyMEIxX1NDU0kgICAgKDB4MDAwNykKKyNkZWZpbmUgTVBJX0ZXX0hFQURFUl9QSURfRkFNSUxZXzEwMjBDMF9TQ1NJICAgICgweDAwMDgpCisjZGVmaW5lIE1QSV9GV19IRUFERVJfUElEX0ZBTUlMWV8xMDM1QTBfU0NTSSAgICAoMHgwMDA5KQorI2RlZmluZSBNUElfRldfSEVBREVSX1BJRF9GQU1JTFlfMTAzNUIwX1NDU0kgICAgKDB4MDAwQSkKKyNkZWZpbmUgTVBJX0ZXX0hFQURFUl9QSURfRkFNSUxZXzEwMzBUQTBfU0NTSSAgICgweDAwMEIpCisjZGVmaW5lIE1QSV9GV19IRUFERVJfUElEX0ZBTUlMWV8xMDIwVEEwX1NDU0kgICAoMHgwMDBDKQorLyogRmlicmUgQ2hhbm5lbCAqLworI2RlZmluZSBNUElfRldfSEVBREVSX1BJRF9GQU1JTFlfOTA5X0ZDICAgICAgICAgKDB4MDAwMCkKKyNkZWZpbmUgTVBJX0ZXX0hFQURFUl9QSURfRkFNSUxZXzkxOV9GQyAgICAgICAgICgweDAwMDEpCisjZGVmaW5lIE1QSV9GV19IRUFERVJfUElEX0ZBTUlMWV85MTlYX0ZDICAgICAgICAoMHgwMDAyKQorI2RlZmluZSBNUElfRldfSEVBREVSX1BJRF9GQU1JTFlfOTE5WExfRkMgICAgICAgKDB4MDAwMykKKyNkZWZpbmUgTVBJX0ZXX0hFQURFUl9QSURfRkFNSUxZXzk0OV9GQyAgICAgICAgICgweDAwMDQpCisjZGVmaW5lIE1QSV9GV19IRUFERVJfUElEX0ZBTUlMWV85NTlfRkMgICAgICAgICAoMHgwMDA1KQorLyogU0FTICovCisjZGVmaW5lIE1QSV9GV19IRUFERVJfUElEX0ZBTUlMWV8xMDY0X1NBUyAgICAgICAoMHgwMDAxKQorCit0eXBlZGVmIHN0cnVjdCBfTVBJX0VYVF9JTUFHRV9IRUFERVIKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBJbWFnZVR5cGU7ICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBDaGVja3N1bTsgICAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgSW1hZ2VTaXplOyAgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE5leHRJbWFnZUhlYWRlck9mZnNldDsgICAgICAvKiAwQ2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBMb2FkU3RhcnRBZGRyZXNzOyAgICAgICAgICAgLyogMTBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgIC8qIDE0aCAqLworfSBNUElfRVhUX0lNQUdFX0hFQURFUiwgTVBJX1BPSU5URVIgUFRSX01QSV9FWFRfSU1BR0VfSEVBREVSLAorICBNcGlFeHRJbWFnZUhlYWRlcl90LCBNUElfUE9JTlRFUiBwTXBpRXh0SW1hZ2VIZWFkZXJfdDsKKworLyogZGVmaW5lcyBmb3IgdGhlIEltYWdlVHlwZSBmaWVsZCAqLworI2RlZmluZSBNUElfRVhUX0lNQUdFX1RZUEVfVU5TUEVDSUZJRUQgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSV9FWFRfSU1BR0VfVFlQRV9GVyAgICAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX0VYVF9JTUFHRV9UWVBFX05WREFUQSAgICAgICAgICAgICAgICgweDAzKQorI2RlZmluZSBNUElfRVhUX0lNQUdFX1RZUEVfQk9PVExPQURFUiAgICAgICAgICAgKDB4MDQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2xhbi5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2xhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZWQxMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfbGFuLmgKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgTFNJIExvZ2ljIENvcnBvcmF0aW9uLgorICoKKyAqCisgKiAgICAgICAgICAgTmFtZTogIG1waV9sYW4uaAorICogICAgICAgICAgVGl0bGU6ICBNUEkgTEFOIG1lc3NhZ2VzIGFuZCBzdHJ1Y3R1cmVzCisgKiAgQ3JlYXRpb24gRGF0ZTogIEp1bmUgMzAsIDIwMDAKKyAqCisgKiAgICBtcGlfbGFuLmggVmVyc2lvbjogIDAxLjA1Lnh4CisgKgorICogIFZlcnNpb24gSGlzdG9yeQorICogIC0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBEYXRlICAgICAgVmVyc2lvbiAgIERlc2NyaXB0aW9uCisgKiAgLS0tLS0tLS0gIC0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAwNS0wOC0wMCAgMDAuMTAuMDEgIE9yaWdpbmFsIHJlbGVhc2UgZm9yIDAuMTAgc3BlYyBkYXRlZCA0LzI2LzIwMDAuCisgKiAgMDUtMjQtMDAgIDAwLjEwLjAyICBBZGRlZCBMQU5TdGF0dXMgZmllbGQgdG8gX01TR19MQU5fU0VORF9SRVBMWS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIExBTlN0YXR1cyBmaWVsZCB0byBfTVNHX0xBTl9SRUNFSVZFX1BPU1RfUkVQTFkuCisgKiAgICAgICAgICAgICAgICAgICAgICBNb3ZlZCBMaXN0Q291bnQgZmllbGQgaW4gX01TR19MQU5fUkVDRUlWRV9QT1NUX1JFUExZLgorICogIDA2LTA2LTAwICAwMS4wMC4wMSAgVXBkYXRlIHZlcnNpb24gbnVtYmVyIGZvciAxLjAgcmVsZWFzZS4KKyAqICAwNi0xMi0wMCAgMDEuMDAuMDIgIEFkZGVkIE1QSV8gdG8gQlVDS0VUU1RBVFVTXyBkZWZpbml0aW9ucy4KKyAqICAwNi0yMi0wMCAgMDEuMDAuMDMgIE1ham9yIGNoYW5nZXMgdG8gbWF0Y2ggbmV3IExBTiBkZWZpbml0aW9uIGluIDEuMCBzcGVjLgorICogIDA2LTMwLTAwICAwMS4wMC4wNCAgQWRkZWQgQ29udGV4dCBSZXBseSBkZWZpbml0aW9ucyBwZXIgcmV2aXNlZCBwcm9wb3NhbC4KKyAqICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWQgdHJhbnNhY3Rpb24gY29udGV4dCB1c2FnZSB0byBidWNrZXQvYnVmZmVyLgorICogIDA3LTA1LTAwICAwMS4wMC4wNSAgUmVtb3ZlZCBMQU5fUkVDRUlWRV9QT1NUX0JVQ0tFVF9DT05URVhUX01BU0sgZGVmaW5pdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgdG8gbGFuIHByaXZhdGUgaGVhZGVyIGZpbGUKKyAqICAxMS0wMi0wMCAgMDEuMDEuMDEgIE9yaWdpbmFsIHJlbGVhc2UgZm9yIHBvc3QgMS4wIHdvcmsKKyAqICAwMi0yMC0wMSAgMDEuMDEuMDIgIFN0YXJ0ZWQgdXNpbmcgTVBJX1BPSU5URVIuCisgKiAgMDMtMjctMDEgIDAxLjAxLjAzICBBZGRlZCBzdHJ1Y3R1cmUgb2Zmc2V0IGNvbW1lbnRzLgorICogIDA4LTA4LTAxICAwMS4wMi4wMSAgT3JpZ2luYWwgcmVsZWFzZSBmb3IgdjEuMiB3b3JrLgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBNUElfTEFOX0gKKyNkZWZpbmUgTVBJX0xBTl9ICisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgICAgICAgIEwgQSBOICAgIE0gZSBzIHMgYSBnIGUgcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTEFOU2VuZCBtZXNzYWdlcyAqLworCit0eXBlZGVmIHN0cnVjdCBfTVNHX0xBTl9TRU5EX1JFUVVFU1QKK3sKKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENoYWluT2Zmc2V0OyAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFBvcnROdW1iZXI7ICAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgIC8qIDA4aCAqLworICAgIFNHRV9NUElfVU5JT04gICAgICAgICAgIFNHX0xpc3RbMV07ICAgICAgICAgLyogMENoICovCit9IE1TR19MQU5fU0VORF9SRVFVRVNULCBNUElfUE9JTlRFUiBQVFJfTVNHX0xBTl9TRU5EX1JFUVVFU1QsCisgIExBTlNlbmRSZXF1ZXN0X3QsIE1QSV9QT0lOVEVSIHBMQU5TZW5kUmVxdWVzdF90OworCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfTEFOX1NFTkRfUkVQTFkKK3sKKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0xlbmd0aDsgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE51bWJlck9mQ29udGV4dHM7ICAgLyogMDVoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUG9ydE51bWJlcjsgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgLyogMDhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBJT0NTdGF0dXM7ICAgICAgICAgIC8qIDBFaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIElPQ0xvZ0luZm87ICAgICAgICAgLyogMTBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgQnVmZmVyQ29udGV4dDsgICAgICAvKiAxNGggKi8KK30gTVNHX0xBTl9TRU5EX1JFUExZLCBNUElfUE9JTlRFUiBQVFJfTVNHX0xBTl9TRU5EX1JFUExZLAorICBMQU5TZW5kUmVwbHlfdCwgTVBJX1BPSU5URVIgcExBTlNlbmRSZXBseV90OworCisKKy8qIExBTlJlY2VpdmVQb3N0ICovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfTEFOX1JFQ0VJVkVfUE9TVF9SRVFVRVNUCit7CisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7ICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDaGFpbk9mZnNldDsgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgLyogMDNoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBQb3J0TnVtYmVyOyAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAvKiAwOGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBCdWNrZXRDb3VudDsgICAgICAgIC8qIDBDaCAqLworICAgIFNHRV9NUElfVU5JT04gICAgICAgICAgIFNHX0xpc3RbMV07ICAgICAgICAgLyogMTBoICovCit9IE1TR19MQU5fUkVDRUlWRV9QT1NUX1JFUVVFU1QsIE1QSV9QT0lOVEVSIFBUUl9NU0dfTEFOX1JFQ0VJVkVfUE9TVF9SRVFVRVNULAorICBMQU5SZWNlaXZlUG9zdFJlcXVlc3RfdCwgTVBJX1BPSU5URVIgcExBTlJlY2VpdmVQb3N0UmVxdWVzdF90OworCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfTEFOX1JFQ0VJVkVfUE9TVF9SRVBMWQoreworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnTGVuZ3RoOyAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgIC8qIDAzaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZDb250ZXh0czsgICAvKiAwNWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBQb3J0TnVtYmVyOyAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAvKiAwOGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgIC8qIDBDaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIElPQ1N0YXR1czsgICAgICAgICAgLyogMEVoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgSU9DTG9nSW5mbzsgICAgICAgICAvKiAxMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBCdWNrZXRzUmVtYWluaW5nOyAgIC8qIDE0aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFBhY2tldE9mZnNldDsgICAgICAgLyogMThoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUGFja2V0TGVuZ3RoOyAgICAgICAvKiAxQ2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBCdWNrZXRDb250ZXh0WzFdOyAgIC8qIDIwaCAqLworfSBNU0dfTEFOX1JFQ0VJVkVfUE9TVF9SRVBMWSwgTVBJX1BPSU5URVIgUFRSX01TR19MQU5fUkVDRUlWRV9QT1NUX1JFUExZLAorICBMQU5SZWNlaXZlUG9zdFJlcGx5X3QsIE1QSV9QT0lOVEVSIHBMQU5SZWNlaXZlUG9zdFJlcGx5X3Q7CisKKworLyogTEFOUmVzZXQgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX01TR19MQU5fUkVTRVRfUkVRVUVTVAoreworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ2hhaW5PZmZzZXQ7ICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgIC8qIDAzaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUG9ydE51bWJlcjsgICAgICAgICAvKiAwNWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgLyogMDhoICovCit9IE1TR19MQU5fUkVTRVRfUkVRVUVTVCwgTVBJX1BPSU5URVIgUFRSX01TR19MQU5fUkVTRVRfUkVRVUVTVCwKKyAgTEFOUmVzZXRSZXF1ZXN0X3QsIE1QSV9QT0lOVEVSIHBMQU5SZXNldFJlcXVlc3RfdDsKKworCit0eXBlZGVmIHN0cnVjdCBfTVNHX0xBTl9SRVNFVF9SRVBMWQoreworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnTGVuZ3RoOyAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgIC8qIDAzaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUG9ydE51bWJlcjsgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgLyogMDhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBJT0NTdGF0dXM7ICAgICAgICAgIC8qIDBFaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIElPQ0xvZ0luZm87ICAgICAgICAgLyogMTBoICovCit9IE1TR19MQU5fUkVTRVRfUkVQTFksIE1QSV9QT0lOVEVSIFBUUl9NU0dfTEFOX1JFU0VUX1JFUExZLAorICBMQU5SZXNldFJlcGx5X3QsIE1QSV9QT0lOVEVSIHBMQU5SZXNldFJlcGx5X3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBMQU4gQ29udGV4dCBSZXBseSBkZWZpbmVzIGFuZCBtYWNyb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExBTl9SRVBMWV9QQUNLRVRfTEVOR1RIX01BU0sgICAgICAgICAgICAoMHgwMDAwRkZGRikKKyNkZWZpbmUgTEFOX1JFUExZX1BBQ0tFVF9MRU5HVEhfU0hJRlQgICAgICAgICAgICgwKQorI2RlZmluZSBMQU5fUkVQTFlfQlVDS0VUX0NPTlRFWFRfTUFTSyAgICAgICAgICAgKDB4MDdGRjAwMDApCisjZGVmaW5lIExBTl9SRVBMWV9CVUNLRVRfQ09OVEVYVF9TSElGVCAgICAgICAgICAoMTYpCisjZGVmaW5lIExBTl9SRVBMWV9CVUZGRVJfQ09OVEVYVF9NQVNLICAgICAgICAgICAoMHgwN0ZGRkZGRikKKyNkZWZpbmUgTEFOX1JFUExZX0JVRkZFUl9DT05URVhUX1NISUZUICAgICAgICAgICgwKQorI2RlZmluZSBMQU5fUkVQTFlfRk9STV9NQVNLICAgICAgICAgICAgICAgICAgICAgKDB4MTgwMDAwMDApCisjZGVmaW5lIExBTl9SRVBMWV9GT1JNX1JFQ0VJVkVfU0lOR0xFICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTEFOX1JFUExZX0ZPUk1fUkVDRUlWRV9NVUxUSVBMRSAgICAgICAgICgweDAxKQorI2RlZmluZSBMQU5fUkVQTFlfRk9STV9TRU5EX1NJTkdMRSAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIExBTl9SRVBMWV9GT1JNX01FU1NBR0VfQ09OVEVYVCAgICAgICAgICAoMHgwMykKKyNkZWZpbmUgTEFOX1JFUExZX0ZPUk1fU0hJRlQgICAgICAgICAgICAgICAgICAgICgyNykKKworI2RlZmluZSBHRVRfTEFOX1BBQ0tFVF9MRU5HVEgoeCkgICAgKCgoeCkgJiBMQU5fUkVQTFlfUEFDS0VUX0xFTkdUSF9NQVNLKSAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBMQU5fUkVQTFlfUEFDS0VUX0xFTkdUSF9TSElGVCkKKworI2RlZmluZSBTRVRfTEFOX1BBQ0tFVF9MRU5HVEgoeCwgbHRoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICgoeCkgPSAoKHgpICYgfkxBTl9SRVBMWV9QQUNLRVRfTEVOR1RIX01BU0spIHwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgobHRoKSA8PCBMQU5fUkVQTFlfUEFDS0VUX0xFTkdUSF9TSElGVCkgJiAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExBTl9SRVBMWV9QQUNLRVRfTEVOR1RIX01BU0spKQorCisjZGVmaW5lIEdFVF9MQU5fQlVDS0VUX0NPTlRFWFQoeCkgICAoKCh4KSAmIExBTl9SRVBMWV9CVUNLRVRfQ09OVEVYVF9NQVNLKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IExBTl9SRVBMWV9CVUNLRVRfQ09OVEVYVF9TSElGVCkKKworI2RlZmluZSBTRVRfTEFOX0JVQ0tFVF9DT05URVhUKHgsIGN0eCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICgoeCkgPSAoKHgpICYgfkxBTl9SRVBMWV9CVUNLRVRfQ09OVEVYVF9NQVNLKSB8ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoY3R4KSA8PCBMQU5fUkVQTFlfQlVDS0VUX0NPTlRFWFRfU0hJRlQpICYgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExBTl9SRVBMWV9CVUNLRVRfQ09OVEVYVF9NQVNLKSkKKworI2RlZmluZSBHRVRfTEFOX0JVRkZFUl9DT05URVhUKHgpICAgKCgoeCkgJiBMQU5fUkVQTFlfQlVGRkVSX0NPTlRFWFRfTUFTSykgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBMQU5fUkVQTFlfQlVGRkVSX0NPTlRFWFRfU0hJRlQpCisKKyNkZWZpbmUgU0VUX0xBTl9CVUZGRVJfQ09OVEVYVCh4LCBjdHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoKHgpID0gKCh4KSAmIH5MQU5fUkVQTFlfQlVGRkVSX0NPTlRFWFRfTUFTSykgfCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGN0eCkgPDwgTEFOX1JFUExZX0JVRkZFUl9DT05URVhUX1NISUZUKSAmICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQU5fUkVQTFlfQlVGRkVSX0NPTlRFWFRfTUFTSykpCisKKyNkZWZpbmUgR0VUX0xBTl9GT1JNKHgpICAgICAgICAgICAgICgoKHgpICYgTEFOX1JFUExZX0ZPUk1fTUFTSykgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gTEFOX1JFUExZX0ZPUk1fU0hJRlQpCisKKyNkZWZpbmUgU0VUX0xBTl9GT1JNKHgsIGZybSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoKHgpID0gKCh4KSAmIH5MQU5fUkVQTFlfRk9STV9NQVNLKSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGZybSkgPDwgTEFOX1JFUExZX0ZPUk1fU0hJRlQpICYgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQU5fUkVQTFlfRk9STV9NQVNLKSkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIExBTiBDdXJyZW50IERldmljZSBTdGF0ZSBkZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVBJX0xBTl9ERVZJQ0VfU1RBVEVfUkVTRVQgICAgICAgICAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX0xBTl9ERVZJQ0VfU1RBVEVfT1BFUkFUSU9OQUwgICAgICAgICAgICAgICAoMHgwMSkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIExBTiBMb29wYmFjayBkZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVBJX0xBTl9UWF9NT0RFU19FTkFCTEVfTE9PUEJBQ0tfU1VQUFJFU1NJT04gICAoMHgwMSkKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9yYWlkLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfcmFpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ODBhOWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfcmFpZC5oCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAwMS0yMDAzIExTSSBMb2dpYyBDb3Jwb3JhdGlvbi4KKyAqCisgKgorICogICAgICAgICAgIE5hbWU6ICBtcGlfcmFpZC5oCisgKiAgICAgICAgICBUaXRsZTogIE1QSSBSQUlEIG1lc3NhZ2UgYW5kIHN0cnVjdHVyZXMKKyAqICBDcmVhdGlvbiBEYXRlOiAgRmVicnVhcnkgMjcsIDIwMDEKKyAqCisgKiAgICBtcGlfcmFpZC5oIFZlcnNpb246ICAwMS4wNS54eAorICoKKyAqICBWZXJzaW9uIEhpc3RvcnkKKyAqICAtLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgRGF0ZSAgICAgIFZlcnNpb24gICBEZXNjcmlwdGlvbgorICogIC0tLS0tLS0tICAtLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgMDItMjctMDEgIDAxLjAxLjAxICBPcmlnaW5hbCByZWxlYXNlIGZvciB0aGlzIGZpbGUuCisgKiAgMDMtMjctMDEgIDAxLjAxLjAyICBBZGRlZCBzdHJ1Y3R1cmUgb2Zmc2V0IGNvbW1lbnRzLgorICogIDA4LTA4LTAxICAwMS4wMi4wMSAgT3JpZ2luYWwgcmVsZWFzZSBmb3IgdjEuMiB3b3JrLgorICogIDA5LTI4LTAxICAwMS4wMi4wMiAgTWFqb3IgcmV3b3JrIGZvciBNUEkgdjEuMiBJbnRlZ3JhdGVkIFJBSUQgY2hhbmdlcy4KKyAqICAxMC0wNC0wMSAgMDEuMDIuMDMgIEFkZGVkIEFjdGlvbkRhdGEgZGVmaW5lcyBmb3IKKyAqICAgICAgICAgICAgICAgICAgICAgIE1QSV9SQUlEX0FDVElPTl9ERUxFVEVfVk9MVU1FIGFjdGlvbi4KKyAqICAxMS0wMS0wMSAgMDEuMDIuMDQgIEFkZGVkIGRlZmluZSBmb3IgTVBJX1JBSURfQUNUSU9OX0FEQVRBX0RPX05PVF9TWU5DLgorICogIDAzLTE0LTAyICAwMS4wMi4wNSAgQWRkZWQgZGVmaW5lIGZvciBNUElfUkFJRF9BQ1RJT05fQURBVEFfTE9XX0xFVkVMX0lOSVQuCisgKiAgMDUtMDctMDIgIDAxLjAyLjA2ICBBZGRlZCBkZWZpbmUgZm9yIE1QSV9SQUlEX0FDVElPTl9BQ1RJVkFURV9WT0xVTUUsCisgKiAgICAgICAgICAgICAgICAgICAgICBNUElfUkFJRF9BQ1RJT05fSU5BQ1RJVkFURV9WT0xVTUUsIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgTVBJX1JBSURfQUNUSU9OX0FEQVRBX0lOQUNUSVZBVEVfQUxMLgorICogIDA3LTEyLTAyICAwMS4wMi4wNyAgQWRkZWQgc3RydWN0dXJlcyBmb3IgTWFpbGJveCByZXF1ZXN0IGFuZCByZXBseS4KKyAqICAxMS0xNS0wMiAgMDEuMDIuMDggIEFkZGVkIG1pc3NpbmcgTXNnQ29udGV4dCBmaWVsZCB0byBNU0dfTUFJTEJPWF9SRVFVRVNULgorICogIDA0LTAxLTAzICAwMS4wMi4wOSAgTmV3IGFjdGlvbiBkYXRhIG9wdGlvbiBmbGFnIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgTVBJX1JBSURfQUNUSU9OX0RFTEVURV9WT0xVTUUuCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIE1QSV9SQUlEX0gKKyNkZWZpbmUgTVBJX1JBSURfSAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgIFIgQSBJIEQgICAgTSBlIHMgcyBhIGcgZSBzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUkFJRCBBY3Rpb24gUmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX01TR19SQUlEX0FDVElPTgoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjsgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDaGFpbk9mZnNldDsgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgLyogMDNoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgVm9sdW1lSUQ7ICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVCdXM7ICAgICAgICAgIC8qIDA1aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFBoeXNEaXNrTnVtOyAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgIC8qIDA4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgLyogMENoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRGF0YVdvcmQ7ICAgICAvKiAxMGggKi8KKyAgICBTR0VfU0lNUExFX1VOSU9OICAgICAgICBBY3Rpb25EYXRhU0dFOyAgICAgIC8qIDE0aCAqLworfSBNU0dfUkFJRF9BQ1RJT05fUkVRVUVTVCwgTVBJX1BPSU5URVIgUFRSX01TR19SQUlEX0FDVElPTl9SRVFVRVNULAorICBNcGlSYWlkQWN0aW9uUmVxdWVzdF90ICwgTVBJX1BPSU5URVIgcE1waVJhaWRBY3Rpb25SZXF1ZXN0X3Q7CisKKworLyogUkFJRCBBY3Rpb24gcmVxdWVzdCBBY3Rpb24gdmFsdWVzICovCisKKyNkZWZpbmUgTVBJX1JBSURfQUNUSU9OX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX1JBSURfQUNUSU9OX0lORElDQVRPUl9TVFJVQ1QgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX1JBSURfQUNUSU9OX0NSRUFURV9WT0xVTUUgICAgICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJX1JBSURfQUNUSU9OX0RFTEVURV9WT0xVTUUgICAgICAgICAgICAgICAoMHgwMykKKyNkZWZpbmUgTVBJX1JBSURfQUNUSU9OX0RJU0FCTEVfVk9MVU1FICAgICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgTVBJX1JBSURfQUNUSU9OX0VOQUJMRV9WT0xVTUUgICAgICAgICAgICAgICAoMHgwNSkKKyNkZWZpbmUgTVBJX1JBSURfQUNUSU9OX1FVSUVTQ0VfUEhZU19JTyAgICAgICAgICAgICAoMHgwNikKKyNkZWZpbmUgTVBJX1JBSURfQUNUSU9OX0VOQUJMRV9QSFlTX0lPICAgICAgICAgICAgICAoMHgwNykKKyNkZWZpbmUgTVBJX1JBSURfQUNUSU9OX0NIQU5HRV9WT0xVTUVfU0VUVElOR1MgICAgICAoMHgwOCkKKyNkZWZpbmUgTVBJX1JBSURfQUNUSU9OX1BIWVNESVNLX09GRkxJTkUgICAgICAgICAgICAoMHgwQSkKKyNkZWZpbmUgTVBJX1JBSURfQUNUSU9OX1BIWVNESVNLX09OTElORSAgICAgICAgICAgICAoMHgwQikKKyNkZWZpbmUgTVBJX1JBSURfQUNUSU9OX0NIQU5HRV9QSFlTRElTS19TRVRUSU5HUyAgICAoMHgwQykKKyNkZWZpbmUgTVBJX1JBSURfQUNUSU9OX0NSRUFURV9QSFlTRElTSyAgICAgICAgICAgICAoMHgwRCkKKyNkZWZpbmUgTVBJX1JBSURfQUNUSU9OX0RFTEVURV9QSFlTRElTSyAgICAgICAgICAgICAoMHgwRSkKKyNkZWZpbmUgTVBJX1JBSURfQUNUSU9OX0ZBSUxfUEhZU0RJU0sgICAgICAgICAgICAgICAoMHgwRikKKyNkZWZpbmUgTVBJX1JBSURfQUNUSU9OX1JFUExBQ0VfUEhZU0RJU0sgICAgICAgICAgICAoMHgxMCkKKyNkZWZpbmUgTVBJX1JBSURfQUNUSU9OX0FDVElWQVRFX1ZPTFVNRSAgICAgICAgICAgICAoMHgxMSkKKyNkZWZpbmUgTVBJX1JBSURfQUNUSU9OX0lOQUNUSVZBVEVfVk9MVU1FICAgICAgICAgICAoMHgxMikKKworLyogQWN0aW9uRGF0YVdvcmQgZGVmaW5lcyBmb3IgdXNlIHdpdGggTVBJX1JBSURfQUNUSU9OX0NSRUFURV9WT0xVTUUgYWN0aW9uICovCisjZGVmaW5lIE1QSV9SQUlEX0FDVElPTl9BREFUQV9ET19OT1RfU1lOQyAgICAgICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIE1QSV9SQUlEX0FDVElPTl9BREFUQV9MT1dfTEVWRUxfSU5JVCAgICAgICAgKDB4MDAwMDAwMDIpCisKKy8qIEFjdGlvbkRhdGFXb3JkIGRlZmluZXMgZm9yIHVzZSB3aXRoIE1QSV9SQUlEX0FDVElPTl9ERUxFVEVfVk9MVU1FIGFjdGlvbiAqLworI2RlZmluZSBNUElfUkFJRF9BQ1RJT05fQURBVEFfS0VFUF9QSFlTX0RJU0tTICAgICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBNUElfUkFJRF9BQ1RJT05fQURBVEFfREVMX1BIWVNfRElTS1MgICAgICAgICgweDAwMDAwMDAxKQorCisjZGVmaW5lIE1QSV9SQUlEX0FDVElPTl9BREFUQV9LRUVQX0xCQTAgICAgICAgICAgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIE1QSV9SQUlEX0FDVElPTl9BREFUQV9aRVJPX0xCQTAgICAgICAgICAgICAgKDB4MDAwMDAwMDIpCisKKy8qIEFjdGlvbkRhdGFXb3JkIGRlZmluZXMgZm9yIHVzZSB3aXRoIE1QSV9SQUlEX0FDVElPTl9BQ1RJVkFURV9WT0xVTUUgYWN0aW9uICovCisjZGVmaW5lIE1QSV9SQUlEX0FDVElPTl9BREFUQV9JTkFDVElWQVRFX0FMTCAgICAgICAgKDB4MDAwMDAwMDEpCisKKworLyogUkFJRCBBY3Rpb24gcmVwbHkgbWVzc2FnZSAqLworCit0eXBlZGVmIHN0cnVjdCBfTVNHX1JBSURfQUNUSU9OX1JFUExZCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOyAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0xlbmd0aDsgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVJRDsgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZUJ1czsgICAgICAgICAgLyogMDVoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUGh5c0Rpc2tOdW07ICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgLyogMDhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgQWN0aW9uU3RhdHVzOyAgICAgICAvKiAwQ2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBJT0NTdGF0dXM7ICAgICAgICAgIC8qIDBFaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIElPQ0xvZ0luZm87ICAgICAgICAgLyogMTBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU3RhdHVzOyAgICAgICAvKiAxNGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBBY3Rpb25EYXRhOyAgICAgICAgIC8qIDE4aCAqLworfSBNU0dfUkFJRF9BQ1RJT05fUkVQTFksIE1QSV9QT0lOVEVSIFBUUl9NU0dfUkFJRF9BQ1RJT05fUkVQTFksCisgIE1waVJhaWRBY3Rpb25SZXBseV90LCBNUElfUE9JTlRFUiBwTXBpUmFpZEFjdGlvblJlcGx5X3Q7CisKKworLyogUkFJRCBWb2x1bWUgcmVwbHkgQWN0aW9uU3RhdHVzIHZhbHVlcyAqLworCisjZGVmaW5lIE1QSV9SQUlEX0FDVElPTl9BU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgKDB4MDAwMCkKKyNkZWZpbmUgTVBJX1JBSURfQUNUSU9OX0FTVEFUVVNfSU5WQUxJRF9BQ1RJT04gICAgICAoMHgwMDAxKQorI2RlZmluZSBNUElfUkFJRF9BQ1RJT05fQVNUQVRVU19GQUlMVVJFICAgICAgICAgICAgICgweDAwMDIpCisjZGVmaW5lIE1QSV9SQUlEX0FDVElPTl9BU1RBVFVTX0lOX1BST0dSRVNTICAgICAgICAgKDB4MDAwMykKKworCisvKiBSQUlEIFZvbHVtZSByZXBseSBSQUlEIFZvbHVtZSBJbmRpY2F0b3Igc3RydWN0dXJlICovCisKK3R5cGVkZWYgc3RydWN0IF9NUElfUkFJRF9WT0xfSU5ESUNBVE9SCit7CisgICAgVTY0ICAgICAgICAgICAgICAgICAgICAgVG90YWxCbG9ja3M7ICAgICAgICAvKiAwMGggKi8KKyAgICBVNjQgICAgICAgICAgICAgICAgICAgICBCbG9ja3NSZW1haW5pbmc7ICAgIC8qIDA4aCAqLworfSBNUElfUkFJRF9WT0xfSU5ESUNBVE9SLCBNUElfUE9JTlRFUiBQVFJfTVBJX1JBSURfVk9MX0lORElDQVRPUiwKKyAgTXBpUmFpZFZvbEluZGljYXRvcl90LCBNUElfUE9JTlRFUiBwTXBpUmFpZFZvbEluZGljYXRvcl90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU0NTSSBJTyBSQUlEIFBhc3N0aHJvdWdoIFJlcXVlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX01TR19TQ1NJX0lPX1JBSURfUFRfUkVRVUVTVAoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFBoeXNEaXNrTnVtOyAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDaGFpbk9mZnNldDsgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgLyogMDNoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ0RCTGVuZ3RoOyAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBTZW5zZUJ1ZmZlckxlbmd0aDsgIC8qIDA1aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgIC8qIDA4aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIExVTls4XTsgICAgICAgICAgICAgLyogMENoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgQ29udHJvbDsgICAgICAgICAgICAvKiAxNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDREJbMTZdOyAgICAgICAgICAgIC8qIDE4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIERhdGFMZW5ndGg7ICAgICAgICAgLyogMjhoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgU2Vuc2VCdWZmZXJMb3dBZGRyOyAvKiAyQ2ggKi8KKyAgICBTR0VfSU9fVU5JT04gICAgICAgICAgICBTR0w7ICAgICAgICAgICAgICAgIC8qIDMwaCAqLworfSBNU0dfU0NTSV9JT19SQUlEX1BUX1JFUVVFU1QsIE1QSV9QT0lOVEVSIFBUUl9NU0dfU0NTSV9JT19SQUlEX1BUX1JFUVVFU1QsCisgIFNDU0lJT1JhaWRQYXNzdGhyb3VnaFJlcXVlc3RfdCwgTVBJX1BPSU5URVIgcFNDU0lJT1JhaWRQYXNzdGhyb3VnaFJlcXVlc3RfdDsKKworCisvKiBTQ1NJIElPIFJBSUQgUGFzc3Rocm91Z2ggcmVwbHkgc3RydWN0dXJlICovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfU0NTSV9JT19SQUlEX1BUX1JFUExZCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUGh5c0Rpc2tOdW07ICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0xlbmd0aDsgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDREJMZW5ndGg7ICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFNlbnNlQnVmZmVyTGVuZ3RoOyAgLyogMDVoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgLyogMDhoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgU0NTSVN0YXR1czsgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBTQ1NJU3RhdGU7ICAgICAgICAgIC8qIDBEaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIElPQ1N0YXR1czsgICAgICAgICAgLyogMEVoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgSU9DTG9nSW5mbzsgICAgICAgICAvKiAxMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBUcmFuc2ZlckNvdW50OyAgICAgIC8qIDE0aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFNlbnNlQ291bnQ7ICAgICAgICAgLyogMThoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2VJbmZvOyAgICAgICAvKiAxQ2ggKi8KK30gTVNHX1NDU0lfSU9fUkFJRF9QVF9SRVBMWSwgTVBJX1BPSU5URVIgUFRSX01TR19TQ1NJX0lPX1JBSURfUFRfUkVQTFksCisgIFNDU0lJT1JhaWRQYXNzdGhyb3VnaFJlcGx5X3QsIE1QSV9QT0lOVEVSIHBTQ1NJSU9SYWlkUGFzc3Rocm91Z2hSZXBseV90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTWFpbGJveCByZXFldXN0IHN0cnVjdHVyZSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfTUFJTEJPWF9SRVFVRVNUCit7CisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENoYWluT2Zmc2V0OworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7CisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kWzEwXTsKKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7CisgICAgU0dFX0lPX1VOSU9OICAgICAgICAgICAgU0dMOworfSBNU0dfTUFJTEJPWF9SRVFVRVNULCBNUElfUE9JTlRFUiBQVFJfTVNHX01BSUxCT1hfUkVRVUVTVCwKKyAgTWFpbGJveFJlcXVlc3RfdCwgTVBJX1BPSU5URVIgcE1haWxib3hSZXF1ZXN0X3Q7CisKKworLyogTWFpbGJveCByZXBseSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IF9NU0dfTUFJTEJPWF9SRVBMWQoreworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnTGVuZ3RoOyAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgIC8qIDAzaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgLyogMDhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgTWFpbGJveFN0YXR1czsgICAgICAvKiAwQ2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBJT0NTdGF0dXM7ICAgICAgICAgIC8qIDBFaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIElPQ0xvZ0luZm87ICAgICAgICAgLyogMTBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ0OyAgICAgICAgICAvKiAxNGggKi8KK30gTVNHX01BSUxCT1hfUkVQTFksIE1QSV9QT0lOVEVSIFBUUl9NU0dfTUFJTEJPWF9SRVBMWSwKKyAgTWFpbGJveFJlcGx5X3QsIE1QSV9QT0lOVEVSIHBNYWlsYm94UmVwbHlfdDsKKworI2VuZGlmCisKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfc2FzLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfc2FzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I4NzhmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9zYXMuaApAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMgTFNJIExvZ2ljIENvcnBvcmF0aW9uLgorICoKKyAqCisgKiAgICAgICAgICAgTmFtZTogIG1waV9zYXMuaAorICogICAgICAgICAgVGl0bGU6ICBNUEkgU2VyaWFsIEF0dGFjaGVkIFNDU0kgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMKKyAqICBDcmVhdGlvbiBEYXRlOiAgQXByaWwgMjMsIDIwMDMKKyAqCisgKiAgICBtcGlfc2FzLmggVmVyc2lvbjogIDAxLjA1Lnh4CisgKgorICogIFZlcnNpb24gSGlzdG9yeQorICogIC0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBEYXRlICAgICAgVmVyc2lvbiAgIERlc2NyaXB0aW9uCisgKiAgLS0tLS0tLS0gIC0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICB4eC15eS16eiAgMDEuMDUuMDEgIE9yaWdpbmFsIHJlbGVhc2UuCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIE1QSV9TQVNfSAorI2RlZmluZSBNUElfU0FTX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICBTIGUgciBpIGEgbCAgICBBIHQgdCBhIGMgaCBlIGQgICAgUyBDIFMgSSAgICAgTSBlIHMgcyBhIGcgZSBzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTZXJpYWwgTWFuYWdlbWVudCBQcm90b2NvbCBQYXNzdGhyb3VnaCBSZXF1ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfTVNHX1NNUF9QQVNTVEhST1VHSF9SRVFVRVNUCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUGFzc3Rocm91Z2hGbGFnczsgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBQaHlzaWNhbFBvcnQ7ICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENoYWluT2Zmc2V0OyAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0RGF0YUxlbmd0aDsgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25SYXRlOyAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgIC8qIDA4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgLyogMENoICovCisgICAgVTY0ICAgICAgICAgICAgICAgICAgICAgU0FTQWRkcmVzczsgICAgICAgICAvKiAxMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgIC8qIDE4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgLyogMUNoICovCisgICAgU0dFX1NJTVBMRV9VTklPTiAgICAgICAgU0dMOyAgICAgICAgICAgICAgICAvKiAyMGggKi8KK30gTVNHX1NNUF9QQVNTVEhST1VHSF9SRVFVRVNULCBNUElfUE9JTlRFUiBQVFJfTVNHX1NNUF9QQVNTVEhST1VHSF9SRVFVRVNULAorICBTbXBQYXNzdGhyb3VnaFJlcXVlc3RfdCwgTVBJX1BPSU5URVIgcFNtcFBhc3N0aHJvdWdoUmVxdWVzdF90OworCisjZGVmaW5lIE1QSV9TTVBfUFRfUkVRX1BUX0ZMQUdTX0lNTUVESUFURSAgICAgICAoMHg4MCkKKworI2RlZmluZSBNUElfU01QX1BUX1JFUV9DT05ORUNUX1JBVEVfTkVHT1RJQVRFRCAgKDB4MDApCisjZGVmaW5lIE1QSV9TTVBfUFRfUkVRX0NPTk5FQ1RfUkFURV8xXzUgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTVBJX1NNUF9QVF9SRVFfQ09OTkVDVF9SQVRFXzNfMCAgICAgICAgICgweDA5KQorCisKKy8qIFNlcmlhbCBNYW5hZ2VtZW50IFByb3RvY29sIFBhc3N0aHJvdWdoIFJlcGx5ICovCit0eXBlZGVmIHN0cnVjdCBfTVNHX1NNUF9QQVNTVEhST1VHSF9SRVBMWQoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFBhc3N0aHJvdWdoRmxhZ3M7ICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUGh5c2ljYWxQb3J0OyAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dMZW5ndGg7ICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgLyogMDNoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2VEYXRhTGVuZ3RoOyAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAvKiAwOGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgIC8qIDBDaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFNBU1N0YXR1czsgICAgICAgICAgLyogMERoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSU9DU3RhdHVzOyAgICAgICAgICAvKiAwRWggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBJT0NMb2dJbmZvOyAgICAgICAgIC8qIDEwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgLyogMTRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2VEYXRhWzRdOyAgICAvKiAxOGggKi8KK30gTVNHX1NNUF9QQVNTVEhST1VHSF9SRVBMWSwgTVBJX1BPSU5URVIgUFRSX01TR19TTVBfUEFTU1RIUk9VR0hfUkVQTFksCisgIFNtcFBhc3N0aHJvdWdoUmVwbHlfdCwgTVBJX1BPSU5URVIgcFNtcFBhc3N0aHJvdWdoUmVwbHlfdDsKKworI2RlZmluZSBNUElfU01QX1BUX1JFUExZX1BUX0ZMQUdTX0lNTUVESUFURSAgICAgKDB4ODApCisKKy8qIHZhbHVlcyBmb3IgdGhlIFNBU1N0YXR1cyBmaWVsZCAqLworI2RlZmluZSBNUElfU0FTU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX1NBU1NUQVRVU19VTktOT1dOX0VSUk9SICAgICAgICAgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSV9TQVNTVEFUVVNfSU5WQUxJRF9GUkFNRSAgICAgICAgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfU0FTU1RBVFVTX1VUQ19CQURfREVTVCAgICAgICAgICAgICAgICAgICAgICAoMHgwMykKKyNkZWZpbmUgTVBJX1NBU1NUQVRVU19VVENfQlJFQUtfUkVDRUlWRUQgICAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9TQVNTVEFUVVNfVVRDX0NPTk5FQ1RfUkFURV9OT1RfU1VQUE9SVEVEICAgICgweDA1KQorI2RlZmluZSBNUElfU0FTU1RBVFVTX1VUQ19QT1JUX0xBWUVSX1JFUVVFU1QgICAgICAgICAgICAoMHgwNikKKyNkZWZpbmUgTVBJX1NBU1NUQVRVU19VVENfUFJPVE9DT0xfTk9UX1NVUFBPUlRFRCAgICAgICAgKDB4MDcpCisjZGVmaW5lIE1QSV9TQVNTVEFUVVNfVVRDX1NUUF9SRVNPVVJDRVNfQlVTWSAgICAgICAgICAgICgweDA4KQorI2RlZmluZSBNUElfU0FTU1RBVFVTX1VUQ19XUk9OR19ERVNUSU5BVElPTiAgICAgICAgICAgICAoMHgwOSkKKyNkZWZpbmUgTVBJX1NBU1NUQVRVU19TSE9SVF9JTkZPUk1BVElPTl9VTklUICAgICAgICAgICAgKDB4MEEpCisjZGVmaW5lIE1QSV9TQVNTVEFUVVNfTE9OR19JTkZPUk1BVElPTl9VTklUICAgICAgICAgICAgICgweDBCKQorI2RlZmluZSBNUElfU0FTU1RBVFVTX1hGRVJfUkRZX0lOQ09SUkVDVF9XUklURV9EQVRBICAgICAoMHgwQykKKyNkZWZpbmUgTVBJX1NBU1NUQVRVU19YRkVSX1JEWV9SRVFVRVNUX09GRlNFVF9FUlJPUiAgICAgKDB4MEQpCisjZGVmaW5lIE1QSV9TQVNTVEFUVVNfWEZFUl9SRFlfTk9UX0VYUEVDVEVEICAgICAgICAgICAgICgweDBFKQorI2RlZmluZSBNUElfU0FTU1RBVFVTX0RBVEFfSU5DT1JSRUNUX0RBVEFfTEVOR1RIICAgICAgICAoMHgwRikKKyNkZWZpbmUgTVBJX1NBU1NUQVRVU19EQVRBX1RPT19NVUNIX1JFQURfREFUQSAgICAgICAgICAgKDB4MTApCisjZGVmaW5lIE1QSV9TQVNTVEFUVVNfREFUQV9PRkZTRVRfRVJST1IgICAgICAgICAgICAgICAgICgweDExKQorI2RlZmluZSBNUElfU0FTU1RBVFVTX1NEU0ZfTkFLX1JFQ0VJVkVEICAgICAgICAgICAgICAgICAoMHgxMikKKyNkZWZpbmUgTVBJX1NBU1NUQVRVU19TRFNGX0NPTk5FQ1RJT05fRkFJTEVEICAgICAgICAgICAgKDB4MTMpCisjZGVmaW5lIE1QSV9TQVNTVEFUVVNfSU5JVElBVE9SX1JFU1BPTlNFX1RJTUVPVVQgICAgICAgICgweDE0KQorCisKKy8qCisgKiBWYWx1ZXMgZm9yIHRoZSBTQVMgRGV2aWNlSW5mbyBmaWVsZCB1c2VkIGluIFNBUyBEZXZpY2UgU3RhdHVzIENoYW5nZSBFdmVudAorICogZGF0YSBhbmQgU0FTIElPIFVuaXQgQ29uZmlndXJhdGlvbiBwYWdlcy4KKyAqLworI2RlZmluZSBNUElfU0FTX0RFVklDRV9JTkZPX0FUQVBJX0RFVklDRSAgICAgICAgKDB4MDAwMDIwMDApCisjZGVmaW5lIE1QSV9TQVNfREVWSUNFX0lORk9fTFNJX0RFVklDRSAgICAgICAgICAoMHgwMDAwMTAwMCkKKyNkZWZpbmUgTVBJX1NBU19ERVZJQ0VfSU5GT19ESVJFQ1RfQVRUQUNIICAgICAgICgweDAwMDAwODAwKQorI2RlZmluZSBNUElfU0FTX0RFVklDRV9JTkZPX1NTUF9UQVJHRVQgICAgICAgICAgKDB4MDAwMDA0MDApCisjZGVmaW5lIE1QSV9TQVNfREVWSUNFX0lORk9fU1RQX1RBUkdFVCAgICAgICAgICAoMHgwMDAwMDIwMCkKKyNkZWZpbmUgTVBJX1NBU19ERVZJQ0VfSU5GT19TTVBfVEFSR0VUICAgICAgICAgICgweDAwMDAwMTAwKQorI2RlZmluZSBNUElfU0FTX0RFVklDRV9JTkZPX1NBVEFfREVWSUNFICAgICAgICAgKDB4MDAwMDAwODApCisjZGVmaW5lIE1QSV9TQVNfREVWSUNFX0lORk9fU1NQX0lOSVRJQVRPUiAgICAgICAoMHgwMDAwMDA0MCkKKyNkZWZpbmUgTVBJX1NBU19ERVZJQ0VfSU5GT19TVFBfSU5JVElBVE9SICAgICAgICgweDAwMDAwMDIwKQorI2RlZmluZSBNUElfU0FTX0RFVklDRV9JTkZPX1NNUF9JTklUSUFUT1IgICAgICAgKDB4MDAwMDAwMTApCisjZGVmaW5lIE1QSV9TQVNfREVWSUNFX0lORk9fU0FUQV9IT1NUICAgICAgICAgICAoMHgwMDAwMDAwOCkKKworI2RlZmluZSBNUElfU0FTX0RFVklDRV9JTkZPX01BU0tfREVWSUNFX1RZUEUgICAgKDB4MDAwMDAwMDcpCisjZGVmaW5lIE1QSV9TQVNfREVWSUNFX0lORk9fTk9fREVWSUNFICAgICAgICAgICAoMHgwMDAwMDAwMCkKKyNkZWZpbmUgTVBJX1NBU19ERVZJQ0VfSU5GT19FTkRfREVWSUNFICAgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBNUElfU0FTX0RFVklDRV9JTkZPX0VER0VfRVhQQU5ERVIgICAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIE1QSV9TQVNfREVWSUNFX0lORk9fRkFOT1VUX0VYUEFOREVSICAgICAoMHgwMDAwMDAwMykKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNBUyBJTyBVbml0IENvbnRyb2wgUmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfU0FTX0lPVU5JVF9DT05UUk9MX1JFUVVFU1QKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb247ICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ2hhaW5PZmZzZXQ7ICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgIC8qIDAzaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgLyogMDhoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0SUQ7ICAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBCdXM7ICAgICAgICAgICAgICAgIC8qIDBEaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFBoeU51bTsgICAgICAgICAgICAgLyogMEVoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ0OyAgICAgICAgICAvKiAwRmggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDU7ICAgICAgICAgIC8qIDEwaCAqLworICAgIFU2NCAgICAgICAgICAgICAgICAgICAgIFNBU0FkZHJlc3M7ICAgICAgICAgLyogMTRoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ2OyAgICAgICAgICAvKiAxQ2ggKi8KK30gTVNHX1NBU19JT1VOSVRfQ09OVFJPTF9SRVFVRVNULCBNUElfUE9JTlRFUiBQVFJfTVNHX1NBU19JT1VOSVRfQ09OVFJPTF9SRVFVRVNULAorICBTYXNJb1VuaXRDb250cm9sUmVxdWVzdF90LCBNUElfUE9JTlRFUiBwU2FzSW9Vbml0Q29udHJvbFJlcXVlc3RfdDsKKworLyogdmFsdWVzIGZvciB0aGUgLi4uIGZpZWxkICovCisjZGVmaW5lIE1QSV9TQVNfT1BfQ0xFQVJfTk9UX1BSRVNFTlQgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSV9TQVNfT1BfQ0xFQVJfQUxMICAgICAgICAgICAgICAgICAgICAgKDB4MDIpCisjZGVmaW5lIE1QSV9TQVNfT1BfTUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDMpCisjZGVmaW5lIE1QSV9TQVNfT1BfTU9WRSAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIE1QSV9TQVNfT1BfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDUpCisjZGVmaW5lIE1QSV9TQVNfT1BfUEhZX0xJTktfUkVTRVQgICAgICAgICAgICAgICAgKDB4MDYpCisjZGVmaW5lIE1QSV9TQVNfT1BfUEhZX0hBUkRfUkVTRVQgICAgICAgICAgICAgICAgKDB4MDcpCisjZGVmaW5lIE1QSV9TQVNfT1BfUEhZX0NMRUFSX0VSUk9SX0xPRyAgICAgICAgICAgKDB4MDgpCisKKworLyogU0FTIElPIFVuaXQgQ29udHJvbCBSZXBseSAqLwordHlwZWRlZiBzdHJ1Y3QgX01TR19TQVNfSU9VTklUX0NPTlRST0xfUkVQTFkKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb247ICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnTGVuZ3RoOyAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgIC8qIDAzaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgLyogMDhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ0OyAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBJT0NTdGF0dXM7ICAgICAgICAgIC8qIDBFaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIElPQ0xvZ0luZm87ICAgICAgICAgLyogMTBoICovCit9IE1TR19TQVNfSU9VTklUX0NPTlRST0xfUkVQTFksIE1QSV9QT0lOVEVSIFBUUl9NU0dfU0FTX0lPVU5JVF9DT05UUk9MX1JFUExZLAorICBTYXNJb1VuaXRDb250cm9sUmVwbHlfdCwgTVBJX1BPSU5URVIgcFNhc0lvVW5pdENvbnRyb2xSZXBseV90OworCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfdGFyZy5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX3RhcmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDRkYzg1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX3RhcmcuaApAQCAtMCwwICsxLDQzNSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBMU0kgTG9naWMgQ29ycG9yYXRpb24uCisgKgorICoKKyAqICAgICAgICAgICBOYW1lOiAgbXBpX3RhcmcuaAorICogICAgICAgICAgVGl0bGU6ICBNUEkgVGFyZ2V0IG1vZGUgbWVzc2FnZXMgYW5kIHN0cnVjdHVyZXMKKyAqICBDcmVhdGlvbiBEYXRlOiAgSnVuZSAyMiwgMjAwMAorICoKKyAqICAgIG1waV90YXJnLmggVmVyc2lvbjogIDAxLjA1Lnh4CisgKgorICogIFZlcnNpb24gSGlzdG9yeQorICogIC0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBEYXRlICAgICAgVmVyc2lvbiAgIERlc2NyaXB0aW9uCisgKiAgLS0tLS0tLS0gIC0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAwNS0wOC0wMCAgMDAuMTAuMDEgIE9yaWdpbmFsIHJlbGVhc2UgZm9yIDAuMTAgc3BlYyBkYXRlZCA0LzI2LzIwMDAuCisgKiAgMDYtMDYtMDAgIDAxLjAwLjAxICBVcGRhdGUgdmVyc2lvbiBudW1iZXIgZm9yIDEuMCByZWxlYXNlLgorICogIDA2LTIyLTAwICAwMS4wMC4wMiAgQWRkZWQgX01TR19UQVJHRVRfQ01EX0JVRkZFUl9QT1NUX1JFUExZIHN0cnVjdHVyZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIENvcnJlY3RlZCBERUNTUklQVE9SIHR5cG8gdG8gREVTQ1JJUFRPUi4KKyAqICAxMS0wMi0wMCAgMDEuMDEuMDEgIE9yaWdpbmFsIHJlbGVhc2UgZm9yIHBvc3QgMS4wIHdvcmsKKyAqICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWVkIHRhcmdldCBtb2RlIHRvIHVzZSBJb0luZGV4IGluc3RlYWQgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgIEhvc3RJbmRleCBhbmQgSW9jSW5kZXguIEFkZGVkIEFsaWFzLgorICogIDAxLTA5LTAxICAwMS4wMS4wMiAgQWRkZWQgZGVmaW5lcyBmb3IgVEFSR0VUX0FTU0lTVF9GTEFHU19SRVBPU1RfQ01EX0JVRkZFUgorICogICAgICAgICAgICAgICAgICAgICAgYW5kIFRBUkdFVF9TVEFUVVNfU0VORF9GTEFHU19SRVBPU1RfQ01EX0JVRkZFUi4KKyAqICAwMi0yMC0wMSAgMDEuMDEuMDMgIFN0YXJ0ZWQgdXNpbmcgTVBJX1BPSU5URVIuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBzdHJ1Y3R1cmVzIGZvciBNUElfVEFSR0VUX1NDU0lfU1BJX0NNRF9CVUZGRVIgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICBNUElfVEFSR0VUX0ZDUF9DTURfQlVGRkVSLgorICogIDAzLTI3LTAxICAwMS4wMS4wNCAgQWRkZWQgc3RydWN0dXJlIG9mZnNldCBjb21tZW50cy4KKyAqICAwOC0wOC0wMSAgMDEuMDIuMDEgIE9yaWdpbmFsIHJlbGVhc2UgZm9yIHYxLjIgd29yay4KKyAqICAwOS0yOC0wMSAgMDEuMDIuMDIgIEFkZGVkIHN0cnVjdHVyZSBmb3IgTVBJX1RBUkdFVF9TQ1NJX1NQSV9TVEFUVVNfSVUuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBQcmlvcml0eVJlYXNvbiBmaWVsZCB0byBzb21lIHJlcGxpZXMgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIG1vcmUgUHJpb3JpdHlSZWFzb24gY29kZXMuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBzb21lIGRlZmluZXMgZm9yIHRvIHN1cHBvcnQgcHJldmlvdXMgdmVyc2lvbgorICogICAgICAgICAgICAgICAgICAgICAgb2YgTVBJLgorICogIDEwLTA0LTAxICAwMS4wMi4wMyAgQWRkZWQgUHJpb3JpdHlSZWFzb24gdG8gTVNHX1RBUkdFVF9FUlJPUl9SRVBMWS4KKyAqICAxMS0wMS0wMSAgMDEuMDIuMDQgIEFkZGVkIGRlZmluZSBmb3IgVEFSR0VUX1NUQVRVU19TRU5EX0ZMQUdTX0hJR0hfUFJJT1JJVFkuCisgKiAgMDMtMTQtMDIgIDAxLjAyLjA1ICBNb2RpZmllZCBNUElfVEFSR0VUX0ZDUF9SU1BfQlVGRkVSIHRvIGdldCB0aGUgcHJvcGVyCisgKiAgICAgICAgICAgICAgICAgICAgICBieXRlIG9yZGVyaW5nLgorICogIDA1LTMxLTAyICAwMS4wMi4wNiAgTW9kaWZpZWQgVEFSR0VUX01PREVfUkVQTFlfQUxJQVNfTUFTSyB0byBvbmx5IGluY2x1ZGUKKyAqICAgICAgICAgICAgICAgICAgICAgIG9uZSBiaXQuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBBbGlhc0luZGV4IGZpZWxkIHRvIE1QSV9UQVJHRVRfRkNQX0NNRF9CVUZGRVIuCisgKiAgMDktMTYtMDIgIDAxLjAyLjA3ICBBZGRlZCBmbGFncyBmb3IgY29uZmlybWVkIGNvbXBsZXRpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBQUklPUklUWV9SRUFTT05fVEFSR0VUX0JVU1kuCisgKiAgMTEtMTUtMDIgIDAxLjAyLjA4ICBBZGRlZCBBbGlhc0lEIGZpZWxkIHRvIE1QSV9UQVJHRVRfU0NTSV9TUElfQ01EX0JVRkZFUi4KKyAqICAwNC0wMS0wMyAgMDEuMDIuMDkgIEFkZGVkIE9wdGlvbmFsT3hpZCBmaWVsZCB0byBNUElfVEFSR0VUX0ZDUF9DTURfQlVGRkVSLgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBNUElfVEFSR19ICisjZGVmaW5lIE1QSV9UQVJHX0gKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgICAgICBTIEMgUyBJICAgIFQgYSByIGcgZSB0ICAgIE0gZSBzIHMgYSBnIGUgcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX0NNRF9CVUZGRVJfREVTQ1JJUFRPUgoreworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIElvSW5kZXg7ICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgLyogMDJoICovCisgICAgdW5pb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIHsKKyAgICAgICAgVTMyICAgICAgICAgICAgICAgICBQaHlzaWNhbEFkZHJlc3MzMjsKKyAgICAgICAgVTY0ICAgICAgICAgICAgICAgICBQaHlzaWNhbEFkZHJlc3M2NDsKKyAgICB9IHU7Cit9IENNRF9CVUZGRVJfREVTQ1JJUFRPUiwgTVBJX1BPSU5URVIgUFRSX0NNRF9CVUZGRVJfREVTQ1JJUFRPUiwKKyAgQ21kQnVmZmVyRGVzY3JpcHRvcl90LCBNUElfUE9JTlRFUiBwQ21kQnVmZmVyRGVzY3JpcHRvcl90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGFyZ2V0IENvbW1hbmQgQnVmZmVyIFBvc3QgUmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX01TR19UQVJHRVRfQ01EX0JVRkZFUl9QT1NUX1JFUVVFU1QKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJQb3N0RmxhZ3M7ICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQnVmZmVyQ291bnQ7ICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENoYWluT2Zmc2V0OyAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgLyogMDNoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQnVmZmVyTGVuZ3RoOyAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAvKiAwNWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgICAgICAgICAvKiAwOGggKi8KKyAgICBDTURfQlVGRkVSX0RFU0NSSVBUT1IgICBCdWZmZXJbMV07ICAgICAgICAgICAgICAgICAgLyogMENoICovCit9IE1TR19UQVJHRVRfQ01EX0JVRkZFUl9QT1NUX1JFUVVFU1QsIE1QSV9QT0lOVEVSIFBUUl9NU0dfVEFSR0VUX0NNRF9CVUZGRVJfUE9TVF9SRVFVRVNULAorICBUYXJnZXRDbWRCdWZmZXJQb3N0UmVxdWVzdF90LCBNUElfUE9JTlRFUiBwVGFyZ2V0Q21kQnVmZmVyUG9zdFJlcXVlc3RfdDsKKworI2RlZmluZSBDTURfQlVGRkVSX1BPU1RfRkxBR1NfUE9SVF9NQVNLICAgICAgICAgKDB4MDEpCisjZGVmaW5lIENNRF9CVUZGRVJfUE9TVF9GTEFHU19BRERSX01PREVfTUFTSyAgICAoMHg4MCkKKyNkZWZpbmUgQ01EX0JVRkZFUl9QT1NUX0ZMQUdTX0FERFJfTU9ERV8zMiAgICAgICgwKQorI2RlZmluZSBDTURfQlVGRkVSX1BPU1RfRkxBR1NfQUREUl9NT0RFXzY0ICAgICAgKDEpCisjZGVmaW5lIENNRF9CVUZGRVJfUE9TVF9GTEFHU182NF9CSVRfQUREUiAgICAgICAoMHg4MCkKKworI2RlZmluZSBDTURfQlVGRkVSX1BPU1RfSU9fSU5ERVhfTUFTSyAgICAgICAgICAgKDB4MDAwMDNGRkYpCisjZGVmaW5lIENNRF9CVUZGRVJfUE9TVF9JT19JTkRFWF9NQVNLXzAxMDAgICAgICAoMHgwMDAwMDNGRikgLyogb2Jzb2xldGUgKi8KKworCit0eXBlZGVmIHN0cnVjdCBfTVNHX1RBUkdFVF9DTURfQlVGRkVSX1BPU1RfUkVQTFkKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJQb3N0RmxhZ3M7ICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQnVmZmVyQ291bnQ7ICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0xlbmd0aDsgICAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgLyogMDNoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQnVmZmVyTGVuZ3RoOyAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAvKiAwNWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgICAgICAgICAvKiAwOGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgLyogMENoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSU9DU3RhdHVzOyAgICAgICAgICAgICAgICAgIC8qIDBFaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIElPQ0xvZ0luZm87ICAgICAgICAgICAgICAgICAvKiAxMGggKi8KK30gTVNHX1RBUkdFVF9DTURfQlVGRkVSX1BPU1RfUkVQTFksIE1QSV9QT0lOVEVSIFBUUl9NU0dfVEFSR0VUX0NNRF9CVUZGRVJfUE9TVF9SRVBMWSwKKyAgVGFyZ2V0Q21kQnVmZmVyUG9zdFJlcGx5X3QsIE1QSV9QT0lOVEVSIHBUYXJnZXRDbWRCdWZmZXJQb3N0UmVwbHlfdDsKKworLyogdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaXMgb2Jzb2xldGUgYXMgb2YgTVBJIHYxLjIgKi8KK3R5cGVkZWYgc3RydWN0IF9NU0dfUFJJT1JJVFlfQ01EX1JFQ0VJVkVEX1JFUExZCit7CisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0xlbmd0aDsgICAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgLyogMDNoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5UmVhc29uOyAgICAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAgICAgLyogMERoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSU9DU3RhdHVzOyAgICAgICAgICAgICAgICAgIC8qIDBFaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIElPQ0xvZ0luZm87ICAgICAgICAgICAgICAgICAvKiAxMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXBseVdvcmQ7ICAgICAgICAgICAgICAgICAgLyogMTRoICovCit9IE1TR19QUklPUklUWV9DTURfUkVDRUlWRURfUkVQTFksIE1QSV9QT0lOVEVSIFBUUl9NU0dfUFJJT1JJVFlfQ01EX1JFQ0VJVkVEX1JFUExZLAorICBQcmlvcml0eUNvbW1hbmRSZWNlaXZlZFJlcGx5X3QsIE1QSV9QT0lOVEVSIHBQcmlvcml0eUNvbW1hbmRSZWNlaXZlZFJlcGx5X3Q7CisKKyNkZWZpbmUgUFJJT1JJVFlfUkVBU09OX05PX0RJU0NPTk5FQ1QgICAgICAgICAgICgweDAwKQorI2RlZmluZSBQUklPUklUWV9SRUFTT05fU0NTSV9UQVNLX01BTkFHRU1FTlQgICAgKDB4MDEpCisjZGVmaW5lIFBSSU9SSVRZX1JFQVNPTl9DTURfUEFSSVRZX0VSUiAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgUFJJT1JJVFlfUkVBU09OX01TR19PVVRfUEFSSVRZX0VSUiAgICAgICgweDAzKQorI2RlZmluZSBQUklPUklUWV9SRUFTT05fTFFfQ1JDX0VSUiAgICAgICAgICAgICAgKDB4MDQpCisjZGVmaW5lIFBSSU9SSVRZX1JFQVNPTl9DTURfQ1JDX0VSUiAgICAgICAgICAgICAoMHgwNSkKKyNkZWZpbmUgUFJJT1JJVFlfUkVBU09OX1BST1RPQ09MX0VSUiAgICAgICAgICAgICgweDA2KQorI2RlZmluZSBQUklPUklUWV9SRUFTT05fREFUQV9PVVRfUEFSSVRZX0VSUiAgICAgKDB4MDcpCisjZGVmaW5lIFBSSU9SSVRZX1JFQVNPTl9EQVRBX09VVF9DUkNfRVJSICAgICAgICAoMHgwOCkKKyNkZWZpbmUgUFJJT1JJVFlfUkVBU09OX1RBUkdFVF9CVVNZICAgICAgICAgICAgICgweDA5KQorI2RlZmluZSBQUklPUklUWV9SRUFTT05fVU5LTk9XTiAgICAgICAgICAgICAgICAgKDB4RkYpCisKKwordHlwZWRlZiBzdHJ1Y3QgX01TR19UQVJHRVRfQ01EX0JVRkZFUl9QT1NUX0VSUk9SX1JFUExZCit7CisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0xlbmd0aDsgICAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgLyogMDNoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5UmVhc29uOyAgICAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAgICAgLyogMERoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSU9DU3RhdHVzOyAgICAgICAgICAgICAgICAgIC8qIDBFaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIElPQ0xvZ0luZm87ICAgICAgICAgICAgICAgICAvKiAxMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXBseVdvcmQ7ICAgICAgICAgICAgICAgICAgLyogMTRoICovCit9IE1TR19UQVJHRVRfQ01EX0JVRkZFUl9QT1NUX0VSUk9SX1JFUExZLAorICBNUElfUE9JTlRFUiBQVFJfTVNHX1RBUkdFVF9DTURfQlVGRkVSX1BPU1RfRVJST1JfUkVQTFksCisgIFRhcmdldENtZEJ1ZmZlclBvc3RFcnJvclJlcGx5X3QsIE1QSV9QT0lOVEVSIHBUYXJnZXRDbWRCdWZmZXJQb3N0RXJyb3JSZXBseV90OworCisKK3R5cGVkZWYgc3RydWN0IF9NUElfVEFSR0VUX0ZDUF9DTURfQlVGRkVSCit7CisgICAgVTggICAgICBGY3BMdW5bOF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgRmNwQ250bFs0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwOGggKi8KKyAgICBVOCAgICAgIEZjcENkYlsxNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMENoICovCisgICAgVTMyICAgICBGY3BEbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDFDaCAqLworICAgIFU4ICAgICAgQWxpYXNJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyMGggKi8KKyAgICBVOCAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjFoICovCisgICAgVTE2ICAgICBPcHRpb25hbE94aWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIyaCAqLworfSBNUElfVEFSR0VUX0ZDUF9DTURfQlVGRkVSLCBNUElfUE9JTlRFUiBQVFJfTVBJX1RBUkdFVF9GQ1BfQ01EX0JVRkZFUiwKKyAgTXBpVGFyZ2V0RmNwQ21kQnVmZmVyLCBNUElfUE9JTlRFUiBwTXBpVGFyZ2V0RmNwQ21kQnVmZmVyOworCisKK3R5cGVkZWYgc3RydWN0IF9NUElfVEFSR0VUX1NDU0lfU1BJX0NNRF9CVUZGRVIKK3sKKyAgICAvKiBTUEkgTF9RIGluZm9ybWF0aW9uIHVuaXQgKi8KKyAgICBVOCAgICAgIExfUVR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICBSZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFUxNiAgICAgVGFnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgIExvZ2ljYWxVbml0TnVtYmVyWzhdOyAgICAgICAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTMyICAgICBEYXRhTGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDBDaCAqLworICAgIC8qIFNQSSBjb21tYW5kIGluZm9ybWF0aW9uIHVuaXQgKi8KKyAgICBVOCAgICAgIFJlc2VydmVkRmlyc3RCeXRlT2ZDb21tYW5kSVU7ICAgICAgICAgICAgICAgLyogMTBoICovCisgICAgVTggICAgICBUYXNrQXR0cmlidXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDExaCAqLworICAgIFU4ICAgICAgVGFza01hbmFnZW1lbnRGbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMmggKi8KKyAgICBVOCAgICAgIEFkZGl0aW9uYWxDREJMZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgLyogMTNoICovCisgICAgVTggICAgICBDREJbMTZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE0aCAqLworICAgIC8qIEFsaWFzIElEICovCisgICAgVTggICAgICBBbGlhc0lEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI0aCAqLworICAgIFU4ICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNWggKi8KKyAgICBVMTYgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjZoICovCit9IE1QSV9UQVJHRVRfU0NTSV9TUElfQ01EX0JVRkZFUiwKKyAgTVBJX1BPSU5URVIgUFRSX01QSV9UQVJHRVRfU0NTSV9TUElfQ01EX0JVRkZFUiwKKyAgTXBpVGFyZ2V0U2NzaVNwaUNtZEJ1ZmZlciwgTVBJX1BPSU5URVIgcE1waVRhcmdldFNjc2lTcGlDbWRCdWZmZXI7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUYXJnZXQgQXNzaXN0IFJlcXVlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfTVNHX1RBUkdFVF9BU1NJU1RfUkVRVUVTVAoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c0NvZGU7ICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRBc3Npc3RGbGFnczsgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ2hhaW5PZmZzZXQ7ICAgICAgICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBRdWV1ZVRhZzsgICAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVwbHlXb3JkOyAgICAgICAgICAgICAgICAgIC8qIDBDaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIExVTls4XTsgICAgICAgICAgICAgICAgICAgICAvKiAxMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZWxhdGl2ZU9mZnNldDsgICAgICAgICAgICAgLyogMThoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgRGF0YUxlbmd0aDsgICAgICAgICAgICAgICAgIC8qIDFDaCAqLworICAgIFNHRV9JT19VTklPTiAgICAgICAgICAgIFNHTFsxXTsgICAgICAgICAgICAgICAgICAgICAvKiAyMGggKi8KK30gTVNHX1RBUkdFVF9BU1NJU1RfUkVRVUVTVCwgTVBJX1BPSU5URVIgUFRSX01TR19UQVJHRVRfQVNTSVNUX1JFUVVFU1QsCisgIFRhcmdldEFzc2lzdFJlcXVlc3RfdCwgTVBJX1BPSU5URVIgcFRhcmdldEFzc2lzdFJlcXVlc3RfdDsKKworI2RlZmluZSBUQVJHRVRfQVNTSVNUX0ZMQUdTX0RBVEFfRElSRUNUSU9OICAgICAgICAgICgweDAxKQorI2RlZmluZSBUQVJHRVRfQVNTSVNUX0ZMQUdTX0FVVE9fU1RBVFVTICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBUQVJHRVRfQVNTSVNUX0ZMQUdTX0hJR0hfUFJJT1JJVFkgICAgICAgICAgICgweDA0KQorI2RlZmluZSBUQVJHRVRfQVNTSVNUX0ZMQUdTX0NPTkZJUk1FRCAgICAgICAgICAgICAgICgweDA4KQorI2RlZmluZSBUQVJHRVRfQVNTSVNUX0ZMQUdTX1JFUE9TVF9DTURfQlVGRkVSICAgICAgICgweDgwKQorCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfVEFSR0VUX0VSUk9SX1JFUExZCit7CisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0xlbmd0aDsgICAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgLyogMDNoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5UmVhc29uOyAgICAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAgICAgLyogMERoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSU9DU3RhdHVzOyAgICAgICAgICAgICAgICAgIC8qIDBFaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIElPQ0xvZ0luZm87ICAgICAgICAgICAgICAgICAvKiAxMGggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXBseVdvcmQ7ICAgICAgICAgICAgICAgICAgLyogMTRoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgVHJhbnNmZXJDb3VudDsgICAgICAgICAgICAgIC8qIDE4aCAqLworfSBNU0dfVEFSR0VUX0VSUk9SX1JFUExZLCBNUElfUE9JTlRFUiBQVFJfTVNHX1RBUkdFVF9FUlJPUl9SRVBMWSwKKyAgVGFyZ2V0RXJyb3JSZXBseV90LCBNUElfUE9JTlRFUiBwVGFyZ2V0RXJyb3JSZXBseV90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGFyZ2V0IFN0YXR1cyBTZW5kIFJlcXVlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX01TR19UQVJHRVRfU1RBVFVTX1NFTkRfUkVRVUVTVAoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c0NvZGU7ICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNGbGFnczsgICAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ2hhaW5PZmZzZXQ7ICAgICAgICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBRdWV1ZVRhZzsgICAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUmVwbHlXb3JkOyAgICAgICAgICAgICAgICAgIC8qIDBDaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIExVTls4XTsgICAgICAgICAgICAgICAgICAgICAvKiAxMGggKi8KKyAgICBTR0VfU0lNUExFX1VOSU9OICAgICAgICBTdGF0dXNEYXRhU0dFOyAgICAgICAgICAgICAgLyogMThoICovCit9IE1TR19UQVJHRVRfU1RBVFVTX1NFTkRfUkVRVUVTVCwgTVBJX1BPSU5URVIgUFRSX01TR19UQVJHRVRfU1RBVFVTX1NFTkRfUkVRVUVTVCwKKyAgVGFyZ2V0U3RhdHVzU2VuZFJlcXVlc3RfdCwgTVBJX1BPSU5URVIgcFRhcmdldFN0YXR1c1NlbmRSZXF1ZXN0X3Q7CisKKyNkZWZpbmUgVEFSR0VUX1NUQVRVU19TRU5EX0ZMQUdTX0FVVE9fR09PRF9TVEFUVVMgICAoMHgwMSkKKyNkZWZpbmUgVEFSR0VUX1NUQVRVU19TRU5EX0ZMQUdTX0hJR0hfUFJJT1JJVFkgICAgICAoMHgwNCkKKyNkZWZpbmUgVEFSR0VUX1NUQVRVU19TRU5EX0ZMQUdTX0NPTkZJUk1FRCAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgVEFSR0VUX1NUQVRVU19TRU5EX0ZMQUdTX1JFUE9TVF9DTURfQlVGRkVSICAoMHg4MCkKKworLyoKKyAqIE5PVEU6IEZDUF9SU1AgZGF0YSBpcyBiaWctZW5kaWFuLiBXaGVuIHVzZWQgb24gYSBsaXR0bGUtZW5kaWFuIHN5c3RlbSwgdGhpcworICogc3RydWN0dXJlIHByb3Blcmx5IG9yZGVycyB0aGUgYnl0ZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9NUElfVEFSR0VUX0ZDUF9SU1BfQlVGRkVSCit7CisgICAgVTggICAgICBSZXNlcnZlZDBbOF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgUmVzZXJ2ZWQxWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwOGggKi8KKyAgICBVOCAgICAgIEZjcEZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMEFoICovCisgICAgVTggICAgICBGY3BTdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDBCaCAqLworICAgIFUzMiAgICAgRmNwUmVzaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVMzIgICAgIEZjcFNlbnNlTGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTBoICovCisgICAgVTMyICAgICBGY3BSZXNwb25zZUxlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE0aCAqLworICAgIFU4ICAgICAgRmNwUmVzcG9uc2VEYXRhWzhdOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxOGggKi8KKyAgICBVOCAgICAgIEZjcFNlbnNlRGF0YVszMl07IC8qIFBhZCB0byA2NCBieXRlcyAqLyAgICAgLyogMjBoICovCit9IE1QSV9UQVJHRVRfRkNQX1JTUF9CVUZGRVIsIE1QSV9QT0lOVEVSIFBUUl9NUElfVEFSR0VUX0ZDUF9SU1BfQlVGRkVSLAorICBNcGlUYXJnZXRGY3BSc3BCdWZmZXIsIE1QSV9QT0lOVEVSIHBNcGlUYXJnZXRGY3BSc3BCdWZmZXI7CisKKy8qCisgKiBOT1RFOiBUaGUgU1BJIHN0YXR1cyBJVSBpcyBiaWctZW5kaWFuLiBXaGVuIHVzZWQgb24gYSBsaXR0bGUtZW5kaWFuIHN5c3RlbSwKKyAqIHRoaXMgc3RydWN0dXJlIHByb3Blcmx5IG9yZGVycyB0aGUgYnl0ZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9NUElfVEFSR0VUX1NDU0lfU1BJX1NUQVRVU19JVQoreworICAgIFU4ICAgICAgUmVzZXJ2ZWQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICBWYWxpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgU3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVMzIgICAgIFNlbnNlRGF0YUxpc3RMZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTMyICAgICBQa3RGYWlsdXJlc0xpc3RMZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFU4ICAgICAgU2Vuc2VEYXRhWzUyXTsgLyogUGFkIHRoZSBJVSB0byA2NCBieXRlcyAqLyAvKiAwQ2ggKi8KK30gTVBJX1RBUkdFVF9TQ1NJX1NQSV9TVEFUVVNfSVUsIE1QSV9QT0lOVEVSIFBUUl9NUElfVEFSR0VUX1NDU0lfU1BJX1NUQVRVU19JVSwKKyAgVGFyZ2V0U2NzaVNwaVN0YXR1c0lVX3QsIE1QSV9QT0lOVEVSIHBUYXJnZXRTY3NpU3BpU3RhdHVzSVVfdDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUYXJnZXQgTW9kZSBBYm9ydCBSZXF1ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfTVNHX1RBUkdFVF9NT0RFX0FCT1JUX1JFUVVFU1QKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBBYm9ydFR5cGU7ICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENoYWluT2Zmc2V0OyAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgLyogMDNoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlcGx5V29yZDsgICAgICAgICAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0VG9BYm9ydDsgICAgICAgICAgLyogMTBoICovCit9IE1TR19UQVJHRVRfTU9ERV9BQk9SVCwgTVBJX1BPSU5URVIgUFRSX01TR19UQVJHRVRfTU9ERV9BQk9SVCwKKyAgVGFyZ2V0TW9kZUFib3J0X3QsIE1QSV9QT0lOVEVSIHBUYXJnZXRNb2RlQWJvcnRfdDsKKworI2RlZmluZSBUQVJHRVRfTU9ERV9BQk9SVF9UWVBFX0FMTF9DTURfQlVGRkVSUyAgICAgICgweDAwKQorI2RlZmluZSBUQVJHRVRfTU9ERV9BQk9SVF9UWVBFX0FMTF9JTyAgICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBUQVJHRVRfTU9ERV9BQk9SVF9UWVBFX0VYQUNUX0lPICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBUQVJHRVRfTU9ERV9BQk9SVF9UWVBFX0VYQUNUX0lPX1JFUVVFU1QgICAgICgweDAzKQorCisvKiBUYXJnZXQgTW9kZSBBYm9ydCBSZXBseSAqLworCit0eXBlZGVmIHN0cnVjdCBfTVNHX1RBUkdFVF9NT0RFX0FCT1JUX1JFUExZCit7CisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0xlbmd0aDsgICAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgLyogMDNoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBJT0NTdGF0dXM7ICAgICAgICAgICAgICAgICAgLyogMEVoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgSU9DTG9nSW5mbzsgICAgICAgICAgICAgICAgIC8qIDEwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEFib3J0Q291bnQ7ICAgICAgICAgICAgICAgICAvKiAxNGggKi8KK30gTVNHX1RBUkdFVF9NT0RFX0FCT1JUX1JFUExZLCBNUElfUE9JTlRFUiBQVFJfTVNHX1RBUkdFVF9NT0RFX0FCT1JUX1JFUExZLAorICBUYXJnZXRNb2RlQWJvcnRSZXBseV90LCBNUElfUE9JTlRFUiBwVGFyZ2V0TW9kZUFib3J0UmVwbHlfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRhcmdldCBNb2RlIENvbnRleHQgUmVwbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVEFSR0VUX01PREVfUkVQTFlfSU9fSU5ERVhfTUFTSyAgICAgICAgICgweDAwMDAzRkZGKQorI2RlZmluZSBUQVJHRVRfTU9ERV9SRVBMWV9JT19JTkRFWF9TSElGVCAgICAgICAgKDApCisjZGVmaW5lIFRBUkdFVF9NT0RFX1JFUExZX0lOSVRJQVRPUl9JTkRFWF9NQVNLICAoMHgwM0ZGQzAwMCkKKyNkZWZpbmUgVEFSR0VUX01PREVfUkVQTFlfSU5JVElBVE9SX0lOREVYX1NISUZUICgxNCkKKyNkZWZpbmUgVEFSR0VUX01PREVfUkVQTFlfQUxJQVNfTUFTSyAgICAgICAgICAgICgweDA0MDAwMDAwKQorI2RlZmluZSBUQVJHRVRfTU9ERV9SRVBMWV9BTElBU19TSElGVCAgICAgICAgICAgKDI2KQorI2RlZmluZSBUQVJHRVRfTU9ERV9SRVBMWV9QT1JUX01BU0sgICAgICAgICAgICAgKDB4MTAwMDAwMDApCisjZGVmaW5lIFRBUkdFVF9NT0RFX1JFUExZX1BPUlRfU0hJRlQgICAgICAgICAgICAoMjgpCisKKworI2RlZmluZSBHRVRfSU9fSU5ERVgoeCkgICAgICgoKHgpICYgVEFSR0VUX01PREVfUkVQTFlfSU9fSU5ERVhfTUFTSykgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IFRBUkdFVF9NT0RFX1JFUExZX0lPX0lOREVYX1NISUZUKQorCisjZGVmaW5lIFNFVF9JT19JTkRFWCh0LCBpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCh0KSA9ICgodCkgJiB+VEFSR0VUX01PREVfUkVQTFlfSU9fSU5ERVhfTUFTSykgfCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGkpIDw8IFRBUkdFVF9NT0RFX1JFUExZX0lPX0lOREVYX1NISUZUKSAmICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQVJHRVRfTU9ERV9SRVBMWV9JT19JTkRFWF9NQVNLKSkKKworI2RlZmluZSBHRVRfSU5JVElBVE9SX0lOREVYKHgpICgoKHgpICYgVEFSR0VUX01PREVfUkVQTFlfSU5JVElBVE9SX0lOREVYX01BU0spIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gVEFSR0VUX01PREVfUkVQTFlfSU5JVElBVE9SX0lOREVYX1NISUZUKQorCisjZGVmaW5lIFNFVF9JTklUSUFUT1JfSU5ERVgodCwgaWkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKHQpID0gKCh0KSAmIH5UQVJHRVRfTU9ERV9SRVBMWV9JTklUSUFUT1JfSU5ERVhfTUFTSykgfCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKGlpKSA8PCBUQVJHRVRfTU9ERV9SRVBMWV9JTklUSUFUT1JfSU5ERVhfU0hJRlQpICYgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBUkdFVF9NT0RFX1JFUExZX0lOSVRJQVRPUl9JTkRFWF9NQVNLKSkKKworI2RlZmluZSBHRVRfQUxJQVMoeCkgKCgoeCkgJiBUQVJHRVRfTU9ERV9SRVBMWV9BTElBU19NQVNLKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gVEFSR0VUX01PREVfUkVQTFlfQUxJQVNfU0hJRlQpCisKKyNkZWZpbmUgU0VUX0FMSUFTKHQsIGEpICAoKHQpID0gKCh0KSAmIH5UQVJHRVRfTU9ERV9SRVBMWV9BTElBU19NQVNLKSB8ICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8PCBUQVJHRVRfTU9ERV9SRVBMWV9BTElBU19TSElGVCkgJiAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBUkdFVF9NT0RFX1JFUExZX0FMSUFTX01BU0spKQorCisjZGVmaW5lIEdFVF9QT1JUKHgpICgoKHgpICYgVEFSR0VUX01PREVfUkVQTFlfUE9SVF9NQVNLKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBUQVJHRVRfTU9ERV9SRVBMWV9QT1JUX1NISUZUKQorCisjZGVmaW5lIFNFVF9QT1JUKHQsIHApICAoKHQpID0gKCh0KSAmIH5UQVJHRVRfTU9ERV9SRVBMWV9QT1JUX01BU0spIHwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgocCkgPDwgVEFSR0VUX01PREVfUkVQTFlfUE9SVF9TSElGVCkgJiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFSR0VUX01PREVfUkVQTFlfUE9SVF9NQVNLKSkKKworLyogdGhlIGZvbGxvd2luZyBvYnNvbGV0ZSB2YWx1ZXMgYXJlIGZvciBNUEkgdjEuMCBzdXBwb3J0ICovCisjZGVmaW5lIFRBUkdFVF9NT0RFX1JFUExZXzAxMDBfTUFTS19IT1NUX0lOREVYICAgICAgICgweDAwMDAwM0ZGKQorI2RlZmluZSBUQVJHRVRfTU9ERV9SRVBMWV8wMTAwX1NISUZUX0hPU1RfSU5ERVggICAgICAoMCkKKyNkZWZpbmUgVEFSR0VUX01PREVfUkVQTFlfMDEwMF9NQVNLX0lPQ19JTkRFWCAgICAgICAgKDB4MDAxRkY4MDApCisjZGVmaW5lIFRBUkdFVF9NT0RFX1JFUExZXzAxMDBfU0hJRlRfSU9DX0lOREVYICAgICAgICgxMSkKKyNkZWZpbmUgVEFSR0VUX01PREVfUkVQTFlfMDEwMF9QT1JUX01BU0sgICAgICAgICAgICAgKDB4MDA0MDAwMDApCisjZGVmaW5lIFRBUkdFVF9NT0RFX1JFUExZXzAxMDBfUE9SVF9TSElGVCAgICAgICAgICAgICgyMikKKyNkZWZpbmUgVEFSR0VUX01PREVfUkVQTFlfMDEwMF9NQVNLX0lOSVRJQVRPUl9JTkRFWCAgKDB4MUY4MDAwMDApCisjZGVmaW5lIFRBUkdFVF9NT0RFX1JFUExZXzAxMDBfU0hJRlRfSU5JVElBVE9SX0lOREVYICgyMykKKworI2RlZmluZSBHRVRfSE9TVF9JTkRFWF8wMTAwKHgpICgoKHgpICYgVEFSR0VUX01PREVfUkVQTFlfMDEwMF9NQVNLX0hPU1RfSU5ERVgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBUQVJHRVRfTU9ERV9SRVBMWV8wMTAwX1NISUZUX0hPU1RfSU5ERVgpCisKKyNkZWZpbmUgU0VUX0hPU1RfSU5ERVhfMDEwMCh0LCBoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoKHQpID0gKCh0KSAmIH5UQVJHRVRfTU9ERV9SRVBMWV8wMTAwX01BU0tfSE9TVF9JTkRFWCkgfCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoKGhpKSA8PCBUQVJHRVRfTU9ERV9SRVBMWV8wMTAwX1NISUZUX0hPU1RfSU5ERVgpICYgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFSR0VUX01PREVfUkVQTFlfMDEwMF9NQVNLX0hPU1RfSU5ERVgpKQorCisjZGVmaW5lIEdFVF9JT0NfSU5ERVhfMDEwMCh4KSAgICgoKHgpICYgVEFSR0VUX01PREVfUkVQTFlfMDEwMF9NQVNLX0lPQ19JTkRFWCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IFRBUkdFVF9NT0RFX1JFUExZXzAxMDBfU0hJRlRfSU9DX0lOREVYKQorCisjZGVmaW5lIFNFVF9JT0NfSU5ERVhfMDEwMCh0LCBpaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCh0KSA9ICgodCkgJiB+VEFSR0VUX01PREVfUkVQTFlfMDEwMF9NQVNLX0lPQ19JTkRFWCkgfCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKGlpKSA8PCBUQVJHRVRfTU9ERV9SRVBMWV8wMTAwX1NISUZUX0lPQ19JTkRFWCkgJiAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFSR0VUX01PREVfUkVQTFlfMDEwMF9NQVNLX0lPQ19JTkRFWCkpCisKKyNkZWZpbmUgR0VUX0lOSVRJQVRPUl9JTkRFWF8wMTAwKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoKCh4KSAmIFRBUkdFVF9NT0RFX1JFUExZXzAxMDBfTUFTS19JTklUSUFUT1JfSU5ERVgpICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gVEFSR0VUX01PREVfUkVQTFlfMDEwMF9TSElGVF9JTklUSUFUT1JfSU5ERVgpCisKKyNkZWZpbmUgU0VUX0lOSVRJQVRPUl9JTkRFWF8wMTAwKHQsIGlpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgodCkgPSAoKHQpICYgflRBUkdFVF9NT0RFX1JFUExZXzAxMDBfTUFTS19JTklUSUFUT1JfSU5ERVgpIHwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICgoKGlpKSA8PCBUQVJHRVRfTU9ERV9SRVBMWV8wMTAwX1NISUZUX0lOSVRJQVRPUl9JTkRFWCkgJiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFSR0VUX01PREVfUkVQTFlfMDEwMF9NQVNLX0lOSVRJQVRPUl9JTkRFWCkpCisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV90b29sLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfdG9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNmQxOTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfdG9vbC5oCkBAIC0wLDAgKzEsMzA1IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAwMS0yMDAzIExTSSBMb2dpYyBDb3Jwb3JhdGlvbi4KKyAqCisgKgorICogICAgICAgICAgIE5hbWU6ICBtcGlfdG9vbC5oCisgKiAgICAgICAgICBUaXRsZTogIE1QSSBUb29sYm94IHN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zCisgKiAgQ3JlYXRpb24gRGF0ZTogIEp1bHkgMzAsIDIwMDEKKyAqCisgKiAgICBtcGlfdG9vbC5oIFZlcnNpb246ICAwMS4wNS54eAorICoKKyAqICBWZXJzaW9uIEhpc3RvcnkKKyAqICAtLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgRGF0ZSAgICAgIFZlcnNpb24gICBEZXNjcmlwdGlvbgorICogIC0tLS0tLS0tICAtLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgMDgtMDgtMDEgIDAxLjAyLjAxICBPcmlnaW5hbCByZWxlYXNlLgorICogIDA4LTI5LTAxICAwMS4wMi4wMiAgQWRkZWQgRElBR19EQVRBX1VQTE9BRF9IRUFERVIgYW5kIHJlbGF0ZWQgZGVmaW5lcy4KKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpZm5kZWYgTVBJX1RPT0xfSAorI2RlZmluZSBNUElfVE9PTF9ICisKKyNkZWZpbmUgTVBJX1RPT0xCT1hfQ0xFQU5fVE9PTCAgICAgICAgICAgICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgTVBJX1RPT0xCT1hfTUVNT1JZX01PVkVfVE9PTCAgICAgICAgICAgICAgICAoMHgwMSkKKyNkZWZpbmUgTVBJX1RPT0xCT1hfRElBR19EQVRBX1VQTE9BRF9UT09MICAgICAgICAgICAoMHgwMikKKyNkZWZpbmUgTVBJX1RPT0xCT1hfSVNUV0lfUkVBRF9XUklURV9UT09MICAgICAgICAgICAoMHgwMykKKyNkZWZpbmUgTVBJX1RPT0xCT1hfRkNfTUFOQUdFTUVOVF9UT09MICAgICAgICAgICAgICAoMHgwNCkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRvb2xib3ggcmVwbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfVE9PTEJPWF9SRVBMWQoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFRvb2w7ICAgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnTGVuZ3RoOyAgICAgICAgICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAgICAgICAgIC8qIDBDaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIElPQ1N0YXR1czsgICAgICAgICAgICAgICAgICAvKiAwRWggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBJT0NMb2dJbmZvOyAgICAgICAgICAgICAgICAgLyogMTBoICovCit9IE1TR19UT09MQk9YX1JFUExZLCBNUElfUE9JTlRFUiBQVFJfTVNHX1RPT0xCT1hfUkVQTFksCisgIFRvb2xib3hSZXBseV90LCBNUElfUE9JTlRFUiBwVG9vbGJveFJlcGx5X3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUb29sYm94IENsZWFuIFRvb2wgcmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfTVNHX1RPT0xCT1hfQ0xFQU5fUkVRVUVTVAoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFRvb2w7ICAgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ2hhaW5PZmZzZXQ7ICAgICAgICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgRmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qIDBDaCAqLworfSBNU0dfVE9PTEJPWF9DTEVBTl9SRVFVRVNULCBNUElfUE9JTlRFUiBQVFJfTVNHX1RPT0xCT1hfQ0xFQU5fUkVRVUVTVCwKKyAgVG9vbGJveENsZWFuUmVxdWVzdF90LCBNUElfUE9JTlRFUiBwVG9vbGJveENsZWFuUmVxdWVzdF90OworCisjZGVmaW5lIE1QSV9UT09MQk9YX0NMRUFOX05WU1JBTSAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIE1QSV9UT09MQk9YX0NMRUFOX1NFRVBST00gICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIE1QSV9UT09MQk9YX0NMRUFOX0ZMQVNIICAgICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIE1QSV9UT09MQk9YX0NMRUFOX0JPT1RMT0FERVIgICAgICAgICAgICAgICAgKDB4MDQwMDAwMDApCisjZGVmaW5lIE1QSV9UT09MQk9YX0NMRUFOX0ZXX0JBQ0tVUCAgICAgICAgICAgICAgICAgKDB4MDgwMDAwMDApCisjZGVmaW5lIE1QSV9UT09MQk9YX0NMRUFOX0ZXX0NVUlJFTlQgICAgICAgICAgICAgICAgKDB4MTAwMDAwMDApCisjZGVmaW5lIE1QSV9UT09MQk9YX0NMRUFOX09USEVSX1BFUlNJU1RfUEFHRVMgICAgICAgKDB4MjAwMDAwMDApCisjZGVmaW5lIE1QSV9UT09MQk9YX0NMRUFOX1BFUlNJU1RfTUFOVUZBQ1RfUEFHRVMgICAgKDB4NDAwMDAwMDApCisjZGVmaW5lIE1QSV9UT09MQk9YX0NMRUFOX0JPT1RfU0VSVklDRVMgICAgICAgICAgICAgKDB4ODAwMDAwMDApCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUb29sYm94IE1lbW9yeSBNb3ZlIHJlcXVlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBfTVNHX1RPT0xCT1hfTUVNX01PVkVfUkVRVUVTVAoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFRvb2w7ICAgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ2hhaW5PZmZzZXQ7ICAgICAgICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgU0dFX1NJTVBMRV9VTklPTiAgICAgICAgU0dMOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDBDaCAqLworfSBNU0dfVE9PTEJPWF9NRU1fTU9WRV9SRVFVRVNULCBNUElfUE9JTlRFUiBQVFJfTVNHX1RPT0xCT1hfTUVNX01PVkVfUkVRVUVTVCwKKyAgVG9vbGJveE1lbU1vdmVSZXF1ZXN0X3QsIE1QSV9QT0lOVEVSIHBUb29sYm94TWVtTW92ZVJlcXVlc3RfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRvb2xib3ggRGlhZ25vc3RpYyBEYXRhIFVwbG9hZCByZXF1ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9NU0dfVE9PTEJPWF9ESUFHX0RBVEFfVVBMT0FEX1JFUVVFU1QKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBUb29sOyAgICAgICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENoYWluT2Zmc2V0OyAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgLyogMDNoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAgICAgLyogMTBoICovCisgICAgU0dFX1NJTVBMRV9VTklPTiAgICAgICAgU0dMOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE0aCAqLworfSBNU0dfVE9PTEJPWF9ESUFHX0RBVEFfVVBMT0FEX1JFUVVFU1QsIE1QSV9QT0lOVEVSIFBUUl9NU0dfVE9PTEJPWF9ESUFHX0RBVEFfVVBMT0FEX1JFUVVFU1QsCisgIFRvb2xib3hEaWFnRGF0YVVwbG9hZFJlcXVlc3RfdCwgTVBJX1BPSU5URVIgcFRvb2xib3hEaWFnRGF0YVVwbG9hZFJlcXVlc3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX0RJQUdfREFUQV9VUExPQURfSEVBREVSCit7CisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgRGlhZ0RhdGFMZW5ndGg7ICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdENvZGU7ICAgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgLyogMDVoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgIC8qIDA2aCAqLworfSBESUFHX0RBVEFfVVBMT0FEX0hFQURFUiwgTVBJX1BPSU5URVIgUFRSX0RJQUdfREFUQV9VUExPQURfSEVBREVSLAorICBEaWFnRGF0YVVwbG9hZEhlYWRlcl90LCBNUElfUE9JTlRFUiBwRGlhZ0RhdGFVcGxvYWRIZWFkZXJfdDsKKworI2RlZmluZSBNUElfVEJfRElBR19GT1JNQVRfU0NTSV9QUklOVEZfMSAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfVEJfRElBR19GT1JNQVRfU0NTSV8yICAgICAgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfVEJfRElBR19GT1JNQVRfU0NTSV8zICAgICAgICAgICAgICAgICAgICgweDAzKQorI2RlZmluZSBNUElfVEJfRElBR19GT1JNQVRfRkNfVFJBQ0VfMSAgICAgICAgICAgICAgICgweDA0KQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVG9vbGJveCBJU1RXSSBSZWFkIFdyaXRlIHJlcXVlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX01TR19UT09MQk9YX0lTVFdJX1JFQURfV1JJVEVfUkVRVUVTVAoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFRvb2w7ICAgICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ2hhaW5PZmZzZXQ7ICAgICAgICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgICAgICAgICAgLyogMDhoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qIDBDaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEJ1c051bTsgICAgICAgICAgICAgICAgICAgICAvKiAwRGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAgICAgLyogMEVoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTnVtQWRkcmVzc0J5dGVzOyAgICAgICAgICAgIC8qIDEwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNDsgICAgICAgICAgICAgICAgICAvKiAxMWggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoOyAgICAgICAgICAgICAgICAgLyogMTJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRkcjsgICAgICAgICAgICAgICAgIC8qIDE0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEFkZHIxOyAgICAgICAgICAgICAgICAgICAgICAvKiAxNWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBBZGRyMjsgICAgICAgICAgICAgICAgICAgICAgLyogMTZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQWRkcjM7ICAgICAgICAgICAgICAgICAgICAgIC8qIDE3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNTsgICAgICAgICAgICAgICAgICAvKiAxOGggKi8KKyAgICBTR0VfU0lNUExFX1VOSU9OICAgICAgICBTR0w7ICAgICAgICAgICAgICAgICAgICAgICAgLyogMUNoICovCit9IE1TR19UT09MQk9YX0lTVFdJX1JFQURfV1JJVEVfUkVRVUVTVCwgTVBJX1BPSU5URVIgUFRSX01TR19UT09MQk9YX0lTVFdJX1JFQURfV1JJVEVfUkVRVUVTVCwKKyAgVG9vbGJveElzdHdpUmVhZFdyaXRlUmVxdWVzdF90LCBNUElfUE9JTlRFUiBwVG9vbGJveElzdHdpUmVhZFdyaXRlUmVxdWVzdF90OworCisjZGVmaW5lIE1QSV9UQl9JU1RXSV9GTEFHU19XUklURSAgICAgICAgICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSV9UQl9JU1RXSV9GTEFHU19SRUFEICAgICAgICAgICAgICAgICAgICAgKDB4MDEpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUb29sYm94IEZDIE1hbmFnZW1lbnQgcmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBY3Rpb25JbmZvIGZvciBCdXMgYW5kIFRhcmdldElkICovCit0eXBlZGVmIHN0cnVjdCBfTVBJX1RCX0ZDX01BTkFHRV9CVVNfVElEX0FJCit7CisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEJ1czsgICAgICAgICAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRJZDsgICAgICAgICAgICAgICAgICAgLyogMDNoICovCit9IE1QSV9UQl9GQ19NQU5BR0VfQlVTX1RJRF9BSSwgTVBJX1BPSU5URVIgUFRSX01QSV9UQl9GQ19NQU5BR0VfQlVTX1RJRF9BSSwKKyAgTXBpVGJGY01hbmFnZUJ1c1RpZEFpX3QsIE1QSV9QT0lOVEVSIHBNcGlUYkZjTWFuYWdlQnVzVGlkQWlfdDsKKworLyogQWN0aW9uSW5mbyBmb3IgcG9ydCBpZGVudGlmaWVyICovCit0eXBlZGVmIHN0cnVjdCBfTVBJX1RCX0ZDX01BTkFHRV9QSURfQUkKK3sKKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBQb3J0SWRlbnRpZmllcjsgICAgICAgICAgICAgLyogMDBoICovCit9IE1QSV9UQl9GQ19NQU5BR0VfUElEX0FJLCBNUElfUE9JTlRFUiBQVFJfTVBJX1RCX0ZDX01BTkFHRV9QSURfQUksCisgIE1waVRiRmNNYW5hZ2VQaWRBaV90LCBNUElfUE9JTlRFUiBwTXBpVGJGY01hbmFnZVBpZEFpX3Q7CisKKy8qIHVuaW9uIG9mIEFjdGlvbkluZm8gKi8KK3R5cGVkZWYgdW5pb24gX01QSV9UQl9GQ19NQU5BR0VfQUlfVU5JT04KK3sKKyAgICBNUElfVEJfRkNfTUFOQUdFX0JVU19USURfQUkgICAgIEJ1c1RpZDsKKyAgICBNUElfVEJfRkNfTUFOQUdFX1BJRF9BSSAgICAgICAgIFBvcnQ7Cit9IE1QSV9UQl9GQ19NQU5BR0VfQUlfVU5JT04sIE1QSV9QT0lOVEVSIFBUUl9NUElfVEJfRkNfTUFOQUdFX0FJX1VOSU9OLAorICBNcGlUYkZjTWFuYWdlQWlVbmlvbl90LCBNUElfUE9JTlRFUiBwTXBpVGJGY01hbmFnZUFpVW5pb25fdDsKKwordHlwZWRlZiBzdHJ1Y3QgX01TR19UT09MQk9YX0ZDX01BTkFHRV9SRVFVRVNUCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIFRvb2w7ICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsgICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhaW5PZmZzZXQ7ICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgICAgIC8qIDAzaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgICAgICAvKiAwOGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOyAgICAgICAgICAgICAgICAgLyogMENoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgIC8qIDBEaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgICAgICAvKiAwRWggKi8KKyAgICBNUElfVEJfRkNfTUFOQUdFX0FJX1VOSU9OICAgQWN0aW9uSW5mbzsgICAgICAgICAgICAgLyogMTBoICovCit9IE1TR19UT09MQk9YX0ZDX01BTkFHRV9SRVFVRVNULCBNUElfUE9JTlRFUiBQVFJfTVNHX1RPT0xCT1hfRkNfTUFOQUdFX1JFUVVFU1QsCisgIFRvb2xib3hGY01hbmFnZVJlcXVlc3RfdCwgTVBJX1BPSU5URVIgcFRvb2xib3hGY01hbmFnZVJlcXVlc3RfdDsKKworLyogZGVmaW5lcyBmb3IgdGhlIEFjdGlvbiBmaWVsZCAqLworI2RlZmluZSBNUElfVEJfRkNfTUFOQUdFX0FDVElPTl9ESVNDX0FMTCAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBNUElfVEJfRkNfTUFOQUdFX0FDVElPTl9ESVNDX1BJRCAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfVEJfRkNfTUFOQUdFX0FDVElPTl9ESVNDX0JVU19USUQgICAgICAgICgweDAyKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGlhZ25vc3RpYyBCdWZmZXIgUG9zdCByZXF1ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX01TR19ESUFHX0JVRkZFUl9QT1NUX1JFUVVFU1QKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBUcmFjZUxldmVsOyAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQnVmZmVyVHlwZTsgICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENoYWluT2Zmc2V0OyAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgLyogMDNoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkVHlwZTsgICAgICAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBCdWZmZXJMZW5ndGg7ICAgICAgICAgICAgICAgLyogMTBoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdFNwZWNpZmljWzRdOyAgICAgICAgIC8qIDE0aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgICAgICAvKiAxOGggKi8KKyAgICBTR0VfU0lNUExFX1VOSU9OICAgICAgICBTR0w7ICAgICAgICAgICAgICAgICAgICAgICAgLyogMjhoICovCit9IE1TR19ESUFHX0JVRkZFUl9QT1NUX1JFUVVFU1QsIE1QSV9QT0lOVEVSIFBUUl9NU0dfRElBR19CVUZGRVJfUE9TVF9SRVFVRVNULAorICBEaWFnQnVmZmVyUG9zdFJlcXVlc3RfdCwgTVBJX1BPSU5URVIgcERpYWdCdWZmZXJQb3N0UmVxdWVzdF90OworCisjZGVmaW5lIE1QSV9ESUFHX0JVRl9UWVBFX1RSQUNFICAgICAgICAgICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIE1QSV9ESUFHX0JVRl9UWVBFX1NOQVBTSE9UICAgICAgICAgICAgICAgICAgKDB4MDEpCisjZGVmaW5lIE1QSV9ESUFHX0JVRl9UWVBFX0VYVEVOREVEICAgICAgICAgICAgICAgICAgKDB4MDIpCisKKyNkZWZpbmUgTVBJX0RJQUdfRVhURU5ERURfUVRBRyAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMSkKKworCisvKiBEaWFnbm9zdGljIEJ1ZmZlciBQb3N0IHJlcGx5ICovCit0eXBlZGVmIHN0cnVjdCBfTVNHX0RJQUdfQlVGRkVSX1BPU1RfUkVQTFkKK3sKKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDE7ICAgICAgICAgICAgICAgICAgLyogMDBoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQnVmZmVyVHlwZTsgICAgICAgICAgICAgICAgIC8qIDAxaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0xlbmd0aDsgICAgICAgICAgICAgICAgICAvKiAwMmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgICAgICAgICAgLyogMDNoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAgICAgICAgIC8qIDA0aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgICAgICAgICAgLyogMDdoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAgICAgICAgIC8qIDA4aCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNDsgICAgICAgICAgICAgICAgICAvKiAwQ2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBJT0NTdGF0dXM7ICAgICAgICAgICAgICAgICAgLyogMEVoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgSU9DTG9nSW5mbzsgICAgICAgICAgICAgICAgIC8qIDEwaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFRyYW5zZmVyTGVuZ3RoOyAgICAgICAgICAgICAvKiAxNGggKi8KK30gTVNHX0RJQUdfQlVGRkVSX1BPU1RfUkVQTFksIE1QSV9QT0lOVEVSIFBUUl9NU0dfRElBR19CVUZGRVJfUE9TVF9SRVBMWSwKKyAgRGlhZ0J1ZmZlclBvc3RSZXBseV90LCBNUElfUE9JTlRFUiBwRGlhZ0J1ZmZlclBvc3RSZXBseV90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGlhZ25vc3RpYyBSZWxlYXNlIHJlcXVlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX01TR19ESUFHX1JFTEVBU0VfUkVRVUVTVAoreworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJUeXBlOyAgICAgICAgICAgICAgICAgLyogMDFoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgQ2hhaW5PZmZzZXQ7ICAgICAgICAgICAgICAgIC8qIDAyaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOyAgICAgICAgICAgICAgICAgICAvKiAwM2ggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7ICAgICAgICAgICAgICAgICAgLyogMDRoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAgICAgICAgIC8qIDA2aCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgICAgICAgICAvKiAwN2ggKi8KKyAgICBVMzIgICAgICAgICAgICAgICAgICAgICBNc2dDb250ZXh0OyAgICAgICAgICAgICAgICAgLyogMDhoICovCit9IE1TR19ESUFHX1JFTEVBU0VfUkVRVUVTVCwgTVBJX1BPSU5URVIgUFRSX01TR19ESUFHX1JFTEVBU0VfUkVRVUVTVCwKKyAgRGlhZ1JlbGVhc2VSZXF1ZXN0X3QsIE1QSV9QT0lOVEVSIHBEaWFnUmVsZWFzZVJlcXVlc3RfdDsKKworCisvKiBEaWFnbm9zdGljIFJlbGVhc2UgcmVwbHkgKi8KK3R5cGVkZWYgc3RydWN0IF9NU0dfRElBR19SRUxFQVNFX1JFUExZCit7CisgICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlclR5cGU7ICAgICAgICAgICAgICAgICAvKiAwMWggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dMZW5ndGg7ICAgICAgICAgICAgICAgICAgLyogMDJoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAgICAgICAgIC8qIDAzaCAqLworICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMjsgICAgICAgICAgICAgICAgICAvKiAwNGggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDM7ICAgICAgICAgICAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnRmxhZ3M7ICAgICAgICAgICAgICAgICAgIC8qIDA3aCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgICAgICAgICAvKiAwOGggKi8KKyAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgICAgICAgICAgLyogMENoICovCisgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgSU9DU3RhdHVzOyAgICAgICAgICAgICAgICAgIC8qIDBFaCAqLworICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIElPQ0xvZ0luZm87ICAgICAgICAgICAgICAgICAvKiAxMGggKi8KK30gTVNHX0RJQUdfUkVMRUFTRV9SRVBMWSwgTVBJX1BPSU5URVIgUFRSX01TR19ESUFHX1JFTEVBU0VfUkVQTFksCisgIERpYWdSZWxlYXNlUmVwbHlfdCwgTVBJX1BPSU5URVIgcERpYWdSZWxlYXNlUmVwbHlfdDsKKworCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfdHlwZS5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzkzMjhhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX3R5cGUuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIExTSSBMb2dpYyBDb3Jwb3JhdGlvbi4KKyAqCisgKgorICogICAgICAgICAgIE5hbWU6ICBtcGlfdHlwZS5oCisgKiAgICAgICAgICBUaXRsZTogIE1QSSBCYXNpYyB0eXBlIGRlZmluaXRpb25zCisgKiAgQ3JlYXRpb24gRGF0ZTogIEp1bmUgNiwgMjAwMAorICoKKyAqICAgIG1waV90eXBlLmggVmVyc2lvbjogIDAxLjA1Lnh4CisgKgorICogIFZlcnNpb24gSGlzdG9yeQorICogIC0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBEYXRlICAgICAgVmVyc2lvbiAgIERlc2NyaXB0aW9uCisgKiAgLS0tLS0tLS0gIC0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAwNS0wOC0wMCAgMDAuMTAuMDEgIE9yaWdpbmFsIHJlbGVhc2UgZm9yIDAuMTAgc3BlYyBkYXRlZCA0LzI2LzIwMDAuCisgKiAgMDYtMDYtMDAgIDAxLjAwLjAxICBVcGRhdGUgdmVyc2lvbiBudW1iZXIgZm9yIDEuMCByZWxlYXNlLgorICogIDExLTAyLTAwICAwMS4wMS4wMSAgT3JpZ2luYWwgcmVsZWFzZSBmb3IgcG9zdCAxLjAgd29yaworICogIDAyLTIwLTAxICAwMS4wMS4wMiAgQWRkZWQgZGVmaW5lIGFuZCBpZmRlZiBmb3IgTVBJX1BPSU5URVIuCisgKiAgMDgtMDgtMDEgIDAxLjAyLjAxICBPcmlnaW5hbCByZWxlYXNlIGZvciB2MS4yIHdvcmsuCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIE1QSV9UWVBFX0gKKyNkZWZpbmUgTVBJX1RZUEVfSAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZWZpbmUgTVBJX1BPSU5URVIgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiBkZWZpbmVkLiBCeSBkZWZhdWx0IE1QSV9QT0lOVEVSCisgKiBpcyBkZWZpbmVkIHRvIGJlIGEgbmVhciBwb2ludGVyLiBNUElfUE9JTlRFUiBjYW4gYmUgZGVmaW5lZCBhcyBhIGZhciBwb2ludGVyCisgKiBieSBkZWZpbmluZyBNUElfUE9JTlRFUiBhcyAiZmFyICoiIGJlZm9yZSB0aGlzIGhlYWRlciBmaWxlIGlzIGluY2x1ZGVkLgorICovCisjaWZuZGVmIE1QSV9QT0lOVEVSCisjZGVmaW5lIE1QSV9QT0lOVEVSICAgICAqCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICAgICAgICBCIGEgcyBpIGMgICAgVCB5IHAgZSBzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzaWduZWQgICBjaGFyICAgUzg7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICBVODsKK3R5cGVkZWYgc2lnbmVkICAgc2hvcnQgIFMxNjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgIFUxNjsKKworCit0eXBlZGVmIGludDMyX3QgICBTMzI7Cit0eXBlZGVmIHVfaW50MzJfdCBVMzI7CisKKy8qCisgKiAgVGhlIG9ubHkgd2F5IGNyYXAgYmVsb3cgY291bGQgd29yayBvbiBiaWctZW5kaWFuIGJveGVuIHdvdWxkIGJlIGlmIGl0CisgKiAgd2Fzbid0IHVzZWQgYXQgYWxsLgorICovCisKK3R5cGVkZWYgc3RydWN0IF9TNjQKK3sKKyAgICBVMzIgICAgICAgICAgTG93OworICAgIFMzMiAgICAgICAgICBIaWdoOworfSBTNjQ7CisKK3R5cGVkZWYgc3RydWN0IF9VNjQKK3sKKyAgICBVMzIgICAgICAgICAgTG93OworICAgIFUzMiAgICAgICAgICBIaWdoOworfSBVNjQ7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgUG9pbnRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIFM4ICAgICAgKlBTODsKK3R5cGVkZWYgVTggICAgICAqUFU4OwordHlwZWRlZiBTMTYgICAgICpQUzE2OwordHlwZWRlZiBVMTYgICAgICpQVTE2OwordHlwZWRlZiBTMzIgICAgICpQUzMyOwordHlwZWRlZiBVMzIgICAgICpQVTMyOwordHlwZWRlZiBTNjQgICAgICpQUzY0OwordHlwZWRlZiBVNjQgICAgICpQVTY0OworCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MmNjMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYwpAQCAtMCwwICsxLDU5NDYgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKKyAqICAgICAgSGlnaCBwZXJmb3JtYW5jZSBTQ1NJICsgTEFOIC8gRmlicmUgQ2hhbm5lbCBkZXZpY2UgZHJpdmVycy4KKyAqICAgICAgVGhpcyBpcyB0aGUgRnVzaW9uIE1QVCBiYXNlIGRyaXZlciB3aGljaCBzdXBwb3J0cyBtdWx0aXBsZQorICogICAgICAoU0NTSSArIExBTikgc3BlY2lhbGl6ZWQgcHJvdG9jb2wgZHJpdmVycy4KKyAqICAgICAgRm9yIHVzZSB3aXRoIFBDSSBjaGlwL2FkYXB0ZXIocyk6CisgKiAgICAgICAgICBMU0lGQzl4eC9MU0k0MDl4eCBGaWJyZSBDaGFubmVsCisgKiAgICAgIHJ1bm5pbmcgTFNJIExvZ2ljIEZ1c2lvbiBNUFQgKE1lc3NhZ2UgUGFzc2luZyBUZWNobm9sb2d5KSBmaXJtd2FyZS4KKyAqCisgKiAgQ3JlZGl0czoKKyAqICAgICAgVGhlcmUgYXJlIGxvdHMgb2YgcGVvcGxlIG5vdCBtZW50aW9uZWQgYmVsb3cgdGhhdCBkZXNlcnZlIGNyZWRpdAorICogICAgICBhbmQgdGhhbmtzIGJ1dCB3b24ndCBnZXQgaXQgaGVyZSAtIHNvcnJ5IGluIGFkdmFuY2UgdGhhdCB5b3UKKyAqICAgICAgZ290IG92ZXJsb29rZWQuCisgKgorICogICAgICBUaGlzIGRyaXZlciB3b3VsZCBub3QgZXhpc3QgaWYgbm90IGZvciBBbGFuIENveCdzIGRldmVsb3BtZW50CisgKiAgICAgIG9mIHRoZSBsaW51eCBpMm8gZHJpdmVyLgorICoKKyAqICAgICAgQSBzcGVjaWFsIHRoYW5rcyB0byBOb2FoIFJvbWVyIChMU0kgTG9naWMpIGZvciB0b25zIG9mIHdvcmsKKyAqICAgICAgYW5kIHRvdWdoIGRlYnVnZ2luZyBvbiB0aGUgTEFOIGRyaXZlciwgZXNwZWNpYWxseSBlYXJseSBvbjstKQorICogICAgICBBbmQgdG8gUm9nZXIgSGlja2Vyc29uIChMU0kgTG9naWMpIGZvciB0aXJlbGVzc2x5IHN1cHBvcnRpbmcKKyAqICAgICAgdGhpcyBkcml2ZXIgcHJvamVjdC4KKyAqCisgKiAgICAgIEEgc3BlY2lhbCB0aGFua3MgdG8gUGFtZWxhIERlbGFuZXkgKExTSSBMb2dpYykgZm9yIHRvbnMgb2Ygd29yaworICogICAgICBhbmQgY291bnRsZXNzIGVuaGFuY2VtZW50cyB3aGlsZSBhZGRpbmcgc3VwcG9ydCBmb3IgdGhlIDEwMzAKKyAqICAgICAgY2hpcCBmYW1pbHkuICBQYW0gaGFzIGJlZW4gaW5zdHJ1bWVudGFsIGluIHRoZSBkZXZlbG9wbWVudCBvZgorICogICAgICBvZiB0aGUgMi54eC54eCBzZXJpZXMgZnVzaW9uIGRyaXZlcnMsIGFuZCBoZXIgY29udHJpYnV0aW9ucyBhcmUKKyAqICAgICAgZmFyIHRvbyBudW1lcm91cyB0byBob3BlIHRvIGxpc3QgaW4gb25lIHBsYWNlLgorICoKKyAqICAgICAgQWxsIG1hbm5lciBvZiBoZWxwIGZyb20gU3RlcGhlbiBTaGlycm9uIChMU0kgTG9naWMpOgorICogICAgICBsb3ctbGV2ZWwgRkMgYW5hbHlzaXMsIGRlYnVnICsgdmFyaW91cyBmaXhlcyBpbiBGQ3h4IGZpcm13YXJlLAorICogICAgICBpbml0aWFsIHBvcnQgdG8gYWxwaGEgcGxhdGZvcm0sIHZhcmlvdXMgZHJpdmVyIGNvZGUgb3B0aW1pemF0aW9ucywKKyAqICAgICAgYmVpbmcgYSBmYWl0aGZ1bCBzb3VuZGluZyBib2FyZCBvbiBhbGwgc29ydHMgb2YgaXNzdWVzICYgaWRlYXMsCisgKiAgICAgIGV0Yy4KKyAqCisgKiAgICAgIEEgaHVnZSBkZWJ0IG9mIGdyYXRpdHVkZSBpcyBvd2VkIHRvIERhdmlkIFMuIE1pbGxlciAoRGF2ZU0pCisgKiAgICAgIGZvciBmaXhpbmcgbXVjaCBvZiB0aGUgc3R1cGlkIGFuZCBicm9rZW4gc3R1ZmYgaW4gdGhlIGVhcmx5CisgKiAgICAgIGRyaXZlciB3aGlsZSBwb3J0aW5nIHRvIHNwYXJjNjQgcGxhdGZvcm0uICBUSEFOSyBZT1UhCisgKgorICogICAgICBTcGVjaWFsIHRoYW5rcyBnb2VzIHRvIHRoZSBJMk8gTEFOIGRyaXZlciBwZW9wbGUgYXQgdGhlCisgKiAgICAgIFVuaXZlcnNpdHkgb2YgSGVsc2lua2ksIHdobywgdW5iZWtub3duc3QgdG8gdGhlbSwgcHJvdmlkZWQKKyAqICAgICAgdGhlIGluc3BpcmF0aW9uIGFuZCBpbml0aWFsIHN0cnVjdHVyZSBmb3IgdGhpcyBkcml2ZXIuCisgKgorICogICAgICBBIHJlYWxseSBodWdlIGRlYnQgb2YgZ3JhdGl0dWRlIGlzIG93ZWQgdG8gRWRkaWUgQy4gRG9zdAorICogICAgICBmb3IgZ29icyBvZiBoYXJkIHdvcmsgZml4aW5nIGFuZCBvcHRpbWl6aW5nIExBTiBjb2RlLgorICogICAgICBUSEFOSyBZT1UhCisgKgorICogIENvcHlyaWdodCAoYykgMTk5OS0yMDA0IExTSSBMb2dpYyBDb3Jwb3JhdGlvbgorICogIE9yaWdpbmFsbHkgQnk6IFN0ZXZlbiBKLiBSYWxzdG9uCisgKiAgKG1haWx0bzpzanJhbHN0b24xQG5ldHNjYXBlLm5ldCkKKyAqICAobWFpbHRvOm1wdF9saW51eF9kZXZlbG9wZXJAbHNpbC5jb20pCisgKgorICogICRJZDogbXB0YmFzZS5jLHYgMS4xMjYgMjAwMi8xMi8xNiAxNToyODo0NSBwZGVsYW5leSBFeHAgJAorICovCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgTk8gV0FSUkFOVFkKKyAgICBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKKyAgICBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVAorICAgIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisgICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcworICAgIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKKyAgICBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyAgICBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLAorICAgIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorCisgICAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkKKyAgICBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorICAgIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAgIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5ECisgICAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgICAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICAgIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorICAgIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMKKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CQkvKiBuZWVkZWQgZm9yIGluX2ludGVycnVwdCgpIHByb3RvICovCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaWZkZWYgQ09ORklHX01UUlIKKyNpbmNsdWRlIDxhc20vbXRyci5oPgorI2VuZGlmCisjaWZkZWYgX19zcGFyY19fCisjaW5jbHVkZSA8YXNtL2lycS5oPgkJCS8qIG5lZWRlZCBmb3IgX19pcnFfaXRvYSgpIHByb3RvICovCisjZW5kaWYKKworI2luY2x1ZGUgIm1wdGJhc2UuaCIKKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworI2RlZmluZSBteV9OQU1FCQkiRnVzaW9uIE1QVCBiYXNlIGRyaXZlciIKKyNkZWZpbmUgbXlfVkVSU0lPTglNUFRfTElOVVhfVkVSU0lPTl9DT01NT04KKyNkZWZpbmUgTVlOQU0JCSJtcHRiYXNlIgorCitNT0RVTEVfQVVUSE9SKE1PRFVMRUFVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04obXlfTkFNRSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qCisgKiAgY21kIGxpbmUgcGFyYW1ldGVycworICovCisjaWZkZWYgTUZDTlQKK3N0YXRpYyBpbnQgbWZjb3VudGVyID0gMDsKKyNkZWZpbmUgUFJJTlRfTUZfQ09VTlQgMjAwMDAKKyNlbmRpZgorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICogIFB1YmxpYyBkYXRhLi4uCisgKi8KK2ludCBtcHRfbGFuX2luZGV4ID0gLTE7CitpbnQgbXB0X3N0bV9pbmRleCA9IC0xOworCitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKm1wdF9wcm9jX3Jvb3RfZGlyOworCisjZGVmaW5lIFdIT0lOSVRfVU5LTk9XTgkJMHhBQQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICogIFByaXZhdGUgZGF0YS4uLgorICovCisJCQkJCS8qIEFkYXB0ZXIgbGluayBsaXN0ICovCitMSVNUX0hFQUQoaW9jX2xpc3QpOworCQkJCQkvKiBDYWxsYmFjayBsb29rdXAgdGFibGUgKi8KK3N0YXRpYyBNUFRfQ0FMTEJBQ0sJCSBNcHRDYWxsYmFja3NbTVBUX01BWF9QUk9UT0NPTF9EUklWRVJTXTsKKwkJCQkJLyogUHJvdG9jb2wgZHJpdmVyIGNsYXNzIGxvb2t1cCB0YWJsZSAqLworc3RhdGljIGludAkJCSBNcHREcml2ZXJDbGFzc1tNUFRfTUFYX1BST1RPQ09MX0RSSVZFUlNdOworCQkJCQkvKiBFdmVudCBoYW5kbGVyIGxvb2t1cCB0YWJsZSAqLworc3RhdGljIE1QVF9FVkhBTkRMRVIJCSBNcHRFdkhhbmRsZXJzW01QVF9NQVhfUFJPVE9DT0xfRFJJVkVSU107CisJCQkJCS8qIFJlc2V0IGhhbmRsZXIgbG9va3VwIHRhYmxlICovCitzdGF0aWMgTVBUX1JFU0VUSEFORExFUgkJIE1wdFJlc2V0SGFuZGxlcnNbTVBUX01BWF9QUk9UT0NPTF9EUklWRVJTXTsKK3N0YXRpYyBzdHJ1Y3QgbXB0X3BjaV9kcml2ZXIgCSpNcHREZXZpY2VEcml2ZXJIYW5kbGVyc1tNUFRfTUFYX1BST1RPQ09MX0RSSVZFUlNdOworCitzdGF0aWMgaW50CW1wdF9iYXNlX2luZGV4ID0gLTE7CitzdGF0aWMgaW50CWxhc3RfZHJ2X2lkeCA9IC0xOworCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobXB0X3dhaXRxKTsKKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqICBGb3J3YXJkIHByb3Rvcy4uLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbXB0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpidXNfaWQsIHN0cnVjdCBwdF9yZWdzICpyKTsKK3N0YXRpYyBpbnQJbXB0X2Jhc2VfcmVwbHkoTVBUX0FEQVBURVIgKmlvYywgTVBUX0ZSQU1FX0hEUiAqcmVxLCBNUFRfRlJBTUVfSERSICpyZXBseSk7CitzdGF0aWMgaW50CW1wdF9oYW5kc2hha2VfcmVxX3JlcGx5X3dhaXQoTVBUX0FEQVBURVIgKmlvYywgaW50IHJlcUJ5dGVzLAorCQkJdTMyICpyZXEsIGludCByZXBseUJ5dGVzLCB1MTYgKnUxNnJlcGx5LCBpbnQgbWF4d2FpdCwKKwkJCWludCBzbGVlcEZsYWcpOworc3RhdGljIGludAltcHRfZG9faW9jX3JlY292ZXJ5KE1QVF9BREFQVEVSICppb2MsIHUzMiByZWFzb24sIGludCBzbGVlcEZsYWcpOworc3RhdGljIHZvaWQJbXB0X2RldGVjdF9ib3VuZF9wb3J0cyhNUFRfQURBUFRFUiAqaW9jLCBzdHJ1Y3QgcGNpX2RldiAqcGRldik7CitzdGF0aWMgdm9pZAltcHRfYWRhcHRlcl9kaXNhYmxlKE1QVF9BREFQVEVSICppb2MpOworc3RhdGljIHZvaWQJbXB0X2FkYXB0ZXJfZGlzcG9zZShNUFRfQURBUFRFUiAqaW9jKTsKKworc3RhdGljIHZvaWQJTXB0RGlzcGxheUlvY0NhcGFiaWxpdGllcyhNUFRfQURBUFRFUiAqaW9jKTsKK3N0YXRpYyBpbnQJTWFrZUlvY1JlYWR5KE1QVF9BREFQVEVSICppb2MsIGludCBmb3JjZSwgaW50IHNsZWVwRmxhZyk7CisvL3N0YXRpYyB1MzIJbXB0X0dldElvY1N0YXRlKE1QVF9BREFQVEVSICppb2MsIGludCBjb29rZWQpOworc3RhdGljIGludAlHZXRJb2NGYWN0cyhNUFRfQURBUFRFUiAqaW9jLCBpbnQgc2xlZXBGbGFnLCBpbnQgcmVhc29uKTsKK3N0YXRpYyBpbnQJR2V0UG9ydEZhY3RzKE1QVF9BREFQVEVSICppb2MsIGludCBwb3J0bnVtLCBpbnQgc2xlZXBGbGFnKTsKK3N0YXRpYyBpbnQJU2VuZElvY0luaXQoTVBUX0FEQVBURVIgKmlvYywgaW50IHNsZWVwRmxhZyk7CitzdGF0aWMgaW50CVNlbmRQb3J0RW5hYmxlKE1QVF9BREFQVEVSICppb2MsIGludCBwb3J0bnVtLCBpbnQgc2xlZXBGbGFnKTsKK3N0YXRpYyBpbnQJbXB0X2RvX3VwbG9hZChNUFRfQURBUFRFUiAqaW9jLCBpbnQgc2xlZXBGbGFnKTsKK3N0YXRpYyBpbnQJbXB0X2Rvd25sb2FkYm9vdChNUFRfQURBUFRFUiAqaW9jLCBpbnQgc2xlZXBGbGFnKTsKK3N0YXRpYyBpbnQJbXB0X2RpYWdfcmVzZXQoTVBUX0FEQVBURVIgKmlvYywgaW50IGlnbm9yZSwgaW50IHNsZWVwRmxhZyk7CitzdGF0aWMgaW50CUtpY2tTdGFydChNUFRfQURBUFRFUiAqaW9jLCBpbnQgaWdub3JlLCBpbnQgc2xlZXBGbGFnKTsKK3N0YXRpYyBpbnQJU2VuZElvY1Jlc2V0KE1QVF9BREFQVEVSICppb2MsIHU4IHJlc2V0X3R5cGUsIGludCBzbGVlcEZsYWcpOworc3RhdGljIGludAlQcmltZUlvY0ZpZm9zKE1QVF9BREFQVEVSICppb2MpOworc3RhdGljIGludAlXYWl0Rm9yRG9vcmJlbGxBY2soTVBUX0FEQVBURVIgKmlvYywgaW50IGhvd2xvbmcsIGludCBzbGVlcEZsYWcpOworc3RhdGljIGludAlXYWl0Rm9yRG9vcmJlbGxJbnQoTVBUX0FEQVBURVIgKmlvYywgaW50IGhvd2xvbmcsIGludCBzbGVlcEZsYWcpOworc3RhdGljIGludAlXYWl0Rm9yRG9vcmJlbGxSZXBseShNUFRfQURBUFRFUiAqaW9jLCBpbnQgaG93bG9uZywgaW50IHNsZWVwRmxhZyk7CitzdGF0aWMgaW50CUdldExhbkNvbmZpZ1BhZ2VzKE1QVF9BREFQVEVSICppb2MpOworc3RhdGljIGludAlHZXRGY1BvcnRQYWdlMChNUFRfQURBUFRFUiAqaW9jLCBpbnQgcG9ydG51bSk7CitzdGF0aWMgaW50CUdldElvVW5pdFBhZ2UyKE1QVF9BREFQVEVSICppb2MpOworc3RhdGljIGludAltcHRfR2V0U2NzaVBvcnRTZXR0aW5ncyhNUFRfQURBUFRFUiAqaW9jLCBpbnQgcG9ydG51bSk7CitzdGF0aWMgaW50CW1wdF9yZWFkU2NzaURldmljZVBhZ2VIZWFkZXJzKE1QVF9BREFQVEVSICppb2MsIGludCBwb3J0bnVtKTsKK3N0YXRpYyB2b2lkIAltcHRfcmVhZF9pb2NfcGdfMShNUFRfQURBUFRFUiAqaW9jKTsKK3N0YXRpYyB2b2lkIAltcHRfcmVhZF9pb2NfcGdfNChNUFRfQURBUFRFUiAqaW9jKTsKK3N0YXRpYyB2b2lkCW1wdF90aW1lcl9leHBpcmVkKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgaW50CVNlbmRFdmVudE5vdGlmaWNhdGlvbihNUFRfQURBUFRFUiAqaW9jLCB1OCBFdlN3aXRjaCk7CitzdGF0aWMgaW50CVNlbmRFdmVudEFjayhNUFRfQURBUFRFUiAqaW9jLCBFdmVudE5vdGlmaWNhdGlvblJlcGx5X3QgKmV2bnApOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBpbnQJcHJvY21wdF9zdW1tYXJ5X3JlYWQoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJCQlpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworc3RhdGljIGludAlwcm9jbXB0X3ZlcnNpb25fcmVhZChjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJCWludCByZXF1ZXN0LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50CXByb2NtcHRfaW9jaW5mb19yZWFkKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkJaW50IHJlcXVlc3QsIGludCAqZW9mLCB2b2lkICpkYXRhKTsKKyNlbmRpZgorc3RhdGljIHZvaWQJbXB0X2dldF9md19leHBfdmVyKGNoYXIgKmJ1ZiwgTVBUX0FEQVBURVIgKmlvYyk7CisKKy8vaW50CQltcHRfSGFyZFJlc2V0SGFuZGxlcihNUFRfQURBUFRFUiAqaW9jLCBpbnQgc2xlZXBGbGFnKTsKK3N0YXRpYyBpbnQJUHJvY2Vzc0V2ZW50Tm90aWZpY2F0aW9uKE1QVF9BREFQVEVSICppb2MsIEV2ZW50Tm90aWZpY2F0aW9uUmVwbHlfdCAqZXZSZXBseSwgaW50ICpldkhhbmRsZXJzKTsKK3N0YXRpYyB2b2lkCW1wdF9zcF9pb2NfaW5mbyhNUFRfQURBUFRFUiAqaW9jLCB1MzIgaW9jX3N0YXR1cywgTVBUX0ZSQU1FX0hEUiAqbWYpOworc3RhdGljIHZvaWQJbXB0X2ZjX2xvZ19pbmZvKE1QVF9BREFQVEVSICppb2MsIHUzMiBsb2dfaW5mbyk7CitzdGF0aWMgdm9pZAltcHRfc3BfbG9nX2luZm8oTVBUX0FEQVBURVIgKmlvYywgdTMyIGxvZ19pbmZvKTsKKworLyogbW9kdWxlIGVudHJ5IHBvaW50ICovCitzdGF0aWMgaW50ICBfX2RldmluaXQgbXB0YmFzZV9wcm9iZSAoc3RydWN0IHBjaV9kZXYgKiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKik7CitzdGF0aWMgdm9pZCBfX2RldmV4aXQgbXB0YmFzZV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKik7CitzdGF0aWMgdm9pZCBtcHRiYXNlX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKiApOworc3RhdGljIGludCAgX19pbml0ICAgIGZ1c2lvbl9pbml0ICAodm9pZCk7CitzdGF0aWMgdm9pZCBfX2V4aXQgICAgZnVzaW9uX2V4aXQgICh2b2lkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFN1cHBvcnRlZCBoYXJkd2FyZQorICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBtcHRiYXNlX3BjaV90YWJsZVtdID0geworCXsgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTFNJX0ZDOTA5LAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sCisJeyBQQ0lfVkVORE9SX0lEX0xTSV9MT0dJQywgUENJX0RFVklDRV9JRF9MU0lfRkM5MjksCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKKwl7IFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX0xTSV9GQzkxOSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCXsgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTFNJX0ZDOTI5WCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCXsgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTFNJX0ZDOTE5WCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCXsgUENJX1ZFTkRPUl9JRF9MU0lfTE9HSUMsIFBDSV9ERVZJQ0VfSURfTFNJXzUzQzEwMzAsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKKwl7IFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDLCBQQ0lfREVWSUNFX0lEX0xTSV8xMDMwXzUzQzEwMzUsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKKwl7MH0JLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbXB0YmFzZV9wY2lfdGFibGUpOworCisjZGVmaW5lIENISVBSRUdfUkVBRDMyKGFkZHIpIAkJcmVhZGxfcmVsYXhlZChhZGRyKQorI2RlZmluZSBDSElQUkVHX1JFQUQzMl9kbWFzeW5jKGFkZHIpCXJlYWRsKGFkZHIpCisjZGVmaW5lIENISVBSRUdfV1JJVEUzMihhZGRyLHZhbCkgCXdyaXRlbCh2YWwsIGFkZHIpCisjZGVmaW5lIENISVBSRUdfUElPX1dSSVRFMzIoYWRkcix2YWwpCW91dGwodmFsLCAodW5zaWduZWQgbG9uZylhZGRyKQorI2RlZmluZSBDSElQUkVHX1BJT19SRUFEMzIoYWRkcikgCWlubCgodW5zaWduZWQgbG9uZylhZGRyKQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJbXB0X2ludGVycnVwdCAtIE1QVCBhZGFwdGVyIChJT0MpIHNwZWNpZmljIGludGVycnVwdCBoYW5kbGVyLgorICoJQGlycTogaXJxIG51bWJlciAobm90IHVzZWQpCisgKglAYnVzX2lkOiBidXMgaWRlbnRpZmllciBjb29raWUgPT0gcG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKKyAqCUByOiBwdF9yZWdzIHBvaW50ZXIgKG5vdCB1c2VkKQorICoKKyAqCVRoaXMgcm91dGluZSBpcyByZWdpc3RlcmVkIHZpYSB0aGUgcmVxdWVzdF9pcnEoKSBrZXJuZWwgQVBJIGNhbGwsCisgKglhbmQgaGFuZGxlcyBhbGwgaW50ZXJydXB0cyBnZW5lcmF0ZWQgZnJvbSBhIHNwZWNpZmljIE1QVCBhZGFwdGVyCisgKgkoYWxzbyByZWZlcnJlZCB0byBhcyBhIElPIENvbnRyb2xsZXIgb3IgSU9DKS4KKyAqCVRoaXMgcm91dGluZSBtdXN0IGNsZWFyIHRoZSBpbnRlcnJ1cHQgZnJvbSB0aGUgYWRhcHRlciBhbmQgZG9lcworICoJc28gYnkgcmVhZGluZyB0aGUgcmVwbHkgRklGTy4gIE11bHRpcGxlIHJlcGxpZXMgbWF5IGJlIHByb2Nlc3NlZAorICoJcGVyIHNpbmdsZSBjYWxsIHRvIHRoaXMgcm91dGluZTsgdXAgdG8gTVBUX01BWF9SRVBMSUVTX1BFUl9JU1IKKyAqCXdoaWNoIGlzIGN1cnJlbnRseSBzZXQgdG8gMzIgaW4gbXB0YmFzZS5oLgorICoKKyAqCVRoaXMgcm91dGluZSBoYW5kbGVzIHJlZ2lzdGVyLWxldmVsIGFjY2VzcyBvZiB0aGUgYWRhcHRlciBidXQKKyAqCWRpc3BhdGNoZXMgKGNhbGxzKSBhIHByb3RvY29sLXNwZWNpZmljIGNhbGxiYWNrIHJvdXRpbmUgdG8gaGFuZGxlCisgKgl0aGUgcHJvdG9jb2wtc3BlY2lmaWMgZGV0YWlscyBvZiB0aGUgTVBUIHJlcXVlc3QgY29tcGxldGlvbi4KKyAqLworc3RhdGljIGlycXJldHVybl90CittcHRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmJ1c19pZCwgc3RydWN0IHB0X3JlZ3MgKnIpCit7CisJTVBUX0FEQVBURVIJKmlvYzsKKwlNUFRfRlJBTUVfSERSCSptZjsKKwlNUFRfRlJBTUVfSERSCSptcjsKKwl1MzIJCSBwYTsKKwlpbnQJCSByZXFfaWR4OworCWludAkJIGNiX2lkeDsKKwlpbnQJCSB0eXBlOworCWludAkJIGZyZWVtZTsKKworCWlvYyA9IChNUFRfQURBUFRFUiAqKWJ1c19pZDsKKworCS8qCisJICogIERyYWluIHRoZSByZXBseSBGSUZPIQorCSAqCisJICogTk9URVM6IEkndmUgc2VlbiB1cCB0byAxMCByZXBsaWVzIHByb2Nlc3NlZCBpbiB0aGlzIGxvb3AsIHNvIGZhci4uLgorCSAqIFVwZGF0ZTogSSd2ZSBzZWVuIHVwIHRvIDkxODIgcmVwbGllcyBwcm9jZXNzZWQgaW4gdGhpcyBsb29wISA/PworCSAqIFVwZGF0ZTogTGltaXQgb3Vyc2VsdmVzIHRvIHByb2Nlc3NpbmcgbWF4IG9mIE4gcmVwbGllcworCSAqCShib3R0b20gb2YgbG9vcCkuCisJICovCisJd2hpbGUgKDEpIHsKKworCQlpZiAoKHBhID0gQ0hJUFJFR19SRUFEMzJfZG1hc3luYygmaW9jLT5jaGlwLT5SZXBseUZpZm8pKSA9PSAweEZGRkZGRkZGKQorCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJCWNiX2lkeCA9IDA7CisJCWZyZWVtZSA9IDA7CisKKwkJLyoKKwkJICogIENoZWNrIGZvciBub24tVFVSQk8gcmVwbHkhCisJCSAqLworCQlpZiAocGEgJiBNUElfQUREUkVTU19SRVBMWV9BX0JJVCkgeworCQkJdTMyIHJlcGx5X2RtYV9sb3c7CisJCQl1MTYgaW9jX3N0YXQ7CisKKwkJCS8qIG5vbi1UVVJCTyByZXBseSEgIEhtbW0sIHNvbWV0aGluZyBtYXkgYmUgdXAuLi4KKwkJCSAqICBOZXdlc3QgdHVyYm8gcmVwbHkgbWVjaGFuaXNtOyBnZXQgYWRkcmVzcworCQkJICogIHZpYSBsZWZ0IHNoaWZ0IDEgKGdldCByaWQgb2YgTVBJX0FERFJFU1NfUkVQTFlfQV9CSVQpIQorCQkJICovCisKKwkJCS8qIE1hcCBETUEgYWRkcmVzcyBvZiByZXBseSBoZWFkZXIgdG8gY3B1IGFkZHJlc3MuCisJCQkgKiBwYSBpcyAzMiBiaXRzIC0gYnV0IHRoZSBkbWEgYWRkcmVzcyBtYXkgYmUgMzIgb3IgNjQgYml0cworCQkJICogZ2V0IG9mZnNldCBiYXNlZCBvbmx5IG9ubHkgdGhlIGxvdyBhZGRyZXNzZXMKKwkJCSAqLworCQkJcmVwbHlfZG1hX2xvdyA9IChwYSA9IChwYSA8PCAxKSk7CisJCQltciA9IChNUFRfRlJBTUVfSERSICopKCh1OCAqKWlvYy0+cmVwbHlfZnJhbWVzICsKKwkJCQkJIChyZXBseV9kbWFfbG93IC0gaW9jLT5yZXBseV9mcmFtZXNfbG93X2RtYSkpOworCisJCQlyZXFfaWR4ID0gbGUxNl90b19jcHUobXItPnUuZnJhbWUuaHdoZHIubXNnY3R4dS5mbGQucmVxX2lkeCk7CisJCQljYl9pZHggPSBtci0+dS5mcmFtZS5od2hkci5tc2djdHh1LmZsZC5jYl9pZHg7CisJCQltZiA9IE1QVF9JTkRFWF8yX01GUFRSKGlvYywgcmVxX2lkeCk7CisKKwkJCWRtZnByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiR290IG5vbi1UVVJCTyByZXBseT0lcCByZXFfaWR4PSV4XG4iLAorCQkJCQlpb2MtPm5hbWUsIG1yLCByZXFfaWR4KSk7CisJCQlEQkdfRFVNUF9SRVBMWV9GUkFNRShtcikKKworCQkJLyogTkVXISAgMjAwMTAzMDEgLXNyYWxzdG9uCisJCQkgKiAgQ2hlY2svbG9nIElPQyBsb2cgaW5mbworCQkJICovCisJCQlpb2Nfc3RhdCA9IGxlMTZfdG9fY3B1KG1yLT51LnJlcGx5LklPQ1N0YXR1cyk7CisJCQlpZiAoaW9jX3N0YXQgJiBNUElfSU9DU1RBVFVTX0ZMQUdfTE9HX0lORk9fQVZBSUxBQkxFKSB7CisJCQkJdTMyCSBsb2dfaW5mbyA9IGxlMzJfdG9fY3B1KG1yLT51LnJlcGx5LklPQ0xvZ0luZm8pOworCQkJCWlmIChpb2MtPmJ1c190eXBlID09IEZDKQorCQkJCQltcHRfZmNfbG9nX2luZm8oaW9jLCBsb2dfaW5mbyk7CisJCQkJZWxzZSBpZiAoaW9jLT5idXNfdHlwZSA9PSBTQ1NJKQorCQkJCQltcHRfc3BfbG9nX2luZm8oaW9jLCBsb2dfaW5mbyk7CisJCQl9CisJCQlpZiAoaW9jX3N0YXQgJiBNUElfSU9DU1RBVFVTX01BU0spIHsKKwkJCQlpZiAoaW9jLT5idXNfdHlwZSA9PSBTQ1NJKQorCQkJCQltcHRfc3BfaW9jX2luZm8oaW9jLCAodTMyKWlvY19zdGF0LCBtZik7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogIFByb2Nlc3MgdHVyYm8gKGNvbnRleHQpIHJlcGx5Li4uCisJCQkgKi8KKwkJCWRtZnByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiR290IFRVUkJPIHJlcGx5IHJlcV9pZHg9JTA4eFxuIiwgaW9jLT5uYW1lLCBwYSkpOworCQkJdHlwZSA9IChwYSA+PiBNUElfQ09OVEVYVF9SRVBMWV9UWVBFX1NISUZUKTsKKwkJCWlmICh0eXBlID09IE1QSV9DT05URVhUX1JFUExZX1RZUEVfU0NTSV9UQVJHRVQpIHsKKwkJCQljYl9pZHggPSBtcHRfc3RtX2luZGV4OworCQkJCW1mID0gTlVMTDsKKwkJCQltciA9IChNUFRfRlJBTUVfSERSICopIENBU1RfVTMyX1RPX1BUUihwYSk7CisJCQl9IGVsc2UgaWYgKHR5cGUgPT0gTVBJX0NPTlRFWFRfUkVQTFlfVFlQRV9MQU4pIHsKKwkJCQljYl9pZHggPSBtcHRfbGFuX2luZGV4OworCQkJCS8qCisJCQkJICogQlVHIEZJWCEgIDIwMDAxMjE4IC1zcmFsc3RvbgorCQkJCSAqICBCbGluZCBzZXQgb2YgbWYgdG8gTlVMTCBoZXJlIHdhcyBmYXRhbAorCQkJCSAqICBhZnRlciBsYW5fcmVwbHkgc2F5cyAiZnJlZW1lIgorCQkJCSAqICBGaXggc29ydCBvZiBjb21iaW5lZCB3aXRoIGFuIG9wdGltaXphdGlvbiBoZXJlOworCQkJCSAqICBhZGRlZCBleHBsaWNpdCBjaGVjayBmb3IgY2FzZSB3aGVyZSBsYW5fcmVwbHkKKwkJCQkgKiAgd2FzIGp1c3QgcmV0dXJuaW5nIDEgYW5kIGRvaW5nIG5vdGhpbmcgZWxzZS4KKwkJCQkgKiAgRm9yIHRoaXMgY2FzZSBza2lwIHRoZSBjYWxsYmFjaywgYnV0IHNldCB1cAorCQkJCSAqICBwcm9wZXIgbWYgdmFsdWUgZmlyc3QgaGVyZTotKQorCQkJCSAqLworCQkJCWlmICgocGEgJiAweDU4MDAwMDAwKSA9PSAweDU4MDAwMDAwKSB7CisJCQkJCXJlcV9pZHggPSBwYSAmIDB4MDAwMEZGRkY7CisJCQkJCW1mID0gTVBUX0lOREVYXzJfTUZQVFIoaW9jLCByZXFfaWR4KTsKKwkJCQkJZnJlZW1lID0gMTsKKwkJCQkJLyoKKwkJCQkJICogIElNUE9SVEFOVCEgIEludmFsaWRhdGUgdGhlIGNhbGxiYWNrIQorCQkJCQkgKi8KKwkJCQkJY2JfaWR4ID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQltZiA9IE5VTEw7CisJCQkJfQorCQkJCW1yID0gKE1QVF9GUkFNRV9IRFIgKikgQ0FTVF9VMzJfVE9fUFRSKHBhKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVxX2lkeCA9IHBhICYgMHgwMDAwRkZGRjsKKwkJCQljYl9pZHggPSAocGEgJiAweDAwRkYwMDAwKSA+PiAxNjsKKwkJCQltZiA9IE1QVF9JTkRFWF8yX01GUFRSKGlvYywgcmVxX2lkeCk7CisJCQkJbXIgPSBOVUxMOworCQkJfQorCQkJcGEgPSAwOwkJCQkJLyogTm8gcmVwbHkgZmx1c2ghICovCisJCX0KKworI2lmZGVmIE1QVF9ERUJVR19JUlEKKwkJaWYgKGlvYy0+YnVzX3R5cGUgPT0gU0NTSSkgeworCQkJLyogVmVyaWZ5IG1mLCBtciBhcmUgcmVhc29uYWJsZS4KKwkJCSAqLworCQkJaWYgKChtZikgJiYgKChtZiA+PSBNUFRfSU5ERVhfMl9NRlBUUihpb2MsIGlvYy0+cmVxX2RlcHRoKSkKKwkJCQl8fCAobWYgPCBpb2MtPnJlcV9mcmFtZXMpKSApIHsKKwkJCQlwcmludGsoTVlJT0Nfc19XQVJOX0ZNVAorCQkJCQkibXB0X2ludGVycnVwdDogSW52YWxpZCBtZiAoJXApIHJlcV9pZHggKCVkKSFcbiIsIGlvYy0+bmFtZSwgKHZvaWQgKiltZiwgcmVxX2lkeCk7CisJCQkJY2JfaWR4ID0gMDsKKwkJCQlwYSA9IDA7CisJCQkJZnJlZW1lID0gMDsKKwkJCX0KKwkJCWlmICgocGEpICYmIChtcikgJiYgKChtciA+PSBNUFRfSU5ERVhfMl9SRlBUUihpb2MsIGlvYy0+cmVxX2RlcHRoKSkKKwkJCQl8fCAobXIgPCBpb2MtPnJlcGx5X2ZyYW1lcykpICkgeworCQkJCXByaW50ayhNWUlPQ19zX1dBUk5fRk1UCisJCQkJCSJtcHRfaW50ZXJydXB0OiBJbnZhbGlkIHJmICglcCkhXG4iLCBpb2MtPm5hbWUsICh2b2lkICopbXIpOworCQkJCWNiX2lkeCA9IDA7CisJCQkJcGEgPSAwOworCQkJCWZyZWVtZSA9IDA7CisJCQl9CisJCQlpZiAoY2JfaWR4ID4gKE1QVF9NQVhfUFJPVE9DT0xfRFJJVkVSUy0xKSkgeworCQkJCXByaW50ayhNWUlPQ19zX1dBUk5fRk1UCisJCQkJCSJtcHRfaW50ZXJydXB0OiBJbnZhbGlkIGNiX2lkeCAoJWQpIVxuIiwgaW9jLT5uYW1lLCBjYl9pZHgpOworCQkJCWNiX2lkeCA9IDA7CisJCQkJcGEgPSAwOworCQkJCWZyZWVtZSA9IDA7CisJCQl9CisJCX0KKyNlbmRpZgorCisJCS8qICBDaGVjayBmb3IgKHZhbGlkKSBJTyBjYWxsYmFjayEgICovCisJCWlmIChjYl9pZHgpIHsKKwkJCS8qICBEbyB0aGUgY2FsbGJhY2shICAqLworCQkJZnJlZW1lID0gKCooTXB0Q2FsbGJhY2tzW2NiX2lkeF0pKShpb2MsIG1mLCBtcik7CisJCX0KKworCQlpZiAocGEpIHsKKwkJCS8qICBGbHVzaCAobm9uLVRVUkJPKSByZXBseSB3aXRoIGEgV1JJVEUhICAqLworCQkJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPlJlcGx5RmlmbywgcGEpOworCQl9CisKKwkJaWYgKGZyZWVtZSkgeworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkJLyogIFB1dCBSZXF1ZXN0IGJhY2sgb24gRnJlZVEhICAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CisJCQlsaXN0X2FkZF90YWlsKCZtZi0+dS5mcmFtZS5saW5rYWdlLmxpc3QsICZpb2MtPkZyZWVRKTsKKyNpZmRlZiBNRkNOVAorCQkJaW9jLT5tZmNudC0tOworI2VuZGlmCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPkZyZWVRbG9jaywgZmxhZ3MpOworCQl9CisKKwkJbWIoKTsKKwl9CS8qIGRyYWluIHJlcGx5IEZJRk8gKi8KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCW1wdF9iYXNlX3JlcGx5IC0gTVBUIGJhc2UgZHJpdmVyJ3MgY2FsbGJhY2sgcm91dGluZTsgYWxsIGJhc2UgZHJpdmVyCisgKgkiaW50ZXJuYWwiIHJlcXVlc3QvcmVwbHkgcHJvY2Vzc2luZyBpcyByb3V0ZWQgaGVyZS4KKyAqCUN1cnJlbnRseSB1c2VkIGZvciBFdmVudE5vdGlmaWNhdGlvbiBhbmQgRXZlbnRBY2sgaGFuZGxpbmcuCisgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQorICoJQG1mOiBQb2ludGVyIHRvIG9yaWdpbmFsIE1QVCByZXF1ZXN0IGZyYW1lCisgKglAcmVwbHk6IFBvaW50ZXIgdG8gTVBUIHJlcGx5IGZyYW1lIChOVUxMIGlmIFR1cmJvUmVwbHkpCisgKgorCSoJUmV0dXJucyAxIGluZGljYXRpbmcgb3JpZ2luYWwgYWxsb2MnZCByZXF1ZXN0IGZyYW1lIHB0cgorICoJc2hvdWxkIGJlIGZyZWVkLCBvciAwIGlmIGl0IHNob3VsZG4ndC4KKyAqLworc3RhdGljIGludAorbXB0X2Jhc2VfcmVwbHkoTVBUX0FEQVBURVIgKmlvYywgTVBUX0ZSQU1FX0hEUiAqbWYsIE1QVF9GUkFNRV9IRFIgKnJlcGx5KQoreworCWludCBmcmVlcmVxID0gMTsKKwl1OCBmdW5jOworCisJZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAibXB0X2Jhc2VfcmVwbHkoKSBjYWxsZWRcbiIsIGlvYy0+bmFtZSkpOworCisJaWYgKChtZiA9PSBOVUxMKSB8fAorCSAgICAobWYgPj0gTVBUX0lOREVYXzJfTUZQVFIoaW9jLCBpb2MtPnJlcV9kZXB0aCkpKSB7CisJCXByaW50ayhNWUlPQ19zX0VSUl9GTVQgIk5VTEwgb3IgQkFEIHJlcXVlc3QgZnJhbWUgcHRyISAoPSVwKVxuIiwKKwkJCQlpb2MtPm5hbWUsICh2b2lkICopbWYpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAocmVwbHkgPT0gTlVMTCkgeworCQlkcHJpbnRrKChNWUlPQ19zX0VSUl9GTVQgIlVuZXhwZWN0ZWQgTlVMTCBFdmVudCAodHVyYm8/KSByZXBseSFcbiIsCisJCQkJaW9jLT5uYW1lKSk7CisJCXJldHVybiAxOworCX0KKworCWlmICghKHJlcGx5LT51Lmhkci5Nc2dGbGFncyAmIE1QSV9NU0dGTEFHU19DT05USU5VQVRJT05fUkVQTFkpKSB7CisJCWRtZnByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IE9yaWdpbmFsIHJlcXVlc3QgZnJhbWUgKEAlcCkgaGVhZGVyXG4iLCBtZikpOworCQlEQkdfRFVNUF9SRVFVRVNUX0ZSQU1FX0hEUihtZikKKwl9CisKKwlmdW5jID0gcmVwbHktPnUuaGRyLkZ1bmN0aW9uOworCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIm1wdF9iYXNlX3JlcGx5LCBGdW5jdGlvbj0lMDJYaFxuIiwKKwkJCWlvYy0+bmFtZSwgZnVuYykpOworCisJaWYgKGZ1bmMgPT0gTVBJX0ZVTkNUSU9OX0VWRU5UX05PVElGSUNBVElPTikgeworCQlFdmVudE5vdGlmaWNhdGlvblJlcGx5X3QgKnBFdlJlcGx5ID0gKEV2ZW50Tm90aWZpY2F0aW9uUmVwbHlfdCAqKSByZXBseTsKKwkJaW50IGV2SGFuZGxlcnMgPSAwOworCQlpbnQgcmVzdWx0czsKKworCQlyZXN1bHRzID0gUHJvY2Vzc0V2ZW50Tm90aWZpY2F0aW9uKGlvYywgcEV2UmVwbHksICZldkhhbmRsZXJzKTsKKwkJaWYgKHJlc3VsdHMgIT0gZXZIYW5kbGVycykgeworCQkJLyogQ0hFQ0tNRSEgQW55IHNwZWNpYWwgaGFuZGxpbmcgbmVlZGVkIGhlcmU/ICovCisJCQlkZXZ0cHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJDYWxsZWQgJWQgZXZlbnQgaGFuZGxlcnMsIHN1bSByZXN1bHRzID0gJWRcbiIsCisJCQkJCWlvYy0+bmFtZSwgZXZIYW5kbGVycywgcmVzdWx0cykpOworCQl9CisKKwkJLyoKKwkJICoJSG1tbS4uLiAgSXQgc2VlbXMgdGhhdCBFdmVudE5vdGlmaWNhdGlvblJlcGx5IGlzIGFuIGV4Y2VwdGlvbgorCQkgKgl0byB0aGUgcnVsZSBvZiBvbmUgcmVwbHkgcGVyIHJlcXVlc3QuCisJCSAqLworCQlpZiAocEV2UmVwbHktPk1zZ0ZsYWdzICYgTVBJX01TR0ZMQUdTX0NPTlRJTlVBVElPTl9SRVBMWSkKKwkJCWZyZWVyZXEgPSAwOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKy8vCQlMb2dFdmVudChpb2MsIHBFdlJlcGx5KTsKKyNlbmRpZgorCisJfSBlbHNlIGlmIChmdW5jID09IE1QSV9GVU5DVElPTl9FVkVOVF9BQ0spIHsKKwkJZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAibXB0X2Jhc2VfcmVwbHksIEV2ZW50QWNrIHJlcGx5IHJlY2VpdmVkXG4iLAorCQkJCWlvYy0+bmFtZSkpOworCX0gZWxzZSBpZiAoZnVuYyA9PSBNUElfRlVOQ1RJT05fQ09ORklHIHx8CisJCSAgIGZ1bmMgPT0gTVBJX0ZVTkNUSU9OX1RPT0xCT1gpIHsKKwkJQ09ORklHUEFSTVMgKnBDZmc7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJZGNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgImNvbmZpZ19jb21wbGV0ZSAobWY9JXAsbXI9JXApXG4iLAorCQkJCWlvYy0+bmFtZSwgbWYsIHJlcGx5KSk7CisKKwkJcENmZyA9ICogKChDT05GSUdQQVJNUyAqKikoKHU4ICopIG1mICsgaW9jLT5yZXFfc3ogLSBzaXplb2Yodm9pZCAqKSkpOworCisJCWlmIChwQ2ZnKSB7CisJCQkvKiBkaXNhYmxlIHRpbWVyIGFuZCByZW1vdmUgZnJvbSBsaW5rZWQgbGlzdCAqLworCQkJZGVsX3RpbWVyKCZwQ2ZnLT50aW1lcik7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPkZyZWVRbG9jaywgZmxhZ3MpOworCQkJbGlzdF9kZWwoJnBDZmctPmxpbmthZ2UpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5GcmVlUWxvY2ssIGZsYWdzKTsKKworCQkJLyoKKwkJCSAqCUlmIElPQyBTdGF0dXMgaXMgU1VDQ0VTUywgc2F2ZSB0aGUgaGVhZGVyCisJCQkgKglhbmQgc2V0IHRoZSBzdGF0dXMgY29kZSB0byBHT09ELgorCQkJICovCisJCQlwQ2ZnLT5zdGF0dXMgPSBNUFRfQ09ORklHX0VSUk9SOworCQkJaWYgKHJlcGx5KSB7CisJCQkJQ29uZmlnUmVwbHlfdAkqcFJlcGx5ID0gKENvbmZpZ1JlcGx5X3QgKilyZXBseTsKKwkJCQl1MTYJCSBzdGF0dXM7CisKKwkJCQlzdGF0dXMgPSBsZTE2X3RvX2NwdShwUmVwbHktPklPQ1N0YXR1cykgJiBNUElfSU9DU1RBVFVTX01BU0s7CisJCQkJZGNwcmludGsoKEtFUk5fTk9USUNFICIgIElPQ1N0YXR1cz0lMDR4aCwgSU9DTG9nSW5mbz0lMDh4aFxuIiwKKwkJCQkgICAgIHN0YXR1cywgbGUzMl90b19jcHUocFJlcGx5LT5JT0NMb2dJbmZvKSkpOworCisJCQkJcENmZy0+c3RhdHVzID0gc3RhdHVzOworCQkJCWlmIChzdGF0dXMgPT0gTVBJX0lPQ1NUQVRVU19TVUNDRVNTKSB7CisJCQkJCXBDZmctPmhkci0+UGFnZVZlcnNpb24gPSBwUmVwbHktPkhlYWRlci5QYWdlVmVyc2lvbjsKKwkJCQkJcENmZy0+aGRyLT5QYWdlTGVuZ3RoID0gcFJlcGx5LT5IZWFkZXIuUGFnZUxlbmd0aDsKKwkJCQkJcENmZy0+aGRyLT5QYWdlTnVtYmVyID0gcFJlcGx5LT5IZWFkZXIuUGFnZU51bWJlcjsKKwkJCQkJcENmZy0+aGRyLT5QYWdlVHlwZSA9IHBSZXBseS0+SGVhZGVyLlBhZ2VUeXBlOworCQkJCX0KKwkJCX0KKworCQkJLyoKKwkJCSAqCVdha2UgdXAgdGhlIG9yaWdpbmFsIGNhbGxpbmcgdGhyZWFkCisJCQkgKi8KKwkJCXBDZmctPndhaXRfZG9uZSA9IDE7CisJCQl3YWtlX3VwKCZtcHRfd2FpdHEpOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVCAiVW5leHBlY3RlZCBtc2cgZnVuY3Rpb24gKD0lMDJYaCkgcmVwbHkgcmVjZWl2ZWQhXG4iLAorCQkJCWlvYy0+bmFtZSwgZnVuYyk7CisJfQorCisJLyoKKwkgKglDb25kaXRpb25hbGx5IHRlbGwgY2FsbGVyIHRvIGZyZWUgdGhlIG9yaWdpbmFsCisJICoJRXZlbnROb3RpZmljYXRpb24vRXZlbnRBY2svdW5leHBlY3RlZCByZXF1ZXN0IGZyYW1lIQorCSAqLworCXJldHVybiBmcmVlcmVxOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKioKKyAqCW1wdF9yZWdpc3RlciAtIFJlZ2lzdGVyIHByb3RvY29sLXNwZWNpZmljIG1haW4gY2FsbGJhY2sgaGFuZGxlci4KKyAqCUBjYmZ1bmM6IGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIKKyAqCUBkY2xhc3M6IFByb3RvY29sIGRyaXZlcidzIGNsYXNzICglTVBUX0RSSVZFUl9DTEFTUyBlbnVtIHZhbHVlKQorICoKKyAqCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgYSBwcm90b2NvbC1zcGVjaWZpYyBkcml2ZXIgKFNDU0kgaG9zdCwKKyAqCUxBTiwgU0NTSSB0YXJnZXQpIHRvIHJlZ2lzdGVyIGl0J3MgcmVwbHkgY2FsbGJhY2sgcm91dGluZS4gIEVhY2gKKyAqCXByb3RvY29sLXNwZWNpZmljIGRyaXZlciBtdXN0IGRvIHRoaXMgYmVmb3JlIGl0IHdpbGwgYmUgYWJsZSB0bworICoJdXNlIGFueSBJT0MgcmVzb3VyY2VzLCBzdWNoIGFzIG9idGFpbmluZyByZXF1ZXN0IGZyYW1lcy4KKyAqCisgKglOT1RFUzogVGhlIFNDU0kgcHJvdG9jb2wgZHJpdmVyIGN1cnJlbnRseSBjYWxscyB0aGlzIHJvdXRpbmUgdGhyaWNlCisgKglpbiBvcmRlciB0byByZWdpc3RlciBzZXBhcmF0ZSBjYWxsYmFja3M7IG9uZSBmb3IgIm5vcm1hbCIgU0NTSSBJTzsKKyAqCW9uZSBmb3IgTXB0U2NzaVRhc2tNZ210IHJlcXVlc3RzOyBvbmUgZm9yIFNjYW4vRFYgcmVxdWVzdHMuCisgKgorICoJUmV0dXJucyBhIHBvc2l0aXZlIGludGVnZXIgdmFsdWVkICJoYW5kbGUiIGluIHRoZQorICoJcmFuZ2UgKGFuZCBTLk8uRC4gb3JkZXIpIHtOLC4uLiw3LDYsNSwuLi4sMX0gaWYgc3VjY2Vzc2Z1bC4KKyAqCUFueSBub24tcG9zaXRpdmUgcmV0dXJuIHZhbHVlIChpbmNsdWRpbmcgemVybyEpIHNob3VsZCBiZSBjb25zaWRlcmVkCisgKglhbiBlcnJvciBieSB0aGUgY2FsbGVyLgorICovCitpbnQKK21wdF9yZWdpc3RlcihNUFRfQ0FMTEJBQ0sgY2JmdW5jLCBNUFRfRFJJVkVSX0NMQVNTIGRjbGFzcykKK3sKKwlpbnQgaTsKKworCWxhc3RfZHJ2X2lkeCA9IC0xOworCisJLyoKKwkgKiAgU2VhcmNoIGZvciBlbXB0eSBjYWxsYmFjayBzbG90IGluIHRoaXMgb3JkZXI6IHtOLC4uLiw3LDYsNSwuLi4sMX0KKwkgKiAgKHNsb3QvaGFuZGxlIDAgaXMgcmVzZXJ2ZWQhKQorCSAqLworCWZvciAoaSA9IE1QVF9NQVhfUFJPVE9DT0xfRFJJVkVSUy0xOyBpOyBpLS0pIHsKKwkJaWYgKE1wdENhbGxiYWNrc1tpXSA9PSBOVUxMKSB7CisJCQlNcHRDYWxsYmFja3NbaV0gPSBjYmZ1bmM7CisJCQlNcHREcml2ZXJDbGFzc1tpXSA9IGRjbGFzczsKKwkJCU1wdEV2SGFuZGxlcnNbaV0gPSBOVUxMOworCQkJbGFzdF9kcnZfaWR4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGxhc3RfZHJ2X2lkeDsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoqCisgKgltcHRfZGVyZWdpc3RlciAtIERlcmVnaXN0ZXIgYSBwcm90b2NvbCBkcml2ZXJzIHJlc291cmNlcy4KKyAqCUBjYl9pZHg6IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjYWxsYmFjayBoYW5kbGUKKyAqCisgKglFYWNoIHByb3RvY29sLXNwZWNpZmljIGRyaXZlciBzaG91bGQgY2FsbCB0aGlzIHJvdXRpbmUgd2hlbiBpdCdzCisgKgltb2R1bGUgaXMgdW5sb2FkZWQuCisgKi8KK3ZvaWQKK21wdF9kZXJlZ2lzdGVyKGludCBjYl9pZHgpCit7CisJaWYgKChjYl9pZHggPj0gMCkgJiYgKGNiX2lkeCA8IE1QVF9NQVhfUFJPVE9DT0xfRFJJVkVSUykpIHsKKwkJTXB0Q2FsbGJhY2tzW2NiX2lkeF0gPSBOVUxMOworCQlNcHREcml2ZXJDbGFzc1tjYl9pZHhdID0gTVBUVU5LTk9XTl9EUklWRVI7CisJCU1wdEV2SGFuZGxlcnNbY2JfaWR4XSA9IE5VTEw7CisKKwkJbGFzdF9kcnZfaWR4Kys7CisJfQorfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKioKKyAqCW1wdF9ldmVudF9yZWdpc3RlciAtIFJlZ2lzdGVyIHByb3RvY29sLXNwZWNpZmljIGV2ZW50IGNhbGxiYWNrCisgKgloYW5kbGVyLgorICoJQGNiX2lkeDogcHJldmlvdXNseSByZWdpc3RlcmVkICh2aWEgbXB0X3JlZ2lzdGVyKSBjYWxsYmFjayBoYW5kbGUKKyAqCUBldl9jYmZ1bmM6IGNhbGxiYWNrIGZ1bmN0aW9uCisgKgorICoJVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgYnkgb25lIG9yIG1vcmUgcHJvdG9jb2wtc3BlY2lmaWMgZHJpdmVycworICoJaWYvd2hlbiB0aGV5IGNob29zZSB0byBiZSBub3RpZmllZCBvZiBNUFQgZXZlbnRzLgorICoKKyAqCVJldHVybnMgMCBmb3Igc3VjY2Vzcy4KKyAqLworaW50CittcHRfZXZlbnRfcmVnaXN0ZXIoaW50IGNiX2lkeCwgTVBUX0VWSEFORExFUiBldl9jYmZ1bmMpCit7CisJaWYgKGNiX2lkeCA8IDEgfHwgY2JfaWR4ID49IE1QVF9NQVhfUFJPVE9DT0xfRFJJVkVSUykKKwkJcmV0dXJuIC0xOworCisJTXB0RXZIYW5kbGVyc1tjYl9pZHhdID0gZXZfY2JmdW5jOworCXJldHVybiAwOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKioKKyAqCW1wdF9ldmVudF9kZXJlZ2lzdGVyIC0gRGVyZWdpc3RlciBwcm90b2NvbC1zcGVjaWZpYyBldmVudCBjYWxsYmFjaworICoJaGFuZGxlci4KKyAqCUBjYl9pZHg6IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjYWxsYmFjayBoYW5kbGUKKyAqCisgKglFYWNoIHByb3RvY29sLXNwZWNpZmljIGRyaXZlciBzaG91bGQgY2FsbCB0aGlzIHJvdXRpbmUKKyAqCXdoZW4gaXQgZG9lcyBub3QgKG9yIGNhbiBubyBsb25nZXIpIGhhbmRsZSBldmVudHMsCisgKglvciB3aGVuIGl0J3MgbW9kdWxlIGlzIHVubG9hZGVkLgorICovCit2b2lkCittcHRfZXZlbnRfZGVyZWdpc3RlcihpbnQgY2JfaWR4KQoreworCWlmIChjYl9pZHggPCAxIHx8IGNiX2lkeCA+PSBNUFRfTUFYX1BST1RPQ09MX0RSSVZFUlMpCisJCXJldHVybjsKKworCU1wdEV2SGFuZGxlcnNbY2JfaWR4XSA9IE5VTEw7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qKgorICoJbXB0X3Jlc2V0X3JlZ2lzdGVyIC0gUmVnaXN0ZXIgcHJvdG9jb2wtc3BlY2lmaWMgSU9DIHJlc2V0IGhhbmRsZXIuCisgKglAY2JfaWR4OiBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgKHZpYSBtcHRfcmVnaXN0ZXIpIGNhbGxiYWNrIGhhbmRsZQorICoJQHJlc2V0X2Z1bmM6IHJlc2V0IGZ1bmN0aW9uCisgKgorICoJVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgYnkgb25lIG9yIG1vcmUgcHJvdG9jb2wtc3BlY2lmaWMgZHJpdmVycworICoJaWYvd2hlbiB0aGV5IGNob29zZSB0byBiZSBub3RpZmllZCBvZiBJT0MgcmVzZXRzLgorICoKKyAqCVJldHVybnMgMCBmb3Igc3VjY2Vzcy4KKyAqLworaW50CittcHRfcmVzZXRfcmVnaXN0ZXIoaW50IGNiX2lkeCwgTVBUX1JFU0VUSEFORExFUiByZXNldF9mdW5jKQoreworCWlmIChjYl9pZHggPCAxIHx8IGNiX2lkeCA+PSBNUFRfTUFYX1BST1RPQ09MX0RSSVZFUlMpCisJCXJldHVybiAtMTsKKworCU1wdFJlc2V0SGFuZGxlcnNbY2JfaWR4XSA9IHJlc2V0X2Z1bmM7CisJcmV0dXJuIDA7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qKgorICoJbXB0X3Jlc2V0X2RlcmVnaXN0ZXIgLSBEZXJlZ2lzdGVyIHByb3RvY29sLXNwZWNpZmljIElPQyByZXNldCBoYW5kbGVyLgorICoJQGNiX2lkeDogcHJldmlvdXNseSByZWdpc3RlcmVkIGNhbGxiYWNrIGhhbmRsZQorICoKKyAqCUVhY2ggcHJvdG9jb2wtc3BlY2lmaWMgZHJpdmVyIHNob3VsZCBjYWxsIHRoaXMgcm91dGluZQorICoJd2hlbiBpdCBkb2VzIG5vdCAob3IgY2FuIG5vIGxvbmdlcikgaGFuZGxlIElPQyByZXNldCBoYW5kbGluZywKKyAqCW9yIHdoZW4gaXQncyBtb2R1bGUgaXMgdW5sb2FkZWQuCisgKi8KK3ZvaWQKK21wdF9yZXNldF9kZXJlZ2lzdGVyKGludCBjYl9pZHgpCit7CisJaWYgKGNiX2lkeCA8IDEgfHwgY2JfaWR4ID49IE1QVF9NQVhfUFJPVE9DT0xfRFJJVkVSUykKKwkJcmV0dXJuOworCisJTXB0UmVzZXRIYW5kbGVyc1tjYl9pZHhdID0gTlVMTDsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoqCisgKgltcHRfZGV2aWNlX2RyaXZlcl9yZWdpc3RlciAtIFJlZ2lzdGVyIGRldmljZSBkcml2ZXIgaG9va3MKKyAqLworaW50CittcHRfZGV2aWNlX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgbXB0X3BjaV9kcml2ZXIgKiBkZF9jYmZ1bmMsIGludCBjYl9pZHgpCit7CisJTVBUX0FEQVBURVIJKmlvYzsKKwlpbnQgCQllcnJvcj0wOworCisJaWYgKGNiX2lkeCA8IDEgfHwgY2JfaWR4ID49IE1QVF9NQVhfUFJPVE9DT0xfRFJJVkVSUykgeworCQllcnJvcj0gLUVJTlZBTDsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCU1wdERldmljZURyaXZlckhhbmRsZXJzW2NiX2lkeF0gPSBkZF9jYmZ1bmM7CisKKwkvKiBjYWxsIHBlciBwY2kgZGV2aWNlIHByb2JlIGVudHJ5IHBvaW50ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpb2MsICZpb2NfbGlzdCwgbGlzdCkgeworCQlpZihkZF9jYmZ1bmMtPnByb2JlKSB7CisJCQllcnJvciA9IGRkX2NiZnVuYy0+cHJvYmUoaW9jLT5wY2lkZXYsCisJCQkgIGlvYy0+cGNpZGV2LT5kcml2ZXItPmlkX3RhYmxlKTsKKwkJCWlmKGVycm9yICE9IDApCisJCQkJcmV0dXJuIGVycm9yOworICAJCX0KKwkgfQorCisJcmV0dXJuIGVycm9yOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKioKKyAqCW1wdF9kZXZpY2VfZHJpdmVyX2RlcmVnaXN0ZXIgLSBEZVJlZ2lzdGVyIGRldmljZSBkcml2ZXIgaG9va3MKKyAqLwordm9pZAorbXB0X2RldmljZV9kcml2ZXJfZGVyZWdpc3RlcihpbnQgY2JfaWR4KQoreworCXN0cnVjdCBtcHRfcGNpX2RyaXZlciAqZGRfY2JmdW5jOworCU1QVF9BREFQVEVSCSppb2M7CisKKwlpZiAoY2JfaWR4IDwgMSB8fCBjYl9pZHggPj0gTVBUX01BWF9QUk9UT0NPTF9EUklWRVJTKQorCQlyZXR1cm47CisKKwlkZF9jYmZ1bmMgPSBNcHREZXZpY2VEcml2ZXJIYW5kbGVyc1tjYl9pZHhdOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpb2MsICZpb2NfbGlzdCwgbGlzdCkgeworCQlpZiAoZGRfY2JmdW5jLT5yZW1vdmUpCisJCQlkZF9jYmZ1bmMtPnJlbW92ZShpb2MtPnBjaWRldik7CisJfQorCQorCU1wdERldmljZURyaXZlckhhbmRsZXJzW2NiX2lkeF0gPSBOVUxMOworfQorCisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qKgorICoJbXB0X2dldF9tc2dfZnJhbWUgLSBPYnRhaW4gYSBNUFQgcmVxdWVzdCBmcmFtZSBmcm9tIHRoZSBwb29sIChvZiAxMDI0KQorICoJYWxsb2NhdGVkIHBlciBNUFQgYWRhcHRlci4KKyAqCUBoYW5kbGU6IEhhbmRsZSBvZiByZWdpc3RlcmVkIE1QVCBwcm90b2NvbCBkcml2ZXIKKyAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICoJUmV0dXJucyBwb2ludGVyIHRvIGEgTVBUIHJlcXVlc3QgZnJhbWUgb3IgJU5VTEwgaWYgbm9uZSBhcmUgYXZhaWxhYmxlCisgKglvciBJT0MgaXMgbm90IGFjdGl2ZS4KKyAqLworTVBUX0ZSQU1FX0hEUioKK21wdF9nZXRfbXNnX2ZyYW1lKGludCBoYW5kbGUsIE1QVF9BREFQVEVSICppb2MpCit7CisJTVBUX0ZSQU1FX0hEUiAqbWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYJIHJlcV9pZHg7CS8qIFJlcXVlc3QgaW5kZXggKi8KKworCS8qIHZhbGlkYXRlIGhhbmRsZSBhbmQgaW9jIGlkZW50aWZpZXIgKi8KKworI2lmZGVmIE1GQ05UCisJaWYgKCFpb2MtPmFjdGl2ZSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSU9DIE5vdCBBY3RpdmUhIG1wdF9nZXRfbXNnX2ZyYW1lIHJldHVybmluZyBOVUxMIVxuIik7CisjZW5kaWYKKworCS8qIElmIGludGVycnVwdHMgYXJlIG5vdCBhdHRhY2hlZCwgZG8gbm90IHJldHVybiBhIHJlcXVlc3QgZnJhbWUgKi8KKwlpZiAoIWlvYy0+YWN0aXZlKQorCQlyZXR1cm4gTlVMTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPkZyZWVRbG9jaywgZmxhZ3MpOworCWlmICghbGlzdF9lbXB0eSgmaW9jLT5GcmVlUSkpIHsKKwkJaW50IHJlcV9vZmZzZXQ7CisKKwkJbWYgPSBsaXN0X2VudHJ5KGlvYy0+RnJlZVEubmV4dCwgTVBUX0ZSQU1FX0hEUiwKKwkJCQl1LmZyYW1lLmxpbmthZ2UubGlzdCk7CisJCWxpc3RfZGVsKCZtZi0+dS5mcmFtZS5saW5rYWdlLmxpc3QpOworCQltZi0+dS5mcmFtZS5od2hkci5tc2djdHh1LmZsZC5jYl9pZHggPSBoYW5kbGU7CS8qIGJ5dGUgKi8KKwkJcmVxX29mZnNldCA9ICh1OCAqKW1mIC0gKHU4ICopaW9jLT5yZXFfZnJhbWVzOworCQkJCQkJCQkvKiB1MTYhICovCisJCXJlcV9pZHggPSBjcHVfdG9fbGUxNihyZXFfb2Zmc2V0IC8gaW9jLT5yZXFfc3opOworCQltZi0+dS5mcmFtZS5od2hkci5tc2djdHh1LmZsZC5yZXFfaWR4ID0gcmVxX2lkeDsKKwkJbWYtPnUuZnJhbWUuaHdoZHIubXNnY3R4dS5mbGQucnN2ZCA9IDA7CisJCWlvYy0+UmVxdWVzdE5CW3JlcV9pZHhdID0gaW9jLT5OQl9mb3JfNjRfYnl0ZV9mcmFtZTsgLyogRGVmYXVsdCwgd2lsbCBiZSBjaGFuZ2VkIGlmIG5lY2Vzc2FyeSBpbiBTRyBnZW5lcmF0aW9uICovCisjaWZkZWYgTUZDTlQKKwkJaW9jLT5tZmNudCsrOworI2VuZGlmCisJfQorCWVsc2UKKwkJbWYgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CisKKyNpZmRlZiBNRkNOVAorCWlmIChtZiA9PSBOVUxMKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJJT0MgQWN0aXZlLiBObyBmcmVlIE1zZyBGcmFtZXMhIENvdW50IDB4JXggTWF4IDB4JXhcbiIsIGlvYy0+bWZjbnQsIGlvYy0+cmVxX2RlcHRoKTsKKwltZmNvdW50ZXIrKzsKKwlpZiAobWZjb3VudGVyID09IFBSSU5UX01GX0NPVU5UKQorCQlwcmludGsoS0VSTl9JTkZPICJNRiBDb3VudCAweCV4IE1heCAweCV4IFxuIiwgaW9jLT5tZmNudCwgaW9jLT5yZXFfZGVwdGgpOworI2VuZGlmCisKKwlkbWZwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlczogbXB0X2dldF9tc2dfZnJhbWUoJWQsJWQpLCBnb3QgbWY9JXBcbiIsCisJCQlpb2MtPm5hbWUsIGhhbmRsZSwgaW9jLT5pZCwgbWYpKTsKKwlyZXR1cm4gbWY7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qKgorICoJbXB0X3B1dF9tc2dfZnJhbWUgLSBTZW5kIGEgcHJvdG9jb2wgc3BlY2lmaWMgTVBUIHJlcXVlc3QgZnJhbWUKKyAqCXRvIGEgSU9DLgorICoJQGhhbmRsZTogSGFuZGxlIG9mIHJlZ2lzdGVyZWQgTVBUIHByb3RvY29sIGRyaXZlcgorICoJQGlvYzogUG9pbnRlciB0byBNUFQgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCUBtZjogUG9pbnRlciB0byBNUFQgcmVxdWVzdCBmcmFtZQorICoKKyAqCVRoaXMgcm91dGluZSBwb3N0cyBhIE1QVCByZXF1ZXN0IGZyYW1lIHRvIHRoZSByZXF1ZXN0IHBvc3QgRklGTyBvZiBhCisgKglzcGVjaWZpYyBNUFQgYWRhcHRlci4KKyAqLwordm9pZAorbXB0X3B1dF9tc2dfZnJhbWUoaW50IGhhbmRsZSwgTVBUX0FEQVBURVIgKmlvYywgTVBUX0ZSQU1FX0hEUiAqbWYpCit7CisJdTMyIG1mX2RtYV9hZGRyOworCWludCByZXFfb2Zmc2V0OworCXUxNgkgcmVxX2lkeDsJLyogUmVxdWVzdCBpbmRleCAqLworCisJLyogZW5zdXJlIHZhbHVlcyBhcmUgcmVzZXQgcHJvcGVybHkhICovCisJbWYtPnUuZnJhbWUuaHdoZHIubXNnY3R4dS5mbGQuY2JfaWR4ID0gaGFuZGxlOwkJLyogYnl0ZSAqLworCXJlcV9vZmZzZXQgPSAodTggKiltZiAtICh1OCAqKWlvYy0+cmVxX2ZyYW1lczsKKwkJCQkJCQkJLyogdTE2ISAqLworCXJlcV9pZHggPSBjcHVfdG9fbGUxNihyZXFfb2Zmc2V0IC8gaW9jLT5yZXFfc3opOworCW1mLT51LmZyYW1lLmh3aGRyLm1zZ2N0eHUuZmxkLnJlcV9pZHggPSByZXFfaWR4OworCW1mLT51LmZyYW1lLmh3aGRyLm1zZ2N0eHUuZmxkLnJzdmQgPSAwOworCisjaWZkZWYgTVBUX0RFQlVHX01TR19GUkFNRQorCXsKKwkJdTMyCSptID0gbWYtPnUuZnJhbWUuaHdoZHIuX19oZHI7CisJCWludAkgaWksIG47CisKKwkJcHJpbnRrKEtFUk5fSU5GTyBNWU5BTSAiOiAlczogQWJvdXQgdG8gUHV0IG1zZyBmcmFtZSBAICVwOlxuIiBLRVJOX0lORk8gIiAiLAorCQkJCWlvYy0+bmFtZSwgbSk7CisJCW4gPSBpb2MtPnJlcV9zei80IC0gMTsKKwkJd2hpbGUgKG1bbl0gPT0gMCkKKwkJCW4tLTsKKwkJZm9yIChpaT0wOyBpaTw9bjsgaWkrKykgeworCQkJaWYgKGlpICYmICgoaWklOCk9PTApKQorCQkJCXByaW50aygiXG4iIEtFUk5fSU5GTyAiICIpOworCQkJcHJpbnRrKCIgJTA4eCIsIGxlMzJfdG9fY3B1KG1baWldKSk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCX0KKyNlbmRpZgorCisJbWZfZG1hX2FkZHIgPSAoaW9jLT5yZXFfZnJhbWVzX2xvd19kbWEgKyByZXFfb2Zmc2V0KSB8IGlvYy0+UmVxdWVzdE5CW3JlcV9pZHhdOyAgCisJZHNncHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJtZl9kbWFfYWRkcj0leCByZXFfaWR4PSVkIFJlcXVlc3ROQj0leFxuIiwgaW9jLT5uYW1lLCBtZl9kbWFfYWRkciwgcmVxX2lkeCwgaW9jLT5SZXF1ZXN0TkJbcmVxX2lkeF0pKTsKKwlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+UmVxdWVzdEZpZm8sIG1mX2RtYV9hZGRyKTsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoqCisgKgltcHRfZnJlZV9tc2dfZnJhbWUgLSBQbGFjZSBNUFQgcmVxdWVzdCBmcmFtZSBiYWNrIG9uIEZyZWVRLgorICoJQGhhbmRsZTogSGFuZGxlIG9mIHJlZ2lzdGVyZWQgTVBUIHByb3RvY29sIGRyaXZlcgorICoJQGlvYzogUG9pbnRlciB0byBNUFQgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCUBtZjogUG9pbnRlciB0byBNUFQgcmVxdWVzdCBmcmFtZQorICoKKyAqCVRoaXMgcm91dGluZSBwbGFjZXMgYSBNUFQgcmVxdWVzdCBmcmFtZSBiYWNrIG9uIHRoZSBNUFQgYWRhcHRlcidzCisgKglGcmVlUS4KKyAqLwordm9pZAorbXB0X2ZyZWVfbXNnX2ZyYW1lKE1QVF9BREFQVEVSICppb2MsIE1QVF9GUkFNRV9IRFIgKm1mKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiAgUHV0IFJlcXVlc3QgYmFjayBvbiBGcmVlUSEgICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmbWYtPnUuZnJhbWUubGlua2FnZS5saXN0LCAmaW9jLT5GcmVlUSk7CisjaWZkZWYgTUZDTlQKKwlpb2MtPm1mY250LS07CisjZW5kaWYKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPkZyZWVRbG9jaywgZmxhZ3MpOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKioKKyAqCW1wdF9hZGRfc2dlIC0gUGxhY2UgYSBzaW1wbGUgU0dFIGF0IGFkZHJlc3MgcEFkZHIuCisgKglAcEFkZHI6IHZpcnR1YWwgYWRkcmVzcyBmb3IgU0dFCisgKglAZmxhZ3NsZW5ndGg6IFNHRSBmbGFncyBhbmQgZGF0YSB0cmFuc2ZlciBsZW5ndGgKKyAqCUBkbWFfYWRkcjogUGh5c2ljYWwgYWRkcmVzcworICoKKyAqCVRoaXMgcm91dGluZSBwbGFjZXMgYSBNUFQgcmVxdWVzdCBmcmFtZSBiYWNrIG9uIHRoZSBNUFQgYWRhcHRlcidzCisgKglGcmVlUS4KKyAqLwordm9pZAorbXB0X2FkZF9zZ2UoY2hhciAqcEFkZHIsIHUzMiBmbGFnc2xlbmd0aCwgZG1hX2FkZHJfdCBkbWFfYWRkcikKK3sKKwlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID09IHNpemVvZih1NjQpKSB7CisJCVNHRVNpbXBsZTY0X3QgKnBTZ2UgPSAoU0dFU2ltcGxlNjRfdCAqKSBwQWRkcjsKKwkJdTMyIHRtcCA9IGRtYV9hZGRyICYgMHhGRkZGRkZGRjsKKworCQlwU2dlLT5GbGFnc0xlbmd0aCA9IGNwdV90b19sZTMyKGZsYWdzbGVuZ3RoKTsKKwkJcFNnZS0+QWRkcmVzcy5Mb3cgPSBjcHVfdG9fbGUzMih0bXApOworCQl0bXAgPSAodTMyKSAoKHU2NClkbWFfYWRkciA+PiAzMik7CisJCXBTZ2UtPkFkZHJlc3MuSGlnaCA9IGNwdV90b19sZTMyKHRtcCk7CisKKwl9IGVsc2UgeworCQlTR0VTaW1wbGUzMl90ICpwU2dlID0gKFNHRVNpbXBsZTMyX3QgKikgcEFkZHI7CisJCXBTZ2UtPkZsYWdzTGVuZ3RoID0gY3B1X3RvX2xlMzIoZmxhZ3NsZW5ndGgpOworCQlwU2dlLT5BZGRyZXNzID0gY3B1X3RvX2xlMzIoZG1hX2FkZHIpOworCX0KK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoqCisgKgltcHRfc2VuZF9oYW5kc2hha2VfcmVxdWVzdCAtIFNlbmQgTVBUIHJlcXVlc3QgdmlhIGRvb3JiZWxsCisgKgloYW5kc2hha2UgbWV0aG9kLgorICoJQGhhbmRsZTogSGFuZGxlIG9mIHJlZ2lzdGVyZWQgTVBUIHByb3RvY29sIGRyaXZlcgorICoJQGlvYzogUG9pbnRlciB0byBNUFQgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCUByZXFCeXRlczogU2l6ZSBvZiB0aGUgcmVxdWVzdCBpbiBieXRlcworICoJQHJlcTogUG9pbnRlciB0byBNUFQgcmVxdWVzdCBmcmFtZQorICoJQHNsZWVwRmxhZzogVXNlIHNjaGVkdWxlIGlmIENBTl9TTEVFUCBlbHNlIHVzZSB1ZGVsYXkuCisgKgorICoJVGhpcyByb3V0aW5lIGlzIHVzZWQgZXhjbHVzaXZlbHkgdG8gc2VuZCBNcHRTY3NpVGFza01nbXQKKyAqCXJlcXVlc3RzIHNpbmNlIHRoZXkgYXJlIHJlcXVpcmVkIHRvIGJlIHNlbnQgdmlhIGRvb3JiZWxsIGhhbmRzaGFrZS4KKyAqCisgKglOT1RFOiBJdCBpcyB0aGUgY2FsbGVycyByZXNwb25zaWJpbGl0eSB0byBieXRlLXN3YXAgZmllbGRzIGluIHRoZQorICoJcmVxdWVzdCB3aGljaCBhcmUgZ3JlYXRlciB0aGFuIDEgYnl0ZSBpbiBzaXplLgorICoKKyAqCVJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUuCisgKi8KK2ludAorbXB0X3NlbmRfaGFuZHNoYWtlX3JlcXVlc3QoaW50IGhhbmRsZSwgTVBUX0FEQVBURVIgKmlvYywgaW50IHJlcUJ5dGVzLCB1MzIgKnJlcSwgaW50IHNsZWVwRmxhZykKK3sKKwlpbnQJCSByID0gMDsKKwl1OAkqcmVxX2FzX2J5dGVzOworCWludAkgaWk7CisKKwkvKiBTdGF0ZSBpcyBrbm93biB0byBiZSBnb29kIHVwb24gZW50ZXJpbmcKKwkgKiB0aGlzIGZ1bmN0aW9uIHNvIGlzc3VlIHRoZSBidXMgcmVzZXQKKwkgKiByZXF1ZXN0LgorCSAqLworCisJLyoKKwkgKiBFbXVsYXRlIHdoYXQgbXB0X3B1dF9tc2dfZnJhbWUoKSBkb2VzIC93cnQgdG8gc2FuaXR5CisJICogc2V0dGluZyBjYl9pZHgvcmVxX2lkeC4gIEJ1dCBPTkxZIGlmIHRoaXMgcmVxdWVzdAorCSAqIGlzIGluIHByb3BlciAocHJlLWFsbG9jJ2QpIHJlcXVlc3QgYnVmZmVyIHJhbmdlLi4uCisJICovCisJaWkgPSBNRlBUUl8yX01QVF9JTkRFWChpb2MsKE1QVF9GUkFNRV9IRFIqKXJlcSk7CisJaWYgKHJlcUJ5dGVzID49IDEyICYmIGlpID49IDAgJiYgaWkgPCBpb2MtPnJlcV9kZXB0aCkgeworCQlNUFRfRlJBTUVfSERSICptZiA9IChNUFRfRlJBTUVfSERSKilyZXE7CisJCW1mLT51LmZyYW1lLmh3aGRyLm1zZ2N0eHUuZmxkLnJlcV9pZHggPSBjcHVfdG9fbGUxNihpaSk7CisJCW1mLT51LmZyYW1lLmh3aGRyLm1zZ2N0eHUuZmxkLmNiX2lkeCA9IGhhbmRsZTsKKwl9CisKKwkvKiBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGRvb3JiZWxscyAqLworCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5JbnRTdGF0dXMsIDApOworCQorCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5Eb29yYmVsbCwKKwkJCSgoTVBJX0ZVTkNUSU9OX0hBTkRTSEFLRTw8TVBJX0RPT1JCRUxMX0ZVTkNUSU9OX1NISUZUKSB8CisJCQkgKChyZXFCeXRlcy80KTw8TVBJX0RPT1JCRUxMX0FERF9EV09SRFNfU0hJRlQpKSk7CisKKwkvKiBXYWl0IGZvciBJT0MgZG9vcmJlbGwgaW50ICovCisJaWYgKChpaSA9IFdhaXRGb3JEb29yYmVsbEludChpb2MsIDUsIHNsZWVwRmxhZykpIDwgMCkgeworCQlyZXR1cm4gaWk7CisJfQorCisJLyogUmVhZCBkb29yYmVsbCBhbmQgY2hlY2sgZm9yIGFjdGl2ZSBiaXQgKi8KKwlpZiAoIShDSElQUkVHX1JFQUQzMigmaW9jLT5jaGlwLT5Eb29yYmVsbCkgJiBNUElfRE9PUkJFTExfQUNUSVZFKSkKKwkJcmV0dXJuIC01OworCisJZGhzcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXM6IG1wdF9zZW5kX2hhbmRzaGFrZV9yZXF1ZXN0IHN0YXJ0LCBXYWl0Q250PSVkXG4iLAorCQkJaW9jLT5uYW1lLCBpaSkpOworCisJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPkludFN0YXR1cywgMCk7CisKKwlpZiAoKHIgPSBXYWl0Rm9yRG9vcmJlbGxBY2soaW9jLCA1LCBzbGVlcEZsYWcpKSA8IDApIHsKKwkJcmV0dXJuIC0yOworCX0KKwkJCisJLyogU2VuZCByZXF1ZXN0IHZpYSBkb29yYmVsbCBoYW5kc2hha2UgKi8KKwlyZXFfYXNfYnl0ZXMgPSAodTggKikgcmVxOworCWZvciAoaWkgPSAwOyBpaSA8IHJlcUJ5dGVzLzQ7IGlpKyspIHsKKwkJdTMyIHdvcmQ7CisKKwkJd29yZCA9ICgocmVxX2FzX2J5dGVzWyhpaSo0KSArIDBdIDw8ICAwKSB8CisJCQkocmVxX2FzX2J5dGVzWyhpaSo0KSArIDFdIDw8ICA4KSB8CisJCQkocmVxX2FzX2J5dGVzWyhpaSo0KSArIDJdIDw8IDE2KSB8CisJCQkocmVxX2FzX2J5dGVzWyhpaSo0KSArIDNdIDw8IDI0KSk7CisJCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5Eb29yYmVsbCwgd29yZCk7CisJCWlmICgociA9IFdhaXRGb3JEb29yYmVsbEFjayhpb2MsIDUsIHNsZWVwRmxhZykpIDwgMCkgeworCQkJciA9IC0zOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAociA+PSAwICYmIFdhaXRGb3JEb29yYmVsbEludChpb2MsIDEwLCBzbGVlcEZsYWcpID49IDApCisJCXIgPSAwOworCWVsc2UKKwkJciA9IC00OworCisJLyogTWFrZSBzdXJlIHRoZXJlIGFyZSBubyBkb29yYmVsbHMgKi8KKwlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+SW50U3RhdHVzLCAwKTsKKwkKKwlyZXR1cm4gcjsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoqCisgKgltcHRfdmVyaWZ5X2FkYXB0ZXIgLSBHaXZlbiBhIHVuaXF1ZSBJT0MgaWRlbnRpZmllciwgc2V0IHBvaW50ZXIgdG8KKyAqCXRoZSBhc3NvY2lhdGVkIE1QVCBhZGFwdGVyIHN0cnVjdHVyZS4KKyAqCUBpb2NpZDogSU9DIHVuaXF1ZSBpZGVudGlmaWVyIChpbnRlZ2VyKQorICoJQGlvY3BwOiBQb2ludGVyIHRvIHBvaW50ZXIgdG8gSU9DIGFkYXB0ZXIKKyAqCisgKglSZXR1cm5zIGlvY2lkIGFuZCBzZXRzIGlvY3BwLgorICovCitpbnQKK21wdF92ZXJpZnlfYWRhcHRlcihpbnQgaW9jaWQsIE1QVF9BREFQVEVSICoqaW9jcHApCit7CisJTVBUX0FEQVBURVIgKmlvYzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaW9jLCZpb2NfbGlzdCxsaXN0KSB7CisJCWlmIChpb2MtPmlkID09IGlvY2lkKSB7CisJCQkqaW9jcHAgPWlvYzsKKwkJCXJldHVybiBpb2NpZDsKKwkJfSAKKwl9CisJCisJKmlvY3BwID0gTlVMTDsKKwlyZXR1cm4gLTE7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKgltcHRiYXNlX3Byb2JlIC0gSW5zdGFsbCBhIFBDSSBpbnRlbGxpZ2VudCBNUFQgYWRhcHRlci4KKyAqCUBwZGV2OiBQb2ludGVyIHRvIHBjaV9kZXYgc3RydWN0dXJlCisgKgorICoJVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFsbCB0aGUgc3RlcHMgbmVjZXNzYXJ5IHRvIGJyaW5nIHRoZSBJT0Mgb2YKKyAqCWEgTVBUIGFkYXB0ZXIgdG8gYSBPUEVSQVRJT05BTCBzdGF0ZS4gIFRoaXMgaW5jbHVkZXMgcmVnaXN0ZXJpbmcKKyAqCW1lbW9yeSByZWdpb25zLCByZWdpc3RlcmluZyB0aGUgaW50ZXJydXB0LCBhbmQgYWxsb2NhdGluZyByZXF1ZXN0CisgKglhbmQgcmVwbHkgbWVtb3J5IHBvb2xzLgorICoKKyAqCVRoaXMgcm91dGluZSBhbHNvIHByZS1mZXRjaGVzIHRoZSBMQU4gTUFDIGFkZHJlc3Mgb2YgYSBGaWJyZSBDaGFubmVsCisgKglNUFQgYWRhcHRlci4KKyAqCisgKglSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgorICoKKyAqCVRPRE86IEFkZCBzdXBwb3J0IGZvciBwb2xsZWQgY29udHJvbGxlcnMKKyAqLworc3RhdGljIGludCBfX2RldmluaXQKK21wdGJhc2VfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlNUFRfQURBUFRFUgkqaW9jOworCXU4CQlfX2lvbWVtICptZW07CisJdW5zaWduZWQgbG9uZwkgbWVtX3BoeXM7CisJdW5zaWduZWQgbG9uZwkgcG9ydDsKKwl1MzIJCSBtc2l6ZTsKKwl1MzIJCSBwc2l6ZTsKKwlpbnQJCSBpaTsKKwlpbnQJCSByID0gLUVOT0RFVjsKKwl1NjQJCSBtYXNrID0gMHhmZmZmZmZmZmZmZmZmZmZmVUxMOworCXU4CQkgcmV2aXNpb247CisJdTgJCSBwY2l4Y21kOworCXN0YXRpYyBpbnQJIG1wdF9pZHMgPSAwOworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZW50LCAqZW50OworI2VuZGlmCisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCXJldHVybiByOworCQorCWRpbml0cHJpbnRrKChLRVJOX1dBUk5JTkcgTVlOQU0gIjogbXB0X2FkYXB0ZXJfaW5zdGFsbFxuIikpOworCQorCWlmICghcGNpX3NldF9kbWFfbWFzayhwZGV2LCBtYXNrKSkgeworCQlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0KKwkJCSI6IDY0IEJJVCBQQ0kgQlVTIERNQSBBRERSRVNTSU5HIFNVUFBPUlRFRFxuIikpOworCX0gZWxzZSBpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCAodTY0KSAweGZmZmZmZmZmKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIE1ZTkFNICI6IDMyIEJJVCBQQ0kgQlVTIERNQSBBRERSRVNTSU5HIE5PVCBTVVBQT1JURURcbiIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlpZiAoIXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBtYXNrKSkKKwkJZHByaW50aygoS0VSTl9JTkZPIE1ZTkFNCisJCQkiOiBVc2luZyA2NCBiaXQgY29uc2lzdGVudCBtYXNrXG4iKSk7CisJZWxzZQorCQlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0KKwkJCSI6IE5vdCB1c2luZyA2NCBiaXQgY29uc2lzdGVudCBtYXNrXG4iKSk7CisKKwlpb2MgPSBrbWFsbG9jKHNpemVvZihNUFRfQURBUFRFUiksIEdGUF9BVE9NSUMpOworCWlmIChpb2MgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgTVlOQU0gIjogRVJST1IgLSBJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFkZCBhZGFwdGVyIVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoaW9jLCAwLCBzaXplb2YoTVBUX0FEQVBURVIpKTsKKwlpb2MtPmFsbG9jX3RvdGFsID0gc2l6ZW9mKE1QVF9BREFQVEVSKTsKKwlpb2MtPnJlcV9zeiA9IE1QVF9ERUZBVUxUX0ZSQU1FX1NJWkU7CQkvKiBhdm9pZCBkaXYgYnkgemVybyEgKi8KKwlpb2MtPnJlcGx5X3N6ID0gTVBUX1JFUExZX0ZSQU1FX1NJWkU7CisJCisJaW9jLT5wY2lkZXYgPSBwZGV2OworCWlvYy0+ZGlhZ1BlbmRpbmcgPSAwOworCXNwaW5fbG9ja19pbml0KCZpb2MtPmRpYWdMb2NrKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGV2ZW50IGxvZ2dpbmcuCisJICovCisJaW9jLT5ldmVudFR5cGVzID0gMDsJLyogTm9uZSAqLworCWlvYy0+ZXZlbnRDb250ZXh0ID0gMDsKKwlpb2MtPmV2ZW50TG9nU2l6ZSA9IDA7CisJaW9jLT5ldmVudHMgPSBOVUxMOworCisjaWZkZWYgTUZDTlQKKwlpb2MtPm1mY250ID0gMDsKKyNlbmRpZgorCisJaW9jLT5jYWNoZWRfZncgPSBOVUxMOworCisJLyogSW5pdGlsaXplIFNDU0kgQ29uZmlnIERhdGEgc3RydWN0dXJlCisJICovCisJbWVtc2V0KCZpb2MtPnNwaV9kYXRhLCAwLCBzaXplb2YoU2NzaUNmZ0RhdGEpKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHJ1bm5pbmcgY29uZmlnUSBoZWFkLgorCSAqLworCUlOSVRfTElTVF9IRUFEKCZpb2MtPmNvbmZpZ1EpOworCisJLyogRmluZCBsb29rdXAgc2xvdC4gKi8KKwlJTklUX0xJU1RfSEVBRCgmaW9jLT5saXN0KTsKKwlpb2MtPmlkID0gbXB0X2lkcysrOworCQorCW1lbV9waHlzID0gbXNpemUgPSAwOworCXBvcnQgPSBwc2l6ZSA9IDA7CisJZm9yIChpaT0wOyBpaSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaWkrKykgeworCQlpZiAocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIGlpKSAmIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8pIHsKKwkJCS8qIEdldCBJL08gc3BhY2UhICovCisJCQlwb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGlpKTsKKwkJCXBzaXplID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LGlpKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEdldCBtZW1tYXAgKi8KKwkJCW1lbV9waHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGlpKTsKKwkJCW1zaXplID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LGlpKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlvYy0+bWVtX3NpemUgPSBtc2l6ZTsKKworCWlmIChpaSA9PSBERVZJQ0VfQ09VTlRfUkVTT1VSQ0UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIE1ZTkFNICI6IEVSUk9SIC0gTVBUIGFkYXB0ZXIgaGFzIG5vIG1lbW9yeSByZWdpb25zIGRlZmluZWQhXG4iKTsKKwkJa2ZyZWUoaW9jKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBNUFQgYWRhcHRlciBAICVseCwgbXNpemU9JWRkIGJ5dGVzXG4iLCBtZW1fcGh5cywgbXNpemUpKTsKKwlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IChwb3J0IGkvbyBAICVseCwgcHNpemU9JWRkIGJ5dGVzKVxuIiwgcG9ydCwgcHNpemUpKTsKKworCW1lbSA9IE5VTEw7CisJLyogR2V0IGxvZ2ljYWwgcHRyIGZvciBQY2lNZW0wIHNwYWNlICovCisJLyptZW0gPSBpb3JlbWFwKG1lbV9waHlzLCBtc2l6ZSk7Ki8KKwltZW0gPSBpb3JlbWFwKG1lbV9waHlzLCAweDEwMCk7CisJaWYgKG1lbSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiBNWU5BTSAiOiBFUlJPUiAtIFVuYWJsZSB0byBtYXAgYWRhcHRlciBtZW1vcnkhXG4iKTsKKwkJa2ZyZWUoaW9jKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlvYy0+bWVtbWFwID0gbWVtOworCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogbWVtID0gJXAsIG1lbV9waHlzID0gJWx4XG4iLCBtZW0sIG1lbV9waHlzKSk7CisKKwlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IGZhY3RzIEAgJXAsIHBmYWN0c1swXSBAICVwXG4iLAorCQkJJmlvYy0+ZmFjdHMsICZpb2MtPnBmYWN0c1swXSkpOworCisJaW9jLT5tZW1fcGh5cyA9IG1lbV9waHlzOworCWlvYy0+Y2hpcCA9IChTWVNJRl9SRUdTIF9faW9tZW0gKiltZW07CisKKwkvKiBTYXZlIFBvcnQgSU8gdmFsdWVzIGluIGNhc2Ugd2UgbmVlZCB0byBkbyBkb3dubG9hZGJvb3QgKi8KKwl7CisJCXU4ICpwbWVtID0gKHU4Kilwb3J0OworCQlpb2MtPnBpb19tZW1fcGh5cyA9IHBvcnQ7CisJCWlvYy0+cGlvX2NoaXAgPSAoU1lTSUZfUkVHUyBfX2lvbWVtICopcG1lbTsKKwl9CisKKwlpZiAocGRldi0+ZGV2aWNlID09IE1QSV9NQU5VRkFDVFBBR0VfREVWSUNFSURfRkM5MDkpIHsKKwkJaW9jLT5wcm9kX25hbWUgPSAiTFNJRkM5MDkiOworCQlpb2MtPmJ1c190eXBlID0gRkM7CisJfQorCWlmIChwZGV2LT5kZXZpY2UgPT0gTVBJX01BTlVGQUNUUEFHRV9ERVZJQ0VJRF9GQzkyOSkgeworCQlpb2MtPnByb2RfbmFtZSA9ICJMU0lGQzkyOSI7CisJCWlvYy0+YnVzX3R5cGUgPSBGQzsKKwl9CisJZWxzZSBpZiAocGRldi0+ZGV2aWNlID09IE1QSV9NQU5VRkFDVFBBR0VfREVWSUNFSURfRkM5MTkpIHsKKwkJaW9jLT5wcm9kX25hbWUgPSAiTFNJRkM5MTkiOworCQlpb2MtPmJ1c190eXBlID0gRkM7CisJfQorCWVsc2UgaWYgKHBkZXYtPmRldmljZSA9PSBNUElfTUFOVUZBQ1RQQUdFX0RFVklDRUlEX0ZDOTI5WCkgeworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZyZXZpc2lvbik7CisJCWlvYy0+YnVzX3R5cGUgPSBGQzsKKwkJaWYgKHJldmlzaW9uIDwgWExfOTI5KSB7CisJCQlpb2MtPnByb2RfbmFtZSA9ICJMU0lGQzkyOVgiOworCQkJLyogOTI5WCBDaGlwIEZpeC4gU2V0IFNwbGl0IHRyYW5zYWN0aW9ucyBsZXZlbAorCQkgCSogZm9yIFBDSVguIFNldCBNT1NUIGJpdHMgdG8gemVyby4KKwkJIAkqLworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg2YSwgJnBjaXhjbWQpOworCQkJcGNpeGNtZCAmPSAweDhGOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NmEsIHBjaXhjbWQpOworCQl9IGVsc2UgeworCQkJaW9jLT5wcm9kX25hbWUgPSAiTFNJRkM5MjlYTCI7CisJCQkvKiA5MjlYTCBDaGlwIEZpeC4gU2V0IE1NUkJDIHRvIDB4MDguCisJCSAJKi8KKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NmEsICZwY2l4Y21kKTsKKwkJCXBjaXhjbWQgfD0gMHgwODsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDZhLCBwY2l4Y21kKTsKKwkJfQorCX0KKwllbHNlIGlmIChwZGV2LT5kZXZpY2UgPT0gTVBJX01BTlVGQUNUUEFHRV9ERVZJQ0VJRF9GQzkxOVgpIHsKKwkJaW9jLT5wcm9kX25hbWUgPSAiTFNJRkM5MTlYIjsKKwkJaW9jLT5idXNfdHlwZSA9IEZDOworCQkvKiA5MTlYIENoaXAgRml4LiBTZXQgU3BsaXQgdHJhbnNhY3Rpb25zIGxldmVsCisJCSAqIGZvciBQQ0lYLiBTZXQgTU9TVCBiaXRzIHRvIHplcm8uCisJCSAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDZhLCAmcGNpeGNtZCk7CisJCXBjaXhjbWQgJj0gMHg4RjsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NmEsIHBjaXhjbWQpOworCX0KKwllbHNlIGlmIChwZGV2LT5kZXZpY2UgPT0gTVBJX01BTlVGQUNUUEFHRV9ERVZJRF81M0MxMDMwKSB7CisJCWlvYy0+cHJvZF9uYW1lID0gIkxTSTUzQzEwMzAiOworCQlpb2MtPmJ1c190eXBlID0gU0NTSTsKKwkJLyogMTAzMCBDaGlwIEZpeC4gRGlzYWJsZSBTcGxpdCB0cmFuc2FjdGlvbnMKKwkJICogZm9yIFBDSVguIFNldCBNT1NUIGJpdHMgdG8gemVybyBpZiBSZXYgPCBDMCggPSA4KS4KKwkJICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJnJldmlzaW9uKTsKKwkJaWYgKHJldmlzaW9uIDwgQzBfMTAzMCkgeworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg2YSwgJnBjaXhjbWQpOworCQkJcGNpeGNtZCAmPSAweDhGOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NmEsIHBjaXhjbWQpOworCQl9CisJfQorCWVsc2UgaWYgKHBkZXYtPmRldmljZSA9PSBNUElfTUFOVUZBQ1RQQUdFX0RFVklEXzEwMzBfNTNDMTAzNSkgeworCQlpb2MtPnByb2RfbmFtZSA9ICJMU0k1M0MxMDM1IjsKKwkJaW9jLT5idXNfdHlwZSA9IFNDU0k7CisJfQorCisJc3ByaW50Zihpb2MtPm5hbWUsICJpb2MlZCIsIGlvYy0+aWQpOworCisJc3Bpbl9sb2NrX2luaXQoJmlvYy0+RnJlZVFsb2NrKTsKKworCS8qIERpc2FibGUgYWxsISAqLworCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5JbnRNYXNrLCAweEZGRkZGRkZGKTsKKwlpb2MtPmFjdGl2ZSA9IDA7CisJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPkludFN0YXR1cywgMCk7CisKKwkvKiBTZXQgbG9va3VwIHB0ci4gKi8KKwlsaXN0X2FkZF90YWlsKCZpb2MtPmxpc3QsICZpb2NfbGlzdCk7CisKKwlpb2MtPnBjaV9pcnEgPSAtMTsKKwlpZiAocGRldi0+aXJxKSB7CisJCXIgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIG1wdF9pbnRlcnJ1cHQsIFNBX1NISVJRLCBpb2MtPm5hbWUsIGlvYyk7CisKKwkJaWYgKHIgPCAwKSB7CisjaWZuZGVmIF9fc3BhcmNfXworCQkJcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVCAiVW5hYmxlIHRvIGFsbG9jYXRlIGludGVycnVwdCAlZCFcbiIsCisJCQkJCWlvYy0+bmFtZSwgcGRldi0+aXJxKTsKKyNlbHNlCisJCQlwcmludGsoTVlJT0Nfc19FUlJfRk1UICJVbmFibGUgdG8gYWxsb2NhdGUgaW50ZXJydXB0ICVzIVxuIiwKKwkJCQkJaW9jLT5uYW1lLCBfX2lycV9pdG9hKHBkZXYtPmlycSkpOworI2VuZGlmCisJCQlsaXN0X2RlbCgmaW9jLT5saXN0KTsKKwkJCWlvdW5tYXAobWVtKTsKKwkJCWtmcmVlKGlvYyk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJaW9jLT5wY2lfaXJxID0gcGRldi0+aXJxOworCisJCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwkJCS8qID8/ICovCisJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBpb2MpOworCisjaWZuZGVmIF9fc3BhcmNfXworCQlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXMgaW5zdGFsbGVkIGF0IGludGVycnVwdCAlZFxuIiwgaW9jLT5uYW1lLCBwZGV2LT5pcnEpKTsKKyNlbHNlCisJCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlcyBpbnN0YWxsZWQgYXQgaW50ZXJydXB0ICVzXG4iLCBpb2MtPm5hbWUsIF9faXJxX2l0b2EocGRldi0+aXJxKSkpOworI2VuZGlmCisJfQorCisJLyogTkVXISAgMjAwMTAyMjAgLXNyYWxzdG9uCisJICogQ2hlY2sgZm9yICJib3VuZCBwb3J0cyIgKDkyOSwgOTI5WCwgMTAzMCwgMTAzNSkgdG8gcmVkdWNlIHJlZHVuZGFudCByZXNldHMuCisJICovCisJbXB0X2RldGVjdF9ib3VuZF9wb3J0cyhpb2MsIHBkZXYpOworCisJaWYgKChyID0gbXB0X2RvX2lvY19yZWNvdmVyeShpb2MsCisJICBNUFRfSE9TVEVWRU5UX0lPQ19CUklOR1VQLCBDQU5fU0xFRVApKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgTVlOQU0KKwkJICAiOiBXQVJOSU5HIC0gJXMgZGlkIG5vdCBpbml0aWFsaXplIHByb3Blcmx5ISAoJWQpXG4iLAorCQkgIGlvYy0+bmFtZSwgcik7CisKKwkJbGlzdF9kZWwoJmlvYy0+bGlzdCk7CisJCWZyZWVfaXJxKGlvYy0+cGNpX2lycSwgaW9jKTsKKwkJaW91bm1hcChtZW0pOworCQlrZnJlZShpb2MpOworCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJCXJldHVybiByOworCX0KKworCS8qIGNhbGwgcGVyIGRldmljZSBkcml2ZXIgcHJvYmUgZW50cnkgcG9pbnQgKi8KKwlmb3IoaWk9MDsgaWk8TVBUX01BWF9QUk9UT0NPTF9EUklWRVJTOyBpaSsrKSB7CisJCWlmKE1wdERldmljZURyaXZlckhhbmRsZXJzW2lpXSAmJgorCQkgIE1wdERldmljZURyaXZlckhhbmRsZXJzW2lpXS0+cHJvYmUpIHsKKwkJCU1wdERldmljZURyaXZlckhhbmRsZXJzW2lpXS0+cHJvYmUocGRldixpZCk7CisJCX0KKwl9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCS8qCisJICogIENyZWF0ZSAiL3Byb2MvbXB0L2lvY04iIHN1YmRpcmVjdG9yeSBlbnRyeSBmb3IgZWFjaCBNUFQgYWRhcHRlci4KKwkgKi8KKwlkZW50ID0gcHJvY19ta2Rpcihpb2MtPm5hbWUsIG1wdF9wcm9jX3Jvb3RfZGlyKTsKKwlpZiAoZGVudCkgeworCQllbnQgPSBjcmVhdGVfcHJvY19lbnRyeSgiaW5mbyIsIFNfSUZSRUd8U19JUlVHTywgZGVudCk7CisJCWlmIChlbnQpIHsKKwkJCWVudC0+cmVhZF9wcm9jID0gcHJvY21wdF9pb2NpbmZvX3JlYWQ7CisJCQllbnQtPmRhdGEgPSBpb2M7CisJCX0KKwkJZW50ID0gY3JlYXRlX3Byb2NfZW50cnkoInN1bW1hcnkiLCBTX0lGUkVHfFNfSVJVR08sIGRlbnQpOworCQlpZiAoZW50KSB7CisJCQllbnQtPnJlYWRfcHJvYyA9IHByb2NtcHRfc3VtbWFyeV9yZWFkOworCQkJZW50LT5kYXRhID0gaW9jOworCQl9CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCW1wdGJhc2VfcmVtb3ZlIC0gUmVtb3ZlIGEgUENJIGludGVsbGlnZW50IE1QVCBhZGFwdGVyLgorICoJQHBkZXY6IFBvaW50ZXIgdG8gcGNpX2RldiBzdHJ1Y3R1cmUKKyAqCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZleGl0CittcHRiYXNlX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlNUFRfQURBUFRFUiAJKmlvYyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwljaGFyIHBuYW1lWzMyXTsKKwlpbnQgaWk7CisKKwlzcHJpbnRmKHBuYW1lLCBNUFRfUFJPQ0ZTX01QVEJBU0VESVIgIi8lcy9zdW1tYXJ5IiwgaW9jLT5uYW1lKTsKKwlyZW1vdmVfcHJvY19lbnRyeShwbmFtZSwgTlVMTCk7CisJc3ByaW50ZihwbmFtZSwgTVBUX1BST0NGU19NUFRCQVNFRElSICIvJXMvaW5mbyIsIGlvYy0+bmFtZSk7CisJcmVtb3ZlX3Byb2NfZW50cnkocG5hbWUsIE5VTEwpOworCXNwcmludGYocG5hbWUsIE1QVF9QUk9DRlNfTVBUQkFTRURJUiAiLyVzIiwgaW9jLT5uYW1lKTsKKwlyZW1vdmVfcHJvY19lbnRyeShwbmFtZSwgTlVMTCk7CisJCisJLyogY2FsbCBwZXIgZGV2aWNlIGRyaXZlciByZW1vdmUgZW50cnkgcG9pbnQgKi8KKwlmb3IoaWk9MDsgaWk8TVBUX01BWF9QUk9UT0NPTF9EUklWRVJTOyBpaSsrKSB7CisJCWlmKE1wdERldmljZURyaXZlckhhbmRsZXJzW2lpXSAmJgorCQkgIE1wdERldmljZURyaXZlckhhbmRsZXJzW2lpXS0+cmVtb3ZlKSB7CisJCQlNcHREZXZpY2VEcml2ZXJIYW5kbGVyc1tpaV0tPnJlbW92ZShwZGV2KTsKKwkJfQorCX0KKwkKKwkvKiBEaXNhYmxlIGludGVycnVwdHMhICovCisJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPkludE1hc2ssIDB4RkZGRkZGRkYpOworCisJaW9jLT5hY3RpdmUgPSAwOworCXN5bmNocm9uaXplX2lycShwZGV2LT5pcnEpOworCisJLyogQ2xlYXIgYW55IGxpbmdlcmluZyBpbnRlcnJ1cHQgKi8KKwlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+SW50U3RhdHVzLCAwKTsKKworCUNISVBSRUdfUkVBRDMyKCZpb2MtPmNoaXAtPkludFN0YXR1cyk7CisKKwltcHRfYWRhcHRlcl9kaXNwb3NlKGlvYyk7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKgltcHRiYXNlX3NodXRkb3duIC0KKyAqCisgKi8KK3N0YXRpYyB2b2lkCittcHRiYXNlX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKiBkZXYpCit7CisJaW50IGlpOworCisJLyogY2FsbCBwZXIgZGV2aWNlIGRyaXZlciBzaHV0ZG93biBlbnRyeSBwb2ludCAqLworCWZvcihpaT0wOyBpaTxNUFRfTUFYX1BST1RPQ09MX0RSSVZFUlM7IGlpKyspIHsKKwkJaWYoTXB0RGV2aWNlRHJpdmVySGFuZGxlcnNbaWldICYmCisJCSAgTXB0RGV2aWNlRHJpdmVySGFuZGxlcnNbaWldLT5zaHV0ZG93bikgeworCQkJTXB0RGV2aWNlRHJpdmVySGFuZGxlcnNbaWldLT5zaHV0ZG93bihkZXYpOworCQl9CisJfQorCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQb3dlciBNYW5hZ2VtZW50CisgKi8KKyNpZmRlZiBDT05GSUdfUE0KKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKgltcHRiYXNlX3N1c3BlbmQgLSBGdXNpb24gTVBUIGJhc2UgZHJpdmVyIHN1c3BlbmQgcm91dGluZS4KKyAqCisgKgorICovCitzdGF0aWMgaW50CittcHRiYXNlX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBzdGF0ZSkKK3sKKwl1MzIgZGV2aWNlX3N0YXRlOworCU1QVF9BREFQVEVSICppb2MgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJaW50IGlpOworCisJc3dpdGNoKHN0YXRlKQorCXsKKwkJY2FzZSAxOiAvKiBTMSAqLworCQkJZGV2aWNlX3N0YXRlPTE7IC8qIEQxICovOworCQkJYnJlYWs7CisJCWNhc2UgMzogLyogUzMgKi8KKwkJY2FzZSA0OiAvKiBTNCAqLworCQkJZGV2aWNlX3N0YXRlPTM7IC8qIEQzICovOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVBR0FJTiAvKkZJWE1FKi87CisJCQlicmVhazsKKwl9CisKKwlwcmludGsoTVlJT0Nfc19JTkZPX0ZNVAorCSJwY2ktc3VzcGVuZDogcGRldj0weCVwLCBzbG90PSVzLCBFbnRlcmluZyBvcGVyYXRpbmcgc3RhdGUgW0QlZF1cbiIsCisJCWlvYy0+bmFtZSwgcGRldiwgcGNpX25hbWUocGRldiksIGRldmljZV9zdGF0ZSk7CisKKwkvKiBjYWxsIHBlciBkZXZpY2UgZHJpdmVyIHN1c3BlbmQgZW50cnkgcG9pbnQgKi8KKwlmb3IoaWk9MDsgaWk8TVBUX01BWF9QUk9UT0NPTF9EUklWRVJTOyBpaSsrKSB7CisJCWlmKE1wdERldmljZURyaXZlckhhbmRsZXJzW2lpXSAmJgorCQkgIE1wdERldmljZURyaXZlckhhbmRsZXJzW2lpXS0+c3VzcGVuZCkgeworCQkJTXB0RGV2aWNlRHJpdmVySGFuZGxlcnNbaWldLT5zdXNwZW5kKHBkZXYsIHN0YXRlKTsKKwkJfQorCX0KKworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCisJLyogcHV0IGlvYyBpbnRvIFJFQURZX1NUQVRFICovCisJaWYoU2VuZElvY1Jlc2V0KGlvYywgTVBJX0ZVTkNUSU9OX0lPQ19NRVNTQUdFX1VOSVRfUkVTRVQsIENBTl9TTEVFUCkpIHsKKwkJcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVAorCQkicGNpLXN1c3BlbmQ6ICBJT0MgbXNnIHVuaXQgcmVzZXQgZmFpbGVkIVxuIiwgaW9jLT5uYW1lKTsKKwl9CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+SW50TWFzaywgMHhGRkZGRkZGRik7CisJaW9jLT5hY3RpdmUgPSAwOworCisJLyogQ2xlYXIgYW55IGxpbmdlcmluZyBpbnRlcnJ1cHQgKi8KKwlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+SW50U3RhdHVzLCAwKTsKKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIGRldmljZV9zdGF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCW1wdGJhc2VfcmVzdW1lIC0gRnVzaW9uIE1QVCBiYXNlIGRyaXZlciByZXN1bWUgcm91dGluZS4KKyAqCisgKgorICovCitzdGF0aWMgaW50CittcHRiYXNlX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlNUFRfQURBUFRFUiAqaW9jID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXUzMiBkZXZpY2Vfc3RhdGUgPSBwZGV2LT5jdXJyZW50X3N0YXRlOworCWludCByZWNvdmVyeV9zdGF0ZTsKKwlpbnQgaWk7CisKKwlwcmludGsoTVlJT0Nfc19JTkZPX0ZNVAorCSJwY2ktcmVzdW1lOiBwZGV2PTB4JXAsIHNsb3Q9JXMsIFByZXZpb3VzIG9wZXJhdGluZyBzdGF0ZSBbRCVkXVxuIiwKKwkJaW9jLT5uYW1lLCBwZGV2LCBwY2lfbmFtZShwZGV2KSwgZGV2aWNlX3N0YXRlKTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisKKwkvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5JbnRNYXNrLCB+KE1QSV9ISU1fUklNKSk7CisJaW9jLT5hY3RpdmUgPSAxOworCisJLyogRi9XIG5vdCBydW5uaW5nICovCisJaWYoIUNISVBSRUdfUkVBRDMyKCZpb2MtPmNoaXAtPkRvb3JiZWxsKSkgeworCQkvKiBlbmFibGUgZG9tYWluIHZhbGlkYXRpb24gZmxhZ3MgKi8KKwkJZm9yIChpaT0wOyBpaSA8IE1QVF9NQVhfU0NTSV9ERVZJQ0VTOyBpaSsrKSB7CisJCQlpb2MtPnNwaV9kYXRhLmR2U3RhdHVzW2lpXSB8PSBNUFRfU0NTSUNGR19ORUVEX0RWOworCQl9CisJfQorCisJcHJpbnRrKE1ZSU9DX3NfSU5GT19GTVQKKwkJInBjaS1yZXN1bWU6IGlvYy1zdGF0ZT0weCV4LGRvb3JiZWxsPTB4JXhcbiIsCisJCWlvYy0+bmFtZSwKKwkJKG1wdF9HZXRJb2NTdGF0ZShpb2MsIDEpID4+IE1QSV9JT0NfU1RBVEVfU0hJRlQpLAorCQlDSElQUkVHX1JFQUQzMigmaW9jLT5jaGlwLT5Eb29yYmVsbCkpOworCisJLyogYnJpbmcgaW9jIHRvIG9wZXJhdGlvbmFsIHN0YXRlICovCisJaWYgKChyZWNvdmVyeV9zdGF0ZSA9IG1wdF9kb19pb2NfcmVjb3ZlcnkoaW9jLAorCSAgICBNUFRfSE9TVEVWRU5UX0lPQ19SRUNPVkVSLCBDQU5fU0xFRVApKSAhPSAwKSB7CisJCXByaW50ayhNWUlPQ19zX0lORk9fRk1UCisJCQkicGNpLXJlc3VtZTogQ2Fubm90IHJlY292ZXIsIGVycm9yOlsleF1cbiIsCisJCQlpb2MtPm5hbWUsIHJlY292ZXJ5X3N0YXRlKTsKKwl9IGVsc2UgeworCQlwcmludGsoTVlJT0Nfc19JTkZPX0ZNVAorCQkJInBjaS1yZXN1bWU6IHN1Y2Nlc3NcbiIsIGlvYy0+bmFtZSk7CisJfQorCisJLyogY2FsbCBwZXIgZGV2aWNlIGRyaXZlciByZXN1bWUgZW50cnkgcG9pbnQgKi8KKwlmb3IoaWk9MDsgaWk8TVBUX01BWF9QUk9UT0NPTF9EUklWRVJTOyBpaSsrKSB7CisJCWlmKE1wdERldmljZURyaXZlckhhbmRsZXJzW2lpXSAmJgorCQkgIE1wdERldmljZURyaXZlckhhbmRsZXJzW2lpXS0+cmVzdW1lKSB7CisJCQlNcHREZXZpY2VEcml2ZXJIYW5kbGVyc1tpaV0tPnJlc3VtZShwZGV2KTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKgltcHRfZG9faW9jX3JlY292ZXJ5IC0gSW5pdGlhbGl6ZSBvciByZWNvdmVyIE1QVCBhZGFwdGVyLgorICoJQGlvYzogUG9pbnRlciB0byBNUFQgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCUByZWFzb246IEV2ZW50IHdvcmQgLyByZWFzb24KKyAqCUBzbGVlcEZsYWc6IFVzZSBzY2hlZHVsZSBpZiBDQU5fU0xFRVAgZWxzZSB1c2UgdWRlbGF5LgorICoKKyAqCVRoaXMgcm91dGluZSBwZXJmb3JtcyBhbGwgdGhlIHN0ZXBzIG5lY2Vzc2FyeSB0byBicmluZyB0aGUgSU9DCisgKgl0byBhIE9QRVJBVElPTkFMIHN0YXRlLgorICoKKyAqCVRoaXMgcm91dGluZSBhbHNvIHByZS1mZXRjaGVzIHRoZSBMQU4gTUFDIGFkZHJlc3Mgb2YgYSBGaWJyZSBDaGFubmVsCisgKglNUFQgYWRhcHRlci4KKyAqCisgKglSZXR1cm5zOgorICoJCSAwIGZvciBzdWNjZXNzCisgKgkJLTEgaWYgZmFpbGVkIHRvIGdldCBib2FyZCBSRUFEWQorICoJCS0yIGlmIFJFQURZIGJ1dCBJT0NGYWN0cyBGYWlsZWQKKyAqCQktMyBpZiBSRUFEWSBidXQgUHJpbWVJT0NGaWZvcyBGYWlsZWQKKyAqCQktNCBpZiBSRUFEWSBidXQgSU9DSW5pdCBGYWlsZWQKKyAqLworc3RhdGljIGludAorbXB0X2RvX2lvY19yZWNvdmVyeShNUFRfQURBUFRFUiAqaW9jLCB1MzIgcmVhc29uLCBpbnQgc2xlZXBGbGFnKQoreworCWludAkgaGFyZF9yZXNldF9kb25lID0gMDsKKwlpbnQJIGFsdF9pb2NfcmVhZHkgPSAwOworCWludAkgaGFyZDsKKwlpbnQJIHJjPTA7CisJaW50CSBpaTsKKwlpbnQJIGhhbmRsZXJzOworCWludAkgcmV0ID0gMDsKKwlpbnQJIHJlc2V0X2FsdF9pb2NfYWN0aXZlID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gTVlOQU0gIjogSW5pdGlhdGluZyAlcyAlc1xuIiwKKwkJCWlvYy0+bmFtZSwgcmVhc29uPT1NUFRfSE9TVEVWRU5UX0lPQ19CUklOR1VQID8gImJyaW5ndXAiIDogInJlY292ZXJ5Iik7CisKKwkvKiBEaXNhYmxlIHJlcGx5IGludGVycnVwdHMgKGFsc28gYmxvY2tzIEZyZWVRKSAqLworCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5JbnRNYXNrLCAweEZGRkZGRkZGKTsKKwlpb2MtPmFjdGl2ZSA9IDA7CisKKwlpZiAoaW9jLT5hbHRfaW9jKSB7CisJCWlmIChpb2MtPmFsdF9pb2MtPmFjdGl2ZSkKKwkJCXJlc2V0X2FsdF9pb2NfYWN0aXZlID0gMTsKKworCQkvKiBEaXNhYmxlIGFsdC1JT0MncyByZXBseSBpbnRlcnJ1cHRzIChhbmQgRnJlZVEpIGZvciBhIGJpdCAuLi4gKi8KKwkJQ0hJUFJFR19XUklURTMyKCZpb2MtPmFsdF9pb2MtPmNoaXAtPkludE1hc2ssIDB4RkZGRkZGRkYpOworCQlpb2MtPmFsdF9pb2MtPmFjdGl2ZSA9IDA7CisJfQorCisJaGFyZCA9IDE7CisJaWYgKHJlYXNvbiA9PSBNUFRfSE9TVEVWRU5UX0lPQ19CUklOR1VQKQorCQloYXJkID0gMDsKKworCWlmICgoaGFyZF9yZXNldF9kb25lID0gTWFrZUlvY1JlYWR5KGlvYywgaGFyZCwgc2xlZXBGbGFnKSkgPCAwKSB7CisJCWlmIChoYXJkX3Jlc2V0X2RvbmUgPT0gLTQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgTVlOQU0gIjogJXMgT3duZWQgYnkgUEVFUi4uc2tpcHBpbmchXG4iLAorCQkJCQlpb2MtPm5hbWUpOworCisJCQlpZiAocmVzZXRfYWx0X2lvY19hY3RpdmUgJiYgaW9jLT5hbHRfaW9jKSB7CisJCQkJLyogKHJlKUVuYWJsZSBhbHQtSU9DISAocmVwbHkgaW50ZXJydXB0LCBGcmVlUSkgKi8KKwkJCQlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogYWx0LSVzIHJlcGx5IGlycSByZS1lbmFibGVkXG4iLAorCQkJCQkJaW9jLT5hbHRfaW9jLT5uYW1lKSk7CisJCQkJQ0hJUFJFR19XUklURTMyKCZpb2MtPmFsdF9pb2MtPmNoaXAtPkludE1hc2ssIH4oTVBJX0hJTV9SSU0pKTsKKwkJCQlpb2MtPmFsdF9pb2MtPmFjdGl2ZSA9IDE7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgTVlOQU0gIjogJXMgTk9UIFJFQURZIFdBUk5JTkchXG4iLAorCQkJCQlpb2MtPm5hbWUpOworCQl9CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBoYXJkX3Jlc2V0X2RvbmUgPSAwIGlmIGEgc29mdCByZXNldCB3YXMgcGVyZm9ybWVkCisJICogYW5kIDEgaWYgYSBoYXJkIHJlc2V0IHdhcyBwZXJmb3JtZWQuCisJICovCisJaWYgKGhhcmRfcmVzZXRfZG9uZSAmJiByZXNldF9hbHRfaW9jX2FjdGl2ZSAmJiBpb2MtPmFsdF9pb2MpIHsKKwkJaWYgKChyYyA9IE1ha2VJb2NSZWFkeShpb2MtPmFsdF9pb2MsIDAsIHNsZWVwRmxhZykpID09IDApCisJCQlhbHRfaW9jX3JlYWR5ID0gMTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyBNWU5BTQorCQkJCQkiOiBhbHQtJXM6IE5vdCByZWFkeSBXQVJOSU5HIVxuIiwKKwkJCQkJaW9jLT5hbHRfaW9jLT5uYW1lKTsKKwl9CisKKwlmb3IgKGlpPTA7IGlpPDU7IGlpKyspIHsKKwkJLyogR2V0IElPQyBmYWN0cyEgQWxsb3cgNSByZXRyaWVzICovCisJCWlmICgocmMgPSBHZXRJb2NGYWN0cyhpb2MsIHNsZWVwRmxhZywgcmVhc29uKSkgPT0gMCkKKwkJCWJyZWFrOworCX0KKwkKKworCWlmIChpaSA9PSA1KSB7CisJCWRpbml0cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJSZXRyeSBJb2NGYWN0cyBmYWlsZWQgcmM9JXhcbiIsIGlvYy0+bmFtZSwgcmMpKTsKKwkJcmV0ID0gLTI7CisJfSBlbHNlIGlmIChyZWFzb24gPT0gTVBUX0hPU1RFVkVOVF9JT0NfQlJJTkdVUCkgeworCQlNcHREaXNwbGF5SW9jQ2FwYWJpbGl0aWVzKGlvYyk7CisJfQorCQorCWlmIChhbHRfaW9jX3JlYWR5KSB7CisJCWlmICgocmMgPSBHZXRJb2NGYWN0cyhpb2MtPmFsdF9pb2MsIHNsZWVwRmxhZywgcmVhc29uKSkgIT0gMCkgeworCQkJZGluaXRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkluaXRpYWwgQWx0IElvY0ZhY3RzIGZhaWxlZCByYz0leFxuIiwgaW9jLT5uYW1lLCByYykpOworCQkJLyogUmV0cnkgLSBhbHQgSU9DIHdhcyBpbml0aWFsaXplZCBvbmNlCisJCQkgKi8KKwkJCXJjID0gR2V0SW9jRmFjdHMoaW9jLT5hbHRfaW9jLCBzbGVlcEZsYWcsIHJlYXNvbik7CisJCX0KKwkJaWYgKHJjKSB7CisJCQlkaW5pdHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiUmV0cnkgQWx0IElvY0ZhY3RzIGZhaWxlZCByYz0leFxuIiwgaW9jLT5uYW1lLCByYykpOworCQkJYWx0X2lvY19yZWFkeSA9IDA7CisJCQlyZXNldF9hbHRfaW9jX2FjdGl2ZSA9IDA7CisJCX0gZWxzZSBpZiAocmVhc29uID09IE1QVF9IT1NURVZFTlRfSU9DX0JSSU5HVVApIHsKKwkJCU1wdERpc3BsYXlJb2NDYXBhYmlsaXRpZXMoaW9jLT5hbHRfaW9jKTsKKwkJfQorCX0KKworCS8qIFByaW1lIHJlcGx5ICYgcmVxdWVzdCBxdWV1ZXMhCisJICogKG11Y2hvIGFsbG9jJ3MpIE11c3QgYmUgZG9uZSBwcmlvciB0bworCSAqIGluaXQgYXMgdXBwZXIgYWRkcmVzc2VzIGFyZSBuZWVkZWQgZm9yIGluaXQuCisJICogSWYgZmFpbHMsIGNvbnRpbnVlIHdpdGggYWx0LWlvYyBwcm9jZXNzaW5nCisJICovCisJaWYgKChyZXQgPT0gMCkgJiYgKChyYyA9IFByaW1lSW9jRmlmb3MoaW9jKSkgIT0gMCkpCisJCXJldCA9IC0zOworCisJLyogTWF5IG5lZWQgdG8gY2hlY2svdXBsb2FkIGZpcm13YXJlICYgZGF0YSBoZXJlIQorCSAqIElmIGZhaWxzLCBjb250aW51ZSB3aXRoIGFsdC1pb2MgcHJvY2Vzc2luZworCSAqLworCWlmICgocmV0ID09IDApICYmICgocmMgPSBTZW5kSW9jSW5pdChpb2MsIHNsZWVwRmxhZykpICE9IDApKQorCQlyZXQgPSAtNDsKKy8vIE5FVyEKKwlpZiAoYWx0X2lvY19yZWFkeSAmJiAoKHJjID0gUHJpbWVJb2NGaWZvcyhpb2MtPmFsdF9pb2MpKSAhPSAwKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIE1ZTkFNICI6IGFsdC0lczogKCVkKSBGSUZPIG1nbXQgYWxsb2MgV0FSTklORyFcbiIsCisJCQkJaW9jLT5hbHRfaW9jLT5uYW1lLCByYyk7CisJCWFsdF9pb2NfcmVhZHkgPSAwOworCQlyZXNldF9hbHRfaW9jX2FjdGl2ZSA9IDA7CisJfQorCisJaWYgKGFsdF9pb2NfcmVhZHkpIHsKKwkJaWYgKChyYyA9IFNlbmRJb2NJbml0KGlvYy0+YWx0X2lvYywgc2xlZXBGbGFnKSkgIT0gMCkgeworCQkJYWx0X2lvY19yZWFkeSA9IDA7CisJCQlyZXNldF9hbHRfaW9jX2FjdGl2ZSA9IDA7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIE1ZTkFNCisJCQkJIjogYWx0LSVzOiAoJWQpIGluaXQgZmFpbHVyZSBXQVJOSU5HIVxuIiwKKwkJCQkJaW9jLT5hbHRfaW9jLT5uYW1lLCByYyk7CisJCX0KKwl9CisKKwlpZiAocmVhc29uID09IE1QVF9IT1NURVZFTlRfSU9DX0JSSU5HVVApeworCQlpZiAoaW9jLT51cGxvYWRfZncpIHsKKwkJCWRkbHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVAorCQkJCSJmaXJtd2FyZSB1cGxvYWQgcmVxdWlyZWQhXG4iLCBpb2MtPm5hbWUpKTsKKworCQkJLyogQ29udHJvbGxlciBpcyBub3Qgb3BlcmF0aW9uYWwsIGNhbm5vdCBkbyB1cGxvYWQKKwkJCSAqLworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJcmMgPSBtcHRfZG9fdXBsb2FkKGlvYywgc2xlZXBGbGFnKTsKKwkJCQlpZiAocmMgIT0gMCkKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyBNWU5BTSAiOiBmaXJtd2FyZSB1cGxvYWQgZmFpbHVyZSFcbiIpOworCQkJfQorCQl9CisJfQorCisJaWYgKHJldCA9PSAwKSB7CisJCS8qIEVuYWJsZSEgKHJlcGx5IGludGVycnVwdCkgKi8KKwkJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPkludE1hc2ssIH4oTVBJX0hJTV9SSU0pKTsKKwkJaW9jLT5hY3RpdmUgPSAxOworCX0KKworCWlmIChyZXNldF9hbHRfaW9jX2FjdGl2ZSAmJiBpb2MtPmFsdF9pb2MpIHsKKwkJLyogKHJlKUVuYWJsZSBhbHQtSU9DISAocmVwbHkgaW50ZXJydXB0KSAqLworCQlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogYWx0LSVzIHJlcGx5IGlycSByZS1lbmFibGVkXG4iLAorCQkJCWlvYy0+YWx0X2lvYy0+bmFtZSkpOworCQlDSElQUkVHX1dSSVRFMzIoJmlvYy0+YWx0X2lvYy0+Y2hpcC0+SW50TWFzaywgfihNUElfSElNX1JJTSkpOworCQlpb2MtPmFsdF9pb2MtPmFjdGl2ZSA9IDE7CisJfQorCisJLyogTkVXISAgMjAwMTAxMjAgLXNyYWxzdG9uCisJICogIEVuYWJsZSBNUFQgYmFzZSBkcml2ZXIgbWFuYWdlbWVudCBvZiBFdmVudE5vdGlmaWNhdGlvbgorCSAqICBhbmQgRXZlbnRBY2sgaGFuZGxpbmcuCisJICovCisJaWYgKChyZXQgPT0gMCkgJiYgKCFpb2MtPmZhY3RzLkV2ZW50U3RhdGUpKQorCQkodm9pZCkgU2VuZEV2ZW50Tm90aWZpY2F0aW9uKGlvYywgMSk7CS8qIDE9RW5hYmxlIEV2ZW50Tm90aWZpY2F0aW9uICovCisKKwlpZiAoaW9jLT5hbHRfaW9jICYmIGFsdF9pb2NfcmVhZHkgJiYgIWlvYy0+YWx0X2lvYy0+ZmFjdHMuRXZlbnRTdGF0ZSkKKwkJKHZvaWQpIFNlbmRFdmVudE5vdGlmaWNhdGlvbihpb2MtPmFsdF9pb2MsIDEpOwkvKiAxPUVuYWJsZSBFdmVudE5vdGlmaWNhdGlvbiAqLworCisJLyogKEJ1Z3ppbGxhOmZpYnJlYnVncywgIzUxMykKKwkgKiBCdWcgZml4IChwYXJ0IDIpISAgMjAwMTA5MDUgLXNyYWxzdG9uCisJICoJQWRkIGFkZGl0aW9uYWwgInJlYXNvbiIgY2hlY2sgYmVmb3JlIGNhbGwgdG8gR2V0TGFuQ29uZmlnUGFnZXMKKwkgKgkoY29tYmluZWQgd2l0aCBHZXRJb1VuaXRQYWdlMiBjYWxsKS4gIFRoaXMgcHJldmVudHMgYSBzb21ld2hhdAorCSAqCXJlY3Vyc2l2ZSBzY2VuYXJpbzsgR2V0TGFuQ29uZmlnUGFnZXMgdGltZXMgb3V0LCB0aW1lciBleHBpcmVkCisJICoJcm91dGluZSBjYWxscyBIYXJkUmVzZXRIYW5kbGVyLCB3aGljaCBjYWxscyBpbnRvIGhlcmUgYWdhaW4sCisJICoJYW5kIHdlIHRyeSBHZXRMYW5Db25maWdQYWdlcyBhZ2Fpbi4uLgorCSAqLworCWlmICgocmV0ID09IDApICYmIChyZWFzb24gPT0gTVBUX0hPU1RFVkVOVF9JT0NfQlJJTkdVUCkpIHsKKwkJaWYgKGlvYy0+YnVzX3R5cGUgPT0gRkMpIHsKKwkJCS8qCisJCQkgKiAgUHJlLWZldGNoIEZDIHBvcnQgV1dOIGFuZCBzdHVmZi4uLgorCQkJICogIChGQ1BvcnRQYWdlMF90IHN0dWZmKQorCQkJICovCisJCQlmb3IgKGlpPTA7IGlpIDwgaW9jLT5mYWN0cy5OdW1iZXJPZlBvcnRzOyBpaSsrKSB7CisJCQkJKHZvaWQpIEdldEZjUG9ydFBhZ2UwKGlvYywgaWkpOworCQkJfQorCisJCQlpZiAoKGlvYy0+cGZhY3RzWzBdLlByb3RvY29sRmxhZ3MgJiBNUElfUE9SVEZBQ1RTX1BST1RPQ09MX0xBTikgJiYKKwkJCSAgICAoaW9jLT5sYW5fY25mZ19wYWdlMC5IZWFkZXIuUGFnZUxlbmd0aCA9PSAwKSkgeworCQkJCS8qCisJCQkJICogIFByZS1mZXRjaCB0aGUgcG9ydHMgTEFOIE1BQyBhZGRyZXNzIQorCQkJCSAqICAoTEFOUGFnZTFfdCBzdHVmZikKKwkJCQkgKi8KKwkJCQkodm9pZCkgR2V0TGFuQ29uZmlnUGFnZXMoaW9jKTsKKyNpZmRlZiBNUFRfREVCVUcKKwkJCQl7CisJCQkJCXU4ICphID0gKHU4KikmaW9jLT5sYW5fY25mZ19wYWdlMS5IYXJkd2FyZUFkZHJlc3NMb3c7CisJCQkJCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkxhbkFkZHIgPSAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkJCQkJCQlpb2MtPm5hbWUsIGFbNV0sIGFbNF0sIGFbM10sIGFbMl0sIGFbMV0sIGFbMF0gKSk7CisJCQkJfQorI2VuZGlmCisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBHZXQgTlZSQU0gYW5kIGFkYXB0ZXIgbWF4aW11bXMgZnJvbSBTUFAgMCBhbmQgMgorCQkJICovCisJCQltcHRfR2V0U2NzaVBvcnRTZXR0aW5ncyhpb2MsIDApOworCisJCQkvKiBHZXQgdmVyc2lvbiBhbmQgbGVuZ3RoIG9mIFNEUCAxCisJCQkgKi8KKwkJCW1wdF9yZWFkU2NzaURldmljZVBhZ2VIZWFkZXJzKGlvYywgMCk7CisKKwkJCS8qIEZpbmQgSU0gdm9sdW1lcworCQkJICovCisJCQlpZiAoaW9jLT5mYWN0cy5Nc2dWZXJzaW9uID49IDB4MDEwMikKKwkJCQltcHRfZmluZEltVm9sdW1lcyhpb2MpOworCisJCQkvKiBDaGVjaywgYW5kIHBvc3NpYmx5IHJlc2V0LCB0aGUgY29hbGVzY2luZyB2YWx1ZQorCQkJICovCisJCQltcHRfcmVhZF9pb2NfcGdfMShpb2MpOworCisJCQltcHRfcmVhZF9pb2NfcGdfNChpb2MpOworCQl9CisKKwkJR2V0SW9Vbml0UGFnZTIoaW9jKTsKKwl9CisKKwkvKgorCSAqIENhbGwgZWFjaCBjdXJyZW50bHkgcmVnaXN0ZXJlZCBwcm90b2NvbCBJT0MgcmVzZXQgaGFuZGxlcgorCSAqIHdpdGggcG9zdC1yZXNldCBpbmRpY2F0aW9uLgorCSAqIE5PVEU6IElmIHdlJ3JlIGRvaW5nIF9JT0NfQlJJTkdVUCwgdGhlcmUgY2FuIGJlIG5vCisJICogTXB0UmVzZXRIYW5kbGVyc1tdIHJlZ2lzdGVyZWQgeWV0LgorCSAqLworCWlmIChoYXJkX3Jlc2V0X2RvbmUpIHsKKwkJcmMgPSBoYW5kbGVycyA9IDA7CisJCWZvciAoaWk9TVBUX01BWF9QUk9UT0NPTF9EUklWRVJTLTE7IGlpOyBpaS0tKSB7CisJCQlpZiAoKHJldCA9PSAwKSAmJiBNcHRSZXNldEhhbmRsZXJzW2lpXSkgeworCQkJCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkNhbGxpbmcgSU9DIHBvc3RfcmVzZXQgaGFuZGxlciAjJWRcbiIsCisJCQkJCQlpb2MtPm5hbWUsIGlpKSk7CisJCQkJcmMgKz0gKCooTXB0UmVzZXRIYW5kbGVyc1tpaV0pKShpb2MsIE1QVF9JT0NfUE9TVF9SRVNFVCk7CisJCQkJaGFuZGxlcnMrKzsKKwkJCX0KKworCQkJaWYgKGFsdF9pb2NfcmVhZHkgJiYgTXB0UmVzZXRIYW5kbGVyc1tpaV0pIHsKKwkJCQlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJDYWxsaW5nIGFsdC0lcyBwb3N0X3Jlc2V0IGhhbmRsZXIgIyVkXG4iLAorCQkJCQkJaW9jLT5uYW1lLCBpb2MtPmFsdF9pb2MtPm5hbWUsIGlpKSk7CisJCQkJcmMgKz0gKCooTXB0UmVzZXRIYW5kbGVyc1tpaV0pKShpb2MtPmFsdF9pb2MsIE1QVF9JT0NfUE9TVF9SRVNFVCk7CisJCQkJaGFuZGxlcnMrKzsKKwkJCX0KKwkJfQorCQkvKiBGSVhNRT8gIEV4YW1pbmUgcmVzdWx0cyBoZXJlPyAqLworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKgltcHRfZGV0ZWN0X2JvdW5kX3BvcnRzIC0gU2VhcmNoIGZvciBQQ0kgYnVzL2Rldl9mdW5jdGlvbgorICoJd2hpY2ggbWF0Y2hlcyBQQ0kgYnVzL2Rldl9mdW5jdGlvbiAoKy8tMSkgZm9yIG5ld2x5IGRpc2NvdmVyZWQgOTI5LAorICoJOTI5WCwgMTAzMCBvciAxMDM1LgorICoJQGlvYzogUG9pbnRlciB0byBNUFQgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCUBwZGV2OiBQb2ludGVyIHRvIChzdHJ1Y3QgcGNpX2Rldikgc3RydWN0dXJlCisgKgorICoJSWYgbWF0Y2ggb24gUENJIGRldl9mdW5jdGlvbiArLy0xIGlzIGZvdW5kLCBiaW5kIHRoZSB0d28gTVBUIGFkYXB0ZXJzCisgKgl1c2luZyBhbHRfaW9jIHBvaW50ZXIgZmllbGRzIGluIHRoZWlyICVNUFRfQURBUFRFUiBzdHJ1Y3R1cmVzLgorICovCitzdGF0aWMgdm9pZAorbXB0X2RldGVjdF9ib3VuZF9wb3J0cyhNUFRfQURBUFRFUiAqaW9jLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1bnNpZ25lZCBpbnQgbWF0Y2hfbG8sIG1hdGNoX2hpOworCU1QVF9BREFQVEVSICppb2Nfc3JjaDsKKworCW1hdGNoX2xvID0gcGRldi0+ZGV2Zm4tMTsKKwltYXRjaF9oaSA9IHBkZXYtPmRldmZuKzE7CisJZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiUENJIGJ1cy9kZXZmbj0leC8leCwgc2VhcmNoaW5nIGZvciBkZXZmbiBtYXRjaCBvbiAleCBvciAleFxuIiwKKwkJCWlvYy0+bmFtZSwgcGRldi0+YnVzLT5udW1iZXIsIHBkZXYtPmRldmZuLCBtYXRjaF9sbywgbWF0Y2hfaGkpKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaW9jX3NyY2gsICZpb2NfbGlzdCwgbGlzdCkgeworCQlzdHJ1Y3QgcGNpX2RldiAqX3BjaWRldiA9IGlvY19zcmNoLT5wY2lkZXY7CisKKwkJaWYgKChfcGNpZGV2LT5kZXZpY2UgPT0gcGRldi0+ZGV2aWNlKSAmJgorCQkgICAgKF9wY2lkZXYtPmJ1cy0+bnVtYmVyID09IHBkZXYtPmJ1cy0+bnVtYmVyKSAmJgorCQkgICAgKF9wY2lkZXYtPmRldmZuID09IG1hdGNoX2xvIHx8IF9wY2lkZXYtPmRldmZuID09IG1hdGNoX2hpKSApIHsKKwkJCS8qIFBhcmFub2lhIGNoZWNrcyAqLworCQkJaWYgKGlvYy0+YWx0X2lvYyAhPSBOVUxMKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyBNWU5BTSAiOiBPb3BzLCBhbHJlYWR5IGJvdW5kICglcyA8PT0+ICVzKSFcbiIsCisJCQkJCQlpb2MtPm5hbWUsIGlvYy0+YWx0X2lvYy0+bmFtZSk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGlvY19zcmNoLT5hbHRfaW9jICE9IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HIE1ZTkFNICI6IE9vcHMsIGFscmVhZHkgYm91bmQgKCVzIDw9PT4gJXMpIVxuIiwKKwkJCQkJCWlvY19zcmNoLT5uYW1lLCBpb2Nfc3JjaC0+YWx0X2lvYy0+bmFtZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogRk9VTkQhIGJpbmRpbmcgJXMgPD09PiAlc1xuIiwKKwkJCQkJaW9jLT5uYW1lLCBpb2Nfc3JjaC0+bmFtZSkpOworCQkJaW9jX3NyY2gtPmFsdF9pb2MgPSBpb2M7CisJCQlpb2MtPmFsdF9pb2MgPSBpb2Nfc3JjaDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJbXB0X2FkYXB0ZXJfZGlzYWJsZSAtIERpc2FibGUgbWlzYmVoYXZpbmcgTVBUIGFkYXB0ZXIuCisgKglAdGhpczogUG9pbnRlciB0byBNUFQgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQKK21wdF9hZGFwdGVyX2Rpc2FibGUoTVBUX0FEQVBURVIgKmlvYykKK3sKKwlpbnQgc3o7CisJaW50IHJldDsKKworCWlmIChpb2MtPmNhY2hlZF9mdyAhPSBOVUxMKSB7CisJCWRkbHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IG1wdF9hZGFwdGVyX2Rpc2FibGU6IFB1c2hpbmcgRlcgb250byBhZGFwdGVyXG4iKSk7CisJCWlmICgocmV0ID0gbXB0X2Rvd25sb2FkYm9vdChpb2MsIE5PX1NMRUVQKSkgPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIE1ZTkFNCisJCQkJIjogZmlybXdhcmUgZG93bmxvYWRib290IGZhaWx1cmUgKCVkKSFcbiIsIHJldCk7CisJCX0KKwl9CisKKwkvKiBEaXNhYmxlIGFkYXB0ZXIgaW50ZXJydXB0cyEgKi8KKwlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+SW50TWFzaywgMHhGRkZGRkZGRik7CisJaW9jLT5hY3RpdmUgPSAwOworCS8qIENsZWFyIGFueSBsaW5nZXJpbmcgaW50ZXJydXB0ICovCisJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPkludFN0YXR1cywgMCk7CisKKwlpZiAoaW9jLT5hbGxvYyAhPSBOVUxMKSB7CisJCXN6ID0gaW9jLT5hbGxvY19zejsKKwkJZGV4aXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlcy5mcmVlICBAICVwLCBzej0lZCBieXRlc1xuIiwKKwkJIAlpb2MtPm5hbWUsIGlvYy0+YWxsb2MsIGlvYy0+YWxsb2Nfc3opKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChpb2MtPnBjaWRldiwgc3osCisJCQkJaW9jLT5hbGxvYywgaW9jLT5hbGxvY19kbWEpOworCQlpb2MtPnJlcGx5X2ZyYW1lcyA9IE5VTEw7CisJCWlvYy0+cmVxX2ZyYW1lcyA9IE5VTEw7CisJCWlvYy0+YWxsb2MgPSBOVUxMOworCQlpb2MtPmFsbG9jX3RvdGFsIC09IHN6OworCX0KKworCWlmIChpb2MtPnNlbnNlX2J1Zl9wb29sICE9IE5VTEwpIHsKKwkJc3ogPSAoaW9jLT5yZXFfZGVwdGggKiBNUFRfU0VOU0VfQlVGRkVSX0FMTE9DKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChpb2MtPnBjaWRldiwgc3osCisJCQkJaW9jLT5zZW5zZV9idWZfcG9vbCwgaW9jLT5zZW5zZV9idWZfcG9vbF9kbWEpOworCQlpb2MtPnNlbnNlX2J1Zl9wb29sID0gTlVMTDsKKwkJaW9jLT5hbGxvY190b3RhbCAtPSBzejsKKwl9CisKKwlpZiAoaW9jLT5ldmVudHMgIT0gTlVMTCl7CisJCXN6ID0gTVBUQ1RMX0VWRU5UX0xPR19TSVpFICogc2l6ZW9mKE1QVF9JT0NUTF9FVkVOVFMpOworCQlrZnJlZShpb2MtPmV2ZW50cyk7CisJCWlvYy0+ZXZlbnRzID0gTlVMTDsKKwkJaW9jLT5hbGxvY190b3RhbCAtPSBzejsKKwl9CisKKwlpZiAoaW9jLT5jYWNoZWRfZncgIT0gTlVMTCkgeworCQlzeiA9IGlvYy0+ZmFjdHMuRldJbWFnZVNpemU7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaW9jLT5wY2lkZXYsIHN6LAorCQkJaW9jLT5jYWNoZWRfZncsIGlvYy0+Y2FjaGVkX2Z3X2RtYSk7CisJCWlvYy0+Y2FjaGVkX2Z3ID0gTlVMTDsKKwkJaW9jLT5hbGxvY190b3RhbCAtPSBzejsKKwl9CisKKwlpZiAoaW9jLT5zcGlfZGF0YS5udnJhbSAhPSBOVUxMKSB7CisJCWtmcmVlKGlvYy0+c3BpX2RhdGEubnZyYW0pOworCQlpb2MtPnNwaV9kYXRhLm52cmFtID0gTlVMTDsKKwl9CisKKwlpZiAoaW9jLT5zcGlfZGF0YS5wSW9jUGczICE9IE5VTEwpIHsKKwkJa2ZyZWUoaW9jLT5zcGlfZGF0YS5wSW9jUGczKTsKKwkJaW9jLT5zcGlfZGF0YS5wSW9jUGczID0gTlVMTDsKKwl9CisKKwlpZiAoaW9jLT5zcGlfZGF0YS5wSW9jUGc0ICE9IE5VTEwpIHsKKwkJc3ogPSBpb2MtPnNwaV9kYXRhLklvY1BnNFN6OworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGlvYy0+cGNpZGV2LCBzeiwgCisJCQlpb2MtPnNwaV9kYXRhLnBJb2NQZzQsCisJCQlpb2MtPnNwaV9kYXRhLklvY1BnNF9kbWEpOworCQlpb2MtPnNwaV9kYXRhLnBJb2NQZzQgPSBOVUxMOworCQlpb2MtPmFsbG9jX3RvdGFsIC09IHN6OworCX0KKworCWlmIChpb2MtPlJlcVRvQ2hhaW4gIT0gTlVMTCkgeworCQlrZnJlZShpb2MtPlJlcVRvQ2hhaW4pOworCQlrZnJlZShpb2MtPlJlcXVlc3ROQik7CisJCWlvYy0+UmVxVG9DaGFpbiA9IE5VTEw7CisJfQorCisJaWYgKGlvYy0+Q2hhaW5Ub0NoYWluICE9IE5VTEwpIHsKKwkJa2ZyZWUoaW9jLT5DaGFpblRvQ2hhaW4pOworCQlpb2MtPkNoYWluVG9DaGFpbiA9IE5VTEw7CisJfQorfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJbXB0X2FkYXB0ZXJfZGlzcG9zZSAtIEZyZWUgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBNUFQKKyAqCWFkYXB0ZXIuCisgKglAaW9jOiBQb2ludGVyIHRvIE1QVCBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqCVRoaXMgcm91dGluZSB1bnJlZ2lzdGVycyBoL3cgcmVzb3VyY2VzIGFuZCBmcmVlcyBhbGwgYWxsb2MnZCBtZW1vcnkKKyAqCWFzc29jaWF0ZWQgd2l0aCBhIE1QVCBhZGFwdGVyIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQKK21wdF9hZGFwdGVyX2Rpc3Bvc2UoTVBUX0FEQVBURVIgKmlvYykKK3sKKwlpZiAoaW9jICE9IE5VTEwpIHsKKwkJaW50IHN6X2ZpcnN0LCBzel9sYXN0OworCisJCXN6X2ZpcnN0ID0gaW9jLT5hbGxvY190b3RhbDsKKworCQltcHRfYWRhcHRlcl9kaXNhYmxlKGlvYyk7CisKKwkJaWYgKGlvYy0+cGNpX2lycSAhPSAtMSkgeworCQkJZnJlZV9pcnEoaW9jLT5wY2lfaXJxLCBpb2MpOworCQkJaW9jLT5wY2lfaXJxID0gLTE7CisJCX0KKworCQlpZiAoaW9jLT5tZW1tYXAgIT0gTlVMTCkKKwkJCWlvdW5tYXAoaW9jLT5tZW1tYXApOworCisjaWYgZGVmaW5lZChDT05GSUdfTVRSUikgJiYgMAorCQlpZiAoaW9jLT5tdHJyX3JlZyA+IDApIHsKKwkJCW10cnJfZGVsKGlvYy0+bXRycl9yZWcsIDAsIDApOworCQkJZHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzOiBNVFJSIHJlZ2lvbiBkZS1yZWdpc3RlcmVkXG4iLCBpb2MtPm5hbWUpKTsKKwkJfQorI2VuZGlmCisKKwkJLyogIFphcCB0aGUgYWRhcHRlciBsb29rdXAgcHRyISAgKi8KKwkJbGlzdF9kZWwoJmlvYy0+bGlzdCk7CisKKwkJc3pfbGFzdCA9IGlvYy0+YWxsb2NfdG90YWw7CisJCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlczogZnJlZSdkICVkIG9mICVkIGJ5dGVzXG4iLAorCQkJCWlvYy0+bmFtZSwgc3pfZmlyc3Qtc3pfbGFzdCsoaW50KXNpemVvZigqaW9jKSwgc3pfZmlyc3QpKTsKKwkJa2ZyZWUoaW9jKTsKKwl9Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKglNcHREaXNwbGF5SW9jQ2FwYWJpbGl0aWVzIC0gRGlzcGx5IElPQydzIGNhcGFjaWxpdGllcy4KKyAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUIGFkYXB0ZXIgc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkCitNcHREaXNwbGF5SW9jQ2FwYWJpbGl0aWVzKE1QVF9BREFQVEVSICppb2MpCit7CisJaW50IGkgPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICIsIGlvYy0+bmFtZSk7CisJaWYgKGlvYy0+cHJvZF9uYW1lICYmIHN0cmxlbihpb2MtPnByb2RfbmFtZSkgPiAzKQorCQlwcmludGsoIiVzOiAiLCBpb2MtPnByb2RfbmFtZSszKTsKKwlwcmludGsoIkNhcGFiaWxpdGllcz17Iik7CisKKwlpZiAoaW9jLT5wZmFjdHNbMF0uUHJvdG9jb2xGbGFncyAmIE1QSV9QT1JURkFDVFNfUFJPVE9DT0xfSU5JVElBVE9SKSB7CisJCXByaW50aygiSW5pdGlhdG9yIik7CisJCWkrKzsKKwl9CisKKwlpZiAoaW9jLT5wZmFjdHNbMF0uUHJvdG9jb2xGbGFncyAmIE1QSV9QT1JURkFDVFNfUFJPVE9DT0xfVEFSR0VUKSB7CisJCXByaW50aygiJXNUYXJnZXQiLCBpID8gIiwiIDogIiIpOworCQlpKys7CisJfQorCisJaWYgKGlvYy0+cGZhY3RzWzBdLlByb3RvY29sRmxhZ3MgJiBNUElfUE9SVEZBQ1RTX1BST1RPQ09MX0xBTikgeworCQlwcmludGsoIiVzTEFOIiwgaSA/ICIsIiA6ICIiKTsKKwkJaSsrOworCX0KKworI2lmIDAKKwkvKgorCSAqICBUaGlzIHdvdWxkIHByb2JhYmx5IGV2b2tlIG1vcmUgcXVlc3Rpb25zIHRoYW4gaXQncyB3b3J0aAorCSAqLworCWlmIChpb2MtPnBmYWN0c1swXS5Qcm90b2NvbEZsYWdzICYgTVBJX1BPUlRGQUNUU19QUk9UT0NPTF9UQVJHRVQpIHsKKwkJcHJpbnRrKCIlc0xvZ0J1c0FkZHIiLCBpID8gIiwiIDogIiIpOworCQlpKys7CisJfQorI2VuZGlmCisKKwlwcmludGsoIn1cbiIpOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJTWFrZUlvY1JlYWR5IC0gR2V0IElPQyB0byBhIFJFQURZIHN0YXRlLCB1c2luZyBLaWNrU3RhcnQgaWYgbmVlZGVkLgorICoJQGlvYzogUG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKKyAqCUBmb3JjZTogRm9yY2UgaGFyZCBLaWNrU3RhcnQgb2YgSU9DCisgKglAc2xlZXBGbGFnOiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcHJvY2VzcyBjYW4gc2xlZXAKKyAqCisgKglSZXR1cm5zOgorICoJCSAxIC0gRElBRyByZXNldCBhbmQgUkVBRFkKKyAqCQkgMCAtIFJFQURZIGluaXRpYWxseSBPUiBzb2Z0IHJlc2V0IGFuZCBSRUFEWQorICoJCS0xIC0gQW55IGZhaWx1cmUgb24gS2lja1N0YXJ0CisgKgkJLTIgLSBNc2cgVW5pdCBSZXNldCBGYWlsZWQKKyAqCQktMyAtIElPIFVuaXQgUmVzZXQgRmFpbGVkCisgKgkJLTQgLSBJT0Mgb3duZWQgYnkgYSBQRUVSCisgKi8KK3N0YXRpYyBpbnQKK01ha2VJb2NSZWFkeShNUFRfQURBUFRFUiAqaW9jLCBpbnQgZm9yY2UsIGludCBzbGVlcEZsYWcpCit7CisJdTMyCSBpb2Nfc3RhdGU7CisJaW50CSBzdGF0ZWZhdWx0ID0gMDsKKwlpbnQJIGNudGRuOworCWludAkgaGFyZF9yZXNldF9kb25lID0gMDsKKwlpbnQJIHI7CisJaW50CSBpaTsKKwlpbnQJIHdob2luaXQ7CisKKwkvKiBHZXQgY3VycmVudCBbcmF3XSBJT0Mgc3RhdGUgICovCisJaW9jX3N0YXRlID0gbXB0X0dldElvY1N0YXRlKGlvYywgMCk7CisJZGhzcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjo6TWFrZUlvY1JlYWR5LCAlcyBbcmF3XSBzdGF0ZT0lMDh4XG4iLCBpb2MtPm5hbWUsIGlvY19zdGF0ZSkpOworCisJLyoKKwkgKglDaGVjayB0byBzZWUgaWYgSU9DIGdvdCBsZWZ0L3N0dWNrIGluIGRvb3JiZWxsIGhhbmRzaGFrZQorCSAqCWdyaXAgb2YgZGVhdGguICBJZiBzbywgaGFyZCByZXNldCB0aGUgSU9DLgorCSAqLworCWlmIChpb2Nfc3RhdGUgJiBNUElfRE9PUkJFTExfQUNUSVZFKSB7CisJCXN0YXRlZmF1bHQgPSAxOworCQlwcmludGsoTVlJT0Nfc19XQVJOX0ZNVCAiVW5leHBlY3RlZCBkb29yYmVsbCBhY3RpdmUhXG4iLAorCQkJCWlvYy0+bmFtZSk7CisJfQorCisJLyogSXMgaXQgYWxyZWFkeSBSRUFEWT8gKi8KKwlpZiAoIXN0YXRlZmF1bHQgJiYgKGlvY19zdGF0ZSAmIE1QSV9JT0NfU1RBVEVfTUFTSykgPT0gTVBJX0lPQ19TVEFURV9SRUFEWSkgCisJCXJldHVybiAwOworCisJLyoKKwkgKglDaGVjayB0byBzZWUgaWYgSU9DIGlzIGluIEZBVUxUIHN0YXRlLgorCSAqLworCWlmICgoaW9jX3N0YXRlICYgTVBJX0lPQ19TVEFURV9NQVNLKSA9PSBNUElfSU9DX1NUQVRFX0ZBVUxUKSB7CisJCXN0YXRlZmF1bHQgPSAyOworCQlwcmludGsoTVlJT0Nfc19XQVJOX0ZNVCAiSU9DIGlzIGluIEZBVUxUIHN0YXRlISEhXG4iLAorCQkJCWlvYy0+bmFtZSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiAgICAgICAgICAgRkFVTFQgY29kZSA9ICUwNHhoXG4iLAorCQkJCWlvY19zdGF0ZSAmIE1QSV9ET09SQkVMTF9EQVRBX01BU0spOworCX0KKworCS8qCisJICoJSG1tbS4uLiAgRGlkIGl0IGdldCBsZWZ0IG9wZXJhdGlvbmFsPworCSAqLworCWlmICgoaW9jX3N0YXRlICYgTVBJX0lPQ19TVEFURV9NQVNLKSA9PSBNUElfSU9DX1NUQVRFX09QRVJBVElPTkFMKSB7CisJCWRpbml0cHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJJT0Mgb3BlcmF0aW9uYWwgdW5leHBlY3RlZFxuIiwKKwkJCQlpb2MtPm5hbWUpKTsKKworCQkvKiBDaGVjayBXaG9Jbml0LgorCQkgKiBJZiBQQ0kgUGVlciwgZXhpdC4KKwkJICogRWxzZSwgaWYgbm8gZmF1bHQgY29uZGl0aW9ucyBhcmUgcHJlc2VudCwgaXNzdWUgYSBNZXNzYWdlVW5pdFJlc2V0CisJCSAqIEVsc2UsIGZhbGwgdGhyb3VnaCB0byBLaWNrU3RhcnQgY2FzZQorCQkgKi8KKwkJd2hvaW5pdCA9IChpb2Nfc3RhdGUgJiBNUElfRE9PUkJFTExfV0hPX0lOSVRfTUFTSykgPj4gTVBJX0RPT1JCRUxMX1dIT19JTklUX1NISUZUOworCQlkcHJpbnRrKChLRVJOX1dBUk5JTkcgTVlOQU0KKwkJCSI6IHdob2luaXQgMHgleFxuIHN0YXRlZmF1bHQgJWQgZm9yY2UgJWRcbiIsCisJCQl3aG9pbml0LCBzdGF0ZWZhdWx0LCBmb3JjZSkpOworCQlpZiAod2hvaW5pdCA9PSBNUElfV0hPSU5JVF9QQ0lfUEVFUikKKwkJCXJldHVybiAtNDsKKwkJZWxzZSB7CisJCQlpZiAoKHN0YXRlZmF1bHQgPT0gMCApICYmIChmb3JjZSA9PSAwKSkgeworCQkJCWlmICgociA9IFNlbmRJb2NSZXNldChpb2MsIE1QSV9GVU5DVElPTl9JT0NfTUVTU0FHRV9VTklUX1JFU0VULCBzbGVlcEZsYWcpKSA9PSAwKQorCQkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXN0YXRlZmF1bHQgPSAzOworCQl9CisJfQorCisJaGFyZF9yZXNldF9kb25lID0gS2lja1N0YXJ0KGlvYywgc3RhdGVmYXVsdHx8Zm9yY2UsIHNsZWVwRmxhZyk7CisJaWYgKGhhcmRfcmVzZXRfZG9uZSA8IDApCisJCXJldHVybiAtMTsKKworCS8qCisJICogIExvb3AgaGVyZSB3YWl0aW5nIGZvciBJT0MgdG8gY29tZSBSRUFEWS4KKwkgKi8KKwlpaSA9IDA7CisJY250ZG4gPSAoKHNsZWVwRmxhZyA9PSBDQU5fU0xFRVApID8gSFogOiAxMDAwKSAqIDE1OwkvKiAxNSBzZWNvbmRzICovCisKKwl3aGlsZSAoKGlvY19zdGF0ZSA9IG1wdF9HZXRJb2NTdGF0ZShpb2MsIDEpKSAhPSBNUElfSU9DX1NUQVRFX1JFQURZKSB7CisJCWlmIChpb2Nfc3RhdGUgPT0gTVBJX0lPQ19TVEFURV9PUEVSQVRJT05BTCkgeworCQkJLyoKKwkJCSAqICBCSU9TIG9yIHByZXZpb3VzIGRyaXZlciBsb2FkIGxlZnQgSU9DIGluIE9QIHN0YXRlLgorCQkJICogIFJlc2V0IG1lc3NhZ2luZyBGSUZPcy4KKwkJCSAqLworCQkJaWYgKChyID0gU2VuZElvY1Jlc2V0KGlvYywgTVBJX0ZVTkNUSU9OX0lPQ19NRVNTQUdFX1VOSVRfUkVTRVQsIHNsZWVwRmxhZykpICE9IDApIHsKKwkJCQlwcmludGsoTVlJT0Nfc19FUlJfRk1UICJJT0MgbXNnIHVuaXQgcmVzZXQgZmFpbGVkIVxuIiwgaW9jLT5uYW1lKTsKKwkJCQlyZXR1cm4gLTI7CisJCQl9CisJCX0gZWxzZSBpZiAoaW9jX3N0YXRlID09IE1QSV9JT0NfU1RBVEVfUkVTRVQpIHsKKwkJCS8qCisJCQkgKiAgU29tZXRoaW5nIGlzIHdyb25nLiAgVHJ5IHRvIGdldCBJT0MgYmFjaworCQkJICogIHRvIGEga25vd24gc3RhdGUuCisJCQkgKi8KKwkJCWlmICgociA9IFNlbmRJb2NSZXNldChpb2MsIE1QSV9GVU5DVElPTl9JT19VTklUX1JFU0VULCBzbGVlcEZsYWcpKSAhPSAwKSB7CisJCQkJcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVCAiSU8gdW5pdCByZXNldCBmYWlsZWQhXG4iLCBpb2MtPm5hbWUpOworCQkJCXJldHVybiAtMzsKKwkJCX0KKwkJfQorCisJCWlpKys7IGNudGRuLS07CisJCWlmICghY250ZG4pIHsKKwkJCXByaW50ayhNWUlPQ19zX0VSUl9GTVQgIldhaXQgSU9DX1JFQURZIHN0YXRlIHRpbWVvdXQoJWQpIVxuIiwKKwkJCQkJaW9jLT5uYW1lLCAoaW50KSgoaWkrNSkvSFopKTsKKwkJCXJldHVybiAtRVRJTUU7CisJCX0KKworCQlpZiAoc2xlZXBGbGFnID09IENBTl9TTEVFUCkgeworCQkJbXNsZWVwX2ludGVycnVwdGlibGUoMSk7CisJCX0gZWxzZSB7CisJCQltZGVsYXkgKDEpOwkvKiAxIG1zZWMgZGVsYXkgKi8KKwkJfQorCisJfQorCisJaWYgKHN0YXRlZmF1bHQgPCAzKSB7CisJCXByaW50ayhNWUlPQ19zX0lORk9fRk1UICJSZWNvdmVyZWQgZnJvbSAlc1xuIiwKKwkJCQlpb2MtPm5hbWUsCisJCQkJc3RhdGVmYXVsdD09MSA/ICJzdHVjayBoYW5kc2hha2UiIDogIklPQyBGQVVMVCIpOworCX0KKworCXJldHVybiBoYXJkX3Jlc2V0X2RvbmU7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKgltcHRfR2V0SW9jU3RhdGUgLSBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBNUFQgYWRhcHRlci4KKyAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCisgKglAY29va2VkOiBSZXF1ZXN0IHJhdyBvciBjb29rZWQgSU9DIHN0YXRlCisgKgorICoJUmV0dXJucyBhbGwgSU9DIERvb3JiZWxsIHJlZ2lzdGVyIGJpdHMgaWYgY29va2VkPT0wLCBlbHNlIGp1c3QgdGhlCisgKglEb29yYmVsbCBiaXRzIGluIE1QSV9JT0NfU1RBVEVfTUFTSy4KKyAqLwordTMyCittcHRfR2V0SW9jU3RhdGUoTVBUX0FEQVBURVIgKmlvYywgaW50IGNvb2tlZCkKK3sKKwl1MzIgcywgc2M7CisKKwkvKiAgR2V0ISAgKi8KKwlzID0gQ0hJUFJFR19SRUFEMzIoJmlvYy0+Y2hpcC0+RG9vcmJlbGwpOworLy8JZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAicmF3IHN0YXRlID0gJTA4eFxuIiwgaW9jLT5uYW1lLCBzKSk7CisJc2MgPSBzICYgTVBJX0lPQ19TVEFURV9NQVNLOworCisJLyogIFNhdmUhICAqLworCWlvYy0+bGFzdF9zdGF0ZSA9IHNjOworCisJcmV0dXJuIGNvb2tlZCA/IHNjIDogczsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCUdldElvY0ZhY3RzIC0gU2VuZCBJT0NGYWN0cyByZXF1ZXN0IHRvIE1QVCBhZGFwdGVyLgorICoJQGlvYzogUG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKKyAqCUBzbGVlcEZsYWc6IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBwcm9jZXNzIGNhbiBzbGVlcAorICoJQHJlYXNvbjogSWYgcmVjb3ZlcnksIG9ubHkgdXBkYXRlIGZhY3RzLgorICoKKyAqCVJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQKK0dldElvY0ZhY3RzKE1QVF9BREFQVEVSICppb2MsIGludCBzbGVlcEZsYWcsIGludCByZWFzb24pCit7CisJSU9DRmFjdHNfdAkJIGdldF9mYWN0czsKKwlJT0NGYWN0c1JlcGx5X3QJCSpmYWN0czsKKwlpbnQJCQkgcjsKKwlpbnQJCQkgcmVxX3N6OworCWludAkJCSByZXBseV9zejsKKwlpbnQJCQkgc3o7CisJdTMyCQkJIHN0YXR1cywgdnY7CisJdTgJCQkgc2hpZnRGYWN0b3I9MTsKKworCS8qIElPQyAqbXVzdCogTk9UIGJlIGluIFJFU0VUIHN0YXRlISAqLworCWlmIChpb2MtPmxhc3Rfc3RhdGUgPT0gTVBJX0lPQ19TVEFURV9SRVNFVCkgeworCQlwcmludGsoS0VSTl9FUlIgTVlOQU0gIjogRVJST1IgLSBDYW4ndCBnZXQgSU9DRmFjdHMsICVzIE5PVCBSRUFEWSEgKCUwOHgpXG4iLAorCQkJCWlvYy0+bmFtZSwKKwkJCQlpb2MtPmxhc3Rfc3RhdGUgKTsKKwkJcmV0dXJuIC00NDsKKwl9CisKKwlmYWN0cyA9ICZpb2MtPmZhY3RzOworCisJLyogRGVzdGluYXRpb24gKHJlcGx5IGFyZWEpLi4uICovCisJcmVwbHlfc3ogPSBzaXplb2YoKmZhY3RzKTsKKwltZW1zZXQoZmFjdHMsIDAsIHJlcGx5X3N6KTsKKworCS8qIFJlcXVlc3QgYXJlYSAoZ2V0X2ZhY3RzIG9uIHRoZSBzdGFjayByaWdodCBub3chKSAqLworCXJlcV9zeiA9IHNpemVvZihnZXRfZmFjdHMpOworCW1lbXNldCgmZ2V0X2ZhY3RzLCAwLCByZXFfc3opOworCisJZ2V0X2ZhY3RzLkZ1bmN0aW9uID0gTVBJX0ZVTkNUSU9OX0lPQ19GQUNUUzsKKwkvKiBBc3NlcnQ6IEFsbCBvdGhlciBnZXRfZmFjdHMgZmllbGRzIGFyZSB6ZXJvISAqLworCisJZGluaXRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgCisJICAgICJTZW5kaW5nIGdldCBJb2NGYWN0cyByZXF1ZXN0IHJlcV9zej0lZCByZXBseV9zej0lZFxuIiwgCisJICAgIGlvYy0+bmFtZSwgcmVxX3N6LCByZXBseV9zeikpOworCisJLyogTm8gbm9uLXplcm8gZmllbGRzIGluIHRoZSBnZXRfZmFjdHMgcmVxdWVzdCBhcmUgZ3JlYXRlciB0aGFuCisJICogMSBieXRlIGluIHNpemUsIHNvIHdlIGNhbiBqdXN0IGZpcmUgaXQgb2ZmIGFzIGlzLgorCSAqLworCXIgPSBtcHRfaGFuZHNoYWtlX3JlcV9yZXBseV93YWl0KGlvYywgcmVxX3N6LCAodTMyKikmZ2V0X2ZhY3RzLAorCQkJcmVwbHlfc3osICh1MTYqKWZhY3RzLCA1IC8qc2Vjb25kcyovLCBzbGVlcEZsYWcpOworCWlmIChyICE9IDApCisJCXJldHVybiByOworCisJLyoKKwkgKiBOb3cgYnl0ZSBzd2FwIChHUlJSKSB0aGUgbmVjZXNzYXJ5IGZpZWxkcyBiZWZvcmUgYW55IGZ1cnRoZXIKKwkgKiBpbnNwZWN0aW9uIG9mIHJlcGx5IGNvbnRlbnRzLgorCSAqCisJICogQnV0IG5lZWQgdG8gZG8gc29tZSBzYW5pdHkgY2hlY2tzIG9uIE1zZ0xlbmd0aCAoYnl0ZSkgZmllbGQKKwkgKiB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgemVybyBJT0MncyByZXFfc3ohCisJICovCisJLyogRGlkIHdlIGdldCBhIHZhbGlkIHJlcGx5PyAqLworCWlmIChmYWN0cy0+TXNnTGVuZ3RoID4gb2Zmc2V0b2YoSU9DRmFjdHNSZXBseV90LCBSZXF1ZXN0RnJhbWVTaXplKS9zaXplb2YodTMyKSkgeworCQlpZiAocmVhc29uID09IE1QVF9IT1NURVZFTlRfSU9DX0JSSU5HVVApIHsKKwkJCS8qCisJCQkgKiBJZiBub3QgYmVlbiBoZXJlLCBkb25lIHRoYXQsIHNhdmUgb2ZmIGZpcnN0IFdob0luaXQgdmFsdWUKKwkJCSAqLworCQkJaWYgKGlvYy0+Rmlyc3RXaG9Jbml0ID09IFdIT0lOSVRfVU5LTk9XTikKKwkJCQlpb2MtPkZpcnN0V2hvSW5pdCA9IGZhY3RzLT5XaG9Jbml0OworCQl9CisKKwkJZmFjdHMtPk1zZ1ZlcnNpb24gPSBsZTE2X3RvX2NwdShmYWN0cy0+TXNnVmVyc2lvbik7CisJCWZhY3RzLT5Nc2dDb250ZXh0ID0gbGUzMl90b19jcHUoZmFjdHMtPk1zZ0NvbnRleHQpOworCQlmYWN0cy0+SU9DRXhjZXB0aW9ucyA9IGxlMTZfdG9fY3B1KGZhY3RzLT5JT0NFeGNlcHRpb25zKTsKKwkJZmFjdHMtPklPQ1N0YXR1cyA9IGxlMTZfdG9fY3B1KGZhY3RzLT5JT0NTdGF0dXMpOworCQlmYWN0cy0+SU9DTG9nSW5mbyA9IGxlMzJfdG9fY3B1KGZhY3RzLT5JT0NMb2dJbmZvKTsKKwkJc3RhdHVzID0gZmFjdHMtPklPQ1N0YXR1cyAmIE1QSV9JT0NTVEFUVVNfTUFTSzsKKwkJLyogQ0hFQ0tNRSEgSU9DU3RhdHVzLCBJT0NMb2dJbmZvICovCisKKwkJZmFjdHMtPlJlcGx5UXVldWVEZXB0aCA9IGxlMTZfdG9fY3B1KGZhY3RzLT5SZXBseVF1ZXVlRGVwdGgpOworCQlmYWN0cy0+UmVxdWVzdEZyYW1lU2l6ZSA9IGxlMTZfdG9fY3B1KGZhY3RzLT5SZXF1ZXN0RnJhbWVTaXplKTsKKworCQkvKgorCQkgKiBGQyBmL3cgdmVyc2lvbiBjaGFuZ2VkIGJldHdlZW4gMS4xIGFuZCAxLjIKKwkJICoJT2xkOiB1MTZ7TWFqb3IoNCksTWlub3IoNCksU3ViTWlub3IoOCl9CisJCSAqCU5ldzogdTMye01ham9yKDgpLE1pbm9yKDgpLFVuaXQoOCksRGV2KDgpfQorCQkgKi8KKwkJaWYgKGZhY3RzLT5Nc2dWZXJzaW9uIDwgMHgwMTAyKSB7CisJCQkvKgorCQkJICoJSGFuZGxlIG9sZCBGQyBmL3cgc3R5bGUsIGNvbnZlcnQgdG8gbmV3Li4uCisJCQkgKi8KKwkJCXUxNgkgb2xkdiA9IGxlMTZfdG9fY3B1KGZhY3RzLT5SZXNlcnZlZF8wMTAxX0ZXVmVyc2lvbik7CisJCQlmYWN0cy0+RldWZXJzaW9uLldvcmQgPQorCQkJCQkoKG9sZHY8PDEyKSAmIDB4RkYwMDAwMDApIHwKKwkJCQkJKChvbGR2PDw4KSAgJiAweDAwMEZGRjAwKTsKKwkJfSBlbHNlCisJCQlmYWN0cy0+RldWZXJzaW9uLldvcmQgPSBsZTMyX3RvX2NwdShmYWN0cy0+RldWZXJzaW9uLldvcmQpOworCisJCWZhY3RzLT5Qcm9kdWN0SUQgPSBsZTE2X3RvX2NwdShmYWN0cy0+UHJvZHVjdElEKTsKKwkJZmFjdHMtPkN1cnJlbnRIb3N0TWZhSGlnaEFkZHIgPQorCQkJCWxlMzJfdG9fY3B1KGZhY3RzLT5DdXJyZW50SG9zdE1mYUhpZ2hBZGRyKTsKKwkJZmFjdHMtPkdsb2JhbENyZWRpdHMgPSBsZTE2X3RvX2NwdShmYWN0cy0+R2xvYmFsQ3JlZGl0cyk7CisJCWZhY3RzLT5DdXJyZW50U2Vuc2VCdWZmZXJIaWdoQWRkciA9CisJCQkJbGUzMl90b19jcHUoZmFjdHMtPkN1cnJlbnRTZW5zZUJ1ZmZlckhpZ2hBZGRyKTsKKwkJZmFjdHMtPkN1clJlcGx5RnJhbWVTaXplID0KKwkJCQlsZTE2X3RvX2NwdShmYWN0cy0+Q3VyUmVwbHlGcmFtZVNpemUpOworCisJCS8qCisJCSAqIEhhbmRsZSBORVcgKCEpIElPQ0ZhY3RzUmVwbHkgZmllbGRzIGluIE1QSS0xLjAxLnh4CisJCSAqIE9sZGVyIE1QSS0xLjAwLnh4IHN0cnVjdCBoYWQgMTMgZHdvcmRzLCBhbmQgZW5sYXJnZWQKKwkJICogdG8gMTQgaW4gTVBJLTEuMDEuMHguCisJCSAqLworCQlpZiAoZmFjdHMtPk1zZ0xlbmd0aCA+PSAob2Zmc2V0b2YoSU9DRmFjdHNSZXBseV90LEZXSW1hZ2VTaXplKSArIDcpLzQgJiYKKwkJICAgIGZhY3RzLT5Nc2dWZXJzaW9uID4gMHgwMTAwKSB7CisJCQlmYWN0cy0+RldJbWFnZVNpemUgPSBsZTMyX3RvX2NwdShmYWN0cy0+RldJbWFnZVNpemUpOworCQl9CisKKwkJc3ogPSBmYWN0cy0+RldJbWFnZVNpemU7CisJCWlmICggc3ogJiAweDAxICkKKwkJCXN6ICs9IDE7CisJCWlmICggc3ogJiAweDAyICkKKwkJCXN6ICs9IDI7CisJCWZhY3RzLT5GV0ltYWdlU2l6ZSA9IHN6OworCQkKKwkJaWYgKCFmYWN0cy0+UmVxdWVzdEZyYW1lU2l6ZSkgeworCQkJLyogIFNvbWV0aGluZyBpcyB3cm9uZyEgICovCisJCQlwcmludGsoTVlJT0Nfc19FUlJfRk1UICJJT0MgcmVwb3J0ZWQgaW52YWxpZCAwIHJlcXVlc3Qgc2l6ZSFcbiIsCisJCQkJCWlvYy0+bmFtZSk7CisJCQlyZXR1cm4gLTU1OworCQl9CisKKwkJciA9IHN6ID0gbGUzMl90b19jcHUoZmFjdHMtPkJsb2NrU2l6ZSk7CisJCXZ2ID0gKCg2MyAvIChzeiAqIDQpKSArIDEpICYgMHgwMzsKKwkJaW9jLT5OQl9mb3JfNjRfYnl0ZV9mcmFtZSA9IHZ2OworCQl3aGlsZSAoIHN6ICkKKwkJeworCQkJc2hpZnRGYWN0b3IrKzsKKwkJCXN6ID0gc3ogPj4gMTsKKwkJfQorCQlpb2MtPk5CU2hpZnRGYWN0b3IgID0gc2hpZnRGYWN0b3I7CisJCWRpbml0cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJOQl9mb3JfNjRfYnl0ZV9mcmFtZT0leCBOQlNoaWZ0RmFjdG9yPSV4IEJsb2NrU2l6ZT0leFxuIiwKKwkJCQkJaW9jLT5uYW1lLCB2diwgc2hpZnRGYWN0b3IsIHIpKTsKKyAgICAKKwkJaWYgKHJlYXNvbiA9PSBNUFRfSE9TVEVWRU5UX0lPQ19CUklOR1VQKSB7CisJCQkvKgorCQkJICogU2V0IHZhbHVlcyBmb3IgdGhpcyBJT0MncyByZXF1ZXN0ICYgcmVwbHkgZnJhbWUgc2l6ZXMsCisJCQkgKiBhbmQgcmVxdWVzdCAmIHJlcGx5IHF1ZXVlIGRlcHRocy4uLgorCQkJICovCisJCQlpb2MtPnJlcV9zeiA9IG1pbihNUFRfREVGQVVMVF9GUkFNRV9TSVpFLCBmYWN0cy0+UmVxdWVzdEZyYW1lU2l6ZSAqIDQpOworCQkJaW9jLT5yZXFfZGVwdGggPSBtaW5fdChpbnQsIE1QVF9NQVhfUkVRX0RFUFRILCBmYWN0cy0+R2xvYmFsQ3JlZGl0cyk7CisJCQlpb2MtPnJlcGx5X3N6ID0gTVBUX1JFUExZX0ZSQU1FX1NJWkU7CisJCQlpb2MtPnJlcGx5X2RlcHRoID0gbWluX3QoaW50LCBNUFRfREVGQVVMVF9SRVBMWV9ERVBUSCwgZmFjdHMtPlJlcGx5UXVldWVEZXB0aCk7CisKKwkJCWRpbml0cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJyZXBseV9zej0lM2QsIHJlcGx5X2RlcHRoPSU0ZFxuIiwKKwkJCQlpb2MtPm5hbWUsIGlvYy0+cmVwbHlfc3osIGlvYy0+cmVwbHlfZGVwdGgpKTsKKwkJCWRpbml0cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJyZXFfc3ogID0lM2QsIHJlcV9kZXB0aCAgPSU0ZFxuIiwKKwkJCQlpb2MtPm5hbWUsIGlvYy0+cmVxX3N6LCBpb2MtPnJlcV9kZXB0aCkpOworCisJCQkvKiBHZXQgcG9ydCBmYWN0cyEgKi8KKwkJCWlmICggKHIgPSBHZXRQb3J0RmFjdHMoaW9jLCAwLCBzbGVlcEZsYWcpKSAhPSAwICkKKwkJCQlyZXR1cm4gcjsKKwkJfQorCX0gZWxzZSB7CisJCXByaW50ayhNWUlPQ19zX0VSUl9GTVQgCisJCSAgICAgIkludmFsaWQgSU9DIGZhY3RzIHJlcGx5LCBtc2dMZW5ndGg9JWQgb2Zmc2V0b2Y9JXpkIVxuIiwKKwkJICAgICBpb2MtPm5hbWUsIGZhY3RzLT5Nc2dMZW5ndGgsIChvZmZzZXRvZihJT0NGYWN0c1JlcGx5X3QsCisJCSAgICAgUmVxdWVzdEZyYW1lU2l6ZSkvc2l6ZW9mKHUzMikpKTsKKwkJcmV0dXJuIC02NjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCUdldFBvcnRGYWN0cyAtIFNlbmQgUG9ydEZhY3RzIHJlcXVlc3QgdG8gTVBUIGFkYXB0ZXIuCisgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQorICoJQHBvcnRudW06IFBvcnQgbnVtYmVyCisgKglAc2xlZXBGbGFnOiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcHJvY2VzcyBjYW4gc2xlZXAKKyAqCisgKglSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgorICovCitzdGF0aWMgaW50CitHZXRQb3J0RmFjdHMoTVBUX0FEQVBURVIgKmlvYywgaW50IHBvcnRudW0sIGludCBzbGVlcEZsYWcpCit7CisJUG9ydEZhY3RzX3QJCSBnZXRfcGZhY3RzOworCVBvcnRGYWN0c1JlcGx5X3QJKnBmYWN0czsKKwlpbnQJCQkgaWk7CisJaW50CQkJIHJlcV9zejsKKwlpbnQJCQkgcmVwbHlfc3o7CisKKwkvKiBJT0MgKm11c3QqIE5PVCBiZSBpbiBSRVNFVCBzdGF0ZSEgKi8KKwlpZiAoaW9jLT5sYXN0X3N0YXRlID09IE1QSV9JT0NfU1RBVEVfUkVTRVQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIE1ZTkFNICI6IEVSUk9SIC0gQ2FuJ3QgZ2V0IFBvcnRGYWN0cywgJXMgTk9UIFJFQURZISAoJTA4eClcbiIsCisJCQkJaW9jLT5uYW1lLAorCQkJCWlvYy0+bGFzdF9zdGF0ZSApOworCQlyZXR1cm4gLTQ7CisJfQorCisJcGZhY3RzID0gJmlvYy0+cGZhY3RzW3BvcnRudW1dOworCisJLyogRGVzdGluYXRpb24gKHJlcGx5IGFyZWEpLi4uICAqLworCXJlcGx5X3N6ID0gc2l6ZW9mKCpwZmFjdHMpOworCW1lbXNldChwZmFjdHMsIDAsIHJlcGx5X3N6KTsKKworCS8qIFJlcXVlc3QgYXJlYSAoZ2V0X3BmYWN0cyBvbiB0aGUgc3RhY2sgcmlnaHQgbm93ISkgKi8KKwlyZXFfc3ogPSBzaXplb2YoZ2V0X3BmYWN0cyk7CisJbWVtc2V0KCZnZXRfcGZhY3RzLCAwLCByZXFfc3opOworCisJZ2V0X3BmYWN0cy5GdW5jdGlvbiA9IE1QSV9GVU5DVElPTl9QT1JUX0ZBQ1RTOworCWdldF9wZmFjdHMuUG9ydE51bWJlciA9IHBvcnRudW07CisJLyogQXNzZXJ0OiBBbGwgb3RoZXIgZ2V0X3BmYWN0cyBmaWVsZHMgYXJlIHplcm8hICovCisKKwlkaW5pdHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2VuZGluZyBnZXQgUG9ydEZhY3RzKCVkKSByZXF1ZXN0XG4iLAorCQkJaW9jLT5uYW1lLCBwb3J0bnVtKSk7CisKKwkvKiBObyBub24temVybyBmaWVsZHMgaW4gdGhlIGdldF9wZmFjdHMgcmVxdWVzdCBhcmUgZ3JlYXRlciB0aGFuCisJICogMSBieXRlIGluIHNpemUsIHNvIHdlIGNhbiBqdXN0IGZpcmUgaXQgb2ZmIGFzIGlzLgorCSAqLworCWlpID0gbXB0X2hhbmRzaGFrZV9yZXFfcmVwbHlfd2FpdChpb2MsIHJlcV9zeiwgKHUzMiopJmdldF9wZmFjdHMsCisJCQkJcmVwbHlfc3osICh1MTYqKXBmYWN0cywgNSAvKnNlY29uZHMqLywgc2xlZXBGbGFnKTsKKwlpZiAoaWkgIT0gMCkKKwkJcmV0dXJuIGlpOworCisJLyogRGlkIHdlIGdldCBhIHZhbGlkIHJlcGx5PyAqLworCisJLyogTm93IGJ5dGUgc3dhcCB0aGUgbmVjZXNzYXJ5IGZpZWxkcyBpbiB0aGUgcmVzcG9uc2UuICovCisJcGZhY3RzLT5Nc2dDb250ZXh0ID0gbGUzMl90b19jcHUocGZhY3RzLT5Nc2dDb250ZXh0KTsKKwlwZmFjdHMtPklPQ1N0YXR1cyA9IGxlMTZfdG9fY3B1KHBmYWN0cy0+SU9DU3RhdHVzKTsKKwlwZmFjdHMtPklPQ0xvZ0luZm8gPSBsZTMyX3RvX2NwdShwZmFjdHMtPklPQ0xvZ0luZm8pOworCXBmYWN0cy0+TWF4RGV2aWNlcyA9IGxlMTZfdG9fY3B1KHBmYWN0cy0+TWF4RGV2aWNlcyk7CisJcGZhY3RzLT5Qb3J0U0NTSUlEID0gbGUxNl90b19jcHUocGZhY3RzLT5Qb3J0U0NTSUlEKTsKKwlwZmFjdHMtPlByb3RvY29sRmxhZ3MgPSBsZTE2X3RvX2NwdShwZmFjdHMtPlByb3RvY29sRmxhZ3MpOworCXBmYWN0cy0+TWF4UG9zdGVkQ21kQnVmZmVycyA9IGxlMTZfdG9fY3B1KHBmYWN0cy0+TWF4UG9zdGVkQ21kQnVmZmVycyk7CisJcGZhY3RzLT5NYXhQZXJzaXN0ZW50SURzID0gbGUxNl90b19jcHUocGZhY3RzLT5NYXhQZXJzaXN0ZW50SURzKTsKKwlwZmFjdHMtPk1heExhbkJ1Y2tldHMgPSBsZTE2X3RvX2NwdShwZmFjdHMtPk1heExhbkJ1Y2tldHMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKglTZW5kSW9jSW5pdCAtIFNlbmQgSU9DSW5pdCByZXF1ZXN0IHRvIE1QVCBhZGFwdGVyLgorICoJQGlvYzogUG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKKyAqCUBzbGVlcEZsYWc6IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBwcm9jZXNzIGNhbiBzbGVlcAorICoKKyAqCVNlbmQgSU9DSW5pdCBmb2xsb3dlZCBieSBQb3J0RW5hYmxlIHRvIGJyaW5nIElPQyB0byBPUEVSQVRJT05BTCBzdGF0ZS4KKyAqCisgKglSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgorICovCitzdGF0aWMgaW50CitTZW5kSW9jSW5pdChNUFRfQURBUFRFUiAqaW9jLCBpbnQgc2xlZXBGbGFnKQoreworCUlPQ0luaXRfdAkJIGlvY19pbml0OworCU1QSURlZmF1bHRSZXBseV90CSBpbml0X3JlcGx5OworCXUzMgkJCSBzdGF0ZTsKKwlpbnQJCQkgcjsKKwlpbnQJCQkgY291bnQ7CisJaW50CQkJIGNudGRuOworCisJbWVtc2V0KCZpb2NfaW5pdCwgMCwgc2l6ZW9mKGlvY19pbml0KSk7CisJbWVtc2V0KCZpbml0X3JlcGx5LCAwLCBzaXplb2YoaW5pdF9yZXBseSkpOworCisJaW9jX2luaXQuV2hvSW5pdCA9IE1QSV9XSE9JTklUX0hPU1RfRFJJVkVSOworCWlvY19pbml0LkZ1bmN0aW9uID0gTVBJX0ZVTkNUSU9OX0lPQ19JTklUOworCisJLyogSWYgd2UgYXJlIGluIGEgcmVjb3ZlcnkgbW9kZSBhbmQgd2UgdXBsb2FkZWQgdGhlIEZXIGltYWdlLAorCSAqIHRoZW4gdGhpcyBwb2ludGVyIGlzIG5vdCBOVUxMLiBTa2lwIHRoZSB1cGxvYWQgYSBzZWNvbmQgdGltZS4KKwkgKiBTZXQgdGhpcyBmbGFnIGlmIGNhY2hlZF9mdyBzZXQgZm9yIGVpdGhlciBJT0MuCisJICovCisJaWYgKGlvYy0+ZmFjdHMuRmxhZ3MgJiBNUElfSU9DRkFDVFNfRkxBR1NfRldfRE9XTkxPQURfQk9PVCkKKwkJaW9jLT51cGxvYWRfZncgPSAxOworCWVsc2UKKwkJaW9jLT51cGxvYWRfZncgPSAwOworCWRkbHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAidXBsb2FkX2Z3ICVkIGZhY3RzLkZsYWdzPSV4XG4iLAorCQkgICBpb2MtPm5hbWUsIGlvYy0+dXBsb2FkX2Z3LCBpb2MtPmZhY3RzLkZsYWdzKSk7CisKKwlpZiAoaW9jLT5idXNfdHlwZSA9PSBGQykKKwkJaW9jX2luaXQuTWF4RGV2aWNlcyA9IE1QVF9NQVhfRkNfREVWSUNFUzsKKwllbHNlCisJCWlvY19pbml0Lk1heERldmljZXMgPSBNUFRfTUFYX1NDU0lfREVWSUNFUzsKKwkKKwlpb2NfaW5pdC5NYXhCdXNlcyA9IE1QVF9NQVhfQlVTOworCisJaW9jX2luaXQuUmVwbHlGcmFtZVNpemUgPSBjcHVfdG9fbGUxNihpb2MtPnJlcGx5X3N6KTsJLyogaW4gQllURVMgKi8KKworCWlmIChzaXplb2YoZG1hX2FkZHJfdCkgPT0gc2l6ZW9mKHU2NCkpIHsKKwkJLyogU2F2ZSB0aGUgdXBwZXIgMzItYml0cyBvZiB0aGUgcmVxdWVzdAorCQkgKiAocmVwbHkpIGFuZCBzZW5zZSBidWZmZXJzLgorCQkgKi8KKwkJaW9jX2luaXQuSG9zdE1mYUhpZ2hBZGRyID0gY3B1X3RvX2xlMzIoKHUzMikoKHU2NClpb2MtPmFsbG9jX2RtYSA+PiAzMikpOworCQlpb2NfaW5pdC5TZW5zZUJ1ZmZlckhpZ2hBZGRyID0gY3B1X3RvX2xlMzIoKHUzMikoKHU2NClpb2MtPnNlbnNlX2J1Zl9wb29sX2RtYSA+PiAzMikpOworCX0gZWxzZSB7CisJCS8qIEZvcmNlIDMyLWJpdCBhZGRyZXNzaW5nICovCisJCWlvY19pbml0Lkhvc3RNZmFIaWdoQWRkciA9IGNwdV90b19sZTMyKDApOworCQlpb2NfaW5pdC5TZW5zZUJ1ZmZlckhpZ2hBZGRyID0gY3B1X3RvX2xlMzIoMCk7CisJfQorCQkKKwlpb2MtPmZhY3RzLkN1cnJlbnRIb3N0TWZhSGlnaEFkZHIgPSBpb2NfaW5pdC5Ib3N0TWZhSGlnaEFkZHI7CisJaW9jLT5mYWN0cy5DdXJyZW50U2Vuc2VCdWZmZXJIaWdoQWRkciA9IGlvY19pbml0LlNlbnNlQnVmZmVySGlnaEFkZHI7CisKKwlkaHNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlNlbmRpbmcgSU9DSW5pdCAocmVxIEAgJXApXG4iLAorCQkJaW9jLT5uYW1lLCAmaW9jX2luaXQpKTsKKworCXIgPSBtcHRfaGFuZHNoYWtlX3JlcV9yZXBseV93YWl0KGlvYywgc2l6ZW9mKElPQ0luaXRfdCksICh1MzIqKSZpb2NfaW5pdCwKKwkJCQlzaXplb2YoTVBJRGVmYXVsdFJlcGx5X3QpLCAodTE2KikmaW5pdF9yZXBseSwgMTAgLypzZWNvbmRzKi8sIHNsZWVwRmxhZyk7CisJaWYgKHIgIT0gMCkKKwkJcmV0dXJuIHI7CisKKwkvKiBObyBuZWVkIHRvIGJ5dGUgc3dhcCB0aGUgbXVsdGlieXRlIGZpZWxkcyBpbiB0aGUgcmVwbHkKKwkgKiBzaW5jZSB3ZSBkb24ndCBldmVuIGxvb2sgYXQgaXQncyBjb250ZW50cy4KKwkgKi8KKworCWRoc3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2VuZGluZyBQb3J0RW5hYmxlIChyZXEgQCAlcClcbiIsCisJCQlpb2MtPm5hbWUsICZpb2NfaW5pdCkpOworCQorCWlmICgociA9IFNlbmRQb3J0RW5hYmxlKGlvYywgMCwgc2xlZXBGbGFnKSkgIT0gMCkKKwkJcmV0dXJuIHI7CisKKwkvKiBZSUtFUyEgIFNVUEVSIElNUE9SVEFOVCEhIQorCSAqICBQb2xsIElvY1N0YXRlIHVudGlsIF9PUEVSQVRJT05BTCB3aGlsZSBJT0MgaXMgZG9pbmcKKwkgKiAgTG9vcEluaXQgYW5kIFRhcmdldERpc2NvdmVyeSEKKwkgKi8KKwljb3VudCA9IDA7CisJY250ZG4gPSAoKHNsZWVwRmxhZyA9PSBDQU5fU0xFRVApID8gSFogOiAxMDAwKSAqIDYwOwkvKiA2MCBzZWNvbmRzICovCisJc3RhdGUgPSBtcHRfR2V0SW9jU3RhdGUoaW9jLCAxKTsKKwl3aGlsZSAoc3RhdGUgIT0gTVBJX0lPQ19TVEFURV9PUEVSQVRJT05BTCAmJiAtLWNudGRuKSB7CisJCWlmIChzbGVlcEZsYWcgPT0gQ0FOX1NMRUVQKSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxKTsKKwkJfSBlbHNlIHsKKwkJCW1kZWxheSgxKTsKKwkJfQorCisJCWlmICghY250ZG4pIHsKKwkJCXByaW50ayhNWUlPQ19zX0VSUl9GTVQgIldhaXQgSU9DX09QIHN0YXRlIHRpbWVvdXQoJWQpIVxuIiwKKwkJCQkJaW9jLT5uYW1lLCAoaW50KSgoY291bnQrNSkvSFopKTsKKwkJCXJldHVybiAtOTsKKwkJfQorCisJCXN0YXRlID0gbXB0X0dldElvY1N0YXRlKGlvYywgMSk7CisJCWNvdW50Kys7CisJfQorCWRoc3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiSU5GTyAtIFdhaXQgSU9DX09QRVJBVElPTkFMIHN0YXRlIChjbnQ9JWQpXG4iLAorCQkJaW9jLT5uYW1lLCBjb3VudCkpOworCisJcmV0dXJuIHI7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKglTZW5kUG9ydEVuYWJsZSAtIFNlbmQgUG9ydEVuYWJsZSByZXF1ZXN0IHRvIE1QVCBhZGFwdGVyIHBvcnQuCisgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQorICoJQHBvcnRudW06IFBvcnQgbnVtYmVyIHRvIGVuYWJsZQorICoJQHNsZWVwRmxhZzogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHByb2Nlc3MgY2FuIHNsZWVwCisgKgorICoJU2VuZCBQb3J0RW5hYmxlIHRvIGJyaW5nIElPQyB0byBPUEVSQVRJT05BTCBzdGF0ZS4KKyAqCisgKglSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgorICovCitzdGF0aWMgaW50CitTZW5kUG9ydEVuYWJsZShNUFRfQURBUFRFUiAqaW9jLCBpbnQgcG9ydG51bSwgaW50IHNsZWVwRmxhZykKK3sKKwlQb3J0RW5hYmxlX3QJCSBwb3J0X2VuYWJsZTsKKwlNUElEZWZhdWx0UmVwbHlfdAkgcmVwbHlfYnVmOworCWludAkgaWk7CisJaW50CSByZXFfc3o7CisJaW50CSByZXBseV9zejsKKworCS8qICBEZXN0aW5hdGlvbi4uLiAgKi8KKwlyZXBseV9zeiA9IHNpemVvZihNUElEZWZhdWx0UmVwbHlfdCk7CisJbWVtc2V0KCZyZXBseV9idWYsIDAsIHJlcGx5X3N6KTsKKworCXJlcV9zeiA9IHNpemVvZihQb3J0RW5hYmxlX3QpOworCW1lbXNldCgmcG9ydF9lbmFibGUsIDAsIHJlcV9zeik7CisKKwlwb3J0X2VuYWJsZS5GdW5jdGlvbiA9IE1QSV9GVU5DVElPTl9QT1JUX0VOQUJMRTsKKwlwb3J0X2VuYWJsZS5Qb3J0TnVtYmVyID0gcG9ydG51bTsKKy8qCXBvcnRfZW5hYmxlLkNoYWluT2Zmc2V0ID0gMDsJCSovCisvKglwb3J0X2VuYWJsZS5Nc2dGbGFncyA9IDA7CQkqLworLyoJcG9ydF9lbmFibGUuTXNnQ29udGV4dCA9IDA7CQkqLworCisJZGluaXRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlNlbmRpbmcgUG9ydCglZClFbmFibGUgKHJlcSBAICVwKVxuIiwKKwkJCWlvYy0+bmFtZSwgcG9ydG51bSwgJnBvcnRfZW5hYmxlKSk7CisKKwkvKiBSQUlEIEZXIG1heSB0YWtlIGEgbG9uZyB0aW1lIHRvIGVuYWJsZQorCSAqLworCWlmIChpb2MtPmJ1c190eXBlID09IEZDKSB7CisJCWlpID0gbXB0X2hhbmRzaGFrZV9yZXFfcmVwbHlfd2FpdChpb2MsIHJlcV9zeiwgKHUzMiopJnBvcnRfZW5hYmxlLAorCQkJCXJlcGx5X3N6LCAodTE2KikmcmVwbHlfYnVmLCA2NSAvKnNlY29uZHMqLywgc2xlZXBGbGFnKTsKKwl9IGVsc2UgeworCQlpaSA9IG1wdF9oYW5kc2hha2VfcmVxX3JlcGx5X3dhaXQoaW9jLCByZXFfc3osICh1MzIqKSZwb3J0X2VuYWJsZSwKKwkJCQlyZXBseV9zeiwgKHUxNiopJnJlcGx5X2J1ZiwgMzAwIC8qc2Vjb25kcyovLCBzbGVlcEZsYWcpOworCX0KKworCWlmIChpaSAhPSAwKQorCQlyZXR1cm4gaWk7CisKKwkvKiBXZSBkbyBub3QgZXZlbiBsb29rIGF0IHRoZSByZXBseSwgc28gd2UgbmVlZCBub3QKKwkgKiBzd2FwIHRoZSBtdWx0aS1ieXRlIGZpZWxkcy4KKwkgKi8KKworCXJldHVybiAwOworfQorCisvKgorICoJaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQorICogICAgICBzaXplIC0gdG90YWwgRlcgYnl0ZXMKKyAqLwordm9pZAorbXB0X2FsbG9jX2Z3X21lbW9yeShNUFRfQURBUFRFUiAqaW9jLCBpbnQgc2l6ZSkKK3sKKwlpZiAoaW9jLT5jYWNoZWRfZncpCisJCXJldHVybjsgIC8qIHVzZSBhbHJlYWR5IGFsbG9jYXRlZCBtZW1vcnkgKi8KKwlpZiAoaW9jLT5hbHRfaW9jICYmIGlvYy0+YWx0X2lvYy0+Y2FjaGVkX2Z3KSB7CisJCWlvYy0+Y2FjaGVkX2Z3ID0gaW9jLT5hbHRfaW9jLT5jYWNoZWRfZnc7ICAvKiB1c2UgYWx0X2lvYydzIG1lbW9yeSAqLworCQlpb2MtPmNhY2hlZF9md19kbWEgPSBpb2MtPmFsdF9pb2MtPmNhY2hlZF9md19kbWE7CisJfSBlbHNlIHsKKwkJaWYgKCAoaW9jLT5jYWNoZWRfZncgPSBwY2lfYWxsb2NfY29uc2lzdGVudChpb2MtPnBjaWRldiwgc2l6ZSwgJmlvYy0+Y2FjaGVkX2Z3X2RtYSkgKSApCisJCQlpb2MtPmFsbG9jX3RvdGFsICs9IHNpemU7CisJfQorfQorLyoKKyAqIElmIGFsdF9pbWcgaXMgTlVMTCwgZGVsZXRlIGZyb20gaW9jIHN0cnVjdHVyZS4KKyAqIEVsc2UsIGRlbGV0ZSBhIHNlY29uZGFyeSBpbWFnZSBpbiBzYW1lIGZvcm1hdC4KKyAqLwordm9pZAorbXB0X2ZyZWVfZndfbWVtb3J5KE1QVF9BREFQVEVSICppb2MpCit7CisJaW50IHN6OworCisJc3ogPSBpb2MtPmZhY3RzLkZXSW1hZ2VTaXplOworCWRpbml0cHJpbnRrKChLRVJOX1dBUk5JTkcgTVlOQU0gImZyZWVfZndfbWVtb3J5OiBGVyBJbWFnZSAgQCAlcFslcF0sIHN6PSVkWyV4XSBieXRlc1xuIiwKKwkJIGlvYy0+Y2FjaGVkX2Z3LCAodm9pZCAqKSh1bG9uZylpb2MtPmNhY2hlZF9md19kbWEsIHN6LCBzeikpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQoaW9jLT5wY2lkZXYsIHN6LAorCQkJaW9jLT5jYWNoZWRfZncsIGlvYy0+Y2FjaGVkX2Z3X2RtYSk7CisJaW9jLT5jYWNoZWRfZncgPSBOVUxMOworCisJcmV0dXJuOworfQorCisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKgltcHRfZG9fdXBsb2FkIC0gQ29uc3RydWN0IGFuZCBTZW5kIEZXVXBsb2FkIHJlcXVlc3QgdG8gTVBUIGFkYXB0ZXIgcG9ydC4KKyAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCisgKglAc2xlZXBGbGFnOiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcHJvY2VzcyBjYW4gc2xlZXAKKyAqCisgKglSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsID4wIGZvciBoYW5kc2hha2UgZmFpbHVyZQorICoJCTwwIGZvciBmdyB1cGxvYWQgZmFpbHVyZS4KKyAqCisgKglSZW1hcms6IElmIGJvdW5kIElPQyBhbmQgYSBzdWNjZXNzZnVsIEZXVXBsb2FkIHdhcyBwZXJmb3JtZWQKKyAqCW9uIHRoZSBib3VuZCBJT0MsIHRoZSBzZWNvbmQgaW1hZ2UgaXMgZGlzY2FyZGVkCisgKglhbmQgbWVtb3J5IGlzIGZyZWUnZC4gQm90aCBjaGFubmVscyBtdXN0IHVwbG9hZCB0byBwcmV2ZW50CisgKglJT0MgZnJvbSBydW5uaW5nIGluIGRlZ3JhZGVkIG1vZGUuCisgKi8KK3N0YXRpYyBpbnQKK21wdF9kb191cGxvYWQoTVBUX0FEQVBURVIgKmlvYywgaW50IHNsZWVwRmxhZykKK3sKKwl1OAkJCSByZXF1ZXN0W2lvYy0+cmVxX3N6XTsKKwl1OAkJCSByZXBseVtzaXplb2YoRldVcGxvYWRSZXBseV90KV07CisJRldVcGxvYWRfdAkJKnByZXF1ZXN0OworCUZXVXBsb2FkUmVwbHlfdAkJKnByZXBseTsKKwlGV1VwbG9hZFRDU0dFX3QJCSpwdGNzZ2U7CisJaW50CQkJIHNnZW9mZnNldDsKKwl1MzIJCQkgZmxhZ3NMZW5ndGg7CisJaW50CQkJIGlpLCBzeiwgcmVwbHlfc3o7CisJaW50CQkJIGNtZFN0YXR1czsKKworCS8qIElmIHRoZSBpbWFnZSBzaXplIGlzIDAsIHdlIGFyZSBkb25lLgorCSAqLworCWlmICgoc3ogPSBpb2MtPmZhY3RzLkZXSW1hZ2VTaXplKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCW1wdF9hbGxvY19md19tZW1vcnkoaW9jLCBzeik7CisKKwlkaW5pdHByaW50aygoS0VSTl9XQVJOSU5HIE1ZTkFNICI6IEZXIEltYWdlICBAICVwWyVwXSwgc3o9JWRbJXhdIGJ5dGVzXG4iLAorCQkgaW9jLT5jYWNoZWRfZncsICh2b2lkICopKHVsb25nKWlvYy0+Y2FjaGVkX2Z3X2RtYSwgc3osIHN6KSk7CisJCisJaWYgKGlvYy0+Y2FjaGVkX2Z3ID09IE5VTEwpIHsKKwkJLyogTWFqb3IgRmFpbHVyZS4KKwkJICovCisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXByZXF1ZXN0ID0gKEZXVXBsb2FkX3QgKikmcmVxdWVzdDsKKwlwcmVwbHkgPSAoRldVcGxvYWRSZXBseV90ICopJnJlcGx5OworCisJLyogIERlc3RpbmF0aW9uLi4uICAqLworCW1lbXNldChwcmVxdWVzdCwgMCwgaW9jLT5yZXFfc3opOworCisJcmVwbHlfc3ogPSBzaXplb2YocmVwbHkpOworCW1lbXNldChwcmVwbHksIDAsIHJlcGx5X3N6KTsKKworCXByZXF1ZXN0LT5JbWFnZVR5cGUgPSBNUElfRldfVVBMT0FEX0lUWVBFX0ZXX0lPQ19NRU07CisJcHJlcXVlc3QtPkZ1bmN0aW9uID0gTVBJX0ZVTkNUSU9OX0ZXX1VQTE9BRDsKKworCXB0Y3NnZSA9IChGV1VwbG9hZFRDU0dFX3QgKikgJnByZXF1ZXN0LT5TR0w7CisJcHRjc2dlLT5EZXRhaWxzTGVuZ3RoID0gMTI7CisJcHRjc2dlLT5GbGFncyA9IE1QSV9TR0VfRkxBR1NfVFJBTlNBQ1RJT05fRUxFTUVOVDsKKwlwdGNzZ2UtPkltYWdlU2l6ZSA9IGNwdV90b19sZTMyKHN6KTsKKworCXNnZW9mZnNldCA9IHNpemVvZihGV1VwbG9hZF90KSAtIHNpemVvZihTR0VfTVBJX1VOSU9OKSArIHNpemVvZihGV1VwbG9hZFRDU0dFX3QpOworCisJZmxhZ3NMZW5ndGggPSBNUFRfU0dFX0ZMQUdTX1NTSU1QTEVfUkVBRCB8IHN6OworCW1wdF9hZGRfc2dlKCZyZXF1ZXN0W3NnZW9mZnNldF0sIGZsYWdzTGVuZ3RoLCBpb2MtPmNhY2hlZF9md19kbWEpOworCisJc2dlb2Zmc2V0ICs9IHNpemVvZih1MzIpICsgc2l6ZW9mKGRtYV9hZGRyX3QpOworCWRpbml0cHJpbnRrKChLRVJOX1dBUk5JTkcgTVlOQU0gIlNlbmRpbmcgRlcgVXBsb2FkIChyZXEgQCAlcCkgc2dlb2Zmc2V0PSVkIFxuIiwKKwkJCXByZXF1ZXN0LCBzZ2VvZmZzZXQpKTsKKwlEQkdfRFVNUF9GV19SRVFVRVNUX0ZSQU1FKHByZXF1ZXN0KQorCisJaWkgPSBtcHRfaGFuZHNoYWtlX3JlcV9yZXBseV93YWl0KGlvYywgc2dlb2Zmc2V0LCAodTMyKilwcmVxdWVzdCwKKwkJCQlyZXBseV9zeiwgKHUxNiopcHJlcGx5LCA2NSAvKnNlY29uZHMqLywgc2xlZXBGbGFnKTsKKworCWRpbml0cHJpbnRrKChLRVJOX1dBUk5JTkcgTVlOQU0gIkZXIFVwbG9hZCBjb21wbGV0ZWQgcmM9JXggXG4iLCBpaSkpOworCisJY21kU3RhdHVzID0gLUVGQVVMVDsKKwlpZiAoaWkgPT0gMCkgeworCQkvKiBIYW5kc2hha2UgdHJhbnNmZXIgd2FzIGNvbXBsZXRlIGFuZCBzdWNjZXNzZnVsLgorCQkgKiBDaGVjayB0aGUgUmVwbHkgRnJhbWUuCisJCSAqLworCQlpbnQgc3RhdHVzLCB0cmFuc2Zlcl9zejsKKwkJc3RhdHVzID0gbGUxNl90b19jcHUocHJlcGx5LT5JT0NTdGF0dXMpOworCQlpZiAoc3RhdHVzID09IE1QSV9JT0NTVEFUVVNfU1VDQ0VTUykgeworCQkJdHJhbnNmZXJfc3ogPSBsZTMyX3RvX2NwdShwcmVwbHktPkFjdHVhbEltYWdlU2l6ZSk7CisJCQlpZiAodHJhbnNmZXJfc3ogPT0gc3opCisJCQkJY21kU3RhdHVzID0gMDsKKwkJfQorCX0KKwlkaW5pdHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiOiBkb191cGxvYWQgc3RhdHVzICVkIFxuIiwKKwkJCWlvYy0+bmFtZSwgY21kU3RhdHVzKSk7CisKKwkKKwlpZiAoY21kU3RhdHVzKSB7CisKKwkJZGRscHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICI6IGZ3IHVwbG9hZCBmYWlsZWQsIGZyZWVpbmcgaW1hZ2UgXG4iLAorCQkJaW9jLT5uYW1lKSk7CisJCW1wdF9mcmVlX2Z3X21lbW9yeShpb2MpOworCX0KKworCXJldHVybiBjbWRTdGF0dXM7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKgltcHRfZG93bmxvYWRib290IC0gRG93bmxvYWRCb290IGNvZGUKKyAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCisgKglAZmxhZzogU3BlY2lmeSB3aGljaCBwYXJ0IG9mIElPQyBtZW1vcnkgaXMgdG8gYmUgdXBsb2FkZWQuCisgKglAc2xlZXBGbGFnOiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcHJvY2VzcyBjYW4gc2xlZXAKKyAqCisgKglGd0Rvd25sb2FkQm9vdCByZXF1aXJlcyBQcm9ncmFtbWVkIElPIGFjY2Vzcy4KKyAqCisgKglSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MKKyAqCQktMSBGVyBJbWFnZSBzaXplIGlzIDAKKyAqCQktMiBObyB2YWxpZCBjYWNoZWRfZncgUG9pbnRlcgorICoJCTwwIGZvciBmdyB1cGxvYWQgZmFpbHVyZS4KKyAqLworc3RhdGljIGludAorbXB0X2Rvd25sb2FkYm9vdChNUFRfQURBUFRFUiAqaW9jLCBpbnQgc2xlZXBGbGFnKQoreworCU1waUZ3SGVhZGVyX3QJCSpwRndIZWFkZXI7CisJTXBpRXh0SW1hZ2VIZWFkZXJfdAkqcEV4dEltYWdlOworCXUzMgkJCSBmd1NpemU7CisJdTMyCQkJIGRpYWcwdmFsOworCWludAkJCSBjb3VudDsKKwl1MzIJCQkqcHRyRnc7CisJdTMyCQkJIGRpYWdSd0RhdGE7CisJdTMyCQkJIG5leHRJbWFnZTsKKwl1MzIJCQkgbG9hZF9hZGRyOworCXUzMiAJCQkgaW9jX3N0YXRlPTA7CisKKwlkZGxwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgImRvd25sb2FkYm9vdDogZncgc2l6ZSAweCV4LCBpb2MgRlcgUHRyICVwXG4iLAorCQkJCWlvYy0+bmFtZSwgaW9jLT5mYWN0cy5GV0ltYWdlU2l6ZSwgaW9jLT5jYWNoZWRfZncpKTsKKworCWlmICggaW9jLT5mYWN0cy5GV0ltYWdlU2l6ZSA9PSAwICkKKwkJcmV0dXJuIC0xOworCisJaWYgKGlvYy0+Y2FjaGVkX2Z3ID09IE5VTEwpCisJCXJldHVybiAtMjsKKworCS8qIHByZXZlbnQgYSBzZWNvbmQgZG93bmxvYWRib290IGFuZCBtZW1vcnkgZnJlZSB3aXRoIGFsdF9pb2MgKi8KKwlpZiAoaW9jLT5hbHRfaW9jICYmIGlvYy0+YWx0X2lvYy0+Y2FjaGVkX2Z3KQorCQlpb2MtPmFsdF9pb2MtPmNhY2hlZF9mdyA9IE5VTEw7CisJCisJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPldyaXRlU2VxdWVuY2UsIDB4RkYpOworCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5Xcml0ZVNlcXVlbmNlLCBNUElfV1JTRVFfMVNUX0tFWV9WQUxVRSk7CisJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPldyaXRlU2VxdWVuY2UsIE1QSV9XUlNFUV8yTkRfS0VZX1ZBTFVFKTsKKwlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+V3JpdGVTZXF1ZW5jZSwgTVBJX1dSU0VRXzNSRF9LRVlfVkFMVUUpOworCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5Xcml0ZVNlcXVlbmNlLCBNUElfV1JTRVFfNFRIX0tFWV9WQUxVRSk7CisJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPldyaXRlU2VxdWVuY2UsIE1QSV9XUlNFUV81VEhfS0VZX1ZBTFVFKTsKKworCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5EaWFnbm9zdGljLCAoTVBJX0RJQUdfUFJFVkVOVF9JT0NfQk9PVCB8IE1QSV9ESUFHX0RJU0FCTEVfQVJNKSk7CisKKwkvKiB3YWl0IDEgbXNlYyAqLworCWlmIChzbGVlcEZsYWcgPT0gQ0FOX1NMRUVQKSB7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEpOworCX0gZWxzZSB7CisJCW1kZWxheSAoMSk7CisJfQorCisJZGlhZzB2YWwgPSBDSElQUkVHX1JFQUQzMigmaW9jLT5jaGlwLT5EaWFnbm9zdGljKTsKKwlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+RGlhZ25vc3RpYywgZGlhZzB2YWwgfCBNUElfRElBR19SRVNFVF9BREFQVEVSKTsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDMwOyBjb3VudCArKykgeworCQlkaWFnMHZhbCA9IENISVBSRUdfUkVBRDMyKCZpb2MtPmNoaXAtPkRpYWdub3N0aWMpOworCQlpZiAoIShkaWFnMHZhbCAmIE1QSV9ESUFHX1JFU0VUX0FEQVBURVIpKSB7CisJCQlkZGxwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlJFU0VUX0FEQVBURVIgY2xlYXJlZCwgY291bnQ9JWRcbiIsCisJCQkJaW9jLT5uYW1lLCBjb3VudCkpOworCQkJYnJlYWs7CisJCX0KKwkJLyogd2FpdCAxIHNlYyAqLworCQlpZiAoc2xlZXBGbGFnID09IENBTl9TTEVFUCkgeworCQkJbXNsZWVwX2ludGVycnVwdGlibGUgKDEwMDApOworCQl9IGVsc2UgeworCQkJbWRlbGF5ICgxMDAwKTsKKwkJfQorCX0KKworCWlmICggY291bnQgPT0gMzAgKSB7CisJCWRkbHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiZG93bmxvYWRib290IGZhaWxlZCEgVW5hYmxlIHRvIFJFU0VUX0FEQVBURVIgZGlhZzB2YWw9JXhcbiIsCisJCWlvYy0+bmFtZSwgZGlhZzB2YWwpKTsKKwkJcmV0dXJuIC0zOworCX0KKworCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5Xcml0ZVNlcXVlbmNlLCAweEZGKTsKKwlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+V3JpdGVTZXF1ZW5jZSwgTVBJX1dSU0VRXzFTVF9LRVlfVkFMVUUpOworCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5Xcml0ZVNlcXVlbmNlLCBNUElfV1JTRVFfMk5EX0tFWV9WQUxVRSk7CisJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPldyaXRlU2VxdWVuY2UsIE1QSV9XUlNFUV8zUkRfS0VZX1ZBTFVFKTsKKwlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+V3JpdGVTZXF1ZW5jZSwgTVBJX1dSU0VRXzRUSF9LRVlfVkFMVUUpOworCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5Xcml0ZVNlcXVlbmNlLCBNUElfV1JTRVFfNVRIX0tFWV9WQUxVRSk7CisKKwkvKiBTZXQgdGhlIERpYWdSd0VuIGFuZCBEaXNhYmxlIEFSTSBiaXRzICovCisJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPkRpYWdub3N0aWMsIChNUElfRElBR19SV19FTkFCTEUgfCBNUElfRElBR19ESVNBQkxFX0FSTSkpOworCisJcEZ3SGVhZGVyID0gKE1waUZ3SGVhZGVyX3QgKikgaW9jLT5jYWNoZWRfZnc7CisJZndTaXplID0gKHBGd0hlYWRlci0+SW1hZ2VTaXplICsgMykvNDsKKwlwdHJGdyA9ICh1MzIgKikgcEZ3SGVhZGVyOworCisJLyogV3JpdGUgdGhlIExvYWRTdGFydEFkZHJlc3MgdG8gdGhlIERpYWdSdyBBZGRyZXNzIFJlZ2lzdGVyCisJICogdXNpbmcgUHJvZ3JhbW1lZCBJTworCSAqLworCUNISVBSRUdfUElPX1dSSVRFMzIoJmlvYy0+cGlvX2NoaXAtPkRpYWdSd0FkZHJlc3MsIHBGd0hlYWRlci0+TG9hZFN0YXJ0QWRkcmVzcyk7CisJZGRscHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJMb2FkU3RhcnQgYWRkciB3cml0dGVuIDB4JXggXG4iLAorCQlpb2MtPm5hbWUsIHBGd0hlYWRlci0+TG9hZFN0YXJ0QWRkcmVzcykpOworCisJZGRscHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJXcml0ZSBGVyBJbWFnZTogMHgleCBieXRlcyBAICVwXG4iLAorCQkJCWlvYy0+bmFtZSwgZndTaXplKjQsIHB0ckZ3KSk7CisJd2hpbGUgKGZ3U2l6ZS0tKSB7CisJCUNISVBSRUdfUElPX1dSSVRFMzIoJmlvYy0+cGlvX2NoaXAtPkRpYWdSd0RhdGEsICpwdHJGdysrKTsKKwl9CisKKwluZXh0SW1hZ2UgPSBwRndIZWFkZXItPk5leHRJbWFnZUhlYWRlck9mZnNldDsKKwl3aGlsZSAobmV4dEltYWdlKSB7CisJCXBFeHRJbWFnZSA9IChNcGlFeHRJbWFnZUhlYWRlcl90ICopICgoY2hhciAqKXBGd0hlYWRlciArIG5leHRJbWFnZSk7CisKKwkJbG9hZF9hZGRyID0gcEV4dEltYWdlLT5Mb2FkU3RhcnRBZGRyZXNzOworCisJCWZ3U2l6ZSA9IChwRXh0SW1hZ2UtPkltYWdlU2l6ZSArIDMpID4+IDI7CisJCXB0ckZ3ID0gKHUzMiAqKXBFeHRJbWFnZTsKKworCQlkZGxwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIldyaXRlIEV4dCBJbWFnZTogMHgleCBieXRlcyBAICVwIGxvYWRfYWRkcj0leFxuIiwKKwkJCQkJCWlvYy0+bmFtZSwgZndTaXplKjQsIHB0ckZ3LCBsb2FkX2FkZHIpKTsKKwkJQ0hJUFJFR19QSU9fV1JJVEUzMigmaW9jLT5waW9fY2hpcC0+RGlhZ1J3QWRkcmVzcywgbG9hZF9hZGRyKTsKKworCQl3aGlsZSAoZndTaXplLS0pIHsKKwkJCUNISVBSRUdfUElPX1dSSVRFMzIoJmlvYy0+cGlvX2NoaXAtPkRpYWdSd0RhdGEsICpwdHJGdysrKTsKKwkJfQorCQluZXh0SW1hZ2UgPSBwRXh0SW1hZ2UtPk5leHRJbWFnZUhlYWRlck9mZnNldDsKKwl9CisKKwkvKiBXcml0ZSB0aGUgSW9wUmVzZXRWZWN0b3JSZWdBZGRyICovCisJZGRscHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJXcml0ZSBJb3BSZXNldFZlY3RvciBBZGRyPSV4ISBcbiIsIGlvYy0+bmFtZSwgCXBGd0hlYWRlci0+SW9wUmVzZXRSZWdBZGRyKSk7CisJQ0hJUFJFR19QSU9fV1JJVEUzMigmaW9jLT5waW9fY2hpcC0+RGlhZ1J3QWRkcmVzcywgcEZ3SGVhZGVyLT5Jb3BSZXNldFJlZ0FkZHIpOworCisJLyogV3JpdGUgdGhlIElvcFJlc2V0VmVjdG9yVmFsdWUgKi8KKwlkZGxwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIldyaXRlIElvcFJlc2V0VmVjdG9yIFZhbHVlPSV4ISBcbiIsIGlvYy0+bmFtZSwgcEZ3SGVhZGVyLT5Jb3BSZXNldFZlY3RvclZhbHVlKSk7CisJQ0hJUFJFR19QSU9fV1JJVEUzMigmaW9jLT5waW9fY2hpcC0+RGlhZ1J3RGF0YSwgcEZ3SGVhZGVyLT5Jb3BSZXNldFZlY3RvclZhbHVlKTsKKworCS8qIENsZWFyIHRoZSBpbnRlcm5hbCBmbGFzaCBiYWQgYml0IC0gYXV0b2luY3JlbWVudGluZyByZWdpc3RlciwKKwkgKiBzbyBtdXN0IGRvIHR3byB3cml0ZXMuCisJICovCisJQ0hJUFJFR19QSU9fV1JJVEUzMigmaW9jLT5waW9fY2hpcC0+RGlhZ1J3QWRkcmVzcywgMHgzRjAwMDAwMCk7CisJZGlhZ1J3RGF0YSA9IENISVBSRUdfUElPX1JFQUQzMigmaW9jLT5waW9fY2hpcC0+RGlhZ1J3RGF0YSk7CisJZGlhZ1J3RGF0YSB8PSAweDQwMDAwMDA7CisJQ0hJUFJFR19QSU9fV1JJVEUzMigmaW9jLT5waW9fY2hpcC0+RGlhZ1J3QWRkcmVzcywgMHgzRjAwMDAwMCk7CisJQ0hJUFJFR19QSU9fV1JJVEUzMigmaW9jLT5waW9fY2hpcC0+RGlhZ1J3RGF0YSwgZGlhZ1J3RGF0YSk7CisKKwlkaWFnMHZhbCA9IENISVBSRUdfUkVBRDMyKCZpb2MtPmNoaXAtPkRpYWdub3N0aWMpOworCWRkbHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiZG93bmxvYWRib290IGRpYWcwdmFsPSV4LCB0dXJuaW5nIG9mZiBQUkVWRU5UX0lPQ19CT09ULCBESVNBQkxFX0FSTVxuIiwKKwkJaW9jLT5uYW1lLCBkaWFnMHZhbCkpOworCWRpYWcwdmFsICY9IH4oTVBJX0RJQUdfUFJFVkVOVF9JT0NfQk9PVCB8IE1QSV9ESUFHX0RJU0FCTEVfQVJNKTsKKwlkZGxwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgImRvd25sb2FkYm9vdCBub3cgZGlhZzB2YWw9JXhcbiIsCisJCWlvYy0+bmFtZSwgZGlhZzB2YWwpKTsKKwlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+RGlhZ25vc3RpYywgZGlhZzB2YWwpOworCisJLyogV3JpdGUgMHhGRiB0byByZXNldCB0aGUgc2VxdWVuY2VyICovCisJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPldyaXRlU2VxdWVuY2UsIDB4RkYpOworCisJZm9yIChjb3VudD0wOyBjb3VudDxIWioyMDsgY291bnQrKykgeworCQlpZiAoKGlvY19zdGF0ZSA9IG1wdF9HZXRJb2NTdGF0ZShpb2MsIDApKSAmIE1QSV9JT0NfU1RBVEVfUkVBRFkpIHsKKwkJCWRkbHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiZG93bmxvYWRib290IHN1Y2Nlc3NmdWwhIChjb3VudD0lZCkgSW9jU3RhdGU9JXhcbiIsCisJCQkJCWlvYy0+bmFtZSwgY291bnQsIGlvY19zdGF0ZSkpOworCQkJaWYgKChTZW5kSW9jSW5pdChpb2MsIHNsZWVwRmxhZykpICE9IDApIHsKKwkJCQlkZGxwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgImRvd25sb2FkYm9vdDogU2VuZElvY0luaXQgZmFpbGVkXG4iLAorCQkJCQlpb2MtPm5hbWUpKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCWRkbHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiZG93bmxvYWRib290OiBTZW5kSW9jSW5pdCBzdWNjZXNzZnVsXG4iLAorCQkJCQlpb2MtPm5hbWUpKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChzbGVlcEZsYWcgPT0gQ0FOX1NMRUVQKSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZSAoMTApOworCQl9IGVsc2UgeworCQkJbWRlbGF5ICgxMCk7CisJCX0KKwl9CisJZGRscHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJkb3dubG9hZGJvb3QgZmFpbGVkISBJb2NTdGF0ZT0leFxuIiwKKwkJaW9jLT5uYW1lLCBpb2Nfc3RhdGUpKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCUtpY2tTdGFydCAtIFBlcmZvcm0gaGFyZCByZXNldCBvZiBNUFQgYWRhcHRlci4KKyAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCisgKglAZm9yY2U6IEZvcmNlIGhhcmQgcmVzZXQKKyAqCUBzbGVlcEZsYWc6IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBwcm9jZXNzIGNhbiBzbGVlcAorICoKKyAqCVRoaXMgcm91dGluZSBwbGFjZXMgTVBUIGFkYXB0ZXIgaW4gZGlhZ25vc3RpYyBtb2RlIHZpYSB0aGUKKyAqCVdyaXRlU2VxdWVuY2UgcmVnaXN0ZXIsIGFuZCB0aGVuIHBlcmZvcm1zIGEgaGFyZCByZXNldCBvZiBhZGFwdGVyCisgKgl2aWEgdGhlIERpYWdub3N0aWMgcmVnaXN0ZXIuCisgKgorICoJSW5wdXRzOiAgIHNsZWVwZmxhZyAtIENBTl9TTEVFUCAobm9uLWludGVycnVwdCB0aHJlYWQpCisgKgkJCW9yIE5PX1NMRUVQIChpbnRlcnJ1cHQgdGhyZWFkLCB1c2UgbWRlbGF5KQorICoJCSAgZm9yY2UgLSAxIGlmIGRvb3JiZWxsIGFjdGl2ZSwgYm9hcmQgZmF1bHQgc3RhdGUKKyAqCQkJCWJvYXJkIG9wZXJhdGlvbmFsLCBJT0NfUkVDT1ZFUlkgb3IKKyAqCQkJCUlPQ19CUklOR1VQIGFuZCB0aGVyZSBpcyBhbiBhbHRfaW9jLgorICoJCQkgIDAgZWxzZQorICoKKyAqCVJldHVybnM6CisgKgkJIDEgLSBoYXJkIHJlc2V0LCBSRUFEWQkKKyAqCQkgMCAtIG5vIHJlc2V0IGR1ZSB0byBIaXN0b3J5IGJpdCwgUkVBRFkJCisgKgkJLTEgLSBubyByZXNldCBkdWUgdG8gSGlzdG9yeSBiaXQgYnV0IG5vdCBSRUFEWQkKKyAqCQkgICAgIE9SIHJlc2V0IGJ1dCBmYWlsZWQgdG8gY29tZSBSRUFEWQorICoJCS0yIC0gbm8gcmVzZXQsIGNvdWxkIG5vdCBlbnRlciBESUFHIG1vZGUKKyAqCQktMyAtIHJlc2V0IGJ1dCBiYWQgRlcgYml0CisgKi8KK3N0YXRpYyBpbnQKK0tpY2tTdGFydChNUFRfQURBUFRFUiAqaW9jLCBpbnQgZm9yY2UsIGludCBzbGVlcEZsYWcpCit7CisJaW50IGhhcmRfcmVzZXRfZG9uZSA9IDA7CisJdTMyIGlvY19zdGF0ZT0wOworCWludCBjbnQsY250ZG47CisKKwlkaW5pdHByaW50aygoS0VSTl9XQVJOSU5HIE1ZTkFNICI6IEtpY2tTdGFydGluZyAlcyFcbiIsIGlvYy0+bmFtZSkpOworCWlmIChpb2MtPmJ1c190eXBlID09IFNDU0kpIHsKKwkJLyogQWx3YXlzIGlzc3VlIGEgTXNnIFVuaXQgUmVzZXQgZmlyc3QuIFRoaXMgd2lsbCBjbGVhciBzb21lCisJCSAqIFNDU0kgYnVzIGhhbmcgY29uZGl0aW9ucy4KKwkJICovCisJCVNlbmRJb2NSZXNldChpb2MsIE1QSV9GVU5DVElPTl9JT0NfTUVTU0FHRV9VTklUX1JFU0VULCBzbGVlcEZsYWcpOworCisJCWlmIChzbGVlcEZsYWcgPT0gQ0FOX1NMRUVQKSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZSAoMTAwMCk7CisJCX0gZWxzZSB7CisJCQltZGVsYXkgKDEwMDApOworCQl9CisJfQorCisJaGFyZF9yZXNldF9kb25lID0gbXB0X2RpYWdfcmVzZXQoaW9jLCBmb3JjZSwgc2xlZXBGbGFnKTsKKwlpZiAoaGFyZF9yZXNldF9kb25lIDwgMCkKKwkJcmV0dXJuIGhhcmRfcmVzZXRfZG9uZTsKKworCWRpbml0cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJEaWFnbm9zdGljIHJlc2V0IHN1Y2Nlc3NmdWwhXG4iLAorCQkJaW9jLT5uYW1lKSk7CisKKwljbnRkbiA9ICgoc2xlZXBGbGFnID09IENBTl9TTEVFUCkgPyBIWiA6IDEwMDApICogMjsJLyogMiBzZWNvbmRzICovCisJZm9yIChjbnQ9MDsgY250PGNudGRuOyBjbnQrKykgeworCQlpb2Nfc3RhdGUgPSBtcHRfR2V0SW9jU3RhdGUoaW9jLCAxKTsKKwkJaWYgKChpb2Nfc3RhdGUgPT0gTVBJX0lPQ19TVEFURV9SRUFEWSkgfHwgKGlvY19zdGF0ZSA9PSBNUElfSU9DX1NUQVRFX09QRVJBVElPTkFMKSkgeworCQkJZGluaXRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIktpY2tTdGFydCBzdWNjZXNzZnVsISAoY250PSVkKVxuIiwKKyAJCQkJCWlvYy0+bmFtZSwgY250KSk7CisJCQlyZXR1cm4gaGFyZF9yZXNldF9kb25lOworCQl9CisJCWlmIChzbGVlcEZsYWcgPT0gQ0FOX1NMRUVQKSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZSAoMTApOworCQl9IGVsc2UgeworCQkJbWRlbGF5ICgxMCk7CisJCX0KKwl9CisKKwlwcmludGsoTVlJT0Nfc19FUlJfRk1UICJGYWlsZWQgdG8gY29tZSBSRUFEWSBhZnRlciByZXNldCEgSW9jU3RhdGU9JXhcbiIsCisJCQlpb2MtPm5hbWUsIGlvY19zdGF0ZSk7CisJcmV0dXJuIC0xOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJbXB0X2RpYWdfcmVzZXQgLSBQZXJmb3JtIGhhcmQgcmVzZXQgb2YgdGhlIGFkYXB0ZXIuCisgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQorICoJQGlnbm9yZTogU2V0IGlmIHRvIGhvbm9yIGFuZCBjbGVhciB0byBpZ25vcmUKKyAqCQl0aGUgcmVzZXQgaGlzdG9yeSBiaXQKKyAqCUBzbGVlcGZsYWc6IENBTl9TTEVFUCBpZiBjYWxsZWQgaW4gYSBub24taW50ZXJydXB0IHRocmVhZCwKKyAqCQllbHNlIHNldCB0byBOT19TTEVFUCAodXNlIG1kZWxheSBpbnN0ZWFkKQorICoKKyAqCVRoaXMgcm91dGluZSBwbGFjZXMgdGhlIGFkYXB0ZXIgaW4gZGlhZ25vc3RpYyBtb2RlIHZpYSB0aGUKKyAqCVdyaXRlU2VxdWVuY2UgcmVnaXN0ZXIgYW5kIHRoZW4gcGVyZm9ybXMgYSBoYXJkIHJlc2V0IG9mIGFkYXB0ZXIKKyAqCXZpYSB0aGUgRGlhZ25vc3RpYyByZWdpc3Rlci4gQWRhcHRlciBzaG91bGQgYmUgaW4gcmVhZHkgc3RhdGUKKyAqCXVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLgorICoKKyAqCVJldHVybnM6ICAxICBoYXJkIHJlc2V0IHN1Y2Nlc3NmdWwKKyAqCQkgIDAgIG5vIHJlc2V0IHBlcmZvcm1lZCBiZWNhdXNlIHJlc2V0IGhpc3RvcnkgYml0IHNldAorICoJCSAtMiAgZW5hYmxpbmcgZGlhZ25vc3RpYyBtb2RlIGZhaWxlZAorICoJCSAtMyAgZGlhZ25vc3RpYyByZXNldCBmYWlsZWQKKyAqLworc3RhdGljIGludAorbXB0X2RpYWdfcmVzZXQoTVBUX0FEQVBURVIgKmlvYywgaW50IGlnbm9yZSwgaW50IHNsZWVwRmxhZykKK3sKKwl1MzIgZGlhZzB2YWw7CisJdTMyIGRvb3JiZWxsOworCWludCBoYXJkX3Jlc2V0X2RvbmUgPSAwOworCWludCBjb3VudCA9IDA7CisjaWZkZWYgTVBUX0RFQlVHCisJdTMyIGRpYWcxdmFsID0gMDsKKyNlbmRpZgorCisJLyogQ2xlYXIgYW55IGV4aXN0aW5nIGludGVycnVwdHMgKi8KKwlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+SW50U3RhdHVzLCAwKTsKKworCS8qIFVzZSAiRGlhZ25vc3RpYyByZXNldCIgbWV0aG9kISAob25seSB0aGluZyBhdmFpbGFibGUhKSAqLworCWRpYWcwdmFsID0gQ0hJUFJFR19SRUFEMzIoJmlvYy0+Y2hpcC0+RGlhZ25vc3RpYyk7CisKKyNpZmRlZiBNUFRfREVCVUcKKwlpZiAoaW9jLT5hbHRfaW9jKQorCQlkaWFnMXZhbCA9IENISVBSRUdfUkVBRDMyKCZpb2MtPmFsdF9pb2MtPmNoaXAtPkRpYWdub3N0aWMpOworCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkRiRzE6IGRpYWcwPSUwOHgsIGRpYWcxPSUwOHhcbiIsCisJCQlpb2MtPm5hbWUsIGRpYWcwdmFsLCBkaWFnMXZhbCkpOworI2VuZGlmCisKKwkvKiBEbyB0aGUgcmVzZXQgaWYgd2UgYXJlIHRvbGQgdG8gaWdub3JlIHRoZSByZXNldCBoaXN0b3J5CisJICogb3IgaWYgdGhlIHJlc2V0IGhpc3RvcnkgaXMgMAorCSAqLworCWlmIChpZ25vcmUgfHwgIShkaWFnMHZhbCAmIE1QSV9ESUFHX1JFU0VUX0hJU1RPUlkpKSB7CisJCXdoaWxlICgoZGlhZzB2YWwgJiBNUElfRElBR19EUldFKSA9PSAwKSB7CisJCQkvKiBXcml0ZSBtYWdpYyBzZXF1ZW5jZSB0byBXcml0ZVNlcXVlbmNlIHJlZ2lzdGVyCisJCQkgKiBMb29wIHVudGlsIGluIGRpYWdub3N0aWMgbW9kZQorCQkJICovCisJCQlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+V3JpdGVTZXF1ZW5jZSwgMHhGRik7CisJCQlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+V3JpdGVTZXF1ZW5jZSwgTVBJX1dSU0VRXzFTVF9LRVlfVkFMVUUpOworCQkJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPldyaXRlU2VxdWVuY2UsIE1QSV9XUlNFUV8yTkRfS0VZX1ZBTFVFKTsKKwkJCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5Xcml0ZVNlcXVlbmNlLCBNUElfV1JTRVFfM1JEX0tFWV9WQUxVRSk7CisJCQlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+V3JpdGVTZXF1ZW5jZSwgTVBJX1dSU0VRXzRUSF9LRVlfVkFMVUUpOworCQkJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPldyaXRlU2VxdWVuY2UsIE1QSV9XUlNFUV81VEhfS0VZX1ZBTFVFKTsKKworCQkJLyogd2FpdCAxMDAgbXNlYyAqLworCQkJaWYgKHNsZWVwRmxhZyA9PSBDQU5fU0xFRVApIHsKKwkJCQltc2xlZXBfaW50ZXJydXB0aWJsZSAoMTAwKTsKKwkJCX0gZWxzZSB7CisJCQkJbWRlbGF5ICgxMDApOworCQkJfQorCisJCQljb3VudCsrOworCQkJaWYgKGNvdW50ID4gMjApIHsKKwkJCQlwcmludGsoTVlJT0Nfc19FUlJfRk1UICJFbmFibGUgRGlhZ25vc3RpYyBtb2RlIEZBSUxFRCEgKCUwMnhoKVxuIiwKKwkJCQkJCWlvYy0+bmFtZSwgZGlhZzB2YWwpOworCQkJCXJldHVybiAtMjsKKworCQkJfQorCisJCQlkaWFnMHZhbCA9IENISVBSRUdfUkVBRDMyKCZpb2MtPmNoaXAtPkRpYWdub3N0aWMpOworCisJCQlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJXcm90ZSBtYWdpYyBEaWFnV3JpdGVFbiBzZXF1ZW5jZSAoJXgpXG4iLAorCQkJCQlpb2MtPm5hbWUsIGRpYWcwdmFsKSk7CisJCX0KKworI2lmZGVmIE1QVF9ERUJVRworCQlpZiAoaW9jLT5hbHRfaW9jKQorCQkJZGlhZzF2YWwgPSBDSElQUkVHX1JFQUQzMigmaW9jLT5hbHRfaW9jLT5jaGlwLT5EaWFnbm9zdGljKTsKKwkJZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiRGJHMjogZGlhZzA9JTA4eCwgZGlhZzE9JTA4eFxuIiwKKwkJCQlpb2MtPm5hbWUsIGRpYWcwdmFsLCBkaWFnMXZhbCkpOworI2VuZGlmCisJCS8qCisJCSAqIERpc2FibGUgdGhlIEFSTSAoQnVnIGZpeCkKKwkJICoKKwkJICovCisJCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5EaWFnbm9zdGljLCBkaWFnMHZhbCB8IE1QSV9ESUFHX0RJU0FCTEVfQVJNKTsKKwkJbWRlbGF5ICgxKTsKKworCQkvKgorCQkgKiBOb3cgaGl0IHRoZSByZXNldCBiaXQgaW4gdGhlIERpYWdub3N0aWMgcmVnaXN0ZXIKKwkJICogKFRIRSBCSUcgSEFNTUVSISkgKENsZWFycyBEUldFIGJpdCkuCisJCSAqLworCQlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+RGlhZ25vc3RpYywgZGlhZzB2YWwgfCBNUElfRElBR19SRVNFVF9BREFQVEVSKTsKKwkJaGFyZF9yZXNldF9kb25lID0gMTsKKwkJZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiRGlhZ25vc3RpYyByZXNldCBwZXJmb3JtZWRcbiIsCisJCQkJaW9jLT5uYW1lKSk7CisKKwkJLyoKKwkJICogQ2FsbCBlYWNoIGN1cnJlbnRseSByZWdpc3RlcmVkIHByb3RvY29sIElPQyByZXNldCBoYW5kbGVyCisJCSAqIHdpdGggcHJlLXJlc2V0IGluZGljYXRpb24uCisJCSAqIE5PVEU6IElmIHdlJ3JlIGRvaW5nIF9JT0NfQlJJTkdVUCwgdGhlcmUgY2FuIGJlIG5vCisJCSAqIE1wdFJlc2V0SGFuZGxlcnNbXSByZWdpc3RlcmVkIHlldC4KKwkJICovCisJCXsKKwkJCWludAkgaWk7CisJCQlpbnQJIHIgPSAwOworCisJCQlmb3IgKGlpPU1QVF9NQVhfUFJPVE9DT0xfRFJJVkVSUy0xOyBpaTsgaWktLSkgeworCQkJCWlmIChNcHRSZXNldEhhbmRsZXJzW2lpXSkgeworCQkJCQlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJDYWxsaW5nIElPQyBwcmVfcmVzZXQgaGFuZGxlciAjJWRcbiIsCisJCQkJCQkJaW9jLT5uYW1lLCBpaSkpOworCQkJCQlyICs9ICgqKE1wdFJlc2V0SGFuZGxlcnNbaWldKSkoaW9jLCBNUFRfSU9DX1BSRV9SRVNFVCk7CisJCQkJCWlmIChpb2MtPmFsdF9pb2MpIHsKKwkJCQkJCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkNhbGxpbmcgYWx0LSVzIHByZV9yZXNldCBoYW5kbGVyICMlZFxuIiwKKwkJCQkJCQkJaW9jLT5uYW1lLCBpb2MtPmFsdF9pb2MtPm5hbWUsIGlpKSk7CisJCQkJCQlyICs9ICgqKE1wdFJlc2V0SGFuZGxlcnNbaWldKSkoaW9jLT5hbHRfaW9jLCBNUFRfSU9DX1BSRV9SRVNFVCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkvKiBGSVhNRT8gIEV4YW1pbmUgcmVzdWx0cyBoZXJlPyAqLworCQl9CisKKwkJaWYgKGlvYy0+Y2FjaGVkX2Z3KSB7CisJCQkvKiBJZiB0aGUgRG93bmxvYWRCb290IG9wZXJhdGlvbiBmYWlscywgdGhlCisJCQkgKiBJT0Mgd2lsbCBiZSBsZWZ0IHVudXNhYmxlLiBUaGlzIGlzIGEgZmF0YWwgZXJyb3IKKwkJCSAqIGNhc2UuICBfZGlhZ19yZXNldCB3aWxsIHJldHVybiA8IDAKKwkJCSAqLworCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzA7IGNvdW50ICsrKSB7CisJCQkJZGlhZzB2YWwgPSBDSElQUkVHX1JFQUQzMigmaW9jLT5jaGlwLT5EaWFnbm9zdGljKTsKKwkJCQlpZiAoIShkaWFnMHZhbCAmIE1QSV9ESUFHX1JFU0VUX0FEQVBURVIpKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIHdhaXQgMSBzZWMgKi8KKwkJCQlpZiAoc2xlZXBGbGFnID09IENBTl9TTEVFUCkgeworCQkJCQlzc2xlZXAoMSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbWRlbGF5ICgxMDAwKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoKGNvdW50ID0gbXB0X2Rvd25sb2FkYm9vdChpb2MsIHNsZWVwRmxhZykpIDwgMCkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgTVlOQU0KKwkJCQkJIjogZmlybXdhcmUgZG93bmxvYWRib290IGZhaWx1cmUgKCVkKSFcbiIsIGNvdW50KTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJLyogV2FpdCBmb3IgRlcgdG8gcmVsb2FkIGFuZCBmb3IgYm9hcmQKKwkJCSAqIHRvIGdvIHRvIHRoZSBSRUFEWSBzdGF0ZS4KKwkJCSAqIE1heGltdW0gd2FpdCBpcyA2MCBzZWNvbmRzLgorCQkJICogSWYgZmFpbCwgbm8gZXJyb3Igd2lsbCBjaGVjayBhZ2FpbgorCQkJICogd2l0aCBjYWxsaW5nIHByb2dyYW0uCisJCQkgKi8KKwkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDYwOyBjb3VudCArKykgeworCQkJCWRvb3JiZWxsID0gQ0hJUFJFR19SRUFEMzIoJmlvYy0+Y2hpcC0+RG9vcmJlbGwpOworCQkJCWRvb3JiZWxsICY9IE1QSV9JT0NfU1RBVEVfTUFTSzsKKworCQkJCWlmIChkb29yYmVsbCA9PSBNUElfSU9DX1NUQVRFX1JFQURZKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIHdhaXQgMSBzZWMgKi8KKwkJCQlpZiAoc2xlZXBGbGFnID09IENBTl9TTEVFUCkgeworCQkJCQltc2xlZXBfaW50ZXJydXB0aWJsZSAoMTAwMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbWRlbGF5ICgxMDAwKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlkaWFnMHZhbCA9IENISVBSRUdfUkVBRDMyKCZpb2MtPmNoaXAtPkRpYWdub3N0aWMpOworI2lmZGVmIE1QVF9ERUJVRworCWlmIChpb2MtPmFsdF9pb2MpCisJCWRpYWcxdmFsID0gQ0hJUFJFR19SRUFEMzIoJmlvYy0+YWx0X2lvYy0+Y2hpcC0+RGlhZ25vc3RpYyk7CisJZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiRGJHMzogZGlhZzA9JTA4eCwgZGlhZzE9JTA4eFxuIiwKKwkJaW9jLT5uYW1lLCBkaWFnMHZhbCwgZGlhZzF2YWwpKTsKKyNlbmRpZgorCisJLyogQ2xlYXIgUkVTRVRfSElTVE9SWSBiaXQhICBQbGFjZSBib2FyZCBpbiB0aGUKKwkgKiBkaWFnbm9zdGljIG1vZGUgdG8gdXBkYXRlIHRoZSBkaWFnIHJlZ2lzdGVyLgorCSAqLworCWRpYWcwdmFsID0gQ0hJUFJFR19SRUFEMzIoJmlvYy0+Y2hpcC0+RGlhZ25vc3RpYyk7CisJY291bnQgPSAwOworCXdoaWxlICgoZGlhZzB2YWwgJiBNUElfRElBR19EUldFKSA9PSAwKSB7CisJCS8qIFdyaXRlIG1hZ2ljIHNlcXVlbmNlIHRvIFdyaXRlU2VxdWVuY2UgcmVnaXN0ZXIKKwkJICogTG9vcCB1bnRpbCBpbiBkaWFnbm9zdGljIG1vZGUKKwkJICovCisJCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5Xcml0ZVNlcXVlbmNlLCAweEZGKTsKKwkJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPldyaXRlU2VxdWVuY2UsIE1QSV9XUlNFUV8xU1RfS0VZX1ZBTFVFKTsKKwkJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPldyaXRlU2VxdWVuY2UsIE1QSV9XUlNFUV8yTkRfS0VZX1ZBTFVFKTsKKwkJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPldyaXRlU2VxdWVuY2UsIE1QSV9XUlNFUV8zUkRfS0VZX1ZBTFVFKTsKKwkJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPldyaXRlU2VxdWVuY2UsIE1QSV9XUlNFUV80VEhfS0VZX1ZBTFVFKTsKKwkJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPldyaXRlU2VxdWVuY2UsIE1QSV9XUlNFUV81VEhfS0VZX1ZBTFVFKTsKKworCQkvKiB3YWl0IDEwMCBtc2VjICovCisJCWlmIChzbGVlcEZsYWcgPT0gQ0FOX1NMRUVQKSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZSAoMTAwKTsKKwkJfSBlbHNlIHsKKwkJCW1kZWxheSAoMTAwKTsKKwkJfQorCisJCWNvdW50Kys7CisJCWlmIChjb3VudCA+IDIwKSB7CisJCQlwcmludGsoTVlJT0Nfc19FUlJfRk1UICJFbmFibGUgRGlhZ25vc3RpYyBtb2RlIEZBSUxFRCEgKCUwMnhoKVxuIiwKKwkJCQkJaW9jLT5uYW1lLCBkaWFnMHZhbCk7CisJCQlicmVhazsKKwkJfQorCQlkaWFnMHZhbCA9IENISVBSRUdfUkVBRDMyKCZpb2MtPmNoaXAtPkRpYWdub3N0aWMpOworCX0KKwlkaWFnMHZhbCAmPSB+TVBJX0RJQUdfUkVTRVRfSElTVE9SWTsKKwlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+RGlhZ25vc3RpYywgZGlhZzB2YWwpOworCWRpYWcwdmFsID0gQ0hJUFJFR19SRUFEMzIoJmlvYy0+Y2hpcC0+RGlhZ25vc3RpYyk7CisJaWYgKGRpYWcwdmFsICYgTVBJX0RJQUdfUkVTRVRfSElTVE9SWSkgeworCQlwcmludGsoTVlJT0Nfc19XQVJOX0ZNVCAiUmVzZXRIaXN0b3J5IGJpdCBmYWlsZWQgdG8gY2xlYXIhXG4iLAorCQkJCWlvYy0+bmFtZSk7CisJfQorCisJLyogRGlzYWJsZSBEaWFnbm9zdGljIE1vZGUKKwkgKi8KKwlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+V3JpdGVTZXF1ZW5jZSwgMHhGRkZGRkZGRik7CisKKwkvKiBDaGVjayBGVyByZWxvYWQgc3RhdHVzIGZsYWdzLgorCSAqLworCWRpYWcwdmFsID0gQ0hJUFJFR19SRUFEMzIoJmlvYy0+Y2hpcC0+RGlhZ25vc3RpYyk7CisJaWYgKGRpYWcwdmFsICYgKE1QSV9ESUFHX0ZMQVNIX0JBRF9TSUcgfCBNUElfRElBR19SRVNFVF9BREFQVEVSIHwgTVBJX0RJQUdfRElTQUJMRV9BUk0pKSB7CisJCXByaW50ayhNWUlPQ19zX0VSUl9GTVQgIkRpYWdub3N0aWMgcmVzZXQgRkFJTEVEISAoJTAyeGgpXG4iLAorCQkJCWlvYy0+bmFtZSwgZGlhZzB2YWwpOworCQlyZXR1cm4gLTM7CisJfQorCisjaWZkZWYgTVBUX0RFQlVHCisJaWYgKGlvYy0+YWx0X2lvYykKKwkJZGlhZzF2YWwgPSBDSElQUkVHX1JFQUQzMigmaW9jLT5hbHRfaW9jLT5jaGlwLT5EaWFnbm9zdGljKTsKKwlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJEYkc0OiBkaWFnMD0lMDh4LCBkaWFnMT0lMDh4XG4iLAorCQkJaW9jLT5uYW1lLCBkaWFnMHZhbCwgZGlhZzF2YWwpKTsKKyNlbmRpZgorCisJLyoKKwkgKiBSZXNldCBmbGFnIHRoYXQgc2F5cyB3ZSd2ZSBlbmFibGVkIGV2ZW50IG5vdGlmaWNhdGlvbgorCSAqLworCWlvYy0+ZmFjdHMuRXZlbnRTdGF0ZSA9IDA7CisKKwlpZiAoaW9jLT5hbHRfaW9jKQorCQlpb2MtPmFsdF9pb2MtPmZhY3RzLkV2ZW50U3RhdGUgPSAwOworCisJcmV0dXJuIGhhcmRfcmVzZXRfZG9uZTsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCVNlbmRJb2NSZXNldCAtIFNlbmQgSU9DUmVzZXQgcmVxdWVzdCB0byBNUFQgYWRhcHRlci4KKyAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCisgKglAcmVzZXRfdHlwZTogcmVzZXQgdHlwZSwgZXhwZWN0ZWQgdmFsdWVzIGFyZQorICoJJU1QSV9GVU5DVElPTl9JT0NfTUVTU0FHRV9VTklUX1JFU0VUIG9yICVNUElfRlVOQ1RJT05fSU9fVU5JVF9SRVNFVAorICoKKyAqCVNlbmQgSU9DUmVzZXQgcmVxdWVzdCB0byB0aGUgTVBUIGFkYXB0ZXIuCisgKgorICoJUmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZS4KKyAqLworc3RhdGljIGludAorU2VuZElvY1Jlc2V0KE1QVF9BREFQVEVSICppb2MsIHU4IHJlc2V0X3R5cGUsIGludCBzbGVlcEZsYWcpCit7CisJaW50IHI7CisJdTMyIHN0YXRlOworCWludCBjbnRkbiwgY291bnQ7CisKKwlkcnNwcmludGsoKEtFUk5fV0FSTklORyBNWU5BTSAiOiAlczogU2VuZGluZyBJT0MgcmVzZXQoMHglMDJ4KSFcbiIsCisJCQlpb2MtPm5hbWUsIHJlc2V0X3R5cGUpKTsKKwlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+RG9vcmJlbGwsIHJlc2V0X3R5cGU8PE1QSV9ET09SQkVMTF9GVU5DVElPTl9TSElGVCk7CisJaWYgKChyID0gV2FpdEZvckRvb3JiZWxsQWNrKGlvYywgNSwgc2xlZXBGbGFnKSkgPCAwKQorCQlyZXR1cm4gcjsKKworCS8qIEZXIEFDSydkIHJlcXVlc3QsIHdhaXQgZm9yIFJFQURZIHN0YXRlCisJICovCisJY291bnQgPSAwOworCWNudGRuID0gKChzbGVlcEZsYWcgPT0gQ0FOX1NMRUVQKSA/IEhaIDogMTAwMCkgKiAxNTsJLyogMTUgc2Vjb25kcyAqLworCisJd2hpbGUgKChzdGF0ZSA9IG1wdF9HZXRJb2NTdGF0ZShpb2MsIDEpKSAhPSBNUElfSU9DX1NUQVRFX1JFQURZKSB7CisJCWNudGRuLS07CisJCWNvdW50Kys7CisJCWlmICghY250ZG4pIHsKKwkJCWlmIChzbGVlcEZsYWcgIT0gQ0FOX1NMRUVQKQorCQkJCWNvdW50ICo9IDEwOworCisJCQlwcmludGsoS0VSTl9FUlIgTVlOQU0gIjogJXM6IEVSUk9SIC0gV2FpdCBJT0NfUkVBRFkgc3RhdGUgdGltZW91dCglZCkhXG4iLAorCQkJCQlpb2MtPm5hbWUsIChpbnQpKChjb3VudCs1KS9IWikpOworCQkJcmV0dXJuIC1FVElNRTsKKwkJfQorCisJCWlmIChzbGVlcEZsYWcgPT0gQ0FOX1NMRUVQKSB7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxKTsKKwkJfSBlbHNlIHsKKwkJCW1kZWxheSAoMSk7CS8qIDEgbXNlYyBkZWxheSAqLworCQl9CisJfQorCisJLyogVE9ETyEKKwkgKiAgQ2xlYW51cCBhbGwgZXZlbnQgc3R1ZmYgZm9yIHRoaXMgSU9DOyByZS1pc3N1ZSBFdmVudE5vdGlmaWNhdGlvbgorCSAqICByZXF1ZXN0IGlmIG5lZWRlZC4KKwkgKi8KKwlpZiAoaW9jLT5mYWN0cy5GdW5jdGlvbikKKwkJaW9jLT5mYWN0cy5FdmVudFN0YXRlID0gMDsKKworCXJldHVybiAwOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJaW5pdENoYWluQnVmZmVycyAtIEFsbG9jYXRlIG1lbW9yeSBmb3IgYW5kIGluaXRpYWxpemUKKyAqCWNoYWluIGJ1ZmZlcnMsIGNoYWluIGJ1ZmZlciBjb250cm9sIGFycmF5cyBhbmQgc3BpbmxvY2suCisgKglAaGQ6IFBvaW50ZXIgdG8gTVBUX1NDU0lfSE9TVCBzdHJ1Y3R1cmUKKyAqCUBpbml0OiBJZiBzZXQsIGluaXRpYWxpemUgdGhlIHNwaW4gbG9jay4KKyAqLworc3RhdGljIGludAoraW5pdENoYWluQnVmZmVycyhNUFRfQURBUFRFUiAqaW9jKQoreworCXU4CQkqbWVtOworCWludAkJc3osIGlpLCBudW1fY2hhaW47CisJaW50IAkJc2NhbGUsIG51bV9zZ2UsIG51bVNHRTsKKworCS8qIFJlcVRvQ2hhaW4gc2l6ZSBtdXN0IGVxdWFsIHRoZSByZXFfZGVwdGgKKwkgKiBpbmRleCA9IHJlcV9pZHgKKwkgKi8KKwlpZiAoaW9jLT5SZXFUb0NoYWluID09IE5VTEwpIHsKKwkJc3ogPSBpb2MtPnJlcV9kZXB0aCAqIHNpemVvZihpbnQpOworCQltZW0gPSBrbWFsbG9jKHN6LCBHRlBfQVRPTUlDKTsKKwkJaWYgKG1lbSA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCisJCWlvYy0+UmVxVG9DaGFpbiA9IChpbnQgKikgbWVtOworCQlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzIFJlcVRvQ2hhaW4gYWxsb2MgIEAgJXAsIHN6PSVkIGJ5dGVzXG4iLAorCQkJIAlpb2MtPm5hbWUsIG1lbSwgc3opKTsKKwkJbWVtID0ga21hbGxvYyhzeiwgR0ZQX0FUT01JQyk7CisJCWlmIChtZW0gPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKworCQlpb2MtPlJlcXVlc3ROQiA9IChpbnQgKikgbWVtOworCQlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzIFJlcXVlc3ROQiBhbGxvYyAgQCAlcCwgc3o9JWQgYnl0ZXNcbiIsCisJCQkgCWlvYy0+bmFtZSwgbWVtLCBzeikpOworCX0KKwlmb3IgKGlpID0gMDsgaWkgPCBpb2MtPnJlcV9kZXB0aDsgaWkrKykgeworCQlpb2MtPlJlcVRvQ2hhaW5baWldID0gTVBUX0hPU1RfTk9fQ0hBSU47CisJfQorCisJLyogQ2hhaW5Ub0NoYWluIHNpemUgbXVzdCBlcXVhbCB0aGUgdG90YWwgbnVtYmVyCisJICogb2YgY2hhaW4gYnVmZmVycyB0byBiZSBhbGxvY2F0ZWQuCisJICogaW5kZXggPSBjaGFpbl9pZHgKKwkgKgorCSAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGNoYWluIGJ1ZmZlcnMgbmVlZGVkKHBsdXMgMSkgcGVyIEkvTworCSAqIHRoZW4gbXVsdGlwbHkgdGhlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXMgY21kcworCSAqCisJICogbnVtX3NnZSA9IG51bSBzZ2UgaW4gcmVxdWVzdCBmcmFtZSArIGxhc3QgY2hhaW4gYnVmZmVyCisJICogc2NhbGUgPSBudW0gc2dlIHBlciBjaGFpbiBidWZmZXIgaWYgbm8gY2hhaW4gZWxlbWVudAorCSAqLworCXNjYWxlID0gaW9jLT5yZXFfc3ovKHNpemVvZihkbWFfYWRkcl90KSArIHNpemVvZih1MzIpKTsKKwlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID09IHNpemVvZih1NjQpKQorCQludW1fc2dlID0gIHNjYWxlICsgKGlvYy0+cmVxX3N6IC0gNjApIC8gKHNpemVvZihkbWFfYWRkcl90KSArIHNpemVvZih1MzIpKTsKKwllbHNlCisJCW51bV9zZ2UgPSAgMSsgc2NhbGUgKyAoaW9jLT5yZXFfc3ogLSA2NCkgLyAoc2l6ZW9mKGRtYV9hZGRyX3QpICsgc2l6ZW9mKHUzMikpOworCisJaWYgKHNpemVvZihkbWFfYWRkcl90KSA9PSBzaXplb2YodTY0KSkgeworCQludW1TR0UgPSAoc2NhbGUgLSAxKSAqIChpb2MtPmZhY3RzLk1heENoYWluRGVwdGgtMSkgKyBzY2FsZSArCisJCQkoaW9jLT5yZXFfc3ogLSA2MCkgLyAoc2l6ZW9mKGRtYV9hZGRyX3QpICsgc2l6ZW9mKHUzMikpOworCX0gZWxzZSB7CisJCW51bVNHRSA9IDEgKyAoc2NhbGUgLSAxKSAqIChpb2MtPmZhY3RzLk1heENoYWluRGVwdGgtMSkgKyBzY2FsZSArCisJCQkoaW9jLT5yZXFfc3ogLSA2NCkgLyAoc2l6ZW9mKGRtYV9hZGRyX3QpICsgc2l6ZW9mKHUzMikpOworCX0KKwlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzIG51bV9zZ2U9JWQgbnVtU0dFPSVkXG4iLAorCQlpb2MtPm5hbWUsIG51bV9zZ2UsIG51bVNHRSkpOworCisJaWYgKCBudW1TR0UgPiBNUFRfU0NTSV9TR19ERVBUSAkpCisJCW51bVNHRSA9IE1QVF9TQ1NJX1NHX0RFUFRIOworCisJbnVtX2NoYWluID0gMTsKKwl3aGlsZSAobnVtU0dFIC0gbnVtX3NnZSA+IDApIHsKKwkJbnVtX2NoYWluKys7CisJCW51bV9zZ2UgKz0gKHNjYWxlIC0gMSk7CisJfQorCW51bV9jaGFpbisrOworCisJZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlcyBOb3cgbnVtU0dFPSVkIG51bV9zZ2U9JWQgbnVtX2NoYWluPSVkXG4iLAorCQlpb2MtPm5hbWUsIG51bVNHRSwgbnVtX3NnZSwgbnVtX2NoYWluKSk7CisKKwlpZiAoaW9jLT5idXNfdHlwZSA9PSBTQ1NJKQorCQludW1fY2hhaW4gKj0gTVBUX1NDU0lfQ0FOX1FVRVVFOworCWVsc2UKKwkJbnVtX2NoYWluICo9IE1QVF9GQ19DQU5fUVVFVUU7CisKKwlpb2MtPm51bV9jaGFpbiA9IG51bV9jaGFpbjsKKworCXN6ID0gbnVtX2NoYWluICogc2l6ZW9mKGludCk7CisJaWYgKGlvYy0+Q2hhaW5Ub0NoYWluID09IE5VTEwpIHsKKwkJbWVtID0ga21hbGxvYyhzeiwgR0ZQX0FUT01JQyk7CisJCWlmIChtZW0gPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKworCQlpb2MtPkNoYWluVG9DaGFpbiA9IChpbnQgKikgbWVtOworCQlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzIENoYWluVG9DaGFpbiBhbGxvYyBAICVwLCBzej0lZCBieXRlc1xuIiwKKwkJCSAJaW9jLT5uYW1lLCBtZW0sIHN6KSk7CisJfSBlbHNlIHsKKwkJbWVtID0gKHU4ICopIGlvYy0+Q2hhaW5Ub0NoYWluOworCX0KKwltZW1zZXQobWVtLCAweEZGLCBzeik7CisJcmV0dXJuIG51bV9jaGFpbjsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCVByaW1lSW9jRmlmb3MgLSBJbml0aWFsaXplIElPQyByZXF1ZXN0IGFuZCByZXBseSBGSUZPcy4KKyAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCisgKgorICoJVGhpcyByb3V0aW5lIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHRoZSBNUFQgcmVwbHkgYW5kIHJlcXVlc3QgZnJhbWUKKyAqCXBvb2xzIChpZiBuZWNlc3NhcnkpLCBhbmQgcHJpbWVzIHRoZSBJT0MgcmVwbHkgRklGTyB3aXRoCisgKglyZXBseSBmcmFtZXMuCisgKgorICoJUmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZS4KKyAqLworc3RhdGljIGludAorUHJpbWVJb2NGaWZvcyhNUFRfQURBUFRFUiAqaW9jKQoreworCU1QVF9GUkFNRV9IRFIgKm1mOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZG1hX2FkZHJfdCBhbGxvY19kbWE7CisJdTggKm1lbTsKKwlpbnQgaSwgcmVwbHlfc3osIHN6LCB0b3RhbF9zaXplLCBudW1fY2hhaW47CisKKwkvKiAgUHJpbWUgcmVwbHkgRklGTy4uLiAgKi8KKworCWlmIChpb2MtPnJlcGx5X2ZyYW1lcyA9PSBOVUxMKSB7CisJCWlmICggKG51bV9jaGFpbiA9IGluaXRDaGFpbkJ1ZmZlcnMoaW9jKSkgPCAwKQorCQkJcmV0dXJuIC0xOworCisJCXRvdGFsX3NpemUgPSByZXBseV9zeiA9IChpb2MtPnJlcGx5X3N6ICogaW9jLT5yZXBseV9kZXB0aCk7CisJCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXMuUmVwbHlCdWZmZXIgc3o9JWQgYnl0ZXMsIFJlcGx5RGVwdGg9JWRcbiIsCisJCQkgCWlvYy0+bmFtZSwgaW9jLT5yZXBseV9zeiwgaW9jLT5yZXBseV9kZXB0aCkpOworCQlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzLlJlcGx5QnVmZmVyIHN6PSVkWyV4XSBieXRlc1xuIiwKKwkJCSAJaW9jLT5uYW1lLCByZXBseV9zeiwgcmVwbHlfc3opKTsKKworCQlzeiA9IChpb2MtPnJlcV9zeiAqIGlvYy0+cmVxX2RlcHRoKTsKKwkJZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlcy5SZXF1ZXN0QnVmZmVyIHN6PSVkIGJ5dGVzLCBSZXF1ZXN0RGVwdGg9JWRcbiIsCisJCQkgCWlvYy0+bmFtZSwgaW9jLT5yZXFfc3osIGlvYy0+cmVxX2RlcHRoKSk7CisJCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXMuUmVxdWVzdEJ1ZmZlciBzej0lZFsleF0gYnl0ZXNcbiIsCisJCQkgCWlvYy0+bmFtZSwgc3osIHN6KSk7CisJCXRvdGFsX3NpemUgKz0gc3o7CisKKwkJc3ogPSBudW1fY2hhaW4gKiBpb2MtPnJlcV9zejsgLyogY2hhaW4gYnVmZmVyIHBvb2wgc2l6ZSAqLworCQlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzLkNoYWluQnVmZmVyIHN6PSVkIGJ5dGVzLCBDaGFpbkRlcHRoPSVkXG4iLAorCQkJIAlpb2MtPm5hbWUsIGlvYy0+cmVxX3N6LCBudW1fY2hhaW4pKTsKKwkJZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlcy5DaGFpbkJ1ZmZlciBzej0lZFsleF0gYnl0ZXMgbnVtX2NoYWluPSVkXG4iLAorCQkJIAlpb2MtPm5hbWUsIHN6LCBzeiwgbnVtX2NoYWluKSk7CisKKwkJdG90YWxfc2l6ZSArPSBzejsKKwkJbWVtID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaW9jLT5wY2lkZXYsIHRvdGFsX3NpemUsICZhbGxvY19kbWEpOworCQlpZiAobWVtID09IE5VTEwpIHsKKwkJCXByaW50ayhNWUlPQ19zX0VSUl9GTVQgIlVuYWJsZSB0byBhbGxvY2F0ZSBSZXBseSwgUmVxdWVzdCwgQ2hhaW4gQnVmZmVycyFcbiIsCisJCQkJaW9jLT5uYW1lKTsKKwkJCWdvdG8gb3V0X2ZhaWw7CisJCX0KKworCQlkaW5pdHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzLlRvdGFsIGFsbG9jIEAgJXBbJXBdLCBzej0lZFsleF0gYnl0ZXNcbiIsCisJCQkgCWlvYy0+bmFtZSwgbWVtLCAodm9pZCAqKSh1bG9uZylhbGxvY19kbWEsIHRvdGFsX3NpemUsIHRvdGFsX3NpemUpKTsKKworCQltZW1zZXQobWVtLCAwLCB0b3RhbF9zaXplKTsKKwkJaW9jLT5hbGxvY190b3RhbCArPSB0b3RhbF9zaXplOworCQlpb2MtPmFsbG9jID0gbWVtOworCQlpb2MtPmFsbG9jX2RtYSA9IGFsbG9jX2RtYTsKKwkJaW9jLT5hbGxvY19zeiA9IHRvdGFsX3NpemU7CisJCWlvYy0+cmVwbHlfZnJhbWVzID0gKE1QVF9GUkFNRV9IRFIgKikgbWVtOworCQlpb2MtPnJlcGx5X2ZyYW1lc19sb3dfZG1hID0gKHUzMikgKGFsbG9jX2RtYSAmIDB4RkZGRkZGRkYpOworCisJCWFsbG9jX2RtYSArPSByZXBseV9zejsKKwkJbWVtICs9IHJlcGx5X3N6OworCisJCS8qICBSZXF1ZXN0IEZJRk8gLSBXRSBtYW5hZ2UgdGhpcyEgICovCisKKwkJaW9jLT5yZXFfZnJhbWVzID0gKE1QVF9GUkFNRV9IRFIgKikgbWVtOworCQlpb2MtPnJlcV9mcmFtZXNfZG1hID0gYWxsb2NfZG1hOworCisJCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXMuUmVxdWVzdEJ1ZmZlcnMgQCAlcFslcF1cbiIsCisJCQkgCWlvYy0+bmFtZSwgbWVtLCAodm9pZCAqKSh1bG9uZylhbGxvY19kbWEpKTsKKworCQlpb2MtPnJlcV9mcmFtZXNfbG93X2RtYSA9ICh1MzIpIChhbGxvY19kbWEgJiAweEZGRkZGRkZGKTsKKworI2lmIGRlZmluZWQoQ09ORklHX01UUlIpICYmIDAKKwkJLyoKKwkJICogIEVuYWJsZSBXcml0ZSBDb21iaW5pbmcgTVRSUiBmb3IgSU9DJ3MgbWVtb3J5IHJlZ2lvbi4KKwkJICogIChhdCBsZWFzdCBhcyBtdWNoIGFzIHdlIGNhbjsgInNpemUgYW5kIGJhc2UgbXVzdCBiZQorCQkgKiAgbXVsdGlwbGVzIG9mIDQga2lCIgorCQkgKi8KKwkJaW9jLT5tdHJyX3JlZyA9IG10cnJfYWRkKGlvYy0+cmVxX2ZyYW1lc19kbWEsCisJCQkJCSBzeiwKKwkJCQkJIE1UUlJfVFlQRV9XUkNPTUIsIDEpOworCQlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJNVFJSIHJlZ2lvbiByZWdpc3RlcmVkIChiYXNlOnNpemU9JTA4eDoleClcbiIsCisJCQkJaW9jLT5uYW1lLCBpb2MtPnJlcV9mcmFtZXNfZG1hLCBzeikpOworI2VuZGlmCisKKwkJZm9yIChpID0gMDsgaSA8IGlvYy0+cmVxX2RlcHRoOyBpKyspIHsKKwkJCWFsbG9jX2RtYSArPSBpb2MtPnJlcV9zejsKKwkJCW1lbSArPSBpb2MtPnJlcV9zejsKKwkJfQorCisJCWlvYy0+Q2hhaW5CdWZmZXIgPSBtZW07CisJCWlvYy0+Q2hhaW5CdWZmZXJETUEgPSBhbGxvY19kbWE7CisKKwkJZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiIDolcy5DaGFpbkJ1ZmZlcnMgQCAlcCglcClcbiIsCisJCQlpb2MtPm5hbWUsIGlvYy0+Q2hhaW5CdWZmZXIsICh2b2lkICopKHVsb25nKWlvYy0+Q2hhaW5CdWZmZXJETUEpKTsKKworCQkvKiBJbml0aWFsaXplIHRoZSBmcmVlIGNoYWluIFEuCisJIAkqLworCisJCUlOSVRfTElTVF9IRUFEKCZpb2MtPkZyZWVDaGFpblEpOworCisJCS8qIFBvc3QgdGhlIGNoYWluIGJ1ZmZlcnMgdG8gdGhlIEZyZWVDaGFpblEuCisJIAkqLworCQltZW0gPSAodTggKilpb2MtPkNoYWluQnVmZmVyOworCQlmb3IgKGk9MDsgaSA8IG51bV9jaGFpbjsgaSsrKSB7CisJCQltZiA9IChNUFRfRlJBTUVfSERSICopIG1lbTsKKwkJCWxpc3RfYWRkX3RhaWwoJm1mLT51LmZyYW1lLmxpbmthZ2UubGlzdCwgJmlvYy0+RnJlZUNoYWluUSk7CisJCQltZW0gKz0gaW9jLT5yZXFfc3o7CisJCX0KKworCQkvKiBJbml0aWFsaXplIFJlcXVlc3QgZnJhbWVzIGxpbmtlZCBsaXN0CisJCSAqLworCQlhbGxvY19kbWEgPSBpb2MtPnJlcV9mcmFtZXNfZG1hOworCQltZW0gPSAodTggKikgaW9jLT5yZXFfZnJhbWVzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPkZyZWVRbG9jaywgZmxhZ3MpOworCQlJTklUX0xJU1RfSEVBRCgmaW9jLT5GcmVlUSk7CisJCWZvciAoaSA9IDA7IGkgPCBpb2MtPnJlcV9kZXB0aDsgaSsrKSB7CisJCQltZiA9IChNUFRfRlJBTUVfSERSICopIG1lbTsKKworCQkJLyogIFF1ZXVlIFJFUVVFU1RzICppbnRlcm5hbGx5KiEgICovCisJCQlsaXN0X2FkZF90YWlsKCZtZi0+dS5mcmFtZS5saW5rYWdlLmxpc3QsICZpb2MtPkZyZWVRKTsKKworCQkJbWVtICs9IGlvYy0+cmVxX3N6OworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CisKKwkJc3ogPSAoaW9jLT5yZXFfZGVwdGggKiBNUFRfU0VOU0VfQlVGRkVSX0FMTE9DKTsKKwkJaW9jLT5zZW5zZV9idWZfcG9vbCA9CisJCQlwY2lfYWxsb2NfY29uc2lzdGVudChpb2MtPnBjaWRldiwgc3osICZpb2MtPnNlbnNlX2J1Zl9wb29sX2RtYSk7CisJCWlmIChpb2MtPnNlbnNlX2J1Zl9wb29sID09IE5VTEwpIHsKKwkJCXByaW50ayhNWUlPQ19zX0VSUl9GTVQgIlVuYWJsZSB0byBhbGxvY2F0ZSBTZW5zZSBCdWZmZXJzIVxuIiwKKwkJCQlpb2MtPm5hbWUpOworCQkJZ290byBvdXRfZmFpbDsKKwkJfQorCisJCWlvYy0+c2Vuc2VfYnVmX2xvd19kbWEgPSAodTMyKSAoaW9jLT5zZW5zZV9idWZfcG9vbF9kbWEgJiAweEZGRkZGRkZGKTsKKwkJaW9jLT5hbGxvY190b3RhbCArPSBzejsKKwkJZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlcy5TZW5zZUJ1ZmZlcnMgQCAlcFslcF1cbiIsCisgCQkJaW9jLT5uYW1lLCBpb2MtPnNlbnNlX2J1Zl9wb29sLCAodm9pZCAqKSh1bG9uZylpb2MtPnNlbnNlX2J1Zl9wb29sX2RtYSkpOworCisJfQorCisJLyogUG9zdCBSZXBseSBmcmFtZXMgdG8gRklGTworCSAqLworCWFsbG9jX2RtYSA9IGlvYy0+YWxsb2NfZG1hOworCWRpbml0cHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXMuUmVwbHlCdWZmZXJzIEAgJXBbJXBdXG4iLAorCSAJaW9jLT5uYW1lLCBpb2MtPnJlcGx5X2ZyYW1lcywgKHZvaWQgKikodWxvbmcpYWxsb2NfZG1hKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW9jLT5yZXBseV9kZXB0aDsgaSsrKSB7CisJCS8qICBXcml0ZSBlYWNoIGFkZHJlc3MgdG8gdGhlIElPQyEgICovCisJCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5SZXBseUZpZm8sIGFsbG9jX2RtYSk7CisJCWFsbG9jX2RtYSArPSBpb2MtPnJlcGx5X3N6OworCX0KKworCXJldHVybiAwOworCitvdXRfZmFpbDoKKwlpZiAoaW9jLT5hbGxvYyAhPSBOVUxMKSB7CisJCXN6ID0gaW9jLT5hbGxvY19zejsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChpb2MtPnBjaWRldiwKKwkJCQlzeiwKKwkJCQlpb2MtPmFsbG9jLCBpb2MtPmFsbG9jX2RtYSk7CisJCWlvYy0+cmVwbHlfZnJhbWVzID0gTlVMTDsKKwkJaW9jLT5yZXFfZnJhbWVzID0gTlVMTDsKKwkJaW9jLT5hbGxvY190b3RhbCAtPSBzejsKKwl9CisJaWYgKGlvYy0+c2Vuc2VfYnVmX3Bvb2wgIT0gTlVMTCkgeworCQlzeiA9IChpb2MtPnJlcV9kZXB0aCAqIE1QVF9TRU5TRV9CVUZGRVJfQUxMT0MpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGlvYy0+cGNpZGV2LAorCQkJCXN6LAorCQkJCWlvYy0+c2Vuc2VfYnVmX3Bvb2wsIGlvYy0+c2Vuc2VfYnVmX3Bvb2xfZG1hKTsKKwkJaW9jLT5zZW5zZV9idWZfcG9vbCA9IE5VTEw7CisJfQorCXJldHVybiAtMTsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoqCisgKgltcHRfaGFuZHNoYWtlX3JlcV9yZXBseV93YWl0IC0gU2VuZCBNUFQgcmVxdWVzdCB0byBhbmQgcmVjZWl2ZSByZXBseQorICoJZnJvbSBJT0MgdmlhIGRvb3JiZWxsIGhhbmRzaGFrZSBtZXRob2QuCisgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQorICoJQHJlcUJ5dGVzOiBTaXplIG9mIHRoZSByZXF1ZXN0IGluIGJ5dGVzCisgKglAcmVxOiBQb2ludGVyIHRvIE1QVCByZXF1ZXN0IGZyYW1lCisgKglAcmVwbHlCeXRlczogRXhwZWN0ZWQgc2l6ZSBvZiB0aGUgcmVwbHkgaW4gYnl0ZXMKKyAqCUB1MTZyZXBseTogUG9pbnRlciB0byBhcmVhIHdoZXJlIHJlcGx5IHNob3VsZCBiZSB3cml0dGVuCisgKglAbWF4d2FpdDogTWF4IHdhaXQgdGltZSBmb3IgYSByZXBseSAoaW4gc2Vjb25kcykKKyAqCUBzbGVlcEZsYWc6IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBwcm9jZXNzIGNhbiBzbGVlcAorICoKKyAqCU5PVEVTOiBJdCBpcyB0aGUgY2FsbGVycyByZXNwb25zaWJpbGl0eSB0byBieXRlLXN3YXAgZmllbGRzIGluIHRoZQorICoJcmVxdWVzdCB3aGljaCBhcmUgZ3JlYXRlciB0aGFuIDEgYnl0ZSBpbiBzaXplLiAgSXQgaXMgYWxzbyB0aGUKKyAqCWNhbGxlcnMgcmVzcG9uc2liaWxpdHkgdG8gYnl0ZS1zd2FwIHJlc3BvbnNlIGZpZWxkcyB3aGljaCBhcmUKKyAqCWdyZWF0ZXIgdGhhbiAxIGJ5dGUgaW4gc2l6ZS4KKyAqCisgKglSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgorICovCitzdGF0aWMgaW50CittcHRfaGFuZHNoYWtlX3JlcV9yZXBseV93YWl0KE1QVF9BREFQVEVSICppb2MsIGludCByZXFCeXRlcywgdTMyICpyZXEsCisJCQkJaW50IHJlcGx5Qnl0ZXMsIHUxNiAqdTE2cmVwbHksIGludCBtYXh3YWl0LCBpbnQgc2xlZXBGbGFnKQoreworCU1QSURlZmF1bHRSZXBseV90ICptcHRSZXBseTsKKwlpbnQgZmFpbGNudCA9IDA7CisJaW50IHQ7CisKKwkvKgorCSAqIEdldCByZWFkeSB0byBjYWNoZSBhIGhhbmRzaGFrZSByZXBseQorCSAqLworCWlvYy0+aHNfcmVwbHlfaWR4ID0gMDsKKwltcHRSZXBseSA9IChNUElEZWZhdWx0UmVwbHlfdCAqKSBpb2MtPmhzX3JlcGx5OworCW1wdFJlcGx5LT5Nc2dMZW5ndGggPSAwOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGRvb3JiZWxscyAoV1JJVEUgMCB0byBJbnRTdGF0dXMgcmVnKSwKKwkgKiB0aGVuIHRlbGwgSU9DIHRoYXQgd2Ugd2FudCB0byBoYW5kc2hha2UgYSByZXF1ZXN0IG9mIE4gd29yZHMuCisJICogKFdSSVRFIHUzMnZhbCB0byBEb29yYmVsbCByZWcpLgorCSAqLworCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5JbnRTdGF0dXMsIDApOworCUNISVBSRUdfV1JJVEUzMigmaW9jLT5jaGlwLT5Eb29yYmVsbCwKKwkJCSgoTVBJX0ZVTkNUSU9OX0hBTkRTSEFLRTw8TVBJX0RPT1JCRUxMX0ZVTkNUSU9OX1NISUZUKSB8CisJCQkgKChyZXFCeXRlcy80KTw8TVBJX0RPT1JCRUxMX0FERF9EV09SRFNfU0hJRlQpKSk7CisKKwkvKgorCSAqIFdhaXQgZm9yIElPQydzIGRvb3JiZWxsIGhhbmRzaGFrZSBpbnQKKwkgKi8KKwlpZiAoKHQgPSBXYWl0Rm9yRG9vcmJlbGxJbnQoaW9jLCA1LCBzbGVlcEZsYWcpKSA8IDApCisJCWZhaWxjbnQrKzsKKworCWRoc3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiSGFuZFNoYWtlIHJlcXVlc3Qgc3RhcnQgcmVxQnl0ZXM9JWQsIFdhaXRDbnQ9JWQlc1xuIiwKKwkJCWlvYy0+bmFtZSwgcmVxQnl0ZXMsIHQsIGZhaWxjbnQgPyAiIC0gTUlTU0lORyBET09SQkVMTCBIQU5EU0hBS0UhIiA6ICIiKSk7CisKKwkvKiBSZWFkIGRvb3JiZWxsIGFuZCBjaGVjayBmb3IgYWN0aXZlIGJpdCAqLworCWlmICghKENISVBSRUdfUkVBRDMyKCZpb2MtPmNoaXAtPkRvb3JiZWxsKSAmIE1QSV9ET09SQkVMTF9BQ1RJVkUpKQorCQkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBDbGVhciBkb29yYmVsbCBpbnQgKFdSSVRFIDAgdG8gSW50U3RhdHVzIHJlZyksCisJICogdGhlbiB3YWl0IGZvciBJT0MgdG8gQUNLbm93bGVkZ2UgdGhhdCBpdCdzIHJlYWR5IGZvcgorCSAqIG91ciBoYW5kc2hha2UgcmVxdWVzdC4KKwkgKi8KKwlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+SW50U3RhdHVzLCAwKTsKKwlpZiAoIWZhaWxjbnQgJiYgKHQgPSBXYWl0Rm9yRG9vcmJlbGxBY2soaW9jLCA1LCBzbGVlcEZsYWcpKSA8IDApCisJCWZhaWxjbnQrKzsKKworCWlmICghZmFpbGNudCkgeworCQlpbnQJIGlpOworCQl1OAkqcmVxX2FzX2J5dGVzID0gKHU4ICopIHJlcTsKKworCQkvKgorCQkgKiBTdHVmZiByZXF1ZXN0IHdvcmRzIHZpYSBkb29yYmVsbCBoYW5kc2hha2UsCisJCSAqIHdpdGggQUNLIGZyb20gSU9DIGZvciBlYWNoLgorCQkgKi8KKwkJZm9yIChpaSA9IDA7ICFmYWlsY250ICYmIGlpIDwgcmVxQnl0ZXMvNDsgaWkrKykgeworCQkJdTMyIHdvcmQgPSAoKHJlcV9hc19ieXRlc1soaWkqNCkgKyAwXSA8PCAgMCkgfAorCQkJCSAgICAocmVxX2FzX2J5dGVzWyhpaSo0KSArIDFdIDw8ICA4KSB8CisJCQkJICAgIChyZXFfYXNfYnl0ZXNbKGlpKjQpICsgMl0gPDwgMTYpIHwKKwkJCQkgICAgKHJlcV9hc19ieXRlc1soaWkqNCkgKyAzXSA8PCAyNCkpOworCisJCQlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+RG9vcmJlbGwsIHdvcmQpOworCQkJaWYgKCh0ID0gV2FpdEZvckRvb3JiZWxsQWNrKGlvYywgNSwgc2xlZXBGbGFnKSkgPCAwKQorCQkJCWZhaWxjbnQrKzsKKwkJfQorCisJCWRoc3ByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IEhhbmRzaGFrZSByZXF1ZXN0IGZyYW1lIChAJXApIGhlYWRlclxuIiwgcmVxKSk7CisJCURCR19EVU1QX1JFUVVFU1RfRlJBTUVfSERSKHJlcSkKKworCQlkaHNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkhhbmRTaGFrZSByZXF1ZXN0IHBvc3QgZG9uZSwgV2FpdENudD0lZCVzXG4iLAorCQkJCWlvYy0+bmFtZSwgdCwgZmFpbGNudCA/ICIgLSBNSVNTSU5HIERPT1JCRUxMIEFDSyEiIDogIiIpKTsKKworCQkvKgorCQkgKiBXYWl0IGZvciBjb21wbGV0aW9uIG9mIGRvb3JiZWxsIGhhbmRzaGFrZSByZXBseSBmcm9tIHRoZSBJT0MKKwkJICovCisJCWlmICghZmFpbGNudCAmJiAodCA9IFdhaXRGb3JEb29yYmVsbFJlcGx5KGlvYywgbWF4d2FpdCwgc2xlZXBGbGFnKSkgPCAwKQorCQkJZmFpbGNudCsrOworCQkKKwkJZGhzcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJIYW5kU2hha2UgcmVwbHkgY291bnQ9JWQlc1xuIiwKKwkJCQlpb2MtPm5hbWUsIHQsIGZhaWxjbnQgPyAiIC0gTUlTU0lORyBET09SQkVMTCBSRVBMWSEiIDogIiIpKTsKKworCQkvKgorCQkgKiBDb3B5IG91dCB0aGUgY2FjaGVkIHJlcGx5Li4uCisJCSAqLworCQlmb3IgKGlpPTA7IGlpIDwgbWluKHJlcGx5Qnl0ZXMvMixtcHRSZXBseS0+TXNnTGVuZ3RoKjIpOyBpaSsrKQorCQkJdTE2cmVwbHlbaWldID0gaW9jLT5oc19yZXBseVtpaV07CisJfSBlbHNlIHsKKwkJcmV0dXJuIC05OTsKKwl9CisKKwlyZXR1cm4gLWZhaWxjbnQ7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKglXYWl0Rm9yRG9vcmJlbGxBY2sgLSBXYWl0IGZvciBJT0MgdG8gY2xlYXIgdGhlIElPUF9ET09SQkVMTF9TVEFUVVMgYml0CisgKglpbiBpdCdzIEludFN0YXR1cyByZWdpc3Rlci4KKyAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCisgKglAaG93bG9uZzogSG93IGxvbmcgdG8gd2FpdCAoaW4gc2Vjb25kcykKKyAqCUBzbGVlcEZsYWc6IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBwcm9jZXNzIGNhbiBzbGVlcAorICoKKyAqCVRoaXMgcm91dGluZSB3YWl0cyAodXAgdG8gfjIgc2Vjb25kcyBtYXgpIGZvciBJT0MgZG9vcmJlbGwKKyAqCWhhbmRzaGFrZSBBQ0tub3dsZWRnZS4KKyAqCisgKglSZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZSwgZWxzZSB3YWl0IGxvb3AgY291bnQuCisgKi8KK3N0YXRpYyBpbnQKK1dhaXRGb3JEb29yYmVsbEFjayhNUFRfQURBUFRFUiAqaW9jLCBpbnQgaG93bG9uZywgaW50IHNsZWVwRmxhZykKK3sKKwlpbnQgY250ZG47CisJaW50IGNvdW50ID0gMDsKKwl1MzIgaW50c3RhdD0wOworCisJY250ZG4gPSAoKHNsZWVwRmxhZyA9PSBDQU5fU0xFRVApID8gSFogOiAxMDAwKSAqIGhvd2xvbmc7CisKKwlpZiAoc2xlZXBGbGFnID09IENBTl9TTEVFUCkgeworCQl3aGlsZSAoLS1jbnRkbikgeworCQkJaW50c3RhdCA9IENISVBSRUdfUkVBRDMyKCZpb2MtPmNoaXAtPkludFN0YXR1cyk7CisJCQlpZiAoISAoaW50c3RhdCAmIE1QSV9ISVNfSU9QX0RPT1JCRUxMX1NUQVRVUykpCisJCQkJYnJlYWs7CisJCQltc2xlZXBfaW50ZXJydXB0aWJsZSAoMSk7CisJCQljb3VudCsrOworCQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKC0tY250ZG4pIHsKKwkJCWludHN0YXQgPSBDSElQUkVHX1JFQUQzMigmaW9jLT5jaGlwLT5JbnRTdGF0dXMpOworCQkJaWYgKCEgKGludHN0YXQgJiBNUElfSElTX0lPUF9ET09SQkVMTF9TVEFUVVMpKQorCQkJCWJyZWFrOworCQkJbWRlbGF5ICgxKTsKKwkJCWNvdW50Kys7CisJCX0KKwl9CisKKwlpZiAoY250ZG4pIHsKKwkJZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiV2FpdEZvckRvb3JiZWxsIEFDSyAoY291bnQ9JWQpXG4iLAorCQkJCWlvYy0+bmFtZSwgY291bnQpKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKworCXByaW50ayhNWUlPQ19zX0VSUl9GTVQgIkRvb3JiZWxsIEFDSyB0aW1lb3V0IChjb3VudD0lZCksIEludFN0YXR1cz0leCFcbiIsCisJCQlpb2MtPm5hbWUsIGNvdW50LCBpbnRzdGF0KTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKglXYWl0Rm9yRG9vcmJlbGxJbnQgLSBXYWl0IGZvciBJT0MgdG8gc2V0IHRoZSBISVNfRE9PUkJFTExfSU5URVJSVVBUIGJpdAorICoJaW4gaXQncyBJbnRTdGF0dXMgcmVnaXN0ZXIuCisgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQorICoJQGhvd2xvbmc6IEhvdyBsb25nIHRvIHdhaXQgKGluIHNlY29uZHMpCisgKglAc2xlZXBGbGFnOiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcHJvY2VzcyBjYW4gc2xlZXAKKyAqCisgKglUaGlzIHJvdXRpbmUgd2FpdHMgKHVwIHRvIH4yIHNlY29uZHMgbWF4KSBmb3IgSU9DIGRvb3JiZWxsIGludGVycnVwdC4KKyAqCisgKglSZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZSwgZWxzZSB3YWl0IGxvb3AgY291bnQuCisgKi8KK3N0YXRpYyBpbnQKK1dhaXRGb3JEb29yYmVsbEludChNUFRfQURBUFRFUiAqaW9jLCBpbnQgaG93bG9uZywgaW50IHNsZWVwRmxhZykKK3sKKwlpbnQgY250ZG47CisJaW50IGNvdW50ID0gMDsKKwl1MzIgaW50c3RhdD0wOworCisJY250ZG4gPSAoKHNsZWVwRmxhZyA9PSBDQU5fU0xFRVApID8gSFogOiAxMDAwKSAqIGhvd2xvbmc7CisJaWYgKHNsZWVwRmxhZyA9PSBDQU5fU0xFRVApIHsKKwkJd2hpbGUgKC0tY250ZG4pIHsKKwkJCWludHN0YXQgPSBDSElQUkVHX1JFQUQzMigmaW9jLT5jaGlwLT5JbnRTdGF0dXMpOworCQkJaWYgKGludHN0YXQgJiBNUElfSElTX0RPT1JCRUxMX0lOVEVSUlVQVCkKKwkJCQlicmVhazsKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEpOworCQkJY291bnQrKzsKKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlICgtLWNudGRuKSB7CisJCQlpbnRzdGF0ID0gQ0hJUFJFR19SRUFEMzIoJmlvYy0+Y2hpcC0+SW50U3RhdHVzKTsKKwkJCWlmIChpbnRzdGF0ICYgTVBJX0hJU19ET09SQkVMTF9JTlRFUlJVUFQpCisJCQkJYnJlYWs7CisJCQltZGVsYXkoMSk7CisJCQljb3VudCsrOworCQl9CisJfQorCisJaWYgKGNudGRuKSB7CisJCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIldhaXRGb3JEb29yYmVsbCBJTlQgKGNudD0lZCkgaG93bG9uZz0lZFxuIiwKKwkJCQlpb2MtPm5hbWUsIGNvdW50LCBob3dsb25nKSk7CisJCXJldHVybiBjb3VudDsKKwl9CisKKwlwcmludGsoTVlJT0Nfc19FUlJfRk1UICJEb29yYmVsbCBJTlQgdGltZW91dCAoY291bnQ9JWQpLCBJbnRTdGF0dXM9JXghXG4iLAorCQkJaW9jLT5uYW1lLCBjb3VudCwgaW50c3RhdCk7CisJcmV0dXJuIC0xOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJV2FpdEZvckRvb3JiZWxsUmVwbHkgLSBXYWl0IGZvciBhbmQgY2FwdHVyZSBhIElPQyBoYW5kc2hha2UgcmVwbHkuCisgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQorICoJQGhvd2xvbmc6IEhvdyBsb25nIHRvIHdhaXQgKGluIHNlY29uZHMpCisgKglAc2xlZXBGbGFnOiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcHJvY2VzcyBjYW4gc2xlZXAKKyAqCisgKglUaGlzIHJvdXRpbmUgcG9sbHMgdGhlIElPQyBmb3IgYSBoYW5kc2hha2UgcmVwbHksIDE2IGJpdHMgYXQgYSB0aW1lLgorICoJUmVwbHkgaXMgY2FjaGVkIHRvIElPQyBwcml2YXRlIGFyZWEgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYSBtYXhpbXVtCisgKglvZiAxMjggYnl0ZXMgb2YgcmVwbHkgZGF0YS4KKyAqCisgKglSZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZSwgZWxzZSBzaXplIG9mIHJlcGx5IGluIFdPUkRTLgorICovCitzdGF0aWMgaW50CitXYWl0Rm9yRG9vcmJlbGxSZXBseShNUFRfQURBUFRFUiAqaW9jLCBpbnQgaG93bG9uZywgaW50IHNsZWVwRmxhZykKK3sKKwlpbnQgdTE2Y250ID0gMDsKKwlpbnQgZmFpbGNudCA9IDA7CisJaW50IHQ7CisJdTE2ICpoc19yZXBseSA9IGlvYy0+aHNfcmVwbHk7CisJdm9sYXRpbGUgTVBJRGVmYXVsdFJlcGx5X3QgKm1wdFJlcGx5ID0gKE1QSURlZmF1bHRSZXBseV90ICopIGlvYy0+aHNfcmVwbHk7CisJdTE2IGh3b3JkOworCisJaHNfcmVwbHlbMF0gPSBoc19yZXBseVsxXSA9IGhzX3JlcGx5WzddID0gMDsKKworCS8qCisJICogR2V0IGZpcnN0IHR3byB1MTYncyBzbyB3ZSBjYW4gbG9vayBhdCBJT0MncyBpbnRlbmRlZCByZXBseSBNc2dMZW5ndGgKKwkgKi8KKwl1MTZjbnQ9MDsKKwlpZiAoKHQgPSBXYWl0Rm9yRG9vcmJlbGxJbnQoaW9jLCBob3dsb25nLCBzbGVlcEZsYWcpKSA8IDApIHsKKwkJZmFpbGNudCsrOworCX0gZWxzZSB7CisJCWhzX3JlcGx5W3UxNmNudCsrXSA9IGxlMTZfdG9fY3B1KENISVBSRUdfUkVBRDMyKCZpb2MtPmNoaXAtPkRvb3JiZWxsKSAmIDB4MDAwMEZGRkYpOworCQlDSElQUkVHX1dSSVRFMzIoJmlvYy0+Y2hpcC0+SW50U3RhdHVzLCAwKTsKKwkJaWYgKCh0ID0gV2FpdEZvckRvb3JiZWxsSW50KGlvYywgNSwgc2xlZXBGbGFnKSkgPCAwKQorCQkJZmFpbGNudCsrOworCQllbHNlIHsKKwkJCWhzX3JlcGx5W3UxNmNudCsrXSA9IGxlMTZfdG9fY3B1KENISVBSRUdfUkVBRDMyKCZpb2MtPmNoaXAtPkRvb3JiZWxsKSAmIDB4MDAwMEZGRkYpOworCQkJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPkludFN0YXR1cywgMCk7CisJCX0KKwl9CisKKwlkaHNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIldhaXRDbnQ9JWQgRmlyc3QgaGFuZHNoYWtlIHJlcGx5IHdvcmQ9JTA4eCVzXG4iLAorCQkJaW9jLT5uYW1lLCB0LCBsZTMyX3RvX2NwdSgqKHUzMiAqKWhzX3JlcGx5KSwgCisJCQlmYWlsY250ID8gIiAtIE1JU1NJTkcgRE9PUkJFTEwgSEFORFNIQUtFISIgOiAiIikpOworCisJLyoKKwkgKiBJZiBubyBlcnJvciAoYW5kIElPQyBzYWlkIE1zZ0xlbmd0aCBpcyA+IDApLCBwaWVjZSB0b2dldGhlcgorCSAqIHJlcGx5IDE2IGJpdHMgYXQgYSB0aW1lLgorCSAqLworCWZvciAodTE2Y250PTI7ICFmYWlsY250ICYmIHUxNmNudCA8ICgyICogbXB0UmVwbHktPk1zZ0xlbmd0aCk7IHUxNmNudCsrKSB7CisJCWlmICgodCA9IFdhaXRGb3JEb29yYmVsbEludChpb2MsIDUsIHNsZWVwRmxhZykpIDwgMCkKKwkJCWZhaWxjbnQrKzsKKwkJaHdvcmQgPSBsZTE2X3RvX2NwdShDSElQUkVHX1JFQUQzMigmaW9jLT5jaGlwLT5Eb29yYmVsbCkgJiAweDAwMDBGRkZGKTsKKwkJLyogZG9uJ3Qgb3ZlcmZsb3cgb3VyIElPQyBoc19yZXBseVtdIGJ1ZmZlciEgKi8KKwkJaWYgKHUxNmNudCA8IHNpemVvZihpb2MtPmhzX3JlcGx5KSAvIHNpemVvZihpb2MtPmhzX3JlcGx5WzBdKSkKKwkJCWhzX3JlcGx5W3UxNmNudF0gPSBod29yZDsKKwkJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPkludFN0YXR1cywgMCk7CisJfQorCisJaWYgKCFmYWlsY250ICYmICh0ID0gV2FpdEZvckRvb3JiZWxsSW50KGlvYywgNSwgc2xlZXBGbGFnKSkgPCAwKQorCQlmYWlsY250Kys7CisJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPkludFN0YXR1cywgMCk7CisKKwlpZiAoZmFpbGNudCkgeworCQlwcmludGsoTVlJT0Nfc19FUlJfRk1UICJIYW5kc2hha2UgcmVwbHkgZmFpbHVyZSFcbiIsCisJCQkJaW9jLT5uYW1lKTsKKwkJcmV0dXJuIC1mYWlsY250OworCX0KKyNpZiAwCisJZWxzZSBpZiAodTE2Y250ICE9ICgyICogbXB0UmVwbHktPk1zZ0xlbmd0aCkpIHsKKwkJcmV0dXJuIC0xMDE7CisJfQorCWVsc2UgaWYgKChtcHRSZXBseS0+SU9DU3RhdHVzICYgTVBJX0lPQ1NUQVRVU19NQVNLKSAhPSBNUElfSU9DU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcmV0dXJuIC0xMDI7CisJfQorI2VuZGlmCisKKwlkaHNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkdvdCBIYW5kc2hha2UgcmVwbHk6XG4iLCBpb2MtPm5hbWUpKTsKKwlEQkdfRFVNUF9SRVBMWV9GUkFNRShtcHRSZXBseSkKKworCWRoc3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiV2FpdEZvckRvb3JiZWxsIFJFUExZIFdhaXRDbnQ9JWQgKHN6PSVkKVxuIiwKKwkJCWlvYy0+bmFtZSwgdCwgdTE2Y250LzIpKTsKKwlyZXR1cm4gdTE2Y250LzI7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKglHZXRMYW5Db25maWdQYWdlcyAtIEZldGNoIExBTkNvbmZpZyBwYWdlcy4KKyAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCisgKgorICoJUmV0dXJuOiAwIGZvciBzdWNjZXNzCisgKgktRU5PTUVNIGlmIG5vIG1lbW9yeSBhdmFpbGFibGUKKyAqCQktRVBFUk0gaWYgbm90IGFsbG93ZWQgZHVlIHRvIElTUiBjb250ZXh0CisgKgkJLUVBR0FJTiBpZiBubyBtc2cgZnJhbWVzIGN1cnJlbnRseSBhdmFpbGFibGUKKyAqCQktRUZBVUxUIGZvciBub24tc3VjY2Vzc2Z1bCByZXBseSBvciBubyByZXBseSAodGltZW91dCkKKyAqLworc3RhdGljIGludAorR2V0TGFuQ29uZmlnUGFnZXMoTVBUX0FEQVBURVIgKmlvYykKK3sKKwlDb25maWdQYWdlSGVhZGVyX3QJIGhkcjsKKwlDT05GSUdQQVJNUwkJIGNmZzsKKwlMQU5QYWdlMF90CQkqcHBhZ2UwX2FsbG9jOworCWRtYV9hZGRyX3QJCSBwYWdlMF9kbWE7CisJTEFOUGFnZTFfdAkJKnBwYWdlMV9hbGxvYzsKKwlkbWFfYWRkcl90CQkgcGFnZTFfZG1hOworCWludAkJCSByYyA9IDA7CisJaW50CQkJIGRhdGFfc3o7CisJaW50CQkJIGNvcHlfc3o7CisKKwkvKiBHZXQgTEFOIFBhZ2UgMCBoZWFkZXIgKi8KKwloZHIuUGFnZVZlcnNpb24gPSAwOworCWhkci5QYWdlTGVuZ3RoID0gMDsKKwloZHIuUGFnZU51bWJlciA9IDA7CisJaGRyLlBhZ2VUeXBlID0gTVBJX0NPTkZJR19QQUdFVFlQRV9MQU47CisJY2ZnLmhkciA9ICZoZHI7CisJY2ZnLnBoeXNBZGRyID0gLTE7CisJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfSEVBREVSOworCWNmZy5kaXIgPSAwOworCWNmZy5wYWdlQWRkciA9IDA7CisJY2ZnLnRpbWVvdXQgPSAwOworCisJaWYgKChyYyA9IG1wdF9jb25maWcoaW9jLCAmY2ZnKSkgIT0gMCkKKwkJcmV0dXJuIHJjOworCisJaWYgKGhkci5QYWdlTGVuZ3RoID4gMCkgeworCQlkYXRhX3N6ID0gaGRyLlBhZ2VMZW5ndGggKiA0OworCQlwcGFnZTBfYWxsb2MgPSAoTEFOUGFnZTBfdCAqKSBwY2lfYWxsb2NfY29uc2lzdGVudChpb2MtPnBjaWRldiwgZGF0YV9zeiwgJnBhZ2UwX2RtYSk7CisJCXJjID0gLUVOT01FTTsKKwkJaWYgKHBwYWdlMF9hbGxvYykgeworCQkJbWVtc2V0KCh1OCAqKXBwYWdlMF9hbGxvYywgMCwgZGF0YV9zeik7CisJCQljZmcucGh5c0FkZHIgPSBwYWdlMF9kbWE7CisJCQljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9SRUFEX0NVUlJFTlQ7CisKKwkJCWlmICgocmMgPSBtcHRfY29uZmlnKGlvYywgJmNmZykpID09IDApIHsKKwkJCQkvKiBzYXZlIHRoZSBkYXRhICovCisJCQkJY29weV9zeiA9IG1pbl90KGludCwgc2l6ZW9mKExBTlBhZ2UwX3QpLCBkYXRhX3N6KTsKKwkJCQltZW1jcHkoJmlvYy0+bGFuX2NuZmdfcGFnZTAsIHBwYWdlMF9hbGxvYywgY29weV9zeik7CisKKwkJCX0KKworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChpb2MtPnBjaWRldiwgZGF0YV9zeiwgKHU4ICopIHBwYWdlMF9hbGxvYywgcGFnZTBfZG1hKTsKKworCQkJLyogRklYTUUhCisJCQkgKglOb3JtYWxpemUgZW5kaWFubmVzcyBvZiBzdHJ1Y3R1cmUgZGF0YSwKKwkJCSAqCWJ5IGJ5dGUtc3dhcHBpbmcgYWxsID4gMSBieXRlIGZpZWxkcyEKKwkJCSAqLworCisJCX0KKworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCisJLyogR2V0IExBTiBQYWdlIDEgaGVhZGVyICovCisJaGRyLlBhZ2VWZXJzaW9uID0gMDsKKwloZHIuUGFnZUxlbmd0aCA9IDA7CisJaGRyLlBhZ2VOdW1iZXIgPSAxOworCWhkci5QYWdlVHlwZSA9IE1QSV9DT05GSUdfUEFHRVRZUEVfTEFOOworCWNmZy5oZHIgPSAmaGRyOworCWNmZy5waHlzQWRkciA9IC0xOworCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX0hFQURFUjsKKwljZmcuZGlyID0gMDsKKwljZmcucGFnZUFkZHIgPSAwOworCisJaWYgKChyYyA9IG1wdF9jb25maWcoaW9jLCAmY2ZnKSkgIT0gMCkKKwkJcmV0dXJuIHJjOworCisJaWYgKGhkci5QYWdlTGVuZ3RoID09IDApCisJCXJldHVybiAwOworCisJZGF0YV9zeiA9IGhkci5QYWdlTGVuZ3RoICogNDsKKwlyYyA9IC1FTk9NRU07CisJcHBhZ2UxX2FsbG9jID0gKExBTlBhZ2UxX3QgKikgcGNpX2FsbG9jX2NvbnNpc3RlbnQoaW9jLT5wY2lkZXYsIGRhdGFfc3osICZwYWdlMV9kbWEpOworCWlmIChwcGFnZTFfYWxsb2MpIHsKKwkJbWVtc2V0KCh1OCAqKXBwYWdlMV9hbGxvYywgMCwgZGF0YV9zeik7CisJCWNmZy5waHlzQWRkciA9IHBhZ2UxX2RtYTsKKwkJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfUkVBRF9DVVJSRU5UOworCisJCWlmICgocmMgPSBtcHRfY29uZmlnKGlvYywgJmNmZykpID09IDApIHsKKwkJCS8qIHNhdmUgdGhlIGRhdGEgKi8KKwkJCWNvcHlfc3ogPSBtaW5fdChpbnQsIHNpemVvZihMQU5QYWdlMV90KSwgZGF0YV9zeik7CisJCQltZW1jcHkoJmlvYy0+bGFuX2NuZmdfcGFnZTEsIHBwYWdlMV9hbGxvYywgY29weV9zeik7CisJCX0KKworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGlvYy0+cGNpZGV2LCBkYXRhX3N6LCAodTggKikgcHBhZ2UxX2FsbG9jLCBwYWdlMV9kbWEpOworCisJCS8qIEZJWE1FIQorCQkgKglOb3JtYWxpemUgZW5kaWFubmVzcyBvZiBzdHJ1Y3R1cmUgZGF0YSwKKwkJICoJYnkgYnl0ZS1zd2FwcGluZyBhbGwgPiAxIGJ5dGUgZmllbGRzIQorCQkgKi8KKworCX0KKworCXJldHVybiByYzsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCUdldEZjUG9ydFBhZ2UwIC0gRmV0Y2ggRkNQb3J0IGNvbmZpZyBQYWdlMC4KKyAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCisgKglAcG9ydG51bTogSU9DIFBvcnQgbnVtYmVyCisgKgorICoJUmV0dXJuOiAwIGZvciBzdWNjZXNzCisgKgktRU5PTUVNIGlmIG5vIG1lbW9yeSBhdmFpbGFibGUKKyAqCQktRVBFUk0gaWYgbm90IGFsbG93ZWQgZHVlIHRvIElTUiBjb250ZXh0CisgKgkJLUVBR0FJTiBpZiBubyBtc2cgZnJhbWVzIGN1cnJlbnRseSBhdmFpbGFibGUKKyAqCQktRUZBVUxUIGZvciBub24tc3VjY2Vzc2Z1bCByZXBseSBvciBubyByZXBseSAodGltZW91dCkKKyAqLworc3RhdGljIGludAorR2V0RmNQb3J0UGFnZTAoTVBUX0FEQVBURVIgKmlvYywgaW50IHBvcnRudW0pCit7CisJQ29uZmlnUGFnZUhlYWRlcl90CSBoZHI7CisJQ09ORklHUEFSTVMJCSBjZmc7CisJRkNQb3J0UGFnZTBfdAkJKnBwYWdlMF9hbGxvYzsKKwlGQ1BvcnRQYWdlMF90CQkqcHAwZGVzdDsKKwlkbWFfYWRkcl90CQkgcGFnZTBfZG1hOworCWludAkJCSBkYXRhX3N6OworCWludAkJCSBjb3B5X3N6OworCWludAkJCSByYzsKKworCS8qIEdldCBGQ1BvcnQgUGFnZSAwIGhlYWRlciAqLworCWhkci5QYWdlVmVyc2lvbiA9IDA7CisJaGRyLlBhZ2VMZW5ndGggPSAwOworCWhkci5QYWdlTnVtYmVyID0gMDsKKwloZHIuUGFnZVR5cGUgPSBNUElfQ09ORklHX1BBR0VUWVBFX0ZDX1BPUlQ7CisJY2ZnLmhkciA9ICZoZHI7CisJY2ZnLnBoeXNBZGRyID0gLTE7CisJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfSEVBREVSOworCWNmZy5kaXIgPSAwOworCWNmZy5wYWdlQWRkciA9IHBvcnRudW07CisJY2ZnLnRpbWVvdXQgPSAwOworCisJaWYgKChyYyA9IG1wdF9jb25maWcoaW9jLCAmY2ZnKSkgIT0gMCkKKwkJcmV0dXJuIHJjOworCisJaWYgKGhkci5QYWdlTGVuZ3RoID09IDApCisJCXJldHVybiAwOworCisJZGF0YV9zeiA9IGhkci5QYWdlTGVuZ3RoICogNDsKKwlyYyA9IC1FTk9NRU07CisJcHBhZ2UwX2FsbG9jID0gKEZDUG9ydFBhZ2UwX3QgKikgcGNpX2FsbG9jX2NvbnNpc3RlbnQoaW9jLT5wY2lkZXYsIGRhdGFfc3osICZwYWdlMF9kbWEpOworCWlmIChwcGFnZTBfYWxsb2MpIHsKKwkJbWVtc2V0KCh1OCAqKXBwYWdlMF9hbGxvYywgMCwgZGF0YV9zeik7CisJCWNmZy5waHlzQWRkciA9IHBhZ2UwX2RtYTsKKwkJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfUkVBRF9DVVJSRU5UOworCisJCWlmICgocmMgPSBtcHRfY29uZmlnKGlvYywgJmNmZykpID09IDApIHsKKwkJCS8qIHNhdmUgdGhlIGRhdGEgKi8KKwkJCXBwMGRlc3QgPSAmaW9jLT5mY19wb3J0X3BhZ2UwW3BvcnRudW1dOworCQkJY29weV9zeiA9IG1pbl90KGludCwgc2l6ZW9mKEZDUG9ydFBhZ2UwX3QpLCBkYXRhX3N6KTsKKwkJCW1lbWNweShwcDBkZXN0LCBwcGFnZTBfYWxsb2MsIGNvcHlfc3opOworCisJCQkvKgorCQkJICoJTm9ybWFsaXplIGVuZGlhbm5lc3Mgb2Ygc3RydWN0dXJlIGRhdGEsCisJCQkgKglieSBieXRlLXN3YXBwaW5nIGFsbCA+IDEgYnl0ZSBmaWVsZHMhCisJCQkgKi8KKwkJCXBwMGRlc3QtPkZsYWdzID0gbGUzMl90b19jcHUocHAwZGVzdC0+RmxhZ3MpOworCQkJcHAwZGVzdC0+UG9ydElkZW50aWZpZXIgPSBsZTMyX3RvX2NwdShwcDBkZXN0LT5Qb3J0SWRlbnRpZmllcik7CisJCQlwcDBkZXN0LT5XV05OLkxvdyA9IGxlMzJfdG9fY3B1KHBwMGRlc3QtPldXTk4uTG93KTsKKwkJCXBwMGRlc3QtPldXTk4uSGlnaCA9IGxlMzJfdG9fY3B1KHBwMGRlc3QtPldXTk4uSGlnaCk7CisJCQlwcDBkZXN0LT5XV1BOLkxvdyA9IGxlMzJfdG9fY3B1KHBwMGRlc3QtPldXUE4uTG93KTsKKwkJCXBwMGRlc3QtPldXUE4uSGlnaCA9IGxlMzJfdG9fY3B1KHBwMGRlc3QtPldXUE4uSGlnaCk7CisJCQlwcDBkZXN0LT5TdXBwb3J0ZWRTZXJ2aWNlQ2xhc3MgPSBsZTMyX3RvX2NwdShwcDBkZXN0LT5TdXBwb3J0ZWRTZXJ2aWNlQ2xhc3MpOworCQkJcHAwZGVzdC0+U3VwcG9ydGVkU3BlZWRzID0gbGUzMl90b19jcHUocHAwZGVzdC0+U3VwcG9ydGVkU3BlZWRzKTsKKwkJCXBwMGRlc3QtPkN1cnJlbnRTcGVlZCA9IGxlMzJfdG9fY3B1KHBwMGRlc3QtPkN1cnJlbnRTcGVlZCk7CisJCQlwcDBkZXN0LT5NYXhGcmFtZVNpemUgPSBsZTMyX3RvX2NwdShwcDBkZXN0LT5NYXhGcmFtZVNpemUpOworCQkJcHAwZGVzdC0+RmFicmljV1dOTi5Mb3cgPSBsZTMyX3RvX2NwdShwcDBkZXN0LT5GYWJyaWNXV05OLkxvdyk7CisJCQlwcDBkZXN0LT5GYWJyaWNXV05OLkhpZ2ggPSBsZTMyX3RvX2NwdShwcDBkZXN0LT5GYWJyaWNXV05OLkhpZ2gpOworCQkJcHAwZGVzdC0+RmFicmljV1dQTi5Mb3cgPSBsZTMyX3RvX2NwdShwcDBkZXN0LT5GYWJyaWNXV1BOLkxvdyk7CisJCQlwcDBkZXN0LT5GYWJyaWNXV1BOLkhpZ2ggPSBsZTMyX3RvX2NwdShwcDBkZXN0LT5GYWJyaWNXV1BOLkhpZ2gpOworCQkJcHAwZGVzdC0+RGlzY292ZXJlZFBvcnRzQ291bnQgPSBsZTMyX3RvX2NwdShwcDBkZXN0LT5EaXNjb3ZlcmVkUG9ydHNDb3VudCk7CisJCQlwcDBkZXN0LT5NYXhJbml0aWF0b3JzID0gbGUzMl90b19jcHUocHAwZGVzdC0+TWF4SW5pdGlhdG9ycyk7CisKKwkJfQorCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaW9jLT5wY2lkZXYsIGRhdGFfc3osICh1OCAqKSBwcGFnZTBfYWxsb2MsIHBhZ2UwX2RtYSk7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJR2V0SW9Vbml0UGFnZTIgLSBSZXRyaWV2ZSBCSU9TIHZlcnNpb24gYW5kIGJvb3Qgb3JkZXIgaW5mb3JtYXRpb24uCisgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQorICoKKyAqCVJldHVybnM6IDAgZm9yIHN1Y2Nlc3MKKyAqCS1FTk9NRU0gaWYgbm8gbWVtb3J5IGF2YWlsYWJsZQorICoJCS1FUEVSTSBpZiBub3QgYWxsb3dlZCBkdWUgdG8gSVNSIGNvbnRleHQKKyAqCQktRUFHQUlOIGlmIG5vIG1zZyBmcmFtZXMgY3VycmVudGx5IGF2YWlsYWJsZQorICoJCS1FRkFVTFQgZm9yIG5vbi1zdWNjZXNzZnVsIHJlcGx5IG9yIG5vIHJlcGx5ICh0aW1lb3V0KQorICovCitzdGF0aWMgaW50CitHZXRJb1VuaXRQYWdlMihNUFRfQURBUFRFUiAqaW9jKQoreworCUNvbmZpZ1BhZ2VIZWFkZXJfdAkgaGRyOworCUNPTkZJR1BBUk1TCQkgY2ZnOworCUlPVW5pdFBhZ2UyX3QJCSpwcGFnZV9hbGxvYzsKKwlkbWFfYWRkcl90CQkgcGFnZV9kbWE7CisJaW50CQkJIGRhdGFfc3o7CisJaW50CQkJIHJjOworCisJLyogR2V0IHRoZSBwYWdlIGhlYWRlciAqLworCWhkci5QYWdlVmVyc2lvbiA9IDA7CisJaGRyLlBhZ2VMZW5ndGggPSAwOworCWhkci5QYWdlTnVtYmVyID0gMjsKKwloZHIuUGFnZVR5cGUgPSBNUElfQ09ORklHX1BBR0VUWVBFX0lPX1VOSVQ7CisJY2ZnLmhkciA9ICZoZHI7CisJY2ZnLnBoeXNBZGRyID0gLTE7CisJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfSEVBREVSOworCWNmZy5kaXIgPSAwOworCWNmZy5wYWdlQWRkciA9IDA7CisJY2ZnLnRpbWVvdXQgPSAwOworCisJaWYgKChyYyA9IG1wdF9jb25maWcoaW9jLCAmY2ZnKSkgIT0gMCkKKwkJcmV0dXJuIHJjOworCisJaWYgKGhkci5QYWdlTGVuZ3RoID09IDApCisJCXJldHVybiAwOworCisJLyogUmVhZCB0aGUgY29uZmlnIHBhZ2UgKi8KKwlkYXRhX3N6ID0gaGRyLlBhZ2VMZW5ndGggKiA0OworCXJjID0gLUVOT01FTTsKKwlwcGFnZV9hbGxvYyA9IChJT1VuaXRQYWdlMl90ICopIHBjaV9hbGxvY19jb25zaXN0ZW50KGlvYy0+cGNpZGV2LCBkYXRhX3N6LCAmcGFnZV9kbWEpOworCWlmIChwcGFnZV9hbGxvYykgeworCQltZW1zZXQoKHU4ICopcHBhZ2VfYWxsb2MsIDAsIGRhdGFfc3opOworCQljZmcucGh5c0FkZHIgPSBwYWdlX2RtYTsKKwkJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfUkVBRF9DVVJSRU5UOworCisJCS8qIElmIEdvb2QsIHNhdmUgZGF0YSAqLworCQlpZiAoKHJjID0gbXB0X2NvbmZpZyhpb2MsICZjZmcpKSA9PSAwKQorCQkJaW9jLT5iaW9zVmVyc2lvbiA9IGxlMzJfdG9fY3B1KHBwYWdlX2FsbG9jLT5CaW9zVmVyc2lvbik7CisKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChpb2MtPnBjaWRldiwgZGF0YV9zeiwgKHU4ICopIHBwYWdlX2FsbG9jLCBwYWdlX2RtYSk7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgltcHRfR2V0U2NzaVBvcnRTZXR0aW5ncyAtIHJlYWQgU0NTSSBQb3J0IFBhZ2UgMCBhbmQgMgorICoJQGlvYzogUG9pbnRlciB0byBhIEFkYXB0ZXIgU3RydWN1dHJlCisgKglAcG9ydG51bTogSU9DIHBvcnQgbnVtYmVyCisgKgorICoJUmV0dXJuOiAtRUZBVUxUIGlmIHJlYWQgb2YgY29uZmlnIHBhZ2UgaGVhZGVyIGZhaWxzCisgKgkJCW9yIGlmIG5vIG52cmFtCisgKglJZiByZWFkIG9mIFNDU0kgUG9ydCBQYWdlIDAgZmFpbHMsCisgKgkJTlZSQU0gPSBNUFRfSE9TVF9OVlJBTV9JTlZBTElEICAoMHhGRkZGRkZGRikKKyAqCQlBZGFwdGVyIHNldHRpbmdzOiBhc3luYywgbmFycm93CisgKgkJUmV0dXJuIDEKKyAqCUlmIHJlYWQgb2YgU0NTSSBQb3J0IFBhZ2UgMiBmYWlscywKKyAqCQlBZGFwdGVyIHNldHRpbmdzIHZhbGlkCisgKgkJTlZSQU0gPSBNUFRfSE9TVF9OVlJBTV9JTlZBTElEICAoMHhGRkZGRkZGRikKKyAqCQlSZXR1cm4gMQorICoJRWxzZQorICoJCUJvdGggdmFsaWQKKyAqCQlSZXR1cm4gMAorICoJQ0hFQ0sgLSB3aGF0IHR5cGUgb2YgbG9ja2luZyBtZWNoYW5pc21zIHNob3VsZCBiZSB1c2VkPz8/PworICovCitzdGF0aWMgaW50CittcHRfR2V0U2NzaVBvcnRTZXR0aW5ncyhNUFRfQURBUFRFUiAqaW9jLCBpbnQgcG9ydG51bSkKK3sKKwl1OAkJCSpwYnVmOworCWRtYV9hZGRyX3QJCSBidWZfZG1hOworCUNPTkZJR1BBUk1TCQkgY2ZnOworCUNvbmZpZ1BhZ2VIZWFkZXJfdAkgaGVhZGVyOworCWludAkJCSBpaTsKKwlpbnQJCQkgZGF0YSwgcmMgPSAwOworCisJLyogQWxsb2NhdGUgbWVtb3J5CisJICovCisJaWYgKCFpb2MtPnNwaV9kYXRhLm52cmFtKSB7CisJCWludAkgc3o7CisJCXU4CSptZW07CisJCXN6ID0gTVBUX01BWF9TQ1NJX0RFVklDRVMgKiBzaXplb2YoaW50KTsKKwkJbWVtID0ga21hbGxvYyhzeiwgR0ZQX0FUT01JQyk7CisJCWlmIChtZW0gPT0gTlVMTCkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlvYy0+c3BpX2RhdGEubnZyYW0gPSAoaW50ICopIG1lbTsKKworCQlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJTQ1NJIGRldmljZSBOVlJBTSBzZXR0aW5ncyBAICVwLCBzej0lZFxuIiwKKwkJCWlvYy0+bmFtZSwgaW9jLT5zcGlfZGF0YS5udnJhbSwgc3opKTsKKwl9CisKKwkvKiBJbnZhbGlkYXRlIE5WUkFNIGluZm9ybWF0aW9uCisJICovCisJZm9yIChpaT0wOyBpaSA8IE1QVF9NQVhfU0NTSV9ERVZJQ0VTOyBpaSsrKSB7CisJCWlvYy0+c3BpX2RhdGEubnZyYW1baWldID0gTVBUX0hPU1RfTlZSQU1fSU5WQUxJRDsKKwl9CisKKwkvKiBSZWFkIFNQUDAgaGVhZGVyLCBhbGxvY2F0ZSBtZW1vcnksIHRoZW4gcmVhZCBwYWdlLgorCSAqLworCWhlYWRlci5QYWdlVmVyc2lvbiA9IDA7CisJaGVhZGVyLlBhZ2VMZW5ndGggPSAwOworCWhlYWRlci5QYWdlTnVtYmVyID0gMDsKKwloZWFkZXIuUGFnZVR5cGUgPSBNUElfQ09ORklHX1BBR0VUWVBFX1NDU0lfUE9SVDsKKwljZmcuaGRyID0gJmhlYWRlcjsKKwljZmcucGh5c0FkZHIgPSAtMTsKKwljZmcucGFnZUFkZHIgPSBwb3J0bnVtOworCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX0hFQURFUjsKKwljZmcuZGlyID0gMDsKKwljZmcudGltZW91dCA9IDA7CS8qIHVzZSBkZWZhdWx0ICovCisJaWYgKG1wdF9jb25maWcoaW9jLCAmY2ZnKSAhPSAwKQorCQkgcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoaGVhZGVyLlBhZ2VMZW5ndGggPiAwKSB7CisJCXBidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChpb2MtPnBjaWRldiwgaGVhZGVyLlBhZ2VMZW5ndGggKiA0LCAmYnVmX2RtYSk7CisJCWlmIChwYnVmKSB7CisJCQljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9SRUFEX0NVUlJFTlQ7CisJCQljZmcucGh5c0FkZHIgPSBidWZfZG1hOworCQkJaWYgKG1wdF9jb25maWcoaW9jLCAmY2ZnKSAhPSAwKSB7CisJCQkJaW9jLT5zcGlfZGF0YS5tYXhCdXNXaWR0aCA9IE1QVF9OQVJST1c7CisJCQkJaW9jLT5zcGlfZGF0YS5tYXhTeW5jT2Zmc2V0ID0gMDsKKwkJCQlpb2MtPnNwaV9kYXRhLm1pblN5bmNGYWN0b3IgPSBNUFRfQVNZTkM7CisJCQkJaW9jLT5zcGlfZGF0YS5idXNUeXBlID0gTVBUX0hPU1RfQlVTX1VOS05PV047CisJCQkJcmMgPSAxOworCQkJfSBlbHNlIHsKKwkJCQkvKiBTYXZlIHRoZSBQb3J0IFBhZ2UgMCBkYXRhCisJCQkJICovCisJCQkJU0NTSVBvcnRQYWdlMF90ICAqcFBQMCA9IChTQ1NJUG9ydFBhZ2UwX3QgICopIHBidWY7CisJCQkJcFBQMC0+Q2FwYWJpbGl0aWVzID0gbGUzMl90b19jcHUocFBQMC0+Q2FwYWJpbGl0aWVzKTsKKwkJCQlwUFAwLT5QaHlzaWNhbEludGVyZmFjZSA9IGxlMzJfdG9fY3B1KHBQUDAtPlBoeXNpY2FsSW50ZXJmYWNlKTsKKworCQkJCWlmICggKHBQUDAtPkNhcGFiaWxpdGllcyAmIE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9RQVMpID09IDAgKSB7CisJCQkJCWlvYy0+c3BpX2RhdGEubm9RYXMgfD0gTVBUX1RBUkdFVF9OT19ORUdPX1FBUzsKKwkJCQkJZGluaXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiIDolcyBub1FhcyBkdWUgdG8gQ2FwYWJpbGl0aWVzPSV4XG4iLAorCQkJCQkJaW9jLT5uYW1lLCBwUFAwLT5DYXBhYmlsaXRpZXMpKTsKKwkJCQl9CisJCQkJaW9jLT5zcGlfZGF0YS5tYXhCdXNXaWR0aCA9IHBQUDAtPkNhcGFiaWxpdGllcyAmIE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9XSURFID8gMSA6IDA7CisJCQkJZGF0YSA9IHBQUDAtPkNhcGFiaWxpdGllcyAmIE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9NQVhfU1lOQ19PRkZTRVRfTUFTSzsKKwkJCQlpZiAoZGF0YSkgeworCQkJCQlpb2MtPnNwaV9kYXRhLm1heFN5bmNPZmZzZXQgPSAodTgpIChkYXRhID4+IDE2KTsKKwkJCQkJZGF0YSA9IHBQUDAtPkNhcGFiaWxpdGllcyAmIE1QSV9TQ1NJUE9SVFBBR0UwX0NBUF9NSU5fU1lOQ19QRVJJT0RfTUFTSzsKKwkJCQkJaW9jLT5zcGlfZGF0YS5taW5TeW5jRmFjdG9yID0gKHU4KSAoZGF0YSA+PiA4KTsKKwkJCQl9IGVsc2UgeworCQkJCQlpb2MtPnNwaV9kYXRhLm1heFN5bmNPZmZzZXQgPSAwOworCQkJCQlpb2MtPnNwaV9kYXRhLm1pblN5bmNGYWN0b3IgPSBNUFRfQVNZTkM7CisJCQkJfQorCisJCQkJaW9jLT5zcGlfZGF0YS5idXNUeXBlID0gcFBQMC0+UGh5c2ljYWxJbnRlcmZhY2UgJiBNUElfU0NTSVBPUlRQQUdFMF9QSFlfU0lHTkFMX1RZUEVfTUFTSzsKKworCQkJCS8qIFVwZGF0ZSB0aGUgbWluU3luY0ZhY3RvciBiYXNlZCBvbiBidXMgdHlwZS4KKwkJCQkgKi8KKwkJCQlpZiAoKGlvYy0+c3BpX2RhdGEuYnVzVHlwZSA9PSBNUElfU0NTSVBPUlRQQUdFMF9QSFlfU0lHTkFMX0hWRCkgfHwKKwkJCQkJKGlvYy0+c3BpX2RhdGEuYnVzVHlwZSA9PSBNUElfU0NTSVBPUlRQQUdFMF9QSFlfU0lHTkFMX1NFKSkgIHsKKworCQkJCQlpZiAoaW9jLT5zcGlfZGF0YS5taW5TeW5jRmFjdG9yIDwgTVBUX1VMVFJBKQorCQkJCQkJaW9jLT5zcGlfZGF0YS5taW5TeW5jRmFjdG9yID0gTVBUX1VMVFJBOworCQkJCX0KKwkJCX0KKwkJCWlmIChwYnVmKSB7CisJCQkJcGNpX2ZyZWVfY29uc2lzdGVudChpb2MtPnBjaWRldiwgaGVhZGVyLlBhZ2VMZW5ndGggKiA0LCBwYnVmLCBidWZfZG1hKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFNDU0kgUG9ydCBQYWdlIDIgLSBSZWFkIHRoZSBoZWFkZXIgdGhlbiB0aGUgcGFnZS4KKwkgKi8KKwloZWFkZXIuUGFnZVZlcnNpb24gPSAwOworCWhlYWRlci5QYWdlTGVuZ3RoID0gMDsKKwloZWFkZXIuUGFnZU51bWJlciA9IDI7CisJaGVhZGVyLlBhZ2VUeXBlID0gTVBJX0NPTkZJR19QQUdFVFlQRV9TQ1NJX1BPUlQ7CisJY2ZnLmhkciA9ICZoZWFkZXI7CisJY2ZnLnBoeXNBZGRyID0gLTE7CisJY2ZnLnBhZ2VBZGRyID0gcG9ydG51bTsKKwljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9IRUFERVI7CisJY2ZnLmRpciA9IDA7CisJaWYgKG1wdF9jb25maWcoaW9jLCAmY2ZnKSAhPSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChoZWFkZXIuUGFnZUxlbmd0aCA+IDApIHsKKwkJLyogQWxsb2NhdGUgbWVtb3J5IGFuZCByZWFkIFNDU0kgUG9ydCBQYWdlIDIKKwkJICovCisJCXBidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChpb2MtPnBjaWRldiwgaGVhZGVyLlBhZ2VMZW5ndGggKiA0LCAmYnVmX2RtYSk7CisJCWlmIChwYnVmKSB7CisJCQljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9SRUFEX05WUkFNOworCQkJY2ZnLnBoeXNBZGRyID0gYnVmX2RtYTsKKwkJCWlmIChtcHRfY29uZmlnKGlvYywgJmNmZykgIT0gMCkgeworCQkJCS8qIE52cmFtIGRhdGEgaXMgbGVmdCB3aXRoIElOVkFMSUQgbWFyaworCQkJCSAqLworCQkJCXJjID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJU0NTSVBvcnRQYWdlMl90ICpwUFAyID0gKFNDU0lQb3J0UGFnZTJfdCAgKikgcGJ1ZjsKKwkJCQlNcGlEZXZpY2VJbmZvX3QJKnBkZXZpY2UgPSBOVUxMOworCisJCQkJLyogU2F2ZSB0aGUgUG9ydCBQYWdlIDIgZGF0YQorCQkJCSAqIChyZWZvcm1hdCBpbnRvIGEgMzJiaXQgcXVhbnRpdHkpCisJCQkJICovCisJCQkJZGF0YSA9IGxlMzJfdG9fY3B1KHBQUDItPlBvcnRGbGFncykgJiBNUElfU0NTSVBPUlRQQUdFMl9QT1JUX0ZMQUdTX0RWX01BU0s7CisJCQkJaW9jLT5zcGlfZGF0YS5Qb3J0RmxhZ3MgPSBkYXRhOworCQkJCWZvciAoaWk9MDsgaWkgPCBNUFRfTUFYX1NDU0lfREVWSUNFUzsgaWkrKykgeworCQkJCQlwZGV2aWNlID0gJnBQUDItPkRldmljZVNldHRpbmdzW2lpXTsKKwkJCQkJZGF0YSA9IChsZTE2X3RvX2NwdShwZGV2aWNlLT5EZXZpY2VGbGFncykgPDwgMTYpIHwKKwkJCQkJCShwZGV2aWNlLT5TeW5jRmFjdG9yIDw8IDgpIHwgcGRldmljZS0+VGltZW91dDsKKwkJCQkJaW9jLT5zcGlfZGF0YS5udnJhbVtpaV0gPSBkYXRhOworCQkJCX0KKwkJCX0KKworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChpb2MtPnBjaWRldiwgaGVhZGVyLlBhZ2VMZW5ndGggKiA0LCBwYnVmLCBidWZfZG1hKTsKKwkJfQorCX0KKworCS8qIFVwZGF0ZSBBZGFwdGVyIGxpbWl0cyB3aXRoIHRob3NlIGZyb20gTlZSQU0KKwkgKiBDb21tZW50OiBEb24ndCBuZWVkIHRvIGRvIHRoaXMuIFRhcmdldCBwZXJmb3JtYW5jZQorCSAqIHBhcmFtZXRlcnMgd2lsbCBuZXZlciBleGNlZWQgdGhlIGFkYXB0ZXJzIGxpbWl0cy4KKwkgKi8KKworCXJldHVybiByYzsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoJbXB0X3JlYWRTY3NpRGV2aWNlUGFnZUhlYWRlcnMgLSBzYXZlIHZlcnNpb24gYW5kIGxlbmd0aCBvZiBTRFAxCisgKglAaW9jOiBQb2ludGVyIHRvIGEgQWRhcHRlciBTdHJ1Y3V0cmUKKyAqCUBwb3J0bnVtOiBJT0MgcG9ydCBudW1iZXIKKyAqCisgKglSZXR1cm46IC1FRkFVTFQgaWYgcmVhZCBvZiBjb25maWcgcGFnZSBoZWFkZXIgZmFpbHMKKyAqCQlvciAwIGlmIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK21wdF9yZWFkU2NzaURldmljZVBhZ2VIZWFkZXJzKE1QVF9BREFQVEVSICppb2MsIGludCBwb3J0bnVtKQoreworCUNPTkZJR1BBUk1TCQkgY2ZnOworCUNvbmZpZ1BhZ2VIZWFkZXJfdAkgaGVhZGVyOworCisJLyogUmVhZCB0aGUgU0NTSSBEZXZpY2UgUGFnZSAxIGhlYWRlcgorCSAqLworCWhlYWRlci5QYWdlVmVyc2lvbiA9IDA7CisJaGVhZGVyLlBhZ2VMZW5ndGggPSAwOworCWhlYWRlci5QYWdlTnVtYmVyID0gMTsKKwloZWFkZXIuUGFnZVR5cGUgPSBNUElfQ09ORklHX1BBR0VUWVBFX1NDU0lfREVWSUNFOworCWNmZy5oZHIgPSAmaGVhZGVyOworCWNmZy5waHlzQWRkciA9IC0xOworCWNmZy5wYWdlQWRkciA9IHBvcnRudW07CisJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfSEVBREVSOworCWNmZy5kaXIgPSAwOworCWNmZy50aW1lb3V0ID0gMDsKKwlpZiAobXB0X2NvbmZpZyhpb2MsICZjZmcpICE9IDApCisJCSByZXR1cm4gLUVGQVVMVDsKKworCWlvYy0+c3BpX2RhdGEuc2RwMXZlcnNpb24gPSBjZmcuaGRyLT5QYWdlVmVyc2lvbjsKKwlpb2MtPnNwaV9kYXRhLnNkcDFsZW5ndGggPSBjZmcuaGRyLT5QYWdlTGVuZ3RoOworCisJaGVhZGVyLlBhZ2VWZXJzaW9uID0gMDsKKwloZWFkZXIuUGFnZUxlbmd0aCA9IDA7CisJaGVhZGVyLlBhZ2VOdW1iZXIgPSAwOworCWhlYWRlci5QYWdlVHlwZSA9IE1QSV9DT05GSUdfUEFHRVRZUEVfU0NTSV9ERVZJQ0U7CisJaWYgKG1wdF9jb25maWcoaW9jLCAmY2ZnKSAhPSAwKQorCQkgcmV0dXJuIC1FRkFVTFQ7CisKKwlpb2MtPnNwaV9kYXRhLnNkcDB2ZXJzaW9uID0gY2ZnLmhkci0+UGFnZVZlcnNpb247CisJaW9jLT5zcGlfZGF0YS5zZHAwbGVuZ3RoID0gY2ZnLmhkci0+UGFnZUxlbmd0aDsKKworCWRjcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJIZWFkZXJzOiAwOiB2ZXJzaW9uICVkIGxlbmd0aCAlZFxuIiwKKwkJCWlvYy0+bmFtZSwgaW9jLT5zcGlfZGF0YS5zZHAwdmVyc2lvbiwgaW9jLT5zcGlfZGF0YS5zZHAwbGVuZ3RoKSk7CisKKwlkY3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiSGVhZGVyczogMTogdmVyc2lvbiAlZCBsZW5ndGggJWRcbiIsCisJCQlpb2MtPm5hbWUsIGlvYy0+c3BpX2RhdGEuc2RwMXZlcnNpb24sIGlvYy0+c3BpX2RhdGEuc2RwMWxlbmd0aCkpOworCXJldHVybiAwOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKioKKyAqCW1wdF9maW5kSW1Wb2x1bWVzIC0gSWRlbnRpZnkgSURzIG9mIGhpZGRlbiBkaXNrcyBhbmQgUkFJRCBWb2x1bWVzCisgKglAaW9jOiBQb2ludGVyIHRvIGEgQWRhcHRlciBTdHJ1Y3V0cmUKKyAqCUBwb3J0bnVtOiBJT0MgcG9ydCBudW1iZXIKKyAqCisgKglSZXR1cm46CisgKgkwIG9uIHN1Y2Nlc3MKKyAqCS1FRkFVTFQgaWYgcmVhZCBvZiBjb25maWcgcGFnZSBoZWFkZXIgZmFpbHMgb3IgZGF0YSBwb2ludGVyIG5vdCBOVUxMCisgKgktRU5PTUVNIGlmIHBjaV9hbGxvYyBmYWlsZWQKKyAqLworaW50CittcHRfZmluZEltVm9sdW1lcyhNUFRfQURBUFRFUiAqaW9jKQoreworCUlPQ1BhZ2UyX3QJCSpwSW9jMjsKKwl1OAkJCSptZW07CisJQ29uZmlnUGFnZUlvYzJSYWlkVm9sX3QJKnBJb2NSdjsKKwlkbWFfYWRkcl90CQkgaW9jMl9kbWE7CisJQ09ORklHUEFSTVMJCSBjZmc7CisJQ29uZmlnUGFnZUhlYWRlcl90CSBoZWFkZXI7CisJaW50CQkJIGpqOworCWludAkJCSByYyA9IDA7CisJaW50CQkJIGlvY3BhZ2Uyc3o7CisJdTgJCQkgblZvbHMsIG5QaHlzOworCXU4CQkJIHZpZCwgdmJ1cywgdmlvYzsKKworCS8qIFJlYWQgSU9DUDIgaGVhZGVyIHRoZW4gdGhlIHBhZ2UuCisJICovCisJaGVhZGVyLlBhZ2VWZXJzaW9uID0gMDsKKwloZWFkZXIuUGFnZUxlbmd0aCA9IDA7CisJaGVhZGVyLlBhZ2VOdW1iZXIgPSAyOworCWhlYWRlci5QYWdlVHlwZSA9IE1QSV9DT05GSUdfUEFHRVRZUEVfSU9DOworCWNmZy5oZHIgPSAmaGVhZGVyOworCWNmZy5waHlzQWRkciA9IC0xOworCWNmZy5wYWdlQWRkciA9IDA7CisJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfSEVBREVSOworCWNmZy5kaXIgPSAwOworCWNmZy50aW1lb3V0ID0gMDsKKwlpZiAobXB0X2NvbmZpZyhpb2MsICZjZmcpICE9IDApCisJCSByZXR1cm4gLUVGQVVMVDsKKworCWlmIChoZWFkZXIuUGFnZUxlbmd0aCA9PSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlvY3BhZ2Uyc3ogPSBoZWFkZXIuUGFnZUxlbmd0aCAqIDQ7CisJcElvYzIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChpb2MtPnBjaWRldiwgaW9jcGFnZTJzeiwgJmlvYzJfZG1hKTsKKwlpZiAoIXBJb2MyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX1JFQURfQ1VSUkVOVDsKKwljZmcucGh5c0FkZHIgPSBpb2MyX2RtYTsKKwlpZiAobXB0X2NvbmZpZyhpb2MsICZjZmcpICE9IDApCisJCWdvdG8gZG9uZV9hbmRfZnJlZTsKKworCWlmICggKG1lbSA9ICh1OCAqKWlvYy0+c3BpX2RhdGEucElvY1BnMikgPT0gTlVMTCApIHsKKwkJbWVtID0ga21hbGxvYyhpb2NwYWdlMnN6LCBHRlBfQVRPTUlDKTsKKwkJaWYgKG1lbSkgeworCQkJaW9jLT5zcGlfZGF0YS5wSW9jUGcyID0gKElPQ1BhZ2UyX3QgKikgbWVtOworCQl9IGVsc2UgeworCQkJZ290byBkb25lX2FuZF9mcmVlOworCQl9CisJfQorCW1lbWNweShtZW0sICh1OCAqKXBJb2MyLCBpb2NwYWdlMnN6KTsKKworCS8qIElkZW50aWZ5IFJBSUQgVm9sdW1lIElkJ3MgKi8KKwluVm9scyA9IHBJb2MyLT5OdW1BY3RpdmVWb2x1bWVzOworCWlmICggblZvbHMgPT0gMCkgeworCQkvKiBObyBSQUlEIFZvbHVtZS4KKwkJICovCisJCWdvdG8gZG9uZV9hbmRfZnJlZTsKKwl9IGVsc2UgeworCQkvKiBBdCBsZWFzdCAxIFJBSUQgVm9sdW1lCisJCSAqLworCQlwSW9jUnYgPSBwSW9jMi0+UmFpZFZvbHVtZTsKKwkJaW9jLT5zcGlfZGF0YS5pc1JhaWQgPSAwOworCQlmb3IgKGpqID0gMDsgamogPCBuVm9sczsgamorKywgcElvY1J2KyspIHsKKwkJCXZpZCA9IHBJb2NSdi0+Vm9sdW1lSUQ7CisJCQl2YnVzID0gcElvY1J2LT5Wb2x1bWVCdXM7CisJCQl2aW9jID0gcElvY1J2LT5Wb2x1bWVJT0M7CisKKwkJCS8qIGZpbmQgdGhlIG1hdGNoCisJCQkgKi8KKwkJCWlmICh2YnVzID09IDApIHsKKwkJCQlpb2MtPnNwaV9kYXRhLmlzUmFpZCB8PSAoMSA8PCB2aWQpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBFcnJvciEgQWx3YXlzIGJ1cyAwCisJCQkJICovCisJCQl9CisJCX0KKwl9CisKKwkvKiBJZGVudGlmeSBIaWRkZW4gUGh5c2ljYWwgRGlzayBJZCdzICovCisJblBoeXMgPSBwSW9jMi0+TnVtQWN0aXZlUGh5c0Rpc2tzOworCWlmIChuUGh5cyA9PSAwKSB7CisJCS8qIE5vIHBoeXNpY2FsIGRpc2tzLgorCQkgKi8KKwl9IGVsc2UgeworCQltcHRfcmVhZF9pb2NfcGdfMyhpb2MpOworCX0KKworZG9uZV9hbmRfZnJlZToKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGlvYy0+cGNpZGV2LCBpb2NwYWdlMnN6LCBwSW9jMiwgaW9jMl9kbWEpOworCisJcmV0dXJuIHJjOworfQorCitpbnQKK21wdF9yZWFkX2lvY19wZ18zKE1QVF9BREFQVEVSICppb2MpCit7CisJSU9DUGFnZTNfdAkJKnBJb2MzOworCXU4CQkJKm1lbTsKKwlDT05GSUdQQVJNUwkJIGNmZzsKKwlDb25maWdQYWdlSGVhZGVyX3QJIGhlYWRlcjsKKwlkbWFfYWRkcl90CQkgaW9jM19kbWE7CisJaW50CQkJIGlvY3BhZ2Uzc3ogPSAwOworCisJLyogRnJlZSB0aGUgb2xkIHBhZ2UKKwkgKi8KKwlpZiAoaW9jLT5zcGlfZGF0YS5wSW9jUGczKSB7CisJCWtmcmVlKGlvYy0+c3BpX2RhdGEucElvY1BnMyk7CisJCWlvYy0+c3BpX2RhdGEucElvY1BnMyA9IE5VTEw7CisJfQorCisJLyogVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHBoeXNpY2FsIGRpc2suCisJICogUmVhZCBhbmQgc2F2ZSBJT0MgUGFnZSAzCisJICovCisJaGVhZGVyLlBhZ2VWZXJzaW9uID0gMDsKKwloZWFkZXIuUGFnZUxlbmd0aCA9IDA7CisJaGVhZGVyLlBhZ2VOdW1iZXIgPSAzOworCWhlYWRlci5QYWdlVHlwZSA9IE1QSV9DT05GSUdfUEFHRVRZUEVfSU9DOworCWNmZy5oZHIgPSAmaGVhZGVyOworCWNmZy5waHlzQWRkciA9IC0xOworCWNmZy5wYWdlQWRkciA9IDA7CisJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfSEVBREVSOworCWNmZy5kaXIgPSAwOworCWNmZy50aW1lb3V0ID0gMDsKKwlpZiAobXB0X2NvbmZpZyhpb2MsICZjZmcpICE9IDApCisJCXJldHVybiAwOworCisJaWYgKGhlYWRlci5QYWdlTGVuZ3RoID09IDApCisJCXJldHVybiAwOworCisJLyogUmVhZCBIZWFkZXIgZ29vZCwgYWxsb2MgbWVtb3J5CisJICovCisJaW9jcGFnZTNzeiA9IGhlYWRlci5QYWdlTGVuZ3RoICogNDsKKwlwSW9jMyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGlvYy0+cGNpZGV2LCBpb2NwYWdlM3N6LCAmaW9jM19kbWEpOworCWlmICghcElvYzMpCisJCXJldHVybiAwOworCisJLyogUmVhZCB0aGUgUGFnZSBhbmQgc2F2ZSB0aGUgZGF0YQorCSAqIGludG8gbWFsbG9jJ2QgbWVtb3J5LgorCSAqLworCWNmZy5waHlzQWRkciA9IGlvYzNfZG1hOworCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX1JFQURfQ1VSUkVOVDsKKwlpZiAobXB0X2NvbmZpZyhpb2MsICZjZmcpID09IDApIHsKKwkJbWVtID0ga21hbGxvYyhpb2NwYWdlM3N6LCBHRlBfQVRPTUlDKTsKKwkJaWYgKG1lbSkgeworCQkJbWVtY3B5KG1lbSwgKHU4ICopcElvYzMsIGlvY3BhZ2Uzc3opOworCQkJaW9jLT5zcGlfZGF0YS5wSW9jUGczID0gKElPQ1BhZ2UzX3QgKikgbWVtOworCQl9CisJfQorCisJcGNpX2ZyZWVfY29uc2lzdGVudChpb2MtPnBjaWRldiwgaW9jcGFnZTNzeiwgcElvYzMsIGlvYzNfZG1hKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbXB0X3JlYWRfaW9jX3BnXzQoTVBUX0FEQVBURVIgKmlvYykKK3sKKwlJT0NQYWdlNF90CQkqcElvYzQ7CisJQ09ORklHUEFSTVMJCSBjZmc7CisJQ29uZmlnUGFnZUhlYWRlcl90CSBoZWFkZXI7CisJZG1hX2FkZHJfdAkJIGlvYzRfZG1hOworCWludAkJCSBpb2NwYWdlNHN6OworCisJLyogUmVhZCBhbmQgc2F2ZSBJT0MgUGFnZSA0CisJICovCisJaGVhZGVyLlBhZ2VWZXJzaW9uID0gMDsKKwloZWFkZXIuUGFnZUxlbmd0aCA9IDA7CisJaGVhZGVyLlBhZ2VOdW1iZXIgPSA0OworCWhlYWRlci5QYWdlVHlwZSA9IE1QSV9DT05GSUdfUEFHRVRZUEVfSU9DOworCWNmZy5oZHIgPSAmaGVhZGVyOworCWNmZy5waHlzQWRkciA9IC0xOworCWNmZy5wYWdlQWRkciA9IDA7CisJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfSEVBREVSOworCWNmZy5kaXIgPSAwOworCWNmZy50aW1lb3V0ID0gMDsKKwlpZiAobXB0X2NvbmZpZyhpb2MsICZjZmcpICE9IDApCisJCXJldHVybjsKKworCWlmIChoZWFkZXIuUGFnZUxlbmd0aCA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAoIChwSW9jNCA9IGlvYy0+c3BpX2RhdGEucElvY1BnNCkgPT0gTlVMTCApIHsKKwkJaW9jcGFnZTRzeiA9IChoZWFkZXIuUGFnZUxlbmd0aCArIDQpICogNDsgLyogQWxsb3cgNCBhZGRpdGlvbmFsIFNFUCdzICovCisJCXBJb2M0ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaW9jLT5wY2lkZXYsIGlvY3BhZ2U0c3osICZpb2M0X2RtYSk7CisJCWlmICghcElvYzQpCisJCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJaW9jNF9kbWEgPSBpb2MtPnNwaV9kYXRhLklvY1BnNF9kbWE7CisJCWlvY3BhZ2U0c3ogPSBpb2MtPnNwaV9kYXRhLklvY1BnNFN6OworCX0KKworCS8qIFJlYWQgdGhlIFBhZ2UgaW50byBkbWEgbWVtb3J5LgorCSAqLworCWNmZy5waHlzQWRkciA9IGlvYzRfZG1hOworCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX1JFQURfQ1VSUkVOVDsKKwlpZiAobXB0X2NvbmZpZyhpb2MsICZjZmcpID09IDApIHsKKwkJaW9jLT5zcGlfZGF0YS5wSW9jUGc0ID0gKElPQ1BhZ2U0X3QgKikgcElvYzQ7CisJCWlvYy0+c3BpX2RhdGEuSW9jUGc0X2RtYSA9IGlvYzRfZG1hOworCQlpb2MtPnNwaV9kYXRhLklvY1BnNFN6ID0gaW9jcGFnZTRzejsKKwl9IGVsc2UgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGlvYy0+cGNpZGV2LCBpb2NwYWdlNHN6LCBwSW9jNCwgaW9jNF9kbWEpOworCQlpb2MtPnNwaV9kYXRhLnBJb2NQZzQgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQKK21wdF9yZWFkX2lvY19wZ18xKE1QVF9BREFQVEVSICppb2MpCit7CisJSU9DUGFnZTFfdAkJKnBJb2MxOworCUNPTkZJR1BBUk1TCQkgY2ZnOworCUNvbmZpZ1BhZ2VIZWFkZXJfdAkgaGVhZGVyOworCWRtYV9hZGRyX3QJCSBpb2MxX2RtYTsKKwlpbnQJCQkgaW9jcGFnZTFzeiA9IDA7CisJdTMyCQkJIHRtcDsKKworCS8qIENoZWNrIHRoZSBDb2FsZXNjaW5nIFRpbWVvdXQgaW4gSU9DIFBhZ2UgMQorCSAqLworCWhlYWRlci5QYWdlVmVyc2lvbiA9IDA7CisJaGVhZGVyLlBhZ2VMZW5ndGggPSAwOworCWhlYWRlci5QYWdlTnVtYmVyID0gMTsKKwloZWFkZXIuUGFnZVR5cGUgPSBNUElfQ09ORklHX1BBR0VUWVBFX0lPQzsKKwljZmcuaGRyID0gJmhlYWRlcjsKKwljZmcucGh5c0FkZHIgPSAtMTsKKwljZmcucGFnZUFkZHIgPSAwOworCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX0hFQURFUjsKKwljZmcuZGlyID0gMDsKKwljZmcudGltZW91dCA9IDA7CisJaWYgKG1wdF9jb25maWcoaW9jLCAmY2ZnKSAhPSAwKQorCQlyZXR1cm47CisKKwlpZiAoaGVhZGVyLlBhZ2VMZW5ndGggPT0gMCkKKwkJcmV0dXJuOworCisJLyogUmVhZCBIZWFkZXIgZ29vZCwgYWxsb2MgbWVtb3J5CisJICovCisJaW9jcGFnZTFzeiA9IGhlYWRlci5QYWdlTGVuZ3RoICogNDsKKwlwSW9jMSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGlvYy0+cGNpZGV2LCBpb2NwYWdlMXN6LCAmaW9jMV9kbWEpOworCWlmICghcElvYzEpCisJCXJldHVybjsKKworCS8qIFJlYWQgdGhlIFBhZ2UgYW5kIGNoZWNrIGNvYWxlc2NpbmcgdGltZW91dAorCSAqLworCWNmZy5waHlzQWRkciA9IGlvYzFfZG1hOworCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX1JFQURfQ1VSUkVOVDsKKwlpZiAobXB0X2NvbmZpZyhpb2MsICZjZmcpID09IDApIHsKKwkJCisJCXRtcCA9IGxlMzJfdG9fY3B1KHBJb2MxLT5GbGFncykgJiBNUElfSU9DUEFHRTFfUkVQTFlfQ09BTEVTQ0lORzsKKwkJaWYgKHRtcCA9PSBNUElfSU9DUEFHRTFfUkVQTFlfQ09BTEVTQ0lORykgeworCQkJdG1wID0gbGUzMl90b19jcHUocElvYzEtPkNvYWxlc2NpbmdUaW1lb3V0KTsKKworCQkJZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiQ29hbGVzY2luZyBFbmFibGVkIFRpbWVvdXQgPSAlZFxuIiwKKwkJCQkJaW9jLT5uYW1lLCB0bXApKTsKKworCQkJaWYgKHRtcCA+IE1QVF9DT0FMRVNDSU5HX1RJTUVPVVQpIHsKKwkJCQlwSW9jMS0+Q29hbGVzY2luZ1RpbWVvdXQgPSBjcHVfdG9fbGUzMihNUFRfQ09BTEVTQ0lOR19USU1FT1VUKTsKKworCQkJCS8qIFdyaXRlIE5WUkFNIGFuZCBjdXJyZW50CisJCQkJICovCisJCQkJY2ZnLmRpciA9IDE7CisJCQkJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfV1JJVEVfQ1VSUkVOVDsKKwkJCQlpZiAobXB0X2NvbmZpZyhpb2MsICZjZmcpID09IDApIHsKKwkJCQkJZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiUmVzZXQgQ3VycmVudCBDb2FsZXNjaW5nIFRpbWVvdXQgdG8gPSAlZFxuIiwKKwkJCQkJCQlpb2MtPm5hbWUsIE1QVF9DT0FMRVNDSU5HX1RJTUVPVVQpKTsKKworCQkJCQljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9XUklURV9OVlJBTTsKKwkJCQkJaWYgKG1wdF9jb25maWcoaW9jLCAmY2ZnKSA9PSAwKSB7CisJCQkJCQlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJSZXNldCBOVlJBTSBDb2FsZXNjaW5nIFRpbWVvdXQgdG8gPSAlZFxuIiwKKwkJCQkJCQkJaW9jLT5uYW1lLCBNUFRfQ09BTEVTQ0lOR19USU1FT1VUKSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJSZXNldCBOVlJBTSBDb2FsZXNjaW5nIFRpbWVvdXQgRmFpbGVkXG4iLAorCQkJCQkJCQkJaW9jLT5uYW1lKSk7CisJCQkJCX0KKworCQkJCX0gZWxzZSB7CisJCQkJCWRwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIlJlc2V0IG9mIEN1cnJlbnQgQ29hbGVzY2luZyBUaW1lb3V0IEZhaWxlZCFcbiIsCisJCQkJCQkJCWlvYy0+bmFtZSkpOworCQkJCX0KKwkJCX0KKworCQl9IGVsc2UgeworCQkJZHByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiQ29hbGVzY2luZyBEaXNhYmxlZFxuIiwgaW9jLT5uYW1lKSk7CisJCX0KKwl9CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGlvYy0+cGNpZGV2LCBpb2NwYWdlMXN6LCBwSW9jMSwgaW9jMV9kbWEpOworCisJcmV0dXJuOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJU2VuZEV2ZW50Tm90aWZpY2F0aW9uIC0gU2VuZCBFdmVudE5vdGlmaWNhdGlvbiAob24gb3Igb2ZmKSByZXF1ZXN0CisgKgl0byBNUFQgYWRhcHRlci4KKyAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCisgKglARXZTd2l0Y2g6IEV2ZW50IHN3aXRjaCBmbGFncworICovCitzdGF0aWMgaW50CitTZW5kRXZlbnROb3RpZmljYXRpb24oTVBUX0FEQVBURVIgKmlvYywgdTggRXZTd2l0Y2gpCit7CisJRXZlbnROb3RpZmljYXRpb25fdAkqZXZucDsKKworCWV2bnAgPSAoRXZlbnROb3RpZmljYXRpb25fdCAqKSBtcHRfZ2V0X21zZ19mcmFtZShtcHRfYmFzZV9pbmRleCwgaW9jKTsKKwlpZiAoZXZucCA9PSBOVUxMKSB7CisJCWRwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIlVuYWJsZSB0byBhbGxvY2F0ZSBldmVudCByZXF1ZXN0IGZyYW1lIVxuIiwKKwkJCQlpb2MtPm5hbWUpKTsKKwkJcmV0dXJuIDA7CisJfQorCW1lbXNldChldm5wLCAwLCBzaXplb2YoKmV2bnApKTsKKworCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlNlbmRpbmcgRXZlbnROb3RpZmljYXRpb24oJWQpXG4iLCBpb2MtPm5hbWUsIEV2U3dpdGNoKSk7CisKKwlldm5wLT5GdW5jdGlvbiA9IE1QSV9GVU5DVElPTl9FVkVOVF9OT1RJRklDQVRJT047CisJZXZucC0+Q2hhaW5PZmZzZXQgPSAwOworCWV2bnAtPk1zZ0ZsYWdzID0gMDsKKwlldm5wLT5Td2l0Y2ggPSBFdlN3aXRjaDsKKworCW1wdF9wdXRfbXNnX2ZyYW1lKG1wdF9iYXNlX2luZGV4LCBpb2MsIChNUFRfRlJBTUVfSERSICopZXZucCk7CisKKwlyZXR1cm4gMDsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoqCisgKglTZW5kRXZlbnRBY2sgLSBTZW5kIEV2ZW50QWNrIHJlcXVlc3QgdG8gTVBUIGFkYXB0ZXIuCisgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQorICoJQGV2bnA6IFBvaW50ZXIgdG8gb3JpZ2luYWwgRXZlbnROb3RpZmljYXRpb24gcmVxdWVzdAorICovCitzdGF0aWMgaW50CitTZW5kRXZlbnRBY2soTVBUX0FEQVBURVIgKmlvYywgRXZlbnROb3RpZmljYXRpb25SZXBseV90ICpldm5wKQoreworCUV2ZW50QWNrX3QJKnBBY2s7CisKKwlpZiAoKHBBY2sgPSAoRXZlbnRBY2tfdCAqKSBtcHRfZ2V0X21zZ19mcmFtZShtcHRfYmFzZV9pbmRleCwgaW9jKSkgPT0gTlVMTCkgeworCQlwcmludGsoTVlJT0Nfc19XQVJOX0ZNVCAiVW5hYmxlIHRvIGFsbG9jYXRlIGV2ZW50IEFDSyByZXF1ZXN0IGZyYW1lIVxuIiwKKwkJCQlpb2MtPm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbXNldChwQWNrLCAwLCBzaXplb2YoKnBBY2spKTsKKworCWRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlNlbmRpbmcgRXZlbnRBY2tcbiIsIGlvYy0+bmFtZSkpOworCisJcEFjay0+RnVuY3Rpb24gICAgID0gTVBJX0ZVTkNUSU9OX0VWRU5UX0FDSzsKKwlwQWNrLT5DaGFpbk9mZnNldCAgPSAwOworCXBBY2stPk1zZ0ZsYWdzICAgICA9IDA7CisJcEFjay0+RXZlbnQgICAgICAgID0gZXZucC0+RXZlbnQ7CisJcEFjay0+RXZlbnRDb250ZXh0ID0gZXZucC0+RXZlbnRDb250ZXh0OworCisJbXB0X3B1dF9tc2dfZnJhbWUobXB0X2Jhc2VfaW5kZXgsIGlvYywgKE1QVF9GUkFNRV9IRFIgKilwQWNrKTsKKworCXJldHVybiAwOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKioKKyAqCW1wdF9jb25maWcgLSBHZW5lcmljIGZ1bmN0aW9uIHRvIGlzc3VlIGNvbmZpZyBtZXNzYWdlCisgKglAaW9jIC0gUG9pbnRlciB0byBhbiBhZGFwdGVyIHN0cnVjdHVyZQorICoJQGNmZyAtIFBvaW50ZXIgdG8gYSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZS4gU3RydWN0IGNvbnRhaW5zCisgKgkJYWN0aW9uLCBwYWdlIGFkZHJlc3MsIGRpcmVjdGlvbiwgcGh5c2ljYWwgYWRkcmVzcworICoJCWFuZCBwb2ludGVyIHRvIGEgY29uZmlndXJhdGlvbiBwYWdlIGhlYWRlcgorICoJCVBhZ2UgaGVhZGVyIGlzIHVwZGF0ZWQuCisgKgorICoJUmV0dXJucyAwIGZvciBzdWNjZXNzCisgKgktRVBFUk0gaWYgbm90IGFsbG93ZWQgZHVlIHRvIElTUiBjb250ZXh0CisgKgktRUFHQUlOIGlmIG5vIG1zZyBmcmFtZXMgY3VycmVudGx5IGF2YWlsYWJsZQorICoJLUVGQVVMVCBmb3Igbm9uLXN1Y2Nlc3NmdWwgcmVwbHkgb3Igbm8gcmVwbHkgKHRpbWVvdXQpCisgKi8KK2ludAorbXB0X2NvbmZpZyhNUFRfQURBUFRFUiAqaW9jLCBDT05GSUdQQVJNUyAqcENmZykKK3sKKwlDb25maWdfdAkqcFJlcTsKKwlNUFRfRlJBTUVfSERSCSptZjsKKwl1bnNpZ25lZCBsb25nCSBmbGFnczsKKwlpbnQJCSBpaSwgcmM7CisJdTMyCQkgZmxhZ3NMZW5ndGg7CisJaW50CQkgaW5faXNyOworCisJLyogKEJ1Z3ppbGxhOmZpYnJlYnVncywgIzUxMykKKwkgKiBCdWcgZml4IChwYXJ0IDEpISAgMjAwMTA5MDUgLXNyYWxzdG9uCisJICoJUHJldmVudCBjYWxsaW5nIHdhaXRfZXZlbnQoKSAoYmVsb3cpLCBpZiBjYWxsZXIgaGFwcGVucworCSAqCXRvIGJlIGluIElTUiBjb250ZXh0LCBiZWNhdXNlIHRoYXQgaXMgZmF0YWwhCisJICovCisJaW5faXNyID0gaW5faW50ZXJydXB0KCk7CisJaWYgKGluX2lzcikgeworCQlkY3ByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiQ29uZmlnIHJlcXVlc3Qgbm90IGFsbG93ZWQgaW4gSVNSIGNvbnRleHQhXG4iLAorCQkJCWlvYy0+bmFtZSkpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCS8qIEdldCBhbmQgUG9wdWxhdGUgYSBmcmVlIEZyYW1lCisJICovCisJaWYgKChtZiA9IG1wdF9nZXRfbXNnX2ZyYW1lKG1wdF9iYXNlX2luZGV4LCBpb2MpKSA9PSBOVUxMKSB7CisJCWRjcHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJtcHRfY29uZmlnOiBubyBtc2cgZnJhbWVzIVxuIiwKKwkJCQlpb2MtPm5hbWUpKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCXBSZXEgPSAoQ29uZmlnX3QgKiltZjsKKwlwUmVxLT5BY3Rpb24gPSBwQ2ZnLT5hY3Rpb247CisJcFJlcS0+UmVzZXJ2ZWQgPSAwOworCXBSZXEtPkNoYWluT2Zmc2V0ID0gMDsKKwlwUmVxLT5GdW5jdGlvbiA9IE1QSV9GVU5DVElPTl9DT05GSUc7CisJcFJlcS0+RXh0UGFnZUxlbmd0aCA9IDA7CisJcFJlcS0+RXh0UGFnZVR5cGUgPSAwOworCXBSZXEtPk1zZ0ZsYWdzID0gMDsKKwlmb3IgKGlpPTA7IGlpIDwgODsgaWkrKykKKwkJcFJlcS0+UmVzZXJ2ZWQyW2lpXSA9IDA7CisKKwlwUmVxLT5IZWFkZXIuUGFnZVZlcnNpb24gPSBwQ2ZnLT5oZHItPlBhZ2VWZXJzaW9uOworCXBSZXEtPkhlYWRlci5QYWdlTGVuZ3RoID0gcENmZy0+aGRyLT5QYWdlTGVuZ3RoOworCXBSZXEtPkhlYWRlci5QYWdlTnVtYmVyID0gcENmZy0+aGRyLT5QYWdlTnVtYmVyOworCXBSZXEtPkhlYWRlci5QYWdlVHlwZSA9IChwQ2ZnLT5oZHItPlBhZ2VUeXBlICYgTVBJX0NPTkZJR19QQUdFVFlQRV9NQVNLKTsKKwlwUmVxLT5QYWdlQWRkcmVzcyA9IGNwdV90b19sZTMyKHBDZmctPnBhZ2VBZGRyKTsKKworCS8qIEFkZCBhIFNHRSB0byB0aGUgY29uZmlnIHJlcXVlc3QuCisJICovCisJaWYgKHBDZmctPmRpcikKKwkJZmxhZ3NMZW5ndGggPSBNUFRfU0dFX0ZMQUdTX1NTSU1QTEVfV1JJVEU7CisJZWxzZQorCQlmbGFnc0xlbmd0aCA9IE1QVF9TR0VfRkxBR1NfU1NJTVBMRV9SRUFEOworCisJZmxhZ3NMZW5ndGggfD0gcENmZy0+aGRyLT5QYWdlTGVuZ3RoICogNDsKKworCW1wdF9hZGRfc2dlKChjaGFyICopJnBSZXEtPlBhZ2VCdWZmZXJTR0UsIGZsYWdzTGVuZ3RoLCBwQ2ZnLT5waHlzQWRkcik7CisKKwlkY3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2VuZGluZyBDb25maWcgcmVxdWVzdCB0eXBlICVkLCBwYWdlICVkIGFuZCBhY3Rpb24gJWRcbiIsCisJCWlvYy0+bmFtZSwgcFJlcS0+SGVhZGVyLlBhZ2VUeXBlLCBwUmVxLT5IZWFkZXIuUGFnZU51bWJlciwgcFJlcS0+QWN0aW9uKSk7CisKKwkvKiBBcHBlbmQgcENmZyBwb2ludGVyIHRvIGVuZCBvZiBtZgorCSAqLworCSooKHZvaWQgKiopICgoKHU4ICopIG1mKSArIChpb2MtPnJlcV9zeiAtIHNpemVvZih2b2lkICopKSkpID0gICh2b2lkICopIHBDZmc7CisKKwkvKiBJbml0YWxpemUgdGhlIHRpbWVyCisJICovCisJaW5pdF90aW1lcigmcENmZy0+dGltZXIpOworCXBDZmctPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaW9jOworCXBDZmctPnRpbWVyLmZ1bmN0aW9uID0gbXB0X3RpbWVyX2V4cGlyZWQ7CisJcENmZy0+d2FpdF9kb25lID0gMDsKKworCS8qIFNldCB0aGUgdGltZXI7IGVuc3VyZSAxMCBzZWNvbmQgbWluaW11bSAqLworCWlmIChwQ2ZnLT50aW1lb3V0IDwgMTApCisJCXBDZmctPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFoqMTA7CisJZWxzZQorCQlwQ2ZnLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaKnBDZmctPnRpbWVvdXQ7CisKKwkvKiBBZGQgdG8gZW5kIG9mIFEsIHNldCB0aW1lciBhbmQgdGhlbiBpc3N1ZSB0aGlzIGNvbW1hbmQgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5GcmVlUWxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZwQ2ZnLT5saW5rYWdlLCAmaW9jLT5jb25maWdRKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPkZyZWVRbG9jaywgZmxhZ3MpOworCisJYWRkX3RpbWVyKCZwQ2ZnLT50aW1lcik7CisJbXB0X3B1dF9tc2dfZnJhbWUobXB0X2Jhc2VfaW5kZXgsIGlvYywgbWYpOworCXdhaXRfZXZlbnQobXB0X3dhaXRxLCBwQ2ZnLT53YWl0X2RvbmUpOworCisJLyogbWYgaGFzIGJlZW4gZnJlZWQgLSBkbyBub3QgYWNjZXNzICovCisKKwlyYyA9IHBDZmctPnN0YXR1czsKKworCXJldHVybiByYzsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoqCisgKgltcHRfdG9vbGJveCAtIEdlbmVyaWMgZnVuY3Rpb24gdG8gaXNzdWUgdG9vbGJveCBtZXNzYWdlCisgKglAaW9jIC0gUG9pbnRlciB0byBhbiBhZGFwdGVyIHN0cnVjdHVyZQorICoJQGNmZyAtIFBvaW50ZXIgdG8gYSB0b29sYm94IHN0cnVjdHVyZS4gU3RydWN0IGNvbnRhaW5zCisgKgkJYWN0aW9uLCBwYWdlIGFkZHJlc3MsIGRpcmVjdGlvbiwgcGh5c2ljYWwgYWRkcmVzcworICoJCWFuZCBwb2ludGVyIHRvIGEgY29uZmlndXJhdGlvbiBwYWdlIGhlYWRlcgorICoJCVBhZ2UgaGVhZGVyIGlzIHVwZGF0ZWQuCisgKgorICoJUmV0dXJucyAwIGZvciBzdWNjZXNzCisgKgktRVBFUk0gaWYgbm90IGFsbG93ZWQgZHVlIHRvIElTUiBjb250ZXh0CisgKgktRUFHQUlOIGlmIG5vIG1zZyBmcmFtZXMgY3VycmVudGx5IGF2YWlsYWJsZQorICoJLUVGQVVMVCBmb3Igbm9uLXN1Y2Nlc3NmdWwgcmVwbHkgb3Igbm8gcmVwbHkgKHRpbWVvdXQpCisgKi8KK2ludAorbXB0X3Rvb2xib3goTVBUX0FEQVBURVIgKmlvYywgQ09ORklHUEFSTVMgKnBDZmcpCit7CisJVG9vbGJveElzdHdpUmVhZFdyaXRlUmVxdWVzdF90CSpwUmVxOworCU1QVF9GUkFNRV9IRFIJKm1mOworCXN0cnVjdCBwY2lfZGV2CSpwZGV2OworCXVuc2lnbmVkIGxvbmcJIGZsYWdzOworCWludAkJIHJjOworCXUzMgkJIGZsYWdzTGVuZ3RoOworCWludAkJIGluX2lzcjsKKworCS8qIChCdWd6aWxsYTpmaWJyZWJ1Z3MsICM1MTMpCisJICogQnVnIGZpeCAocGFydCAxKSEgIDIwMDEwOTA1IC1zcmFsc3RvbgorCSAqCVByZXZlbnQgY2FsbGluZyB3YWl0X2V2ZW50KCkgKGJlbG93KSwgaWYgY2FsbGVyIGhhcHBlbnMKKwkgKgl0byBiZSBpbiBJU1IgY29udGV4dCwgYmVjYXVzZSB0aGF0IGlzIGZhdGFsIQorCSAqLworCWluX2lzciA9IGluX2ludGVycnVwdCgpOworCWlmIChpbl9pc3IpIHsKKwkJZGNwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgInRvb2JveCByZXF1ZXN0IG5vdCBhbGxvd2VkIGluIElTUiBjb250ZXh0IVxuIiwKKwkJCQlpb2MtPm5hbWUpKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwkvKiBHZXQgYW5kIFBvcHVsYXRlIGEgZnJlZSBGcmFtZQorCSAqLworCWlmICgobWYgPSBtcHRfZ2V0X21zZ19mcmFtZShtcHRfYmFzZV9pbmRleCwgaW9jKSkgPT0gTlVMTCkgeworCQlkY3ByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAibXB0X3Rvb2xib3g6IG5vIG1zZyBmcmFtZXMhXG4iLAorCQkJCWlvYy0+bmFtZSkpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJcFJlcSA9IChUb29sYm94SXN0d2lSZWFkV3JpdGVSZXF1ZXN0X3QJKiltZjsKKwlwUmVxLT5Ub29sID0gcENmZy0+YWN0aW9uOworCXBSZXEtPlJlc2VydmVkID0gMDsKKwlwUmVxLT5DaGFpbk9mZnNldCA9IDA7CisJcFJlcS0+RnVuY3Rpb24gPSBNUElfRlVOQ1RJT05fVE9PTEJPWDsKKwlwUmVxLT5SZXNlcnZlZDEgPSAwOworCXBSZXEtPlJlc2VydmVkMiA9IDA7CisJcFJlcS0+TXNnRmxhZ3MgPSAwOworCXBSZXEtPkZsYWdzID0gcENmZy0+ZGlyOworCXBSZXEtPkJ1c051bSA9IDA7CisJcFJlcS0+UmVzZXJ2ZWQzID0gMDsKKwlwUmVxLT5OdW1BZGRyZXNzQnl0ZXMgPSAweDAxOworCXBSZXEtPlJlc2VydmVkNCA9IDA7CisJcFJlcS0+RGF0YUxlbmd0aCA9IDB4MDQ7CisJcGRldiA9IChzdHJ1Y3QgcGNpX2RldiAqKSBpb2MtPnBjaWRldjsKKwlpZiAocGRldi0+ZGV2Zm4gJiAxKQorCQlwUmVxLT5EZXZpY2VBZGRyID0gMHhCMjsKKwllbHNlCisJCXBSZXEtPkRldmljZUFkZHIgPSAweEIwOworCXBSZXEtPkFkZHIxID0gMDsKKwlwUmVxLT5BZGRyMiA9IDA7CisJcFJlcS0+QWRkcjMgPSAwOworCXBSZXEtPlJlc2VydmVkNSA9IDA7CisKKwkvKiBBZGQgYSBTR0UgdG8gdGhlIGNvbmZpZyByZXF1ZXN0LgorCSAqLworCisJZmxhZ3NMZW5ndGggPSBNUFRfU0dFX0ZMQUdTX1NTSU1QTEVfUkVBRCB8IDQ7CisKKwltcHRfYWRkX3NnZSgoY2hhciAqKSZwUmVxLT5TR0wsIGZsYWdzTGVuZ3RoLCBwQ2ZnLT5waHlzQWRkcik7CisKKwlkY3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2VuZGluZyBUb29sYm94IHJlcXVlc3QsIFRvb2w9JXhcbiIsCisJCWlvYy0+bmFtZSwgcFJlcS0+VG9vbCkpOworCisJLyogQXBwZW5kIHBDZmcgcG9pbnRlciB0byBlbmQgb2YgbWYKKwkgKi8KKwkqKCh2b2lkICoqKSAoKCh1OCAqKSBtZikgKyAoaW9jLT5yZXFfc3ogLSBzaXplb2Yodm9pZCAqKSkpKSA9ICAodm9pZCAqKSBwQ2ZnOworCisJLyogSW5pdGFsaXplIHRoZSB0aW1lcgorCSAqLworCWluaXRfdGltZXIoJnBDZmctPnRpbWVyKTsKKwlwQ2ZnLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGlvYzsKKwlwQ2ZnLT50aW1lci5mdW5jdGlvbiA9IG1wdF90aW1lcl9leHBpcmVkOworCXBDZmctPndhaXRfZG9uZSA9IDA7CisKKwkvKiBTZXQgdGhlIHRpbWVyOyBlbnN1cmUgMTAgc2Vjb25kIG1pbmltdW0gKi8KKwlpZiAocENmZy0+dGltZW91dCA8IDEwKQorCQlwQ2ZnLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaKjEwOworCWVsc2UKKwkJcENmZy0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWipwQ2ZnLT50aW1lb3V0OworCisJLyogQWRkIHRvIGVuZCBvZiBRLCBzZXQgdGltZXIgYW5kIHRoZW4gaXNzdWUgdGhpcyBjb21tYW5kICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmcENmZy0+bGlua2FnZSwgJmlvYy0+Y29uZmlnUSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5GcmVlUWxvY2ssIGZsYWdzKTsKKworCWFkZF90aW1lcigmcENmZy0+dGltZXIpOworCW1wdF9wdXRfbXNnX2ZyYW1lKG1wdF9iYXNlX2luZGV4LCBpb2MsIG1mKTsKKwl3YWl0X2V2ZW50KG1wdF93YWl0cSwgcENmZy0+d2FpdF9kb25lKTsKKworCS8qIG1mIGhhcyBiZWVuIGZyZWVkIC0gZG8gbm90IGFjY2VzcyAqLworCisJcmMgPSBwQ2ZnLT5zdGF0dXM7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKgltcHRfdGltZXJfZXhwaXJlZCAtIENhbGwgYmFjayBmb3IgdGltZXIgcHJvY2Vzcy4KKyAqCVVzZWQgb25seSBpbnRlcm5hbCBjb25maWcgZnVuY3Rpb25hbGl0eS4KKyAqCUBkYXRhOiBQb2ludGVyIHRvIE1QVF9TQ1NJX0hPU1QgcmVjYXN0IGFzIGFuIHVuc2lnbmVkIGxvbmcKKyAqLworc3RhdGljIHZvaWQKK21wdF90aW1lcl9leHBpcmVkKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlNUFRfQURBUFRFUiAqaW9jID0gKE1QVF9BREFQVEVSICopIGRhdGE7CisKKwlkY3ByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAibXB0X3RpbWVyX2V4cGlyZWQhIFxuIiwgaW9jLT5uYW1lKSk7CisKKwkvKiBQZXJmb3JtIGEgRlcgcmVsb2FkICovCisJaWYgKG1wdF9IYXJkUmVzZXRIYW5kbGVyKGlvYywgTk9fU0xFRVApIDwgMCkKKwkJcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQgIkZpcm13YXJlIFJlbG9hZCBGQUlMRUQhXG4iLCBpb2MtPm5hbWUpOworCisJLyogTm8gbW9yZSBwcm9jZXNzaW5nLgorCSAqIEhhcmQgcmVzZXQgY2xlYW4tdXAgd2lsbCB3YWtlIHVwCisJICogcHJvY2VzcyBhbmQgZnJlZSBhbGwgcmVzb3VyY2VzLgorCSAqLworCWRjcHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJtcHRfdGltZXJfZXhwaXJlZCBjb21wbGV0ZSFcbiIsIGlvYy0+bmFtZSkpOworCisJcmV0dXJuOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJbXB0X2lvY19yZXNldCAtIEJhc2UgY2xlYW51cCBmb3IgaGFyZCByZXNldAorICoJQGlvYzogUG9pbnRlciB0byB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCUByZXNldF9waGFzZTogSW5kaWNhdGVzIHByZS0gb3IgcG9zdC1yZXNldCBmdW5jdGlvbmFsaXR5CisgKgorICoJUmVtYXJrOiBGcmVlJ3MgcmVzb3VyY2VzIHdpdGggaW50ZXJuYWxseSBnZW5lcmF0ZWQgY29tbWFuZHMuCisgKi8KK3N0YXRpYyBpbnQKK21wdF9pb2NfcmVzZXQoTVBUX0FEQVBURVIgKmlvYywgaW50IHJlc2V0X3BoYXNlKQoreworCUNPTkZJR1BBUk1TICpwQ2ZnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkcHJpbnRrKChLRVJOX1dBUk5JTkcgTVlOQU0KKwkJCSI6IElPQyAlc19yZXNldCByb3V0ZWQgdG8gTVBUIGJhc2UgZHJpdmVyIVxuIiwKKwkJCXJlc2V0X3BoYXNlPT1NUFRfSU9DX1NFVFVQX1JFU0VUID8gInNldHVwIiA6ICgKKwkJCXJlc2V0X3BoYXNlPT1NUFRfSU9DX1BSRV9SRVNFVCA/ICJwcmUiIDogInBvc3QiKSkpOworCisJaWYgKHJlc2V0X3BoYXNlID09IE1QVF9JT0NfU0VUVVBfUkVTRVQpIHsKKwkJOworCX0gZWxzZSBpZiAocmVzZXRfcGhhc2UgPT0gTVBUX0lPQ19QUkVfUkVTRVQpIHsKKwkJLyogSWYgdGhlIGludGVybmFsIGNvbmZpZyBRIGlzIG5vdCBlbXB0eSAtCisJCSAqIGRlbGV0ZSB0aW1lci4gTUYgcmVzb3VyY2VzIHdpbGwgYmUgZnJlZWQgd2hlbgorCQkgKiB0aGUgRklGTydzIGFyZSBwcmltZWQuCisJCSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5GcmVlUWxvY2ssIGZsYWdzKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShwQ2ZnLCAmaW9jLT5jb25maWdRLCBsaW5rYWdlKQorCQkJZGVsX3RpbWVyKCZwQ2ZnLT50aW1lcik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CisKKwl9IGVsc2UgeworCQlDT05GSUdQQVJNUyAqcE5leHQ7CisKKwkJLyogU2VhcmNoIHRoZSBjb25maWdRIGZvciBpbnRlcm5hbCBjb21tYW5kcy4KKwkJICogRmx1c2ggdGhlIFEsIGFuZCB3YWtlIHVwIGFsbCBzdXNwZW5kZWQgdGhyZWFkcy4KKwkJICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPkZyZWVRbG9jaywgZmxhZ3MpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocENmZywgcE5leHQsICZpb2MtPmNvbmZpZ1EsIGxpbmthZ2UpIHsKKwkJCWxpc3RfZGVsKCZwQ2ZnLT5saW5rYWdlKTsKKworCQkJcENmZy0+c3RhdHVzID0gTVBUX0NPTkZJR19FUlJPUjsKKwkJCXBDZmctPndhaXRfZG9uZSA9IDE7CisJCQl3YWtlX3VwKCZtcHRfd2FpdHEpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIDE7CQkvKiBjdXJyZW50bHkgbWVhbnMgbm90aGluZyByZWFsbHkgKi8KK30KKworCisjaWZkZWYgQ09ORklHX1BST0NfRlMJCS8qIHsgKi8KKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKglwcm9jZnMgKCVNUFRfUFJPQ0ZTX01QVEJBU0VESVIvLi4uKSBzdXBwb3J0IHN0dWZmLi4uCisgKi8KKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKglwcm9jbXB0X2NyZWF0ZSAtIENyZWF0ZSAlTVBUX1BST0NGU19NUFRCQVNFRElSIGVudHJpZXMuCisgKgorICoJUmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZS4KKyAqLworc3RhdGljIGludAorcHJvY21wdF9jcmVhdGUodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmVudDsKKworCW1wdF9wcm9jX3Jvb3RfZGlyID0gcHJvY19ta2RpcihNUFRfUFJPQ0ZTX01QVEJBU0VESVIsIE5VTEwpOworCWlmIChtcHRfcHJvY19yb290X2RpciA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT1RESVI7CisKKwllbnQgPSBjcmVhdGVfcHJvY19lbnRyeSgic3VtbWFyeSIsIFNfSUZSRUd8U19JUlVHTywgbXB0X3Byb2Nfcm9vdF9kaXIpOworCWlmIChlbnQpCisJCWVudC0+cmVhZF9wcm9jID0gcHJvY21wdF9zdW1tYXJ5X3JlYWQ7CisKKwllbnQgPSBjcmVhdGVfcHJvY19lbnRyeSgidmVyc2lvbiIsIFNfSUZSRUd8U19JUlVHTywgbXB0X3Byb2Nfcm9vdF9kaXIpOworCWlmIChlbnQpCisJCWVudC0+cmVhZF9wcm9jID0gcHJvY21wdF92ZXJzaW9uX3JlYWQ7CisKKwlyZXR1cm4gMDsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCXByb2NtcHRfZGVzdHJveSAtIFRlYXIgZG93biAlTVBUX1BST0NGU19NUFRCQVNFRElSIGVudHJpZXMuCisgKgorICoJUmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZS4KKyAqLworc3RhdGljIHZvaWQKK3Byb2NtcHRfZGVzdHJveSh2b2lkKQoreworCXJlbW92ZV9wcm9jX2VudHJ5KCJ2ZXJzaW9uIiwgbXB0X3Byb2Nfcm9vdF9kaXIpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJzdW1tYXJ5IiwgbXB0X3Byb2Nfcm9vdF9kaXIpOworCXJlbW92ZV9wcm9jX2VudHJ5KE1QVF9QUk9DRlNfTVBUQkFTRURJUiwgTlVMTCk7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKglwcm9jbXB0X3N1bW1hcnlfcmVhZCAtIEhhbmRsZSByZWFkIHJlcXVlc3QgZnJvbSAvcHJvYy9tcHQvc3VtbWFyeQorICoJb3IgZnJvbSAvcHJvYy9tcHQvaW9jTi9zdW1tYXJ5LgorICoJQGJ1ZjogUG9pbnRlciB0byBhcmVhIHRvIHdyaXRlIGluZm9ybWF0aW9uCisgKglAc3RhcnQ6IFBvaW50ZXIgdG8gc3RhcnQgcG9pbnRlcgorICoJQG9mZnNldDogT2Zmc2V0IHRvIHN0YXJ0IHdyaXRpbmcKKyAqCUByZXF1ZXN0OgorICoJQGVvZjogUG9pbnRlciB0byBFT0YgaW50ZWdlcgorICoJQGRhdGE6IFBvaW50ZXIKKyAqCisgKglSZXR1cm5zIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4gdG8gcHJvY2VzcyBwZXJmb3JtaW5nIHRoZSByZWFkLgorICovCitzdGF0aWMgaW50Citwcm9jbXB0X3N1bW1hcnlfcmVhZChjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJTVBUX0FEQVBURVIgKmlvYzsKKwljaGFyICpvdXQgPSBidWY7CisJaW50IGxlbjsKKworCWlmIChkYXRhKSB7CisJCWludCBtb3JlID0gMDsKKworCQlpb2MgPSBkYXRhOworCQltcHRfcHJpbnRfaW9jX3N1bW1hcnkoaW9jLCBvdXQsICZtb3JlLCAwLCAxKTsKKworCQlvdXQgKz0gbW9yZTsKKwl9IGVsc2UgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlvYywgJmlvY19saXN0LCBsaXN0KSB7CisJCQlpbnQJbW9yZSA9IDA7CisKKwkJCW1wdF9wcmludF9pb2Nfc3VtbWFyeShpb2MsIG91dCwgJm1vcmUsIDAsIDEpOworCisJCQlvdXQgKz0gbW9yZTsKKwkJCWlmICgob3V0LWJ1ZikgPj0gcmVxdWVzdCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWxlbiA9IG91dCAtIGJ1ZjsKKworCU1QVF9QUk9DX1JFQURfUkVUVVJOKGJ1ZixzdGFydCxvZmZzZXQscmVxdWVzdCxlb2YsbGVuKTsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCXByb2NtcHRfdmVyc2lvbl9yZWFkIC0gSGFuZGxlIHJlYWQgcmVxdWVzdCBmcm9tIC9wcm9jL21wdC92ZXJzaW9uLgorICoJQGJ1ZjogUG9pbnRlciB0byBhcmVhIHRvIHdyaXRlIGluZm9ybWF0aW9uCisgKglAc3RhcnQ6IFBvaW50ZXIgdG8gc3RhcnQgcG9pbnRlcgorICoJQG9mZnNldDogT2Zmc2V0IHRvIHN0YXJ0IHdyaXRpbmcKKyAqCUByZXF1ZXN0OgorICoJQGVvZjogUG9pbnRlciB0byBFT0YgaW50ZWdlcgorICoJQGRhdGE6IFBvaW50ZXIKKyAqCisgKglSZXR1cm5zIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4gdG8gcHJvY2VzcyBwZXJmb3JtaW5nIHRoZSByZWFkLgorICovCitzdGF0aWMgaW50Citwcm9jbXB0X3ZlcnNpb25fcmVhZChjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50CSBpaTsKKwlpbnQJIHNjc2ksIGxhbiwgY3RsLCB0YXJnLCBkbXA7CisJY2hhcgkqZHJ2bmFtZTsKKwlpbnQJIGxlbjsKKworCWxlbiA9IHNwcmludGYoYnVmLCAiJXMtJXNcbiIsICJtcHRsaW51eCIsIE1QVF9MSU5VWF9WRVJTSU9OX0NPTU1PTik7CisJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIiAgRnVzaW9uIE1QVCBiYXNlIGRyaXZlclxuIik7CisKKwlzY3NpID0gbGFuID0gY3RsID0gdGFyZyA9IGRtcCA9IDA7CisJZm9yIChpaT1NUFRfTUFYX1BST1RPQ09MX0RSSVZFUlMtMTsgaWk7IGlpLS0pIHsKKwkJZHJ2bmFtZSA9IE5VTEw7CisJCWlmIChNcHRDYWxsYmFja3NbaWldKSB7CisJCQlzd2l0Y2ggKE1wdERyaXZlckNsYXNzW2lpXSkgeworCQkJY2FzZSBNUFRTQ1NJSF9EUklWRVI6CisJCQkJaWYgKCFzY3NpKyspIGRydm5hbWUgPSAiU0NTSSBob3N0IjsKKwkJCQlicmVhazsKKwkJCWNhc2UgTVBUTEFOX0RSSVZFUjoKKwkJCQlpZiAoIWxhbisrKSBkcnZuYW1lID0gIkxBTiI7CisJCQkJYnJlYWs7CisJCQljYXNlIE1QVFNUTV9EUklWRVI6CisJCQkJaWYgKCF0YXJnKyspIGRydm5hbWUgPSAiU0NTSSB0YXJnZXQiOworCQkJCWJyZWFrOworCQkJY2FzZSBNUFRDVExfRFJJVkVSOgorCQkJCWlmICghY3RsKyspIGRydm5hbWUgPSAiaW9jdGwiOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoZHJ2bmFtZSkKKwkJCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiICBGdXNpb24gTVBUICVzIGRyaXZlclxuIiwgZHJ2bmFtZSk7CisJCX0KKwl9CisKKwlNUFRfUFJPQ19SRUFEX1JFVFVSTihidWYsc3RhcnQsb2Zmc2V0LHJlcXVlc3QsZW9mLGxlbik7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKglwcm9jbXB0X2lvY2luZm9fcmVhZCAtIEhhbmRsZSByZWFkIHJlcXVlc3QgZnJvbSAvcHJvYy9tcHQvaW9jTi9pbmZvLgorICoJQGJ1ZjogUG9pbnRlciB0byBhcmVhIHRvIHdyaXRlIGluZm9ybWF0aW9uCisgKglAc3RhcnQ6IFBvaW50ZXIgdG8gc3RhcnQgcG9pbnRlcgorICoJQG9mZnNldDogT2Zmc2V0IHRvIHN0YXJ0IHdyaXRpbmcKKyAqCUByZXF1ZXN0OgorICoJQGVvZjogUG9pbnRlciB0byBFT0YgaW50ZWdlcgorICoJQGRhdGE6IFBvaW50ZXIKKyAqCisgKglSZXR1cm5zIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4gdG8gcHJvY2VzcyBwZXJmb3JtaW5nIHRoZSByZWFkLgorICovCitzdGF0aWMgaW50Citwcm9jbXB0X2lvY2luZm9fcmVhZChjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJTVBUX0FEQVBURVIJKmlvYyA9IGRhdGE7CisJaW50CQkgbGVuOworCWNoYXIJCSBleHBWZXJbMzJdOworCWludAkJIHN6OworCWludAkJIHA7CisKKwltcHRfZ2V0X2Z3X2V4cF92ZXIoZXhwVmVyLCBpb2MpOworCisJbGVuID0gc3ByaW50ZihidWYsICIlczoiLCBpb2MtPm5hbWUpOworCWlmIChpb2MtPmZhY3RzLkZsYWdzICYgTVBJX0lPQ0ZBQ1RTX0ZMQUdTX0ZXX0RPV05MT0FEX0JPT1QpCisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIgIChmL3cgZG93bmxvYWQgYm9vdCBmbGFnIHNldCkiKTsKKy8vCWlmIChpb2MtPmZhY3RzLklPQ0V4Y2VwdGlvbnMgJiBNUElfSU9DRkFDVFNfRVhDRVBUX0NPTkZJR19DSEVDS1NVTV9GQUlMKQorLy8JCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIgIENPTkZJR19DSEVDS1NVTV9GQUlMISIpOworCisJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIlxuICBQcm9kdWN0SUQgPSAweCUwNHggKCVzKVxuIiwKKwkJCWlvYy0+ZmFjdHMuUHJvZHVjdElELAorCQkJaW9jLT5wcm9kX25hbWUpOworCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIgIEZXVmVyc2lvbiA9IDB4JTA4eCVzIiwgaW9jLT5mYWN0cy5GV1ZlcnNpb24uV29yZCwgZXhwVmVyKTsKKwlpZiAoaW9jLT5mYWN0cy5GV0ltYWdlU2l6ZSkKKwkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIiAoZndfc2l6ZT0lZCkiLCBpb2MtPmZhY3RzLkZXSW1hZ2VTaXplKTsKKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiXG4gIE1zZ1ZlcnNpb24gPSAweCUwNHhcbiIsIGlvYy0+ZmFjdHMuTXNnVmVyc2lvbik7CisJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIiAgRmlyc3RXaG9Jbml0ID0gMHglMDJ4XG4iLCBpb2MtPkZpcnN0V2hvSW5pdCk7CisJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIiAgRXZlbnRTdGF0ZSA9IDB4JTAyeFxuIiwgaW9jLT5mYWN0cy5FdmVudFN0YXRlKTsKKworCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIgIEN1cnJlbnRIb3N0TWZhSGlnaEFkZHIgPSAweCUwOHhcbiIsCisJCQlpb2MtPmZhY3RzLkN1cnJlbnRIb3N0TWZhSGlnaEFkZHIpOworCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIgIEN1cnJlbnRTZW5zZUJ1ZmZlckhpZ2hBZGRyID0gMHglMDh4XG4iLAorCQkJaW9jLT5mYWN0cy5DdXJyZW50U2Vuc2VCdWZmZXJIaWdoQWRkcik7CisKKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiICBNYXhDaGFpbkRlcHRoID0gMHglMDJ4IGZyYW1lc1xuIiwgaW9jLT5mYWN0cy5NYXhDaGFpbkRlcHRoKTsKKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiICBNaW5CbG9ja1NpemUgPSAweCUwMnggYnl0ZXNcbiIsIDQqaW9jLT5mYWN0cy5CbG9ja1NpemUpOworCisJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIiAgUmVxdWVzdEZyYW1lcyBAIDB4JXAgKERtYSBAIDB4JXApXG4iLAorCQkJCQkodm9pZCAqKWlvYy0+cmVxX2ZyYW1lcywgKHZvaWQgKikodWxvbmcpaW9jLT5yZXFfZnJhbWVzX2RtYSk7CisJLyoKKwkgKiAgUm91bmRpbmcgVVAgdG8gbmVhcmVzdCA0LWtCIGJvdW5kYXJ5IGhlcmUuLi4KKwkgKi8KKwlzeiA9IChpb2MtPnJlcV9zeiAqIGlvYy0+cmVxX2RlcHRoKSArIDEyODsKKwlzeiA9ICgoc3ogKyAweDEwMDBVTCAtIDFVTCkgLyAweDEwMDApICogMHgxMDAwOworCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIgICAge0N1clJlcVN6PSVkfSB4IHtDdXJSZXFEZXB0aD0lZH0gPSAlZCBieXRlcyBePSAweCV4XG4iLAorCQkJCQlpb2MtPnJlcV9zeiwgaW9jLT5yZXFfZGVwdGgsIGlvYy0+cmVxX3N6KmlvYy0+cmVxX2RlcHRoLCBzeik7CisJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIiAgICB7TWF4UmVxU3o9JWR9ICAge01heFJlcURlcHRoPSVkfVxuIiwKKwkJCQkJNCppb2MtPmZhY3RzLlJlcXVlc3RGcmFtZVNpemUsCisJCQkJCWlvYy0+ZmFjdHMuR2xvYmFsQ3JlZGl0cyk7CisKKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiICBGcmFtZXMgICBAIDB4JXAgKERtYSBAIDB4JXApXG4iLAorCQkJCQkodm9pZCAqKWlvYy0+YWxsb2MsICh2b2lkICopKHVsb25nKWlvYy0+YWxsb2NfZG1hKTsKKwlzeiA9IChpb2MtPnJlcGx5X3N6ICogaW9jLT5yZXBseV9kZXB0aCkgKyAxMjg7CisJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIiAgICB7Q3VyUmVwU3o9JWR9IHgge0N1clJlcERlcHRoPSVkfSA9ICVkIGJ5dGVzIF49IDB4JXhcbiIsCisJCQkJCWlvYy0+cmVwbHlfc3osIGlvYy0+cmVwbHlfZGVwdGgsIGlvYy0+cmVwbHlfc3oqaW9jLT5yZXBseV9kZXB0aCwgc3opOworCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIgICAge01heFJlcFN6PSVkfSAgIHtNYXhSZXBEZXB0aD0lZH1cbiIsCisJCQkJCWlvYy0+ZmFjdHMuQ3VyUmVwbHlGcmFtZVNpemUsCisJCQkJCWlvYy0+ZmFjdHMuUmVwbHlRdWV1ZURlcHRoKTsKKworCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIgIE1heERldmljZXMgPSAlZFxuIiwKKwkJCShpb2MtPmZhY3RzLk1heERldmljZXM9PTApID8gMjU1IDogaW9jLT5mYWN0cy5NYXhEZXZpY2VzKTsKKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiICBNYXhCdXNlcyA9ICVkXG4iLCBpb2MtPmZhY3RzLk1heEJ1c2VzKTsKKworCS8qIHBlci1wb3J0IGluZm8gKi8KKwlmb3IgKHA9MDsgcCA8IGlvYy0+ZmFjdHMuTnVtYmVyT2ZQb3J0czsgcCsrKSB7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIgIFBvcnROdW1iZXIgPSAlZCAob2YgJWQpXG4iLAorCQkJCXArMSwKKwkJCQlpb2MtPmZhY3RzLk51bWJlck9mUG9ydHMpOworCQlpZiAoaW9jLT5idXNfdHlwZSA9PSBGQykgeworCQkJaWYgKGlvYy0+cGZhY3RzW3BdLlByb3RvY29sRmxhZ3MgJiBNUElfUE9SVEZBQ1RTX1BST1RPQ09MX0xBTikgeworCQkJCXU4ICphID0gKHU4KikmaW9jLT5sYW5fY25mZ19wYWdlMS5IYXJkd2FyZUFkZHJlc3NMb3c7CisJCQkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIiAgICBMYW5BZGRyID0gJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJCQkJCQlhWzVdLCBhWzRdLCBhWzNdLCBhWzJdLCBhWzFdLCBhWzBdKTsKKwkJCX0KKwkJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIgICAgV1dOID0gJTA4WCUwOFg6JTA4WCUwOFhcbiIsCisJCQkJCWlvYy0+ZmNfcG9ydF9wYWdlMFtwXS5XV05OLkhpZ2gsCisJCQkJCWlvYy0+ZmNfcG9ydF9wYWdlMFtwXS5XV05OLkxvdywKKwkJCQkJaW9jLT5mY19wb3J0X3BhZ2UwW3BdLldXUE4uSGlnaCwKKwkJCQkJaW9jLT5mY19wb3J0X3BhZ2UwW3BdLldXUE4uTG93KTsKKwkJfQorCX0KKworCU1QVF9QUk9DX1JFQURfUkVUVVJOKGJ1ZixzdGFydCxvZmZzZXQscmVxdWVzdCxlb2YsbGVuKTsKK30KKworI2VuZGlmCQkvKiBDT05GSUdfUFJPQ19GUyB9ICovCisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KK3N0YXRpYyB2b2lkCittcHRfZ2V0X2Z3X2V4cF92ZXIoY2hhciAqYnVmLCBNUFRfQURBUFRFUiAqaW9jKQoreworCWJ1ZlswXSA9J1wwJzsKKwlpZiAoKGlvYy0+ZmFjdHMuRldWZXJzaW9uLldvcmQgPj4gMjQpID09IDB4MEUpIHsKKwkJc3ByaW50ZihidWYsICIgKEV4cCAlMDJkJTAyZCkiLAorCQkJKGlvYy0+ZmFjdHMuRldWZXJzaW9uLldvcmQgPj4gMTYpICYgMHgwMEZGLAkvKiBNb250aCAqLworCQkJKGlvYy0+ZmFjdHMuRldWZXJzaW9uLldvcmQgPj4gOCkgJiAweDFGKTsJLyogRGF5ICovCisKKwkJLyogaW5zaWRlciBoYWNrISAqLworCQlpZiAoKGlvYy0+ZmFjdHMuRldWZXJzaW9uLldvcmQgPj4gOCkgJiAweDgwKQorCQkJc3RyY2F0KGJ1ZiwgIiBbTURCR10iKTsKKwl9Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qKgorICoJbXB0X3ByaW50X2lvY19zdW1tYXJ5IC0gV3JpdGUgQVNDSUkgc3VtbWFyeSBvZiBJT0MgdG8gYSBidWZmZXIuCisgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQorICoJQGJ1ZmZlcjogUG9pbnRlciB0byBidWZmZXIgd2hlcmUgSU9DIHN1bW1hcnkgaW5mbyBzaG91bGQgYmUgd3JpdHRlbgorICoJQHNpemU6IFBvaW50ZXIgdG8gbnVtYmVyIG9mIGJ5dGVzIHdlIHdyb3RlIChzZXQgYnkgdGhpcyByb3V0aW5lKQorICoJQGxlbjogT2Zmc2V0IGF0IHdoaWNoIHRvIHN0YXJ0IHdyaXRpbmcgaW4gYnVmZmVyCisgKglAc2hvd2xhbjogRGlzcGxheSBMQU4gc3R1ZmY/CisgKgorICoJVGhpcyByb3V0aW5lIHdyaXRlcyAoZW5nbGlzaCByZWFkYWJsZSkgQVNDSUkgdGV4dCwgd2hpY2ggcmVwcmVzZW50cworICoJYSBzdW1tYXJ5IG9mIElPQyBpbmZvcm1hdGlvbiwgdG8gYSBidWZmZXIuCisgKi8KK3ZvaWQKK21wdF9wcmludF9pb2Nfc3VtbWFyeShNUFRfQURBUFRFUiAqaW9jLCBjaGFyICpidWZmZXIsIGludCAqc2l6ZSwgaW50IGxlbiwgaW50IHNob3dsYW4pCit7CisJY2hhciBleHBWZXJbMzJdOworCWludCB5OworCisJbXB0X2dldF9md19leHBfdmVyKGV4cFZlciwgaW9jKTsKKworCS8qCisJICogIFNob3J0ZXIgc3VtbWFyeSBvZiBhdHRhY2hlZCBpb2Mncy4uLgorCSAqLworCXkgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICIlczogJXMsICVzJTA4eGglcywgUG9ydHM9JWQsIE1heFE9JWQiLAorCQkJaW9jLT5uYW1lLAorCQkJaW9jLT5wcm9kX25hbWUsCisJCQlNUFRfRldfUkVWX01BR0lDX0lEX1NUUklORywJLyogIkZ3UmV2PSIgb3Igc29tZXN1Y2ggKi8KKwkJCWlvYy0+ZmFjdHMuRldWZXJzaW9uLldvcmQsCisJCQlleHBWZXIsCisJCQlpb2MtPmZhY3RzLk51bWJlck9mUG9ydHMsCisJCQlpb2MtPnJlcV9kZXB0aCk7CisKKwlpZiAoc2hvd2xhbiAmJiAoaW9jLT5wZmFjdHNbMF0uUHJvdG9jb2xGbGFncyAmIE1QSV9QT1JURkFDVFNfUFJPVE9DT0xfTEFOKSkgeworCQl1OCAqYSA9ICh1OCopJmlvYy0+bGFuX2NuZmdfcGFnZTEuSGFyZHdhcmVBZGRyZXNzTG93OworCQl5ICs9IHNwcmludGYoYnVmZmVyK2xlbit5LCAiLCBMYW5BZGRyPSUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKKwkJCWFbNV0sIGFbNF0sIGFbM10sIGFbMl0sIGFbMV0sIGFbMF0pOworCX0KKworI2lmbmRlZiBfX3NwYXJjX18KKwl5ICs9IHNwcmludGYoYnVmZmVyK2xlbit5LCAiLCBJUlE9JWQiLCBpb2MtPnBjaV9pcnEpOworI2Vsc2UKKwl5ICs9IHNwcmludGYoYnVmZmVyK2xlbit5LCAiLCBJUlE9JXMiLCBfX2lycV9pdG9hKGlvYy0+cGNpX2lycSkpOworI2VuZGlmCisKKwlpZiAoIWlvYy0+YWN0aXZlKQorCQl5ICs9IHNwcmludGYoYnVmZmVyK2xlbit5LCAiIChkaXNhYmxlZCkiKTsKKworCXkgKz0gc3ByaW50ZihidWZmZXIrbGVuK3ksICJcbiIpOworCisJKnNpemUgPSB5OworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJUmVzZXQgSGFuZGxpbmcKKyAqLworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoqCisgKgltcHRfSGFyZFJlc2V0SGFuZGxlciAtIEdlbmVyaWMgcmVzZXQgaGFuZGxlciwgaXNzdWUgU0NTSSBUYXNrCisgKglNYW5hZ2VtZW50IGNhbGwgYmFzZWQgb24gaW5wdXQgYXJnIHZhbHVlcy4gIElmIFRhc2tNZ210IGZhaWxzLAorICoJcmV0dXJuIGFzc29jaWF0ZWQgU0NTSSByZXF1ZXN0LgorICoJQGlvYzogUG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKKyAqCUBzbGVlcEZsYWc6IEluZGljYXRlcyBpZiBzbGVlcCBvciBzY2hlZHVsZSBtdXN0IGJlIGNhbGxlZC4KKyAqCisgKglSZW1hcms6IF9IYXJkUmVzZXRIYW5kbGVyIGNhbiBiZSBpbnZva2VkIGZyb20gYW4gaW50ZXJydXB0IHRocmVhZCAodGltZXIpCisgKglvciBhIG5vbi1pbnRlcnJ1cHQgdGhyZWFkLiAgSW4gdGhlIGZvcm1lciwgbXVzdCBub3QgY2FsbCBzY2hlZHVsZSgpLgorICoKKyAqCVJlbWFyazogQSByZXR1cm4gb2YgLTEgaXMgYSBGQVRBTCBlcnJvciBjYXNlLCBhcyBpdCBtZWFucyBhCisgKglGVyByZWxvYWQvaW5pdGlhbGl6YXRpb24gZmFpbGVkLgorICoKKyAqCVJldHVybnMgMCBmb3IgU1VDQ0VTUyBvciAtMSBpZiBGQUlMRUQuCisgKi8KK2ludAorbXB0X0hhcmRSZXNldEhhbmRsZXIoTVBUX0FEQVBURVIgKmlvYywgaW50IHNsZWVwRmxhZykKK3sKKwlpbnQJCSByYzsKKwl1bnNpZ25lZCBsb25nCSBmbGFnczsKKworCWR0bXByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiSGFyZFJlc2V0SGFuZGxlciBFbnRlcmVkIVxuIiwgaW9jLT5uYW1lKSk7CisjaWZkZWYgTUZDTlQKKwlwcmludGsoTVlJT0Nfc19JTkZPX0ZNVCAiSGFyZFJlc2V0SGFuZGxlciBFbnRlcmVkIVxuIiwgaW9jLT5uYW1lKTsKKwlwcmludGsoIk1GIGNvdW50IDB4JXggIVxuIiwgaW9jLT5tZmNudCk7CisjZW5kaWYKKworCS8qIFJlc2V0IHRoZSBhZGFwdGVyLiBQcmV2ZW50IG1vcmUgdGhhbiAxIGNhbGwgdG8KKwkgKiBtcHRfZG9faW9jX3JlY292ZXJ5IGF0IGFueSBpbnN0YW50IGluIHRpbWUuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+ZGlhZ0xvY2ssIGZsYWdzKTsKKwlpZiAoKGlvYy0+ZGlhZ1BlbmRpbmcpIHx8IChpb2MtPmFsdF9pb2MgJiYgaW9jLT5hbHRfaW9jLT5kaWFnUGVuZGluZykpeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPmRpYWdMb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCWlvYy0+ZGlhZ1BlbmRpbmcgPSAxOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPmRpYWdMb2NrLCBmbGFncyk7CisKKwkvKiBGSVhNRTogSWYgZG9faW9jX3JlY292ZXJ5IGZhaWxzLCByZXBlYXQuLi4uCisJICovCisKKwkvKiBUaGUgU0NTSSBkcml2ZXIgbmVlZHMgdG8gYWRqdXN0IHRpbWVvdXRzIG9uIGFsbCBjdXJyZW50CisJICogY29tbWFuZHMgcHJpb3IgdG8gdGhlIGRpYWdub3N0aWMgcmVzZXQgYmVpbmcgaXNzdWVkLgorCSAqIFByZXZlbnRzIHRpbWVvdXRzIG9jY3VyaW5nIGR1cmluZyBhIGRpYWdub3N0aWMgcmVzZXQuLi52ZXJ5IGJhZC4KKwkgKiBGb3IgYWxsIG90aGVyIHByb3RvY29sIGRyaXZlcnMsIHRoaXMgaXMgYSBuby1vcC4KKwkgKi8KKwl7CisJCWludAkgaWk7CisJCWludAkgciA9IDA7CisKKwkJZm9yIChpaT1NUFRfTUFYX1BST1RPQ09MX0RSSVZFUlMtMTsgaWk7IGlpLS0pIHsKKwkJCWlmIChNcHRSZXNldEhhbmRsZXJzW2lpXSkgeworCQkJCWR0bXByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiQ2FsbGluZyBJT0MgcmVzZXRfc2V0dXAgaGFuZGxlciAjJWRcbiIsCisJCQkJCQlpb2MtPm5hbWUsIGlpKSk7CisJCQkJciArPSAoKihNcHRSZXNldEhhbmRsZXJzW2lpXSkpKGlvYywgTVBUX0lPQ19TRVRVUF9SRVNFVCk7CisJCQkJaWYgKGlvYy0+YWx0X2lvYykgeworCQkJCQlkdG1wcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkNhbGxpbmcgYWx0LSVzIHNldHVwIHJlc2V0IGhhbmRsZXIgIyVkXG4iLAorCQkJCQkJCWlvYy0+bmFtZSwgaW9jLT5hbHRfaW9jLT5uYW1lLCBpaSkpOworCQkJCQlyICs9ICgqKE1wdFJlc2V0SGFuZGxlcnNbaWldKSkoaW9jLT5hbHRfaW9jLCBNUFRfSU9DX1NFVFVQX1JFU0VUKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiAoKHJjID0gbXB0X2RvX2lvY19yZWNvdmVyeShpb2MsIE1QVF9IT1NURVZFTlRfSU9DX1JFQ09WRVIsIHNsZWVwRmxhZykpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBNWU5BTSAiOiBXQVJOSU5HIC0gKCVkKSBDYW5ub3QgcmVjb3ZlciAlc1xuIiwKKwkJCXJjLCBpb2MtPm5hbWUpOworCX0KKwlpb2MtPnJlbG9hZF9mdyA9IDA7CisJaWYgKGlvYy0+YWx0X2lvYykKKwkJaW9jLT5hbHRfaW9jLT5yZWxvYWRfZncgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+ZGlhZ0xvY2ssIGZsYWdzKTsKKwlpb2MtPmRpYWdQZW5kaW5nID0gMDsKKwlpZiAoaW9jLT5hbHRfaW9jKQorCQlpb2MtPmFsdF9pb2MtPmRpYWdQZW5kaW5nID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPmRpYWdMb2NrLCBmbGFncyk7CisKKwlkdG1wcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkhhcmRSZXNldEhhbmRsZXIgcmMgPSAlZCFcbiIsIGlvYy0+bmFtZSwgcmMpKTsKKworCXJldHVybiByYzsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworc3RhdGljIGNoYXIgKgorRXZlbnREZXNjcmlwdGlvblN0cih1OCBldmVudCwgdTMyIGV2RGF0YTApCit7CisJY2hhciAqZHM7CisKKwlzd2l0Y2goZXZlbnQpIHsKKwljYXNlIE1QSV9FVkVOVF9OT05FOgorCQlkcyA9ICJOb25lIjsKKwkJYnJlYWs7CisJY2FzZSBNUElfRVZFTlRfTE9HX0RBVEE6CisJCWRzID0gIkxvZyBEYXRhIjsKKwkJYnJlYWs7CisJY2FzZSBNUElfRVZFTlRfU1RBVEVfQ0hBTkdFOgorCQlkcyA9ICJTdGF0ZSBDaGFuZ2UiOworCQlicmVhazsKKwljYXNlIE1QSV9FVkVOVF9VTklUX0FUVEVOVElPTjoKKwkJZHMgPSAiVW5pdCBBdHRlbnRpb24iOworCQlicmVhazsKKwljYXNlIE1QSV9FVkVOVF9JT0NfQlVTX1JFU0VUOgorCQlkcyA9ICJJT0MgQnVzIFJlc2V0IjsKKwkJYnJlYWs7CisJY2FzZSBNUElfRVZFTlRfRVhUX0JVU19SRVNFVDoKKwkJZHMgPSAiRXh0ZXJuYWwgQnVzIFJlc2V0IjsKKwkJYnJlYWs7CisJY2FzZSBNUElfRVZFTlRfUkVTQ0FOOgorCQlkcyA9ICJCdXMgUmVzY2FuIEV2ZW50IjsKKwkJLyogT2ssIGRvIHdlIG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZT8gQXMgZmFyIGFzCisJCSAgIEkgY2FuIHRlbGwsIHRoaXMgaXMgd2hlbiBhIG5ldyBkZXZpY2UgZ2V0cyBhZGRlZAorCQkgICB0byB0aGUgbG9vcC4gKi8KKwkJYnJlYWs7CisJY2FzZSBNUElfRVZFTlRfTElOS19TVEFUVVNfQ0hBTkdFOgorCQlpZiAoZXZEYXRhMCA9PSBNUElfRVZFTlRfTElOS19TVEFUVVNfRkFJTFVSRSkKKwkJCWRzID0gIkxpbmsgU3RhdHVzKEZBSUxVUkUpIENoYW5nZSI7CisJCWVsc2UKKwkJCWRzID0gIkxpbmsgU3RhdHVzKEFDVElWRSkgQ2hhbmdlIjsKKwkJYnJlYWs7CisJY2FzZSBNUElfRVZFTlRfTE9PUF9TVEFURV9DSEFOR0U6CisJCWlmIChldkRhdGEwID09IE1QSV9FVkVOVF9MT09QX1NUQVRFX0NIQU5HRV9MSVApCisJCQlkcyA9ICJMb29wIFN0YXRlKExJUCkgQ2hhbmdlIjsKKwkJZWxzZSBpZiAoZXZEYXRhMCA9PSBNUElfRVZFTlRfTE9PUF9TVEFURV9DSEFOR0VfTFBFKQorCQkJZHMgPSAiTG9vcCBTdGF0ZShMUEUpIENoYW5nZSI7CQkJLyogPz8/ICovCisJCWVsc2UKKwkJCWRzID0gIkxvb3AgU3RhdGUoTFBCKSBDaGFuZ2UiOwkJCS8qID8/PyAqLworCQlicmVhazsKKwljYXNlIE1QSV9FVkVOVF9MT0dPVVQ6CisJCWRzID0gIkxvZ291dCI7CisJCWJyZWFrOworCWNhc2UgTVBJX0VWRU5UX0VWRU5UX0NIQU5HRToKKwkJaWYgKGV2RGF0YTApCisJCQlkcyA9ICJFdmVudHMoT04pIENoYW5nZSI7CisJCWVsc2UKKwkJCWRzID0gIkV2ZW50cyhPRkYpIENoYW5nZSI7CisJCWJyZWFrOworCWNhc2UgTVBJX0VWRU5UX0lOVEVHUkFURURfUkFJRDoKKwkJZHMgPSAiSW50ZWdyYXRlZCBSYWlkIjsKKwkJYnJlYWs7CisJLyoKKwkgKiAgTVBUIGJhc2UgImN1c3RvbSIgZXZlbnRzIG1heSBiZSBhZGRlZCBoZXJlLi4uCisJICovCisJZGVmYXVsdDoKKwkJZHMgPSAiVW5rbm93biI7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZHM7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKglQcm9jZXNzRXZlbnROb3RpZmljYXRpb24gLSBSb3V0ZSBhIHJlY2VpdmVkIEV2ZW50Tm90aWZpY2F0aW9uUmVwbHkgdG8KKyAqCWFsbCBjdXJyZW50bHkgcmVnZWlzdGVyZWQgZXZlbnQgaGFuZGxlcnMuCisgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQorICoJQHBFdmVudFJlcGx5OiBQb2ludGVyIHRvIEV2ZW50Tm90aWZpY2F0aW9uIHJlcGx5IGZyYW1lCisgKglAZXZIYW5kbGVyczogUG9pbnRlciB0byBpbnRlZ2VyLCBudW1iZXIgb2YgZXZlbnQgaGFuZGxlcnMKKyAqCisgKglSZXR1cm5zIHN1bSBvZiBldmVudCBoYW5kbGVycyByZXR1cm4gdmFsdWVzLgorICovCitzdGF0aWMgaW50CitQcm9jZXNzRXZlbnROb3RpZmljYXRpb24oTVBUX0FEQVBURVIgKmlvYywgRXZlbnROb3RpZmljYXRpb25SZXBseV90ICpwRXZlbnRSZXBseSwgaW50ICpldkhhbmRsZXJzKQoreworCXUxNiBldkRhdGFMZW47CisJdTMyIGV2RGF0YTAgPSAwOworLy8JdTMyIGV2Q3R4OworCWludCBpaTsKKwlpbnQgciA9IDA7CisJaW50IGhhbmRsZXJzID0gMDsKKwljaGFyICpldlN0cjsKKwl1OCBldmVudDsKKworCS8qCisJICogIERvIHBsYXRmb3JtIG5vcm1hbGl6YXRpb24gb2YgdmFsdWVzCisJICovCisJZXZlbnQgPSBsZTMyX3RvX2NwdShwRXZlbnRSZXBseS0+RXZlbnQpICYgMHhGRjsKKy8vCWV2Q3R4ID0gbGUzMl90b19jcHUocEV2ZW50UmVwbHktPkV2ZW50Q29udGV4dCk7CisJZXZEYXRhTGVuID0gbGUxNl90b19jcHUocEV2ZW50UmVwbHktPkV2ZW50RGF0YUxlbmd0aCk7CisJaWYgKGV2RGF0YUxlbikgeworCQlldkRhdGEwID0gbGUzMl90b19jcHUocEV2ZW50UmVwbHktPkRhdGFbMF0pOworCX0KKworCWV2U3RyID0gRXZlbnREZXNjcmlwdGlvblN0cihldmVudCwgZXZEYXRhMCk7CisJZGV2dHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiTVBUIGV2ZW50ICglcz0lMDJYaCkgZGV0ZWN0ZWQhXG4iLAorCQkJaW9jLT5uYW1lLAorCQkJZXZTdHIsCisJCQlldmVudCkpOworCisjaWYgZGVmaW5lZChNUFRfREVCVUcpIHx8IGRlZmluZWQoTVBUX0RFQlVHX0VWRU5UUykKKwlwcmludGsoS0VSTl9JTkZPIE1ZTkFNICI6IEV2ZW50IGRhdGE6XG4iIEtFUk5fSU5GTyk7CisJZm9yIChpaSA9IDA7IGlpIDwgZXZEYXRhTGVuOyBpaSsrKQorCQlwcmludGsoIiAlMDh4IiwgbGUzMl90b19jcHUocEV2ZW50UmVwbHktPkRhdGFbaWldKSk7CisJcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKwkvKgorCSAqICBEbyBnZW5lcmFsIC8gYmFzZSBkcml2ZXIgZXZlbnQgcHJvY2Vzc2luZworCSAqLworCXN3aXRjaChldmVudCkgeworCWNhc2UgTVBJX0VWRU5UX05PTkU6CQkJLyogMDAgKi8KKwljYXNlIE1QSV9FVkVOVF9MT0dfREFUQToJCS8qIDAxICovCisJY2FzZSBNUElfRVZFTlRfU1RBVEVfQ0hBTkdFOgkJLyogMDIgKi8KKwljYXNlIE1QSV9FVkVOVF9VTklUX0FUVEVOVElPTjoJCS8qIDAzICovCisJY2FzZSBNUElfRVZFTlRfSU9DX0JVU19SRVNFVDoJCS8qIDA0ICovCisJY2FzZSBNUElfRVZFTlRfRVhUX0JVU19SRVNFVDoJCS8qIDA1ICovCisJY2FzZSBNUElfRVZFTlRfUkVTQ0FOOgkJCS8qIDA2ICovCisJY2FzZSBNUElfRVZFTlRfTElOS19TVEFUVVNfQ0hBTkdFOgkvKiAwNyAqLworCWNhc2UgTVBJX0VWRU5UX0xPT1BfU1RBVEVfQ0hBTkdFOgkvKiAwOCAqLworCWNhc2UgTVBJX0VWRU5UX0xPR09VVDoJCQkvKiAwOSAqLworCWNhc2UgTVBJX0VWRU5UX0lOVEVHUkFURURfUkFJRDoJCS8qIDBCICovCisJY2FzZSBNUElfRVZFTlRfU0NTSV9ERVZJQ0VfU1RBVFVTX0NIQU5HRToJLyogMEMgKi8KKwlkZWZhdWx0OgorCQlicmVhazsKKwljYXNlIE1QSV9FVkVOVF9FVkVOVF9DSEFOR0U6CQkvKiAwQSAqLworCQlpZiAoZXZEYXRhTGVuKSB7CisJCQl1OCBldlN0YXRlID0gZXZEYXRhMCAmIDB4RkY7CisKKwkJCS8qIENIRUNLTUUhIFdoYXQgaWYgZXZTdGF0ZSB1bmV4cGVjdGVkbHkgc2F5cyBPRkYgKDApPyAqLworCisJCQkvKiBVcGRhdGUgRXZlbnRTdGF0ZSBmaWVsZCBpbiBjYWNoZWQgSW9jRmFjdHMgKi8KKwkJCWlmIChpb2MtPmZhY3RzLkZ1bmN0aW9uKSB7CisJCQkJaW9jLT5mYWN0cy5FdmVudFN0YXRlID0gZXZTdGF0ZTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisKKwkvKgorCSAqIFNob3VsZCB0aGlzIGV2ZW50IGJlIGxvZ2dlZD8gRXZlbnRzIGFyZSB3cml0dGVuIHNlcXVlbnRpYWxseS4KKwkgKiBXaGVuIGJ1ZmZlciBpcyBmdWxsLCBzdGFydCBhZ2FpbiBhdCB0aGUgdG9wLgorCSAqLworCWlmIChpb2MtPmV2ZW50cyAmJiAoaW9jLT5ldmVudFR5cGVzICYgKCAxIDw8IGV2ZW50KSkpIHsKKwkJaW50IGlkeDsKKworCQlpZHggPSBpb2MtPmV2ZW50Q29udGV4dCAlIGlvYy0+ZXZlbnRMb2dTaXplOworCisJCWlvYy0+ZXZlbnRzW2lkeF0uZXZlbnQgPSBldmVudDsKKwkJaW9jLT5ldmVudHNbaWR4XS5ldmVudENvbnRleHQgPSBpb2MtPmV2ZW50Q29udGV4dDsKKworCQlmb3IgKGlpID0gMDsgaWkgPCAyOyBpaSsrKSB7CisJCQlpZiAoaWkgPCBldkRhdGFMZW4pCisJCQkJaW9jLT5ldmVudHNbaWR4XS5kYXRhW2lpXSA9IGxlMzJfdG9fY3B1KHBFdmVudFJlcGx5LT5EYXRhW2lpXSk7CisJCQllbHNlCisJCQkJaW9jLT5ldmVudHNbaWR4XS5kYXRhW2lpXSA9ICAwOworCQl9CisKKwkJaW9jLT5ldmVudENvbnRleHQrKzsKKwl9CisKKworCS8qCisJICogIENhbGwgZWFjaCBjdXJyZW50bHkgcmVnaXN0ZXJlZCBwcm90b2NvbCBldmVudCBoYW5kbGVyLgorCSAqLworCWZvciAoaWk9TVBUX01BWF9QUk9UT0NPTF9EUklWRVJTLTE7IGlpOyBpaS0tKSB7CisJCWlmIChNcHRFdkhhbmRsZXJzW2lpXSkgeworCQkJZGV2dHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiUm91dGluZyBFdmVudCB0byBldmVudCBoYW5kbGVyICMlZFxuIiwKKwkJCQkJaW9jLT5uYW1lLCBpaSkpOworCQkJciArPSAoKihNcHRFdkhhbmRsZXJzW2lpXSkpKGlvYywgcEV2ZW50UmVwbHkpOworCQkJaGFuZGxlcnMrKzsKKwkJfQorCX0KKwkvKiBGSVhNRT8gIEV4YW1pbmUgcmVzdWx0cyBoZXJlPyAqLworCisJLyoKKwkgKiAgSWYgbmVlZGVkLCBzZW5kIChhIHNpbmdsZSkgRXZlbnRBY2suCisJICovCisJaWYgKHBFdmVudFJlcGx5LT5BY2tSZXF1aXJlZCA9PSBNUElfRVZFTlRfTk9USUZJQ0FUSU9OX0FDS19SRVFVSVJFRCkgeworCQlpZiAoKGlpID0gU2VuZEV2ZW50QWNrKGlvYywgcEV2ZW50UmVwbHkpKSAhPSAwKSB7CisJCQlkZXZ0cHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJTZW5kRXZlbnRBY2sgcmV0dXJuZWQgJWRcbiIsCisJCQkJCWlvYy0+bmFtZSwgaWkpKTsKKwkJfQorCX0KKworCSpldkhhbmRsZXJzID0gaGFuZGxlcnM7CisJcmV0dXJuIHI7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKgltcHRfZmNfbG9nX2luZm8gLSBMb2cgaW5mb3JtYXRpb24gcmV0dXJuZWQgZnJvbSBGaWJyZSBDaGFubmVsIElPQy4KKyAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCisgKglAbG9nX2luZm86IFUzMiBMb2dJbmZvIHJlcGx5IHdvcmQgZnJvbSB0aGUgSU9DCisgKgorICoJUmVmZXIgdG8gbHNpL2ZjX2xvZy5oLgorICovCitzdGF0aWMgdm9pZAorbXB0X2ZjX2xvZ19pbmZvKE1QVF9BREFQVEVSICppb2MsIHUzMiBsb2dfaW5mbykKK3sKKwlzdGF0aWMgY2hhciAqc3ViY2xfc3RyWzhdID0geworCQkiRkNQIEluaXRpYXRvciIsICJGQ1AgVGFyZ2V0IiwgIkxBTiIsICJNUEkgTWVzc2FnZSBMYXllciIsCisJCSJGQyBMaW5rIiwgIkNvbnRleHQgTWFuYWdlciIsICJJbnZhbGlkIEZpZWxkIE9mZnNldCIsICJTdGF0ZSBDaGFuZ2UgSW5mbyIKKwl9OworCXU4IHN1YmNsID0gKGxvZ19pbmZvID4+IDI0KSAmIDB4NzsKKworCXByaW50ayhNWUlPQ19zX0lORk9fRk1UICJMb2dJbmZvKDB4JTA4eCk6IFN1YkNsPXslc31cbiIsCisJCQlpb2MtPm5hbWUsIGxvZ19pbmZvLCBzdWJjbF9zdHJbc3ViY2xdKTsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCW1wdF9zcF9sb2dfaW5mbyAtIExvZyBpbmZvcm1hdGlvbiByZXR1cm5lZCBmcm9tIFNDU0kgUGFyYWxsZWwgSU9DLgorICoJQGlvYzogUG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKKyAqCUBtcjogUG9pbnRlciB0byBNUFQgcmVwbHkgZnJhbWUKKyAqCUBsb2dfaW5mbzogVTMyIExvZ0luZm8gd29yZCBmcm9tIHRoZSBJT0MKKyAqCisgKglSZWZlciB0byBsc2kvc3BfbG9nLmguCisgKi8KK3N0YXRpYyB2b2lkCittcHRfc3BfbG9nX2luZm8oTVBUX0FEQVBURVIgKmlvYywgdTMyIGxvZ19pbmZvKQoreworCXUzMiBpbmZvID0gbG9nX2luZm8gJiAweDAwRkYwMDAwOworCWNoYXIgKmRlc2MgPSAidW5rbm93biI7CisKKwlzd2l0Y2ggKGluZm8pIHsKKwljYXNlIDB4MDAwMTAwMDA6CisJCWRlc2MgPSAiYnVnISBNSUQgbm90IGZvdW5kIjsKKwkJaWYgKGlvYy0+cmVsb2FkX2Z3ID09IDApCisJCQlpb2MtPnJlbG9hZF9mdysrOworCQlicmVhazsKKworCWNhc2UgMHgwMDAyMDAwMDoKKwkJZGVzYyA9ICJQYXJpdHkgRXJyb3IiOworCQlicmVhazsKKworCWNhc2UgMHgwMDAzMDAwMDoKKwkJZGVzYyA9ICJBU1lOQyBPdXRib3VuZCBPdmVycnVuIjsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDAwNDAwMDA6CisJCWRlc2MgPSAiU1lOQyBPZmZzZXQgRXJyb3IiOworCQlicmVhazsKKworCWNhc2UgMHgwMDA1MDAwMDoKKwkJZGVzYyA9ICJCTSBDaGFuZ2UiOworCQlicmVhazsKKworCWNhc2UgMHgwMDA2MDAwMDoKKwkJZGVzYyA9ICJNc2cgSW4gT3ZlcmZsb3ciOworCQlicmVhazsKKworCWNhc2UgMHgwMDA3MDAwMDoKKwkJZGVzYyA9ICJETUEgRXJyb3IiOworCQlicmVhazsKKworCWNhc2UgMHgwMDA4MDAwMDoKKwkJZGVzYyA9ICJPdXRib3VuZCBETUEgT3ZlcnJ1biI7CisJCWJyZWFrOworCQorCWNhc2UgMHgwMDA5MDAwMDoKKwkJZGVzYyA9ICJUYXNrIE1hbmFnZW1lbnQiOworCQlicmVhazsKKworCWNhc2UgMHgwMDBBMDAwMDoKKwkJZGVzYyA9ICJEZXZpY2UgUHJvYmxlbSI7CisJCWJyZWFrOworCisJY2FzZSAweDAwMEIwMDAwOgorCQlkZXNjID0gIkludmFsaWQgUGhhc2UgQ2hhbmdlIjsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDAwQzAwMDA6CisJCWRlc2MgPSAiVW50YWdnZWQgVGFibGUgU2l6ZSI7CisJCWJyZWFrOworCQorCX0KKworCXByaW50ayhNWUlPQ19zX0lORk9fRk1UICJMb2dJbmZvKDB4JTA4eCk6IEYvVzogJXNcbiIsIGlvYy0+bmFtZSwgbG9nX2luZm8sIGRlc2MpOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJbXB0X3NwX2lvY19pbmZvIC0gSU9DIGluZm9ybWF0aW9uIHJldHVybmVkIGZyb20gU0NTSSBQYXJhbGxlbCBJT0MuCisgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQorICoJQGlvY19zdGF0dXM6IFUzMiBJT0NTdGF0dXMgd29yZCBmcm9tIElPQworICoJQG1mOiBQb2ludGVyIHRvIE1QVCByZXF1ZXN0IGZyYW1lCisgKgorICoJUmVmZXIgdG8gbHNpL21waS5oLgorICovCitzdGF0aWMgdm9pZAorbXB0X3NwX2lvY19pbmZvKE1QVF9BREFQVEVSICppb2MsIHUzMiBpb2Nfc3RhdHVzLCBNUFRfRlJBTUVfSERSICptZikKK3sKKwl1MzIgc3RhdHVzID0gaW9jX3N0YXR1cyAmIE1QSV9JT0NTVEFUVVNfTUFTSzsKKwljaGFyICpkZXNjID0gIiI7CisKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgTVBJX0lPQ1NUQVRVU19JTlZBTElEX0ZVTkNUSU9OOiAvKiAweDAwMDEgKi8KKwkJZGVzYyA9ICJJbnZhbGlkIEZ1bmN0aW9uIjsKKwkJYnJlYWs7CisKKwljYXNlIE1QSV9JT0NTVEFUVVNfQlVTWTogLyogMHgwMDAyICovCisJCWRlc2MgPSAiQnVzeSI7CisJCWJyZWFrOworCisJY2FzZSBNUElfSU9DU1RBVFVTX0lOVkFMSURfU0dMOiAvKiAweDAwMDMgKi8KKwkJZGVzYyA9ICJJbnZhbGlkIFNHTCI7CisJCWJyZWFrOworCisJY2FzZSBNUElfSU9DU1RBVFVTX0lOVEVSTkFMX0VSUk9SOiAvKiAweDAwMDQgKi8KKwkJZGVzYyA9ICJJbnRlcm5hbCBFcnJvciI7CisJCWJyZWFrOworCisJY2FzZSBNUElfSU9DU1RBVFVTX1JFU0VSVkVEOiAvKiAweDAwMDUgKi8KKwkJZGVzYyA9ICJSZXNlcnZlZCI7CisJCWJyZWFrOworCisJY2FzZSBNUElfSU9DU1RBVFVTX0lOU1VGRklDSUVOVF9SRVNPVVJDRVM6IC8qIDB4MDAwNiAqLworCQlkZXNjID0gIkluc3VmZmljaWVudCBSZXNvdXJjZXMiOworCQlicmVhazsKKworCWNhc2UgTVBJX0lPQ1NUQVRVU19JTlZBTElEX0ZJRUxEOiAvKiAweDAwMDcgKi8KKwkJZGVzYyA9ICJJbnZhbGlkIEZpZWxkIjsKKwkJYnJlYWs7CisKKwljYXNlIE1QSV9JT0NTVEFUVVNfSU5WQUxJRF9TVEFURTogLyogMHgwMDA4ICovCisJCWRlc2MgPSAiSW52YWxpZCBTdGF0ZSI7CisJCWJyZWFrOworCisJY2FzZSBNUElfSU9DU1RBVFVTX0NPTkZJR19JTlZBTElEX0FDVElPTjogLyogMHgwMDIwICovCisJY2FzZSBNUElfSU9DU1RBVFVTX0NPTkZJR19JTlZBTElEX1RZUEU6ICAgLyogMHgwMDIxICovCisJY2FzZSBNUElfSU9DU1RBVFVTX0NPTkZJR19JTlZBTElEX1BBR0U6ICAgLyogMHgwMDIyICovCisJY2FzZSBNUElfSU9DU1RBVFVTX0NPTkZJR19JTlZBTElEX0RBVEE6ICAgLyogMHgwMDIzICovCisJY2FzZSBNUElfSU9DU1RBVFVTX0NPTkZJR19OT19ERUZBVUxUUzogICAgLyogMHgwMDI0ICovCisJY2FzZSBNUElfSU9DU1RBVFVTX0NPTkZJR19DQU5UX0NPTU1JVDogICAgLyogMHgwMDI1ICovCisJCS8qIE5vIG1lc3NhZ2UgZm9yIENvbmZpZyBJT0NTdGF0dXMgdmFsdWVzICovCisJCWJyZWFrOworCisJY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfUkVDT1ZFUkVEX0VSUk9SOiAvKiAweDAwNDAgKi8KKwkJLyogTm8gbWVzc2FnZSBmb3IgcmVjb3ZlcmVkIGVycm9yCisJCWRlc2MgPSAiU0NTSSBSZWNvdmVyZWQgRXJyb3IiOworCQkqLworCQlicmVhazsKKworCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX0lOVkFMSURfQlVTOiAvKiAweDAwNDEgKi8KKwkJZGVzYyA9ICJTQ1NJIEludmFsaWQgQnVzIjsKKwkJYnJlYWs7CisKKwljYXNlIE1QSV9JT0NTVEFUVVNfU0NTSV9JTlZBTElEX1RBUkdFVElEOiAvKiAweDAwNDIgKi8KKwkJZGVzYyA9ICJTQ1NJIEludmFsaWQgVGFyZ2V0SUQiOworCQlicmVhazsKKworCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX0RFVklDRV9OT1RfVEhFUkU6IC8qIDB4MDA0MyAqLworCSAgeworCQlTQ1NJSU9SZXF1ZXN0X3QgKnBTY3NpUmVxID0gKFNDU0lJT1JlcXVlc3RfdCAqKSBtZjsKKwkJVTggY2RiID0gcFNjc2lSZXEtPkNEQlswXTsKKwkJaWYgKGNkYiAhPSAweDEyKSB7IC8qIElucXVpcnkgaXMgaXNzdWVkIGZvciBkZXZpY2Ugc2Nhbm5pbmcgKi8KKwkJCWRlc2MgPSAiU0NTSSBEZXZpY2UgTm90IFRoZXJlIjsKKwkJfQorCQlicmVhazsKKwkgIH0KKworCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX0RBVEFfT1ZFUlJVTjogLyogMHgwMDQ0ICovCisJCWRlc2MgPSAiU0NTSSBEYXRhIE92ZXJydW4iOworCQlicmVhazsKKworCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX0RBVEFfVU5ERVJSVU46IC8qIDB4MDA0NSAqLworCQkvKiBUaGlzIGVycm9yIGlzIGNoZWNrZWQgaW4gc2NzaV9pb19kb25lKCkuIFNraXAuIAorCQlkZXNjID0gIlNDU0kgRGF0YSBVbmRlcnJ1biI7CisJCSovCisJCWJyZWFrOworCisJY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfSU9fREFUQV9FUlJPUjogLyogMHgwMDQ2ICovCisJCWRlc2MgPSAiU0NTSSBJL08gRGF0YSBFcnJvciI7CisJCWJyZWFrOworCisJY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfUFJPVE9DT0xfRVJST1I6IC8qIDB4MDA0NyAqLworCQlkZXNjID0gIlNDU0kgUHJvdG9jb2wgRXJyb3IiOworCQlicmVhazsKKworCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX1RBU0tfVEVSTUlOQVRFRDogLyogMHgwMDQ4ICovCisJCWRlc2MgPSAiU0NTSSBUYXNrIFRlcm1pbmF0ZWQiOworCQlicmVhazsKKworCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX1JFU0lEVUFMX01JU01BVENIOiAvKiAweDAwNDkgKi8KKwkJZGVzYyA9ICJTQ1NJIFJlc2lkdWFsIE1pc21hdGNoIjsKKwkJYnJlYWs7CisKKwljYXNlIE1QSV9JT0NTVEFUVVNfU0NTSV9UQVNLX01HTVRfRkFJTEVEOiAvKiAweDAwNEEgKi8KKwkJZGVzYyA9ICJTQ1NJIFRhc2sgTWFuYWdlbWVudCBGYWlsZWQiOworCQlicmVhazsKKworCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX0lPQ19URVJNSU5BVEVEOiAvKiAweDAwNEIgKi8KKwkJZGVzYyA9ICJTQ1NJIElPQyBUZXJtaW5hdGVkIjsKKwkJYnJlYWs7CisKKwljYXNlIE1QSV9JT0NTVEFUVVNfU0NTSV9FWFRfVEVSTUlOQVRFRDogLyogMHgwMDRDICovCisJCWRlc2MgPSAiU0NTSSBFeHQgVGVybWluYXRlZCI7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGVzYyA9ICJPdGhlcnMiOworCQlicmVhazsKKwl9CisJaWYgKGRlc2MgIT0gIiIpCisJCXByaW50ayhNWUlPQ19zX0lORk9fRk1UICJJT0NTdGF0dXMoMHglMDR4KTogJXNcbiIsIGlvYy0+bmFtZSwgc3RhdHVzLCBkZXNjKTsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworRVhQT1JUX1NZTUJPTChpb2NfbGlzdCk7CitFWFBPUlRfU1lNQk9MKG1wdF9wcm9jX3Jvb3RfZGlyKTsKK0VYUE9SVF9TWU1CT0wobXB0X3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0wobXB0X2RlcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChtcHRfZXZlbnRfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChtcHRfZXZlbnRfZGVyZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKG1wdF9yZXNldF9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKG1wdF9yZXNldF9kZXJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0wobXB0X2RldmljZV9kcml2ZXJfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChtcHRfZGV2aWNlX2RyaXZlcl9kZXJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0wobXB0X2dldF9tc2dfZnJhbWUpOworRVhQT1JUX1NZTUJPTChtcHRfcHV0X21zZ19mcmFtZSk7CitFWFBPUlRfU1lNQk9MKG1wdF9mcmVlX21zZ19mcmFtZSk7CitFWFBPUlRfU1lNQk9MKG1wdF9hZGRfc2dlKTsKK0VYUE9SVF9TWU1CT0wobXB0X3NlbmRfaGFuZHNoYWtlX3JlcXVlc3QpOworRVhQT1JUX1NZTUJPTChtcHRfdmVyaWZ5X2FkYXB0ZXIpOworRVhQT1JUX1NZTUJPTChtcHRfR2V0SW9jU3RhdGUpOworRVhQT1JUX1NZTUJPTChtcHRfcHJpbnRfaW9jX3N1bW1hcnkpOworRVhQT1JUX1NZTUJPTChtcHRfbGFuX2luZGV4KTsKK0VYUE9SVF9TWU1CT0wobXB0X3N0bV9pbmRleCk7CitFWFBPUlRfU1lNQk9MKG1wdF9IYXJkUmVzZXRIYW5kbGVyKTsKK0VYUE9SVF9TWU1CT0wobXB0X2NvbmZpZyk7CitFWFBPUlRfU1lNQk9MKG1wdF90b29sYm94KTsKK0VYUE9SVF9TWU1CT0wobXB0X2ZpbmRJbVZvbHVtZXMpOworRVhQT1JUX1NZTUJPTChtcHRfcmVhZF9pb2NfcGdfMyk7CitFWFBPUlRfU1lNQk9MKG1wdF9hbGxvY19md19tZW1vcnkpOworRVhQT1JUX1NZTUJPTChtcHRfZnJlZV9md19tZW1vcnkpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbXB0YmFzZV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIm1wdGJhc2UiLAorCS5pZF90YWJsZQk9IG1wdGJhc2VfcGNpX3RhYmxlLAorCS5wcm9iZQkJPSBtcHRiYXNlX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobXB0YmFzZV9yZW1vdmUpLAorCS5kcml2ZXIgICAgICAgICA9IHsKKwkJLnNodXRkb3duID0gbXB0YmFzZV9zaHV0ZG93biwKKyAgICAgICAgfSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IG1wdGJhc2Vfc3VzcGVuZCwKKwkucmVzdW1lCQk9IG1wdGJhc2VfcmVzdW1lLAorI2VuZGlmCit9OworCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJZnVzaW9uX2luaXQgLSBGdXNpb24gTVBUIGJhc2UgZHJpdmVyIGluaXRpYWxpemF0aW9uIHJvdXRpbmUuCisgKgorICoJUmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBfX2luaXQKK2Z1c2lvbl9pbml0KHZvaWQpCit7CisJaW50IGk7CisJaW50IHI7CisKKwlzaG93X21wdG1vZF92ZXIobXlfTkFNRSwgbXlfVkVSU0lPTik7CisJcHJpbnRrKEtFUk5fSU5GTyBDT1BZUklHSFQgIlxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVBUX01BWF9QUk9UT0NPTF9EUklWRVJTOyBpKyspIHsKKwkJTXB0Q2FsbGJhY2tzW2ldID0gTlVMTDsKKwkJTXB0RHJpdmVyQ2xhc3NbaV0gPSBNUFRVTktOT1dOX0RSSVZFUjsKKwkJTXB0RXZIYW5kbGVyc1tpXSA9IE5VTEw7CisJCU1wdFJlc2V0SGFuZGxlcnNbaV0gPSBOVUxMOworCX0KKworCS8qIE5FVyEgIDIwMDEwMTIwIC1zcmFsc3RvbgorCSAqICBSZWdpc3RlciBvdXJzZWx2ZXMgKG1wdGJhc2UpIGluIG9yZGVyIHRvIGZhY2lsaXRhdGUKKwkgKiAgRXZlbnROb3RpZmljYXRpb24gaGFuZGxpbmcuCisJICovCisJbXB0X2Jhc2VfaW5kZXggPSBtcHRfcmVnaXN0ZXIobXB0X2Jhc2VfcmVwbHksIE1QVEJBU0VfRFJJVkVSKTsKKworCS8qIFJlZ2lzdGVyIGZvciBoYXJkIHJlc2V0IGhhbmRsaW5nIGNhbGxiYWNrcy4KKwkgKi8KKwlpZiAobXB0X3Jlc2V0X3JlZ2lzdGVyKG1wdF9iYXNlX2luZGV4LCBtcHRfaW9jX3Jlc2V0KSA9PSAwKSB7CisJCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBSZWdpc3RlciBmb3IgSU9DIHJlc2V0IG5vdGlmaWNhdGlvblxuIikpOworCX0gZWxzZSB7CisJCS8qIEZJWE1FISAqLworCX0KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJKHZvaWQpIHByb2NtcHRfY3JlYXRlKCk7CisjZW5kaWYKKwlyID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmbXB0YmFzZV9kcml2ZXIpOworCWlmKHIpCisJCXJldHVybihyKTsKKworCXJldHVybiByOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJZnVzaW9uX2V4aXQgLSBQZXJmb3JtIGRyaXZlciB1bmxvYWQgY2xlYW51cC4KKyAqCisgKglUaGlzIHJvdXRpbmUgZnJlZXMgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBNUFQgYWRhcHRlcgorICoJYW5kIHJlbW92ZXMgYWxsICVNUFRfUFJPQ0ZTX01QVEJBU0VESVIgZW50cmllcy4KKyAqLworc3RhdGljIHZvaWQgX19leGl0CitmdXNpb25fZXhpdCh2b2lkKQoreworCisJZGV4aXRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBmdXNpb25fZXhpdCgpIGNhbGxlZCFcbiIpKTsKKworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbXB0YmFzZV9kcml2ZXIpOworCW1wdF9yZXNldF9kZXJlZ2lzdGVyKG1wdF9iYXNlX2luZGV4KTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJcHJvY21wdF9kZXN0cm95KCk7CisjZW5kaWYKK30KKworCittb2R1bGVfaW5pdChmdXNpb25faW5pdCk7Cittb2R1bGVfZXhpdChmdXNpb25fZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuaCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNjczMDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuaApAQCAtMCwwICsxLDEwMjEgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmgKKyAqICAgICAgSGlnaCBwZXJmb3JtYW5jZSBTQ1NJICsgTEFOIC8gRmlicmUgQ2hhbm5lbCBkZXZpY2UgZHJpdmVycy4KKyAqICAgICAgRm9yIHVzZSB3aXRoIFBDSSBjaGlwL2FkYXB0ZXIocyk6CisgKiAgICAgICAgICBMU0lGQzl4eC9MU0k0MDl4eCBGaWJyZSBDaGFubmVsCisgKiAgICAgIHJ1bm5pbmcgTFNJIExvZ2ljIEZ1c2lvbiBNUFQgKE1lc3NhZ2UgUGFzc2luZyBUZWNobm9sb2d5KSBmaXJtd2FyZS4KKyAqCisgKiAgQ3JlZGl0czoKKyAqICAgICAoc2VlIG1wdGJhc2UuYykKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgTFNJIExvZ2ljIENvcnBvcmF0aW9uCisgKiAgT3JpZ2luYWxseSBCeTogU3RldmVuIEouIFJhbHN0b24KKyAqICAobWFpbHRvOnNqcmFsc3RvbjFAbmV0c2NhcGUubmV0KQorICogIChtYWlsdG86bXB0X2xpbnV4X2RldmVsb3BlckBsc2lsLmNvbSkKKyAqCisgKiAgJElkOiBtcHRiYXNlLmgsdiAxLjE0NCAyMDAzLzAxLzI4IDIxOjMxOjU2IHBkZWxhbmV5IEV4cCAkCisgKi8KKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBOTyBXQVJSQU5UWQorICAgIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgorICAgIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUCisgICAgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKKyAgICBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzCisgICAgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorICAgIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworICAgIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsCisgICAgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisKKyAgICBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorICAgIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCisgICAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICAgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQKKyAgICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyAgICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgICAgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECisgICAgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUworCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKyNpZm5kZWYgTVBUQkFTRV9IX0lOQ0xVREVECisjZGVmaW5lIE1QVEJBU0VfSF9JTkNMVURFRAorLyp7LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSAibHNpL21waV90eXBlLmgiCisjaW5jbHVkZSAibHNpL21waS5oIgkJLyogRnVzaW9uIE1QSShudGVyZmFjZSkgYmFzaWMgZGVmcyAqLworI2luY2x1ZGUgImxzaS9tcGlfaW9jLmgiCS8qIEZ1c2lvbiBNUFQgSU9DKG9udHJvbGxlcikgZGVmcyAqLworI2luY2x1ZGUgImxzaS9tcGlfY25mZy5oIgkvKiBJT0MgY29uZmlndXJhdGlvbiBzdXBwb3J0ICovCisjaW5jbHVkZSAibHNpL21waV9pbml0LmgiCS8qIFNDU0kgSG9zdCAoaW5pdGlhdG9yKSBwcm90b2NvbCBzdXBwb3J0ICovCisjaW5jbHVkZSAibHNpL21waV9sYW4uaCIJLyogTEFOIG92ZXIgRkMgcHJvdG9jb2wgc3VwcG9ydCAqLworI2luY2x1ZGUgImxzaS9tcGlfcmFpZC5oIgkvKiBJbnRlZ3JhdGVkIE1pcnJvcmluZyBzdXBwb3J0ICovCisKKyNpbmNsdWRlICJsc2kvbXBpX2ZjLmgiCQkvKiBGaWJyZSBDaGFubmVsIChsb3dsZXZlbCkgc3VwcG9ydCAqLworI2luY2x1ZGUgImxzaS9tcGlfdGFyZy5oIgkvKiBTQ1NJL0ZDUCBUYXJnZXQgcHJvdGNvbCBzdXBwb3J0ICovCisjaW5jbHVkZSAibHNpL21waV90b29sLmgiCS8qIFRvb2xzIHN1cHBvcnQgKi8KKyNpbmNsdWRlICJsc2kvZmNfbG9nLmgiCisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKworI2lmbmRlZiBNT0RVTEVBVVRIT1IKKyNkZWZpbmUgTU9EVUxFQVVUSE9SCSJMU0kgTG9naWMgQ29ycG9yYXRpb24iCisjZW5kaWYKKworI2lmbmRlZiBDT1BZUklHSFQKKyNkZWZpbmUgQ09QWVJJR0hUCSJDb3B5cmlnaHQgKGMpIDE5OTktMjAwNCAiIE1PRFVMRUFVVEhPUgorI2VuZGlmCisKKyNkZWZpbmUgTVBUX0xJTlVYX1ZFUlNJT05fQ09NTU9OCSIzLjAxLjIwIgorI2RlZmluZSBNUFRfTElOVVhfUEFDS0FHRV9OQU1FCQkiQCgjKW1wdGxpbnV4LTMuMDEuMjAiCisjZGVmaW5lIFdIQVRfTUFHSUNfU1RSSU5HCQkiQCIgIigiICIjIiAiKSIKKworI2RlZmluZSBzaG93X21wdG1vZF92ZXIocyx2ZXIpICBcCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgJXNcbiIsIHMsIHZlcik7CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKiAgRnVzaW9uIE1QVChsaW51eCkgZHJpdmVyIGNvbmZpZ3VyYWJsZSBzdHVmZi4uLgorICovCisjZGVmaW5lIE1QVF9NQVhfQURBUFRFUlMJCTE4CisjZGVmaW5lIE1QVF9NQVhfUFJPVE9DT0xfRFJJVkVSUwkxNgorI2RlZmluZSBNUFRfTUFYX0JVUwkJCTEJLyogRG8gbm90IGNoYW5nZSAqLworI2RlZmluZSBNUFRfTUFYX0ZDX0RFVklDRVMJCTI1NQorI2RlZmluZSBNUFRfTUFYX1NDU0lfREVWSUNFUwkJMTYKKyNkZWZpbmUgTVBUX0xBU1RfTFVOCQkJMjU1CisjZGVmaW5lIE1QVF9TRU5TRV9CVUZGRVJfQUxMT0MJCTY0CisJLyogYWxsb3cgZm9yIDI1NiBtYXggc2Vuc2UgYWxsb2MsIGJ1dCBvbmx5IDI1NSBtYXggcmVxdWVzdCAqLworI2lmIE1QVF9TRU5TRV9CVUZGRVJfQUxMT0MgPj0gMjU2CisjCXVuZGVmIE1QVF9TRU5TRV9CVUZGRVJfQUxMT0MKKyMJZGVmaW5lIE1QVF9TRU5TRV9CVUZGRVJfQUxMT0MJMjU2CisjCWRlZmluZSBNUFRfU0VOU0VfQlVGRkVSX1NJWkUJMjU1CisjZWxzZQorIwlkZWZpbmUgTVBUX1NFTlNFX0JVRkZFUl9TSVpFCU1QVF9TRU5TRV9CVUZGRVJfQUxMT0MKKyNlbmRpZgorCisjZGVmaW5lIE1QVF9OQU1FX0xFTkdUSAkJCTMyCisKKyNkZWZpbmUgTVBUX1BST0NGU19NUFRCQVNFRElSCQkibXB0IgorCQkJCQkJLyogY2hnIGl0IHRvICJkcml2ZXIvZnVzaW9uIiA/ICovCisjZGVmaW5lIE1QVF9QUk9DRlNfU1VNTUFSWV9BTExfTk9ERQkJTVBUX1BST0NGU19NUFRCQVNFRElSICIvc3VtbWFyeSIKKyNkZWZpbmUgTVBUX1BST0NGU19TVU1NQVJZX0FMTF9QQVRITkFNRQkJIi9wcm9jLyIgTVBUX1BST0NGU19TVU1NQVJZX0FMTF9OT0RFCisjZGVmaW5lIE1QVF9GV19SRVZfTUFHSUNfSURfU1RSSU5HCQkiRndSZXY9IgorCisjZGVmaW5lICBNUFRfTUFYX1JFUV9ERVBUSAkJMTAyMworI2RlZmluZSAgTVBUX0RFRkFVTFRfUkVRX0RFUFRICQkyNTYKKyNkZWZpbmUgIE1QVF9NSU5fUkVRX0RFUFRICQkxMjgKKworI2RlZmluZSAgTVBUX01BWF9SRVBMWV9ERVBUSAkJTVBUX01BWF9SRVFfREVQVEgKKyNkZWZpbmUgIE1QVF9ERUZBVUxUX1JFUExZX0RFUFRICTEyOAorI2RlZmluZSAgTVBUX01JTl9SRVBMWV9ERVBUSAkJOAorI2RlZmluZSAgTVBUX01BWF9SRVBMSUVTX1BFUl9JU1IJMzIKKworI2RlZmluZSAgTVBUX01BWF9GUkFNRV9TSVpFCQkxMjgKKyNkZWZpbmUgIE1QVF9ERUZBVUxUX0ZSQU1FX1NJWkUJCTEyOAorCisjZGVmaW5lICBNUFRfUkVQTFlfRlJBTUVfU0laRQkJMHg0MCAgLyogTXVzdCBiZSBhIG11bHRpcGxlIG9mIDggKi8KKworI2RlZmluZSAgTVBUX1NHX1JFUV8xMjhfU0NBTEUJCTEKKyNkZWZpbmUgIE1QVF9TR19SRVFfOTZfU0NBTEUJCTIKKyNkZWZpbmUgIE1QVF9TR19SRVFfNjRfU0NBTEUJCTQKKworI2RlZmluZQkgQ0FOX1NMRUVQCQkJMQorI2RlZmluZSAgTk9fU0xFRVAJCQkwCisKKyNkZWZpbmUgTVBUX0NPQUxFU0NJTkdfVElNRU9VVAkJMHgxMAorCisvKgorICogU0NTSSB0cmFuc2ZlciByYXRlIGRlZmluZXMuCisgKi8KKyNkZWZpbmUgTVBUX1VMVFJBMzIwCQkJMHgwOAorI2RlZmluZSBNUFRfVUxUUkExNjAJCQkweDA5CisjZGVmaW5lIE1QVF9VTFRSQTIJCQkweDBBCisjZGVmaW5lIE1QVF9VTFRSQQkJCTB4MEMKKyNkZWZpbmUgTVBUX0ZBU1QJCQkweDE5CisjZGVmaW5lIE1QVF9TQ1NJCQkJMHgzMgorI2RlZmluZSBNUFRfQVNZTkMJCQkweEZGCisKKyNkZWZpbmUgTVBUX05BUlJPVwkJCTAKKyNkZWZpbmUgTVBUX1dJREUJCQkxCisKKyNkZWZpbmUgQzBfMTAzMAkJCQkweDA4CisjZGVmaW5lIFhMXzkyOQkJCQkweDAxCisKKworLyoKKyAqCVRyeSB0byBrZWVwIHRoZXNlIGF0IDJeTi0xCisgKi8KKyNkZWZpbmUgTVBUX0ZDX0NBTl9RVUVVRQkxMjcKKyNkZWZpbmUgTVBUX1NDU0lfQ0FOX1FVRVVFCTEyNworCisvKgorICogU2V0IHRoZSBNQVhfU0dFIHZhbHVlIGJhc2VkIG9uIHVzZXIgaW5wdXQuCisgKi8KKyNpZmRlZiAgQ09ORklHX0ZVU0lPTl9NQVhfU0dFCisjaWYgICAgIENPTkZJR19GVVNJT05fTUFYX1NHRSAgPCAxNgorI2RlZmluZSBNUFRfU0NTSV9TR19ERVBUSAkxNgorI2VsaWYgICBDT05GSUdfRlVTSU9OX01BWF9TR0UgID4gMTI4CisjZGVmaW5lIE1QVF9TQ1NJX1NHX0RFUFRICTEyOAorI2Vsc2UKKyNkZWZpbmUgTVBUX1NDU0lfU0dfREVQVEgJQ09ORklHX0ZVU0lPTl9NQVhfU0dFCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIE1QVF9TQ1NJX1NHX0RFUFRICTQwCisjZW5kaWYKKworI2lmZGVmIF9fS0VSTkVMX18JLyogeyAqLworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICogQXR0ZW1wdCBzZW1pLWNvbnNpc3RlbnQgZXJyb3IgJiB3YXJuaW5nIG1zZ3MgYWNyb3NzCisgKiBNUFQgZHJpdmVycy4gIE5PVEU6IFVzZXJzIG9mIHRoZXNlIG1hY3JvIGRlZnMgbXVzdAorICogdGhlbXNlbHZlcyBkZWZpbmUgdGhlaXIgb3duIE1ZTkFNLgorICovCisjZGVmaW5lIE1ZSU9DX3NfSU5GT19GTVQJCUtFUk5fSU5GTyBNWU5BTSAiOiAlczogIgorI2RlZmluZSBNWUlPQ19zX05PVEVfRk1UCQlLRVJOX05PVElDRSBNWU5BTSAiOiAlczogIgorI2RlZmluZSBNWUlPQ19zX1dBUk5fRk1UCQlLRVJOX1dBUk5JTkcgTVlOQU0gIjogJXM6IFdBUk5JTkcgLSAiCisjZGVmaW5lIE1ZSU9DX3NfRVJSX0ZNVAkJCUtFUk5fRVJSIE1ZTkFNICI6ICVzOiBFUlJPUiAtICIKKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqICBNUFQgcHJvdG9jb2wgZHJpdmVyIGRlZnMuLi4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlNUFRCQVNFX0RSSVZFUiwJCS8qIE1QVCBiYXNlIGNsYXNzICovCisJTVBUQ1RMX0RSSVZFUiwJCS8qIE1QVCBpb2N0bCBjbGFzcyAqLworCU1QVFNDU0lIX0RSSVZFUiwJLyogTVBUIFNDU0kgaG9zdCAoaW5pdGlhdG9yKSBjbGFzcyAqLworCU1QVExBTl9EUklWRVIsCQkvKiBNUFQgTEFOIGNsYXNzICovCisJTVBUU1RNX0RSSVZFUiwJCS8qIE1QVCBTQ1NJIHRhcmdldCBtb2RlIGNsYXNzICovCisJTVBUVU5LTk9XTl9EUklWRVIKK30gTVBUX0RSSVZFUl9DTEFTUzsKKworc3RydWN0IG1wdF9wY2lfZHJpdmVyeworCWludCAgKCpwcm9iZSkgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCk7CisJdm9pZCAoKnJlbW92ZSkgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCXZvaWQgKCpzaHV0ZG93bikgKHN0cnVjdCBkZXZpY2UgKiBkZXYpOworI2lmZGVmIENPTkZJR19QTQorCWludCAgKCpyZXN1bWUpIChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKKwlpbnQgICgqc3VzcGVuZCkgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHUzMiBzdGF0ZSk7CisjZW5kaWYKK307CisKKy8qCisgKiAgTVBUIGFkYXB0ZXIgLyBwb3J0IC8gYnVzIC8gZGV2aWNlIGluZm8gc3RydWN0dXJlcy4uLgorICovCisKK3R5cGVkZWYgdW5pb24gX01QVF9GUkFNRV9UUkFDS0VSIHsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJCXUzMgkJCSBhcmcxOworCQl1MzIJCQkgcGFkOworCQl2b2lkCQkJKmFyZ3AxOworCX0gbGlua2FnZTsKKwkvKgorCSAqIE5PVEU6IFdoZW4gcmVxdWVzdCBmcmFtZXMgYXJlIGZyZWUsIG9uIHRoZSBsaW5rYWdlIHN0cnVjdHVyZQorCSAqIGNvbnRldHMgYXJlIHZhbGlkLiAgQWxsIG90aGVyIHZhbHVlcyBhcmUgaW52YWxpZC4KKwkgKiBJbiBwYXJ0aWN1bGFyLCBkbyBOT1QgcmVwbHkgb24gb2Zmc2V0IFsyXQorCSAqIChpbiB3b3JkcykgYmVpbmcgdGhlICogbWVzc2FnZSBjb250ZXh0LgorCSAqIFRoZSBtZXNzYWdlIGNvbnRleHQgbXVzdCBiZSByZXNldCAoY29tcHV0ZWQgdmlhIGJhc2UgYWRkcmVzcworCSAqICsgYW4gb2Zmc2V0KSBwcmlvciB0byBpc3N1aW5nIGFueSBjb21tYW5kLgorCSAqCisJICogTk9URTI6IE9uIG5vbi0zMi1iaXQgc3lzdGVtcywgd2hlcmUgcG9pbnRlcnMgYXJlIExBUkdFLAorCSAqIHVzaW5nIHRoZSBsaW5rYWdlIHBvaW50ZXJzIGRlc3Ryb3lzIG91ciBzYWNyZWQgTXNnQ29udGV4dAorCSAqIGZpZWxkIGNvbnRlbnRzLiAgQnV0IHdlIGRvbid0IGNhcmUgYW55bW9yZSBiZWNhdXNlIHRoZXNlCisJICogYXJlIG5vdyByZXNldCBpbiBtcHRfcHV0X21zZ19mcmFtZSgpIGp1c3QgcHJpb3IgdG8gc2VuZGluZworCSAqIGEgcmVxdWVzdCBvZmYgdG8gdGhlIElPQy4KKwkgKi8KKwlzdHJ1Y3QgeworCQl1MzIgX19oZHJbMl07CisJCS8qCisJCSAqIFRoZSBmb2xsb3dpbmcgX01VU1RfIG1hdGNoIHRoZSBsb2NhdGlvbiBvZiB0aGUKKwkJICogTXNnQ29udGV4dCBmaWVsZCBpbiB0aGUgTVBUIG1lc3NhZ2UgaGVhZGVycy4KKwkJICovCisJCXVuaW9uIHsKKwkJCXUzMgkJIE1zZ0NvbnRleHQ7CisJCQlzdHJ1Y3QgeworCQkJCXUxNgkgcmVxX2lkeDsJLyogUmVxdWVzdCBpbmRleCAqLworCQkJCXU4CSBjYl9pZHg7CS8qIGNhbGxiYWNrIGZ1bmN0aW9uIGluZGV4ICovCisJCQkJdTgJIHJzdmQ7CisJCQl9IGZsZDsKKwkJfSBtc2djdHh1OworCX0gaHdoZHI7CisJLyoKKwkgKiBSZW1hcms6IDMyIGJpdCBpZGVudGlmaWVyOgorCSAqICAzMS0yNDogcmVzZXJ2ZWQKKwkgKiAgMjMtMTY6IGNhbGwgYmFjayBpbmRleAorCSAqICAxNS0wIDogcmVxdWVzdCBpbmRleAorCSAqLworfSBNUFRfRlJBTUVfVFJBQ0tFUjsKKworLyoKKyAqICBXZSBtaWdodCB3YW50IHRvIHZpZXcvYWNjZXNzIGEgZnJhbWUgYXM6CisgKiAgICAxKSBnZW5lcmljIHJlcXVlc3QgaGVhZGVyCisgKiAgICAyKSBTQ1NJSU9SZXF1ZXN0CisgKiAgICAzKSBTQ1NJSU9SZXBseQorICogICAgNCkgTVBJRGVmYXVsdFJlcGx5CisgKiAgICA1KSBmcmFtZSB0cmFja2VyCisgKi8KK3R5cGVkZWYgc3RydWN0IF9NUFRfRlJBTUVfSERSIHsKKwl1bmlvbiB7CisJCU1QSUhlYWRlcl90CQloZHI7CisJCVNDU0lJT1JlcXVlc3RfdAkJc2NzaXJlcTsKKwkJU0NTSUlPUmVwbHlfdAkJc3JlcGx5OworCQlDb25maWdSZXBseV90CQljb25maWdyZXBseTsKKwkJTVBJRGVmYXVsdFJlcGx5X3QJcmVwbHk7CisJCU1QVF9GUkFNRV9UUkFDS0VSCWZyYW1lOworCX0gdTsKK30gTVBUX0ZSQU1FX0hEUjsKKworI2RlZmluZSBNUFRfUkVRX01TR0ZMQUdTX0RST1BNRQkJMHg4MAorCit0eXBlZGVmIHN0cnVjdCBfTVBUX1NHTF9IRFIgeworCVNHRVNpbXBsZTMyX3QJIHNnZVsxXTsKK30gTVBUX1NHTF9IRFI7CisKK3R5cGVkZWYgc3RydWN0IF9NUFRfU0dMNjRfSERSIHsKKwlTR0VTaW1wbGU2NF90CSBzZ2VbMV07Cit9IE1QVF9TR0w2NF9IRFI7CisKKy8qCisgKiAgU3lzdGVtIGludGVyZmFjZSByZWdpc3RlciBzZXQKKyAqLworCit0eXBlZGVmIHN0cnVjdCBfU1lTSUZfUkVHUworeworCXUzMglEb29yYmVsbDsJLyogMDAgICAgIFN5c3RlbTwtPklPQyBEb29yYmVsbCByZWcgICovCisJdTMyCVdyaXRlU2VxdWVuY2U7CS8qIDA0ICAgICBXcml0ZSBTZXF1ZW5jZSByZWdpc3RlciAgICAqLworCXUzMglEaWFnbm9zdGljOwkvKiAwOCAgICAgRGlhZ25vc3RpYyByZWdpc3RlciAgICAgICAgKi8KKwl1MzIJVGVzdEJhc2U7CS8qIDBDICAgICBUZXN0IEJhc2UgQWRkcmVzcyAgICAgICAgICAqLworCXUzMglEaWFnUndEYXRhOwkvKiAxMCAgICAgUmVhZCBXcml0ZSBEYXRhIChmdyBkb3dubG9hZCkgICAqLworCXUzMglEaWFnUndBZGRyZXNzOwkvKiAxNCAgICAgUmVhZCBXcml0ZSBBZGRyZXNzIChmdyBkb3dubG9hZCkqLworCXUzMglSZXNlcnZlZDFbNl07CS8qIDE4LTJGICByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAgICAqLworCXUzMglJbnRTdGF0dXM7CS8qIDMwICAgICBJbnRlcnJ1cHQgU3RhdHVzICAgICAgICAgICAqLworCXUzMglJbnRNYXNrOwkvKiAzNCAgICAgSW50ZXJydXB0IE1hc2sgICAgICAgICAgICAgKi8KKwl1MzIJUmVzZXJ2ZWQyWzJdOwkvKiAzOC0zRiAgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgICAgKi8KKwl1MzIJUmVxdWVzdEZpZm87CS8qIDQwICAgICBSZXF1ZXN0IFBvc3QvRnJlZSBGSUZPICAgICAqLworCXUzMglSZXBseUZpZm87CS8qIDQ0ICAgICBSZXBseSAgIFBvc3QvRnJlZSBGSUZPICAgICAqLworCXUzMglSZXNlcnZlZDNbMl07CS8qIDQ4LTRGICByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAgICAqLworCXUzMglIb3N0SW5kZXg7CS8qIDUwICAgICBIb3N0IEluZGV4IHJlZ2lzdGVyICAgICAgICAqLworCXUzMglSZXNlcnZlZDRbMTVdOwkvKiA1NC04RiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1MzIJRnViYXI7CQkvKiA5MCAgICAgRm9yIEZ1YmFyIHVzYWdlICAgICAgICAgICAgKi8KKwl1MzIJUmVzZXJ2ZWQ1WzI3XTsJLyogOTQtRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IFNZU0lGX1JFR1M7CisKKy8qCisgKiBOT1RFOiBVc2UgTVBJX3tET09SQkVMTCxXUklURVNFUSxESUFHfV94eHggZGVmcyBpbiBsc2kvbXBpLmgKKyAqIGluIGNvbmp1bmN0aW9uIHdpdGggU1lTSUZfUkVHUyBhY2Nlc3NlcyEKKyAqLworCisKKy8qCisgKglEeW5hbWljIE11bHRpLVBhdGhpbmcgc3BlY2lmaWMgc3R1ZmYuLi4KKyAqLworCisvKiBWaXJ0RGV2aWNlIG5lZ29GbGFncyBmaWVsZCAqLworI2RlZmluZSBNUFRfVEFSR0VUX05PX05FR09fV0lERQkJMHgwMQorI2RlZmluZSBNUFRfVEFSR0VUX05PX05FR09fU1lOQwkJMHgwMgorI2RlZmluZSBNUFRfVEFSR0VUX05PX05FR09fUUFTCQkweDA0CisjZGVmaW5lIE1QVF9UQVBFX05FR09fSURQICAgICAJCTB4MDgKKworLyoKKyAqCVZpcnREZXZpY2UgLSBGQyBMVU4gZGV2aWNlIG9yIFNDU0kgdGFyZ2V0IGRldmljZQorICovCit0eXBlZGVmIHN0cnVjdCBfVmlydERldmljZSB7CisJc3RydWN0IHNjc2lfZGV2aWNlCSpkZXZpY2U7CisJdTgJCQkgdGZsYWdzOworCXU4CQkJIGlvY19pZDsKKwl1OAkJCSB0YXJnZXRfaWQ7CisJdTgJCQkgYnVzX2lkOworCXU4CQkJIG1pblN5bmNGYWN0b3I7CS8qIDB4RkYgaXMgYXN5bmMgKi8KKwl1OAkJCSBtYXhPZmZzZXQ7CS8qIDAgaWYgYXN5bmMgKi8KKwl1OAkJCSBtYXhXaWR0aDsJLyogMCBpZiBuYXJyb3csIDEgaWYgd2lkZSAqLworCXU4CQkJIG5lZ29GbGFnczsJLyogYml0IGZpZWxkLCBzZWUgYWJvdmUgKi8KKwl1OAkJCSByYWlkVm9sdW1lOwkvKiBzZXQsIGlmIFJBSUQgVm9sdW1lICovCisJdTgJCQkgdHlwZTsJCS8qIGJ5dGUgMCBvZiBJbnF1aXJ5IGRhdGEgKi8KKwl1OAkJCSBjZmxhZ3M7CS8qIGNvbnRyb2xsZXIgZmxhZ3MgKi8KKwl1OAkJCSByc3ZkMXJhaWQ7CisJdTE2CQkJIGZjX3BoeXNfbHVuOworCXUxNgkJCSBmY194bGF0X2x1bjsKKwl1MzIJCQkgbnVtX2x1bnM7CisJdTMyCQkJIGx1bnNbOF07CQkvKiBNYXggTFVOcyBpcyAyNTYgKi8KKwl1OAkJCSBwYWRbNF07CisJdTgJCQkgaW5xX2RhdGFbOF07CisJCS8qIElFRUUgUmVnaXN0ZXJlZCBFeHRlbmRlZCBJZGVudGlmaWVyCisJCSAgIG9idGFpbmVkIHZpYSBJTlFVSVJZIFZQRCBwYWdlIDB4ODMgKi8KKwkJLyogTk9URTogRG8gbm90IHNlcGFyYXRlIHVuaXFfcHJlcGFkIGFuZCB1bmlxX2RhdGEKKwkJICAgYXMgdGhleSBhcmUgdHJlYXRlZWQgYXMgYSBzaW5nbGUgZW50aXR5IGluIHRoZSBjb2RlICovCisJdTgJCQkgdW5pcV9wcmVwYWRbOF07CisJdTgJCQkgdW5pcV9kYXRhWzIwXTsKKwl1OAkJCSBwYWQyWzRdOworfSBWaXJ0RGV2aWNlOworCisvKgorICogIEZpYnJlIENoYW5uZWwgKFNDU0kpIHRhcmdldCBkZXZpY2UgYW5kIGFzc29jaWF0ZWQgZGVmaW5lcy4uLgorICovCisjZGVmaW5lIE1QVF9UQVJHRVRfREVGQVVMVF9EVl9TVEFUVVMJMHgwMAorI2RlZmluZSBNUFRfVEFSR0VUX0ZMQUdTX1ZBTElEX05FR08JMHgwMQorI2RlZmluZSBNUFRfVEFSR0VUX0ZMQUdTX1ZBTElEX0lOUVVJUlkJMHgwMgorI2RlZmluZSBNUFRfVEFSR0VUX0ZMQUdTX1FfWUVTCQkweDA4CisjZGVmaW5lIE1QVF9UQVJHRVRfRkxBR1NfVkFMSURfNTYJMHgxMAorI2RlZmluZSBNUFRfVEFSR0VUX0ZMQUdTX1NBRl9URV9JU1NVRUQJMHgyMAorCisvKgorICoJL3Byb2MvbXB0IGludGVyZmFjZQorICovCit0eXBlZGVmIHN0cnVjdCB7CisJY29uc3QgY2hhcgkqbmFtZTsKKwltb2RlX3QJCSBtb2RlOworCWludAkJIHBhZDsKKwlyZWFkX3Byb2NfdAkqcmVhZF9wcm9jOworCXdyaXRlX3Byb2NfdAkqd3JpdGVfcHJvYzsKK30gbXB0X3Byb2NfZW50cnlfdDsKKworI2RlZmluZSBNUFRfUFJPQ19SRUFEX1JFVFVSTihidWYsc3RhcnQsb2Zmc2V0LHJlcXVlc3QsZW9mLGxlbikgXAorZG8geyBcCisJbGVuIC09IG9mZnNldDsJCQlcCisJaWYgKGxlbiA8IHJlcXVlc3QpIHsJCVwKKwkJKmVvZiA9IDE7CQlcCisJCWlmIChsZW4gPD0gMCkJCVwKKwkJCXJldHVybiAwOwlcCisJfSBlbHNlCQkJCVwKKwkJbGVuID0gcmVxdWVzdDsJCVwKKwkqc3RhcnQgPSBidWYgKyBvZmZzZXQ7CQlcCisJcmV0dXJuIGxlbjsJCQlcCit9IHdoaWxlICgwKQorCisKKy8qCisgKglJT0NUTCBzdHJ1Y3R1cmUgYW5kIGFzc29jaWF0ZWQgZGVmaW5lcworICovCisKKyNkZWZpbmUgTVBUX0lPQ1RMX1NUQVRVU19ESURfSU9DUkVTRVQJMHgwMQkvKiBJT0MgUmVzZXQgb2NjdXJyZWQgb24gdGhlIGN1cnJlbnQqLworI2RlZmluZSBNUFRfSU9DVExfU1RBVFVTX1JGX1ZBTElECTB4MDIJLyogVGhlIFJlcGx5IEZyYW1lIGlzIFZBTElEICovCisjZGVmaW5lIE1QVF9JT0NUTF9TVEFUVVNfVElNRVJfQUNUSVZFCTB4MDQJLyogVGhlIHRpbWVyIGlzIHJ1bm5pbmcgKi8KKyNkZWZpbmUgTVBUX0lPQ1RMX1NUQVRVU19TRU5TRV9WQUxJRAkweDA4CS8qIFNlbnNlIGRhdGEgaXMgdmFsaWQgKi8KKyNkZWZpbmUgTVBUX0lPQ1RMX1NUQVRVU19DT01NQU5EX0dPT0QJMHgxMAkvKiBDb21tYW5kIFN0YXR1cyBHT09EICovCisjZGVmaW5lIE1QVF9JT0NUTF9TVEFUVVNfVE1USU1FUl9BQ1RJVkUJMHgyMAkvKiBUaGUgVE0gdGltZXIgaXMgcnVubmluZyAqLworI2RlZmluZSBNUFRfSU9DVExfU1RBVFVTX1RNX0ZBSUxFRAkweDQwCS8qIFVzZXIgVE0gcmVxdWVzdCBmYWlsZWQgKi8KKworI2RlZmluZSBNUFRDVExfUkVTRVRfT0sJCQkweDAxCS8qIElzc3VlIEJ1cyBSZXNldCAqLworCit0eXBlZGVmIHN0cnVjdCBfTVBUX0lPQ1RMIHsKKwlzdHJ1Y3QgX01QVF9BREFQVEVSCSppb2M7CisJdTgJCQkgUmVwbHlGcmFtZVtNUFRfREVGQVVMVF9GUkFNRV9TSVpFXTsJLyogcmVwbHkgZnJhbWUgZGF0YSAqLworCXU4CQkJIHNlbnNlW01QVF9TRU5TRV9CVUZGRVJfQUxMT0NdOworCWludAkJCSB3YWl0X2RvbmU7CS8qIHdha2UtdXAgdmFsdWUgZm9yIHRoaXMgaW9jICovCisJdTgJCQkgcnN2ZDsKKwl1OAkJCSBzdGF0dXM7CS8qIGN1cnJlbnQgY29tbWFuZCBzdGF0dXMgKi8KKwl1OAkJCSByZXNldDsJCS8qIDEgaWYgYnVzIHJlc2V0IGFsbG93ZWQgKi8KKwl1OAkJCSB0YXJnZXQ7CS8qIHRhcmdldCBmb3IgcmVzZXQgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlCSBzZW1faW9jOworfSBNUFRfSU9DVEw7CisKKy8qCisgKiAgRXZlbnQgU3RydWN0dXJlIGFuZCBkZWZpbmUKKyAqLworI2RlZmluZSBNUFRDVExfRVZFTlRfTE9HX1NJWkUJCSgweDAwMDAwMDBBKQordHlwZWRlZiBzdHJ1Y3QgX21wdF9pb2N0bF9ldmVudHMgeworCXUzMglldmVudDsJCS8qIFNwZWNpZmllZCBieSBkZWZpbmUgYWJvdmUgKi8KKwl1MzIJZXZlbnRDb250ZXh0OwkvKiBJbmRleCBvciBjb3VudGVyICovCisJaW50CWRhdGFbMl07CS8qIEZpcnN0IDggYnl0ZXMgb2YgRXZlbnQgRGF0YSAqLworfSBNUFRfSU9DVExfRVZFTlRTOworCisvKgorICogQ09ORklHUEFSTSBzdGF0dXMgIGRlZmluZXMKKyAqLworI2RlZmluZSBNUFRfQ09ORklHX0dPT0QJCU1QSV9JT0NTVEFUVVNfU1VDQ0VTUworI2RlZmluZSBNUFRfQ09ORklHX0VSUk9SCTB4MDAyRgorCisvKgorICoJU3Vic3RydWN0dXJlIHRvIHN0b3JlIFNDU0kgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBwYWdlIGRhdGEKKyAqLworCQkJCQkJLyogZHZTdGF0dXMgZGVmaW5lczogKi8KKyNkZWZpbmUgTVBUX1NDU0lDRkdfTkVHT1RJQVRFCQkweDAxCS8qIE5lZ290aWF0ZSBvbiBuZXh0IElPICovCisjZGVmaW5lIE1QVF9TQ1NJQ0ZHX05FRURfRFYJCTB4MDIJLyogU2NoZWR1bGUgRFYgKi8KKyNkZWZpbmUgTVBUX1NDU0lDRkdfRFZfUEVORElORwkJMHgwNAkvKiBEViBvbiB0aGlzIHBoeXNpY2FsIGlkIHBlbmRpbmcgKi8KKyNkZWZpbmUgTVBUX1NDU0lDRkdfRFZfTk9UX0RPTkUJCTB4MDgJLyogRFYgaGFzIG5vdCBiZWVuIHBlcmZvcm1lZCAqLworI2RlZmluZSBNUFRfU0NTSUNGR19CTEtfTkVHTwkJMHgxMAkvKiBXcml0ZVNEUDEgd2l0aCBXRFRSIGFuZCBTRFRSIGRpc2FibGVkICovCisjZGVmaW5lIE1QVF9TQ1NJQ0ZHX1JFTE9BRF9JT0NfUEczCTB4MjAJLyogSU9DIFBnIDMgZGF0YSBpcyBvYnNvbGV0ZSAqLworCQkJCQkJLyogQXJncyBwYXNzZWQgdG8gd3JpdGVTRFAxOiAqLworI2RlZmluZSBNUFRfU0NTSUNGR19VU0VfTlZSQU0JCTB4MDEJLyogV3JpdGVTRFAxIHVzaW5nIE5WUkFNICovCisjZGVmaW5lIE1QVF9TQ1NJQ0ZHX0FMTF9JRFMJCTB4MDIJLyogV3JpdGVTRFAxIHRvIGFsbCBJRFMgKi8KKy8qICNkZWZpbmUgTVBUX1NDU0lDRkdfQkxLX05FR08JCTB4MTAJICAgV3JpdGVTRFAxIHdpdGggV0RUUiBhbmQgU0RUUiBkaXNhYmxlZCAqLworCit0eXBlZGVmCXN0cnVjdCBfU2NzaUNmZ0RhdGEgeworCXUzMgkJIFBvcnRGbGFnczsKKwlpbnQJCSpudnJhbTsJCQkvKiB0YWJsZSBvZiBkZXZpY2UgTlZSQU0gdmFsdWVzICovCisJSU9DUGFnZTJfdAkqcElvY1BnMjsJCS8qIHRhYmxlIG9mIFJhaWQgVm9sdW1lcyAqLworCUlPQ1BhZ2UzX3QJKnBJb2NQZzM7CQkvKiB0YWJsZSBvZiBwaHlzaWNhbCBkaXNrcyAqLworCUlPQ1BhZ2U0X3QJKnBJb2NQZzQ7CQkvKiBTRVAgZGV2aWNlcyBhZGRyZXNzaW5nICovCisJZG1hX2FkZHJfdAkgSW9jUGc0X2RtYTsJCS8qIFBoeXMgQWRkciBvZiBJT0NQYWdlNCBkYXRhICovCisJaW50CQkgSW9jUGc0U3o7CQkvKiBJT0NQYWdlNCBzaXplICovCisJdTgJCSBkdlN0YXR1c1tNUFRfTUFYX1NDU0lfREVWSUNFU107CisJaW50CQkgaXNSYWlkOwkJLyogYml0IGZpZWxkLCAxIGlmIFJBSUQgKi8KKwl1OAkJIG1pblN5bmNGYWN0b3I7CQkvKiAweEZGIGlmIGFzeW5jICovCisJdTgJCSBtYXhTeW5jT2Zmc2V0OwkJLyogMCBpZiBhc3luYyAqLworCXU4CQkgbWF4QnVzV2lkdGg7CQkvKiAwIGlmIG5hcnJvdywgMSBpZiB3aWRlICovCisJdTgJCSBidXNUeXBlOwkJLyogU0UsIExWRCwgSEQgKi8KKwl1OAkJIHNkcDF2ZXJzaW9uOwkJLyogU0RQMSB2ZXJzaW9uICovCisJdTgJCSBzZHAxbGVuZ3RoOwkJLyogU0RQMSBsZW5ndGggICovCisJdTgJCSBzZHAwdmVyc2lvbjsJCS8qIFNEUDAgdmVyc2lvbiAqLworCXU4CQkgc2RwMGxlbmd0aDsJCS8qIFNEUDAgbGVuZ3RoICAqLworCXU4CQkgZHZTY2hlZHVsZWQ7CQkvKiAxIGlmIHNjaGVkdWxlZCAqLworCXU4CQkgZm9yY2VEdjsJCS8qIDEgdG8gZm9yY2UgRFYgc2NoZWR1bGluZyAqLworCXU4CQkgbm9RYXM7CQkJLyogRGlzYWJsZSBRQVMgZm9yIHRoaXMgYWRhcHRlciAqLworCXU4CQkgU2FmX1RlOwkJLyogMSB0byBmb3JjZSBhbGwgUHJvY2Vzc29ycyBhcyBTQUYtVEUgaWYgSW5xdWlyeSBkYXRhIGxlbmd0aCBpcyB0b28gc2hvcnQgdG8gY2hlY2sgZm9yIFNBRi1URSAqLworCXU4CQkgcnN2ZFsxXTsKK30gU2NzaUNmZ0RhdGE7CisKKy8qCisgKiAgQWRhcHRlciBTdHJ1Y3R1cmUgLSBwY2lfZGV2IHNwZWNpZmljLiBNYXhpbXVtOiBNUFRfTUFYX0FEQVBURVJTCisgKi8KK3R5cGVkZWYgc3RydWN0IF9NUFRfQURBUFRFUgoreworCWludAkJCSBpZDsJCS8qIFVuaXF1ZSBhZGFwdGVyIGlkIE4gezAsMSwyLC4uLn0gKi8KKwlpbnQJCQkgcGNpX2lycTsJLyogVGhpcyBpcnEgICAgICAgICAgICovCisJY2hhcgkJCSBuYW1lW01QVF9OQU1FX0xFTkdUSF07CS8qICJpb2NOIiAgICAgICAgICAgICAqLworCWNoYXIJCQkqcHJvZF9uYW1lOwkvKiAiTFNJRkM5eDkiICAgICAgICAgKi8KKwlTWVNJRl9SRUdTIF9faW9tZW0JKmNoaXA7CQkvKiA9PSBjODgxNzAwMCAobW1hcCkgKi8KKwlTWVNJRl9SRUdTIF9faW9tZW0JKnBpb19jaGlwOwkvKiBQcm9ncmFtbWVkIElPIChkb3dubG9hZGJvb3QpICovCisJdTgJCQkgYnVzX3R5cGU7CisJdTMyCQkJIG1lbV9waHlzOwkvKiA9PSBmNDAyMDAwMCAobW1hcCkgKi8KKwl1MzIJCQkgcGlvX21lbV9waHlzOwkvKiBQcm9ncmFtbWVkIElPIChkb3dubG9hZGJvb3QpICovCisJaW50CQkJIG1lbV9zaXplOwkvKiBtbWFwIG1lbW9yeSBzaXplICovCisJaW50CQkJIGFsbG9jX3RvdGFsOworCXUzMgkJCSBsYXN0X3N0YXRlOworCWludAkJCSBhY3RpdmU7CisJdTgJCQkqYWxsb2M7CQkvKiBmcmFtZXMgYWxsb2MgcHRyICovCisJZG1hX2FkZHJfdAkJIGFsbG9jX2RtYTsKKwl1MzIJCQkgYWxsb2Nfc3o7CisJTVBUX0ZSQU1FX0hEUgkJKnJlcGx5X2ZyYW1lczsJLyogUmVwbHkgbXNnIGZyYW1lcyAtIHJvdW5kZWQgdXAhICovCisJdTMyCQkJIHJlcGx5X2ZyYW1lc19sb3dfZG1hOworCWludAkJCSByZXBseV9kZXB0aDsJLyogTnVtIEFsbG9jYXRlZCByZXBseSBmcmFtZXMgKi8KKwlpbnQJCQkgcmVwbHlfc3o7CS8qIFJlcGx5IGZyYW1lIHNpemUgKi8KKwlpbnQJCQkgbnVtX2NoYWluOwkvKiBOdW1iZXIgb2YgY2hhaW4gYnVmZmVycyAqLworCQkvKiBQb29sIG9mIGJ1ZmZlcnMgZm9yIGNoYWluaW5nLiBSZXFUb0NoYWluCisJCSAqIGFuZCBDaGFpblRvQ2hhaW4gdHJhY2sgaW5kZXggb2YgY2hhaW4gYnVmZmVycy4KKwkJICogQ2hhaW5CdWZmZXIgKERNQSkgdmlydC9waHlzIGFkZHJlc3Nlcy4KKwkJICogRnJlZUNoYWluUSAobG9jaykgbG9ja2luZyBtZWNoYW5pc21zLgorCQkgKi8KKwlpbnQJCQkqUmVxVG9DaGFpbjsKKwlpbnQJCQkqUmVxdWVzdE5COworCWludAkJCSpDaGFpblRvQ2hhaW47CisJdTgJCQkqQ2hhaW5CdWZmZXI7CisJZG1hX2FkZHJfdAkJIENoYWluQnVmZmVyRE1BOworCXN0cnVjdCBsaXN0X2hlYWQJIEZyZWVDaGFpblE7CisJc3BpbmxvY2tfdAkJIEZyZWVDaGFpblFsb2NrOworCQkvKiBXZSAoaG9zdCBkcml2ZXIpIGdldCB0byBtYW5hZ2Ugb3VyIG93biBSZXF1ZXN0UXVldWUhICovCisJZG1hX2FkZHJfdAkJIHJlcV9mcmFtZXNfZG1hOworCU1QVF9GUkFNRV9IRFIJCSpyZXFfZnJhbWVzOwkvKiBSZXF1ZXN0IG1zZyBmcmFtZXMgLSByb3VuZGVkIHVwISAqLworCXUzMgkJCSByZXFfZnJhbWVzX2xvd19kbWE7CisJaW50CQkJIHJlcV9kZXB0aDsJLyogTnVtYmVyIG9mIHJlcXVlc3QgZnJhbWVzICovCisJaW50CQkJIHJlcV9zejsJLyogUmVxdWVzdCBmcmFtZSBzaXplIChieXRlcykgKi8KKwlzcGlubG9ja190CQkgRnJlZVFsb2NrOworCXN0cnVjdCBsaXN0X2hlYWQJIEZyZWVROworCQkvKiBQb29sIG9mIFNDU0kgc2Vuc2UgYnVmZmVycyBmb3IgY29tbWFuZHMgY29taW5nIGZyb20KKwkJICogdGhlIFNDU0kgbWlkLWxheWVyLiAgV2UgaGF2ZSBvbmUgMjU2IGJ5dGUgc2Vuc2UgYnVmZmVyCisJCSAqIGZvciBlYWNoIFJFUSBlbnRyeS4KKwkJICovCisJdTgJCQkqc2Vuc2VfYnVmX3Bvb2w7CisJZG1hX2FkZHJfdAkJIHNlbnNlX2J1Zl9wb29sX2RtYTsKKwl1MzIJCQkgc2Vuc2VfYnVmX2xvd19kbWE7CisJaW50CQkJIG10cnJfcmVnOworCXN0cnVjdCBwY2lfZGV2CQkqcGNpZGV2OwkvKiBzdHJ1Y3QgcGNpX2RldiBwb2ludGVyICovCisJdTgJCQlfX2lvbWVtICptZW1tYXA7CS8qIG1tYXAgYWRkcmVzcyAqLworCXN0cnVjdCBTY3NpX0hvc3QJKnNoOwkJLyogU2NzaSBIb3N0IHBvaW50ZXIgKi8KKwlTY3NpQ2ZnRGF0YQkJc3BpX2RhdGE7CS8qIFNjc2kgY29uZmlnLiBkYXRhICovCisJTVBUX0lPQ1RMCQkqaW9jdGw7CQkvKiBpb2N0bCBkYXRhIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmlvY19kZW50cnk7CisJc3RydWN0IF9NUFRfQURBUFRFUgkqYWx0X2lvYzsJLyogcHRyIHRvIDkyOSBib3VuZCBhZGFwdGVyIHBvcnQgKi8KKwlzcGlubG9ja190CQkgZGlhZ0xvY2s7CS8qIGRpYWdub3N0aWMgcmVzZXQgbG9jayAqLworCWludAkJCSBkaWFnUGVuZGluZzsKKwl1MzIJCQkgYmlvc1ZlcnNpb247CS8qIEJJT1MgdmVyc2lvbiBmcm9tIElPIFVuaXQgUGFnZSAyICovCisJaW50CQkJIGV2ZW50VHlwZXM7CS8qIEV2ZW50IGxvZ2dpbmcgcGFyYW1ldGVycyAqLworCWludAkJCSBldmVudENvbnRleHQ7CS8qIE5leHQgZXZlbnQgY29udGV4dCAqLworCWludAkJCSBldmVudExvZ1NpemU7CS8qIE1heCBudW1iZXIgb2YgY2FjaGVkIGV2ZW50cyAqLworCXN0cnVjdCBfbXB0X2lvY3RsX2V2ZW50cyAqZXZlbnRzOwkvKiBwb2ludGVyIHRvIGV2ZW50IGxvZyAqLworCXU4CQkJKmNhY2hlZF9mdzsJLyogUG9pbnRlciB0byBGVyAqLworCWRtYV9hZGRyX3QJIAljYWNoZWRfZndfZG1hOworCXN0cnVjdCBsaXN0X2hlYWQJIGNvbmZpZ1E7CS8qIGxpbmtlZCBsaXN0IG9mIGNvbmZpZy4gcmVxdWVzdHMgKi8KKwlpbnQJCQkgaHNfcmVwbHlfaWR4OworI2lmbmRlZiBNRkNOVAorCXUzMgkJCSBwYWQwOworI2Vsc2UKKwl1MzIJCQkgbWZjbnQ7CisjZW5kaWYKKwl1MzIJCQkgTkJfZm9yXzY0X2J5dGVfZnJhbWU7ICAgICAgIAorCXUzMgkJCSBoc19yZXFbTVBUX01BWF9GUkFNRV9TSVpFL3NpemVvZih1MzIpXTsKKwl1MTYJCQkgaHNfcmVwbHlbTVBUX01BWF9GUkFNRV9TSVpFL3NpemVvZih1MTYpXTsKKwlJT0NGYWN0c1JlcGx5X3QJCSBmYWN0czsKKwlQb3J0RmFjdHNSZXBseV90CSBwZmFjdHNbMl07CisJRkNQb3J0UGFnZTBfdAkJIGZjX3BvcnRfcGFnZTBbMl07CisJTEFOUGFnZTBfdAkJIGxhbl9jbmZnX3BhZ2UwOworCUxBTlBhZ2UxX3QJCSBsYW5fY25mZ19wYWdlMTsKKwl1OAkJCSBGaXJzdFdob0luaXQ7CisJdTgJCQkgdXBsb2FkX2Z3OwkvKiBJZiBzZXQsIGRvIGEgZncgdXBsb2FkICovCisJdTgJCQkgcmVsb2FkX2Z3OwkvKiBGb3JjZSBhIEZXIFJlbG9hZCBvbiBuZXh0IHJlc2V0ICovCisJdTgJCQkgTkJTaGlmdEZhY3RvcjsgIC8qIE5CIFNoaWZ0IEZhY3RvciBiYXNlZCBvbiBCbG9jayBTaXplIChGYWN0cykgICovICAgICAKKwl1OAkJCSBwYWQxWzRdOworCXN0cnVjdCBsaXN0X2hlYWQJIGxpc3Q7IAorCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRkZXY7Cit9IE1QVF9BREFQVEVSOworCisvKgorICogIE5ldyByZXR1cm4gdmFsdWUgY29udmVudGlvbjoKKyAqICAgIDEgPSBPayB0byBmcmVlIGFzc29jaWF0ZWQgcmVxdWVzdCBmcmFtZQorICogICAgMCA9IG5vdCBPayAuLi4KKyAqLwordHlwZWRlZiBpbnQgKCpNUFRfQ0FMTEJBQ0spKE1QVF9BREFQVEVSICppb2MsIE1QVF9GUkFNRV9IRFIgKnJlcSwgTVBUX0ZSQU1FX0hEUiAqcmVwbHkpOwordHlwZWRlZiBpbnQgKCpNUFRfRVZIQU5ETEVSKShNUFRfQURBUFRFUiAqaW9jLCBFdmVudE5vdGlmaWNhdGlvblJlcGx5X3QgKmV2UmVwbHkpOwordHlwZWRlZiBpbnQgKCpNUFRfUkVTRVRIQU5ETEVSKShNUFRfQURBUFRFUiAqaW9jLCBpbnQgcmVzZXRfcGhhc2UpOworLyogcmVzZXRfcGhhc2UgZGVmcyAqLworI2RlZmluZSBNUFRfSU9DX1BSRV9SRVNFVAkJMAorI2RlZmluZSBNUFRfSU9DX1BPU1RfUkVTRVQJCTEKKyNkZWZpbmUgTVBUX0lPQ19TRVRVUF9SRVNFVAkJMgorCisvKgorICogSW52ZW50IE1QVCBob3N0IGV2ZW50IChzdXBlci1zZXQgb2YgTVBJIEV2ZW50cykKKyAqIEZpdHRlZCB0byAxMDMwJ3MgNjQtYnl0ZSBbbWF4XSByZXF1ZXN0IGZyYW1lIHNpemUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX01QVF9IT1NUX0VWRU5UIHsKKwlFdmVudE5vdGlmaWNhdGlvblJlcGx5X3QJIE1waUV2ZW50OwkvKiA4IDMyLWJpdCB3b3JkcyEgKi8KKwl1MzIJCQkJIHBhZFs2XTsKKwl2b2lkCQkJCSpuZXh0OworfSBNUFRfSE9TVF9FVkVOVDsKKworI2RlZmluZSBNUFRfSE9TVEVWRU5UX0lPQ19CUklOR1VQCTB4OTEKKyNkZWZpbmUgTVBUX0hPU1RFVkVOVF9JT0NfUkVDT1ZFUgkweDkyCisKKy8qIERlZmluZSB0aGUgZ2VuZXJpYyB0eXBlcyBiYXNlZCBvbiB0aGUgc2l6ZQorICogb2YgdGhlIGRtYV9hZGRyX3QgdHlwZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX21wdF9zZ2UgeworCXUzMgkJRmxhZ3NMZW5ndGg7CisJZG1hX2FkZHJfdAlBZGRyZXNzOworfSBNcHRTZ2VfdDsKKworI2RlZmluZSBtcHRfYWRkcl9zaXplKCkgXAorCSgoc2l6ZW9mKGRtYV9hZGRyX3QpID09IHNpemVvZih1NjQpKSA/IE1QSV9TR0VfRkxBR1NfNjRfQklUX0FERFJFU1NJTkcgOiBcCisJCU1QSV9TR0VfRkxBR1NfMzJfQklUX0FERFJFU1NJTkcpCisKKyNkZWZpbmUgbXB0X21zZ19mbGFncygpIFwKKwkoKHNpemVvZihkbWFfYWRkcl90KSA9PSBzaXplb2YodTY0KSkgPyBNUElfU0NTSUlPX01TR0ZMR1NfU0VOU0VfV0lEVEhfNjQgOiBcCisJCU1QSV9TQ1NJSU9fTVNHRkxHU19TRU5TRV9XSURUSF8zMikKKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqICBGdW5reSAocHJpdmF0ZSkgbWFjcm9zLi4uCisgKi8KKyNpZmRlZiBNUFRfREVCVUcKKyNkZWZpbmUgZHByaW50ayh4KSAgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIGRwcmludGsoeCkKKyNlbmRpZgorCisjaWZkZWYgTVBUX0RFQlVHX0lOSVQKKyNkZWZpbmUgZGluaXRwcmludGsoeCkgIHByaW50ayB4CisjZGVmaW5lIERCR19EVU1QX0ZXX1JFUVVFU1RfRlJBTUUobWZwKSBcCisJewlpbnQgIGksIG4gPSAxMDsJCQkJCQlcCisJCXUzMiAqbSA9ICh1MzIgKikobWZwKTsJCQkJCVwKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICIpOwkJCQkJXAorCQlmb3IgKGk9MDsgaTxuOyBpKyspCQkJCQlcCisJCQlwcmludGsoIiAlMDh4IiwgbGUzMl90b19jcHUobVtpXSkpOwkJXAorCQlwcmludGsoIlxuIik7CQkJCQkJXAorCX0KKyNlbHNlCisjZGVmaW5lIGRpbml0cHJpbnRrKHgpCisjZGVmaW5lIERCR19EVU1QX0ZXX1JFUVVFU1RfRlJBTUUobWZwKQorI2VuZGlmCisKKyNpZmRlZiBNUFRfREVCVUdfRVhJVAorI2RlZmluZSBkZXhpdHByaW50ayh4KSAgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIGRleGl0cHJpbnRrKHgpCisjZW5kaWYKKworI2lmIGRlZmluZWQgTVBUX0RFQlVHX0ZBSUwgfHwgZGVmaW5lZCAoTVBUX0RFQlVHX1NHKQorI2RlZmluZSBkZmFpbHByaW50ayh4KSBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgZGZhaWxwcmludGsoeCkKKyNlbmRpZgorCisjaWZkZWYgTVBUX0RFQlVHX0hBTkRTSEFLRQorI2RlZmluZSBkaHNwcmludGsoeCkgIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBkaHNwcmludGsoeCkKKyNlbmRpZgorCisjaWZkZWYgTVBUX0RFQlVHX0VWRU5UUworI2RlZmluZSBkZXZ0cHJpbnRrKHgpICBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgZGV2dHByaW50ayh4KQorI2VuZGlmCisKKyNpZmRlZiBNUFRfREVCVUdfUkVTRVQKKyNkZWZpbmUgZHJzcHJpbnRrKHgpICBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgZHJzcHJpbnRrKHgpCisjZW5kaWYKKworLy8jaWYgZGVmaW5lZChNUFRfREVCVUcpIHx8IGRlZmluZWQoTVBUX0RFQlVHX01TR19GUkFNRSkKKyNpZiBkZWZpbmVkKE1QVF9ERUJVR19NU0dfRlJBTUUpCisjZGVmaW5lIGRtZnByaW50ayh4KSAgcHJpbnRrIHgKKyNkZWZpbmUgREJHX0RVTVBfUkVRVUVTVF9GUkFNRShtZnApIFwKKwl7CWludCAgaSwgbiA9IDI0OwkJCQkJCVwKKwkJdTMyICptID0gKHUzMiAqKShtZnApOwkJCQkJXAorCQlmb3IgKGk9MDsgaTxuOyBpKyspIHsJCQkJCVwKKwkJCWlmIChpICYmICgoaSU4KT09MCkpCQkJCVwKKwkJCQlwcmludGsoIlxuIik7CQkJCVwKKwkJCXByaW50aygiJTA4eCAiLCBsZTMyX3RvX2NwdShtW2ldKSk7CQlcCisJCX0JCQkJCQkJXAorCQlwcmludGsoIlxuIik7CQkJCQkJXAorCX0KKyNlbHNlCisjZGVmaW5lIGRtZnByaW50ayh4KQorI2RlZmluZSBEQkdfRFVNUF9SRVFVRVNUX0ZSQU1FKG1mcCkKKyNlbmRpZgorCisjaWZkZWYgTVBUX0RFQlVHX0lSUQorI2RlZmluZSBkaXJxcHJpbnRrKHgpICBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgZGlycXByaW50ayh4KQorI2VuZGlmCisKKyNpZmRlZiBNUFRfREVCVUdfU0cKKyNkZWZpbmUgZHNncHJpbnRrKHgpICBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgZHNncHJpbnRrKHgpCisjZW5kaWYKKworI2lmIGRlZmluZWQoTVBUX0RFQlVHX0RMKSB8fCBkZWZpbmVkKE1QVF9ERUJVRykKKyNkZWZpbmUgZGRscHJpbnRrKHgpICBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgZGRscHJpbnRrKHgpCisjZW5kaWYKKworI2lmZGVmIE1QVF9ERUJVR19EVgorI2RlZmluZSBkZHZwcmludGsoeCkgIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBkZHZwcmludGsoeCkKKyNlbmRpZgorCisjaWZkZWYgTVBUX0RFQlVHX05FR08KKyNkZWZpbmUgZG5lZ29wcmludGsoeCkgIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBkbmVnb3ByaW50ayh4KQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKE1QVF9ERUJVR19EVikgfHwgZGVmaW5lZChNUFRfREVCVUdfRFZfVElOWSkKKyNkZWZpbmUgZGR2dHByaW50ayh4KSAgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIGRkdnRwcmludGsoeCkKKyNlbmRpZgorCisjaWZkZWYgTVBUX0RFQlVHX0lPQ1RMCisjZGVmaW5lIGRjdGxwcmludGsoeCkgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIGRjdGxwcmludGsoeCkKKyNlbmRpZgorCisjaWZkZWYgTVBUX0RFQlVHX1JFUExZCisjZGVmaW5lIGRyZXBseXByaW50ayh4KSBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgZHJlcGx5cHJpbnRrKHgpCisjZW5kaWYKKworI2lmZGVmIE1QVF9ERUJVR19UTQorI2RlZmluZSBkdG1wcmludGsoeCkgcHJpbnRrIHgKKyNkZWZpbmUgREJHX0RVTVBfVE1fUkVRVUVTVF9GUkFNRShtZnApIFwKKwl7CXUzMiAqbSA9ICh1MzIgKikobWZwKTsJCQkJCVwKKwkJaW50ICBpLCBuID0gMTM7CQkJCQkJXAorCQlwcmludGsoIlRNX1JFUVVFU1Q6XG4iKTsJCQkJXAorCQlmb3IgKGk9MDsgaTxuOyBpKyspIHsJCQkJCVwKKwkJCWlmIChpICYmICgoaSU4KT09MCkpCQkJCVwKKwkJCQlwcmludGsoIlxuIik7CQkJCVwKKwkJCXByaW50aygiJTA4eCAiLCBsZTMyX3RvX2NwdShtW2ldKSk7CQlcCisJCX0JCQkJCQkJXAorCQlwcmludGsoIlxuIik7CQkJCQkJXAorCX0KKyNkZWZpbmUgREJHX0RVTVBfVE1fUkVQTFlfRlJBTUUobWZwKSBcCisJewl1MzIgKm0gPSAodTMyICopKG1mcCk7CQkJCQlcCisJCWludCAgaSwgbiA9IChsZTMyX3RvX2NwdShtWzBdKSAmIDB4MDBGRjAwMDApID4+IDE2OwlcCisJCXByaW50aygiVE1fUkVQTFkgTWVzc2FnZUxlbmd0aD0lZDpcbiIsIG4pOwkJXAorCQlmb3IgKGk9MDsgaTxuOyBpKyspIHsJCQkJCVwKKwkJCWlmIChpICYmICgoaSU4KT09MCkpCQkJCVwKKwkJCQlwcmludGsoIlxuIik7CQkJCVwKKwkJCXByaW50aygiICUwOHgiLCBsZTMyX3RvX2NwdShtW2ldKSk7CQlcCisJCX0JCQkJCQkJXAorCQlwcmludGsoIlxuIik7CQkJCQkJXAorCX0KKyNlbHNlCisjZGVmaW5lIGR0bXByaW50ayh4KQorI2RlZmluZSBEQkdfRFVNUF9UTV9SRVFVRVNUX0ZSQU1FKG1mcCkKKyNkZWZpbmUgREJHX0RVTVBfVE1fUkVQTFlfRlJBTUUobWZwKQorI2VuZGlmCisKKyNpZmRlZiBNUFRfREVCVUdfTkVICisjZGVmaW5lIG5laHByaW50ayh4KSBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgbmVocHJpbnRrKHgpCisjZW5kaWYKKworI2lmIGRlZmluZWQoTVBUX0RFQlVHX0NPTkZJRykgfHwgZGVmaW5lZChNUFRfREVCVUcpCisjZGVmaW5lIGRjcHJpbnRrKHgpIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBkY3ByaW50ayh4KQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKE1QVF9ERUJVR19TQ1NJKSB8fCBkZWZpbmVkKE1QVF9ERUJVRykgfHwgZGVmaW5lZChNUFRfREVCVUdfTVNHX0ZSQU1FKQorI2RlZmluZSBkc3ByaW50ayh4KSBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgZHNwcmludGsoeCkKKyNlbmRpZgorCisKKyNkZWZpbmUgTVBUX0lOREVYXzJfTUZQVFIoaW9jLGlkeCkgXAorCShNUFRfRlJBTUVfSERSKikoICh1OCopKGlvYyktPnJlcV9mcmFtZXMgKyAoaW9jKS0+cmVxX3N6ICogKGlkeCkgKQorCisjZGVmaW5lIE1GUFRSXzJfTVBUX0lOREVYKGlvYyxtZikgXAorCShpbnQpKCAoKHU4KiltZiAtICh1OCopKGlvYyktPnJlcV9mcmFtZXMpIC8gKGlvYyktPnJlcV9zeiApCisKKyNkZWZpbmUgTVBUX0lOREVYXzJfUkZQVFIoaW9jLGlkeCkgXAorCShNUFRfRlJBTUVfSERSKikoICh1OCopKGlvYyktPnJlcGx5X2ZyYW1lcyArIChpb2MpLT5yZXFfc3ogKiAoaWR4KSApCisKKyNpZiBkZWZpbmVkKE1QVF9ERUJVRykgfHwgZGVmaW5lZChNUFRfREVCVUdfTVNHX0ZSQU1FKQorI2RlZmluZSBEQkdfRFVNUF9SRVBMWV9GUkFNRShtZnApIFwKKwl7CXUzMiAqbSA9ICh1MzIgKikobWZwKTsJCQkJCVwKKwkJaW50ICBpLCBuID0gKGxlMzJfdG9fY3B1KG1bMF0pICYgMHgwMEZGMDAwMCkgPj4gMTY7CVwKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICIpOwkJCQkJXAorCQlmb3IgKGk9MDsgaTxuOyBpKyspCQkJCQlcCisJCQlwcmludGsoIiAlMDh4IiwgbGUzMl90b19jcHUobVtpXSkpOwkJXAorCQlwcmludGsoIlxuIik7CQkJCQkJXAorCX0KKyNkZWZpbmUgREJHX0RVTVBfUkVRVUVTVF9GUkFNRV9IRFIobWZwKSBcCisJewlpbnQgIGksIG4gPSAzOwkJCQkJCVwKKwkJdTMyICptID0gKHUzMiAqKShtZnApOwkJCQkJXAorCQlwcmludGsoS0VSTl9JTkZPICIgIik7CQkJCQlcCisJCWZvciAoaT0wOyBpPG47IGkrKykJCQkJCVwKKwkJCXByaW50aygiICUwOHgiLCBsZTMyX3RvX2NwdShtW2ldKSk7CQlcCisJCXByaW50aygiXG4iKTsJCQkJCQlcCisJfQorI2Vsc2UKKyNkZWZpbmUgREJHX0RVTVBfUkVQTFlfRlJBTUUobWZwKQorI2RlZmluZSBEQkdfRFVNUF9SRVFVRVNUX0ZSQU1FX0hEUihtZnApCisjZW5kaWYKKworCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisKKyNkZWZpbmUgU0NTSV9TVERfU0VOU0VfQllURVMgICAgMTgKKyNkZWZpbmUgU0NTSV9TVERfSU5RVUlSWV9CWVRFUyAgMzYKKyNkZWZpbmUgU0NTSV9NQVhfSU5RVUlSWV9CWVRFUyAgOTYKKworLyoKKyAqIE1QVF9TQ1NJX0hPU1QgZGVmaW5lcyAtIFVzZWQgYnkgdGhlIElPQ1RMIGFuZCB0aGUgU0NTSSBkcml2ZXJzCisgKiBQcml2YXRlIHRvIHRoZSBkcml2ZXIuCisgKi8KKy8qIExPQ0FMIHN0cnVjdHVyZSBhbmQgZmllbGRzIHVzZWQgd2hlbiBwcm9jZXNzaW5nCisgKiBpbnRlcm5hbGx5IGdlbmVyYXRlZCBjb21tYW5kcy4gVGhlc2UgaW5jbHVkZToKKyAqIGJ1cyBzY2FuLCBkdiBhbmQgY29uZmlnIHJlcXVlc3RzLgorICovCit0eXBlZGVmIHN0cnVjdCBfTVBUX0xPQ0FMX1JFUExZIHsKKwlDb25maWdQYWdlSGVhZGVyX3QgaGVhZGVyOworCWludAljb21wbGV0aW9uOworCXU4CXNlbnNlW1NDU0lfU1REX1NFTlNFX0JZVEVTXTsKKwl1OAlzY3NpU3RhdHVzOworCXU4CXNraXA7CisJdTMyCXBhZDsKK30gTVBUX0xPQ0FMX1JFUExZOworCisjZGVmaW5lIE1QVF9IT1NUX0JVU19VTktOT1dOCQkoMHhGRikKKyNkZWZpbmUgTVBUX0hPU1RfVE9PX01BTllfVE0JCSgweDA1KQorI2RlZmluZSBNUFRfSE9TVF9OVlJBTV9JTlZBTElECQkoMHhGRkZGRkZGRikKKyNkZWZpbmUgTVBUX0hPU1RfTk9fQ0hBSU4JCSgweEZGRkZGRkZGKQorI2RlZmluZSBNUFRfTlZSQU1fTUFTS19USU1FT1VUCQkoMHgwMDAwMDBGRikKKyNkZWZpbmUgTVBUX05WUkFNX1NZTkNfTUFTSwkJKDB4MDAwMEZGMDApCisjZGVmaW5lIE1QVF9OVlJBTV9TWU5DX1NISUZUCQkoOCkKKyNkZWZpbmUgTVBUX05WUkFNX0RJU0NPTk5FQ1RfRU5BQkxFCSgweDAwMDEwMDAwKQorI2RlZmluZSBNUFRfTlZSQU1fSURfU0NBTl9FTkFCTEUJKDB4MDAwMjAwMDApCisjZGVmaW5lIE1QVF9OVlJBTV9MVU5fU0NBTl9FTkFCTEUJKDB4MDAwNDAwMDApCisjZGVmaW5lIE1QVF9OVlJBTV9UQUdfUVVFVUVfRU5BQkxFCSgweDAwMDgwMDAwKQorI2RlZmluZSBNUFRfTlZSQU1fV0lERV9ESVNBQkxFCQkoMHgwMDEwMDAwMCkKKyNkZWZpbmUgTVBUX05WUkFNX0JPT1RfQ0hPSUNFCQkoMHgwMDIwMDAwMCkKKworLyogVGhlIFRNX1NUQVRFIHZhcmlhYmxlIGlzIHVzZWQgdG8gcHJvdmlkZSBzdHJpY3Qgc2luZ2xlIHRocmVhZGluZyBvZiBUTQorICogcmVxdWVzdHMgYXMgd2VsbCBhcyBjb21tdW5pY2F0ZSBUTSBlcnJvciBjb25kaXRpb25zLgorICovCisjZGVmaW5lIFRNX1NUQVRFX05PTkUgICAgICAgICAgKDApCisjZGVmaW5lCVRNX1NUQVRFX0lOX1BST0dSRVNTICAgKDEpCisjZGVmaW5lCVRNX1NUQVRFX0VSUk9SCSAgICAgICAoMikKKwordHlwZWRlZiBlbnVtIHsKKwlGQywKKwlTQ1NJLAorCVNBUworfSBCVVNfVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgX01QVF9TQ1NJX0hPU1QgeworCU1QVF9BREFQVEVSCQkgKmlvYzsKKwlpbnQJCQkgIHBvcnQ7CisJdTMyCQkJICBwYWQwOworCXN0cnVjdCBzY3NpX2NtbmQJKipTY3NpTG9va3VwOworCVZpcnREZXZpY2UJCSoqVGFyZ2V0czsKKwlNUFRfTE9DQUxfUkVQTFkJCSAqcExvY2FsOwkJLyogdXNlZCBmb3IgaW50ZXJuYWwgY29tbWFuZHMgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdAkgIHRpbWVyOworCQkvKiBQb29sIG9mIG1lbW9yeSBmb3IgaG9sZGluZyBTQ3BudHMgYmVmb3JlIGRvaW5nCisJCSAqIE9TIGNhbGxiYWNrcy4gZnJlZVEgaXMgdGhlIGZyZWUgcG9vbC4KKwkJICovCisJdTgJCQkgIHRtUGVuZGluZzsKKwl1OAkJCSAgcmVzZXRQZW5kaW5nOworCXU4CQkJICBuZWdvTnZyYW07CQkvKiBEViBkaXNhYmxlZCwgbmVnbyBOVlJBTSAqLworCXU4CQkJICBwYWQxOworCXU4ICAgICAgICAgICAgICAgICAgICAgICAgdG1TdGF0ZTsKKwl1OAkJCSAgcnN2ZFsyXTsKKwlNUFRfRlJBTUVfSERSCQkgKmNtZFB0cjsJCS8qIFB0ciB0byBub25PUyByZXF1ZXN0ICovCisJc3RydWN0IHNjc2lfY21uZAkgKmFib3J0U0NwbnQ7CisJTVBUX0xPQ0FMX1JFUExZCQkgIGxvY2FsUmVwbHk7CQkvKiBpbnRlcm5hbCBjbWQgcmVwbHkgc3RydWN0ICovCisJdW5zaWduZWQgbG9uZwkJICBoYXJkX3Jlc2V0czsJCS8qIGRyaXZlciBmb3JjZWQgYnVzIHJlc2V0cyBjb3VudCAqLworCXVuc2lnbmVkIGxvbmcJCSAgc29mdF9yZXNldHM7CQkvKiBmdy9leHRlcm5hbCBidXMgcmVzZXRzIGNvdW50ICovCisJdW5zaWduZWQgbG9uZwkJICB0aW1lb3V0czsJCS8qIGNtZCB0aW1lb3V0cyAqLworCXVzaG9ydAkJCSAgc2VsX3RpbWVvdXRbTVBUX01BWF9GQ19ERVZJQ0VTXTsKK30gTVBUX1NDU0lfSE9TVDsKKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCU1vcmUgRHluYW1pYyBNdWx0aS1QYXRoaW5nIHN0dWZmLi4uCisgKi8KKworLyogRm9yd2FyZCBkZWNsLCBhIHN0cmFuZ2UgQyB0aGluZywgdG8gcHJldmVudCBnY2MgY29tcGlsZXIgd2FybmluZ3MgKi8KK3N0cnVjdCBzY3NpX2NtbmQ7CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKiBHZW5lcmljIHN0cnVjdHVyZSBwYXNzZWQgdG8gdGhlIGJhc2UgbXB0X2NvbmZpZyBmdW5jdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3hfY29uZmlnX3Bhcm1zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCSBsaW5rYWdlOwkvKiBsaW5rZWQgbGlzdCAqLworCXN0cnVjdCB0aW1lcl9saXN0CSB0aW1lcjsJCS8qIHRpbWVyIGZ1bmN0aW9uIGZvciB0aGlzIHJlcXVlc3QgICovCisJQ29uZmlnUGFnZUhlYWRlcl90CSpoZHI7CisJZG1hX2FkZHJfdAkJIHBoeXNBZGRyOworCWludAkJCSB3YWl0X2RvbmU7CS8qIHdhaXQgZm9yIHRoaXMgcmVxdWVzdCAqLworCXUzMgkJCSBwYWdlQWRkcjsJLyogcHJvcGVybHkgZm9ybWF0dGVkICovCisJdTgJCQkgYWN0aW9uOworCXU4CQkJIGRpcjsKKwl1OAkJCSB0aW1lb3V0OwkvKiBzZWNvbmRzICovCisJdTgJCQkgcGFkMTsKKwl1MTYJCQkgc3RhdHVzOworCXUxNgkJCSBwYWQyOworfSBDT05GSUdQQVJNUzsKKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqICBQdWJsaWMgZW50cnkgcG9pbnRzLi4uCisgKi8KK2V4dGVybiBpbnQJIG1wdF9yZWdpc3RlcihNUFRfQ0FMTEJBQ0sgY2JmdW5jLCBNUFRfRFJJVkVSX0NMQVNTIGRjbGFzcyk7CitleHRlcm4gdm9pZAkgbXB0X2RlcmVnaXN0ZXIoaW50IGNiX2lkeCk7CitleHRlcm4gaW50CSBtcHRfZXZlbnRfcmVnaXN0ZXIoaW50IGNiX2lkeCwgTVBUX0VWSEFORExFUiBldl9jYmZ1bmMpOworZXh0ZXJuIHZvaWQJIG1wdF9ldmVudF9kZXJlZ2lzdGVyKGludCBjYl9pZHgpOworZXh0ZXJuIGludAkgbXB0X3Jlc2V0X3JlZ2lzdGVyKGludCBjYl9pZHgsIE1QVF9SRVNFVEhBTkRMRVIgcmVzZXRfZnVuYyk7CitleHRlcm4gdm9pZAkgbXB0X3Jlc2V0X2RlcmVnaXN0ZXIoaW50IGNiX2lkeCk7CitleHRlcm4gaW50CSBtcHRfZGV2aWNlX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgbXB0X3BjaV9kcml2ZXIgKiBkZF9jYmZ1bmMsIGludCBjYl9pZHgpOworZXh0ZXJuIHZvaWQJIG1wdF9kZXZpY2VfZHJpdmVyX2RlcmVnaXN0ZXIoaW50IGNiX2lkeCk7CitleHRlcm4gTVBUX0ZSQU1FX0hEUgkqbXB0X2dldF9tc2dfZnJhbWUoaW50IGhhbmRsZSwgTVBUX0FEQVBURVIgKmlvYyk7CitleHRlcm4gdm9pZAkgbXB0X2ZyZWVfbXNnX2ZyYW1lKE1QVF9BREFQVEVSICppb2MsIE1QVF9GUkFNRV9IRFIgKm1mKTsKK2V4dGVybiB2b2lkCSBtcHRfcHV0X21zZ19mcmFtZShpbnQgaGFuZGxlLCBNUFRfQURBUFRFUiAqaW9jLCBNUFRfRlJBTUVfSERSICptZik7CitleHRlcm4gdm9pZAkgbXB0X2FkZF9zZ2UoY2hhciAqcEFkZHIsIHUzMiBmbGFnc2xlbmd0aCwgZG1hX2FkZHJfdCBkbWFfYWRkcik7CisKK2V4dGVybiBpbnQJIG1wdF9zZW5kX2hhbmRzaGFrZV9yZXF1ZXN0KGludCBoYW5kbGUsIE1QVF9BREFQVEVSICppb2MsIGludCByZXFCeXRlcywgdTMyICpyZXEsIGludCBzbGVlcEZsYWcpOworZXh0ZXJuIGludAkgbXB0X3ZlcmlmeV9hZGFwdGVyKGludCBpb2NpZCwgTVBUX0FEQVBURVIgKippb2NwcCk7CitleHRlcm4gdTMyCSBtcHRfR2V0SW9jU3RhdGUoTVBUX0FEQVBURVIgKmlvYywgaW50IGNvb2tlZCk7CitleHRlcm4gdm9pZAkgbXB0X3ByaW50X2lvY19zdW1tYXJ5KE1QVF9BREFQVEVSICppb2MsIGNoYXIgKmJ1ZiwgaW50ICpzaXplLCBpbnQgbGVuLCBpbnQgc2hvd2xhbik7CitleHRlcm4gaW50CSBtcHRfSGFyZFJlc2V0SGFuZGxlcihNUFRfQURBUFRFUiAqaW9jLCBpbnQgc2xlZXBGbGFnKTsKK2V4dGVybiBpbnQJIG1wdF9jb25maWcoTVBUX0FEQVBURVIgKmlvYywgQ09ORklHUEFSTVMgKmNmZyk7CitleHRlcm4gaW50CSBtcHRfdG9vbGJveChNUFRfQURBUFRFUiAqaW9jLCBDT05GSUdQQVJNUyAqY2ZnKTsKK2V4dGVybiB2b2lkCSBtcHRfYWxsb2NfZndfbWVtb3J5KE1QVF9BREFQVEVSICppb2MsIGludCBzaXplKTsKK2V4dGVybiB2b2lkCSBtcHRfZnJlZV9md19tZW1vcnkoTVBUX0FEQVBURVIgKmlvYyk7CitleHRlcm4gaW50CSBtcHRfZmluZEltVm9sdW1lcyhNUFRfQURBUFRFUiAqaW9jKTsKK2V4dGVybiBpbnQJIG1wdF9yZWFkX2lvY19wZ18zKE1QVF9BREFQVEVSICppb2MpOworCisvKgorICogIFB1YmxpYyBkYXRhIGRlY2wncy4uLgorICovCitleHRlcm4gc3RydWN0IGxpc3RfaGVhZAkgIGlvY19saXN0OworZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqbXB0X3Byb2Nfcm9vdF9kaXI7CisKK2V4dGVybiBpbnQJCSAgbXB0X2xhbl9pbmRleDsJLyogbmVlZGVkIGJ5IG1wdGxhbi5jICovCitleHRlcm4gaW50CQkgIG1wdF9zdG1faW5kZXg7CS8qIG5lZWRlZCBieSBtcHRzdG0uYyAqLworCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisjZW5kaWYJCS8qIH0gX19LRVJORUxfXyAqLworCisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19zcGFyY192OV9fKSB8fCBkZWZpbmVkKF9faWE2NF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisjZGVmaW5lIENBU1RfVTMyX1RPX1BUUih4KQkoKHZvaWQgKikodTY0KXgpCisjZGVmaW5lIENBU1RfUFRSX1RPX1UzMih4KQkoKHUzMikodTY0KXgpCisjZWxzZQorI2RlZmluZSBDQVNUX1UzMl9UT19QVFIoeCkJKCh2b2lkICopeCkKKyNkZWZpbmUgQ0FTVF9QVFJfVE9fVTMyKHgpCSgodTMyKXgpCisjZW5kaWYKKworI2RlZmluZSBNUFRfUFJPVE9DT0xfRkxBR1NfY19jX2NfYyhwZmxhZ3MpIFwKKwkoKHBmbGFncykgJiBNUElfUE9SVEZBQ1RTX1BST1RPQ09MX0lOSVRJQVRPUikJPyAnSScgOiAnaScsCVwKKwkoKHBmbGFncykgJiBNUElfUE9SVEZBQ1RTX1BST1RPQ09MX1RBUkdFVCkJPyAnVCcgOiAndCcsCVwKKwkoKHBmbGFncykgJiBNUElfUE9SVEZBQ1RTX1BST1RPQ09MX0xBTikJCT8gJ0wnIDogJ2wnLAlcCisJKChwZmxhZ3MpICYgTVBJX1BPUlRGQUNUU19QUk9UT0NPTF9MT0dCVVNBRERSKQk/ICdCJyA6ICdiJworCisvKgorICogIFNoaWZ0ZWQgU0dFIERlZmluZXMgLSBVc2UgaW4gU0dFIHdpdGggRmxhZ3NMZW5ndGggbWVtYmVyLgorICogIE90aGVyd2lzZSwgdXNlIE1QSV94eHggZGVmaW5lcyAocmVmZXIgdG8gImxzaS9tcGkuaCIgaGVhZGVyKS4KKyAqICBEZWZhdWx0czogMzIgYml0IFNHRSwgU1lTVEVNX0FERFJFU1MgaWYgZGlyZWN0aW9uIGJpdCBpcyAwLCByZWFkCisgKi8KKyNkZWZpbmUgTVBUX1RSQU5TRkVSX0lPQ19UT19IT1NUCQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgTVBUX1RSQU5TRkVSX0hPU1RfVE9fSU9DCQkoMHgwNDAwMDAwMCkKKyNkZWZpbmUgTVBUX1NHRV9GTEFHU19MQVNUX0VMRU1FTlQJCSgweDgwMDAwMDAwKQorI2RlZmluZSBNUFRfU0dFX0ZMQUdTX0VORF9PRl9CVUZGRVIJCSgweDQwMDAwMDAwKQorI2RlZmluZSBNUFRfU0dFX0ZMQUdTX0xPQ0FMX0FERFJFU1MJCSgweDA4MDAwMDAwKQorI2RlZmluZSBNUFRfU0dFX0ZMQUdTX0RJUkVDVElPTgkJCSgweDA0MDAwMDAwKQorI2RlZmluZSBNUFRfU0dFX0ZMQUdTX0FERFJFU1NJTkcJCShtcHRfYWRkcl9zaXplKCkgPDwgTVBJX1NHRV9GTEFHU19TSElGVCkKKyNkZWZpbmUgTVBUX1NHRV9GTEFHU19FTkRfT0ZfTElTVAkJKDB4MDEwMDAwMDApCisKKyNkZWZpbmUgTVBUX1NHRV9GTEFHU19UUkFOU0FDVElPTl9FTEVNRU5UCSgweDAwMDAwMDAwKQorI2RlZmluZSBNUFRfU0dFX0ZMQUdTX1NJTVBMRV9FTEVNRU5UCQkoMHgxMDAwMDAwMCkKKyNkZWZpbmUgTVBUX1NHRV9GTEFHU19DSEFJTl9FTEVNRU5UCQkoMHgzMDAwMDAwMCkKKyNkZWZpbmUgTVBUX1NHRV9GTEFHU19FTEVNRU5UX01BU0sJCSgweDMwMDAwMDAwKQorCisjZGVmaW5lIE1QVF9TR0VfRkxBR1NfU1NJTVBMRV9SRUFEIFwKKwkoTVBUX1NHRV9GTEFHU19MQVNUX0VMRU1FTlQgfAlcCisJIE1QVF9TR0VfRkxBR1NfRU5EX09GX0JVRkZFUiB8CVwKKwkgTVBUX1NHRV9GTEFHU19FTkRfT0ZfTElTVCB8CVwKKwkgTVBUX1NHRV9GTEFHU19TSU1QTEVfRUxFTUVOVCB8CVwKKwkgTVBUX1NHRV9GTEFHU19BRERSRVNTSU5HIHwgXAorCSBNUFRfVFJBTlNGRVJfSU9DX1RPX0hPU1QpCisjZGVmaW5lIE1QVF9TR0VfRkxBR1NfU1NJTVBMRV9XUklURSBcCisJKE1QVF9TR0VfRkxBR1NfTEFTVF9FTEVNRU5UIHwJXAorCSBNUFRfU0dFX0ZMQUdTX0VORF9PRl9CVUZGRVIgfAlcCisJIE1QVF9TR0VfRkxBR1NfRU5EX09GX0xJU1QgfAlcCisJIE1QVF9TR0VfRkxBR1NfU0lNUExFX0VMRU1FTlQgfAlcCisJIE1QVF9TR0VfRkxBR1NfQUREUkVTU0lORyB8IFwKKwkgTVBUX1RSQU5TRkVSX0hPU1RfVE9fSU9DKQorCisvKn0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRjdGwuYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0Y3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiMGNmYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0Y3RsLmMKQEAgLTAsMCArMSwyODc4IEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0Y3RsLmMKKyAqICAgICAgRnVzaW9uIE1QVCBtaXNjIGRldmljZSAoaW9jdGwpIGRyaXZlci4KKyAqICAgICAgRm9yIHVzZSB3aXRoIFBDSSBjaGlwL2FkYXB0ZXIocyk6CisgKiAgICAgICAgICBMU0lGQzl4eC9MU0k0MDl4eCBGaWJyZSBDaGFubmVsCisgKiAgICAgIHJ1bm5pbmcgTFNJIExvZ2ljIEZ1c2lvbiBNUFQgKE1lc3NhZ2UgUGFzc2luZyBUZWNobm9sb2d5KSBmaXJtd2FyZS4KKyAqCisgKiAgQ3JlZGl0czoKKyAqICAgICAgVGhpcyBkcml2ZXIgd291bGQgbm90IGV4aXN0IGlmIG5vdCBmb3IgQWxhbiBDb3gncyBkZXZlbG9wbWVudAorICogICAgICBvZiB0aGUgbGludXggaTJvIGRyaXZlci4KKyAqCisgKiAgICAgIEEgc3BlY2lhbCB0aGFua3MgdG8gUGFtZWxhIERlbGFuZXkgKExTSSBMb2dpYykgZm9yIHRvbnMgb2Ygd29yaworICogICAgICBhbmQgY291bnRsZXNzIGVuaGFuY2VtZW50cyB3aGlsZSBhZGRpbmcgc3VwcG9ydCBmb3IgdGhlIDEwMzAKKyAqICAgICAgY2hpcCBmYW1pbHkuICBQYW0gaGFzIGJlZW4gaW5zdHJ1bWVudGFsIGluIHRoZSBkZXZlbG9wbWVudCBvZgorICogICAgICBvZiB0aGUgMi54eC54eCBzZXJpZXMgZnVzaW9uIGRyaXZlcnMsIGFuZCBoZXIgY29udHJpYnV0aW9ucyBhcmUKKyAqICAgICAgZmFyIHRvbyBudW1lcm91cyB0byBob3BlIHRvIGxpc3QgaW4gb25lIHBsYWNlLgorICoKKyAqICAgICAgQSBodWdlIGRlYnQgb2YgZ3JhdGl0dWRlIGlzIG93ZWQgdG8gRGF2aWQgUy4gTWlsbGVyIChEYXZlTSkKKyAqICAgICAgZm9yIGZpeGluZyBtdWNoIG9mIHRoZSBzdHVwaWQgYW5kIGJyb2tlbiBzdHVmZiBpbiB0aGUgZWFybHkKKyAqICAgICAgZHJpdmVyIHdoaWxlIHBvcnRpbmcgdG8gc3BhcmM2NCBwbGF0Zm9ybS4gIFRIQU5LIFlPVSEKKyAqCisgKiAgICAgIEEgYmlnIFRIQU5LUyB0byBFZGRpZSBDLiBEb3N0IGZvciBmaXhpbmcgdGhlIGlvY3RsIHBhdGgKKyAqICAgICAgYW5kIG1vc3QgaW1wb3J0YW50bHkgZi93IGRvd25sb2FkIG9uIHNwYXJjNjQgcGxhdGZvcm0hCisgKiAgICAgIChwbHVzIEVkZGllJ3Mgb3RoZXIgaGVscGZ1bCBoaW50cyBhbmQgaW5zaWdodHMpCisgKgorICogICAgICBUaGFua3MgdG8gQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIGZvciBmaW5kaW5nIGFuZCBwYXRjaGluZworICogICAgICBhIHBvdGVudGlhbCBtZW1vcnkgbGVhayBpbiBtcHRjdGxfZG9fZndfZG93bmxvYWQoKSwKKyAqICAgICAgYW5kIGZvciBzb21lIGttYWxsb2MgaW5zaWdodDotKQorICoKKyAqICAgICAgKHNlZSBhbHNvIG1wdGJhc2UuYykKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgTFNJIExvZ2ljIENvcnBvcmF0aW9uCisgKiAgT3JpZ2luYWxseSBCeTogU3RldmVuIEouIFJhbHN0b24sIE5vYWggUm9tZXIKKyAqICAobWFpbHRvOnNqcmFsc3RvbjFAbmV0c2NhcGUubmV0KQorICogIChtYWlsdG86bXB0X2xpbnV4X2RldmVsb3BlckBsc2lsLmNvbSkKKyAqCisgKiAgJElkOiBtcHRjdGwuYyx2IDEuNjMgMjAwMi8xMi8wMyAyMToyNjozMyBwZGVsYW5leSBFeHAgJAorICovCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgTk8gV0FSUkFOVFkKKyAgICBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKKyAgICBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVAorICAgIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisgICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcworICAgIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKKyAgICBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyAgICBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLAorICAgIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorCisgICAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkKKyAgICBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorICAgIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAgIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5ECisgICAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgICAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICAgIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorICAgIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMKKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIGZvciBtZGVsYXkgKi8KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KKworI2RlZmluZSBDT1BZUklHSFQJIkNvcHlyaWdodCAoYykgMTk5OS0yMDA0IExTSSBMb2dpYyBDb3Jwb3JhdGlvbiIKKyNkZWZpbmUgTU9EVUxFQVVUSE9SCSJTdGV2ZW4gSi4gUmFsc3RvbiwgTm9haCBSb21lciwgUGFtZWxhIERlbGFuZXkiCisjaW5jbHVkZSAibXB0YmFzZS5oIgorI2luY2x1ZGUgIm1wdGN0bC5oIgorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisjZGVmaW5lIG15X05BTUUJCSJGdXNpb24gTVBUIG1pc2MgZGV2aWNlIChpb2N0bCkgZHJpdmVyIgorI2RlZmluZSBteV9WRVJTSU9OCU1QVF9MSU5VWF9WRVJTSU9OX0NPTU1PTgorI2RlZmluZSBNWU5BTQkJIm1wdGN0bCIKKworTU9EVUxFX0FVVEhPUihNT0RVTEVBVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKG15X05BTUUpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisKK3N0YXRpYyBpbnQgbXB0Y3RsX2lkID0gLTE7CisKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCAoIG1wdGN0bF93YWl0ICk7CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKworc3RydWN0IGJ1Zmxpc3QgeworCXU4CSprcHRyOworCWludAkgbGVuOworfTsKKworLyoKKyAqIEZ1bmN0aW9uIHByb3RvdHlwZXMuIENhbGxlZCBmcm9tIE9TIGVudHJ5IHBvaW50IG1wdGN0bF9pb2N0bC4KKyAqIGFyZyBjb250ZW50cyBzcGVjaWZpYyB0byBmdW5jdGlvbi4KKyAqLworc3RhdGljIGludCBtcHRjdGxfZndfZG93bmxvYWQodW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCBtcHRjdGxfZ2V0aW9jaW5mbyAodW5zaWduZWQgbG9uZyBhcmcsIHVuc2lnbmVkIGludCBjbWQpOworc3RhdGljIGludCBtcHRjdGxfZ2V0dGFyZ2V0aW5mbyAodW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCBtcHRjdGxfcmVhZHRlc3QgKHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgbXB0Y3RsX21wdF9jb21tYW5kICh1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IG1wdGN0bF9ldmVudHF1ZXJ5ICh1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IG1wdGN0bF9ldmVudGVuYWJsZSAodW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCBtcHRjdGxfZXZlbnRyZXBvcnQgKHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgbXB0Y3RsX3JlcGxhY2VfZncgKHVuc2lnbmVkIGxvbmcgYXJnKTsKKworc3RhdGljIGludCBtcHRjdGxfZG9fcmVzZXQodW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCBtcHRjdGxfaHBfaG9zdGluZm8odW5zaWduZWQgbG9uZyBhcmcsIHVuc2lnbmVkIGludCBjbWQpOworc3RhdGljIGludCBtcHRjdGxfaHBfdGFyZ2V0aW5mbyh1bnNpZ25lZCBsb25nIGFyZyk7CisKK3N0YXRpYyBpbnQgIG1wdGN0bF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqLCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqKTsKK3N0YXRpYyB2b2lkIG1wdGN0bF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKik7CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZyBjb21wYXRfbXBjdGxfaW9jdGwoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworI2VuZGlmCisvKgorICogUHJpdmF0ZSBmdW5jdGlvbiBjYWxscy4KKyAqLworc3RhdGljIGludCBtcHRjdGxfZG9fbXB0X2NvbW1hbmQgKHN0cnVjdCBtcHRfaW9jdGxfY29tbWFuZCBrYXJnLCB2b2lkIF9fdXNlciAqbWZQdHIpOworc3RhdGljIGludCBtcHRjdGxfZG9fZndfZG93bmxvYWQoaW50IGlvYywgY2hhciBfX3VzZXIgKnVmd2J1Ziwgc2l6ZV90IGZ3bGVuKTsKK3N0YXRpYyBNcHRTZ2VfdCAqa2J1Zl9hbGxvY18yX3NnbCggaW50IGJ5dGVzLCB1MzIgZGlyLCBpbnQgc2dlX29mZnNldCwgaW50ICpmcmFncywKKwkJc3RydWN0IGJ1Zmxpc3QgKipibHAsIGRtYV9hZGRyX3QgKnNnbGJ1Zl9kbWEsIE1QVF9BREFQVEVSICppb2MpOworc3RhdGljIHZvaWQga2ZyZWVfc2dsKCBNcHRTZ2VfdCAqc2dsLCBkbWFfYWRkcl90IHNnbF9kbWEsCisJCXN0cnVjdCBidWZsaXN0ICpidWZsaXN0LCBNUFRfQURBUFRFUiAqaW9jKTsKK3N0YXRpYyB2b2lkIG1wdGN0bF90aW1lb3V0X2V4cGlyZWQgKE1QVF9JT0NUTCAqaW9jdGwpOworc3RhdGljIGludCAgbXB0Y3RsX2J1c19yZXNldChNUFRfSU9DVEwgKmlvY3RsKTsKK3N0YXRpYyBpbnQgbXB0Y3RsX3NldF90bV9mbGFncyhNUFRfU0NTSV9IT1NUICpoZCk7CitzdGF0aWMgdm9pZCBtcHRjdGxfZnJlZV90bV9mbGFncyhNUFRfQURBUFRFUiAqaW9jKTsKKworLyoKKyAqIFJlc2V0IEhhbmRsZXIgY2xlYW51cCBmdW5jdGlvbgorICovCitzdGF0aWMgaW50ICBtcHRjdGxfaW9jX3Jlc2V0KE1QVF9BREFQVEVSICppb2MsIGludCByZXNldF9waGFzZSk7CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKiBTY2F0dGVyIGdhdGhlciBsaXN0IChTR0wpIHNpemVzIGFuZCBsaW1pdHMuLi4KKyAqLworLy8jZGVmaW5lIE1BWF9TQ1NJX0ZSQUdTCTkKKyNkZWZpbmUgTUFYX0ZSQUdTX1NQSUxMMQk5CisjZGVmaW5lIE1BWF9GUkFHU19TUElMTDIJMTUKKyNkZWZpbmUgRlJBR1NfUEVSX0JVQ0tFVAkoTUFYX0ZSQUdTX1NQSUxMMiArIDEpCisKKy8vI2RlZmluZSBNQVhfQ0hBSU5fRlJBR1MJNjQKKy8vI2RlZmluZSBNQVhfQ0hBSU5fRlJBR1MJKDE1KzE1KzE1KzE2KQorI2RlZmluZSBNQVhfQ0hBSU5fRlJBR1MJCSg0ICogTUFYX0ZSQUdTX1NQSUxMMiArIDEpCisKKy8vICBEZWZpbmUgbWF4IHNnIExJU1QgYnl0ZXMgKCA9PSAoI2ZyYWdzICsgI2NoYWlucykgKiA4IGJ5dGVzIGVhY2gpCisvLyAgV29ya3Mgb3V0IHRvOiA1OTJkIGJ5dGVzISAgICAgKDkrMSkqOCArIDQqKDE1KzEpKjgKKy8vICAgICAgICAgICAgICAgICAgXi0tLS0tLS0tLS0tLS0tLS0tIDgwICsgNTEyCisjZGVmaW5lIE1BWF9TR0xfQllURVMJCSgoTUFYX0ZSQUdTX1NQSUxMMSArIDEgKyAoNCAqIEZSQUdTX1BFUl9CVUNLRVQpKSAqIDgpCisKKy8qIGxpbnV4IG9ubHkgc2VlbXMgdG8gZXZlciBnaXZlIDEyOGtCIE1BWCBjb250aWd1b3VzIChHRlBfVVNFUikgbWVtIGJ5dGVzICovCisjZGVmaW5lIE1BWF9LTUFMTE9DX1NaCQkoMTI4KjEwMjQpCisKKyNkZWZpbmUgTVBUX0lPQ1RMX0RFRkFVTFRfVElNRU9VVCAxMAkvKiBEZWZhdWx0IHRpbWVvdXQgdmFsdWUgKHNlY29uZHMpICovCisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qKgorICoJbXB0Y3RsX3N5c2NhbGxfZG93biAtIERvd24gdGhlIE1QVCBhZGFwdGVyIHN5c2NhbGwgc2VtYXBob3JlLgorICoJQGlvYzogUG9pbnRlciB0byBNUFQgYWRhcHRlcgorICoJQG5vbmJsb2NrOiBib29sZWFuLCBub24temVybyBpZiBPX05PTkJMT0NLIGlzIHNldAorICoKKyAqCUFsbCBvZiB0aGUgaW9jdGwgY29tbWFuZHMgY2FuIHBvdGVudGlhbGx5IHNsZWVwLCB3aGljaCBpcyBpbGxlZ2FsCisgKgl3aXRoIGEgc3BpbmxvY2sgaGVsZCwgdGh1cyB3ZSBwZXJmb3JtIG11dHVhbCBleGNsdXNpb24gaGVyZS4KKyAqCisgKglSZXR1cm5zIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLCBvciB6ZXJvIGZvciBzdWNjZXNzLgorICovCitzdGF0aWMgaW5saW5lIGludAorbXB0Y3RsX3N5c2NhbGxfZG93bihNUFRfQURBUFRFUiAqaW9jLCBpbnQgbm9uYmxvY2spCit7CisJaW50IHJjID0gMDsKKwlkY3RscHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjo6bXB0Y3RsX3N5c2NhbGxfZG93biglcCwlZCkgY2FsbGVkXG4iLCBpb2MsIG5vbmJsb2NrKSk7CisKKwlpZiAobm9uYmxvY2spIHsKKwkJaWYgKGRvd25fdHJ5bG9jaygmaW9jLT5pb2N0bC0+c2VtX2lvYykpCisJCQlyYyA9IC1FQUdBSU47CisJfSBlbHNlIHsKKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmaW9jLT5pb2N0bC0+c2VtX2lvYykpCisJCQlyYyA9IC1FUkVTVEFSVFNZUzsKKwl9CisJZGN0bHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6Om1wdGN0bF9zeXNjYWxsX2Rvd24gcmV0dXJuICVkXG4iLCByYykpOworCXJldHVybiByYzsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqICBUaGlzIGlzIHRoZSBjYWxsYmFjayBmb3IgYW55IG1lc3NhZ2Ugd2UgaGF2ZSBwb3N0ZWQuIFRoZSBtZXNzYWdlIGl0c2VsZgorICogIHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlIG1lc3NhZ2UgcG9vbCB3aGVuIHdlIHJldHVybiBmcm9tIHRoZSBJUlEKKyAqCisgKiAgVGhpcyBydW5zIGluIGlycSBjb250ZXh0IHNvIGJlIHNob3J0IGFuZCBzd2VldC4KKyAqLworc3RhdGljIGludAorbXB0Y3RsX3JlcGx5KE1QVF9BREFQVEVSICppb2MsIE1QVF9GUkFNRV9IRFIgKnJlcSwgTVBUX0ZSQU1FX0hEUiAqcmVwbHkpCit7CisJY2hhciAqc2Vuc2VfZGF0YTsKKwlpbnQgc3osIHJlcV9pbmRleDsKKwl1MTYgaW9jU3RhdHVzOworCXU4IGNtZDsKKworCWRjdGxwcmludGsoKCJtcHRjdGxfcmVwbHkoKSFcbiIpKTsKKwlpZiAocmVxKQorCQkgY21kID0gcmVxLT51Lmhkci5GdW5jdGlvbjsKKwllbHNlCisJCXJldHVybiAxOworCisJaWYgKGlvYy0+aW9jdGwpIHsKKworCQlpZiAocmVwbHk9PU5VTEwpIHsKKworCQkJZGN0bHByaW50aygoIm1wdGN0bF9yZXBseSgpIE5VTEwgUmVwbHkgIgorCQkJCSJGdW5jdGlvbj0leCFcbiIsIGNtZCkpOworCisJCQlpb2MtPmlvY3RsLT5zdGF0dXMgfD0gTVBUX0lPQ1RMX1NUQVRVU19DT01NQU5EX0dPT0Q7CisJCQlpb2MtPmlvY3RsLT5yZXNldCAmPSB+TVBUQ1RMX1JFU0VUX09LOworCisJCQkvKiBXZSBhcmUgZG9uZSwgaXNzdWUgd2FrZSB1cAorCSAJCSovCisJCQlpb2MtPmlvY3RsLT53YWl0X2RvbmUgPSAxOworCQkJd2FrZV91cCAoJm1wdGN0bF93YWl0KTsKKwkJCXJldHVybiAxOworCisJCX0KKworCQlkY3RscHJpbnRrKCgibXB0Y3RsX3JlcGx5KCkgd2l0aCByZXE9JXAgIgorCQkJInJlcGx5PSVwIEZ1bmN0aW9uPSV4IVxuIiwgcmVxLCByZXBseSwgY21kKSk7CisKKwkJLyogQ29weSB0aGUgcmVwbHkgZnJhbWUgKHdoaWNoIG11Y2ggZXhpc3QKKwkJICogZm9yIG5vbi1TQ1NJIEkvTykgdG8gdGhlIElPQyBzdHJ1Y3R1cmUuCisJCSAqLworCQlkY3RscHJpbnRrKCgiQ29weWluZyBSZXBseSBGcmFtZSBAJXAgdG8gaW9jJWQhXG4iLAorCQkJcmVwbHksIGlvYy0+aWQpKTsKKwkJbWVtY3B5KGlvYy0+aW9jdGwtPlJlcGx5RnJhbWUsIHJlcGx5LAorCQkJbWluKGlvYy0+cmVwbHlfc3osIDQqcmVwbHktPnUucmVwbHkuTXNnTGVuZ3RoKSk7CisJCWlvYy0+aW9jdGwtPnN0YXR1cyB8PSBNUFRfSU9DVExfU1RBVFVTX1JGX1ZBTElEOworCisJCS8qIFNldCB0aGUgY29tbWFuZCBzdGF0dXMgdG8gR09PRCBpZiBJT0MgU3RhdHVzIGlzIEdPT0QKKwkJICogT1IgaWYgU0NTSSBJL08gY21kIGFuZCBkYXRhIHVuZGVycnVuIG9yIHJlY292ZXJlZCBlcnJvci4KKwkJICovCisJCWlvY1N0YXR1cyA9IHJlcGx5LT51LnJlcGx5LklPQ1N0YXR1cyAmIE1QSV9JT0NTVEFUVVNfTUFTSzsKKwkJaWYgKGlvY1N0YXR1cyAgPT0gTVBJX0lPQ1NUQVRVU19TVUNDRVNTKQorCQkJaW9jLT5pb2N0bC0+c3RhdHVzIHw9IE1QVF9JT0NUTF9TVEFUVVNfQ09NTUFORF9HT09EOworCisJCWlmICgoY21kID09IE1QSV9GVU5DVElPTl9TQ1NJX0lPX1JFUVVFU1QpIHx8CisJCQkoY21kID09IE1QSV9GVU5DVElPTl9SQUlEX1NDU0lfSU9fUEFTU1RIUk9VR0gpKSB7CisJCQlpb2MtPmlvY3RsLT5yZXNldCAmPSB+TVBUQ1RMX1JFU0VUX09LOworCisJCQlpZiAoKGlvY1N0YXR1cyA9PSBNUElfSU9DU1RBVFVTX1NDU0lfREFUQV9VTkRFUlJVTikgfHwKKwkJCShpb2NTdGF0dXMgPT0gTVBJX0lPQ1NUQVRVU19TQ1NJX1JFQ09WRVJFRF9FUlJPUikpIHsKKwkJCWlvYy0+aW9jdGwtPnN0YXR1cyB8PSBNUFRfSU9DVExfU1RBVFVTX0NPTU1BTkRfR09PRDsKKwkJCX0KKwkJfQorCisJCS8qIENvcHkgdGhlIHNlbnNlIGRhdGEgLSBpZiBwcmVzZW50CisJCSAqLworCQlpZiAoKGNtZCA9PSBNUElfRlVOQ1RJT05fU0NTSV9JT19SRVFVRVNUKSAmJgorCQkJKHJlcGx5LT51LnNyZXBseS5TQ1NJU3RhdGUgJgorCQkJIE1QSV9TQ1NJX1NUQVRFX0FVVE9TRU5TRV9WQUxJRCkpeworCQkJc3ogPSByZXEtPnUuc2NzaXJlcS5TZW5zZUJ1ZmZlckxlbmd0aDsKKwkJCXJlcV9pbmRleCA9CisJCQkgICAgbGUxNl90b19jcHUocmVxLT51LmZyYW1lLmh3aGRyLm1zZ2N0eHUuZmxkLnJlcV9pZHgpOworCQkJc2Vuc2VfZGF0YSA9CisJCQkgICAgKCh1OCAqKWlvYy0+c2Vuc2VfYnVmX3Bvb2wgKworCQkJICAgICAocmVxX2luZGV4ICogTVBUX1NFTlNFX0JVRkZFUl9BTExPQykpOworCQkJbWVtY3B5KGlvYy0+aW9jdGwtPnNlbnNlLCBzZW5zZV9kYXRhLCBzeik7CisJCQlpb2MtPmlvY3RsLT5zdGF0dXMgfD0gTVBUX0lPQ1RMX1NUQVRVU19TRU5TRV9WQUxJRDsKKwkJfQorCisJCWlmIChjbWQgPT0gTVBJX0ZVTkNUSU9OX1NDU0lfVEFTS19NR01UKQorCQkJbXB0Y3RsX2ZyZWVfdG1fZmxhZ3MoaW9jKTsKKworCQkvKiBXZSBhcmUgZG9uZSwgaXNzdWUgd2FrZSB1cAorCQkgKi8KKwkJaW9jLT5pb2N0bC0+d2FpdF9kb25lID0gMTsKKwkJd2FrZV91cCAoJm1wdGN0bF93YWl0KTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qIG1wdGN0bF90aW1lb3V0X2V4cGlyZWQKKyAqCisgKiBFeHBlY3RpbmcgYW4gaW50ZXJydXB0LCBob3dldmVyIHRpbWVkIG91dC4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIG1wdGN0bF90aW1lb3V0X2V4cGlyZWQgKE1QVF9JT0NUTCAqaW9jdGwpCit7CisJaW50IHJjID0gMTsKKworCWRjdGxwcmludGsoKEtFUk5fTk9USUNFIE1ZTkFNICI6IFRpbWVvdXQgRXhwaXJlZCEgSG9zdCAlZFxuIiwKKwkJCQlpb2N0bC0+aW9jLT5pZCkpOworCWlmIChpb2N0bCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpb2N0bC0+d2FpdF9kb25lID0gMDsKKwlpZiAoaW9jdGwtPnJlc2V0ICYgTVBUQ1RMX1JFU0VUX09LKQorCQlyYyA9IG1wdGN0bF9idXNfcmVzZXQoaW9jdGwpOworCisJaWYgKHJjKSB7CisJCS8qIElzc3VlIGEgcmVzZXQgZm9yIHRoaXMgZGV2aWNlLgorCQkgKiBUaGUgSU9DIGlzIG5vdCByZXNwb25kaW5nLgorCQkgKi8KKwkJZGN0bHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiQ2FsbGluZyBIYXJkUmVzZXQhIFxuIiwKKwkJCSBpb2N0bC0+aW9jLT5uYW1lKSk7CisJCW1wdF9IYXJkUmVzZXRIYW5kbGVyKGlvY3RsLT5pb2MsIE5PX1NMRUVQKTsKKwl9CisJcmV0dXJuOworCit9CisKKy8qIG1wdGN0bF9idXNfcmVzZXQKKyAqCisgKiBCdXMgcmVzZXQgY29kZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgbXB0Y3RsX2J1c19yZXNldChNUFRfSU9DVEwgKmlvY3RsKQoreworCU1QVF9GUkFNRV9IRFIJKm1mOworCVNDU0lUYXNrTWdtdF90CSpwU2NzaVRtOworCU1QVF9TQ1NJX0hPU1QJKmhkOworCWludAkJIGlpOworCWludAkJIHJldHZhbDsKKworCisJaW9jdGwtPnJlc2V0ICY9IH5NUFRDVExfUkVTRVRfT0s7CisKKwlpZiAoaW9jdGwtPmlvYy0+c2ggPT0gTlVMTCkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWhkID0gKE1QVF9TQ1NJX0hPU1QgKikgaW9jdGwtPmlvYy0+c2gtPmhvc3RkYXRhOworCWlmIChoZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVQRVJNOworCisJLyogU2luZ2xlIHRocmVhZGluZyAuLi4uCisJICovCisJaWYgKG1wdGN0bF9zZXRfdG1fZmxhZ3MoaGQpICE9IDApCisJCXJldHVybiAtRVBFUk07CisKKwkvKiBTZW5kIHJlcXVlc3QKKwkgKi8KKwlpZiAoKG1mID0gbXB0X2dldF9tc2dfZnJhbWUobXB0Y3RsX2lkLCBpb2N0bC0+aW9jKSkgPT0gTlVMTCkgeworCQlkY3RscHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJJc3N1ZVRhc2tNZ210LCBubyBtc2cgZnJhbWVzISFcbiIsCisJCQkJaW9jdGwtPmlvYy0+bmFtZSkpOworCisJCW1wdGN0bF9mcmVlX3RtX2ZsYWdzKGlvY3RsLT5pb2MpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkdG1wcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIklzc3VlVGFza01nbXQgcmVxdWVzdCBAICVwXG4iLAorCQkJaW9jdGwtPmlvYy0+bmFtZSwgbWYpKTsKKworCXBTY3NpVG0gPSAoU0NTSVRhc2tNZ210X3QgKikgbWY7CisJcFNjc2lUbS0+VGFyZ2V0SUQgPSBpb2N0bC0+dGFyZ2V0OworCXBTY3NpVG0tPkJ1cyA9IGhkLT5wb3J0OwkvKiAwICovCisJcFNjc2lUbS0+Q2hhaW5PZmZzZXQgPSAwOworCXBTY3NpVG0tPkZ1bmN0aW9uID0gTVBJX0ZVTkNUSU9OX1NDU0lfVEFTS19NR01UOworCXBTY3NpVG0tPlJlc2VydmVkID0gMDsKKwlwU2NzaVRtLT5UYXNrVHlwZSA9IE1QSV9TQ1NJVEFTS01HTVRfVEFTS1RZUEVfUkVTRVRfQlVTOworCXBTY3NpVG0tPlJlc2VydmVkMSA9IDA7CisJcFNjc2lUbS0+TXNnRmxhZ3MgPSBNUElfU0NTSVRBU0tNR01UX01TR0ZMQUdTX0xJUFJFU0VUX1JFU0VUX09QVElPTjsKKworCWZvciAoaWk9IDA7IGlpIDwgODsgaWkrKykKKwkJcFNjc2lUbS0+TFVOW2lpXSA9IDA7CisKKwlmb3IgKGlpPTA7IGlpIDwgNzsgaWkrKykKKwkJcFNjc2lUbS0+UmVzZXJ2ZWQyW2lpXSA9IDA7CisKKwlwU2NzaVRtLT5UYXNrTXNnQ29udGV4dCA9IDA7CisJZHRtcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UCisJCSJtcHRjdGxfYnVzX3Jlc2V0OiBpc3N1ZWQuXG4iLCBpb2N0bC0+aW9jLT5uYW1lKSk7CisKKwlEQkdfRFVNUF9UTV9SRVFVRVNUX0ZSQU1FKCh1MzIgKiltZik7CisKKwlpb2N0bC0+d2FpdF9kb25lPTA7CisJaWYgKChyZXR2YWwgPSBtcHRfc2VuZF9oYW5kc2hha2VfcmVxdWVzdChtcHRjdGxfaWQsIGlvY3RsLT5pb2MsCisJICAgICBzaXplb2YoU0NTSVRhc2tNZ210X3QpLCAodTMyKilwU2NzaVRtLCBDQU5fU0xFRVApKSAhPSAwKSB7CisJCWRmYWlscHJpbnRrKChNWUlPQ19zX0VSUl9GTVQgIl9zZW5kX2hhbmRzaGFrZSBGQUlMRUQhIgorCQkJIiAoaGQgJXAsIGlvYyAlcCwgbWYgJXApIFxuIiwgaGQtPmlvYy0+bmFtZSwgaGQsCisJCQloZC0+aW9jLCBtZikpOworCQlnb3RvIG1wdGN0bF9idXNfcmVzZXRfZG9uZTsKKwl9CisKKwkvKiBOb3cgd2FpdCBmb3IgdGhlIGNvbW1hbmQgdG8gY29tcGxldGUgKi8KKwlpaSA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KG1wdGN0bF93YWl0LAorCSAgICAgaW9jdGwtPndhaXRfZG9uZSA9PSAxLAorCSAgICAgSFoqNSAvKiA1IHNlY29uZCB0aW1lb3V0ICovKTsKKworCWlmKGlpIDw9MCAmJiAoaW9jdGwtPndhaXRfZG9uZSAhPSAxICkpICB7CisJCWlvY3RsLT53YWl0X2RvbmUgPSAwOworCQlyZXR2YWwgPSAtMTsgLyogcmV0dXJuIGZhaWx1cmUgKi8KKwl9CisKK21wdGN0bF9idXNfcmVzZXRfZG9uZToKKworCW1wdF9mcmVlX21zZ19mcmFtZShoZC0+aW9jLCBtZik7CisJbXB0Y3RsX2ZyZWVfdG1fZmxhZ3MoaW9jdGwtPmlvYyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludAorbXB0Y3RsX3NldF90bV9mbGFncyhNUFRfU0NTSV9IT1NUICpoZCkgeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGQtPmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CisKKwlpZiAoaGQtPnRtU3RhdGUgPT0gVE1fU1RBVEVfTk9ORSkgeworCQloZC0+dG1TdGF0ZSA9IFRNX1NUQVRFX0lOX1BST0dSRVNTOworCQloZC0+dG1QZW5kaW5nID0gMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGQtPmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGQtPmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCittcHRjdGxfZnJlZV90bV9mbGFncyhNUFRfQURBUFRFUiAqaW9jKQoreworCU1QVF9TQ1NJX0hPU1QgKiBoZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaGQgPSAoTVBUX1NDU0lfSE9TVCAqKSBpb2MtPnNoLT5ob3N0ZGF0YTsKKwlpZiAoaGQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CisKKwloZC0+dG1TdGF0ZSA9IFRNX1NUQVRFX05PTkU7CisJaGQtPnRtUGVuZGluZyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5GcmVlUWxvY2ssIGZsYWdzKTsKKworCXJldHVybjsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyogbXB0Y3RsX2lvY19yZXNldAorICoKKyAqIENsZWFuLXVwIGZ1bmN0aW9uYWxpdHkuIFVzZWQgb25seSBpZiB0aGVyZSBoYXMgYmVlbiBhCisgKiByZWxvYWQgb2YgdGhlIEZXIGR1ZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQKK21wdGN0bF9pb2NfcmVzZXQoTVBUX0FEQVBURVIgKmlvYywgaW50IHJlc2V0X3BoYXNlKQoreworCU1QVF9JT0NUTCAqaW9jdGwgPSBpb2MtPmlvY3RsOworCWRjdGxwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBJT0MgJXNfcmVzZXQgcm91dGVkIHRvIElPQ1RMIGRyaXZlciFcbiIsCisJCXJlc2V0X3BoYXNlPT1NUFRfSU9DX1NFVFVQX1JFU0VUID8gInNldHVwIiA6ICgKKwkJcmVzZXRfcGhhc2U9PU1QVF9JT0NfUFJFX1JFU0VUID8gInByZSIgOiAicG9zdCIpKSk7CisKKwlpZihpb2N0bCA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKworCXN3aXRjaChyZXNldF9waGFzZSkgeworCWNhc2UgTVBUX0lPQ19TRVRVUF9SRVNFVDoKKwkJaW9jdGwtPnN0YXR1cyB8PSBNUFRfSU9DVExfU1RBVFVTX0RJRF9JT0NSRVNFVDsKKwkJYnJlYWs7CisJY2FzZSBNUFRfSU9DX1BPU1RfUkVTRVQ6CisJCWlvY3RsLT5zdGF0dXMgJj0gfk1QVF9JT0NUTF9TVEFUVVNfRElEX0lPQ1JFU0VUOworCQlicmVhazsKKwljYXNlIE1QVF9JT0NfUFJFX1JFU0VUOgorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAxOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICogIE1QVCBpb2N0bCBoYW5kbGVyCisgKiAgY21kIC0gc3BlY2lmeSB0aGUgcGFydGljdWxhciBJT0NUTCBjb21tYW5kIHRvIGJlIGlzc3VlZAorICogIGFyZyAtIGRhdGEgc3BlY2lmaWMgdG8gdGhlIGNvbW1hbmQuIE11c3Qgbm90IGJlIG51bGwuCisgKi8KK3N0YXRpYyBsb25nCitfX21wdGN0bF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJbXB0X2lvY3RsX2hlYWRlciBfX3VzZXIgKnVoZHIgPSAodm9pZCBfX3VzZXIgKikgYXJnOworCW1wdF9pb2N0bF9oZWFkZXIJIGtoZHI7CisJaW50IGlvY251bTsKKwl1bnNpZ25lZCBpb2NudW1YOworCWludCBub25ibG9jayA9IChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJaW50IHJldDsKKwlNUFRfQURBUFRFUiAqaW9jcCA9IE5VTEw7CisKKwlkY3RscHJpbnRrKCgibXB0Y3RsX2lvY3RsKCkgY2FsbGVkXG4iKSk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmtoZHIsIHVoZHIsIHNpemVvZihraGRyKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczo6bXB0Y3RsX2lvY3RsKCkgQCVkIC0gIgorCQkJCSJVbmFibGUgdG8gY29weSBtcHRfaW9jdGxfaGVhZGVyIGRhdGEgQCAlcFxuIiwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIHVoZHIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0ID0gLUVOWElPOwkJCQkvKiAoLTYpIE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MgKi8KKworCS8qIFZlcmlmeSBpbnRlbmRlZCBNUFQgYWRhcHRlciAtIHNldCBpb2NudW0gYW5kIHRoZSBhZGFwdGVyCisJICogcG9pbnRlciAoaW9jcCkKKwkgKi8KKwlpb2NudW1YID0ga2hkci5pb2NudW0gJiAweEZGOworCWlmICgoKGlvY251bSA9IG1wdF92ZXJpZnlfYWRhcHRlcihpb2NudW1YLCAmaW9jcCkpIDwgMCkgfHwKKwkgICAgKGlvY3AgPT0gTlVMTCkpIHsKKwkJZGN0bHByaW50aygoS0VSTl9FUlIgIiVzOjptcHRjdGxfaW9jdGwoKSBAJWQgLSBpb2MlZCBub3QgZm91bmQhXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgaW9jbnVtWCkpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoIWlvY3AtPmFjdGl2ZSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOjptcHRjdGxfaW9jdGwoKSBAJWQgLSBDb250cm9sbGVyIGRpc2FibGVkLlxuIiwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKiBIYW5kbGUgdGhvc2UgY29tbWFuZHMgdGhhdCBhcmUganVzdCByZXR1cm5pbmcKKwkgKiBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIGRyaXZlci4KKwkgKiBUaGVzZSBjb21tYW5kcyBzaG91bGQgbmV2ZXIgdGltZSBvdXQgYW5kIGFyZSB1bmFmZmVjdGVkCisJICogYnkgVE0gYW5kIEZXIHJlbG9hZHMuCisJICovCisJaWYgKChjbWQgJiB+SU9DU0laRV9NQVNLKSA9PSAoTVBUSU9DSU5GTyAmIH5JT0NTSVpFX01BU0spKSB7CisJCXJldHVybiBtcHRjdGxfZ2V0aW9jaW5mbyhhcmcsIF9JT0NfU0laRShjbWQpKTsKKwl9IGVsc2UgaWYgKGNtZCA9PSBNUFRUQVJHRVRJTkZPKSB7CisJCXJldHVybiBtcHRjdGxfZ2V0dGFyZ2V0aW5mbyhhcmcpOworCX0gZWxzZSBpZiAoY21kID09IE1QVFRFU1QpIHsKKwkJcmV0dXJuIG1wdGN0bF9yZWFkdGVzdChhcmcpOworCX0gZWxzZSBpZiAoY21kID09IE1QVEVWRU5UUVVFUlkpIHsKKwkJcmV0dXJuIG1wdGN0bF9ldmVudHF1ZXJ5KGFyZyk7CisJfSBlbHNlIGlmIChjbWQgPT0gTVBURVZFTlRFTkFCTEUpIHsKKwkJcmV0dXJuIG1wdGN0bF9ldmVudGVuYWJsZShhcmcpOworCX0gZWxzZSBpZiAoY21kID09IE1QVEVWRU5UUkVQT1JUKSB7CisJCXJldHVybiBtcHRjdGxfZXZlbnRyZXBvcnQoYXJnKTsKKwl9IGVsc2UgaWYgKGNtZCA9PSBNUFRGV1JFUExBQ0UpIHsKKwkJcmV0dXJuIG1wdGN0bF9yZXBsYWNlX2Z3KGFyZyk7CisJfQorCisJLyogQWxsIG9mIHRoZXNlIGNvbW1hbmRzIHJlcXVpcmUgYW4gaW50ZXJydXB0IG9yCisJICogYXJlIHVua25vd24vaWxsZWdhbC4KKwkgKi8KKwlpZiAoKHJldCA9IG1wdGN0bF9zeXNjYWxsX2Rvd24oaW9jcCwgbm9uYmxvY2spKSAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJZGN0bHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiOiBtcHRjdGxfaW9jdGwoKVxuIiwgaW9jcC0+bmFtZSkpOworCisJaWYgKGNtZCA9PSBNUFRGV0RPV05MT0FEKQorCQlyZXQgPSBtcHRjdGxfZndfZG93bmxvYWQoYXJnKTsKKwllbHNlIGlmIChjbWQgPT0gTVBUQ09NTUFORCkKKwkJcmV0ID0gbXB0Y3RsX21wdF9jb21tYW5kKGFyZyk7CisJZWxzZSBpZiAoY21kID09IE1QVEhBUkRSRVNFVCkKKwkJcmV0ID0gbXB0Y3RsX2RvX3Jlc2V0KGFyZyk7CisJZWxzZSBpZiAoKGNtZCAmIH5JT0NTSVpFX01BU0spID09IChIUF9HRVRIT1NUSU5GTyAmIH5JT0NTSVpFX01BU0spKQorCQlyZXQgPSBtcHRjdGxfaHBfaG9zdGluZm8oYXJnLCBfSU9DX1NJWkUoY21kKSk7CisJZWxzZSBpZiAoY21kID09IEhQX0dFVFRBUkdFVElORk8pCisJCXJldCA9IG1wdGN0bF9ocF90YXJnZXRpbmZvKGFyZyk7CisJZWxzZQorCQlyZXQgPSAtRUlOVkFMOworCisJdXAoJmlvY3AtPmlvY3RsLT5zZW1faW9jKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBsb25nCittcHRjdGxfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWxvbmcgcmV0OworCWxvY2tfa2VybmVsKCk7CisJcmV0ID0gX19tcHRjdGxfaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1wdGN0bF9kb19yZXNldCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbXB0X2lvY3RsX2RpYWdfcmVzZXQgX191c2VyICp1cmluZm8gPSAodm9pZCBfX3VzZXIgKikgYXJnOworCXN0cnVjdCBtcHRfaW9jdGxfZGlhZ19yZXNldCBrcmluZm87CisJTVBUX0FEQVBURVIJCSppb2NwOworCisJZGN0bHByaW50aygoS0VSTl9JTkZPICJtcHRjdGxfZG9fcmVzZXQgY2FsbGVkLlxuIikpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZrcmluZm8sIHVyaW5mbywgc2l6ZW9mKHN0cnVjdCBtcHRfaW9jdGxfZGlhZ19yZXNldCkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXNAJWQ6Om1wdGN0bF9kb19yZXNldCAtICIKKwkJCQkiVW5hYmxlIHRvIGNvcHkgbXB0X2lvY3RsX2RpYWdfcmVzZXQgc3RydWN0IEAgJXBcbiIsCisJCQkJX19GSUxFX18sIF9fTElORV9fLCB1cmluZm8pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAobXB0X3ZlcmlmeV9hZGFwdGVyKGtyaW5mby5oZHIuaW9jbnVtLCAmaW9jcCkgPCAwKSB7CisJCWRjdGxwcmludGsoKEtFUk5fRVJSICIlc0AlZDo6bXB0Y3RsX2RvX3Jlc2V0IC0gaW9jJWQgbm90IGZvdW5kIVxuIiwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIGtyaW5mby5oZHIuaW9jbnVtKSk7CisJCXJldHVybiAtRU5PREVWOyAvKiAoLTYpIE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MgKi8KKwl9CisKKwlpZiAobXB0X0hhcmRSZXNldEhhbmRsZXIoaW9jcCwgQ0FOX1NMRUVQKSAhPSAwKSB7CisJCXByaW50ayAoS0VSTl9FUlIgIiVzQCVkOjptcHRjdGxfZG9fcmVzZXQgLSByZXNldCBmYWlsZWQuXG4iLAorCQkJX19GSUxFX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICogTVBUIEZXIGRvd25sb2FkIGZ1bmN0aW9uLiAgQ2FzdCB0aGUgYXJnIGludG8gdGhlIG1wdF9md194ZmVyIHN0cnVjdHVyZS4KKyAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zOiBpb2NudW0sIGZpcm13YXJlIGxlbmd0aCAoYnl0ZXMpLAorICogICAgICBwb2ludGVyIHRvIHVzZXIgc3BhY2UgbWVtb3J5IHdoZXJlIHRoZSBmdyBpbWFnZSBpcyBzdG9yZWQuCisgKgorICogT3V0cHV0czoJTm9uZS4KKyAqIFJldHVybjoJMCBpZiBzdWNjZXNzZnVsCisgKgkJLUVGQVVMVCBpZiBkYXRhIHVuYXZhaWxhYmxlCisgKgkJLUVOWElPICBpZiBubyBzdWNoIGRldmljZQorICoJCS1FQUdBSU4gaWYgcmVzb3VyY2UgcHJvYmxlbQorICoJCS1FTk9NRU0gaWYgbm8gbWVtb3J5IGZvciBTR0UKKyAqCQktRU1MSU5LIGlmIHRvbyBtYW55IGNoYWluIGJ1ZmZlcnMgcmVxdWlyZWQKKyAqCQktRUJBRFJRQyBpZiBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgRlcgZG93bmxvYWQKKyAqCQktRUJVU1kgaWYgYWRhcHRlciBpcyBidXN5CisgKgkJLUVOT01TRyBpZiBGVyB1cGxvYWQgcmV0dXJuZWQgYmFkIHN0YXR1cworICovCitzdGF0aWMgaW50CittcHRjdGxfZndfZG93bmxvYWQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG1wdF9md194ZmVyIF9fdXNlciAqdWZ3ZGwgPSAodm9pZCBfX3VzZXIgKikgYXJnOworCXN0cnVjdCBtcHRfZndfeGZlcgkga2Z3ZGw7CisKKwlkY3RscHJpbnRrKChLRVJOX0lORk8gIm1wdGN0bF9md2RsIGNhbGxlZC4gbXB0Y3RsX2lkID0gJXhoXG4iLCBtcHRjdGxfaWQpKTsgLy90YworCWlmIChjb3B5X2Zyb21fdXNlcigma2Z3ZGwsIHVmd2RsLCBzaXplb2Yoc3RydWN0IG1wdF9md194ZmVyKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlc0AlZDo6X2lvY3RsX2Z3ZGwgLSAiCisJCQkJIlVuYWJsZSB0byBjb3B5IG1wdF9md194ZmVyIHN0cnVjdCBAICVwXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgdWZ3ZGwpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gbXB0Y3RsX2RvX2Z3X2Rvd25sb2FkKGtmd2RsLmlvY251bSwga2Z3ZGwuYnVmcCwga2Z3ZGwuZndsZW4pOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICogRlcgRG93bmxvYWQgZW5naW5lLgorICogT3V0cHV0czoJTm9uZS4KKyAqIFJldHVybjoJMCBpZiBzdWNjZXNzZnVsCisgKgkJLUVGQVVMVCBpZiBkYXRhIHVuYXZhaWxhYmxlCisgKgkJLUVOWElPICBpZiBubyBzdWNoIGRldmljZQorICoJCS1FQUdBSU4gaWYgcmVzb3VyY2UgcHJvYmxlbQorICoJCS1FTk9NRU0gaWYgbm8gbWVtb3J5IGZvciBTR0UKKyAqCQktRU1MSU5LIGlmIHRvbyBtYW55IGNoYWluIGJ1ZmZlcnMgcmVxdWlyZWQKKyAqCQktRUJBRFJRQyBpZiBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgRlcgZG93bmxvYWQKKyAqCQktRUJVU1kgaWYgYWRhcHRlciBpcyBidXN5CisgKgkJLUVOT01TRyBpZiBGVyB1cGxvYWQgcmV0dXJuZWQgYmFkIHN0YXR1cworICovCitzdGF0aWMgaW50CittcHRjdGxfZG9fZndfZG93bmxvYWQoaW50IGlvYywgY2hhciBfX3VzZXIgKnVmd2J1Ziwgc2l6ZV90IGZ3bGVuKQoreworCUZXRG93bmxvYWRfdAkJKmRsbXNnOworCU1QVF9GUkFNRV9IRFIJCSptZjsKKwlNUFRfQURBUFRFUgkJKmlvY3A7CisJRldEb3dubG9hZFRDU0dFX3QJKnB0c2dlOworCU1wdFNnZV90CQkqc2dsLCAqc2dJbjsKKwljaGFyCQkJKnNnT3V0OworCXN0cnVjdCBidWZsaXN0CQkqYnVmbGlzdDsKKwlzdHJ1Y3QgYnVmbGlzdAkJKmJsOworCWRtYV9hZGRyX3QJCSBzZ2xfZG1hOworCWludAkJCSByZXQ7CisJaW50CQkJIG51bWZyYWdzID0gMDsKKwlpbnQJCQkgbWF4ZnJhZ3M7CisJaW50CQkJIG4gPSAwOworCXUzMgkJCSBzZ2RpcjsKKwl1MzIJCQkgbmliOworCWludAkJCSBmd19ieXRlc19jb3BpZWQgPSAwOworCWludAkJCSBpOworCWludAkJCSBzZ2Vfb2Zmc2V0ID0gMDsKKwl1MTYJCQkgaW9jc3RhdDsKKwlwRldEb3dubG9hZFJlcGx5X3QJIFJlcGx5TXNnID0gTlVMTDsKKworCWRjdGxwcmludGsoKEtFUk5fSU5GTyAibXB0Y3RsX2RvX2Z3ZGwgY2FsbGVkLiBtcHRjdGxfaWQgPSAleGguXG4iLCBtcHRjdGxfaWQpKTsKKworCWRjdGxwcmludGsoKEtFUk5fSU5GTyAiRGJHOiBrZndkbC5idWZwICA9ICVwXG4iLCB1ZndidWYpKTsKKwlkY3RscHJpbnRrKChLRVJOX0lORk8gIkRiRzoga2Z3ZGwuZndsZW4gPSAlZFxuIiwgKGludClmd2xlbikpOworCWRjdGxwcmludGsoKEtFUk5fSU5GTyAiRGJHOiBrZndkbC5pb2MgICA9ICUwNHhoXG4iLCBpb2MpKTsKKworCWlmICgoaW9jID0gbXB0X3ZlcmlmeV9hZGFwdGVyKGlvYywgJmlvY3ApKSA8IDApIHsKKwkJZGN0bHByaW50aygoIiVzQCVkOjpfaW9jdGxfZndkbCAtIGlvYyVkIG5vdCBmb3VuZCFcbiIsCisJCQkJX19GSUxFX18sIF9fTElORV9fLCBpb2MpKTsKKwkJcmV0dXJuIC1FTk9ERVY7IC8qICgtNikgTm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcyAqLworCX0KKworCS8qICBWYWxpZCBkZXZpY2UuIEdldCBhIG1lc3NhZ2UgZnJhbWUgYW5kIGNvbnN0cnVjdCB0aGUgRlcgZG93bmxvYWQgbWVzc2FnZS4KKwkgKi8KKwlpZiAoKG1mID0gbXB0X2dldF9tc2dfZnJhbWUobXB0Y3RsX2lkLCBpb2NwKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FQUdBSU47CisJZGxtc2cgPSAoRldEb3dubG9hZF90KikgbWY7CisJcHRzZ2UgPSAoRldEb3dubG9hZFRDU0dFX3QgKikgJmRsbXNnLT5TR0w7CisJc2dPdXQgPSAoY2hhciAqKSAocHRzZ2UgKyAxKTsKKworCS8qCisJICogQ29uc3RydWN0IGYvdyBkb3dubG9hZCByZXF1ZXN0CisJICovCisJZGxtc2ctPkltYWdlVHlwZSA9IE1QSV9GV19ET1dOTE9BRF9JVFlQRV9GVzsKKwlkbG1zZy0+UmVzZXJ2ZWQgPSAwOworCWRsbXNnLT5DaGFpbk9mZnNldCA9IDA7CisJZGxtc2ctPkZ1bmN0aW9uID0gTVBJX0ZVTkNUSU9OX0ZXX0RPV05MT0FEOworCWRsbXNnLT5SZXNlcnZlZDFbMF0gPSBkbG1zZy0+UmVzZXJ2ZWQxWzFdID0gZGxtc2ctPlJlc2VydmVkMVsyXSA9IDA7CisJZGxtc2ctPk1zZ0ZsYWdzID0gMDsKKworCS8qIFNldCB1cCB0aGUgVHJhbnNhY3Rpb24gU0dFLgorCSAqLworCXB0c2dlLT5SZXNlcnZlZCA9IDA7CisJcHRzZ2UtPkNvbnRleHRTaXplID0gMDsKKwlwdHNnZS0+RGV0YWlsc0xlbmd0aCA9IDEyOworCXB0c2dlLT5GbGFncyA9IE1QSV9TR0VfRkxBR1NfVFJBTlNBQ1RJT05fRUxFTUVOVDsKKwlwdHNnZS0+UmVzZXJ2ZWRfMDEwMF9DaGVja3N1bSA9IDA7CisJcHRzZ2UtPkltYWdlT2Zmc2V0ID0gMDsKKwlwdHNnZS0+SW1hZ2VTaXplID0gY3B1X3RvX2xlMzIoZndsZW4pOworCisJLyogQWRkIHRoZSBTR0wKKwkgKi8KKworCS8qCisJICogTmVlZCB0byBrbWFsbG9jIGFyZWEocykgZm9yIGhvbGRpbmcgZmlybXdhcmUgaW1hZ2UgYnl0ZXMuCisJICogQnV0IHdlIG5lZWQgdG8gZG8gaXQgcGllY2UgbWVhbCwgdXNpbmcgYSBwcm9wZXIKKwkgKiBzY2F0dGVyIGdhdGhlciBsaXN0ICh3aXRoIDEyOGtCIE1BWCBodW5rcykuCisJICoKKwkgKiBBIHByYWN0aWNhbCBsaW1pdCBoZXJlIG1pZ2h0IGJlICMgb2Ygc2cgaHVua3MgdGhhdCBmaXQgaW50bworCSAqIGEgc2luZ2xlIElPQyByZXF1ZXN0IGZyYW1lOyAxMiBvciA4IChzZWUgYmVsb3cpLCBzbzoKKwkgKiBGb3IgRkM5eHg6IDEyIHggMTI4a0IgPT0gMS41IG1CIChtYXgpCisJICogRm9yIEMxMDMwOiAgOCB4IDEyOGtCID09IDEgICBtQiAobWF4KQorCSAqIFdlIGNvdWxkIHN1cHBvcnQgY2hhaW5pbmcsIGJ1dCB0aGluZ3MgZ2V0IHVnbHkoaWVyOikKKwkgKgorCSAqIFNldCB0aGUgc2dlX29mZnNldCB0byB0aGUgc3RhcnQgb2YgdGhlIHNnbCAoYnl0ZXMpLgorCSAqLworCXNnZGlyID0gMHgwNDAwMDAwMDsJCS8qIElPQyB3aWxsIFJFQUQgZnJvbSBzeXMgbWVtICovCisJc2dlX29mZnNldCA9IHNpemVvZihNUElIZWFkZXJfdCkgKyBzaXplb2YoRldEb3dubG9hZFRDU0dFX3QpOworCWlmICgoc2dsID0ga2J1Zl9hbGxvY18yX3NnbChmd2xlbiwgc2dkaXIsIHNnZV9vZmZzZXQsCisJCQkJICAgICZudW1mcmFncywgJmJ1Zmxpc3QsICZzZ2xfZG1hLCBpb2NwKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIFdlIHNob3VsZCBvbmx5IG5lZWQgU0dMIHdpdGggMiBzaW1wbGVfMzJiaXQgZW50cmllcyAodXAgdG8gMjU2IGtCKQorCSAqIGZvciBGQzl4eCBmL3cgaW1hZ2UsIGJ1dCBjYWxjdWxhdGUgbWF4IG51bWJlciBvZiBzZ2UgaHVua3MKKwkgKiB3ZSBjYW4gZml0IGludG8gYSByZXF1ZXN0IGZyYW1lLCBhbmQgbGltaXQgb3Vyc2VsdmVzIHRvIHRoYXQuCisJICogKGN1cnJlbnRseSBubyBjaGFpbiBzdXBwb3J0KQorCSAqIG1heGZyYWdzID0gKFJlcXVlc3QgU2l6ZSAtIEZXZG93bmxvYWQgU2l6ZSApIC8gU2l6ZSBvZiAzMiBiaXQgU0dFCisJICoJUmVxdWVzdAkJbWF4ZnJhZ3MKKwkgKgkxMjgJCTEyCisJICoJOTYJCTgKKwkgKgk2NAkJNAorCSAqLworCW1heGZyYWdzID0gKGlvY3AtPnJlcV9zeiAtIHNpemVvZihNUElIZWFkZXJfdCkgLSBzaXplb2YoRldEb3dubG9hZFRDU0dFX3QpKQorCQkJLyAoc2l6ZW9mKGRtYV9hZGRyX3QpICsgc2l6ZW9mKHUzMikpOworCWlmIChudW1mcmFncyA+IG1heGZyYWdzKSB7CisJCXJldCA9IC1FTUxJTks7CisJCWdvdG8gZndkbF9vdXQ7CisJfQorCisJZGN0bHByaW50aygoS0VSTl9JTkZPICJEYkc6IHNnbCBidWZmZXIgID0gJXAsIHNnZnJhZ3MgPSAlZFxuIiwgc2dsLCBudW1mcmFncykpOworCisJLyoKKwkgKiBQYXJzZSBTRyBsaXN0LCBjb3B5aW5nIHNnbCBpdHNlbGYsCisJICogcGx1cyBmL3cgaW1hZ2UgaHVua3MgZnJvbSB1c2VyIHNwYWNlIGFzIHdlIGdvLi4uCisJICovCisJcmV0ID0gLUVGQVVMVDsKKwlzZ0luID0gc2dsOworCWJsID0gYnVmbGlzdDsKKwlmb3IgKGk9MDsgaSA8IG51bWZyYWdzOyBpKyspIHsKKworCQkvKiBHZXQgdGhlIFNHRSB0eXBlOiAwIC0gVENTR0UsIDMgLSBDaGFpbiwgMSAtIFNpbXBsZSBTR0UKKwkJICogU2tpcCBldmVyeXRoaW5nIGJ1dCBTaW1wbGUuIElmIHNpbXBsZSwgY29weSBmcm9tCisJCSAqCXVzZXIgc3BhY2UgaW50byBrZXJuZWwgc3BhY2UuCisJCSAqIE5vdGU6IHdlIHNob3VsZCBub3QgaGF2ZSBhbnl0aGluZyBidXQgU2ltcGxlIGFzCisJCSAqCUNoYWluIFNHRSBhcmUgaWxsZWdhbC4KKwkJICovCisJCW5pYiA9IChzZ0luLT5GbGFnc0xlbmd0aCAmIDB4MzAwMDAwMDApID4+IDI4OworCQlpZiAobmliID09IDAgfHwgbmliID09IDMpIHsKKwkJCTsKKwkJfSBlbHNlIGlmIChzZ0luLT5BZGRyZXNzKSB7CisJCQltcHRfYWRkX3NnZShzZ091dCwgc2dJbi0+RmxhZ3NMZW5ndGgsIHNnSW4tPkFkZHJlc3MpOworCQkJbisrOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGJsLT5rcHRyLCB1ZndidWYrZndfYnl0ZXNfY29waWVkLCBibC0+bGVuKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXNAJWQ6Ol9pb2N0bF9md2RsIC0gIgorCQkJCQkJIlVuYWJsZSB0byBjb3B5IGYvdyBidWZmZXIgaHVuayMlZCBAICVwXG4iLAorCQkJCQkJX19GSUxFX18sIF9fTElORV9fLCBuLCB1ZndidWYpOworCQkJCWdvdG8gZndkbF9vdXQ7CisJCQl9CisJCQlmd19ieXRlc19jb3BpZWQgKz0gYmwtPmxlbjsKKwkJfQorCQlzZ0luKys7CisJCWJsKys7CisJCXNnT3V0ICs9IChzaXplb2YoZG1hX2FkZHJfdCkgKyBzaXplb2YodTMyKSk7CisJfQorCisjaWZkZWYgTVBUX0RFQlVHCisJeworCQl1MzIgKm0gPSAodTMyICopbWY7CisJCXByaW50ayhLRVJOX0lORk8gTVlOQU0gIjogRi9XIGRvd25sb2FkIHJlcXVlc3Q6XG4iIEtFUk5fSU5GTyAiICIpOworCQlmb3IgKGk9MDsgaSA8IDcrbnVtZnJhZ3MqMjsgaSsrKQorCQkJcHJpbnRrKCIgJTA4eCIsIGxlMzJfdG9fY3B1KG1baV0pKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKyNlbmRpZgorCisJLyoKKwkgKiBGaW5hbGx5LCBwZXJmb3JtIGZpcm13YXJlIGRvd25sb2FkLgorCSAqLworCWlvY3AtPmlvY3RsLT53YWl0X2RvbmUgPSAwOworCW1wdF9wdXRfbXNnX2ZyYW1lKG1wdGN0bF9pZCwgaW9jcCwgbWYpOworCisJLyogTm93IHdhaXQgZm9yIHRoZSBjb21tYW5kIHRvIGNvbXBsZXRlICovCisJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQobXB0Y3RsX3dhaXQsCisJICAgICBpb2NwLT5pb2N0bC0+d2FpdF9kb25lID09IDEsCisJICAgICBIWio2MCk7CisKKwlpZihyZXQgPD0wICYmIChpb2NwLT5pb2N0bC0+d2FpdF9kb25lICE9IDEgKSkgeworCS8qIE5vdyB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBib2FyZCAqLworCQltcHRjdGxfdGltZW91dF9leHBpcmVkKGlvY3AtPmlvY3RsKTsKKwkJcmV0ID0gLUVOT0RBVEE7CisJCWdvdG8gZndkbF9vdXQ7CisJfQorCisJaWYgKHNnbCkKKwkJa2ZyZWVfc2dsKHNnbCwgc2dsX2RtYSwgYnVmbGlzdCwgaW9jcCk7CisKKwlSZXBseU1zZyA9IChwRldEb3dubG9hZFJlcGx5X3QpaW9jcC0+aW9jdGwtPlJlcGx5RnJhbWU7CisJaW9jc3RhdCA9IGxlMTZfdG9fY3B1KFJlcGx5TXNnLT5JT0NTdGF0dXMpICYgTVBJX0lPQ1NUQVRVU19NQVNLOworCWlmIChpb2NzdGF0ID09IE1QSV9JT0NTVEFUVVNfU1VDQ0VTUykgeworCQlwcmludGsoS0VSTl9JTkZPIE1ZTkFNICI6IEYvVyB1cGRhdGUgc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gJXMhXG4iLCBpb2NwLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChpb2NzdGF0ID09IE1QSV9JT0NTVEFUVVNfSU5WQUxJRF9GVU5DVElPTikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIE1ZTkFNICI6ID9IbW1tLi4uICAlcyBzYXlzIGl0IGRvZXNuJ3Qgc3VwcG9ydCBGL1cgZG93bmxvYWQhPyFcbiIsCisJCQkJaW9jcC0+bmFtZSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgTVlOQU0gIjogKHRpbWUgdG8gZ28gYmFuZyBvbiBzb21lYm9kaWVzIGRvb3IpXG4iKTsKKwkJcmV0dXJuIC1FQkFEUlFDOworCX0gZWxzZSBpZiAoaW9jc3RhdCA9PSBNUElfSU9DU1RBVFVTX0JVU1kpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBNWU5BTSAiOiBXYXJuaW5nISAgJXMgc2F5czogSU9DX0JVU1khXG4iLCBpb2NwLT5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBNWU5BTSAiOiAodHJ5IGFnYWluIGxhdGVyPylcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgTVlOQU0gIjo6aW9jdGxfZndkbCgpIEVSUk9SISAgJXMgcmV0dXJuZWQgW2JhZF0gc3RhdHVzID0gJTA0eGhcbiIsCisJCQkJICAgIGlvY3AtPm5hbWUsIGlvY3N0YXQpOworCQlwcmludGsoS0VSTl9XQVJOSU5HIE1ZTkFNICI6IChiYWQgVm9vRG9vKVxuIik7CisJCXJldHVybiAtRU5PTVNHOworCX0KKwlyZXR1cm4gMDsKKworZndkbF9vdXQ6CisgICAgICAgIGtmcmVlX3NnbChzZ2wsIHNnbF9kbWEsIGJ1Zmxpc3QsIGlvY3ApOworCXJldHVybiByZXQ7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKiBTR0UgQWxsb2NhdGlvbiByb3V0aW5lCisgKgorICogSW5wdXRzOglieXRlcyAtIG51bWJlciBvZiBieXRlcyB0byBiZSB0cmFuc2ZlcnJlZAorICoJCXNnZGlyIC0gZGF0YSBkaXJlY3Rpb24KKyAqCQlzZ2Vfb2Zmc2V0IC0gb2Zmc2V0IChpbiBieXRlcykgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHJlcXVlc3QKKyAqCQkJZnJhbWUgdG8gdGhlIGZpcnN0IFNHRQorICoJCWlvYyAtIHBvaW50ZXIgdG8gdGhlIG1wdGFkYXB0ZXIKKyAqIE91dHB1dHM6CWZyYWdzIC0gbnVtYmVyIG9mIHNjYXR0ZXIgZ2F0aGVyIGVsZW1lbnRzCisgKgkJYmxwIC0gcG9pbnQgdG8gdGhlIGJ1Zmxpc3QgcG9pbnRlcgorICoJCXNnbGJ1Zl9kbWEgLSBwb2ludGVyIHRvIHRoZSAoZG1hKSBzZ2wKKyAqIFJldHVybnM6CU51bGwgaWYgZmFpbGVzCisgKgkJcG9pbnRlciB0byB0aGUgKHZpcnR1YWwpIHNnbCBpZiBzdWNjZXNzZnVsLgorICovCitzdGF0aWMgTXB0U2dlX3QgKgora2J1Zl9hbGxvY18yX3NnbChpbnQgYnl0ZXMsIHUzMiBzZ2RpciwgaW50IHNnZV9vZmZzZXQsIGludCAqZnJhZ3MsCisJCSBzdHJ1Y3QgYnVmbGlzdCAqKmJscCwgZG1hX2FkZHJfdCAqc2dsYnVmX2RtYSwgTVBUX0FEQVBURVIgKmlvYykKK3sKKwlNcHRTZ2VfdAkqc2dsYnVmID0gTlVMTDsJCS8qIHBvaW50ZXIgdG8gYXJyYXkgb2YgU0dFICovCisJCQkJCQkvKiBhbmQgY2hhaW4gYnVmZmVycyAqLworCXN0cnVjdCBidWZsaXN0CSpidWZsaXN0ID0gTlVMTDsJLyoga2VybmVsIHJvdXRpbmUgKi8KKwlNcHRTZ2VfdAkqc2dsOworCWludAkJIG51bWZyYWdzID0gMDsKKwlpbnQJCSBmcmFnY250ID0gMDsKKwlpbnQJCSBhbGxvY19zeiA9IG1pbihieXRlcyxNQVhfS01BTExPQ19TWik7CS8vIGF2b2lkIGtlcm5lbCB3YXJuaW5nIG1zZyEKKwlpbnQJCSBieXRlc19hbGxvY2QgPSAwOworCWludAkJIHRoaXNfYWxsb2M7CisJZG1hX2FkZHJfdAkgcGE7CQkJCQkvLyBwaHlzIGFkZHIKKwlpbnQJCSBpLCBidWZsaXN0X2VudDsKKwlpbnQJCSBzZ19zcGlsbCA9IE1BWF9GUkFHU19TUElMTDE7CisJaW50CQkgZGlyOworCS8qIGluaXRpYWxpemF0aW9uICovCisJKmZyYWdzID0gMDsKKwkqYmxwID0gTlVMTDsKKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFuIGFycmF5IG9mIGtlcm5lbAorCSAqIHN0cnVjdHVyZXMgZm9yIHRoZSBTRyBlbGVtZW50cy4KKwkgKi8KKwlpID0gTUFYX1NHTF9CWVRFUyAvIDg7CisJYnVmbGlzdCA9IGttYWxsb2MoaSwgR0ZQX1VTRVIpOworCWlmIChidWZsaXN0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCW1lbXNldChidWZsaXN0LCAwLCBpKTsKKwlidWZsaXN0X2VudCA9IDA7CisKKwkvKiBBbGxvY2F0ZSBhIHNpbmdsZSBibG9jayBvZiBtZW1vcnkgdG8gc3RvcmUgdGhlIHNnIGVsZW1lbnRzIGFuZAorCSAqIHRoZSBjaGFpbiBidWZmZXJzLiAgVGhlIGNhbGxpbmcgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3IKKwkgKiBjb3B5aW5nIHRoZSBkYXRhIGluIHRoaXMgYXJyYXkgaW50byB0aGUgY29ycmVjdCBwbGFjZSBpbiB0aGUKKwkgKiByZXF1ZXN0IGFuZCBjaGFpbiBidWZmZXJzLgorCSAqLworCXNnbGJ1ZiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGlvYy0+cGNpZGV2LCBNQVhfU0dMX0JZVEVTLCBzZ2xidWZfZG1hKTsKKwlpZiAoc2dsYnVmID09IE5VTEwpCisJCWdvdG8gZnJlZV9hbmRfZmFpbDsKKworCWlmIChzZ2RpciAmIDB4MDQwMDAwMDApCisJCWRpciA9IFBDSV9ETUFfVE9ERVZJQ0U7CisJZWxzZQorCQlkaXIgPSBQQ0lfRE1BX0ZST01ERVZJQ0U7CisKKwkvKiBBdCBzdGFydDoKKwkgKglzZ2wgPSBzZ2xidWYgPSBwb2ludCB0byBiZWdpbm5pbmcgb2Ygc2cgYnVmZmVyCisJICoJYnVmbGlzdF9lbnQgPSAwID0gZmlyc3Qga2VybmVsIHN0cnVjdHVyZQorCSAqCXNnX3NwaWxsID0gbnVtYmVyIG9mIFNHRSB0aGF0IGNhbiBiZSB3cml0dGVuIGJlZm9yZSB0aGUgZmlyc3QKKwkgKgkJY2hhaW4gZWxlbWVudC4KKwkgKgorCSAqLworCXNnbCA9IHNnbGJ1ZjsKKwlzZ19zcGlsbCA9ICgoaW9jLT5yZXFfc3ogLSBzZ2Vfb2Zmc2V0KS8oc2l6ZW9mKGRtYV9hZGRyX3QpICsgc2l6ZW9mKHUzMikpKSAtIDE7CisJd2hpbGUgKGJ5dGVzX2FsbG9jZCA8IGJ5dGVzKSB7CisJCXRoaXNfYWxsb2MgPSBtaW4oYWxsb2Nfc3osIGJ5dGVzLWJ5dGVzX2FsbG9jZCk7CisJCWJ1Zmxpc3RbYnVmbGlzdF9lbnRdLmxlbiA9IHRoaXNfYWxsb2M7CisJCWJ1Zmxpc3RbYnVmbGlzdF9lbnRdLmtwdHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChpb2MtPnBjaWRldiwKKwkJCQkJCQkJIHRoaXNfYWxsb2MsCisJCQkJCQkJCSAmcGEpOworCQlpZiAoYnVmbGlzdFtidWZsaXN0X2VudF0ua3B0ciA9PSBOVUxMKSB7CisJCQlhbGxvY19zeiA9IGFsbG9jX3N6IC8gMjsKKwkJCWlmIChhbGxvY19zeiA9PSAwKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyBNWU5BTSAiLVNHOiBObyBjYW4gZG8gLSAiCisJCQkJCQkgICAgIm5vdCBlbm91Z2ggbWVtb3J5ISAgIDotKFxuIik7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyBNWU5BTSAiLVNHOiAoZnJlZWluZyAlZCBmcmFncylcbiIsCisJCQkJCQkgICAgbnVtZnJhZ3MpOworCQkJCWdvdG8gZnJlZV9hbmRfZmFpbDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKworCQkJYnl0ZXNfYWxsb2NkICs9IHRoaXNfYWxsb2M7CisJCQlzZ2wtPkZsYWdzTGVuZ3RoID0gKDB4MTAwMDAwMDB8TVBUX1NHRV9GTEFHU19BRERSRVNTSU5HfHNnZGlyfHRoaXNfYWxsb2MpOworCQkJZG1hX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShpb2MtPnBjaWRldiwgYnVmbGlzdFtidWZsaXN0X2VudF0ua3B0ciwgdGhpc19hbGxvYywgZGlyKTsKKwkJCXNnbC0+QWRkcmVzcyA9IGRtYV9hZGRyOworCisJCQlmcmFnY250Kys7CisJCQludW1mcmFncysrOworCQkJc2dsKys7CisJCQlidWZsaXN0X2VudCsrOworCQl9CisKKwkJaWYgKGJ5dGVzX2FsbG9jZCA+PSBieXRlcykKKwkJCWJyZWFrOworCisJCS8qIE5lZWQgdG8gY2hhaW4/ICovCisJCWlmIChmcmFnY250ID09IHNnX3NwaWxsKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIE1ZTkFNICItU0c6IE5vIGNhbiBkbyAtICIgIkNoYWluIHJlcXVpcmVkISAgIDotKFxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIE1ZTkFNICIoZnJlZWluZyAlZCBmcmFncylcbiIsIG51bWZyYWdzKTsKKwkJCWdvdG8gZnJlZV9hbmRfZmFpbDsKKwkJfQorCisJCS8qIG92ZXJmbG93IGNoZWNrLi4uICovCisJCWlmIChudW1mcmFncyo4ID4gTUFYX1NHTF9CWVRFUyl7CisJCQkvKiBHUlJSUlIuLi4gKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgTVlOQU0gIi1TRzogTm8gY2FuIGRvIC0gIgorCQkJCQkgICAgInRvbyBtYW55IFNHIGZyYWdzISAgIDotKFxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIE1ZTkFNICItU0c6IChmcmVlaW5nICVkIGZyYWdzKVxuIiwKKwkJCQkJICAgIG51bWZyYWdzKTsKKwkJCWdvdG8gZnJlZV9hbmRfZmFpbDsKKwkJfQorCX0KKworCS8qIExhc3Qgc2dlIGZpeHVwOiBzZXQgTEUrZW9sK2VvYiBiaXRzICovCisJc2dsWy0xXS5GbGFnc0xlbmd0aCB8PSAweEMxMDAwMDAwOworCisJKmZyYWdzID0gbnVtZnJhZ3M7CisJKmJscCA9IGJ1Zmxpc3Q7CisKKwlkY3RscHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIi1TRzoga2J1Zl9hbGxvY18yX3NnbCgpIC0gIgorCQkJICAgIiVkIFNHIGZyYWdzIGdlbmVyYXRlZCFcbiIsCisJCQkgICBudW1mcmFncykpOworCisJZGN0bHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICItU0c6IGtidWZfYWxsb2NfMl9zZ2woKSAtICIKKwkJCSAgICJsYXN0IChiaWcpIGFsbG9jX3N6PSVkXG4iLAorCQkJICAgYWxsb2Nfc3opKTsKKworCXJldHVybiBzZ2xidWY7CisKK2ZyZWVfYW5kX2ZhaWw6CisJaWYgKHNnbGJ1ZiAhPSBOVUxMKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBudW1mcmFnczsgaSsrKSB7CisJCQlkbWFfYWRkcl90IGRtYV9hZGRyOworCQkJdTggKmtwdHI7CisJCQlpbnQgbGVuOworCisJCQlpZiAoKHNnbGJ1ZltpXS5GbGFnc0xlbmd0aCA+PiAyNCkgPT0gMHgzMCkKKwkJCQljb250aW51ZTsKKworCQkJZG1hX2FkZHIgPSBzZ2xidWZbaV0uQWRkcmVzczsKKwkJCWtwdHIgPSBidWZsaXN0W2ldLmtwdHI7CisJCQlsZW4gPSBidWZsaXN0W2ldLmxlbjsKKworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChpb2MtPnBjaWRldiwgbGVuLCBrcHRyLCBkbWFfYWRkcik7CisJCX0KKwkJcGNpX2ZyZWVfY29uc2lzdGVudChpb2MtPnBjaWRldiwgTUFYX1NHTF9CWVRFUywgc2dsYnVmLCAqc2dsYnVmX2RtYSk7CisJfQorCWtmcmVlKGJ1Zmxpc3QpOworCXJldHVybiBOVUxMOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICogUm91dGluZSB0byBmcmVlIHRoZSBTR0wgZWxlbWVudHMuCisgKi8KK3N0YXRpYyB2b2lkCitrZnJlZV9zZ2woTXB0U2dlX3QgKnNnbCwgZG1hX2FkZHJfdCBzZ2xfZG1hLCBzdHJ1Y3QgYnVmbGlzdCAqYnVmbGlzdCwgTVBUX0FEQVBURVIgKmlvYykKK3sKKwlNcHRTZ2VfdAkqc2cgPSBzZ2w7CisJc3RydWN0IGJ1Zmxpc3QJKmJsID0gYnVmbGlzdDsKKwl1MzIJCSBuaWI7CisJaW50CQkgZGlyOworCWludAkJIG4gPSAwOworCisJaWYgKHNnLT5GbGFnc0xlbmd0aCAmIDB4MDQwMDAwMDApCisJCWRpciA9IFBDSV9ETUFfVE9ERVZJQ0U7CisJZWxzZQorCQlkaXIgPSBQQ0lfRE1BX0ZST01ERVZJQ0U7CisKKwluaWIgPSAoc2ctPkZsYWdzTGVuZ3RoICYgMHhGMDAwMDAwMCkgPj4gMjg7CisJd2hpbGUgKCEgKG5pYiAmIDB4NCkpIHsgLyogZW9iICovCisJCS8qIHNraXAgaWdub3JlL2NoYWluLiAqLworCQlpZiAobmliID09IDAgfHwgbmliID09IDMpIHsKKwkJCTsKKwkJfSBlbHNlIGlmIChzZy0+QWRkcmVzcykgeworCQkJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwkJCXZvaWQgKmtwdHI7CisJCQlpbnQgbGVuOworCisJCQlkbWFfYWRkciA9IHNnLT5BZGRyZXNzOworCQkJa3B0ciA9IGJsLT5rcHRyOworCQkJbGVuID0gYmwtPmxlbjsKKwkJCXBjaV91bm1hcF9zaW5nbGUoaW9jLT5wY2lkZXYsIGRtYV9hZGRyLCBsZW4sIGRpcik7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGlvYy0+cGNpZGV2LCBsZW4sIGtwdHIsIGRtYV9hZGRyKTsKKwkJCW4rKzsKKwkJfQorCQlzZysrOworCQlibCsrOworCQluaWIgPSAobGUzMl90b19jcHUoc2ctPkZsYWdzTGVuZ3RoKSAmIDB4RjAwMDAwMDApID4+IDI4OworCX0KKworCS8qIHdlJ3JlIGF0IGVvYiEgKi8KKwlpZiAoc2ctPkFkZHJlc3MpIHsKKwkJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwkJdm9pZCAqa3B0cjsKKwkJaW50IGxlbjsKKworCQlkbWFfYWRkciA9IHNnLT5BZGRyZXNzOworCQlrcHRyID0gYmwtPmtwdHI7CisJCWxlbiA9IGJsLT5sZW47CisJCXBjaV91bm1hcF9zaW5nbGUoaW9jLT5wY2lkZXYsIGRtYV9hZGRyLCBsZW4sIGRpcik7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaW9jLT5wY2lkZXYsIGxlbiwga3B0ciwgZG1hX2FkZHIpOworCQluKys7CisJfQorCisJcGNpX2ZyZWVfY29uc2lzdGVudChpb2MtPnBjaWRldiwgTUFYX1NHTF9CWVRFUywgc2dsLCBzZ2xfZG1hKTsKKwlrZnJlZShidWZsaXN0KTsKKwlkY3RscHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIi1TRzogRnJlZSdkIDEgU0dMIGJ1ZiArICVkIGtidWZzIVxuIiwgbikpOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJbXB0Y3RsX2dldGlvY2luZm8gLSBRdWVyeSB0aGUgaG9zdCBhZGFwdGVyIGZvciBJT0MgaW5mb3JtYXRpb24uCisgKglAYXJnOiBVc2VyIHNwYWNlIGFyZ3VtZW50CisgKgorICogT3V0cHV0czoJTm9uZS4KKyAqIFJldHVybjoJMCBpZiBzdWNjZXNzZnVsCisgKgkJLUVGQVVMVCBpZiBkYXRhIHVuYXZhaWxhYmxlCisgKgkJLUVOT0RFViAgaWYgbm8gc3VjaCBkZXZpY2UvYWRhcHRlcgorICovCitzdGF0aWMgaW50CittcHRjdGxfZ2V0aW9jaW5mbyAodW5zaWduZWQgbG9uZyBhcmcsIHVuc2lnbmVkIGludCBkYXRhX3NpemUpCit7CisJc3RydWN0IG1wdF9pb2N0bF9pb2NpbmZvIF9fdXNlciAqdWFyZyA9ICh2b2lkIF9fdXNlciAqKSBhcmc7CisJc3RydWN0IG1wdF9pb2N0bF9pb2NpbmZvICprYXJnOworCU1QVF9BREFQVEVSCQkqaW9jOworCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0CSpzaDsKKwlNUFRfU0NTSV9IT1NUCQkqaGQ7CisJaW50CQkJaW9jbnVtOworCWludAkJCW51bURldmljZXMgPSAwOworCXVuc2lnbmVkIGludAkJbWF4X2lkOworCWludAkJCWlpOworCWludAkJCXBvcnQ7CisJaW50CQkJY2ltX3JldjsKKwl1OAkJCXJldmlzaW9uOworCisJZGN0bHByaW50aygoIjogbXB0Y3RsX2dldGlvY2luZm8gY2FsbGVkLlxuIikpOworCS8qIEFkZCBvZiBQQ0kgSU5GTyByZXN1bHRzIGluIHVuYWxpZ25lZCBhY2Nlc3MgZm9yCisJICogSUE2NCBhbmQgU3BhcmMuIFJlc2V0IGxvbmcgdG8gaW50LiBSZXR1cm4gbm8gUENJCisJICogZGF0YSBmb3Igb2Jzb2xldGUgZm9ybWF0LgorCSAqLworCWlmIChkYXRhX3NpemUgPT0gc2l6ZW9mKHN0cnVjdCBtcHRfaW9jdGxfaW9jaW5mb19yZXYwKSkKKwkJY2ltX3JldiA9IDA7CisJZWxzZSBpZiAoZGF0YV9zaXplID09IHNpemVvZihzdHJ1Y3QgbXB0X2lvY3RsX2lvY2luZm9fcmV2MSkpCisJCWNpbV9yZXYgPSAxOworCWVsc2UgaWYgKGRhdGFfc2l6ZSA9PSBzaXplb2Yoc3RydWN0IG1wdF9pb2N0bF9pb2NpbmZvKSkKKwkJY2ltX3JldiA9IDI7CisJZWxzZSBpZiAoZGF0YV9zaXplID09IChzaXplb2Yoc3RydWN0IG1wdF9pb2N0bF9pb2NpbmZvX3JldjApKzEyKSkKKwkJY2ltX3JldiA9IDA7CS8qIG9ic29sZXRlICovCisJZWxzZQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWthcmcgPSBrbWFsbG9jKGRhdGFfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGthcmcgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOjptcHRfaW9jdGxfaW9jaW5mbygpIEAlZCAtIG5vIG1lbW9yeSBhdmFpbGFibGUhXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcihrYXJnLCB1YXJnLCBkYXRhX3NpemUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXNAJWQ6Om1wdGN0bF9nZXRpb2NpbmZvIC0gIgorCQkJIlVuYWJsZSB0byByZWFkIGluIG1wdF9pb2N0bF9pb2NpbmZvIHN0cnVjdCBAICVwXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgdWFyZyk7CisJCWtmcmVlKGthcmcpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoKChpb2NudW0gPSBtcHRfdmVyaWZ5X2FkYXB0ZXIoa2FyZy0+aGRyLmlvY251bSwgJmlvYykpIDwgMCkgfHwKKwkgICAgKGlvYyA9PSBOVUxMKSkgeworCQlkY3RscHJpbnRrKChLRVJOX0VSUiAiJXM6Om1wdGN0bF9nZXRpb2NpbmZvKCkgQCVkIC0gaW9jJWQgbm90IGZvdW5kIVxuIiwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIGlvY251bSkpOworCQlrZnJlZShrYXJnKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogVmVyaWZ5IHRoZSBkYXRhIHRyYW5zZmVyIHNpemUgaXMgY29ycmVjdC4KKwkgKiBJZ25vcmUgdGhlIHBvcnQgc2V0dGluZy4KKwkgKi8KKwlpZiAoa2FyZy0+aGRyLm1heERhdGFTaXplICE9IGRhdGFfc2l6ZSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzQCVkOjptcHRjdGxfZ2V0aW9jaW5mbyAtICIKKwkJCSJTdHJ1Y3R1cmUgc2l6ZSBtaXNtYXRjaC4gQ29tbWFuZCBub3QgY29tcGxldGVkLlxuIiwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18pOworCQlrZnJlZShrYXJnKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogRmlsbCBpbiB0aGUgZGF0YSBhbmQgcmV0dXJuIHRoZSBzdHJ1Y3R1cmUgdG8gdGhlIGNhbGxpbmcKKwkgKiBwcm9ncmFtCisJICovCisJaWYgKGlvYy0+YnVzX3R5cGUgPT0gRkMpCisJCWthcmctPmFkYXB0ZXJUeXBlID0gTVBUX0lPQ1RMX0lOVEVSRkFDRV9GQzsKKwllbHNlCisJCWthcmctPmFkYXB0ZXJUeXBlID0gTVBUX0lPQ1RMX0lOVEVSRkFDRV9TQ1NJOworCisJcG9ydCA9IGthcmctPmhkci5wb3J0OworCisJa2FyZy0+cG9ydCA9IHBvcnQ7CisJcGRldiA9IChzdHJ1Y3QgcGNpX2RldiAqKSBpb2MtPnBjaWRldjsKKworCWthcmctPnBjaUlkID0gcGRldi0+ZGV2aWNlOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJnJldmlzaW9uKTsKKwlrYXJnLT5od1JldiA9IHJldmlzaW9uOworCWthcmctPnN1YlN5c3RlbURldmljZSA9IHBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisJa2FyZy0+c3ViU3lzdGVtVmVuZG9yID0gcGRldi0+c3Vic3lzdGVtX3ZlbmRvcjsKKworCWlmIChjaW1fcmV2ID09IDEpIHsKKwkJLyogR2V0IHRoZSBQQ0kgYnVzLCBkZXZpY2UsIGFuZCBmdW5jdGlvbiBudW1iZXJzIGZvciB0aGUgSU9DCisJCSAqLworCQlrYXJnLT5wY2lJbmZvLnUuYml0cy5idXNOdW1iZXIgPSBwZGV2LT5idXMtPm51bWJlcjsKKwkJa2FyZy0+cGNpSW5mby51LmJpdHMuZGV2aWNlTnVtYmVyID0gUENJX1NMT1QoIHBkZXYtPmRldmZuICk7CisJCWthcmctPnBjaUluZm8udS5iaXRzLmZ1bmN0aW9uTnVtYmVyID0gUENJX0ZVTkMoIHBkZXYtPmRldmZuICk7CisJfSBlbHNlIGlmIChjaW1fcmV2ID09IDIpIHsKKwkJLyogR2V0IHRoZSBQQ0kgYnVzLCBkZXZpY2UsIGZ1bmN0aW9uIGFuZCBzZWdtZW50IElEIG51bWJlcnMgCisJCSAgIGZvciB0aGUgSU9DICovCisJCWthcmctPnBjaUluZm8udS5iaXRzLmJ1c051bWJlciA9IHBkZXYtPmJ1cy0+bnVtYmVyOworCQlrYXJnLT5wY2lJbmZvLnUuYml0cy5kZXZpY2VOdW1iZXIgPSBQQ0lfU0xPVCggcGRldi0+ZGV2Zm4gKTsKKwkJa2FyZy0+cGNpSW5mby51LmJpdHMuZnVuY3Rpb25OdW1iZXIgPSBQQ0lfRlVOQyggcGRldi0+ZGV2Zm4gKTsKKwkJa2FyZy0+cGNpSW5mby51LmJpdHMuZnVuY3Rpb25OdW1iZXIgPSBQQ0lfRlVOQyggcGRldi0+ZGV2Zm4gKTsKKwkJa2FyZy0+cGNpSW5mby5zZWdtZW50SUQgPSBwY2lfZG9tYWluX25yKHBkZXYtPmJ1cyk7CisJfQorCisJLyogR2V0IG51bWJlciBvZiBkZXZpY2VzCisgICAgICAgICAqLworCWlmICgoc2ggPSBpb2MtPnNoKSAhPSBOVUxMKSB7CisJCSAvKiBzaC0+bWF4X2lkID0gbWF4aW11bSB0YXJnZXQgSUQgKyAxCisJCSAqLworCQltYXhfaWQgPSBzaC0+bWF4X2lkIC0gMTsKKwkJaGQgPSAoTVBUX1NDU0lfSE9TVCAqKSBzaC0+aG9zdGRhdGE7CisKKwkJLyogQ2hlY2sgYWxsIG9mIHRoZSB0YXJnZXQgc3RydWN0dXJlcyBhbmQKKwkJICoga2VlcCBhIGNvdW50ZXIuCisJCSAqLworCQlpZiAoaGQgJiYgaGQtPlRhcmdldHMpIHsKKwkJCWZvciAoaWkgPSAwOyBpaSA8PSBtYXhfaWQ7IGlpKyspIHsKKwkJCQlpZiAoaGQtPlRhcmdldHNbaWldKQorCQkJCQludW1EZXZpY2VzKys7CisJCQl9CisJCX0KKwl9CisJa2FyZy0+bnVtRGV2aWNlcyA9IG51bURldmljZXM7CisKKwkvKiBTZXQgdGhlIEJJT1MgYW5kIEZXIFZlcnNpb24KKwkgKi8KKwlrYXJnLT5GV1ZlcnNpb24gPSBpb2MtPmZhY3RzLkZXVmVyc2lvbi5Xb3JkOworCWthcmctPkJJT1NWZXJzaW9uID0gaW9jLT5iaW9zVmVyc2lvbjsKKworCS8qIFNldCB0aGUgVmVyc2lvbiBTdHJpbmdzLgorCSAqLworCXN0cm5jcHkgKGthcmctPmRyaXZlclZlcnNpb24sIE1QVF9MSU5VWF9QQUNLQUdFX05BTUUsIE1QVF9JT0NUTF9WRVJTSU9OX0xFTkdUSCk7CisJa2FyZy0+ZHJpdmVyVmVyc2lvbltNUFRfSU9DVExfVkVSU0lPTl9MRU5HVEgtMV09J1wwJzsKKworCWthcmctPmJ1c0NoYW5nZUV2ZW50ID0gMDsKKwlrYXJnLT5ob3N0SWQgPSBpb2MtPnBmYWN0c1twb3J0XS5Qb3J0U0NTSUlEOworCWthcmctPnJzdmRbMF0gPSBrYXJnLT5yc3ZkWzFdID0gMDsKKworCS8qIENvcHkgdGhlIGRhdGEgZnJvbSBrZXJuZWwgbWVtb3J5IHRvIHVzZXIgbWVtb3J5CisJICovCisJaWYgKGNvcHlfdG9fdXNlcigoY2hhciBfX3VzZXIgKilhcmcsIGthcmcsIGRhdGFfc2l6ZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlc0AlZDo6bXB0Y3RsX2dldGlvY2luZm8gLSAiCisJCQkiVW5hYmxlIHRvIHdyaXRlIG91dCBtcHRfaW9jdGxfaW9jaW5mbyBzdHJ1Y3QgQCAlcFxuIiwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIHVhcmcpOworCQlrZnJlZShrYXJnKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJa2ZyZWUoa2FyZyk7CisJcmV0dXJuIDA7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKgltcHRjdGxfZ2V0dGFyZ2V0aW5mbyAtIFF1ZXJ5IHRoZSBob3N0IGFkYXB0ZXIgZm9yIHRhcmdldCBpbmZvcm1hdGlvbi4KKyAqCUBhcmc6IFVzZXIgc3BhY2UgYXJndW1lbnQKKyAqCisgKiBPdXRwdXRzOglOb25lLgorICogUmV0dXJuOgkwIGlmIHN1Y2Nlc3NmdWwKKyAqCQktRUZBVUxUIGlmIGRhdGEgdW5hdmFpbGFibGUKKyAqCQktRU5PREVWICBpZiBubyBzdWNoIGRldmljZS9hZGFwdGVyCisgKi8KK3N0YXRpYyBpbnQKK21wdGN0bF9nZXR0YXJnZXRpbmZvICh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbXB0X2lvY3RsX3RhcmdldGluZm8gX191c2VyICp1YXJnID0gKHZvaWQgX191c2VyICopIGFyZzsKKwlzdHJ1Y3QgbXB0X2lvY3RsX3RhcmdldGluZm8ga2FyZzsKKwlNUFRfQURBUFRFUgkJKmlvYzsKKwlzdHJ1Y3QgU2NzaV9Ib3N0CSpzaDsKKwlNUFRfU0NTSV9IT1NUCQkqaGQ7CisJVmlydERldmljZQkJKnZkZXY7CisJY2hhcgkJCSpwbWVtOworCWludAkJCSpwZGF0YTsKKwlJT0NQYWdlMl90CQkqcElvYzI7CisJSU9DUGFnZTNfdAkJKnBJb2MzOworCWludAkJCWlvY251bTsKKwlpbnQJCQludW1EZXZpY2VzID0gMDsKKwl1bnNpZ25lZCBpbnQJCW1heF9pZDsKKwlpbnQJCQlpZCwgamosIGluZGV4ZWRfbHVuLCBsdW5faW5kZXg7CisJdTMyCQkJbHVuOworCWludAkJCW1heFdvcmRzTGVmdDsKKwlpbnQJCQludW1CeXRlczsKKwl1OAkJCXBvcnQsIGRldlR5cGUsIGJ1c19pZDsKKworCWRjdGxwcmludGsoKCJtcHRjdGxfZ2V0dGFyZ2V0aW5mbyBjYWxsZWQuXG4iKSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZrYXJnLCB1YXJnLCBzaXplb2Yoc3RydWN0IG1wdF9pb2N0bF90YXJnZXRpbmZvKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlc0AlZDo6bXB0Y3RsX2dldHRhcmdldGluZm8gLSAiCisJCQkiVW5hYmxlIHRvIHJlYWQgaW4gbXB0X2lvY3RsX3RhcmdldGluZm8gc3RydWN0IEAgJXBcbiIsCisJCQkJX19GSUxFX18sIF9fTElORV9fLCB1YXJnKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKCgoaW9jbnVtID0gbXB0X3ZlcmlmeV9hZGFwdGVyKGthcmcuaGRyLmlvY251bSwgJmlvYykpIDwgMCkgfHwKKwkgICAgKGlvYyA9PSBOVUxMKSkgeworCQlkY3RscHJpbnRrKChLRVJOX0VSUiAiJXM6Om1wdGN0bF9nZXR0YXJnZXRpbmZvKCkgQCVkIC0gaW9jJWQgbm90IGZvdW5kIVxuIiwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIGlvY251bSkpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBHZXQgdGhlIHBvcnQgbnVtYmVyIGFuZCBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzCisJICogaW4gdGhlIHJldHVybmVkIHN0cnVjdHVyZS4KKwkgKiBJZ25vcmUgdGhlIHBvcnQgc2V0dGluZy4KKwkgKi8KKwludW1CeXRlcyA9IGthcmcuaGRyLm1heERhdGFTaXplIC0gc2l6ZW9mKG1wdF9pb2N0bF9oZWFkZXIpOworCW1heFdvcmRzTGVmdCA9IG51bUJ5dGVzL3NpemVvZihpbnQpOworCXBvcnQgPSBrYXJnLmhkci5wb3J0OworCisJaWYgKG1heFdvcmRzTGVmdCA8PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6Om1wdGN0bF9nZXR0YXJnZXRpbmZvKCkgQCVkIC0gbm8gbWVtb3J5IGF2YWlsYWJsZSFcbiIsCisJCQkJX19GSUxFX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogRmlsbCBpbiB0aGUgZGF0YSBhbmQgcmV0dXJuIHRoZSBzdHJ1Y3R1cmUgdG8gdGhlIGNhbGxpbmcKKwkgKiBwcm9ncmFtCisJICovCisKKwkvKiBzdHJ1Y3QgbXB0X2lvY3RsX3RhcmdldGluZm8gZG9lcyBub3QgY29udGFpbiBzdWZmaWNpZW50IHNwYWNlCisJICogZm9yIHRoZSB0YXJnZXQgc3RydWN0dXJlcyBzbyB3aGVuIHRoZSBJT0NUTCBpcyBjYWxsZWQsIHRoZXJlIGlzCisJICogbm90IHN1ZmZpY2llbnQgc3RhY2sgc3BhY2UgZm9yIHRoZSBzdHJ1Y3R1cmUuIEFsbG9jYXRlIG1lbW9yeSwKKwkgKiBwb3B1bGF0ZSB0aGUgbWVtb3J5LCBjb3B5IGJhY2sgdG8gdGhlIHVzZXIsIHRoZW4gZnJlZSBtZW1vcnkuCisJICogdGFyZ2V0SW5mbyBmb3JtYXQ6CisJICogYml0cyAzMS0yNDogcmVzZXJ2ZWQKKwkgKiAgICAgIDIzLTE2OiBMVU4KKwkgKiAgICAgIDE1LSA4OiBCdXMgTnVtYmVyCisJICogICAgICAgNy0gMDogVGFyZ2V0IElECisJICovCisJcG1lbSA9IGttYWxsb2MobnVtQnl0ZXMsIEdGUF9LRVJORUwpOworCWlmIChwbWVtID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczo6bXB0Y3RsX2dldHRhcmdldGluZm8oKSBAJWQgLSBubyBtZW1vcnkgYXZhaWxhYmxlIVxuIiwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHBtZW0sIDAsIG51bUJ5dGVzKTsKKwlwZGF0YSA9ICAoaW50ICopIHBtZW07CisKKwkvKiBHZXQgbnVtYmVyIG9mIGRldmljZXMKKyAgICAgICAgICovCisJaWYgKChzaCA9IGlvYy0+c2gpICE9IE5VTEwpIHsKKworCQltYXhfaWQgPSBzaC0+bWF4X2lkIC0gMTsKKwkJaGQgPSAoTVBUX1NDU0lfSE9TVCAqKSBzaC0+aG9zdGRhdGE7CisKKwkJLyogQ2hlY2sgYWxsIG9mIHRoZSB0YXJnZXQgc3RydWN0dXJlcy4KKwkJICogU2F2ZSB0aGUgSWQgYW5kIGluY3JlbWVudCB0aGUgY291bnRlciwKKwkJICogaWYgcHRyIG5vbi1udWxsLgorCQkgKiBzaC0+bWF4X2lkID0gbWF4aW11bSB0YXJnZXQgSUQgKyAxCisJCSAqLworCQlpZiAoaGQgJiYgaGQtPlRhcmdldHMpIHsKKwkJCW1wdF9maW5kSW1Wb2x1bWVzKGlvYyk7CisJCQlwSW9jMiA9IGlvYy0+c3BpX2RhdGEucElvY1BnMjsKKwkJCWZvciAoIGlkID0gMDsgaWQgPD0gbWF4X2lkOyApIHsKKwkJCQlpZiAoIHBJb2MyICYmIHBJb2MyLT5OdW1BY3RpdmVWb2x1bWVzICkgeworCQkJCQlpZiAoIGlkID09IHBJb2MyLT5SYWlkVm9sdW1lWzBdLlZvbHVtZUlEICkgeworCQkJCQkJaWYgKG1heFdvcmRzTGVmdCA8PSAwKSB7CisJCQkJCQkJcHJpbnRrKEtFUk5fRVJSICJtcHRjdGxfZ2V0dGFyZ2V0aW5mbyAtICIKKwkJCSJidWZmZXIgaXMgZnVsbCBidXQgdm9sdW1lIGlzIGF2YWlsYWJsZSBvbiBpb2MgJWRcbiwgbnVtRGV2aWNlcz0lZCIsIGlvY251bSwgbnVtRGV2aWNlcyk7CisJCQkJCQkJZ290byBkYXRhX3NwYWNlX2Z1bGw7CisJCQkJCQl9CisJCQkJCQlpZiAoICggcElvYzItPlJhaWRWb2x1bWVbMF0uRmxhZ3MgJiBNUElfSU9DUEFHRTJfRkxBR19WT0xVTUVfSU5BQ1RJVkUgKSA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlkZXZUeXBlID0gMHg4MDsKKyAgICAgICAgICAgICAgICAgICAgCQkJCWVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlkZXZUeXBlID0gMHhDMDsKKwkJCQkJCWJ1c19pZCA9IHBJb2MyLT5SYWlkVm9sdW1lWzBdLlZvbHVtZUJ1czsKKwkgICAgICAgICAgICAJCQkJbnVtRGV2aWNlcysrOworICAgICAgICAgICAgICAgICAgICAJCQkJKnBkYXRhID0gKCAoZGV2VHlwZSA8PCAyNCkgfCAoYnVzX2lkIDw8IDgpIHwgaWQgKTsKKwkJCQkJCWRjdGxwcmludGsoKEtFUk5fRVJSICJtcHRjdGxfZ2V0dGFyZ2V0aW5mbyAtICIKKwkJInZvbHVtZSBpb2M9JWQgdGFyZ2V0PSV4IG51bURldmljZXM9JWQgcGRhdGE9JXBcbiIsIGlvY251bSwgKnBkYXRhLCBudW1EZXZpY2VzLCBwZGF0YSkpOworICAgICAgICAgICAgICAgICAgICAJCQkJcGRhdGErKzsKKwkJCQkJCS0tbWF4V29yZHNMZWZ0OworCQkJCQkJZ290byBuZXh0X2lkOworCQkJCQl9IGVsc2UgeworCQkJCQkJcElvYzMgPSBpb2MtPnNwaV9kYXRhLnBJb2NQZzM7CisgICAgICAgICAgICAJCQkJCWZvciAoIGpqID0gMDsgamogPCBwSW9jMy0+TnVtUGh5c0Rpc2tzOyBqaisrICkgeworICAgICAgICAgICAgICAgICAgICAJCQkJCWlmICggcElvYzMtPlBoeXNEaXNrW2pqXS5QaHlzRGlza0lEID09IGlkICkKKwkJCQkJCQkJZ290byBuZXh0X2lkOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmICggKHZkZXYgPSBoZC0+VGFyZ2V0c1tpZF0pICkgeworCQkJCQlmb3IgKGpqID0gMDsgamogPD0gTVBUX0xBU1RfTFVOOyBqaisrKSB7CisJCQkJCQlsdW5faW5kZXggPSAoamogPj4gNSk7CisJCQkJCQlpbmRleGVkX2x1biA9IChqaiAlIDMyKTsKKwkJCQkJCWx1biA9ICgxIDw8IGluZGV4ZWRfbHVuKTsKKwkJCQkJCWlmICh2ZGV2LT5sdW5zW2x1bl9pbmRleF0gJiBsdW4pIHsKKwkJCQkJCQlpZiAobWF4V29yZHNMZWZ0IDw9IDApIHsKKwkJCQkJCQkJcHJpbnRrKEtFUk5fRVJSICJtcHRjdGxfZ2V0dGFyZ2V0aW5mbyAtICIKKwkJCSJidWZmZXIgaXMgZnVsbCBidXQgbW9yZSB0YXJnZXRzIGFyZSBhdmFpbGFibGUgb24gaW9jICVkIG51bURldmljZXM9JWRcbiIsIGlvY251bSwgbnVtRGV2aWNlcyk7CisJCQkJCQkJCWdvdG8gZGF0YV9zcGFjZV9mdWxsOworCQkJCQkJCX0KKwkJCQkJCQlidXNfaWQgPSB2ZGV2LT5idXNfaWQ7CisJCQkJCQkJbnVtRGV2aWNlcysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkqcGRhdGEgPSAoIChqaiA8PCAxNikgfCAoYnVzX2lkIDw8IDgpIHwgaWQgKTsKKwkJCQkJCQlkY3RscHJpbnRrKChLRVJOX0VSUiAibXB0Y3RsX2dldHRhcmdldGluZm8gLSAiCisJCSJ0YXJnZXQgaW9jPSVkIHRhcmdldD0leCBudW1EZXZpY2VzPSVkIHBkYXRhPSVwXG4iLCBpb2NudW0sICpwZGF0YSwgbnVtRGV2aWNlcywgcGRhdGEpKTsKKwkJCQkJCQlwZGF0YSsrOworCQkJCQkJCS0tbWF4V29yZHNMZWZ0OworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorbmV4dF9pZDoKKwkJCQlpZCsrOworCQkJfQorCQl9CisJfQorZGF0YV9zcGFjZV9mdWxsOgorCWthcmcubnVtRGV2aWNlcyA9IG51bURldmljZXM7CisKKwkvKiBDb3B5IHBhcnQgb2YgdGhlIGRhdGEgZnJvbSBrZXJuZWwgbWVtb3J5IHRvIHVzZXIgbWVtb3J5CisJICovCisJaWYgKGNvcHlfdG9fdXNlcigoY2hhciBfX3VzZXIgKilhcmcsICZrYXJnLAorCQkJCXNpemVvZihzdHJ1Y3QgbXB0X2lvY3RsX3RhcmdldGluZm8pKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzQCVkOjptcHRjdGxfZ2V0dGFyZ2V0aW5mbyAtICIKKwkJCSJVbmFibGUgdG8gd3JpdGUgb3V0IG1wdF9pb2N0bF90YXJnZXRpbmZvIHN0cnVjdCBAICVwXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgdWFyZyk7CisJCWtmcmVlKHBtZW0pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKiBDb3B5IHRoZSByZW1haW5pbmcgZGF0YSBmcm9tIGtlcm5lbCBtZW1vcnkgdG8gdXNlciBtZW1vcnkKKwkgKi8KKwlpZiAoY29weV90b191c2VyKHVhcmctPnRhcmdldEluZm8sIHBtZW0sIG51bUJ5dGVzKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzQCVkOjptcHRjdGxfZ2V0dGFyZ2V0aW5mbyAtICIKKwkJCSJVbmFibGUgdG8gd3JpdGUgb3V0IG1wdF9pb2N0bF90YXJnZXRpbmZvIHN0cnVjdCBAICVwXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgcGRhdGEpOworCQlrZnJlZShwbWVtKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJa2ZyZWUocG1lbSk7CisKKwlyZXR1cm4gMDsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyogTVBUIElPQ1RMIFRlc3QgZnVuY3Rpb24uCisgKgorICogT3V0cHV0czoJTm9uZS4KKyAqIFJldHVybjoJMCBpZiBzdWNjZXNzZnVsCisgKgkJLUVGQVVMVCBpZiBkYXRhIHVuYXZhaWxhYmxlCisgKgkJLUVOT0RFViAgaWYgbm8gc3VjaCBkZXZpY2UvYWRhcHRlcgorICovCitzdGF0aWMgaW50CittcHRjdGxfcmVhZHRlc3QgKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBtcHRfaW9jdGxfdGVzdCBfX3VzZXIgKnVhcmcgPSAodm9pZCBfX3VzZXIgKikgYXJnOworCXN0cnVjdCBtcHRfaW9jdGxfdGVzdAkga2FyZzsKKwlNUFRfQURBUFRFUiAqaW9jOworCWludCBpb2NudW07CisKKwlkY3RscHJpbnRrKCgibXB0Y3RsX3JlYWR0ZXN0IGNhbGxlZC5cbiIpKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmthcmcsIHVhcmcsIHNpemVvZihzdHJ1Y3QgbXB0X2lvY3RsX3Rlc3QpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzQCVkOjptcHRjdGxfcmVhZHRlc3QgLSAiCisJCQkiVW5hYmxlIHRvIHJlYWQgaW4gbXB0X2lvY3RsX3Rlc3Qgc3RydWN0IEAgJXBcbiIsCisJCQkJX19GSUxFX18sIF9fTElORV9fLCB1YXJnKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKCgoaW9jbnVtID0gbXB0X3ZlcmlmeV9hZGFwdGVyKGthcmcuaGRyLmlvY251bSwgJmlvYykpIDwgMCkgfHwKKwkgICAgKGlvYyA9PSBOVUxMKSkgeworCQlkY3RscHJpbnRrKChLRVJOX0VSUiAiJXM6Om1wdGN0bF9yZWFkdGVzdCgpIEAlZCAtIGlvYyVkIG5vdCBmb3VuZCFcbiIsCisJCQkJX19GSUxFX18sIF9fTElORV9fLCBpb2NudW0pKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogRmlsbCBpbiB0aGUgZGF0YSBhbmQgcmV0dXJuIHRoZSBzdHJ1Y3R1cmUgdG8gdGhlIGNhbGxpbmcKKwkgKiBwcm9ncmFtCisJICovCisKKyNpZmRlZiBNRkNOVAorCWthcmcuY2hpcF90eXBlID0gaW9jLT5tZmNudDsKKyNlbHNlCisJa2FyZy5jaGlwX3R5cGUgPSBpb2MtPnBjaWRldi0+ZGV2aWNlOworI2VuZGlmCisJc3RybmNweSAoa2FyZy5uYW1lLCBpb2MtPm5hbWUsIE1QVF9NQVhfTkFNRSk7CisJa2FyZy5uYW1lW01QVF9NQVhfTkFNRS0xXT0nXDAnOworCXN0cm5jcHkgKGthcmcucHJvZHVjdCwgaW9jLT5wcm9kX25hbWUsIE1QVF9QUk9EVUNUX0xFTkdUSCk7CisJa2FyZy5wcm9kdWN0W01QVF9QUk9EVUNUX0xFTkdUSC0xXT0nXDAnOworCisJLyogQ29weSB0aGUgZGF0YSBmcm9tIGtlcm5lbCBtZW1vcnkgdG8gdXNlciBtZW1vcnkKKwkgKi8KKwlpZiAoY29weV90b191c2VyKChjaGFyIF9fdXNlciAqKWFyZywgJmthcmcsIHNpemVvZihzdHJ1Y3QgbXB0X2lvY3RsX3Rlc3QpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzQCVkOjptcHRjdGxfcmVhZHRlc3QgLSAiCisJCQkiVW5hYmxlIHRvIHdyaXRlIG91dCBtcHRfaW9jdGxfdGVzdCBzdHJ1Y3QgQCAlcFxuIiwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIHVhcmcpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCW1wdGN0bF9ldmVudHF1ZXJ5IC0gUXVlcnkgdGhlIGhvc3QgYWRhcHRlciBmb3IgdGhlIGV2ZW50IHR5cGVzCisgKgl0aGF0IGFyZSBiZWluZyBsb2dnZWQuCisgKglAYXJnOiBVc2VyIHNwYWNlIGFyZ3VtZW50CisgKgorICogT3V0cHV0czoJTm9uZS4KKyAqIFJldHVybjoJMCBpZiBzdWNjZXNzZnVsCisgKgkJLUVGQVVMVCBpZiBkYXRhIHVuYXZhaWxhYmxlCisgKgkJLUVOT0RFViAgaWYgbm8gc3VjaCBkZXZpY2UvYWRhcHRlcgorICovCitzdGF0aWMgaW50CittcHRjdGxfZXZlbnRxdWVyeSAodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG1wdF9pb2N0bF9ldmVudHF1ZXJ5IF9fdXNlciAqdWFyZyA9ICh2b2lkIF9fdXNlciAqKSBhcmc7CisJc3RydWN0IG1wdF9pb2N0bF9ldmVudHF1ZXJ5CSBrYXJnOworCU1QVF9BREFQVEVSICppb2M7CisJaW50IGlvY251bTsKKworCWRjdGxwcmludGsoKCJtcHRjdGxfZXZlbnRxdWVyeSBjYWxsZWQuXG4iKSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZrYXJnLCB1YXJnLCBzaXplb2Yoc3RydWN0IG1wdF9pb2N0bF9ldmVudHF1ZXJ5KSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlc0AlZDo6bXB0Y3RsX2V2ZW50cXVlcnkgLSAiCisJCQkiVW5hYmxlIHRvIHJlYWQgaW4gbXB0X2lvY3RsX2V2ZW50cXVlcnkgc3RydWN0IEAgJXBcbiIsCisJCQkJX19GSUxFX18sIF9fTElORV9fLCB1YXJnKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKCgoaW9jbnVtID0gbXB0X3ZlcmlmeV9hZGFwdGVyKGthcmcuaGRyLmlvY251bSwgJmlvYykpIDwgMCkgfHwKKwkgICAgKGlvYyA9PSBOVUxMKSkgeworCQlkY3RscHJpbnRrKChLRVJOX0VSUiAiJXM6Om1wdGN0bF9ldmVudHF1ZXJ5KCkgQCVkIC0gaW9jJWQgbm90IGZvdW5kIVxuIiwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIGlvY251bSkpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlrYXJnLmV2ZW50RW50cmllcyA9IGlvYy0+ZXZlbnRMb2dTaXplOworCWthcmcuZXZlbnRUeXBlcyA9IGlvYy0+ZXZlbnRUeXBlczsKKworCS8qIENvcHkgdGhlIGRhdGEgZnJvbSBrZXJuZWwgbWVtb3J5IHRvIHVzZXIgbWVtb3J5CisJICovCisJaWYgKGNvcHlfdG9fdXNlcigoY2hhciBfX3VzZXIgKilhcmcsICZrYXJnLCBzaXplb2Yoc3RydWN0IG1wdF9pb2N0bF9ldmVudHF1ZXJ5KSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlc0AlZDo6bXB0Y3RsX2V2ZW50cXVlcnkgLSAiCisJCQkiVW5hYmxlIHRvIHdyaXRlIG91dCBtcHRfaW9jdGxfZXZlbnRxdWVyeSBzdHJ1Y3QgQCAlcFxuIiwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIHVhcmcpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KK3N0YXRpYyBpbnQKK21wdGN0bF9ldmVudGVuYWJsZSAodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG1wdF9pb2N0bF9ldmVudGVuYWJsZSBfX3VzZXIgKnVhcmcgPSAodm9pZCBfX3VzZXIgKikgYXJnOworCXN0cnVjdCBtcHRfaW9jdGxfZXZlbnRlbmFibGUJIGthcmc7CisJTVBUX0FEQVBURVIgKmlvYzsKKwlpbnQgaW9jbnVtOworCisJZGN0bHByaW50aygoIm1wdGN0bF9ldmVudGVuYWJsZSBjYWxsZWQuXG4iKSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZrYXJnLCB1YXJnLCBzaXplb2Yoc3RydWN0IG1wdF9pb2N0bF9ldmVudGVuYWJsZSkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXNAJWQ6Om1wdGN0bF9ldmVudGVuYWJsZSAtICIKKwkJCSJVbmFibGUgdG8gcmVhZCBpbiBtcHRfaW9jdGxfZXZlbnRlbmFibGUgc3RydWN0IEAgJXBcbiIsCisJCQkJX19GSUxFX18sIF9fTElORV9fLCB1YXJnKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKCgoaW9jbnVtID0gbXB0X3ZlcmlmeV9hZGFwdGVyKGthcmcuaGRyLmlvY251bSwgJmlvYykpIDwgMCkgfHwKKwkgICAgKGlvYyA9PSBOVUxMKSkgeworCQlkY3RscHJpbnRrKChLRVJOX0VSUiAiJXM6Om1wdGN0bF9ldmVudGVuYWJsZSgpIEAlZCAtIGlvYyVkIG5vdCBmb3VuZCFcbiIsCisJCQkJX19GSUxFX18sIF9fTElORV9fLCBpb2NudW0pKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGlvYy0+ZXZlbnRzID09IE5VTEwpIHsKKwkJLyogSGF2ZSBub3QgeWV0IGFsbG9jYXRlZCBtZW1vcnkgLSBkbyBzbyBub3cuCisJCSAqLworCQlpbnQgc3ogPSBNUFRDVExfRVZFTlRfTE9HX1NJWkUgKiBzaXplb2YoTVBUX0lPQ1RMX0VWRU5UUyk7CisJCWlvYy0+ZXZlbnRzID0ga21hbGxvYyhzeiwgR0ZQX0tFUk5FTCk7CisJCWlmIChpb2MtPmV2ZW50cyA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgTVlOQU0gIjogRVJST1IgLSBJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFkZCBhZGFwdGVyIVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQltZW1zZXQoaW9jLT5ldmVudHMsIDAsIHN6KTsKKwkJaW9jLT5hbGxvY190b3RhbCArPSBzejsKKworCQlpb2MtPmV2ZW50TG9nU2l6ZSA9IE1QVENUTF9FVkVOVF9MT0dfU0laRTsKKwkJaW9jLT5ldmVudENvbnRleHQgPSAwOworICAgICAgICB9CisKKwkvKiBVcGRhdGUgdGhlIElPQyBldmVudCBsb2dnaW5nIGZsYWcuCisJICovCisJaW9jLT5ldmVudFR5cGVzID0ga2FyZy5ldmVudFR5cGVzOworCisJcmV0dXJuIDA7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KK3N0YXRpYyBpbnQKK21wdGN0bF9ldmVudHJlcG9ydCAodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG1wdF9pb2N0bF9ldmVudHJlcG9ydCBfX3VzZXIgKnVhcmcgPSAodm9pZCBfX3VzZXIgKikgYXJnOworCXN0cnVjdCBtcHRfaW9jdGxfZXZlbnRyZXBvcnQJIGthcmc7CisJTVBUX0FEQVBURVIJCSAqaW9jOworCWludAkJCSBpb2NudW07CisJaW50CQkJIG51bUJ5dGVzLCBtYXhFdmVudHMsIG1heDsKKworCWRjdGxwcmludGsoKCJtcHRjdGxfZXZlbnRyZXBvcnQgY2FsbGVkLlxuIikpOworCWlmIChjb3B5X2Zyb21fdXNlcigma2FyZywgdWFyZywgc2l6ZW9mKHN0cnVjdCBtcHRfaW9jdGxfZXZlbnRyZXBvcnQpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzQCVkOjptcHRjdGxfZXZlbnRyZXBvcnQgLSAiCisJCQkiVW5hYmxlIHRvIHJlYWQgaW4gbXB0X2lvY3RsX2V2ZW50cmVwb3J0IHN0cnVjdCBAICVwXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgdWFyZyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmICgoKGlvY251bSA9IG1wdF92ZXJpZnlfYWRhcHRlcihrYXJnLmhkci5pb2NudW0sICZpb2MpKSA8IDApIHx8CisJICAgIChpb2MgPT0gTlVMTCkpIHsKKwkJZGN0bHByaW50aygoS0VSTl9FUlIgIiVzOjptcHRjdGxfZXZlbnRyZXBvcnQoKSBAJWQgLSBpb2MlZCBub3QgZm91bmQhXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgaW9jbnVtKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW51bUJ5dGVzID0ga2FyZy5oZHIubWF4RGF0YVNpemUgLSBzaXplb2YobXB0X2lvY3RsX2hlYWRlcik7CisJbWF4RXZlbnRzID0gbnVtQnl0ZXMvc2l6ZW9mKE1QVF9JT0NUTF9FVkVOVFMpOworCisKKwltYXggPSBpb2MtPmV2ZW50TG9nU2l6ZSA8IG1heEV2ZW50cyA/IGlvYy0+ZXZlbnRMb2dTaXplIDogbWF4RXZlbnRzOworCisJLyogSWYgZmV3ZXIgdGhhbiAxIGV2ZW50IGlzIHJlcXVlc3RlZCwgdGhlcmUgbXVzdCBoYXZlCisJICogYmVlbiBzb21lIHR5cGUgb2YgZXJyb3IuCisJICovCisJaWYgKChtYXggPCAxKSB8fCAhaW9jLT5ldmVudHMpCisJCXJldHVybiAtRU5PREFUQTsKKworCS8qIENvcHkgdGhlIGRhdGEgZnJvbSBrZXJuZWwgbWVtb3J5IHRvIHVzZXIgbWVtb3J5CisJICovCisJbnVtQnl0ZXMgPSBtYXggKiBzaXplb2YoTVBUX0lPQ1RMX0VWRU5UUyk7CisJaWYgKGNvcHlfdG9fdXNlcih1YXJnLT5ldmVudERhdGEsIGlvYy0+ZXZlbnRzLCBudW1CeXRlcykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlc0AlZDo6bXB0Y3RsX2V2ZW50cmVwb3J0IC0gIgorCQkJIlVuYWJsZSB0byB3cml0ZSBvdXQgbXB0X2lvY3RsX2V2ZW50cmVwb3J0IHN0cnVjdCBAICVwXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgaW9jLT5ldmVudHMpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworc3RhdGljIGludAorbXB0Y3RsX3JlcGxhY2VfZncgKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBtcHRfaW9jdGxfcmVwbGFjZV9mdyBfX3VzZXIgKnVhcmcgPSAodm9pZCBfX3VzZXIgKikgYXJnOworCXN0cnVjdCBtcHRfaW9jdGxfcmVwbGFjZV9mdwkga2FyZzsKKwlNUFRfQURBUFRFUgkJICppb2M7CisJaW50CQkJIGlvY251bTsKKwlpbnQJCQkgbmV3RndTaXplOworCisJZGN0bHByaW50aygoIm1wdGN0bF9yZXBsYWNlX2Z3IGNhbGxlZC5cbiIpKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmthcmcsIHVhcmcsIHNpemVvZihzdHJ1Y3QgbXB0X2lvY3RsX3JlcGxhY2VfZncpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzQCVkOjptcHRjdGxfcmVwbGFjZV9mdyAtICIKKwkJCSJVbmFibGUgdG8gcmVhZCBpbiBtcHRfaW9jdGxfcmVwbGFjZV9mdyBzdHJ1Y3QgQCAlcFxuIiwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIHVhcmcpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoKChpb2NudW0gPSBtcHRfdmVyaWZ5X2FkYXB0ZXIoa2FyZy5oZHIuaW9jbnVtLCAmaW9jKSkgPCAwKSB8fAorCSAgICAoaW9jID09IE5VTEwpKSB7CisJCWRjdGxwcmludGsoKEtFUk5fRVJSICIlczo6bXB0Y3RsX3JlcGxhY2VfZncoKSBAJWQgLSBpb2MlZCBub3QgZm91bmQhXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgaW9jbnVtKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIElmIGNhY2hpbmcgRlcsIEZyZWUgdGhlIG9sZCBGVyBpbWFnZQorCSAqLworCWlmIChpb2MtPmNhY2hlZF9mdyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCW1wdF9mcmVlX2Z3X21lbW9yeShpb2MpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgbmV3IEZXIGltYWdlCisJICovCisJbmV3RndTaXplID0ga2FyZy5uZXdJbWFnZVNpemU7CisKKwlpZiAobmV3RndTaXplICYgMHgwMSkKKwkJbmV3RndTaXplICs9IDE7CisJaWYgKG5ld0Z3U2l6ZSAmIDB4MDIpCisJCW5ld0Z3U2l6ZSArPSAyOworCisJbXB0X2FsbG9jX2Z3X21lbW9yeShpb2MsIG5ld0Z3U2l6ZSk7CisJaWYgKGlvYy0+Y2FjaGVkX2Z3ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogQ29weSB0aGUgZGF0YSBmcm9tIHVzZXIgbWVtb3J5IHRvIGtlcm5lbCBzcGFjZQorCSAqLworCWlmIChjb3B5X2Zyb21fdXNlcihpb2MtPmNhY2hlZF9mdywgdWFyZy0+bmV3SW1hZ2UsIG5ld0Z3U2l6ZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlc0AlZDo6bXB0Y3RsX3JlcGxhY2VfZncgLSAiCisJCQkJIlVuYWJsZSB0byByZWFkIGluIG1wdF9pb2N0bF9yZXBsYWNlX2Z3IGltYWdlICIKKwkJCQkiQCAlcFxuIiwgX19GSUxFX18sIF9fTElORV9fLCB1YXJnKTsKKwkJbXB0X2ZyZWVfZndfbWVtb3J5KGlvYyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIFVwZGF0ZSBJT0NGYWN0c1JlcGx5CisJICovCisJaW9jLT5mYWN0cy5GV0ltYWdlU2l6ZSA9IG5ld0Z3U2l6ZTsKKwlyZXR1cm4gMDsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyogTVBUIElPQ1RMIE1QVENPTU1BTkQgZnVuY3Rpb24uCisgKiBDYXN0IHRoZSBhcmcgaW50byB0aGUgbXB0X2lvY3RsX21wdF9jb21tYW5kIHN0cnVjdHVyZS4KKyAqCisgKiBPdXRwdXRzOglOb25lLgorICogUmV0dXJuOgkwIGlmIHN1Y2Nlc3NmdWwKKyAqCQktRUJVU1kgIGlmIHByZXZpb3VzIGNvbW1hbmQgdGltb3V0IGFuZCBJT0MgcmVzZXQgaXMgbm90IGNvbXBsZXRlLgorICoJCS1FRkFVTFQgaWYgZGF0YSB1bmF2YWlsYWJsZQorICoJCS1FTk9ERVYgaWYgbm8gc3VjaCBkZXZpY2UvYWRhcHRlcgorICoJCS1FVElNRQlpZiB0aW1lciBleHBpcmVzCisgKgkJLUVOT01FTSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvcgorICovCitzdGF0aWMgaW50CittcHRjdGxfbXB0X2NvbW1hbmQgKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBtcHRfaW9jdGxfY29tbWFuZCBfX3VzZXIgKnVhcmcgPSAodm9pZCBfX3VzZXIgKikgYXJnOworCXN0cnVjdCBtcHRfaW9jdGxfY29tbWFuZCAga2FyZzsKKwlNUFRfQURBUFRFUgkqaW9jOworCWludAkJaW9jbnVtOworCWludAkJcmM7CisKKwlkY3RscHJpbnRrKCgibXB0Y3RsX2NvbW1hbmQgY2FsbGVkLlxuIikpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZrYXJnLCB1YXJnLCBzaXplb2Yoc3RydWN0IG1wdF9pb2N0bF9jb21tYW5kKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlc0AlZDo6bXB0Y3RsX21wdF9jb21tYW5kIC0gIgorCQkJIlVuYWJsZSB0byByZWFkIGluIG1wdF9pb2N0bF9jb21tYW5kIHN0cnVjdCBAICVwXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgdWFyZyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmICgoKGlvY251bSA9IG1wdF92ZXJpZnlfYWRhcHRlcihrYXJnLmhkci5pb2NudW0sICZpb2MpKSA8IDApIHx8CisJICAgIChpb2MgPT0gTlVMTCkpIHsKKwkJZGN0bHByaW50aygoS0VSTl9FUlIgIiVzOjptcHRjdGxfbXB0X2NvbW1hbmQoKSBAJWQgLSBpb2MlZCBub3QgZm91bmQhXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgaW9jbnVtKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJjID0gbXB0Y3RsX2RvX21wdF9jb21tYW5kIChrYXJnLCAmdWFyZy0+TUYpOworCisJcmV0dXJuIHJjOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKiBXb3JrZXIgcm91dGluZSBmb3IgdGhlIElPQ1RMIE1QVENPTU1BTkQgYW5kIE1QVENPTU1BTkQzMiAoc3BhcmMpIGNvbW1hbmRzLgorICoKKyAqIE91dHB1dHM6CU5vbmUuCisgKiBSZXR1cm46CTAgaWYgc3VjY2Vzc2Z1bAorICoJCS1FQlVTWSAgaWYgcHJldmlvdXMgY29tbWFuZCB0aW1vdXQgYW5kIElPQyByZXNldCBpcyBub3QgY29tcGxldGUuCisgKgkJLUVGQVVMVCBpZiBkYXRhIHVuYXZhaWxhYmxlCisgKgkJLUVOT0RFViBpZiBubyBzdWNoIGRldmljZS9hZGFwdGVyCisgKgkJLUVUSU1FCWlmIHRpbWVyIGV4cGlyZXMKKyAqCQktRU5PTUVNIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yCisgKgkJLUVQRVJNIGlmIFNDU0kgSS9PIGFuZCB0YXJnZXQgaXMgdW50YWdnZWQKKyAqLworc3RhdGljIGludAorbXB0Y3RsX2RvX21wdF9jb21tYW5kIChzdHJ1Y3QgbXB0X2lvY3RsX2NvbW1hbmQga2FyZywgdm9pZCBfX3VzZXIgKm1mUHRyKQoreworCU1QVF9BREFQVEVSCSppb2M7CisJTVBUX0ZSQU1FX0hEUgkqbWYgPSBOVUxMOworCU1QSUhlYWRlcl90CSpoZHI7CisJY2hhcgkJKnBzZ2U7CisJc3RydWN0IGJ1Zmxpc3QJYnVmSW47CS8qIGRhdGEgSW4gYnVmZmVyICovCisJc3RydWN0IGJ1Zmxpc3QJYnVmT3V0OyAvKiBkYXRhIE91dCBidWZmZXIgKi8KKwlkbWFfYWRkcl90CWRtYV9hZGRyX2luOworCWRtYV9hZGRyX3QJZG1hX2FkZHJfb3V0OworCWludAkJc2dTaXplID0gMDsJLyogTnVtIFNHIGVsZW1lbnRzICovCisJaW50CQlpb2NudW0sIGZsYWdzTGVuZ3RoOworCWludAkJc3osIHJjID0gMDsKKwlpbnQJCW1zZ0NvbnRleHQ7CisJdTE2CQlyZXFfaWR4OworCXVsb25nIAkJdGltZW91dDsKKworCWRjdGxwcmludGsoKCJtcHRjdGxfZG9fbXB0X2NvbW1hbmQgY2FsbGVkLlxuIikpOworCWJ1ZkluLmtwdHIgPSBidWZPdXQua3B0ciA9IE5VTEw7CisKKwlpZiAoKChpb2NudW0gPSBtcHRfdmVyaWZ5X2FkYXB0ZXIoa2FyZy5oZHIuaW9jbnVtLCAmaW9jKSkgPCAwKSB8fAorCSAgICAoaW9jID09IE5VTEwpKSB7CisJCWRjdGxwcmludGsoKEtFUk5fRVJSICIlczo6bXB0Y3RsX2RvX21wdF9jb21tYW5kKCkgQCVkIC0gaW9jJWQgbm90IGZvdW5kIVxuIiwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIGlvY251bSkpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKCFpb2MtPmlvY3RsKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXNAJWQ6Om1wdGN0bF9kb19tcHRfY29tbWFuZCAtICIKKwkJCSJObyBtZW1vcnkgYXZhaWxhYmxlIGR1cmluZyBkcml2ZXIgaW5pdC5cbiIsCisJCQkJX19GSUxFX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfSBlbHNlIGlmIChpb2MtPmlvY3RsLT5zdGF0dXMgJiBNUFRfSU9DVExfU1RBVFVTX0RJRF9JT0NSRVNFVCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzQCVkOjptcHRjdGxfZG9fbXB0X2NvbW1hbmQgLSAiCisJCQkiQnVzeSB3aXRoIElPQyBSZXNldCBcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogVmVyaWZ5IHRoYXQgdGhlIGZpbmFsIHJlcXVlc3QgZnJhbWUgd2lsbCBub3QgYmUgdG9vIGxhcmdlLgorCSAqLworCXN6ID0ga2FyZy5kYXRhU2dlT2Zmc2V0ICogNDsKKwlpZiAoa2FyZy5kYXRhSW5TaXplID4gMCkKKwkJc3ogKz0gc2l6ZW9mKGRtYV9hZGRyX3QpICsgc2l6ZW9mKHUzMik7CisJaWYgKGthcmcuZGF0YU91dFNpemUgPiAwKQorCQlzeiArPSBzaXplb2YoZG1hX2FkZHJfdCkgKyBzaXplb2YodTMyKTsKKworCWlmIChzeiA+IGlvYy0+cmVxX3N6KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXNAJWQ6Om1wdGN0bF9kb19tcHRfY29tbWFuZCAtICIKKwkJCSJSZXF1ZXN0IGZyYW1lIHRvbyBsYXJnZSAoJWQpIG1heGltdW0gKCVkKVxuIiwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIHN6LCBpb2MtPnJlcV9zeik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qIEdldCBhIGZyZWUgcmVxdWVzdCBmcmFtZSBhbmQgc2F2ZSB0aGUgbWVzc2FnZSBjb250ZXh0LgorCSAqLworICAgICAgICBpZiAoKG1mID0gbXB0X2dldF9tc2dfZnJhbWUobXB0Y3RsX2lkLCBpb2MpKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOworCisJaGRyID0gKE1QSUhlYWRlcl90ICopIG1mOworCW1zZ0NvbnRleHQgPSBsZTMyX3RvX2NwdShoZHItPk1zZ0NvbnRleHQpOworCXJlcV9pZHggPSBsZTE2X3RvX2NwdShtZi0+dS5mcmFtZS5od2hkci5tc2djdHh1LmZsZC5yZXFfaWR4KTsKKworCS8qIENvcHkgdGhlIHJlcXVlc3QgZnJhbWUKKwkgKiBSZXNldCB0aGUgc2F2ZWQgbWVzc2FnZSBjb250ZXh0LgorCSAqIFJlcXVlc3QgZnJhbWUgaW4gdXNlciBzcGFjZQorCSAqLworCWlmIChjb3B5X2Zyb21fdXNlcihtZiwgbWZQdHIsIGthcmcuZGF0YVNnZU9mZnNldCAqIDQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXNAJWQ6Om1wdGN0bF9kb19tcHRfY29tbWFuZCAtICIKKwkJCSJVbmFibGUgdG8gcmVhZCBNRiBmcm9tIG1wdF9pb2N0bF9jb21tYW5kIHN0cnVjdCBAICVwXG4iLAorCQkJX19GSUxFX18sIF9fTElORV9fLCBtZlB0cik7CisJCXJjID0gLUVGQVVMVDsKKwkJZ290byBkb25lX2ZyZWVfbWVtOworCX0KKwloZHItPk1zZ0NvbnRleHQgPSBjcHVfdG9fbGUzMihtc2dDb250ZXh0KTsKKworCisJLyogVmVyaWZ5IHRoYXQgdGhpcyByZXF1ZXN0IGlzIGFsbG93ZWQuCisJICovCisJc3dpdGNoIChoZHItPkZ1bmN0aW9uKSB7CisJY2FzZSBNUElfRlVOQ1RJT05fSU9DX0ZBQ1RTOgorCWNhc2UgTVBJX0ZVTkNUSU9OX1BPUlRfRkFDVFM6CisJCWthcmcuZGF0YU91dFNpemUgID0ga2FyZy5kYXRhSW5TaXplID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIE1QSV9GVU5DVElPTl9DT05GSUc6CisJY2FzZSBNUElfRlVOQ1RJT05fRkNfQ09NTU9OX1RSQU5TUE9SVF9TRU5EOgorCWNhc2UgTVBJX0ZVTkNUSU9OX0ZDX0VYX0xJTktfU1JWQ19TRU5EOgorCWNhc2UgTVBJX0ZVTkNUSU9OX0ZXX1VQTE9BRDoKKwljYXNlIE1QSV9GVU5DVElPTl9TQ1NJX0VOQ0xPU1VSRV9QUk9DRVNTT1I6CisJY2FzZSBNUElfRlVOQ1RJT05fRldfRE9XTkxPQUQ6CisJY2FzZSBNUElfRlVOQ1RJT05fRkNfUFJJTUlUSVZFX1NFTkQ6CisJCWJyZWFrOworCisJY2FzZSBNUElfRlVOQ1RJT05fU0NTSV9JT19SRVFVRVNUOgorCQlpZiAoaW9jLT5zaCkgeworCQkJU0NTSUlPUmVxdWVzdF90ICpwU2NzaVJlcSA9IChTQ1NJSU9SZXF1ZXN0X3QgKikgbWY7CisJCQlWaXJ0RGV2aWNlCSpwVGFyZ2V0ID0gTlVMTDsKKwkJCU1QVF9TQ1NJX0hPU1QJKmhkID0gTlVMTDsKKwkJCWludCBxdGFnID0gTVBJX1NDU0lJT19DT05UUk9MX1VOVEFHR0VEOworCQkJaW50IHNjc2lkaXIgPSAwOworCQkJaW50IHRhcmdldCA9IChpbnQpIHBTY3NpUmVxLT5UYXJnZXRJRDsKKwkJCWludCBkYXRhU2l6ZTsKKworCQkJaWYgKCh0YXJnZXQgPCAwKSB8fCAodGFyZ2V0ID49IGlvYy0+c2gtPm1heF9pZCkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzQCVkOjptcHRjdGxfZG9fbXB0X2NvbW1hbmQgLSAiCisJCQkJCSJUYXJnZXQgSUQgb3V0IG9mIGJvdW5kcy4gXG4iLAorCQkJCQlfX0ZJTEVfXywgX19MSU5FX18pOworCQkJCXJjID0gLUVOT0RFVjsKKwkJCQlnb3RvIGRvbmVfZnJlZV9tZW07CisJCQl9CisKKwkJCXBTY3NpUmVxLT5Nc2dGbGFncyA9IG1wdF9tc2dfZmxhZ3MoKTsKKworCQkJLyogdmVyaWZ5IHRoYXQgYXBwIGhhcyBub3QgcmVxdWVzdGVkCisJCQkgKgltb3JlIHNlbnNlIGRhdGEgdGhhbiBkcml2ZXIKKwkJCSAqCWNhbiBwcm92aWRlLCBpZiBzbywgcmVzZXQgdGhpcyBwYXJhbWV0ZXIKKwkJCSAqIHNldCB0aGUgc2Vuc2UgYnVmZmVyIHBvaW50ZXIgbG93IGFkZHJlc3MKKwkJCSAqIHVwZGF0ZSB0aGUgY29udHJvbCBmaWVsZCB0byBzcGVjaWZ5IFEgdHlwZQorCQkJICovCisJCQlpZiAoa2FyZy5tYXhTZW5zZUJ5dGVzID4gTVBUX1NFTlNFX0JVRkZFUl9TSVpFKQorCQkJCXBTY3NpUmVxLT5TZW5zZUJ1ZmZlckxlbmd0aCA9IE1QVF9TRU5TRV9CVUZGRVJfU0laRTsKKwkJCWVsc2UKKwkJCQlwU2NzaVJlcS0+U2Vuc2VCdWZmZXJMZW5ndGggPSBrYXJnLm1heFNlbnNlQnl0ZXM7CisKKwkJCXBTY3NpUmVxLT5TZW5zZUJ1ZmZlckxvd0FkZHIgPQorCQkJCWNwdV90b19sZTMyKGlvYy0+c2Vuc2VfYnVmX2xvd19kbWEKKwkJCQkgICArIChyZXFfaWR4ICogTVBUX1NFTlNFX0JVRkZFUl9BTExPQykpOworCisJCQlpZiAoKGhkID0gKE1QVF9TQ1NJX0hPU1QgKikgaW9jLT5zaC0+aG9zdGRhdGEpKSB7CisJCQkJaWYgKGhkLT5UYXJnZXRzKQorCQkJCQlwVGFyZ2V0ID0gaGQtPlRhcmdldHNbdGFyZ2V0XTsKKwkJCX0KKworCQkJaWYgKHBUYXJnZXQgJiYocFRhcmdldC0+dGZsYWdzICYgTVBUX1RBUkdFVF9GTEFHU19RX1lFUykpCisJCQkJcXRhZyA9IE1QSV9TQ1NJSU9fQ09OVFJPTF9TSU1QTEVROworCisJCQkvKiBIYXZlIHRoZSBJT0NUTCBkcml2ZXIgc2V0IHRoZSBkaXJlY3Rpb24gYmFzZWQKKwkJCSAqIG9uIHRoZSBkYXRhT3V0U2l6ZSAob3JkZXJpbmcgaXNzdWUgd2l0aCBTcGFyYykuCisJCQkgKi8KKwkJCWlmIChrYXJnLmRhdGFPdXRTaXplID4gMCkgeworCQkJCXNjc2lkaXIgPSBNUElfU0NTSUlPX0NPTlRST0xfV1JJVEU7CisJCQkJZGF0YVNpemUgPSBrYXJnLmRhdGFPdXRTaXplOworCQkJfSBlbHNlIHsKKwkJCQlzY3NpZGlyID0gTVBJX1NDU0lJT19DT05UUk9MX1JFQUQ7CisJCQkJZGF0YVNpemUgPSBrYXJnLmRhdGFJblNpemU7CisJCQl9CisKKwkJCXBTY3NpUmVxLT5Db250cm9sID0gY3B1X3RvX2xlMzIoc2NzaWRpciB8IHF0YWcpOworCQkJcFNjc2lSZXEtPkRhdGFMZW5ndGggPSBjcHVfdG9fbGUzMihkYXRhU2l6ZSk7CisKKwkJCWlvYy0+aW9jdGwtPnJlc2V0ID0gTVBUQ1RMX1JFU0VUX09LOworCQkJaW9jLT5pb2N0bC0+dGFyZ2V0ID0gdGFyZ2V0OworCisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzQCVkOjptcHRjdGxfZG9fbXB0X2NvbW1hbmQgLSAiCisJCQkJIlNDU0kgZHJpdmVyIGlzIG5vdCBsb2FkZWQuIFxuIiwKKwkJCQkJX19GSUxFX18sIF9fTElORV9fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWdvdG8gZG9uZV9mcmVlX21lbTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTVBJX0ZVTkNUSU9OX1JBSURfQUNUSU9OOgorCQkvKiBKdXN0IGFkZCBhIFNHRQorCQkgKi8KKwkJYnJlYWs7CisKKwljYXNlIE1QSV9GVU5DVElPTl9SQUlEX1NDU0lfSU9fUEFTU1RIUk9VR0g6CisJCWlmIChpb2MtPnNoKSB7CisJCQlTQ1NJSU9SZXF1ZXN0X3QgKnBTY3NpUmVxID0gKFNDU0lJT1JlcXVlc3RfdCAqKSBtZjsKKwkJCWludCBxdGFnID0gTVBJX1NDU0lJT19DT05UUk9MX1NJTVBMRVE7CisJCQlpbnQgc2NzaWRpciA9IE1QSV9TQ1NJSU9fQ09OVFJPTF9SRUFEOworCQkJaW50IGRhdGFTaXplOworCisJCQlwU2NzaVJlcS0+TXNnRmxhZ3MgPSBtcHRfbXNnX2ZsYWdzKCk7CisKKwkJCS8qIHZlcmlmeSB0aGF0IGFwcCBoYXMgbm90IHJlcXVlc3RlZAorCQkJICoJbW9yZSBzZW5zZSBkYXRhIHRoYW4gZHJpdmVyCisJCQkgKgljYW4gcHJvdmlkZSwgaWYgc28sIHJlc2V0IHRoaXMgcGFyYW1ldGVyCisJCQkgKiBzZXQgdGhlIHNlbnNlIGJ1ZmZlciBwb2ludGVyIGxvdyBhZGRyZXNzCisJCQkgKiB1cGRhdGUgdGhlIGNvbnRyb2wgZmllbGQgdG8gc3BlY2lmeSBRIHR5cGUKKwkJCSAqLworCQkJaWYgKGthcmcubWF4U2Vuc2VCeXRlcyA+IE1QVF9TRU5TRV9CVUZGRVJfU0laRSkKKwkJCQlwU2NzaVJlcS0+U2Vuc2VCdWZmZXJMZW5ndGggPSBNUFRfU0VOU0VfQlVGRkVSX1NJWkU7CisJCQllbHNlCisJCQkJcFNjc2lSZXEtPlNlbnNlQnVmZmVyTGVuZ3RoID0ga2FyZy5tYXhTZW5zZUJ5dGVzOworCisJCQlwU2NzaVJlcS0+U2Vuc2VCdWZmZXJMb3dBZGRyID0KKwkJCQljcHVfdG9fbGUzMihpb2MtPnNlbnNlX2J1Zl9sb3dfZG1hCisJCQkJICAgKyAocmVxX2lkeCAqIE1QVF9TRU5TRV9CVUZGRVJfQUxMT0MpKTsKKworCQkJLyogQWxsIGNvbW1hbmRzIHRvIHBoeXNpY2FsIGRldmljZXMgYXJlIHRhZ2dlZAorCQkJICovCisKKwkJCS8qIEhhdmUgdGhlIElPQ1RMIGRyaXZlciBzZXQgdGhlIGRpcmVjdGlvbiBiYXNlZAorCQkJICogb24gdGhlIGRhdGFPdXRTaXplIChvcmRlcmluZyBpc3N1ZSB3aXRoIFNwYXJjKS4KKwkJCSAqLworCQkJaWYgKGthcmcuZGF0YU91dFNpemUgPiAwKSB7CisJCQkJc2NzaWRpciA9IE1QSV9TQ1NJSU9fQ09OVFJPTF9XUklURTsKKwkJCQlkYXRhU2l6ZSA9IGthcmcuZGF0YU91dFNpemU7CisJCQl9IGVsc2UgeworCQkJCXNjc2lkaXIgPSBNUElfU0NTSUlPX0NPTlRST0xfUkVBRDsKKwkJCQlkYXRhU2l6ZSA9IGthcmcuZGF0YUluU2l6ZTsKKwkJCX0KKworCQkJcFNjc2lSZXEtPkNvbnRyb2wgPSBjcHVfdG9fbGUzMihzY3NpZGlyIHwgcXRhZyk7CisJCQlwU2NzaVJlcS0+RGF0YUxlbmd0aCA9IGNwdV90b19sZTMyKGRhdGFTaXplKTsKKworCQkJaW9jLT5pb2N0bC0+cmVzZXQgPSBNUFRDVExfUkVTRVRfT0s7CisJCQlpb2MtPmlvY3RsLT50YXJnZXQgPSBwU2NzaVJlcS0+VGFyZ2V0SUQ7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzQCVkOjptcHRjdGxfZG9fbXB0X2NvbW1hbmQgLSAiCisJCQkJIlNDU0kgZHJpdmVyIGlzIG5vdCBsb2FkZWQuIFxuIiwKKwkJCQkJX19GSUxFX18sIF9fTElORV9fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWdvdG8gZG9uZV9mcmVlX21lbTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTVBJX0ZVTkNUSU9OX1NDU0lfVEFTS19NR01UOgorCQl7CisJCQlNUFRfU0NTSV9IT1NUICpoZCA9IE5VTEw7CisJCQlpZiAoKGlvYy0+c2ggPT0gTlVMTCkgfHwgKChoZCA9IChNUFRfU0NTSV9IT1NUICopaW9jLT5zaC0+aG9zdGRhdGEpID09IE5VTEwpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlc0AlZDo6bXB0Y3RsX2RvX21wdF9jb21tYW5kIC0gIgorCQkJCQkiU0NTSSBkcml2ZXIgbm90IGxvYWRlZCBvciBTQ1NJIGhvc3Qgbm90IGZvdW5kLiBcbiIsCisJCQkJCV9fRklMRV9fLCBfX0xJTkVfXyk7CisJCQkJcmMgPSAtRUZBVUxUOworCQkJCWdvdG8gZG9uZV9mcmVlX21lbTsKKwkJCX0gZWxzZSBpZiAobXB0Y3RsX3NldF90bV9mbGFncyhoZCkgIT0gMCkgeworCQkJCXJjID0gLUVQRVJNOworCQkJCWdvdG8gZG9uZV9mcmVlX21lbTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgTVBJX0ZVTkNUSU9OX0lPQ19JTklUOgorCQl7CisJCQlJT0NJbml0X3QJKnBJbml0ID0gKElPQ0luaXRfdCAqKSBtZjsKKwkJCXUzMgkJaGlnaF9hZGRyLCBzZW5zZV9oaWdoOworCisJCQkvKiBWZXJpZnkgdGhhdCBhbGwgZW50cmllcyBpbiB0aGUgSU9DIElOSVQgbWF0Y2gKKwkJCSAqIGV4aXN0aW5nIHNldHVwIChhbmQgaW4gTEUgZm9ybWF0KS4KKwkJCSAqLworCQkJaWYgKHNpemVvZihkbWFfYWRkcl90KSA9PSBzaXplb2YodTY0KSkgeworCQkJCWhpZ2hfYWRkciA9IGNwdV90b19sZTMyKCh1MzIpKCh1NjQpaW9jLT5yZXFfZnJhbWVzX2RtYSA+PiAzMikpOworCQkJCXNlbnNlX2hpZ2g9IGNwdV90b19sZTMyKCh1MzIpKCh1NjQpaW9jLT5zZW5zZV9idWZfcG9vbF9kbWEgPj4gMzIpKTsKKwkJCX0gZWxzZSB7CisJCQkJaGlnaF9hZGRyID0gMDsKKwkJCQlzZW5zZV9oaWdoPSAwOworCQkJfQorCisJCQlpZiAoKHBJbml0LT5GbGFncyAhPSAwKSB8fCAocEluaXQtPk1heERldmljZXMgIT0gaW9jLT5mYWN0cy5NYXhEZXZpY2VzKSB8fAorCQkJCShwSW5pdC0+TWF4QnVzZXMgIT0gaW9jLT5mYWN0cy5NYXhCdXNlcykgfHwKKwkJCQkocEluaXQtPlJlcGx5RnJhbWVTaXplICE9IGNwdV90b19sZTE2KGlvYy0+cmVwbHlfc3opKSB8fAorCQkJCShwSW5pdC0+SG9zdE1mYUhpZ2hBZGRyICE9IGhpZ2hfYWRkcikgfHwKKwkJCQkocEluaXQtPlNlbnNlQnVmZmVySGlnaEFkZHIgIT0gc2Vuc2VfaGlnaCkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzQCVkOjptcHRjdGxfZG9fbXB0X2NvbW1hbmQgLSAiCisJCQkJCSJJT0NfSU5JVCBpc3N1ZWQgd2l0aCAxIG9yIG1vcmUgaW5jb3JyZWN0IHBhcmFtZXRlcnMuIFJlamVjdGVkLlxuIiwKKwkJCQkJX19GSUxFX18sIF9fTElORV9fKTsKKwkJCQlyYyA9IC1FRkFVTFQ7CisJCQkJZ290byBkb25lX2ZyZWVfbWVtOworCQkJfQorCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qCisJCSAqIE1QSV9GVU5DVElPTl9QT1JUX0VOQUJMRQorCQkgKiBNUElfRlVOQ1RJT05fVEFSR0VUX0NNRF9CVUZGRVJfUE9TVAorCQkgKiBNUElfRlVOQ1RJT05fVEFSR0VUX0FTU0lTVAorCQkgKiBNUElfRlVOQ1RJT05fVEFSR0VUX1NUQVRVU19TRU5ECisJCSAqIE1QSV9GVU5DVElPTl9UQVJHRVRfTU9ERV9BQk9SVAorCQkgKiBNUElfRlVOQ1RJT05fSU9DX01FU1NBR0VfVU5JVF9SRVNFVAorCQkgKiBNUElfRlVOQ1RJT05fSU9fVU5JVF9SRVNFVAorCQkgKiBNUElfRlVOQ1RJT05fSEFORFNIQUtFCisJCSAqIE1QSV9GVU5DVElPTl9SRVBMWV9GUkFNRV9SRU1PVkFMCisJCSAqIE1QSV9GVU5DVElPTl9FVkVOVF9OT1RJRklDQVRJT04KKwkJICogIChkcml2ZXIgaGFuZGxlcyBldmVudCBub3RpZmljYXRpb24pCisJCSAqIE1QSV9GVU5DVElPTl9FVkVOVF9BQ0sKKwkJICovCisKKwkJLyogIFdoYXQgdG8gZG8gd2l0aCB0aGVzZT8/PyAgQ0hFQ0sgTUUhISEKKwkJCU1QSV9GVU5DVElPTl9GQ19MSU5LX1NSVkNfQlVGX1BPU1QKKwkJCU1QSV9GVU5DVElPTl9GQ19MSU5LX1NSVkNfUlNQCisJCQlNUElfRlVOQ1RJT05fRkNfQUJPUlQKKwkJCU1QSV9GVU5DVElPTl9MQU5fU0VORAorCQkJTVBJX0ZVTkNUSU9OX0xBTl9SRUNFSVZFCisJCSAJTVBJX0ZVTkNUSU9OX0xBTl9SRVNFVAorCQkqLworCisJCXByaW50ayhLRVJOX0VSUiAiJXNAJWQ6Om1wdGN0bF9kb19tcHRfY29tbWFuZCAtICIKKwkJCSJJbGxlZ2FsIHJlcXVlc3QgKGZ1bmN0aW9uIDB4JXgpIFxuIiwKKwkJCV9fRklMRV9fLCBfX0xJTkVfXywgaGRyLT5GdW5jdGlvbik7CisJCXJjID0gLUVGQVVMVDsKKwkJZ290byBkb25lX2ZyZWVfbWVtOworCX0KKworCS8qIEFkZCB0aGUgU0dMICggYXQgbW9zdCBvbmUgZGF0YSBpbiBTR0UgYW5kIG9uZSBkYXRhIG91dCBTR0UgKQorCSAqIEluIHRoZSBjYXNlIG9mIHR3byBTR0UncyAtIHRoZSBkYXRhIG91dCAod3JpdGUpIHdpbGwgYWx3YXlzCisJICogcHJlY2VlZGUgdGhlIGRhdGEgaW4gKHJlYWQpIFNHRS4gcHNnTGlzdCBpcyB1c2VkIHRvIGZyZWUgdGhlCisJICogYWxsb2NhdGVkIG1lbW9yeS4KKwkgKi8KKwlwc2dlID0gKGNoYXIgKikgKCgoaW50ICopIG1mKSArIGthcmcuZGF0YVNnZU9mZnNldCk7CisJZmxhZ3NMZW5ndGggPSAwOworCisJLyogYnVmSW4gYW5kIGJ1Zk91dCBhcmUgdXNlZCBmb3IgdXNlciB0byBrZXJuZWwgc3BhY2UgdHJhbnNmZXJzCisJICovCisJYnVmSW4ua3B0ciA9IGJ1Zk91dC5rcHRyID0gTlVMTDsKKwlidWZJbi5sZW4gPSBidWZPdXQubGVuID0gMDsKKworCWlmIChrYXJnLmRhdGFPdXRTaXplID4gMCkKKwkJc2dTaXplICsrOworCisJaWYgKGthcmcuZGF0YUluU2l6ZSA+IDApCisJCXNnU2l6ZSArKzsKKworCWlmIChzZ1NpemUgPiAwKSB7CisKKwkJLyogU2V0IHVwIHRoZSBkYXRhT3V0IG1lbW9yeSBhbGxvY2F0aW9uICovCisJCWlmIChrYXJnLmRhdGFPdXRTaXplID4gMCkgeworCQkJaWYgKGthcmcuZGF0YUluU2l6ZSA+IDApIHsKKwkJCQlmbGFnc0xlbmd0aCA9ICggTVBJX1NHRV9GTEFHU19TSU1QTEVfRUxFTUVOVCB8CisJCQkJCQlNUElfU0dFX0ZMQUdTX0VORF9PRl9CVUZGRVIgfAorCQkJCQkJTVBJX1NHRV9GTEFHU19ESVJFQ1RJT04gfAorCQkJCQkJbXB0X2FkZHJfc2l6ZSgpICkKKwkJCQkJCTw8IE1QSV9TR0VfRkxBR1NfU0hJRlQ7CisJCQl9IGVsc2UgeworCQkJCWZsYWdzTGVuZ3RoID0gTVBUX1NHRV9GTEFHU19TU0lNUExFX1dSSVRFOworCQkJfQorCQkJZmxhZ3NMZW5ndGggfD0ga2FyZy5kYXRhT3V0U2l6ZTsKKwkJCWJ1Zk91dC5sZW4gPSBrYXJnLmRhdGFPdXRTaXplOworCQkJYnVmT3V0LmtwdHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudCgKKwkJCQkJaW9jLT5wY2lkZXYsIGJ1Zk91dC5sZW4sICZkbWFfYWRkcl9vdXQpOworCisJCQlpZiAoYnVmT3V0LmtwdHIgPT0gTlVMTCkgeworCQkJCXJjID0gLUVOT01FTTsKKwkJCQlnb3RvIGRvbmVfZnJlZV9tZW07CisJCQl9IGVsc2UgeworCQkJCS8qIFNldCB1cCB0aGlzIFNHRS4KKwkJCQkgKiBDb3B5IHRvIE1GIGFuZCB0byBzZ2xidWYKKwkJCQkgKi8KKwkJCQltcHRfYWRkX3NnZShwc2dlLCBmbGFnc0xlbmd0aCwgZG1hX2FkZHJfb3V0KTsKKwkJCQlwc2dlICs9IChzaXplb2YodTMyKSArIHNpemVvZihkbWFfYWRkcl90KSk7CisKKwkJCQkvKiBDb3B5IHVzZXIgZGF0YSB0byBrZXJuZWwgc3BhY2UuCisJCQkJICovCisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKGJ1Zk91dC5rcHRyLAorCQkJCQkJa2FyZy5kYXRhT3V0QnVmUHRyLAorCQkJCQkJYnVmT3V0LmxlbikpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCQkiJXNAJWQ6Om1wdGN0bF9kb19tcHRfY29tbWFuZCAtIFVuYWJsZSAiCisJCQkJCQkidG8gcmVhZCB1c2VyIGRhdGEgIgorCQkJCQkJInN0cnVjdCBAICVwXG4iLAorCQkJCQkJX19GSUxFX18sIF9fTElORV9fLGthcmcuZGF0YU91dEJ1ZlB0cik7CisJCQkJCXJjID0gIC1FRkFVTFQ7CisJCQkJCWdvdG8gZG9uZV9mcmVlX21lbTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoa2FyZy5kYXRhSW5TaXplID4gMCkgeworCQkJZmxhZ3NMZW5ndGggPSBNUFRfU0dFX0ZMQUdTX1NTSU1QTEVfUkVBRDsKKwkJCWZsYWdzTGVuZ3RoIHw9IGthcmcuZGF0YUluU2l6ZTsKKworCQkJYnVmSW4ubGVuID0ga2FyZy5kYXRhSW5TaXplOworCQkJYnVmSW4ua3B0ciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGlvYy0+cGNpZGV2LAorCQkJCQlidWZJbi5sZW4sICZkbWFfYWRkcl9pbik7CisKKwkJCWlmIChidWZJbi5rcHRyID09IE5VTEwpIHsKKwkJCQlyYyA9IC1FTk9NRU07CisJCQkJZ290byBkb25lX2ZyZWVfbWVtOworCQkJfSBlbHNlIHsKKwkJCQkvKiBTZXQgdXAgdGhpcyBTR0UKKwkJCQkgKiBDb3B5IHRvIE1GIGFuZCB0byBzZ2xidWYKKwkJCQkgKi8KKwkJCQltcHRfYWRkX3NnZShwc2dlLCBmbGFnc0xlbmd0aCwgZG1hX2FkZHJfaW4pOworCQkJfQorCQl9CisJfSBlbHNlICB7CisJCS8qIEFkZCBhIE5VTEwgU0dFCisJCSAqLworCQltcHRfYWRkX3NnZShwc2dlLCBmbGFnc0xlbmd0aCwgKGRtYV9hZGRyX3QpIC0xKTsKKwl9CisKKwlpb2MtPmlvY3RsLT53YWl0X2RvbmUgPSAwOworCWlmIChoZHItPkZ1bmN0aW9uID09IE1QSV9GVU5DVElPTl9TQ1NJX1RBU0tfTUdNVCkgeworCisJCURCR19EVU1QX1RNX1JFUVVFU1RfRlJBTUUoKHUzMiAqKW1mKTsKKworCQlpZiAobXB0X3NlbmRfaGFuZHNoYWtlX3JlcXVlc3QobXB0Y3RsX2lkLCBpb2MsCisJCQlzaXplb2YoU0NTSVRhc2tNZ210X3QpLCAodTMyKiltZiwKKwkJCUNBTl9TTEVFUCkgIT0gMCkgeworCQkJZGZhaWxwcmludGsoKE1ZSU9DX3NfRVJSX0ZNVCAiX3NlbmRfaGFuZHNoYWtlIEZBSUxFRCEiCisJCQkJIiAoaW9jICVwLCBtZiAlcCkgXG4iLCBpb2MtPm5hbWUsCisJCQkJaW9jLCBtZikpOworCQkJbXB0Y3RsX2ZyZWVfdG1fZmxhZ3MoaW9jKTsKKwkJCXJjID0gLUVOT0RBVEE7CisJCQlnb3RvIGRvbmVfZnJlZV9tZW07CisJCX0KKworCX0gZWxzZQorCQltcHRfcHV0X21zZ19mcmFtZShtcHRjdGxfaWQsIGlvYywgbWYpOworCisJLyogTm93IHdhaXQgZm9yIHRoZSBjb21tYW5kIHRvIGNvbXBsZXRlICovCisJdGltZW91dCA9IChrYXJnLnRpbWVvdXQgPiAwKSA/IGthcmcudGltZW91dCA6IE1QVF9JT0NUTF9ERUZBVUxUX1RJTUVPVVQ7CisJdGltZW91dCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KG1wdGN0bF93YWl0LAorCSAgICAgaW9jLT5pb2N0bC0+d2FpdF9kb25lID09IDEsCisJICAgICBIWip0aW1lb3V0KTsKKworCWlmKHRpbWVvdXQgPD0wICYmIChpb2MtPmlvY3RsLT53YWl0X2RvbmUgIT0gMSApKSB7CisJLyogTm93IHdlIG5lZWQgdG8gcmVzZXQgdGhlIGJvYXJkICovCisKKwkJaWYgKGhkci0+RnVuY3Rpb24gPT0gTVBJX0ZVTkNUSU9OX1NDU0lfVEFTS19NR01UKQorCQkJbXB0Y3RsX2ZyZWVfdG1fZmxhZ3MoaW9jKTsKKworCQltcHRjdGxfdGltZW91dF9leHBpcmVkKGlvYy0+aW9jdGwpOworCQlyYyA9IC1FTk9EQVRBOworCQlnb3RvIGRvbmVfZnJlZV9tZW07CisJfQorCisJbWYgPSBOVUxMOworCisJLyogSWYgYSB2YWxpZCByZXBseSBmcmFtZSwgY29weSB0byB0aGUgdXNlci4KKwkgKiBPZmZzZXQgMjogcmVwbHkgbGVuZ3RoIGluIFUzMidzCisJICovCisJaWYgKGlvYy0+aW9jdGwtPnN0YXR1cyAmIE1QVF9JT0NUTF9TVEFUVVNfUkZfVkFMSUQpIHsKKwkJaWYgKGthcmcubWF4UmVwbHlCeXRlcyA8IGlvYy0+cmVwbHlfc3opIHsKKwkJCSBzeiA9IG1pbihrYXJnLm1heFJlcGx5Qnl0ZXMsIDQqaW9jLT5pb2N0bC0+UmVwbHlGcmFtZVsyXSk7CisJCX0gZWxzZSB7CisJCQkgc3ogPSBtaW4oaW9jLT5yZXBseV9zeiwgNCppb2MtPmlvY3RsLT5SZXBseUZyYW1lWzJdKTsKKwkJfQorCisJCWlmIChzeiA+IDApIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIoa2FyZy5yZXBseUZyYW1lQnVmUHRyLAorCQkJCSAmaW9jLT5pb2N0bC0+UmVwbHlGcmFtZSwgc3opKXsKKwkJCQkgcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAiJXNAJWQ6Om1wdGN0bF9kb19tcHRfY29tbWFuZCAtICIKKwkJCQkgIlVuYWJsZSB0byB3cml0ZSBvdXQgcmVwbHkgZnJhbWUgJXBcbiIsCisJCQkJIF9fRklMRV9fLCBfX0xJTkVfXywga2FyZy5yZXBseUZyYW1lQnVmUHRyKTsKKwkJCQkgcmMgPSAgLUVOT0RBVEE7CisJCQkJIGdvdG8gZG9uZV9mcmVlX21lbTsKKwkJCX0KKwkJfQorCX0KKworCS8qIElmIHZhbGlkIHNlbnNlIGRhdGEsIGNvcHkgdG8gdXNlci4KKwkgKi8KKwlpZiAoaW9jLT5pb2N0bC0+c3RhdHVzICYgTVBUX0lPQ1RMX1NUQVRVU19TRU5TRV9WQUxJRCkgeworCQlzeiA9IG1pbihrYXJnLm1heFNlbnNlQnl0ZXMsIE1QVF9TRU5TRV9CVUZGRVJfU0laRSk7CisJCWlmIChzeiA+IDApIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIoa2FyZy5zZW5zZURhdGFQdHIsIGlvYy0+aW9jdGwtPnNlbnNlLCBzeikpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzQCVkOjptcHRjdGxfZG9fbXB0X2NvbW1hbmQgLSAiCisJCQkJIlVuYWJsZSB0byB3cml0ZSBzZW5zZSBkYXRhIHRvIHVzZXIgJXBcbiIsCisJCQkJX19GSUxFX18sIF9fTElORV9fLAorCQkJCWthcmcuc2Vuc2VEYXRhUHRyKTsKKwkJCQlyYyA9ICAtRU5PREFUQTsKKwkJCQlnb3RvIGRvbmVfZnJlZV9tZW07CisJCQl9CisJCX0KKwl9CisKKwkvKiBJZiB0aGUgb3ZlcmFsbCBzdGF0dXMgaXMgX0dPT0QgYW5kIGRhdGEgaW4sIGNvcHkgZGF0YQorCSAqIHRvIHVzZXIuCisJICovCisJaWYgKChpb2MtPmlvY3RsLT5zdGF0dXMgJiBNUFRfSU9DVExfU1RBVFVTX0NPTU1BTkRfR09PRCkgJiYKKwkJCQkoa2FyZy5kYXRhSW5TaXplID4gMCkgJiYgKGJ1ZkluLmtwdHIpKSB7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihrYXJnLmRhdGFJbkJ1ZlB0ciwKKwkJCQkgYnVmSW4ua3B0ciwga2FyZy5kYXRhSW5TaXplKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlc0AlZDo6bXB0Y3RsX2RvX21wdF9jb21tYW5kIC0gIgorCQkJCSJVbmFibGUgdG8gd3JpdGUgZGF0YSB0byB1c2VyICVwXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywKKwkJCQlrYXJnLmRhdGFJbkJ1ZlB0cik7CisJCQlyYyA9ICAtRU5PREFUQTsKKwkJfQorCX0KKworZG9uZV9mcmVlX21lbToKKworCWlvYy0+aW9jdGwtPnN0YXR1cyAmPSB+KE1QVF9JT0NUTF9TVEFUVVNfQ09NTUFORF9HT09EIHwKKwkJTVBUX0lPQ1RMX1NUQVRVU19TRU5TRV9WQUxJRCB8CisJCU1QVF9JT0NUTF9TVEFUVVNfUkZfVkFMSUQgKTsKKworCS8qIEZyZWUgdGhlIGFsbG9jYXRlZCBtZW1vcnkuCisJICovCisJaWYgKGJ1Zk91dC5rcHRyICE9IE5VTEwpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChpb2MtPnBjaWRldiwKKwkJCWJ1Zk91dC5sZW4sICh2b2lkICopIGJ1Zk91dC5rcHRyLCBkbWFfYWRkcl9vdXQpOworCX0KKworCWlmIChidWZJbi5rcHRyICE9IE5VTEwpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChpb2MtPnBjaWRldiwKKwkJCWJ1ZkluLmxlbiwgKHZvaWQgKikgYnVmSW4ua3B0ciwgZG1hX2FkZHJfaW4pOworCX0KKworCS8qIG1mIGlzIG51bGwgaWYgY29tbWFuZCBpc3N1ZWQgc3VjY2Vzc2Z1bGx5CisJICogb3RoZXJ3aXNlLCBmYWlsdXJlIG9jY3VyZWQgYWZ0ZXIgbWYgYWNxdWlyZWQuCisJICovCisJaWYgKG1mKQorCQltcHRfZnJlZV9tc2dfZnJhbWUoaW9jLCBtZik7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qIFByb3RvdHlwZSBSb3V0aW5lIGZvciB0aGUgSFAgSE9TVCBJTkZPIGNvbW1hbmQuCisgKgorICogT3V0cHV0czoJTm9uZS4KKyAqIFJldHVybjoJMCBpZiBzdWNjZXNzZnVsCisgKgkJLUVGQVVMVCBpZiBkYXRhIHVuYXZhaWxhYmxlCisgKgkJLUVCVVNZICBpZiBwcmV2aW91cyBjb21tYW5kIHRpbW91dCBhbmQgSU9DIHJlc2V0IGlzIG5vdCBjb21wbGV0ZS4KKyAqCQktRU5PREVWIGlmIG5vIHN1Y2ggZGV2aWNlL2FkYXB0ZXIKKyAqCQktRVRJTUUJaWYgdGltZXIgZXhwaXJlcworICoJCS1FTk9NRU0gaWYgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IKKyAqLworc3RhdGljIGludAorbXB0Y3RsX2hwX2hvc3RpbmZvKHVuc2lnbmVkIGxvbmcgYXJnLCB1bnNpZ25lZCBpbnQgZGF0YV9zaXplKQoreworCWhwX2hvc3RfaW5mb190CV9fdXNlciAqdWFyZyA9ICh2b2lkIF9fdXNlciAqKSBhcmc7CisJTVBUX0FEQVBURVIJCSppb2M7CisJc3RydWN0IHBjaV9kZXYJCSpwZGV2OworCWNoYXIJCQkqcGJ1ZjsKKwlkbWFfYWRkcl90CQlidWZfZG1hOworCWhwX2hvc3RfaW5mb190CQlrYXJnOworCUNPTkZJR1BBUk1TCQljZmc7CisJQ29uZmlnUGFnZUhlYWRlcl90CWhkcjsKKwlpbnQJCQlpb2NudW07CisJaW50CQkJcmMsIGNpbV9yZXY7CisKKwlkY3RscHJpbnRrKCgiOiBtcHRjdGxfaHBfaG9zdGluZm8gY2FsbGVkLlxuIikpOworCS8qIFJlc2V0IGxvbmcgdG8gaW50LiBTaG91bGQgYWZmZWN0IElBNjQgYW5kIFNQQVJDIG9ubHkKKwkgKi8KKwlpZiAoZGF0YV9zaXplID09IHNpemVvZihocF9ob3N0X2luZm9fdCkpCisJCWNpbV9yZXYgPSAxOworCWVsc2UgaWYgKGRhdGFfc2l6ZSA9PSBzaXplb2YoaHBfaG9zdF9pbmZvX3JldjBfdCkpCisJCWNpbV9yZXYgPSAwOwkvKiBvYnNvbGV0ZSAqLworCWVsc2UKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmthcmcsIHVhcmcsIHNpemVvZihocF9ob3N0X2luZm9fdCkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXNAJWQ6Om1wdGN0bF9ocF9ob3N0X2luZm8gLSAiCisJCQkiVW5hYmxlIHRvIHJlYWQgaW4gaHBfaG9zdF9pbmZvIHN0cnVjdCBAICVwXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgdWFyZyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmICgoKGlvY251bSA9IG1wdF92ZXJpZnlfYWRhcHRlcihrYXJnLmhkci5pb2NudW0sICZpb2MpKSA8IDApIHx8CisJICAgIChpb2MgPT0gTlVMTCkpIHsKKwkJZGN0bHByaW50aygoS0VSTl9FUlIgIiVzOjptcHRjdGxfaHBfaG9zdGluZm8oKSBAJWQgLSBpb2MlZCBub3QgZm91bmQhXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgaW9jbnVtKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEZpbGwgaW4gdGhlIGRhdGEgYW5kIHJldHVybiB0aGUgc3RydWN0dXJlIHRvIHRoZSBjYWxsaW5nCisJICogcHJvZ3JhbQorCSAqLworCXBkZXYgPSAoc3RydWN0IHBjaV9kZXYgKikgaW9jLT5wY2lkZXY7CisKKwlrYXJnLnZlbmRvciA9IHBkZXYtPnZlbmRvcjsKKwlrYXJnLmRldmljZSA9IHBkZXYtPmRldmljZTsKKwlrYXJnLnN1YnN5c3RlbV9pZCA9IHBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisJa2FyZy5zdWJzeXN0ZW1fdmVuZG9yID0gcGRldi0+c3Vic3lzdGVtX3ZlbmRvcjsKKwlrYXJnLmRldmZuID0gcGRldi0+ZGV2Zm47CisJa2FyZy5idXMgPSBwZGV2LT5idXMtPm51bWJlcjsKKworCS8qIFNhdmUgdGhlIFNDU0kgaG9zdCBuby4gaWYKKwkgKiBTQ1NJIGRyaXZlciBsb2FkZWQKKwkgKi8KKwlpZiAoaW9jLT5zaCAhPSBOVUxMKQorCQlrYXJnLmhvc3Rfbm8gPSBpb2MtPnNoLT5ob3N0X25vOworCWVsc2UKKwkJa2FyZy5ob3N0X25vID0gIC0xOworCisJLyogUmVmb3JtYXQgdGhlIGZ3X3ZlcnNpb24gaW50byBhIHN0cmluZworCSAqLworCWthcmcuZndfdmVyc2lvblswXSA9IGlvYy0+ZmFjdHMuRldWZXJzaW9uLlN0cnVjdC5NYWpvciA+PSAxMCA/CisJCSgoaW9jLT5mYWN0cy5GV1ZlcnNpb24uU3RydWN0Lk1ham9yIC8gMTApICsgJzAnKSA6ICcwJzsKKwlrYXJnLmZ3X3ZlcnNpb25bMV0gPSAoaW9jLT5mYWN0cy5GV1ZlcnNpb24uU3RydWN0Lk1ham9yICUgMTAgKSArICcwJzsKKwlrYXJnLmZ3X3ZlcnNpb25bMl0gPSAnLic7CisJa2FyZy5md192ZXJzaW9uWzNdID0gaW9jLT5mYWN0cy5GV1ZlcnNpb24uU3RydWN0Lk1pbm9yID49IDEwID8KKwkJKChpb2MtPmZhY3RzLkZXVmVyc2lvbi5TdHJ1Y3QuTWlub3IgLyAxMCkgKyAnMCcpIDogJzAnOworCWthcmcuZndfdmVyc2lvbls0XSA9IChpb2MtPmZhY3RzLkZXVmVyc2lvbi5TdHJ1Y3QuTWlub3IgJSAxMCApICsgJzAnOworCWthcmcuZndfdmVyc2lvbls1XSA9ICcuJzsKKwlrYXJnLmZ3X3ZlcnNpb25bNl0gPSBpb2MtPmZhY3RzLkZXVmVyc2lvbi5TdHJ1Y3QuVW5pdCA+PSAxMCA/CisJCSgoaW9jLT5mYWN0cy5GV1ZlcnNpb24uU3RydWN0LlVuaXQgLyAxMCkgKyAnMCcpIDogJzAnOworCWthcmcuZndfdmVyc2lvbls3XSA9IChpb2MtPmZhY3RzLkZXVmVyc2lvbi5TdHJ1Y3QuVW5pdCAlIDEwICkgKyAnMCc7CisJa2FyZy5md192ZXJzaW9uWzhdID0gJy4nOworCWthcmcuZndfdmVyc2lvbls5XSA9IGlvYy0+ZmFjdHMuRldWZXJzaW9uLlN0cnVjdC5EZXYgPj0gMTAgPworCQkoKGlvYy0+ZmFjdHMuRldWZXJzaW9uLlN0cnVjdC5EZXYgLyAxMCkgKyAnMCcpIDogJzAnOworCWthcmcuZndfdmVyc2lvblsxMF0gPSAoaW9jLT5mYWN0cy5GV1ZlcnNpb24uU3RydWN0LkRldiAlIDEwICkgKyAnMCc7CisJa2FyZy5md192ZXJzaW9uWzExXSA9ICdcMCc7CisKKwkvKiBJc3N1ZSBhIGNvbmZpZyByZXF1ZXN0IHRvIGdldCB0aGUgZGV2aWNlIHNlcmlhbCBudW1iZXIKKwkgKi8KKwloZHIuUGFnZVZlcnNpb24gPSAwOworCWhkci5QYWdlTGVuZ3RoID0gMDsKKwloZHIuUGFnZU51bWJlciA9IDA7CisJaGRyLlBhZ2VUeXBlID0gTVBJX0NPTkZJR19QQUdFVFlQRV9NQU5VRkFDVFVSSU5HOworCWNmZy5oZHIgPSAmaGRyOworCWNmZy5waHlzQWRkciA9IC0xOworCWNmZy5wYWdlQWRkciA9IDA7CisJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfSEVBREVSOworCWNmZy5kaXIgPSAwOwkvKiByZWFkICovCisJY2ZnLnRpbWVvdXQgPSAxMDsKKworCXN0cm5jcHkoa2FyZy5zZXJpYWxfbnVtYmVyLCAiICIsIDI0KTsKKwlpZiAobXB0X2NvbmZpZyhpb2MsICZjZmcpID09IDApIHsKKwkJaWYgKGNmZy5oZHItPlBhZ2VMZW5ndGggPiAwKSB7CisJCQkvKiBJc3N1ZSB0aGUgc2Vjb25kIGNvbmZpZyBwYWdlIHJlcXVlc3QgKi8KKwkJCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX1JFQURfQ1VSUkVOVDsKKworCQkJcGJ1ZiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGlvYy0+cGNpZGV2LCBoZHIuUGFnZUxlbmd0aCAqIDQsICZidWZfZG1hKTsKKwkJCWlmIChwYnVmKSB7CisJCQkJY2ZnLnBoeXNBZGRyID0gYnVmX2RtYTsKKwkJCQlpZiAobXB0X2NvbmZpZyhpb2MsICZjZmcpID09IDApIHsKKwkJCQkJTWFudWZhY3R1cmluZ1BhZ2UwX3QgKnBkYXRhID0gKE1hbnVmYWN0dXJpbmdQYWdlMF90ICopIHBidWY7CisJCQkJCWlmIChzdHJsZW4ocGRhdGEtPkJvYXJkVHJhY2VyTnVtYmVyKSA+IDEpIHsKKwkJCQkJCXN0cm5jcHkoa2FyZy5zZXJpYWxfbnVtYmVyLCAJCQkJCQkJCQkgICAgcGRhdGEtPkJvYXJkVHJhY2VyTnVtYmVyLCAyNCk7CisJCQkJCQlrYXJnLnNlcmlhbF9udW1iZXJbMjQtMV09J1wwJzsKKwkJCQkJfQorCQkJCX0KKwkJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGlvYy0+cGNpZGV2LCBoZHIuUGFnZUxlbmd0aCAqIDQsIHBidWYsIGJ1Zl9kbWEpOworCQkJCXBidWYgPSBOVUxMOworCQkJfQorCQl9CisJfQorCXJjID0gbXB0X0dldElvY1N0YXRlKGlvYywgMSk7CisJc3dpdGNoIChyYykgeworCWNhc2UgTVBJX0lPQ19TVEFURV9PUEVSQVRJT05BTDoKKwkJa2FyZy5pb2Nfc3RhdHVzID0gIEhQX1NUQVRVU19PSzsKKwkJYnJlYWs7CisKKwljYXNlIE1QSV9JT0NfU1RBVEVfRkFVTFQ6CisJCWthcmcuaW9jX3N0YXR1cyA9ICBIUF9TVEFUVVNfRkFJTEVEOworCQlicmVhazsKKworCWNhc2UgTVBJX0lPQ19TVEFURV9SRVNFVDoKKwljYXNlIE1QSV9JT0NfU1RBVEVfUkVBRFk6CisJZGVmYXVsdDoKKwkJa2FyZy5pb2Nfc3RhdHVzID0gIEhQX1NUQVRVU19PVEhFUjsKKwkJYnJlYWs7CisJfQorCisJa2FyZy5iYXNlX2lvX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisKKwlpZiAoaW9jLT5idXNfdHlwZSA9PSBGQykKKwkJa2FyZy5idXNfcGh5c193aWR0aCA9IEhQX0JVU19XSURUSF9VTks7CisJZWxzZQorCQlrYXJnLmJ1c19waHlzX3dpZHRoID0gSFBfQlVTX1dJRFRIXzE2OworCisJa2FyZy5oYXJkX3Jlc2V0cyA9IDA7CisJa2FyZy5zb2Z0X3Jlc2V0cyA9IDA7CisJa2FyZy50aW1lb3V0cyA9IDA7CisJaWYgKGlvYy0+c2ggIT0gTlVMTCkgeworCQlNUFRfU0NTSV9IT1NUICpoZCA9ICAoTVBUX1NDU0lfSE9TVCAqKWlvYy0+c2gtPmhvc3RkYXRhOworCisJCWlmIChoZCAmJiAoY2ltX3JldiA9PSAxKSkgeworCQkJa2FyZy5oYXJkX3Jlc2V0cyA9IGhkLT5oYXJkX3Jlc2V0czsKKwkJCWthcmcuc29mdF9yZXNldHMgPSBoZC0+c29mdF9yZXNldHM7CisJCQlrYXJnLnRpbWVvdXRzID0gaGQtPnRpbWVvdXRzOworCQl9CisJfQorCisJY2ZnLnBhZ2VBZGRyID0gMDsKKwljZmcuYWN0aW9uID0gTVBJX1RPT0xCT1hfSVNUV0lfUkVBRF9XUklURV9UT09MOworCWNmZy5kaXIgPSBNUElfVEJfSVNUV0lfRkxBR1NfUkVBRDsKKwljZmcudGltZW91dCA9IDEwOworCXBidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChpb2MtPnBjaWRldiwgNCwgJmJ1Zl9kbWEpOworCWlmIChwYnVmKSB7CisJCWNmZy5waHlzQWRkciA9IGJ1Zl9kbWE7CisJCWlmICgobXB0X3Rvb2xib3goaW9jLCAmY2ZnKSkgPT0gMCkgeworCQkJa2FyZy5yc3ZkID0gKih1MzIgKilwYnVmOworCQl9CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaW9jLT5wY2lkZXYsIDQsIHBidWYsIGJ1Zl9kbWEpOworCQlwYnVmID0gTlVMTDsKKwl9CisKKwkvKiBDb3B5IHRoZSBkYXRhIGZyb20ga2VybmVsIG1lbW9yeSB0byB1c2VyIG1lbW9yeQorCSAqLworCWlmIChjb3B5X3RvX3VzZXIoKGNoYXIgX191c2VyICopYXJnLCAma2FyZywgc2l6ZW9mKGhwX2hvc3RfaW5mb190KSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlc0AlZDo6bXB0Y3RsX2hwZ2V0aG9zdGluZm8gLSAiCisJCQkiVW5hYmxlIHRvIHdyaXRlIG91dCBocF9ob3N0X2luZm8gQCAlcFxuIiwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIHVhcmcpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKKworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKiBQcm90b3R5cGUgUm91dGluZSBmb3IgdGhlIEhQIFRBUkdFVCBJTkZPIGNvbW1hbmQuCisgKgorICogT3V0cHV0czoJTm9uZS4KKyAqIFJldHVybjoJMCBpZiBzdWNjZXNzZnVsCisgKgkJLUVGQVVMVCBpZiBkYXRhIHVuYXZhaWxhYmxlCisgKgkJLUVCVVNZICBpZiBwcmV2aW91cyBjb21tYW5kIHRpbW91dCBhbmQgSU9DIHJlc2V0IGlzIG5vdCBjb21wbGV0ZS4KKyAqCQktRU5PREVWIGlmIG5vIHN1Y2ggZGV2aWNlL2FkYXB0ZXIKKyAqCQktRVRJTUUJaWYgdGltZXIgZXhwaXJlcworICoJCS1FTk9NRU0gaWYgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IKKyAqLworc3RhdGljIGludAorbXB0Y3RsX2hwX3RhcmdldGluZm8odW5zaWduZWQgbG9uZyBhcmcpCit7CisJaHBfdGFyZ2V0X2luZm9fdCBfX3VzZXIgKnVhcmcgPSAodm9pZCBfX3VzZXIgKikgYXJnOworCVNDU0lEZXZpY2VQYWdlMF90CSpwZzBfYWxsb2M7CisJU0NTSURldmljZVBhZ2UzX3QJKnBnM19hbGxvYzsKKwlNUFRfQURBUFRFUgkJKmlvYzsKKwlNUFRfU0NTSV9IT1NUIAkJKmhkID0gTlVMTDsKKwlocF90YXJnZXRfaW5mb190CWthcmc7CisJaW50CQkJaW9jbnVtOworCWludAkJCWRhdGFfc3o7CisJZG1hX2FkZHJfdAkJcGFnZV9kbWE7CisJQ09ORklHUEFSTVMJIAljZmc7CisJQ29uZmlnUGFnZUhlYWRlcl90CWhkcjsKKwlpbnQJCQl0bXAsIG5wLCByYyA9IDA7CisKKwlkY3RscHJpbnRrKCgiOiBtcHRjdGxfaHBfdGFyZ2V0aW5mbyBjYWxsZWQuXG4iKSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZrYXJnLCB1YXJnLCBzaXplb2YoaHBfdGFyZ2V0X2luZm9fdCkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXNAJWQ6Om1wdGN0bF9ocF90YXJnZXRpbmZvIC0gIgorCQkJIlVuYWJsZSB0byByZWFkIGluIGhwX2hvc3RfdGFyZ2V0aW5mbyBzdHJ1Y3QgQCAlcFxuIiwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIHVhcmcpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoKChpb2NudW0gPSBtcHRfdmVyaWZ5X2FkYXB0ZXIoa2FyZy5oZHIuaW9jbnVtLCAmaW9jKSkgPCAwKSB8fAorCQkoaW9jID09IE5VTEwpKSB7CisJCWRjdGxwcmludGsoKEtFUk5fRVJSICIlczo6bXB0Y3RsX2hwX3RhcmdldGluZm8oKSBAJWQgLSBpb2MlZCBub3QgZm91bmQhXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgaW9jbnVtKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qICBUaGVyZSBpcyBub3RoaW5nIHRvIGRvIGZvciBGQ1AgcGFydHMuCisJICovCisJaWYgKGlvYy0+YnVzX3R5cGUgPT0gRkMpCisJCXJldHVybiAwOworCisJaWYgKChpb2MtPnNwaV9kYXRhLnNkcDBsZW5ndGggPT0gMCkgfHwgKGlvYy0+c2ggPT0gTlVMTCkpCisJCXJldHVybiAwOworCisJaWYgKGlvYy0+c2gtPmhvc3Rfbm8gIT0ga2FyZy5oZHIuaG9zdCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKyAgICAgICAvKiBHZXQgdGhlIGRhdGEgdHJhbnNmZXIgc3BlZWRzCisgICAgICAgICovCisJZGF0YV9zeiA9IGlvYy0+c3BpX2RhdGEuc2RwMGxlbmd0aCAqIDQ7CisJcGcwX2FsbG9jID0gKFNDU0lEZXZpY2VQYWdlMF90ICopIHBjaV9hbGxvY19jb25zaXN0ZW50KGlvYy0+cGNpZGV2LCBkYXRhX3N6LCAmcGFnZV9kbWEpOworCWlmIChwZzBfYWxsb2MpIHsKKwkJaGRyLlBhZ2VWZXJzaW9uID0gaW9jLT5zcGlfZGF0YS5zZHAwdmVyc2lvbjsKKwkJaGRyLlBhZ2VMZW5ndGggPSBkYXRhX3N6OworCQloZHIuUGFnZU51bWJlciA9IDA7CisJCWhkci5QYWdlVHlwZSA9IE1QSV9DT05GSUdfUEFHRVRZUEVfU0NTSV9ERVZJQ0U7CisKKwkJY2ZnLmhkciA9ICZoZHI7CisJCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX1JFQURfQ1VSUkVOVDsKKwkJY2ZnLmRpciA9IDA7CisJCWNmZy50aW1lb3V0ID0gMDsKKwkJY2ZnLnBoeXNBZGRyID0gcGFnZV9kbWE7CisKKwkJY2ZnLnBhZ2VBZGRyID0gKGthcmcuaGRyLmNoYW5uZWwgPDwgOCkgfCBrYXJnLmhkci5pZDsKKworCQlpZiAoKHJjID0gbXB0X2NvbmZpZyhpb2MsICZjZmcpKSA9PSAwKSB7CisJCQlucCA9IGxlMzJfdG9fY3B1KHBnMF9hbGxvYy0+TmVnb3RpYXRlZFBhcmFtZXRlcnMpOworCQkJa2FyZy5uZWdvdGlhdGVkX3dpZHRoID0gbnAgJiBNUElfU0NTSURFVlBBR0UwX05QX1dJREUgPworCQkJCQlIUF9CVVNfV0lEVEhfMTYgOiBIUF9CVVNfV0lEVEhfODsKKworCQkJaWYgKG5wICYgTVBJX1NDU0lERVZQQUdFMF9OUF9ORUdfU1lOQ19PRkZTRVRfTUFTSykgeworCQkJCXRtcCA9IChucCAmIE1QSV9TQ1NJREVWUEFHRTBfTlBfTkVHX1NZTkNfUEVSSU9EX01BU0spID4+IDg7CisJCQkJaWYgKHRtcCA8IDB4MDkpCisJCQkJCWthcmcubmVnb3RpYXRlZF9zcGVlZCA9IEhQX0RFVl9TUEVFRF9VTFRSQTMyMDsKKwkJCQllbHNlIGlmICh0bXAgPD0gMHgwOSkKKwkJCQkJa2FyZy5uZWdvdGlhdGVkX3NwZWVkID0gSFBfREVWX1NQRUVEX1VMVFJBMTYwOworCQkJCWVsc2UgaWYgKHRtcCA8PSAweDBBKQorCQkJCQlrYXJnLm5lZ290aWF0ZWRfc3BlZWQgPSBIUF9ERVZfU1BFRURfVUxUUkEyOworCQkJCWVsc2UgaWYgKHRtcCA8PSAweDBDKQorCQkJCQlrYXJnLm5lZ290aWF0ZWRfc3BlZWQgPSBIUF9ERVZfU1BFRURfVUxUUkE7CisJCQkJZWxzZSBpZiAodG1wIDw9IDB4MjUpCisJCQkJCWthcmcubmVnb3RpYXRlZF9zcGVlZCA9IEhQX0RFVl9TUEVFRF9GQVNUOworCQkJCWVsc2UKKwkJCQkJa2FyZy5uZWdvdGlhdGVkX3NwZWVkID0gSFBfREVWX1NQRUVEX0FTWU5DOworCQkJfSBlbHNlCisJCQkJa2FyZy5uZWdvdGlhdGVkX3NwZWVkID0gSFBfREVWX1NQRUVEX0FTWU5DOworCQl9CisKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChpb2MtPnBjaWRldiwgZGF0YV9zeiwgKHU4ICopIHBnMF9hbGxvYywgcGFnZV9kbWEpOworCX0KKworCS8qIFNldCBkZWZhdWx0cworCSAqLworCWthcmcubWVzc2FnZV9yZWplY3RzID0gLTE7CisJa2FyZy5waGFzZV9lcnJvcnMgPSAtMTsKKwlrYXJnLnBhcml0eV9lcnJvcnMgPSAtMTsKKwlrYXJnLnNlbGVjdF90aW1lb3V0cyA9IC0xOworCisJLyogR2V0IHRoZSB0YXJnZXQgZXJyb3IgcGFyYW1ldGVycworCSAqLworCWhkci5QYWdlVmVyc2lvbiA9IDA7CisJaGRyLlBhZ2VMZW5ndGggPSAwOworCWhkci5QYWdlTnVtYmVyID0gMzsKKwloZHIuUGFnZVR5cGUgPSBNUElfQ09ORklHX1BBR0VUWVBFX1NDU0lfREVWSUNFOworCisJY2ZnLmhkciA9ICZoZHI7CisJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfSEVBREVSOworCWNmZy5kaXIgPSAwOworCWNmZy50aW1lb3V0ID0gMDsKKwljZmcucGh5c0FkZHIgPSAtMTsKKwlpZiAoKG1wdF9jb25maWcoaW9jLCAmY2ZnKSA9PSAwKSAmJiAoY2ZnLmhkci0+UGFnZUxlbmd0aCA+IDApKSB7CisJCS8qIElzc3VlIHRoZSBzZWNvbmQgY29uZmlnIHBhZ2UgcmVxdWVzdCAqLworCQljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9SRUFEX0NVUlJFTlQ7CisJCWRhdGFfc3ogPSAoaW50KSBjZmcuaGRyLT5QYWdlTGVuZ3RoICogNDsKKwkJcGczX2FsbG9jID0gKFNDU0lEZXZpY2VQYWdlM190ICopIHBjaV9hbGxvY19jb25zaXN0ZW50KAorCQkJCQkJCWlvYy0+cGNpZGV2LCBkYXRhX3N6LCAmcGFnZV9kbWEpOworCQlpZiAocGczX2FsbG9jKSB7CisJCQljZmcucGh5c0FkZHIgPSBwYWdlX2RtYTsKKwkJCWNmZy5wYWdlQWRkciA9IChrYXJnLmhkci5jaGFubmVsIDw8IDgpIHwga2FyZy5oZHIuaWQ7CisJCQlpZiAoKHJjID0gbXB0X2NvbmZpZyhpb2MsICZjZmcpKSA9PSAwKSB7CisJCQkJa2FyZy5tZXNzYWdlX3JlamVjdHMgPSAodTMyKSBsZTE2X3RvX2NwdShwZzNfYWxsb2MtPk1zZ1JlamVjdENvdW50KTsKKwkJCQlrYXJnLnBoYXNlX2Vycm9ycyA9ICh1MzIpIGxlMTZfdG9fY3B1KHBnM19hbGxvYy0+UGhhc2VFcnJvckNvdW50KTsKKwkJCQlrYXJnLnBhcml0eV9lcnJvcnMgPSAodTMyKSBsZTE2X3RvX2NwdShwZzNfYWxsb2MtPlBhcml0eUVycm9yQ291bnQpOworCQkJfQorCQkJcGNpX2ZyZWVfY29uc2lzdGVudChpb2MtPnBjaWRldiwgZGF0YV9zeiwgKHU4ICopIHBnM19hbGxvYywgcGFnZV9kbWEpOworCQl9CisJfQorCWhkID0gKE1QVF9TQ1NJX0hPU1QgKikgaW9jLT5zaC0+aG9zdGRhdGE7CisJaWYgKGhkICE9IE5VTEwpCisJCWthcmcuc2VsZWN0X3RpbWVvdXRzID0gaGQtPnNlbF90aW1lb3V0W2thcmcuaGRyLmlkXTsKKworCS8qIENvcHkgdGhlIGRhdGEgZnJvbSBrZXJuZWwgbWVtb3J5IHRvIHVzZXIgbWVtb3J5CisJICovCisJaWYgKGNvcHlfdG9fdXNlcigoY2hhciBfX3VzZXIgKilhcmcsICZrYXJnLCBzaXplb2YoaHBfdGFyZ2V0X2luZm9fdCkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXNAJWQ6Om1wdGN0bF9ocF90YXJnZXRfaW5mbyAtICIKKwkJCSJVbmFibGUgdG8gd3JpdGUgb3V0IG1wdF9pb2N0bF90YXJnZXRpbmZvIHN0cnVjdCBAICVwXG4iLAorCQkJCV9fRklMRV9fLCBfX0xJTkVfXywgdWFyZyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1wdGN0bF9mb3BzID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5sbHNlZWsgPQlub19sbHNlZWssCisJLnVubG9ja2VkX2lvY3RsID0gbXB0Y3RsX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsID0gY29tcGF0X21wY3RsX2lvY3RsLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgbXB0Y3RsX21pc2NkZXYgPSB7CisJTVBUX01JTk9SLAorCU1ZTkFNLAorCSZtcHRjdGxfZm9wcworfTsKKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCisjaW5jbHVkZSA8bGludXgvaW9jdGwzMi5oPgorCitzdGF0aWMgaW50Citjb21wYXRfbXB0Znd4ZmVyX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG1wdF9md194ZmVyMzIga2Z3MzI7CisJc3RydWN0IG1wdF9md194ZmVyIGtmdzsKKwlNUFRfQURBUFRFUiAqaW9jcCA9IE5VTEw7CisJaW50IGlvY251bSwgaW9jbnVtWDsKKwlpbnQgbm9uYmxvY2sgPSAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCWludCByZXQ7CisKKwlkY3RscHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjo6Y29tcGF0X21wdGZ3eGZlcl9pb2N0bCgpIGNhbGxlZFxuIikpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZrZnczMiwgKGNoYXIgX191c2VyICopYXJnLCBzaXplb2Yoa2Z3MzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBWZXJpZnkgaW50ZW5kZWQgTVBUIGFkYXB0ZXIgKi8KKwlpb2NudW1YID0ga2Z3MzIuaW9jbnVtICYgMHhGRjsKKwlpZiAoKChpb2NudW0gPSBtcHRfdmVyaWZ5X2FkYXB0ZXIoaW9jbnVtWCwgJmlvY3ApKSA8IDApIHx8CisJICAgIChpb2NwID09IE5VTEwpKSB7CisJCWRjdGxwcmludGsoKEtFUk5fRVJSIE1ZTkFNICI6OmNvbXBhdF9tcHRmd3hmZXJfaW9jdGwgQCVkIC0gaW9jJWQgbm90IGZvdW5kIVxuIiwKKwkJCQlfX0xJTkVfXywgaW9jbnVtWCkpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoKHJldCA9IG1wdGN0bF9zeXNjYWxsX2Rvd24oaW9jcCwgbm9uYmxvY2spKSAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJa2Z3LmlvY251bSA9IGlvY251bTsKKwlrZncuZndsZW4gPSBrZnczMi5md2xlbjsKKwlrZncuYnVmcCA9IGNvbXBhdF9wdHIoa2Z3MzIuYnVmcCk7CisKKwlyZXQgPSBtcHRjdGxfZG9fZndfZG93bmxvYWQoa2Z3LmlvY251bSwga2Z3LmJ1ZnAsIGtmdy5md2xlbik7CisKKwl1cCgmaW9jcC0+aW9jdGwtPnNlbV9pb2MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorY29tcGF0X21wdF9jb21tYW5kKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG1wdF9pb2N0bF9jb21tYW5kMzIga2FyZzMyOworCXN0cnVjdCBtcHRfaW9jdGxfY29tbWFuZDMyIF9fdXNlciAqdWFyZyA9IChzdHJ1Y3QgbXB0X2lvY3RsX2NvbW1hbmQzMiBfX3VzZXIgKikgYXJnOworCXN0cnVjdCBtcHRfaW9jdGxfY29tbWFuZCBrYXJnOworCU1QVF9BREFQVEVSICppb2NwID0gTlVMTDsKKwlpbnQgaW9jbnVtLCBpb2NudW1YOworCWludCBub25ibG9jayA9IChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJaW50IHJldDsKKworCWRjdGxwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOjpjb21wYXRfbXB0X2NvbW1hbmQoKSBjYWxsZWRcbiIpKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigma2FyZzMyLCAoY2hhciBfX3VzZXIgKilhcmcsIHNpemVvZihrYXJnMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBWZXJpZnkgaW50ZW5kZWQgTVBUIGFkYXB0ZXIgKi8KKwlpb2NudW1YID0ga2FyZzMyLmhkci5pb2NudW0gJiAweEZGOworCWlmICgoKGlvY251bSA9IG1wdF92ZXJpZnlfYWRhcHRlcihpb2NudW1YLCAmaW9jcCkpIDwgMCkgfHwKKwkgICAgKGlvY3AgPT0gTlVMTCkpIHsKKwkJZGN0bHByaW50aygoS0VSTl9FUlIgTVlOQU0gIjo6Y29tcGF0X21wdF9jb21tYW5kIEAlZCAtIGlvYyVkIG5vdCBmb3VuZCFcbiIsCisJCQkJX19MSU5FX18sIGlvY251bVgpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKChyZXQgPSBtcHRjdGxfc3lzY2FsbF9kb3duKGlvY3AsIG5vbmJsb2NrKSkgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIENvcHkgZGF0YSB0byBrYXJnICovCisJa2FyZy5oZHIuaW9jbnVtID0ga2FyZzMyLmhkci5pb2NudW07CisJa2FyZy5oZHIucG9ydCA9IGthcmczMi5oZHIucG9ydDsKKwlrYXJnLnRpbWVvdXQgPSBrYXJnMzIudGltZW91dDsKKwlrYXJnLm1heFJlcGx5Qnl0ZXMgPSBrYXJnMzIubWF4UmVwbHlCeXRlczsKKworCWthcmcuZGF0YUluU2l6ZSA9IGthcmczMi5kYXRhSW5TaXplOworCWthcmcuZGF0YU91dFNpemUgPSBrYXJnMzIuZGF0YU91dFNpemU7CisJa2FyZy5tYXhTZW5zZUJ5dGVzID0ga2FyZzMyLm1heFNlbnNlQnl0ZXM7CisJa2FyZy5kYXRhU2dlT2Zmc2V0ID0ga2FyZzMyLmRhdGFTZ2VPZmZzZXQ7CisKKwlrYXJnLnJlcGx5RnJhbWVCdWZQdHIgPSAoY2hhciBfX3VzZXIgKikodW5zaWduZWQgbG9uZylrYXJnMzIucmVwbHlGcmFtZUJ1ZlB0cjsKKwlrYXJnLmRhdGFJbkJ1ZlB0ciA9IChjaGFyIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWthcmczMi5kYXRhSW5CdWZQdHI7CisJa2FyZy5kYXRhT3V0QnVmUHRyID0gKGNoYXIgX191c2VyICopKHVuc2lnbmVkIGxvbmcpa2FyZzMyLmRhdGFPdXRCdWZQdHI7CisJa2FyZy5zZW5zZURhdGFQdHIgPSAoY2hhciBfX3VzZXIgKikodW5zaWduZWQgbG9uZylrYXJnMzIuc2Vuc2VEYXRhUHRyOworCisJLyogUGFzcyBuZXcgc3RydWN0dXJlIHRvIGRvX21wdF9jb21tYW5kCisJICovCisJcmV0ID0gbXB0Y3RsX2RvX21wdF9jb21tYW5kIChrYXJnLCAmdWFyZy0+TUYpOworCisJdXAoJmlvY3AtPmlvY3RsLT5zZW1faW9jKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBsb25nIGNvbXBhdF9tcGN0bF9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJbG9uZyByZXQ7CisJbG9ja19rZXJuZWwoKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTVBUSU9DSU5GTzoKKwljYXNlIE1QVElPQ0lORk8xOgorCWNhc2UgTVBUSU9DSU5GTzI6CisJY2FzZSBNUFRUQVJHRVRJTkZPOgorCWNhc2UgTVBURVZFTlRRVUVSWToKKwljYXNlIE1QVEVWRU5URU5BQkxFOgorCWNhc2UgTVBURVZFTlRSRVBPUlQ6CisJY2FzZSBNUFRIQVJEUkVTRVQ6CisJY2FzZSBIUF9HRVRIT1NUSU5GTzoKKwljYXNlIEhQX0dFVFRBUkdFVElORk86CisJY2FzZSBNUFRURVNUOgorCQlyZXQgPSBfX21wdGN0bF9pb2N0bChmLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgTVBUQ09NTUFORDMyOgorCQlyZXQgPSBjb21wYXRfbXB0X2NvbW1hbmQoZiwgY21kLCBhcmcpOworCQlicmVhazsKKwljYXNlIE1QVEZXRE9XTkxPQUQzMjoKKwkJcmV0ID0gY29tcGF0X21wdGZ3eGZlcl9pb2N0bChmLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9JT0NUTENNRDsKKwkJYnJlYWs7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYKKworCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJbXB0Y3RsX3Byb2JlIC0gSW5zdGFsbHMgaW9jdGwgZGV2aWNlcyBwZXIgYnVzLgorICoJQHBkZXY6IFBvaW50ZXIgdG8gcGNpX2RldiBzdHJ1Y3R1cmUKKyAqCisgKglSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgorICoKKyAqLworCitzdGF0aWMgaW50CittcHRjdGxfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgZXJyOworCWludCBzejsKKwl1OCAqbWVtOworCU1QVF9BREFQVEVSICppb2MgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwkvKgorCSAqIEFsbG9jYXRlIGFuZCBpbml0ZSBhIE1QVF9JT0NUTCBzdHJ1Y3R1cmUKKwkqLworCXN6ID0gc2l6ZW9mIChNUFRfSU9DVEwpOworCW1lbSA9IGttYWxsb2Moc3osIEdGUF9LRVJORUwpOworCWlmIChtZW0gPT0gTlVMTCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mYWlsOworCX0KKworCW1lbXNldChtZW0sIDAsIHN6KTsKKwlpb2MtPmlvY3RsID0gKE1QVF9JT0NUTCAqKSBtZW07CisJaW9jLT5pb2N0bC0+aW9jID0gaW9jOworCXNlbWFfaW5pdCgmaW9jLT5pb2N0bC0+c2VtX2lvYywgMSk7CisJcmV0dXJuIDA7CisKK291dF9mYWlsOgorCisJbXB0Y3RsX3JlbW92ZShwZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJbXB0Y3RsX3JlbW92ZSAtIFJlbW92ZWQgaW9jdGwgZGV2aWNlcworICoJQHBkZXY6IFBvaW50ZXIgdG8gcGNpX2RldiBzdHJ1Y3R1cmUKKyAqCisgKgorICovCitzdGF0aWMgdm9pZAorbXB0Y3RsX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlNUFRfQURBUFRFUiAqaW9jID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJa2ZyZWUgKCBpb2MtPmlvY3RsICk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXB0X3BjaV9kcml2ZXIgbXB0Y3RsX2RyaXZlciA9IHsKKyAgLnByb2JlCQk9IG1wdGN0bF9wcm9iZSwKKyAgLnJlbW92ZQkJPSBtcHRjdGxfcmVtb3ZlLAorfTsKKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworc3RhdGljIGludCBfX2luaXQgbXB0Y3RsX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCWludCB3aGVyZSA9IDE7CisKKwlzaG93X21wdG1vZF92ZXIobXlfTkFNRSwgbXlfVkVSU0lPTik7CisKKwlpZihtcHRfZGV2aWNlX2RyaXZlcl9yZWdpc3RlcigmbXB0Y3RsX2RyaXZlciwKKwkgIE1QVENUTF9EUklWRVIpICE9IDAgKSB7CisJCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTQorCQkiOiBmYWlsZWQgdG8gcmVnaXN0ZXIgZGQgY2FsbGJhY2tzXG4iKSk7CisJfQorCisJLyogUmVnaXN0ZXIgdGhpcyBkZXZpY2UgKi8KKwllcnIgPSBtaXNjX3JlZ2lzdGVyKCZtcHRjdGxfbWlzY2Rldik7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIE1ZTkFNICI6IENhbid0IHJlZ2lzdGVyIG1pc2MgZGV2aWNlIFttaW5vcj0lZF0uXG4iLCBNUFRfTUlOT1IpOworCQlnb3RvIG91dF9mYWlsOworCX0KKwlwcmludGsoS0VSTl9JTkZPIE1ZTkFNICI6IFJlZ2lzdGVyZWQgd2l0aCBGdXNpb24gTVBUIGJhc2UgZHJpdmVyXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPIE1ZTkFNICI6IC9kZXYvJXMgQCAobWFqb3IsbWlub3I9JWQsJWQpXG4iLAorCQkJIG1wdGN0bF9taXNjZGV2Lm5hbWUsIE1JU0NfTUFKT1IsIG1wdGN0bF9taXNjZGV2Lm1pbm9yKTsKKworCS8qCisJICogIEluc3RhbGwgb3VyIGhhbmRsZXIKKwkgKi8KKwkrK3doZXJlOworCWlmICgobXB0Y3RsX2lkID0gbXB0X3JlZ2lzdGVyKG1wdGN0bF9yZXBseSwgTVBUQ1RMX0RSSVZFUikpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgTVlOQU0gIjogRVJST1I6IEZhaWxlZCB0byByZWdpc3RlciB3aXRoIEZ1c2lvbiBNUFQgYmFzZSBkcml2ZXJcbiIpOworCQltaXNjX2RlcmVnaXN0ZXIoJm1wdGN0bF9taXNjZGV2KTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dF9mYWlsOworCX0KKworCWlmIChtcHRfcmVzZXRfcmVnaXN0ZXIobXB0Y3RsX2lkLCBtcHRjdGxfaW9jX3Jlc2V0KSA9PSAwKSB7CisJCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBSZWdpc3RlcmVkIGZvciBJT0MgcmVzZXQgbm90aWZpY2F0aW9uc1xuIikpOworCX0gZWxzZSB7CisJCS8qIEZJWE1FISAqLworCX0KKworCXJldHVybiAwOworCitvdXRfZmFpbDoKKworCW1wdF9kZXZpY2VfZHJpdmVyX2RlcmVnaXN0ZXIoTVBUQ1RMX0RSSVZFUik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCitzdGF0aWMgdm9pZCBtcHRjdGxfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3RlcigmbXB0Y3RsX21pc2NkZXYpOworCXByaW50ayhLRVJOX0lORk8gTVlOQU0gIjogRGVyZWdpc3RlcmVkIC9kZXYvJXMgQCAobWFqb3IsbWlub3I9JWQsJWQpXG4iLAorCQkJIG1wdGN0bF9taXNjZGV2Lm5hbWUsIE1JU0NfTUFKT1IsIG1wdGN0bF9taXNjZGV2Lm1pbm9yKTsKKworCS8qIERlLXJlZ2lzdGVyIHJlc2V0IGhhbmRsZXIgZnJvbSBiYXNlIG1vZHVsZSAqLworCW1wdF9yZXNldF9kZXJlZ2lzdGVyKG1wdGN0bF9pZCk7CisJZHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IERlcmVnaXN0ZXJlZCBmb3IgSU9DIHJlc2V0IG5vdGlmaWNhdGlvbnNcbiIpKTsKKworCS8qIERlLXJlZ2lzdGVyIGNhbGxiYWNrIGhhbmRsZXIgZnJvbSBiYXNlIG1vZHVsZSAqLworCW1wdF9kZXJlZ2lzdGVyKG1wdGN0bF9pZCk7CisJcHJpbnRrKEtFUk5fSU5GTyBNWU5BTSAiOiBEZXJlZ2lzdGVyZWQgZnJvbSBGdXNpb24gTVBUIGJhc2UgZHJpdmVyXG4iKTsKKworICAgICAgICBtcHRfZGV2aWNlX2RyaXZlcl9kZXJlZ2lzdGVyKE1QVENUTF9EUklWRVIpOworCit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKworbW9kdWxlX2luaXQobXB0Y3RsX2luaXQpOworbW9kdWxlX2V4aXQobXB0Y3RsX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRjdGwuaCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0Y3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M0ZWNmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0Y3RsLmgKQEAgLTAsMCArMSw0ODQgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRpb2N0bC5oCisgKiAgICAgIEZ1c2lvbiBNUFQgbWlzYyBkZXZpY2UgKGlvY3RsKSBkcml2ZXIuCisgKiAgICAgIEZvciB1c2Ugd2l0aCBQQ0kgY2hpcC9hZGFwdGVyKHMpOgorICogICAgICAgICAgTFNJRkM5eHgvTFNJNDA5eHggRmlicmUgQ2hhbm5lbAorICogICAgICBydW5uaW5nIExTSSBMb2dpYyBGdXNpb24gTVBUIChNZXNzYWdlIFBhc3NpbmcgVGVjaG5vbG9neSkgZmlybXdhcmUuCisgKgorICogIENyZWRpdHM6CisgKiAgICAgIFRoaXMgZHJpdmVyIHdvdWxkIG5vdCBleGlzdCBpZiBub3QgZm9yIEFsYW4gQ294J3MgZGV2ZWxvcG1lbnQKKyAqICAgICAgb2YgdGhlIGxpbnV4IGkybyBkcml2ZXIuCisgKgorICogICAgICBBIGh1Z2UgZGVidCBvZiBncmF0aXR1ZGUgaXMgb3dlZCB0byBEYXZpZCBTLiBNaWxsZXIgKERhdmVNKQorICogICAgICBmb3IgZml4aW5nIG11Y2ggb2YgdGhlIHN0dXBpZCBhbmQgYnJva2VuIHN0dWZmIGluIHRoZSBlYXJseQorICogICAgICBkcml2ZXIgd2hpbGUgcG9ydGluZyB0byBzcGFyYzY0IHBsYXRmb3JtLiAgVEhBTksgWU9VIQorICoKKyAqICAgICAgKHNlZSBhbHNvIG1wdGJhc2UuYykKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgTFNJIExvZ2ljIENvcnBvcmF0aW9uCisgKiAgT3JpZ2luYWxseSBCeTogU3RldmVuIEouIFJhbHN0b24KKyAqICAobWFpbHRvOnNqcmFsc3RvbjFAbmV0c2NhcGUubmV0KQorICogIChtYWlsdG86bXB0X2xpbnV4X2RldmVsb3BlckBsc2lsLmNvbSkKKyAqCisgKiAgJElkOiBtcHRjdGwuaCx2IDEuMTMgMjAwMi8xMi8wMyAyMToyNjozMyBwZGVsYW5leSBFeHAgJAorICovCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgTk8gV0FSUkFOVFkKKyAgICBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKKyAgICBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVAorICAgIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisgICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcworICAgIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKKyAgICBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyAgICBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLAorICAgIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorCisgICAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkKKyAgICBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorICAgIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAgIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5ECisgICAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisgICAgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICAgIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorICAgIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMKKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisjaWZuZGVmIE1QVENUTF9IX0lOQ0xVREVECisjZGVmaW5lIE1QVENUTF9IX0lOQ0xVREVECisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisKKyNpbmNsdWRlICJsaW51eC92ZXJzaW9uLmgiCisKKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCisgKi8KKyNkZWZpbmUgTVBUX01JU0NERVZfQkFTRU5BTUUgICAgICAgICAgICAibXB0Y3RsIgorI2RlZmluZSBNUFRfTUlTQ0RFVl9QQVRITkFNRSAgICAgICAgICAgICIvZGV2LyIgTVBUX01JU0NERVZfQkFTRU5BTUUKKworI2RlZmluZSBNUFRfUFJPRFVDVF9MRU5HVEggICAgICAgICAgICAgIDEyCisKKy8qCisgKiAgR2VuZXJpYyBNUFQgQ29udHJvbCBJT0NUTHMgYW5kIHN0cnVjdHVyZXMKKyAqLworI2RlZmluZSBNUFRfTUFHSUNfTlVNQkVSCSdtJworCisjZGVmaW5lIE1QVFJXUEVSRgkJX0lPV1IoTVBUX01BR0lDX05VTUJFUiwwLHN0cnVjdCBtcHRfcmF3X3JfdykKKworI2RlZmluZSBNUFRGV0RPV05MT0FECQlfSU9XUihNUFRfTUFHSUNfTlVNQkVSLDE1LHN0cnVjdCBtcHRfZndfeGZlcikKKyNkZWZpbmUgTVBUQ09NTUFORAkJX0lPV1IoTVBUX01BR0lDX05VTUJFUiwyMCxzdHJ1Y3QgbXB0X2lvY3RsX2NvbW1hbmQpCisKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pICYmIGRlZmluZWQoQ09ORklHX0NPTVBBVCkKKyNkZWZpbmUgTVBURldET1dOTE9BRDMyCQlfSU9XUihNUFRfTUFHSUNfTlVNQkVSLDE1LHN0cnVjdCBtcHRfZndfeGZlcjMyKQorI2RlZmluZSBNUFRDT01NQU5EMzIJCV9JT1dSKE1QVF9NQUdJQ19OVU1CRVIsMjAsc3RydWN0IG1wdF9pb2N0bF9jb21tYW5kMzIpCisjZW5kaWYKKworI2RlZmluZSBNUFRJT0NJTkZPCQlfSU9XUihNUFRfTUFHSUNfTlVNQkVSLDE3LHN0cnVjdCBtcHRfaW9jdGxfaW9jaW5mbykKKyNkZWZpbmUgTVBUSU9DSU5GTzEJCV9JT1dSKE1QVF9NQUdJQ19OVU1CRVIsMTcsc3RydWN0IG1wdF9pb2N0bF9pb2NpbmZvX3JldjApCisjZGVmaW5lIE1QVElPQ0lORk8yCQlfSU9XUihNUFRfTUFHSUNfTlVNQkVSLDE3LHN0cnVjdCBtcHRfaW9jdGxfaW9jaW5mb19yZXYxKQorI2RlZmluZSBNUFRUQVJHRVRJTkZPCQlfSU9XUihNUFRfTUFHSUNfTlVNQkVSLDE4LHN0cnVjdCBtcHRfaW9jdGxfdGFyZ2V0aW5mbykKKyNkZWZpbmUgTVBUVEVTVAkJCV9JT1dSKE1QVF9NQUdJQ19OVU1CRVIsMTksc3RydWN0IG1wdF9pb2N0bF90ZXN0KQorI2RlZmluZSBNUFRFVkVOVFFVRVJZCQlfSU9XUihNUFRfTUFHSUNfTlVNQkVSLDIxLHN0cnVjdCBtcHRfaW9jdGxfZXZlbnRxdWVyeSkKKyNkZWZpbmUgTVBURVZFTlRFTkFCTEUJCV9JT1dSKE1QVF9NQUdJQ19OVU1CRVIsMjIsc3RydWN0IG1wdF9pb2N0bF9ldmVudGVuYWJsZSkKKyNkZWZpbmUgTVBURVZFTlRSRVBPUlQJCV9JT1dSKE1QVF9NQUdJQ19OVU1CRVIsMjMsc3RydWN0IG1wdF9pb2N0bF9ldmVudHJlcG9ydCkKKyNkZWZpbmUgTVBUSEFSRFJFU0VUCQlfSU9XUihNUFRfTUFHSUNfTlVNQkVSLDI0LHN0cnVjdCBtcHRfaW9jdGxfZGlhZ19yZXNldCkKKyNkZWZpbmUgTVBURldSRVBMQUNFCQlfSU9XUihNUFRfTUFHSUNfTlVNQkVSLDI1LHN0cnVjdCBtcHRfaW9jdGxfcmVwbGFjZV9mdykKKworLyoKKyAqIFNQQVJDIFBMQVRGT1JNIFJFTUFSS1M6CisgKiBJT0NUTCBkYXRhIHN0cnVjdHVyZXMgdGhhdCBjb250YWluIHBvaW50ZXJzCisgKiB3aWxsIGhhdmUgZGlmZmVyZW50IHNpemVzIGluIHRoZSBkcml2ZXIgYW5kIGFwcGxpY2F0aW9ucworICogKGFzIHRoZSBhcHAuIHdpbGwgbm90IHVzZSA4LWJ5dGUgcG9pbnRlcnMpLgorICogQXBwcyBzaG91bGQgdXNlIE1QVEZXRE9XTkxPQUQgYW5kIE1QVENPTU1BTkQuCisgKiBUaGUgZHJpdmVyIHdpbGwgY29udmVydCBkYXRhIGZyb20KKyAqIG1wdF9md194ZmVyMzIgKG1wdF9pb2N0bF9jb21tYW5kMzIpIHRvIG1wdF9md194ZmVyIChtcHRfaW9jdGxfY29tbWFuZCkKKyAqIGludGVybmFsbHkuCisgKgorICogSWYgZGF0YSBzdHJ1Y3R1cmVzIGNoYW5nZSBzaXplLCBtdXN0IGhhbmRsZSBhcyBpbiBJT0NHRVRJTkZPLgorICovCitzdHJ1Y3QgbXB0X2Z3X3hmZXIgeworCXVuc2lnbmVkIGludAkgaW9jbnVtOwkvKiBJT0MgdW5pdCBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQJIGZ3bGVuOworCXZvaWQJCV9fdXNlciAqYnVmcDsJLyogUG9pbnRlciB0byBmaXJtd2FyZSBidWZmZXIgKi8KK307CisKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pICYmIGRlZmluZWQoQ09ORklHX0NPTVBBVCkKK3N0cnVjdCBtcHRfZndfeGZlcjMyIHsKKwl1bnNpZ25lZCBpbnQgaW9jbnVtOworCXVuc2lnbmVkIGludCBmd2xlbjsKKwl1MzIgYnVmcDsKK307CisjZW5kaWYJLyp9Ki8KKworLyoKKyAqICBJT0NUTCBoZWFkZXIgc3RydWN0dXJlLgorICogIGlvY251bSAtIG11c3QgYmUgZGVmaW5lZC4KKyAqICBwb3J0IC0gbXVzdCBiZSBkZWZpbmVkIGZvciBhbGwgSU9DVEwgY29tbWFuZHMgb3RoZXIgdGhhbiBNUFRJT0NJTkZPCisgKiAgbWF4RGF0YVNpemUgLSBpZ25vcmVkIG9uIE1QVENPTU1BTkQgY29tbWFuZHMKKyAqCQktIGlnbm9yZWQgb24gTVBURldSRVBMQUNFIGNvbW1hbmRzCisgKgkJLSBvbiBxdWVyeSBjb21tYW5kcywgcmVwb3J0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmV0dXJuZWQKKyAqCQkgIHRvIHRoZSBob3N0IGRyaXZlciAoY291bnQgaW5jbHVkZXMgdGhlIGhlYWRlcikuCisgKgkJICBUaGF0IGlzLCBzZXQgdG8gc2l6ZW9mKHN0cnVjdCBtcHRfaW9jdGxfaW9jaW5mbykgZm9yIGZpeGVkIHNpemVkIGNvbW1hbmRzLgorICoJCSAgU2V0IHRvIHNpemVvZihzdHJ1Y3QgbXB0X2lvY3RsX3RhcmdldGluZm8pICsgZGF0YXNpemUgZm9yIHZhcmlhYmxlCisgKgkJCXNpemVkIGNvbW1hbmRzLiAoTVBUVEFSR0VUSU5GTywgTVBURVZFTlRSRVBPUlQpCisgKi8KK3R5cGVkZWYgc3RydWN0IF9tcHRfaW9jdGxfaGVhZGVyIHsKKwl1bnNpZ25lZCBpbnQJIGlvY251bTsJLyogSU9DIHVuaXQgbnVtYmVyICovCisJdW5zaWduZWQgaW50CSBwb3J0OwkJLyogSU9DIHBvcnQgbnVtYmVyICovCisJaW50CQkgbWF4RGF0YVNpemU7CS8qIE1heGltdW0gTnVtLiBieXRlcyB0byB0cmFuc2ZlciBvbiByZWFkICovCit9IG1wdF9pb2N0bF9oZWFkZXI7CisKKy8qCisgKiBJc3N1ZSBhIGRpYWdub3N0aWMgcmVzZXQKKyAqLworc3RydWN0IG1wdF9pb2N0bF9kaWFnX3Jlc2V0IHsKKwltcHRfaW9jdGxfaGVhZGVyIGhkcjsKK307CisKKworLyoKKyAqICBQQ0kgYnVzL2RldmljZS9mdW5jdGlvbiBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBtcHRfaW9jdGxfcGNpX2luZm8geworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGludCAgZGV2aWNlTnVtYmVyICAgOiAgNTsKKwkJCXVuc2lnbmVkIGludCAgZnVuY3Rpb25OdW1iZXIgOiAgMzsKKwkJCXVuc2lnbmVkIGludCAgYnVzTnVtYmVyICAgICAgOiAyNDsKKwkJfSBiaXRzOworCQl1bnNpZ25lZCBpbnQgIGFzVWxvbmc7CisJfSB1OworfTsKKworc3RydWN0IG1wdF9pb2N0bF9wY2lfaW5mbzIgeworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGludCAgZGV2aWNlTnVtYmVyICAgOiAgNTsKKwkJCXVuc2lnbmVkIGludCAgZnVuY3Rpb25OdW1iZXIgOiAgMzsKKwkJCXVuc2lnbmVkIGludCAgYnVzTnVtYmVyICAgICAgOiAyNDsKKwkJfSBiaXRzOworCQl1bnNpZ25lZCBpbnQgIGFzVWxvbmc7CisJfSB1OworICBpbnQgc2VnbWVudElEOworfTsKKworLyoKKyAqICBBZGFwdGVyIEluZm9ybWF0aW9uIFBhZ2UKKyAqICBSZWFkIG9ubHkuCisgKiAgRGF0YSBzdGFydHMgYXQgb2Zmc2V0IDB4QworICovCisjZGVmaW5lIE1QVF9JT0NUTF9JTlRFUkZBQ0VfRkMJCSgweDAxKQorI2RlZmluZSBNUFRfSU9DVExfSU5URVJGQUNFX1NDU0kJKDB4MDApCisjZGVmaW5lIE1QVF9JT0NUTF9WRVJTSU9OX0xFTkdUSAkoMzIpCisKK3N0cnVjdCBtcHRfaW9jdGxfaW9jaW5mbyB7CisJbXB0X2lvY3RsX2hlYWRlciBoZHI7CisJaW50CQkgYWRhcHRlclR5cGU7CS8qIFNDU0kgb3IgRkNQICovCisJaW50CQkgcG9ydDsJCS8qIHBvcnQgbnVtYmVyICovCisJaW50CQkgcGNpSWQ7CQkvKiBQQ0kgSWQuICovCisJaW50CQkgaHdSZXY7CQkvKiBoYXJkd2FyZSByZXZpc2lvbiAqLworCWludAkJIHN1YlN5c3RlbURldmljZTsJLyogUENJIHN1YnN5c3RlbSBEZXZpY2UgSUQgKi8KKwlpbnQJCSBzdWJTeXN0ZW1WZW5kb3I7CS8qIFBDSSBzdWJzeXN0ZW0gVmVuZG9yIElEICovCisJaW50CQkgbnVtRGV2aWNlczsJCS8qIG51bWJlciBvZiBkZXZpY2VzICovCisJaW50CQkgRldWZXJzaW9uOwkJLyogRlcgVmVyc2lvbiAoaW50ZWdlcikgKi8KKwlpbnQJCSBCSU9TVmVyc2lvbjsJCS8qIEJJT1MgVmVyc2lvbiAoaW50ZWdlcikgKi8KKwljaGFyCQkgZHJpdmVyVmVyc2lvbltNUFRfSU9DVExfVkVSU0lPTl9MRU5HVEhdOwkvKiBEcml2ZXIgVmVyc2lvbiAoc3RyaW5nKSAqLworCWNoYXIJCSBidXNDaGFuZ2VFdmVudDsKKwljaGFyCQkgaG9zdElkOworCWNoYXIJCSByc3ZkWzJdOworCXN0cnVjdCBtcHRfaW9jdGxfcGNpX2luZm8yICBwY2lJbmZvOyAvKiBBZGRlZCBSZXYgMiAqLworfTsKKworc3RydWN0IG1wdF9pb2N0bF9pb2NpbmZvX3JldjEgeworCW1wdF9pb2N0bF9oZWFkZXIgaGRyOworCWludAkJIGFkYXB0ZXJUeXBlOwkvKiBTQ1NJIG9yIEZDUCAqLworCWludAkJIHBvcnQ7CQkvKiBwb3J0IG51bWJlciAqLworCWludAkJIHBjaUlkOwkJLyogUENJIElkLiAqLworCWludAkJIGh3UmV2OwkJLyogaGFyZHdhcmUgcmV2aXNpb24gKi8KKwlpbnQJCSBzdWJTeXN0ZW1EZXZpY2U7CS8qIFBDSSBzdWJzeXN0ZW0gRGV2aWNlIElEICovCisJaW50CQkgc3ViU3lzdGVtVmVuZG9yOwkvKiBQQ0kgc3Vic3lzdGVtIFZlbmRvciBJRCAqLworCWludAkJIG51bURldmljZXM7CQkvKiBudW1iZXIgb2YgZGV2aWNlcyAqLworCWludAkJIEZXVmVyc2lvbjsJCS8qIEZXIFZlcnNpb24gKGludGVnZXIpICovCisJaW50CQkgQklPU1ZlcnNpb247CQkvKiBCSU9TIFZlcnNpb24gKGludGVnZXIpICovCisJY2hhcgkJIGRyaXZlclZlcnNpb25bTVBUX0lPQ1RMX1ZFUlNJT05fTEVOR1RIXTsJLyogRHJpdmVyIFZlcnNpb24gKHN0cmluZykgKi8KKwljaGFyCQkgYnVzQ2hhbmdlRXZlbnQ7CisJY2hhcgkJIGhvc3RJZDsKKwljaGFyCQkgcnN2ZFsyXTsKKwlzdHJ1Y3QgbXB0X2lvY3RsX3BjaV9pbmZvICBwY2lJbmZvOyAvKiBBZGRlZCBSZXYgMSAqLworfTsKKworLyogT3JpZ2luYWwgc3RydWN0dXJlLCBtdXN0IGFsd2F5cyBhY2NlcHQgdGhlc2UKKyAqIElPQ1RMcy4gNCBieXRlIHBhZHMgY2FuIG9jY3VyIGJhc2VkIG9uIGFyY2ggd2l0aAorICogYWJvdmUgc3RydWN0dXJlLiBXaXNoIHRvIHJlLWFsaWduLCBidXQgY2Fubm90LgorICovCitzdHJ1Y3QgbXB0X2lvY3RsX2lvY2luZm9fcmV2MCB7CisJbXB0X2lvY3RsX2hlYWRlciBoZHI7CisJaW50CQkgYWRhcHRlclR5cGU7CS8qIFNDU0kgb3IgRkNQICovCisJaW50CQkgcG9ydDsJCS8qIHBvcnQgbnVtYmVyICovCisJaW50CQkgcGNpSWQ7CQkvKiBQQ0kgSWQuICovCisJaW50CQkgaHdSZXY7CQkvKiBoYXJkd2FyZSByZXZpc2lvbiAqLworCWludAkJIHN1YlN5c3RlbURldmljZTsJLyogUENJIHN1YnN5c3RlbSBEZXZpY2UgSUQgKi8KKwlpbnQJCSBzdWJTeXN0ZW1WZW5kb3I7CS8qIFBDSSBzdWJzeXN0ZW0gVmVuZG9yIElEICovCisJaW50CQkgbnVtRGV2aWNlczsJCS8qIG51bWJlciBvZiBkZXZpY2VzICovCisJaW50CQkgRldWZXJzaW9uOwkJLyogRlcgVmVyc2lvbiAoaW50ZWdlcikgKi8KKwlpbnQJCSBCSU9TVmVyc2lvbjsJCS8qIEJJT1MgVmVyc2lvbiAoaW50ZWdlcikgKi8KKwljaGFyCQkgZHJpdmVyVmVyc2lvbltNUFRfSU9DVExfVkVSU0lPTl9MRU5HVEhdOwkvKiBEcml2ZXIgVmVyc2lvbiAoc3RyaW5nKSAqLworCWNoYXIJCSBidXNDaGFuZ2VFdmVudDsKKwljaGFyCQkgaG9zdElkOworCWNoYXIJCSByc3ZkWzJdOworfTsKKworLyoKKyAqIERldmljZSBJbmZvcm1hdGlvbiBQYWdlCisgKiBSZXBvcnQgdGhlIG51bWJlciBvZiwgYW5kIGlkcyBvZiwgYWxsIHRhcmdldHMKKyAqIG9uIHRoaXMgSU9DLiAgVGhlIGlkcyBhcnJheSBpcyBhIHBhY2tlZCBzdHJ1Y3R1cmUKKyAqIG9mIHRoZSBrbm93biB0YXJnZXRJbmZvLgorICogYml0cyAzMS0yNDogcmVzZXJ2ZWQKKyAqICAgICAgMjMtMTY6IExVTgorICogICAgICAxNS0gODogQnVzIE51bWJlcgorICogICAgICAgNy0gMDogVGFyZ2V0IElECisgKi8KK3N0cnVjdCBtcHRfaW9jdGxfdGFyZ2V0aW5mbyB7CisJbXB0X2lvY3RsX2hlYWRlciBoZHI7CisJaW50CQkgbnVtRGV2aWNlczsJLyogTnVtIHRhcmdldHMgb24gdGhpcyBpb2MgKi8KKwlpbnQJCSB0YXJnZXRJbmZvWzFdOworfTsKKworCisvKgorICogRXZlbnQgcmVwb3J0aW5nIElPQ1RMJ3MuICBUaGVzZSBJT0NUTCdzIHdpbGwKKyAqIHVzZSB0aGUgZm9sbG93aW5nIGRlZmluZXM6CisgKi8KK3N0cnVjdCBtcHRfaW9jdGxfZXZlbnRxdWVyeSB7CisJbXB0X2lvY3RsX2hlYWRlciBoZHI7CisJdW5zaWduZWQgc2hvcnQJIGV2ZW50RW50cmllczsKKwl1bnNpZ25lZCBzaG9ydAkgcmVzZXJ2ZWQ7CisJdW5zaWduZWQgaW50CSBldmVudFR5cGVzOworfTsKKworc3RydWN0IG1wdF9pb2N0bF9ldmVudGVuYWJsZSB7CisJbXB0X2lvY3RsX2hlYWRlciBoZHI7CisJdW5zaWduZWQgaW50CSBldmVudFR5cGVzOworfTsKKworI2lmbmRlZiBfX0tFUk5FTF9fCit0eXBlZGVmIHN0cnVjdCB7CisJdWludAlldmVudDsKKwl1aW50CWV2ZW50Q29udGV4dDsKKwl1aW50CWRhdGFbMl07Cit9IE1QVF9JT0NUTF9FVkVOVFM7CisjZW5kaWYKKworc3RydWN0IG1wdF9pb2N0bF9ldmVudHJlcG9ydCB7CisJbXB0X2lvY3RsX2hlYWRlcgloZHI7CisJTVBUX0lPQ1RMX0VWRU5UUwlldmVudERhdGFbMV07Cit9OworCisjZGVmaW5lIE1QVF9NQVhfTkFNRQkzMgorc3RydWN0IG1wdF9pb2N0bF90ZXN0IHsKKwltcHRfaW9jdGxfaGVhZGVyIGhkcjsKKwl1OAkJIG5hbWVbTVBUX01BWF9OQU1FXTsKKwlpbnQJCSBjaGlwX3R5cGU7CisJdTgJCSBwcm9kdWN0IFtNUFRfUFJPRFVDVF9MRU5HVEhdOworfTsKKworLyogUmVwbGFjZSB0aGUgRlcgaW1hZ2UgY2FjaGVkIGluIGhvc3QgZHJpdmVyIG1lbW9yeQorICogbmV3SW1hZ2VTaXplIC0gaW1hZ2Ugc2l6ZSBpbiBieXRlcworICogbmV3SW1hZ2UgLSBmaXJzdCBieXRlIG9mIHRoZSBuZXcgaW1hZ2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgbXB0X2lvY3RsX3JlcGxhY2VfZncgeworCW1wdF9pb2N0bF9oZWFkZXIgaGRyOworCWludAkJIG5ld0ltYWdlU2l6ZTsKKwl1OAkJIG5ld0ltYWdlWzFdOworfSBtcHRfaW9jdGxfcmVwbGFjZV9md190OworCisvKiBHZW5lcmFsIE1QVCBQYXNzIHRocm91Z2ggZGF0YSBzdHJ1Y3V0cmUKKyAqCisgKiBpb2NudW0KKyAqIHRpbWVvdXQgLSBpbiBzZWNvbmRzLCBjb21tYW5kIHRpbWVvdXQuIElmIDAsIHNldCBieSBkcml2ZXIgdG8KKyAqCQlkZWZhdWx0IHZhbHVlLgorICogcmVwbHlGcmFtZUJ1ZlB0ciAtIHJlcGx5IGxvY2F0aW9uCisgKiBkYXRhSW5CdWZQdHIgLSBkZXN0aW5hdGlvbiBmb3IgcmVhZAorICogZGF0YU91dEJ1ZlB0ciAtIGRhdGEgc291cmNlIGZvciB3cml0ZQorICogc2Vuc2VEYXRhUHRyIC0gc2Vuc2UgZGF0YSBsb2NhdGlvbgorICogbWF4UmVwbHlCeXRlcyAtIG1heGltdW0gbnVtYmVyIG9mIHJlcGx5IGJ5dGVzIHRvIGJlIHNlbnQgdG8gYXBwLgorICogZGF0YUluU2l6ZSAtIG51bSBieXRlcyBmb3IgZGF0YSB0cmFuc2ZlciBpbiAocmVhZCkKKyAqIGRhdGFPdXRTaXplIC0gbnVtIGJ5dGVzIGZvciBkYXRhIHRyYW5zZmVyIG91dCAod3JpdGUpCisgKiBkYXRhU2dlT2Zmc2V0IC0gb2Zmc2V0IGluIHdvcmRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSByZXF1ZXN0IG1lc3NhZ2UKKyAqCQl0byB0aGUgZmlyc3QgU0dMCisgKiBNRlsxXTsKKyAqCisgKiBSZW1hcms6ICBTb21lIGNvbmZpZyBwYWdlcyBoYXZlIGJpLWRpcmVjdGlvbmFsIHRyYW5zZmVyLAorICogYm90aCBhIHJlYWQgYW5kIGEgd3JpdGUuIFRoZSBiYXNpYyBzdHJ1Y3R1cmUgYWxsb3dzIGZvcgorICogYSBiaWRpcmVjdGlvbmFsIHNldCB1cC4gTm9ybWFsIG1lc3NhZ2VzIHdpbGwgaGF2ZSBvbmUgb3IKKyAqIGJvdGggb2YgdGhlc2UgYnVmZmVycyBOVUxMLgorICovCitzdHJ1Y3QgbXB0X2lvY3RsX2NvbW1hbmQgeworCW1wdF9pb2N0bF9oZWFkZXIgaGRyOworCWludAkJdGltZW91dDsJLyogb3B0aW9uYWwgKHNlY29uZHMpICovCisJY2hhcgkJX191c2VyICpyZXBseUZyYW1lQnVmUHRyOworCWNoYXIJCV9fdXNlciAqZGF0YUluQnVmUHRyOworCWNoYXIJCV9fdXNlciAqZGF0YU91dEJ1ZlB0cjsKKwljaGFyCQlfX3VzZXIgKnNlbnNlRGF0YVB0cjsKKwlpbnQJCW1heFJlcGx5Qnl0ZXM7CisJaW50CQlkYXRhSW5TaXplOworCWludAkJZGF0YU91dFNpemU7CisJaW50CQltYXhTZW5zZUJ5dGVzOworCWludAkJZGF0YVNnZU9mZnNldDsKKwljaGFyCQlNRlsxXTsKK307CisKKy8qCisgKiBTUEFSQyBQTEFURk9STTogU2VlIGVhcmxpZXIgcmVtYXJrLgorICovCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSAmJiBkZWZpbmVkKENPTkZJR19DT01QQVQpCitzdHJ1Y3QgbXB0X2lvY3RsX2NvbW1hbmQzMiB7CisJbXB0X2lvY3RsX2hlYWRlciBoZHI7CisJaW50CXRpbWVvdXQ7CisJdTMyCXJlcGx5RnJhbWVCdWZQdHI7CisJdTMyCWRhdGFJbkJ1ZlB0cjsKKwl1MzIJZGF0YU91dEJ1ZlB0cjsKKwl1MzIJc2Vuc2VEYXRhUHRyOworCWludAltYXhSZXBseUJ5dGVzOworCWludAlkYXRhSW5TaXplOworCWludAlkYXRhT3V0U2l6ZTsKKwlpbnQJbWF4U2Vuc2VCeXRlczsKKwlpbnQJZGF0YVNnZU9mZnNldDsKKwljaGFyCU1GWzFdOworfTsKKyNlbmRpZgkvKn0qLworCisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKglIUCBTcGVjaWZpYyBJT0NUTCBEZWZpbmVzIGFuZCBTdHJ1Y3R1cmVzCisgKi8KKworI2RlZmluZSBDUFFGQ1RTX0lPQ19NQUdJQyAnWicKKyNkZWZpbmUgSFBfSU9DX01BR0lDICdaJworI2RlZmluZSBIUF9HRVRIT1NUSU5GTwkJX0lPUihIUF9JT0NfTUFHSUMsIDIwLCBocF9ob3N0X2luZm9fdCkKKyNkZWZpbmUgSFBfR0VUSE9TVElORk8xCQlfSU9SKEhQX0lPQ19NQUdJQywgMjAsIGhwX2hvc3RfaW5mb19yZXYwX3QpCisjZGVmaW5lIEhQX0dFVFRBUkdFVElORk8JX0lPUihIUF9JT0NfTUFHSUMsIDIxLCBocF90YXJnZXRfaW5mb190KQorCisvKiBBbGwgSFAgSU9DVExzIG11c3QgaW5jbHVkZSB0aGlzIGhlYWRlcgorICovCit0eXBlZGVmIHN0cnVjdCBfaHBfaGVhZGVyIHsKKwl1bnNpZ25lZCBpbnQgaW9jbnVtOworCXVuc2lnbmVkIGludCBob3N0OworCXVuc2lnbmVkIGludCBjaGFubmVsOworCXVuc2lnbmVkIGludCBpZDsKKwl1bnNpZ25lZCBpbnQgbHVuOworfSBocF9oZWFkZXJfdDsKKworLyoKKyAqICBIZWFkZXI6CisgKiAgaW9jbnVtIAlyZXF1aXJlZCAoaW5wdXQpCisgKiAgaG9zdCAJaWdub3JlZAorICogIGNoYW5uZQlpZ25vcmVkCisgKiAgaWQJCWlnbm9yZWQKKyAqICBsdW4JCWlnbm9yZWQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX2hwX2hvc3RfaW5mbyB7CisJaHBfaGVhZGVyX3QJIGhkcjsKKwl1MTYJCSB2ZW5kb3I7CisJdTE2CQkgZGV2aWNlOworCXUxNgkJIHN1YnN5c3RlbV92ZW5kb3I7CisJdTE2CQkgc3Vic3lzdGVtX2lkOworCXU4CQkgZGV2Zm47CisJdTgJCSBidXM7CisJdXNob3J0CQkgaG9zdF9ubzsJCS8qIFNDU0kgSG9zdCBudW1iZXIsIGlmIHNjc2kgZHJpdmVyIG5vdCBsb2FkZWQqLworCXU4CQkgZndfdmVyc2lvblsxNl07CS8qIHN0cmluZyAqLworCXU4CQkgc2VyaWFsX251bWJlclsyNF07CS8qIHN0cmluZyAqLworCXUzMgkJIGlvY19zdGF0dXM7CisJdTMyCQkgYnVzX3BoeXNfd2lkdGg7CisJdTMyCQkgYmFzZV9pb19hZGRyOworCXUzMgkJIHJzdmQ7CisJdW5zaWduZWQgaW50CSBoYXJkX3Jlc2V0czsJCS8qIGRyaXZlciBpbml0aWF0ZWQgcmVzZXRzICovCisJdW5zaWduZWQgaW50CSBzb2Z0X3Jlc2V0czsJCS8qIGlvYywgZXh0ZXJuYWwgcmVzZXRzICovCisJdW5zaWduZWQgaW50CSB0aW1lb3V0czsJCS8qIG51bSB0aW1lb3V0cyAqLworfSBocF9ob3N0X2luZm9fdDsKKworLyogcmVwbGFjZSB1bG9uZ3Mgd2l0aCB1aW50cywgbmVlZCB0byBwcmVzZXJ2ZSBiYWNrd2FyZHMKKyAqIGNvbXBhdGliaWxpdHkuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9ocF9ob3N0X2luZm9fcmV2MCB7CisJaHBfaGVhZGVyX3QJIGhkcjsKKwl1MTYJCSB2ZW5kb3I7CisJdTE2CQkgZGV2aWNlOworCXUxNgkJIHN1YnN5c3RlbV92ZW5kb3I7CisJdTE2CQkgc3Vic3lzdGVtX2lkOworCXU4CQkgZGV2Zm47CisJdTgJCSBidXM7CisJdXNob3J0CQkgaG9zdF9ubzsJCS8qIFNDU0kgSG9zdCBudW1iZXIsIGlmIHNjc2kgZHJpdmVyIG5vdCBsb2FkZWQqLworCXU4CQkgZndfdmVyc2lvblsxNl07CS8qIHN0cmluZyAqLworCXU4CQkgc2VyaWFsX251bWJlclsyNF07CS8qIHN0cmluZyAqLworCXUzMgkJIGlvY19zdGF0dXM7CisJdTMyCQkgYnVzX3BoeXNfd2lkdGg7CisJdTMyCQkgYmFzZV9pb19hZGRyOworCXUzMgkJIHJzdmQ7CisJdW5zaWduZWQgbG9uZwkgaGFyZF9yZXNldHM7CQkvKiBkcml2ZXIgaW5pdGlhdGVkIHJlc2V0cyAqLworCXVuc2lnbmVkIGxvbmcJIHNvZnRfcmVzZXRzOwkJLyogaW9jLCBleHRlcm5hbCByZXNldHMgKi8KKwl1bnNpZ25lZCBsb25nCSB0aW1lb3V0czsJCS8qIG51bSB0aW1lb3V0cyAqLworfSBocF9ob3N0X2luZm9fcmV2MF90OworCisvKgorICogIEhlYWRlcjoKKyAqICBpb2NudW0gCXJlcXVpcmVkIChpbnB1dCkKKyAqICBob3N0IAlyZXF1aXJlZAorICogIGNoYW5uZWwJcmVxdWlyZWQJKGJ1cyBudW1iZXIpCisgKiAgaWQJCXJlcXVpcmVkCisgKiAgbHVuCQlpZ25vcmVkCisgKgorICogIEFsbCBlcnJvciB2YWx1ZXMgYmV0d2VlbiAwIGFuZCAweEZGRkYgaW4gc2l6ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX2hwX3RhcmdldF9pbmZvIHsKKwlocF9oZWFkZXJfdAkgaGRyOworCXUzMiBwYXJpdHlfZXJyb3JzOworCXUzMiBwaGFzZV9lcnJvcnM7CisJdTMyIHNlbGVjdF90aW1lb3V0czsKKwl1MzIgbWVzc2FnZV9yZWplY3RzOworCXUzMiBuZWdvdGlhdGVkX3NwZWVkOworCXU4ICBuZWdvdGlhdGVkX3dpZHRoOworCXU4ICByc3ZkWzddOwkJCQkvKiA4IGJ5dGUgYWxpZ25tZW50ICovCit9IGhwX3RhcmdldF9pbmZvX3Q7CisKKyNkZWZpbmUgSFBfU1RBVFVTX09USEVSCQkxCisjZGVmaW5lIEhQX1NUQVRVU19PSwkJMgorI2RlZmluZSBIUF9TVEFUVVNfRkFJTEVECTMKKworI2RlZmluZSBIUF9CVVNfV0lEVEhfVU5LCTEKKyNkZWZpbmUgSFBfQlVTX1dJRFRIXzgJCTIKKyNkZWZpbmUgSFBfQlVTX1dJRFRIXzE2CQkzCisjZGVmaW5lIEhQX0JVU19XSURUSF8zMgkJNAorCisjZGVmaW5lIEhQX0RFVl9TUEVFRF9BU1lOQwkyCisjZGVmaW5lIEhQX0RFVl9TUEVFRF9GQVNUCTMKKyNkZWZpbmUgSFBfREVWX1NQRUVEX1VMVFJBCTQKKyNkZWZpbmUgSFBfREVWX1NQRUVEX1VMVFJBMgk1CisjZGVmaW5lIEhQX0RFVl9TUEVFRF9VTFRSQTE2MAk2CisjZGVmaW5lIEhQX0RFVl9TUEVFRF9TQ1NJMQk3CisjZGVmaW5lIEhQX0RFVl9TUEVFRF9VTFRSQTMyMAk4CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKworCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGxhbi5jIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRsYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjI3MTNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRsYW4uYwpAQCAtMCwwICsxLDE2ODggQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRsYW4uYworICogICAgICBJUCBPdmVyIEZpYnJlIENoYW5uZWwgZGV2aWNlIGRyaXZlci4KKyAqICAgICAgRm9yIHVzZSB3aXRoIFBDSSBjaGlwL2FkYXB0ZXIocyk6CisgKiAgICAgICAgICBMU0lGQzl4eC9MU0k0MDl4eCBGaWJyZSBDaGFubmVsCisgKiAgICAgIHJ1bm5pbmcgTFNJIExvZ2ljIEZ1c2lvbiBNUFQgKE1lc3NhZ2UgUGFzc2luZyBUZWNobm9sb2d5KSBmaXJtd2FyZS4KKyAqCisgKiAgQ3JlZGl0czoKKyAqICAgICAgVGhpcyBkcml2ZXIgd291bGQgbm90IGV4aXN0IGlmIG5vdCBmb3IgQWxhbiBDb3gncyBkZXZlbG9wbWVudAorICogICAgICBvZiB0aGUgbGludXggaTJvIGRyaXZlci4KKyAqCisgKiAgICAgIFNwZWNpYWwgdGhhbmtzIGdvZXMgdG8gdGhlIEkyTyBMQU4gZHJpdmVyIHBlb3BsZSBhdCB0aGUKKyAqICAgICAgVW5pdmVyc2l0eSBvZiBIZWxzaW5raSwgd2hvLCB1bmJla25vd25zdCB0byB0aGVtLCBwcm92aWRlZAorICogICAgICB0aGUgaW5zcGlyYXRpb24gYW5kIGluaXRpYWwgc3RydWN0dXJlIGZvciB0aGlzIGRyaXZlci4KKyAqCisgKiAgICAgIEEgaHVnZSBkZWJ0IG9mIGdyYXRpdHVkZSBpcyBvd2VkIHRvIERhdmlkIFMuIE1pbGxlciAoRGF2ZU0pCisgKiAgICAgIGZvciBmaXhpbmcgbXVjaCBvZiB0aGUgc3R1cGlkIGFuZCBicm9rZW4gc3R1ZmYgaW4gdGhlIGVhcmx5CisgKiAgICAgIGRyaXZlciB3aGlsZSBwb3J0aW5nIHRvIHNwYXJjNjQgcGxhdGZvcm0uICBUSEFOSyBZT1UhCisgKgorICogICAgICBBIHJlYWxseSBodWdlIGRlYnQgb2YgZ3JhdGl0dWRlIGlzIG93ZWQgdG8gRWRkaWUgQy4gRG9zdAorICogICAgICBmb3IgZ29icyBvZiBoYXJkIHdvcmsgZml4aW5nIGFuZCBvcHRpbWl6aW5nIExBTiBjb2RlLgorICogICAgICBUSEFOSyBZT1UhCisgKgorICogICAgICAoc2VlIGFsc28gbXB0YmFzZS5jKQorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBMU0kgTG9naWMgQ29ycG9yYXRpb24KKyAqICBPcmlnaW5hbGx5IEJ5OiBOb2FoIFJvbWVyCisgKiAgKG1haWx0bzptcHRfbGludXhfZGV2ZWxvcGVyQGxzaWwuY29tKQorICoKKyAqICAkSWQ6IG1wdGxhbi5jLHYgMS41MyAyMDAyLzEwLzE3IDIwOjE1OjU4IHBkZWxhbmV5IEV4cCAkCisgKi8KKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBOTyBXQVJSQU5UWQorICAgIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgorICAgIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUCisgICAgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKKyAgICBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzCisgICAgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorICAgIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworICAgIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsCisgICAgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisKKyAgICBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorICAgIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCisgICAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICAgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQKKyAgICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyAgICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgICAgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECisgICAgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUworCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKiBEZWZpbmUgc3RhdGVtZW50cyB1c2VkIGZvciBkZWJ1Z2dpbmcKKyAqLworLy8jZGVmaW5lIE1QVF9MQU5fSU9fREVCVUcKKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworCisjaW5jbHVkZSAibXB0bGFuLmgiCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKyNkZWZpbmUgTVlOQU0JCSJtcHRsYW4iCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqIE1QVCBMQU4gbWVzc2FnZSBzaXplcyB3aXRob3V0IHZhcmlhYmxlIHBhcnQuCisgKi8KKyNkZWZpbmUgTVBUX0xBTl9SRUNFSVZFX1BPU1RfUkVRVUVTVF9TSVpFIFwKKwkoc2l6ZW9mKExBTlJlY2VpdmVQb3N0UmVxdWVzdF90KSAtIHNpemVvZihTR0VfTVBJX1VOSU9OKSkKKworI2RlZmluZSBNUFRfTEFOX1RSQU5TQUNUSU9OMzJfU0laRSBcCisJKHNpemVvZihTR0VUcmFuc2FjdGlvbjMyX3QpIC0gc2l6ZW9mKHUzMikpCisKKy8qCisgKiAgRnVzaW9uIE1QVCBMQU4gcHJpdmF0ZSBzdHJ1Y3R1cmVzCisgKi8KKworc3RydWN0IE5BQV9Ib3NlZCB7CisJdTE2IE5BQTsKKwl1OCBpZWVlW0ZDX0FMRU5dOworCXN0cnVjdCBOQUFfSG9zZWQgKm5leHQ7Cit9OworCitzdHJ1Y3QgQnVmZmVyQ29udHJvbCB7CisJc3RydWN0IHNrX2J1ZmYJKnNrYjsKKwlkbWFfYWRkcl90CWRtYTsKKwl1bnNpZ25lZCBpbnQJbGVuOworfTsKKworc3RydWN0IG1wdF9sYW5fcHJpdiB7CisJTVBUX0FEQVBURVIgKm1wdF9kZXY7CisJdTggcG51bTsgLyogUG9ydCBudW1iZXIgaW4gdGhlIElPQy4gVGhpcyBpcyBub3QgYSBVbml4IG5ldHdvcmsgcG9ydCEgKi8KKworCWF0b21pY190IGJ1Y2tldHNfb3V0OwkJLyogbnVtYmVyIG9mIHVudXNlZCBidWNrZXRzIG9uIElPQyAqLworCWludCBidWNrZXR0aHJlc2g7CQkvKiBTZW5kIG1vcmUgd2hlbiB0aGlzIG1hbnkgbGVmdCAqLworCisJaW50ICptcHRfdHhmaWR4OyAvKiBGcmVlIFR4IENvbnRleHQgbGlzdCAqLworCWludCBtcHRfdHhmaWR4X3RhaWw7CisJc3BpbmxvY2tfdCB0eGZpZHhfbG9jazsKKworCWludCAqbXB0X3J4ZmlkeDsgLyogRnJlZSBSeCBDb250ZXh0IGxpc3QgKi8KKwlpbnQgbXB0X3J4ZmlkeF90YWlsOworCXNwaW5sb2NrX3QgcnhmaWR4X2xvY2s7CisKKwlzdHJ1Y3QgQnVmZmVyQ29udHJvbCAqUmN2Q3RsOwkvKiBSZWNlaXZlIEJ1ZmZlckNvbnRyb2wgc3RydWN0cyAqLworCXN0cnVjdCBCdWZmZXJDb250cm9sICpTZW5kQ3RsOwkvKiBTZW5kIEJ1ZmZlckNvbnRyb2wgc3RydWN0cyAqLworCisJaW50IG1heF9idWNrZXRzX291dDsJCS8qIE1heCBidWNrZXRzIHRvIHNlbmQgdG8gSU9DICovCisJaW50IHR4X21heF9vdXQ7CQkJLyogSU9DJ3MgVHggcXVldWUgbGVuICovCisKKwl1MzIgdG90YWxfcG9zdGVkOworCXUzMiB0b3RhbF9yZWNlaXZlZDsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJLyogUGVyIGRldmljZSBzdGF0aXN0aWNzICovCisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcG9zdF9idWNrZXRzX3Rhc2s7CisJdW5zaWduZWQgbG9uZyBwb3N0X2J1Y2tldHNfYWN0aXZlOworfTsKKworc3RydWN0IG1wdF9sYW5fb2hkciB7CisJdTE2CWR0eXBlOworCXU4CWRhZGRyW0ZDX0FMRU5dOworCXUxNglzdHlwZTsKKwl1OAlzYWRkcltGQ19BTEVOXTsKK307CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKworLyoKKyAqICBGb3J3YXJkIHByb3Rvcy4uLgorICovCitzdGF0aWMgaW50ICBsYW5fcmVwbHkgKE1QVF9BREFQVEVSICppb2MsIE1QVF9GUkFNRV9IRFIgKm1mLAorCQkgICAgICAgTVBUX0ZSQU1FX0hEUiAqcmVwbHkpOworc3RhdGljIGludCAgbXB0X2xhbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgbXB0X2xhbl9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIG1wdF9sYW5fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBtcHRfbGFuX3Bvc3RfcmVjZWl2ZV9idWNrZXRzKHZvaWQgKmRldl9pZCk7CitzdGF0aWMgdm9pZCBtcHRfbGFuX3dha2VfcG9zdF9idWNrZXRzX3Rhc2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgaW50IHByaW9yaXR5KTsKK3N0YXRpYyBpbnQgIG1wdF9sYW5fcmVjZWl2ZV9wb3N0X3R1cmJvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB0bXNnKTsKK3N0YXRpYyBpbnQgIG1wdF9sYW5fcmVjZWl2ZV9wb3N0X3JlcGx5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIExBTlJlY2VpdmVQb3N0UmVwbHlfdCAqcFJlY3ZSZXApOworc3RhdGljIGludCAgbXB0X2xhbl9zZW5kX3R1cmJvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB0bXNnKTsKK3N0YXRpYyBpbnQgIG1wdF9sYW5fc2VuZF9yZXBseShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIExBTlNlbmRSZXBseV90ICpwU2VuZFJlcCk7CitzdGF0aWMgaW50ICBtcHRfbGFuX2lvY19yZXNldChNUFRfQURBUFRFUiAqaW9jLCBpbnQgcmVzZXRfcGhhc2UpOworc3RhdGljIGludCAgbXB0X2xhbl9ldmVudF9wcm9jZXNzKE1QVF9BREFQVEVSICppb2MsIEV2ZW50Tm90aWZpY2F0aW9uUmVwbHlfdCAqcEV2UmVwbHkpOworc3RhdGljIHVuc2lnbmVkIHNob3J0IG1wdF9sYW5fdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKiAgRnVzaW9uIE1QVCBMQU4gcHJpdmF0ZSBkYXRhCisgKi8KK3N0YXRpYyBpbnQgTGFuQ3R4ID0gLTE7CisKK3N0YXRpYyB1MzIgbWF4X2J1Y2tldHNfb3V0ID0gMTI3Oworc3RhdGljIHUzMiB0eF9tYXhfb3V0X3AgPSAxMjcgLSAxNjsKKworI2lmZGVmIFFMT0dJQ19OQUFfV09SS0FST1VORAorc3RhdGljIHN0cnVjdCBOQUFfSG9zZWQgKm1wdF9iYWRfbmFhID0gTlVMTDsKK0RFRklORV9SV0xPQ0soYmFkX25hYV9sb2NrKTsKKyNlbmRpZgorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICogRnVzaW9uIE1QVCBMQU4gZXh0ZXJuYWwgZGF0YQorICovCitleHRlcm4gaW50IG1wdF9sYW5faW5kZXg7CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qKgorICoJbGFuX3JlcGx5IC0gSGFuZGxlIGFsbCBkYXRhIHNlbnQgZnJvbSB0aGUgaGFyZHdhcmUuCisgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQorICoJQG1mOiBQb2ludGVyIHRvIG9yaWdpbmFsIE1QVCByZXF1ZXN0IGZyYW1lIChOVUxMIGlmIFR1cmJvUmVwbHkpCisgKglAcmVwbHk6IFBvaW50ZXIgdG8gTVBUIHJlcGx5IGZyYW1lCisgKgorICoJUmV0dXJucyAxIGluZGljYXRpbmcgb3JpZ2luYWwgYWxsb2MnZCByZXF1ZXN0IGZyYW1lIHB0cgorICoJc2hvdWxkIGJlIGZyZWVkLCBvciAwIGlmIGl0IHNob3VsZG4ndC4KKyAqLworc3RhdGljIGludAorbGFuX3JlcGx5IChNUFRfQURBUFRFUiAqaW9jLCBNUFRfRlJBTUVfSERSICptZiwgTVBUX0ZSQU1FX0hEUiAqcmVwbHkpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGlvYy0+bmV0ZGV2OworCWludCBGcmVlUmVxRnJhbWUgPSAwOworCisJZGlvcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXMvJXM6IEdvdCByZXBseS5cbiIsCisJCSAgSU9DX0FORF9ORVRERVZfTkFNRVNfc19zKGRldikpKTsKKworLy8JZGlvcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIkBsYW5fcmVwbHk6IG1mID0gJXAsIHJlcGx5ID0gJXBcbiIsCisvLwkJCW1mLCByZXBseSkpOworCisJaWYgKG1mID09IE5VTEwpIHsKKwkJdTMyIHRtc2cgPSBDQVNUX1BUUl9UT19VMzIocmVwbHkpOworCisJCWRpb3ByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzLyVzOiBAbGFuX3JlcGx5LCB0bXNnICUwOHhcbiIsCisJCQkJSU9DX0FORF9ORVRERVZfTkFNRVNfc19zKGRldiksCisJCQkJdG1zZykpOworCisJCXN3aXRjaCAoR0VUX0xBTl9GT1JNKHRtc2cpKSB7CisKKwkJLy8gTk9URSEgIChPcHRpbWl6YXRpb24pIEZpcnN0IGNhc2UgaGVyZSBpcyBub3cgY2F1Z2h0IGluCisJCS8vICBtcHRiYXNlLmM6Om1wdF9pbnRlcnJ1cHQoKSByb3V0aW5lIGFuZCBjYWxsY2FjayBoZXJlCisJCS8vICBpcyBub3cgc2tpcHBlZCBmb3IgdGhpcyBjYXNlISAgMjAwMDEyMTggLXNyYWxzdG9uCisjaWYgMAorCQljYXNlIExBTl9SRVBMWV9GT1JNX01FU1NBR0VfQ09OVEVYVDoKKy8vCQkJZGlvcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIi9sYW5fcmVwbHk6ICIKKy8vCQkJCSAgIk1lc3NhZ2VDb250ZXh0IHR1cmJvIHJlcGx5IHJlY2VpdmVkXG4iKSk7CisJCQlGcmVlUmVxRnJhbWUgPSAxOworCQkJYnJlYWs7CisjZW5kaWYKKworCQljYXNlIExBTl9SRVBMWV9GT1JNX1NFTkRfU0lOR0xFOgorLy8JCQlkaW9wcmludGsoKE1ZTkFNICIvbGFuX3JlcGx5OiAiCisvLwkJCQkgICJjYWxsaW5nIG1wdF9sYW5fc2VuZF9yZXBseSAodHVyYm8pXG4iKSk7CisKKwkJCS8vIFBvdGVudGlhbCBCVUcgaGVyZT8gIC1zcmFsc3RvbgorCQkJLy8JRnJlZVJlcUZyYW1lID0gbXB0X2xhbl9zZW5kX3R1cmJvKGRldiwgdG1zZyk7CisJCQkvLyAgSWYvd2hlbiBtcHRfbGFuX3NlbmRfdHVyYm8gd291bGQgcmV0dXJuIDEgaGVyZSwKKwkJCS8vICBjYWxsaW5nIHJvdXRpbmUgKG1wdGJhc2UuY3xtcHRfaW50ZXJydXB0KQorCQkJLy8gIHdvdWxkIE9vcHMgYmVjYXVzZSBtZiBoYXMgYWxyZWFkeSBiZWVuIHNldAorCQkJLy8gIHRvIE5VTEwuICBTbyBhZnRlciByZXR1cm4gZnJvbSB0aGlzIGZ1bmMsCisJCQkvLyAgbXB0X2ludGVycnVwdCgpIHdpbGwgYXR0ZW1wdCB0byBwdXQgKE5VTEwpIG1mIHB0cgorCQkJLy8gIGl0ZW0gYmFjayBvbnRvIGl0cyBhZGFwdGVyIEZyZWVRIC0gT29wcyE6LSgKKwkJCS8vICBJdCdzIE9rLCBzaW5jZSBtcHRfbGFuX3NlbmRfdHVyYm8oKSAqY3VycmVudGx5KgorCQkJLy8gIGFsd2F5cyByZXR1cm5zIDAsIGJ1dC4uLiwganVzdCBpbiBjYXNlOgorCisJCQkodm9pZCkgbXB0X2xhbl9zZW5kX3R1cmJvKGRldiwgdG1zZyk7CisJCQlGcmVlUmVxRnJhbWUgPSAwOworCisJCQlicmVhazsKKworCQljYXNlIExBTl9SRVBMWV9GT1JNX1JFQ0VJVkVfU0lOR0xFOgorLy8JCQlkaW9wcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiQGxhbl9yZXBseTogIgorLy8JCQkJICAicmN2LVR1cmJvID0gJTA4eFxuIiwgdG1zZykpOworCQkJbXB0X2xhbl9yZWNlaXZlX3Bvc3RfdHVyYm8oZGV2LCB0bXNnKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsgKEtFUk5fRVJSIE1ZTkFNICIvbGFuX3JlcGx5OiBHb3QgYSB0dXJibyByZXBseSAiCisJCQkJInRoYXQgSSBkb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aFxuIik7CisKKwkJCS8qIENIRUNLTUUhICBIbW1tLi4uICBGcmVlUmVxRnJhbWUgaXMgMCBoZXJlOyBpcyB0aGF0IHJpZ2h0PyAqLworCisJCQlicmVhazsKKwkJfQorCisJCXJldHVybiBGcmVlUmVxRnJhbWU7CisJfQorCisvLwltc2cgPSAodTMyICopIHJlcGx5OworLy8JZGlvcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIkBsYW5fcmVwbHk6IG1zZyA9ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCisvLwkJICBsZTMyX3RvX2NwdShtc2dbMF0pLCBsZTMyX3RvX2NwdShtc2dbMV0pLAorLy8JCSAgbGUzMl90b19jcHUobXNnWzJdKSwgbGUzMl90b19jcHUobXNnWzNdKSkpOworLy8JZGlvcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIkBsYW5fcmVwbHk6IEZ1bmN0aW9uID0gJTAyeGhcbiIsCisvLwkJICByZXBseS0+dS5oZHIuRnVuY3Rpb24pKTsKKworCXN3aXRjaCAocmVwbHktPnUuaGRyLkZ1bmN0aW9uKSB7CisKKwljYXNlIE1QSV9GVU5DVElPTl9MQU5fU0VORDoKKwl7CisJCUxBTlNlbmRSZXBseV90ICpwU2VuZFJlcDsKKworCQlwU2VuZFJlcCA9IChMQU5TZW5kUmVwbHlfdCAqKSByZXBseTsKKwkJRnJlZVJlcUZyYW1lID0gbXB0X2xhbl9zZW5kX3JlcGx5KGRldiwgcFNlbmRSZXApOworCQlicmVhazsKKwl9CisKKwljYXNlIE1QSV9GVU5DVElPTl9MQU5fUkVDRUlWRToKKwl7CisJCUxBTlJlY2VpdmVQb3N0UmVwbHlfdCAqcFJlY3ZSZXA7CisKKwkJcFJlY3ZSZXAgPSAoTEFOUmVjZWl2ZVBvc3RSZXBseV90ICopIHJlcGx5OworCQlpZiAocFJlY3ZSZXAtPk51bWJlck9mQ29udGV4dHMpIHsKKwkJCW1wdF9sYW5fcmVjZWl2ZV9wb3N0X3JlcGx5KGRldiwgcFJlY3ZSZXApOworCQkJaWYgKCEocFJlY3ZSZXAtPk1zZ0ZsYWdzICYgTVBJX01TR0ZMQUdTX0NPTlRJTlVBVElPTl9SRVBMWSkpCisJCQkJRnJlZVJlcUZyYW1lID0gMTsKKwkJfSBlbHNlCisJCQlkaW9wcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiQGxhbl9yZXBseTogemVybyBjb250ZXh0ICIKKwkJCQkgICJSZWNlaXZlUG9zdFJlcGx5IHJlY2VpdmVkLlxuIikpOworCQlicmVhazsKKwl9CisKKwljYXNlIE1QSV9GVU5DVElPTl9MQU5fUkVTRVQ6CisJCS8qIEp1c3QgYSBkZWZhdWx0IHJlcGx5LiBNaWdodCB3YW50IHRvIGNoZWNrIGl0IHRvCisJCSAqIG1ha2Ugc3VyZSB0aGF0IGV2ZXJ5dGhpbmcgd2VudCBvay4KKwkJICovCisJCUZyZWVSZXFGcmFtZSA9IDE7CisJCWJyZWFrOworCisJY2FzZSBNUElfRlVOQ1RJT05fRVZFTlRfTk9USUZJQ0FUSU9OOgorCWNhc2UgTVBJX0ZVTkNUSU9OX0VWRU5UX0FDSzoKKwkJLyogVVBEQVRFISAgMjAwMTAxMjAgLXNyYWxzdG9uCisJCSAqICBfRVZFTlRfTk9USUZJQ0FUSU9OIHNob3VsZCBOT1QgY29tZSBkb3duIHRoaXMgcGF0aCBhbnkgbW9yZS4KKwkJICogIFNob3VsZCBiZSByb3V0ZWQgdG8gbXB0X2xhbl9ldmVudF9wcm9jZXNzKCksIGJ1dCBqdXN0IGluIGNhc2UuLi4KKwkJICovCisJCUZyZWVSZXFGcmFtZSA9IDE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrIChLRVJOX0VSUiBNWU5BTSAiL2xhbl9yZXBseTogR290IGEgbm9uLXR1cmJvICIKKwkJCSJyZXBseSB0aGF0IEkgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGhcbiIpOworCisJCS8qIENIRUNLTUUhICBIbW1tLi4uICBGcmVlUmVxRnJhbWUgaXMgMCBoZXJlOyBpcyB0aGF0IHJpZ2h0PyAqLworCQlGcmVlUmVxRnJhbWUgPSAxOworCisJCWJyZWFrOworCX0KKworCXJldHVybiBGcmVlUmVxRnJhbWU7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KK3N0YXRpYyBpbnQKK21wdF9sYW5faW9jX3Jlc2V0KE1QVF9BREFQVEVSICppb2MsIGludCByZXNldF9waGFzZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaW9jLT5uZXRkZXY7CisJc3RydWN0IG1wdF9sYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlkbHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IElPQyAlc19yZXNldCByb3V0ZWQgdG8gTEFOIGRyaXZlciFcbiIsCisJCQlyZXNldF9waGFzZT09TVBUX0lPQ19TRVRVUF9SRVNFVCA/ICJzZXR1cCIgOiAoCisJCQlyZXNldF9waGFzZT09TVBUX0lPQ19QUkVfUkVTRVQgPyAicHJlIiA6ICJwb3N0IikpKTsKKworCWlmIChwcml2LT5tcHRfcnhmaWR4ID09IE5VTEwpCisJCXJldHVybiAoMSk7CisKKwlpZiAocmVzZXRfcGhhc2UgPT0gTVBUX0lPQ19TRVRVUF9SRVNFVCkgeworCQk7CisJfSBlbHNlIGlmIChyZXNldF9waGFzZSA9PSBNUFRfSU9DX1BSRV9SRVNFVCkgeworCQlpbnQgaTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkJZGxwcmludGsgKChLRVJOX0lORk8gIm1wdGxhbi9pb2NfcmVzZXQ6IGNhbGxlZCBuZXRpZl9zdG9wX3F1ZXVlIGZvciAlcy5cbiIsIGRldi0+bmFtZSkpOworCisJCWF0b21pY19zZXQoJnByaXYtPmJ1Y2tldHNfb3V0LCAwKTsKKworCQkvKiBSZXNldCBSeCBGcmVlIFRhaWwgaW5kZXggYW5kIHJlLXBvcHVsYXRlIHRoZSBxdWV1ZS4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4ZmlkeF9sb2NrLCBmbGFncyk7CisJCXByaXYtPm1wdF9yeGZpZHhfdGFpbCA9IC0xOworCQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+bWF4X2J1Y2tldHNfb3V0OyBpKyspCisJCQlwcml2LT5tcHRfcnhmaWR4WysrcHJpdi0+bXB0X3J4ZmlkeF90YWlsXSA9IGk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4ZmlkeF9sb2NrLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJbXB0X2xhbl9wb3N0X3JlY2VpdmVfYnVja2V0cyhkZXYpOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KK3N0YXRpYyBpbnQKK21wdF9sYW5fZXZlbnRfcHJvY2VzcyhNUFRfQURBUFRFUiAqaW9jLCBFdmVudE5vdGlmaWNhdGlvblJlcGx5X3QgKnBFdlJlcGx5KQoreworCWRscHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogTVBUIGV2ZW50IHJvdXRlZCB0byBMQU4gZHJpdmVyIVxuIikpOworCisJc3dpdGNoIChsZTMyX3RvX2NwdShwRXZSZXBseS0+RXZlbnQpKSB7CisJY2FzZSBNUElfRVZFTlRfTk9ORToJCQkJLyogMDAgKi8KKwljYXNlIE1QSV9FVkVOVF9MT0dfREFUQToJCQkvKiAwMSAqLworCWNhc2UgTVBJX0VWRU5UX1NUQVRFX0NIQU5HRToJCQkvKiAwMiAqLworCWNhc2UgTVBJX0VWRU5UX1VOSVRfQVRURU5USU9OOgkJCS8qIDAzICovCisJY2FzZSBNUElfRVZFTlRfSU9DX0JVU19SRVNFVDoJCQkvKiAwNCAqLworCWNhc2UgTVBJX0VWRU5UX0VYVF9CVVNfUkVTRVQ6CQkJLyogMDUgKi8KKwljYXNlIE1QSV9FVkVOVF9SRVNDQU46CQkJCS8qIDA2ICovCisJCS8qIE9rLCBkbyB3ZSBuZWVkIHRvIGRvIGFueXRoaW5nIGhlcmU/IEFzIGZhciBhcworCQkgICBJIGNhbiB0ZWxsLCB0aGlzIGlzIHdoZW4gYSBuZXcgZGV2aWNlIGdldHMgYWRkZWQKKwkJICAgdG8gdGhlIGxvb3AuICovCisJY2FzZSBNUElfRVZFTlRfTElOS19TVEFUVVNfQ0hBTkdFOgkJLyogMDcgKi8KKwljYXNlIE1QSV9FVkVOVF9MT09QX1NUQVRFX0NIQU5HRToJCS8qIDA4ICovCisJY2FzZSBNUElfRVZFTlRfTE9HT1VUOgkJCQkvKiAwOSAqLworCWNhc2UgTVBJX0VWRU5UX0VWRU5UX0NIQU5HRToJCQkvKiAwQSAqLworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCS8qCisJICogIE5PVEU6IHBFdmVudC0+QWNrUmVxdWlyZWQgaGFuZGxpbmcgbm93IGRvbmUgaW4gbXB0YmFzZS5jOworCSAqICBEbyBOT1QgZG8gaXQgaGVyZSBub3chCisJICovCisKKwlyZXR1cm4gMTsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworc3RhdGljIGludAorbXB0X2xhbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1wdF9sYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwlpZiAobXB0X2xhbl9yZXNldChkZXYpICE9IDApIHsKKwkJTVBUX0FEQVBURVIgKm1wdF9kZXYgPSBwcml2LT5tcHRfZGV2OworCisJCXByaW50ayAoS0VSTl9XQVJOSU5HIE1ZTkFNICIvbGFuX29wZW46IGxhbl9yZXNldCBmYWlsZWQuIik7CisKKwkJaWYgKG1wdF9kZXYtPmFjdGl2ZSkKKwkJCXByaW50ayAoIlRoZSBpb2MgaXMgYWN0aXZlLiBQZXJoYXBzIGl0IG5lZWRzIHRvIGJlIgorCQkJCSIgcmVzZXQ/XG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrICgiVGhlIGlvYyBpbiBpbmFjdGl2ZSwgbW9zdCBsaWtlbHkgaW4gdGhlICIKKwkJCQkicHJvY2VzcyBvZiBiZWluZyByZXNldC4gUGxlYXNlIHRyeSBhZ2FpbiBpbiAiCisJCQkJImEgbW9tZW50LlxuIik7CisJfQorCisJcHJpdi0+bXB0X3R4ZmlkeCA9IGttYWxsb2MocHJpdi0+dHhfbWF4X291dCAqIHNpemVvZihpbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJpdi0+bXB0X3R4ZmlkeCA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlwcml2LT5tcHRfdHhmaWR4X3RhaWwgPSAtMTsKKworCXByaXYtPlNlbmRDdGwgPSBrbWFsbG9jKHByaXYtPnR4X21heF9vdXQgKiBzaXplb2Yoc3RydWN0IEJ1ZmZlckNvbnRyb2wpLAorCQkJCUdGUF9LRVJORUwpOworCWlmIChwcml2LT5TZW5kQ3RsID09IE5VTEwpCisJCWdvdG8gb3V0X21wdF90eGZpZHg7CisJZm9yIChpID0gMDsgaSA8IHByaXYtPnR4X21heF9vdXQ7IGkrKykgeworCQltZW1zZXQoJnByaXYtPlNlbmRDdGxbaV0sIDAsIHNpemVvZihzdHJ1Y3QgQnVmZmVyQ29udHJvbCkpOworCQlwcml2LT5tcHRfdHhmaWR4WysrcHJpdi0+bXB0X3R4ZmlkeF90YWlsXSA9IGk7CisJfQorCisJZGxwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiQGxvOiBGaW5pc2hlZCBpbml0aWFsaXppbmcgU2VuZEN0bFxuIikpOworCisJcHJpdi0+bXB0X3J4ZmlkeCA9IGttYWxsb2MocHJpdi0+bWF4X2J1Y2tldHNfb3V0ICogc2l6ZW9mKGludCksCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYtPm1wdF9yeGZpZHggPT0gTlVMTCkKKwkJZ290byBvdXRfU2VuZEN0bDsKKwlwcml2LT5tcHRfcnhmaWR4X3RhaWwgPSAtMTsKKworCXByaXYtPlJjdkN0bCA9IGttYWxsb2MocHJpdi0+bWF4X2J1Y2tldHNfb3V0ICoKKwkJCQkJCXNpemVvZihzdHJ1Y3QgQnVmZmVyQ29udHJvbCksCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYtPlJjdkN0bCA9PSBOVUxMKQorCQlnb3RvIG91dF9tcHRfcnhmaWR4OworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5tYXhfYnVja2V0c19vdXQ7IGkrKykgeworCQltZW1zZXQoJnByaXYtPlJjdkN0bFtpXSwgMCwgc2l6ZW9mKHN0cnVjdCBCdWZmZXJDb250cm9sKSk7CisJCXByaXYtPm1wdF9yeGZpZHhbKytwcml2LT5tcHRfcnhmaWR4X3RhaWxdID0gaTsKKwl9CisKKy8qKi8JZGxwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiL2xvOiB0eGZpZHggY29udGFpbnMgLSAiKSk7CisvKiovCWZvciAoaSA9IDA7IGkgPCBwcml2LT50eF9tYXhfb3V0OyBpKyspCisvKiovCQlkbHByaW50aygoIiAleGgiLCBwcml2LT5tcHRfdHhmaWR4W2ldKSk7CisvKiovCWRscHJpbnRrKCgiXG4iKSk7CisKKwlkbHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICIvbG86IEZpbmlzaGVkIGluaXRpYWxpemluZyBSY3ZDdGxcbiIpKTsKKworCW1wdF9sYW5fcG9zdF9yZWNlaXZlX2J1Y2tldHMoZGV2KTsKKwlwcmludGsoS0VSTl9JTkZPIE1ZTkFNICI6ICVzLyVzOiBpbnRlcmZhY2UgdXAgJiBhY3RpdmVcbiIsCisJCQlJT0NfQU5EX05FVERFVl9OQU1FU19zX3MoZGV2KSk7CisKKwlpZiAobXB0X2V2ZW50X3JlZ2lzdGVyKExhbkN0eCwgbXB0X2xhbl9ldmVudF9wcm9jZXNzKSAhPSAwKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIE1ZTkFNICIvbG86IFVuYWJsZSB0byByZWdpc3RlciBmb3IgRXZlbnQiCisJCQkiIE5vdGlmaWNhdGlvbnMuIFRoaXMgaXMgYSBiYWQgdGhpbmchIFdlJ3JlIG5vdCBnb2luZyAiCisJCQkidG8gZ28gYWhlYWQsIGJ1dCBJJ2QgYmUgbGVlcnkgb2Ygc3lzdGVtIHN0YWJpbGl0eSBhdCAiCisJCQkidGhpcyBwb2ludC5cbiIpOworCX0KKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJZGxwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiL2xvOiBEb25lLlxuIikpOworCisJcmV0dXJuIDA7CitvdXRfbXB0X3J4ZmlkeDoKKwlrZnJlZShwcml2LT5tcHRfcnhmaWR4KTsKKwlwcml2LT5tcHRfcnhmaWR4ID0gTlVMTDsKK291dF9TZW5kQ3RsOgorCWtmcmVlKHByaXYtPlNlbmRDdGwpOworCXByaXYtPlNlbmRDdGwgPSBOVUxMOworb3V0X21wdF90eGZpZHg6CisJa2ZyZWUocHJpdi0+bXB0X3R4ZmlkeCk7CisJcHJpdi0+bXB0X3R4ZmlkeCA9IE5VTEw7CitvdXQ6CXJldHVybiAtRU5PTUVNOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKiBTZW5kIGEgTGFuUmVzZXQgbWVzc2FnZSB0byB0aGUgRlcuIFRoaXMgc2hvdWxkIHJlc3VsdCBpbiB0aGUgRlcgcmV0dXJuaW5nCisgICBhbnkgYnVja2V0cyBpdCBzdGlsbCBoYXMuICovCitzdGF0aWMgaW50CittcHRfbGFuX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJTVBUX0ZSQU1FX0hEUiAqbWY7CisJTEFOUmVzZXRSZXF1ZXN0X3QgKnBSZXNldFJlcTsKKwlzdHJ1Y3QgbXB0X2xhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW1mID0gbXB0X2dldF9tc2dfZnJhbWUoTGFuQ3R4LCBwcml2LT5tcHRfZGV2KTsKKworCWlmIChtZiA9PSBOVUxMKSB7CisvKgkJZGxwcmludGsoKEtFUk5fRVJSIE1ZTkFNICIvcmVzZXQ6IEV2aWwgZnVua2luZXNzIGFib3VuZHMhICIKKwkJIlVuYWJsZSB0byBhbGxvY2F0ZSBhIHJlcXVlc3QgZnJhbWUuXG4iKSk7CisqLworCQlyZXR1cm4gLTE7CisJfQorCisJcFJlc2V0UmVxID0gKExBTlJlc2V0UmVxdWVzdF90ICopIG1mOworCisJcFJlc2V0UmVxLT5GdW5jdGlvbgk9IE1QSV9GVU5DVElPTl9MQU5fUkVTRVQ7CisJcFJlc2V0UmVxLT5DaGFpbk9mZnNldAk9IDA7CisJcFJlc2V0UmVxLT5SZXNlcnZlZAk9IDA7CisJcFJlc2V0UmVxLT5Qb3J0TnVtYmVyCT0gcHJpdi0+cG51bTsKKwlwUmVzZXRSZXEtPk1zZ0ZsYWdzCT0gMDsKKwlwUmVzZXRSZXEtPlJlc2VydmVkMgk9IDA7CisKKwltcHRfcHV0X21zZ19mcmFtZShMYW5DdHgsIHByaXYtPm1wdF9kZXYsIG1mKTsKKworCXJldHVybiAwOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCitzdGF0aWMgaW50CittcHRfbGFuX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1wdF9sYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJTVBUX0FEQVBURVIgKm1wdF9kZXYgPSBwcml2LT5tcHRfZGV2OworCXVuc2lnbmVkIGludCB0aW1lb3V0OworCWludCBpOworCisJZGxwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBtcHRfbGFuX2Nsb3NlIGNhbGxlZFxuIikpOworCisJbXB0X2V2ZW50X2RlcmVnaXN0ZXIoTGFuQ3R4KTsKKworCWRscHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjpsYW5fY2xvc2U6IFBvc3RlZCAlZCBidWNrZXRzICIKKwkJICAic2luY2UgZHJpdmVyIHdhcyBsb2FkZWQsICVkIHN0aWxsIG91dFxuIiwKKwkJICBwcml2LT50b3RhbF9wb3N0ZWQsYXRvbWljX3JlYWQoJnByaXYtPmJ1Y2tldHNfb3V0KSkpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJbXB0X2xhbl9yZXNldChkZXYpOworCisJdGltZW91dCA9IDIgKiBIWjsKKwl3aGlsZSAoYXRvbWljX3JlYWQoJnByaXYtPmJ1Y2tldHNfb3V0KSAmJiAtLXRpbWVvdXQpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+bWF4X2J1Y2tldHNfb3V0OyBpKyspIHsKKwkJaWYgKHByaXYtPlJjdkN0bFtpXS5za2IgIT0gTlVMTCkgeworLyoqLwkJCWRscHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIi9sYW5fY2xvc2U6IGJ1Y2tldCAlMDV4ICIKKy8qKi8JCQkJICAiaXMgc3RpbGwgb3V0XG4iLCBpKSk7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG1wdF9kZXYtPnBjaWRldiwgcHJpdi0+UmN2Q3RsW2ldLmRtYSwKKwkJCQkJIHByaXYtPlJjdkN0bFtpXS5sZW4sCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihwcml2LT5SY3ZDdGxbaV0uc2tiKTsKKwkJfQorCX0KKworCWtmcmVlIChwcml2LT5SY3ZDdGwpOworCWtmcmVlIChwcml2LT5tcHRfcnhmaWR4KTsKKworCWZvciAoaSA9IDA7IGkgPCBwcml2LT50eF9tYXhfb3V0OyBpKyspIHsKKwkJaWYgKHByaXYtPlNlbmRDdGxbaV0uc2tiICE9IE5VTEwpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUobXB0X2Rldi0+cGNpZGV2LCBwcml2LT5TZW5kQ3RsW2ldLmRtYSwKKwkJCQkJIHByaXYtPlNlbmRDdGxbaV0ubGVuLAorCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKHByaXYtPlNlbmRDdGxbaV0uc2tiKTsKKwkJfQorCX0KKworCWtmcmVlKHByaXYtPlNlbmRDdGwpOworCWtmcmVlKHByaXYtPm1wdF90eGZpZHgpOworCisJYXRvbWljX3NldCgmcHJpdi0+YnVja2V0c19vdXQsIDApOworCisJcHJpbnRrKEtFUk5fSU5GTyBNWU5BTSAiOiAlcy8lczogaW50ZXJmYWNlIGRvd24gJiBpbmFjdGl2ZVxuIiwKKwkJCUlPQ19BTkRfTkVUREVWX05BTUVTX3NfcyhkZXYpKTsKKworCXJldHVybiAwOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgorbXB0X2xhbl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXB0X2xhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiAoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikgJnByaXYtPnN0YXRzOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCitzdGF0aWMgaW50CittcHRfbGFuX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaWYgKChuZXdfbXR1IDwgTVBUX0xBTl9NSU5fTVRVKSB8fCAobmV3X210dSA+IE1QVF9MQU5fTUFYX01UVSkpCisJCXJldHVybiAtRUlOVkFMOworCWRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyogVHggdGltZW91dCBoYW5kbGVyLiAqLworc3RhdGljIHZvaWQKK21wdF9sYW5fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtcHRfbGFuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCU1QVF9BREFQVEVSICptcHRfZGV2ID0gcHJpdi0+bXB0X2RldjsKKworCWlmIChtcHRfZGV2LT5hY3RpdmUpIHsKKwkJZGxwcmludGsgKCgibXB0bGFuL3R4X3RpbWVvdXQ6IGNhbGxpbmcgbmV0aWZfd2FrZV9xdWV1ZSBmb3IgJXMuXG4iLCBkZXYtPm5hbWUpKTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLy9zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGludAorbXB0X2xhbl9zZW5kX3R1cmJvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB0bXNnKQoreworCXN0cnVjdCBtcHRfbGFuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCU1QVF9BREFQVEVSICptcHRfZGV2ID0gcHJpdi0+bXB0X2RldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2VudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBjdHg7CisKKwljdHggPSBHRVRfTEFOX0JVRkZFUl9DT05URVhUKHRtc2cpOworCXNlbnQgPSBwcml2LT5TZW5kQ3RsW2N0eF0uc2tiOworCisJcHJpdi0+c3RhdHMudHhfcGFja2V0cysrOworCXByaXYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbnQtPmxlbjsKKworCWRpb3ByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzLyVzOiBAJXMsIHNrYiAlcCBzZW50LlxuIiwKKwkJCUlPQ19BTkRfTkVUREVWX05BTUVTX3NfcyhkZXYpLAorCQkJX19GVU5DVElPTl9fLCBzZW50KSk7CisKKwlwcml2LT5TZW5kQ3RsW2N0eF0uc2tiID0gTlVMTDsKKwlwY2lfdW5tYXBfc2luZ2xlKG1wdF9kZXYtPnBjaWRldiwgcHJpdi0+U2VuZEN0bFtjdHhdLmRtYSwKKwkJCSBwcml2LT5TZW5kQ3RsW2N0eF0ubGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlkZXZfa2ZyZWVfc2tiX2lycShzZW50KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eGZpZHhfbG9jaywgZmxhZ3MpOworCXByaXYtPm1wdF90eGZpZHhbKytwcml2LT5tcHRfdHhmaWR4X3RhaWxdID0gY3R4OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4ZmlkeF9sb2NrLCBmbGFncyk7CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KK3N0YXRpYyBpbnQKK21wdF9sYW5fc2VuZF9yZXBseShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBMQU5TZW5kUmVwbHlfdCAqcFNlbmRSZXApCit7CisJc3RydWN0IG1wdF9sYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJTVBUX0FEQVBURVIgKm1wdF9kZXYgPSBwcml2LT5tcHRfZGV2OworCXN0cnVjdCBza19idWZmICpzZW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IEZyZWVSZXFGcmFtZSA9IDA7CisJdTMyICpwQ29udGV4dDsKKwl1MzIgY3R4OworCXU4IGNvdW50OworCisJY291bnQgPSBwU2VuZFJlcC0+TnVtYmVyT2ZDb250ZXh0czsKKworCWRpb3ByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IHNlbmRfcmVwbHk6IElPQ1N0YXR1czogJTA0eFxuIiwKKwkJIGxlMTZfdG9fY3B1KHBTZW5kUmVwLT5JT0NTdGF0dXMpKSk7CisKKwkvKiBBZGQgY2hlY2sgZm9yIExvZ2luZm8gRmxhZyBpbiBJT0NTdGF0dXMgKi8KKworCXN3aXRjaCAobGUxNl90b19jcHUocFNlbmRSZXAtPklPQ1N0YXR1cykgJiBNUElfSU9DU1RBVFVTX01BU0spIHsKKwljYXNlIE1QSV9JT0NTVEFUVVNfU1VDQ0VTUzoKKwkJcHJpdi0+c3RhdHMudHhfcGFja2V0cyArPSBjb3VudDsKKwkJYnJlYWs7CisKKwljYXNlIE1QSV9JT0NTVEFUVVNfTEFOX0NBTkNFTEVEOgorCWNhc2UgTVBJX0lPQ1NUQVRVU19MQU5fVFJBTlNNSVRfQUJPUlRFRDoKKwkJYnJlYWs7CisKKwljYXNlIE1QSV9JT0NTVEFUVVNfSU5WQUxJRF9TR0w6CisJCXByaXYtPnN0YXRzLnR4X2Vycm9ycyArPSBjb3VudDsKKwkJcHJpbnRrIChLRVJOX0VSUiBNWU5BTSAiOiAlcy8lczogRVJST1IgLSBJbnZhbGlkIFNHTCBzZW50IHRvIElPQyFcbiIsCisJCQkJSU9DX0FORF9ORVRERVZfTkFNRVNfc19zKGRldikpOworCQlnb3RvIG91dDsKKworCWRlZmF1bHQ6CisJCXByaXYtPnN0YXRzLnR4X2Vycm9ycyArPSBjb3VudDsKKwkJYnJlYWs7CisJfQorCisJcENvbnRleHQgPSAmcFNlbmRSZXAtPkJ1ZmZlckNvbnRleHQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhmaWR4X2xvY2ssIGZsYWdzKTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCWN0eCA9IEdFVF9MQU5fQlVGRkVSX0NPTlRFWFQobGUzMl90b19jcHUoKnBDb250ZXh0KSk7CisKKwkJc2VudCA9IHByaXYtPlNlbmRDdGxbY3R4XS5za2I7CisJCXByaXYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbnQtPmxlbjsKKworCQlkaW9wcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlcy8lczogQCVzLCBza2IgJXAgc2VudC5cbiIsCisJCQkJSU9DX0FORF9ORVRERVZfTkFNRVNfc19zKGRldiksCisJCQkJX19GVU5DVElPTl9fLCBzZW50KSk7CisKKwkJcHJpdi0+U2VuZEN0bFtjdHhdLnNrYiA9IE5VTEw7CisJCXBjaV91bm1hcF9zaW5nbGUobXB0X2Rldi0+cGNpZGV2LCBwcml2LT5TZW5kQ3RsW2N0eF0uZG1hLAorCQkJCSBwcml2LT5TZW5kQ3RsW2N0eF0ubGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYl9pcnEoc2VudCk7CisKKwkJcHJpdi0+bXB0X3R4ZmlkeFsrK3ByaXYtPm1wdF90eGZpZHhfdGFpbF0gPSBjdHg7CisKKwkJcENvbnRleHQrKzsKKwkJY291bnQtLTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhmaWR4X2xvY2ssIGZsYWdzKTsKKworb3V0OgorCWlmICghKHBTZW5kUmVwLT5Nc2dGbGFncyAmIE1QSV9NU0dGTEFHU19DT05USU5VQVRJT05fUkVQTFkpKQorCQlGcmVlUmVxRnJhbWUgPSAxOworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXJldHVybiBGcmVlUmVxRnJhbWU7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KK3N0YXRpYyBpbnQKK21wdF9sYW5fc2R1X3NlbmQgKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1wdF9sYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJTVBUX0FEQVBURVIgKm1wdF9kZXYgPSBwcml2LT5tcHRfZGV2OworCU1QVF9GUkFNRV9IRFIgKm1mOworCUxBTlNlbmRSZXF1ZXN0X3QgKnBTZW5kUmVxOworCVNHRVRyYW5zYWN0aW9uMzJfdCAqcFRyYW5zOworCVNHRVNpbXBsZTY0X3QgKnBTaW1wbGU7CisJZG1hX2FkZHJfdCBkbWE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY3R4OworCXUxNiBjdXJfbmFhID0gMHgxMDAwOworCisJZGlvcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXMgY2FsbGVkLCBza2JfYWRkciA9ICVwXG4iLAorCQkJX19GVU5DVElPTl9fLCBza2IpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eGZpZHhfbG9jaywgZmxhZ3MpOworCWlmIChwcml2LT5tcHRfdHhmaWR4X3RhaWwgPCAwKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhmaWR4X2xvY2ssIGZsYWdzKTsKKworCQlwcmludGsgKEtFUk5fRVJSICIlczogbm8gdHggY29udGV4dCBhdmFpbGFibGU6ICV1XG4iLAorCQkJX19GVU5DVElPTl9fLCBwcml2LT5tcHRfdHhmaWR4X3RhaWwpOworCQlyZXR1cm4gMTsKKwl9CisKKwltZiA9IG1wdF9nZXRfbXNnX2ZyYW1lKExhbkN0eCwgbXB0X2Rldik7CisJaWYgKG1mID09IE5VTEwpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eGZpZHhfbG9jaywgZmxhZ3MpOworCisJCXByaW50ayAoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gYWxsb2MgcmVxdWVzdCBmcmFtZVxuIiwKKwkJCV9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAxOworCX0KKworCWN0eCA9IHByaXYtPm1wdF90eGZpZHhbcHJpdi0+bXB0X3R4ZmlkeF90YWlsLS1dOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4ZmlkeF9sb2NrLCBmbGFncyk7CisKKy8vCWRpb3ByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzLyVzOiBDcmVhdGluZyBuZXcgbXNnIGZyYW1lIChzZW5kKS5cbiIsCisvLwkJCUlPQ19BTkRfTkVUREVWX05BTUVTX3NfcyhkZXYpKSk7CisKKwlwU2VuZFJlcSA9IChMQU5TZW5kUmVxdWVzdF90ICopIG1mOworCisJLyogU2V0IHRoZSBtYWMucmF3IHBvaW50ZXIsIHNpbmNlIHRoaXMgYXBwYXJlbnRseSBpc24ndCBnZXR0aW5nCisJICogZG9uZSBiZWZvcmUgd2UgZ2V0IHRoZSBza2IuIFB1bGwgdGhlIGRhdGEgcG9pbnRlciBwYXN0IHRoZSBtYWMgZGF0YS4KKwkgKi8KKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3B1bGwoc2tiLCAxMik7CisKKyAgICAgICAgZG1hID0gcGNpX21hcF9zaW5nbGUobXB0X2Rldi0+cGNpZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLAorCQkJICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKworCXByaXYtPlNlbmRDdGxbY3R4XS5za2IgPSBza2I7CisJcHJpdi0+U2VuZEN0bFtjdHhdLmRtYSA9IGRtYTsKKwlwcml2LT5TZW5kQ3RsW2N0eF0ubGVuID0gc2tiLT5sZW47CisKKwkvKiBNZXNzYWdlIEhlYWRlciAqLworCXBTZW5kUmVxLT5SZXNlcnZlZCAgICA9IDA7CisJcFNlbmRSZXEtPkZ1bmN0aW9uICAgID0gTVBJX0ZVTkNUSU9OX0xBTl9TRU5EOworCXBTZW5kUmVxLT5DaGFpbk9mZnNldCA9IDA7CisJcFNlbmRSZXEtPlJlc2VydmVkMiAgID0gMDsKKwlwU2VuZFJlcS0+TXNnRmxhZ3MgICAgPSAwOworCXBTZW5kUmVxLT5Qb3J0TnVtYmVyICA9IHByaXYtPnBudW07CisKKwkvKiBUcmFuc2FjdGlvbiBDb250ZXh0IEVsZW1lbnQgKi8KKwlwVHJhbnMgPSAoU0dFVHJhbnNhY3Rpb24zMl90ICopIHBTZW5kUmVxLT5TR19MaXN0OworCisJLyogTm8gRmxhZ3MsIDggYnl0ZXMgb2YgRGV0YWlscywgMzJiaXQgQ29udGV4dCAoYmxvb2R5IHR1cmJvIHJlcGxpZXMpICovCisJcFRyYW5zLT5Db250ZXh0U2l6ZSAgID0gc2l6ZW9mKHUzMik7CisJcFRyYW5zLT5EZXRhaWxzTGVuZ3RoID0gMiAqIHNpemVvZih1MzIpOworCXBUcmFucy0+RmxhZ3MgICAgICAgICA9IDA7CisJcFRyYW5zLT5UcmFuc2FjdGlvbkNvbnRleHRbMF0gPSBjcHVfdG9fbGUzMihjdHgpOworCisvLwlkaW9wcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiAlcy8lczogQkMgPSAlMDh4LCBza2IgPSAlcCwgYnVmZiA9ICVwXG4iLAorLy8JCQlJT0NfQU5EX05FVERFVl9OQU1FU19zX3MoZGV2KSwKKy8vCQkJY3R4LCBza2IsIHNrYi0+ZGF0YSkpOworCisjaWZkZWYgUUxPR0lDX05BQV9XT1JLQVJPVU5ECit7CisJc3RydWN0IE5BQV9Ib3NlZCAqbmg7CisKKwkvKiBNdW5nZSB0aGUgTkFBIGZvciBUeCBwYWNrZXRzIHRvIFFMb2dpYyBib2FyZHMsIHdoaWNoIGRvbid0IGZvbGxvdworCSAgIFJGQyAyNjI1LiBUaGUgbG9uZ2VyIEkgbG9vayBhdCB0aGlzLCB0aGUgbW9yZSBteSBvcGluaW9uIG9mIFFsb2dpYworCSAgIGRyb3BzLiAqLworCXJlYWRfbG9ja19pcnEoJmJhZF9uYWFfbG9jayk7CisJZm9yIChuaCA9IG1wdF9iYWRfbmFhOyBuaCAhPSBOVUxMOyBuaD1uaC0+bmV4dCkgeworCQlpZiAoKG5oLT5pZWVlWzBdID09IHNrYi0+bWFjLnJhd1swXSkgJiYKKwkJICAgIChuaC0+aWVlZVsxXSA9PSBza2ItPm1hYy5yYXdbMV0pICYmCisJCSAgICAobmgtPmllZWVbMl0gPT0gc2tiLT5tYWMucmF3WzJdKSAmJgorCQkgICAgKG5oLT5pZWVlWzNdID09IHNrYi0+bWFjLnJhd1szXSkgJiYKKwkJICAgIChuaC0+aWVlZVs0XSA9PSBza2ItPm1hYy5yYXdbNF0pICYmCisJCSAgICAobmgtPmllZWVbNV0gPT0gc2tiLT5tYWMucmF3WzVdKSkgeworCQkJY3VyX25hYSA9IG5oLT5OQUE7CisJCQlkbHByaW50ayAoKEtFUk5fSU5GTyAibXB0bGFuL3NkdV9zZW5kOiB1c2luZyBOQUEgdmFsdWUgIgorCQkJCSAgIj0gJTA0eC5cbiIsIGN1cl9uYWEpKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJlYWRfdW5sb2NrX2lycSgmYmFkX25hYV9sb2NrKTsKK30KKyNlbmRpZgorCisJcFRyYW5zLT5UcmFuc2FjdGlvbkRldGFpbHNbMF0gPSBjcHVfdG9fbGUzMigoY3VyX25hYSAgICAgICAgIDw8IDE2KSB8CisJCQkJCQkgICAgKHNrYi0+bWFjLnJhd1swXSA8PCAgOCkgfAorCQkJCQkJICAgIChza2ItPm1hYy5yYXdbMV0gPDwgIDApKTsKKwlwVHJhbnMtPlRyYW5zYWN0aW9uRGV0YWlsc1sxXSA9IGNwdV90b19sZTMyKChza2ItPm1hYy5yYXdbMl0gPDwgMjQpIHwKKwkJCQkJCSAgICAoc2tiLT5tYWMucmF3WzNdIDw8IDE2KSB8CisJCQkJCQkgICAgKHNrYi0+bWFjLnJhd1s0XSA8PCAgOCkgfAorCQkJCQkJICAgIChza2ItPm1hYy5yYXdbNV0gPDwgIDApKTsKKworCXBTaW1wbGUgPSAoU0dFU2ltcGxlNjRfdCAqKSAmcFRyYW5zLT5UcmFuc2FjdGlvbkRldGFpbHNbMl07CisKKwkvKiBJZiB3ZSBldmVyIGRlY2lkZSB0byBzZW5kIG1vcmUgdGhhbiBvbmUgU2ltcGxlIFNHRSBwZXIgTEFOU2VuZCwgdGhlbgorCSAgIHdlIHdpbGwgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBMQVNUX0VMRU1FTlQgb25seSBnZXRzIHNldCBvbiB0aGUKKwkgICBsYXN0IG9uZS4gT3RoZXJ3aXNlLCBiYWQgdm9vZG9vIGFuZCBldmlsIGZ1bmtpbmVzcyB3aWxsIGNvbW1lbmNlLiAqLworCXBTaW1wbGUtPkZsYWdzTGVuZ3RoID0gY3B1X3RvX2xlMzIoCisJCQkoKE1QSV9TR0VfRkxBR1NfTEFTVF9FTEVNRU5UIHwKKwkJCSAgTVBJX1NHRV9GTEFHU19FTkRfT0ZfQlVGRkVSIHwKKwkJCSAgTVBJX1NHRV9GTEFHU19TSU1QTEVfRUxFTUVOVCB8CisJCQkgIE1QSV9TR0VfRkxBR1NfU1lTVEVNX0FERFJFU1MgfAorCQkJICBNUElfU0dFX0ZMQUdTX0hPU1RfVE9fSU9DIHwKKwkJCSAgTVBJX1NHRV9GTEFHU182NF9CSVRfQUREUkVTU0lORyB8CisJCQkgIE1QSV9TR0VfRkxBR1NfRU5EX09GX0xJU1QpIDw8IE1QSV9TR0VfRkxBR1NfU0hJRlQpIHwKKwkJCXNrYi0+bGVuKTsKKwlwU2ltcGxlLT5BZGRyZXNzLkxvdyA9IGNwdV90b19sZTMyKCh1MzIpIGRtYSk7CisJaWYgKHNpemVvZihkbWFfYWRkcl90KSA+IHNpemVvZih1MzIpKQorCQlwU2ltcGxlLT5BZGRyZXNzLkhpZ2ggPSBjcHVfdG9fbGUzMigodTMyKSAoKHU2NCkgZG1hID4+IDMyKSk7CisJZWxzZQorCQlwU2ltcGxlLT5BZGRyZXNzLkhpZ2ggPSAwOworCisJbXB0X3B1dF9tc2dfZnJhbWUgKExhbkN0eCwgbXB0X2RldiwgbWYpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJZGlvcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXMvJXM6IFNlbmRpbmcgcGFja2V0LiBGbGFnc0xlbmd0aCA9ICUwOHguXG4iLAorCQkJSU9DX0FORF9ORVRERVZfTkFNRVNfc19zKGRldiksCisJCQlsZTMyX3RvX2NwdShwU2ltcGxlLT5GbGFnc0xlbmd0aCkpKTsKKworCXJldHVybiAwOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCitzdGF0aWMgaW5saW5lIHZvaWQKK21wdF9sYW5fd2FrZV9wb3N0X2J1Y2tldHNfdGFzayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcHJpb3JpdHkpCisvKgorICogQHByaW9yaXR5OiAwID0gcHV0IGl0IG9uIHRoZSB0aW1lciBxdWV1ZSwgMSA9IHB1dCBpdCBvbiB0aGUgaW1tZWRpYXRlIHF1ZXVlCisgKi8KK3sKKwlzdHJ1Y3QgbXB0X2xhbl9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCQorCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZwcml2LT5wb3N0X2J1Y2tldHNfYWN0aXZlKSA9PSAwKSB7CisJCWlmIChwcmlvcml0eSkgeworCQkJc2NoZWR1bGVfd29yaygmcHJpdi0+cG9zdF9idWNrZXRzX3Rhc2spOworCQl9IGVsc2UgeworCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT5wb3N0X2J1Y2tldHNfdGFzaywgMSk7CisJCQlkaW9wcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBwb3N0X2J1Y2tldHMgcXVldWVkIG9uICIKKwkJCQkgICAidGltZXIuXG4iKSk7CisJCX0KKwkgICAgICAgIGRpb3ByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzLyVzOiBRdWV1ZWQgcG9zdF9idWNrZXRzIHRhc2suXG4iLAorCQkJICAgSU9DX0FORF9ORVRERVZfTkFNRVNfc19zKGRldikgKSk7CisJfQorfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCitzdGF0aWMgaW5saW5lIGludAorbXB0X2xhbl9yZWNlaXZlX3NrYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBtcHRfbGFuX3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisKKwlza2ItPnByb3RvY29sID0gbXB0X2xhbl90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworCWRpb3ByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzLyVzOiBJbmNvbWluZyBwYWNrZXQgKCVkIGJ5dGVzKSAiCisJCSAiZGVsaXZlcmVkIHRvIHVwcGVyIGxldmVsLlxuIiwKKwkJCUlPQ19BTkRfTkVUREVWX05BTUVTX3NfcyhkZXYpLCBza2ItPmxlbikpOworCisJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOworCisJc2tiLT5kZXYgPSBkZXY7CisJbmV0aWZfcngoc2tiKTsKKworCWRpb3ByaW50aygoTVlOQU0gIi9yZWNlaXZlX3NrYjogJWQgYnVja2V0cyByZW1haW5pbmdcbiIsCisJCSBhdG9taWNfcmVhZCgmcHJpdi0+YnVja2V0c19vdXQpKSk7CisKKwlpZiAoYXRvbWljX3JlYWQoJnByaXYtPmJ1Y2tldHNfb3V0KSA8IHByaXYtPmJ1Y2tldHRocmVzaCkKKwkJbXB0X2xhbl93YWtlX3Bvc3RfYnVja2V0c190YXNrKGRldiwgMSk7CisKKwlkaW9wcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiL3JlY2VpdmVfcG9zdF9yZXBseTogJWQgYnVja2V0cyAiCisJCSAgInJlbWFpbmluZywgJWQgcmVjZWl2ZWQgYmFjayBzaW5jZSBzb2RcbiIsCisJCSAgYXRvbWljX3JlYWQoJnByaXYtPmJ1Y2tldHNfb3V0KSwgcHJpdi0+dG90YWxfcmVjZWl2ZWQpKTsKKworCXJldHVybiAwOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvL3N0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW50CittcHRfbGFuX3JlY2VpdmVfcG9zdF90dXJibyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdG1zZykKK3sKKwlzdHJ1Y3QgbXB0X2xhbl9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCU1QVF9BREFQVEVSICptcHRfZGV2ID0gcHJpdi0+bXB0X2RldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqb2xkX3NrYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBjdHgsIGxlbjsKKworCWN0eCA9IEdFVF9MQU5fQlVDS0VUX0NPTlRFWFQodG1zZyk7CisJc2tiID0gcHJpdi0+UmN2Q3RsW2N0eF0uc2tiOworCisJbGVuID0gR0VUX0xBTl9QQUNLRVRfTEVOR1RIKHRtc2cpOworCisJaWYgKGxlbiA8IE1QVF9MQU5fUlhfQ09QWUJSRUFLKSB7CisJCW9sZF9za2IgPSBza2I7CisKKwkJc2tiID0gKHN0cnVjdCBza19idWZmICopZGV2X2FsbG9jX3NrYihsZW4pOworCQlpZiAoIXNrYikgeworCQkJcHJpbnRrIChLRVJOX0VSUiBNWU5BTSAiOiAlcy8lczogRVJST1IgLSBDYW4ndCBhbGxvY2F0ZSBza2IhICglc0AlZClcbiIsCisJCQkJCUlPQ19BTkRfTkVUREVWX05BTUVTX3NfcyhkZXYpLAorCQkJCQlfX0ZJTEVfXywgX19MSU5FX18pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobXB0X2Rldi0+cGNpZGV2LCBwcml2LT5SY3ZDdGxbY3R4XS5kbWEsCisJCQkJCSAgICBwcml2LT5SY3ZDdGxbY3R4XS5sZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJbWVtY3B5KHNrYl9wdXQoc2tiLCBsZW4pLCBvbGRfc2tiLT5kYXRhLCBsZW4pOworCisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShtcHRfZGV2LT5wY2lkZXYsIHByaXYtPlJjdkN0bFtjdHhdLmRtYSwKKwkJCQkJICAgICAgIHByaXYtPlJjdkN0bFtjdHhdLmxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJZ290byBvdXQ7CisJfQorCisJc2tiX3B1dChza2IsIGxlbik7CisKKwlwcml2LT5SY3ZDdGxbY3R4XS5za2IgPSBOVUxMOworCisJcGNpX3VubWFwX3NpbmdsZShtcHRfZGV2LT5wY2lkZXYsIHByaXYtPlJjdkN0bFtjdHhdLmRtYSwKKwkJCSBwcml2LT5SY3ZDdGxbY3R4XS5sZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisKK291dDoKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnhmaWR4X2xvY2ssIGZsYWdzKTsKKwlwcml2LT5tcHRfcnhmaWR4WysrcHJpdi0+bXB0X3J4ZmlkeF90YWlsXSA9IGN0eDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeGZpZHhfbG9jaywgZmxhZ3MpOworCisJYXRvbWljX2RlYygmcHJpdi0+YnVja2V0c19vdXQpOworCXByaXYtPnRvdGFsX3JlY2VpdmVkKys7CisKKwlyZXR1cm4gbXB0X2xhbl9yZWNlaXZlX3NrYihkZXYsIHNrYik7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KK3N0YXRpYyBpbnQKK21wdF9sYW5fcmVjZWl2ZV9wb3N0X2ZyZWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgTEFOUmVjZWl2ZVBvc3RSZXBseV90ICpwUmVjdlJlcCkKK3sKKwlzdHJ1Y3QgbXB0X2xhbl9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCU1QVF9BREFQVEVSICptcHRfZGV2ID0gcHJpdi0+bXB0X2RldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTMyIGN0eDsKKwlpbnQgY291bnQ7CisJaW50IGk7CisKKwljb3VudCA9IHBSZWN2UmVwLT5OdW1iZXJPZkNvbnRleHRzOworCisvKiovCWRscHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIi9yZWNlaXZlX3Bvc3RfcmVwbHk6ICIKKwkJICAiSU9DIHJldHVybmVkICVkIGJ1Y2tldHMsIGZyZWVpbmcgdGhlbS4uLlxuIiwgY291bnQpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeGZpZHhfbG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWN0eCA9IGxlMzJfdG9fY3B1KHBSZWN2UmVwLT5CdWNrZXRDb250ZXh0W2ldKTsKKworCQlza2IgPSBwcml2LT5SY3ZDdGxbY3R4XS5za2I7CisKKy8vCQlkbHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzOiBkZXZfbmFtZSA9ICVzXG4iLAorLy8JCQkJSU9DX0FORF9ORVRERVZfTkFNRVNfc19zKGRldikpKTsKKy8vCQlkbHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICJAcnByWzJdLCBwcml2ID0gJXAsIGJ1Y2tldHNfb3V0IGFkZHIgPSAlcCIsCisvLwkJCQlwcml2LCAmKHByaXYtPmJ1Y2tldHNfb3V0KSkpOworLy8JCWRscHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIkBycHJbMl0gVEMgKyAzXG4iKSk7CisKKwkJcHJpdi0+UmN2Q3RsW2N0eF0uc2tiID0gTlVMTDsKKwkJcGNpX3VubWFwX3NpbmdsZShtcHRfZGV2LT5wY2lkZXYsIHByaXYtPlJjdkN0bFtjdHhdLmRtYSwKKwkJCQkgcHJpdi0+UmN2Q3RsW2N0eF0ubGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCisJCXByaXYtPm1wdF9yeGZpZHhbKytwcml2LT5tcHRfcnhmaWR4X3RhaWxdID0gY3R4OworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeGZpZHhfbG9jaywgZmxhZ3MpOworCisJYXRvbWljX3N1Yihjb3VudCwgJnByaXYtPmJ1Y2tldHNfb3V0KTsKKworLy8JZm9yIChpID0gMDsgaSA8IHByaXYtPm1heF9idWNrZXRzX291dDsgaSsrKQorLy8JCWlmIChwcml2LT5SY3ZDdGxbaV0uc2tiICE9IE5VTEwpCisvLwkJCWRscHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIkBycHI6IGJ1Y2tldCAlMDN4ICIKKy8vCQkJCSAgImlzIHN0aWxsIG91dFxuIiwgaSkpOworCisvKglkbHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICIvcmVjZWl2ZV9wb3N0X3JlcGx5OiBmcmVlZCAlZCBidWNrZXRzXG4iLAorCQkgIGNvdW50KSk7CisqLworLyoqLwlkbHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICJAcmVjZWl2ZV9wb3N0X3JlcGx5OiAlZCBidWNrZXRzICIKKy8qKi8JCSAgInJlbWFpbmluZywgJWQgcmVjZWl2ZWQgYmFjayBzaW5jZSBzb2QuXG4iLAorLyoqLwkJICBhdG9taWNfcmVhZCgmcHJpdi0+YnVja2V0c19vdXQpLCBwcml2LT50b3RhbF9yZWNlaXZlZCkpOworCXJldHVybiAwOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCitzdGF0aWMgaW50CittcHRfbGFuX3JlY2VpdmVfcG9zdF9yZXBseShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgTEFOUmVjZWl2ZVBvc3RSZXBseV90ICpwUmVjdlJlcCkKK3sKKwlzdHJ1Y3QgbXB0X2xhbl9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCU1QVF9BREFQVEVSICptcHRfZGV2ID0gcHJpdi0+bXB0X2RldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqb2xkX3NrYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBsZW4sIGN0eCwgb2Zmc2V0OworCXUzMiByZW1haW5pbmcgPSBsZTMyX3RvX2NwdShwUmVjdlJlcC0+QnVja2V0c1JlbWFpbmluZyk7CisJaW50IGNvdW50OworCWludCBpLCBsOworCisJZGlvcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogbXB0X2xhbl9yZWNlaXZlX3Bvc3RfcmVwbHkgY2FsbGVkXG4iKSk7CisJZGlvcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogcmVjZWl2ZV9wb3N0X3JlcGx5OiBJT0NTdGF0dXM6ICUwNHhcbiIsCisJCSBsZTE2X3RvX2NwdShwUmVjdlJlcC0+SU9DU3RhdHVzKSkpOworCisJaWYgKChsZTE2X3RvX2NwdShwUmVjdlJlcC0+SU9DU3RhdHVzKSAmIE1QSV9JT0NTVEFUVVNfTUFTSykgPT0KKwkJCQkJCU1QSV9JT0NTVEFUVVNfTEFOX0NBTkNFTEVEKQorCQlyZXR1cm4gbXB0X2xhbl9yZWNlaXZlX3Bvc3RfZnJlZShkZXYsIHBSZWN2UmVwKTsKKworCWxlbiA9IGxlMzJfdG9fY3B1KHBSZWN2UmVwLT5QYWNrZXRMZW5ndGgpOworCWlmIChsZW4gPT0gMCkgeworCQlwcmludGsgKEtFUk5fRVJSIE1ZTkFNICI6ICVzLyVzOiBFUlJPUiAtIEdvdCBhIG5vbi1UVVJCTyAiCisJCQkiUmVjZWl2ZVBvc3RSZXBseSB3LyBQYWNrZXRMZW5ndGggemVybyFcbiIsCisJCQkJSU9DX0FORF9ORVRERVZfTkFNRVNfc19zKGRldikpOworCQlwcmludGsgKEtFUk5fRVJSIE1ZTkFNICI6IE1zZ0ZsYWdzID0gJTAyeCwgSU9DU3RhdHVzID0gJTA0eFxuIiwKKwkJCQlwUmVjdlJlcC0+TXNnRmxhZ3MsIGxlMTZfdG9fY3B1KHBSZWN2UmVwLT5JT0NTdGF0dXMpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWN0eCAgICA9IGxlMzJfdG9fY3B1KHBSZWN2UmVwLT5CdWNrZXRDb250ZXh0WzBdKTsKKwljb3VudCAgPSBwUmVjdlJlcC0+TnVtYmVyT2ZDb250ZXh0czsKKwlza2IgICAgPSBwcml2LT5SY3ZDdGxbY3R4XS5za2I7CisKKwlvZmZzZXQgPSBsZTMyX3RvX2NwdShwUmVjdlJlcC0+UGFja2V0T2Zmc2V0KTsKKy8vCWlmIChvZmZzZXQgIT0gMCkgeworLy8JCXByaW50ayAoS0VSTl9JTkZPIE1ZTkFNICI6ICVzLyVzOiBHb3QgYSBSZWNlaXZlUG9zdFJlcGx5ICIKKy8vCQkJIncvIFBhY2tldE9mZnNldCAldVxuIiwKKy8vCQkJCUlPQ19BTkRfTkVUREVWX05BTUVTX3NfcyhkZXYpLAorLy8JCQkJb2Zmc2V0KTsKKy8vCX0KKworCWRpb3ByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzLyVzOiBAcnByLCBvZmZzZXQgPSAlZCwgbGVuID0gJWRcbiIsCisJCQlJT0NfQU5EX05FVERFVl9OQU1FU19zX3MoZGV2KSwKKwkJCW9mZnNldCwgbGVuKSk7CisKKwlpZiAoY291bnQgPiAxKSB7CisJCWludCBzenJlbSA9IGxlbjsKKworLy8JCWRpb3ByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzLyVzOiBNdWx0aXBsZSBidWNrZXRzIHJldHVybmVkICIKKy8vCQkJImZvciBzaW5nbGUgcGFja2V0LCBjb25jYXRlbmF0aW5nLi4uXG4iLAorLy8JCQkJSU9DX0FORF9ORVRERVZfTkFNRVNfc19zKGRldikpKTsKKworCQlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKilkZXZfYWxsb2Nfc2tiKGxlbik7CisJCWlmICghc2tiKSB7CisJCQlwcmludGsgKEtFUk5fRVJSIE1ZTkFNICI6ICVzLyVzOiBFUlJPUiAtIENhbid0IGFsbG9jYXRlIHNrYiEgKCVzQCVkKVxuIiwKKwkJCQkJSU9DX0FORF9ORVRERVZfTkFNRVNfc19zKGRldiksCisJCQkJCV9fRklMRV9fLCBfX0xJTkVfXyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeGZpZHhfbG9jaywgZmxhZ3MpOworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCisJCQljdHggPSBsZTMyX3RvX2NwdShwUmVjdlJlcC0+QnVja2V0Q29udGV4dFtpXSk7CisJCQlvbGRfc2tiID0gcHJpdi0+UmN2Q3RsW2N0eF0uc2tiOworCisJCQlsID0gcHJpdi0+UmN2Q3RsW2N0eF0ubGVuOworCQkJaWYgKHN6cmVtIDwgbCkKKwkJCQlsID0gc3pyZW07CisKKy8vCQkJZGlvcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXMvJXM6IEJ1Y2tldHMgPSAlZCwgbGVuID0gJXVcbiIsCisvLwkJCQkJSU9DX0FORF9ORVRERVZfTkFNRVNfc19zKGRldiksCisvLwkJCQkJaSwgbCkpOworCisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobXB0X2Rldi0+cGNpZGV2LAorCQkJCQkJICAgIHByaXYtPlJjdkN0bFtjdHhdLmRtYSwKKwkJCQkJCSAgICBwcml2LT5SY3ZDdGxbY3R4XS5sZW4sCisJCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCW1lbWNweShza2JfcHV0KHNrYiwgbCksIG9sZF9za2ItPmRhdGEsIGwpOworCisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UobXB0X2Rldi0+cGNpZGV2LAorCQkJCQkJICAgICAgIHByaXYtPlJjdkN0bFtjdHhdLmRtYSwKKwkJCQkJCSAgICAgICBwcml2LT5SY3ZDdGxbY3R4XS5sZW4sCisJCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJcHJpdi0+bXB0X3J4ZmlkeFsrK3ByaXYtPm1wdF9yeGZpZHhfdGFpbF0gPSBjdHg7CisJCQlzenJlbSAtPSBsOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4ZmlkeF9sb2NrLCBmbGFncyk7CisKKwl9IGVsc2UgaWYgKGxlbiA8IE1QVF9MQU5fUlhfQ09QWUJSRUFLKSB7CisKKwkJb2xkX3NrYiA9IHNrYjsKKworCQlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKilkZXZfYWxsb2Nfc2tiKGxlbik7CisJCWlmICghc2tiKSB7CisJCQlwcmludGsgKEtFUk5fRVJSIE1ZTkFNICI6ICVzLyVzOiBFUlJPUiAtIENhbid0IGFsbG9jYXRlIHNrYiEgKCVzQCVkKVxuIiwKKwkJCQkJSU9DX0FORF9ORVRERVZfTkFNRVNfc19zKGRldiksCisJCQkJCV9fRklMRV9fLCBfX0xJTkVfXyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShtcHRfZGV2LT5wY2lkZXYsCisJCQkJCSAgICBwcml2LT5SY3ZDdGxbY3R4XS5kbWEsCisJCQkJCSAgICBwcml2LT5SY3ZDdGxbY3R4XS5sZW4sCisJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCW1lbWNweShza2JfcHV0KHNrYiwgbGVuKSwgb2xkX3NrYi0+ZGF0YSwgbGVuKTsKKworCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UobXB0X2Rldi0+cGNpZGV2LAorCQkJCQkgICAgICAgcHJpdi0+UmN2Q3RsW2N0eF0uZG1hLAorCQkJCQkgICAgICAgcHJpdi0+UmN2Q3RsW2N0eF0ubGVuLAorCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnhmaWR4X2xvY2ssIGZsYWdzKTsKKwkJcHJpdi0+bXB0X3J4ZmlkeFsrK3ByaXYtPm1wdF9yeGZpZHhfdGFpbF0gPSBjdHg7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4ZmlkeF9sb2NrLCBmbGFncyk7CisKKwl9IGVsc2UgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnhmaWR4X2xvY2ssIGZsYWdzKTsKKworCQlwcml2LT5SY3ZDdGxbY3R4XS5za2IgPSBOVUxMOworCisJCXBjaV91bm1hcF9zaW5nbGUobXB0X2Rldi0+cGNpZGV2LCBwcml2LT5SY3ZDdGxbY3R4XS5kbWEsCisJCQkJIHByaXYtPlJjdkN0bFtjdHhdLmxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJcHJpdi0+UmN2Q3RsW2N0eF0uZG1hID0gMDsKKworCQlwcml2LT5tcHRfcnhmaWR4WysrcHJpdi0+bXB0X3J4ZmlkeF90YWlsXSA9IGN0eDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhmaWR4X2xvY2ssIGZsYWdzKTsKKworCQlza2JfcHV0KHNrYixsZW4pOworCX0KKworCWF0b21pY19zdWIoY291bnQsICZwcml2LT5idWNrZXRzX291dCk7CisJcHJpdi0+dG90YWxfcmVjZWl2ZWQgKz0gY291bnQ7CisKKwlpZiAocHJpdi0+bXB0X3J4ZmlkeF90YWlsID49IE1QVF9MQU5fTUFYX0JVQ0tFVFNfT1VUKSB7CisJCXByaW50ayAoS0VSTl9FUlIgTVlOQU0gIjogJXMvJXM6IFlvb2hvbyEgbXB0X3J4ZmlkeF90YWlsID0gJWQsICIKKwkJCSJNUFRfTEFOX01BWF9CVUNLRVRTX09VVCA9ICVkXG4iLAorCQkJCUlPQ19BTkRfTkVUREVWX05BTUVTX3NfcyhkZXYpLAorCQkJCXByaXYtPm1wdF9yeGZpZHhfdGFpbCwKKwkJCQlNUFRfTEFOX01BWF9CVUNLRVRTX09VVCk7CisKKwkJcGFuaWMoIkRhbW4gaXQgSmltISBJJ20gYSBkb2N0b3IsIG5vdCBhIHByb2dyYW1tZXIhICIKKwkJCQkiT2gsIHdhaXQgYSBzZWMsIEkgYW0gYSBwcm9ncmFtbWVyLiAiCisJCQkJIkFuZCwgd2hvJ3MgSmltPyE/IVxuIgorCQkJCSJBcnJnZ2hoISBXZSd2ZSBkb25lIGl0IGFnYWluIVxuIik7CisJfQorCisJaWYgKHJlbWFpbmluZyA9PSAwKQorCQlwcmludGsgKEtFUk5fV0FSTklORyBNWU5BTSAiOiAlcy8lczogV0FSTklORyAtIElPQyBvdXQgb2YgYnVja2V0cyEgIgorCQkJIihwcml2LT5idWNrZXRzX291dCA9ICVkKVxuIiwKKwkJCUlPQ19BTkRfTkVUREVWX05BTUVTX3NfcyhkZXYpLAorCQkJYXRvbWljX3JlYWQoJnByaXYtPmJ1Y2tldHNfb3V0KSk7CisJZWxzZSBpZiAocmVtYWluaW5nIDwgMTApCisJCXByaW50ayAoS0VSTl9JTkZPIE1ZTkFNICI6ICVzLyVzOiBJT0Mgc2F5cyAlZCBidWNrZXRzIGxlZnQuICIKKwkJCSIocHJpdi0+YnVja2V0c19vdXQgPSAlZClcbiIsCisJCQlJT0NfQU5EX05FVERFVl9OQU1FU19zX3MoZGV2KSwKKwkJCXJlbWFpbmluZywgYXRvbWljX3JlYWQoJnByaXYtPmJ1Y2tldHNfb3V0KSk7CisJCisJaWYgKChyZW1haW5pbmcgPCBwcml2LT5idWNrZXR0aHJlc2gpICYmCisJICAgICgoYXRvbWljX3JlYWQoJnByaXYtPmJ1Y2tldHNfb3V0KSAtIHJlbWFpbmluZykgPgorCSAgICAgTVBUX0xBTl9CVUNLRVRTX1JFTUFJTl9NSVNNQVRDSF9USFJFU0gpKSB7CisJCQorCQlwcmludGsgKEtFUk5fV0FSTklORyBNWU5BTSAiIE1pc21hdGNoIGJldHdlZW4gZHJpdmVyJ3MgIgorCQkJImJ1Y2tldHNfb3V0IGNvdW50IGFuZCBmdydzIEJ1Y2tldHNSZW1haW5pbmcgIgorCQkJImNvdW50IGhhcyBjcm9zc2VkIHRoZSB0aHJlc2hvbGQsIGlzc3VpbmcgYSAiCisJCQkiTGFuUmVzZXQgdG8gY2xlYXIgdGhlIGZ3J3MgaGFzaHRhYmxlLiBZb3UgbWF5ICIKKwkJCSJ3YW50IHRvIGNoZWNrIHlvdXIgL3Zhci9sb2cvbWVzc2FnZXMgZm9yIFwiQ1JDICIKKwkJCSJlcnJvclwiIGV2ZW50IG5vdGlmaWNhdGlvbnMuXG4iKTsKKwkJCisJCW1wdF9sYW5fcmVzZXQoZGV2KTsKKwkJbXB0X2xhbl93YWtlX3Bvc3RfYnVja2V0c190YXNrKGRldiwgMCk7CisJfQorCQorCXJldHVybiBtcHRfbGFuX3JlY2VpdmVfc2tiKGRldiwgc2tiKTsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyogU2ltcGxlIFNHRSdzIG9ubHkgYXQgdGhlIG1vbWVudCAqLworCitzdGF0aWMgdm9pZAorbXB0X2xhbl9wb3N0X3JlY2VpdmVfYnVja2V0cyh2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgbXB0X2xhbl9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCU1QVF9BREFQVEVSICptcHRfZGV2ID0gcHJpdi0+bXB0X2RldjsKKwlNUFRfRlJBTUVfSERSICptZjsKKwlMQU5SZWNlaXZlUG9zdFJlcXVlc3RfdCAqcFJlY3ZSZXE7CisJU0dFVHJhbnNhY3Rpb24zMl90ICpwVHJhbnM7CisJU0dFU2ltcGxlNjRfdCAqcFNpbXBsZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWRtYV9hZGRyX3QgZG1hOworCXUzMiBjdXJyLCBidWNrZXRzLCBjb3VudCwgbWF4OworCXUzMiBsZW4gPSAoZGV2LT5tdHUgKyBkZXYtPmhhcmRfaGVhZGVyX2xlbiArIDQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwljdXJyID0gYXRvbWljX3JlYWQoJnByaXYtPmJ1Y2tldHNfb3V0KTsKKwlidWNrZXRzID0gKHByaXYtPm1heF9idWNrZXRzX291dCAtIGN1cnIpOworCisJZGlvcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogJXMvJXM6IEAlcywgU3RhcnRfYnVja2V0cyA9ICV1LCBidWNrZXRzX291dCA9ICV1XG4iLAorCQkJSU9DX0FORF9ORVRERVZfTkFNRVNfc19zKGRldiksCisJCQlfX0ZVTkNUSU9OX18sIGJ1Y2tldHMsIGN1cnIpKTsKKworCW1heCA9IChtcHRfZGV2LT5yZXFfc3ogLSBNUFRfTEFOX1JFQ0VJVkVfUE9TVF9SRVFVRVNUX1NJWkUpIC8KKwkJCShNUFRfTEFOX1RSQU5TQUNUSU9OMzJfU0laRSArIHNpemVvZihTR0VTaW1wbGU2NF90KSk7CisKKwl3aGlsZSAoYnVja2V0cykgeworCQltZiA9IG1wdF9nZXRfbXNnX2ZyYW1lKExhbkN0eCwgbXB0X2Rldik7CisJCWlmIChtZiA9PSBOVUxMKSB7CisJCQlwcmludGsgKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGFsbG9jIHJlcXVlc3QgZnJhbWVcbiIsCisJCQkJX19GVU5DVElPTl9fKTsKKwkJCWRpb3ByaW50aygoS0VSTl9FUlIgIiVzOiAldSBidWNrZXRzIHJlbWFpbmluZ1xuIiwKKwkJCQkgX19GVU5DVElPTl9fLCBidWNrZXRzKSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlwUmVjdlJlcSA9IChMQU5SZWNlaXZlUG9zdFJlcXVlc3RfdCAqKSBtZjsKKworCQljb3VudCA9IGJ1Y2tldHM7CisJCWlmIChjb3VudCA+IG1heCkKKwkJCWNvdW50ID0gbWF4OworCisJCXBSZWN2UmVxLT5GdW5jdGlvbiAgICA9IE1QSV9GVU5DVElPTl9MQU5fUkVDRUlWRTsKKwkJcFJlY3ZSZXEtPkNoYWluT2Zmc2V0ID0gMDsKKwkJcFJlY3ZSZXEtPk1zZ0ZsYWdzICAgID0gMDsKKwkJcFJlY3ZSZXEtPlBvcnROdW1iZXIgID0gcHJpdi0+cG51bTsKKworCQlwVHJhbnMgPSAoU0dFVHJhbnNhY3Rpb24zMl90ICopIHBSZWN2UmVxLT5TR19MaXN0OworCQlwU2ltcGxlID0gTlVMTDsKKworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJaW50IGN0eDsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4ZmlkeF9sb2NrLCBmbGFncyk7CisJCQlpZiAocHJpdi0+bXB0X3J4ZmlkeF90YWlsIDwgMCkgeworCQkJCXByaW50ayAoS0VSTl9FUlIgIiVzOiBDYW4ndCBhbGxvYyBjb250ZXh0XG4iLAorCQkJCQlfX0ZVTkNUSU9OX18pOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4ZmlkeF9sb2NrLAorCQkJCQkJICAgICAgIGZsYWdzKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY3R4ID0gcHJpdi0+bXB0X3J4ZmlkeFtwcml2LT5tcHRfcnhmaWR4X3RhaWwtLV07CisKKwkJCXNrYiA9IHByaXYtPlJjdkN0bFtjdHhdLnNrYjsKKwkJCWlmIChza2IgJiYgKHByaXYtPlJjdkN0bFtjdHhdLmxlbiAhPSBsZW4pKSB7CisJCQkJcGNpX3VubWFwX3NpbmdsZShtcHRfZGV2LT5wY2lkZXYsCisJCQkJCQkgcHJpdi0+UmN2Q3RsW2N0eF0uZG1hLAorCQkJCQkJIHByaXYtPlJjdkN0bFtjdHhdLmxlbiwKKwkJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCWRldl9rZnJlZV9za2IocHJpdi0+UmN2Q3RsW2N0eF0uc2tiKTsKKwkJCQlza2IgPSBwcml2LT5SY3ZDdGxbY3R4XS5za2IgPSBOVUxMOworCQkJfQorCisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbik7CisJCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HCisJCQkJCQlNWU5BTSAiLyVzOiBDYW4ndCBhbGxvYyBza2JcbiIsCisJCQkJCQlfX0ZVTkNUSU9OX18pOworCQkJCQlwcml2LT5tcHRfcnhmaWR4WysrcHJpdi0+bXB0X3J4ZmlkeF90YWlsXSA9IGN0eDsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhmaWR4X2xvY2ssIGZsYWdzKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZG1hID0gcGNpX21hcF9zaW5nbGUobXB0X2Rldi0+cGNpZGV2LCBza2ItPmRhdGEsCisJCQkJCQkgICAgIGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJCXByaXYtPlJjdkN0bFtjdHhdLnNrYiA9IHNrYjsKKwkJCQlwcml2LT5SY3ZDdGxbY3R4XS5kbWEgPSBkbWE7CisJCQkJcHJpdi0+UmN2Q3RsW2N0eF0ubGVuID0gbGVuOworCQkJfQorCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeGZpZHhfbG9jaywgZmxhZ3MpOworCisJCQlwVHJhbnMtPkNvbnRleHRTaXplICAgPSBzaXplb2YodTMyKTsKKwkJCXBUcmFucy0+RGV0YWlsc0xlbmd0aCA9IDA7CisJCQlwVHJhbnMtPkZsYWdzICAgICAgICAgPSAwOworCQkJcFRyYW5zLT5UcmFuc2FjdGlvbkNvbnRleHRbMF0gPSBjcHVfdG9fbGUzMihjdHgpOworCisJCQlwU2ltcGxlID0gKFNHRVNpbXBsZTY0X3QgKikgcFRyYW5zLT5UcmFuc2FjdGlvbkRldGFpbHM7CisKKwkJCXBTaW1wbGUtPkZsYWdzTGVuZ3RoID0gY3B1X3RvX2xlMzIoCisJCQkJKChNUElfU0dFX0ZMQUdTX0VORF9PRl9CVUZGRVIgfAorCQkJCSAgTVBJX1NHRV9GTEFHU19TSU1QTEVfRUxFTUVOVCB8CisJCQkJICBNUElfU0dFX0ZMQUdTXzY0X0JJVF9BRERSRVNTSU5HKSA8PCBNUElfU0dFX0ZMQUdTX1NISUZUKSB8IGxlbik7CisJCQlwU2ltcGxlLT5BZGRyZXNzLkxvdyA9IGNwdV90b19sZTMyKCh1MzIpIHByaXYtPlJjdkN0bFtjdHhdLmRtYSk7CisJCQlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gc2l6ZW9mKHUzMikpCisJCQkJcFNpbXBsZS0+QWRkcmVzcy5IaWdoID0gY3B1X3RvX2xlMzIoKHUzMikgKCh1NjQpIHByaXYtPlJjdkN0bFtjdHhdLmRtYSA+PiAzMikpOworCQkJZWxzZQorCQkJCXBTaW1wbGUtPkFkZHJlc3MuSGlnaCA9IDA7CisKKwkJCXBUcmFucyA9IChTR0VUcmFuc2FjdGlvbjMyX3QgKikgKHBTaW1wbGUgKyAxKTsKKwkJfQorCisJCWlmIChwU2ltcGxlID09IE5VTEwpIHsKKy8qKi8JCQlwcmludGsgKEtFUk5fV0FSTklORyBNWU5BTSAiLyVzOiBObyBidWNrZXRzIHBvc3RlZFxuIiwKKy8qKi8JCQkJX19GVU5DVElPTl9fKTsKKwkJCW1wdF9mcmVlX21zZ19mcmFtZShtcHRfZGV2LCBtZik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXBTaW1wbGUtPkZsYWdzTGVuZ3RoIHw9IGNwdV90b19sZTMyKE1QSV9TR0VfRkxBR1NfRU5EX09GX0xJU1QgPDwgTVBJX1NHRV9GTEFHU19TSElGVCk7CisKKwkJcFJlY3ZSZXEtPkJ1Y2tldENvdW50ID0gY3B1X3RvX2xlMzIoaSk7CisKKy8qCXByaW50ayhLRVJOX0lORk8gTVlOQU0gIjogcG9zdGluZyBidWNrZXRzXG4gICAiKTsKKyAqCWZvciAoaSA9IDA7IGkgPCBqICsgMjsgaSArKykKKyAqCSAgICBwcmludGsgKCIgJTA4eCIsIGxlMzJfdG9fY3B1KG1zZ1tpXSkpOworICoJcHJpbnRrICgiXG4iKTsKKyAqLworCisJCW1wdF9wdXRfbXNnX2ZyYW1lKExhbkN0eCwgbXB0X2RldiwgbWYpOworCisJCXByaXYtPnRvdGFsX3Bvc3RlZCArPSBpOworCQlidWNrZXRzIC09IGk7CisJCWF0b21pY19hZGQoaSwgJnByaXYtPmJ1Y2tldHNfb3V0KTsKKwl9CisKK291dDoKKwlkaW9wcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiLyVzOiBFbmRfYnVja2V0cyA9ICV1LCBwcml2LT5idWNrZXRzX291dCA9ICV1XG4iLAorCQkgIF9fRlVOQ1RJT05fXywgYnVja2V0cywgYXRvbWljX3JlYWQoJnByaXYtPmJ1Y2tldHNfb3V0KSkpOworCWRpb3ByaW50aygoS0VSTl9JTkZPIE1ZTkFNICIvJXM6IFBvc3RlZCAldSBidWNrZXRzIGFuZCByZWNlaXZlZCAldSBiYWNrXG4iLAorCV9fRlVOQ1RJT05fXywgcHJpdi0+dG90YWxfcG9zdGVkLCBwcml2LT50b3RhbF9yZWNlaXZlZCkpOworCisJY2xlYXJfYml0KDAsICZwcml2LT5wb3N0X2J1Y2tldHNfYWN0aXZlKTsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICoKK21wdF9yZWdpc3Rlcl9sYW5fZGV2aWNlIChNUFRfQURBUFRFUiAqbXB0X2RldiwgaW50IHBudW0pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2ZjZGV2KHNpemVvZihzdHJ1Y3QgbXB0X2xhbl9wcml2KSk7CisJc3RydWN0IG1wdF9sYW5fcHJpdiAqcHJpdiA9IE5VTEw7CisJdTggSFdhZGRyW0ZDX0FMRU5dLCAqYTsKKworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCWRldi0+bXR1ID0gTVBUX0xBTl9NVFU7CisKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXByaXYtPm1wdF9kZXYgPSBtcHRfZGV2OworCXByaXYtPnBudW0gPSBwbnVtOworCisJbWVtc2V0KCZwcml2LT5wb3N0X2J1Y2tldHNfdGFzaywgMCwgc2l6ZW9mKHN0cnVjdCB3b3JrX3N0cnVjdCkpOworCUlOSVRfV09SSygmcHJpdi0+cG9zdF9idWNrZXRzX3Rhc2ssIG1wdF9sYW5fcG9zdF9yZWNlaXZlX2J1Y2tldHMsIGRldik7CisJcHJpdi0+cG9zdF9idWNrZXRzX2FjdGl2ZSA9IDA7CisKKwlkbHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICJAJWQ6IGJ1Y2tldGxlbiA9ICVkXG4iLAorCQkJX19MSU5FX18sIGRldi0+bXR1ICsgZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyA0KSk7CisKKwlhdG9taWNfc2V0KCZwcml2LT5idWNrZXRzX291dCwgMCk7CisJcHJpdi0+dG90YWxfcG9zdGVkID0gMDsKKwlwcml2LT50b3RhbF9yZWNlaXZlZCA9IDA7CisJcHJpdi0+bWF4X2J1Y2tldHNfb3V0ID0gbWF4X2J1Y2tldHNfb3V0OworCWlmIChtcHRfZGV2LT5wZmFjdHNbMF0uTWF4TGFuQnVja2V0cyA8IG1heF9idWNrZXRzX291dCkKKwkJcHJpdi0+bWF4X2J1Y2tldHNfb3V0ID0gbXB0X2Rldi0+cGZhY3RzWzBdLk1heExhbkJ1Y2tldHM7CisKKwlkbHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICJAJWQ6IE1heExhbkJ1Y2tldHM9JWQsIG1heF9idWNrZXRzX291dC9wcml2PSVkLyVkXG4iLAorCQkJX19MSU5FX18sCisJCQltcHRfZGV2LT5wZmFjdHNbMF0uTWF4TGFuQnVja2V0cywKKwkJCW1heF9idWNrZXRzX291dCwKKwkJCXByaXYtPm1heF9idWNrZXRzX291dCkpOworCisJcHJpdi0+YnVja2V0dGhyZXNoID0gcHJpdi0+bWF4X2J1Y2tldHNfb3V0ICogMiAvIDM7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnR4ZmlkeF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+cnhmaWR4X2xvY2spOworCisJbWVtc2V0KCZwcml2LT5zdGF0cywgMCwgc2l6ZW9mKHByaXYtPnN0YXRzKSk7CisKKwkvKiAgR3JhYiBwcmUtZmV0Y2hlZCBMQU5QYWdlMSBzdHVmZi4gOi0pICovCisJYSA9ICh1OCAqKSAmbXB0X2Rldi0+bGFuX2NuZmdfcGFnZTEuSGFyZHdhcmVBZGRyZXNzTG93OworCisJSFdhZGRyWzBdID0gYVs1XTsKKwlIV2FkZHJbMV0gPSBhWzRdOworCUhXYWRkclsyXSA9IGFbM107CisJSFdhZGRyWzNdID0gYVsyXTsKKwlIV2FkZHJbNF0gPSBhWzFdOworCUhXYWRkcls1XSA9IGFbMF07CisKKwlkZXYtPmFkZHJfbGVuID0gRkNfQUxFTjsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgSFdhZGRyLCBGQ19BTEVOKTsKKwltZW1zZXQoZGV2LT5icm9hZGNhc3QsIDB4ZmYsIEZDX0FMRU4pOworCisJLyogVGhlIFR4IHF1ZXVlIGlzIDEyNyBkZWVwIG9uIHRoZSA5MDkuCisJICogR2l2ZSBvdXJzZWx2ZXMgc29tZSBicmVhdGhpbmcgcm9vbS4KKwkgKi8KKwlwcml2LT50eF9tYXhfb3V0ID0gKHR4X21heF9vdXRfcCA8PSBNUFRfVFhfTUFYX09VVF9MSU0pID8KKwkJCSAgICB0eF9tYXhfb3V0X3AgOiBNUFRfVFhfTUFYX09VVF9MSU07CisKKwlkZXYtPm9wZW4gPSBtcHRfbGFuX29wZW47CisJZGV2LT5zdG9wID0gbXB0X2xhbl9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9IG1wdF9sYW5fZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gTlVMTDsKKwlkZXYtPmNoYW5nZV9tdHUgPSBtcHRfbGFuX2NoYW5nZV9tdHU7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBtcHRfbGFuX3NkdV9zZW5kOworCisvKiBOb3QgaW4gMi4zLjQyLiBOZWVkIDIuMy40NSsgKi8KKwlkZXYtPnR4X3RpbWVvdXQgPSBtcHRfbGFuX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IE1QVF9MQU5fVFhfVElNRU9VVDsKKworCWRscHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogRmluaXNoZWQgcmVnaXN0ZXJpbmcgZGV2ICIKKwkJImFuZCBzZXR0aW5nIGluaXRpYWwgdmFsdWVzXG4iKSk7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgIT0gMCkgeworCQlmcmVlX25ldGRldihkZXYpOworCQlkZXYgPSBOVUxMOworCX0KKwlyZXR1cm4gZGV2OworfQorCitzdGF0aWMgaW50CittcHRsYW5fcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlNUFRfQURBUFRFUiAJCSppb2MgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKKwlpbnQJCQlpOworCisJZm9yIChpID0gMDsgaSA8IGlvYy0+ZmFjdHMuTnVtYmVyT2ZQb3J0czsgaSsrKSB7CisJCXByaW50ayhLRVJOX0lORk8gTVlOQU0gIjogJXM6IFBvcnROdW09JXgsICIKKwkJICAgICAgICJQcm90b2NvbEZsYWdzPSUwMlhoICglYyVjJWMlYylcbiIsCisJCSAgICAgICBpb2MtPm5hbWUsIGlvYy0+cGZhY3RzW2ldLlBvcnROdW1iZXIsCisJCSAgICAgICBpb2MtPnBmYWN0c1tpXS5Qcm90b2NvbEZsYWdzLAorCQkgICAgICAgTVBUX1BST1RPQ09MX0ZMQUdTX2NfY19jX2MoCisJCQkgICAgICAgaW9jLT5wZmFjdHNbaV0uUHJvdG9jb2xGbGFncykpOworCisJCWlmICghKGlvYy0+cGZhY3RzW2ldLlByb3RvY29sRmxhZ3MgJgorCQkJCQlNUElfUE9SVEZBQ1RTX1BST1RPQ09MX0xBTikpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gTVlOQU0gIjogJXM6IEhtbW0uLi4gTEFOIHByb3RvY29sICIKKwkJCSAgICAgICAic2VlbXMgdG8gYmUgZGlzYWJsZWQgb24gdGhpcyBhZGFwdGVyIHBvcnQhXG4iLAorCQkJICAgICAgIGlvYy0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWRldiA9IG1wdF9yZWdpc3Rlcl9sYW5fZGV2aWNlKGlvYywgaSk7CisJCWlmICghZGV2KSB7CisJCQlwcmludGsoS0VSTl9FUlIgTVlOQU0gIjogJXM6IFVuYWJsZSB0byByZWdpc3RlciAiCisJCQkgICAgICAgInBvcnQlZCBhcyBhIExBTiBkZXZpY2VcbiIsIGlvYy0+bmFtZSwKKwkJCSAgICAgICBpb2MtPnBmYWN0c1tpXS5Qb3J0TnVtYmVyKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCQorCQlwcmludGsoS0VSTl9JTkZPIE1ZTkFNICI6ICVzOiBGdXNpb24gTVBUIExBTiBkZXZpY2UgIgorCQkgICAgICAgInJlZ2lzdGVyZWQgYXMgJyVzJ1xuIiwgaW9jLT5uYW1lLCBkZXYtPm5hbWUpOworCQlwcmludGsoS0VSTl9JTkZPIE1ZTkFNICI6ICVzLyVzOiAiCisJCSAgICAgICAiTGFuQWRkciA9ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCQkgICAgICAgSU9DX0FORF9ORVRERVZfTkFNRVNfc19zKGRldiksCisJCSAgICAgICBkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLAorCQkgICAgICAgZGV2LT5kZXZfYWRkclsyXSwgZGV2LT5kZXZfYWRkclszXSwKKwkJICAgICAgIGRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0pOworCQorCQlpb2MtPm5ldGRldiA9IGRldjsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQKK21wdGxhbl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJTVBUX0FEQVBURVIgCQkqaW9jID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXYgPSBpb2MtPm5ldGRldjsKKworCWlmKGRldiAhPSBOVUxMKSB7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJfQorfQorCitzdGF0aWMgc3RydWN0IG1wdF9wY2lfZHJpdmVyIG1wdGxhbl9kcml2ZXIgPSB7CisJLnByb2JlCQk9IG1wdGxhbl9wcm9iZSwKKwkucmVtb3ZlCQk9IG1wdGxhbl9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtcHRfbGFuX2luaXQgKHZvaWQpCit7CisJc2hvd19tcHRtb2RfdmVyKExBTkFNRSwgTEFOVkVSKTsKKworCWlmICgoTGFuQ3R4ID0gbXB0X3JlZ2lzdGVyKGxhbl9yZXBseSwgTVBUTEFOX0RSSVZFUikpIDw9IDApIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBNWU5BTSAiOiBGYWlsZWQgdG8gcmVnaXN0ZXIgd2l0aCBNUFQgYmFzZSBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qIFNldCB0aGUgY2FsbGJhY2sgaW5kZXggdG8gYmUgdXNlZCBieSBkcml2ZXIgY29yZSBmb3IgdHVyYm8gcmVwbGllcyAqLworCW1wdF9sYW5faW5kZXggPSBMYW5DdHg7CisKKwlkbHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IGFzc2lnbmVkIGNvbnRleHQgb2YgJWRcbiIsIExhbkN0eCkpOworCisJaWYgKG1wdF9yZXNldF9yZWdpc3RlcihMYW5DdHgsIG1wdF9sYW5faW9jX3Jlc2V0KSkgeworCQlwcmludGsoS0VSTl9FUlIgTVlOQU0gIjogRWllZWUhIHVuYWJsZSB0byByZWdpc3RlciBhIHJlc2V0ICIKKwkJICAgICAgICJoYW5kbGVyIHdpdGggbXB0YmFzZSEgVGhlIHdvcmxkIGlzIGF0IGFuIGVuZCEgIgorCQkgICAgICAgIkV2ZXJ5dGhpbmcgaXMgZmFkaW5nIHRvIGJsYWNrISBHb29kYnllLlxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJZGxwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBSZWdpc3RlcmVkIGZvciBJT0MgcmVzZXQgbm90aWZpY2F0aW9uc1xuIikpOworCQorCWlmIChtcHRfZGV2aWNlX2RyaXZlcl9yZWdpc3RlcigmbXB0bGFuX2RyaXZlciwgTVBUTEFOX0RSSVZFUikpCisJCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBmYWlsZWQgdG8gcmVnaXN0ZXIgZGQgY2FsbGJhY2tzXG4iKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtcHRfbGFuX2V4aXQodm9pZCkKK3sKKwltcHRfZGV2aWNlX2RyaXZlcl9kZXJlZ2lzdGVyKE1QVExBTl9EUklWRVIpOworCW1wdF9yZXNldF9kZXJlZ2lzdGVyKExhbkN0eCk7CisKKwlpZiAoTGFuQ3R4ID49IDApIHsKKwkJbXB0X2RlcmVnaXN0ZXIoTGFuQ3R4KTsKKwkJTGFuQ3R4ID0gLTE7CisJCW1wdF9sYW5faW5kZXggPSAwOworCX0KK30KKworbW9kdWxlX2luaXQobXB0X2xhbl9pbml0KTsKK21vZHVsZV9leGl0KG1wdF9sYW5fZXhpdCk7CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAorbXB0X2xhbl90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1wdF9sYW5fb2hkciAqZmNoID0gKHN0cnVjdCBtcHRfbGFuX29oZHIgKilza2ItPmRhdGE7CisJc3RydWN0IGZjbGxjICpmY2xsYzsKKworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgbXB0X2xhbl9vaGRyKSk7CisKKwlpZiAoZmNoLT5kdHlwZSA9PSBodG9ucygweGZmZmYpKSB7CisJCXUzMiAqcCA9ICh1MzIgKikgZmNoOworCisJCXN3YWIzMnMocCArIDApOworCQlzd2FiMzJzKHAgKyAxKTsKKwkJc3dhYjMycyhwICsgMik7CisJCXN3YWIzMnMocCArIDMpOworCisJCXByaW50ayAoS0VSTl9XQVJOSU5HIE1ZTkFNICI6ICVzOiBXQVJOSU5HIC0gQnJvYWRjYXN0IHN3YXAgRi9XIGJ1ZyBkZXRlY3RlZCFcbiIsCisJCQkJTkVUREVWX1BUUl9UT19JT0NfTkFNRV9zKGRldikpOworCQlwcmludGsgKEtFUk5fV0FSTklORyBNWU5BTSAiOiBQbGVhc2UgdXBkYXRlIHNlbmRlciBAIE1BQ19hZGRyID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJZmNoLT5zYWRkclswXSwgZmNoLT5zYWRkclsxXSwgZmNoLT5zYWRkclsyXSwKKwkJCQlmY2gtPnNhZGRyWzNdLCBmY2gtPnNhZGRyWzRdLCBmY2gtPnNhZGRyWzVdKTsKKwl9CisKKwlpZiAoKmZjaC0+ZGFkZHIgJiAxKSB7CisJCWlmICghbWVtY21wKGZjaC0+ZGFkZHIsIGRldi0+YnJvYWRjYXN0LCBGQ19BTEVOKSkgeworCQkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9CUk9BRENBU1Q7CisJCX0gZWxzZSB7CisJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX01VTFRJQ0FTVDsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChtZW1jbXAoZmNoLT5kYWRkciwgZGV2LT5kZXZfYWRkciwgRkNfQUxFTikpIHsKKwkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOworCQl9IGVsc2UgeworCQkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOworCQl9CisJfQorCisJZmNsbGMgPSAoc3RydWN0IGZjbGxjICopc2tiLT5kYXRhOworCisjaWZkZWYgUUxPR0lDX05BQV9XT1JLQVJPVU5ECit7CisJdTE2IHNvdXJjZV9uYWEgPSBmY2gtPnN0eXBlLCBmb3VuZCA9IDA7CisKKwkvKiBXb3JrYXJvdW5kIGZvciBRTG9naWMgbm90IGZvbGxvd2luZyBSRkMgMjYyNSBpbiByZWdhcmRzIHRvIHRoZSBOQUEKKwkgICB2YWx1ZS4gKi8KKworCWlmICgoc291cmNlX25hYSAmIDB4RjAwMCkgPT0gMCkKKwkJc291cmNlX25hYSA9IHN3YWIxNihzb3VyY2VfbmFhKTsKKworCWlmIChmY2xsYy0+ZXRoZXJ0eXBlID09IGh0b25zKEVUSF9QX0FSUCkpCisJICAgIGRscHJpbnRrICgoS0VSTl9JTkZPICJtcHRsYW4vdHlwZV90cmFuczogZ290IGFycCByZXEvcmVwIHcvIG5hYSBvZiAiCisJCSAgICAgICIlMDR4LlxuIiwgc291cmNlX25hYSkpOworCisJaWYgKChmY2xsYy0+ZXRoZXJ0eXBlID09IGh0b25zKEVUSF9QX0FSUCkpICYmCisJICAgKChzb3VyY2VfbmFhID4+IDEyKSAhPSAgTVBUX0xBTl9OQUFfUkZDMjYyNSkpeworCQlzdHJ1Y3QgTkFBX0hvc2VkICpuaCwgKnByZXZuaDsKKwkJaW50IGk7CisKKwkJZGxwcmludGsgKChLRVJOX0lORk8gIm1wdGxhbi90eXBlX3RyYW5zOiBBUlAgUmVxL1JlcCBmcm9tICIKKwkJCSAgInN5c3RlbSB3aXRoIG5vbi1SRkMgMjYyNSBOQUEgdmFsdWUgKCUwNHgpLlxuIiwKKwkJCSAgc291cmNlX25hYSkpOworCisJCXdyaXRlX2xvY2tfaXJxKCZiYWRfbmFhX2xvY2spOworCQlmb3IgKHByZXZuaCA9IG5oID0gbXB0X2JhZF9uYWE7IG5oICE9IE5VTEw7CisJCSAgICAgcHJldm5oPW5oLCBuaD1uaC0+bmV4dCkgeworCQkJaWYgKChuaC0+aWVlZVswXSA9PSBmY2gtPnNhZGRyWzBdKSAmJgorCQkJICAgIChuaC0+aWVlZVsxXSA9PSBmY2gtPnNhZGRyWzFdKSAmJgorCQkJICAgIChuaC0+aWVlZVsyXSA9PSBmY2gtPnNhZGRyWzJdKSAmJgorCQkJICAgIChuaC0+aWVlZVszXSA9PSBmY2gtPnNhZGRyWzNdKSAmJgorCQkJICAgIChuaC0+aWVlZVs0XSA9PSBmY2gtPnNhZGRyWzRdKSAmJgorCQkJICAgIChuaC0+aWVlZVs1XSA9PSBmY2gtPnNhZGRyWzVdKSkgeworCQkJCWZvdW5kID0gMTsKKwkJCQlkbHByaW50ayAoKEtFUk5fSU5GTyAibXB0bGFuL3R5cGVfdHJhbnM6IEFSUCBSZSIKKwkJCQkJICJxL1JlcCB3LyBiYWQgTkFBIGZyb20gc3lzdGVtIGFscmVhZHkiCisJCQkJCSAiIGluIERCLlxuIikpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKCghZm91bmQpICYmIChuaCA9PSBOVUxMKSkgeworCisJCQluaCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBOQUFfSG9zZWQpLCBHRlBfS0VSTkVMKTsKKwkJCWRscHJpbnRrICgoS0VSTl9JTkZPICJtcHRsYW4vdHlwZV90cmFuczogQVJQIFJlcS9SZXAgdy8iCisJCQkJICIgYmFkIE5BQSBmcm9tIHN5c3RlbSBub3QgeWV0IGluIERCLlxuIikpOworCisJCQlpZiAobmggIT0gTlVMTCkgeworCQkJCW5oLT5uZXh0ID0gTlVMTDsKKwkJCQlpZiAoIW1wdF9iYWRfbmFhKQorCQkJCQltcHRfYmFkX25hYSA9IG5oOworCQkJCWlmIChwcmV2bmgpCisJCQkJCXByZXZuaC0+bmV4dCA9IG5oOworCisJCQkJbmgtPk5BQSA9IHNvdXJjZV9uYWE7IC8qIFNldCB0aGUgU19OQUEgdmFsdWUuICovCisJCQkJZm9yIChpID0gMDsgaSA8IEZDX0FMRU47IGkrKykKKwkJCQkJbmgtPmllZWVbaV0gPSBmY2gtPnNhZGRyW2ldOworCQkJCWRscHJpbnRrICgoS0VSTl9JTkZPICJHb3QgQVJQIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDoiCisJCQkJCSAgIiUwMng6JTAyeCB3aXRoIG5vbi1jb21wbGlhbnQgU19OQUEgdmFsdWUuXG4iLAorCQkJCQkgIGZjaC0+c2FkZHJbMF0sIGZjaC0+c2FkZHJbMV0sIGZjaC0+c2FkZHJbMl0sCisJCQkJCSAgZmNoLT5zYWRkclszXSwgZmNoLT5zYWRkcls0XSxmY2gtPnNhZGRyWzVdKSk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayAoS0VSTl9FUlIgIm1wdGxhbi90eXBlX3RyYW5zOiBVbmFibGUgdG8iCisJCQkJCSIga21hbGxvYyBhIE5BQV9Ib3NlZCBzdHJ1Y3QuXG4iKTsKKwkJCX0KKwkJfSBlbHNlIGlmICghZm91bmQpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgIm1wdGxhbi90eXBlX3RyYW5zOiBmb3VuZCBub3QiCisJCQkJIiBzZXQsIGJ1dCBuaCBpc24ndCBudWxsLiBFdmlsICIKKwkJCQkiZnVua2luZXNzIGFib3VuZHMuXG4iKTsKKwkJfQorCQl3cml0ZV91bmxvY2tfaXJxKCZiYWRfbmFhX2xvY2spOworCX0KK30KKyNlbmRpZgorCisJLyogU3RyaXAgdGhlIFNOQVAgaGVhZGVyIGZyb20gQVJQIHBhY2tldHMgc2luY2Ugd2UgZG9uJ3QKKwkgKiBwYXNzIHRoZW0gdGhyb3VnaCB0byB0aGUgODAyLjIvU05BUCBsYXllcnMuCisJICovCisJaWYgKGZjbGxjLT5kc2FwID09IEVYVEVOREVEX1NBUCAmJgorCQkoZmNsbGMtPmV0aGVydHlwZSA9PSBodG9ucyhFVEhfUF9JUCkgfHwKKwkJIGZjbGxjLT5ldGhlcnR5cGUgPT0gaHRvbnMoRVRIX1BfQVJQKSkpIHsKKwkJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGZjbGxjKSk7CisJCXJldHVybiBmY2xsYy0+ZXRoZXJ0eXBlOworCX0KKworCXJldHVybiBodG9ucyhFVEhfUF84MDJfMik7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0bGFuLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGxhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NzkwNDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGxhbi5oCkBAIC0wLDAgKzEsODUgQEAKKy8qIG1wdGxhbi5oICovCisKKyNpZm5kZWYgTElOVVhfTVBUTEFOX0hfSU5DTFVERUQKKyNkZWZpbmUgTElOVVhfTVBUTEFOX0hfSU5DTFVERUQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKF9fR0VOS1NZTVNfXykKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKy8vICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjZGV2aWNlLmg+CisvLyAjaW5jbHVkZSA8bGludXgvZmRkaWRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisvLyAjaW5jbHVkZSA8bGludXgvdHJkZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyAgICAvKiBPdmVycmlkZSBtcHRiYXNlLmggYnkgcHJlLWRlZmluaW5nIHRoZXNlISAqLworICAgICNkZWZpbmUgTU9EVUxFQVVUSE9SICJOb2FoIFJvbWVyLCBFZGRpZSBDLiBEb3N0IgorCisjaW5jbHVkZSAibXB0YmFzZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIExBTkFNRQkJIkZ1c2lvbiBNUFQgTEFOIGRyaXZlciIKKyNkZWZpbmUgTEFOVkVSCQlNUFRfTElOVVhfVkVSU0lPTl9DT01NT04KKworI2lmZGVmIE1PRFVMRQorTU9EVUxFX0FVVEhPUihNT0RVTEVBVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKExBTkFNRSk7CisjZW5kaWYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNUFRfTEFOX01BWF9CVUNLRVRTX09VVCAyNTYKKyNkZWZpbmUgTVBUX0xBTl9CVUNLRVRfVEhSRVNICTE4IC8qIDkgYnVja2V0cyBpbiBvbmUgbWVzc2FnZSAqLworI2RlZmluZSBNUFRfTEFOX0JVQ0tFVFNfUkVNQUlOX01JU01BVENIX1RIUkVTSCAxMAorI2RlZmluZSBNUFRfTEFOX1JYX0NPUFlCUkVBSwkyMDAKKyNkZWZpbmUgTVBUX0xBTl9UWF9USU1FT1VUCSgxKkhaKQorI2RlZmluZSBNUFRfVFhfTUFYX09VVF9MSU0gICAgICAxMjcKKworI2RlZmluZSBNUFRfTEFOX01JTl9NVFUJCTk2CQkvKiBSRkMyNjI1ICovCisjZGVmaW5lIE1QVF9MQU5fTUFYX01UVQkJNjUyODAJCS8qIFJGQzI2MjUgKi8KKyNkZWZpbmUgTVBUX0xBTl9NVFUgICAgICAgICAgICAgMTMzMTIJCS8qIE1heCBwZXJmIHJhbmdlICsgbG93ZXIgbWVtCisJCQkJCQkgICB1c2FnZSB0aGFuIDE2MTI4ICovCisKKyNkZWZpbmUgTVBUX0xBTl9OQUFfUkZDMjYyNSAgICAgMHgxCisjZGVmaW5lIE1QVF9MQU5fTkFBX1FMT0dJQyAgICAgIDB4MgorCisvKiBNUFQgTEFOIFJlc2V0IGFuZCBTdXNwZW5kIFJlc291cmNlIEZsYWdzIERlZmluZXMgKi8KKworI2RlZmluZSBNUFRfTEFOX1JFU09VUkNFX0ZMQUdfUkVUVVJOX1BPU1RFRF9CVUNLRVRTICAgIDB4MDEKKyNkZWZpbmUgTVBUX0xBTl9SRVNPVVJDRV9GTEFHX1JFVFVSTl9QRU5EX1RSQU5TTUlUUyAgICAweDAyCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBNUFRfTEFOX0lPX0RFQlVHCisjZGVmaW5lIGRpb3ByaW50ayh4KSAgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIGRpb3ByaW50ayh4KQorI2VuZGlmCisKKyNpZmRlZiBNUFRfTEFOX0RFQlVHCisjZGVmaW5lIGRscHJpbnRrKHgpICBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgZGxwcmludGsoeCkKKyNlbmRpZgorCisjZGVmaW5lIE5FVERFVl9UT19MQU5QUklWX1BUUihkKQkoKHN0cnVjdCBtcHRfbGFuX3ByaXYgKikoZCktPnByaXYpCisjZGVmaW5lIE5FVERFVl9QVFJfVE9fSU9DX05BTUVfcyhkKQkoTkVUREVWX1RPX0xBTlBSSVZfUFRSKGQpLT5tcHRfZGV2LT5uYW1lKQorI2RlZmluZSBJT0NfQU5EX05FVERFVl9OQU1FU19zX3MoZCkJTkVUREVWX1BUUl9UT19JT0NfTkFNRV9zKGQpLCAoZCktPm5hbWUKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOThkNjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5jCkBAIC0wLDAgKzEsNjAyMSBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMKKyAqICAgICAgSGlnaCBwZXJmb3JtYW5jZSBTQ1NJIC8gRmlicmUgQ2hhbm5lbCBTQ1NJIEhvc3QgZGV2aWNlIGRyaXZlci4KKyAqICAgICAgRm9yIHVzZSB3aXRoIFBDSSBjaGlwL2FkYXB0ZXIocyk6CisgKiAgICAgICAgICBMU0lGQzl4eC9MU0k0MDl4eCBGaWJyZSBDaGFubmVsCisgKiAgICAgIHJ1bm5pbmcgTFNJIExvZ2ljIEZ1c2lvbiBNUFQgKE1lc3NhZ2UgUGFzc2luZyBUZWNobm9sb2d5KSBmaXJtd2FyZS4KKyAqCisgKiAgQ3JlZGl0czoKKyAqICAgICAgVGhpcyBkcml2ZXIgd291bGQgbm90IGV4aXN0IGlmIG5vdCBmb3IgQWxhbiBDb3gncyBkZXZlbG9wbWVudAorICogICAgICBvZiB0aGUgbGludXggaTJvIGRyaXZlci4KKyAqCisgKiAgICAgIEEgc3BlY2lhbCB0aGFua3MgdG8gUGFtZWxhIERlbGFuZXkgKExTSSBMb2dpYykgZm9yIHRvbnMgb2Ygd29yaworICogICAgICBhbmQgY291bnRsZXNzIGVuaGFuY2VtZW50cyB3aGlsZSBhZGRpbmcgc3VwcG9ydCBmb3IgdGhlIDEwMzAKKyAqICAgICAgY2hpcCBmYW1pbHkuICBQYW0gaGFzIGJlZW4gaW5zdHJ1bWVudGFsIGluIHRoZSBkZXZlbG9wbWVudCBvZgorICogICAgICBvZiB0aGUgMi54eC54eCBzZXJpZXMgZnVzaW9uIGRyaXZlcnMsIGFuZCBoZXIgY29udHJpYnV0aW9ucyBhcmUKKyAqICAgICAgZmFyIHRvbyBudW1lcm91cyB0byBob3BlIHRvIGxpc3QgaW4gb25lIHBsYWNlLgorICoKKyAqICAgICAgQSBodWdlIGRlYnQgb2YgZ3JhdGl0dWRlIGlzIG93ZWQgdG8gRGF2aWQgUy4gTWlsbGVyIChEYXZlTSkKKyAqICAgICAgZm9yIGZpeGluZyBtdWNoIG9mIHRoZSBzdHVwaWQgYW5kIGJyb2tlbiBzdHVmZiBpbiB0aGUgZWFybHkKKyAqICAgICAgZHJpdmVyIHdoaWxlIHBvcnRpbmcgdG8gc3BhcmM2NCBwbGF0Zm9ybS4gIFRIQU5LIFlPVSEKKyAqCisgKiAgICAgIChzZWUgbXB0YmFzZS5jKQorICoKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNCBMU0kgTG9naWMgQ29ycG9yYXRpb24KKyAqICBPcmlnaW5hbCBhdXRob3I6IFN0ZXZlbiBKLiBSYWxzdG9uCisgKiAgKG1haWx0bzpzanJhbHN0b24xQG5ldHNjYXBlLm5ldCkKKyAqICAobWFpbHRvOm1wdF9saW51eF9kZXZlbG9wZXJAbHNpbC5jb20pCisgKgorICogICRJZDogbXB0c2NzaWguYyx2IDEuMTA0IDIwMDIvMTIvMDMgMjE6MjY6MzQgcGRlbGFuZXkgRXhwICQKKyAqLworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIE5PIFdBUlJBTlRZCisgICAgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCisgICAgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQKKyAgICBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorICAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyAgICBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCisgICAgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCisgICAgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwKKyAgICBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KKworICAgIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisgICAgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKKyAgICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgICBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORAorICAgIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgorICAgIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAgICBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKKyAgICBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKi8KKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKworI2luY2x1ZGUgImxpbnV4X2NvbXBhdC5oIgkvKiBsaW51eC0yLjYgdHdlYWtzICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogZm9yIG1kZWxheSAqLworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgkvKiBuZWVkZWQgZm9yIGluX2ludGVycnVwdCgpIHByb3RvICovCisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CS8qIG5vdGlmaWVyIGNvZGUgKi8KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CisKKyNpbmNsdWRlICJtcHRiYXNlLmgiCisjaW5jbHVkZSAibXB0c2NzaWguaCIKKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworI2RlZmluZSBteV9OQU1FCQkiRnVzaW9uIE1QVCBTQ1NJIEhvc3QgZHJpdmVyIgorI2RlZmluZSBteV9WRVJTSU9OCU1QVF9MSU5VWF9WRVJTSU9OX0NPTU1PTgorI2RlZmluZSBNWU5BTQkJIm1wdHNjc2loIgorCitNT0RVTEVfQVVUSE9SKE1PRFVMRUFVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04obXlfTkFNRSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIENvbW1hbmQgbGluZSBhcmdzICovCitzdGF0aWMgaW50IG1wdF9kdiA9IE1QVFNDU0lIX0RPTUFJTl9WQUxJREFUSU9OOworTU9EVUxFX1BBUk0obXB0X2R2LCAiaSIpOworTU9EVUxFX1BBUk1fREVTQyhtcHRfZHYsICIgRFYgQWxnb3JpdGhtOiBlbmhhbmNlZD0xLCBiYXNpYz0wIChkZWZhdWx0PU1QVFNDU0lIX0RPTUFJTl9WQUxJREFUSU9OPTEpIik7CisKK3N0YXRpYyBpbnQgbXB0X3dpZHRoID0gTVBUU0NTSUhfTUFYX1dJRFRIOworTU9EVUxFX1BBUk0obXB0X3dpZHRoLCAiaSIpOworTU9EVUxFX1BBUk1fREVTQyhtcHRfd2lkdGgsICIgTWF4IEJ1cyBXaWR0aDogd2lkZT0xLCBuYXJyb3c9MCAoZGVmYXVsdD1NUFRTQ1NJSF9NQVhfV0lEVEg9MSkiKTsKKworc3RhdGljIGludCBtcHRfZmFjdG9yID0gTVBUU0NTSUhfTUlOX1NZTkM7CitNT0RVTEVfUEFSTShtcHRfZmFjdG9yLCAiaCIpOworTU9EVUxFX1BBUk1fREVTQyhtcHRfZmFjdG9yLCAiIE1pbiBTeW5jIEZhY3RvciAoZGVmYXVsdD1NUFRTQ1NJSF9NSU5fU1lOQz0weDA4KSIpOworCitzdGF0aWMgaW50IG1wdF9zYWZfdGUgPSBNUFRTQ1NJSF9TQUZfVEU7CitNT0RVTEVfUEFSTShtcHRfc2FmX3RlLCAiaSIpOworTU9EVUxFX1BBUk1fREVTQyhtcHRfc2FmX3RlLCAiIEZvcmNlIGVuYWJsaW5nIFNFUCBQcm9jZXNzb3I6IGVuYWJsZT0xICAoZGVmYXVsdD1NUFRTQ1NJSF9TQUZfVEU9MCkiKTsKKworc3RhdGljIGludCBtcHRfcHFfZmlsdGVyID0gMDsKK01PRFVMRV9QQVJNKG1wdF9wcV9maWx0ZXIsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKG1wdF9wcV9maWx0ZXIsICIgRW5hYmxlIHBlcmlwaGVyYWwgcXVhbGlmaWVyIGZpbHRlcjogZW5hYmxlPTEgIChkZWZhdWx0PTApIik7CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKwordHlwZWRlZiBzdHJ1Y3QgX0JJR19TRU5TRV9CVUYgeworCXU4CQlkYXRhW01QVF9TRU5TRV9CVUZGRVJfQUxMT0NdOworfSBCSUdfU0VOU0VfQlVGOworCisjZGVmaW5lIE1QVF9TQ0FORFZfR09PRAkJCSgweDAwMDAwMDAwKSAvKiBtdXN0IGJlIDAgKi8KKyNkZWZpbmUgTVBUX1NDQU5EVl9ESURfUkVTRVQJCSgweDAwMDAwMDAxKQorI2RlZmluZSBNUFRfU0NBTkRWX1NFTlNFCQkoMHgwMDAwMDAwMikKKyNkZWZpbmUgTVBUX1NDQU5EVl9TT01FX0VSUk9SCQkoMHgwMDAwMDAwNCkKKyNkZWZpbmUgTVBUX1NDQU5EVl9TRUxFQ1RJT05fVElNRU9VVAkoMHgwMDAwMDAwOCkKKyNkZWZpbmUgTVBUX1NDQU5EVl9JU1NVRV9TRU5TRQkJKDB4MDAwMDAwMTApCisjZGVmaW5lIE1QVF9TQ0FORFZfRkFMTEJBQ0sJCSgweDAwMDAwMDIwKQorCisjZGVmaW5lIE1QVF9TQ0FORFZfTUFYX1JFVFJJRVMJCSgxMCkKKworI2RlZmluZSBNUFRfSUNGTEFHX0JVRl9DQVAJMHgwMQkvKiBSZWFkQnVmZmVyIFJlYWQgQ2FwYWNpdHkgZm9ybWF0ICovCisjZGVmaW5lIE1QVF9JQ0ZMQUdfRUNITwkJMHgwMgkvKiBSZWFkQnVmZmVyIEVjaG8gYnVmZmVyIGZvcm1hdCAqLworI2RlZmluZSBNUFRfSUNGTEFHX1BIWVNfRElTSwkweDA0CS8qIEFueSBTQ1NJIElPIGJ1dCBkbyBQaHlzIERpc2sgRm9ybWF0ICovCisjZGVmaW5lIE1QVF9JQ0ZMQUdfVEFHR0VEX0NNRAkweDA4CS8qIERvIHRhZ2dlZCBJTyAqLworI2RlZmluZSBNUFRfSUNGTEFHX0RJRF9SRVNFVAkweDIwCS8qIEJ1cyBSZXNldCBvY2N1cnJlZCB3aXRoIHRoaXMgY29tbWFuZCAqLworI2RlZmluZSBNUFRfSUNGTEFHX1JFU0VSVkVECTB4NDAJLyogUmVzZXJ2ZWQgaGFzIGJlZW4gaXNzdWVkICovCisKK3R5cGVkZWYgc3RydWN0IF9pbnRlcm5hbF9jbWQgeworCWNoYXIJCSpkYXRhOwkJLyogZGF0YSBwb2ludGVyICovCisJZG1hX2FkZHJfdAlkYXRhX2RtYTsJLyogZGF0YSBkbWEgYWRkcmVzcyAqLworCWludAkJc2l6ZTsJCS8qIHRyYW5zZmVyIHNpemUgKi8KKwl1OAkJY21kOwkJLyogU0NTSSBPcCBDb2RlICovCisJdTgJCWJ1czsJCS8qIGJ1cyBudW1iZXIgKi8KKwl1OAkJaWQ7CQkvKiBTQ1NJIElEICh2aXJ0dWFsKSAqLworCXU4CQlsdW47CisJdTgJCWZsYWdzOwkJLyogQml0IEZpZWxkIC0gU2VlIGFib3ZlICovCisJdTgJCXBoeXNEaXNrTnVtOwkvKiBQaHlzIGRpc2sgbnVtYmVyLCAtMSBlbHNlICovCisJdTgJCXJzdmQyOworCXU4CQlyc3ZkOworfSBJTlRFUk5BTF9DTUQ7CisKK3R5cGVkZWYgc3RydWN0IF9uZWdvcGFybXMgeworCXU4IHdpZHRoOworCXU4IG9mZnNldDsKKwl1OCBmYWN0b3I7CisJdTggZmxhZ3M7Cit9IE5FR09QQVJNUzsKKwordHlwZWRlZiBzdHJ1Y3QgX2R2X3BhcmFtZXRlcnMgeworCU5FR09QQVJNUwkgbWF4OworCU5FR09QQVJNUwkgbm93OworCXU4CQkgY21kOworCXU4CQkgaWQ7CisJdTE2CQkgcGFkMTsKK30gRFZQQVJBTUVURVJTOworCisKKy8qCisgKiAgT3RoZXIgcHJpdmF0ZS9mb3J3YXJkIHByb3Rvcy4uLgorICovCitzdGF0aWMgaW50CW1wdHNjc2loX2lvX2RvbmUoTVBUX0FEQVBURVIgKmlvYywgTVBUX0ZSQU1FX0hEUiAqbWYsIE1QVF9GUkFNRV9IRFIgKnIpOworc3RhdGljIHZvaWQJbXB0c2NzaWhfcmVwb3J0X3F1ZXVlX2Z1bGwoc3RydWN0IHNjc2lfY21uZCAqc2MsIFNDU0lJT1JlcGx5X3QgKnBTY3NpUmVwbHksIFNDU0lJT1JlcXVlc3RfdCAqcFNjc2lSZXEpOworc3RhdGljIGludAltcHRzY3NpaF90YXNrbWdtdF9jb21wbGV0ZShNUFRfQURBUFRFUiAqaW9jLCBNUFRfRlJBTUVfSERSICptZiwgTVBUX0ZSQU1FX0hEUiAqcik7CisKK3N0YXRpYyBpbnQJbXB0c2NzaWhfQWRkU0dFKE1QVF9BREFQVEVSICppb2MsIHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LAorCQkJCSBTQ1NJSU9SZXF1ZXN0X3QgKnBSZXEsIGludCByZXFfaWR4KTsKK3N0YXRpYyB2b2lkCW1wdHNjc2loX2ZyZWVDaGFpbkJ1ZmZlcnMoTVBUX0FEQVBURVIgKmlvYywgaW50IHJlcV9pZHgpOworc3RhdGljIHZvaWQJY29weV9zZW5zZV9kYXRhKHN0cnVjdCBzY3NpX2NtbmQgKnNjLCBNUFRfU0NTSV9IT1NUICpoZCwgTVBUX0ZSQU1FX0hEUiAqbWYsIFNDU0lJT1JlcGx5X3QgKnBTY3NpUmVwbHkpOworc3RhdGljIGludAltcHRzY3NpaF90bV9wZW5kaW5nX3dhaXQoTVBUX1NDU0lfSE9TVCAqIGhkKTsKK3N0YXRpYyBpbnQJbXB0c2NzaWhfdG1fd2FpdF9mb3JfY29tcGxldGlvbihNUFRfU0NTSV9IT1NUICogaGQsIHVsb25nIHRpbWVvdXQgKTsKK3N0YXRpYyB1MzIJU0NQTlRfVE9fTE9PS1VQX0lEWChzdHJ1Y3Qgc2NzaV9jbW5kICpzYyk7CisKK3N0YXRpYyBpbnQJbXB0c2NzaWhfVE1IYW5kbGVyKE1QVF9TQ1NJX0hPU1QgKmhkLCB1OCB0eXBlLCB1OCBjaGFubmVsLCB1OCB0YXJnZXQsIHU4IGx1biwgaW50IGN0eDJhYm9ydCwgdWxvbmcgdGltZW91dCk7CitzdGF0aWMgaW50CW1wdHNjc2loX0lzc3VlVGFza01nbXQoTVBUX1NDU0lfSE9TVCAqaGQsIHU4IHR5cGUsIHU4IGNoYW5uZWwsIHU4IHRhcmdldCwgdTggbHVuLCBpbnQgY3R4MmFib3J0LCB1bG9uZyB0aW1lb3V0KTsKKworc3RhdGljIGludAltcHRzY3NpaF9pb2NfcmVzZXQoTVBUX0FEQVBURVIgKmlvYywgaW50IHBvc3RfcmVzZXQpOworc3RhdGljIGludAltcHRzY3NpaF9ldmVudF9wcm9jZXNzKE1QVF9BREFQVEVSICppb2MsIEV2ZW50Tm90aWZpY2F0aW9uUmVwbHlfdCAqcEV2UmVwbHkpOworCitzdGF0aWMgdm9pZAltcHRzY3NpaF9pbml0VGFyZ2V0KE1QVF9TQ1NJX0hPU1QgKmhkLCBpbnQgYnVzX2lkLCBpbnQgdGFyZ2V0X2lkLCB1OCBsdW4sIGNoYXIgKmRhdGEsIGludCBkbGVuKTsKK3N0YXRpYyB2b2lkCW1wdHNjc2loX3NldFRhcmdldE5lZ29QYXJtcyhNUFRfU0NTSV9IT1NUICpoZCwgVmlydERldmljZSAqdGFyZ2V0LCBjaGFyIGJ5dGU1Nik7CitzdGF0aWMgdm9pZAltcHRzY3NpaF9zZXRfZHZmbGFncyhNUFRfU0NTSV9IT1NUICpoZCwgU0NTSUlPUmVxdWVzdF90ICpwUmVxKTsKK3N0YXRpYyB2b2lkCW1wdHNjc2loX3NldERldmljZVBhZ2UxRmxhZ3MgKHU4IHdpZHRoLCB1OCBmYWN0b3IsIHU4IG9mZnNldCwgaW50ICpyZXF1ZXN0ZWRQdHIsIGludCAqY29uZmlndXJhdGlvblB0ciwgdTggZmxhZ3MpOworc3RhdGljIHZvaWQJbXB0c2NzaWhfbm9fbmVnb3RpYXRlKE1QVF9TQ1NJX0hPU1QgKmhkLCBpbnQgdGFyZ2V0X2lkKTsKK3N0YXRpYyBpbnQJbXB0c2NzaWhfd3JpdGVTRFAxKE1QVF9TQ1NJX0hPU1QgKmhkLCBpbnQgcG9ydG51bSwgaW50IHRhcmdldCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQJbXB0c2NzaWhfd3JpdGVJT0NQYWdlNChNUFRfU0NTSV9IT1NUICpoZCwgaW50IHRhcmdldF9pZCwgaW50IGJ1cyk7CitzdGF0aWMgaW50CW1wdHNjc2loX3NjYW5kdl9jb21wbGV0ZShNUFRfQURBUFRFUiAqaW9jLCBNUFRfRlJBTUVfSERSICptZiwgTVBUX0ZSQU1FX0hEUiAqcik7CitzdGF0aWMgdm9pZAltcHRzY3NpaF90aW1lcl9leHBpcmVkKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgaW50CW1wdHNjc2loX2RvX2NtZChNUFRfU0NTSV9IT1NUICpoZCwgSU5URVJOQUxfQ01EICppb2NtZCk7CitzdGF0aWMgaW50CW1wdHNjc2loX3N5bmNocm9uaXplX2NhY2hlKE1QVF9TQ1NJX0hPU1QgKmhkLCBpbnQgcG9ydG51bSk7CisKKyNpZmRlZiBNUFRTQ1NJSF9FTkFCTEVfRE9NQUlOX1ZBTElEQVRJT04KK3N0YXRpYyBpbnQJbXB0c2NzaWhfZG9fcmFpZChNUFRfU0NTSV9IT1NUICpoZCwgdTggYWN0aW9uLCBJTlRFUk5BTF9DTUQgKmlvKTsKK3N0YXRpYyB2b2lkCW1wdHNjc2loX2RvbWFpblZhbGlkYXRpb24odm9pZCAqaGQpOworc3RhdGljIGludAltcHRzY3NpaF9pc19waHlzX2Rpc2soTVBUX0FEQVBURVIgKmlvYywgaW50IGlkKTsKK3N0YXRpYyB2b2lkCW1wdHNjc2loX3Fhc19jaGVjayhNUFRfU0NTSV9IT1NUICpoZCwgaW50IGlkKTsKK3N0YXRpYyBpbnQJbXB0c2NzaWhfZG9EdihNUFRfU0NTSV9IT1NUICpoZCwgaW50IGNoYW5uZWwsIGludCB0YXJnZXQpOworc3RhdGljIHZvaWQJbXB0c2NzaWhfZHZfcGFybXMoTVBUX1NDU0lfSE9TVCAqaGQsIERWUEFSQU1FVEVSUyAqZHYsdm9pZCAqcFBhZ2UpOworc3RhdGljIHZvaWQJbXB0c2NzaWhfZmlsbGJ1ZihjaGFyICpidWZmZXIsIGludCBzaXplLCBpbnQgaW5kZXgsIGludCB3aWR0aCk7CisjZW5kaWYKKy8qIG1vZHVsZSBlbnRyeSBwb2ludCAqLworc3RhdGljIGludCAgX19pbml0ICAgbXB0c2NzaWhfaW5pdCAgKHZvaWQpOworc3RhdGljIHZvaWQgX19leGl0ICAgbXB0c2NzaWhfZXhpdCAgKHZvaWQpOworCitzdGF0aWMgaW50ICBtcHRzY3NpaF9wcm9iZSAoc3RydWN0IHBjaV9kZXYgKiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKik7CitzdGF0aWMgdm9pZCBtcHRzY3NpaF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKik7CitzdGF0aWMgdm9pZCBtcHRzY3NpaF9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICopOworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBtcHRzY3NpaF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgc3RhdGUpOworc3RhdGljIGludCBtcHRzY3NpaF9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworI2VuZGlmCisKKworLyoKKyAqCVByaXZhdGUgZGF0YS4uLgorICovCisKK3N0YXRpYyBpbnQJbXB0X3Njc2lfaG9zdHMgPSAwOworCitzdGF0aWMgaW50CVNjc2lEb25lQ3R4ID0gLTE7CitzdGF0aWMgaW50CVNjc2lUYXNrQ3R4ID0gLTE7CitzdGF0aWMgaW50CVNjc2lTY2FuRHZDdHggPSAtMTsgLyogVXNlZCBvbmx5IGZvciBidXMgc2NhbiBhbmQgZHYgKi8KKworI2RlZmluZSBTTlNfTEVOKHNjcCkJc2l6ZW9mKChzY3ApLT5zZW5zZV9idWZmZXIpCisKKyNpZmRlZiBNUFRTQ1NJSF9FTkFCTEVfRE9NQUlOX1ZBTElEQVRJT04KKy8qCisgKiBEb21haW4gVmFsaWRhdGlvbiB0YXNrIHN0cnVjdHVyZQorICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGR2dGFza1FfbG9jayk7CitzdGF0aWMgaW50IGR2dGFza1FfYWN0aXZlID0gMDsKK3N0YXRpYyBpbnQgZHZ0YXNrUV9yZWxlYXNlID0gMDsKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QJbXB0c2NzaWhfZHZUYXNrOworI2VuZGlmCisKKy8qCisgKiBXYWl0IFF1ZXVlIHNldHVwCisgKi8KK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCAoc2NhbmR2X3dhaXRxKTsKK3N0YXRpYyBpbnQgc2NhbmR2X3dhaXRfZG9uZSA9IDE7CisKKworLyogRHJpdmVyIGNvbW1hbmQgbGluZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlOworCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKioKKyAqCW1wdHNjc2loX2FkZF9zZ2UgLSBQbGFjZSBhIHNpbXBsZSBTR0UgYXQgYWRkcmVzcyBwQWRkci4KKyAqCUBwQWRkcjogdmlydHVhbCBhZGRyZXNzIGZvciBTR0UKKyAqCUBmbGFnc2xlbmd0aDogU0dFIGZsYWdzIGFuZCBkYXRhIHRyYW5zZmVyIGxlbmd0aAorICoJQGRtYV9hZGRyOiBQaHlzaWNhbCBhZGRyZXNzCisgKgorICoJVGhpcyByb3V0aW5lIHBsYWNlcyBhIE1QVCByZXF1ZXN0IGZyYW1lIGJhY2sgb24gdGhlIE1QVCBhZGFwdGVyJ3MKKyAqCUZyZWVRLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK21wdHNjc2loX2FkZF9zZ2UoY2hhciAqcEFkZHIsIHUzMiBmbGFnc2xlbmd0aCwgZG1hX2FkZHJfdCBkbWFfYWRkcikKK3sKKwlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID09IHNpemVvZih1NjQpKSB7CisJCVNHRVNpbXBsZTY0X3QgKnBTZ2UgPSAoU0dFU2ltcGxlNjRfdCAqKSBwQWRkcjsKKwkJdTMyIHRtcCA9IGRtYV9hZGRyICYgMHhGRkZGRkZGRjsKKworCQlwU2dlLT5GbGFnc0xlbmd0aCA9IGNwdV90b19sZTMyKGZsYWdzbGVuZ3RoKTsKKwkJcFNnZS0+QWRkcmVzcy5Mb3cgPSBjcHVfdG9fbGUzMih0bXApOworCQl0bXAgPSAodTMyKSAoKHU2NClkbWFfYWRkciA+PiAzMik7CisJCXBTZ2UtPkFkZHJlc3MuSGlnaCA9IGNwdV90b19sZTMyKHRtcCk7CisKKwl9IGVsc2UgeworCQlTR0VTaW1wbGUzMl90ICpwU2dlID0gKFNHRVNpbXBsZTMyX3QgKikgcEFkZHI7CisJCXBTZ2UtPkZsYWdzTGVuZ3RoID0gY3B1X3RvX2xlMzIoZmxhZ3NsZW5ndGgpOworCQlwU2dlLT5BZGRyZXNzID0gY3B1X3RvX2xlMzIoZG1hX2FkZHIpOworCX0KK30gLyogbXB0c2NzaWhfYWRkX3NnZSgpICovCisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qKgorICoJbXB0c2NzaWhfYWRkX2NoYWluIC0gUGxhY2UgYSBjaGFpbiBTR0UgYXQgYWRkcmVzcyBwQWRkci4KKyAqCUBwQWRkcjogdmlydHVhbCBhZGRyZXNzIGZvciBTR0UKKyAqCUBuZXh0OiBuZXh0Q2hhaW5PZmZzZXQgdmFsdWUgKHUzMidzKQorICoJQGxlbmd0aDogbGVuZ3RoIG9mIG5leHQgU0dMIHNlZ21lbnQKKyAqCUBkbWFfYWRkcjogUGh5c2ljYWwgYWRkcmVzcworICoKKyAqCVRoaXMgcm91dGluZSBwbGFjZXMgYSBNUFQgcmVxdWVzdCBmcmFtZSBiYWNrIG9uIHRoZSBNUFQgYWRhcHRlcidzCisgKglGcmVlUS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCittcHRzY3NpaF9hZGRfY2hhaW4oY2hhciAqcEFkZHIsIHU4IG5leHQsIHUxNiBsZW5ndGgsIGRtYV9hZGRyX3QgZG1hX2FkZHIpCit7CisJaWYgKHNpemVvZihkbWFfYWRkcl90KSA9PSBzaXplb2YodTY0KSkgeworCQlTR0VDaGFpbjY0X3QgKnBDaGFpbiA9IChTR0VDaGFpbjY0X3QgKikgcEFkZHI7CisJCXUzMiB0bXAgPSBkbWFfYWRkciAmIDB4RkZGRkZGRkY7CisKKwkJcENoYWluLT5MZW5ndGggPSBjcHVfdG9fbGUxNihsZW5ndGgpOworCQlwQ2hhaW4tPkZsYWdzID0gTVBJX1NHRV9GTEFHU19DSEFJTl9FTEVNRU5UIHwgbXB0X2FkZHJfc2l6ZSgpOworCisJCXBDaGFpbi0+TmV4dENoYWluT2Zmc2V0ID0gbmV4dDsKKworCQlwQ2hhaW4tPkFkZHJlc3MuTG93ID0gY3B1X3RvX2xlMzIodG1wKTsKKwkJdG1wID0gKHUzMikgKCh1NjQpZG1hX2FkZHIgPj4gMzIpOworCQlwQ2hhaW4tPkFkZHJlc3MuSGlnaCA9IGNwdV90b19sZTMyKHRtcCk7CisJfSBlbHNlIHsKKwkJU0dFQ2hhaW4zMl90ICpwQ2hhaW4gPSAoU0dFQ2hhaW4zMl90ICopIHBBZGRyOworCQlwQ2hhaW4tPkxlbmd0aCA9IGNwdV90b19sZTE2KGxlbmd0aCk7CisJCXBDaGFpbi0+RmxhZ3MgPSBNUElfU0dFX0ZMQUdTX0NIQUlOX0VMRU1FTlQgfCBtcHRfYWRkcl9zaXplKCk7CisJCXBDaGFpbi0+TmV4dENoYWluT2Zmc2V0ID0gbmV4dDsKKwkJcENoYWluLT5BZGRyZXNzID0gY3B1X3RvX2xlMzIoZG1hX2FkZHIpOworCX0KK30gLyogbXB0c2NzaWhfYWRkX2NoYWluKCkgKi8KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCW1wdHNjc2loX2dldEZyZWVDaGFpbkJ1ZmZlciAtIEZ1bmN0aW9uIHRvIGdldCBhIGZyZWUgY2hhaW4KKyAqCWZyb20gdGhlIE1QVF9TQ1NJX0hPU1QgRnJlZUNoYWluUS4KKyAqCUBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCisgKglAcmVxX2lkeDogSW5kZXggb2YgdGhlIFNDU0kgSU8gcmVxdWVzdCBmcmFtZS4gKG91dHB1dCkKKyAqCisgKglyZXR1cm4gU1VDQ0VTUyBvciBGQUlMRUQKKyAqLworc3RhdGljIGlubGluZSBpbnQKK21wdHNjc2loX2dldEZyZWVDaGFpbkJ1ZmZlcihNUFRfQURBUFRFUiAqaW9jLCBpbnQgKnJldEluZGV4KQoreworCU1QVF9GUkFNRV9IRFIgKmNoYWluQnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjOworCWludCBjaGFpbl9pZHg7CisKKwlkc2dwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgImdldEZyZWVDaGFpbkJ1ZmZlciBjYWxsZWRcbiIsCisJCQlpb2MtPm5hbWUpKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5GcmVlUWxvY2ssIGZsYWdzKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmlvYy0+RnJlZUNoYWluUSkpIHsKKwkJaW50IG9mZnNldDsKKworCQljaGFpbkJ1ZiA9IGxpc3RfZW50cnkoaW9jLT5GcmVlQ2hhaW5RLm5leHQsIE1QVF9GUkFNRV9IRFIsCisJCQkJdS5mcmFtZS5saW5rYWdlLmxpc3QpOworCQlsaXN0X2RlbCgmY2hhaW5CdWYtPnUuZnJhbWUubGlua2FnZS5saXN0KTsKKwkJb2Zmc2V0ID0gKHU4ICopY2hhaW5CdWYgLSAodTggKilpb2MtPkNoYWluQnVmZmVyOworCQljaGFpbl9pZHggPSBvZmZzZXQgLyBpb2MtPnJlcV9zejsKKwkJcmMgPSBTVUNDRVNTOworCQlkc2dwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgImdldEZyZWVDaGFpbkJ1ZmZlciAoaW5kZXggJWQpLCBnb3QgYnVmPSVwXG4iLAorCQkJaW9jLT5uYW1lLCAqcmV0SW5kZXgsIGNoYWluQnVmKSk7CisJfSBlbHNlIHsKKwkJcmMgPSBGQUlMRUQ7CisJCWNoYWluX2lkeCA9IE1QVF9IT1NUX05PX0NIQUlOOworCQlkZmFpbHByaW50aygoTVlJT0Nfc19FUlJfRk1UICJnZXRGcmVlQ2hhaW5CdWZmZXIgZmFpbGVkXG4iLAorCQkJaW9jLT5uYW1lKSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CisKKwkqcmV0SW5kZXggPSBjaGFpbl9pZHg7CisJcmV0dXJuIHJjOworfSAvKiBtcHRzY3NpaF9nZXRGcmVlQ2hhaW5CdWZmZXIoKSAqLworCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJbXB0c2NzaWhfQWRkU0dFIC0gQWRkIGEgU0dFIChwbHVzIGNoYWluIGJ1ZmZlcnMpIHRvIHRoZQorICoJU0NTSUlPUmVxdWVzdF90IE1lc3NhZ2UgRnJhbWUuCisgKglAaW9jOiBQb2ludGVyIHRvIE1QVF9BREFQVEVSIHN0cnVjdHVyZQorICoJQFNDcG50OiBQb2ludGVyIHRvIHNjc2lfY21uZCBzdHJ1Y3R1cmUKKyAqCUBwUmVxOiBQb2ludGVyIHRvIFNDU0lJT1JlcXVlc3RfdCBzdHJ1Y3R1cmUKKyAqCisgKglSZXR1cm5zIC4uLgorICovCitzdGF0aWMgaW50CittcHRzY3NpaF9BZGRTR0UoTVBUX0FEQVBURVIgKmlvYywgc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsCisJCVNDU0lJT1JlcXVlc3RfdCAqcFJlcSwgaW50IHJlcV9pZHgpCit7CisJY2hhciAJKnBzZ2U7CisJY2hhcgkqY2hhaW5TZ2U7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlpbnQJIGZybV9zejsKKwlpbnQJIHNnZXNfbGVmdCwgc2dfZG9uZTsKKwlpbnQJIGNoYWluX2lkeCA9IE1QVF9IT1NUX05PX0NIQUlOOworCWludAkgc2dlT2Zmc2V0OworCWludAkgbnVtU2dlU2xvdHMsIG51bVNnZVRoaXNGcmFtZTsKKwl1MzIJIHNnZmxhZ3MsIHNnZGlyLCB0aGlzeGZlciA9IDA7CisJaW50CSBjaGFpbl9kbWFfb2ZmID0gMDsKKwlpbnQJIG5ld0luZGV4OworCWludAkgaWk7CisJZG1hX2FkZHJfdCB2MjsKKwl1MzIJUmVxdWVzdE5COworCisJc2dkaXIgPSBsZTMyX3RvX2NwdShwUmVxLT5Db250cm9sKSAmIE1QSV9TQ1NJSU9fQ09OVFJPTF9EQVRBRElSRUNUSU9OX01BU0s7CisJaWYgKHNnZGlyID09IE1QSV9TQ1NJSU9fQ09OVFJPTF9XUklURSkgIHsKKwkJc2dkaXIgPSBNUFRfVFJBTlNGRVJfSE9TVF9UT19JT0M7CisJfSBlbHNlIHsKKwkJc2dkaXIgPSBNUFRfVFJBTlNGRVJfSU9DX1RPX0hPU1Q7CisJfQorCisJcHNnZSA9IChjaGFyICopICZwUmVxLT5TR0w7CisJZnJtX3N6ID0gaW9jLT5yZXFfc3o7CisKKwkvKiBNYXAgdGhlIGRhdGEgcG9ydGlvbiwgaWYgYW55LgorCSAqIHNnZXNfbGVmdCAgPSAwIGlmIG5vIGRhdGEgdHJhbnNmZXIuCisJICovCisJaWYgKCAoc2dlc19sZWZ0ID0gU0NwbnQtPnVzZV9zZykgKSB7CisJCXNnZXNfbGVmdCA9IHBjaV9tYXBfc2coaW9jLT5wY2lkZXYsCisJCQkgICAgICAgKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBTQ3BudC0+cmVxdWVzdF9idWZmZXIsCisgCQkJICAgICAgIFNDcG50LT51c2Vfc2csCisJCQkgICAgICAgU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJaWYgKHNnZXNfbGVmdCA9PSAwKQorCQkJcmV0dXJuIEZBSUxFRDsKKwl9IGVsc2UgaWYgKFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4pIHsKKwkJU0NwbnQtPlNDcC5kbWFfaGFuZGxlID0gcGNpX21hcF9zaW5nbGUoaW9jLT5wY2lkZXYsCisJCQkJICAgICAgU0NwbnQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCSAgICAgIFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJICAgICAgU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJZHNncHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJTRzogbm9uLVNHIGZvciAlcCwgbGVuPSVkXG4iLAorCQkJCWlvYy0+bmFtZSwgU0NwbnQsIFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4pKTsKKwkJbXB0c2NzaWhfYWRkX3NnZSgoY2hhciAqKSAmcFJlcS0+U0dMLAorCQkJMHhEMTAwMDAwMHxNUFRfU0dFX0ZMQUdTX0FERFJFU1NJTkd8c2dkaXJ8U0NwbnQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCVNDcG50LT5TQ3AuZG1hX2hhbmRsZSk7CisKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorCisJLyogSGFuZGxlIHRoZSBTRyBjYXNlLgorCSAqLworCXNnID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBTQ3BudC0+cmVxdWVzdF9idWZmZXI7CisJc2dfZG9uZSAgPSAwOworCXNnZU9mZnNldCA9IHNpemVvZihTQ1NJSU9SZXF1ZXN0X3QpIC0gc2l6ZW9mKFNHRV9JT19VTklPTik7CisJY2hhaW5TZ2UgPSBOVUxMOworCisJLyogUHJpb3IgdG8gZW50ZXJpbmcgdGhpcyBsb29wIC0gdGhlIGZvbGxvd2luZyBtdXN0IGJlIHNldAorCSAqIGN1cnJlbnQgTUY6ICBzZ2VPZmZzZXQgKGJ5dGVzKQorCSAqICAgICAgICAgICAgICBjaGFpblNnZSAoTnVsbCBpZiBvcmlnaW5hbCBNRiBpcyBub3QgYSBjaGFpbiBidWZmZXIpCisJICogICAgICAgICAgICAgIHNnX2RvbmUgKG51bSBTR0UgZG9uZSBmb3IgdGhpcyBNRikKKwkgKi8KKworbmV4dFNHRXNldDoKKwludW1TZ2VTbG90cyA9ICgoZnJtX3N6IC0gc2dlT2Zmc2V0KSAvIChzaXplb2YodTMyKSArIHNpemVvZihkbWFfYWRkcl90KSkgKTsKKwludW1TZ2VUaGlzRnJhbWUgPSAoc2dlc19sZWZ0IDwgbnVtU2dlU2xvdHMpID8gc2dlc19sZWZ0IDogbnVtU2dlU2xvdHM7CisKKwlzZ2ZsYWdzID0gTVBUX1NHRV9GTEFHU19TSU1QTEVfRUxFTUVOVCB8IE1QVF9TR0VfRkxBR1NfQUREUkVTU0lORyB8IHNnZGlyOworCisJLyogR2V0IGZpcnN0IChudW0gLSAxKSBTRyBlbGVtZW50cworCSAqIFNraXAgYW55IFNHIGVudHJpZXMgd2l0aCBhIGxlbmd0aCBvZiAwCisJICogTk9URTogYXQgZmluaXNoLCBzZyBhbmQgcHNnZSBwb2ludGVkIHRvIE5FWFQgZGF0YS9sb2NhdGlvbiBwb3NpdGlvbnMKKwkgKi8KKwlmb3IgKGlpPTA7IGlpIDwgKG51bVNnZVRoaXNGcmFtZS0xKTsgaWkrKykgeworCQl0aGlzeGZlciA9IHNnX2RtYV9sZW4oc2cpOworCQlpZiAodGhpc3hmZXIgPT0gMCkgeworCQkJc2cgKys7IC8qIEdldCBuZXh0IFNHIGVsZW1lbnQgZnJvbSB0aGUgT1MgKi8KKwkJCXNnX2RvbmUrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdjIgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCW1wdHNjc2loX2FkZF9zZ2UocHNnZSwgc2dmbGFncyB8IHRoaXN4ZmVyLCB2Mik7CisKKwkJc2crKzsJCS8qIEdldCBuZXh0IFNHIGVsZW1lbnQgZnJvbSB0aGUgT1MgKi8KKwkJcHNnZSArPSAoc2l6ZW9mKHUzMikgKyBzaXplb2YoZG1hX2FkZHJfdCkpOworCQlzZ2VPZmZzZXQgKz0gKHNpemVvZih1MzIpICsgc2l6ZW9mKGRtYV9hZGRyX3QpKTsKKwkJc2dfZG9uZSsrOworCX0KKworCWlmIChudW1TZ2VUaGlzRnJhbWUgPT0gc2dlc19sZWZ0KSB7CisJCS8qIEFkZCBsYXN0IGVsZW1lbnQsIGVuZCBvZiBidWZmZXIgYW5kIGVuZCBvZiBsaXN0IGZsYWdzLgorCQkgKi8KKwkJc2dmbGFncyB8PSBNUFRfU0dFX0ZMQUdTX0xBU1RfRUxFTUVOVCB8CisJCQkJTVBUX1NHRV9GTEFHU19FTkRfT0ZfQlVGRkVSIHwKKwkJCQlNUFRfU0dFX0ZMQUdTX0VORF9PRl9MSVNUOworCisJCS8qIEFkZCBsYXN0IFNHRSBhbmQgc2V0IHRlcm1pbmF0aW9uIGZsYWdzLgorCQkgKiBOb3RlOiBMYXN0IFNHRSBtYXkgaGF2ZSBhIGxlbmd0aCBvZiAwIC0gd2hpY2ggc2hvdWxkIGJlIG9rLgorCQkgKi8KKwkJdGhpc3hmZXIgPSBzZ19kbWFfbGVuKHNnKTsKKworCQl2MiA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKwkJbXB0c2NzaWhfYWRkX3NnZShwc2dlLCBzZ2ZsYWdzIHwgdGhpc3hmZXIsIHYyKTsKKwkJLyoKKwkJc2crKzsKKwkJcHNnZSArPSAoc2l6ZW9mKHUzMikgKyBzaXplb2YoZG1hX2FkZHJfdCkpOworCQkqLworCQlzZ2VPZmZzZXQgKz0gKHNpemVvZih1MzIpICsgc2l6ZW9mKGRtYV9hZGRyX3QpKTsKKwkJc2dfZG9uZSsrOworCisJCWlmIChjaGFpblNnZSkgeworCQkJLyogVGhlIGN1cnJlbnQgYnVmZmVyIGlzIGEgY2hhaW4gYnVmZmVyLAorCQkJICogYnV0IHRoZXJlIGlzIG5vdCBhbm90aGVyIG9uZS4KKwkJCSAqIFVwZGF0ZSB0aGUgY2hhaW4gZWxlbWVudAorCQkJICogT2Zmc2V0IGFuZCBMZW5ndGggZmllbGRzLgorCQkJICovCisJCQltcHRzY3NpaF9hZGRfY2hhaW4oKGNoYXIgKiljaGFpblNnZSwgMCwgc2dlT2Zmc2V0LCBpb2MtPkNoYWluQnVmZmVyRE1BICsgY2hhaW5fZG1hX29mZik7CisJCX0gZWxzZSB7CisJCQkvKiBUaGUgY3VycmVudCBidWZmZXIgaXMgdGhlIG9yaWdpbmFsIE1GCisJCQkgKiBhbmQgdGhlcmUgaXMgbm8gQ2hhaW4gYnVmZmVyLgorCQkJICovCisJCQlwUmVxLT5DaGFpbk9mZnNldCA9IDA7CisJCQlSZXF1ZXN0TkIgPSAoKChzZ2VPZmZzZXQgLSAxKSA+PiBpb2MtPk5CU2hpZnRGYWN0b3IpICArIDEpICYgMHgwMzsKKwkJCWRzZ3ByaW50aygoTVlJT0Nfc19FUlJfRk1UIAorCQkJICAgICJTaW5nbGUgQnVmZmVyIFJlcXVlc3ROQj0leCwgc2dlT2Zmc2V0PSVkXG4iLCBpb2MtPm5hbWUsIFJlcXVlc3ROQiwgc2dlT2Zmc2V0KSk7CisJCQlpb2MtPlJlcXVlc3ROQltyZXFfaWR4XSA9IFJlcXVlc3ROQjsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEF0IGxlYXN0IG9uZSBjaGFpbiBidWZmZXIgaXMgbmVlZGVkLgorCQkgKiBDb21wbGV0ZSB0aGUgZmlyc3QgTUYKKwkJICogIC0gbGFzdCBTR0UgZWxlbWVudCwgc2V0IHRoZSBMYXN0RWxlbWVudCBiaXQKKwkJICogIC0gc2V0IENoYWluT2Zmc2V0ICh3b3JkcykgZm9yIG9yaWcgTUYKKwkJICogICAgICAgICAgICAgKE9SIGZpbmlzaCBwcmV2aW91cyBNRiBjaGFpbiBidWZmZXIpCisJCSAqICAtIHVwZGF0ZSBNRlN0cnVjdFB0ciBDaGFpbkluZGV4CisJCSAqICAtIFBvcHVsYXRlIGNoYWluIGVsZW1lbnQKKwkJICogQWxzbworCQkgKiBMb29wIHVudGlsIGRvbmUuCisJCSAqLworCisJCWRzZ3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU0c6IENoYWluIFJlcXVpcmVkISBzZyBkb25lICVkXG4iLAorCQkJCWlvYy0+bmFtZSwgc2dfZG9uZSkpOworCisJCS8qIFNldCBMQVNUX0VMRU1FTlQgZmxhZyBmb3IgbGFzdCBub24tY2hhaW4gZWxlbWVudAorCQkgKiBpbiB0aGUgYnVmZmVyLiBTaW5jZSBwc2dlIHBvaW50cyBhdCB0aGUgTkVYVAorCQkgKiBTR0UgZWxlbWVudCwgZ28gYmFjayBvbmUgU0dFIGVsZW1lbnQsIHVwZGF0ZSB0aGUgZmxhZ3MKKwkJICogYW5kIHJlc2V0IHRoZSBwb2ludGVyLiAoTm90ZTogc2dmbGFncyAmIHRoaXN4ZmVyIGFyZSBhbHJlYWR5CisJCSAqIHNldCBwcm9wZXJseSkuCisJCSAqLworCQlpZiAoc2dfZG9uZSkgeworCQkJdTMyICpwdG1wID0gKHUzMiAqKSAocHNnZSAtIChzaXplb2YodTMyKSArIHNpemVvZihkbWFfYWRkcl90KSkpOworCQkJc2dmbGFncyA9IGxlMzJfdG9fY3B1KCpwdG1wKTsKKwkJCXNnZmxhZ3MgfD0gTVBUX1NHRV9GTEFHU19MQVNUX0VMRU1FTlQ7CisJCQkqcHRtcCA9IGNwdV90b19sZTMyKHNnZmxhZ3MpOworCQl9CisKKwkJaWYgKGNoYWluU2dlKSB7CisJCQkvKiBUaGUgY3VycmVudCBidWZmZXIgaXMgYSBjaGFpbiBidWZmZXIuCisJCQkgKiBjaGFpblNnZSBwb2ludHMgdG8gdGhlIHByZXZpb3VzIENoYWluIEVsZW1lbnQuCisJCQkgKiBVcGRhdGUgaXRzIGNoYWluIGVsZW1lbnQgT2Zmc2V0IGFuZCBMZW5ndGggKG11c3QKKwkJCSAqIGluY2x1ZGUgY2hhaW4gZWxlbWVudCBzaXplKSBmaWVsZHMuCisJCQkgKiBPbGQgY2hhaW4gZWxlbWVudCBpcyBub3cgY29tcGxldGUuCisJCQkgKi8KKwkJCXU4IG5leHRDaGFpbiA9ICh1OCkgKHNnZU9mZnNldCA+PiAyKTsKKwkJCXNnZU9mZnNldCArPSAoc2l6ZW9mKHUzMikgKyBzaXplb2YoZG1hX2FkZHJfdCkpOworCQkJbXB0c2NzaWhfYWRkX2NoYWluKChjaGFyICopY2hhaW5TZ2UsIG5leHRDaGFpbiwgc2dlT2Zmc2V0LCBpb2MtPkNoYWluQnVmZmVyRE1BICsgY2hhaW5fZG1hX29mZik7CisJCX0gZWxzZSB7CisJCQkvKiBUaGUgb3JpZ2luYWwgTUYgYnVmZmVyIHJlcXVpcmVzIGEgY2hhaW4gYnVmZmVyIC0KKwkJCSAqIHNldCB0aGUgb2Zmc2V0LgorCQkJICogTGFzdCBlbGVtZW50IGluIHRoaXMgTUYgaXMgYSBjaGFpbiBlbGVtZW50LgorCQkJICovCisJCQlwUmVxLT5DaGFpbk9mZnNldCA9ICh1OCkgKHNnZU9mZnNldCA+PiAyKTsKKwkJCVJlcXVlc3ROQiA9ICgoKHNnZU9mZnNldCAtIDEpID4+IGlvYy0+TkJTaGlmdEZhY3RvcikgICsgMSkgJiAweDAzOworCQkJZHNncHJpbnRrKChNWUlPQ19zX0VSUl9GTVQgIkNoYWluIEJ1ZmZlciBOZWVkZWQsIFJlcXVlc3ROQj0leCBzZ2VPZmZzZXQ9JWRcbiIsIGlvYy0+bmFtZSwgUmVxdWVzdE5CLCBzZ2VPZmZzZXQpKTsKKwkJCWlvYy0+UmVxdWVzdE5CW3JlcV9pZHhdID0gUmVxdWVzdE5COworCQl9CisKKwkJc2dlc19sZWZ0IC09IHNnX2RvbmU7CisKKworCQkvKiBOT1RFOiBwc2dlIHBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjaGFpbiBlbGVtZW50CisJCSAqIGluIGN1cnJlbnQgYnVmZmVyLiBHZXQgYSBjaGFpbiBidWZmZXIuCisJCSAqLworCQlkc2dwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgCisJCSAgICAiY2FsbGluZyBnZXRGcmVlQ2hhaW5CdWZmZXIgU0NTSSBjbWQ9JTAyeCAoJXApXG4iLAorCQkgICAgaW9jLT5uYW1lLCBwUmVxLT5DREJbMF0sIFNDcG50KSk7CisJCWlmICgobXB0c2NzaWhfZ2V0RnJlZUNoYWluQnVmZmVyKGlvYywgJm5ld0luZGV4KSkgPT0gRkFJTEVEKQorCQkJcmV0dXJuIEZBSUxFRDsKKworCQkvKiBVcGRhdGUgdGhlIHRyYWNraW5nIGFycmF5cy4KKwkJICogSWYgY2hhaW5TZ2UgPT0gTlVMTCwgdXBkYXRlIFJlcVRvQ2hhaW4sIGVsc2UgQ2hhaW5Ub0NoYWluCisJCSAqLworCQlpZiAoY2hhaW5TZ2UpIHsKKwkJCWlvYy0+Q2hhaW5Ub0NoYWluW2NoYWluX2lkeF0gPSBuZXdJbmRleDsKKwkJfSBlbHNlIHsKKwkJCWlvYy0+UmVxVG9DaGFpbltyZXFfaWR4XSA9IG5ld0luZGV4OworCQl9CisJCWNoYWluX2lkeCA9IG5ld0luZGV4OworCQljaGFpbl9kbWFfb2ZmID0gaW9jLT5yZXFfc3ogKiBjaGFpbl9pZHg7CisKKwkJLyogUG9wdWxhdGUgdGhlIGNoYWluU0dFIGZvciB0aGUgY3VycmVudCBidWZmZXIuCisJCSAqIC0gU2V0IGNoYWluIGJ1ZmZlciBwb2ludGVyIHRvIHBzZ2UgYW5kIGZpbGwKKwkJICogICBvdXQgdGhlIEFkZHJlc3MgYW5kIEZsYWdzIGZpZWxkcy4KKwkJICovCisJCWNoYWluU2dlID0gKGNoYXIgKikgcHNnZTsKKwkJZHNncHJpbnRrKChLRVJOX0lORk8gIiAgQ3VycmVudCBidWZmIEAgJXAgKGluZGV4IDB4JXgpIiwKKwkJCQlwc2dlLCByZXFfaWR4KSk7CisKKwkJLyogU3RhcnQgdGhlIFNHRSBmb3IgdGhlIG5leHQgYnVmZmVyCisJCSAqLworCQlwc2dlID0gKGNoYXIgKikgKGlvYy0+Q2hhaW5CdWZmZXIgKyBjaGFpbl9kbWFfb2ZmKTsKKwkJc2dlT2Zmc2V0ID0gMDsKKwkJc2dfZG9uZSA9IDA7CisKKwkJZHNncHJpbnRrKChLRVJOX0lORk8gIiAgQ2hhaW4gYnVmZiBAICVwIChpbmRleCAweCV4KVxuIiwKKwkJCQlwc2dlLCBjaGFpbl9pZHgpKTsKKworCQkvKiBTdGFydCB0aGUgU0dFIGZvciB0aGUgbmV4dCBidWZmZXIKKwkJICovCisKKwkJZ290byBuZXh0U0dFc2V0OworCX0KKworCXJldHVybiBTVUNDRVNTOworfSAvKiBtcHRzY3NpaF9BZGRTR0UoKSAqLworCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJbXB0c2NzaWhfaW9fZG9uZSAtIE1haW4gU0NTSSBJTyBjYWxsYmFjayByb3V0aW5lIHJlZ2lzdGVyZWQgdG8KKyAqCUZ1c2lvbiBNUFQgKGJhc2UpIGRyaXZlcgorICoJQGlvYzogUG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKKyAqCUBtZjogUG9pbnRlciB0byBvcmlnaW5hbCBNUFQgcmVxdWVzdCBmcmFtZQorICoJQHI6IFBvaW50ZXIgdG8gTVBUIHJlcGx5IGZyYW1lIChOVUxMIGlmIFR1cmJvUmVwbHkpCisgKgorICoJVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIG1wdC5jOjptcHRfaW50ZXJydXB0KCkgYXQgdGhlIGNvbXBsZXRpb24KKyAqCW9mIGFueSBTQ1NJIElPIHJlcXVlc3QuCisgKglUaGlzIHJvdXRpbmUgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBGdXNpb24gTVBUIChiYXNlKSBkcml2ZXIgYXQgZHJpdmVyCisgKglsb2FkL2luaXQgdGltZSB2aWEgdGhlIG1wdF9yZWdpc3RlcigpIEFQSSBjYWxsLgorICoKKyAqCVJldHVybnMgMSBpbmRpY2F0aW5nIGFsbG9jJ2QgcmVxdWVzdCBmcmFtZSBwdHIgc2hvdWxkIGJlIGZyZWVkLgorICovCitzdGF0aWMgaW50CittcHRzY3NpaF9pb19kb25lKE1QVF9BREFQVEVSICppb2MsIE1QVF9GUkFNRV9IRFIgKm1mLCBNUFRfRlJBTUVfSERSICptcikKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kCSpzYzsKKwlNUFRfU0NTSV9IT1NUCSpoZDsKKwlTQ1NJSU9SZXF1ZXN0X3QJKnBTY3NpUmVxOworCVNDU0lJT1JlcGx5X3QJKnBTY3NpUmVwbHk7CisJdTE2CQkgcmVxX2lkeDsKKworCWhkID0gKE1QVF9TQ1NJX0hPU1QgKikgaW9jLT5zaC0+aG9zdGRhdGE7CisKKwlyZXFfaWR4ID0gbGUxNl90b19jcHUobWYtPnUuZnJhbWUuaHdoZHIubXNnY3R4dS5mbGQucmVxX2lkeCk7CisJc2MgPSBoZC0+U2NzaUxvb2t1cFtyZXFfaWR4XTsKKwlpZiAoc2MgPT0gTlVMTCkgeworCQlNUElIZWFkZXJfdCAqaGRyID0gKE1QSUhlYWRlcl90ICopbWY7CisKKwkJLyogUmVtYXJrOiB3cml0ZVNEUDEgd2lsbCB1c2UgdGhlIFNjc2lEb25lQ3R4CisJCSAqIElmIGEgU0NTSSBJL08gY21kLCBkZXZpY2UgZGlzYWJsZWQgYnkgT1MgYW5kCisJCSAqIGNvbXBsZXRpb24gZG9uZS4gQ2Fubm90IHRvdWNoIHNjIHN0cnVjdC4gSnVzdCBmcmVlIG1lbS4KKwkJICovCisJCWlmIChoZHItPkZ1bmN0aW9uID09IE1QSV9GVU5DVElPTl9TQ1NJX0lPX1JFUVVFU1QpCisJCQlwcmludGsoTVlJT0Nfc19FUlJfRk1UICJOVUxMIFNjc2lDbWQgcHRyIVxuIiwKKwkJCWlvYy0+bmFtZSk7CisKKwkJbXB0c2NzaWhfZnJlZUNoYWluQnVmZmVycyhpb2MsIHJlcV9pZHgpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkbWZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQKKwkJIlNjc2lEb25lIChtZj0lcCxtcj0lcCxzYz0lcCxpZHg9JWQpXG4iLAorCQlpb2MtPm5hbWUsIG1mLCBtciwgc2MsIHJlcV9pZHgpKTsKKworCXNjLT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CQkvKiBTZXQgZGVmYXVsdCByZXBseSBhcyBPSyAqLworCXBTY3NpUmVxID0gKFNDU0lJT1JlcXVlc3RfdCAqKSBtZjsKKwlwU2NzaVJlcGx5ID0gKFNDU0lJT1JlcGx5X3QgKikgbXI7CisKKwlpZiAocFNjc2lSZXBseSA9PSBOVUxMKSB7CisJCS8qIHNwZWNpYWwgY29udGV4dCByZXBseSBoYW5kbGluZyAqLworCQk7CisJfSBlbHNlIHsKKwkJdTMyCSB4ZmVyX2NudDsKKwkJdTE2CSBzdGF0dXM7CisJCXU4CSBzY3NpX3N0YXRlLCBzY3NpX3N0YXR1czsKKworCQlzdGF0dXMgPSBsZTE2X3RvX2NwdShwU2NzaVJlcGx5LT5JT0NTdGF0dXMpICYgTVBJX0lPQ1NUQVRVU19NQVNLOworCQlzY3NpX3N0YXRlID0gcFNjc2lSZXBseS0+U0NTSVN0YXRlOworCQlzY3NpX3N0YXR1cyA9IHBTY3NpUmVwbHktPlNDU0lTdGF0dXM7CisJCXhmZXJfY250ID0gbGUzMl90b19jcHUocFNjc2lSZXBseS0+VHJhbnNmZXJDb3VudCk7CisJCXNjLT5yZXNpZCA9IHNjLT5yZXF1ZXN0X2J1ZmZsZW4gLSB4ZmVyX2NudDsKKworCQlkcmVwbHlwcmludGsoKEtFUk5fTk9USUNFICJSZXBseSBoYT0lZCBpZD0lZCBsdW49JWQ6XG4iCisJCQkiSU9DU3RhdHVzPSUwNHhoIFNDU0lTdGF0ZT0lMDJ4aCBTQ1NJU3RhdHVzPSUwMnhoXG4iCisJCQkicmVzaWQ9JWQgYnVmZmxlbj0lZCB4ZmVyX2NudD0lZFxuIiwKKwkJCWlvYy0+aWQsIHBTY3NpUmVxLT5UYXJnZXRJRCwgcFNjc2lSZXEtPkxVTlsxXSwKKwkJCXN0YXR1cywgc2NzaV9zdGF0ZSwgc2NzaV9zdGF0dXMsIHNjLT5yZXNpZCwgCisJCQlzYy0+cmVxdWVzdF9idWZmbGVuLCB4ZmVyX2NudCkpOworCisJCWlmIChzY3NpX3N0YXRlICYgTVBJX1NDU0lfU1RBVEVfQVVUT1NFTlNFX1ZBTElEKQorCQkJY29weV9zZW5zZV9kYXRhKHNjLCBoZCwgbWYsIHBTY3NpUmVwbHkpOworICAgICAgICAgICAgICAgIAorCQkvKgorCQkgKiAgTG9vayBmb3IgKyBkdW1wIEZDUCBSZXNwb25zZUluZm9bXSEKKwkJICovCisJCWlmIChzY3NpX3N0YXRlICYgTVBJX1NDU0lfU1RBVEVfUkVTUE9OU0VfSU5GT19WQUxJRCkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICIgIEZDUF9SZXNwb25zZUluZm89JTA4eGhcbiIsCisJCQlsZTMyX3RvX2NwdShwU2NzaVJlcGx5LT5SZXNwb25zZUluZm8pKTsKKwkJfQorCisJCXN3aXRjaChzdGF0dXMpIHsKKwkJY2FzZSBNUElfSU9DU1RBVFVTX0JVU1k6CQkJLyogMHgwMDAyICovCisJCQkvKiBDSEVDS01FIQorCQkJICogTWF5YmU6IERSSVZFUl9CVVNZIHwgU1VHR0VTVF9SRVRSWSB8IERJRF9TT0ZUX0VSUk9SIChyZXRyeSkKKwkJCSAqIEJ1dCBub3Q6IERJRF9CVVNfQlVTWSBsZXN0IG9uZSByaXNrCisJCQkgKiBraWxsaW5nIGludGVycnVwdCBoYW5kbGVyOi0oCisJCQkgKi8KKwkJCXNjLT5yZXN1bHQgPSBTQU1fU1RBVF9CVVNZOworCQkJYnJlYWs7CisKKwkJY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfSU5WQUxJRF9CVVM6CQkvKiAweDAwNDEgKi8KKwkJY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfSU5WQUxJRF9UQVJHRVRJRDoJLyogMHgwMDQyICovCisJCQlzYy0+cmVzdWx0ID0gRElEX0JBRF9UQVJHRVQgPDwgMTY7CisJCQlicmVhazsKKworCQljYXNlIE1QSV9JT0NTVEFUVVNfU0NTSV9ERVZJQ0VfTk9UX1RIRVJFOgkvKiAweDAwNDMgKi8KKwkJCS8qIFNwb29mIHRvIFNDU0kgU2VsZWN0aW9uIFRpbWVvdXQhICovCisJCQlzYy0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisKKwkJCWlmIChoZC0+c2VsX3RpbWVvdXRbcFNjc2lSZXEtPlRhcmdldElEXSA8IDB4RkZGRikKKwkJCQloZC0+c2VsX3RpbWVvdXRbcFNjc2lSZXEtPlRhcmdldElEXSsrOworCQkJYnJlYWs7CisKKwkJY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfVEFTS19URVJNSU5BVEVEOgkvKiAweDAwNDggKi8KKwkJY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfSU9DX1RFUk1JTkFURUQ6CQkvKiAweDAwNEIgKi8KKwkJY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfRVhUX1RFUk1JTkFURUQ6CQkvKiAweDAwNEMgKi8KKwkJCS8qIExpbnV4IGhhbmRsZXMgYW4gdW5zb2xpY2l0ZWQgRElEX1JFU0VUIGJldHRlcgorCQkJICogdGhhbiBhbiB1bnNvbGljaXRlZCBESURfQUJPUlQuCisJCQkgKi8KKwkJCXNjLT5yZXN1bHQgPSBESURfUkVTRVQgPDwgMTY7CisKKwkJCS8qIEdFTSBXb3JrYXJvdW5kLiAqLworCQkJaWYgKGlvYy0+YnVzX3R5cGUgPT0gU0NTSSkKKwkJCQltcHRzY3NpaF9ub19uZWdvdGlhdGUoaGQsIHNjLT5kZXZpY2UtPmlkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX1JFU0lEVUFMX01JU01BVENIOgkvKiAweDAwNDkgKi8KKwkJCWlmICggeGZlcl9jbnQgPj0gc2MtPnVuZGVyZmxvdyApIHsKKwkJCQkvKiBTdWZmaWNpZW50IGRhdGEgdHJhbnNmZXIgb2NjdXJyZWQgKi8KKwkJCQlzYy0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNikgfCBzY3NpX3N0YXR1czsKKwkJCX0gZWxzZSBpZiAoIHhmZXJfY250ID09IDAgKSB7CisJCQkJLyogQSBDUkMgRXJyb3IgY2F1c2VzIHRoaXMgY29uZGl0aW9uOyByZXRyeSAqLyAKKwkJCQlzYy0+cmVzdWx0ID0gKERSSVZFUl9TRU5TRSA8PCAyNCkgfCAoRElEX09LIDw8IDE2KSB8IAorCQkJCQkoQ0hFQ0tfQ09ORElUSU9OIDw8IDEpOworCQkJCXNjLT5zZW5zZV9idWZmZXJbMF0gPSAweDcwOworCQkJCXNjLT5zZW5zZV9idWZmZXJbMl0gPSBOT19TRU5TRTsKKwkJCQlzYy0+c2Vuc2VfYnVmZmVyWzEyXSA9IDA7CisJCQkJc2MtPnNlbnNlX2J1ZmZlclsxM10gPSAwOworCQkJfSBlbHNlIHsKKwkJCQlzYy0+cmVzdWx0ID0gRElEX1NPRlRfRVJST1IgPDwgMTY7CisJCQl9CisJCQlkcmVwbHlwcmludGsoKEtFUk5fTk9USUNFICJSRVNJRFVBTF9NSVNNQVRDSDogcmVzdWx0PSV4IG9uIGlkPSVkXG4iLCBzYy0+cmVzdWx0LCBzYy0+dGFyZ2V0KSk7CisJCQlicmVhazsKKwkJCisJCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX0RBVEFfVU5ERVJSVU46CQkvKiAweDAwNDUgKi8KKwkJCS8qCisJCQkgKiAgRG8gdXBmcm9udCBjaGVjayBmb3IgdmFsaWQgU2Vuc2VEYXRhIGFuZCBnaXZlIGl0CisJCQkgKiAgcHJlY2VkZW5jZSEKKwkJCSAqLworCQkJc2MtPnJlc3VsdCA9IChESURfT0sgPDwgMTYpIHwgc2NzaV9zdGF0dXM7CisJCQlpZiAoc2NzaV9zdGF0ZSAmIE1QSV9TQ1NJX1NUQVRFX0FVVE9TRU5TRV9WQUxJRCkgeworCQkJCS8qIEhhdmUgYWxyZWFkeSBzYXZlZCB0aGUgc3RhdHVzIGFuZCBzZW5zZSBkYXRhCisJCQkJICovCisJCQkJOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoeGZlcl9jbnQgPCBzYy0+dW5kZXJmbG93KSB7CisJCQkJCXNjLT5yZXN1bHQgPSBESURfU09GVF9FUlJPUiA8PCAxNjsKKwkJCQl9CisJCQkJaWYgKHNjc2lfc3RhdGUgJiAoTVBJX1NDU0lfU1RBVEVfQVVUT1NFTlNFX0ZBSUxFRCB8IE1QSV9TQ1NJX1NUQVRFX05PX1NDU0lfU1RBVFVTKSkgeworCQkJCQkvKiBXaGF0IHRvIGRvPworCQkJCSAJKi8KKwkJCQkJc2MtPnJlc3VsdCA9IERJRF9TT0ZUX0VSUk9SIDw8IDE2OworCQkJCX0KKwkJCQllbHNlIGlmIChzY3NpX3N0YXRlICYgTVBJX1NDU0lfU1RBVEVfVEVSTUlOQVRFRCkgeworCQkJCQkvKiAgTm90IHJlYWwgc3VyZSBoZXJlIGVpdGhlci4uLiAgKi8KKwkJCQkJc2MtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwkJCQl9CisJCQl9CisKKwkJCWRyZXBseXByaW50aygoS0VSTl9OT1RJQ0UgIiAgc2MtPnVuZGVyZmxvdz17cmVwb3J0IEVSUiBpZiA8ICUwMnhoIGJ5dGVzIHhmZXInZH1cbiIsCisJCQkJCXNjLT51bmRlcmZsb3cpKTsKKwkJCWRyZXBseXByaW50aygoS0VSTl9OT1RJQ0UgIiAgQWN0Qnl0ZXNYZmVyZD0lMDJ4aFxuIiwgeGZlcl9jbnQpKTsKKwkJCS8qIFJlcG9ydCBRdWV1ZSBGdWxsCisJCQkgKi8KKwkJCWlmIChzY3NpX3N0YXR1cyA9PSBNUElfU0NTSV9TVEFUVVNfVEFTS19TRVRfRlVMTCkKKwkJCQltcHRzY3NpaF9yZXBvcnRfcXVldWVfZnVsbChzYywgcFNjc2lSZXBseSwgcFNjc2lSZXEpOworCQkJCisJCQlicmVhazsKKworCQljYXNlIE1QSV9JT0NTVEFUVVNfU0NTSV9SRUNPVkVSRURfRVJST1I6CS8qIDB4MDA0MCAqLworCQljYXNlIE1QSV9JT0NTVEFUVVNfU1VDQ0VTUzoJCQkvKiAweDAwMDAgKi8KKwkJCXNjc2lfc3RhdHVzID0gcFNjc2lSZXBseS0+U0NTSVN0YXR1czsKKwkJCXNjLT5yZXN1bHQgPSAoRElEX09LIDw8IDE2KSB8IHNjc2lfc3RhdHVzOworCQkJaWYgKHNjc2lfc3RhdGUgPT0gMCkgeworCQkJCTsKKwkJCX0gZWxzZSBpZiAoc2NzaV9zdGF0ZSAmIE1QSV9TQ1NJX1NUQVRFX0FVVE9TRU5TRV9WQUxJRCkgeworCQkJCS8qCisJCQkJICogSWYgcnVubmluZyBhZ2FpbnN0IGNpcmNhIDIwMDAwM2RkIDkwOSBNUFQgZi93LAorCQkJCSAqIG1heSBnZXQgdGhpcyAoQVVUT1NFTlNFX1ZBTElEKSBmb3IgYWN0dWFsIFRBU0tfU0VUX0ZVTEwKKwkJCQkgKiAoUVVFVUVfRlVMTCkgcmV0dXJuZWQgZnJvbSBkZXZpY2UhIC0tPiBnZXQgMHgwMDAwPzEyOAorCQkJCSAqIGFuZCB3aXRoIFNlbnNlQnl0ZXMgc2V0IHRvIDAuCisJCQkJICovCisJCQkJaWYgKHBTY3NpUmVwbHktPlNDU0lTdGF0dXMgPT0gTVBJX1NDU0lfU1RBVFVTX1RBU0tfU0VUX0ZVTEwpCisJCQkJCW1wdHNjc2loX3JlcG9ydF9xdWV1ZV9mdWxsKHNjLCBwU2NzaVJlcGx5LCBwU2NzaVJlcSk7CisKKwkJCX0KKwkJCWVsc2UgaWYgKHNjc2lfc3RhdGUgJgorCQkJICAgICAgICAgKE1QSV9TQ1NJX1NUQVRFX0FVVE9TRU5TRV9GQUlMRUQgfCBNUElfU0NTSV9TVEFURV9OT19TQ1NJX1NUQVRVUykKKwkJCSAgICkgeworCQkJCS8qCisJCQkJICogV2hhdCB0byBkbz8KKwkJCQkgKi8KKwkJCQlzYy0+cmVzdWx0ID0gRElEX1NPRlRfRVJST1IgPDwgMTY7CisJCQl9CisJCQllbHNlIGlmIChzY3NpX3N0YXRlICYgTVBJX1NDU0lfU1RBVEVfVEVSTUlOQVRFRCkgeworCQkJCS8qICBOb3QgcmVhbCBzdXJlIGhlcmUgZWl0aGVyLi4uICAqLworCQkJCXNjLT5yZXN1bHQgPSBESURfUkVTRVQgPDwgMTY7CisJCQl9CisJCQllbHNlIGlmIChzY3NpX3N0YXRlICYgTVBJX1NDU0lfU1RBVEVfUVVFVUVfVEFHX1JFSkVDVEVEKSB7CisJCQkJLyogRGV2aWNlIElucS4gZGF0YSBpbmRpY2F0ZXMgdGhhdCBpdCBzdXBwb3J0cworCQkJCSAqIFFUYWdzLCBidXQgcmVqZWN0cyBRVGFnIG1lc3NhZ2VzLgorCQkJCSAqIFRoaXMgY29tbWFuZCBjb21wbGV0ZWQgT0suCisJCQkJICoKKwkJCQkgKiBOb3QgcmVhbCBzdXJlIGhlcmUgZWl0aGVyIHNvIGRvIG5vdGhpbmcuLi4gICovCisJCQl9CisKKwkJCWlmIChzYy0+cmVzdWx0ID09IE1QSV9TQ1NJX1NUQVRVU19UQVNLX1NFVF9GVUxMKQorCQkJCW1wdHNjc2loX3JlcG9ydF9xdWV1ZV9mdWxsKHNjLCBwU2NzaVJlcGx5LCBwU2NzaVJlcSk7CisKKwkJCS8qIEFkZCBoYW5kbGluZyBvZjoKKwkJCSAqIFJlc2VydmF0aW9uIENvbmZsaWN0LCBCdXN5LAorCQkJICogQ29tbWFuZCBUZXJtaW5hdGVkLCBDSEVDSworCQkJICovCisJCQlicmVhazsKKworCQljYXNlIE1QSV9JT0NTVEFUVVNfU0NTSV9QUk9UT0NPTF9FUlJPUjoJCS8qIDB4MDA0NyAqLworCQkJc2MtPnJlc3VsdCA9IERJRF9TT0ZUX0VSUk9SIDw8IDE2OworCQkJYnJlYWs7CisKKwkJY2FzZSBNUElfSU9DU1RBVFVTX0lOVkFMSURfRlVOQ1RJT046CQkvKiAweDAwMDEgKi8KKwkJY2FzZSBNUElfSU9DU1RBVFVTX0lOVkFMSURfU0dMOgkJCS8qIDB4MDAwMyAqLworCQljYXNlIE1QSV9JT0NTVEFUVVNfSU5URVJOQUxfRVJST1I6CQkvKiAweDAwMDQgKi8KKwkJY2FzZSBNUElfSU9DU1RBVFVTX1JFU0VSVkVEOgkJCS8qIDB4MDAwNSAqLworCQljYXNlIE1QSV9JT0NTVEFUVVNfSU5TVUZGSUNJRU5UX1JFU09VUkNFUzoJLyogMHgwMDA2ICovCisJCWNhc2UgTVBJX0lPQ1NUQVRVU19JTlZBTElEX0ZJRUxEOgkJLyogMHgwMDA3ICovCisJCWNhc2UgTVBJX0lPQ1NUQVRVU19JTlZBTElEX1NUQVRFOgkJLyogMHgwMDA4ICovCisJCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX0RBVEFfT1ZFUlJVTjoJCS8qIDB4MDA0NCAqLworCQljYXNlIE1QSV9JT0NTVEFUVVNfU0NTSV9JT19EQVRBX0VSUk9SOgkJLyogMHgwMDQ2ICovCisJCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX1RBU0tfTUdNVF9GQUlMRUQ6CS8qIDB4MDA0QSAqLworCQlkZWZhdWx0OgorCQkJLyoKKwkJCSAqIFdoYXQgdG8gZG8/CisJCQkgKi8KKwkJCXNjLT5yZXN1bHQgPSBESURfU09GVF9FUlJPUiA8PCAxNjsKKwkJCWJyZWFrOworCisJCX0JLyogc3dpdGNoKHN0YXR1cykgKi8KKworCQlkcmVwbHlwcmludGsoKEtFUk5fTk9USUNFICIgIHNjLT5yZXN1bHQgaXMgJTA4eGhcbiIsIHNjLT5yZXN1bHQpKTsKKwl9IC8qIGVuZCBvZiBhZGRyZXNzIHJlcGx5IGNhc2UgKi8KKworCS8qIFVubWFwIHRoZSBETUEgYnVmZmVycywgaWYgYW55LiAqLworCWlmIChzYy0+dXNlX3NnKSB7CisJCXBjaV91bm1hcF9zZyhpb2MtPnBjaWRldiwgKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBzYy0+cmVxdWVzdF9idWZmZXIsCisJCQkgICAgc2MtPnVzZV9zZywgc2MtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwl9IGVsc2UgaWYgKHNjLT5yZXF1ZXN0X2J1ZmZsZW4pIHsKKwkJcGNpX3VubWFwX3NpbmdsZShpb2MtPnBjaWRldiwgc2MtPlNDcC5kbWFfaGFuZGxlLAorCQkJCXNjLT5yZXF1ZXN0X2J1ZmZsZW4sIHNjLT5zY19kYXRhX2RpcmVjdGlvbik7CisJfQorCisJaGQtPlNjc2lMb29rdXBbcmVxX2lkeF0gPSBOVUxMOworCisJc2MtPnNjc2lfZG9uZShzYyk7CQkvKiBJc3N1ZSB0aGUgY29tbWFuZCBjYWxsYmFjayAqLworCisJLyogRnJlZSBDaGFpbiBidWZmZXJzICovCisJbXB0c2NzaWhfZnJlZUNoYWluQnVmZmVycyhpb2MsIHJlcV9pZHgpOworCXJldHVybiAxOworfQorCisKKy8qCisgKgltcHRzY3NpaF9mbHVzaF9ydW5uaW5nX2NtZHMgLSBGb3IgZWFjaCBjb21tYW5kIGZvdW5kLCBzZWFyY2gKKyAqCQlTY3NpX0hvc3QgaW5zdGFuY2UgdGFza1EgYW5kIHJlcGx5IHRvIE9TLgorICoJCUNhbGxlZCBvbmx5IGlmIHJlY292ZXJpbmcgZnJvbSBhIEZXIHJlbG9hZC4KKyAqCUBoZDogUG9pbnRlciB0byBhIFNDU0kgSE9TVCBzdHJ1Y3R1cmUKKyAqCisgKglSZXR1cm5zOiBOb25lLgorICoKKyAqCU11c3QgYmUgY2FsbGVkIHdoaWxlIG5ldyBJL09zIGFyZSBiZWluZyBxdWV1ZWQuCisgKi8KK3N0YXRpYyB2b2lkCittcHRzY3NpaF9mbHVzaF9ydW5uaW5nX2NtZHMoTVBUX1NDU0lfSE9TVCAqaGQpCit7CisJTVBUX0FEQVBURVIgKmlvYyA9IGhkLT5pb2M7CisJc3RydWN0IHNjc2lfY21uZAkqU0NwbnQ7CisJTVBUX0ZSQU1FX0hEUgkqbWY7CisJaW50CQkgaWk7CisJaW50CQkgbWF4ID0gaW9jLT5yZXFfZGVwdGg7CisKKwlkcHJpbnRrKChLRVJOX0lORk8gTVlOQU0gIjogZmx1c2hfU2NzaUxvb2t1cCBjYWxsZWRcbiIpKTsKKwlmb3IgKGlpPSAwOyBpaSA8IG1heDsgaWkrKykgeworCQlpZiAoKFNDcG50ID0gaGQtPlNjc2lMb29rdXBbaWldKSAhPSBOVUxMKSB7CisKKwkJCS8qIENvbW1hbmQgZm91bmQuCisJCQkgKi8KKworCQkJLyogTnVsbCBTY3NpTG9va3VwIGluZGV4CisJCQkgKi8KKwkJCWhkLT5TY3NpTG9va3VwW2lpXSA9IE5VTEw7CisKKwkJCW1mID0gTVBUX0lOREVYXzJfTUZQVFIoaW9jLCBpaSk7CisJCQlkbWZwcmludGsoKCAiZmx1c2g6IFNjc2lEb25lIChtZj0lcCxzYz0lcClcbiIsCisJCQkJCW1mLCBTQ3BudCkpOworCisJCQkvKiBTZXQgc3RhdHVzLCBmcmVlIE9TIHJlc291cmNlcyAoU0cgRE1BIGJ1ZmZlcnMpCisJCQkgKiBEbyBPUyBjYWxsYmFjaworCQkJICogRnJlZSBkcml2ZXIgcmVzb3VyY2VzIChjaGFpbiwgbXNnIGJ1ZmZlcnMpCisJCQkgKi8KKwkJCWlmIChzY3NpX2RldmljZV9vbmxpbmUoU0NwbnQtPmRldmljZSkpIHsKKwkJCQlpZiAoU0NwbnQtPnVzZV9zZykgeworCQkJCQlwY2lfdW5tYXBfc2coaW9jLT5wY2lkZXYsCisJCQkJCQkoc3RydWN0IHNjYXR0ZXJsaXN0ICopIFNDcG50LT5yZXF1ZXN0X2J1ZmZlciwKKwkJCQkJCVNDcG50LT51c2Vfc2csCisJCQkJCQlTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQkJCX0gZWxzZSBpZiAoU0NwbnQtPnJlcXVlc3RfYnVmZmxlbikgeworCQkJCQlwY2lfdW5tYXBfc2luZ2xlKGlvYy0+cGNpZGV2LAorCQkJCQkJU0NwbnQtPlNDcC5kbWFfaGFuZGxlLAorCQkJCQkJU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiwKKwkJCQkJCVNDcG50LT5zY19kYXRhX2RpcmVjdGlvbik7CisJCQkJfQorCQkJfQorCQkJU0NwbnQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwkJCVNDcG50LT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKworCQkJLyogRnJlZSBDaGFpbiBidWZmZXJzICovCisJCQltcHRzY3NpaF9mcmVlQ2hhaW5CdWZmZXJzKGlvYywgaWkpOworCisJCQkvKiBGcmVlIE1lc3NhZ2UgZnJhbWVzICovCisJCQltcHRfZnJlZV9tc2dfZnJhbWUoaW9jLCBtZik7CisKKwkJCVNDcG50LT5zY3NpX2RvbmUoU0NwbnQpOwkvKiBJc3N1ZSB0aGUgY29tbWFuZCBjYWxsYmFjayAqLworCQl9CisJfQorCisJcmV0dXJuOworfQorCisvKgorICoJbXB0c2NzaWhfc2VhcmNoX3J1bm5pbmdfY21kcyAtIERlbGV0ZSBhbnkgY29tbWFuZHMgYXNzb2NpYXRlZAorICoJCXdpdGggdGhlIHNwZWNpZmllZCB0YXJnZXQgYW5kIGx1bi4gRnVuY3Rpb24gY2FsbGVkIG9ubHkKKyAqCQl3aGVuIGEgbHVuIGlzIGRpc2FibGUgYnkgbWlkLWxheWVyLgorICoJCURvIE5PVCBhY2Nlc3MgdGhlIHJlZmVyZW5jZWQgc2NzaV9jbW5kIHN0cnVjdHVyZSBvcgorICoJCW1lbWJlcnMuIFdpbGwgY2F1c2UgZWl0aGVyIGEgcGFnaW5nIG9yIE5VTEwgcHRyIGVycm9yLgorICoJQGhkOiBQb2ludGVyIHRvIGEgU0NTSSBIT1NUIHN0cnVjdHVyZQorICoJQHRhcmdldDogdGFyZ2V0IGlkCisgKglAbHVuOiBsdW4KKyAqCisgKglSZXR1cm5zOiBOb25lLgorICoKKyAqCUNhbGxlZCBmcm9tIHNsYXZlX2Rlc3Ryb3kuCisgKi8KK3N0YXRpYyB2b2lkCittcHRzY3NpaF9zZWFyY2hfcnVubmluZ19jbWRzKE1QVF9TQ1NJX0hPU1QgKmhkLCB1aW50IHRhcmdldCwgdWludCBsdW4pCit7CisJU0NTSUlPUmVxdWVzdF90CSptZiA9IE5VTEw7CisJaW50CQkgaWk7CisJaW50CQkgbWF4ID0gaGQtPmlvYy0+cmVxX2RlcHRoOworCisJZHNwcmludGsoKEtFUk5fSU5GTyBNWU5BTSAiOiBzZWFyY2hfcnVubmluZyB0YXJnZXQgJWQgbHVuICVkIG1heCAlZFxuIiwKKwkJCXRhcmdldCwgbHVuLCBtYXgpKTsKKworCWZvciAoaWk9MDsgaWkgPCBtYXg7IGlpKyspIHsKKwkJaWYgKGhkLT5TY3NpTG9va3VwW2lpXSAhPSBOVUxMKSB7CisKKwkJCW1mID0gKFNDU0lJT1JlcXVlc3RfdCAqKU1QVF9JTkRFWF8yX01GUFRSKGhkLT5pb2MsIGlpKTsKKworCQkJZHNwcmludGsoKCAic2VhcmNoX3J1bm5pbmc6IGZvdW5kIChzYz0lcCwgbWYgPSAlcCkgdGFyZ2V0ICVkLCBsdW4gJWQgXG4iLAorCQkJCQloZC0+U2NzaUxvb2t1cFtpaV0sIG1mLCBtZi0+VGFyZ2V0SUQsIG1mLT5MVU5bMV0pKTsKKworCQkJaWYgKChtZi0+VGFyZ2V0SUQgIT0gKCh1OCl0YXJnZXQpKSB8fCAobWYtPkxVTlsxXSAhPSAoKHU4KSBsdW4pKSkKKwkJCQljb250aW51ZTsKKworCQkJLyogQ2xlYW51cAorCQkJICovCisJCQloZC0+U2NzaUxvb2t1cFtpaV0gPSBOVUxMOworCQkJbXB0c2NzaWhfZnJlZUNoYWluQnVmZmVycyhoZC0+aW9jLCBpaSk7CisJCQltcHRfZnJlZV9tc2dfZnJhbWUoaGQtPmlvYywgKE1QVF9GUkFNRV9IRFIgKiltZik7CisJCX0KKwl9CisKKwlyZXR1cm47Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKiAgSGFjayEgSXQgbWlnaHQgYmUgbmljZSB0byByZXBvcnQgaWYgYSBkZXZpY2UgaXMgcmV0dXJuaW5nIFFVRVVFX0ZVTEwKKyAqICBidXQgbWF5YmUgbm90IGVhY2ggYW5kIGV2ZXJ5IHRpbWUuLi4KKyAqLworc3RhdGljIGxvbmcgbGFzdF9xdWV1ZV9mdWxsID0gMDsKKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCW1wdHNjc2loX3JlcG9ydF9xdWV1ZV9mdWxsIC0gUmVwb3J0IFFVRVVFX0ZVTEwgc3RhdHVzIHJldHVybmVkCisgKglmcm9tIGEgU0NTSSB0YXJnZXQgZGV2aWNlLgorICoJQHNjOiBQb2ludGVyIHRvIHNjc2lfY21uZCBzdHJ1Y3R1cmUKKyAqCUBwU2NzaVJlcGx5OiBQb2ludGVyIHRvIFNDU0lJT1JlcGx5X3QKKyAqCUBwU2NzaVJlcTogUG9pbnRlciB0byBvcmlnaW5hbCBTQ1NJIHJlcXVlc3QKKyAqCisgKglUaGlzIHJvdXRpbmUgcGVyaW9kaWNhbGx5IHJlcG9ydHMgUVVFVUVfRlVMTCBzdGF0dXMgcmV0dXJuZWQgZnJvbSBhCisgKglTQ1NJIHRhcmdldCBkZXZpY2UuICBJdCByZXBvcnRzIHRoaXMgdG8gdGhlIGNvbnNvbGUgdmlhIGtlcm5lbAorICoJcHJpbnRrKCkgQVBJIGNhbGwsIG5vdCBtb3JlIHRoYW4gb25jZSBldmVyeSAxMCBzZWNvbmRzLgorICovCitzdGF0aWMgdm9pZAorbXB0c2NzaWhfcmVwb3J0X3F1ZXVlX2Z1bGwoc3RydWN0IHNjc2lfY21uZCAqc2MsIFNDU0lJT1JlcGx5X3QgKnBTY3NpUmVwbHksIFNDU0lJT1JlcXVlc3RfdCAqcFNjc2lSZXEpCit7CisJbG9uZyB0aW1lID0gamlmZmllczsKKworCWlmICh0aW1lIC0gbGFzdF9xdWV1ZV9mdWxsID4gMTAgKiBIWikgeworCQljaGFyICppb2Nfc3RyID0gImlvYz8iOworCisJCWlmIChzYy0+ZGV2aWNlICYmIHNjLT5kZXZpY2UtPmhvc3QgIT0gTlVMTCAmJiBzYy0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSAhPSBOVUxMKQorCQkJaW9jX3N0ciA9ICgoTVBUX1NDU0lfSE9TVCAqKXNjLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhKS0+aW9jLT5uYW1lOworCQlkcHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJEZXZpY2UgKCVkOiVkOiVkKSByZXBvcnRlZCBRVUVVRV9GVUxMIVxuIiwKKwkJCQlpb2Nfc3RyLCAwLCBzYy0+ZGV2aWNlLT5pZCwgc2MtPmRldmljZS0+bHVuKSk7CisJCWxhc3RfcXVldWVfZnVsbCA9IHRpbWU7CisJfQorfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCitzdGF0aWMgY2hhciAqaW5mb19rYnVmID0gTlVMTDsKKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCW1wdHNjc2loX3Byb2JlIC0gSW5zdGFsbHMgc2NzaSBkZXZpY2VzIHBlciBidXMuCisgKglAcGRldjogUG9pbnRlciB0byBwY2lfZGV2IHN0cnVjdHVyZQorICoKKyAqCVJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUuCisgKgorICovCisKK3N0YXRpYyBpbnQKK21wdHNjc2loX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IFNjc2lfSG9zdAkqc2g7CisJTVBUX1NDU0lfSE9TVAkJKmhkOworCU1QVF9BREFQVEVSIAkJKmlvYyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBsb25nCQkgZmxhZ3M7CisJaW50CQkJIHN6LCBpaTsKKwlpbnQJCQkgbnVtU0dFID0gMDsKKwlpbnQJCQkgc2NhbGU7CisJaW50CQkJIGlvY19jYXA7CisJdTgJCQkqbWVtOworCWludAkJCWVycm9yPTA7CisKKworCS8qIDIwMDEwMjAyIC1zcmFsc3RvbgorCSAqICBBZGRlZCBzYW5pdHkgY2hlY2sgb24gcmVhZGluZXNzIG9mIHRoZSBNUFQgYWRhcHRlci4KKwkgKi8KKwlpZiAoaW9jLT5sYXN0X3N0YXRlICE9IE1QSV9JT0NfU1RBVEVfT1BFUkFUSU9OQUwpIHsKKwkJcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQKKwkJICAiU2tpcHBpbmcgYmVjYXVzZSBpdCdzIG5vdCBvcGVyYXRpb25hbCFcbiIsCisJCSAgaW9jLT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCFpb2MtPmFjdGl2ZSkgeworCQlwcmludGsoTVlJT0Nfc19XQVJOX0ZNVCAiU2tpcHBpbmcgYmVjYXVzZSBpdCdzIGRpc2FibGVkIVxuIiwKKwkJICBpb2MtPm5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiAgU2FuaXR5IGNoZWNrIC0gZW5zdXJlIGF0IGxlYXN0IDEgcG9ydCBpcyBJTklUSUFUT1IgY2FwYWJsZQorCSAqLworCWlvY19jYXAgPSAwOworCWZvciAoaWk9MDsgaWkgPCBpb2MtPmZhY3RzLk51bWJlck9mUG9ydHM7IGlpKyspIHsKKwkJaWYgKGlvYy0+cGZhY3RzW2lpXS5Qcm90b2NvbEZsYWdzICYKKwkJICAgIE1QSV9QT1JURkFDVFNfUFJPVE9DT0xfSU5JVElBVE9SKQorCQkJaW9jX2NhcCArKzsKKwl9CisKKwlpZiAoIWlvY19jYXApIHsKKwkJcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQKKwkJCSJTa2lwcGluZyBpb2M9JXAgYmVjYXVzZSBTQ1NJIEluaXRpYXRvciBtb2RlIGlzIE5PVCBlbmFibGVkIVxuIiwKKwkJCWlvYy0+bmFtZSwgaW9jKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJc2ggPSBzY3NpX2hvc3RfYWxsb2MoJmRyaXZlcl90ZW1wbGF0ZSwgc2l6ZW9mKE1QVF9TQ1NJX0hPU1QpKTsKKyAgICAgICAgCisJaWYgKCFzaCkgeworCQlwcmludGsoTVlJT0Nfc19XQVJOX0ZNVAorCQkJIlVuYWJsZSB0byByZWdpc3RlciBjb250cm9sbGVyIHdpdGggU0NTSSBzdWJzeXN0ZW1cbiIsCisJCQlpb2MtPm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPkZyZWVRbG9jaywgZmxhZ3MpOworCisJLyogQXR0YWNoIHRoZSBTQ1NJIEhvc3QgdG8gdGhlIElPQyBzdHJ1Y3R1cmUKKwkgKi8KKwlpb2MtPnNoID0gc2g7CisKKwlzaC0+aW9fcG9ydCA9IDA7CisJc2gtPm5faW9fcG9ydCA9IDA7CisJc2gtPmlycSA9IDA7CisKKwkvKiBzZXQgMTYgYnl0ZSBjZGIncyAqLworCXNoLT5tYXhfY21kX2xlbiA9IDE2OworCisJLyogWWlrZXMhICBUaGlzIGlzIGltcG9ydGFudCEKKwkgKiBPdGhlcndpc2UsIGJ5IGRlZmF1bHQsIGxpbnV4CisJICogb25seSBzY2FucyB0YXJnZXQgSURzIDAtNyEKKwkgKiBwZmFjdHNOLT5NYXhEZXZpY2VzIHVucmVsaWFibGUKKwkgKiAobm90IHN1cHBvcnRlZCBpbiBlYXJseQorCSAqCXZlcnNpb25zIG9mIHRoZSBGVykuCisJICogbWF4X2lkID0gMSArIGFjdHVhbCBtYXggaWQsCisJICogbWF4X2x1biA9IDEgKyBhY3R1YWwgbGFzdCBsdW4sCisJICoJc2VlIGhvc3RzLmggOm8oCisJICovCisJaWYgKGlvYy0+YnVzX3R5cGUgPT0gU0NTSSkgeworCQlzaC0+bWF4X2lkID0gTVBUX01BWF9TQ1NJX0RFVklDRVM7CisJfSBlbHNlIHsKKwkvKiBGb3IgRkMsIGluY3JlYXNlIHRoZSBxdWV1ZSBkZXB0aAorCSAqIGZyb20gTVBUX1NDU0lfQ0FOX1FVRVVFICgzMSkKKwkgKiB0byBNUFRfRkNfQ0FOX1FVRVVFICg2MykuCisJICovCisJCXNoLT5jYW5fcXVldWUgPSBNUFRfRkNfQ0FOX1FVRVVFOworCQlzaC0+bWF4X2lkID0KKwkJICBNUFRfTUFYX0ZDX0RFVklDRVM8MjU2ID8gTVBUX01BWF9GQ19ERVZJQ0VTIDogMjU1OworCX0KKwkJCisJc2gtPm1heF9sdW4gPSBNUFRfTEFTVF9MVU4gKyAxOworCXNoLT5tYXhfY2hhbm5lbCA9IDA7CisJc2gtPnRoaXNfaWQgPSBpb2MtPnBmYWN0c1swXS5Qb3J0U0NTSUlEOworCQkKKwkvKiBSZXF1aXJlZCBlbnRyeS4KKwkgKi8KKwlzaC0+dW5pcXVlX2lkID0gaW9jLT5pZDsKKworCS8qIFZlcmlmeSB0aGF0IHdlIHdvbid0IGV4Y2VlZCB0aGUgbWF4aW11bQorCSAqIG51bWJlciBvZiBjaGFpbiBidWZmZXJzCisJICogV2UgY2FuIG9wdGltaXplOiAgWlogPSByZXFfc3ovc2l6ZW9mKFNHRSkKKwkgKiBGb3IgMzJiaXQgU0dFJ3M6CisJICogIG51bVNHRSA9IDEgKyAoWlotMSkqKG1heENoYWluIC0xKSArIFpaCisJICogICAgICAgICAgICAgICArIChyZXFfc3ogLSA2NCkvc2l6ZW9mKFNHRSkKKwkgKiBBIHNsaWdodGx5IGRpZmZlcmVudCBhbGdvcml0aG0gaXMgcmVxdWlyZWQgZm9yCisJICogNjRiaXQgU0dFcy4KKwkgKi8KKwlzY2FsZSA9IGlvYy0+cmVxX3N6LyhzaXplb2YoZG1hX2FkZHJfdCkgKyBzaXplb2YodTMyKSk7CisJaWYgKHNpemVvZihkbWFfYWRkcl90KSA9PSBzaXplb2YodTY0KSkgeworCQludW1TR0UgPSAoc2NhbGUgLSAxKSAqCisJCSAgKGlvYy0+ZmFjdHMuTWF4Q2hhaW5EZXB0aC0xKSArIHNjYWxlICsKKwkJICAoaW9jLT5yZXFfc3ogLSA2MCkgLyAoc2l6ZW9mKGRtYV9hZGRyX3QpICsKKwkJICBzaXplb2YodTMyKSk7CisJfSBlbHNlIHsKKwkJbnVtU0dFID0gMSArIChzY2FsZSAtIDEpICoKKwkJICAoaW9jLT5mYWN0cy5NYXhDaGFpbkRlcHRoLTEpICsgc2NhbGUgKworCQkgIChpb2MtPnJlcV9zeiAtIDY0KSAvIChzaXplb2YoZG1hX2FkZHJfdCkgKworCQkgIHNpemVvZih1MzIpKTsKKwl9CisJCQorCWlmIChudW1TR0UgPCBzaC0+c2dfdGFibGVzaXplKSB7CisJCS8qIFJlc2V0IHRoaXMgdmFsdWUgKi8KKwkJZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVAorCQkgICJSZXNldHRpbmcgc2dfdGFibGVzaXplIHRvICVkIGZyb20gJWRcbiIsCisJCSAgaW9jLT5uYW1lLCBudW1TR0UsIHNoLT5zZ190YWJsZXNpemUpKTsKKwkJc2gtPnNnX3RhYmxlc2l6ZSA9IG51bVNHRTsKKwl9CisKKwkvKiBTZXQgdGhlIHBjaSBkZXZpY2UgcG9pbnRlciBpbiBTY3NpX0hvc3Qgc3RydWN0dXJlLgorCSAqLworCXNjc2lfc2V0X2RldmljZShzaCwgJmlvYy0+cGNpZGV2LT5kZXYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5GcmVlUWxvY2ssIGZsYWdzKTsKKworCWhkID0gKE1QVF9TQ1NJX0hPU1QgKikgc2gtPmhvc3RkYXRhOworCWhkLT5pb2MgPSBpb2M7CisKKwkvKiBTQ1NJIG5lZWRzIHNjc2lfY21uZCBsb29rdXAgdGFibGUhCisJICogKHdpdGggc2l6ZSBlcXVhbCB0byByZXFfZGVwdGgqUHRyU3ohKQorCSAqLworCXN6ID0gaW9jLT5yZXFfZGVwdGggKiBzaXplb2Yodm9pZCAqKTsKKwltZW0gPSBrbWFsbG9jKHN6LCBHRlBfQVRPTUlDKTsKKwlpZiAobWVtID09IE5VTEwpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIG1wdHNjc2loX3Byb2JlX2ZhaWxlZDsKKwl9CisKKwltZW1zZXQobWVtLCAwLCBzeik7CisJaGQtPlNjc2lMb29rdXAgPSAoc3RydWN0IHNjc2lfY21uZCAqKikgbWVtOworCisJZHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2NzaUxvb2t1cCBAICVwLCBzej0lZFxuIiwKKwkJIGlvYy0+bmFtZSwgaGQtPlNjc2lMb29rdXAsIHN6KSk7CisJCQorCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGRldmljZSBzdHJ1Y3R1cmVzLgorCSAqIEEgbm9uLU51bGwgcG9pbnRlciBhdCBhbiBvZmZzZXQKKwkgKiBpbmRpY2F0ZXMgYSBkZXZpY2UgZXhpc3RzLgorCSAqIG1heF9pZCA9IDEgKyBtYXhpbXVtIGlkIChob3N0cy5oKQorCSAqLworCXN6ID0gc2gtPm1heF9pZCAqIHNpemVvZih2b2lkICopOworCW1lbSA9IGttYWxsb2Moc3osIEdGUF9BVE9NSUMpOworCWlmIChtZW0gPT0gTlVMTCkgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gbXB0c2NzaWhfcHJvYmVfZmFpbGVkOworCX0KKworCW1lbXNldChtZW0sIDAsIHN6KTsKKwloZC0+VGFyZ2V0cyA9IChWaXJ0RGV2aWNlICoqKSBtZW07CisKKwlkcHJpbnRrKChLRVJOX0lORk8KKwkgICIgIFRhcmdldHMgQCAlcCwgc3o9JWRcbiIsIGhkLT5UYXJnZXRzLCBzeikpOworCisJLyogQ2xlYXIgdGhlIFRNIGZsYWdzCisJICovCisJaGQtPnRtUGVuZGluZyA9IDA7CisJaGQtPnRtU3RhdGUgPSBUTV9TVEFURV9OT05FOworCWhkLT5yZXNldFBlbmRpbmcgPSAwOworCWhkLT5hYm9ydFNDcG50ID0gTlVMTDsKKworCS8qIENsZWFyIHRoZSBwb2ludGVyIHVzZWQgdG8gc3RvcmUKKwkgKiBzaW5nbGUtdGhyZWFkZWQgY29tbWFuZHMsIGkuZS4sIHRob3NlCisJICogaXNzdWVkIGR1cmluZyBhIGJ1cyBzY2FuLCBkdiBhbmQKKwkgKiBjb25maWd1cmF0aW9uIHBhZ2VzLgorCSAqLworCWhkLT5jbWRQdHIgPSBOVUxMOworCisJLyogSW5pdGlhbGl6ZSB0aGlzIFNDU0kgSG9zdHMnIHRpbWVycworCSAqIFRvIHVzZSwgc2V0IHRoZSB0aW1lciBleHBpcmVzIGZpZWxkCisJICogYW5kIGFkZF90aW1lcgorCSAqLworCWluaXRfdGltZXIoJmhkLT50aW1lcik7CisJaGQtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaGQ7CisJaGQtPnRpbWVyLmZ1bmN0aW9uID0gbXB0c2NzaWhfdGltZXJfZXhwaXJlZDsKKworCWlmIChpb2MtPmJ1c190eXBlID09IFNDU0kpIHsKKwkJLyogVXBkYXRlIHdpdGggdGhlIGRyaXZlciBzZXR1cAorCQkgKiB2YWx1ZXMuCisJCSAqLworCQlpZiAoaW9jLT5zcGlfZGF0YS5tYXhCdXNXaWR0aCA+IG1wdF93aWR0aCkKKwkJCWlvYy0+c3BpX2RhdGEubWF4QnVzV2lkdGggPSBtcHRfd2lkdGg7CisJCWlmIChpb2MtPnNwaV9kYXRhLm1pblN5bmNGYWN0b3IgPCBtcHRfZmFjdG9yKQorCQkJaW9jLT5zcGlfZGF0YS5taW5TeW5jRmFjdG9yID0gbXB0X2ZhY3RvcjsKKworCQlpZiAoaW9jLT5zcGlfZGF0YS5taW5TeW5jRmFjdG9yID09IE1QVF9BU1lOQykgeworCQkJaW9jLT5zcGlfZGF0YS5tYXhTeW5jT2Zmc2V0ID0gMDsKKwkJfQorCisJCWlvYy0+c3BpX2RhdGEuU2FmX1RlID0gbXB0X3NhZl90ZTsKKworCQloZC0+bmVnb052cmFtID0gMDsKKyNpZm5kZWYgTVBUU0NTSUhfRU5BQkxFX0RPTUFJTl9WQUxJREFUSU9OCisJCWhkLT5uZWdvTnZyYW0gPSBNUFRfU0NTSUNGR19VU0VfTlZSQU07CisjZW5kaWYKKwkJaW9jLT5zcGlfZGF0YS5mb3JjZUR2ID0gMDsKKwkJaW9jLT5zcGlfZGF0YS5ub1FhcyA9IDA7CisJCWZvciAoaWk9MDsgaWkgPCBNUFRfTUFYX1NDU0lfREVWSUNFUzsgaWkrKykgeworCQkJaW9jLT5zcGlfZGF0YS5kdlN0YXR1c1tpaV0gPQorCQkJICBNUFRfU0NTSUNGR19ORUdPVElBVEU7CisJCX0KKworCQlmb3IgKGlpPTA7IGlpIDwgTVBUX01BWF9TQ1NJX0RFVklDRVM7IGlpKyspCisJCQlpb2MtPnNwaV9kYXRhLmR2U3RhdHVzW2lpXSB8PQorCQkJICBNUFRfU0NTSUNGR19EVl9OT1RfRE9ORTsKKworCQlkaW5pdHByaW50aygoTVlJT0Nfc19JTkZPX0ZNVAorCQkJImR2ICV4IHdpZHRoICV4IGZhY3RvciAleCBzYWZfdGUgJXhcbiIsCisJCQlpb2MtPm5hbWUsIG1wdF9kdiwKKwkJCW1wdF93aWR0aCwKKwkJCW1wdF9mYWN0b3IsCisJCQltcHRfc2FmX3RlKSk7CisJfQorCisJbXB0X3Njc2lfaG9zdHMrKzsKKworCWVycm9yID0gc2NzaV9hZGRfaG9zdCAoc2gsICZpb2MtPnBjaWRldi0+ZGV2KTsKKwlpZihlcnJvcikgeworCQlkcHJpbnRrKChLRVJOX0VSUiBNWU5BTQorCQkgICJzY3NpX2FkZF9ob3N0IGZhaWxlZFxuIikpOworCQlnb3RvIG1wdHNjc2loX3Byb2JlX2ZhaWxlZDsKKwl9CisKKwlzY3NpX3NjYW5faG9zdChzaCk7CisJcmV0dXJuIDA7CisKK21wdHNjc2loX3Byb2JlX2ZhaWxlZDoKKworCW1wdHNjc2loX3JlbW92ZShwZGV2KTsKKwlyZXR1cm4gZXJyb3I7CisKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCW1wdHNjc2loX3JlbW92ZSAtIFJlbW92ZWQgc2NzaSBkZXZpY2VzCisgKglAcGRldjogUG9pbnRlciB0byBwY2lfZGV2IHN0cnVjdHVyZQorICoKKyAqCisgKi8KK3N0YXRpYyB2b2lkCittcHRzY3NpaF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJTVBUX0FEQVBURVIgCQkqaW9jID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBTY3NpX0hvc3QgCSpob3N0ID0gaW9jLT5zaDsKKwlNUFRfU0NTSV9IT1NUCQkqaGQ7CisJaW50IAkJIAljb3VudDsKKwl1bnNpZ25lZCBsb25nCSAJZmxhZ3M7CisKKwlpZighaG9zdCkKKwkJcmV0dXJuOworCisJc2NzaV9yZW1vdmVfaG9zdChob3N0KTsKKworI2lmZGVmIE1QVFNDU0lIX0VOQUJMRV9ET01BSU5fVkFMSURBVElPTgorCS8qIENoZWNrIERWIHRocmVhZCBhY3RpdmUgKi8KKwljb3VudCA9IDEwICogSFo7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmR2dGFza1FfbG9jaywgZmxhZ3MpOworCWlmIChkdnRhc2tRX2FjdGl2ZSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdnRhc2tRX2xvY2ssIGZsYWdzKTsKKwkJd2hpbGUoZHZ0YXNrUV9hY3RpdmUgJiYgLS1jb3VudCkgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCX0KKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdnRhc2tRX2xvY2ssIGZsYWdzKTsKKwl9CisJaWYgKCFjb3VudCkKKwkJcHJpbnRrKEtFUk5fRVJSIE1ZTkFNICI6IEVSUk9SIC0gRFYgdGhyZWFkIHN0aWxsIGFjdGl2ZSFcbiIpOworI2lmIGRlZmluZWQoTVBUX0RFQlVHX0RWKSB8fCBkZWZpbmVkKE1QVF9ERUJVR19EVl9USU5ZKQorCWVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSIE1ZTkFNICI6IERWIHRocmVhZCBvcmlnICVkLCBjb3VudCAlZFxuIiwgMTAgKiBIWiwgY291bnQpOworI2VuZGlmCisjZW5kaWYKKworCWhkID0gKE1QVF9TQ1NJX0hPU1QgKilob3N0LT5ob3N0ZGF0YTsKKwlpZiAoaGQgIT0gTlVMTCkgeworCQlpbnQgc3oxOworCisJCW1wdHNjc2loX3NodXRkb3duKCZwZGV2LT5kZXYpOworCisJCXN6MT0wOworCisJCWlmIChoZC0+U2NzaUxvb2t1cCAhPSBOVUxMKSB7CisJCQlzejEgPSBoZC0+aW9jLT5yZXFfZGVwdGggKiBzaXplb2Yodm9pZCAqKTsKKwkJCWtmcmVlKGhkLT5TY3NpTG9va3VwKTsKKwkJCWhkLT5TY3NpTG9va3VwID0gTlVMTDsKKwkJfQorCisJCWlmIChoZC0+VGFyZ2V0cyAhPSBOVUxMKSB7CisJCQkvKgorCQkJICogRnJlZSBwb2ludGVyIGFycmF5LgorCQkJICovCisJCQlrZnJlZShoZC0+VGFyZ2V0cyk7CisJCQloZC0+VGFyZ2V0cyA9IE5VTEw7CisJCX0KKworCQlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UIAorCQkgICAgIkZyZWUnZCBTY3NpTG9va3VwICglZCkgbWVtb3J5XG4iLAorCQkgICAgaGQtPmlvYy0+bmFtZSwgc3oxKSk7CisKKwkJLyogTlVMTCB0aGUgU2NzaV9Ib3N0IHBvaW50ZXIKKwkJICovCisJCWhkLT5pb2MtPnNoID0gTlVMTDsKKwl9CisKKwlzY3NpX2hvc3RfcHV0KGhvc3QpOworCW1wdF9zY3NpX2hvc3RzLS07CisKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCW1wdHNjc2loX3NodXRkb3duIC0gcmVib290IG5vdGlmaWVyCisgKgorICovCitzdGF0aWMgdm9pZAorbXB0c2NzaWhfc2h1dGRvd24oc3RydWN0IGRldmljZSAqIGRldikKK3sKKwlNUFRfQURBUFRFUiAJCSppb2MgPSBwY2lfZ2V0X2RydmRhdGEodG9fcGNpX2RldihkZXYpKTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0IAkqaG9zdCA9IGlvYy0+c2g7CisJTVBUX1NDU0lfSE9TVAkJKmhkOworCisJaWYoIWhvc3QpCisJCXJldHVybjsKKworCWhkID0gKE1QVF9TQ1NJX0hPU1QgKilob3N0LT5ob3N0ZGF0YTsKKworCS8qIEZsdXNoIHRoZSBjYWNoZSBvZiB0aGlzIGFkYXB0ZXIKKwkgKi8KKwlpZihoZCAhPSBOVUxMKQorCQltcHRzY3NpaF9zeW5jaHJvbml6ZV9jYWNoZShoZCwgMCk7CisKK30KKworI2lmZGVmIENPTkZJR19QTQorLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCW1wdHNjc2loX3N1c3BlbmQgLSBGdXNpb24gTVBUIHNjc2llIGRyaXZlciBzdXNwZW5kIHJvdXRpbmUuCisgKgorICoKKyAqLworc3RhdGljIGludAorbXB0c2NzaWhfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIHN0YXRlKQoreworCW1wdHNjc2loX3NodXRkb3duKCZwZGV2LT5kZXYpOworCXJldHVybiAwOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJbXB0c2NzaWhfcmVzdW1lIC0gRnVzaW9uIE1QVCBzY3NpIGRyaXZlciByZXN1bWUgcm91dGluZS4KKyAqCisgKgorICovCitzdGF0aWMgaW50CittcHRzY3NpaF9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJTVBUX0FEQVBURVIgCQkqaW9jID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBTY3NpX0hvc3QgCSpob3N0ID0gaW9jLT5zaDsKKwlNUFRfU0NTSV9IT1NUCQkqaGQ7CisKKwlpZighaG9zdCkKKwkJcmV0dXJuIDA7CisKKwloZCA9IChNUFRfU0NTSV9IT1NUICopaG9zdC0+aG9zdGRhdGE7CisJaWYoIWhkKQorCQlyZXR1cm4gMDsKKworI2lmZGVmIE1QVFNDU0lIX0VOQUJMRV9ET01BSU5fVkFMSURBVElPTgorCXsKKwl1bnNpZ25lZCBsb25nIGxmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHZ0YXNrUV9sb2NrLCBsZmxhZ3MpOworCWlmICghZHZ0YXNrUV9hY3RpdmUpIHsKKwkJZHZ0YXNrUV9hY3RpdmUgPSAxOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdnRhc2tRX2xvY2ssIGxmbGFncyk7CisJCUlOSVRfV09SSygmbXB0c2NzaWhfZHZUYXNrLAorCQkgIG1wdHNjc2loX2RvbWFpblZhbGlkYXRpb24sICh2b2lkICopIGhkKTsKKwkJc2NoZWR1bGVfd29yaygmbXB0c2NzaWhfZHZUYXNrKTsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdnRhc2tRX2xvY2ssIGxmbGFncyk7CisJfQorCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBtcHRfcGNpX2RyaXZlciBtcHRzY3NpaF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IG1wdHNjc2loX3Byb2JlLAorCS5yZW1vdmUJCT0gbXB0c2NzaWhfcmVtb3ZlLAorCS5zaHV0ZG93bgk9IG1wdHNjc2loX3NodXRkb3duLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gbXB0c2NzaWhfc3VzcGVuZCwKKwkucmVzdW1lCQk9IG1wdHNjc2loX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworLyogIFNDU0kgaG9zdCBmb3BzIHN0YXJ0IGhlcmUuLi4gICovCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKioKKyAqCW1wdHNjc2loX2luaXQgLSBSZWdpc3RlciBNUFQgYWRhcHRlcihzKSBhcyBTQ1NJIGhvc3Qocykgd2l0aAorICoJbGludXggc2NzaSBtaWQtbGF5ZXIuCisgKgorICoJUmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBfX2luaXQKK21wdHNjc2loX2luaXQodm9pZCkKK3sKKworCXNob3dfbXB0bW9kX3ZlcihteV9OQU1FLCBteV9WRVJTSU9OKTsKKworCVNjc2lEb25lQ3R4ID0gbXB0X3JlZ2lzdGVyKG1wdHNjc2loX2lvX2RvbmUsIE1QVFNDU0lIX0RSSVZFUik7CisJU2NzaVRhc2tDdHggPSBtcHRfcmVnaXN0ZXIobXB0c2NzaWhfdGFza21nbXRfY29tcGxldGUsIE1QVFNDU0lIX0RSSVZFUik7CisJU2NzaVNjYW5EdkN0eCA9IG1wdF9yZWdpc3RlcihtcHRzY3NpaF9zY2FuZHZfY29tcGxldGUsIE1QVFNDU0lIX0RSSVZFUik7CisKKwlpZiAobXB0X2V2ZW50X3JlZ2lzdGVyKFNjc2lEb25lQ3R4LCBtcHRzY3NpaF9ldmVudF9wcm9jZXNzKSA9PSAwKSB7CisJCWRldnRwcmludGsoKEtFUk5fSU5GTyBNWU5BTQorCQkgICI6IFJlZ2lzdGVyZWQgZm9yIElPQyBldmVudCBub3RpZmljYXRpb25zXG4iKSk7CisJfQorCisJaWYgKG1wdF9yZXNldF9yZWdpc3RlcihTY3NpRG9uZUN0eCwgbXB0c2NzaWhfaW9jX3Jlc2V0KSA9PSAwKSB7CisJCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTQorCQkgICI6IFJlZ2lzdGVyZWQgZm9yIElPQyByZXNldCBub3RpZmljYXRpb25zXG4iKSk7CisJfQorCisJaWYobXB0X2RldmljZV9kcml2ZXJfcmVnaXN0ZXIoJm1wdHNjc2loX2RyaXZlciwKKwkgIE1QVFNDU0lIX0RSSVZFUikgIT0gMCApIHsKKwkJZHByaW50aygoS0VSTl9JTkZPIE1ZTkFNCisJCSI6IGZhaWxlZCB0byByZWdpc3RlciBkZCBjYWxsYmFja3NcbiIpKTsKKwl9CisKKwlyZXR1cm4gMDsKKworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKioKKyAqCW1wdHNjc2loX2V4aXQgLSBVbnJlZ2lzdGVycyBNUFQgYWRhcHRlcihzKQorICoKKyAqLworc3RhdGljIHZvaWQgX19leGl0CittcHRzY3NpaF9leGl0KHZvaWQpCit7CisJbXB0X2RldmljZV9kcml2ZXJfZGVyZWdpc3RlcihNUFRTQ1NJSF9EUklWRVIpOworCisJbXB0X3Jlc2V0X2RlcmVnaXN0ZXIoU2NzaURvbmVDdHgpOworCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTQorCSAgIjogRGVyZWdpc3RlcmVkIGZvciBJT0MgcmVzZXQgbm90aWZpY2F0aW9uc1xuIikpOworCisJbXB0X2V2ZW50X2RlcmVnaXN0ZXIoU2NzaURvbmVDdHgpOworCWRwcmludGsoKEtFUk5fSU5GTyBNWU5BTQorCSAgIjogRGVyZWdpc3RlcmVkIGZvciBJT0MgZXZlbnQgbm90aWZpY2F0aW9uc1xuIikpOworCisJbXB0X2RlcmVnaXN0ZXIoU2NzaVNjYW5EdkN0eCk7CisJbXB0X2RlcmVnaXN0ZXIoU2NzaVRhc2tDdHgpOworCW1wdF9kZXJlZ2lzdGVyKFNjc2lEb25lQ3R4KTsKKworCWlmIChpbmZvX2tidWYgIT0gTlVMTCkKKwkJa2ZyZWUoaW5mb19rYnVmKTsKKworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKioKKyAqCW1wdHNjc2loX2luZm8gLSBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgTVBUIGFkYXB0ZXIKKyAqCUBTQ2hvc3Q6IFBvaW50ZXIgdG8gU2NzaV9Ib3N0IHN0cnVjdHVyZQorICoKKyAqCShsaW51eCBzY3NpX2hvc3RfdGVtcGxhdGUuaW5mbyByb3V0aW5lKQorICoKKyAqCVJldHVybnMgcG9pbnRlciB0byBidWZmZXIgd2hlcmUgaW5mb3JtYXRpb24gd2FzIHdyaXR0ZW4uCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK21wdHNjc2loX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqU0Nob3N0KQoreworCU1QVF9TQ1NJX0hPU1QgKmg7CisJaW50IHNpemUgPSAwOworCisJaWYgKGluZm9fa2J1ZiA9PSBOVUxMKQorCQlpZiAoKGluZm9fa2J1ZiA9IGttYWxsb2MoMHgxMDAwIC8qIDRLYiAqLywgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCQlyZXR1cm4gaW5mb19rYnVmOworCisJaCA9IChNUFRfU0NTSV9IT1NUICopU0Nob3N0LT5ob3N0ZGF0YTsKKwlpbmZvX2tidWZbMF0gPSAnXDAnOworCWlmIChoKSB7CisJCW1wdF9wcmludF9pb2Nfc3VtbWFyeShoLT5pb2MsIGluZm9fa2J1ZiwgJnNpemUsIDAsIDApOworCQlpbmZvX2tidWZbc2l6ZS0xXSA9ICdcMCc7CisJfQorCisJcmV0dXJuIGluZm9fa2J1ZjsKK30KKworc3RydWN0IGluZm9fc3RyIHsKKwljaGFyICpidWZmZXI7CisJaW50ICAgbGVuZ3RoOworCWludCAgIG9mZnNldDsKKwlpbnQgICBwb3M7Cit9OworCitzdGF0aWMgdm9pZCBjb3B5X21lbV9pbmZvKHN0cnVjdCBpbmZvX3N0ciAqaW5mbywgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwlpZiAoaW5mby0+cG9zICsgbGVuID4gaW5mby0+bGVuZ3RoKQorCQlsZW4gPSBpbmZvLT5sZW5ndGggLSBpbmZvLT5wb3M7CisKKwlpZiAoaW5mby0+cG9zICsgbGVuIDwgaW5mby0+b2Zmc2V0KSB7CisJCWluZm8tPnBvcyArPSBsZW47CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW5mby0+cG9zIDwgaW5mby0+b2Zmc2V0KSB7CisJICAgICAgICBkYXRhICs9IChpbmZvLT5vZmZzZXQgLSBpbmZvLT5wb3MpOworCSAgICAgICAgbGVuICAtPSAoaW5mby0+b2Zmc2V0IC0gaW5mby0+cG9zKTsKKwl9CisKKwlpZiAobGVuID4gMCkgeworICAgICAgICAgICAgICAgIG1lbWNweShpbmZvLT5idWZmZXIgKyBpbmZvLT5wb3MsIGRhdGEsIGxlbik7CisgICAgICAgICAgICAgICAgaW5mby0+cG9zICs9IGxlbjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY29weV9pbmZvKHN0cnVjdCBpbmZvX3N0ciAqaW5mbywgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWNoYXIgYnVmWzgxXTsKKwlpbnQgbGVuOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlsZW4gPSB2c3ByaW50ZihidWYsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJY29weV9tZW1faW5mbyhpbmZvLCBidWYsIGxlbik7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBtcHRzY3NpaF9ob3N0X2luZm8oTVBUX0FEQVBURVIgKmlvYywgY2hhciAqcGJ1Ziwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuKQoreworCXN0cnVjdCBpbmZvX3N0ciBpbmZvOworCisJaW5mby5idWZmZXIJPSBwYnVmOworCWluZm8ubGVuZ3RoCT0gbGVuOworCWluZm8ub2Zmc2V0CT0gb2Zmc2V0OworCWluZm8ucG9zCT0gMDsKKworCWNvcHlfaW5mbygmaW5mbywgIiVzOiAlcywgIiwgaW9jLT5uYW1lLCBpb2MtPnByb2RfbmFtZSk7CisJY29weV9pbmZvKCZpbmZvLCAiJXMlMDh4aCwgIiwgTVBUX0ZXX1JFVl9NQUdJQ19JRF9TVFJJTkcsIGlvYy0+ZmFjdHMuRldWZXJzaW9uLldvcmQpOworCWNvcHlfaW5mbygmaW5mbywgIlBvcnRzPSVkLCAiLCBpb2MtPmZhY3RzLk51bWJlck9mUG9ydHMpOworCWNvcHlfaW5mbygmaW5mbywgIk1heFE9JWRcbiIsIGlvYy0+cmVxX2RlcHRoKTsKKworCXJldHVybiAoKGluZm8ucG9zID4gaW5mby5vZmZzZXQpID8gaW5mby5wb3MgLSBpbmZvLm9mZnNldCA6IDApOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKioKKyAqCW1wdHNjc2loX3Byb2NfaW5mbyAtIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBNUFQgYWRhcHRlcgorICoKKyAqCShsaW51eCBzY3NpX2hvc3RfdGVtcGxhdGUuaW5mbyByb3V0aW5lKQorICoKKyAqIAlidWZmZXI6IGlmIHdyaXRlLCB1c2VyIGRhdGE7IGlmIHJlYWQsIGJ1ZmZlciBmb3IgdXNlcgorICogCWxlbmd0aDogaWYgd3JpdGUsIHJldHVybiBsZW5ndGg7CisgKiAJb2Zmc2V0OiBpZiB3cml0ZSwgMDsgaWYgcmVhZCwgdGhlIGN1cnJlbnQgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlciBmcm9tCisgKiAJCXRoZSBwcmV2aW91cyByZWFkLgorICogCWhvc3Rubzogc2NzaSBob3N0IG51bWJlcgorICoJZnVuYzogICBpZiB3cml0ZSA9IDE7IGlmIHJlYWQgPSAwCisgKi8KK3N0YXRpYyBpbnQKK21wdHNjc2loX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJaW50IGxlbmd0aCwgaW50IGZ1bmMpCit7CisJTVBUX1NDU0lfSE9TVAkqaGQgPSAoTVBUX1NDU0lfSE9TVCAqKWhvc3QtPmhvc3RkYXRhOworCU1QVF9BREFQVEVSCSppb2MgPSBoZC0+aW9jOworCWludCBzaXplID0gMDsKKworCWlmIChmdW5jKSB7CisJCS8qIAorCQkgKiB3cml0ZSBpcyBub3Qgc3VwcG9ydGVkIAorCQkgKi8KKwl9IGVsc2UgeworCQlpZiAoc3RhcnQpCisJCQkqc3RhcnQgPSBidWZmZXI7CisKKwkJc2l6ZSA9IG1wdHNjc2loX2hvc3RfaW5mbyhpb2MsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworCX0KKworCXJldHVybiBzaXplOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisjZGVmaW5lIEFERF9JTkRFWF9MT0cocmVxX2VudCkJZG8geyB9IHdoaWxlKDApCisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qKgorICoJbXB0c2NzaWhfcWNtZCAtIFByaW1hcnkgRnVzaW9uIE1QVCBTQ1NJIGluaXRpYXRvciBJTyBzdGFydCByb3V0aW5lLgorICoJQFNDcG50OiBQb2ludGVyIHRvIHNjc2lfY21uZCBzdHJ1Y3R1cmUKKyAqCUBkb25lOiBQb2ludGVyIFNDU0kgbWlkLWxheWVyIElPIGNvbXBsZXRpb24gZnVuY3Rpb24KKyAqCisgKgkobGludXggc2NzaV9ob3N0X3RlbXBsYXRlLnF1ZXVlY29tbWFuZCByb3V0aW5lKQorICoJVGhpcyBpcyB0aGUgcHJpbWFyeSBTQ1NJIElPIHN0YXJ0IHJvdXRpbmUuICBDcmVhdGUgYSBNUEkgU0NTSUlPUmVxdWVzdAorICoJZnJvbSBhIGxpbnV4IHNjc2lfY21uZCByZXF1ZXN0IGFuZCBzZW5kIGl0IHRvIHRoZSBJT0MuCisgKgorICoJUmV0dXJucyAwLiAocnRuIHZhbHVlIGRpc2NhcmRlZCBieSBsaW51eCBzY3NpIG1pZC1sYXllcikKKyAqLworc3RhdGljIGludAorbXB0c2NzaWhfcWNtZChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJTVBUX1NDU0lfSE9TVAkJKmhkOworCU1QVF9GUkFNRV9IRFIJCSptZjsKKwlTQ1NJSU9SZXF1ZXN0X3QJCSpwU2NzaVJlcTsKKwlWaXJ0RGV2aWNlCQkqcFRhcmdldDsKKwlpbnQJIHRhcmdldDsKKwlpbnQJIGx1bjsKKwl1MzIJIGRhdGFsZW47CisJdTMyCSBzY3NpY3RsOworCXUzMgkgc2NzaWRpcjsKKwl1MzIJIGNtZF9sZW47CisJaW50CSBteV9pZHg7CisJaW50CSBpaTsKKworCWhkID0gKE1QVF9TQ1NJX0hPU1QgKikgU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7CisJdGFyZ2V0ID0gU0NwbnQtPmRldmljZS0+aWQ7CisJbHVuID0gU0NwbnQtPmRldmljZS0+bHVuOworCVNDcG50LT5zY3NpX2RvbmUgPSBkb25lOworCisJcFRhcmdldCA9IGhkLT5UYXJnZXRzW3RhcmdldF07CisKKwlkbWZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgInFjbWQ6IFNDcG50PSVwLCBkb25lKCk9JXBcbiIsCisJCQkoaGQgJiYgaGQtPmlvYykgPyBoZC0+aW9jLT5uYW1lIDogImlvYz8iLCBTQ3BudCwgZG9uZSkpOworCisJaWYgKGhkLT5yZXNldFBlbmRpbmcpIHsKKwkJZHRtcHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJxY21kOiBTQ3BudD0lcCB0aW1lb3V0ICsgNjBIWlxuIiwKKwkJCShoZCAmJiBoZC0+aW9jKSA/IGhkLT5pb2MtPm5hbWUgOiAiaW9jPyIsIFNDcG50KSk7CisJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCX0KKworCS8qCisJICogIFB1dCB0b2dldGhlciBhIE1QVCBTQ1NJIHJlcXVlc3QuLi4KKwkgKi8KKwlpZiAoKG1mID0gbXB0X2dldF9tc2dfZnJhbWUoU2NzaURvbmVDdHgsIGhkLT5pb2MpKSA9PSBOVUxMKSB7CisJCWRwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIlF1ZXVlQ21kLCBubyBtc2cgZnJhbWVzISFcbiIsCisJCQkJaGQtPmlvYy0+bmFtZSkpOworCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKKwl9CisKKwlwU2NzaVJlcSA9IChTQ1NJSU9SZXF1ZXN0X3QgKikgbWY7CisKKwlteV9pZHggPSBsZTE2X3RvX2NwdShtZi0+dS5mcmFtZS5od2hkci5tc2djdHh1LmZsZC5yZXFfaWR4KTsKKworCUFERF9JTkRFWF9MT0cobXlfaWR4KTsKKworCS8qICBCVUcgRklYISAgMTk5OTEwMzAgLXNyYWxzdG9uCisJICogICAgVFVSJ3MgYmVpbmcgaXNzdWVkIHdpdGggc2NzaWN0bD0weDAyMDAwMDAwIChEQVRBX0lOKSEKKwkgKiAgICBTZWVtcyB3ZSBtYXkgcmVjZWl2ZSBhIGJ1ZmZlciAoZGF0YWxlbj4wKSBldmVuIHdoZW4gdGhlcmUKKwkgKiAgICB3aWxsIGJlIG5vIGRhdGEgdHJhbnNmZXIhICBHUlJSUlIuLi4KKwkgKi8KKwlpZiAoU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkgeworCQlkYXRhbGVuID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKKwkJc2NzaWRpciA9IE1QSV9TQ1NJSU9fQ09OVFJPTF9SRUFEOwkvKiBEQVRBIElOICAoaG9zdDwtLWlvYzwtLWRldikgKi8KKwl9IGVsc2UgaWYgKFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CisJCWRhdGFsZW4gPSBTQ3BudC0+cmVxdWVzdF9idWZmbGVuOworCQlzY3NpZGlyID0gTVBJX1NDU0lJT19DT05UUk9MX1dSSVRFOwkvKiBEQVRBIE9VVCAoaG9zdC0tPmlvYy0tPmRldikgKi8KKwl9IGVsc2UgeworCQlkYXRhbGVuID0gMDsKKwkJc2NzaWRpciA9IE1QSV9TQ1NJSU9fQ09OVFJPTF9OT0RBVEFUUkFOU0ZFUjsKKwl9CisKKwkvKiBEZWZhdWx0IHRvIHVudGFnZ2VkLiBPbmNlIGEgdGFyZ2V0IHN0cnVjdHVyZSBoYXMgYmVlbiBhbGxvY2F0ZWQsCisJICogdXNlIHRoZSBJbnF1aXJ5IGRhdGEgdG8gZGV0ZXJtaW5lIGlmIGRldmljZSBzdXBwb3J0cyB0YWdnZWQuCisJICovCisJaWYgKCAgIHBUYXJnZXQKKwkgICAgJiYgKHBUYXJnZXQtPnRmbGFncyAmIE1QVF9UQVJHRVRfRkxBR1NfUV9ZRVMpCisJICAgICYmIChTQ3BudC0+ZGV2aWNlLT50YWdnZWRfc3VwcG9ydGVkKSkgeworCQlzY3NpY3RsID0gc2NzaWRpciB8IE1QSV9TQ1NJSU9fQ09OVFJPTF9TSU1QTEVROworCX0gZWxzZSB7CisJCXNjc2ljdGwgPSBzY3NpZGlyIHwgTVBJX1NDU0lJT19DT05UUk9MX1VOVEFHR0VEOworCX0KKworCS8qIFVzZSB0aGUgYWJvdmUgaW5mb3JtYXRpb24gdG8gc2V0IHVwIHRoZSBtZXNzYWdlIGZyYW1lCisJICovCisJcFNjc2lSZXEtPlRhcmdldElEID0gKHU4KSB0YXJnZXQ7CisJcFNjc2lSZXEtPkJ1cyA9ICh1OCkgU0NwbnQtPmRldmljZS0+Y2hhbm5lbDsKKwlwU2NzaVJlcS0+Q2hhaW5PZmZzZXQgPSAwOworCXBTY3NpUmVxLT5GdW5jdGlvbiA9IE1QSV9GVU5DVElPTl9TQ1NJX0lPX1JFUVVFU1Q7CisJcFNjc2lSZXEtPkNEQkxlbmd0aCA9IFNDcG50LT5jbWRfbGVuOworCXBTY3NpUmVxLT5TZW5zZUJ1ZmZlckxlbmd0aCA9IE1QVF9TRU5TRV9CVUZGRVJfU0laRTsKKwlwU2NzaVJlcS0+UmVzZXJ2ZWQgPSAwOworCXBTY3NpUmVxLT5Nc2dGbGFncyA9IG1wdF9tc2dfZmxhZ3MoKTsKKwlwU2NzaVJlcS0+TFVOWzBdID0gMDsKKwlwU2NzaVJlcS0+TFVOWzFdID0gbHVuOworCXBTY3NpUmVxLT5MVU5bMl0gPSAwOworCXBTY3NpUmVxLT5MVU5bM10gPSAwOworCXBTY3NpUmVxLT5MVU5bNF0gPSAwOworCXBTY3NpUmVxLT5MVU5bNV0gPSAwOworCXBTY3NpUmVxLT5MVU5bNl0gPSAwOworCXBTY3NpUmVxLT5MVU5bN10gPSAwOworCXBTY3NpUmVxLT5Db250cm9sID0gY3B1X3RvX2xlMzIoc2NzaWN0bCk7CisKKwkvKgorCSAqICBXcml0ZSBTQ1NJIENEQiBpbnRvIHRoZSBtZXNzYWdlCisJICovCisJY21kX2xlbiA9IFNDcG50LT5jbWRfbGVuOworCWZvciAoaWk9MDsgaWkgPCBjbWRfbGVuOyBpaSsrKQorCQlwU2NzaVJlcS0+Q0RCW2lpXSA9IFNDcG50LT5jbW5kW2lpXTsKKworCWZvciAoaWk9Y21kX2xlbjsgaWkgPCAxNjsgaWkrKykKKwkJcFNjc2lSZXEtPkNEQltpaV0gPSAwOworCisJLyogRGF0YUxlbmd0aCAqLworCXBTY3NpUmVxLT5EYXRhTGVuZ3RoID0gY3B1X3RvX2xlMzIoZGF0YWxlbik7CisKKwkvKiBTZW5zZUJ1ZmZlciBsb3cgYWRkcmVzcyAqLworCXBTY3NpUmVxLT5TZW5zZUJ1ZmZlckxvd0FkZHIgPSBjcHVfdG9fbGUzMihoZC0+aW9jLT5zZW5zZV9idWZfbG93X2RtYQorCQkJCQkgICArIChteV9pZHggKiBNUFRfU0VOU0VfQlVGRkVSX0FMTE9DKSk7CisKKwkvKiBOb3cgYWRkIHRoZSBTRyBsaXN0CisJICogQWx3YXlzIGhhdmUgYSBTR0UgZXZlbiBpZiBudWxsIGxlbmd0aC4KKwkgKi8KKwlpZiAoZGF0YWxlbiA9PSAwKSB7CisJCS8qIEFkZCBhIE5VTEwgU0dFICovCisJCW1wdHNjc2loX2FkZF9zZ2UoKGNoYXIgKikmcFNjc2lSZXEtPlNHTCwgTVBUX1NHRV9GTEFHU19TU0lNUExFX1JFQUQgfCAwLAorCQkJKGRtYV9hZGRyX3QpIC0xKTsKKwl9IGVsc2UgeworCQkvKiBBZGQgYSAzMiBvciA2NCBiaXQgU0dFICovCisJCWlmIChtcHRzY3NpaF9BZGRTR0UoaGQtPmlvYywgU0NwbnQsIHBTY3NpUmVxLCBteV9pZHgpICE9IFNVQ0NFU1MpCisJCQlnb3RvIGZhaWw7CisJfQorCisJaGQtPlNjc2lMb29rdXBbbXlfaWR4XSA9IFNDcG50OworCVNDcG50LT5ob3N0X3NjcmliYmxlID0gTlVMTDsKKworI2lmZGVmIE1QVFNDU0lIX0VOQUJMRV9ET01BSU5fVkFMSURBVElPTgorCWlmIChoZC0+aW9jLT5idXNfdHlwZSA9PSBTQ1NJKSB7CisJCWludCBkdlN0YXR1cyA9IGhkLT5pb2MtPnNwaV9kYXRhLmR2U3RhdHVzW3RhcmdldF07CisJCWludCBpc3N1ZUNtZCA9IDE7CisKKwkJaWYgKGR2U3RhdHVzIHx8IGhkLT5pb2MtPnNwaV9kYXRhLmZvcmNlRHYpIHsKKworCQkJaWYgKChkdlN0YXR1cyAmIE1QVF9TQ1NJQ0ZHX05FRURfRFYpIHx8CisJCQkJKGhkLT5pb2MtPnNwaV9kYXRhLmZvcmNlRHYgJiBNUFRfU0NTSUNGR19ORUVEX0RWKSkgeworCQkJCXVuc2lnbmVkIGxvbmcgbGZsYWdzOworCQkJCS8qIFNjaGVkdWxlIERWIGlmIG5lY2Vzc2FyeSAqLworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZkdnRhc2tRX2xvY2ssIGxmbGFncyk7CisJCQkJaWYgKCFkdnRhc2tRX2FjdGl2ZSkgeworCQkJCQlkdnRhc2tRX2FjdGl2ZSA9IDE7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR2dGFza1FfbG9jaywgbGZsYWdzKTsKKwkJCQkJSU5JVF9XT1JLKCZtcHRzY3NpaF9kdlRhc2ssIG1wdHNjc2loX2RvbWFpblZhbGlkYXRpb24sICh2b2lkICopIGhkKTsKKworCQkJCQlzY2hlZHVsZV93b3JrKCZtcHRzY3NpaF9kdlRhc2spOworCQkJCX0gZWxzZSB7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR2dGFza1FfbG9jaywgbGZsYWdzKTsKKwkJCQl9CisJCQkJaGQtPmlvYy0+c3BpX2RhdGEuZm9yY2VEdiAmPSB+TVBUX1NDU0lDRkdfTkVFRF9EVjsKKwkJCX0KKworCQkJLyogVHJ5aW5nIHRvIGRvIERWIHRvIHRoaXMgdGFyZ2V0LCBleHRlbmQgdGltZW91dC4KKwkJCSAqIFdhaXQgdG8gaXNzdWUgdW50aWwgZmxhZyBpcyBjbGVhcgorCQkJICovCisJCQlpZiAoZHZTdGF0dXMgJiBNUFRfU0NTSUNGR19EVl9QRU5ESU5HKSB7CisJCQkJbW9kX3RpbWVyKCZTQ3BudC0+ZWhfdGltZW91dCwgamlmZmllcyArIDQwICogSFopOworCQkJCWlzc3VlQ21kID0gMDsKKwkJCX0KKworCQkJLyogU2V0IHRoZSBEViBmbGFncy4KKwkJCSAqLworCQkJaWYgKGR2U3RhdHVzICYgTVBUX1NDU0lDRkdfRFZfTk9UX0RPTkUpCisJCQkJbXB0c2NzaWhfc2V0X2R2ZmxhZ3MoaGQsIHBTY3NpUmVxKTsKKworCQkJaWYgKCFpc3N1ZUNtZCkKKwkJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisjZW5kaWYKKworCW1wdF9wdXRfbXNnX2ZyYW1lKFNjc2lEb25lQ3R4LCBoZC0+aW9jLCBtZik7CisJZG1mcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJJc3N1ZWQgU0NTSSBjbWQgKCVwKSBtZj0lcCBpZHg9JWRcbiIsCisJCQloZC0+aW9jLT5uYW1lLCBTQ3BudCwgbWYsIG15X2lkeCkpOworCURCR19EVU1QX1JFUVVFU1RfRlJBTUUobWYpCisJcmV0dXJuIDA7CisKKyBmYWlsOgorCW1wdHNjc2loX2ZyZWVDaGFpbkJ1ZmZlcnMoaGQtPmlvYywgbXlfaWR4KTsKKwltcHRfZnJlZV9tc2dfZnJhbWUoaGQtPmlvYywgbWYpOworCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJbXB0c2NzaWhfZnJlZUNoYWluQnVmZmVycyAtIEZ1bmN0aW9uIHRvIGZyZWUgY2hhaW4gYnVmZmVycyBhc3NvY2lhdGVkCisgKgl3aXRoIGEgU0NTSSBJTyByZXF1ZXN0CisgKglAaGQ6IFBvaW50ZXIgdG8gdGhlIE1QVF9TQ1NJX0hPU1QgaW5zdGFuY2UKKyAqCUByZXFfaWR4OiBJbmRleCBvZiB0aGUgU0NTSSBJTyByZXF1ZXN0IGZyYW1lLgorICoKKyAqCUNhbGxlZCBpZiBTRyBjaGFpbiBidWZmZXIgYWxsb2NhdGlvbiBmYWlscyBhbmQgbXB0c2NzaWggY2FsbGJhY2tzLgorICoJTm8gcmV0dXJuLgorICovCitzdGF0aWMgdm9pZAorbXB0c2NzaWhfZnJlZUNoYWluQnVmZmVycyhNUFRfQURBUFRFUiAqaW9jLCBpbnQgcmVxX2lkeCkKK3sKKwlNUFRfRlJBTUVfSERSICpjaGFpbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjaGFpbl9pZHg7CisJaW50IG5leHQ7CisKKwkvKiBHZXQgdGhlIGZpcnN0IGNoYWluIGluZGV4IGFuZCByZXNldAorCSAqIHRyYWNrZXIgc3RhdGUuCisJICovCisJY2hhaW5faWR4ID0gaW9jLT5SZXFUb0NoYWluW3JlcV9pZHhdOworCWlvYy0+UmVxVG9DaGFpbltyZXFfaWR4XSA9IE1QVF9IT1NUX05PX0NIQUlOOworCisJd2hpbGUgKGNoYWluX2lkeCAhPSBNUFRfSE9TVF9OT19DSEFJTikgeworCisJCS8qIFNhdmUgdGhlIG5leHQgY2hhaW4gYnVmZmVyIGluZGV4ICovCisJCW5leHQgPSBpb2MtPkNoYWluVG9DaGFpbltjaGFpbl9pZHhdOworCisJCS8qIEZyZWUgdGhpcyBjaGFpbiBidWZmZXIgYW5kIHJlc2V0CisJCSAqIHRyYWNrZXIKKwkJICovCisJCWlvYy0+Q2hhaW5Ub0NoYWluW2NoYWluX2lkeF0gPSBNUFRfSE9TVF9OT19DSEFJTjsKKworCQljaGFpbiA9IChNUFRfRlJBTUVfSERSICopIChpb2MtPkNoYWluQnVmZmVyCisJCQkJCSsgKGNoYWluX2lkeCAqIGlvYy0+cmVxX3N6KSk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CisJCWxpc3RfYWRkX3RhaWwoJmNoYWluLT51LmZyYW1lLmxpbmthZ2UubGlzdCwgJmlvYy0+RnJlZUNoYWluUSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CisKKwkJZG1mcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJGcmVlQ2hhaW5CdWZmZXJzIChpbmRleCAlZClcbiIsCisJCQkJaW9jLT5uYW1lLCBjaGFpbl9pZHgpKTsKKworCQkvKiBoYW5kbGUgbmV4dCAqLworCQljaGFpbl9pZHggPSBuZXh0OworCX0KKwlyZXR1cm47Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKglSZXNldCBIYW5kbGluZworICovCisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKgltcHRzY3NpaF9UTUhhbmRsZXIgLSBHZW5lcmljIGhhbmRsZXIgZm9yIFNDU0kgVGFzayBNYW5hZ2VtZW50LgorICoJRmFsbCB0aHJvdWdoIHRvIG1wdF9IYXJkUmVzZXRIYW5kbGVyIGlmOiBub3Qgb3BlcmF0aW9uYWwsIHRvbyBtYW55CisgKglmYWlsZWQgVE0gcmVxdWVzdHMgb3IgaGFuZHNoYWtlIGZhaWx1cmUuCisgKgorICoJQGlvYzogUG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKKyAqCUB0eXBlOiBUYXNrIE1hbmFnZW1lbnQgdHlwZQorICoJQHRhcmdldDogTG9naWNhbCBUYXJnZXQgSUQgZm9yIHJlc2V0IChpZiBhcHByb3ByaWF0ZSkKKyAqCUBsdW46IExvZ2ljYWwgVW5pdCBmb3IgcmVzZXQgKGlmIGFwcHJvcHJpYXRlKQorICoJQGN0eDJhYm9ydDogQ29udGV4dCBmb3IgdGhlIHRhc2sgdG8gYmUgYWJvcnRlZCAoaWYgYXBwcm9wcmlhdGUpCisgKgorICoJUmVtYXJrOiBDdXJyZW50bHkgaW52b2tlZCBmcm9tIGEgbm9uLWludGVycnVwdCB0aHJlYWQgKF9iaCkuCisgKgorICoJUmVtYXJrOiBXaXRoIG9sZCBFSCBjb2RlLCBhdCBtb3N0IDEgU0NTSSBUYXNrTWdtdCBmdW5jdGlvbiBwZXIgSU9DCisgKgl3aWxsIGJlIGFjdGl2ZS4KKyAqCisgKglSZXR1cm5zIDAgZm9yIFNVQ0NFU1Mgb3IgLTEgaWYgRkFJTEVELgorICovCitzdGF0aWMgaW50CittcHRzY3NpaF9UTUhhbmRsZXIoTVBUX1NDU0lfSE9TVCAqaGQsIHU4IHR5cGUsIHU4IGNoYW5uZWwsIHU4IHRhcmdldCwgdTggbHVuLCBpbnQgY3R4MmFib3J0LCB1bG9uZyB0aW1lb3V0KQoreworCU1QVF9BREFQVEVSCSppb2M7CisJaW50CQkgcmMgPSAtMTsKKwlpbnQJCSBkb1Rhc2sgPSAxOworCXUzMgkJIGlvY19yYXdfc3RhdGU7CisJdW5zaWduZWQgbG9uZwkgZmxhZ3M7CisKKwkvKiBJZiBGVyBpcyBiZWluZyByZWxvYWRlZCBjdXJyZW50bHksIHJldHVybiBzdWNjZXNzIHRvCisJICogdGhlIGNhbGxpbmcgZnVuY3Rpb24uCisJICovCisJaWYgKGhkID09IE5VTEwpCisJCXJldHVybiAwOworCisJaW9jID0gaGQtPmlvYzsKKwlpZiAoaW9jID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIE1ZTkFNICIgVE1IYW5kbGVyIiAiIE5VTEwgaW9jIVxuIik7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCWR0bXByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiVE1IYW5kbGVyIEVudGVyZWQhXG4iLCBpb2MtPm5hbWUpKTsKKworCS8vIFNKUiAtIENIRUNLTUUgLSBDYW4gd2UgYXZvaWQgdGhpcyBoZXJlPworCS8vIChtcHRfSGFyZFJlc2V0SGFuZGxlciBoYXMgdGhpcyBjaGVjay4uLikKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5kaWFnTG9jaywgZmxhZ3MpOworCWlmICgoaW9jLT5kaWFnUGVuZGluZykgfHwgKGlvYy0+YWx0X2lvYyAmJiBpb2MtPmFsdF9pb2MtPmRpYWdQZW5kaW5nKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPmRpYWdMb2NrLCBmbGFncyk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+ZGlhZ0xvY2ssIGZsYWdzKTsKKworCS8qICBXYWl0IGEgZml4ZWQgYW1vdW50IG9mIHRpbWUgZm9yIHRoZSBUTSBwZW5kaW5nIGZsYWcgdG8gYmUgY2xlYXJlZC4KKwkgKiAgSWYgd2UgdGltZSBvdXQgYW5kIG5vdCBidXMgcmVzZXQsIHRoZW4gd2UgcmV0dXJuIGEgRkFJTEVEIHN0YXR1cyB0byB0aGUgY2FsbGVyLgorCSAqICBUaGUgY2FsbCB0byBtcHRzY3NpaF90bV9wZW5kaW5nX3dhaXQoKSB3aWxsIHNldCB0aGUgcGVuZGluZyBmbGFnIGlmIHdlIGFyZQorCSAqICBzdWNjZXNzZnVsLiBPdGhlcndpc2UsIHJlbG9hZCB0aGUgRlcuCisJICovCisJaWYgKG1wdHNjc2loX3RtX3BlbmRpbmdfd2FpdChoZCkgPT0gRkFJTEVEKSB7CisJCWlmICh0eXBlID09IE1QSV9TQ1NJVEFTS01HTVRfVEFTS1RZUEVfQUJPUlRfVEFTSykgeworCQkJZHRtcHJpbnRrKChLRVJOX1dBUk5JTkcgTVlOQU0gIjogJXM6IFRNSGFuZGxlciBhYm9ydDogIgorCQkJICAgIlRpbWVkIG91dCB3YWl0aW5nIGZvciBsYXN0IFRNICglZCkgdG8gY29tcGxldGUhIFxuIiwKKwkJCSAgIGhkLT5pb2MtPm5hbWUsIGhkLT50bVBlbmRpbmcpKTsKKwkJCXJldHVybiBGQUlMRUQ7CisJCX0gZWxzZSBpZiAodHlwZSA9PSBNUElfU0NTSVRBU0tNR01UX1RBU0tUWVBFX1RBUkdFVF9SRVNFVCkgeworCQkJZHRtcHJpbnRrKChLRVJOX1dBUk5JTkcgTVlOQU0gIjogJXM6IFRNSGFuZGxlciB0YXJnZXQgcmVzZXQ6ICIKKwkJCSAgICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgbGFzdCBUTSAoJWQpIHRvIGNvbXBsZXRlISBcbiIsCisJCQkgICBoZC0+aW9jLT5uYW1lLCBoZC0+dG1QZW5kaW5nKSk7CisJCQlyZXR1cm4gRkFJTEVEOworCQl9IGVsc2UgaWYgKHR5cGUgPT0gTVBJX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9SRVNFVF9CVVMpIHsKKwkJCWR0bXByaW50aygoS0VSTl9XQVJOSU5HIE1ZTkFNICI6ICVzOiBUTUhhbmRsZXIgYnVzIHJlc2V0OiAiCisJCQkgICAiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGxhc3QgVE0gKCVkKSB0byBjb21wbGV0ZSEgXG4iLAorCQkJICAgaGQtPmlvYy0+bmFtZSwgaGQtPnRtUGVuZGluZykpOworCQkJaWYgKGhkLT50bVBlbmRpbmcgJiAoMSA8PCBNUElfU0NTSVRBU0tNR01UX1RBU0tUWVBFX1JFU0VUX0JVUykpCisJCQkJcmV0dXJuIEZBSUxFRDsKKworCQkJZG9UYXNrID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZoZC0+aW9jLT5GcmVlUWxvY2ssIGZsYWdzKTsKKwkJaGQtPnRtUGVuZGluZyB8PSAgKDEgPDwgdHlwZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhkLT5pb2MtPkZyZWVRbG9jaywgZmxhZ3MpOworCX0KKworCS8qIElzIG9wZXJhdGlvbmFsPworCSAqLworCWlvY19yYXdfc3RhdGUgPSBtcHRfR2V0SW9jU3RhdGUoaGQtPmlvYywgMCk7CisKKyNpZmRlZiBNUFRfREVCVUdfUkVTRVQKKwlpZiAoKGlvY19yYXdfc3RhdGUgJiBNUElfSU9DX1NUQVRFX01BU0spICE9IE1QSV9JT0NfU1RBVEVfT1BFUkFUSU9OQUwpIHsKKwkJcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQKKwkJCSJUTSBIYW5kbGVyOiBJT0MgTm90IG9wZXJhdGlvbmFsKDB4JXgpIVxuIiwKKwkJCWhkLT5pb2MtPm5hbWUsIGlvY19yYXdfc3RhdGUpOworCX0KKyNlbmRpZgorCisJaWYgKGRvVGFzayAmJiAoKGlvY19yYXdfc3RhdGUgJiBNUElfSU9DX1NUQVRFX01BU0spID09IE1QSV9JT0NfU1RBVEVfT1BFUkFUSU9OQUwpCisJCQkJJiYgIShpb2NfcmF3X3N0YXRlICYgTVBJX0RPT1JCRUxMX0FDVElWRSkpIHsKKworCQkvKiBJc3NlIHRoZSBUYXNrIE1nbXQgcmVxdWVzdC4KKwkJICovCisJCWlmIChoZC0+aGFyZF9yZXNldHMgPCAtMSkKKwkJCWhkLT5oYXJkX3Jlc2V0cysrOworCQlyYyA9IG1wdHNjc2loX0lzc3VlVGFza01nbXQoaGQsIHR5cGUsIGNoYW5uZWwsIHRhcmdldCwgbHVuLCBjdHgyYWJvcnQsIHRpbWVvdXQpOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhNWUlPQ19zX0lORk9fRk1UICJJc3N1ZSBvZiBUYXNrTWdtdCBmYWlsZWQhXG4iLCBoZC0+aW9jLT5uYW1lKTsKKwkJfSBlbHNlIHsKKwkJCWR0bXByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiSXNzdWUgb2YgVGFza01nbXQgU3VjY2Vzc2Z1bCFcbiIsIGhkLT5pb2MtPm5hbWUpKTsKKwkJfQorCX0KKworCS8qIE9ubHkgZmFsbCB0aHJvdWdoIHRvIHRoZSBIUkggaWYgdGhpcyBpcyBhIGJ1cyByZXNldAorCSAqLworCWlmICgodHlwZSA9PSBNUElfU0NTSVRBU0tNR01UX1RBU0tUWVBFX1JFU0VUX0JVUykgJiYgKHJjIHx8CisJCWlvYy0+cmVsb2FkX2Z3IHx8IChpb2MtPmFsdF9pb2MgJiYgaW9jLT5hbHRfaW9jLT5yZWxvYWRfZncpKSkgeworCQlkdG1wcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkNhbGxpbmcgSGFyZFJlc2V0ISBcbiIsCisJCQkgaGQtPmlvYy0+bmFtZSkpOworCQlyYyA9IG1wdF9IYXJkUmVzZXRIYW5kbGVyKGhkLT5pb2MsIENBTl9TTEVFUCk7CisJfQorCisJZHRtcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJUTUhhbmRsZXIgcmMgPSAlZCFcbiIsIGhkLT5pb2MtPm5hbWUsIHJjKSk7CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCW1wdHNjc2loX0lzc3VlVGFza01nbXQgLSBHZW5lcmljIHNlbmQgVGFzayBNYW5hZ2VtZW50IGZ1bmN0aW9uLgorICoJQGhkOiBQb2ludGVyIHRvIE1QVF9TQ1NJX0hPU1Qgc3RydWN0dXJlCisgKglAdHlwZTogVGFzayBNYW5hZ2VtZW50IHR5cGUKKyAqCUB0YXJnZXQ6IExvZ2ljYWwgVGFyZ2V0IElEIGZvciByZXNldCAoaWYgYXBwcm9wcmlhdGUpCisgKglAbHVuOiBMb2dpY2FsIFVuaXQgZm9yIHJlc2V0IChpZiBhcHByb3ByaWF0ZSkKKyAqCUBjdHgyYWJvcnQ6IENvbnRleHQgZm9yIHRoZSB0YXNrIHRvIGJlIGFib3J0ZWQgKGlmIGFwcHJvcHJpYXRlKQorICoKKyAqCVJlbWFyazogX0hhcmRSZXNldEhhbmRsZXIgY2FuIGJlIGludm9rZWQgZnJvbSBhbiBpbnRlcnJ1cHQgdGhyZWFkICh0aW1lcikKKyAqCW9yIGEgbm9uLWludGVycnVwdCB0aHJlYWQuICBJbiB0aGUgZm9ybWVyLCBtdXN0IG5vdCBjYWxsIHNjaGVkdWxlKCkuCisgKgorICoJTm90IGFsbCBmaWVsZHMgYXJlIG1lYW5pbmdmdWxsIGZvciBhbGwgdGFzayB0eXBlcy4KKyAqCisgKglSZXR1cm5zIDAgZm9yIFNVQ0NFU1MsIC05OTkgZm9yICJubyBtc2cgZnJhbWVzIiwKKyAqCWVsc2Ugb3RoZXIgbm9uLXplcm8gdmFsdWUgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBpbnQKK21wdHNjc2loX0lzc3VlVGFza01nbXQoTVBUX1NDU0lfSE9TVCAqaGQsIHU4IHR5cGUsIHU4IGNoYW5uZWwsIHU4IHRhcmdldCwgdTggbHVuLCBpbnQgY3R4MmFib3J0LCB1bG9uZyB0aW1lb3V0KQoreworCU1QVF9GUkFNRV9IRFIJKm1mOworCVNDU0lUYXNrTWdtdF90CSpwU2NzaVRtOworCWludAkJIGlpOworCWludAkJIHJldHZhbDsKKworCS8qIFJldHVybiBGYWlsIHRvIGNhbGxpbmcgZnVuY3Rpb24gaWYgbm8gbWVzc2FnZSBmcmFtZXMgYXZhaWxhYmxlLgorCSAqLworCWlmICgobWYgPSBtcHRfZ2V0X21zZ19mcmFtZShTY3NpVGFza0N0eCwgaGQtPmlvYykpID09IE5VTEwpIHsKKwkJZGZhaWxwcmludGsoKE1ZSU9DX3NfRVJSX0ZNVCAiSXNzdWVUYXNrTWdtdCwgbm8gbXNnIGZyYW1lcyEhXG4iLAorCQkJCWhkLT5pb2MtPm5hbWUpKTsKKwkJLy9yZXR1cm4gRkFJTEVEOworCQlyZXR1cm4gLTk5OTsKKwl9CisJZHRtcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJJc3N1ZVRhc2tNZ210IHJlcXVlc3QgQCAlcFxuIiwKKwkJCWhkLT5pb2MtPm5hbWUsIG1mKSk7CisKKwkvKiBGb3JtYXQgdGhlIFJlcXVlc3QKKwkgKi8KKwlwU2NzaVRtID0gKFNDU0lUYXNrTWdtdF90ICopIG1mOworCXBTY3NpVG0tPlRhcmdldElEID0gdGFyZ2V0OworCXBTY3NpVG0tPkJ1cyA9IGNoYW5uZWw7CisJcFNjc2lUbS0+Q2hhaW5PZmZzZXQgPSAwOworCXBTY3NpVG0tPkZ1bmN0aW9uID0gTVBJX0ZVTkNUSU9OX1NDU0lfVEFTS19NR01UOworCisJcFNjc2lUbS0+UmVzZXJ2ZWQgPSAwOworCXBTY3NpVG0tPlRhc2tUeXBlID0gdHlwZTsKKwlwU2NzaVRtLT5SZXNlcnZlZDEgPSAwOworCXBTY3NpVG0tPk1zZ0ZsYWdzID0gKHR5cGUgPT0gTVBJX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9SRVNFVF9CVVMpCisgICAgICAgICAgICAgICAgICAgID8gTVBJX1NDU0lUQVNLTUdNVF9NU0dGTEFHU19MSVBSRVNFVF9SRVNFVF9PUFRJT04gOiAwOworCisJZm9yIChpaT0gMDsgaWkgPCA4OyBpaSsrKSB7CisJCXBTY3NpVG0tPkxVTltpaV0gPSAwOworCX0KKwlwU2NzaVRtLT5MVU5bMV0gPSBsdW47CisKKwlmb3IgKGlpPTA7IGlpIDwgNzsgaWkrKykKKwkJcFNjc2lUbS0+UmVzZXJ2ZWQyW2lpXSA9IDA7CisKKwlwU2NzaVRtLT5UYXNrTXNnQ29udGV4dCA9IGN0eDJhYm9ydDsKKworCWR0bXByaW50aygoTVlJT0Nfc19JTkZPX0ZNVAorCQkiSXNzdWVUYXNrTWdtdDogY3R4MmFib3J0ICgweCUwOHgpIHR5cGU9JWRcbiIsCisJCWhkLT5pb2MtPm5hbWUsIGN0eDJhYm9ydCwgdHlwZSkpOworCisJREJHX0RVTVBfVE1fUkVRVUVTVF9GUkFNRSgodTMyICopcFNjc2lUbSk7CisKKwlpZiAoKHJldHZhbCA9IG1wdF9zZW5kX2hhbmRzaGFrZV9yZXF1ZXN0KFNjc2lUYXNrQ3R4LCBoZC0+aW9jLAorCQlzaXplb2YoU0NTSVRhc2tNZ210X3QpLCAodTMyKilwU2NzaVRtLAorCQlDQU5fU0xFRVApKSAhPSAwKSB7CisJCWRmYWlscHJpbnRrKChNWUlPQ19zX0VSUl9GTVQgIl9zZW5kX2hhbmRzaGFrZSBGQUlMRUQhIgorCQkJIiAoaGQgJXAsIGlvYyAlcCwgbWYgJXApIFxuIiwgaGQtPmlvYy0+bmFtZSwgaGQsCisJCQloZC0+aW9jLCBtZikpOworCQltcHRfZnJlZV9tc2dfZnJhbWUoaGQtPmlvYywgbWYpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWlmKG1wdHNjc2loX3RtX3dhaXRfZm9yX2NvbXBsZXRpb24oaGQsIHRpbWVvdXQpID09IEZBSUxFRCkgeworCQlkZmFpbHByaW50aygoTVlJT0Nfc19FUlJfRk1UICJfd2FpdF9mb3JfY29tcGxldGlvbiBGQUlMRUQhIgorCQkJIiAoaGQgJXAsIGlvYyAlcCwgbWYgJXApIFxuIiwgaGQtPmlvYy0+bmFtZSwgaGQsCisJCQloZC0+aW9jLCBtZikpOworCQltcHRfZnJlZV9tc2dfZnJhbWUoaGQtPmlvYywgbWYpOworCQlkdG1wcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkNhbGxpbmcgSGFyZFJlc2V0ISBcbiIsCisJCQkgaGQtPmlvYy0+bmFtZSkpOworCQlyZXR2YWwgPSBtcHRfSGFyZFJlc2V0SGFuZGxlcihoZC0+aW9jLCBDQU5fU0xFRVApOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qKgorICoJbXB0c2NzaWhfYWJvcnQgLSBBYm9ydCBsaW51eCBzY3NpX2NtbmQgcm91dGluZSwgbmV3X2VoIHZhcmlhbnQKKyAqCUBTQ3BudDogUG9pbnRlciB0byBzY3NpX2NtbmQgc3RydWN0dXJlLCBJTyB0byBiZSBhYm9ydGVkCisgKgorICoJKGxpbnV4IHNjc2lfaG9zdF90ZW1wbGF0ZS5laF9hYm9ydF9oYW5kbGVyIHJvdXRpbmUpCisgKgorICoJUmV0dXJucyBTVUNDRVNTIG9yIEZBSUxFRC4KKyAqLworc3RhdGljIGludAorbXB0c2NzaWhfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KQoreworCU1QVF9TQ1NJX0hPU1QJKmhkOworCU1QVF9BREFQVEVSCSppb2M7CisJTVBUX0ZSQU1FX0hEUgkqbWY7CisJdTMyCQkgY3R4MmFib3J0OworCWludAkJIHNjcG50X2lkeDsKKwlzcGlubG9ja190CSpob3N0X2xvY2sgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2s7CisKKwkvKiBJZiB3ZSBjYW4ndCBsb2NhdGUgb3VyIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUsIHJldHVybiBGQUlMRUQgc3RhdHVzLgorCSAqLworCWlmICgoaGQgPSAoTVBUX1NDU0lfSE9TVCAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSkgPT0gTlVMTCkgeworCQlTQ3BudC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCQlTQ3BudC0+c2NzaV9kb25lKFNDcG50KTsKKwkJZGZhaWxwcmludGsoKEtFUk5fV0FSTklORyBNWU5BTSAiOiBtcHRzY3NpaF9hYm9ydDogIgorCQkJICAgIkNhbid0IGxvY2F0ZSBob3N0ISAoc2M9JXApXG4iLAorCQkJICAgU0NwbnQpKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwlpb2MgPSBoZC0+aW9jOworCWlmIChoZC0+cmVzZXRQZW5kaW5nKQorCQlyZXR1cm4gRkFJTEVEOworCisJcHJpbnRrKEtFUk5fV0FSTklORyBNWU5BTSAiOiAlczogPj4gQXR0ZW1wdGluZyB0YXNrIGFib3J0ISAoc2M9JXApXG4iLAorCSAgICAgICBoZC0+aW9jLT5uYW1lLCBTQ3BudCk7CisKKwlpZiAoaGQtPnRpbWVvdXRzIDwgLTEpCisJCWhkLT50aW1lb3V0cysrOworCisJLyogRmluZCB0aGlzIGNvbW1hbmQKKwkgKi8KKwlpZiAoKHNjcG50X2lkeCA9IFNDUE5UX1RPX0xPT0tVUF9JRFgoU0NwbnQpKSA8IDApIHsKKwkJLyogQ21kIG5vdCBmb3VuZCBpbiBTY3NpTG9va3VwLiAKKwkJICogRG8gT1MgY2FsbGJhY2suCisJCSAqLworCQlTQ3BudC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCQlkdG1wcmludGsoKEtFUk5fV0FSTklORyBNWU5BTSAiOiAlczogbXB0c2NzaWhfYWJvcnQ6ICIKKwkJCSAgICJDb21tYW5kIG5vdCBpbiB0aGUgYWN0aXZlIGxpc3QhIChzYz0lcClcbiIsCisJCQkgICBoZC0+aW9jLT5uYW1lLCBTQ3BudCkpOworCQlyZXR1cm4gU1VDQ0VTUzsKKwl9CisKKwkvKiBNb3N0IGltcG9ydGFudCEgIFNldCBUYXNrTXNnQ29udGV4dCB0byBTQ3BudCdzIE1zZ0NvbnRleHQhCisJICogKHRoZSBJTyB0byBiZSBBQk9SVCdkKQorCSAqCisJICogTk9URTogU2luY2Ugd2UgZG8gbm90IGJ5dGVzd2FwIE1zZ0NvbnRleHQsIHdlIGRvIG5vdAorCSAqCSBzd2FwIGl0IGhlcmUgZWl0aGVyLiAgSXQgaXMgYW4gb3BhcXVlIGNvb2tpZSB0bworCSAqCSB0aGUgY29udHJvbGxlciwgc28gaXQgZG9lcyBub3QgbWF0dGVyLiAtRGF2ZU0KKwkgKi8KKwltZiA9IE1QVF9JTkRFWF8yX01GUFRSKGhkLT5pb2MsIHNjcG50X2lkeCk7CisJY3R4MmFib3J0ID0gbWYtPnUuZnJhbWUuaHdoZHIubXNnY3R4dS5Nc2dDb250ZXh0OworCisJaGQtPmFib3J0U0NwbnQgPSBTQ3BudDsKKworCXNwaW5fdW5sb2NrX2lycShob3N0X2xvY2spOworCWlmIChtcHRzY3NpaF9UTUhhbmRsZXIoaGQsIE1QSV9TQ1NJVEFTS01HTVRfVEFTS1RZUEVfQUJPUlRfVEFTSywKKwkJU0NwbnQtPmRldmljZS0+Y2hhbm5lbCwgU0NwbnQtPmRldmljZS0+aWQsIFNDcG50LT5kZXZpY2UtPmx1biwKKwkJY3R4MmFib3J0LCAyIC8qIDIgc2Vjb25kIHRpbWVvdXQgKi8pCisJCTwgMCkgeworCisJCS8qIFRoZSBUTSByZXF1ZXN0IGZhaWxlZCBhbmQgdGhlIHN1YnNlcXVlbnQgRlctcmVsb2FkIGZhaWxlZCEKKwkJICogRmF0YWwgZXJyb3IgY2FzZS4KKwkJICovCisJCXByaW50ayhNWUlPQ19zX1dBUk5fRk1UICJFcnJvciBpc3N1aW5nIGFib3J0IHRhc2shIChzYz0lcClcbiIsCisJCSAgICAgICBoZC0+aW9jLT5uYW1lLCBTQ3BudCk7CisKKwkJLyogV2UgbXVzdCBjbGVhciBvdXIgcGVuZGluZyBmbGFnIGJlZm9yZSBjbGVhcmluZyBvdXIgc3RhdGUuCisJCSAqLworCQloZC0+dG1QZW5kaW5nID0gMDsKKwkJaGQtPnRtU3RhdGUgPSBUTV9TVEFURV9OT05FOworCisJCXNwaW5fbG9ja19pcnEoaG9zdF9sb2NrKTsKKworCQkvKiBVbm1hcCB0aGUgRE1BIGJ1ZmZlcnMsIGlmIGFueS4gKi8KKwkJaWYgKFNDcG50LT51c2Vfc2cpIHsKKwkJCXBjaV91bm1hcF9zZyhpb2MtPnBjaWRldiwgKHN0cnVjdCBzY2F0dGVybGlzdCAqKSBTQ3BudC0+cmVxdWVzdF9idWZmZXIsCisJCQkJICAgIFNDcG50LT51c2Vfc2csIFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbik7CisJCX0gZWxzZSBpZiAoU0NwbnQtPnJlcXVlc3RfYnVmZmxlbikgeworCQkJcGNpX3VubWFwX3NpbmdsZShpb2MtPnBjaWRldiwgU0NwbnQtPlNDcC5kbWFfaGFuZGxlLAorCQkJCVNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4sIFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbik7CisJCX0KKwkJaGQtPlNjc2lMb29rdXBbc2NwbnRfaWR4XSA9IE5VTEw7CisJCVNDcG50LT5yZXN1bHQgPSBESURfUkVTRVQgPDwgMTY7CisJCVNDcG50LT5zY3NpX2RvbmUoU0NwbnQpOwkJLyogSXNzdWUgdGhlIGNvbW1hbmQgY2FsbGJhY2sgKi8KKwkJbXB0c2NzaWhfZnJlZUNoYWluQnVmZmVycyhpb2MsIHNjcG50X2lkeCk7CisJCW1wdF9mcmVlX21zZ19mcmFtZShpb2MsIG1mKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisJc3Bpbl9sb2NrX2lycShob3N0X2xvY2spOworCXJldHVybiBTVUNDRVNTOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKioKKyAqCW1wdHNjc2loX2Rldl9yZXNldCAtIFBlcmZvcm0gYSBTQ1NJIFRBUkdFVF9SRVNFVCEgIG5ld19laCB2YXJpYW50CisgKglAU0NwbnQ6IFBvaW50ZXIgdG8gc2NzaV9jbW5kIHN0cnVjdHVyZSwgSU8gd2hpY2ggcmVzZXQgaXMgZHVlIHRvCisgKgorICoJKGxpbnV4IHNjc2lfaG9zdF90ZW1wbGF0ZS5laF9kZXZfcmVzZXRfaGFuZGxlciByb3V0aW5lKQorICoKKyAqCVJldHVybnMgU1VDQ0VTUyBvciBGQUlMRUQuCisgKi8KK3N0YXRpYyBpbnQKK21wdHNjc2loX2Rldl9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICogU0NwbnQpCit7CisJTVBUX1NDU0lfSE9TVAkqaGQ7CisJc3BpbmxvY2tfdAkqaG9zdF9sb2NrID0gU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrOworCisJLyogSWYgd2UgY2FuJ3QgbG9jYXRlIG91ciBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLCByZXR1cm4gRkFJTEVEIHN0YXR1cy4KKwkgKi8KKwlpZiAoKGhkID0gKE1QVF9TQ1NJX0hPU1QgKikgU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGEpID09IE5VTEwpeworCQlkdG1wcmludGsoKEtFUk5fV0FSTklORyBNWU5BTSAiOiBtcHRzY3NpaF9kZXZfcmVzZXQ6ICIKKwkJCSAgICJDYW4ndCBsb2NhdGUgaG9zdCEgKHNjPSVwKVxuIiwKKwkJCSAgIFNDcG50KSk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJaWYgKGhkLT5yZXNldFBlbmRpbmcpCisJCXJldHVybiBGQUlMRUQ7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HIE1ZTkFNICI6ICVzOiA+PiBBdHRlbXB0aW5nIHRhcmdldCByZXNldCEgKHNjPSVwKVxuIiwKKwkgICAgICAgaGQtPmlvYy0+bmFtZSwgU0NwbnQpOworCisJc3Bpbl91bmxvY2tfaXJxKGhvc3RfbG9jayk7CisJaWYgKG1wdHNjc2loX1RNSGFuZGxlcihoZCwgTVBJX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9UQVJHRVRfUkVTRVQsCisJCVNDcG50LT5kZXZpY2UtPmNoYW5uZWwsIFNDcG50LT5kZXZpY2UtPmlkLAorCQkwLCAwLCA1IC8qIDUgc2Vjb25kIHRpbWVvdXQgKi8pCisJCTwgMCl7CisJCS8qIFRoZSBUTSByZXF1ZXN0IGZhaWxlZCBhbmQgdGhlIHN1YnNlcXVlbnQgRlctcmVsb2FkIGZhaWxlZCEKKwkJICogRmF0YWwgZXJyb3IgY2FzZS4KKwkJICovCisJCXByaW50ayhNWUlPQ19zX1dBUk5fRk1UICJFcnJvciBwcm9jZXNzaW5nIFRhc2tNZ210IHJlcXVlc3QgKHNjPSVwKVxuIiwKKwkJIAkJaGQtPmlvYy0+bmFtZSwgU0NwbnQpOworCQloZC0+dG1QZW5kaW5nID0gMDsKKwkJaGQtPnRtU3RhdGUgPSBUTV9TVEFURV9OT05FOworCQlzcGluX2xvY2tfaXJxKGhvc3RfbG9jayk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCXNwaW5fbG9ja19pcnEoaG9zdF9sb2NrKTsKKwlyZXR1cm4gU1VDQ0VTUzsKKworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKioKKyAqCW1wdHNjc2loX2J1c19yZXNldCAtIFBlcmZvcm0gYSBTQ1NJIEJVU19SRVNFVCEJbmV3X2VoIHZhcmlhbnQKKyAqCUBTQ3BudDogUG9pbnRlciB0byBzY3NpX2NtbmQgc3RydWN0dXJlLCBJTyB3aGljaCByZXNldCBpcyBkdWUgdG8KKyAqCisgKgkobGludXggc2NzaV9ob3N0X3RlbXBsYXRlLmVoX2J1c19yZXNldF9oYW5kbGVyIHJvdXRpbmUpCisgKgorICoJUmV0dXJucyBTVUNDRVNTIG9yIEZBSUxFRC4KKyAqLworc3RhdGljIGludAorbXB0c2NzaWhfYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKiBTQ3BudCkKK3sKKwlNUFRfU0NTSV9IT1NUCSpoZDsKKwlzcGlubG9ja190CSpob3N0X2xvY2sgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2s7CisKKwkvKiBJZiB3ZSBjYW4ndCBsb2NhdGUgb3VyIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUsIHJldHVybiBGQUlMRUQgc3RhdHVzLgorCSAqLworCWlmICgoaGQgPSAoTVBUX1NDU0lfSE9TVCAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSkgPT0gTlVMTCl7CisJCWR0bXByaW50aygoS0VSTl9XQVJOSU5HIE1ZTkFNICI6IG1wdHNjc2loX2J1c19yZXNldDogIgorCQkJICAgIkNhbid0IGxvY2F0ZSBob3N0ISAoc2M9JXApXG4iLAorCQkJICAgU0NwbnQgKSApOworCQlyZXR1cm4gRkFJTEVEOworCX0KKworCXByaW50ayhLRVJOX1dBUk5JTkcgTVlOQU0gIjogJXM6ID4+IEF0dGVtcHRpbmcgYnVzIHJlc2V0ISAoc2M9JXApXG4iLAorCSAgICAgICBoZC0+aW9jLT5uYW1lLCBTQ3BudCk7CisKKwlpZiAoaGQtPnRpbWVvdXRzIDwgLTEpCisJCWhkLT50aW1lb3V0cysrOworCisJLyogV2UgYXJlIG5vdyByZWFkeSB0byBleGVjdXRlIHRoZSB0YXNrIG1hbmFnZW1lbnQgcmVxdWVzdC4gKi8KKwlzcGluX3VubG9ja19pcnEoaG9zdF9sb2NrKTsKKwlpZiAobXB0c2NzaWhfVE1IYW5kbGVyKGhkLCBNUElfU0NTSVRBU0tNR01UX1RBU0tUWVBFX1JFU0VUX0JVUywKKwkJU0NwbnQtPmRldmljZS0+Y2hhbm5lbCwgMCwgMCwgMCwgNSAvKiA1IHNlY29uZCB0aW1lb3V0ICovKQorCSAgICA8IDApeworCisJCS8qIFRoZSBUTSByZXF1ZXN0IGZhaWxlZCBhbmQgdGhlIHN1YnNlcXVlbnQgRlctcmVsb2FkIGZhaWxlZCEKKwkJICogRmF0YWwgZXJyb3IgY2FzZS4KKwkJICovCisJCXByaW50ayhNWUlPQ19zX1dBUk5fRk1UCisJCSAgICAgICAiRXJyb3IgcHJvY2Vzc2luZyBUYXNrTWdtdCByZXF1ZXN0IChzYz0lcClcbiIsCisJCSAgICAgICBoZC0+aW9jLT5uYW1lLCBTQ3BudCk7CisJCWhkLT50bVBlbmRpbmcgPSAwOworCQloZC0+dG1TdGF0ZSA9IFRNX1NUQVRFX05PTkU7CisJCXNwaW5fbG9ja19pcnEoaG9zdF9sb2NrKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisJc3Bpbl9sb2NrX2lycShob3N0X2xvY2spOworCXJldHVybiBTVUNDRVNTOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKioKKyAqCW1wdHNjc2loX2hvc3RfcmVzZXQgLSBQZXJmb3JtIGEgU0NTSSBob3N0IGFkYXB0ZXIgUkVTRVQhCisgKgluZXdfZWggdmFyaWFudAorICoJQFNDcG50OiBQb2ludGVyIHRvIHNjc2lfY21uZCBzdHJ1Y3R1cmUsIElPIHdoaWNoIHJlc2V0IGlzIGR1ZSB0bworICoKKyAqCShsaW51eCBzY3NpX2hvc3RfdGVtcGxhdGUuZWhfaG9zdF9yZXNldF9oYW5kbGVyIHJvdXRpbmUpCisgKgorICoJUmV0dXJucyBTVUNDRVNTIG9yIEZBSUxFRC4KKyAqLworc3RhdGljIGludAorbXB0c2NzaWhfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKK3sKKwlNUFRfU0NTSV9IT1NUICogIGhkOworCWludCAgICAgICAgICAgICAgc3RhdHVzID0gU1VDQ0VTUzsKKwlzcGlubG9ja190CSpob3N0X2xvY2sgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0X2xvY2s7CisKKwkvKiAgSWYgd2UgY2FuJ3QgbG9jYXRlIHRoZSBob3N0IHRvIHJlc2V0LCB0aGVuIHdlIGZhaWxlZC4gKi8KKwlpZiAoKGhkID0gKE1QVF9TQ1NJX0hPU1QgKikgU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGEpID09IE5VTEwpeworCQlkdG1wcmludGsoICggS0VSTl9XQVJOSU5HIE1ZTkFNICI6IG1wdHNjc2loX2hvc3RfcmVzZXQ6ICIKKwkJCSAgICAgIkNhbid0IGxvY2F0ZSBob3N0ISAoc2M9JXApXG4iLAorCQkJICAgICBTQ3BudCApICk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJcHJpbnRrKEtFUk5fV0FSTklORyBNWU5BTSAiOiAlczogPj4gQXR0ZW1wdGluZyBob3N0IHJlc2V0ISAoc2M9JXApXG4iLAorCSAgICAgICBoZC0+aW9jLT5uYW1lLCBTQ3BudCk7CisKKwkvKiAgSWYgb3VyIGF0dGVtcHRzIHRvIHJlc2V0IHRoZSBob3N0IGZhaWxlZCwgdGhlbiByZXR1cm4gYSBmYWlsZWQKKwkgKiAgc3RhdHVzLiAgVGhlIGhvc3Qgd2lsbCBiZSB0YWtlbiBvZmYgbGluZSBieSB0aGUgU0NTSSBtaWQtbGF5ZXIuCisJICovCisJc3Bpbl91bmxvY2tfaXJxKGhvc3RfbG9jayk7CisJaWYgKG1wdF9IYXJkUmVzZXRIYW5kbGVyKGhkLT5pb2MsIENBTl9TTEVFUCkgPCAwKXsKKwkJc3RhdHVzID0gRkFJTEVEOworCX0gZWxzZSB7CisJCS8qICBNYWtlIHN1cmUgVE0gcGVuZGluZyBpcyBjbGVhcmVkIGFuZCBUTSBzdGF0ZSBpcyBzZXQgdG8KKwkJICogIE5PTkUuCisJCSAqLworCQloZC0+dG1QZW5kaW5nID0gMDsKKwkJaGQtPnRtU3RhdGUgPSBUTV9TVEFURV9OT05FOworCX0KKwlzcGluX2xvY2tfaXJxKGhvc3RfbG9jayk7CisKKworCWR0bXByaW50ayggKCBLRVJOX1dBUk5JTkcgTVlOQU0gIjogbXB0c2NzaWhfaG9zdF9yZXNldDogIgorCQkgICAgICJTdGF0dXMgPSAlc1xuIiwKKwkJICAgICAoc3RhdHVzID09IFNVQ0NFU1MpID8gIlNVQ0NFU1MiIDogIkZBSUxFRCIgKSApOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoqCisgKgltcHRzY3NpaF90bV9wZW5kaW5nX3dhaXQgLSB3YWl0IGZvciBwZW5kaW5nIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0IHRvCisgKgkJY29tcGxldGUuCisgKglAaGQ6IFBvaW50ZXIgdG8gTVBUIGhvc3Qgc3RydWN0dXJlLgorICoKKyAqCVJldHVybnMge1NVQ0NFU1MsRkFJTEVEfS4KKyAqLworc3RhdGljIGludAorbXB0c2NzaWhfdG1fcGVuZGluZ193YWl0KE1QVF9TQ1NJX0hPU1QgKiBoZCkKK3sKKwl1bnNpZ25lZCBsb25nICBmbGFnczsKKwlpbnQgICAgICAgICAgICBsb29wX2NvdW50ID0gNCAqIDEwOyAgLyogV2FpdCAxMCBzZWNvbmRzICovCisJaW50ICAgICAgICAgICAgc3RhdHVzID0gRkFJTEVEOworCisJZG8geworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGQtPmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CisJCWlmIChoZC0+dG1TdGF0ZSA9PSBUTV9TVEFURV9OT05FKSB7CisJCQloZC0+dG1TdGF0ZSA9IFRNX1NUQVRFX0lOX1BST0dSRVNTOworCQkJaGQtPnRtUGVuZGluZyA9IDE7CisJCQlzdGF0dXMgPSBTVUNDRVNTOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGQtPmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CisJCQlicmVhazsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoZC0+aW9jLT5GcmVlUWxvY2ssIGZsYWdzKTsKKwkJbXNsZWVwKDI1MCk7CisJfSB3aGlsZSAoLS1sb29wX2NvdW50KTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qKgorICoJbXB0c2NzaWhfdG1fd2FpdF9mb3JfY29tcGxldGlvbiAtIHdhaXQgZm9yIGNvbXBsZXRpb24gb2YgVE0gdGFzaworICoJQGhkOiBQb2ludGVyIHRvIE1QVCBob3N0IHN0cnVjdHVyZS4KKyAqCisgKglSZXR1cm5zIHtTVUNDRVNTLEZBSUxFRH0uCisgKi8KK3N0YXRpYyBpbnQKK21wdHNjc2loX3RtX3dhaXRfZm9yX2NvbXBsZXRpb24oTVBUX1NDU0lfSE9TVCAqIGhkLCB1bG9uZyB0aW1lb3V0ICkKK3sKKwl1bnNpZ25lZCBsb25nICBmbGFnczsKKwlpbnQgICAgICAgICAgICBsb29wX2NvdW50ID0gNCAqIHRpbWVvdXQ7CisJaW50ICAgICAgICAgICAgc3RhdHVzID0gRkFJTEVEOworCisJZG8geworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGQtPmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CisJCWlmKGhkLT50bVBlbmRpbmcgPT0gMCkgeworCQkJc3RhdHVzID0gU1VDQ0VTUzsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhkLT5pb2MtPkZyZWVRbG9jaywgZmxhZ3MpOworCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGQtPmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDI1MCk7CisJfSB3aGlsZSAoLS1sb29wX2NvdW50KTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qKgorICoJbXB0c2NzaWhfdGFza21nbXRfY29tcGxldGUgLSBSZWdpc3RlcmVkIHdpdGggRnVzaW9uIE1QVCBiYXNlIGRyaXZlcgorICoJQGlvYzogUG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKKyAqCUBtZjogUG9pbnRlciB0byBTQ1NJIHRhc2sgbWdtdCByZXF1ZXN0IGZyYW1lCisgKglAbXI6IFBvaW50ZXIgdG8gU0NTSSB0YXNrIG1nbXQgcmVwbHkgZnJhbWUKKyAqCisgKglUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gbXB0YmFzZS5jOjptcHRfaW50ZXJydXB0KCkgYXQgdGhlIGNvbXBsZXRpb24KKyAqCW9mIGFueSBTQ1NJIHRhc2sgbWFuYWdlbWVudCByZXF1ZXN0LgorICoJVGhpcyByb3V0aW5lIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgTVBUIChiYXNlKSBkcml2ZXIgYXQgZHJpdmVyCisgKglsb2FkL2luaXQgdGltZSB2aWEgdGhlIG1wdF9yZWdpc3RlcigpIEFQSSBjYWxsLgorICoKKyAqCVJldHVybnMgMSBpbmRpY2F0aW5nIGFsbG9jJ2QgcmVxdWVzdCBmcmFtZSBwdHIgc2hvdWxkIGJlIGZyZWVkLgorICovCitzdGF0aWMgaW50CittcHRzY3NpaF90YXNrbWdtdF9jb21wbGV0ZShNUFRfQURBUFRFUiAqaW9jLCBNUFRfRlJBTUVfSERSICptZiwgTVBUX0ZSQU1FX0hEUiAqbXIpCit7CisJU0NTSVRhc2tNZ210UmVwbHlfdAkqcFNjc2lUbVJlcGx5OworCVNDU0lUYXNrTWdtdF90CQkqcFNjc2lUbVJlcTsKKwlNUFRfU0NTSV9IT1NUCQkqaGQ7CisJdW5zaWduZWQgbG9uZwkJIGZsYWdzOworCXUxNgkJCSBpb2NzdGF0dXM7CisJdTgJCQkgdG1UeXBlOworCisJZHRtcHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJUYXNrTWdtdCBjb21wbGV0ZWQgKG1mPSVwLG1yPSVwKVxuIiwKKwkJCWlvYy0+bmFtZSwgbWYsIG1yKSk7CisJaWYgKGlvYy0+c2gpIHsKKwkJLyogRGVwZW5kaW5nIG9uIHRoZSB0aHJlYWQsIGEgdGltZXIgaXMgYWN0aXZhdGVkIGZvcgorCQkgKiB0aGUgVE0gcmVxdWVzdC4gIERlbGV0ZSB0aGlzIHRpbWVyIG9uIGNvbXBsZXRpb24gb2YgVE0uCisJCSAqIERlY3JlbWVudCBjb3VudCBvZiBvdXRzdGFuZGluZyBUTSByZXF1ZXN0cy4KKwkJICovCisJCWhkID0gKE1QVF9TQ1NJX0hPU1QgKilpb2MtPnNoLT5ob3N0ZGF0YTsKKwl9IGVsc2UgeworCQlkdG1wcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIlRhc2tNZ210IENvbXBsZXRlOiBOVUxMIFNjc2kgSG9zdCBQdHJcbiIsCisJCQlpb2MtPm5hbWUpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKG1yID09IE5VTEwpIHsKKwkJZHRtcHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJFUlJPUiEgVGFza01nbXQgUmVwbHk6IE5VTEwgUmVxdWVzdCAlcFxuIiwKKwkJCWlvYy0+bmFtZSwgbWYpKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJcFNjc2lUbVJlcGx5ID0gKFNDU0lUYXNrTWdtdFJlcGx5X3QqKW1yOworCQlwU2NzaVRtUmVxID0gKFNDU0lUYXNrTWdtdF90KiltZjsKKworCQkvKiBGaWd1cmUgb3V0IGlmIHRoaXMgd2FzIEFCT1JUX1RBU0ssIFRBUkdFVF9SRVNFVCwgb3IgQlVTX1JFU0VUISAqLworCQl0bVR5cGUgPSBwU2NzaVRtUmVxLT5UYXNrVHlwZTsKKworCQlkdG1wcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIiAgVGFza1R5cGUgPSAlZCwgVGVybWluYXRpb25Db3VudD0lZFxuIiwKKwkJCQlpb2MtPm5hbWUsIHRtVHlwZSwgbGUzMl90b19jcHUocFNjc2lUbVJlcGx5LT5UZXJtaW5hdGlvbkNvdW50KSkpOworCQlEQkdfRFVNUF9UTV9SRVBMWV9GUkFNRSgodTMyICopcFNjc2lUbVJlcGx5KTsKKworCQlpb2NzdGF0dXMgPSBsZTE2X3RvX2NwdShwU2NzaVRtUmVwbHktPklPQ1N0YXR1cykgJiBNUElfSU9DU1RBVFVTX01BU0s7CisJCWR0bXByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiICBTQ1NJIFRhc2tNZ210ICglZCkgSU9DU3RhdHVzPSUwNHggSU9DTG9nSW5mbz0lMDh4XG4iLAorCQkJaW9jLT5uYW1lLCB0bVR5cGUsIGlvY3N0YXR1cywgbGUzMl90b19jcHUocFNjc2lUbVJlcGx5LT5JT0NMb2dJbmZvKSkpOworCQkvKiBFcnJvcj8gIChhbnl0aGluZyBub24temVybz8pICovCisJCWlmIChpb2NzdGF0dXMpIHsKKworCQkJLyogY2xlYXIgZmxhZ3MgYW5kIGNvbnRpbnVlLgorCQkJICovCisJCQlpZiAodG1UeXBlID09IE1QSV9TQ1NJVEFTS01HTVRfVEFTS1RZUEVfQUJPUlRfVEFTSykKKwkJCQloZC0+YWJvcnRTQ3BudCA9IE5VTEw7CisKKwkJCS8qIElmIGFuIGludGVybmFsIGNvbW1hbmQgaXMgcHJlc2VudAorCQkJICogb3IgdGhlIFRNIGZhaWxlZCAtIHJlbG9hZCB0aGUgRlcuCisJCQkgKiBGQyBGVyBtYXkgcmVzcG9uZCBGQUlMRUQgdG8gYW4gQUJPUlQKKwkJCSAqLworCQkJaWYgKHRtVHlwZSA9PSBNUElfU0NTSVRBU0tNR01UX1RBU0tUWVBFX1JFU0VUX0JVUykgeworCQkJCWlmICgoaGQtPmNtZFB0cikgfHwKKwkJCQkgICAgKGlvY3N0YXR1cyA9PSBNUElfSU9DU1RBVFVTX1NDU0lfVEFTS19NR01UX0ZBSUxFRCkpIHsKKwkJCQkJaWYgKG1wdF9IYXJkUmVzZXRIYW5kbGVyKGlvYywgTk9fU0xFRVApIDwgMCkgeworCQkJCQkJcHJpbnRrKChLRVJOX1dBUk5JTkcKKwkJCQkJCQkiIEZpcm13YXJlIFJlbG9hZCBGQUlMRUQhIVxuIikpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJZHRtcHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICIgVGFza01nbXQgU1VDQ0VTU1xuIiwgaW9jLT5uYW1lKSk7CisKKwkJCWhkLT5hYm9ydFNDcG50ID0gTlVMTDsKKworCQl9CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+RnJlZVFsb2NrLCBmbGFncyk7CisJaGQtPnRtUGVuZGluZyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5GcmVlUWxvY2ssIGZsYWdzKTsKKwloZC0+dG1TdGF0ZSA9IFRNX1NUQVRFX05PTkU7CisKKwlyZXR1cm4gMTsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCVRoaXMgaXMgYW55b25lcyBndWVzcyBxdWl0ZSBmcmFua2x5LgorICovCitzdGF0aWMgaW50CittcHRzY3NpaF9iaW9zX3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqIHNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCXNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgZ2VvbVtdKQoreworCWludAkJaGVhZHM7CisJaW50CQlzZWN0b3JzOworCXNlY3Rvcl90CWN5bGluZGVyczsKKwl1bG9uZyAJCWR1bW15OworCisJaGVhZHMgPSA2NDsKKwlzZWN0b3JzID0gMzI7CisKKwlkdW1teSA9IGhlYWRzICogc2VjdG9yczsKKwljeWxpbmRlcnMgPSBjYXBhY2l0eTsKKwlzZWN0b3JfZGl2KGN5bGluZGVycyxkdW1teSk7CisKKwkvKgorCSAqIEhhbmRsZSBleHRlbmRlZCB0cmFuc2xhdGlvbiBzaXplIGZvciBsb2dpY2FsIGRyaXZlcworCSAqID4gMUdiCisJICovCisJaWYgKCh1bG9uZyljYXBhY2l0eSA+PSAweDIwMDAwMCkgeworCQloZWFkcyA9IDI1NTsKKwkJc2VjdG9ycyA9IDYzOworCQlkdW1teSA9IGhlYWRzICogc2VjdG9yczsKKwkJY3lsaW5kZXJzID0gY2FwYWNpdHk7CisJCXNlY3Rvcl9kaXYoY3lsaW5kZXJzLGR1bW15KTsKKwl9CisKKwkvKiByZXR1cm4gcmVzdWx0ICovCisJZ2VvbVswXSA9IGhlYWRzOworCWdlb21bMV0gPSBzZWN0b3JzOworCWdlb21bMl0gPSBjeWxpbmRlcnM7CisKKwlkcHJpbnRrKChLRVJOX05PVElDRQorCQkiOiBiaW9zX3BhcmFtOiBJZD0laSBMdW49JWkgQ2hhbm5lbD0laSBDSFM9JWkvJWkvJWlcbiIsCisJCXNkZXYtPmlkLCBzZGV2LT5sdW4sc2Rldi0+Y2hhbm5lbCwoaW50KWN5bGluZGVycyxoZWFkcyxzZWN0b3JzKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCU9TIGVudHJ5IHBvaW50IHRvIGFsbG93IGhvc3QgZHJpdmVyIHRvIGFsbG9jIG1lbW9yeQorICoJZm9yIGVhY2ggc2NzaSBkZXZpY2UuIENhbGxlZCBvbmNlIHBlciBkZXZpY2UgdGhlIGJ1cyBzY2FuLgorICoJUmV0dXJuIG5vbi16ZXJvIGlmIGFsbG9jYXRpb24gZmFpbHMuCisgKglJbml0IG1lbW9yeSBvbmNlIHBlciBpZCAobm90IExVTikuCisgKi8KK3N0YXRpYyBpbnQKK21wdHNjc2loX3NsYXZlX2FsbG9jKHN0cnVjdCBzY3NpX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBTY3NpX0hvc3QJKmhvc3QgPSBkZXZpY2UtPmhvc3Q7CisJTVBUX1NDU0lfSE9TVAkJKmhkID0gKE1QVF9TQ1NJX0hPU1QgKilob3N0LT5ob3N0ZGF0YTsKKwlWaXJ0RGV2aWNlCQkqdmRldjsKKwl1aW50CQkJdGFyZ2V0ID0gZGV2aWNlLT5pZDsKKworCWlmIChoZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICgodmRldiA9IGhkLT5UYXJnZXRzW3RhcmdldF0pICE9IE5VTEwpCisJCWdvdG8gb3V0OworCisJdmRldiA9IGttYWxsb2Moc2l6ZW9mKFZpcnREZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZkZXYpIHsKKwkJcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVCAic2xhdmVfYWxsb2Mga21hbGxvYyglemQpIEZBSUxFRCFcbiIsCisJCQkJaGQtPmlvYy0+bmFtZSwgc2l6ZW9mKFZpcnREZXZpY2UpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KHZkZXYsIDAsIHNpemVvZihWaXJ0RGV2aWNlKSk7CisJdmRldi0+dGZsYWdzID0gTVBUX1RBUkdFVF9GTEFHU19RX1lFUzsKKwl2ZGV2LT5pb2NfaWQgPSBoZC0+aW9jLT5pZDsKKwl2ZGV2LT50YXJnZXRfaWQgPSBkZXZpY2UtPmlkOworCXZkZXYtPmJ1c19pZCA9IGRldmljZS0+Y2hhbm5lbDsKKwl2ZGV2LT5yYWlkVm9sdW1lID0gMDsKKwloZC0+VGFyZ2V0c1tkZXZpY2UtPmlkXSA9IHZkZXY7CisJaWYgKGhkLT5pb2MtPmJ1c190eXBlID09IFNDU0kpIHsKKwkJaWYgKGhkLT5pb2MtPnNwaV9kYXRhLmlzUmFpZCAmICgxIDw8IGRldmljZS0+aWQpKSB7CisJCQl2ZGV2LT5yYWlkVm9sdW1lID0gMTsKKwkJCWRkdnRwcmludGsoKEtFUk5fSU5GTworCQkJICAgICJSQUlEIFZvbHVtZSBAIGlkICVkXG4iLCBkZXZpY2UtPmlkKSk7CisJCX0KKwl9IGVsc2UgeworCQl2ZGV2LT50ZmxhZ3MgfD0gTVBUX1RBUkdFVF9GTEFHU19WQUxJRF9JTlFVSVJZOworCX0KKworIG91dDoKKwl2ZGV2LT5udW1fbHVucysrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wdHNjc2loX2lzX3JhaWRfdm9sdW1lKE1QVF9TQ1NJX0hPU1QgKmhkLCB1aW50IGlkKQoreworCWludCBpOworCisJaWYgKCFoZC0+aW9jLT5zcGlfZGF0YS5pc1JhaWQgfHwgIWhkLT5pb2MtPnNwaV9kYXRhLnBJb2NQZzMpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGhkLT5pb2MtPnNwaV9kYXRhLnBJb2NQZzMtPk51bVBoeXNEaXNrczsgaSsrKSB7CisJCWlmIChpZCA9PSBoZC0+aW9jLT5zcGlfZGF0YS5wSW9jUGczLT5QaHlzRGlza1tpXS5QaHlzRGlza0lEKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglPUyBlbnRyeSBwb2ludCB0byBhbGxvdyBmb3IgaG9zdCBkcml2ZXIgdG8gZnJlZSBhbGxvY2F0ZWQgbWVtb3J5CisgKglDYWxsZWQgaWYgbm8gZGV2aWNlIHByZXNlbnQgb3IgZGV2aWNlIGJlaW5nIHVubG9hZGVkCisgKi8KK3N0YXRpYyB2b2lkCittcHRzY3NpaF9zbGF2ZV9kZXN0cm95KHN0cnVjdCBzY3NpX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBTY3NpX0hvc3QJKmhvc3QgPSBkZXZpY2UtPmhvc3Q7CisJTVBUX1NDU0lfSE9TVAkJKmhkID0gKE1QVF9TQ1NJX0hPU1QgKilob3N0LT5ob3N0ZGF0YTsKKwlWaXJ0RGV2aWNlCQkqdmRldjsKKwl1aW50CQkJdGFyZ2V0ID0gZGV2aWNlLT5pZDsKKwl1aW50CQkJbHVuID0gZGV2aWNlLT5sdW47CisKKwlpZiAoaGQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJbXB0c2NzaWhfc2VhcmNoX3J1bm5pbmdfY21kcyhoZCwgdGFyZ2V0LCBsdW4pOworCisJdmRldiA9IGhkLT5UYXJnZXRzW3RhcmdldF07CisJdmRldi0+bHVuc1swXSAmPSB+KDEgPDwgbHVuKTsKKwlpZiAoLS12ZGV2LT5udW1fbHVucykKKwkJcmV0dXJuOworCisJa2ZyZWUoaGQtPlRhcmdldHNbdGFyZ2V0XSk7CisJaGQtPlRhcmdldHNbdGFyZ2V0XSA9IE5VTEw7CisJCisJaWYgKGhkLT5pb2MtPmJ1c190eXBlID09IFNDU0kpIHsKKwkJaWYgKG1wdHNjc2loX2lzX3JhaWRfdm9sdW1lKGhkLCB0YXJnZXQpKSB7CisJCQloZC0+aW9jLT5zcGlfZGF0YS5mb3JjZUR2IHw9IE1QVF9TQ1NJQ0ZHX1JFTE9BRF9JT0NfUEczOworCQl9IGVsc2UgeworCQkJaGQtPmlvYy0+c3BpX2RhdGEuZHZTdGF0dXNbdGFyZ2V0XSA9CisJCQkJTVBUX1NDU0lDRkdfTkVHT1RJQVRFOworCisJCQlpZiAoIWhkLT5uZWdvTnZyYW0pIHsKKwkJCQloZC0+aW9jLT5zcGlfZGF0YS5kdlN0YXR1c1t0YXJnZXRdIHw9CisJCQkJCU1QVF9TQ1NJQ0ZHX0RWX05PVF9ET05FOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorbXB0c2NzaWhfc2V0X3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqZGV2aWNlLCBNUFRfU0NTSV9IT1NUICpoZCwKKwlWaXJ0RGV2aWNlICpwVGFyZ2V0LCBpbnQgcWRlcHRoKQoreworCWludAltYXhfZGVwdGg7CisJaW50CXRhZ2dlZDsKKworCWlmIChoZC0+aW9jLT5idXNfdHlwZSA9PSBTQ1NJKSB7CisJCWlmIChwVGFyZ2V0LT50ZmxhZ3MgJiBNUFRfVEFSR0VUX0ZMQUdTX1ZBTElEX0lOUVVJUlkpIHsKKwkJCWlmICghKHBUYXJnZXQtPnRmbGFncyAmIE1QVF9UQVJHRVRfRkxBR1NfUV9ZRVMpKQorCQkJCW1heF9kZXB0aCA9IDE7CisJCQllbHNlIGlmICgoKHBUYXJnZXQtPmlucV9kYXRhWzBdICYgMHgxZikgPT0gMHgwMCkgJiYKKwkJCSAgICAgICAgIChwVGFyZ2V0LT5taW5TeW5jRmFjdG9yIDw9IE1QVF9VTFRSQTE2MCApKQorCQkJCW1heF9kZXB0aCA9IE1QVF9TQ1NJX0NNRF9QRVJfREVWX0hJR0g7CisJCQllbHNlCisJCQkJbWF4X2RlcHRoID0gTVBUX1NDU0lfQ01EX1BFUl9ERVZfTE9XOworCQl9IGVsc2UgeworCQkJLyogZXJyb3IgY2FzZSAtIE5vIElucS4gRGF0YSAqLworCQkJbWF4X2RlcHRoID0gMTsKKwkJfQorCX0gZWxzZQorCQltYXhfZGVwdGggPSBNUFRfU0NTSV9DTURfUEVSX0RFVl9ISUdIOworCisJaWYgKHFkZXB0aCA+IG1heF9kZXB0aCkKKwkJcWRlcHRoID0gbWF4X2RlcHRoOworCWlmIChxZGVwdGggPT0gMSkKKwkJdGFnZ2VkID0gMDsKKwllbHNlCisJCXRhZ2dlZCA9IE1TR19TSU1QTEVfVEFHOworCisJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2aWNlLCB0YWdnZWQsIHFkZXB0aCk7Cit9CisKKworLyoKKyAqCU9TIGVudHJ5IHBvaW50IHRvIGFkanVzdCB0aGUgcXVldWVfZGVwdGhzIG9uIGEgcGVyLWRldmljZSBiYXNpcy4KKyAqCUNhbGxlZCBvbmNlIHBlciBkZXZpY2UgdGhlIGJ1cyBzY2FuLiBVc2UgaXQgdG8gZm9yY2UgdGhlIHF1ZXVlX2RlcHRoCisgKgltZW1iZXIgdG8gMSBpZiBhIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IFEgdGFncy4KKyAqCVJldHVybiBub24temVybyBpZiBmYWlscy4KKyAqLworc3RhdGljIGludAorbXB0c2NzaWhfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBTY3NpX0hvc3QJKnNoID0gZGV2aWNlLT5ob3N0OworCVZpcnREZXZpY2UJCSpwVGFyZ2V0OworCU1QVF9TQ1NJX0hPU1QJCSpoZCA9IChNUFRfU0NTSV9IT1NUICopc2gtPmhvc3RkYXRhOworCisJaWYgKChoZCA9PSBOVUxMKSB8fCAoaGQtPlRhcmdldHMgPT0gTlVMTCkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJZHNwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQKKwkJImRldmljZSBAICVwLCBpZD0lZCwgTFVOPSVkLCBjaGFubmVsPSVkXG4iLAorCQloZC0+aW9jLT5uYW1lLCBkZXZpY2UsIGRldmljZS0+aWQsIGRldmljZS0+bHVuLCBkZXZpY2UtPmNoYW5uZWwpKTsKKwlkc3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVAorCQkic2R0ciAlZCB3ZHRyICVkIHBwciAlZCBpbnEgbGVuZ3RoPSVkXG4iLAorCQloZC0+aW9jLT5uYW1lLCBkZXZpY2UtPnNkdHIsIGRldmljZS0+d2R0ciwKKwkJZGV2aWNlLT5wcHIsIGRldmljZS0+aW5xdWlyeV9sZW4pKTsKKworCWlmIChkZXZpY2UtPmlkID4gc2gtPm1heF9pZCkgeworCQkvKiBlcnJvciBjYXNlLCBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKGRldmljZSwgMCwgMSk7CisJCWdvdG8gc2xhdmVfY29uZmlndXJlX2V4aXQ7CisJfQorCisJcFRhcmdldCA9IGhkLT5UYXJnZXRzW2RldmljZS0+aWRdOworCisJaWYgKHBUYXJnZXQgPT0gTlVMTCkgeworCQkvKiBEcml2ZXIgZG9lc24ndCBrbm93IGFib3V0IHRoaXMgZGV2aWNlLgorCQkgKiBLZXJuZWwgbWF5IGdlbmVyYXRlIGEgIkR1bW15IEx1biAwIiB3aGljaAorCQkgKiBtYXkgYmVjb21lIGEgcmVhbCBMdW4gaWYgYSAKKwkJICogInNjc2kgYWRkLXNpbmdsZS1kZXZpY2UiIGNvbW1hbmQgaXMgZXhlY3V0ZWQKKwkJICogd2hpbGUgdGhlIGRyaXZlciBpcyBhY3RpdmUgKGhvdC1wbHVnIGEgCisJCSAqIGRldmljZSkuICBMU0kgUmFpZCBjb250cm9sbGVycyBuZWVkIAorCQkgKiBxdWV1ZV9kZXB0aCBzZXQgdG8gREVWX0hJR0ggZm9yIHRoaXMgcmVhc29uLgorCQkgKi8KKwkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoZGV2aWNlLCBNU0dfU0lNUExFX1RBRywKKwkJCU1QVF9TQ1NJX0NNRF9QRVJfREVWX0hJR0gpOworCQlnb3RvIHNsYXZlX2NvbmZpZ3VyZV9leGl0OworCX0KKworCW1wdHNjc2loX2luaXRUYXJnZXQoaGQsIGRldmljZS0+Y2hhbm5lbCwgZGV2aWNlLT5pZCwgZGV2aWNlLT5sdW4sCisJCWRldmljZS0+aW5xdWlyeSwgZGV2aWNlLT5pbnF1aXJ5X2xlbiApOworCW1wdHNjc2loX3NldF9xdWV1ZV9kZXB0aChkZXZpY2UsIGhkLCBwVGFyZ2V0LCBNUFRfU0NTSV9DTURfUEVSX0RFVl9ISUdIKTsKKworCWRzcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UCisJCSJRdWV1ZSBkZXB0aD0lZCwgdGZsYWdzPSV4XG4iLAorCQloZC0+aW9jLT5uYW1lLCBkZXZpY2UtPnF1ZXVlX2RlcHRoLCBwVGFyZ2V0LT50ZmxhZ3MpKTsKKworCWRzcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UCisJCSJuZWdvRmxhZ3M9JXgsIG1heE9mZnNldD0leCwgU3luY0ZhY3Rvcj0leFxuIiwKKwkJaGQtPmlvYy0+bmFtZSwgcFRhcmdldC0+bmVnb0ZsYWdzLCBwVGFyZ2V0LT5tYXhPZmZzZXQsIHBUYXJnZXQtPm1pblN5bmNGYWN0b3IpKTsKKworc2xhdmVfY29uZmlndXJlX2V4aXQ6CisKKwlkc3ByaW50aygoTVlJT0Nfc19JTkZPX0ZNVAorCQkidGFnZ2VkICVkLCBzaW1wbGUgJWQsIG9yZGVyZWQgJWRcbiIsCisJCWhkLT5pb2MtPm5hbWUsZGV2aWNlLT50YWdnZWRfc3VwcG9ydGVkLCBkZXZpY2UtPnNpbXBsZV90YWdzLAorCQlkZXZpY2UtPm9yZGVyZWRfdGFncykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90CittcHRzY3NpaF9zdG9yZV9xdWV1ZV9kZXB0aChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludAkJCSBkZXB0aDsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UJKnNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOworCU1QVF9TQ1NJX0hPU1QJCSpoZCA9IChNUFRfU0NTSV9IT1NUICopIHNkZXYtPmhvc3QtPmhvc3RkYXRhOworCVZpcnREZXZpY2UJCSpwVGFyZ2V0OworCisJZGVwdGggPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOworCWlmIChkZXB0aCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwVGFyZ2V0ID0gaGQtPlRhcmdldHNbc2Rldi0+aWRdOworCWlmIChwVGFyZ2V0ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCW1wdHNjc2loX3NldF9xdWV1ZV9kZXB0aChzZGV2LCAoTVBUX1NDU0lfSE9TVCAqKSBzZGV2LT5ob3N0LT5ob3N0ZGF0YSwKKwkJcFRhcmdldCwgZGVwdGgpOworCXJldHVybiBjb3VudDsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqICBQcml2YXRlIHJvdXRpbmVzLi4uCisgKi8KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyogVXRpbGl0eSBmdW5jdGlvbiB0byBjb3B5IHNlbnNlIGRhdGEgZnJvbSB0aGUgc2NzaV9jbW5kIGJ1ZmZlcgorICogdG8gdGhlIEZDIGFuZCBTQ1NJIHRhcmdldCBzdHJ1Y3R1cmVzLgorICoKKyAqLworc3RhdGljIHZvaWQKK2NvcHlfc2Vuc2VfZGF0YShzdHJ1Y3Qgc2NzaV9jbW5kICpzYywgTVBUX1NDU0lfSE9TVCAqaGQsIE1QVF9GUkFNRV9IRFIgKm1mLCBTQ1NJSU9SZXBseV90ICpwU2NzaVJlcGx5KQoreworCVZpcnREZXZpY2UJKnRhcmdldDsKKwlTQ1NJSU9SZXF1ZXN0X3QJKnBSZXE7CisJdTMyCQkgc2Vuc2VfY291bnQgPSBsZTMyX3RvX2NwdShwU2NzaVJlcGx5LT5TZW5zZUNvdW50KTsKKwlpbnQJCSBpbmRleDsKKworCS8qIEdldCB0YXJnZXQgc3RydWN0dXJlCisJICovCisJcFJlcSA9IChTQ1NJSU9SZXF1ZXN0X3QgKikgbWY7CisJaW5kZXggPSAoaW50KSBwUmVxLT5UYXJnZXRJRDsKKwl0YXJnZXQgPSBoZC0+VGFyZ2V0c1tpbmRleF07CisKKwlpZiAoc2Vuc2VfY291bnQpIHsKKwkJdTggKnNlbnNlX2RhdGE7CisJCWludCByZXFfaW5kZXg7CisKKwkJLyogQ29weSB0aGUgc2Vuc2UgcmVjZWl2ZWQgaW50byB0aGUgc2NzaSBjb21tYW5kIGJsb2NrLiAqLworCQlyZXFfaW5kZXggPSBsZTE2X3RvX2NwdShtZi0+dS5mcmFtZS5od2hkci5tc2djdHh1LmZsZC5yZXFfaWR4KTsKKwkJc2Vuc2VfZGF0YSA9ICgodTggKiloZC0+aW9jLT5zZW5zZV9idWZfcG9vbCArIChyZXFfaW5kZXggKiBNUFRfU0VOU0VfQlVGRkVSX0FMTE9DKSk7CisJCW1lbWNweShzYy0+c2Vuc2VfYnVmZmVyLCBzZW5zZV9kYXRhLCBTTlNfTEVOKHNjKSk7CisKKwkJLyogTG9nIFNNQVJUIGRhdGEgKGFzYyA9IDB4NUQsIG5vbi1JTSBjYXNlIG9ubHkpIGlmIHJlcXVpcmVkLgorCQkgKi8KKwkJaWYgKChoZC0+aW9jLT5ldmVudHMpICYmIChoZC0+aW9jLT5ldmVudFR5cGVzICYgKDEgPDwgTVBJX0VWRU5UX1NDU0lfREVWSUNFX1NUQVRVU19DSEFOR0UpKSkgeworCQkJaWYgKChzZW5zZV9kYXRhWzEyXSA9PSAweDVEKSAmJiAodGFyZ2V0LT5yYWlkVm9sdW1lID09IDApKSB7CisJCQkJaW50IGlkeDsKKwkJCQlNUFRfQURBUFRFUiAqaW9jID0gaGQtPmlvYzsKKworCQkJCWlkeCA9IGlvYy0+ZXZlbnRDb250ZXh0ICUgaW9jLT5ldmVudExvZ1NpemU7CisJCQkJaW9jLT5ldmVudHNbaWR4XS5ldmVudCA9IE1QSV9FVkVOVF9TQ1NJX0RFVklDRV9TVEFUVVNfQ0hBTkdFOworCQkJCWlvYy0+ZXZlbnRzW2lkeF0uZXZlbnRDb250ZXh0ID0gaW9jLT5ldmVudENvbnRleHQ7CisKKwkJCQlpb2MtPmV2ZW50c1tpZHhdLmRhdGFbMF0gPSAocFJlcS0+TFVOWzFdIDw8IDI0KSB8fAorCQkJCQkoTVBJX0VWRU5UX1NDU0lfREVWX1NUQVRfUkNfU01BUlRfREFUQSA8PCAxNikgfHwKKwkJCQkJKHBSZXEtPkJ1cyA8PCA4KSB8fCBwUmVxLT5UYXJnZXRJRDsKKworCQkJCWlvYy0+ZXZlbnRzW2lkeF0uZGF0YVsxXSA9IChzZW5zZV9kYXRhWzEzXSA8PCA4KSB8fCBzZW5zZV9kYXRhWzEyXTsKKworCQkJCWlvYy0+ZXZlbnRDb250ZXh0Kys7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJIbW1tLi4uIFNlbnNlRGF0YSBsZW49MCEgKD8pXG4iLAorCQkJCWhkLT5pb2MtPm5hbWUpKTsKKwl9Cit9CisKK3N0YXRpYyB1MzIKK1NDUE5UX1RPX0xPT0tVUF9JRFgoc3RydWN0IHNjc2lfY21uZCAqc2MpCit7CisJTVBUX1NDU0lfSE9TVCAqaGQ7CisJaW50IGk7CisKKwloZCA9IChNUFRfU0NTSV9IT1NUICopIHNjLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOworCisJZm9yIChpID0gMDsgaSA8IGhkLT5pb2MtPnJlcV9kZXB0aDsgaSsrKSB7CisJCWlmIChoZC0+U2NzaUxvb2t1cFtpXSA9PSBzYykgeworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KK3N0YXRpYyBpbnQKK21wdHNjc2loX2lvY19yZXNldChNUFRfQURBUFRFUiAqaW9jLCBpbnQgcmVzZXRfcGhhc2UpCit7CisJTVBUX1NDU0lfSE9TVAkqaGQ7CisJdW5zaWduZWQgbG9uZwkgZmxhZ3M7CisKKwlkdG1wcmludGsoKEtFUk5fV0FSTklORyBNWU5BTQorCQkJIjogSU9DICVzX3Jlc2V0IHJvdXRlZCB0byBTQ1NJIGhvc3QgZHJpdmVyIVxuIiwKKwkJCXJlc2V0X3BoYXNlPT1NUFRfSU9DX1NFVFVQX1JFU0VUID8gInNldHVwIiA6ICgKKwkJCXJlc2V0X3BoYXNlPT1NUFRfSU9DX1BSRV9SRVNFVCA/ICJwcmUiIDogInBvc3QiKSkpOworCisJLyogSWYgYSBGVyByZWxvYWQgcmVxdWVzdCBhcnJpdmVzIGFmdGVyIGJhc2UgaW5zdGFsbGVkIGJ1dAorCSAqIGJlZm9yZSBhbGwgc2NzaSBob3N0cyBoYXZlIGJlZW4gYXR0YWNoZWQsIHRoZW4gYW4gYWx0X2lvYworCSAqIG1heSBoYXZlIGEgTlVMTCBzaCBwb2ludGVyLgorCSAqLworCWlmICgoaW9jLT5zaCA9PSBOVUxMKSB8fCAoaW9jLT5zaC0+aG9zdGRhdGEgPT0gTlVMTCkpCisJCXJldHVybiAwOworCWVsc2UKKwkJaGQgPSAoTVBUX1NDU0lfSE9TVCAqKSBpb2MtPnNoLT5ob3N0ZGF0YTsKKworCWlmIChyZXNldF9waGFzZSA9PSBNUFRfSU9DX1NFVFVQX1JFU0VUKSB7CisJCWR0bXByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiU2V0dXAtRGlhZyBSZXNldFxuIiwgaW9jLT5uYW1lKSk7CisKKwkJLyogQ2xlYW4gVXA6CisJCSAqIDEuIFNldCBIYXJkIFJlc2V0IFBlbmRpbmcgRmxhZworCQkgKiBBbGwgbmV3IGNvbW1hbmRzIGdvIHRvIGRvbmVRCisJCSAqLworCQloZC0+cmVzZXRQZW5kaW5nID0gMTsKKworCX0gZWxzZSBpZiAocmVzZXRfcGhhc2UgPT0gTVBUX0lPQ19QUkVfUkVTRVQpIHsKKwkJZHRtcHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJQcmUtRGlhZyBSZXNldFxuIiwgaW9jLT5uYW1lKSk7CisKKwkJLyogMi4gRmx1c2ggcnVubmluZyBjb21tYW5kcworCQkgKglDbGVhbiBTY3NpTG9va3VwIChhbmQgYXNzb2NpYXRlZCBtZW1vcnkpCisJCSAqCUFORCBjbGVhbiBteXRhc2tRCisJCSAqLworCisJCS8qIDJiLiBSZXBseSB0byBPUyBhbGwga25vd24gb3V0c3RhbmRpbmcgSS9PIGNvbW1hbmRzLgorCQkgKi8KKwkJbXB0c2NzaWhfZmx1c2hfcnVubmluZ19jbWRzKGhkKTsKKworCQkvKiAyYy4gSWYgdGhlcmUgd2FzIGFuIGludGVybmFsIGNvbW1hbmQgdGhhdAorCQkgKiBoYXMgbm90IGNvbXBsZXRlZCwgY29uZmlndXJhdGlvbiBvciBpbyByZXF1ZXN0LAorCQkgKiBmcmVlIHRoZXNlIHJlc291cmNlcy4KKwkJICovCisJCWlmIChoZC0+Y21kUHRyKSB7CisJCQlkZWxfdGltZXIoJmhkLT50aW1lcik7CisJCQltcHRfZnJlZV9tc2dfZnJhbWUoaW9jLCBoZC0+Y21kUHRyKTsKKwkJfQorCisJCWR0bXByaW50aygoTVlJT0Nfc19XQVJOX0ZNVCAiUHJlLVJlc2V0IGNvbXBsZXRlLlxuIiwgaW9jLT5uYW1lKSk7CisKKwl9IGVsc2UgeworCQlkdG1wcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIlBvc3QtRGlhZyBSZXNldFxuIiwgaW9jLT5uYW1lKSk7CisKKwkJLyogT25jZSBhIEZXIHJlbG9hZCBiZWdpbnMsIGFsbCBuZXcgT1MgY29tbWFuZHMgYXJlCisJCSAqIHJlZGlyZWN0ZWQgdG8gdGhlIGRvbmVRIHcvIGEgcmVzZXQgc3RhdHVzLgorCQkgKiBJbml0IGFsbCBjb250cm9sIHN0cnVjdHVyZXMuCisJCSAqLworCisJCS8qIFNjc2lMb29rdXAgaW5pdGlhbGl6YXRpb24KKwkJICovCisJCXsKKwkJCWludCBpaTsKKwkJCWZvciAoaWk9MDsgaWkgPCBoZC0+aW9jLT5yZXFfZGVwdGg7IGlpKyspCisJCQkJaGQtPlNjc2lMb29rdXBbaWldID0gTlVMTDsKKwkJfQorCisJCS8qIDIuIENoYWluIEJ1ZmZlciBpbml0aWFsaXphdGlvbgorCQkgKi8KKworCQkvKiA0LiBSZW5lZ290aWF0ZSB0byBhbGwgZGV2aWNlcywgaWYgU0NTSQorCQkgKi8KKwkJaWYgKGlvYy0+YnVzX3R5cGUgPT0gU0NTSSkgeworCQkJZG5lZ29wcmludGsoKCJ3cml0ZVNEUDE6IEFMTF9JRFMgVVNFX05WUkFNXG4iKSk7CisJCQltcHRzY3NpaF93cml0ZVNEUDEoaGQsIDAsIDAsIE1QVF9TQ1NJQ0ZHX0FMTF9JRFMgfCBNUFRfU0NTSUNGR19VU0VfTlZSQU0pOworCQl9CisKKwkJLyogNS4gRW5hYmxlIG5ldyBjb21tYW5kcyB0byBiZSBwb3N0ZWQKKwkJICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPkZyZWVRbG9jaywgZmxhZ3MpOworCQloZC0+dG1QZW5kaW5nID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5GcmVlUWxvY2ssIGZsYWdzKTsKKwkJaGQtPnJlc2V0UGVuZGluZyA9IDA7CisJCWhkLT50bVN0YXRlID0gVE1fU1RBVEVfTk9ORTsKKworCQkvKiA2LiBJZiB0aGVyZSB3YXMgYW4gaW50ZXJuYWwgY29tbWFuZCwKKwkJICogd2FrZSB0aGlzIHByb2Nlc3MgdXAuCisJCSAqLworCQlpZiAoaGQtPmNtZFB0cikgeworCQkJLyoKKwkJCSAqIFdha2UgdXAgdGhlIG9yaWdpbmFsIGNhbGxpbmcgdGhyZWFkCisJCQkgKi8KKwkJCWhkLT5wTG9jYWwgPSAmaGQtPmxvY2FsUmVwbHk7CisJCQloZC0+cExvY2FsLT5jb21wbGV0aW9uID0gTVBUX1NDQU5EVl9ESURfUkVTRVQ7CisJCQlzY2FuZHZfd2FpdF9kb25lID0gMTsKKwkJCXdha2VfdXAoJnNjYW5kdl93YWl0cSk7CisJCQloZC0+Y21kUHRyID0gTlVMTDsKKwkJfQorCisJCS8qIDcuIFNldCBmbGFnIHRvIGZvcmNlIERWIGFuZCByZS1yZWFkIElPQyBQYWdlIDMKKwkJICovCisJCWlmIChpb2MtPmJ1c190eXBlID09IFNDU0kpIHsKKwkJCWlvYy0+c3BpX2RhdGEuZm9yY2VEdiA9IE1QVF9TQ1NJQ0ZHX05FRURfRFYgfCBNUFRfU0NTSUNGR19SRUxPQURfSU9DX1BHMzsKKwkJCWRkdnRwcmludGsoKCJTZXQgcmVsb2FkIElPQyBQZzMgRmxhZ1xuIikpOworCQl9CisKKwkJZHRtcHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJQb3N0LVJlc2V0IGNvbXBsZXRlLlxuIiwgaW9jLT5uYW1lKSk7CisKKwl9CisKKwlyZXR1cm4gMTsJCS8qIGN1cnJlbnRseSBtZWFucyBub3RoaW5nIHJlYWxseSAqLworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCitzdGF0aWMgaW50CittcHRzY3NpaF9ldmVudF9wcm9jZXNzKE1QVF9BREFQVEVSICppb2MsIEV2ZW50Tm90aWZpY2F0aW9uUmVwbHlfdCAqcEV2UmVwbHkpCit7CisJTVBUX1NDU0lfSE9TVCAqaGQ7CisJdTggZXZlbnQgPSBsZTMyX3RvX2NwdShwRXZSZXBseS0+RXZlbnQpICYgMHhGRjsKKworCWRldnRwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIk1QVCBldmVudCAoPSUwMlhoKSByb3V0ZWQgdG8gU0NTSSBob3N0IGRyaXZlciFcbiIsCisJCQlpb2MtPm5hbWUsIGV2ZW50KSk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBNUElfRVZFTlRfVU5JVF9BVFRFTlRJT046CQkJLyogMDMgKi8KKwkJLyogRklYTUUhICovCisJCWJyZWFrOworCWNhc2UgTVBJX0VWRU5UX0lPQ19CVVNfUkVTRVQ6CQkJLyogMDQgKi8KKwljYXNlIE1QSV9FVkVOVF9FWFRfQlVTX1JFU0VUOgkJCS8qIDA1ICovCisJCWhkID0gTlVMTDsKKwkJaWYgKGlvYy0+c2gpIHsKKwkJCWhkID0gKE1QVF9TQ1NJX0hPU1QgKikgaW9jLT5zaC0+aG9zdGRhdGE7CisJCQlpZiAoaGQgJiYgKGlvYy0+YnVzX3R5cGUgPT0gU0NTSSkgJiYgKGhkLT5zb2Z0X3Jlc2V0cyA8IC0xKSkKKwkJCQloZC0+c29mdF9yZXNldHMrKzsKKwkJfQorCQlicmVhazsKKwljYXNlIE1QSV9FVkVOVF9MT0dPVVQ6CQkJCS8qIDA5ICovCisJCS8qIEZJWE1FISAqLworCQlicmVhazsKKworCQkvKgorCQkgKiAgQ0hFQ0tNRSEgRG9uJ3QgdGhpbmsgd2UgbmVlZCB0byBkbworCQkgKiAgYW55dGhpbmcgZm9yIHRoZXNlLCBidXQuLi4KKwkJICovCisJY2FzZSBNUElfRVZFTlRfUkVTQ0FOOgkJCQkvKiAwNiAqLworCWNhc2UgTVBJX0VWRU5UX0xJTktfU1RBVFVTX0NIQU5HRToJCS8qIDA3ICovCisJY2FzZSBNUElfRVZFTlRfTE9PUF9TVEFURV9DSEFOR0U6CQkvKiAwOCAqLworCQkvKgorCQkgKiAgQ0hFQ0tNRSEgIEZhbGxpbmcgdGhydS4uLgorCQkgKi8KKwkJYnJlYWs7CisKKwljYXNlIE1QSV9FVkVOVF9JTlRFR1JBVEVEX1JBSUQ6CQkJLyogMEIgKi8KKyNpZmRlZiBNUFRTQ1NJSF9FTkFCTEVfRE9NQUlOX1ZBTElEQVRJT04KKwkJLyogbmVnb052cmFtIHNldCB0byAwIGlmIERWIGVuYWJsZWQgYW5kIHRvIFVTRV9OVlJBTSBpZgorCQkgKiBpZiBEViBkaXNhYmxlZC4gTmVlZCB0byBjaGVjayBmb3IgdGFyZ2V0IG1vZGUuCisJCSAqLworCQloZCA9IE5VTEw7CisJCWlmIChpb2MtPnNoKQorCQkJaGQgPSAoTVBUX1NDU0lfSE9TVCAqKSBpb2MtPnNoLT5ob3N0ZGF0YTsKKworCQlpZiAoaGQgJiYgKGlvYy0+YnVzX3R5cGUgPT0gU0NTSSkgJiYgKGhkLT5uZWdvTnZyYW0gPT0gMCkpIHsKKwkJCVNjc2lDZmdEYXRhCSpwU3BpOworCQkJSW9jM1BoeXNEaXNrX3QJKnBQRGlzazsKKwkJCWludAkJIG51bVBEaXNrOworCQkJdTgJCSByZWFzb247CisJCQl1OAkJIHBoeXNEaXNrTnVtOworCisJCQlyZWFzb24gPSAobGUzMl90b19jcHUocEV2UmVwbHktPkRhdGFbMF0pICYgMHgwMEZGMDAwMCkgPj4gMTY7CisJCQlpZiAocmVhc29uID09IE1QSV9FVkVOVF9SQUlEX1JDX0RPTUFJTl9WQUxfTkVFREVEKSB7CisJCQkJLyogTmV3IG9yIHJlcGxhY2VkIGRpc2suCisJCQkJICogU2V0IERWIGZsYWcgYW5kIHNjaGVkdWxlIERWLgorCQkJCSAqLworCQkJCXBTcGkgPSAmaW9jLT5zcGlfZGF0YTsKKwkJCQlwaHlzRGlza051bSA9IChsZTMyX3RvX2NwdShwRXZSZXBseS0+RGF0YVswXSkgJiAweEZGMDAwMDAwKSA+PiAyNDsKKwkJCQlkZHZ0cHJpbnRrKCgiRFYgcmVxdWVzdGVkIGZvciBwaHlzIGRpc2sgaWQgJWRcbiIsIHBoeXNEaXNrTnVtKSk7CisJCQkJaWYgKHBTcGktPnBJb2NQZzMpIHsKKwkJCQkJcFBEaXNrID0gIHBTcGktPnBJb2NQZzMtPlBoeXNEaXNrOworCQkJCQludW1QRGlzayA9cFNwaS0+cElvY1BnMy0+TnVtUGh5c0Rpc2tzOworCisJCQkJCXdoaWxlIChudW1QRGlzaykgeworCQkJCQkJaWYgKHBoeXNEaXNrTnVtID09IHBQRGlzay0+UGh5c0Rpc2tOdW0pIHsKKwkJCQkJCQlwU3BpLT5kdlN0YXR1c1twUERpc2stPlBoeXNEaXNrSURdID0gKE1QVF9TQ1NJQ0ZHX05FRURfRFYgfCBNUFRfU0NTSUNGR19EVl9OT1RfRE9ORSk7CisJCQkJCQkJcFNwaS0+Zm9yY2VEdiA9IE1QVF9TQ1NJQ0ZHX05FRURfRFY7CisJCQkJCQkJZGR2dHByaW50aygoIk5FRURfRFYgc2V0IGZvciBwaHlzIGRpc2sgaWQgJWRcbiIsIHBQRGlzay0+UGh5c0Rpc2tJRCkpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJcFBEaXNrKys7CisJCQkJCQludW1QRGlzay0tOworCQkJCQl9CisKKwkJCQkJaWYgKG51bVBEaXNrID09IDApIHsKKwkJCQkJCS8qIFRoZSBwaHlzaWNhbCBkaXNrIHRoYXQgbmVlZHMgRFYgd2FzIG5vdCBmb3VuZAorCQkJCQkJICogaW4gdGhlIHN0b3JlZCBJT0MgUGFnZSAzLiBUaGUgZHJpdmVyIG11c3QgcmVsb2FkCisJCQkJCQkgKiB0aGlzIHBhZ2UuIERWIHJvdXRpbmUgd2lsbCBzZXQgdGhlIE5FRURfRFYgZmxhZyBmb3IKKwkJCQkJCSAqIGFsbCBwaHlzIGRpc2tzIHRoYXQgaGF2ZSBEVl9OT1RfRE9ORSBzZXQuCisJCQkJCQkgKi8KKwkJCQkJCXBTcGktPmZvcmNlRHYgPSBNUFRfU0NTSUNGR19ORUVEX0RWIHwgTVBUX1NDU0lDRkdfUkVMT0FEX0lPQ19QRzM7CisJCQkJCQlkZHZ0cHJpbnRrKCgicGh5cyBkaXNrICVkIG5vdCBmb3VuZC4gU2V0dGluZyByZWxvYWQgSU9DIFBnMyBGbGFnXG4iLCBwaHlzRGlza051bSkpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYKKworI2lmIGRlZmluZWQoTVBUX0RFQlVHX0RWKSB8fCBkZWZpbmVkKE1QVF9ERUJVR19EVl9USU5ZKQorCQlwcmludGsoIlJhaWQgRXZlbnQgUkY6ICIpOworCQl7CisJCQl1MzIgKm0gPSAodTMyICopcEV2UmVwbHk7CisJCQlpbnQgaWk7CisJCQlpbnQgbiA9IChpbnQpcEV2UmVwbHktPk1zZ0xlbmd0aDsKKwkJCWZvciAoaWk9NjsgaWkgPCBuOyBpaSsrKQorCQkJCXByaW50aygiICUwOHgiLCBsZTMyX3RvX2NwdShtW2lpXSkpOworCQkJcHJpbnRrKCJcbiIpOworCQl9CisjZW5kaWYKKwkJYnJlYWs7CisKKwljYXNlIE1QSV9FVkVOVF9OT05FOgkJCQkvKiAwMCAqLworCWNhc2UgTVBJX0VWRU5UX0xPR19EQVRBOgkJCS8qIDAxICovCisJY2FzZSBNUElfRVZFTlRfU1RBVEVfQ0hBTkdFOgkJCS8qIDAyICovCisJY2FzZSBNUElfRVZFTlRfRVZFTlRfQ0hBTkdFOgkJCS8qIDBBICovCisJZGVmYXVsdDoKKwkJZHByaW50aygoS0VSTl9JTkZPICIgIElnbm9yaW5nIGV2ZW50ICg9JTAyWGgpXG4iLCBldmVudCkpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMTsJCS8qIGN1cnJlbnRseSBtZWFucyBub3RoaW5nIHJlYWxseSAqLworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgbXB0c2NzaWhfcXVldWVfZGVwdGhfYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgPSAJInF1ZXVlX2RlcHRoIiwKKwkJLm1vZGUgPQkJU19JV1VTUiwKKwl9LAorCS5zdG9yZSA9IG1wdHNjc2loX3N0b3JlX3F1ZXVlX2RlcHRoLAorfTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICptcHRzY3NpaF9kZXZfYXR0cnNbXSA9IHsKKwkmbXB0c2NzaWhfcXVldWVfZGVwdGhfYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0geworCS5wcm9jX25hbWUJCQk9ICJtcHRzY3NpaCIsCisJLnByb2NfaW5mbwkJCT0gbXB0c2NzaWhfcHJvY19pbmZvLAorCS5uYW1lCQkJCT0gIk1QVCBTQ1NJIEhvc3QiLAorCS5pbmZvCQkJCT0gbXB0c2NzaWhfaW5mbywKKwkucXVldWVjb21tYW5kCQkJPSBtcHRzY3NpaF9xY21kLAorCS5zbGF2ZV9hbGxvYwkJCT0gbXB0c2NzaWhfc2xhdmVfYWxsb2MsCisJLnNsYXZlX2NvbmZpZ3VyZQkJPSBtcHRzY3NpaF9zbGF2ZV9jb25maWd1cmUsCisJLnNsYXZlX2Rlc3Ryb3kJCQk9IG1wdHNjc2loX3NsYXZlX2Rlc3Ryb3ksCisJLmVoX2Fib3J0X2hhbmRsZXIJCT0gbXB0c2NzaWhfYWJvcnQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyCT0gbXB0c2NzaWhfZGV2X3Jlc2V0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlcgkJPSBtcHRzY3NpaF9idXNfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgkJPSBtcHRzY3NpaF9ob3N0X3Jlc2V0LAorCS5iaW9zX3BhcmFtCQkJPSBtcHRzY3NpaF9iaW9zX3BhcmFtLAorCS5jYW5fcXVldWUJCQk9IE1QVF9TQ1NJX0NBTl9RVUVVRSwKKwkudGhpc19pZAkJCT0gLTEsCisJLnNnX3RhYmxlc2l6ZQkJCT0gTVBUX1NDU0lfU0dfREVQVEgsCisJLm1heF9zZWN0b3JzCQkJPSA4MTkyLAorCS5jbWRfcGVyX2x1bgkJCT0gNywKKwkudXNlX2NsdXN0ZXJpbmcJCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAorCS5zZGV2X2F0dHJzCQkJPSBtcHRzY3NpaF9kZXZfYXR0cnMsCit9OworCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICoJbXB0c2NzaWhfaW5pdFRhcmdldCAtIFRhcmdldCwgTFVOIGFsbG9jL2ZyZWUgZnVuY3Rpb25hbGl0eS4KKyAqCUBoZDogUG9pbnRlciB0byBNUFRfU0NTSV9IT1NUIHN0cnVjdHVyZQorICoJQGJ1c19pZDogQnVzIG51bWJlciAoPykKKyAqCUB0YXJnZXRfaWQ6IFNDU0kgdGFyZ2V0IGlkCisgKglAbHVuOiBTQ1NJIExVTiBpZAorICoJQGRhdGE6IFBvaW50ZXIgdG8gZGF0YQorICoJQGRsZW46IE51bWJlciBvZiBJTlFVSVJZIGJ5dGVzCisgKgorICoJTk9URTogSXQncyBvbmx5IFNBRkUgdG8gY2FsbCB0aGlzIHJvdXRpbmUgaWYgZGF0YSBwb2ludHMgdG8KKyAqCXNhbmUgJiB2YWxpZCBTVEFOREFSRCBJTlFVSVJZIGRhdGEhCisgKgorICoJQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgbWVtb3J5IGZvciB0aGlzIHRhcmdldC4KKyAqCVNhdmUgaW5xdWlyeSBkYXRhLgorICoKKyAqLworc3RhdGljIHZvaWQKK21wdHNjc2loX2luaXRUYXJnZXQoTVBUX1NDU0lfSE9TVCAqaGQsIGludCBidXNfaWQsIGludCB0YXJnZXRfaWQsIHU4IGx1biwgY2hhciAqZGF0YSwgaW50IGRsZW4pCit7CisJaW50CQlpbmRleGVkX2x1biwgbHVuX2luZGV4OworCVZpcnREZXZpY2UJKnZkZXY7CisJU2NzaUNmZ0RhdGEJKnBTcGk7CisJY2hhcgkJZGF0YV81NjsKKworCWRpbml0cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJpbml0VGFyZ2V0IGJ1cz0lZCBpZD0lZCBsdW49JWQgaGQ9JXBcbiIsCisJCQloZC0+aW9jLT5uYW1lLCBidXNfaWQsIHRhcmdldF9pZCwgbHVuLCBoZCkpOworCisJLyoKKwkgKiBJZiB0aGUgcGVyaXBoZXJhbCBxdWFsaWZpZXIgZmlsdGVyIGlzIGVuYWJsZWQgdGhlbiBpZiB0aGUgdGFyZ2V0IHJlcG9ydHMgYSAweDEKKwkgKiAoaS5lLiBUaGUgdGFyZ2VyIGlzIGNhcGFibGUgb2Ygc3VwcG9ydGluZyB0aGUgc3BlY2lmaWVkIHBlcmlwaGVyYWwgZGV2aWNlIHR5cGUKKwkgKiBvbiB0aGlzIGxvZ2ljYWwgdW5pdDsgaG93ZXZlciwgdGhlIHBoeXNpY2FsIGRldmljZSBpcyBub3QgY3VycmVudGx5IGNvbm5lY3RlZAorCSAqIHRvIHRoaXMgbG9naWNhbCB1bml0KSBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIDB4MyAoaS5lLiBUaGUgdGFyZ2V0IGlzIG5vdCAKKwkgKiBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgYSBwaHlzaWNhbCBkZXZpY2Ugb24gdGhpcyBsb2dpY2FsIHVuaXQpLiBUaGlzIGlzIHRvIHdvcmsKKwkgKiBhcm91bmQgYSBidWcgaW4gdGggZW1pZC1sYXllciBpbiBzb21lIGRpc3RyaWJ1dGlvbnMgaW4gd2hpY2ggdGhlIG1pZC1sYXllciB3aWxsCisJICogY29udGludWUgdG8gdHJ5IHRvIGNvbW11bmljYXRlIHRvIHRoZSBMVU4gYW5kIGV2bnR1YWxseSBjcmVhdGUgYSBkdW1teSBMVU4uCisJKi8KKwlpZiAobXB0X3BxX2ZpbHRlciAmJiBkbGVuICYmIChkYXRhWzBdICYgMHhFMCkpCisJCWRhdGFbMF0gfD0gMHg0MDsKKwkKKwkvKiBJcyBMVU4gc3VwcG9ydGVkPyBJZiBzbywgdXBwZXIgMiBiaXRzIHdpbGwgYmUgMAorCSogaW4gZmlyc3QgYnl0ZSBvZiBpbnF1aXJ5IGRhdGEuCisJKi8KKwlpZiAoZGF0YVswXSAmIDB4ZTApCisJCXJldHVybjsKKworCWlmICgodmRldiA9IGhkLT5UYXJnZXRzW3RhcmdldF9pZF0pID09IE5VTEwpIHsKKwkJcmV0dXJuOworCX0KKworCWx1bl9pbmRleCA9IChsdW4gPj4gNSk7ICAvKiAzMiBsdW5zIHBlciBsdW5faW5kZXggKi8KKwlpbmRleGVkX2x1biA9IChsdW4gJSAzMik7CisJdmRldi0+bHVuc1tsdW5faW5kZXhdIHw9ICgxIDw8IGluZGV4ZWRfbHVuKTsKKworCWlmIChoZC0+aW9jLT5idXNfdHlwZSA9PSBTQ1NJKSB7CisJCWlmICgoZGF0YVswXSA9PSBUWVBFX1BST0NFU1NPUikgJiYgKGhkLT5pb2MtPnNwaV9kYXRhLlNhZl9UZSkpIHsKKwkJCS8qIFRyZWF0IGFsbCBQcm9jZXNzb3JzIGFzIFNBRi1URSBpZgorCQkJICogY29tbWFuZCBsaW5lIG9wdGlvbiBpcyBzZXQgKi8KKwkJCXZkZXYtPnRmbGFncyB8PSBNUFRfVEFSR0VUX0ZMQUdTX1NBRl9URV9JU1NVRUQ7CisJCQltcHRzY3NpaF93cml0ZUlPQ1BhZ2U0KGhkLCB0YXJnZXRfaWQsIGJ1c19pZCk7CisJCX1lbHNlIGlmICgoZGF0YVswXSA9PSBUWVBFX1BST0NFU1NPUikgJiYKKwkJCSEodmRldi0+dGZsYWdzICYgTVBUX1RBUkdFVF9GTEFHU19TQUZfVEVfSVNTVUVEICkpIHsKKwkJCWlmICggZGxlbiA+IDQ5ICkgeworCQkJCXZkZXYtPnRmbGFncyB8PSBNUFRfVEFSR0VUX0ZMQUdTX1ZBTElEX0lOUVVJUlk7CisJCQkJaWYgKCBkYXRhWzQ0XSA9PSAnUycgJiYKKwkJCQkgICAgIGRhdGFbNDVdID09ICdBJyAmJgorCQkJCSAgICAgZGF0YVs0Nl0gPT0gJ0YnICYmCisJCQkJICAgICBkYXRhWzQ3XSA9PSAnLScgJiYKKwkJCQkgICAgIGRhdGFbNDhdID09ICdUJyAmJgorCQkJCSAgICAgZGF0YVs0OV0gPT0gJ0UnICkgeworCQkJCQl2ZGV2LT50ZmxhZ3MgfD0gTVBUX1RBUkdFVF9GTEFHU19TQUZfVEVfSVNTVUVEOworCQkJCQltcHRzY3NpaF93cml0ZUlPQ1BhZ2U0KGhkLCB0YXJnZXRfaWQsIGJ1c19pZCk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmICghKHZkZXYtPnRmbGFncyAmIE1QVF9UQVJHRVRfRkxBR1NfVkFMSURfSU5RVUlSWSkpIHsKKwkJCWlmICggZGxlbiA+IDggKSB7CisJCQkJbWVtY3B5ICh2ZGV2LT5pbnFfZGF0YSwgZGF0YSwgOCk7CisJCQl9IGVsc2UgeworCQkJCW1lbWNweSAodmRldi0+aW5xX2RhdGEsIGRhdGEsIGRsZW4pOworCQkJfQorCisJCQkvKiBJZiBoYXZlIG5vdCBkb25lIERWLCBzZXQgdGhlIERWIGZsYWcuCisJCQkgKi8KKwkJCXBTcGkgPSAmaGQtPmlvYy0+c3BpX2RhdGE7CisJCQlpZiAoKGRhdGFbMF0gPT0gVFlQRV9UQVBFKSB8fCAoZGF0YVswXSA9PSBUWVBFX1BST0NFU1NPUikpIHsKKwkJCQlpZiAocFNwaS0+ZHZTdGF0dXNbdGFyZ2V0X2lkXSAmIE1QVF9TQ1NJQ0ZHX0RWX05PVF9ET05FKQorCQkJCQlwU3BpLT5kdlN0YXR1c1t0YXJnZXRfaWRdIHw9IE1QVF9TQ1NJQ0ZHX05FRURfRFY7CisJCQl9CisKKwkJCXZkZXYtPnRmbGFncyB8PSBNUFRfVEFSR0VUX0ZMQUdTX1ZBTElEX0lOUVVJUlk7CisKKworCQkJZGF0YV81NiA9IDB4MEY7ICAvKiBEZWZhdWx0IHRvIGZ1bGwgY2FwYWJpbGl0aWVzIGlmIElucSBkYXRhIGxlbmd0aCBpcyA8IDU3ICovCisJCQlpZiAoZGxlbiA+IDU2KSB7CisJCQkJaWYgKCAoISh2ZGV2LT50ZmxhZ3MgJiBNUFRfVEFSR0VUX0ZMQUdTX1ZBTElEXzU2KSkpIHsKKwkJCQkvKiBVcGRhdGUgdGhlIHRhcmdldCBjYXBhYmlsaXRpZXMKKwkJCQkgKi8KKwkJCQkJZGF0YV81NiA9IGRhdGFbNTZdOworCQkJCQl2ZGV2LT50ZmxhZ3MgfD0gTVBUX1RBUkdFVF9GTEFHU19WQUxJRF81NjsKKwkJCQl9CisJCQl9CisJCQltcHRzY3NpaF9zZXRUYXJnZXROZWdvUGFybXMoaGQsIHZkZXYsIGRhdGFfNTYpOworCQl9IGVsc2UgeworCQkJLyogSW5pdGlhbCBJbnF1aXJ5IG1heSBub3QgcmVxdWVzdCBlbm91Z2ggZGF0YSBieXRlcyB0bworCQkJICogb2J0YWluIGJ5dGUgNTcuICBEViB3aWxsOyBpZiB0YXJnZXQgZG9lc24ndCByZXR1cm4KKwkJCSAqIGF0IGxlYXN0IDU3IGJ5dGVzLCBkYXRhWzU2XSB3aWxsIGJlIHplcm8uICovCisJCQlpZiAoZGxlbiA+IDU2KSB7CisJCQkJaWYgKCAoISh2ZGV2LT50ZmxhZ3MgJiBNUFRfVEFSR0VUX0ZMQUdTX1ZBTElEXzU2KSkpIHsKKwkJCQkvKiBVcGRhdGUgdGhlIHRhcmdldCBjYXBhYmlsaXRpZXMKKwkJCQkgKi8KKwkJCQkJZGF0YV81NiA9IGRhdGFbNTZdOworCQkJCQl2ZGV2LT50ZmxhZ3MgfD0gTVBUX1RBUkdFVF9GTEFHU19WQUxJRF81NjsKKwkJCQkJbXB0c2NzaWhfc2V0VGFyZ2V0TmVnb1Bhcm1zKGhkLCB2ZGV2LCBkYXRhXzU2KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKiAgVXBkYXRlIHRoZSB0YXJnZXQgbmVnb3RpYXRpb24gcGFyYW1ldGVycyBiYXNlZCBvbiB0aGUKKyAqICB0aGUgSW5xdWlyeSBkYXRhLCBhZGFwdGVyIGNhcGFiaWxpdGllcywgYW5kIE5WUkFNIHNldHRpbmdzLgorICoKKyAqLworc3RhdGljIHZvaWQKK21wdHNjc2loX3NldFRhcmdldE5lZ29QYXJtcyhNUFRfU0NTSV9IT1NUICpoZCwgVmlydERldmljZSAqdGFyZ2V0LCBjaGFyIGJ5dGU1NikKK3sKKwlTY3NpQ2ZnRGF0YSAqcHNwaV9kYXRhID0gJmhkLT5pb2MtPnNwaV9kYXRhOworCWludCAgaWQgPSAoaW50KSB0YXJnZXQtPnRhcmdldF9pZDsKKwlpbnQgIG52cmFtOworCVZpcnREZXZpY2UJKnZkZXY7CisJaW50IGlpOworCXU4IHdpZHRoID0gTVBUX05BUlJPVzsKKwl1OCBmYWN0b3IgPSBNUFRfQVNZTkM7CisJdTggb2Zmc2V0ID0gMDsKKwl1OCB2ZXJzaW9uLCBuZmFjdG9yOworCXU4IG5vUWFzID0gMTsKKworCXRhcmdldC0+bmVnb0ZsYWdzID0gcHNwaV9kYXRhLT5ub1FhczsKKworCS8qIG5vUWFzID09IDAgPT4gZGV2aWNlIHN1cHBvcnRzIFFBUy4gTmVlZCBieXRlIDU2IG9mIElucSB0byBkZXRlcm1pbmUKKwkgKiBzdXBwb3J0LiBJZiBhdmFpbGFibGUsIGRlZmF1bHQgUUFTIHRvIG9mZiBhbmQgYWxsb3cgZW5hYmxpbmcuCisJICogSWYgbm90IGF2YWlsYWJsZSwgZGVmYXVsdCBRQVMgdG8gb24sIHR1cm4gb2ZmIGZvciBub24tZGlza3MuCisJICovCisKKwkvKiBTZXQgZmxhZ3MgYmFzZWQgb24gSW5xdWlyeSBkYXRhCisJICovCisJdmVyc2lvbiA9IHRhcmdldC0+aW5xX2RhdGFbMl0gJiAweDA3OworCWlmICh2ZXJzaW9uIDwgMikgeworCQl3aWR0aCA9IDA7CisJCWZhY3RvciA9IE1QVF9VTFRSQTI7CisJCW9mZnNldCA9IHBzcGlfZGF0YS0+bWF4U3luY09mZnNldDsKKwkJdGFyZ2V0LT50ZmxhZ3MgJj0gfk1QVF9UQVJHRVRfRkxBR1NfUV9ZRVM7CisJfSBlbHNlIHsKKwkJaWYgKHRhcmdldC0+aW5xX2RhdGFbN10gJiAweDIwKSB7CisJCQl3aWR0aCA9IDE7CisJCX0KKworCQlpZiAodGFyZ2V0LT5pbnFfZGF0YVs3XSAmIDB4MTApIHsKKwkJCWZhY3RvciA9IHBzcGlfZGF0YS0+bWluU3luY0ZhY3RvcjsKKwkJCWlmICh0YXJnZXQtPnRmbGFncyAmIE1QVF9UQVJHRVRfRkxBR1NfVkFMSURfNTYpIHsKKwkJCQkvKiBiaXRzIDIgJiAzIHNob3cgQ2xvY2tpbmcgc3VwcG9ydCAqLworCQkJCWlmICgoYnl0ZTU2ICYgMHgwQykgPT0gMCkKKwkJCQkJZmFjdG9yID0gTVBUX1VMVFJBMjsKKwkJCQllbHNlIHsKKwkJCQkJaWYgKChieXRlNTYgJiAweDAzKSA9PSAwKQorCQkJCQkJZmFjdG9yID0gTVBUX1VMVFJBMTYwOworCQkJCQllbHNlIHsKKwkJCQkJCWZhY3RvciA9IE1QVF9VTFRSQTMyMDsKKwkJCQkJCWlmIChieXRlNTYgJiAweDAyKQorCQkJCQkJeworCQkJCQkJCWRkdnRwcmludGsoKEtFUk5fSU5GTyAiRW5hYmxpbmcgUUFTIGR1ZSB0byBieXRlNTY9JTAyeCBvbiBpZD0lZCFcbiIsIGJ5dGU1NiwgaWQpKTsKKwkJCQkJCQlub1FhcyA9IDA7CisJCQkJCQl9CisJCQkJCQlpZiAodGFyZ2V0LT5pbnFfZGF0YVswXSA9PSBUWVBFX1RBUEUpIHsKKwkJCQkJCQlpZiAoYnl0ZTU2ICYgMHgwMSkKKwkJCQkJCQkJdGFyZ2V0LT5uZWdvRmxhZ3MgfD0gTVBUX1RBUEVfTkVHT19JRFA7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWRkdnRwcmludGsoKEtFUk5fSU5GTyAiRW5hYmxpbmcgUUFTIG9uIGlkPSVkIGR1ZSB0byB+VEFSR0VUX0ZMQUdTX1ZBTElEXzU2IVxuIiwgaWQpKTsKKwkJCQlub1FhcyA9IDA7CisJCQl9CisJCQkJCisJCQlvZmZzZXQgPSBwc3BpX2RhdGEtPm1heFN5bmNPZmZzZXQ7CisKKwkJCS8qIElmIFJBSUQsIG5ldmVyIGRpc2FibGUgUUFTCisJCQkgKiBlbHNlIGlmIG5vbiBSQUlELCBkbyBub3QgZGlzYWJsZQorCQkJICogICBRQVMgaWYgYml0IDEgaXMgc2V0CisJCQkgKiBiaXQgMSBRQVMgc3VwcG9ydCwgbm9uLXJhaWQgb25seQorCQkJICogYml0IDAgSVUgc3VwcG9ydAorCQkJICovCisJCQlpZiAodGFyZ2V0LT5yYWlkVm9sdW1lID09IDEpIHsKKwkJCQlub1FhcyA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlmYWN0b3IgPSBNUFRfQVNZTkM7CisJCQlvZmZzZXQgPSAwOworCQl9CisJfQorCisJaWYgKCAodGFyZ2V0LT5pbnFfZGF0YVs3XSAmIDB4MDIpID09IDApIHsKKwkJdGFyZ2V0LT50ZmxhZ3MgJj0gfk1QVF9UQVJHRVRfRkxBR1NfUV9ZRVM7CisJfQorCisJLyogVXBkYXRlIHRmbGFncyBiYXNlZCBvbiBOVlJBTSBzZXR0aW5ncy4gKFNDU0kgb25seSkKKwkgKi8KKwlpZiAocHNwaV9kYXRhLT5udnJhbSAmJiAocHNwaV9kYXRhLT5udnJhbVtpZF0gIT0gTVBUX0hPU1RfTlZSQU1fSU5WQUxJRCkpIHsKKwkJbnZyYW0gPSBwc3BpX2RhdGEtPm52cmFtW2lkXTsKKwkJbmZhY3RvciA9IChudnJhbSAmIE1QVF9OVlJBTV9TWU5DX01BU0spID4+IDg7CisKKwkJaWYgKHdpZHRoKQorCQkJd2lkdGggPSBudnJhbSAmIE1QVF9OVlJBTV9XSURFX0RJU0FCTEUgPyAwIDogMTsKKworCQlpZiAob2Zmc2V0ID4gMCkgeworCQkJLyogRW5zdXJlIGZhY3RvciBpcyBzZXQgdG8gdGhlCisJCQkgKiBtYXhpbXVtIG9mOiBhZGFwdGVyLCBudnJhbSwgaW5xdWlyeQorCQkJICovCisJCQlpZiAobmZhY3RvcikgeworCQkJCWlmIChuZmFjdG9yIDwgcHNwaV9kYXRhLT5taW5TeW5jRmFjdG9yICkKKwkJCQkJbmZhY3RvciA9IHBzcGlfZGF0YS0+bWluU3luY0ZhY3RvcjsKKworCQkJCWZhY3RvciA9IG1heChmYWN0b3IsIG5mYWN0b3IpOworCQkJCWlmIChmYWN0b3IgPT0gTVBUX0FTWU5DKQorCQkJCQlvZmZzZXQgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlvZmZzZXQgPSAwOworCQkJCWZhY3RvciA9IE1QVF9BU1lOQzsKKwkJfQorCQl9IGVsc2UgeworCQkJZmFjdG9yID0gTVBUX0FTWU5DOworCQl9CisJfQorCisJLyogTWFrZSBzdXJlIGRhdGEgaXMgY29uc2lzdGVudAorCSAqLworCWlmICgoIXdpZHRoKSAmJiAoZmFjdG9yIDwgTVBUX1VMVFJBMikpIHsKKwkJZmFjdG9yID0gTVBUX1VMVFJBMjsKKwl9CisKKwkvKiBTYXZlIHRoZSBkYXRhIHRvIHRoZSB0YXJnZXQgc3RydWN0dXJlLgorCSAqLworCXRhcmdldC0+bWluU3luY0ZhY3RvciA9IGZhY3RvcjsKKwl0YXJnZXQtPm1heE9mZnNldCA9IG9mZnNldDsKKwl0YXJnZXQtPm1heFdpZHRoID0gd2lkdGg7CisKKwl0YXJnZXQtPnRmbGFncyB8PSBNUFRfVEFSR0VUX0ZMQUdTX1ZBTElEX05FR087CisKKwkvKiBEaXNhYmxlIHVudXNlZCBmZWF0dXJlcy4KKwkgKi8KKwlpZiAoIXdpZHRoKQorCQl0YXJnZXQtPm5lZ29GbGFncyB8PSBNUFRfVEFSR0VUX05PX05FR09fV0lERTsKKworCWlmICghb2Zmc2V0KQorCQl0YXJnZXQtPm5lZ29GbGFncyB8PSBNUFRfVEFSR0VUX05PX05FR09fU1lOQzsKKworCWlmICggZmFjdG9yID4gTVBUX1VMVFJBMzIwICkKKwkJbm9RYXMgPSAwOworCisJLyogR0VNLCBwcm9jZXNzb3IgV09SS0FST1VORAorCSAqLworCWlmICgodGFyZ2V0LT5pbnFfZGF0YVswXSA9PSBUWVBFX1BST0NFU1NPUikgfHwgKHRhcmdldC0+aW5xX2RhdGFbMF0gPiAweDA4KSkgeworCQl0YXJnZXQtPm5lZ29GbGFncyB8PSAoTVBUX1RBUkdFVF9OT19ORUdPX1dJREUgfCBNUFRfVEFSR0VUX05PX05FR09fU1lOQyk7CisJCXBzcGlfZGF0YS0+ZHZTdGF0dXNbaWRdIHw9IE1QVF9TQ1NJQ0ZHX0JMS19ORUdPOworCX0gZWxzZSB7CisJCWlmIChub1FhcyAmJiAocHNwaV9kYXRhLT5ub1FhcyA9PSAwKSkgeworCQkJcHNwaV9kYXRhLT5ub1FhcyB8PSBNUFRfVEFSR0VUX05PX05FR09fUUFTOworCQkJdGFyZ2V0LT5uZWdvRmxhZ3MgfD0gTVBUX1RBUkdFVF9OT19ORUdPX1FBUzsKKworCQkJLyogRGlzYWJsZSBRQVMgaW4gYSBtaXhlZCBjb25maWd1cmF0aW9uIGNhc2UKKwkgCQkqLworCisJCQlkZHZ0cHJpbnRrKChLRVJOX0lORk8gIkRpc2FibGluZyBRQVMgZHVlIHRvIG5vUWFzPSUwMnggb24gaWQ9JWQhXG4iLCBub1FhcywgaWQpKTsKKwkJCWZvciAoaWkgPSAwOyBpaSA8IGlkOyBpaSsrKSB7CisJCQkJaWYgKCAodmRldiA9IGhkLT5UYXJnZXRzW2lpXSkgKSB7CisJCQkJCXZkZXYtPm5lZ29GbGFncyB8PSBNUFRfVEFSR0VUX05PX05FR09fUUFTOworCQkJCQltcHRzY3NpaF93cml0ZVNEUDEoaGQsIDAsIGlpLCB2ZGV2LT5uZWdvRmxhZ3MpOworCQkJCX0JCisJCQl9CisJCX0KKwl9CisKKwkvKiBXcml0ZSBTRFAxIG9uIHRoaXMgSS9PIHRvIHRoaXMgdGFyZ2V0ICovCisJaWYgKHBzcGlfZGF0YS0+ZHZTdGF0dXNbaWRdICYgTVBUX1NDU0lDRkdfTkVHT1RJQVRFKSB7CisJCWRkdnRwcmludGsoKEtFUk5fSU5GTyAiTVBUX1NDU0lDRkdfTkVHT1RJQVRFIG9uIGlkPSVkIVxuIiwgaWQpKTsKKwkJbXB0c2NzaWhfd3JpdGVTRFAxKGhkLCAwLCBpZCwgaGQtPm5lZ29OdnJhbSk7CisJCXBzcGlfZGF0YS0+ZHZTdGF0dXNbaWRdICY9IH5NUFRfU0NTSUNGR19ORUdPVElBVEU7CisJfSBlbHNlIGlmIChwc3BpX2RhdGEtPmR2U3RhdHVzW2lkXSAmIE1QVF9TQ1NJQ0ZHX0JMS19ORUdPKSB7CisJCWRkdnRwcmludGsoKEtFUk5fSU5GTyAiTVBUX1NDU0lDRkdfQkxLX05FR08gb24gaWQ9JWQhXG4iLCBpZCkpOworCQltcHRzY3NpaF93cml0ZVNEUDEoaGQsIDAsIGlkLCBNUFRfU0NTSUNGR19CTEtfTkVHTyk7CisJCXBzcGlfZGF0YS0+ZHZTdGF0dXNbaWRdICY9IH5NUFRfU0NTSUNGR19CTEtfTkVHTzsKKwl9Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qIElmIERWIGRpc2FibGVkIChuZWdvTnZyYW0gc2V0IHRvIFVTRV9OVkFSTSkgb3IgaWYgbm90IExVTiAwLCByZXR1cm4uCisgKiBFbHNlIHNldCB0aGUgTkVFRF9EViBmbGFnIGFmdGVyIFJlYWQgQ2FwYWNpdHkgSXNzdWVkIChkaXNrcykKKyAqIG9yIE1vZGUgU2Vuc2UgKGNkcm9tcykuCisgKgorICogVGFwZXMsIGluaXRUYXJnZXQgd2lsbCBzZXQgdGhpcyBmbGFnIG9uIGNvbXBsZXRpb24gb2YgSW5xdWlyeSBjb21tYW5kLgorICogQ2FsbGVkIG9ubHkgaWYgRFZfTk9UX0RPTkUgZmxhZyBpcyBzZXQKKyAqLworc3RhdGljIHZvaWQgbXB0c2NzaWhfc2V0X2R2ZmxhZ3MoTVBUX1NDU0lfSE9TVCAqaGQsIFNDU0lJT1JlcXVlc3RfdCAqcFJlcSkKK3sKKwl1OCBjbWQ7CisJU2NzaUNmZ0RhdGEgKnBTcGk7CisKKwlkZHZ0cHJpbnRrKCgiIHNldF9kdmZsYWdzOiBpZD0lZCBsdW49JWQgbmVnb052cmFtPSV4IGNtZD0leFxuIiwgCisJCXBSZXEtPlRhcmdldElELCBwUmVxLT5MVU5bMV0sIGhkLT5uZWdvTnZyYW0sIHBSZXEtPkNEQlswXSkpOworCQorCWlmICgocFJlcS0+TFVOWzFdICE9IDApIHx8IChoZC0+bmVnb052cmFtICE9IDApKQorCQlyZXR1cm47CisKKwljbWQgPSBwUmVxLT5DREJbMF07CisKKwlpZiAoKGNtZCA9PSBSRUFEX0NBUEFDSVRZKSB8fCAoY21kID09IE1PREVfU0VOU0UpKSB7CisJCXBTcGkgPSAmaGQtPmlvYy0+c3BpX2RhdGE7CisJCWlmICgocFNwaS0+aXNSYWlkICYgKDEgPDwgcFJlcS0+VGFyZ2V0SUQpKSAmJiBwU3BpLT5wSW9jUGczKSB7CisJCQkvKiBTZXQgTkVFRF9EViBmb3IgYWxsIGhpZGRlbiBkaXNrcworCQkJICovCisJCQlJb2MzUGh5c0Rpc2tfdCAqcFBEaXNrID0gIHBTcGktPnBJb2NQZzMtPlBoeXNEaXNrOworCQkJaW50CQludW1QRGlzayA9IHBTcGktPnBJb2NQZzMtPk51bVBoeXNEaXNrczsKKworCQkJd2hpbGUgKG51bVBEaXNrKSB7CisJCQkJcFNwaS0+ZHZTdGF0dXNbcFBEaXNrLT5QaHlzRGlza0lEXSB8PSBNUFRfU0NTSUNGR19ORUVEX0RWOworCQkJCWRkdnRwcmludGsoKCJORUVEX0RWIHNldCBmb3IgcGh5cyBkaXNrIGlkICVkXG4iLCBwUERpc2stPlBoeXNEaXNrSUQpKTsKKwkJCQlwUERpc2srKzsKKwkJCQludW1QRGlzay0tOworCQkJfQorCQl9CisJCXBTcGktPmR2U3RhdHVzW3BSZXEtPlRhcmdldElEXSB8PSBNUFRfU0NTSUNGR19ORUVEX0RWOworCQlkZHZ0cHJpbnRrKCgiTkVFRF9EViBzZXQgZm9yIHZpc2libGUgZGlzayBpZCAlZFxuIiwgcFJlcS0+VGFyZ2V0SUQpKTsKKwl9Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKiBJZiBubyBUYXJnZXQsIGJ1cyByZXNldCBvbiAxc3QgSS9PLiBTZXQgdGhlIGZsYWcgdG8KKyAqIHByZXZlbnQgYW55IGZ1dHVyZSBuZWdvdGlhdGlvbnMgdG8gdGhpcyBkZXZpY2UuCisgKi8KK3N0YXRpYyB2b2lkIG1wdHNjc2loX25vX25lZ290aWF0ZShNUFRfU0NTSV9IT1NUICpoZCwgaW50IHRhcmdldF9pZCkKK3sKKworCWlmICgoaGQtPlRhcmdldHMpICYmIChoZC0+VGFyZ2V0c1t0YXJnZXRfaWRdID09IE5VTEwpKQorCQloZC0+aW9jLT5zcGlfZGF0YS5kdlN0YXR1c1t0YXJnZXRfaWRdIHw9IE1QVF9TQ1NJQ0ZHX0JMS19ORUdPOworCisJcmV0dXJuOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICogIFNDU0kgQ29uZmlnIFBhZ2UgZnVuY3Rpb25hbGl0eSAuLi4KKyAqLworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoJbXB0c2NzaWhfc2V0RGV2aWNlUGFnZTFGbGFncyAgLSBhZGQgUmVxdWVzdGVkIGFuZCBDb25maWd1cmF0aW9uIGZpZWxkcyBmbGFncworICoJYmFzZWQgb24gd2lkdGgsIGZhY3RvciBhbmQgb2Zmc2V0IHBhcmFtZXRlcnMuCisgKglAd2lkdGg6IGJ1cyB3aWR0aAorICoJQGZhY3Rvcjogc3luYyBmYWN0b3IKKyAqCUBvZmZzZXQ6IHN5bmMgb2Zmc2V0CisgKglAcmVxdWVzdGVkUHRyOiBwb2ludGVyIHRvIHJlcXVlc3RlZCB2YWx1ZXMgKHVwZGF0ZWQpCisgKglAY29uZmlndXJhdGlvblB0cjogcG9pbnRlciB0byBjb25maWd1cmF0aW9uIHZhbHVlcyAodXBkYXRlZCkKKyAqCUBmbGFnczogZmxhZ3MgdG8gYmxvY2sgV0RUUiBvciBTRFRSIG5lZ290aWF0aW9uCisgKgorICoJUmV0dXJuOiBOb25lLgorICoKKyAqCVJlbWFyazogQ2FsbGVkIGJ5IHdyaXRlU0RQMSBhbmQgX2R2X3BhcmFtcworICovCitzdGF0aWMgdm9pZAorbXB0c2NzaWhfc2V0RGV2aWNlUGFnZTFGbGFncyAodTggd2lkdGgsIHU4IGZhY3RvciwgdTggb2Zmc2V0LCBpbnQgKnJlcXVlc3RlZFB0ciwgaW50ICpjb25maWd1cmF0aW9uUHRyLCB1OCBmbGFncykKK3sKKwl1OCBub3dpZGUgPSBmbGFncyAmIE1QVF9UQVJHRVRfTk9fTkVHT19XSURFOworCXU4IG5vc3luYyA9IGZsYWdzICYgTVBUX1RBUkdFVF9OT19ORUdPX1NZTkM7CisKKwkqY29uZmlndXJhdGlvblB0ciA9IDA7CisJKnJlcXVlc3RlZFB0ciA9IHdpZHRoID8gTVBJX1NDU0lERVZQQUdFMV9SUF9XSURFIDogMDsKKwkqcmVxdWVzdGVkUHRyIHw9IChvZmZzZXQgPDwgMTYpIHwgKGZhY3RvciA8PCA4KTsKKworCWlmICh3aWR0aCAmJiBvZmZzZXQgJiYgIW5vd2lkZSAmJiAhbm9zeW5jKSB7CisJCWlmIChmYWN0b3IgPCBNUFRfVUxUUkExNjApIHsKKwkJCSpyZXF1ZXN0ZWRQdHIgfD0gKE1QSV9TQ1NJREVWUEFHRTFfUlBfSVUgKyBNUElfU0NTSURFVlBBR0UxX1JQX0RUKTsKKwkJCWlmICgoZmxhZ3MgJiBNUFRfVEFSR0VUX05PX05FR09fUUFTKSA9PSAwKQorCQkJCSpyZXF1ZXN0ZWRQdHIgfD0gTVBJX1NDU0lERVZQQUdFMV9SUF9RQVM7CisJCQlpZiAoZmxhZ3MgJiBNUFRfVEFQRV9ORUdPX0lEUCkKKwkJCQkqcmVxdWVzdGVkUHRyIHw9IDB4MDgwMDAwMDA7CisJCX0gZWxzZSBpZiAoZmFjdG9yIDwgTVBUX1VMVFJBMikgeworCQkJKnJlcXVlc3RlZFB0ciB8PSBNUElfU0NTSURFVlBBR0UxX1JQX0RUOworCQl9CisJfQorCisJaWYgKG5vd2lkZSkKKwkJKmNvbmZpZ3VyYXRpb25QdHIgfD0gTVBJX1NDU0lERVZQQUdFMV9DT05GX1dEVFJfRElTQUxMT1dFRDsKKworCWlmIChub3N5bmMpCisJCSpjb25maWd1cmF0aW9uUHRyIHw9IE1QSV9TQ1NJREVWUEFHRTFfQ09ORl9TRFRSX0RJU0FMTE9XRUQ7CisKKwlyZXR1cm47Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCW1wdHNjc2loX3dyaXRlU0RQMSAgLSB3cml0ZSBTQ1NJIERldmljZSBQYWdlIDEKKyAqCUBoZDogUG9pbnRlciB0byBhIFNDU0kgSG9zdCBTdHJ1Y3V0cmUKKyAqCUBwb3J0bnVtOiBJT0MgcG9ydCBudW1iZXIKKyAqCUB0YXJnZXRfaWQ6IHdyaXRlU0RQMSBmb3Igc2luZ2xlIElECisgKglAZmxhZ3M6IE1QVF9TQ1NJQ0ZHX0FMTF9JRFMsIE1QVF9TQ1NJQ0ZHX1VTRV9OVlJBTSwgTVBUX1NDU0lDRkdfQkxLX05FR08KKyAqCisgKglSZXR1cm46IC1FRkFVTFQgaWYgcmVhZCBvZiBjb25maWcgcGFnZSBoZWFkZXIgZmFpbHMKKyAqCQlvciAwIGlmIHN1Y2Nlc3MuCisgKgorICoJUmVtYXJrOiBJZiBhIHRhcmdldCBoYXMgYmVlbiBmb3VuZCwgdGhlIHNldHRpbmdzIGZyb20gdGhlCisgKgkJdGFyZ2V0IHN0cnVjdHVyZSBhcmUgdXNlZCwgZWxzZSB0aGUgZGV2aWNlIGlzIHNldAorICoJCXRvIGFzeW5jL25hcnJvdy4KKyAqCisgKglSZW1hcms6IENhbGxlZCBkdXJpbmcgaW5pdCBhbmQgYWZ0ZXIgYSBGVyByZWxvYWQuCisgKglSZW1hcms6IFdlIGRvIG5vdCB3YWl0IGZvciBhIHJldHVybiwgd3JpdGUgcGFnZXMgc2VxdWVudGlhbGx5LgorICovCitzdGF0aWMgaW50CittcHRzY3NpaF93cml0ZVNEUDEoTVBUX1NDU0lfSE9TVCAqaGQsIGludCBwb3J0bnVtLCBpbnQgdGFyZ2V0X2lkLCBpbnQgZmxhZ3MpCit7CisJTVBUX0FEQVBURVIJCSppb2MgPSBoZC0+aW9jOworCUNvbmZpZ190CQkqcFJlcTsKKwlTQ1NJRGV2aWNlUGFnZTFfdAkqcERhdGE7CisJVmlydERldmljZQkJKnBUYXJnZXQ7CisJTVBUX0ZSQU1FX0hEUgkJKm1mOworCWRtYV9hZGRyX3QJCSBkYXRhRG1hOworCXUxNgkJCSByZXFfaWR4OworCXUzMgkJCSBmcmFtZU9mZnNldDsKKwl1MzIJCQkgcmVxdWVzdGVkLCBjb25maWd1cmF0aW9uLCBmbGFnc0xlbmd0aDsKKwlpbnQJCQkgaWksIG52cmFtOworCWludAkJCSBpZCA9IDAsIG1heGlkID0gMDsKKwl1OAkJCSB3aWR0aDsKKwl1OAkJCSBmYWN0b3I7CisJdTgJCQkgb2Zmc2V0OworCXU4CQkJIGJ1cyA9IDA7CisJdTgJCQkgbmVnb0ZsYWdzOworCXU4CQkJIG1heHdpZHRoLCBtYXhvZmZzZXQsIG1heGZhY3RvcjsKKworCWlmIChpb2MtPnNwaV9kYXRhLnNkcDFsZW5ndGggPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZmxhZ3MgJiBNUFRfU0NTSUNGR19BTExfSURTKSB7CisJCWlkID0gMDsKKwkJbWF4aWQgPSBpb2MtPnNoLT5tYXhfaWQgLSAxOworCX0gZWxzZSBpZiAoaW9jLT5zaCkgeworCQlpZCA9IHRhcmdldF9pZDsKKwkJbWF4aWQgPSBtaW5fdChpbnQsIGlkLCBpb2MtPnNoLT5tYXhfaWQgLSAxKTsKKwl9CisKKwlmb3IgKDsgaWQgPD0gbWF4aWQ7IGlkKyspIHsKKworCQlpZiAoaWQgPT0gaW9jLT5wZmFjdHNbcG9ydG51bV0uUG9ydFNDU0lJRCkKKwkJCWNvbnRpbnVlOworCisJCS8qIFVzZSBOVlJBTSB0byBnZXQgYWRhcHRlciBhbmQgdGFyZ2V0IG1heGltdW1zCisJCSAqIERhdGEgb3Zlci1yaWRlbiBieSB0YXJnZXQgc3RydWN0dXJlIGluZm9ybWF0aW9uLCBpZiBwcmVzZW50CisJCSAqLworCQltYXh3aWR0aCA9IGlvYy0+c3BpX2RhdGEubWF4QnVzV2lkdGg7CisJCW1heG9mZnNldCA9IGlvYy0+c3BpX2RhdGEubWF4U3luY09mZnNldDsKKwkJbWF4ZmFjdG9yID0gaW9jLT5zcGlfZGF0YS5taW5TeW5jRmFjdG9yOworCQlpZiAoaW9jLT5zcGlfZGF0YS5udnJhbSAmJiAoaW9jLT5zcGlfZGF0YS5udnJhbVtpZF0gIT0gTVBUX0hPU1RfTlZSQU1fSU5WQUxJRCkpIHsKKwkJCW52cmFtID0gaW9jLT5zcGlfZGF0YS5udnJhbVtpZF07CisKKwkJCWlmIChtYXh3aWR0aCkKKwkJCQltYXh3aWR0aCA9IG52cmFtICYgTVBUX05WUkFNX1dJREVfRElTQUJMRSA/IDAgOiAxOworCisJCQlpZiAobWF4b2Zmc2V0ID4gMCkgeworCQkJCW1heGZhY3RvciA9IChudnJhbSAmIE1QVF9OVlJBTV9TWU5DX01BU0spID4+IDg7CisJCQkJaWYgKG1heGZhY3RvciA9PSAwKSB7CisJCQkJCS8qIEtleSBmb3IgYXN5bmMgKi8KKwkJCQkJbWF4ZmFjdG9yID0gTVBUX0FTWU5DOworCQkJCQltYXhvZmZzZXQgPSAwOworCQkJCX0gZWxzZSBpZiAobWF4ZmFjdG9yIDwgaW9jLT5zcGlfZGF0YS5taW5TeW5jRmFjdG9yKSB7CisJCQkJCW1heGZhY3RvciA9IGlvYy0+c3BpX2RhdGEubWluU3luY0ZhY3RvcjsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQltYXhmYWN0b3IgPSBNUFRfQVNZTkM7CisJCX0KKworCQkvKiBTZXQgdGhlIG5lZ290aWF0aW9uIGZsYWdzLgorCQkgKi8KKwkJbmVnb0ZsYWdzID0gaW9jLT5zcGlfZGF0YS5ub1FhczsKKwkJaWYgKCFtYXh3aWR0aCkKKwkJCW5lZ29GbGFncyB8PSBNUFRfVEFSR0VUX05PX05FR09fV0lERTsKKworCQlpZiAoIW1heG9mZnNldCkKKwkJCW5lZ29GbGFncyB8PSBNUFRfVEFSR0VUX05PX05FR09fU1lOQzsKKworCQlpZiAoZmxhZ3MgJiBNUFRfU0NTSUNGR19VU0VfTlZSQU0pIHsKKwkJCXdpZHRoID0gbWF4d2lkdGg7CisJCQlmYWN0b3IgPSBtYXhmYWN0b3I7CisJCQlvZmZzZXQgPSBtYXhvZmZzZXQ7CisJCX0gZWxzZSB7CisJCQl3aWR0aCA9IDA7CisJCQlmYWN0b3IgPSBNUFRfQVNZTkM7CisJCQlvZmZzZXQgPSAwOworCQkJLy9uZWdvRmxhZ3MgPSAwOworCQkJLy9uZWdvRmxhZ3MgPSBNUFRfVEFSR0VUX05PX05FR09fU1lOQzsKKwkJfQorCisJCS8qIElmIGlkIGlzIG5vdCBhIHJhaWQgdm9sdW1lLCBnZXQgdGhlIHVwZGF0ZWQKKwkJICogdHJhbnNtaXNzaW9uIHNldHRpbmdzIGZyb20gdGhlIHRhcmdldCBzdHJ1Y3R1cmUuCisJCSAqLworCQlpZiAoaGQtPlRhcmdldHMgJiYgKHBUYXJnZXQgPSBoZC0+VGFyZ2V0c1tpZF0pICYmICFwVGFyZ2V0LT5yYWlkVm9sdW1lKSB7CisJCQl3aWR0aCA9IHBUYXJnZXQtPm1heFdpZHRoOworCQkJZmFjdG9yID0gcFRhcmdldC0+bWluU3luY0ZhY3RvcjsKKwkJCW9mZnNldCA9IHBUYXJnZXQtPm1heE9mZnNldDsKKwkJCW5lZ29GbGFncyA9IHBUYXJnZXQtPm5lZ29GbGFnczsKKwkJfQorCQkKKyNpZmRlZiBNUFRTQ1NJSF9FTkFCTEVfRE9NQUlOX1ZBTElEQVRJT04KKwkJLyogRm9yY2UgdG8gYXN5bmMgYW5kIG5hcnJvdyBpZiBEViBoYXMgbm90IGJlZW4gZXhlY3V0ZWQKKwkJICogZm9yIHRoaXMgSUQKKwkJICovCisJCWlmICgoaGQtPmlvYy0+c3BpX2RhdGEuZHZTdGF0dXNbaWRdICYgTVBUX1NDU0lDRkdfRFZfTk9UX0RPTkUpICE9IDApIHsKKwkJCXdpZHRoID0gMDsKKwkJCWZhY3RvciA9IE1QVF9BU1lOQzsKKwkJCW9mZnNldCA9IDA7CisJCX0KKyNlbmRpZgorCisJCWlmIChmbGFncyAmIE1QVF9TQ1NJQ0ZHX0JMS19ORUdPKQorCQkJbmVnb0ZsYWdzID0gTVBUX1RBUkdFVF9OT19ORUdPX1dJREUgfCBNUFRfVEFSR0VUX05PX05FR09fU1lOQzsKKworCQltcHRzY3NpaF9zZXREZXZpY2VQYWdlMUZsYWdzKHdpZHRoLCBmYWN0b3IsIG9mZnNldCwKKwkJCQkJJnJlcXVlc3RlZCwgJmNvbmZpZ3VyYXRpb24sIG5lZ29GbGFncyk7CisJCWRuZWdvcHJpbnRrKCgid3JpdGVTRFAxOiBpZD0lZCB3aWR0aD0lZCBmYWN0b3I9JXggb2Zmc2V0PSV4IG5lZ29GbGFncz0leCByZXF1ZXN0PSV4IGNvbmZpZz0leFxuIiwKKwkJCXRhcmdldF9pZCwgd2lkdGgsIGZhY3Rvciwgb2Zmc2V0LCBuZWdvRmxhZ3MsIHJlcXVlc3RlZCwgY29uZmlndXJhdGlvbikpOworCisJCS8qIEdldCBhIE1GIGZvciB0aGlzIGNvbW1hbmQuCisJCSAqLworCQlpZiAoKG1mID0gbXB0X2dldF9tc2dfZnJhbWUoU2NzaURvbmVDdHgsIGlvYykpID09IE5VTEwpIHsKKwkJCWRwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIndyaXRlIFNEUDE6IG5vIG1zZyBmcmFtZXMhXG4iLAorCQkJCQkJaW9jLT5uYW1lKSk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCisJCWRkdnByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiV3JpdGVTRFAxIChtZj0lcCwgaWQ9JWQsIHJlcT0weCV4LCBjZmc9MHgleClcbiIsCisJCQloZC0+aW9jLT5uYW1lLCBtZiwgaWQsIHJlcXVlc3RlZCwgY29uZmlndXJhdGlvbikpOworCisKKwkJLyogU2V0IHRoZSByZXF1ZXN0IGFuZCB0aGUgZGF0YSBwb2ludGVycy4KKwkJICogUmVxdWVzdCB0YWtlczogMzYgYnl0ZXMgKDMyIGJpdCBTR0UpCisJCSAqIFNDU0kgRGV2aWNlIFBhZ2UgMSByZXF1aXJlcyAxNiBieXRlcworCQkgKiA0MCArIDE2IDw9IHNpemUgb2YgU0NTSSBJTyBSZXF1ZXN0ID0gNTYgYnl0ZXMKKwkJICogYW5kIE1GIHNpemUgPj0gNjQgYnl0ZXMuCisJCSAqIFBsYWNlIGRhdGEgYXQgZW5kIG9mIE1GLgorCQkgKi8KKwkJcFJlcSA9IChDb25maWdfdCAqKW1mOworCisJCXJlcV9pZHggPSBsZTE2X3RvX2NwdShtZi0+dS5mcmFtZS5od2hkci5tc2djdHh1LmZsZC5yZXFfaWR4KTsKKwkJZnJhbWVPZmZzZXQgPSBpb2MtPnJlcV9zeiAtIHNpemVvZihTQ1NJRGV2aWNlUGFnZTFfdCk7CisKKwkJcERhdGEgPSAoU0NTSURldmljZVBhZ2UxX3QgKikoKHU4ICopIG1mICsgZnJhbWVPZmZzZXQpOworCQlkYXRhRG1hID0gaW9jLT5yZXFfZnJhbWVzX2RtYSArIChyZXFfaWR4ICogaW9jLT5yZXFfc3opICsgZnJhbWVPZmZzZXQ7CisKKwkJLyogQ29tcGxldGUgdGhlIHJlcXVlc3QgZnJhbWUgKHNhbWUgZm9yIGFsbCByZXF1ZXN0cykuCisJCSAqLworCQlwUmVxLT5BY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX1dSSVRFX0NVUlJFTlQ7CisJCXBSZXEtPlJlc2VydmVkID0gMDsKKwkJcFJlcS0+Q2hhaW5PZmZzZXQgPSAwOworCQlwUmVxLT5GdW5jdGlvbiA9IE1QSV9GVU5DVElPTl9DT05GSUc7CisJCXBSZXEtPkV4dFBhZ2VMZW5ndGggPSAwOworCQlwUmVxLT5FeHRQYWdlVHlwZSA9IDA7CisJCXBSZXEtPk1zZ0ZsYWdzID0gMDsKKwkJZm9yIChpaT0wOyBpaSA8IDg7IGlpKyspIHsKKwkJCXBSZXEtPlJlc2VydmVkMltpaV0gPSAwOworCQl9CisJCXBSZXEtPkhlYWRlci5QYWdlVmVyc2lvbiA9IGlvYy0+c3BpX2RhdGEuc2RwMXZlcnNpb247CisJCXBSZXEtPkhlYWRlci5QYWdlTGVuZ3RoID0gaW9jLT5zcGlfZGF0YS5zZHAxbGVuZ3RoOworCQlwUmVxLT5IZWFkZXIuUGFnZU51bWJlciA9IDE7CisJCXBSZXEtPkhlYWRlci5QYWdlVHlwZSA9IE1QSV9DT05GSUdfUEFHRVRZUEVfU0NTSV9ERVZJQ0U7CisJCXBSZXEtPlBhZ2VBZGRyZXNzID0gY3B1X3RvX2xlMzIoaWQgfCAoYnVzIDw8IDggKSk7CisKKwkJLyogQWRkIGEgU0dFIHRvIHRoZSBjb25maWcgcmVxdWVzdC4KKwkJICovCisJCWZsYWdzTGVuZ3RoID0gTVBUX1NHRV9GTEFHU19TU0lNUExFX1dSSVRFIHwgaW9jLT5zcGlfZGF0YS5zZHAxbGVuZ3RoICogNDsKKworCQltcHRfYWRkX3NnZSgoY2hhciAqKSZwUmVxLT5QYWdlQnVmZmVyU0dFLCBmbGFnc0xlbmd0aCwgZGF0YURtYSk7CisKKwkJLyogU2V0IHVwIHRoZSBjb21tb24gZGF0YSBwb3J0aW9uCisJCSAqLworCQlwRGF0YS0+SGVhZGVyLlBhZ2VWZXJzaW9uID0gcFJlcS0+SGVhZGVyLlBhZ2VWZXJzaW9uOworCQlwRGF0YS0+SGVhZGVyLlBhZ2VMZW5ndGggPSBwUmVxLT5IZWFkZXIuUGFnZUxlbmd0aDsKKwkJcERhdGEtPkhlYWRlci5QYWdlTnVtYmVyID0gcFJlcS0+SGVhZGVyLlBhZ2VOdW1iZXI7CisJCXBEYXRhLT5IZWFkZXIuUGFnZVR5cGUgPSBwUmVxLT5IZWFkZXIuUGFnZVR5cGU7CisJCXBEYXRhLT5SZXF1ZXN0ZWRQYXJhbWV0ZXJzID0gY3B1X3RvX2xlMzIocmVxdWVzdGVkKTsKKwkJcERhdGEtPlJlc2VydmVkID0gMDsKKwkJcERhdGEtPkNvbmZpZ3VyYXRpb24gPSBjcHVfdG9fbGUzMihjb25maWd1cmF0aW9uKTsKKworCQlkcHJpbnRrKChNWUlPQ19zX0lORk9fRk1UCisJCQkid3JpdGUgU0RQMTogaWQgJWQgcGdhZGRyIDB4JXggcmVxIDB4JXggY29uZmlnIDB4JXhcbiIsCisJCQkJaW9jLT5uYW1lLCBpZCwgKGlkIHwgKGJ1czw8OCkpLAorCQkJCXJlcXVlc3RlZCwgY29uZmlndXJhdGlvbikpOworCisJCW1wdF9wdXRfbXNnX2ZyYW1lKFNjc2lEb25lQ3R4LCBpb2MsIG1mKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoJbXB0c2NzaWhfd3JpdGVJT0NQYWdlNCAgLSB3cml0ZSBJT0MgUGFnZSA0CisgKglAaGQ6IFBvaW50ZXIgdG8gYSBTQ1NJIEhvc3QgU3RydWN0dXJlCisgKglAdGFyZ2V0X2lkOiB3cml0ZSBJT0MgUGFnZTQgZm9yIHRoaXMgSUQgJiBCdXMKKyAqCisgKglSZXR1cm46IC1FQUdBSU4gaWYgdW5hYmxlIHRvIG9idGFpbiBhIE1lc3NhZ2UgRnJhbWUKKyAqCQlvciAwIGlmIHN1Y2Nlc3MuCisgKgorICoJUmVtYXJrOiBXZSBkbyBub3Qgd2FpdCBmb3IgYSByZXR1cm4sIHdyaXRlIHBhZ2VzIHNlcXVlbnRpYWxseS4KKyAqLworc3RhdGljIGludAorbXB0c2NzaWhfd3JpdGVJT0NQYWdlNChNUFRfU0NTSV9IT1NUICpoZCwgaW50IHRhcmdldF9pZCwgaW50IGJ1cykKK3sKKwlNUFRfQURBUFRFUgkJKmlvYyA9IGhkLT5pb2M7CisJQ29uZmlnX3QJCSpwUmVxOworCUlPQ1BhZ2U0X3QJCSpJT0NQYWdlNFB0cjsKKwlNUFRfRlJBTUVfSERSCQkqbWY7CisJZG1hX2FkZHJfdAkJIGRhdGFEbWE7CisJdTE2CQkJIHJlcV9pZHg7CisJdTMyCQkJIGZyYW1lT2Zmc2V0OworCXUzMgkJCSBmbGFnc0xlbmd0aDsKKwlpbnQJCQkgaWk7CisKKwkvKiBHZXQgYSBNRiBmb3IgdGhpcyBjb21tYW5kLgorCSAqLworCWlmICgobWYgPSBtcHRfZ2V0X21zZ19mcmFtZShTY3NpRG9uZUN0eCwgaW9jKSkgPT0gTlVMTCkgeworCQlkcHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJ3cml0ZUlPQ1BhZ2U0IDogbm8gbXNnIGZyYW1lcyFcbiIsCisJCQkJCWlvYy0+bmFtZSkpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwkvKiBTZXQgdGhlIHJlcXVlc3QgYW5kIHRoZSBkYXRhIHBvaW50ZXJzLgorCSAqIFBsYWNlIGRhdGEgYXQgZW5kIG9mIE1GLgorCSAqLworCXBSZXEgPSAoQ29uZmlnX3QgKiltZjsKKworCXJlcV9pZHggPSBsZTE2X3RvX2NwdShtZi0+dS5mcmFtZS5od2hkci5tc2djdHh1LmZsZC5yZXFfaWR4KTsKKwlmcmFtZU9mZnNldCA9IGlvYy0+cmVxX3N6IC0gc2l6ZW9mKElPQ1BhZ2U0X3QpOworCisJLyogQ29tcGxldGUgdGhlIHJlcXVlc3QgZnJhbWUgKHNhbWUgZm9yIGFsbCByZXF1ZXN0cykuCisJICovCisJcFJlcS0+QWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9XUklURV9DVVJSRU5UOworCXBSZXEtPlJlc2VydmVkID0gMDsKKwlwUmVxLT5DaGFpbk9mZnNldCA9IDA7CisJcFJlcS0+RnVuY3Rpb24gPSBNUElfRlVOQ1RJT05fQ09ORklHOworCXBSZXEtPkV4dFBhZ2VMZW5ndGggPSAwOworCXBSZXEtPkV4dFBhZ2VUeXBlID0gMDsKKwlwUmVxLT5Nc2dGbGFncyA9IDA7CisJZm9yIChpaT0wOyBpaSA8IDg7IGlpKyspIHsKKwkJcFJlcS0+UmVzZXJ2ZWQyW2lpXSA9IDA7CisJfQorCisgICAgICAgCUlPQ1BhZ2U0UHRyID0gaW9jLT5zcGlfZGF0YS5wSW9jUGc0OworICAgICAgIAlkYXRhRG1hID0gaW9jLT5zcGlfZGF0YS5Jb2NQZzRfZG1hOworICAgICAgIAlpaSA9IElPQ1BhZ2U0UHRyLT5BY3RpdmVTRVArKzsKKyAgICAgICAJSU9DUGFnZTRQdHItPlNFUFtpaV0uU0VQVGFyZ2V0SUQgPSB0YXJnZXRfaWQ7CisgICAgICAgCUlPQ1BhZ2U0UHRyLT5TRVBbaWldLlNFUEJ1cyA9IGJ1czsKKyAgICAgICAJcFJlcS0+SGVhZGVyID0gSU9DUGFnZTRQdHItPkhlYWRlcjsKKwlwUmVxLT5QYWdlQWRkcmVzcyA9IGNwdV90b19sZTMyKHRhcmdldF9pZCB8IChidXMgPDwgOCApKTsKKworCS8qIEFkZCBhIFNHRSB0byB0aGUgY29uZmlnIHJlcXVlc3QuCisJICovCisJZmxhZ3NMZW5ndGggPSBNUFRfU0dFX0ZMQUdTX1NTSU1QTEVfV1JJVEUgfAorCQkoSU9DUGFnZTRQdHItPkhlYWRlci5QYWdlTGVuZ3RoICsgaWkpICogNDsKKworCW1wdF9hZGRfc2dlKChjaGFyICopJnBSZXEtPlBhZ2VCdWZmZXJTR0UsIGZsYWdzTGVuZ3RoLCBkYXRhRG1hKTsKKworCWRpbml0cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UCisJCSJ3cml0ZUlPQ1BhZ2U0OiBNYXhTRVA9JWQgQWN0aXZlU0VQPSVkIGlkPSVkIGJ1cz0lZFxuIiwKKwkJCWlvYy0+bmFtZSwgSU9DUGFnZTRQdHItPk1heFNFUCwgSU9DUGFnZTRQdHItPkFjdGl2ZVNFUCwgdGFyZ2V0X2lkLCBidXMpKTsKKworCW1wdF9wdXRfbXNnX2ZyYW1lKFNjc2lEb25lQ3R4LCBpb2MsIG1mKTsKKworCXJldHVybiAwOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKgorICogIEJ1cyBTY2FuIGFuZCBEb21haW4gVmFsaWRhdGlvbiBmdW5jdGlvbmFsaXR5IC4uLgorICovCisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCisgKgltcHRzY3NpaF9zY2FuZHZfY29tcGxldGUgLSBTY2FuIGFuZCBEViBjYWxsYmFjayByb3V0aW5lIHJlZ2lzdGVyZWQKKyAqCXRvIEZ1c3Rpb24gTVBUIChiYXNlKSBkcml2ZXIuCisgKgorICoJQGlvYzogUG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKKyAqCUBtZjogUG9pbnRlciB0byBvcmlnaW5hbCBNUFQgcmVxdWVzdCBmcmFtZQorICoJQG1yOiBQb2ludGVyIHRvIE1QVCByZXBseSBmcmFtZSAoTlVMTCBpZiBUdXJib1JlcGx5KQorICoKKyAqCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSBtcHQuYzo6bXB0X2ludGVycnVwdCgpIGF0IHRoZSBjb21wbGV0aW9uCisgKglvZiBhbnkgU0NTSSBJTyByZXF1ZXN0LgorICoJVGhpcyByb3V0aW5lIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgRnVzaW9uIE1QVCAoYmFzZSkgZHJpdmVyIGF0IGRyaXZlcgorICoJbG9hZC9pbml0IHRpbWUgdmlhIHRoZSBtcHRfcmVnaXN0ZXIoKSBBUEkgY2FsbC4KKyAqCisgKglSZXR1cm5zIDEgaW5kaWNhdGluZyBhbGxvYydkIHJlcXVlc3QgZnJhbWUgcHRyIHNob3VsZCBiZSBmcmVlZC4KKyAqCisgKglSZW1hcms6IFNldHMgYSBjb21wbGV0aW9uIGNvZGUgYW5kIChwb3NzaWJseSkgc2F2ZXMgc2Vuc2UgZGF0YQorICoJaW4gdGhlIElPQyBtZW1iZXIgbG9jYWxSZXBseSBzdHJ1Y3R1cmUuCisgKglVc2VkIE9OTFkgZm9yIERWIGFuZCBvdGhlciBpbnRlcm5hbCBjb21tYW5kcy4KKyAqLworc3RhdGljIGludAorbXB0c2NzaWhfc2NhbmR2X2NvbXBsZXRlKE1QVF9BREFQVEVSICppb2MsIE1QVF9GUkFNRV9IRFIgKm1mLCBNUFRfRlJBTUVfSERSICptcikKK3sKKwlNUFRfU0NTSV9IT1NUCSpoZDsKKwlTQ1NJSU9SZXF1ZXN0X3QgKnBSZXE7CisJaW50CQkgY29tcGxldGlvbkNvZGU7CisJdTE2CQkgcmVxX2lkeDsKKworCWlmICgobWYgPT0gTlVMTCkgfHwKKwkgICAgKG1mID49IE1QVF9JTkRFWF8yX01GUFRSKGlvYywgaW9jLT5yZXFfZGVwdGgpKSkgeworCQlwcmludGsoTVlJT0Nfc19FUlJfRk1UCisJCQkiU2NhbkR2Q29tcGxldGUsICVzIHJlcSBmcmFtZSBwdHIhICg9JXApXG4iLAorCQkJCWlvYy0+bmFtZSwgbWY/IkJBRCI6Ik5VTEwiLCAodm9pZCAqKSBtZik7CisJCWdvdG8gd2FrZXVwOworCX0KKworCWhkID0gKE1QVF9TQ1NJX0hPU1QgKikgaW9jLT5zaC0+aG9zdGRhdGE7CisJZGVsX3RpbWVyKCZoZC0+dGltZXIpOworCXJlcV9pZHggPSBsZTE2X3RvX2NwdShtZi0+dS5mcmFtZS5od2hkci5tc2djdHh1LmZsZC5yZXFfaWR4KTsKKwloZC0+U2NzaUxvb2t1cFtyZXFfaWR4XSA9IE5VTEw7CisJcFJlcSA9IChTQ1NJSU9SZXF1ZXN0X3QgKikgbWY7CisKKwlpZiAobWYgIT0gaGQtPmNtZFB0cikgeworCQlwcmludGsoTVlJT0Nfc19XQVJOX0ZNVCAiU2NhbkR2Q29tcGxldGUgKG1mPSVwLCBjbWRQdHI9JXAsIGlkeD0lZClcbiIsCisJCQkJaGQtPmlvYy0+bmFtZSwgKHZvaWQgKiltZiwgKHZvaWQgKikgaGQtPmNtZFB0ciwgcmVxX2lkeCk7CisJfQorCWhkLT5jbWRQdHIgPSBOVUxMOworCisJZGR2cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJTY2FuRHZDb21wbGV0ZSAobWY9JXAsbXI9JXAsaWR4PSVkKVxuIiwKKwkJCWhkLT5pb2MtPm5hbWUsIG1mLCBtciwgcmVxX2lkeCkpOworCisJaGQtPnBMb2NhbCA9ICZoZC0+bG9jYWxSZXBseTsKKwloZC0+cExvY2FsLT5zY3NpU3RhdHVzID0gMDsKKworCS8qIElmIHRhcmdldCBzdHJ1Y3QgZXhpc3RzLCBjbGVhciBzZW5zZSB2YWxpZCBmbGFnLgorCSAqLworCWlmIChtciA9PSBOVUxMKSB7CisJCWNvbXBsZXRpb25Db2RlID0gTVBUX1NDQU5EVl9HT09EOworCX0gZWxzZSB7CisJCVNDU0lJT1JlcGx5X3QJKnBSZXBseTsKKwkJdTE2CQkgc3RhdHVzOworCQl1OAkJIHNjc2lfc3RhdHVzOworCisJCXBSZXBseSA9IChTQ1NJSU9SZXBseV90ICopIG1yOworCisJCXN0YXR1cyA9IGxlMTZfdG9fY3B1KHBSZXBseS0+SU9DU3RhdHVzKSAmIE1QSV9JT0NTVEFUVVNfTUFTSzsKKwkJc2NzaV9zdGF0dXMgPSBwUmVwbHktPlNDU0lTdGF0dXM7CisKKwkJZGR2dHByaW50aygoS0VSTl9OT1RJQ0UgIiAgSU9DU3RhdHVzPSUwNHhoLCBTQ1NJU3RhdGU9JTAyeGgsIFNDU0lTdGF0dXM9JTAyeGgsIElPQ0xvZ0luZm89JTA4eGhcbiIsCisJCQkgICAgIHN0YXR1cywgcFJlcGx5LT5TQ1NJU3RhdGUsIHNjc2lfc3RhdHVzLAorCQkJICAgICBsZTMyX3RvX2NwdShwUmVwbHktPklPQ0xvZ0luZm8pKSk7CisKKwkJc3dpdGNoKHN0YXR1cykgeworCisJCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX0RFVklDRV9OT1RfVEhFUkU6CS8qIDB4MDA0MyAqLworCQkJY29tcGxldGlvbkNvZGUgPSBNUFRfU0NBTkRWX1NFTEVDVElPTl9USU1FT1VUOworCQkJYnJlYWs7CisKKwkJY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfSU9fREFUQV9FUlJPUjoJCS8qIDB4MDA0NiAqLworCQljYXNlIE1QSV9JT0NTVEFUVVNfU0NTSV9UQVNLX1RFUk1JTkFURUQ6CS8qIDB4MDA0OCAqLworCQljYXNlIE1QSV9JT0NTVEFUVVNfU0NTSV9JT0NfVEVSTUlOQVRFRDoJCS8qIDB4MDA0QiAqLworCQljYXNlIE1QSV9JT0NTVEFUVVNfU0NTSV9FWFRfVEVSTUlOQVRFRDoJCS8qIDB4MDA0QyAqLworCQkJY29tcGxldGlvbkNvZGUgPSBNUFRfU0NBTkRWX0RJRF9SRVNFVDsKKwkJCWJyZWFrOworCisJCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX0RBVEFfVU5ERVJSVU46CQkvKiAweDAwNDUgKi8KKwkJY2FzZSBNUElfSU9DU1RBVFVTX1NDU0lfUkVDT1ZFUkVEX0VSUk9SOgkvKiAweDAwNDAgKi8KKwkJY2FzZSBNUElfSU9DU1RBVFVTX1NVQ0NFU1M6CQkJLyogMHgwMDAwICovCisJCQlpZiAocFJlcGx5LT5GdW5jdGlvbiA9PSBNUElfRlVOQ1RJT05fQ09ORklHKSB7CisJCQkJQ29uZmlnUmVwbHlfdCAqcHIgPSAoQ29uZmlnUmVwbHlfdCAqKW1yOworCQkJCWNvbXBsZXRpb25Db2RlID0gTVBUX1NDQU5EVl9HT09EOworCQkJCWhkLT5wTG9jYWwtPmhlYWRlci5QYWdlVmVyc2lvbiA9IHByLT5IZWFkZXIuUGFnZVZlcnNpb247CisJCQkJaGQtPnBMb2NhbC0+aGVhZGVyLlBhZ2VMZW5ndGggPSBwci0+SGVhZGVyLlBhZ2VMZW5ndGg7CisJCQkJaGQtPnBMb2NhbC0+aGVhZGVyLlBhZ2VOdW1iZXIgPSBwci0+SGVhZGVyLlBhZ2VOdW1iZXI7CisJCQkJaGQtPnBMb2NhbC0+aGVhZGVyLlBhZ2VUeXBlID0gcHItPkhlYWRlci5QYWdlVHlwZTsKKworCQkJfSBlbHNlIGlmIChwUmVwbHktPkZ1bmN0aW9uID09IE1QSV9GVU5DVElPTl9SQUlEX0FDVElPTikgeworCQkJCS8qIElmIHRoZSBSQUlEIFZvbHVtZSByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWwsCisJCQkJICogcmV0dXJuIEdPT0QsIGVsc2UgaW5kaWNhdGUgdGhhdAorCQkJCSAqIHNvbWUgdHlwZSBvZiBlcnJvciBvY2N1cnJlZC4KKwkJCQkgKi8KKwkJCQlNcGlSYWlkQWN0aW9uUmVwbHlfdAkqcHIgPSAoTXBpUmFpZEFjdGlvblJlcGx5X3QgKiltcjsKKwkJCQlpZiAocHItPkFjdGlvblN0YXR1cyA9PSBNUElfUkFJRF9BQ1RJT05fQVNUQVRVU19TVUNDRVNTKQorCQkJCQljb21wbGV0aW9uQ29kZSA9IE1QVF9TQ0FORFZfR09PRDsKKwkJCQllbHNlCisJCQkJCWNvbXBsZXRpb25Db2RlID0gTVBUX1NDQU5EVl9TT01FX0VSUk9SOworCisJCQl9IGVsc2UgaWYgKHBSZXBseS0+U0NTSVN0YXRlICYgTVBJX1NDU0lfU1RBVEVfQVVUT1NFTlNFX1ZBTElEKSB7CisJCQkJdTgJCSpzZW5zZV9kYXRhOworCQkJCWludAkJIHN6OworCisJCQkJLyogc2F2ZSBzZW5zZSBkYXRhIGluIGdsb2JhbCBzdHJ1Y3R1cmUKKwkJCQkgKi8KKwkJCQljb21wbGV0aW9uQ29kZSA9IE1QVF9TQ0FORFZfU0VOU0U7CisJCQkJaGQtPnBMb2NhbC0+c2NzaVN0YXR1cyA9IHNjc2lfc3RhdHVzOworCQkJCXNlbnNlX2RhdGEgPSAoKHU4ICopaGQtPmlvYy0+c2Vuc2VfYnVmX3Bvb2wgKworCQkJCQkocmVxX2lkeCAqIE1QVF9TRU5TRV9CVUZGRVJfQUxMT0MpKTsKKworCQkJCXN6ID0gbWluX3QoaW50LCBwUmVxLT5TZW5zZUJ1ZmZlckxlbmd0aCwKKwkJCQkJCQlTQ1NJX1NURF9TRU5TRV9CWVRFUyk7CisJCQkJbWVtY3B5KGhkLT5wTG9jYWwtPnNlbnNlLCBzZW5zZV9kYXRhLCBzeik7CisKKwkJCQlkZHZwcmludGsoKEtFUk5fTk9USUNFICIgIENoZWNrIENvbmRpdGlvbiwgc2Vuc2UgcHRyICVwXG4iLAorCQkJCQkJc2Vuc2VfZGF0YSkpOworCQkJfSBlbHNlIGlmIChwUmVwbHktPlNDU0lTdGF0ZSAmIE1QSV9TQ1NJX1NUQVRFX0FVVE9TRU5TRV9GQUlMRUQpIHsKKwkJCQlpZiAocFJlcS0+Q0RCWzBdID09IElOUVVJUlkpCisJCQkJCWNvbXBsZXRpb25Db2RlID0gTVBUX1NDQU5EVl9JU1NVRV9TRU5TRTsKKwkJCQllbHNlCisJCQkJCWNvbXBsZXRpb25Db2RlID0gTVBUX1NDQU5EVl9ESURfUkVTRVQ7CisJCQl9CisJCQllbHNlIGlmIChwUmVwbHktPlNDU0lTdGF0ZSAmIE1QSV9TQ1NJX1NUQVRFX05PX1NDU0lfU1RBVFVTKQorCQkJCWNvbXBsZXRpb25Db2RlID0gTVBUX1NDQU5EVl9ESURfUkVTRVQ7CisJCQllbHNlIGlmIChwUmVwbHktPlNDU0lTdGF0ZSAmIE1QSV9TQ1NJX1NUQVRFX1RFUk1JTkFURUQpCisJCQkJY29tcGxldGlvbkNvZGUgPSBNUFRfU0NBTkRWX0RJRF9SRVNFVDsKKwkJCWVsc2UgeworCQkJCWNvbXBsZXRpb25Db2RlID0gTVBUX1NDQU5EVl9HT09EOworCQkJCWhkLT5wTG9jYWwtPnNjc2lTdGF0dXMgPSBzY3NpX3N0YXR1czsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgTVBJX0lPQ1NUQVRVU19TQ1NJX1BST1RPQ09MX0VSUk9SOgkJLyogMHgwMDQ3ICovCisJCQlpZiAocFJlcGx5LT5TQ1NJU3RhdGUgJiBNUElfU0NTSV9TVEFURV9URVJNSU5BVEVEKQorCQkJCWNvbXBsZXRpb25Db2RlID0gTVBUX1NDQU5EVl9ESURfUkVTRVQ7CisJCQllbHNlCisJCQkJY29tcGxldGlvbkNvZGUgPSBNUFRfU0NBTkRWX1NPTUVfRVJST1I7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJY29tcGxldGlvbkNvZGUgPSBNUFRfU0NBTkRWX1NPTUVfRVJST1I7CisJCQlicmVhazsKKworCQl9CS8qIHN3aXRjaChzdGF0dXMpICovCisKKwkJZGR2dHByaW50aygoS0VSTl9OT1RJQ0UgIiAgY29tcGxldGlvbkNvZGUgc2V0IHRvICUwOHhoXG4iLAorCQkJCWNvbXBsZXRpb25Db2RlKSk7CisJfSAvKiBlbmQgb2YgYWRkcmVzcyByZXBseSBjYXNlICovCisKKwloZC0+cExvY2FsLT5jb21wbGV0aW9uID0gY29tcGxldGlvbkNvZGU7CisKKwkvKiBNRiBhbmQgUkYgYXJlIGZyZWVkIGluIG1wdF9pbnRlcnJ1cHQKKwkgKi8KK3dha2V1cDoKKwkvKiBGcmVlIENoYWluIGJ1ZmZlcnMgKHdpbGwgbmV2ZXIgY2hhaW4pIGluIHNjYW4gb3IgZHYgKi8KKwkvL21wdHNjc2loX2ZyZWVDaGFpbkJ1ZmZlcnMoaW9jLCByZXFfaWR4KTsKKworCS8qCisJICogV2FrZSB1cCB0aGUgb3JpZ2luYWwgY2FsbGluZyB0aHJlYWQKKwkgKi8KKwlzY2FuZHZfd2FpdF9kb25lID0gMTsKKwl3YWtlX3VwKCZzY2FuZHZfd2FpdHEpOworCisJcmV0dXJuIDE7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCW1wdHNjc2loX3RpbWVyX2V4cGlyZWQgLSBDYWxsIGJhY2sgZm9yIHRpbWVyIHByb2Nlc3MuCisgKglVc2VkIG9ubHkgZm9yIGR2IGZ1bmN0aW9uYWxpdHkuCisgKglAZGF0YTogUG9pbnRlciB0byBNUFRfU0NTSV9IT1NUIHJlY2FzdCBhcyBhbiB1bnNpZ25lZCBsb25nCisgKgorICovCitzdGF0aWMgdm9pZCBtcHRzY3NpaF90aW1lcl9leHBpcmVkKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlNUFRfU0NTSV9IT1NUICpoZCA9IChNUFRfU0NTSV9IT1NUICopIGRhdGE7CisKKwlkZHZwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIlRpbWVyIEV4cGlyZWQhIENtZCAlcFxuIiwgaGQtPmlvYy0+bmFtZSwgaGQtPmNtZFB0cikpOworCisJaWYgKGhkLT5jbWRQdHIpIHsKKwkJTVBJSGVhZGVyX3QgKmNtZCA9IChNUElIZWFkZXJfdCAqKWhkLT5jbWRQdHI7CisKKwkJaWYgKGNtZC0+RnVuY3Rpb24gPT0gTVBJX0ZVTkNUSU9OX1NDU0lfSU9fUkVRVUVTVCkgeworCQkJLyogRGVzaXJlIHRvIGlzc3VlIGEgdGFzayBtYW5hZ2VtZW50IHJlcXVlc3QgaGVyZS4KKwkJCSAqIFRNIHJlcXVlc3RzIE1VU1QgYmUgc2luZ2xlIHRocmVhZGVkLgorCQkJICogSWYgb2xkIGVoIGNvZGUgYW5kIG5vIFRNIGN1cnJlbnQsIGlzc3VlIHJlcXVlc3QuCisJCQkgKiBJZiBuZXcgZWggY29kZSwgZG8gbm90aGluZy4gV2FpdCBmb3IgT1MgY21kIHRpbWVvdXQKKwkJCSAqCWZvciBidXMgcmVzZXQuCisJCQkgKi8KKwkJCWRkdnRwcmludGsoKE1ZSU9DX3NfTk9URV9GTVQgIkRWIENtZCBUaW1lb3V0OiBOb09wXG4iLCBoZC0+aW9jLT5uYW1lKSk7CisJCX0gZWxzZSB7CisJCQkvKiBQZXJmb3JtIGEgRlcgcmVsb2FkICovCisJCQlpZiAobXB0X0hhcmRSZXNldEhhbmRsZXIoaGQtPmlvYywgTk9fU0xFRVApIDwgMCkgeworCQkJCXByaW50ayhNWUlPQ19zX1dBUk5fRk1UICJGaXJtd2FyZSBSZWxvYWQgRkFJTEVEIVxuIiwgaGQtPmlvYy0+bmFtZSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBUaGlzIHNob3VsZCBORVZFUiBoYXBwZW4gKi8KKwkJcHJpbnRrKE1ZSU9DX3NfV0FSTl9GTVQgIk51bGwgY21kUHRyISEhIVxuIiwgaGQtPmlvYy0+bmFtZSk7CisJfQorCisJLyogTm8gbW9yZSBwcm9jZXNzaW5nLgorCSAqIFRNIGNhbGwgd2lsbCBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQgZm9yIFNDU0kgVE0gTWFuYWdlbWVudC4KKwkgKiBUaGUgRlcgd2lsbCByZXBseSB0byBhbGwgb3V0c3RhbmRpbmcgY29tbWFuZHMsIGNhbGxiYWNrIHdpbGwgZmluaXNoIGNsZWFudXAuCisJICogSGFyZCByZXNldCBjbGVhbi11cCB3aWxsIGZyZWUgYWxsIHJlc291cmNlcy4KKwkgKi8KKwlkZHZwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIlRpbWVyIEV4cGlyZWQgQ29tcGxldGUhXG4iLCBoZC0+aW9jLT5uYW1lKSk7CisKKwlyZXR1cm47Cit9CisKKyNpZmRlZiBNUFRTQ1NJSF9FTkFCTEVfRE9NQUlOX1ZBTElEQVRJT04KKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCW1wdHNjc2loX2RvX3JhaWQgLSBGb3JtYXQgYW5kIElzc3VlIGEgUkFJRCB2b2x1bWUgcmVxdWVzdCBtZXNzYWdlLgorICoJQGhkOiBQb2ludGVyIHRvIHNjc2kgaG9zdCBzdHJ1Y3R1cmUKKyAqCUBhY3Rpb246IFdoYXQgZG8gYmUgZG9uZS4KKyAqCUBpZDogTG9naWNhbCB0YXJnZXQgaWQuCisgKglAYnVzOiBUYXJnZXQgbG9jYXRpb25zIGJ1cy4KKyAqCisgKglSZXR1cm5zOiA8IDAgb24gYSBmYXRhbCBlcnJvcgorICoJCTAgb24gc3VjY2VzcworICoKKyAqCVJlbWFyazogV2FpdCB0byByZXR1cm4gdW50aWwgcmVwbHkgcHJvY2Vzc2VkIGJ5IHRoZSBJU1IuCisgKi8KK3N0YXRpYyBpbnQKK21wdHNjc2loX2RvX3JhaWQoTVBUX1NDU0lfSE9TVCAqaGQsIHU4IGFjdGlvbiwgSU5URVJOQUxfQ01EICppbykKK3sKKwlNcGlSYWlkQWN0aW9uUmVxdWVzdF90CSpwUmVxOworCU1QVF9GUkFNRV9IRFIJCSptZjsKKwlpbnQJCQlpbl9pc3I7CisKKwlpbl9pc3IgPSBpbl9pbnRlcnJ1cHQoKTsKKwlpZiAoaW5faXNyKSB7CisJCWRwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIkludGVybmFsIHJhaWQgcmVxdWVzdCBub3QgYWxsb3dlZCBpbiBJU1IgY29udGV4dCFcbiIsCisgICAgICAgCQkJCWhkLT5pb2MtPm5hbWUpKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwkvKiBHZXQgYW5kIFBvcHVsYXRlIGEgZnJlZSBGcmFtZQorCSAqLworCWlmICgobWYgPSBtcHRfZ2V0X21zZ19mcmFtZShTY3NpU2NhbkR2Q3R4LCBoZC0+aW9jKSkgPT0gTlVMTCkgeworCQlkZHZwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIl9kb19yYWlkOiBubyBtc2cgZnJhbWVzIVxuIiwKKwkJCQkJaGQtPmlvYy0+bmFtZSkpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJcFJlcSA9IChNcGlSYWlkQWN0aW9uUmVxdWVzdF90ICopbWY7CisJcFJlcS0+QWN0aW9uID0gYWN0aW9uOworCXBSZXEtPlJlc2VydmVkMSA9IDA7CisJcFJlcS0+Q2hhaW5PZmZzZXQgPSAwOworCXBSZXEtPkZ1bmN0aW9uID0gTVBJX0ZVTkNUSU9OX1JBSURfQUNUSU9OOworCXBSZXEtPlZvbHVtZUlEID0gaW8tPmlkOworCXBSZXEtPlZvbHVtZUJ1cyA9IGlvLT5idXM7CisJcFJlcS0+UGh5c0Rpc2tOdW0gPSBpby0+cGh5c0Rpc2tOdW07CisJcFJlcS0+TXNnRmxhZ3MgPSAwOworCXBSZXEtPlJlc2VydmVkMiA9IDA7CisJcFJlcS0+QWN0aW9uRGF0YVdvcmQgPSAwOyAvKiBSZXNlcnZlZCBmb3IgdGhpcyBhY3Rpb24gKi8KKwkvL3BSZXEtPkFjdGlvbkRhdGFTR0UgPSAwOworCisJbXB0X2FkZF9zZ2UoKGNoYXIgKikmcFJlcS0+QWN0aW9uRGF0YVNHRSwKKwkJTVBUX1NHRV9GTEFHU19TU0lNUExFX1JFQUQgfCAwLCAoZG1hX2FkZHJfdCkgLTEpOworCisJZGR2cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJSQUlEIFZvbHVtZSBhY3Rpb24gJXggaWQgJWRcbiIsCisJCQloZC0+aW9jLT5uYW1lLCBhY3Rpb24sIGlvLT5pZCkpOworCisJaGQtPnBMb2NhbCA9IE5VTEw7CisJaGQtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFoqMTA7IC8qIDEwIHNlY29uZCB0aW1lb3V0ICovCisJc2NhbmR2X3dhaXRfZG9uZSA9IDA7CisKKwkvKiBTYXZlIGNtZCBwb2ludGVyLCBmb3IgcmVzb3VyY2UgZnJlZSBpZiB0aW1lb3V0IG9yCisJICogRlcgcmVsb2FkIG9jY3VycworCSAqLworCWhkLT5jbWRQdHIgPSBtZjsKKworCWFkZF90aW1lcigmaGQtPnRpbWVyKTsKKwltcHRfcHV0X21zZ19mcmFtZShTY3NpU2NhbkR2Q3R4LCBoZC0+aW9jLCBtZik7CisJd2FpdF9ldmVudChzY2FuZHZfd2FpdHEsIHNjYW5kdl93YWl0X2RvbmUpOworCisJaWYgKChoZC0+cExvY2FsID09IE5VTEwpIHx8IChoZC0+cExvY2FsLT5jb21wbGV0aW9uICE9IE1QVF9TQ0FORFZfR09PRCkpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIH5NUFRTQ1NJSF9FTkFCTEVfRE9NQUlOX1ZBTElEQVRJT04gKi8KKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoqCisgKgltcHRzY3NpaF9kb19jbWQgLSBEbyBpbnRlcm5hbCBjb21tYW5kLgorICoJQGhkOiBNUFRfU0NTSV9IT1NUIHBvaW50ZXIKKyAqCUBpbzogSU5URVJOQUxfQ01EIHBvaW50ZXIuCisgKgorICoJSXNzdWUgdGhlIHNwZWNpZmllZCBpbnRlcm5hbGx5IGdlbmVyYXRlZCBjb21tYW5kIGFuZCBkbyBjb21tYW5kCisgKglzcGVjaWZpYyBjbGVhbnVwLiBGb3IgYnVzIHNjYW4gLyBEViBvbmx5LgorICoJTk9URVM6IElmIGNvbW1hbmQgaXMgSW5xdWlyeSBhbmQgc3RhdHVzIGlzIGdvb2QsCisgKglpbml0aWFsaXplIGEgdGFyZ2V0IHN0cnVjdHVyZSwgc2F2ZSB0aGUgZGF0YQorICoKKyAqCVJlbWFyazogU2luZ2xlIHRocmVhZGVkIGFjY2VzcyBvbmx5LgorICoKKyAqCVJldHVybjoKKyAqCQk8IDAgaWYgYW4gaWxsZWdhbCBjb21tYW5kIG9yIG5vIHJlc291cmNlcworICoKKyAqCQkgICAwIGlmIGdvb2QKKyAqCisgKgkJID4gMCBpZiBjb21tYW5kIGNvbXBsZXRlIGJ1dCBzb21lIHR5cGUgb2YgY29tcGxldGlvbiBlcnJvci4KKyAqLworc3RhdGljIGludAorbXB0c2NzaWhfZG9fY21kKE1QVF9TQ1NJX0hPU1QgKmhkLCBJTlRFUk5BTF9DTUQgKmlvKQoreworCU1QVF9GUkFNRV9IRFIJKm1mOworCVNDU0lJT1JlcXVlc3RfdAkqcFNjc2lSZXE7CisJU0NTSUlPUmVxdWVzdF90CSBSZXFDb3B5OworCWludAkJIG15X2lkeCwgaWksIGRpcjsKKwlpbnQJCSByYywgY21kVGltZW91dDsKKwlpbnQJCWluX2lzcjsKKwljaGFyCQkgY21kTGVuOworCWNoYXIJCSBDREJbXT17MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisJY2hhcgkJIGNtZCA9IGlvLT5jbWQ7CisKKwlpbl9pc3IgPSBpbl9pbnRlcnJ1cHQoKTsKKwlpZiAoaW5faXNyKSB7CisJCWRwcmludGsoKE1ZSU9DX3NfV0FSTl9GTVQgIkludGVybmFsIFNDU0kgSU8gcmVxdWVzdCBub3QgYWxsb3dlZCBpbiBJU1IgY29udGV4dCFcbiIsCisgICAgICAgCQkJCWhkLT5pb2MtPm5hbWUpKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKworCS8qIFNldCBjb21tYW5kIHNwZWNpZmljIGluZm9ybWF0aW9uCisJICovCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIElOUVVJUlk6CisJCWNtZExlbiA9IDY7CisJCWRpciA9IE1QSV9TQ1NJSU9fQ09OVFJPTF9SRUFEOworCQlDREJbMF0gPSBjbWQ7CisJCUNEQls0XSA9IGlvLT5zaXplOworCQljbWRUaW1lb3V0ID0gMTA7CisJCWJyZWFrOworCisJY2FzZSBURVNUX1VOSVRfUkVBRFk6CisJCWNtZExlbiA9IDY7CisJCWRpciA9IE1QSV9TQ1NJSU9fQ09OVFJPTF9SRUFEOworCQljbWRUaW1lb3V0ID0gMTA7CisJCWJyZWFrOworCisJY2FzZSBTVEFSVF9TVE9QOgorCQljbWRMZW4gPSA2OworCQlkaXIgPSBNUElfU0NTSUlPX0NPTlRST0xfUkVBRDsKKwkJQ0RCWzBdID0gY21kOworCQlDREJbNF0gPSAxOwkvKlNwaW4gdXAgdGhlIGRpc2sgKi8KKwkJY21kVGltZW91dCA9IDE1OworCQlicmVhazsKKworCWNhc2UgUkVRVUVTVF9TRU5TRToKKwkJY21kTGVuID0gNjsKKwkJQ0RCWzBdID0gY21kOworCQlDREJbNF0gPSBpby0+c2l6ZTsKKwkJZGlyID0gTVBJX1NDU0lJT19DT05UUk9MX1JFQUQ7CisJCWNtZFRpbWVvdXQgPSAxMDsKKwkJYnJlYWs7CisKKwljYXNlIFJFQURfQlVGRkVSOgorCQljbWRMZW4gPSAxMDsKKwkJZGlyID0gTVBJX1NDU0lJT19DT05UUk9MX1JFQUQ7CisJCUNEQlswXSA9IGNtZDsKKwkJaWYgKGlvLT5mbGFncyAmIE1QVF9JQ0ZMQUdfRUNITykgeworCQkJQ0RCWzFdID0gMHgwQTsKKwkJfSBlbHNlIHsKKwkJCUNEQlsxXSA9IDB4MDI7CisJCX0KKworCQlpZiAoaW8tPmZsYWdzICYgTVBUX0lDRkxBR19CVUZfQ0FQKSB7CisJCQlDREJbMV0gfD0gMHgwMTsKKwkJfQorCQlDREJbNl0gPSAoaW8tPnNpemUgPj4gMTYpICYgMHhGRjsKKwkJQ0RCWzddID0gKGlvLT5zaXplID4+ICA4KSAmIDB4RkY7CisJCUNEQls4XSA9IGlvLT5zaXplICYgMHhGRjsKKwkJY21kVGltZW91dCA9IDEwOworCQlicmVhazsKKworCWNhc2UgV1JJVEVfQlVGRkVSOgorCQljbWRMZW4gPSAxMDsKKwkJZGlyID0gTVBJX1NDU0lJT19DT05UUk9MX1dSSVRFOworCQlDREJbMF0gPSBjbWQ7CisJCWlmIChpby0+ZmxhZ3MgJiBNUFRfSUNGTEFHX0VDSE8pIHsKKwkJCUNEQlsxXSA9IDB4MEE7CisJCX0gZWxzZSB7CisJCQlDREJbMV0gPSAweDAyOworCQl9CisJCUNEQls2XSA9IChpby0+c2l6ZSA+PiAxNikgJiAweEZGOworCQlDREJbN10gPSAoaW8tPnNpemUgPj4gIDgpICYgMHhGRjsKKwkJQ0RCWzhdID0gaW8tPnNpemUgJiAweEZGOworCQljbWRUaW1lb3V0ID0gMTA7CisJCWJyZWFrOworCisJY2FzZSBSRVNFUlZFOgorCQljbWRMZW4gPSA2OworCQlkaXIgPSBNUElfU0NTSUlPX0NPTlRST0xfUkVBRDsKKwkJQ0RCWzBdID0gY21kOworCQljbWRUaW1lb3V0ID0gMTA7CisJCWJyZWFrOworCisJY2FzZSBSRUxFQVNFOgorCQljbWRMZW4gPSA2OworCQlkaXIgPSBNUElfU0NTSUlPX0NPTlRST0xfUkVBRDsKKwkJQ0RCWzBdID0gY21kOworCQljbWRUaW1lb3V0ID0gMTA7CisJCWJyZWFrOworCisJY2FzZSBTWU5DSFJPTklaRV9DQUNIRToKKwkJY21kTGVuID0gMTA7CisJCWRpciA9IE1QSV9TQ1NJSU9fQ09OVFJPTF9SRUFEOworCQlDREJbMF0gPSBjbWQ7CisvLwkJQ0RCWzFdID0gMHgwMjsJLyogc2V0IGltbWVkaWF0ZSBiaXQgKi8KKwkJY21kVGltZW91dCA9IDEwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIEVycm9yIENhc2UgKi8KKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogR2V0IGFuZCBQb3B1bGF0ZSBhIGZyZWUgRnJhbWUKKwkgKi8KKwlpZiAoKG1mID0gbXB0X2dldF9tc2dfZnJhbWUoU2NzaVNjYW5EdkN0eCwgaGQtPmlvYykpID09IE5VTEwpIHsKKwkJZGR2cHJpbnRrKChNWUlPQ19zX1dBUk5fRk1UICJObyBtc2cgZnJhbWVzIVxuIiwKKwkJCQkJaGQtPmlvYy0+bmFtZSkpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXBTY3NpUmVxID0gKFNDU0lJT1JlcXVlc3RfdCAqKSBtZjsKKworCS8qIEdldCB0aGUgcmVxdWVzdCBpbmRleCAqLworCW15X2lkeCA9IGxlMTZfdG9fY3B1KG1mLT51LmZyYW1lLmh3aGRyLm1zZ2N0eHUuZmxkLnJlcV9pZHgpOworCUFERF9JTkRFWF9MT0cobXlfaWR4KTsgLyogZm9yIGRlYnVnICovCisKKwlpZiAoaW8tPmZsYWdzICYgTVBUX0lDRkxBR19QSFlTX0RJU0spIHsKKwkJcFNjc2lSZXEtPlRhcmdldElEID0gaW8tPnBoeXNEaXNrTnVtOworCQlwU2NzaVJlcS0+QnVzID0gMDsKKwkJcFNjc2lSZXEtPkNoYWluT2Zmc2V0ID0gMDsKKwkJcFNjc2lSZXEtPkZ1bmN0aW9uID0gTVBJX0ZVTkNUSU9OX1JBSURfU0NTSV9JT19QQVNTVEhST1VHSDsKKwl9IGVsc2UgeworCQlwU2NzaVJlcS0+VGFyZ2V0SUQgPSBpby0+aWQ7CisJCXBTY3NpUmVxLT5CdXMgPSBpby0+YnVzOworCQlwU2NzaVJlcS0+Q2hhaW5PZmZzZXQgPSAwOworCQlwU2NzaVJlcS0+RnVuY3Rpb24gPSBNUElfRlVOQ1RJT05fU0NTSV9JT19SRVFVRVNUOworCX0KKworCXBTY3NpUmVxLT5DREJMZW5ndGggPSBjbWRMZW47CisJcFNjc2lSZXEtPlNlbnNlQnVmZmVyTGVuZ3RoID0gTVBUX1NFTlNFX0JVRkZFUl9TSVpFOworCisJcFNjc2lSZXEtPlJlc2VydmVkID0gMDsKKworCXBTY3NpUmVxLT5Nc2dGbGFncyA9IG1wdF9tc2dfZmxhZ3MoKTsKKwkvKiBNc2dDb250ZXh0IHNldCBpbiBtcHRfZ2V0X21zZ19mcmFtIGNhbGwgICovCisKKwlmb3IgKGlpPTA7IGlpIDwgODsgaWkrKykKKwkJcFNjc2lSZXEtPkxVTltpaV0gPSAwOworCXBTY3NpUmVxLT5MVU5bMV0gPSBpby0+bHVuOworCisJaWYgKGlvLT5mbGFncyAmIE1QVF9JQ0ZMQUdfVEFHR0VEX0NNRCkKKwkJcFNjc2lSZXEtPkNvbnRyb2wgPSBjcHVfdG9fbGUzMihkaXIgfCBNUElfU0NTSUlPX0NPTlRST0xfU0lNUExFUSk7CisJZWxzZQorCQlwU2NzaVJlcS0+Q29udHJvbCA9IGNwdV90b19sZTMyKGRpciB8IE1QSV9TQ1NJSU9fQ09OVFJPTF9VTlRBR0dFRCk7CisKKwlpZiAoY21kID09IFJFUVVFU1RfU0VOU0UpIHsKKwkJcFNjc2lSZXEtPkNvbnRyb2wgPSBjcHVfdG9fbGUzMihkaXIgfCBNUElfU0NTSUlPX0NPTlRST0xfVU5UQUdHRUQpOworCQlkZHZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIlVudGFnZ2VkISAweCUyeFxuIiwKKwkJCWhkLT5pb2MtPm5hbWUsIGNtZCkpOworCX0KKworCWZvciAoaWk9MDsgaWkgPCAxNjsgaWkrKykKKwkJcFNjc2lSZXEtPkNEQltpaV0gPSBDREJbaWldOworCisJcFNjc2lSZXEtPkRhdGFMZW5ndGggPSBjcHVfdG9fbGUzMihpby0+c2l6ZSk7CisJcFNjc2lSZXEtPlNlbnNlQnVmZmVyTG93QWRkciA9IGNwdV90b19sZTMyKGhkLT5pb2MtPnNlbnNlX2J1Zl9sb3dfZG1hCisJCQkJCSAgICsgKG15X2lkeCAqIE1QVF9TRU5TRV9CVUZGRVJfQUxMT0MpKTsKKworCWRkdnByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiU2VuZGluZyBDb21tYW5kIDB4JXggZm9yICglZDolZDolZClcbiIsCisJCQloZC0+aW9jLT5uYW1lLCBjbWQsIGlvLT5idXMsIGlvLT5pZCwgaW8tPmx1bikpOworCisJaWYgKGRpciA9PSBNUElfU0NTSUlPX0NPTlRST0xfUkVBRCkgeworCQltcHRfYWRkX3NnZSgoY2hhciAqKSAmcFNjc2lSZXEtPlNHTCwKKwkJCU1QVF9TR0VfRkxBR1NfU1NJTVBMRV9SRUFEIHwgaW8tPnNpemUsCisJCQlpby0+ZGF0YV9kbWEpOworCX0gZWxzZSB7CisJCW1wdF9hZGRfc2dlKChjaGFyICopICZwU2NzaVJlcS0+U0dMLAorCQkJTVBUX1NHRV9GTEFHU19TU0lNUExFX1dSSVRFIHwgaW8tPnNpemUsCisJCQlpby0+ZGF0YV9kbWEpOworCX0KKworCS8qIFRoZSBJU1Igd2lsbCBmcmVlIHRoZSByZXF1ZXN0IGZyYW1lLCBidXQgd2UgbmVlZAorCSAqIHRoZSBpbmZvcm1hdGlvbiB0byBpbml0aWFsaXplIHRoZSB0YXJnZXQuIER1cGxpY2F0ZS4KKwkgKi8KKwltZW1jcHkoJlJlcUNvcHksIHBTY3NpUmVxLCBzaXplb2YoU0NTSUlPUmVxdWVzdF90KSk7CisKKwkvKiBJc3N1ZSB0aGlzIGNvbW1hbmQgYWZ0ZXI6CisJICoJZmluaXNoIGluaXQKKwkgKglhZGQgdGltZXIKKwkgKiBXYWl0IHVudGlsIHRoZSByZXBseSBoYXMgYmVlbiByZWNlaXZlZAorCSAqICBTY3NpU2NhbkR2Q3R4IGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwKKwkgKglzZXQgaGQtPnBMb2NhbDsKKwkgKglzZXQgc2NhbmR2X3dhaXRfZG9uZSBhbmQgY2FsbCB3YWtlX3VwCisJICovCisJaGQtPnBMb2NhbCA9IE5VTEw7CisJaGQtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFoqY21kVGltZW91dDsKKwlzY2FuZHZfd2FpdF9kb25lID0gMDsKKworCS8qIFNhdmUgY21kIHBvaW50ZXIsIGZvciByZXNvdXJjZSBmcmVlIGlmIHRpbWVvdXQgb3IKKwkgKiBGVyByZWxvYWQgb2NjdXJzCisJICovCisJaGQtPmNtZFB0ciA9IG1mOworCisJYWRkX3RpbWVyKCZoZC0+dGltZXIpOworCW1wdF9wdXRfbXNnX2ZyYW1lKFNjc2lTY2FuRHZDdHgsIGhkLT5pb2MsIG1mKTsKKwl3YWl0X2V2ZW50KHNjYW5kdl93YWl0cSwgc2NhbmR2X3dhaXRfZG9uZSk7CisKKwlpZiAoaGQtPnBMb2NhbCkgeworCQlyYyA9IGhkLT5wTG9jYWwtPmNvbXBsZXRpb247CisJCWhkLT5wTG9jYWwtPnNraXAgPSAwOworCisJCS8qIEFsd2F5cyBzZXQgZmF0YWwgZXJyb3IgY29kZXMgaW4gc29tZSBjYXNlcy4KKwkJICovCisJCWlmIChyYyA9PSBNUFRfU0NBTkRWX1NFTEVDVElPTl9USU1FT1VUKQorCQkJcmMgPSAtRU5YSU87CisJCWVsc2UgaWYgKHJjID09IE1QVF9TQ0FORFZfU09NRV9FUlJPUikKKwkJCXJjID0gIC1yYzsKKwl9IGVsc2UgeworCQlyYyA9IC1FRkFVTFQ7CisJCS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gKi8KKwkJZGR2cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJfZG9fY21kOiBOdWxsIHBMb2NhbCEhIVxuIiwKKwkJCQloZC0+aW9jLT5uYW1lKSk7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisvKioKKyAqCW1wdHNjc2loX3N5bmNocm9uaXplX2NhY2hlIC0gU2VuZCBTWU5DSFJPTklaRV9DQUNIRSB0byBhbGwgZGlza3MuCisgKglAaGQ6IFBvaW50ZXIgdG8gTVBUX1NDU0lfSE9TVCBzdHJ1Y3R1cmUKKyAqCUBwb3J0bnVtOiBJT0MgcG9ydCBudW1iZXIKKyAqCisgKglVc2VzIHRoZSBJU1IsIGJ1dCB3aXRoIHNwZWNpYWwgcHJvY2Vzc2luZy4KKyAqCU1VU1QgYmUgc2luZ2xlLXRocmVhZGVkLgorICoKKyAqCVJldHVybjogMCBvbiBjb21wbGV0aW9uCisgKi8KK3N0YXRpYyBpbnQKK21wdHNjc2loX3N5bmNocm9uaXplX2NhY2hlKE1QVF9TQ1NJX0hPU1QgKmhkLCBpbnQgcG9ydG51bSkKK3sKKwlNUFRfQURBUFRFUgkJKmlvYz0gaGQtPmlvYzsKKwlWaXJ0RGV2aWNlCQkqcFRhcmdldDsKKwlTQ1NJRGV2aWNlUGFnZTFfdAkqcGNmZzFEYXRhID0gTlVMTDsKKwlJTlRFUk5BTF9DTUQJCSBpb2NtZDsKKwlDT05GSUdQQVJNUwkJIGNmZzsKKwlkbWFfYWRkcl90CQkgY2ZnMV9kbWFfYWRkciA9IC0xOworCUNvbmZpZ1BhZ2VIZWFkZXJfdAkgaGVhZGVyMTsKKwlpbnQJCQkgYnVzID0gMDsKKwlpbnQJCQkgaWQgPSAwOworCWludAkJCSBsdW47CisJaW50CQkJIGluZGV4ZWRfbHVuLCBsdW5faW5kZXg7CisJaW50CQkJIGhvc3RJZCA9IGlvYy0+cGZhY3RzW3BvcnRudW1dLlBvcnRTQ1NJSUQ7CisJaW50CQkJIG1heF9pZDsKKwlpbnQJCQkgcmVxdWVzdGVkLCBjb25maWd1cmF0aW9uLCBkYXRhOworCWludAkJCSBkb0NvbmZpZyA9IDA7CisJdTgJCQkgZmxhZ3MsIGZhY3RvcjsKKworCW1heF9pZCA9IGlvYy0+c2gtPm1heF9pZCAtIDE7CisKKwkvKiBGb2xsb3dpbmcgcGFyYW1ldGVycyB3aWxsIG5vdCBjaGFuZ2UKKwkgKiBpbiB0aGlzIHJvdXRpbmUuCisJICovCisJaW9jbWQuY21kID0gU1lOQ0hST05JWkVfQ0FDSEU7CisJaW9jbWQuZmxhZ3MgPSAwOworCWlvY21kLnBoeXNEaXNrTnVtID0gLTE7CisJaW9jbWQuZGF0YSA9IE5VTEw7CisJaW9jbWQuZGF0YV9kbWEgPSAtMTsKKwlpb2NtZC5zaXplID0gMDsKKwlpb2NtZC5yc3ZkID0gaW9jbWQucnN2ZDIgPSAwOworCisJLyogTm8gU0NTSSBob3N0cworCSAqLworCWlmIChoZC0+VGFyZ2V0cyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCS8qIFNraXAgdGhlIGhvc3QKKwkgKi8KKwlpZiAoaWQgPT0gaG9zdElkKQorCQlpZCsrOworCisJLyogV3JpdGUgU0RQMSBmb3IgYWxsIFNDU0kgZGV2aWNlcworCSAqIEFsbG9jIG1lbW9yeSBhbmQgc2V0IHVwIGNvbmZpZyBidWZmZXIKKwkgKi8KKwlpZiAoaW9jLT5idXNfdHlwZSA9PSBTQ1NJKSB7CisJCWlmIChpb2MtPnNwaV9kYXRhLnNkcDFsZW5ndGggPiAwKSB7CisJCQlwY2ZnMURhdGEgPSAoU0NTSURldmljZVBhZ2UxX3QgKilwY2lfYWxsb2NfY29uc2lzdGVudChpb2MtPnBjaWRldiwKKwkJCQkJIGlvYy0+c3BpX2RhdGEuc2RwMWxlbmd0aCAqIDQsICZjZmcxX2RtYV9hZGRyKTsKKworCQkJaWYgKHBjZmcxRGF0YSAhPSBOVUxMKSB7CisJCQkJZG9Db25maWcgPSAxOworCQkJCWhlYWRlcjEuUGFnZVZlcnNpb24gPSBpb2MtPnNwaV9kYXRhLnNkcDF2ZXJzaW9uOworCQkJCWhlYWRlcjEuUGFnZUxlbmd0aCA9IGlvYy0+c3BpX2RhdGEuc2RwMWxlbmd0aDsKKwkJCQloZWFkZXIxLlBhZ2VOdW1iZXIgPSAxOworCQkJCWhlYWRlcjEuUGFnZVR5cGUgPSBNUElfQ09ORklHX1BBR0VUWVBFX1NDU0lfREVWSUNFOworCQkJCWNmZy5oZHIgPSAmaGVhZGVyMTsKKwkJCQljZmcucGh5c0FkZHIgPSBjZmcxX2RtYV9hZGRyOworCQkJCWNmZy5hY3Rpb24gPSBNUElfQ09ORklHX0FDVElPTl9QQUdFX1dSSVRFX0NVUlJFTlQ7CisJCQkJY2ZnLmRpciA9IDE7CisJCQkJY2ZnLnRpbWVvdXQgPSAwOworCQkJfQorCQl9CisJfQorCisJLyogbG9vcCB0aHJvdWdoIGFsbCBkZXZpY2VzIG9uIHRoaXMgcG9ydAorCSAqLworCXdoaWxlIChidXMgPCBNUFRfTUFYX0JVUykgeworCQlpb2NtZC5idXMgPSBidXM7CisJCWlvY21kLmlkID0gaWQ7CisJCXBUYXJnZXQgPSBoZC0+VGFyZ2V0c1soaW50KWlkXTsKKworCQlpZiAoZG9Db25maWcpIHsKKworCQkJLyogU2V0IHRoZSBuZWdvdGlhdGlvbiBmbGFncyAqLworCQkJaWYgKHBUYXJnZXQgJiYgKHBUYXJnZXQgPSBoZC0+VGFyZ2V0c1tpZF0pICYmICFwVGFyZ2V0LT5yYWlkVm9sdW1lKSB7CisJCQkJZmxhZ3MgPSBwVGFyZ2V0LT5uZWdvRmxhZ3M7CisJCQl9IGVsc2UgeworCQkJCWZsYWdzID0gaGQtPmlvYy0+c3BpX2RhdGEubm9RYXM7CisJCQkJaWYgKGhkLT5pb2MtPnNwaV9kYXRhLm52cmFtICYmIChoZC0+aW9jLT5zcGlfZGF0YS5udnJhbVtpZF0gIT0gTVBUX0hPU1RfTlZSQU1fSU5WQUxJRCkpIHsKKwkJCQkJZGF0YSA9IGhkLT5pb2MtPnNwaV9kYXRhLm52cmFtW2lkXTsKKworCQkJCQlpZiAoZGF0YSAmIE1QVF9OVlJBTV9XSURFX0RJU0FCTEUpCisJCQkJCQlmbGFncyB8PSBNUFRfVEFSR0VUX05PX05FR09fV0lERTsKKworCQkJCQlmYWN0b3IgPSAoZGF0YSAmIE1QVF9OVlJBTV9TWU5DX01BU0spID4+IE1QVF9OVlJBTV9TWU5DX1NISUZUOworCQkJCQlpZiAoKGZhY3RvciA9PSAwKSB8fCAoZmFjdG9yID09IE1QVF9BU1lOQykpCisJCQkJCQlmbGFncyB8PSBNUFRfVEFSR0VUX05PX05FR09fU1lOQzsKKwkJCQl9CisJCQl9CisKKwkJCS8qIEZvcmNlIHRvIGFzeW5jLCBuYXJyb3cgKi8KKwkJCW1wdHNjc2loX3NldERldmljZVBhZ2UxRmxhZ3MoMCwgTVBUX0FTWU5DLCAwLCAmcmVxdWVzdGVkLAorCQkJCQkmY29uZmlndXJhdGlvbiwgZmxhZ3MpOworCQkJZG5lZ29wcmludGsoKCJzeW5jcm9uaXplIGNhY2hlOiBpZD0lZCB3aWR0aD0wIGZhY3Rvcj1NUFRfQVNZTkMgIgorCQkJCSJvZmZzZXQ9MCBuZWdvRmxhZ3M9JXggcmVxdWVzdD0leCBjb25maWc9JXhcbiIsCisJCQkJaWQsIGZsYWdzLCByZXF1ZXN0ZWQsIGNvbmZpZ3VyYXRpb24pKTsKKwkJCXBjZmcxRGF0YS0+UmVxdWVzdGVkUGFyYW1ldGVycyA9IGxlMzJfdG9fY3B1KHJlcXVlc3RlZCk7CisJCQlwY2ZnMURhdGEtPlJlc2VydmVkID0gMDsKKwkJCXBjZmcxRGF0YS0+Q29uZmlndXJhdGlvbiA9IGxlMzJfdG9fY3B1KGNvbmZpZ3VyYXRpb24pOworCQkJY2ZnLnBhZ2VBZGRyID0gKGJ1czw8OCkgfCBpZDsKKwkJCW1wdF9jb25maWcoaGQtPmlvYywgJmNmZyk7CisJCX0KKworCQkvKiBJZiB0YXJnZXQgUHRyIE5VTEwgb3IgaWYgdGhpcyB0YXJnZXQgaXMgTk9UIGEgZGlzaywgc2tpcC4KKwkJICovCisJCWlmICgocFRhcmdldCkgJiYgKHBUYXJnZXQtPnRmbGFncyAmIE1QVF9UQVJHRVRfRkxBR1NfUV9ZRVMpKXsKKwkJCWZvciAobHVuPTA7IGx1biA8PSBNUFRfTEFTVF9MVU47IGx1bisrKSB7CisJCQkJLyogSWYgTFVOIHByZXNlbnQsIGlzc3VlIHRoZSBjb21tYW5kCisJCQkJICovCisJCQkJbHVuX2luZGV4ID0gKGx1biA+PiA1KTsgIC8qIDMyIGx1bnMgcGVyIGx1bl9pbmRleCAqLworCQkJCWluZGV4ZWRfbHVuID0gKGx1biAlIDMyKTsKKwkJCQlpZiAocFRhcmdldC0+bHVuc1tsdW5faW5kZXhdICYgKDE8PGluZGV4ZWRfbHVuKSkgeworCQkJCQlpb2NtZC5sdW4gPSBsdW47CisJCQkJCSh2b2lkKSBtcHRzY3NpaF9kb19jbWQoaGQsICZpb2NtZCk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyogZ2V0IG5leHQgcmVsZXZhbnQgZGV2aWNlICovCisJCWlkKys7CisKKwkJaWYgKGlkID09IGhvc3RJZCkKKwkJCWlkKys7CisKKwkJaWYgKGlkID4gbWF4X2lkKSB7CisJCQlpZCA9IDA7CisJCQlidXMrKzsKKwkJfQorCX0KKworCWlmIChwY2ZnMURhdGEpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChpb2MtPnBjaWRldiwgaGVhZGVyMS5QYWdlTGVuZ3RoICogNCwgcGNmZzFEYXRhLCBjZmcxX2RtYV9hZGRyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIE1QVFNDU0lIX0VOQUJMRV9ET01BSU5fVkFMSURBVElPTgorLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoqCisgKgltcHRzY3NpaF9kb21haW5WYWxpZGF0aW9uIC0gVG9wIGxldmVsIGhhbmRsZXIgZm9yIGRvbWFpbiB2YWxpZGF0aW9uLgorICoJQGhkOiBQb2ludGVyIHRvIE1QVF9TQ1NJX0hPU1Qgc3RydWN0dXJlLgorICoKKyAqCVVzZXMgdGhlIElTUiwgYnV0IHdpdGggc3BlY2lhbCBwcm9jZXNzaW5nLgorICoJQ2FsbGVkIGZyb20gc2NoZWR1bGUsIHNob3VsZCBub3QgYmUgaW4gaW50ZXJydXB0IG1vZGUuCisgKglXaGlsZSB0aHJlYWQgYWxpdmUsIGRvIGR2IGZvciBhbGwgZGV2aWNlcyBuZWVkaW5nIGR2CisgKgorICoJUmV0dXJuOiBOb25lLgorICovCitzdGF0aWMgdm9pZAorbXB0c2NzaWhfZG9tYWluVmFsaWRhdGlvbih2b2lkICphcmcpCit7CisJTVBUX1NDU0lfSE9TVAkJKmhkOworCU1QVF9BREFQVEVSCQkqaW9jOworCXVuc2lnbmVkIGxvbmcJCSBmbGFnczsKKwlpbnQgCQkJIGlkLCBtYXhpZCwgZHZTdGF0dXMsIGRpZDsKKwlpbnQJCQkgaWksIGlzUGh5c0Rpc2s7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHZ0YXNrUV9sb2NrLCBmbGFncyk7CisJZHZ0YXNrUV9hY3RpdmUgPSAxOworCWlmIChkdnRhc2tRX3JlbGVhc2UpIHsKKwkJZHZ0YXNrUV9hY3RpdmUgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdnRhc2tRX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdnRhc2tRX2xvY2ssIGZsYWdzKTsKKworCS8qIEZvciB0aGlzIGlvYywgbG9vcCB0aHJvdWdoIGFsbCBkZXZpY2VzIGFuZCBkbyBkdiB0byBlYWNoIGRldmljZS4KKwkgKiBXaGVuIGNvbXBsZXRlIHdpdGggdGhpcyBpb2MsIHNlYXJjaCB0aHJvdWdoIHRoZSBpb2MgbGlzdCwgYW5kCisJICogZm9yIGVhY2ggc2NzaSBpb2MgZm91bmQsIGRvIGR2IGZvciBhbGwgZGV2aWNlcy4gRXhpdCB3aGVuIG5vCisJICogZGV2aWNlIG5lZWRzIGR2LgorCSAqLworCWRpZCA9IDE7CisJd2hpbGUgKGRpZCkgeworCQlkaWQgPSAwOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlvYywgJmlvY19saXN0LCBsaXN0KSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHZ0YXNrUV9sb2NrLCBmbGFncyk7CisJCQlpZiAoZHZ0YXNrUV9yZWxlYXNlKSB7CisJCQkJZHZ0YXNrUV9hY3RpdmUgPSAwOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR2dGFza1FfbG9jaywgZmxhZ3MpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR2dGFza1FfbG9jaywgZmxhZ3MpOworCisJCQltc2xlZXAoMjUwKTsKKworCQkJLyogRFYgb25seSB0byBTQ1NJIGFkYXB0ZXJzICovCisJCQlpZiAoaW9jLT5idXNfdHlwZSAhPSBTQ1NJKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBNYWtlIHN1cmUgZXZlcnl0aGluZyBsb29rcyBvayAqLworCQkJaWYgKGlvYy0+c2ggPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKworCQkJaGQgPSAoTVBUX1NDU0lfSE9TVCAqKSBpb2MtPnNoLT5ob3N0ZGF0YTsKKwkJCWlmIChoZCA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoKGlvYy0+c3BpX2RhdGEuZm9yY2VEdiAmIE1QVF9TQ1NJQ0ZHX1JFTE9BRF9JT0NfUEczKSAhPSAwKSB7CisJCQkJbXB0X3JlYWRfaW9jX3BnXzMoaW9jKTsKKwkJCQlpZiAoaW9jLT5zcGlfZGF0YS5wSW9jUGczKSB7CisJCQkJCUlvYzNQaHlzRGlza190ICpwUERpc2sgPSBpb2MtPnNwaV9kYXRhLnBJb2NQZzMtPlBoeXNEaXNrOworCQkJCQlpbnQJCW51bVBEaXNrID0gaW9jLT5zcGlfZGF0YS5wSW9jUGczLT5OdW1QaHlzRGlza3M7CisKKwkJCQkJd2hpbGUgKG51bVBEaXNrKSB7CisJCQkJCQlpZiAoaW9jLT5zcGlfZGF0YS5kdlN0YXR1c1twUERpc2stPlBoeXNEaXNrSURdICYgTVBUX1NDU0lDRkdfRFZfTk9UX0RPTkUpCisJCQkJCQkJaW9jLT5zcGlfZGF0YS5kdlN0YXR1c1twUERpc2stPlBoeXNEaXNrSURdIHw9IE1QVF9TQ1NJQ0ZHX05FRURfRFY7CisKKwkJCQkJCXBQRGlzaysrOworCQkJCQkJbnVtUERpc2stLTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpb2MtPnNwaV9kYXRhLmZvcmNlRHYgJj0gfk1QVF9TQ1NJQ0ZHX1JFTE9BRF9JT0NfUEczOworCQkJfQorCisJCQltYXhpZCA9IG1pbl90KGludCwgaW9jLT5zaC0+bWF4X2lkLCBNUFRfTUFYX1NDU0lfREVWSUNFUyk7CisKKwkJCWZvciAoaWQgPSAwOyBpZCA8IG1heGlkOyBpZCsrKSB7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmR2dGFza1FfbG9jaywgZmxhZ3MpOworCQkJCWlmIChkdnRhc2tRX3JlbGVhc2UpIHsKKwkJCQkJZHZ0YXNrUV9hY3RpdmUgPSAwOworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdnRhc2tRX2xvY2ssIGZsYWdzKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdnRhc2tRX2xvY2ssIGZsYWdzKTsKKwkJCQlkdlN0YXR1cyA9IGhkLT5pb2MtPnNwaV9kYXRhLmR2U3RhdHVzW2lkXTsKKworCQkJCWlmIChkdlN0YXR1cyAmIE1QVF9TQ1NJQ0ZHX05FRURfRFYpIHsKKwkJCQkJZGlkKys7CisJCQkJCWhkLT5pb2MtPnNwaV9kYXRhLmR2U3RhdHVzW2lkXSB8PSBNUFRfU0NTSUNGR19EVl9QRU5ESU5HOworCQkJCQloZC0+aW9jLT5zcGlfZGF0YS5kdlN0YXR1c1tpZF0gJj0gfk1QVF9TQ1NJQ0ZHX05FRURfRFY7CisKKwkJCQkJbXNsZWVwKDI1MCk7CisKKwkJCQkJLyogSWYgaGlkZGVuIHBoeXMgZGlzaywgYmxvY2sgSU8ncyB0byBhbGwKKwkJCQkJICoJcmFpZCB2b2x1bWVzCisJCQkJCSAqIGVsc2UsIHByb2Nlc3Mgbm9ybWFsbHkKKwkJCQkJICovCisJCQkJCWlzUGh5c0Rpc2sgPSBtcHRzY3NpaF9pc19waHlzX2Rpc2soaW9jLCBpZCk7CisJCQkJCWlmIChpc1BoeXNEaXNrKSB7CisJCQkJCQlmb3IgKGlpPTA7IGlpIDwgTVBUX01BWF9TQ1NJX0RFVklDRVM7IGlpKyspIHsKKwkJCQkJCQlpZiAoaGQtPmlvYy0+c3BpX2RhdGEuaXNSYWlkICYgKDEgPDwgaWkpKSB7CisJCQkJCQkJCWhkLT5pb2MtPnNwaV9kYXRhLmR2U3RhdHVzW2lpXSB8PSBNUFRfU0NTSUNGR19EVl9QRU5ESU5HOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWlmIChtcHRzY3NpaF9kb0R2KGhkLCAwLCBpZCkgPT0gMSkgeworCQkJCQkJLyogVW50YWdnZWQgZGV2aWNlIHdhcyBidXN5LCB0cnkgYWdhaW4KKwkJCQkJCSAqLworCQkJCQkJaGQtPmlvYy0+c3BpX2RhdGEuZHZTdGF0dXNbaWRdIHw9IE1QVF9TQ1NJQ0ZHX05FRURfRFY7CisJCQkJCQloZC0+aW9jLT5zcGlfZGF0YS5kdlN0YXR1c1tpZF0gJj0gfk1QVF9TQ1NJQ0ZHX0RWX1BFTkRJTkc7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKiBEViBpcyBjb21wbGV0ZS4gQ2xlYXIgZmxhZ3MuCisJCQkJCQkgKi8KKwkJCQkJCWhkLT5pb2MtPnNwaV9kYXRhLmR2U3RhdHVzW2lkXSAmPSB+KE1QVF9TQ1NJQ0ZHX0RWX05PVF9ET05FIHwgTVBUX1NDU0lDRkdfRFZfUEVORElORyk7CisJCQkJCX0KKworCQkJCQlpZiAoaXNQaHlzRGlzaykgeworCQkJCQkJZm9yIChpaT0wOyBpaSA8IE1QVF9NQVhfU0NTSV9ERVZJQ0VTOyBpaSsrKSB7CisJCQkJCQkJaWYgKGhkLT5pb2MtPnNwaV9kYXRhLmlzUmFpZCAmICgxIDw8IGlpKSkgeworCQkJCQkJCQloZC0+aW9jLT5zcGlfZGF0YS5kdlN0YXR1c1tpaV0gJj0gfk1QVF9TQ1NJQ0ZHX0RWX1BFTkRJTkc7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKGhkLT5pb2MtPnNwaV9kYXRhLm5vUWFzKQorCQkJCQkJbXB0c2NzaWhfcWFzX2NoZWNrKGhkLCBpZCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmR2dGFza1FfbG9jaywgZmxhZ3MpOworCWR2dGFza1FfYWN0aXZlID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdnRhc2tRX2xvY2ssIGZsYWdzKTsKKworCXJldHVybjsKK30KKworLyogU2VhcmNoIElPQyBwYWdlIDMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgaGlkZGVuIHBoeXNpY2FsIGRpc2sKKyAqLworc3RhdGljIGludCBtcHRzY3NpaF9pc19waHlzX2Rpc2soTVBUX0FEQVBURVIgKmlvYywgaW50IGlkKQoreworCWlmIChpb2MtPnNwaV9kYXRhLnBJb2NQZzMpIHsKKwkJSW9jM1BoeXNEaXNrX3QgKnBQRGlzayA9ICBpb2MtPnNwaV9kYXRhLnBJb2NQZzMtPlBoeXNEaXNrOworCQlpbnQJCW51bVBEaXNrID0gaW9jLT5zcGlfZGF0YS5wSW9jUGczLT5OdW1QaHlzRGlza3M7CisKKwkJd2hpbGUgKG51bVBEaXNrKSB7CisJCQlpZiAocFBEaXNrLT5QaHlzRGlza0lEID09IGlkKSB7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlwUERpc2srKzsKKwkJCW51bVBEaXNrLS07CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFdyaXRlIFNEUDEgaWYgbm8gUUFTIGhhcyBiZWVuIGVuYWJsZWQKKyAqLworc3RhdGljIHZvaWQgbXB0c2NzaWhfcWFzX2NoZWNrKE1QVF9TQ1NJX0hPU1QgKmhkLCBpbnQgaWQpCit7CisJVmlydERldmljZSAqcFRhcmdldDsKKwlpbnQgaWk7CisKKwlpZiAoaGQtPlRhcmdldHMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZm9yIChpaT0wOyBpaSA8IE1QVF9NQVhfU0NTSV9ERVZJQ0VTOyBpaSsrKSB7CisJCWlmIChpaSA9PSBpZCkKKwkJCWNvbnRpbnVlOworCisJCWlmICgoaGQtPmlvYy0+c3BpX2RhdGEuZHZTdGF0dXNbaWldICYgTVBUX1NDU0lDRkdfRFZfTk9UX0RPTkUpICE9IDApCisJCQljb250aW51ZTsKKworCQlwVGFyZ2V0ID0gaGQtPlRhcmdldHNbaWldOworCisJCWlmICgocFRhcmdldCAhPSBOVUxMKSAmJiAoIXBUYXJnZXQtPnJhaWRWb2x1bWUpKSB7CisJCQlpZiAoKHBUYXJnZXQtPm5lZ29GbGFncyAmIGhkLT5pb2MtPnNwaV9kYXRhLm5vUWFzKSA9PSAwKSB7CisJCQkJcFRhcmdldC0+bmVnb0ZsYWdzIHw9IGhkLT5pb2MtPnNwaV9kYXRhLm5vUWFzOworCQkJCWRuZWdvcHJpbnRrKCgid3JpdGVTRFAxOiBpZD0lZCBmbGFncz0wXG4iLCBpZCkpOworCQkJCW1wdHNjc2loX3dyaXRlU0RQMShoZCwgMCwgaWksIDApOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKG1wdHNjc2loX2lzX3BoeXNfZGlzayhoZC0+aW9jLCBpaSkgPT0gMSkgeworCQkJCWRuZWdvcHJpbnRrKCgid3JpdGVTRFAxOiBpZD0lZCBTQ1NJQ0ZHX1VTRV9OVlJBTVxuIiwgaWQpKTsKKwkJCQltcHRzY3NpaF93cml0ZVNEUDEoaGQsIDAsIGlpLCBNUFRfU0NTSUNGR19VU0VfTlZSQU0pOworCQkJfQorCQl9CisJfQorCXJldHVybjsKK30KKworCisKKyNkZWZpbmUgTVBUX0dFVF9OVlJBTV9WQUxTCTB4MDEKKyNkZWZpbmUgTVBUX1VQREFURV9NQVgJCTB4MDIKKyNkZWZpbmUgTVBUX1NFVF9NQVgJCTB4MDQKKyNkZWZpbmUgTVBUX1NFVF9NSU4JCTB4MDgKKyNkZWZpbmUgTVBUX0ZBTExCQUNLCQkweDEwCisjZGVmaW5lIE1QVF9TQVZFCQkweDIwCisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qKgorICoJbXB0c2NzaWhfZG9EdiAtIFBlcmZvcm0gZG9tYWluIHZhbGlkYXRpb24gdG8gYSB0YXJnZXQuCisgKglAaGQ6IFBvaW50ZXIgdG8gTVBUX1NDU0lfSE9TVCBzdHJ1Y3R1cmUuCisgKglAcG9ydG51bTogSU9DIHBvcnQgbnVtYmVyLgorICoJQHRhcmdldDogUGh5c2ljYWwgSUQgb2YgdGhpcyB0YXJnZXQKKyAqCisgKglVc2VzIHRoZSBJU1IsIGJ1dCB3aXRoIHNwZWNpYWwgcHJvY2Vzc2luZy4KKyAqCU1VU1QgYmUgc2luZ2xlLXRocmVhZGVkLgorICoJVGVzdCB3aWxsIGV4aXQgaWYgdGFyZ2V0IGlzIGF0IGFzeW5jICYgbmFycm93LgorICoKKyAqCVJldHVybjogTm9uZS4KKyAqLworc3RhdGljIGludAorbXB0c2NzaWhfZG9EdihNUFRfU0NTSV9IT1NUICpoZCwgaW50IGJ1c19udW1iZXIsIGludCBpZCkKK3sKKwlNUFRfQURBUFRFUgkJKmlvYyA9IGhkLT5pb2M7CisJVmlydERldmljZQkJKnBUYXJnZXQ7CisJU0NTSURldmljZVBhZ2UxX3QJKnBjZmcxRGF0YTsKKwlTQ1NJRGV2aWNlUGFnZTBfdAkqcGNmZzBEYXRhOworCXU4CQkJKnBidWYxOworCXU4CQkJKnBidWYyOworCXU4CQkJKnBEdkJ1ZjsKKwlkbWFfYWRkcl90CQkgZHZidWZfZG1hID0gLTE7CisJZG1hX2FkZHJfdAkJIGJ1ZjFfZG1hID0gLTE7CisJZG1hX2FkZHJfdAkJIGJ1ZjJfZG1hID0gLTE7CisJZG1hX2FkZHJfdAkJIGNmZzFfZG1hX2FkZHIgPSAtMTsKKwlkbWFfYWRkcl90CQkgY2ZnMF9kbWFfYWRkciA9IC0xOworCUNvbmZpZ1BhZ2VIZWFkZXJfdAkgaGVhZGVyMTsKKwlDb25maWdQYWdlSGVhZGVyX3QJIGhlYWRlcjA7CisJRFZQQVJBTUVURVJTCQkgZHY7CisJSU5URVJOQUxfQ01ECQkgaW9jbWQ7CisJQ09ORklHUEFSTVMJCSBjZmc7CisJaW50CQkJIGR2X2FsbG9jID0gMDsKKwlpbnQJCQkgcmMsIHN6ID0gMDsKKwlpbnQJCQkgYnVmc2l6ZSA9IDA7CisJaW50CQkJIGRhdGFCdWZTaXplID0gMDsKKwlpbnQJCQkgZWNob0J1ZlNpemUgPSAwOworCWludAkJCSBub3REb25lOworCWludAkJCSBwYXR0OworCWludAkJCSByZXBlYXQ7CisJaW50CQkJIHJldGNvZGUgPSAwOworCWludAkJCSBuZmFjdG9yID0gIE1QVF9VTFRSQTMyMDsKKwljaGFyCQkJIGZpcnN0UGFzcyA9IDE7CisJY2hhcgkJCSBkb0ZhbGxiYWNrID0gMDsKKwljaGFyCQkJIHJlYWRQYWdlMDsKKwljaGFyCQkJIGJ1cywgbHVuOworCWNoYXIJCQkgaW5xMCA9IDA7CisKKwlpZiAoaW9jLT5zcGlfZGF0YS5zZHAxbGVuZ3RoID09IDApCisJCXJldHVybiAwOworCisJaWYgKGlvYy0+c3BpX2RhdGEuc2RwMGxlbmd0aCA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIElmIG11bHRpcGxlIGJ1c2VzIGFyZSB1c2VkLCByZXF1aXJlIHRoYXQgdGhlIGluaXRpYXRvcgorCSAqIGlkIGJlIHRoZSBzYW1lIG9uIGFsbCBidXNlcy4KKwkgKi8KKwlpZiAoaWQgPT0gaW9jLT5wZmFjdHNbMF0uUG9ydFNDU0lJRCkKKwkJcmV0dXJuIDA7CisKKwlsdW4gPSAwOworCWJ1cyA9ICh1OCkgYnVzX251bWJlcjsKKwlkZHZ0cHJpbnRrKChNWUlPQ19zX05PVEVfRk1UCisJCQkiRFYgc3RhcnRlZDogYnVzPSVkLCBpZD0lZCBkdiBAICVwXG4iLAorCQkJaW9jLT5uYW1lLCBidXMsIGlkLCAmZHYpKTsKKworCS8qIFByZXAgRFYgc3RydWN0dXJlCisJICovCisJbWVtc2V0ICgmZHYsIDAsIHNpemVvZihEVlBBUkFNRVRFUlMpKTsKKwlkdi5pZCA9IGlkOworCisJLyogUG9wdWxhdGUgdG1heCB3aXRoIHRoZSBjdXJyZW50IG1heGltdW0KKwkgKiB0cmFuc2ZlciBwYXJhbWV0ZXJzIGZvciB0aGlzIHRhcmdldC4KKwkgKiBFeGl0IGlmIG5hcnJvdyBhbmQgYXN5bmMuCisJICovCisJZHYuY21kID0gTVBUX0dFVF9OVlJBTV9WQUxTOworCW1wdHNjc2loX2R2X3Bhcm1zKGhkLCAmZHYsIE5VTEwpOworCisJLyogUHJlcCBTQ1NJIElPIHN0cnVjdHVyZQorCSAqLworCWlvY21kLmlkID0gaWQ7CisJaW9jbWQuYnVzID0gYnVzOworCWlvY21kLmx1biA9IGx1bjsKKwlpb2NtZC5mbGFncyA9IDA7CisJaW9jbWQucGh5c0Rpc2tOdW0gPSAtMTsKKwlpb2NtZC5yc3ZkID0gaW9jbWQucnN2ZDIgPSAwOworCisJcFRhcmdldCA9IGhkLT5UYXJnZXRzW2lkXTsKKworCS8qIFVzZSB0YWdnZWQgY29tbWFuZHMgaWYgcG9zc2libGUuCisJICovCisJaWYgKHBUYXJnZXQpIHsKKwkJaWYgKHBUYXJnZXQtPnRmbGFncyAmIE1QVF9UQVJHRVRfRkxBR1NfUV9ZRVMpCisJCQlpb2NtZC5mbGFncyB8PSBNUFRfSUNGTEFHX1RBR0dFRF9DTUQ7CisJCWVsc2UgeworCQkJaWYgKGhkLT5pb2MtPmZhY3RzLkZXVmVyc2lvbi5Xb3JkIDwgMHgwMTAwMDYwMCkKKwkJCQlyZXR1cm4gMDsKKworCQkJaWYgKChoZC0+aW9jLT5mYWN0cy5GV1ZlcnNpb24uV29yZCA+PSAweDAxMDEwMDAwKSAmJgorCQkJCShoZC0+aW9jLT5mYWN0cy5GV1ZlcnNpb24uV29yZCA8IDB4MDEwMTBCMDApKQorCQkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogUHJlcCBjZmcgc3RydWN0dXJlCisJICovCisJY2ZnLnBhZ2VBZGRyID0gKGJ1czw8OCkgfCBpZDsKKwljZmcuaGRyID0gTlVMTDsKKworCS8qIFByZXAgU0RQMCBoZWFkZXIKKwkgKi8KKwloZWFkZXIwLlBhZ2VWZXJzaW9uID0gaW9jLT5zcGlfZGF0YS5zZHAwdmVyc2lvbjsKKwloZWFkZXIwLlBhZ2VMZW5ndGggPSBpb2MtPnNwaV9kYXRhLnNkcDBsZW5ndGg7CisJaGVhZGVyMC5QYWdlTnVtYmVyID0gMDsKKwloZWFkZXIwLlBhZ2VUeXBlID0gTVBJX0NPTkZJR19QQUdFVFlQRV9TQ1NJX0RFVklDRTsKKworCS8qIFByZXAgU0RQMSBoZWFkZXIKKwkgKi8KKwloZWFkZXIxLlBhZ2VWZXJzaW9uID0gaW9jLT5zcGlfZGF0YS5zZHAxdmVyc2lvbjsKKwloZWFkZXIxLlBhZ2VMZW5ndGggPSBpb2MtPnNwaV9kYXRhLnNkcDFsZW5ndGg7CisJaGVhZGVyMS5QYWdlTnVtYmVyID0gMTsKKwloZWFkZXIxLlBhZ2VUeXBlID0gTVBJX0NPTkZJR19QQUdFVFlQRV9TQ1NJX0RFVklDRTsKKworCWlmIChoZWFkZXIwLlBhZ2VMZW5ndGggJiAxKQorCQlkdl9hbGxvYyA9IChoZWFkZXIwLlBhZ2VMZW5ndGggKiA0KSArIDQ7CisKKwlkdl9hbGxvYyArPSAgKDIwNDggKyAoaGVhZGVyMS5QYWdlTGVuZ3RoICogNCkpOworCisJcER2QnVmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaW9jLT5wY2lkZXYsIGR2X2FsbG9jLCAmZHZidWZfZG1hKTsKKwlpZiAocER2QnVmID09IE5VTEwpCisJCXJldHVybiAwOworCisJc3ogPSAwOworCXBidWYxID0gKHU4ICopcER2QnVmOworCWJ1ZjFfZG1hID0gZHZidWZfZG1hOworCXN6ICs9MTAyNDsKKworCXBidWYyID0gKHU4ICopIChwRHZCdWYgKyBzeik7CisJYnVmMl9kbWEgPSBkdmJ1Zl9kbWEgKyBzejsKKwlzeiArPTEwMjQ7CisKKwlwY2ZnMERhdGEgPSAoU0NTSURldmljZVBhZ2UwX3QgKikgKHBEdkJ1ZiArIHN6KTsKKwljZmcwX2RtYV9hZGRyID0gZHZidWZfZG1hICsgc3o7CisJc3ogKz0gaGVhZGVyMC5QYWdlTGVuZ3RoICogNDsKKworCS8qIDgtYnl0ZSBhbGlnbm1lbnQKKwkgKi8KKwlpZiAoaGVhZGVyMC5QYWdlTGVuZ3RoICYgMSkKKwkJc3ogKz0gNDsKKworCXBjZmcxRGF0YSA9IChTQ1NJRGV2aWNlUGFnZTFfdCAqKSAocER2QnVmICsgc3opOworCWNmZzFfZG1hX2FkZHIgPSBkdmJ1Zl9kbWEgKyBzejsKKworCS8qIFNraXAgdGhpcyBJRD8gU2V0IGNmZy5oZHIgdG8gZm9yY2UgY29uZmlnIHBhZ2Ugd3JpdGUKKwkgKi8KKwl7CisJCVNjc2lDZmdEYXRhICpwc3BpX2RhdGEgPSAmaGQtPmlvYy0+c3BpX2RhdGE7CisJCWlmIChwc3BpX2RhdGEtPm52cmFtICYmIChwc3BpX2RhdGEtPm52cmFtW2lkXSAhPSBNUFRfSE9TVF9OVlJBTV9JTlZBTElEKSkgeworCQkJLyogU2V0IHRoZSBmYWN0b3IgZnJvbSBudnJhbSAqLworCQkJbmZhY3RvciA9IChwc3BpX2RhdGEtPm52cmFtW2lkXSAmIE1QVF9OVlJBTV9TWU5DX01BU0spID4+IDg7CisJCQlpZiAobmZhY3RvciA8IHBzcGlfZGF0YS0+bWluU3luY0ZhY3RvciApCisJCQkJbmZhY3RvciA9IHBzcGlfZGF0YS0+bWluU3luY0ZhY3RvcjsKKworCQkJaWYgKCEocHNwaV9kYXRhLT5udnJhbVtpZF0gJiBNUFRfTlZSQU1fSURfU0NBTl9FTkFCTEUpIHx8CisJCQkJKHBzcGlfZGF0YS0+UG9ydEZsYWdzID09IE1QSV9TQ1NJUE9SVFBBR0UyX1BPUlRfRkxBR1NfT0ZGX0RWKSApIHsKKworCQkJCWRkdnByaW50aygoTVlJT0Nfc19OT1RFX0ZNVCAiRFYgU2tpcHBlZDogYnVzLCBpZCwgbHVuICglZCwgJWQsICVkKVxuIiwKKwkJCQkJaW9jLT5uYW1lLCBidXMsIGlkLCBsdW4pKTsKKworCQkJCWR2LmNtZCA9IE1QVF9TRVRfTUFYOworCQkJCW1wdHNjc2loX2R2X3Bhcm1zKGhkLCAmZHYsICh2b2lkICopcGNmZzFEYXRhKTsKKwkJCQljZmcuaGRyID0gJmhlYWRlcjE7CisKKwkJCQkvKiBTYXZlIHRoZSBmaW5hbCBuZWdvdGlhdGVkIHNldHRpbmdzIHRvCisJCQkJICogU0NTSSBkZXZpY2UgcGFnZSAxLgorCQkJCSAqLworCQkJCWNmZy5waHlzQWRkciA9IGNmZzFfZG1hX2FkZHI7CisJCQkJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfV1JJVEVfQ1VSUkVOVDsKKwkJCQljZmcuZGlyID0gMTsKKwkJCQltcHRfY29uZmlnKGhkLT5pb2MsICZjZmcpOworCQkJCWdvdG8gdGFyZ2V0X2RvbmU7CisJCQl9CisJCX0KKwl9CisKKwkvKiBGaW5pc2ggaW9jbWQgaW5pdGl0aWFsaXphdGlvbiAtIGhpZGRlbiBvciB2aXNpYmxlIGRpc2s/ICovCisJaWYgKGlvYy0+c3BpX2RhdGEucElvY1BnMykgeworCQkvKiBTZWFyY2ggSU9DIHBhZ2UgMyBmb3IgbWF0Y2hpbmcgaWQKKwkJICovCisJCUlvYzNQaHlzRGlza190ICpwUERpc2sgPSAgaW9jLT5zcGlfZGF0YS5wSW9jUGczLT5QaHlzRGlzazsKKwkJaW50CQludW1QRGlzayA9IGlvYy0+c3BpX2RhdGEucElvY1BnMy0+TnVtUGh5c0Rpc2tzOworCisJCXdoaWxlIChudW1QRGlzaykgeworCQkJaWYgKHBQRGlzay0+UGh5c0Rpc2tJRCA9PSBpZCkgeworCQkJCS8qIG1hdGNoICovCisJCQkJaW9jbWQuZmxhZ3MgfD0gTVBUX0lDRkxBR19QSFlTX0RJU0s7CisJCQkJaW9jbWQucGh5c0Rpc2tOdW0gPSBwUERpc2stPlBoeXNEaXNrTnVtOworCisJCQkJLyogUXVpZXNjZSB0aGUgSU0KKwkJCQkgKi8KKwkJCQlpZiAobXB0c2NzaWhfZG9fcmFpZChoZCwgTVBJX1JBSURfQUNUSU9OX1FVSUVTQ0VfUEhZU19JTywgJmlvY21kKSA8IDApIHsKKwkJCQkJZGR2cHJpbnRrKChNWUlPQ19zX0VSUl9GTVQgIlJBSUQgUXVlaXNjZSBGQUlMRUQhXG4iLCBpb2MtPm5hbWUpKTsKKwkJCQkJZ290byB0YXJnZXRfZG9uZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlwUERpc2srKzsKKwkJCW51bVBEaXNrLS07CisJCX0KKwl9CisKKwkvKiBSQUlEIFZvbHVtZSBJRCdzIG1heSBkb3VibGUgZm9yIGEgcGh5c2ljYWwgZGV2aWNlLiBJZiBSQUlEIGJ1dAorCSAqIG5vdCBhIHBoeXNpY2FsIElEIGFzIHdlbGwsIHNraXAgRFYuCisJICovCisJaWYgKChoZC0+aW9jLT5zcGlfZGF0YS5pc1JhaWQgJiAoMSA8PCBpZCkpICYmICEoaW9jbWQuZmxhZ3MgJiBNUFRfSUNGTEFHX1BIWVNfRElTSykpCisJCWdvdG8gdGFyZ2V0X2RvbmU7CisKKworCS8qIEJhc2ljIFRlc3QuCisJICogQXN5bmMgJiBOYXJyb3cgLSBJbnF1aXJ5CisJICogQXN5bmMgJiBOYXJyb3cgLSBJbnF1aXJ5CisJICogTWF4aW11bSB0cmFuc2ZlciByYXRlIC0gSW5xdWlyeQorCSAqIENvbXBhcmUgYnVmZmVyczoKKwkgKglJZiBjb21wYXJlLCB0ZXN0IGNvbXBsZXRlLgorCSAqCUlmIG1pc2NvbXBhcmUgYW5kIGZpcnN0IHBhc3MsIHJlcGVhdAorCSAqCUlmIG1pc2NvbXBhcmUgYW5kIG5vdCBmaXJzdCBwYXNzLCBmYWxsIGJhY2sgYW5kIHJlcGVhdAorCSAqLworCWhkLT5wTG9jYWwgPSBOVUxMOworCXJlYWRQYWdlMCA9IDA7CisJc3ogPSBTQ1NJX01BWF9JTlFVSVJZX0JZVEVTOworCXJjID0gTVBUX1NDQU5EVl9HT09EOworCXdoaWxlICgxKSB7CisJCWRkdnByaW50aygoTVlJT0Nfc19OT1RFX0ZNVCAiRFY6IFN0YXJ0IEJhc2ljIHRlc3Qgb24gaWQ9JWRcbiIsIGlvYy0+bmFtZSwgaWQpKTsKKwkJcmV0Y29kZSA9IDA7CisJCWR2LmNtZCA9IE1QVF9TRVRfTUlOOworCQltcHRzY3NpaF9kdl9wYXJtcyhoZCwgJmR2LCAodm9pZCAqKXBjZmcxRGF0YSk7CisKKwkJY2ZnLmhkciA9ICZoZWFkZXIxOworCQljZmcucGh5c0FkZHIgPSBjZmcxX2RtYV9hZGRyOworCQljZmcuYWN0aW9uID0gTVBJX0NPTkZJR19BQ1RJT05fUEFHRV9XUklURV9DVVJSRU5UOworCQljZmcuZGlyID0gMTsKKwkJaWYgKG1wdF9jb25maWcoaGQtPmlvYywgJmNmZykgIT0gMCkKKwkJCWdvdG8gdGFyZ2V0X2RvbmU7CisKKwkJLyogV2lkZSAtIG5hcnJvdyAtIHdpZGUgd29ya2Fyb3VuZCBjYXNlCisJCSAqLworCQlpZiAoKHJjID09IE1QVF9TQ0FORFZfSVNTVUVfU0VOU0UpICYmIGR2Lm1heC53aWR0aCkgeworCQkJLyogU2VuZCBhbiB1bnRhZ2dlZCBjb21tYW5kIHRvIHJlc2V0IGRpc2sgUXMgY29ycnVwdGVkCisJCQkgKiB3aGVuIGEgcGFyaXR5IGVycm9yIG9jY3VycyBvbiBhIFJlcXVlc3QgU2Vuc2UuCisJCQkgKi8KKwkJCWlmICgoaGQtPmlvYy0+ZmFjdHMuRldWZXJzaW9uLldvcmQgPj0gMHgwMTAwMDYwMCkgfHwKKwkJCQkoKGhkLT5pb2MtPmZhY3RzLkZXVmVyc2lvbi5Xb3JkID49IDB4MDEwMTAwMDApICYmCisJCQkJKGhkLT5pb2MtPmZhY3RzLkZXVmVyc2lvbi5Xb3JkIDwgMHgwMTAxMEIwMCkpICkgeworCisJCQkJaW9jbWQuY21kID0gUkVRVUVTVF9TRU5TRTsKKwkJCQlpb2NtZC5kYXRhX2RtYSA9IGJ1ZjFfZG1hOworCQkJCWlvY21kLmRhdGEgPSBwYnVmMTsKKwkJCQlpb2NtZC5zaXplID0gMHgxMjsKKwkJCQlpZiAobXB0c2NzaWhfZG9fY21kKGhkLCAmaW9jbWQpIDwgMCkKKwkJCQkJZ290byB0YXJnZXRfZG9uZTsKKwkJCQllbHNlIHsKKwkJCQkJaWYgKGhkLT5wTG9jYWwgPT0gTlVMTCkKKwkJCQkJCWdvdG8gdGFyZ2V0X2RvbmU7CisJCQkJCXJjID0gaGQtPnBMb2NhbC0+Y29tcGxldGlvbjsKKwkJCQkJaWYgKChyYyA9PSBNUFRfU0NBTkRWX0dPT0QpIHx8IChyYyA9PSBNUFRfU0NBTkRWX1NFTlNFKSkgeworCQkJCQkJZHYubWF4LndpZHRoID0gMDsKKwkJCQkJCWRvRmFsbGJhY2sgPSAwOworCQkJCQl9IGVsc2UKKwkJCQkJCWdvdG8gdGFyZ2V0X2RvbmU7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJZ290byB0YXJnZXRfZG9uZTsKKwkJfQorCisJCWlvY21kLmNtZCA9IElOUVVJUlk7CisJCWlvY21kLmRhdGFfZG1hID0gYnVmMV9kbWE7CisJCWlvY21kLmRhdGEgPSBwYnVmMTsKKwkJaW9jbWQuc2l6ZSA9IHN6OworCQltZW1zZXQocGJ1ZjEsIDB4MDAsIHN6KTsKKwkJaWYgKG1wdHNjc2loX2RvX2NtZChoZCwgJmlvY21kKSA8IDApCisJCQlnb3RvIHRhcmdldF9kb25lOworCQllbHNlIHsKKwkJCWlmIChoZC0+cExvY2FsID09IE5VTEwpCisJCQkJZ290byB0YXJnZXRfZG9uZTsKKwkJCXJjID0gaGQtPnBMb2NhbC0+Y29tcGxldGlvbjsKKwkJCWlmIChyYyA9PSBNUFRfU0NBTkRWX0dPT0QpIHsKKwkJCQlpZiAoaGQtPnBMb2NhbC0+c2NzaVN0YXR1cyA9PSBTQU1fU1RBVF9CVVNZKSB7CisJCQkJCWlmICgoaW9jbWQuZmxhZ3MgJiBNUFRfSUNGTEFHX1RBR0dFRF9DTUQpID09IDApCisJCQkJCQlyZXRjb2RlID0gMTsKKwkJCQkJZWxzZQorCQkJCQkJcmV0Y29kZSA9IDA7CisKKwkJCQkJZ290byB0YXJnZXRfZG9uZTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgIChyYyA9PSBNUFRfU0NBTkRWX1NFTlNFKSB7CisJCQkJOworCQkJfSBlbHNlIHsKKwkJCQkvKiBJZiBmaXJzdCBjb21tYW5kIGRvZXNuJ3QgY29tcGxldGUKKwkJCQkgKiB3aXRoIGEgZ29vZCBzdGF0dXMgb3Igd2l0aCBhIGNoZWNrIGNvbmRpdGlvbiwKKwkJCQkgKiBleGl0LgorCQkJCSAqLworCQkJCWdvdG8gdGFyZ2V0X2RvbmU7CisJCQl9CisJCX0KKworCQkvKiBSZXNldCB0aGUgc2l6ZSBmb3IgZGlza3MKKwkJICovCisJCWlucTAgPSAoKnBidWYxKSAmIDB4MUY7CisJCWlmICgoaW5xMCA9PSAwKSAmJiBwVGFyZ2V0ICYmICFwVGFyZ2V0LT5yYWlkVm9sdW1lKSB7CisJCQlzeiA9IDB4NDA7CisJCQlpb2NtZC5zaXplID0gc3o7CisJCX0KKworCQkvKiBBbm90aGVyIEdFTSB3b3JrYXJvdW5kLiBDaGVjayBwZXJpcGhlcmFsIGRldmljZSB0eXBlLAorCQkgKiBpZiBQUk9DRVNTT1IsIHF1aXQgRFYuCisJCSAqLworCQlpZiAoaW5xMCA9PSBUWVBFX1BST0NFU1NPUikgeworCQkJbXB0c2NzaWhfaW5pdFRhcmdldChoZCwKKwkJCQlidXMsCisJCQkJaWQsCisJCQkJbHVuLAorCQkJCXBidWYxLAorCQkJCXN6KTsKKwkJCWdvdG8gdGFyZ2V0X2RvbmU7CisJCX0KKworCQlpZiAoaW5xMCA+IDB4MDgpCisJCQlnb3RvIHRhcmdldF9kb25lOworCisJCWlmIChtcHRzY3NpaF9kb19jbWQoaGQsICZpb2NtZCkgPCAwKQorCQkJZ290byB0YXJnZXRfZG9uZTsKKworCQlpZiAoc3ogPT0gMHg0MCkgeworCQkJaWYgKChwVGFyZ2V0LT5tYXhXaWR0aCA9PSAxKSAmJiAocFRhcmdldC0+bWF4T2Zmc2V0KSAmJiAobmZhY3RvciA8IDB4MEEpCisJCQkJJiYgKHBUYXJnZXQtPm1pblN5bmNGYWN0b3IgPiAweDA5KSkgeworCQkJCWlmICgocGJ1ZjFbNTZdICYgMHgwNCkgPT0gMCkKKwkJCQkJOworCQkJCWVsc2UgaWYgKChwYnVmMVs1Nl0gJiAweDAxKSA9PSAxKSB7CisJCQkJCXBUYXJnZXQtPm1pblN5bmNGYWN0b3IgPQorCQkJCQkgICAgbmZhY3RvciA+IE1QVF9VTFRSQTMyMCA/IG5mYWN0b3IgOiBNUFRfVUxUUkEzMjA7CisJCQkJfSBlbHNlIHsKKwkJCQkJcFRhcmdldC0+bWluU3luY0ZhY3RvciA9CisJCQkJCSAgICBuZmFjdG9yID4gTVBUX1VMVFJBMTYwID8gbmZhY3RvciA6IE1QVF9VTFRSQTE2MDsKKwkJCQl9CisKKwkJCQlkdi5tYXguZmFjdG9yID0gcFRhcmdldC0+bWluU3luY0ZhY3RvcjsKKworCQkJCWlmICgocGJ1ZjFbNTZdICYgMHgwMikgPT0gMCkgeworCQkJCQlwVGFyZ2V0LT5uZWdvRmxhZ3MgfD0gTVBUX1RBUkdFVF9OT19ORUdPX1FBUzsKKwkJCQkJaGQtPmlvYy0+c3BpX2RhdGEubm9RYXMgPSBNUFRfVEFSR0VUX05PX05FR09fUUFTOworCQkJCQlkZHZwcmludGsoKE1ZSU9DX3NfTk9URV9GTVQgCisJCQkJCSAgICAiRFY6IFN0YXJ0IEJhc2ljIG5vUWFzIG9uIGlkPSVkIGR1ZSB0byBwYnVmMVs1Nl09JXhcbiIsIAorCQkJCQkgICAgaW9jLT5uYW1lLCBpZCwgcGJ1ZjFbNTZdKSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGRvRmFsbGJhY2spCisJCQlkdi5jbWQgPSBNUFRfRkFMTEJBQ0s7CisJCWVsc2UKKwkJCWR2LmNtZCA9IE1QVF9TRVRfTUFYOworCisJCW1wdHNjc2loX2R2X3Bhcm1zKGhkLCAmZHYsICh2b2lkICopcGNmZzFEYXRhKTsKKwkJaWYgKG1wdF9jb25maWcoaGQtPmlvYywgJmNmZykgIT0gMCkKKwkJCWdvdG8gdGFyZ2V0X2RvbmU7CisKKwkJaWYgKCghZHYubm93LndpZHRoKSAmJiAoIWR2Lm5vdy5vZmZzZXQpKQorCQkJZ290byB0YXJnZXRfZG9uZTsKKworCQlpb2NtZC5jbWQgPSBJTlFVSVJZOworCQlpb2NtZC5kYXRhX2RtYSA9IGJ1ZjJfZG1hOworCQlpb2NtZC5kYXRhID0gcGJ1ZjI7CisJCWlvY21kLnNpemUgPSBzejsKKwkJbWVtc2V0KHBidWYyLCAweDAwLCBzeik7CisJCWlmIChtcHRzY3NpaF9kb19jbWQoaGQsICZpb2NtZCkgPCAwKQorCQkJZ290byB0YXJnZXRfZG9uZTsKKwkJZWxzZSBpZiAoaGQtPnBMb2NhbCA9PSBOVUxMKQorCQkJZ290byB0YXJnZXRfZG9uZTsKKwkJZWxzZSB7CisJCQkvKiBTYXZlIHRoZSByZXR1cm4gY29kZS4KKwkJCSAqIElmIHRoaXMgaXMgdGhlIGZpcnN0IHBhc3MsCisJCQkgKiByZWFkIFNDU0kgRGV2aWNlIFBhZ2UgMAorCQkJICogYW5kIHVwZGF0ZSB0aGUgdGFyZ2V0IG1heCBwYXJhbWV0ZXJzLgorCQkJICovCisJCQlyYyA9IGhkLT5wTG9jYWwtPmNvbXBsZXRpb247CisJCQlkb0ZhbGxiYWNrID0gMDsKKwkJCWlmIChyYyA9PSBNUFRfU0NBTkRWX0dPT0QpIHsKKwkJCQlpZiAoIXJlYWRQYWdlMCkgeworCQkJCQl1MzIgc2RwMF9pbmZvOworCQkJCQl1MzIgc2RwMF9uZWdvOworCisJCQkJCWNmZy5oZHIgPSAmaGVhZGVyMDsKKwkJCQkJY2ZnLnBoeXNBZGRyID0gY2ZnMF9kbWFfYWRkcjsKKwkJCQkJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfUkVBRF9DVVJSRU5UOworCQkJCQljZmcuZGlyID0gMDsKKworCQkJCQlpZiAobXB0X2NvbmZpZyhoZC0+aW9jLCAmY2ZnKSAhPSAwKQorCQkJCQkJZ290byB0YXJnZXRfZG9uZTsKKworCQkJCQlzZHAwX2luZm8gPSBsZTMyX3RvX2NwdShwY2ZnMERhdGEtPkluZm9ybWF0aW9uKSAmIDB4MEU7CisJCQkJCXNkcDBfbmVnbyA9IChsZTMyX3RvX2NwdShwY2ZnMERhdGEtPk5lZ290aWF0ZWRQYXJhbWV0ZXJzKSAmIDB4RkYwMCApID4+IDg7CisKKwkJCQkJLyogUXVhbnR1bSBhbmQgRnVqaXRzdSB3b3JrYXJvdW5kcy4KKwkJCQkJICogUXVhbnR1bTogUFBSIFUzMjAgLT4gUFBSIHJlcGx5IHdpdGggVWx0cmEyIGFuZCB3aWRlCisJCQkJCSAqIEZ1aml0c3U6IFBQUiBVMzIwIC0+IE1zZyBSZWplY3QgYW5kIFVsdHJhMiBhbmQgd2lkZQorCQkJCQkgKiBSZXNldGFydCB3aXRoIGEgcmVxdWVzdCBmb3IgVTE2MC4KKwkJCQkJICovCisJCQkJCWlmICgoZHYubm93LmZhY3RvciA9PSBNUFRfVUxUUkEzMjApICYmIChzZHAwX25lZ28gPT0gTVBUX1VMVFJBMikpIHsKKwkJCQkJCQlkb0ZhbGxiYWNrID0gMTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWR2LmNtZCA9IE1QVF9VUERBVEVfTUFYOworCQkJCQkJbXB0c2NzaWhfZHZfcGFybXMoaGQsICZkdiwgKHZvaWQgKilwY2ZnMERhdGEpOworCQkJCQkJLyogVXBkYXRlIHRoZSBTQ1NJIGRldmljZSBwYWdlIDEgYXJlYQorCQkJCQkJICovCisJCQkJCQlwY2ZnMURhdGEtPlJlcXVlc3RlZFBhcmFtZXRlcnMgPSBwY2ZnMERhdGEtPk5lZ290aWF0ZWRQYXJhbWV0ZXJzOworCQkJCQkJcmVhZFBhZ2UwID0gMTsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8qIFF1YW50dW0gd29ya2Fyb3VuZC4gUmVzdGFydCB0aGlzIHRlc3Qgd2lsbCB0aGUgZmFsbGJhY2sKKwkJCQkgKiBmbGFnIHNldC4KKwkJCQkgKi8KKwkJCQlpZiAoZG9GYWxsYmFjayA9PSAwKSB7CisJCQkJCWlmIChtZW1jbXAocGJ1ZjEsIHBidWYyLCBzeikgIT0gMCkgeworCQkJCQkJaWYgKCFmaXJzdFBhc3MpCisJCQkJCQkJZG9GYWxsYmFjayA9IDE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlkZHZwcmludGsoKE1ZSU9DX3NfTk9URV9GTVQgCisJCQkJCQkgICAgIkRWOklucXVpcnkgY29tcGFyZWQgaWQ9JWQsIGNhbGxpbmcgaW5pdFRhcmdldFxuIiwgaW9jLT5uYW1lLCBpZCkpOworCQkJCQkJaGQtPmlvYy0+c3BpX2RhdGEuZHZTdGF0dXNbaWRdICY9IH5NUFRfU0NTSUNGR19EVl9OT1RfRE9ORTsKKwkJCQkJCW1wdHNjc2loX2luaXRUYXJnZXQoaGQsCisJCQkJCQkJYnVzLAorCQkJCQkJCWlkLAorCQkJCQkJCWx1biwKKwkJCQkJCQlwYnVmMSwKKwkJCQkJCQlzeik7CisJCQkJCQlicmVhazsJLyogdGVzdCBjb21wbGV0ZSAqLworCQkJCQl9CisJCQkJfQorCisKKwkJCX0gZWxzZSBpZiAocmMgPT0gTVBUX1NDQU5EVl9JU1NVRV9TRU5TRSkKKwkJCQlkb0ZhbGxiYWNrID0gMTsJLyogc2V0IGZhbGxiYWNrIGZsYWcgKi8KKwkJCWVsc2UgaWYgKChyYyA9PSBNUFRfU0NBTkRWX0RJRF9SRVNFVCkgfHwgCisJCQkJIChyYyA9PSBNUFRfU0NBTkRWX1NFTlNFKSB8fCAKKwkJCQkgKHJjID09IE1QVF9TQ0FORFZfRkFMTEJBQ0spKQorCQkJCWRvRmFsbGJhY2sgPSAxOwkvKiBzZXQgZmFsbGJhY2sgZmxhZyAqLworCQkJZWxzZQorCQkJCWdvdG8gdGFyZ2V0X2RvbmU7CisKKwkJCWZpcnN0UGFzcyA9IDA7CisJCX0KKwl9CisJZGR2cHJpbnRrKChNWUlPQ19zX05PVEVfRk1UICJEVjogQmFzaWMgdGVzdCBvbiBpZD0lZCBjb21wbGV0ZWQgT0suXG4iLCBpb2MtPm5hbWUsIGlkKSk7CisKKwlpZiAobXB0X2R2ID09IDApCisJCWdvdG8gdGFyZ2V0X2RvbmU7CisKKwlpbnEwID0gKCpwYnVmMSkgJiAweDFGOworCisJLyogQ29udGludWUgb25seSBmb3IgZGlza3MKKwkgKi8KKwlpZiAoaW5xMCAhPSAwKQorCQlnb3RvIHRhcmdldF9kb25lOworCisJaWYgKCBpb2MtPnNwaV9kYXRhLlBvcnRGbGFncyA9PSBNUElfU0NTSVBPUlRQQUdFMl9QT1JUX0ZMQUdTX0JBU0lDX0RWX09OTFkgKQorCQlnb3RvIHRhcmdldF9kb25lOworCisJLyogU3RhcnQgdGhlIEVuaGFuY2VkIFRlc3QuCisJICogMCkgaXNzdWUgVFVSIHRvIGNsZWFyIG91dCBjaGVjayBjb25kaXRpb25zCisJICogMSkgcmVhZCBjYXBhY2l0eSBvZiBlY2hvIChyZWd1bGFyKSBidWZmZXIKKwkgKiAyKSByZXNlcnZlIGRldmljZQorCSAqIDMpIGRvIHdyaXRlLXJlYWQtY29tcGFyZSBkYXRhIHBhdHRlcm4gdGVzdAorCSAqIDQpIHJlbGVhc2UKKwkgKiA1KSB1cGRhdGUgbmVnbyBwYXJtcyB0byB0YXJnZXQgc3RydWN0CisJICovCisJY2ZnLmhkciA9ICZoZWFkZXIxOworCWNmZy5waHlzQWRkciA9IGNmZzFfZG1hX2FkZHI7CisJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfV1JJVEVfQ1VSUkVOVDsKKwljZmcuZGlyID0gMTsKKworCWlvY21kLmNtZCA9IFRFU1RfVU5JVF9SRUFEWTsKKwlpb2NtZC5kYXRhX2RtYSA9IC0xOworCWlvY21kLmRhdGEgPSBOVUxMOworCWlvY21kLnNpemUgPSAwOworCW5vdERvbmUgPSAxOworCXdoaWxlIChub3REb25lKSB7CisJCWlmIChtcHRzY3NpaF9kb19jbWQoaGQsICZpb2NtZCkgPCAwKQorCQkJZ290byB0YXJnZXRfZG9uZTsKKworCQlpZiAoaGQtPnBMb2NhbCA9PSBOVUxMKQorCQkJZ290byB0YXJnZXRfZG9uZTsKKworCQlyYyA9IGhkLT5wTG9jYWwtPmNvbXBsZXRpb247CisJCWlmIChyYyA9PSBNUFRfU0NBTkRWX0dPT0QpCisJCQlub3REb25lID0gMDsKKwkJZWxzZSBpZiAocmMgPT0gTVBUX1NDQU5EVl9TRU5TRSkgeworCQkJdTggc2tleSA9IGhkLT5wTG9jYWwtPnNlbnNlWzJdICYgMHgwRjsKKwkJCXU4IGFzYyA9IGhkLT5wTG9jYWwtPnNlbnNlWzEyXTsKKwkJCXU4IGFzY3EgPSBoZC0+cExvY2FsLT5zZW5zZVsxM107CisJCQlkZHZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQKKwkJCQkiU2Vuc2VLZXk6QVNDOkFTQ1EgPSAoJXg6JTAyeDolMDJ4KVxuIiwKKwkJCQlpb2MtPm5hbWUsIHNrZXksIGFzYywgYXNjcSkpOworCisJCQlpZiAoc2tleSA9PSBVTklUX0FUVEVOVElPTikKKwkJCQlub3REb25lKys7IC8qIHJlcGVhdCAqLworCQkJZWxzZSBpZiAoKHNrZXkgPT0gTk9UX1JFQURZKSAmJgorCQkJCQkoYXNjID09IDB4MDQpJiYoYXNjcSA9PSAweDAxKSkgeworCQkJCS8qIHdhaXQgdGhlbiByZXBlYXQgKi8KKwkJCQltZGVsYXkgKDIwMDApOworCQkJCW5vdERvbmUrKzsKKwkJCX0gZWxzZSBpZiAoKHNrZXkgPT0gTk9UX1JFQURZKSAmJiAoYXNjID09IDB4M0EpKSB7CisJCQkJLyogbm8gbWVkaXVtLCB0cnkgcmVhZCB0ZXN0IGFueXdheSAqLworCQkJCW5vdERvbmUgPSAwOworCQkJfSBlbHNlIHsKKwkJCQkvKiBBbGwgb3RoZXIgZXJyb3JzIGFyZSBmYXRhbC4KKwkJCQkgKi8KKwkJCQlkZHZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkRWOiBmYXRhbCBlcnJvci4iLAorCQkJCQkJaW9jLT5uYW1lKSk7CisJCQkJZ290byB0YXJnZXRfZG9uZTsKKwkJCX0KKwkJfSBlbHNlCisJCQlnb3RvIHRhcmdldF9kb25lOworCX0KKworCWlvY21kLmNtZCA9IFJFQURfQlVGRkVSOworCWlvY21kLmRhdGFfZG1hID0gYnVmMV9kbWE7CisJaW9jbWQuZGF0YSA9IHBidWYxOworCWlvY21kLnNpemUgPSA0OworCWlvY21kLmZsYWdzIHw9IE1QVF9JQ0ZMQUdfQlVGX0NBUDsKKworCWRhdGFCdWZTaXplID0gMDsKKwllY2hvQnVmU2l6ZSA9IDA7CisJZm9yIChwYXR0ID0gMDsgcGF0dCA8IDI7IHBhdHQrKykgeworCQlpZiAocGF0dCA9PSAwKQorCQkJaW9jbWQuZmxhZ3MgfD0gTVBUX0lDRkxBR19FQ0hPOworCQllbHNlCisJCQlpb2NtZC5mbGFncyAmPSB+TVBUX0lDRkxBR19FQ0hPOworCisJCW5vdERvbmUgPSAxOworCQl3aGlsZSAobm90RG9uZSkgeworCQkJYnVmc2l6ZSA9IDA7CisKKwkJCS8qIElmIG5vdCByZWFkeSBhZnRlciA4IHRyaWFscywKKwkJCSAqIGdpdmUgdXAgb24gdGhpcyBkZXZpY2UuCisJCQkgKi8KKwkJCWlmIChub3REb25lID4gOCkKKwkJCQlnb3RvIHRhcmdldF9kb25lOworCisJCQlpZiAobXB0c2NzaWhfZG9fY21kKGhkLCAmaW9jbWQpIDwgMCkKKwkJCQlnb3RvIHRhcmdldF9kb25lOworCQkJZWxzZSBpZiAoaGQtPnBMb2NhbCA9PSBOVUxMKQorCQkJCWdvdG8gdGFyZ2V0X2RvbmU7CisJCQllbHNlIHsKKwkJCQlyYyA9IGhkLT5wTG9jYWwtPmNvbXBsZXRpb247CisJCQkJZGR2cHJpbnRrKCgiUmVhZEJ1ZmZlciBDb21wIENvZGUgJWQiLCByYykpOworCQkJCWRkdnByaW50aygoIiAgYnVmZjogJTB4ICUweCAlMHggJTB4XG4iLAorCQkJCQlwYnVmMVswXSwgcGJ1ZjFbMV0sIHBidWYxWzJdLCBwYnVmMVszXSkpOworCisJCQkJaWYgKHJjID09IE1QVF9TQ0FORFZfR09PRCkgeworCQkJCQlub3REb25lID0gMDsKKwkJCQkJaWYgKGlvY21kLmZsYWdzICYgTVBUX0lDRkxBR19FQ0hPKSB7CisJCQkJCQlidWZzaXplID0gICgocGJ1ZjFbMl0gJiAweDFGKSA8PDgpIHwgcGJ1ZjFbM107CisJCQkJCX0gZWxzZSB7CisJCQkJCQlidWZzaXplID0gIHBidWYxWzFdPDwxNiB8IHBidWYxWzJdPDw4IHwgcGJ1ZjFbM107CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKHJjID09IE1QVF9TQ0FORFZfU0VOU0UpIHsKKwkJCQkJdTggc2tleSA9IGhkLT5wTG9jYWwtPnNlbnNlWzJdICYgMHgwRjsKKwkJCQkJdTggYXNjID0gaGQtPnBMb2NhbC0+c2Vuc2VbMTJdOworCQkJCQl1OCBhc2NxID0gaGQtPnBMb2NhbC0+c2Vuc2VbMTNdOworCQkJCQlkZHZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQKKwkJCQkJCSJTZW5zZUtleTpBU0M6QVNDUSA9ICgleDolMDJ4OiUwMngpXG4iLAorCQkJCQkJaW9jLT5uYW1lLCBza2V5LCBhc2MsIGFzY3EpKTsKKwkJCQkJaWYgKHNrZXkgPT0gSUxMRUdBTF9SRVFVRVNUKSB7CisJCQkJCQlub3REb25lID0gMDsKKwkJCQkJfSBlbHNlIGlmIChza2V5ID09IFVOSVRfQVRURU5USU9OKSB7CisJCQkJCQlub3REb25lKys7IC8qIHJlcGVhdCAqLworCQkJCQl9IGVsc2UgaWYgKChza2V5ID09IE5PVF9SRUFEWSkgJiYKKwkJCQkJCShhc2MgPT0gMHgwNCkmJihhc2NxID09IDB4MDEpKSB7CisJCQkJCQkvKiB3YWl0IHRoZW4gcmVwZWF0ICovCisJCQkJCQltZGVsYXkgKDIwMDApOworCQkJCQkJbm90RG9uZSsrOworCQkJCQl9IGVsc2UgeworCQkJCQkJLyogQWxsIG90aGVyIGVycm9ycyBhcmUgZmF0YWwuCisJCQkJCQkgKi8KKwkJCQkJCWRkdnByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiRFY6IGZhdGFsIGVycm9yLiIsCisJCQkJCQkJaW9jLT5uYW1lKSk7CisJCQkJCQlnb3RvIHRhcmdldF9kb25lOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogQWxsIG90aGVyIGVycm9ycyBhcmUgZmF0YWwKKwkJCQkJICovCisJCQkJCWdvdG8gdGFyZ2V0X2RvbmU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGlvY21kLmZsYWdzICYgTVBUX0lDRkxBR19FQ0hPKQorCQkJZWNob0J1ZlNpemUgPSBidWZzaXplOworCQllbHNlCisJCQlkYXRhQnVmU2l6ZSA9IGJ1ZnNpemU7CisJfQorCXN6ID0gMDsKKwlpb2NtZC5mbGFncyAmPSB+TVBUX0lDRkxBR19CVUZfQ0FQOworCisJLyogVXNlIGVjaG8gYnVmZmVycyBpZiBwb3NzaWJsZSwKKwkgKiBFeGl0IGlmIGJvdGggYnVmZmVycyBhcmUgMC4KKwkgKi8KKwlpZiAoZWNob0J1ZlNpemUgPiAwKSB7CisJCWlvY21kLmZsYWdzIHw9IE1QVF9JQ0ZMQUdfRUNITzsKKwkJaWYgKGRhdGFCdWZTaXplID4gMCkKKwkJCWJ1ZnNpemUgPSBtaW4oZWNob0J1ZlNpemUsIGRhdGFCdWZTaXplKTsKKwkJZWxzZQorCQkJYnVmc2l6ZSA9IGVjaG9CdWZTaXplOworCX0gZWxzZSBpZiAoZGF0YUJ1ZlNpemUgPT0gMCkKKwkJZ290byB0YXJnZXRfZG9uZTsKKworCWRkdnByaW50aygoTVlJT0Nfc19JTkZPX0ZNVCAiJXMgQnVmZmVyIENhcGFjaXR5ICVkXG4iLCBpb2MtPm5hbWUsCisJCShpb2NtZC5mbGFncyAmIE1QVF9JQ0ZMQUdfRUNITykgPyAiRWNobyIgOiAiICIsIGJ1ZnNpemUpKTsKKworCS8qIERhdGEgYnVmZmVycyBmb3Igd3JpdGUtcmVhZC1jb21wYXJlIHRlc3QgbWF4IDFLLgorCSAqLworCXN6ID0gbWluKGJ1ZnNpemUsIDEwMjQpOworCisJLyogLS0tIGxvb3AgLS0tLQorCSAqIE9uIGZpcnN0IHBhc3MsIGFsd2F5cyBpc3N1ZSBhIHJlc2VydmUuCisJICogT24gYWRkaXRpb25hbCBsb29wcywgb25seSBpZiBhIHJlc2V0IGhhcyBvY2N1cnJlZC4KKwkgKiBpb2NtZC5mbGFncyBpbmRpY2F0ZXMgaWYgZWNobyBvciByZWd1bGFyIGJ1ZmZlcgorCSAqLworCWZvciAocGF0dCA9IDA7IHBhdHQgPCA0OyBwYXR0KyspIHsKKwkJZGR2cHJpbnRrKCgiUGF0dGVybiAlZFxuIiwgcGF0dCkpOworCQlpZiAoKGlvY21kLmZsYWdzICYgTVBUX0lDRkxBR19SRVNFUlZFRCkgJiYgKGlvY21kLmZsYWdzICYgTVBUX0lDRkxBR19ESURfUkVTRVQpKSB7CisJCQlpb2NtZC5jbWQgPSBURVNUX1VOSVRfUkVBRFk7CisJCQlpb2NtZC5kYXRhX2RtYSA9IC0xOworCQkJaW9jbWQuZGF0YSA9IE5VTEw7CisJCQlpb2NtZC5zaXplID0gMDsKKwkJCWlmIChtcHRzY3NpaF9kb19jbWQoaGQsICZpb2NtZCkgPCAwKQorCQkJCWdvdG8gdGFyZ2V0X2RvbmU7CisKKwkJCWlvY21kLmNtZCA9IFJFTEVBU0U7CisJCQlpb2NtZC5kYXRhX2RtYSA9IC0xOworCQkJaW9jbWQuZGF0YSA9IE5VTEw7CisJCQlpb2NtZC5zaXplID0gMDsKKwkJCWlmIChtcHRzY3NpaF9kb19jbWQoaGQsICZpb2NtZCkgPCAwKQorCQkJCWdvdG8gdGFyZ2V0X2RvbmU7CisJCQllbHNlIGlmIChoZC0+cExvY2FsID09IE5VTEwpCisJCQkJZ290byB0YXJnZXRfZG9uZTsKKwkJCWVsc2UgeworCQkJCXJjID0gaGQtPnBMb2NhbC0+Y29tcGxldGlvbjsKKwkJCQlkZHZwcmludGsoKCJSZWxlYXNlIHJjICVkXG4iLCByYykpOworCQkJCWlmIChyYyA9PSBNUFRfU0NBTkRWX0dPT0QpCisJCQkJCWlvY21kLmZsYWdzICY9IH5NUFRfSUNGTEFHX1JFU0VSVkVEOworCQkJCWVsc2UKKwkJCQkJZ290byB0YXJnZXRfZG9uZTsKKwkJCX0KKwkJCWlvY21kLmZsYWdzICY9IH5NUFRfSUNGTEFHX1JFU0VSVkVEOworCQl9CisJCWlvY21kLmZsYWdzICY9IH5NUFRfSUNGTEFHX0RJRF9SRVNFVDsKKworCQlyZXBlYXQgPSA1OworCQl3aGlsZSAocmVwZWF0ICYmICghKGlvY21kLmZsYWdzICYgTVBUX0lDRkxBR19SRVNFUlZFRCkpKSB7CisJCQlpb2NtZC5jbWQgPSBSRVNFUlZFOworCQkJaW9jbWQuZGF0YV9kbWEgPSAtMTsKKwkJCWlvY21kLmRhdGEgPSBOVUxMOworCQkJaW9jbWQuc2l6ZSA9IDA7CisJCQlpZiAobXB0c2NzaWhfZG9fY21kKGhkLCAmaW9jbWQpIDwgMCkKKwkJCQlnb3RvIHRhcmdldF9kb25lOworCQkJZWxzZSBpZiAoaGQtPnBMb2NhbCA9PSBOVUxMKQorCQkJCWdvdG8gdGFyZ2V0X2RvbmU7CisJCQllbHNlIHsKKwkJCQlyYyA9IGhkLT5wTG9jYWwtPmNvbXBsZXRpb247CisJCQkJaWYgKHJjID09IE1QVF9TQ0FORFZfR09PRCkgeworCQkJCQlpb2NtZC5mbGFncyB8PSBNUFRfSUNGTEFHX1JFU0VSVkVEOworCQkJCX0gZWxzZSBpZiAocmMgPT0gTVBUX1NDQU5EVl9TRU5TRSkgeworCQkJCQkvKiBXYWl0IGlmIGNvbWluZyByZWFkeQorCQkJCQkgKi8KKwkJCQkJdTggc2tleSA9IGhkLT5wTG9jYWwtPnNlbnNlWzJdICYgMHgwRjsKKwkJCQkJdTggYXNjID0gaGQtPnBMb2NhbC0+c2Vuc2VbMTJdOworCQkJCQl1OCBhc2NxID0gaGQtPnBMb2NhbC0+c2Vuc2VbMTNdOworCQkJCQlkZHZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQKKwkJCQkJCSJEVjogUmVzZXJ2ZSBGYWlsZWQ6ICIsIGlvYy0+bmFtZSkpOworCQkJCQlkZHZwcmludGsoKCJTZW5zZUtleTpBU0M6QVNDUSA9ICgleDolMDJ4OiUwMngpXG4iLAorCQkJCQkJCXNrZXksIGFzYywgYXNjcSkpOworCisJCQkJCWlmICgoc2tleSA9PSBOT1RfUkVBRFkpICYmIChhc2MgPT0gMHgwNCkmJgorCQkJCQkJCQkJKGFzY3EgPT0gMHgwMSkpIHsKKwkJCQkJCS8qIHdhaXQgdGhlbiByZXBlYXQgKi8KKwkJCQkJCW1kZWxheSAoMjAwMCk7CisJCQkJCQlub3REb25lKys7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlkZHZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQKKwkJCQkJCQkiRFY6IFJlc2VydmVkIEZhaWxlZC4iLCBpb2MtPm5hbWUpKTsKKwkJCQkJCWdvdG8gdGFyZ2V0X2RvbmU7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlkZHZwcmludGsoKE1ZSU9DX3NfSU5GT19GTVQgIkRWOiBSZXNlcnZlZCBGYWlsZWQuIiwKKwkJCQkJCQkgaW9jLT5uYW1lKSk7CisJCQkJCWdvdG8gdGFyZ2V0X2RvbmU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJbXB0c2NzaWhfZmlsbGJ1ZihwYnVmMSwgc3osIHBhdHQsIDEpOworCQlpb2NtZC5jbWQgPSBXUklURV9CVUZGRVI7CisJCWlvY21kLmRhdGFfZG1hID0gYnVmMV9kbWE7CisJCWlvY21kLmRhdGEgPSBwYnVmMTsKKwkJaW9jbWQuc2l6ZSA9IHN6OworCQlpZiAobXB0c2NzaWhfZG9fY21kKGhkLCAmaW9jbWQpIDwgMCkKKwkJCWdvdG8gdGFyZ2V0X2RvbmU7CisJCWVsc2UgaWYgKGhkLT5wTG9jYWwgPT0gTlVMTCkKKwkJCWdvdG8gdGFyZ2V0X2RvbmU7CisJCWVsc2UgeworCQkJcmMgPSBoZC0+cExvY2FsLT5jb21wbGV0aW9uOworCQkJaWYgKHJjID09IE1QVF9TQ0FORFZfR09PRCkKKwkJCQk7CQkvKiBJc3N1ZSByZWFkIGJ1ZmZlciAqLworCQkJZWxzZSBpZiAocmMgPT0gTVBUX1NDQU5EVl9ESURfUkVTRVQpIHsKKwkJCQkvKiBJZiB1c2luZyBlY2hvIGJ1ZmZlcnMsIHJlc2V0IHRvIGRhdGEgYnVmZmVycy4KKwkJCQkgKiBFbHNlIGRvIEZhbGxiYWNrIGFuZCByZXN0YXJ0CisJCQkJICogdGhpcyB0ZXN0IChyZS1pc3N1ZSByZXNlcnZlCisJCQkJICogYmVjYXVzZSBvZiBidXMgcmVzZXQpLgorCQkJCSAqLworCQkJCWlmICgoaW9jbWQuZmxhZ3MgJiBNUFRfSUNGTEFHX0VDSE8pICYmIChkYXRhQnVmU2l6ZSA+PSBidWZzaXplKSkgeworCQkJCQlpb2NtZC5mbGFncyAmPSB+TVBUX0lDRkxBR19FQ0hPOworCQkJCX0gZWxzZSB7CisJCQkJCWR2LmNtZCA9IE1QVF9GQUxMQkFDSzsKKwkJCQkJbXB0c2NzaWhfZHZfcGFybXMoaGQsICZkdiwgKHZvaWQgKilwY2ZnMURhdGEpOworCisJCQkJCWlmIChtcHRfY29uZmlnKGhkLT5pb2MsICZjZmcpICE9IDApCisJCQkJCQlnb3RvIHRhcmdldF9kb25lOworCisJCQkJCWlmICgoIWR2Lm5vdy53aWR0aCkgJiYgKCFkdi5ub3cub2Zmc2V0KSkKKwkJCQkJCWdvdG8gdGFyZ2V0X2RvbmU7CisJCQkJfQorCisJCQkJaW9jbWQuZmxhZ3MgfD0gTVBUX0lDRkxBR19ESURfUkVTRVQ7CisJCQkJcGF0dCA9IC0xOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmIChyYyA9PSBNUFRfU0NBTkRWX1NFTlNFKSB7CisJCQkJLyogUmVzdGFydCBkYXRhIHRlc3QgaWYgVUEsIGVsc2UgcXVpdC4KKwkJCQkgKi8KKwkJCQl1OCBza2V5ID0gaGQtPnBMb2NhbC0+c2Vuc2VbMl0gJiAweDBGOworCQkJCWRkdnByaW50aygoTVlJT0Nfc19JTkZPX0ZNVAorCQkJCQkiU2Vuc2VLZXk6QVNDOkFTQ1EgPSAoJXg6JTAyeDolMDJ4KVxuIiwgaW9jLT5uYW1lLCBza2V5LAorCQkJCQloZC0+cExvY2FsLT5zZW5zZVsxMl0sIGhkLT5wTG9jYWwtPnNlbnNlWzEzXSkpOworCQkJCWlmIChza2V5ID09IFVOSVRfQVRURU5USU9OKSB7CisJCQkJCXBhdHQgPSAtMTsKKwkJCQkJY29udGludWU7CisJCQkJfSBlbHNlIGlmIChza2V5ID09IElMTEVHQUxfUkVRVUVTVCkgeworCQkJCQlpZiAoaW9jbWQuZmxhZ3MgJiBNUFRfSUNGTEFHX0VDSE8pIHsKKwkJCQkJCWlmIChkYXRhQnVmU2l6ZSA+PSBidWZzaXplKSB7CisJCQkJCQkJaW9jbWQuZmxhZ3MgJj0gfk1QVF9JQ0ZMQUdfRUNITzsKKwkJCQkJCQlwYXR0ID0gLTE7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZ290byB0YXJnZXRfZG9uZTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlnb3RvIHRhcmdldF9kb25lOworCQkJfSBlbHNlIHsKKwkJCQkvKiBmYXRhbCBlcnJvciAqLworCQkJCWdvdG8gdGFyZ2V0X2RvbmU7CisJCQl9CisJCX0KKworCQlpb2NtZC5jbWQgPSBSRUFEX0JVRkZFUjsKKwkJaW9jbWQuZGF0YV9kbWEgPSBidWYyX2RtYTsKKwkJaW9jbWQuZGF0YSA9IHBidWYyOworCQlpb2NtZC5zaXplID0gc3o7CisJCWlmIChtcHRzY3NpaF9kb19jbWQoaGQsICZpb2NtZCkgPCAwKQorCQkJZ290byB0YXJnZXRfZG9uZTsKKwkJZWxzZSBpZiAoaGQtPnBMb2NhbCA9PSBOVUxMKQorCQkJZ290byB0YXJnZXRfZG9uZTsKKwkJZWxzZSB7CisJCQlyYyA9IGhkLT5wTG9jYWwtPmNvbXBsZXRpb247CisJCQlpZiAocmMgPT0gTVBUX1NDQU5EVl9HT09EKSB7CisJCQkJIC8qIElmIGJ1ZmZlcnMgY29tcGFyZSwKKwkJCQkgICogZ28gdG8gbmV4dCBwYXR0ZXJuLAorCQkJCSAgKiBlbHNlLCBkbyBhIGZhbGxiYWNrIGFuZCByZXN0YXJ0CisJCQkJICAqIGRhdGEgdHJhbnNmZXIgdGVzdC4KKwkJCQkgICovCisJCQkJaWYgKG1lbWNtcCAocGJ1ZjEsIHBidWYyLCBzeikgPT0gMCkgeworCQkJCQk7IC8qIGdvdG8gbmV4dCBwYXR0ZXJuICovCisJCQkJfSBlbHNlIHsKKwkJCQkJLyogTWlzY29tcGFyZSB3aXRoIEVjaG8gYnVmZmVyLCBnbyB0byBkYXRhIGJ1ZmZlciwKKwkJCQkJICogaWYgdGhhdCBidWZmZXIgZXhpc3RzLgorCQkJCQkgKiBNaXNjb21wYXJlIHdpdGggRGF0YSBidWZmZXIsIGNoZWNrIGZpcnN0IDQgYnl0ZXMsCisJCQkJCSAqIHNvbWUgZGV2aWNlcyByZXR1cm4gY2FwYWNpdHkuIEV4aXQgaW4gdGhpcyBjYXNlLgorCQkJCQkgKi8KKwkJCQkJaWYgKGlvY21kLmZsYWdzICYgTVBUX0lDRkxBR19FQ0hPKSB7CisJCQkJCQlpZiAoZGF0YUJ1ZlNpemUgPj0gYnVmc2l6ZSkKKwkJCQkJCQlpb2NtZC5mbGFncyAmPSB+TVBUX0lDRkxBR19FQ0hPOworCQkJCQkJZWxzZQorCQkJCQkJCWdvdG8gdGFyZ2V0X2RvbmU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoZGF0YUJ1ZlNpemUgPT0gKHBidWYyWzFdPDwxNiB8IHBidWYyWzJdPDw4IHwgcGJ1ZjJbM10pKSB7CisJCQkJCQkJLyogQXJnaC4gRGV2aWNlIHJldHVybmluZyB3cm9uZyBkYXRhLgorCQkJCQkJCSAqIFF1aXQgRFYgZm9yIHRoaXMgZGV2aWNlLgorCQkJCQkJCSAqLworCQkJCQkJCWdvdG8gdGFyZ2V0X2RvbmU7CisJCQkJCQl9CisKKwkJCQkJCS8qIEhhZCBhbiBhY3R1YWwgbWlzY29tcGFyZS4gU2xvdyBkb3duLiovCisJCQkJCQlkdi5jbWQgPSBNUFRfRkFMTEJBQ0s7CisJCQkJCQltcHRzY3NpaF9kdl9wYXJtcyhoZCwgJmR2LCAodm9pZCAqKXBjZmcxRGF0YSk7CisKKwkJCQkJCWlmIChtcHRfY29uZmlnKGhkLT5pb2MsICZjZmcpICE9IDApCisJCQkJCQkJZ290byB0YXJnZXRfZG9uZTsKKworCQkJCQkJaWYgKCghZHYubm93LndpZHRoKSAmJiAoIWR2Lm5vdy5vZmZzZXQpKQorCQkJCQkJCWdvdG8gdGFyZ2V0X2RvbmU7CisJCQkJCX0KKworCQkJCQlwYXR0ID0gLTE7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0gZWxzZSBpZiAocmMgPT0gTVBUX1NDQU5EVl9ESURfUkVTRVQpIHsKKwkJCQkvKiBEbyBGYWxsYmFjayBhbmQgcmVzdGFydAorCQkJCSAqIHRoaXMgdGVzdCAocmUtaXNzdWUgcmVzZXJ2ZQorCQkJCSAqIGJlY2F1c2Ugb2YgYnVzIHJlc2V0KS4KKwkJCQkgKi8KKwkJCQlkdi5jbWQgPSBNUFRfRkFMTEJBQ0s7CisJCQkJbXB0c2NzaWhfZHZfcGFybXMoaGQsICZkdiwgKHZvaWQgKilwY2ZnMURhdGEpOworCisJCQkJaWYgKG1wdF9jb25maWcoaGQtPmlvYywgJmNmZykgIT0gMCkKKwkJCQkJIGdvdG8gdGFyZ2V0X2RvbmU7CisKKwkJCQlpZiAoKCFkdi5ub3cud2lkdGgpICYmICghZHYubm93Lm9mZnNldCkpCisJCQkJCWdvdG8gdGFyZ2V0X2RvbmU7CisKKwkJCQlpb2NtZC5mbGFncyB8PSBNUFRfSUNGTEFHX0RJRF9SRVNFVDsKKwkJCQlwYXR0ID0gLTE7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKHJjID09IE1QVF9TQ0FORFZfU0VOU0UpIHsKKwkJCQkvKiBSZXN0YXJ0IGRhdGEgdGVzdCBpZiBVQSwgZWxzZSBxdWl0LgorCQkJCSAqLworCQkJCXU4IHNrZXkgPSBoZC0+cExvY2FsLT5zZW5zZVsyXSAmIDB4MEY7CisJCQkJZGR2cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UCisJCQkJCSJTZW5zZUtleTpBU0M6QVNDUSA9ICgleDolMDJ4OiUwMngpXG4iLCBpb2MtPm5hbWUsIHNrZXksCisJCQkJCWhkLT5wTG9jYWwtPnNlbnNlWzEyXSwgaGQtPnBMb2NhbC0+c2Vuc2VbMTNdKSk7CisJCQkJaWYgKHNrZXkgPT0gVU5JVF9BVFRFTlRJT04pIHsKKwkJCQkJcGF0dCA9IC0xOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlnb3RvIHRhcmdldF9kb25lOworCQkJfSBlbHNlIHsKKwkJCQkvKiBmYXRhbCBlcnJvciAqLworCQkJCWdvdG8gdGFyZ2V0X2RvbmU7CisJCQl9CisJCX0KKworCX0gLyogLS0tIGVuZCBvZiBwYXR0IGxvb3AgLS0tLSAqLworCit0YXJnZXRfZG9uZToKKwlpZiAoaW9jbWQuZmxhZ3MgJiBNUFRfSUNGTEFHX1JFU0VSVkVEKSB7CisJCWlvY21kLmNtZCA9IFJFTEVBU0U7CisJCWlvY21kLmRhdGFfZG1hID0gLTE7CisJCWlvY21kLmRhdGEgPSBOVUxMOworCQlpb2NtZC5zaXplID0gMDsKKwkJaWYgKG1wdHNjc2loX2RvX2NtZChoZCwgJmlvY21kKSA8IDApCisJCQlwcmludGsoTVlJT0Nfc19JTkZPX0ZNVCAiRFY6IFJlbGVhc2UgZmFpbGVkLiBpZCAlZCIsCisJCQkJCWlvYy0+bmFtZSwgaWQpOworCQllbHNlIGlmIChoZC0+cExvY2FsKSB7CisJCQlpZiAoaGQtPnBMb2NhbC0+Y29tcGxldGlvbiA9PSBNUFRfU0NBTkRWX0dPT0QpCisJCQkJaW9jbWQuZmxhZ3MgJj0gfk1QVF9JQ0ZMQUdfUkVTRVJWRUQ7CisJCX0gZWxzZSB7CisJCQlwcmludGsoTVlJT0Nfc19JTkZPX0ZNVCAiRFY6IFJlbGVhc2UgZmFpbGVkLiBpZCAlZCIsCisJCQkJCQlpb2MtPm5hbWUsIGlkKTsKKwkJfQorCX0KKworCisJLyogU2V0IGlmIGNmZzFfZG1hX2FkZHIgY29udGVudHMgaXMgdmFsaWQKKwkgKi8KKwlpZiAoKGNmZy5oZHIgIT0gTlVMTCkgJiYgKHJldGNvZGUgPT0gMCkpeworCQkvKiBJZiBkaXNrLCBub3QgVTMyMCwgZGlzYWJsZSBRQVMKKwkJICovCisJCWlmICgoaW5xMCA9PSAwKSAmJiAoZHYubm93LmZhY3RvciA+IE1QVF9VTFRSQTMyMCkpIHsKKwkJCWhkLT5pb2MtPnNwaV9kYXRhLm5vUWFzID0gTVBUX1RBUkdFVF9OT19ORUdPX1FBUzsKKwkJCWRkdnByaW50aygoTVlJT0Nfc19OT1RFX0ZNVCAKKwkJCSAgICAibm9RYXMgc2V0IGR1ZSB0byBpZD0lZCBoYXMgZmFjdG9yPSV4XG4iLCBpb2MtPm5hbWUsIGlkLCBkdi5ub3cuZmFjdG9yKSk7CisJCX0KKworCQlkdi5jbWQgPSBNUFRfU0FWRTsKKwkJbXB0c2NzaWhfZHZfcGFybXMoaGQsICZkdiwgKHZvaWQgKilwY2ZnMURhdGEpOworCisJCS8qIERvdWJsZSB3cml0ZXMgdG8gU0RQMSBjYW4gY2F1c2UgcHJvYmxlbXMsCisJCSAqIHNraXAgc2F2ZSBvZiB0aGUgZmluYWwgbmVnb3RpYXRlZCBzZXR0aW5ncyB0bworCQkgKiBTQ1NJIGRldmljZSBwYWdlIDEuCisJCSAqCisJCWNmZy5oZHIgPSAmaGVhZGVyMTsKKwkJY2ZnLnBoeXNBZGRyID0gY2ZnMV9kbWFfYWRkcjsKKwkJY2ZnLmFjdGlvbiA9IE1QSV9DT05GSUdfQUNUSU9OX1BBR0VfV1JJVEVfQ1VSUkVOVDsKKwkJY2ZnLmRpciA9IDE7CisJCW1wdF9jb25maWcoaGQtPmlvYywgJmNmZyk7CisJCSAqLworCX0KKworCS8qIElmIHRoaXMgaXMgYSBSQUlEIFBhc3N0aHJvdWdoLCBlbmFibGUgaW50ZXJuYWwgSU9zCisJICovCisJaWYgKGlvY21kLmZsYWdzICYgTVBUX0lDRkxBR19QSFlTX0RJU0spIHsKKwkJaWYgKG1wdHNjc2loX2RvX3JhaWQoaGQsIE1QSV9SQUlEX0FDVElPTl9FTkFCTEVfUEhZU19JTywgJmlvY21kKSA8IDApCisJCQlkZHZwcmludGsoKE1ZSU9DX3NfRVJSX0ZNVCAiUkFJRCBFbmFibGUgRkFJTEVEIVxuIiwgaW9jLT5uYW1lKSk7CisJfQorCisJLyogRG9uZSB3aXRoIHRoZSBEViBzY2FuIG9mIHRoZSBjdXJyZW50IHRhcmdldAorCSAqLworCWlmIChwRHZCdWYpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaW9jLT5wY2lkZXYsIGR2X2FsbG9jLCBwRHZCdWYsIGR2YnVmX2RtYSk7CisKKwlkZHZ0cHJpbnRrKChNWUlPQ19zX0lORk9fRk1UICJEViBEb25lIGlkPSVkXG4iLAorCQkJaW9jLT5uYW1lLCBpZCkpOworCisJcmV0dXJuIHJldGNvZGU7Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCW1wdHNjc2loX2R2X3Bhcm1zIC0gcGVyZm9ybSBhIHZhcmlldHkgb2Ygb3BlcmF0aW9ucyBvbiB0aGUKKyAqCXBhcmFtZXRlcnMgdXNlZCBmb3IgbmVnb3RpYXRpb24uCisgKglAaGQ6IFBvaW50ZXIgdG8gYSBTQ1NJIGhvc3QuCisgKglAZHY6IFBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgbWF4aW11bSBhbmQgY3VycmVudAorICoJCW5lZ290aWF0ZWQgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIHZvaWQKK21wdHNjc2loX2R2X3Bhcm1zKE1QVF9TQ1NJX0hPU1QgKmhkLCBEVlBBUkFNRVRFUlMgKmR2LHZvaWQgKnBQYWdlKQoreworCVZpcnREZXZpY2UJCSpwVGFyZ2V0OworCVNDU0lEZXZpY2VQYWdlMF90CSpwUGFnZTA7CisJU0NTSURldmljZVBhZ2UxX3QJKnBQYWdlMTsKKwlpbnQJCQl2YWwgPSAwLCBkYXRhLCBjb25maWd1cmF0aW9uOworCXU4CQkJd2lkdGggPSAwOworCXU4CQkJb2Zmc2V0ID0gMDsKKwl1OAkJCWZhY3RvciA9IDA7CisJdTgJCQluZWdvRmxhZ3MgPSAwOworCXU4CQkJY21kID0gZHYtPmNtZDsKKwl1OAkJCWlkID0gZHYtPmlkOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE1QVF9HRVRfTlZSQU1fVkFMUzoKKwkJZGR2cHJpbnRrKChNWUlPQ19zX05PVEVfRk1UICJHZXR0aW5nIE5WUkFNOiAiLAorCQkJCQkJCSBoZC0+aW9jLT5uYW1lKSk7CisJCS8qIEdldCB0aGUgTlZSQU0gdmFsdWVzIGFuZCBzYXZlIGluIHRtYXgKKwkJICogSWYgbm90IGFuIExWRCBidXMsIHRoZSBhZGFwdGVyIG1pblN5bmNGYWN0b3IgaGFzIGJlZW4KKwkJICogYWxyZWFkeSB0aHJvdHRsZWQgYmFjay4KKwkJICovCisJCWlmICgoaGQtPlRhcmdldHMpJiYoKHBUYXJnZXQgPSBoZC0+VGFyZ2V0c1soaW50KWlkXSkgIT0gTlVMTCkgJiYgIXBUYXJnZXQtPnJhaWRWb2x1bWUpIHsKKwkJCXdpZHRoID0gcFRhcmdldC0+bWF4V2lkdGg7CisJCQlvZmZzZXQgPSBwVGFyZ2V0LT5tYXhPZmZzZXQ7CisJCQlmYWN0b3IgPSBwVGFyZ2V0LT5taW5TeW5jRmFjdG9yOworCQkJbmVnb0ZsYWdzID0gcFRhcmdldC0+bmVnb0ZsYWdzOworCQl9IGVsc2UgeworCQkJaWYgKGhkLT5pb2MtPnNwaV9kYXRhLm52cmFtICYmIChoZC0+aW9jLT5zcGlfZGF0YS5udnJhbVtpZF0gIT0gTVBUX0hPU1RfTlZSQU1fSU5WQUxJRCkpIHsKKwkJCQlkYXRhID0gaGQtPmlvYy0+c3BpX2RhdGEubnZyYW1baWRdOworCQkJCXdpZHRoID0gZGF0YSAmIE1QVF9OVlJBTV9XSURFX0RJU0FCTEUgPyAwIDogMTsKKwkJCQlpZiAoKG9mZnNldCA9IGhkLT5pb2MtPnNwaV9kYXRhLm1heFN5bmNPZmZzZXQpID09IDApCisJCQkJCWZhY3RvciA9IE1QVF9BU1lOQzsKKwkJCQllbHNlIHsKKwkJCQkJZmFjdG9yID0gKGRhdGEgJiBNUFRfTlZSQU1fU1lOQ19NQVNLKSA+PiBNUFRfTlZSQU1fU1lOQ19TSElGVDsKKwkJCQkJaWYgKChmYWN0b3IgPT0gMCkgfHwgKGZhY3RvciA9PSBNUFRfQVNZTkMpKXsKKwkJCQkJCWZhY3RvciA9IE1QVF9BU1lOQzsKKwkJCQkJCW9mZnNldCA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXdpZHRoID0gTVBUX05BUlJPVzsKKwkJCQlvZmZzZXQgPSAwOworCQkJCWZhY3RvciA9IE1QVF9BU1lOQzsKKwkJCX0KKworCQkJLyogU2V0IHRoZSBuZWdvdGlhdGlvbiBmbGFncyAqLworCQkJbmVnb0ZsYWdzID0gaGQtPmlvYy0+c3BpX2RhdGEubm9RYXM7CisJCQlpZiAoIXdpZHRoKQorCQkJCW5lZ29GbGFncyB8PSBNUFRfVEFSR0VUX05PX05FR09fV0lERTsKKworCQkJaWYgKCFvZmZzZXQpCisJCQkJbmVnb0ZsYWdzIHw9IE1QVF9UQVJHRVRfTk9fTkVHT19TWU5DOworCQl9CisKKwkJLyogbGltaXQgYnkgYWRhcHRlciBjYXBhYmlsaXRpZXMgKi8KKwkJd2lkdGggPSBtaW4od2lkdGgsIGhkLT5pb2MtPnNwaV9kYXRhLm1heEJ1c1dpZHRoKTsKKwkJb2Zmc2V0ID0gbWluKG9mZnNldCwgaGQtPmlvYy0+c3BpX2RhdGEubWF4U3luY09mZnNldCk7CisJCWZhY3RvciA9IG1heChmYWN0b3IsIGhkLT5pb2MtPnNwaV9kYXRhLm1pblN5bmNGYWN0b3IpOworCisJCS8qIENoZWNrIENvbnNpc3RlbmN5ICovCisJCWlmIChvZmZzZXQgJiYgKGZhY3RvciA8IE1QVF9VTFRSQTIpICYmICF3aWR0aCkKKwkJCWZhY3RvciA9IE1QVF9VTFRSQTI7CisKKwkJZHYtPm1heC53aWR0aCA9IHdpZHRoOworCQlkdi0+bWF4Lm9mZnNldCA9IG9mZnNldDsKKwkJZHYtPm1heC5mYWN0b3IgPSBmYWN0b3I7CisJCWR2LT5tYXguZmxhZ3MgPSBuZWdvRmxhZ3M7CisJCWRkdnByaW50aygoIiBpZD0lZCB3aWR0aD0lZCBmYWN0b3I9JXggb2Zmc2V0PSV4IGZsYWdzPSV4XG4iLAorCQkJCWlkLCB3aWR0aCwgZmFjdG9yLCBvZmZzZXQsIG5lZ29GbGFncykpOworCQlicmVhazsKKworCWNhc2UgTVBUX1VQREFURV9NQVg6CisJCWRkdnByaW50aygoTVlJT0Nfc19OT1RFX0ZNVAorCQkJIlVwZGF0aW5nIHdpdGggU0RQMCBEYXRhOiAiLCBoZC0+aW9jLT5uYW1lKSk7CisJCS8qIFVwZGF0ZSB0bWF4IHZhbHVlcyB3aXRoIHRob3NlIGZyb20gRGV2aWNlIFBhZ2UgMC4qLworCQlwUGFnZTAgPSAoU0NTSURldmljZVBhZ2UwX3QgKikgcFBhZ2U7CisJCWlmIChwUGFnZTApIHsKKwkJCXZhbCA9IGNwdV90b19sZTMyKHBQYWdlMC0+TmVnb3RpYXRlZFBhcmFtZXRlcnMpOworCQkJZHYtPm1heC53aWR0aCA9IHZhbCAmIE1QSV9TQ1NJREVWUEFHRTBfTlBfV0lERSA/IDEgOiAwOworCQkJZHYtPm1heC5vZmZzZXQgPSAodmFsJk1QSV9TQ1NJREVWUEFHRTBfTlBfTkVHX1NZTkNfT0ZGU0VUX01BU0spID4+IDE2OworCQkJZHYtPm1heC5mYWN0b3IgPSAodmFsJk1QSV9TQ1NJREVWUEFHRTBfTlBfTkVHX1NZTkNfUEVSSU9EX01BU0spID4+IDg7CisJCX0KKworCQlkdi0+bm93LndpZHRoID0gZHYtPm1heC53aWR0aDsKKwkJZHYtPm5vdy5vZmZzZXQgPSBkdi0+bWF4Lm9mZnNldDsKKwkJZHYtPm5vdy5mYWN0b3IgPSBkdi0+bWF4LmZhY3RvcjsKKwkJZGR2cHJpbnRrKCgiaWQ9JWQgd2lkdGg9JWQgZmFjdG9yPSV4IG9mZnNldD0leCBmbGFncz0leFxuIiwKKwkJCQlpZCwgZHYtPm5vdy53aWR0aCwgZHYtPm5vdy5mYWN0b3IsIGR2LT5ub3cub2Zmc2V0LCBkdi0+bm93LmZsYWdzKSk7CisJCWJyZWFrOworCisJY2FzZSBNUFRfU0VUX01BWDoKKwkJZGR2cHJpbnRrKChNWUlPQ19zX05PVEVfRk1UICJTZXR0aW5nIE1heDogIiwKKwkJCQkJCQkJaGQtPmlvYy0+bmFtZSkpOworCQkvKiBTZXQgY3VycmVudCB0byB0aGUgbWF4IHZhbHVlcy4gVXBkYXRlIHRoZSBjb25maWcgcGFnZS4qLworCQlkdi0+bm93LndpZHRoID0gZHYtPm1heC53aWR0aDsKKwkJZHYtPm5vdy5vZmZzZXQgPSBkdi0+bWF4Lm9mZnNldDsKKwkJZHYtPm5vdy5mYWN0b3IgPSBkdi0+bWF4LmZhY3RvcjsKKwkJZHYtPm5vdy5mbGFncyA9IGR2LT5tYXguZmxhZ3M7CisKKwkJcFBhZ2UxID0gKFNDU0lEZXZpY2VQYWdlMV90ICopcFBhZ2U7CisJCWlmIChwUGFnZTEpIHsKKwkJCW1wdHNjc2loX3NldERldmljZVBhZ2UxRmxhZ3MgKGR2LT5ub3cud2lkdGgsIGR2LT5ub3cuZmFjdG9yLAorCQkJCWR2LT5ub3cub2Zmc2V0LCAmdmFsLCAmY29uZmlndXJhdGlvbiwgZHYtPm5vdy5mbGFncyk7CisJCQlkbmVnb3ByaW50aygoIlNldHRpbmcgTWF4OiBpZD0lZCB3aWR0aD0lZCBmYWN0b3I9JXggb2Zmc2V0PSV4IG5lZ29GbGFncz0leCByZXF1ZXN0PSV4IGNvbmZpZz0leFxuIiwKKwkJCQlpZCwgZHYtPm5vdy53aWR0aCwgZHYtPm5vdy5mYWN0b3IsIGR2LT5ub3cub2Zmc2V0LCBkdi0+bm93LmZsYWdzLCB2YWwsIGNvbmZpZ3VyYXRpb24pKTsKKwkJCXBQYWdlMS0+UmVxdWVzdGVkUGFyYW1ldGVycyA9IGxlMzJfdG9fY3B1KHZhbCk7CisJCQlwUGFnZTEtPlJlc2VydmVkID0gMDsKKwkJCXBQYWdlMS0+Q29uZmlndXJhdGlvbiA9IGxlMzJfdG9fY3B1KGNvbmZpZ3VyYXRpb24pOworCQl9CisKKwkJZGR2cHJpbnRrKCgiaWQ9JWQgd2lkdGg9JWQgZmFjdG9yPSV4IG9mZnNldD0leCBmbGFncz0leCByZXF1ZXN0PSV4IGNvbmZpZ3VyYXRpb249JXhcbiIsCisJCQkJaWQsIGR2LT5ub3cud2lkdGgsIGR2LT5ub3cuZmFjdG9yLCBkdi0+bm93Lm9mZnNldCwgZHYtPm5vdy5mbGFncywgdmFsLCBjb25maWd1cmF0aW9uKSk7CisJCWJyZWFrOworCisJY2FzZSBNUFRfU0VUX01JTjoKKwkJZGR2cHJpbnRrKChNWUlPQ19zX05PVEVfRk1UICJTZXR0aW5nIE1pbjogIiwKKwkJCQkJCQkJaGQtPmlvYy0+bmFtZSkpOworCQkvKiBTZXQgcGFnZSB0byBhc3luY2hyb25vdXMgYW5kIG5hcnJvdworCQkgKiBEbyBub3QgdXBkYXRlIG5vdywgYnJlYWtzIGZhbGxiYWNrIHJvdXRpbmUuICovCisJCXdpZHRoID0gTVBUX05BUlJPVzsKKwkJb2Zmc2V0ID0gMDsKKwkJZmFjdG9yID0gTVBUX0FTWU5DOworCQluZWdvRmxhZ3MgPSBkdi0+bWF4LmZsYWdzOworCisJCXBQYWdlMSA9IChTQ1NJRGV2aWNlUGFnZTFfdCAqKXBQYWdlOworCQlpZiAocFBhZ2UxKSB7CisJCQltcHRzY3NpaF9zZXREZXZpY2VQYWdlMUZsYWdzICh3aWR0aCwgZmFjdG9yLAorCQkJCW9mZnNldCwgJnZhbCwgJmNvbmZpZ3VyYXRpb24sIG5lZ29GbGFncyk7CisJCQlkbmVnb3ByaW50aygoIlNldHRpbmcgTWluOiBpZD0lZCB3aWR0aD0lZCBmYWN0b3I9JXggb2Zmc2V0PSV4IG5lZ29GbGFncz0leCByZXF1ZXN0PSV4IGNvbmZpZz0leFxuIiwKKwkJCQlpZCwgd2lkdGgsIGZhY3Rvciwgb2Zmc2V0LCBuZWdvRmxhZ3MsIHZhbCwgY29uZmlndXJhdGlvbikpOworCQkJcFBhZ2UxLT5SZXF1ZXN0ZWRQYXJhbWV0ZXJzID0gbGUzMl90b19jcHUodmFsKTsKKwkJCXBQYWdlMS0+UmVzZXJ2ZWQgPSAwOworCQkJcFBhZ2UxLT5Db25maWd1cmF0aW9uID0gbGUzMl90b19jcHUoY29uZmlndXJhdGlvbik7CisJCX0KKwkJZGR2cHJpbnRrKCgiaWQ9JWQgd2lkdGg9JWQgZmFjdG9yPSV4IG9mZnNldD0leCByZXF1ZXN0PSV4IGNvbmZpZz0leCBuZWdvRmxhZ3M9JXhcbiIsCisJCQkJaWQsIHdpZHRoLCBmYWN0b3IsIG9mZnNldCwgdmFsLCBjb25maWd1cmF0aW9uLCBuZWdvRmxhZ3MpKTsKKwkJYnJlYWs7CisKKwljYXNlIE1QVF9GQUxMQkFDSzoKKwkJZGR2cHJpbnRrKChNWUlPQ19zX05PVEVfRk1UCisJCQkiRmFsbGJhY2s6IFN0YXJ0OiBvZmZzZXQgJWQsIGZhY3RvciAleCwgd2lkdGggJWQgXG4iLAorCQkJCWhkLT5pb2MtPm5hbWUsIGR2LT5ub3cub2Zmc2V0LAorCQkJCWR2LT5ub3cuZmFjdG9yLCBkdi0+bm93LndpZHRoKSk7CisJCXdpZHRoID0gZHYtPm5vdy53aWR0aDsKKwkJb2Zmc2V0ID0gZHYtPm5vdy5vZmZzZXQ7CisJCWZhY3RvciA9IGR2LT5ub3cuZmFjdG9yOworCQlpZiAoKG9mZnNldCkgJiYgKGR2LT5tYXgud2lkdGgpKSB7CisJCQlpZiAoZmFjdG9yIDwgTVBUX1VMVFJBMTYwKQorCQkJCWZhY3RvciA9IE1QVF9VTFRSQTE2MDsKKwkJCWVsc2UgaWYgKGZhY3RvciA8IE1QVF9VTFRSQTIpIHsKKwkJCQlmYWN0b3IgPSBNUFRfVUxUUkEyOworCQkJCXdpZHRoID0gTVBUX1dJREU7CisJCQl9IGVsc2UgaWYgKChmYWN0b3IgPT0gTVBUX1VMVFJBMikgJiYgd2lkdGgpIHsKKwkJCQlmYWN0b3IgPSBNUFRfVUxUUkEyOworCQkJCXdpZHRoID0gTVBUX05BUlJPVzsKKwkJCX0gZWxzZSBpZiAoZmFjdG9yIDwgTVBUX1VMVFJBKSB7CisJCQkJZmFjdG9yID0gTVBUX1VMVFJBOworCQkJCXdpZHRoID0gTVBUX1dJREU7CisJCQl9IGVsc2UgaWYgKChmYWN0b3IgPT0gTVBUX1VMVFJBKSAmJiB3aWR0aCkgeworCQkJCXdpZHRoID0gTVBUX05BUlJPVzsKKwkJCX0gZWxzZSBpZiAoZmFjdG9yIDwgTVBUX0ZBU1QpIHsKKwkJCQlmYWN0b3IgPSBNUFRfRkFTVDsKKwkJCQl3aWR0aCA9IE1QVF9XSURFOworCQkJfSBlbHNlIGlmICgoZmFjdG9yID09IE1QVF9GQVNUKSAmJiB3aWR0aCkgeworCQkJCWZhY3RvciA9IE1QVF9GQVNUOworCQkJCXdpZHRoID0gTVBUX05BUlJPVzsKKwkJCX0gZWxzZSBpZiAoZmFjdG9yIDwgTVBUX1NDU0kpIHsKKwkJCQlmYWN0b3IgPSBNUFRfU0NTSTsKKwkJCQl3aWR0aCA9IE1QVF9XSURFOworCQkJfSBlbHNlIGlmICgoZmFjdG9yID09IE1QVF9TQ1NJKSAmJiB3aWR0aCkgeworCQkJCWZhY3RvciA9IE1QVF9TQ1NJOworCQkJCXdpZHRoID0gTVBUX05BUlJPVzsKKwkJCX0gZWxzZSB7CisJCQkJZmFjdG9yID0gTVBUX0FTWU5DOworCQkJCW9mZnNldCA9IDA7CisJCQl9CisKKwkJfSBlbHNlIGlmIChvZmZzZXQpIHsKKwkJCXdpZHRoID0gTVBUX05BUlJPVzsKKwkJCWlmIChmYWN0b3IgPCBNUFRfVUxUUkEpCisJCQkJZmFjdG9yID0gTVBUX1VMVFJBOworCQkJZWxzZSBpZiAoZmFjdG9yIDwgTVBUX0ZBU1QpCisJCQkJZmFjdG9yID0gTVBUX0ZBU1Q7CisJCQllbHNlIGlmIChmYWN0b3IgPCBNUFRfU0NTSSkKKwkJCQlmYWN0b3IgPSBNUFRfU0NTSTsKKwkJCWVsc2UgeworCQkJCWZhY3RvciA9IE1QVF9BU1lOQzsKKwkJCQlvZmZzZXQgPSAwOworCQkJfQorCisJCX0gZWxzZSB7CisJCQl3aWR0aCA9IE1QVF9OQVJST1c7CisJCQlmYWN0b3IgPSBNUFRfQVNZTkM7CisJCX0KKwkJZHYtPm1heC5mbGFncyB8PSBNUFRfVEFSR0VUX05PX05FR09fUUFTOworCQlkdi0+bWF4LmZsYWdzICY9IH5NUFRfVEFQRV9ORUdPX0lEUDsKKworCQlkdi0+bm93LndpZHRoID0gd2lkdGg7CisJCWR2LT5ub3cub2Zmc2V0ID0gb2Zmc2V0OworCQlkdi0+bm93LmZhY3RvciA9IGZhY3RvcjsKKwkJZHYtPm5vdy5mbGFncyA9IGR2LT5tYXguZmxhZ3M7CisKKwkJcFBhZ2UxID0gKFNDU0lEZXZpY2VQYWdlMV90ICopcFBhZ2U7CisJCWlmIChwUGFnZTEpIHsKKwkJCW1wdHNjc2loX3NldERldmljZVBhZ2UxRmxhZ3MgKHdpZHRoLCBmYWN0b3IsIG9mZnNldCwgJnZhbCwKKwkJCQkJCSZjb25maWd1cmF0aW9uLCBkdi0+bm93LmZsYWdzKTsKKwkJCWRuZWdvcHJpbnRrKCgiRmluaXNoOiBpZD0lZCB3aWR0aD0lZCBvZmZzZXQ9JWQgZmFjdG9yPSV4IGZsYWdzPSV4IHJlcXVlc3Q9JXggY29uZmlnPSV4XG4iLAorCQkJICAgICBpZCwgd2lkdGgsIG9mZnNldCwgZmFjdG9yLCBkdi0+bm93LmZsYWdzLCB2YWwsIGNvbmZpZ3VyYXRpb24pKTsKKworCQkJcFBhZ2UxLT5SZXF1ZXN0ZWRQYXJhbWV0ZXJzID0gbGUzMl90b19jcHUodmFsKTsKKwkJCXBQYWdlMS0+UmVzZXJ2ZWQgPSAwOworCQkJcFBhZ2UxLT5Db25maWd1cmF0aW9uID0gbGUzMl90b19jcHUoY29uZmlndXJhdGlvbik7CisJCX0KKworCQlkZHZwcmludGsoKCJGaW5pc2g6IGlkPSVkIG9mZnNldD0lZCBmYWN0b3I9JXggd2lkdGg9JWQgcmVxdWVzdD0leCBjb25maWc9JXhcbiIsCisJCQkgICAgIGlkLCBkdi0+bm93Lm9mZnNldCwgZHYtPm5vdy5mYWN0b3IsIGR2LT5ub3cud2lkdGgsIHZhbCwgY29uZmlndXJhdGlvbikpOworCQlicmVhazsKKworCWNhc2UgTVBUX1NBVkU6CisJCWRkdnByaW50aygoTVlJT0Nfc19OT1RFX0ZNVAorCQkJIlNhdmluZyB0byBUYXJnZXQgc3RydWN0dXJlOiAiLCBoZC0+aW9jLT5uYW1lKSk7CisJCWRkdnByaW50aygoImlkPSVkIHdpZHRoPSV4IGZhY3Rvcj0leCBvZmZzZXQ9JWQgZmxhZ3M9JXhcbiIsCisJCQkgICAgIGlkLCBkdi0+bm93LndpZHRoLCBkdi0+bm93LmZhY3RvciwgZHYtPm5vdy5vZmZzZXQsIGR2LT5ub3cuZmxhZ3MpKTsKKworCQkvKiBTYXZlIHRoZXNlIHZhbHVlcyB0byB0YXJnZXQgc3RydWN0dXJlcworCQkgKiBvciBvdmVyd3JpdGUgbnZyYW0gKHBoeXMgZGlza3Mgb25seSkuCisJCSAqLworCisJCWlmICgoaGQtPlRhcmdldHMpJiYoKHBUYXJnZXQgPSBoZC0+VGFyZ2V0c1soaW50KWlkXSkgIT0gTlVMTCkgJiYgIXBUYXJnZXQtPnJhaWRWb2x1bWUgKSB7CisJCQlwVGFyZ2V0LT5tYXhXaWR0aCA9IGR2LT5ub3cud2lkdGg7CisJCQlwVGFyZ2V0LT5tYXhPZmZzZXQgPSBkdi0+bm93Lm9mZnNldDsKKwkJCXBUYXJnZXQtPm1pblN5bmNGYWN0b3IgPSBkdi0+bm93LmZhY3RvcjsKKwkJCXBUYXJnZXQtPm5lZ29GbGFncyA9IGR2LT5ub3cuZmxhZ3M7CisJCX0gZWxzZSB7CisJCQkvKiBQcmVzZXJ2IGFsbCBmbGFncywgdXNlCisJCQkgKiByZWFkLW1vZGlmeS13cml0ZSBhbGdvcml0aG0KKwkJCSAqLworCQkJaWYgKGhkLT5pb2MtPnNwaV9kYXRhLm52cmFtKSB7CisJCQkJZGF0YSA9IGhkLT5pb2MtPnNwaV9kYXRhLm52cmFtW2lkXTsKKworCQkJCWlmIChkdi0+bm93LndpZHRoKQorCQkJCQlkYXRhICY9IH5NUFRfTlZSQU1fV0lERV9ESVNBQkxFOworCQkJCWVsc2UKKwkJCQkJZGF0YSB8PSBNUFRfTlZSQU1fV0lERV9ESVNBQkxFOworCisJCQkJaWYgKCFkdi0+bm93Lm9mZnNldCkKKwkJCQkJZmFjdG9yID0gTVBUX0FTWU5DOworCisJCQkJZGF0YSAmPSB+TVBUX05WUkFNX1NZTkNfTUFTSzsKKwkJCQlkYXRhIHw9IChkdi0+bm93LmZhY3RvciA8PCBNUFRfTlZSQU1fU1lOQ19TSElGVCkgJiBNUFRfTlZSQU1fU1lOQ19NQVNLOworCisJCQkJaGQtPmlvYy0+c3BpX2RhdGEubnZyYW1baWRdID0gZGF0YTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9Cit9CisKKy8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KKy8qCW1wdHNjc2loX2ZpbGxidWYgLSBmaWxsIGEgYnVmZmVyIHdpdGggYSBzcGVjaWFsIGRhdGEgcGF0dGVybgorICoJCWNsZWFudXAuIEZvciBidXMgc2NhbiBvbmx5LgorICoKKyAqCUBidWZmZXI6IFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgdG8gYmUgZmlsbGVkLgorICoJQHNpemU6IE51bWJlciBvZiBieXRlcyB0byBmaWxsCisgKglAaW5kZXg6IFBhdHRlcm4gaW5kZXgKKyAqCUB3aWR0aDogYnVzIHdpZHRoLCAwICg4IGJpdHMpIG9yIDEgKDE2IGJpdHMpCisgKi8KK3N0YXRpYyB2b2lkCittcHRzY3NpaF9maWxsYnVmKGNoYXIgKmJ1ZmZlciwgaW50IHNpemUsIGludCBpbmRleCwgaW50IHdpZHRoKQoreworCWNoYXIgKnB0ciA9IGJ1ZmZlcjsKKwlpbnQgaWk7CisJY2hhciBieXRlOworCXNob3J0IHZhbDsKKworCXN3aXRjaCAoaW5kZXgpIHsKKwljYXNlIDA6CisKKwkJaWYgKHdpZHRoKSB7CisJCQkvKiBQYXR0ZXJuOiAgMDAwMCBGRkZGIDAwMDAgRkZGRgorCQkJICovCisJCQlmb3IgKGlpPTA7IGlpIDwgc2l6ZTsgaWkrKywgcHRyKyspIHsKKwkJCQlpZiAoaWkgJiAweDAyKQorCQkJCQkqcHRyID0gMHhGRjsKKwkJCQllbHNlCisJCQkJCSpwdHIgPSAweDAwOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogUGF0dGVybjogIDAwIEZGIDAwIEZGCisJCQkgKi8KKwkJCWZvciAoaWk9MDsgaWkgPCBzaXplOyBpaSsrLCBwdHIrKykgeworCQkJCWlmIChpaSAmIDB4MDEpCisJCQkJCSpwdHIgPSAweEZGOworCQkJCWVsc2UKKwkJCQkJKnB0ciA9IDB4MDA7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDE6CisJCWlmICh3aWR0aCkgeworCQkJLyogUGF0dGVybjogIDU1NTUgQUFBQSA1NTU1IEFBQUEgNTU1NQorCQkJICovCisJCQlmb3IgKGlpPTA7IGlpIDwgc2l6ZTsgaWkrKywgcHRyKyspIHsKKwkJCQlpZiAoaWkgJiAweDAyKQorCQkJCQkqcHRyID0gMHhBQTsKKwkJCQllbHNlCisJCQkJCSpwdHIgPSAweDU1OworCQkJfQorCQl9IGVsc2UgeworCQkJLyogUGF0dGVybjogIDU1IEFBIDU1IEFBIDU1CisJCQkgKi8KKwkJCWZvciAoaWk9MDsgaWkgPCBzaXplOyBpaSsrLCBwdHIrKykgeworCQkJCWlmIChpaSAmIDB4MDEpCisJCQkJCSpwdHIgPSAweEFBOworCQkJCWVsc2UKKwkJCQkJKnB0ciA9IDB4NTU7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCS8qIFBhdHRlcm46ICAwMCAwMSAwMiAwMyAwNCAwNQorCQkgKiAuLi4gRkUgRkYgMDAgMDEuLgorCQkgKi8KKwkJZm9yIChpaT0wOyBpaSA8IHNpemU7IGlpKyssIHB0cisrKQorCQkJKnB0ciA9IChjaGFyKSBpaTsKKwkJYnJlYWs7CisKKwljYXNlIDM6CisJCWlmICh3aWR0aCkgeworCQkJLyogV2lkZSBQYXR0ZXJuOiAgRkZGRSAwMDAxIEZGRkQgMDAwMgorCQkJICogLi4uICA0MDAwIERGRkYgODAwMCBFRkZGCisJCQkgKi8KKwkJCWJ5dGUgPSAwOworCQkJZm9yIChpaT0wOyBpaSA8IHNpemUvMjsgaWkrKykgeworCQkJCS8qIENyZWF0ZSB0aGUgYmFzZSBwYXR0ZXJuCisJCQkJICovCisJCQkJdmFsID0gKDEgPDwgYnl0ZSk7CisJCQkJLyogZXZlcnkgNjQgKDB4NDApIGJ5dGVzIGZsaXAgdGhlIHBhdHRlcm4KKwkJCQkgKiBzaW5jZSB3ZSBmaWxsIDIgYnl0ZXMgLyBpdGVyYXRpb24sCisJCQkJICogdGVzdCBmb3IgaWkgPSAweDIwCisJCQkJICovCisJCQkJaWYgKGlpICYgMHgyMCkKKwkJCQkJdmFsID0gfih2YWwpOworCisJCQkJaWYgKGlpICYgMHgwMSkgeworCQkJCQkqcHRyID0gKGNoYXIpKCAodmFsICYgMHhGRjAwKSA+PiA4KTsKKwkJCQkJcHRyKys7CisJCQkJCSpwdHIgPSAoY2hhcikodmFsICYgMHhGRik7CisJCQkJCWJ5dGUrKzsKKwkJCQkJYnl0ZSAmPSAweDBGOworCQkJCX0gZWxzZSB7CisJCQkJCXZhbCA9IH52YWw7CisJCQkJCSpwdHIgPSAoY2hhcikoICh2YWwgJiAweEZGMDApID4+IDgpOworCQkJCQlwdHIrKzsKKwkJCQkJKnB0ciA9IChjaGFyKSh2YWwgJiAweEZGKTsKKwkJCQl9CisKKwkJCQlwdHIrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIE5hcnJvdyBQYXR0ZXJuOiAgRkUgMDEgRkQgMDIgRkIgMDQKKwkJCSAqIC4uIDdGIDgwIDAxIEZFIDAyIEZEIC4uLiAgODAgN0YKKwkJCSAqLworCQkJYnl0ZSA9IDA7CisJCQlmb3IgKGlpPTA7IGlpIDwgc2l6ZTsgaWkrKywgcHRyKyspIHsKKwkJCQkvKiBCYXNlIHBhdHRlcm4gLSBmaXJzdCAzMiBieXRlcworCQkJCSAqLworCQkJCWlmIChpaSAmIDB4MDEpIHsKKwkJCQkJKnB0ciA9ICgxIDw8IGJ5dGUpOworCQkJCQlieXRlKys7CisJCQkJCWJ5dGUgJj0gMHgwNzsKKwkJCQl9IGVsc2UgeworCQkJCQkqcHRyID0gKGNoYXIpICh+KDEgPDwgYnl0ZSkpOworCQkJCX0KKworCQkJCS8qIEZsaXAgdGhlIHBhdHRlcm4gZXZlcnkgMzIgYnl0ZXMKKwkJCQkgKi8KKwkJCQlpZiAoaWkgJiAweDIwKQorCQkJCQkqcHRyID0gfigqcHRyKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9Cit9CisjZW5kaWYgLyogfk1QVFNDU0lIX0VOQUJMRV9ET01BSU5fVkFMSURBVElPTiAqLworCisvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCisKK21vZHVsZV9pbml0KG1wdHNjc2loX2luaXQpOworbW9kdWxlX2V4aXQobXB0c2NzaWhfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNiMmZkNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguaApAQCAtMCwwICsxLDk0IEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguaAorICogICAgICBIaWdoIHBlcmZvcm1hbmNlIFNDU0kgLyBGaWJyZSBDaGFubmVsIFNDU0kgSG9zdCBkZXZpY2UgZHJpdmVyLgorICogICAgICBGb3IgdXNlIHdpdGggUENJIGNoaXAvYWRhcHRlcihzKToKKyAqICAgICAgICAgIExTSUZDOXh4L0xTSTQwOXh4IEZpYnJlIENoYW5uZWwKKyAqICAgICAgcnVubmluZyBMU0kgTG9naWMgRnVzaW9uIE1QVCAoTWVzc2FnZSBQYXNzaW5nIFRlY2hub2xvZ3kpIGZpcm13YXJlLgorICoKKyAqICBDcmVkaXRzOgorICogICAgICBUaGlzIGRyaXZlciB3b3VsZCBub3QgZXhpc3QgaWYgbm90IGZvciBBbGFuIENveCdzIGRldmVsb3BtZW50CisgKiAgICAgIG9mIHRoZSBsaW51eCBpMm8gZHJpdmVyLgorICoKKyAqICAgICAgQSBodWdlIGRlYnQgb2YgZ3JhdGl0dWRlIGlzIG93ZWQgdG8gRGF2aWQgUy4gTWlsbGVyIChEYXZlTSkKKyAqICAgICAgZm9yIGZpeGluZyBtdWNoIG9mIHRoZSBzdHVwaWQgYW5kIGJyb2tlbiBzdHVmZiBpbiB0aGUgZWFybHkKKyAqICAgICAgZHJpdmVyIHdoaWxlIHBvcnRpbmcgdG8gc3BhcmM2NCBwbGF0Zm9ybS4gIFRIQU5LIFlPVSEKKyAqCisgKiAgICAgIChzZWUgYWxzbyBtcHRiYXNlLmMpCisgKgorICogIENvcHlyaWdodCAoYykgMTk5OS0yMDA0IExTSSBMb2dpYyBDb3Jwb3JhdGlvbgorICogIE9yaWdpbmFsbHkgQnk6IFN0ZXZlbiBKLiBSYWxzdG9uCisgKiAgKG1haWx0bzpuZXRzY2FwZS5uZXQpCisgKiAgKG1haWx0bzptcHRfbGludXhfZGV2ZWxvcGVyQGxzaWwuY29tKQorICoKKyAqICAkSWQ6IG1wdHNjc2loLmgsdiAxLjIxIDIwMDIvMTIvMDMgMjE6MjY6MzUgcGRlbGFuZXkgRXhwICQKKyAqLworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIE5PIFdBUlJBTlRZCisgICAgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCisgICAgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQKKyAgICBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorICAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyAgICBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCisgICAgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCisgICAgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwKKyAgICBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KKworICAgIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisgICAgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKKyAgICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgICBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORAorICAgIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgorICAgIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAgICBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKKyAgICBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorKi8KKworI2lmbmRlZiBTQ1NJSE9TVF9IX0lOQ0xVREVECisjZGVmaW5lIFNDU0lIT1NUX0hfSU5DTFVERUQKKworLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLworLyoKKyAqCVNDU0kgUHVibGljIHN0dWZmLi4uCisgKi8KKworI2RlZmluZSBNUFRfU0NTSV9DTURfUEVSX0RFVl9ISUdICTMxCisjZGVmaW5lIE1QVF9TQ1NJX0NNRF9QRVJfREVWX0xPVwk3CisKKyNkZWZpbmUgTVBUX1NDU0lfQ01EX1BFUl9MVU4JCTcKKworI2RlZmluZSBNUFRfU0NTSV9NQVhfU0VDVE9SUyAgICA4MTkyCisKKy8qIFRvIGRpc2FibGUgZG9tYWluIHZhbGlkYXRpb24sIHVuY29tbWVudCB0aGUKKyAqIGZvbGxvd2luZyBsaW5lLiBObyBlZmZlY3QgZm9yIEZDIGRldmljZXMuCisgKiBGb3IgU0NTSSBkZXZpY2VzLCBkcml2ZXIgd2lsbCBuZWdvdGlhdGUgdG8KKyAqIE5WUkFNIHNldHRpbmdzIChpZiBhdmFpbGFibGUpIG9yIHRvIG1heGltdW0gYWRhcHRlcgorICogY2FwYWJpbGl0aWVzLgorICovCisKKyNkZWZpbmUgTVBUU0NTSUhfRU5BQkxFX0RPTUFJTl9WQUxJREFUSU9OCisKKworLyogU0NTSSBkcml2ZXIgc2V0dXAgc3RydWN0dXJlLiBTZXR0aW5ncyBjYW4gYmUgb3ZlcnJpZGRlbgorICogYnkgY29tbWFuZCBsaW5lIG9wdGlvbnMuCisgKi8KKyNkZWZpbmUgTVBUU0NTSUhfRE9NQUlOX1ZBTElEQVRJT04gICAgICAxCisjZGVmaW5lIE1QVFNDU0lIX01BWF9XSURUSCAgICAgICAgICAgICAgMQorI2RlZmluZSBNUFRTQ1NJSF9NSU5fU1lOQyAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgTVBUU0NTSUhfU0FGX1RFICAgICAgICAgICAgICAgICAwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9LY29uZmlnIGIvZHJpdmVycy9tZXNzYWdlL2kyby9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMTMyYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL0tjb25maWcKQEAgLTAsMCArMSw3NSBAQAorCittZW51ICJJMk8gZGV2aWNlIHN1cHBvcnQiCisKK2NvbmZpZyBJMk8KKwl0cmlzdGF0ZSAiSTJPIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kKKwktLS1oZWxwLS0tCisJICBUaGUgSW50ZWxsaWdlbnQgSW5wdXQvT3V0cHV0IChJMk8pIGFyY2hpdGVjdHVyZSBhbGxvd3MgaGFyZHdhcmUKKwkgIGRyaXZlcnMgdG8gYmUgc3BsaXQgaW50byB0d28gcGFydHM6IGFuIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWMKKwkgIG1vZHVsZSBjYWxsZWQgdGhlIE9TTSBhbmQgYW4gaGFyZHdhcmUgc3BlY2lmaWMgbW9kdWxlIGNhbGxlZCB0aGUKKwkgIEhETS4gVGhlIE9TTSBjYW4gdGFsayB0byBhIHdob2xlIHJhbmdlIG9mIEhETSdzLCBhbmQgaWRlYWxseSB0aGUKKwkgIEhETSdzIGFyZSBub3QgT1MgZGVwZW5kZW50LiBUaGlzIGFsbG93cyBmb3IgdGhlIHNhbWUgSERNIGRyaXZlciB0bworCSAgYmUgdXNlZCB1bmRlciBkaWZmZXJlbnQgb3BlcmF0aW5nIHN5c3RlbXMgaWYgdGhlIHJlbGV2YW50IE9TTSBpcyBpbgorCSAgcGxhY2UuIEluIG9yZGVyIGZvciB0aGlzIHRvIHdvcmssIHlvdSBuZWVkIHRvIGhhdmUgYW4gSTJPIGludGVyZmFjZQorCSAgYWRhcHRlciBjYXJkIGluIHlvdXIgY29tcHV0ZXIuIFRoaXMgY2FyZCBjb250YWlucyBhIHNwZWNpYWwgSS9PCisJICBwcm9jZXNzb3IgKElPUCksIHRodXMgYWxsb3dpbmcgaGlnaCBzcGVlZHMgc2luY2UgdGhlIENQVSBkb2VzIG5vdAorCSAgaGF2ZSB0byBkZWFsIHdpdGggSS9PLgorCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgZ2V0IGEgY2hvaWNlIG9mIGludGVyZmFjZSBhZGFwdGVyCisJICBkcml2ZXJzIGFuZCBPU00ncyB3aXRoIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zLgorCisJICBUbyBjb21waWxlIHRoaXMgc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGVzIHdpbGwgYmUgY2FsbGVkIGkyb19jb3JlLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgSTJPX0NPTkZJRworCXRyaXN0YXRlICJJMk8gQ29uZmlndXJhdGlvbiBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIEkyTworCWhlbHAKKwkgIFNheSBZIGZvciBzdXBwb3J0IG9mIHRoZSBjb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgdGhlIEkyTyBhZGFwdGVycy4KKwkgIElmIHlvdSBoYXZlIGEgUkFJRCBjb250cm9sbGVyIGZyb20gQWRhcHRlYyBhbmQgeW91IHdhbnQgdG8gdXNlIHRoZQorCSAgcmFpZHV0aWxzIHRvIG1hbmFnZSB5b3VyIFJBSUQgYXJyYXksIHlvdSBoYXZlIHRvIHNheSBZIGhlcmUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpMm9fY29uZmlnLgorCitjb25maWcgSTJPX0JMT0NLCisJdHJpc3RhdGUgIkkyTyBCbG9jayBPU00iCisJZGVwZW5kcyBvbiBJMk8KKwloZWxwCisJICBJbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBJMk8gQmxvY2sgT1NNLiBUaGUgQmxvY2sgT1NNIHByZXNlbnRzIGRpc2sKKwkgIGFuZCBvdGhlciBzdHJ1Y3R1cmVkIGJsb2NrIGRldmljZXMgdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0uIElmIHlvdQorCSAgYXJlIHVzaW5nIGFuIFJBSUQgY29udHJvbGxlciwgeW91IGNvdWxkIGFjY2VzcyB0aGUgYXJyYXkgb25seSBieQorCSAgdGhlIEJsb2NrIE9TTSBkcml2ZXIuIEJ1dCBpdCBpcyBwb3NzaWJsZSB0byBhY2Nlc3MgdGhlIHNpbmdsZSBkaXNrcworCSAgYnkgdGhlIFNDU0kgT1NNIGRyaXZlciwgZm9yIGV4YW1wbGUgdG8gbW9uaXRvciB0aGUgZGlza3MuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpMm9fYmxvY2suCisKK2NvbmZpZyBJMk9fU0NTSQorCXRyaXN0YXRlICJJMk8gU0NTSSBPU00iCisJZGVwZW5kcyBvbiBJMk8gJiYgU0NTSQorCWhlbHAKKwkgIEFsbG93cyBkaXJlY3QgU0NTSSBhY2Nlc3MgdG8gU0NTSSBkZXZpY2VzIG9uIGEgU0NTSSBvciBGaWJyZUNoYW5uZWwKKwkgIEkyTyBjb250cm9sbGVyLiBZb3UgY2FuIHVzZSBib3RoIHRoZSBTQ1NJIGFuZCBCbG9jayBPU00gdG9nZXRoZXIgaWYKKwkgIHlvdSB3aXNoLiBUbyBhY2Nlc3MgYSBSQUlEIGFycmF5LCB5b3UgbXVzdCB1c2UgdGhlIEJsb2NrIE9TTSBkcml2ZXIuCisJICBCdXQgeW91IGNvdWxkIHVzZSB0aGUgU0NTSSBPU00gZHJpdmVyIHRvIG1vbml0b3IgdGhlIHNpbmdsZSBkaXNrcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGkyb19zY3NpLgorCitjb25maWcgSTJPX1BST0MKKwl0cmlzdGF0ZSAiSTJPIC9wcm9jIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJMk8KKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgdG8gIi9wcm9jIGZpbGUgc3lzdGVtIHN1cHBvcnQiLCB5b3Ugd2lsbCBiZQorCSAgYWJsZSB0byByZWFkIEkyTyByZWxhdGVkIGluZm9ybWF0aW9uIGZyb20gdGhlIHZpcnR1YWwgZGlyZWN0b3J5CisJICAvcHJvYy9pMm8uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpMm9fcHJvYy4KKworZW5kbWVudQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL01ha2VmaWxlIGIvZHJpdmVycy9tZXNzYWdlL2kyby9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWJjNmNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9NYWtlZmlsZQpAQCAtMCwwICsxLDEzIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUga2VybmVsIEkyTyBPU00uCisjCisjIE5vdGUgOiBhdCB0aGlzIHBvaW50LCB0aGVzZSBmaWxlcyBhcmUgY29tcGlsZWQgb24gYWxsIHN5c3RlbXMuCisjIEluIHRoZSBmdXR1cmUsIHNvbWUgb2YgdGhlc2Ugc2hvdWxkIGJlIGJ1aWx0IGNvbmRpdGlvbmFsbHkuCisjCisKK2kyb19jb3JlLXkJCSs9IGlvcC5vIGRyaXZlci5vIGRldmljZS5vIGRlYnVnLm8gcGNpLm8gZXhlYy1vc20ubworb2JqLSQoQ09ORklHX0kyTykJKz0gaTJvX2NvcmUubworb2JqLSQoQ09ORklHX0kyT19DT05GSUcpKz0gaTJvX2NvbmZpZy5vCitvYmotJChDT05GSUdfSTJPX0JMT0NLKQkrPSBpMm9fYmxvY2subworb2JqLSQoQ09ORklHX0kyT19TQ1NJKQkrPSBpMm9fc2NzaS5vCitvYmotJChDT05GSUdfSTJPX1BST0MpCSs9IGkyb19wcm9jLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vUkVBRE1FIGIvZHJpdmVycy9tZXNzYWdlL2kyby9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxZjg1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vUkVBRE1FCkBAIC0wLDAgKzEsOTggQEAKKworCUxpbnV4IEkyTyBTdXBwb3J0CShjKSBDb3B5cmlnaHQgMTk5OSBSZWQgSGF0IFNvZnR3YXJlCisJCQkJCWFuZCBvdGhlcnMuCisKKwlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKwlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKwkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitBVVRIT1JTIChzbyBmYXIpCisKK0FsYW4gQ294LCBCdWlsZGluZyBOdW1iZXIgVGhyZWUgTHRkLgorCUNvcmUgY29kZSwgU0NTSSBhbmQgQmxvY2sgT1NNcworCitTdGV2ZSBSYWxzdG9uLCBMU0kgTG9naWMgQ29ycC4KKwlEZWJ1Z2dpbmcgU0NTSSBhbmQgQmxvY2sgT1NNCisKK0RlZXBhayBTYXhlbmEsIEludGVsIENvcnAuCisJVmFyaW91cyBjb3JlL2Jsb2NrIGV4dGVuc2lvbnMKKwkvcHJvYyBpbnRlcmZhY2UsIGJ1ZyBmaXhlcworCUlvY3RsIGludGVyZmFjZXMgZm9yIGNvbnRyb2wKKwlEZWJ1Z2dpbmcgTEFOIE9TTQorCitQaGlsaXAgUnVtcGYKKwlGaXhlZCBhc3NvcnRlZCBkdW1iIFNNUCBsb2NraW5nIGJ1Z3MKKworSnVoYSBTaWV2YW5lbiwgVW5pdmVyc2l0eSBvZiBIZWxzaW5raSBGaW5sYW5kCisJTEFOIE9TTSBjb2RlCisJL3Byb2MgaW50ZXJmYWNlIHRvIExBTiBjbGFzcworCUJ1ZyBmaXhlcworCUNvcmUgY29kZSBleHRlbnNpb25zCisKK0F1dm8gSORra2luZW4sIFVuaXZlcnNpdHkgb2YgSGVsc2lua2kgRmlubGFuZAorCUxBTiBPU00gY29kZQorCS9Qcm9jIGludGVyZmFjZSB0byBMQU4gY2xhc3MKKwlCdWcgZml4ZXMKKwlDb3JlIGNvZGUgZXh0ZW5zaW9ucworCitUYW5lbGkgVuRo5GthbmdhcywgVW5pdmVyc2l0eSBvZiBIZWxzaW5raSBGaW5sYW5kCisJRml4ZXMgdG8gaTJvX2NvbmZpZworCitDUkVESVRTCisKKwlUaGlzIHdvcmsgd2FzIG1hZGUgcG9zc2libGUgYnkgCisKK1JlZCBIYXQgU29mdHdhcmUKKwlGdW5kaW5nIGZvciB0aGUgQnVpbGRpbmcgIzMgcGFydCBvZiB0aGUgcHJvamVjdAorCitTeW1iaW9zIExvZ2ljIChOb3cgTFNJKQorCUhvc3QgYWRhcHRlcnMsIGhpbnRzLCBrbm93biB0byB3b3JrIHBsYXRmb3JtcyB3aGVuIEkgaGl0CisJY29tcGF0aWJpbGl0eSBwcm9ibGVtcworCitCb3hIaWxsIENvcnBvcmF0aW9uCisJTG9hbiBvZiBpbml0aWFsIEZpYnJlQ2hhbm5lbCBkaXNrIGFycmF5IHVzZWQgZm9yIGRldmVsb3BtZW50IHdvcmsuCisKK0V1cm9wZWFuIENvbWlzc2lvbgorCUZ1bmRpbmcgdGhlIHdvcmsgZG9uZSBieSB0aGUgVW5pdmVyc2l0eSBvZiBIZWxzaW5raQorCitTeXNLb25uZWN0CisgICAgICAgIExvYW4gb2YgRkRESSBhbmQgR2lnYWJpdCBFdGhlcm5ldCBjYXJkcworCitBU1VTVGVLCisgICAgICAgIExvYW4gb2YgSTJPIG1vdGhlcmJvYXJkIAorCitTVEFUVVM6CisKK28JVGhlIGNvcmUgc2V0dXAgd29ya3Mgd2l0aGluIGxpbWl0cy4KK28JVGhlIHNjc2kgbGF5ZXIgc2VlbXMgdG8gYWxtb3N0IHdvcmsuIAorICAgICAgICAgICBJJ20gc3RpbGwgY2hhc2luZyBkb3duIHRoZSBoYW5nIGJ1Zy4KK28JVGhlIGJsb2NrIE9TTSBpcyBtb3N0bHkgZnVuY3Rpb25hbAorbwlMQU4gT1NNIHdvcmtzIHdpdGggRkRESSBhbmQgRXRoZXJuZXQgY2FyZHMuCisKK1RPIERPOgorCitHZW5lcmFsOgorbwlQcm92aWRlIGhpZGRlbiBhZGRyZXNzIHNwYWNlIGlmIGFza2VkCitvCUxvbmcgdGVybSBtZXNzYWdlIGZsb3cgY29udHJvbAorbwlQQ0kgSU9QJ3Mgd2l0aG91dCBpbnRlcnJ1cHRzIGFyZSBub3Qgc3VwcG9ydGVkIHlldAorbwlQdXNoIEZBSUwgaGFuZGxpbmcgaW50byB0aGUgY29yZQorbwlERE0gY29udHJvbCBpbnRlcmZhY2VzIGZvciBtb2R1bGUgbG9hZCBldGMKK28gICAgICAgQWRkIEkyTyAyLjAgc3VwcG9ydCAoRGVmZmVyZWQgdG8gMi41IGtlcm5lbCkKKworQmxvY2s6CitvCU11bHRpcGxlIG1ham9yIG51bWJlcnMKK28JUmVhZCBhaGVhZCBhbmQgY2FjaGUgaGFuZGxpbmcgc3R1ZmYuIFRhbGsgdG8gSW5nbyBhbmQgcGVvcGxlCitvCVBvd2VyIG1hbmFnZW1lbnQKK28JRmluaXNoIE1lZGlhIGNoYW5nZXJzCisKK1NDU0k6CitvCUZpbmQgdGhlIHJpZ2h0IHdheSB0byBhc3NvY2lhdGUgZHJpdmVzL2x1bnMvYnVzc2VzCisKK0xhbjoJCitvCVBlcmZvcm1hbmNlIHR1bmluZworbwlUZXN0IEZpYnJlIENoYW5uZWwgY29kZQorCitUYXBlOgorbwlBbnlvbmUgc2VlbiBhbnl0aGluZyBpbXBsZW1lbnRpbmcgdGhpcyA/CisgICAgICAgICAgIChELlM6IFdpbGwgYXR0ZW1wdCB0byBkbyBzbyBpZiBzcGFyZSBjeWNsZXMgcGVybWl0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9SRUFETUUuaW9jdGwgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL1JFQURNRS5pb2N0bApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2RkMDg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9SRUFETUUuaW9jdGwKQEAgLTAsMCArMSwzOTQgQEAKKworTGludXggSTJPIFVzZXIgU3BhY2UgSW50ZXJmYWNlCityZXYgMC4zIC0gMDQvMjAvOTkKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK09yaWdpbmFsbHkgd3JpdHRlbiBieSBEZWVwYWsgU2F4ZW5hKGRlZXBha0BwbGV4aXR5Lm5ldCkKK0N1cnJlbnRseSBtYWludGFpbmVkIGJ5IERlZXBhayBTYXhlbmEoZGVlcGFrQHBsZXhpdHkubmV0KQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSS4gSW50cm9kdWN0aW9uCisKK1RoZSBMaW51eCBJMk8gc3Vic3lzdGVtIHByb3ZpZGVzIGEgc2V0IG9mIGlvY3RsKCkgY29tbWFuZHMgdGhhdCBjYW4gYmUKK3V0aWxpemVkIGJ5IHVzZXIgc3BhY2UgYXBwbGljYXRpb25zIHRvIGNvbW11bmljYXRlIHdpdGggSU9QcyBhbmQgZGV2aWNlcworb24gaW5kaXZpZHVhbCBJT1BzLiBUaGlzIGRvY3VtZW50IGRlZmluZXMgdGhlIHNwZWNpZmljIGlvY3RsKCkgY29tbWFuZHMKK3RoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgdXNlciBhbmQgcHJvdmlkZXMgZXhhbXBsZXMgb2YgdGhlaXIgdXNlcy4KKworVGhpcyBkb2N1bWVudCBhc3N1bWVzIHRoZSByZWFkZXIgaXMgZmFtaWxpYXIgd2l0aCBvciBoYXMgYWNjZXNzIHRvIHRoZSAKK0kyTyBzcGVjaWZpY2F0aW9uIGFzIG5vIEkyTyBtZXNzYWdlIHBhcmFtZXRlcnMgYXJlIG91dGxpbmVkLiAgRm9yIGluZm9ybWF0aW9uIAorb24gdGhlIHNwZWNpZmljYXRpb24sIHNlZSBodHRwOi8vd3d3Lmkyb3NpZy5vcmcKKworVGhpcyBkb2N1bWVudCBhbmQgdGhlIEkyTyB1c2VyIHNwYWNlIGludGVyZmFjZSBhcmUgY3VycmVudGx5IG1haW50YWluZWQKK2J5IERlZXBhayBTYXhlbmEuICBQbGVhc2Ugc2VuZCBhbGwgY29tbWVudHMsIGVycmF0YSwgYW5kIGJ1ZyBmaXhlcyB0bworZGVlcGFrQGNzb2NpZXR5LnB1cmR1ZS5lZHUKKworSUkuIElPUCBBY2Nlc3MKKworQWNjZXNzIHRvIHRoZSBJMk8gc3Vic3lzdGVtIGlzIHByb3ZpZGVkIHRocm91Z2ggdGhlIGRldmljZSBmaWxlIG5hbWVkIAorL2Rldi9pMm8vY3RsLiAgVGhpcyBmaWxlIGlzIGEgY2hhcmFjdGVyIGZpbGUgd2l0aCBtYWpvciBudW1iZXIgMTAgYW5kIG1pbm9yCitudW1iZXIgMTY2LiAgSXQgY2FuIGJlIGNyZWF0ZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKKyAgIG1rbm9kIC9kZXYvaTJvL2N0bCBjIDEwIDE2NgorCitJSUkuIERldGVybWluaW5nIHRoZSBJT1AgQ291bnQKKworICAgU1lOT1BTSVMgCisKKyAgIGlvY3RsKGZkLCBJMk9HRVRJT1BTLCAgaW50ICpjb3VudCk7CisKKyAgIHU4IGNvdW50W01BWF9JMk9fQ09OVFJPTExFUlNdOworCisgICBERVNDUklQVElPTgorCisgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHN5c3RlbSdzIGFjdGl2ZSBJT1AgdGFibGUuICBjb3VudCBzaG91bGQKKyAgIHBvaW50IHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgTUFYX0kyT19DT05UUk9MTEVSUyBlbnRyaWVzLiAgVXBvbiAKKyAgIHJldHVybmluZywgZWFjaCBlbnRyeSB3aWxsIGNvbnRhaW4gYSBub24temVybyB2YWx1ZSBpZiB0aGUgZ2l2ZW4KKyAgIElPUCB1bml0IGlzIGFjdGl2ZSwgYW5kIE5VTEwgaWYgaXQgaXMgaW5hY3RpdmUgb3Igbm9uLWV4aXN0ZW50LgorCisgICBSRVRVUk4gVkFMVUUuCisKKyAgIFJldHVybnMgMCBpZiBubyBlcnJvcnMgb2NjdXIsIGFuZCAtMSBvdGhlcndpc2UuICBJZiBhbiBlcnJvciBvY2N1cnMsCisgICBlcnJubyBpcyBzZXQgYXBwcm9wcmlhdGVseToKKworICAgICBFRkFVTFQgICBJbnZhbGlkIHVzZXIgc3BhY2UgcG9pbnRlciB3YXMgcGFzc2VkCisKK0lWLiBHZXR0aW5nIEhhcmR3YXJlIFJlc291cmNlIFRhYmxlCisKKyAgIFNZTk9QU0lTIAorIAorICAgaW9jdGwoZmQsIEkyT0hSVEdFVCwgc3RydWN0IGkyb19jbWRfaHJ0ICpocnQpOworCisgICAgICBzdHJ1Y3QgaTJvX2NtZF9ocnRsY3QKKyAgICAgIHsKKyAgICAgICAgIHUzMiAgIGlvcDsgICAgICAvKiBJT1AgdW5pdCBudW1iZXIgKi8KKyAgICAgICAgIHZvaWQgICpyZXNidWY7ICAvKiBCdWZmZXIgZm9yIHJlc3VsdCAqLworICAgICAgICAgdTMyICAgKnJlc2xlbjsgIC8qIEJ1ZmZlciBsZW5ndGggaW4gYnl0ZXMgKi8KKyAgICAgIH07CisKKyAgIERFU0NSSVBUSU9OCisKKyAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgSGFyZHdhcmUgUmVzb3VyY2UgVGFibGUgb2YgdGhlIElPUCBzcGVjaWZpZWQgCisgICBieSBocnQtPmlvcCBpbiB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgaHJ0LT5yZXNidWYuIFRoZSBhY3R1YWwgc2l6ZSBvZiAKKyAgIHRoZSBkYXRhIGlzIHdyaXR0ZW4gaW50byAqKGhydC0+cmVzbGVuKS4KKworICAgUkVUVVJOUworCisgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBpZiBubyBlcnJvcnMgb2NjdXIuIElmIGFuIGVycm9yIG9jY3VycywgLTEgCisgICBpcyByZXR1cm5lZCBhbmQgZXJybm8gaXMgc2V0IGFwcHJvcHJpYXRlbHk6CisKKyAgICAgIEVGQVVMVCAgICAgIEludmFsaWQgdXNlciBzcGFjZSBwb2ludGVyIHdhcyBwYXNzZWQKKyAgICAgIEVOWElPICAgICAgIEludmFsaWQgSU9QIG51bWJlcgorICAgICAgRU5PQlVGUyAgICAgQnVmZmVyIG5vdCBsYXJnZSBlbm91Z2guICBJZiB0aGlzIG9jY3VycywgdGhlIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICBidWZmZXIgbGVuZ3RoIGlzIHdyaXR0ZW4gaW50byAqKGhydC0+cmVzbGVuKQorICAKK1YuIEdldHRpbmcgTG9naWNhbCBDb25maWd1cmF0aW9uIFRhYmxlCisgICAKKyAgIFNZTk9QU0lTIAorIAorICAgaW9jdGwoZmQsIEkyT0xDVEdFVCwgc3RydWN0IGkyb19jbWRfbGN0ICpsY3QpOworCisgICAgICBzdHJ1Y3QgaTJvX2NtZF9ocnRsY3QKKyAgICAgIHsKKyAgICAgICAgIHUzMiAgIGlvcDsgICAgICAvKiBJT1AgdW5pdCBudW1iZXIgKi8KKyAgICAgICAgIHZvaWQgICpyZXNidWY7ICAvKiBCdWZmZXIgZm9yIHJlc3VsdCAqLworICAgICAgICAgdTMyICAgKnJlc2xlbjsgIC8qIEJ1ZmZlciBsZW5ndGggaW4gYnl0ZXMgKi8KKyAgICAgIH07CisKKyAgIERFU0NSSVBUSU9OCisKKyAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgTG9naWNhbCBDb25maWd1cmF0aW9uIFRhYmxlIG9mIHRoZSBJT1Agc3BlY2lmaWVkCisgICBieSBsY3QtPmlvcCBpbiB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgbGN0LT5yZXNidWYuIFRoZSBhY3R1YWwgc2l6ZSBvZiAKKyAgIHRoZSBkYXRhIGlzIHdyaXR0ZW4gaW50byAqKGxjdC0+cmVzbGVuKS4KKworICAgUkVUVVJOUworCisgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBpZiBubyBlcnJvcnMgb2NjdXIuIElmIGFuIGVycm9yIG9jY3VycywgLTEgCisgICBpcyByZXR1cm5lZCBhbmQgZXJybm8gaXMgc2V0IGFwcHJvcHJpYXRlbHk6CisKKyAgICAgIEVGQVVMVCAgICAgIEludmFsaWQgdXNlciBzcGFjZSBwb2ludGVyIHdhcyBwYXNzZWQKKyAgICAgIEVOWElPICAgICAgIEludmFsaWQgSU9QIG51bWJlcgorICAgICAgRU5PQlVGUyAgICAgQnVmZmVyIG5vdCBsYXJnZSBlbm91Z2guICBJZiB0aGlzIG9jY3VycywgdGhlIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICBidWZmZXIgbGVuZ3RoIGlzIHdyaXR0ZW4gaW50byAqKGxjdC0+cmVzbGVuKQorCitWSS4gU2V0dHRpbmcgUGFyYW1ldGVycworICAgCisgICBTWU5PUFNJUyAKKyAKKyAgIGlvY3RsKGZkLCBJMk9QQVJNU0VULCBzdHJ1Y3QgaTJvX3Bhcm1fc2V0Z2V0ICpvcHMpOworCisgICAgICBzdHJ1Y3QgaTJvX2NtZF9wc2V0Z2V0CisgICAgICB7CisgICAgICAgICB1MzIgICBpb3A7ICAgICAgLyogSU9QIHVuaXQgbnVtYmVyICovCisgICAgICAgICB1MzIgICB0aWQ7ICAgICAgLyogVGFyZ2V0IGRldmljZSBUSUQgKi8KKyAgICAgICAgIHZvaWQgICpvcGJ1ZjsgICAvKiBPcGVyYXRpb24gTGlzdCBidWZmZXIgKi8KKyAgICAgICAgIHUzMiAgIG9wbGVuOyAgICAvKiBPcGVyYXRpb24gTGlzdCBidWZmZXIgbGVuZ3RoIGluIGJ5dGVzICovCisgICAgICAgICB2b2lkICAqcmVzYnVmOyAgLyogUmVzdWx0IExpc3QgYnVmZmVyICovCisgICAgICAgICB1MzIgICAqcmVzbGVuOyAgLyogUmVzdWx0IExpc3QgYnVmZmVyIGxlbmd0aCBpbiBieXRlcyAqLworICAgICAgfTsKKworICAgREVTQ1JJUFRJT04KKworICAgVGhpcyBmdW5jdGlvbiBwb3N0cyBhIFV0aWxQYXJhbXNTZXQgbWVzc2FnZSB0byB0aGUgZGV2aWNlIGlkZW50aWZpZWQKKyAgIGJ5IG9wcy0+aW9wIGFuZCBvcHMtPnRpZC4gIFRoZSBvcGVyYXRpb24gbGlzdCBmb3IgdGhlIG1lc3NhZ2UgaXMgCisgICBzZW50IHRocm91Z2ggdGhlIG9wcy0+b3BidWYgYnVmZmVyLCBhbmQgdGhlIHJlc3VsdCBsaXN0IGlzIHdyaXR0ZW4KKyAgIGludG8gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IG9wcy0+cmVzYnVmLiAgVGhlIG51bWJlciBvZiBieXRlcyAKKyAgIHdyaXR0ZW4gaXMgcGxhY2VkIGludG8gKihvcHMtPnJlc2xlbikuIAorCisgICBSRVRVUk5TCisKKyAgIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGRhdGEgd3JpdHRlbiBpbnRvCisgICBvcHMtPnJlc2J1ZiBpZiBubyBlcnJvcnMgb2NjdXIuICBJZiBhbiBlcnJvciBvY2N1cnMsIC0xIGlzIHJldHVybmVkIAorICAgYW5kIGVycm5vIGlzIHNldCBhcHByb3ByaWF0bHk6CisKKyAgICAgIEVGQVVMVCAgICAgIEludmFsaWQgdXNlciBzcGFjZSBwb2ludGVyIHdhcyBwYXNzZWQKKyAgICAgIEVOWElPICAgICAgIEludmFsaWQgSU9QIG51bWJlcgorICAgICAgRU5PQlVGUyAgICAgQnVmZmVyIG5vdCBsYXJnZSBlbm91Z2guICBJZiB0aGlzIG9jY3VycywgdGhlIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICBidWZmZXIgbGVuZ3RoIGlzIHdyaXR0ZW4gaW50byAqKG9wcy0+cmVzbGVuKQorICAgICAgRVRJTUVET1VUICAgVGltZW91dCB3YWl0aW5nIGZvciByZXBseSBtZXNzYWdlCisgICAgICBFTk9NRU0gICAgICBLZXJuZWwgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IKKworICAgQSByZXR1cm4gdmFsdWUgb2YgMCBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIHZhbHVlIHdhcyBhY3R1YWxseQorICAgY2hhbmdlZCBwcm9wZXJseSBvbiB0aGUgSU9QLiAgVGhlIHVzZXIgc2hvdWxkIGNoZWNrIHRoZSByZXN1bHQKKyAgIGxpc3QgdG8gZGV0ZXJtaW5lIHRoZSBzcGVjaWZpYyBzdGF0dXMgb2YgdGhlIHRyYW5zYWN0aW9uLgorCitWSUkuIEdldHRpbmcgUGFyYW1ldGVycworICAgCisgICBTWU5PUFNJUyAKKyAKKyAgIGlvY3RsKGZkLCBJMk9QQVJNR0VULCBzdHJ1Y3QgaTJvX3Bhcm1fc2V0Z2V0ICpvcHMpOworCisgICAgICBzdHJ1Y3QgaTJvX3Bhcm1fc2V0Z2V0CisgICAgICB7CisgICAgICAgICB1MzIgICBpb3A7ICAgICAgLyogSU9QIHVuaXQgbnVtYmVyICovCisgICAgICAgICB1MzIgICB0aWQ7ICAgICAgLyogVGFyZ2V0IGRldmljZSBUSUQgKi8KKyAgICAgICAgIHZvaWQgICpvcGJ1ZjsgICAvKiBPcGVyYXRpb24gTGlzdCBidWZmZXIgKi8KKyAgICAgICAgIHUzMiAgIG9wbGVuOyAgICAvKiBPcGVyYXRpb24gTGlzdCBidWZmZXIgbGVuZ3RoIGluIGJ5dGVzICovCisgICAgICAgICB2b2lkICAqcmVzYnVmOyAgLyogUmVzdWx0IExpc3QgYnVmZmVyICovCisgICAgICAgICB1MzIgICAqcmVzbGVuOyAgLyogUmVzdWx0IExpc3QgYnVmZmVyIGxlbmd0aCBpbiBieXRlcyAqLworICAgICAgfTsKKworICAgREVTQ1JJUFRJT04KKworICAgVGhpcyBmdW5jdGlvbiBwb3N0cyBhIFV0aWxQYXJhbXNHZXQgbWVzc2FnZSB0byB0aGUgZGV2aWNlIGlkZW50aWZpZWQKKyAgIGJ5IG9wcy0+aW9wIGFuZCBvcHMtPnRpZC4gIFRoZSBvcGVyYXRpb24gbGlzdCBmb3IgdGhlIG1lc3NhZ2UgaXMgCisgICBzZW50IHRocm91Z2ggdGhlIG9wcy0+b3BidWYgYnVmZmVyLCBhbmQgdGhlIHJlc3VsdCBsaXN0IGlzIHdyaXR0ZW4KKyAgIGludG8gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IG9wcy0+cmVzYnVmLiAgVGhlIGFjdHVhbCBzaXplIG9mIGRhdGEKKyAgIHdyaXR0ZW4gaXMgcGxhY2VkIGludG8gKihvcHMtPnJlc2xlbikuCisKKyAgIFJFVFVSTlMKKworICAgICAgRUZBVUxUICAgICAgSW52YWxpZCB1c2VyIHNwYWNlIHBvaW50ZXIgd2FzIHBhc3NlZAorICAgICAgRU5YSU8gICAgICAgSW52YWxpZCBJT1AgbnVtYmVyCisgICAgICBFTk9CVUZTICAgICBCdWZmZXIgbm90IGxhcmdlIGVub3VnaC4gIElmIHRoaXMgb2NjdXJzLCB0aGUgcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgIGJ1ZmZlciBsZW5ndGggaXMgd3JpdHRlbiBpbnRvICoob3BzLT5yZXNsZW4pCisgICAgICBFVElNRURPVVQgICBUaW1lb3V0IHdhaXRpbmcgZm9yIHJlcGx5IG1lc3NhZ2UKKyAgICAgIEVOT01FTSAgICAgIEtlcm5lbCBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvcgorCisgICBBIHJldHVybiB2YWx1ZSBvZiAwIGRvZXMgbm90IG1lYW4gdGhhdCB0aGUgdmFsdWUgd2FzIGFjdHVhbGx5CisgICBwcm9wZXJseSByZXRyZWl2ZWQuICBUaGUgdXNlciBzaG91bGQgY2hlY2sgdGhlIHJlc3VsdCBsaXN0IAorICAgdG8gZGV0ZXJtaW5lIHRoZSBzcGVjaWZpYyBzdGF0dXMgb2YgdGhlIHRyYW5zYWN0aW9uLgorCitWSUlJLiBEb3dubG9hZGluZyBTb2Z0d2FyZQorICAgCisgICBTWU5PUFNJUyAKKyAKKyAgIGlvY3RsKGZkLCBJMk9TV0RMLCBzdHJ1Y3QgaTJvX3N3X3hmZXIgKnN3KTsKKworICAgICAgc3RydWN0IGkyb19zd194ZmVyCisgICAgICB7CisgICAgICAgICB1MzIgICBpb3A7ICAgICAgIC8qIElPUCB1bml0IG51bWJlciAqLworICAgICAgICAgdTggICAgZmxhZ3M7ICAgICAvKiBEb3dubG9hZEZsYWdzIGZpZWxkICovCisgICAgICAgICB1OCAgICBzd190eXBlOyAgIC8qIFNvZnR3YXJlIHR5cGUgKi8KKyAgICAgICAgIHUzMiAgIHN3X2lkOyAgICAgLyogU29mdHdhcmUgSUQgKi8KKyAgICAgICAgIHZvaWQgICpidWY7ICAgICAgLyogUG9pbnRlciB0byBzb2Z0d2FyZSBidWZmZXIgKi8KKyAgICAgICAgIHUzMiAgICpzd2xlbjsgICAgLyogTGVuZ3RoIG9mIHNvZnR3YXJlIGJ1ZmZlciAqLyAgICAgICAgCisgICAgICAgICB1MzIgICAqbWF4ZnJhZzsgIC8qIE51bWJlciBvZiBmcmFnbWVudHMgKi8KKyAgICAgICAgIHUzMiAgICpjdXJmcmFnOyAgLyogQ3VycmVudCBmcmFnbWVudCBudW1iZXIgKi8KKyAgICAgIH07CisKKyAgIERFU0NSSVBUSU9OCisKKyAgIFRoaXMgZnVuY3Rpb24gZG93bmxvYWRzIGEgc29mdHdhcmUgZnJhZ21lbnQgcG9pbnRlZCBieSBzdy0+YnVmCisgICB0byB0aGUgaW9wIGlkZW50aWZpZWQgYnkgc3ctPmlvcC4gVGhlIERvd25sb2FkRmxhZ3MsIFN3SUQsIFN3VHlwZQorICAgYW5kIFN3U2l6ZSBmaWVsZHMgb2YgdGhlIEV4ZWNTd0Rvd25sb2FkIG1lc3NhZ2UgYXJlIGZpbGxlZCBpbiB3aXRoCisgICB0aGUgdmFsdWVzIG9mIHN3LT5mbGFncywgc3ctPnN3X2lkLCBzdy0+c3dfdHlwZSBhbmQgKihzdy0+c3dsZW4pLgorCisgICBUaGUgZnJhZ21lbnRzIF9tdXN0XyBiZSBzZW50IGluIG9yZGVyIGFuZCBiZSA4SyBpbiBzaXplLiBUaGUgbGFzdAorICAgZnJhZ21lbnQgX21heV8gYmUgc2hvcnRlciwgaG93ZXZlci4gVGhlIGtlcm5lbCB3aWxsIGNvbXB1dGUgaXRzCisgICBzaXplIGJhc2VkIG9uIGluZm9ybWF0aW9uIGluIHRoZSBzdy0+c3dsZW4gZmllbGQuCisKKyAgIFBsZWFzZSBub3RlIHRoYXQgU1cgdHJhbnNmZXJzIGNhbiB0YWtlIGEgbG9uZyB0aW1lLgorCisgICBSRVRVUk5TCisKKyAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAwIG5vIGVycm9ycyBvY2N1ci4gSWYgYW4gZXJyb3Igb2NjdXJzLCAtMSAKKyAgIGlzIHJldHVybmVkIGFuZCBlcnJubyBpcyBzZXQgYXBwcm9wcmlhdGx5OgorCisgICAgICBFRkFVTFQgICAgICBJbnZhbGlkIHVzZXIgc3BhY2UgcG9pbnRlciB3YXMgcGFzc2VkCisgICAgICBFTlhJTyAgICAgICBJbnZhbGlkIElPUCBudW1iZXIKKyAgICAgIEVUSU1FRE9VVCAgIFRpbWVvdXQgd2FpdGluZyBmb3IgcmVwbHkgbWVzc2FnZQorICAgICAgRU5PTUVNICAgICAgS2VybmVsIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yCisKK0lYLiBVcGxvYWRpbmcgU29mdHdhcmUKKyAgIAorICAgU1lOT1BTSVMgCisKKyAgIGlvY3RsKGZkLCBJMk9TV1VMLCBzdHJ1Y3QgaTJvX3N3X3hmZXIgKnN3KTsKKworICAgICAgc3RydWN0IGkyb19zd194ZmVyCisgICAgICB7CisgICAgICAgICB1MzIgICBpb3A7ICAgICAgLyogSU9QIHVuaXQgbnVtYmVyICovCisgICAgICAgICB1OCAgICBmbGFnczsgCSAvKiBVcGxvYWRGbGFncyAqLworICAgICAgICAgdTggICAgc3dfdHlwZTsgIC8qIFNvZnR3YXJlIHR5cGUgKi8KKyAgICAgICAgIHUzMiAgIHN3X2lkOyAgICAvKiBTb2Z0d2FyZSBJRCAqLworICAgICAgICAgdm9pZCAgKmJ1ZjsgICAgIC8qIFBvaW50ZXIgdG8gc29mdHdhcmUgYnVmZmVyICovCisgICAgICAgICB1MzIgICAqc3dsZW47ICAgLyogTGVuZ3RoIG9mIHNvZnR3YXJlIGJ1ZmZlciAqLyAgICAgICAgCisgICAgICAgICB1MzIgICAqbWF4ZnJhZzsgLyogTnVtYmVyIG9mIGZyYWdtZW50cyAqLworICAgICAgICAgdTMyICAgKmN1cmZyYWc7IC8qIEN1cnJlbnQgZnJhZ21lbnQgbnVtYmVyICovCisgICAgICB9OworCisgICBERVNDUklQVElPTgorCisgICBUaGlzIGZ1bmN0aW9uIHVwbG9hZHMgYSBzb2Z0d2FyZSBmcmFnbWVudCBmcm9tIHRoZSBJT1AgaWRlbnRpZmllZAorICAgYnkgc3ctPmlvcCwgc3ctPnN3X3R5cGUsIHN3LT5zd19pZCBhbmQgb3B0aW9uYWxseSBzdy0+c3dsZW4gZmllbGRzLgorICAgVGhlIFVwbG9hZEZsYWdzLCBTd0lELCBTd1R5cGUgYW5kIFN3U2l6ZSBmaWVsZHMgb2YgdGhlIEV4ZWNTd1VwbG9hZAorICAgbWVzc2FnZSBhcmUgZmlsbGVkIGluIHdpdGggdGhlIHZhbHVlcyBvZiBzdy0+ZmxhZ3MsIHN3LT5zd19pZCwKKyAgIHN3LT5zd190eXBlIGFuZCAqKHN3LT5zd2xlbikuCisKKyAgIFRoZSBmcmFnbWVudHMgX211c3RfIGJlIHJlcXVlc3RlZCBpbiBvcmRlciBhbmQgYmUgOEsgaW4gc2l6ZS4gVGhlCisgICB1c2VyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIG1lbW9yeSBwb2ludGVkIGJ5IHN3LT5idWYuIFRoZQorICAgbGFzdCBmcmFnbWVudCBfbWF5XyBiZSBzaG9ydGVyLgorCisgICBQbGVhc2Ugbm90ZSB0aGF0IFNXIHRyYW5zZmVycyBjYW4gdGFrZSBhIGxvbmcgdGltZS4KKworICAgUkVUVVJOUworCisgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBpZiBubyBlcnJvcnMgb2NjdXIuICBJZiBhbiBlcnJvciBvY2N1cnMsIC0xCisgICBpcyByZXR1cm5lZCBhbmQgZXJybm8gaXMgc2V0IGFwcHJvcHJpYXRseToKKworICAgICAgRUZBVUxUICAgICAgSW52YWxpZCB1c2VyIHNwYWNlIHBvaW50ZXIgd2FzIHBhc3NlZAorICAgICAgRU5YSU8gICAgICAgSW52YWxpZCBJT1AgbnVtYmVyCisgICAgICBFVElNRURPVVQgICBUaW1lb3V0IHdhaXRpbmcgZm9yIHJlcGx5IG1lc3NhZ2UKKyAgICAgIEVOT01FTSAgICAgIEtlcm5lbCBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvcgorICAgICAgICAgCitYLiBSZW1vdmluZyBTb2Z0d2FyZQorICAgCisgICBTWU5PUFNJUyAKKyAKKyAgIGlvY3RsKGZkLCBJMk9TV0RFTCwgc3RydWN0IGkyb19zd194ZmVyICpzdyk7CisKKyAgICAgIHN0cnVjdCBpMm9fc3dfeGZlcgorICAgICAgeworICAgICAgICAgdTMyICAgaW9wOyAgICAgIC8qIElPUCB1bml0IG51bWJlciAqLworICAgICAgICAgdTggICAgZmxhZ3M7IAkgLyogUmVtb3ZlRmxhZ3MgKi8KKyAgICAgICAgIHU4ICAgIHN3X3R5cGU7ICAvKiBTb2Z0d2FyZSB0eXBlICovCisgICAgICAgICB1MzIgICBzd19pZDsgICAgLyogU29mdHdhcmUgSUQgKi8KKyAgICAgICAgIHZvaWQgICpidWY7ICAgICAvKiBVbnVzZWQgKi8KKyAgICAgICAgIHUzMiAgICpzd2xlbjsgICAvKiBMZW5ndGggb2YgdGhlIHNvZnR3YXJlIGRhdGEgKi8gICAgICAgIAorICAgICAgICAgdTMyICAgKm1heGZyYWc7IC8qIFVudXNlZCAqLworICAgICAgICAgdTMyICAgKmN1cmZyYWc7IC8qIFVudXNlZCAqLworICAgICAgfTsKKworICAgREVTQ1JJUFRJT04KKworICAgVGhpcyBmdW5jdGlvbiByZW1vdmVzIHNvZnR3YXJlIGZyb20gdGhlIElPUCBpZGVudGlmaWVkIGJ5IHN3LT5pb3AuCisgICBUaGUgUmVtb3ZlRmxhZ3MsIFN3SUQsIFN3VHlwZSBhbmQgU3dTaXplIGZpZWxkcyBvZiB0aGUgRXhlY1N3UmVtb3ZlIG1lc3NhZ2UgCisgICBhcmUgZmlsbGVkIGluIHdpdGggdGhlIHZhbHVlcyBvZiBzdy0+ZmxhZ3MsIHN3LT5zd19pZCwgc3ctPnN3X3R5cGUgYW5kIAorICAgKihzdy0+c3dsZW4pLiBHaXZlIHplcm8gaW4gKihzdy0+bGVuKSBpZiB0aGUgdmFsdWUgaXMgdW5rbm93bi4gSU9QIHVzZXMgCisgICAqKHN3LT5zd2xlbikgdmFsdWUgdG8gdmVyaWZ5IGNvcnJlY3QgaWRlbnRpY2F0aW9uIG9mIHRoZSBtb2R1bGUgdG8gcmVtb3ZlLiAKKyAgIFRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgbW9kdWxlIGlzIHdyaXR0ZW4gaW50byAqKHN3LT5zd2xlbikuCisKKyAgIFJFVFVSTlMKKworICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIDAgaWYgbm8gZXJyb3JzIG9jY3VyLiAgSWYgYW4gZXJyb3Igb2NjdXJzLCAtMQorICAgaXMgcmV0dXJuZWQgYW5kIGVycm5vIGlzIHNldCBhcHByb3ByaWF0bHk6CisKKyAgICAgIEVGQVVMVCAgICAgIEludmFsaWQgdXNlciBzcGFjZSBwb2ludGVyIHdhcyBwYXNzZWQKKyAgICAgIEVOWElPICAgICAgIEludmFsaWQgSU9QIG51bWJlcgorICAgICAgRVRJTUVET1VUICAgVGltZW91dCB3YWl0aW5nIGZvciByZXBseSBtZXNzYWdlCisgICAgICBFTk9NRU0gICAgICBLZXJuZWwgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IKKworWC4gVmFsaWRhdGluZyBDb25maWd1cmF0aW9uCisKKyAgIFNZTk9QU0lTCisKKyAgIGlvY3RsKGZkLCBJMk9WQUxJREFURSwgaW50ICppb3ApOworCXUzMiBpb3A7CisKKyAgIERFU0NSSVBUSU9OCisKKyAgIFRoaXMgZnVuY3Rpb24gcG9zdHMgYW4gRXhlY0NvbmZpZ1ZhbGlkYXRlIG1lc3NhZ2UgdG8gdGhlIGNvbnRyb2xsZXIKKyAgIGlkZW50aWZpZWQgYnkgaW9wLiBUaGlzIG1lc3NhZ2UgaW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQKKyAgIGNvbmZpZ3VyYXRpb24gaXMgYWNjZXB0ZWQuIFRoZSBpb3AgY2hhbmdlcyB0aGUgc3RhdHVzIG9mIHN1c3BlY3QgZHJpdmVycyAKKyAgIHRvIHZhbGlkIGFuZCBtYXkgZGVsZXRlIG9sZCBkcml2ZXJzIGZyb20gaXRzIHN0b3JlLgorCisgICBSRVRVUk5TCisKKyAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAwIGlmIG5vIGVycm8gb2NjdXIuICBJZiBhbiBlcnJvciBvY2N1cnMsIC0xIGlzCisgICByZXR1cm5lZCBhbmQgZXJybm8gaXMgc2V0IGFwcHJvcHJpYXRseToKKworICAgICAgRVRJTUVET1VUICAgVGltZW91dCB3YWl0aW5nIGZvciByZXBseSBtZXNzYWdlCisgICAgICBFTlhJTyAgICAgICBJbnZhbGlkIElPUCBudW1iZXIKKworWEkuIENvbmZpZ3VyYXRpb24gRGlhbG9nCisgICAKKyAgIFNZTk9QU0lTIAorIAorICAgaW9jdGwoZmQsIEkyT0hUTUwsIHN0cnVjdCBpMm9faHRtbCAqaHRxdWVyeSk7CisgICAgICBzdHJ1Y3QgaTJvX2h0bWwKKyAgICAgIHsKKyAgICAgICAgIHUzMiAgIGlvcDsgICAgICAvKiBJT1AgdW5pdCBudW1iZXIgKi8KKyAgICAgICAgIHUzMiAgIHRpZDsgICAgICAvKiBUYXJnZXQgZGV2aWNlIElEICovCisgICAgICAgICB1MzIgICBwYWdlOyAgICAgLyogSFRNTCBwYWdlICovCisgICAgICAgICB2b2lkICAqcmVzYnVmOyAgLyogQnVmZmVyIGZvciByZXBseSBIVE1MIHBhZ2UgKi8KKyAgICAgICAgIHUzMiAgICpyZXNsZW47ICAvKiBMZW5ndGggaW4gYnl0ZXMgb2YgcmVwbHkgYnVmZmVyICovCisgICAgICAgICB2b2lkICAqcWJ1ZjsgICAgLyogUG9pbnRlciB0byBIVFRQIHF1ZXJ5IHN0cmluZyAqLworICAgICAgICAgdTMyICAgcWxlbjsgICAgIC8qIExlbmd0aCBpbiBieXRlcyBvZiBxdWVyeSBzdHJpbmcgYnVmZmVyICovICAgICAgICAKKyAgICAgIH07CisKKyAgIERFU0NSSVBUSU9OCisKKyAgIFRoaXMgZnVuY3Rpb24gcG9zdHMgYW4gVXRpbENvbmZpZ0RpYWxvZyBtZXNzYWdlIHRvIHRoZSBkZXZpY2UgaWRlbnRpZmllZAorICAgYnkgaHRxdWVyeS0+aW9wIGFuZCBodHF1ZXJ5LT50aWQuICBUaGUgcmVxdWVzdGVkIEhUTUwgcGFnZSBudW1iZXIgaXMgCisgICBwcm92aWRlZCBieSB0aGUgaHRxdWVyeS0+cGFnZSBmaWVsZCwgYW5kIHRoZSByZXN1bHRhbnQgZGF0YSBpcyBzdG9yZWQgCisgICBpbiB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgaHRxdWVyeS0+cmVzYnVmLiAgSWYgdGhlcmUgaXMgYW4gSFRUUCBxdWVyeSAKKyAgIHN0cmluZyB0aGF0IGlzIHRvIGJlIHNlbnQgdG8gdGhlIGRldmljZSwgaXQgc2hvdWxkIGJlIHNlbnQgaW4gdGhlIGJ1ZmZlcgorICAgcG9pbnRlZCB0byBieSBodHF1ZXJ5LT5xYnVmLiAgSWYgdGhlcmUgaXMgbm8gcXVlcnkgc3RyaW5nLCB0aGlzIGZpZWxkCisgICBzaG91bGQgYmUgc2V0IHRvIE5VTEwuIFRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgcmVwbHkgcmVjZWl2ZWQgaXMgd3JpdHRlbgorICAgaW50byAqKGh0cXVlcnktPnJlc2xlbikuCisgIAorICAgUkVUVVJOUworCisgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBpZiBubyBlcnJvciBvY2N1ci4gSWYgYW4gZXJyb3Igb2NjdXJzLCAtMQorICAgaXMgcmV0dXJuZWQgYW5kIGVycm5vIGlzIHNldCBhcHByb3ByaWF0bHk6CisKKyAgICAgIEVGQVVMVCAgICAgIEludmFsaWQgdXNlciBzcGFjZSBwb2ludGVyIHdhcyBwYXNzZWQKKyAgICAgIEVOWElPICAgICAgIEludmFsaWQgSU9QIG51bWJlcgorICAgICAgRU5PQlVGUyAgICAgQnVmZmVyIG5vdCBsYXJnZSBlbm91Z2guICBJZiB0aGlzIG9jY3VycywgdGhlIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICBidWZmZXIgbGVuZ3RoIGlzIHdyaXR0ZW4gaW50byAqKG9wcy0+cmVzbGVuKQorICAgICAgRVRJTUVET1VUICAgVGltZW91dCB3YWl0aW5nIGZvciByZXBseSBtZXNzYWdlCisgICAgICBFTk9NRU0gICAgICBLZXJuZWwgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IKKworWElJLiBFdmVudHMKKworICAgIEluIHRoZSBwcm9jZXNzIG9mIGRldGVybWluaW5nIHRoaXMuICBDdXJyZW50IGlkZWEgaXMgdG8gaGF2ZSB1c2UKKyAgICB0aGUgc2VsZWN0KCkgaW50ZXJmYWNlIHRvIGFsbG93IHVzZXIgYXBwcyB0byBwZXJpb2RpY2FsbHkgcG9sbAorICAgIHRoZSAvZGV2L2kyby9jdGwgZGV2aWNlIGZvciBldmVudHMuICBXaGVuIHNlbGVjdCgpIG5vdGlmaWVzIHRoZSB1c2VyCisgICAgdGhhdCBhbiBldmVudCBpcyBhdmFpbGFibGUsIHRoZSB1c2VyIHdvdWxkIGNhbGwgcmVhZCgpIHRvIHJldHJpZXZlCisgICAgYSBsaXN0IG9mIGFsbCB0aGUgZXZlbnRzIHRoYXQgYXJlIHBlbmRpbmcgZm9yIHRoZSBzcGVjaWZpYyBkZXZpY2UuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSZXZpc2lvbiBIaXN0b3J5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZXYgMC4xIC0gMDQvMDEvOTkKKy0gSW5pdGlhbCByZXZpc2lvbgorCitSZXYgMC4yIC0gMDQvMDYvOTkKKy0gQ2hhbmdlZCByZXR1cm4gdmFsdWVzIHRvIG1hdGNoIFVOSVggaW9jdGwoKSBzdGFuZGFyZC4gIE9ubHkgcmV0dXJuIHZhbHVlcworICBhcmUgMCBhbmQgLTEuICBBbGwgZXJyb3JzIGFyZSByZXBvcnRlZCB0aHJvdWdoIGVycm5vLgorLSBBZGRlZCBzdW1tYXJ5IG9mIHByb3Bvc2VkIHBvc3NpYmxlIGV2ZW50IGludGVyZmFjZXMKKworUmV2IDAuMyAtIDA0LzIwLzk5CistIENoYW5nZWQgYWxsIGlvY3RscygpIHRvIHVzZSBwb2ludGVycyB0byB1c2VyIGRhdGEgaW5zdGVhZCBvZiBhY3R1YWwgZGF0YQorLSBVcGRhdGVkIGVycm9yIHZhbHVlcyB0byBtYXRjaCB0aGUgY29kZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9kZWJ1Zy5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNWQ0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2RlYnVnLmMKQEAgLTAsMCArMSw0ODEgQEAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pMm8uaD4KKworZXh0ZXJuIHN0cnVjdCBpMm9fZHJpdmVyICoqaTJvX2RyaXZlcnM7CitleHRlcm4gdW5zaWduZWQgaW50IGkyb19tYXhfZHJpdmVyczsKK3N0YXRpYyB2b2lkIGkyb19yZXBvcnRfdXRpbF9jbWQodTggY21kKTsKK3N0YXRpYyB2b2lkIGkyb19yZXBvcnRfZXhlY19jbWQodTggY21kKTsKK3N0YXRpYyB2b2lkIGkyb19yZXBvcnRfZmFpbF9zdGF0dXModTggcmVxX3N0YXR1cywgdTMyICogbXNnKTsKK3N0YXRpYyB2b2lkIGkyb19yZXBvcnRfY29tbW9uX3N0YXR1cyh1OCByZXFfc3RhdHVzKTsKK3N0YXRpYyB2b2lkIGkyb19yZXBvcnRfY29tbW9uX2RzYyh1MTYgZGV0YWlsZWRfc3RhdHVzKTsKKworLyoKKyAqIFVzZWQgZm9yIGVycm9yIHJlcG9ydGluZy9kZWJ1Z2dpbmcgcHVycG9zZXMuCisgKiBSZXBvcnQgQ21kIG5hbWUsIFJlcXVlc3Qgc3RhdHVzLCBEZXRhaWxlZCBTdGF0dXMuCisgKi8KK3ZvaWQgaTJvX3JlcG9ydF9zdGF0dXMoY29uc3QgY2hhciAqc2V2ZXJpdHksIGNvbnN0IGNoYXIgKnN0ciwKKwkJICAgICAgIHN0cnVjdCBpMm9fbWVzc2FnZSAqbSkKK3sKKwl1MzIgKm1zZyA9ICh1MzIgKikgbTsKKwl1OCBjbWQgPSAobXNnWzFdID4+IDI0KSAmIDB4RkY7CisJdTggcmVxX3N0YXR1cyA9IChtc2dbNF0gPj4gMjQpICYgMHhGRjsKKwl1MTYgZGV0YWlsZWRfc3RhdHVzID0gbXNnWzRdICYgMHhGRkZGOworCS8vc3RydWN0IGkyb19kcml2ZXIgKmggPSBpMm9fZHJpdmVyc1ttc2dbMl0gJiAoaTJvX21heF9kcml2ZXJzLTEpXTsKKworCWlmIChjbWQgPT0gSTJPX0NNRF9VVElMX0VWVF9SRUdJU1RFUikKKwkJcmV0dXJuOwkJLy8gTm8gc3RhdHVzIGluIHRoaXMgcmVwbHkKKworCXByaW50ayhLRVJOX0RFQlVHICIlcyVzOiAiLCBzZXZlcml0eSwgc3RyKTsKKworCWlmIChjbWQgPCAweDFGKQkJLy8gVXRpbGl0eSBjbWQKKwkJaTJvX3JlcG9ydF91dGlsX2NtZChjbWQpOworCisJZWxzZSBpZiAoY21kID49IDB4QTAgJiYgY21kIDw9IDB4RUYpCS8vIEV4ZWN1dGl2ZSBjbWQKKwkJaTJvX3JlcG9ydF9leGVjX2NtZChjbWQpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNtZCA9ICUwIzJ4LCAiLCBjbWQpOwkvLyBPdGhlciBjbWRzCisKKwlpZiAobXNnWzBdICYgTVNHX0ZBSUwpIHsKKwkJaTJvX3JlcG9ydF9mYWlsX3N0YXR1cyhyZXFfc3RhdHVzLCBtc2cpOworCQlyZXR1cm47CisJfQorCisJaTJvX3JlcG9ydF9jb21tb25fc3RhdHVzKHJlcV9zdGF0dXMpOworCisJaWYgKGNtZCA8IDB4MUYgfHwgKGNtZCA+PSAweEEwICYmIGNtZCA8PSAweEVGKSkKKwkJaTJvX3JlcG9ydF9jb21tb25fZHNjKGRldGFpbGVkX3N0YXR1cyk7CisJZWxzZQorCQlwcmludGsoS0VSTl9ERUJVRyAiIC8gRGV0YWlsZWRTdGF0dXMgPSAlMCM0eC5cbiIsCisJCSAgICAgICBkZXRhaWxlZF9zdGF0dXMpOworfQorCisvKiBVc2VkIHRvIGR1bXAgYSBtZXNzYWdlIHRvIHN5c2xvZyBkdXJpbmcgZGVidWdnaW5nICovCit2b2lkIGkyb19kdW1wX21lc3NhZ2Uoc3RydWN0IGkyb19tZXNzYWdlICptKQoreworI2lmZGVmIERFQlVHCisJdTMyICptc2cgPSAodTMyICopIG07CisJaW50IGk7CisJcHJpbnRrKEtFUk5fSU5GTyAiRHVtcGluZyBJMk8gbWVzc2FnZSBzaXplICVkIEAgJXBcbiIsCisJICAgICAgIG1zZ1swXSA+PiAxNiAmIDB4ZmZmZiwgbXNnKTsKKwlmb3IgKGkgPSAwOyBpIDwgKChtc2dbMF0gPj4gMTYpICYgMHhmZmZmKTsgaSsrKQorCQlwcmludGsoS0VSTl9JTkZPICIgIG1zZ1slZF0gPSAlMCMxMHhcbiIsIGksIG1zZ1tpXSk7CisjZW5kaWYKK30KKworLyoKKyAqIFVzZWQgZm9yIGVycm9yIHJlcG9ydGluZy9kZWJ1Z2dpbmcgcHVycG9zZXMuCisgKiBGb2xsb3dpbmcgZmFpbCBzdGF0dXMgYXJlIGNvbW1vbiB0byBhbGwgY2xhc3Nlcy4KKyAqIFRoZSBwcmVzZXJ2ZWQgbWVzc2FnZSBtdXN0IGJlIGhhbmRsZWQgaW4gdGhlIHJlcGx5IGhhbmRsZXIuCisgKi8KK3N0YXRpYyB2b2lkIGkyb19yZXBvcnRfZmFpbF9zdGF0dXModTggcmVxX3N0YXR1cywgdTMyICogbXNnKQoreworCXN0YXRpYyBjaGFyICpGQUlMX1NUQVRVU1tdID0geworCQkiMHg4MCIsCQkvKiBub3QgdXNlZCAqLworCQkiU0VSVklDRV9TVVNQRU5ERUQiLAkvKiAweDgxICovCisJCSJTRVJWSUNFX1RFUk1JTkFURUQiLAkvKiAweDgyICovCisJCSJDT05HRVNUSU9OIiwKKwkJIkZBSUxVUkUiLAorCQkiU1RBVEVfRVJST1IiLAorCQkiVElNRV9PVVQiLAorCQkiUk9VVElOR19GQUlMVVJFIiwKKwkJIklOVkFMSURfVkVSU0lPTiIsCisJCSJJTlZBTElEX09GRlNFVCIsCisJCSJJTlZBTElEX01TR19GTEFHUyIsCisJCSJGUkFNRV9UT09fU01BTEwiLAorCQkiRlJBTUVfVE9PX0xBUkdFIiwKKwkJIklOVkFMSURfVEFSR0VUX0lEIiwKKwkJIklOVkFMSURfSU5JVElBVE9SX0lEIiwKKwkJIklOVkFMSURfSU5JVElBVE9SX0NPTlRFWCIsCS8qIDB4OEYgKi8KKwkJIlVOS05PV05fRkFJTFVSRSIJLyogMHhGRiAqLworCX07CisKKwlpZiAocmVxX3N0YXR1cyA9PSBJMk9fRlNDX1RSQU5TUE9SVF9VTktOT1dOX0ZBSUxVUkUpCisJCXByaW50ayhLRVJOX0RFQlVHICJUUkFOU1BPUlRfVU5LTk9XTl9GQUlMVVJFICglMCMyeClcbi4iLAorCQkgICAgICAgcmVxX3N0YXR1cyk7CisJZWxzZQorCQlwcmludGsoS0VSTl9ERUJVRyAiVFJBTlNQT1JUXyVzLlxuIiwKKwkJICAgICAgIEZBSUxfU1RBVFVTW3JlcV9zdGF0dXMgJiAweDBGXSk7CisKKwkvKiBEdW1wIHNvbWUgZGV0YWlscyAqLworCisJcHJpbnRrKEtFUk5fRVJSICIgIEluaXRpYXRvcklkID0gJWQsIFRhcmdldElkID0gJWRcbiIsCisJICAgICAgIChtc2dbMV0gPj4gMTIpICYgMHhGRkYsIG1zZ1sxXSAmIDB4RkZGKTsKKwlwcmludGsoS0VSTl9FUlIgIiAgTG93ZXN0VmVyc2lvbiA9IDB4JTAyWCwgSGlnaGVzdFZlcnNpb24gPSAweCUwMlhcbiIsCisJICAgICAgIChtc2dbNF0gPj4gOCkgJiAweEZGLCBtc2dbNF0gJiAweEZGKTsKKwlwcmludGsoS0VSTl9FUlIgIiAgRmFpbGluZ0hvc3RVbml0ID0gMHglMDRYLCAgRmFpbGluZ0lPUCA9IDB4JTAzWFxuIiwKKwkgICAgICAgbXNnWzVdID4+IDE2LCBtc2dbNV0gJiAweEZGRik7CisKKwlwcmludGsoS0VSTl9FUlIgIiAgU2V2ZXJpdHk6ICAweCUwMlggIiwgKG1zZ1s0XSA+PiAxNikgJiAweEZGKTsKKwlpZiAobXNnWzRdICYgKDEgPDwgMTYpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiKEZvcm1hdEVycm9yKSwgIgorCQkgICAgICAgInRoaXMgbXNnIGNhbiBuZXZlciBiZSBkZWxpdmVyZWQvcHJvY2Vzc2VkLlxuIik7CisJaWYgKG1zZ1s0XSAmICgxIDw8IDE3KSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIihQYXRoRXJyb3IpLCAiCisJCSAgICAgICAidGhpcyBtc2cgY2FuIG5vIGxvbmdlciBiZSBkZWxpdmVyZWQvcHJvY2Vzc2VkLlxuIik7CisJaWYgKG1zZ1s0XSAmICgxIDw8IDE4KSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIihQYXRoU3RhdGUpLCAiCisJCSAgICAgICAidGhlIHN5c3RlbSBzdGF0ZSBkb2VzIG5vdCBhbGxvdyBkZWxpdmVyeS5cbiIpOworCWlmIChtc2dbNF0gJiAoMSA8PCAxOSkpCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiKENvbmdlc3Rpb24pLCByZXNvdXJjZXMgdGVtcG9yYXJpbHkgbm90IGF2YWlsYWJsZTsiCisJCSAgICAgICAiZG8gbm90IHJldHJ5IGltbWVkaWF0ZWx5LlxuIik7Cit9CisKKy8qCisgKiBVc2VkIGZvciBlcnJvciByZXBvcnRpbmcvZGVidWdnaW5nIHB1cnBvc2VzLgorICogRm9sbG93aW5nIHJlcGx5IHN0YXR1cyBhcmUgY29tbW9uIHRvIGFsbCBjbGFzc2VzLgorICovCitzdGF0aWMgdm9pZCBpMm9fcmVwb3J0X2NvbW1vbl9zdGF0dXModTggcmVxX3N0YXR1cykKK3sKKwlzdGF0aWMgY2hhciAqUkVQTFlfU1RBVFVTW10gPSB7CisJCSJTVUNDRVNTIiwKKwkJIkFCT1JUX0RJUlRZIiwKKwkJIkFCT1JUX05PX0RBVEFfVFJBTlNGRVIiLAorCQkiQUJPUlRfUEFSVElBTF9UUkFOU0ZFUiIsCisJCSJFUlJPUl9ESVJUWSIsCisJCSJFUlJPUl9OT19EQVRBX1RSQU5TRkVSIiwKKwkJIkVSUk9SX1BBUlRJQUxfVFJBTlNGRVIiLAorCQkiUFJPQ0VTU19BQk9SVF9ESVJUWSIsCisJCSJQUk9DRVNTX0FCT1JUX05PX0RBVEFfVFJBTlNGRVIiLAorCQkiUFJPQ0VTU19BQk9SVF9QQVJUSUFMX1RSQU5TRkVSIiwKKwkJIlRSQU5TQUNUSU9OX0VSUk9SIiwKKwkJIlBST0dSRVNTX1JFUE9SVCIKKwl9OworCisJaWYgKHJlcV9zdGF0dXMgPj0gQVJSQVlfU0laRShSRVBMWV9TVEFUVVMpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiUmVxdWVzdFN0YXR1cyA9ICUwIzJ4IiwgcmVxX3N0YXR1cyk7CisJZWxzZQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXMiLCBSRVBMWV9TVEFUVVNbcmVxX3N0YXR1c10pOworfQorCisvKgorICogVXNlZCBmb3IgZXJyb3IgcmVwb3J0aW5nL2RlYnVnZ2luZyBwdXJwb3Nlcy4KKyAqIEZvbGxvd2luZyBkZXRhaWxlZCBzdGF0dXMgYXJlIHZhbGlkICBmb3IgZXhlY3V0aXZlIGNsYXNzLAorICogdXRpbGl0eSBjbGFzcywgRERNIGNsYXNzIGFuZCBmb3IgdHJhbnNhY3Rpb24gZXJyb3IgcmVwbGllcy4KKyAqLworc3RhdGljIHZvaWQgaTJvX3JlcG9ydF9jb21tb25fZHNjKHUxNiBkZXRhaWxlZF9zdGF0dXMpCit7CisJc3RhdGljIGNoYXIgKkNPTU1PTl9EU0NbXSA9IHsKKwkJIlNVQ0NFU1MiLAorCQkiMHgwMSIsCQkvLyBub3QgdXNlZAorCQkiQkFEX0tFWSIsCisJCSJUQ0xfRVJST1IiLAorCQkiUkVQTFlfQlVGRkVSX0ZVTEwiLAorCQkiTk9fU1VDSF9QQUdFIiwKKwkJIklOU1VGRklDSUVOVF9SRVNPVVJDRV9TT0ZUIiwKKwkJIklOU1VGRklDSUVOVF9SRVNPVVJDRV9IQVJEIiwKKwkJIjB4MDgiLAkJLy8gbm90IHVzZWQKKwkJIkNIQUlOX0JVRkZFUl9UT09fTEFSR0UiLAorCQkiVU5TVVBQT1JURURfRlVOQ1RJT04iLAorCQkiREVWSUNFX0xPQ0tFRCIsCisJCSJERVZJQ0VfUkVTRVQiLAorCQkiSU5BUFBST1BSSUFURV9GVU5DVElPTiIsCisJCSJJTlZBTElEX0lOSVRJQVRPUl9BRERSRVNTIiwKKwkJIklOVkFMSURfTUVTU0FHRV9GTEFHUyIsCisJCSJJTlZBTElEX09GRlNFVCIsCisJCSJJTlZBTElEX1BBUkFNRVRFUiIsCisJCSJJTlZBTElEX1JFUVVFU1QiLAorCQkiSU5WQUxJRF9UQVJHRVRfQUREUkVTUyIsCisJCSJNRVNTQUdFX1RPT19MQVJHRSIsCisJCSJNRVNTQUdFX1RPT19TTUFMTCIsCisJCSJNSVNTSU5HX1BBUkFNRVRFUiIsCisJCSJUSU1FT1VUIiwKKwkJIlVOS05PV05fRVJST1IiLAorCQkiVU5LTk9XTl9GVU5DVElPTiIsCisJCSJVTlNVUFBPUlRFRF9WRVJTSU9OIiwKKwkJIkRFVklDRV9CVVNZIiwKKwkJIkRFVklDRV9OT1RfQVZBSUxBQkxFIgorCX07CisKKwlpZiAoZGV0YWlsZWRfc3RhdHVzID4gSTJPX0RTQ19ERVZJQ0VfTk9UX0FWQUlMQUJMRSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAvIERldGFpbGVkU3RhdHVzID0gJTAjNHguXG4iLAorCQkgICAgICAgZGV0YWlsZWRfc3RhdHVzKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0RFQlVHICIgLyAlcy5cbiIsIENPTU1PTl9EU0NbZGV0YWlsZWRfc3RhdHVzXSk7Cit9CisKKy8qCisgKiBVc2VkIGZvciBlcnJvciByZXBvcnRpbmcvZGVidWdnaW5nIHB1cnBvc2VzCisgKi8KK3N0YXRpYyB2b2lkIGkyb19yZXBvcnRfdXRpbF9jbWQodTggY21kKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBJMk9fQ01EX1VUSUxfTk9QOgorCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9OT1AsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfVVRJTF9BQk9SVDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfQUJPUlQsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfVVRJTF9DTEFJTToKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfQ0xBSU0sICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfVVRJTF9SRUxFQVNFOgorCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9DTEFJTV9SRUxFQVNFLCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX1VUSUxfQ09ORklHX0RJQUxPRzoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfQ09ORklHX0RJQUxPRywgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9VVElMX0RFVklDRV9SRVNFUlZFOgorCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9ERVZJQ0VfUkVTRVJWRSwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9VVElMX0RFVklDRV9SRUxFQVNFOgorCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9ERVZJQ0VfUkVMRUFTRSwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9VVElMX0VWVF9BQ0s6CisJCXByaW50ayhLRVJOX0RFQlVHICJVVElMX0VWRU5UX0FDS05PV0xFREdFLCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX1VUSUxfRVZUX1JFR0lTVEVSOgorCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9FVkVOVF9SRUdJU1RFUiwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9VVElMX0xPQ0s6CisJCXByaW50ayhLRVJOX0RFQlVHICJVVElMX0xPQ0ssICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfVVRJTF9MT0NLX1JFTEVBU0U6CisJCXByaW50ayhLRVJOX0RFQlVHICJVVElMX0xPQ0tfUkVMRUFTRSwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9VVElMX1BBUkFNU19HRVQ6CisJCXByaW50ayhLRVJOX0RFQlVHICJVVElMX1BBUkFNU19HRVQsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfVVRJTF9QQVJBTVNfU0VUOgorCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9QQVJBTVNfU0VULCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX1VUSUxfUkVQTFlfRkFVTFRfTk9USUZZOgorCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9SRVBMWV9GQVVMVF9OT1RJRlksICIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9ERUJVRyAiQ21kID0gJTAjMngsICIsIGNtZCk7CisJfQorfQorCisvKgorICogVXNlZCBmb3IgZXJyb3IgcmVwb3J0aW5nL2RlYnVnZ2luZyBwdXJwb3NlcworICovCitzdGF0aWMgdm9pZCBpMm9fcmVwb3J0X2V4ZWNfY21kKHU4IGNtZCkKK3sKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSTJPX0NNRF9BREFQVEVSX0FTU0lHTjoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfQURBUFRFUl9BU1NJR04sICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfQURBUFRFUl9SRUFEOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19BREFQVEVSX1JFQUQsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfQURBUFRFUl9SRUxFQVNFOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19BREFQVEVSX1JFTEVBU0UsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfQklPU19JTkZPX1NFVDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfQklPU19JTkZPX1NFVCwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9CT09UX0RFVklDRV9TRVQ6CisJCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0JPT1RfREVWSUNFX1NFVCwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9DT05GSUdfVkFMSURBVEU6CisJCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0NPTkZJR19WQUxJREFURSwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9DT05OX1NFVFVQOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19DT05OX1NFVFVQLCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX0RETV9ERVNUUk9ZOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19ERE1fREVTVFJPWSwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9ERE1fRU5BQkxFOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19ERE1fRU5BQkxFLCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX0RETV9RVUlFU0NFOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19ERE1fUVVJRVNDRSwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9ERE1fUkVTRVQ6CisJCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0RETV9SRVNFVCwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9ERE1fU1VTUEVORDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfRERNX1NVU1BFTkQsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfREVWSUNFX0FTU0lHTjoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfREVWSUNFX0FTU0lHTiwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9ERVZJQ0VfUkVMRUFTRToKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfREVWSUNFX1JFTEVBU0UsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfSFJUX0dFVDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfSFJUX0dFVCwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9BREFQVEVSX0NMRUFSOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19JT1BfQ0xFQVIsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfQURBUFRFUl9DT05ORUNUOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19JT1BfQ09OTkVDVCwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9BREFQVEVSX1JFU0VUOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19JT1BfUkVTRVQsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfTENUX05PVElGWToKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfTENUX05PVElGWSwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9PVVRCT1VORF9JTklUOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19PVVRCT1VORF9JTklULCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX1BBVEhfRU5BQkxFOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19QQVRIX0VOQUJMRSwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9QQVRIX1FVSUVTQ0U6CisJCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1BBVEhfUVVJRVNDRSwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9QQVRIX1JFU0VUOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19QQVRIX1JFU0VULCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX1NUQVRJQ19NRl9DUkVBVEU6CisJCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NUQVRJQ19NRl9DUkVBVEUsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfU1RBVElDX01GX1JFTEVBU0U6CisJCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NUQVRJQ19NRl9SRUxFQVNFLCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX1NUQVRVU19HRVQ6CisJCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NUQVRVU19HRVQsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfU1dfRE9XTkxPQUQ6CisJCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NXX0RPV05MT0FELCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX1NXX1VQTE9BRDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfU1dfVVBMT0FELCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX1NXX1JFTU9WRToKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfU1dfUkVNT1ZFLCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX1NZU19FTkFCTEU6CisJCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NZU19FTkFCTEUsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfU1lTX01PRElGWToKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfU1lTX01PRElGWSwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9TWVNfUVVJRVNDRToKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfU1lTX1FVSUVTQ0UsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfU1lTX1RBQl9TRVQ6CisJCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NZU19UQUJfU0VULCAiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNtZCA9ICUjMDJ4LCAiLCBjbWQpOworCX0KK30KKwordm9pZCBpMm9fZGVidWdfc3RhdGUoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzOiBTdGF0ZSA9ICIsIGMtPm5hbWUpOworCXN3aXRjaCAoKChpMm9fc3RhdHVzX2Jsb2NrICopIGMtPnN0YXR1c19ibG9jay52aXJ0KS0+aW9wX3N0YXRlKSB7CisJY2FzZSAweDAxOgorCQlwcmludGsoS0VSTl9ERUJVRyAiSU5JVFxuIik7CisJCWJyZWFrOworCWNhc2UgMHgwMjoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlJFU0VUXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAweDA0OgorCQlwcmludGsoS0VSTl9ERUJVRyAiSE9MRFxuIik7CisJCWJyZWFrOworCWNhc2UgMHgwNToKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlJFQURZXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAweDA4OgorCQlwcmludGsoS0VSTl9ERUJVRyAiT1BFUkFUSU9OQUxcbiIpOworCQlicmVhazsKKwljYXNlIDB4MTA6CisJCXByaW50ayhLRVJOX0RFQlVHICJGQUlMRURcbiIpOworCQlicmVhazsKKwljYXNlIDB4MTE6CisJCXByaW50ayhLRVJOX0RFQlVHICJGQVVMVEVEXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiV4ICh1bmtub3duICEhKVxuIiwKKwkJICAgICAgICgoaTJvX3N0YXR1c19ibG9jayAqKSBjLT5zdGF0dXNfYmxvY2sudmlydCktPmlvcF9zdGF0ZSk7CisJfQorfTsKKwordm9pZCBpMm9fZHVtcF9ocnQoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXUzMiAqcm93cyA9ICh1MzIgKikgYy0+aHJ0LnZpcnQ7CisJdTggKnAgPSAodTggKikgYy0+aHJ0LnZpcnQ7CisJdTggKmQ7CisJaW50IGNvdW50OworCWludCBsZW5ndGg7CisJaW50IGk7CisJaW50IHN0YXRlOworCisJaWYgKHBbM10gIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogSFJUIHRhYmxlIGZvciBjb250cm9sbGVyIGlzIHRvbyBuZXcgYSB2ZXJzaW9uLlxuIiwKKwkJICAgICAgIGMtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJY291bnQgPSBwWzBdIHwgKHBbMV0gPDwgOCk7CisJbGVuZ3RoID0gcFsyXTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBIUlQgaGFzICVkIGVudHJpZXMgb2YgJWQgYnl0ZXMgZWFjaC5cbiIsCisJICAgICAgIGMtPm5hbWUsIGNvdW50LCBsZW5ndGggPDwgMik7CisKKwlyb3dzICs9IDI7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlwcmludGsoS0VSTl9JTkZPICJBZGFwdGVyICUwOFg6ICIsIHJvd3NbMF0pOworCQlwID0gKHU4ICopIChyb3dzICsgMSk7CisJCWQgPSAodTggKikgKHJvd3MgKyAyKTsKKwkJc3RhdGUgPSBwWzFdIDw8IDggfCBwWzBdOworCisJCXByaW50ayhLRVJOX0RFQlVHICJUSUQgJTA0WDpbIiwgc3RhdGUgJiAweEZGRik7CisJCXN0YXRlID4+PSAxMjsKKwkJaWYgKHN0YXRlICYgKDEgPDwgMCkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiSCIpOwkvKiBIaWRkZW4gKi8KKwkJaWYgKHN0YXRlICYgKDEgPDwgMikpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJQIik7CS8qIFByZXNlbnQgKi8KKwkJCWlmIChzdGF0ZSAmICgxIDw8IDEpKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJDIik7CS8qIENvbnRyb2xsZWQgKi8KKwkJfQorCQlpZiAoc3RhdGUgPiA5KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIioiKTsJLyogSGFyZCAqLworCisJCXByaW50ayhLRVJOX0RFQlVHICJdOiIpOworCisJCXN3aXRjaCAocFszXSAmIDB4RkZGRikgeworCQljYXNlIDA6CisJCQkvKiBBZGFwdGVyIHByaXZhdGUgYnVzIC0gZWFzeSAqLworCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCSAgICAgICAiTG9jYWwgYnVzICVkOiBJL08gYXQgMHglMDRYIE1lbSAweCUwOFgiLCBwWzJdLAorCQkJICAgICAgIGRbMV0gPDwgOCB8IGRbMF0sICoodTMyICopIChkICsgNCkpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCS8qIElTQSBidXMgKi8KKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkgICAgICAgIklTQSAlZDogQ1NOICVkIEkvTyBhdCAweCUwNFggTWVtIDB4JTA4WCIsIHBbMl0sCisJCQkgICAgICAgZFsyXSwgZFsxXSA8PCA4IHwgZFswXSwgKih1MzIgKikgKGQgKyA0KSk7CisJCQlicmVhazsKKworCQljYXNlIDI6CS8qIEVJU0EgYnVzICovCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICJFSVNBICVkOiBTbG90ICVkIEkvTyBhdCAweCUwNFggTWVtIDB4JTA4WCIsCisJCQkgICAgICAgcFsyXSwgZFszXSwgZFsxXSA8PCA4IHwgZFswXSwgKih1MzIgKikgKGQgKyA0KSk7CisJCQlicmVhazsKKworCQljYXNlIDM6CS8qIE1DQSBidXMgKi8KKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkgICAgICAgIk1DQSAlZDogU2xvdCAlZCBJL08gYXQgMHglMDRYIE1lbSAweCUwOFgiLCBwWzJdLAorCQkJICAgICAgIGRbM10sIGRbMV0gPDwgOCB8IGRbMF0sICoodTMyICopIChkICsgNCkpOworCQkJYnJlYWs7CisKKwkJY2FzZSA0OgkvKiBQQ0kgYnVzICovCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICJQQ0kgJWQ6IEJ1cyAlZCBEZXZpY2UgJWQgRnVuY3Rpb24gJWQiLCBwWzJdLAorCQkJICAgICAgIGRbMl0sIGRbMV0sIGRbMF0pOworCQkJYnJlYWs7CisKKwkJY2FzZSAweDgwOgkvKiBPdGhlciAqLworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fREVCVUcgIlVuc3VwcG9ydGVkIGJ1cyB0eXBlLiIpOworCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7CisJCXJvd3MgKz0gbGVuZ3RoOworCX0KK30KKworRVhQT1JUX1NZTUJPTChpMm9fZHVtcF9tZXNzYWdlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGV2aWNlLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOTA3ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2RldmljZS5jCkBAIC0wLDAgKzEsNjM0IEBACisvKgorICoJRnVuY3Rpb25zIHRvIGhhbmRsZSBJMk8gZGV2aWNlcworICoKKyAqCUNvcHlyaWdodCAoQykgMjAwNAlNYXJrdXMgTGlkZWwgPE1hcmt1cy5MaWRlbEBzaGFkb3djb25uZWN0LmNvbT4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICoJdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKglGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKglvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCUZpeGVzL2FkZGl0aW9uczoKKyAqCQlNYXJrdXMgTGlkZWwgPE1hcmt1cy5MaWRlbEBzaGFkb3djb25uZWN0LmNvbT4KKyAqCQkJaW5pdGlhbCB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisvKiBFeGVjIE9TTSBmdW5jdGlvbnMgKi8KK2V4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgaTJvX2J1c190eXBlOworCisvKioKKyAqCWkyb19kZXZpY2VfaXNzdWVfY2xhaW0gLSBjbGFpbSBvciByZWxlYXNlIGEgZGV2aWNlCisgKglAZGV2OiBJMk8gZGV2aWNlIHRvIGNsYWltIG9yIHJlbGVhc2UKKyAqCUBjbWQ6IGNsYWltIG9yIHJlbGVhc2UgY29tbWFuZAorICoJQHR5cGU6IHR5cGUgb2YgY2xhaW0KKyAqCisgKglJc3N1ZSBJMk8gVVRJTF9DTEFJTSBvciBVVElMX1JFTEVBU0UgbWVzc2FnZXMuIFRoZSBtZXNzYWdlIHRvIGJlIHNlbnQKKyAqCWlzIHNldCBieSBjbWQuIGRldiBpcyB0aGUgSTJPIGRldmljZSB3aGljaCBzaG91bGQgYmUgY2xhaW0gb3IKKyAqCXJlbGVhc2VkIGFuZCB0aGUgdHlwZSBpcyB0aGUgY2xhaW0gdHlwZSAoc2VlIHRoZSBJMk8gc3BlYykuCisgKgorICoJUmV0dXJzIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGkyb19kZXZpY2VfaXNzdWVfY2xhaW0oc3RydWN0IGkyb19kZXZpY2UgKmRldiwgdTMyIGNtZCwKKwkJCQkJIHUzMiB0eXBlKQoreworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdTMyIG07CisKKwltID0gaTJvX21zZ19nZXRfd2FpdChkZXYtPmlvcCwgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwl3cml0ZWwoRklWRV9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF8wLCAmbXNnLT51LmhlYWRbMF0pOworCXdyaXRlbChjbWQgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IGRldi0+bGN0X2RhdGEudGlkLCAmbXNnLT51LmhlYWRbMV0pOworCXdyaXRlbCh0eXBlLCAmbXNnLT5ib2R5WzBdKTsKKworCXJldHVybiBpMm9fbXNnX3Bvc3Rfd2FpdChkZXYtPmlvcCwgbSwgNjApOworfTsKKworLyoqCisgKiAJaTJvX2RldmljZV9jbGFpbSAtIGNsYWltIGEgZGV2aWNlIGZvciB1c2UgYnkgYW4gT1NNCisgKglAZGV2OiBJMk8gZGV2aWNlIHRvIGNsYWltCisgKglAZHJ2OiBJMk8gZHJpdmVyIHdoaWNoIHdhbnRzIHRvIGNsYWltIHRoZSBkZXZpY2UKKyAqCisgKglEbyB0aGUgbGVnIHdvcmsgdG8gYXNzaWduIGEgZGV2aWNlIHRvIGEgZ2l2ZW4gT1NNLiBJZiB0aGUgY2xhaW0gc3VjY2VlZAorICoJdGhlIG93bmVyIG9mIHRoZSByaW1hcnkuIElmIHRoZSBhdHRlbXB0IGZhaWxzIGEgbmVnYXRpdmUgZXJybm8gY29kZQorICoJaXMgcmV0dXJuZWQuIE9uIHN1Y2Nlc3MgemVybyBpcyByZXR1cm5lZC4KKyAqLworaW50IGkyb19kZXZpY2VfY2xhaW0oc3RydWN0IGkyb19kZXZpY2UgKmRldikKK3sKKwlpbnQgcmMgPSAwOworCisJZG93bigmZGV2LT5sb2NrKTsKKworCXJjID0gaTJvX2RldmljZV9pc3N1ZV9jbGFpbShkZXYsIEkyT19DTURfVVRJTF9DTEFJTSwgSTJPX0NMQUlNX1BSSU1BUlkpOworCWlmICghcmMpCisJCXByX2RlYnVnKCJpMm86IGNsYWltIG9mIGRldmljZSAlZCBzdWNjZWRlZFxuIiwKKwkJCSBkZXYtPmxjdF9kYXRhLnRpZCk7CisJZWxzZQorCQlwcl9kZWJ1ZygiaTJvOiBjbGFpbSBvZiBkZXZpY2UgJWQgZmFpbGVkICVkXG4iLAorCQkJIGRldi0+bGN0X2RhdGEudGlkLCByYyk7CisKKwl1cCgmZGV2LT5sb2NrKTsKKworCXJldHVybiByYzsKK307CisKKy8qKgorICoJaTJvX2RldmljZV9jbGFpbV9yZWxlYXNlIC0gcmVsZWFzZSBhIGRldmljZSB0aGF0IHRoZSBPU00gaXMgdXNpbmcKKyAqCUBkZXY6IGRldmljZSB0byByZWxlYXNlCisgKglAZHJ2OiBkcml2ZXIgd2hpY2ggY2xhaW1lZCB0aGUgZGV2aWNlCisgKgorICoJRHJvcCBhIGNsYWltIGJ5IGFuIE9TTSBvbiBhIGdpdmVuIEkyTyBkZXZpY2UuCisgKgorICoJQUMgLSBzb21lIGRldmljZXMgc2VlbSB0byB3YW50IHRvIHJlZnVzZSBhbiB1bmNsYWltIHVudGlsIHRoZXkgaGF2ZQorICoJZmluaXNoZWQgaW50ZXJuYWwgcHJvY2Vzc2luZy4gSXQgbWFrZXMgc2Vuc2Ugc2luY2UgeW91IGRvbid0IHdhbnQgYQorICoJbmV3IGRldmljZSB0byBnbyByZWNvbmZpZ3VyaW5nIHRoZSBlbnRpcmUgc3lzdGVtIHVudGlsIHlvdSBhcmUgZG9uZS4KKyAqCVRodXMgd2UgYXJlIHByZXBhcmVkIHRvIHdhaXQgYnJpZWZseS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBpMm9fZGV2aWNlX2NsYWltX3JlbGVhc2Uoc3RydWN0IGkyb19kZXZpY2UgKmRldikKK3sKKwlpbnQgdHJpZXM7CisJaW50IHJjID0gMDsKKworCWRvd24oJmRldi0+bG9jayk7CisKKwkvKgorCSAqICAgICAgSWYgdGhlIGNvbnRyb2xsZXIgdGFrZXMgYSBub25ibG9ja2luZyBhcHByb2FjaCB0bworCSAqICAgICAgcmVsZWFzZXMgd2UgaGF2ZSB0byBzbGVlcC9wb2xsIGZvciBhIGZldyB0aW1lcy4KKwkgKi8KKwlmb3IgKHRyaWVzID0gMDsgdHJpZXMgPCAxMDsgdHJpZXMrKykgeworCQlyYyA9IGkyb19kZXZpY2VfaXNzdWVfY2xhaW0oZGV2LCBJMk9fQ01EX1VUSUxfUkVMRUFTRSwKKwkJCQkJICAgIEkyT19DTEFJTV9QUklNQVJZKTsKKwkJaWYgKCFyYykKKwkJCWJyZWFrOworCisJCXNzbGVlcCgxKTsKKwl9CisKKwlpZiAoIXJjKQorCQlwcl9kZWJ1ZygiaTJvOiBjbGFpbSByZWxlYXNlIG9mIGRldmljZSAlZCBzdWNjZWRlZFxuIiwKKwkJCSBkZXYtPmxjdF9kYXRhLnRpZCk7CisJZWxzZQorCQlwcl9kZWJ1ZygiaTJvOiBjbGFpbSByZWxlYXNlIG9mIGRldmljZSAlZCBmYWlsZWQgJWRcbiIsCisJCQkgZGV2LT5sY3RfZGF0YS50aWQsIHJjKTsKKworCXVwKCZkZXYtPmxvY2spOworCisJcmV0dXJuIHJjOworfTsKKworLyoqCisgKglpMm9fZGV2aWNlX3JlbGVhc2UgLSByZWxlYXNlIHRoZSBtZW1vcnkgZm9yIGEgSTJPIGRldmljZQorICoJQGRldjogSTJPIGRldmljZSB3aGljaCBzaG91bGQgYmUgcmVsZWFzZWQKKyAqCisgKglSZWxlYXNlIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpZiByZWZjb3VudCBvZgorICoJZGV2aWNlIHJlYWNoZXMgMCBhdXRvbWF0aWNhbGx5LgorICovCitzdGF0aWMgdm9pZCBpMm9fZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2ID0gdG9faTJvX2RldmljZShkZXYpOworCisJcHJfZGVidWcoImkybzogZGV2aWNlICVzIHJlbGVhc2VkXG4iLCBkZXYtPmJ1c19pZCk7CisKKwlrZnJlZShpMm9fZGV2KTsKK307CisKKy8qKgorICoJaTJvX2RldmljZV9jbGFzc19yZWxlYXNlIC0gUmVtb3ZlIEkyTyBkZXZpY2UgYXR0cmlidXRlcworICoJQGNkOiBJMk8gY2xhc3MgZGV2aWNlIHdoaWNoIGlzIGFkZGVkIHRvIHRoZSBJMk8gZGV2aWNlIGNsYXNzCisgKgorICoJUmVtb3ZlcyBhdHRyaWJ1dGVzIGZyb20gdGhlIEkyTyBkZXZpY2UgYWdhaW4uIEFsc28gc2VhcmNoIGVhY2ggZGV2aWNlCisgKglvbiB0aGUgY29udHJvbGxlciBmb3IgSTJPIGRldmljZXMgd2hpY2ggcmVmZXJ0IHRvIHRoaXMgZGV2aWNlIGFzIHBhcmVudAorICoJb3IgdXNlciBhbmQgcmVtb3ZlIHRoaXMgbGlua3MgYWxzby4KKyAqLworc3RhdGljIHZvaWQgaTJvX2RldmljZV9jbGFzc19yZWxlYXNlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkKQoreworCXN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2LCAqdG1wOworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKKworCWkyb19kZXYgPSB0b19pMm9fZGV2aWNlKGNkLT5kZXYpOworCWMgPSBpMm9fZGV2LT5pb3A7CisKKwlzeXNmc19yZW1vdmVfbGluaygmaTJvX2Rldi0+ZGV2aWNlLmtvYmosICJwYXJlbnQiKTsKKwlzeXNmc19yZW1vdmVfbGluaygmaTJvX2Rldi0+ZGV2aWNlLmtvYmosICJ1c2VyIik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJmMtPmRldmljZXMsIGxpc3QpIHsKKwkJaWYgKHRtcC0+bGN0X2RhdGEucGFyZW50X3RpZCA9PSBpMm9fZGV2LT5sY3RfZGF0YS50aWQpCisJCQlzeXNmc19yZW1vdmVfbGluaygmdG1wLT5kZXZpY2Uua29iaiwgInBhcmVudCIpOworCQlpZiAodG1wLT5sY3RfZGF0YS51c2VyX3RpZCA9PSBpMm9fZGV2LT5sY3RfZGF0YS50aWQpCisJCQlzeXNmc19yZW1vdmVfbGluaygmdG1wLT5kZXZpY2Uua29iaiwgInVzZXIiKTsKKwl9Cit9OworCisvKiBJMk8gZGV2aWNlIGNsYXNzICovCitzdGF0aWMgc3RydWN0IGNsYXNzIGkyb19kZXZpY2VfY2xhc3MgPSB7CisJLm5hbWUgPSAiaTJvX2RldmljZSIsCisJLnJlbGVhc2UgPSBpMm9fZGV2aWNlX2NsYXNzX3JlbGVhc2UKK307CisKKy8qKgorICoJaTJvX2RldmljZV9hbGxvYyAtIEFsbG9jYXRlIGEgSTJPIGRldmljZSBhbmQgaW5pdGlhbGl6ZSBpdAorICoKKyAqCUFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIGEgSTJPIGRldmljZSBhbmQgaW5pdGlhbGl6ZSBsb2NrcyBhbmQgbGlzdHMKKyAqCisgKglSZXR1cm5zIHRoZSBhbGxvY2F0ZWQgSTJPIGRldmljZSBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaWYgdGhlIGRldmljZQorICoJY291bGQgbm90IGJlIGFsbG9jYXRlZC4KKyAqLworc3RhdGljIHN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2aWNlX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmRldjsKKworCWRldiA9IGttYWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwltZW1zZXQoZGV2LCAwLCBzaXplb2YoKmRldikpOworCisJSU5JVF9MSVNUX0hFQUQoJmRldi0+bGlzdCk7CisJaW5pdF9NVVRFWCgmZGV2LT5sb2NrKTsKKworCWRldi0+ZGV2aWNlLmJ1cyA9ICZpMm9fYnVzX3R5cGU7CisJZGV2LT5kZXZpY2UucmVsZWFzZSA9ICZpMm9fZGV2aWNlX3JlbGVhc2U7CisJZGV2LT5jbGFzc2Rldi5jbGFzcyA9ICZpMm9fZGV2aWNlX2NsYXNzOworCWRldi0+Y2xhc3NkZXYuZGV2ID0gJmRldi0+ZGV2aWNlOworCisJcmV0dXJuIGRldjsKK307CisKKy8qKgorICoJaTJvX2RldmljZV9hZGQgLSBhbGxvY2F0ZSBhIG5ldyBJMk8gZGV2aWNlIGFuZCBhZGQgaXQgdG8gdGhlIElPUAorICoJQGlvcDogSTJPIGNvbnRyb2xsZXIgd2hlcmUgdGhlIGRldmljZSBpcyBvbgorICoJQGVudHJ5OiBMQ1QgZW50cnkgb2YgdGhlIEkyTyBkZXZpY2UKKyAqCisgKglBbGxvY2F0ZSBhIG5ldyBJMk8gZGV2aWNlIGFuZCBpbml0aWFsaXplIGl0IHdpdGggdGhlIExDVCBlbnRyeS4gVGhlCisgKglkZXZpY2UgaXMgYXBwZW5kZWQgdG8gdGhlIGRldmljZSBsaXN0IG9mIHRoZSBjb250cm9sbGVyLgorICoKKyAqCVJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBJMk8gZGV2aWNlIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZQorICoJb24gZmFpbHVyZS4KKyAqLworc3RhdGljIHN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2aWNlX2FkZChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsCisJCQkJCSBpMm9fbGN0X2VudHJ5ICogZW50cnkpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmRldjsKKworCWRldiA9IGkyb19kZXZpY2VfYWxsb2MoKTsKKwlpZiAoSVNfRVJSKGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpMm86IHVuYWJsZSB0byBhbGxvY2F0ZSBpMm8gZGV2aWNlXG4iKTsKKwkJcmV0dXJuIGRldjsKKwl9CisKKwlkZXYtPmxjdF9kYXRhID0gKmVudHJ5OworCisJc25wcmludGYoZGV2LT5kZXZpY2UuYnVzX2lkLCBCVVNfSURfU0laRSwgIiVkOiUwM3giLCBjLT51bml0LAorCQkgZGV2LT5sY3RfZGF0YS50aWQpOworCisJc25wcmludGYoZGV2LT5jbGFzc2Rldi5jbGFzc19pZCwgQlVTX0lEX1NJWkUsICIlZDolMDN4IiwgYy0+dW5pdCwKKwkJIGRldi0+bGN0X2RhdGEudGlkKTsKKworCWRldi0+aW9wID0gYzsKKwlkZXYtPmRldmljZS5wYXJlbnQgPSAmYy0+ZGV2aWNlOworCisJZGV2aWNlX3JlZ2lzdGVyKCZkZXYtPmRldmljZSk7CisKKwlsaXN0X2FkZF90YWlsKCZkZXYtPmxpc3QsICZjLT5kZXZpY2VzKTsKKworCWNsYXNzX2RldmljZV9yZWdpc3RlcigmZGV2LT5jbGFzc2Rldik7CisKKwlpMm9fZHJpdmVyX25vdGlmeV9kZXZpY2VfYWRkX2FsbChkZXYpOworCisJcHJfZGVidWcoImkybzogZGV2aWNlICVzIGFkZGVkXG4iLCBkZXYtPmRldmljZS5idXNfaWQpOworCisJcmV0dXJuIGRldjsKK307CisKKy8qKgorICoJaTJvX2RldmljZV9yZW1vdmUgLSByZW1vdmUgYW4gSTJPIGRldmljZSBmcm9tIHRoZSBJMk8gY29yZQorICoJQGRldjogSTJPIGRldmljZSB3aGljaCBzaG91bGQgYmUgcmVsZWFzZWQKKyAqCisgKglJcyB1c2VkIG9uIEkyTyBjb250cm9sbGVyIHJlbW92YWwgb3IgTENUIG1vZGlmaWNhdGlvbiwgd2hlbiB0aGUgZGV2aWNlCisgKglpcyByZW1vdmVkIGZyb20gdGhlIHN5c3RlbS4gTm90ZSB0aGF0IHRoZSBkZXZpY2UgY291bGQgc3RpbGwgaGFuZworICoJYXJvdW5kIHVudGlsIHRoZSByZWZjb3VudCByZWFjaGVzIDAuCisgKi8KK3ZvaWQgaTJvX2RldmljZV9yZW1vdmUoc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXYpCit7CisJaTJvX2RyaXZlcl9ub3RpZnlfZGV2aWNlX3JlbW92ZV9hbGwoaTJvX2Rldik7CisJY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoJmkyb19kZXYtPmNsYXNzZGV2KTsKKwlsaXN0X2RlbCgmaTJvX2Rldi0+bGlzdCk7CisJZGV2aWNlX3VucmVnaXN0ZXIoJmkyb19kZXYtPmRldmljZSk7Cit9OworCisvKioKKyAqCWkyb19kZXZpY2VfcGFyc2VfbGN0IC0gUGFyc2UgYSBwcmV2aW91c2x5IGZldGNoZWQgTENUIGFuZCBjcmVhdGUgZGV2aWNlcworICoJQGM6IEkyTyBjb250cm9sbGVyIGZyb20gd2hpY2ggdGhlIExDVCBzaG91bGQgYmUgcGFyc2VkLgorICoKKyAqCVRoZSBMb2dpY2FsIENvbmZpZ3VyYXRpb24gVGFibGUgdGVsbHMgdXMgd2hhdCB3ZSBjYW4gdGFsayB0byBvbiB0aGUKKyAqCWJvYXJkLiBGb3IgZXZlcnkgZW50cnkgd2UgY3JlYXRlIGFuIEkyTyBkZXZpY2UsIHdoaWNoIGlzIHJlZ2lzdGVyZWQgaW4KKyAqCXRoZSBJMk8gY29yZS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBpMm9fZGV2aWNlX3BhcnNlX2xjdChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmRldiwgKnRtcDsKKwlpMm9fbGN0ICpsY3Q7CisJaW50IGk7CisJaW50IG1heDsKKworCWRvd24oJmMtPmxjdF9sb2NrKTsKKworCWlmIChjLT5sY3QpCisJCWtmcmVlKGMtPmxjdCk7CisKKwlsY3QgPSBjLT5kbGN0LnZpcnQ7CisKKwljLT5sY3QgPSBrbWFsbG9jKGxjdC0+dGFibGVfc2l6ZSAqIDQsIEdGUF9LRVJORUwpOworCWlmICghYy0+bGN0KSB7CisJCXVwKCZjLT5sY3RfbG9jayk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChsY3QtPnRhYmxlX3NpemUgKiA0ID4gYy0+ZGxjdC5sZW4pIHsKKwkJbWVtY3B5X2Zyb21pbyhjLT5sY3QsIGMtPmRsY3QudmlydCwgYy0+ZGxjdC5sZW4pOworCQl1cCgmYy0+bGN0X2xvY2spOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwltZW1jcHlfZnJvbWlvKGMtPmxjdCwgYy0+ZGxjdC52aXJ0LCBsY3QtPnRhYmxlX3NpemUgKiA0KTsKKworCWxjdCA9IGMtPmxjdDsKKworCW1heCA9IChsY3QtPnRhYmxlX3NpemUgLSAzKSAvIDk7CisKKwlwcl9kZWJ1ZygiJXM6IExDVCBoYXMgJWQgZW50cmllcyAoTENUIHNpemU6ICVkKVxuIiwgYy0+bmFtZSwgbWF4LAorCQkgbGN0LT50YWJsZV9zaXplKTsKKworCS8qIHJlbW92ZSBkZXZpY2VzLCB3aGljaCBhcmUgbm90IGluIHRoZSBMQ1QgYW55bW9yZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXYsIHRtcCwgJmMtPmRldmljZXMsIGxpc3QpIHsKKwkJaW50IGZvdW5kID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJCWlmIChsY3QtPmxjdF9lbnRyeVtpXS50aWQgPT0gZGV2LT5sY3RfZGF0YS50aWQpIHsKKwkJCQlmb3VuZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIWZvdW5kKQorCQkJaTJvX2RldmljZV9yZW1vdmUoZGV2KTsKKwl9CisKKwkvKiBhZGQgbmV3IGRldmljZXMsIHdoaWNoIGFyZSBuZXcgaW4gdGhlIExDVCAqLworCWZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQlpbnQgZm91bmQgPSAwOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXYsIHRtcCwgJmMtPmRldmljZXMsIGxpc3QpIHsKKwkJCWlmIChsY3QtPmxjdF9lbnRyeVtpXS50aWQgPT0gZGV2LT5sY3RfZGF0YS50aWQpIHsKKwkJCQlmb3VuZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIWZvdW5kKQorCQkJaTJvX2RldmljZV9hZGQoYywgJmxjdC0+bGN0X2VudHJ5W2ldKTsKKwl9CisJdXAoJmMtPmxjdF9sb2NrKTsKKworCXJldHVybiAwOworfTsKKworLyoqCisgKglpMm9fZGV2aWNlX2NsYXNzX3Nob3dfY2xhc3NfaWQgLSBEaXNwbGF5cyBjbGFzcyBpZCBvZiBJMk8gZGV2aWNlCisgKglAY2Q6IGNsYXNzIGRldmljZSBvZiB3aGljaCB0aGUgY2xhc3MgaWQgc2hvdWxkIGJlIGRpc3BsYXllZAorICoJQGJ1ZjogYnVmZmVyIGludG8gd2hpY2ggdGhlIGNsYXNzIGlkIHNob3VsZCBiZSBwcmludGVkCisgKgorICoJUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGFyZSBwcmludGVkIGludG8gdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljIHNzaXplX3QgaTJvX2RldmljZV9jbGFzc19zaG93X2NsYXNzX2lkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLAorCQkJCQkgICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmRldiA9IHRvX2kyb19kZXZpY2UoY2QtPmRldik7CisKKwlzcHJpbnRmKGJ1ZiwgIiUwM3hcbiIsIGRldi0+bGN0X2RhdGEuY2xhc3NfaWQpOworCXJldHVybiBzdHJsZW4oYnVmKSArIDE7Cit9OworCisvKioKKyAqCWkyb19kZXZpY2VfY2xhc3Nfc2hvd190aWQgLSBEaXNwbGF5cyBUSUQgb2YgSTJPIGRldmljZQorICoJQGNkOiBjbGFzcyBkZXZpY2Ugb2Ygd2hpY2ggdGhlIFRJRCBzaG91bGQgYmUgZGlzcGxheWVkCisgKglAYnVmOiBidWZmZXIgaW50byB3aGljaCB0aGUgY2xhc3MgaWQgc2hvdWxkIGJlIHByaW50ZWQKKyAqCisgKglSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggYXJlIHByaW50ZWQgaW50byB0aGUgYnVmZmVyLgorICovCitzdGF0aWMgc3NpemVfdCBpMm9fZGV2aWNlX2NsYXNzX3Nob3dfdGlkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmRldiA9IHRvX2kyb19kZXZpY2UoY2QtPmRldik7CisKKwlzcHJpbnRmKGJ1ZiwgIiUwM3hcbiIsIGRldi0+bGN0X2RhdGEudGlkKTsKKwlyZXR1cm4gc3RybGVuKGJ1ZikgKyAxOworfTsKKworLyogSTJPIGRldmljZSBjbGFzcyBhdHRyaWJ1dGVzICovCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoY2xhc3NfaWQsIFNfSVJVR08sIGkyb19kZXZpY2VfY2xhc3Nfc2hvd19jbGFzc19pZCwKKwkJCSBOVUxMKTsKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUih0aWQsIFNfSVJVR08sIGkyb19kZXZpY2VfY2xhc3Nfc2hvd190aWQsIE5VTEwpOworCisvKioKKyAqCWkyb19kZXZpY2VfY2xhc3NfYWRkIC0gQWRkcyBhdHRyaWJ1dGVzIHRvIHRoZSBJMk8gZGV2aWNlCisgKglAY2Q6IEkyTyBjbGFzcyBkZXZpY2Ugd2hpY2ggaXMgYWRkZWQgdG8gdGhlIEkyTyBkZXZpY2UgY2xhc3MKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGdldCBjYWxsZWQgd2hlbiBhIEkyTyBkZXZpY2UgaXMgYWRkZWQgdG8gdGhlIGNsYXNzLiBJdAorICoJY3JlYXRlcyB0aGUgYXR0cmlidXRlcyBmb3IgZWFjaCBkZXZpY2UgYW5kIGNyZWF0ZXMgdXNlci9wYXJlbnQgc3ltbGluaworICoJaWYgbmVjZXNzYXJ5LgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpMm9fZGV2aWNlX2NsYXNzX2FkZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCkKK3sKKwlzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldiwgKnRtcDsKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmM7CisKKwlpMm9fZGV2ID0gdG9faTJvX2RldmljZShjZC0+ZGV2KTsKKwljID0gaTJvX2Rldi0+aW9wOworCisJY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGNkLCAmY2xhc3NfZGV2aWNlX2F0dHJfY2xhc3NfaWQpOworCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjZCwgJmNsYXNzX2RldmljZV9hdHRyX3RpZCk7CisKKwkvKiBjcmVhdGUgdXNlciBlbnRyaWVzIGZvciB0aGlzIGRldmljZSAqLworCXRtcCA9IGkyb19pb3BfZmluZF9kZXZpY2UoaTJvX2Rldi0+aW9wLCBpMm9fZGV2LT5sY3RfZGF0YS51c2VyX3RpZCk7CisJaWYgKHRtcCkKKwkJc3lzZnNfY3JlYXRlX2xpbmsoJmkyb19kZXYtPmRldmljZS5rb2JqLCAmdG1wLT5kZXZpY2Uua29iaiwKKwkJCQkgICJ1c2VyIik7CisKKwkvKiBjcmVhdGUgdXNlciBlbnRyaWVzIHJlZmVyaW5nIHRvIHRoaXMgZGV2aWNlICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZjLT5kZXZpY2VzLCBsaXN0KQorCSAgICBpZiAodG1wLT5sY3RfZGF0YS51c2VyX3RpZCA9PSBpMm9fZGV2LT5sY3RfZGF0YS50aWQpCisJCXN5c2ZzX2NyZWF0ZV9saW5rKCZ0bXAtPmRldmljZS5rb2JqLAorCQkJCSAgJmkyb19kZXYtPmRldmljZS5rb2JqLCAidXNlciIpOworCisJLyogY3JlYXRlIHBhcmVudCBlbnRyaWVzIGZvciB0aGlzIGRldmljZSAqLworCXRtcCA9IGkyb19pb3BfZmluZF9kZXZpY2UoaTJvX2Rldi0+aW9wLCBpMm9fZGV2LT5sY3RfZGF0YS5wYXJlbnRfdGlkKTsKKwlpZiAodG1wKQorCQlzeXNmc19jcmVhdGVfbGluaygmaTJvX2Rldi0+ZGV2aWNlLmtvYmosICZ0bXAtPmRldmljZS5rb2JqLAorCQkJCSAgInBhcmVudCIpOworCisJLyogY3JlYXRlIHBhcmVudCBlbnRyaWVzIHJlZmVyaW5nIHRvIHRoaXMgZGV2aWNlICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZjLT5kZXZpY2VzLCBsaXN0KQorCSAgICBpZiAodG1wLT5sY3RfZGF0YS5wYXJlbnRfdGlkID09IGkyb19kZXYtPmxjdF9kYXRhLnRpZCkKKwkJc3lzZnNfY3JlYXRlX2xpbmsoJnRtcC0+ZGV2aWNlLmtvYmosCisJCQkJICAmaTJvX2Rldi0+ZGV2aWNlLmtvYmosICJwYXJlbnQiKTsKKworCXJldHVybiAwOworfTsKKworLyogSTJPIGRldmljZSBjbGFzcyBpbnRlcmZhY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlIGkyb19kZXZpY2VfY2xhc3NfaW50ZXJmYWNlID0geworCS5jbGFzcyA9ICZpMm9fZGV2aWNlX2NsYXNzLAorCS5hZGQgPSBpMm9fZGV2aWNlX2NsYXNzX2FkZAorfTsKKworLyoKKyAqCVJ1biB0aW1lIHN1cHBvcnQgcm91dGluZXMKKyAqLworCisvKglJc3N1ZSBVVElMX1BBUkFNU19HRVQgb3IgVVRJTF9QQVJBTVNfU0VUCisgKgorICoJVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBmb3IgYWxsIFV0aWxQYXJhbXNHZXQvU2V0IG9wZXJhdGlvbnMuCisgKglUaGUgT3BlcmF0aW9uTGlzdCBpcyBnaXZlbiBpbiBvcGxpc3QtYnVmZmVyLAorICoJYW5kIHJlc3VsdHMgYXJlIHJldHVybmVkIGluIHJlc2xpc3QtYnVmZmVyLgorICoJTm90ZSB0aGF0IHRoZSBtaW5pbXVtIHNpemVkIHJlc2xpc3QgaXMgOCBieXRlcyBhbmQgY29udGFpbnMKKyAqCVJlc3VsdENvdW50LCBFcnJvckluZm9TaXplLCBCbG9ja1N0YXR1cyBhbmQgQmxvY2tTaXplLgorICovCisKK2ludCBpMm9fcGFybV9pc3N1ZShzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldiwgaW50IGNtZCwgdm9pZCAqb3BsaXN0LAorCQkgICBpbnQgb3BsZW4sIHZvaWQgKnJlc2xpc3QsIGludCByZXNsZW4pCit7CisJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZzsKKwl1MzIgbTsKKwl1MzIgKnJlczMyID0gKHUzMiAqKSByZXNsaXN0OworCXUzMiAqcmVzdG1wID0gKHUzMiAqKSByZXNsaXN0OworCWludCBsZW4gPSAwOworCWludCBpID0gMDsKKwlpbnQgcmM7CisJc3RydWN0IGkyb19kbWEgcmVzOworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYyA9IGkyb19kZXYtPmlvcDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYy0+cGRldi0+ZGV2OworCisJcmVzLnZpcnQgPSBOVUxMOworCisJaWYgKGkyb19kbWFfYWxsb2MoZGV2LCAmcmVzLCByZXNsZW4sIEdGUF9LRVJORUwpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpIHsKKwkJaTJvX2RtYV9mcmVlKGRldiwgJnJlcyk7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCWkgPSAwOworCXdyaXRlbChjbWQgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IGkyb19kZXYtPmxjdF9kYXRhLnRpZCwKKwkgICAgICAgJm1zZy0+dS5oZWFkWzFdKTsKKwl3cml0ZWwoMCwgJm1zZy0+Ym9keVtpKytdKTsKKwl3cml0ZWwoMHg0QzAwMDAwMCB8IG9wbGVuLCAmbXNnLT5ib2R5W2krK10pOwkvKiBPcGVyYXRpb25MaXN0ICovCisJbWVtY3B5X3RvaW8oJm1zZy0+Ym9keVtpXSwgb3BsaXN0LCBvcGxlbik7CisJaSArPSAob3BsZW4gLyA0ICsgKG9wbGVuICUgNCA/IDEgOiAwKSk7CisJd3JpdGVsKDB4RDAwMDAwMDAgfCByZXMubGVuLCAmbXNnLT5ib2R5W2krK10pOwkvKiBSZXN1bHRMaXN0ICovCisJd3JpdGVsKHJlcy5waHlzLCAmbXNnLT5ib2R5W2krK10pOworCisJd3JpdGVsKEkyT19NRVNTQUdFX1NJWkUoaSArIHNpemVvZihzdHJ1Y3QgaTJvX21lc3NhZ2UpIC8gNCkgfAorCSAgICAgICBTR0xfT0ZGU0VUXzUsICZtc2ctPnUuaGVhZFswXSk7CisKKwlyYyA9IGkyb19tc2dfcG9zdF93YWl0X21lbShjLCBtLCAxMCwgJnJlcyk7CisKKwkvKiBUaGlzIG9ubHkgbG9va3MgbGlrZSBhIG1lbW9yeSBsZWFrIC0gZG9uJ3QgImZpeCIgaXQuICovCisJaWYgKHJjID09IC1FVElNRURPVVQpCisJCXJldHVybiByYzsKKworCW1lbWNweV9mcm9taW8ocmVzbGlzdCwgcmVzLnZpcnQsIHJlcy5sZW4pOworCWkyb19kbWFfZnJlZShkZXYsICZyZXMpOworCisJLyogUXVlcnkgZmFpbGVkICovCisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJLyoKKwkgKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGJ5dGVzIG9mIFJlc3VsdCBMSVNUCisJICogV2UgbmVlZCB0byBsb29wIHRocm91Z2ggZWFjaCBSZXN1bHQgQkxPQ0sgYW5kIGdyYWIgdGhlIGxlbmd0aAorCSAqLworCXJlc3RtcCA9IHJlczMyICsgMTsKKwlsZW4gPSAxOworCWZvciAoaSA9IDA7IGkgPCAocmVzMzJbMF0gJiAwWDAwMDBGRkZGKTsgaSsrKSB7CisJCWlmIChyZXN0bXBbMF0gJiAweDAwRkYwMDAwKSB7CS8qIEJsb2NrU3RhdHVzICE9IFNVQ0NFU1MgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXMgLSBFcnJvcjpcbiAgRXJyb3JJbmZvU2l6ZSA9IDB4JTAyeCwgIgorCQkJICAgICAgICJCbG9ja1N0YXR1cyA9IDB4JTAyeCwgQmxvY2tTaXplID0gMHglMDR4XG4iLAorCQkJICAgICAgIChjbWQgPT0KKwkJCQlJMk9fQ01EX1VUSUxfUEFSQU1TX1NFVCkgPyAiUEFSQU1TX1NFVCIgOgorCQkJICAgICAgICJQQVJBTVNfR0VUIiwgcmVzMzJbMV0gPj4gMjQsCisJCQkgICAgICAgKHJlczMyWzFdID4+IDE2KSAmIDB4RkYsIHJlczMyWzFdICYgMHhGRkZGKTsKKworCQkJLyoKKwkJCSAqICAgICAgSWYgdGhpcyBpcyB0aGUgb25seSByZXF1ZXN0LHRoYW4gd2UgcmV0dXJuIGFuIGVycm9yCisJCQkgKi8KKwkJCWlmICgocmVzMzJbMF0gJiAweDAwMDBGRkZGKSA9PSAxKSB7CisJCQkJcmV0dXJuIC0oKHJlczMyWzFdID4+IDE2KSAmIDB4RkYpOwkvKiAtQmxvY2tTdGF0dXMgKi8KKwkJCX0KKwkJfQorCQlsZW4gKz0gcmVzdG1wWzBdICYgMHgwMDAwRkZGRjsJLyogTGVuZ3RoIG9mIHJlcyBCTE9DSyAqLworCQlyZXN0bXAgKz0gcmVzdG1wWzBdICYgMHgwMDAwRkZGRjsJLyogU2tpcCB0byBuZXh0IEJMT0NLICovCisJfQorCXJldHVybiAobGVuIDw8IDIpOwkvKiBieXRlcyB1c2VkIGJ5IHJlc3VsdCBsaXN0ICovCit9CisKKy8qCisgKgkgUXVlcnkgb25lIGZpZWxkIGdyb3VwIHZhbHVlIG9yIGEgd2hvbGUgc2NhbGFyIGdyb3VwLgorICovCitpbnQgaTJvX3Bhcm1fZmllbGRfZ2V0KHN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2LCBpbnQgZ3JvdXAsIGludCBmaWVsZCwKKwkJICAgICAgIHZvaWQgKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwl1MTYgb3BibGtbXSA9IHsgMSwgMCwgSTJPX1BBUkFNU19GSUVMRF9HRVQsIGdyb3VwLCAxLCBmaWVsZCB9OworCXU4IHJlc2Jsa1s4ICsgYnVmbGVuXTsJLyogOCBieXRlcyBmb3IgaGVhZGVyICovCisJaW50IHNpemU7CisKKwlpZiAoZmllbGQgPT0gLTEpCS8qIHdob2xlIGdyb3VwICovCisJCW9wYmxrWzRdID0gLTE7CisKKwlzaXplID0gaTJvX3Bhcm1faXNzdWUoaTJvX2RldiwgSTJPX0NNRF9VVElMX1BBUkFNU19HRVQsIG9wYmxrLAorCQkJICAgICAgc2l6ZW9mKG9wYmxrKSwgcmVzYmxrLCBzaXplb2YocmVzYmxrKSk7CisKKwltZW1jcHkoYnVmLCByZXNibGsgKyA4LCBidWZsZW4pOwkvKiBjdXQgb2ZmIGhlYWRlciAqLworCisJaWYgKHNpemUgPiBidWZsZW4pCisJCXJldHVybiBidWZsZW47CisKKwlyZXR1cm4gc2l6ZTsKK30KKworLyoKKyAqIAlpZiBvcGVyID09IEkyT19QQVJBTVNfVEFCTEVfR0VULCBnZXQgZnJvbSBhbGwgcm93cworICogCQlpZiBmaWVsZGNvdW50ID09IC0xIHJldHVybiBhbGwgZmllbGRzCisgKgkJCWlidWYgYW5kIGlidWZsZW4gYXJlIHVudXNlZCAodXNlIE5VTEwsIDApCisgKiAJCWVsc2UgcmV0dXJuIHNwZWNpZmljIGZpZWxkcworICogIAkJCWlidWYgY29udGFpbnMgZmllbGRpbmRleGVzCisgKgorICogCWlmIG9wZXIgPT0gSTJPX1BBUkFNU19MSVNUX0dFVCwgZ2V0IGZyb20gc3BlY2lmaWMgcm93cworICogCQlpZiBmaWVsZGNvdW50ID09IC0xIHJldHVybiBhbGwgZmllbGRzCisgKgkJCWlidWYgY29udGFpbnMgcm93Y291bnQsIGtleXZhbHVlcworICogCQllbHNlIHJldHVybiBzcGVjaWZpYyBmaWVsZHMKKyAqCQkJZmllbGRjb3VudCBpcyAjIG9mIGZpZWxkaW5kZXhlcworICogIAkJCWlidWYgY29udGFpbnMgZmllbGRpbmRleGVzLCByb3djb3VudCwga2V5dmFsdWVzCisgKgorICoJWW91IGNvdWxkIGFsc28gdXNlIGRpcmVjdGx5IGZ1bmN0aW9uIGkyb19pc3N1ZV9wYXJhbXMoKS4KKyAqLworaW50IGkyb19wYXJtX3RhYmxlX2dldChzdHJ1Y3QgaTJvX2RldmljZSAqZGV2LCBpbnQgb3BlciwgaW50IGdyb3VwLAorCQkgICAgICAgaW50IGZpZWxkY291bnQsIHZvaWQgKmlidWYsIGludCBpYnVmbGVuLCB2b2lkICpyZXNibGssCisJCSAgICAgICBpbnQgcmVzbGVuKQoreworCXUxNiAqb3BibGs7CisJaW50IHNpemU7CisKKwlzaXplID0gMTAgKyBpYnVmbGVuOworCWlmIChzaXplICUgNCkKKwkJc2l6ZSArPSA0IC0gc2l6ZSAlIDQ7CisKKwlvcGJsayA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKG9wYmxrID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpMm86IG5vIG1lbW9yeSBmb3IgcXVlcnkgYnVmZmVyLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW9wYmxrWzBdID0gMTsJCS8qIG9wZXJhdGlvbiBjb3VudCAqLworCW9wYmxrWzFdID0gMDsJCS8qIHBhZCAqLworCW9wYmxrWzJdID0gb3BlcjsKKwlvcGJsa1szXSA9IGdyb3VwOworCW9wYmxrWzRdID0gZmllbGRjb3VudDsKKwltZW1jcHkob3BibGsgKyA1LCBpYnVmLCBpYnVmbGVuKTsJLyogb3RoZXIgcGFyYW1zICovCisKKwlzaXplID0gaTJvX3Bhcm1faXNzdWUoZGV2LCBJMk9fQ01EX1VUSUxfUEFSQU1TX0dFVCwgb3BibGssCisJCQkgICAgICBzaXplLCByZXNibGssIHJlc2xlbik7CisKKwlrZnJlZShvcGJsayk7CisJaWYgKHNpemUgPiByZXNsZW4pCisJCXJldHVybiByZXNsZW47CisKKwlyZXR1cm4gc2l6ZTsKK30KKworLyoqCisgKglpMm9fZGV2aWNlX2luaXQgLSBJbml0aWFsaXplIEkyTyBkZXZpY2VzCisgKgorICoJUmVnaXN0ZXJzIHRoZSBJMk8gZGV2aWNlIGNsYXNzLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IGkyb19kZXZpY2VfaW5pdCh2b2lkKQoreworCWludCByYzsKKworCXJjID0gY2xhc3NfcmVnaXN0ZXIoJmkyb19kZXZpY2VfY2xhc3MpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIGNsYXNzX2ludGVyZmFjZV9yZWdpc3RlcigmaTJvX2RldmljZV9jbGFzc19pbnRlcmZhY2UpOworfTsKKworLyoqCisgKglpMm9fZGV2aWNlX2V4aXQgLSBJMk8gZGV2aWNlcyBleGl0IGZ1bmN0aW9uCisgKgorICoJVW5yZWdpc3RlcnMgdGhlIEkyTyBkZXZpY2UgY2xhc3MuCisgKi8KK3ZvaWQgaTJvX2RldmljZV9leGl0KHZvaWQpCit7CisJY2xhc3NfaW50ZXJmYWNlX3JlZ2lzdGVyKCZpMm9fZGV2aWNlX2NsYXNzX2ludGVyZmFjZSk7CisJY2xhc3NfdW5yZWdpc3RlcigmaTJvX2RldmljZV9jbGFzcyk7Cit9OworCitFWFBPUlRfU1lNQk9MKGkyb19kZXZpY2VfY2xhaW0pOworRVhQT1JUX1NZTUJPTChpMm9fZGV2aWNlX2NsYWltX3JlbGVhc2UpOworRVhQT1JUX1NZTUJPTChpMm9fcGFybV9maWVsZF9nZXQpOworRVhQT1JUX1NZTUJPTChpMm9fcGFybV90YWJsZV9nZXQpOworRVhQT1JUX1NZTUJPTChpMm9fcGFybV9pc3N1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2RyaXZlci5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9kcml2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWY0ZWRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9kcml2ZXIuYwpAQCAtMCwwICsxLDM3NCBAQAorLyoKKyAqCUZ1bmN0aW9ucyB0byBoYW5kbGUgSTJPIGRyaXZlcnMgKE9TTXMpIGFuZCBJMk8gYnVzIHR5cGUgZm9yIHN5c2ZzCisgKgorICoJQ29weXJpZ2h0IChDKSAyMDA0CU1hcmt1cyBMaWRlbCA8TWFya3VzLkxpZGVsQHNoYWRvd2Nvbm5lY3QuY29tPgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqCW9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJRml4ZXMvYWRkaXRpb25zOgorICoJCU1hcmt1cyBMaWRlbCA8TWFya3VzLkxpZGVsQHNoYWRvd2Nvbm5lY3QuY29tPgorICoJCQlpbml0aWFsIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvaTJvLmg+CisKKy8qIG1heF9kcml2ZXJzIC0gTWF4aW11bSBJMk8gZHJpdmVycyAoT1NNcykgd2hpY2ggY291bGQgYmUgcmVnaXN0ZXJlZCAqLwordW5zaWduZWQgaW50IGkyb19tYXhfZHJpdmVycyA9IEkyT19NQVhfRFJJVkVSUzsKK21vZHVsZV9wYXJhbV9uYW1lZChtYXhfZHJpdmVycywgaTJvX21heF9kcml2ZXJzLCB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2RyaXZlcnMsICJtYXhpbXVtIG51bWJlciBvZiBPU00ncyB0byBzdXBwb3J0Iik7CisKKy8qIEkyTyBkcml2ZXJzIGxvY2sgYW5kIGFycmF5ICovCitzdGF0aWMgc3BpbmxvY2tfdCBpMm9fZHJpdmVyc19sb2NrOworc3RhdGljIHN0cnVjdCBpMm9fZHJpdmVyICoqaTJvX2RyaXZlcnM7CisKKy8qKgorICoJaTJvX2J1c19tYXRjaCAtIFRlbGwgaWYgYSBJMk8gZGV2aWNlIGNsYXNzIGlkIG1hdGNoIHRoZSBjbGFzcyBpZHMgb2YKKyAqCQkJdGhlIEkyTyBkcml2ZXIgKE9TTSkKKyAqCisgKglAZGV2OiBkZXZpY2Ugd2hpY2ggc2hvdWxkIGJlIHZlcmlmaWVkCisgKglAZHJ2OiB0aGUgZHJpdmVyIHRvIG1hdGNoIGFnYWluc3QKKyAqCisgKglVc2VkIGJ5IHRoZSBidXMgdG8gY2hlY2sgaWYgdGhlIGRyaXZlciB3YW50cyB0byBoYW5kbGUgdGhlIGRldmljZS4KKyAqCisgKglSZXR1cm5zIDEgaWYgdGhlIGNsYXNzIGlkcyBvZiB0aGUgZHJpdmVyIG1hdGNoIHRoZSBjbGFzcyBpZCBvZiB0aGUKKyAqCWRldmljZSwgb3RoZXJ3aXNlIDAuCisgKi8KK3N0YXRpYyBpbnQgaTJvX2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXYgPSB0b19pMm9fZGV2aWNlKGRldik7CisJc3RydWN0IGkyb19kcml2ZXIgKmkyb19kcnYgPSB0b19pMm9fZHJpdmVyKGRydik7CisJc3RydWN0IGkyb19jbGFzc19pZCAqaWRzID0gaTJvX2Rydi0+Y2xhc3NlczsKKworCWlmIChpZHMpCisJCXdoaWxlIChpZHMtPmNsYXNzX2lkICE9IEkyT19DTEFTU19FTkQpIHsKKwkJCWlmIChpZHMtPmNsYXNzX2lkID09IGkyb19kZXYtPmxjdF9kYXRhLmNsYXNzX2lkKQorCQkJCXJldHVybiAxOworCQkJaWRzKys7CisJCX0KKwlyZXR1cm4gMDsKK307CisKKy8qIEkyTyBidXMgdHlwZSAqLworc3RydWN0IGJ1c190eXBlIGkyb19idXNfdHlwZSA9IHsKKwkubmFtZSA9ICJpMm8iLAorCS5tYXRjaCA9IGkyb19idXNfbWF0Y2gsCit9OworCisvKioKKyAqCWkyb19kcml2ZXJfcmVnaXN0ZXIgLSBSZWdpc3RlciBhIEkyTyBkcml2ZXIgKE9TTSkgaW4gdGhlIEkyTyBjb3JlCisgKglAZHJ2OiBJMk8gZHJpdmVyIHdoaWNoIHNob3VsZCBiZSByZWdpc3RlcmVkCisgKgorICoJUmVnaXN0ZXJzIHRoZSBPU00gZHJ2IGluIHRoZSBJMk8gY29yZSBhbmQgY3JlYXRlcyBhbiBldmVudCBxdWV1ZXMgaWYKKyAqCW5lY2Vzc2FyeS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBpMm9fZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBpMm9fZHJpdmVyICpkcnYpCit7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjOworCWludCBpOworCWludCByYyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXByX2RlYnVnKCJpMm86IFJlZ2lzdGVyIGRyaXZlciAlc1xuIiwgZHJ2LT5uYW1lKTsKKworCWlmIChkcnYtPmV2ZW50KSB7CisJCWRydi0+ZXZlbnRfcXVldWUgPSBjcmVhdGVfd29ya3F1ZXVlKGRydi0+bmFtZSk7CisJCWlmICghZHJ2LT5ldmVudF9xdWV1ZSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJpMm86IENvdWxkIG5vdCBpbml0aWFsaXplIGV2ZW50IHF1ZXVlICIKKwkJCSAgICAgICAiZm9yIGRyaXZlciAlc1xuIiwgZHJ2LT5uYW1lKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXByX2RlYnVnKCJpMm86IEV2ZW50IHF1ZXVlIGluaXRpYWxpemVkIGZvciBkcml2ZXIgJXNcbiIsCisJCQkgZHJ2LT5uYW1lKTsKKwl9IGVsc2UKKwkJZHJ2LT5ldmVudF9xdWV1ZSA9IE5VTEw7CisKKwlkcnYtPmRyaXZlci5uYW1lID0gZHJ2LT5uYW1lOworCWRydi0+ZHJpdmVyLmJ1cyA9ICZpMm9fYnVzX3R5cGU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTJvX2RyaXZlcnNfbG9jaywgZmxhZ3MpOworCisJZm9yIChpID0gMDsgaTJvX2RyaXZlcnNbaV07IGkrKykKKwkJaWYgKGkgPj0gaTJvX21heF9kcml2ZXJzKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImkybzogdG9vIG1hbnkgZHJpdmVycyByZWdpc3RlcmVkLCAiCisJCQkgICAgICAgImluY3JlYXNlIG1heF9kcml2ZXJzXG4iKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyb19kcml2ZXJzX2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwlkcnYtPmNvbnRleHQgPSBpOworCWkyb19kcml2ZXJzW2ldID0gZHJ2OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTJvX2RyaXZlcnNfbG9jaywgZmxhZ3MpOworCisJcHJfZGVidWcoImkybzogZHJpdmVyICVzIGdldHMgY29udGV4dCBpZCAlZFxuIiwgZHJ2LT5uYW1lLAorCQkgZHJ2LT5jb250ZXh0KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmkyb19jb250cm9sbGVycywgbGlzdCkgeworCQlzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldjsKKworCQlpMm9fZHJpdmVyX25vdGlmeV9jb250cm9sbGVyX2FkZChkcnYsIGMpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGkyb19kZXYsICZjLT5kZXZpY2VzLCBsaXN0KQorCQkJaTJvX2RyaXZlcl9ub3RpZnlfZGV2aWNlX2FkZChkcnYsIGkyb19kZXYpOworCX0KKworCisJcmMgPSBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKKwlpZiAocmMpCisJCWRlc3Ryb3lfd29ya3F1ZXVlKGRydi0+ZXZlbnRfcXVldWUpOworCisJcmV0dXJuIHJjOworfTsKKworLyoqCisgKglpMm9fZHJpdmVyX3VucmVnaXN0ZXIgLSBVbnJlZ2lzdGVyIGEgSTJPIGRyaXZlciAoT1NNKSBmcm9tIHRoZSBJMk8gY29yZQorICoJQGRydjogSTJPIGRyaXZlciB3aGljaCBzaG91bGQgYmUgdW5yZWdpc3RlcmVkCisgKgorICoJVW5yZWdpc3RlcnMgdGhlIE9TTSBkcnYgZnJvbSB0aGUgSTJPIGNvcmUgYW5kIGNsZWFudXAgZXZlbnQgcXVldWVzIGlmCisgKgluZWNlc3NhcnkuCisgKi8KK3ZvaWQgaTJvX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBpMm9fZHJpdmVyICpkcnYpCit7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcl9kZWJ1ZygiaTJvOiB1bnJlZ2lzdGVyIGRyaXZlciAlc1xuIiwgZHJ2LT5uYW1lKTsKKworCWRyaXZlcl91bnJlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZpMm9fY29udHJvbGxlcnMsIGxpc3QpIHsKKwkJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXY7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShpMm9fZGV2LCAmYy0+ZGV2aWNlcywgbGlzdCkKKwkJICAgIGkyb19kcml2ZXJfbm90aWZ5X2RldmljZV9yZW1vdmUoZHJ2LCBpMm9fZGV2KTsKKworCQlpMm9fZHJpdmVyX25vdGlmeV9jb250cm9sbGVyX3JlbW92ZShkcnYsIGMpOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpMm9fZHJpdmVyc19sb2NrLCBmbGFncyk7CisJaTJvX2RyaXZlcnNbZHJ2LT5jb250ZXh0XSA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTJvX2RyaXZlcnNfbG9jaywgZmxhZ3MpOworCisJaWYgKGRydi0+ZXZlbnRfcXVldWUpIHsKKwkJZGVzdHJveV93b3JrcXVldWUoZHJ2LT5ldmVudF9xdWV1ZSk7CisJCWRydi0+ZXZlbnRfcXVldWUgPSBOVUxMOworCQlwcl9kZWJ1ZygiaTJvOiBldmVudCBxdWV1ZSByZW1vdmVkIGZvciAlc1xuIiwgZHJ2LT5uYW1lKTsKKwl9Cit9OworCisvKioKKyAqCWkyb19kcml2ZXJfZGlzcGF0Y2ggLSBkaXNwYXRjaCBhbiBJMk8gcmVwbHkgbWVzc2FnZQorICoJQGM6IEkyTyBjb250cm9sbGVyIG9mIHRoZSBtZXNzYWdlCisgKglAbTogSTJPIG1lc3NhZ2UgbnVtYmVyCisgKglAbXNnOiBJMk8gbWVzc2FnZSB0byBiZSBkZWxpdmVyZWQKKyAqCisgKglUaGUgcmVwbHkgaXMgZGVsaXZlcmVkIHRvIHRoZSBkcml2ZXIgZnJvbSB3aGljaCB0aGUgb3JpZ2luYWwgbWVzc2FnZQorICoJd2FzLiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIHRoZSBtZXNzYWdlIHNob3VsZCBub3QgYmUgZmx1c2hlZC4gUmV0dXJucyA+IDAKKyAqCW9uIHN1Y2Nlc3MgYW5kIGlmIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBmbHVzaGVkIGFmdGVyd29yZHMuIFJldHVybnMKKyAqCW5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZSAodGhlIG1lc3NhZ2Ugd2lsbCBiZSBmbHVzaGVkIHRvbykuCisgKi8KK2ludCBpMm9fZHJpdmVyX2Rpc3BhdGNoKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdTMyIG0sCisJCQlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnKQoreworCXN0cnVjdCBpMm9fZHJpdmVyICpkcnY7CisJdTMyIGNvbnRleHQgPSByZWFkbCgmbXNnLT51LnMuaWNudHh0KTsKKworCWlmIChsaWtlbHkoY29udGV4dCA8IGkyb19tYXhfZHJpdmVycykpIHsKKwkJc3Bpbl9sb2NrKCZpMm9fZHJpdmVyc19sb2NrKTsKKwkJZHJ2ID0gaTJvX2RyaXZlcnNbY29udGV4dF07CisJCXNwaW5fdW5sb2NrKCZpMm9fZHJpdmVyc19sb2NrKTsKKworCQlpZiAodW5saWtlbHkoIWRydikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBTcHVyaW91cyByZXBseSB0byB1bmtub3duICIKKwkJCSAgICAgICAiZHJpdmVyICVkXG4iLCBjLT5uYW1lLCBjb250ZXh0KTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJaWYgKChyZWFkbCgmbXNnLT51LmhlYWRbMV0pID4+IDI0KSA9PSBJMk9fQ01EX1VUSUxfRVZUX1JFR0lTVEVSKSB7CisJCQlzdHJ1Y3QgaTJvX2RldmljZSAqZGV2LCAqdG1wOworCQkJc3RydWN0IGkyb19ldmVudCAqZXZ0OworCQkJdTE2IHNpemU7CisJCQl1MTYgdGlkOworCisJCQl0aWQgPSByZWFkbCgmbXNnLT51LmhlYWRbMV0pICYgMHgxZmZmOworCisJCQlwcl9kZWJ1ZygiJXM6IGV2ZW50IHJlY2VpdmVkIGZyb20gZGV2aWNlICVkXG4iLCBjLT5uYW1lLAorCQkJCSB0aWQpOworCisJCQkvKiBjdXQgb2YgaGVhZGVyIGZyb20gbWVzc2FnZSBzaXplIChpbiAzMi1iaXQgd29yZHMpICovCisJCQlzaXplID0gKHJlYWRsKCZtc2ctPnUuaGVhZFswXSkgPj4gMTYpIC0gNTsKKworCQkJZXZ0ID0ga21hbGxvYyhzaXplICogNCArIHNpemVvZigqZXZ0KSwgR0ZQX0FUT01JQyk7CisJCQlpZiAoIWV2dCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCW1lbXNldChldnQsIDAsIHNpemUgKiA0ICsgc2l6ZW9mKCpldnQpKTsKKworCQkJZXZ0LT5zaXplID0gc2l6ZTsKKwkJCW1lbWNweV9mcm9taW8oJmV2dC0+dGNudHh0LCAmbXNnLT51LnMudGNudHh0LAorCQkJCSAgICAgIChzaXplICsgMikgKiA0KTsKKworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRldiwgdG1wLCAmYy0+ZGV2aWNlcywgbGlzdCkKKwkJCSAgICBpZiAoZGV2LT5sY3RfZGF0YS50aWQgPT0gdGlkKSB7CisJCQkJZXZ0LT5pMm9fZGV2ID0gZGV2OworCQkJCWJyZWFrOworCQkJfQorCisJCQlJTklUX1dPUksoJmV2dC0+d29yaywgKHZvaWQgKCopKHZvaWQgKikpZHJ2LT5ldmVudCwKKwkJCQkgIGV2dCk7CisJCQlxdWV1ZV93b3JrKGRydi0+ZXZlbnRfcXVldWUsICZldnQtPndvcmspOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlpZiAobGlrZWx5KGRydi0+cmVwbHkpKQorCQkJcmV0dXJuIGRydi0+cmVwbHkoYywgbSwgbXNnKTsKKwkJZWxzZQorCQkJcHJfZGVidWcoIiVzOiBSZXBseSB0byBkcml2ZXIgJXMsIGJ1dCBubyByZXBseSBmdW5jdGlvbiIKKwkJCQkgIiBkZWZpbmVkIVxuIiwgYy0+bmFtZSwgZHJ2LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU87CisJfSBlbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBTcHVyaW91cyByZXBseSB0byB1bmtub3duIGRyaXZlciAiCisJCSAgICAgICAiJWRcbiIsIGMtPm5hbWUsIHJlYWRsKCZtc2ctPnUucy5pY250eHQpKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoqCisgKglpMm9fZHJpdmVyX25vdGlmeV9jb250cm9sbGVyX2FkZF9hbGwgLSBTZW5kIG5vdGlmeSBvZiBhZGRlZCBjb250cm9sbGVyCisgKgkJCQkJICAgICAgIHRvIGFsbCBJMk8gZHJpdmVycworICoKKyAqCVNlbmQgbm90aWZpY2F0aW9ucyB0byBhbGwgcmVnaXN0ZXJlZCBkcml2ZXJzIHRoYXQgYSBuZXcgY29udHJvbGxlciB3YXMKKyAqCWFkZGVkLgorICovCit2b2lkIGkyb19kcml2ZXJfbm90aWZ5X2NvbnRyb2xsZXJfYWRkX2FsbChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCit7CisJaW50IGk7CisJc3RydWN0IGkyb19kcml2ZXIgKmRydjsKKworCWZvciAoaSA9IDA7IGkgPCBJMk9fTUFYX0RSSVZFUlM7IGkrKykgeworCQlkcnYgPSBpMm9fZHJpdmVyc1tpXTsKKworCQlpZiAoZHJ2KQorCQkJaTJvX2RyaXZlcl9ub3RpZnlfY29udHJvbGxlcl9hZGQoZHJ2LCBjKTsKKwl9Cit9CisKKy8qKgorICoJaTJvX2RyaXZlcl9ub3RpZnlfY29udHJvbGxlcl9yZW1vdmVfYWxsIC0gU2VuZCBub3RpZnkgb2YgcmVtb3ZlZAorICoJCQkJCQkgIGNvbnRyb2xsZXIgdG8gYWxsIEkyTyBkcml2ZXJzCisgKgorICoJU2VuZCBub3RpZmljYXRpb25zIHRvIGFsbCByZWdpc3RlcmVkIGRyaXZlcnMgdGhhdCBhIGNvbnRyb2xsZXIgd2FzCisgKglyZW1vdmVkLgorICovCit2b2lkIGkyb19kcml2ZXJfbm90aWZ5X2NvbnRyb2xsZXJfcmVtb3ZlX2FsbChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCit7CisJaW50IGk7CisJc3RydWN0IGkyb19kcml2ZXIgKmRydjsKKworCWZvciAoaSA9IDA7IGkgPCBJMk9fTUFYX0RSSVZFUlM7IGkrKykgeworCQlkcnYgPSBpMm9fZHJpdmVyc1tpXTsKKworCQlpZiAoZHJ2KQorCQkJaTJvX2RyaXZlcl9ub3RpZnlfY29udHJvbGxlcl9yZW1vdmUoZHJ2LCBjKTsKKwl9Cit9CisKKy8qKgorICoJaTJvX2RyaXZlcl9ub3RpZnlfZGV2aWNlX2FkZF9hbGwgLSBTZW5kIG5vdGlmeSBvZiBhZGRlZCBkZXZpY2UgdG8gYWxsCisgKgkJCQkJICAgSTJPIGRyaXZlcnMKKyAqCisgKglTZW5kIG5vdGlmaWNhdGlvbnMgdG8gYWxsIHJlZ2lzdGVyZWQgZHJpdmVycyB0aGF0IGEgZGV2aWNlIHdhcyBhZGRlZC4KKyAqLwordm9pZCBpMm9fZHJpdmVyX25vdGlmeV9kZXZpY2VfYWRkX2FsbChzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaTJvX2RyaXZlciAqZHJ2OworCisJZm9yIChpID0gMDsgaSA8IEkyT19NQVhfRFJJVkVSUzsgaSsrKSB7CisJCWRydiA9IGkyb19kcml2ZXJzW2ldOworCisJCWlmIChkcnYpCisJCQlpMm9fZHJpdmVyX25vdGlmeV9kZXZpY2VfYWRkKGRydiwgaTJvX2Rldik7CisJfQorfQorCisvKioKKyAqCWkyb19kcml2ZXJfbm90aWZ5X2RldmljZV9yZW1vdmVfYWxsIC0gU2VuZCBub3RpZnkgb2YgcmVtb3ZlZCBkZXZpY2UgdG8KKyAqCQkJCQkgICAgICBhbGwgSTJPIGRyaXZlcnMKKyAqCisgKglTZW5kIG5vdGlmaWNhdGlvbnMgdG8gYWxsIHJlZ2lzdGVyZWQgZHJpdmVycyB0aGF0IGEgZGV2aWNlIHdhcyByZW1vdmVkLgorICovCit2b2lkIGkyb19kcml2ZXJfbm90aWZ5X2RldmljZV9yZW1vdmVfYWxsKHN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2KQoreworCWludCBpOworCXN0cnVjdCBpMm9fZHJpdmVyICpkcnY7CisKKwlmb3IgKGkgPSAwOyBpIDwgSTJPX01BWF9EUklWRVJTOyBpKyspIHsKKwkJZHJ2ID0gaTJvX2RyaXZlcnNbaV07CisKKwkJaWYgKGRydikKKwkJCWkyb19kcml2ZXJfbm90aWZ5X2RldmljZV9yZW1vdmUoZHJ2LCBpMm9fZGV2KTsKKwl9Cit9CisKKy8qKgorICoJaTJvX2RyaXZlcl9pbml0IC0gaW5pdGlhbGl6ZSBJMk8gZHJpdmVycyAoT1NNcykKKyAqCisgKglSZWdpc3RlcnMgdGhlIEkyTyBidXMgYW5kIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGFycmF5IG9mIE9TTXMuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgX19pbml0IGkyb19kcml2ZXJfaW5pdCh2b2lkKQoreworCWludCByYyA9IDA7CisKKwlzcGluX2xvY2tfaW5pdCgmaTJvX2RyaXZlcnNfbG9jayk7CisKKwlpZiAoKGkyb19tYXhfZHJpdmVycyA8IDIpIHx8IChpMm9fbWF4X2RyaXZlcnMgPiA2NCkgfHwKKwkgICAgKChpMm9fbWF4X2RyaXZlcnMgXiAoaTJvX21heF9kcml2ZXJzIC0gMSkpICE9CisJICAgICAoMiAqIGkyb19tYXhfZHJpdmVycyAtIDEpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpMm86IG1heF9kcml2ZXJzIHNldCB0byAlZCwgYnV0IG11c3QgYmUgIgorCQkgICAgICAgIj49MiBhbmQgPD0gNjQgYW5kIGEgcG93ZXIgb2YgMlxuIiwgaTJvX21heF9kcml2ZXJzKTsKKwkJaTJvX21heF9kcml2ZXJzID0gSTJPX01BWF9EUklWRVJTOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJpMm86IG1heCBkcml2ZXJzID0gJWRcbiIsIGkyb19tYXhfZHJpdmVycyk7CisKKwlpMm9fZHJpdmVycyA9CisJICAgIGttYWxsb2MoaTJvX21heF9kcml2ZXJzICogc2l6ZW9mKCppMm9fZHJpdmVycyksIEdGUF9LRVJORUwpOworCWlmICghaTJvX2RyaXZlcnMpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KGkyb19kcml2ZXJzLCAwLCBpMm9fbWF4X2RyaXZlcnMgKiBzaXplb2YoKmkyb19kcml2ZXJzKSk7CisKKwlyYyA9IGJ1c19yZWdpc3RlcigmaTJvX2J1c190eXBlKTsKKworCWlmIChyYyA8IDApCisJCWtmcmVlKGkyb19kcml2ZXJzKTsKKworCXJldHVybiByYzsKK307CisKKy8qKgorICoJaTJvX2RyaXZlcl9leGl0IC0gY2xlYW4gdXAgSTJPIGRyaXZlcnMgKE9TTXMpCisgKgorICoJVW5yZWdpc3RlcnMgdGhlIEkyTyBidXMgYW5kIGZyZWUgZHJpdmVyIGFycmF5LgorICovCit2b2lkIF9fZXhpdCBpMm9fZHJpdmVyX2V4aXQodm9pZCkKK3sKKwlidXNfdW5yZWdpc3RlcigmaTJvX2J1c190eXBlKTsKKwlrZnJlZShpMm9fZHJpdmVycyk7Cit9OworCitFWFBPUlRfU1lNQk9MKGkyb19kcml2ZXJfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChpMm9fZHJpdmVyX3VucmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChpMm9fZHJpdmVyX25vdGlmeV9jb250cm9sbGVyX2FkZF9hbGwpOworRVhQT1JUX1NZTUJPTChpMm9fZHJpdmVyX25vdGlmeV9jb250cm9sbGVyX3JlbW92ZV9hbGwpOworRVhQT1JUX1NZTUJPTChpMm9fZHJpdmVyX25vdGlmeV9kZXZpY2VfYWRkX2FsbCk7CitFWFBPUlRfU1lNQk9MKGkyb19kcml2ZXJfbm90aWZ5X2RldmljZV9yZW1vdmVfYWxsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZXhlYy1vc20uYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZXhlYy1vc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWMxY2JmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9leGVjLW9zbS5jCkBAIC0wLDAgKzEsNTA3IEBACisvKgorICoJRXhlY3V0aXZlIE9TTQorICoKKyAqIAlDb3B5cmlnaHQgKEMpIDE5OTktMjAwMglSZWQgSGF0IFNvZnR3YXJlCisgKgorICoJV3JpdHRlbiBieSBBbGFuIENveCwgQnVpbGRpbmcgTnVtYmVyIFRocmVlIEx0ZAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqCW9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJQSBsb3Qgb2YgdGhlIEkyTyBtZXNzYWdlIHNpZGUgY29kZSBmcm9tIHRoaXMgaXMgdGFrZW4gZnJvbSB0aGUgUmVkCisgKglDcmVlayBSQ1BDSTQ1IGFkYXB0ZXIgZHJpdmVyIGJ5IFJlZCBDcmVlayBDb21tdW5pY2F0aW9ucworICoKKyAqCUZpeGVzL2FkZGl0aW9uczoKKyAqCQlQaGlsaXBwIFJ1bXBmCisgKgkJSnVoYSBTaWV25G5lbiA8SnVoYS5TaWV2YW5lbkBjcy5IZWxzaW5raS5GST4KKyAqCQlBdXZvIEjka2tpbmVuIDxBdXZvLkhha2tpbmVuQGNzLkhlbHNpbmtpLkZJPgorICoJCURlZXBhayBTYXhlbmEgPGRlZXBha0BwbGV4aXR5Lm5ldD4KKyAqCQlCb2ppIFQgS2FubmFudGhhbmFtIDxib2ppLnQua2FubmFudGhhbmFtQGludGVsLmNvbT4KKyAqCQlBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPjoKKyAqCQkJUG9ydGVkIHRvIExpbnV4IDIuNS4KKyAqCQlNYXJrdXMgTGlkZWwgPE1hcmt1cy5MaWRlbEBzaGFkb3djb25uZWN0LmNvbT46CisgKgkJCU1pbm9yIGZpeGVzIGZvciAyLjYuCisgKgkJTWFya3VzIExpZGVsIDxNYXJrdXMuTGlkZWxAc2hhZG93Y29ubmVjdC5jb20+OgorICoJCQlTdXBwb3J0IGZvciBzeXNmcyBpbmNsdWRlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2RlZmluZSBPU01fTkFNRSAiZXhlYy1vc20iCisKK3N0cnVjdCBpMm9fZHJpdmVyIGkyb19leGVjX2RyaXZlcjsKKworc3RhdGljIGludCBpMm9fZXhlY19sY3Rfbm90aWZ5KHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdTMyIGNoYW5nZV9pbmQpOworCisvKiBNb2R1bGUgaW50ZXJuYWwgZnVuY3Rpb25zIGZyb20gb3RoZXIgc291cmNlcyAqLworZXh0ZXJuIGludCBpMm9fZGV2aWNlX3BhcnNlX2xjdChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKik7CisKKy8qIGdsb2JhbCB3YWl0IGxpc3QgZm9yIFBPU1QgV0FJVCAqLworc3RhdGljIExJU1RfSEVBRChpMm9fZXhlY193YWl0X2xpc3QpOworCisvKiBXYWl0IHN0cnVjdCBuZWVkZWQgZm9yIFBPU1QgV0FJVCAqLworc3RydWN0IGkyb19leGVjX3dhaXQgeworCXdhaXRfcXVldWVfaGVhZF90ICp3cTsJLyogUG9pbnRlciB0byBXYWl0IHF1ZXVlICovCisJc3RydWN0IGkyb19kbWEgZG1hOwkvKiBETUEgYnVmZmVycyB0byBmcmVlIG9uIGZhaWx1cmUgKi8KKwl1MzIgdGNudHh0OwkJLyogdHJhbnNhY3Rpb24gY29udGV4dCBmcm9tIHJlcGx5ICovCisJaW50IGNvbXBsZXRlOwkJLyogMSBpZiByZXBseSByZWNlaXZlZCBvdGhlcndpc2UgMCAqLworCXUzMiBtOwkJCS8qIG1lc3NhZ2UgaWQgKi8KKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOwkvKiBwb2ludGVyIHRvIHRoZSByZXBseSBtZXNzYWdlICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkvKiBub2RlIGluIGdsb2JhbCB3YWl0IGxpc3QgKi8KK307CisKKy8qIEV4ZWMgT1NNIGNsYXNzIGhhbmRsaW5nIGRlZmluaXRpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgaTJvX2NsYXNzX2lkIGkyb19leGVjX2NsYXNzX2lkW10gPSB7CisJe0kyT19DTEFTU19FWEVDVVRJVkV9LAorCXtJMk9fQ0xBU1NfRU5EfQorfTsKKworLyoqCisgKglpMm9fZXhlY193YWl0X2FsbG9jIC0gQWxsb2NhdGUgYSBpMm9fZXhlY193YWl0IHN0cnVjdCBhbiBpbml0aWFsaXplIGl0CisgKgorICoJQWxsb2NhdGUgdGhlIGkyb19leGVjX3dhaXQgc3RydWN0IGFuZCBpbml0aWFsaXplIHRoZSB3YWl0LgorICoKKyAqCVJldHVybnMgaTJvX2V4ZWNfd2FpdCBwb2ludGVyIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbgorICoJZmFpbHVyZS4KKyAqLworc3RhdGljIHN0cnVjdCBpMm9fZXhlY193YWl0ICppMm9fZXhlY193YWl0X2FsbG9jKHZvaWQpCit7CisJc3RydWN0IGkyb19leGVjX3dhaXQgKndhaXQ7CisKKwl3YWl0ID0ga21hbGxvYyhzaXplb2YoKndhaXQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdhaXQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJbWVtc2V0KHdhaXQsIDAsIHNpemVvZigqd2FpdCkpOworCisJSU5JVF9MSVNUX0hFQUQoJndhaXQtPmxpc3QpOworCisJcmV0dXJuIHdhaXQ7Cit9OworCisvKioKKyAqCWkyb19leGVjX3dhaXRfZnJlZSAtIEZyZWUgYSBpMm9fZXhlY193YWl0IHN0cnVjdAorICoJQGkyb19leGVjX3dhaXQ6IEkyTyB3YWl0IGRhdGEgd2hpY2ggc2hvdWxkIGJlIGNsZWFuZWQgdXAKKyAqLworc3RhdGljIHZvaWQgaTJvX2V4ZWNfd2FpdF9mcmVlKHN0cnVjdCBpMm9fZXhlY193YWl0ICp3YWl0KQoreworCWtmcmVlKHdhaXQpOworfTsKKworLyoqCisgKiAJaTJvX21zZ19wb3N0X3dhaXRfbWVtIC0gUG9zdCBhbmQgd2FpdCBhIG1lc3NhZ2Ugd2l0aCBETUEgYnVmZmVycworICoJQGM6IGNvbnRyb2xsZXIKKyAqCUBtOiBtZXNzYWdlIHRvIHBvc3QKKyAqCUB0aW1lb3V0OiB0aW1lIGluIHNlY29uZHMgdG8gd2FpdAorICoJQGRtYTogaTJvX2RtYSBzdHJ1Y3Qgb2YgdGhlIERNQSBidWZmZXIgdG8gZnJlZSBvbiBmYWlsdXJlCisgKgorICogCVRoaXMgQVBJIGFsbG93cyBhbiBPU00gdG8gcG9zdCBhIG1lc3NhZ2UgYW5kIHRoZW4gYmUgdG9sZCB3aGV0aGVyIG9yCisgKglub3QgdGhlIHN5c3RlbSByZWNlaXZlZCBhIHN1Y2Nlc3NmdWwgcmVwbHkuIElmIHRoZSBtZXNzYWdlIHRpbWVzIG91dAorICoJdGhlbiB0aGUgdmFsdWUgJy1FVElNRURPVVQnIGlzIHJldHVybmVkLiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLiBJbgorICoJdGhpcyBzaXR1YXRpb24gdGhlIG1lc3NhZ2UgbWF5IChzaG91bGQpIGNvbXBsZXRlIGF0IGFuIGluZGVmaW5pdGUgdGltZQorICoJaW4gdGhlIGZ1dHVyZS4gV2hlbiBpdCBjb21wbGV0ZXMgaXQgd2lsbCB1c2UgdGhlIG1lbW9yeSBidWZmZXIKKyAqCWF0dGFjaGVkIHRvIHRoZSByZXF1ZXN0LiBJZiAtRVRJTUVET1VUIGlzIHJldHVybmVkIHRoZW4gdGhlIG1lbW9yeQorICoJYnVmZmVyIG11c3Qgbm90IGJlIGZyZWVkLiBJbnN0ZWFkIHRoZSBldmVudCBjb21wbGV0aW9uIHdpbGwgZnJlZSB0aGVtCisgKglmb3IgeW91LiBJbiBhbGwgb3RoZXIgY2FzZXMgdGhlIGJ1ZmZlciBhcmUgeW91ciBwcm9ibGVtLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IGkyb19tc2dfcG9zdF93YWl0X21lbShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsIHUzMiBtLCB1bnNpZ25lZCBsb25nCisJCQkgIHRpbWVvdXQsIHN0cnVjdCBpMm9fZG1hICpkbWEpCit7CisJREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQod3EpOworCXN0cnVjdCBpMm9fZXhlY193YWl0ICp3YWl0OworCXN0YXRpYyB1MzIgdGNudHh0ID0gMHg4MDAwMDAwMDsKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnID0gYy0+aW5fcXVldWUudmlydCArIG07CisJaW50IHJjID0gMDsKKworCXdhaXQgPSBpMm9fZXhlY193YWl0X2FsbG9jKCk7CisJaWYgKCF3YWl0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICh0Y250eHQgPT0gMHhmZmZmZmZmZikKKwkJdGNudHh0ID0gMHg4MDAwMDAwMDsKKworCWlmIChkbWEpCisJCXdhaXQtPmRtYSA9ICpkbWE7CisKKwkvKgorCSAqIEZpbGwgaW4gdGhlIG1lc3NhZ2UgaW5pdGlhdG9yIGNvbnRleHQgYW5kIHRyYW5zYWN0aW9uIGNvbnRleHQuCisJICogV2Ugd2lsbCBvbmx5IHVzZSB0cmFuc2FjdGlvbiBjb250ZXh0cyA+PSAweDgwMDAwMDAwIGZvciBQT1NUIFdBSVQsCisJICogc28gd2UgY291bGQgZmluZCBhIFBPU1QgV0FJVCByZXBseSBlYXNpZXIgaW4gdGhlIHJlcGx5IGhhbmRsZXIuCisJICovCisJd3JpdGVsKGkyb19leGVjX2RyaXZlci5jb250ZXh0LCAmbXNnLT51LnMuaWNudHh0KTsKKwl3YWl0LT50Y250eHQgPSB0Y250eHQrKzsKKwl3cml0ZWwod2FpdC0+dGNudHh0LCAmbXNnLT51LnMudGNudHh0KTsKKworCS8qCisJICogUG9zdCB0aGUgbWVzc2FnZSB0byB0aGUgY29udHJvbGxlci4gQXQgc29tZSBwb2ludCBsYXRlciBpdCB3aWxsCisJICogcmV0dXJuLiBJZiB3ZSB0aW1lIG91dCBiZWZvcmUgaXQgcmV0dXJucyB0aGVuIGNvbXBsZXRlIHdpbGwgYmUgemVyby4KKwkgKi8KKwlpMm9fbXNnX3Bvc3QoYywgbSk7CisKKwlpZiAoIXdhaXQtPmNvbXBsZXRlKSB7CisJCXdhaXQtPndxID0gJndxOworCQkvKgorCQkgKiB3ZSBhZGQgZWxlbWVudHMgYWRkIHRoZSBoZWFkLCBiZWNhdXNlIGlmIGEgZW50cnkgaW4gdGhlIGxpc3QKKwkJICogd2lsbCBuZXZlciBiZSByZW1vdmVkLCB3ZSBoYXZlIHRvIGl0ZXJhdGUgb3ZlciBpdCBldmVyeSB0aW1lCisJCSAqLworCQlsaXN0X2FkZCgmd2FpdC0+bGlzdCwgJmkyb19leGVjX3dhaXRfbGlzdCk7CisKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIHdhaXQtPmNvbXBsZXRlLAorCQkJdGltZW91dCAqIEhaKTsKKworCQl3YWl0LT53cSA9IE5VTEw7CisJfQorCisJYmFycmllcigpOworCisJaWYgKHdhaXQtPmNvbXBsZXRlKSB7CisJCWlmIChyZWFkbCgmd2FpdC0+bXNnLT5ib2R5WzBdKSA+PiAyNCkKKwkJCXJjID0gcmVhZGwoJndhaXQtPm1zZy0+Ym9keVswXSkgJiAweGZmOworCQlpMm9fZmx1c2hfcmVwbHkoYywgd2FpdC0+bSk7CisJCWkyb19leGVjX3dhaXRfZnJlZSh3YWl0KTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBXZSBjYW5ub3QgcmVtb3ZlIGl0IG5vdy4gVGhpcyBpcyBpbXBvcnRhbnQuIFdoZW4gaXQgZG9lcworCQkgKiB0ZXJtaW5hdGUgKHdoaWNoIGl0IG11c3QgZG8gaWYgdGhlIGNvbnRyb2xsZXIgaGFzIG5vdAorCQkgKiBkaWVkLi4uKSB0aGVuIGl0IHdpbGwgb3RoZXJ3aXNlIHNjcmliYmxlIG9uIHN0dWZmLgorCQkgKgorCQkgKiBGSVhNRTogdHJ5IGFib3J0IG1lc3NhZ2UKKwkJICovCisJCWlmIChkbWEpCisJCQlkbWEtPnZpcnQgPSBOVUxMOworCisJCXJjID0gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9OworCisvKioKKyAqCWkyb19tc2dfcG9zdF93YWl0X2NvbXBsZXRlIC0gUmVwbHkgdG8gYSBpMm9fbXNnX3Bvc3QgcmVxdWVzdCBmcm9tIElPUAorICoJQGM6IEkyTyBjb250cm9sbGVyIHdoaWNoIGFuc3dlcnMKKyAqCUBtOiBtZXNzYWdlIGlkCisgKglAbXNnOiBwb2ludGVyIHRvIHRoZSBJMk8gcmVwbHkgbWVzc2FnZQorICoKKyAqCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIGludGVycnVwdCBjb250ZXh0IG9ubHkuIElmIHRoZSByZXBseSByZWFjaGVkCisgKgliZWZvcmUgdGhlIHRpbWVvdXQsIHRoZSBpMm9fZXhlY193YWl0IHN0cnVjdCBpcyBmaWxsZWQgd2l0aCB0aGUgbWVzc2FnZQorICoJYW5kIHRoZSB0YXNrIHdpbGwgYmUgd2FrZWQgdXAuIFRoZSB0YXNrIGlzIG5vdyByZXNwb25zaWJsZSBmb3IgcmV0dXJuaW5nCisgKgl0aGUgbWVzc2FnZSBtIGJhY2sgdG8gdGhlIGNvbnRyb2xsZXIhIElmIHRoZSBtZXNzYWdlIHJlYWNoZXMgdXMgYWZ0ZXIKKyAqCXRoZSB0aW1lb3V0IGNsZWFuIHVwIHRoZSBpMm9fZXhlY193YWl0IHN0cnVjdCAoaW5jbHVkaW5nIGFsbG9jYXRlZAorICoJRE1BIGJ1ZmZlcikuCisgKgorICoJUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgaWYgdGhlIG1lc3NhZ2UgbSBzaG91bGQgbm90IGJlIGdpdmVuIGJhY2sgdG8gdGhlCisgKglJMk8gY29udHJvbGxlciwgb3IgPjAgb24gc3VjY2VzcyBhbmQgaWYgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGdpdmVuIGJhY2sKKyAqCWFmdGVyd29yZHMuIFJldHVybnMgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLiBJbiB0aGlzIGNhc2UgdGhlCisgKgltZXNzYWdlIG11c3QgYWxzbyBiZSBnaXZlbiBiYWNrIHRvIHRoZSBjb250cm9sbGVyLgorICovCitzdGF0aWMgaW50IGkyb19tc2dfcG9zdF93YWl0X2NvbXBsZXRlKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdTMyIG0sCisJCQkJICAgICAgc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZykKK3sKKwlzdHJ1Y3QgaTJvX2V4ZWNfd2FpdCAqd2FpdCwgKnRtcDsKKwlzdGF0aWMgc3BpbmxvY2tfdCBsb2NrOworCWludCByYyA9IDE7CisJdTMyIGNvbnRleHQ7CisKKwlzcGluX2xvY2tfaW5pdCgmbG9jayk7CisKKwljb250ZXh0ID0gcmVhZGwoJm1zZy0+dS5zLnRjbnR4dCk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gc2VhcmNoIHRocm91Z2ggdGhlIGkyb19leGVjX3dhaXRfbGlzdCB0byBzZWUgaWYgdGhlIGdpdmVuCisJICogbWVzc2FnZSBpcyBzdGlsbCBvdXRzdGFuZGluZy4gSWYgbm90LCBpdCBtZWFucyB0aGF0IHRoZSBJT1AgdG9vaworCSAqIGxvbmdlciB0byByZXNwb25kIHRvIHRoZSBtZXNzYWdlIHRoYW4gd2UgaGFkIGFsbG93ZWQgYW5kIHRpbWVyIGhhcworCSAqIGFscmVhZHkgZXhwaXJlZC4gTm90IG11Y2ggd2UgY2FuIGRvIGFib3V0IHRoYXQgZXhjZXB0IGxvZyBpdCBmb3IKKwkgKiBkZWJ1ZyBwdXJwb3NlcywgaW5jcmVhc2UgdGltZW91dCwgYW5kIHJlY29tcGlsZS4KKwkgKi8KKwlzcGluX2xvY2soJmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3YWl0LCB0bXAsICZpMm9fZXhlY193YWl0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKHdhaXQtPnRjbnR4dCA9PSBjb250ZXh0KSB7CisJCQlsaXN0X2RlbCgmd2FpdC0+bGlzdCk7CisKKwkJCXdhaXQtPm0gPSBtOworCQkJd2FpdC0+bXNnID0gbXNnOworCQkJd2FpdC0+Y29tcGxldGUgPSAxOworCisJCQliYXJyaWVyKCk7CisKKwkJCWlmICh3YWl0LT53cSkgeworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSh3YWl0LT53cSk7CisJCQkJcmMgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwkJCQlkZXYgPSAmYy0+cGRldi0+ZGV2OworCisJCQkJcHJfZGVidWcoIiVzOiB0aW1lZG91dCByZXBseSByZWNlaXZlZCFcbiIsCisJCQkJCSBjLT5uYW1lKTsKKwkJCQlpMm9fZG1hX2ZyZWUoZGV2LCAmd2FpdC0+ZG1hKTsKKwkJCQlpMm9fZXhlY193YWl0X2ZyZWUod2FpdCk7CisJCQkJcmMgPSAtMTsKKwkJCX0KKworCQkJc3Bpbl91bmxvY2soJmxvY2spOworCisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwlzcGluX3VubG9jaygmbG9jayk7CisKKwlwcl9kZWJ1ZygiJXM6IEJvZ3VzIHJlcGx5IGluIFBPU1QgV0FJVCAodHItY29udGV4dDogJTA4eCkhXG4iLCBjLT5uYW1lLAorCQkgY29udGV4dCk7CisKKwlyZXR1cm4gLTE7Cit9OworCisvKioKKyAqCWkyb19leGVjX3Byb2JlIC0gQ2FsbGVkIGlmIGEgbmV3IEkyTyBkZXZpY2UgKGV4ZWN1dGl2ZSBjbGFzcykgYXBwZWFycworICoJQGRldjogSTJPIGRldmljZSB3aGljaCBzaG91bGQgYmUgcHJvYmVkCisgKgorICoJUmVnaXN0ZXJzIGV2ZW50IG5vdGlmaWNhdGlvbiBmb3IgZXZlcnkgZXZlbnQgZnJvbSBFeGVjdXRpdmUgZGV2aWNlLiBUaGUKKyAqCXJldHVybiBpcyBhbHdheXMgMCwgYmVjYXVzZSB3ZSB3YW50IGFsbCBkZXZpY2VzIG9mIGNsYXNzIEV4ZWN1dGl2ZS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBpMm9fZXhlY19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXYgPSB0b19pMm9fZGV2aWNlKGRldik7CisKKwlpMm9fZXZlbnRfcmVnaXN0ZXIoaTJvX2RldiwgJmkyb19leGVjX2RyaXZlciwgMCwgMHhmZmZmZmZmZik7CisKKwlpMm9fZGV2LT5pb3AtPmV4ZWMgPSBpMm9fZGV2OworCisJcmV0dXJuIDA7Cit9OworCisvKioKKyAqCWkyb19leGVjX3JlbW92ZSAtIENhbGxlZCBvbiBJMk8gZGV2aWNlIHJlbW92YWwKKyAqCUBkZXY6IEkyTyBkZXZpY2Ugd2hpY2ggd2FzIHJlbW92ZWQKKyAqCisgKglVbnJlZ2lzdGVycyBldmVudCBub3RpZmljYXRpb24gZnJvbSBFeGVjdXRpdmUgSTJPIGRldmljZS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBpMm9fZXhlY19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWkyb19ldmVudF9yZWdpc3Rlcih0b19pMm9fZGV2aWNlKGRldiksICZpMm9fZXhlY19kcml2ZXIsIDAsIDApOworCisJcmV0dXJuIDA7Cit9OworCisvKioKKyAqCWkyb19leGVjX2xjdF9tb2RpZmllZCAtIENhbGxlZCBvbiBMQ1QgTk9USUZZIHJlcGx5CisgKglAYzogSTJPIGNvbnRyb2xsZXIgb24gd2hpY2ggdGhlIExDVCBoYXMgbW9kaWZpZWQKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgYXN5bmNocm9udXMgTENUIE5PVElGWSByZXBsaWVzLiBJdCBwYXJzZXMgdGhlCisgKgluZXcgTENUIGFuZCBpZiB0aGUgYnVmZmVyIGZvciB0aGUgTENUIHdhcyB0byBzbWFsbCBzZW5kcyBhIExDVCBOT1RJRlkKKyAqCWFnYWluLgorICovCitzdGF0aWMgdm9pZCBpMm9fZXhlY19sY3RfbW9kaWZpZWQoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCWlmIChpMm9fZGV2aWNlX3BhcnNlX2xjdChjKSA9PSAtRUFHQUlOKQorCQlpMm9fZXhlY19sY3Rfbm90aWZ5KGMsIDApOworfTsKKworLyoqCisgKglpMm9fZXhlY19yZXBseSAtICBJMk8gRXhlY3V0aXZlIHJlcGx5IGhhbmRsZXIKKyAqCUBjOiBJMk8gY29udHJvbGxlciBmcm9tIHdoaWNoIHRoZSByZXBseSBjb21lcworICoJQG06IG1lc3NhZ2UgaWQKKyAqCUBtc2c6IHBvaW50ZXIgdG8gdGhlIEkyTyByZXBseSBtZXNzYWdlCisgKgorICoJVGhpcyBmdW5jdGlvbiBpcyBhbHdheXMgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQuIElmIGEgUE9TVCBXQUlUCisgKglyZXBseSB3YXMgcmVjZWl2ZWQsIHBhc3MgaXQgdG8gdGhlIGNvbXBsZXRlIGZ1bmN0aW9uLiBJZiBhIExDVCBOT1RJRlkKKyAqCXJlcGx5IHdhcyByZWNlaXZlZCwgYSBuZXcgZXZlbnQgaXMgY3JlYXRlZCB0byBoYW5kbGUgdGhlIHVwZGF0ZS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgaWYgdGhlIHJlcGx5IHNob3VsZCBub3QgYmUgZmx1c2hlZCBvciA+IDAKKyAqCW9uIHN1Y2Nlc3MgYW5kIGlmIHRoZSByZXBseSBzaG91bGQgYmUgZmx1c2hlZC4gUmV0dXJucyBuZWdhdGl2ZSBlcnJvcgorICoJY29kZSBvbiBmYWlsdXJlIGFuZCBpZiB0aGUgcmVwbHkgc2hvdWxkIGJlIGZsdXNoZWQuCisgKi8KK3N0YXRpYyBpbnQgaTJvX2V4ZWNfcmVwbHkoc3RydWN0IGkyb19jb250cm9sbGVyICpjLCB1MzIgbSwKKwkJCSAgc3RydWN0IGkyb19tZXNzYWdlICptc2cpCit7CisJaWYgKGxlMzJfdG9fY3B1KG1zZy0+dS5oZWFkWzBdKSAmIE1TR19GQUlMKSB7CS8vIEZhaWwgYml0IGlzIHNldAorCQlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqcG1zZzsJLyogcHJlc2VydmVkIG1lc3NhZ2UgKi8KKwkJdTMyIHBtOworCisJCXBtID0gbGUzMl90b19jcHUobXNnLT5ib2R5WzNdKTsKKworCQlwbXNnID0gaTJvX21zZ19pbl90b192aXJ0KGMsIHBtKTsKKworCQlpMm9fcmVwb3J0X3N0YXR1cyhLRVJOX0lORk8sICJpMm9fY29yZSIsIG1zZyk7CisKKwkJLyogUmVsZWFzZSB0aGUgcHJlc2VydmVkIG1zZyBieSByZXN1Ym1pdHRpbmcgaXQgYXMgYSBOT1AgKi8KKwkJaTJvX21zZ19ub3AoYywgcG0pOworCisJCS8qIElmIHJlcGx5IHRvIGkyb19wb3N0X3dhaXQgZmFpbGVkLCByZXR1cm4gY2F1c2VzIGEgdGltZW91dCAqLworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGxlMzJfdG9fY3B1KG1zZy0+dS5zLnRjbnR4dCkgJiAweDgwMDAwMDAwKQorCQlyZXR1cm4gaTJvX21zZ19wb3N0X3dhaXRfY29tcGxldGUoYywgbSwgbXNnKTsKKworCWlmICgobGUzMl90b19jcHUobXNnLT51LmhlYWRbMV0pID4+IDI0KSA9PSBJMk9fQ01EX0xDVF9OT1RJRlkpIHsKKwkJc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrOworCisJCXByX2RlYnVnKCIlczogTENUIG5vdGlmeSByZWNlaXZlZFxuIiwgYy0+bmFtZSk7CisKKwkJd29yayA9IGttYWxsb2Moc2l6ZW9mKCp3b3JrKSwgR0ZQX0FUT01JQyk7CisJCWlmICghd29yaykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCUlOSVRfV09SSyh3b3JrLCAodm9pZCAoKikodm9pZCAqKSlpMm9fZXhlY19sY3RfbW9kaWZpZWQsIGMpOworCQlxdWV1ZV93b3JrKGkyb19leGVjX2RyaXZlci5ldmVudF9xdWV1ZSwgd29yayk7CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogSWYgdGhpcyBoYXBwZW5zLCB3ZSB3YW50IHRvIGR1bXAgdGhlIG1lc3NhZ2UgdG8gdGhlIHN5c2xvZyBzbworCSAqIGl0IGNhbiBiZSBzZW50IGJhY2sgdG8gdGhlIGNhcmQgbWFudWZhY3R1cmVyIGJ5IHRoZSBlbmQgdXNlcgorCSAqIHRvIGFpZCBpbiBkZWJ1Z2dpbmcuCisJICoKKwkgKi8KKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5zb2xpY2l0ZWQgbWVzc2FnZSByZXBseSBzZW50IHRvIGNvcmUhIgorCSAgICAgICAiTWVzc2FnZSBkdW1wZWQgdG8gc3lzbG9nXG4iLCBjLT5uYW1lKTsKKwlpMm9fZHVtcF9tZXNzYWdlKG1zZyk7CisKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworLyoqCisgKglpMm9fZXhlY19ldmVudCAtIEV2ZW50IGhhbmRsaW5nIGZ1bmN0aW9uCisgKglAZXZ0OiBFdmVudCB3aGljaCBvY2N1cnMKKyAqCisgKglIYW5kbGVzIGV2ZW50cyBzZW5kIGJ5IHRoZSBFeGVjdXRpdmUgZGV2aWNlLiBBdCB0aGUgbW9tZW50IGRvZXMgbm90IGRvCisgKglhbnl0aGluZyB1c2VmdWwuCisgKi8KK3N0YXRpYyB2b2lkIGkyb19leGVjX2V2ZW50KHN0cnVjdCBpMm9fZXZlbnQgKmV2dCkKK3sKKwlvc21faW5mbygiRXZlbnQgcmVjZWl2ZWQgZnJvbSBkZXZpY2U6ICVkXG4iLAorCQkgZXZ0LT5pMm9fZGV2LT5sY3RfZGF0YS50aWQpOworCWtmcmVlKGV2dCk7Cit9OworCisvKioKKyAqCWkyb19leGVjX2xjdF9nZXQgLSBHZXQgdGhlIElPUCdzIExvZ2ljYWwgQ29uZmlndXJhdGlvbiBUYWJsZQorICoJQGM6IEkyTyBjb250cm9sbGVyIGZyb20gd2hpY2ggdGhlIExDVCBzaG91bGQgYmUgZmV0Y2hlZAorICoKKyAqCVNlbmQgYSBMQ1QgTk9USUZZIHJlcXVlc3QgdG8gdGhlIGNvbnRyb2xsZXIsIGFuZCB3YWl0CisgKglJMk9fVElNRU9VVF9MQ1RfR0VUIHNlY29uZHMgdW50aWwgYXJyaXZhbCBvZiByZXNwb25zZS4gSWYgdGhlIExDVCBpcworICoJdG8gbGFyZ2UsIHJldHJ5IGl0LgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IGkyb19leGVjX2xjdF9nZXQoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdTMyIG07CisJaW50IGkgPSAwOworCWludCByYyA9IC1FQUdBSU47CisKKwlmb3IgKGkgPSAxOyBpIDw9IEkyT19MQ1RfR0VUX1RSSUVTOyBpKyspIHsKKwkJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCQlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCQl3cml0ZWwoRUlHSFRfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfNiwgJm1zZy0+dS5oZWFkWzBdKTsKKwkJd3JpdGVsKEkyT19DTURfTENUX05PVElGWSA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgQURBUFRFUl9USUQsCisJCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOworCQl3cml0ZWwoMHhmZmZmZmZmZiwgJm1zZy0+Ym9keVswXSk7CisJCXdyaXRlbCgweDAwMDAwMDAwLCAmbXNnLT5ib2R5WzFdKTsKKwkJd3JpdGVsKDB4ZDAwMDAwMDAgfCBjLT5kbGN0LmxlbiwgJm1zZy0+Ym9keVsyXSk7CisJCXdyaXRlbChjLT5kbGN0LnBoeXMsICZtc2ctPmJvZHlbM10pOworCisJCXJjID0gaTJvX21zZ19wb3N0X3dhaXQoYywgbSwgSTJPX1RJTUVPVVRfTENUX0dFVCk7CisJCWlmIChyYyA8IDApCisJCQlicmVhazsKKworCQlyYyA9IGkyb19kZXZpY2VfcGFyc2VfbGN0KGMpOworCQlpZiAocmMgIT0gLUVBR0FJTikKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyoqCisgKglpMm9fZXhlY19sY3Rfbm90aWZ5IC0gU2VuZCBhIGFzeW5jaHJvbnVzIExDVCBOT1RJRlkgcmVxdWVzdAorICoJQGM6IEkyTyBjb250cm9sbGVyIHRvIHdoaWNoIHRoZSByZXF1ZXN0IHNob3VsZCBiZSBzZW5kCisgKglAY2hhbmdlX2luZDogY2hhbmdlIGluZGljYXRvcgorICoKKyAqCVRoaXMgZnVuY3Rpb24gc2VuZHMgYSBMQ1QgTk9USUZZIHJlcXVlc3QgdG8gdGhlIEkyTyBjb250cm9sbGVyIHdpdGgKKyAqCXRoZSBjaGFuZ2UgaW5kaWNhdG9yIGNoYW5nZV9pbmQuIElmIHRoZSBjaGFuZ2VfaW5kID09IDAgdGhlIGNvbnRyb2xsZXIKKyAqCXJlcGxpZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHJlcXVlc3QuIElmIGNoYW5nZV9pbmQgPiAwIHRoZSByZXBseSBpcworICoJc2VuZCBhZnRlciBjaGFuZ2UgaW5kaWNhdG9yIG9mIHRoZSBMQ1QgaXMgPiBjaGFuZ2VfaW5kLgorICovCitzdGF0aWMgaW50IGkyb19leGVjX2xjdF9ub3RpZnkoc3RydWN0IGkyb19jb250cm9sbGVyICpjLCB1MzIgY2hhbmdlX2luZCkKK3sKKwlpMm9fc3RhdHVzX2Jsb2NrICpzYiA9IGMtPnN0YXR1c19ibG9jay52aXJ0OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXUzMiBtOworCisJZGV2ID0gJmMtPnBkZXYtPmRldjsKKworCWlmIChpMm9fZG1hX3JlYWxsb2MoZGV2LCAmYy0+ZGxjdCwgc2ItPmV4cGVjdGVkX2xjdF9zaXplLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltID0gaTJvX21zZ19nZXRfd2FpdChjLCAmbXNnLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7CisJaWYgKG0gPT0gSTJPX1FVRVVFX0VNUFRZKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCXdyaXRlbChFSUdIVF9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF82LCAmbXNnLT51LmhlYWRbMF0pOworCXdyaXRlbChJMk9fQ01EX0xDVF9OT1RJRlkgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IEFEQVBURVJfVElELAorCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOworCXdyaXRlbChpMm9fZXhlY19kcml2ZXIuY29udGV4dCwgJm1zZy0+dS5zLmljbnR4dCk7CisJd3JpdGVsKDAsICZtc2ctPnUucy50Y250eHQpOwkvKiBGSVhNRSAqLworCXdyaXRlbCgweGZmZmZmZmZmLCAmbXNnLT5ib2R5WzBdKTsKKwl3cml0ZWwoY2hhbmdlX2luZCwgJm1zZy0+Ym9keVsxXSk7CisJd3JpdGVsKDB4ZDAwMDAwMDAgfCBjLT5kbGN0LmxlbiwgJm1zZy0+Ym9keVsyXSk7CisJd3JpdGVsKGMtPmRsY3QucGh5cywgJm1zZy0+Ym9keVszXSk7CisKKwlpMm9fbXNnX3Bvc3QoYywgbSk7CisKKwlyZXR1cm4gMDsKK307CisKKy8qIEV4ZWMgT1NNIGRyaXZlciBzdHJ1Y3QgKi8KK3N0cnVjdCBpMm9fZHJpdmVyIGkyb19leGVjX2RyaXZlciA9IHsKKwkubmFtZSA9IE9TTV9OQU1FLAorCS5yZXBseSA9IGkyb19leGVjX3JlcGx5LAorCS5ldmVudCA9IGkyb19leGVjX2V2ZW50LAorCS5jbGFzc2VzID0gaTJvX2V4ZWNfY2xhc3NfaWQsCisJLmRyaXZlciA9IHsKKwkJICAgLnByb2JlID0gaTJvX2V4ZWNfcHJvYmUsCisJCSAgIC5yZW1vdmUgPSBpMm9fZXhlY19yZW1vdmUsCisJCSAgIH0sCit9OworCisvKioKKyAqCWkyb19leGVjX2luaXQgLSBSZWdpc3RlcnMgdGhlIEV4ZWMgT1NNCisgKgorICoJUmVnaXN0ZXJzIHRoZSBFeGVjIE9TTSBpbiB0aGUgSTJPIGNvcmUuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgX19pbml0IGkyb19leGVjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJvX2RyaXZlcl9yZWdpc3RlcigmaTJvX2V4ZWNfZHJpdmVyKTsKK307CisKKy8qKgorICoJaTJvX2V4ZWNfZXhpdCAtIFJlbW92ZXMgdGhlIEV4ZWMgT1NNCisgKgorICoJVW5yZWdpc3RlcnMgdGhlIEV4ZWMgT1NNIGZyb20gdGhlIEkyTyBjb3JlLgorICovCit2b2lkIF9fZXhpdCBpMm9fZXhlY19leGl0KHZvaWQpCit7CisJaTJvX2RyaXZlcl91bnJlZ2lzdGVyKCZpMm9fZXhlY19kcml2ZXIpOworfTsKKworRVhQT1JUX1NZTUJPTChpMm9fbXNnX3Bvc3Rfd2FpdF9tZW0pOworRVhQT1JUX1NZTUJPTChpMm9fZXhlY19sY3RfZ2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNzRjODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5jCkBAIC0wLDAgKzEsMTI0NyBAQAorLyoKKyAqCUJsb2NrIE9TTQorICoKKyAqIAlDb3B5cmlnaHQgKEMpIDE5OTktMjAwMglSZWQgSGF0IFNvZnR3YXJlCisgKgorICoJV3JpdHRlbiBieSBBbGFuIENveCwgQnVpbGRpbmcgTnVtYmVyIFRocmVlIEx0ZAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqCW9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICoJV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqCUdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglGb3IgdGhlIHB1cnBvc2Ugb2YgYXZvaWRpbmcgZG91YnQgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrCisgKglmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMgc2hhbGwgYmUgYSBzdGFuZGFyZHMgY29tcGxpYW50IGZvcm0gc3VjaAorICoJZ3ppcHBlZCB0YXIgYW5kIG5vdCBvbmUgcmVxdWlyaW5nIGEgcHJvcHJpZXRhcnkgb3IgcGF0ZW50IGVuY3VtYmVyZWQKKyAqCXRvb2wgdG8gdW5wYWNrLgorICoKKyAqCUZpeGVzL2FkZGl0aW9uczoKKyAqCQlTdGV2ZSBSYWxzdG9uOgorICoJCQlNdWx0aXBsZSBkZXZpY2UgaGFuZGxpbmcgZXJyb3IgZml4ZXMsCisgKgkJCUFkZGVkIGEgcXVldWUgZGVwdGguCisgKgkJQWxhbiBDb3g6CisgKgkJCUZDOTIwIGhhcyBhbiBybXcgYnVnLiBEb250IG9yIGluIHRoZSBlbmQgbWFya2VyLgorICoJCQlSZW1vdmVkIHF1ZXVlIHdhbGssIGZpeGVkIGZvciA2NGJpdG5lc3MuCisgKgkJCVJld3JvdGUgbXVjaCBvZiB0aGUgY29kZSBvdmVyIHRpbWUKKyAqCQkJQWRkZWQgaW5kaXJlY3QgYmxvY2sgbGlzdHMKKyAqCQkJSGFuZGxlIDY0SyBsaW1pdHMgb24gbWFueSBjb250cm9sbGVycworICoJCQlEb24ndCB1c2UgaW5kaXJlY3RzIG9uIHRoZSBQcm9taXNlIChicmVha3MpCisgKgkJCUhlYXZpbHkgY2hvcCBkb3duIHRoZSBxdWV1ZSBkZXB0aHMKKyAqCQlEZWVwYWsgU2F4ZW5hOgorICoJCQlJbmRlcGVuZGVudCBxdWV1ZXMgcGVyIElPUAorICoJCQlTdXBwb3J0IGZvciBkeW5hbWljIGRldmljZSBjcmVhdGlvbi9kZWxldGlvbgorICoJCQlDb2RlIGNsZWFudXAKKyAqCSAgICAJCVN1cHBvcnQgZm9yIGxhcmdlciBJL09zIHRocm91Z2ggbWVyZ2UqIGZ1bmN0aW9ucworICoJCQkodGFrZW4gZnJvbSBEQUM5NjAgZHJpdmVyKQorICoJCUJvamkgVCBLYW5uYW50aGFuYW06CisgKgkJCVNldCB0aGUgSTJPIEJsb2NrIGRldmljZXMgdG8gYmUgZGV0ZWN0ZWQgaW4gaW5jcmVhc2luZworICoJCQlvcmRlciBvZiBUSURzIGR1cmluZyBib290LgorICoJCQlTZWFyY2ggYW5kIHNldCB0aGUgSTJPIGJsb2NrIGRldmljZSB0aGF0IHdlIGJvb3Qgb2ZmCisgKgkJCWZyb20gYXMgdGhlIGZpcnN0IGRldmljZSB0byBiZSBjbGFpbWVkIChhcyAvZGV2L2kyby9oZGEpCisgKgkJCVByb3Blcmx5IGF0dGFjaC9kZXRhY2ggSTJPIGdlbmRpc2sgc3RydWN0dXJlIGZyb20gdGhlCisgKgkJCXN5c3RlbSBnZW5kaXNrIGxpc3QuIFRoZSBJMk8gYmxvY2sgZGV2aWNlcyBub3cgYXBwZWFyIGluCisgKgkJCS9wcm9jL3BhcnRpdGlvbnMuCisgKgkJTWFya3VzIExpZGVsIDxNYXJrdXMuTGlkZWxAc2hhZG93Y29ubmVjdC5jb20+OgorICoJCQlNaW5vciBidWdmaXhlcyBmb3IgMi42LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMm8uaD4KKworI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKworI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKworI2luY2x1ZGUgImkyb19ibG9jay5oIgorCisjZGVmaW5lIE9TTV9OQU1FCSJibG9jay1vc20iCisjZGVmaW5lIE9TTV9WRVJTSU9OCSIkUmV2JCIKKyNkZWZpbmUgT1NNX0RFU0NSSVBUSU9OCSJJMk8gQmxvY2sgRGV2aWNlIE9TTSIKKworc3RhdGljIHN0cnVjdCBpMm9fZHJpdmVyIGkyb19ibG9ja19kcml2ZXI7CisKKy8qIGdsb2JhbCBCbG9jayBPU00gcmVxdWVzdCBtZW1wb29sICovCitzdGF0aWMgc3RydWN0IGkyb19ibG9ja19tZW1wb29sIGkyb19ibGtfcmVxX3Bvb2w7CisKKy8qIEJsb2NrIE9TTSBjbGFzcyBoYW5kbGluZyBkZWZpbml0aW9uICovCitzdGF0aWMgc3RydWN0IGkyb19jbGFzc19pZCBpMm9fYmxvY2tfY2xhc3NfaWRbXSA9IHsKKwl7STJPX0NMQVNTX1JBTkRPTV9CTE9DS19TVE9SQUdFfSwKKwl7STJPX0NMQVNTX0VORH0KK307CisKKy8qKgorICoJaTJvX2Jsb2NrX2RldmljZV9mcmVlIC0gZnJlZSB0aGUgbWVtb3J5IG9mIHRoZSBJMk8gQmxvY2sgZGV2aWNlCisgKglAZGV2OiBJMk8gQmxvY2sgZGV2aWNlLCB3aGljaCBzaG91bGQgYmUgY2xlYW5lZCB1cAorICoKKyAqCUZyZWVzIHRoZSByZXF1ZXN0IHF1ZXVlLCBnZW5kaXNrIGFuZCB0aGUgaTJvX2Jsb2NrX2RldmljZSBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkIGkyb19ibG9ja19kZXZpY2VfZnJlZShzdHJ1Y3QgaTJvX2Jsb2NrX2RldmljZSAqZGV2KQoreworCWJsa19jbGVhbnVwX3F1ZXVlKGRldi0+Z2QtPnF1ZXVlKTsKKworCXB1dF9kaXNrKGRldi0+Z2QpOworCisJa2ZyZWUoZGV2KTsKK307CisKKy8qKgorICoJaTJvX2Jsb2NrX3JlbW92ZSAtIHJlbW92ZSB0aGUgSTJPIEJsb2NrIGRldmljZSBmcm9tIHRoZSBzeXN0ZW0gYWdhaW4KKyAqCUBkZXY6IEkyTyBCbG9jayBkZXZpY2Ugd2hpY2ggc2hvdWxkIGJlIHJlbW92ZWQKKyAqCisgKglSZW1vdmUgZ2VuZGlzayBmcm9tIHN5c3RlbSBhbmQgZnJlZSBhbGwgYWxsb2NhdGVkIG1lbW9yeS4KKyAqCisgKglBbHdheXMgcmV0dXJucyAwLgorICovCitzdGF0aWMgaW50IGkyb19ibG9ja19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2ID0gdG9faTJvX2RldmljZShkZXYpOworCXN0cnVjdCBpMm9fYmxvY2tfZGV2aWNlICppMm9fYmxrX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJb3NtX2luZm8oIkRldmljZSByZW1vdmVkICVzXG4iLCBpMm9fYmxrX2Rldi0+Z2QtPmRpc2tfbmFtZSk7CisKKwlpMm9fZXZlbnRfcmVnaXN0ZXIoaTJvX2RldiwgJmkyb19ibG9ja19kcml2ZXIsIDAsIDApOworCisJZGVsX2dlbmRpc2soaTJvX2Jsa19kZXYtPmdkKTsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCisJaTJvX2RldmljZV9jbGFpbV9yZWxlYXNlKGkyb19kZXYpOworCisJaTJvX2Jsb2NrX2RldmljZV9mcmVlKGkyb19ibGtfZGV2KTsKKworCXJldHVybiAwOworfTsKKworLyoqCisgKglpMm9fYmxvY2tfZGV2aWNlIGZsdXNoIC0gRmx1c2ggYWxsIGRpcnR5IGRhdGEgb2YgSTJPIGRldmljZSBkZXYKKyAqCUBkZXY6IEkyTyBkZXZpY2Ugd2hpY2ggc2hvdWxkIGJlIGZsdXNoZWQKKyAqCisgKglGbHVzaGVzIGFsbCBkaXJ0eSBkYXRhIG9uIGRldmljZSBkZXYuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGkyb19ibG9ja19kZXZpY2VfZmx1c2goc3RydWN0IGkyb19kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXUzMiBtOworCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoZGV2LT5pb3AsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJd3JpdGVsKEZJVkVfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfMCwgJm1zZy0+dS5oZWFkWzBdKTsKKwl3cml0ZWwoSTJPX0NNRF9CTE9DS19DRkxVU0ggPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IGRldi0+bGN0X2RhdGEudGlkLAorCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOworCXdyaXRlbCg2MCA8PCAxNiwgJm1zZy0+Ym9keVswXSk7CisJb3NtX2RlYnVnKCJGbHVzaGluZy4uLlxuIik7CisKKwlyZXR1cm4gaTJvX21zZ19wb3N0X3dhaXQoZGV2LT5pb3AsIG0sIDYwKTsKK307CisKKy8qKgorICoJaTJvX2Jsb2NrX2RldmljZV9tb3VudCAtIE1vdW50IChsb2FkKSB0aGUgbWVkaWEgb2YgZGV2aWNlIGRldgorICoJQGRldjogSTJPIGRldmljZSB3aGljaCBzaG91bGQgcmVjZWl2ZSB0aGUgbW91bnQgcmVxdWVzdAorICoJQG1lZGlhX2lkOiBNZWRpYSBJZGVudGlmaWVyCisgKgorICoJTG9hZCBhIG1lZGlhIGludG8gZHJpdmUuIElkZW50aWZpZXIgc2hvdWxkIGJlIHNldCB0byAtMSwgYmVjYXVzZSB0aGUKKyAqCXNwZWMgZG9lcyBub3Qgc3VwcG9ydCBhbnkgb3RoZXIgdmFsdWUuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGkyb19ibG9ja19kZXZpY2VfbW91bnQoc3RydWN0IGkyb19kZXZpY2UgKmRldiwgdTMyIG1lZGlhX2lkKQoreworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdTMyIG07CisKKwltID0gaTJvX21zZ19nZXRfd2FpdChkZXYtPmlvcCwgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwl3cml0ZWwoRklWRV9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF8wLCAmbXNnLT51LmhlYWRbMF0pOworCXdyaXRlbChJMk9fQ01EX0JMT0NLX01NT1VOVCA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgZGV2LT5sY3RfZGF0YS50aWQsCisJICAgICAgICZtc2ctPnUuaGVhZFsxXSk7CisJd3JpdGVsKC0xLCAmbXNnLT5ib2R5WzBdKTsKKwl3cml0ZWwoMCwgJm1zZy0+Ym9keVsxXSk7CisJb3NtX2RlYnVnKCJNb3VudGluZy4uLlxuIik7CisKKwlyZXR1cm4gaTJvX21zZ19wb3N0X3dhaXQoZGV2LT5pb3AsIG0sIDIpOworfTsKKworLyoqCisgKglpMm9fYmxvY2tfZGV2aWNlX2xvY2sgLSBMb2NrcyB0aGUgbWVkaWEgb2YgZGV2aWNlIGRldgorICoJQGRldjogSTJPIGRldmljZSB3aGljaCBzaG91bGQgcmVjZWl2ZSB0aGUgbG9jayByZXF1ZXN0CisgKglAbWVkaWFfaWQ6IE1lZGlhIElkZW50aWZpZXIKKyAqCisgKglMb2NrIG1lZGlhIG9mIGRldmljZSBkZXYgdG8gcHJldmVudCByZW1vdmFsLiBUaGUgbWVkaWEgaWRlbnRpZmllcgorICoJc2hvdWxkIGJlIHNldCB0byAtMSwgYmVjYXVzZSB0aGUgc3BlYyBkb2VzIG5vdCBzdXBwb3J0IGFueSBvdGhlciB2YWx1ZS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgaTJvX2Jsb2NrX2RldmljZV9sb2NrKHN0cnVjdCBpMm9fZGV2aWNlICpkZXYsIHUzMiBtZWRpYV9pZCkKK3sKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXUzMiBtOworCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoZGV2LT5pb3AsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJd3JpdGVsKEZJVkVfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfMCwgJm1zZy0+dS5oZWFkWzBdKTsKKwl3cml0ZWwoSTJPX0NNRF9CTE9DS19NTE9DSyA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgZGV2LT5sY3RfZGF0YS50aWQsCisJICAgICAgICZtc2ctPnUuaGVhZFsxXSk7CisJd3JpdGVsKC0xLCAmbXNnLT5ib2R5WzBdKTsKKwlvc21fZGVidWcoIkxvY2tpbmcuLi5cbiIpOworCisJcmV0dXJuIGkyb19tc2dfcG9zdF93YWl0KGRldi0+aW9wLCBtLCAyKTsKK307CisKKy8qKgorICoJaTJvX2Jsb2NrX2RldmljZV91bmxvY2sgLSBVbmxvY2tzIHRoZSBtZWRpYSBvZiBkZXZpY2UgZGV2CisgKglAZGV2OiBJMk8gZGV2aWNlIHdoaWNoIHNob3VsZCByZWNlaXZlIHRoZSB1bmxvY2tlZCByZXF1ZXN0CisgKglAbWVkaWFfaWQ6IE1lZGlhIElkZW50aWZpZXIKKyAqCisgKglVbmxvY2tzIHRoZSBtZWRpYSBpbiBkZXZpY2UgZGV2LiBUaGUgbWVkaWEgaWRlbnRpZmllciBzaG91bGQgYmUgc2V0IHRvCisgKgktMSwgYmVjYXVzZSB0aGUgc3BlYyBkb2VzIG5vdCBzdXBwb3J0IGFueSBvdGhlciB2YWx1ZS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgaTJvX2Jsb2NrX2RldmljZV91bmxvY2soc3RydWN0IGkyb19kZXZpY2UgKmRldiwgdTMyIG1lZGlhX2lkKQoreworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdTMyIG07CisKKwltID0gaTJvX21zZ19nZXRfd2FpdChkZXYtPmlvcCwgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwl3cml0ZWwoRklWRV9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF8wLCAmbXNnLT51LmhlYWRbMF0pOworCXdyaXRlbChJMk9fQ01EX0JMT0NLX01VTkxPQ0sgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IGRldi0+bGN0X2RhdGEudGlkLAorCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOworCXdyaXRlbChtZWRpYV9pZCwgJm1zZy0+Ym9keVswXSk7CisJb3NtX2RlYnVnKCJVbmxvY2tpbmcuLi5cbiIpOworCisJcmV0dXJuIGkyb19tc2dfcG9zdF93YWl0KGRldi0+aW9wLCBtLCAyKTsKK307CisKKy8qKgorICoJaTJvX2Jsb2NrX2RldmljZV9wb3dlciAtIFBvd2VyIG1hbmFnZW1lbnQgZm9yIGRldmljZSBkZXYKKyAqCUBkZXY6IEkyTyBkZXZpY2Ugd2hpY2ggc2hvdWxkIHJlY2VpdmUgdGhlIHBvd2VyIG1hbmFnZW1lbnQgcmVxdWVzdAorICoJQG9wZXJhdGlvbjogT3BlcmF0aW9uIHdoaWNoIHNob3VsZCBiZSBzZW5kCisgKgorICoJU2VuZCBhIHBvd2VyIG1hbmFnZW1lbnQgcmVxdWVzdCB0byB0aGUgZGV2aWNlIGRldi4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgaTJvX2Jsb2NrX2RldmljZV9wb3dlcihzdHJ1Y3QgaTJvX2Jsb2NrX2RldmljZSAqZGV2LCB1OCBvcCkKK3sKKwlzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldiA9IGRldi0+aTJvX2RldjsKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMgPSBpMm9fZGV2LT5pb3A7CisJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZzsKKwl1MzIgbTsKKwlpbnQgcmM7CisKKwltID0gaTJvX21zZ19nZXRfd2FpdChjLCAmbXNnLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7CisJaWYgKG0gPT0gSTJPX1FVRVVFX0VNUFRZKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCXdyaXRlbChGT1VSX1dPUkRfTVNHX1NJWkUgfCBTR0xfT0ZGU0VUXzAsICZtc2ctPnUuaGVhZFswXSk7CisJd3JpdGVsKEkyT19DTURfQkxPQ0tfUE9XRVIgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IGkyb19kZXYtPmxjdF9kYXRhLgorCSAgICAgICB0aWQsICZtc2ctPnUuaGVhZFsxXSk7CisJd3JpdGVsKG9wIDw8IDI0LCAmbXNnLT5ib2R5WzBdKTsKKwlvc21fZGVidWcoIlBvd2VyLi4uXG4iKTsKKworCXJjID0gaTJvX21zZ19wb3N0X3dhaXQoYywgbSwgNjApOworCWlmICghcmMpCisJCWRldi0+cG93ZXIgPSBvcDsKKworCXJldHVybiByYzsKK307CisKKy8qKgorICoJaTJvX2Jsb2NrX3JlcXVlc3RfYWxsb2MgLSBBbGxvY2F0ZSBhbiBJMk8gYmxvY2sgcmVxdWVzdCBzdHJ1Y3QKKyAqCisgKglBbGxvY2F0ZXMgYW4gSTJPIGJsb2NrIHJlcXVlc3Qgc3RydWN0IGFuZCBpbml0aWFsaXplIHRoZSBsaXN0LgorICoKKyAqCVJldHVybnMgYSBpMm9fYmxvY2tfcmVxdWVzdCBwb2ludGVyIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZQorICoJb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaTJvX2Jsb2NrX3JlcXVlc3QgKmkyb19ibG9ja19yZXF1ZXN0X2FsbG9jKHZvaWQpCit7CisJc3RydWN0IGkyb19ibG9ja19yZXF1ZXN0ICppcmVxOworCisJaXJlcSA9IG1lbXBvb2xfYWxsb2MoaTJvX2Jsa19yZXFfcG9vbC5wb29sLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWlyZXEpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJSU5JVF9MSVNUX0hFQUQoJmlyZXEtPnF1ZXVlKTsKKworCXJldHVybiBpcmVxOworfTsKKworLyoqCisgKglpMm9fYmxvY2tfcmVxdWVzdF9mcmVlIC0gRnJlZXMgYSBJMk8gYmxvY2sgcmVxdWVzdAorICoJQGlyZXE6IEkyTyBibG9jayByZXF1ZXN0IHdoaWNoIHNob3VsZCBiZSBmcmVlZAorICoKKyAqCUZyZXMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgKGdpdmUgaXQgYmFjayB0byB0aGUgcmVxdWVzdCBtZW1wb29sKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGkyb19ibG9ja19yZXF1ZXN0X2ZyZWUoc3RydWN0IGkyb19ibG9ja19yZXF1ZXN0ICppcmVxKQoreworCW1lbXBvb2xfZnJlZShpcmVxLCBpMm9fYmxrX3JlcV9wb29sLnBvb2wpOworfTsKKworLyoqCisgKglpMm9fYmxvY2tfc2dsaXN0X2FsbG9jIC0gQWxsb2NhdGUgdGhlIFNHIGxpc3QgYW5kIG1hcCBpdAorICoJQGlyZXE6IEkyTyBibG9jayByZXF1ZXN0CisgKgorICoJQnVpbGRzIHRoZSBTRyBsaXN0IGFuZCBtYXAgaXQgaW50byB0byBiZSBhY2Nlc3NhYmxlIGJ5IHRoZSBjb250cm9sbGVyLgorICoKKyAqCVJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgU0cgbGlzdCBvciAwIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGkyb19ibG9ja19zZ2xpc3RfYWxsb2Moc3RydWN0IGkyb19ibG9ja19yZXF1ZXN0ICppcmVxKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpcmVxLT5pMm9fYmxrX2Rldi0+aTJvX2Rldi0+aW9wLT5wZGV2LT5kZXY7CisJaW50IG5lbnRzOworCisJbmVudHMgPSBibGtfcnFfbWFwX3NnKGlyZXEtPnJlcS0+cSwgaXJlcS0+cmVxLCBpcmVxLT5zZ190YWJsZSk7CisKKwlpZiAocnFfZGF0YV9kaXIoaXJlcS0+cmVxKSA9PSBSRUFEKQorCQlpcmVxLT5zZ19kbWFfZGlyZWN0aW9uID0gUENJX0RNQV9GUk9NREVWSUNFOworCWVsc2UKKwkJaXJlcS0+c2dfZG1hX2RpcmVjdGlvbiA9IFBDSV9ETUFfVE9ERVZJQ0U7CisKKwlpcmVxLT5zZ19uZW50cyA9IGRtYV9tYXBfc2coZGV2LCBpcmVxLT5zZ190YWJsZSwgbmVudHMsCisJCQkJICAgIGlyZXEtPnNnX2RtYV9kaXJlY3Rpb24pOworCisJcmV0dXJuIGlyZXEtPnNnX25lbnRzOworfTsKKworLyoqCisgKglpMm9fYmxvY2tfc2dsaXN0X2ZyZWUgLSBGcmVlcyB0aGUgU0cgbGlzdAorICoJQGlyZXE6IEkyTyBibG9jayByZXF1ZXN0IGZyb20gd2hpY2ggdGhlIFNHIHNob3VsZCBiZSBmcmVlZAorICoKKyAqCUZyZWVzIHRoZSBTRyBsaXN0IGZyb20gdGhlIEkyTyBibG9jayByZXF1ZXN0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaTJvX2Jsb2NrX3NnbGlzdF9mcmVlKHN0cnVjdCBpMm9fYmxvY2tfcmVxdWVzdCAqaXJlcSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXJlcS0+aTJvX2Jsa19kZXYtPmkyb19kZXYtPmlvcC0+cGRldi0+ZGV2OworCisJZG1hX3VubWFwX3NnKGRldiwgaXJlcS0+c2dfdGFibGUsIGlyZXEtPnNnX25lbnRzLAorCQkgICAgIGlyZXEtPnNnX2RtYV9kaXJlY3Rpb24pOworfTsKKworLyoqCisgKglpMm9fYmxvY2tfcHJlcF9yZXFfZm4gLSBBbGxvY2F0ZXMgSTJPIGJsb2NrIGRldmljZSBzcGVjaWZpYyBzdHJ1Y3QKKyAqCUBxOiByZXF1ZXN0IHF1ZXVlIGZvciB0aGUgcmVxdWVzdAorICoJQHJlcTogdGhlIHJlcXVlc3QgdG8gcHJlcGFyZQorICoKKyAqCUFsbG9jYXRlIHRoZSBuZWNlc3NhcnkgaTJvX2Jsb2NrX3JlcXVlc3Qgc3RydWN0IGFuZCBjb25uZWN0IGl0IHRvCisgKgl0aGUgcmVxdWVzdC4gVGhpcyBpcyBuZWVkZWQgdGhhdCB3ZSBub3QgbG9vc2UgdGhlIFNHIGxpc3QgbGF0ZXIgb24uCisgKgorICoJUmV0dXJucyBCTEtQUkVQX09LIG9uIHN1Y2Nlc3Mgb3IgQkxLUFJFUF9ERUZFUiBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGkyb19ibG9ja19wcmVwX3JlcV9mbihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgaTJvX2Jsb2NrX2RldmljZSAqaTJvX2Jsa19kZXYgPSBxLT5xdWV1ZWRhdGE7CisJc3RydWN0IGkyb19ibG9ja19yZXF1ZXN0ICppcmVxOworCisJLyogcmVxdWVzdCBpcyBhbHJlYWR5IHByb2Nlc3NlZCBieSB1cywgc28gcmV0dXJuICovCisJaWYgKHJlcS0+ZmxhZ3MgJiBSRVFfU1BFQ0lBTCkgeworCQlvc21fZGVidWcoIlJFUV9TUEVDSUFMIGFscmVhZHkgc2V0IVxuIik7CisJCXJlcS0+ZmxhZ3MgfD0gUkVRX0RPTlRQUkVQOworCQlyZXR1cm4gQkxLUFJFUF9PSzsKKwl9CisKKwkvKiBjb25uZWN0IHRoZSBpMm9fYmxvY2tfcmVxdWVzdCB0byB0aGUgcmVxdWVzdCAqLworCWlmICghcmVxLT5zcGVjaWFsKSB7CisJCWlyZXEgPSBpMm9fYmxvY2tfcmVxdWVzdF9hbGxvYygpOworCQlpZiAodW5saWtlbHkoSVNfRVJSKGlyZXEpKSkgeworCQkJb3NtX2RlYnVnKCJ1bmFibGUgdG8gYWxsb2NhdGUgaTJvX2Jsb2NrX3JlcXVlc3QhXG4iKTsKKwkJCXJldHVybiBCTEtQUkVQX0RFRkVSOworCQl9CisKKwkJaXJlcS0+aTJvX2Jsa19kZXYgPSBpMm9fYmxrX2RldjsKKwkJcmVxLT5zcGVjaWFsID0gaXJlcTsKKwkJaXJlcS0+cmVxID0gcmVxOworCX0gZWxzZQorCQlpcmVxID0gcmVxLT5zcGVjaWFsOworCisJLyogZG8gbm90IGNvbWUgYmFjayBoZXJlICovCisJcmVxLT5mbGFncyB8PSBSRVFfRE9OVFBSRVAgfCBSRVFfU1BFQ0lBTDsKKworCXJldHVybiBCTEtQUkVQX09LOworfTsKKworLyoqCisgKglpMm9fYmxvY2tfZGVsYXllZF9yZXF1ZXN0X2ZuIC0gZGVsYXllZCByZXF1ZXN0IHF1ZXVlIGZ1bmN0aW9uCisgKglkZWxheWVkX3JlcXVlc3Q6IHRoZSBkZWxheWVkIHJlcXVlc3Qgd2l0aCB0aGUgcXVldWUgdG8gc3RhcnQKKyAqCisgKglJZiB0aGUgcmVxdWVzdCBxdWV1ZSBpcyBzdG9wcGVkIGZvciBhIGRpc2ssIGFuZCB0aGVyZSBpcyBubyBvcGVuCisgKglyZXF1ZXN0LCBhIG5ldyBldmVudCBpcyBjcmVhdGVkLCB3aGljaCBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIHN0YXJ0CisgKgl0aGUgcXVldWUgYWZ0ZXIgSTJPX0JMT0NLX1JFUVVFU1RfVElNRS4gT3RoZXJ3aXNlIHRoZSBxdWV1ZSB3aWxsIG5ldmVyCisgKgliZSBzdGFydGVkIGFnYWluLgorICovCitzdGF0aWMgdm9pZCBpMm9fYmxvY2tfZGVsYXllZF9yZXF1ZXN0X2ZuKHZvaWQgKmRlbGF5ZWRfcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgaTJvX2Jsb2NrX2RlbGF5ZWRfcmVxdWVzdCAqZHJlcSA9IGRlbGF5ZWRfcmVxdWVzdDsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGRyZXEtPnF1ZXVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJYmxrX3N0YXJ0X3F1ZXVlKHEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCWtmcmVlKGRyZXEpOworfTsKKworLyoqCisgKglpMm9fYmxvY2tfcmVwbHkgLSBCbG9jayBPU00gcmVwbHkgaGFuZGxlci4KKyAqCUBjOiBJMk8gY29udHJvbGxlciBmcm9tIHdoaWNoIHRoZSBtZXNzYWdlIGFycml2ZXMKKyAqCUBtOiBtZXNzYWdlIGlkIG9mIHJlcGx5CisgKglxbXNnOiB0aGUgYWN0dWFsbCBJMk8gbWVzc2FnZSByZXBseQorICoKKyAqCVRoaXMgZnVuY3Rpb24gZ2V0cyBhbGwgdGhlIG1lc3NhZ2UgcmVwbGllcy4KKyAqCisgKi8KK3N0YXRpYyBpbnQgaTJvX2Jsb2NrX3JlcGx5KHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdTMyIG0sCisJCQkgICBzdHJ1Y3QgaTJvX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3QgaTJvX2Jsb2NrX3JlcXVlc3QgKmlyZXE7CisJc3RydWN0IHJlcXVlc3QgKnJlcTsKKwlzdHJ1Y3QgaTJvX2Jsb2NrX2RldmljZSAqZGV2OworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxOworCXU4IHN0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBGQUlMZWQgbWVzc2FnZSAqLworCWlmICh1bmxpa2VseShsZTMyX3RvX2NwdShtc2ctPnUuaGVhZFswXSkgJiAoMSA8PCAxMykpKSB7CisJCXN0cnVjdCBpMm9fbWVzc2FnZSAqcG1zZzsKKwkJdTMyIHBtOworCisJCS8qCisJCSAqIEZBSUxlZCBtZXNzYWdlIGZyb20gY29udHJvbGxlcgorCQkgKiBXZSBpbmNyZW1lbnQgdGhlIGVycm9yIGNvdW50IGFuZCBhYm9ydCBpdAorCQkgKgorCQkgKiBJbiB0aGVvcnkgdGhpcyB3aWxsIG5ldmVyIGhhcHBlbi4gIFRoZSBJMk8gYmxvY2sgY2xhc3MKKwkJICogc3BlY2lmaWNhdGlvbiBzdGF0ZXMgdGhhdCBibG9jayBkZXZpY2VzIG5ldmVyIHJldHVybgorCQkgKiBGQUlMcyBidXQgaW5zdGVhZCB1c2UgdGhlIFJFUSBzdGF0dXMgZmllbGQuLi5idXQKKwkJICogYmV0dGVyIGJlIG9uIHRoZSBzYWZlIHNpZGUgc2luY2Ugbm8gb25lIHJlYWxseSBmb2xsb3dzCisJCSAqIHRoZSBzcGVjIHRvIHRoZSBib29rIDopCisJCSAqLworCQlwbSA9IGxlMzJfdG9fY3B1KG1zZy0+Ym9keVszXSk7CisJCXBtc2cgPSBpMm9fbXNnX2luX3RvX3ZpcnQoYywgcG0pOworCisJCXJlcSA9IGkyb19jbnR4dF9saXN0X2dldChjLCBsZTMyX3RvX2NwdShwbXNnLT51LnMudGNudHh0KSk7CisJCWlmICh1bmxpa2VseSghcmVxKSkgeworCQkJb3NtX2VycigiTlVMTCByZXBseSByZWNlaXZlZCFcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaXJlcSA9IHJlcS0+c3BlY2lhbDsKKwkJZGV2ID0gaXJlcS0+aTJvX2Jsa19kZXY7CisJCXEgPSBkZXYtPmdkLT5xdWV1ZTsKKworCQlyZXEtPmVycm9ycysrOworCisJCXNwaW5fbG9ja19pcnFzYXZlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCQl3aGlsZSAoZW5kX3RoYXRfcmVxdWVzdF9jaHVuayhyZXEsICFyZXEtPmVycm9ycywKKwkJCQkJICAgICAgbGUzMl90b19jcHUocG1zZy0+Ym9keVsxXSkpKSA7CisJCWVuZF90aGF0X3JlcXVlc3RfbGFzdChyZXEpOworCisJCWRldi0+b3Blbl9xdWV1ZV9kZXB0aC0tOworCQlsaXN0X2RlbCgmaXJlcS0+cXVldWUpOworCQlibGtfc3RhcnRfcXVldWUocSk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwkJLyogTm93IGZsdXNoIHRoZSBtZXNzYWdlIGJ5IG1ha2luZyBpdCBhIE5PUCAqLworCQlpMm9fbXNnX25vcChjLCBwbSk7CisKKwkJcmV0dXJuIC0xOworCX0KKworCXJlcSA9IGkyb19jbnR4dF9saXN0X2dldChjLCBsZTMyX3RvX2NwdShtc2ctPnUucy50Y250eHQpKTsKKwlpZiAodW5saWtlbHkoIXJlcSkpIHsKKwkJb3NtX2VycigiTlVMTCByZXBseSByZWNlaXZlZCFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaXJlcSA9IHJlcS0+c3BlY2lhbDsKKwlkZXYgPSBpcmVxLT5pMm9fYmxrX2RldjsKKwlxID0gZGV2LT5nZC0+cXVldWU7CisKKwlpZiAodW5saWtlbHkoIWRldi0+aTJvX2RldikpIHsKKwkJLyoKKwkJICogVGhpcyBpcyBIQUNLLCBidXQgSW50ZWwgSW50ZWdyYXRlZCBSQUlEIGFsbG93cyB1c2VyCisJCSAqIHRvIGRlbGV0ZSBhIHZvbHVtZSB0aGF0IGlzIGNsYWltZWQsIGxvY2tlZCwgYW5kIGluIHVzZQorCQkgKiBieSB0aGUgT1MuIFdlIGhhdmUgdG8gY2hlY2sgZm9yIGEgcmVwbHkgZnJvbSBhCisJCSAqIG5vbi1leGlzdGVudCBkZXZpY2UgYW5kIGZsYWcgaXQgYXMgYW4gZXJyb3Igb3IgdGhlIHN5c3RlbQorCQkgKiBnb2VzIGthcHV0Li4uCisJCSAqLworCQlyZXEtPmVycm9ycysrOworCQlvc21fd2FybigiRGF0YSB0cmFuc2ZlciB0byBkZWxldGVkIGRldmljZSFcbiIpOworCQlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJCXdoaWxlIChlbmRfdGhhdF9yZXF1ZXN0X2NodW5rCisJCSAgICAgICAocmVxLCAhcmVxLT5lcnJvcnMsIGxlMzJfdG9fY3B1KG1zZy0+Ym9keVsxXSkpKSA7CisJCWVuZF90aGF0X3JlcXVlc3RfbGFzdChyZXEpOworCisJCWRldi0+b3Blbl9xdWV1ZV9kZXB0aC0tOworCQlsaXN0X2RlbCgmaXJlcS0+cXVldWUpOworCQlibGtfc3RhcnRfcXVldWUocSk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqICAgICAgTGV0cyBzZWUgd2hhdCBpcyBjb29raW5nLiBXZSBzdHVmZmVkIHRoZQorCSAqICAgICAgcmVxdWVzdCBpbiB0aGUgY29udGV4dC4KKwkgKi8KKworCXN0ID0gbGUzMl90b19jcHUobXNnLT5ib2R5WzBdKSA+PiAyNDsKKworCWlmIChzdCAhPSAwKSB7CisJCWludCBlcnI7CisJCWNoYXIgKmJzYV9lcnJvcnNbXSA9IHsKKwkJCSJTdWNjZXNzIiwKKwkJCSJNZWRpYSBFcnJvciIsCisJCQkiRmFpbHVyZSBjb21tdW5pY2F0aW5nIHRvIGRldmljZSIsCisJCQkiRGV2aWNlIEZhaWx1cmUiLAorCQkJIkRldmljZSBpcyBub3QgcmVhZHkiLAorCQkJIk1lZGlhIG5vdCBwcmVzZW50IiwKKwkJCSJNZWRpYSBpcyBsb2NrZWQgYnkgYW5vdGhlciB1c2VyIiwKKwkJCSJNZWRpYSBoYXMgZmFpbGVkIiwKKwkJCSJGYWlsdXJlIGNvbW11bmljYXRpbmcgdG8gZGV2aWNlIiwKKwkJCSJEZXZpY2UgYnVzIGZhaWx1cmUiLAorCQkJIkRldmljZSBpcyBsb2NrZWQgYnkgYW5vdGhlciB1c2VyIiwKKwkJCSJEZXZpY2UgaXMgd3JpdGUgcHJvdGVjdGVkIiwKKwkJCSJEZXZpY2UgaGFzIHJlc2V0IiwKKwkJCSJWb2x1bWUgaGFzIGNoYW5nZWQsIHdhaXRpbmcgZm9yIGFja25vd2xlZGdlbWVudCIKKwkJfTsKKworCQllcnIgPSBsZTMyX3RvX2NwdShtc2ctPmJvZHlbMF0pICYgMHhmZmZmOworCisJCS8qCisJCSAqICAgICAgRGV2aWNlIG5vdCByZWFkeSBtZWFucyB0d28gdGhpbmdzLiBPbmUgaXMgdGhhdCB0aGUKKwkJICogICAgICB0aGUgdGhpbmcgd2VudCBvZmZsaW5lIChidXQgbm90IGEgcmVtb3ZhbCBtZWRpYSkKKwkJICoKKwkJICogICAgICBUaGUgc2Vjb25kIGlzIHRoYXQgeW91IGhhdmUgYSBTdXBlclRyYWsgMTAwIGFuZCB0aGUKKwkJICogICAgICBmaXJtd2FyZSBnb3QgY29uc3RpcGF0ZWQuIFVubGlrZSBzdGFuZGFyZCBpMm8gY2FyZAorCQkgKiAgICAgIHNldHVwcyB0aGUgc3VwZXJ0cmFrIHJldHVybnMgYW4gZXJyb3IgcmF0aGVyIHRoYW4KKwkJICogICAgICBibG9ja2luZyBmb3IgdGhlIHRpbWVvdXQgaW4gdGhlc2UgY2FzZXMuCisJCSAqCisJCSAqICAgICAgRG9uJ3Qgc3RpY2sgYSBzdXBlcnRyYWsxMDAgaW50byBjYWNoZSBhZ2dyZXNzaXZlIG1vZGVzCisJCSAqLworCisJCW9zbV9lcnIoImJsb2NrLW9zbTogL2Rldi8lcyBlcnJvcjogJXMiLCBkZXYtPmdkLT5kaXNrX25hbWUsCisJCQlic2FfZXJyb3JzW2xlMzJfdG9fY3B1KG1zZy0+Ym9keVswXSkgJiAweGZmZmZdKTsKKwkJaWYgKGxlMzJfdG9fY3B1KG1zZy0+Ym9keVswXSkgJiAweDAwZmYwMDAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICIgLSBERE0gYXR0ZW1wdGVkICVkIHJldHJpZXMiLAorCQkJICAgICAgIChsZTMyX3RvX2NwdShtc2ctPmJvZHlbMF0pID4+IDE2KSAmIDB4MDBmZik7CisJCXByaW50ayhLRVJOX0VSUiAiLlxuIik7CisJCXJlcS0+ZXJyb3JzKys7CisJfSBlbHNlCisJCXJlcS0+ZXJyb3JzID0gMDsKKworCWlmICghZW5kX3RoYXRfcmVxdWVzdF9jaHVuaworCSAgICAocmVxLCAhcmVxLT5lcnJvcnMsIGxlMzJfdG9fY3B1KG1zZy0+Ym9keVsxXSkpKSB7CisJCWFkZF9kaXNrX3JhbmRvbW5lc3MocmVxLT5ycV9kaXNrKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJCWVuZF90aGF0X3JlcXVlc3RfbGFzdChyZXEpOworCisJCWRldi0+b3Blbl9xdWV1ZV9kZXB0aC0tOworCQlsaXN0X2RlbCgmaXJlcS0+cXVldWUpOworCQlibGtfc3RhcnRfcXVldWUocSk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwkJaTJvX2Jsb2NrX3NnbGlzdF9mcmVlKGlyZXEpOworCQlpMm9fYmxvY2tfcmVxdWVzdF9mcmVlKGlyZXEpOworCX0gZWxzZQorCQlvc21fZXJyKCJzdGlsbCByZW1haW5pbmcgY2h1bmtzXG4iKTsKKworCXJldHVybiAxOworfTsKKworc3RhdGljIHZvaWQgaTJvX2Jsb2NrX2V2ZW50KHN0cnVjdCBpMm9fZXZlbnQgKmV2dCkKK3sKKwlvc21faW5mbygiYmxvY2stb3NtOiBldmVudCByZWNlaXZlZFxuIik7Cit9OworCisvKgorICoJU0NTSS1DQU0gZm9yIGlvY3RsIGdlb21ldHJ5IG1hcHBpbmcKKyAqCUR1cGxpY2F0ZWQgd2l0aCBTQ1NJIC0gdGhpcyBzaG91bGQgYmUgbW92ZWQgaW50byBzb21ld2hlcmUgY29tbW9uCisgKglwZXJoYXBzIGdlbmhkID8KKyAqCisgKiBMQkEgLT4gQ0hTIG1hcHBpbmcgdGFibGUgdGFrZW4gZnJvbToKKyAqCisgKiAiSW5jb3Jwb3JhdGluZyB0aGUgSTJPIEFyY2hpdGVjdHVyZSBpbnRvIEJJT1MgZm9yIEludGVsIEFyY2hpdGVjdHVyZQorICogIFBsYXRmb3JtcyIKKyAqCisgKiBUaGlzIGlzIGFuIEkyTyBkb2N1bWVudCB0aGF0IGlzIG9ubHkgYXZhaWxhYmxlIHRvIEkyTyBtZW1iZXJzLAorICogbm90IGRldmVsb3BlcnMuCisgKgorICogRnJvbSBteSB1bmRlcnN0YW5kaW5nLCB0aGlzIGlzIGhvdyBhbGwgdGhlIEkyTyBjYXJkcyBkbyB0aGlzCisgKgorICogRGlzayBTaXplICAgICAgfCBTZWN0b3JzIHwgSGVhZHMgfCBDeWxpbmRlcnMKKyAqIC0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAxIDwgWCA8PSA1MjhNICB8IDYzICAgICAgfCAxNiAgICB8IFgvKDYzICogMTYgKiA1MTIpCisgKiA1MjhNIDwgWCA8PSAxRyB8IDYzICAgICAgfCAzMiAgICB8IFgvKDYzICogMzIgKiA1MTIpCisgKiAxIDwgWCA8NTI4TSAgICB8IDYzICAgICAgfCAxNiAgICB8IFgvKDYzICogMTYgKiA1MTIpCisgKiAxIDwgWCA8NTI4TSAgICB8IDYzICAgICAgfCAxNiAgICB8IFgvKDYzICogMTYgKiA1MTIpCisgKgorICovCisjZGVmaW5lCUJMT0NLX1NJWkVfNTI4TQkJMTA4MTM0NAorI2RlZmluZQlCTE9DS19TSVpFXzFHCQkyMDk3MTUyCisjZGVmaW5lCUJMT0NLX1NJWkVfMjFHCQk0NDAzMjAwCisjZGVmaW5lCUJMT0NLX1NJWkVfNDJHCQk4ODA2NDAwCisjZGVmaW5lCUJMT0NLX1NJWkVfODRHCQkxNzYxMjgwMAorCitzdGF0aWMgdm9pZCBpMm9fYmxvY2tfYmlvc3BhcmFtKHVuc2lnbmVkIGxvbmcgY2FwYWNpdHksIHVuc2lnbmVkIHNob3J0ICpjeWxzLAorCQkJCXVuc2lnbmVkIGNoYXIgKmhkcywgdW5zaWduZWQgY2hhciAqc2VjcykKK3sKKwl1bnNpZ25lZCBsb25nIGhlYWRzLCBzZWN0b3JzLCBjeWxpbmRlcnM7CisKKwlzZWN0b3JzID0gNjNMOwkJLyogTWF4aW1pemUgc2VjdG9ycyBwZXIgdHJhY2sgKi8KKwlpZiAoY2FwYWNpdHkgPD0gQkxPQ0tfU0laRV81MjhNKQorCQloZWFkcyA9IDE2OworCWVsc2UgaWYgKGNhcGFjaXR5IDw9IEJMT0NLX1NJWkVfMUcpCisJCWhlYWRzID0gMzI7CisJZWxzZSBpZiAoY2FwYWNpdHkgPD0gQkxPQ0tfU0laRV8yMUcpCisJCWhlYWRzID0gNjQ7CisJZWxzZSBpZiAoY2FwYWNpdHkgPD0gQkxPQ0tfU0laRV80MkcpCisJCWhlYWRzID0gMTI4OworCWVsc2UKKwkJaGVhZHMgPSAyNTU7CisKKwljeWxpbmRlcnMgPSAodW5zaWduZWQgbG9uZyljYXBhY2l0eSAvIChoZWFkcyAqIHNlY3RvcnMpOworCisJKmN5bHMgPSAodW5zaWduZWQgc2hvcnQpY3lsaW5kZXJzOwkvKiBTdHVmZiByZXR1cm4gdmFsdWVzICovCisJKnNlY3MgPSAodW5zaWduZWQgY2hhcilzZWN0b3JzOworCSpoZHMgPSAodW5zaWduZWQgY2hhciloZWFkczsKK30KKworLyoqCisgKglpMm9fYmxvY2tfb3BlbiAtIE9wZW4gdGhlIGJsb2NrIGRldmljZQorICoKKyAqCVBvd2VyIHVwIHRoZSBkZXZpY2UsIG1vdW50IGFuZCBsb2NrIHRoZSBtZWRpYS4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsCisgKglpZiB0aGUgYmxvY2sgZGV2aWNlIGlzIG9wZW5lZCBmb3IgYWNjZXNzLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpMm9fYmxvY2tfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaTJvX2Jsb2NrX2RldmljZSAqZGV2ID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFkZXYtPmkyb19kZXYpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGRldi0+cG93ZXIgPiAweDFmKQorCQlpMm9fYmxvY2tfZGV2aWNlX3Bvd2VyKGRldiwgMHgwMik7CisKKwlpMm9fYmxvY2tfZGV2aWNlX21vdW50KGRldi0+aTJvX2RldiwgLTEpOworCisJaTJvX2Jsb2NrX2RldmljZV9sb2NrKGRldi0+aTJvX2RldiwgLTEpOworCisJb3NtX2RlYnVnKCJSZWFkeS5cbiIpOworCisJcmV0dXJuIDA7Cit9OworCisvKioKKyAqCWkyb19ibG9ja19yZWxlYXNlIC0gUmVsZWFzZSB0aGUgSTJPIGJsb2NrIGRldmljZQorICoKKyAqCVVubG9jayBhbmQgdW5tb3VudCB0aGUgbWVkaWEsIGFuZCBwb3dlciBkb3duIHRoZSBkZXZpY2UuIEdldHMgY2FsbGVkIGlmCisgKgl0aGUgYmxvY2sgZGV2aWNlIGlzIGNsb3NlZC4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgaTJvX2Jsb2NrX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrOworCXN0cnVjdCBpMm9fYmxvY2tfZGV2aWNlICpkZXYgPSBkaXNrLT5wcml2YXRlX2RhdGE7CisJdTggb3BlcmF0aW9uOworCisJLyoKKwkgKiBUaGlzIGlzIHRvIGRlYWlsIHdpdGggdGhlIGNhc2Ugb2YgYW4gYXBwbGljYXRpb24KKwkgKiBvcGVuaW5nIGEgZGV2aWNlIGFuZCB0aGVuIHRoZSBkZXZpY2UgZGlzc2FwZWFycyB3aGlsZQorCSAqIGl0J3MgaW4gdXNlLCBhbmQgdGhlbiB0aGUgYXBwbGljYXRpb24gdHJpZXMgdG8gcmVsZWFzZQorCSAqIGl0LiAgZXg6IFVubW91bnRpbmcgYSBkZWxldGVkIFJBSUQgdm9sdW1lIGF0IHJlYm9vdC4KKwkgKiBJZiB3ZSBzZW5kIG1lc3NhZ2VzLCBpdCB3aWxsIGp1c3QgY2F1c2UgRkFJTHMgc2luY2UKKwkgKiB0aGUgVElEIG5vIGxvbmdlciBleGlzdHMuCisJICovCisJaWYgKCFkZXYtPmkyb19kZXYpCisJCXJldHVybiAwOworCisJaTJvX2Jsb2NrX2RldmljZV9mbHVzaChkZXYtPmkyb19kZXYpOworCisJaTJvX2Jsb2NrX2RldmljZV91bmxvY2soZGV2LT5pMm9fZGV2LCAtMSk7CisKKwlpZiAoZGV2LT5mbGFncyAmICgxIDw8IDMgfCAxIDw8IDQpKQkvKiBSZW1vdmFibGUgKi8KKwkJb3BlcmF0aW9uID0gMHgyMTsKKwllbHNlCisJCW9wZXJhdGlvbiA9IDB4MjQ7CisKKwlpMm9fYmxvY2tfZGV2aWNlX3Bvd2VyKGRldiwgb3BlcmF0aW9uKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCWkyb19ibG9ja19pb2N0bCAtIElzc3VlIGRldmljZSBzcGVjaWZpYyBpb2N0bCBjYWxscy4KKyAqCUBjbWQ6IGlvY3RsIGNvbW1hbmQKKyAqCUBhcmc6IGFyZworICoKKyAqCUhhbmRsZXMgaW9jdGwgcmVxdWVzdCBmb3IgdGhlIGJsb2NrIGRldmljZS4KKyAqCisgKglSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgaTJvX2Jsb2NrX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrOworCXN0cnVjdCBpMm9fYmxvY2tfZGV2aWNlICpkZXYgPSBkaXNrLT5wcml2YXRlX2RhdGE7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwkvKiBBbnlvbmUgY2FwYWJsZSBvZiB0aGlzIHN5c2NhbGwgY2FuIGRvICpyZWFsIGJhZCogdGhpbmdzICovCisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSERJT19HRVRHRU86CisJCXsKKwkJCXN0cnVjdCBoZF9nZW9tZXRyeSBnOworCQkJaTJvX2Jsb2NrX2Jpb3NwYXJhbShnZXRfY2FwYWNpdHkoZGlzayksCisJCQkJCSAgICAmZy5jeWxpbmRlcnMsICZnLmhlYWRzLCAmZy5zZWN0b3JzKTsKKwkJCWcuc3RhcnQgPSBnZXRfc3RhcnRfc2VjdChpbm9kZS0+aV9iZGV2KTsKKwkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmcsIHNpemVvZihnKSkgPyAtRUZBVUxUIDogMDsKKwkJfQorCisJY2FzZSBCTEtJMk9HUlNUUkFUOgorCQlyZXR1cm4gcHV0X3VzZXIoZGV2LT5yY2FjaGUsIChpbnQgX191c2VyICopYXJnKTsKKwljYXNlIEJMS0kyT0dXU1RSQVQ6CisJCXJldHVybiBwdXRfdXNlcihkZXYtPndjYWNoZSwgKGludCBfX3VzZXIgKilhcmcpOworCWNhc2UgQkxLSTJPU1JTVFJBVDoKKwkJaWYgKGFyZyA8IDAgfHwgYXJnID4gQ0FDSEVfU01BUlRGRVRDSCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlkZXYtPnJjYWNoZSA9IGFyZzsKKwkJYnJlYWs7CisJY2FzZSBCTEtJMk9TV1NUUkFUOgorCQlpZiAoYXJnICE9IDAKKwkJICAgICYmIChhcmcgPCBDQUNIRV9XUklURVRIUk9VR0ggfHwgYXJnID4gQ0FDSEVfU01BUlRCQUNLKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlkZXYtPndjYWNoZSA9IGFyZzsKKwkJYnJlYWs7CisJfQorCXJldHVybiAtRU5PVFRZOworfTsKKworLyoqCisgKglpMm9fYmxvY2tfbWVkaWFfY2hhbmdlZCAtIEhhdmUgd2Ugc2VlbiBhIG1lZGlhIGNoYW5nZT8KKyAqCUBkaXNrOiBnZW5kaXNrIHdoaWNoIHNob3VsZCBiZSB2ZXJpZmllZAorICoKKyAqCVZlcmlmaWVzIGlmIHRoZSBtZWRpYSBoYXMgY2hhbmdlZC4KKyAqCisgKglSZXR1cm5zIDEgaWYgdGhlIG1lZGlhIHdhcyBjaGFuZ2VkIG9yIDAgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IGkyb19ibG9ja19tZWRpYV9jaGFuZ2VkKHN0cnVjdCBnZW5kaXNrICpkaXNrKQoreworCXN0cnVjdCBpMm9fYmxvY2tfZGV2aWNlICpwID0gZGlzay0+cHJpdmF0ZV9kYXRhOworCisJaWYgKHAtPm1lZGlhX2NoYW5nZV9mbGFnKSB7CisJCXAtPm1lZGlhX2NoYW5nZV9mbGFnID0gMDsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqCWkyb19ibG9ja190cmFuc2ZlciAtIFRyYW5zZmVyIGEgcmVxdWVzdCB0by9mcm9tIHRoZSBJMk8gY29udHJvbGxlcgorICoJQHJlcTogdGhlIHJlcXVlc3Qgd2hpY2ggc2hvdWxkIGJlIHRyYW5zZmVyZWQKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSByZXF1ZXN0IGludG8gYSBJMk8gbWVzc2FnZS4gVGhlIG5lY2Vzc2FyeQorICoJRE1BIGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZCBhbmQgYWZ0ZXIgZXZlcnl0aGluZyBpcyBzZXR1cCBwb3N0IHRoZSBtZXNzYWdlCisgKgl0byB0aGUgSTJPIGNvbnRyb2xsZXIuIE5vIGNsZWFudXAgaXMgZG9uZSBieSB0aGlzIGZ1bmN0aW9uLiBJdCBpcyBkb25lCisgKglvbiB0aGUgaW50ZXJydXB0IHNpZGUgd2hlbiB0aGUgcmVwbHkgYXJyaXZlcy4KKyAqCisgKglSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpMm9fYmxvY2tfdHJhbnNmZXIoc3RydWN0IHJlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgaTJvX2Jsb2NrX2RldmljZSAqZGV2ID0gcmVxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjID0gZGV2LT5pMm9fZGV2LT5pb3A7CisJaW50IHRpZCA9IGRldi0+aTJvX2Rldi0+bGN0X2RhdGEudGlkOworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdm9pZCBfX2lvbWVtICptcHRyOworCXN0cnVjdCBpMm9fYmxvY2tfcmVxdWVzdCAqaXJlcSA9IHJlcS0+c3BlY2lhbDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWludCBzZ251bTsKKwlpbnQgaTsKKwl1MzIgbTsKKwl1MzIgdGNudHh0OworCXUzMiBzZ19mbGFnczsKKwlpbnQgcmM7CisKKwltID0gaTJvX21zZ19nZXQoYywgJm1zZyk7CisJaWYgKG0gPT0gSTJPX1FVRVVFX0VNUFRZKSB7CisJCXJjID0gLUVCVVNZOworCQlnb3RvIGV4aXQ7CisJfQorCisJdGNudHh0ID0gaTJvX2NudHh0X2xpc3RfYWRkKGMsIHJlcSk7CisJaWYgKCF0Y250eHQpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG5vcF9tc2c7CisJfQorCisJaWYgKChzZ251bSA9IGkyb19ibG9ja19zZ2xpc3RfYWxsb2MoaXJlcSkpIDw9IDApIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGNvbnRleHRfcmVtb3ZlOworCX0KKworCS8qIEJ1aWxkIHRoZSBtZXNzYWdlIGJhc2VkIG9uIHRoZSByZXF1ZXN0LiAqLworCXdyaXRlbChpMm9fYmxvY2tfZHJpdmVyLmNvbnRleHQsICZtc2ctPnUucy5pY250eHQpOworCXdyaXRlbCh0Y250eHQsICZtc2ctPnUucy50Y250eHQpOworCXdyaXRlbChyZXEtPm5yX3NlY3RvcnMgPDwgOSwgJm1zZy0+Ym9keVsxXSk7CisKKwl3cml0ZWwoKCgodTY0KSByZXEtPnNlY3RvcikgPDwgOSkgJiAweGZmZmZmZmZmLCAmbXNnLT5ib2R5WzJdKTsKKwl3cml0ZWwocmVxLT5zZWN0b3IgPj4gMjMsICZtc2ctPmJvZHlbM10pOworCisJbXB0ciA9ICZtc2ctPmJvZHlbNF07CisKKwlzZyA9IGlyZXEtPnNnX3RhYmxlOworCisJaWYgKHJxX2RhdGFfZGlyKHJlcSkgPT0gUkVBRCkgeworCQl3cml0ZWwoSTJPX0NNRF9CTE9DS19SRUFEIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCB0aWQsCisJCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOworCQlzZ19mbGFncyA9IDB4MTAwMDAwMDA7CisJCXN3aXRjaCAoZGV2LT5yY2FjaGUpIHsKKwkJY2FzZSBDQUNIRV9OVUxMOgorCQkJd3JpdGVsKDAsICZtc2ctPmJvZHlbMF0pOworCQkJYnJlYWs7CisJCWNhc2UgQ0FDSEVfUFJFRkVUQ0g6CisJCQl3cml0ZWwoMHgyMDFGMDAwOCwgJm1zZy0+Ym9keVswXSk7CisJCQlicmVhazsKKwkJY2FzZSBDQUNIRV9TTUFSVEZFVENIOgorCQkJaWYgKHJlcS0+bnJfc2VjdG9ycyA+IDE2KQorCQkJCXdyaXRlbCgweDIwMUYwMDA4LCAmbXNnLT5ib2R5WzBdKTsKKwkJCWVsc2UKKwkJCQl3cml0ZWwoMHgwMDFGMDAwMCwgJm1zZy0+Ym9keVswXSk7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXdyaXRlbChJMk9fQ01EX0JMT0NLX1dSSVRFIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCB0aWQsCisJCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOworCQlzZ19mbGFncyA9IDB4MTQwMDAwMDA7CisJCXN3aXRjaCAoZGV2LT53Y2FjaGUpIHsKKwkJY2FzZSBDQUNIRV9OVUxMOgorCQkJd3JpdGVsKDAsICZtc2ctPmJvZHlbMF0pOworCQkJYnJlYWs7CisJCWNhc2UgQ0FDSEVfV1JJVEVUSFJPVUdIOgorCQkJd3JpdGVsKDB4MDAxRjAwMDgsICZtc2ctPmJvZHlbMF0pOworCQkJYnJlYWs7CisJCWNhc2UgQ0FDSEVfV1JJVEVCQUNLOgorCQkJd3JpdGVsKDB4MDAxRjAwMTAsICZtc2ctPmJvZHlbMF0pOworCQkJYnJlYWs7CisJCWNhc2UgQ0FDSEVfU01BUlRCQUNLOgorCQkJaWYgKHJlcS0+bnJfc2VjdG9ycyA+IDE2KQorCQkJCXdyaXRlbCgweDAwMUYwMDA0LCAmbXNnLT5ib2R5WzBdKTsKKwkJCWVsc2UKKwkJCQl3cml0ZWwoMHgwMDFGMDAxMCwgJm1zZy0+Ym9keVswXSk7CisJCQlicmVhazsKKwkJY2FzZSBDQUNIRV9TTUFSVFRIUk9VR0g6CisJCQlpZiAocmVxLT5ucl9zZWN0b3JzID4gMTYpCisJCQkJd3JpdGVsKDB4MDAxRjAwMDQsICZtc2ctPmJvZHlbMF0pOworCQkJZWxzZQorCQkJCXdyaXRlbCgweDAwMUYwMDEwLCAmbXNnLT5ib2R5WzBdKTsKKwkJfQorCX0KKworCWZvciAoaSA9IHNnbnVtOyBpID4gMDsgaS0tKSB7CisJCWlmIChpID09IDEpCisJCQlzZ19mbGFncyB8PSAweDgwMDAwMDAwOworCQl3cml0ZWwoc2dfZmxhZ3MgfCBzZ19kbWFfbGVuKHNnKSwgbXB0cik7CisJCXdyaXRlbChzZ19kbWFfYWRkcmVzcyhzZyksIG1wdHIgKyA0KTsKKwkJbXB0ciArPSA4OworCQlzZysrOworCX0KKworCXdyaXRlbChJMk9fTUVTU0FHRV9TSVpFCisJICAgICAgICgoKHVuc2lnbmVkIGxvbmcpbXB0ciAtCisJCSAodW5zaWduZWQgbG9uZykmbXNnLT51LmhlYWRbMF0pID4+IDIpIHwgU0dMX09GRlNFVF84LAorCSAgICAgICAmbXNnLT51LmhlYWRbMF0pOworCisJbGlzdF9hZGRfdGFpbCgmaXJlcS0+cXVldWUsICZkZXYtPm9wZW5fcXVldWUpOworCWRldi0+b3Blbl9xdWV1ZV9kZXB0aCsrOworCisJaTJvX21zZ19wb3N0KGMsIG0pOworCisJcmV0dXJuIDA7CisKKyAgICAgIGNvbnRleHRfcmVtb3ZlOgorCWkyb19jbnR4dF9saXN0X3JlbW92ZShjLCByZXEpOworCisgICAgICBub3BfbXNnOgorCWkyb19tc2dfbm9wKGMsIG0pOworCisgICAgICBleGl0OgorCXJldHVybiByYzsKK307CisKKy8qKgorICoJaTJvX2Jsb2NrX3JlcXVlc3RfZm4gLSByZXF1ZXN0IHF1ZXVlIGhhbmRsaW5nIGZ1bmN0aW9uCisgKglxOiByZXF1ZXN0IHF1ZXVlIGZyb20gd2hpY2ggdGhlIHJlcXVlc3QgY291bGQgYmUgZmV0Y2hlZAorICoKKyAqCVRha2VzIHRoZSBuZXh0IHJlcXVlc3QgZnJvbSB0aGUgcXVldWUsIHRyYW5zZmVycyBpdCBhbmQgaWYgbm8gZXJyb3IKKyAqCW9jY3VycyBkZXF1ZXVlIGl0IGZyb20gdGhlIHF1ZXVlLiBPbiBhcnJpdmFsIG9mIHRoZSByZXBseSB0aGUgbWVzc2FnZQorICoJd2lsbCBiZSBwcm9jZXNzZWQgZnVydGhlci4gSWYgYW4gZXJyb3Igb2NjdXJzIHJlcXVldWUgdGhlIHJlcXVlc3QuCisgKi8KK3N0YXRpYyB2b2lkIGkyb19ibG9ja19yZXF1ZXN0X2ZuKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQoreworCXN0cnVjdCByZXF1ZXN0ICpyZXE7CisKKwl3aGlsZSAoIWJsa19xdWV1ZV9wbHVnZ2VkKHEpKSB7CisJCXJlcSA9IGVsdl9uZXh0X3JlcXVlc3QocSk7CisJCWlmICghcmVxKQorCQkJYnJlYWs7CisKKwkJaWYgKGJsa19mc19yZXF1ZXN0KHJlcSkpIHsKKwkJCXN0cnVjdCBpMm9fYmxvY2tfZGVsYXllZF9yZXF1ZXN0ICpkcmVxOworCQkJc3RydWN0IGkyb19ibG9ja19yZXF1ZXN0ICppcmVxID0gcmVxLT5zcGVjaWFsOworCQkJdW5zaWduZWQgaW50IHF1ZXVlX2RlcHRoOworCisJCQlxdWV1ZV9kZXB0aCA9IGlyZXEtPmkyb19ibGtfZGV2LT5vcGVuX3F1ZXVlX2RlcHRoOworCisJCQlpZiAocXVldWVfZGVwdGggPCBJMk9fQkxPQ0tfTUFYX09QRU5fUkVRVUVTVFMpCisJCQkJaWYgKCFpMm9fYmxvY2tfdHJhbnNmZXIocmVxKSkgeworCQkJCQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJlcSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJaWYgKHF1ZXVlX2RlcHRoKQorCQkJCWJyZWFrOworCisJCQkvKiBzdG9wIHRoZSBxdWV1ZSBhbmQgcmV0cnkgbGF0ZXIgKi8KKwkJCWRyZXEgPSBrbWFsbG9jKHNpemVvZigqZHJlcSksIEdGUF9BVE9NSUMpOworCQkJaWYgKCFkcmVxKQorCQkJCWNvbnRpbnVlOworCisJCQlkcmVxLT5xdWV1ZSA9IHE7CisJCQlJTklUX1dPUksoJmRyZXEtPndvcmssIGkyb19ibG9ja19kZWxheWVkX3JlcXVlc3RfZm4sCisJCQkJICBkcmVxKTsKKworCQkJb3NtX2luZm8oInRyYW5zZmVyIGVycm9yXG4iKTsKKwkJCWlmICghcXVldWVfZGVsYXllZF93b3JrKGkyb19ibG9ja19kcml2ZXIuZXZlbnRfcXVldWUsCisJCQkJCQkmZHJlcS0+d29yaywKKwkJCQkJCUkyT19CTE9DS19SRVRSWV9USU1FKSkKKwkJCQlrZnJlZShkcmVxKTsKKwkJCWVsc2UgeworCQkJCWJsa19zdG9wX3F1ZXVlKHEpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UKKwkJCWVuZF9yZXF1ZXN0KHJlcSwgMCk7CisJfQorfTsKKworLyogSTJPIEJsb2NrIGRldmljZSBvcGVyYXRpb25zIGRlZmluaXRpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGV2aWNlX29wZXJhdGlvbnMgaTJvX2Jsb2NrX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBpMm9fYmxvY2tfb3BlbiwKKwkucmVsZWFzZSA9IGkyb19ibG9ja19yZWxlYXNlLAorCS5pb2N0bCA9IGkyb19ibG9ja19pb2N0bCwKKwkubWVkaWFfY2hhbmdlZCA9IGkyb19ibG9ja19tZWRpYV9jaGFuZ2VkCit9OworCisvKioKKyAqCWkyb19ibG9ja19kZXZpY2VfYWxsb2MgLSBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgSTJPIEJsb2NrIGRldmljZQorICoKKyAqCUFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGkyb19ibG9ja19kZXZpY2Ugc3RydWN0LCBnZW5kaXNrIGFuZCByZXF1ZXN0CisgKglxdWV1ZSBhbmQgaW5pdGlhbGl6ZSB0aGVtIGFzIGZhciBhcyBubyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGlzIG5lZWRlZC4KKyAqCisgKglSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIEkyTyBCbG9jayBkZXZpY2Ugb24gc3VjY2VzIG9yIGEKKyAqCW5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIHN0cnVjdCBpMm9fYmxvY2tfZGV2aWNlICppMm9fYmxvY2tfZGV2aWNlX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IGkyb19ibG9ja19kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZ2VuZGlzayAqZ2Q7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlOworCWludCByYzsKKworCWRldiA9IGttYWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldikgeworCQlvc21fZXJyKCJJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlIEkyTyBCbG9jayBkaXNrLlxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKwltZW1zZXQoZGV2LCAwLCBzaXplb2YoKmRldikpOworCisJSU5JVF9MSVNUX0hFQUQoJmRldi0+b3Blbl9xdWV1ZSk7CisJc3Bpbl9sb2NrX2luaXQoJmRldi0+bG9jayk7CisJZGV2LT5yY2FjaGUgPSBDQUNIRV9QUkVGRVRDSDsKKwlkZXYtPndjYWNoZSA9IENBQ0hFX1dSSVRFQkFDSzsKKworCS8qIGFsbG9jYXRlIGEgZ2VuZGlzayB3aXRoIDE2IHBhcnRpdGlvbnMgKi8KKwlnZCA9IGFsbG9jX2Rpc2soMTYpOworCWlmICghZ2QpIHsKKwkJb3NtX2VycigiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBhbGxvY2F0ZSBnZW5kaXNrLlxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBjbGVhbnVwX2RldjsKKwl9CisKKwkvKiBpbml0aWFsaXplIHRoZSByZXF1ZXN0IHF1ZXVlICovCisJcXVldWUgPSBibGtfaW5pdF9xdWV1ZShpMm9fYmxvY2tfcmVxdWVzdF9mbiwgJmRldi0+bG9jayk7CisJaWYgKCFxdWV1ZSkgeworCQlvc21fZXJyKCJJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlIHJlcXVlc3QgcXVldWUuXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGNsZWFudXBfcXVldWU7CisJfQorCisJYmxrX3F1ZXVlX3ByZXBfcnEocXVldWUsIGkyb19ibG9ja19wcmVwX3JlcV9mbik7CisKKwlnZC0+bWFqb3IgPSBJMk9fTUFKT1I7CisJZ2QtPnF1ZXVlID0gcXVldWU7CisJZ2QtPmZvcHMgPSAmaTJvX2Jsb2NrX2ZvcHM7CisJZ2QtPnByaXZhdGVfZGF0YSA9IGRldjsKKworCWRldi0+Z2QgPSBnZDsKKworCXJldHVybiBkZXY7CisKKyAgICAgIGNsZWFudXBfcXVldWU6CisJcHV0X2Rpc2soZ2QpOworCisgICAgICBjbGVhbnVwX2RldjoKKwlrZnJlZShkZXYpOworCisgICAgICBleGl0OgorCXJldHVybiBFUlJfUFRSKHJjKTsKK307CisKKy8qKgorICoJaTJvX2Jsb2NrX3Byb2JlIC0gdmVyaWZ5IGlmIGRldiBpcyBhIEkyTyBCbG9jayBkZXZpY2UgYW5kIGluc3RhbGwgaXQKKyAqCUBkZXY6IGRldmljZSB0byB2ZXJpZnkgaWYgaXQgaXMgYSBJMk8gQmxvY2sgZGV2aWNlCisgKgorICoJV2Ugb25seSB2ZXJpZnkgaWYgdGhlIHVzZXJfdGlkIG9mIHRoZSBkZXZpY2UgaXMgMHhmZmYgYW5kIHRoZW4gaW5zdGFsbAorICoJdGhlIGRldmljZS4gT3RoZXJ3aXNlIGl0IGlzIHVzZWQgYnkgc29tZSBvdGhlciBkZXZpY2UgKGUuIGcuIFJBSUQpLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpMm9fYmxvY2tfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2ID0gdG9faTJvX2RldmljZShkZXYpOworCXN0cnVjdCBpMm9fYmxvY2tfZGV2aWNlICppMm9fYmxrX2RldjsKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMgPSBpMm9fZGV2LT5pb3A7CisJc3RydWN0IGdlbmRpc2sgKmdkOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZTsKKwlzdGF0aWMgaW50IHVuaXQgPSAwOworCWludCByYzsKKwl1NjQgc2l6ZTsKKwl1MzIgYmxvY2tzaXplOworCXUxNiBwb3dlcjsKKwl1MzIgZmxhZ3MsIHN0YXR1czsKKwlpbnQgc2VnbWVudHM7CisKKwkvKiBza2lwIGRldmljZXMgd2hpY2ggYXJlIHVzZWQgYnkgSU9QICovCisJaWYgKGkyb19kZXYtPmxjdF9kYXRhLnVzZXJfdGlkICE9IDB4ZmZmKSB7CisJCW9zbV9kZWJ1Zygic2tpcHBpbmcgdXNlZCBkZXZpY2UgJTAzeFxuIiwgaTJvX2Rldi0+bGN0X2RhdGEudGlkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJb3NtX2luZm8oIk5ldyBkZXZpY2UgZGV0ZWN0ZWQgKFRJRDogJTAzeClcbiIsIGkyb19kZXYtPmxjdF9kYXRhLnRpZCk7CisKKwlpZiAoaTJvX2RldmljZV9jbGFpbShpMm9fZGV2KSkgeworCQlvc21fd2FybigiVW5hYmxlIHRvIGNsYWltIGRldmljZS4gSW5zdGFsbGF0aW9uIGFib3J0ZWRcbiIpOworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpMm9fYmxrX2RldiA9IGkyb19ibG9ja19kZXZpY2VfYWxsb2MoKTsKKwlpZiAoSVNfRVJSKGkyb19ibGtfZGV2KSkgeworCQlvc21fZXJyKCJjb3VsZCBub3QgYWxsb2MgYSBuZXcgSTJPIGJsb2NrIGRldmljZSIpOworCQlyYyA9IFBUUl9FUlIoaTJvX2Jsa19kZXYpOworCQlnb3RvIGNsYWltX3JlbGVhc2U7CisJfQorCisJaTJvX2Jsa19kZXYtPmkyb19kZXYgPSBpMm9fZGV2OworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGkyb19ibGtfZGV2KTsKKworCS8qIHNldHVwIGdlbmRpc2sgKi8KKwlnZCA9IGkyb19ibGtfZGV2LT5nZDsKKwlnZC0+Zmlyc3RfbWlub3IgPSB1bml0IDw8IDQ7CisJc3ByaW50ZihnZC0+ZGlza19uYW1lLCAiaTJvL2hkJWMiLCAnYScgKyB1bml0KTsKKwlzcHJpbnRmKGdkLT5kZXZmc19uYW1lLCAiaTJvL2hkJWMiLCAnYScgKyB1bml0KTsKKwlnZC0+ZHJpdmVyZnNfZGV2ID0gJmkyb19kZXYtPmRldmljZTsKKworCS8qIHNldHVwIHJlcXVlc3QgcXVldWUgKi8KKwlxdWV1ZSA9IGdkLT5xdWV1ZTsKKwlxdWV1ZS0+cXVldWVkYXRhID0gaTJvX2Jsa19kZXY7CisKKwlibGtfcXVldWVfbWF4X3BoeXNfc2VnbWVudHMocXVldWUsIEkyT19NQVhfU0VHTUVOVFMpOworCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhxdWV1ZSwgSTJPX01BWF9TRUNUT1JTKTsKKworCWlmIChjLT5zaG9ydF9yZXEpCisJCXNlZ21lbnRzID0gODsKKwllbHNlIHsKKwkJaTJvX3N0YXR1c19ibG9jayAqc2I7CisKKwkJc2IgPSBjLT5zdGF0dXNfYmxvY2sudmlydDsKKworCQlzZWdtZW50cyA9IChzYi0+aW5ib3VuZF9mcmFtZV9zaXplIC0KKwkJCSAgICBzaXplb2Yoc3RydWN0IGkyb19tZXNzYWdlKSAvIDQgLSA0KSAvIDI7CisJfQorCisJYmxrX3F1ZXVlX21heF9od19zZWdtZW50cyhxdWV1ZSwgc2VnbWVudHMpOworCisJb3NtX2RlYnVnKCJtYXggc2VjdG9ycyA9ICVkXG4iLCBJMk9fTUFYX1NFQ1RPUlMpOworCW9zbV9kZWJ1ZygicGh5cyBzZWdtZW50cyA9ICVkXG4iLCBJMk9fTUFYX1NFR01FTlRTKTsKKwlvc21fZGVidWcoImh3IHNlZ21lbnRzID0gJWRcbiIsIHNlZ21lbnRzKTsKKworCS8qCisJICogICAgICBBc2sgZm9yIHRoZSBjdXJyZW50IG1lZGlhIGRhdGEuIElmIHRoYXQgaXNuJ3Qgc3VwcG9ydGVkCisJICogICAgICB0aGVuIHdlIGFzayBmb3IgdGhlIGRldmljZSBjYXBhY2l0eSBkYXRhCisJICovCisJaWYgKGkyb19wYXJtX2ZpZWxkX2dldChpMm9fZGV2LCAweDAwMDQsIDEsICZibG9ja3NpemUsIDQpICE9IDAKKwkgICAgfHwgaTJvX3Bhcm1fZmllbGRfZ2V0KGkyb19kZXYsIDB4MDAwNCwgMCwgJnNpemUsIDgpICE9IDApIHsKKwkJaTJvX3Bhcm1fZmllbGRfZ2V0KGkyb19kZXYsIDB4MDAwMCwgMywgJmJsb2Nrc2l6ZSwgNCk7CisJCWkyb19wYXJtX2ZpZWxkX2dldChpMm9fZGV2LCAweDAwMDAsIDQsICZzaXplLCA4KTsKKwl9CisJb3NtX2RlYnVnKCJibG9ja3NpemUgPSAlZFxuIiwgYmxvY2tzaXplKTsKKworCWlmIChpMm9fcGFybV9maWVsZF9nZXQoaTJvX2RldiwgMHgwMDAwLCAyLCAmcG93ZXIsIDIpKQorCQlwb3dlciA9IDA7CisJaTJvX3Bhcm1fZmllbGRfZ2V0KGkyb19kZXYsIDB4MDAwMCwgNSwgJmZsYWdzLCA0KTsKKwlpMm9fcGFybV9maWVsZF9nZXQoaTJvX2RldiwgMHgwMDAwLCA2LCAmc3RhdHVzLCA0KTsKKworCXNldF9jYXBhY2l0eShnZCwgc2l6ZSA+PiA5KTsKKworCWkyb19ldmVudF9yZWdpc3RlcihpMm9fZGV2LCAmaTJvX2Jsb2NrX2RyaXZlciwgMCwgMHhmZmZmZmZmZik7CisKKwlhZGRfZGlzayhnZCk7CisKKwl1bml0Kys7CisKKwlyZXR1cm4gMDsKKworICAgICAgY2xhaW1fcmVsZWFzZToKKwlpMm9fZGV2aWNlX2NsYWltX3JlbGVhc2UoaTJvX2Rldik7CisKKyAgICAgIGV4aXQ6CisJcmV0dXJuIHJjOworfTsKKworLyogQmxvY2sgT1NNIGRyaXZlciBzdHJ1Y3QgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJvX2RyaXZlciBpMm9fYmxvY2tfZHJpdmVyID0geworCS5uYW1lID0gT1NNX05BTUUsCisJLmV2ZW50ID0gaTJvX2Jsb2NrX2V2ZW50LAorCS5yZXBseSA9IGkyb19ibG9ja19yZXBseSwKKwkuY2xhc3NlcyA9IGkyb19ibG9ja19jbGFzc19pZCwKKwkuZHJpdmVyID0geworCQkgICAucHJvYmUgPSBpMm9fYmxvY2tfcHJvYmUsCisJCSAgIC5yZW1vdmUgPSBpMm9fYmxvY2tfcmVtb3ZlLAorCQkgICB9LAorfTsKKworLyoqCisgKglpMm9fYmxvY2tfaW5pdCAtIEJsb2NrIE9TTSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgorICoKKyAqCUFsbG9jYXRlIHRoZSBzbGFiIGFuZCBtZW1wb29sIGZvciByZXF1ZXN0IHN0cnVjdHMsIHJlZ2lzdGVycyBpMm9fYmxvY2sKKyAqCWJsb2NrIGRldmljZSBhbmQgZmluYWxseSByZWdpc3RlciB0aGUgQmxvY2sgT1NNIGluIHRoZSBJMk8gY29yZS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGkyb19ibG9ja19pbml0KHZvaWQpCit7CisJaW50IHJjOworCWludCBzaXplOworCisJcHJpbnRrKEtFUk5fSU5GTyBPU01fREVTQ1JJUFRJT04gIiB2IiBPU01fVkVSU0lPTiAiXG4iKTsKKworCS8qIEFsbG9jYXRlIHJlcXVlc3QgbWVtcG9vbCBhbmQgc2xhYiAqLworCXNpemUgPSBzaXplb2Yoc3RydWN0IGkyb19ibG9ja19yZXF1ZXN0KTsKKwlpMm9fYmxrX3JlcV9wb29sLnNsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaTJvX2Jsb2NrX3JlcSIsIHNpemUsIDAsCisJCQkJCQkgIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCwKKwkJCQkJCSAgTlVMTCk7CisJaWYgKCFpMm9fYmxrX3JlcV9wb29sLnNsYWIpIHsKKwkJb3NtX2VycigiY2FuJ3QgaW5pdCByZXF1ZXN0IHNsYWJcbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpMm9fYmxrX3JlcV9wb29sLnBvb2wgPSBtZW1wb29sX2NyZWF0ZShJMk9fUkVRX01FTVBPT0xfU0laRSwKKwkJCQkJICAgICAgIG1lbXBvb2xfYWxsb2Nfc2xhYiwKKwkJCQkJICAgICAgIG1lbXBvb2xfZnJlZV9zbGFiLAorCQkJCQkgICAgICAgaTJvX2Jsa19yZXFfcG9vbC5zbGFiKTsKKwlpZiAoIWkyb19ibGtfcmVxX3Bvb2wucG9vbCkgeworCQlvc21fZXJyKCJjYW4ndCBpbml0IHJlcXVlc3QgbWVtcG9vbFxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBmcmVlX3NsYWI7CisJfQorCisJLyogUmVnaXN0ZXIgdGhlIGJsb2NrIGRldmljZSBpbnRlcmZhY2VzICovCisJcmMgPSByZWdpc3Rlcl9ibGtkZXYoSTJPX01BSk9SLCAiaTJvX2Jsb2NrIik7CisJaWYgKHJjKSB7CisJCW9zbV9lcnIoInVuYWJsZSB0byByZWdpc3RlciBibG9jayBkZXZpY2VcbiIpOworCQlnb3RvIGZyZWVfbWVtcG9vbDsKKwl9CisjaWZkZWYgTU9EVUxFCisJb3NtX2luZm8oInJlZ2lzdGVyZWQgZGV2aWNlIGF0IG1ham9yICVkXG4iLCBJMk9fTUFKT1IpOworI2VuZGlmCisKKwkvKiBSZWdpc3RlciBCbG9jayBPU00gaW50byBJMk8gY29yZSAqLworCXJjID0gaTJvX2RyaXZlcl9yZWdpc3RlcigmaTJvX2Jsb2NrX2RyaXZlcik7CisJaWYgKHJjKSB7CisJCW9zbV9lcnIoIkNvdWxkIG5vdCByZWdpc3RlciBCbG9jayBkcml2ZXJcbiIpOworCQlnb3RvIHVucmVnaXN0ZXJfYmxrZGV2OworCX0KKworCXJldHVybiAwOworCisgICAgICB1bnJlZ2lzdGVyX2Jsa2RldjoKKwl1bnJlZ2lzdGVyX2Jsa2RldihJMk9fTUFKT1IsICJpMm9fYmxvY2siKTsKKworICAgICAgZnJlZV9tZW1wb29sOgorCW1lbXBvb2xfZGVzdHJveShpMm9fYmxrX3JlcV9wb29sLnBvb2wpOworCisgICAgICBmcmVlX3NsYWI6CisJa21lbV9jYWNoZV9kZXN0cm95KGkyb19ibGtfcmVxX3Bvb2wuc2xhYik7CisKKyAgICAgIGV4aXQ6CisJcmV0dXJuIHJjOworfTsKKworLyoqCisgKglpMm9fYmxvY2tfZXhpdCAtIEJsb2NrIE9TTSBleGl0IGZ1bmN0aW9uCisgKgorICoJVW5yZWdpc3RlcnMgQmxvY2sgT1NNIGZyb20gSTJPIGNvcmUsIHVucmVnaXN0ZXJzIGkyb19ibG9jayBibG9jayBkZXZpY2UKKyAqCWFuZCBmcmVlcyB0aGUgbWVtcG9vbCBhbmQgc2xhYi4KKyAqLworc3RhdGljIHZvaWQgX19leGl0IGkyb19ibG9ja19leGl0KHZvaWQpCit7CisJLyogVW5yZWdpc3RlciBJMk8gQmxvY2sgT1NNIGZyb20gSTJPIGNvcmUgKi8KKwlpMm9fZHJpdmVyX3VucmVnaXN0ZXIoJmkyb19ibG9ja19kcml2ZXIpOworCisJLyogVW5yZWdpc3RlciBibG9jayBkZXZpY2UgKi8KKwl1bnJlZ2lzdGVyX2Jsa2RldihJMk9fTUFKT1IsICJpMm9fYmxvY2siKTsKKworCS8qIEZyZWUgcmVxdWVzdCBtZW1wb29sIGFuZCBzbGFiICovCisJbWVtcG9vbF9kZXN0cm95KGkyb19ibGtfcmVxX3Bvb2wucG9vbCk7CisJa21lbV9jYWNoZV9kZXN0cm95KGkyb19ibGtfcmVxX3Bvb2wuc2xhYik7Cit9OworCitNT0RVTEVfQVVUSE9SKCJSZWQgSGF0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oT1NNX0RFU0NSSVBUSU9OKTsKK01PRFVMRV9WRVJTSU9OKE9TTV9WRVJTSU9OKTsKKworbW9kdWxlX2luaXQoaTJvX2Jsb2NrX2luaXQpOworbW9kdWxlX2V4aXQoaTJvX2Jsb2NrX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fYmxvY2suaCBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRkOWExNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqCUJsb2NrIE9TTSBzdHJ1Y3R1cmVzL0FQSQorICoKKyAqIAlDb3B5cmlnaHQgKEMpIDE5OTktMjAwMglSZWQgSGF0IFNvZnR3YXJlCisgKgorICoJV3JpdHRlbiBieSBBbGFuIENveCwgQnVpbGRpbmcgTnVtYmVyIFRocmVlIEx0ZAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqCW9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICoJV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqCUdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglGb3IgdGhlIHB1cnBvc2Ugb2YgYXZvaWRpbmcgZG91YnQgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrCisgKglmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMgc2hhbGwgYmUgYSBzdGFuZGFyZHMgY29tcGxpYW50IGZvcm0gc3VjaAorICoJZ3ppcHBlZCB0YXIgYW5kIG5vdCBvbmUgcmVxdWlyaW5nIGEgcHJvcHJpZXRhcnkgb3IgcGF0ZW50IGVuY3VtYmVyZWQKKyAqCXRvb2wgdG8gdW5wYWNrLgorICoKKyAqCUZpeGVzL2FkZGl0aW9uczoKKyAqCQlTdGV2ZSBSYWxzdG9uOgorICoJCQlNdWx0aXBsZSBkZXZpY2UgaGFuZGxpbmcgZXJyb3IgZml4ZXMsCisgKgkJCUFkZGVkIGEgcXVldWUgZGVwdGguCisgKgkJQWxhbiBDb3g6CisgKgkJCUZDOTIwIGhhcyBhbiBybXcgYnVnLiBEb250IG9yIGluIHRoZSBlbmQgbWFya2VyLgorICoJCQlSZW1vdmVkIHF1ZXVlIHdhbGssIGZpeGVkIGZvciA2NGJpdG5lc3MuCisgKgkJCVJld3JvdGUgbXVjaCBvZiB0aGUgY29kZSBvdmVyIHRpbWUKKyAqCQkJQWRkZWQgaW5kaXJlY3QgYmxvY2sgbGlzdHMKKyAqCQkJSGFuZGxlIDY0SyBsaW1pdHMgb24gbWFueSBjb250cm9sbGVycworICoJCQlEb24ndCB1c2UgaW5kaXJlY3RzIG9uIHRoZSBQcm9taXNlIChicmVha3MpCisgKgkJCUhlYXZpbHkgY2hvcCBkb3duIHRoZSBxdWV1ZSBkZXB0aHMKKyAqCQlEZWVwYWsgU2F4ZW5hOgorICoJCQlJbmRlcGVuZGVudCBxdWV1ZXMgcGVyIElPUAorICoJCQlTdXBwb3J0IGZvciBkeW5hbWljIGRldmljZSBjcmVhdGlvbi9kZWxldGlvbgorICoJCQlDb2RlIGNsZWFudXAKKyAqCSAgICAJCVN1cHBvcnQgZm9yIGxhcmdlciBJL09zIHRocm91Z2ggbWVyZ2UqIGZ1bmN0aW9ucworICoJCQkodGFrZW4gZnJvbSBEQUM5NjAgZHJpdmVyKQorICoJCUJvamkgVCBLYW5uYW50aGFuYW06CisgKgkJCVNldCB0aGUgSTJPIEJsb2NrIGRldmljZXMgdG8gYmUgZGV0ZWN0ZWQgaW4gaW5jcmVhc2luZworICoJCQlvcmRlciBvZiBUSURzIGR1cmluZyBib290LgorICoJCQlTZWFyY2ggYW5kIHNldCB0aGUgSTJPIGJsb2NrIGRldmljZSB0aGF0IHdlIGJvb3Qgb2ZmCisgKgkJCWZyb20gYXMgdGhlIGZpcnN0IGRldmljZSB0byBiZSBjbGFpbWVkIChhcyAvZGV2L2kyby9oZGEpCisgKgkJCVByb3Blcmx5IGF0dGFjaC9kZXRhY2ggSTJPIGdlbmRpc2sgc3RydWN0dXJlIGZyb20gdGhlCisgKgkJCXN5c3RlbSBnZW5kaXNrIGxpc3QuIFRoZSBJMk8gYmxvY2sgZGV2aWNlcyBub3cgYXBwZWFyIGluCisgKgkJCS9wcm9jL3BhcnRpdGlvbnMuCisgKgkJTWFya3VzIExpZGVsIDxNYXJrdXMuTGlkZWxAc2hhZG93Y29ubmVjdC5jb20+OgorICoJCQlNaW5vciBidWdmaXhlcyBmb3IgMi42LgorICovCisKKyNpZm5kZWYgSTJPX0JMT0NLX09TTV9ICisjZGVmaW5lIEkyT19CTE9DS19PU01fSAorCisjZGVmaW5lIEkyT19CTE9DS19SRVRSWV9USU1FIEhaLzQKKyNkZWZpbmUgSTJPX0JMT0NLX01BWF9PUEVOX1JFUVVFU1RTIDUwCisKKy8qIEkyTyBCbG9jayBPU00gbWVtcG9vbCBzdHJ1Y3QgKi8KK3N0cnVjdCBpMm9fYmxvY2tfbWVtcG9vbCB7CisJa21lbV9jYWNoZV90CSpzbGFiOworCW1lbXBvb2xfdAkqcG9vbDsKK307CisKKy8qIEkyTyBCbG9jayBkZXZpY2UgZGVzY3JpcHRvciAqLworc3RydWN0IGkyb19ibG9ja19kZXZpY2UgeworCXN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2OwkvKiBwb2ludGVyIHRvIEkyTyBkZXZpY2UgKi8KKwlzdHJ1Y3QgZ2VuZGlzayAqZ2Q7CisJc3BpbmxvY2tfdCBsb2NrOwkJLyogcXVldWUgbG9jayAqLworCXN0cnVjdCBsaXN0X2hlYWQgb3Blbl9xdWV1ZTsJLyogbGlzdCBvZiB0cmFuc2ZlcmVkLCBidXQgdW5maW5pc2hlZAorCQkJCQkgICByZXF1ZXN0cyAqLworCXVuc2lnbmVkIGludCBvcGVuX3F1ZXVlX2RlcHRoOwkvKiBudW1iZXIgb2YgcmVxdWVzdHMgaW4gdGhlIHF1ZXVlICovCisKKwlpbnQgcmNhY2hlOwkJCS8qIHJlYWQgY2FjaGUgZmxhZ3MgKi8KKwlpbnQgd2NhY2hlOwkJCS8qIHdyaXRlIGNhY2hlIGZsYWdzICovCisJaW50IGZsYWdzOworCWludCBwb3dlcjsJCQkvKiBwb3dlciBzdGF0ZSAqLworCWludCBtZWRpYV9jaGFuZ2VfZmxhZzsJCS8qIG1lZGlhIGNoYW5nZWQgZmxhZyAqLworfTsKKworLyogSTJPIEJsb2NrIGRldmljZSByZXF1ZXN0ICovCitzdHJ1Y3QgaTJvX2Jsb2NrX3JlcXVlc3QKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkIHF1ZXVlOworCXN0cnVjdCByZXF1ZXN0ICpyZXE7CQkvKiBjb3JyZXNwb25kaW5nIHJlcXVlc3QgKi8KKwlzdHJ1Y3QgaTJvX2Jsb2NrX2RldmljZSAqaTJvX2Jsa19kZXY7CS8qIEkyTyBibG9jayBkZXZpY2UgKi8KKwlpbnQgc2dfZG1hX2RpcmVjdGlvbjsJCS8qIGRpcmVjdGlvbiBvZiBETUEgYnVmZmVyIHJlYWQvd3JpdGUgKi8KKwlpbnQgc2dfbmVudHM7CQkJLyogbnVtYmVyIG9mIFNHIGVsZW1lbnRzICovCisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnX3RhYmxlW0kyT19NQVhfU0VHTUVOVFNdOyAvKiBTRyB0YWJsZSAqLworfTsKKworLyogSTJPIEJsb2NrIGRldmljZSBkZWxheWVkIHJlcXVlc3QgKi8KK3N0cnVjdCBpMm9fYmxvY2tfZGVsYXllZF9yZXF1ZXN0Cit7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19jb25maWcuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2NvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYzUwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19jb25maWcuYwpAQCAtMCwwICsxLDExNjAgQEAKKy8qCisgKiBJMk8gQ29uZmlndXJhdGlvbiBJbnRlcmZhY2UgRHJpdmVyCisgKgorICogKEMpIENvcHlyaWdodCAxOTk5LTIwMDIgIFJlZCBIYXQKKyAqCisgKiBXcml0dGVuIGJ5IEFsYW4gQ294LCBCdWlsZGluZyBOdW1iZXIgVGhyZWUgTHRkCisgKgorICogRml4ZXMvYWRkaXRpb25zOgorICoJRGVlcGFrIFNheGVuYSAoMDQvMjAvMTk5OSk6CisgKgkJQWRkZWQgYmFzaWMgaW9jdGwoKSBzdXBwb3J0CisgKglEZWVwYWsgU2F4ZW5hICgwNi8wNy8xOTk5KToKKyAqCQlBZGRlZCBzb2Z0d2FyZSBkb3dubG9hZCBpb2N0bCAoc3RpbGwgdGVzdGluZykKKyAqCUF1dm8gSORra2luZW4gKDA5LzEwLzE5OTkpOgorICoJCUNoYW5nZXMgdG8gaTJvX2NmZ19yZXBseSgpLCBpb2N0bF9wYXJtcygpCisgKgkJQWRkZWQgaW9jdF92YWxpZGF0ZSgpCisgKglUYW5lbGkgVuRo5GthbmdhcyAoMDkvMzAvMTk5OSk6CisgKgkJRml4ZWQgaW9jdGxfc3dkbCgpCisgKglUYW5lbGkgVuRo5GthbmdhcyAoMTAvMDQvMTk5OSk6CisgKgkJQ2hhbmdlZCBpb2N0bF9zd2RsKCksIGltcGxlbWVudGVkIGlvY3RsX3N3dWwoKSBhbmQgaW9jdGxfc3dkZWwoKQorICoJRGVlcGFrIFNheGVuYSAoMTEvMTgvMTk5OSk6CisgKgkJQWRkZWQgZXZlbnQgbWFuYWdtZW5ldCBzdXBwb3J0CisgKglBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPjoKKyAqCQkyLjQgcmV3cml0ZSBwb3J0ZWQgdG8gMi41CisgKglNYXJrdXMgTGlkZWwgPE1hcmt1cy5MaWRlbEBzaGFkb3djb25uZWN0LmNvbT46CisgKgkJQWRkZWQgcGFzcy10aHJ1IHN1cHBvcnQgZm9yIEFkYXB0ZWMncyByYWlkdXRpbHMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pMm8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBPU01fTkFNRQkiY29uZmlnLW9zbSIKKyNkZWZpbmUgT1NNX1ZFUlNJT04JIiRSZXYkIgorI2RlZmluZSBPU01fREVTQ1JJUFRJT04JIkkyTyBDb25maWd1cmF0aW9uIE9TTSIKKworZXh0ZXJuIGludCBpMm9fcGFybV9pc3N1ZShzdHJ1Y3QgaTJvX2RldmljZSAqLCBpbnQsIHZvaWQgKiwgaW50LCB2b2lkICosIGludCk7CisKK3N0YXRpYyBzcGlubG9ja190IGkyb19jb25maWdfbG9jazsKKworI2RlZmluZSBNT0RJTkMoeCx5KSAoKHgpID0gKCh4KSArIDEpICUgKHkpKQorCitzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQgeworCXUzMiBmbGFnX2NvdW50OworCXUzMiBhZGRyX2J1czsKK307CisKK3N0cnVjdCBpMm9fY2ZnX2luZm8geworCXN0cnVjdCBmaWxlICpmcDsKKwlzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqZmFzeW5jOworCXN0cnVjdCBpMm9fZXZ0X2luZm8gZXZlbnRfcVtJMk9fRVZUX1FfTEVOXTsKKwl1MTYgcV9pbjsJCS8vIFF1ZXVlIGhlYWQgaW5kZXgKKwl1MTYgcV9vdXQ7CQkvLyBRdWV1ZSB0YWlsIGluZGV4CisJdTE2IHFfbGVuOwkJLy8gUXVldWUgbGVuZ3RoCisJdTE2IHFfbG9zdDsJCS8vIE51bWJlciBvZiBsb3N0IGV2ZW50cworCXVsb25nIHFfaWQ7CQkvLyBFdmVudCBxdWV1ZSBJRC4uLnVzZWQgYXMgdHhfY29udGV4dAorCXN0cnVjdCBpMm9fY2ZnX2luZm8gKm5leHQ7Cit9Oworc3RhdGljIHN0cnVjdCBpMm9fY2ZnX2luZm8gKm9wZW5fZmlsZXMgPSBOVUxMOworc3RhdGljIHVsb25nIGkyb19jZmdfaW5mb19pZCA9IDA7CisKKy8qCisgKglFYWNoIG9mIHRoZXNlIGRlc2NyaWJlcyBhbiBpMm8gbWVzc2FnZSBoYW5kbGVyLiBUaGV5IGFyZQorICoJbXVsdGlwbGV4ZWQgYnkgdGhlIGkyb19jb3JlIGNvZGUKKyAqLworCitzdGF0aWMgc3RydWN0IGkyb19kcml2ZXIgaTJvX2NvbmZpZ19kcml2ZXIgPSB7CisJLm5hbWUgPSBPU01fTkFNRQorfTsKKworc3RhdGljIGludCBpMm9fY2ZnX2dldGlvcHModW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjOworCXU4IF9fdXNlciAqdXNlcl9pb3BfdGFibGUgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJdTggdG1wW01BWF9JMk9fQ09OVFJPTExFUlNdOworCWludCByZXQgPSAwOworCisJbWVtc2V0KHRtcCwgMCwgTUFYX0kyT19DT05UUk9MTEVSUyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZpMm9fY29udHJvbGxlcnMsIGxpc3QpCisJICAgIHRtcFtjLT51bml0XSA9IDE7CisKKwlpZiAoY29weV90b191c2VyKHVzZXJfaW9wX3RhYmxlLCB0bXAsIE1BWF9JMk9fQ09OVFJPTExFUlMpKQorCQlyZXQgPSAtRUZBVUxUOworCisJcmV0dXJuIHJldDsKK307CisKK3N0YXRpYyBpbnQgaTJvX2NmZ19nZXRocnQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjOworCXN0cnVjdCBpMm9fY21kX2hydGxjdCBfX3VzZXIgKmNtZCA9IChzdHJ1Y3QgaTJvX2NtZF9ocnRsY3QgX191c2VyICopYXJnOworCXN0cnVjdCBpMm9fY21kX2hydGxjdCBrY21kOworCWkyb19ocnQgKmhydDsKKwlpbnQgbGVuOworCXUzMiByZXNsZW47CisJaW50IHJldCA9IDA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmtjbWQsIGNtZCwgc2l6ZW9mKHN0cnVjdCBpMm9fY21kX2hydGxjdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChnZXRfdXNlcihyZXNsZW4sIGtjbWQucmVzbGVuKSA8IDApCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGtjbWQucmVzYnVmID09IE5VTEwpCisJCXJldHVybiAtRUZBVUxUOworCisJYyA9IGkyb19maW5kX2lvcChrY21kLmlvcCk7CisJaWYgKCFjKQorCQlyZXR1cm4gLUVOWElPOworCisJaHJ0ID0gKGkyb19ocnQgKikgYy0+aHJ0LnZpcnQ7CisKKwlsZW4gPSA4ICsgKChocnQtPmVudHJ5X2xlbiAqIGhydC0+bnVtX2VudHJpZXMpIDw8IDIpOworCisJLyogV2UgZGlkIGEgZ2V0IHVzZXIuLi5zbyBhc3N1bWluZyBtZW0gaXMgb2suLi5pcyB0aGlzIGJhZD8gKi8KKwlwdXRfdXNlcihsZW4sIGtjbWQucmVzbGVuKTsKKwlpZiAobGVuID4gcmVzbGVuKQorCQlyZXQgPSAtRU5PQlVGUzsKKwlpZiAoY29weV90b191c2VyKGtjbWQucmVzYnVmLCAodm9pZCAqKWhydCwgbGVuKSkKKwkJcmV0ID0gLUVGQVVMVDsKKworCXJldHVybiByZXQ7Cit9OworCitzdGF0aWMgaW50IGkyb19jZmdfZ2V0bGN0KHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKKwlzdHJ1Y3QgaTJvX2NtZF9ocnRsY3QgX191c2VyICpjbWQgPSAoc3RydWN0IGkyb19jbWRfaHJ0bGN0IF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgaTJvX2NtZF9ocnRsY3Qga2NtZDsKKwlpMm9fbGN0ICpsY3Q7CisJaW50IGxlbjsKKwlpbnQgcmV0ID0gMDsKKwl1MzIgcmVzbGVuOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZrY21kLCBjbWQsIHNpemVvZihzdHJ1Y3QgaTJvX2NtZF9ocnRsY3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZ2V0X3VzZXIocmVzbGVuLCBrY21kLnJlc2xlbikgPCAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChrY21kLnJlc2J1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWMgPSBpMm9fZmluZF9pb3Aoa2NtZC5pb3ApOworCWlmICghYykKKwkJcmV0dXJuIC1FTlhJTzsKKworCWxjdCA9IChpMm9fbGN0ICopIGMtPmxjdDsKKworCWxlbiA9ICh1bnNpZ25lZCBpbnQpbGN0LT50YWJsZV9zaXplIDw8IDI7CisJcHV0X3VzZXIobGVuLCBrY21kLnJlc2xlbik7CisJaWYgKGxlbiA+IHJlc2xlbikKKwkJcmV0ID0gLUVOT0JVRlM7CisJZWxzZSBpZiAoY29weV90b191c2VyKGtjbWQucmVzYnVmLCBsY3QsIGxlbikpCisJCXJldCA9IC1FRkFVTFQ7CisKKwlyZXR1cm4gcmV0OworfTsKKworc3RhdGljIGludCBpMm9fY2ZnX3Bhcm1zKHVuc2lnbmVkIGxvbmcgYXJnLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmM7CisJc3RydWN0IGkyb19kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaTJvX2NtZF9wc2V0Z2V0IF9fdXNlciAqY21kID0KKwkgICAgKHN0cnVjdCBpMm9fY21kX3BzZXRnZXQgX191c2VyICopYXJnOworCXN0cnVjdCBpMm9fY21kX3BzZXRnZXQga2NtZDsKKwl1MzIgcmVzbGVuOworCXU4ICpvcHM7CisJdTggKnJlczsKKwlpbnQgbGVuID0gMDsKKworCXUzMiBpMm9fY21kID0gKHR5cGUgPT0gSTJPUEFSTUdFVCA/CisJCSAgICAgICBJMk9fQ01EX1VUSUxfUEFSQU1TX0dFVCA6IEkyT19DTURfVVRJTF9QQVJBTVNfU0VUKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigma2NtZCwgY21kLCBzaXplb2Yoc3RydWN0IGkyb19jbWRfcHNldGdldCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChnZXRfdXNlcihyZXNsZW4sIGtjbWQucmVzbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljID0gaTJvX2ZpbmRfaW9wKGtjbWQuaW9wKTsKKwlpZiAoIWMpCisJCXJldHVybiAtRU5YSU87CisKKwlkZXYgPSBpMm9faW9wX2ZpbmRfZGV2aWNlKGMsIGtjbWQudGlkKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTlhJTzsKKworCW9wcyA9ICh1OCAqKSBrbWFsbG9jKGtjbWQub3BsZW4sIEdGUF9LRVJORUwpOworCWlmICghb3BzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihvcHMsIGtjbWQub3BidWYsIGtjbWQub3BsZW4pKSB7CisJCWtmcmVlKG9wcyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCS8qCisJICogSXQncyBwb3NzaWJsZSB0byBoYXZlIGEgX3ZlcnlfIGxhcmdlIHRhYmxlCisJICogYW5kIHRoYXQgdGhlIHVzZXIgYXNrcyBmb3IgYWxsIG9mIGl0IGF0IG9uY2UuLi4KKwkgKi8KKwlyZXMgPSAodTggKikga21hbGxvYyg2NTUzNiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXMpIHsKKwkJa2ZyZWUob3BzKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbGVuID0gaTJvX3Bhcm1faXNzdWUoZGV2LCBpMm9fY21kLCBvcHMsIGtjbWQub3BsZW4sIHJlcywgNjU1MzYpOworCWtmcmVlKG9wcyk7CisKKwlpZiAobGVuIDwgMCkgeworCQlrZnJlZShyZXMpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlwdXRfdXNlcihsZW4sIGtjbWQucmVzbGVuKTsKKwlpZiAobGVuID4gcmVzbGVuKQorCQlyZXQgPSAtRU5PQlVGUzsKKwllbHNlIGlmIChjb3B5X3RvX3VzZXIoa2NtZC5yZXNidWYsIHJlcywgbGVuKSkKKwkJcmV0ID0gLUVGQVVMVDsKKworCWtmcmVlKHJlcyk7CisKKwlyZXR1cm4gcmV0OworfTsKKworc3RhdGljIGludCBpMm9fY2ZnX3N3ZGwodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGkyb19zd194ZmVyIGt4ZmVyOworCXN0cnVjdCBpMm9fc3dfeGZlciBfX3VzZXIgKnB4ZmVyID0gKHN0cnVjdCBpMm9fc3dfeGZlciBfX3VzZXIgKilhcmc7CisJdW5zaWduZWQgY2hhciBtYXhmcmFnID0gMCwgY3VyZnJhZyA9IDE7CisJc3RydWN0IGkyb19kbWEgYnVmZmVyOworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdTMyIG07CisJdW5zaWduZWQgaW50IHN0YXR1cyA9IDAsIHN3bGVuID0gMCwgZnJhZ3NpemUgPSA4MTkyOworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigma3hmZXIsIHB4ZmVyLCBzaXplb2Yoc3RydWN0IGkyb19zd194ZmVyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGdldF91c2VyKHN3bGVuLCBreGZlci5zd2xlbikgPCAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChnZXRfdXNlcihtYXhmcmFnLCBreGZlci5tYXhmcmFnKSA8IDApCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGdldF91c2VyKGN1cmZyYWcsIGt4ZmVyLmN1cmZyYWcpIDwgMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY3VyZnJhZyA9PSBtYXhmcmFnKQorCQlmcmFnc2l6ZSA9IHN3bGVuIC0gKG1heGZyYWcgLSAxKSAqIDgxOTI7CisKKwlpZiAoIWt4ZmVyLmJ1ZiB8fCAhYWNjZXNzX29rKFZFUklGWV9SRUFELCBreGZlci5idWYsIGZyYWdzaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljID0gaTJvX2ZpbmRfaW9wKGt4ZmVyLmlvcCk7CisJaWYgKCFjKQorCQlyZXR1cm4gLUVOWElPOworCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChpMm9fZG1hX2FsbG9jKCZjLT5wZGV2LT5kZXYsICZidWZmZXIsIGZyYWdzaXplLCBHRlBfS0VSTkVMKSkgeworCQlpMm9fbXNnX25vcChjLCBtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJX19jb3B5X2Zyb21fdXNlcihidWZmZXIudmlydCwga3hmZXIuYnVmLCBmcmFnc2l6ZSk7CisKKwl3cml0ZWwoTklORV9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF83LCAmbXNnLT51LmhlYWRbMF0pOworCXdyaXRlbChJMk9fQ01EX1NXX0RPV05MT0FEIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCBBREFQVEVSX1RJRCwKKwkgICAgICAgJm1zZy0+dS5oZWFkWzFdKTsKKwl3cml0ZWwoaTJvX2NvbmZpZ19kcml2ZXIuY29udGV4dCwgJm1zZy0+dS5oZWFkWzJdKTsKKwl3cml0ZWwoMCwgJm1zZy0+dS5oZWFkWzNdKTsKKwl3cml0ZWwoKCgodTMyKSBreGZlci5mbGFncykgPDwgMjQpIHwgKCgodTMyKSBreGZlci5zd190eXBlKSA8PCAxNikgfAorCSAgICAgICAoKCh1MzIpIG1heGZyYWcpIDw8IDgpIHwgKCgodTMyKSBjdXJmcmFnKSksICZtc2ctPmJvZHlbMF0pOworCXdyaXRlbChzd2xlbiwgJm1zZy0+Ym9keVsxXSk7CisJd3JpdGVsKGt4ZmVyLnN3X2lkLCAmbXNnLT5ib2R5WzJdKTsKKwl3cml0ZWwoMHhEMDAwMDAwMCB8IGZyYWdzaXplLCAmbXNnLT5ib2R5WzNdKTsKKwl3cml0ZWwoYnVmZmVyLnBoeXMsICZtc2ctPmJvZHlbNF0pOworCisJb3NtX2RlYnVnKCJzd2RsIGZyYWcgJWQvJWQgKHNpemUgJWQpXG4iLCBjdXJmcmFnLCBtYXhmcmFnLCBmcmFnc2l6ZSk7CisJc3RhdHVzID0gaTJvX21zZ19wb3N0X3dhaXRfbWVtKGMsIG0sIDYwLCAmYnVmZmVyKTsKKworCWlmIChzdGF0dXMgIT0gLUVUSU1FRE9VVCkKKwkJaTJvX2RtYV9mcmVlKCZjLT5wZGV2LT5kZXYsICZidWZmZXIpOworCisJaWYgKHN0YXR1cyAhPSBJMk9fUE9TVF9XQUlUX09LKSB7CisJCS8vIGl0IGZhaWxzIGlmIHlvdSB0cnkgYW5kIHNlbmQgZnJhZ3Mgb3V0IG9mIG9yZGVyCisJCS8vIGFuZCBmb3Igc29tZSB5ZXQgdW5rbm93biByZWFzb25zIHRvbworCQlvc21faW5mbygic3dkbCBmYWlsZWQsIERldGFpbGVkU3RhdHVzID0gJWRcbiIsIHN0YXR1cyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcmV0dXJuIDA7Cit9OworCitzdGF0aWMgaW50IGkyb19jZmdfc3d1bCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaTJvX3N3X3hmZXIga3hmZXI7CisJc3RydWN0IGkyb19zd194ZmVyIF9fdXNlciAqcHhmZXIgPSAoc3RydWN0IGkyb19zd194ZmVyIF9fdXNlciAqKWFyZzsKKwl1bnNpZ25lZCBjaGFyIG1heGZyYWcgPSAwLCBjdXJmcmFnID0gMTsKKwlzdHJ1Y3QgaTJvX2RtYSBidWZmZXI7CisJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZzsKKwl1MzIgbTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzID0gMCwgc3dsZW4gPSAwLCBmcmFnc2l6ZSA9IDgxOTI7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjOworCWludCByZXQgPSAwOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZreGZlciwgcHhmZXIsIHNpemVvZihzdHJ1Y3QgaTJvX3N3X3hmZXIpKSkKKwkJZ290byByZXR1cm5fZmF1bHQ7CisKKwlpZiAoZ2V0X3VzZXIoc3dsZW4sIGt4ZmVyLnN3bGVuKSA8IDApCisJCWdvdG8gcmV0dXJuX2ZhdWx0OworCisJaWYgKGdldF91c2VyKG1heGZyYWcsIGt4ZmVyLm1heGZyYWcpIDwgMCkKKwkJZ290byByZXR1cm5fZmF1bHQ7CisKKwlpZiAoZ2V0X3VzZXIoY3VyZnJhZywga3hmZXIuY3VyZnJhZykgPCAwKQorCQlnb3RvIHJldHVybl9mYXVsdDsKKworCWlmIChjdXJmcmFnID09IG1heGZyYWcpCisJCWZyYWdzaXplID0gc3dsZW4gLSAobWF4ZnJhZyAtIDEpICogODE5MjsKKworCWlmICgha3hmZXIuYnVmKQorCQlnb3RvIHJldHVybl9mYXVsdDsKKworCWMgPSBpMm9fZmluZF9pb3Aoa3hmZXIuaW9wKTsKKwlpZiAoIWMpCisJCXJldHVybiAtRU5YSU87CisKKwltID0gaTJvX21zZ19nZXRfd2FpdChjLCAmbXNnLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7CisJaWYgKG0gPT0gSTJPX1FVRVVFX0VNUFRZKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKGkyb19kbWFfYWxsb2MoJmMtPnBkZXYtPmRldiwgJmJ1ZmZlciwgZnJhZ3NpemUsIEdGUF9LRVJORUwpKSB7CisJCWkyb19tc2dfbm9wKGMsIG0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl3cml0ZWwoTklORV9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF83LCAmbXNnLT51LmhlYWRbMF0pOworCXdyaXRlbChJMk9fQ01EX1NXX1VQTE9BRCA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgQURBUFRFUl9USUQsCisJICAgICAgICZtc2ctPnUuaGVhZFsxXSk7CisJd3JpdGVsKGkyb19jb25maWdfZHJpdmVyLmNvbnRleHQsICZtc2ctPnUuaGVhZFsyXSk7CisJd3JpdGVsKDAsICZtc2ctPnUuaGVhZFszXSk7CisJd3JpdGVsKCh1MzIpIGt4ZmVyLmZsYWdzIDw8IDI0IHwgKHUzMikga3hmZXIuCisJICAgICAgIHN3X3R5cGUgPDwgMTYgfCAodTMyKSBtYXhmcmFnIDw8IDggfCAodTMyKSBjdXJmcmFnLAorCSAgICAgICAmbXNnLT5ib2R5WzBdKTsKKwl3cml0ZWwoc3dsZW4sICZtc2ctPmJvZHlbMV0pOworCXdyaXRlbChreGZlci5zd19pZCwgJm1zZy0+Ym9keVsyXSk7CisJd3JpdGVsKDB4RDAwMDAwMDAgfCBmcmFnc2l6ZSwgJm1zZy0+Ym9keVszXSk7CisJd3JpdGVsKGJ1ZmZlci5waHlzLCAmbXNnLT5ib2R5WzRdKTsKKworCW9zbV9kZWJ1Zygic3d1bCBmcmFnICVkLyVkIChzaXplICVkKVxuIiwgY3VyZnJhZywgbWF4ZnJhZywgZnJhZ3NpemUpOworCXN0YXR1cyA9IGkyb19tc2dfcG9zdF93YWl0X21lbShjLCBtLCA2MCwgJmJ1ZmZlcik7CisKKwlpZiAoc3RhdHVzICE9IEkyT19QT1NUX1dBSVRfT0spIHsKKwkJaWYgKHN0YXR1cyAhPSAtRVRJTUVET1VUKQorCQkJaTJvX2RtYV9mcmVlKCZjLT5wZGV2LT5kZXYsICZidWZmZXIpOworCisJCW9zbV9pbmZvKCJzd3VsIGZhaWxlZCwgRGV0YWlsZWRTdGF0dXMgPSAlZFxuIiwgc3RhdHVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlpZiAoY29weV90b191c2VyKGt4ZmVyLmJ1ZiwgYnVmZmVyLnZpcnQsIGZyYWdzaXplKSkKKwkJcmV0ID0gLUVGQVVMVDsKKworCWkyb19kbWFfZnJlZSgmYy0+cGRldi0+ZGV2LCAmYnVmZmVyKTsKKworcmV0dXJuX3JldDoKKwlyZXR1cm4gcmV0OworcmV0dXJuX2ZhdWx0OgorCXJldCA9IC1FRkFVTFQ7CisJZ290byByZXR1cm5fcmV0OworfTsKKworc3RhdGljIGludCBpMm9fY2ZnX3N3ZGVsKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKKwlzdHJ1Y3QgaTJvX3N3X3hmZXIga3hmZXI7CisJc3RydWN0IGkyb19zd194ZmVyIF9fdXNlciAqcHhmZXIgPSAoc3RydWN0IGkyb19zd194ZmVyIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXUzMiBtOworCXVuc2lnbmVkIGludCBzd2xlbjsKKwlpbnQgdG9rZW47CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmt4ZmVyLCBweGZlciwgc2l6ZW9mKHN0cnVjdCBpMm9fc3dfeGZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChnZXRfdXNlcihzd2xlbiwga3hmZXIuc3dsZW4pIDwgMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljID0gaTJvX2ZpbmRfaW9wKGt4ZmVyLmlvcCk7CisJaWYgKCFjKQorCQlyZXR1cm4gLUVOWElPOworCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXdyaXRlbChTRVZFTl9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF8wLCAmbXNnLT51LmhlYWRbMF0pOworCXdyaXRlbChJMk9fQ01EX1NXX1JFTU9WRSA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgQURBUFRFUl9USUQsCisJICAgICAgICZtc2ctPnUuaGVhZFsxXSk7CisJd3JpdGVsKGkyb19jb25maWdfZHJpdmVyLmNvbnRleHQsICZtc2ctPnUuaGVhZFsyXSk7CisJd3JpdGVsKDAsICZtc2ctPnUuaGVhZFszXSk7CisJd3JpdGVsKCh1MzIpIGt4ZmVyLmZsYWdzIDw8IDI0IHwgKHUzMikga3hmZXIuc3dfdHlwZSA8PCAxNiwKKwkgICAgICAgJm1zZy0+Ym9keVswXSk7CisJd3JpdGVsKHN3bGVuLCAmbXNnLT5ib2R5WzFdKTsKKwl3cml0ZWwoa3hmZXIuc3dfaWQsICZtc2ctPmJvZHlbMl0pOworCisJdG9rZW4gPSBpMm9fbXNnX3Bvc3Rfd2FpdChjLCBtLCAxMCk7CisKKwlpZiAodG9rZW4gIT0gSTJPX1BPU1RfV0FJVF9PSykgeworCQlvc21faW5mbygic3dkZWwgZmFpbGVkLCBEZXRhaWxlZFN0YXR1cyA9ICVkXG4iLCB0b2tlbik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCXJldHVybiAwOworfTsKKworc3RhdGljIGludCBpMm9fY2ZnX3ZhbGlkYXRlKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCB0b2tlbjsKKwlpbnQgaW9wID0gKGludClhcmc7CisJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZzsKKwl1MzIgbTsKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmM7CisKKwljID0gaTJvX2ZpbmRfaW9wKGlvcCk7CisJaWYgKCFjKQorCQlyZXR1cm4gLUVOWElPOworCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXdyaXRlbChGT1VSX1dPUkRfTVNHX1NJWkUgfCBTR0xfT0ZGU0VUXzAsICZtc2ctPnUuaGVhZFswXSk7CisJd3JpdGVsKEkyT19DTURfQ09ORklHX1ZBTElEQVRFIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCBpb3AsCisJICAgICAgICZtc2ctPnUuaGVhZFsxXSk7CisJd3JpdGVsKGkyb19jb25maWdfZHJpdmVyLmNvbnRleHQsICZtc2ctPnUuaGVhZFsyXSk7CisJd3JpdGVsKDAsICZtc2ctPnUuaGVhZFszXSk7CisKKwl0b2tlbiA9IGkyb19tc2dfcG9zdF93YWl0KGMsIG0sIDEwKTsKKworCWlmICh0b2tlbiAhPSBJMk9fUE9TVF9XQUlUX09LKSB7CisJCW9zbV9pbmZvKCJDYW4ndCB2YWxpZGF0ZSBjb25maWd1cmF0aW9uLCBFcnJvclN0YXR1cyA9ICVkXG4iLAorCQkJIHRva2VuKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIDA7Cit9OworCitzdGF0aWMgaW50IGkyb19jZmdfZXZ0X3JlZyh1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZpbGUgKmZwKQoreworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdTMyIG07CisJc3RydWN0IGkyb19ldnRfaWQgX191c2VyICpwZGVzYyA9IChzdHJ1Y3QgaTJvX2V2dF9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGkyb19ldnRfaWQga2Rlc2M7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjOworCXN0cnVjdCBpMm9fZGV2aWNlICpkOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZrZGVzYywgcGRlc2MsIHNpemVvZihzdHJ1Y3QgaTJvX2V2dF9pZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIElPUCBleGlzdHM/ICovCisJYyA9IGkyb19maW5kX2lvcChrZGVzYy5pb3ApOworCWlmICghYykKKwkJcmV0dXJuIC1FTlhJTzsKKworCS8qIERldmljZSBleGlzdHM/ICovCisJZCA9IGkyb19pb3BfZmluZF9kZXZpY2UoYywga2Rlc2MudGlkKTsKKwlpZiAoIWQpCisJCXJldHVybiAtRU5PREVWOworCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXdyaXRlbChGT1VSX1dPUkRfTVNHX1NJWkUgfCBTR0xfT0ZGU0VUXzAsICZtc2ctPnUuaGVhZFswXSk7CisJd3JpdGVsKEkyT19DTURfVVRJTF9FVlRfUkVHSVNURVIgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IGtkZXNjLnRpZCwKKwkgICAgICAgJm1zZy0+dS5oZWFkWzFdKTsKKwl3cml0ZWwoaTJvX2NvbmZpZ19kcml2ZXIuY29udGV4dCwgJm1zZy0+dS5oZWFkWzJdKTsKKwl3cml0ZWwoaTJvX2NudHh0X2xpc3RfYWRkKGMsIGZwLT5wcml2YXRlX2RhdGEpLCAmbXNnLT51LmhlYWRbM10pOworCXdyaXRlbChrZGVzYy5ldnRfbWFzaywgJm1zZy0+Ym9keVswXSk7CisKKwlpMm9fbXNnX3Bvc3QoYywgbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpMm9fY2ZnX2V2dF9nZXQodW5zaWduZWQgbG9uZyBhcmcsIHN0cnVjdCBmaWxlICpmcCkKK3sKKwlzdHJ1Y3QgaTJvX2NmZ19pbmZvICpwID0gTlVMTDsKKwlzdHJ1Y3QgaTJvX2V2dF9nZXQgX191c2VyICp1Z2V0ID0gKHN0cnVjdCBpMm9fZXZ0X2dldCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGkyb19ldnRfZ2V0IGtnZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZvciAocCA9IG9wZW5fZmlsZXM7IHA7IHAgPSBwLT5uZXh0KQorCQlpZiAocC0+cV9pZCA9PSAodWxvbmcpIGZwLT5wcml2YXRlX2RhdGEpCisJCQlicmVhazsKKworCWlmICghcC0+cV9sZW4pCisJCXJldHVybiAtRU5PRU5UOworCisJbWVtY3B5KCZrZ2V0LmluZm8sICZwLT5ldmVudF9xW3AtPnFfb3V0XSwgc2l6ZW9mKHN0cnVjdCBpMm9fZXZ0X2luZm8pKTsKKwlNT0RJTkMocC0+cV9vdXQsIEkyT19FVlRfUV9MRU4pOworCXNwaW5fbG9ja19pcnFzYXZlKCZpMm9fY29uZmlnX2xvY2ssIGZsYWdzKTsKKwlwLT5xX2xlbi0tOworCWtnZXQucGVuZGluZyA9IHAtPnFfbGVuOworCWtnZXQubG9zdCA9IHAtPnFfbG9zdDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMm9fY29uZmlnX2xvY2ssIGZsYWdzKTsKKworCWlmIChjb3B5X3RvX3VzZXIodWdldCwgJmtnZXQsIHNpemVvZihzdHJ1Y3QgaTJvX2V2dF9nZXQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgaW50IGkyb19jZmdfcGFzc3RocnUzMih1bnNpZ25lZCBmZCwgdW5zaWduZWQgY21uZCwgdW5zaWduZWQgbG9uZyBhcmcsCisJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaTJvX2NtZF9wYXNzdGhydTMyIF9fdXNlciAqY21kOworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKKwl1MzIgX191c2VyICp1c2VyX21zZzsKKwl1MzIgKnJlcGx5ID0gTlVMTDsKKwl1MzIgX191c2VyICp1c2VyX3JlcGx5ID0gTlVMTDsKKwl1MzIgc2l6ZSA9IDA7CisJdTMyIHJlcGx5X3NpemUgPSAwOworCXUzMiByY29kZSA9IDA7CisJc3RydWN0IGkyb19kbWEgc2dfbGlzdFtTR19UQUJMRVNJWkVdOworCXUzMiBzZ19vZmZzZXQgPSAwOworCXUzMiBzZ19jb3VudCA9IDA7CisJdTMyIGkgPSAwOworCWkyb19zdGF0dXNfYmxvY2sgKnNiOworCXN0cnVjdCBpMm9fbWVzc2FnZSAqbXNnOworCXUzMiBtOworCXVuc2lnbmVkIGludCBpb3A7CisKKwljbWQgPSAoc3RydWN0IGkyb19jbWRfcGFzc3RocnUzMiBfX3VzZXIgKilhcmc7CisKKwlpZiAoZ2V0X3VzZXIoaW9wLCAmY21kLT5pb3ApIHx8IGdldF91c2VyKGksICZjbWQtPm1zZykpCisJCXJldHVybiAtRUZBVUxUOworCisJdXNlcl9tc2cgPSBjb21wYXRfcHRyKGkpOworCisJYyA9IGkyb19maW5kX2lvcChpb3ApOworCWlmICghYykgeworCQlvc21fZGVidWcoImNvbnRyb2xsZXIgJWQgbm90IGZvdW5kXG4iLCBpb3ApOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKworCXNiID0gYy0+c3RhdHVzX2Jsb2NrLnZpcnQ7CisKKwlpZiAoZ2V0X3VzZXIoc2l6ZSwgJnVzZXJfbXNnWzBdKSkgeworCQlvc21fd2FybigidW5hYmxlIHRvIGdldCBzaXplIVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlzaXplID0gc2l6ZSA+PiAxNjsKKworCWlmIChzaXplID4gc2ItPmluYm91bmRfZnJhbWVfc2l6ZSkgeworCQlvc21fd2Fybigic2l6ZSBvZiBtZXNzYWdlID4gaW5ib3VuZF9mcmFtZV9zaXplIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXVzZXJfcmVwbHkgPSAmdXNlcl9tc2dbc2l6ZV07CisKKwlzaXplIDw8PSAyOwkJLy8gQ29udmVydCB0byBieXRlcworCisJLyogQ29weSBpbiB0aGUgdXNlcidzIEkyTyBjb21tYW5kICovCisJaWYgKGNvcHlfZnJvbV91c2VyKG1zZywgdXNlcl9tc2csIHNpemUpKSB7CisJCW9zbV93YXJuKCJ1bmFibGUgdG8gY29weSB1c2VyIG1lc3NhZ2VcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJaTJvX2R1bXBfbWVzc2FnZShtc2cpOworCisJaWYgKGdldF91c2VyKHJlcGx5X3NpemUsICZ1c2VyX3JlcGx5WzBdKSA8IDApCisJCXJldHVybiAtRUZBVUxUOworCisJcmVwbHlfc2l6ZSA+Pj0gMTY7CisJcmVwbHlfc2l6ZSA8PD0gMjsKKworCXJlcGx5ID0ga21hbGxvYyhyZXBseV9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcGx5KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgcmVwbHkgYnVmZmVyXG4iLAorCQkgICAgICAgYy0+bmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQocmVwbHksIDAsIHJlcGx5X3NpemUpOworCisJc2dfb2Zmc2V0ID0gKG1zZy0+dS5oZWFkWzBdID4+IDQpICYgMHgwZjsKKworCXdyaXRlbChpMm9fY29uZmlnX2RyaXZlci5jb250ZXh0LCAmbXNnLT51LnMuaWNudHh0KTsKKwl3cml0ZWwoaTJvX2NudHh0X2xpc3RfYWRkKGMsIHJlcGx5KSwgJm1zZy0+dS5zLnRjbnR4dCk7CisKKwltZW1zZXQoc2dfbGlzdCwgMCwgc2l6ZW9mKHNnX2xpc3RbMF0pICogU0dfVEFCTEVTSVpFKTsKKwlpZiAoc2dfb2Zmc2V0KSB7CisJCXN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCAqc2c7CisKKwkJaWYgKHNnX29mZnNldCAqIDQgPj0gc2l6ZSkgeworCQkJcmNvZGUgPSAtRUZBVUxUOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCS8vIFRPRE8gNjRiaXQgZml4CisJCXNnID0gKHN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCAqKSgoJm1zZy0+dS5oZWFkWzBdKSArCisJCQkJCQkgIHNnX29mZnNldCk7CisJCXNnX2NvdW50ID0KKwkJICAgIChzaXplIC0gc2dfb2Zmc2V0ICogNCkgLyBzaXplb2Yoc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50KTsKKwkJaWYgKHNnX2NvdW50ID4gU0dfVEFCTEVTSVpFKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6SU9DVEwgU0cgTGlzdCB0b28gbGFyZ2UgKCV1KVxuIiwKKwkJCSAgICAgICBjLT5uYW1lLCBzZ19jb3VudCk7CisJCQlrZnJlZShyZXBseSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBzZ19jb3VudDsgaSsrKSB7CisJCQlpbnQgc2dfc2l6ZTsKKwkJCXN0cnVjdCBpMm9fZG1hICpwOworCisJCQlpZiAoIShzZ1tpXS5mbGFnX2NvdW50ICYgMHgxMDAwMDAwMAorCQkJICAgICAgLypJMk9fU0dMX0ZMQUdTX1NJTVBMRV9BRERSRVNTX0VMRU1FTlQgKi8gKSkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczpCYWQgU0cgZWxlbWVudCAlZCAtIG5vdCBzaW1wbGUgKCV4KVxuIiwKKwkJCQkgICAgICAgYy0+bmFtZSwgaSwgc2dbaV0uZmxhZ19jb3VudCk7CisJCQkJcmNvZGUgPSAtRUlOVkFMOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0KKwkJCXNnX3NpemUgPSBzZ1tpXS5mbGFnX2NvdW50ICYgMHhmZmZmZmY7CisJCQlwID0gJihzZ19saXN0W2ldKTsKKwkJCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHRyYW5zZmVyICovCisJCQlpZiAoaTJvX2RtYV9hbGxvYworCQkJICAgICgmYy0+cGRldi0+ZGV2LCBwLCBzZ19zaXplLAorCQkJICAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkgICAgICAgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgU0cgYnVmZmVyIC0gc2l6ZSA9ICVkIGJ1ZmZlciBudW1iZXIgJWQgb2YgJWRcbiIsCisJCQkJICAgICAgIGMtPm5hbWUsIHNnX3NpemUsIGksIHNnX2NvdW50KTsKKwkJCQlyY29kZSA9IC1FTk9NRU07CisJCQkJZ290byBjbGVhbnVwOworCQkJfQorCQkJLyogQ29weSBpbiB0aGUgdXNlcidzIFNHIGJ1ZmZlciBpZiBuZWNlc3NhcnkgKi8KKwkJCWlmIChzZ1tpXS4KKwkJCSAgICBmbGFnX2NvdW50ICYgMHgwNDAwMDAwMCAvKkkyT19TR0xfRkxBR1NfRElSICovICkgeworCQkJCS8vIFRPRE8gNjRiaXQgZml4CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyCisJCQkJICAgIChwLT52aXJ0LCAodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylzZ1tpXS5hZGRyX2J1cywKKwkJCQkgICAgIHNnX3NpemUpKSB7CisJCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJCSAgICAgICAiJXM6IENvdWxkIG5vdCBjb3B5IFNHIGJ1ZiAlZCBGUk9NIHVzZXJcbiIsCisJCQkJCSAgICAgICBjLT5uYW1lLCBpKTsKKwkJCQkJcmNvZGUgPSAtRUZBVUxUOworCQkJCQlnb3RvIGNsZWFudXA7CisJCQkJfQorCQkJfQorCQkJLy9UT0RPIDY0Yml0IGZpeAorCQkJc2dbaV0uYWRkcl9idXMgPSAodTMyKSBwLT5waHlzOworCQl9CisJfQorCisJcmNvZGUgPSBpMm9fbXNnX3Bvc3Rfd2FpdChjLCBtLCA2MCk7CisJaWYgKHJjb2RlKQorCQlnb3RvIGNsZWFudXA7CisKKwlpZiAoc2dfb2Zmc2V0KSB7CisJCXUzMiBtc2dbMTI4XTsKKwkJLyogQ29weSBiYWNrIHRoZSBTY2F0dGVyIEdhdGhlciBidWZmZXJzIGJhY2sgdG8gdXNlciBzcGFjZSAqLworCQl1MzIgajsKKwkJLy8gVE9ETyA2NGJpdCBmaXgKKwkJc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50ICpzZzsKKwkJaW50IHNnX3NpemU7CisKKwkJLy8gcmUtYWNxdWlyZSB0aGUgb3JpZ2luYWwgbWVzc2FnZSB0byBoYW5kbGUgY29ycmVjdGx5IHRoZSBzZyBjb3B5IG9wZXJhdGlvbgorCQltZW1zZXQoJm1zZywgMCwgTVNHX0ZSQU1FX1NJWkUgKiA0KTsKKwkJLy8gZ2V0IHVzZXIgbXNnIHNpemUgaW4gdTMycworCQlpZiAoZ2V0X3VzZXIoc2l6ZSwgJnVzZXJfbXNnWzBdKSkgeworCQkJcmNvZGUgPSAtRUZBVUxUOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCXNpemUgPSBzaXplID4+IDE2OworCQlzaXplICo9IDQ7CisJCS8qIENvcHkgaW4gdGhlIHVzZXIncyBJMk8gY29tbWFuZCAqLworCQlpZiAoY29weV9mcm9tX3VzZXIobXNnLCB1c2VyX21zZywgc2l6ZSkpIHsKKwkJCXJjb2RlID0gLUVGQVVMVDsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQlzZ19jb3VudCA9CisJCSAgICAoc2l6ZSAtIHNnX29mZnNldCAqIDQpIC8gc2l6ZW9mKHN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCk7CisKKwkJLy8gVE9ETyA2NGJpdCBmaXgKKwkJc2cgPSAoc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50ICopKG1zZyArIHNnX29mZnNldCk7CisJCWZvciAoaiA9IDA7IGogPCBzZ19jb3VudDsgaisrKSB7CisJCQkvKiBDb3B5IG91dCB0aGUgU0cgbGlzdCB0byB1c2VyJ3MgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLworCQkJaWYgKCEKKwkJCSAgICAoc2dbal0uCisJCQkgICAgIGZsYWdfY291bnQgJiAweDQwMDAwMDAgLypJMk9fU0dMX0ZMQUdTX0RJUiAqLyApKSB7CisJCQkJc2dfc2l6ZSA9IHNnW2pdLmZsYWdfY291bnQgJiAweGZmZmZmZjsKKwkJCQkvLyBUT0RPIDY0Yml0IGZpeAorCQkJCWlmIChjb3B5X3RvX3VzZXIKKwkJCQkgICAgKCh2b2lkIF9fdXNlciAqKSh1NjQpIHNnW2pdLmFkZHJfYnVzLAorCQkJCSAgICAgc2dfbGlzdFtqXS52aXJ0LCBzZ19zaXplKSkgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSAgICAgICAiJXM6IENvdWxkIG5vdCBjb3B5ICVwIFRPIHVzZXIgJXhcbiIsCisJCQkJCSAgICAgICBjLT5uYW1lLCBzZ19saXN0W2pdLnZpcnQsCisJCQkJCSAgICAgICBzZ1tqXS5hZGRyX2J1cyk7CisJCQkJCXJjb2RlID0gLUVGQVVMVDsKKwkJCQkJZ290byBjbGVhbnVwOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qIENvcHkgYmFjayB0aGUgcmVwbHkgdG8gdXNlciBzcGFjZSAqLworCWlmIChyZXBseV9zaXplKSB7CisJCS8vIHdlIHdyb3RlIG91ciBvd24gdmFsdWVzIGZvciBjb250ZXh0IC0gbm93IHJlc3RvcmUgdGhlIHVzZXIgc3VwcGxpZWQgb25lcworCQlpZiAoY29weV9mcm9tX3VzZXIocmVwbHkgKyAyLCB1c2VyX21zZyArIDIsIHNpemVvZih1MzIpICogMikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXM6IENvdWxkIG5vdCBjb3B5IG1lc3NhZ2UgY29udGV4dCBGUk9NIHVzZXJcbiIsCisJCQkgICAgICAgYy0+bmFtZSk7CisJCQlyY29kZSA9IC1FRkFVTFQ7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcih1c2VyX3JlcGx5LCByZXBseSwgcmVwbHlfc2l6ZSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXM6IENvdWxkIG5vdCBjb3B5IHJlcGx5IFRPIHVzZXJcbiIsIGMtPm5hbWUpOworCQkJcmNvZGUgPSAtRUZBVUxUOworCQl9CisJfQorCisgICAgICBjbGVhbnVwOgorCWtmcmVlKHJlcGx5KTsKKwlyZXR1cm4gcmNvZGU7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbnQgaTJvX2NmZ19wYXNzdGhydSh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaTJvX2NtZF9wYXNzdGhydSBfX3VzZXIgKmNtZCA9CisJICAgIChzdHJ1Y3QgaTJvX2NtZF9wYXNzdGhydSBfX3VzZXIgKilhcmc7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjOworCXUzMiBfX3VzZXIgKnVzZXJfbXNnOworCXUzMiAqcmVwbHkgPSBOVUxMOworCXUzMiBfX3VzZXIgKnVzZXJfcmVwbHkgPSBOVUxMOworCXUzMiBzaXplID0gMDsKKwl1MzIgcmVwbHlfc2l6ZSA9IDA7CisJdTMyIHJjb2RlID0gMDsKKwl2b2lkICpzZ19saXN0W1NHX1RBQkxFU0laRV07CisJdTMyIHNnX29mZnNldCA9IDA7CisJdTMyIHNnX2NvdW50ID0gMDsKKwlpbnQgc2dfaW5kZXggPSAwOworCXUzMiBpID0gMDsKKwl2b2lkICpwID0gTlVMTDsKKwlpMm9fc3RhdHVzX2Jsb2NrICpzYjsKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXUzMiBtOworCXVuc2lnbmVkIGludCBpb3A7CisKKwlpZiAoZ2V0X3VzZXIoaW9wLCAmY21kLT5pb3ApIHx8IGdldF91c2VyKHVzZXJfbXNnLCAmY21kLT5tc2cpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWMgPSBpMm9fZmluZF9pb3AoaW9wKTsKKwlpZiAoIWMpIHsKKwkJb3NtX3dhcm4oImNvbnRyb2xsZXIgJWQgbm90IGZvdW5kXG4iLCBpb3ApOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKworCXNiID0gYy0+c3RhdHVzX2Jsb2NrLnZpcnQ7CisKKwlpZiAoZ2V0X3VzZXIoc2l6ZSwgJnVzZXJfbXNnWzBdKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc2l6ZSA9IHNpemUgPj4gMTY7CisKKwlpZiAoc2l6ZSA+IHNiLT5pbmJvdW5kX2ZyYW1lX3NpemUpIHsKKwkJb3NtX3dhcm4oInNpemUgb2YgbWVzc2FnZSA+IGluYm91bmRfZnJhbWVfc2l6ZSIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwl1c2VyX3JlcGx5ID0gJnVzZXJfbXNnW3NpemVdOworCisJc2l6ZSA8PD0gMjsJCS8vIENvbnZlcnQgdG8gYnl0ZXMKKworCS8qIENvcHkgaW4gdGhlIHVzZXIncyBJMk8gY29tbWFuZCAqLworCWlmIChjb3B5X2Zyb21fdXNlcihtc2csIHVzZXJfbXNnLCBzaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZ2V0X3VzZXIocmVwbHlfc2l6ZSwgJnVzZXJfcmVwbHlbMF0pIDwgMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXBseV9zaXplID4+PSAxNjsKKwlyZXBseV9zaXplIDw8PSAyOworCisJcmVwbHkgPSBrbWFsbG9jKHJlcGx5X3NpemUsIEdGUF9LRVJORUwpOworCWlmICghcmVwbHkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSByZXBseSBidWZmZXJcbiIsCisJCSAgICAgICBjLT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChyZXBseSwgMCwgcmVwbHlfc2l6ZSk7CisKKwlzZ19vZmZzZXQgPSAobXNnLT51LmhlYWRbMF0gPj4gNCkgJiAweDBmOworCisJd3JpdGVsKGkyb19jb25maWdfZHJpdmVyLmNvbnRleHQsICZtc2ctPnUucy5pY250eHQpOworCXdyaXRlbChpMm9fY250eHRfbGlzdF9hZGQoYywgcmVwbHkpLCAmbXNnLT51LnMudGNudHh0KTsKKworCW1lbXNldChzZ19saXN0LCAwLCBzaXplb2Yoc2dfbGlzdFswXSkgKiBTR19UQUJMRVNJWkUpOworCWlmIChzZ19vZmZzZXQpIHsKKwkJc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50ICpzZzsKKworCQlpZiAoc2dfb2Zmc2V0ICogNCA+PSBzaXplKSB7CisJCQlyY29kZSA9IC1FRkFVTFQ7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJLy8gVE9ETyA2NGJpdCBmaXgKKwkJc2cgPSAoc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50ICopKCgmbXNnLT51LmhlYWRbMF0pICsKKwkJCQkJCSAgc2dfb2Zmc2V0KTsKKwkJc2dfY291bnQgPQorCQkgICAgKHNpemUgLSBzZ19vZmZzZXQgKiA0KSAvIHNpemVvZihzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQpOworCQlpZiAoc2dfY291bnQgPiBTR19UQUJMRVNJWkUpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczpJT0NUTCBTRyBMaXN0IHRvbyBsYXJnZSAoJXUpXG4iLAorCQkJICAgICAgIGMtPm5hbWUsIHNnX2NvdW50KTsKKwkJCWtmcmVlKHJlcGx5KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IHNnX2NvdW50OyBpKyspIHsKKwkJCWludCBzZ19zaXplOworCisJCQlpZiAoIShzZ1tpXS5mbGFnX2NvdW50ICYgMHgxMDAwMDAwMAorCQkJICAgICAgLypJMk9fU0dMX0ZMQUdTX1NJTVBMRV9BRERSRVNTX0VMRU1FTlQgKi8gKSkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczpCYWQgU0cgZWxlbWVudCAlZCAtIG5vdCBzaW1wbGUgKCV4KVxuIiwKKwkJCQkgICAgICAgYy0+bmFtZSwgaSwgc2dbaV0uZmxhZ19jb3VudCk7CisJCQkJcmNvZGUgPSAtRUlOVkFMOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0KKwkJCXNnX3NpemUgPSBzZ1tpXS5mbGFnX2NvdW50ICYgMHhmZmZmZmY7CisJCQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB0cmFuc2ZlciAqLworCQkJcCA9IGttYWxsb2Moc2dfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXApIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBTRyBidWZmZXIgLSBzaXplID0gJWQgYnVmZmVyIG51bWJlciAlZCBvZiAlZFxuIiwKKwkJCQkgICAgICAgYy0+bmFtZSwgc2dfc2l6ZSwgaSwgc2dfY291bnQpOworCQkJCXJjb2RlID0gLUVOT01FTTsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQl9CisJCQlzZ19saXN0W3NnX2luZGV4KytdID0gcDsJLy8gc2dsaXN0IGluZGV4ZWQgd2l0aCBpbnB1dCBmcmFtZSwgbm90IG91ciBpbnRlcm5hbCBmcmFtZS4KKwkJCS8qIENvcHkgaW4gdGhlIHVzZXIncyBTRyBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisJCQlpZiAoc2dbaV0uCisJCQkgICAgZmxhZ19jb3VudCAmIDB4MDQwMDAwMDAgLypJMk9fU0dMX0ZMQUdTX0RJUiAqLyApIHsKKwkJCQkvLyBUT0RPIDY0Yml0IGZpeAorCQkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJCSAgICAocCwgKHZvaWQgX191c2VyICopc2dbaV0uYWRkcl9idXMsCisJCQkJICAgICBzZ19zaXplKSkgeworCQkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCQkgICAgICAgIiVzOiBDb3VsZCBub3QgY29weSBTRyBidWYgJWQgRlJPTSB1c2VyXG4iLAorCQkJCQkgICAgICAgYy0+bmFtZSwgaSk7CisJCQkJCXJjb2RlID0gLUVGQVVMVDsKKwkJCQkJZ290byBjbGVhbnVwOworCQkJCX0KKwkJCX0KKwkJCS8vVE9ETyA2NGJpdCBmaXgKKwkJCXNnW2ldLmFkZHJfYnVzID0gdmlydF90b19idXMocCk7CisJCX0KKwl9CisKKwlyY29kZSA9IGkyb19tc2dfcG9zdF93YWl0KGMsIG0sIDYwKTsKKwlpZiAocmNvZGUpCisJCWdvdG8gY2xlYW51cDsKKworCWlmIChzZ19vZmZzZXQpIHsKKwkJdTMyIG1zZ1sxMjhdOworCQkvKiBDb3B5IGJhY2sgdGhlIFNjYXR0ZXIgR2F0aGVyIGJ1ZmZlcnMgYmFjayB0byB1c2VyIHNwYWNlICovCisJCXUzMiBqOworCQkvLyBUT0RPIDY0Yml0IGZpeAorCQlzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQgKnNnOworCQlpbnQgc2dfc2l6ZTsKKworCQkvLyByZS1hY3F1aXJlIHRoZSBvcmlnaW5hbCBtZXNzYWdlIHRvIGhhbmRsZSBjb3JyZWN0bHkgdGhlIHNnIGNvcHkgb3BlcmF0aW9uCisJCW1lbXNldCgmbXNnLCAwLCBNU0dfRlJBTUVfU0laRSAqIDQpOworCQkvLyBnZXQgdXNlciBtc2cgc2l6ZSBpbiB1MzJzCisJCWlmIChnZXRfdXNlcihzaXplLCAmdXNlcl9tc2dbMF0pKSB7CisJCQlyY29kZSA9IC1FRkFVTFQ7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJc2l6ZSA9IHNpemUgPj4gMTY7CisJCXNpemUgKj0gNDsKKwkJLyogQ29weSBpbiB0aGUgdXNlcidzIEkyTyBjb21tYW5kICovCisJCWlmIChjb3B5X2Zyb21fdXNlcihtc2csIHVzZXJfbXNnLCBzaXplKSkgeworCQkJcmNvZGUgPSAtRUZBVUxUOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCXNnX2NvdW50ID0KKwkJICAgIChzaXplIC0gc2dfb2Zmc2V0ICogNCkgLyBzaXplb2Yoc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50KTsKKworCQkvLyBUT0RPIDY0Yml0IGZpeAorCQlzZyA9IChzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQgKikobXNnICsgc2dfb2Zmc2V0KTsKKwkJZm9yIChqID0gMDsgaiA8IHNnX2NvdW50OyBqKyspIHsKKwkJCS8qIENvcHkgb3V0IHRoZSBTRyBsaXN0IHRvIHVzZXIncyBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisJCQlpZiAoIQorCQkJICAgIChzZ1tqXS4KKwkJCSAgICAgZmxhZ19jb3VudCAmIDB4NDAwMDAwMCAvKkkyT19TR0xfRkxBR1NfRElSICovICkpIHsKKwkJCQlzZ19zaXplID0gc2dbal0uZmxhZ19jb3VudCAmIDB4ZmZmZmZmOworCQkJCS8vIFRPRE8gNjRiaXQgZml4CisJCQkJaWYgKGNvcHlfdG9fdXNlcgorCQkJCSAgICAoKHZvaWQgX191c2VyICopc2dbal0uYWRkcl9idXMsIHNnX2xpc3Rbal0sCisJCQkJICAgICBzZ19zaXplKSkgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSAgICAgICAiJXM6IENvdWxkIG5vdCBjb3B5ICVwIFRPIHVzZXIgJXhcbiIsCisJCQkJCSAgICAgICBjLT5uYW1lLCBzZ19saXN0W2pdLAorCQkJCQkgICAgICAgc2dbal0uYWRkcl9idXMpOworCQkJCQlyY29kZSA9IC1FRkFVTFQ7CisJCQkJCWdvdG8gY2xlYW51cDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKiBDb3B5IGJhY2sgdGhlIHJlcGx5IHRvIHVzZXIgc3BhY2UgKi8KKwlpZiAocmVwbHlfc2l6ZSkgeworCQkvLyB3ZSB3cm90ZSBvdXIgb3duIHZhbHVlcyBmb3IgY29udGV4dCAtIG5vdyByZXN0b3JlIHRoZSB1c2VyIHN1cHBsaWVkIG9uZXMKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHJlcGx5ICsgMiwgdXNlcl9tc2cgKyAyLCBzaXplb2YodTMyKSAqIDIpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzOiBDb3VsZCBub3QgY29weSBtZXNzYWdlIGNvbnRleHQgRlJPTSB1c2VyXG4iLAorCQkJICAgICAgIGMtPm5hbWUpOworCQkJcmNvZGUgPSAtRUZBVUxUOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIodXNlcl9yZXBseSwgcmVwbHksIHJlcGx5X3NpemUpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzOiBDb3VsZCBub3QgY29weSByZXBseSBUTyB1c2VyXG4iLCBjLT5uYW1lKTsKKwkJCXJjb2RlID0gLUVGQVVMVDsKKwkJfQorCX0KKworICAgICAgY2xlYW51cDoKKwlrZnJlZShyZXBseSk7CisJcmV0dXJuIHJjb2RlOworfQorI2VuZGlmCisKKy8qCisgKiBJT0NUTCBIYW5kbGVyCisgKi8KK3N0YXRpYyBpbnQgaTJvX2NmZ19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJldDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBJMk9HRVRJT1BTOgorCQlyZXQgPSBpMm9fY2ZnX2dldGlvcHMoYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEkyT0hSVEdFVDoKKwkJcmV0ID0gaTJvX2NmZ19nZXRocnQoYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEkyT0xDVEdFVDoKKwkJcmV0ID0gaTJvX2NmZ19nZXRsY3QoYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEkyT1BBUk1TRVQ6CisJCXJldCA9IGkyb19jZmdfcGFybXMoYXJnLCBJMk9QQVJNU0VUKTsKKwkJYnJlYWs7CisKKwljYXNlIEkyT1BBUk1HRVQ6CisJCXJldCA9IGkyb19jZmdfcGFybXMoYXJnLCBJMk9QQVJNR0VUKTsKKwkJYnJlYWs7CisKKwljYXNlIEkyT1NXREw6CisJCXJldCA9IGkyb19jZmdfc3dkbChhcmcpOworCQlicmVhazsKKworCWNhc2UgSTJPU1dVTDoKKwkJcmV0ID0gaTJvX2NmZ19zd3VsKGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBJMk9TV0RFTDoKKwkJcmV0ID0gaTJvX2NmZ19zd2RlbChhcmcpOworCQlicmVhazsKKworCWNhc2UgSTJPVkFMSURBVEU6CisJCXJldCA9IGkyb19jZmdfdmFsaWRhdGUoYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEkyT0VWVFJFRzoKKwkJcmV0ID0gaTJvX2NmZ19ldnRfcmVnKGFyZywgZnApOworCQlicmVhazsKKworCWNhc2UgSTJPRVZUR0VUOgorCQlyZXQgPSBpMm9fY2ZnX2V2dF9nZXQoYXJnLCBmcCk7CisJCWJyZWFrOworCisjaWZuZGVmIENPTkZJR19DT01QQVQKKwljYXNlIEkyT1BBU1NUSFJVOgorCQlyZXQgPSBpMm9fY2ZnX3Bhc3N0aHJ1KGFyZyk7CisJCWJyZWFrOworI2VuZGlmCisKKwlkZWZhdWx0OgorCQlvc21fZGVidWcoInVua25vd24gaW9jdGwgY2FsbGVkIVxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjZmdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaTJvX2NmZ19pbmZvICp0bXAgPQorCSAgICAoc3RydWN0IGkyb19jZmdfaW5mbyAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpMm9fY2ZnX2luZm8pLAorCQkJCQkgICBHRlBfS0VSTkVMKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCF0bXApCisJCXJldHVybiAtRU5PTUVNOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKikoaTJvX2NmZ19pbmZvX2lkKyspOworCXRtcC0+ZnAgPSBmaWxlOworCXRtcC0+ZmFzeW5jID0gTlVMTDsKKwl0bXAtPnFfaWQgPSAodWxvbmcpIGZpbGUtPnByaXZhdGVfZGF0YTsKKwl0bXAtPnFfbGVuID0gMDsKKwl0bXAtPnFfaW4gPSAwOworCXRtcC0+cV9vdXQgPSAwOworCXRtcC0+cV9sb3N0ID0gMDsKKwl0bXAtPm5leHQgPSBvcGVuX2ZpbGVzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyb19jb25maWdfbG9jaywgZmxhZ3MpOworCW9wZW5fZmlsZXMgPSB0bXA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTJvX2NvbmZpZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjZmdfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZwLCBpbnQgb24pCit7CisJdWxvbmcgaWQgPSAodWxvbmcpIGZwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGkyb19jZmdfaW5mbyAqcDsKKworCWZvciAocCA9IG9wZW5fZmlsZXM7IHA7IHAgPSBwLT5uZXh0KQorCQlpZiAocC0+cV9pZCA9PSBpZCkKKwkJCWJyZWFrOworCisJaWYgKCFwKQorCQlyZXR1cm4gLUVCQURGOworCisJcmV0dXJuIGZhc3luY19oZWxwZXIoZmQsIGZwLCBvbiwgJnAtPmZhc3luYyk7Cit9CisKK3N0YXRpYyBpbnQgY2ZnX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdWxvbmcgaWQgPSAodWxvbmcpIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaTJvX2NmZ19pbmZvICpwMSwgKnAyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NrX2tlcm5lbCgpOworCXAxID0gcDIgPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyb19jb25maWdfbG9jaywgZmxhZ3MpOworCWZvciAocDEgPSBvcGVuX2ZpbGVzOyBwMTspIHsKKwkJaWYgKHAxLT5xX2lkID09IGlkKSB7CisKKwkJCWlmIChwMS0+ZmFzeW5jKQorCQkJCWNmZ19mYXN5bmMoLTEsIGZpbGUsIDApOworCQkJaWYgKHAyKQorCQkJCXAyLT5uZXh0ID0gcDEtPm5leHQ7CisJCQllbHNlCisJCQkJb3Blbl9maWxlcyA9IHAxLT5uZXh0OworCisJCQlrZnJlZShwMSk7CisJCQlicmVhazsKKwkJfQorCQlwMiA9IHAxOworCQlwMSA9IHAxLT5uZXh0OworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMm9fY29uZmlnX2xvY2ssIGZsYWdzKTsKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY29uZmlnX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmxsc2VlayA9IG5vX2xsc2VlaywKKwkuaW9jdGwgPSBpMm9fY2ZnX2lvY3RsLAorCS5vcGVuID0gY2ZnX29wZW4sCisJLnJlbGVhc2UgPSBjZmdfcmVsZWFzZSwKKwkuZmFzeW5jID0gY2ZnX2Zhc3luYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBpMm9fbWlzY2RldiA9IHsKKwlJMk9fTUlOT1IsCisJImkyb2N0bCIsCisJJmNvbmZpZ19mb3BzCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpMm9fY29uZmlnX2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPIE9TTV9ERVNDUklQVElPTiAiIHYiIE9TTV9WRVJTSU9OICJcbiIpOworCisJc3Bpbl9sb2NrX2luaXQoJmkyb19jb25maWdfbG9jayk7CisKKwlpZiAobWlzY19yZWdpc3RlcigmaTJvX21pc2NkZXYpIDwgMCkgeworCQlvc21fZXJyKCJjYW4ndCByZWdpc3RlciBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJLyoKKwkgKiAgICAgIEluc3RhbGwgb3VyIGhhbmRsZXIKKwkgKi8KKwlpZiAoaTJvX2RyaXZlcl9yZWdpc3RlcigmaTJvX2NvbmZpZ19kcml2ZXIpKSB7CisJCW9zbV9lcnIoImhhbmRsZXIgcmVnaXN0ZXIgZmFpbGVkLlxuIik7CisJCW1pc2NfZGVyZWdpc3RlcigmaTJvX21pc2NkZXYpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJcmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKEkyT1BBU1NUSFJVMzIsIGkyb19jZmdfcGFzc3RocnUzMik7CisJcmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKEkyT0dFVElPUFMsICh2b2lkICopc3lzX2lvY3RsKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpMm9fY29uZmlnX2V4aXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJdW5yZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oSTJPUEFTU1RIUlUzMik7CisJdW5yZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oSTJPR0VUSU9QUyk7CisjZW5kaWYKKwltaXNjX2RlcmVnaXN0ZXIoJmkyb19taXNjZGV2KTsKKwlpMm9fZHJpdmVyX3VucmVnaXN0ZXIoJmkyb19jb25maWdfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiUmVkIEhhdCBTb2Z0d2FyZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKE9TTV9ERVNDUklQVElPTik7CitNT0RVTEVfVkVSU0lPTihPU01fVkVSU0lPTik7CisKK21vZHVsZV9pbml0KGkyb19jb25maWdfaW5pdCk7Cittb2R1bGVfZXhpdChpMm9fY29uZmlnX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fbGFuLmggYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19sYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjFkNjMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fbGFuLmgKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiAgIAlpMm9fbGFuLmgJCQlJMk8gTEFOIENsYXNzIGRlZmluaXRpb25zCisgKgorICogICAgICBJMk8gTEFOIENMQVNTIE9TTSAgICAgICAJTWF5IDI2dGggMjAwMAorICoKKyAqICAgICAgKEMpIENvcHlyaWdodCAxOTk5LCAyMDAwCVVuaXZlcnNpdHkgb2YgSGVsc2lua2ksCisgKgkJCQkJRGVwYXJ0bWVudCBvZiBDb21wdXRlciBTY2llbmNlCisgKgorICogICAgICBUaGlzIGNvZGUgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgLyB0ZXN0LgorICoKKyAqCUF1dGhvcjoJCUF1dm8gSORra2luZW4gPEF1dm8uSGFra2luZW5AY3MuSGVsc2lua2kuRkk+CisgKgkJCUp1aGEgU2llduRuZW4gPEp1aGEuU2lldmFuZW5AY3MuSGVsc2lua2kuRkk+CisgKgkJCVRhbmVsaSBW5Gjka2FuZ2FzIDxUYW5lbGkuVmFoYWthbmdhc0Bjcy5IZWxzaW5raS5GST4KKyAqLworCisjaWZuZGVmIF9JMk9fTEFOX0gKKyNkZWZpbmUgX0kyT19MQU5fSAorCisvKiBEZWZhdWx0IHZhbHVlcyBmb3IgdHVuYWJsZSBwYXJhbWV0ZXJzIGZpcnN0ICovCisKKyNkZWZpbmUgSTJPX0xBTl9NQVhfQlVDS0VUU19PVVQgOTYKKyNkZWZpbmUgSTJPX0xBTl9CVUNLRVRfVEhSRVNICTE4CS8qIDkgYnVja2V0cyBpbiBvbmUgbWVzc2FnZSAqLworI2RlZmluZSBJMk9fTEFOX1JYX0NPUFlCUkVBSwkyMDAKKyNkZWZpbmUgSTJPX0xBTl9UWF9USU1FT1VUIAkoMSpIWikKKyNkZWZpbmUgSTJPX0xBTl9UWF9CQVRDSF9NT0RFCTIJLyogMj1hdXRvbWF0aWMsIDE9b24sIDA9b2ZmICovCisjZGVmaW5lIEkyT19MQU5fRVZFTlRfTUFTSwkwCS8qIDA9Tm9uZSwgMHhGRkMwMDAwMj1BbGwgKi8KKworLyogTEFOIHR5cGVzICovCisjZGVmaW5lIEkyT19MQU5fRVRIRVJORVQJMHgwMDMwCisjZGVmaW5lIEkyT19MQU5fMTAwVkcJCTB4MDA0MAorI2RlZmluZSBJMk9fTEFOX1RSCQkweDAwNTAKKyNkZWZpbmUgSTJPX0xBTl9GRERJCQkweDAwNjAKKyNkZWZpbmUgSTJPX0xBTl9GSUJSRV9DSEFOTkVMCTB4MDA3MAorI2RlZmluZSBJMk9fTEFOX1VOS05PV04JCTB4MDAwMDAwMDAKKworLyogQ29ubmVjdG9yIHR5cGVzICovCisKKy8qIEV0aGVybmV0ICovCisjZGVmaW5lIEkyT19MQU5fQVVJCQkoSTJPX0xBTl9FVEhFUk5FVCA8PCA0KSArIDB4MDAwMDAwMDEKKyNkZWZpbmUgSTJPX0xBTl8xMEJBU0U1CQkoSTJPX0xBTl9FVEhFUk5FVCA8PCA0KSArIDB4MDAwMDAwMDIKKyNkZWZpbmUgSTJPX0xBTl9GSU9STAkJKEkyT19MQU5fRVRIRVJORVQgPDwgNCkgKyAweDAwMDAwMDAzCisjZGVmaW5lIEkyT19MQU5fMTBCQVNFMgkJKEkyT19MQU5fRVRIRVJORVQgPDwgNCkgKyAweDAwMDAwMDA0CisjZGVmaW5lIEkyT19MQU5fMTBCUk9BRDM2CShJMk9fTEFOX0VUSEVSTkVUIDw8IDQpICsgMHgwMDAwMDAwNQorI2RlZmluZSBJMk9fTEFOXzEwQkFTRV9UCShJMk9fTEFOX0VUSEVSTkVUIDw8IDQpICsgMHgwMDAwMDAwNgorI2RlZmluZSBJMk9fTEFOXzEwQkFTRV9GUAkoSTJPX0xBTl9FVEhFUk5FVCA8PCA0KSArIDB4MDAwMDAwMDcKKyNkZWZpbmUgSTJPX0xBTl8xMEJBU0VfRkIJKEkyT19MQU5fRVRIRVJORVQgPDwgNCkgKyAweDAwMDAwMDA4CisjZGVmaW5lIEkyT19MQU5fMTBCQVNFX0ZMCShJMk9fTEFOX0VUSEVSTkVUIDw8IDQpICsgMHgwMDAwMDAwOQorI2RlZmluZSBJMk9fTEFOXzEwMEJBU0VfVFgJKEkyT19MQU5fRVRIRVJORVQgPDwgNCkgKyAweDAwMDAwMDBBCisjZGVmaW5lIEkyT19MQU5fMTAwQkFTRV9GWAkoSTJPX0xBTl9FVEhFUk5FVCA8PCA0KSArIDB4MDAwMDAwMEIKKyNkZWZpbmUgSTJPX0xBTl8xMDBCQVNFX1Q0CShJMk9fTEFOX0VUSEVSTkVUIDw8IDQpICsgMHgwMDAwMDAwQworI2RlZmluZSBJMk9fTEFOXzEwMDBCQVNFX1NYCShJMk9fTEFOX0VUSEVSTkVUIDw8IDQpICsgMHgwMDAwMDAwRAorI2RlZmluZSBJMk9fTEFOXzEwMDBCQVNFX0xYCShJMk9fTEFOX0VUSEVSTkVUIDw8IDQpICsgMHgwMDAwMDAwRQorI2RlZmluZSBJMk9fTEFOXzEwMDBCQVNFX0NYCShJMk9fTEFOX0VUSEVSTkVUIDw8IDQpICsgMHgwMDAwMDAwRgorI2RlZmluZSBJMk9fTEFOXzEwMDBCQVNFX1QJKEkyT19MQU5fRVRIRVJORVQgPDwgNCkgKyAweDAwMDAwMDEwCisKKy8qIEFueUxBTiAqLworI2RlZmluZSBJMk9fTEFOXzEwMFZHX0VUSEVSTkVUCShJMk9fTEFOXzEwMFZHIDw8IDQpICsgMHgwMDAwMDAwMQorI2RlZmluZSBJMk9fTEFOXzEwMFZHX1RSCShJMk9fTEFOXzEwMFZHIDw8IDQpICsgMHgwMDAwMDAwMgorCisvKiBUb2tlbiBSaW5nICovCisjZGVmaW5lIEkyT19MQU5fNE1CSVQJCShJMk9fTEFOX1RSIDw8IDQpICsgMHgwMDAwMDAwMQorI2RlZmluZSBJMk9fTEFOXzE2TUJJVAkJKEkyT19MQU5fVFIgPDwgNCkgKyAweDAwMDAwMDAyCisKKy8qIEZEREkgKi8KKyNkZWZpbmUgSTJPX0xBTl8xMjVNQkFVRAkoSTJPX0xBTl9GRERJIDw8IDQpICsgMHgwMDAwMDAwMQorCisvKiBGaWJyZSBDaGFubmVsICovCisjZGVmaW5lIEkyT19MQU5fUE9JTlRfUE9JTlQJKEkyT19MQU5fRklCUkVfQ0hBTk5FTCA8PCA0KSArIDB4MDAwMDAwMDEKKyNkZWZpbmUgSTJPX0xBTl9BUkJfTE9PUAkoSTJPX0xBTl9GSUJSRV9DSEFOTkVMIDw8IDQpICsgMHgwMDAwMDAwMgorI2RlZmluZSBJMk9fTEFOX1BVQkxJQ19MT09QCShJMk9fTEFOX0ZJQlJFX0NIQU5ORUwgPDwgNCkgKyAweDAwMDAwMDAzCisjZGVmaW5lIEkyT19MQU5fRkFCUklDCQkoSTJPX0xBTl9GSUJSRV9DSEFOTkVMIDw8IDQpICsgMHgwMDAwMDAwNAorCisjZGVmaW5lIEkyT19MQU5fRU1VTEFUSU9OCTB4MDAwMDBGMDAKKyNkZWZpbmUgSTJPX0xBTl9PVEhFUgkJMHgwMDAwMEYwMQorI2RlZmluZSBJMk9fTEFOX0RFRkFVTFQJCTB4RkZGRkZGRkYKKworLyogTEFOIGNsYXNzIGZ1bmN0aW9ucyAqLworCisjZGVmaW5lIExBTl9QQUNLRVRfU0VORAkJMHgzQgorI2RlZmluZSBMQU5fU0RVX1NFTkQJCTB4M0QKKyNkZWZpbmUgTEFOX1JFQ0VJVkVfUE9TVAkweDNFCisjZGVmaW5lIExBTl9SRVNFVAkJMHgzNQorI2RlZmluZSBMQU5fU1VTUEVORAkJMHgzNworCisvKiBMQU4gRGV0YWlsZWRTdGF0dXNDb2RlIGRlZmluZXMgKi8KKyNkZWZpbmUgSTJPX0xBTl9EU0NfU1VDQ0VTUwkJCTB4MDAKKyNkZWZpbmUgSTJPX0xBTl9EU0NfREVWSUNFX0ZBSUxVUkUJCTB4MDEKKyNkZWZpbmUgSTJPX0xBTl9EU0NfREVTVElOQVRJT05fTk9UX0ZPVU5ECTB4MDIKKyNkZWZpbmUJSTJPX0xBTl9EU0NfVFJBTlNNSVRfRVJST1IJCTB4MDMKKyNkZWZpbmUgSTJPX0xBTl9EU0NfVFJBTlNNSVRfQUJPUlRFRAkJMHgwNAorI2RlZmluZSBJMk9fTEFOX0RTQ19SRUNFSVZFX0VSUk9SCQkweDA1CisjZGVmaW5lIEkyT19MQU5fRFNDX1JFQ0VJVkVfQUJPUlRFRAkJMHgwNgorI2RlZmluZSBJMk9fTEFOX0RTQ19ETUFfRVJST1IJCQkweDA3CisjZGVmaW5lIEkyT19MQU5fRFNDX0JBRF9QQUNLRVRfREVURUNURUQJCTB4MDgKKyNkZWZpbmUgSTJPX0xBTl9EU0NfT1VUX09GX01FTU9SWQkJMHgwOQorI2RlZmluZSBJMk9fTEFOX0RTQ19CVUNLRVRfT1ZFUlJVTgkJMHgwQQorI2RlZmluZSBJMk9fTEFOX0RTQ19JT1BfSU5URVJOQUxfRVJST1IJCTB4MEIKKyNkZWZpbmUgSTJPX0xBTl9EU0NfQ0FOQ0VMRUQJCQkweDBDCisjZGVmaW5lIEkyT19MQU5fRFNDX0lOVkFMSURfVFJBTlNBQ1RJT05fQ09OVEVYVAkweDBECisjZGVmaW5lIEkyT19MQU5fRFNDX0RFU1RfQUREUkVTU19ERVRFQ1RFRAkweDBFCisjZGVmaW5lIEkyT19MQU5fRFNDX0RFU1RfQUREUkVTU19PTUlUVEVECTB4MEYKKyNkZWZpbmUgSTJPX0xBTl9EU0NfUEFSVElBTF9QQUNLRVRfUkVUVVJORUQJMHgxMAorI2RlZmluZSBJMk9fTEFOX0RTQ19TVVNQRU5ERUQJCQkweDExCisKK3N0cnVjdCBpMm9fcGFja2V0X2luZm8geworCXUzMiBvZmZzZXQgOiAyNDsKKwl1MzIgZmxhZ3MgIDogODsKKwl1MzIgbGVuICAgIDogMjQ7CisJdTMyIHN0YXR1cyA6IDg7Cit9OworCitzdHJ1Y3QgaTJvX2J1Y2tldF9kZXNjcmlwdG9yIHsKKwl1MzIgY29udGV4dDsgCQkJLyogRklYTUU6IDY0Yml0IHN1cHBvcnQgKi8KKwlzdHJ1Y3QgaTJvX3BhY2tldF9pbmZvIHBhY2tldF9pbmZvWzFdOworfTsKKworLyogRXZlbnQgSW5kaWNhdG9yIE1hc2sgRmxhZ3MgZm9yIExBTiBPU00gKi8KKworI2RlZmluZSBJMk9fTEFOX0VWVF9MSU5LX0RPV04JCTB4MDEKKyNkZWZpbmUgSTJPX0xBTl9FVlRfTElOS19VUAkJMHgwMgorI2RlZmluZSBJMk9fTEFOX0VWVF9NRURJQV9DSEFOR0UgCTB4MDQKKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZkZGlkZXZpY2UuaD4KKworc3RydWN0IGkyb19sYW5fbG9jYWwgeworCXU4IHVuaXQ7CisJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXY7CisKKwlzdHJ1Y3QgZmRkaV9zdGF0aXN0aWNzIHN0YXRzOyAgIC8qIHNlZSBhbHNvIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICovCisJdW5zaWduZWQgc2hvcnQgKCp0eXBlX3RyYW5zKShzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKwlhdG9taWNfdCBidWNrZXRzX291dDsgIAkJLyogbmJyIG9mIHVudXNlZCBidWNrZXRzIG9uIERETSAqLworCWF0b21pY190IHR4X291dDsJCS8qIG91dHN0YW5kaW5nIFRYZXMgKi8KKwl1OCB0eF9jb3VudDsgIAkJCS8qIHBhY2tldHMgaW4gb25lIFRYIG1lc3NhZ2UgZnJhbWUgKi8KKwl1MTYgdHhfbWF4X291dDsJICAgCQkvKiBERE0ncyBUeCBxdWV1ZSBsZW4gKi8KKwl1OCBzZ2xfbWF4OwkJCS8qIG1heCBTR0xzIGluIG9uZSBtZXNzYWdlIGZyYW1lICovCisJdTMyIG07CQkJCS8qIElPUCBhZGRyZXNzIG9mIHRoZSBiYXRjaCBtc2cgZnJhbWUgKi8KKworCXN0cnVjdCB3b3JrX3N0cnVjdCBpMm9fYmF0Y2hfc2VuZF90YXNrOworCWludCBzZW5kX2FjdGl2ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqKmkyb19mYmw7CS8qIEZyZWUgYnVja2V0IGxpc3QgKHRvIHJldXNlIHNrYnMpICovCisJaW50IGkyb19mYmxfdGFpbDsKKwlzcGlubG9ja190IGZibF9sb2NrOworCisJc3BpbmxvY2tfdCB0eF9sb2NrOworCisJdTMyIG1heF9zaXplX21jX3RhYmxlOwkJLyogbWF4IG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzICovCisKKwkvKiBMQU4gT1NNIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzIGFyZSBoZXJlOiAqLworCisJdTE2IG1heF9idWNrZXRzX291dDsJCS8qIG1heCBuYnIgb2YgYnVja2V0cyB0byBzZW5kIHRvIERETSAqLworCXUxNiBidWNrZXRfdGhyZXNoOwkJLyogc2VuZCBtb3JlIHdoZW4gdGhpcyBtYW55IHVzZWQgKi8KKwl1MTYgcnhfY29weWJyZWFrOworCisJdTggIHR4X2JhdGNoX21vZGU7CQkvKiBTZXQgd2hlbiB1c2luZyBiYXRjaCBtb2RlIHNlbmRzICovCisJdTMyIGkyb19ldmVudF9tYXNrOwkJLyogVG8gdHVybiBvbiBpbnRlcmVzdGluZyBldmVudCBmbGFncyAqLworfTsKKworI2VuZGlmIC8qIF9JMk9fTEFOX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX3Byb2MuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTc2ZDBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fcHJvYy5jCkBAIC0wLDAgKzEsMjExMiBAQAorLyoKKyAqCXByb2NmcyBoYW5kbGVyIGZvciBMaW51eCBJMk8gc3Vic3lzdGVtCisgKgorICoJKGMpIENvcHlyaWdodCAxOTk5CURlZXBhayBTYXhlbmEKKyAqCisgKglPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgRGVlcGFrIFNheGVuYShkZWVwYWtAcGxleGl0eS5uZXQpCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqCXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICoJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICoJb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGlzIGFuIGluaXRpYWwgdGVzdCByZWxlYXNlLiBUaGUgY29kZSBpcyBiYXNlZCBvbiB0aGUgZGVzaWduIG9mIHRoZQorICoJaWRlIHByb2NmcyBzeXN0ZW0gKGRyaXZlcnMvYmxvY2svaWRlLXByb2MuYykuIFNvbWUgY29kZSB0YWtlbiBmcm9tCisgKglpMm8tY29yZSBtb2R1bGUgYnkgQWxhbiBDb3guCisgKgorICoJRElTQ0xBSU1FUjogVGhpcyBjb2RlIGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50L3Rlc3QgYW5kIG1heSBjYXVzZQorICoJeW91ciBzeXN0ZW0gdG8gYmVoYXZlIHVucHJlZGljdGFibHkuICBVc2UgYXQgeW91ciBvd24gZGlzY3JldGlvbi4KKyAqCisgKgorICoJRml4ZXMvYWRkaXRpb25zOgorICoJCUp1aGEgU2llduRuZW4gKEp1aGEuU2lldmFuZW5AY3MuSGVsc2lua2kuRkkpLAorICoJCUF1dm8gSORra2luZW4gKEF1dm8uSGFra2luZW5AY3MuSGVsc2lua2kuRkkpCisgKgkJVW5pdmVyc2l0eSBvZiBIZWxzaW5raSwgRGVwYXJ0bWVudCBvZiBDb21wdXRlciBTY2llbmNlCisgKgkJCUxBTiBlbnRyaWVzCisgKgkJTWFya3VzIExpZGVsIDxNYXJrdXMuTGlkZWxAc2hhZG93Y29ubmVjdC5jb20+CisgKgkJCUNoYW5nZXMgZm9yIG5ldyBJMk8gQVBJCisgKi8KKworI2RlZmluZSBPU01fTkFNRQkicHJvYy1vc20iCisjZGVmaW5lIE9TTV9WRVJTSU9OCSIkUmV2JCIKKyNkZWZpbmUgT1NNX0RFU0NSSVBUSU9OCSJJMk8gUHJvY0ZTIE9TTSIKKworI2RlZmluZSBJMk9fTUFYX01PRFVMRVMgNAorLy8gRklYTUUhCisjZGVmaW5lIEZNVF9VNjRfSEVYICIweCUwOHglMDh4IgorI2RlZmluZSBVNjRfVkFMKHB1NjQpICooKHUzMiopKHB1NjQpKzEpLCAqKCh1MzIqKShwdTY0KSkKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaTJvLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKiBTdHJ1Y3R1cmUgdXNlZCB0byBkZWZpbmUgL3Byb2MgZW50cmllcyAqLwordHlwZWRlZiBzdHJ1Y3QgX2kyb19wcm9jX2VudHJ5X3QgeworCWNoYXIgKm5hbWU7CQkvKiBlbnRyeSBuYW1lICovCisJbW9kZV90IG1vZGU7CQkvKiBtb2RlICovCisJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wczsJLyogb3BlbiBmdW5jdGlvbiAqLworfSBpMm9fcHJvY19lbnRyeTsKKworLyogZ2xvYmFsIEkyTyAvcHJvYy9pMm8gZW50cnkgKi8KK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmkyb19wcm9jX2Rpcl9yb290OworCisvKiBwcm9jIE9TTSBkcml2ZXIgc3RydWN0ICovCitzdGF0aWMgc3RydWN0IGkyb19kcml2ZXIgaTJvX3Byb2NfZHJpdmVyID0geworCS5uYW1lID0gT1NNX05BTUUsCit9OworCitzdGF0aWMgaW50IHByaW50X3NlcmlhbF9udW1iZXIoc3RydWN0IHNlcV9maWxlICpzZXEsIHU4ICogc2VyaWFsbm8sIGludCBtYXhfbGVuKQoreworCWludCBpOworCisJLyogMTk5OTA0MTkgLXNyYWxzdG9uCisJICogICAgICBUaGUgSTJPIHYxLjUgKGFuZCB2Mi4wIHNvIGZhcikgIm9mZmljaWFsIHNwZWNpZmljYXRpb24iCisJICogICAgICBnb3Qgc2VyaWFsIG51bWJlcnMgV1JPTkchCisJICogICAgICBBcHBhcmVudGx5LCBhbmQgZGVzcGl0ZSB3aGF0IFNlY3Rpb24gMy40LjQgc2F5cyBhbmQKKwkgKiAgICAgIEZpZ3VyZSAzLTM1IHNob3dzIChwZyAzLTM5IGluIHRoZSBwZGYgZG9jKSwKKwkgKiAgICAgIHRoZSBjb252ZW50aW9uIC8gY29uc2Vuc3VzIHNlZW1zIHRvIGJlOgorCSAqICAgICAgICArIEZpcnN0IGJ5dGUgaXMgU05Gb3JtYXQKKwkgKiAgICAgICAgKyBTZWNvbmQgYnl0ZSBpcyBTTkxlbiAoYnV0IG9ubHkgaWYgU05Gb3JtYXQ9PTcgKD8pKQorCSAqICAgICAgICArICh2Mi4wKSBTQ1NJK0JTIG1heSB1c2UgSUVFRSBSZWdpc3RlcmVkICg2NCBvciAxMjggYml0KSBmb3JtYXQKKwkgKi8KKwlzd2l0Y2ggKHNlcmlhbG5vWzBdKSB7CisJY2FzZSBJMk9fU05GT1JNQVRfQklOQVJZOgkvKiBCaW5hcnkgKi8KKwkJc2VxX3ByaW50ZihzZXEsICIweCIpOworCQlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsbm9bMV07IGkrKykgeworCQkJc2VxX3ByaW50ZihzZXEsICIlMDJYIiwgc2VyaWFsbm9bMiArIGldKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgSTJPX1NORk9STUFUX0FTQ0lJOgkvKiBBU0NJSSAqLworCQlpZiAoc2VyaWFsbm9bMV0gPCAnICcpIHsJLyogcHJpbnRhYmxlIG9yIFNOTGVuPyAqLworCQkJLyogc2FuaXR5ICovCisJCQltYXhfbGVuID0KKwkJCSAgICAobWF4X2xlbiA8IHNlcmlhbG5vWzFdKSA/IG1heF9sZW4gOiBzZXJpYWxub1sxXTsKKwkJCXNlcmlhbG5vWzEgKyBtYXhfbGVuXSA9ICdcMCc7CisKKwkJCS8qIGp1c3QgcHJpbnQgaXQgKi8KKwkJCXNlcV9wcmludGYoc2VxLCAiJXMiLCAmc2VyaWFsbm9bMl0pOworCQl9IGVsc2UgeworCQkJLyogcHJpbnQgY2hhcnMgZm9yIHNwZWNpZmllZCBsZW5ndGggKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBzZXJpYWxub1sxXTsgaSsrKSB7CisJCQkJc2VxX3ByaW50ZihzZXEsICIlYyIsIHNlcmlhbG5vWzIgKyBpXSk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEkyT19TTkZPUk1BVF9VTklDT0RFOgkvKiBVTklDT0RFICovCisJCXNlcV9wcmludGYoc2VxLCAiVU5JQ09ERSBGb3JtYXQuICBDYW4ndCBEaXNwbGF5XG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIEkyT19TTkZPUk1BVF9MQU40OF9NQUM6CS8qIExBTi00OCBNQUMgQWRkcmVzcyAqLworCQlzZXFfcHJpbnRmKHNlcSwKKwkJCSAgICJMQU4tNDggTUFDIGFkZHJlc3MgQCAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCisJCQkgICBzZXJpYWxub1syXSwgc2VyaWFsbm9bM10sCisJCQkgICBzZXJpYWxub1s0XSwgc2VyaWFsbm9bNV0sIHNlcmlhbG5vWzZdLCBzZXJpYWxub1s3XSk7CisJCWJyZWFrOworCisJY2FzZSBJMk9fU05GT1JNQVRfV0FOOgkvKiBXQU4gTUFDIEFkZHJlc3MgKi8KKwkJLyogRklYTUU6IEZpZ3VyZSBvdXQgd2hhdCBhIFdBTiBhY2Nlc3MgYWRkcmVzcyBsb29rcyBsaWtlPz8gKi8KKwkJc2VxX3ByaW50ZihzZXEsICJXQU4gQWNjZXNzIEFkZHJlc3MiKTsKKwkJYnJlYWs7CisKKy8qIHBsdXMgbmV3IGluIHYyLjAgKi8KKwljYXNlIEkyT19TTkZPUk1BVF9MQU42NF9NQUM6CS8qIExBTi02NCBNQUMgQWRkcmVzcyAqLworCQkvKiBGSVhNRTogRmlndXJlIG91dCB3aGF0IGEgTEFOLTY0IGFkZHJlc3MgcmVhbGx5IGxvb2tzIGxpa2U/PyAqLworCQlzZXFfcHJpbnRmKHNlcSwKKwkJCSAgICJMQU4tNjQgTUFDIGFkZHJlc3MgQCBbPzolMDJYOiUwMlg6P10gJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgiLAorCQkJICAgc2VyaWFsbm9bOF0sIHNlcmlhbG5vWzldLAorCQkJICAgc2VyaWFsbm9bMl0sIHNlcmlhbG5vWzNdLAorCQkJICAgc2VyaWFsbm9bNF0sIHNlcmlhbG5vWzVdLCBzZXJpYWxub1s2XSwgc2VyaWFsbm9bN10pOworCQlicmVhazsKKworCWNhc2UgSTJPX1NORk9STUFUX0RETToJLyogSTJPIERETSAqLworCQlzZXFfcHJpbnRmKHNlcSwKKwkJCSAgICJERE06IFRpZD0lMDNYaCwgUnN2ZD0lMDRYaCwgT3JnSWQ9JTA0WGgiLAorCQkJICAgKih1MTYgKikgJiBzZXJpYWxub1syXSwKKwkJCSAgICoodTE2ICopICYgc2VyaWFsbm9bNF0sICoodTE2ICopICYgc2VyaWFsbm9bNl0pOworCQlicmVhazsKKworCWNhc2UgSTJPX1NORk9STUFUX0lFRUVfUkVHNjQ6CS8qIElFRUUgUmVnaXN0ZXJlZCAoNjQtYml0KSAqLworCWNhc2UgSTJPX1NORk9STUFUX0lFRUVfUkVHMTI4OgkvKiBJRUVFIFJlZ2lzdGVyZWQgKDEyOC1iaXQpICovCisJCS8qIEZJWE1FOiBGaWd1cmUgaWYgdGhpcyBpcyBldmVuIGNsb3NlPz8gKi8KKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAiSUVFRSBOb2RlTmFtZShoaSxsbyk9KCUwOFhoOiUwOFhoKSwgUG9ydE5hbWUoaGksbG8pPSglMDhYaDolMDhYaClcbiIsCisJCQkgICAqKHUzMiAqKSAmIHNlcmlhbG5vWzJdLAorCQkJICAgKih1MzIgKikgJiBzZXJpYWxub1s2XSwKKwkJCSAgICoodTMyICopICYgc2VyaWFsbm9bMTBdLCAqKHUzMiAqKSAmIHNlcmlhbG5vWzE0XSk7CisJCWJyZWFrOworCisJY2FzZSBJMk9fU05GT1JNQVRfVU5LTk9XTjoJLyogVW5rbm93biAwICAgICovCisJY2FzZSBJMk9fU05GT1JNQVRfVU5LTk9XTjI6CS8qIFVua25vd24gMHhmZiAqLworCWRlZmF1bHQ6CisJCXNlcV9wcmludGYoc2VxLCAiVW5rbm93biBkYXRhIGZvcm1hdCAoMHglMDJ4KSIsIHNlcmlhbG5vWzBdKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJaTJvX2dldF9jbGFzc19uYW1lIC0gCWRvIGkybyBjbGFzcyBuYW1lIGxvb2t1cAorICoJQGNsYXNzOiBjbGFzcyBudW1iZXIKKyAqCisgKglSZXR1cm4gYSBkZXNjcmlwdGl2ZSBzdHJpbmcgZm9yIGFuIGkybyBjbGFzcworICovCitzdGF0aWMgY29uc3QgY2hhciAqaTJvX2dldF9jbGFzc19uYW1lKGludCBjbGFzcykKK3sKKwlpbnQgaWR4ID0gMTY7CisJc3RhdGljIGNoYXIgKmkyb19jbGFzc19uYW1lW10gPSB7CisJCSJFeGVjdXRpdmUiLAorCQkiRGV2aWNlIERyaXZlciBNb2R1bGUiLAorCQkiQmxvY2sgRGV2aWNlIiwKKwkJIlRhcGUgRGV2aWNlIiwKKwkJIkxBTiBJbnRlcmZhY2UiLAorCQkiV0FOIEludGVyZmFjZSIsCisJCSJGaWJyZSBDaGFubmVsIFBvcnQiLAorCQkiRmlicmUgQ2hhbm5lbCBEZXZpY2UiLAorCQkiU0NTSSBEZXZpY2UiLAorCQkiQVRFIFBvcnQiLAorCQkiQVRFIERldmljZSIsCisJCSJGbG9wcHkgQ29udHJvbGxlciIsCisJCSJGbG9wcHkgRGV2aWNlIiwKKwkJIlNlY29uZGFyeSBCdXMgUG9ydCIsCisJCSJQZWVyIFRyYW5zcG9ydCBBZ2VudCIsCisJCSJQZWVyIFRyYW5zcG9ydCIsCisJCSJVbmtub3duIgorCX07CisKKwlzd2l0Y2ggKGNsYXNzICYgMHhmZmYpIHsKKwljYXNlIEkyT19DTEFTU19FWEVDVVRJVkU6CisJCWlkeCA9IDA7CisJCWJyZWFrOworCWNhc2UgSTJPX0NMQVNTX0RETToKKwkJaWR4ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ0xBU1NfUkFORE9NX0JMT0NLX1NUT1JBR0U6CisJCWlkeCA9IDI7CisJCWJyZWFrOworCWNhc2UgSTJPX0NMQVNTX1NFUVVFTlRJQUxfU1RPUkFHRToKKwkJaWR4ID0gMzsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ0xBU1NfTEFOOgorCQlpZHggPSA0OworCQlicmVhazsKKwljYXNlIEkyT19DTEFTU19XQU46CisJCWlkeCA9IDU7CisJCWJyZWFrOworCWNhc2UgSTJPX0NMQVNTX0ZJQlJFX0NIQU5ORUxfUE9SVDoKKwkJaWR4ID0gNjsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ0xBU1NfRklCUkVfQ0hBTk5FTF9QRVJJUEhFUkFMOgorCQlpZHggPSA3OworCQlicmVhazsKKwljYXNlIEkyT19DTEFTU19TQ1NJX1BFUklQSEVSQUw6CisJCWlkeCA9IDg7CisJCWJyZWFrOworCWNhc2UgSTJPX0NMQVNTX0FURV9QT1JUOgorCQlpZHggPSA5OworCQlicmVhazsKKwljYXNlIEkyT19DTEFTU19BVEVfUEVSSVBIRVJBTDoKKwkJaWR4ID0gMTA7CisJCWJyZWFrOworCWNhc2UgSTJPX0NMQVNTX0ZMT1BQWV9DT05UUk9MTEVSOgorCQlpZHggPSAxMTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ0xBU1NfRkxPUFBZX0RFVklDRToKKwkJaWR4ID0gMTI7CisJCWJyZWFrOworCWNhc2UgSTJPX0NMQVNTX0JVU19BREFQVEVSX1BPUlQ6CisJCWlkeCA9IDEzOworCQlicmVhazsKKwljYXNlIEkyT19DTEFTU19QRUVSX1RSQU5TUE9SVF9BR0VOVDoKKwkJaWR4ID0gMTQ7CisJCWJyZWFrOworCWNhc2UgSTJPX0NMQVNTX1BFRVJfVFJBTlNQT1JUOgorCQlpZHggPSAxNTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGkyb19jbGFzc19uYW1lW2lkeF07Cit9CisKKyNkZWZpbmUgU0NTSV9UQUJMRV9TSVpFCTEzCitzdGF0aWMgY2hhciAqc2NzaV9kZXZpY2VzW10gPSB7CisJIkRpcmVjdC1BY2Nlc3MgUmVhZC9Xcml0ZSIsCisJIlNlcXVlbnRpYWwtQWNjZXNzIFN0b3JhZ2UiLAorCSJQcmludGVyIiwKKwkiUHJvY2Vzc29yIiwKKwkiV09STSBEZXZpY2UiLAorCSJDRC1ST00gRGV2aWNlIiwKKwkiU2Nhbm5lciBEZXZpY2UiLAorCSJPcHRpY2FsIE1lbW9yeSBEZXZpY2UiLAorCSJNZWRpdW0gQ2hhbmdlciBEZXZpY2UiLAorCSJDb21tdW5pY2F0aW9ucyBEZXZpY2UiLAorCSJHcmFwaGljcyBBcnQgUHJlLVByZXNzIERldmljZSIsCisJIkdyYXBoaWNzIEFydCBQcmUtUHJlc3MgRGV2aWNlIiwKKwkiQXJyYXkgQ29udHJvbGxlciBEZXZpY2UiCit9OworCitzdGF0aWMgY2hhciAqY2h0b3N0cih1OCAqIGNoYXJzLCBpbnQgbikKK3sKKwljaGFyIHRtcFsyNTZdOworCXRtcFswXSA9IDA7CisJcmV0dXJuIHN0cm5jYXQodG1wLCAoY2hhciAqKWNoYXJzLCBuKTsKK30KKworc3RhdGljIGludCBpMm9fcmVwb3J0X3F1ZXJ5X3N0YXR1cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgaW50IGJsb2NrX3N0YXR1cywKKwkJCQkgICBjaGFyICpncm91cCkKK3sKKwlzd2l0Y2ggKGJsb2NrX3N0YXR1cykgeworCWNhc2UgLUVUSU1FRE9VVDoKKwkJcmV0dXJuIHNlcV9wcmludGYoc2VxLCAiVGltZW91dCByZWFkaW5nIGdyb3VwICVzLlxuIiwgZ3JvdXApOworCWNhc2UgLUVOT01FTToKKwkJcmV0dXJuIHNlcV9wcmludGYoc2VxLCAiTm8gZnJlZSBtZW1vcnkgdG8gcmVhZCB0aGUgdGFibGUuXG4iKTsKKwljYXNlIC1JMk9fUEFSQU1TX1NUQVRVU19JTlZBTElEX0dST1VQX0lEOgorCQlyZXR1cm4gc2VxX3ByaW50ZihzZXEsICJHcm91cCAlcyBub3Qgc3VwcG9ydGVkLlxuIiwgZ3JvdXApOworCWRlZmF1bHQ6CisJCXJldHVybiBzZXFfcHJpbnRmKHNlcSwKKwkJCQkgICJFcnJvciByZWFkaW5nIGdyb3VwICVzLiBCbG9ja1N0YXR1cyAweCUwMlhcbiIsCisJCQkJICBncm91cCwgLWJsb2NrX3N0YXR1cyk7CisJfQorfQorCitzdGF0aWMgY2hhciAqYnVzX3N0cmluZ3NbXSA9IHsKKwkiTG9jYWwgQnVzIiwKKwkiSVNBIiwKKwkiRUlTQSIsCisJIk1DQSIsCisJIlBDSSIsCisJIlBDTUNJQSIsCisJIk5VQlVTIiwKKwkiQ0FSREJVUyIKK307CisKK3N0YXRpYyBpbnQgaTJvX3NlcV9zaG93X2hydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMgPSAoc3RydWN0IGkyb19jb250cm9sbGVyICopc2VxLT5wcml2YXRlOworCWkyb19ocnQgKmhydCA9IChpMm9faHJ0ICopIGMtPmhydC52aXJ0OworCXUzMiBidXM7CisJaW50IGk7CisKKwlpZiAoaHJ0LT5ocnRfdmVyc2lvbikgeworCQlzZXFfcHJpbnRmKHNlcSwKKwkJCSAgICJIUlQgdGFibGUgZm9yIGNvbnRyb2xsZXIgaXMgdG9vIG5ldyBhIHZlcnNpb24uXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2VxX3ByaW50ZihzZXEsICJIUlQgaGFzICVkIGVudHJpZXMgb2YgJWQgYnl0ZXMgZWFjaC5cbiIsCisJCSAgIGhydC0+bnVtX2VudHJpZXMsIGhydC0+ZW50cnlfbGVuIDw8IDIpOworCisJZm9yIChpID0gMDsgaSA8IGhydC0+bnVtX2VudHJpZXM7IGkrKykgeworCQlzZXFfcHJpbnRmKHNlcSwgIkVudHJ5ICVkOlxuIiwgaSk7CisJCXNlcV9wcmludGYoc2VxLCAiICAgQWRhcHRlciBJRDogJTAjMTB4XG4iLAorCQkJICAgaHJ0LT5ocnRfZW50cnlbaV0uYWRhcHRlcl9pZCk7CisJCXNlcV9wcmludGYoc2VxLCAiICAgQ29udHJvbGxpbmcgdGlkOiAlMCM2eFxuIiwKKwkJCSAgIGhydC0+aHJ0X2VudHJ5W2ldLnBhcmVudF90aWQpOworCisJCWlmIChocnQtPmhydF9lbnRyeVtpXS5idXNfdHlwZSAhPSAweDgwKSB7CisJCQlidXMgPSBocnQtPmhydF9lbnRyeVtpXS5idXNfdHlwZTsKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgJXMgSW5mb3JtYXRpb25cbiIsCisJCQkJICAgYnVzX3N0cmluZ3NbYnVzXSk7CisKKwkJCXN3aXRjaCAoYnVzKSB7CisJCQljYXNlIEkyT19CVVNfTE9DQUw6CisJCQkJc2VxX3ByaW50ZihzZXEsICIgICAgIElPQmFzZTogJTAjNngsIiwKKwkJCQkJICAgaHJ0LT5ocnRfZW50cnlbaV0uYnVzLmxvY2FsX2J1cy4KKwkJCQkJICAgTGJCYXNlSU9Qb3J0KTsKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiBNZW1vcnlCYXNlOiAlMCMxMHhcbiIsCisJCQkJCSAgIGhydC0+aHJ0X2VudHJ5W2ldLmJ1cy5sb2NhbF9idXMuCisJCQkJCSAgIExiQmFzZU1lbW9yeUFkZHJlc3MpOworCQkJCWJyZWFrOworCisJCQljYXNlIEkyT19CVVNfSVNBOgorCQkJCXNlcV9wcmludGYoc2VxLCAiICAgICBJT0Jhc2U6ICUwIzZ4LCIsCisJCQkJCSAgIGhydC0+aHJ0X2VudHJ5W2ldLmJ1cy5pc2FfYnVzLgorCQkJCQkgICBJc2FCYXNlSU9Qb3J0KTsKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiBNZW1vcnlCYXNlOiAlMCMxMHgsIiwKKwkJCQkJICAgaHJ0LT5ocnRfZW50cnlbaV0uYnVzLmlzYV9idXMuCisJCQkJCSAgIElzYUJhc2VNZW1vcnlBZGRyZXNzKTsKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiBDU046ICUwIzR4LCIsCisJCQkJCSAgIGhydC0+aHJ0X2VudHJ5W2ldLmJ1cy5pc2FfYnVzLkNTTik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSTJPX0JVU19FSVNBOgorCQkJCXNlcV9wcmludGYoc2VxLCAiICAgICBJT0Jhc2U6ICUwIzZ4LCIsCisJCQkJCSAgIGhydC0+aHJ0X2VudHJ5W2ldLmJ1cy5laXNhX2J1cy4KKwkJCQkJICAgRWlzYUJhc2VJT1BvcnQpOworCQkJCXNlcV9wcmludGYoc2VxLCAiIE1lbW9yeUJhc2U6ICUwIzEweCwiLAorCQkJCQkgICBocnQtPmhydF9lbnRyeVtpXS5idXMuZWlzYV9idXMuCisJCQkJCSAgIEVpc2FCYXNlTWVtb3J5QWRkcmVzcyk7CisJCQkJc2VxX3ByaW50ZihzZXEsICIgU2xvdDogJTAjNHgsIiwKKwkJCQkJICAgaHJ0LT5ocnRfZW50cnlbaV0uYnVzLmVpc2FfYnVzLgorCQkJCQkgICBFaXNhU2xvdE51bWJlcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSTJPX0JVU19NQ0E6CisJCQkJc2VxX3ByaW50ZihzZXEsICIgICAgIElPQmFzZTogJTAjNngsIiwKKwkJCQkJICAgaHJ0LT5ocnRfZW50cnlbaV0uYnVzLm1jYV9idXMuCisJCQkJCSAgIE1jYUJhc2VJT1BvcnQpOworCQkJCXNlcV9wcmludGYoc2VxLCAiIE1lbW9yeUJhc2U6ICUwIzEweCwiLAorCQkJCQkgICBocnQtPmhydF9lbnRyeVtpXS5idXMubWNhX2J1cy4KKwkJCQkJICAgTWNhQmFzZU1lbW9yeUFkZHJlc3MpOworCQkJCXNlcV9wcmludGYoc2VxLCAiIFNsb3Q6ICUwIzR4LCIsCisJCQkJCSAgIGhydC0+aHJ0X2VudHJ5W2ldLmJ1cy5tY2FfYnVzLgorCQkJCQkgICBNY2FTbG90TnVtYmVyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBJMk9fQlVTX1BDSToKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiAgICAgQnVzOiAlMCM0eCIsCisJCQkJCSAgIGhydC0+aHJ0X2VudHJ5W2ldLmJ1cy5wY2lfYnVzLgorCQkJCQkgICBQY2lCdXNOdW1iZXIpOworCQkJCXNlcV9wcmludGYoc2VxLCAiIERldjogJTAjNHgiLAorCQkJCQkgICBocnQtPmhydF9lbnRyeVtpXS5idXMucGNpX2J1cy4KKwkJCQkJICAgUGNpRGV2aWNlTnVtYmVyKTsKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiBGdW5jOiAlMCM0eCIsCisJCQkJCSAgIGhydC0+aHJ0X2VudHJ5W2ldLmJ1cy5wY2lfYnVzLgorCQkJCQkgICBQY2lGdW5jdGlvbk51bWJlcik7CisJCQkJc2VxX3ByaW50ZihzZXEsICIgVmVuZG9yOiAlMCM2eCIsCisJCQkJCSAgIGhydC0+aHJ0X2VudHJ5W2ldLmJ1cy5wY2lfYnVzLgorCQkJCQkgICBQY2lWZW5kb3JJRCk7CisJCQkJc2VxX3ByaW50ZihzZXEsICIgRGV2aWNlOiAlMCM2eFxuIiwKKwkJCQkJICAgaHJ0LT5ocnRfZW50cnlbaV0uYnVzLnBjaV9idXMuCisJCQkJCSAgIFBjaURldmljZUlEKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiAgICAgIFVuc3VwcG9ydGVkIEJ1cyBUeXBlXG4iKTsKKwkJCX0KKwkJfSBlbHNlCisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgIFVua25vd24gQnVzIFR5cGVcbiIpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGkyb19zZXFfc2hvd19sY3Qoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjID0gKHN0cnVjdCBpMm9fY29udHJvbGxlciAqKXNlcS0+cHJpdmF0ZTsKKwlpMm9fbGN0ICpsY3QgPSAoaTJvX2xjdCAqKSBjLT5sY3Q7CisJaW50IGVudHJpZXM7CisJaW50IGk7CisKKyNkZWZpbmUgQlVTX1RBQkxFX1NJWkUgMworCXN0YXRpYyBjaGFyICpidXNfcG9ydHNbXSA9IHsKKwkJIkdlbmVyaWMgQnVzIiwKKwkJIlNDU0kgQnVzIiwKKwkJIkZpYnJlIENoYW5uZWwgQnVzIgorCX07CisKKwllbnRyaWVzID0gKGxjdC0+dGFibGVfc2l6ZSAtIDMpIC8gOTsKKworCXNlcV9wcmludGYoc2VxLCAiTENUIGNvbnRhaW5zICVkICVzXG4iLCBlbnRyaWVzLAorCQkgICBlbnRyaWVzID09IDEgPyAiZW50cnkiIDogImVudHJpZXMiKTsKKwlpZiAobGN0LT5ib290X3RpZCkKKwkJc2VxX3ByaW50ZihzZXEsICJCb290IERldmljZSBAIElEICVkXG4iLCBsY3QtPmJvb3RfdGlkKTsKKworCXNlcV9wcmludGYoc2VxLCAiQ3VycmVudCBDaGFuZ2UgSW5kaWNhdG9yOiAlIzEweFxuIiwgbGN0LT5jaGFuZ2VfaW5kKTsKKworCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKKwkJc2VxX3ByaW50ZihzZXEsICJFbnRyeSAlZFxuIiwgaSk7CisJCXNlcV9wcmludGYoc2VxLCAiICBDbGFzcywgU3ViQ2xhc3MgIDogJXMiLAorCQkJICAgaTJvX2dldF9jbGFzc19uYW1lKGxjdC0+bGN0X2VudHJ5W2ldLmNsYXNzX2lkKSk7CisKKwkJLyoKKwkJICogICAgICBDbGFzc2VzIHdoaWNoIHdlJ2xsIHByaW50IHN1YmNsYXNzIGluZm8gZm9yCisJCSAqLworCQlzd2l0Y2ggKGxjdC0+bGN0X2VudHJ5W2ldLmNsYXNzX2lkICYgMHhGRkYpIHsKKwkJY2FzZSBJMk9fQ0xBU1NfUkFORE9NX0JMT0NLX1NUT1JBR0U6CisJCQlzd2l0Y2ggKGxjdC0+bGN0X2VudHJ5W2ldLnN1Yl9jbGFzcykgeworCQkJY2FzZSAweDAwOgorCQkJCXNlcV9wcmludGYoc2VxLCAiLCBEaXJlY3QtQWNjZXNzIFJlYWQvV3JpdGUiKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAweDA0OgorCQkJCXNlcV9wcmludGYoc2VxLCAiLCBXT1JNIERyaXZlIik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMHgwNToKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiwgQ0QtUk9NIERyaXZlIik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMHgwNzoKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiwgT3B0aWNhbCBNZW1vcnkgRGV2aWNlIik7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJc2VxX3ByaW50ZihzZXEsICIsIFVua25vd24gKDB4JTAyeCkiLAorCQkJCQkgICBsY3QtPmxjdF9lbnRyeVtpXS5zdWJfY2xhc3MpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJMk9fQ0xBU1NfTEFOOgorCQkJc3dpdGNoIChsY3QtPmxjdF9lbnRyeVtpXS5zdWJfY2xhc3MgJiAweEZGKSB7CisJCQljYXNlIDB4MzA6CisJCQkJc2VxX3ByaW50ZihzZXEsICIsIEV0aGVybmV0Iik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMHg0MDoKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiwgMTAwYmFzZSBWRyIpOworCQkJCWJyZWFrOworCisJCQljYXNlIDB4NTA6CisJCQkJc2VxX3ByaW50ZihzZXEsICIsIElFRUUgODAyLjUvVG9rZW4tUmluZyIpOworCQkJCWJyZWFrOworCisJCQljYXNlIDB4NjA6CisJCQkJc2VxX3ByaW50ZihzZXEsICIsIEFOU0kgWDNUOS41IEZEREkiKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAweDcwOgorCQkJCXNlcV9wcmludGYoc2VxLCAiLCBGaWJyZSBDaGFubmVsIik7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJc2VxX3ByaW50ZihzZXEsICIsIFVua25vd24gU3ViLUNsYXNzICgweCUwMngpIiwKKwkJCQkJICAgbGN0LT5sY3RfZW50cnlbaV0uc3ViX2NsYXNzICYgMHhGRik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEkyT19DTEFTU19TQ1NJX1BFUklQSEVSQUw6CisJCQlpZiAobGN0LT5sY3RfZW50cnlbaV0uc3ViX2NsYXNzIDwgU0NTSV9UQUJMRV9TSVpFKQorCQkJCXNlcV9wcmludGYoc2VxLCAiLCAlcyIsCisJCQkJCSAgIHNjc2lfZGV2aWNlc1tsY3QtPmxjdF9lbnRyeVtpXS4KKwkJCQkJCQlzdWJfY2xhc3NdKTsKKwkJCWVsc2UKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiwgVW5rbm93biBEZXZpY2UgVHlwZSIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJMk9fQ0xBU1NfQlVTX0FEQVBURVJfUE9SVDoKKwkJCWlmIChsY3QtPmxjdF9lbnRyeVtpXS5zdWJfY2xhc3MgPCBCVVNfVEFCTEVfU0laRSkKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiwgJXMiLAorCQkJCQkgICBidXNfcG9ydHNbbGN0LT5sY3RfZW50cnlbaV0uCisJCQkJCQkgICAgIHN1Yl9jbGFzc10pOworCQkJZWxzZQorCQkJCXNlcV9wcmludGYoc2VxLCAiLCBVbmtub3duIEJ1cyBUeXBlIik7CisJCQlicmVhazsKKwkJfQorCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CisKKwkJc2VxX3ByaW50ZihzZXEsICIgIExvY2FsIFRJRCAgICAgICAgOiAweCUwM3hcbiIsCisJCQkgICBsY3QtPmxjdF9lbnRyeVtpXS50aWQpOworCQlzZXFfcHJpbnRmKHNlcSwgIiAgVXNlciBUSUQgICAgICAgICA6IDB4JTAzeFxuIiwKKwkJCSAgIGxjdC0+bGN0X2VudHJ5W2ldLnVzZXJfdGlkKTsKKwkJc2VxX3ByaW50ZihzZXEsICIgIFBhcmVudCBUSUQgICAgICAgOiAweCUwM3hcbiIsCisJCQkgICBsY3QtPmxjdF9lbnRyeVtpXS5wYXJlbnRfdGlkKTsKKwkJc2VxX3ByaW50ZihzZXEsICIgIElkZW50aXR5IFRhZyAgICAgOiAweCV4JXgleCV4JXgleCV4JXhcbiIsCisJCQkgICBsY3QtPmxjdF9lbnRyeVtpXS5pZGVudGl0eV90YWdbMF0sCisJCQkgICBsY3QtPmxjdF9lbnRyeVtpXS5pZGVudGl0eV90YWdbMV0sCisJCQkgICBsY3QtPmxjdF9lbnRyeVtpXS5pZGVudGl0eV90YWdbMl0sCisJCQkgICBsY3QtPmxjdF9lbnRyeVtpXS5pZGVudGl0eV90YWdbM10sCisJCQkgICBsY3QtPmxjdF9lbnRyeVtpXS5pZGVudGl0eV90YWdbNF0sCisJCQkgICBsY3QtPmxjdF9lbnRyeVtpXS5pZGVudGl0eV90YWdbNV0sCisJCQkgICBsY3QtPmxjdF9lbnRyeVtpXS5pZGVudGl0eV90YWdbNl0sCisJCQkgICBsY3QtPmxjdF9lbnRyeVtpXS5pZGVudGl0eV90YWdbN10pOworCQlzZXFfcHJpbnRmKHNlcSwgIiAgQ2hhbmdlIEluZGljYXRvciA6ICUwIzEweFxuIiwKKwkJCSAgIGxjdC0+bGN0X2VudHJ5W2ldLmNoYW5nZV9pbmQpOworCQlzZXFfcHJpbnRmKHNlcSwgIiAgRXZlbnQgQ2FwYWIgTWFzayA6ICUwIzEweFxuIiwKKwkJCSAgIGxjdC0+bGN0X2VudHJ5W2ldLmRldmljZV9mbGFncyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTJvX3NlcV9zaG93X3N0YXR1cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMgPSAoc3RydWN0IGkyb19jb250cm9sbGVyICopc2VxLT5wcml2YXRlOworCWNoYXIgcHJvZHN0clsyNV07CisJaW50IHZlcnNpb247CisJaTJvX3N0YXR1c19ibG9jayAqc2IgPSBjLT5zdGF0dXNfYmxvY2sudmlydDsKKworCWkyb19zdGF0dXNfZ2V0KGMpOwkvLyByZXJlYWQgdGhlIHN0YXR1cyBibG9jaworCisJc2VxX3ByaW50ZihzZXEsICJPcmdhbml6YXRpb24gSUQgICAgICAgIDogJTAjNnhcbiIsIHNiLT5vcmdfaWQpOworCisJdmVyc2lvbiA9IHNiLT5pMm9fdmVyc2lvbjsKKworLyogRklYTUUgZm9yIFNwZWMgMi4wCisJaWYgKHZlcnNpb24gPT0gMHgwMikgeworCQlzZXFfcHJpbnRmKHNlcSwgIkxvd2VzdCBJMk8gdmVyc2lvbiBzdXBwb3J0ZWQ6ICIpOworCQlzd2l0Y2god29ya3NwYWNlWzJdKSB7CisJCQljYXNlIDB4MDA6CisJCQkJc2VxX3ByaW50ZihzZXEsICIxLjBcbiIpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDAxOgorCQkJCXNlcV9wcmludGYoc2VxLCAiMS41XG4iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwMjoKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIjIuMFxuIik7CisJCQkJYnJlYWs7CisJCX0KKworCQlzZXFfcHJpbnRmKHNlcSwgIkhpZ2hlc3QgSTJPIHZlcnNpb24gc3VwcG9ydGVkOiAiKTsKKwkJc3dpdGNoKHdvcmtzcGFjZVszXSkgeworCQkJY2FzZSAweDAwOgorCQkJCXNlcV9wcmludGYoc2VxLCAiMS4wXG4iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwMToKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIjEuNVxuIik7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MDI6CisJCQkJc2VxX3ByaW50ZihzZXEsICIyLjBcbiIpOworCQkJCWJyZWFrOworCQl9CisJfQorKi8KKwlzZXFfcHJpbnRmKHNlcSwgIklPUCBJRCAgICAgICAgICAgICAgICAgOiAlMCM1eFxuIiwgc2ItPmlvcF9pZCk7CisJc2VxX3ByaW50ZihzZXEsICJIb3N0IFVuaXQgSUQgICAgICAgICAgIDogJTAjNnhcbiIsIHNiLT5ob3N0X3VuaXRfaWQpOworCXNlcV9wcmludGYoc2VxLCAiU2VnbWVudCBOdW1iZXIgICAgICAgICA6ICUwIzV4XG4iLCBzYi0+c2VnbWVudF9udW1iZXIpOworCisJc2VxX3ByaW50ZihzZXEsICJJMk8gdmVyc2lvbiAgICAgICAgICAgIDogIik7CisJc3dpdGNoICh2ZXJzaW9uKSB7CisJY2FzZSAweDAwOgorCQlzZXFfcHJpbnRmKHNlcSwgIjEuMFxuIik7CisJCWJyZWFrOworCWNhc2UgMHgwMToKKwkJc2VxX3ByaW50ZihzZXEsICIxLjVcbiIpOworCQlicmVhazsKKwljYXNlIDB4MDI6CisJCXNlcV9wcmludGYoc2VxLCAiMi4wXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2VxX3ByaW50ZihzZXEsICJVbmtub3duIHZlcnNpb25cbiIpOworCX0KKworCXNlcV9wcmludGYoc2VxLCAiSU9QIFN0YXRlICAgICAgICAgICAgICA6ICIpOworCXN3aXRjaCAoc2ItPmlvcF9zdGF0ZSkgeworCWNhc2UgMHgwMToKKwkJc2VxX3ByaW50ZihzZXEsICJJTklUXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDI6CisJCXNlcV9wcmludGYoc2VxLCAiUkVTRVRcbiIpOworCQlicmVhazsKKworCWNhc2UgMHgwNDoKKwkJc2VxX3ByaW50ZihzZXEsICJIT0xEXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDU6CisJCXNlcV9wcmludGYoc2VxLCAiUkVBRFlcbiIpOworCQlicmVhazsKKworCWNhc2UgMHgwODoKKwkJc2VxX3ByaW50ZihzZXEsICJPUEVSQVRJT05BTFxuIik7CisJCWJyZWFrOworCisJY2FzZSAweDEwOgorCQlzZXFfcHJpbnRmKHNlcSwgIkZBSUxFRFxuIik7CisJCWJyZWFrOworCisJY2FzZSAweDExOgorCQlzZXFfcHJpbnRmKHNlcSwgIkZBVUxURURcbiIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXNlcV9wcmludGYoc2VxLCAiVW5rbm93blxuIik7CisJCWJyZWFrOworCX0KKworCXNlcV9wcmludGYoc2VxLCAiTWVzc2VuZ2VyIFR5cGUgICAgICAgICA6ICIpOworCXN3aXRjaCAoc2ItPm1zZ190eXBlKSB7CisJY2FzZSAweDAwOgorCQlzZXFfcHJpbnRmKHNlcSwgIk1lbW9yeSBtYXBwZWRcbiIpOworCQlicmVhazsKKwljYXNlIDB4MDE6CisJCXNlcV9wcmludGYoc2VxLCAiTWVtb3J5IG1hcHBlZCBvbmx5XG4iKTsKKwkJYnJlYWs7CisJY2FzZSAweDAyOgorCQlzZXFfcHJpbnRmKHNlcSwgIlJlbW90ZSBvbmx5XG4iKTsKKwkJYnJlYWs7CisJY2FzZSAweDAzOgorCQlzZXFfcHJpbnRmKHNlcSwgIk1lbW9yeSBtYXBwZWQgYW5kIHJlbW90ZVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNlcV9wcmludGYoc2VxLCAiVW5rbm93blxuIik7CisJfQorCisJc2VxX3ByaW50ZihzZXEsICJJbmJvdW5kIEZyYW1lIFNpemUgICAgIDogJWQgYnl0ZXNcbiIsCisJCSAgIHNiLT5pbmJvdW5kX2ZyYW1lX3NpemUgPDwgMik7CisJc2VxX3ByaW50ZihzZXEsICJNYXggSW5ib3VuZCBGcmFtZXMgICAgIDogJWRcbiIsCisJCSAgIHNiLT5tYXhfaW5ib3VuZF9mcmFtZXMpOworCXNlcV9wcmludGYoc2VxLCAiQ3VycmVudCBJbmJvdW5kIEZyYW1lcyA6ICVkXG4iLAorCQkgICBzYi0+Y3VyX2luYm91bmRfZnJhbWVzKTsKKwlzZXFfcHJpbnRmKHNlcSwgIk1heCBPdXRib3VuZCBGcmFtZXMgICAgOiAlZFxuIiwKKwkJICAgc2ItPm1heF9vdXRib3VuZF9mcmFtZXMpOworCisJLyogU3BlYyBkb2Vzbid0IHNheSBpZiBOVUxMIHRlcm1pbmF0ZWQgb3Igbm90Li4uICovCisJbWVtY3B5KHByb2RzdHIsIHNiLT5wcm9kdWN0X2lkLCAyNCk7CisJcHJvZHN0clsyNF0gPSAnXDAnOworCXNlcV9wcmludGYoc2VxLCAiUHJvZHVjdCBJRCAgICAgICAgICAgICA6ICVzXG4iLCBwcm9kc3RyKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkV4cGVjdGVkIExDVCBTaXplICAgICAgOiAlZCBieXRlc1xuIiwKKwkJICAgc2ItPmV4cGVjdGVkX2xjdF9zaXplKTsKKworCXNlcV9wcmludGYoc2VxLCAiSU9QIENhcGFiaWxpdGllc1xuIik7CisJc2VxX3ByaW50ZihzZXEsICIgICAgQ29udGV4dCBGaWVsZCBTaXplIFN1cHBvcnQgOiAiKTsKKwlzd2l0Y2ggKHNiLT5pb3BfY2FwYWJpbGl0aWVzICYgMHgwMDAwMDAzKSB7CisJY2FzZSAwOgorCQlzZXFfcHJpbnRmKHNlcSwgIlN1cHBvcnRzIG9ubHkgMzItYml0IGNvbnRleHQgZmllbGRzXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzZXFfcHJpbnRmKHNlcSwgIlN1cHBvcnRzIG9ubHkgNjQtYml0IGNvbnRleHQgZmllbGRzXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzZXFfcHJpbnRmKHNlcSwgIlN1cHBvcnRzIDMyLWJpdCBhbmQgNjQtYml0IGNvbnRleHQgZmllbGRzLCAiCisJCQkgICAiYnV0IG5vdCBjb25jdXJyZW50bHlcbiIpOworCQlicmVhazsKKwljYXNlIDM6CisJCXNlcV9wcmludGYoc2VxLCAiU3VwcG9ydHMgMzItYml0IGFuZCA2NC1iaXQgY29udGV4dCBmaWVsZHMgIgorCQkJICAgImNvbmN1cnJlbnRseVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNlcV9wcmludGYoc2VxLCAiMHglMDh4XG4iLCBzYi0+aW9wX2NhcGFiaWxpdGllcyk7CisJfQorCXNlcV9wcmludGYoc2VxLCAiICAgIEN1cnJlbnQgQ29udGV4dCBGaWVsZCBTaXplIDogIik7CisJc3dpdGNoIChzYi0+aW9wX2NhcGFiaWxpdGllcyAmIDB4MDAwMDAwMEMpIHsKKwljYXNlIDA6CisJCXNlcV9wcmludGYoc2VxLCAibm90IGNvbmZpZ3VyZWRcbiIpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXNlcV9wcmludGYoc2VxLCAiU3VwcG9ydHMgb25seSAzMi1iaXQgY29udGV4dCBmaWVsZHNcbiIpOworCQlicmVhazsKKwljYXNlIDg6CisJCXNlcV9wcmludGYoc2VxLCAiU3VwcG9ydHMgb25seSA2NC1iaXQgY29udGV4dCBmaWVsZHNcbiIpOworCQlicmVhazsKKwljYXNlIDEyOgorCQlzZXFfcHJpbnRmKHNlcSwgIlN1cHBvcnRzIGJvdGggMzItYml0IG9yIDY0LWJpdCBjb250ZXh0IGZpZWxkcyAiCisJCQkgICAiY29uY3VycmVudGx5XG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2VxX3ByaW50ZihzZXEsICJcbiIpOworCX0KKwlzZXFfcHJpbnRmKHNlcSwgIiAgICBJbmJvdW5kIFBlZXIgU3VwcG9ydCAgICAgICA6ICVzXG4iLAorCQkgICAoc2ItPgorCQkgICAgaW9wX2NhcGFiaWxpdGllcyAmIDB4MDAwMDAwMTApID8gIlN1cHBvcnRlZCIgOgorCQkgICAiTm90IHN1cHBvcnRlZCIpOworCXNlcV9wcmludGYoc2VxLCAiICAgIE91dGJvdW5kIFBlZXIgU3VwcG9ydCAgICAgIDogJXNcbiIsCisJCSAgIChzYi0+CisJCSAgICBpb3BfY2FwYWJpbGl0aWVzICYgMHgwMDAwMDAyMCkgPyAiU3VwcG9ydGVkIiA6CisJCSAgICJOb3Qgc3VwcG9ydGVkIik7CisJc2VxX3ByaW50ZihzZXEsICIgICAgUGVlciB0byBQZWVyIFN1cHBvcnQgICAgICAgOiAlc1xuIiwKKwkJICAgKHNiLT4KKwkJICAgIGlvcF9jYXBhYmlsaXRpZXMgJiAweDAwMDAwMDQwKSA/ICJTdXBwb3J0ZWQiIDoKKwkJICAgIk5vdCBzdXBwb3J0ZWQiKTsKKworCXNlcV9wcmludGYoc2VxLCAiRGVzaXJlZCBwcml2YXRlIG1lbW9yeSBzaXplICAgOiAlZCBrQlxuIiwKKwkJICAgc2ItPmRlc2lyZWRfbWVtX3NpemUgPj4gMTApOworCXNlcV9wcmludGYoc2VxLCAiQWxsb2NhdGVkIHByaXZhdGUgbWVtb3J5IHNpemUgOiAlZCBrQlxuIiwKKwkJICAgc2ItPmN1cnJlbnRfbWVtX3NpemUgPj4gMTApOworCXNlcV9wcmludGYoc2VxLCAiUHJpdmF0ZSBtZW1vcnkgYmFzZSBhZGRyZXNzICAgOiAlMCMxMHhcbiIsCisJCSAgIHNiLT5jdXJyZW50X21lbV9iYXNlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkRlc2lyZWQgcHJpdmF0ZSBJL08gc2l6ZSAgICAgIDogJWQga0JcbiIsCisJCSAgIHNiLT5kZXNpcmVkX2lvX3NpemUgPj4gMTApOworCXNlcV9wcmludGYoc2VxLCAiQWxsb2NhdGVkIHByaXZhdGUgSS9PIHNpemUgICAgOiAlZCBrQlxuIiwKKwkJICAgc2ItPmN1cnJlbnRfaW9fc2l6ZSA+PiAxMCk7CisJc2VxX3ByaW50ZihzZXEsICJQcml2YXRlIEkvTyBiYXNlIGFkZHJlc3MgICAgICA6ICUwIzEweFxuIiwKKwkJICAgc2ItPmN1cnJlbnRfaW9fYmFzZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpMm9fc2VxX3Nob3dfaHcoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjID0gKHN0cnVjdCBpMm9fY29udHJvbGxlciAqKXNlcS0+cHJpdmF0ZTsKKwlzdGF0aWMgdTMyIHdvcmszMls1XTsKKwlzdGF0aWMgdTggKndvcms4ID0gKHU4ICopIHdvcmszMjsKKwlzdGF0aWMgdTE2ICp3b3JrMTYgPSAodTE2ICopIHdvcmszMjsKKwlpbnQgdG9rZW47CisJdTMyIGh3Y2FwOworCisJc3RhdGljIGNoYXIgKmNwdV90YWJsZVtdID0geworCQkiSW50ZWwgODA5NjAgc2VyaWVzIiwKKwkJIkFNRDI5MDAgc2VyaWVzIiwKKwkJIk1vdG9yb2xhIDY4MDAwIHNlcmllcyIsCisJCSJBUk0gc2VyaWVzIiwKKwkJIk1JUFMgc2VyaWVzIiwKKwkJIlNwYXJjIHNlcmllcyIsCisJCSJQb3dlclBDIHNlcmllcyIsCisJCSJJbnRlbCB4ODYgc2VyaWVzIgorCX07CisKKwl0b2tlbiA9CisJICAgIGkyb19wYXJtX2ZpZWxkX2dldChjLT5leGVjLCAweDAwMDAsIC0xLCAmd29yazMyLCBzaXplb2Yod29yazMyKSk7CisKKwlpZiAodG9rZW4gPCAwKSB7CisJCWkyb19yZXBvcnRfcXVlcnlfc3RhdHVzKHNlcSwgdG9rZW4sICIweDAwMDAgSU9QIEhhcmR3YXJlIik7CisJCXJldHVybiAwOworCX0KKworCXNlcV9wcmludGYoc2VxLCAiSTJPIFZlbmRvciBJRCAgICA6ICUwIzZ4XG4iLCB3b3JrMTZbMF0pOworCXNlcV9wcmludGYoc2VxLCAiUHJvZHVjdCBJRCAgICAgICA6ICUwIzZ4XG4iLCB3b3JrMTZbMV0pOworCXNlcV9wcmludGYoc2VxLCAiQ1BVICAgICAgICAgICAgICA6ICIpOworCWlmICh3b3JrOFsxNl0gPiA4KQorCQlzZXFfcHJpbnRmKHNlcSwgIlVua25vd25cbiIpOworCWVsc2UKKwkJc2VxX3ByaW50ZihzZXEsICIlc1xuIiwgY3B1X3RhYmxlW3dvcms4WzE2XV0pOworCS8qIEFueW9uZSB1c2luZyBQcm9jZXNzb3JWZXJzaW9uPyAqLworCisJc2VxX3ByaW50ZihzZXEsICJSQU0gICAgICAgICAgICAgIDogJWRrQlxuIiwgd29yazMyWzFdID4+IDEwKTsKKwlzZXFfcHJpbnRmKHNlcSwgIk5vbi1Wb2xhdGlsZSBNZW0gOiAlZGtCXG4iLCB3b3JrMzJbMl0gPj4gMTApOworCisJaHdjYXAgPSB3b3JrMzJbM107CisJc2VxX3ByaW50ZihzZXEsICJDYXBhYmlsaXRpZXMgOiAweCUwOHhcbiIsIGh3Y2FwKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgIFslc10gU2VsZiBib290aW5nXG4iLAorCQkgICAoaHdjYXAgJiAweDAwMDAwMDAxKSA/ICIrIiA6ICItIik7CisJc2VxX3ByaW50ZihzZXEsICIgICBbJXNdIFVwZ3JhZGFibGUgSVJUT1NcbiIsCisJCSAgIChod2NhcCAmIDB4MDAwMDAwMDIpID8gIisiIDogIi0iKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgIFslc10gU3VwcG9ydHMgZG93bmxvYWRpbmcgRERNc1xuIiwKKwkJICAgKGh3Y2FwICYgMHgwMDAwMDAwNCkgPyAiKyIgOiAiLSIpOworCXNlcV9wcmludGYoc2VxLCAiICAgWyVzXSBTdXBwb3J0cyBpbnN0YWxsaW5nIERETXNcbiIsCisJCSAgIChod2NhcCAmIDB4MDAwMDAwMDgpID8gIisiIDogIi0iKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgIFslc10gQmF0dGVyeS1iYWNrZWQgUkFNXG4iLAorCQkgICAoaHdjYXAgJiAweDAwMDAwMDEwKSA/ICIrIiA6ICItIik7CisKKwlyZXR1cm4gMDsKK30KKworLyogRXhlY3V0aXZlIGdyb3VwIDAwMDNoIC0gRXhlY3V0aW5nIERETSBMaXN0ICh0YWJsZSkgKi8KK3N0YXRpYyBpbnQgaTJvX3NlcV9zaG93X2RkbV90YWJsZShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMgPSAoc3RydWN0IGkyb19jb250cm9sbGVyICopc2VxLT5wcml2YXRlOworCWludCB0b2tlbjsKKwlpbnQgaTsKKworCXR5cGVkZWYgc3RydWN0IF9pMm9fZXhlY19leGVjdXRlX2RkbV90YWJsZSB7CisJCXUxNiBkZG1fdGlkOworCQl1OCBtb2R1bGVfdHlwZTsKKwkJdTggcmVzZXJ2ZWQ7CisJCXUxNiBpMm9fdmVuZG9yX2lkOworCQl1MTYgbW9kdWxlX2lkOworCQl1OCBtb2R1bGVfbmFtZV92ZXJzaW9uWzI4XTsKKwkJdTMyIGRhdGFfc2l6ZTsKKwkJdTMyIGNvZGVfc2l6ZTsKKwl9IGkyb19leGVjX2V4ZWN1dGVfZGRtX3RhYmxlOworCisJc3RydWN0IHsKKwkJdTE2IHJlc3VsdF9jb3VudDsKKwkJdTE2IHBhZDsKKwkJdTE2IGJsb2NrX3NpemU7CisJCXU4IGJsb2NrX3N0YXR1czsKKwkJdTggZXJyb3JfaW5mb19zaXplOworCQl1MTYgcm93X2NvdW50OworCQl1MTYgbW9yZV9mbGFnOworCQlpMm9fZXhlY19leGVjdXRlX2RkbV90YWJsZSBkZG1fdGFibGVbSTJPX01BWF9NT0RVTEVTXTsKKwl9ICpyZXN1bHQ7CisKKwlpMm9fZXhlY19leGVjdXRlX2RkbV90YWJsZSBkZG1fdGFibGU7CisKKwlyZXN1bHQgPSBrbWFsbG9jKHNpemVvZigqcmVzdWx0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRU5PTUVNOworCisJdG9rZW4gPSBpMm9fcGFybV90YWJsZV9nZXQoYy0+ZXhlYywgSTJPX1BBUkFNU19UQUJMRV9HRVQsIDB4MDAwMywgLTEsCisJCQkJICAgTlVMTCwgMCwgcmVzdWx0LCBzaXplb2YoKnJlc3VsdCkpOworCisJaWYgKHRva2VuIDwgMCkgeworCQlpMm9fcmVwb3J0X3F1ZXJ5X3N0YXR1cyhzZXEsIHRva2VuLAorCQkJCQkiMHgwMDAzIEV4ZWN1dGluZyBERE0gTGlzdCIpOworCQlnb3RvIG91dDsKKwl9CisKKwlzZXFfcHJpbnRmKHNlcSwKKwkJICAgIlRpZCAgIE1vZHVsZV90eXBlICAgICBWZW5kb3IgTW9kX2lkICBNb2R1bGVfbmFtZSAgICAgICAgICAgICBWcnMgIERhdGFfc2l6ZSBDb2RlX3NpemVcbiIpOworCWRkbV90YWJsZSA9IHJlc3VsdC0+ZGRtX3RhYmxlWzBdOworCisJZm9yIChpID0gMDsgaSA8IHJlc3VsdC0+cm93X2NvdW50OyBkZG1fdGFibGUgPSByZXN1bHQtPmRkbV90YWJsZVsrK2ldKSB7CisJCXNlcV9wcmludGYoc2VxLCAiMHglMDN4ICIsIGRkbV90YWJsZS5kZG1fdGlkICYgMHhGRkYpOworCisJCXN3aXRjaCAoZGRtX3RhYmxlLm1vZHVsZV90eXBlKSB7CisJCWNhc2UgMHgwMToKKwkJCXNlcV9wcmludGYoc2VxLCAiRG93bmxvYWRlZCBERE0gICIpOworCQkJYnJlYWs7CisJCWNhc2UgMHgyMjoKKwkJCXNlcV9wcmludGYoc2VxLCAiRW1iZWRkZWQgRERNICAgICIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgICAgICAgICAgICAgICAiKTsKKwkJfQorCisJCXNlcV9wcmludGYoc2VxLCAiJS0jN3giLCBkZG1fdGFibGUuaTJvX3ZlbmRvcl9pZCk7CisJCXNlcV9wcmludGYoc2VxLCAiJS0jOHgiLCBkZG1fdGFibGUubW9kdWxlX2lkKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlLTI5cyIsCisJCQkgICBjaHRvc3RyKGRkbV90YWJsZS5tb2R1bGVfbmFtZV92ZXJzaW9uLCAyOCkpOworCQlzZXFfcHJpbnRmKHNlcSwgIiU5ZCAgIiwgZGRtX3RhYmxlLmRhdGFfc2l6ZSk7CisJCXNlcV9wcmludGYoc2VxLCAiJThkIiwgZGRtX3RhYmxlLmNvZGVfc2l6ZSk7CisKKwkJc2VxX3ByaW50ZihzZXEsICJcbiIpOworCX0KKyAgICAgIG91dDoKKwlrZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCisvKiBFeGVjdXRpdmUgZ3JvdXAgMDAwNGggLSBEcml2ZXIgU3RvcmUgKHNjYWxhcikgKi8KK3N0YXRpYyBpbnQgaTJvX3NlcV9zaG93X2RyaXZlcl9zdG9yZShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMgPSAoc3RydWN0IGkyb19jb250cm9sbGVyICopc2VxLT5wcml2YXRlOworCXUzMiB3b3JrMzJbOF07CisJaW50IHRva2VuOworCisJdG9rZW4gPQorCSAgICBpMm9fcGFybV9maWVsZF9nZXQoYy0+ZXhlYywgMHgwMDA0LCAtMSwgJndvcmszMiwgc2l6ZW9mKHdvcmszMikpOworCWlmICh0b2tlbiA8IDApIHsKKwkJaTJvX3JlcG9ydF9xdWVyeV9zdGF0dXMoc2VxLCB0b2tlbiwgIjB4MDAwNCBEcml2ZXIgU3RvcmUiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2VxX3ByaW50ZihzZXEsICJNb2R1bGUgbGltaXQgIDogJWRcbiIKKwkJICAgIk1vZHVsZSBjb3VudCAgOiAlZFxuIgorCQkgICAiQ3VycmVudCBzcGFjZSA6ICVkIGtCXG4iCisJCSAgICJGcmVlIHNwYWNlICAgIDogJWQga0JcbiIsCisJCSAgIHdvcmszMlswXSwgd29yazMyWzFdLCB3b3JrMzJbMl0gPj4gMTAsIHdvcmszMlszXSA+PiAxMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogRXhlY3V0aXZlIGdyb3VwIDAwMDVoIC0gRHJpdmVyIFN0b3JlIFRhYmxlICh0YWJsZSkgKi8KK3N0YXRpYyBpbnQgaTJvX3NlcV9zaG93X2RyaXZlcnNfc3RvcmVkKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXR5cGVkZWYgc3RydWN0IF9pMm9fZHJpdmVyX3N0b3JlIHsKKwkJdTE2IHN0b3JlZF9kZG1faW5kZXg7CisJCXU4IG1vZHVsZV90eXBlOworCQl1OCByZXNlcnZlZDsKKwkJdTE2IGkyb192ZW5kb3JfaWQ7CisJCXUxNiBtb2R1bGVfaWQ7CisJCXU4IG1vZHVsZV9uYW1lX3ZlcnNpb25bMjhdOworCQl1OCBkYXRlWzhdOworCQl1MzIgbW9kdWxlX3NpemU7CisJCXUzMiBtcGJfc2l6ZTsKKwkJdTMyIG1vZHVsZV9mbGFnczsKKwl9IGkyb19kcml2ZXJfc3RvcmVfdGFibGU7CisKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMgPSAoc3RydWN0IGkyb19jb250cm9sbGVyICopc2VxLT5wcml2YXRlOworCWludCB0b2tlbjsKKwlpbnQgaTsKKworCXR5cGVkZWYgc3RydWN0IHsKKwkJdTE2IHJlc3VsdF9jb3VudDsKKwkJdTE2IHBhZDsKKwkJdTE2IGJsb2NrX3NpemU7CisJCXU4IGJsb2NrX3N0YXR1czsKKwkJdTggZXJyb3JfaW5mb19zaXplOworCQl1MTYgcm93X2NvdW50OworCQl1MTYgbW9yZV9mbGFnOworCQlpMm9fZHJpdmVyX3N0b3JlX3RhYmxlIGRzdFtJMk9fTUFYX01PRFVMRVNdOworCX0gaTJvX2RyaXZlcl9yZXN1bHRfdGFibGU7CisKKwlpMm9fZHJpdmVyX3Jlc3VsdF90YWJsZSAqcmVzdWx0OworCWkyb19kcml2ZXJfc3RvcmVfdGFibGUgKmRzdDsKKworCXJlc3VsdCA9IGttYWxsb2Moc2l6ZW9mKGkyb19kcml2ZXJfcmVzdWx0X3RhYmxlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJlc3VsdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRva2VuID0gaTJvX3Bhcm1fdGFibGVfZ2V0KGMtPmV4ZWMsIEkyT19QQVJBTVNfVEFCTEVfR0VULCAweDAwMDUsIC0xLAorCQkJCSAgIE5VTEwsIDAsIHJlc3VsdCwgc2l6ZW9mKCpyZXN1bHQpKTsKKworCWlmICh0b2tlbiA8IDApIHsKKwkJaTJvX3JlcG9ydF9xdWVyeV9zdGF0dXMoc2VxLCB0b2tlbiwKKwkJCQkJIjB4MDAwNSBEUklWRVIgU1RPUkUgVEFCTEUiKTsKKwkJa2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2VxX3ByaW50ZihzZXEsCisJCSAgICIjICBNb2R1bGVfdHlwZSAgICAgVmVuZG9yIE1vZF9pZCAgTW9kdWxlX25hbWUgICAgICAgICAgICAgVnJzIgorCQkgICAiRGF0ZSAgICAgTW9kX3NpemUgUGFyX3NpemUgRmxhZ3NcbiIpOworCWZvciAoaSA9IDAsIGRzdCA9ICZyZXN1bHQtPmRzdFswXTsgaSA8IHJlc3VsdC0+cm93X2NvdW50OworCSAgICAgZHN0ID0gJnJlc3VsdC0+ZHN0WysraV0pIHsKKwkJc2VxX3ByaW50ZihzZXEsICIlLTNkIiwgZHN0LT5zdG9yZWRfZGRtX2luZGV4KTsKKwkJc3dpdGNoIChkc3QtPm1vZHVsZV90eXBlKSB7CisJCWNhc2UgMHgwMToKKwkJCXNlcV9wcmludGYoc2VxLCAiRG93bmxvYWRlZCBERE0gICIpOworCQkJYnJlYWs7CisJCWNhc2UgMHgyMjoKKwkJCXNlcV9wcmludGYoc2VxLCAiRW1iZWRkZWQgRERNICAgICIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgICAgICAgICAgICAgICAiKTsKKwkJfQorCisJCXNlcV9wcmludGYoc2VxLCAiJS0jN3giLCBkc3QtPmkyb192ZW5kb3JfaWQpOworCQlzZXFfcHJpbnRmKHNlcSwgIiUtIzh4IiwgZHN0LT5tb2R1bGVfaWQpOworCQlzZXFfcHJpbnRmKHNlcSwgIiUtMjlzIiwgY2h0b3N0cihkc3QtPm1vZHVsZV9uYW1lX3ZlcnNpb24sIDI4KSk7CisJCXNlcV9wcmludGYoc2VxLCAiJS05cyIsIGNodG9zdHIoZHN0LT5kYXRlLCA4KSk7CisJCXNlcV9wcmludGYoc2VxLCAiJThkICIsIGRzdC0+bW9kdWxlX3NpemUpOworCQlzZXFfcHJpbnRmKHNlcSwgIiU4ZCAiLCBkc3QtPm1wYl9zaXplKTsKKwkJc2VxX3ByaW50ZihzZXEsICIweCUwNHgiLCBkc3QtPm1vZHVsZV9mbGFncyk7CisJCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKKwl9CisKKwlrZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCisvKiBHZW5lcmljIGdyb3VwIEYwMDBoIC0gUGFyYW1zIERlc2NyaXB0b3IgKHRhYmxlKSAqLworc3RhdGljIGludCBpMm9fc2VxX3Nob3dfZ3JvdXBzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBpMm9fZGV2aWNlICpkID0gKHN0cnVjdCBpMm9fZGV2aWNlICopc2VxLT5wcml2YXRlOworCWludCB0b2tlbjsKKwlpbnQgaTsKKwl1OCBwcm9wZXJ0aWVzOworCisJdHlwZWRlZiBzdHJ1Y3QgX2kyb19ncm91cF9pbmZvIHsKKwkJdTE2IGdyb3VwX251bWJlcjsKKwkJdTE2IGZpZWxkX2NvdW50OworCQl1MTYgcm93X2NvdW50OworCQl1OCBwcm9wZXJ0aWVzOworCQl1OCByZXNlcnZlZDsKKwl9IGkyb19ncm91cF9pbmZvOworCisJc3RydWN0IHsKKwkJdTE2IHJlc3VsdF9jb3VudDsKKwkJdTE2IHBhZDsKKwkJdTE2IGJsb2NrX3NpemU7CisJCXU4IGJsb2NrX3N0YXR1czsKKwkJdTggZXJyb3JfaW5mb19zaXplOworCQl1MTYgcm93X2NvdW50OworCQl1MTYgbW9yZV9mbGFnOworCQlpMm9fZ3JvdXBfaW5mbyBncm91cFsyNTZdOworCX0gKnJlc3VsdDsKKworCXJlc3VsdCA9IGttYWxsb2Moc2l6ZW9mKCpyZXN1bHQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0b2tlbiA9IGkyb19wYXJtX3RhYmxlX2dldChkLCBJMk9fUEFSQU1TX1RBQkxFX0dFVCwgMHhGMDAwLCAtMSwgTlVMTCwgMCwKKwkJCQkgICByZXN1bHQsIHNpemVvZigqcmVzdWx0KSk7CisKKwlpZiAodG9rZW4gPCAwKSB7CisJCWkyb19yZXBvcnRfcXVlcnlfc3RhdHVzKHNlcSwgdG9rZW4sICIweEYwMDAgUGFyYW1zIERlc2NyaXB0b3IiKTsKKwkJZ290byBvdXQ7CisJfQorCisJc2VxX3ByaW50ZihzZXEsCisJCSAgICIjICBHcm91cCAgIEZpZWxkQ291bnQgUm93Q291bnQgVHlwZSAgIEFkZCBEZWwgQ2xlYXJcbiIpOworCisJZm9yIChpID0gMDsgaSA8IHJlc3VsdC0+cm93X2NvdW50OyBpKyspIHsKKwkJc2VxX3ByaW50ZihzZXEsICIlLTNkIiwgaSk7CisJCXNlcV9wcmludGYoc2VxLCAiMHglMDRYICIsIHJlc3VsdC0+Z3JvdXBbaV0uZ3JvdXBfbnVtYmVyKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlMTBkICIsIHJlc3VsdC0+Z3JvdXBbaV0uZmllbGRfY291bnQpOworCQlzZXFfcHJpbnRmKHNlcSwgIiU4ZCAiLCByZXN1bHQtPmdyb3VwW2ldLnJvd19jb3VudCk7CisKKwkJcHJvcGVydGllcyA9IHJlc3VsdC0+Z3JvdXBbaV0ucHJvcGVydGllczsKKwkJaWYgKHByb3BlcnRpZXMgJiAweDEpCisJCQlzZXFfcHJpbnRmKHNlcSwgIlRhYmxlICAiKTsKKwkJZWxzZQorCQkJc2VxX3ByaW50ZihzZXEsICJTY2FsYXIgIik7CisJCWlmIChwcm9wZXJ0aWVzICYgMHgyKQorCQkJc2VxX3ByaW50ZihzZXEsICIgKyAiKTsKKwkJZWxzZQorCQkJc2VxX3ByaW50ZihzZXEsICIgLSAiKTsKKwkJaWYgKHByb3BlcnRpZXMgJiAweDQpCisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgKyAiKTsKKwkJZWxzZQorCQkJc2VxX3ByaW50ZihzZXEsICIgIC0gIik7CisJCWlmIChwcm9wZXJ0aWVzICYgMHg4KQorCQkJc2VxX3ByaW50ZihzZXEsICIgICsgIik7CisJCWVsc2UKKwkJCXNlcV9wcmludGYoc2VxLCAiICAtICIpOworCisJCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKKwl9CisKKwlpZiAocmVzdWx0LT5tb3JlX2ZsYWcpCisJCXNlcV9wcmludGYoc2VxLCAiVGhlcmUgaXMgbW9yZS4uLlxuIik7CisgICAgICBvdXQ6CisJa2ZyZWUocmVzdWx0KTsKKwlyZXR1cm4gMDsKK30KKworLyogR2VuZXJpYyBncm91cCBGMDAxaCAtIFBoeXNpY2FsIERldmljZSBUYWJsZSAodGFibGUpICovCitzdGF0aWMgaW50IGkyb19zZXFfc2hvd19waHlzX2RldmljZShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaTJvX2RldmljZSAqZCA9IChzdHJ1Y3QgaTJvX2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKKwlpbnQgdG9rZW47CisJaW50IGk7CisKKwlzdHJ1Y3QgeworCQl1MTYgcmVzdWx0X2NvdW50OworCQl1MTYgcGFkOworCQl1MTYgYmxvY2tfc2l6ZTsKKwkJdTggYmxvY2tfc3RhdHVzOworCQl1OCBlcnJvcl9pbmZvX3NpemU7CisJCXUxNiByb3dfY291bnQ7CisJCXUxNiBtb3JlX2ZsYWc7CisJCXUzMiBhZGFwdGVyX2lkWzY0XTsKKwl9IHJlc3VsdDsKKworCXRva2VuID0gaTJvX3Bhcm1fdGFibGVfZ2V0KGQsIEkyT19QQVJBTVNfVEFCTEVfR0VULCAweEYwMDEsIC0xLCBOVUxMLCAwLAorCQkJCSAgICZyZXN1bHQsIHNpemVvZihyZXN1bHQpKTsKKworCWlmICh0b2tlbiA8IDApIHsKKwkJaTJvX3JlcG9ydF9xdWVyeV9zdGF0dXMoc2VxLCB0b2tlbiwKKwkJCQkJIjB4RjAwMSBQaHlzaWNhbCBEZXZpY2UgVGFibGUiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHJlc3VsdC5yb3dfY291bnQpCisJCXNlcV9wcmludGYoc2VxLCAiIyAgQWRhcHRlcklkXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCByZXN1bHQucm93X2NvdW50OyBpKyspIHsKKwkJc2VxX3ByaW50ZihzZXEsICIlLTJkIiwgaSk7CisJCXNlcV9wcmludGYoc2VxLCAiJSM3eFxuIiwgcmVzdWx0LmFkYXB0ZXJfaWRbaV0pOworCX0KKworCWlmIChyZXN1bHQubW9yZV9mbGFnKQorCQlzZXFfcHJpbnRmKHNlcSwgIlRoZXJlIGlzIG1vcmUuLi5cbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEdlbmVyaWMgZ3JvdXAgRjAwMmggLSBDbGFpbWVkIFRhYmxlICh0YWJsZSkgKi8KK3N0YXRpYyBpbnQgaTJvX3NlcV9zaG93X2NsYWltZWQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmQgPSAoc3RydWN0IGkyb19kZXZpY2UgKilzZXEtPnByaXZhdGU7CisJaW50IHRva2VuOworCWludCBpOworCisJc3RydWN0IHsKKwkJdTE2IHJlc3VsdF9jb3VudDsKKwkJdTE2IHBhZDsKKwkJdTE2IGJsb2NrX3NpemU7CisJCXU4IGJsb2NrX3N0YXR1czsKKwkJdTggZXJyb3JfaW5mb19zaXplOworCQl1MTYgcm93X2NvdW50OworCQl1MTYgbW9yZV9mbGFnOworCQl1MTYgY2xhaW1lZF90aWRbNjRdOworCX0gcmVzdWx0OworCisJdG9rZW4gPSBpMm9fcGFybV90YWJsZV9nZXQoZCwgSTJPX1BBUkFNU19UQUJMRV9HRVQsIDB4RjAwMiwgLTEsIE5VTEwsIDAsCisJCQkJICAgJnJlc3VsdCwgc2l6ZW9mKHJlc3VsdCkpOworCisJaWYgKHRva2VuIDwgMCkgeworCQlpMm9fcmVwb3J0X3F1ZXJ5X3N0YXR1cyhzZXEsIHRva2VuLCAiMHhGMDAyIENsYWltZWQgVGFibGUiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHJlc3VsdC5yb3dfY291bnQpCisJCXNlcV9wcmludGYoc2VxLCAiIyAgQ2xhaW1lZFRpZFxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVzdWx0LnJvd19jb3VudDsgaSsrKSB7CisJCXNlcV9wcmludGYoc2VxLCAiJS0yZCIsIGkpOworCQlzZXFfcHJpbnRmKHNlcSwgIiUjN3hcbiIsIHJlc3VsdC5jbGFpbWVkX3RpZFtpXSk7CisJfQorCisJaWYgKHJlc3VsdC5tb3JlX2ZsYWcpCisJCXNlcV9wcmludGYoc2VxLCAiVGhlcmUgaXMgbW9yZS4uLlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyogR2VuZXJpYyBncm91cCBGMDAzaCAtIFVzZXIgVGFibGUgKHRhYmxlKSAqLworc3RhdGljIGludCBpMm9fc2VxX3Nob3dfdXNlcnMoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmQgPSAoc3RydWN0IGkyb19kZXZpY2UgKilzZXEtPnByaXZhdGU7CisJaW50IHRva2VuOworCWludCBpOworCisJdHlwZWRlZiBzdHJ1Y3QgX2kyb191c2VyX3RhYmxlIHsKKwkJdTE2IGluc3RhbmNlOworCQl1MTYgdXNlcl90aWQ7CisJCXU4IGNsYWltX3R5cGU7CisJCXU4IHJlc2VydmVkMTsKKwkJdTE2IHJlc2VydmVkMjsKKwl9IGkyb191c2VyX3RhYmxlOworCisJc3RydWN0IHsKKwkJdTE2IHJlc3VsdF9jb3VudDsKKwkJdTE2IHBhZDsKKwkJdTE2IGJsb2NrX3NpemU7CisJCXU4IGJsb2NrX3N0YXR1czsKKwkJdTggZXJyb3JfaW5mb19zaXplOworCQl1MTYgcm93X2NvdW50OworCQl1MTYgbW9yZV9mbGFnOworCQlpMm9fdXNlcl90YWJsZSB1c2VyWzY0XTsKKwl9ICpyZXN1bHQ7CisKKwlyZXN1bHQgPSBrbWFsbG9jKHNpemVvZigqcmVzdWx0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRU5PTUVNOworCisJdG9rZW4gPSBpMm9fcGFybV90YWJsZV9nZXQoZCwgSTJPX1BBUkFNU19UQUJMRV9HRVQsIDB4RjAwMywgLTEsIE5VTEwsIDAsCisJCQkJICAgcmVzdWx0LCBzaXplb2YoKnJlc3VsdCkpOworCisJaWYgKHRva2VuIDwgMCkgeworCQlpMm9fcmVwb3J0X3F1ZXJ5X3N0YXR1cyhzZXEsIHRva2VuLCAiMHhGMDAzIFVzZXIgVGFibGUiKTsKKwkJZ290byBvdXQ7CisJfQorCisJc2VxX3ByaW50ZihzZXEsICIjICBJbnN0YW5jZSBVc2VyVGlkIENsYWltVHlwZVxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVzdWx0LT5yb3dfY291bnQ7IGkrKykgeworCQlzZXFfcHJpbnRmKHNlcSwgIiUtM2QiLCBpKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlIzh4ICIsIHJlc3VsdC0+dXNlcltpXS5pbnN0YW5jZSk7CisJCXNlcV9wcmludGYoc2VxLCAiJSM3eCAiLCByZXN1bHQtPnVzZXJbaV0udXNlcl90aWQpOworCQlzZXFfcHJpbnRmKHNlcSwgIiUjOXhcbiIsIHJlc3VsdC0+dXNlcltpXS5jbGFpbV90eXBlKTsKKwl9CisKKwlpZiAocmVzdWx0LT5tb3JlX2ZsYWcpCisJCXNlcV9wcmludGYoc2VxLCAiVGhlcmUgaXMgbW9yZS4uLlxuIik7CisgICAgICBvdXQ6CisJa2ZyZWUocmVzdWx0KTsKKwlyZXR1cm4gMDsKK30KKworLyogR2VuZXJpYyBncm91cCBGMDA1aCAtIFByaXZhdGUgbWVzc2FnZSBleHRlbnNpb25zICh0YWJsZSkgKG9wdGlvbmFsKSAqLworc3RhdGljIGludCBpMm9fc2VxX3Nob3dfcHJpdl9tc2dzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBpMm9fZGV2aWNlICpkID0gKHN0cnVjdCBpMm9fZGV2aWNlICopc2VxLT5wcml2YXRlOworCWludCB0b2tlbjsKKwlpbnQgaTsKKworCXR5cGVkZWYgc3RydWN0IF9pMm9fcHJpdmF0ZSB7CisJCXUxNiBleHRfaW5zdGFuY2U7CisJCXUxNiBvcmdhbml6YXRpb25faWQ7CisJCXUxNiB4X2Z1bmN0aW9uX2NvZGU7CisJfSBpMm9fcHJpdmF0ZTsKKworCXN0cnVjdCB7CisJCXUxNiByZXN1bHRfY291bnQ7CisJCXUxNiBwYWQ7CisJCXUxNiBibG9ja19zaXplOworCQl1OCBibG9ja19zdGF0dXM7CisJCXU4IGVycm9yX2luZm9fc2l6ZTsKKwkJdTE2IHJvd19jb3VudDsKKwkJdTE2IG1vcmVfZmxhZzsKKwkJaTJvX3ByaXZhdGUgZXh0ZW5zaW9uWzY0XTsKKwl9IHJlc3VsdDsKKworCXRva2VuID0gaTJvX3Bhcm1fdGFibGVfZ2V0KGQsIEkyT19QQVJBTVNfVEFCTEVfR0VULCAweEYwMDAsIC0xLCBOVUxMLCAwLAorCQkJCSAgICZyZXN1bHQsIHNpemVvZihyZXN1bHQpKTsKKworCWlmICh0b2tlbiA8IDApIHsKKwkJaTJvX3JlcG9ydF9xdWVyeV9zdGF0dXMoc2VxLCB0b2tlbiwKKwkJCQkJIjB4RjAwNSBQcml2YXRlIE1lc3NhZ2UgRXh0ZW5zaW9ucyAob3B0aW9uYWwpIik7CisJCXJldHVybiAwOworCX0KKworCXNlcV9wcmludGYoc2VxLCAiSW5zdGFuY2UjICBPcmdJZCAgRnVuY3Rpb25Db2RlXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCByZXN1bHQucm93X2NvdW50OyBpKyspIHsKKwkJc2VxX3ByaW50ZihzZXEsICIlMCM5eCAiLCByZXN1bHQuZXh0ZW5zaW9uW2ldLmV4dF9pbnN0YW5jZSk7CisJCXNlcV9wcmludGYoc2VxLCAiJTAjNnggIiwgcmVzdWx0LmV4dGVuc2lvbltpXS5vcmdhbml6YXRpb25faWQpOworCQlzZXFfcHJpbnRmKHNlcSwgIiUwIzZ4IiwgcmVzdWx0LmV4dGVuc2lvbltpXS54X2Z1bmN0aW9uX2NvZGUpOworCisJCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKKwl9CisKKwlpZiAocmVzdWx0Lm1vcmVfZmxhZykKKwkJc2VxX3ByaW50ZihzZXEsICJUaGVyZSBpcyBtb3JlLi4uXG4iKTsKKworCXJldHVybiAwOworfQorCisvKiBHZW5lcmljIGdyb3VwIEYwMDZoIC0gQXV0aG9yaXplZCBVc2VyIFRhYmxlICh0YWJsZSkgKi8KK3N0YXRpYyBpbnQgaTJvX3NlcV9zaG93X2F1dGhvcml6ZWRfdXNlcnMoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmQgPSAoc3RydWN0IGkyb19kZXZpY2UgKilzZXEtPnByaXZhdGU7CisJaW50IHRva2VuOworCWludCBpOworCisJc3RydWN0IHsKKwkJdTE2IHJlc3VsdF9jb3VudDsKKwkJdTE2IHBhZDsKKwkJdTE2IGJsb2NrX3NpemU7CisJCXU4IGJsb2NrX3N0YXR1czsKKwkJdTggZXJyb3JfaW5mb19zaXplOworCQl1MTYgcm93X2NvdW50OworCQl1MTYgbW9yZV9mbGFnOworCQl1MzIgYWx0ZXJuYXRlX3RpZFs2NF07CisJfSByZXN1bHQ7CisKKwl0b2tlbiA9IGkyb19wYXJtX3RhYmxlX2dldChkLCBJMk9fUEFSQU1TX1RBQkxFX0dFVCwgMHhGMDA2LCAtMSwgTlVMTCwgMCwKKwkJCQkgICAmcmVzdWx0LCBzaXplb2YocmVzdWx0KSk7CisKKwlpZiAodG9rZW4gPCAwKSB7CisJCWkyb19yZXBvcnRfcXVlcnlfc3RhdHVzKHNlcSwgdG9rZW4sCisJCQkJCSIweEYwMDYgQXV0b2hvcml6ZWQgVXNlciBUYWJsZSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocmVzdWx0LnJvd19jb3VudCkKKwkJc2VxX3ByaW50ZihzZXEsICIjICBBbHRlcm5hdGVUaWRcbiIpOworCisJZm9yIChpID0gMDsgaSA8IHJlc3VsdC5yb3dfY291bnQ7IGkrKykgeworCQlzZXFfcHJpbnRmKHNlcSwgIiUtMmQiLCBpKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlIzd4ICIsIHJlc3VsdC5hbHRlcm5hdGVfdGlkW2ldKTsKKwl9CisKKwlpZiAocmVzdWx0Lm1vcmVfZmxhZykKKwkJc2VxX3ByaW50ZihzZXEsICJUaGVyZSBpcyBtb3JlLi4uXG4iKTsKKworCXJldHVybiAwOworfQorCisvKiBHZW5lcmljIGdyb3VwIEYxMDBoIC0gRGV2aWNlIElkZW50aXR5IChzY2FsYXIpICovCitzdGF0aWMgaW50IGkyb19zZXFfc2hvd19kZXZfaWRlbnRpdHkoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmQgPSAoc3RydWN0IGkyb19kZXZpY2UgKilzZXEtPnByaXZhdGU7CisJc3RhdGljIHUzMiB3b3JrMzJbMTI4XTsJLy8gYWxsb3cgZm9yICJzdHVmZiIgKyB1cCB0byAyNTYgYnl0ZSAobWF4KSBzZXJpYWwgbnVtYmVyCisJLy8gPT0gKGFsbG93KSA1MTJkIGJ5dGVzIChtYXgpCisJc3RhdGljIHUxNiAqd29yazE2ID0gKHUxNiAqKSB3b3JrMzI7CisJaW50IHRva2VuOworCisJdG9rZW4gPSBpMm9fcGFybV9maWVsZF9nZXQoZCwgMHhGMTAwLCAtMSwgJndvcmszMiwgc2l6ZW9mKHdvcmszMikpOworCisJaWYgKHRva2VuIDwgMCkgeworCQlpMm9fcmVwb3J0X3F1ZXJ5X3N0YXR1cyhzZXEsIHRva2VuLCAiMHhGMTAwIERldmljZSBJZGVudGl0eSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZXFfcHJpbnRmKHNlcSwgIkRldmljZSBDbGFzcyAgOiAlc1xuIiwgaTJvX2dldF9jbGFzc19uYW1lKHdvcmsxNlswXSkpOworCXNlcV9wcmludGYoc2VxLCAiT3duZXIgVElEICAgICA6ICUwIzV4XG4iLCB3b3JrMTZbMl0pOworCXNlcV9wcmludGYoc2VxLCAiUGFyZW50IFRJRCAgICA6ICUwIzV4XG4iLCB3b3JrMTZbM10pOworCXNlcV9wcmludGYoc2VxLCAiVmVuZG9yIGluZm8gICA6ICVzXG4iLAorCQkgICBjaHRvc3RyKCh1OCAqKSAod29yazMyICsgMiksIDE2KSk7CisJc2VxX3ByaW50ZihzZXEsICJQcm9kdWN0IGluZm8gIDogJXNcbiIsCisJCSAgIGNodG9zdHIoKHU4ICopICh3b3JrMzIgKyA2KSwgMTYpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkRlc2NyaXB0aW9uICAgOiAlc1xuIiwKKwkJICAgY2h0b3N0cigodTggKikgKHdvcmszMiArIDEwKSwgMTYpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlByb2R1Y3QgcmV2LiAgOiAlc1xuIiwKKwkJICAgY2h0b3N0cigodTggKikgKHdvcmszMiArIDE0KSwgOCkpOworCisJc2VxX3ByaW50ZihzZXEsICJTZXJpYWwgbnVtYmVyIDogIik7CisJcHJpbnRfc2VyaWFsX251bWJlcihzZXEsICh1OCAqKSAod29yazMyICsgMTYpLAorCQkJICAgIC8qIGFsbG93IGZvciBTTkxlbiBwbHVzCisJCQkgICAgICogcG9zc2libGUgdHJhaWxpbmcgJ1wwJworCQkJICAgICAqLworCQkJICAgIHNpemVvZih3b3JrMzIpIC0gKDE2ICogc2l6ZW9mKHUzMikpIC0gMik7CisJc2VxX3ByaW50ZihzZXEsICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTJvX3NlcV9zaG93X2Rldl9uYW1lKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBpMm9fZGV2aWNlICpkID0gKHN0cnVjdCBpMm9fZGV2aWNlICopc2VxLT5wcml2YXRlOworCisJc2VxX3ByaW50ZihzZXEsICIlc1xuIiwgZC0+ZGV2aWNlLmJ1c19pZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogR2VuZXJpYyBncm91cCBGMTAxaCAtIERETSBJZGVudGl0eSAoc2NhbGFyKSAqLworc3RhdGljIGludCBpMm9fc2VxX3Nob3dfZGRtX2lkZW50aXR5KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBpMm9fZGV2aWNlICpkID0gKHN0cnVjdCBpMm9fZGV2aWNlICopc2VxLT5wcml2YXRlOworCWludCB0b2tlbjsKKworCXN0cnVjdCB7CisJCXUxNiBkZG1fdGlkOworCQl1OCBtb2R1bGVfbmFtZVsyNF07CisJCXU4IG1vZHVsZV9yZXZbOF07CisJCXU4IHNuX2Zvcm1hdDsKKwkJdTggc2VyaWFsX251bWJlclsxMl07CisJCXU4IHBhZFsyNTZdOwkvLyBhbGxvdyB1cCB0byAyNTYgYnl0ZSAobWF4KSBzZXJpYWwgbnVtYmVyCisJfSByZXN1bHQ7CisKKwl0b2tlbiA9IGkyb19wYXJtX2ZpZWxkX2dldChkLCAweEYxMDEsIC0xLCAmcmVzdWx0LCBzaXplb2YocmVzdWx0KSk7CisKKwlpZiAodG9rZW4gPCAwKSB7CisJCWkyb19yZXBvcnRfcXVlcnlfc3RhdHVzKHNlcSwgdG9rZW4sICIweEYxMDEgRERNIElkZW50aXR5Iik7CisJCXJldHVybiAwOworCX0KKworCXNlcV9wcmludGYoc2VxLCAiUmVnaXN0ZXJpbmcgRERNIFRJRCA6IDB4JTAzeFxuIiwgcmVzdWx0LmRkbV90aWQpOworCXNlcV9wcmludGYoc2VxLCAiTW9kdWxlIG5hbWUgICAgICAgICA6ICVzXG4iLAorCQkgICBjaHRvc3RyKHJlc3VsdC5tb2R1bGVfbmFtZSwgMjQpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIk1vZHVsZSByZXZpc2lvbiAgICAgOiAlc1xuIiwKKwkJICAgY2h0b3N0cihyZXN1bHQubW9kdWxlX3JldiwgOCkpOworCisJc2VxX3ByaW50ZihzZXEsICJTZXJpYWwgbnVtYmVyICAgICAgIDogIik7CisJcHJpbnRfc2VyaWFsX251bWJlcihzZXEsIHJlc3VsdC5zZXJpYWxfbnVtYmVyLCBzaXplb2YocmVzdWx0KSAtIDM2KTsKKwkvKiBhbGxvdyBmb3IgU05MZW4gcGx1cyBwb3NzaWJsZSB0cmFpbGluZyAnXDAnICovCisKKwlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyogR2VuZXJpYyBncm91cCBGMTAyaCAtIFVzZXIgSW5mb3JtYXRpb24gKHNjYWxhcikgKi8KK3N0YXRpYyBpbnQgaTJvX3NlcV9zaG93X3VpbmZvKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBpMm9fZGV2aWNlICpkID0gKHN0cnVjdCBpMm9fZGV2aWNlICopc2VxLT5wcml2YXRlOworCWludCB0b2tlbjsKKworCXN0cnVjdCB7CisJCXU4IGRldmljZV9uYW1lWzY0XTsKKwkJdTggc2VydmljZV9uYW1lWzY0XTsKKwkJdTggcGh5c2ljYWxfbG9jYXRpb25bNjRdOworCQl1OCBpbnN0YW5jZV9udW1iZXJbNF07CisJfSByZXN1bHQ7CisKKwl0b2tlbiA9IGkyb19wYXJtX2ZpZWxkX2dldChkLCAweEYxMDIsIC0xLCAmcmVzdWx0LCBzaXplb2YocmVzdWx0KSk7CisKKwlpZiAodG9rZW4gPCAwKSB7CisJCWkyb19yZXBvcnRfcXVlcnlfc3RhdHVzKHNlcSwgdG9rZW4sICIweEYxMDIgVXNlciBJbmZvcm1hdGlvbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZXFfcHJpbnRmKHNlcSwgIkRldmljZSBuYW1lICAgICA6ICVzXG4iLAorCQkgICBjaHRvc3RyKHJlc3VsdC5kZXZpY2VfbmFtZSwgNjQpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlNlcnZpY2UgbmFtZSAgICA6ICVzXG4iLAorCQkgICBjaHRvc3RyKHJlc3VsdC5zZXJ2aWNlX25hbWUsIDY0KSk7CisJc2VxX3ByaW50ZihzZXEsICJQaHlzaWNhbCBuYW1lICAgOiAlc1xuIiwKKwkJICAgY2h0b3N0cihyZXN1bHQucGh5c2ljYWxfbG9jYXRpb24sIDY0KSk7CisJc2VxX3ByaW50ZihzZXEsICJJbnN0YW5jZSBudW1iZXIgOiAlc1xuIiwKKwkJICAgY2h0b3N0cihyZXN1bHQuaW5zdGFuY2VfbnVtYmVyLCA0KSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogR2VuZXJpYyBncm91cCBGMTAzaCAtIFNHTCBPcGVyYXRpbmcgTGltaXRzIChzY2FsYXIpICovCitzdGF0aWMgaW50IGkyb19zZXFfc2hvd19zZ2xfbGltaXRzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBpMm9fZGV2aWNlICpkID0gKHN0cnVjdCBpMm9fZGV2aWNlICopc2VxLT5wcml2YXRlOworCXN0YXRpYyB1MzIgd29yazMyWzEyXTsKKwlzdGF0aWMgdTE2ICp3b3JrMTYgPSAodTE2ICopIHdvcmszMjsKKwlzdGF0aWMgdTggKndvcms4ID0gKHU4ICopIHdvcmszMjsKKwlpbnQgdG9rZW47CisKKwl0b2tlbiA9IGkyb19wYXJtX2ZpZWxkX2dldChkLCAweEYxMDMsIC0xLCAmd29yazMyLCBzaXplb2Yod29yazMyKSk7CisKKwlpZiAodG9rZW4gPCAwKSB7CisJCWkyb19yZXBvcnRfcXVlcnlfc3RhdHVzKHNlcSwgdG9rZW4sCisJCQkJCSIweEYxMDMgU0dMIE9wZXJhdGluZyBMaW1pdHMiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2VxX3ByaW50ZihzZXEsICJTR0wgY2hhaW4gc2l6ZSAgICAgICAgOiAlZFxuIiwgd29yazMyWzBdKTsKKwlzZXFfcHJpbnRmKHNlcSwgIk1heCBTR0wgY2hhaW4gc2l6ZSAgICA6ICVkXG4iLCB3b3JrMzJbMV0pOworCXNlcV9wcmludGYoc2VxLCAiU0dMIGNoYWluIHNpemUgdGFyZ2V0IDogJWRcbiIsIHdvcmszMlsyXSk7CisJc2VxX3ByaW50ZihzZXEsICJTR0wgZnJhZyBjb3VudCAgICAgICAgOiAlZFxuIiwgd29yazE2WzZdKTsKKwlzZXFfcHJpbnRmKHNlcSwgIk1heCBTR0wgZnJhZyBjb3VudCAgICA6ICVkXG4iLCB3b3JrMTZbN10pOworCXNlcV9wcmludGYoc2VxLCAiU0dMIGZyYWcgY291bnQgdGFyZ2V0IDogJWRcbiIsIHdvcmsxNls4XSk7CisKKy8qIEZJWE1FCisJaWYgKGQtPmkyb3ZlcnNpb24gPT0gMHgwMikKKwl7CisqLworCXNlcV9wcmludGYoc2VxLCAiU0dMIGRhdGEgYWxpZ25tZW50ICAgIDogJWRcbiIsIHdvcmsxNls4XSk7CisJc2VxX3ByaW50ZihzZXEsICJTR0wgYWRkciBsaW1pdCAgICAgICAgOiAlZFxuIiwgd29yazhbMjBdKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlNHTCBhZGRyIHNpemVzIHN1cHBvcnRlZCA6ICIpOworCWlmICh3b3JrOFsyMV0gJiAweDAxKQorCQlzZXFfcHJpbnRmKHNlcSwgIjMyIGJpdCAiKTsKKwlpZiAod29yazhbMjFdICYgMHgwMikKKwkJc2VxX3ByaW50ZihzZXEsICI2NCBiaXQgIik7CisJaWYgKHdvcms4WzIxXSAmIDB4MDQpCisJCXNlcV9wcmludGYoc2VxLCAiOTYgYml0ICIpOworCWlmICh3b3JrOFsyMV0gJiAweDA4KQorCQlzZXFfcHJpbnRmKHNlcSwgIjEyOCBiaXQgIik7CisJc2VxX3ByaW50ZihzZXEsICJcbiIpOworLyoKKwl9CisqLworCisJcmV0dXJuIDA7Cit9CisKKy8qIEdlbmVyaWMgZ3JvdXAgRjIwMGggLSBTZW5zb3JzIChzY2FsYXIpICovCitzdGF0aWMgaW50IGkyb19zZXFfc2hvd19zZW5zb3JzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBpMm9fZGV2aWNlICpkID0gKHN0cnVjdCBpMm9fZGV2aWNlICopc2VxLT5wcml2YXRlOworCWludCB0b2tlbjsKKworCXN0cnVjdCB7CisJCXUxNiBzZW5zb3JfaW5zdGFuY2U7CisJCXU4IGNvbXBvbmVudDsKKwkJdTE2IGNvbXBvbmVudF9pbnN0YW5jZTsKKwkJdTggc2Vuc29yX2NsYXNzOworCQl1OCBzZW5zb3JfdHlwZTsKKwkJdTggc2NhbGluZ19leHBvbmVudDsKKwkJdTMyIGFjdHVhbF9yZWFkaW5nOworCQl1MzIgbWluaW11bV9yZWFkaW5nOworCQl1MzIgbG93Mmxvd2NhdF90cmVzaG9sZDsKKwkJdTMyIGxvd2NhdDJsb3dfdHJlc2hvbGQ7CisJCXUzMiBsb3d3YXJuMmxvd190cmVzaG9sZDsKKwkJdTMyIGxvdzJsb3d3YXJuX3RyZXNob2xkOworCQl1MzIgbm9ybTJsb3d3YXJuX3RyZXNob2xkOworCQl1MzIgbG93d2FybjJub3JtX3RyZXNob2xkOworCQl1MzIgbm9taW5hbF9yZWFkaW5nOworCQl1MzIgaGl3YXJuMm5vcm1fdHJlc2hvbGQ7CisJCXUzMiBub3JtMmhpd2Fybl90cmVzaG9sZDsKKwkJdTMyIGhpZ2gyaGl3YXJuX3RyZXNob2xkOworCQl1MzIgaGl3YXJuMmhpZ2hfdHJlc2hvbGQ7CisJCXUzMiBoaWNhdDJoaWdoX3RyZXNob2xkOworCQl1MzIgaGkyaGljYXRfdHJlc2hvbGQ7CisJCXUzMiBtYXhpbXVtX3JlYWRpbmc7CisJCXU4IHNlbnNvcl9zdGF0ZTsKKwkJdTE2IGV2ZW50X2VuYWJsZTsKKwl9IHJlc3VsdDsKKworCXRva2VuID0gaTJvX3Bhcm1fZmllbGRfZ2V0KGQsIDB4RjIwMCwgLTEsICZyZXN1bHQsIHNpemVvZihyZXN1bHQpKTsKKworCWlmICh0b2tlbiA8IDApIHsKKwkJaTJvX3JlcG9ydF9xdWVyeV9zdGF0dXMoc2VxLCB0b2tlbiwKKwkJCQkJIjB4RjIwMCBTZW5zb3JzIChvcHRpb25hbCkiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2VxX3ByaW50ZihzZXEsICJTZW5zb3IgaW5zdGFuY2UgICAgICAgOiAlZFxuIiwgcmVzdWx0LnNlbnNvcl9pbnN0YW5jZSk7CisKKwlzZXFfcHJpbnRmKHNlcSwgIkNvbXBvbmVudCAgICAgICAgICAgICA6ICVkID0gIiwgcmVzdWx0LmNvbXBvbmVudCk7CisJc3dpdGNoIChyZXN1bHQuY29tcG9uZW50KSB7CisJY2FzZSAwOgorCQlzZXFfcHJpbnRmKHNlcSwgIk90aGVyIik7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc2VxX3ByaW50ZihzZXEsICJQbGFuYXIgbG9naWMgQm9hcmQiKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzZXFfcHJpbnRmKHNlcSwgIkNQVSIpOworCQlicmVhazsKKwljYXNlIDM6CisJCXNlcV9wcmludGYoc2VxLCAiQ2hhc3NpcyIpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXNlcV9wcmludGYoc2VxLCAiUG93ZXIgU3VwcGx5Iik7CisJCWJyZWFrOworCWNhc2UgNToKKwkJc2VxX3ByaW50ZihzZXEsICJTdG9yYWdlIik7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJc2VxX3ByaW50ZihzZXEsICJFeHRlcm5hbCIpOworCQlicmVhazsKKwl9CisJc2VxX3ByaW50ZihzZXEsICJcbiIpOworCisJc2VxX3ByaW50ZihzZXEsICJDb21wb25lbnQgaW5zdGFuY2UgICAgOiAlZFxuIiwKKwkJICAgcmVzdWx0LmNvbXBvbmVudF9pbnN0YW5jZSk7CisJc2VxX3ByaW50ZihzZXEsICJTZW5zb3IgY2xhc3MgICAgICAgICAgOiAlc1xuIiwKKwkJICAgcmVzdWx0LnNlbnNvcl9jbGFzcyA/ICJBbmFsb2ciIDogIkRpZ2l0YWwiKTsKKworCXNlcV9wcmludGYoc2VxLCAiU2Vuc29yIHR5cGUgICAgICAgICAgIDogJWQgPSAiLCByZXN1bHQuc2Vuc29yX3R5cGUpOworCXN3aXRjaCAocmVzdWx0LnNlbnNvcl90eXBlKSB7CisJY2FzZSAwOgorCQlzZXFfcHJpbnRmKHNlcSwgIk90aGVyXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzZXFfcHJpbnRmKHNlcSwgIlRoZXJtYWxcbiIpOworCQlicmVhazsKKwljYXNlIDI6CisJCXNlcV9wcmludGYoc2VxLCAiREMgdm9sdGFnZSAoREMgdm9sdHMpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzZXFfcHJpbnRmKHNlcSwgIkFDIHZvbHRhZ2UgKEFDIHZvbHRzKVxuIik7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJc2VxX3ByaW50ZihzZXEsICJEQyBjdXJyZW50IChEQyBhbXBzKVxuIik7CisJCWJyZWFrOworCWNhc2UgNToKKwkJc2VxX3ByaW50ZihzZXEsICJBQyBjdXJyZW50IChBQyB2b2x0cylcbiIpOworCQlicmVhazsKKwljYXNlIDY6CisJCXNlcV9wcmludGYoc2VxLCAiRG9vciBvcGVuXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlzZXFfcHJpbnRmKHNlcSwgIkZhbiBvcGVyYXRpb25hbFxuIik7CisJCWJyZWFrOworCX0KKworCXNlcV9wcmludGYoc2VxLCAiU2NhbGluZyBleHBvbmVudCAgICAgIDogJWRcbiIsCisJCSAgIHJlc3VsdC5zY2FsaW5nX2V4cG9uZW50KTsKKwlzZXFfcHJpbnRmKHNlcSwgIkFjdHVhbCByZWFkaW5nICAgICAgICA6ICVkXG4iLCByZXN1bHQuYWN0dWFsX3JlYWRpbmcpOworCXNlcV9wcmludGYoc2VxLCAiTWluaW11bSByZWFkaW5nICAgICAgIDogJWRcbiIsIHJlc3VsdC5taW5pbXVtX3JlYWRpbmcpOworCXNlcV9wcmludGYoc2VxLCAiTG93Mkxvd0NhdCB0cmVzaG9sZCAgIDogJWRcbiIsCisJCSAgIHJlc3VsdC5sb3cybG93Y2F0X3RyZXNob2xkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkxvd0NhdDJMb3cgdHJlc2hvbGQgICA6ICVkXG4iLAorCQkgICByZXN1bHQubG93Y2F0Mmxvd190cmVzaG9sZCk7CisJc2VxX3ByaW50ZihzZXEsICJMb3dXYXJuMkxvdyB0cmVzaG9sZCAgOiAlZFxuIiwKKwkJICAgcmVzdWx0Lmxvd3dhcm4ybG93X3RyZXNob2xkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkxvdzJMb3dXYXJuIHRyZXNob2xkICA6ICVkXG4iLAorCQkgICByZXN1bHQubG93Mmxvd3dhcm5fdHJlc2hvbGQpOworCXNlcV9wcmludGYoc2VxLCAiTm9ybTJMb3dXYXJuIHRyZXNob2xkIDogJWRcbiIsCisJCSAgIHJlc3VsdC5ub3JtMmxvd3dhcm5fdHJlc2hvbGQpOworCXNlcV9wcmludGYoc2VxLCAiTG93V2FybjJOb3JtIHRyZXNob2xkIDogJWRcbiIsCisJCSAgIHJlc3VsdC5sb3d3YXJuMm5vcm1fdHJlc2hvbGQpOworCXNlcV9wcmludGYoc2VxLCAiTm9taW5hbCByZWFkaW5nICAgICAgIDogJWRcbiIsIHJlc3VsdC5ub21pbmFsX3JlYWRpbmcpOworCXNlcV9wcmludGYoc2VxLCAiSGlXYXJuMk5vcm0gdHJlc2hvbGQgIDogJWRcbiIsCisJCSAgIHJlc3VsdC5oaXdhcm4ybm9ybV90cmVzaG9sZCk7CisJc2VxX3ByaW50ZihzZXEsICJOb3JtMkhpV2FybiB0cmVzaG9sZCAgOiAlZFxuIiwKKwkJICAgcmVzdWx0Lm5vcm0yaGl3YXJuX3RyZXNob2xkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkhpZ2gySGlXYXJuIHRyZXNob2xkICA6ICVkXG4iLAorCQkgICByZXN1bHQuaGlnaDJoaXdhcm5fdHJlc2hvbGQpOworCXNlcV9wcmludGYoc2VxLCAiSGlXYXJuMkhpZ2ggdHJlc2hvbGQgIDogJWRcbiIsCisJCSAgIHJlc3VsdC5oaXdhcm4yaGlnaF90cmVzaG9sZCk7CisJc2VxX3ByaW50ZihzZXEsICJIaUNhdDJIaWdoIHRyZXNob2xkICAgOiAlZFxuIiwKKwkJICAgcmVzdWx0LmhpY2F0MmhpZ2hfdHJlc2hvbGQpOworCXNlcV9wcmludGYoc2VxLCAiSGlnaDJIaUNhdCB0cmVzaG9sZCAgIDogJWRcbiIsCisJCSAgIHJlc3VsdC5oaTJoaWNhdF90cmVzaG9sZCk7CisJc2VxX3ByaW50ZihzZXEsICJNYXhpbXVtIHJlYWRpbmcgICAgICAgOiAlZFxuIiwgcmVzdWx0Lm1heGltdW1fcmVhZGluZyk7CisKKwlzZXFfcHJpbnRmKHNlcSwgIlNlbnNvciBzdGF0ZSAgICAgICAgICA6ICVkID0gIiwgcmVzdWx0LnNlbnNvcl9zdGF0ZSk7CisJc3dpdGNoIChyZXN1bHQuc2Vuc29yX3N0YXRlKSB7CisJY2FzZSAwOgorCQlzZXFfcHJpbnRmKHNlcSwgIk5vcm1hbFxuIik7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc2VxX3ByaW50ZihzZXEsICJBYm5vcm1hbFxuIik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJc2VxX3ByaW50ZihzZXEsICJVbmtub3duXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzZXFfcHJpbnRmKHNlcSwgIkxvdyBDYXRhc3Ryb3BoaWMgKExvQ2F0KVxuIik7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJc2VxX3ByaW50ZihzZXEsICJMb3cgKExvdylcbiIpOworCQlicmVhazsKKwljYXNlIDU6CisJCXNlcV9wcmludGYoc2VxLCAiTG93IFdhcm5pbmcgKExvV2FybilcbiIpOworCQlicmVhazsKKwljYXNlIDY6CisJCXNlcV9wcmludGYoc2VxLCAiSGlnaCBXYXJuaW5nIChIaVdhcm4pXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlzZXFfcHJpbnRmKHNlcSwgIkhpZ2ggKEhpZ2gpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlzZXFfcHJpbnRmKHNlcSwgIkhpZ2ggQ2F0YXN0cm9waGljIChIaUNhdClcbiIpOworCQlicmVhazsKKwl9CisKKwlzZXFfcHJpbnRmKHNlcSwgIkV2ZW50X2VuYWJsZSA6IDB4JTAyWFxuIiwgcmVzdWx0LmV2ZW50X2VuYWJsZSk7CisJc2VxX3ByaW50ZihzZXEsICIgICAgWyVzXSBPcGVyYXRpb25hbCBzdGF0ZSBjaGFuZ2UuIFxuIiwKKwkJICAgKHJlc3VsdC5ldmVudF9lbmFibGUgJiAweDAxKSA/ICIrIiA6ICItIik7CisJc2VxX3ByaW50ZihzZXEsICIgICAgWyVzXSBMb3cgY2F0YXN0cm9waGljLiBcbiIsCisJCSAgIChyZXN1bHQuZXZlbnRfZW5hYmxlICYgMHgwMikgPyAiKyIgOiAiLSIpOworCXNlcV9wcmludGYoc2VxLCAiICAgIFslc10gTG93IHJlYWRpbmcuIFxuIiwKKwkJICAgKHJlc3VsdC5ldmVudF9lbmFibGUgJiAweDA0KSA/ICIrIiA6ICItIik7CisJc2VxX3ByaW50ZihzZXEsICIgICAgWyVzXSBMb3cgd2FybmluZy4gXG4iLAorCQkgICAocmVzdWx0LmV2ZW50X2VuYWJsZSAmIDB4MDgpID8gIisiIDogIi0iKTsKKwlzZXFfcHJpbnRmKHNlcSwKKwkJICAgIiAgICBbJXNdIENoYW5nZSBiYWNrIHRvIG5vcm1hbCBmcm9tIG91dCBvZiByYW5nZSBzdGF0ZS4gXG4iLAorCQkgICAocmVzdWx0LmV2ZW50X2VuYWJsZSAmIDB4MTApID8gIisiIDogIi0iKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgICBbJXNdIEhpZ2ggd2FybmluZy4gXG4iLAorCQkgICAocmVzdWx0LmV2ZW50X2VuYWJsZSAmIDB4MjApID8gIisiIDogIi0iKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgICBbJXNdIEhpZ2ggcmVhZGluZy4gXG4iLAorCQkgICAocmVzdWx0LmV2ZW50X2VuYWJsZSAmIDB4NDApID8gIisiIDogIi0iKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgICBbJXNdIEhpZ2ggY2F0YXN0cm9waGljLiBcbiIsCisJCSAgIChyZXN1bHQuZXZlbnRfZW5hYmxlICYgMHg4MCkgPyAiKyIgOiAiLSIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX2hydChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaTJvX3NlcV9zaG93X2hydCwgUERFKGlub2RlKS0+ZGF0YSk7Cit9OworCitzdGF0aWMgaW50IGkyb19zZXFfb3Blbl9sY3Qoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGkyb19zZXFfc2hvd19sY3QsIFBERShpbm9kZSktPmRhdGEpOworfTsKKworc3RhdGljIGludCBpMm9fc2VxX29wZW5fc3RhdHVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpMm9fc2VxX3Nob3dfc3RhdHVzLCBQREUoaW5vZGUpLT5kYXRhKTsKK307CisKK3N0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX2h3KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpMm9fc2VxX3Nob3dfaHcsIFBERShpbm9kZSktPmRhdGEpOworfTsKKworc3RhdGljIGludCBpMm9fc2VxX29wZW5fZGRtX3RhYmxlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpMm9fc2VxX3Nob3dfZGRtX3RhYmxlLCBQREUoaW5vZGUpLT5kYXRhKTsKK307CisKK3N0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX2RyaXZlcl9zdG9yZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaTJvX3NlcV9zaG93X2RyaXZlcl9zdG9yZSwgUERFKGlub2RlKS0+ZGF0YSk7Cit9OworCitzdGF0aWMgaW50IGkyb19zZXFfb3Blbl9kcml2ZXJzX3N0b3JlZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaTJvX3NlcV9zaG93X2RyaXZlcnNfc3RvcmVkLCBQREUoaW5vZGUpLT5kYXRhKTsKK307CisKK3N0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX2dyb3VwcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaTJvX3NlcV9zaG93X2dyb3VwcywgUERFKGlub2RlKS0+ZGF0YSk7Cit9OworCitzdGF0aWMgaW50IGkyb19zZXFfb3Blbl9waHlzX2RldmljZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaTJvX3NlcV9zaG93X3BoeXNfZGV2aWNlLCBQREUoaW5vZGUpLT5kYXRhKTsKK307CisKK3N0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX2NsYWltZWQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGkyb19zZXFfc2hvd19jbGFpbWVkLCBQREUoaW5vZGUpLT5kYXRhKTsKK307CisKK3N0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX3VzZXJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpMm9fc2VxX3Nob3dfdXNlcnMsIFBERShpbm9kZSktPmRhdGEpOworfTsKKworc3RhdGljIGludCBpMm9fc2VxX29wZW5fcHJpdl9tc2dzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpMm9fc2VxX3Nob3dfcHJpdl9tc2dzLCBQREUoaW5vZGUpLT5kYXRhKTsKK307CisKK3N0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX2F1dGhvcml6ZWRfdXNlcnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGkyb19zZXFfc2hvd19hdXRob3JpemVkX3VzZXJzLAorCQkJICAgUERFKGlub2RlKS0+ZGF0YSk7Cit9OworCitzdGF0aWMgaW50IGkyb19zZXFfb3Blbl9kZXZfaWRlbnRpdHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGkyb19zZXFfc2hvd19kZXZfaWRlbnRpdHksIFBERShpbm9kZSktPmRhdGEpOworfTsKKworc3RhdGljIGludCBpMm9fc2VxX29wZW5fZGRtX2lkZW50aXR5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpMm9fc2VxX3Nob3dfZGRtX2lkZW50aXR5LCBQREUoaW5vZGUpLT5kYXRhKTsKK307CisKK3N0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX3VpbmZvKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpMm9fc2VxX3Nob3dfdWluZm8sIFBERShpbm9kZSktPmRhdGEpOworfTsKKworc3RhdGljIGludCBpMm9fc2VxX29wZW5fc2dsX2xpbWl0cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaTJvX3NlcV9zaG93X3NnbF9saW1pdHMsIFBERShpbm9kZSktPmRhdGEpOworfTsKKworc3RhdGljIGludCBpMm9fc2VxX29wZW5fc2Vuc29ycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaTJvX3NlcV9zaG93X3NlbnNvcnMsIFBERShpbm9kZSktPmRhdGEpOworfTsKKworc3RhdGljIGludCBpMm9fc2VxX29wZW5fZGV2X25hbWUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGkyb19zZXFfc2hvd19kZXZfbmFtZSwgUERFKGlub2RlKS0+ZGF0YSk7Cit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMm9fc2VxX2ZvcHNfbGN0ID0geworCS5vcGVuID0gaTJvX3NlcV9vcGVuX2xjdCwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc19ocnQgPSB7CisJLm9wZW4gPSBpMm9fc2VxX29wZW5faHJ0LAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTJvX3NlcV9mb3BzX3N0YXR1cyA9IHsKKwkub3BlbiA9IGkyb19zZXFfb3Blbl9zdGF0dXMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMm9fc2VxX2ZvcHNfaHcgPSB7CisJLm9wZW4gPSBpMm9fc2VxX29wZW5faHcsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMm9fc2VxX2ZvcHNfZGRtX3RhYmxlID0geworCS5vcGVuID0gaTJvX3NlcV9vcGVuX2RkbV90YWJsZSwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc19kcml2ZXJfc3RvcmUgPSB7CisJLm9wZW4gPSBpMm9fc2VxX29wZW5fZHJpdmVyX3N0b3JlLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTJvX3NlcV9mb3BzX2RyaXZlcnNfc3RvcmVkID0geworCS5vcGVuID0gaTJvX3NlcV9vcGVuX2RyaXZlcnNfc3RvcmVkLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTJvX3NlcV9mb3BzX2dyb3VwcyA9IHsKKwkub3BlbiA9IGkyb19zZXFfb3Blbl9ncm91cHMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMm9fc2VxX2ZvcHNfcGh5c19kZXZpY2UgPSB7CisJLm9wZW4gPSBpMm9fc2VxX29wZW5fcGh5c19kZXZpY2UsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMm9fc2VxX2ZvcHNfY2xhaW1lZCA9IHsKKwkub3BlbiA9IGkyb19zZXFfb3Blbl9jbGFpbWVkLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTJvX3NlcV9mb3BzX3VzZXJzID0geworCS5vcGVuID0gaTJvX3NlcV9vcGVuX3VzZXJzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTJvX3NlcV9mb3BzX3ByaXZfbXNncyA9IHsKKwkub3BlbiA9IGkyb19zZXFfb3Blbl9wcml2X21zZ3MsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMm9fc2VxX2ZvcHNfYXV0aG9yaXplZF91c2VycyA9IHsKKwkub3BlbiA9IGkyb19zZXFfb3Blbl9hdXRob3JpemVkX3VzZXJzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTJvX3NlcV9mb3BzX2Rldl9uYW1lID0geworCS5vcGVuID0gaTJvX3NlcV9vcGVuX2Rldl9uYW1lLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTJvX3NlcV9mb3BzX2Rldl9pZGVudGl0eSA9IHsKKwkub3BlbiA9IGkyb19zZXFfb3Blbl9kZXZfaWRlbnRpdHksCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMm9fc2VxX2ZvcHNfZGRtX2lkZW50aXR5ID0geworCS5vcGVuID0gaTJvX3NlcV9vcGVuX2RkbV9pZGVudGl0eSwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc191aW5mbyA9IHsKKwkub3BlbiA9IGkyb19zZXFfb3Blbl91aW5mbywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc19zZ2xfbGltaXRzID0geworCS5vcGVuID0gaTJvX3NlcV9vcGVuX3NnbF9saW1pdHMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMm9fc2VxX2ZvcHNfc2Vuc29ycyA9IHsKKwkub3BlbiA9IGkyb19zZXFfb3Blbl9zZW5zb3JzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworLyoKKyAqIElPUCBzcGVjaWZpYyBlbnRyaWVzLi4ud3JpdGUgZmllbGQganVzdCBpbiBjYXNlIHNvbWVvbmUKKyAqIGV2ZXIgd2FudHMgb25lLgorICovCitzdGF0aWMgaTJvX3Byb2NfZW50cnkgaTJvX3Byb2NfZ2VuZXJpY19pb3BfZW50cmllc1tdID0geworCXsiaHJ0IiwgU19JRlJFRyB8IFNfSVJVR08sICZpMm9fc2VxX2ZvcHNfaHJ0fSwKKwl7ImxjdCIsIFNfSUZSRUcgfCBTX0lSVUdPLCAmaTJvX3NlcV9mb3BzX2xjdH0sCisJeyJzdGF0dXMiLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc19zdGF0dXN9LAorCXsiaHciLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc19od30sCisJeyJkZG1fdGFibGUiLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc19kZG1fdGFibGV9LAorCXsiZHJpdmVyX3N0b3JlIiwgU19JRlJFRyB8IFNfSVJVR08sICZpMm9fc2VxX2ZvcHNfZHJpdmVyX3N0b3JlfSwKKwl7ImRyaXZlcnNfc3RvcmVkIiwgU19JRlJFRyB8IFNfSVJVR08sICZpMm9fc2VxX2ZvcHNfZHJpdmVyc19zdG9yZWR9LAorCXtOVUxMLCAwLCBOVUxMfQorfTsKKworLyoKKyAqIERldmljZSBzcGVjaWZpYyBlbnRyaWVzCisgKi8KK3N0YXRpYyBpMm9fcHJvY19lbnRyeSBnZW5lcmljX2Rldl9lbnRyaWVzW10gPSB7CisJeyJncm91cHMiLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc19ncm91cHN9LAorCXsicGh5c19kZXYiLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc19waHlzX2RldmljZX0sCisJeyJjbGFpbWVkIiwgU19JRlJFRyB8IFNfSVJVR08sICZpMm9fc2VxX2ZvcHNfY2xhaW1lZH0sCisJeyJ1c2VycyIsIFNfSUZSRUcgfCBTX0lSVUdPLCAmaTJvX3NlcV9mb3BzX3VzZXJzfSwKKwl7InByaXZfbXNncyIsIFNfSUZSRUcgfCBTX0lSVUdPLCAmaTJvX3NlcV9mb3BzX3ByaXZfbXNnc30sCisJeyJhdXRob3JpemVkX3VzZXJzIiwgU19JRlJFRyB8IFNfSVJVR08sICZpMm9fc2VxX2ZvcHNfYXV0aG9yaXplZF91c2Vyc30sCisJeyJkZXZfaWRlbnRpdHkiLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc19kZXZfaWRlbnRpdHl9LAorCXsiZGRtX2lkZW50aXR5IiwgU19JRlJFRyB8IFNfSVJVR08sICZpMm9fc2VxX2ZvcHNfZGRtX2lkZW50aXR5fSwKKwl7InVzZXJfaW5mbyIsIFNfSUZSRUcgfCBTX0lSVUdPLCAmaTJvX3NlcV9mb3BzX3VpbmZvfSwKKwl7InNnbF9saW1pdHMiLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc19zZ2xfbGltaXRzfSwKKwl7InNlbnNvcnMiLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc19zZW5zb3JzfSwKKwl7TlVMTCwgMCwgTlVMTH0KK307CisKKy8qCisgKiAgU3RvcmFnZSB1bml0IHNwZWNpZmljIGVudHJpZXMgKFNDU0kgUGVyaXBoLCBCUykgd2l0aCBkZXZpY2UgbmFtZXMKKyAqLworc3RhdGljIGkyb19wcm9jX2VudHJ5IHJic19kZXZfZW50cmllc1tdID0geworCXsiZGV2X25hbWUiLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc19kZXZfbmFtZX0sCisJe05VTEwsIDAsIE5VTEx9Cit9OworCisvKioKKyAqCWkyb19wcm9jX2NyZWF0ZV9lbnRyaWVzIC0gQ3JlYXRlcyBwcm9jIGRpciBlbnRyaWVzCisgKglAZGlyOiBwcm9jIGRpciBlbnRyeSB1bmRlciB3aGljaCB0aGUgZW50cmllcyBzaG91bGQgYmUgcGxhY2VkCisgKglAaTJvX3BlOiBwb2ludGVyIHRvIHRoZSBlbnRyaWVzIHdoaWNoIHNob3VsZCBiZSBhZGRlZAorICoJQGRhdGE6IHBvaW50ZXIgdG8gSTJPIGNvbnRyb2xsZXIgb3IgZGV2aWNlCisgKgorICoJQ3JlYXRlIHByb2MgZGlyIGVudHJpZXMgZm9yIGEgSTJPIGNvbnRyb2xsZXIgb3IgSTJPIGRldmljZS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgaTJvX3Byb2NfY3JlYXRlX2VudHJpZXMoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkaXIsCisJCQkJICAgaTJvX3Byb2NfZW50cnkgKiBpMm9fcGUsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICp0bXA7CisKKwl3aGlsZSAoaTJvX3BlLT5uYW1lKSB7CisJCXRtcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KGkyb19wZS0+bmFtZSwgaTJvX3BlLT5tb2RlLCBkaXIpOworCQlpZiAoIXRtcCkKKwkJCXJldHVybiAtMTsKKworCQl0bXAtPmRhdGEgPSBkYXRhOworCQl0bXAtPnByb2NfZm9wcyA9IGkyb19wZS0+Zm9wczsKKworCQlpMm9fcGUrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglpMm9fcHJvY19zdWJkaXJfcmVtb3ZlIC0gUmVtb3ZlIGNoaWxkIGVudHJpZXMgZnJvbSBhIHByb2MgZW50cnkKKyAqCUBkaXI6IHByb2MgZGlyIGVudHJ5IGZyb20gd2hpY2ggdGhlIGNoaWxkcyBzaG91bGQgYmUgcmVtb3ZlZAorICoKKyAqCUl0ZXJhdGUgb3ZlciBlYWNoIGkybyBwcm9jIGVudHJ5IHVuZGVyIGRpciBhbmQgcmVtb3ZlIGl0LiBJZiB0aGUgY2hpbGQKKyAqCWFsc28gaGFzIGVudHJpZXMsIHJlbW92ZSB0aGVtIHRvby4KKyAqLworc3RhdGljIHZvaWQgaTJvX3Byb2Nfc3ViZGlyX3JlbW92ZShzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpcikKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBlLCAqdG1wOworCXBlID0gZGlyLT5zdWJkaXI7CisJd2hpbGUgKHBlKSB7CisJCXRtcCA9IHBlLT5uZXh0OworCQlpMm9fcHJvY19zdWJkaXJfcmVtb3ZlKHBlKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkocGUtPm5hbWUsIGRpcik7CisJCXBlID0gdG1wOworCX0KK307CisKKy8qKgorICoJaTJvX3Byb2NfZGV2aWNlX2FkZCAtIEFkZCBhbiBJMk8gZGV2aWNlIHRvIHRoZSBwcm9jIGRpcgorICoJQGRpcjogcHJvYyBkaXIgZW50cnkgdG8gd2hpY2ggdGhlIGRldmljZSBzaG91bGQgYmUgYWRkZWQKKyAqCUBkZXY6IEkyTyBkZXZpY2Ugd2hpY2ggc2hvdWxkIGJlIGFkZGVkCisgKgorICoJQWRkIGFuIEkyTyBkZXZpY2UgdG8gdGhlIHByb2MgZGlyIGVudHJ5IGRpciBhbmQgY3JlYXRlIHRoZSBlbnRyaWVzIGZvcgorICoJdGhlIGRldmljZSBkZXBlbmRpbmcgb24gdGhlIGNsYXNzIG9mIHRoZSBJMk8gZGV2aWNlLgorICovCitzdGF0aWMgdm9pZCBpMm9fcHJvY19kZXZpY2VfYWRkKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGlyLAorCQkJCXN0cnVjdCBpMm9fZGV2aWNlICpkZXYpCit7CisJY2hhciBidWZmWzEwXTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRldmRpcjsKKwlpMm9fcHJvY19lbnRyeSAqaTJvX3BlID0gTlVMTDsKKworCXNwcmludGYoYnVmZiwgIiUwM3giLCBkZXYtPmxjdF9kYXRhLnRpZCk7CisKKwlvc21fZGVidWcoImFkZGluZyBkZXZpY2UgL3Byb2MvaTJvLyVzLyVzXG4iLCBkZXYtPmlvcC0+bmFtZSwgYnVmZik7CisKKwlkZXZkaXIgPSBwcm9jX21rZGlyKGJ1ZmYsIGRpcik7CisJaWYgKCFkZXZkaXIpIHsKKwkJb3NtX3dhcm4oIkNvdWxkIG5vdCBhbGxvY2F0ZSBwcm9jZGlyIVxuIik7CisJCXJldHVybjsKKwl9CisKKwlkZXZkaXItPmRhdGEgPSBkZXY7CisKKwlpMm9fcHJvY19jcmVhdGVfZW50cmllcyhkZXZkaXIsIGdlbmVyaWNfZGV2X2VudHJpZXMsIGRldik7CisKKwkvKiBJbmZvcm0gY29yZSB0aGF0IHdlIHdhbnQgdXBkYXRlcyBhYm91dCB0aGlzIGRldmljZSdzIHN0YXR1cyAqLworCXN3aXRjaCAoZGV2LT5sY3RfZGF0YS5jbGFzc19pZCkgeworCWNhc2UgSTJPX0NMQVNTX1NDU0lfUEVSSVBIRVJBTDoKKwljYXNlIEkyT19DTEFTU19SQU5ET01fQkxPQ0tfU1RPUkFHRToKKwkJaTJvX3BlID0gcmJzX2Rldl9lbnRyaWVzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJaWYgKGkyb19wZSkKKwkJaTJvX3Byb2NfY3JlYXRlX2VudHJpZXMoZGV2ZGlyLCBpMm9fcGUsIGRldik7Cit9CisKKy8qKgorICoJaTJvX3Byb2NfaW9wX2FkZCAtIEFkZCBhbiBJMk8gY29udHJvbGxlciB0byB0aGUgaTJvIHByb2MgdHJlZQorICoJQGRpcjogcGFyZW50IHByb2MgZGlyIGVudHJ5CisgKglAYzogSTJPIGNvbnRyb2xsZXIgd2hpY2ggc2hvdWxkIGJlIGFkZGVkCisgKgorICoJQWRkIHRoZSBlbnRyaWVzIHRvIHRoZSBwYXJlbnQgcHJvYyBkaXIgZW50cnkuIEFsc28gZWFjaCBkZXZpY2UgaXMgYWRkZWQKKyAqCXRvIHRoZSBjb250cm9sbGVycyBwcm9jIGRpciBlbnRyeS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgaTJvX3Byb2NfaW9wX2FkZChzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpciwKKwkJCSAgICBzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICppb3BkaXI7CisJc3RydWN0IGkyb19kZXZpY2UgKmRldjsKKworCW9zbV9kZWJ1ZygiYWRkaW5nIElPUCAvcHJvYy9pMm8vJXNcbiIsIGMtPm5hbWUpOworCisJaW9wZGlyID0gcHJvY19ta2RpcihjLT5uYW1lLCBkaXIpOworCWlmICghaW9wZGlyKQorCQlyZXR1cm4gLTE7CisKKwlpb3BkaXItPmRhdGEgPSBjOworCisJaTJvX3Byb2NfY3JlYXRlX2VudHJpZXMoaW9wZGlyLCBpMm9fcHJvY19nZW5lcmljX2lvcF9lbnRyaWVzLCBjKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYy0+ZGV2aWNlcywgbGlzdCkKKwkgICAgaTJvX3Byb2NfZGV2aWNlX2FkZChpb3BkaXIsIGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglpMm9fcHJvY19pb3BfcmVtb3ZlIC0gUmVtb3ZlcyBhbiBJMk8gY29udHJvbGxlciBmcm9tIHRoZSBpMm8gcHJvYyB0cmVlCisgKglAZGlyOiBwYXJlbnQgcHJvYyBkaXIgZW50cnkKKyAqCUBjOiBJMk8gY29udHJvbGxlciB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZAorICoKKyAqCUl0ZXJhdGUgb3ZlciBlYWNoIGkybyBwcm9jIGVudHJ5IGFuZCBzZWFyY2ggY29udHJvbGxlciBjLiBJZiBpdCBpcyBmb3VuZAorICoJcmVtb3ZlIGl0IGZyb20gdGhlIHRyZWUuCisgKi8KK3N0YXRpYyB2b2lkIGkyb19wcm9jX2lvcF9yZW1vdmUoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkaXIsCisJCQkJc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGUsICp0bXA7CisKKwlwZSA9IGRpci0+c3ViZGlyOworCXdoaWxlIChwZSkgeworCQl0bXAgPSBwZS0+bmV4dDsKKwkJaWYgKHBlLT5kYXRhID09IGMpIHsKKwkJCWkyb19wcm9jX3N1YmRpcl9yZW1vdmUocGUpOworCQkJcmVtb3ZlX3Byb2NfZW50cnkocGUtPm5hbWUsIGRpcik7CisJCX0KKwkJb3NtX2RlYnVnKCJyZW1vdmluZyBJT1AgL3Byb2MvaTJvLyVzXG4iLCBjLT5uYW1lKTsKKwkJcGUgPSB0bXA7CisJfQorfQorCisvKioKKyAqCWkyb19wcm9jX2ZzX2NyZWF0ZSAtIENyZWF0ZSB0aGUgaTJvIHByb2MgZnMuCisgKgorICoJSXRlcmF0ZSBvdmVyIGVhY2ggSTJPIGNvbnRyb2xsZXIgYW5kIGNyZWF0ZSB0aGUgZW50cmllcyBmb3IgaXQuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IF9faW5pdCBpMm9fcHJvY19mc19jcmVhdGUodm9pZCkKK3sKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmM7CisKKwlpMm9fcHJvY19kaXJfcm9vdCA9IHByb2NfbWtkaXIoImkybyIsIE5VTEwpOworCWlmICghaTJvX3Byb2NfZGlyX3Jvb3QpCisJCXJldHVybiAtMTsKKworCWkyb19wcm9jX2Rpcl9yb290LT5vd25lciA9IFRISVNfTU9EVUxFOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmaTJvX2NvbnRyb2xsZXJzLCBsaXN0KQorCSAgICBpMm9fcHJvY19pb3BfYWRkKGkyb19wcm9jX2Rpcl9yb290LCBjKTsKKworCXJldHVybiAwOworfTsKKworLyoqCisgKglpMm9fcHJvY19mc19kZXN0cm95IC0gQ2xlYW51cCB0aGUgYWxsIGkybyBwcm9jIGVudHJpZXMKKyAqCisgKglJdGVyYXRlIG92ZXIgZWFjaCBJMk8gY29udHJvbGxlciBhbmQgcmVtb3ZlIHRoZSBlbnRyaWVzIGZvciBpdC4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgX19leGl0IGkyb19wcm9jX2ZzX2Rlc3Ryb3kodm9pZCkKK3sKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmM7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZpMm9fY29udHJvbGxlcnMsIGxpc3QpCisJICAgIGkyb19wcm9jX2lvcF9yZW1vdmUoaTJvX3Byb2NfZGlyX3Jvb3QsIGMpOworCisJcmVtb3ZlX3Byb2NfZW50cnkoImkybyIsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9OworCisvKioKKyAqCWkyb19wcm9jX2luaXQgLSBJbml0IGZ1bmN0aW9uIGZvciBwcm9jZnMKKyAqCisgKglSZWdpc3RlcnMgUHJvYyBPU00gYW5kIGNyZWF0ZXMgcHJvY2ZzIGVudHJpZXMuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IF9faW5pdCBpMm9fcHJvY19pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJcHJpbnRrKEtFUk5fSU5GTyBPU01fREVTQ1JJUFRJT04gIiB2IiBPU01fVkVSU0lPTiAiXG4iKTsKKworCXJjID0gaTJvX2RyaXZlcl9yZWdpc3RlcigmaTJvX3Byb2NfZHJpdmVyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gaTJvX3Byb2NfZnNfY3JlYXRlKCk7CisJaWYgKHJjKSB7CisJCWkyb19kcml2ZXJfdW5yZWdpc3RlcigmaTJvX3Byb2NfZHJpdmVyKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfTsKKworLyoqCisgKglpMm9fcHJvY19leGl0IC0gRXhpdCBmdW5jdGlvbiBmb3IgcHJvY2ZzCisgKgorICoJVW5yZWdpc3RlcnMgUHJvYyBPU00gYW5kIHJlbW92ZXMgcHJvY2ZzIGVudHJpZXMuCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBpMm9fcHJvY19leGl0KHZvaWQpCit7CisJaTJvX2RyaXZlcl91bnJlZ2lzdGVyKCZpMm9fcHJvY19kcml2ZXIpOworCWkyb19wcm9jX2ZzX2Rlc3Ryb3koKTsKK307CisKK01PRFVMRV9BVVRIT1IoIkRlZXBhayBTYXhlbmEiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTihPU01fREVTQ1JJUFRJT04pOworTU9EVUxFX1ZFUlNJT04oT1NNX1ZFUlNJT04pOworCittb2R1bGVfaW5pdChpMm9fcHJvY19pbml0KTsKK21vZHVsZV9leGl0KGkyb19wcm9jX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fc2NzaS5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fc2NzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZjU4NzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19zY3NpLmMKQEAgLTAsMCArMSw4MzAgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogRm9yIHRoZSBhdm9pZGFuY2Ugb2YgZG91YnQgdGhlICJwcmVmZXJyZWQgZm9ybSIgb2YgdGhpcyBjb2RlIGlzIG9uZSB3aGljaAorICogaXMgaW4gYW4gb3BlbiBub24gcGF0ZW50IGVuY3VtYmVyZWQgZm9ybWF0LiBXaGVyZSBjcnlwdG9ncmFwaGljIGtleSBzaWduaW5nCisgKiBmb3JtcyBwYXJ0IG9mIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIGV4ZWN1dGFibGUgdGhlIGluZm9ybWF0aW9uCisgKiBpbmNsdWRpbmcga2V5cyBuZWVkZWQgdG8gZ2VuZXJhdGUgYW4gZXF1aXZhbGVudGx5IGZ1bmN0aW9uYWwgZXhlY3V0YWJsZQorICogYXJlIGRlZW1lZCB0byBiZSBwYXJ0IG9mIHRoZSBzb3VyY2UgY29kZS4KKyAqCisgKiAgQ29tcGxpY2F0aW9ucyBmb3IgSTJPIHNjc2kKKyAqCisgKglvCUVhY2ggKGJ1cyxsdW4pIGlzIGEgbG9naWNhbCBkZXZpY2UgaW4gSTJPLiBXZSBrZWVwIGEgbWFwCisgKgkJdGFibGUuIFdlIHNwb29mIGZhaWxlZCBzZWxlY3Rpb24gZm9yIHVubWFwcGVkIHVuaXRzCisgKglvCVJlcXVlc3Qgc2Vuc2UgYnVmZmVycyBjYW4gY29tZSBiYWNrIGZvciBmcmVlLgorICoJbwlTY2F0dGVyIGdhdGhlciBpcyBhIGJpdCBkeW5hbWljLiBXZSBoYXZlIHRvIGludmVzdGlnYXRlIGF0CisgKgkJc2V0dXAgdGltZS4KKyAqCW8JU29tZSBvZiBvdXIgcmVzb3VyY2VzIGFyZSBkeW5hbWljYWxseSBzaGFyZWQuIFRoZSBpMm8gY29yZQorICoJCW5lZWRzIGEgbWVzc2FnZSByZXNlcnZhdGlvbiBwcm90b2NvbCB0byBhdm9pZCBzd2FwIHYgbmV0CisgKgkJZGVhZGxvY2tpbmcuIFdlIG5lZWQgdG8gYmFjayBvZmYgcXVldWUgcmVxdWVzdHMuCisgKgorICoJSW4gZ2VuZXJhbCB0aGUgZmlybXdhcmUgd2FudHMgdG8gaGVscC4gV2hlcmUgaXRzIGhlbHAgaXNuJ3QgcGVyZm9ybWFuY2UKKyAqCXVzZWZ1bCB3ZSBqdXN0IGlnbm9yZSB0aGUgYWlkLiBJdHMgbm90IHdvcnRoIHRoZSBjb2RlIGluIHRydXRoLgorICoKKyAqIEZpeGVzL2FkZGl0aW9uczoKKyAqCVN0ZXZlIFJhbHN0b246CisgKgkJU2NhdHRlciBnYXRoZXIgbm93IHdvcmtzCisgKglNYXJrdXMgTGlkZWwgPE1hcmt1cy5MaWRlbEBzaGFkb3djb25uZWN0LmNvbT46CisgKgkJTWlub3IgZml4ZXMgZm9yIDIuNi4KKyAqCisgKiBUbyBEbzoKKyAqCTY0Yml0IGNsZWFudXBzCisgKglGaXggdGhlIHJlc291cmNlIG1hbmFnZW1lbnQgcHJvYmxlbXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9pMm8uaD4KKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKworI2RlZmluZSBPU01fTkFNRQkic2NzaS1vc20iCisjZGVmaW5lIE9TTV9WRVJTSU9OCSIkUmV2JCIKKyNkZWZpbmUgT1NNX0RFU0NSSVBUSU9OCSJJMk8gU0NTSSBQZXJpcGhlcmFsIE9TTSIKKworc3RhdGljIHN0cnVjdCBpMm9fZHJpdmVyIGkyb19zY3NpX2RyaXZlcjsKKworc3RhdGljIGludCBpMm9fc2NzaV9tYXhfaWQgPSAxNjsKK3N0YXRpYyBpbnQgaTJvX3Njc2lfbWF4X2x1biA9IDg7CisKK3N0cnVjdCBpMm9fc2NzaV9ob3N0IHsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpX2hvc3Q7CS8qIHBvaW50ZXIgdG8gdGhlIFNDU0kgaG9zdCAqLworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqaW9wOwkvKiBwb2ludGVyIHRvIHRoZSBJMk8gY29udHJvbGxlciAqLworCXN0cnVjdCBpMm9fZGV2aWNlICpjaGFubmVsWzBdOwkvKiBjaGFubmVsLT5pMm9fZGV2IG1hcHBpbmcgdGFibGUgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGkyb19zY3NpX2hvc3RfdGVtcGxhdGU7CisKKyNkZWZpbmUgSTJPX1NDU0lfQ0FOX1FVRVVFCTQKKworLyogU0NTSSBPU00gY2xhc3MgaGFuZGxpbmcgZGVmaW5pdGlvbiAqLworc3RhdGljIHN0cnVjdCBpMm9fY2xhc3NfaWQgaTJvX3Njc2lfY2xhc3NfaWRbXSA9IHsKKwl7STJPX0NMQVNTX1NDU0lfUEVSSVBIRVJBTH0sCisJe0kyT19DTEFTU19FTkR9Cit9OworCitzdGF0aWMgc3RydWN0IGkyb19zY3NpX2hvc3QgKmkyb19zY3NpX2hvc3RfYWxsb2Moc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXN0cnVjdCBpMm9fc2NzaV9ob3N0ICppMm9fc2hvc3Q7CisJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXY7CisJc3RydWN0IFNjc2lfSG9zdCAqc2NzaV9ob3N0OworCWludCBtYXhfY2hhbm5lbCA9IDA7CisJdTggdHlwZTsKKwlpbnQgaTsKKwlzaXplX3Qgc2l6ZTsKKwlpMm9fc3RhdHVzX2Jsb2NrICpzYjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaTJvX2RldiwgJmMtPmRldmljZXMsIGxpc3QpCisJICAgIGlmIChpMm9fZGV2LT5sY3RfZGF0YS5jbGFzc19pZCA9PSBJMk9fQ0xBU1NfQlVTX0FEQVBURVJfUE9SVCkgeworCQlpZiAoaTJvX3Bhcm1fZmllbGRfZ2V0KGkyb19kZXYsIDB4MDAwMCwgMCwgJnR5cGUsIDEpIHx8ICh0eXBlID09IDEpKQkvKiBTQ1NJIGJ1cyAqLworCQkJbWF4X2NoYW5uZWwrKzsKKwl9CisKKwlpZiAoIW1heF9jaGFubmVsKSB7CisJCW9zbV93YXJuKCJubyBjaGFubmVscyBmb3VuZCBvbiAlc1xuIiwgYy0+bmFtZSk7CisJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOworCX0KKworCXNpemUgPSBtYXhfY2hhbm5lbCAqIHNpemVvZihzdHJ1Y3QgaTJvX2RldmljZSAqKQorCSAgICArIHNpemVvZihzdHJ1Y3QgaTJvX3Njc2lfaG9zdCk7CisKKwlzY3NpX2hvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJmkyb19zY3NpX2hvc3RfdGVtcGxhdGUsIHNpemUpOworCWlmICghc2NzaV9ob3N0KSB7CisJCW9zbV93YXJuKCJDb3VsZCBub3QgYWxsb2NhdGUgU0NTSSBob3N0XG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJc2NzaV9ob3N0LT5tYXhfY2hhbm5lbCA9IG1heF9jaGFubmVsIC0gMTsKKwlzY3NpX2hvc3QtPm1heF9pZCA9IGkyb19zY3NpX21heF9pZDsKKwlzY3NpX2hvc3QtPm1heF9sdW4gPSBpMm9fc2NzaV9tYXhfbHVuOworCXNjc2lfaG9zdC0+dGhpc19pZCA9IGMtPnVuaXQ7CisKKwlzYiA9IGMtPnN0YXR1c19ibG9jay52aXJ0OworCisJc2NzaV9ob3N0LT5zZ190YWJsZXNpemUgPSAoc2ItPmluYm91bmRfZnJhbWVfc2l6ZSAtCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBpMm9fbWVzc2FnZSkgLyA0IC0gNikgLyAyOworCisJaTJvX3Nob3N0ID0gKHN0cnVjdCBpMm9fc2NzaV9ob3N0ICopc2NzaV9ob3N0LT5ob3N0ZGF0YTsKKwlpMm9fc2hvc3QtPnNjc2lfaG9zdCA9IHNjc2lfaG9zdDsKKwlpMm9fc2hvc3QtPmlvcCA9IGM7CisKKwlpID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGkyb19kZXYsICZjLT5kZXZpY2VzLCBsaXN0KQorCSAgICBpZiAoaTJvX2Rldi0+bGN0X2RhdGEuY2xhc3NfaWQgPT0gSTJPX0NMQVNTX0JVU19BREFQVEVSX1BPUlQpIHsKKwkJaWYgKGkyb19wYXJtX2ZpZWxkX2dldChpMm9fZGV2LCAweDAwMDAsIDAsICZ0eXBlLCAxKSB8fCAodHlwZSA9PSAxKSkJLyogb25seSBTQ1NJIGJ1cyAqLworCQkJaTJvX3Nob3N0LT5jaGFubmVsW2krK10gPSBpMm9fZGV2OworCisJCWlmIChpID49IG1heF9jaGFubmVsKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGkyb19zaG9zdDsKK307CisKKy8qKgorICoJaTJvX3Njc2lfZ2V0X2hvc3QgLSBHZXQgYW4gSTJPIFNDU0kgaG9zdAorICoJQGM6IEkyTyBjb250cm9sbGVyIHRvIGZvciB3aGljaCB0byBnZXQgdGhlIFNDU0kgaG9zdAorICoKKyAqCUlmIHRoZSBJMk8gY29udHJvbGxlciBhbHJlYWR5IGV4aXN0cyBhcyBTQ1NJIGhvc3QsIHRoZSBTQ1NJIGhvc3QKKyAqCWlzIHJldHVybmVkLCBvdGhlcndpc2UgdGhlIEkyTyBjb250cm9sbGVyIGlzIGFkZGVkIHRvIHRoZSBTQ1NJCisgKgljb3JlLgorICoKKyAqCVJldHVybnMgcG9pbnRlciB0byB0aGUgSTJPIFNDU0kgaG9zdCBvbiBzdWNjZXNzIG9yIE5VTEwgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIHN0cnVjdCBpMm9fc2NzaV9ob3N0ICppMm9fc2NzaV9nZXRfaG9zdChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCit7CisJcmV0dXJuIGMtPmRyaXZlcl9kYXRhW2kyb19zY3NpX2RyaXZlci5jb250ZXh0XTsKK307CisKKy8qKgorICoJaTJvX3Njc2lfcmVtb3ZlIC0gUmVtb3ZlIEkyTyBkZXZpY2UgZnJvbSBTQ1NJIGNvcmUKKyAqCUBkZXY6IGRldmljZSB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZAorICoKKyAqCVJlbW92ZXMgdGhlIEkyTyBkZXZpY2UgZnJvbSB0aGUgU0NTSSBjb3JlIGFnYWluLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IGkyb19zY3NpX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXYgPSB0b19pMm9fZGV2aWNlKGRldik7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjID0gaTJvX2Rldi0+aW9wOworCXN0cnVjdCBpMm9fc2NzaV9ob3N0ICppMm9fc2hvc3Q7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpX2RldjsKKworCWkyb19zaG9zdCA9IGkyb19zY3NpX2dldF9ob3N0KGMpOworCisJc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHNjc2lfZGV2LCBpMm9fc2hvc3QtPnNjc2lfaG9zdCkKKwkgICAgaWYgKHNjc2lfZGV2LT5ob3N0ZGF0YSA9PSBpMm9fZGV2KSB7CisJCXNjc2lfcmVtb3ZlX2RldmljZShzY3NpX2Rldik7CisJCXNjc2lfZGV2aWNlX3B1dChzY3NpX2Rldik7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfTsKKworLyoqCisgKglpMm9fc2NzaV9wcm9iZSAtIHZlcmlmeSBpZiBkZXYgaXMgYSBJMk8gU0NTSSBkZXZpY2UgYW5kIGluc3RhbGwgaXQKKyAqCUBkZXY6IGRldmljZSB0byB2ZXJpZnkgaWYgaXQgaXMgYSBJMk8gU0NTSSBkZXZpY2UKKyAqCisgKglSZXRyaWV2ZSBjaGFubmVsLCBpZCBhbmQgbHVuIGZvciBJMk8gZGV2aWNlLiBJZiBldmVydGhpbmcgZ29lcyB3ZWxsCisgKglyZWdpc3RlciB0aGUgSTJPIGRldmljZSBhcyBTQ1NJIGRldmljZSBvbiB0aGUgSTJPIFNDU0kgY29udHJvbGxlci4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgaTJvX3Njc2lfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2ID0gdG9faTJvX2RldmljZShkZXYpOworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYyA9IGkyb19kZXYtPmlvcDsKKwlzdHJ1Y3QgaTJvX3Njc2lfaG9zdCAqaTJvX3Nob3N0OworCXN0cnVjdCBTY3NpX0hvc3QgKnNjc2lfaG9zdDsKKwlzdHJ1Y3QgaTJvX2RldmljZSAqcGFyZW50OworCXN0cnVjdCBzY3NpX2RldmljZSAqc2NzaV9kZXY7CisJdTMyIGlkOworCXU2NCBsdW47CisJaW50IGNoYW5uZWwgPSAtMTsKKwlpbnQgaTsKKworCWkyb19zaG9zdCA9IGkyb19zY3NpX2dldF9ob3N0KGMpOworCWlmICghaTJvX3Nob3N0KQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNjc2lfaG9zdCA9IGkyb19zaG9zdC0+c2NzaV9ob3N0OworCisJaWYgKGkyb19wYXJtX2ZpZWxkX2dldChpMm9fZGV2LCAwLCAzLCAmaWQsIDQpIDwgMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoaWQgPj0gc2NzaV9ob3N0LT5tYXhfaWQpIHsKKwkJb3NtX3dhcm4oIlNDU0kgZGV2aWNlIGlkICglZCkgPj0gbWF4X2lkIG9mIEkyTyBob3N0ICglZCkiLCBpZCwKKwkJCSBzY3NpX2hvc3QtPm1heF9pZCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChpMm9fcGFybV9maWVsZF9nZXQoaTJvX2RldiwgMCwgNCwgJmx1biwgOCkgPCAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAobHVuID49IHNjc2lfaG9zdC0+bWF4X2x1bikgeworCQlvc21fd2FybigiU0NTSSBkZXZpY2UgaWQgKCVkKSA+PSBtYXhfbHVuIG9mIEkyTyBob3N0ICglZCkiLAorCQkJICh1bnNpZ25lZCBpbnQpbHVuLCBzY3NpX2hvc3QtPm1heF9sdW4pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlwYXJlbnQgPSBpMm9faW9wX2ZpbmRfZGV2aWNlKGMsIGkyb19kZXYtPmxjdF9kYXRhLnBhcmVudF90aWQpOworCWlmICghcGFyZW50KSB7CisJCW9zbV93YXJuKCJjYW4gbm90IGZpbmQgcGFyZW50IG9mIGRldmljZSAlMDN4XG4iLAorCQkJIGkyb19kZXYtPmxjdF9kYXRhLnRpZCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWZvciAoaSA9IDA7IGkgPD0gaTJvX3Nob3N0LT5zY3NpX2hvc3QtPm1heF9jaGFubmVsOyBpKyspCisJCWlmIChpMm9fc2hvc3QtPmNoYW5uZWxbaV0gPT0gcGFyZW50KQorCQkJY2hhbm5lbCA9IGk7CisKKwlpZiAoY2hhbm5lbCA9PSAtMSkgeworCQlvc21fd2FybigiY2FuIG5vdCBmaW5kIGNoYW5uZWwgb2YgZGV2aWNlICUwM3hcbiIsCisJCQkgaTJvX2Rldi0+bGN0X2RhdGEudGlkKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJc2NzaV9kZXYgPQorCSAgICBfX3Njc2lfYWRkX2RldmljZShpMm9fc2hvc3QtPnNjc2lfaG9zdCwgY2hhbm5lbCwgaWQsIGx1biwgaTJvX2Rldik7CisKKwlpZiAoIXNjc2lfZGV2KSB7CisJCW9zbV93YXJuKCJjYW4gbm90IGFkZCBTQ1NJIGRldmljZSAlMDN4XG4iLAorCQkJIGkyb19kZXYtPmxjdF9kYXRhLnRpZCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCW9zbV9kZWJ1ZygiYWRkZWQgbmV3IFNDU0kgZGV2aWNlICUwM3ggKGNhbm5lbDogJWQsIGlkOiAlZCwgbHVuOiAlZClcbiIsCisJCSAgaTJvX2Rldi0+bGN0X2RhdGEudGlkLCBjaGFubmVsLCBpZCwgKHVuc2lnbmVkIGludClsdW4pOworCisJcmV0dXJuIDA7Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqaTJvX3Njc2lfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpTQ2hvc3QpCit7CisJc3RydWN0IGkyb19zY3NpX2hvc3QgKmhvc3RkYXRhOworCWhvc3RkYXRhID0gKHN0cnVjdCBpMm9fc2NzaV9ob3N0ICopU0Nob3N0LT5ob3N0ZGF0YTsKKwlyZXR1cm4gaG9zdGRhdGEtPmlvcC0+bmFtZTsKK30KKworLyoqCisgKglpMm9fc2NzaV9yZXBseSAtIFNDU0kgT1NNIG1lc3NhZ2UgcmVwbHkgaGFuZGxlcgorICoJQGM6IGNvbnRyb2xsZXIgaXNzdWluZyB0aGUgcmVwbHkKKyAqCUBtOiBtZXNzYWdlIGlkIGZvciBmbHVzaGluZworICoJQG1zZzogdGhlIG1lc3NhZ2UgZnJvbSB0aGUgY29udHJvbGxlcgorICoKKyAqCVByb2Nlc3MgcmVwbHkgbWVzc2FnZXMgKGludGVycnVwdHMgaW4gbm9ybWFsIHNjc2kgY29udHJvbGxlciB0aGluaykuCisgKglXZSBjYW4gZ2V0IGEgdmFyaWV0eSBvZiBtZXNzYWdlcyB0byBwcm9jZXNzLiBUaGUgbm9ybWFsIHBhdGggaXMKKyAqCXNjc2kgY29tbWFuZCBjb21wbGV0aW9ucy4gV2UgbXVzdCBhbHNvIGRlYWwgd2l0aCBJT1AgZmFpbHVyZXMsCisgKgl0aGUgcmVwbHkgdG8gYSBidXMgcmVzZXQgYW5kIHRoZSByZXBseSB0byBhIExVTiBxdWVyeS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgaWYgdGhlIHJlcGx5IHNob3VsZCBub3QgYmUgZmx1c2hlZCBvciA+IDAKKyAqCW9uIHN1Y2Nlc3MgYW5kIGlmIHRoZSByZXBseSBzaG91bGQgYmUgZmx1c2hlZC4gUmV0dXJucyBuZWdhdGl2ZSBlcnJvcgorICoJY29kZSBvbiBmYWlsdXJlIGFuZCBpZiB0aGUgcmVwbHkgc2hvdWxkIGJlIGZsdXNoZWQuCisgKi8KK3N0YXRpYyBpbnQgaTJvX3Njc2lfcmVwbHkoc3RydWN0IGkyb19jb250cm9sbGVyICpjLCB1MzIgbSwKKwkJCSAgc3RydWN0IGkyb19tZXNzYWdlICptc2cpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21kOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl1OCBhcywgZHMsIHN0OworCisJY21kID0gaTJvX2NudHh0X2xpc3RfZ2V0KGMsIGxlMzJfdG9fY3B1KG1zZy0+dS5zLnRjbnR4dCkpOworCisJaWYgKG1zZy0+dS5oZWFkWzBdICYgKDEgPDwgMTMpKSB7CisJCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICpwbXNnOwkvKiBwcmVzZXJ2ZWQgbWVzc2FnZSAqLworCQl1MzIgcG07CisJCWludCBlcnIgPSBESURfRVJST1I7CisKKwkJcG0gPSBsZTMyX3RvX2NwdShtc2ctPmJvZHlbM10pOworCisJCXBtc2cgPSBpMm9fbXNnX2luX3RvX3ZpcnQoYywgcG0pOworCisJCW9zbV9lcnIoIklPUCBmYWlsLlxuIik7CisJCW9zbV9lcnIoIkZyb20gJWQgVG8gJWQgQ21kICVkLlxuIiwKKwkJCShtc2ctPnUuaGVhZFsxXSA+PiAxMikgJiAweEZGRiwKKwkJCW1zZy0+dS5oZWFkWzFdICYgMHhGRkYsIG1zZy0+dS5oZWFkWzFdID4+IDI0KTsKKwkJb3NtX2VycigiRmFpbHVyZSBDb2RlICVkLlxuIiwgbXNnLT5ib2R5WzBdID4+IDI0KTsKKwkJaWYgKG1zZy0+Ym9keVswXSAmICgxIDw8IDE2KSkKKwkJCW9zbV9lcnIoIkZvcm1hdCBlcnJvci5cbiIpOworCQlpZiAobXNnLT5ib2R5WzBdICYgKDEgPDwgMTcpKQorCQkJb3NtX2VycigiUGF0aCBlcnJvci5cbiIpOworCQlpZiAobXNnLT5ib2R5WzBdICYgKDEgPDwgMTgpKQorCQkJb3NtX2VycigiUGF0aCBTdGF0ZS5cbiIpOworCQlpZiAobXNnLT5ib2R5WzBdICYgKDEgPDwgMTgpKQorCQl7CisJCQlvc21fZXJyKCJDb25nZXN0aW9uLlxuIik7CisJCQllcnIgPSBESURfQlVTX0JVU1k7CisJCX0KKworCQlvc21fZGVidWcoIkZhaWxpbmcgbWVzc2FnZSBpcyAlcC5cbiIsIHBtc2cpOworCisJCWNtZCA9IGkyb19jbnR4dF9saXN0X2dldChjLCByZWFkbCgmcG1zZy0+dS5zLnRjbnR4dCkpOworCQlpZiAoIWNtZCkKKwkJCXJldHVybiAxOworCisJCWNtZC0+cmVzdWx0ID0gZXJyIDw8IDE2OworCQljbWQtPnNjc2lfZG9uZShjbWQpOworCisJCS8qIE5vdyBmbHVzaCB0aGUgbWVzc2FnZSBieSBtYWtpbmcgaXQgYSBOT1AgKi8KKwkJaTJvX21zZ19ub3AoYywgcG0pOworCisJCXJldHVybiAxOworCX0KKworCS8qCisJICogICAgICBMb3cgYnl0ZSBpcyBkZXZpY2Ugc3RhdHVzLCBuZXh0IGlzIGFkYXB0ZXIgc3RhdHVzLAorCSAqICAgICAgKHRoZW4gb25lIGJ5dGUgcmVzZXJ2ZWQpLCB0aGVuIHJlcXVlc3Qgc3RhdHVzLgorCSAqLworCWRzID0gKHU4KSBsZTMyX3RvX2NwdShtc2ctPmJvZHlbMF0pOworCWFzID0gKHU4KSAobGUzMl90b19jcHUobXNnLT5ib2R5WzBdKSA+PiA4KTsKKwlzdCA9ICh1OCkgKGxlMzJfdG9fY3B1KG1zZy0+Ym9keVswXSkgPj4gMjQpOworCisJLyoKKwkgKiAgICAgIElzIHRoaXMgYSBjb250cm9sIHJlcXVlc3QgY29taW5nIGJhY2sgLSBlZyBhbiBhYm9ydCA/CisJICovCisKKwlpZiAoIWNtZCkgeworCQlpZiAoc3QpCisJCQlvc21fd2FybigiU0NTSSBhYm9ydDogJTA4WCIsIGxlMzJfdG9fY3B1KG1zZy0+Ym9keVswXSkpOworCQlvc21faW5mbygiU0NTSSBhYm9ydCBjb21wbGV0ZWQuXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJb3NtX2RlYnVnKCJDb21wbGV0ZWQgJWxkXG4iLCBjbWQtPnNlcmlhbF9udW1iZXIpOworCisJaWYgKHN0KSB7CisJCXUzMiBjb3VudCwgZXJyb3I7CisJCS8qIEFuIGVycm9yIGhhcyBvY2N1cnJlZCAqLworCisJCXN3aXRjaCAoc3QpIHsKKwkJY2FzZSAweDA2OgorCQkJY291bnQgPSBsZTMyX3RvX2NwdShtc2ctPmJvZHlbMV0pOworCQkJaWYgKGNvdW50IDwgY21kLT51bmRlcmZsb3cpIHsKKwkJCQlpbnQgaTsKKworCQkJCW9zbV9lcnIoIlNDU0kgdW5kZXJmbG93IDB4JTA4WCAweCUwOFhcbiIsIGNvdW50LAorCQkJCQljbWQtPnVuZGVyZmxvdyk7CisJCQkJb3NtX2RlYnVnKCJDbWQ6ICIpOworCQkJCWZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKQorCQkJCQlwcl9kZWJ1ZygiJTAyWCAiLCBjbWQtPmNtbmRbaV0pOworCQkJCXByX2RlYnVnKCIuXG4iKTsKKwkJCQljbWQtPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWVycm9yID0gbGUzMl90b19jcHUobXNnLT5ib2R5WzBdKTsKKworCQkJb3NtX2VycigiU0NTSSBlcnJvciAlMDh4XG4iLCBlcnJvcik7CisKKwkJCWlmICgoZXJyb3IgJiAweGZmKSA9PSAweDAyIC8qQ0hFQ0tfQ09ORElUSU9OICovICkgeworCQkJCWludCBpOworCQkJCXUzMiBsZW4gPSBzaXplb2YoY21kLT5zZW5zZV9idWZmZXIpOworCQkJCWxlbiA9IChsZW4gPiA0MCkgPyA0MCA6IGxlbjsKKwkJCQkvLyBDb3B5IG92ZXIgdGhlIHNlbnNlIGRhdGEKKwkJCQltZW1jcHkoY21kLT5zZW5zZV9idWZmZXIsICh2b2lkICopJm1zZy0+Ym9keVszXSwKKwkJCQkgICAgICAgbGVuKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDw9IGxlbjsgaSsrKQorCQkJCQlvc21faW5mbygiJTAyeFxuIiwKKwkJCQkJCSBjbWQtPnNlbnNlX2J1ZmZlcltpXSk7CisJCQkJaWYgKGNtZC0+c2Vuc2VfYnVmZmVyWzBdID09IDB4NzAKKwkJCQkgICAgJiYgY21kLT5zZW5zZV9idWZmZXJbMl0gPT0gREFUQV9QUk9URUNUKSB7CisJCQkJCS8qIFRoaXMgaXMgdG8gaGFuZGxlIGFuIGFycmF5IGZhaWxlZCAqLworCQkJCQljbWQtPnJlc3VsdCA9IChESURfVElNRV9PVVQgPDwgMTYpOworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogU0NTSSBEYXRhICIKKwkJCQkJICAgICAgICJQcm90ZWN0LURldmljZSAoJWQsJWQsJWQpICIKKwkJCQkJICAgICAgICJoYmFfc3RhdHVzPTB4JXgsIGRldl9zdGF0dXM9IgorCQkJCQkgICAgICAgIjB4JXgsIGNtZD0weCV4XG4iLCBjLT5uYW1lLAorCQkJCQkgICAgICAgKHUzMikgY21kLT5kZXZpY2UtPmNoYW5uZWwsCisJCQkJCSAgICAgICAodTMyKSBjbWQtPmRldmljZS0+aWQsCisJCQkJCSAgICAgICAodTMyKSBjbWQtPmRldmljZS0+bHVuLAorCQkJCQkgICAgICAgKGVycm9yID4+IDgpICYgMHhmZiwKKwkJCQkJICAgICAgIGVycm9yICYgMHhmZiwgY21kLT5jbW5kWzBdKTsKKwkJCQl9IGVsc2UKKwkJCQkJY21kLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKKworCQkJCWJyZWFrOworCQkJfQorCisJCQlzd2l0Y2ggKGFzKSB7CisJCQljYXNlIDB4MEU6CisJCQkJLyogU0NTSSBSZXNldCAqLworCQkJCWNtZC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OworCQkJCWJyZWFrOworCisJCQljYXNlIDB4MEY6CisJCQkJY21kLT5yZXN1bHQgPSBESURfUEFSSVRZIDw8IDE2OworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWNtZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQkJCWJyZWFrOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCisJCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJCXJldHVybiAxOworCX0KKworCWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgZHM7CisKKwljbWQtPnNjc2lfZG9uZShjbWQpOworCisJZGV2ID0gJmMtPnBkZXYtPmRldjsKKwlpZiAoY21kLT51c2Vfc2cpCisJCWRtYV91bm1hcF9zZyhkZXYsIChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiljbWQtPmJ1ZmZlciwKKwkJCSAgICAgY21kLT51c2Vfc2csIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCWVsc2UgaWYgKGNtZC0+cmVxdWVzdF9idWZmbGVuKQorCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgKGRtYV9hZGRyX3QpICgobG9uZyljbWQtPlNDcC5wdHIpLAorCQkJCSBjbWQtPnJlcXVlc3RfYnVmZmxlbiwgY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisKKwlyZXR1cm4gMTsKK307CisKKy8qKgorICoJaTJvX3Njc2lfbm90aWZ5X2NvbnRyb2xsZXJfYWRkIC0gUmV0cmlldmUgbm90aWZpY2F0aW9ucyBvZiBhZGRlZAorICoJCQkJCSBjb250cm9sbGVycworICoJQGM6IHRoZSBjb250cm9sbGVyIHdoaWNoIHdhcyBhZGRlZAorICoKKyAqCUlmIGEgSTJPIGNvbnRyb2xsZXIgaXMgYWRkZWQsIHdlIGNhdGNoIHRoZSBub3RpZmljYXRpb24gdG8gYWRkIGEKKyAqCWNvcnJlc3BvbmRpbmcgU2NzaV9Ib3N0LgorICovCitzdGF0aWMgdm9pZCBpMm9fc2NzaV9ub3RpZnlfY29udHJvbGxlcl9hZGQoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXN0cnVjdCBpMm9fc2NzaV9ob3N0ICppMm9fc2hvc3Q7CisJaW50IHJjOworCisJaTJvX3Nob3N0ID0gaTJvX3Njc2lfaG9zdF9hbGxvYyhjKTsKKwlpZiAoSVNfRVJSKGkyb19zaG9zdCkpIHsKKwkJb3NtX2VycigiQ291bGQgbm90IGluaXRpYWxpemUgU0NTSSBob3N0XG4iKTsKKwkJcmV0dXJuOworCX0KKworCXJjID0gc2NzaV9hZGRfaG9zdChpMm9fc2hvc3QtPnNjc2lfaG9zdCwgJmMtPmRldmljZSk7CisJaWYgKHJjKSB7CisJCW9zbV9lcnIoIkNvdWxkIG5vdCBhZGQgU0NTSSBob3N0XG4iKTsKKwkJc2NzaV9ob3N0X3B1dChpMm9fc2hvc3QtPnNjc2lfaG9zdCk7CisJCXJldHVybjsKKwl9CisKKwljLT5kcml2ZXJfZGF0YVtpMm9fc2NzaV9kcml2ZXIuY29udGV4dF0gPSBpMm9fc2hvc3Q7CisKKwlvc21fZGVidWcoIm5ldyBJMk8gU0NTSSBob3N0IGFkZGVkXG4iKTsKK307CisKKy8qKgorICoJaTJvX3Njc2lfbm90aWZ5X2NvbnRyb2xsZXJfcmVtb3ZlIC0gUmV0cmlldmUgbm90aWZpY2F0aW9ucyBvZiByZW1vdmVkCisgKgkJCQkJICAgIGNvbnRyb2xsZXJzCisgKglAYzogdGhlIGNvbnRyb2xsZXIgd2hpY2ggd2FzIHJlbW92ZWQKKyAqCisgKglJZiBhIEkyTyBjb250cm9sbGVyIGlzIHJlbW92ZWQsIHdlIGNhdGNoIHRoZSBub3RpZmljYXRpb24gdG8gcmVtb3ZlIHRoZQorICoJY29ycmVzcG9uZGluZyBTY3NpX0hvc3QuCisgKi8KK3N0YXRpYyB2b2lkIGkyb19zY3NpX25vdGlmeV9jb250cm9sbGVyX3JlbW92ZShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCit7CisJc3RydWN0IGkyb19zY3NpX2hvc3QgKmkyb19zaG9zdDsKKwlpMm9fc2hvc3QgPSBpMm9fc2NzaV9nZXRfaG9zdChjKTsKKwlpZiAoIWkyb19zaG9zdCkKKwkJcmV0dXJuOworCisJYy0+ZHJpdmVyX2RhdGFbaTJvX3Njc2lfZHJpdmVyLmNvbnRleHRdID0gTlVMTDsKKworCXNjc2lfcmVtb3ZlX2hvc3QoaTJvX3Nob3N0LT5zY3NpX2hvc3QpOworCXNjc2lfaG9zdF9wdXQoaTJvX3Nob3N0LT5zY3NpX2hvc3QpOworCXByX2luZm8oIkkyTyBTQ1NJIGhvc3QgcmVtb3ZlZFxuIik7Cit9OworCisvKiBTQ1NJIE9TTSBkcml2ZXIgc3RydWN0ICovCitzdGF0aWMgc3RydWN0IGkyb19kcml2ZXIgaTJvX3Njc2lfZHJpdmVyID0geworCS5uYW1lID0gT1NNX05BTUUsCisJLnJlcGx5ID0gaTJvX3Njc2lfcmVwbHksCisJLmNsYXNzZXMgPSBpMm9fc2NzaV9jbGFzc19pZCwKKwkubm90aWZ5X2NvbnRyb2xsZXJfYWRkID0gaTJvX3Njc2lfbm90aWZ5X2NvbnRyb2xsZXJfYWRkLAorCS5ub3RpZnlfY29udHJvbGxlcl9yZW1vdmUgPSBpMm9fc2NzaV9ub3RpZnlfY29udHJvbGxlcl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJICAgLnByb2JlID0gaTJvX3Njc2lfcHJvYmUsCisJCSAgIC5yZW1vdmUgPSBpMm9fc2NzaV9yZW1vdmUsCisJCSAgIH0sCit9OworCisvKioKKyAqCWkyb19zY3NpX3F1ZXVlY29tbWFuZCAtIHF1ZXVlIGEgU0NTSSBjb21tYW5kCisgKglAU0NwbnQ6IHNjc2kgY29tbWFuZCBwb2ludGVyCisgKglAZG9uZTogY2FsbGJhY2sgZm9yIGNvbXBsZXRpb24KKyAqCisgKglJc3N1ZSBhIHNjc2kgY29tbWFuZCBhc3luY2hyb25vdXNseS4gUmV0dXJuIDAgb24gc3VjY2VzcyBvciAxIGlmCisgKgl3ZSBoaXQgYW4gZXJyb3IgKG5vcm1hbGx5IG1lc3NhZ2UgcXVldWUgY29uZ2VzdGlvbikuIFRoZSBvbmx5CisgKgltaW5vciBjb21wbGljYXRpb24gaGVyZSBpcyB0aGF0IEkyTyBkZWFscyB3aXRoIHRoZSBkZXZpY2UgYWRkcmVzc2luZworICoJc28gd2UgaGF2ZSB0byBtYXAgdGhlIGJ1cy9kZXYvbHVuIGJhY2sgdG8gYW4gSTJPIGhhbmRsZSBhcyB3ZWxsCisgKglhcyBmYWtpbmcgYWJzZW50IGRldmljZXMgb3Vyc2VsZi4KKyAqCisgKglMb2NrczogdGFrZXMgdGhlIGNvbnRyb2xsZXIgbG9jayBvbiBlcnJvciBwYXRoIG9ubHkKKyAqLworCitzdGF0aWMgaW50IGkyb19zY3NpX3F1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwKKwkJCQkgdm9pZCAoKmRvbmUpIChzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgdGlkOworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdTMyIG07CisJdTMyIHNjc2lfZmxhZ3MsIHNnX2ZsYWdzOworCXUzMiBfX2lvbWVtICptcHRyOworCXUzMiBfX2lvbWVtICpsZW5wdHI7CisJdTMyIGxlbiwgcmVxbGVuOworCWludCBpOworCisJLyoKKwkgKiAgICAgIERvIHRoZSBpbmNvbWluZyBwYXBlcndvcmsKKwkgKi8KKworCWkyb19kZXYgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwlob3N0ID0gU0NwbnQtPmRldmljZS0+aG9zdDsKKwljID0gaTJvX2Rldi0+aW9wOworCWRldiA9ICZjLT5wZGV2LT5kZXY7CisKKwlTQ3BudC0+c2NzaV9kb25lID0gZG9uZTsKKworCWlmICh1bmxpa2VseSghaTJvX2RldikpIHsKKwkJb3NtX3dhcm4oIm5vIEkyTyBkZXZpY2UgaW4gcmVxdWVzdFxuIik7CisJCVNDcG50LT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJZG9uZShTQ3BudCk7CisJCXJldHVybiAwOworCX0KKworCXRpZCA9IGkyb19kZXYtPmxjdF9kYXRhLnRpZDsKKworCW9zbV9kZWJ1ZygicWNtZDogVGlkID0gJTAzeFxuIiwgdGlkKTsKKwlvc21fZGVidWcoIlJlYWwgc2NzaSBtZXNzYWdlcy5cbiIpOworCisJLyoKKwkgKiAgICAgIE9idGFpbiBhbiBJMk8gbWVzc2FnZS4gSWYgdGhlcmUgYXJlIG5vbmUgZnJlZSB0aGVuCisJICogICAgICB0aHJvdyBpdCBiYWNrIHRvIHRoZSBzY3NpIGxheWVyCisJICovCisKKwltID0gaTJvX21zZ19nZXRfd2FpdChjLCAmbXNnLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7CisJaWYgKG0gPT0gSTJPX1FVRVVFX0VNUFRZKQorCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKKworCS8qCisJICogICAgICBQdXQgdG9nZXRoZXIgYSBzY3NpIGV4ZWNzY2IgbWVzc2FnZQorCSAqLworCisJbGVuID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKKworCXN3aXRjaCAoU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uKSB7CisJY2FzZSBQQ0lfRE1BX05PTkU6CisJCXNjc2lfZmxhZ3MgPSAweDAwMDAwMDAwOwkvLyBEQVRBIE5PIFhGRVIKKwkJc2dfZmxhZ3MgPSAweDAwMDAwMDAwOworCQlicmVhazsKKworCWNhc2UgUENJX0RNQV9UT0RFVklDRToKKwkJc2NzaV9mbGFncyA9IDB4ODAwMDAwMDA7CS8vIERBVEEgT1VUIChpb3AtLT5kZXYpCisJCXNnX2ZsYWdzID0gMHgxNDAwMDAwMDsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ETUFfRlJPTURFVklDRToKKwkJc2NzaV9mbGFncyA9IDB4NDAwMDAwMDA7CS8vIERBVEEgSU4gIChpb3A8LS1kZXYpCisJCXNnX2ZsYWdzID0gMHgxMDAwMDAwMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBVbmtub3duIC0ga2lsbCB0aGUgY29tbWFuZCAqLworCQlTQ3BudC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCWRvbmUoU0NwbnQpOworCQlyZXR1cm4gMDsKKwl9CisKKwl3cml0ZWwoSTJPX0NNRF9TQ1NJX0VYRUMgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IHRpZCwgJm1zZy0+dS5oZWFkWzFdKTsKKwl3cml0ZWwoaTJvX3Njc2lfZHJpdmVyLmNvbnRleHQsICZtc2ctPnUucy5pY250eHQpOworCisJLyogV2Ugd2FudCB0aGUgU0NTSSBjb250cm9sIGJsb2NrIGJhY2sgKi8KKwl3cml0ZWwoaTJvX2NudHh0X2xpc3RfYWRkKGMsIFNDcG50KSwgJm1zZy0+dS5zLnRjbnR4dCk7CisKKwkvKiBMU0lfOTIwX1BDSV9RVUlSSworCSAqCisJICogICAgICBJbnRlcm1pdHRhbnQgb2JzZXJ2YXRpb25zIG9mIG1zZyBmcmFtZSB3b3JkIGRhdGEgY29ycnVwdGlvbgorCSAqICAgICAgb2JzZXJ2ZWQgb24gbXNnWzRdIGFmdGVyOgorCSAqICAgICAgICBXUklURSwgUkVBRC1NT0RJRlktV1JJVEUKKwkgKiAgICAgIG9wZXJhdGlvbnMuICAxOTk5MDYwNiAtc3JhbHN0b24KKwkgKgorCSAqICAgICAgKEhlbmNlIHdlIGJ1aWxkIHRoaXMgd29yZCB2aWEgdGFnLiBJdHMgZ29vZCBwcmFjdGljZSBhbnl3YXkKKwkgKiAgICAgICB3ZSBkb24ndCB3YW50IGZldGNoZXMgb3ZlciBQQ0kgbmVlZGxlc3NseSkKKwkgKi8KKworCS8qIEF0dGFjaCB0YWdzIHRvIHRoZSBkZXZpY2VzICovCisJLyoKKwkgICBpZihTQ3BudC0+ZGV2aWNlLT50YWdnZWRfc3VwcG9ydGVkKSB7CisJICAgaWYoU0NwbnQtPnRhZyA9PSBIRUFEX09GX1FVRVVFX1RBRykKKwkgICBzY3NpX2ZsYWdzIHw9IDB4MDEwMDAwMDA7CisJICAgZWxzZSBpZihTQ3BudC0+dGFnID09IE9SREVSRURfUVVFVUVfVEFHKQorCSAgIHNjc2lfZmxhZ3MgfD0gMHgwMTgwMDAwMDsKKwkgICB9CisJICovCisKKwkvKiBEaXJlY3Rpb24sIGRpc2Nvbm5lY3Qgb2ssIHRhZywgQ0RCTGVuICovCisJd3JpdGVsKHNjc2lfZmxhZ3MgfCAweDIwMjAwMDAwIHwgU0NwbnQtPmNtZF9sZW4sICZtc2ctPmJvZHlbMF0pOworCisJbXB0ciA9ICZtc2ctPmJvZHlbMV07CisKKwkvKiBXcml0ZSBTQ1NJIGNvbW1hbmQgaW50byB0aGUgbWVzc2FnZSAtIGFsd2F5cyAxNiBieXRlIGJsb2NrICovCisJbWVtY3B5X3RvaW8obXB0ciwgU0NwbnQtPmNtbmQsIDE2KTsKKwltcHRyICs9IDQ7CisJbGVucHRyID0gbXB0cisrOwkvKiBSZW1lbWJlciBtZSAtIGZpbGwgaW4gd2hlbiB3ZSBrbm93ICovCisKKwlyZXFsZW4gPSAxMjsJCS8vIFNJTkdMRSBTR0UKKworCS8qIE5vdyBmaWxsIGluIHRoZSBTR0xpc3QgYW5kIGNvbW1hbmQgKi8KKwlpZiAoU0NwbnQtPnVzZV9zZykgeworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCQlpbnQgc2dfY291bnQ7CisKKwkJc2cgPSBTQ3BudC0+cmVxdWVzdF9idWZmZXI7CisJCWxlbiA9IDA7CisKKwkJc2dfY291bnQgPSBkbWFfbWFwX3NnKGRldiwgc2csIFNDcG50LT51c2Vfc2csCisJCQkJICAgICAgU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKworCQlpZiAodW5saWtlbHkoc2dfY291bnQgPD0gMCkpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlmb3IgKGkgPSBTQ3BudC0+dXNlX3NnOyBpID4gMDsgaS0tKSB7CisJCQlpZiAoaSA9PSAxKQorCQkJCXNnX2ZsYWdzIHw9IDB4QzAwMDAwMDA7CisJCQl3cml0ZWwoc2dfZmxhZ3MgfCBzZ19kbWFfbGVuKHNnKSwgbXB0cisrKTsKKwkJCXdyaXRlbChzZ19kbWFfYWRkcmVzcyhzZyksIG1wdHIrKyk7CisJCQlsZW4gKz0gc2dfZG1hX2xlbihzZyk7CisJCQlzZysrOworCQl9CisKKwkJcmVxbGVuID0gbXB0ciAtICZtc2ctPnUuaGVhZFswXTsKKwkJd3JpdGVsKGxlbiwgbGVucHRyKTsKKwl9IGVsc2UgeworCQlsZW4gPSBTQ3BudC0+cmVxdWVzdF9idWZmbGVuOworCisJCXdyaXRlbChsZW4sIGxlbnB0cik7CisKKwkJaWYgKGxlbiA+IDApIHsKKwkJCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisKKwkJCWRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUoZGV2LCBTQ3BudC0+cmVxdWVzdF9idWZmZXIsCisJCQkJCQkgIFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCQkgIFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbik7CisJCQlpZiAoIWRtYV9hZGRyKQorCQkJCXJldHVybiAtRU5PTUVNOworCisJCQlTQ3BudC0+U0NwLnB0ciA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpZG1hX2FkZHI7CisJCQlzZ19mbGFncyB8PSAweEMwMDAwMDAwOworCQkJd3JpdGVsKHNnX2ZsYWdzIHwgU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiwgbXB0cisrKTsKKwkJCXdyaXRlbChkbWFfYWRkciwgbXB0cisrKTsKKwkJfSBlbHNlCisJCQlyZXFsZW4gPSA5OworCX0KKworCS8qIFN0aWNrIHRoZSBoZWFkZXJzIG9uICovCisJd3JpdGVsKHJlcWxlbiA8PCAxNiB8IFNHTF9PRkZTRVRfMTAsICZtc2ctPnUuaGVhZFswXSk7CisKKwkvKiBRdWV1ZSB0aGUgbWVzc2FnZSAqLworCWkyb19tc2dfcG9zdChjLCBtKTsKKworCW9zbV9kZWJ1ZygiSXNzdWVkICVsZFxuIiwgU0NwbnQtPnNlcmlhbF9udW1iZXIpOworCisJcmV0dXJuIDA7Cit9OworCisvKioKKyAqCWkyb19zY3NpX2Fib3J0IC0gYWJvcnQgYSBydW5uaW5nIGNvbW1hbmQKKyAqCUBTQ3BudDogY29tbWFuZCB0byBhYm9ydAorICoKKyAqCUFzayB0aGUgSTJPIGNvbnRyb2xsZXIgdG8gYWJvcnQgYSBjb21tYW5kLiBUaGlzIGlzIGFuIGFzeW5jaHJub3VzCisgKglwcm9jZXNzIGFuZCBvdXIgY2FsbGJhY2sgaGFuZGxlciB3aWxsIHNlZSB0aGUgY29tbWFuZCBjb21wbGV0ZSB3aXRoIGFuCisgKglhYm9ydGVkIG1lc3NhZ2UgaWYgaXQgc3VjY2VlZHMuCisgKgorICoJUmV0dXJucyAwIGlmIHRoZSBjb21tYW5kIGlzIHN1Y2Nlc3NmdWxseSBhYm9ydGVkIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqCW9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgaTJvX3Njc2lfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXY7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjOworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdTMyIG07CisJaW50IHRpZDsKKwlpbnQgc3RhdHVzID0gRkFJTEVEOworCisJb3NtX3dhcm4oIkFib3J0aW5nIGNvbW1hbmQgYmxvY2suXG4iKTsKKworCWkyb19kZXYgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwljID0gaTJvX2Rldi0+aW9wOworCXRpZCA9IGkyb19kZXYtPmxjdF9kYXRhLnRpZDsKKworCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCisJd3JpdGVsKEZJVkVfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfMCwgJm1zZy0+dS5oZWFkWzBdKTsKKwl3cml0ZWwoSTJPX0NNRF9TQ1NJX0FCT1JUIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCB0aWQsCisJICAgICAgICZtc2ctPnUuaGVhZFsxXSk7CisJd3JpdGVsKGkyb19jbnR4dF9saXN0X2dldF9wdHIoYywgU0NwbnQpLCAmbXNnLT5ib2R5WzBdKTsKKworCWlmIChpMm9fbXNnX3Bvc3Rfd2FpdChjLCBtLCBJMk9fVElNRU9VVF9TQ1NJX1NDQl9BQk9SVCkpCisJCXN0YXR1cyA9IFNVQ0NFU1M7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqCWkyb19zY3NpX2Jpb3NfcGFyYW0JLQlJbnZlbnQgZGlzayBnZW9tZXRyeQorICoJQHNkZXY6IHNjc2kgZGV2aWNlCisgKglAZGV2OiBibG9jayBsYXllciBkZXZpY2UKKyAqCUBjYXBhY2l0eTogc2l6ZSBpbiBzZWN0b3JzCisgKglAaXA6IGdlb21ldHJ5IGFycmF5CisgKgorICoJVGhpcyBpcyBhbnlvbmVzIGd1ZXNzIHF1aXRlIGZyYW5rbHkuIFdlIHVzZSB0aGUgc2FtZSBydWxlcyBldmVyeW9uZQorICoJZWxzZSBhcHBlYXJzIHRvIGFuZCBob3BlLiBJdCBzZWVtcyB0byB3b3JrLgorICovCisKK3N0YXRpYyBpbnQgaTJvX3Njc2lfYmlvc19wYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCisJCQkgICAgICAgc3RydWN0IGJsb2NrX2RldmljZSAqZGV2LCBzZWN0b3JfdCBjYXBhY2l0eSwKKwkJCSAgICAgICBpbnQgKmlwKQoreworCWludCBzaXplOworCisJc2l6ZSA9IGNhcGFjaXR5OworCWlwWzBdID0gNjQ7CQkvKiBoZWFkcyAgICAgICAgICAgICAgICAgICAgICAgICovCisJaXBbMV0gPSAzMjsJCS8qIHNlY3RvcnMgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpZiAoKGlwWzJdID0gc2l6ZSA+PiAxMSkgPiAxMDI0KSB7CS8qIGN5bGluZGVycywgdGVzdCBmb3IgYmlnIGRpc2sgKi8KKwkJaXBbMF0gPSAyNTU7CS8qIGhlYWRzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJaXBbMV0gPSA2MzsJLyogc2VjdG9ycyAgICAgICAgICAgICAgICAgICAgICAqLworCQlpcFsyXSA9IHNpemUgLyAoMjU1ICogNjMpOwkvKiBjeWxpbmRlcnMgICAgICAgICAgICAgICAgICAgICovCisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBpMm9fc2NzaV9ob3N0X3RlbXBsYXRlID0geworCS5wcm9jX25hbWUgPSBPU01fTkFNRSwKKwkubmFtZSA9IE9TTV9ERVNDUklQVElPTiwKKwkuaW5mbyA9IGkyb19zY3NpX2luZm8sCisJLnF1ZXVlY29tbWFuZCA9IGkyb19zY3NpX3F1ZXVlY29tbWFuZCwKKwkuZWhfYWJvcnRfaGFuZGxlciA9IGkyb19zY3NpX2Fib3J0LAorCS5iaW9zX3BhcmFtID0gaTJvX3Njc2lfYmlvc19wYXJhbSwKKwkuY2FuX3F1ZXVlID0gSTJPX1NDU0lfQ0FOX1FVRVVFLAorCS5zZ190YWJsZXNpemUgPSA4LAorCS5jbWRfcGVyX2x1biA9IDYsCisJLnVzZV9jbHVzdGVyaW5nID0gRU5BQkxFX0NMVVNURVJJTkcsCit9OworCisvKioKKyAqCWkyb19zY3NpX2luaXQgLSBTQ1NJIE9TTSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgorICoKKyAqCVJlZ2lzdGVyIFNDU0kgT1NNIGludG8gSTJPIGNvcmUuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IF9faW5pdCBpMm9fc2NzaV9pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJcHJpbnRrKEtFUk5fSU5GTyBPU01fREVTQ1JJUFRJT04gIiB2IiBPU01fVkVSU0lPTiAiXG4iKTsKKworCS8qIFJlZ2lzdGVyIFNDU0kgT1NNIGludG8gSTJPIGNvcmUgKi8KKwlyYyA9IGkyb19kcml2ZXJfcmVnaXN0ZXIoJmkyb19zY3NpX2RyaXZlcik7CisJaWYgKHJjKSB7CisJCW9zbV9lcnIoIkNvdWxkIG5vdCByZWdpc3RlciBTQ1NJIGRyaXZlclxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK307CisKKy8qKgorICoJaTJvX3Njc2lfZXhpdCAtIFNDU0kgT1NNIGV4aXQgZnVuY3Rpb24KKyAqCisgKglVbnJlZ2lzdGVycyBTQ1NJIE9TTSBmcm9tIEkyTyBjb3JlLgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgaTJvX3Njc2lfZXhpdCh2b2lkKQoreworCS8qIFVucmVnaXN0ZXIgSTJPIFNDU0kgT1NNIGZyb20gSTJPIGNvcmUgKi8KKwlpMm9fZHJpdmVyX3VucmVnaXN0ZXIoJmkyb19zY3NpX2RyaXZlcik7Cit9OworCitNT0RVTEVfQVVUSE9SKCJSZWQgSGF0IFNvZnR3YXJlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oT1NNX0RFU0NSSVBUSU9OKTsKK01PRFVMRV9WRVJTSU9OKE9TTV9WRVJTSU9OKTsKKworbW9kdWxlX2luaXQoaTJvX3Njc2lfaW5pdCk7Cittb2R1bGVfZXhpdChpMm9fc2NzaV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaW9wLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYzhjZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jCkBAIC0wLDAgKzEsMTMyNyBAQAorLyoKKyAqCUZ1bmN0aW9ucyB0byBoYW5kbGUgSTJPIGNvbnRyb2xsZXJzIGFuZCBJMk8gbWVzc2FnZSBoYW5kbGluZworICoKKyAqCUNvcHlyaWdodCAoQykgMTk5OS0yMDAyCVJlZCBIYXQgU29mdHdhcmUKKyAqCisgKglXcml0dGVuIGJ5IEFsYW4gQ294LCBCdWlsZGluZyBOdW1iZXIgVGhyZWUgTHRkCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqCXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICoJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICoJb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglBIGxvdCBvZiB0aGUgSTJPIG1lc3NhZ2Ugc2lkZSBjb2RlIGZyb20gdGhpcyBpcyB0YWtlbiBmcm9tIHRoZQorICoJUmVkIENyZWVrIFJDUENJNDUgYWRhcHRlciBkcml2ZXIgYnkgUmVkIENyZWVrIENvbW11bmljYXRpb25zCisgKgorICoJRml4ZXMvYWRkaXRpb25zOgorICoJCVBoaWxpcHAgUnVtcGYKKyAqCQlKdWhhIFNpZXbkbmVuIDxKdWhhLlNpZXZhbmVuQGNzLkhlbHNpbmtpLkZJPgorICoJCUF1dm8gSORra2luZW4gPEF1dm8uSGFra2luZW5AY3MuSGVsc2lua2kuRkk+CisgKgkJRGVlcGFrIFNheGVuYSA8ZGVlcGFrQHBsZXhpdHkubmV0PgorICoJCUJvamkgVCBLYW5uYW50aGFuYW0gPGJvamkudC5rYW5uYW50aGFuYW1AaW50ZWwuY29tPgorICoJCUFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+OgorICoJCQlQb3J0ZWQgdG8gTGludXggMi41LgorICoJCU1hcmt1cyBMaWRlbCA8TWFya3VzLkxpZGVsQHNoYWRvd2Nvbm5lY3QuY29tPjoKKyAqCQkJTWlub3IgZml4ZXMgZm9yIDIuNi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2RlZmluZSBPU01fVkVSU0lPTgkiJFJldiQiCisjZGVmaW5lIE9TTV9ERVNDUklQVElPTgkiSTJPIHN1YnN5c3RlbSIKKworLyogZ2xvYmFsIEkyTyBjb250cm9sbGVyIGxpc3QgKi8KK0xJU1RfSEVBRChpMm9fY29udHJvbGxlcnMpOworCisvKgorICogZ2xvYmFsIEkyTyBTeXN0ZW0gVGFibGUuIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGFsbCB0aGUgSU9QcyBpbiB0aGUKKyAqIHN5c3RlbS4gVXNlZCB0byBpbmZvcm0gSU9QcyBhYm91dCBlYWNoIG90aGVycyBleGlzdGVuY2UuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJvX2RtYSBpMm9fc3lzdGFiOworCitzdGF0aWMgaW50IGkyb19ocnRfZ2V0KHN0cnVjdCBpMm9fY29udHJvbGxlciAqYyk7CisKKy8qIE1vZHVsZSBpbnRlcm5hbCBmdW5jdGlvbnMgZnJvbSBvdGhlciBzb3VyY2VzICovCitleHRlcm4gc3RydWN0IGkyb19kcml2ZXIgaTJvX2V4ZWNfZHJpdmVyOworZXh0ZXJuIGludCBpMm9fZXhlY19sY3RfZ2V0KHN0cnVjdCBpMm9fY29udHJvbGxlciAqKTsKK2V4dGVybiB2b2lkIGkyb19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBpMm9fZGV2aWNlICopOworCitleHRlcm4gaW50IF9faW5pdCBpMm9fZHJpdmVyX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBfX2V4aXQgaTJvX2RyaXZlcl9leGl0KHZvaWQpOworZXh0ZXJuIGludCBfX2luaXQgaTJvX2V4ZWNfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIF9fZXhpdCBpMm9fZXhlY19leGl0KHZvaWQpOworZXh0ZXJuIGludCBfX2luaXQgaTJvX3BjaV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgX19leGl0IGkyb19wY2lfZXhpdCh2b2lkKTsKK2V4dGVybiBpbnQgaTJvX2RldmljZV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaTJvX2RldmljZV9leGl0KHZvaWQpOworCisvKioKKyAqCWkyb19tc2dfbm9wIC0gUmV0dXJucyBhIG1lc3NhZ2Ugd2hpY2ggaXMgbm90IHVzZWQKKyAqCUBjOiBJMk8gY29udHJvbGxlciBmcm9tIHdoaWNoIHRoZSBtZXNzYWdlIHdhcyBjcmVhdGVkCisgKglAbTogbWVzc2FnZSB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQKKyAqCisgKglJZiB5b3UgZmV0Y2ggYSBtZXNzYWdlIHZpYSBpMm9fbXNnX2dldCwgYW5kIGNhbid0IHVzZSBpdCwgeW91IG11c3QKKyAqCXJldHVybiB0aGUgbWVzc2FnZSB3aXRoIHRoaXMgZnVuY3Rpb24uIE90aGVyd2lzZSB0aGUgbWVzc2FnZSBmcmFtZQorICoJaXMgbG9zdC4KKyAqLwordm9pZCBpMm9fbXNnX25vcChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsIHUzMiBtKQoreworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2cgPSBjLT5pbl9xdWV1ZS52aXJ0ICsgbTsKKworCXdyaXRlbChUSFJFRV9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF8wLCAmbXNnLT51LmhlYWRbMF0pOworCXdyaXRlbChJMk9fQ01EX1VUSUxfTk9QIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCBBREFQVEVSX1RJRCwKKwkgICAgICAgJm1zZy0+dS5oZWFkWzFdKTsKKwl3cml0ZWwoMCwgJm1zZy0+dS5oZWFkWzJdKTsKKwl3cml0ZWwoMCwgJm1zZy0+dS5oZWFkWzNdKTsKKwlpMm9fbXNnX3Bvc3QoYywgbSk7Cit9OworCisvKioKKyAqCWkyb19tc2dfZ2V0X3dhaXQgLSBvYnRhaW4gYW4gSTJPIG1lc3NhZ2UgZnJvbSB0aGUgSU9QCisgKglAYzogSTJPIGNvbnRyb2xsZXIKKyAqCUBtc2c6IHBvaW50ZXIgdG8gYSBJMk8gbWVzc2FnZSBwb2ludGVyCisgKglAd2FpdDogaG93IGxvbmcgdG8gd2FpdCB1bnRpbCB0aW1lb3V0CisgKgorICoJVGhpcyBmdW5jdGlvbiB3YWl0cyB1cCB0byB3YWl0IHNlY29uZHMgZm9yIGEgbWVzc2FnZSBzbG90IHRvIGJlCisgKglhdmFpbGFibGUuCisgKgorICoJT24gYSBzdWNjZXNzIHRoZSBtZXNzYWdlIGlzIHJldHVybmVkIGFuZCB0aGUgcG9pbnRlciB0byB0aGUgbWVzc2FnZSBpcworICoJc2V0IGluIG1zZy4gVGhlIHJldHVybmVkIG1lc3NhZ2UgaXMgdGhlIHBoeXNpY2FsIHBhZ2UgZnJhbWUgb2Zmc2V0CisgKglhZGRyZXNzIGZyb20gdGhlIHJlYWQgcG9ydCAoc2VlIHRoZSBpMm8gc3BlYykuIElmIG5vIG1lc3NhZ2UgaXMKKyAqCWF2YWlsYWJsZSByZXR1cm5zIEkyT19RVUVVRV9FTVBUWSBhbmQgbXNnIGlzIGxlYXZlZCB1bnRvdWNoZWQuCisgKi8KK3UzMiBpMm9fbXNnX2dldF93YWl0KHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKiptc2csCisJCSAgICAgaW50IHdhaXQpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIHdhaXQgKiBIWjsKKwl1MzIgbTsKKworCXdoaWxlICgobSA9IGkyb19tc2dfZ2V0KGMsIG1zZykpID09IEkyT19RVUVVRV9FTVBUWSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJcHJfZGVidWcoIiVzOiBUaW1lb3V0IHdhaXRpbmcgZm9yIG1lc3NhZ2UgZnJhbWUuXG4iLAorCQkJCSBjLT5uYW1lKTsKKwkJCXJldHVybiBJMk9fUVVFVUVfRU1QVFk7CisJCX0KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKworCXJldHVybiBtOworfTsKKworI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjQKKy8qKgorICogICAgICBpMm9fY250eHRfbGlzdF9hZGQgLSBBcHBlbmQgYSBwb2ludGVyIHRvIGNvbnRleHQgbGlzdCBhbmQgcmV0dXJuIGEgaWQKKyAqCUBjOiBjb250cm9sbGVyIHRvIHdoaWNoIHRoZSBjb250ZXh0IGxpc3QgYmVsb25nCisgKglAcHRyOiBwb2ludGVyIHRvIGFkZCB0byB0aGUgY29udGV4dCBsaXN0CisgKgorICoJQmVjYXVzZSB0aGUgY29udGV4dCBmaWVsZCBpbiBJMk8gaXMgb25seSAzMi1iaXQgbGFyZ2UsIG9uIDY0LWJpdCB0aGUKKyAqCXBvaW50ZXIgaXMgdG8gbGFyZ2UgdG8gZml0IGluIHRoZSBjb250ZXh0IGZpZWxkLiBUaGUgaTJvX2NudHh0X2xpc3QKKyAqCWZ1bmN0aW9ucyB0aGVyZWZvcmUgbWFwIHBvaW50ZXJzIHRvIGNvbnRleHQgZmllbGRzLgorICoKKyAqCVJldHVybnMgY29udGV4dCBpZCA+IDAgb24gc3VjY2VzcyBvciAwIG9uIGZhaWx1cmUuCisgKi8KK3UzMiBpMm9fY250eHRfbGlzdF9hZGQoc3RydWN0IGkyb19jb250cm9sbGVyICogYywgdm9pZCAqcHRyKQoreworCXN0cnVjdCBpMm9fY29udGV4dF9saXN0X2VsZW1lbnQgKmVudHJ5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIXB0cikKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGRuJ3QgYWRkIE5VTEwgcG9pbnRlciB0byBjb250ZXh0IGxpc3QhIgorCQkgICAgICAgIlxuIiwgYy0+bmFtZSk7CisKKwllbnRyeSA9IGttYWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9BVE9NSUMpOworCWlmICghZW50cnkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgY29udGV4dCAiCisJCSAgICAgICAibGlzdCBlbGVtZW50XG4iLCBjLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZW50cnktPnB0ciA9IHB0cjsKKwllbnRyeS0+dGltZXN0YW1wID0gamlmZmllczsKKwlJTklUX0xJU1RfSEVBRCgmZW50cnktPmxpc3QpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmMtPmNvbnRleHRfbGlzdF9sb2NrLCBmbGFncyk7CisKKwlpZiAodW5saWtlbHkoYXRvbWljX2luY19hbmRfdGVzdCgmYy0+Y29udGV4dF9saXN0X2NvdW50ZXIpKSkKKwkJYXRvbWljX2luYygmYy0+Y29udGV4dF9saXN0X2NvdW50ZXIpOworCisJZW50cnktPmNvbnRleHQgPSBhdG9taWNfcmVhZCgmYy0+Y29udGV4dF9saXN0X2NvdW50ZXIpOworCisJbGlzdF9hZGQoJmVudHJ5LT5saXN0LCAmYy0+Y29udGV4dF9saXN0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPmNvbnRleHRfbGlzdF9sb2NrLCBmbGFncyk7CisKKwlwcl9kZWJ1ZygiJXM6IEFkZCBjb250ZXh0IHRvIGxpc3QgJXAgLT4gJWRcbiIsIGMtPm5hbWUsIHB0ciwgY29udGV4dCk7CisKKwlyZXR1cm4gZW50cnktPmNvbnRleHQ7Cit9OworCisvKioKKyAqICAgICAgaTJvX2NudHh0X2xpc3RfcmVtb3ZlIC0gUmVtb3ZlIGEgcG9pbnRlciBmcm9tIHRoZSBjb250ZXh0IGxpc3QKKyAqCUBjOiBjb250cm9sbGVyIHRvIHdoaWNoIHRoZSBjb250ZXh0IGxpc3QgYmVsb25nCisgKglAcHRyOiBwb2ludGVyIHdoaWNoIHNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIGNvbnRleHQgbGlzdAorICoKKyAqCVJlbW92ZXMgYSBwcmV2aW91c2x5IGFkZGVkIHBvaW50ZXIgZnJvbSB0aGUgY29udGV4dCBsaXN0IGFuZCByZXR1cm5zCisgKgl0aGUgbWF0Y2hpbmcgY29udGV4dCBpZC4KKyAqCisgKglSZXR1cm5zIGNvbnRleHQgaWQgb24gc3VjY2VzIG9yIDAgb24gZmFpbHVyZS4KKyAqLwordTMyIGkyb19jbnR4dF9saXN0X3JlbW92ZShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKiBjLCB2b2lkICpwdHIpCit7CisJc3RydWN0IGkyb19jb250ZXh0X2xpc3RfZWxlbWVudCAqZW50cnk7CisJdTMyIGNvbnRleHQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYy0+Y29udGV4dF9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmYy0+Y29udGV4dF9saXN0LCBsaXN0KQorCSAgICBpZiAoZW50cnktPnB0ciA9PSBwdHIpIHsKKwkJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKKwkJY29udGV4dCA9IGVudHJ5LT5jb250ZXh0OworCQlrZnJlZShlbnRyeSk7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT5jb250ZXh0X2xpc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKCFjb250ZXh0KQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGQgbm90IHJlbW92ZSBub25leGlzdGVudCBwdHIgIgorCQkgICAgICAgIiVwXG4iLCBjLT5uYW1lLCBwdHIpOworCisJcHJfZGVidWcoIiVzOiByZW1vdmUgcHRyIGZyb20gY29udGV4dCBsaXN0ICVkIC0+ICVwXG4iLCBjLT5uYW1lLAorCQkgY29udGV4dCwgcHRyKTsKKworCXJldHVybiBjb250ZXh0OworfTsKKworLyoqCisgKiAgICAgIGkyb19jbnR4dF9saXN0X2dldCAtIEdldCBhIHBvaW50ZXIgZnJvbSB0aGUgY29udGV4dCBsaXN0IGFuZCByZW1vdmUgaXQKKyAqCUBjOiBjb250cm9sbGVyIHRvIHdoaWNoIHRoZSBjb250ZXh0IGxpc3QgYmVsb25nCisgKglAY29udGV4dDogY29udGV4dCBpZCB0byB3aGljaCB0aGUgcG9pbnRlciBiZWxvbmcKKyAqCisgKglSZXR1cm5zIHBvaW50ZXIgdG8gdGhlIG1hdGNoaW5nIGNvbnRleHQgaWQgb24gc3VjY2VzcyBvciBOVUxMIG9uCisgKglmYWlsdXJlLgorICovCit2b2lkICppMm9fY250eHRfbGlzdF9nZXQoc3RydWN0IGkyb19jb250cm9sbGVyICpjLCB1MzIgY29udGV4dCkKK3sKKwlzdHJ1Y3QgaTJvX2NvbnRleHRfbGlzdF9lbGVtZW50ICplbnRyeTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgKnB0ciA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYy0+Y29udGV4dF9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmYy0+Y29udGV4dF9saXN0LCBsaXN0KQorCSAgICBpZiAoZW50cnktPmNvbnRleHQgPT0gY29udGV4dCkgeworCQlsaXN0X2RlbCgmZW50cnktPmxpc3QpOworCQlwdHIgPSBlbnRyeS0+cHRyOworCQlrZnJlZShlbnRyeSk7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT5jb250ZXh0X2xpc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKCFwdHIpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb250ZXh0IGlkICVkIG5vdCBmb3VuZFxuIiwgYy0+bmFtZSwKKwkJICAgICAgIGNvbnRleHQpOworCisJcHJfZGVidWcoIiVzOiBnZXQgcHRyIGZyb20gY29udGV4dCBsaXN0ICVkIC0+ICVwXG4iLCBjLT5uYW1lLCBjb250ZXh0LAorCQkgcHRyKTsKKworCXJldHVybiBwdHI7Cit9OworCisvKioKKyAqICAgICAgaTJvX2NudHh0X2xpc3RfZ2V0X3B0ciAtIEdldCBhIGNvbnRleHQgaWQgZnJvbSB0aGUgY29udGV4dCBsaXN0CisgKglAYzogY29udHJvbGxlciB0byB3aGljaCB0aGUgY29udGV4dCBsaXN0IGJlbG9uZworICoJQHB0cjogcG9pbnRlciB0byB3aGljaCB0aGUgY29udGV4dCBpZCBzaG91bGQgYmUgZmV0Y2hlZAorICoKKyAqCVJldHVybnMgY29udGV4dCBpZCB3aGljaCBtYXRjaGVzIHRvIHRoZSBwb2ludGVyIG9uIHN1Y2NlcyBvciAwIG9uCisgKglmYWlsdXJlLgorICovCit1MzIgaTJvX2NudHh0X2xpc3RfZ2V0X3B0cihzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKiBjLCB2b2lkICpwdHIpCit7CisJc3RydWN0IGkyb19jb250ZXh0X2xpc3RfZWxlbWVudCAqZW50cnk7CisJdTMyIGNvbnRleHQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYy0+Y29udGV4dF9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmYy0+Y29udGV4dF9saXN0LCBsaXN0KQorCSAgICBpZiAoZW50cnktPnB0ciA9PSBwdHIpIHsKKwkJY29udGV4dCA9IGVudHJ5LT5jb250ZXh0OworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYy0+Y29udGV4dF9saXN0X2xvY2ssIGZsYWdzKTsKKworCWlmICghY29udGV4dCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCBmaW5kIG5vbmV4aXN0ZW50IHB0ciAiCisJCSAgICAgICAiJXBcbiIsIGMtPm5hbWUsIHB0cik7CisKKwlwcl9kZWJ1ZygiJXM6IGdldCBjb250ZXh0IGlkIGZyb20gY29udGV4dCBsaXN0ICVwIC0+ICVkXG4iLCBjLT5uYW1lLAorCQkgcHRyLCBjb250ZXh0KTsKKworCXJldHVybiBjb250ZXh0OworfTsKKyNlbmRpZgorCisvKioKKyAqCWkyb19pb3BfZmluZCAtIEZpbmQgYW4gSTJPIGNvbnRyb2xsZXIgYnkgaWQKKyAqCUB1bml0OiB1bml0IG51bWJlciBvZiB0aGUgSTJPIGNvbnRyb2xsZXIgdG8gc2VhcmNoIGZvcgorICoKKyAqCUxvb2t1cCB0aGUgSTJPIGNvbnRyb2xsZXIgb24gdGhlIGNvbnRyb2xsZXIgbGlzdC4KKyAqCisgKglSZXR1cm5zIHBvaW50ZXIgdG8gdGhlIEkyTyBjb250cm9sbGVyIG9uIHN1Y2Nlc3Mgb3IgTlVMTCBpZiBub3QgZm91bmQuCisgKi8KK3N0cnVjdCBpMm9fY29udHJvbGxlciAqaTJvX2ZpbmRfaW9wKGludCB1bml0KQoreworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmkyb19jb250cm9sbGVycywgbGlzdCkgeworCQlpZiAoYy0+dW5pdCA9PSB1bml0KQorCQkJcmV0dXJuIGM7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9OworCisvKioKKyAqCWkyb19pb3BfZmluZF9kZXZpY2UgLSBGaW5kIGEgSTJPIGRldmljZSBvbiBhbiBJMk8gY29udHJvbGxlcgorICoJQGM6IEkyTyBjb250cm9sbGVyIHdoZXJlIHRoZSBJMk8gZGV2aWNlIGhhbmdzIG9uCisgKglAdGlkOiBUSUQgb2YgdGhlIEkyTyBkZXZpY2UgdG8gc2VhcmNoIGZvcgorICoKKyAqCVNlYXJjaGVzIHRoZSBkZXZpY2VzIG9mIHRoZSBJMk8gY29udHJvbGxlciBmb3IgYSBkZXZpY2Ugd2l0aCBUSUQgdGlkIGFuZAorICoJcmV0dXJucyBpdC4KKyAqCisgKglSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgSTJPIGRldmljZSBpZiBmb3VuZCwgb3RoZXJ3aXNlIE5VTEwuCisgKi8KK3N0cnVjdCBpMm9fZGV2aWNlICppMm9faW9wX2ZpbmRfZGV2aWNlKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdTE2IHRpZCkKK3sKKwlzdHJ1Y3QgaTJvX2RldmljZSAqZGV2OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZjLT5kZXZpY2VzLCBsaXN0KQorCSAgICBpZiAoZGV2LT5sY3RfZGF0YS50aWQgPT0gdGlkKQorCQlyZXR1cm4gZGV2OworCisJcmV0dXJuIE5VTEw7Cit9OworCisvKioKKyAqCWkyb19xdWllc2NlX2NvbnRyb2xsZXIgLSBxdWllc2NlIGNvbnRyb2xsZXIKKyAqCUBjOiBjb250cm9sbGVyCisgKgorICoJUXVpZXNjZSBhbiBJT1AuIENhdXNlcyBJT1AgdG8gbWFrZSBleHRlcm5hbCBvcGVyYXRpb24gcXVpZXNjZW50CisgKgkoaTJvICdSRUFEWScgc3RhdGUpLiBJbnRlcm5hbCBvcGVyYXRpb24gb2YgdGhlIElPUCBjb250aW51ZXMgbm9ybWFsbHkuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGkyb19pb3BfcXVpZXNjZShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCit7CisJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZzsKKwl1MzIgbTsKKwlpMm9fc3RhdHVzX2Jsb2NrICpzYiA9IGMtPnN0YXR1c19ibG9jay52aXJ0OworCWludCByYzsKKworCWkyb19zdGF0dXNfZ2V0KGMpOworCisJLyogU3lzUXVpZXNjZSBkaXNjYXJkZWQgaWYgSU9QIG5vdCBpbiBSRUFEWSBvciBPUEVSQVRJT05BTCBzdGF0ZSAqLworCWlmICgoc2ItPmlvcF9zdGF0ZSAhPSBBREFQVEVSX1NUQVRFX1JFQURZKSAmJgorCSAgICAoc2ItPmlvcF9zdGF0ZSAhPSBBREFQVEVSX1NUQVRFX09QRVJBVElPTkFMKSkKKwkJcmV0dXJuIDA7CisKKwltID0gaTJvX21zZ19nZXRfd2FpdChjLCAmbXNnLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7CisJaWYgKG0gPT0gSTJPX1FVRVVFX0VNUFRZKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCXdyaXRlbChGT1VSX1dPUkRfTVNHX1NJWkUgfCBTR0xfT0ZGU0VUXzAsICZtc2ctPnUuaGVhZFswXSk7CisJd3JpdGVsKEkyT19DTURfU1lTX1FVSUVTQ0UgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IEFEQVBURVJfVElELAorCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOworCisJLyogTG9uZyB0aW1lb3V0IG5lZWRlZCBmb3IgcXVpZXNjZSBpZiBsb3RzIG9mIGRldmljZXMgKi8KKwlpZiAoKHJjID0gaTJvX21zZ19wb3N0X3dhaXQoYywgbSwgMjQwKSkpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbmFibGUgdG8gcXVpZXNjZSAoc3RhdHVzPSUjeCkuXG4iLAorCQkgICAgICAgYy0+bmFtZSwgLXJjKTsKKwllbHNlCisJCXByX2RlYnVnKCIlczogUXVpZXNjZWQuXG4iLCBjLT5uYW1lKTsKKworCWkyb19zdGF0dXNfZ2V0KGMpOwkvLyBFbnRlcmVkIFJFQURZIHN0YXRlCisKKwlyZXR1cm4gcmM7Cit9OworCisvKioKKyAqCWkyb19pb3BfZW5hYmxlIC0gbW92ZSBjb250cm9sbGVyIGZyb20gcmVhZHkgdG8gT1BFUkFUSU9OQUwKKyAqCUBjOiBJMk8gY29udHJvbGxlcgorICoKKyAqCUVuYWJsZSBJT1AuIFRoaXMgYWxsb3dzIHRoZSBJT1AgdG8gcmVzdW1lIGV4dGVybmFsIG9wZXJhdGlvbnMgYW5kCisgKglyZXZlcnNlcyB0aGUgZWZmZWN0IG9mIGEgcXVpZXNjZS4gUmV0dXJucyB6ZXJvIG9yIGFuIGVycm9yIGNvZGUgaWYKKyAqCWFuIGVycm9yIG9jY3Vycy4KKyAqLworc3RhdGljIGludCBpMm9faW9wX2VuYWJsZShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCit7CisJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZzsKKwl1MzIgbTsKKwlpMm9fc3RhdHVzX2Jsb2NrICpzYiA9IGMtPnN0YXR1c19ibG9jay52aXJ0OworCWludCByYzsKKworCWkyb19zdGF0dXNfZ2V0KGMpOworCisJLyogRW5hYmxlIG9ubHkgYWxsb3dlZCBvbiBSRUFEWSBzdGF0ZSAqLworCWlmIChzYi0+aW9wX3N0YXRlICE9IEFEQVBURVJfU1RBVEVfUkVBRFkpCisJCXJldHVybiAtRUlOVkFMOworCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwl3cml0ZWwoRk9VUl9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF8wLCAmbXNnLT51LmhlYWRbMF0pOworCXdyaXRlbChJMk9fQ01EX1NZU19FTkFCTEUgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IEFEQVBURVJfVElELAorCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOworCisJLyogSG93IGxvbmcgb2YgYSB0aW1lb3V0IGRvIHdlIG5lZWQ/ICovCisJaWYgKChyYyA9IGkyb19tc2dfcG9zdF93YWl0KGMsIG0sIDI0MCkpKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgZW5hYmxlIChzdGF0dXM9JSN4KS5cbiIsCisJCSAgICAgICBjLT5uYW1lLCAtcmMpOworCWVsc2UKKwkJcHJfZGVidWcoIiVzOiBFbmFibGVkLlxuIiwgYy0+bmFtZSk7CisKKwlpMm9fc3RhdHVzX2dldChjKTsJLy8gZW50ZXJlZCBPUEVSQVRJT05BTCBzdGF0ZQorCisJcmV0dXJuIHJjOworfTsKKworLyoqCisgKglpMm9faW9wX3F1aWVzY2VfYWxsIC0gUXVpZXNjZSBhbGwgSTJPIGNvbnRyb2xsZXJzIG9uIHRoZSBzeXN0ZW0KKyAqCisgKglRdWllc2NlIGFsbCBJMk8gY29udHJvbGxlcnMgd2hpY2ggYXJlIGNvbm5lY3RlZCB0byB0aGUgc3lzdGVtLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaTJvX2lvcF9xdWllc2NlX2FsbCh2b2lkKQoreworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjLCB0bXAsICZpMm9fY29udHJvbGxlcnMsIGxpc3QpIHsKKwkJaWYgKCFjLT5ub19xdWllc2NlKQorCQkJaTJvX2lvcF9xdWllc2NlKGMpOworCX0KK307CisKKy8qKgorICoJaTJvX2lvcF9lbmFibGVfYWxsIC0gRW5hYmxlcyBhbGwgY29udHJvbGxlcnMgb24gdGhlIHN5c3RlbQorICoKKyAqCUVuYWJsZXMgYWxsIEkyTyBjb250cm9sbGVycyB3aGljaCBhcmUgY29ubmVjdGVkIHRvIHRoZSBzeXN0ZW0uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpMm9faW9wX2VuYWJsZV9hbGwodm9pZCkKK3sKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYywgdG1wLCAmaTJvX2NvbnRyb2xsZXJzLCBsaXN0KQorCSAgICBpMm9faW9wX2VuYWJsZShjKTsKK307CisKKy8qKgorICoJaTJvX2NsZWFyX2NvbnRyb2xsZXIgLSBCcmluZyBJMk8gY29udHJvbGxlciBpbnRvIEhPTEQgc3RhdGUKKyAqCUBjOiBjb250cm9sbGVyCisgKgorICoJQ2xlYXIgYW4gSU9QIHRvIEhPTEQgc3RhdGUsIGllLiB0ZXJtaW5hdGUgZXh0ZXJuYWwgb3BlcmF0aW9ucywgY2xlYXIgYWxsCisgKglpbnB1dCBxdWV1ZXMgYW5kIHByZXBhcmUgZm9yIGEgc3lzdGVtIHJlc3RhcnQuIElPUCdzIGludGVybmFsIG9wZXJhdGlvbgorICoJY29udGludWVzIG5vcm1hbGx5IGFuZCB0aGUgb3V0Ym91bmQgcXVldWUgaXMgYWxpdmUuIFRoZSBJT1AgaXMgbm90CisgKglleHBlY3RlZCB0byByZWJ1aWxkIGl0cyBMQ1QuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGkyb19pb3BfY2xlYXIoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdTMyIG07CisJaW50IHJjOworCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwkvKiBRdWllc2NlIGFsbCBJT1BzIGZpcnN0ICovCisJaTJvX2lvcF9xdWllc2NlX2FsbCgpOworCisJd3JpdGVsKEZPVVJfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfMCwgJm1zZy0+dS5oZWFkWzBdKTsKKwl3cml0ZWwoSTJPX0NNRF9BREFQVEVSX0NMRUFSIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCBBREFQVEVSX1RJRCwKKwkgICAgICAgJm1zZy0+dS5oZWFkWzFdKTsKKworCWlmICgocmMgPSBpMm9fbXNnX3Bvc3Rfd2FpdChjLCBtLCAzMCkpKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5hYmxlIHRvIGNsZWFyIChzdGF0dXM9JSN4KS5cbiIsCisJCSAgICAgICBjLT5uYW1lLCAtcmMpOworCWVsc2UKKwkJcHJfZGVidWcoIiVzOiBDbGVhcmVkLlxuIiwgYy0+bmFtZSk7CisKKwkvKiBFbmFibGUgYWxsIElPUHMgKi8KKwlpMm9faW9wX2VuYWJsZV9hbGwoKTsKKworCWkyb19zdGF0dXNfZ2V0KGMpOworCisJcmV0dXJuIHJjOworfQorCisvKioKKyAqCWkyb19pb3BfcmVzZXQgLSByZXNldCBhbiBJMk8gY29udHJvbGxlcgorICoJQGM6IGNvbnRyb2xsZXIgdG8gcmVzZXQKKyAqCisgKglSZXNldCB0aGUgSU9QIGludG8gSU5JVCBzdGF0ZSBhbmQgd2FpdCB1bnRpbCBJT1AgZ2V0cyBpbnRvIFJFU0VUIHN0YXRlLgorICoJVGVybWluYXRlIGFsbCBleHRlcm5hbCBvcGVyYXRpb25zLCBjbGVhciBJT1AncyBpbmJvdW5kIGFuZCBvdXRib3VuZAorICoJcXVldWVzLCB0ZXJtaW5hdGUgYWxsIERETXMsIGFuZCByZWxvYWQgdGhlIElPUCdzIG9wZXJhdGluZyBlbnZpcm9ubWVudAorICoJYW5kIGFsbCBsb2NhbCBERE1zLiBUaGUgSU9QIHJlYnVpbGRzIGl0cyBMQ1QuCisgKi8KK3N0YXRpYyBpbnQgaTJvX2lvcF9yZXNldChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCit7CisJdTggKnN0YXR1cyA9IGMtPnN0YXR1cy52aXJ0OworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdTMyIG07CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWkyb19zdGF0dXNfYmxvY2sgKnNiID0gYy0+c3RhdHVzX2Jsb2NrLnZpcnQ7CisJaW50IHJjID0gMDsKKworCXByX2RlYnVnKCIlczogUmVzZXR0aW5nIGNvbnRyb2xsZXJcbiIsIGMtPm5hbWUpOworCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwltZW1zZXQoc3RhdHVzLCAwLCA4KTsKKworCS8qIFF1aWVzY2UgYWxsIElPUHMgZmlyc3QgKi8KKwlpMm9faW9wX3F1aWVzY2VfYWxsKCk7CisKKwl3cml0ZWwoRUlHSFRfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfMCwgJm1zZy0+dS5oZWFkWzBdKTsKKwl3cml0ZWwoSTJPX0NNRF9BREFQVEVSX1JFU0VUIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCBBREFQVEVSX1RJRCwKKwkgICAgICAgJm1zZy0+dS5oZWFkWzFdKTsKKwl3cml0ZWwoaTJvX2V4ZWNfZHJpdmVyLmNvbnRleHQsICZtc2ctPnUucy5pY250eHQpOworCXdyaXRlbCgwLCAmbXNnLT51LnMudGNudHh0KTsJLy9GSVhNRTogdXNlIHJlYXNvbmFibGUgdHJhbnNhY3Rpb24gY29udGV4dAorCXdyaXRlbCgwLCAmbXNnLT5ib2R5WzBdKTsKKwl3cml0ZWwoMCwgJm1zZy0+Ym9keVsxXSk7CisJd3JpdGVsKGkyb19wdHJfbG93KCh2b2lkICopYy0+c3RhdHVzLnBoeXMpLCAmbXNnLT5ib2R5WzJdKTsKKwl3cml0ZWwoaTJvX3B0cl9oaWdoKCh2b2lkICopYy0+c3RhdHVzLnBoeXMpLCAmbXNnLT5ib2R5WzNdKTsKKworCWkyb19tc2dfcG9zdChjLCBtKTsKKworCS8qIFdhaXQgZm9yIGEgcmVwbHkgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIEkyT19USU1FT1VUX1JFU0VUICogSFo7CisJd2hpbGUgKCEqc3RhdHVzKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJT1AgcmVzZXQgdGltZW91dC5cbiIsIGMtPm5hbWUpOworCQkJcmMgPSAtRVRJTUVET1VUOworCQkJZ290byBleGl0OworCQl9CisKKwkJLyogUHJvbWlzZSBidWcgKi8KKwkJaWYgKHN0YXR1c1sxXSB8fCBzdGF0dXNbNF0pIHsKKwkJCSpzdGF0dXMgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisKKwkJcm1iKCk7CisJfQorCisJaWYgKCpzdGF0dXMgPT0gSTJPX0NNRF9JTl9QUk9HUkVTUykgeworCQkvKgorCQkgKiBPbmNlIHRoZSByZXNldCBpcyBzZW50LCB0aGUgSU9QIGdvZXMgaW50byB0aGUgSU5JVCBzdGF0ZQorCQkgKiB3aGljaCBpcyBpbmRldGVybWluYXRlLiAgV2UgbmVlZCB0byB3YWl0IHVudGlsIHRoZSBJT1AKKwkJICogaGFzIHJlYm9vdGVkIGJlZm9yZSB3ZSBjYW4gbGV0IHRoZSBzeXN0ZW0gdGFsayB0bworCQkgKiBpdC4gV2UgcmVhZCB0aGUgaW5ib3VuZCBGcmVlX0xpc3QgdW50aWwgYSBtZXNzYWdlIGlzCisJCSAqIGF2YWlsYWJsZS4gSWYgd2UgY2FuJ3QgcmVhZCBvbmUgaW4gdGhlIGdpdmVuIGFtbW91bnQgb2YKKwkJICogdGltZSwgd2UgYXNzdW1lIHRoZSBJT1AgY291bGQgbm90IHJlYm9vdCBwcm9wZXJseS4KKwkJICovCisJCXByX2RlYnVnKCIlczogUmVzZXQgaW4gcHJvZ3Jlc3MsIHdhaXRpbmcgZm9yIHJlYm9vdC4uLlxuIiwKKwkJCSBjLT5uYW1lKTsKKworCQltID0gaTJvX21zZ19nZXRfd2FpdChjLCAmbXNnLCBJMk9fVElNRU9VVF9SRVNFVCk7CisJCXdoaWxlIChtID09IEkyT19RVUVVRV9FTVBUWSkgeworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJT1AgcmVzZXQgdGltZW91dC5cbiIsCisJCQkJICAgICAgIGMtPm5hbWUpOworCQkJCXJjID0gLUVUSU1FRE9VVDsKKwkJCQlnb3RvIGV4aXQ7CisJCQl9CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCisJCQltID0gaTJvX21zZ19nZXRfd2FpdChjLCAmbXNnLCBJMk9fVElNRU9VVF9SRVNFVCk7CisJCX0KKwkJaTJvX21zZ19ub3AoYywgbSk7CisJfQorCisJLyogZnJvbSBoZXJlIGFsbCBxdWllc2NlIGNvbW1hbmRzIGFyZSBzYWZlICovCisJYy0+bm9fcXVpZXNjZSA9IDA7CisKKwkvKiBJZiBJb3BSZXNldCB3YXMgcmVqZWN0ZWQgb3IgZGlkbid0IHBlcmZvcm0gcmVzZXQsIHRyeSBJb3BDbGVhciAqLworCWkyb19zdGF0dXNfZ2V0KGMpOworCWlmICgqc3RhdHVzID09IEkyT19DTURfUkVKRUNURUQgfHwgc2ItPmlvcF9zdGF0ZSAhPSBBREFQVEVSX1NUQVRFX1JFU0VUKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZXNldCByZWplY3RlZCwgdHJ5aW5nIHRvIGNsZWFyXG4iLAorCQkgICAgICAgYy0+bmFtZSk7CisJCWkyb19pb3BfY2xlYXIoYyk7CisJfSBlbHNlCisJCXByX2RlYnVnKCIlczogUmVzZXQgY29tcGxldGVkLlxuIiwgYy0+bmFtZSk7CisKKyAgICAgIGV4aXQ6CisJLyogRW5hYmxlIGFsbCBJT1BzICovCisJaTJvX2lvcF9lbmFibGVfYWxsKCk7CisKKwlyZXR1cm4gcmM7Cit9OworCisvKioKKyAqCWkyb19pb3BfaW5pdF9vdXRib3VuZF9xdWV1ZSAtIHNldHVwIHRoZSBvdXRib3VuZCBtZXNzYWdlIHF1ZXVlCisgKglAYzogSTJPIGNvbnRyb2xsZXIKKyAqCisgKglDbGVhciBhbmQgKHJlKWluaXRpYWxpemUgSU9QJ3Mgb3V0Ym91bmQgcXVldWUgYW5kIHBvc3QgdGhlIG1lc3NhZ2UKKyAqCWZyYW1lcyB0byB0aGUgSU9QLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJybm8gY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGkyb19pb3BfaW5pdF9vdXRib3VuZF9xdWV1ZShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCit7CisJdTggKnN0YXR1cyA9IGMtPnN0YXR1cy52aXJ0OworCXUzMiBtOworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdWxvbmcgdGltZW91dDsKKwlpbnQgaTsKKworCXByX2RlYnVnKCIlczogSW5pdGlhbGl6aW5nIE91dGJvdW5kIFF1ZXVlLi4uXG4iLCBjLT5uYW1lKTsKKworCW1lbXNldChzdGF0dXMsIDAsIDQpOworCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwl3cml0ZWwoRUlHSFRfV09SRF9NU0dfU0laRSB8IFRSTF9PRkZTRVRfNiwgJm1zZy0+dS5oZWFkWzBdKTsKKwl3cml0ZWwoSTJPX0NNRF9PVVRCT1VORF9JTklUIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCBBREFQVEVSX1RJRCwKKwkgICAgICAgJm1zZy0+dS5oZWFkWzFdKTsKKwl3cml0ZWwoaTJvX2V4ZWNfZHJpdmVyLmNvbnRleHQsICZtc2ctPnUucy5pY250eHQpOworCXdyaXRlbCgweDAxMDYsICZtc2ctPnUucy50Y250eHQpOwkvKiBGSVhNRTogd2h5IDB4MDEwNiwgbWF5YmUgaW4KKwkJCQkJCSAgIFNwZWM/ICovCisJd3JpdGVsKFBBR0VfU0laRSwgJm1zZy0+Ym9keVswXSk7CisJd3JpdGVsKE1TR19GUkFNRV9TSVpFIDw8IDE2IHwgMHg4MCwgJm1zZy0+Ym9keVsxXSk7CS8qIE91dGJvdW5kIG1zZyBmcmFtZQorCQkJCQkJCQkgICBzaXplIGluIHdvcmRzIGFuZCBJbml0Y29kZSAqLworCXdyaXRlbCgweGQwMDAwMDA0LCAmbXNnLT5ib2R5WzJdKTsKKwl3cml0ZWwoaTJvX3B0cl9sb3coKHZvaWQgKiljLT5zdGF0dXMucGh5cyksICZtc2ctPmJvZHlbM10pOworCXdyaXRlbChpMm9fcHRyX2hpZ2goKHZvaWQgKiljLT5zdGF0dXMucGh5cyksICZtc2ctPmJvZHlbNF0pOworCisJaTJvX21zZ19wb3N0KGMsIG0pOworCisJdGltZW91dCA9IGppZmZpZXMgKyBJMk9fVElNRU9VVF9JTklUX09VVEJPVU5EX1FVRVVFICogSFo7CisJd2hpbGUgKCpzdGF0dXMgPD0gSTJPX0NNRF9JTl9QUk9HUkVTUykgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRpbWVvdXQgSW5pdGlhbGl6aW5nXG4iLAorCQkJICAgICAgIGMtPm5hbWUpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCisJCXJtYigpOworCX0KKworCW0gPSBjLT5vdXRfcXVldWUucGh5czsKKworCS8qIFBvc3QgZnJhbWVzICovCisJZm9yIChpID0gMDsgaSA8IE5NQlJfTVNHX0ZSQU1FUzsgaSsrKSB7CisJCWkyb19mbHVzaF9yZXBseShjLCBtKTsKKwkJdWRlbGF5KDEpOwkvKiBQcm9taXNlICovCisJCW0gKz0gTVNHX0ZSQU1FX1NJWkUgKiA0OworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqCWkyb19pb3Bfc2VuZF9ub3AgLSBzZW5kIGEgY29yZSBOT1AgbWVzc2FnZQorICoJQGM6IGNvbnRyb2xsZXIKKyAqCisgKglTZW5kIGEgbm8tb3BlcmF0aW9uIG1lc3NhZ2Ugd2l0aCBhIHJlcGx5IHNldCB0byBjYXVzZSBubworICoJYWN0aW9uIGVpdGhlci4gTmVlZGVkIGZvciBicmluZ2luZyB1cCBwcm9taXNlIGNvbnRyb2xsZXJzLgorICovCitzdGF0aWMgaW50IGkyb19pb3Bfc2VuZF9ub3Aoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdTMyIG0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEhaKTsKKwlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCXJldHVybiAtRVRJTUVET1VUOworCWkyb19tc2dfbm9wKGMsIG0pOworCXJldHVybiAwOworfQorCisvKioKKyAqCWkyb19pb3BfYWN0aXZhdGUgLSBCcmluZyBjb250cm9sbGVyIHVwIHRvIEhPTEQKKyAqCUBjOiBjb250cm9sbGVyCisgKgorICoJVGhpcyBmdW5jdGlvbiBicmluZ3MgYW4gSTJPIGNvbnRyb2xsZXIgaW50byBIT0xEIHN0YXRlLiBUaGUgYWRhcHRlcgorICoJaXMgcmVzZXQgaWYgbmVjZXNzYXJ5IGFuZCB0aGVuIHRoZSBxdWV1ZXMgYW5kIHJlc291cmNlIHRhYmxlIGFyZSByZWFkLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpMm9faW9wX2FjdGl2YXRlKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYykKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqaTk2MCA9IE5VTEw7CisJaTJvX3N0YXR1c19ibG9jayAqc2IgPSBjLT5zdGF0dXNfYmxvY2sudmlydDsKKwlpbnQgcmM7CisKKwlpZiAoYy0+cHJvbWlzZSkgeworCQkvKiBCZWF0IHVwIHRoZSBoYXJkd2FyZSBmaXJzdCBvZiBhbGwgKi8KKwkJaTk2MCA9CisJCSAgICBwY2lfZmluZF9zbG90KGMtPnBkZXYtPmJ1cy0+bnVtYmVyLAorCQkJCSAgUENJX0RFVkZOKFBDSV9TTE9UKGMtPnBkZXYtPmRldmZuKSwgMCkpOworCQlpZiAoaTk2MCkKKwkJCXBjaV93cml0ZV9jb25maWdfd29yZChpOTYwLCAweDQyLCAwKTsKKworCQkvKiBGb2xsb3cgdGhpcyBzZXF1ZW5jZSBwcmVjaXNlbHkgb3IgdGhlIGNvbnRyb2xsZXIKKwkJICAgY2Vhc2VzIHRvIHBlcmZvcm0gdXNlZnVsIGZ1bmN0aW9ucyB1bnRpbCByZWJvb3QgKi8KKwkJaWYgKChyYyA9IGkyb19pb3Bfc2VuZF9ub3AoYykpKQorCQkJcmV0dXJuIHJjOworCisJCWlmICgocmMgPSBpMm9faW9wX3Jlc2V0KGMpKSkKKwkJCXJldHVybiByYzsKKwl9CisKKwkvKiBJbiBJTklUIHN0YXRlLCBXYWl0IEluYm91bmQgUSB0byBpbml0aWFsaXplIChpbiBpMm9fc3RhdHVzX2dldCkgKi8KKwkvKiBJbiBSRUFEWSBzdGF0ZSwgR2V0IHN0YXR1cyAqLworCisJcmMgPSBpMm9fc3RhdHVzX2dldChjKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVuYWJsZSB0byBvYnRhaW4gc3RhdHVzLCAiCisJCSAgICAgICAiYXR0ZW1wdGluZyBhIHJlc2V0LlxuIiwgYy0+bmFtZSk7CisJCWlmIChpMm9faW9wX3Jlc2V0KGMpKQorCQkJcmV0dXJuIHJjOworCX0KKworCWlmIChzYi0+aTJvX3ZlcnNpb24gPiBJMk9WRVIxNSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBOb3QgcnVubmluZyB2ZXJzaW9uIDEuNSBvZiB0aGUgSTJPICIKKwkJICAgICAgICJTcGVjaWZpY2F0aW9uLlxuIiwgYy0+bmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXN3aXRjaCAoc2ItPmlvcF9zdGF0ZSkgeworCWNhc2UgQURBUFRFUl9TVEFURV9GQVVMVEVEOgorCQlwcmludGsoS0VSTl9DUklUICIlczogaGFyZHdhcmUgZmF1bHRcbiIsIGMtPm5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKworCWNhc2UgQURBUFRFUl9TVEFURV9SRUFEWToKKwljYXNlIEFEQVBURVJfU1RBVEVfT1BFUkFUSU9OQUw6CisJY2FzZSBBREFQVEVSX1NUQVRFX0hPTEQ6CisJY2FzZSBBREFQVEVSX1NUQVRFX0ZBSUxFRDoKKwkJcHJfZGVidWcoIiVzOiBhbHJlYWR5IHJ1bm5pbmcsIHRyeWluZyB0byByZXNldC4uLlxuIiwgYy0+bmFtZSk7CisJCWlmIChpMm9faW9wX3Jlc2V0KGMpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmMgPSBpMm9faW9wX2luaXRfb3V0Ym91bmRfcXVldWUoYyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoYy0+cHJvbWlzZSkgeworCQlpZiAoKHJjID0gaTJvX2lvcF9zZW5kX25vcChjKSkpCisJCQlyZXR1cm4gcmM7CisKKwkJaWYgKChyYyA9IGkyb19zdGF0dXNfZ2V0KGMpKSkKKwkJCXJldHVybiByYzsKKworCQlpZiAoaTk2MCkKKwkJCXBjaV93cml0ZV9jb25maWdfd29yZChpOTYwLCAweDQyLCAweDNGRik7CisJfQorCisJLyogSW4gSE9MRCBzdGF0ZSAqLworCisJcmMgPSBpMm9faHJ0X2dldChjKTsKKworCXJldHVybiByYzsKK307CisKKy8qKgorICoJaTJvX2lvcF9zeXN0YWJfc2V0IC0gU2V0IHRoZSBJMk8gU3lzdGVtIFRhYmxlIG9mIHRoZSBzcGVjaWZpZWQgSU9QCisgKglAYzogSTJPIGNvbnRyb2xsZXIgdG8gd2hpY2ggdGhlIHN5c3RlbSB0YWJsZSBzaG91bGQgYmUgc2VuZAorICoKKyAqCUJlZm9yZSB0aGUgc3lzdGFiIGNvdWxkIGJlIHNldCBpMm9fc3lzdGFiX2J1aWxkKCkgbXVzdCBiZSBjYWxsZWQuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGkyb19pb3Bfc3lzdGFiX3NldChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCit7CisJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZzsKKwl1MzIgbTsKKwlpMm9fc3RhdHVzX2Jsb2NrICpzYiA9IGMtPnN0YXR1c19ibG9jay52aXJ0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjLT5wZGV2LT5kZXY7CisJc3RydWN0IHJlc291cmNlICpyb290OworCWludCByYzsKKworCWlmIChzYi0+Y3VycmVudF9tZW1fc2l6ZSA8IHNiLT5kZXNpcmVkX21lbV9zaXplKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmMtPm1lbV9yZXNvdXJjZTsKKwkJcmVzLT5uYW1lID0gYy0+cGRldi0+YnVzLT5uYW1lOworCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisJCXJlcy0+c3RhcnQgPSAwOworCQlyZXMtPmVuZCA9IDA7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiByZXF1aXJlcyBwcml2YXRlIG1lbW9yeSByZXNvdXJjZXMuXG4iLAorCQkgICAgICAgYy0+bmFtZSk7CisJCXJvb3QgPSBwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UoYy0+cGRldiwgcmVzKTsKKwkJaWYgKHJvb3QgPT0gTlVMTCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW4ndCBmaW5kIHBhcmVudCByZXNvdXJjZSFcbiIsCisJCQkgICAgICAgYy0+bmFtZSk7CisJCWlmIChyb290ICYmIGFsbG9jYXRlX3Jlc291cmNlKHJvb3QsIHJlcywgc2ItPmRlc2lyZWRfbWVtX3NpemUsIHNiLT5kZXNpcmVkX21lbV9zaXplLCBzYi0+ZGVzaXJlZF9tZW1fc2l6ZSwgMSA8PCAyMCwJLyogVW5zcGVjaWZpZWQsIHNvIHVzZSAxTWIgYW5kIHBsYXkgc2FmZSAqLworCQkJCQkgICAgICBOVUxMLCBOVUxMKSA+PSAwKSB7CisJCQljLT5tZW1fYWxsb2MgPSAxOworCQkJc2ItPmN1cnJlbnRfbWVtX3NpemUgPSAxICsgcmVzLT5lbmQgLSByZXMtPnN0YXJ0OworCQkJc2ItPmN1cnJlbnRfbWVtX2Jhc2UgPSByZXMtPnN0YXJ0OworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGFsbG9jYXRlZCAlbGQgYnl0ZXMgb2YgUENJIG1lbW9yeSIKKwkJCSAgICAgICAiIGF0IDB4JTA4bFguXG4iLCBjLT5uYW1lLAorCQkJICAgICAgIDEgKyByZXMtPmVuZCAtIHJlcy0+c3RhcnQsIHJlcy0+c3RhcnQpOworCQl9CisJfQorCisJaWYgKHNiLT5jdXJyZW50X2lvX3NpemUgPCBzYi0+ZGVzaXJlZF9pb19zaXplKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmMtPmlvX3Jlc291cmNlOworCQlyZXMtPm5hbWUgPSBjLT5wZGV2LT5idXMtPm5hbWU7CisJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX0lPOworCQlyZXMtPnN0YXJ0ID0gMDsKKwkJcmVzLT5lbmQgPSAwOworCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVxdWlyZXMgcHJpdmF0ZSBtZW1vcnkgcmVzb3VyY2VzLlxuIiwKKwkJICAgICAgIGMtPm5hbWUpOworCQlyb290ID0gcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGMtPnBkZXYsIHJlcyk7CisJCWlmIChyb290ID09IE5VTEwpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2FuJ3QgZmluZCBwYXJlbnQgcmVzb3VyY2UhXG4iLAorCQkJICAgICAgIGMtPm5hbWUpOworCQlpZiAocm9vdCAmJiBhbGxvY2F0ZV9yZXNvdXJjZShyb290LCByZXMsIHNiLT5kZXNpcmVkX2lvX3NpemUsIHNiLT5kZXNpcmVkX2lvX3NpemUsIHNiLT5kZXNpcmVkX2lvX3NpemUsIDEgPDwgMjAsCS8qIFVuc3BlY2lmaWVkLCBzbyB1c2UgMU1iIGFuZCBwbGF5IHNhZmUgKi8KKwkJCQkJICAgICAgTlVMTCwgTlVMTCkgPj0gMCkgeworCQkJYy0+aW9fYWxsb2MgPSAxOworCQkJc2ItPmN1cnJlbnRfaW9fc2l6ZSA9IDEgKyByZXMtPmVuZCAtIHJlcy0+c3RhcnQ7CisJCQlzYi0+Y3VycmVudF9tZW1fYmFzZSA9IHJlcy0+c3RhcnQ7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogYWxsb2NhdGVkICVsZCBieXRlcyBvZiBQQ0kgSS9PIGF0IgorCQkJICAgICAgICIgMHglMDhsWC5cbiIsIGMtPm5hbWUsCisJCQkgICAgICAgMSArIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCwgcmVzLT5zdGFydCk7CisJCX0KKwl9CisKKwltID0gaTJvX21zZ19nZXRfd2FpdChjLCAmbXNnLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7CisJaWYgKG0gPT0gSTJPX1FVRVVFX0VNUFRZKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCWkyb19zeXN0YWIucGh5cyA9IGRtYV9tYXBfc2luZ2xlKGRldiwgaTJvX3N5c3RhYi52aXJ0LCBpMm9fc3lzdGFiLmxlbiwKKwkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCWlmICghaTJvX3N5c3RhYi5waHlzKSB7CisJCWkyb19tc2dfbm9wKGMsIG0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl3cml0ZWwoSTJPX01FU1NBR0VfU0laRSgxMikgfCBTR0xfT0ZGU0VUXzYsICZtc2ctPnUuaGVhZFswXSk7CisJd3JpdGVsKEkyT19DTURfU1lTX1RBQl9TRVQgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IEFEQVBURVJfVElELAorCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOworCisJLyoKKwkgKiBQcm92aWRlIHRocmVlIFNHTC1lbGVtZW50czoKKwkgKiBTeXN0ZW0gdGFibGUgKFN5c1RhYiksIFByaXZhdGUgbWVtb3J5IHNwYWNlIGRlY2xhcmF0aW9uIGFuZAorCSAqIFByaXZhdGUgaS9vIHNwYWNlIGRlY2xhcmF0aW9uCisJICoKKwkgKiBGSVhNRTogaXMgdGhpcyBzdGlsbCB0cnVlPworCSAqIE5hc3R5IG9uZSBoZXJlLiBXZSBjYW4ndCB1c2UgZG1hX2FsbG9jX2NvaGVyZW50IHRvIHNlbmQgdGhlCisJICogc2FtZSB0YWJsZSB0byBldmVyeW9uZS4gV2UgaGF2ZSB0byBnbyByZW1hcCBpdCBmb3IgdGhlbSBhbGwKKwkgKi8KKworCXdyaXRlbChjLT51bml0ICsgMiwgJm1zZy0+Ym9keVswXSk7CisJd3JpdGVsKDAsICZtc2ctPmJvZHlbMV0pOworCXdyaXRlbCgweDU0MDAwMDAwIHwgaTJvX3N5c3RhYi5sZW4sICZtc2ctPmJvZHlbMl0pOworCXdyaXRlbChpMm9fc3lzdGFiLnBoeXMsICZtc2ctPmJvZHlbM10pOworCXdyaXRlbCgweDU0MDAwMDAwIHwgc2ItPmN1cnJlbnRfbWVtX3NpemUsICZtc2ctPmJvZHlbNF0pOworCXdyaXRlbChzYi0+Y3VycmVudF9tZW1fYmFzZSwgJm1zZy0+Ym9keVs1XSk7CisJd3JpdGVsKDB4ZDQwMDAwMDAgfCBzYi0+Y3VycmVudF9pb19zaXplLCAmbXNnLT5ib2R5WzZdKTsKKwl3cml0ZWwoc2ItPmN1cnJlbnRfaW9fYmFzZSwgJm1zZy0+Ym9keVs2XSk7CisKKwlyYyA9IGkyb19tc2dfcG9zdF93YWl0KGMsIG0sIDEyMCk7CisKKwlkbWFfdW5tYXBfc2luZ2xlKGRldiwgaTJvX3N5c3RhYi5waHlzLCBpMm9fc3lzdGFiLmxlbiwKKwkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKworCWlmIChyYyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBzZXQgU3lzVGFiIChzdGF0dXM9JSN4KS5cbiIsCisJCSAgICAgICBjLT5uYW1lLCAtcmMpOworCWVsc2UKKwkJcHJfZGVidWcoIiVzOiBTeXNUYWIgc2V0LlxuIiwgYy0+bmFtZSk7CisKKwlpMm9fc3RhdHVzX2dldChjKTsJLy8gRW50ZXJlZCBSRUFEWSBzdGF0ZQorCisJcmV0dXJuIHJjOworfQorCisvKioKKyAqCWkyb19pb3Bfb25saW5lIC0gQnJpbmcgYSBjb250cm9sbGVyIG9ubGluZSBpbnRvIE9QRVJBVElPTkFMIHN0YXRlLgorICoJQGM6IEkyTyBjb250cm9sbGVyCisgKgorICoJU2VuZCB0aGUgc3lzdGVtIHRhYmxlIGFuZCBlbmFibGUgdGhlIEkyTyBjb250cm9sbGVyLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlciBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgaTJvX2lvcF9vbmxpbmUoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCWludCByYzsKKworCXJjID0gaTJvX2lvcF9zeXN0YWJfc2V0KGMpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogSW4gUkVBRFkgc3RhdGUgKi8KKwlwcl9kZWJ1ZygiJXM6IEF0dGVtcHRpbmcgdG8gZW5hYmxlLi4uXG4iLCBjLT5uYW1lKTsKKwlyYyA9IGkyb19pb3BfZW5hYmxlKGMpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIDA7Cit9OworCisvKioKKyAqCWkyb19pb3BfcmVtb3ZlIC0gUmVtb3ZlIHRoZSBJMk8gY29udHJvbGxlciBmcm9tIHRoZSBJMk8gY29yZQorICoJQGM6IEkyTyBjb250cm9sbGVyCisgKgorICoJUmVtb3ZlIHRoZSBJMk8gY29udHJvbGxlciBmcm9tIHRoZSBJMk8gY29yZS4gSWYgZGV2aWNlcyBhcmUgYXR0YWNoZWQgdG8KKyAqCXRoZSBjb250cm9sbGVyIHJlbW92ZSB0aGVzZSBhbHNvIGFuZCBmaW5hbGx5IHJlc2V0IHRoZSBjb250cm9sbGVyLgorICovCit2b2lkIGkyb19pb3BfcmVtb3ZlKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYykKK3sKKwlzdHJ1Y3QgaTJvX2RldmljZSAqZGV2LCAqdG1wOworCisJcHJfZGVidWcoIiVzOiBkZWxldGluZyBjb250cm9sbGVyXG4iLCBjLT5uYW1lKTsKKworCWkyb19kcml2ZXJfbm90aWZ5X2NvbnRyb2xsZXJfcmVtb3ZlX2FsbChjKTsKKworCWxpc3RfZGVsKCZjLT5saXN0KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXYsIHRtcCwgJmMtPmRldmljZXMsIGxpc3QpCisJICAgIGkyb19kZXZpY2VfcmVtb3ZlKGRldik7CisKKwkvKiBBc2sgdGhlIElPUCB0byBzd2l0Y2ggdG8gUkVTRVQgc3RhdGUgKi8KKwlpMm9faW9wX3Jlc2V0KGMpOworfQorCisvKioKKyAqCWkyb19zeXN0YWJfYnVpbGQgLSBCdWlsZCBzeXN0ZW0gdGFibGUKKyAqCisgKglUaGUgc3lzdGVtIHRhYmxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGFsbCB0aGUgSU9QcyBpbiB0aGUgc3lzdGVtCisgKgkoZHVoKSBhbmQgaXMgdXNlZCBieSB0aGUgRXhlY3V0aXZlcyBvbiB0aGUgSU9QcyB0byBlc3RhYmxpc2ggcGVlcjJwZWVyCisgKgljb25uZWN0aW9ucy4gV2UncmUgbm90IHN1cHBvcnRpbmcgcGVlcjJwZWVyIGF0IHRoZSBtb21lbnQsIGJ1dCB0aGlzCisgKgl3aWxsIGJlIG5lZWRlZCBkb3duIHRoZSByb2FkIGZvciB0aGluZ3MgbGlrZSBsYW4ybGFuIGZvcndhcmRpbmcuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGkyb19zeXN0YWJfYnVpbGQodm9pZCkKK3sKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsICp0bXA7CisJaW50IG51bV9jb250cm9sbGVycyA9IDA7CisJdTMyIGNoYW5nZV9pbmQgPSAwOworCWludCBjb3VudCA9IDA7CisJc3RydWN0IGkyb19zeXNfdGJsICpzeXN0YWIgPSBpMm9fc3lzdGFiLnZpcnQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYywgdG1wLCAmaTJvX2NvbnRyb2xsZXJzLCBsaXN0KQorCSAgICBudW1fY29udHJvbGxlcnMrKzsKKworCWlmIChzeXN0YWIpIHsKKwkJY2hhbmdlX2luZCA9IHN5c3RhYi0+Y2hhbmdlX2luZDsKKwkJa2ZyZWUoaTJvX3N5c3RhYi52aXJ0KTsKKwl9CisKKwkvKiBIZWFkZXIgKyBJT1BzICovCisJaTJvX3N5c3RhYi5sZW4gPSBzaXplb2Yoc3RydWN0IGkyb19zeXNfdGJsKSArIG51bV9jb250cm9sbGVycyAqCisJICAgIHNpemVvZihzdHJ1Y3QgaTJvX3N5c190YmxfZW50cnkpOworCisJc3lzdGFiID0gaTJvX3N5c3RhYi52aXJ0ID0ga21hbGxvYyhpMm9fc3lzdGFiLmxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzeXN0YWIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpMm86IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFN5c3RlbSAiCisJCSAgICAgICAiVGFibGVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHN5c3RhYiwgMCwgaTJvX3N5c3RhYi5sZW4pOworCisJc3lzdGFiLT52ZXJzaW9uID0gSTJPVkVSU0lPTjsKKwlzeXN0YWItPmNoYW5nZV9pbmQgPSBjaGFuZ2VfaW5kICsgMTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjLCB0bXAsICZpMm9fY29udHJvbGxlcnMsIGxpc3QpIHsKKwkJaTJvX3N0YXR1c19ibG9jayAqc2I7CisKKwkJaWYgKGNvdW50ID49IG51bV9jb250cm9sbGVycykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJpMm86IGNvbnRyb2xsZXIgYWRkZWQgd2hpbGUgYnVpbGRpbmcgIgorCQkJICAgICAgICJzeXN0ZW0gdGFibGVcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQlzYiA9IGMtPnN0YXR1c19ibG9jay52aXJ0OworCisJCS8qCisJCSAqIEdldCB1cGRhdGVkIElPUCBzdGF0ZSBzbyB3ZSBoYXZlIHRoZSBsYXRlc3QgaW5mb3JtYXRpb24KKwkJICoKKwkJICogV2Ugc2hvdWxkIGRlbGV0ZSB0aGUgY29udHJvbGxlciBhdCB0aGlzIHBvaW50IGlmIGl0CisJCSAqIGRvZXNuJ3QgcmVzcG9uZCBzaW5jZSBpZiBpdCdzIG5vdCBvbiB0aGUgc3lzdGVtIHRhYmxlCisJCSAqIGl0IGlzIHRlY2huaW5pY2FsbHkgbm90IHBhcnQgb2YgdGhlIEkyTyBzdWJzeXN0ZW0uLi4KKwkJICovCisJCWlmICh1bmxpa2VseShpMm9fc3RhdHVzX2dldChjKSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IERlbGV0aW5nIGIvYyBjb3VsZCBub3QgZ2V0IHN0YXR1cyIKKwkJCSAgICAgICAiIHdoaWxlIGF0dGVtcHRpbmcgdG8gYnVpbGQgc3lzdGVtIHRhYmxlXG4iLAorCQkJICAgICAgIGMtPm5hbWUpOworCQkJaTJvX2lvcF9yZW1vdmUoYyk7CisJCQljb250aW51ZTsJLy8gdHJ5IHRoZSBuZXh0IG9uZQorCQl9CisKKwkJc3lzdGFiLT5pb3BzW2NvdW50XS5vcmdfaWQgPSBzYi0+b3JnX2lkOworCQlzeXN0YWItPmlvcHNbY291bnRdLmlvcF9pZCA9IGMtPnVuaXQgKyAyOworCQlzeXN0YWItPmlvcHNbY291bnRdLnNlZ19udW0gPSAwOworCQlzeXN0YWItPmlvcHNbY291bnRdLmkyb192ZXJzaW9uID0gc2ItPmkyb192ZXJzaW9uOworCQlzeXN0YWItPmlvcHNbY291bnRdLmlvcF9zdGF0ZSA9IHNiLT5pb3Bfc3RhdGU7CisJCXN5c3RhYi0+aW9wc1tjb3VudF0ubXNnX3R5cGUgPSBzYi0+bXNnX3R5cGU7CisJCXN5c3RhYi0+aW9wc1tjb3VudF0uZnJhbWVfc2l6ZSA9IHNiLT5pbmJvdW5kX2ZyYW1lX3NpemU7CisJCXN5c3RhYi0+aW9wc1tjb3VudF0ubGFzdF9jaGFuZ2VkID0gY2hhbmdlX2luZDsKKwkJc3lzdGFiLT5pb3BzW2NvdW50XS5pb3BfY2FwYWJpbGl0aWVzID0gc2ItPmlvcF9jYXBhYmlsaXRpZXM7CisJCXN5c3RhYi0+aW9wc1tjb3VudF0uaW5ib3VuZF9sb3cgPSBpMm9fcHRyX2xvdyhjLT5wb3N0X3BvcnQpOworCQlzeXN0YWItPmlvcHNbY291bnRdLmluYm91bmRfaGlnaCA9IGkyb19wdHJfaGlnaChjLT5wb3N0X3BvcnQpOworCisJCWNvdW50Kys7CisJfQorCisJc3lzdGFiLT5udW1fZW50cmllcyA9IGNvdW50OworCisJcmV0dXJuIDA7Cit9OworCisvKioKKyAqCWkyb19wYXJzZV9ocnQgLSBQYXJzZSB0aGUgaGFyZHdhcmUgcmVzb3VyY2UgdGFibGUuCisgKglAYzogSTJPIGNvbnRyb2xsZXIKKyAqCisgKglXZSBkb24ndCBkbyBhbnl0aGluZyB3aXRoIGl0IGV4Y2VwdCBkdW1waW5nIGl0IChpbiBkZWJ1ZyBtb2RlKS4KKyAqCisgKglSZXR1cm5zIDAuCisgKi8KK3N0YXRpYyBpbnQgaTJvX3BhcnNlX2hydChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCit7CisJaTJvX2R1bXBfaHJ0KGMpOworCXJldHVybiAwOworfTsKKworLyoqCisgKglpMm9fc3RhdHVzX2dldCAtIEdldCB0aGUgc3RhdHVzIGJsb2NrIGZyb20gdGhlIEkyTyBjb250cm9sbGVyCisgKglAYzogSTJPIGNvbnRyb2xsZXIKKyAqCisgKglJc3N1ZSBhIHN0YXR1cyBxdWVyeSBvbiB0aGUgY29udHJvbGxlci4gVGhpcyB1cGRhdGVzIHRoZSBhdHRhY2hlZAorICoJc3RhdHVzIGJsb2NrLiBUaGUgc3RhdHVzIGJsb2NrIGNvdWxkIHRoZW4gYmUgYWNjZXNzZWQgdGhyb3VnaAorICoJYy0+c3RhdHVzX2Jsb2NrLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgaTJvX3N0YXR1c19nZXQoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdTMyIG07CisJdTggKnN0YXR1c19ibG9jazsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlzdGF0dXNfYmxvY2sgPSAodTggKikgYy0+c3RhdHVzX2Jsb2NrLnZpcnQ7CisJbWVtc2V0KHN0YXR1c19ibG9jaywgMCwgc2l6ZW9mKGkyb19zdGF0dXNfYmxvY2spKTsKKworCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJd3JpdGVsKE5JTkVfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfMCwgJm1zZy0+dS5oZWFkWzBdKTsKKwl3cml0ZWwoSTJPX0NNRF9TVEFUVVNfR0VUIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCBBREFQVEVSX1RJRCwKKwkgICAgICAgJm1zZy0+dS5oZWFkWzFdKTsKKwl3cml0ZWwoaTJvX2V4ZWNfZHJpdmVyLmNvbnRleHQsICZtc2ctPnUucy5pY250eHQpOworCXdyaXRlbCgwLCAmbXNnLT51LnMudGNudHh0KTsJLy8gRklYTUU6IHVzZSByZXNvbmFibGUgdHJhbnNhY3Rpb24gY29udGV4dAorCXdyaXRlbCgwLCAmbXNnLT5ib2R5WzBdKTsKKwl3cml0ZWwoMCwgJm1zZy0+Ym9keVsxXSk7CisJd3JpdGVsKGkyb19wdHJfbG93KCh2b2lkICopYy0+c3RhdHVzX2Jsb2NrLnBoeXMpLCAmbXNnLT5ib2R5WzJdKTsKKwl3cml0ZWwoaTJvX3B0cl9oaWdoKCh2b2lkICopYy0+c3RhdHVzX2Jsb2NrLnBoeXMpLCAmbXNnLT5ib2R5WzNdKTsKKwl3cml0ZWwoc2l6ZW9mKGkyb19zdGF0dXNfYmxvY2spLCAmbXNnLT5ib2R5WzRdKTsJLyogYWx3YXlzIDg4IGJ5dGVzICovCisKKwlpMm9fbXNnX3Bvc3QoYywgbSk7CisKKwkvKiBXYWl0IGZvciBhIHJlcGx5ICovCisJdGltZW91dCA9IGppZmZpZXMgKyBJMk9fVElNRU9VVF9TVEFUVVNfR0VUICogSFo7CisJd2hpbGUgKHN0YXR1c19ibG9ja1s4N10gIT0gMHhGRikgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogR2V0IHN0YXR1cyB0aW1lb3V0LlxuIiwgYy0+bmFtZSk7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKworCQlybWIoKTsKKwl9CisKKyNpZmRlZiBERUJVRworCWkyb19kZWJ1Z19zdGF0ZShjKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglpMm9faHJ0X2dldCAtIEdldCB0aGUgSGFyZHdhcmUgUmVzb3VyY2UgVGFibGUgZnJvbSB0aGUgSTJPIGNvbnRyb2xsZXIKKyAqCUBjOiBJMk8gY29udHJvbGxlciBmcm9tIHdoaWNoIHRoZSBIUlQgc2hvdWxkIGJlIGZldGNoZWQKKyAqCisgKglUaGUgSFJUIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHBvc3NpYmxlIGhpZGRlbiBkZXZpY2VzIGJ1dCBpcworICoJbW9zdGx5IHVzZWxlc3MgdG8gdXMuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmVyIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpMm9faHJ0X2dldChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCit7CisJaW50IHJjOworCWludCBpOworCWkyb19ocnQgKmhydCA9IGMtPmhydC52aXJ0OworCXUzMiBzaXplID0gc2l6ZW9mKGkyb19ocnQpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjLT5wZGV2LT5kZXY7CisKKwlmb3IgKGkgPSAwOyBpIDwgSTJPX0hSVF9HRVRfVFJJRVM7IGkrKykgeworCQlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCQl1MzIgbTsKKworCQltID0gaTJvX21zZ19nZXRfd2FpdChjLCAmbXNnLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7CisJCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkKKwkJCXJldHVybiAtRVRJTUVET1VUOworCisJCXdyaXRlbChTSVhfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfNCwgJm1zZy0+dS5oZWFkWzBdKTsKKwkJd3JpdGVsKEkyT19DTURfSFJUX0dFVCA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgQURBUFRFUl9USUQsCisJCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOworCQl3cml0ZWwoMHhkMDAwMDAwMCB8IGMtPmhydC5sZW4sICZtc2ctPmJvZHlbMF0pOworCQl3cml0ZWwoYy0+aHJ0LnBoeXMsICZtc2ctPmJvZHlbMV0pOworCisJCXJjID0gaTJvX21zZ19wb3N0X3dhaXRfbWVtKGMsIG0sIDIwLCAmYy0+aHJ0KTsKKworCQlpZiAocmMgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gZ2V0IEhSVCAoc3RhdHVzPSUjeClcbiIsCisJCQkgICAgICAgYy0+bmFtZSwgLXJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCXNpemUgPSBocnQtPm51bV9lbnRyaWVzICogaHJ0LT5lbnRyeV9sZW4gPDwgMjsKKwkJaWYgKHNpemUgPiBjLT5ocnQubGVuKSB7CisJCQlpZiAoaTJvX2RtYV9yZWFsbG9jKGRldiwgJmMtPmhydCwgc2l6ZSwgR0ZQX0tFUk5FTCkpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQllbHNlCisJCQkJaHJ0ID0gYy0+aHJ0LnZpcnQ7CisJCX0gZWxzZQorCQkJcmV0dXJuIGkyb19wYXJzZV9ocnQoYyk7CisJfQorCisJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGdldCBIUlQgYWZ0ZXIgJWQgdHJpZXMsIGdpdmluZyB1cFxuIiwKKwkgICAgICAgYy0+bmFtZSwgSTJPX0hSVF9HRVRfVFJJRVMpOworCisJcmV0dXJuIC1FQlVTWTsKK30KKworLyoqCisgKglpMm9faW9wX2FsbG9jIC0gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBpMm9fY29udHJvbGxlciBzdHJ1Y3QKKyAqCisgKglBbGxvY2F0ZSB0aGUgbmVjZXNzYXJ5IG1lbW9yeSBmb3IgYSBpMm9fY29udHJvbGxlciBzdHJ1Y3QgYW5kCisgKglpbml0aWFsaXplIHRoZSBsaXN0cy4KKyAqCisgKglSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgSTJPIGNvbnRyb2xsZXIgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uCisgKglmYWlsdXJlLgorICovCitzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmkyb19pb3BfYWxsb2Modm9pZCkKK3sKKwlzdGF0aWMgaW50IHVuaXQgPSAwOwkvKiAwIGFuZCAxIGFyZSBOVUxMIElPUCBhbmQgTG9jYWwgSG9zdCAqLworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKKworCWMgPSBrbWFsbG9jKHNpemVvZigqYyksIEdGUF9LRVJORUwpOworCWlmICghYykgeworCQlwcmludGsoS0VSTl9FUlIgImkybzogSW5zdWZmaWNpZW50IG1lbW9yeSB0byBhbGxvY2F0ZSBhIEkyTyAiCisJCSAgICAgICAiY29udHJvbGxlci5cbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJbWVtc2V0KGMsIDAsIHNpemVvZigqYykpOworCisJSU5JVF9MSVNUX0hFQUQoJmMtPmRldmljZXMpOworCXNwaW5fbG9ja19pbml0KCZjLT5sb2NrKTsKKwlpbml0X01VVEVYKCZjLT5sY3RfbG9jayk7CisJYy0+dW5pdCA9IHVuaXQrKzsKKwlzcHJpbnRmKGMtPm5hbWUsICJpb3AlZCIsIGMtPnVuaXQpOworCisjaWYgQklUU19QRVJfTE9ORyA9PSA2NAorCXNwaW5fbG9ja19pbml0KCZjLT5jb250ZXh0X2xpc3RfbG9jayk7CisJYXRvbWljX3NldCgmYy0+Y29udGV4dF9saXN0X2NvdW50ZXIsIDApOworCUlOSVRfTElTVF9IRUFEKCZjLT5jb250ZXh0X2xpc3QpOworI2VuZGlmCisKKwlyZXR1cm4gYzsKK307CisKKy8qKgorICoJaTJvX2lvcF9mcmVlIC0gRnJlZSB0aGUgaTJvX2NvbnRyb2xsZXIgc3RydWN0CisgKglAYzogSTJPIGNvbnRyb2xsZXIgdG8gZnJlZQorICovCit2b2lkIGkyb19pb3BfZnJlZShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCit7CisJa2ZyZWUoYyk7Cit9OworCisvKioKKyAqCWkyb19pb3BfYWRkIC0gSW5pdGlhbGl6ZSB0aGUgSTJPIGNvbnRyb2xsZXIgYW5kIGFkZCBoaW0gdG8gdGhlIEkyTyBjb3JlCisgKglAYzogY29udHJvbGxlcgorICoKKyAqCUluaXRpYWxpemUgdGhlIEkyTyBjb250cm9sbGVyIGFuZCBpZiBubyBlcnJvciBvY2N1cnMgYWRkIGhpbSB0byB0aGUgSTJPCisgKgljb3JlLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IGkyb19pb3BfYWRkKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYykKK3sKKwlpbnQgcmM7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogQWN0aXZhdGluZyBJMk8gY29udHJvbGxlci4uLlxuIiwgYy0+bmFtZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRoaXMgbWF5IHRha2UgYSBmZXcgbWludXRlcyBpZiB0aGVyZSBhcmUgbWFueSAiCisJICAgICAgICJkZXZpY2VzXG4iLCBjLT5uYW1lKTsKKworCWlmICgocmMgPSBpMm9faW9wX2FjdGl2YXRlKGMpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZCBub3QgYWN0aXZhdGUgY29udHJvbGxlclxuIiwKKwkJICAgICAgIGMtPm5hbWUpOworCQlpMm9faW9wX3Jlc2V0KGMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcHJfZGVidWcoIiVzOiBidWlsZGluZyBzeXMgdGFibGUuLi5cbiIsIGMtPm5hbWUpOworCisJaWYgKChyYyA9IGkyb19zeXN0YWJfYnVpbGQoKSkpIHsKKwkJaTJvX2lvcF9yZXNldChjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXByX2RlYnVnKCIlczogb25saW5lIGNvbnRyb2xsZXIuLi5cbiIsIGMtPm5hbWUpOworCisJaWYgKChyYyA9IGkyb19pb3Bfb25saW5lKGMpKSkgeworCQlpMm9faW9wX3Jlc2V0KGMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcHJfZGVidWcoIiVzOiBnZXR0aW5nIExDVC4uLlxuIiwgYy0+bmFtZSk7CisKKwlpZiAoKHJjID0gaTJvX2V4ZWNfbGN0X2dldChjKSkpIHsKKwkJaTJvX2lvcF9yZXNldChjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWxpc3RfYWRkKCZjLT5saXN0LCAmaTJvX2NvbnRyb2xsZXJzKTsKKworCWkyb19kcml2ZXJfbm90aWZ5X2NvbnRyb2xsZXJfYWRkX2FsbChjKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb250cm9sbGVyIGFkZGVkXG4iLCBjLT5uYW1lKTsKKworCXJldHVybiAwOworfTsKKworLyoqCisgKglpMm9fZXZlbnRfcmVnaXN0ZXIgLSBUdXJuIG9uL29mZiBldmVudCBub3RpZmljYXRpb24gZm9yIGEgSTJPIGRldmljZQorICoJQGRldjogSTJPIGRldmljZSB3aGljaCBzaG91bGQgcmVjZWl2ZSB0aGUgZXZlbnQgcmVnaXN0cmF0aW9uIHJlcXVlc3QKKyAqCUBkcnY6IGRyaXZlciB3aGljaCB3YW50IHRvIGdldCBub3RpZmllZAorICoJQHRjbnR4dDogdHJhbnNhY3Rpb24gY29udGV4dCB0byB1c2Ugd2l0aCB0aGlzIG5vdGlmaWVyCisgKglAZXZ0X21hc2s6IG1hc2sgb2YgZXZlbnRzCisgKgorICoJQ3JlYXRlIGFuZCBwb3N0cyBhbiBldmVudCByZWdpc3RyYXRpb24gbWVzc2FnZSB0byB0aGUgdGFzay4gTm8gcmVwbHkKKyAqCWlzIHdhaXRlZCBmb3IsIG9yIGV4cGVjdGVkLiBJZiB5b3UgZG8gbm90IHdhbnQgZnVydGhlciBub3RpZmljYXRpb25zLAorICoJY2FsbCB0aGUgaTJvX2V2ZW50X3JlZ2lzdGVyIGFnYWluIHdpdGggYSBldnRfbWFzayBvZiAwLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1FVElNRURPVVQgaWYgbm8gbWVzc2FnZSBjb3VsZCBiZSBmZXRjaGVkIGZvcgorICoJc2VuZGluZyB0aGUgcmVxdWVzdC4KKyAqLworaW50IGkyb19ldmVudF9yZWdpc3RlcihzdHJ1Y3QgaTJvX2RldmljZSAqZGV2LCBzdHJ1Y3QgaTJvX2RyaXZlciAqZHJ2LAorCQkgICAgICAgaW50IHRjbnR4dCwgdTMyIGV2dF9tYXNrKQoreworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYyA9IGRldi0+aW9wOworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdTMyIG07CisKKwltID0gaTJvX21zZ19nZXRfd2FpdChjLCAmbXNnLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7CisJaWYgKG0gPT0gSTJPX1FVRVVFX0VNUFRZKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCXdyaXRlbChGSVZFX1dPUkRfTVNHX1NJWkUgfCBTR0xfT0ZGU0VUXzAsICZtc2ctPnUuaGVhZFswXSk7CisJd3JpdGVsKEkyT19DTURfVVRJTF9FVlRfUkVHSVNURVIgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IGRldi0+bGN0X2RhdGEuCisJICAgICAgIHRpZCwgJm1zZy0+dS5oZWFkWzFdKTsKKwl3cml0ZWwoZHJ2LT5jb250ZXh0LCAmbXNnLT51LnMuaWNudHh0KTsKKwl3cml0ZWwodGNudHh0LCAmbXNnLT51LnMudGNudHh0KTsKKwl3cml0ZWwoZXZ0X21hc2ssICZtc2ctPmJvZHlbMF0pOworCisJaTJvX21zZ19wb3N0KGMsIG0pOworCisJcmV0dXJuIDA7Cit9OworCisvKioKKyAqCWkyb19pb3BfaW5pdCAtIEkyTyBtYWluIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCisgKgorICoJSW5pdGlhbGl6ZSB0aGUgSTJPIGRyaXZlcnMgKE9TTSkgZnVuY3Rpb25zLCByZWdpc3RlciB0aGUgRXhlY3V0aXZlIE9TTSwKKyAqCWluaXRpYWxpemUgdGhlIEkyTyBQQ0kgcGFydCBhbmQgZmluYWxseSBpbml0aWFsaXplIEkyTyBkZXZpY2Ugc3R1ZmYuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IF9faW5pdCBpMm9faW9wX2luaXQodm9pZCkKK3sKKwlpbnQgcmMgPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyBPU01fREVTQ1JJUFRJT04gIiB2IiBPU01fVkVSU0lPTiAiXG4iKTsKKworCXJjID0gaTJvX2RldmljZV9pbml0KCk7CisJaWYgKHJjKQorCQlnb3RvIGV4aXQ7CisKKwlyYyA9IGkyb19kcml2ZXJfaW5pdCgpOworCWlmIChyYykKKwkJZ290byBkZXZpY2VfZXhpdDsKKworCXJjID0gaTJvX2V4ZWNfaW5pdCgpOworCWlmIChyYykKKwkJZ290byBkcml2ZXJfZXhpdDsKKworCXJjID0gaTJvX3BjaV9pbml0KCk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBleGVjX2V4aXQ7CisKKwlyZXR1cm4gMDsKKworICAgICAgZXhlY19leGl0OgorCWkyb19leGVjX2V4aXQoKTsKKworICAgICAgZHJpdmVyX2V4aXQ6CisJaTJvX2RyaXZlcl9leGl0KCk7CisKKyAgICAgIGRldmljZV9leGl0OgorCWkyb19kZXZpY2VfZXhpdCgpOworCisgICAgICBleGl0OgorCXJldHVybiByYzsKK30KKworLyoqCisgKglpMm9faW9wX2V4aXQgLSBJMk8gbWFpbiBleGl0IGZ1bmN0aW9uCisgKgorICoJUmVtb3ZlcyBJMk8gY29udHJvbGxlcnMgZnJvbSBQQ0kgc3Vic3lzdGVtIGFuZCBzaHV0IGRvd24gT1NNcy4KKyAqLworc3RhdGljIHZvaWQgX19leGl0IGkyb19pb3BfZXhpdCh2b2lkKQoreworCWkyb19wY2lfZXhpdCgpOworCWkyb19leGVjX2V4aXQoKTsKKwlpMm9fZHJpdmVyX2V4aXQoKTsKKwlpMm9fZGV2aWNlX2V4aXQoKTsKK307CisKK21vZHVsZV9pbml0KGkyb19pb3BfaW5pdCk7Cittb2R1bGVfZXhpdChpMm9faW9wX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJSZWQgSGF0IFNvZnR3YXJlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oT1NNX0RFU0NSSVBUSU9OKTsKK01PRFVMRV9WRVJTSU9OKE9TTV9WRVJTSU9OKTsKKworI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjQKK0VYUE9SVF9TWU1CT0woaTJvX2NudHh0X2xpc3RfYWRkKTsKK0VYUE9SVF9TWU1CT0woaTJvX2NudHh0X2xpc3RfZ2V0KTsKK0VYUE9SVF9TWU1CT0woaTJvX2NudHh0X2xpc3RfcmVtb3ZlKTsKK0VYUE9SVF9TWU1CT0woaTJvX2NudHh0X2xpc3RfZ2V0X3B0cik7CisjZW5kaWYKK0VYUE9SVF9TWU1CT0woaTJvX21zZ19nZXRfd2FpdCk7CitFWFBPUlRfU1lNQk9MKGkyb19tc2dfbm9wKTsKK0VYUE9SVF9TWU1CT0woaTJvX2ZpbmRfaW9wKTsKK0VYUE9SVF9TWU1CT0woaTJvX2lvcF9maW5kX2RldmljZSk7CitFWFBPUlRfU1lNQk9MKGkyb19ldmVudF9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGkyb19zdGF0dXNfZ2V0KTsKK0VYUE9SVF9TWU1CT0woaTJvX2NvbnRyb2xsZXJzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vcGNpLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NzI3NTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL3BjaS5jCkBAIC0wLDAgKzEsNTI4IEBACisvKgorICoJUENJIGhhbmRsaW5nIG9mIEkyTyBjb250cm9sbGVyCisgKgorICogCUNvcHlyaWdodCAoQykgMTk5OS0yMDAyCVJlZCBIYXQgU29mdHdhcmUKKyAqCisgKglXcml0dGVuIGJ5IEFsYW4gQ294LCBCdWlsZGluZyBOdW1iZXIgVGhyZWUgTHRkCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqCXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICoJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICoJb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglBIGxvdCBvZiB0aGUgSTJPIG1lc3NhZ2Ugc2lkZSBjb2RlIGZyb20gdGhpcyBpcyB0YWtlbiBmcm9tIHRoZSBSZWQKKyAqCUNyZWVrIFJDUENJNDUgYWRhcHRlciBkcml2ZXIgYnkgUmVkIENyZWVrIENvbW11bmljYXRpb25zCisgKgorICoJRml4ZXMvYWRkaXRpb25zOgorICoJCVBoaWxpcHAgUnVtcGYKKyAqCQlKdWhhIFNpZXbkbmVuIDxKdWhhLlNpZXZhbmVuQGNzLkhlbHNpbmtpLkZJPgorICoJCUF1dm8gSORra2luZW4gPEF1dm8uSGFra2luZW5AY3MuSGVsc2lua2kuRkk+CisgKgkJRGVlcGFrIFNheGVuYSA8ZGVlcGFrQHBsZXhpdHkubmV0PgorICoJCUJvamkgVCBLYW5uYW50aGFuYW0gPGJvamkudC5rYW5uYW50aGFuYW1AaW50ZWwuY29tPgorICoJCUFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+OgorICoJCQlQb3J0ZWQgdG8gTGludXggMi41LgorICoJCU1hcmt1cyBMaWRlbCA8TWFya3VzLkxpZGVsQHNoYWRvd2Nvbm5lY3QuY29tPjoKKyAqCQkJTWlub3IgZml4ZXMgZm9yIDIuNi4KKyAqCQlNYXJrdXMgTGlkZWwgPE1hcmt1cy5MaWRlbEBzaGFkb3djb25uZWN0LmNvbT46CisgKgkJCVN1cHBvcnQgZm9yIHN5c2ZzIGluY2x1ZGVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMm8uaD4KKworI2lmZGVmIENPTkZJR19NVFJSCisjaW5jbHVkZSA8YXNtL210cnIuaD4KKyNlbmRpZgkJCQkvLyBDT05GSUdfTVRSUgorCisvKiBNb2R1bGUgaW50ZXJuYWwgZnVuY3Rpb25zIGZyb20gb3RoZXIgc291cmNlcyAqLworZXh0ZXJuIHN0cnVjdCBpMm9fY29udHJvbGxlciAqaTJvX2lvcF9hbGxvYyh2b2lkKTsKK2V4dGVybiB2b2lkIGkyb19pb3BfZnJlZShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKik7CisKK2V4dGVybiBpbnQgaTJvX2lvcF9hZGQoc3RydWN0IGkyb19jb250cm9sbGVyICopOworZXh0ZXJuIHZvaWQgaTJvX2lvcF9yZW1vdmUoc3RydWN0IGkyb19jb250cm9sbGVyICopOworCitleHRlcm4gaW50IGkyb19kcml2ZXJfZGlzcGF0Y2goc3RydWN0IGkyb19jb250cm9sbGVyICosIHUzMiwKKwkJCSAgICAgICBzdHJ1Y3QgaTJvX21lc3NhZ2UgKik7CisKKy8qIFBDSSBkZXZpY2UgaWQgdGFibGUgZm9yIGFsbCBJMk8gY29udHJvbGxlcnMgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBfX2RldmluaXRkYXRhIGkyb19wY2lfaWRzW10gPSB7CisJe1BDSV9ERVZJQ0VfQ0xBU1MoUENJX0NMQVNTX0lOVEVMTElHRU5UX0kyTyA8PCA4LCAweGZmZmYwMCl9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfRFBULCAweGE1MTEpfSwKKwl7MH0KK307CisKKy8qKgorICoJaTJvX2RtYV9yZWFsbG9jIC0gUmVhbGxvYyBETUEgbWVtb3J5CisgKglAZGV2OiBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIgdG8gdGhlIFBDSSBkZXZpY2Ugb2YgdGhlIEkyTyBjb250cm9sbGVyCisgKglAYWRkcjogcG9pbnRlciB0byBhIGkyb19kbWEgc3RydWN0IERNQSBidWZmZXIKKyAqCUBsZW46IG5ldyBsZW5ndGggb2YgbWVtb3J5CisgKglAZ2ZwX21hc2s6IEdGUCBtYXNrCisgKgorICoJSWYgdGhlcmUgd2FzIHNvbWV0aGluZyBhbGxvY2F0ZWQgaW4gdGhlIGFkZHIsIGZyZWUgaXQgZmlyc3QuIElmIGxlbiA+IDAKKyAqCXRoYW4gdHJ5IHRvIGFsbG9jYXRlIGl0IGFuZCB3cml0ZSB0aGUgYWRkcmVzc2VzIGJhY2sgdG8gdGhlIGFkZHIKKyAqCXN0cnVjdHVyZS4gSWYgbGVuID09IDAgc2V0IHRoZSB2aXJ0dWFsIGFkZHJlc3MgdG8gTlVMTC4KKyAqCisgKglSZXR1cm5zIHRoZSAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgaTJvX2RtYV9yZWFsbG9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGkyb19kbWEgKmFkZHIsIHNpemVfdCBsZW4sCisJCSAgICB1bnNpZ25lZCBpbnQgZ2ZwX21hc2spCit7CisJaTJvX2RtYV9mcmVlKGRldiwgYWRkcik7CisKKwlpZiAobGVuKQorCQlyZXR1cm4gaTJvX2RtYV9hbGxvYyhkZXYsIGFkZHIsIGxlbiwgZ2ZwX21hc2spOworCisJcmV0dXJuIDA7Cit9OworCisvKioKKyAqCWkyb19wY2lfZnJlZSAtIEZyZWVzIHRoZSBETUEgbWVtb3J5IGZvciB0aGUgSTJPIGNvbnRyb2xsZXIKKyAqCUBjOiBJMk8gY29udHJvbGxlciB0byBmcmVlCisgKgorICoJUmVtb3ZlIGFsbCBhbGxvY2F0ZWQgRE1BIG1lbW9yeSBhbmQgdW5tYXAgbWVtb3J5IElPIHJlZ2lvbnMuIElmIE1UUlIKKyAqCWlzIGVuYWJsZWQsIGFsc28gcmVtb3ZlIGl0IGFnYWluLgorICovCitzdGF0aWMgdm9pZCBpMm9fcGNpX2ZyZWUoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCWRldiA9ICZjLT5wZGV2LT5kZXY7CisKKwlpMm9fZG1hX2ZyZWUoZGV2LCAmYy0+b3V0X3F1ZXVlKTsKKwlpMm9fZG1hX2ZyZWUoZGV2LCAmYy0+c3RhdHVzX2Jsb2NrKTsKKwlpZiAoYy0+bGN0KQorCQlrZnJlZShjLT5sY3QpOworCWkyb19kbWFfZnJlZShkZXYsICZjLT5kbGN0KTsKKwlpMm9fZG1hX2ZyZWUoZGV2LCAmYy0+aHJ0KTsKKwlpMm9fZG1hX2ZyZWUoZGV2LCAmYy0+c3RhdHVzKTsKKworI2lmZGVmIENPTkZJR19NVFJSCisJaWYgKGMtPm10cnJfcmVnMCA+PSAwKQorCQltdHJyX2RlbChjLT5tdHJyX3JlZzAsIDAsIDApOworCWlmIChjLT5tdHJyX3JlZzEgPj0gMCkKKwkJbXRycl9kZWwoYy0+bXRycl9yZWcxLCAwLCAwKTsKKyNlbmRpZgorCisJaWYgKGMtPnJhcHRvciAmJiBjLT5pbl9xdWV1ZS52aXJ0KQorCQlpb3VubWFwKGMtPmluX3F1ZXVlLnZpcnQpOworCisJaWYgKGMtPmJhc2UudmlydCkKKwkJaW91bm1hcChjLT5iYXNlLnZpcnQpOworfQorCisvKioKKyAqCWkyb19wY2lfYWxsb2MgLSBBbGxvY2F0ZSBETUEgbWVtb3J5LCBtYXAgSU8gbWVtb3J5IGZvciBJMk8gY29udHJvbGxlcgorICoJQGM6IEkyTyBjb250cm9sbGVyCisgKgorICoJQWxsb2NhdGUgRE1BIG1lbW9yeSBmb3IgYSBQQ0kgKG9yIGluIHRoZW9yeSBBR1ApIEkyTyBjb250cm9sbGVyLiBBbGwKKyAqCUlPIG1hcHBpbmdzIGFyZSBhbHNvIGRvbmUgaGVyZS4gSWYgTVRSUiBpcyBlbmFibGVkLCBhbHNvIGRvIGFkZCBtZW1vcnkKKyAqCXJlZ2lvbnMgaGVyZS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGkyb19wY2lfYWxsb2Moc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYy0+cGRldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQkvKiBTa2lwIEkvTyBzcGFjZXMgKi8KKwkJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIGkpICYgSU9SRVNPVVJDRV9JTykpIHsKKwkJCWlmICghYy0+YmFzZS5waHlzKSB7CisJCQkJYy0+YmFzZS5waHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGkpOworCQkJCWMtPmJhc2UubGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCBpKTsKKworCQkJCS8qCisJCQkJICogSWYgd2Uga25vdyB3aGF0IGNhcmQgaXQgaXMsIHNldCB0aGUgc2l6ZQorCQkJCSAqIGNvcnJlY3RseS4gQ29kZSBpcyB0YWtlbiBmcm9tIGRwdF9pMm8uYworCQkJCSAqLworCQkJCWlmIChwZGV2LT5kZXZpY2UgPT0gMHhhNTAxKSB7CisJCQkJCWlmIChwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID49IDB4YzAzMiAmJgorCQkJCQkgICAgcGRldi0+c3Vic3lzdGVtX2RldmljZSA8PSAweGMwM2IpIHsKKwkJCQkJCWlmIChjLT5iYXNlLmxlbiA+IDB4NDAwMDAwKQorCQkJCQkJCWMtPmJhc2UubGVuID0gMHg0MDAwMDA7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoYy0+YmFzZS5sZW4gPiAweDEwMDAwMCkKKwkJCQkJCQljLT5iYXNlLmxlbiA9IDB4MTAwMDAwOworCQkJCQl9CisJCQkJfQorCQkJCWlmICghYy0+cmFwdG9yKQorCQkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJYy0+aW5fcXVldWUucGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBpKTsKKwkJCQljLT5pbl9xdWV1ZS5sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGkgPT0gNikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJMk8gY29udHJvbGxlciBoYXMgbm8gbWVtb3J5IHJlZ2lvbnMiCisJCSAgICAgICAiIGRlZmluZWQuXG4iLCBjLT5uYW1lKTsKKwkJaTJvX3BjaV9mcmVlKGMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBNYXAgdGhlIEkyTyBjb250cm9sbGVyICovCisJaWYgKGMtPnJhcHRvcikgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogUENJIEkyTyBjb250cm9sbGVyXG4iLCBjLT5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICBCQVIwIGF0IDB4JTA4bFggc2l6ZT0lbGRcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyljLT5iYXNlLnBoeXMsICh1bnNpZ25lZCBsb25nKWMtPmJhc2UubGVuKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICAgICBCQVIxIGF0IDB4JTA4bFggc2l6ZT0lbGRcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyljLT5pbl9xdWV1ZS5waHlzLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpYy0+aW5fcXVldWUubGVuKTsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBDSSBJMk8gY29udHJvbGxlciBhdCAlMDhsWCBzaXplPSVsZFxuIiwKKwkJICAgICAgIGMtPm5hbWUsICh1bnNpZ25lZCBsb25nKWMtPmJhc2UucGh5cywKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKWMtPmJhc2UubGVuKTsKKworCWMtPmJhc2UudmlydCA9IGlvcmVtYXAoYy0+YmFzZS5waHlzLCBjLT5iYXNlLmxlbik7CisJaWYgKCFjLT5iYXNlLnZpcnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIG1hcCBjb250cm9sbGVyLlxuIiwgYy0+bmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChjLT5yYXB0b3IpIHsKKwkJYy0+aW5fcXVldWUudmlydCA9IGlvcmVtYXAoYy0+aW5fcXVldWUucGh5cywgYy0+aW5fcXVldWUubGVuKTsKKwkJaWYgKCFjLT5pbl9xdWV1ZS52aXJ0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gbWFwIGNvbnRyb2xsZXIuXG4iLAorCQkJICAgICAgIGMtPm5hbWUpOworCQkJaTJvX3BjaV9mcmVlKGMpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9IGVsc2UKKwkJYy0+aW5fcXVldWUgPSBjLT5iYXNlOworCisJYy0+aXJxX21hc2sgPSBjLT5iYXNlLnZpcnQgKyAweDM0OworCWMtPnBvc3RfcG9ydCA9IGMtPmJhc2UudmlydCArIDB4NDA7CisJYy0+cmVwbHlfcG9ydCA9IGMtPmJhc2UudmlydCArIDB4NDQ7CisKKyNpZmRlZiBDT05GSUdfTVRSUgorCS8qIEVuYWJsZSBXcml0ZSBDb21iaW5pbmcgTVRSUiBmb3IgSU9QJ3MgbWVtb3J5IHJlZ2lvbiAqLworCWMtPm10cnJfcmVnMCA9IG10cnJfYWRkKGMtPmluX3F1ZXVlLnBoeXMsIGMtPmluX3F1ZXVlLmxlbiwKKwkJCQlNVFJSX1RZUEVfV1JDT01CLCAxKTsKKwljLT5tdHJyX3JlZzEgPSAtMTsKKworCWlmIChjLT5tdHJyX3JlZzAgPCAwKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY291bGQgbm90IGVuYWJsZSB3cml0ZSBjb21iaW5pbmcgIgorCQkgICAgICAgIk1UUlJcbiIsIGMtPm5hbWUpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHVzaW5nIHdyaXRlIGNvbWJpbmluZyBNVFJSXG4iLCBjLT5uYW1lKTsKKworCS8qCisJICogSWYgaXQgaXMgYW4gSU5URUwgaTk2MCBJL08gcHJvY2Vzc29yIHRoZW4gc2V0IHRoZSBmaXJzdCA2NEsgdG8KKwkgKiBVbmNhY2hlYWJsZSBzaW5jZSB0aGUgcmVnaW9uIGNvbnRhaW5zIHRoZSBtZXNzYWdpbmcgdW5pdCB3aGljaAorCSAqIHNob3VsZG4ndCBiZSBjYWNoZWQuCisJICovCisJaWYgKChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JTlRFTCB8fAorCSAgICAgcGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfRFBUKSAmJiAhYy0+cmFwdG9yKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNVFJSIHdvcmthcm91bmQgZm9yIEludGVsIGk5NjAgcHJvY2Vzc29yIgorCQkgICAgICAgIlxuIiwgYy0+bmFtZSk7CisJCWMtPm10cnJfcmVnMSA9IG10cnJfYWRkKGMtPmJhc2UucGh5cywgMHgxMDAwMCwKKwkJCQkJTVRSUl9UWVBFX1VOQ0FDSEFCTEUsIDEpOworCisJCWlmIChjLT5tdHJyX3JlZzEgPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRXJyb3IgaW4gc2V0dGluZyAiCisJCQkgICAgICAgIk1UUlJfVFlQRV9VTkNBQ0hBQkxFXG4iLCBjLT5uYW1lKTsKKwkJCW10cnJfZGVsKGMtPm10cnJfcmVnMCwgYy0+aW5fcXVldWUucGh5cywKKwkJCQkgYy0+aW5fcXVldWUubGVuKTsKKwkJCWMtPm10cnJfcmVnMCA9IC0xOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoaTJvX2RtYV9hbGxvYyhkZXYsICZjLT5zdGF0dXMsIDgsIEdGUF9LRVJORUwpKSB7CisJCWkyb19wY2lfZnJlZShjKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGkyb19kbWFfYWxsb2MoZGV2LCAmYy0+aHJ0LCBzaXplb2YoaTJvX2hydCksIEdGUF9LRVJORUwpKSB7CisJCWkyb19wY2lfZnJlZShjKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGkyb19kbWFfYWxsb2MoZGV2LCAmYy0+ZGxjdCwgODE5MiwgR0ZQX0tFUk5FTCkpIHsKKwkJaTJvX3BjaV9mcmVlKGMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoaTJvX2RtYV9hbGxvYyhkZXYsICZjLT5zdGF0dXNfYmxvY2ssIHNpemVvZihpMm9fc3RhdHVzX2Jsb2NrKSwKKwkJCSAgR0ZQX0tFUk5FTCkpIHsKKwkJaTJvX3BjaV9mcmVlKGMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoaTJvX2RtYV9hbGxvYyhkZXYsICZjLT5vdXRfcXVldWUsIE1TR19QT09MX1NJWkUsIEdGUF9LRVJORUwpKSB7CisJCWkyb19wY2lfZnJlZShjKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJaTJvX3BjaV9pbnRlcnJ1cHQgLSBJbnRlcnJ1cHQgaGFuZGxlciBmb3IgSTJPIGNvbnRyb2xsZXIKKyAqCUBpcnE6IGludGVycnVwdCBsaW5lCisgKglAZGV2X2lkOiBwb2ludGVyIHRvIHRoZSBJMk8gY29udHJvbGxlcgorICoJQHI6IHBvaW50ZXIgdG8gcmVnaXN0ZXJzCisgKgorICoJSGFuZGxlIGFuIGludGVycnVwdCBmcm9tIGEgUENJIGJhc2VkIEkyTyBjb250cm9sbGVyLiBUaGlzIHR1cm5zIG91dAorICoJdG8gYmUgcmF0aGVyIHNpbXBsZS4gV2Uga2VlcCB0aGUgY29udHJvbGxlciBwb2ludGVyIGluIHRoZSBjb29raWUuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBpMm9fcGNpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyKQoreworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYyA9IGRldl9pZDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYy0+cGRldi0+ZGV2OworCXN0cnVjdCBpMm9fbWVzc2FnZSAqbTsKKwl1MzIgbXY7CisKKwkvKgorCSAqIE9sZCA5NjAgc3RlcHBpbmdzIGhhZCBhIGJ1ZyBpbiB0aGUgSTJPIHVuaXQgdGhhdCBjYXVzZWQKKwkgKiB0aGUgcXVldWUgdG8gYXBwZWFyIGVtcHR5IHdoZW4gaXQgd2Fzbid0LgorCSAqLworCW12ID0gSTJPX1JFUExZX1JFQUQzMihjKTsKKwlpZiAobXYgPT0gSTJPX1FVRVVFX0VNUFRZKSB7CisJCW12ID0gSTJPX1JFUExZX1JFQUQzMihjKTsKKwkJaWYgKHVubGlrZWx5KG12ID09IEkyT19RVUVVRV9FTVBUWSkpIHsKKwkJCXJldHVybiBJUlFfTk9ORTsKKwkJfSBlbHNlCisJCQlwcl9kZWJ1ZygiJXM6IDk2MCBidWcgZGV0ZWN0ZWRcbiIsIGMtPm5hbWUpOworCX0KKworCXdoaWxlIChtdiAhPSBJMk9fUVVFVUVfRU1QVFkpIHsKKwkJLyoKKwkJICogTWFwIHRoZSBtZXNzYWdlIGZyb20gdGhlIHBhZ2UgZnJhbWUgbWFwIHRvIGtlcm5lbCB2aXJ0dWFsLgorCQkgKiBCZWNhdXNlIGJ1c190b192aXJ0IGlzIGRlcHJlY2F0ZWQsIHdlIGhhdmUgY2FsY3VsYXRlIHRoZQorCQkgKiBsb2NhdGlvbiBieSBvdXJzZWxmIQorCQkgKi8KKwkJbSA9IGkyb19tc2dfb3V0X3RvX3ZpcnQoYywgbXYpOworCisJCS8qCisJCSAqICAgICAgRW5zdXJlIHRoaXMgbWVzc2FnZSBpcyBzZWVuIGNvaGVyZW50bHkgYnV0IGNhY2hhYmx5IGJ5CisJCSAqICAgICAgdGhlIHByb2Nlc3NvcgorCQkgKi8KKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGV2LCBtdiwgTVNHX0ZSQU1FX1NJWkUgKiA0LAorCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCS8qIGRpc3BhdGNoIGl0ICovCisJCWlmIChpMm9fZHJpdmVyX2Rpc3BhdGNoKGMsIG12LCBtKSkKKwkJCS8qIGZsdXNoIGl0IGlmIHJlc3VsdCAhPSAwICovCisJCQlpMm9fZmx1c2hfcmVwbHkoYywgbXYpOworCisJCS8qCisJCSAqIFRoYXQgOTYwIGJ1ZyBhZ2Fpbi4uLgorCQkgKi8KKwkJbXYgPSBJMk9fUkVQTFlfUkVBRDMyKGMpOworCQlpZiAobXYgPT0gSTJPX1FVRVVFX0VNUFRZKQorCQkJbXYgPSBJMk9fUkVQTFlfUkVBRDMyKGMpOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICoJaTJvX3BjaV9pcnFfZW5hYmxlIC0gQWxsb2NhdGUgaW50ZXJydXB0IGZvciBJMk8gY29udHJvbGxlcgorICoKKyAqCUFsbG9jYXRlIGFuIGludGVycnVwdCBmb3IgdGhlIEkyTyBjb250cm9sbGVyLCBhbmQgYWN0aXZhdGUgaW50ZXJydXB0cworICoJb24gdGhlIEkyTyBjb250cm9sbGVyLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpMm9fcGNpX2lycV9lbmFibGUoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYy0+cGRldjsKKwlpbnQgcmM7CisKKwlJMk9fSVJRX1dSSVRFMzIoYywgMHhmZmZmZmZmZik7CisKKwlpZiAocGRldi0+aXJxKSB7CisJCXJjID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBpMm9fcGNpX2ludGVycnVwdCwgU0FfU0hJUlEsCisJCQkJIGMtPm5hbWUsIGMpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgaW50ZXJydXB0ICVkLiIKKwkJCSAgICAgICAiXG4iLCBjLT5uYW1lLCBwZGV2LT5pcnEpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJSTJPX0lSUV9XUklURTMyKGMsIDB4MDAwMDAwMDApOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEluc3RhbGxlZCBhdCBJUlEgJWRcbiIsIGMtPm5hbWUsIHBkZXYtPmlycSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglpMm9fcGNpX2lycV9kaXNhYmxlIC0gRnJlZSBpbnRlcnJ1cHQgZm9yIEkyTyBjb250cm9sbGVyCisgKglAYzogSTJPIGNvbnRyb2xsZXIKKyAqCisgKglEaXNhYmxlIGludGVycnVwdHMgaW4gSTJPIGNvbnRyb2xsZXIgYW5kIHRoZW4gZnJlZSBpbnRlcnJ1cHQuCisgKi8KK3N0YXRpYyB2b2lkIGkyb19wY2lfaXJxX2Rpc2FibGUoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCUkyT19JUlFfV1JJVEUzMihjLCAweGZmZmZmZmZmKTsKKworCWlmIChjLT5wZGV2LT5pcnEgPiAwKQorCQlmcmVlX2lycShjLT5wZGV2LT5pcnEsIGMpOworfQorCisvKioKKyAqCWkyb19wY2lfcHJvYmUgLSBQcm9iZSB0aGUgUENJIGRldmljZSBmb3IgYW4gSTJPIGNvbnRyb2xsZXIKKyAqCUBkZXY6IFBDSSBkZXZpY2UgdG8gdGVzdAorICoJQGlkOiBpZCB3aGljaCBtYXRjaGVkIHdpdGggdGhlIFBDSSBkZXZpY2UgaWQgdGFibGUKKyAqCisgKglQcm9iZSB0aGUgUENJIGRldmljZSBmb3IgYW55IGRldmljZSB3aGljaCBpcyBhIG1lbW9yeSBvZiB0aGUKKyAqCUludGVsbGlnZW50LCBJMk8gY2xhc3Mgb3IgYW4gQWRhcHRlYyBaZXJvIENoYW5uZWwgQ29udHJvbGxlci4gV2UKKyAqCWF0dGVtcHQgdG8gc2V0IHVwIGVhY2ggc3VjaCBkZXZpY2UgYW5kIHJlZ2lzdGVyIGl0IHdpdGggdGhlIGNvcmUuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpMm9fcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmM7CisJaW50IHJjOworCisJcHJpbnRrKEtFUk5fSU5GTyAiaTJvOiBDaGVja2luZyBmb3IgUENJIEkyTyBjb250cm9sbGVycy4uLlxuIik7CisKKwlpZiAoKHBkZXYtPmNsYXNzICYgMHhmZikgPiAxKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImkybzogSTJPIGNvbnRyb2xsZXIgZm91bmQgYnV0IGRvZXMgbm90ICIKKwkJICAgICAgICJzdXBwb3J0IEkyTyAxLjUgKHNraXBwaW5nKS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoKHJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldikpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImkybzogSTJPIGNvbnRyb2xsZXIgZm91bmQgYnV0IGNvdWxkIG5vdCBiZSIKKwkJICAgICAgICIgZW5hYmxlZC5cbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiaTJvOiBJMk8gY29udHJvbGxlciBmb3VuZCBvbiBidXMgJWQgYXQgJWQuXG4iLAorCSAgICAgICBwZGV2LT5idXMtPm51bWJlciwgcGRldi0+ZGV2Zm4pOworCisJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImkybzogSTJPIGNvbnRyb2xsZXIgb24gYnVzICVkIGF0ICVkOiBObyAiCisJCSAgICAgICAic3VpdGFibGUgRE1BIGF2YWlsYWJsZSFcbiIsIHBkZXYtPmJ1cy0+bnVtYmVyLAorCQkgICAgICAgcGRldi0+ZGV2Zm4pOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZGlzYWJsZTsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWMgPSBpMm9faW9wX2FsbG9jKCk7CisJaWYgKElTX0VSUihjKSkgeworCQlwcmludGsoS0VSTl9FUlIgImkybzogbWVtb3J5IGZvciBJMk8gY29udHJvbGxlciBjb3VsZCBub3QgYmUgIgorCQkgICAgICAgImFsbG9jYXRlZFxuIik7CisJCXJjID0gUFRSX0VSUihjKTsKKwkJZ290byBkaXNhYmxlOworCX0KKworCWMtPnBkZXYgPSBwZGV2OworCWMtPmRldmljZSA9IHBkZXYtPmRldjsKKworCS8qIENhcmRzIHRoYXQgZmFsbCBhcGFydCBpZiB5b3UgaGl0IHRoZW0gd2l0aCBsYXJnZSBJL08gbG9hZHMuLi4gKi8KKwlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfTkNSICYmIHBkZXYtPmRldmljZSA9PSAweDA2MzApIHsKKwkJYy0+c2hvcnRfcmVxID0gMTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN5bWJpb3MgRkM5MjAgd29ya2Fyb3VuZHMgYWN0aXZhdGVkLlxuIiwKKwkJICAgICAgIGMtPm5hbWUpOworCX0KKworCWlmIChwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9WRU5ET1JfSURfUFJPTUlTRSkgeworCQljLT5wcm9taXNlID0gMTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFByb21pc2Ugd29ya2Fyb3VuZHMgYWN0aXZhdGVkLlxuIiwKKwkJICAgICAgIGMtPm5hbWUpOworCX0KKworCS8qIENhcmRzIHRoYXQgZ28gYmFuYW5hcyBpZiB5b3UgcXVpZXNjZSB0aGVtIGJlZm9yZSB5b3UgcmVzZXQgdGhlbS4gKi8KKwlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfRFBUKSB7CisJCWMtPm5vX3F1aWVzY2UgPSAxOworCQlpZiAocGRldi0+ZGV2aWNlID09IDB4YTUxMSkKKwkJCWMtPnJhcHRvciA9IDE7CisJfQorCisJaWYgKChyYyA9IGkyb19wY2lfYWxsb2MoYykpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IERNQSAvIElPIGFsbG9jYXRpb24gZm9yIEkyTyBjb250cm9sbGVyICIKKwkJICAgICAgICIgZmFpbGVkXG4iLCBjLT5uYW1lKTsKKwkJZ290byBmcmVlX2NvbnRyb2xsZXI7CisJfQorCisJaWYgKGkyb19wY2lfaXJxX2VuYWJsZShjKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZW5hYmxlIGludGVycnVwdHMgZm9yIEkyTyAiCisJCSAgICAgICAiY29udHJvbGxlclxuIiwgYy0+bmFtZSk7CisJCWdvdG8gZnJlZV9wY2k7CisJfQorCisJaWYgKChyYyA9IGkyb19pb3BfYWRkKGMpKSkKKwkJZ290byB1bmluc3RhbGw7CisKKwlyZXR1cm4gMDsKKworICAgICAgdW5pbnN0YWxsOgorCWkyb19wY2lfaXJxX2Rpc2FibGUoYyk7CisKKyAgICAgIGZyZWVfcGNpOgorCWkyb19wY2lfZnJlZShjKTsKKworICAgICAgZnJlZV9jb250cm9sbGVyOgorCWkyb19pb3BfZnJlZShjKTsKKworICAgICAgZGlzYWJsZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICoJaTJvX3BjaV9yZW1vdmUgLSBSZW1vdmVzIGEgSTJPIGNvbnRyb2xsZXIgZnJvbSB0aGUgc3lzdGVtCisgKglwZGV2OiBJMk8gY29udHJvbGxlciB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZAorICoKKyAqCVJlc2V0IHRoZSBJMk8gY29udHJvbGxlciwgZGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCByZW1vdmUgYWxsIGFsbG9jYXRlZAorICoJcmVzb3VyY2VzLgorICovCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgaTJvX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjOworCWMgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpMm9faW9wX3JlbW92ZShjKTsKKwlpMm9fcGNpX2lycV9kaXNhYmxlKGMpOworCWkyb19wY2lfZnJlZShjKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb250cm9sbGVyIHJlbW92ZWQuXG4iLCBjLT5uYW1lKTsKKworCWkyb19pb3BfZnJlZShjKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9OworCisvKiBQQ0kgZHJpdmVyIGZvciBJMk8gY29udHJvbGxlciAqLworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGkyb19wY2lfZHJpdmVyID0geworCS5uYW1lID0gIkkyTyBjb250cm9sbGVyIiwKKwkuaWRfdGFibGUgPSBpMm9fcGNpX2lkcywKKwkucHJvYmUgPSBpMm9fcGNpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChpMm9fcGNpX3JlbW92ZSksCit9OworCisvKioKKyAqCWkyb19wY2lfaW5pdCAtIHJlZ2lzdGVycyBJMk8gUENJIGRyaXZlciBpbiBQQ0kgc3Vic3lzdGVtCisgKgorICoJUmV0dXJucyA+IDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBfX2luaXQgaTJvX3BjaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmkyb19wY2lfZHJpdmVyKTsKK307CisKKy8qKgorICoJaTJvX3BjaV9leGl0IC0gdW5yZWdpc3RlcnMgSTJPIFBDSSBkcml2ZXIgZnJvbSBQQ0kgc3Vic3lzdGVtCisgKi8KK3ZvaWQgX19leGl0IGkyb19wY2lfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaTJvX3BjaV9kcml2ZXIpOworfTsKKworRVhQT1JUX1NZTUJPTChpMm9fZG1hX3JlYWxsb2MpOworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGkyb19wY2lfaWRzKTsK